From 9f65dd79ec8d5d9326a2d4dd3db85741b4695520 Mon Sep 17 00:00:00 2001 From: morethanwords Date: Sat, 11 Dec 2021 21:22:24 +0400 Subject: [PATCH] 1.0.0 --- .env | 6 +++--- CHANGELOG.md | 9 +++++++++ public/0.0b9ffba7741c4b0e3b41.chunk.js | 2 ++ public/0.0b9ffba7741c4b0e3b41.chunk.js.map | 1 + public/0.e35d290837b4c624b83e.chunk.js | 2 -- public/0.e35d290837b4c624b83e.chunk.js.map | 1 - public/1.3982babdf2d0e2fda6f3.chunk.js | 2 -- public/1.3982babdf2d0e2fda6f3.chunk.js.map | 1 - public/1.5ce290a0391e0bae24df.chunk.js | 2 ++ public/1.5ce290a0391e0bae24df.chunk.js.map | 1 + public/11.0091c78c69fac393d4c2.chunk.js | 2 ++ public/11.0091c78c69fac393d4c2.chunk.js.map | 1 + public/11.4cedf32c13708a0f972d.chunk.js | 2 -- public/11.4cedf32c13708a0f972d.chunk.js.map | 1 - public/12.3862167550311cfa0c62.chunk.js.map | 1 - ...hunk.js => 12.72db7f7146e96df8b3df.chunk.js} | 4 ++-- public/12.72db7f7146e96df8b3df.chunk.js.map | 1 + public/13.a60e06bd2a9f185ee65e.chunk.js | 2 -- public/13.a60e06bd2a9f185ee65e.chunk.js.map | 1 - public/13.e32751cf9be91bb5497a.chunk.js | 2 ++ public/13.e32751cf9be91bb5497a.chunk.js.map | 1 + public/14.11183df10f220f2bd1db.chunk.js | 2 ++ public/14.11183df10f220f2bd1db.chunk.js.map | 1 + public/14.97bef6a6862c0bc097eb.chunk.js | 2 -- public/14.97bef6a6862c0bc097eb.chunk.js.map | 1 - public/15.9bac63e86519380bd679.chunk.js | 2 ++ public/15.9bac63e86519380bd679.chunk.js.map | 1 + public/15.e91ef68debad566c74d5.chunk.js | 2 -- public/15.e91ef68debad566c74d5.chunk.js.map | 1 - public/16.8f20a4414cdceb869a1b.chunk.js.map | 1 - ...hunk.js => 16.e12ddbc52a3f75e72c89.chunk.js} | 4 ++-- public/16.e12ddbc52a3f75e72c89.chunk.js.map | 1 + ...hunk.js => 17.be8ba8da5cf5a29471fb.chunk.js} | 4 ++-- public/17.be8ba8da5cf5a29471fb.chunk.js.map | 1 + public/17.e503493b3028be8a4735.chunk.js.map | 1 - public/18.587a0b097be84c2c4267.chunk.js | 2 ++ public/18.587a0b097be84c2c4267.chunk.js.map | 1 + public/18.781d3d503cc3c4f5b47e.chunk.js | 2 -- public/18.781d3d503cc3c4f5b47e.chunk.js.map | 1 - public/19.96f69841477e2045dbd5.chunk.js | 2 -- public/19.96f69841477e2045dbd5.chunk.js.map | 1 - public/19.f2e6785986f5892e804d.chunk.js | 2 ++ public/19.f2e6785986f5892e804d.chunk.js.map | 1 + public/2.935038cc2873713ebe19.chunk.js | 2 -- public/2.935038cc2873713ebe19.chunk.js.map | 1 - public/2.a1197bdcb1dacde64b1b.chunk.js | 2 ++ public/2.a1197bdcb1dacde64b1b.chunk.js.map | 1 + public/20.a35ba2852f47b30df3d5.chunk.js | 2 -- public/20.a35ba2852f47b30df3d5.chunk.js.map | 1 - public/20.a6eb3895e2c4cb798a93.chunk.js | 2 ++ public/20.a6eb3895e2c4cb798a93.chunk.js.map | 1 + public/21.3aef9bc049fb6abb3cd5.chunk.js | 2 -- public/21.3aef9bc049fb6abb3cd5.chunk.js.map | 1 - public/21.44abbe422120bbe15936.chunk.js | 2 ++ public/21.44abbe422120bbe15936.chunk.js.map | 1 + ...hunk.js => 22.077684f6412887cea1da.chunk.js} | 4 ++-- ...map => 22.077684f6412887cea1da.chunk.js.map} | 2 +- ...hunk.js => 23.6ddfbc8ae4fd86a3b037.chunk.js} | 4 ++-- ...map => 23.6ddfbc8ae4fd86a3b037.chunk.js.map} | 2 +- ...hunk.js => 24.db7832d10818afdb3839.chunk.js} | 4 ++-- ...map => 24.db7832d10818afdb3839.chunk.js.map} | 2 +- ...hunk.js => 25.542232e0e7b171d74445.chunk.js} | 4 ++-- public/25.542232e0e7b171d74445.chunk.js.map | 1 + public/25.8300e3ae1cb91fc2bed3.chunk.js.map | 1 - public/26.27b86f0f8f80f7f420ab.chunk.js.map | 1 - ...hunk.js => 26.3728922ed59faa39207a.chunk.js} | 2 +- public/26.3728922ed59faa39207a.chunk.js.map | 1 + ...hunk.js => 27.afe309283a478f17a54d.chunk.js} | 4 ++-- ...map => 27.afe309283a478f17a54d.chunk.js.map} | 2 +- ...hunk.js => 28.915fd231c46789adc787.chunk.js} | 4 ++-- ...map => 28.915fd231c46789adc787.chunk.js.map} | 2 +- ...hunk.js => 29.e7945a7ebae7a3b06d65.chunk.js} | 4 ++-- ...map => 29.e7945a7ebae7a3b06d65.chunk.js.map} | 2 +- ...chunk.js => 3.f3be892bf29dd69632d3.chunk.js} | 4 ++-- ....map => 3.f3be892bf29dd69632d3.chunk.js.map} | 2 +- public/30.0ba6f57fe3c460b08e24.chunk.js.map | 1 - ...hunk.js => 30.b373d83017596ec6462f.chunk.js} | 4 ++-- public/30.b373d83017596ec6462f.chunk.js.map | 1 + ...hunk.js => 31.2de22fb7274e1d4a2d03.chunk.js} | 4 ++-- ...map => 31.2de22fb7274e1d4a2d03.chunk.js.map} | 2 +- ...chunk.js => 4.ec435aa1cabc18e1be43.chunk.js} | 4 ++-- ....map => 4.ec435aa1cabc18e1be43.chunk.js.map} | 2 +- public/5.5145323b4bc82cc62ff7.chunk.js | 2 ++ public/5.5145323b4bc82cc62ff7.chunk.js.map | 1 + public/5.faa04da46f838e65acdf.chunk.js | 2 -- public/5.faa04da46f838e65acdf.chunk.js.map | 1 - public/6.7dba74a574616a20ac7d.chunk.js | 2 -- public/6.7dba74a574616a20ac7d.chunk.js.map | 1 - public/6.d600026c8e100eea4159.chunk.js | 2 ++ public/6.d600026c8e100eea4159.chunk.js.map | 1 + public/7.52c0a0f3b6f476d2bcec.chunk.js | 2 -- public/7.52c0a0f3b6f476d2bcec.chunk.js.map | 1 - public/7.eebe55366b507a8f74c2.chunk.js | 2 ++ public/7.eebe55366b507a8f74c2.chunk.js.map | 1 + ...chunk.js => 8.479ac71b1f70d56a0c98.chunk.js} | 4 ++-- ....map => 8.479ac71b1f70d56a0c98.chunk.js.map} | 2 +- public/changelogs/1.0.0 (36).md | 7 +++++++ public/index.html | 4 ++-- ...e.js => main.44c380c3c13ddc1cf9bd.bundle.js} | 4 ++-- public/main.44c380c3c13ddc1cf9bd.bundle.js.map | 1 + public/main.46ecaa33a4d72f91b821.css | 5 +++++ public/main.46ecaa33a4d72f91b821.css.map | 1 + public/main.6a45f609a7a2d67d16ff.bundle.js.map | 1 - public/main.e47f94920a4918a10f5a.css | 5 ----- public/main.e47f94920a4918a10f5a.css.map | 1 - ...worker.e3c0dc69d0f5dd450f72.bundle.worker.js | 4 ---- ...er.e3c0dc69d0f5dd450f72.bundle.worker.js.map | 1 - ...worker.fd3e71e917088f6f049f.bundle.worker.js | 4 ++++ ...er.fd3e71e917088f6f049f.bundle.worker.js.map | 1 + ...-code-styling.b2874a156be40d4efbb7.chunk.js} | 4 ++-- ...e-styling.b2874a156be40d4efbb7.chunk.js.map} | 2 +- ...worker.077a5af1cfa1feb04249.bundle.worker.js | 2 ++ ...er.077a5af1cfa1feb04249.bundle.worker.js.map | 1 + public/sw.js | 4 ++-- public/sw.js.map | 2 +- ...orker.b00d941ab33d112bf66c.bundle.worker.js} | 2 +- ...er.b00d941ab33d112bf66c.bundle.worker.js.map | 1 + ...er.bd598dc02a03fd59d71a.bundle.worker.js.map | 1 - src/scripts/generate_changelog.js | 17 +++++++++++++++-- 119 files changed, 150 insertions(+), 118 deletions(-) create mode 100644 public/0.0b9ffba7741c4b0e3b41.chunk.js create mode 100644 public/0.0b9ffba7741c4b0e3b41.chunk.js.map delete mode 100644 public/0.e35d290837b4c624b83e.chunk.js delete mode 100644 public/0.e35d290837b4c624b83e.chunk.js.map delete mode 100644 public/1.3982babdf2d0e2fda6f3.chunk.js delete mode 100644 public/1.3982babdf2d0e2fda6f3.chunk.js.map create mode 100644 public/1.5ce290a0391e0bae24df.chunk.js create mode 100644 public/1.5ce290a0391e0bae24df.chunk.js.map create mode 100644 public/11.0091c78c69fac393d4c2.chunk.js create mode 100644 public/11.0091c78c69fac393d4c2.chunk.js.map delete mode 100644 public/11.4cedf32c13708a0f972d.chunk.js delete mode 100644 public/11.4cedf32c13708a0f972d.chunk.js.map delete mode 100644 public/12.3862167550311cfa0c62.chunk.js.map rename public/{12.3862167550311cfa0c62.chunk.js => 12.72db7f7146e96df8b3df.chunk.js} (72%) create mode 100644 public/12.72db7f7146e96df8b3df.chunk.js.map delete mode 100644 public/13.a60e06bd2a9f185ee65e.chunk.js delete mode 100644 public/13.a60e06bd2a9f185ee65e.chunk.js.map create mode 100644 public/13.e32751cf9be91bb5497a.chunk.js create mode 100644 public/13.e32751cf9be91bb5497a.chunk.js.map create mode 100644 public/14.11183df10f220f2bd1db.chunk.js create mode 100644 public/14.11183df10f220f2bd1db.chunk.js.map delete mode 100644 public/14.97bef6a6862c0bc097eb.chunk.js delete mode 100644 public/14.97bef6a6862c0bc097eb.chunk.js.map create mode 100644 public/15.9bac63e86519380bd679.chunk.js create mode 100644 public/15.9bac63e86519380bd679.chunk.js.map delete mode 100644 public/15.e91ef68debad566c74d5.chunk.js delete mode 100644 public/15.e91ef68debad566c74d5.chunk.js.map delete mode 100644 public/16.8f20a4414cdceb869a1b.chunk.js.map rename public/{16.8f20a4414cdceb869a1b.chunk.js => 16.e12ddbc52a3f75e72c89.chunk.js} (71%) create mode 100644 public/16.e12ddbc52a3f75e72c89.chunk.js.map rename public/{17.e503493b3028be8a4735.chunk.js => 17.be8ba8da5cf5a29471fb.chunk.js} (70%) create mode 100644 public/17.be8ba8da5cf5a29471fb.chunk.js.map delete mode 100644 public/17.e503493b3028be8a4735.chunk.js.map create mode 100644 public/18.587a0b097be84c2c4267.chunk.js create mode 100644 public/18.587a0b097be84c2c4267.chunk.js.map delete mode 100644 public/18.781d3d503cc3c4f5b47e.chunk.js delete mode 100644 public/18.781d3d503cc3c4f5b47e.chunk.js.map delete mode 100644 public/19.96f69841477e2045dbd5.chunk.js delete mode 100644 public/19.96f69841477e2045dbd5.chunk.js.map create mode 100644 public/19.f2e6785986f5892e804d.chunk.js create mode 100644 public/19.f2e6785986f5892e804d.chunk.js.map delete mode 100644 public/2.935038cc2873713ebe19.chunk.js delete mode 100644 public/2.935038cc2873713ebe19.chunk.js.map create mode 100644 public/2.a1197bdcb1dacde64b1b.chunk.js create mode 100644 public/2.a1197bdcb1dacde64b1b.chunk.js.map delete mode 100644 public/20.a35ba2852f47b30df3d5.chunk.js delete mode 100644 public/20.a35ba2852f47b30df3d5.chunk.js.map create mode 100644 public/20.a6eb3895e2c4cb798a93.chunk.js create mode 100644 public/20.a6eb3895e2c4cb798a93.chunk.js.map delete mode 100644 public/21.3aef9bc049fb6abb3cd5.chunk.js delete mode 100644 public/21.3aef9bc049fb6abb3cd5.chunk.js.map create mode 100644 public/21.44abbe422120bbe15936.chunk.js create mode 100644 public/21.44abbe422120bbe15936.chunk.js.map rename public/{22.0606c021aacfc21418bd.chunk.js => 22.077684f6412887cea1da.chunk.js} (91%) rename public/{22.0606c021aacfc21418bd.chunk.js.map => 22.077684f6412887cea1da.chunk.js.map} (98%) rename public/{23.e3145c0ea9684176558f.chunk.js => 23.6ddfbc8ae4fd86a3b037.chunk.js} (90%) rename public/{23.e3145c0ea9684176558f.chunk.js.map => 23.6ddfbc8ae4fd86a3b037.chunk.js.map} (99%) rename public/{24.8835e4abc95acb08dcd5.chunk.js => 24.db7832d10818afdb3839.chunk.js} (99%) rename public/{24.8835e4abc95acb08dcd5.chunk.js.map => 24.db7832d10818afdb3839.chunk.js.map} (99%) rename public/{25.8300e3ae1cb91fc2bed3.chunk.js => 25.542232e0e7b171d74445.chunk.js} (89%) create mode 100644 public/25.542232e0e7b171d74445.chunk.js.map delete mode 100644 public/25.8300e3ae1cb91fc2bed3.chunk.js.map delete mode 100644 public/26.27b86f0f8f80f7f420ab.chunk.js.map rename public/{26.27b86f0f8f80f7f420ab.chunk.js => 26.3728922ed59faa39207a.chunk.js} (91%) create mode 100644 public/26.3728922ed59faa39207a.chunk.js.map rename public/{27.1bfe793cc702c7aa75db.chunk.js => 27.afe309283a478f17a54d.chunk.js} (96%) rename public/{27.1bfe793cc702c7aa75db.chunk.js.map => 27.afe309283a478f17a54d.chunk.js.map} (99%) rename public/{28.b17aefb7c51046ff48ec.chunk.js => 28.915fd231c46789adc787.chunk.js} (97%) rename public/{28.b17aefb7c51046ff48ec.chunk.js.map => 28.915fd231c46789adc787.chunk.js.map} (99%) rename public/{29.08bf9f3c8b9be9d555f9.chunk.js => 29.e7945a7ebae7a3b06d65.chunk.js} (81%) rename public/{29.08bf9f3c8b9be9d555f9.chunk.js.map => 29.e7945a7ebae7a3b06d65.chunk.js.map} (98%) rename public/{3.bdf444277e969e63a4c3.chunk.js => 3.f3be892bf29dd69632d3.chunk.js} (93%) rename public/{3.bdf444277e969e63a4c3.chunk.js.map => 3.f3be892bf29dd69632d3.chunk.js.map} (99%) delete mode 100644 public/30.0ba6f57fe3c460b08e24.chunk.js.map rename public/{30.0ba6f57fe3c460b08e24.chunk.js => 30.b373d83017596ec6462f.chunk.js} (93%) create mode 100644 public/30.b373d83017596ec6462f.chunk.js.map rename public/{31.623be4e5a35a57db3b0c.chunk.js => 31.2de22fb7274e1d4a2d03.chunk.js} (95%) rename public/{31.623be4e5a35a57db3b0c.chunk.js.map => 31.2de22fb7274e1d4a2d03.chunk.js.map} (99%) rename public/{4.6b5dd97948b29c598f75.chunk.js => 4.ec435aa1cabc18e1be43.chunk.js} (82%) rename public/{4.6b5dd97948b29c598f75.chunk.js.map => 4.ec435aa1cabc18e1be43.chunk.js.map} (98%) create mode 100644 public/5.5145323b4bc82cc62ff7.chunk.js create mode 100644 public/5.5145323b4bc82cc62ff7.chunk.js.map delete mode 100644 public/5.faa04da46f838e65acdf.chunk.js delete mode 100644 public/5.faa04da46f838e65acdf.chunk.js.map delete mode 100644 public/6.7dba74a574616a20ac7d.chunk.js delete mode 100644 public/6.7dba74a574616a20ac7d.chunk.js.map create mode 100644 public/6.d600026c8e100eea4159.chunk.js create mode 100644 public/6.d600026c8e100eea4159.chunk.js.map delete mode 100644 public/7.52c0a0f3b6f476d2bcec.chunk.js delete mode 100644 public/7.52c0a0f3b6f476d2bcec.chunk.js.map create mode 100644 public/7.eebe55366b507a8f74c2.chunk.js create mode 100644 public/7.eebe55366b507a8f74c2.chunk.js.map rename public/{8.cbbad398924d87521a47.chunk.js => 8.479ac71b1f70d56a0c98.chunk.js} (92%) rename public/{8.cbbad398924d87521a47.chunk.js.map => 8.479ac71b1f70d56a0c98.chunk.js.map} (95%) create mode 100644 public/changelogs/1.0.0 (36).md rename public/{main.6a45f609a7a2d67d16ff.bundle.js => main.44c380c3c13ddc1cf9bd.bundle.js} (92%) create mode 100644 public/main.44c380c3c13ddc1cf9bd.bundle.js.map create mode 100644 public/main.46ecaa33a4d72f91b821.css create mode 100644 public/main.46ecaa33a4d72f91b821.css.map delete mode 100644 public/main.6a45f609a7a2d67d16ff.bundle.js.map delete mode 100644 public/main.e47f94920a4918a10f5a.css delete mode 100644 public/main.e47f94920a4918a10f5a.css.map delete mode 100644 public/mtproto.worker.e3c0dc69d0f5dd450f72.bundle.worker.js delete mode 100644 public/mtproto.worker.e3c0dc69d0f5dd450f72.bundle.worker.js.map create mode 100644 public/mtproto.worker.fd3e71e917088f6f049f.bundle.worker.js create mode 100644 public/mtproto.worker.fd3e71e917088f6f049f.bundle.worker.js.map rename public/{npm.qr-code-styling.c53238820878551c10bf.chunk.js => npm.qr-code-styling.b2874a156be40d4efbb7.chunk.js} (99%) rename public/{npm.qr-code-styling.c53238820878551c10bf.chunk.js.map => npm.qr-code-styling.b2874a156be40d4efbb7.chunk.js.map} (99%) create mode 100644 public/rlottie.worker.077a5af1cfa1feb04249.bundle.worker.js create mode 100644 public/rlottie.worker.077a5af1cfa1feb04249.bundle.worker.js.map rename public/{webp.worker.bd598dc02a03fd59d71a.bundle.worker.js => webp.worker.b00d941ab33d112bf66c.bundle.worker.js} (99%) create mode 100644 public/webp.worker.b00d941ab33d112bf66c.bundle.worker.js.map delete mode 100644 public/webp.worker.bd598dc02a03fd59d71a.bundle.worker.js.map diff --git a/.env b/.env index 98586e797..9a00c0721 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ API_ID=1025907 API_HASH=452b0359b988148995f22ff0f4229750 -VERSION=0.9.2 -VERSION_FULL=0.9.2 (35) -BUILD=35 +VERSION=1.0.0 +VERSION_FULL=1.0.0 (36) +BUILD=36 diff --git a/CHANGELOG.md b/CHANGELOG.md index c302088cf..f77660f68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +### 1.0.0 (36) +An early version of Video Chats is available in all groups and channels – with a polished design exclusively for Web: + +* Expand to view your video chats in fullscreen. +* Try the wide mode, which shows video feeds side-by-side. +* Resize and place the video layout on any part of the screen. +* Minimize the window and the app will remember its precious size and position. +* Mute or leave the video chat from the interactive header. + ### 0.9.2 (32) * Flexible forwarding options: hide the sender name or media captions from messages. * The ‘Choosing a Sticker’ user status now appears in chats and the chat list. diff --git a/public/0.0b9ffba7741c4b0e3b41.chunk.js b/public/0.0b9ffba7741c4b0e3b41.chunk.js new file mode 100644 index 000000000..c3ee19074 --- /dev/null +++ b/public/0.0b9ffba7741c4b0e3b41.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[0,20],{105:function(e,t,r){"use strict";function s(e,t,r=!0){let s,n,i=null;return(...o)=>{s=!0,n=o,i||(r&&(s=!1,e(...n)),i=setInterval(()=>{if(!s)return clearInterval(i),void(i=null);s=!1,e(...n)},t))}}r.d(t,"a",(function(){return s}))},120:function(e,t,r){"use strict";t.a={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},139:function(e,t,r){"use strict";r.d(t,"a",(function(){return s})),r.d(t,"b",(function(){return n})),r.d(t,"c",(function(){return i})),r.d(t,"d",(function(){return l}));const s="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,n="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!s,i=n||s,o=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(r=>{r.length&&r.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},c=(...e)=>{self.postMessage(...e)},a=()=>{},l=s?o.bind(null,!1):n?c:a;s&&o.bind(null,!0)},15:function(e,t,r){"use strict";r.r(t),r.d(t,"RootScope",(function(){return o}));var s=r(45),n=r(54),i=r(29);class o extends n.a{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",e=>{this.peerId=e,document.body.classList.toggle("has-chat",!!e)}),this.addEventListener("user_auth",({id:e})=>{this.myId="number"==typeof s.b?+e:""+e}),this.addEventListener("connection_status_change",e=>{this.connectionStatus[e.name]=e}),this.addEventListener("idle",e=>{e?this.idle.focusPromise=new Promise(e=>{this.idle.focusResolve=e}):this.idle.focusResolve()})}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",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(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()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find(t=>t.name===e)}}const c=new o;i.a.rootScope=c,t.default=c},29:function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));const s=r(77).a.debug,n="undefined"!=typeof window?window:self;t.b=s},32:function(e,t,r){"use strict";function s(e){if(null===e||"object"!=typeof e)return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e)){return e.map(e=>s(e))}let t=new e.constructor;for(var r in e)e.hasOwnProperty(r)&&(t[r]=s(e[r]));return t}function n(e,t){const r=Object.keys,s=typeof e;return e&&t&&"object"===s&&s===typeof t?r(e).length===r(t).length&&r(e).every(r=>n(e[r],t[r])):e===t}function i(e,t){const r={writable:!0,configurable:!0},s={};t.forEach(t=>{e.hasOwnProperty(t)||(s[t]=r)}),Object.defineProperties(e,s)}function o(e,t="asc"){if(!e)return[];const r=e instanceof Map?[...e.keys()]:Object.keys(e).map(e=>+e);return"asc"===t?r.sort((e,t)=>e-t):r.sort((e,t)=>t-e)}function c(e,t){if(!e)return t;for(var r in e)t.hasOwnProperty(r)||delete e[r];for(var r in t)e[r]=t[r];return e}function a(e,t,r){"byteLength"in r[e]&&(r[e]=[...r[e]]),t&&t[e]!==r[e]&&(t[e].length=r[e].length,r[e].forEach((r,s)=>{t[e][s]=r}),r[e]=t[e])}function l(e){return"object"==typeof e&&null!==e}function h(e,t){const r=t.split(".");let s=e;return r.forEach(e=>{e&&(s=s[e])}),s}function u(e,t,r){const s=t.split(".");h(e,s.slice(0,-1).join("."))[s.pop()]=r}function d(e,t,r,n){for(const i in e)typeof t[i]!=typeof e[i]?(t[i]=s(e[i]),r&&r(n||i)):l(e[i])&&d(e[i],t[i],r,n||i)}function f(e,t){if(t)for(let r in t)void 0!==t[r]&&(e[r]=t[r]);return e}r.d(t,"a",(function(){return s})),r.d(t,"b",(function(){return n})),r.d(t,"c",(function(){return i})),r.d(t,"e",(function(){return o})),r.d(t,"i",(function(){return c})),r.d(t,"h",(function(){return a})),r.d(t,"f",(function(){return l})),r.d(t,"d",(function(){return h})),r.d(t,"j",(function(){return u})),r.d(t,"k",(function(){return d})),r.d(t,"g",(function(){return f}))},43:function(e,t,r){"use strict";r.d(t,"a",(function(){return s})),r.d(t,"b",(function(){return y}));var s,n=r(29),i=r(0),o=r(139);!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"}(s||(s={}));const c=[s.None,s.Error,s.Warn,s.Log,s.Debug],a=Date.now();function l(){return"["+((Date.now()-a)/1e3).toFixed(3)+"]"}let h;const u=i.IS_SAFARI||i.IS_FIREFOX;h=u?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const d=!u,f=u?2:3;function g(){const e=(new Error).stack.split("\n"),t=e[f]||e[e.length-1];return"["+(h(t)||"")+"]"}const m={black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:""},p=[["debug",s.Debug],["info",s.Log],["warn",s.Warn],["error",s.Error],["assert",s.Error],["trace",s.Log]];function y(e,t=s.Log|s.Warn|s.Error,r=!1,i=""){let a;n.b||r||(t=s.Error),d?i||(o.a?i=m.yellow:o.b&&(i=m.cyan)):i="";let h=i;i=i?`%s ${i}%s`:"%s";const u=function(...r){return t&s.Log&&console.log(i,l(),e,g(),...r)};return p.forEach(([r,s])=>{u[r]=function(...n){return t&s&&console[r](i,l(),e,g(),...n)}}),u.setPrefix=function(t){a=t,e="["+t+"]"},u.setPrefix(e),u.setLevel=function(e){t=c.slice(0,e+1).reduce((e,t)=>e|t,0)},u.bindPrefix=function(e){return y(`${a}] [${e}`,t,r,h)},u}},45:function(e,t,r){"use strict";r.d(t,"b",(function(){return s})),r.d(t,"c",(function(){return n})),r.d(t,"d",(function(){return i})),r.d(t,"a",(function(){return o}));const s=0,n=1271266957,i=777e3,o=2147483647},46:function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));var s=r(81);function n(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((r,s)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,r(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,s(...e))}});return t.catch(s.a).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}},54:function(e,t,r){"use strict";r.d(t,"a",(function(){return s}));class s{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,r){var s,n;(null!==(s=this.listeners[e])&&void 0!==s?s:this.listeners[e]=[]).push({callback:t,options:r}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(n=r)||void 0===n?void 0:n.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,r){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}dispatchEvent(e,...t){this.reuseResults&&(this.listenerResults[e]=t);const r=[],s=this.listeners[e];if(s){s.slice().forEach(n=>{var i;-1!==s.findIndex(e=>e.callback===n.callback)&&(r.push(n.callback(...t)),(null===(i=n.options)||void 0===i?void 0:i.once)&&this.removeEventListener(e,n.callback))})}return r}cleanup(){this.listeners={},this.listenerResults={}}}},65:function(e,t,r){"use strict";r.d(t,"a",(function(){return n})),r.d(t,"b",(function(){return i}));const s={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function n(e){const t=s[e];return crypto.getRandomValues(t),t[0]}function i(){return""+n(32)+n(32)%16777215}},67:function(e,t,r){"use strict";var s=r(29),n=r(77),i=r(139);class o{constructor(){this.prefix="",this.cache={},this.useStorage=!0,n.a.test&&(this.prefix="t_")}get(e,t=!0){if(this.cache.hasOwnProperty(e)&&t)return this.cache[e];if(this.useStorage){let t;try{t=localStorage.getItem(this.prefix+e)}catch(e){this.useStorage=!1}if(null!==t)try{t=JSON.parse(t)}catch(e){}else t=void 0;return t}}set(e,t=!1){for(const r in e)if(e.hasOwnProperty(r)){const s=e[r];if(this.cache[r]=s,this.useStorage&&!t)try{const e=JSON.stringify(s);localStorage.setItem(this.prefix+r,e)}catch(e){this.useStorage=!1}}}delete(e,t=!1){e=""+e,t||delete this.cache[e];try{localStorage.removeItem(this.prefix+e)}catch(e){}}clear(){const e=["dc","server_time_offset","xt_instance","user_auth","state_id"];for(let t=1;t<=5;++t)e.push(`dc${t}_server_salt`),e.push(`dc${t}_auth_key`);for(let t of e)this.delete(t,!0)}toggleStorage(e){if(this.useStorage=e,e)return this.set(this.cache);this.clear()}}class c{constructor(){this.taskId=0,this.tasks={},c.STORAGES.push(this),i.c||(this.storage=new o)}finishTask(e,t){this.tasks.hasOwnProperty(e)&&(this.tasks[e](t),delete this.tasks[e])}proxy(e,...t){return new Promise((r,s)=>{if(i.c){const s=this.taskId++;this.tasks[s]=r;const n={type:"localStorageProxy",id:s,payload:{type:e,args:t}};Object(i.d)(n)}else{t=Array.prototype.slice.call(t);r(this.storage[e].apply(this.storage,t))}})}get(e,t){return this.proxy("get",e,t)}set(e,t){return this.proxy("set",e,t)}delete(e,t){return this.proxy("delete",e,t)}clear(){return this.proxy("clear")}toggleStorage(e){return this.proxy("toggleStorage",e)}}c.STORAGES=[];const a=new c;s.a.appStorage=a;t.a=a},77:function(e,t,r){"use strict";const s={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1};t.a=s},80:function(e,t,r){"use strict";var s=r(29),n=r(99),i=r(120);const o=new n.a(i.a,"session");s.a.stateStorage=o,t.a=o},81:function(e,t,r){"use strict";function s(){}r.d(t,"a",(function(){return s}))},88:function(e,t,r){"use strict";function s(e,t){return new Promise(r=>{const s=new FileReader;s.addEventListener("loadend",e=>r(e.target.result)),s[t](e)})}function n(e){return s(e,"readAsText")}function i(e){return s(e,"readAsDataURL")}function o(e){return function(e){return s(e,"readAsArrayBuffer")}(e).then(e=>new Uint8Array(e))}function c(e,t=""){let r;const s=function(e){if(-1===["image/jpeg","image/png","image/gif","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e))return"application/octet-stream";return e}(t);try{r=new Blob(e,{type:s})}catch(t){let n=new BlobBuilder;e.forEach(e=>{n.append(e)}),r=n.getBlob(s)}return r}r.d(t,"c",(function(){return n})),r.d(t,"b",(function(){return i})),r.d(t,"d",(function(){return o})),r.d(t,"a",(function(){return c}))},99:function(e,t,r){"use strict";r.d(t,"a",(function(){return d}));var s=r(46),n=r(105),i=r(77),o=r(88),c=r(32),a=r(43);class l{constructor(e,t){this.storageIsAvailable=!0,Object(c.g)(this,e),i.a.test&&(this.name+="_test"),this.storeName=t,this.log=Object(a.b)("IDB-"+this.storeName),this.openDatabase(!0),l.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const r=t.db;r&&(r.onclose=()=>{},r.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let r=!1;return setTimeout(()=>{r||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,s)=>{t.onsuccess=n=>{r=!0;const i=t.result;let o=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),s(e)},i.onclose=e=>{this.log.error("closed:",e),!o&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(o=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{r=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),s(e)},t.onupgradeneeded=e=>{r=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var r;const s=e.createObjectStore(t.name);if(null===(r=t.indexes)||void 0===r?void 0:r.length)for(const e of t.indexes)s.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",r=>e.map((e,s)=>r.put(t[s],e)),"")}saveFile(e,t){return t instanceof Blob||(t=Object(o.a)([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,r,s=this.storeName){let n;return r&&(n=performance.now(),this.log(r+": start")),this.openDatabase().then(i=>new Promise((o,c)=>{const a=i.transaction([s],e);a.onerror=e=>{clearTimeout(l),c(a.error)},a.oncomplete=e=>{clearTimeout(l),r&&this.log(r+": end",performance.now()-n);const t=d.map(e=>e.result);o(u?t:t[0])};const l=setTimeout(()=>{this.log.error("transaction not finished",a)},1e4),h=t(a.objectStore(s)),u=Array.isArray(h),d=u?h:[].concat(h)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}l.STORAGES=[];var h=function(e,t,r,s){return new(r||(r=Promise))((function(n,i){function o(e){try{a(s.next(e))}catch(e){i(e)}}function c(e){try{a(s.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,c)}a((s=s.apply(e,t||[])).next())}))};function u(){}class d{constructor(e,t){this.db=e,this.storeName=t,this.cache={},this.useStorage=!0,this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=Object(s.a)(),this.keysToDelete=new Set,this.deleteDeferred=Object(s.a)(),this.storage=new l(e,t),d.STORAGES.length&&(this.useStorage=d.STORAGES[0].useStorage),d.STORAGES.push(this),this.saveThrottled=Object(n.a)(()=>h(this,void 0,void 0,(function*(){const e=this.saveDeferred;this.saveDeferred=Object(s.a)();const t=this.keysToSet;if(t.size){const e=Array.from(t.values());t.clear();try{const t=e.map(e=>this.cache[e]);yield this.storage.save(e,t)}catch(t){console.error("[AS]: set error:",t,e)}}e.resolve(),t.size&&this.saveThrottled()})),16,!1),this.deleteThrottled=Object(n.a)(()=>h(this,void 0,void 0,(function*(){const e=this.deleteDeferred;this.deleteDeferred=Object(s.a)();const t=this.keysToDelete;if(t.size){const e=Array.from(t.values());t.clear();try{yield this.storage.delete(e)}catch(t){console.error("[AS]: delete error:",t,e)}}e.resolve(),t.size&&this.deleteThrottled()})),16,!1),this.getThrottled=Object(n.a)(()=>h(this,void 0,void 0,(function*(){const e=Array.from(this.getPromises.keys());this.storage.get(e).then(t=>{for(let r=0,s=e.length;r{["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(r)||(this.useStorage=!1,console.error("[AS]: get error:",r,e,t));for(let t=0,r=e.length;t{this.getPromises.size&&this.getThrottled()})})),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(e){return this.cache[e]}setToCache(e,t){return this.cache[e]=t}get(e,t=!0){return h(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(e)&&t)return this.getFromCache(e);if(this.useStorage){const t=this.getPromises.get(e);if(t)return t;const r=Object(s.a)();return this.getPromises.set(e,r),this.getThrottled(),r}}))}getAll(){return this.storage.getAll().catch(()=>[])}set(e,t=!1){for(const r in e)if(e.hasOwnProperty(r)){const s=e[r];this.setToCache(r,s),this.useStorage&&!t&&(this.keysToSet.add(r),this.keysToDelete.delete(r),this.saveThrottled())}return this.useStorage?this.saveDeferred:Promise.resolve()}delete(e,t=!1){return e=""+e,t||delete this.cache[e],this.useStorage&&(this.keysToSet.delete(e),this.keysToDelete.add(e),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(e=!1){if(!e)for(const e in this.cache)delete this.cache[e];return this.storage.clear().catch(u)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>(t.useStorage=e,e?t.set(t.cache):(t.keysToSet.clear(),t.keysToDelete.clear(),t.getPromises.forEach(e=>e.resolve(void 0)),t.getPromises.clear(),t.clear(!0))))).catch(u)}}d.STORAGES=[]}}]); +//# sourceMappingURL=0.0b9ffba7741c4b0e3b41.chunk.js.map \ No newline at end of file diff --git a/public/0.0b9ffba7741c4b0e3b41.chunk.js.map b/public/0.0b9ffba7741c4b0e3b41.chunk.js.map new file mode 100644 index 000000000..6559bd767 --- /dev/null +++ b/public/0.0b9ffba7741c4b0e3b41.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/schedulers/throttle.ts","webpack:///./src/config/databases/state.ts","webpack:///./src/helpers/context.ts","webpack:///./src/lib/rootScope.ts","webpack:///./src/config/debug.ts","webpack:///./src/helpers/object.ts","webpack:///./src/lib/logger.ts","webpack:///./src/lib/mtproto/mtproto_config.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/helpers/random.ts","webpack:///./src/lib/localStorage.ts","webpack:///./src/lib/sessionStorage.ts","webpack:///./src/config/modes.ts","webpack:///./src/lib/stateStorage.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/helpers/blob.ts","webpack:///./src/lib/idb.ts","webpack:///./src/lib/storage.ts"],"names":["throttle","fn","ms","shouldRunFirst","isPending","args","interval","_args","setInterval","clearInterval","name","version","stores","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","then","listeners","length","slice","forEach","listener","postMessage","notifyWorker","noop","notifySomeone","bind","RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","Promise","resolve","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","this","addEventListener","peerId","document","body","classList","toggle","id","myId","status","undefined","_themeColorElem","head","querySelector","color","themeColor","isNight","themeColorElem","setAttribute","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","err","colorScheme","documentElement","setThemeColor","value","isOverlayActive","getTheme","settings","theme","themes","find","t","rootScope","DEBUG","debug","MOUNT_CLASS_TO","copy","obj","Date","getTime","Array","isArray","map","el","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","Object","keys","tx","every","key","defineNotNumerableProperties","names","props","writable","configurable","out","defineProperties","getObjectKeysAndSort","object","sort","ids","Map","i","a","b","safeReplaceObject","wasObject","newObject","safeReplaceArrayInObject","v","isObject","getDeepProperty","splitted","split","o","setDeepProperty","join","pop","validateInitObject","initObject","currentObject","onReplace","previousKey","safeAssign","fromObject","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","_logTimer","now","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","trim","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","black","red","green","yellow","blue","magenta","cyan","white","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","console","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","bindPrefix","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","callback","addNotifyListener","push","deferred","reject","catch","finally","cancel","assign","EventListenerBase","reuseResults","_constructor","listenerResults","options","once","findAndSplice","l","arr","findIndex","removeEventListener","arrays","8","Uint8Array","16","Uint16Array","32","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","cache","useStorage","test","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","delete","enabled","set","clear","taskId","tasks","STORAGES","storage","result","task","payload","prototype","call","apply","proxy","sessionStorage","appStorage","Modes","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker","stateStorage","readBlobAs","blob","reader","FileReader","e","target","readBlobAsText","readBlobAsDataURL","readBlobAsUint8Array","readBlobAsArrayBuffer","buffer","blobConstruct","blobParts","mimeType","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","db","storeName","storageIsAvailable","openDatabase","preserve","onclose","close","createNew","openDbPromise","request","indexedDB","open","error","message","finished","setTimeout","onerror","onsuccess","event","calledNew","onabort","transaction","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","store","objectStoreNames","contains","os","createObjectStore","indexes","index","createIndex","indexName","keyPath","objectParameters","entryName","concat","getObjectStore","objectStore","idx","put","fileName","save","get","mode","perf","performance","clearTimeout","timeout","oncomplete","results","r","requests","getAll","getPromises","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","saveThrottled","size","from","values","deleteThrottled","getThrottled","includes","getFromCache","p","setToCache","add"],"mappings":"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","file":"0.0b9ffba7741c4b0e3b41.chunk.js","sourcesContent":["// * 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '.';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId, GroupCallInstance, GroupCallOutputSource } from \"./appManagers/appGroupCallsManager\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_views': {peerId: PeerId, mid: number, views: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number},\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_mount': void,\n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_state': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n 'group_call_pinned': {instance: GroupCallInstance, source?: GroupCallOutputSource}\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\n \n}); */\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * 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 function copy(obj: T): T {\r\n //in case of premitives\r\n if(obj === null || typeof(obj) !== \"object\") {\r\n return obj;\r\n }\r\n \r\n //date objects should be \r\n if(obj instanceof Date) {\r\n return new Date(obj.getTime()) as any;\r\n }\r\n \r\n //handle Array\r\n if(Array.isArray(obj)) {\r\n // @ts-ignore\r\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\r\n return clonedArr;\r\n }\r\n \r\n //lastly, handle objects\r\n // @ts-ignore\r\n let clonedObj = new obj.constructor();\r\n for(var prop in obj){\r\n if(obj.hasOwnProperty(prop)) {\r\n clonedObj[prop] = copy(obj[prop]);\r\n }\r\n }\r\n return clonedObj;\r\n}\r\n\r\nexport function deepEqual(x: any, y: any): boolean {\r\n const ok = Object.keys, tx = typeof x, ty = typeof y;\r\n return x && y && tx === 'object' && tx === ty ? (\r\n ok(x).length === ok(y).length &&\r\n ok(x).every(key => deepEqual(x[key], y[key]))\r\n ) : (x === y);\r\n}\r\n\r\nexport function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\r\n //const perf = performance.now();\r\n const props = {writable: true, configurable: true};\r\n const out: {[name in keyof T]?: typeof props} = {};\r\n names.forEach(name => {\r\n if(!obj.hasOwnProperty(name)) {\r\n out[name] = props;\r\n }\r\n });\r\n Object.defineProperties(obj, out);\r\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\r\n}\r\n\r\nexport function getObjectKeysAndSort(object: {[key: string]: any}, sort: 'asc' | 'desc' = 'asc') {\r\n if(!object) return [];\r\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map(i => +i);\r\n if(sort === 'asc') return ids.sort((a, b) => a - b);\r\n else return ids.sort((a, b) => b - a);\r\n}\r\n\r\nexport function safeReplaceObject(wasObject: any, newObject: any) {\r\n if(!wasObject) {\r\n return newObject;\r\n }\r\n\r\n for(var key in wasObject) {\r\n if(!newObject.hasOwnProperty(key)) {\r\n delete wasObject[key];\r\n }\r\n }\r\n\r\n for(var key in newObject) {\r\n //if (newObject.hasOwnProperty(key)) { // useless\r\n wasObject[key] = newObject[key];\r\n //}\r\n }\r\n \r\n return wasObject;\r\n}\r\n\r\n/**\r\n * Will be used for FILE_REFERENCE_EXPIRED\r\n * @param key \r\n * @param wasObject \r\n * @param newObject \r\n */\r\nexport function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\r\n if('byteLength' in newObject[key]) { // Uint8Array\r\n newObject[key] = [...newObject[key]];\r\n }\r\n\r\n if(wasObject && wasObject[key] !== newObject[key]) {\r\n wasObject[key].length = newObject[key].length;\r\n (newObject[key] as any[]).forEach((v, i) => {\r\n wasObject[key][i] = v;\r\n });\r\n\r\n /* wasObject[key].set(newObject[key]); */\r\n newObject[key] = wasObject[key];\r\n }\r\n}\r\n\r\nexport function isObject>(object: any): object is T {\r\n return typeof(object) === 'object' && object !== null;\r\n}\r\n\r\nexport function getDeepProperty(object: any, key: string) {\r\n const splitted = key.split('.');\r\n let o: any = object;\r\n splitted.forEach(key => {\r\n if(!key) {\r\n return;\r\n }\r\n \r\n // @ts-ignore\r\n o = o[key];\r\n });\r\n \r\n return o;\r\n}\r\n\r\nexport function setDeepProperty(object: any, key: string, value: any) {\r\n const splitted = key.split('.');\r\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\r\n}\r\n\r\nexport function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\r\n for(const key in initObject) {\r\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\r\n currentObject[key] = copy(initObject[key]);\r\n onReplace && onReplace(previousKey || key);\r\n } else if(isObject(initObject[key])) {\r\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\r\n }\r\n }\r\n}\r\n\r\nexport function safeAssign(object: T, fromObject: any) {\r\n if(fromObject) {\r\n for(let i in fromObject) {\r\n if(fromObject[i] !== undefined) {\r\n // @ts-ignore\r\n object[i] = fromObject[i];\r\n }\r\n }\r\n }\r\n\r\n return object;\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\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}","/*\r\n * https://github.com/morethanwords/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\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\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase> {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = [];\r\n\r\n /* let a = e.wm.get(this)[name];\r\n if(!a) return arr;\r\n const listeners = [...a]; */\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 arr.push(listener.callback(...args));\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n\r\n /* for(let i = 0, length = listeners.length; i < length; ++i) {\r\n const listener = listeners[i];\r\n arr.push(listener.callback(...args));\r\n\r\n if(listener.once) {\r\n listeners.splice(i, 1);\r\n --i;\r\n --length;\r\n }\r\n } */\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\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\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { notifySomeone, IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach(key => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n private taskId = 0;\r\n private tasks: {[taskID: number]: (result: any) => void} = {};\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n public finishTask(taskId: number, result: any) {\r\n //this.log('finishTask:', taskID, result, Object.keys(this.tasks));\r\n\r\n if(!this.tasks.hasOwnProperty(taskId)) {\r\n //this.log('no such task:', taskID, result);\r\n return;\r\n }\r\n\r\n this.tasks[taskId](result);\r\n delete this.tasks[taskId];\r\n }\r\n\r\n private proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']) {\r\n return new Promise((resolve, reject) => {\r\n if(IS_WORKER) {\r\n const taskId = this.taskId++;\r\n\r\n this.tasks[taskId] = resolve;\r\n const task: LocalStorageProxyTask = {\r\n type: 'localStorageProxy', \r\n id: taskId,\r\n payload: {\r\n type,\r\n args\r\n }\r\n };\r\n\r\n notifySomeone(task);\r\n } else {\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n const result: any = this.storage[type].apply(this.storage, args as any);\r\n resolve(result);\r\n }\r\n });\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.proxy('toggleStorage', enabled);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n }\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * 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\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false, //location.search.indexOf('http=1') > 0,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false\r\n};\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { ChatSavedPosition } from './appManagers/appImManager';\r\nimport type { State } from './appManagers/appStateManager';\r\nimport type { AppDraftsManager } from './appManagers/appDraftsManager';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport { LangPackDifference } from '../layer';\r\nimport AppStorage from './storage';\r\nimport DATABASE_STATE from '../config/databases/state';\r\n\r\nconst stateStorage = new AppStorage<{\r\n chatPositions: {\r\n [peerId_threadId: string]: ChatSavedPosition\r\n },\r\n langPack: LangPackDifference,\r\n drafts: AppDraftsManager['drafts'],\r\n user_auth: any, // support old webk format\r\n} & State, typeof DATABASE_STATE>(DATABASE_STATE, 'session');\r\nMOUNT_CLASS_TO.stateStorage = stateStorage;\r\nexport default stateStorage;\r\n","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 * 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 function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.addEventListener('loadend', (e) => resolve(e.target.result));\r\n reader[method](blob);\r\n });\r\n}\r\n\r\nexport function readBlobAsText(blob: Blob) {\r\n return readBlobAs(blob, 'readAsText');\r\n}\r\n\r\nexport function readBlobAsDataURL(blob: Blob) {\r\n return readBlobAs(blob, 'readAsDataURL');\r\n}\r\n\r\nexport function readBlobAsArrayBuffer(blob: Blob) {\r\n return readBlobAs(blob, 'readAsArrayBuffer');\r\n}\r\n\r\nexport function readBlobAsUint8Array(blob: Blob) {\r\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\r\n}\r\n\r\nexport function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\r\n let blob;\r\n const safeMimeType = blobSafeMimeType(mimeType);\r\n try {\r\n blob = new Blob(blobParts, {type: safeMimeType});\r\n } catch(e) {\r\n // @ts-ignore\r\n let bb = new BlobBuilder;\r\n blobParts.forEach((blobPart: any) => {\r\n bb.append(blobPart);\r\n });\r\n blob = bb.getBlob(safeMimeType);\r\n }\r\n return blob;\r\n}\r\n\r\n// https://www.iana.org/assignments/media-types/media-types.xhtml\r\nexport function blobSafeMimeType(mimeType: string) {\r\n if([\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/gif',\r\n 'image/webp',\r\n 'image/bmp',\r\n 'video/mp4',\r\n 'video/webm',\r\n 'video/quicktime',\r\n 'audio/ogg',\r\n 'audio/mpeg',\r\n 'audio/mp4',\r\n 'application/json',\r\n 'application/pdf'\r\n ].indexOf(mimeType) === -1) {\r\n return 'application/octet-stream';\r\n }\r\n\r\n return mimeType;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport { safeAssign } from '../helpers/object';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.forEach(storage => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map(name => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map(storage => storage.name)));\r\n const promises = dbNames.map(dbName => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[]) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct([blob]) as Blob;\r\n }\r\n\r\n return this.save(fileName, blob);\r\n }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from \"../config/databases\";\r\n//import DATABASE_SESSION from \"../config/databases/session\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\n//import { WorkerTaskTemplate } from \"../types\";\r\nimport IDBStorage from \"./idb\";\r\n\r\nfunction noop() {}\r\n\r\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set',\r\n keys: string[],\r\n values: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'delete',\r\n keys: string[]\r\n }\r\n}; */\r\n\r\nexport default class AppStorage, T extends Database/* Storage extends {[name: string]: any} *//* Storage extends Record */> {\r\n private static STORAGES: AppStorage>[] = [];\r\n private storage: IDBStorage;//new CacheStorageController('session');\r\n\r\n //private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\r\n private cache: Partial = {};\r\n private useStorage = true;\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 }\r\n\r\n AppStorage.STORAGES.push(this);\r\n\r\n this.saveThrottled = throttle(async() => {\r\n const deferred = this.saveDeferred;\r\n this.saveDeferred = deferredPromise();\r\n\r\n const set = this.keysToSet;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n //console.log('setItem: will set', key/* , value */);\r\n //await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\r\n //await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\r\n\r\n const values = keys.map(key => this.cache[key]);\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'set',\r\n keys,\r\n values\r\n }\r\n } as LocalStorageProxySetTask);\r\n } */\r\n\r\n await this.storage.save(keys, values);\r\n //console.log('setItem: have set', key/* , value */);\r\n } catch(e) {\r\n //this.useCS = false;\r\n console.error('[AS]: set error:', e, keys/* , value */);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.saveThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.deleteThrottled = throttle(async() => {\r\n const deferred = this.deleteDeferred;\r\n this.deleteDeferred = deferredPromise();\r\n\r\n const set = this.keysToDelete;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'delete',\r\n keys\r\n }\r\n } as LocalStorageProxyDeleteTask);\r\n } */\r\n\r\n await this.storage.delete(keys);\r\n } catch(e) {\r\n console.error('[AS]: delete error:', e, keys);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.deleteThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.getThrottled = throttle(async() => {\r\n const keys = Array.from(this.getPromises.keys());\r\n\r\n 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 }, (error) => {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(error)) {\r\n this.useStorage = false;\r\n console.error('[AS]: get error:', error, keys, storeName);\r\n }\r\n\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n //deferred.reject(error);\r\n deferred.resolve(undefined);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n }).finally(() => {\r\n if(this.getPromises.size) {\r\n this.getThrottled();\r\n }\r\n });\r\n }, 16, false);\r\n }\r\n\r\n public isAvailable() {\r\n return this.useStorage;\r\n }\r\n\r\n public getCache() {\r\n return this.cache;\r\n }\r\n\r\n public getFromCache(key: T) {\r\n return this.cache[key];\r\n }\r\n\r\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async get(key: T, useCache = true): Promise {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.getFromCache(key);\r\n } else if(this.useStorage) {\r\n const r = this.getPromises.get(key);\r\n if(r) return r as any;\r\n\r\n const p = deferredPromise();\r\n this.getPromises.set(key, p as any);\r\n\r\n this.getThrottled();\r\n\r\n return p;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public getAll() {\r\n return this.storage.getAll().catch(() => []);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n //console.log('storageSetValue', obj, callback, arguments);\r\n\r\n 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(this.useStorage && !onlyLocal) {\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 this.useStorage ? this.saveDeferred : Promise.resolve();\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n /* if(!this.cache.hasOwnProperty(key)) {\r\n return;\r\n } */\r\n\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n if(this.useStorage) {\r\n this.keysToSet.delete(key);\r\n this.keysToDelete.add(key);\r\n this.deleteThrottled();\r\n }\r\n\r\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\r\n }\r\n\r\n public clear(saveLocal = false) {\r\n if(!saveLocal) {\r\n for(const i in this.cache) {\r\n delete this.cache[i];\r\n }\r\n }\r\n\r\n return this.storage.clear().catch(noop);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n storage.keysToSet.clear();\r\n storage.keysToDelete.clear();\r\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\r\n storage.getPromises.clear();\r\n return storage.clear(true);\r\n } else {\r\n return storage.set(storage.cache);\r\n }\r\n })).catch(noop);\r\n }\r\n\r\n /* public deleteDatabase() {\r\n return IDBStorage.deleteDatabase().catch(noop);\r\n } */\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/0.e35d290837b4c624b83e.chunk.js b/public/0.e35d290837b4c624b83e.chunk.js deleted file mode 100644 index acdf4fbf5..000000000 --- a/public/0.e35d290837b4c624b83e.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[0,20],{116:function(e,t,r){"use strict";t.a={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},127:function(e,t,r){"use strict";function s(e,t,r=!0){let s,n,o=null;return(...i)=>{s=!0,n=i,o||(r&&(s=!1,e(...n)),o=setInterval(()=>{if(!s)return clearInterval(o),void(o=null);s=!1,e(...n)},t))}}r.d(t,"a",(function(){return s}))},15:function(e,t,r){"use strict";r.r(t),r.d(t,"RootScope",(function(){return i}));var s=r(46),n=r(56),o=r(29);class i extends n.a{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",e=>{this.peerId=e}),this.addEventListener("user_auth",({id:e})=>{this.myId="number"==typeof s.b?+e:""+e}),this.addEventListener("connection_status_change",e=>{this.connectionStatus[e.name]=e}),this.addEventListener("idle",e=>{e?this.idle.focusPromise=new Promise(e=>{this.idle.focusResolve=e}):this.idle.focusResolve()})}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",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(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()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find(t=>t.name===e)}}const a=new i;o.a.rootScope=a,t.default=a},29:function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));const s=r(76).a.debug,n="undefined"!=typeof window?window:self;t.b=s},34:function(e,t,r){"use strict";function s(e){if(null===e||"object"!=typeof e)return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e)){return e.map(e=>s(e))}let t=new e.constructor;for(var r in e)e.hasOwnProperty(r)&&(t[r]=s(e[r]));return t}function n(e,t){const r=Object.keys,s=typeof e;return e&&t&&"object"===s&&s===typeof t?r(e).length===r(t).length&&r(e).every(r=>n(e[r],t[r])):e===t}function o(e,t){const r={writable:!0,configurable:!0},s={};t.forEach(t=>{e.hasOwnProperty(t)||(s[t]=r)}),Object.defineProperties(e,s)}function i(e,t="asc"){if(!e)return[];const r=e instanceof Map?[...e.keys()]:Object.keys(e).map(e=>+e);return"asc"===t?r.sort((e,t)=>e-t):r.sort((e,t)=>t-e)}function a(e,t){if(!e)return t;for(var r in e)t.hasOwnProperty(r)||delete e[r];for(var r in t)e[r]=t[r];return e}function c(e,t,r){"byteLength"in r[e]&&(r[e]=[...r[e]]),t&&t[e]!==r[e]&&(t[e].length=r[e].length,r[e].forEach((r,s)=>{t[e][s]=r}),r[e]=t[e])}function l(e){return"object"==typeof e&&null!==e}function h(e,t){const r=t.split(".");let s=e;return r.forEach(e=>{e&&(s=s[e])}),s}function u(e,t,r){const s=t.split(".");h(e,s.slice(0,-1).join("."))[s.pop()]=r}function d(e,t,r,n){for(const o in e)typeof t[o]!=typeof e[o]?(t[o]=s(e[o]),r&&r(n||o)):l(e[o])&&d(e[o],t[o],r,n||o)}function f(e,t){if(t)for(let r in t)void 0!==t[r]&&(e[r]=t[r])}r.d(t,"a",(function(){return s})),r.d(t,"b",(function(){return n})),r.d(t,"c",(function(){return o})),r.d(t,"e",(function(){return i})),r.d(t,"i",(function(){return a})),r.d(t,"h",(function(){return c})),r.d(t,"f",(function(){return l})),r.d(t,"d",(function(){return h})),r.d(t,"j",(function(){return u})),r.d(t,"k",(function(){return d})),r.d(t,"g",(function(){return f}))},43:function(e,t,r){"use strict";r.d(t,"a",(function(){return s})),r.d(t,"b",(function(){return c}));var s,n=r(29);!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"}(s||(s={}));const o=[s.None,s.Error,s.Warn,s.Log,s.Debug],i=Date.now();function a(){return"["+((Date.now()-i)/1e3).toFixed(3)+"]"}function c(e,t=s.Log|s.Warn|s.Error,r=!1){function i(...r){return t&s.Log&&console.log(a(),e,...r)}return n.b||r||(t=s.Error),i.warn=function(...r){return t&s.Warn&&console.warn(a(),e,...r)},i.info=function(...r){return t&s.Log&&console.info(a(),e,...r)},i.error=function(...r){return t&s.Error&&console.error(a(),e,...r)},i.trace=function(...r){return t&s.Log&&console.trace(a(),e,...r)},i.debug=function(...r){return t&s.Debug&&console.debug(a(),e,...r)},i.setPrefix=function(t){e="["+t+"]:"},i.setPrefix(e),i.setLevel=function(e){t=o.slice(0,e+1).reduce((e,t)=>e|t,0)},i}},45:function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));var s=r(99);function n(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((r,s)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,r(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,s(...e))}});return t.catch(s.a).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}},46:function(e,t,r){"use strict";r.d(t,"b",(function(){return s})),r.d(t,"c",(function(){return n})),r.d(t,"d",(function(){return o})),r.d(t,"a",(function(){return i}));const s=0,n=1271266957,o=777e3,i=2147483647},56:function(e,t,r){"use strict";r.d(t,"a",(function(){return s}));class s{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,r){var s,n;(null!==(s=this.listeners[e])&&void 0!==s?s:this.listeners[e]=[]).push({callback:t,options:r}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(n=r)||void 0===n?void 0:n.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,r){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}dispatchEvent(e,...t){this.reuseResults&&(this.listenerResults[e]=t);const r=[],s=this.listeners[e];if(s){s.slice().forEach(n=>{var o;-1!==s.findIndex(e=>e.callback===n.callback)&&(r.push(n.callback(...t)),(null===(o=n.options)||void 0===o?void 0:o.once)&&this.removeEventListener(e,n.callback))})}return r}cleanup(){this.listeners={},this.listenerResults={}}}},65:function(e,t,r){"use strict";var s=r(29),n=r(76);const o="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,i="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,a=o||i,c=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(r=>{r.length&&r.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},l=(...e)=>{self.postMessage(...e)},h=()=>{},u=i?c.bind(null,!1):o?l:h;i&&c.bind(null,!0);class d{constructor(){this.prefix="",this.cache={},this.useStorage=!0,n.a.test&&(this.prefix="t_")}get(e,t=!0){if(this.cache.hasOwnProperty(e)&&t)return this.cache[e];if(this.useStorage){let t;try{t=localStorage.getItem(this.prefix+e)}catch(e){this.useStorage=!1}if(null!==t)try{t=JSON.parse(t)}catch(e){}else t=void 0;return t}}set(e,t=!1){for(const r in e)if(e.hasOwnProperty(r)){const s=e[r];if(this.cache[r]=s,this.useStorage&&!t)try{const e=JSON.stringify(s);localStorage.setItem(this.prefix+r,e)}catch(e){this.useStorage=!1}}}delete(e,t=!1){e=""+e,t||delete this.cache[e];try{localStorage.removeItem(this.prefix+e)}catch(e){}}clear(){const e=["dc","server_time_offset","xt_instance","user_auth","state_id"];for(let t=1;t<=5;++t)e.push(`dc${t}_server_salt`),e.push(`dc${t}_auth_key`);for(let t of e)this.delete(t,!0)}toggleStorage(e){if(this.useStorage=e,e)return this.set(this.cache);this.clear()}}class f{constructor(){this.taskId=0,this.tasks={},f.STORAGES.push(this),a||(this.storage=new d)}finishTask(e,t){this.tasks.hasOwnProperty(e)&&(this.tasks[e](t),delete this.tasks[e])}proxy(e,...t){return new Promise((r,s)=>{if(a){const s=this.taskId++;this.tasks[s]=r;u({type:"localStorageProxy",id:s,payload:{type:e,args:t}})}else{t=Array.prototype.slice.call(t);r(this.storage[e].apply(this.storage,t))}})}get(e,t){return this.proxy("get",e,t)}set(e,t){return this.proxy("set",e,t)}delete(e,t){return this.proxy("delete",e,t)}clear(){return this.proxy("clear")}toggleStorage(e){return this.proxy("toggleStorage",e)}}f.STORAGES=[];const g=new f;s.a.appStorage=g;t.a=g},66:function(e,t,r){"use strict";r.d(t,"a",(function(){return n})),r.d(t,"b",(function(){return o}));const s={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function n(e){const t=s[e];return crypto.getRandomValues(t),t[0]}function o(){return""+n(32)+n(32)%16777215}},76:function(e,t,r){"use strict";const s={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1};t.a=s},80:function(e,t,r){"use strict";var s=r(29),n=r(98),o=r(116);const i=new n.a(o.a,"session");s.a.stateStorage=i,t.a=i},86:function(e,t,r){"use strict";function s(e,t){return new Promise(r=>{const s=new FileReader;s.addEventListener("loadend",e=>r(e.target.result)),s[t](e)})}function n(e){return s(e,"readAsText")}function o(e){return s(e,"readAsDataURL")}function i(e){return function(e){return s(e,"readAsArrayBuffer")}(e).then(e=>new Uint8Array(e))}function a(e,t=""){let r;const s=function(e){if(-1===["image/jpeg","image/png","image/gif","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e))return"application/octet-stream";return e}(t);try{r=new Blob(e,{type:s})}catch(t){let n=new BlobBuilder;e.forEach(e=>{n.append(e)}),r=n.getBlob(s)}return r}r.d(t,"c",(function(){return n})),r.d(t,"b",(function(){return o})),r.d(t,"d",(function(){return i})),r.d(t,"a",(function(){return a}))},98:function(e,t,r){"use strict";r.d(t,"a",(function(){return d}));var s=r(45),n=r(127),o=r(76),i=r(86),a=r(34),c=r(43);class l{constructor(e,t){this.storageIsAvailable=!0,Object(a.g)(this,e),o.a.test&&(this.name+="_test"),this.storeName=t,this.log=Object(c.b)("IDB-"+this.storeName),this.openDatabase(!0),l.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const r=t.db;r&&(r.onclose=()=>{},r.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let r=!1;return setTimeout(()=>{r||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,s)=>{t.onsuccess=n=>{r=!0;const o=t.result;let i=!1;this.log("Opened"),o.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),s(e)},o.onclose=e=>{this.log.error("closed:",e),!i&&this.openDatabase()},o.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(i=!0),t.onerror&&t.onerror(e),o.close()},o.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=o)},t.onerror=e=>{r=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),s(e)},t.onupgradeneeded=e=>{r=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var r;const s=e.createObjectStore(t.name);if(null===(r=t.indexes)||void 0===r?void 0:r.length)for(const e of t.indexes)s.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",r=>e.map((e,s)=>r.put(t[s],e)),"")}saveFile(e,t){return t instanceof Blob||(t=Object(i.a)([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,r,s=this.storeName){let n;return r&&(n=performance.now(),this.log(r+": start")),this.openDatabase().then(o=>new Promise((i,a)=>{const c=o.transaction([s],e);c.onerror=e=>{clearTimeout(l),a(c.error)},c.oncomplete=e=>{clearTimeout(l),r&&this.log(r+": end",performance.now()-n);const t=d.map(e=>e.result);i(u?t:t[0])};const l=setTimeout(()=>{this.log.error("transaction not finished",c)},1e4),h=t(c.objectStore(s)),u=Array.isArray(h),d=u?h:[].concat(h)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}l.STORAGES=[];var h=function(e,t,r,s){return new(r||(r=Promise))((function(n,o){function i(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?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(i,a)}c((s=s.apply(e,t||[])).next())}))};function u(){}class d{constructor(e,t){this.db=e,this.storeName=t,this.cache={},this.useStorage=!0,this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=Object(s.a)(),this.keysToDelete=new Set,this.deleteDeferred=Object(s.a)(),this.storage=new l(e,t),d.STORAGES.length&&(this.useStorage=d.STORAGES[0].useStorage),d.STORAGES.push(this),this.saveThrottled=Object(n.a)(()=>h(this,void 0,void 0,(function*(){const e=this.saveDeferred;this.saveDeferred=Object(s.a)();const t=this.keysToSet;if(t.size){const e=Array.from(t.values());t.clear();try{const t=e.map(e=>this.cache[e]);yield this.storage.save(e,t)}catch(t){console.error("[AS]: set error:",t,e)}}e.resolve(),t.size&&this.saveThrottled()})),16,!1),this.deleteThrottled=Object(n.a)(()=>h(this,void 0,void 0,(function*(){const e=this.deleteDeferred;this.deleteDeferred=Object(s.a)();const t=this.keysToDelete;if(t.size){const e=Array.from(t.values());t.clear();try{yield this.storage.delete(e)}catch(t){console.error("[AS]: delete error:",t,e)}}e.resolve(),t.size&&this.deleteThrottled()})),16,!1),this.getThrottled=Object(n.a)(()=>h(this,void 0,void 0,(function*(){const e=Array.from(this.getPromises.keys());this.storage.get(e).then(t=>{for(let r=0,s=e.length;r{["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(r)||(this.useStorage=!1,console.error("[AS]: get error:",r,e,t));for(let t=0,r=e.length;t{this.getPromises.size&&this.getThrottled()})})),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(e){return this.cache[e]}setToCache(e,t){return this.cache[e]=t}get(e,t=!0){return h(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(e)&&t)return this.getFromCache(e);if(this.useStorage){const t=this.getPromises.get(e);if(t)return t;const r=Object(s.a)();return this.getPromises.set(e,r),this.getThrottled(),r}}))}getAll(){return this.storage.getAll().catch(()=>[])}set(e,t=!1){for(const r in e)if(e.hasOwnProperty(r)){const s=e[r];this.setToCache(r,s),this.useStorage&&!t&&(this.keysToSet.add(r),this.keysToDelete.delete(r),this.saveThrottled())}return this.useStorage?this.saveDeferred:Promise.resolve()}delete(e,t=!1){return e=""+e,t||delete this.cache[e],this.useStorage&&(this.keysToSet.delete(e),this.keysToDelete.add(e),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(e=!1){if(!e)for(const e in this.cache)delete this.cache[e];return this.storage.clear().catch(u)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>(t.useStorage=e,e?t.set(t.cache):(t.keysToSet.clear(),t.keysToDelete.clear(),t.getPromises.forEach(e=>e.resolve(void 0)),t.getPromises.clear(),t.clear(!0))))).catch(u)}}d.STORAGES=[]},99:function(e,t,r){"use strict";function s(){}r.d(t,"a",(function(){return s}))}}]); -//# sourceMappingURL=0.e35d290837b4c624b83e.chunk.js.map \ No newline at end of file diff --git a/public/0.e35d290837b4c624b83e.chunk.js.map b/public/0.e35d290837b4c624b83e.chunk.js.map deleted file mode 100644 index ba0ec1204..000000000 --- a/public/0.e35d290837b4c624b83e.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///0.948b50c9a8047c9c0842.chunk.js"],"names":["this","push","116","module","__webpack_exports__","__webpack_require__","name","version","stores","127","throttle","fn","ms","shouldRunFirst","isPending","args","interval","_args","setInterval","clearInterval","d","15","r","RootScope","_mtproto_mtproto_config__WEBPACK_IMPORTED_MODULE_0__","_helpers_eventListenerBase__WEBPACK_IMPORTED_MODULE_1__","_config_debug__WEBPACK_IMPORTED_MODULE_2__","[object Object]","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","Promise","resolve","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","addEventListener","peerId","id","myId","status","themeColorElem","undefined","_themeColorElem","document","head","querySelector","color","themeColor","isNight","setAttribute","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","err","colorScheme","documentElement","classList","toggle","setThemeColor","isOverlayActive","value","getTheme","settings","theme","themes","find","t","rootScope","29","MOUNT_CLASS_TO","DEBUG","debug","self","34","copy","obj","Date","getTime","Array","isArray","map","el","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","Object","keys","tx","length","every","key","defineNotNumerableProperties","names","props","writable","configurable","out","forEach","defineProperties","getObjectKeysAndSort","object","sort","ids","Map","i","a","b","safeReplaceObject","wasObject","newObject","safeReplaceArrayInObject","v","isObject","getDeepProperty","splitted","split","o","setDeepProperty","slice","join","pop","validateInitObject","initObject","currentObject","onReplace","previousKey","safeAssign","fromObject","43","LogTypes","logger","_config_debug__WEBPACK_IMPORTED_MODULE_0__","LOG_LEVELS","None","Error","Warn","Log","Debug","_logTimer","now","dT","toFixed","prefix","type","ignoreDebugReset","console","log","warn","info","error","trace","setPrefix","_prefix","setLevel","level","reduce","acc","45","deferredPromise","_noop__WEBPACK_IMPORTED_MODULE_0__","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","listeners","callback","addNotifyListener","deferred","reject","catch","finally","cancel","assign","46","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","56","EventListenerBase","reuseResults","_constructor","listenerResults","options","_a","_b","once","findAndSplice","l","arr","listener","findIndex","removeEventListener","65","modes","isWebWorker","WorkerGlobalScope","isServiceWorker","ServiceWorkerGlobalScope","isWorker","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","then","postMessage","notifyWorker","noop","notifySomeone","bind","localStorage_LocalStorage","cache","useStorage","test","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","delete","enabled","set","clear","localStorage_LocalStorageController","taskId","tasks","STORAGES","storage","result","payload","prototype","call","apply","proxy","sessionStorage","appStorage","66","nextRandomUint","randomLong","arrays","8","Uint8Array","16","Uint16Array","32","Uint32Array","bits","array","crypto","getRandomValues","76","Modes","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker","80","_storage__WEBPACK_IMPORTED_MODULE_1__","_config_databases_state__WEBPACK_IMPORTED_MODULE_2__","stateStorage","86","readBlobAs","blob","method","reader","FileReader","e","target","readBlobAsText","readBlobAsDataURL","readBlobAsUint8Array","readBlobAsArrayBuffer","buffer","blobConstruct","blobParts","mimeType","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","98","storage_AppStorage","cancellablePromise","helpers_blob","idb_IDBStorage","db","storeName","storageIsAvailable","openDatabase","preserve","onclose","close","createNew","openDbPromise","request","indexedDB","open","message","finished","setTimeout","onerror","onsuccess","event","calledNew","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","store","objectStoreNames","contains","os","createObjectStore","indexes","index","createIndex","indexName","keyPath","objectParameters","entryName","concat","getObjectStore","objectStore","idx","put","fileName","save","get","mode","perf","performance","clearTimeout","timeout","oncomplete","results","requests","getAll","__awaiter","thisArg","_arguments","P","generator","fulfilled","step","next","rejected","done","getPromises","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","saveThrottled","size","from","values","deleteThrottled","getThrottled","includes","getFromCache","p","setToCache","add","99"],"mappings":"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","file":"0.e35d290837b4c624b83e.chunk.js","sourceRoot":""} \ No newline at end of file diff --git a/public/1.3982babdf2d0e2fda6f3.chunk.js b/public/1.3982babdf2d0e2fda6f3.chunk.js deleted file mode 100644 index 8f687b2fc..000000000 --- a/public/1.3982babdf2d0e2fda6f3.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[1],{117:function(f,e,d){"use strict";const t=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp");e.a=t},118:function(f,e,d){"use strict";d.d(e,"a",(function(){return a}));var t=d(37);function a(f,e,d,a,s=!0){if(fd/a?n=e*d/f|0:(c=f*a/e|0,c>d&&(n=n*d/c|0,c=d)),s&&c>=f&&n>=e&&(c=f,n=e),Object(t.c)(c,n)}d(29).a.calcImageInBox=a},128:function(f,e,d){"use strict";const t=new class{reload(){try{location.reload()}catch(f){}}close(){try{window.close()}catch(f){}}focus(){window.focus()}};e.a=t},129:function(f,e,d){"use strict";var t=d(29);const a={Emoji:{2049:62748,2122:62776,2139:62801,2194:62678,2195:62677,2196:62676,2197:62670,2198:62672,2199:62674,2328:61155,2600:4954,2601:4962,2602:4977,2603:4982,2604:4984,2611:62764,2614:4978,2615:3750,2618:2639,2620:196,2622:62667,2623:62668,2626:62697,2638:62694,2639:168,2648:62702,2649:62703,2650:62710,2651:62711,2652:62712,2653:62713,2660:51057,2663:51060,2665:51058,2666:51059,2668:4832,2692:61258,2693:4887,2694:61261,2696:61272,2697:61280,2699:61270,2702:61245,2705:62763,2708:4895,2709:61206,2712:61220,2714:62765,2716:62742,2721:62693,2728:5993,2733:62771,2734:62772,2744:4981,2747:62773,2753:62749,2754:62750,2755:62751,2757:62752,2763:1127,2764:1129,2795:62743,2796:62744,2797:62745,2934:62681,2935:62682,3030:62753,3297:62825,3299:62826,"0023-20e3":62777,"002a-20e3":62778,"0030-20e3":62779,"0031-20e3":62780,"0032-20e3":62781,"0033-20e3":62782,"0034-20e3":62783,"0035-20e3":62784,"0036-20e3":62785,"0037-20e3":62786,"0038-20e3":62787,"0039-20e3":62788,"00a9":62774,"00ae":62775,"1f004":51063,"1f0cf":51062,"1f170":62795,"1f171":62797,"1f17e":62806,"1f17f":62808,"1f18e":62796,"1f191":62798,"1f192":62799,"1f193":62800,"1f194":62802,"1f195":62804,"1f196":62805,"1f197":62807,"1f198":62809,"1f199":62810,"1f19a":62811,"1f1e6-1f1e8":71550,"1f1e6-1f1e9":71551,"1f1e6-1f1ea":71552,"1f1e6-1f1eb":71553,"1f1e6-1f1ec":71554,"1f1e6-1f1ee":71555,"1f1e6-1f1f1":71556,"1f1e6-1f1f2":71557,"1f1e6-1f1f4":71558,"1f1e6-1f1f6":71559,"1f1e6-1f1f7":71560,"1f1e6-1f1f8":71561,"1f1e6-1f1f9":71562,"1f1e6-1f1fa":71563,"1f1e6-1f1fc":71564,"1f1e6-1f1fd":71565,"1f1e6-1f1ff":71566,"1f1e7-1f1e6":71567,"1f1e7-1f1e7":71568,"1f1e7-1f1e9":71569,"1f1e7-1f1ea":71570,"1f1e7-1f1eb":71571,"1f1e7-1f1ec":71572,"1f1e7-1f1ed":71573,"1f1e7-1f1ee":71574,"1f1e7-1f1ef":71575,"1f1e7-1f1f1":71576,"1f1e7-1f1f2":71577,"1f1e7-1f1f3":71578,"1f1e7-1f1f4":71579,"1f1e7-1f1f6":71580,"1f1e7-1f1f7":71581,"1f1e7-1f1f8":71582,"1f1e7-1f1f9":71583,"1f1e7-1f1fb":71584,"1f1e7-1f1fc":71585,"1f1e7-1f1fe":71586,"1f1e7-1f1ff":71587,"1f1e8-1f1e6":71588,"1f1e8-1f1e8":71589,"1f1e8-1f1e9":71590,"1f1e8-1f1eb":71591,"1f1e8-1f1ec":71592,"1f1e8-1f1ed":71593,"1f1e8-1f1ee":71594,"1f1e8-1f1f0":71595,"1f1e8-1f1f1":71596,"1f1e8-1f1f2":71597,"1f1e8-1f1f3":71598,"1f1e8-1f1f4":71599,"1f1e8-1f1f5":71600,"1f1e8-1f1f7":71601,"1f1e8-1f1fa":71602,"1f1e8-1f1fb":71603,"1f1e8-1f1fc":71604,"1f1e8-1f1fd":71605,"1f1e8-1f1fe":71606,"1f1e8-1f1ff":71607,"1f1e9-1f1ea":71608,"1f1e9-1f1ec":71609,"1f1e9-1f1ef":71610,"1f1e9-1f1f0":71611,"1f1e9-1f1f2":71612,"1f1e9-1f1f4":71613,"1f1e9-1f1ff":71614,"1f1ea-1f1e6":71615,"1f1ea-1f1e8":71616,"1f1ea-1f1ea":71617,"1f1ea-1f1ec":71618,"1f1ea-1f1ed":71619,"1f1ea-1f1f7":71620,"1f1ea-1f1f8":71621,"1f1ea-1f1f9":71622,"1f1ea-1f1fa":71623,"1f1eb-1f1ee":71624,"1f1eb-1f1ef":71625,"1f1eb-1f1f0":71626,"1f1eb-1f1f2":71627,"1f1eb-1f1f4":71628,"1f1eb-1f1f7":71629,"1f1ec-1f1e6":71630,"1f1ec-1f1e7":71631,"1f1ec-1f1e9":71632,"1f1ec-1f1ea":71633,"1f1ec-1f1eb":71634,"1f1ec-1f1ec":71635,"1f1ec-1f1ed":71636,"1f1ec-1f1ee":71637,"1f1ec-1f1f1":71638,"1f1ec-1f1f2":71639,"1f1ec-1f1f3":71640,"1f1ec-1f1f5":71641,"1f1ec-1f1f6":71642,"1f1ec-1f1f7":71643,"1f1ec-1f1f8":71644,"1f1ec-1f1f9":71645,"1f1ec-1f1fa":71646,"1f1ec-1f1fc":71647,"1f1ec-1f1fe":71648,"1f1ed-1f1f0":71649,"1f1ed-1f1f2":71650,"1f1ed-1f1f3":71651,"1f1ed-1f1f7":71652,"1f1ed-1f1f9":71653,"1f1ed-1f1fa":71654,"1f1ee-1f1e8":71655,"1f1ee-1f1e9":71656,"1f1ee-1f1ea":71657,"1f1ee-1f1f1":71658,"1f1ee-1f1f2":71659,"1f1ee-1f1f3":71660,"1f1ee-1f1f4":71661,"1f1ee-1f1f6":71662,"1f1ee-1f1f7":71663,"1f1ee-1f1f8":71664,"1f1ee-1f1f9":71665,"1f1ef-1f1ea":71666,"1f1ef-1f1f2":71667,"1f1ef-1f1f4":71668,"1f1ef-1f1f5":71669,"1f1f0-1f1ea":71670,"1f1f0-1f1ec":71671,"1f1f0-1f1ed":71672,"1f1f0-1f1ee":71673,"1f1f0-1f1f2":71674,"1f1f0-1f1f3":71675,"1f1f0-1f1f5":71676,"1f1f0-1f1f7":71677,"1f1f0-1f1fc":71678,"1f1f0-1f1fe":71679,"1f1f0-1f1ff":71680,"1f1f1-1f1e6":71681,"1f1f1-1f1e7":71682,"1f1f1-1f1e8":71683,"1f1f1-1f1ee":71684,"1f1f1-1f1f0":71685,"1f1f1-1f1f7":71686,"1f1f1-1f1f8":71687,"1f1f1-1f1f9":71688,"1f1f1-1f1fa":71689,"1f1f1-1f1fb":71690,"1f1f1-1f1fe":71691,"1f1f2-1f1e6":71692,"1f1f2-1f1e8":71693,"1f1f2-1f1e9":71694,"1f1f2-1f1ea":71695,"1f1f2-1f1eb":71696,"1f1f2-1f1ec":71697,"1f1f2-1f1ed":71698,"1f1f2-1f1f0":71699,"1f1f2-1f1f1":71700,"1f1f2-1f1f2":71701,"1f1f2-1f1f3":71702,"1f1f2-1f1f4":71703,"1f1f2-1f1f5":71704,"1f1f2-1f1f6":71705,"1f1f2-1f1f7":71706,"1f1f2-1f1f8":71707,"1f1f2-1f1f9":71708,"1f1f2-1f1fa":71709,"1f1f2-1f1fb":71710,"1f1f2-1f1fc":71711,"1f1f2-1f1fd":71712,"1f1f2-1f1fe":71713,"1f1f2-1f1ff":71714,"1f1f3-1f1e6":71715,"1f1f3-1f1e8":71716,"1f1f3-1f1ea":71717,"1f1f3-1f1eb":71718,"1f1f3-1f1ec":71719,"1f1f3-1f1ee":71720,"1f1f3-1f1f1":71721,"1f1f3-1f1f4":71722,"1f1f3-1f1f5":71723,"1f1f3-1f1f7":71724,"1f1f3-1f1fa":71725,"1f1f3-1f1ff":71726,"1f1f4-1f1f2":71727,"1f1f5-1f1e6":71728,"1f1f5-1f1ea":71729,"1f1f5-1f1eb":71730,"1f1f5-1f1ec":71731,"1f1f5-1f1ed":71732,"1f1f5-1f1f0":71733,"1f1f5-1f1f1":71734,"1f1f5-1f1f2":71735,"1f1f5-1f1f3":71736,"1f1f5-1f1f7":71737,"1f1f5-1f1f8":71738,"1f1f5-1f1f9":71739,"1f1f5-1f1fc":71740,"1f1f5-1f1fe":71741,"1f1f6-1f1e6":71742,"1f1f7-1f1ea":71743,"1f1f7-1f1f4":71744,"1f1f7-1f1f8":71745,"1f1f7-1f1fa":71746,"1f1f7-1f1fc":71747,"1f1f8-1f1e6":71748,"1f1f8-1f1e7":71749,"1f1f8-1f1e8":71750,"1f1f8-1f1e9":71751,"1f1f8-1f1ea":71752,"1f1f8-1f1ec":71753,"1f1f8-1f1ed":71754,"1f1f8-1f1ee":71755,"1f1f8-1f1ef":71756,"1f1f8-1f1f0":71757,"1f1f8-1f1f1":71758,"1f1f8-1f1f2":71759,"1f1f8-1f1f3":71760,"1f1f8-1f1f4":71761,"1f1f8-1f1f7":71762,"1f1f8-1f1f8":71763,"1f1f8-1f1f9":71764,"1f1f8-1f1fb":71765,"1f1f8-1f1fd":71766,"1f1f8-1f1fe":71767,"1f1f8-1f1ff":71768,"1f1f9-1f1e6":71769,"1f1f9-1f1e8":71770,"1f1f9-1f1e9":71771,"1f1f9-1f1eb":71772,"1f1f9-1f1ec":71773,"1f1f9-1f1ed":71774,"1f1f9-1f1ef":71775,"1f1f9-1f1f0":71776,"1f1f9-1f1f1":71777,"1f1f9-1f1f2":71778,"1f1f9-1f1f3":71779,"1f1f9-1f1f4":71780,"1f1f9-1f1f7":71781,"1f1f9-1f1f9":71782,"1f1f9-1f1fb":71783,"1f1f9-1f1fc":71784,"1f1f9-1f1ff":71785,"1f1fa-1f1e6":71786,"1f1fa-1f1ec":71787,"1f1fa-1f1f2":71788,"1f1fa-1f1f3":71789,"1f1fa-1f1f8":71790,"1f1fa-1f1fe":71791,"1f1fa-1f1ff":71792,"1f1fb-1f1e6":71793,"1f1fb-1f1e8":71794,"1f1fb-1f1ea":71795,"1f1fb-1f1ec":71796,"1f1fb-1f1ee":71797,"1f1fb-1f1f3":71798,"1f1fb-1f1fa":71799,"1f1fc-1f1eb":71800,"1f1fc-1f1f8":71801,"1f1fd-1f1f0":71802,"1f1fe-1f1ea":71803,"1f1fe-1f1f9":71804,"1f1ff-1f1e6":71805,"1f1ff-1f1f2":71806,"1f1ff-1f1fc":71807,"1f201":62812,"1f202":62813,"1f21a":62819,"1f22f":62816,"1f232":62820,"1f233":62824,"1f234":62823,"1f235":62828,"1f236":62815,"1f237":62814,"1f238":62822,"1f239":62818,"1f23a":62827,"1f250":62817,"1f251":62821,"1f300":4974,"1f301":4824,"1f302":4976,"1f303":4825,"1f304":4827,"1f305":4828,"1f306":4829,"1f307":4830,"1f308":4975,"1f309":4831,"1f30a":4987,"1f30b":4782,"1f30c":4961,"1f30d":4773,"1f30e":4774,"1f30f":4775,"1f310":4776,"1f311":4941,"1f312":4942,"1f313":4943,"1f314":4944,"1f315":4945,"1f316":4946,"1f317":4947,"1f318":4948,"1f319":4949,"1f31a":4950,"1f31b":4951,"1f31c":4952,"1f31d":4955,"1f31e":4956,"1f31f":4959,"1f320":4960,"1f321":4953,"1f324":4965,"1f325":4966,"1f326":4967,"1f327":4968,"1f328":4969,"1f329":4970,"1f32a":4971,"1f32b":4972,"1f32c":4973,"1f32d":3694,"1f32e":3696,"1f32f":3697,"1f330":3677,"1f331":2631,"1f332":2633,"1f333":2634,"1f334":2635,"1f335":2636,"1f336":3668,"1f337":2630,"1f338":2622,"1f339":2625,"1f33a":2627,"1f33b":2628,"1f33c":2629,"1f33d":3667,"1f33e":2637,"1f33f":2638,"1f340":2640,"1f341":2641,"1f342":2642,"1f343":2643,"1f344":3675,"1f345":3660,"1f346":3664,"1f347":3644,"1f348":3645,"1f349":3646,"1f34a":3647,"1f34b":3648,"1f34c":3649,"1f34d":3650,"1f34e":3652,"1f34f":3653,"1f350":3654,"1f351":3655,"1f352":3656,"1f353":3657,"1f354":3691,"1f355":3693,"1f356":3687,"1f357":3688,"1f358":3713,"1f359":3714,"1f35a":3715,"1f35b":3716,"1f35c":3717,"1f35d":3718,"1f35e":3678,"1f35f":3692,"1f360":3719,"1f361":3725,"1f362":3720,"1f363":3721,"1f364":3722,"1f365":3723,"1f366":3734,"1f367":3735,"1f368":3736,"1f369":3737,"1f36a":3738,"1f36b":3743,"1f36c":3744,"1f36d":3745,"1f36e":3746,"1f36f":3747,"1f370":3740,"1f371":3712,"1f372":3704,"1f373":3702,"1f374":3769,"1f375":3752,"1f376":3753,"1f377":3755,"1f378":3756,"1f379":3757,"1f37a":3758,"1f37b":3759,"1f37c":3748,"1f37d":3768,"1f37e":3754,"1f37f":3708,"1f380":51004,"1f381":51005,"1f382":3739,"1f383":5988,"1f384":5989,"1f385":1490,"1f386":5990,"1f387":5991,"1f388":5994,"1f389":5995,"1f38a":5996,"1f38b":5997,"1f38c":71544,"1f38d":5998,"1f38e":5999,"1f38f":51e3,"1f390":51001,"1f391":51002,"1f392":61096,"1f393":61109,"1f396":51009,"1f397":51006,"1f399":61129,"1f39a":61130,"1f39b":61131,"1f39e":61164,"1f39f":51007,"1f3a0":4833,"1f3a1":4834,"1f3a2":4835,"1f3a3":51036,"1f3a4":61132,"1f3a5":61163,"1f3a6":62733,"1f3a7":61133,"1f3a8":51067,"1f3a9":61108,"1f3aa":4837,"1f3ab":51008,"1f3ac":61166,"1f3ad":51065,"1f3ae":51049,"1f3af":51042,"1f3b0":51051,"1f3b1":51045,"1f3b2":51052,"1f3b3":51024,"1f3b4":51064,"1f3b5":61127,"1f3b6":61128,"1f3b7":61135,"1f3b8":61137,"1f3b9":61138,"1f3ba":61139,"1f3bb":61140,"1f3bc":61126,"1f3bd":51038,"1f3be":51022,"1f3bf":51039,"1f3c0":51018,"1f3c1":71542,"1f3c2":1562,"1f3c3-200d-2640":1546,"1f3c3-200d-2642":1545,"1f3c3":1544,"1f3c4-200d-2640":1568,"1f3c4-200d-2642":1567,"1f3c4":1566,"1f3c5":51011,"1f3c6":51010,"1f3c7":1560,"1f3c8":51020,"1f3c9":51021,"1f3ca-200d-2640":1574,"1f3ca-200d-2642":1573,"1f3ca":1572,"1f3cb-200d-2640":1580,"1f3cb-200d-2642":1579,"1f3cb":1578,"1f3cc-200d-2640":1565,"1f3cc-200d-2642":1564,"1f3cc":1563,"1f3cd":4868,"1f3ce":4867,"1f3cf":51025,"1f3d0":51019,"1f3d1":51026,"1f3d2":51027,"1f3d3":51029,"1f3d4":4780,"1f3d5":4784,"1f3d6":4785,"1f3d7":4791,"1f3d8":4796,"1f3d9":4826,"1f3da":4797,"1f3db":4790,"1f3dc":4786,"1f3dd":4787,"1f3de":4788,"1f3df":4789,"1f3e0":4798,"1f3e1":4799,"1f3e2":4800,"1f3e3":4801,"1f3e4":4802,"1f3e5":4803,"1f3e6":4804,"1f3e7":62643,"1f3e8":4805,"1f3e9":4806,"1f3ea":4807,"1f3eb":4808,"1f3ec":4809,"1f3ed":4810,"1f3ee":61177,"1f3ef":4811,"1f3f0":4812,"1f3f3-200d-1f308":71547,"1f3f3-200d-26a7":71548,"1f3f3":71546,"1f3f4-200d-2620":71549,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71808,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71809,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71810,"1f3f4":71545,"1f3f5":2624,"1f3f7":61195,"1f3f8":51030,"1f3f9":61264,"1f3fa":3772,"1f3fb":9499,"1f3fc":9500,"1f3fd":9501,"1f3fe":9502,"1f3ff":9503,"1f400":2550,"1f401":2549,"1f402":2530,"1f403":2531,"1f404":2532,"1f405":2521,"1f406":2522,"1f407":2553,"1f408-200d-2b1b":2518,"1f408":2517,"1f409":2592,"1f40a":2587,"1f40b":2596,"1f40c":2605,"1f40d":2590,"1f40e":2524,"1f40f":2537,"1f410":2539,"1f411":2538,"1f412":2505,"1f413":2570,"1f414":2569,"1f415-200d-1f9ba":2511,"1f415":2509,"1f416":2534,"1f417":2535,"1f418":2544,"1f419":2603,"1f41a":2604,"1f41b":2607,"1f41c":2608,"1f41d":2609,"1f41e":2611,"1f41f":2599,"1f420":2600,"1f421":2601,"1f422":2588,"1f423":2571,"1f424":2572,"1f425":2573,"1f426":2574,"1f427":2575,"1f428":2560,"1f429":2512,"1f42a":2540,"1f42b":2541,"1f42c":2597,"1f42d":2548,"1f42e":2529,"1f42f":2520,"1f430":2552,"1f431":2516,"1f432":2591,"1f433":2595,"1f434":2523,"1f435":2504,"1f436":2508,"1f437":2533,"1f438":2586,"1f439":2551,"1f43a":2513,"1f43b-200d-2744":2559,"1f43b":2558,"1f43c":2561,"1f43d":2536,"1f43e":2567,"1f43f":2554,"1f440":1350,"1f441-200d-1f5e8":1147,"1f441":1351,"1f442":1342,"1f443":1344,"1f444":1353,"1f445":1352,"1f446":1318,"1f447":1320,"1f448":1316,"1f449":1317,"1f44a":1325,"1f44b":1303,"1f44c":1308,"1f44d":1322,"1f44e":1323,"1f44f":1328,"1f450":1330,"1f451":61106,"1f452":61107,"1f453":61072,"1f454":61077,"1f455":61078,"1f456":61079,"1f457":61084,"1f458":61085,"1f459":61090,"1f45a":61091,"1f45b":61092,"1f45c":61093,"1f45d":61094,"1f45e":61098,"1f45f":61099,"1f460":61102,"1f461":61103,"1f462":61105,"1f463":1649,"1f464":1646,"1f465":1647,"1f466":1356,"1f467":1357,"1f468-200d-1f33e":1423,"1f468-200d-1f373":1426,"1f468-200d-1f37c":1487,"1f468-200d-1f393":1414,"1f468-200d-1f3a4":1444,"1f468-200d-1f3a8":1447,"1f468-200d-1f3eb":1417,"1f468-200d-1f3ed":1432,"1f468-200d-1f466-200d-1f466":1636,"1f468-200d-1f466":1635,"1f468-200d-1f467-200d-1f466":1638,"1f468-200d-1f467-200d-1f467":1639,"1f468-200d-1f467":1637,"1f468-200d-1f468-200d-1f466":1625,"1f468-200d-1f468-200d-1f466-200d-1f466":1628,"1f468-200d-1f468-200d-1f467":1626,"1f468-200d-1f468-200d-1f467-200d-1f466":1627,"1f468-200d-1f468-200d-1f467-200d-1f467":1629,"1f468-200d-1f469-200d-1f466":1620,"1f468-200d-1f469-200d-1f466-200d-1f466":1623,"1f468-200d-1f469-200d-1f467":1621,"1f468-200d-1f469-200d-1f467-200d-1f466":1622,"1f468-200d-1f469-200d-1f467-200d-1f467":1624,"1f468-200d-1f4bb":1441,"1f468-200d-1f4bc":1435,"1f468-200d-1f527":1429,"1f468-200d-1f52c":1438,"1f468-200d-1f680":1453,"1f468-200d-1f692":1456,"1f468-200d-1f9af":1536,"1f468-200d-1f9b0":1362,"1f468-200d-1f9b1":1363,"1f468-200d-1f9b2":1365,"1f468-200d-1f9b3":1364,"1f468-200d-1f9bc":1539,"1f468-200d-1f9bd":1542,"1f468-200d-2695":1411,"1f468-200d-2696":1420,"1f468-200d-2708":1450,"1f468-200d-2764-200d-1f468":1617,"1f468-200d-2764-200d-1f48b-200d-1f468":1613,"1f468":1360,"1f469-200d-1f33e":1424,"1f469-200d-1f373":1427,"1f469-200d-1f37c":1486,"1f469-200d-1f393":1415,"1f469-200d-1f3a4":1445,"1f469-200d-1f3a8":1448,"1f469-200d-1f3eb":1418,"1f469-200d-1f3ed":1433,"1f469-200d-1f466-200d-1f466":1641,"1f469-200d-1f466":1640,"1f469-200d-1f467-200d-1f466":1643,"1f469-200d-1f467-200d-1f467":1644,"1f469-200d-1f467":1642,"1f469-200d-1f469-200d-1f466":1630,"1f469-200d-1f469-200d-1f466-200d-1f466":1633,"1f469-200d-1f469-200d-1f467":1631,"1f469-200d-1f469-200d-1f467-200d-1f466":1632,"1f469-200d-1f469-200d-1f467-200d-1f467":1634,"1f469-200d-1f4bb":1442,"1f469-200d-1f4bc":1436,"1f469-200d-1f527":1430,"1f469-200d-1f52c":1439,"1f469-200d-1f680":1454,"1f469-200d-1f692":1457,"1f469-200d-1f9af":1537,"1f469-200d-1f9b0":1367,"1f469-200d-1f9b1":1369,"1f469-200d-1f9b2":1373,"1f469-200d-1f9b3":1371,"1f469-200d-1f9bc":1540,"1f469-200d-1f9bd":1543,"1f469-200d-2695":1412,"1f469-200d-2696":1421,"1f469-200d-2708":1451,"1f469-200d-2764-200d-1f468":1616,"1f469-200d-2764-200d-1f469":1618,"1f469-200d-2764-200d-1f48b-200d-1f468":1612,"1f469-200d-2764-200d-1f48b-200d-1f469":1614,"1f469":1366,"1f46a":1619,"1f46b":1609,"1f46c":1610,"1f46d":1608,"1f46e-200d-2640":1460,"1f46e-200d-2642":1459,"1f46e":1458,"1f46f-200d-2640":1552,"1f46f-200d-2642":1551,"1f46f":1550,"1f470-200d-2640":1483,"1f470-200d-2642":1482,"1f470":1481,"1f471-200d-2640":1375,"1f471-200d-2642":1376,"1f471":1359,"1f472":1476,"1f473-200d-2640":1475,"1f473-200d-2642":1474,"1f473":1473,"1f474":1378,"1f475":1379,"1f476":1354,"1f477-200d-2640":1470,"1f477-200d-2642":1469,"1f477":1468,"1f478":1472,"1f479":199,"1f47a":1100,"1f47b":1101,"1f47c":1489,"1f47d":1102,"1f47e":1103,"1f47f":194,"1f480":195,"1f481-200d-2640":1394,"1f481-200d-2642":1393,"1f481":1392,"1f482-200d-2640":1466,"1f482-200d-2642":1465,"1f482":1464,"1f483":1547,"1f484":61114,"1f485":1335,"1f486-200d-2640":1522,"1f486-200d-2642":1521,"1f486":1520,"1f487-200d-2640":1525,"1f487-200d-2642":1524,"1f487":1523,"1f488":4836,"1f489":61287,"1f48a":61289,"1f48b":1117,"1f48c":1118,"1f48d":61115,"1f48e":61116,"1f48f":1611,"1f490":2621,"1f491":1615,"1f492":4813,"1f493":1123,"1f494":1128,"1f495":1125,"1f496":1121,"1f497":1122,"1f498":1119,"1f499":1133,"1f49a":1132,"1f49b":1131,"1f49c":1134,"1f49d":1120,"1f49e":1124,"1f49f":1126,"1f4a0":62859,"1f4a1":61175,"1f4a2":1139,"1f4a3":1145,"1f4a4":1151,"1f4a5":1140,"1f4a6":1142,"1f4a7":4986,"1f4a8":1143,"1f4a9":197,"1f4aa":1337,"1f4ab":1141,"1f4ac":1146,"1f4ad":1150,"1f4ae":2623,"1f4af":1138,"1f4b0":61196,"1f4b1":62754,"1f4b2":62755,"1f4b3":61203,"1f4b4":61198,"1f4b5":61199,"1f4b6":61200,"1f4b7":61201,"1f4b8":61202,"1f4b9":61205,"1f4ba":4900,"1f4bb":61152,"1f4bc":61226,"1f4bd":61158,"1f4be":61159,"1f4bf":61160,"1f4c0":61161,"1f4c1":61227,"1f4c2":61228,"1f4c3":61188,"1f4c4":61190,"1f4c5":61230,"1f4c6":61231,"1f4c7":61234,"1f4c8":61235,"1f4c9":61236,"1f4ca":61237,"1f4cb":61238,"1f4cc":61239,"1f4cd":61240,"1f4ce":61241,"1f4cf":61243,"1f4d0":61244,"1f4d1":61193,"1f4d2":61187,"1f4d3":61186,"1f4d4":61179,"1f4d5":61180,"1f4d6":61181,"1f4d7":61182,"1f4d8":61183,"1f4d9":61184,"1f4da":61185,"1f4db":62760,"1f4dc":61189,"1f4dd":61225,"1f4de":61147,"1f4df":61148,"1f4e0":61149,"1f4e1":61286,"1f4e2":61121,"1f4e3":61122,"1f4e4":61210,"1f4e5":61211,"1f4e6":61212,"1f4e7":61207,"1f4e8":61208,"1f4e9":61209,"1f4ea":61214,"1f4eb":61213,"1f4ec":61215,"1f4ed":61216,"1f4ee":61217,"1f4ef":61123,"1f4f0":61191,"1f4f1":61144,"1f4f2":61145,"1f4f3":62737,"1f4f4":62738,"1f4f5":62665,"1f4f6":62736,"1f4f7":61168,"1f4f8":61169,"1f4f9":61170,"1f4fa":61167,"1f4fb":61134,"1f4fc":61171,"1f4fd":61165,"1f4ff":61113,"1f500":62715,"1f501":62716,"1f502":62717,"1f503":62683,"1f504":62684,"1f505":62734,"1f506":62735,"1f507":61117,"1f508":61118,"1f509":61119,"1f50a":61120,"1f50b":61150,"1f50c":61151,"1f50d":61172,"1f50e":61173,"1f50f":61251,"1f510":61252,"1f511":61253,"1f512":61249,"1f513":61250,"1f514":61124,"1f515":61125,"1f516":61194,"1f517":61274,"1f518":62860,"1f519":62685,"1f51a":62686,"1f51b":62687,"1f51c":62688,"1f51d":62689,"1f51e":62666,"1f51f":62789,"1f520":62790,"1f521":62791,"1f522":62792,"1f523":62793,"1f524":62794,"1f525":4985,"1f526":61176,"1f527":61267,"1f528":61255,"1f529":61269,"1f52a":3771,"1f52b":61262,"1f52c":61284,"1f52d":61285,"1f52e":51046,"1f52f":62701,"1f530":62761,"1f531":62759,"1f532":62862,"1f533":62861,"1f534":62829,"1f535":62833,"1f536":62853,"1f537":62854,"1f538":62855,"1f539":62856,"1f53a":62857,"1f53b":62858,"1f53c":62725,"1f53d":62727,"1f549":62692,"1f54a":2576,"1f54b":4821,"1f54c":4817,"1f54d":4819,"1f54e":62700,"1f550":4919,"1f551":4921,"1f552":4923,"1f553":4925,"1f554":4927,"1f555":4929,"1f556":4931,"1f557":4933,"1f558":4935,"1f559":4937,"1f55a":4939,"1f55b":4917,"1f55c":4920,"1f55d":4922,"1f55e":4924,"1f55f":4926,"1f560":4928,"1f561":4930,"1f562":4932,"1f563":4934,"1f564":4936,"1f565":4938,"1f566":4940,"1f567":4918,"1f56f":61174,"1f570":4916,"1f573":1144,"1f574":1549,"1f575-200d-2640":1463,"1f575-200d-2642":1462,"1f575":1461,"1f576":61073,"1f577":2614,"1f578":2615,"1f579":51050,"1f57a":1548,"1f587":61242,"1f58a":61222,"1f58b":61221,"1f58c":61223,"1f58d":61224,"1f590":1305,"1f595":1319,"1f596":1307,"1f5a4":1136,"1f5a5":61153,"1f5a8":61154,"1f5b1":61156,"1f5b2":61157,"1f5bc":51066,"1f5c2":61229,"1f5c3":61246,"1f5c4":61247,"1f5d1":61248,"1f5d2":61232,"1f5d3":61233,"1f5dc":61271,"1f5dd":61254,"1f5de":61192,"1f5e1":61260,"1f5e3":1645,"1f5e8":1148,"1f5ef":1149,"1f5f3":61218,"1f5fa":4777,"1f5fb":4783,"1f5fc":4814,"1f5fd":4815,"1f5fe":4778,"1f5ff":61320,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":113,"1f608":193,"1f609":111,"1f60a":112,"1f60b":123,"1f60c":143,"1f60d":115,"1f60e":162,"1f60f":138,"1f610":135,"1f611":136,"1f612":139,"1f613":185,"1f614":144,"1f615":165,"1f616":182,"1f617":118,"1f618":117,"1f619":121,"1f61a":120,"1f61b":124,"1f61c":125,"1f61d":127,"1f61e":184,"1f61f":166,"1f620":191,"1f621":190,"1f622":179,"1f623":183,"1f624":189,"1f625":178,"1f626":174,"1f627":175,"1f628":176,"1f629":186,"1f62a":145,"1f62b":187,"1f62c":141,"1f62d":180,"1f62e":169,"1f62f":170,"1f630":177,"1f631":181,"1f632":171,"1f633":172,"1f634":147,"1f635":157,"1f636":137,"1f637":148,"1f638":1106,"1f639":1107,"1f63a":1105,"1f63b":1108,"1f63c":1109,"1f63d":1110,"1f63e":1113,"1f63f":1112,"1f640":1111,"1f641":167,"1f642":19,"1f643":110,"1f644":140,"1f645-200d-2640":1388,"1f645-200d-2642":1387,"1f645":1386,"1f646-200d-2640":1391,"1f646-200d-2642":1390,"1f646":1389,"1f647-200d-2640":1403,"1f647-200d-2642":1402,"1f647":1401,"1f648":1114,"1f649":1115,"1f64a":1116,"1f64b-200d-2640":1397,"1f64b-200d-2642":1396,"1f64b":1395,"1f64c":1329,"1f64d-200d-2640":1382,"1f64d-200d-2642":1381,"1f64d":1380,"1f64e-200d-2640":1385,"1f64e-200d-2642":1384,"1f64e":1383,"1f64f":1333,"1f680":4906,"1f681":4901,"1f682":4838,"1f683":4839,"1f684":4840,"1f685":4841,"1f686":4842,"1f687":4843,"1f688":4844,"1f689":4845,"1f68a":4846,"1f68b":4849,"1f68c":4850,"1f68d":4851,"1f68e":4852,"1f68f":4877,"1f690":4853,"1f691":4854,"1f692":4855,"1f693":4856,"1f694":4857,"1f695":4858,"1f696":4859,"1f697":4860,"1f698":4861,"1f699":4862,"1f69a":4864,"1f69b":4865,"1f69c":4866,"1f69d":4847,"1f69e":4848,"1f69f":4902,"1f6a0":4903,"1f6a1":4904,"1f6a2":4894,"1f6a3-200d-2640":1571,"1f6a3-200d-2642":1570,"1f6a3":1569,"1f6a4":4890,"1f6a5":4883,"1f6a6":4884,"1f6a7":4886,"1f6a8":4882,"1f6a9":71543,"1f6aa":61292,"1f6ab":62659,"1f6ac":61316,"1f6ad":62661,"1f6ae":62644,"1f6af":62662,"1f6b0":62645,"1f6b1":62663,"1f6b2":4873,"1f6b3":62660,"1f6b4-200d-2640":1583,"1f6b4-200d-2642":1582,"1f6b4":1581,"1f6b5-200d-2640":1586,"1f6b5-200d-2642":1585,"1f6b5":1584,"1f6b6-200d-2640":1528,"1f6b6-200d-2642":1527,"1f6b6":1526,"1f6b7":62664,"1f6b8":62657,"1f6b9":62647,"1f6ba":62648,"1f6bb":62649,"1f6bc":62650,"1f6bd":61299,"1f6be":62651,"1f6bf":61301,"1f6c0":1605,"1f6c1":61302,"1f6c2":62652,"1f6c3":62653,"1f6c4":62654,"1f6c5":62655,"1f6cb":61297,"1f6cc":1606,"1f6cd":61095,"1f6ce":4908,"1f6cf":61296,"1f6d0":62690,"1f6d1":4885,"1f6d2":61315,"1f6d5":4818,"1f6d6":4795,"1f6d7":61293,"1f6e0":61259,"1f6e1":61265,"1f6e2":4880,"1f6e3":4878,"1f6e4":4879,"1f6e5":4893,"1f6e9":4896,"1f6eb":4897,"1f6ec":4898,"1f6f0":4905,"1f6f3":4891,"1f6f4":4874,"1f6f5":4869,"1f6f6":4889,"1f6f7":51040,"1f6f8":4907,"1f6f9":4875,"1f6fa":4872,"1f6fb":4863,"1f6fc":4876,"1f7e0":62830,"1f7e1":62831,"1f7e2":62832,"1f7e3":62834,"1f7e4":62835,"1f7e5":62838,"1f7e6":62842,"1f7e7":62839,"1f7e8":62840,"1f7e9":62841,"1f7ea":62843,"1f7eb":62844,"1f90c":1309,"1f90d":1137,"1f90e":1135,"1f90f":1310,"1f910":133,"1f911":128,"1f912":149,"1f913":163,"1f914":132,"1f915":150,"1f916":1104,"1f917":129,"1f918":1314,"1f919":1315,"1f91a":1304,"1f91b":1326,"1f91c":1327,"1f91d":1332,"1f91e":1312,"1f91f":1313,"1f920":159,"1f921":198,"1f922":151,"1f923":17,"1f924":146,"1f925":142,"1f926-200d-2640":1406,"1f926-200d-2642":1405,"1f926":1404,"1f927":153,"1f928":134,"1f929":116,"1f92a":126,"1f92b":131,"1f92c":192,"1f92d":130,"1f92e":152,"1f92f":158,"1f930":1484,"1f931":1485,"1f932":1331,"1f933":1336,"1f934":1471,"1f935-200d-2640":1480,"1f935-200d-2642":1479,"1f935":1478,"1f936":1491,"1f937-200d-2640":1409,"1f937-200d-2642":1408,"1f937":1407,"1f938-200d-2640":1589,"1f938-200d-2642":1588,"1f938":1587,"1f939-200d-2640":1601,"1f939-200d-2642":1600,"1f939":1599,"1f93a":1559,"1f93c-200d-2640":1592,"1f93c-200d-2642":1591,"1f93c":1590,"1f93d-200d-2640":1595,"1f93d-200d-2642":1594,"1f93d":1593,"1f93e-200d-2640":1598,"1f93e-200d-2642":1597,"1f93e":1596,"1f93f":51037,"1f940":2626,"1f941":61142,"1f942":3760,"1f943":3761,"1f944":3770,"1f945":51033,"1f947":51012,"1f948":51013,"1f949":51014,"1f94a":51031,"1f94b":51032,"1f94c":51041,"1f94d":51028,"1f94e":51017,"1f94f":51023,"1f950":3679,"1f951":3663,"1f952":3670,"1f953":3690,"1f954":3665,"1f955":3666,"1f956":3680,"1f957":3707,"1f958":3703,"1f959":3699,"1f95a":3701,"1f95b":3749,"1f95c":3676,"1f95d":3659,"1f95e":3684,"1f95f":3726,"1f960":3727,"1f961":3728,"1f962":3767,"1f963":3706,"1f964":3762,"1f965":3662,"1f966":3672,"1f967":3742,"1f968":3682,"1f969":3689,"1f96a":3695,"1f96b":3711,"1f96c":3671,"1f96d":3651,"1f96e":3724,"1f96f":3683,"1f970":114,"1f971":188,"1f972":122,"1f973":160,"1f974":156,"1f975":154,"1f976":155,"1f977":1467,"1f978":161,"1f97a":173,"1f97b":61086,"1f97c":61075,"1f97d":61074,"1f97e":61100,"1f97f":61101,"1f980":3729,"1f981":2519,"1f982":2616,"1f983":2568,"1f984":2525,"1f985":2577,"1f986":2578,"1f987":2557,"1f988":2602,"1f989":2580,"1f98a":2514,"1f98b":2606,"1f98c":2527,"1f98d":2506,"1f98e":2589,"1f98f":2546,"1f990":3731,"1f991":3732,"1f992":2543,"1f993":2526,"1f994":2556,"1f995":2593,"1f996":2594,"1f997":2612,"1f998":2565,"1f999":2542,"1f99a":2584,"1f99b":2547,"1f99c":2585,"1f99d":2515,"1f99e":3730,"1f99f":2617,"1f9a0":2620,"1f9a1":2566,"1f9a2":2579,"1f9a3":2545,"1f9a4":2581,"1f9a5":2562,"1f9a6":2563,"1f9a7":2507,"1f9a8":2564,"1f9a9":2583,"1f9aa":3733,"1f9ab":2555,"1f9ac":2528,"1f9ad":2598,"1f9ae":2510,"1f9af":61273,"1f9b4":1349,"1f9b5":1340,"1f9b6":1341,"1f9b7":1348,"1f9b8-200d-2640":1495,"1f9b8-200d-2642":1494,"1f9b8":1493,"1f9b9-200d-2640":1498,"1f9b9-200d-2642":1497,"1f9b9":1496,"1f9ba":61076,"1f9bb":1343,"1f9bc":4871,"1f9bd":4870,"1f9be":1338,"1f9bf":1339,"1f9c0":3686,"1f9c1":3741,"1f9c2":3710,"1f9c3":3764,"1f9c4":3673,"1f9c5":3674,"1f9c6":3700,"1f9c7":3685,"1f9c8":3709,"1f9c9":3765,"1f9ca":3766,"1f9cb":3763,"1f9cd-200d-2640":1531,"1f9cd-200d-2642":1530,"1f9cd":1529,"1f9ce-200d-2640":1534,"1f9ce-200d-2642":1533,"1f9ce":1532,"1f9cf-200d-2640":1400,"1f9cf-200d-2642":1399,"1f9cf":1398,"1f9d0":164,"1f9d1-200d-1f33e":1422,"1f9d1-200d-1f373":1425,"1f9d1-200d-1f37c":1488,"1f9d1-200d-1f384":1492,"1f9d1-200d-1f393":1413,"1f9d1-200d-1f3a4":1443,"1f9d1-200d-1f3a8":1446,"1f9d1-200d-1f3eb":1416,"1f9d1-200d-1f3ed":1431,"1f9d1-200d-1f4bb":1440,"1f9d1-200d-1f4bc":1434,"1f9d1-200d-1f527":1428,"1f9d1-200d-1f52c":1437,"1f9d1-200d-1f680":1452,"1f9d1-200d-1f692":1455,"1f9d1-200d-1f91d-200d-1f9d1":1607,"1f9d1-200d-1f9af":1535,"1f9d1-200d-1f9b0":1368,"1f9d1-200d-1f9b1":1370,"1f9d1-200d-1f9b2":1374,"1f9d1-200d-1f9b3":1372,"1f9d1-200d-1f9bc":1538,"1f9d1-200d-1f9bd":1541,"1f9d1-200d-2695":1410,"1f9d1-200d-2696":1419,"1f9d1-200d-2708":1449,"1f9d1":1358,"1f9d2":1355,"1f9d3":1377,"1f9d4":1361,"1f9d5":1477,"1f9d6-200d-2640":1555,"1f9d6-200d-2642":1554,"1f9d6":1553,"1f9d7-200d-2640":1558,"1f9d7-200d-2642":1557,"1f9d7":1556,"1f9d8-200d-2640":1604,"1f9d8-200d-2642":1603,"1f9d8":1602,"1f9d9-200d-2640":1501,"1f9d9-200d-2642":1500,"1f9d9":1499,"1f9da-200d-2640":1504,"1f9da-200d-2642":1503,"1f9da":1502,"1f9db-200d-2640":1507,"1f9db-200d-2642":1506,"1f9db":1505,"1f9dc-200d-2640":1510,"1f9dc-200d-2642":1509,"1f9dc":1508,"1f9dd-200d-2640":1513,"1f9dd-200d-2642":1512,"1f9dd":1511,"1f9de-200d-2640":1516,"1f9de-200d-2642":1515,"1f9de":1514,"1f9df-200d-2640":1519,"1f9df-200d-2642":1518,"1f9df":1517,"1f9e0":1345,"1f9e1":1130,"1f9e2":61110,"1f9e3":61080,"1f9e4":61081,"1f9e5":61082,"1f9e6":61083,"1f9e7":51003,"1f9e8":5992,"1f9e9":51053,"1f9ea":61281,"1f9eb":61282,"1f9ec":61283,"1f9ed":4779,"1f9ee":61162,"1f9ef":61314,"1f9f0":61277,"1f9f1":4792,"1f9f2":61278,"1f9f3":4909,"1f9f4":61305,"1f9f5":51068,"1f9f6":51070,"1f9f7":61306,"1f9f8":51054,"1f9f9":61307,"1f9fa":61308,"1f9fb":61309,"1f9fc":61311,"1f9fd":61313,"1f9fe":61204,"1f9ff":51048,"1fa70":61104,"1fa71":61087,"1fa72":61088,"1fa73":61089,"1fa74":61097,"1fa78":61288,"1fa79":61290,"1fa7a":61291,"1fa80":51043,"1fa81":51044,"1fa82":4899,"1fa83":61263,"1fa84":51047,"1fa85":51055,"1fa86":51056,"1fa90":4957,"1fa91":61298,"1fa92":61304,"1fa93":61256,"1fa94":61178,"1fa95":61141,"1fa96":61111,"1fa97":61136,"1fa98":61143,"1fa99":61197,"1fa9a":61266,"1fa9b":61268,"1fa9c":61279,"1fa9d":61276,"1fa9e":61294,"1fa9f":61295,"1faa0":61300,"1faa1":51069,"1faa2":51071,"1faa3":61310,"1faa4":61303,"1faa5":61312,"1faa6":61318,"1faa7":61321,"1faa8":4793,"1fab0":2618,"1fab1":2619,"1fab2":2610,"1fab3":2613,"1fab4":2632,"1fab5":4794,"1fab6":2582,"1fac0":1346,"1fac1":1347,"1fac2":1648,"1fad0":3658,"1fad1":3669,"1fad2":3661,"1fad3":3681,"1fad4":3698,"1fad5":3705,"1fad6":3751,"203c":62747,"21a9":62679,"21aa":62680,"231a":4912,"231b":4910,"23cf":62732,"23e9":62719,"23ea":62723,"23eb":62726,"23ec":62728,"23ed":62720,"23ee":62724,"23ef":62721,"23f0":4913,"23f1":4914,"23f2":4915,"23f3":4911,"23f8":62729,"23f9":62730,"23fa":62731,"24c2":62803,"25aa":62851,"25ab":62852,"25b6":62718,"25c0":62722,"25fb":62848,"25fc":62847,"25fd":62850,"25fe":62849,"260e":61146,"261d":1321,"262a":62698,"262e":62699,"262f":62695,"263a":119,"264a":62704,"264b":62705,"264c":62706,"264d":62707,"264e":62708,"264f":62709,"265f":51061,"267b":62757,"267e":62746,"267f":62646,"269b":62691,"269c":62758,"26a0":62656,"26a1":4980,"26a7":62741,"26aa":62837,"26ab":62836,"26b0":61317,"26b1":61319,"26bd":51015,"26be":51016,"26c4":4983,"26c5":4963,"26c8":4964,"26ce":62714,"26cf":61257,"26d1":61112,"26d3":61275,"26d4":62658,"26e9":4820,"26ea":4816,"26f0":4781,"26f1":4979,"26f2":4822,"26f3":51034,"26f4":4892,"26f5":4888,"26f7":1561,"26f8":51035,"26f9-200d-2640":1577,"26f9-200d-2642":1576,"26f9":1575,"26fa":4823,"26fd":4881,"270a":1324,"270b":1306,"270c":1311,"270d":1334,"270f":61219,"271d":62696,"274c":62766,"274e":62767,"27a1":62671,"27b0":62768,"27bf":62769,"2b05":62675,"2b06":62669,"2b07":62673,"2b1b":62845,"2b1c":62846,"2b50":4958,"2b55":62762,"303d":62770,"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":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":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,"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,"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":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},LatinizeMap:{"Á":"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"},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"],MediaSizes:d(37).b};t.a.Config=a,e.a=a},135:function(f,e,d){"use strict";var t=d(29),a=d(66),s=d(43),c=d(15),n=d(65),i=d(32);const r=new class{constructor(){this.log=Object(s.b)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),n.a.delete("xt_instance"))},this.deactivateInstance=()=>{if(this.masterInstance||this.deactivated)return!1;this.log("deactivate"),this.deactivateTimeout=0,this.deactivated=!0,this.clearInstance(),c.default.idle.deactivated=!0,c.default.dispatchEvent("instance_deactivated")},this.checkInstance=(f=c.default.idle&&c.default.idle.isIDLE)=>{if(this.deactivated)return!1;const e=Date.now(),d={id:this.instanceID,idle:f,time:e};n.a.get("xt_instance",!1).then(t=>{!f||!t||t.id===this.instanceID||t.time{const e=f.data.payload;if(0===e.fileName.indexOf("main-")){const f=this.convertPromises[e.fileName];f&&(e.bytes?f.resolve(e.bytes):f.reject(),delete this.convertPromises[e.fileName])}else c.a.postMessage(f.data)})}postMessage(f){this.init&&(this.init(),this.init=null),this.worker.postMessage(f)}convert(f,e){if(f="main-"+f,this.convertPromises.hasOwnProperty(f))return this.convertPromises[f];const d=Object(s.a)();return this.postMessage({type:"convertWebp",payload:{fileName:f,bytes:e}}),this.convertPromises[f]=d}};a.a.webpWorkerController=n;e.a=n},16:function(f,e,d){"use strict";d.r(e),d.d(e,"langPack",(function(){return o})),d.d(e,"I18n",(function(){return b})),d.d(e,"i18n",(function(){return l})),d.d(e,"i18n_",(function(){return h})),d.d(e,"_i18n",(function(){return g})),d.d(e,"joinElementsWith",(function(){return p})),d.d(e,"join",(function(){return m}));var t=d(29),a=d(34),s=d(77),c=d(32),n=d(80),i=d(8),r=d(15),u=d(31);const o={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.in_ok":"ChatList.Service.Call.incoming","messageActionPhoneCall.out_ok":"ChatList.Service.Call.outgoing","messageActionPhoneCall.in_missed":"ChatList.Service.Call.Missed","messageActionPhoneCall.out_missed":"ChatList.Service.Call.Cancelled","messageActionGroupCall.started":"ActionGroupCallJustStarted","messageActionGroupCall.started_by":"ActionGroupCallStarted","messageActionGroupCall.started_byYou":"ActionGroupCallStartedByYou","messageActionGroupCall.ended":"ActionGroupCallEnded","messageActionGroupCall.ended_by":"Chat.Service.VoiceChatFinished","messageActionGroupCall.ended_byYou":"Chat.Service.VoiceChatFinishedYou",messageActionBotAllowed:"Chat.Service.BotPermissionAllowed"};var b;!function(f){let e,o;function b(){const e=i.a.langPackCode;return f.lastRequestedLangCode=e,Promise.all([d.e(7).then(d.bind(null,137)),d.e(8).then(d.bind(null,138)),d.e(24).then(d.bind(null,146))]).then(([f,d,t])=>{const a=[];h(f.default,a),h(d.default,a);return p({_:"langPackDifference",from_version:0,lang_code:e,strings:a,version:0,local:!0,countries:t.default})})}function l(e){return f.requestedServerLanguage=!0,Promise.all([c.a.invokeApiCacheable("langpack.getLangPack",{lang_code:e,lang_pack:i.a.langPack}),c.a.invokeApiCacheable("langpack.getLangPack",{lang_code:e,lang_pack:"android"}),d.e(7).then(d.bind(null,137)),d.e(8).then(d.bind(null,138)),c.a.invokeApiCacheable("help.getCountriesList",{lang_code:e,hash:0}),f.polyfillPromise])}function h(f,e=[]){for(const d in f){const t=f[d];"string"==typeof t?e.push({_:"langPackString",key:d,value:t}):e.push(Object.assign({_:"langPackStringPluralized",key:d},t))}return e}function g(e){return f.lastRequestedLangCode=e,l(e).then(([f,e,d,t,a,s])=>{let c=[];[d,t].forEach(f=>{h(f.default,c)}),c=c.concat(f.strings);for(const f of e.strings)c.push(f);return f.strings=c,f.countries=a,p(f)})}function p(f){return f.appVersion=i.a.langPackVersion,n.a.set({langPack:f}).then(()=>(m(f),f))}function m(d){if(d.lang_code!==f.lastRequestedLangCode)return;try{e=new Intl.PluralRules(d.lang_code)}catch(f){console.error("pluralRules error",f),e=new Intl.PluralRules(d.lang_code.split("-",1)[0])}f.strings.clear();for(const e of d.strings)f.strings.set(e.key,e);d.countries&&(f.countriesList.length=0,f.countriesList.push(...d.countries.countries),d.countries.countries.forEach(e=>{if(e.name){const d=e.default_name;f.strings.set(d,{_:"langPackString",key:d,value:e.name})}})),f.lastAppliedLangCode!==d.lang_code&&(r.default.dispatchEvent("language_change",d.lang_code),f.lastAppliedLangCode=d.lang_code);Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d&&d.update()})}function k(f,e,d={i:0}){let t=[];let a=0;return f.replace(/(\*\*)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,(f,s,c,n,i,r,o)=>{if(t.push(o.slice(a,r)),s)switch(s){case"**":{const f=document.createElement("b");f.append(...k(c,e,d)),t.push(f);break}}else if(n)t.push(document.createElement("br"));else if(i){const f=document.createElement("a"),a=i.lastIndexOf("]"),s=i.slice(1,a);f.append(...k(s,e,d));const c=i.slice(a+2,i.length-1);if(c){const e=u.b.wrapUrl(c);f.href=e.url,e.onclick&&f.setAttribute("onclick",e.onclick),f.target="_blank"}t.push(f)}else if(e){const f=e[d.i++];Array.isArray(f)?t.push(...f):t.push(f)}return a=r+f.length,""}),a!==f.length&&t.push(f.slice(a)),t}function y(d,t=!1,a){const s=f.strings.get(d);let c;if(s)if("langPackStringPluralized"===s._&&(null==a?void 0:a.length)){let f=a[0];"string"==typeof f&&(f=+f.replace(/\D/g,""));c=s[e.select(f)+"_value"]||s.other_value}else c="langPackString"===s._?s.value:d;else c=d;if(t){if(null==a?void 0:a.length){const f=/un\d|%\d\$.|%./g;let e=0;c=c.replace(f,(f,d,t)=>""+a[e++])}return c}return k(c,a)}f.strings=new Map,f.countriesList=[],f.requestedServerLanguage=!1,f.getCacheLangPack=function(){return o||(o=Promise.all([n.a.get("langPack"),f.polyfillPromise]).then(([e])=>e?(t.b,f.lastRequestedLangCode||(f.lastRequestedLangCode=e.lang_code),m(e),e):b()).finally(()=>{o=void 0}))},f.setTimeFormat=function(e){const d=!!f.timeFormat&&f.timeFormat!==e;if(f.timeFormat=e,d){Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d instanceof A&&d.update()})}},f.loadLocalLangPack=b,f.loadLangPack=l,f.getStrings=function(f,e){return c.a.invokeApi("langpack.getStrings",{lang_pack:i.a.langPack,lang_code:f,keys:e})},f.formatLocalStrings=h,f.getLangPack=g,f.saveLangPack=p,f.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():d.e(28).then(d.bind(null,147)).then(f=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},f.default)}),f.applyLangPack=m,f.superFormatter=k,f.format=y,f.weakMap=new WeakMap;class v{constructor(e){this.property="innerHTML",this.element=e.element||document.createElement("span"),this.element.classList.add("i18n"),this.update(e),f.weakMap.set(this.element,this)}}class w extends v{update(f){if(Object(a.g)(this,f),"innerHTML"===this.property)this.element.textContent="",this.element.append(...y(this.key,!1,this.args));else{const f=this.element[this.property],e=y(this.key,!0,this.args);void 0===f?this.element.dataset[this.property]=e:this.element[this.property]=e}}}f.IntlElement=w;class A extends v{update(e){Object(a.g)(this,e);const d=new Intl.DateTimeFormat(f.lastRequestedLangCode+"-u-hc-"+f.timeFormat,this.options);this.element[this.property]=Object(s.a)(d.format(this.date))}}f.IntlDateElement=A,f.i18n=function(f,e){return new w({key:f,args:e}).element},f.i18n_=function(f){return new w(f).element},f._i18n=function(f,e,d,t){return new w({element:f,key:e,args:d,property:t}).element}}(b||(b={})),e.default=b;const l=b.i18n,h=b.i18n_,g=b._i18n;function p(f,e){const d=f.slice(0,1);for(let t=1;tl(f&&e?"WordDelimiterLast":"WordDelimiter"))}t.a.I18n=b},24:function(f,e,d){"use strict";d.r(e),d.d(e,"TelegramMeWebManager",(function(){return i}));var t=d(8),a=d(29),s=d(76),c=d(55),n=d(65);class i{constructor(){this.disabled=s.a.test||-1===t.a.domains.indexOf(location.hostname)}setAuthorized(f){if(!this.disabled)return n.a.get("tgme_sync").then(e=>{const d=Object(c.g)(!0);if(f&&e&&e.canRedirect===f&&e.ts+86400>d)return;n.a.set({tgme_sync:{canRedirect:f,ts:d}});const a=`_websync_?authed=${f?"1":"0"}&version=${encodeURIComponent(t.a.version+" "+t.a.suffix)}`,s=["//telegram.me/"+a,"//t.me/"+a].map(f=>{const e=document.createElement("script"),d=new Promise(f=>{e.onload=e.onerror=()=>{e.remove(),f()}});return e.src=f,document.body.appendChild(e),d});return Promise.all(s)})}}const r=new i;a.a&&(a.a.telegramMeWebManager=r),e.default=r},26:function(f,e,d){"use strict";d.r(e),d.d(e,"WebPushApiManager",(function(){return o}));var t=d(29),a=d(34),s=d(43),c=d(15),n=d(32),i=d(16),r=d(0),u=d(128);class o{constructor(){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=Object(s.b)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then(f=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",f)}).catch(f=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",f),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))})})},this.isAliveNotify=()=>{if(!this.isAvailable||c.default.idle&&c.default.idle.deactivated)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"")+"#/im";const f={},e={push_action_mute1d:r.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:r.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const d in e)f[d]=i.default.format(e[d],!0);const d={type:"ping",payload:{localNotifications:this.localNotificationsAvailable,lang:f,settings:this.settings}};n.a.postSWMessage(d),this.isAliveTO=setTimeout(this.isAliveNotify,1e4)},"PushManager"in window&&"Notification"in window&&"serviceWorker"in navigator||(this.log.warn("Push messaging is not supported."),this.isAvailable=!1,this.localNotificationsAvailable=!1),this.isAvailable&&"denied"===Notification.permission&&this.log.warn("The user has blocked notifications.")}start(){this.started||(this.started=!0,this.getSubscription(),this.setUpServiceWorkerChannel())}setLocalNotificationsDisabled(){this.localNotificationsAvailable=!1}getSubscription(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.isPushEnabled=!!f,this.pushSubscriptionNotify("init",f)}).catch(f=>{this.log.error("Error during getSubscription()",f)})})}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.isPushEnabled=!1,f&&(this.pushSubscriptionNotify("unsubscribe",f),setTimeout(()=>{f.unsubscribe().then(f=>{this.isPushEnabled=!1}).catch(f=>{this.log.error("Unsubscription error: ",f)})},3e3))}).catch(f=>{this.log.error("Error thrown while unsubscribing from push messaging.",f)})})}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.log.warn("force unsubscribe",f),f&&f.unsubscribe().then(f=>{this.log.warn("force unsubscribe successful",f),this.isPushEnabled=!1}).catch(f=>{this.log.error("Unsubscription error: ",f)})}).catch(f=>{this.log.error("Error thrown while unsubscribing from push messaging.",f)})})}setSettings(f){this.settings=Object(a.a)(f),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){if(!this.isAvailable)return;n.a.postSWMessage({type:"notifications_clear"})}setUpServiceWorkerChannel(){this.isAvailable&&(n.a.addServiceWorkerTaskListener("push_click",f=>{c.default.idle&&c.default.idle.deactivated?u.a.reload():c.default.dispatchEvent("push_notification_click",f.payload)}),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(f,e){if(e){const d=e.toJSON();if(!(d&&d.endpoint&&d.keys&&d.keys.p256dh&&d.keys.auth))return this.log.warn("Invalid push subscription",d),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(f);this.log.warn("Push",f,d),c.default.dispatchEvent("push_"+f,{tokenType:10,tokenValue:JSON.stringify(d)})}else this.log.warn("Push",f,!1),c.default.dispatchEvent("push_"+f,!1)}}const b=new o;t.a&&(t.a.webPushApiManager=b),e.default=b},31:function(f,e,d){"use strict";d.d(e,"a",(function(){return w}));var t=d(129);var a=d(91),s=d(77),c=d(0),n=d(29),i=d(10);const r={emojiMap:f=>f,shortcuts:[],emojis:[]},u=t.a.Emoji,o="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",b="["+o+"0-9]",l="((?:https?|ftp)://|mailto:)?(?:"+b+"{1,64}(?::"+b+"{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}|"+b+"["+o+"·0-9-]{0,64}(?:\\."+b+"["+o+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+o+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",h=(new RegExp("^"+"((?:https?|ftp)://|mailto:)?".slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),g=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+l+")|(\\n)|(((?:👨🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👨🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👨🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👨🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👨🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👩🏻‍🤝‍👩\ud83c[\udffc-\udfff]|👩🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👩🏼‍🤝‍👩\ud83c[\udffb\udffd-\udfff]|👩🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👩🏽‍🤝‍👩\ud83c[\udffb\udffc\udffe\udfff]|👩🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👩🏾‍🤝‍👩\ud83c[\udffb-\udffd\udfff]|👩🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏿‍🤝‍👩\ud83c[\udffb-\udffe]|🧑🏻‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏼‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏽‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏾‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏿‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑‍🤝‍🧑|👫\ud83c[\udffb-\udfff]|👬\ud83c[\udffb-\udfff]|👭\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d])|(?:\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\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?‍[♀♂]️?|(?:👨‍❤️?‍💋‍👨|👨‍👨‍👦‍👦|👨‍👨‍👧‍\ud83d[\udc66\udc67]|👨‍👩‍👦‍👦|👨‍👩‍👧‍\ud83d[\udc66\udc67]|👩‍❤️?‍💋‍\ud83d[\udc68\udc69]|👩‍👩‍👦‍👦|👩‍👩‍👧‍\ud83d[\udc66\udc67]|👨‍❤️?‍👨|👨‍👦‍👦|👨‍👧‍\ud83d[\udc66\udc67]|👨‍👨‍\ud83d[\udc66\udc67]|👨‍👩‍\ud83d[\udc66\udc67]|👩‍❤️?‍\ud83d[\udc68\udc69]|👩‍👦‍👦|👩‍👧‍\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]|[✊✋]))(?:\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-\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\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[⏩-⏬⏰⏳♾⛎✅✨❌❎❓-❕➕-➗➰➿])|️))|(^|[\\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"),p=/^(([^<>()[\]\\.,;:\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,}))$/,m=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,k={Telegram:"tg://search_hashtag?hashtag={1}",Twitter:"https://twitter.com/hashtag/{1}",Instagram:"https://instagram.com/explore/tags/{1}/","Google Plus":"https://plus.google.com/explore/{1}"},y={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline"},v=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(let f in y)v.add(y[f]);var w;!function(f){function e(f){let e=Object(a.b)(f).replace(/-?fe0f/g,"");return u.hasOwnProperty(e)?e:null}function d(f){let d,a=f;const s=[];let c,n=0;for(g.lastIndex=0;d=a.match(g);){if(c=n+d.index,d[3])s.push({_:"messageEntityMention",offset:c+d[1].length,length:d[2].length+d[3].length});else if(d[4])if(p.test(d[4]))s.push({_:"messageEntityEmail",offset:c,length:d[4].length});else{let f,e=d[5];const a=d[6];if(a){if(e||"xn--"!==a.substr(0,4)&&-1===t.a.TLD.indexOf(a.toLowerCase())||(e="http://"),e){const t=A(d[4]);t.length!==d[4].length&&(d[4]=t),f=(d[5]?"":e)+d[4]}}else f=(d[5]?"":"http://")+d[4];f&&s.push({_:"messageEntityUrl",offset:c,length:d[4].length})}else if(d[7])s.push({_:"messageEntityLinebreak",offset:c,length:1});else if(d[8]){const f=e(d[8]);f&&s.push({_:"messageEntityEmoji",offset:c,length:d[8].length,unicode:f})}else d[11]?s.push({_:"messageEntityHashtag",offset:c+(d[10]?d[10].length:0),length:d[11].length}):d[13]&&s.push({_:"messageEntityBotCommand",offset:c+(d[11]?d[11].length:0)+(d[12]?d[12].length:0),length:1+d[13].length+(d[14]?1+d[14].length:0),unsafe:!0});a=a.substr(d.index+d[0].length),n+=d.index+d[0].length}return s}function n(f,e){return f.find(f=>{if(!(e._===f._||!v.has(e._)&&!v.has(f._)))return!1;return e.offset>=f.offset&&e.length+e.offset<=f.length+f.offset})}function o(f,e){const d=e.filter(e=>!n(f,e));if(f.push(...d),f.sort((f,e)=>f.offset-e.offset),!i.a)for(let e=0;et!==e&&f._===d._&&f.offset-d.length===d.offset),-1!==t){const e=f[t];d.length+=e.length,f.splice(t,1)}}while(-1!==t)}}function w(f,e={}){if(!f)return"";const t=[],a=e.entities||d(f),n=e.passEntities||{},r=e.contextSite||"Telegram",u="Telegram"!==r,o=(f,e,d)=>{t.push({part:e,offset:f.offset}),d&&t.push({part:d,offset:f.offset+f.length})},b=[];for(let d=0,t=a.length;d',""):o(t,"",""));break;case"messageEntityItalic":e.noTextFormat||(e.wrappingDraft?o(t,'',""):o(t,"",""));break;case"messageEntityStrike":if(e.wrappingDraft){o(t,``,"")}else o(t,"","");break;case"messageEntityUnderline":if(e.wrappingDraft){o(t,``,"")}else o(t,"","");break;case"messageEntityCode":e.wrappingDraft?o(t,'',""):o(t,"","");break;case"messageEntityPre":e.noTextFormat||o(t,`
`,"
");break;case"messageEntityHighlight":o(t,'',"");break;case"messageEntityBotCommand":if(!e.noLinks&&n[t._]){let d,a,c=f.substr(t.offset,t.length).substr(1);-1!==(a=c.indexOf("@"))?(d=c.substr(a+1),c=c.substr(0,a)):d=e.fromBot,o(t,``,"")}break;case"messageEntityEmoji":i.a?e.wrappingDraft||o(t,'',""):o(t,``,'');break;case"messageEntityCaret":{const f='';b.push({part:f,offset:t.offset});break}case"messageEntityUrl":case"messageEntityTextUrl":if(!e.noLinks||n[t._]){const c=f.substr(t.offset,t.length);let n,i=t.url||c,r=!1;const u=C(i,!0);if(i=u.url,n=u.onclick,"messageEntityTextUrl"===t._){const f=a[d+1];"messageEntityUrl"===(null==f?void 0:f._)&&f.length===t.length&&f.offset===t.offset&&d++,i!==c&&(r=!0)}const b=!!n;n||!r||b||(n="showMaskedAlert"),e.wrappingDraft&&(n=void 0);o(t,``,"")}break;case"messageEntityEmail":if(!e.noLinks){const e=f.substr(t.offset,t.length);o(t,``,"")}break;case"messageEntityHashtag":{const d=!e.noLinks&&k[r];if(d){const e=f.substr(t.offset,t.length).substr(1);o(t,``,"")}break}case"messageEntityMentionName":e.noLinks&&!n[t._]||o(t,`");break;case"messageEntityMention":if(!e.noLinks){const e=f.substr(t.offset,t.length).substr(1),{url:d,onclick:a}=C("t.me/"+e);o(t,``,"")}}}t.sort((f,e)=>f.offset-e.offset);let l=t.length,h=b.length;for(let f=0;f=e.offset););t.splice(d,0,e)}l+=h;const g=[];let p=0;for(let e=0;ep&&(g.push(Object(s.d)(f.slice(p,a))),p=a),g.push(d)}return pd&&")"===f.charAt(e-1);)f=f.substr(0,e-1),t--,e--;return d>t&&(f=f.replace(/\)+$/,"")),f}function E(f,e=!1){if(!f)return"";return w(f,{entities:d(f).filter(f=>"messageEntityEmoji"===f._),wrappingDraft:e})}function C(f,e){let d,t,a,s;if(S(f)||(f="https://"+f),d=f.match(/^(?:https?:\/\/)?t(?:elegram)?\.me\/(.+)/)){const e=d[1];if(/^\W/.test(e))return s="joinchat",{url:f,onclick:s};const t=e.split("/");switch(t[0]){case"joinchat":case"addstickers":s=t[0];break;default:if(t[1]&&t[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===t.length){s="im";break}}}else(t=f.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?s="im":(a=f.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(s="tg_"+a[1],window[s]||(s=void 0));return{url:f,onclick:s}}function S(f){return f?f.match(h):null}function T(f){return{_:"messageEntityEmoji",offset:0,length:f.length,unicode:Object(a.e)(f).join("-").replace(/-?fe0f/g,"")}}f.getEmojiSpritesheetCoords=e,f.parseEntities=d,f.parseMarkdown=function(f,e,d){const t=[];let a=!1;const s=f=>n(e,f)?a=!1:(t.push(f),a=!0),c=[];let i,r=0;for(;i=f.match(m);){const e=r+i.index;c.push(f.substr(0,i.index));const d=i[3]||i[8]||i[11]||i[13];let t;if(r-=d.length,r+=d.length,a=!1,d.match(/^`*$/))c.push(i[0]);else if(i[3])t={_:"messageEntityPre",language:"",offset:e+i[1].length,length:d.length},s(t)&&("\n"===i[5]&&(i[5]="",r-=1),c.push(i[1]+d+i[5]),r-=i[2].length+i[4].length);else if(i[7]){const f=""===i[6];t={_:y[i[7]],offset:e+(f?0:i[6].length),length:d.length},s(t)&&(f?c.push(d):c.push(i[6]+d+i[9]),r-=2*i[7].length+(f?2:0))}else i[11]?(t={_:"messageEntityMentionName",user_id:i[10].toUserId(),offset:e,length:d.length},s(t)&&(c.push(d),r-=i[0].length-d.length)):i[12]&&(t={_:"messageEntityTextUrl",url:i[14],offset:e,length:d.length},s(t)&&(c.push(d),r-=i[12].length-d.length));a||c.push(i[0]),f=f.substr(i.index+i[0].length),r+=i.index+i[0].length}c.push(f);let u=c.join("");u.replace(/\s+/g,"").length||(u=f,t.splice(0,t.length)),t.length||d||(u=u.trim()),o(e,t),b(e);let l=u.length;if(!d){u=u.replace(/^\s*/,"");let f=l-u.length;f&&e.forEach(e=>{e.offset=Math.max(0,e.offset-f)}),u=u.replace(/\s*$/,""),f=l-u.length,l=u.length,f&&e.forEach(f=>{f.offset+f.length>l&&(f.length=l-f.offset)})}return u},f.findConflictingEntity=n,f.mergeEntities=o,f.combineSameEntities=b,f.wrapRichText=w,f.fixEmoji=function(f,e){return f=f.replace(/[\u2640\u2642\u2764](?!\ufe0f)/g,(f,d,t)=>{if(e){const t=f.length;d+=t,e.forEach(f=>{const e=f.offset+f.length;e===d?f.length+=t:e>d&&(f.offset+=t)})}return f+"️"})},f.wrapDraftText=function(f,e={}){return f?w(f,{entities:e.entities,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}):""},f.checkBrackets=A,f.replaceUrlEncodings=function(f){return f.replace(/(%[A-Z\d]{2})+/g,f=>{try{return decodeURIComponent(f)}catch(e){return f}})},f.wrapPlainText=function(f){if(i.a)return f;if(!f||!f.length)return"";var e,d=f=f.replace(/\ufe0f/g,"");const t=[];let a;for(g.lastIndex=0;e=d.match(g);){if(t.push(d.substr(0,e.index)),e[8]){const f=r.emojiMap[e[8]];f&&(a=u[f][1][0])?t.push(":"+a+":"):t.push(e[0])}else t.push(e[0]);d=d.substr(e.index+e[0].length)}return t.push(d),t.join("")},f.wrapEmojiText=E,f.wrapUrl=C,f.matchUrlProtocol=S,f.matchUrl=function(f){return f?f.match(l):null},f.matchEmail=function(f){return f?f.match(p):null},f.getAbbreviation=function(f,e=!1){const d=f.trim().split(" ");if(!d[0])return"";const t=[...d[0]][0];return e||1===d.length?E(t):E(t+[...d[d.length-1]][0])},f.isUsernameValid=function(f){return(f.length>=5&&f.length<=32||!f.length)&&/^[a-zA-Z0-9_]*$/.test(f)},f.getEmojiEntityFromEmoji=T,f.wrapSingleEmoji=function(f){return w(f,{entities:[T(f)]})}}(w||(w={})),n.a.RichTextProcessor=w;e.b=w},32:function(f,e,d){"use strict";function t(){return new Worker(d.p+"mtproto.worker.e3c0dc69d0f5dd450f72.bundle.worker.js")}var a=d(34);var s=d(43),c=d(15),n=d(143),i=d(29),r=d(76),u=d(56);class o extends u.a{constructor(f,e,d){super(),this.dcId=f,this.url=e,this.debug=r.a.debug&&!1,this.handleOpen=()=>{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=f=>{this.log.error("handleError",f),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=f=>{this.debug&&this.log.debug("<-","handleMessage",f.data.byteLength),this.dispatchEvent("message",f.data)},this.send=f=>{this.debug&&this.log.debug("-> body length to send:",f.length),this.ws.send(f)};let t=s.a.Error|s.a.Log;return this.debug&&(t|=s.a.Debug),this.log=Object(s.b)("WS-"+f+d,t),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(f){}this.handleClose()}}}var b=d(135),l=d(65),h=d(26),g=d(98),p=d(128),m=d(24),k=d(81),y=d(117);const v=new class extends class{invokeCrypto(f,...e){return this.performTaskWorker(f,...e)}}{constructor(){super(),this.afterMessageIdTemp=0,this.taskId=0,this.awaiting={},this.pending=[],this.updatesProcessor=null,this.log=Object(s.b)("API-PROXY"),this.hashes={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.isSWRegistered=!0,this.debug=i.b,this.sockets=new Map,this.taskListeners={},this.taskListenersSW={},this.postMessagesWaiting=[],this.onWorkerMessage=f=>{const e=f.data;if(!Object(a.f)(e))return;const d=this.taskListeners[e.type];d?d(e):e.update?this.updatesProcessor&&this.updatesProcessor(e.update):e.progress?c.default.dispatchEvent("download_progress",e.progress):(e.hasOwnProperty("result")||e.hasOwnProperty("error"))&&this.finalizeTask(e.taskId,e.result,e.error)},this.log("constructor"),b.a.start(),this.registerServiceWorker(),this.addTaskListener("clear",()=>{Promise.all([g.a.toggleStorage(!1),l.a.clear(),Promise.race([m.default.setAuthorized(!1),Object(k.a)(3e3)]),h.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map(f=>caches.delete(f)))]).finally(()=>{p.a.reload()})}),this.addTaskListener("connectionStatusChange",f=>{c.default.dispatchEvent("connection_status_change",f.payload)}),this.addTaskListener("convertWebp",f=>{n.a.postMessage(f)}),this.addTaskListener("socketProxy",f=>{const e=f.payload,d=e.id;if("send"===e.type){this.sockets.get(d).send(e.payload)}else if("close"===e.type){this.sockets.get(d).close()}else if("setup"===e.type){const f=new o(e.payload.dcId,e.payload.url,e.payload.logSuffix),t=()=>{this.postMessage({type:"socketProxy",payload:{type:"open",id:d}})},a=()=>{this.postMessage({type:"socketProxy",payload:{type:"close",id:d}}),f.removeEventListener("open",t),f.removeEventListener("close",a),f.removeEventListener("message",s),this.sockets.delete(d)},s=f=>{this.postMessage({type:"socketProxy",payload:{type:"message",id:d,payload:f}})};f.addEventListener("open",t),f.addEventListener("close",a),f.addEventListener("message",s),this.sockets.set(d,f)}}),this.addTaskListener("localStorageProxy",f=>{const e=f.payload;l.a[e.type](...e.args).then(e=>{this.postMessage({type:"localStorageProxy",id:f.id,payload:e})})}),c.default.addEventListener("language_change",f=>{this.performTaskWorkerVoid("setLanguage",f)}),window.addEventListener("online",f=>{this.forceReconnectTimeout()}),this.registerWorker(),setTimeout(()=>{this.getConfig()},5e3)}isServiceWorkerOnline(){return this.isSWRegistered}registerServiceWorker(){if(!("serviceWorker"in navigator))return;const f=navigator.serviceWorker;f.register("./sw.js",{scope:"./"}).then(f=>{this.log("SW registered",f),this.isSWRegistered=!0;(f.installing||f.waiting||f.active).addEventListener("statechange",f=>{this.log("SW statechange",f)})},f=>{this.isSWRegistered=!1,this.log.error("SW registration failed!",f),this.onServiceWorkerFail&&this.onServiceWorkerFail()}),f.addEventListener("controllerchange",()=>{this.log.warn("controllerchange"),this.releasePending(),f.controller.addEventListener("error",f=>{this.log.error("controller error:",f)})}),f.addEventListener("message",f=>{const e=f.data;if(!Object(a.f)(e))return;const d=this.taskListenersSW[e.type];d&&d(e)}),this.addServiceWorkerTaskListener("requestFilePart",f=>{const e={type:f.type,id:f.id};this.performTaskWorker("requestFilePart",...f.payload).then(f=>{e.payload=f,this.postSWMessage(e)},d=>{e.originalPayload=f.payload,e.error=d,this.postSWMessage(e)})}),f.addEventListener("messageerror",f=>{this.log.error("SW messageerror:",f)})}postMessage(...f){this.postMessagesWaiting.push(f)}postSWMessage(f){navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage(f)}onWorkerFirstMessage(f){if(!this.worker){this.worker=f,this.log("set webWorker"),this.postMessage=this.worker.postMessage.bind(this.worker),this.postMessagesWaiting.forEach(f=>this.postMessage(...f)),this.postMessagesWaiting.length=0;const e=y.a;this.log("WebP supported:",e),this.postMessage({type:"webpSupport",payload:e}),this.postMessage({type:"userAgent",payload:navigator.userAgent}),this.releasePending()}}addTaskListener(f,e){this.taskListeners[f]=e}addServiceWorkerTaskListener(f,e){this.taskListenersSW[f]=e}registerWorker(){const f=new t;f.addEventListener("message",this.onWorkerFirstMessage.bind(this,f),{once:!0}),f.addEventListener("message",this.onWorkerMessage),f.addEventListener("error",f=>{this.log.error("WORKER ERROR",f)})}finalizeTask(f,e,d){const t=this.awaiting[f];void 0!==t&&(this.debug&&this.log.debug("done",t.taskName,e,d),d?t.reject(d):t.resolve(e),delete this.awaiting[f])}performTaskWorkerVoid(f,...e){const d={task:f,taskId:this.taskId,args:e};this.pending.push(d),this.releasePending(),this.taskId++}performTaskWorker(f,...e){return this.debug&&this.log.debug("start",f,e),new Promise((d,t)=>{this.awaiting[this.taskId]={resolve:d,reject:t,taskName:f},this.performTaskWorkerVoid(f,...e)})}releasePending(){this.postMessage&&(this.debug&&this.log.debug("releasing tasks, length:",this.pending.length),this.pending.forEach(f=>{this.postMessage(f)}),this.debug&&this.log.debug("released tasks"),this.pending.length=0)}setUpdatesProcessor(f){this.updatesProcessor=f}invokeApi(f,e={},d={}){return this.performTaskWorker("invokeApi",f,e,d)}invokeApiAfter(f,e={},d={}){let t=d;return t.prepareTempMessageId=""+ ++this.afterMessageIdTemp,t=Object.assign({},d),d.messageId=t.prepareTempMessageId,this.invokeApi(f,e,t)}invokeApiHashable(f,e={},d={}){const t=JSON.stringify(e);let a;return this.hashes[f]&&(a=this.hashes[f][t],a&&(e.hash=a.hash)),this.invokeApi(f,e,d).then(e=>{if(e._.includes("NotModified"))return this.debug&&this.log.warn("NotModified saved!",f,t),a.result;if(e.hash){const d=e.hash;this.hashes[f]||(this.hashes[f]={}),this.hashes[f][t]={hash:d,result:e}}return e})}invokeApiSingle(f,e={},d={}){const t=f+"-"+JSON.stringify(e);return this.apiPromisesSingle[t]?this.apiPromisesSingle[t]:this.apiPromisesSingle[t]=this.invokeApi(f,e,d).finally(()=>{delete this.apiPromisesSingle[t]})}invokeApiCacheable(f,e={},d={}){var t;const a=null!==(t=this.apiPromisesCacheable[f])&&void 0!==t?t:this.apiPromisesCacheable[f]={},s=JSON.stringify(e),c=a[s];if(c&&(!d.override||!c.fulfilled))return c.promise;let n;d.override&&(c&&c.timeout&&(clearTimeout(c.timeout),delete c.timeout),delete d.override),d.cacheSeconds&&(n=window.setTimeout(()=>{delete a[s]},1e3*d.cacheSeconds),delete d.cacheSeconds);const i=this.invokeApi(f,e,d);return a[s]={timestamp:Date.now(),fulfilled:!1,timeout:n,promise:i,params:e},i}clearCache(f,e){const d=this.apiPromisesCacheable[f];if(d)for(const f in d){const t=d[f];e(t.params)&&(t.timeout&&clearTimeout(t.timeout),delete d[f])}}setBaseDcId(f){return this.performTaskWorker("setBaseDcId",f)}setQueueId(f){return this.performTaskWorker("setQueueId",f)}setUserAuth(f){return"string"!=typeof f&&"number"!=typeof f||(f={dcID:0,date:Date.now()/1e3|0,id:f.toPeerId(!1)}),c.default.dispatchEvent("user_auth",f),this.performTaskWorker("setUserAuth",f)}setUser(f){return this.setUserAuth(f.id)}getNetworker(f,e){return this.performTaskWorker("getNetworker",f,e)}logOut(){return this.performTaskWorker("logOut")}cancelDownload(f){return this.performTaskWorker("cancelDownload",f)}downloadFile(f){return this.performTaskWorker("downloadFile",f)}uploadFile(f){return this.performTaskWorker("uploadFile",f)}toggleStorage(f){const e={type:"toggleStorage",payload:f};this.postMessage(e),this.postSWMessage(e)}stopAll(){return this.performTaskWorkerVoid("stopAll")}startAll(){return this.performTaskWorkerVoid("startAll")}forceReconnectTimeout(){this.postMessage({type:"online"})}forceReconnect(){this.postMessage({type:"forceReconnect"})}getConfig(){return this.getConfigPromise?this.getConfigPromise:this.getConfigPromise=this.invokeApi("help.getConfig").then(f=>(c.default.config=f,f))}};i.a.apiManagerProxy=v;e.a=v},37:function(f,e,d){"use strict";d.d(e,"c",(function(){return i})),d.d(e,"a",(function(){return t}));var t,a=d(29),s=d(118),c=d(56);class n{constructor(f=0,e=f){this.width=f,this.height=e}aspect(f,e){return Object(s.a)(this.width,this.height,f.width,f.height,e)}aspectFitted(f){return this.aspect(f,!0)}aspectCovered(f){return this.aspect(f,!1)}}function i(f,e){return new n(f,e)}!function(f){f[f.mobile=0]="mobile",f[f.medium=1]="medium",f[f.large=2]="large"}(t||(t={}));class r extends c.a{constructor(){super(),this.screenSizes=[{key:t.mobile,value:600},{key:t.medium,value:1275},{key:t.large,value:1680}],this.sizes={handhelds:{regular:i(270,270),webpage:i(270,200),album:i(270,0),esgSticker:i(68,68),animatedSticker:i(180,180),staticSticker:i(180,180),emojiSticker:i(112,112),poll:i(240,0),round:i(200,200)},desktop:{regular:i(420,340),webpage:i(420,340),album:i(420,0),esgSticker:i(80,80),animatedSticker:i(200,200),staticSticker:i(200,200),emojiSticker:i(112,112),poll:i(330,0),round:i(280,280)}},this.isMobile=!1,this.handleResize=()=>{const f=window.innerWidth;let e=this.screenSizes[0].key;for(let d=this.screenSizes.length-1;d>=0;--d)if(this.screenSizes[d].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame(()=>{this.handleResize(),this.rAF=0})}),this.handleResize()}}const u=new r;a.a.mediaSizes=u,e.b=u},55:function(f,e,d){"use strict";d.d(e,"a",(function(){return i})),d.d(e,"c",(function(){return u})),d.d(e,"d",(function(){return o})),d.d(e,"e",(function(){return b})),d.d(e,"f",(function(){return l})),d.d(e,"g",(function(){return h})),d.d(e,"b",(function(){return w}));var t=d(29),a=d(16),s=d(77);const c=["January","February","March","April","May","June","July","August","September","October","November","December"],n=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],i=86400,r=f=>{const e=new Date(Date.UTC(f.getFullYear(),f.getMonth(),f.getDate())),d=e.getUTCDay()||7;e.setUTCDate(e.getUTCDate()+4-d);const t=new Date(Date.UTC(e.getUTCFullYear(),0,1));return Math.ceil(((e.getTime()-t.getTime())/i+1)/7)};function u(f){const e=new Date,d=e.getTime()/1e3|0,t=f.getTime()/1e3|0,s={};return d-t{const d=e.monthAsNumber?".":" ",t=("0"+f.getHours()).slice(-2)+":"+("0"+f.getMinutes()).slice(-2)+(e.noSeconds?"":":"+("0"+f.getSeconds()).slice(-2));return(e.leadingZero?("0"+f.getDate()).slice(-2):f.getDate())+d+(e.monthAsNumber?("0"+(f.getMonth()+1)).slice(-2):c[f.getMonth()])+d+f.getFullYear()+(e.noTime?"":", "+t)};function h(f){const e=Date.now();return f?e/1e3|0:e}const g=new RegExp("20[0-9]{1,2}"),p=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),m=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),k=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"),v=[31,29,31,30,31,30,31,31,30,31,30,31];function w(f,e){const d=f.trim().toLowerCase();if(d.length<3)return;if(0==="today".indexOf(d)){const f=new Date,d=f.getFullYear(),t=f.getMonth(),a=f.getDate();f.setFullYear(d,t,a),f.setHours(0,0,0);const s=f.getTime();f.setFullYear(d,t,a+1),f.setHours(0,0,0);const c=f.getTime()-1;return void e.push({title:"Today",minDate:s,maxDate:c})}if(0==="yesterday".indexOf(d)){const f=new Date,d=f.getFullYear(),t=f.getMonth(),a=f.getDate();f.setFullYear(d,t,a),f.setHours(0,0,0);const s=f.getTime()-864e5;f.setFullYear(d,t,a+1),f.setHours(0,0,0);const c=f.getTime()-86400001;return void e.push({title:"Yesterday",minDate:s,maxDate:c})}const t=function(f){const e=new Date;if(f.length<=3)return-1;for(let d=0;d<7;d++)if(e.setDate(e.getDate()+1),0===D(e.getTime()).toLowerCase().indexOf(f))return e.getDay();return-1}(d);if(t>=0){const f=new Date,d=f.getTime(),a=t-f.getDay();f.setDate(f.getDate()+a),f.getTime()>d&&f.setTime(f.getTime()-6048e5);const s=f.getFullYear(),c=f.getMonth(),n=f.getDate();f.setFullYear(s,c,n),f.setHours(0,0,0);const i=f.getTime();f.setFullYear(s,c,n+1),f.setHours(0,0,0);const r=f.getTime()-1;return void e.push({title:D(i),minDate:i,maxDate:r})}let a;if(null===(a=k.exec(d)))if(null===(a=y.exec(d)))if(null===(a=g.exec(d))){if(null!==(a=p.exec(d))){const f=a[1],d=a[2],t=L(f);if(t>=0){const f=+d;if(f>0&&f<=31){return void E(e,f-1,t)}if(f>=2013){return void A(e,t,f)}}}if(null!==(a=m.exec(d))){const f=a[1],d=L(a[2]);if(d>=0){const t=+f;if(t>0&&t<=31){return void E(e,t-1,d)}if(t>=2013){A(e,d,t)}}}}else{let f=+d;const t=(new Date).getFullYear();if(f<2013){f=2013;for(let d=t;d>=f;d--){const f=new Date;f.setFullYear(d,0,1),f.setHours(0,0,0);const t=f.getTime();f.setFullYear(d+1,0,1),f.setHours(0,0,0);const a=f.getTime()-1;e.push({title:""+d,minDate:t,maxDate:a})}}else if(f<=t){const d=new Date;d.setFullYear(f,0,1),d.setHours(0,0,0);const t=d.getTime();d.setFullYear(f+1,0,1),d.setHours(0,0,0);const a=d.getTime()-1;e.push({title:""+f,minDate:t,maxDate:a})}}else{const f=a[1],d=a[3],t=a[5];if(!a[2]===a[4])return;const s=parseInt(f),c=parseInt(d)-1;let n=parseInt(t);n>=10&&n<=99&&(n+=2e3);const i=(new Date).getFullYear();if(P(s-1,c)&&n>=2013&&n<=i){const f=new Date;f.setFullYear(n,c,s),f.setHours(0,0,0);const d=f.getTime();f.setFullYear(n,c,s+1),f.setHours(0,0,0);const t=f.getTime()-1;return void e.push({title:T(d),minDate:d,maxDate:t})}}else{const f=a[1],d=a[3],t=parseInt(f),s=parseInt(d);if(t>0&&t<=31){if(s>=2013&&t<=12){return void A(e,t-1,s)}if(s<=12){E(e,t-1,s-1)}}else if(t>=2013&&s<=12){A(e,s-1,t)}}}function A(f,e,d){const t=(new Date).getFullYear(),a=Date.now();if(d>=2013&&d<=t){const t=new Date;t.setFullYear(d,e,1),t.setHours(0,0,0);const s=t.getTime();if(s>a)return;t.setMonth(t.getMonth()+1);const c=t.getTime()-1;f.push({title:C(s),minDate:s,maxDate:c})}}function E(f,e,d){if(P(e,d)){const a=(new Date).getFullYear(),s=Date.now();for(let c=a;c>=2013;c--){if(1===d&&28===e&&(((t=c)%4!=0||t%100==0)&&t%400!=0))continue;const n=new Date;n.setFullYear(c,d,e+1),n.setHours(0,0,0);const i=n.getTime();if(i>s)continue;n.setFullYear(c,d,e+2),n.setHours(0,0,0);const r=n.getTime()-1;c===a?f.push({title:S(i),minDate:i,maxDate:r}):f.push({title:T(i),minDate:i,maxDate:r})}}var t}function C(f){const e=new Date(f);return c[e.getMonth()].slice(0,3)+" "+e.getFullYear()}function S(f){const e=new Date(f);return c[e.getMonth()].slice(0,3)+" "+e.getDate()}function T(f){const e=new Date(f);return("0"+e.getDate()).slice(-2)+"."+("0"+(e.getMonth()+1)).slice(-2)+"."+e.getFullYear()}function D(f){const e=new Date(f);return n[e.getDay()]}function P(f,e){return e>=0&&e<12&&f>=0&&fd&&(f=f.slice(0,e)+"..."),f}function a(f){return f.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}function s(f){return f.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,f=>"&#"+(1024*(f.charCodeAt(0)-55296)+(f.charCodeAt(1)-56320)+65536)+";").replace(/([^\#-~| |!])/g,f=>"&#"+f.charCodeAt(0)+";").replace(//g,">")}function c(f,e){if(f.length{let i=f.slice(t,n);const r=a++;if(i.length>e){c(i.slice(e),e).forEach(f=>{s[a++]=f}),i=i.slice(0,e)}t=n,d=0,s[r]=(s[r]||"")+i};let i=0;for(;;){let t=f.indexOf(" ",i);if(-1===t){i!==f.length-1&&n();break}t+=" ".length;const a=t-i;d+a>e&&n(d),i=t,d+=a}return s}function n(f){const e=f.replace("input","");return e[0].toLowerCase()+e.slice(1)}function i(f){return f="input"+(f=f[0].toUpperCase()+f.slice(1))}function r(f){return f.charAt(0).toUpperCase()+f.slice(1)}d.d(e,"f",(function(){return t})),d.d(e,"e",(function(){return a})),d.d(e,"d",(function(){return s})),d.d(e,"g",(function(){return c})),d.d(e,"b",(function(){return n})),d.d(e,"c",(function(){return i})),d.d(e,"a",(function(){return r}))},81:function(f,e,d){"use strict";d.d(e,"a",(function(){return t}));const t=f=>new Promise(e=>{setTimeout(e,f)})},91:function(f,e,d){"use strict";function t(f){return n(c(f)).join("-")}d.d(e,"b",(function(){return t})),d.d(e,"e",(function(){return n})),d.d(e,"d",(function(){return i})),d.d(e,"c",(function(){return r})),d.d(e,"a",(function(){return u}));const a=/\uFE0F/g,s=String.fromCharCode(8205),c=f=>f.indexOf(s)<0?f.replace(a,""):f;function n(f){const e=[];let d=0,t=0,a=0;for(;a55296&&d<=56319?t=d:e.push(d.toString(16));return e.length&&2===e[0].length&&(e[0]="00"+e[0]),e}function i(f){let e=f.match(/[\uDFFB-\uDFFF]/);return e?5-(57343-e[0].charCodeAt(0)):0}function r(f){return String.fromCharCode(55356,56741+f.charCodeAt(0),55356,56741+f.charCodeAt(1))}function u(f){return f.split("-").reduce((f,e)=>f+String.fromCodePoint(parseInt(e,16)),"")}}}]); -//# sourceMappingURL=1.3982babdf2d0e2fda6f3.chunk.js.map \ No newline at end of file diff --git a/public/1.3982babdf2d0e2fda6f3.chunk.js.map b/public/1.3982babdf2d0e2fda6f3.chunk.js.map deleted file mode 100644 index 688d55238..000000000 --- a/public/1.3982babdf2d0e2fda6f3.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/environment/webpSupport.ts","webpack:///./src/helpers/calcImageInBox.ts","webpack:///./src/lib/appManagers/appRuntimeManager.ts","webpack:///./src/lib/config.ts","webpack:///./src/lib/mtproto/singleInstance.ts","webpack:///./src/lib/webp/webp.worker.ts","webpack:///./src/lib/webp/webpWorkerController.ts","webpack:///./src/lib/langPack.ts","webpack:///./src/lib/mtproto/telegramMeWebManager.ts","webpack:///./src/lib/mtproto/webPushApiManager.ts","webpack:///./src/vendor/emoji/regex.ts","webpack:///./src/lib/richtextprocessor.ts","webpack:///./src/lib/mtproto/mtproto.worker.ts","webpack:///./src/lib/mtproto/transports/websocket.ts","webpack:///./src/lib/mtproto/mtprotoworker.ts","webpack:///./src/lib/crypto/crypto_methods.ts","webpack:///./src/helpers/mediaSizes.ts","webpack:///./src/helpers/date.ts","webpack:///./src/helpers/string.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/vendor/emoji/index.ts"],"names":["IS_WEBP_SUPPORTED","document","createElement","toDataURL","startsWith","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","appRuntimeManager","location","reload","e","window","close","focus","Config","Emoji","LatinizeMap","TLD","MediaSizes","singleInstance","log","clearInstance","this","masterInstance","deactivated","warn","delete","deactivateInstance","deactivateTimeout","idle","dispatchEvent","checkInstance","isIDLE","time","Date","now","newInstance","id","instanceID","get","then","curInstance","set","xt_instance","startAll","initial","clearTimeout","stopAll","setTimeout","started","reset","addEventListener","setInterval","documentElement","Worker_fn","Worker","webpWorkerController","convertPromises","worker","payload","data","fileName","indexOf","promise","bytes","resolve","reject","postMessage","init","hasOwnProperty","convertPromise","type","langPack","I18n","pluralRules","cacheLangPackPromise","loadLocalLangPack","defaultCode","langPackCode","lastRequestedLangCode","Promise","all","lang","langSign","countries","strings","formatLocalStrings","default","saveLangPack","_","from_version","lang_code","version","local","loadLangPack","langCode","requestedServerLanguage","invokeApiCacheable","lang_pack","hash","polyfillPromise","pushTo","i","v","push","key","value","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","forEach","l","concat","string","appVersion","langPackVersion","applyLangPack","Intl","PluralRules","err","console","error","split","clear","countriesList","length","country","name","langPackKey","default_name","lastAppliedLangCode","Array","from","querySelectorAll","element","instance","weakMap","update","superFormatter","input","args","indexHolder","out","lastIndex","replace","match","p1","p2","p3","p4","offset","slice","b","append","a","idx","lastIndexOf","text","url","wrappedUrl","wrapUrl","href","onclick","setAttribute","target","arg","isArray","format","plain","str","select","regExp","Map","getCacheLangPack","finally","undefined","setTimeFormat","haveToUpdate","timeFormat","IntlDateElement","getStrings","invokeApi","keys","_Intl","Object","assign","WeakMap","IntlElementBase","options","property","classList","add","IntlElement","textContent","formatted","dataset","dateTimeFormat","DateTimeFormat","date","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","arr","isLast","join","useLast","TelegramMeWebManager","disabled","test","domains","hostname","canRedirect","curValue","ts","tgme_sync","path","encodeURIComponent","suffix","promises","map","script","onload","onerror","remove","src","body","appendChild","telegramMeWebManager","WebPushApiManager","isAvailable","isPushEnabled","localNotificationsAvailable","settings","isFirefox","navigator","userAgent","toLowerCase","userVisibleOnly","subscribe","serviceWorker","ready","reg","pushManager","subscription","pushSubscriptionNotify","catch","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","task","localNotifications","postSWMessage","isAliveTO","getSubscription","setUpServiceWorkerChannel","unsubscribe","successful","newSettings","addServiceWorkerTaskListener","event","subscriptionObj","toJSON","endpoint","p256dh","auth","tokenType","tokenValue","JSON","stringify","webPushApiManager","EmojiHelper","emojiMap","code","shortcuts","emojis","emojiData","alphaCharsRegExp","urlAlphanumericRegExpPart","urlRegExp","urlProtocolRegExpPart","urlAnyProtocolRegExp","RegExp","fullRegExp","emailRegExp","markdownRegExp","siteHashtags","Telegram","Twitter","Instagram","markdownEntities","passConflictingEntities","Set","RichTextProcessor","getEmojiSpritesheetCoords","emojiCode","unified","parseEntities","raw","entities","matchIndex","rawOffset","index","protocol","tld","substr","balanced","checkBrackets","emojiCoords","unicode","unsafe","findConflictingEntity","currentEntities","newEntity","find","currentEntity","has","mergeEntities","newEntities","filtered","filter","sort","entity","nextEntity","combineSameEntities","nextEntityIdx","findIndex","_i","splice","wrapRichText","lol","passEntities","contextSite","contextExternal","insertPart","startPart","endPart","part","pushPartsAfterSort","noTextFormat","wrappingDraft","language","noLinks","bot","atPos","command","fromBot","html","entityText","masked","wrapped","currentContext","electronHelpers","contextUrl","hashtag","user_id","username","partsLength","partsAfterSortLength","insertAt","usedLength","urlLength","urlOpenBrackets","urlCloseBrackets","charAt","wrapEmojiText","isDraft","tgMeMatch","telescoPeMatch","tgMatch","matchUrlProtocol","fullPath","getEmojiEntityFromEmoji","emoji","parseMarkdown","noTrim","pushedEntity","pushEntity","newTextParts","isSOH","toUserId","newText","trim","diff","Math","max","fixEmoji","end","wrapDraftText","messageEntityTextUrl","messageEntityMentionName","replaceUrlEncodings","urlWithEncoded","decodeURIComponent","wrapPlainText","emojiTitle","matchUrl","matchEmail","getAbbreviation","onlyFirst","splitted","first","isUsernameValid","wrapSingleEmoji","dcId","logSuffix","super","debug","handleOpen","handleError","handleClose","removeListeners","handleMessage","byteLength","send","ws","logTypes","Error","Log","Debug","logger","connect","removeEventListener","WebSocket","binaryType","apiManagerProxy","method","performTaskWorker","afterMessageIdTemp","taskId","awaiting","pending","updatesProcessor","hashes","apiPromisesSingle","apiPromisesCacheable","isSWRegistered","sockets","taskListeners","taskListenersSW","postMessagesWaiting","onWorkerMessage","callback","progress","rootScope","finalizeTask","result","start","registerServiceWorker","addTaskListener","toggleStorage","sessionStorage","race","setAuthorized","pause","forceUnsubscribe","cacheName","caches","socketTask","socket","onOpen","onClose","onMessage","buffer","storageTask","res","performTaskWorkerVoid","forceReconnectTimeout","registerWorker","getConfig","register","scope","registration","installing","waiting","active","onServiceWorkerFail","releasePending","controller","responseTask","uploadFile","originalPayload","message","bind","isWebpSupported","onWorkerFirstMessage","once","deferred","taskName","params","o","prepareTempMessageId","messageId","queryJSON","cached","includes","q","cache","item","override","fulfilled","timeout","cacheSeconds","timestamp","verify","queueId","userAuth","dcID","toPeerId","user","setUserAuth","dc_id","enabled","getConfigPromise","config","ScreenSize","MediaSize","width","height","boxSize","fitted","aspect","makeMediaSize","screenSizes","mobile","medium","large","sizes","handhelds","regular","webpage","album","esgSticker","animatedSticker","staticSticker","emojiSticker","poll","round","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","rAF","cancelAnimationFrame","requestAnimationFrame","mediaSizes","months","days","ONE_DAY","getWeekNumber","d","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","formatDateAccordingToTodayNew","today","hour","minute","year","day","month","weekday","formatFullSentTime","timeEl","formatTime","dateEl","fragment","createDocumentFragment","getFullDate","monthAsNumber","getHours","getMinutes","noSeconds","getSeconds","leadingZero","noTime","tsNow","seconds","t","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","query","dates","setFullYear","setHours","minDate","maxDate","title","dayOfWeek","c","setDate","formatWeekLong","getDay","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","parseInt","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","limitSymbols","limitFrom","escapeRegExp","encodeEntities","charCodeAt","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","_arrayIndex","partLength","convertInputKeyToKey","inputKey","convertKeyToInputKey","toUpperCase","capitalizeFirstLetter","ms","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","String","fromCharCode","rawEmoji","unicodeSurrogates","points","char","previous","toString","getEmojiToneIndex","getCountryEmoji","iso2","emojiFromCodePoints","codePoints","reduce","prev","curr","fromCodePoint"],"mappings":"sFAAA,MAAMA,EAAoBC,SAASC,cAAc,UAAUC,UAAU,cAAcC,WAAW,mBAE/E,O,iCCFf,8CAce,SAASC,EAAeC,EAAgBC,EAAgBC,EAAcC,EAAcC,GAAS,GAC1G,GAAGJ,EAASE,GAAQD,EAASE,GAAQC,EACnC,OAAO,YAAcJ,EAAQC,GAG/B,IAAII,EAAcH,EACdI,EAAcH,EAsBlB,OApBIH,EAASC,EAAWC,EAAOC,EAC7BG,EAAeL,EAASC,EAAOF,EAAU,GAEzCK,EAAeL,EAASG,EAAOF,EAAU,EACtCI,EAAcH,IACfI,EAAeA,EAAcJ,EAAOG,EAAe,EACnDA,EAAcH,IASfE,GAAUC,GAAeL,GAAUM,GAAeL,IACnDI,EAAcL,EACdM,EAAcL,GAGT,YAAcI,EAAaC,GA1CpC,MA6CA,EAAeP,eAAiBA,G,iCCMhC,MAAMQ,EAAoB,IAxCnB,MACE,SACL,IACEC,SAASC,SACT,MAAMC,KAOH,QACL,IACEC,OAAOC,QACP,MAAMF,KAMH,QAeHC,OAAOE,UAME,O,iCCpDf,YAeO,MAYDC,EAAS,CACbC,MAb8C,CAAC,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,MAAM,kBAAkB,MAAM,QAAQ,MAAM,kBAAkB,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,wCAAwC,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,iBAAiB,KAAK,iBAAiB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,GActs7DC,YAJgD,CAAC,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,MAAM,IAAK,MAAM,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,IAAK,MAAO,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,IAAK,MAAO,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IA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","file":"1.3982babdf2d0e2fda6f3.chunk.js","sourcesContent":["const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { makeMediaSize } from \"./mediaSizes\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\r\n if(imageW < boxW && imageH < boxH && noZoom) {\r\n return makeMediaSize(imageW, imageH);\r\n }\r\n\r\n let boxedImageW = boxW;\r\n let boxedImageH = boxH;\r\n\r\n if((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = (imageH * boxW / imageW) | 0;\r\n } else {\r\n boxedImageW = (imageW * boxH / imageH) | 0;\r\n if(boxedImageW > boxW) {\r\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\r\n boxedImageW = boxW;\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW;\r\n boxedImageH = imageH;\r\n }\r\n\r\n return makeMediaSize(boxedImageW, boxedImageH);\r\n}\r\n\r\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * 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","/*\r\n * https://github.com/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 mediaSizes from '../helpers/mediaSizes';\r\n\r\n// !WARNING, ТУТ СЛОЖНО! по-хорошему, надо бы это переделать без fe0f, но они здесь необходимы чтобы отрендерить панель, и ниже дописаны 3 элемента которые не воспроизводятся без fe0f\r\nexport const Emoji: {[emoji: string]: number} = {\"2049\":62748,\"2122\":62776,\"2139\":62801,\"2194\":62678,\"2195\":62677,\"2196\":62676,\"2197\":62670,\"2198\":62672,\"2199\":62674,\"2328\":61155,\"2600\":4954,\"2601\":4962,\"2602\":4977,\"2603\":4982,\"2604\":4984,\"2611\":62764,\"2614\":4978,\"2615\":3750,\"2618\":2639,\"2620\":196,\"2622\":62667,\"2623\":62668,\"2626\":62697,\"2638\":62694,\"2639\":168,\"2648\":62702,\"2649\":62703,\"2650\":62710,\"2651\":62711,\"2652\":62712,\"2653\":62713,\"2660\":51057,\"2663\":51060,\"2665\":51058,\"2666\":51059,\"2668\":4832,\"2692\":61258,\"2693\":4887,\"2694\":61261,\"2696\":61272,\"2697\":61280,\"2699\":61270,\"2702\":61245,\"2705\":62763,\"2708\":4895,\"2709\":61206,\"2712\":61220,\"2714\":62765,\"2716\":62742,\"2721\":62693,\"2728\":5993,\"2733\":62771,\"2734\":62772,\"2744\":4981,\"2747\":62773,\"2753\":62749,\"2754\":62750,\"2755\":62751,\"2757\":62752,\"2763\":1127,\"2764\":1129,\"2795\":62743,\"2796\":62744,\"2797\":62745,\"2934\":62681,\"2935\":62682,\"3030\":62753,\"3297\":62825,\"3299\":62826,\"0023-20e3\":62777,\"002a-20e3\":62778,\"0030-20e3\":62779,\"0031-20e3\":62780,\"0032-20e3\":62781,\"0033-20e3\":62782,\"0034-20e3\":62783,\"0035-20e3\":62784,\"0036-20e3\":62785,\"0037-20e3\":62786,\"0038-20e3\":62787,\"0039-20e3\":62788,\"00a9\":62774,\"00ae\":62775,\"1f004\":51063,\"1f0cf\":51062,\"1f170\":62795,\"1f171\":62797,\"1f17e\":62806,\"1f17f\":62808,\"1f18e\":62796,\"1f191\":62798,\"1f192\":62799,\"1f193\":62800,\"1f194\":62802,\"1f195\":62804,\"1f196\":62805,\"1f197\":62807,\"1f198\":62809,\"1f199\":62810,\"1f19a\":62811,\"1f1e6-1f1e8\":71550,\"1f1e6-1f1e9\":71551,\"1f1e6-1f1ea\":71552,\"1f1e6-1f1eb\":71553,\"1f1e6-1f1ec\":71554,\"1f1e6-1f1ee\":71555,\"1f1e6-1f1f1\":71556,\"1f1e6-1f1f2\":71557,\"1f1e6-1f1f4\":71558,\"1f1e6-1f1f6\":71559,\"1f1e6-1f1f7\":71560,\"1f1e6-1f1f8\":71561,\"1f1e6-1f1f9\":71562,\"1f1e6-1f1fa\":71563,\"1f1e6-1f1fc\":71564,\"1f1e6-1f1fd\":71565,\"1f1e6-1f1ff\":71566,\"1f1e7-1f1e6\":71567,\"1f1e7-1f1e7\":71568,\"1f1e7-1f1e9\":71569,\"1f1e7-1f1ea\":71570,\"1f1e7-1f1eb\":71571,\"1f1e7-1f1ec\":71572,\"1f1e7-1f1ed\":71573,\"1f1e7-1f1ee\":71574,\"1f1e7-1f1ef\":71575,\"1f1e7-1f1f1\":71576,\"1f1e7-1f1f2\":71577,\"1f1e7-1f1f3\":71578,\"1f1e7-1f1f4\":71579,\"1f1e7-1f1f6\":71580,\"1f1e7-1f1f7\":71581,\"1f1e7-1f1f8\":71582,\"1f1e7-1f1f9\":71583,\"1f1e7-1f1fb\":71584,\"1f1e7-1f1fc\":71585,\"1f1e7-1f1fe\":71586,\"1f1e7-1f1ff\":71587,\"1f1e8-1f1e6\":71588,\"1f1e8-1f1e8\":71589,\"1f1e8-1f1e9\":71590,\"1f1e8-1f1eb\":71591,\"1f1e8-1f1ec\":71592,\"1f1e8-1f1ed\":71593,\"1f1e8-1f1ee\":71594,\"1f1e8-1f1f0\":71595,\"1f1e8-1f1f1\":71596,\"1f1e8-1f1f2\":71597,\"1f1e8-1f1f3\":71598,\"1f1e8-1f1f4\":71599,\"1f1e8-1f1f5\":71600,\"1f1e8-1f1f7\":71601,\"1f1e8-1f1fa\":71602,\"1f1e8-1f1fb\":71603,\"1f1e8-1f1fc\":71604,\"1f1e8-1f1fd\":71605,\"1f1e8-1f1fe\":71606,\"1f1e8-1f1ff\":71607,\"1f1e9-1f1ea\":71608,\"1f1e9-1f1ec\":71609,\"1f1e9-1f1ef\":71610,\"1f1e9-1f1f0\":71611,\"1f1e9-1f1f2\":71612,\"1f1e9-1f1f4\":71613,\"1f1e9-1f1ff\":71614,\"1f1ea-1f1e6\":71615,\"1f1ea-1f1e8\":71616,\"1f1ea-1f1ea\":71617,\"1f1ea-1f1ec\":71618,\"1f1ea-1f1ed\":71619,\"1f1ea-1f1f7\":71620,\"1f1ea-1f1f8\":71621,\"1f1ea-1f1f9\":71622,\"1f1ea-1f1fa\":71623,\"1f1eb-1f1ee\":71624,\"1f1eb-1f1ef\":71625,\"1f1eb-1f1f0\":71626,\"1f1eb-1f1f2\":71627,\"1f1eb-1f1f4\":71628,\"1f1eb-1f1f7\":71629,\"1f1ec-1f1e6\":71630,\"1f1ec-1f1e7\":71631,\"1f1ec-1f1e9\":71632,\"1f1ec-1f1ea\":71633,\"1f1ec-1f1eb\":71634,\"1f1ec-1f1ec\":71635,\"1f1ec-1f1ed\":71636,\"1f1ec-1f1ee\":71637,\"1f1ec-1f1f1\":71638,\"1f1ec-1f1f2\":71639,\"1f1ec-1f1f3\":71640,\"1f1ec-1f1f5\":71641,\"1f1ec-1f1f6\":71642,\"1f1ec-1f1f7\":71643,\"1f1ec-1f1f8\":71644,\"1f1ec-1f1f9\":71645,\"1f1ec-1f1fa\":71646,\"1f1ec-1f1fc\":71647,\"1f1ec-1f1fe\":71648,\"1f1ed-1f1f0\":71649,\"1f1ed-1f1f2\":71650,\"1f1ed-1f1f3\":71651,\"1f1ed-1f1f7\":71652,\"1f1ed-1f1f9\":71653,\"1f1ed-1f1fa\":71654,\"1f1ee-1f1e8\":71655,\"1f1ee-1f1e9\":71656,\"1f1ee-1f1ea\":71657,\"1f1ee-1f1f1\":71658,\"1f1ee-1f1f2\":71659,\"1f1ee-1f1f3\":71660,\"1f1ee-1f1f4\":71661,\"1f1ee-1f1f6\":71662,\"1f1ee-1f1f7\":71663,\"1f1ee-1f1f8\":71664,\"1f1ee-1f1f9\":71665,\"1f1ef-1f1ea\":71666,\"1f1ef-1f1f2\":71667,\"1f1ef-1f1f4\":71668,\"1f1ef-1f1f5\":71669,\"1f1f0-1f1ea\":71670,\"1f1f0-1f1ec\":71671,\"1f1f0-1f1ed\":71672,\"1f1f0-1f1ee\":71673,\"1f1f0-1f1f2\":71674,\"1f1f0-1f1f3\":71675,\"1f1f0-1f1f5\":71676,\"1f1f0-1f1f7\":71677,\"1f1f0-1f1fc\":71678,\"1f1f0-1f1fe\":71679,\"1f1f0-1f1ff\":71680,\"1f1f1-1f1e6\":71681,\"1f1f1-1f1e7\":71682,\"1f1f1-1f1e8\":71683,\"1f1f1-1f1ee\":71684,\"1f1f1-1f1f0\":71685,\"1f1f1-1f1f7\":71686,\"1f1f1-1f1f8\":71687,\"1f1f1-1f1f9\":71688,\"1f1f1-1f1fa\":71689,\"1f1f1-1f1fb\":71690,\"1f1f1-1f1fe\":71691,\"1f1f2-1f1e6\":71692,\"1f1f2-1f1e8\":71693,\"1f1f2-1f1e9\":71694,\"1f1f2-1f1ea\":71695,\"1f1f2-1f1eb\":71696,\"1f1f2-1f1ec\":71697,\"1f1f2-1f1ed\":71698,\"1f1f2-1f1f0\":71699,\"1f1f2-1f1f1\":71700,\"1f1f2-1f1f2\":71701,\"1f1f2-1f1f3\":71702,\"1f1f2-1f1f4\":71703,\"1f1f2-1f1f5\":71704,\"1f1f2-1f1f6\":71705,\"1f1f2-1f1f7\":71706,\"1f1f2-1f1f8\":71707,\"1f1f2-1f1f9\":71708,\"1f1f2-1f1fa\":71709,\"1f1f2-1f1fb\":71710,\"1f1f2-1f1fc\":71711,\"1f1f2-1f1fd\":71712,\"1f1f2-1f1fe\":71713,\"1f1f2-1f1ff\":71714,\"1f1f3-1f1e6\":71715,\"1f1f3-1f1e8\":71716,\"1f1f3-1f1ea\":71717,\"1f1f3-1f1eb\":71718,\"1f1f3-1f1ec\":71719,\"1f1f3-1f1ee\":71720,\"1f1f3-1f1f1\":71721,\"1f1f3-1f1f4\":71722,\"1f1f3-1f1f5\":71723,\"1f1f3-1f1f7\":71724,\"1f1f3-1f1fa\":71725,\"1f1f3-1f1ff\":71726,\"1f1f4-1f1f2\":71727,\"1f1f5-1f1e6\":71728,\"1f1f5-1f1ea\":71729,\"1f1f5-1f1eb\":71730,\"1f1f5-1f1ec\":71731,\"1f1f5-1f1ed\":71732,\"1f1f5-1f1f0\":71733,\"1f1f5-1f1f1\":71734,\"1f1f5-1f1f2\":71735,\"1f1f5-1f1f3\":71736,\"1f1f5-1f1f7\":71737,\"1f1f5-1f1f8\":71738,\"1f1f5-1f1f9\":71739,\"1f1f5-1f1fc\":71740,\"1f1f5-1f1fe\":71741,\"1f1f6-1f1e6\":71742,\"1f1f7-1f1ea\":71743,\"1f1f7-1f1f4\":71744,\"1f1f7-1f1f8\":71745,\"1f1f7-1f1fa\":71746,\"1f1f7-1f1fc\":71747,\"1f1f8-1f1e6\":71748,\"1f1f8-1f1e7\":71749,\"1f1f8-1f1e8\":71750,\"1f1f8-1f1e9\":71751,\"1f1f8-1f1ea\":71752,\"1f1f8-1f1ec\":71753,\"1f1f8-1f1ed\":71754,\"1f1f8-1f1ee\":71755,\"1f1f8-1f1ef\":71756,\"1f1f8-1f1f0\":71757,\"1f1f8-1f1f1\":71758,\"1f1f8-1f1f2\":71759,\"1f1f8-1f1f3\":71760,\"1f1f8-1f1f4\":71761,\"1f1f8-1f1f7\":71762,\"1f1f8-1f1f8\":71763,\"1f1f8-1f1f9\":71764,\"1f1f8-1f1fb\":71765,\"1f1f8-1f1fd\":71766,\"1f1f8-1f1fe\":71767,\"1f1f8-1f1ff\":71768,\"1f1f9-1f1e6\":71769,\"1f1f9-1f1e8\":71770,\"1f1f9-1f1e9\":71771,\"1f1f9-1f1eb\":71772,\"1f1f9-1f1ec\":71773,\"1f1f9-1f1ed\":71774,\"1f1f9-1f1ef\":71775,\"1f1f9-1f1f0\":71776,\"1f1f9-1f1f1\":71777,\"1f1f9-1f1f2\":71778,\"1f1f9-1f1f3\":71779,\"1f1f9-1f1f4\":71780,\"1f1f9-1f1f7\":71781,\"1f1f9-1f1f9\":71782,\"1f1f9-1f1fb\":71783,\"1f1f9-1f1fc\":71784,\"1f1f9-1f1ff\":71785,\"1f1fa-1f1e6\":71786,\"1f1fa-1f1ec\":71787,\"1f1fa-1f1f2\":71788,\"1f1fa-1f1f3\":71789,\"1f1fa-1f1f8\":71790,\"1f1fa-1f1fe\":71791,\"1f1fa-1f1ff\":71792,\"1f1fb-1f1e6\":71793,\"1f1fb-1f1e8\":71794,\"1f1fb-1f1ea\":71795,\"1f1fb-1f1ec\":71796,\"1f1fb-1f1ee\":71797,\"1f1fb-1f1f3\":71798,\"1f1fb-1f1fa\":71799,\"1f1fc-1f1eb\":71800,\"1f1fc-1f1f8\":71801,\"1f1fd-1f1f0\":71802,\"1f1fe-1f1ea\":71803,\"1f1fe-1f1f9\":71804,\"1f1ff-1f1e6\":71805,\"1f1ff-1f1f2\":71806,\"1f1ff-1f1fc\":71807,\"1f201\":62812,\"1f202\":62813,\"1f21a\":62819,\"1f22f\":62816,\"1f232\":62820,\"1f233\":62824,\"1f234\":62823,\"1f235\":62828,\"1f236\":62815,\"1f237\":62814,\"1f238\":62822,\"1f239\":62818,\"1f23a\":62827,\"1f250\":62817,\"1f251\":62821,\"1f300\":4974,\"1f301\":4824,\"1f302\":4976,\"1f303\":4825,\"1f304\":4827,\"1f305\":4828,\"1f306\":4829,\"1f307\":4830,\"1f308\":4975,\"1f309\":4831,\"1f30a\":4987,\"1f30b\":4782,\"1f30c\":4961,\"1f30d\":4773,\"1f30e\":4774,\"1f30f\":4775,\"1f310\":4776,\"1f311\":4941,\"1f312\":4942,\"1f313\":4943,\"1f314\":4944,\"1f315\":4945,\"1f316\":4946,\"1f317\":4947,\"1f318\":4948,\"1f319\":4949,\"1f31a\":4950,\"1f31b\":4951,\"1f31c\":4952,\"1f31d\":4955,\"1f31e\":4956,\"1f31f\":4959,\"1f320\":4960,\"1f321\":4953,\"1f324\":4965,\"1f325\":4966,\"1f326\":4967,\"1f327\":4968,\"1f328\":4969,\"1f329\":4970,\"1f32a\":4971,\"1f32b\":4972,\"1f32c\":4973,\"1f32d\":3694,\"1f32e\":3696,\"1f32f\":3697,\"1f330\":3677,\"1f331\":2631,\"1f332\":2633,\"1f333\":2634,\"1f334\":2635,\"1f335\":2636,\"1f336\":3668,\"1f337\":2630,\"1f338\":2622,\"1f339\":2625,\"1f33a\":2627,\"1f33b\":2628,\"1f33c\":2629,\"1f33d\":3667,\"1f33e\":2637,\"1f33f\":2638,\"1f340\":2640,\"1f341\":2641,\"1f342\":2642,\"1f343\":2643,\"1f344\":3675,\"1f345\":3660,\"1f346\":3664,\"1f347\":3644,\"1f348\":3645,\"1f349\":3646,\"1f34a\":3647,\"1f34b\":3648,\"1f34c\":3649,\"1f34d\":3650,\"1f34e\":3652,\"1f34f\":3653,\"1f350\":3654,\"1f351\":3655,\"1f352\":3656,\"1f353\":3657,\"1f354\":3691,\"1f355\":3693,\"1f356\":3687,\"1f357\":3688,\"1f358\":3713,\"1f359\":3714,\"1f35a\":3715,\"1f35b\":3716,\"1f35c\":3717,\"1f35d\":3718,\"1f35e\":3678,\"1f35f\":3692,\"1f360\":3719,\"1f361\":3725,\"1f362\":3720,\"1f363\":3721,\"1f364\":3722,\"1f365\":3723,\"1f366\":3734,\"1f367\":3735,\"1f368\":3736,\"1f369\":3737,\"1f36a\":3738,\"1f36b\":3743,\"1f36c\":3744,\"1f36d\":3745,\"1f36e\":3746,\"1f36f\":3747,\"1f370\":3740,\"1f371\":3712,\"1f372\":3704,\"1f373\":3702,\"1f374\":3769,\"1f375\":3752,\"1f376\":3753,\"1f377\":3755,\"1f378\":3756,\"1f379\":3757,\"1f37a\":3758,\"1f37b\":3759,\"1f37c\":3748,\"1f37d\":3768,\"1f37e\":3754,\"1f37f\":3708,\"1f380\":51004,\"1f381\":51005,\"1f382\":3739,\"1f383\":5988,\"1f384\":5989,\"1f385\":1490,\"1f386\":5990,\"1f387\":5991,\"1f388\":5994,\"1f389\":5995,\"1f38a\":5996,\"1f38b\":5997,\"1f38c\":71544,\"1f38d\":5998,\"1f38e\":5999,\"1f38f\":51000,\"1f390\":51001,\"1f391\":51002,\"1f392\":61096,\"1f393\":61109,\"1f396\":51009,\"1f397\":51006,\"1f399\":61129,\"1f39a\":61130,\"1f39b\":61131,\"1f39e\":61164,\"1f39f\":51007,\"1f3a0\":4833,\"1f3a1\":4834,\"1f3a2\":4835,\"1f3a3\":51036,\"1f3a4\":61132,\"1f3a5\":61163,\"1f3a6\":62733,\"1f3a7\":61133,\"1f3a8\":51067,\"1f3a9\":61108,\"1f3aa\":4837,\"1f3ab\":51008,\"1f3ac\":61166,\"1f3ad\":51065,\"1f3ae\":51049,\"1f3af\":51042,\"1f3b0\":51051,\"1f3b1\":51045,\"1f3b2\":51052,\"1f3b3\":51024,\"1f3b4\":51064,\"1f3b5\":61127,\"1f3b6\":61128,\"1f3b7\":61135,\"1f3b8\":61137,\"1f3b9\":61138,\"1f3ba\":61139,\"1f3bb\":61140,\"1f3bc\":61126,\"1f3bd\":51038,\"1f3be\":51022,\"1f3bf\":51039,\"1f3c0\":51018,\"1f3c1\":71542,\"1f3c2\":1562,\"1f3c3-200d-2640\":1546,\"1f3c3-200d-2642\":1545,\"1f3c3\":1544,\"1f3c4-200d-2640\":1568,\"1f3c4-200d-2642\":1567,\"1f3c4\":1566,\"1f3c5\":51011,\"1f3c6\":51010,\"1f3c7\":1560,\"1f3c8\":51020,\"1f3c9\":51021,\"1f3ca-200d-2640\":1574,\"1f3ca-200d-2642\":1573,\"1f3ca\":1572,\"1f3cb-200d-2640\":1580,\"1f3cb-200d-2642\":1579,\"1f3cb\":1578,\"1f3cc-200d-2640\":1565,\"1f3cc-200d-2642\":1564,\"1f3cc\":1563,\"1f3cd\":4868,\"1f3ce\":4867,\"1f3cf\":51025,\"1f3d0\":51019,\"1f3d1\":51026,\"1f3d2\":51027,\"1f3d3\":51029,\"1f3d4\":4780,\"1f3d5\":4784,\"1f3d6\":4785,\"1f3d7\":4791,\"1f3d8\":4796,\"1f3d9\":4826,\"1f3da\":4797,\"1f3db\":4790,\"1f3dc\":4786,\"1f3dd\":4787,\"1f3de\":4788,\"1f3df\":4789,\"1f3e0\":4798,\"1f3e1\":4799,\"1f3e2\":4800,\"1f3e3\":4801,\"1f3e4\":4802,\"1f3e5\":4803,\"1f3e6\":4804,\"1f3e7\":62643,\"1f3e8\":4805,\"1f3e9\":4806,\"1f3ea\":4807,\"1f3eb\":4808,\"1f3ec\":4809,\"1f3ed\":4810,\"1f3ee\":61177,\"1f3ef\":4811,\"1f3f0\":4812,\"1f3f3-200d-1f308\":71547,\"1f3f3-200d-26a7\":71548,\"1f3f3\":71546,\"1f3f4-200d-2620\":71549,\"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f\":71808,\"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f\":71809,\"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f\":71810,\"1f3f4\":71545,\"1f3f5\":2624,\"1f3f7\":61195,\"1f3f8\":51030,\"1f3f9\":61264,\"1f3fa\":3772,\"1f3fb\":9499,\"1f3fc\":9500,\"1f3fd\":9501,\"1f3fe\":9502,\"1f3ff\":9503,\"1f400\":2550,\"1f401\":2549,\"1f402\":2530,\"1f403\":2531,\"1f404\":2532,\"1f405\":2521,\"1f406\":2522,\"1f407\":2553,\"1f408-200d-2b1b\":2518,\"1f408\":2517,\"1f409\":2592,\"1f40a\":2587,\"1f40b\":2596,\"1f40c\":2605,\"1f40d\":2590,\"1f40e\":2524,\"1f40f\":2537,\"1f410\":2539,\"1f411\":2538,\"1f412\":2505,\"1f413\":2570,\"1f414\":2569,\"1f415-200d-1f9ba\":2511,\"1f415\":2509,\"1f416\":2534,\"1f417\":2535,\"1f418\":2544,\"1f419\":2603,\"1f41a\":2604,\"1f41b\":2607,\"1f41c\":2608,\"1f41d\":2609,\"1f41e\":2611,\"1f41f\":2599,\"1f420\":2600,\"1f421\":2601,\"1f422\":2588,\"1f423\":2571,\"1f424\":2572,\"1f425\":2573,\"1f426\":2574,\"1f427\":2575,\"1f428\":2560,\"1f429\":2512,\"1f42a\":2540,\"1f42b\":2541,\"1f42c\":2597,\"1f42d\":2548,\"1f42e\":2529,\"1f42f\":2520,\"1f430\":2552,\"1f431\":2516,\"1f432\":2591,\"1f433\":2595,\"1f434\":2523,\"1f435\":2504,\"1f436\":2508,\"1f437\":2533,\"1f438\":2586,\"1f439\":2551,\"1f43a\":2513,\"1f43b-200d-2744\":2559,\"1f43b\":2558,\"1f43c\":2561,\"1f43d\":2536,\"1f43e\":2567,\"1f43f\":2554,\"1f440\":1350,\"1f441-200d-1f5e8\":1147,\"1f441\":1351,\"1f442\":1342,\"1f443\":1344,\"1f444\":1353,\"1f445\":1352,\"1f446\":1318,\"1f447\":1320,\"1f448\":1316,\"1f449\":1317,\"1f44a\":1325,\"1f44b\":1303,\"1f44c\":1308,\"1f44d\":1322,\"1f44e\":1323,\"1f44f\":1328,\"1f450\":1330,\"1f451\":61106,\"1f452\":61107,\"1f453\":61072,\"1f454\":61077,\"1f455\":61078,\"1f456\":61079,\"1f457\":61084,\"1f458\":61085,\"1f459\":61090,\"1f45a\":61091,\"1f45b\":61092,\"1f45c\":61093,\"1f45d\":61094,\"1f45e\":61098,\"1f45f\":61099,\"1f460\":61102,\"1f461\":61103,\"1f462\":61105,\"1f463\":1649,\"1f464\":1646,\"1f465\":1647,\"1f466\":1356,\"1f467\":1357,\"1f468-200d-1f33e\":1423,\"1f468-200d-1f373\":1426,\"1f468-200d-1f37c\":1487,\"1f468-200d-1f393\":1414,\"1f468-200d-1f3a4\":1444,\"1f468-200d-1f3a8\":1447,\"1f468-200d-1f3eb\":1417,\"1f468-200d-1f3ed\":1432,\"1f468-200d-1f466-200d-1f466\":1636,\"1f468-200d-1f466\":1635,\"1f468-200d-1f467-200d-1f466\":1638,\"1f468-200d-1f467-200d-1f467\":1639,\"1f468-200d-1f467\":1637,\"1f468-200d-1f468-200d-1f466\":1625,\"1f468-200d-1f468-200d-1f466-200d-1f466\":1628,\"1f468-200d-1f468-200d-1f467\":1626,\"1f468-200d-1f468-200d-1f467-200d-1f466\":1627,\"1f468-200d-1f468-200d-1f467-200d-1f467\":1629,\"1f468-200d-1f469-200d-1f466\":1620,\"1f468-200d-1f469-200d-1f466-200d-1f466\":1623,\"1f468-200d-1f469-200d-1f467\":1621,\"1f468-200d-1f469-200d-1f467-200d-1f466\":1622,\"1f468-200d-1f469-200d-1f467-200d-1f467\":1624,\"1f468-200d-1f4bb\":1441,\"1f468-200d-1f4bc\":1435,\"1f468-200d-1f527\":1429,\"1f468-200d-1f52c\":1438,\"1f468-200d-1f680\":1453,\"1f468-200d-1f692\":1456,\"1f468-200d-1f9af\":1536,\"1f468-200d-1f9b0\":1362,\"1f468-200d-1f9b1\":1363,\"1f468-200d-1f9b2\":1365,\"1f468-200d-1f9b3\":1364,\"1f468-200d-1f9bc\":1539,\"1f468-200d-1f9bd\":1542,\"1f468-200d-2695\":1411,\"1f468-200d-2696\":1420,\"1f468-200d-2708\":1450,\"1f468-200d-2764-200d-1f468\":1617,\"1f468-200d-2764-200d-1f48b-200d-1f468\":1613,\"1f468\":1360,\"1f469-200d-1f33e\":1424,\"1f469-200d-1f373\":1427,\"1f469-200d-1f37c\":1486,\"1f469-200d-1f393\":1415,\"1f469-200d-1f3a4\":1445,\"1f469-200d-1f3a8\":1448,\"1f469-200d-1f3eb\":1418,\"1f469-200d-1f3ed\":1433,\"1f469-200d-1f466-200d-1f466\":1641,\"1f469-200d-1f466\":1640,\"1f469-200d-1f467-200d-1f466\":1643,\"1f469-200d-1f467-200d-1f467\":1644,\"1f469-200d-1f467\":1642,\"1f469-200d-1f469-200d-1f466\":1630,\"1f469-200d-1f469-200d-1f466-200d-1f466\":1633,\"1f469-200d-1f469-200d-1f467\":1631,\"1f469-200d-1f469-200d-1f467-200d-1f466\":1632,\"1f469-200d-1f469-200d-1f467-200d-1f467\":1634,\"1f469-200d-1f4bb\":1442,\"1f469-200d-1f4bc\":1436,\"1f469-200d-1f527\":1430,\"1f469-200d-1f52c\":1439,\"1f469-200d-1f680\":1454,\"1f469-200d-1f692\":1457,\"1f469-200d-1f9af\":1537,\"1f469-200d-1f9b0\":1367,\"1f469-200d-1f9b1\":1369,\"1f469-200d-1f9b2\":1373,\"1f469-200d-1f9b3\":1371,\"1f469-200d-1f9bc\":1540,\"1f469-200d-1f9bd\":1543,\"1f469-200d-2695\":1412,\"1f469-200d-2696\":1421,\"1f469-200d-2708\":1451,\"1f469-200d-2764-200d-1f468\":1616,\"1f469-200d-2764-200d-1f469\":1618,\"1f469-200d-2764-200d-1f48b-200d-1f468\":1612,\"1f469-200d-2764-200d-1f48b-200d-1f469\":1614,\"1f469\":1366,\"1f46a\":1619,\"1f46b\":1609,\"1f46c\":1610,\"1f46d\":1608,\"1f46e-200d-2640\":1460,\"1f46e-200d-2642\":1459,\"1f46e\":1458,\"1f46f-200d-2640\":1552,\"1f46f-200d-2642\":1551,\"1f46f\":1550,\"1f470-200d-2640\":1483,\"1f470-200d-2642\":1482,\"1f470\":1481,\"1f471-200d-2640\":1375,\"1f471-200d-2642\":1376,\"1f471\":1359,\"1f472\":1476,\"1f473-200d-2640\":1475,\"1f473-200d-2642\":1474,\"1f473\":1473,\"1f474\":1378,\"1f475\":1379,\"1f476\":1354,\"1f477-200d-2640\":1470,\"1f477-200d-2642\":1469,\"1f477\":1468,\"1f478\":1472,\"1f479\":199,\"1f47a\":1100,\"1f47b\":1101,\"1f47c\":1489,\"1f47d\":1102,\"1f47e\":1103,\"1f47f\":194,\"1f480\":195,\"1f481-200d-2640\":1394,\"1f481-200d-2642\":1393,\"1f481\":1392,\"1f482-200d-2640\":1466,\"1f482-200d-2642\":1465,\"1f482\":1464,\"1f483\":1547,\"1f484\":61114,\"1f485\":1335,\"1f486-200d-2640\":1522,\"1f486-200d-2642\":1521,\"1f486\":1520,\"1f487-200d-2640\":1525,\"1f487-200d-2642\":1524,\"1f487\":1523,\"1f488\":4836,\"1f489\":61287,\"1f48a\":61289,\"1f48b\":1117,\"1f48c\":1118,\"1f48d\":61115,\"1f48e\":61116,\"1f48f\":1611,\"1f490\":2621,\"1f491\":1615,\"1f492\":4813,\"1f493\":1123,\"1f494\":1128,\"1f495\":1125,\"1f496\":1121,\"1f497\":1122,\"1f498\":1119,\"1f499\":1133,\"1f49a\":1132,\"1f49b\":1131,\"1f49c\":1134,\"1f49d\":1120,\"1f49e\":1124,\"1f49f\":1126,\"1f4a0\":62859,\"1f4a1\":61175,\"1f4a2\":1139,\"1f4a3\":1145,\"1f4a4\":1151,\"1f4a5\":1140,\"1f4a6\":1142,\"1f4a7\":4986,\"1f4a8\":1143,\"1f4a9\":197,\"1f4aa\":1337,\"1f4ab\":1141,\"1f4ac\":1146,\"1f4ad\":1150,\"1f4ae\":2623,\"1f4af\":1138,\"1f4b0\":61196,\"1f4b1\":62754,\"1f4b2\":62755,\"1f4b3\":61203,\"1f4b4\":61198,\"1f4b5\":61199,\"1f4b6\":61200,\"1f4b7\":61201,\"1f4b8\":61202,\"1f4b9\":61205,\"1f4ba\":4900,\"1f4bb\":61152,\"1f4bc\":61226,\"1f4bd\":61158,\"1f4be\":61159,\"1f4bf\":61160,\"1f4c0\":61161,\"1f4c1\":61227,\"1f4c2\":61228,\"1f4c3\":61188,\"1f4c4\":61190,\"1f4c5\":61230,\"1f4c6\":61231,\"1f4c7\":61234,\"1f4c8\":61235,\"1f4c9\":61236,\"1f4ca\":61237,\"1f4cb\":61238,\"1f4cc\":61239,\"1f4cd\":61240,\"1f4ce\":61241,\"1f4cf\":61243,\"1f4d0\":61244,\"1f4d1\":61193,\"1f4d2\":61187,\"1f4d3\":61186,\"1f4d4\":61179,\"1f4d5\":61180,\"1f4d6\":61181,\"1f4d7\":61182,\"1f4d8\":61183,\"1f4d9\":61184,\"1f4da\":61185,\"1f4db\":62760,\"1f4dc\":61189,\"1f4dd\":61225,\"1f4de\":61147,\"1f4df\":61148,\"1f4e0\":61149,\"1f4e1\":61286,\"1f4e2\":61121,\"1f4e3\":61122,\"1f4e4\":61210,\"1f4e5\":61211,\"1f4e6\":61212,\"1f4e7\":61207,\"1f4e8\":61208,\"1f4e9\":61209,\"1f4ea\":61214,\"1f4eb\":61213,\"1f4ec\":61215,\"1f4ed\":61216,\"1f4ee\":61217,\"1f4ef\":61123,\"1f4f0\":61191,\"1f4f1\":61144,\"1f4f2\":61145,\"1f4f3\":62737,\"1f4f4\":62738,\"1f4f5\":62665,\"1f4f6\":62736,\"1f4f7\":61168,\"1f4f8\":61169,\"1f4f9\":61170,\"1f4fa\":61167,\"1f4fb\":61134,\"1f4fc\":61171,\"1f4fd\":61165,\"1f4ff\":61113,\"1f500\":62715,\"1f501\":62716,\"1f502\":62717,\"1f503\":62683,\"1f504\":62684,\"1f505\":62734,\"1f506\":62735,\"1f507\":61117,\"1f508\":61118,\"1f509\":61119,\"1f50a\":61120,\"1f50b\":61150,\"1f50c\":61151,\"1f50d\":61172,\"1f50e\":61173,\"1f50f\":61251,\"1f510\":61252,\"1f511\":61253,\"1f512\":61249,\"1f513\":61250,\"1f514\":61124,\"1f515\":61125,\"1f516\":61194,\"1f517\":61274,\"1f518\":62860,\"1f519\":62685,\"1f51a\":62686,\"1f51b\":62687,\"1f51c\":62688,\"1f51d\":62689,\"1f51e\":62666,\"1f51f\":62789,\"1f520\":62790,\"1f521\":62791,\"1f522\":62792,\"1f523\":62793,\"1f524\":62794,\"1f525\":4985,\"1f526\":61176,\"1f527\":61267,\"1f528\":61255,\"1f529\":61269,\"1f52a\":3771,\"1f52b\":61262,\"1f52c\":61284,\"1f52d\":61285,\"1f52e\":51046,\"1f52f\":62701,\"1f530\":62761,\"1f531\":62759,\"1f532\":62862,\"1f533\":62861,\"1f534\":62829,\"1f535\":62833,\"1f536\":62853,\"1f537\":62854,\"1f538\":62855,\"1f539\":62856,\"1f53a\":62857,\"1f53b\":62858,\"1f53c\":62725,\"1f53d\":62727,\"1f549\":62692,\"1f54a\":2576,\"1f54b\":4821,\"1f54c\":4817,\"1f54d\":4819,\"1f54e\":62700,\"1f550\":4919,\"1f551\":4921,\"1f552\":4923,\"1f553\":4925,\"1f554\":4927,\"1f555\":4929,\"1f556\":4931,\"1f557\":4933,\"1f558\":4935,\"1f559\":4937,\"1f55a\":4939,\"1f55b\":4917,\"1f55c\":4920,\"1f55d\":4922,\"1f55e\":4924,\"1f55f\":4926,\"1f560\":4928,\"1f561\":4930,\"1f562\":4932,\"1f563\":4934,\"1f564\":4936,\"1f565\":4938,\"1f566\":4940,\"1f567\":4918,\"1f56f\":61174,\"1f570\":4916,\"1f573\":1144,\"1f574\":1549,\"1f575-200d-2640\":1463,\"1f575-200d-2642\":1462,\"1f575\":1461,\"1f576\":61073,\"1f577\":2614,\"1f578\":2615,\"1f579\":51050,\"1f57a\":1548,\"1f587\":61242,\"1f58a\":61222,\"1f58b\":61221,\"1f58c\":61223,\"1f58d\":61224,\"1f590\":1305,\"1f595\":1319,\"1f596\":1307,\"1f5a4\":1136,\"1f5a5\":61153,\"1f5a8\":61154,\"1f5b1\":61156,\"1f5b2\":61157,\"1f5bc\":51066,\"1f5c2\":61229,\"1f5c3\":61246,\"1f5c4\":61247,\"1f5d1\":61248,\"1f5d2\":61232,\"1f5d3\":61233,\"1f5dc\":61271,\"1f5dd\":61254,\"1f5de\":61192,\"1f5e1\":61260,\"1f5e3\":1645,\"1f5e8\":1148,\"1f5ef\":1149,\"1f5f3\":61218,\"1f5fa\":4777,\"1f5fb\":4783,\"1f5fc\":4814,\"1f5fd\":4815,\"1f5fe\":4778,\"1f5ff\":61320,\"1f600\":11,\"1f601\":14,\"1f602\":18,\"1f603\":12,\"1f604\":13,\"1f605\":16,\"1f606\":15,\"1f607\":113,\"1f608\":193,\"1f609\":111,\"1f60a\":112,\"1f60b\":123,\"1f60c\":143,\"1f60d\":115,\"1f60e\":162,\"1f60f\":138,\"1f610\":135,\"1f611\":136,\"1f612\":139,\"1f613\":185,\"1f614\":144,\"1f615\":165,\"1f616\":182,\"1f617\":118,\"1f618\":117,\"1f619\":121,\"1f61a\":120,\"1f61b\":124,\"1f61c\":125,\"1f61d\":127,\"1f61e\":184,\"1f61f\":166,\"1f620\":191,\"1f621\":190,\"1f622\":179,\"1f623\":183,\"1f624\":189,\"1f625\":178,\"1f626\":174,\"1f627\":175,\"1f628\":176,\"1f629\":186,\"1f62a\":145,\"1f62b\":187,\"1f62c\":141,\"1f62d\":180,\"1f62e\":169,\"1f62f\":170,\"1f630\":177,\"1f631\":181,\"1f632\":171,\"1f633\":172,\"1f634\":147,\"1f635\":157,\"1f636\":137,\"1f637\":148,\"1f638\":1106,\"1f639\":1107,\"1f63a\":1105,\"1f63b\":1108,\"1f63c\":1109,\"1f63d\":1110,\"1f63e\":1113,\"1f63f\":1112,\"1f640\":1111,\"1f641\":167,\"1f642\":19,\"1f643\":110,\"1f644\":140,\"1f645-200d-2640\":1388,\"1f645-200d-2642\":1387,\"1f645\":1386,\"1f646-200d-2640\":1391,\"1f646-200d-2642\":1390,\"1f646\":1389,\"1f647-200d-2640\":1403,\"1f647-200d-2642\":1402,\"1f647\":1401,\"1f648\":1114,\"1f649\":1115,\"1f64a\":1116,\"1f64b-200d-2640\":1397,\"1f64b-200d-2642\":1396,\"1f64b\":1395,\"1f64c\":1329,\"1f64d-200d-2640\":1382,\"1f64d-200d-2642\":1381,\"1f64d\":1380,\"1f64e-200d-2640\":1385,\"1f64e-200d-2642\":1384,\"1f64e\":1383,\"1f64f\":1333,\"1f680\":4906,\"1f681\":4901,\"1f682\":4838,\"1f683\":4839,\"1f684\":4840,\"1f685\":4841,\"1f686\":4842,\"1f687\":4843,\"1f688\":4844,\"1f689\":4845,\"1f68a\":4846,\"1f68b\":4849,\"1f68c\":4850,\"1f68d\":4851,\"1f68e\":4852,\"1f68f\":4877,\"1f690\":4853,\"1f691\":4854,\"1f692\":4855,\"1f693\":4856,\"1f694\":4857,\"1f695\":4858,\"1f696\":4859,\"1f697\":4860,\"1f698\":4861,\"1f699\":4862,\"1f69a\":4864,\"1f69b\":4865,\"1f69c\":4866,\"1f69d\":4847,\"1f69e\":4848,\"1f69f\":4902,\"1f6a0\":4903,\"1f6a1\":4904,\"1f6a2\":4894,\"1f6a3-200d-2640\":1571,\"1f6a3-200d-2642\":1570,\"1f6a3\":1569,\"1f6a4\":4890,\"1f6a5\":4883,\"1f6a6\":4884,\"1f6a7\":4886,\"1f6a8\":4882,\"1f6a9\":71543,\"1f6aa\":61292,\"1f6ab\":62659,\"1f6ac\":61316,\"1f6ad\":62661,\"1f6ae\":62644,\"1f6af\":62662,\"1f6b0\":62645,\"1f6b1\":62663,\"1f6b2\":4873,\"1f6b3\":62660,\"1f6b4-200d-2640\":1583,\"1f6b4-200d-2642\":1582,\"1f6b4\":1581,\"1f6b5-200d-2640\":1586,\"1f6b5-200d-2642\":1585,\"1f6b5\":1584,\"1f6b6-200d-2640\":1528,\"1f6b6-200d-2642\":1527,\"1f6b6\":1526,\"1f6b7\":62664,\"1f6b8\":62657,\"1f6b9\":62647,\"1f6ba\":62648,\"1f6bb\":62649,\"1f6bc\":62650,\"1f6bd\":61299,\"1f6be\":62651,\"1f6bf\":61301,\"1f6c0\":1605,\"1f6c1\":61302,\"1f6c2\":62652,\"1f6c3\":62653,\"1f6c4\":62654,\"1f6c5\":62655,\"1f6cb\":61297,\"1f6cc\":1606,\"1f6cd\":61095,\"1f6ce\":4908,\"1f6cf\":61296,\"1f6d0\":62690,\"1f6d1\":4885,\"1f6d2\":61315,\"1f6d5\":4818,\"1f6d6\":4795,\"1f6d7\":61293,\"1f6e0\":61259,\"1f6e1\":61265,\"1f6e2\":4880,\"1f6e3\":4878,\"1f6e4\":4879,\"1f6e5\":4893,\"1f6e9\":4896,\"1f6eb\":4897,\"1f6ec\":4898,\"1f6f0\":4905,\"1f6f3\":4891,\"1f6f4\":4874,\"1f6f5\":4869,\"1f6f6\":4889,\"1f6f7\":51040,\"1f6f8\":4907,\"1f6f9\":4875,\"1f6fa\":4872,\"1f6fb\":4863,\"1f6fc\":4876,\"1f7e0\":62830,\"1f7e1\":62831,\"1f7e2\":62832,\"1f7e3\":62834,\"1f7e4\":62835,\"1f7e5\":62838,\"1f7e6\":62842,\"1f7e7\":62839,\"1f7e8\":62840,\"1f7e9\":62841,\"1f7ea\":62843,\"1f7eb\":62844,\"1f90c\":1309,\"1f90d\":1137,\"1f90e\":1135,\"1f90f\":1310,\"1f910\":133,\"1f911\":128,\"1f912\":149,\"1f913\":163,\"1f914\":132,\"1f915\":150,\"1f916\":1104,\"1f917\":129,\"1f918\":1314,\"1f919\":1315,\"1f91a\":1304,\"1f91b\":1326,\"1f91c\":1327,\"1f91d\":1332,\"1f91e\":1312,\"1f91f\":1313,\"1f920\":159,\"1f921\":198,\"1f922\":151,\"1f923\":17,\"1f924\":146,\"1f925\":142,\"1f926-200d-2640\":1406,\"1f926-200d-2642\":1405,\"1f926\":1404,\"1f927\":153,\"1f928\":134,\"1f929\":116,\"1f92a\":126,\"1f92b\":131,\"1f92c\":192,\"1f92d\":130,\"1f92e\":152,\"1f92f\":158,\"1f930\":1484,\"1f931\":1485,\"1f932\":1331,\"1f933\":1336,\"1f934\":1471,\"1f935-200d-2640\":1480,\"1f935-200d-2642\":1479,\"1f935\":1478,\"1f936\":1491,\"1f937-200d-2640\":1409,\"1f937-200d-2642\":1408,\"1f937\":1407,\"1f938-200d-2640\":1589,\"1f938-200d-2642\":1588,\"1f938\":1587,\"1f939-200d-2640\":1601,\"1f939-200d-2642\":1600,\"1f939\":1599,\"1f93a\":1559,\"1f93c-200d-2640\":1592,\"1f93c-200d-2642\":1591,\"1f93c\":1590,\"1f93d-200d-2640\":1595,\"1f93d-200d-2642\":1594,\"1f93d\":1593,\"1f93e-200d-2640\":1598,\"1f93e-200d-2642\":1597,\"1f93e\":1596,\"1f93f\":51037,\"1f940\":2626,\"1f941\":61142,\"1f942\":3760,\"1f943\":3761,\"1f944\":3770,\"1f945\":51033,\"1f947\":51012,\"1f948\":51013,\"1f949\":51014,\"1f94a\":51031,\"1f94b\":51032,\"1f94c\":51041,\"1f94d\":51028,\"1f94e\":51017,\"1f94f\":51023,\"1f950\":3679,\"1f951\":3663,\"1f952\":3670,\"1f953\":3690,\"1f954\":3665,\"1f955\":3666,\"1f956\":3680,\"1f957\":3707,\"1f958\":3703,\"1f959\":3699,\"1f95a\":3701,\"1f95b\":3749,\"1f95c\":3676,\"1f95d\":3659,\"1f95e\":3684,\"1f95f\":3726,\"1f960\":3727,\"1f961\":3728,\"1f962\":3767,\"1f963\":3706,\"1f964\":3762,\"1f965\":3662,\"1f966\":3672,\"1f967\":3742,\"1f968\":3682,\"1f969\":3689,\"1f96a\":3695,\"1f96b\":3711,\"1f96c\":3671,\"1f96d\":3651,\"1f96e\":3724,\"1f96f\":3683,\"1f970\":114,\"1f971\":188,\"1f972\":122,\"1f973\":160,\"1f974\":156,\"1f975\":154,\"1f976\":155,\"1f977\":1467,\"1f978\":161,\"1f97a\":173,\"1f97b\":61086,\"1f97c\":61075,\"1f97d\":61074,\"1f97e\":61100,\"1f97f\":61101,\"1f980\":3729,\"1f981\":2519,\"1f982\":2616,\"1f983\":2568,\"1f984\":2525,\"1f985\":2577,\"1f986\":2578,\"1f987\":2557,\"1f988\":2602,\"1f989\":2580,\"1f98a\":2514,\"1f98b\":2606,\"1f98c\":2527,\"1f98d\":2506,\"1f98e\":2589,\"1f98f\":2546,\"1f990\":3731,\"1f991\":3732,\"1f992\":2543,\"1f993\":2526,\"1f994\":2556,\"1f995\":2593,\"1f996\":2594,\"1f997\":2612,\"1f998\":2565,\"1f999\":2542,\"1f99a\":2584,\"1f99b\":2547,\"1f99c\":2585,\"1f99d\":2515,\"1f99e\":3730,\"1f99f\":2617,\"1f9a0\":2620,\"1f9a1\":2566,\"1f9a2\":2579,\"1f9a3\":2545,\"1f9a4\":2581,\"1f9a5\":2562,\"1f9a6\":2563,\"1f9a7\":2507,\"1f9a8\":2564,\"1f9a9\":2583,\"1f9aa\":3733,\"1f9ab\":2555,\"1f9ac\":2528,\"1f9ad\":2598,\"1f9ae\":2510,\"1f9af\":61273,\"1f9b4\":1349,\"1f9b5\":1340,\"1f9b6\":1341,\"1f9b7\":1348,\"1f9b8-200d-2640\":1495,\"1f9b8-200d-2642\":1494,\"1f9b8\":1493,\"1f9b9-200d-2640\":1498,\"1f9b9-200d-2642\":1497,\"1f9b9\":1496,\"1f9ba\":61076,\"1f9bb\":1343,\"1f9bc\":4871,\"1f9bd\":4870,\"1f9be\":1338,\"1f9bf\":1339,\"1f9c0\":3686,\"1f9c1\":3741,\"1f9c2\":3710,\"1f9c3\":3764,\"1f9c4\":3673,\"1f9c5\":3674,\"1f9c6\":3700,\"1f9c7\":3685,\"1f9c8\":3709,\"1f9c9\":3765,\"1f9ca\":3766,\"1f9cb\":3763,\"1f9cd-200d-2640\":1531,\"1f9cd-200d-2642\":1530,\"1f9cd\":1529,\"1f9ce-200d-2640\":1534,\"1f9ce-200d-2642\":1533,\"1f9ce\":1532,\"1f9cf-200d-2640\":1400,\"1f9cf-200d-2642\":1399,\"1f9cf\":1398,\"1f9d0\":164,\"1f9d1-200d-1f33e\":1422,\"1f9d1-200d-1f373\":1425,\"1f9d1-200d-1f37c\":1488,\"1f9d1-200d-1f384\":1492,\"1f9d1-200d-1f393\":1413,\"1f9d1-200d-1f3a4\":1443,\"1f9d1-200d-1f3a8\":1446,\"1f9d1-200d-1f3eb\":1416,\"1f9d1-200d-1f3ed\":1431,\"1f9d1-200d-1f4bb\":1440,\"1f9d1-200d-1f4bc\":1434,\"1f9d1-200d-1f527\":1428,\"1f9d1-200d-1f52c\":1437,\"1f9d1-200d-1f680\":1452,\"1f9d1-200d-1f692\":1455,\"1f9d1-200d-1f91d-200d-1f9d1\":1607,\"1f9d1-200d-1f9af\":1535,\"1f9d1-200d-1f9b0\":1368,\"1f9d1-200d-1f9b1\":1370,\"1f9d1-200d-1f9b2\":1374,\"1f9d1-200d-1f9b3\":1372,\"1f9d1-200d-1f9bc\":1538,\"1f9d1-200d-1f9bd\":1541,\"1f9d1-200d-2695\":1410,\"1f9d1-200d-2696\":1419,\"1f9d1-200d-2708\":1449,\"1f9d1\":1358,\"1f9d2\":1355,\"1f9d3\":1377,\"1f9d4\":1361,\"1f9d5\":1477,\"1f9d6-200d-2640\":1555,\"1f9d6-200d-2642\":1554,\"1f9d6\":1553,\"1f9d7-200d-2640\":1558,\"1f9d7-200d-2642\":1557,\"1f9d7\":1556,\"1f9d8-200d-2640\":1604,\"1f9d8-200d-2642\":1603,\"1f9d8\":1602,\"1f9d9-200d-2640\":1501,\"1f9d9-200d-2642\":1500,\"1f9d9\":1499,\"1f9da-200d-2640\":1504,\"1f9da-200d-2642\":1503,\"1f9da\":1502,\"1f9db-200d-2640\":1507,\"1f9db-200d-2642\":1506,\"1f9db\":1505,\"1f9dc-200d-2640\":1510,\"1f9dc-200d-2642\":1509,\"1f9dc\":1508,\"1f9dd-200d-2640\":1513,\"1f9dd-200d-2642\":1512,\"1f9dd\":1511,\"1f9de-200d-2640\":1516,\"1f9de-200d-2642\":1515,\"1f9de\":1514,\"1f9df-200d-2640\":1519,\"1f9df-200d-2642\":1518,\"1f9df\":1517,\"1f9e0\":1345,\"1f9e1\":1130,\"1f9e2\":61110,\"1f9e3\":61080,\"1f9e4\":61081,\"1f9e5\":61082,\"1f9e6\":61083,\"1f9e7\":51003,\"1f9e8\":5992,\"1f9e9\":51053,\"1f9ea\":61281,\"1f9eb\":61282,\"1f9ec\":61283,\"1f9ed\":4779,\"1f9ee\":61162,\"1f9ef\":61314,\"1f9f0\":61277,\"1f9f1\":4792,\"1f9f2\":61278,\"1f9f3\":4909,\"1f9f4\":61305,\"1f9f5\":51068,\"1f9f6\":51070,\"1f9f7\":61306,\"1f9f8\":51054,\"1f9f9\":61307,\"1f9fa\":61308,\"1f9fb\":61309,\"1f9fc\":61311,\"1f9fd\":61313,\"1f9fe\":61204,\"1f9ff\":51048,\"1fa70\":61104,\"1fa71\":61087,\"1fa72\":61088,\"1fa73\":61089,\"1fa74\":61097,\"1fa78\":61288,\"1fa79\":61290,\"1fa7a\":61291,\"1fa80\":51043,\"1fa81\":51044,\"1fa82\":4899,\"1fa83\":61263,\"1fa84\":51047,\"1fa85\":51055,\"1fa86\":51056,\"1fa90\":4957,\"1fa91\":61298,\"1fa92\":61304,\"1fa93\":61256,\"1fa94\":61178,\"1fa95\":61141,\"1fa96\":61111,\"1fa97\":61136,\"1fa98\":61143,\"1fa99\":61197,\"1fa9a\":61266,\"1fa9b\":61268,\"1fa9c\":61279,\"1fa9d\":61276,\"1fa9e\":61294,\"1fa9f\":61295,\"1faa0\":61300,\"1faa1\":51069,\"1faa2\":51071,\"1faa3\":61310,\"1faa4\":61303,\"1faa5\":61312,\"1faa6\":61318,\"1faa7\":61321,\"1faa8\":4793,\"1fab0\":2618,\"1fab1\":2619,\"1fab2\":2610,\"1fab3\":2613,\"1fab4\":2632,\"1fab5\":4794,\"1fab6\":2582,\"1fac0\":1346,\"1fac1\":1347,\"1fac2\":1648,\"1fad0\":3658,\"1fad1\":3669,\"1fad2\":3661,\"1fad3\":3681,\"1fad4\":3698,\"1fad5\":3705,\"1fad6\":3751,\"203c\":62747,\"21a9\":62679,\"21aa\":62680,\"231a\":4912,\"231b\":4910,\"23cf\":62732,\"23e9\":62719,\"23ea\":62723,\"23eb\":62726,\"23ec\":62728,\"23ed\":62720,\"23ee\":62724,\"23ef\":62721,\"23f0\":4913,\"23f1\":4914,\"23f2\":4915,\"23f3\":4911,\"23f8\":62729,\"23f9\":62730,\"23fa\":62731,\"24c2\":62803,\"25aa\":62851,\"25ab\":62852,\"25b6\":62718,\"25c0\":62722,\"25fb\":62848,\"25fc\":62847,\"25fd\":62850,\"25fe\":62849,\"260e\":61146,\"261d\":1321,\"262a\":62698,\"262e\":62699,\"262f\":62695,\"263a\":119,\"264a\":62704,\"264b\":62705,\"264c\":62706,\"264d\":62707,\"264e\":62708,\"264f\":62709,\"265f\":51061,\"267b\":62757,\"267e\":62746,\"267f\":62646,\"269b\":62691,\"269c\":62758,\"26a0\":62656,\"26a1\":4980,\"26a7\":62741,\"26aa\":62837,\"26ab\":62836,\"26b0\":61317,\"26b1\":61319,\"26bd\":51015,\"26be\":51016,\"26c4\":4983,\"26c5\":4963,\"26c8\":4964,\"26ce\":62714,\"26cf\":61257,\"26d1\":61112,\"26d3\":61275,\"26d4\":62658,\"26e9\":4820,\"26ea\":4816,\"26f0\":4781,\"26f1\":4979,\"26f2\":4822,\"26f3\":51034,\"26f4\":4892,\"26f5\":4888,\"26f7\":1561,\"26f8\":51035,\"26f9-200d-2640\":1577,\"26f9-200d-2642\":1576,\"26f9\":1575,\"26fa\":4823,\"26fd\":4881,\"270a\":1324,\"270b\":1306,\"270c\":1311,\"270d\":1334,\"270f\":61219,\"271d\":62696,\"274c\":62766,\"274e\":62767,\"27a1\":62671,\"27b0\":62768,\"27bf\":62769,\"2b05\":62675,\"2b06\":62669,\"2b07\":62673,\"2b1b\":62845,\"2b1c\":62846,\"2b50\":4958,\"2b55\":62762,\"303d\":62770,\"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\":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\":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,\"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,\"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\":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};\r\n\r\n/* Emoji[\"00a9-fe0f\"] = 6362;\r\nEmoji[\"00ae-fe0f\"] = 6363;\r\nEmoji[\"2122-fe0f\"] = 6364; */\r\n\r\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\r\nexport const 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'];\r\n\r\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\r\nexport const 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'};\r\n\r\nconst Config = {\r\n Emoji,\r\n LatinizeMap,\r\n TLD,\r\n MediaSizes: mediaSizes\r\n};\r\nMOUNT_CLASS_TO.Config = Config;\r\nexport default Config;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport { logger } from \"../logger\";\nimport rootScope from \"../rootScope\";\nimport sessionStorage from \"../sessionStorage\";\nimport apiManager from \"./mtprotoworker\";\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nconst CHECK_INSTANCE_INTERVAL = 5000; \nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\n\nexport class SingleInstance {\n private instanceID: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: boolean;\n private initial: boolean;\n private log = logger('INSTANCE');\n\n public start() {\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n this.reset();\n //IdleManager.start();\n\n rootScope.addEventListener('idle', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n public reset() {\n this.instanceID = nextRandomUint(32);\n this.masterInstance = false;\n if(this.deactivateTimeout) clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n this.deactivated = false;\n this.initial = false;\n }\n\n public clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n rootScope.dispatchEvent('instance_activated');\n }\n }\n\n public deactivateInstance = () => {\n if(this.masterInstance || this.deactivated) {\n return false;\n }\n\n this.log('deactivate');\n this.deactivateTimeout = 0;\n this.deactivated = true;\n this.clearInstance();\n //$modalStack.dismissAll();\n\n //document.title = _('inactive_tab_title_raw')\n\n rootScope.idle.deactivated = true;\n rootScope.dispatchEvent('instance_deactivated');\n };\n\n public checkInstance = (idle = rootScope.idle && rootScope.idle.isIDLE) => {\n if(this.deactivated) {\n return false;\n }\n \n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceID, \n idle, \n time\n };\n\n sessionStorage.get('xt_instance', false).then((curInstance: AppInstance) => {\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceID ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n apiManager.startAll();\n if(!this.initial) {\n this.initial = true;\n } else {\n this.log.warn('now master instance', newInstance);\n }\n\n this.masterInstance = true;\n }\n\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n } else {\n if(this.masterInstance) {\n apiManager.stopAll();\n this.log.warn('now idle instance', newInstance);\n if(!this.deactivateTimeout) {\n this.deactivateTimeout = window.setTimeout(this.deactivateInstance, DEACTIVATE_TIMEOUT);\n }\n\n this.masterInstance = false;\n }\n }\n });\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"webp.worker.bd598dc02a03fd59d71a.bundle.worker.js\");\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport WebpWorker from 'worker-loader!./webp.worker';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\n\r\nexport type WebpConvertTask = {\r\n type: 'convertWebp', \r\n payload: {\r\n fileName: string, \r\n bytes: Uint8Array\r\n }\r\n};\r\n\r\nexport class WebpWorkerController {\r\n private worker: Worker;\r\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\r\n \r\n private init() {\r\n this.worker = new WebpWorker();\r\n this.worker.addEventListener('message', (e) => {\r\n const payload = (e.data as WebpConvertTask).payload;\r\n\r\n if(payload.fileName.indexOf('main-') === 0) {\r\n const promise = this.convertPromises[payload.fileName];\r\n if(promise) {\r\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\r\n delete this.convertPromises[payload.fileName];\r\n }\r\n } else {\r\n apiManagerProxy.postMessage(e.data);\r\n }\r\n });\r\n }\r\n\r\n public postMessage(data: WebpConvertTask) {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.worker.postMessage(data);\r\n }\r\n\r\n public convert(fileName: string, bytes: Uint8Array) {\r\n fileName = 'main-' + fileName;\r\n\r\n if(this.convertPromises.hasOwnProperty(fileName)) {\r\n return this.convertPromises[fileName];\r\n }\r\n \r\n const convertPromise = deferredPromise();\r\n\r\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\r\n\r\n return this.convertPromises[fileName] = convertPromise;\r\n }\r\n}\r\n\r\nconst webpWorkerController = new WebpWorkerController();\r\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\r\nexport default webpWorkerController;","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG, { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { safeAssign } from \"../helpers/object\";\nimport { capitalizeFirstLetter } from \"../helpers/string\";\nimport type lang from \"../lang\";\nimport type langSign from \"../langSign\";\nimport type { State } from \"./appManagers/appStateManager\";\nimport { HelpCountriesList, HelpCountry, LangPackDifference, LangPackString } from \"../layer\";\nimport apiManager from \"./mtproto/mtprotoworker\";\nimport stateStorage from \"./stateStorage\";\nimport App from \"../config/app\";\nimport rootScope from \"./rootScope\";\nimport RichTextProcessor from \"./richtextprocessor\";\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n \"messageActionChatCreate\": \"ActionCreateGroup\",\n \"messageActionChatCreateYou\": \"ActionYouCreateGroup\",\n\t\"messageActionChatEditTitle\": \"ActionChangedTitle\",\n\t\"messageActionChatEditPhoto\": \"ActionChangedPhoto\",\n\t\"messageActionChatEditVideo\": \"ActionChangedVideo\",\n\t\"messageActionChatDeletePhoto\": \"ActionRemovedPhoto\",\n\t\"messageActionChatReturn\": \"ActionAddUserSelf\",\n\t\"messageActionChatReturnYou\": \"ActionAddUserSelfYou\",\n\t\"messageActionChatJoined\": \"ActionAddUserSelfMega\",\n\t\"messageActionChatJoinedYou\": \"ChannelMegaJoined\",\n \"messageActionChatAddUser\": \"ActionAddUser\",\n \"messageActionChatAddUsers\": \"ActionAddUser\",\n\t\"messageActionChatLeave\": \"ActionLeftUser\",\n\t\"messageActionChatLeaveYou\": \"YouLeft\",\n\t\"messageActionChatDeleteUser\": \"ActionKickUser\",\n\t\"messageActionChatJoinedByLink\": \"ActionInviteUser\",\n \"messageActionPinMessage\": \"Chat.Service.Group.UpdatedPinnedMessage\",\n \"messageActionContactSignUp\": \"Chat.Service.PeerJoinedTelegram\",\n\t\"messageActionChannelCreate\": \"ActionCreateChannel\",\n\t\"messageActionChannelEditTitle\": \"Chat.Service.Channel.UpdatedTitle\",\n\t\"messageActionChannelEditPhoto\": \"Chat.Service.Channel.UpdatedPhoto\",\n\t\"messageActionChannelEditVideo\": \"Chat.Service.Channel.UpdatedVideo\",\n \"messageActionChannelDeletePhoto\": \"Chat.Service.Channel.RemovedPhoto\",\n \"messageActionHistoryClear\": \"HistoryCleared\",\n\t\"messageActionDiscussionStarted\": \"DiscussionStarted\",\n\n \"messageActionChannelMigrateFrom\": \"ActionMigrateFromGroup\",\n\n \"messageActionPhoneCall.in_ok\": \"ChatList.Service.Call.incoming\",\n\t\"messageActionPhoneCall.out_ok\": \"ChatList.Service.Call.outgoing\",\n\t\"messageActionPhoneCall.in_missed\": \"ChatList.Service.Call.Missed\",\n\t\"messageActionPhoneCall.out_missed\": \"ChatList.Service.Call.Cancelled\",\n\n\t\"messageActionGroupCall.started\": \"ActionGroupCallJustStarted\",\n\t\"messageActionGroupCall.started_by\": \"ActionGroupCallStarted\",\n\t\"messageActionGroupCall.started_byYou\": \"ActionGroupCallStartedByYou\",\n\t\"messageActionGroupCall.ended\": \"ActionGroupCallEnded\",\n\t\"messageActionGroupCall.ended_by\": \"Chat.Service.VoiceChatFinished\",\n\t\"messageActionGroupCall.ended_byYou\": \"Chat.Service.VoiceChatFinishedYou\",\n\n\t\"messageActionBotAllowed\": \"Chat.Service.BotPermissionAllowed\"\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nnamespace I18n {\n\texport const strings: Map = new Map();\n\texport const countriesList: HelpCountry[] = [];\n\tlet pluralRules: Intl.PluralRules;\n\n\tlet cacheLangPackPromise: Promise;\n\texport let lastRequestedLangCode: string;\n\texport let lastAppliedLangCode: string;\n\texport let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\texport function getCacheLangPack(): Promise {\n\t\tif(cacheLangPackPromise) return cacheLangPackPromise;\n\t\treturn cacheLangPackPromise = Promise.all([\n\t\t\tstateStorage.get('langPack') as Promise,\n\t\t\tpolyfillPromise\n\t\t]).then(([langPack]) => {\n\t\t\tif(!langPack/* || true */) {\n\t\t\t\treturn loadLocalLangPack();\n\t\t\t} else if(DEBUG && false) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t}/* else if(langPack.appVersion !== App.langPackVersion) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t} */\n\t\t\t\n\t\t\tif(!lastRequestedLangCode) {\n\t\t\t\tlastRequestedLangCode = langPack.lang_code;\n\t\t\t}\n\t\t\t\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t}).finally(() => {\n\t\t\tcacheLangPackPromise = undefined;\n\t\t});\n\t}\n\n export function setTimeFormat(format: State['settings']['timeFormat']) {\n const haveToUpdate = !!timeFormat && timeFormat !== format;\n timeFormat = format;\n\n if(haveToUpdate) {\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach(element => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n\texport function loadLocalLangPack() {\n\t\tconst defaultCode = App.langPackCode;\n\t\tlastRequestedLangCode = defaultCode;\n\t\treturn Promise.all([\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\timport('../countries')\n\t\t]).then(([lang, langSign, countries]) => {\n\t\t\tconst strings: LangPackString[] = [];\n\t\t\tformatLocalStrings(lang.default, strings);\n\t\t\tformatLocalStrings(langSign.default, strings);\n\n\t\t\tconst langPack: LangPackDifference = {\n\t\t\t\t_: 'langPackDifference',\n\t\t\t\tfrom_version: 0,\n\t\t\t\tlang_code: defaultCode,\n\t\t\t\tstrings,\n\t\t\t\tversion: 0,\n\t\t\t\tlocal: true,\n\t\t\t\tcountries: countries.default\n\t\t\t};\n\t\t\treturn saveLangPack(langPack);\n\t\t});\n\t}\n\n\texport function loadLangPack(langCode: string) {\n\t\trequestedServerLanguage = true;\n\t\treturn Promise.all([\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: App.langPack\n\t\t\t}),\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: 'android'\n\t\t\t}),\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\tapiManager.invokeApiCacheable('help.getCountriesList', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\thash: 0\n\t\t\t}) as Promise,\n\t\t\tpolyfillPromise,\n\t\t]);\n\t}\n\n\texport function getStrings(langCode: string, strings: string[]) {\n\t\treturn apiManager.invokeApi('langpack.getStrings', {\n\t\t\tlang_pack: App.langPack,\n\t\t\tlang_code: langCode,\n\t\t\tkeys: strings\n\t\t});\n\t}\n\n\texport function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n\t\tfor(const i in strings) {\n\t\t\t// @ts-ignore\n\t\t\tconst v = strings[i];\n\t\t\tif(typeof(v) === 'string') {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\tkey: i,\n\t\t\t\t\tvalue: v\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackStringPluralized',\n\t\t\t\t\tkey: i,\n\t\t\t\t\t...v\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn pushTo;\n\t}\n\n\texport function getLangPack(langCode: string) {\n\t\tlastRequestedLangCode = langCode;\n\t\treturn loadLangPack(langCode).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n\t\t\tlet strings: LangPackString[] = [];\n\n\t\t\t[localLangPack1, localLangPack2].forEach(l => {\n\t\t\t\tformatLocalStrings(l.default as any, strings);\n\t\t\t});\n\n\t\t\tstrings = strings.concat(langPack1.strings);\n\n\t\t\tfor(const string of langPack2.strings) {\n\t\t\t\tstrings.push(string);\n\t\t\t}\n\n\t\t\tlangPack1.strings = strings;\n\t\t\tlangPack1.countries = countries;\n\t\t\treturn saveLangPack(langPack1);\n\t\t});\n\t}\n\n\texport function saveLangPack(langPack: LangPackDifference) {\n\t\tlangPack.appVersion = App.langPackVersion;\n\n\t\treturn stateStorage.set({langPack}).then(() => {\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t});\n\t}\n\n\texport const polyfillPromise = (function checkIfPolyfillNeeded() {\n\t\tif(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n\t\t\treturn Promise.resolve();\n\t\t} else {\n\t\t\treturn import('./pluralPolyfill').then((_Intl) => {\n\t\t\t\t(window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n\t\t\t});\n\t\t}\n\t})();\n\t\n\texport function applyLangPack(langPack: LangPackDifference) {\n\t\tif(langPack.lang_code !== lastRequestedLangCode) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code);\n\t\t} catch(err) {\n\t\t\tconsole.error('pluralRules error', err);\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n\t\t}\n\n\t\tstrings.clear();\n\n\t\tfor(const string of langPack.strings) {\n\t\t\tstrings.set(string.key as LangPackKey, string);\n\t\t}\n\n\t\tif(langPack.countries) {\n\t\t\tcountriesList.length = 0;\n\t\t\tcountriesList.push(...langPack.countries.countries);\n\n\t\t\tlangPack.countries.countries.forEach(country => {\n\t\t\t\tif(country.name) {\n\t\t\t\t\tconst langPackKey: any = country.default_name;\n\t\t\t\t\tstrings.set(langPackKey, {\n\t\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\t\tkey: langPackKey,\n\t\t\t\t\t\tvalue: country.name\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif(lastAppliedLangCode !== langPack.lang_code) {\n\t\t\trootScope.dispatchEvent('language_change', langPack.lang_code);\n\t\t\tlastAppliedLangCode = langPack.lang_code;\n\t\t}\n\n\t\tconst elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n\t\telements.forEach(element => {\n\t\t\tconst instance = weakMap.get(element);\n\n\t\t\tif(instance) {\n\t\t\t\tinstance.update();\n\t\t\t}\n\t\t});\n\t}\n\n\texport function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n\t\tlet out: ReturnType = [];\n\t\tconst regExp = /(\\*\\*)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n\t\tlet lastIndex = 0;\n\t\tinput.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n\t\t\t//console.table({match, p1, p2, offset, string});\n\n\t\t\tout.push(string.slice(lastIndex, offset));\n\n\t\t\tif(p1) {\n\t\t\t\t//offset += p1.length;\n\t\t\t\tswitch(p1) {\n\t\t\t\t\tcase '**': {\n\t\t\t\t\t\tconst b = document.createElement('b');\n\t\t\t\t\t\tb.append(...superFormatter(p2, args, indexHolder) as any);\n\t\t\t\t\t\tout.push(b);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if(p3) {\n\t\t\t\tout.push(document.createElement('br'));\n\t\t\t} else if(p4) {\n\t\t\t\tconst a = document.createElement('a');\n\n\t\t\t\tconst idx = p4.lastIndexOf(']');\n\t\t\t\tconst text = p4.slice(1, idx);\n\t\t\t\ta.append(...superFormatter(text, args, indexHolder) as any);\n\n\t\t\t\tconst url = p4.slice(idx + 2, p4.length - 1);\n\t\t\t\tif(url) {\n\t\t\t\t\tconst wrappedUrl = RichTextProcessor.wrapUrl(url);\n\t\t\t\t\ta.href = wrappedUrl.url;\n\t\t\t\t\tif(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n\t\t\t\t\ta.target = '_blank';\n\t\t\t\t}\n\n\t\t\t\tout.push(a);\n\t\t\t} else if(args) {\n\t\t\t\tconst arg = args[indexHolder.i++];\n\t\t\t\tif(Array.isArray(arg)) {\n\t\t\t\t\tout.push(...arg as any);\n\t\t\t\t} else {\n\t\t\t\t\tout.push(arg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlastIndex = offset + match.length;\n\t\t\treturn '';\n\t\t});\n\t\n\t\tif(lastIndex !== input.length) {\n\t\t\tout.push(input.slice(lastIndex));\n\t\t}\n\n\t\treturn out;\n\t}\n\t\n\texport function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n\texport function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n\texport function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n\t\tconst str = strings.get(key);\n\t\tlet input: string;\n\t\tif(str) {\n\t\t\tif(str._ === 'langPackStringPluralized' && args?.length) {\n\t\t\t\tlet v = args[0] as number | string;\n\t\t\t\tif(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n\t\t\t\tconst s = pluralRules.select(v);\n\t\t\t\t// @ts-ignore\n\t\t\t\tinput = str[s + '_value'] || str['other_value'];\n\t\t\t} else if(str._ === 'langPackString') {\n\t\t\t\tinput = str.value;\n\t\t\t} else {\n\t\t\t\t//input = '[' + key + ']';\n\t\t\t\tinput = key;\n\t\t\t}\n\t\t} else {\n\t\t\t//input = '[' + key + ']';\n\t\t\tinput = key;\n\t\t}\n\t\t\n\t\tif(plain) {\n\t\t\tif(args?.length) {\n\t\t\t\tconst regExp = /un\\d|%\\d\\$.|%./g;\n\t\t\t\tlet i = 0;\n\t\t\t\tinput = input.replace(regExp, (match, offset, string) => {\n\t\t\t\t\treturn '' + args[i++];\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn input;\n\t\t} else {\n\t\t\treturn superFormatter(input, args);\n\t\t}\n\t}\n\n\texport const weakMap: WeakMap> = new WeakMap();\n\n\texport type IntlElementBaseOptions = {\n\t\telement?: HTMLElement,\n\t\tproperty?: /* 'innerText' | */'innerHTML' | 'placeholder',\n\t};\n\n\tabstract class IntlElementBase {\n\t\tpublic element: IntlElementBaseOptions['element'];\n\t\tpublic property: IntlElementBaseOptions['property'] = 'innerHTML';\n\t\n\t\tconstructor(options: Options) {\n\t\t\tthis.element = options.element || document.createElement('span');\n\t\t\tthis.element.classList.add('i18n');\n\t\t\t\n\t\t\tthis.update(options);\n\t\t\tweakMap.set(this.element, this);\n\t\t}\n\n\t\tabstract update(options?: Options): void;\n\t}\n\n\texport type IntlElementOptions = IntlElementBaseOptions & {\n\t\tkey: LangPackKey,\n\t\targs?: FormatterArguments\n\t};\n\texport class IntlElement extends IntlElementBase {\n\t\tpublic key: IntlElementOptions['key'];\n\t\tpublic args: IntlElementOptions['args'];\n\n\t\tpublic update(options?: IntlElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\tif(this.property === 'innerHTML') {\n\t\t\t\tthis.element.textContent = '';\n\t\t\t\tthis.element.append(...format(this.key, false, this.args) as any);\n\t\t\t} else {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst v = this.element[this.property];\n\t\t\t\tconst formatted = format(this.key, true, this.args);\n\n\t\t\t\t// * hasOwnProperty won't work here\n\t\t\t\tif(v === undefined) this.element.dataset[this.property] = formatted;\n\t\t\t\telse (this.element as HTMLInputElement)[this.property] = formatted;\n\t\t\t}\n\t\t}\n\t}\n\n\texport type IntlDateElementOptions = IntlElementBaseOptions & {\n\t\tdate: Date,\n\t\toptions: Intl.DateTimeFormatOptions\n\t};\n\texport class IntlDateElement extends IntlElementBase {\n\t\tpublic date: IntlDateElementOptions['date'];\n\t\tpublic options: IntlDateElementOptions['options'];\n\n\t\tpublic update(options?: IntlDateElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\t//var options = { month: 'long', day: 'numeric' };\n\t\t\t\n\t\t\t// * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n\t\t\tconst dateTimeFormat = new Intl.DateTimeFormat(lastRequestedLangCode + '-u-hc-' + timeFormat, this.options);\n\t\t\t\n\t\t\t(this.element as any)[this.property] = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n\t\t}\n\t}\n\n\texport function i18n(key: LangPackKey, args?: FormatterArguments) {\n\t\treturn new IntlElement({key, args}).element;\n\t}\n\t\n\texport function i18n_(options: IntlElementOptions) {\n\t\treturn new IntlElement(options).element;\n\t}\n\n\texport function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n\t\treturn new IntlElement({element, key, args, property}).element;\n\t}\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n\tconst arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n\treturn arr;\n}\n\nexport function join(elements: (Node | string)[], useLast = true) {\n\treturn joinElementsWith(elements, (isLast) => i18n(isLast && useLast ? 'WordDelimiterLast' : 'WordDelimiter'));\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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nexport class TelegramMeWebManager {\r\n private disabled = /* false && */(Modes.test || App.domains.indexOf(location.hostname) === -1);\r\n\r\n public setAuthorized(canRedirect: boolean) {\r\n if(this.disabled) {\r\n return;\r\n }\r\n\r\n return sessionStorage.get('tgme_sync').then((curValue) => {\r\n const ts = tsNow(true);\r\n if(canRedirect &&\r\n curValue &&\r\n curValue.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts) {\r\n return;\r\n }\r\n\r\n sessionStorage.set({\r\n tgme_sync: {\r\n canRedirect, \r\n ts\r\n }\r\n });\r\n\r\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\r\n const urls = [\r\n '//telegram.me/' + path,\r\n '//t.me/' + path\r\n ];\r\n\r\n const promises = urls.map(url => {\r\n const script = document.createElement('script');\r\n const promise = new Promise((resolve) => {\r\n script.onload = script.onerror = () => {\r\n script.remove();\r\n resolve();\r\n };\r\n });\r\n script.src = url;\r\n document.body.appendChild(script);\r\n return promise;\r\n });\r\n\r\n return Promise.all(promises);\r\n });\r\n }\r\n}\r\n\r\nconst telegramMeWebManager = new TelegramMeWebManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\r\nexport default telegramMeWebManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { NotificationSettings } from \"../appManagers/appNotificationsManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { copy } from \"../../helpers/object\";\r\nimport { logger } from \"../logger\";\r\nimport rootScope from \"../rootScope\";\r\nimport { ServiceWorkerNotificationsClearTask, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"../serviceWorker/index.service\";\r\nimport apiManager from \"./mtprotoworker\";\r\nimport I18n, { LangPackKey } from \"../langPack\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appRuntimeManager from \"../appManagers/appRuntimeManager\";\r\n\r\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\r\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\r\n\r\nexport type PushSubscriptionNotify = {\r\n tokenType: number,\r\n tokenValue: string\r\n};\r\n\r\nexport class WebPushApiManager {\r\n public isAvailable = true;\r\n private isPushEnabled = false;\r\n private localNotificationsAvailable = true;\r\n private started = false;\r\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\r\n private isAliveTO: any;\r\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n private userVisibleOnly = this.isFirefox ? false : true;\r\n private log = logger('PM');\r\n\r\n constructor() {\r\n if(!('PushManager' in window) ||\r\n !('Notification' in window) ||\r\n !('serviceWorker' in navigator)) {\r\n this.log.warn('Push messaging is not supported.');\r\n this.isAvailable = false;\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n if(this.isAvailable && Notification.permission === 'denied') {\r\n this.log.warn('The user has blocked notifications.');\r\n }\r\n }\r\n\r\n public start() {\r\n if(!this.started) {\r\n this.started = true;\r\n this.getSubscription();\r\n this.setUpServiceWorkerChannel();\r\n }\r\n }\r\n\r\n public setLocalNotificationsDisabled() {\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n public getSubscription() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = !!subscription;\r\n this.pushSubscriptionNotify('init', subscription);\r\n }).catch((err) => {\r\n this.log.error('Error during getSubscription()', err);\r\n });\r\n });\r\n }\r\n\r\n public subscribe = () => {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\r\n // The subscription was successful\r\n this.isPushEnabled = true;\r\n this.pushSubscriptionNotify('subscribe', subscription);\r\n }).catch((e) => {\r\n if(Notification.permission === 'denied') {\r\n this.log('Permission for Notifications was denied');\r\n } else {\r\n this.log('Unable to subscribe to push.', e);\r\n if(!this.userVisibleOnly) {\r\n this.userVisibleOnly = true;\r\n setTimeout(this.subscribe, 0);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public unsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n \r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = false;\r\n\r\n if(subscription) {\r\n this.pushSubscriptionNotify('unsubscribe', subscription);\r\n\r\n setTimeout(() => {\r\n subscription.unsubscribe().then((successful) => {\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }, 3000);\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public forceUnsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.log.warn('force unsubscribe', subscription);\r\n if(subscription) {\r\n subscription.unsubscribe().then((successful) => {\r\n this.log.warn('force unsubscribe successful', successful);\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public isAliveNotify = () => {\r\n if(!this.isAvailable || rootScope.idle && rootScope.idle.deactivated) {\r\n return;\r\n }\r\n\r\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '') + '#/im';\r\n\r\n const lang: ServiceWorkerPingTask['payload']['lang'] = {} as any;\r\n const ACTIONS_LANG_MAP: Record = {\r\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\r\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\r\n push_message_nopreview: 'PushNotification.Message.NoPreview'\r\n };\r\n\r\n for(const action in ACTIONS_LANG_MAP) {\r\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\r\n }\r\n\r\n const task: ServiceWorkerPingTask = {\r\n type: 'ping',\r\n payload: {\r\n localNotifications: this.localNotificationsAvailable,\r\n lang: lang,\r\n settings: this.settings\r\n }\r\n };\r\n\r\n apiManager.postSWMessage(task);\r\n\r\n this.isAliveTO = setTimeout(this.isAliveNotify, 10000);\r\n }\r\n\r\n public setSettings(newSettings: WebPushApiManager['settings']) {\r\n this.settings = copy(newSettings);\r\n clearTimeout(this.isAliveTO);\r\n this.isAliveNotify();\r\n }\r\n\r\n public hidePushNotifications() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n const task: ServiceWorkerNotificationsClearTask = {type: 'notifications_clear'};\r\n apiManager.postSWMessage(task);\r\n }\r\n\r\n public setUpServiceWorkerChannel() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManager.addServiceWorkerTaskListener('push_click', (task: ServiceWorkerPushClickTask) => {\r\n if(rootScope.idle && rootScope.idle.deactivated) {\r\n appRuntimeManager.reload();\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('push_notification_click', task.payload);\r\n });\r\n\r\n navigator.serviceWorker.ready.then(this.isAliveNotify);\r\n }\r\n\r\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\r\n if(subscription) {\r\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\r\n if(!subscriptionObj ||\r\n !subscriptionObj.endpoint ||\r\n !subscriptionObj.keys ||\r\n !subscriptionObj.keys.p256dh ||\r\n !subscriptionObj.keys.auth) {\r\n this.log.warn('Invalid push subscription', subscriptionObj);\r\n this.unsubscribe();\r\n this.isAvailable = false;\r\n this.pushSubscriptionNotify(event);\r\n return;\r\n }\r\n \r\n this.log.warn('Push', event, subscriptionObj);\r\n rootScope.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\r\n tokenType: 10,\r\n tokenValue: JSON.stringify(subscriptionObj)\r\n });\r\n } else {\r\n this.log.warn('Push', event, false);\r\n rootScope.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\r\n }\r\n }\r\n}\r\n\r\nconst webPushApiManager = new WebPushApiManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\r\nexport default webPushApiManager;\r\n","// 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\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\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\\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\\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\\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\\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\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d])|(?:\\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\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\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\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\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\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\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\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\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|\\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?|\\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]|[\\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-\\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\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd1d\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78\\udd7a-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcb\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7a\\ude80-\\ude86\\ude90-\\udea8\\udeb0-\\udeb6\\udec0-\\udec2\\uded0-\\uded6]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)\";\r\nexport default originalString;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Config from './config';\n\nimport emojiRegExp from '../vendor/emoji/regex';\nimport { encodeEmoji, toCodePoints } from '../vendor/emoji';\nimport { MessageEntity } from '../layer';\nimport { encodeEntities } from '../helpers/string';\nimport { IS_SAFARI } from '../environment/userAgent';\nimport { MOUNT_CLASS_TO } from '../config/debug';\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nconst emojiData = Config.Emoji;\n\nconst alphaCharsRegExp = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nconst alphaNumericRegExp = '0-9\\_' + alphaCharsRegExp;\nconst domainAddChars = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nconst urlAlphanumericRegExpPart = '[' + alphaCharsRegExp + '0-9]';\nconst urlProtocolRegExpPart = '((?:https?|ftp)://|mailto:)?';\nconst urlRegExp = urlProtocolRegExpPart +\n // user:pass authentication\n '(?:' + urlAlphanumericRegExpPart + '{1,64}(?::' + urlAlphanumericRegExpPart + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + alphaCharsRegExp + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nconst urlProtocolRegExp = new RegExp('^' + urlProtocolRegExpPart.slice(0, -1), 'i');\nconst urlAnyProtocolRegExp = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nconst usernameRegExp = '[a-zA-Z\\\\d_]{5,32}';\nconst botCommandRegExp = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + usernameRegExp + '))?(\\\\b|$)';\nconst fullRegExp = new RegExp('(^| )(@)(' + usernameRegExp + ')|(' + urlRegExp + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + alphaNumericRegExp + ']{2,64})|(^|\\\\s)' + botCommandRegExp, 'i');\nconst emailRegExp = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n//const markdownTestRegExp = /[`_*@~]/;\nconst markdownRegExp = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nconst siteHashtags: {[siteName: string]: string} = {\n Telegram: 'tg://search_hashtag?hashtag={1}',\n Twitter: 'https://twitter.com/hashtag/{1}',\n Instagram: 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\nconst siteMentions: {[siteName: string]: string} = {\n Telegram: '#/im?p=%40{1}',\n Twitter: 'https://twitter.com/{1}',\n Instagram: 'https://instagram.com/{1}/',\n GitHub: 'https://github.com/{1}'\n};\nconst markdownEntities: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline'\n};\n\nconst passConflictingEntities: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(let i in markdownEntities) {\n passConflictingEntities.add(markdownEntities[i]);\n}\n\nnamespace RichTextProcessor {\n export function getEmojiSpritesheetCoords(emojiCode: string) {\n let unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n \n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n \n if(!emojiData.hasOwnProperty(unified) \n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n //console.error('lol', unified);\n return null;\n }\n \n return unified;\n }\n\n export function parseEntities(text: string) {\n let match: any;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n fullRegExp.lastIndex = 0;\n while((match = raw.match(fullRegExp))) {\n matchIndex = rawOffset + match.index;\n \n //console.log('parseEntities match:', match);\n \n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(emailRegExp.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || Config.TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n \n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n \n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n \n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n //console.log('hit', match[8]);\n const emojiCoords = getEmojiSpritesheetCoords(match[8]);\n if(emojiCoords) {\n entities.push({\n _: 'messageEntityEmoji',\n offset: matchIndex,\n length: match[8].length,\n unicode: emojiCoords\n });\n }\n } else if(match[11]) { // Hashtag\n entities.push({\n _: 'messageEntityHashtag',\n offset: matchIndex + (match[10] ? match[10].length : 0),\n length: match[11].length\n });\n } else if(match[13]) { // Bot command\n entities.push({\n _: 'messageEntityBotCommand',\n offset: matchIndex + (match[11] ? match[11].length : 0) + (match[12] ? match[12].length : 0),\n length: 1 + match[13].length + (match[14] ? 1 + match[14].length : 0),\n unsafe: true\n });\n }\n \n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n \n // if (entities.length) {\n // console.log('parse entities', text, entities.slice())\n // }\n return entities;\n }\n\n /* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n } */\n\n export function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n   /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(markdownRegExp)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n //text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n \n newTextParts.push(match[1] + text + match[5]);\n \n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: markdownEntities[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic)['_'],\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 if(!entities.length && !noTrim) {\n newText = newText.trim();\n }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n }\n\n export function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n return currentEntities.find(currentEntity => {\n const isConflictingTypes = newEntity._ === currentEntity._ || \n (!passConflictingEntities.has(newEntity._) && !passConflictingEntities.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset && \n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n }\n\n export function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter(e => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n if(!IS_EMOJI_SUPPORTED) { // fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\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 export function combineSameEntities(entities: MessageEntity[]) {\n //entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset);\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n //return entities;\n }\n\n export function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: true,\n noLinebreaks: true,\n noCommands: true,\n wrappingDraft: boolean,\n //mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: true,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n\n contextHashtag?: string,\n }> = {}) {\n if(!text) {\n return '';\n }\n\n const lol: {\n part: string,\n offset: number,\n // priority: number\n }[] = [];\n const entities = options.entities || parseEntities(text);\n\n const passEntities: typeof options.passEntities = options.passEntities || {};\n const contextSite = options.contextSite || 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const insertPart = (entity: MessageEntity, startPart: string, endPart?: string/* , priority = 0 */) => {\n lol.push({part: startPart, offset: entity.offset/* , priority */});\n\n if(endPart) {\n lol.push({part: endPart, offset: entity.offset + entity.length/* , priority */});\n }\n };\n\n const pushPartsAfterSort: typeof lol = [];\n\n for(let i = 0, length = entities.length; i < length; ++i) {\n const entity = entities[i];\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n insertPart(entity, ``, '');\n } else {\n insertPart(entity, '', '');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n insertPart(entity, ``, '');\n } else {\n insertPart(entity, '', '');\n }\n\n break;\n }\n \n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n \n break;\n }\n \n case 'messageEntityPre': {\n if(!options.noTextFormat) {\n insertPart(entity, `
`, '
');\n }\n \n break;\n }\n\n case 'messageEntityHighlight': {\n insertPart(entity, '', '');\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n const entityText = text.substr(entity.offset, entity.length);\n let command = entityText.substr(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.substr(atPos + 1);\n command = command.substr(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n insertPart(entity, ``, ``);\n }\n\n break;\n }\n\n case 'messageEntityEmoji': {\n //if(!(options.wrappingDraft && IS_EMOJI_SUPPORTED)) { // * fix safari emoji\n if(!IS_EMOJI_SUPPORTED) { // no wrapping needed\n // if(IS_EMOJI_SUPPORTED) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '', '');\n // } else {\n insertPart(entity, `\"`,`);\n // }\n //} else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n insertPart(entity, '', '');\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!IS_EMOJI_SUPPORTED) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n \n case 'messageEntityCaret': {\n const html = '';\n // const html = '';\n // insertPart(entity, '');\n // insertPart(entity, '');\n pushPartsAfterSort.push({part: html, offset: entity.offset});\n // insertPart(entity, html/* , undefined, 1 */);\n break;\n }\n\n /* case 'messageEntityLinebreak': {\n if(options.noLinebreaks) {\n insertPart(entity, ' ');\n } else {\n insertPart(entity, '
');\n }\n \n break;\n } */\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n const entityText = text.substr(entity.offset, entity.length);\n\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || entityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n const nextEntity = entities[i + 1];\n if(nextEntity?._ === 'messageEntityUrl' && \n nextEntity.length === entity.length && \n nextEntity.offset === entity.offset) {\n i++;\n }\n\n if(url !== entityText) {\n masked = true;\n }\n } else {\n //inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') \n ? encodeEntities(url)\n : `javascript:electronHelpers.openExternal('${encodeEntities(url)}');`;\n\n const target = (currentContext || typeof electronHelpers !== 'undefined')\n ? '' : ' target=\"_blank\" rel=\"noopener noreferrer\"';\n\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n \n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && siteHashtags[contextSite];\n if(contextUrl) {\n const entityText = text.substr(entity.offset, entity.length);\n const hashtag = entityText.substr(1);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n const username = entityText.substr(1);\n\n const {url, onclick} = wrapUrl('t.me/' + username);\n\n // insertPart(entity, ``, '');\n insertPart(entity, ``, '');\n }\n \n break;\n }\n }\n }\n\n // lol.sort((a, b) => (a.offset - b.offset) || (a.priority - b.priority));\n lol.sort((a, b) => a.offset - b.offset); // have to sort because of nested entities\n\n let partsLength = lol.length, partsAfterSortLength = pushPartsAfterSort.length;\n for(let i = 0; i < partsAfterSortLength; ++i) {\n const part = pushPartsAfterSort[i];\n let insertAt = 0;\n while(insertAt < partsLength) {\n if(lol[insertAt++].offset >= part.offset) {\n break;\n }\n }\n\n lol.splice(insertAt, 0, part);\n }\n\n partsLength += partsAfterSortLength;\n\n const arr: string[] = [];\n let usedLength = 0;\n for(let i = 0; i < partsLength; ++i) {\n const {part, offset} = lol[i];\n if(offset > usedLength) {\n arr.push(encodeEntities(text.slice(usedLength, offset)));\n usedLength = offset;\n }\n\n arr.push(part);\n }\n\n if(usedLength < text.length) {\n arr.push(encodeEntities(text.slice(usedLength)));\n }\n\n return arr.join('');\n }\n\n export function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach(entity => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n \n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n }\n\n export function wrapDraftText(text: string, options: Partial<{\n entities: MessageEntity[]\n }> = {}) {\n if(!text) {\n return '';\n }\n\n return wrapRichText(text, {\n entities: options.entities, \n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n }\n\n export function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n }\n \n export function 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 export function wrapPlainText(text: string) {\n if(IS_EMOJI_SUPPORTED) {\n return text;\n }\n \n if(!text || !text.length) {\n return '';\n }\n \n text = text.replace(/\\ufe0f/g, '');\n var match;\n var raw = text;\n const arr: string[] = [];\n let emojiTitle;\n fullRegExp.lastIndex = 0;\n while((match = raw.match(fullRegExp))) {\n arr.push(raw.substr(0, match.index))\n if(match[8]) {\n // @ts-ignore\n const emojiCode = EmojiHelper.emojiMap[match[8]];\n if(emojiCode &&\n // @ts-ignore\n (emojiTitle = emojiData[emojiCode][1][0])) {\n arr.push(':' + emojiTitle + ':');\n } else {\n arr.push(match[0]);\n }\n } else {\n arr.push(match[0]);\n }\n \n raw = raw.substr(match.index + match[0].length);\n }\n arr.push(raw);\n return arr.join('');\n }\n\n export function wrapEmojiText(text: string, isDraft = false) {\n if(!text) return '';\n \n let entities = parseEntities(text).filter(e => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n }\n\n export function wrapUrl(url: string, unsafe?: number | boolean): {url: string, onclick: string} {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n \n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: string;\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?t(?:elegram)?\\.me\\/(.+)/))) {\n const fullPath = tgMeMatch[1];\n\n if(/^\\W/.test(fullPath)) {\n onclick = 'joinchat';\n return {url, onclick};\n }\n\n const path = fullPath.split('/');\n switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n onclick = path[0];\n break;\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1];\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n \n return {url, onclick};\n }\n\n export function matchUrlProtocol(text: string) {\n return !text ? null : text.match(urlAnyProtocolRegExp);\n }\n \n export function matchUrl(text: string) {\n return !text ? null : text.match(urlRegExp);\n }\n\n export function matchEmail(text: string) {\n return !text ? null : text.match(emailRegExp);\n }\n\n export function getAbbreviation(str: string, onlyFirst = false) {\n const splitted = str.trim().split(' ');\n if(!splitted[0]) return '';\n\n const first = [...splitted[0]][0];\n\n if(onlyFirst || splitted.length === 1) return wrapEmojiText(first);\n\n const last = [...splitted[splitted.length - 1]][0];\n\n return wrapEmojiText(first + last);\n }\n\n export function isUsernameValid(username: string) {\n return ((username.length >= 5 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n }\n\n export function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n }\n\n export function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n }\n}\n\nMOUNT_CLASS_TO.RichTextProcessor = RichTextProcessor;\n\nexport {RichTextProcessor};\nexport default RichTextProcessor;\n\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"mtproto.worker.e3c0dc69d0f5dd450f72.bundle.worker.js\");\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\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\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { LocalStorageProxyTask, LocalStorageProxyTaskResponse } from '../localStorage';\n//import type { LocalStorageProxyDeleteTask, LocalStorageProxySetTask } from '../storage';\nimport type { Awaited, InvokeApiOptions, WorkerTaskVoidTemplate } from '../../types';\nimport type { Config, InputFile, MethodDeclMap, User } from '../../layer';\nimport MTProtoWorker from 'worker-loader!./mtproto.worker';\n//import './mtproto.worker';\nimport { isObject } from '../../helpers/object';\nimport CryptoWorkerMethods from '../crypto/crypto_methods';\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport { ApiFileManager, DownloadOptions } from './apiFileManager';\nimport type { RequestFilePartTask, RequestFilePartTaskResponse, ServiceWorkerTask } from '../serviceWorker/index.service';\nimport { UserAuth } from './mtproto_config';\nimport type { MTMessage } from './networker';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport Socket from './transports/websocket';\nimport singleInstance from './singleInstance';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport AppStorage from '../storage';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport { SocketProxyTask } from './transports/socketProxied';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport { CacheStorageDbName } from '../cacheStorage';\nimport { pause } from '../../helpers/schedulers/pause';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\n\ntype Task = {\n taskId: number,\n task: string,\n args: any[]\n};\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport interface ToggleStorageTask extends WorkerTaskVoidTemplate {\n type: 'toggleStorage',\n payload: boolean\n};\n\nexport class ApiManagerProxy extends CryptoWorkerMethods {\n public worker: /* Window */Worker;\n private afterMessageIdTemp = 0;\n\n private taskId = 0;\n private awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskName: string\n }\n } = {} as any;\n private pending: Array = [];\n\n public updatesProcessor: (obj: any) => void = null;\n\n private log = logger('API-PROXY');\n\n private hashes: {[method: string]: HashOptions} = {};\n\n private apiPromisesSingle: {\n [q: string]: Promise\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n private isSWRegistered = true;\n\n private debug = DEBUG /* && false */;\n\n private sockets: Map = new Map();\n\n private taskListeners: {[taskType: string]: (task: any) => void} = {};\n private taskListenersSW: {[taskType: string]: (task: any) => void} = {};\n\n public onServiceWorkerFail: () => void;\n\n private postMessagesWaiting: any[][] = [];\n\n private getConfigPromise: Promise;\n\n constructor() {\n super();\n this.log('constructor');\n\n singleInstance.start();\n\n this.registerServiceWorker();\n\n this.addTaskListener('clear', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n AppStorage.toggleStorage(false), \n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map(cacheName => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n this.addTaskListener('connectionStatusChange', (task: any) => {\n rootScope.dispatchEvent('connection_status_change', task.payload);\n });\n\n this.addTaskListener('convertWebp', (task) => {\n webpWorkerController.postMessage(task);\n });\n\n this.addTaskListener('socketProxy', (task: SocketProxyTask) => {\n const socketTask = task.payload;\n const id = socketTask.id;\n //console.log('socketProxy', socketTask, id);\n\n if(socketTask.type === 'send') {\n const socket = this.sockets.get(id);\n socket.send(socketTask.payload);\n } else if(socketTask.type === 'close') { // will remove from map in onClose\n const socket = this.sockets.get(id);\n socket.close();\n } else if(socketTask.type === 'setup') {\n const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n \n const onOpen = () => {\n //console.log('socketProxy onOpen');\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'open',\n id\n }\n });\n };\n const onClose = () => {\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'close',\n id\n }\n });\n\n socket.removeEventListener('open', onOpen);\n socket.removeEventListener('close', onClose);\n socket.removeEventListener('message', onMessage);\n this.sockets.delete(id);\n };\n const onMessage = (buffer: ArrayBuffer) => {\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'message',\n id,\n payload: buffer\n }\n });\n };\n\n socket.addEventListener('open', onOpen);\n socket.addEventListener('close', onClose);\n socket.addEventListener('message', onMessage);\n this.sockets.set(id, socket);\n }\n });\n\n this.addTaskListener('localStorageProxy', (task: LocalStorageProxyTask) => {\n const storageTask = task.payload;\n // @ts-ignore\n sessionStorage[storageTask.type](...storageTask.args).then(res => {\n this.postMessage({\n type: 'localStorageProxy',\n id: task.id,\n payload: res\n } as LocalStorageProxyTaskResponse);\n });\n });\n\n rootScope.addEventListener('language_change', (language) => {\n this.performTaskWorkerVoid('setLanguage', language);\n });\n\n window.addEventListener('online', (event) => {\n this.forceReconnectTimeout();\n });\n\n \n this.registerWorker();\n \n\n setTimeout(() => {\n this.getConfig();\n }, 5000);\n }\n\n public isServiceWorkerOnline() {\n return this.isSWRegistered;\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n \n const worker = navigator.serviceWorker;\n worker.register('./sw.js', {scope: './'}).then(registration => {\n this.log('SW registered', registration);\n this.isSWRegistered = true;\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n //this.postSWMessage = worker.controller.postMessage.bind(worker.controller);\n\n \n \n \n \n }, (err) => {\n this.isSWRegistered = false;\n this.log.error('SW registration failed!', err);\n\n if(this.onServiceWorkerFail) {\n this.onServiceWorkerFail();\n }\n });\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n this.releasePending();\n\n worker.controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n worker.addEventListener('message', (e) => {\n const task: ServiceWorkerTask = e.data;\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListenersSW[task.type];\n if(callback) {\n callback(task);\n }\n });\n\n this.addServiceWorkerTaskListener('requestFilePart', (task: RequestFilePartTask) => {\n const responseTask: RequestFilePartTaskResponse = {\n type: task.type,\n id: task.id\n };\n \n this.performTaskWorker>>('requestFilePart', ...task.payload)\n .then((uploadFile) => {\n responseTask.payload = uploadFile;\n this.postSWMessage(responseTask);\n }, (err) => {\n responseTask.originalPayload = task.payload;\n responseTask.error = err;\n this.postSWMessage(responseTask);\n });\n });\n\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n public postMessage(...args: any[]) {\n this.postMessagesWaiting.push(args);\n }\n\n public postSWMessage(message: any) {\n if(navigator.serviceWorker.controller) {\n navigator.serviceWorker.controller.postMessage(message);\n }\n }\n\n private onWorkerFirstMessage(worker: any) {\n if(!this.worker) {\n this.worker = worker;\n this.log('set webWorker');\n\n this.postMessage = this.worker.postMessage.bind(this.worker);\n\n this.postMessagesWaiting.forEach(args => this.postMessage(...args));\n this.postMessagesWaiting.length = 0;\n\n const isWebpSupported = IS_WEBP_SUPPORTED;\n this.log('WebP supported:', isWebpSupported);\n this.postMessage({type: 'webpSupport', payload: isWebpSupported});\n this.postMessage({type: 'userAgent', payload: navigator.userAgent});\n\n this.releasePending();\n }\n }\n\n public addTaskListener(name: keyof ApiManagerProxy['taskListeners'], callback: ApiManagerProxy['taskListeners'][typeof name]) {\n this.taskListeners[name] = callback;\n }\n\n public addServiceWorkerTaskListener(name: keyof ApiManagerProxy['taskListenersSW'], callback: ApiManagerProxy['taskListenersSW'][typeof name]) {\n this.taskListenersSW[name] = callback;\n }\n\n private onWorkerMessage = (e: MessageEvent) => {\n //this.log('got message from worker:', e.data);\n\n const task = e.data;\n\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListeners[task.type];\n if(callback) {\n callback(task);\n return;\n }\n\n if(task.update) {\n if(this.updatesProcessor) {\n this.updatesProcessor(task.update);\n }\n } else if(task.progress) {\n rootScope.dispatchEvent('download_progress', task.progress);\n } else if(task.hasOwnProperty('result') || task.hasOwnProperty('error')) {\n this.finalizeTask(task.taskId, task.result, task.error);\n }\n };\n\n \n private registerWorker() {\n // return;\n\n const worker = new MTProtoWorker();\n //const worker = window;\n worker.addEventListener('message', this.onWorkerFirstMessage.bind(this, worker), {once: true});\n worker.addEventListener('message', this.onWorkerMessage);\n\n worker.addEventListener('error', (err) => {\n this.log.error('WORKER ERROR', err);\n });\n }\n \n\n private finalizeTask(taskId: number, result: any, error: any) {\n const deferred = this.awaiting[taskId];\n if(deferred !== undefined) {\n this.debug && this.log.debug('done', deferred.taskName, result, error);\n error ? deferred.reject(error) : deferred.resolve(result);\n delete this.awaiting[taskId];\n }\n }\n\n public performTaskWorkerVoid(task: string, ...args: any[]) {\n const params = {\n task,\n taskId: this.taskId,\n args\n };\n\n this.pending.push(params);\n this.releasePending();\n\n this.taskId++;\n }\n\n public performTaskWorker(task: string, ...args: any[]) {\n this.debug && this.log.debug('start', task, args);\n\n return new Promise((resolve, reject) => {\n this.awaiting[this.taskId] = {resolve, reject, taskName: task};\n this.performTaskWorkerVoid(task, ...args);\n });\n }\n\n private releasePending() {\n //return;\n\n if(this.postMessage) {\n this.debug && this.log.debug('releasing tasks, length:', this.pending.length);\n this.pending.forEach(pending => {\n this.postMessage(pending);\n });\n \n this.debug && this.log.debug('released tasks');\n this.pending.length = 0;\n }\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n //console.log('will invokeApi:', method, params, options);\n return this.performTaskWorker('invokeApi', method, params, options);\n }\n\n public invokeApiAfter(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n \n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n //console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable(method: T, params: Omit = {} as any, options: InvokeApiOptions = {}): Promise {\n //console.log('will invokeApi:', method, params, options);\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n (params as any).hash = cached.hash;\n }\n }\n\n return this.invokeApi(method, params, options).then((result: any) => {\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 return result;\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 if(this.apiPromisesSingle[q]) {\n return this.apiPromisesSingle[q];\n }\n\n return this.apiPromisesSingle[q] = this.invokeApi(method, params, options).finally(() => {\n delete this.apiPromisesSingle[q];\n });\n }\n\n public invokeApiCacheable(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = window.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n\n delete cache[queryJSON];\n }\n }\n }\n }\n\n /* private computeHash(smth: any[]) {\n smth = smth.slice().sort((a, b) => a.id - b.id);\n //return smth.reduce((hash, v) => (((hash * 0x4F25) & 0x7FFFFFFF) + v.id) & 0x7FFFFFFF, 0);\n return smth.reduce((hash, v) => ((hash * 20261) + 0x80000000 + v.id) % 0x80000000, 0);\n } */\n\n public setBaseDcId(dcId: number) {\n return this.performTaskWorker('setBaseDcId', dcId);\n }\n\n public setQueueId(queueId: number) {\n return this.performTaskWorker('setQueueId', queueId);\n }\n\n public setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n \n rootScope.dispatchEvent('user_auth', userAuth);\n return this.performTaskWorker('setUserAuth', userAuth);\n }\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n public getNetworker(dc_id: number, options?: InvokeApiOptions) {\n return this.performTaskWorker('getNetworker', dc_id, options);\n }\n\n public logOut(): Promise {\n // AppStorage.toggleStorage(false);\n return this.performTaskWorker('logOut');\n }\n\n public cancelDownload(fileName: string) {\n return this.performTaskWorker('cancelDownload', fileName);\n }\n\n public downloadFile(options: DownloadOptions) {\n return this.performTaskWorker('downloadFile', options);\n }\n\n public uploadFile(options: {file: Blob | File, fileName: string}) {\n return this.performTaskWorker('uploadFile', options);\n }\n\n public toggleStorage(enabled: boolean) {\n const task: ToggleStorageTask = {type: 'toggleStorage', payload: enabled};\n this.postMessage(task);\n this.postSWMessage(task);\n }\n\n public stopAll() {\n return this.performTaskWorkerVoid('stopAll');\n }\n\n public startAll() {\n return this.performTaskWorkerVoid('startAll');\n }\n\n public forceReconnectTimeout() {\n this.postMessage({type: 'online'});\n }\n\n public forceReconnect() {\n this.postMessage({type: 'forceReconnect'});\n }\n\n public getConfig() {\n if(this.getConfigPromise) return this.getConfigPromise;\n return this.getConfigPromise = this.invokeApi('help.getConfig').then(config => {\n rootScope.config = config;\n return config;\n });\n }\n}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Awaited } from \"../../types\";\r\nimport type { aesEncryptSync, aesDecryptSync, sha256HashSync, sha1HashSync, bytesModPow, hash_pbkdf2, rsaEncrypt, pqPrimeFactorization, gzipUncompress } from \"./crypto_utils\";\r\nimport type { computeSRP } from \"./srp\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1-hash': typeof sha1HashSync,\r\n 'sha256-hash': typeof sha256HashSync,\r\n 'pbkdf2': typeof hash_pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof pqPrimeFactorization,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker(task: string, ...args: any[]): Promise;\r\n\r\n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\r\n return this.performTaskWorker>>(method, ...args as any[]);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport calcImageInBox from \"./calcImageInBox\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport class MediaSize {\r\n constructor(public width = 0, public height = width) {\r\n\r\n }\r\n\r\n public aspect(boxSize: MediaSize, fitted: boolean) {\r\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\r\n }\r\n\r\n public aspectFitted(boxSize: MediaSize) {\r\n return this.aspect(boxSize, true);\r\n }\r\n\r\n public aspectCovered(boxSize: MediaSize) {\r\n return this.aspect(boxSize, false);\r\n }\r\n}\r\n\r\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\r\n return new MediaSize(width, height);\r\n}\r\n\r\ntype MediaTypeSizes = {\r\n regular: MediaSize,\r\n webpage: MediaSize,\r\n album: MediaSize,\r\n esgSticker: MediaSize,\r\n animatedSticker: MediaSize,\r\n staticSticker: MediaSize,\r\n emojiSticker: MediaSize,\r\n poll: MediaSize,\r\n round: MediaSize\r\n};\r\n\r\nexport enum ScreenSize {\r\n mobile,\r\n medium,\r\n large\r\n}\r\n\r\nconst MOBILE_SIZE = 600;\r\nconst MEDIUM_SIZE = 1275;\r\nconst LARGE_SIZE = 1680;\r\n\r\nclass MediaSizes extends EventListenerBase<{\r\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\r\n resize: () => void\r\n}> {\r\n private screenSizes: {key: ScreenSize, value: number}[] = [\r\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\r\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\r\n {key: ScreenSize.large, value: LARGE_SIZE}\r\n ];\r\n\r\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\r\n handhelds: {\r\n regular: makeMediaSize(270, 270),\r\n webpage: makeMediaSize(270, 200),\r\n album: makeMediaSize(270, 0),\r\n esgSticker: makeMediaSize(68, 68),\r\n animatedSticker: makeMediaSize(180, 180),\r\n staticSticker: makeMediaSize(180, 180),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(240, 0),\r\n round: makeMediaSize(200, 200)\r\n },\r\n desktop: {\r\n regular: makeMediaSize(420, 340),\r\n webpage: makeMediaSize(420, 340),\r\n album: makeMediaSize(420, 0),\r\n esgSticker: makeMediaSize(80, 80),\r\n animatedSticker: makeMediaSize(200, 200),\r\n staticSticker: makeMediaSize(200, 200),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(330, 0),\r\n round: makeMediaSize(280, 280)\r\n }\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 { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport I18n, { i18n } from \"../lib/langPack\";\r\nimport { capitalizeFirstLetter } from \"./string\";\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 formatFullSentTime(timestamp: number) {\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('Date.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = capitalizeFirstLetter(I18n.format('Yesterday', true));\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 const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true, \r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) + \r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) + \r\n joiner + date.getFullYear() + \r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\nexport function tsNow(seconds?: true) {\r\n const t = Date.now();\r\n return seconds ? t / 1000 | 0 : t;\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","/*\r\n * https://github.com/morethanwords/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 stringMiddleOverflow(str: string, maxLength: number) {\r\n return str.length > maxLength ? str.slice(0, maxLength / 2 | 0) + '...' + str.slice(-Math.round(maxLength / 2)) : str; \r\n} */\r\n\r\nexport function limitSymbols(str: string, length: number, limitFrom = length + 10) {\r\n str = str.trim();\r\n if(str.length > limitFrom) {\r\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\r\n }\r\n\r\n return str;\r\n}\r\n\r\n// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\r\nexport function escapeRegExp(str: string) {\r\n return str\r\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\r\n .replace(/-/g, '\\\\x2d');\r\n}\r\n\r\nexport function encodeEntities(value: string) {\r\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\r\n var hi = value.charCodeAt(0);\r\n var low = value.charCodeAt(1);\r\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\r\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\r\n return '&#' + value.charCodeAt(0) + ';';\r\n }).replace(//g, '>');\r\n}\r\n\r\nexport function splitStringByLength(str: string, maxLength: number) {\r\n if(str.length < maxLength) return [str];\r\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\r\n const delimiter = ' ';//'\\n';\r\n const out: string[] = [];\r\n\r\n const cut = (end?: number) => {\r\n let part = str.slice(lastSliceStartIndex, end);\r\n const _arrayIndex = arrayIndex++;\r\n if(part.length > maxLength) {\r\n let overflowPart = part.slice(maxLength);\r\n const splitted = splitStringByLength(overflowPart, maxLength);\r\n splitted.forEach(part => {\r\n out[arrayIndex++] = part;\r\n });\r\n\r\n part = part.slice(0, maxLength);\r\n }\r\n\r\n lastSliceStartIndex = end;\r\n length = 0;\r\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\r\n };\r\n\r\n let lastIndex = 0;\r\n do {\r\n let index = str.indexOf(delimiter, lastIndex);\r\n if(index === -1) {\r\n if(lastIndex !== (str.length - 1)) {\r\n cut();\r\n }\r\n\r\n break;\r\n }\r\n\r\n index += delimiter.length;\r\n\r\n const partLength = index - lastIndex;\r\n if((length + partLength) > maxLength) {\r\n cut(length);\r\n }\r\n \r\n lastIndex = index;\r\n length += partLength;\r\n } while(true);\r\n\r\n return out;\r\n}\r\n\r\n// https://stackoverflow.com/a/14824756\r\n/* export const checkRTL = (s: string) => { \r\n const ltrChars = 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF'+'\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF',\r\n rtlChars = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC',\r\n rtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']');\r\n\r\n return rtlDirCheck.test(s);\r\n}; */\r\n\r\n//(window as any).checkRTL = checkRTL;\r\n\r\nexport function convertInputKeyToKey(inputKey: string) {\r\n const str = inputKey.replace('input', '');\r\n return (str[0].toLowerCase() + str.slice(1)) as T;\r\n}\r\n\r\nexport function convertKeyToInputKey(key: string) {\r\n key = key[0].toUpperCase() + key.slice(1);\r\n key = 'input' + key;\r\n return key;\r\n}\r\n\r\nexport function capitalizeFirstLetter(string: string) {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n}\r\n","export const pause = (ms: number) => new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n});\r\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if (char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n let match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/1.5ce290a0391e0bae24df.chunk.js b/public/1.5ce290a0391e0bae24df.chunk.js new file mode 100644 index 000000000..922b86301 --- /dev/null +++ b/public/1.5ce290a0391e0bae24df.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[1],{121:function(f,e,d){"use strict";const t=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp");e.a=t},122:function(f,e,d){"use strict";d.d(e,"a",(function(){return a}));var t=d(37);function a(f,e,d,a,s=!0){if(fd/a?n=e*d/f|0:(c=f*a/e|0,c>d&&(n=n*d/c|0,c=d)),s&&c>=f&&n>=e&&(c=f,n=e),Object(t.c)(c,n)}d(29).a.calcImageInBox=a},131:function(f,e,d){"use strict";const t=new class{reload(){try{location.reload()}catch(f){}}close(){try{window.close()}catch(f){}}focus(){window.focus()}};e.a=t},132:function(f,e,d){"use strict";function t(f){const e=Date.now();return f?e/1e3|0:e}d.d(e,"a",(function(){return t}))},133:function(f,e,d){"use strict";var t=d(29);const a={Emoji:{2049:62748,2122:62776,2139:62801,2194:62678,2195:62677,2196:62676,2197:62670,2198:62672,2199:62674,2328:61155,2600:4954,2601:4962,2602:4977,2603:4982,2604:4984,2611:62764,2614:4978,2615:3750,2618:2639,2620:196,2622:62667,2623:62668,2626:62697,2638:62694,2639:168,2648:62702,2649:62703,2650:62710,2651:62711,2652:62712,2653:62713,2660:51057,2663:51060,2665:51058,2666:51059,2668:4832,2692:61258,2693:4887,2694:61261,2696:61272,2697:61280,2699:61270,2702:61245,2705:62763,2708:4895,2709:61206,2712:61220,2714:62765,2716:62742,2721:62693,2728:5993,2733:62771,2734:62772,2744:4981,2747:62773,2753:62749,2754:62750,2755:62751,2757:62752,2763:1127,2764:1129,2795:62743,2796:62744,2797:62745,2934:62681,2935:62682,3030:62753,3297:62825,3299:62826,"0023-20e3":62777,"002a-20e3":62778,"0030-20e3":62779,"0031-20e3":62780,"0032-20e3":62781,"0033-20e3":62782,"0034-20e3":62783,"0035-20e3":62784,"0036-20e3":62785,"0037-20e3":62786,"0038-20e3":62787,"0039-20e3":62788,"00a9":62774,"00ae":62775,"1f004":51063,"1f0cf":51062,"1f170":62795,"1f171":62797,"1f17e":62806,"1f17f":62808,"1f18e":62796,"1f191":62798,"1f192":62799,"1f193":62800,"1f194":62802,"1f195":62804,"1f196":62805,"1f197":62807,"1f198":62809,"1f199":62810,"1f19a":62811,"1f1e6-1f1e8":71550,"1f1e6-1f1e9":71551,"1f1e6-1f1ea":71552,"1f1e6-1f1eb":71553,"1f1e6-1f1ec":71554,"1f1e6-1f1ee":71555,"1f1e6-1f1f1":71556,"1f1e6-1f1f2":71557,"1f1e6-1f1f4":71558,"1f1e6-1f1f6":71559,"1f1e6-1f1f7":71560,"1f1e6-1f1f8":71561,"1f1e6-1f1f9":71562,"1f1e6-1f1fa":71563,"1f1e6-1f1fc":71564,"1f1e6-1f1fd":71565,"1f1e6-1f1ff":71566,"1f1e7-1f1e6":71567,"1f1e7-1f1e7":71568,"1f1e7-1f1e9":71569,"1f1e7-1f1ea":71570,"1f1e7-1f1eb":71571,"1f1e7-1f1ec":71572,"1f1e7-1f1ed":71573,"1f1e7-1f1ee":71574,"1f1e7-1f1ef":71575,"1f1e7-1f1f1":71576,"1f1e7-1f1f2":71577,"1f1e7-1f1f3":71578,"1f1e7-1f1f4":71579,"1f1e7-1f1f6":71580,"1f1e7-1f1f7":71581,"1f1e7-1f1f8":71582,"1f1e7-1f1f9":71583,"1f1e7-1f1fb":71584,"1f1e7-1f1fc":71585,"1f1e7-1f1fe":71586,"1f1e7-1f1ff":71587,"1f1e8-1f1e6":71588,"1f1e8-1f1e8":71589,"1f1e8-1f1e9":71590,"1f1e8-1f1eb":71591,"1f1e8-1f1ec":71592,"1f1e8-1f1ed":71593,"1f1e8-1f1ee":71594,"1f1e8-1f1f0":71595,"1f1e8-1f1f1":71596,"1f1e8-1f1f2":71597,"1f1e8-1f1f3":71598,"1f1e8-1f1f4":71599,"1f1e8-1f1f5":71600,"1f1e8-1f1f7":71601,"1f1e8-1f1fa":71602,"1f1e8-1f1fb":71603,"1f1e8-1f1fc":71604,"1f1e8-1f1fd":71605,"1f1e8-1f1fe":71606,"1f1e8-1f1ff":71607,"1f1e9-1f1ea":71608,"1f1e9-1f1ec":71609,"1f1e9-1f1ef":71610,"1f1e9-1f1f0":71611,"1f1e9-1f1f2":71612,"1f1e9-1f1f4":71613,"1f1e9-1f1ff":71614,"1f1ea-1f1e6":71615,"1f1ea-1f1e8":71616,"1f1ea-1f1ea":71617,"1f1ea-1f1ec":71618,"1f1ea-1f1ed":71619,"1f1ea-1f1f7":71620,"1f1ea-1f1f8":71621,"1f1ea-1f1f9":71622,"1f1ea-1f1fa":71623,"1f1eb-1f1ee":71624,"1f1eb-1f1ef":71625,"1f1eb-1f1f0":71626,"1f1eb-1f1f2":71627,"1f1eb-1f1f4":71628,"1f1eb-1f1f7":71629,"1f1ec-1f1e6":71630,"1f1ec-1f1e7":71631,"1f1ec-1f1e9":71632,"1f1ec-1f1ea":71633,"1f1ec-1f1eb":71634,"1f1ec-1f1ec":71635,"1f1ec-1f1ed":71636,"1f1ec-1f1ee":71637,"1f1ec-1f1f1":71638,"1f1ec-1f1f2":71639,"1f1ec-1f1f3":71640,"1f1ec-1f1f5":71641,"1f1ec-1f1f6":71642,"1f1ec-1f1f7":71643,"1f1ec-1f1f8":71644,"1f1ec-1f1f9":71645,"1f1ec-1f1fa":71646,"1f1ec-1f1fc":71647,"1f1ec-1f1fe":71648,"1f1ed-1f1f0":71649,"1f1ed-1f1f2":71650,"1f1ed-1f1f3":71651,"1f1ed-1f1f7":71652,"1f1ed-1f1f9":71653,"1f1ed-1f1fa":71654,"1f1ee-1f1e8":71655,"1f1ee-1f1e9":71656,"1f1ee-1f1ea":71657,"1f1ee-1f1f1":71658,"1f1ee-1f1f2":71659,"1f1ee-1f1f3":71660,"1f1ee-1f1f4":71661,"1f1ee-1f1f6":71662,"1f1ee-1f1f7":71663,"1f1ee-1f1f8":71664,"1f1ee-1f1f9":71665,"1f1ef-1f1ea":71666,"1f1ef-1f1f2":71667,"1f1ef-1f1f4":71668,"1f1ef-1f1f5":71669,"1f1f0-1f1ea":71670,"1f1f0-1f1ec":71671,"1f1f0-1f1ed":71672,"1f1f0-1f1ee":71673,"1f1f0-1f1f2":71674,"1f1f0-1f1f3":71675,"1f1f0-1f1f5":71676,"1f1f0-1f1f7":71677,"1f1f0-1f1fc":71678,"1f1f0-1f1fe":71679,"1f1f0-1f1ff":71680,"1f1f1-1f1e6":71681,"1f1f1-1f1e7":71682,"1f1f1-1f1e8":71683,"1f1f1-1f1ee":71684,"1f1f1-1f1f0":71685,"1f1f1-1f1f7":71686,"1f1f1-1f1f8":71687,"1f1f1-1f1f9":71688,"1f1f1-1f1fa":71689,"1f1f1-1f1fb":71690,"1f1f1-1f1fe":71691,"1f1f2-1f1e6":71692,"1f1f2-1f1e8":71693,"1f1f2-1f1e9":71694,"1f1f2-1f1ea":71695,"1f1f2-1f1eb":71696,"1f1f2-1f1ec":71697,"1f1f2-1f1ed":71698,"1f1f2-1f1f0":71699,"1f1f2-1f1f1":71700,"1f1f2-1f1f2":71701,"1f1f2-1f1f3":71702,"1f1f2-1f1f4":71703,"1f1f2-1f1f5":71704,"1f1f2-1f1f6":71705,"1f1f2-1f1f7":71706,"1f1f2-1f1f8":71707,"1f1f2-1f1f9":71708,"1f1f2-1f1fa":71709,"1f1f2-1f1fb":71710,"1f1f2-1f1fc":71711,"1f1f2-1f1fd":71712,"1f1f2-1f1fe":71713,"1f1f2-1f1ff":71714,"1f1f3-1f1e6":71715,"1f1f3-1f1e8":71716,"1f1f3-1f1ea":71717,"1f1f3-1f1eb":71718,"1f1f3-1f1ec":71719,"1f1f3-1f1ee":71720,"1f1f3-1f1f1":71721,"1f1f3-1f1f4":71722,"1f1f3-1f1f5":71723,"1f1f3-1f1f7":71724,"1f1f3-1f1fa":71725,"1f1f3-1f1ff":71726,"1f1f4-1f1f2":71727,"1f1f5-1f1e6":71728,"1f1f5-1f1ea":71729,"1f1f5-1f1eb":71730,"1f1f5-1f1ec":71731,"1f1f5-1f1ed":71732,"1f1f5-1f1f0":71733,"1f1f5-1f1f1":71734,"1f1f5-1f1f2":71735,"1f1f5-1f1f3":71736,"1f1f5-1f1f7":71737,"1f1f5-1f1f8":71738,"1f1f5-1f1f9":71739,"1f1f5-1f1fc":71740,"1f1f5-1f1fe":71741,"1f1f6-1f1e6":71742,"1f1f7-1f1ea":71743,"1f1f7-1f1f4":71744,"1f1f7-1f1f8":71745,"1f1f7-1f1fa":71746,"1f1f7-1f1fc":71747,"1f1f8-1f1e6":71748,"1f1f8-1f1e7":71749,"1f1f8-1f1e8":71750,"1f1f8-1f1e9":71751,"1f1f8-1f1ea":71752,"1f1f8-1f1ec":71753,"1f1f8-1f1ed":71754,"1f1f8-1f1ee":71755,"1f1f8-1f1ef":71756,"1f1f8-1f1f0":71757,"1f1f8-1f1f1":71758,"1f1f8-1f1f2":71759,"1f1f8-1f1f3":71760,"1f1f8-1f1f4":71761,"1f1f8-1f1f7":71762,"1f1f8-1f1f8":71763,"1f1f8-1f1f9":71764,"1f1f8-1f1fb":71765,"1f1f8-1f1fd":71766,"1f1f8-1f1fe":71767,"1f1f8-1f1ff":71768,"1f1f9-1f1e6":71769,"1f1f9-1f1e8":71770,"1f1f9-1f1e9":71771,"1f1f9-1f1eb":71772,"1f1f9-1f1ec":71773,"1f1f9-1f1ed":71774,"1f1f9-1f1ef":71775,"1f1f9-1f1f0":71776,"1f1f9-1f1f1":71777,"1f1f9-1f1f2":71778,"1f1f9-1f1f3":71779,"1f1f9-1f1f4":71780,"1f1f9-1f1f7":71781,"1f1f9-1f1f9":71782,"1f1f9-1f1fb":71783,"1f1f9-1f1fc":71784,"1f1f9-1f1ff":71785,"1f1fa-1f1e6":71786,"1f1fa-1f1ec":71787,"1f1fa-1f1f2":71788,"1f1fa-1f1f3":71789,"1f1fa-1f1f8":71790,"1f1fa-1f1fe":71791,"1f1fa-1f1ff":71792,"1f1fb-1f1e6":71793,"1f1fb-1f1e8":71794,"1f1fb-1f1ea":71795,"1f1fb-1f1ec":71796,"1f1fb-1f1ee":71797,"1f1fb-1f1f3":71798,"1f1fb-1f1fa":71799,"1f1fc-1f1eb":71800,"1f1fc-1f1f8":71801,"1f1fd-1f1f0":71802,"1f1fe-1f1ea":71803,"1f1fe-1f1f9":71804,"1f1ff-1f1e6":71805,"1f1ff-1f1f2":71806,"1f1ff-1f1fc":71807,"1f201":62812,"1f202":62813,"1f21a":62819,"1f22f":62816,"1f232":62820,"1f233":62824,"1f234":62823,"1f235":62828,"1f236":62815,"1f237":62814,"1f238":62822,"1f239":62818,"1f23a":62827,"1f250":62817,"1f251":62821,"1f300":4974,"1f301":4824,"1f302":4976,"1f303":4825,"1f304":4827,"1f305":4828,"1f306":4829,"1f307":4830,"1f308":4975,"1f309":4831,"1f30a":4987,"1f30b":4782,"1f30c":4961,"1f30d":4773,"1f30e":4774,"1f30f":4775,"1f310":4776,"1f311":4941,"1f312":4942,"1f313":4943,"1f314":4944,"1f315":4945,"1f316":4946,"1f317":4947,"1f318":4948,"1f319":4949,"1f31a":4950,"1f31b":4951,"1f31c":4952,"1f31d":4955,"1f31e":4956,"1f31f":4959,"1f320":4960,"1f321":4953,"1f324":4965,"1f325":4966,"1f326":4967,"1f327":4968,"1f328":4969,"1f329":4970,"1f32a":4971,"1f32b":4972,"1f32c":4973,"1f32d":3694,"1f32e":3696,"1f32f":3697,"1f330":3677,"1f331":2631,"1f332":2633,"1f333":2634,"1f334":2635,"1f335":2636,"1f336":3668,"1f337":2630,"1f338":2622,"1f339":2625,"1f33a":2627,"1f33b":2628,"1f33c":2629,"1f33d":3667,"1f33e":2637,"1f33f":2638,"1f340":2640,"1f341":2641,"1f342":2642,"1f343":2643,"1f344":3675,"1f345":3660,"1f346":3664,"1f347":3644,"1f348":3645,"1f349":3646,"1f34a":3647,"1f34b":3648,"1f34c":3649,"1f34d":3650,"1f34e":3652,"1f34f":3653,"1f350":3654,"1f351":3655,"1f352":3656,"1f353":3657,"1f354":3691,"1f355":3693,"1f356":3687,"1f357":3688,"1f358":3713,"1f359":3714,"1f35a":3715,"1f35b":3716,"1f35c":3717,"1f35d":3718,"1f35e":3678,"1f35f":3692,"1f360":3719,"1f361":3725,"1f362":3720,"1f363":3721,"1f364":3722,"1f365":3723,"1f366":3734,"1f367":3735,"1f368":3736,"1f369":3737,"1f36a":3738,"1f36b":3743,"1f36c":3744,"1f36d":3745,"1f36e":3746,"1f36f":3747,"1f370":3740,"1f371":3712,"1f372":3704,"1f373":3702,"1f374":3769,"1f375":3752,"1f376":3753,"1f377":3755,"1f378":3756,"1f379":3757,"1f37a":3758,"1f37b":3759,"1f37c":3748,"1f37d":3768,"1f37e":3754,"1f37f":3708,"1f380":51004,"1f381":51005,"1f382":3739,"1f383":5988,"1f384":5989,"1f385":1490,"1f386":5990,"1f387":5991,"1f388":5994,"1f389":5995,"1f38a":5996,"1f38b":5997,"1f38c":71544,"1f38d":5998,"1f38e":5999,"1f38f":51e3,"1f390":51001,"1f391":51002,"1f392":61096,"1f393":61109,"1f396":51009,"1f397":51006,"1f399":61129,"1f39a":61130,"1f39b":61131,"1f39e":61164,"1f39f":51007,"1f3a0":4833,"1f3a1":4834,"1f3a2":4835,"1f3a3":51036,"1f3a4":61132,"1f3a5":61163,"1f3a6":62733,"1f3a7":61133,"1f3a8":51067,"1f3a9":61108,"1f3aa":4837,"1f3ab":51008,"1f3ac":61166,"1f3ad":51065,"1f3ae":51049,"1f3af":51042,"1f3b0":51051,"1f3b1":51045,"1f3b2":51052,"1f3b3":51024,"1f3b4":51064,"1f3b5":61127,"1f3b6":61128,"1f3b7":61135,"1f3b8":61137,"1f3b9":61138,"1f3ba":61139,"1f3bb":61140,"1f3bc":61126,"1f3bd":51038,"1f3be":51022,"1f3bf":51039,"1f3c0":51018,"1f3c1":71542,"1f3c2":1562,"1f3c3-200d-2640":1546,"1f3c3-200d-2642":1545,"1f3c3":1544,"1f3c4-200d-2640":1568,"1f3c4-200d-2642":1567,"1f3c4":1566,"1f3c5":51011,"1f3c6":51010,"1f3c7":1560,"1f3c8":51020,"1f3c9":51021,"1f3ca-200d-2640":1574,"1f3ca-200d-2642":1573,"1f3ca":1572,"1f3cb-200d-2640":1580,"1f3cb-200d-2642":1579,"1f3cb":1578,"1f3cc-200d-2640":1565,"1f3cc-200d-2642":1564,"1f3cc":1563,"1f3cd":4868,"1f3ce":4867,"1f3cf":51025,"1f3d0":51019,"1f3d1":51026,"1f3d2":51027,"1f3d3":51029,"1f3d4":4780,"1f3d5":4784,"1f3d6":4785,"1f3d7":4791,"1f3d8":4796,"1f3d9":4826,"1f3da":4797,"1f3db":4790,"1f3dc":4786,"1f3dd":4787,"1f3de":4788,"1f3df":4789,"1f3e0":4798,"1f3e1":4799,"1f3e2":4800,"1f3e3":4801,"1f3e4":4802,"1f3e5":4803,"1f3e6":4804,"1f3e7":62643,"1f3e8":4805,"1f3e9":4806,"1f3ea":4807,"1f3eb":4808,"1f3ec":4809,"1f3ed":4810,"1f3ee":61177,"1f3ef":4811,"1f3f0":4812,"1f3f3-200d-1f308":71547,"1f3f3-200d-26a7":71548,"1f3f3":71546,"1f3f4-200d-2620":71549,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71808,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71809,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71810,"1f3f4":71545,"1f3f5":2624,"1f3f7":61195,"1f3f8":51030,"1f3f9":61264,"1f3fa":3772,"1f3fb":9499,"1f3fc":9500,"1f3fd":9501,"1f3fe":9502,"1f3ff":9503,"1f400":2550,"1f401":2549,"1f402":2530,"1f403":2531,"1f404":2532,"1f405":2521,"1f406":2522,"1f407":2553,"1f408-200d-2b1b":2518,"1f408":2517,"1f409":2592,"1f40a":2587,"1f40b":2596,"1f40c":2605,"1f40d":2590,"1f40e":2524,"1f40f":2537,"1f410":2539,"1f411":2538,"1f412":2505,"1f413":2570,"1f414":2569,"1f415-200d-1f9ba":2511,"1f415":2509,"1f416":2534,"1f417":2535,"1f418":2544,"1f419":2603,"1f41a":2604,"1f41b":2607,"1f41c":2608,"1f41d":2609,"1f41e":2611,"1f41f":2599,"1f420":2600,"1f421":2601,"1f422":2588,"1f423":2571,"1f424":2572,"1f425":2573,"1f426":2574,"1f427":2575,"1f428":2560,"1f429":2512,"1f42a":2540,"1f42b":2541,"1f42c":2597,"1f42d":2548,"1f42e":2529,"1f42f":2520,"1f430":2552,"1f431":2516,"1f432":2591,"1f433":2595,"1f434":2523,"1f435":2504,"1f436":2508,"1f437":2533,"1f438":2586,"1f439":2551,"1f43a":2513,"1f43b-200d-2744":2559,"1f43b":2558,"1f43c":2561,"1f43d":2536,"1f43e":2567,"1f43f":2554,"1f440":1350,"1f441-200d-1f5e8":1147,"1f441":1351,"1f442":1342,"1f443":1344,"1f444":1353,"1f445":1352,"1f446":1318,"1f447":1320,"1f448":1316,"1f449":1317,"1f44a":1325,"1f44b":1303,"1f44c":1308,"1f44d":1322,"1f44e":1323,"1f44f":1328,"1f450":1330,"1f451":61106,"1f452":61107,"1f453":61072,"1f454":61077,"1f455":61078,"1f456":61079,"1f457":61084,"1f458":61085,"1f459":61090,"1f45a":61091,"1f45b":61092,"1f45c":61093,"1f45d":61094,"1f45e":61098,"1f45f":61099,"1f460":61102,"1f461":61103,"1f462":61105,"1f463":1649,"1f464":1646,"1f465":1647,"1f466":1356,"1f467":1357,"1f468-200d-1f33e":1423,"1f468-200d-1f373":1426,"1f468-200d-1f37c":1487,"1f468-200d-1f393":1414,"1f468-200d-1f3a4":1444,"1f468-200d-1f3a8":1447,"1f468-200d-1f3eb":1417,"1f468-200d-1f3ed":1432,"1f468-200d-1f466-200d-1f466":1636,"1f468-200d-1f466":1635,"1f468-200d-1f467-200d-1f466":1638,"1f468-200d-1f467-200d-1f467":1639,"1f468-200d-1f467":1637,"1f468-200d-1f468-200d-1f466":1625,"1f468-200d-1f468-200d-1f466-200d-1f466":1628,"1f468-200d-1f468-200d-1f467":1626,"1f468-200d-1f468-200d-1f467-200d-1f466":1627,"1f468-200d-1f468-200d-1f467-200d-1f467":1629,"1f468-200d-1f469-200d-1f466":1620,"1f468-200d-1f469-200d-1f466-200d-1f466":1623,"1f468-200d-1f469-200d-1f467":1621,"1f468-200d-1f469-200d-1f467-200d-1f466":1622,"1f468-200d-1f469-200d-1f467-200d-1f467":1624,"1f468-200d-1f4bb":1441,"1f468-200d-1f4bc":1435,"1f468-200d-1f527":1429,"1f468-200d-1f52c":1438,"1f468-200d-1f680":1453,"1f468-200d-1f692":1456,"1f468-200d-1f9af":1536,"1f468-200d-1f9b0":1362,"1f468-200d-1f9b1":1363,"1f468-200d-1f9b2":1365,"1f468-200d-1f9b3":1364,"1f468-200d-1f9bc":1539,"1f468-200d-1f9bd":1542,"1f468-200d-2695":1411,"1f468-200d-2696":1420,"1f468-200d-2708":1450,"1f468-200d-2764-200d-1f468":1617,"1f468-200d-2764-200d-1f48b-200d-1f468":1613,"1f468":1360,"1f469-200d-1f33e":1424,"1f469-200d-1f373":1427,"1f469-200d-1f37c":1486,"1f469-200d-1f393":1415,"1f469-200d-1f3a4":1445,"1f469-200d-1f3a8":1448,"1f469-200d-1f3eb":1418,"1f469-200d-1f3ed":1433,"1f469-200d-1f466-200d-1f466":1641,"1f469-200d-1f466":1640,"1f469-200d-1f467-200d-1f466":1643,"1f469-200d-1f467-200d-1f467":1644,"1f469-200d-1f467":1642,"1f469-200d-1f469-200d-1f466":1630,"1f469-200d-1f469-200d-1f466-200d-1f466":1633,"1f469-200d-1f469-200d-1f467":1631,"1f469-200d-1f469-200d-1f467-200d-1f466":1632,"1f469-200d-1f469-200d-1f467-200d-1f467":1634,"1f469-200d-1f4bb":1442,"1f469-200d-1f4bc":1436,"1f469-200d-1f527":1430,"1f469-200d-1f52c":1439,"1f469-200d-1f680":1454,"1f469-200d-1f692":1457,"1f469-200d-1f9af":1537,"1f469-200d-1f9b0":1367,"1f469-200d-1f9b1":1369,"1f469-200d-1f9b2":1373,"1f469-200d-1f9b3":1371,"1f469-200d-1f9bc":1540,"1f469-200d-1f9bd":1543,"1f469-200d-2695":1412,"1f469-200d-2696":1421,"1f469-200d-2708":1451,"1f469-200d-2764-200d-1f468":1616,"1f469-200d-2764-200d-1f469":1618,"1f469-200d-2764-200d-1f48b-200d-1f468":1612,"1f469-200d-2764-200d-1f48b-200d-1f469":1614,"1f469":1366,"1f46a":1619,"1f46b":1609,"1f46c":1610,"1f46d":1608,"1f46e-200d-2640":1460,"1f46e-200d-2642":1459,"1f46e":1458,"1f46f-200d-2640":1552,"1f46f-200d-2642":1551,"1f46f":1550,"1f470-200d-2640":1483,"1f470-200d-2642":1482,"1f470":1481,"1f471-200d-2640":1375,"1f471-200d-2642":1376,"1f471":1359,"1f472":1476,"1f473-200d-2640":1475,"1f473-200d-2642":1474,"1f473":1473,"1f474":1378,"1f475":1379,"1f476":1354,"1f477-200d-2640":1470,"1f477-200d-2642":1469,"1f477":1468,"1f478":1472,"1f479":199,"1f47a":1100,"1f47b":1101,"1f47c":1489,"1f47d":1102,"1f47e":1103,"1f47f":194,"1f480":195,"1f481-200d-2640":1394,"1f481-200d-2642":1393,"1f481":1392,"1f482-200d-2640":1466,"1f482-200d-2642":1465,"1f482":1464,"1f483":1547,"1f484":61114,"1f485":1335,"1f486-200d-2640":1522,"1f486-200d-2642":1521,"1f486":1520,"1f487-200d-2640":1525,"1f487-200d-2642":1524,"1f487":1523,"1f488":4836,"1f489":61287,"1f48a":61289,"1f48b":1117,"1f48c":1118,"1f48d":61115,"1f48e":61116,"1f48f":1611,"1f490":2621,"1f491":1615,"1f492":4813,"1f493":1123,"1f494":1128,"1f495":1125,"1f496":1121,"1f497":1122,"1f498":1119,"1f499":1133,"1f49a":1132,"1f49b":1131,"1f49c":1134,"1f49d":1120,"1f49e":1124,"1f49f":1126,"1f4a0":62859,"1f4a1":61175,"1f4a2":1139,"1f4a3":1145,"1f4a4":1151,"1f4a5":1140,"1f4a6":1142,"1f4a7":4986,"1f4a8":1143,"1f4a9":197,"1f4aa":1337,"1f4ab":1141,"1f4ac":1146,"1f4ad":1150,"1f4ae":2623,"1f4af":1138,"1f4b0":61196,"1f4b1":62754,"1f4b2":62755,"1f4b3":61203,"1f4b4":61198,"1f4b5":61199,"1f4b6":61200,"1f4b7":61201,"1f4b8":61202,"1f4b9":61205,"1f4ba":4900,"1f4bb":61152,"1f4bc":61226,"1f4bd":61158,"1f4be":61159,"1f4bf":61160,"1f4c0":61161,"1f4c1":61227,"1f4c2":61228,"1f4c3":61188,"1f4c4":61190,"1f4c5":61230,"1f4c6":61231,"1f4c7":61234,"1f4c8":61235,"1f4c9":61236,"1f4ca":61237,"1f4cb":61238,"1f4cc":61239,"1f4cd":61240,"1f4ce":61241,"1f4cf":61243,"1f4d0":61244,"1f4d1":61193,"1f4d2":61187,"1f4d3":61186,"1f4d4":61179,"1f4d5":61180,"1f4d6":61181,"1f4d7":61182,"1f4d8":61183,"1f4d9":61184,"1f4da":61185,"1f4db":62760,"1f4dc":61189,"1f4dd":61225,"1f4de":61147,"1f4df":61148,"1f4e0":61149,"1f4e1":61286,"1f4e2":61121,"1f4e3":61122,"1f4e4":61210,"1f4e5":61211,"1f4e6":61212,"1f4e7":61207,"1f4e8":61208,"1f4e9":61209,"1f4ea":61214,"1f4eb":61213,"1f4ec":61215,"1f4ed":61216,"1f4ee":61217,"1f4ef":61123,"1f4f0":61191,"1f4f1":61144,"1f4f2":61145,"1f4f3":62737,"1f4f4":62738,"1f4f5":62665,"1f4f6":62736,"1f4f7":61168,"1f4f8":61169,"1f4f9":61170,"1f4fa":61167,"1f4fb":61134,"1f4fc":61171,"1f4fd":61165,"1f4ff":61113,"1f500":62715,"1f501":62716,"1f502":62717,"1f503":62683,"1f504":62684,"1f505":62734,"1f506":62735,"1f507":61117,"1f508":61118,"1f509":61119,"1f50a":61120,"1f50b":61150,"1f50c":61151,"1f50d":61172,"1f50e":61173,"1f50f":61251,"1f510":61252,"1f511":61253,"1f512":61249,"1f513":61250,"1f514":61124,"1f515":61125,"1f516":61194,"1f517":61274,"1f518":62860,"1f519":62685,"1f51a":62686,"1f51b":62687,"1f51c":62688,"1f51d":62689,"1f51e":62666,"1f51f":62789,"1f520":62790,"1f521":62791,"1f522":62792,"1f523":62793,"1f524":62794,"1f525":4985,"1f526":61176,"1f527":61267,"1f528":61255,"1f529":61269,"1f52a":3771,"1f52b":61262,"1f52c":61284,"1f52d":61285,"1f52e":51046,"1f52f":62701,"1f530":62761,"1f531":62759,"1f532":62862,"1f533":62861,"1f534":62829,"1f535":62833,"1f536":62853,"1f537":62854,"1f538":62855,"1f539":62856,"1f53a":62857,"1f53b":62858,"1f53c":62725,"1f53d":62727,"1f549":62692,"1f54a":2576,"1f54b":4821,"1f54c":4817,"1f54d":4819,"1f54e":62700,"1f550":4919,"1f551":4921,"1f552":4923,"1f553":4925,"1f554":4927,"1f555":4929,"1f556":4931,"1f557":4933,"1f558":4935,"1f559":4937,"1f55a":4939,"1f55b":4917,"1f55c":4920,"1f55d":4922,"1f55e":4924,"1f55f":4926,"1f560":4928,"1f561":4930,"1f562":4932,"1f563":4934,"1f564":4936,"1f565":4938,"1f566":4940,"1f567":4918,"1f56f":61174,"1f570":4916,"1f573":1144,"1f574":1549,"1f575-200d-2640":1463,"1f575-200d-2642":1462,"1f575":1461,"1f576":61073,"1f577":2614,"1f578":2615,"1f579":51050,"1f57a":1548,"1f587":61242,"1f58a":61222,"1f58b":61221,"1f58c":61223,"1f58d":61224,"1f590":1305,"1f595":1319,"1f596":1307,"1f5a4":1136,"1f5a5":61153,"1f5a8":61154,"1f5b1":61156,"1f5b2":61157,"1f5bc":51066,"1f5c2":61229,"1f5c3":61246,"1f5c4":61247,"1f5d1":61248,"1f5d2":61232,"1f5d3":61233,"1f5dc":61271,"1f5dd":61254,"1f5de":61192,"1f5e1":61260,"1f5e3":1645,"1f5e8":1148,"1f5ef":1149,"1f5f3":61218,"1f5fa":4777,"1f5fb":4783,"1f5fc":4814,"1f5fd":4815,"1f5fe":4778,"1f5ff":61320,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":113,"1f608":193,"1f609":111,"1f60a":112,"1f60b":123,"1f60c":143,"1f60d":115,"1f60e":162,"1f60f":138,"1f610":135,"1f611":136,"1f612":139,"1f613":185,"1f614":144,"1f615":165,"1f616":182,"1f617":118,"1f618":117,"1f619":121,"1f61a":120,"1f61b":124,"1f61c":125,"1f61d":127,"1f61e":184,"1f61f":166,"1f620":191,"1f621":190,"1f622":179,"1f623":183,"1f624":189,"1f625":178,"1f626":174,"1f627":175,"1f628":176,"1f629":186,"1f62a":145,"1f62b":187,"1f62c":141,"1f62d":180,"1f62e":169,"1f62f":170,"1f630":177,"1f631":181,"1f632":171,"1f633":172,"1f634":147,"1f635":157,"1f636":137,"1f637":148,"1f638":1106,"1f639":1107,"1f63a":1105,"1f63b":1108,"1f63c":1109,"1f63d":1110,"1f63e":1113,"1f63f":1112,"1f640":1111,"1f641":167,"1f642":19,"1f643":110,"1f644":140,"1f645-200d-2640":1388,"1f645-200d-2642":1387,"1f645":1386,"1f646-200d-2640":1391,"1f646-200d-2642":1390,"1f646":1389,"1f647-200d-2640":1403,"1f647-200d-2642":1402,"1f647":1401,"1f648":1114,"1f649":1115,"1f64a":1116,"1f64b-200d-2640":1397,"1f64b-200d-2642":1396,"1f64b":1395,"1f64c":1329,"1f64d-200d-2640":1382,"1f64d-200d-2642":1381,"1f64d":1380,"1f64e-200d-2640":1385,"1f64e-200d-2642":1384,"1f64e":1383,"1f64f":1333,"1f680":4906,"1f681":4901,"1f682":4838,"1f683":4839,"1f684":4840,"1f685":4841,"1f686":4842,"1f687":4843,"1f688":4844,"1f689":4845,"1f68a":4846,"1f68b":4849,"1f68c":4850,"1f68d":4851,"1f68e":4852,"1f68f":4877,"1f690":4853,"1f691":4854,"1f692":4855,"1f693":4856,"1f694":4857,"1f695":4858,"1f696":4859,"1f697":4860,"1f698":4861,"1f699":4862,"1f69a":4864,"1f69b":4865,"1f69c":4866,"1f69d":4847,"1f69e":4848,"1f69f":4902,"1f6a0":4903,"1f6a1":4904,"1f6a2":4894,"1f6a3-200d-2640":1571,"1f6a3-200d-2642":1570,"1f6a3":1569,"1f6a4":4890,"1f6a5":4883,"1f6a6":4884,"1f6a7":4886,"1f6a8":4882,"1f6a9":71543,"1f6aa":61292,"1f6ab":62659,"1f6ac":61316,"1f6ad":62661,"1f6ae":62644,"1f6af":62662,"1f6b0":62645,"1f6b1":62663,"1f6b2":4873,"1f6b3":62660,"1f6b4-200d-2640":1583,"1f6b4-200d-2642":1582,"1f6b4":1581,"1f6b5-200d-2640":1586,"1f6b5-200d-2642":1585,"1f6b5":1584,"1f6b6-200d-2640":1528,"1f6b6-200d-2642":1527,"1f6b6":1526,"1f6b7":62664,"1f6b8":62657,"1f6b9":62647,"1f6ba":62648,"1f6bb":62649,"1f6bc":62650,"1f6bd":61299,"1f6be":62651,"1f6bf":61301,"1f6c0":1605,"1f6c1":61302,"1f6c2":62652,"1f6c3":62653,"1f6c4":62654,"1f6c5":62655,"1f6cb":61297,"1f6cc":1606,"1f6cd":61095,"1f6ce":4908,"1f6cf":61296,"1f6d0":62690,"1f6d1":4885,"1f6d2":61315,"1f6d5":4818,"1f6d6":4795,"1f6d7":61293,"1f6e0":61259,"1f6e1":61265,"1f6e2":4880,"1f6e3":4878,"1f6e4":4879,"1f6e5":4893,"1f6e9":4896,"1f6eb":4897,"1f6ec":4898,"1f6f0":4905,"1f6f3":4891,"1f6f4":4874,"1f6f5":4869,"1f6f6":4889,"1f6f7":51040,"1f6f8":4907,"1f6f9":4875,"1f6fa":4872,"1f6fb":4863,"1f6fc":4876,"1f7e0":62830,"1f7e1":62831,"1f7e2":62832,"1f7e3":62834,"1f7e4":62835,"1f7e5":62838,"1f7e6":62842,"1f7e7":62839,"1f7e8":62840,"1f7e9":62841,"1f7ea":62843,"1f7eb":62844,"1f90c":1309,"1f90d":1137,"1f90e":1135,"1f90f":1310,"1f910":133,"1f911":128,"1f912":149,"1f913":163,"1f914":132,"1f915":150,"1f916":1104,"1f917":129,"1f918":1314,"1f919":1315,"1f91a":1304,"1f91b":1326,"1f91c":1327,"1f91d":1332,"1f91e":1312,"1f91f":1313,"1f920":159,"1f921":198,"1f922":151,"1f923":17,"1f924":146,"1f925":142,"1f926-200d-2640":1406,"1f926-200d-2642":1405,"1f926":1404,"1f927":153,"1f928":134,"1f929":116,"1f92a":126,"1f92b":131,"1f92c":192,"1f92d":130,"1f92e":152,"1f92f":158,"1f930":1484,"1f931":1485,"1f932":1331,"1f933":1336,"1f934":1471,"1f935-200d-2640":1480,"1f935-200d-2642":1479,"1f935":1478,"1f936":1491,"1f937-200d-2640":1409,"1f937-200d-2642":1408,"1f937":1407,"1f938-200d-2640":1589,"1f938-200d-2642":1588,"1f938":1587,"1f939-200d-2640":1601,"1f939-200d-2642":1600,"1f939":1599,"1f93a":1559,"1f93c-200d-2640":1592,"1f93c-200d-2642":1591,"1f93c":1590,"1f93d-200d-2640":1595,"1f93d-200d-2642":1594,"1f93d":1593,"1f93e-200d-2640":1598,"1f93e-200d-2642":1597,"1f93e":1596,"1f93f":51037,"1f940":2626,"1f941":61142,"1f942":3760,"1f943":3761,"1f944":3770,"1f945":51033,"1f947":51012,"1f948":51013,"1f949":51014,"1f94a":51031,"1f94b":51032,"1f94c":51041,"1f94d":51028,"1f94e":51017,"1f94f":51023,"1f950":3679,"1f951":3663,"1f952":3670,"1f953":3690,"1f954":3665,"1f955":3666,"1f956":3680,"1f957":3707,"1f958":3703,"1f959":3699,"1f95a":3701,"1f95b":3749,"1f95c":3676,"1f95d":3659,"1f95e":3684,"1f95f":3726,"1f960":3727,"1f961":3728,"1f962":3767,"1f963":3706,"1f964":3762,"1f965":3662,"1f966":3672,"1f967":3742,"1f968":3682,"1f969":3689,"1f96a":3695,"1f96b":3711,"1f96c":3671,"1f96d":3651,"1f96e":3724,"1f96f":3683,"1f970":114,"1f971":188,"1f972":122,"1f973":160,"1f974":156,"1f975":154,"1f976":155,"1f977":1467,"1f978":161,"1f97a":173,"1f97b":61086,"1f97c":61075,"1f97d":61074,"1f97e":61100,"1f97f":61101,"1f980":3729,"1f981":2519,"1f982":2616,"1f983":2568,"1f984":2525,"1f985":2577,"1f986":2578,"1f987":2557,"1f988":2602,"1f989":2580,"1f98a":2514,"1f98b":2606,"1f98c":2527,"1f98d":2506,"1f98e":2589,"1f98f":2546,"1f990":3731,"1f991":3732,"1f992":2543,"1f993":2526,"1f994":2556,"1f995":2593,"1f996":2594,"1f997":2612,"1f998":2565,"1f999":2542,"1f99a":2584,"1f99b":2547,"1f99c":2585,"1f99d":2515,"1f99e":3730,"1f99f":2617,"1f9a0":2620,"1f9a1":2566,"1f9a2":2579,"1f9a3":2545,"1f9a4":2581,"1f9a5":2562,"1f9a6":2563,"1f9a7":2507,"1f9a8":2564,"1f9a9":2583,"1f9aa":3733,"1f9ab":2555,"1f9ac":2528,"1f9ad":2598,"1f9ae":2510,"1f9af":61273,"1f9b4":1349,"1f9b5":1340,"1f9b6":1341,"1f9b7":1348,"1f9b8-200d-2640":1495,"1f9b8-200d-2642":1494,"1f9b8":1493,"1f9b9-200d-2640":1498,"1f9b9-200d-2642":1497,"1f9b9":1496,"1f9ba":61076,"1f9bb":1343,"1f9bc":4871,"1f9bd":4870,"1f9be":1338,"1f9bf":1339,"1f9c0":3686,"1f9c1":3741,"1f9c2":3710,"1f9c3":3764,"1f9c4":3673,"1f9c5":3674,"1f9c6":3700,"1f9c7":3685,"1f9c8":3709,"1f9c9":3765,"1f9ca":3766,"1f9cb":3763,"1f9cd-200d-2640":1531,"1f9cd-200d-2642":1530,"1f9cd":1529,"1f9ce-200d-2640":1534,"1f9ce-200d-2642":1533,"1f9ce":1532,"1f9cf-200d-2640":1400,"1f9cf-200d-2642":1399,"1f9cf":1398,"1f9d0":164,"1f9d1-200d-1f33e":1422,"1f9d1-200d-1f373":1425,"1f9d1-200d-1f37c":1488,"1f9d1-200d-1f384":1492,"1f9d1-200d-1f393":1413,"1f9d1-200d-1f3a4":1443,"1f9d1-200d-1f3a8":1446,"1f9d1-200d-1f3eb":1416,"1f9d1-200d-1f3ed":1431,"1f9d1-200d-1f4bb":1440,"1f9d1-200d-1f4bc":1434,"1f9d1-200d-1f527":1428,"1f9d1-200d-1f52c":1437,"1f9d1-200d-1f680":1452,"1f9d1-200d-1f692":1455,"1f9d1-200d-1f91d-200d-1f9d1":1607,"1f9d1-200d-1f9af":1535,"1f9d1-200d-1f9b0":1368,"1f9d1-200d-1f9b1":1370,"1f9d1-200d-1f9b2":1374,"1f9d1-200d-1f9b3":1372,"1f9d1-200d-1f9bc":1538,"1f9d1-200d-1f9bd":1541,"1f9d1-200d-2695":1410,"1f9d1-200d-2696":1419,"1f9d1-200d-2708":1449,"1f9d1":1358,"1f9d2":1355,"1f9d3":1377,"1f9d4":1361,"1f9d5":1477,"1f9d6-200d-2640":1555,"1f9d6-200d-2642":1554,"1f9d6":1553,"1f9d7-200d-2640":1558,"1f9d7-200d-2642":1557,"1f9d7":1556,"1f9d8-200d-2640":1604,"1f9d8-200d-2642":1603,"1f9d8":1602,"1f9d9-200d-2640":1501,"1f9d9-200d-2642":1500,"1f9d9":1499,"1f9da-200d-2640":1504,"1f9da-200d-2642":1503,"1f9da":1502,"1f9db-200d-2640":1507,"1f9db-200d-2642":1506,"1f9db":1505,"1f9dc-200d-2640":1510,"1f9dc-200d-2642":1509,"1f9dc":1508,"1f9dd-200d-2640":1513,"1f9dd-200d-2642":1512,"1f9dd":1511,"1f9de-200d-2640":1516,"1f9de-200d-2642":1515,"1f9de":1514,"1f9df-200d-2640":1519,"1f9df-200d-2642":1518,"1f9df":1517,"1f9e0":1345,"1f9e1":1130,"1f9e2":61110,"1f9e3":61080,"1f9e4":61081,"1f9e5":61082,"1f9e6":61083,"1f9e7":51003,"1f9e8":5992,"1f9e9":51053,"1f9ea":61281,"1f9eb":61282,"1f9ec":61283,"1f9ed":4779,"1f9ee":61162,"1f9ef":61314,"1f9f0":61277,"1f9f1":4792,"1f9f2":61278,"1f9f3":4909,"1f9f4":61305,"1f9f5":51068,"1f9f6":51070,"1f9f7":61306,"1f9f8":51054,"1f9f9":61307,"1f9fa":61308,"1f9fb":61309,"1f9fc":61311,"1f9fd":61313,"1f9fe":61204,"1f9ff":51048,"1fa70":61104,"1fa71":61087,"1fa72":61088,"1fa73":61089,"1fa74":61097,"1fa78":61288,"1fa79":61290,"1fa7a":61291,"1fa80":51043,"1fa81":51044,"1fa82":4899,"1fa83":61263,"1fa84":51047,"1fa85":51055,"1fa86":51056,"1fa90":4957,"1fa91":61298,"1fa92":61304,"1fa93":61256,"1fa94":61178,"1fa95":61141,"1fa96":61111,"1fa97":61136,"1fa98":61143,"1fa99":61197,"1fa9a":61266,"1fa9b":61268,"1fa9c":61279,"1fa9d":61276,"1fa9e":61294,"1fa9f":61295,"1faa0":61300,"1faa1":51069,"1faa2":51071,"1faa3":61310,"1faa4":61303,"1faa5":61312,"1faa6":61318,"1faa7":61321,"1faa8":4793,"1fab0":2618,"1fab1":2619,"1fab2":2610,"1fab3":2613,"1fab4":2632,"1fab5":4794,"1fab6":2582,"1fac0":1346,"1fac1":1347,"1fac2":1648,"1fad0":3658,"1fad1":3669,"1fad2":3661,"1fad3":3681,"1fad4":3698,"1fad5":3705,"1fad6":3751,"203c":62747,"21a9":62679,"21aa":62680,"231a":4912,"231b":4910,"23cf":62732,"23e9":62719,"23ea":62723,"23eb":62726,"23ec":62728,"23ed":62720,"23ee":62724,"23ef":62721,"23f0":4913,"23f1":4914,"23f2":4915,"23f3":4911,"23f8":62729,"23f9":62730,"23fa":62731,"24c2":62803,"25aa":62851,"25ab":62852,"25b6":62718,"25c0":62722,"25fb":62848,"25fc":62847,"25fd":62850,"25fe":62849,"260e":61146,"261d":1321,"262a":62698,"262e":62699,"262f":62695,"263a":119,"264a":62704,"264b":62705,"264c":62706,"264d":62707,"264e":62708,"264f":62709,"265f":51061,"267b":62757,"267e":62746,"267f":62646,"269b":62691,"269c":62758,"26a0":62656,"26a1":4980,"26a7":62741,"26aa":62837,"26ab":62836,"26b0":61317,"26b1":61319,"26bd":51015,"26be":51016,"26c4":4983,"26c5":4963,"26c8":4964,"26ce":62714,"26cf":61257,"26d1":61112,"26d3":61275,"26d4":62658,"26e9":4820,"26ea":4816,"26f0":4781,"26f1":4979,"26f2":4822,"26f3":51034,"26f4":4892,"26f5":4888,"26f7":1561,"26f8":51035,"26f9-200d-2640":1577,"26f9-200d-2642":1576,"26f9":1575,"26fa":4823,"26fd":4881,"270a":1324,"270b":1306,"270c":1311,"270d":1334,"270f":61219,"271d":62696,"274c":62766,"274e":62767,"27a1":62671,"27b0":62768,"27bf":62769,"2b05":62675,"2b06":62669,"2b07":62673,"2b1b":62845,"2b1c":62846,"2b50":4958,"2b55":62762,"303d":62770,"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":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":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,"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,"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":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},LatinizeMap:{"Á":"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"},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"],MediaSizes:d(37).b};t.a.Config=a,e.a=a},140:function(f,e,d){"use strict";var t=d(29),a=d(65),s=d(43),c=d(15),n=d(67),i=d(33);const r=new class{constructor(){this.log=Object(s.b)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),n.a.delete("xt_instance"))},this.deactivateInstance=()=>{if(this.masterInstance||this.deactivated)return!1;this.log("deactivate"),this.deactivateTimeout=0,this.deactivated=!0,this.clearInstance(),c.default.idle.deactivated=!0,c.default.dispatchEvent("instance_deactivated")},this.checkInstance=(f=c.default.idle&&c.default.idle.isIDLE)=>{if(this.deactivated)return!1;const e=Date.now(),d={id:this.instanceID,idle:f,time:e};n.a.get("xt_instance",!1).then(t=>{!f||!t||t.id===this.instanceID||t.time{const e=f.data.payload;if(0===e.fileName.indexOf("main-")){const f=this.convertPromises[e.fileName];f&&(e.bytes?f.resolve(e.bytes):f.reject(),delete this.convertPromises[e.fileName])}else c.a.postMessage(f.data)})}postMessage(f){this.init&&(this.init(),this.init=null),this.worker.postMessage(f)}convert(f,e){if(f="main-"+f,this.convertPromises.hasOwnProperty(f))return this.convertPromises[f];const d=Object(s.a)();return this.postMessage({type:"convertWebp",payload:{fileName:f,bytes:e}}),this.convertPromises[f]=d}};a.a.webpWorkerController=n;e.a=n},16:function(f,e,d){"use strict";d.r(e),d.d(e,"langPack",(function(){return o})),d.d(e,"I18n",(function(){return b})),d.d(e,"i18n",(function(){return l})),d.d(e,"i18n_",(function(){return h})),d.d(e,"_i18n",(function(){return g})),d.d(e,"joinElementsWith",(function(){return p})),d.d(e,"join",(function(){return m}));var t=d(29),a=d(32),s=d(78),c=d(33),n=d(80),i=d(8),r=d(15),u=d(31);const o={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.in_ok":"ChatList.Service.Call.incoming","messageActionPhoneCall.out_ok":"ChatList.Service.Call.outgoing","messageActionPhoneCall.in_missed":"ChatList.Service.Call.Missed","messageActionPhoneCall.out_missed":"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"};var b;!function(f){let e,o;function b(){const e=i.a.langPackCode;return f.lastRequestedLangCode=e,Promise.all([d.e(7).then(d.bind(null,143)),d.e(8).then(d.bind(null,144)),d.e(24).then(d.bind(null,152))]).then(([f,d,t])=>{const a=[];h(f.default,a),h(d.default,a);return p({_:"langPackDifference",from_version:0,lang_code:e,strings:a,version:0,local:!0,countries:t.default})})}function l(e){return f.requestedServerLanguage=!0,Promise.all([c.a.invokeApiCacheable("langpack.getLangPack",{lang_code:e,lang_pack:i.a.langPack}),c.a.invokeApiCacheable("langpack.getLangPack",{lang_code:e,lang_pack:"android"}),d.e(7).then(d.bind(null,143)),d.e(8).then(d.bind(null,144)),c.a.invokeApiCacheable("help.getCountriesList",{lang_code:e,hash:0}),f.polyfillPromise])}function h(f,e=[]){for(const d in f){const t=f[d];"string"==typeof t?e.push({_:"langPackString",key:d,value:t}):e.push(Object.assign({_:"langPackStringPluralized",key:d},t))}return e}function g(e){return f.lastRequestedLangCode=e,l(e).then(([f,e,d,t,a,s])=>{let c=[];[d,t].forEach(f=>{h(f.default,c)}),c=c.concat(f.strings);for(const f of e.strings)c.push(f);return f.strings=c,f.countries=a,p(f)})}function p(f){return f.appVersion=i.a.langPackVersion,n.a.set({langPack:f}).then(()=>(m(f),f))}function m(d){if(d.lang_code!==f.lastRequestedLangCode)return;try{e=new Intl.PluralRules(d.lang_code)}catch(f){console.error("pluralRules error",f),e=new Intl.PluralRules(d.lang_code.split("-",1)[0])}f.strings.clear();for(const e of d.strings)f.strings.set(e.key,e);d.countries&&(f.countriesList.length=0,f.countriesList.push(...d.countries.countries),d.countries.countries.forEach(e=>{if(e.name){const d=e.default_name;f.strings.set(d,{_:"langPackString",key:d,value:e.name})}})),f.lastAppliedLangCode!==d.lang_code&&(r.default.dispatchEvent("language_change",d.lang_code),f.lastAppliedLangCode=d.lang_code);Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d&&d.update()})}function k(f,e,d={i:0}){let t=[];let a=0;return f.replace(/(\*\*)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,(f,s,c,n,i,r,o)=>{if(t.push(o.slice(a,r)),s)switch(s){case"**":{const f=document.createElement("b");f.append(...k(c,e,d)),t.push(f);break}}else if(n)t.push(document.createElement("br"));else if(i){const f=i.lastIndexOf("]"),a=i.slice(1,f),s=i.slice(f+2,i.length-1);let c;if(s&&u.b.matchUrlProtocol(s)){c=document.createElement("a");const f=u.b.wrapUrl(s);c.href=f.url,f.onclick&&c.setAttribute("onclick",f.onclick),c.target="_blank"}else c=e[d.i++],c.textContent="";c.append(...k(a,e,d)),t.push(c)}else e&&function(f,e,d){const t=e[d.i++];Array.isArray(t)?f.push(...t):f.push(t)}(t,e,d);return a=r+f.length,""}),a!==f.length&&t.push(f.slice(a)),t}function v(d,t=!1,a){const s=f.strings.get(d);let c;if(s)if("langPackStringPluralized"===s._&&(null==a?void 0:a.length)){let f=a[0];"string"==typeof f&&(f=+f.replace(/\D/g,""));c=s[e.select(f)+"_value"]||s.other_value}else c="langPackString"===s._?s.value:d;else c=d;const n=k(c,a);return t?n.map(f=>f instanceof Node?f.textContent:f).join(""):n}f.strings=new Map,f.countriesList=[],f.requestedServerLanguage=!1,f.getCacheLangPack=function(){return o||(o=Promise.all([n.a.get("langPack"),f.polyfillPromise]).then(([e])=>e?(t.b,f.lastRequestedLangCode||(f.lastRequestedLangCode=e.lang_code),m(e),e):b()).finally(()=>{o=void 0}))},f.setTimeFormat=function(e){const d=!!f.timeFormat&&f.timeFormat!==e;if(f.timeFormat=e,d){Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d instanceof A&&d.update()})}},f.loadLocalLangPack=b,f.loadLangPack=l,f.getStrings=function(f,e){return c.a.invokeApi("langpack.getStrings",{lang_pack:i.a.langPack,lang_code:f,keys:e})},f.formatLocalStrings=h,f.getLangPack=g,f.saveLangPack=p,f.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():d.e(28).then(d.bind(null,153)).then(f=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},f.default)}),f.applyLangPack=m,f.superFormatter=k,f.format=v,f.weakMap=new WeakMap;class y{constructor(e){this.property="innerHTML",this.element=e.element||document.createElement("span"),this.element.classList.add("i18n"),this.update(e),f.weakMap.set(this.element,this)}}class w extends y{update(f){if(Object(a.g)(this,f),"innerHTML"===this.property)this.element.textContent="",this.element.append(...v(this.key,!1,this.args));else{const f=this.element[this.property],e=v(this.key,!0,this.args);void 0===f?this.element.dataset[this.property]=e:this.element[this.property]=e}}}f.IntlElement=w;class A extends y{update(e){Object(a.g)(this,e);const d=new Intl.DateTimeFormat(f.lastRequestedLangCode+"-u-hc-"+f.timeFormat,this.options);this.element[this.property]=Object(s.a)(d.format(this.date))}}f.IntlDateElement=A,f.i18n=function(f,e){return new w({key:f,args:e}).element},f.i18n_=function(f){return new w(f).element},f._i18n=function(f,e,d,t){return new w({element:f,key:e,args:d,property:t}).element}}(b||(b={})),e.default=b;const l=b.i18n,h=b.i18n_,g=b._i18n;function p(f,e){const d=f.slice(0,1);for(let t=1;t{const t=f&&e?"WordDelimiterLast":"WordDelimiter";return d?b.format(t,!0):l(t)});return d?t.join(""):t}t.a.I18n=b},24:function(f,e,d){"use strict";d.r(e),d.d(e,"TelegramMeWebManager",(function(){return i}));var t=d(8),a=d(29),s=d(77),c=d(56),n=d(67);class i{constructor(){this.disabled=s.a.test||-1===t.a.domains.indexOf(location.hostname)}setAuthorized(f){if(!this.disabled)return n.a.get("tgme_sync").then(e=>{const d=Object(c.g)(!0);if(f&&e&&e.canRedirect===f&&e.ts+86400>d)return;n.a.set({tgme_sync:{canRedirect:f,ts:d}});const a=`_websync_?authed=${f?"1":"0"}&version=${encodeURIComponent(t.a.version+" "+t.a.suffix)}`,s=["//telegram.me/"+a,"//t.me/"+a].map(f=>{const e=document.createElement("script"),d=new Promise(f=>{e.onload=e.onerror=()=>{e.remove(),f()}});return e.src=f,document.body.appendChild(e),d});return Promise.all(s)})}}const r=new i;a.a&&(a.a.telegramMeWebManager=r),e.default=r},26:function(f,e,d){"use strict";d.r(e),d.d(e,"WebPushApiManager",(function(){return o}));var t=d(29),a=d(32),s=d(43),c=d(15),n=d(33),i=d(16),r=d(0),u=d(131);class o{constructor(){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=Object(s.b)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then(f=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",f)}).catch(f=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",f),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))})})},this.isAliveNotify=()=>{if(!this.isAvailable||c.default.idle&&c.default.idle.deactivated)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"")+"#/im";const f={},e={push_action_mute1d:r.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:r.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const d in e)f[d]=i.default.format(e[d],!0);const d={type:"ping",payload:{localNotifications:this.localNotificationsAvailable,lang:f,settings:this.settings}};n.a.postSWMessage(d),this.isAliveTO=setTimeout(this.isAliveNotify,1e4)},"PushManager"in window&&"Notification"in window&&"serviceWorker"in navigator||(this.log.warn("Push messaging is not supported."),this.isAvailable=!1,this.localNotificationsAvailable=!1),this.isAvailable&&"denied"===Notification.permission&&this.log.warn("The user has blocked notifications.")}start(){this.started||(this.started=!0,this.getSubscription(),this.setUpServiceWorkerChannel())}setLocalNotificationsDisabled(){this.localNotificationsAvailable=!1}getSubscription(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.isPushEnabled=!!f,this.pushSubscriptionNotify("init",f)}).catch(f=>{this.log.error("Error during getSubscription()",f)})})}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.isPushEnabled=!1,f&&(this.pushSubscriptionNotify("unsubscribe",f),setTimeout(()=>{f.unsubscribe().then(f=>{this.isPushEnabled=!1}).catch(f=>{this.log.error("Unsubscription error: ",f)})},3e3))}).catch(f=>{this.log.error("Error thrown while unsubscribing from push messaging.",f)})})}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.log.warn("force unsubscribe",f),f&&f.unsubscribe().then(f=>{this.log.warn("force unsubscribe successful",f),this.isPushEnabled=!1}).catch(f=>{this.log.error("Unsubscription error: ",f)})}).catch(f=>{this.log.error("Error thrown while unsubscribing from push messaging.",f)})})}setSettings(f){this.settings=Object(a.a)(f),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){if(!this.isAvailable)return;n.a.postSWMessage({type:"notifications_clear"})}setUpServiceWorkerChannel(){this.isAvailable&&(n.a.addServiceWorkerTaskListener("push_click",f=>{c.default.idle&&c.default.idle.deactivated?u.a.reload():c.default.dispatchEvent("push_notification_click",f.payload)}),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(f,e){if(e){const d=e.toJSON();if(!(d&&d.endpoint&&d.keys&&d.keys.p256dh&&d.keys.auth))return this.log.warn("Invalid push subscription",d),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(f);this.log.warn("Push",f,d),c.default.dispatchEvent("push_"+f,{tokenType:10,tokenValue:JSON.stringify(d)})}else this.log.warn("Push",f,!1),c.default.dispatchEvent("push_"+f,!1)}}const b=new o;t.a&&(t.a.webPushApiManager=b),e.default=b},31:function(f,e,d){"use strict";d.d(e,"a",(function(){return w}));var t=d(133);var a=d(93),s=d(78),c=d(0),n=d(29),i=d(10);const r={emojiMap:f=>f,shortcuts:[],emojis:[]},u=t.a.Emoji,o="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",b="["+o+"0-9]",l="((?:https?|ftp)://|mailto:)?(?:"+b+"{1,64}(?::"+b+"{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}|"+b+"["+o+"·0-9-]{0,64}(?:\\."+b+"["+o+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+o+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",h=(new RegExp("^"+"((?:https?|ftp)://|mailto:)?".slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),g=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+l+")|(\\n)|(((?:👨🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👨🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👨🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👨🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👨🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👩🏻‍🤝‍👩\ud83c[\udffc-\udfff]|👩🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👩🏼‍🤝‍👩\ud83c[\udffb\udffd-\udfff]|👩🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👩🏽‍🤝‍👩\ud83c[\udffb\udffc\udffe\udfff]|👩🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👩🏾‍🤝‍👩\ud83c[\udffb-\udffd\udfff]|👩🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏿‍🤝‍👩\ud83c[\udffb-\udffe]|🧑🏻‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏼‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏽‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏾‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏿‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑‍🤝‍🧑|👫\ud83c[\udffb-\udfff]|👬\ud83c[\udffb-\udfff]|👭\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d])|(?:\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\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?‍[♀♂]️?|(?:👨‍❤️?‍💋‍👨|👨‍👨‍👦‍👦|👨‍👨‍👧‍\ud83d[\udc66\udc67]|👨‍👩‍👦‍👦|👨‍👩‍👧‍\ud83d[\udc66\udc67]|👩‍❤️?‍💋‍\ud83d[\udc68\udc69]|👩‍👩‍👦‍👦|👩‍👩‍👧‍\ud83d[\udc66\udc67]|👨‍❤️?‍👨|👨‍👦‍👦|👨‍👧‍\ud83d[\udc66\udc67]|👨‍👨‍\ud83d[\udc66\udc67]|👨‍👩‍\ud83d[\udc66\udc67]|👩‍❤️?‍\ud83d[\udc68\udc69]|👩‍👦‍👦|👩‍👧‍\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]|[✊✋]))(?:\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-\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\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[⏩-⏬⏰⏳♾⛎✅✨❌❎❓-❕➕-➗➰➿])|️))|(^|[\\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"),p=/^(([^<>()[\]\\.,;:\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,}))$/,m=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,k={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}"},v={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline"},y=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(let f in v)y.add(v[f]);var w;!function(f){function e(f){let e=Object(a.b)(f).replace(/-?fe0f/g,"");return u.hasOwnProperty(e)?e:null}function d(f){let d,a=f;const s=[];let c,n=0;for(g.lastIndex=0;d=a.match(g);){if(c=n+d.index,d[3])s.push({_:"messageEntityMention",offset:c+d[1].length,length:d[2].length+d[3].length});else if(d[4])if(p.test(d[4]))s.push({_:"messageEntityEmail",offset:c,length:d[4].length});else{let f,e=d[5];const a=d[6];if(a){if(e||"xn--"!==a.substr(0,4)&&-1===t.a.TLD.indexOf(a.toLowerCase())||(e="http://"),e){const t=A(d[4]);t.length!==d[4].length&&(d[4]=t),f=(d[5]?"":e)+d[4]}}else f=(d[5]?"":"http://")+d[4];f&&s.push({_:"messageEntityUrl",offset:c,length:d[4].length})}else if(d[7])s.push({_:"messageEntityLinebreak",offset:c,length:1});else if(d[8]){const f=e(d[8]);f&&s.push({_:"messageEntityEmoji",offset:c,length:d[8].length,unicode:f})}else d[11]?s.push({_:"messageEntityHashtag",offset:c+(d[10]?d[10].length:0),length:d[11].length}):d[13]&&s.push({_:"messageEntityBotCommand",offset:c+(d[11]?d[11].length:0)+(d[12]?d[12].length:0),length:1+d[13].length+(d[14]?1+d[14].length:0),unsafe:!0});a=a.substr(d.index+d[0].length),n+=d.index+d[0].length}return s}function n(f,e){return f.find(f=>{if(!(e._===f._||!y.has(e._)&&!y.has(f._)))return!1;return e.offset>=f.offset&&e.length+e.offset<=f.length+f.offset})}function o(f,e){const d=e.filter(e=>!n(f,e));if(f.push(...d),f.sort((f,e)=>f.offset-e.offset),!i.a)for(let e=0;et!==e&&f._===d._&&f.offset-d.length===d.offset),-1!==t){const e=f[t];d.length+=e.length,f.splice(t,1)}}while(-1!==t)}}function w(f,e={}){if(!f)return"";const t=[],a=e.entities||d(f),n=e.passEntities||{},r=e.contextSite||"Telegram",u="Telegram"!==r,o=(f,e,d)=>{t.push({part:e,offset:f.offset}),d&&t.push({part:d,offset:f.offset+f.length})},b=[];for(let d=0,t=a.length;d',""):o(t,"",""));break;case"messageEntityItalic":e.noTextFormat||(e.wrappingDraft?o(t,'',""):o(t,"",""));break;case"messageEntityStrike":if(e.wrappingDraft){o(t,``,"")}else o(t,"","");break;case"messageEntityUnderline":if(e.wrappingDraft){o(t,``,"")}else o(t,"","");break;case"messageEntityCode":e.wrappingDraft?o(t,'',""):o(t,"","");break;case"messageEntityPre":e.noTextFormat||o(t,`
`,"
");break;case"messageEntityHighlight":o(t,'',"");break;case"messageEntityBotCommand":if(!e.noLinks&&n[t._]){let d,a,c=f.substr(t.offset,t.length).substr(1);-1!==(a=c.indexOf("@"))?(d=c.substr(a+1),c=c.substr(0,a)):d=e.fromBot,o(t,``,"")}break;case"messageEntityEmoji":i.a?e.wrappingDraft||o(t,'',""):o(t,``,'');break;case"messageEntityCaret":{const f='';b.push({part:f,offset:t.offset});break}case"messageEntityUrl":case"messageEntityTextUrl":if(!e.noLinks||n[t._]){const c=f.substr(t.offset,t.length);let n,i=t.url||c,r=!1;const u=C(i,!0);if(i=u.url,n=u.onclick,"messageEntityTextUrl"===t._){const f=a[d+1];"messageEntityUrl"===(null==f?void 0:f._)&&f.length===t.length&&f.offset===t.offset&&d++,i!==c&&(r=!0)}const b=!!n;n||!r||b||(n="showMaskedAlert"),e.wrappingDraft&&(n=void 0);o(t,``,"")}break;case"messageEntityEmail":if(!e.noLinks){const e=f.substr(t.offset,t.length);o(t,``,"")}break;case"messageEntityHashtag":{const d=!e.noLinks&&k[r];if(d){const e=f.substr(t.offset,t.length).substr(1);o(t,``,"")}break}case"messageEntityMentionName":e.noLinks&&!n[t._]||o(t,`");break;case"messageEntityMention":if(!e.noLinks){const e=f.substr(t.offset,t.length).substr(1),{url:d,onclick:a}=C("t.me/"+e);o(t,``,"")}}}t.sort((f,e)=>f.offset-e.offset);let l=t.length,h=b.length;for(let f=0;f=e.offset););t.splice(d,0,e)}l+=h;const g=[];let p=0;for(let e=0;ep&&(g.push(Object(s.d)(f.slice(p,a))),p=a),g.push(d)}return pd&&")"===f.charAt(e-1);)f=f.substr(0,e-1),t--,e--;return d>t&&(f=f.replace(/\)+$/,"")),f}function E(f,e=!1){if(!f)return"";return w(f,{entities:d(f).filter(f=>"messageEntityEmoji"===f._),wrappingDraft:e})}function C(f,e){let d,t,a,s;if(S(f)||(f="https://"+f),d=f.match(/^(?:https?:\/\/)?t(?:elegram)?\.me\/(.+)/)){const e=d[1];if(/^\W/.test(e))return s="joinchat",{url:f,onclick:s};const t=e.split("/");switch(t[0]){case"joinchat":case"addstickers":case"voicechat":s=t[0];break;default:if(t[1]&&t[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===t.length){s="im";break}}}else(t=f.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?s="im":(a=f.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(s="tg_"+a[1]);return window[s]||(s=void 0),{url:f,onclick:s}}function S(f){return f?f.match(h):null}function T(f){return{_:"messageEntityEmoji",offset:0,length:f.length,unicode:Object(a.e)(f).join("-").replace(/-?fe0f/g,"")}}f.getEmojiSpritesheetCoords=e,f.parseEntities=d,f.parseMarkdown=function(f,e,d){const t=[];let a=!1;const s=f=>n(e,f)?a=!1:(t.push(f),a=!0),c=[];let i,r=0;for(;i=f.match(m);){const e=r+i.index;c.push(f.substr(0,i.index));const d=i[3]||i[8]||i[11]||i[13];let t;if(r-=d.length,r+=d.length,a=!1,d.match(/^`*$/))c.push(i[0]);else if(i[3])t={_:"messageEntityPre",language:"",offset:e+i[1].length,length:d.length},s(t)&&("\n"===i[5]&&(i[5]="",r-=1),c.push(i[1]+d+i[5]),r-=i[2].length+i[4].length);else if(i[7]){const f=""===i[6];t={_:v[i[7]],offset:e+(f?0:i[6].length),length:d.length},s(t)&&(f?c.push(d):c.push(i[6]+d+i[9]),r-=2*i[7].length+(f?2:0))}else i[11]?(t={_:"messageEntityMentionName",user_id:i[10].toUserId(),offset:e,length:d.length},s(t)&&(c.push(d),r-=i[0].length-d.length)):i[12]&&(t={_:"messageEntityTextUrl",url:i[14],offset:e,length:d.length},s(t)&&(c.push(d),r-=i[12].length-d.length));a||c.push(i[0]),f=f.substr(i.index+i[0].length),r+=i.index+i[0].length}c.push(f);let u=c.join("");u.replace(/\s+/g,"").length||(u=f,t.splice(0,t.length)),t.length||d||(u=u.trim()),o(e,t),b(e);let l=u.length;if(!d){u=u.replace(/^\s*/,"");let f=l-u.length;f&&e.forEach(e=>{e.offset=Math.max(0,e.offset-f)}),u=u.replace(/\s*$/,""),f=l-u.length,l=u.length,f&&e.forEach(f=>{f.offset+f.length>l&&(f.length=l-f.offset)})}return u},f.findConflictingEntity=n,f.mergeEntities=o,f.combineSameEntities=b,f.wrapRichText=w,f.fixEmoji=function(f,e){return f=f.replace(/[\u2640\u2642\u2764](?!\ufe0f)/g,(f,d,t)=>{if(e){const t=f.length;d+=t,e.forEach(f=>{const e=f.offset+f.length;e===d?f.length+=t:e>d&&(f.offset+=t)})}return f+"️"})},f.wrapDraftText=function(f,e={}){return f?w(f,{entities:e.entities,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}):""},f.checkBrackets=A,f.replaceUrlEncodings=function(f){return f.replace(/(%[A-Z\d]{2})+/g,f=>{try{return decodeURIComponent(f)}catch(e){return f}})},f.wrapPlainText=function(f){if(i.a)return f;if(!f||!f.length)return"";var e,d=f=f.replace(/\ufe0f/g,"");const t=[];let a;for(g.lastIndex=0;e=d.match(g);){if(t.push(d.substr(0,e.index)),e[8]){const f=r.emojiMap[e[8]];f&&(a=u[f][1][0])?t.push(":"+a+":"):t.push(e[0])}else t.push(e[0]);d=d.substr(e.index+e[0].length)}return t.push(d),t.join("")},f.wrapEmojiText=E,f.wrapUrl=C,f.matchUrlProtocol=S,f.matchUrl=function(f){return f?f.match(l):null},f.matchEmail=function(f){return f?f.match(p):null},f.getAbbreviation=function(f,e=!1){const d=f.trim().split(" ");if(!d[0])return"";const t=[...d[0]][0];return e||1===d.length?E(t):E(t+[...d[d.length-1]][0])},f.isUsernameValid=function(f){return(f.length>=5&&f.length<=32||!f.length)&&/^[a-zA-Z0-9_]*$/.test(f)},f.getEmojiEntityFromEmoji=T,f.wrapSingleEmoji=function(f){return w(f,{entities:[T(f)]})}}(w||(w={})),n.a.RichTextProcessor=w;e.b=w},33:function(f,e,d){"use strict";function t(){return new Worker(d.p+"mtproto.worker.fd3e71e917088f6f049f.bundle.worker.js")}var a=d(32);var s=d(43),c=d(15),n=d(149),i=d(29),r=d(77),u=d(54);class o extends u.a{constructor(f,e,d){super(),this.dcId=f,this.url=e,this.debug=r.a.debug&&!1,this.handleOpen=()=>{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=f=>{this.log.error("handleError",f),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=f=>{this.debug&&this.log.debug("<-","handleMessage",f.data.byteLength),this.dispatchEvent("message",f.data)},this.send=f=>{this.debug&&this.log.debug("-> body length to send:",f.length),this.ws.send(f)};let t=s.a.Error|s.a.Log;return this.debug&&(t|=s.a.Debug),this.log=Object(s.b)("WS-"+f+d,t),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(f){}this.handleClose()}}}var b=d(140),l=d(67),h=d(26),g=d(99),p=d(131),m=d(24),k=d(82),v=d(121);const y=new class extends class{invokeCrypto(f,...e){return this.performTaskWorker(f,...e)}}{constructor(){super(),this.afterMessageIdTemp=0,this.taskId=0,this.awaiting={},this.pending=[],this.updatesProcessor=null,this.log=Object(s.b)("API-PROXY"),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.isSWRegistered=!0,this.debug=i.b,this.sockets=new Map,this.taskListeners={},this.taskListenersSW={},this.postMessagesWaiting=[],this.onWorkerMessage=f=>{const e=f.data;if(!Object(a.f)(e))return;const d=this.taskListeners[e.type];d?d(e):e.update?this.updatesProcessor&&this.updatesProcessor(e.update):e.progress?c.default.dispatchEvent("download_progress",e.progress):(e.hasOwnProperty("result")||e.hasOwnProperty("error"))&&this.finalizeTask(e.taskId,e.result,e.error)},this.log("constructor"),b.a.start(),this.registerServiceWorker(),this.addTaskListener("clear",()=>{Promise.all([g.a.toggleStorage(!1),l.a.clear(),Promise.race([m.default.setAuthorized(!1),Object(k.a)(3e3)]),h.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map(f=>caches.delete(f)))]).finally(()=>{p.a.reload()})}),this.addTaskListener("connectionStatusChange",f=>{c.default.dispatchEvent("connection_status_change",f.payload)}),this.addTaskListener("convertWebp",f=>{n.a.postMessage(f)}),this.addTaskListener("socketProxy",f=>{const e=f.payload,d=e.id;if("send"===e.type){this.sockets.get(d).send(e.payload)}else if("close"===e.type){this.sockets.get(d).close()}else if("setup"===e.type){const f=new o(e.payload.dcId,e.payload.url,e.payload.logSuffix),t=()=>{this.postMessage({type:"socketProxy",payload:{type:"open",id:d}})},a=()=>{this.postMessage({type:"socketProxy",payload:{type:"close",id:d}}),f.removeEventListener("open",t),f.removeEventListener("close",a),f.removeEventListener("message",s),this.sockets.delete(d)},s=f=>{this.postMessage({type:"socketProxy",payload:{type:"message",id:d,payload:f}})};f.addEventListener("open",t),f.addEventListener("close",a),f.addEventListener("message",s),this.sockets.set(d,f)}}),this.addTaskListener("localStorageProxy",f=>{const e=f.payload;l.a[e.type](...e.args).then(e=>{this.postMessage({type:"localStorageProxy",id:f.id,payload:e})})}),c.default.addEventListener("language_change",f=>{this.performTaskWorkerVoid("setLanguage",f)}),window.addEventListener("online",f=>{this.forceReconnectTimeout()}),this.registerWorker(),setTimeout(()=>{this.getConfig()},5e3)}isServiceWorkerOnline(){return this.isSWRegistered}registerServiceWorker(){if(!("serviceWorker"in navigator))return;const f=navigator.serviceWorker;f.register("./sw.js",{scope:"./"}).then(f=>{this.log("SW registered",f),this.isSWRegistered=!0;(f.installing||f.waiting||f.active).addEventListener("statechange",f=>{this.log("SW statechange",f)})},f=>{this.isSWRegistered=!1,this.log.error("SW registration failed!",f),this.onServiceWorkerFail&&this.onServiceWorkerFail()}),f.addEventListener("controllerchange",()=>{this.log.warn("controllerchange"),this.releasePending(),f.controller.addEventListener("error",f=>{this.log.error("controller error:",f)})}),f.addEventListener("message",f=>{const e=f.data;if(!Object(a.f)(e))return;const d=this.taskListenersSW[e.type];d&&d(e)}),this.addServiceWorkerTaskListener("requestFilePart",f=>{const e={type:f.type,id:f.id};this.performTaskWorker("requestFilePart",...f.payload).then(f=>{e.payload=f,this.postSWMessage(e)},d=>{e.originalPayload=f.payload,e.error=d,this.postSWMessage(e)})}),f.addEventListener("messageerror",f=>{this.log.error("SW messageerror:",f)})}postMessage(...f){this.postMessagesWaiting.push(f)}postSWMessage(f){navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage(f)}onWorkerFirstMessage(f){if(!this.worker){this.worker=f,this.log("set webWorker"),this.postMessage=this.worker.postMessage.bind(this.worker),this.postMessagesWaiting.forEach(f=>this.postMessage(...f)),this.postMessagesWaiting.length=0;const e=v.a;this.log("WebP supported:",e),this.postMessage({type:"webpSupport",payload:e}),this.postMessage({type:"userAgent",payload:navigator.userAgent}),this.releasePending()}}addTaskListener(f,e){this.taskListeners[f]=e}addServiceWorkerTaskListener(f,e){this.taskListenersSW[f]=e}registerWorker(){const f=new t;f.addEventListener("message",this.onWorkerFirstMessage.bind(this,f),{once:!0}),f.addEventListener("message",this.onWorkerMessage),f.addEventListener("error",f=>{this.log.error("WORKER ERROR",f)})}finalizeTask(f,e,d){const t=this.awaiting[f];void 0!==t&&(this.debug&&this.log.debug("done",t.taskName,e,d),d?t.reject(d):t.resolve(e),delete this.awaiting[f])}performTaskWorkerVoid(f,...e){const d={task:f,taskId:this.taskId,args:e};this.pending.push(d),this.releasePending(),this.taskId++}performTaskWorker(f,...e){return this.debug&&this.log.debug("start",f,e),new Promise((d,t)=>{this.awaiting[this.taskId]={resolve:d,reject:t,taskName:f},this.performTaskWorkerVoid(f,...e)})}releasePending(){this.postMessage&&(this.debug&&this.log.debug("releasing tasks, length:",this.pending.length),this.pending.forEach(f=>{this.postMessage(f)}),this.debug&&this.log.debug("released tasks"),this.pending.length=0)}setUpdatesProcessor(f){this.updatesProcessor=f}invokeApi(f,e={},d={}){return this.performTaskWorker("invokeApi",f,e,d)}invokeApiAfter(f,e={},d={}){let t=d;return t.prepareTempMessageId=""+ ++this.afterMessageIdTemp,t=Object.assign({},d),d.messageId=t.prepareTempMessageId,this.invokeApi(f,e,t)}invokeApiHashable(f,e={},d={}){const t=JSON.stringify(e);let a;return this.hashes[f]&&(a=this.hashes[f][t],a&&(e.hash=a.hash)),this.invokeApi(f,e,d).then(e=>{if(e._.includes("NotModified"))return this.debug&&this.log.warn("NotModified saved!",f,t),a.result;if(e.hash){const d=e.hash;this.hashes[f]||(this.hashes[f]={}),this.hashes[f][t]={hash:d,result:e}}return e})}invokeApiSingle(f,e={},d={}){const t=f+"-"+JSON.stringify(e),a=this.apiPromisesSingle;return a[t]?a[t]:a[t]=this.invokeApi(f,e,d).finally(()=>{delete a[t]})}invokeApiSingleProcess(f){var e,d,t;null!==(e=f.params)&&void 0!==e||(f.params={}),null!==(d=f.options)&&void 0!==d||(f.options={});const{method:a,processResult:s,processError:c,params:n,options:i}=f,r=this.apiPromisesSingleProcess,u=i.cacheKey||JSON.stringify(n),o=null!==(t=r[a])&&void 0!==t?t:r[a]=new Map,b=o.get(u);if(b)return b;const l=this.invokeApi(a,n,i).then(s,c).finally(()=>{o.delete(u),o.size||delete r[a]});return o.set(u,l),l}invokeApiCacheable(f,e={},d={}){var t;const a=null!==(t=this.apiPromisesCacheable[f])&&void 0!==t?t:this.apiPromisesCacheable[f]={},s=JSON.stringify(e),c=a[s];if(c&&(!d.override||!c.fulfilled))return c.promise;let n;d.override&&(c&&c.timeout&&(clearTimeout(c.timeout),delete c.timeout),delete d.override),d.cacheSeconds&&(n=window.setTimeout(()=>{delete a[s]},1e3*d.cacheSeconds),delete d.cacheSeconds);const i=this.invokeApi(f,e,d);return a[s]={timestamp:Date.now(),fulfilled:!1,timeout:n,promise:i,params:e},i}clearCache(f,e){const d=this.apiPromisesCacheable[f];if(d)for(const f in d){const t=d[f];try{e(t.params)&&(t.timeout&&clearTimeout(t.timeout),delete d[f])}catch(e){this.log.error("clearCache error:",e,f,t)}}}setBaseDcId(f){return this.performTaskWorker("setBaseDcId",f)}setQueueId(f){return this.performTaskWorker("setQueueId",f)}setUserAuth(f){return"string"!=typeof f&&"number"!=typeof f||(f={dcID:0,date:Date.now()/1e3|0,id:f.toPeerId(!1)}),c.default.dispatchEvent("user_auth",f),this.performTaskWorker("setUserAuth",f)}setUser(f){return this.setUserAuth(f.id)}getNetworker(f,e){return this.performTaskWorker("getNetworker",f,e)}logOut(){return this.performTaskWorker("logOut")}cancelDownload(f){return this.performTaskWorker("cancelDownload",f)}downloadFile(f){return this.performTaskWorker("downloadFile",f)}uploadFile(f){return this.performTaskWorker("uploadFile",f)}toggleStorage(f){const e={type:"toggleStorage",payload:f};this.postMessage(e),this.postSWMessage(e)}stopAll(){return this.performTaskWorkerVoid("stopAll")}startAll(){return this.performTaskWorkerVoid("startAll")}forceReconnectTimeout(){this.postMessage({type:"online"})}forceReconnect(){this.postMessage({type:"forceReconnect"})}getConfig(){return this.getConfigPromise?this.getConfigPromise:this.getConfigPromise=this.invokeApi("help.getConfig").then(f=>(c.default.config=f,f))}};i.a.apiManagerProxy=y;e.a=y},37:function(f,e,d){"use strict";d.d(e,"c",(function(){return i})),d.d(e,"a",(function(){return t}));var t,a=d(29),s=d(122),c=d(54);class n{constructor(f=0,e=f){this.width=f,this.height=e}aspect(f,e){return Object(s.a)(this.width,this.height,f.width,f.height,e)}aspectFitted(f){return this.aspect(f,!0)}aspectCovered(f){return this.aspect(f,!1)}}function i(f,e){return new n(f,e)}!function(f){f[f.mobile=0]="mobile",f[f.medium=1]="medium",f[f.large=2]="large"}(t||(t={}));class r extends c.a{constructor(){super(),this.screenSizes=[{key:t.mobile,value:600},{key:t.medium,value:1275},{key:t.large,value:1680}],this.sizes={handhelds:{regular:i(270,270),webpage:i(270,200),album:i(270,0),esgSticker:i(68,68),animatedSticker:i(180,180),staticSticker:i(180,180),emojiSticker:i(112,112),poll:i(240,0),round:i(200,200)},desktop:{regular:i(420,340),webpage:i(420,340),album:i(420,0),esgSticker:i(80,80),animatedSticker:i(200,200),staticSticker:i(200,200),emojiSticker:i(112,112),poll:i(330,0),round:i(280,280)}},this.isMobile=!1,this.handleResize=()=>{const f=window.innerWidth;let e=this.screenSizes[0].key;for(let d=this.screenSizes.length-1;d>=0;--d)if(this.screenSizes[d].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame(()=>{this.handleResize(),this.rAF=0})}),this.handleResize()}}const u=new r;a.a.mediaSizes=u,e.b=u},56:function(f,e,d){"use strict";d.d(e,"a",(function(){return r})),d.d(e,"c",(function(){return o})),d.d(e,"d",(function(){return b})),d.d(e,"e",(function(){return l})),d.d(e,"f",(function(){return h})),d.d(e,"b",(function(){return w}));var t=d(29),a=d(16),s=d(78),c=d(132);d.d(e,"g",(function(){return c.a}));const n=["January","February","March","April","May","June","July","August","September","October","November","December"],i=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],r=86400,u=f=>{const e=new Date(Date.UTC(f.getFullYear(),f.getMonth(),f.getDate())),d=e.getUTCDay()||7;e.setUTCDate(e.getUTCDate()+4-d);const t=new Date(Date.UTC(e.getUTCFullYear(),0,1));return Math.ceil(((e.getTime()-t.getTime())/r+1)/7)};function o(f){const e=new Date,d=e.getTime()/1e3|0,t=f.getTime()/1e3|0,s={};return d-t{const d=e.monthAsNumber?".":" ",t=("0"+f.getHours()).slice(-2)+":"+("0"+f.getMinutes()).slice(-2)+(e.noSeconds?"":":"+("0"+f.getSeconds()).slice(-2));return(e.leadingZero?("0"+f.getDate()).slice(-2):f.getDate())+d+(e.monthAsNumber?("0"+(f.getMonth()+1)).slice(-2):n[f.getMonth()])+d+f.getFullYear()+(e.noTime?"":", "+t)},g=new RegExp("20[0-9]{1,2}"),p=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),m=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),k=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),v=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),y=[31,29,31,30,31,30,31,31,30,31,30,31];function w(f,e){const d=f.trim().toLowerCase();if(d.length<3)return;if(0==="today".indexOf(d)){const f=new Date,d=f.getFullYear(),t=f.getMonth(),a=f.getDate();f.setFullYear(d,t,a),f.setHours(0,0,0);const s=f.getTime();f.setFullYear(d,t,a+1),f.setHours(0,0,0);const c=f.getTime()-1;return void e.push({title:"Today",minDate:s,maxDate:c})}if(0==="yesterday".indexOf(d)){const f=new Date,d=f.getFullYear(),t=f.getMonth(),a=f.getDate();f.setFullYear(d,t,a),f.setHours(0,0,0);const s=f.getTime()-864e5;f.setFullYear(d,t,a+1),f.setHours(0,0,0);const c=f.getTime()-86400001;return void e.push({title:"Yesterday",minDate:s,maxDate:c})}const t=function(f){const e=new Date;if(f.length<=3)return-1;for(let d=0;d<7;d++)if(e.setDate(e.getDate()+1),0===D(e.getTime()).toLowerCase().indexOf(f))return e.getDay();return-1}(d);if(t>=0){const f=new Date,d=f.getTime(),a=t-f.getDay();f.setDate(f.getDate()+a),f.getTime()>d&&f.setTime(f.getTime()-6048e5);const s=f.getFullYear(),c=f.getMonth(),n=f.getDate();f.setFullYear(s,c,n),f.setHours(0,0,0);const i=f.getTime();f.setFullYear(s,c,n+1),f.setHours(0,0,0);const r=f.getTime()-1;return void e.push({title:D(i),minDate:i,maxDate:r})}let a;if(null===(a=k.exec(d)))if(null===(a=v.exec(d)))if(null===(a=g.exec(d))){if(null!==(a=p.exec(d))){const f=a[1],d=a[2],t=L(f);if(t>=0){const f=+d;if(f>0&&f<=31){return void E(e,f-1,t)}if(f>=2013){return void A(e,t,f)}}}if(null!==(a=m.exec(d))){const f=a[1],d=L(a[2]);if(d>=0){const t=+f;if(t>0&&t<=31){return void E(e,t-1,d)}if(t>=2013){A(e,d,t)}}}}else{let f=+d;const t=(new Date).getFullYear();if(f<2013){f=2013;for(let d=t;d>=f;d--){const f=new Date;f.setFullYear(d,0,1),f.setHours(0,0,0);const t=f.getTime();f.setFullYear(d+1,0,1),f.setHours(0,0,0);const a=f.getTime()-1;e.push({title:""+d,minDate:t,maxDate:a})}}else if(f<=t){const d=new Date;d.setFullYear(f,0,1),d.setHours(0,0,0);const t=d.getTime();d.setFullYear(f+1,0,1),d.setHours(0,0,0);const a=d.getTime()-1;e.push({title:""+f,minDate:t,maxDate:a})}}else{const f=a[1],d=a[3],t=a[5];if(!a[2]===a[4])return;const s=parseInt(f),c=parseInt(d)-1;let n=parseInt(t);n>=10&&n<=99&&(n+=2e3);const i=(new Date).getFullYear();if(P(s-1,c)&&n>=2013&&n<=i){const f=new Date;f.setFullYear(n,c,s),f.setHours(0,0,0);const d=f.getTime();f.setFullYear(n,c,s+1),f.setHours(0,0,0);const t=f.getTime()-1;return void e.push({title:T(d),minDate:d,maxDate:t})}}else{const f=a[1],d=a[3],t=parseInt(f),s=parseInt(d);if(t>0&&t<=31){if(s>=2013&&t<=12){return void A(e,t-1,s)}if(s<=12){E(e,t-1,s-1)}}else if(t>=2013&&s<=12){A(e,s-1,t)}}}function A(f,e,d){const t=(new Date).getFullYear(),a=Date.now();if(d>=2013&&d<=t){const t=new Date;t.setFullYear(d,e,1),t.setHours(0,0,0);const s=t.getTime();if(s>a)return;t.setMonth(t.getMonth()+1);const c=t.getTime()-1;f.push({title:C(s),minDate:s,maxDate:c})}}function E(f,e,d){if(P(e,d)){const a=(new Date).getFullYear(),s=Date.now();for(let c=a;c>=2013;c--){if(1===d&&28===e&&(((t=c)%4!=0||t%100==0)&&t%400!=0))continue;const n=new Date;n.setFullYear(c,d,e+1),n.setHours(0,0,0);const i=n.getTime();if(i>s)continue;n.setFullYear(c,d,e+2),n.setHours(0,0,0);const r=n.getTime()-1;c===a?f.push({title:S(i),minDate:i,maxDate:r}):f.push({title:T(i),minDate:i,maxDate:r})}}var t}function C(f){const e=new Date(f);return n[e.getMonth()].slice(0,3)+" "+e.getFullYear()}function S(f){const e=new Date(f);return n[e.getMonth()].slice(0,3)+" "+e.getDate()}function T(f){const e=new Date(f);return("0"+e.getDate()).slice(-2)+"."+("0"+(e.getMonth()+1)).slice(-2)+"."+e.getFullYear()}function D(f){const e=new Date(f);return i[e.getDay()]}function P(f,e){return e>=0&&e<12&&f>=0&&fd&&(f=f.slice(0,e)+"..."),f}function a(f){return f.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}function s(f){return f.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,f=>"&#"+(1024*(f.charCodeAt(0)-55296)+(f.charCodeAt(1)-56320)+65536)+";").replace(/([^\#-~| |!])/g,f=>"&#"+f.charCodeAt(0)+";").replace(//g,">")}function c(f,e){if(f.length{let i=f.slice(t,n);const r=a++;if(i.length>e){c(i.slice(e),e).forEach(f=>{s[a++]=f}),i=i.slice(0,e)}t=n,d=0,s[r]=(s[r]||"")+i};let i=0;for(;;){let t=f.indexOf(" ",i);if(-1===t){i!==f.length-1&&n();break}t+=" ".length;const a=t-i;d+a>e&&n(d),i=t,d+=a}return s}function n(f){const e=f.replace("input","");return e[0].toLowerCase()+e.slice(1)}function i(f){return f="input"+(f=f[0].toUpperCase()+f.slice(1))}function r(f){return f.charAt(0).toUpperCase()+f.slice(1)}d.d(e,"f",(function(){return t})),d.d(e,"e",(function(){return a})),d.d(e,"d",(function(){return s})),d.d(e,"g",(function(){return c})),d.d(e,"b",(function(){return n})),d.d(e,"c",(function(){return i})),d.d(e,"a",(function(){return r}))},82:function(f,e,d){"use strict";d.d(e,"a",(function(){return t}));const t=f=>new Promise(e=>{setTimeout(e,f)})},93:function(f,e,d){"use strict";function t(f){return n(c(f)).join("-")}d.d(e,"b",(function(){return t})),d.d(e,"e",(function(){return n})),d.d(e,"d",(function(){return i})),d.d(e,"c",(function(){return r})),d.d(e,"a",(function(){return u}));const a=/\uFE0F/g,s=String.fromCharCode(8205),c=f=>f.indexOf(s)<0?f.replace(a,""):f;function n(f){const e=[];let d=0,t=0,a=0;for(;a55296&&d<=56319?t=d:e.push(d.toString(16));return e.length&&2===e[0].length&&(e[0]="00"+e[0]),e}function i(f){let e=f.match(/[\uDFFB-\uDFFF]/);return e?5-(57343-e[0].charCodeAt(0)):0}function r(f){return String.fromCharCode(55356,56741+f.charCodeAt(0),55356,56741+f.charCodeAt(1))}function u(f){return f.split("-").reduce((f,e)=>f+String.fromCodePoint(parseInt(e,16)),"")}}}]); +//# sourceMappingURL=1.5ce290a0391e0bae24df.chunk.js.map \ No newline at end of file diff --git a/public/1.5ce290a0391e0bae24df.chunk.js.map b/public/1.5ce290a0391e0bae24df.chunk.js.map new file mode 100644 index 000000000..15d1ba2ae --- /dev/null +++ b/public/1.5ce290a0391e0bae24df.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/environment/webpSupport.ts","webpack:///./src/helpers/calcImageInBox.ts","webpack:///./src/lib/appManagers/appRuntimeManager.ts","webpack:///./src/helpers/tsNow.ts","webpack:///./src/lib/config.ts","webpack:///./src/lib/mtproto/singleInstance.ts","webpack:///./src/lib/webp/webp.worker.ts","webpack:///./src/lib/webp/webpWorkerController.ts","webpack:///./src/lib/langPack.ts","webpack:///./src/lib/mtproto/telegramMeWebManager.ts","webpack:///./src/lib/mtproto/webPushApiManager.ts","webpack:///./src/vendor/emoji/regex.ts","webpack:///./src/lib/richtextprocessor.ts","webpack:///./src/lib/mtproto/mtproto.worker.ts","webpack:///./src/lib/mtproto/transports/websocket.ts","webpack:///./src/lib/mtproto/mtprotoworker.ts","webpack:///./src/lib/crypto/crypto_methods.ts","webpack:///./src/helpers/mediaSizes.ts","webpack:///./src/helpers/date.ts","webpack:///./src/helpers/string.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/vendor/emoji/index.ts"],"names":["IS_WEBP_SUPPORTED","document","createElement","toDataURL","startsWith","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","appRuntimeManager","location","reload","e","window","close","focus","tsNow","seconds","t","Date","now","Config","Emoji","LatinizeMap","TLD","MediaSizes","singleInstance","log","clearInstance","this","masterInstance","deactivated","warn","delete","deactivateInstance","deactivateTimeout","idle","dispatchEvent","checkInstance","isIDLE","time","newInstance","id","instanceID","get","then","curInstance","set","xt_instance","startAll","initial","clearTimeout","stopAll","setTimeout","started","reset","addEventListener","setInterval","documentElement","Worker_fn","Worker","webpWorkerController","convertPromises","worker","payload","data","fileName","indexOf","promise","bytes","resolve","reject","postMessage","init","hasOwnProperty","convertPromise","type","langPack","I18n","pluralRules","cacheLangPackPromise","loadLocalLangPack","defaultCode","langPackCode","lastRequestedLangCode","Promise","all","lang","langSign","countries","strings","formatLocalStrings","default","saveLangPack","_","from_version","lang_code","version","local","loadLangPack","langCode","requestedServerLanguage","invokeApiCacheable","lang_pack","hash","polyfillPromise","pushTo","i","v","push","key","value","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","forEach","l","concat","string","appVersion","langPackVersion","applyLangPack","Intl","PluralRules","err","console","error","split","clear","countriesList","length","country","name","langPackKey","default_name","lastAppliedLangCode","Array","from","querySelectorAll","element","instance","weakMap","update","superFormatter","input","args","indexHolder","out","lastIndex","replace","match","p1","p2","p3","p4","offset","slice","b","append","idx","lastIndexOf","text","url","a","matchUrlProtocol","wrappedUrl","wrapUrl","href","onclick","setAttribute","target","textContent","arg","isArray","pushNextArgument","format","plain","str","select","result","map","item","Node","join","Map","getCacheLangPack","finally","undefined","setTimeFormat","haveToUpdate","timeFormat","IntlDateElement","getStrings","invokeApi","keys","_Intl","Object","assign","WeakMap","IntlElementBase","options","property","classList","add","IntlElement","formatted","dataset","dateTimeFormat","DateTimeFormat","date","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","arr","isLast","useLast","joined","TelegramMeWebManager","disabled","test","domains","hostname","canRedirect","curValue","ts","tgme_sync","path","encodeURIComponent","suffix","promises","script","onload","onerror","remove","src","body","appendChild","telegramMeWebManager","WebPushApiManager","isAvailable","isPushEnabled","localNotificationsAvailable","settings","isFirefox","navigator","userAgent","toLowerCase","userVisibleOnly","subscribe","serviceWorker","ready","reg","pushManager","subscription","pushSubscriptionNotify","catch","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","task","localNotifications","postSWMessage","isAliveTO","getSubscription","setUpServiceWorkerChannel","unsubscribe","successful","newSettings","addServiceWorkerTaskListener","event","subscriptionObj","toJSON","endpoint","p256dh","auth","tokenType","tokenValue","JSON","stringify","webPushApiManager","EmojiHelper","emojiMap","code","shortcuts","emojis","emojiData","alphaCharsRegExp","urlAlphanumericRegExpPart","urlRegExp","urlProtocolRegExpPart","urlAnyProtocolRegExp","RegExp","fullRegExp","emailRegExp","markdownRegExp","siteHashtags","Telegram","Twitter","Instagram","markdownEntities","passConflictingEntities","Set","RichTextProcessor","getEmojiSpritesheetCoords","emojiCode","unified","parseEntities","raw","entities","matchIndex","rawOffset","index","protocol","tld","substr","balanced","checkBrackets","emojiCoords","unicode","unsafe","findConflictingEntity","currentEntities","newEntity","find","currentEntity","has","mergeEntities","newEntities","filtered","filter","sort","entity","nextEntity","combineSameEntities","nextEntityIdx","findIndex","_i","splice","wrapRichText","lol","passEntities","contextSite","contextExternal","insertPart","startPart","endPart","part","pushPartsAfterSort","noTextFormat","wrappingDraft","language","noLinks","bot","atPos","command","fromBot","html","entityText","masked","wrapped","currentContext","electronHelpers","contextUrl","hashtag","user_id","username","partsLength","partsAfterSortLength","insertAt","usedLength","urlLength","urlOpenBrackets","urlCloseBrackets","charAt","wrapEmojiText","isDraft","tgMeMatch","telescoPeMatch","tgMatch","fullPath","getEmojiEntityFromEmoji","emoji","parseMarkdown","noTrim","pushedEntity","pushEntity","newTextParts","isSOH","toUserId","newText","trim","diff","Math","max","fixEmoji","end","wrapDraftText","messageEntityTextUrl","messageEntityMentionName","replaceUrlEncodings","urlWithEncoded","decodeURIComponent","wrapPlainText","emojiTitle","matchUrl","matchEmail","getAbbreviation","onlyFirst","splitted","first","isUsernameValid","wrapSingleEmoji","dcId","logSuffix","super","debug","handleOpen","handleError","handleClose","removeListeners","handleMessage","byteLength","send","ws","logTypes","Error","Log","Debug","logger","connect","removeEventListener","WebSocket","binaryType","apiManagerProxy","method","performTaskWorker","afterMessageIdTemp","taskId","awaiting","pending","updatesProcessor","hashes","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","isSWRegistered","sockets","taskListeners","taskListenersSW","postMessagesWaiting","onWorkerMessage","callback","progress","rootScope","finalizeTask","start","registerServiceWorker","addTaskListener","toggleStorage","sessionStorage","race","setAuthorized","pause","forceUnsubscribe","cacheName","caches","socketTask","socket","onOpen","onClose","onMessage","buffer","storageTask","res","performTaskWorkerVoid","forceReconnectTimeout","registerWorker","getConfig","register","scope","registration","installing","waiting","active","onServiceWorkerFail","releasePending","controller","responseTask","uploadFile","originalPayload","message","bind","isWebpSupported","onWorkerFirstMessage","once","deferred","taskName","params","o","prepareTempMessageId","messageId","queryJSON","cached","includes","q","cache","processResult","processError","cacheKey","oldPromise","p","size","override","fulfilled","timeout","cacheSeconds","timestamp","verify","queueId","userAuth","dcID","toPeerId","user","setUserAuth","dc_id","enabled","getConfigPromise","config","ScreenSize","MediaSize","width","height","boxSize","fitted","aspect","makeMediaSize","screenSizes","mobile","medium","large","sizes","handhelds","regular","webpage","album","esgSticker","animatedSticker","staticSticker","emojiSticker","poll","round","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","rAF","cancelAnimationFrame","requestAnimationFrame","mediaSizes","months","days","ONE_DAY","getWeekNumber","d","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","formatDateAccordingToTodayNew","today","hour","minute","year","day","month","weekday","formatFullSentTime","timeEl","formatTime","dateEl","fragment","createDocumentFragment","getFullDate","monthAsNumber","getHours","getMinutes","noSeconds","getSeconds","leadingZero","noTime","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","query","dates","setFullYear","setHours","minDate","maxDate","title","dayOfWeek","c","setDate","formatWeekLong","getDay","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","parseInt","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","limitSymbols","limitFrom","escapeRegExp","encodeEntities","charCodeAt","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","_arrayIndex","partLength","convertInputKeyToKey","inputKey","convertKeyToInputKey","toUpperCase","capitalizeFirstLetter","ms","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","String","fromCharCode","rawEmoji","unicodeSurrogates","points","char","previous","toString","getEmojiToneIndex","getCountryEmoji","iso2","emojiFromCodePoints","codePoints","reduce","prev","curr","fromCodePoint"],"mappings":"sFAAA,MAAMA,EAAoBC,SAASC,cAAc,UAAUC,UAAU,cAAcC,WAAW,mBAE/E,O,iCCFf,8CAce,SAASC,EAAeC,EAAgBC,EAAgBC,EAAcC,EAAcC,GAAS,GAC1G,GAAGJ,EAASE,GAAQD,EAASE,GAAQC,EACnC,OAAO,YAAcJ,EAAQC,GAG/B,IAAII,EAAcH,EACdI,EAAcH,EAsBlB,OApBIH,EAASC,EAAWC,EAAOC,EAC7BG,EAAeL,EAASC,EAAOF,EAAU,GAEzCK,EAAeL,EAASG,EAAOF,EAAU,EACtCI,EAAcH,IACfI,EAAeA,EAAcJ,EAAOG,EAAe,EACnDA,EAAcH,IASfE,GAAUC,GAAeL,GAAUM,GAAeL,IACnDI,EAAcL,EACdM,EAAcL,GAGT,YAAcI,EAAaC,GA1CpC,MA6CA,EAAeP,eAAiBA,G,iCCMhC,MAAMQ,EAAoB,IAxCnB,MACE,SACL,IACEC,SAASC,SACT,MAAMC,KAOH,QACL,IACEC,OAAOC,QACP,MAAMF,KAMH,QAeHC,OAAOE,UAME,O,iCCpDA,SAASC,EAAMC,GAC5B,MAAMC,EAAIC,KAAKC,MACf,OAAOH,EAAUC,EAAI,IAAO,EAAIA,EAFlC,mC,iCCAA,YAeO,MAYDG,EAAS,CACbC,MAb8C,CAAC,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,MAAM,kBAAkB,MAAM,QAAQ,MAAM,kBAAkB,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,wCAAwC,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,iBAAiB,KAAK,iBAAiB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,GActs7DC,YAJgD,CAAC,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,MAAM,IAAK,MAAM,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,IAAK,MAAO,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAA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","file":"1.5ce290a0391e0bae24df.chunk.js","sourcesContent":["const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { makeMediaSize } from \"./mediaSizes\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\r\n if(imageW < boxW && imageH < boxH && noZoom) {\r\n return makeMediaSize(imageW, imageH);\r\n }\r\n\r\n let boxedImageW = boxW;\r\n let boxedImageH = boxH;\r\n\r\n if((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = (imageH * boxW / imageW) | 0;\r\n } else {\r\n boxedImageW = (imageW * boxH / imageH) | 0;\r\n if(boxedImageW > boxW) {\r\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\r\n boxedImageW = boxW;\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW;\r\n boxedImageH = imageH;\r\n }\r\n\r\n return makeMediaSize(boxedImageW, boxedImageH);\r\n}\r\n\r\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport class AppRuntimeManager {\r\n public reload() {\r\n try {\r\n location.reload();\r\n } catch(e) {};\r\n\r\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\r\n // chrome.runtime.reload();\r\n // }\r\n }\r\n\r\n public close() {\r\n try {\r\n window.close();\r\n } catch(e) {}\r\n }\r\n\r\n /**\r\n * Better to call from event\r\n */\r\n public focus() {\r\n // // @ts-ignore\r\n // if(window.navigator.mozApps && document.hidden) {\r\n // // Get app instance and launch it to bring app to foreground\r\n // // @ts-ignore\r\n // window.navigator.mozApps.getSelf().onsuccess = function() {\r\n // this.result.launch();\r\n // };\r\n // } else {\r\n // // @ts-ignore\r\n // if(window.chrome && chrome.app && chrome.app.window) {\r\n // // @ts-ignore\r\n // chrome.app.window.current().focus();\r\n // }\r\n\r\n window.focus();\r\n // }\r\n }\r\n}\r\n\r\nconst appRuntimeManager = new AppRuntimeManager();\r\nexport default appRuntimeManager;\r\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : 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 { MOUNT_CLASS_TO } from '../config/debug';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\n\r\n// !WARNING, ТУТ СЛОЖНО! по-хорошему, надо бы это переделать без fe0f, но они здесь необходимы чтобы отрендерить панель, и ниже дописаны 3 элемента которые не воспроизводятся без fe0f\r\nexport const Emoji: {[emoji: string]: number} = {\"2049\":62748,\"2122\":62776,\"2139\":62801,\"2194\":62678,\"2195\":62677,\"2196\":62676,\"2197\":62670,\"2198\":62672,\"2199\":62674,\"2328\":61155,\"2600\":4954,\"2601\":4962,\"2602\":4977,\"2603\":4982,\"2604\":4984,\"2611\":62764,\"2614\":4978,\"2615\":3750,\"2618\":2639,\"2620\":196,\"2622\":62667,\"2623\":62668,\"2626\":62697,\"2638\":62694,\"2639\":168,\"2648\":62702,\"2649\":62703,\"2650\":62710,\"2651\":62711,\"2652\":62712,\"2653\":62713,\"2660\":51057,\"2663\":51060,\"2665\":51058,\"2666\":51059,\"2668\":4832,\"2692\":61258,\"2693\":4887,\"2694\":61261,\"2696\":61272,\"2697\":61280,\"2699\":61270,\"2702\":61245,\"2705\":62763,\"2708\":4895,\"2709\":61206,\"2712\":61220,\"2714\":62765,\"2716\":62742,\"2721\":62693,\"2728\":5993,\"2733\":62771,\"2734\":62772,\"2744\":4981,\"2747\":62773,\"2753\":62749,\"2754\":62750,\"2755\":62751,\"2757\":62752,\"2763\":1127,\"2764\":1129,\"2795\":62743,\"2796\":62744,\"2797\":62745,\"2934\":62681,\"2935\":62682,\"3030\":62753,\"3297\":62825,\"3299\":62826,\"0023-20e3\":62777,\"002a-20e3\":62778,\"0030-20e3\":62779,\"0031-20e3\":62780,\"0032-20e3\":62781,\"0033-20e3\":62782,\"0034-20e3\":62783,\"0035-20e3\":62784,\"0036-20e3\":62785,\"0037-20e3\":62786,\"0038-20e3\":62787,\"0039-20e3\":62788,\"00a9\":62774,\"00ae\":62775,\"1f004\":51063,\"1f0cf\":51062,\"1f170\":62795,\"1f171\":62797,\"1f17e\":62806,\"1f17f\":62808,\"1f18e\":62796,\"1f191\":62798,\"1f192\":62799,\"1f193\":62800,\"1f194\":62802,\"1f195\":62804,\"1f196\":62805,\"1f197\":62807,\"1f198\":62809,\"1f199\":62810,\"1f19a\":62811,\"1f1e6-1f1e8\":71550,\"1f1e6-1f1e9\":71551,\"1f1e6-1f1ea\":71552,\"1f1e6-1f1eb\":71553,\"1f1e6-1f1ec\":71554,\"1f1e6-1f1ee\":71555,\"1f1e6-1f1f1\":71556,\"1f1e6-1f1f2\":71557,\"1f1e6-1f1f4\":71558,\"1f1e6-1f1f6\":71559,\"1f1e6-1f1f7\":71560,\"1f1e6-1f1f8\":71561,\"1f1e6-1f1f9\":71562,\"1f1e6-1f1fa\":71563,\"1f1e6-1f1fc\":71564,\"1f1e6-1f1fd\":71565,\"1f1e6-1f1ff\":71566,\"1f1e7-1f1e6\":71567,\"1f1e7-1f1e7\":71568,\"1f1e7-1f1e9\":71569,\"1f1e7-1f1ea\":71570,\"1f1e7-1f1eb\":71571,\"1f1e7-1f1ec\":71572,\"1f1e7-1f1ed\":71573,\"1f1e7-1f1ee\":71574,\"1f1e7-1f1ef\":71575,\"1f1e7-1f1f1\":71576,\"1f1e7-1f1f2\":71577,\"1f1e7-1f1f3\":71578,\"1f1e7-1f1f4\":71579,\"1f1e7-1f1f6\":71580,\"1f1e7-1f1f7\":71581,\"1f1e7-1f1f8\":71582,\"1f1e7-1f1f9\":71583,\"1f1e7-1f1fb\":71584,\"1f1e7-1f1fc\":71585,\"1f1e7-1f1fe\":71586,\"1f1e7-1f1ff\":71587,\"1f1e8-1f1e6\":71588,\"1f1e8-1f1e8\":71589,\"1f1e8-1f1e9\":71590,\"1f1e8-1f1eb\":71591,\"1f1e8-1f1ec\":71592,\"1f1e8-1f1ed\":71593,\"1f1e8-1f1ee\":71594,\"1f1e8-1f1f0\":71595,\"1f1e8-1f1f1\":71596,\"1f1e8-1f1f2\":71597,\"1f1e8-1f1f3\":71598,\"1f1e8-1f1f4\":71599,\"1f1e8-1f1f5\":71600,\"1f1e8-1f1f7\":71601,\"1f1e8-1f1fa\":71602,\"1f1e8-1f1fb\":71603,\"1f1e8-1f1fc\":71604,\"1f1e8-1f1fd\":71605,\"1f1e8-1f1fe\":71606,\"1f1e8-1f1ff\":71607,\"1f1e9-1f1ea\":71608,\"1f1e9-1f1ec\":71609,\"1f1e9-1f1ef\":71610,\"1f1e9-1f1f0\":71611,\"1f1e9-1f1f2\":71612,\"1f1e9-1f1f4\":71613,\"1f1e9-1f1ff\":71614,\"1f1ea-1f1e6\":71615,\"1f1ea-1f1e8\":71616,\"1f1ea-1f1ea\":71617,\"1f1ea-1f1ec\":71618,\"1f1ea-1f1ed\":71619,\"1f1ea-1f1f7\":71620,\"1f1ea-1f1f8\":71621,\"1f1ea-1f1f9\":71622,\"1f1ea-1f1fa\":71623,\"1f1eb-1f1ee\":71624,\"1f1eb-1f1ef\":71625,\"1f1eb-1f1f0\":71626,\"1f1eb-1f1f2\":71627,\"1f1eb-1f1f4\":71628,\"1f1eb-1f1f7\":71629,\"1f1ec-1f1e6\":71630,\"1f1ec-1f1e7\":71631,\"1f1ec-1f1e9\":71632,\"1f1ec-1f1ea\":71633,\"1f1ec-1f1eb\":71634,\"1f1ec-1f1ec\":71635,\"1f1ec-1f1ed\":71636,\"1f1ec-1f1ee\":71637,\"1f1ec-1f1f1\":71638,\"1f1ec-1f1f2\":71639,\"1f1ec-1f1f3\":71640,\"1f1ec-1f1f5\":71641,\"1f1ec-1f1f6\":71642,\"1f1ec-1f1f7\":71643,\"1f1ec-1f1f8\":71644,\"1f1ec-1f1f9\":71645,\"1f1ec-1f1fa\":71646,\"1f1ec-1f1fc\":71647,\"1f1ec-1f1fe\":71648,\"1f1ed-1f1f0\":71649,\"1f1ed-1f1f2\":71650,\"1f1ed-1f1f3\":71651,\"1f1ed-1f1f7\":71652,\"1f1ed-1f1f9\":71653,\"1f1ed-1f1fa\":71654,\"1f1ee-1f1e8\":71655,\"1f1ee-1f1e9\":71656,\"1f1ee-1f1ea\":71657,\"1f1ee-1f1f1\":71658,\"1f1ee-1f1f2\":71659,\"1f1ee-1f1f3\":71660,\"1f1ee-1f1f4\":71661,\"1f1ee-1f1f6\":71662,\"1f1ee-1f1f7\":71663,\"1f1ee-1f1f8\":71664,\"1f1ee-1f1f9\":71665,\"1f1ef-1f1ea\":71666,\"1f1ef-1f1f2\":71667,\"1f1ef-1f1f4\":71668,\"1f1ef-1f1f5\":71669,\"1f1f0-1f1ea\":71670,\"1f1f0-1f1ec\":71671,\"1f1f0-1f1ed\":71672,\"1f1f0-1f1ee\":71673,\"1f1f0-1f1f2\":71674,\"1f1f0-1f1f3\":71675,\"1f1f0-1f1f5\":71676,\"1f1f0-1f1f7\":71677,\"1f1f0-1f1fc\":71678,\"1f1f0-1f1fe\":71679,\"1f1f0-1f1ff\":71680,\"1f1f1-1f1e6\":71681,\"1f1f1-1f1e7\":71682,\"1f1f1-1f1e8\":71683,\"1f1f1-1f1ee\":71684,\"1f1f1-1f1f0\":71685,\"1f1f1-1f1f7\":71686,\"1f1f1-1f1f8\":71687,\"1f1f1-1f1f9\":71688,\"1f1f1-1f1fa\":71689,\"1f1f1-1f1fb\":71690,\"1f1f1-1f1fe\":71691,\"1f1f2-1f1e6\":71692,\"1f1f2-1f1e8\":71693,\"1f1f2-1f1e9\":71694,\"1f1f2-1f1ea\":71695,\"1f1f2-1f1eb\":71696,\"1f1f2-1f1ec\":71697,\"1f1f2-1f1ed\":71698,\"1f1f2-1f1f0\":71699,\"1f1f2-1f1f1\":71700,\"1f1f2-1f1f2\":71701,\"1f1f2-1f1f3\":71702,\"1f1f2-1f1f4\":71703,\"1f1f2-1f1f5\":71704,\"1f1f2-1f1f6\":71705,\"1f1f2-1f1f7\":71706,\"1f1f2-1f1f8\":71707,\"1f1f2-1f1f9\":71708,\"1f1f2-1f1fa\":71709,\"1f1f2-1f1fb\":71710,\"1f1f2-1f1fc\":71711,\"1f1f2-1f1fd\":71712,\"1f1f2-1f1fe\":71713,\"1f1f2-1f1ff\":71714,\"1f1f3-1f1e6\":71715,\"1f1f3-1f1e8\":71716,\"1f1f3-1f1ea\":71717,\"1f1f3-1f1eb\":71718,\"1f1f3-1f1ec\":71719,\"1f1f3-1f1ee\":71720,\"1f1f3-1f1f1\":71721,\"1f1f3-1f1f4\":71722,\"1f1f3-1f1f5\":71723,\"1f1f3-1f1f7\":71724,\"1f1f3-1f1fa\":71725,\"1f1f3-1f1ff\":71726,\"1f1f4-1f1f2\":71727,\"1f1f5-1f1e6\":71728,\"1f1f5-1f1ea\":71729,\"1f1f5-1f1eb\":71730,\"1f1f5-1f1ec\":71731,\"1f1f5-1f1ed\":71732,\"1f1f5-1f1f0\":71733,\"1f1f5-1f1f1\":71734,\"1f1f5-1f1f2\":71735,\"1f1f5-1f1f3\":71736,\"1f1f5-1f1f7\":71737,\"1f1f5-1f1f8\":71738,\"1f1f5-1f1f9\":71739,\"1f1f5-1f1fc\":71740,\"1f1f5-1f1fe\":71741,\"1f1f6-1f1e6\":71742,\"1f1f7-1f1ea\":71743,\"1f1f7-1f1f4\":71744,\"1f1f7-1f1f8\":71745,\"1f1f7-1f1fa\":71746,\"1f1f7-1f1fc\":71747,\"1f1f8-1f1e6\":71748,\"1f1f8-1f1e7\":71749,\"1f1f8-1f1e8\":71750,\"1f1f8-1f1e9\":71751,\"1f1f8-1f1ea\":71752,\"1f1f8-1f1ec\":71753,\"1f1f8-1f1ed\":71754,\"1f1f8-1f1ee\":71755,\"1f1f8-1f1ef\":71756,\"1f1f8-1f1f0\":71757,\"1f1f8-1f1f1\":71758,\"1f1f8-1f1f2\":71759,\"1f1f8-1f1f3\":71760,\"1f1f8-1f1f4\":71761,\"1f1f8-1f1f7\":71762,\"1f1f8-1f1f8\":71763,\"1f1f8-1f1f9\":71764,\"1f1f8-1f1fb\":71765,\"1f1f8-1f1fd\":71766,\"1f1f8-1f1fe\":71767,\"1f1f8-1f1ff\":71768,\"1f1f9-1f1e6\":71769,\"1f1f9-1f1e8\":71770,\"1f1f9-1f1e9\":71771,\"1f1f9-1f1eb\":71772,\"1f1f9-1f1ec\":71773,\"1f1f9-1f1ed\":71774,\"1f1f9-1f1ef\":71775,\"1f1f9-1f1f0\":71776,\"1f1f9-1f1f1\":71777,\"1f1f9-1f1f2\":71778,\"1f1f9-1f1f3\":71779,\"1f1f9-1f1f4\":71780,\"1f1f9-1f1f7\":71781,\"1f1f9-1f1f9\":71782,\"1f1f9-1f1fb\":71783,\"1f1f9-1f1fc\":71784,\"1f1f9-1f1ff\":71785,\"1f1fa-1f1e6\":71786,\"1f1fa-1f1ec\":71787,\"1f1fa-1f1f2\":71788,\"1f1fa-1f1f3\":71789,\"1f1fa-1f1f8\":71790,\"1f1fa-1f1fe\":71791,\"1f1fa-1f1ff\":71792,\"1f1fb-1f1e6\":71793,\"1f1fb-1f1e8\":71794,\"1f1fb-1f1ea\":71795,\"1f1fb-1f1ec\":71796,\"1f1fb-1f1ee\":71797,\"1f1fb-1f1f3\":71798,\"1f1fb-1f1fa\":71799,\"1f1fc-1f1eb\":71800,\"1f1fc-1f1f8\":71801,\"1f1fd-1f1f0\":71802,\"1f1fe-1f1ea\":71803,\"1f1fe-1f1f9\":71804,\"1f1ff-1f1e6\":71805,\"1f1ff-1f1f2\":71806,\"1f1ff-1f1fc\":71807,\"1f201\":62812,\"1f202\":62813,\"1f21a\":62819,\"1f22f\":62816,\"1f232\":62820,\"1f233\":62824,\"1f234\":62823,\"1f235\":62828,\"1f236\":62815,\"1f237\":62814,\"1f238\":62822,\"1f239\":62818,\"1f23a\":62827,\"1f250\":62817,\"1f251\":62821,\"1f300\":4974,\"1f301\":4824,\"1f302\":4976,\"1f303\":4825,\"1f304\":4827,\"1f305\":4828,\"1f306\":4829,\"1f307\":4830,\"1f308\":4975,\"1f309\":4831,\"1f30a\":4987,\"1f30b\":4782,\"1f30c\":4961,\"1f30d\":4773,\"1f30e\":4774,\"1f30f\":4775,\"1f310\":4776,\"1f311\":4941,\"1f312\":4942,\"1f313\":4943,\"1f314\":4944,\"1f315\":4945,\"1f316\":4946,\"1f317\":4947,\"1f318\":4948,\"1f319\":4949,\"1f31a\":4950,\"1f31b\":4951,\"1f31c\":4952,\"1f31d\":4955,\"1f31e\":4956,\"1f31f\":4959,\"1f320\":4960,\"1f321\":4953,\"1f324\":4965,\"1f325\":4966,\"1f326\":4967,\"1f327\":4968,\"1f328\":4969,\"1f329\":4970,\"1f32a\":4971,\"1f32b\":4972,\"1f32c\":4973,\"1f32d\":3694,\"1f32e\":3696,\"1f32f\":3697,\"1f330\":3677,\"1f331\":2631,\"1f332\":2633,\"1f333\":2634,\"1f334\":2635,\"1f335\":2636,\"1f336\":3668,\"1f337\":2630,\"1f338\":2622,\"1f339\":2625,\"1f33a\":2627,\"1f33b\":2628,\"1f33c\":2629,\"1f33d\":3667,\"1f33e\":2637,\"1f33f\":2638,\"1f340\":2640,\"1f341\":2641,\"1f342\":2642,\"1f343\":2643,\"1f344\":3675,\"1f345\":3660,\"1f346\":3664,\"1f347\":3644,\"1f348\":3645,\"1f349\":3646,\"1f34a\":3647,\"1f34b\":3648,\"1f34c\":3649,\"1f34d\":3650,\"1f34e\":3652,\"1f34f\":3653,\"1f350\":3654,\"1f351\":3655,\"1f352\":3656,\"1f353\":3657,\"1f354\":3691,\"1f355\":3693,\"1f356\":3687,\"1f357\":3688,\"1f358\":3713,\"1f359\":3714,\"1f35a\":3715,\"1f35b\":3716,\"1f35c\":3717,\"1f35d\":3718,\"1f35e\":3678,\"1f35f\":3692,\"1f360\":3719,\"1f361\":3725,\"1f362\":3720,\"1f363\":3721,\"1f364\":3722,\"1f365\":3723,\"1f366\":3734,\"1f367\":3735,\"1f368\":3736,\"1f369\":3737,\"1f36a\":3738,\"1f36b\":3743,\"1f36c\":3744,\"1f36d\":3745,\"1f36e\":3746,\"1f36f\":3747,\"1f370\":3740,\"1f371\":3712,\"1f372\":3704,\"1f373\":3702,\"1f374\":3769,\"1f375\":3752,\"1f376\":3753,\"1f377\":3755,\"1f378\":3756,\"1f379\":3757,\"1f37a\":3758,\"1f37b\":3759,\"1f37c\":3748,\"1f37d\":3768,\"1f37e\":3754,\"1f37f\":3708,\"1f380\":51004,\"1f381\":51005,\"1f382\":3739,\"1f383\":5988,\"1f384\":5989,\"1f385\":1490,\"1f386\":5990,\"1f387\":5991,\"1f388\":5994,\"1f389\":5995,\"1f38a\":5996,\"1f38b\":5997,\"1f38c\":71544,\"1f38d\":5998,\"1f38e\":5999,\"1f38f\":51000,\"1f390\":51001,\"1f391\":51002,\"1f392\":61096,\"1f393\":61109,\"1f396\":51009,\"1f397\":51006,\"1f399\":61129,\"1f39a\":61130,\"1f39b\":61131,\"1f39e\":61164,\"1f39f\":51007,\"1f3a0\":4833,\"1f3a1\":4834,\"1f3a2\":4835,\"1f3a3\":51036,\"1f3a4\":61132,\"1f3a5\":61163,\"1f3a6\":62733,\"1f3a7\":61133,\"1f3a8\":51067,\"1f3a9\":61108,\"1f3aa\":4837,\"1f3ab\":51008,\"1f3ac\":61166,\"1f3ad\":51065,\"1f3ae\":51049,\"1f3af\":51042,\"1f3b0\":51051,\"1f3b1\":51045,\"1f3b2\":51052,\"1f3b3\":51024,\"1f3b4\":51064,\"1f3b5\":61127,\"1f3b6\":61128,\"1f3b7\":61135,\"1f3b8\":61137,\"1f3b9\":61138,\"1f3ba\":61139,\"1f3bb\":61140,\"1f3bc\":61126,\"1f3bd\":51038,\"1f3be\":51022,\"1f3bf\":51039,\"1f3c0\":51018,\"1f3c1\":71542,\"1f3c2\":1562,\"1f3c3-200d-2640\":1546,\"1f3c3-200d-2642\":1545,\"1f3c3\":1544,\"1f3c4-200d-2640\":1568,\"1f3c4-200d-2642\":1567,\"1f3c4\":1566,\"1f3c5\":51011,\"1f3c6\":51010,\"1f3c7\":1560,\"1f3c8\":51020,\"1f3c9\":51021,\"1f3ca-200d-2640\":1574,\"1f3ca-200d-2642\":1573,\"1f3ca\":1572,\"1f3cb-200d-2640\":1580,\"1f3cb-200d-2642\":1579,\"1f3cb\":1578,\"1f3cc-200d-2640\":1565,\"1f3cc-200d-2642\":1564,\"1f3cc\":1563,\"1f3cd\":4868,\"1f3ce\":4867,\"1f3cf\":51025,\"1f3d0\":51019,\"1f3d1\":51026,\"1f3d2\":51027,\"1f3d3\":51029,\"1f3d4\":4780,\"1f3d5\":4784,\"1f3d6\":4785,\"1f3d7\":4791,\"1f3d8\":4796,\"1f3d9\":4826,\"1f3da\":4797,\"1f3db\":4790,\"1f3dc\":4786,\"1f3dd\":4787,\"1f3de\":4788,\"1f3df\":4789,\"1f3e0\":4798,\"1f3e1\":4799,\"1f3e2\":4800,\"1f3e3\":4801,\"1f3e4\":4802,\"1f3e5\":4803,\"1f3e6\":4804,\"1f3e7\":62643,\"1f3e8\":4805,\"1f3e9\":4806,\"1f3ea\":4807,\"1f3eb\":4808,\"1f3ec\":4809,\"1f3ed\":4810,\"1f3ee\":61177,\"1f3ef\":4811,\"1f3f0\":4812,\"1f3f3-200d-1f308\":71547,\"1f3f3-200d-26a7\":71548,\"1f3f3\":71546,\"1f3f4-200d-2620\":71549,\"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f\":71808,\"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f\":71809,\"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f\":71810,\"1f3f4\":71545,\"1f3f5\":2624,\"1f3f7\":61195,\"1f3f8\":51030,\"1f3f9\":61264,\"1f3fa\":3772,\"1f3fb\":9499,\"1f3fc\":9500,\"1f3fd\":9501,\"1f3fe\":9502,\"1f3ff\":9503,\"1f400\":2550,\"1f401\":2549,\"1f402\":2530,\"1f403\":2531,\"1f404\":2532,\"1f405\":2521,\"1f406\":2522,\"1f407\":2553,\"1f408-200d-2b1b\":2518,\"1f408\":2517,\"1f409\":2592,\"1f40a\":2587,\"1f40b\":2596,\"1f40c\":2605,\"1f40d\":2590,\"1f40e\":2524,\"1f40f\":2537,\"1f410\":2539,\"1f411\":2538,\"1f412\":2505,\"1f413\":2570,\"1f414\":2569,\"1f415-200d-1f9ba\":2511,\"1f415\":2509,\"1f416\":2534,\"1f417\":2535,\"1f418\":2544,\"1f419\":2603,\"1f41a\":2604,\"1f41b\":2607,\"1f41c\":2608,\"1f41d\":2609,\"1f41e\":2611,\"1f41f\":2599,\"1f420\":2600,\"1f421\":2601,\"1f422\":2588,\"1f423\":2571,\"1f424\":2572,\"1f425\":2573,\"1f426\":2574,\"1f427\":2575,\"1f428\":2560,\"1f429\":2512,\"1f42a\":2540,\"1f42b\":2541,\"1f42c\":2597,\"1f42d\":2548,\"1f42e\":2529,\"1f42f\":2520,\"1f430\":2552,\"1f431\":2516,\"1f432\":2591,\"1f433\":2595,\"1f434\":2523,\"1f435\":2504,\"1f436\":2508,\"1f437\":2533,\"1f438\":2586,\"1f439\":2551,\"1f43a\":2513,\"1f43b-200d-2744\":2559,\"1f43b\":2558,\"1f43c\":2561,\"1f43d\":2536,\"1f43e\":2567,\"1f43f\":2554,\"1f440\":1350,\"1f441-200d-1f5e8\":1147,\"1f441\":1351,\"1f442\":1342,\"1f443\":1344,\"1f444\":1353,\"1f445\":1352,\"1f446\":1318,\"1f447\":1320,\"1f448\":1316,\"1f449\":1317,\"1f44a\":1325,\"1f44b\":1303,\"1f44c\":1308,\"1f44d\":1322,\"1f44e\":1323,\"1f44f\":1328,\"1f450\":1330,\"1f451\":61106,\"1f452\":61107,\"1f453\":61072,\"1f454\":61077,\"1f455\":61078,\"1f456\":61079,\"1f457\":61084,\"1f458\":61085,\"1f459\":61090,\"1f45a\":61091,\"1f45b\":61092,\"1f45c\":61093,\"1f45d\":61094,\"1f45e\":61098,\"1f45f\":61099,\"1f460\":61102,\"1f461\":61103,\"1f462\":61105,\"1f463\":1649,\"1f464\":1646,\"1f465\":1647,\"1f466\":1356,\"1f467\":1357,\"1f468-200d-1f33e\":1423,\"1f468-200d-1f373\":1426,\"1f468-200d-1f37c\":1487,\"1f468-200d-1f393\":1414,\"1f468-200d-1f3a4\":1444,\"1f468-200d-1f3a8\":1447,\"1f468-200d-1f3eb\":1417,\"1f468-200d-1f3ed\":1432,\"1f468-200d-1f466-200d-1f466\":1636,\"1f468-200d-1f466\":1635,\"1f468-200d-1f467-200d-1f466\":1638,\"1f468-200d-1f467-200d-1f467\":1639,\"1f468-200d-1f467\":1637,\"1f468-200d-1f468-200d-1f466\":1625,\"1f468-200d-1f468-200d-1f466-200d-1f466\":1628,\"1f468-200d-1f468-200d-1f467\":1626,\"1f468-200d-1f468-200d-1f467-200d-1f466\":1627,\"1f468-200d-1f468-200d-1f467-200d-1f467\":1629,\"1f468-200d-1f469-200d-1f466\":1620,\"1f468-200d-1f469-200d-1f466-200d-1f466\":1623,\"1f468-200d-1f469-200d-1f467\":1621,\"1f468-200d-1f469-200d-1f467-200d-1f466\":1622,\"1f468-200d-1f469-200d-1f467-200d-1f467\":1624,\"1f468-200d-1f4bb\":1441,\"1f468-200d-1f4bc\":1435,\"1f468-200d-1f527\":1429,\"1f468-200d-1f52c\":1438,\"1f468-200d-1f680\":1453,\"1f468-200d-1f692\":1456,\"1f468-200d-1f9af\":1536,\"1f468-200d-1f9b0\":1362,\"1f468-200d-1f9b1\":1363,\"1f468-200d-1f9b2\":1365,\"1f468-200d-1f9b3\":1364,\"1f468-200d-1f9bc\":1539,\"1f468-200d-1f9bd\":1542,\"1f468-200d-2695\":1411,\"1f468-200d-2696\":1420,\"1f468-200d-2708\":1450,\"1f468-200d-2764-200d-1f468\":1617,\"1f468-200d-2764-200d-1f48b-200d-1f468\":1613,\"1f468\":1360,\"1f469-200d-1f33e\":1424,\"1f469-200d-1f373\":1427,\"1f469-200d-1f37c\":1486,\"1f469-200d-1f393\":1415,\"1f469-200d-1f3a4\":1445,\"1f469-200d-1f3a8\":1448,\"1f469-200d-1f3eb\":1418,\"1f469-200d-1f3ed\":1433,\"1f469-200d-1f466-200d-1f466\":1641,\"1f469-200d-1f466\":1640,\"1f469-200d-1f467-200d-1f466\":1643,\"1f469-200d-1f467-200d-1f467\":1644,\"1f469-200d-1f467\":1642,\"1f469-200d-1f469-200d-1f466\":1630,\"1f469-200d-1f469-200d-1f466-200d-1f466\":1633,\"1f469-200d-1f469-200d-1f467\":1631,\"1f469-200d-1f469-200d-1f467-200d-1f466\":1632,\"1f469-200d-1f469-200d-1f467-200d-1f467\":1634,\"1f469-200d-1f4bb\":1442,\"1f469-200d-1f4bc\":1436,\"1f469-200d-1f527\":1430,\"1f469-200d-1f52c\":1439,\"1f469-200d-1f680\":1454,\"1f469-200d-1f692\":1457,\"1f469-200d-1f9af\":1537,\"1f469-200d-1f9b0\":1367,\"1f469-200d-1f9b1\":1369,\"1f469-200d-1f9b2\":1373,\"1f469-200d-1f9b3\":1371,\"1f469-200d-1f9bc\":1540,\"1f469-200d-1f9bd\":1543,\"1f469-200d-2695\":1412,\"1f469-200d-2696\":1421,\"1f469-200d-2708\":1451,\"1f469-200d-2764-200d-1f468\":1616,\"1f469-200d-2764-200d-1f469\":1618,\"1f469-200d-2764-200d-1f48b-200d-1f468\":1612,\"1f469-200d-2764-200d-1f48b-200d-1f469\":1614,\"1f469\":1366,\"1f46a\":1619,\"1f46b\":1609,\"1f46c\":1610,\"1f46d\":1608,\"1f46e-200d-2640\":1460,\"1f46e-200d-2642\":1459,\"1f46e\":1458,\"1f46f-200d-2640\":1552,\"1f46f-200d-2642\":1551,\"1f46f\":1550,\"1f470-200d-2640\":1483,\"1f470-200d-2642\":1482,\"1f470\":1481,\"1f471-200d-2640\":1375,\"1f471-200d-2642\":1376,\"1f471\":1359,\"1f472\":1476,\"1f473-200d-2640\":1475,\"1f473-200d-2642\":1474,\"1f473\":1473,\"1f474\":1378,\"1f475\":1379,\"1f476\":1354,\"1f477-200d-2640\":1470,\"1f477-200d-2642\":1469,\"1f477\":1468,\"1f478\":1472,\"1f479\":199,\"1f47a\":1100,\"1f47b\":1101,\"1f47c\":1489,\"1f47d\":1102,\"1f47e\":1103,\"1f47f\":194,\"1f480\":195,\"1f481-200d-2640\":1394,\"1f481-200d-2642\":1393,\"1f481\":1392,\"1f482-200d-2640\":1466,\"1f482-200d-2642\":1465,\"1f482\":1464,\"1f483\":1547,\"1f484\":61114,\"1f485\":1335,\"1f486-200d-2640\":1522,\"1f486-200d-2642\":1521,\"1f486\":1520,\"1f487-200d-2640\":1525,\"1f487-200d-2642\":1524,\"1f487\":1523,\"1f488\":4836,\"1f489\":61287,\"1f48a\":61289,\"1f48b\":1117,\"1f48c\":1118,\"1f48d\":61115,\"1f48e\":61116,\"1f48f\":1611,\"1f490\":2621,\"1f491\":1615,\"1f492\":4813,\"1f493\":1123,\"1f494\":1128,\"1f495\":1125,\"1f496\":1121,\"1f497\":1122,\"1f498\":1119,\"1f499\":1133,\"1f49a\":1132,\"1f49b\":1131,\"1f49c\":1134,\"1f49d\":1120,\"1f49e\":1124,\"1f49f\":1126,\"1f4a0\":62859,\"1f4a1\":61175,\"1f4a2\":1139,\"1f4a3\":1145,\"1f4a4\":1151,\"1f4a5\":1140,\"1f4a6\":1142,\"1f4a7\":4986,\"1f4a8\":1143,\"1f4a9\":197,\"1f4aa\":1337,\"1f4ab\":1141,\"1f4ac\":1146,\"1f4ad\":1150,\"1f4ae\":2623,\"1f4af\":1138,\"1f4b0\":61196,\"1f4b1\":62754,\"1f4b2\":62755,\"1f4b3\":61203,\"1f4b4\":61198,\"1f4b5\":61199,\"1f4b6\":61200,\"1f4b7\":61201,\"1f4b8\":61202,\"1f4b9\":61205,\"1f4ba\":4900,\"1f4bb\":61152,\"1f4bc\":61226,\"1f4bd\":61158,\"1f4be\":61159,\"1f4bf\":61160,\"1f4c0\":61161,\"1f4c1\":61227,\"1f4c2\":61228,\"1f4c3\":61188,\"1f4c4\":61190,\"1f4c5\":61230,\"1f4c6\":61231,\"1f4c7\":61234,\"1f4c8\":61235,\"1f4c9\":61236,\"1f4ca\":61237,\"1f4cb\":61238,\"1f4cc\":61239,\"1f4cd\":61240,\"1f4ce\":61241,\"1f4cf\":61243,\"1f4d0\":61244,\"1f4d1\":61193,\"1f4d2\":61187,\"1f4d3\":61186,\"1f4d4\":61179,\"1f4d5\":61180,\"1f4d6\":61181,\"1f4d7\":61182,\"1f4d8\":61183,\"1f4d9\":61184,\"1f4da\":61185,\"1f4db\":62760,\"1f4dc\":61189,\"1f4dd\":61225,\"1f4de\":61147,\"1f4df\":61148,\"1f4e0\":61149,\"1f4e1\":61286,\"1f4e2\":61121,\"1f4e3\":61122,\"1f4e4\":61210,\"1f4e5\":61211,\"1f4e6\":61212,\"1f4e7\":61207,\"1f4e8\":61208,\"1f4e9\":61209,\"1f4ea\":61214,\"1f4eb\":61213,\"1f4ec\":61215,\"1f4ed\":61216,\"1f4ee\":61217,\"1f4ef\":61123,\"1f4f0\":61191,\"1f4f1\":61144,\"1f4f2\":61145,\"1f4f3\":62737,\"1f4f4\":62738,\"1f4f5\":62665,\"1f4f6\":62736,\"1f4f7\":61168,\"1f4f8\":61169,\"1f4f9\":61170,\"1f4fa\":61167,\"1f4fb\":61134,\"1f4fc\":61171,\"1f4fd\":61165,\"1f4ff\":61113,\"1f500\":62715,\"1f501\":62716,\"1f502\":62717,\"1f503\":62683,\"1f504\":62684,\"1f505\":62734,\"1f506\":62735,\"1f507\":61117,\"1f508\":61118,\"1f509\":61119,\"1f50a\":61120,\"1f50b\":61150,\"1f50c\":61151,\"1f50d\":61172,\"1f50e\":61173,\"1f50f\":61251,\"1f510\":61252,\"1f511\":61253,\"1f512\":61249,\"1f513\":61250,\"1f514\":61124,\"1f515\":61125,\"1f516\":61194,\"1f517\":61274,\"1f518\":62860,\"1f519\":62685,\"1f51a\":62686,\"1f51b\":62687,\"1f51c\":62688,\"1f51d\":62689,\"1f51e\":62666,\"1f51f\":62789,\"1f520\":62790,\"1f521\":62791,\"1f522\":62792,\"1f523\":62793,\"1f524\":62794,\"1f525\":4985,\"1f526\":61176,\"1f527\":61267,\"1f528\":61255,\"1f529\":61269,\"1f52a\":3771,\"1f52b\":61262,\"1f52c\":61284,\"1f52d\":61285,\"1f52e\":51046,\"1f52f\":62701,\"1f530\":62761,\"1f531\":62759,\"1f532\":62862,\"1f533\":62861,\"1f534\":62829,\"1f535\":62833,\"1f536\":62853,\"1f537\":62854,\"1f538\":62855,\"1f539\":62856,\"1f53a\":62857,\"1f53b\":62858,\"1f53c\":62725,\"1f53d\":62727,\"1f549\":62692,\"1f54a\":2576,\"1f54b\":4821,\"1f54c\":4817,\"1f54d\":4819,\"1f54e\":62700,\"1f550\":4919,\"1f551\":4921,\"1f552\":4923,\"1f553\":4925,\"1f554\":4927,\"1f555\":4929,\"1f556\":4931,\"1f557\":4933,\"1f558\":4935,\"1f559\":4937,\"1f55a\":4939,\"1f55b\":4917,\"1f55c\":4920,\"1f55d\":4922,\"1f55e\":4924,\"1f55f\":4926,\"1f560\":4928,\"1f561\":4930,\"1f562\":4932,\"1f563\":4934,\"1f564\":4936,\"1f565\":4938,\"1f566\":4940,\"1f567\":4918,\"1f56f\":61174,\"1f570\":4916,\"1f573\":1144,\"1f574\":1549,\"1f575-200d-2640\":1463,\"1f575-200d-2642\":1462,\"1f575\":1461,\"1f576\":61073,\"1f577\":2614,\"1f578\":2615,\"1f579\":51050,\"1f57a\":1548,\"1f587\":61242,\"1f58a\":61222,\"1f58b\":61221,\"1f58c\":61223,\"1f58d\":61224,\"1f590\":1305,\"1f595\":1319,\"1f596\":1307,\"1f5a4\":1136,\"1f5a5\":61153,\"1f5a8\":61154,\"1f5b1\":61156,\"1f5b2\":61157,\"1f5bc\":51066,\"1f5c2\":61229,\"1f5c3\":61246,\"1f5c4\":61247,\"1f5d1\":61248,\"1f5d2\":61232,\"1f5d3\":61233,\"1f5dc\":61271,\"1f5dd\":61254,\"1f5de\":61192,\"1f5e1\":61260,\"1f5e3\":1645,\"1f5e8\":1148,\"1f5ef\":1149,\"1f5f3\":61218,\"1f5fa\":4777,\"1f5fb\":4783,\"1f5fc\":4814,\"1f5fd\":4815,\"1f5fe\":4778,\"1f5ff\":61320,\"1f600\":11,\"1f601\":14,\"1f602\":18,\"1f603\":12,\"1f604\":13,\"1f605\":16,\"1f606\":15,\"1f607\":113,\"1f608\":193,\"1f609\":111,\"1f60a\":112,\"1f60b\":123,\"1f60c\":143,\"1f60d\":115,\"1f60e\":162,\"1f60f\":138,\"1f610\":135,\"1f611\":136,\"1f612\":139,\"1f613\":185,\"1f614\":144,\"1f615\":165,\"1f616\":182,\"1f617\":118,\"1f618\":117,\"1f619\":121,\"1f61a\":120,\"1f61b\":124,\"1f61c\":125,\"1f61d\":127,\"1f61e\":184,\"1f61f\":166,\"1f620\":191,\"1f621\":190,\"1f622\":179,\"1f623\":183,\"1f624\":189,\"1f625\":178,\"1f626\":174,\"1f627\":175,\"1f628\":176,\"1f629\":186,\"1f62a\":145,\"1f62b\":187,\"1f62c\":141,\"1f62d\":180,\"1f62e\":169,\"1f62f\":170,\"1f630\":177,\"1f631\":181,\"1f632\":171,\"1f633\":172,\"1f634\":147,\"1f635\":157,\"1f636\":137,\"1f637\":148,\"1f638\":1106,\"1f639\":1107,\"1f63a\":1105,\"1f63b\":1108,\"1f63c\":1109,\"1f63d\":1110,\"1f63e\":1113,\"1f63f\":1112,\"1f640\":1111,\"1f641\":167,\"1f642\":19,\"1f643\":110,\"1f644\":140,\"1f645-200d-2640\":1388,\"1f645-200d-2642\":1387,\"1f645\":1386,\"1f646-200d-2640\":1391,\"1f646-200d-2642\":1390,\"1f646\":1389,\"1f647-200d-2640\":1403,\"1f647-200d-2642\":1402,\"1f647\":1401,\"1f648\":1114,\"1f649\":1115,\"1f64a\":1116,\"1f64b-200d-2640\":1397,\"1f64b-200d-2642\":1396,\"1f64b\":1395,\"1f64c\":1329,\"1f64d-200d-2640\":1382,\"1f64d-200d-2642\":1381,\"1f64d\":1380,\"1f64e-200d-2640\":1385,\"1f64e-200d-2642\":1384,\"1f64e\":1383,\"1f64f\":1333,\"1f680\":4906,\"1f681\":4901,\"1f682\":4838,\"1f683\":4839,\"1f684\":4840,\"1f685\":4841,\"1f686\":4842,\"1f687\":4843,\"1f688\":4844,\"1f689\":4845,\"1f68a\":4846,\"1f68b\":4849,\"1f68c\":4850,\"1f68d\":4851,\"1f68e\":4852,\"1f68f\":4877,\"1f690\":4853,\"1f691\":4854,\"1f692\":4855,\"1f693\":4856,\"1f694\":4857,\"1f695\":4858,\"1f696\":4859,\"1f697\":4860,\"1f698\":4861,\"1f699\":4862,\"1f69a\":4864,\"1f69b\":4865,\"1f69c\":4866,\"1f69d\":4847,\"1f69e\":4848,\"1f69f\":4902,\"1f6a0\":4903,\"1f6a1\":4904,\"1f6a2\":4894,\"1f6a3-200d-2640\":1571,\"1f6a3-200d-2642\":1570,\"1f6a3\":1569,\"1f6a4\":4890,\"1f6a5\":4883,\"1f6a6\":4884,\"1f6a7\":4886,\"1f6a8\":4882,\"1f6a9\":71543,\"1f6aa\":61292,\"1f6ab\":62659,\"1f6ac\":61316,\"1f6ad\":62661,\"1f6ae\":62644,\"1f6af\":62662,\"1f6b0\":62645,\"1f6b1\":62663,\"1f6b2\":4873,\"1f6b3\":62660,\"1f6b4-200d-2640\":1583,\"1f6b4-200d-2642\":1582,\"1f6b4\":1581,\"1f6b5-200d-2640\":1586,\"1f6b5-200d-2642\":1585,\"1f6b5\":1584,\"1f6b6-200d-2640\":1528,\"1f6b6-200d-2642\":1527,\"1f6b6\":1526,\"1f6b7\":62664,\"1f6b8\":62657,\"1f6b9\":62647,\"1f6ba\":62648,\"1f6bb\":62649,\"1f6bc\":62650,\"1f6bd\":61299,\"1f6be\":62651,\"1f6bf\":61301,\"1f6c0\":1605,\"1f6c1\":61302,\"1f6c2\":62652,\"1f6c3\":62653,\"1f6c4\":62654,\"1f6c5\":62655,\"1f6cb\":61297,\"1f6cc\":1606,\"1f6cd\":61095,\"1f6ce\":4908,\"1f6cf\":61296,\"1f6d0\":62690,\"1f6d1\":4885,\"1f6d2\":61315,\"1f6d5\":4818,\"1f6d6\":4795,\"1f6d7\":61293,\"1f6e0\":61259,\"1f6e1\":61265,\"1f6e2\":4880,\"1f6e3\":4878,\"1f6e4\":4879,\"1f6e5\":4893,\"1f6e9\":4896,\"1f6eb\":4897,\"1f6ec\":4898,\"1f6f0\":4905,\"1f6f3\":4891,\"1f6f4\":4874,\"1f6f5\":4869,\"1f6f6\":4889,\"1f6f7\":51040,\"1f6f8\":4907,\"1f6f9\":4875,\"1f6fa\":4872,\"1f6fb\":4863,\"1f6fc\":4876,\"1f7e0\":62830,\"1f7e1\":62831,\"1f7e2\":62832,\"1f7e3\":62834,\"1f7e4\":62835,\"1f7e5\":62838,\"1f7e6\":62842,\"1f7e7\":62839,\"1f7e8\":62840,\"1f7e9\":62841,\"1f7ea\":62843,\"1f7eb\":62844,\"1f90c\":1309,\"1f90d\":1137,\"1f90e\":1135,\"1f90f\":1310,\"1f910\":133,\"1f911\":128,\"1f912\":149,\"1f913\":163,\"1f914\":132,\"1f915\":150,\"1f916\":1104,\"1f917\":129,\"1f918\":1314,\"1f919\":1315,\"1f91a\":1304,\"1f91b\":1326,\"1f91c\":1327,\"1f91d\":1332,\"1f91e\":1312,\"1f91f\":1313,\"1f920\":159,\"1f921\":198,\"1f922\":151,\"1f923\":17,\"1f924\":146,\"1f925\":142,\"1f926-200d-2640\":1406,\"1f926-200d-2642\":1405,\"1f926\":1404,\"1f927\":153,\"1f928\":134,\"1f929\":116,\"1f92a\":126,\"1f92b\":131,\"1f92c\":192,\"1f92d\":130,\"1f92e\":152,\"1f92f\":158,\"1f930\":1484,\"1f931\":1485,\"1f932\":1331,\"1f933\":1336,\"1f934\":1471,\"1f935-200d-2640\":1480,\"1f935-200d-2642\":1479,\"1f935\":1478,\"1f936\":1491,\"1f937-200d-2640\":1409,\"1f937-200d-2642\":1408,\"1f937\":1407,\"1f938-200d-2640\":1589,\"1f938-200d-2642\":1588,\"1f938\":1587,\"1f939-200d-2640\":1601,\"1f939-200d-2642\":1600,\"1f939\":1599,\"1f93a\":1559,\"1f93c-200d-2640\":1592,\"1f93c-200d-2642\":1591,\"1f93c\":1590,\"1f93d-200d-2640\":1595,\"1f93d-200d-2642\":1594,\"1f93d\":1593,\"1f93e-200d-2640\":1598,\"1f93e-200d-2642\":1597,\"1f93e\":1596,\"1f93f\":51037,\"1f940\":2626,\"1f941\":61142,\"1f942\":3760,\"1f943\":3761,\"1f944\":3770,\"1f945\":51033,\"1f947\":51012,\"1f948\":51013,\"1f949\":51014,\"1f94a\":51031,\"1f94b\":51032,\"1f94c\":51041,\"1f94d\":51028,\"1f94e\":51017,\"1f94f\":51023,\"1f950\":3679,\"1f951\":3663,\"1f952\":3670,\"1f953\":3690,\"1f954\":3665,\"1f955\":3666,\"1f956\":3680,\"1f957\":3707,\"1f958\":3703,\"1f959\":3699,\"1f95a\":3701,\"1f95b\":3749,\"1f95c\":3676,\"1f95d\":3659,\"1f95e\":3684,\"1f95f\":3726,\"1f960\":3727,\"1f961\":3728,\"1f962\":3767,\"1f963\":3706,\"1f964\":3762,\"1f965\":3662,\"1f966\":3672,\"1f967\":3742,\"1f968\":3682,\"1f969\":3689,\"1f96a\":3695,\"1f96b\":3711,\"1f96c\":3671,\"1f96d\":3651,\"1f96e\":3724,\"1f96f\":3683,\"1f970\":114,\"1f971\":188,\"1f972\":122,\"1f973\":160,\"1f974\":156,\"1f975\":154,\"1f976\":155,\"1f977\":1467,\"1f978\":161,\"1f97a\":173,\"1f97b\":61086,\"1f97c\":61075,\"1f97d\":61074,\"1f97e\":61100,\"1f97f\":61101,\"1f980\":3729,\"1f981\":2519,\"1f982\":2616,\"1f983\":2568,\"1f984\":2525,\"1f985\":2577,\"1f986\":2578,\"1f987\":2557,\"1f988\":2602,\"1f989\":2580,\"1f98a\":2514,\"1f98b\":2606,\"1f98c\":2527,\"1f98d\":2506,\"1f98e\":2589,\"1f98f\":2546,\"1f990\":3731,\"1f991\":3732,\"1f992\":2543,\"1f993\":2526,\"1f994\":2556,\"1f995\":2593,\"1f996\":2594,\"1f997\":2612,\"1f998\":2565,\"1f999\":2542,\"1f99a\":2584,\"1f99b\":2547,\"1f99c\":2585,\"1f99d\":2515,\"1f99e\":3730,\"1f99f\":2617,\"1f9a0\":2620,\"1f9a1\":2566,\"1f9a2\":2579,\"1f9a3\":2545,\"1f9a4\":2581,\"1f9a5\":2562,\"1f9a6\":2563,\"1f9a7\":2507,\"1f9a8\":2564,\"1f9a9\":2583,\"1f9aa\":3733,\"1f9ab\":2555,\"1f9ac\":2528,\"1f9ad\":2598,\"1f9ae\":2510,\"1f9af\":61273,\"1f9b4\":1349,\"1f9b5\":1340,\"1f9b6\":1341,\"1f9b7\":1348,\"1f9b8-200d-2640\":1495,\"1f9b8-200d-2642\":1494,\"1f9b8\":1493,\"1f9b9-200d-2640\":1498,\"1f9b9-200d-2642\":1497,\"1f9b9\":1496,\"1f9ba\":61076,\"1f9bb\":1343,\"1f9bc\":4871,\"1f9bd\":4870,\"1f9be\":1338,\"1f9bf\":1339,\"1f9c0\":3686,\"1f9c1\":3741,\"1f9c2\":3710,\"1f9c3\":3764,\"1f9c4\":3673,\"1f9c5\":3674,\"1f9c6\":3700,\"1f9c7\":3685,\"1f9c8\":3709,\"1f9c9\":3765,\"1f9ca\":3766,\"1f9cb\":3763,\"1f9cd-200d-2640\":1531,\"1f9cd-200d-2642\":1530,\"1f9cd\":1529,\"1f9ce-200d-2640\":1534,\"1f9ce-200d-2642\":1533,\"1f9ce\":1532,\"1f9cf-200d-2640\":1400,\"1f9cf-200d-2642\":1399,\"1f9cf\":1398,\"1f9d0\":164,\"1f9d1-200d-1f33e\":1422,\"1f9d1-200d-1f373\":1425,\"1f9d1-200d-1f37c\":1488,\"1f9d1-200d-1f384\":1492,\"1f9d1-200d-1f393\":1413,\"1f9d1-200d-1f3a4\":1443,\"1f9d1-200d-1f3a8\":1446,\"1f9d1-200d-1f3eb\":1416,\"1f9d1-200d-1f3ed\":1431,\"1f9d1-200d-1f4bb\":1440,\"1f9d1-200d-1f4bc\":1434,\"1f9d1-200d-1f527\":1428,\"1f9d1-200d-1f52c\":1437,\"1f9d1-200d-1f680\":1452,\"1f9d1-200d-1f692\":1455,\"1f9d1-200d-1f91d-200d-1f9d1\":1607,\"1f9d1-200d-1f9af\":1535,\"1f9d1-200d-1f9b0\":1368,\"1f9d1-200d-1f9b1\":1370,\"1f9d1-200d-1f9b2\":1374,\"1f9d1-200d-1f9b3\":1372,\"1f9d1-200d-1f9bc\":1538,\"1f9d1-200d-1f9bd\":1541,\"1f9d1-200d-2695\":1410,\"1f9d1-200d-2696\":1419,\"1f9d1-200d-2708\":1449,\"1f9d1\":1358,\"1f9d2\":1355,\"1f9d3\":1377,\"1f9d4\":1361,\"1f9d5\":1477,\"1f9d6-200d-2640\":1555,\"1f9d6-200d-2642\":1554,\"1f9d6\":1553,\"1f9d7-200d-2640\":1558,\"1f9d7-200d-2642\":1557,\"1f9d7\":1556,\"1f9d8-200d-2640\":1604,\"1f9d8-200d-2642\":1603,\"1f9d8\":1602,\"1f9d9-200d-2640\":1501,\"1f9d9-200d-2642\":1500,\"1f9d9\":1499,\"1f9da-200d-2640\":1504,\"1f9da-200d-2642\":1503,\"1f9da\":1502,\"1f9db-200d-2640\":1507,\"1f9db-200d-2642\":1506,\"1f9db\":1505,\"1f9dc-200d-2640\":1510,\"1f9dc-200d-2642\":1509,\"1f9dc\":1508,\"1f9dd-200d-2640\":1513,\"1f9dd-200d-2642\":1512,\"1f9dd\":1511,\"1f9de-200d-2640\":1516,\"1f9de-200d-2642\":1515,\"1f9de\":1514,\"1f9df-200d-2640\":1519,\"1f9df-200d-2642\":1518,\"1f9df\":1517,\"1f9e0\":1345,\"1f9e1\":1130,\"1f9e2\":61110,\"1f9e3\":61080,\"1f9e4\":61081,\"1f9e5\":61082,\"1f9e6\":61083,\"1f9e7\":51003,\"1f9e8\":5992,\"1f9e9\":51053,\"1f9ea\":61281,\"1f9eb\":61282,\"1f9ec\":61283,\"1f9ed\":4779,\"1f9ee\":61162,\"1f9ef\":61314,\"1f9f0\":61277,\"1f9f1\":4792,\"1f9f2\":61278,\"1f9f3\":4909,\"1f9f4\":61305,\"1f9f5\":51068,\"1f9f6\":51070,\"1f9f7\":61306,\"1f9f8\":51054,\"1f9f9\":61307,\"1f9fa\":61308,\"1f9fb\":61309,\"1f9fc\":61311,\"1f9fd\":61313,\"1f9fe\":61204,\"1f9ff\":51048,\"1fa70\":61104,\"1fa71\":61087,\"1fa72\":61088,\"1fa73\":61089,\"1fa74\":61097,\"1fa78\":61288,\"1fa79\":61290,\"1fa7a\":61291,\"1fa80\":51043,\"1fa81\":51044,\"1fa82\":4899,\"1fa83\":61263,\"1fa84\":51047,\"1fa85\":51055,\"1fa86\":51056,\"1fa90\":4957,\"1fa91\":61298,\"1fa92\":61304,\"1fa93\":61256,\"1fa94\":61178,\"1fa95\":61141,\"1fa96\":61111,\"1fa97\":61136,\"1fa98\":61143,\"1fa99\":61197,\"1fa9a\":61266,\"1fa9b\":61268,\"1fa9c\":61279,\"1fa9d\":61276,\"1fa9e\":61294,\"1fa9f\":61295,\"1faa0\":61300,\"1faa1\":51069,\"1faa2\":51071,\"1faa3\":61310,\"1faa4\":61303,\"1faa5\":61312,\"1faa6\":61318,\"1faa7\":61321,\"1faa8\":4793,\"1fab0\":2618,\"1fab1\":2619,\"1fab2\":2610,\"1fab3\":2613,\"1fab4\":2632,\"1fab5\":4794,\"1fab6\":2582,\"1fac0\":1346,\"1fac1\":1347,\"1fac2\":1648,\"1fad0\":3658,\"1fad1\":3669,\"1fad2\":3661,\"1fad3\":3681,\"1fad4\":3698,\"1fad5\":3705,\"1fad6\":3751,\"203c\":62747,\"21a9\":62679,\"21aa\":62680,\"231a\":4912,\"231b\":4910,\"23cf\":62732,\"23e9\":62719,\"23ea\":62723,\"23eb\":62726,\"23ec\":62728,\"23ed\":62720,\"23ee\":62724,\"23ef\":62721,\"23f0\":4913,\"23f1\":4914,\"23f2\":4915,\"23f3\":4911,\"23f8\":62729,\"23f9\":62730,\"23fa\":62731,\"24c2\":62803,\"25aa\":62851,\"25ab\":62852,\"25b6\":62718,\"25c0\":62722,\"25fb\":62848,\"25fc\":62847,\"25fd\":62850,\"25fe\":62849,\"260e\":61146,\"261d\":1321,\"262a\":62698,\"262e\":62699,\"262f\":62695,\"263a\":119,\"264a\":62704,\"264b\":62705,\"264c\":62706,\"264d\":62707,\"264e\":62708,\"264f\":62709,\"265f\":51061,\"267b\":62757,\"267e\":62746,\"267f\":62646,\"269b\":62691,\"269c\":62758,\"26a0\":62656,\"26a1\":4980,\"26a7\":62741,\"26aa\":62837,\"26ab\":62836,\"26b0\":61317,\"26b1\":61319,\"26bd\":51015,\"26be\":51016,\"26c4\":4983,\"26c5\":4963,\"26c8\":4964,\"26ce\":62714,\"26cf\":61257,\"26d1\":61112,\"26d3\":61275,\"26d4\":62658,\"26e9\":4820,\"26ea\":4816,\"26f0\":4781,\"26f1\":4979,\"26f2\":4822,\"26f3\":51034,\"26f4\":4892,\"26f5\":4888,\"26f7\":1561,\"26f8\":51035,\"26f9-200d-2640\":1577,\"26f9-200d-2642\":1576,\"26f9\":1575,\"26fa\":4823,\"26fd\":4881,\"270a\":1324,\"270b\":1306,\"270c\":1311,\"270d\":1334,\"270f\":61219,\"271d\":62696,\"274c\":62766,\"274e\":62767,\"27a1\":62671,\"27b0\":62768,\"27bf\":62769,\"2b05\":62675,\"2b06\":62669,\"2b07\":62673,\"2b1b\":62845,\"2b1c\":62846,\"2b50\":4958,\"2b55\":62762,\"303d\":62770,\"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\":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\":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,\"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,\"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\":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};\r\n\r\n/* Emoji[\"00a9-fe0f\"] = 6362;\r\nEmoji[\"00ae-fe0f\"] = 6363;\r\nEmoji[\"2122-fe0f\"] = 6364; */\r\n\r\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\r\nexport const 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'];\r\n\r\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\r\nexport const 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'};\r\n\r\nconst Config = {\r\n Emoji,\r\n LatinizeMap,\r\n TLD,\r\n MediaSizes: mediaSizes\r\n};\r\nMOUNT_CLASS_TO.Config = Config;\r\nexport default Config;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport { logger } from \"../logger\";\nimport rootScope from \"../rootScope\";\nimport sessionStorage from \"../sessionStorage\";\nimport apiManager from \"./mtprotoworker\";\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nconst CHECK_INSTANCE_INTERVAL = 5000; \nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\n\nexport class SingleInstance {\n private instanceID: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: boolean;\n private initial: boolean;\n private log = logger('INSTANCE');\n\n public start() {\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n this.reset();\n //IdleManager.start();\n\n rootScope.addEventListener('idle', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n public reset() {\n this.instanceID = nextRandomUint(32);\n this.masterInstance = false;\n if(this.deactivateTimeout) clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n this.deactivated = false;\n this.initial = false;\n }\n\n public clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n rootScope.dispatchEvent('instance_activated');\n }\n }\n\n public deactivateInstance = () => {\n if(this.masterInstance || this.deactivated) {\n return false;\n }\n\n this.log('deactivate');\n this.deactivateTimeout = 0;\n this.deactivated = true;\n this.clearInstance();\n //$modalStack.dismissAll();\n\n //document.title = _('inactive_tab_title_raw')\n\n rootScope.idle.deactivated = true;\n rootScope.dispatchEvent('instance_deactivated');\n };\n\n public checkInstance = (idle = rootScope.idle && rootScope.idle.isIDLE) => {\n if(this.deactivated) {\n return false;\n }\n \n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceID, \n idle, \n time\n };\n\n sessionStorage.get('xt_instance', false).then((curInstance: AppInstance) => {\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceID ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n apiManager.startAll();\n if(!this.initial) {\n this.initial = true;\n } else {\n this.log.warn('now master instance', newInstance);\n }\n\n this.masterInstance = true;\n }\n\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n } else {\n if(this.masterInstance) {\n apiManager.stopAll();\n this.log.warn('now idle instance', newInstance);\n if(!this.deactivateTimeout) {\n this.deactivateTimeout = window.setTimeout(this.deactivateInstance, DEACTIVATE_TIMEOUT);\n }\n\n this.masterInstance = false;\n }\n }\n });\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"webp.worker.b00d941ab33d112bf66c.bundle.worker.js\");\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport WebpWorker from 'worker-loader!./webp.worker';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\n\r\nexport type WebpConvertTask = {\r\n type: 'convertWebp', \r\n payload: {\r\n fileName: string, \r\n bytes: Uint8Array\r\n }\r\n};\r\n\r\nexport class WebpWorkerController {\r\n private worker: Worker;\r\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\r\n \r\n private init() {\r\n this.worker = new WebpWorker();\r\n this.worker.addEventListener('message', (e) => {\r\n const payload = (e.data as WebpConvertTask).payload;\r\n\r\n if(payload.fileName.indexOf('main-') === 0) {\r\n const promise = this.convertPromises[payload.fileName];\r\n if(promise) {\r\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\r\n delete this.convertPromises[payload.fileName];\r\n }\r\n } else {\r\n apiManagerProxy.postMessage(e.data);\r\n }\r\n });\r\n }\r\n\r\n public postMessage(data: WebpConvertTask) {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.worker.postMessage(data);\r\n }\r\n\r\n public convert(fileName: string, bytes: Uint8Array) {\r\n fileName = 'main-' + fileName;\r\n\r\n if(this.convertPromises.hasOwnProperty(fileName)) {\r\n return this.convertPromises[fileName];\r\n }\r\n \r\n const convertPromise = deferredPromise();\r\n\r\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\r\n\r\n return this.convertPromises[fileName] = convertPromise;\r\n }\r\n}\r\n\r\nconst webpWorkerController = new WebpWorkerController();\r\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\r\nexport default webpWorkerController;","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG, { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { safeAssign } from \"../helpers/object\";\nimport { capitalizeFirstLetter } from \"../helpers/string\";\nimport type lang from \"../lang\";\nimport type langSign from \"../langSign\";\nimport type { State } from \"./appManagers/appStateManager\";\nimport { HelpCountriesList, HelpCountry, LangPackDifference, LangPackString } from \"../layer\";\nimport apiManager from \"./mtproto/mtprotoworker\";\nimport stateStorage from \"./stateStorage\";\nimport App from \"../config/app\";\nimport rootScope from \"./rootScope\";\nimport RichTextProcessor from \"./richtextprocessor\";\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n \"messageActionChatCreate\": \"ActionCreateGroup\",\n \"messageActionChatCreateYou\": \"ActionYouCreateGroup\",\n\t\"messageActionChatEditTitle\": \"ActionChangedTitle\",\n\t\"messageActionChatEditPhoto\": \"ActionChangedPhoto\",\n\t\"messageActionChatEditVideo\": \"ActionChangedVideo\",\n\t\"messageActionChatDeletePhoto\": \"ActionRemovedPhoto\",\n\t\"messageActionChatReturn\": \"ActionAddUserSelf\",\n\t\"messageActionChatReturnYou\": \"ActionAddUserSelfYou\",\n\t\"messageActionChatJoined\": \"ActionAddUserSelfMega\",\n\t\"messageActionChatJoinedYou\": \"ChannelMegaJoined\",\n \"messageActionChatAddUser\": \"ActionAddUser\",\n \"messageActionChatAddUsers\": \"ActionAddUser\",\n\t\"messageActionChatLeave\": \"ActionLeftUser\",\n\t\"messageActionChatLeaveYou\": \"YouLeft\",\n\t\"messageActionChatDeleteUser\": \"ActionKickUser\",\n\t\"messageActionChatJoinedByLink\": \"ActionInviteUser\",\n \"messageActionPinMessage\": \"Chat.Service.Group.UpdatedPinnedMessage\",\n \"messageActionContactSignUp\": \"Chat.Service.PeerJoinedTelegram\",\n\t\"messageActionChannelCreate\": \"ActionCreateChannel\",\n\t\"messageActionChannelEditTitle\": \"Chat.Service.Channel.UpdatedTitle\",\n\t\"messageActionChannelEditPhoto\": \"Chat.Service.Channel.UpdatedPhoto\",\n\t\"messageActionChannelEditVideo\": \"Chat.Service.Channel.UpdatedVideo\",\n \"messageActionChannelDeletePhoto\": \"Chat.Service.Channel.RemovedPhoto\",\n \"messageActionHistoryClear\": \"HistoryCleared\",\n\t\"messageActionDiscussionStarted\": \"DiscussionStarted\",\n\n \"messageActionChannelMigrateFrom\": \"ActionMigrateFromGroup\",\n\n \"messageActionPhoneCall.in_ok\": \"ChatList.Service.Call.incoming\",\n\t\"messageActionPhoneCall.out_ok\": \"ChatList.Service.Call.outgoing\",\n\t\"messageActionPhoneCall.in_missed\": \"ChatList.Service.Call.Missed\",\n\t\"messageActionPhoneCall.out_missed\": \"ChatList.Service.Call.Cancelled\",\n\n\t\"messageActionGroupCall.started\": \"Chat.Service.VoiceChatStarted.Channel\",\n\t\"messageActionGroupCall.started_by\": \"Chat.Service.VoiceChatStarted\",\n\t\"messageActionGroupCall.started_byYou\": \"Chat.Service.VoiceChatStartedYou\",\n\t\"messageActionGroupCall.ended\": \"Chat.Service.VoiceChatFinished.Channel\",\n\t\"messageActionGroupCall.ended_by\": \"Chat.Service.VoiceChatFinished\",\n\t\"messageActionGroupCall.ended_byYou\": \"Chat.Service.VoiceChatFinishedYou\",\n\n\t\"messageActionBotAllowed\": \"Chat.Service.BotPermissionAllowed\"\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nnamespace I18n {\n\texport const strings: Map = new Map();\n\texport const countriesList: HelpCountry[] = [];\n\tlet pluralRules: Intl.PluralRules;\n\n\tlet cacheLangPackPromise: Promise;\n\texport let lastRequestedLangCode: string;\n\texport let lastAppliedLangCode: string;\n\texport let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\texport function getCacheLangPack(): Promise {\n\t\tif(cacheLangPackPromise) return cacheLangPackPromise;\n\t\treturn cacheLangPackPromise = Promise.all([\n\t\t\tstateStorage.get('langPack') as Promise,\n\t\t\tpolyfillPromise\n\t\t]).then(([langPack]) => {\n\t\t\tif(!langPack/* || true */) {\n\t\t\t\treturn loadLocalLangPack();\n\t\t\t} else if(DEBUG && false) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t}/* else if(langPack.appVersion !== App.langPackVersion) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t} */\n\t\t\t\n\t\t\tif(!lastRequestedLangCode) {\n\t\t\t\tlastRequestedLangCode = langPack.lang_code;\n\t\t\t}\n\t\t\t\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t}).finally(() => {\n\t\t\tcacheLangPackPromise = undefined;\n\t\t});\n\t}\n\n export function setTimeFormat(format: State['settings']['timeFormat']) {\n const haveToUpdate = !!timeFormat && timeFormat !== format;\n timeFormat = format;\n\n if(haveToUpdate) {\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach(element => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n\texport function loadLocalLangPack() {\n\t\tconst defaultCode = App.langPackCode;\n\t\tlastRequestedLangCode = defaultCode;\n\t\treturn Promise.all([\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\timport('../countries')\n\t\t]).then(([lang, langSign, countries]) => {\n\t\t\tconst strings: LangPackString[] = [];\n\t\t\tformatLocalStrings(lang.default, strings);\n\t\t\tformatLocalStrings(langSign.default, strings);\n\n\t\t\tconst langPack: LangPackDifference = {\n\t\t\t\t_: 'langPackDifference',\n\t\t\t\tfrom_version: 0,\n\t\t\t\tlang_code: defaultCode,\n\t\t\t\tstrings,\n\t\t\t\tversion: 0,\n\t\t\t\tlocal: true,\n\t\t\t\tcountries: countries.default\n\t\t\t};\n\t\t\treturn saveLangPack(langPack);\n\t\t});\n\t}\n\n\texport function loadLangPack(langCode: string) {\n\t\trequestedServerLanguage = true;\n\t\treturn Promise.all([\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: App.langPack\n\t\t\t}),\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: 'android'\n\t\t\t}),\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\tapiManager.invokeApiCacheable('help.getCountriesList', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\thash: 0\n\t\t\t}) as Promise,\n\t\t\tpolyfillPromise,\n\t\t]);\n\t}\n\n\texport function getStrings(langCode: string, strings: string[]) {\n\t\treturn apiManager.invokeApi('langpack.getStrings', {\n\t\t\tlang_pack: App.langPack,\n\t\t\tlang_code: langCode,\n\t\t\tkeys: strings\n\t\t});\n\t}\n\n\texport function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n\t\tfor(const i in strings) {\n\t\t\t// @ts-ignore\n\t\t\tconst v = strings[i];\n\t\t\tif(typeof(v) === 'string') {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\tkey: i,\n\t\t\t\t\tvalue: v\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackStringPluralized',\n\t\t\t\t\tkey: i,\n\t\t\t\t\t...v\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn pushTo;\n\t}\n\n\texport function getLangPack(langCode: string) {\n\t\tlastRequestedLangCode = langCode;\n\t\treturn loadLangPack(langCode).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n\t\t\tlet strings: LangPackString[] = [];\n\n\t\t\t[localLangPack1, localLangPack2].forEach(l => {\n\t\t\t\tformatLocalStrings(l.default as any, strings);\n\t\t\t});\n\n\t\t\tstrings = strings.concat(langPack1.strings);\n\n\t\t\tfor(const string of langPack2.strings) {\n\t\t\t\tstrings.push(string);\n\t\t\t}\n\n\t\t\tlangPack1.strings = strings;\n\t\t\tlangPack1.countries = countries;\n\t\t\treturn saveLangPack(langPack1);\n\t\t});\n\t}\n\n\texport function saveLangPack(langPack: LangPackDifference) {\n\t\tlangPack.appVersion = App.langPackVersion;\n\n\t\treturn stateStorage.set({langPack}).then(() => {\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t});\n\t}\n\n\texport const polyfillPromise = (function checkIfPolyfillNeeded() {\n\t\tif(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n\t\t\treturn Promise.resolve();\n\t\t} else {\n\t\t\treturn import('./pluralPolyfill').then((_Intl) => {\n\t\t\t\t(window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n\t\t\t});\n\t\t}\n\t})();\n\t\n\texport function applyLangPack(langPack: LangPackDifference) {\n\t\tif(langPack.lang_code !== lastRequestedLangCode) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code);\n\t\t} catch(err) {\n\t\t\tconsole.error('pluralRules error', err);\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n\t\t}\n\n\t\tstrings.clear();\n\n\t\tfor(const string of langPack.strings) {\n\t\t\tstrings.set(string.key as LangPackKey, string);\n\t\t}\n\n\t\tif(langPack.countries) {\n\t\t\tcountriesList.length = 0;\n\t\t\tcountriesList.push(...langPack.countries.countries);\n\n\t\t\tlangPack.countries.countries.forEach(country => {\n\t\t\t\tif(country.name) {\n\t\t\t\t\tconst langPackKey: any = country.default_name;\n\t\t\t\t\tstrings.set(langPackKey, {\n\t\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\t\tkey: langPackKey,\n\t\t\t\t\t\tvalue: country.name\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif(lastAppliedLangCode !== langPack.lang_code) {\n\t\t\trootScope.dispatchEvent('language_change', langPack.lang_code);\n\t\t\tlastAppliedLangCode = langPack.lang_code;\n\t\t}\n\n\t\tconst elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n\t\telements.forEach(element => {\n\t\t\tconst instance = weakMap.get(element);\n\n\t\t\tif(instance) {\n\t\t\t\tinstance.update();\n\t\t\t}\n\t\t});\n\t}\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n\t\tif(Array.isArray(arg)) {\n\t\t\tout.push(...arg as any);\n\t\t} else {\n\t\t\tout.push(arg);\n\t\t}\n }\n\n\texport function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n\t\tlet out: ReturnType = [];\n\t\tconst regExp = /(\\*\\*)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n\t\tlet lastIndex = 0;\n\t\tinput.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n\t\t\t//console.table({match, p1, p2, offset, string});\n\n\t\t\tout.push(string.slice(lastIndex, offset));\n\n\t\t\tif(p1) {\n\t\t\t\t//offset += p1.length;\n\t\t\t\tswitch(p1) {\n\t\t\t\t\tcase '**': {\n\t\t\t\t\t\tconst b = document.createElement('b');\n\t\t\t\t\t\tb.append(...superFormatter(p2, args, indexHolder) as any);\n\t\t\t\t\t\tout.push(b);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if(p3) {\n\t\t\t\tout.push(document.createElement('br'));\n\t\t\t} else if(p4) {\n const idx = p4.lastIndexOf(']');\n\t\t\t\tconst text = p4.slice(1, idx);\n \n\t\t\t\tconst url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n\t\t\t\tif(url && RichTextProcessor.matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = RichTextProcessor.wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n\t\t\t\t} else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n\t\t\t\tout.push(a);\n\t\t\t} else if(args) {\n pushNextArgument(out, args, indexHolder);\n\t\t\t}\n\n\t\t\tlastIndex = offset + match.length;\n\t\t\treturn '';\n\t\t});\n\t\n\t\tif(lastIndex !== input.length) {\n\t\t\tout.push(input.slice(lastIndex));\n\t\t}\n\n\t\treturn out;\n\t}\n\t\n\texport function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n\texport function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n\texport function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n\t\tconst str = strings.get(key);\n\t\tlet input: string;\n\t\tif(str) {\n\t\t\tif(str._ === 'langPackStringPluralized' && args?.length) {\n\t\t\t\tlet v = args[0] as number | string;\n\t\t\t\tif(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n\t\t\t\tconst s = pluralRules.select(v);\n\t\t\t\t// @ts-ignore\n\t\t\t\tinput = str[s + '_value'] || str['other_value'];\n\t\t\t} else if(str._ === 'langPackString') {\n\t\t\t\tinput = str.value;\n\t\t\t} else {\n\t\t\t\t//input = '[' + key + ']';\n\t\t\t\tinput = key;\n\t\t\t}\n\t\t} else {\n\t\t\t//input = '[' + key + ']';\n\t\t\tinput = key;\n\t\t}\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map(item => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\t\t\n\t\t/* if(plain) {\n\t\t\tif(args?.length) {\n\t\t\t\tconst regExp = /un\\d|%\\d\\$.|%./g;\n\t\t\t\tlet i = 0;\n\t\t\t\tinput = input.replace(regExp, (match, offset, string) => {\n\t\t\t\t\treturn '' + args[i++];\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn input;\n\t\t} else {\n\t\t\treturn superFormatter(input, args);\n\t\t} */\n\t}\n\n\texport const weakMap: WeakMap> = new WeakMap();\n\n\texport type IntlElementBaseOptions = {\n\t\telement?: HTMLElement,\n\t\tproperty?: /* 'innerText' | */'innerHTML' | 'placeholder',\n\t};\n\n\tabstract class IntlElementBase {\n\t\tpublic element: IntlElementBaseOptions['element'];\n\t\tpublic property: IntlElementBaseOptions['property'] = 'innerHTML';\n\t\n\t\tconstructor(options: Options) {\n\t\t\tthis.element = options.element || document.createElement('span');\n\t\t\tthis.element.classList.add('i18n');\n\t\t\t\n\t\t\tthis.update(options);\n\t\t\tweakMap.set(this.element, this);\n\t\t}\n\n\t\tabstract update(options?: Options): void;\n\t}\n\n\texport type IntlElementOptions = IntlElementBaseOptions & {\n\t\tkey: LangPackKey,\n\t\targs?: FormatterArguments\n\t};\n\texport class IntlElement extends IntlElementBase {\n\t\tpublic key: IntlElementOptions['key'];\n\t\tpublic args: IntlElementOptions['args'];\n\n\t\tpublic update(options?: IntlElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\tif(this.property === 'innerHTML') {\n\t\t\t\tthis.element.textContent = '';\n\t\t\t\tthis.element.append(...format(this.key, false, this.args) as any);\n\t\t\t} else {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst v = this.element[this.property];\n\t\t\t\tconst formatted = format(this.key, true, this.args);\n\n\t\t\t\t// * hasOwnProperty won't work here\n\t\t\t\tif(v === undefined) this.element.dataset[this.property] = formatted;\n\t\t\t\telse (this.element as HTMLInputElement)[this.property] = formatted;\n\t\t\t}\n\t\t}\n\t}\n\n\texport type IntlDateElementOptions = IntlElementBaseOptions & {\n\t\tdate: Date,\n\t\toptions: Intl.DateTimeFormatOptions\n\t};\n\texport class IntlDateElement extends IntlElementBase {\n\t\tpublic date: IntlDateElementOptions['date'];\n\t\tpublic options: IntlDateElementOptions['options'];\n\n\t\tpublic update(options?: IntlDateElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\t//var options = { month: 'long', day: 'numeric' };\n\t\t\t\n\t\t\t// * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n\t\t\tconst dateTimeFormat = new Intl.DateTimeFormat(lastRequestedLangCode + '-u-hc-' + timeFormat, this.options);\n\t\t\t\n\t\t\t(this.element as any)[this.property] = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n\t\t}\n\t}\n\n\texport function i18n(key: LangPackKey, args?: FormatterArguments) {\n\t\treturn new IntlElement({key, args}).element;\n\t}\n\t\n\texport function i18n_(options: IntlElementOptions) {\n\t\treturn new IntlElement(options).element;\n\t}\n\n\texport function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n\t\treturn new IntlElement({element, key, args, property}).element;\n\t}\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n\tconst arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n\treturn arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n\tconst joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'WordDelimiterLast' : 'WordDelimiter';\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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nexport class TelegramMeWebManager {\r\n private disabled = /* false && */(Modes.test || App.domains.indexOf(location.hostname) === -1);\r\n\r\n public setAuthorized(canRedirect: boolean) {\r\n if(this.disabled) {\r\n return;\r\n }\r\n\r\n return sessionStorage.get('tgme_sync').then((curValue) => {\r\n const ts = tsNow(true);\r\n if(canRedirect &&\r\n curValue &&\r\n curValue.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts) {\r\n return;\r\n }\r\n\r\n sessionStorage.set({\r\n tgme_sync: {\r\n canRedirect, \r\n ts\r\n }\r\n });\r\n\r\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\r\n const urls = [\r\n '//telegram.me/' + path,\r\n '//t.me/' + path\r\n ];\r\n\r\n const promises = urls.map(url => {\r\n const script = document.createElement('script');\r\n const promise = new Promise((resolve) => {\r\n script.onload = script.onerror = () => {\r\n script.remove();\r\n resolve();\r\n };\r\n });\r\n script.src = url;\r\n document.body.appendChild(script);\r\n return promise;\r\n });\r\n\r\n return Promise.all(promises);\r\n });\r\n }\r\n}\r\n\r\nconst telegramMeWebManager = new TelegramMeWebManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\r\nexport default telegramMeWebManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { NotificationSettings } from \"../appManagers/appNotificationsManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { copy } from \"../../helpers/object\";\r\nimport { logger } from \"../logger\";\r\nimport rootScope from \"../rootScope\";\r\nimport { ServiceWorkerNotificationsClearTask, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"../serviceWorker/index.service\";\r\nimport apiManager from \"./mtprotoworker\";\r\nimport I18n, { LangPackKey } from \"../langPack\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appRuntimeManager from \"../appManagers/appRuntimeManager\";\r\n\r\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\r\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\r\n\r\nexport type PushSubscriptionNotify = {\r\n tokenType: number,\r\n tokenValue: string\r\n};\r\n\r\nexport class WebPushApiManager {\r\n public isAvailable = true;\r\n private isPushEnabled = false;\r\n private localNotificationsAvailable = true;\r\n private started = false;\r\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\r\n private isAliveTO: any;\r\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n private userVisibleOnly = this.isFirefox ? false : true;\r\n private log = logger('PM');\r\n\r\n constructor() {\r\n if(!('PushManager' in window) ||\r\n !('Notification' in window) ||\r\n !('serviceWorker' in navigator)) {\r\n this.log.warn('Push messaging is not supported.');\r\n this.isAvailable = false;\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n if(this.isAvailable && Notification.permission === 'denied') {\r\n this.log.warn('The user has blocked notifications.');\r\n }\r\n }\r\n\r\n public start() {\r\n if(!this.started) {\r\n this.started = true;\r\n this.getSubscription();\r\n this.setUpServiceWorkerChannel();\r\n }\r\n }\r\n\r\n public setLocalNotificationsDisabled() {\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n public getSubscription() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = !!subscription;\r\n this.pushSubscriptionNotify('init', subscription);\r\n }).catch((err) => {\r\n this.log.error('Error during getSubscription()', err);\r\n });\r\n });\r\n }\r\n\r\n public subscribe = () => {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\r\n // The subscription was successful\r\n this.isPushEnabled = true;\r\n this.pushSubscriptionNotify('subscribe', subscription);\r\n }).catch((e) => {\r\n if(Notification.permission === 'denied') {\r\n this.log('Permission for Notifications was denied');\r\n } else {\r\n this.log('Unable to subscribe to push.', e);\r\n if(!this.userVisibleOnly) {\r\n this.userVisibleOnly = true;\r\n setTimeout(this.subscribe, 0);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public unsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n \r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = false;\r\n\r\n if(subscription) {\r\n this.pushSubscriptionNotify('unsubscribe', subscription);\r\n\r\n setTimeout(() => {\r\n subscription.unsubscribe().then((successful) => {\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }, 3000);\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public forceUnsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.log.warn('force unsubscribe', subscription);\r\n if(subscription) {\r\n subscription.unsubscribe().then((successful) => {\r\n this.log.warn('force unsubscribe successful', successful);\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public isAliveNotify = () => {\r\n if(!this.isAvailable || rootScope.idle && rootScope.idle.deactivated) {\r\n return;\r\n }\r\n\r\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '') + '#/im';\r\n\r\n const lang: ServiceWorkerPingTask['payload']['lang'] = {} as any;\r\n const ACTIONS_LANG_MAP: Record = {\r\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\r\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\r\n push_message_nopreview: 'PushNotification.Message.NoPreview'\r\n };\r\n\r\n for(const action in ACTIONS_LANG_MAP) {\r\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\r\n }\r\n\r\n const task: ServiceWorkerPingTask = {\r\n type: 'ping',\r\n payload: {\r\n localNotifications: this.localNotificationsAvailable,\r\n lang: lang,\r\n settings: this.settings\r\n }\r\n };\r\n\r\n apiManager.postSWMessage(task);\r\n\r\n this.isAliveTO = setTimeout(this.isAliveNotify, 10000);\r\n }\r\n\r\n public setSettings(newSettings: WebPushApiManager['settings']) {\r\n this.settings = copy(newSettings);\r\n clearTimeout(this.isAliveTO);\r\n this.isAliveNotify();\r\n }\r\n\r\n public hidePushNotifications() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n const task: ServiceWorkerNotificationsClearTask = {type: 'notifications_clear'};\r\n apiManager.postSWMessage(task);\r\n }\r\n\r\n public setUpServiceWorkerChannel() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManager.addServiceWorkerTaskListener('push_click', (task: ServiceWorkerPushClickTask) => {\r\n if(rootScope.idle && rootScope.idle.deactivated) {\r\n appRuntimeManager.reload();\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('push_notification_click', task.payload);\r\n });\r\n\r\n navigator.serviceWorker.ready.then(this.isAliveNotify);\r\n }\r\n\r\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\r\n if(subscription) {\r\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\r\n if(!subscriptionObj ||\r\n !subscriptionObj.endpoint ||\r\n !subscriptionObj.keys ||\r\n !subscriptionObj.keys.p256dh ||\r\n !subscriptionObj.keys.auth) {\r\n this.log.warn('Invalid push subscription', subscriptionObj);\r\n this.unsubscribe();\r\n this.isAvailable = false;\r\n this.pushSubscriptionNotify(event);\r\n return;\r\n }\r\n \r\n this.log.warn('Push', event, subscriptionObj);\r\n rootScope.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\r\n tokenType: 10,\r\n tokenValue: JSON.stringify(subscriptionObj)\r\n });\r\n } else {\r\n this.log.warn('Push', event, false);\r\n rootScope.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\r\n }\r\n }\r\n}\r\n\r\nconst webPushApiManager = new WebPushApiManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\r\nexport default webPushApiManager;\r\n","// 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\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\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\\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\\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\\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\\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\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d])|(?:\\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\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\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\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\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\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\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\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\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|\\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?|\\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]|[\\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-\\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\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd1d\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78\\udd7a-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcb\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7a\\ude80-\\ude86\\ude90-\\udea8\\udeb0-\\udeb6\\udec0-\\udec2\\uded0-\\uded6]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)\";\r\nexport default originalString;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Config from './config';\n\nimport emojiRegExp from '../vendor/emoji/regex';\nimport { encodeEmoji, toCodePoints } from '../vendor/emoji';\nimport { MessageEntity } from '../layer';\nimport { encodeEntities } from '../helpers/string';\nimport { IS_SAFARI } from '../environment/userAgent';\nimport { MOUNT_CLASS_TO } from '../config/debug';\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nconst emojiData = Config.Emoji;\n\nconst alphaCharsRegExp = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nconst alphaNumericRegExp = '0-9\\_' + alphaCharsRegExp;\nconst domainAddChars = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nconst urlAlphanumericRegExpPart = '[' + alphaCharsRegExp + '0-9]';\nconst urlProtocolRegExpPart = '((?:https?|ftp)://|mailto:)?';\nconst urlRegExp = urlProtocolRegExpPart +\n // user:pass authentication\n '(?:' + urlAlphanumericRegExpPart + '{1,64}(?::' + urlAlphanumericRegExpPart + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + alphaCharsRegExp + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nconst urlProtocolRegExp = new RegExp('^' + urlProtocolRegExpPart.slice(0, -1), 'i');\nconst urlAnyProtocolRegExp = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nconst usernameRegExp = '[a-zA-Z\\\\d_]{5,32}';\nconst botCommandRegExp = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + usernameRegExp + '))?(\\\\b|$)';\nconst fullRegExp = new RegExp('(^| )(@)(' + usernameRegExp + ')|(' + urlRegExp + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + alphaNumericRegExp + ']{2,64})|(^|\\\\s)' + botCommandRegExp, 'i');\nconst emailRegExp = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n//const markdownTestRegExp = /[`_*@~]/;\nconst markdownRegExp = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nconst siteHashtags: {[siteName: string]: string} = {\n Telegram: 'tg://search_hashtag?hashtag={1}',\n Twitter: 'https://twitter.com/hashtag/{1}',\n Instagram: 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\nconst siteMentions: {[siteName: string]: string} = {\n Telegram: '#/im?p=%40{1}',\n Twitter: 'https://twitter.com/{1}',\n Instagram: 'https://instagram.com/{1}/',\n GitHub: 'https://github.com/{1}'\n};\nconst markdownEntities: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline'\n};\n\nconst passConflictingEntities: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(let i in markdownEntities) {\n passConflictingEntities.add(markdownEntities[i]);\n}\n\nnamespace RichTextProcessor {\n export function getEmojiSpritesheetCoords(emojiCode: string) {\n let unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n \n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n \n if(!emojiData.hasOwnProperty(unified) \n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n //console.error('lol', unified);\n return null;\n }\n \n return unified;\n }\n\n export function parseEntities(text: string) {\n let match: any;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n fullRegExp.lastIndex = 0;\n while((match = raw.match(fullRegExp))) {\n matchIndex = rawOffset + match.index;\n \n //console.log('parseEntities match:', match);\n \n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(emailRegExp.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || Config.TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n \n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n \n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n \n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n //console.log('hit', match[8]);\n const emojiCoords = getEmojiSpritesheetCoords(match[8]);\n if(emojiCoords) {\n entities.push({\n _: 'messageEntityEmoji',\n offset: matchIndex,\n length: match[8].length,\n unicode: emojiCoords\n });\n }\n } else if(match[11]) { // Hashtag\n entities.push({\n _: 'messageEntityHashtag',\n offset: matchIndex + (match[10] ? match[10].length : 0),\n length: match[11].length\n });\n } else if(match[13]) { // Bot command\n entities.push({\n _: 'messageEntityBotCommand',\n offset: matchIndex + (match[11] ? match[11].length : 0) + (match[12] ? match[12].length : 0),\n length: 1 + match[13].length + (match[14] ? 1 + match[14].length : 0),\n unsafe: true\n });\n }\n \n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n \n // if (entities.length) {\n // console.log('parse entities', text, entities.slice())\n // }\n return entities;\n }\n\n /* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n } */\n\n export function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n   /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(markdownRegExp)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n //text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n \n newTextParts.push(match[1] + text + match[5]);\n \n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: markdownEntities[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic)['_'],\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 if(!entities.length && !noTrim) {\n newText = newText.trim();\n }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n }\n\n export function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n return currentEntities.find(currentEntity => {\n const isConflictingTypes = newEntity._ === currentEntity._ || \n (!passConflictingEntities.has(newEntity._) && !passConflictingEntities.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset && \n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n }\n\n export function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter(e => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n if(!IS_EMOJI_SUPPORTED) { // fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\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 export function combineSameEntities(entities: MessageEntity[]) {\n //entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset);\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n //return entities;\n }\n\n export function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: true,\n noLinebreaks: true,\n noCommands: true,\n wrappingDraft: boolean,\n //mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: true,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n\n contextHashtag?: string,\n }> = {}) {\n if(!text) {\n return '';\n }\n\n const lol: {\n part: string,\n offset: number,\n // priority: number\n }[] = [];\n const entities = options.entities || parseEntities(text);\n\n const passEntities: typeof options.passEntities = options.passEntities || {};\n const contextSite = options.contextSite || 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const insertPart = (entity: MessageEntity, startPart: string, endPart?: string/* , priority = 0 */) => {\n lol.push({part: startPart, offset: entity.offset/* , priority */});\n\n if(endPart) {\n lol.push({part: endPart, offset: entity.offset + entity.length/* , priority */});\n }\n };\n\n const pushPartsAfterSort: typeof lol = [];\n\n for(let i = 0, length = entities.length; i < length; ++i) {\n const entity = entities[i];\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n insertPart(entity, ``, '');\n } else {\n insertPart(entity, '', '');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n insertPart(entity, ``, '');\n } else {\n insertPart(entity, '', '');\n }\n\n break;\n }\n \n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n \n break;\n }\n \n case 'messageEntityPre': {\n if(!options.noTextFormat) {\n insertPart(entity, `
`, '
');\n }\n \n break;\n }\n\n case 'messageEntityHighlight': {\n insertPart(entity, '', '');\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n const entityText = text.substr(entity.offset, entity.length);\n let command = entityText.substr(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.substr(atPos + 1);\n command = command.substr(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n insertPart(entity, ``, ``);\n }\n\n break;\n }\n\n case 'messageEntityEmoji': {\n //if(!(options.wrappingDraft && IS_EMOJI_SUPPORTED)) { // * fix safari emoji\n if(!IS_EMOJI_SUPPORTED) { // no wrapping needed\n // if(IS_EMOJI_SUPPORTED) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '', '');\n // } else {\n insertPart(entity, `\"`,`);\n // }\n //} else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n insertPart(entity, '', '');\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!IS_EMOJI_SUPPORTED) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n \n case 'messageEntityCaret': {\n const html = '';\n // const html = '';\n // insertPart(entity, '');\n // insertPart(entity, '');\n pushPartsAfterSort.push({part: html, offset: entity.offset});\n // insertPart(entity, html/* , undefined, 1 */);\n break;\n }\n\n /* case 'messageEntityLinebreak': {\n if(options.noLinebreaks) {\n insertPart(entity, ' ');\n } else {\n insertPart(entity, '
');\n }\n \n break;\n } */\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n const entityText = text.substr(entity.offset, entity.length);\n\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || entityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n const nextEntity = entities[i + 1];\n if(nextEntity?._ === 'messageEntityUrl' && \n nextEntity.length === entity.length && \n nextEntity.offset === entity.offset) {\n i++;\n }\n\n if(url !== entityText) {\n masked = true;\n }\n } else {\n //inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') \n ? encodeEntities(url)\n : `javascript:electronHelpers.openExternal('${encodeEntities(url)}');`;\n\n const target = (currentContext || typeof electronHelpers !== 'undefined')\n ? '' : ' target=\"_blank\" rel=\"noopener noreferrer\"';\n\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n \n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && siteHashtags[contextSite];\n if(contextUrl) {\n const entityText = text.substr(entity.offset, entity.length);\n const hashtag = entityText.substr(1);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n const username = entityText.substr(1);\n\n const {url, onclick} = wrapUrl('t.me/' + username);\n\n // insertPart(entity, ``, '');\n insertPart(entity, ``, '');\n }\n \n break;\n }\n }\n }\n\n // lol.sort((a, b) => (a.offset - b.offset) || (a.priority - b.priority));\n lol.sort((a, b) => a.offset - b.offset); // have to sort because of nested entities\n\n let partsLength = lol.length, partsAfterSortLength = pushPartsAfterSort.length;\n for(let i = 0; i < partsAfterSortLength; ++i) {\n const part = pushPartsAfterSort[i];\n let insertAt = 0;\n while(insertAt < partsLength) {\n if(lol[insertAt++].offset >= part.offset) {\n break;\n }\n }\n\n lol.splice(insertAt, 0, part);\n }\n\n partsLength += partsAfterSortLength;\n\n const arr: string[] = [];\n let usedLength = 0;\n for(let i = 0; i < partsLength; ++i) {\n const {part, offset} = lol[i];\n if(offset > usedLength) {\n arr.push(encodeEntities(text.slice(usedLength, offset)));\n usedLength = offset;\n }\n\n arr.push(part);\n }\n\n if(usedLength < text.length) {\n arr.push(encodeEntities(text.slice(usedLength)));\n }\n\n return arr.join('');\n }\n\n export function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach(entity => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n \n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n }\n\n export function wrapDraftText(text: string, options: Partial<{\n entities: MessageEntity[]\n }> = {}) {\n if(!text) {\n return '';\n }\n\n return wrapRichText(text, {\n entities: options.entities, \n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n }\n\n export function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n }\n \n export function 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 export function wrapPlainText(text: string) {\n if(IS_EMOJI_SUPPORTED) {\n return text;\n }\n \n if(!text || !text.length) {\n return '';\n }\n \n text = text.replace(/\\ufe0f/g, '');\n var match;\n var raw = text;\n const arr: string[] = [];\n let emojiTitle;\n fullRegExp.lastIndex = 0;\n while((match = raw.match(fullRegExp))) {\n arr.push(raw.substr(0, match.index))\n if(match[8]) {\n // @ts-ignore\n const emojiCode = EmojiHelper.emojiMap[match[8]];\n if(emojiCode &&\n // @ts-ignore\n (emojiTitle = emojiData[emojiCode][1][0])) {\n arr.push(':' + emojiTitle + ':');\n } else {\n arr.push(match[0]);\n }\n } else {\n arr.push(match[0]);\n }\n \n raw = raw.substr(match.index + match[0].length);\n }\n arr.push(raw);\n return arr.join('');\n }\n\n export function wrapEmojiText(text: string, isDraft = false) {\n if(!text) return '';\n \n let entities = parseEntities(text).filter(e => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n }\n\n export function wrapUrl(url: string, unsafe?: number | boolean): {url: string, onclick: string} {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n \n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: string;\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?t(?:elegram)?\\.me\\/(.+)/))) {\n const fullPath = tgMeMatch[1];\n\n if(/^\\W/.test(fullPath)) {\n onclick = 'joinchat';\n return {url, onclick};\n }\n\n const path = fullPath.split('/');\n switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'voicechat':\n onclick = path[0];\n break;\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1];\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n \n return {url, onclick};\n }\n\n export function matchUrlProtocol(text: string) {\n return !text ? null : text.match(urlAnyProtocolRegExp);\n }\n \n export function matchUrl(text: string) {\n return !text ? null : text.match(urlRegExp);\n }\n\n export function matchEmail(text: string) {\n return !text ? null : text.match(emailRegExp);\n }\n\n export function getAbbreviation(str: string, onlyFirst = false) {\n const splitted = str.trim().split(' ');\n if(!splitted[0]) return '';\n\n const first = [...splitted[0]][0];\n\n if(onlyFirst || splitted.length === 1) return wrapEmojiText(first);\n\n const last = [...splitted[splitted.length - 1]][0];\n\n return wrapEmojiText(first + last);\n }\n\n export function isUsernameValid(username: string) {\n return ((username.length >= 5 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n }\n\n export function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n }\n\n export function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n }\n}\n\nMOUNT_CLASS_TO.RichTextProcessor = RichTextProcessor;\n\nexport {RichTextProcessor};\nexport default RichTextProcessor;\n\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"mtproto.worker.fd3e71e917088f6f049f.bundle.worker.js\");\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\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\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { LocalStorageProxyTask, LocalStorageProxyTaskResponse } from '../localStorage';\n//import type { LocalStorageProxyDeleteTask, LocalStorageProxySetTask } from '../storage';\nimport type { Awaited, InvokeApiOptions, WorkerTaskVoidTemplate } from '../../types';\nimport type { Config, InputFile, MethodDeclMap, User } from '../../layer';\nimport MTProtoWorker from 'worker-loader!./mtproto.worker';\n//import './mtproto.worker';\nimport { isObject } from '../../helpers/object';\nimport CryptoWorkerMethods from '../crypto/crypto_methods';\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport { ApiFileManager, DownloadOptions } from './apiFileManager';\nimport type { RequestFilePartTask, RequestFilePartTaskResponse, ServiceWorkerTask } from '../serviceWorker/index.service';\nimport { UserAuth } from './mtproto_config';\nimport type { MTMessage } from './networker';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport Socket from './transports/websocket';\nimport singleInstance from './singleInstance';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport AppStorage from '../storage';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport { SocketProxyTask } from './transports/socketProxied';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport { CacheStorageDbName } from '../cacheStorage';\nimport { pause } from '../../helpers/schedulers/pause';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport type { ApiError } from './apiManager';\n\ntype Task = {\n taskId: number,\n task: string,\n args: any[]\n};\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport interface ToggleStorageTask extends WorkerTaskVoidTemplate {\n type: 'toggleStorage',\n payload: boolean\n};\n\nexport class ApiManagerProxy extends CryptoWorkerMethods {\n public worker: /* Window */Worker;\n private afterMessageIdTemp = 0;\n\n private taskId = 0;\n private awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskName: string\n }\n } = {} as any;\n private pending: Array = [];\n\n public updatesProcessor: (obj: any) => void = null;\n\n private log = logger('API-PROXY');\n\n private hashes: {[method: string]: HashOptions} = {};\n\n private apiPromisesSingleProcess: {\n [q: string]: Map>\n } = {};\n private apiPromisesSingle: {\n [q: string]: Promise\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n private isSWRegistered = true;\n\n private debug = DEBUG /* && false */;\n\n private sockets: Map = new Map();\n\n private taskListeners: {[taskType: string]: (task: any) => void} = {};\n private taskListenersSW: {[taskType: string]: (task: any) => void} = {};\n\n public onServiceWorkerFail: () => void;\n\n private postMessagesWaiting: any[][] = [];\n\n private getConfigPromise: Promise;\n\n constructor() {\n super();\n this.log('constructor');\n\n singleInstance.start();\n\n this.registerServiceWorker();\n\n this.addTaskListener('clear', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n AppStorage.toggleStorage(false), \n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map(cacheName => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n this.addTaskListener('connectionStatusChange', (task: any) => {\n rootScope.dispatchEvent('connection_status_change', task.payload);\n });\n\n this.addTaskListener('convertWebp', (task) => {\n webpWorkerController.postMessage(task);\n });\n\n this.addTaskListener('socketProxy', (task: SocketProxyTask) => {\n const socketTask = task.payload;\n const id = socketTask.id;\n //console.log('socketProxy', socketTask, id);\n\n if(socketTask.type === 'send') {\n const socket = this.sockets.get(id);\n socket.send(socketTask.payload);\n } else if(socketTask.type === 'close') { // will remove from map in onClose\n const socket = this.sockets.get(id);\n socket.close();\n } else if(socketTask.type === 'setup') {\n const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n \n const onOpen = () => {\n //console.log('socketProxy onOpen');\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'open',\n id\n }\n });\n };\n const onClose = () => {\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'close',\n id\n }\n });\n\n socket.removeEventListener('open', onOpen);\n socket.removeEventListener('close', onClose);\n socket.removeEventListener('message', onMessage);\n this.sockets.delete(id);\n };\n const onMessage = (buffer: ArrayBuffer) => {\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'message',\n id,\n payload: buffer\n }\n });\n };\n\n socket.addEventListener('open', onOpen);\n socket.addEventListener('close', onClose);\n socket.addEventListener('message', onMessage);\n this.sockets.set(id, socket);\n }\n });\n\n this.addTaskListener('localStorageProxy', (task: LocalStorageProxyTask) => {\n const storageTask = task.payload;\n // @ts-ignore\n sessionStorage[storageTask.type](...storageTask.args).then(res => {\n this.postMessage({\n type: 'localStorageProxy',\n id: task.id,\n payload: res\n } as LocalStorageProxyTaskResponse);\n });\n });\n\n rootScope.addEventListener('language_change', (language) => {\n this.performTaskWorkerVoid('setLanguage', language);\n });\n\n window.addEventListener('online', (event) => {\n this.forceReconnectTimeout();\n });\n\n \n this.registerWorker();\n \n\n setTimeout(() => {\n this.getConfig();\n }, 5000);\n }\n\n public isServiceWorkerOnline() {\n return this.isSWRegistered;\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n \n const worker = navigator.serviceWorker;\n worker.register('./sw.js', {scope: './'}).then(registration => {\n this.log('SW registered', registration);\n this.isSWRegistered = true;\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n //this.postSWMessage = worker.controller.postMessage.bind(worker.controller);\n\n \n \n \n \n }, (err) => {\n this.isSWRegistered = false;\n this.log.error('SW registration failed!', err);\n\n if(this.onServiceWorkerFail) {\n this.onServiceWorkerFail();\n }\n });\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n this.releasePending();\n\n worker.controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n worker.addEventListener('message', (e) => {\n const task: ServiceWorkerTask = e.data;\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListenersSW[task.type];\n if(callback) {\n callback(task);\n }\n });\n\n this.addServiceWorkerTaskListener('requestFilePart', (task: RequestFilePartTask) => {\n const responseTask: RequestFilePartTaskResponse = {\n type: task.type,\n id: task.id\n };\n \n this.performTaskWorker>>('requestFilePart', ...task.payload)\n .then((uploadFile) => {\n responseTask.payload = uploadFile;\n this.postSWMessage(responseTask);\n }, (err) => {\n responseTask.originalPayload = task.payload;\n responseTask.error = err;\n this.postSWMessage(responseTask);\n });\n });\n\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n public postMessage(...args: any[]) {\n this.postMessagesWaiting.push(args);\n }\n\n public postSWMessage(message: any) {\n if(navigator.serviceWorker.controller) {\n navigator.serviceWorker.controller.postMessage(message);\n }\n }\n\n private onWorkerFirstMessage(worker: any) {\n if(!this.worker) {\n this.worker = worker;\n this.log('set webWorker');\n\n this.postMessage = this.worker.postMessage.bind(this.worker);\n\n this.postMessagesWaiting.forEach(args => this.postMessage(...args));\n this.postMessagesWaiting.length = 0;\n\n const isWebpSupported = IS_WEBP_SUPPORTED;\n this.log('WebP supported:', isWebpSupported);\n this.postMessage({type: 'webpSupport', payload: isWebpSupported});\n this.postMessage({type: 'userAgent', payload: navigator.userAgent});\n\n this.releasePending();\n }\n }\n\n public addTaskListener(name: keyof ApiManagerProxy['taskListeners'], callback: ApiManagerProxy['taskListeners'][typeof name]) {\n this.taskListeners[name] = callback;\n }\n\n public addServiceWorkerTaskListener(name: keyof ApiManagerProxy['taskListenersSW'], callback: ApiManagerProxy['taskListenersSW'][typeof name]) {\n this.taskListenersSW[name] = callback;\n }\n\n private onWorkerMessage = (e: MessageEvent) => {\n //this.log('got message from worker:', e.data);\n\n const task = e.data;\n\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListeners[task.type];\n if(callback) {\n callback(task);\n return;\n }\n\n if(task.update) {\n if(this.updatesProcessor) {\n this.updatesProcessor(task.update);\n }\n } else if(task.progress) {\n rootScope.dispatchEvent('download_progress', task.progress);\n } else if(task.hasOwnProperty('result') || task.hasOwnProperty('error')) {\n this.finalizeTask(task.taskId, task.result, task.error);\n }\n };\n\n \n private registerWorker() {\n // return;\n\n const worker = new MTProtoWorker();\n //const worker = window;\n worker.addEventListener('message', this.onWorkerFirstMessage.bind(this, worker), {once: true});\n worker.addEventListener('message', this.onWorkerMessage);\n\n worker.addEventListener('error', (err) => {\n this.log.error('WORKER ERROR', err);\n });\n }\n \n\n private finalizeTask(taskId: number, result: any, error: any) {\n const deferred = this.awaiting[taskId];\n if(deferred !== undefined) {\n this.debug && this.log.debug('done', deferred.taskName, result, error);\n error ? deferred.reject(error) : deferred.resolve(result);\n delete this.awaiting[taskId];\n }\n }\n\n public performTaskWorkerVoid(task: string, ...args: any[]) {\n const params = {\n task,\n taskId: this.taskId,\n args\n };\n\n this.pending.push(params);\n this.releasePending();\n\n this.taskId++;\n }\n\n public performTaskWorker(task: string, ...args: any[]) {\n this.debug && this.log.debug('start', task, args);\n\n return new Promise((resolve, reject) => {\n this.awaiting[this.taskId] = {resolve, reject, taskName: task};\n this.performTaskWorkerVoid(task, ...args);\n });\n }\n\n private releasePending() {\n //return;\n\n if(this.postMessage) {\n this.debug && this.log.debug('releasing tasks, length:', this.pending.length);\n this.pending.forEach(pending => {\n this.postMessage(pending);\n });\n \n this.debug && this.log.debug('released tasks');\n this.pending.length = 0;\n }\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n //console.log('will invokeApi:', method, params, options);\n return this.performTaskWorker('invokeApi', method, params, options);\n }\n\n public invokeApiAfter(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n \n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n //console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable(method: T, params: Omit = {} as any, options: InvokeApiOptions = {}): Promise {\n //console.log('will invokeApi:', method, params, options);\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n (params as any).hash = cached.hash;\n }\n }\n\n return this.invokeApi(method, params, options).then((result: any) => {\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 return result;\n });\n }\n\n public invokeApiSingle(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions = {}): Promise {\n const q = method + '-' + JSON.stringify(params);\n const cache = this.apiPromisesSingle;\n if(cache[q]) {\n return cache[q];\n }\n\n return cache[q] = this.invokeApi(method, params, options).finally(() => {\n delete cache[q];\n });\n }\n\n public invokeApiSingleProcess(o: {\n method: T, \n processResult: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: MethodDeclMap[T]['req'], \n options?: InvokeApiOptions & {cacheKey?: string}\n }): Promise {\n o.params ??= {};\n o.options ??= {};\n\n const {method, processResult, processError, params, options} = o;\n const cache = this.apiPromisesSingleProcess;\n const cacheKey = options.cacheKey || JSON.stringify(params);\n const map = cache[method] ?? (cache[method] = new Map());\n const oldPromise = map.get(cacheKey);\n if(oldPromise) {\n return oldPromise;\n }\n \n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise = originalPromise.then(processResult, processError);\n\n const p = newPromise.finally(() => {\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = window.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n try {\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n \n delete cache[queryJSON];\n }\n } catch(err) {\n this.log.error('clearCache error:', err, queryJSON, item);\n }\n }\n }\n }\n\n /* private computeHash(smth: any[]) {\n smth = smth.slice().sort((a, b) => a.id - b.id);\n //return smth.reduce((hash, v) => (((hash * 0x4F25) & 0x7FFFFFFF) + v.id) & 0x7FFFFFFF, 0);\n return smth.reduce((hash, v) => ((hash * 20261) + 0x80000000 + v.id) % 0x80000000, 0);\n } */\n\n public setBaseDcId(dcId: number) {\n return this.performTaskWorker('setBaseDcId', dcId);\n }\n\n public setQueueId(queueId: number) {\n return this.performTaskWorker('setQueueId', queueId);\n }\n\n public setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n \n rootScope.dispatchEvent('user_auth', userAuth);\n return this.performTaskWorker('setUserAuth', userAuth);\n }\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n public getNetworker(dc_id: number, options?: InvokeApiOptions) {\n return this.performTaskWorker('getNetworker', dc_id, options);\n }\n\n public logOut(): Promise {\n // AppStorage.toggleStorage(false);\n return this.performTaskWorker('logOut');\n }\n\n public cancelDownload(fileName: string) {\n return this.performTaskWorker('cancelDownload', fileName);\n }\n\n public downloadFile(options: DownloadOptions) {\n return this.performTaskWorker('downloadFile', options);\n }\n\n public uploadFile(options: {file: Blob | File, fileName: string}) {\n return this.performTaskWorker('uploadFile', options);\n }\n\n public toggleStorage(enabled: boolean) {\n const task: ToggleStorageTask = {type: 'toggleStorage', payload: enabled};\n this.postMessage(task);\n this.postSWMessage(task);\n }\n\n public stopAll() {\n return this.performTaskWorkerVoid('stopAll');\n }\n\n public startAll() {\n return this.performTaskWorkerVoid('startAll');\n }\n\n public forceReconnectTimeout() {\n this.postMessage({type: 'online'});\n }\n\n public forceReconnect() {\n this.postMessage({type: 'forceReconnect'});\n }\n\n public getConfig() {\n if(this.getConfigPromise) return this.getConfigPromise;\n return this.getConfigPromise = this.invokeApi('help.getConfig').then(config => {\n rootScope.config = config;\n return config;\n });\n }\n}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Awaited } from \"../../types\";\r\nimport type { aesEncryptSync, aesDecryptSync, sha256HashSync, sha1HashSync, bytesModPow, hash_pbkdf2, rsaEncrypt, pqPrimeFactorization, gzipUncompress } from \"./crypto_utils\";\r\nimport type { computeSRP } from \"./srp\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1-hash': typeof sha1HashSync,\r\n 'sha256-hash': typeof sha256HashSync,\r\n 'pbkdf2': typeof hash_pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof pqPrimeFactorization,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker(task: string, ...args: any[]): Promise;\r\n\r\n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\r\n return this.performTaskWorker>>(method, ...args as any[]);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport calcImageInBox from \"./calcImageInBox\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport class MediaSize {\r\n constructor(public width = 0, public height = width) {\r\n\r\n }\r\n\r\n public aspect(boxSize: MediaSize, fitted: boolean) {\r\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\r\n }\r\n\r\n public aspectFitted(boxSize: MediaSize) {\r\n return this.aspect(boxSize, true);\r\n }\r\n\r\n public aspectCovered(boxSize: MediaSize) {\r\n return this.aspect(boxSize, false);\r\n }\r\n}\r\n\r\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\r\n return new MediaSize(width, height);\r\n}\r\n\r\ntype MediaTypeSizes = {\r\n regular: MediaSize,\r\n webpage: MediaSize,\r\n album: MediaSize,\r\n esgSticker: MediaSize,\r\n animatedSticker: MediaSize,\r\n staticSticker: MediaSize,\r\n emojiSticker: MediaSize,\r\n poll: MediaSize,\r\n round: MediaSize\r\n};\r\n\r\nexport enum ScreenSize {\r\n mobile,\r\n medium,\r\n large\r\n}\r\n\r\nconst MOBILE_SIZE = 600;\r\nconst MEDIUM_SIZE = 1275;\r\nconst LARGE_SIZE = 1680;\r\n\r\nclass MediaSizes extends EventListenerBase<{\r\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\r\n resize: () => void\r\n}> {\r\n private screenSizes: {key: ScreenSize, value: number}[] = [\r\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\r\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\r\n {key: ScreenSize.large, value: LARGE_SIZE}\r\n ];\r\n\r\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\r\n handhelds: {\r\n regular: makeMediaSize(270, 270),\r\n webpage: makeMediaSize(270, 200),\r\n album: makeMediaSize(270, 0),\r\n esgSticker: makeMediaSize(68, 68),\r\n animatedSticker: makeMediaSize(180, 180),\r\n staticSticker: makeMediaSize(180, 180),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(240, 0),\r\n round: makeMediaSize(200, 200)\r\n },\r\n desktop: {\r\n regular: makeMediaSize(420, 340),\r\n webpage: makeMediaSize(420, 340),\r\n album: makeMediaSize(420, 0),\r\n esgSticker: makeMediaSize(80, 80),\r\n animatedSticker: makeMediaSize(200, 200),\r\n staticSticker: makeMediaSize(200, 200),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(330, 0),\r\n round: makeMediaSize(280, 280)\r\n }\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 { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport I18n, { i18n } from \"../lib/langPack\";\r\nimport { capitalizeFirstLetter } from \"./string\";\r\nimport tsNow from './tsNow';\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\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('Date.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = capitalizeFirstLetter(I18n.format('Yesterday', true));\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 const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true, \r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) + \r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) + \r\n joiner + date.getFullYear() + \r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\nexport {tsNow};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp(\"20[0-9]{1,2}\");\r\nconst monthYearOrDayPattern = new RegExp(\"(\\\\w{3,}) ([0-9]{0,4})\", 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp(\"([0-9]{0,4}) (\\\\w{2,})\", 'i');\r\nconst shortDate = new RegExp(\"^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst longDate = new RegExp(\"^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if(\"today\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if(\"yesterday\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if (k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if (k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if (k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n \r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n \r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n \r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n/* export function stringMiddleOverflow(str: string, maxLength: number) {\r\n return str.length > maxLength ? str.slice(0, maxLength / 2 | 0) + '...' + str.slice(-Math.round(maxLength / 2)) : str; \r\n} */\r\n\r\nexport function limitSymbols(str: string, length: number, limitFrom = length + 10) {\r\n str = str.trim();\r\n if(str.length > limitFrom) {\r\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\r\n }\r\n\r\n return str;\r\n}\r\n\r\n// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\r\nexport function escapeRegExp(str: string) {\r\n return str\r\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\r\n .replace(/-/g, '\\\\x2d');\r\n}\r\n\r\nexport function encodeEntities(value: string) {\r\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\r\n var hi = value.charCodeAt(0);\r\n var low = value.charCodeAt(1);\r\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\r\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\r\n return '&#' + value.charCodeAt(0) + ';';\r\n }).replace(//g, '>');\r\n}\r\n\r\nexport function splitStringByLength(str: string, maxLength: number) {\r\n if(str.length < maxLength) return [str];\r\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\r\n const delimiter = ' ';//'\\n';\r\n const out: string[] = [];\r\n\r\n const cut = (end?: number) => {\r\n let part = str.slice(lastSliceStartIndex, end);\r\n const _arrayIndex = arrayIndex++;\r\n if(part.length > maxLength) {\r\n let overflowPart = part.slice(maxLength);\r\n const splitted = splitStringByLength(overflowPart, maxLength);\r\n splitted.forEach(part => {\r\n out[arrayIndex++] = part;\r\n });\r\n\r\n part = part.slice(0, maxLength);\r\n }\r\n\r\n lastSliceStartIndex = end;\r\n length = 0;\r\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\r\n };\r\n\r\n let lastIndex = 0;\r\n do {\r\n let index = str.indexOf(delimiter, lastIndex);\r\n if(index === -1) {\r\n if(lastIndex !== (str.length - 1)) {\r\n cut();\r\n }\r\n\r\n break;\r\n }\r\n\r\n index += delimiter.length;\r\n\r\n const partLength = index - lastIndex;\r\n if((length + partLength) > maxLength) {\r\n cut(length);\r\n }\r\n \r\n lastIndex = index;\r\n length += partLength;\r\n } while(true);\r\n\r\n return out;\r\n}\r\n\r\n// https://stackoverflow.com/a/14824756\r\n/* export const checkRTL = (s: string) => { \r\n const ltrChars = 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF'+'\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF',\r\n rtlChars = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC',\r\n rtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']');\r\n\r\n return rtlDirCheck.test(s);\r\n}; */\r\n\r\n//(window as any).checkRTL = checkRTL;\r\n\r\nexport function convertInputKeyToKey(inputKey: string) {\r\n const str = inputKey.replace('input', '');\r\n return (str[0].toLowerCase() + str.slice(1)) as T;\r\n}\r\n\r\nexport function convertKeyToInputKey(key: string) {\r\n key = key[0].toUpperCase() + key.slice(1);\r\n key = 'input' + key;\r\n return key;\r\n}\r\n\r\nexport function capitalizeFirstLetter(string: string) {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n}\r\n","export const pause = (ms: number) => new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n});\r\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if (char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n let match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/11.0091c78c69fac393d4c2.chunk.js b/public/11.0091c78c69fac393d4c2.chunk.js new file mode 100644 index 000000000..9e544b03d --- /dev/null +++ b/public/11.0091c78c69fac393d4c2.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[11,15,19],{101:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(51);class s{constructor(t,e){this.passwordInputField=t,this.size=e,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=n.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then(t=>(this.animation=t,this.animation.addEventListener("enterFrame",t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},n.a.waitForFirstFrame(t)))}remove(){this.animation&&this.animation.remove()}}},18:function(t,e,i){"use strict";i.r(e),i.d(e,"ripple",(function(){return l}));var n=i(6),s=i(60),a=i(1),o=i(15);let r=0;function l(t,e=(()=>Promise.resolve()),i=null,l=!1){if(t.querySelector(".c-ripple"))return;t.classList.add("rp");let c=document.createElement("div");c.classList.add("c-ripple");let u;t.classList.contains("rp-square")&&c.classList.add("is-square"),t[l?"prepend":"append"](c);const d=(t,n)=>{const o=Date.now(),l=document.createElement("div"),d=r++,h=1e3*+window.getComputedStyle(c).getPropertyValue("--ripple-duration").replace("s","");u=()=>{let t=Date.now()-o;const e=()=>{s.a.mutate(()=>{l.remove()}),i&&i(d)};if(tl.classList.add("hiding"),Math.max(i-h/2,0)),setTimeout(e,i)}else l.classList.add("hiding"),setTimeout(e,h/2);a.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",u),u=null,p=!1},e&&e(d),window.requestAnimationFrame(()=>{const e=c.getBoundingClientRect();l.classList.add("c-ripple__circle");const i=t-e.left,s=n-e.top,a=Math.sqrt(Math.pow(Math.abs(s-e.height/2)+e.height/2,2)+Math.pow(Math.abs(i-e.width/2)+e.width/2,2)),o=i-a/2,r=s-a/2;l.style.width=l.style.height=a+"px",l.style.left=o+"px",l.style.top=r+"px",c.append(l)})},h=e=>e.target!==t&&(["BUTTON","A"].includes(e.target.tagName)||Object(n.a)(e.target,"c-ripple")!==c);let p=!1;if(a.IS_TOUCH_SUPPORTED){let e=()=>{u&&u()};t.addEventListener("touchstart",i=>{if(!o.default.settings.animationsEnabled)return;if(i.touches.length>1||p||h(i))return;p=!0;let{clientX:n,clientY:s}=i.touches[0];d(n,s),t.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",i=>{i.cancelBubble=!0,i.stopPropagation(),e(),t.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else t.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===t.dataset.ripple||h(e))return;if(p)return void(p=!1);let{clientX:i,clientY:n}=e;d(i,n),window.addEventListener("mouseup",u,{once:!0,passive:!0}),window.addEventListener("contextmenu",u,{once:!0,passive:!0})},{passive:!0})}},21:function(t,e,i){"use strict";i.r(e);var n=i(35),s=i(37),a=i(17),o=i(79),r=i(64),l=i(34),c=i(95),u=i(101),d=i(31),h=i(16),p=i(91),m=i(5),g=i(30),v=i(96),f=i(36),b=i(58);let w;const L=new r.a("page-password",!0,()=>{const t=new p.a({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=Object(l.a)("btn-primary btn-color-primary"),a=new h.default.IntlElement({key:"Login.Next"});e.append(a.element);const r=new c.a({label:"LoginPassword",name:"password"});let L;w=r.input,t.inputWrapper.append(r.container,e);let E,y=()=>(L||(L=window.setInterval(y,1e4)),o.a.getState().then(t=>{E=t,E.hint?Object(f.a)(r.label,Object(v.a)(d.b.wrapEmojiText(E.hint))):r.setLabel()}));const k=t=>{if(t&&Object(m.a)(t),!w.value.length)return void w.classList.add("error");const s=Object(b.a)([w,e],!0);let l=w.value;a.update({key:"PleaseWait"});const c=Object(n.f)(e);o.a.check(l,E).then(t=>{switch(t._){case"auth.authorization":clearInterval(L),i.e(4).then(i.bind(null,19)).then(t=>{t.default.mount()}),S&&S.remove();break;default:e.removeAttribute("disabled"),a.update({key:t._}),c.remove()}}).catch(t=>{s(),r.input.classList.add("error"),t.type,a.update({key:"PASSWORD_HASH_INVALID"}),w.select(),c.remove(),y()})};Object(g.b)(e,k),w.addEventListener("keypress",(function(t){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===t.key)return k()}));const T=s.b.isMobile?100:166,S=new u.a(r,T);return t.imageDiv.append(S.container),Promise.all([S.load(),y()])},null,()=>{w.focus(),a.default.pushToState("authState",{_:"authStatePassword"})});e.default=L},30:function(t,e,i){"use strict";i.d(e,"a",(function(){return a})),i.d(e,"b",(function(){return o})),i.d(e,"c",(function(){return r})),i.d(e,"d",(function(){return l}));var n=i(1),s=i(52);const a=n.IS_TOUCH_SUPPORTED?"mousedown":"click";function o(t,e,i={}){const n=i.listenerSetter?i.listenerSetter.add(t):t.addEventListener.bind(t);i.touchMouseDown=!0,n(a,e,i)}function r(t,e,i){t.removeEventListener(a,e,i)}function l(t){Object(s.a)(t,a)}},34:function(t,e,i){"use strict";var n=i(16),s=i(18);e.a=(t,e={})=>{const i=document.createElement(e.asDiv?"div":"button");return i.className=t+(e.icon?" tgico-"+e.icon:""),e.noRipple||(e.rippleSquare&&i.classList.add("rp-square"),Object(s.ripple)(i)),e.onlyMobile&&i.classList.add("only-handhelds"),e.disabled&&i.setAttribute("disabled","true"),e.text&&i.append(Object(n.i18n)(e.text)),i}},35:function(t,e,i){"use strict";i.d(e,"f",(function(){return d})),i.d(e,"g",(function(){return h})),i.d(e,"c",(function(){return g})),i.d(e,"d",(function(){return w})),i.d(e,"e",(function(){return L})),i.d(e,"b",(function(){return k})),i.d(e,"a",(function(){return T}));var n=i(29),s=i(5),a=i(30),o=i(37),r=i(1),l=i(0),c=i(15),u=i(50);function d(t,e=!1){const i='\n \n \n ';if(e){const e=document.createElement("div");return e.classList.add("preloader"),e.innerHTML=i,t&&t.appendChild(e),e}return t.insertAdjacentHTML("beforeend",i),t.lastElementChild}function h(t,e="check"){return t.classList.remove("tgico-"+e),t.disabled=!0,d(t),()=>{t.innerHTML="",t.classList.add("tgico-"+e),t.removeAttribute("disabled")}}n.a.putPreloader=d;let p=t=>{let e=v.getBoundingClientRect(),{clientX:i,clientY:n}=t,s=i>=e.right?i-e.right:e.left-i,a=n>=e.bottom?n-e.bottom:e.top-n;(s>=100||a>=100)&&g()};const m=t=>{g()},g=()=>{v&&(v.classList.remove("active"),v.parentElement.classList.remove("menu-open"),b&&b.remove(),v=null,c.default.dispatchEvent("context_menu_toggle",!1)),f&&(f(),f=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(a.a,m),l.IS_MOBILE_SAFARI||u.a.removeByType("menu")};window.addEventListener("resize",()=>{v&&g()});let v=null,f=null,b=null;function w(t,e){g(),l.IS_MOBILE_SAFARI||u.a.pushItem({type:"menu",onPop:t=>{g()}}),v=t,v.classList.add("active"),v.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(a.a,t=>{Object(s.a)(t),m()})),v.parentElement.insertBefore(b,v),f=e,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(a.a,m),c.default.dispatchEvent("context_menu_toggle",!0)}function L({pageX:t,pageY:e},i,n){let{scrollWidth:s,scrollHeight:a}=i;const r=document.body.getBoundingClientRect(),l=r.width,c=r.height;n=o.b.isMobile?"right":"left";let u="top";const d={x:{left:t,right:t-s},intermediateX:"right"===n?8:l-s-8,y:{top:e,bottom:e-a},intermediateY:e=8},p={top:d.y.top+a+8<=c,bottom:d.y.bottom-8>=8};{let t;t=h[n]?d.x[n]:(n="center",d.intermediateX),i.style.left=t+"px"}{let t;t=p[u]?d.y[u]:(u="center",d.intermediateY),i.style.top=t+"px"}i.className=i.className.replace(/(top|center|bottom)-(left|center|right)/g,""),i.classList.add(("center"===u?u:"bottom")+"-"+("center"===n?n:"left"===n?"right":"left"))}let E=!1,y=0;function k(){y&&clearTimeout(y),y=window.setTimeout(()=>{y=0,E=!1},400),E=!0}function T(t,e,i){const n=i?i.add(t):t.addEventListener.bind(t),a=i?i.removeManual.bind(i,t):t.removeEventListener.bind(t);if(l.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let i;const o={capture:!0},r=()=>{clearTimeout(i),a("touchmove",r,o),a("touchend",r,o),a("touchcancel",r,o)};n("touchstart",a=>{a.touches.length>1?r():(n("touchmove",r,o),n("touchend",r,o),n("touchcancel",r,o),i=window.setTimeout(()=>{E?r():(e(a.touches[0]),r(),v&&t.addEventListener("touchend",s.a,{once:!0}))},400))})}else n("contextmenu",r.IS_TOUCH_SUPPORTED?i=>{e(i),v&&t.addEventListener("touchend",s.a,{once:!0})}:e)}},36:function(t,e,i){"use strict";function n(t,e){if("string"==typeof e)return void(t.innerHTML=e);const i=t.firstChild;i?t.lastChild===i?i.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}i.d(e,"a",(function(){return n}))},38:function(t,e,i){"use strict";i.d(e,"a",(function(){return d}));var n=i(52),s=i(85),a=i(69),o=i(90);var r=i(16),l=i(31),c=i(57);let u=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;t.preventDefault();let e=(t.originalEvent||t).clipboardData.getData("text/plain"),i=l.b.parseEntities(e);i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),e=l.b.wrapRichText(e,{entities:i,noLinks:!0,wrappingDraft:!0}),window.document.execCommand("insertHTML",!1,e)}),u=null};var d;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(d||(d={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:i,showLengthOn:n,name:s,plainText:l}=t;let c,d,h=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,c=this.container.firstElementChild;else{u&&u(),this.container.innerHTML='\n
\n ',c=this.container.firstElementChild;const e=new MutationObserver(()=>{d&&d()});c.addEventListener("input",()=>{Object(o.a)(c)&&(c.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=c.innerHTML,this.onFakeInput())}),e.observe(c,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(c.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=c.className+" input-field-input-fake")}if(c.setAttribute("dir","auto"),e&&(Object(r._i18n)(c,e,void 0,"placeholder"),this.inputFake&&Object(r._i18n)(this.inputFake,e,void 0,"placeholder")),h||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(h&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const t=this.container.lastElementChild;let e=!1;d=()=>{const s=c.classList.contains("error"),o=l?c.value.length:[...Object(a.a)(c,!1).value].length,r=i-o,u=r<0;c.classList.toggle("error",u),u||r<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!u||e)&&(this.setLabel(),e=!1)},c.addEventListener("input",d)}this.input=c}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const i=window.getSelection();i.removeAllRanges(),i.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===e)return;const n=Math.round(50*Math.log(Math.abs(e-i)));this.input.style.transitionDuration=n+"ms",t&&(this.input.style.height=e?e+"px":"");Object(c.a)(this.input,"is-changing-height",!0,n,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(n.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.b.wrapDraftText(t)),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(r.i18n)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&d.Error)),this.input.classList.toggle("valid",!!(t&d.Valid))}setError(t){this.setState(d.Error,t)}}},50:function(t,e,i){"use strict";var n=i(29),s=i(0),a=i(43),o=i(7),r=i(5),l=i(41),c=i(72);const u=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(a.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let t=!1;if(window.addEventListener("popstate",e=>{if(this.debug&&this.log("popstate",e,t),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(e.state!==this.id)return void this.pushState();const i=this.navigations.pop();i?(this.manual=!t,this.handleItem(i)):this.pushState()}),window.addEventListener("keydown",t=>{const e=this.navigations[this.navigations.length-1];e&&("Escape"!==t.key||e.onEscape&&!e.onEscape()||(Object(r.a)(t),this.back(e.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),Object(c.a)(e)&&(t=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{t=!1},100)},{passive:!0,once:!0})))},e)}history.scrollRestoration="manual",this.pushState()}handleItem(t){const e=t.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",t,this.navigations),!1===e?this.pushItem(t):t.noBlurOnPop||Object(o.a)(),this.manual=!1}findItemByType(t){for(let e=this.navigations.length-1;e>=0;--e){const i=this.navigations[e];if(i.type===t)return{item:i,index:e}}}back(t){if(t){const e=this.findItemByType(t);if(e)return void this.backByItem(e.item,e.index)}history.back()}backByItem(t,e=this.navigations.indexOf(t)){this.manual=!0,this.navigations.splice(e,1),this.handleItem(t)}pushItem(t){this.navigations.push(t),this.debug&&this.log("pushstate",t,this.navigations),t.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(t){Object(l.e)(this.navigations,t)}removeByType(t,e=!1){for(let i=this.navigations.length-1;i>=0;--i){if(this.navigations[i].type===t&&(this.navigations.splice(i,1),e))break}}};n.a.appNavigationController=u,e.a=u},52:function(t,e,i){"use strict";function n(t,e){const i=new Event(e,{bubbles:!0,cancelable:!0});t.dispatchEvent(i)}i.d(e,"a",(function(){return n}))},57:function(t,e,i){"use strict";var n=i(15);const s=(t,e,i,a,o,r)=>{const{timeout:l,raf:c}=t.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete t.dataset.raf),r&&n.default.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,i,a,o,r-1)}));i&&e&&t.classList.add(e);const u=()=>{delete t.dataset.timeout,!i&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),o&&o()};if(!n.default.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(u,a)};e.a=s},58:function(t,e,i){"use strict";function n(t,e){return e?t.forEach(t=>t.setAttribute("disabled","true")):t.forEach(t=>t.removeAttribute("disabled")),()=>n(t,!e)}i.d(e,"a",(function(){return n}))},60:function(t,e,i){"use strict";var n=i(42),s=i(46),a=i(29),o=i(61);const r=new class{constructor(){this.promises={},this.raf=n.b.bind(null),this.scheduled=!1}do(t,e){let i=this.promises[t];return i||(this.scheduleFlush(),i=this.promises[t]=Object(s.a)()),void 0!==e&&i.then(()=>e()),i}measure(t){return this.do("read",t)}mutate(t){return this.do("write",t)}mutateElement(t,e){const i=Object(o.a)(t)?this.mutate():Promise.resolve();return void 0!==e&&i.then(()=>e()),i}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};a.a&&(a.a.sequentialDom=r),e.a=r},69:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(29),s=i(31),a=i(86);function o(t,e=!0){const i=[],n=[],o=e?[]:void 0;Object(a.a)(t,i,n,void 0,void 0,o),n.length&&i.push(n.join(""));let r=i.join("\n");return r=r.replace(/\u00A0/g," "),o&&s.b.combineSameEntities(o),{value:r,entities:o}}n.a.getRichValue=o},72:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(0);function s(t){return n.IS_MOBILE_SAFARI&&t instanceof TouchEvent&&t.touches[0].clientX<30}},79:function(t,e,i){"use strict";var n=i(29),s=i(33);const a=new class{getState(){return s.a.invokeApi("account.getPassword").then(t=>t)}updateSettings(t={}){return this.getState().then(e=>{let i,n;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:t.hint,email:t.email}};i=t.currentPassword?s.a.invokeCrypto("computeSRP",t.currentPassword,e,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=e.new_algo,r=new Uint8Array(o.salt1.length+32);return r.randomize(),r.set(o.salt1,0),o.salt1=r,n=t.newPassword?s.a.invokeCrypto("computeSRP",t.newPassword,e,!0):Promise.resolve(new Uint8Array),Promise.all([i,n]).then(t=>(a.password=t[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=t[1],s.a.invokeApi("account.updatePasswordSettings",a)))})}check(t,e,i={}){return s.a.invokeCrypto("computeSRP",t,e,!1).then(t=>s.a.invokeApi("auth.checkPassword",{password:t},i).then(t=>("auth.authorization"===t._&&s.a.setUser(t.user),t)))}confirmPasswordEmail(t){return s.a.invokeApi("account.confirmPasswordEmail",{code:t})}resendPasswordEmail(){return s.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return s.a.invokeApi("account.cancelPasswordEmail")}};n.a.passwordManager=a,e.a=a},85:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},86:function(t,e,i){"use strict";i.d(e,"b",(function(){return n})),i.d(e,"a",(function(){return s}));const n={bold:{match:'[style*="font-weight"], b',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"}};function s(t,e,i,a,o,r,l={offset:0}){if(3===t.nodeType){const e=t.nodeValue;if(a===t?i.push(e.substr(0,o)+""+e.substr(o)):i.push(e),r&&e.trim()&&t.parentNode){const i=t.parentElement;for(const t in n){const s=n[t],a=i.closest(s.match+", [contenteditable]");a&&null===a.getAttribute("contenteditable")&&("messageEntityTextUrl"===s.entityName?r.push({_:s.entityName,url:i.href,offset:l.offset,length:e.length}):"messageEntityMentionName"===s.entityName?r.push({_:s.entityName,offset:l.offset,length:e.length,user_id:i.dataset.follow.toUserId()}):r.push({_:s.entityName,offset:l.offset,length:e.length}))}}return void(l.offset+=e.length)}if(1!==t.nodeType)return;const c=a===t,u="DIV"===t.tagName||"P"===t.tagName;if(u&&i.length||"BR"===t.tagName)e.push(i.join("")),i.splice(0,i.length);else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),l.offset+=e.length)}c&&!o&&i.push("");let d=t.firstChild;for(;d;)s(d,e,i,a,o,r,l),d=d.nextSibling;c&&o&&i.push(""),u&&i.length&&(e.push(i.join("")),i.splice(0,i.length))}},90:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(69);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(n.a)(t,!1).value.trim():!t.value.trim()}},91:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(16);class s{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(n.i18n)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(n.i18n)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},95:function(t,e,i){"use strict";i.d(e,"a",(function(){return a}));var n=i(5),s=i(38);class a extends s.b{constructor(t={}){super(Object.assign({plainText:!0},t)),this.passwordVisible=!1,this.onVisibilityClick=t=>{Object(n.a)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const s=this.toggleVisible=document.createElement("span");s.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(s),s.addEventListener("click",this.onVisibilityClick),s.addEventListener("touchend",this.onVisibilityClick)}}},96:function(t,e,i){"use strict";function n(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return n}))}}]); +//# sourceMappingURL=11.0091c78c69fac393d4c2.chunk.js.map \ No newline at end of file diff --git a/public/11.0091c78c69fac393d4c2.chunk.js.map b/public/11.0091c78c69fac393d4c2.chunk.js.map new file mode 100644 index 000000000..78bee5afa --- /dev/null +++ b/public/11.0091c78c69fac393d4c2.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/monkeys/password.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["PasswordMonkey","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","waitForFirstFrame","remove","rippleClickId","ripple","elem","callback","Promise","resolve","onEnd","prepend","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","abs","x","y","style","append","isRippleUnneeded","e","target","includes","tagName","touchEnd","settings","animationsEnabled","touches","length","once","cancelBubble","stopPropagation","passive","button","dataset","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","element","label","name","getStateInterval","input","inputWrapper","state","getState","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","value","toggle","update","preloader","check","response","_","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","type","select","isMobile","imageDiv","all","load","focus","pushToState","CLICK_EVENT_NAME","attachClickEvent","options","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","asDiv","icon","noRipple","rippleSquare","onlyMobile","disabled","setAttribute","text","putPreloader","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","parentElement","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","clearTimeout","attachContextMenuListener","removeManual","timeout","capture","onCancel","replaceContent","node","firstChild","lastChild","replaceWith","textContent","init","findUpAttribute","preventDefault","originalEvent","clipboardData","getData","entities","parseEntities","filter","wrapRichText","noLinks","wrappingDraft","execCommand","InputState","required","validate","undefined","maxLength","showLengthOn","min","round","placeholder","plainText","processInput","labelText","firstElementChild","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","border","labelEl","showingLength","wasError","inputLength","getRichValue","diff","isError","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","newHeight","currentHeight","transitionDuration","log","setValueSilently","fireFakeInput","originalValue","isValid","isChanged","silent","wrapDraftText","setDraftValue","Error","Valid","setState","appNavigationController","navigations","id","manual","debug","currentHash","location","hash","isPossibleSwipe","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","good","noBlurOnPop","i","index","ret","findItemByType","backByItem","indexOf","splice","push","noHistory","origin","pathname","single","simulateEvent","event","Event","bubbles","cancelable","SetTransition","forwards","onTransitionEnd","useRafs","raf","cancelAnimationFrame","afterTimeout","toggleDisability","elements","disable","forEach","sequentialDom","promises","scheduled","kind","promise","scheduleFlush","do","read","write","field","withEntities","lines","line","join","combineSameEntities","isSwipingBackSafari","TouchEvent","passwordManager","invokeApi","result","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","hashes","new_password_hash","inputCheckPassword","auth","setUser","user","code","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","getRichElementValue","selNode","selOffset","offset","nodeType","nodeValue","substr","trim","parentNode","tag","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","HTMLImageElement","alt","curChild","nextSibling","hasAttribute","LoginPage","title","subtitle","PasswordInputField","super","onVisibilityClick","toggleVisible","autocomplete","stealthy","tabIndex","cloneNode","htmlToSpan","span"],"mappings":"6FAAA,8CAUe,MAAMA,EAMnB,YAAsBC,EAAkDC,GAAlD,KAAAD,qBAAkD,KAAAC,OAHjE,KAAAC,UAAY,EAIjBC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,yBAGxB,OACL,OAAGL,KAAKM,YAAoBN,KAAKM,YAC1BN,KAAKM,YAAc,IAAaC,qBAAqB,CAC1DN,UAAWD,KAAKC,UAChBO,MAAM,EACNC,UAAU,EACVC,MAAOV,KAAKF,KACZa,OAAQX,KAAKF,KACbc,SAAS,GAER,4BAA4BC,KAAKC,IAElCd,KAAKe,UAAYD,EACjBd,KAAKe,UAAUC,iBAAiB,aAAcC,KAGX,IAA7BjB,KAAKe,UAAUG,WAAmBD,GAAgBjB,KAAKD,YAC1B,IAA9BC,KAAKe,UAAUG,WAAoBD,GAAgBjB,KAAKD,aACvDC,KAAKe,UAAUI,SAAS,GACxBnB,KAAKe,UAAUK,WAIrBpB,KAAKH,mBAAmBwB,4BAA8B,KACjDrB,KAAKH,mBAAmByB,iBACzBtB,KAAKe,UAAUQ,aAAa,GAC5BvB,KAAKe,UAAUS,SAAW,EAC1BxB,KAAKD,UAAY,GACjBC,KAAKe,UAAUU,SAEfzB,KAAKe,UAAUQ,cAAc,GAC7BvB,KAAKe,UAAUS,SAAW,GAC1BxB,KAAKD,UAAY,EACjBC,KAAKe,UAAUU,SAIZ,IAAaC,kBAAkBZ,KAInC,SACFd,KAAKe,WACNf,KAAKe,UAAUY,Y,gCChErB,gFAWA,IAAIC,EAAgB,EACb,SAASC,EAAOC,EAAmBC,EAAoD,KAAMC,QAAQC,WAAWC,EAA8B,KAAMC,GAAU,GAEnK,GAAGL,EAAKM,cAAc,aAAc,OACpCN,EAAK1B,UAAUC,IAAI,MAEnB,IAAIgC,EAAInC,SAASC,cAAc,OAC/BkC,EAAEjC,UAAUC,IAAI,YAShB,IAAIiC,EAPaR,EAAK1B,UAAUmC,SAAS,cAEvCF,EAAEjC,UAAUC,IAAI,aAGlByB,EAAKK,EAAU,UAAY,UAAUE,GAIrC,MAAMG,EAAa,CAACC,EAAiBC,KACnC,MAAMC,EAAYC,KAAKC,MACjBf,EAAO5B,SAASC,cAAc,OAE9B2C,EAAUlB,IAIVmB,EAAgG,KAApFC,OAAOC,iBAAiBZ,GAAGa,iBAAiB,qBAAqBC,QAAQ,IAAK,IAGhGb,EAAU,KAMR,IAAIc,EAAcR,KAAKC,MAAQF,EAC/B,MAAMU,EAAK,KAET,IAAcC,OAAO,KACnBxB,EAAKH,WAGJO,GAAOA,EAAMY,IAElB,GAAGM,EAAcL,EAAU,CACzB,IAAIQ,EAAQC,KAAKC,IAAIV,EAAWK,EAAaL,EAAW,GACxDW,WAAW,IAAM5B,EAAK1B,UAAUC,IAAI,UAAWmD,KAAKC,IAAIF,EAAQR,EAAW,EAAG,IAE9EW,WAAWL,EAAIE,QAEfzB,EAAK1B,UAAUC,IAAI,UACnBqD,WAAWL,EAAIN,EAAW,GAGxB,sBACFC,OAAOW,oBAAoB,cAAerB,GAG5CA,EAAU,KACVsB,GAAkB,GAIpB7B,GAAYA,EAASe,GAenBE,OAAOa,sBAAsB,KAC3B,MAAMC,EAAOzB,EAAE0B,wBACfjC,EAAK1B,UAAUC,IAAI,oBAEnB,MAAM2D,EAASvB,EAAUqB,EAAKG,KACxBC,EAASxB,EAAUoB,EAAKK,IAGxBrE,EADS0D,KAAKY,KAAK,SAACZ,KAAKa,IAAIH,EAASJ,EAAKnD,OAAS,GAAKmD,EAAKnD,OAAS,EAAM,GAAI,SAAC6C,KAAKa,IAAIL,EAASF,EAAKpD,MAAQ,GAAKoD,EAAKpD,MAAQ,EAAM,IAIzI4D,EAAIN,EAASlE,EAAO,EACpByE,EAAIL,EAASpE,EAAO,EAI1BgC,EAAK0C,MAAM9D,MAAQoB,EAAK0C,MAAM7D,OAASb,EAAO,KAC9CgC,EAAK0C,MAAMP,KAAOK,EAAI,KACtBxC,EAAK0C,MAAML,IAAMI,EAAI,KAgBrBlC,EAAEoC,OAAO3C,MAQT4C,EAAoBC,GAAaA,EAAEC,SAAW9C,IAChD,CAAC,SAAU,KAAK+C,SAAUF,EAAEC,OAAuBE,UAChD,YAAgBH,EAAEC,OAAuB,cAAgBvC,GAIhE,IAAIuB,GAAkB,EACtB,GAAG,qBAAoB,CACrB,IAAImB,EAAW,KACbzC,GAAWA,KAGbR,EAAKd,iBAAiB,aAAe2D,IACnC,IAAI,UAAUK,SAASC,kBACrB,OAIF,GAAGN,EAAEO,QAAQC,OAAS,GAAKvB,GAAmBc,EAAiBC,GAC7D,OAIFf,GAAkB,EAElB,IAAI,QAACnB,EAAO,QAAEC,GAAWiC,EAAEO,QAAQ,GACnC1C,EAAWC,EAASC,GACpBZ,EAAKd,iBAAiB,WAAY+D,EAAU,CAACK,MAAM,IAEnDpC,OAAOhC,iBAAiB,YAAc2D,IACpCA,EAAEU,cAAe,EACjBV,EAAEW,kBACFP,IACAjD,EAAK6B,oBAAoB,WAAYoB,IACpC,CAACK,MAAM,KACT,CAACG,SAAS,SAEbzD,EAAKd,iBAAiB,YAAc2D,IAClC,IAAI,CAAC,EAAG,GAAGE,SAASF,EAAEa,QACpB,OAGF,IAAI,UAAUR,SAASC,kBACrB,OAIF,GAA2B,MAAxBnD,EAAK2D,QAAQ5D,QAAkB6C,EAAiBC,GACjD,OACK,GAAGf,EAER,YADAA,GAAkB,GAIpB,IAAI,QAACnB,EAAO,QAAEC,GAAWiC,EACzBnC,EAAWC,EAASC,GACpBM,OAAOhC,iBAAiB,UAAWsB,EAAS,CAAC8C,MAAM,EAAMG,SAAS,IAClEvC,OAAOhC,iBAAiB,cAAesB,EAAS,CAAC8C,MAAM,EAAMG,SAAS,KACrE,CAACA,SAAS,M,gCC7LjB,2IAyBA,IAAIG,EAoHJ,MAAMC,EAAO,IAAI,IAAK,iBAAiB,EAlHpB,KACjB,MAAMA,EAAO,IAAI,IAAU,CACzBC,UAAW,gBACXC,kBAAkB,EAClBC,aAAc,uBACdC,gBAAiB,4BAGbC,EAAU,YAAO,iCACjBC,EAAc,IAAI,UAAKC,YAAY,CAACC,IAAK,eAE/CH,EAAQvB,OAAOwB,EAAYG,SAE3B,MAAMvG,EAAqB,IAAI,IAAmB,CAChDwG,MAAO,gBACPC,KAAM,aAOR,IAAIC,EAJJb,EAAgB7F,EAAmB2G,MAEnCb,EAAKc,aAAahC,OAAO5E,EAAmBI,UAAW+F,GAIvD,IAiBIU,EAjBAC,EAAW,KAETJ,IACFA,EAAmBvD,OAAO4D,YAAYD,EAAU,MAGlC,IAAgBA,WAAW9F,KAAKgG,IAC9CH,EAAQG,EAELH,EAAMI,KACP,YAAejH,EAAmBwG,MAAO,YAAW,IAAkBU,cAAcL,EAAMI,QAE1FjH,EAAmBmH,cAOzB,MAAMC,EAAYtC,IAKhB,GAJGA,GACD,YAAYA,IAGVe,EAAcwB,MAAM/B,OAEtB,YADAO,EAActF,UAAUC,IAAI,SAI9B,MAAM8G,EAAS,YAAiB,CAACzB,EAAeM,IAAU,GAC1D,IAAIkB,EAAQxB,EAAcwB,MAE1BjB,EAAYmB,OAAO,CAACjB,IAAK,eACzB,MAAMkB,EAAY,YAAarB,GAE/B,IAAgBsB,MAAMJ,EAAOR,GAAO7F,KAAM0G,IAGxC,OAAOA,EAASC,GACd,IAAK,qBACHC,cAAclB,GACd,6BAAmB1F,KAAK6G,IACtBA,EAAEC,QAAQC,UAETC,GAAQA,EAAOlG,SAClB,MACF,QACEqE,EAAQ8B,gBAAgB,YACxB7B,EAAYmB,OAAO,CAACjB,IAAKoB,EAASC,IAClCH,EAAU1F,YAGboG,MAAOC,IACRb,IACAtH,EAAmB2G,MAAMpG,UAAUC,IAAI,SAEhC2H,EAAIC,KAGPhC,EAAYmB,OAAO,CAACjB,IAAK,0BACzBT,EAAcwC,SAIlBb,EAAU1F,SAEVgF,OAIJ,YAAiBX,EAASiB,GAE1BvB,EAAc1E,iBAAiB,YAAY,SAAe2D,GAIxD,GAHA3E,KAAKI,UAAUuB,OAAO,SACtBsE,EAAYmB,OAAO,CAACjB,IAAK,eAEZ,UAAVxB,EAAEwB,IACH,OAAOc,OAIX,MAAMnH,EAAO,IAAWqI,SAAW,IAAM,IACnCN,EAAS,IAAI,IAAehI,EAAoBC,GAEtD,OADA6F,EAAKyC,SAAS3D,OAAOoD,EAAO5H,WACrB+B,QAAQqG,IAAI,CACjBR,EAAOS,OACP3B,OAIuD,KAAM,KAE7DjB,EAAc6C,QAGhB,UAAgBC,YAAY,YAAa,CAAChB,EAAG,wBAGhC,a,gCCrJf,2JAUO,MAAMiB,EAA8D,qBAAqB,YAAc,QAEvG,SAASC,EAAiB5G,EAA4BC,EAAsD4G,EAA8B,IAC/I,MAAMtI,EAAMsI,EAAQC,eAAiBD,EAAQC,eAAevI,IAAIyB,GAAQA,EAAKd,iBAAiB6H,KAAK/G,GAGnG6G,EAAQG,gBAAiB,EA4BzBzI,EAAIoI,EAAkB1G,EAAU4G,GAG3B,SAASI,EAAiBjH,EAAmBC,EAAgD4G,GAIhG7G,EAAK6B,oBAAoB8E,EAAkB1G,EAAU4G,GAIlD,SAASK,EAAmBlH,GACjC,YAAcA,EAAM2G,K,gCCxDtB,oBA4Ce,IAnCA,CAAC7C,EAAmB+C,EAQ9B,MACH,MAAMnD,EAA4BtF,SAASC,cAAcwI,EAAQM,MAAQ,MAAQ,UAuBjF,OAtBAzD,EAAOI,UAAYA,GAAa+C,EAAQO,KAAO,UAAYP,EAAQO,KAAO,IAEtEP,EAAQQ,WACPR,EAAQS,cACT5D,EAAOpF,UAAUC,IAAI,aAGvB,iBAAOmF,IAGNmD,EAAQU,YACT7D,EAAOpF,UAAUC,IAAI,kBAGpBsI,EAAQW,UACT9D,EAAO+D,aAAa,WAAY,QAG/BZ,EAAQa,MACThE,EAAOf,OAAO,eAAKkE,EAAQa,OAGtBhE,I,gCCzCT,+SAgBO,SAASiE,EAAa3H,EAAe4H,GAAY,GACtD,MAAMC,EAAO,wMAKb,GAAGD,EAAW,CACZ,MAAME,EAAM1J,SAASC,cAAc,OAQnC,OAPAyJ,EAAIxJ,UAAUC,IAAI,aAClBuJ,EAAIC,UAAYF,EAEb7H,GACDA,EAAKgI,YAAYF,GAGZA,EAIT,OADA9H,EAAKiI,mBAAmB,YAAaJ,GAC9B7H,EAAKkI,iBAKP,SAASC,EAAgBnI,EAAyBoH,EAAO,SAK9D,OAJApH,EAAK1B,UAAUuB,OAAO,SAAWuH,GACjCpH,EAAKwH,UAAW,EAChBG,EAAa3H,GAEN,KACLA,EAAK+H,UAAY,GACjB/H,EAAK1B,UAAUC,IAAI,SAAW6I,GAC9BpH,EAAKgG,gBAAgB,aAVzB,IAAe2B,aAAeA,EAsB9B,IAAIS,EAAevF,IACjB,IAAIb,EAAOqG,EAAWpG,yBAClB,QAACtB,EAAO,QAAEC,GAAWiC,EAErByF,EAAQ3H,GAAWqB,EAAKuG,MAAQ5H,EAAUqB,EAAKuG,MAAQvG,EAAKG,KAAOxB,EACnE6H,EAAQ5H,GAAWoB,EAAKyG,OAAS7H,EAAUoB,EAAKyG,OAASzG,EAAKK,IAAMzB,GAErE0H,GAAS,KAAOE,GAAS,MAC1BE,KAMJ,MAAMC,EAAW9F,IAEf6F,KAWWA,EAAe,KACvBL,IACDA,EAAW/J,UAAUuB,OAAO,UAC5BwI,EAAWO,cAActK,UAAUuB,OAAO,aAEvCgJ,GAAaA,EAAYhJ,SAC5BwI,EAAa,KAEb,UAAUS,cAAc,uBAAuB,IAG9CC,IACDA,IACAA,EAAoB,MAGlB,uBACF7H,OAAOW,oBAAoB,YAAauG,GAExClH,OAAOW,oBAAoB,cAAe8G,IAG5CvK,SAASyD,oBAAoB,IAAkB8G,GAE3C,oBACF,IAAwBK,aAAa,SAIzC9H,OAAOhC,iBAAiB,SAAU,KAC7BmJ,GACDK,MAWJ,IAAIL,EAA0B,KAAMU,EAAgC,KAAMF,EAA2B,KAC9F,SAASI,EAAYC,EAA0BC,GACpDT,IAEI,oBACF,IAAwBU,SAAS,CAC/BjD,KAAM,OACNkD,MAAQC,IACNZ,OAKNL,EAAaa,EACbb,EAAW/J,UAAUC,IAAI,UACzB8J,EAAWO,cAActK,UAAUC,IAAI,aAEnCsK,IACFA,EAAczK,SAASC,cAAc,OACrCwK,EAAYvK,UAAUC,IAAI,oBAG1BsK,EAAY3J,iBAAiB,IAAmB2D,IAC9C,YAAYA,GACZ8F,OAIJN,EAAWO,cAAcW,aAAaV,EAAaR,GAInDU,EAAoBI,EAEhB,uBACFjI,OAAOhC,iBAAiB,YAAakJ,GAErClH,OAAOhC,iBAAiB,cAAeyJ,EAAS,CAACrF,MAAM,KAUzDlF,SAASc,iBAAiB,IAAkByJ,GAE5C,UAAUG,cAAc,uBAAuB,GAK1C,SAASU,GAAa,MAACC,EAAK,MAAEC,GAA4B1J,EAAmB2J,GAKlF,IAAKC,YAAaC,EAAWC,aAAcC,GAAc/J,EAEzD,MAAMgC,EAAO5D,SAAS4L,KAAK/H,wBACrBgI,EAAcjI,EAAKpD,MACnBsL,EAAelI,EAAKnD,OAE1B8K,EAAO,IAAWtD,SAAW,QAAU,OACvC,IAAI8D,EAAkD,MAEtD,MAiBMC,EAhBG,CACL5H,EAAG,CACDL,KAAMsH,EACNlB,MAAOkB,EAAQI,GAEjBQ,cAAwB,UAATV,EArBA,EAqBkCM,EAAcJ,EArBhD,EAuBfpH,EAAG,CACDJ,IAAKqH,EACLjB,OAAQiB,EAAQK,GAGlBO,cAAeZ,EAAQQ,EAAe,EA7BxB,EA6B0CA,EAAeH,EA7BzD,GAmCZQ,EACD,CACDpI,KAAMiI,EAAM5H,EAAEL,KAAO0H,EApCN,GAoCkCI,EACjD1B,MAAO6B,EAAM5H,EAAE+F,OArCA,GAkCbgC,EAKD,CACDlI,IAAK+H,EAAM3H,EAAEJ,IAAM0H,EAzCL,GAyCiCG,EAC/CzB,OAAQ2B,EAAM3H,EAAEgG,OA1CF,MAoDlB,CAUE,IAAItG,EAQJA,EAAOoI,EAAgBZ,GAAQS,EAAM5H,EAAEmH,IAASA,EAAO,SAAUS,EAAMC,eAEvErK,EAAK0C,MAAMP,KAAOA,EAAO,KAY3B,CACE,IAAIE,EAEJA,EAAMkI,EAAgBJ,GAAgBC,EAAM3H,EAAE0H,IAAiBA,EAAe,SAAUC,EAAME,eAE9FtK,EAAK0C,MAAML,IAAMA,EAAM,KAGzBrC,EAAK8D,UAAY9D,EAAK8D,UAAUzC,QAAQ,2CAA4C,IACpFrB,EAAK1B,UAAUC,KAEK,WAAjB4L,EAA4BA,EAAe,UAC5C,KACU,WAATR,EAAoBA,EAAiB,SAATA,EAAkB,QAAU,SAG7D,IAAIa,GAA4B,EAAOC,EAAmC,EACnE,SAASC,IACXD,GACDE,aAAaF,GAGfA,EAAmCvJ,OAAOU,WAAW,KACnD6I,EAAmC,EACnCD,GAA4B,GAC3B,KAEHA,GAA4B,EAGvB,SAASI,EAA0BtG,EAAsBrE,EAA2C6G,GACzG,MAAMvI,EAAMuI,EAAiBA,EAAevI,IAAI+F,GAAWA,EAAQpF,iBAAiB6H,KAAKzC,GACnFzE,EAASiH,EAAiBA,EAAe+D,aAAa9D,KAAKD,EAAgBxC,GAAWA,EAAQzC,oBAAoBkF,KAAKzC,GAE7H,GAAG,YAAY,qBAAoB,CACjC,IAAIwG,EAEJ,MAAMjE,EAAgC,CAACkE,SAAS,GAE1CC,EAAW,KACfL,aAAaG,GAEbjL,EAAO,YAAamL,EAAUnE,GAE9BhH,EAAO,WAAYmL,EAAUnE,GAE7BhH,EAAO,cAAemL,EAAUnE,IAGlCtI,EAAI,aAAesE,IACdA,EAAEO,QAAQC,OAAS,EACpB2H,KAIFzM,EAAI,YAAayM,EAAUnE,GAC3BtI,EAAI,WAAYyM,EAAUnE,GAC1BtI,EAAI,cAAeyM,EAAUnE,GAE7BiE,EAAU5J,OAAOU,WAAW,KACvB4I,EACDQ,KAIF/K,EAAS4C,EAAEO,QAAQ,IACnB4H,IAEG3C,GACD/D,EAAQpF,iBAAiB,WAAY,IAAa,CAACoE,MAAM,MAE1D,aASL/E,EAAI,cAAe,qBAAsBsE,IACvC5C,EAAS4C,GAENwF,GACD/D,EAAQpF,iBAAiB,WAAY,IAAa,CAACoE,MAAM,KAEzDrD,K,gCCzVO,SAASgL,EAAejL,EAAmBkL,GACxD,GAAoB,iBAAX,EAEP,YADAlL,EAAK+H,UAAYmD,GAKnB,MAAMC,EAAanL,EAAKmL,WACrBA,EACEnL,EAAKoL,YAAcD,EACpBA,EAAWE,YAAYH,IAEvBlL,EAAKsL,YAAc,GACnBtL,EAAK2C,OAAOuI,IAGdlL,EAAK2C,OAAOuI,GAtBhB,mC,kICeA,IAAIK,EAAO,KACTnN,SAASc,iBAAiB,QAAU2D,IAClC,IAAI,OAAA2I,EAAA,GAAgB3I,EAAEC,OAAQ,0BAC5B,OAMFD,EAAE4I,iBAEF,IAAI/D,GAAQ7E,EAAE6I,eAAiB7I,GAAG8I,cAAcC,QAAQ,cAEpDC,EAAW,IAAkBC,cAAcpE,GAE/CmE,EAAWA,EAASE,OAAOlJ,GAAa,uBAARA,EAAE6C,GAAsC,2BAAR7C,EAAE6C,GAElEgC,EAAO,IAAkBsE,aAAatE,EAAM,CAACmE,WAAUI,SAAS,EAAMC,eAAe,IASrFhL,OAAO9C,SAAS+N,YAAY,cAAc,EAAOzE,KAGnD6D,EAAO,MAoBT,IAAYa,GAAZ,SAAYA,GACV,yBACA,qBACA,qBAHF,CAAYA,MAAU,KAsRP,IAlQf,MAeE,YAAmBvF,EAA6B,IAA7B,KAAAA,UACjB3I,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,eAE7BL,KAAKmO,SAAWxF,EAAQwF,SACxBnO,KAAKoO,SAAWzF,EAAQyF,cAECC,IAAtB1F,EAAQ2F,gBAAoDD,IAAzB1F,EAAQ4F,eAC5C5F,EAAQ4F,aAAe/K,KAAKgL,IAAI,GAAIhL,KAAKiL,MAAM9F,EAAQ2F,UAAY,KAGrE,MAAM,YAACI,EAAW,UAAEJ,EAAS,aAAEC,EAAY,KAAEjI,EAAI,UAAEqI,GAAahG,EAEhE,IAEInC,EAyEAoI,EA3EAvI,EAAQsC,EAAQtC,OAASsC,EAAQkG,UAGrC,GAAIF,EA0CF3O,KAAKC,UAAU4J,UAAY,8BACNvD,EAAO,SAASA,KAAU,yBAAyBD,EAAQ,cAAgB,wCAGhGG,EAAQxG,KAAKC,UAAU6O,sBA9CV,CACVzB,GACDA,IAGFrN,KAAKC,UAAU4J,UAAY,+EAI3BrD,EAAQxG,KAAKC,UAAU6O,kBACvB,MAAMC,EAAW,IAAIC,iBAAiB,KAGjCJ,GACDA,MAKJpI,EAAMxF,iBAAiB,QAAS,KAC3B,OAAAiO,EAAA,GAAazI,KACdA,EAAMqD,UAAY,IAGjB7J,KAAKkP,YACNlP,KAAKkP,UAAUrF,UAAYrD,EAAMqD,UACjC7J,KAAKmP,iBAKTJ,EAASK,QAAQ5I,EAAO,CAAC6I,eAAe,EAAMC,WAAW,EAAMC,SAAS,IAErE5G,EAAQ6G,UACThJ,EAAMpG,UAAUC,IAAI,aAAc,gBAGlCL,KAAKkP,UAAYhP,SAASC,cAAc,OACxCH,KAAKkP,UAAU3F,aAAa,kBAAmB,QAC/CvJ,KAAKkP,UAAUtJ,UAAYY,EAAMZ,UAAY,2BAqBjD,GAVAY,EAAM+C,aAAa,MAAO,QAEvBmF,IACD,gBAAMlI,EAAOkI,OAAaL,EAAW,eAElCrO,KAAKkP,WACN,gBAAMlP,KAAKkP,UAAWR,OAAaL,EAAW,gBAI/ChI,GAASqI,EAAa,CACvB,MAAMe,EAASvP,SAASC,cAAc,OACtCsP,EAAOrP,UAAUC,IAAI,sBACrBL,KAAKC,UAAUwE,OAAOgL,GAUxB,GAPGpJ,IACDrG,KAAKqG,MAAQnG,SAASC,cAAc,SACpCH,KAAKgH,WACLhH,KAAKC,UAAUwE,OAAOzE,KAAKqG,QAI1BiI,EAAW,CACZ,MAAMoB,EAAU1P,KAAKC,UAAU+J,iBAC/B,IAAI2F,GAAgB,EAEpBf,EAAe,KACb,MAAMgB,EAAWpJ,EAAMpG,UAAUmC,SAAS,SAEpCsN,EAAclB,EAAanI,EAA2BU,MAAM/B,OAAS,IAAI,OAAA2K,EAAA,GAAatJ,GAAO,GAAOU,OAAO/B,OAC3G4K,EAAOzB,EAAYuB,EACnBG,EAAUD,EAAO,EACvBvJ,EAAMpG,UAAU+G,OAAO,QAAS6I,GAI7BA,GAAWD,GAAQxB,GACpBvO,KAAKgH,WACL0I,EAAQjL,OAAO,KAAK6J,EAAYuB,MAC5BF,IAAeA,GAAgB,KAC1BC,IAAaI,GAAYL,KAClC3P,KAAKgH,WACL2I,GAAgB,IAIpBnJ,EAAMxF,iBAAiB,QAAS4N,GAGlC5O,KAAKwG,MAAQA,EAGR,SACDxG,KAAKkH,QAINlH,KAAK2I,QAAQgG,UACb3O,KAAKwG,MAA2B0B,SC/NxB,SAA+B+H,GAC5C,MAAMC,EAAQhQ,SAASiQ,cACvBD,EAAME,mBAAmBH,GACzB,MAAMI,EAAMrN,OAAOsN,eACnBD,EAAIE,kBACJF,EAAIG,SAASN,GD4NTO,CAAsBzQ,KAAKwG,QAIxB,WACLxG,KAAKqG,MAAM+G,YAAc,GACtBpN,KAAK2I,QAAQkG,UACd7O,KAAKqG,MAAMwD,UAAY7J,KAAK2I,QAAQkG,UAEpC7O,KAAKqG,MAAM5B,OAAO,eAAKzE,KAAK2I,QAAQtC,MAAOrG,KAAK2I,QAAQ+H,eAIrD,YAAYC,GAAY,GAC7B,MAAO/E,aAAcgF,GAAiC5Q,KAAKkP,UAMrD2B,GAAiB7Q,KAAKwG,MAAMhC,MAAM7D,OAAOwC,QAAQ,KAAM,IAC7D,GAAG0N,IAAkBD,EACnB,OAGF,MACME,EAAqBtN,KAAKiL,MADG,GAEJjL,KAAKuN,IAAIvN,KAAKa,IAAIuM,EAAYC,KAI7D7Q,KAAKwG,MAAMhC,MAAMsM,mBAAwBA,EAAH,KAEnCH,IACD3Q,KAAKwG,MAAMhC,MAAM7D,OAASiQ,EAAYA,EAAY,KAAO,IAI3D,YAAc5Q,KAAKwG,MADD,sBACmB,EAAMsK,EAAoB,KAC7D9Q,KAAKwG,MAAMpG,UAAUuB,OAFL,wBAMpB,YACE,OAAO3B,KAAK2I,QAAQgG,UAAa3O,KAAKwG,MAA2BU,MAAQ,OAAA4I,EAAA,GAAa9P,KAAKwG,OAAO,GAAOU,MAI3G,UAAUA,GACRlH,KAAKgR,iBAAiB9J,GAAO,GAE7B,YAAclH,KAAKwG,MAAO,SAGrB,iBAAiBU,EAAe+J,GAAgB,GAClDjR,KAAK2I,QAAQgG,UACb3O,KAAKwG,MAA2BU,MAAQA,GAEzClH,KAAKwG,MAAMqD,UAAY3C,EAEpBlH,KAAKkP,YACNlP,KAAKkP,UAAUrF,UAAY3C,EAExB+J,GACDjR,KAAKmP,gBAMN,YACL,OAAOnP,KAAKkH,QAAUlH,KAAKkR,cAGtB,UACL,OAAQlR,KAAKwG,MAAMpG,UAAUmC,SAAS,YAClCvC,KAAKoO,UAAYpO,KAAKoO,eACtBpO,KAAKmO,WAAa,OAAAc,EAAA,GAAajP,KAAKwG,QAGnC,kBACL,OAAOxG,KAAKmR,WAAanR,KAAKoR,YAGzB,cAAclK,EAAQ,GAAImK,GAAS,GACpCrR,KAAK2I,QAAQgG,YACfzH,EAAQ,IAAkBoK,cAAcpK,IAGvCmK,EACDrR,KAAKgR,iBAAiB9J,GAAO,GAE7BlH,KAAKkH,MAAQA,EAIV,iBAAiBA,EAAqC,GAAImK,GAAS,GACxErR,KAAKkR,cAAgBhK,EACrBlH,KAAKuR,cAAcrK,EAAOmK,GAGrB,SAAS3K,EAAmBL,GAC9BA,IACDrG,KAAKqG,MAAM+G,YAAc,GACzBpN,KAAKqG,MAAM5B,OAAO,eAAK4B,EAAOrG,KAAK2I,QAAQ+H,gBAG7C1Q,KAAKwG,MAAMpG,UAAU+G,OAAO,WAAYT,EAAQwH,EAAWsD,QAC3DxR,KAAKwG,MAAMpG,UAAU+G,OAAO,WAAYT,EAAQwH,EAAWuD,QAGtD,SAASpL,GACdrG,KAAK0R,SAASxD,EAAWsD,MAAOnL,M,gCElVpC,yDA8MA,MAAMsL,EAA0B,IAtLzB,MASL,cARQ,KAAAC,YAAqC,GACrC,KAAAC,GAAKjP,KAAKC,MACV,KAAAiP,QAAS,EACT,KAAAf,IAAM,YAAO,MACb,KAAAgB,OAAQ,EACR,KAAAC,YAAchP,OAAOiP,SAASC,KAIpC,IAAIC,GAAkB,EAqCtB,GApCAnP,OAAOhC,iBAAiB,WAAa2D,IAGnC,GAFA3E,KAAK+R,OAAS/R,KAAK+Q,IAAI,WAAYpM,EAAGwN,GAEnCnP,OAAOiP,SAASC,OAASlS,KAAKgS,YAG/B,OAFAhS,KAAKoS,cAAgBpS,KAAKoS,oBAC1BpS,KAAKqS,eAGPrS,KAAKgS,YAAchP,OAAOiP,SAASC,KAGnC,GADmBvN,EAAE+B,QACX1G,KAAK6R,GAEb,YADA7R,KAAKsS,YAIP,MAAMC,EAAOvS,KAAK4R,YAAYY,MAC1BD,GAKJvS,KAAK8R,QAAUK,EACfnS,KAAKyS,WAAWF,IALdvS,KAAKsS,cASTtP,OAAOhC,iBAAiB,UAAY2D,IAClC,MAAM4N,EAAOvS,KAAK4R,YAAY5R,KAAK4R,YAAYzM,OAAS,GACpDoN,IACS,WAAV5N,EAAEwB,KAAqBoM,EAAKG,WAAWH,EAAKG,aAC7C,YAAY/N,GACZ3E,KAAK2S,KAAKJ,EAAKtK,SAEhB,CAAC4E,SAAS,EAAMtH,SAAS,IAEzB,mBAAkB,CACnB,MAAMoD,EAAU,CAACpD,SAAS,GAC1BvC,OAAOhC,iBAAiB,aAAe2D,IAClCA,EAAEO,QAAQC,OAAS,IACtBnF,KAAK+R,OAAS/R,KAAK+Q,IAAI,cAEpB,YAAoBpM,KACrBwN,GAAkB,EAElBnP,OAAOhC,iBAAiB,WAAY,KAClC0C,WAAW,KACTyO,GAAkB,GACjB,MACF,CAAC5M,SAAS,EAAMH,MAAM,OAoC1BuD,GAGLiK,QAAQC,kBAAoB,SAE5B7S,KAAKsS,YAGC,WAAWC,GACjB,MAAMO,EAAOP,EAAKpH,QAAOnL,KAAK8R,aAAiBzD,GAC/CrO,KAAK+R,OAAS/R,KAAK+Q,IAAI,wBAAyBwB,EAAMvS,KAAK4R,cAC/C,IAATkB,EACD9S,KAAKkL,SAASqH,GACLA,EAAKQ,aACd,cAGF/S,KAAK8R,QAAS,EAGT,eAAe7J,GACpB,IAAI,IAAI+K,EAAIhT,KAAK4R,YAAYzM,OAAS,EAAG6N,GAAK,IAAKA,EAAG,CACpD,MAAMT,EAAOvS,KAAK4R,YAAYoB,GAC9B,GAAGT,EAAKtK,OAASA,EACf,MAAO,CAACsK,OAAMU,MAAOD,IAKpB,KAAK/K,GACV,GAAGA,EAAM,CACP,MAAMiL,EAAMlT,KAAKmT,eAAelL,GAChC,GAAGiL,EAED,YADAlT,KAAKoT,WAAWF,EAAIX,KAAMW,EAAID,OAKlCL,QAAQD,OAGH,WAAWJ,EAAsBU,EAAQjT,KAAK4R,YAAYyB,QAAQd,IACvEvS,KAAK8R,QAAS,EAGZ9R,KAAK4R,YAAY0B,OAAOL,EAAO,GAC/BjT,KAAKyS,WAAWF,GAIb,SAASA,GACdvS,KAAK4R,YAAY2B,KAAKhB,GACtBvS,KAAK+R,OAAS/R,KAAK+Q,IAAI,YAAawB,EAAMvS,KAAK4R,aAE3CW,EAAKiB,WACPxT,KAAKsS,YAID,YACNtS,KAAK8R,QAAS,EACdc,QAAQN,UAAUtS,KAAK6R,GAAI,IAGtB,eACLe,QAAQP,aAAarS,KAAK6R,GAAI,GAAII,SAASwB,OAASxB,SAASyB,UAGxD,WAAWnB,GAChB,YAAiBvS,KAAK4R,YAAaW,GAG9B,aAAatK,EAA8B0L,GAAS,GACzD,IAAI,IAAIX,EAAIhT,KAAK4R,YAAYzM,OAAS,EAAG6N,GAAK,IAAKA,EAAG,CAEpD,GADahT,KAAK4R,YAAYoB,GACtB/K,OAASA,IACfjI,KAAK4R,YAAY0B,OAAON,EAAG,GAExBW,GACD,SAQV,IAAehC,wBAA0BA,EAC1B,O,gCChNA,SAASiC,EAAc9R,EAAmBwE,GACvD,MAAMuN,EAAQ,IAAIC,MAAMxN,EAAM,CAACyN,SAAS,EAAMC,YAAY,IAC1DlS,EAAK8I,cAAciJ,GAFrB,mC,gCCAA,YAQA,MAAMI,EAAgB,CACpB7N,EACAR,EACAsO,EACAnR,EACAoR,EACAC,KAEA,MAAM,QAACxH,EAAO,IAAEyH,GAAOjO,EAAQX,QAgB/B,QAfe4I,IAAZzB,GACDH,cAAcG,QAGLyB,IAARgG,IACDrR,OAAOsR,sBAAsBD,GACzBD,UACKhO,EAAQX,QAAQ4O,KAQxBD,GAAW,UAAUpP,SAASC,mBAAqBlC,EAMpD,YALAqD,EAAQX,QAAQ4O,IAAM,GAAKrR,OAAOa,sBAAsB,YAC/CuC,EAAQX,QAAQ4O,IACvBJ,EAAc7N,EAASR,EAAWsO,EAAUnR,EAAUoR,EAAiBC,EAAU,MAMlFF,GAAYtO,GACbQ,EAAQhG,UAAUC,IAAIuF,GAGxB,MAAM2O,EAAe,YACZnO,EAAQX,QAAQmH,SACnBsH,GAAYtO,GACdQ,EAAQhG,UAAUuB,OAAO,YAAaiE,GAGxCQ,EAAQhG,UAAUuB,OAAO,aAEzBwS,GAAmBA,KAGrB,IAAI,UAAUnP,SAASC,oBAAsBlC,EAG3C,OAFAqD,EAAQhG,UAAUuB,OAAO,YAAa,kBACtC4S,IAIFnO,EAAQhG,UAAUC,IAAI,aAEtB+F,EAAQhG,UAAU+G,OAAO,aAAc+M,GACvC9N,EAAQX,QAAQmH,QAAU,GAAKlJ,WAAW6Q,EAAcxR,IAG3C,O,gCC9DA,SAASyR,EAAiBC,EAAyBC,GAOhE,OANGA,EACDD,EAASE,QAAQ1E,GAAMA,EAAG1G,aAAa,WAAY,SAEnDkL,EAASE,QAAQ1E,GAAMA,EAAGnI,gBAAgB,aAGrC,IAAM0M,EAAiBC,GAAWC,GAb3C,mC,gCCAA,oCAuEA,MAAME,EAAgB,IA5DtB,oBACU,KAAAC,SAGH,GACG,KAAAR,IAAM,IAAQxL,KAAK,MACnB,KAAAiM,WAAY,EAEZ,GAAGC,EAAuChT,GAChD,IAAIiT,EAAUhV,KAAK6U,SAASE,GAU5B,OATIC,IACFhV,KAAKiV,gBACLD,EAAUhV,KAAK6U,SAASE,GAAQ,oBAGlB1G,IAAbtM,GACDiT,EAAQnU,KAAK,IAAMkB,KAGdiT,EAGF,QAAQjT,GACb,OAAO/B,KAAKkV,GAAG,OAAQnT,GAGlB,OAAOA,GACZ,OAAO/B,KAAKkV,GAAG,QAASnT,GAQnB,cAAcqE,EAAsBrE,GACzC,MAAMiT,EAAU,YAAQ5O,GAAWpG,KAAKsD,SAAWtB,QAAQC,UAM3D,YAJgBoM,IAAbtM,GACDiT,EAAQnU,KAAK,IAAMkB,KAGdiT,EAGD,gBACFhV,KAAK8U,YACP9U,KAAK8U,WAAY,EAEjB9U,KAAKqU,IAAI,KACPrU,KAAK6U,SAASM,MAAQnV,KAAK6U,SAASM,KAAKlT,UACzCjC,KAAK6U,SAASO,OAASpV,KAAK6U,SAASO,MAAMnT,UAE3CjC,KAAK8U,WAAY,EACjB9U,KAAK6U,SAAW,QAOxB,MAAmB,IAAeD,cAAgBA,GACnC,O,gCCzEf,8DAgBe,SAAS9E,EAAauF,EAAoBC,GAAe,GACtE,MAAMC,EAAkB,GAClBC,EAAiB,GAEjB7H,EAA4B2H,EAAe,QAAKjH,EACtD,YAAoBgH,EAAOE,EAAOC,OAAMnH,OAAWA,EAAWV,GAC3D6H,EAAKrQ,QACNoQ,EAAMhC,KAAKiC,EAAKC,KAAK,KAGvB,IAAIvO,EAAQqO,EAAME,KAAK,MASvB,OARAvO,EAAQA,EAAM/D,QAAQ,UAAW,KAE9BwK,GACD,IAAkB+H,oBAAoB/H,GAKjC,CAACzG,QAAOyG,YAGjB,IAAemC,aAAeA,G,gCCtC9B,6CAQe,SAAS6F,EAAoBhR,GAC1C,OAAO,oBAAoBA,aAAaiR,YAAcjR,EAAEO,QAAQ,GAAGzC,QAAU,K,gCCT/E,oBAgHA,MAAMoT,EAAkB,IAjGjB,MACE,WACL,OAAO,IAAWC,UAAU,uBAAuBjV,KAAMkV,GAChDA,GAIJ,eAAe/Q,EAKlB,IAIF,OAAOhF,KAAK2G,WAAW9F,KAAK6F,IAC1B,IAAIsP,EACAC,EACJ,MAAMC,EAAwC,CAC5CC,SAAU,KACVC,aAAc,CACZ5O,EAAG,gCACHV,KAAM9B,EAAS8B,KACfuP,MAAOrR,EAASqR,QAKlBL,EADChR,EAASsR,gBACW,IAAWC,aAAa,aAAcvR,EAASsR,gBAAiB5P,GAAO,GAEvE1E,QAAQC,QAAQ,CACnCuF,EAAG,4BAKP,MAAMgP,EAAU9P,EAAM+P,SAChBC,EAAQ,IAAIC,WAAWH,EAAQE,MAAMvR,OAAS,IAWpD,OAVAuR,EAAME,YACNF,EAAMG,IAAIL,EAAQE,MAAO,GACzBF,EAAQE,MAAQA,EAGdT,EADCjR,EAAS8R,YACO,IAAWP,aAAa,aAAcvR,EAAS8R,YAAapQ,GAAO,GAEnE1E,QAAQC,QAAQ,IAAI0U,YAGhC3U,QAAQqG,IAAI,CAAC2N,EAAoBC,IAAiBpV,KAAMkW,IAC7Db,EAAOC,SAAWY,EAAO,GACzBb,EAAOE,aAAaK,SAAWD,EAC/BN,EAAOE,aAAaY,kBAAoBD,EAAO,GAExC,IAAWjB,UAAU,iCAAkCI,OAK7D,MAAMC,EAAkBzP,EAAwBiC,EAAe,IACpE,OAAO,IAAW4N,aAAa,aAAcJ,EAAUzP,GAAO,GAAO7F,KAAMoW,GAElE,IAAWnB,UAAU,qBAAsB,CAChDK,SAAUc,GACTtO,GAAS9H,KAAKqW,IACD,uBAAXA,EAAK1P,GACN,IAAW2P,QAAQD,EAAKE,MAGnBF,KAKN,qBAAqBG,GAC1B,OAAO,IAAWvB,UAAU,+BAAgC,CAACuB,SAGxD,sBACL,OAAO,IAAWvB,UAAU,+BAGvB,sBACL,OAAO,IAAWA,UAAU,iCAehC,IAAeD,gBAAkBA,EAClB,O,gCC5GA,SAASvI,EAAgB2C,EAASqH,GAC/C,OAAOrH,EAAGsH,QAAQ,IAAID,MAPxB,mC,gCCAA,oEAkBO,MAAME,EAAsD,CACjEC,KAAM,CACJC,MAAO,4BACPC,WAAY,qBAEdC,UAAW,CACTF,MAAO,0BACPC,WAAY,0BAEdE,OAAQ,CACNH,MAAO,uBACPC,WAAY,uBAEdG,UAAW,CACTJ,MAAO,gDACPC,WAAY,oBAEdI,cAAe,CACbL,MAAO,kCACPC,WAAY,uBAEdK,KAAM,CACJN,MAAO,iBACPC,WAAY,wBAEdM,YAAa,CACXP,MAAO,WACPC,WAAY,6BAID,SAASO,EAAoBlL,EAAmBuI,EAAiBC,EAAgB2C,EAAgBC,EAAoBzK,EAA4B0K,EAAS,CAACA,OAAQ,IAChL,GAAqB,IAAlBrL,EAAKsL,SAAgB,CACtB,MAAMC,EAAYvL,EAAKuL,UAQvB,GANGJ,IAAYnL,EACbwI,EAAKjC,KAAKgF,EAAUC,OAAO,EAAGJ,GAAa,IAASG,EAAUC,OAAOJ,IAErE5C,EAAKjC,KAAKgF,GAGT5K,GAAY4K,EAAUE,QACpBzL,EAAK0L,WAAY,CAClB,MAAMhO,EAAgBsC,EAAKtC,cAE3B,IAAI,MAAMzC,KAAQuP,EAAc,CAC9B,MAAMmB,EAAMnB,EAAavP,GACnBsP,EAAU7M,EAAc6M,QAAQoB,EAAIjB,MAAQ,uBAC/CH,GAAuD,OAA5CA,EAAQqB,aAAa,qBACX,yBAAnBD,EAAIhB,WACLhK,EAAS4F,KAAK,CACZ/L,EAAGmR,EAAIhB,WACPkB,IAAMnO,EAAoCoO,KAC1CT,OAAQA,EAAOA,OACflT,OAAQoT,EAAUpT,SAEO,6BAAnBwT,EAAIhB,WACZhK,EAAS4F,KAAK,CACZ/L,EAAGmR,EAAIhB,WACPU,OAAQA,EAAOA,OACflT,OAAQoT,EAAUpT,OAClB4T,QAASrO,EAAcjF,QAAQuT,OAAOC,aAGxCtL,EAAS4F,KAAK,CACZ/L,EAAGmR,EAAIhB,WACPU,OAAQA,EAAOA,OACflT,OAAQoT,EAAUpT,WAU9B,YAFAkT,EAAOA,QAAUE,EAAUpT,QAK7B,GAAqB,IAAlB6H,EAAKsL,SACN,OAGF,MAAMY,EAAcf,IAAYnL,EAC1BmM,EAA2B,QAAjBnM,EAAKlI,SAAsC,MAAjBkI,EAAKlI,QAC/C,GAAGqU,GAAW3D,EAAKrQ,QAA2B,OAAjB6H,EAAKlI,QAChCyQ,EAAMhC,KAAKiC,EAAKC,KAAK,KACrBD,EAAKlC,OAAO,EAAGkC,EAAKrQ,aACf,GAAG6H,aAAgBoM,iBAAkB,CAC1C,MAAMC,EAAMrM,EAAKqM,IACdA,IACD7D,EAAKjC,KAAK8F,GACVhB,EAAOA,QAAUgB,EAAIlU,QAItB+T,IAAed,GAChB5C,EAAKjC,KAAK,KAGZ,IAAI+F,EAAWtM,EAAKC,WACpB,KAAMqM,GACJpB,EAAoBoB,EAAU/D,EAAOC,EAAM2C,EAASC,EAAWzK,EAAU0K,GACzEiB,EAAWA,EAASC,YAGnBL,GAAcd,GACf5C,EAAKjC,KAAK,KAGT4F,GAAW3D,EAAKrQ,SACjBoQ,EAAMhC,KAAKiC,EAAKC,KAAK,KACrBD,EAAKlC,OAAO,EAAGkC,EAAKrQ,W,gCCnIxB,8CAQe,SAAS8J,EAAa7I,GACnC,OAAGA,EAAQoT,aAAa,oBAA0C,UAApBpT,EAAQtB,SAI5C,YAAasB,GAAS,GAAOc,MAAMuR,QAElCrS,EAA6Bc,MAAMuR,S,gCCfhD,8CAQe,MAAMgB,EAQnB,YAAY9Q,GAMV3I,KAAKoG,QAAUlG,SAAS4L,KAAK1J,cAAc,IAAMuG,EAAQ/C,WAIzD5F,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAU2F,UAAY,yBAE3B5F,KAAKoI,SAAWlI,SAASC,cAAc,OACvCH,KAAKoI,SAASxC,UAAY,aAE1B5F,KAAK0Z,MAAQxZ,SAASC,cAAc,MACjCwI,EAAQ7C,cACT9F,KAAK0Z,MAAMjV,OAAO,eAAKkE,EAAQ7C,eAGjC9F,KAAK2Z,SAAWzZ,SAASC,cAAc,KACvCH,KAAK2Z,SAAS/T,UAAY,WACvB+C,EAAQ5C,iBACT/F,KAAK2Z,SAASlV,OAAO,eAAKkE,EAAQ5C,kBAGpC/F,KAAKC,UAAUwE,OAAOzE,KAAKoI,SAAUpI,KAAK0Z,MAAO1Z,KAAK2Z,UAEnDhR,EAAQ9C,mBACT7F,KAAKyG,aAAevG,SAASC,cAAc,OAC3CH,KAAKyG,aAAab,UAAY,gBAC9B5F,KAAKC,UAAUwE,OAAOzE,KAAKyG,eAG7BzG,KAAKoG,QAAQ3B,OAAOzE,KAAKC,c,gCCnD7B,qDASe,MAAM2Z,UAA2B,IAK9C,YAAYjR,EAA6B,IACvCkR,MAAM,OAAD,QACHlL,WAAW,GACRhG,IAPA,KAAArH,iBAAkB,EAsClB,KAAAwY,kBAAqBnV,IAC1B,YAAYA,GACZ3E,KAAKsB,iBAAmBtB,KAAKsB,gBAE7BtB,KAAK+Z,cAAc3Z,UAAU+G,OAAO,aAAcnH,KAAKsB,iBACtDtB,KAAKwG,MAA2ByB,KAAOjI,KAAKsB,gBAAkB,OAAS,WACxEtB,KAAKqB,6BAA+BrB,KAAKqB,+BAlCzC,MAAMmF,EAAQxG,KAAKwG,MACnBA,EAAMyB,KAAO,WACbzB,EAAM+C,aAAa,WAAY,IAC/B/C,EAAMwT,aAAe,MAQrB,MAAMC,EAAW/Z,SAASC,cAAc,SACxC8Z,EAAS7Z,UAAUC,IAAI,YACvB4Z,EAASC,UAAY,EACrBD,EAAShS,KAAO,WAChBzB,EAAMkE,cAAcvI,QAAQ8X,GAC5BzT,EAAMkE,cAAcW,aAAa4O,EAASE,YAAa3T,EAAM+S,aAE7D,MAAMQ,EAAgB/Z,KAAK+Z,cAAgB7Z,SAASC,cAAc,QAClE4Z,EAAc3Z,UAAUC,IAAI,iBAAkB,SAE9CL,KAAKC,UAAUG,UAAUC,IAAI,wBAC7BL,KAAKC,UAAUwE,OAAOsV,GAEtBA,EAAc/Y,iBAAiB,QAAShB,KAAK8Z,mBAC7CC,EAAc/Y,iBAAiB,WAAYhB,KAAK8Z,sB,gCCvCrC,SAASM,EAAWzQ,GACjC,MAAM0Q,EAAOna,SAASC,cAAc,QAEpC,OADAka,EAAKxQ,UAAYF,EACV0Q,EATT","file":"11.0091c78c69fac393d4c2.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.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 elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.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(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nconst Button = (className: string, options: 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 const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n //console.log('document paste');\r\n\r\n //console.log('messageInput paste');\r\n\r\n e.preventDefault();\r\n // @ts-ignore\r\n let text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n\r\n let entities = RichTextProcessor.parseEntities(text);\r\n //console.log('messageInput paste', text, entities);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n //text = RichTextProcessor.wrapEmojiText(text);\r\n text = RichTextProcessor.wrapRichText(text, {entities, noLinks: true, wrappingDraft: true});\r\n\r\n // console.log('messageInput paste after', text);\r\n\r\n // @ts-ignore\r\n //let html = (e.originalEvent || e).clipboardData.getData('text/html');\r\n\r\n // @ts-ignore\r\n //console.log('paste text', text, );\r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: true,\r\n required?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\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' | 'global-search' | 'voice',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n 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","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean) {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } 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 promise = isInDOM(element) ? this.mutate() : Promise.resolve();\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 private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\n * 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 type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityPre' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName';\r\n};\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"font-weight\"], b',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike',\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};\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n const nodeValue = node.nodeValue;\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.trim()) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest && closest.getAttribute('contenteditable') === null) {\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (parentElement as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: parentElement.dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = (selNode === node);\r\n const isBlock = node.tagName === 'DIV' || node.tagName === 'P';\r\n if(isBlock && line.length || node.tagName === 'BR') {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n 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(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { 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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n /* input.readOnly = true;\r\n\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true}); */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/11.4cedf32c13708a0f972d.chunk.js b/public/11.4cedf32c13708a0f972d.chunk.js deleted file mode 100644 index 605a8910c..000000000 --- a/public/11.4cedf32c13708a0f972d.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[11,15,19],{101:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(51);class s{constructor(t,e){this.passwordInputField=t,this.size=e,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=n.b.loadAnimationFromURL({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"assets/img/TwoFactorSetupMonkeyPeek.tgs").then(t=>(this.animation=t,this.animation.addEventListener("enterFrame",t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},n.b.waitForFirstFrame(t)))}remove(){this.animation&&this.animation.remove()}}},18:function(t,e,i){"use strict";i.r(e),i.d(e,"ripple",(function(){return l}));var n=i(6),s=i(58),a=i(1),o=i(15);let r=0;function l(t,e=(()=>Promise.resolve()),i=null,l=!1){if(t.querySelector(".c-ripple"))return;t.classList.add("rp");let c=document.createElement("div");c.classList.add("c-ripple");let u;t.classList.contains("rp-square")&&c.classList.add("is-square"),t[l?"prepend":"append"](c);const d=(t,n)=>{const o=Date.now(),l=document.createElement("div"),d=r++,h=1e3*+window.getComputedStyle(c).getPropertyValue("--ripple-duration").replace("s","");u=()=>{let t=Date.now()-o;const e=()=>{s.a.mutate(()=>{l.remove()}),i&&i(d)};if(tl.classList.add("hiding"),Math.max(i-h/2,0)),setTimeout(e,i)}else l.classList.add("hiding"),setTimeout(e,h/2);a.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",u),u=null,p=!1},e&&e(d),window.requestAnimationFrame(()=>{const e=c.getBoundingClientRect();l.classList.add("c-ripple__circle");const i=t-e.left,s=n-e.top,a=Math.sqrt(Math.pow(Math.abs(s-e.height/2)+e.height/2,2)+Math.pow(Math.abs(i-e.width/2)+e.width/2,2)),o=i-a/2,r=s-a/2;l.style.width=l.style.height=a+"px",l.style.left=o+"px",l.style.top=r+"px",c.append(l)})},h=e=>e.target!==t&&(["BUTTON","A"].includes(e.target.tagName)||Object(n.a)(e.target,"c-ripple")!==c);let p=!1;if(a.IS_TOUCH_SUPPORTED){let e=()=>{u&&u()};t.addEventListener("touchstart",i=>{if(!o.default.settings.animationsEnabled)return;if(i.touches.length>1||p||h(i))return;p=!0;let{clientX:n,clientY:s}=i.touches[0];d(n,s),t.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",i=>{i.cancelBubble=!0,i.stopPropagation(),e(),t.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else t.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===t.dataset.ripple||h(e))return;if(p)return void(p=!1);let{clientX:i,clientY:n}=e;d(i,n),window.addEventListener("mouseup",u,{once:!0,passive:!0}),window.addEventListener("contextmenu",u,{once:!0,passive:!0})},{passive:!0})}},21:function(t,e,i){"use strict";i.r(e);var n=i(35),s=i(37),a=i(17),o=i(78),r=i(62),l=i(33),c=i(93),u=i(101),d=i(31),h=i(16),p=i(89),m=i(5),g=i(30),v=i(94),f=i(36),b=i(59);let w;const L=new r.a("page-password",!0,()=>{const t=new p.a({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=Object(l.a)("btn-primary btn-color-primary"),a=new h.default.IntlElement({key:"Login.Next"});e.append(a.element);const r=new c.a({label:"LoginPassword",name:"password"});let L;w=r.input,t.inputWrapper.append(r.container,e);let E,y=()=>(L||(L=window.setInterval(y,1e4)),o.a.getState().then(t=>{E=t,E.hint?Object(f.a)(r.label,Object(v.a)(d.b.wrapEmojiText(E.hint))):r.setLabel()}));const T=t=>{if(t&&Object(m.a)(t),!w.value.length)return void w.classList.add("error");const s=Object(b.a)([w,e],!0);let l=w.value;a.update({key:"PleaseWait"});const c=Object(n.f)(e);o.a.check(l,E).then(t=>{switch(t._){case"auth.authorization":clearInterval(L),i.e(4).then(i.bind(null,19)).then(t=>{t.default.mount()}),k&&k.remove();break;default:e.removeAttribute("disabled"),a.update({key:t._}),c.remove()}}).catch(t=>{s(),r.input.classList.add("error"),t.type,a.update({key:"PASSWORD_HASH_INVALID"}),w.select(),c.remove(),y()})};Object(g.b)(e,T),w.addEventListener("keypress",(function(t){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===t.key)return T()}));const S=s.b.isMobile?100:166,k=new u.a(r,S);return t.imageDiv.append(k.container),Promise.all([k.load(),y()])},null,()=>{w.focus(),a.default.pushToState("authState",{_:"authStatePassword"})});e.default=L},30:function(t,e,i){"use strict";i.d(e,"a",(function(){return a})),i.d(e,"b",(function(){return o})),i.d(e,"c",(function(){return r})),i.d(e,"d",(function(){return l}));var n=i(1),s=i(52);const a=n.IS_TOUCH_SUPPORTED?"mousedown":"click";function o(t,e,i={}){const n=i.listenerSetter?i.listenerSetter.add(t):t.addEventListener.bind(t);i.touchMouseDown=!0,n(a,e,i)}function r(t,e,i){t.removeEventListener(a,e,i)}function l(t){Object(s.a)(t,a)}},33:function(t,e,i){"use strict";var n=i(16),s=i(18);e.a=(t,e={})=>{const i=document.createElement(e.asDiv?"div":"button");return i.className=t+(e.icon?" tgico-"+e.icon:""),e.noRipple||(e.rippleSquare&&i.classList.add("rp-square"),Object(s.ripple)(i)),e.onlyMobile&&i.classList.add("only-handhelds"),e.disabled&&i.setAttribute("disabled","true"),e.text&&i.append(Object(n.i18n)(e.text)),i}},35:function(t,e,i){"use strict";i.d(e,"f",(function(){return d})),i.d(e,"g",(function(){return h})),i.d(e,"c",(function(){return g})),i.d(e,"d",(function(){return w})),i.d(e,"e",(function(){return L})),i.d(e,"b",(function(){return T})),i.d(e,"a",(function(){return S}));var n=i(29),s=i(5),a=i(30),o=i(37),r=i(1),l=i(0),c=i(15),u=i(48);function d(t,e=!1){const i='\n \n \n ';if(e){const e=document.createElement("div");return e.classList.add("preloader"),e.innerHTML=i,t&&t.appendChild(e),e}return t.insertAdjacentHTML("beforeend",i),t.lastElementChild}function h(t,e="check"){return t.classList.remove("tgico-"+e),t.disabled=!0,d(t),()=>{t.innerHTML="",t.classList.add("tgico-"+e),t.removeAttribute("disabled")}}n.a.putPreloader=d;let p=t=>{let e=v.getBoundingClientRect(),{clientX:i,clientY:n}=t,s=i>=e.right?i-e.right:e.left-i,a=n>=e.bottom?n-e.bottom:e.top-n;(s>=100||a>=100)&&g()};const m=t=>{g()},g=()=>{v&&(v.classList.remove("active"),v.parentElement.classList.remove("menu-open"),b&&b.remove(),v=null,c.default.dispatchEvent("context_menu_toggle",!1)),f&&(f(),f=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(a.a,m),l.IS_MOBILE_SAFARI||u.a.removeByType("menu")};window.addEventListener("resize",()=>{v&&g()});let v=null,f=null,b=null;function w(t,e){g(),l.IS_MOBILE_SAFARI||u.a.pushItem({type:"menu",onPop:t=>{g()}}),v=t,v.classList.add("active"),v.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(a.a,t=>{Object(s.a)(t),m()})),v.parentElement.insertBefore(b,v),f=e,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(a.a,m),c.default.dispatchEvent("context_menu_toggle",!0)}function L({pageX:t,pageY:e},i,n){let{scrollWidth:s,scrollHeight:a}=i;const r=document.body.getBoundingClientRect(),l=r.width,c=r.height;n=o.b.isMobile?"right":"left";let u="top";const d={x:{left:t,right:t-s},intermediateX:"right"===n?8:l-s-8,y:{top:e,bottom:e-a},intermediateY:e=8},p={top:d.y.top+a+8<=c,bottom:d.y.bottom-8>=8};{let t;t=h[n]?d.x[n]:(n="center",d.intermediateX),i.style.left=t+"px"}{let t;t=p[u]?d.y[u]:(u="center",d.intermediateY),i.style.top=t+"px"}i.className=i.className.replace(/(top|center|bottom)-(left|center|right)/g,""),i.classList.add(("center"===u?u:"bottom")+"-"+("center"===n?n:"left"===n?"right":"left"))}let E=!1,y=0;function T(){y&&clearTimeout(y),y=window.setTimeout(()=>{y=0,E=!1},400),E=!0}function S(t,e,i){const n=i?i.add(t):t.addEventListener.bind(t),a=i?i.removeManual.bind(i,t):t.removeEventListener.bind(t);if(l.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let i;const o={capture:!0},r=()=>{clearTimeout(i),a("touchmove",r,o),a("touchend",r,o),a("touchcancel",r,o)};n("touchstart",a=>{a.touches.length>1?r():(n("touchmove",r,o),n("touchend",r,o),n("touchcancel",r,o),i=window.setTimeout(()=>{E?r():(e(a.touches[0]),r(),v&&t.addEventListener("touchend",s.a,{once:!0}))},400))})}else n("contextmenu",r.IS_TOUCH_SUPPORTED?i=>{e(i),v&&t.addEventListener("touchend",s.a,{once:!0})}:e)}},36:function(t,e,i){"use strict";function n(t,e){if("string"==typeof e)return void(t.innerHTML=e);const i=t.firstChild;i?t.lastChild===i?i.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}i.d(e,"a",(function(){return n}))},38:function(t,e,i){"use strict";i.d(e,"a",(function(){return d}));var n=i(52),s=i(84),a=i(67),o=i(88);var r=i(16),l=i(31),c=i(57);let u=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;t.preventDefault();let e=(t.originalEvent||t).clipboardData.getData("text/plain"),i=l.b.parseEntities(e);i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),e=l.b.wrapRichText(e,{entities:i,noLinks:!0,wrappingDraft:!0}),window.document.execCommand("insertHTML",!1,e)}),u=null};var d;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(d||(d={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:i,showLengthOn:n,name:s,plainText:l}=t;let c,d,h=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,c=this.container.firstElementChild;else{u&&u(),this.container.innerHTML='\n
\n ',c=this.container.firstElementChild;const e=new MutationObserver(()=>{d&&d()});c.addEventListener("input",()=>{Object(o.a)(c)&&(c.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=c.innerHTML,this.onFakeInput())}),e.observe(c,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(c.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=c.className+" input-field-input-fake")}if(c.setAttribute("dir","auto"),e&&(Object(r._i18n)(c,e,void 0,"placeholder"),this.inputFake&&Object(r._i18n)(this.inputFake,e,void 0,"placeholder")),h||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(h&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const t=this.container.lastElementChild;let e=!1;d=()=>{const s=c.classList.contains("error"),o=l?c.value.length:[...Object(a.a)(c,!1).value].length,r=i-o,u=r<0;c.classList.toggle("error",u),u||r<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!u||e)&&(this.setLabel(),e=!1)},c.addEventListener("input",d)}this.input=c}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const i=window.getSelection();i.removeAllRanges(),i.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===e)return;const n=Math.round(50*Math.log(Math.abs(e-i)));this.input.style.transitionDuration=n+"ms",t&&(this.input.style.height=e?e+"px":"");Object(c.a)(this.input,"is-changing-height",!0,n,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(n.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.b.wrapDraftText(t)),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(r.i18n)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&d.Error)),this.input.classList.toggle("valid",!!(t&d.Valid))}setError(t){this.setState(d.Error,t)}}},48:function(t,e,i){"use strict";var n=i(29),s=i(0),a=i(43),o=i(7),r=i(5),l=i(44),c=i(71);const u=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(a.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let t=!1;if(window.addEventListener("popstate",e=>{if(this.debug&&this.log("popstate",e,t),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(e.state!==this.id)return void this.pushState();const i=this.navigations.pop();i?(this.manual=!t,this.handleItem(i)):this.pushState()}),window.addEventListener("keydown",t=>{const e=this.navigations[this.navigations.length-1];e&&("Escape"!==t.key||e.onEscape&&!e.onEscape()||(Object(r.a)(t),this.back(e.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),Object(c.a)(e)&&(t=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{t=!1},100)},{passive:!0,once:!0})))},e)}history.scrollRestoration="manual",this.pushState()}handleItem(t){const e=t.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",t,this.navigations),!1===e?this.pushItem(t):t.noBlurOnPop||Object(o.a)(),this.manual=!1}findItemByType(t){for(let e=this.navigations.length-1;e>=0;--e){const i=this.navigations[e];if(i.type===t)return{item:i,index:e}}}back(t){if(t){const e=this.findItemByType(t);if(e)return this.manual=!0,this.navigations.splice(e.index,1),void this.handleItem(e.item)}history.back()}pushItem(t){this.navigations.push(t),this.debug&&this.log("pushstate",t,this.navigations),t.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(t){Object(l.e)(this.navigations,t)}removeByType(t,e=!1){for(let i=this.navigations.length-1;i>=0;--i){if(this.navigations[i].type===t&&(this.navigations.splice(i,1),e))break}}};n.a.appNavigationController=u,e.a=u},52:function(t,e,i){"use strict";function n(t,e){const i=new Event(e,{bubbles:!0,cancelable:!0});t.dispatchEvent(i)}i.d(e,"a",(function(){return n}))},57:function(t,e,i){"use strict";var n=i(15);const s=(t,e,i,a,o,r)=>{const{timeout:l,raf:c}=t.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete t.dataset.raf),r&&n.default.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,i,a,o,r-1)}));i&&e&&t.classList.add(e);const u=()=>{delete t.dataset.timeout,!i&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),o&&o()};if(!n.default.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(u,a)};e.a=s},58:function(t,e,i){"use strict";var n=i(41),s=i(45),a=i(29),o=i(60);const r=new class{constructor(){this.promises={},this.raf=n.b.bind(null),this.scheduled=!1}do(t,e){let i=this.promises[t];return i||(this.scheduleFlush(),i=this.promises[t]=Object(s.a)()),void 0!==e&&i.then(()=>e()),i}measure(t){return this.do("read",t)}mutate(t){return this.do("write",t)}mutateElement(t,e){const i=Object(o.a)(t)?this.mutate():Promise.resolve();return void 0!==e&&i.then(()=>e()),i}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};a.a&&(a.a.sequentialDom=r),e.a=r},59:function(t,e,i){"use strict";function n(t,e){return e?t.forEach(t=>t.setAttribute("disabled","true")):t.forEach(t=>t.removeAttribute("disabled")),()=>n(t,!e)}i.d(e,"a",(function(){return n}))},67:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(29),s=i(31),a=i(85);function o(t,e=!0){const i=[],n=[],o=e?[]:void 0;Object(a.a)(t,i,n,void 0,void 0,o),n.length&&i.push(n.join(""));let r=i.join("\n");return r=r.replace(/\u00A0/g," "),o&&s.b.combineSameEntities(o),{value:r,entities:o}}n.a.getRichValue=o},71:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(0);function s(t){return n.IS_MOBILE_SAFARI&&t instanceof TouchEvent&&t.touches[0].clientX<30}},78:function(t,e,i){"use strict";var n=i(29),s=i(32);const a=new class{getState(){return s.a.invokeApi("account.getPassword").then(t=>t)}updateSettings(t={}){return this.getState().then(e=>{let i,n;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:t.hint,email:t.email}};i=t.currentPassword?s.a.invokeCrypto("computeSRP",t.currentPassword,e,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=e.new_algo,r=new Uint8Array(o.salt1.length+32);return r.randomize(),r.set(o.salt1,0),o.salt1=r,n=t.newPassword?s.a.invokeCrypto("computeSRP",t.newPassword,e,!0):Promise.resolve(new Uint8Array),Promise.all([i,n]).then(t=>(a.password=t[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=t[1],s.a.invokeApi("account.updatePasswordSettings",a)))})}check(t,e,i={}){return s.a.invokeCrypto("computeSRP",t,e,!1).then(t=>s.a.invokeApi("auth.checkPassword",{password:t},i).then(t=>("auth.authorization"===t._&&s.a.setUser(t.user),t)))}confirmPasswordEmail(t){return s.a.invokeApi("account.confirmPasswordEmail",{code:t})}resendPasswordEmail(){return s.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return s.a.invokeApi("account.cancelPasswordEmail")}};n.a.passwordManager=a,e.a=a},84:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},85:function(t,e,i){"use strict";i.d(e,"b",(function(){return n})),i.d(e,"a",(function(){return s}));const n={bold:{match:'[style*="font-weight"], b',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"}};function s(t,e,i,a,o,r,l={offset:0}){if(3===t.nodeType){const e=t.nodeValue;if(a===t?i.push(e.substr(0,o)+""+e.substr(o)):i.push(e),r&&e.trim()&&t.parentNode){const i=t.parentElement;for(const t in n){const s=n[t],a=i.closest(s.match+", [contenteditable]");a&&null===a.getAttribute("contenteditable")&&("messageEntityTextUrl"===s.entityName?r.push({_:s.entityName,url:i.href,offset:l.offset,length:e.length}):"messageEntityMentionName"===s.entityName?r.push({_:s.entityName,offset:l.offset,length:e.length,user_id:i.dataset.follow.toUserId()}):r.push({_:s.entityName,offset:l.offset,length:e.length}))}}return void(l.offset+=e.length)}if(1!==t.nodeType)return;const c=a===t,u="DIV"===t.tagName||"P"===t.tagName;if(u&&i.length||"BR"===t.tagName)e.push(i.join("")),i.splice(0,i.length);else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),l.offset+=e.length)}c&&!o&&i.push("");let d=t.firstChild;for(;d;)s(d,e,i,a,o,r,l),d=d.nextSibling;c&&o&&i.push(""),u&&i.length&&(e.push(i.join("")),i.splice(0,i.length))}},88:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(67);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(n.a)(t,!1).value.trim():!t.value.trim()}},89:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(16);class s{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(n.i18n)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(n.i18n)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},93:function(t,e,i){"use strict";i.d(e,"a",(function(){return a}));var n=i(5),s=i(38);class a extends s.b{constructor(t={}){super(Object.assign({plainText:!0},t)),this.passwordVisible=!1,this.onVisibilityClick=t=>{Object(n.a)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const s=this.toggleVisible=document.createElement("span");s.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(s),s.addEventListener("click",this.onVisibilityClick),s.addEventListener("touchend",this.onVisibilityClick)}}},94:function(t,e,i){"use strict";function n(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return n}))}}]); -//# sourceMappingURL=11.4cedf32c13708a0f972d.chunk.js.map \ No newline at end of file diff --git a/public/11.4cedf32c13708a0f972d.chunk.js.map b/public/11.4cedf32c13708a0f972d.chunk.js.map deleted file mode 100644 index ff093883f..000000000 --- a/public/11.4cedf32c13708a0f972d.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/monkeys/password.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["PasswordMonkey","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","loadPromise","loadAnimationFromURL","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","waitForFirstFrame","remove","rippleClickId","ripple","elem","callback","Promise","resolve","onEnd","prepend","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","abs","x","y","style","append","isRippleUnneeded","e","target","includes","tagName","touchEnd","settings","animationsEnabled","touches","length","once","cancelBubble","stopPropagation","passive","button","dataset","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","element","label","name","getStateInterval","input","inputWrapper","state","getState","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","value","toggle","update","preloader","check","response","_","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","type","select","isMobile","imageDiv","all","load","focus","pushToState","CLICK_EVENT_NAME","attachClickEvent","options","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","asDiv","icon","noRipple","rippleSquare","onlyMobile","disabled","setAttribute","text","putPreloader","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","parentElement","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","clearTimeout","attachContextMenuListener","removeManual","timeout","capture","onCancel","replaceContent","node","firstChild","lastChild","replaceWith","textContent","init","findUpAttribute","preventDefault","originalEvent","clipboardData","getData","entities","parseEntities","filter","wrapRichText","noLinks","wrappingDraft","execCommand","InputState","required","validate","undefined","maxLength","showLengthOn","min","round","placeholder","plainText","processInput","labelText","firstElementChild","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","border","labelEl","showingLength","wasError","inputLength","getRichValue","diff","isError","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","newHeight","currentHeight","transitionDuration","log","setValueSilently","fireFakeInput","originalValue","isValid","isChanged","silent","wrapDraftText","setDraftValue","Error","Valid","setState","appNavigationController","navigations","id","manual","debug","currentHash","location","hash","isPossibleSwipe","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","good","noBlurOnPop","i","index","ret","findItemByType","splice","push","noHistory","origin","pathname","single","simulateEvent","event","Event","bubbles","cancelable","SetTransition","forwards","onTransitionEnd","useRafs","raf","cancelAnimationFrame","afterTimeout","sequentialDom","promises","scheduled","kind","promise","scheduleFlush","do","read","write","toggleDisability","elements","disable","forEach","field","withEntities","lines","line","join","combineSameEntities","isSwipingBackSafari","TouchEvent","passwordManager","invokeApi","result","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","hashes","new_password_hash","inputCheckPassword","auth","setUser","user","code","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","getRichElementValue","selNode","selOffset","offset","nodeType","nodeValue","substr","trim","parentNode","tag","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","HTMLImageElement","alt","curChild","nextSibling","hasAttribute","LoginPage","title","subtitle","PasswordInputField","super","onVisibilityClick","toggleVisible","autocomplete","stealthy","tabIndex","cloneNode","htmlToSpan","span"],"mappings":"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","file":"11.4cedf32c13708a0f972d.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\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: Promise;\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.loadAnimationFromURL({\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 }, 'assets/img/TwoFactorSetupMonkeyPeek.tgs').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.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 elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.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(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nconst Button = (className: string, options: 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 const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n //console.log('document paste');\r\n\r\n //console.log('messageInput paste');\r\n\r\n e.preventDefault();\r\n // @ts-ignore\r\n let text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n\r\n let entities = RichTextProcessor.parseEntities(text);\r\n //console.log('messageInput paste', text, entities);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n //text = RichTextProcessor.wrapEmojiText(text);\r\n text = RichTextProcessor.wrapRichText(text, {entities, noLinks: true, wrappingDraft: true});\r\n\r\n // console.log('messageInput paste after', text);\r\n\r\n // @ts-ignore\r\n //let html = (e.originalEvent || e).clipboardData.getData('text/html');\r\n\r\n // @ts-ignore\r\n //console.log('paste text', text, );\r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: true,\r\n required?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\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' | 'global-search' | 'voice',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(ret.index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(ret.index, 1);\r\n this.handleItem(ret.item);\r\n return;\r\n //}\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n 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","export default function simulateEvent(elem: HTMLElement, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } 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 promise = isInDOM(element) ? this.mutate() : Promise.resolve();\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 private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean) {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\n * 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 type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityPre' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName';\r\n};\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"font-weight\"], b',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike',\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};\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n const nodeValue = node.nodeValue;\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.trim()) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest && closest.getAttribute('contenteditable') === null) {\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (parentElement as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: parentElement.dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = (selNode === node);\r\n const isBlock = node.tagName === 'DIV' || node.tagName === 'P';\r\n if(isBlock && line.length || node.tagName === 'BR') {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n 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(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { 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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n /* input.readOnly = true;\r\n\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true}); */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/12.3862167550311cfa0c62.chunk.js.map b/public/12.3862167550311cfa0c62.chunk.js.map deleted file mode 100644 index 9ee69a25e..000000000 --- a/public/12.3862167550311cfa0c62.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/lib/filemanager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignUp.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/pages/loginPage.ts"],"names":["blobSupported","e","this","fileWriter","bytes","Blob","then","arr","write","mimeType","saveFileCallback","blobParts","part","push","truncate","length","finalize","saveToStorage","blob","dbName","useStorage","test","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","match","response","put","fileName","method","get","Response","headers","size","save","callback","Promise","resolve","reject","rejected","timeout","setTimeout","undefined","res","err","clearTimeout","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","all","map","storage","deleteAll","rippleClickId","ripple","elem","onEnd","prepend","querySelector","classList","add","r","document","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","remove","delay","Math","max","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","abs","height","width","x","y","style","append","isRippleUnneeded","target","includes","tagName","touchEnd","addEventListener","settings","animationsEnabled","touches","once","cancelBubble","stopPropagation","passive","button","dataset","authCode","page","imported","className","withInputWrapper","titleLangKey","subtitleLangKey","imageDiv","title","avatarPreview","id","addIco","appProfileManager","default","uploadAvatar","_uploadAvatar","handleInput","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","wrapEmojiText","label","maxLength","btnSignUp","btnI18n","IntlElement","key","element","inputWrapper","container","input","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","invokeApi","_","setUser","user","inputFile","uploadProfilePhoto","finally","m","mount","removeAttribute","type","_authCode","pushToState","CLICK_EVENT_NAME","attachClickEvent","options","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","asDiv","icon","noRipple","rippleSquare","onlyMobile","setAttribute","text","putPreloader","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","parentElement","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","isMobile","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","removeManual","capture","onCancel","replaceContent","node","firstChild","lastChild","replaceWith","textContent","init","findUpAttribute","preventDefault","originalEvent","clipboardData","getData","entities","parseEntities","filter","wrapRichText","noLinks","wrappingDraft","execCommand","InputState","required","validate","showLengthOn","min","round","placeholder","plainText","processInput","labelText","firstElementChild","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","border","setLabel","labelEl","showingLength","wasError","inputLength","getRichValue","diff","isError","toggle","select","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","newHeight","currentHeight","transitionDuration","log","setValueSilently","fireFakeInput","originalValue","isValid","isChanged","silent","wrapDraftText","setDraftValue","state","Error","Valid","setState","appNavigationController","navigations","manual","debug","currentHash","location","hash","isPossibleSwipe","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","good","noBlurOnPop","i","index","ret","findItemByType","splice","noHistory","origin","pathname","single","simulateEvent","event","Event","bubbles","cancelable","SetTransition","forwards","onTransitionEnd","useRafs","raf","cancelAnimationFrame","afterTimeout","sequentialDom","promises","scheduled","kind","promise","scheduleFlush","do","read","field","withEntities","lines","line","join","combineSameEntities","isSwipingBackSafari","TouchEvent","attribute","closest","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","getRichElementValue","selNode","selOffset","offset","nodeType","nodeValue","substr","parentNode","tag","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","HTMLImageElement","alt","curChild","nextSibling","hasAttribute","LoginPage","subtitle"],"mappings":"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","file":"12.3862167550311cfa0c62.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { blobConstruct, readBlobAsUint8Array } from \"../helpers/blob\";\r\n\r\nexport class FileManager {\r\n public blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport FileManager from './filemanager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.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 elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.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(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nconst Button = (className: string, options: 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 const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n //console.log('document paste');\r\n\r\n //console.log('messageInput paste');\r\n\r\n e.preventDefault();\r\n // @ts-ignore\r\n let text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n\r\n let entities = RichTextProcessor.parseEntities(text);\r\n //console.log('messageInput paste', text, entities);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n //text = RichTextProcessor.wrapEmojiText(text);\r\n text = RichTextProcessor.wrapRichText(text, {entities, noLinks: true, wrappingDraft: true});\r\n\r\n // console.log('messageInput paste after', text);\r\n\r\n // @ts-ignore\r\n //let html = (e.originalEvent || e).clipboardData.getData('text/html');\r\n\r\n // @ts-ignore\r\n //console.log('paste text', text, );\r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: true,\r\n required?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\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' | 'global-search' | 'voice',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(ret.index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(ret.index, 1);\r\n this.handleItem(ret.item);\r\n return;\r\n //}\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n 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","export default function simulateEvent(elem: HTMLElement, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } 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 promise = isInDOM(element) ? this.mutate() : Promise.resolve();\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 private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityPre' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName';\r\n};\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"font-weight\"], b',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike',\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};\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n const nodeValue = node.nodeValue;\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.trim()) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest && closest.getAttribute('contenteditable') === null) {\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (parentElement as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: parentElement.dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = (selNode === node);\r\n const isBlock = node.tagName === 'DIV' || node.tagName === 'P';\r\n if(isBlock && line.length || node.tagName === 'BR') {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n 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(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/12.3862167550311cfa0c62.chunk.js b/public/12.72db7f7146e96df8b3df.chunk.js similarity index 72% rename from public/12.3862167550311cfa0c62.chunk.js rename to public/12.72db7f7146e96df8b3df.chunk.js index 5312e423d..0e1f84714 100644 --- a/public/12.3862167550311cfa0c62.chunk.js +++ b/public/12.72db7f7146e96df8b3df.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[12,23],{115:function(t,e,n){"use strict";n.d(e,"a",(function(){return l}));var i=n(76),s=n(86),a=function(t,e,n,i){return new(n||(n=Promise))((function(s,a){function o(t){try{l(i.next(t))}catch(t){a(t)}}function r(t){try{l(i.throw(t))}catch(t){a(t)}}function l(t){var e;t.done?s(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,r)}l((i=i.apply(t,e||[])).next())}))};var o=new class{constructor(){this.blobSupported=!0;try{Object(s.a)([],"")}catch(t){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(t,e){return e instanceof Blob?Object(s.d)(e).then(e=>t.write(e)):t.write(e)}getFakeFileWriter(t,e){const n=[];return{write:t=>a(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;n.push(t)})),truncate:()=>{n.length=0},finalize:(i=!0)=>{const a=Object(s.a)(n,t);return i&&e&&e(a),a}}}},r=function(t,e,n,i){return new(n||(n=Promise))((function(s,a){function o(t){try{l(i.next(t))}catch(t){a(t)}}function r(t){try{l(i.throw(t))}catch(t){a(t)}}function l(t){var e;t.done?s(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,r)}l((i=i.apply(t,e||[])).next())}))};class l{constructor(t){this.dbName=t,this.useStorage=!0,i.a.test&&(this.dbName+="_test"),l.STORAGES.length&&(this.useStorage=l.STORAGES[0].useStorage),this.openDatabase(),l.STORAGES.push(this)}openDatabase(){var t;return null!==(t=this.openDbPromise)&&void 0!==t?t:this.openDbPromise=caches.open(this.dbName)}delete(t){return this.timeoutOperation(e=>e.delete("/"+t))}deleteAll(){return caches.delete(this.dbName)}get(t){return this.timeoutOperation(e=>e.match("/"+t))}save(t,e){return this.timeoutOperation(n=>n.put("/"+t,e))}getFile(t,e="blob"){return this.get(t).then(t=>{if(!t)throw"NO_ENTRY_FOUND";return t[e]()})}saveFile(t,e){e instanceof Blob||(e=Object(s.a)(e));const n=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(t,n).then(()=>e)}timeoutOperation(t){return this.useStorage?new Promise((e,n)=>r(this,void 0,void 0,(function*(){let i=!1;const s=setTimeout(()=>{n(),i=!0},15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield t(n);if(i)return;e(s)}catch(t){n(t)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(t,e){const n=o.getFakeFileWriter(e,e=>this.saveFile(t,e).catch(()=>e));return Promise.resolve(n)}static toggleStorage(t){return Promise.all(this.STORAGES.map(e=>{if(e.useStorage=t,!t)return e.deleteAll()}))}}l.STORAGES=[]},18:function(t,e,n){"use strict";n.r(e),n.d(e,"ripple",(function(){return l}));var i=n(6),s=n(58),a=n(1),o=n(15);let r=0;function l(t,e=(()=>Promise.resolve()),n=null,l=!1){if(t.querySelector(".c-ripple"))return;t.classList.add("rp");let c=document.createElement("div");c.classList.add("c-ripple");let u;t.classList.contains("rp-square")&&c.classList.add("is-square"),t[l?"prepend":"append"](c);const h=(t,i)=>{const o=Date.now(),l=document.createElement("div"),h=r++,d=1e3*+window.getComputedStyle(c).getPropertyValue("--ripple-duration").replace("s","");u=()=>{let t=Date.now()-o;const e=()=>{s.a.mutate(()=>{l.remove()}),n&&n(h)};if(tl.classList.add("hiding"),Math.max(n-d/2,0)),setTimeout(e,n)}else l.classList.add("hiding"),setTimeout(e,d/2);a.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",u),u=null,p=!1},e&&e(h),window.requestAnimationFrame(()=>{const e=c.getBoundingClientRect();l.classList.add("c-ripple__circle");const n=t-e.left,s=i-e.top,a=Math.sqrt(Math.pow(Math.abs(s-e.height/2)+e.height/2,2)+Math.pow(Math.abs(n-e.width/2)+e.width/2,2)),o=n-a/2,r=s-a/2;l.style.width=l.style.height=a+"px",l.style.left=o+"px",l.style.top=r+"px",c.append(l)})},d=e=>e.target!==t&&(["BUTTON","A"].includes(e.target.tagName)||Object(i.a)(e.target,"c-ripple")!==c);let p=!1;if(a.IS_TOUCH_SUPPORTED){let e=()=>{u&&u()};t.addEventListener("touchstart",n=>{if(!o.default.settings.animationsEnabled)return;if(n.touches.length>1||p||d(n))return;p=!0;let{clientX:i,clientY:s}=n.touches[0];h(i,s),t.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",n=>{n.cancelBubble=!0,n.stopPropagation(),e(),t.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else t.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===t.dataset.ripple||d(e))return;if(p)return void(p=!1);let{clientX:n,clientY:i}=e;h(n,i),window.addEventListener("mouseup",u,{once:!0,passive:!0}),window.addEventListener("contextmenu",u,{once:!0,passive:!0})},{passive:!0})}},25:function(t,e,n){"use strict";n.r(e);var i=n(33),s=n(38),a=n(35),o=n(134),r=n(17),l=n(16),c=n(32),u=n(31),h=n(89),d=n(62),p=n(7),m=n(36);let v=null;const g=new d.a("page-signUp",!0,()=>Promise.all([n.e(6),n.e(25)]).then(n.bind(null,70)).then(t=>{const e=new h.a({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});e.imageDiv.classList.add("avatar-edit"),e.title.classList.add("fullName");const r=document.createElement("canvas");r.id="canvas-avatar",r.className="avatar-edit-canvas";const d=document.createElement("span");d.className="tgico tgico-cameraadd",e.imageDiv.append(r,d);const g=t.default;let f;e.imageDiv.addEventListener("click",()=>{(new o.a).open(r,t=>{f=t})});const b=t=>{const n=w.value||"",i=L.value||"",s=n||i?(n+" "+i).trim():"";s?Object(m.a)(e.title,u.b.wrapEmojiText(s)):Object(m.a)(e.title,Object(l.i18n)("YourName"))};const w=new s.b({label:"FirstName",maxLength:70}),L=new s.b({label:"LastName",maxLength:64}),E=Object(i.a)("btn-primary btn-color-primary"),y=new l.default.IntlElement({key:"StartMessaging"});return E.append(y.element),e.inputWrapper.append(w.container,L.container,E),w.input.addEventListener("input",b),L.input.addEventListener("input",b),E.addEventListener("click",(function(t){if(w.input.classList.contains("error")||L.input.classList.contains("error"))return!1;if(!w.value.length)return w.input.classList.add("error"),!1;this.disabled=!0;const e=w.value.trim(),i=L.value.trim(),s={phone_number:v.phone_number,phone_code_hash:v.phone_code_hash,first_name:e,last_name:i};y.update({key:"PleaseWait"});const o=Object(a.f)(this);c.a.invokeApi("auth.signUp",s).then(t=>{switch(t._){case"auth.authorization":c.a.setUser(t.user),new Promise((t,e)=>{if(!f)return t();f().then(n=>{g.uploadProfilePhoto(n).then(t,e)},e)}).finally(()=>{n.e(4).then(n.bind(null,19)).then(t=>{t.default.mount()})});break;default:y.update({key:t._}),this.removeAttribute("disabled"),o.remove()}}).catch(t=>{this.removeAttribute("disabled"),o.remove(),t.type,y.update({key:t.type})})})),Object(p.a)(),new Promise(t=>{window.requestAnimationFrame(t)})}),t=>{v=t,r.default.pushToState("authState",{_:"authStateSignUp",authCode:t})});e.default=g},30:function(t,e,n){"use strict";n.d(e,"a",(function(){return a})),n.d(e,"b",(function(){return o})),n.d(e,"c",(function(){return r})),n.d(e,"d",(function(){return l}));var i=n(1),s=n(52);const a=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function o(t,e,n={}){const i=n.listenerSetter?n.listenerSetter.add(t):t.addEventListener.bind(t);n.touchMouseDown=!0,i(a,e,n)}function r(t,e,n){t.removeEventListener(a,e,n)}function l(t){Object(s.a)(t,a)}},33:function(t,e,n){"use strict";var i=n(16),s=n(18);e.a=(t,e={})=>{const n=document.createElement(e.asDiv?"div":"button");return n.className=t+(e.icon?" tgico-"+e.icon:""),e.noRipple||(e.rippleSquare&&n.classList.add("rp-square"),Object(s.ripple)(n)),e.onlyMobile&&n.classList.add("only-handhelds"),e.disabled&&n.setAttribute("disabled","true"),e.text&&n.append(Object(i.i18n)(e.text)),n}},35:function(t,e,n){"use strict";n.d(e,"f",(function(){return h})),n.d(e,"g",(function(){return d})),n.d(e,"c",(function(){return v})),n.d(e,"d",(function(){return w})),n.d(e,"e",(function(){return L})),n.d(e,"b",(function(){return O})),n.d(e,"a",(function(){return S}));var i=n(29),s=n(5),a=n(30),o=n(37),r=n(1),l=n(0),c=n(15),u=n(48);function h(t,e=!1){const n='\n \n \n ';if(e){const e=document.createElement("div");return e.classList.add("preloader"),e.innerHTML=n,t&&t.appendChild(e),e}return t.insertAdjacentHTML("beforeend",n),t.lastElementChild}function d(t,e="check"){return t.classList.remove("tgico-"+e),t.disabled=!0,h(t),()=>{t.innerHTML="",t.classList.add("tgico-"+e),t.removeAttribute("disabled")}}i.a.putPreloader=h;let p=t=>{let e=g.getBoundingClientRect(),{clientX:n,clientY:i}=t,s=n>=e.right?n-e.right:e.left-n,a=i>=e.bottom?i-e.bottom:e.top-i;(s>=100||a>=100)&&v()};const m=t=>{v()},v=()=>{g&&(g.classList.remove("active"),g.parentElement.classList.remove("menu-open"),b&&b.remove(),g=null,c.default.dispatchEvent("context_menu_toggle",!1)),f&&(f(),f=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(a.a,m),l.IS_MOBILE_SAFARI||u.a.removeByType("menu")};window.addEventListener("resize",()=>{g&&v()});let g=null,f=null,b=null;function w(t,e){v(),l.IS_MOBILE_SAFARI||u.a.pushItem({type:"menu",onPop:t=>{v()}}),g=t,g.classList.add("active"),g.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(a.a,t=>{Object(s.a)(t),m()})),g.parentElement.insertBefore(b,g),f=e,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(a.a,m),c.default.dispatchEvent("context_menu_toggle",!0)}function L({pageX:t,pageY:e},n,i){let{scrollWidth:s,scrollHeight:a}=n;const r=document.body.getBoundingClientRect(),l=r.width,c=r.height;i=o.b.isMobile?"right":"left";let u="top";const h={x:{left:t,right:t-s},intermediateX:"right"===i?8:l-s-8,y:{top:e,bottom:e-a},intermediateY:e=8},p={top:h.y.top+a+8<=c,bottom:h.y.bottom-8>=8};{let t;t=d[i]?h.x[i]:(i="center",h.intermediateX),n.style.left=t+"px"}{let t;t=p[u]?h.y[u]:(u="center",h.intermediateY),n.style.top=t+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===u?u:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let E=!1,y=0;function O(){y&&clearTimeout(y),y=window.setTimeout(()=>{y=0,E=!1},400),E=!0}function S(t,e,n){const i=n?n.add(t):t.addEventListener.bind(t),a=n?n.removeManual.bind(n,t):t.removeEventListener.bind(t);if(l.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const o={capture:!0},r=()=>{clearTimeout(n),a("touchmove",r,o),a("touchend",r,o),a("touchcancel",r,o)};i("touchstart",a=>{a.touches.length>1?r():(i("touchmove",r,o),i("touchend",r,o),i("touchcancel",r,o),n=window.setTimeout(()=>{E?r():(e(a.touches[0]),r(),g&&t.addEventListener("touchend",s.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{e(n),g&&t.addEventListener("touchend",s.a,{once:!0})}:e)}},36:function(t,e,n){"use strict";function i(t,e){if("string"==typeof e)return void(t.innerHTML=e);const n=t.firstChild;n?t.lastChild===n?n.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}n.d(e,"a",(function(){return i}))},38:function(t,e,n){"use strict";n.d(e,"a",(function(){return h}));var i=n(52),s=n(84),a=n(67),o=n(88);var r=n(16),l=n(31),c=n(57);let u=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;t.preventDefault();let e=(t.originalEvent||t).clipboardData.getData("text/plain"),n=l.b.parseEntities(e);n=n.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),e=l.b.wrapRichText(e,{entities:n,noLinks:!0,wrappingDraft:!0}),window.document.execCommand("insertHTML",!1,e)}),u=null};var h;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(h||(h={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:n,showLengthOn:i,name:s,plainText:l}=t;let c,h,d=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,c=this.container.firstElementChild;else{u&&u(),this.container.innerHTML='\n
\n ',c=this.container.firstElementChild;const e=new MutationObserver(()=>{h&&h()});c.addEventListener("input",()=>{Object(o.a)(c)&&(c.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=c.innerHTML,this.onFakeInput())}),e.observe(c,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(c.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=c.className+" input-field-input-fake")}if(c.setAttribute("dir","auto"),e&&(Object(r._i18n)(c,e,void 0,"placeholder"),this.inputFake&&Object(r._i18n)(this.inputFake,e,void 0,"placeholder")),d||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(d&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),n){const t=this.container.lastElementChild;let e=!1;h=()=>{const s=c.classList.contains("error"),o=l?c.value.length:[...Object(a.a)(c,!1).value].length,r=n-o,u=r<0;c.classList.toggle("error",u),u||r<=i?(this.setLabel(),t.append(` (${n-o})`),e||(e=!0)):(s&&!u||e)&&(this.setLabel(),e=!1)},c.addEventListener("input",h)}this.input=c}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const n=window.getSelection();n.removeAllRanges(),n.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,n=+this.input.style.height.replace("px","");if(n===e)return;const i=Math.round(50*Math.log(Math.abs(e-n)));this.input.style.transitionDuration=i+"ms",t&&(this.input.style.height=e?e+"px":"");Object(c.a)(this.input,"is-changing-height",!0,i,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(i.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.b.wrapDraftText(t)),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(r.i18n)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&h.Error)),this.input.classList.toggle("valid",!!(t&h.Valid))}setError(t){this.setState(h.Error,t)}}},48:function(t,e,n){"use strict";var i=n(29),s=n(0),a=n(43),o=n(7),r=n(5),l=n(44),c=n(71);const u=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(a.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let t=!1;if(window.addEventListener("popstate",e=>{if(this.debug&&this.log("popstate",e,t),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(e.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!t,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",t=>{const e=this.navigations[this.navigations.length-1];e&&("Escape"!==t.key||e.onEscape&&!e.onEscape()||(Object(r.a)(t),this.back(e.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),Object(c.a)(e)&&(t=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{t=!1},100)},{passive:!0,once:!0})))},e)}history.scrollRestoration="manual",this.pushState()}handleItem(t){const e=t.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",t,this.navigations),!1===e?this.pushItem(t):t.noBlurOnPop||Object(o.a)(),this.manual=!1}findItemByType(t){for(let e=this.navigations.length-1;e>=0;--e){const n=this.navigations[e];if(n.type===t)return{item:n,index:e}}}back(t){if(t){const e=this.findItemByType(t);if(e)return this.manual=!0,this.navigations.splice(e.index,1),void this.handleItem(e.item)}history.back()}pushItem(t){this.navigations.push(t),this.debug&&this.log("pushstate",t,this.navigations),t.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(t){Object(l.e)(this.navigations,t)}removeByType(t,e=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===t&&(this.navigations.splice(n,1),e))break}}};i.a.appNavigationController=u,e.a=u},52:function(t,e,n){"use strict";function i(t,e){const n=new Event(e,{bubbles:!0,cancelable:!0});t.dispatchEvent(n)}n.d(e,"a",(function(){return i}))},57:function(t,e,n){"use strict";var i=n(15);const s=(t,e,n,a,o,r)=>{const{timeout:l,raf:c}=t.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete t.dataset.raf),r&&i.default.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,n,a,o,r-1)}));n&&e&&t.classList.add(e);const u=()=>{delete t.dataset.timeout,!n&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),o&&o()};if(!i.default.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!n),t.dataset.timeout=""+setTimeout(u,a)};e.a=s},58:function(t,e,n){"use strict";var i=n(41),s=n(45),a=n(29),o=n(60);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(t,e){let n=this.promises[t];return n||(this.scheduleFlush(),n=this.promises[t]=Object(s.a)()),void 0!==e&&n.then(()=>e()),n}measure(t){return this.do("read",t)}mutate(t){return this.do("write",t)}mutateElement(t,e){const n=Object(o.a)(t)?this.mutate():Promise.resolve();return void 0!==e&&n.then(()=>e()),n}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.a&&(a.a.sequentialDom=r),e.a=r},67:function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var i=n(29),s=n(31),a=n(85);function o(t,e=!0){const n=[],i=[],o=e?[]:void 0;Object(a.a)(t,n,i,void 0,void 0,o),i.length&&n.push(i.join(""));let r=n.join("\n");return r=r.replace(/\u00A0/g," "),o&&s.b.combineSameEntities(o),{value:r,entities:o}}i.a.getRichValue=o},71:function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var i=n(0);function s(t){return i.IS_MOBILE_SAFARI&&t instanceof TouchEvent&&t.touches[0].clientX<30}},84:function(t,e,n){"use strict";function i(t,e){return t.closest(`[${e}]`)}n.d(e,"a",(function(){return i}))},85:function(t,e,n){"use strict";n.d(e,"b",(function(){return i})),n.d(e,"a",(function(){return s}));const i={bold:{match:'[style*="font-weight"], b',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"}};function s(t,e,n,a,o,r,l={offset:0}){if(3===t.nodeType){const e=t.nodeValue;if(a===t?n.push(e.substr(0,o)+""+e.substr(o)):n.push(e),r&&e.trim()&&t.parentNode){const n=t.parentElement;for(const t in i){const s=i[t],a=n.closest(s.match+", [contenteditable]");a&&null===a.getAttribute("contenteditable")&&("messageEntityTextUrl"===s.entityName?r.push({_:s.entityName,url:n.href,offset:l.offset,length:e.length}):"messageEntityMentionName"===s.entityName?r.push({_:s.entityName,offset:l.offset,length:e.length,user_id:n.dataset.follow.toUserId()}):r.push({_:s.entityName,offset:l.offset,length:e.length}))}}return void(l.offset+=e.length)}if(1!==t.nodeType)return;const c=a===t,u="DIV"===t.tagName||"P"===t.tagName;if(u&&n.length||"BR"===t.tagName)e.push(n.join("")),n.splice(0,n.length);else if(t instanceof HTMLImageElement){const e=t.alt;e&&(n.push(e),l.offset+=e.length)}c&&!o&&n.push("");let h=t.firstChild;for(;h;)s(h,e,n,a,o,r,l),h=h.nextSibling;c&&o&&n.push(""),u&&n.length&&(e.push(n.join("")),n.splice(0,n.length))}},88:function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var i=n(67);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(i.a)(t,!1).value.trim():!t.value.trim()}},89:function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var i=n(16);class s{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(i.i18n)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(i.i18n)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); -//# sourceMappingURL=12.3862167550311cfa0c62.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[12,23],{119:function(t,e,n){"use strict";n.d(e,"a",(function(){return l}));var i=n(77),s=n(88),a=function(t,e,n,i){return new(n||(n=Promise))((function(s,a){function o(t){try{l(i.next(t))}catch(t){a(t)}}function r(t){try{l(i.throw(t))}catch(t){a(t)}}function l(t){var e;t.done?s(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,r)}l((i=i.apply(t,e||[])).next())}))};var o=new class{constructor(){this.blobSupported=!0;try{Object(s.a)([],"")}catch(t){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(t,e){return e instanceof Blob?Object(s.d)(e).then(e=>t.write(e)):t.write(e)}getFakeFileWriter(t,e){const n=[];return{write:t=>a(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;n.push(t)})),truncate:()=>{n.length=0},finalize:(i=!0)=>{const a=Object(s.a)(n,t);return i&&e&&e(a),a}}}},r=function(t,e,n,i){return new(n||(n=Promise))((function(s,a){function o(t){try{l(i.next(t))}catch(t){a(t)}}function r(t){try{l(i.throw(t))}catch(t){a(t)}}function l(t){var e;t.done?s(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,r)}l((i=i.apply(t,e||[])).next())}))};class l{constructor(t){this.dbName=t,this.useStorage=!0,i.a.test&&(this.dbName+="_test"),l.STORAGES.length&&(this.useStorage=l.STORAGES[0].useStorage),this.openDatabase(),l.STORAGES.push(this)}openDatabase(){var t;return null!==(t=this.openDbPromise)&&void 0!==t?t:this.openDbPromise=caches.open(this.dbName)}delete(t){return this.timeoutOperation(e=>e.delete("/"+t))}deleteAll(){return caches.delete(this.dbName)}get(t){return this.timeoutOperation(e=>e.match("/"+t))}save(t,e){return this.timeoutOperation(n=>n.put("/"+t,e))}getFile(t,e="blob"){return this.get(t).then(t=>{if(!t)throw"NO_ENTRY_FOUND";return t[e]()})}saveFile(t,e){e instanceof Blob||(e=Object(s.a)(e));const n=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(t,n).then(()=>e)}timeoutOperation(t){return this.useStorage?new Promise((e,n)=>r(this,void 0,void 0,(function*(){let i=!1;const s=setTimeout(()=>{n(),i=!0},15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield t(n);if(i)return;e(s)}catch(t){n(t)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(t,e){const n=o.getFakeFileWriter(e,e=>this.saveFile(t,e).catch(()=>e));return Promise.resolve(n)}static toggleStorage(t){return Promise.all(this.STORAGES.map(e=>{if(e.useStorage=t,!t)return e.deleteAll()}))}}l.STORAGES=[]},18:function(t,e,n){"use strict";n.r(e),n.d(e,"ripple",(function(){return l}));var i=n(6),s=n(60),a=n(1),o=n(15);let r=0;function l(t,e=(()=>Promise.resolve()),n=null,l=!1){if(t.querySelector(".c-ripple"))return;t.classList.add("rp");let c=document.createElement("div");c.classList.add("c-ripple");let u;t.classList.contains("rp-square")&&c.classList.add("is-square"),t[l?"prepend":"append"](c);const h=(t,i)=>{const o=Date.now(),l=document.createElement("div"),h=r++,d=1e3*+window.getComputedStyle(c).getPropertyValue("--ripple-duration").replace("s","");u=()=>{let t=Date.now()-o;const e=()=>{s.a.mutate(()=>{l.remove()}),n&&n(h)};if(tl.classList.add("hiding"),Math.max(n-d/2,0)),setTimeout(e,n)}else l.classList.add("hiding"),setTimeout(e,d/2);a.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",u),u=null,p=!1},e&&e(h),window.requestAnimationFrame(()=>{const e=c.getBoundingClientRect();l.classList.add("c-ripple__circle");const n=t-e.left,s=i-e.top,a=Math.sqrt(Math.pow(Math.abs(s-e.height/2)+e.height/2,2)+Math.pow(Math.abs(n-e.width/2)+e.width/2,2)),o=n-a/2,r=s-a/2;l.style.width=l.style.height=a+"px",l.style.left=o+"px",l.style.top=r+"px",c.append(l)})},d=e=>e.target!==t&&(["BUTTON","A"].includes(e.target.tagName)||Object(i.a)(e.target,"c-ripple")!==c);let p=!1;if(a.IS_TOUCH_SUPPORTED){let e=()=>{u&&u()};t.addEventListener("touchstart",n=>{if(!o.default.settings.animationsEnabled)return;if(n.touches.length>1||p||d(n))return;p=!0;let{clientX:i,clientY:s}=n.touches[0];h(i,s),t.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",n=>{n.cancelBubble=!0,n.stopPropagation(),e(),t.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else t.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===t.dataset.ripple||d(e))return;if(p)return void(p=!1);let{clientX:n,clientY:i}=e;h(n,i),window.addEventListener("mouseup",u,{once:!0,passive:!0}),window.addEventListener("contextmenu",u,{once:!0,passive:!0})},{passive:!0})}},25:function(t,e,n){"use strict";n.r(e);var i=n(34),s=n(38),a=n(35),o=n(138),r=n(17),l=n(16),c=n(33),u=n(31),h=n(91),d=n(64),p=n(7),m=n(36);let v=null;const g=new d.a("page-signUp",!0,()=>Promise.all([n.e(6),n.e(25)]).then(n.bind(null,71)).then(t=>{const e=new h.a({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});e.imageDiv.classList.add("avatar-edit"),e.title.classList.add("fullName");const r=document.createElement("canvas");r.id="canvas-avatar",r.className="avatar-edit-canvas";const d=document.createElement("span");d.className="tgico tgico-cameraadd",e.imageDiv.append(r,d);const g=t.default;let f;e.imageDiv.addEventListener("click",()=>{(new o.a).open(r,t=>{f=t})});const b=t=>{const n=w.value||"",i=L.value||"",s=n||i?(n+" "+i).trim():"";s?Object(m.a)(e.title,u.b.wrapEmojiText(s)):Object(m.a)(e.title,Object(l.i18n)("YourName"))};const w=new s.b({label:"FirstName",maxLength:70}),L=new s.b({label:"LastName",maxLength:64}),E=Object(i.a)("btn-primary btn-color-primary"),y=new l.default.IntlElement({key:"StartMessaging"});return E.append(y.element),e.inputWrapper.append(w.container,L.container,E),w.input.addEventListener("input",b),L.input.addEventListener("input",b),E.addEventListener("click",(function(t){if(w.input.classList.contains("error")||L.input.classList.contains("error"))return!1;if(!w.value.length)return w.input.classList.add("error"),!1;this.disabled=!0;const e=w.value.trim(),i=L.value.trim(),s={phone_number:v.phone_number,phone_code_hash:v.phone_code_hash,first_name:e,last_name:i};y.update({key:"PleaseWait"});const o=Object(a.f)(this);c.a.invokeApi("auth.signUp",s).then(t=>{switch(t._){case"auth.authorization":c.a.setUser(t.user),new Promise((t,e)=>{if(!f)return t();f().then(n=>{g.uploadProfilePhoto(n).then(t,e)},e)}).finally(()=>{n.e(4).then(n.bind(null,19)).then(t=>{t.default.mount()})});break;default:y.update({key:t._}),this.removeAttribute("disabled"),o.remove()}}).catch(t=>{this.removeAttribute("disabled"),o.remove(),t.type,y.update({key:t.type})})})),Object(p.a)(),new Promise(t=>{window.requestAnimationFrame(t)})}),t=>{v=t,r.default.pushToState("authState",{_:"authStateSignUp",authCode:t})});e.default=g},30:function(t,e,n){"use strict";n.d(e,"a",(function(){return a})),n.d(e,"b",(function(){return o})),n.d(e,"c",(function(){return r})),n.d(e,"d",(function(){return l}));var i=n(1),s=n(52);const a=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function o(t,e,n={}){const i=n.listenerSetter?n.listenerSetter.add(t):t.addEventListener.bind(t);n.touchMouseDown=!0,i(a,e,n)}function r(t,e,n){t.removeEventListener(a,e,n)}function l(t){Object(s.a)(t,a)}},34:function(t,e,n){"use strict";var i=n(16),s=n(18);e.a=(t,e={})=>{const n=document.createElement(e.asDiv?"div":"button");return n.className=t+(e.icon?" tgico-"+e.icon:""),e.noRipple||(e.rippleSquare&&n.classList.add("rp-square"),Object(s.ripple)(n)),e.onlyMobile&&n.classList.add("only-handhelds"),e.disabled&&n.setAttribute("disabled","true"),e.text&&n.append(Object(i.i18n)(e.text)),n}},35:function(t,e,n){"use strict";n.d(e,"f",(function(){return h})),n.d(e,"g",(function(){return d})),n.d(e,"c",(function(){return v})),n.d(e,"d",(function(){return w})),n.d(e,"e",(function(){return L})),n.d(e,"b",(function(){return O})),n.d(e,"a",(function(){return S}));var i=n(29),s=n(5),a=n(30),o=n(37),r=n(1),l=n(0),c=n(15),u=n(50);function h(t,e=!1){const n='\n \n \n ';if(e){const e=document.createElement("div");return e.classList.add("preloader"),e.innerHTML=n,t&&t.appendChild(e),e}return t.insertAdjacentHTML("beforeend",n),t.lastElementChild}function d(t,e="check"){return t.classList.remove("tgico-"+e),t.disabled=!0,h(t),()=>{t.innerHTML="",t.classList.add("tgico-"+e),t.removeAttribute("disabled")}}i.a.putPreloader=h;let p=t=>{let e=g.getBoundingClientRect(),{clientX:n,clientY:i}=t,s=n>=e.right?n-e.right:e.left-n,a=i>=e.bottom?i-e.bottom:e.top-i;(s>=100||a>=100)&&v()};const m=t=>{v()},v=()=>{g&&(g.classList.remove("active"),g.parentElement.classList.remove("menu-open"),b&&b.remove(),g=null,c.default.dispatchEvent("context_menu_toggle",!1)),f&&(f(),f=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(a.a,m),l.IS_MOBILE_SAFARI||u.a.removeByType("menu")};window.addEventListener("resize",()=>{g&&v()});let g=null,f=null,b=null;function w(t,e){v(),l.IS_MOBILE_SAFARI||u.a.pushItem({type:"menu",onPop:t=>{v()}}),g=t,g.classList.add("active"),g.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(a.a,t=>{Object(s.a)(t),m()})),g.parentElement.insertBefore(b,g),f=e,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(a.a,m),c.default.dispatchEvent("context_menu_toggle",!0)}function L({pageX:t,pageY:e},n,i){let{scrollWidth:s,scrollHeight:a}=n;const r=document.body.getBoundingClientRect(),l=r.width,c=r.height;i=o.b.isMobile?"right":"left";let u="top";const h={x:{left:t,right:t-s},intermediateX:"right"===i?8:l-s-8,y:{top:e,bottom:e-a},intermediateY:e=8},p={top:h.y.top+a+8<=c,bottom:h.y.bottom-8>=8};{let t;t=d[i]?h.x[i]:(i="center",h.intermediateX),n.style.left=t+"px"}{let t;t=p[u]?h.y[u]:(u="center",h.intermediateY),n.style.top=t+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===u?u:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let E=!1,y=0;function O(){y&&clearTimeout(y),y=window.setTimeout(()=>{y=0,E=!1},400),E=!0}function S(t,e,n){const i=n?n.add(t):t.addEventListener.bind(t),a=n?n.removeManual.bind(n,t):t.removeEventListener.bind(t);if(l.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const o={capture:!0},r=()=>{clearTimeout(n),a("touchmove",r,o),a("touchend",r,o),a("touchcancel",r,o)};i("touchstart",a=>{a.touches.length>1?r():(i("touchmove",r,o),i("touchend",r,o),i("touchcancel",r,o),n=window.setTimeout(()=>{E?r():(e(a.touches[0]),r(),g&&t.addEventListener("touchend",s.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{e(n),g&&t.addEventListener("touchend",s.a,{once:!0})}:e)}},36:function(t,e,n){"use strict";function i(t,e){if("string"==typeof e)return void(t.innerHTML=e);const n=t.firstChild;n?t.lastChild===n?n.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}n.d(e,"a",(function(){return i}))},38:function(t,e,n){"use strict";n.d(e,"a",(function(){return h}));var i=n(52),s=n(85),a=n(69),o=n(90);var r=n(16),l=n(31),c=n(57);let u=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;t.preventDefault();let e=(t.originalEvent||t).clipboardData.getData("text/plain"),n=l.b.parseEntities(e);n=n.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),e=l.b.wrapRichText(e,{entities:n,noLinks:!0,wrappingDraft:!0}),window.document.execCommand("insertHTML",!1,e)}),u=null};var h;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(h||(h={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:n,showLengthOn:i,name:s,plainText:l}=t;let c,h,d=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,c=this.container.firstElementChild;else{u&&u(),this.container.innerHTML='\n
\n ',c=this.container.firstElementChild;const e=new MutationObserver(()=>{h&&h()});c.addEventListener("input",()=>{Object(o.a)(c)&&(c.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=c.innerHTML,this.onFakeInput())}),e.observe(c,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(c.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=c.className+" input-field-input-fake")}if(c.setAttribute("dir","auto"),e&&(Object(r._i18n)(c,e,void 0,"placeholder"),this.inputFake&&Object(r._i18n)(this.inputFake,e,void 0,"placeholder")),d||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(d&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),n){const t=this.container.lastElementChild;let e=!1;h=()=>{const s=c.classList.contains("error"),o=l?c.value.length:[...Object(a.a)(c,!1).value].length,r=n-o,u=r<0;c.classList.toggle("error",u),u||r<=i?(this.setLabel(),t.append(` (${n-o})`),e||(e=!0)):(s&&!u||e)&&(this.setLabel(),e=!1)},c.addEventListener("input",h)}this.input=c}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const n=window.getSelection();n.removeAllRanges(),n.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,n=+this.input.style.height.replace("px","");if(n===e)return;const i=Math.round(50*Math.log(Math.abs(e-n)));this.input.style.transitionDuration=i+"ms",t&&(this.input.style.height=e?e+"px":"");Object(c.a)(this.input,"is-changing-height",!0,i,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(i.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.b.wrapDraftText(t)),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(r.i18n)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&h.Error)),this.input.classList.toggle("valid",!!(t&h.Valid))}setError(t){this.setState(h.Error,t)}}},50:function(t,e,n){"use strict";var i=n(29),s=n(0),a=n(43),o=n(7),r=n(5),l=n(41),c=n(72);const u=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(a.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let t=!1;if(window.addEventListener("popstate",e=>{if(this.debug&&this.log("popstate",e,t),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(e.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!t,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",t=>{const e=this.navigations[this.navigations.length-1];e&&("Escape"!==t.key||e.onEscape&&!e.onEscape()||(Object(r.a)(t),this.back(e.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),Object(c.a)(e)&&(t=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{t=!1},100)},{passive:!0,once:!0})))},e)}history.scrollRestoration="manual",this.pushState()}handleItem(t){const e=t.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",t,this.navigations),!1===e?this.pushItem(t):t.noBlurOnPop||Object(o.a)(),this.manual=!1}findItemByType(t){for(let e=this.navigations.length-1;e>=0;--e){const n=this.navigations[e];if(n.type===t)return{item:n,index:e}}}back(t){if(t){const e=this.findItemByType(t);if(e)return void this.backByItem(e.item,e.index)}history.back()}backByItem(t,e=this.navigations.indexOf(t)){this.manual=!0,this.navigations.splice(e,1),this.handleItem(t)}pushItem(t){this.navigations.push(t),this.debug&&this.log("pushstate",t,this.navigations),t.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(t){Object(l.e)(this.navigations,t)}removeByType(t,e=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===t&&(this.navigations.splice(n,1),e))break}}};i.a.appNavigationController=u,e.a=u},52:function(t,e,n){"use strict";function i(t,e){const n=new Event(e,{bubbles:!0,cancelable:!0});t.dispatchEvent(n)}n.d(e,"a",(function(){return i}))},57:function(t,e,n){"use strict";var i=n(15);const s=(t,e,n,a,o,r)=>{const{timeout:l,raf:c}=t.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete t.dataset.raf),r&&i.default.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,n,a,o,r-1)}));n&&e&&t.classList.add(e);const u=()=>{delete t.dataset.timeout,!n&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),o&&o()};if(!i.default.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!n),t.dataset.timeout=""+setTimeout(u,a)};e.a=s},60:function(t,e,n){"use strict";var i=n(42),s=n(46),a=n(29),o=n(61);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(t,e){let n=this.promises[t];return n||(this.scheduleFlush(),n=this.promises[t]=Object(s.a)()),void 0!==e&&n.then(()=>e()),n}measure(t){return this.do("read",t)}mutate(t){return this.do("write",t)}mutateElement(t,e){const n=Object(o.a)(t)?this.mutate():Promise.resolve();return void 0!==e&&n.then(()=>e()),n}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.a&&(a.a.sequentialDom=r),e.a=r},69:function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var i=n(29),s=n(31),a=n(86);function o(t,e=!0){const n=[],i=[],o=e?[]:void 0;Object(a.a)(t,n,i,void 0,void 0,o),i.length&&n.push(i.join(""));let r=n.join("\n");return r=r.replace(/\u00A0/g," "),o&&s.b.combineSameEntities(o),{value:r,entities:o}}i.a.getRichValue=o},72:function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var i=n(0);function s(t){return i.IS_MOBILE_SAFARI&&t instanceof TouchEvent&&t.touches[0].clientX<30}},85:function(t,e,n){"use strict";function i(t,e){return t.closest(`[${e}]`)}n.d(e,"a",(function(){return i}))},86:function(t,e,n){"use strict";n.d(e,"b",(function(){return i})),n.d(e,"a",(function(){return s}));const i={bold:{match:'[style*="font-weight"], b',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"}};function s(t,e,n,a,o,r,l={offset:0}){if(3===t.nodeType){const e=t.nodeValue;if(a===t?n.push(e.substr(0,o)+""+e.substr(o)):n.push(e),r&&e.trim()&&t.parentNode){const n=t.parentElement;for(const t in i){const s=i[t],a=n.closest(s.match+", [contenteditable]");a&&null===a.getAttribute("contenteditable")&&("messageEntityTextUrl"===s.entityName?r.push({_:s.entityName,url:n.href,offset:l.offset,length:e.length}):"messageEntityMentionName"===s.entityName?r.push({_:s.entityName,offset:l.offset,length:e.length,user_id:n.dataset.follow.toUserId()}):r.push({_:s.entityName,offset:l.offset,length:e.length}))}}return void(l.offset+=e.length)}if(1!==t.nodeType)return;const c=a===t,u="DIV"===t.tagName||"P"===t.tagName;if(u&&n.length||"BR"===t.tagName)e.push(n.join("")),n.splice(0,n.length);else if(t instanceof HTMLImageElement){const e=t.alt;e&&(n.push(e),l.offset+=e.length)}c&&!o&&n.push("");let h=t.firstChild;for(;h;)s(h,e,n,a,o,r,l),h=h.nextSibling;c&&o&&n.push(""),u&&n.length&&(e.push(n.join("")),n.splice(0,n.length))}},90:function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var i=n(69);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(i.a)(t,!1).value.trim():!t.value.trim()}},91:function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var i=n(16);class s{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(i.i18n)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(i.i18n)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); +//# sourceMappingURL=12.72db7f7146e96df8b3df.chunk.js.map \ No newline at end of file diff --git a/public/12.72db7f7146e96df8b3df.chunk.js.map b/public/12.72db7f7146e96df8b3df.chunk.js.map new file mode 100644 index 000000000..3d8a5a750 --- /dev/null +++ b/public/12.72db7f7146e96df8b3df.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/lib/filemanager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignUp.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/pages/loginPage.ts"],"names":["blobSupported","e","this","fileWriter","bytes","Blob","then","arr","write","mimeType","saveFileCallback","blobParts","part","push","truncate","length","finalize","saveToStorage","blob","dbName","useStorage","test","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","match","response","put","fileName","method","get","Response","headers","size","save","callback","Promise","resolve","reject","rejected","timeout","setTimeout","undefined","res","err","clearTimeout","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","all","map","storage","deleteAll","rippleClickId","ripple","elem","onEnd","prepend","querySelector","classList","add","r","document","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","remove","delay","Math","max","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","abs","height","width","x","y","style","append","isRippleUnneeded","target","includes","tagName","touchEnd","addEventListener","settings","animationsEnabled","touches","once","cancelBubble","stopPropagation","passive","button","dataset","authCode","page","imported","className","withInputWrapper","titleLangKey","subtitleLangKey","imageDiv","title","avatarPreview","id","addIco","appProfileManager","default","uploadAvatar","_uploadAvatar","handleInput","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","wrapEmojiText","label","maxLength","btnSignUp","btnI18n","IntlElement","key","element","inputWrapper","container","input","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","invokeApi","_","setUser","user","inputFile","uploadProfilePhoto","finally","m","mount","removeAttribute","type","_authCode","pushToState","CLICK_EVENT_NAME","attachClickEvent","options","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","asDiv","icon","noRipple","rippleSquare","onlyMobile","setAttribute","text","putPreloader","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","parentElement","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","isMobile","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","removeManual","capture","onCancel","replaceContent","node","firstChild","lastChild","replaceWith","textContent","init","findUpAttribute","preventDefault","originalEvent","clipboardData","getData","entities","parseEntities","filter","wrapRichText","noLinks","wrappingDraft","execCommand","InputState","required","validate","showLengthOn","min","round","placeholder","plainText","processInput","labelText","firstElementChild","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","border","setLabel","labelEl","showingLength","wasError","inputLength","getRichValue","diff","isError","toggle","select","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","newHeight","currentHeight","transitionDuration","log","setValueSilently","fireFakeInput","originalValue","isValid","isChanged","silent","wrapDraftText","setDraftValue","state","Error","Valid","setState","appNavigationController","navigations","manual","debug","currentHash","location","hash","isPossibleSwipe","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","good","noBlurOnPop","i","index","ret","findItemByType","backByItem","indexOf","splice","noHistory","origin","pathname","single","simulateEvent","event","Event","bubbles","cancelable","SetTransition","forwards","onTransitionEnd","useRafs","raf","cancelAnimationFrame","afterTimeout","sequentialDom","promises","scheduled","kind","promise","scheduleFlush","do","read","field","withEntities","lines","line","join","combineSameEntities","isSwipingBackSafari","TouchEvent","attribute","closest","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","getRichElementValue","selNode","selOffset","offset","nodeType","nodeValue","substr","parentNode","tag","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","HTMLImageElement","alt","curChild","nextSibling","hasAttribute","LoginPage","subtitle"],"mappings":"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","file":"12.72db7f7146e96df8b3df.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { blobConstruct, readBlobAsUint8Array } from \"../helpers/blob\";\r\n\r\nexport class FileManager {\r\n public blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport FileManager from './filemanager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.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 elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.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(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nconst Button = (className: string, options: 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 const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n //console.log('document paste');\r\n\r\n //console.log('messageInput paste');\r\n\r\n e.preventDefault();\r\n // @ts-ignore\r\n let text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n\r\n let entities = RichTextProcessor.parseEntities(text);\r\n //console.log('messageInput paste', text, entities);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n //text = RichTextProcessor.wrapEmojiText(text);\r\n text = RichTextProcessor.wrapRichText(text, {entities, noLinks: true, wrappingDraft: true});\r\n\r\n // console.log('messageInput paste after', text);\r\n\r\n // @ts-ignore\r\n //let html = (e.originalEvent || e).clipboardData.getData('text/html');\r\n\r\n // @ts-ignore\r\n //console.log('paste text', text, );\r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: true,\r\n required?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\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' | 'global-search' | 'voice',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n 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","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } 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 promise = isInDOM(element) ? this.mutate() : Promise.resolve();\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 private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityPre' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName';\r\n};\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"font-weight\"], b',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike',\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};\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n const nodeValue = node.nodeValue;\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.trim()) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest && closest.getAttribute('contenteditable') === null) {\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (parentElement as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: parentElement.dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = (selNode === node);\r\n const isBlock = node.tagName === 'DIV' || node.tagName === 'P';\r\n if(isBlock && line.length || node.tagName === 'BR') {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n 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(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/13.a60e06bd2a9f185ee65e.chunk.js b/public/13.a60e06bd2a9f185ee65e.chunk.js deleted file mode 100644 index 2950fabba..000000000 --- a/public/13.a60e06bd2a9f185ee65e.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[13,16,17,21,30],{109:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(51);class a{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const n=e.input;n.addEventListener("blur",()=>{this.playAnimation(0)}),n.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.b.loadAnimationFromURL({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"assets/img/TwoFactorSetupMonkeyIdle.tgs").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.b.waitForFirstFrame(e))),i.b.loadAnimationFromURL({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"assets/img/TwoFactorSetupMonkeyTracking.tgs").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.b.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},110:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(38);class a extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const a=this.value.length;if(a===e.length)e.onFill(this.value);else if(a===n)return;n=a})}}},18:function(e,t,n){"use strict";n.r(t),n.d(t,"ripple",(function(){return c}));var i=n(6),a=n(58),s=n(1),o=n(15);let r=0;function c(e,t=(()=>Promise.resolve()),n=null,c=!1){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let l=document.createElement("div");l.classList.add("c-ripple");let d;e.classList.contains("rp-square")&&l.classList.add("is-square"),e[c?"prepend":"append"](l);const u=(e,i)=>{const o=Date.now(),c=document.createElement("div"),u=r++,h=1e3*+window.getComputedStyle(l).getPropertyValue("--ripple-duration").replace("s","");d=()=>{let e=Date.now()-o;const t=()=>{a.a.mutate(()=>{c.remove()}),n&&n(u)};if(ec.classList.add("hiding"),Math.max(n-h/2,0)),setTimeout(t,n)}else c.classList.add("hiding"),setTimeout(t,h/2);s.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",d),d=null,p=!1},t&&t(u),window.requestAnimationFrame(()=>{const t=l.getBoundingClientRect();c.classList.add("c-ripple__circle");const n=e-t.left,a=i-t.top,s=Math.sqrt(Math.pow(Math.abs(a-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),o=n-s/2,r=a-s/2;c.style.width=c.style.height=s+"px",c.style.left=o+"px",c.style.top=r+"px",l.append(c)})},h=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==l);let p=!1;if(s.IS_TOUCH_SUPPORTED){let t=()=>{d&&d()};e.addEventListener("touchstart",n=>{if(!o.default.settings.animationsEnabled)return;if(n.touches.length>1||p||h(n))return;p=!0;let{clientX:i,clientY:a}=n.touches[0];u(i,a),e.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",n=>{n.cancelBubble=!0,n.stopPropagation(),t(),e.removeEventListener("touchend",t)},{once:!0})},{passive:!0})}else e.addEventListener("mousedown",t=>{if(![0,2].includes(t.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===e.dataset.ripple||h(t))return;if(p)return void(p=!1);let{clientX:n,clientY:i}=t;u(n,i),window.addEventListener("mouseup",d,{once:!0,passive:!0}),window.addEventListener("contextmenu",d,{once:!0,passive:!0})},{passive:!0})}},20:function(e,t,n){"use strict";n.r(t);var i=n(35),a=n(49),s=n(17),o=n(32),r=n(31),c=n(62),l=n(38),d=n(53),u=n(33),h=n(87),p=n(1),m=n(8),g=n(16),f=n(51),v=n(18),b=n(61),y=n(6),E=n(66),w=n(98),L=n(115),_=n(22),O=n(92),S=n(5),T=n(30),j=n(36),k=n(59),P=n(65),x=n(100),C=n(91),A=n(52),I=n(80),D=n(15),R=n(121),F=n(10),N=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{c(i.next(e))}catch(e){s(e)}}function r(e){try{c(i.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}c((i=i.apply(e,t||[])).next())}))};let M,H=null;const U=new c.a("page-sign",!0,()=>{const e=()=>{t=g.default.countriesList.filter(e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)}).sort((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name))};let t;e(),D.default.addEventListener("language_change",()=>{e()});const c=new Map;let v,B;const q=document.createElement("div");q.classList.add("input-wrapper");const z=new l.b({label:"Login.CountrySelectorLabel",name:Object(E.b)()});z.container.classList.add("input-select");const Q=z.input,V=document.createElement("div");V.classList.add("select-wrapper","z-depth-3","hide");const X=document.createElement("span");X.classList.add("arrow","arrow-down"),z.container.append(X);const W=document.createElement("ul");V.appendChild(W);new a.b(V);let Y=()=>{Y=null,t.forEach(e=>{const t=Object(C.c)(e.iso2),n=[];e.country_codes.forEach(i=>{const a=document.createElement("li");let s=r.a.wrapEmojiText(t);if(F.a){const e=document.createElement("span");e.innerHTML=s,a.append(e)}else a.innerHTML=s;const o=Object(g.i18n)(e.default_name);o.dataset.defaultName=e.default_name,a.append(o);const c=document.createElement("span");c.classList.add("phone-code"),c.innerText="+"+i.country_code,a.appendChild(c),n.push(a),W.append(a)}),c.set(e.iso2,n)}),W.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(b.a)(e.target,"LI");$(t)}),z.container.appendChild(V)};const $=e=>{const n=e.childNodes[1].dataset.defaultName,i=e.querySelector(".phone-code").innerText,a=i.replace(/\D/g,"");Object(j.a)(Q,Object(g.i18n)(n)),Object(A.a)(Q,"input"),v=t.find(e=>e.default_name===n),B=v.country_codes.find(e=>e.country_code===a),ee.value=ee.lastValue=i,Z(),setTimeout(()=>{te.focus(),Object(x.a)(te,!0)},0)};let J;Y(),Q.addEventListener("focus",(function(e){Y?Y():t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout(J),J=void 0,V.classList.remove("hide"),V.offsetWidth,V.classList.add("active"),z.select(),Object(h.b)(U.pageEl.parentElement.parentElement,Q,"start",4),setTimeout(()=>{K||(document.addEventListener("mousedown",G,{capture:!0}),K=!0)},0)}));let K=!1;const G=e=>{Object(y.a)(e.target,"input-select")||e.target!==Q&&(Z(),document.removeEventListener("mousedown",G,{capture:!0}),K=!1)},Z=()=>{void 0===J&&(V.classList.remove("active"),J=window.setTimeout(()=>{V.classList.add("hide"),J=void 0},200))};Q.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let i=z.value.toLowerCase(),a=[];t.forEach(e=>{let t=!![e.name,e.default_name].filter(Boolean).find(e=>-1!==e.toLowerCase().indexOf(i));c.get(e.iso2).forEach(e=>e.style.display=t?"":"none"),t&&a.push(e)}),0===a.length?t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}):1===a.length&&"Enter"===n&&$(c.get(a[0].iso2)[0])}),X.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),Q.matches(":focus")?Q.blur():Q.focus()}));const ee=new R.a({onInput:e=>{f.b.loadLottieWorkers();const{country:t,code:n}=e||{};let i=t?t.name||t.default_name:"";i===z.value||v&&t&&n&&(v===t||B.country_code===n.country_code)||(Object(j.a)(Q,t?Object(g.i18n)(t.default_name):i),v=t,B=n),t||ee.value.length-1>1?H.style.visibility="":H.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!H.style.visibility&&"Enter"===e.key)return ie()});const ne=new d.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.checked;s.default.pushToState("keepSigned",e),w.a.toggleStorage(e),L.a.toggleStorage(e),o.a.toggleStorage(e),P.a.toggleStorage(e)}),s.default.getState().then(e=>{s.default.storage.isAvailable()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),H=Object(u.a)("btn-primary btn-color-primary",{text:"Login.Next"}),H.style.visibility="hidden";const ie=e=>{e&&Object(S.a)(e);const t=Object(k.a)([H,M],!0);Object(j.a)(H,Object(g.i18n)("PleaseWait")),Object(i.f)(H);let a=ee.value;o.a.invokeApi("auth.sendCode",{phone_number:a,api_id:m.a.id,api_hash:m.a.hash,settings:{_:"codeSettings"}}).then(e=>{n.e(21).then(n.bind(null,23)).then(t=>t.default.mount(Object.assign(e,{phone_number:a})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(j.a)(ee.label,Object(g.i18n)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(j.a)(H,Object(g.i18n)("Login.Next"));break;default:console.error("auth.sendCode error:",e),H.innerText=e.type}})};Object(T.b)(H,ie),M=Object(u.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});M.addEventListener("click",()=>{_.default.mount()}),q.append(z.container,ee.container,ne.label,H,M);const ae=document.createElement("h4");ae.classList.add("text-center"),Object(g._i18n)(ae,"Login.Title");const se=document.createElement("div");se.classList.add("subtitle","text-center"),Object(g._i18n)(se,"Login.StartText"),U.pageEl.querySelector(".container").append(ae,se,q);p.IS_TOUCH_SUPPORTED||setTimeout(()=>{te.focus()},0),Object(O.a)(q),o.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=I.a.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&g.default.getLangPack(n.lang_code).then(()=>{Object(A.a)(te,"input")});const i=new Set([1,2,3,4,5]),a=[e.this_dc];let s;return e.nearest_dc!==e.this_dc&&(s=o.a.getNetworker(e.nearest_dc).then(()=>{a.push(e.nearest_dc)})),(s||Promise.resolve()).then(()=>{a.forEach(e=>{i.delete(e)});const e=[...i],t=()=>N(void 0,void 0,void 0,(function*(){const n=e.shift();if(!n)return;const i=`dc${n}_auth_key`;if(yield P.a.get(i))return t();setTimeout(()=>{o.a.getNetworker(n).finally(t)},3e3)}));t()}),e}).then(e=>{z.value.length||ee.value.length||$(c.get(e.country)[0])})},()=>{H&&(Object(j.a)(H,Object(g.i18n)("Login.Next")),Object(v.ripple)(H,void 0,void 0,!0),H.removeAttribute("disabled")),M&&M.removeAttribute("disabled"),s.default.pushToState("authState",{_:"authStateSignIn"})});t.default=U},22:function(e,t,n){"use strict";n.r(t);var i=n(32),a=n(62),s=n(68),o=n(75),r=n(8),c=n(33),l=n(16),d=n(17),u=n(15),h=n(35),p=n(92),m=n(81),g=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{c(i.next(e))}catch(e){s(e)}}function r(e){try{c(i.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}c((i=i.apply(e,t||[])).next())}))};let f;const v=new a.a("page-signQR",!0,()=>f,()=>{f||(f=g(void 0,void 0,void 0,(function*(){const e=v.pageEl.querySelector(".auth-image");let t=Object(h.f)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const d=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(d),Object(p.a)(a);const b=e.parentElement,y=document.createElement("h4");Object(l._i18n)(y,"Login.QR.Title");const E=document.createElement("ol");E.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(l.i18n)(e)),E.append(t)}),b.append(y,E,a),d.addEventListener("click",()=>{Promise.all([n.e(3),n.e(30)]).then(n.bind(null,20)).then(e=>e.default.mount()),L=!0});const w=(yield Promise.all([n.e(10).then(n.t.bind(null,131,7))]))[0].default;let L=!1;u.default.addEventListener("user_auth",()=>{L=!0,f=null},{once:!0});let _,O={ignoreErrors:!0};const S=a=>g(void 0,void 0,void 0,(function*(){try{let c=yield i.a.invokeApi("auth.exportLoginToken",{api_id:r.a.id,api_hash:r.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===c._&&(O.dcId||(O.dcId=c.dc_id,i.a.setBaseDcId(c.dc_id)),c=yield i.a.invokeApi("auth.importLoginToken",{token:c.token},O)),"auth.loginTokenSuccess"===c._){const e=c.authorization;return i.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!_||!Object(o.b)(_,c.token)){_=c.token;let n="tg://login?token="+Object(o.d)(c.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,"");const i=window.getComputedStyle(document.documentElement),a=i.getPropertyValue("--surface-color").trim(),s=i.getPropertyValue("--primary-text-color").trim(),r=i.getPropertyValue("--primary-color").trim(),l=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${r}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),d=new w({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:l,dotsOptions:{color:s,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:a},qrOptions:{errorCorrectionLevel:"L"}});let u;d.append(e),e.lastChild.classList.add("qr-canvas"),u=d._drawingPromise?d._drawingPromise:Promise.race([Object(m.a)(1e3),new Promise(e=>{d._canvas._image.addEventListener("load",()=>{window.requestAnimationFrame(()=>e())},{once:!0})})]),yield u.then(()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout(()=>{n.style.display=""},150),setTimeout(()=>{n.style.animation=""},500),t=void 0}else Array.from(e.children).slice(0,-1).forEach(e=>{e.remove()})})}if(a){let e=Date.now()/1e3,t=c.expires-e-s.a.serverTimeOffset;yield Object(m.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(15).then(n.bind(null,21)).then(e=>e.default.mount()),L=!0,f=null;break;default:console.error("pageSignQR: default error:",e),L=!0}return!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(L=!1;!L&&!(yield S(!0)););}))}))),f.then(e=>{e()}),d.default.pushToState("authState",{_:"authStateSignQr"})});t.default=v},23:function(e,t,n){"use strict";n.r(t);var i=n(37),a=n(17),s=n(32),o=n(62),r=n(20),c=n(109),l=n(110),d=n(16),u=n(66),h=n(36),p=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{c(i.next(e))}catch(e){s(e)}}function r(e){try{c(i.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}c((i=i.apply(e,t||[])).next())}))};let m,g=null,f=null,v=null;const b=new o.a("page-authCode",!0,()=>{const e=g.type.length,t=new l.a({label:"Code",name:Object(u.b)(),length:e,onFill:e=>{o(e)}});m=t.input,b.pageEl.querySelector(".input-wrapper").append(t.container);b.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return r.default.mount()}));const a=()=>{setTimeout(()=>{y.remove()},300)},o=e=>{m.setAttribute("disabled","true");const i={phone_number:g.phone_number,phone_code_hash:g.phone_code_hash,phone_code:e};s.a.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then(e=>{switch(e._){case"auth.authorization":s.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>{e.default.mount()}),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(5),n.e(23)]).then(n.bind(null,25)).then(e=>{e.default.mount({phone_number:g.phone_number,phone_code_hash:g.phone_code_hash})}),a()}}).catch(e=>p(void 0,void 0,void 0,(function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(19).then(n.bind(null,21))).default.mount(),setTimeout(()=>{m.value=""},300);break;case"PHONE_CODE_EXPIRED":m.classList.add("error"),Object(h.a)(t.label,Object(d.i18n)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":m.classList.add("error"),Object(h.a)(t.label,Object(d.i18n)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),m.removeAttribute("disabled")})))},f=b.pageEl.querySelector(".auth-image"),v=i.b.isMobile?100:166,y=new c.a(t,v);return f.append(y.container),y.load()},e=>{if(g=e,f){m.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),m.dispatchEvent(e)}else f=b.pageEl.getElementsByClassName("phone")[0],v=b.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(f.innerText=g.phone_number,g.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[g.type._]}Object(h.a)(v,Object(d.i18n)(t,n)),a.default.pushToState("authState",{_:"authStateAuthCode",sentCode:e})},()=>{m.focus()});t.default=b},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}));var i=n(1),a=n(52);const s=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function o(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(s,t,n)}function r(e,t,n){e.removeEventListener(s,t,n)}function c(e){Object(a.a)(e,s)}},33:function(e,t,n){"use strict";var i=n(16),a=n(18);t.a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),Object(a.ripple)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append(Object(i.i18n)(t.text)),n}},35:function(e,t,n){"use strict";n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return g})),n.d(t,"d",(function(){return y})),n.d(t,"e",(function(){return E})),n.d(t,"b",(function(){return _})),n.d(t,"a",(function(){return O}));var i=n(29),a=n(5),s=n(30),o=n(37),r=n(1),c=n(0),l=n(15),d=n(48);function u(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function h(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,u(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=u;let p=e=>{let t=f.getBoundingClientRect(),{clientX:n,clientY:i}=e,a=n>=t.right?n-t.right:t.left-n,s=i>=t.bottom?i-t.bottom:t.top-i;(a>=100||s>=100)&&g()};const m=e=>{g()},g=()=>{f&&(f.classList.remove("active"),f.parentElement.classList.remove("menu-open"),b&&b.remove(),f=null,l.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(s.a,m),c.IS_MOBILE_SAFARI||d.a.removeByType("menu")};window.addEventListener("resize",()=>{f&&g()});let f=null,v=null,b=null;function y(e,t){g(),c.IS_MOBILE_SAFARI||d.a.pushItem({type:"menu",onPop:e=>{g()}}),f=e,f.classList.add("active"),f.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(s.a,e=>{Object(a.a)(e),m()})),f.parentElement.insertBefore(b,f),v=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(s.a,m),l.default.dispatchEvent("context_menu_toggle",!0)}function E({pageX:e,pageY:t},n,i){let{scrollWidth:a,scrollHeight:s}=n;const r=document.body.getBoundingClientRect(),c=r.width,l=r.height;i=o.b.isMobile?"right":"left";let d="top";const u={x:{left:e,right:e-a},intermediateX:"right"===i?8:c-a-8,y:{top:t,bottom:t-s},intermediateY:t=8},p={top:u.y.top+s+8<=l,bottom:u.y.bottom-8>=8};{let e;e=h[i]?u.x[i]:(i="center",u.intermediateX),n.style.left=e+"px"}{let e;e=p[d]?u.y[d]:(d="center",u.intermediateY),n.style.top=e+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===d?d:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let w=!1,L=0;function _(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,w=!1},400),w=!0}function O(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e),s=n?n.removeManual.bind(n,e):e.removeEventListener.bind(e);if(c.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const o={capture:!0},r=()=>{clearTimeout(n),s("touchmove",r,o),s("touchend",r,o),s("touchcancel",r,o)};i("touchstart",s=>{s.touches.length>1?r():(i("touchmove",r,o),i("touchend",r,o),i("touchcancel",r,o),n=window.setTimeout(()=>{w?r():(t(s.touches[0]),r(),f&&e.addEventListener("touchend",a.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{t(n),f&&e.addEventListener("touchend",a.a,{once:!0})}:t)}},48:function(e,t,n){"use strict";var i=n(29),a=n(0),s=n(43),o=n(7),r=n(5),c=n(44),l=n(71);const d=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(s.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!e,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),a.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(l.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",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||Object(o.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return this.manual=!0,this.navigations.splice(t.index,1),void this.handleItem(t.item)}history.back()}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){Object(c.e)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===e&&(this.navigations.splice(n,1),t))break}}};i.a.appNavigationController=d,t.a=d},52:function(e,t,n){"use strict";function i(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)}n.d(t,"a",(function(){return i}))},58:function(e,t,n){"use strict";var i=n(41),a=n(45),s=n(29),o=n(60);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=Object(a.a)()),void 0!==t&&n.then(()=>t()),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=Object(o.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&n.then(()=>t()),n}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={}}))}};s.a&&(s.a.sequentialDom=r),t.a=r},68:function(e,t,n){"use strict";var i=n(29),a=n(65),s=n(32);const o=new class{constructor(){this.serverTimeOffset=0,a.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),s.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=o),t.a=o},71:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(0);function a(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},75:function(e,t,n){"use strict";function i(e){const t=e.length,n=new Array(t);for(let i=0;i>>t&24),2!==t&&i-s!=1||(n+=String.fromCharCode(o(a>>>18&63),o(a>>>12&63),o(a>>>6&63),o(63&a)),a=0);return n.replace(/A(?=A$|$)/g,"=")}function o(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function r(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ie+(t.byteLength||t.length),0),n=new Uint8Array(t);let i=0;return e.forEach(e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),n}n.d(t,"e",(function(){return i})),n.d(t,"c",(function(){return a})),n.d(t,"d",(function(){return s})),n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return c}))},92:function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var i=n(5),a=n(30),s=n(9),o=n(16),r=n(32),c=n(15),l=n(33),d=n(35);let u,h=!1;function p(e){h||(u||(u=r.a.getConfig().then(e=>e.suggested_lang_code!==o.default.lastRequestedLangCode?Promise.all([e,o.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const r=[];n.forEach(e=>{const t=o.default.strings.get(e.key);t&&(r.push(t),o.default.strings.set(e.key,e))});const u=Object(l.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(s.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),c.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),r.forEach(e=>{o.default.strings.set(e.key,e)}),Object(a.b)(u,e=>{Object(i.a)(e),h=!0,u.disabled=!0,Object(d.f)(u),o.default.getLangPack(t.suggested_lang_code)})})}}}]); -//# sourceMappingURL=13.a60e06bd2a9f185ee65e.chunk.js.map \ No newline at end of file diff --git a/public/13.a60e06bd2a9f185ee65e.chunk.js.map b/public/13.a60e06bd2a9f185ee65e.chunk.js.map deleted file mode 100644 index 3a10349ce..000000000 --- a/public/13.a60e06bd2a9f185ee65e.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignIn.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/pages/pageAuthCode.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/components/languageChangeButton.ts"],"names":["TrackingMonkey","inputField","size","max","needFrame","this","container","document","createElement","classList","add","input","addEventListener","playAnimation","e","value","length","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","loadPromise","Promise","all","loadAnimationFromURL","loop","autoplay","width","height","then","waitForFirstFrame","_animation","currentFrame","pause","remove","CodeInputField","options","super","plainText","type","setAttribute","autocomplete","lastLength","setLabel","replace","slice","setValueSilently","onFill","rippleClickId","ripple","elem","callback","resolve","onEnd","prepend","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","elapsedTime","cb","mutate","delay","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","abs","x","y","append","isRippleUnneeded","target","includes","tagName","touchEnd","settings","animationsEnabled","touches","once","cancelBubble","stopPropagation","passive","button","dataset","btnQr","btnNext","page","setCountries","countries","countriesList","filter","country","pFlags","hidden","sort","a","b","name","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","countryInputField","label","countryInput","selectWrapper","arrowDown","selectList","appendChild","initSelect","forEach","c","emoji","iso2","liArr","country_codes","countryCode","li","wrapped","wrapEmojiText","spanEmoji","innerHTML","el","defaultName","span","innerText","country_code","push","set","selectCountryByTarget","childNodes","phoneCode","find","_countryCode","telInputField","lastValue","hidePicker","telEl","focus","hideTimeout","get","clearTimeout","undefined","offsetWidth","select","pageEl","parentElement","mouseDownHandlerAttached","onMouseDown","capture","key","ctrlKey","_value","toLowerCase","matches","good","Boolean","str","indexOf","preventDefault","blur","onInput","formatted","loadLottieWorkers","code","countryName","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","pushToState","toggleStorage","getState","state","storage","isAvailable","toggle","phone_number","invokeApi","api_id","id","api_hash","hash","_","m","default","mount","Object","assign","catch","err","setError","console","error","h4","subtitle","nearestDcResult","langPack","getFromCache","getLangPack","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","getNetworker","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute","cachedPromise","imageDiv","preloader","btnBack","helpList","QRCodeStyling","prevToken","ignoreErrors","iterate","isLoop","loginToken","except_ids","dc_id","setBaseDcId","token","authorization","setUser","user","url","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","result","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","_canvas","_image","children","Array","from","timestamp","diff","expires","serverTimeOffset","warn","handled","func","codeInput","authCode","headerElement","sentTypeElement","CODELENGTH","codeInputField","submitCode","cleanup","monkey","params","phone_code_hash","phone_code","response","isMobile","load","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","args","sentCode","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","className","asDiv","icon","noRipple","rippleSquare","onlyMobile","disabled","putPreloader","returnDiv","html","div","insertAdjacentHTML","lastElementChild","setButtonLoader","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","menuOverlay","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","element","removeManual","timeout","onCancel","appNavigationController","navigations","manual","log","debug","currentHash","location","isPossibleSwipe","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","noBlurOnPop","i","index","ret","findItemByType","splice","noHistory","origin","pathname","single","simulateEvent","event","Event","bubbles","cancelable","sequentialDom","promises","raf","scheduled","kind","scheduleFlush","do","read","write","serverTimeManager","to","addTaskListener","task","payload","isSwipingBackSafari","TouchEvent","bytesToHex","bytes","arr","toString","join","bytesFromHex","hexString","len","Uint8Array","ceil","start","parseInt","charAt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","String","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","bufferConcats","reduce","acc","v","byteLength","tmp","ArrayBuffer","getLanguageChangeButton","appendTo","getConfig","config","suggested_lang_code","lastRequestedLangCode","getStrings","getCacheLangPack","strings","backup","string","backupString","btnChangeLanguage"],"mappings":"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","file":"13.a60e06bd2a9f185ee65e.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationFromURL({\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 }, 'assets/img/TwoFactorSetupMonkeyIdle.tgs').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.loadAnimationFromURL({\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 }, 'assets/img/TwoFactorSetupMonkeyTracking.tgs').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.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 elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.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(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/lottieLoader\";\r\nimport { ripple } from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\r\n // const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter(country => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll(page.pageEl.parentElement.parentElement, countryInput, 'start', 4);\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n let good = !![c.name, c.default_name].filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch(err => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then(module => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach(dcId => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n apiManager.getNetworker(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport { bytesCmp, bytesToBase64 } from '../helpers/bytes';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport { pause } from '../helpers/schedulers/pause';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + encoded.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/\\=+$/, \"\");\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then(m => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nconst Button = (className: string, options: 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 const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\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' | 'global-search' | 'voice',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(ret.index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(ret.index, 1);\r\n this.handleItem(ret.item);\r\n return;\r\n //}\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n 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","export default function simulateEvent(elem: HTMLElement, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } 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 promise = isInDOM(element) ? this.mutate() : Promise.resolve();\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 private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\n * 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\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().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"],"sourceRoot":""} \ No newline at end of file diff --git a/public/13.e32751cf9be91bb5497a.chunk.js b/public/13.e32751cf9be91bb5497a.chunk.js new file mode 100644 index 000000000..89fcbaefe --- /dev/null +++ b/public/13.e32751cf9be91bb5497a.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[13,16,17,21,30],{112:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(51);class a{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const n=e.input;n.addEventListener("blur",()=>{this.playAnimation(0)}),n.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.a.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.a.waitForFirstFrame(e))),i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.a.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},113:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(38);class a extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const a=this.value.length;if(a===e.length)e.onFill(this.value);else if(a===n)return;n=a})}}},18:function(e,t,n){"use strict";n.r(t),n.d(t,"ripple",(function(){return c}));var i=n(6),a=n(60),s=n(1),o=n(15);let r=0;function c(e,t=(()=>Promise.resolve()),n=null,c=!1){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let l=document.createElement("div");l.classList.add("c-ripple");let d;e.classList.contains("rp-square")&&l.classList.add("is-square"),e[c?"prepend":"append"](l);const u=(e,i)=>{const o=Date.now(),c=document.createElement("div"),u=r++,h=1e3*+window.getComputedStyle(l).getPropertyValue("--ripple-duration").replace("s","");d=()=>{let e=Date.now()-o;const t=()=>{a.a.mutate(()=>{c.remove()}),n&&n(u)};if(ec.classList.add("hiding"),Math.max(n-h/2,0)),setTimeout(t,n)}else c.classList.add("hiding"),setTimeout(t,h/2);s.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",d),d=null,p=!1},t&&t(u),window.requestAnimationFrame(()=>{const t=l.getBoundingClientRect();c.classList.add("c-ripple__circle");const n=e-t.left,a=i-t.top,s=Math.sqrt(Math.pow(Math.abs(a-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),o=n-s/2,r=a-s/2;c.style.width=c.style.height=s+"px",c.style.left=o+"px",c.style.top=r+"px",l.append(c)})},h=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==l);let p=!1;if(s.IS_TOUCH_SUPPORTED){let t=()=>{d&&d()};e.addEventListener("touchstart",n=>{if(!o.default.settings.animationsEnabled)return;if(n.touches.length>1||p||h(n))return;p=!0;let{clientX:i,clientY:a}=n.touches[0];u(i,a),e.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",n=>{n.cancelBubble=!0,n.stopPropagation(),t(),e.removeEventListener("touchend",t)},{once:!0})},{passive:!0})}else e.addEventListener("mousedown",t=>{if(![0,2].includes(t.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===e.dataset.ripple||h(t))return;if(p)return void(p=!1);let{clientX:n,clientY:i}=t;u(n,i),window.addEventListener("mouseup",d,{once:!0,passive:!0}),window.addEventListener("contextmenu",d,{once:!0,passive:!0})},{passive:!0})}},20:function(e,t,n){"use strict";n.r(t);var i=n(35),a=n(47),s=n(17),o=n(33),r=n(31),c=n(64),l=n(38),d=n(55),u=n(34),h=n(89),p=n(1),m=n(8),g=n(16),f=n(51),v=n(18),b=n(63),y=n(6),E=n(65),w=n(99),L=n(119),_=n(22),O=n(94),S=n(5),T=n(30),k=n(36),j=n(58),P=n(67),x=n(100),A=n(93),C=n(52),I=n(80),D=n(15),R=n(125),N=n(10),F=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{c(i.next(e))}catch(e){s(e)}}function r(e){try{c(i.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}c((i=i.apply(e,t||[])).next())}))};let M,H=null;const B=new c.a("page-sign",!0,()=>{const e=()=>{t=g.default.countriesList.filter(e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)}).sort((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name))};let t;e(),D.default.addEventListener("language_change",()=>{e()});const c=new Map;let v,U;const q=document.createElement("div");q.classList.add("input-wrapper");const z=new l.b({label:"Login.CountrySelectorLabel",name:Object(E.b)()});z.container.classList.add("input-select");const Q=z.input,V=document.createElement("div");V.classList.add("select-wrapper","z-depth-3","hide");const X=document.createElement("span");X.classList.add("arrow","arrow-down"),z.container.append(X);const W=document.createElement("ul");V.appendChild(W);new a.b(V);let Y=()=>{Y=null,t.forEach(e=>{const t=Object(A.c)(e.iso2),n=[];e.country_codes.forEach(i=>{const a=document.createElement("li");let s=r.a.wrapEmojiText(t);if(N.a){const e=document.createElement("span");e.innerHTML=s,a.append(e)}else a.innerHTML=s;const o=Object(g.i18n)(e.default_name);o.dataset.defaultName=e.default_name,a.append(o);const c=document.createElement("span");c.classList.add("phone-code"),c.innerText="+"+i.country_code,a.appendChild(c),n.push(a),W.append(a)}),c.set(e.iso2,n)}),W.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(b.a)(e.target,"LI");$(t)}),z.container.appendChild(V)};const $=e=>{const n=e.childNodes[1].dataset.defaultName,i=e.querySelector(".phone-code").innerText,a=i.replace(/\D/g,"");Object(k.a)(Q,Object(g.i18n)(n)),Object(C.a)(Q,"input"),v=t.find(e=>e.default_name===n),U=v.country_codes.find(e=>e.country_code===a),ee.value=ee.lastValue=i,Z(),setTimeout(()=>{te.focus(),Object(x.a)(te,!0)},0)};let J;Y(),Q.addEventListener("focus",(function(e){Y?Y():t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout(J),J=void 0,V.classList.remove("hide"),V.offsetWidth,V.classList.add("active"),z.select(),Object(h.b)(B.pageEl.parentElement.parentElement,Q,"start",4),setTimeout(()=>{K||(document.addEventListener("mousedown",G,{capture:!0}),K=!0)},0)}));let K=!1;const G=e=>{Object(y.a)(e.target,"input-select")||e.target!==Q&&(Z(),document.removeEventListener("mousedown",G,{capture:!0}),K=!1)},Z=()=>{void 0===J&&(V.classList.remove("active"),J=window.setTimeout(()=>{V.classList.add("hide"),J=void 0},200))};Q.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let i=z.value.toLowerCase(),a=[];t.forEach(e=>{let t=!![e.name,e.default_name].filter(Boolean).find(e=>-1!==e.toLowerCase().indexOf(i));c.get(e.iso2).forEach(e=>e.style.display=t?"":"none"),t&&a.push(e)}),0===a.length?t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}):1===a.length&&"Enter"===n&&$(c.get(a[0].iso2)[0])}),X.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),Q.matches(":focus")?Q.blur():Q.focus()}));const ee=new R.a({onInput:e=>{f.a.loadLottieWorkers();const{country:t,code:n}=e||{};let i=t?t.name||t.default_name:"";i===z.value||v&&t&&n&&(v===t||U.country_code===n.country_code)||(Object(k.a)(Q,t?Object(g.i18n)(t.default_name):i),v=t,U=n),t||ee.value.length-1>1?H.style.visibility="":H.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!H.style.visibility&&"Enter"===e.key)return ie()});const ne=new d.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.checked;s.default.pushToState("keepSigned",e),w.a.toggleStorage(e),L.a.toggleStorage(e),o.a.toggleStorage(e),P.a.toggleStorage(e)}),s.default.getState().then(e=>{s.default.storage.isAvailable()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),H=Object(u.a)("btn-primary btn-color-primary",{text:"Login.Next"}),H.style.visibility="hidden";const ie=e=>{e&&Object(S.a)(e);const t=Object(j.a)([H,M],!0);Object(k.a)(H,Object(g.i18n)("PleaseWait")),Object(i.f)(H);let a=ee.value;o.a.invokeApi("auth.sendCode",{phone_number:a,api_id:m.a.id,api_hash:m.a.hash,settings:{_:"codeSettings"}}).then(e=>{n.e(21).then(n.bind(null,23)).then(t=>t.default.mount(Object.assign(e,{phone_number:a})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(k.a)(ee.label,Object(g.i18n)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(k.a)(H,Object(g.i18n)("Login.Next"));break;default:console.error("auth.sendCode error:",e),H.innerText=e.type}})};Object(T.b)(H,ie),M=Object(u.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});M.addEventListener("click",()=>{_.default.mount()}),q.append(z.container,ee.container,ne.label,H,M);const ae=document.createElement("h4");ae.classList.add("text-center"),Object(g._i18n)(ae,"Login.Title");const se=document.createElement("div");se.classList.add("subtitle","text-center"),Object(g._i18n)(se,"Login.StartText"),B.pageEl.querySelector(".container").append(ae,se,q);p.IS_TOUCH_SUPPORTED||setTimeout(()=>{te.focus()},0),Object(O.a)(q),o.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=I.a.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&g.default.getLangPack(n.lang_code).then(()=>{Object(C.a)(te,"input")});const i=new Set([1,2,3,4,5]),a=[e.this_dc];let s;return e.nearest_dc!==e.this_dc&&(s=o.a.getNetworker(e.nearest_dc).then(()=>{a.push(e.nearest_dc)})),(s||Promise.resolve()).then(()=>{a.forEach(e=>{i.delete(e)});const e=[...i],t=()=>F(void 0,void 0,void 0,(function*(){const n=e.shift();if(!n)return;const i=`dc${n}_auth_key`;if(yield P.a.get(i))return t();setTimeout(()=>{o.a.getNetworker(n).finally(t)},3e3)}));t()}),e}).then(e=>{z.value.length||ee.value.length||$(c.get(e.country)[0])})},()=>{H&&(Object(k.a)(H,Object(g.i18n)("Login.Next")),Object(v.ripple)(H,void 0,void 0,!0),H.removeAttribute("disabled")),M&&M.removeAttribute("disabled"),s.default.pushToState("authState",{_:"authStateSignIn"})});t.default=B},22:function(e,t,n){"use strict";n.r(t);var i=n(33),a=n(64),s=n(70),o=n(76),r=n(8),c=n(34),l=n(16),d=n(17),u=n(15),h=n(35),p=n(94),m=n(82),g=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{c(i.next(e))}catch(e){s(e)}}function r(e){try{c(i.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}c((i=i.apply(e,t||[])).next())}))};let f;const v=new a.a("page-signQR",!0,()=>f,()=>{f||(f=g(void 0,void 0,void 0,(function*(){const e=v.pageEl.querySelector(".auth-image");let t=Object(h.f)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const d=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(d),Object(p.a)(a);const b=e.parentElement,y=document.createElement("h4");Object(l._i18n)(y,"Login.QR.Title");const E=document.createElement("ol");E.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(l.i18n)(e)),E.append(t)}),b.append(y,E,a),d.addEventListener("click",()=>{Promise.all([n.e(3),n.e(30)]).then(n.bind(null,20)).then(e=>e.default.mount()),L=!0});const w=(yield Promise.all([n.e(10).then(n.t.bind(null,134,7))]))[0].default;let L=!1;u.default.addEventListener("user_auth",()=>{L=!0,f=null},{once:!0});let _,O={ignoreErrors:!0};const S=a=>g(void 0,void 0,void 0,(function*(){try{let c=yield i.a.invokeApi("auth.exportLoginToken",{api_id:r.a.id,api_hash:r.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===c._&&(O.dcId||(O.dcId=c.dc_id,i.a.setBaseDcId(c.dc_id)),c=yield i.a.invokeApi("auth.importLoginToken",{token:c.token},O)),"auth.loginTokenSuccess"===c._){const e=c.authorization;return i.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!_||!Object(o.b)(_,c.token)){_=c.token;let n="tg://login?token="+Object(o.d)(c.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,"");const i=window.getComputedStyle(document.documentElement),a=i.getPropertyValue("--surface-color").trim(),s=i.getPropertyValue("--primary-text-color").trim(),r=i.getPropertyValue("--primary-color").trim(),l=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${r}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),d=new w({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:n,image:l,dotsOptions:{color:s,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:a},qrOptions:{errorCorrectionLevel:"L"}});let u;d.append(e),e.lastChild.classList.add("qr-canvas"),u=d._drawingPromise?d._drawingPromise:Promise.race([Object(m.a)(1e3),new Promise(e=>{d._canvas._image.addEventListener("load",()=>{window.requestAnimationFrame(()=>e())},{once:!0})})]),yield u.then(()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout(()=>{n.style.display=""},150),setTimeout(()=>{n.style.animation=""},500),t=void 0}else Array.from(e.children).slice(0,-1).forEach(e=>{e.remove()})})}if(a){let e=Date.now()/1e3,t=c.expires-e-s.a.serverTimeOffset;yield Object(m.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(15).then(n.bind(null,21)).then(e=>e.default.mount()),L=!0,f=null;break;default:console.error("pageSignQR: default error:",e),L=!0}return!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(L=!1;!L&&!(yield S(!0)););}))}))),f.then(e=>{e()}),d.default.pushToState("authState",{_:"authStateSignQr"})});t.default=v},23:function(e,t,n){"use strict";n.r(t);var i=n(37),a=n(17),s=n(33),o=n(64),r=n(20),c=n(112),l=n(113),d=n(16),u=n(65),h=n(36),p=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{c(i.next(e))}catch(e){s(e)}}function r(e){try{c(i.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}c((i=i.apply(e,t||[])).next())}))};let m,g=null,f=null,v=null;const b=new o.a("page-authCode",!0,()=>{const e=g.type.length,t=new l.a({label:"Code",name:Object(u.b)(),length:e,onFill:e=>{o(e)}});m=t.input,b.pageEl.querySelector(".input-wrapper").append(t.container);b.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return r.default.mount()}));const a=()=>{setTimeout(()=>{y.remove()},300)},o=e=>{m.setAttribute("disabled","true");const i={phone_number:g.phone_number,phone_code_hash:g.phone_code_hash,phone_code:e};s.a.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then(e=>{switch(e._){case"auth.authorization":s.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>{e.default.mount()}),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(5),n.e(23)]).then(n.bind(null,25)).then(e=>{e.default.mount({phone_number:g.phone_number,phone_code_hash:g.phone_code_hash})}),a()}}).catch(e=>p(void 0,void 0,void 0,(function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(19).then(n.bind(null,21))).default.mount(),setTimeout(()=>{m.value=""},300);break;case"PHONE_CODE_EXPIRED":m.classList.add("error"),Object(h.a)(t.label,Object(d.i18n)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":m.classList.add("error"),Object(h.a)(t.label,Object(d.i18n)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),m.removeAttribute("disabled")})))},f=b.pageEl.querySelector(".auth-image"),v=i.b.isMobile?100:166,y=new c.a(t,v);return f.append(y.container),y.load()},e=>{if(g=e,f){m.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),m.dispatchEvent(e)}else f=b.pageEl.getElementsByClassName("phone")[0],v=b.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(f.innerText=g.phone_number,g.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[g.type._]}Object(h.a)(v,Object(d.i18n)(t,n)),a.default.pushToState("authState",{_:"authStateAuthCode",sentCode:e})},()=>{m.focus()});t.default=b},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}));var i=n(1),a=n(52);const s=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function o(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(s,t,n)}function r(e,t,n){e.removeEventListener(s,t,n)}function c(e){Object(a.a)(e,s)}},34:function(e,t,n){"use strict";var i=n(16),a=n(18);t.a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),Object(a.ripple)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append(Object(i.i18n)(t.text)),n}},35:function(e,t,n){"use strict";n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return g})),n.d(t,"d",(function(){return y})),n.d(t,"e",(function(){return E})),n.d(t,"b",(function(){return _})),n.d(t,"a",(function(){return O}));var i=n(29),a=n(5),s=n(30),o=n(37),r=n(1),c=n(0),l=n(15),d=n(50);function u(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function h(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,u(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=u;let p=e=>{let t=f.getBoundingClientRect(),{clientX:n,clientY:i}=e,a=n>=t.right?n-t.right:t.left-n,s=i>=t.bottom?i-t.bottom:t.top-i;(a>=100||s>=100)&&g()};const m=e=>{g()},g=()=>{f&&(f.classList.remove("active"),f.parentElement.classList.remove("menu-open"),b&&b.remove(),f=null,l.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(s.a,m),c.IS_MOBILE_SAFARI||d.a.removeByType("menu")};window.addEventListener("resize",()=>{f&&g()});let f=null,v=null,b=null;function y(e,t){g(),c.IS_MOBILE_SAFARI||d.a.pushItem({type:"menu",onPop:e=>{g()}}),f=e,f.classList.add("active"),f.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(s.a,e=>{Object(a.a)(e),m()})),f.parentElement.insertBefore(b,f),v=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(s.a,m),l.default.dispatchEvent("context_menu_toggle",!0)}function E({pageX:e,pageY:t},n,i){let{scrollWidth:a,scrollHeight:s}=n;const r=document.body.getBoundingClientRect(),c=r.width,l=r.height;i=o.b.isMobile?"right":"left";let d="top";const u={x:{left:e,right:e-a},intermediateX:"right"===i?8:c-a-8,y:{top:t,bottom:t-s},intermediateY:t=8},p={top:u.y.top+s+8<=l,bottom:u.y.bottom-8>=8};{let e;e=h[i]?u.x[i]:(i="center",u.intermediateX),n.style.left=e+"px"}{let e;e=p[d]?u.y[d]:(d="center",u.intermediateY),n.style.top=e+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===d?d:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let w=!1,L=0;function _(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,w=!1},400),w=!0}function O(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e),s=n?n.removeManual.bind(n,e):e.removeEventListener.bind(e);if(c.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const o={capture:!0},r=()=>{clearTimeout(n),s("touchmove",r,o),s("touchend",r,o),s("touchcancel",r,o)};i("touchstart",s=>{s.touches.length>1?r():(i("touchmove",r,o),i("touchend",r,o),i("touchcancel",r,o),n=window.setTimeout(()=>{w?r():(t(s.touches[0]),r(),f&&e.addEventListener("touchend",a.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{t(n),f&&e.addEventListener("touchend",a.a,{once:!0})}:t)}},50:function(e,t,n){"use strict";var i=n(29),a=n(0),s=n(43),o=n(7),r=n(5),c=n(41),l=n(72);const d=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(s.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!e,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),a.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(l.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",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||Object(o.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){Object(c.e)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===e&&(this.navigations.splice(n,1),t))break}}};i.a.appNavigationController=d,t.a=d},52:function(e,t,n){"use strict";function i(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)}n.d(t,"a",(function(){return i}))},60:function(e,t,n){"use strict";var i=n(42),a=n(46),s=n(29),o=n(61);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=Object(a.a)()),void 0!==t&&n.then(()=>t()),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=Object(o.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&n.then(()=>t()),n}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={}}))}};s.a&&(s.a.sequentialDom=r),t.a=r},70:function(e,t,n){"use strict";var i=n(29),a=n(67),s=n(33);const o=new class{constructor(){this.serverTimeOffset=0,a.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),s.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=o),t.a=o},72:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(0);function a(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},76:function(e,t,n){"use strict";function i(e){const t=e.length,n=new Array(t);for(let i=0;i>>t&24),2!==t&&i-s!=1||(n+=String.fromCharCode(o(a>>>18&63),o(a>>>12&63),o(a>>>6&63),o(63&a)),a=0);return n.replace(/A(?=A$|$)/g,"=")}function o(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function r(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ie+(t.byteLength||t.length),0),n=new Uint8Array(t);let i=0;return e.forEach(e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),n}n.d(t,"e",(function(){return i})),n.d(t,"c",(function(){return a})),n.d(t,"d",(function(){return s})),n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return c}))},94:function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var i=n(5),a=n(30),s=n(9),o=n(16),r=n(33),c=n(15),l=n(34),d=n(35);let u,h=!1;function p(e){h||(u||(u=r.a.getConfig().then(e=>e.suggested_lang_code!==o.default.lastRequestedLangCode?Promise.all([e,o.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const r=[];n.forEach(e=>{const t=o.default.strings.get(e.key);t&&(r.push(t),o.default.strings.set(e.key,e))});const u=Object(l.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(s.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),c.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),r.forEach(e=>{o.default.strings.set(e.key,e)}),Object(a.b)(u,e=>{Object(i.a)(e),h=!0,u.disabled=!0,Object(d.f)(u),o.default.getLangPack(t.suggested_lang_code)})})}}}]); +//# sourceMappingURL=13.e32751cf9be91bb5497a.chunk.js.map \ No newline at end of file diff --git a/public/13.e32751cf9be91bb5497a.chunk.js.map b/public/13.e32751cf9be91bb5497a.chunk.js.map new file mode 100644 index 000000000..2ea02838c --- /dev/null +++ b/public/13.e32751cf9be91bb5497a.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignIn.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/pages/pageAuthCode.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/components/languageChangeButton.ts"],"names":["TrackingMonkey","inputField","size","max","needFrame","this","container","document","createElement","classList","add","input","addEventListener","playAnimation","e","value","length","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","loadPromise","Promise","all","loadAnimationAsAsset","loop","autoplay","width","height","then","waitForFirstFrame","_animation","currentFrame","pause","remove","CodeInputField","options","super","plainText","type","setAttribute","autocomplete","lastLength","setLabel","replace","slice","setValueSilently","onFill","rippleClickId","ripple","elem","callback","resolve","onEnd","prepend","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","elapsedTime","cb","mutate","delay","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","abs","x","y","append","isRippleUnneeded","target","includes","tagName","touchEnd","settings","animationsEnabled","touches","once","cancelBubble","stopPropagation","passive","button","dataset","btnQr","btnNext","page","setCountries","countries","countriesList","filter","country","pFlags","hidden","sort","a","b","name","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","countryInputField","label","countryInput","selectWrapper","arrowDown","selectList","appendChild","initSelect","forEach","c","emoji","iso2","liArr","country_codes","countryCode","li","wrapped","wrapEmojiText","spanEmoji","innerHTML","el","defaultName","span","innerText","country_code","push","set","selectCountryByTarget","childNodes","phoneCode","find","_countryCode","telInputField","lastValue","hidePicker","telEl","focus","hideTimeout","get","clearTimeout","undefined","offsetWidth","select","pageEl","parentElement","mouseDownHandlerAttached","onMouseDown","capture","key","ctrlKey","_value","toLowerCase","matches","good","Boolean","str","indexOf","preventDefault","blur","onInput","formatted","loadLottieWorkers","code","countryName","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","pushToState","toggleStorage","getState","state","storage","isAvailable","toggle","phone_number","invokeApi","api_id","id","api_hash","hash","_","m","default","mount","Object","assign","catch","err","setError","console","error","h4","subtitle","nearestDcResult","langPack","getFromCache","getLangPack","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","getNetworker","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute","cachedPromise","imageDiv","preloader","btnBack","helpList","QRCodeStyling","prevToken","ignoreErrors","iterate","isLoop","loginToken","except_ids","dc_id","setBaseDcId","token","authorization","setUser","user","url","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","result","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","_canvas","_image","children","Array","from","timestamp","diff","expires","serverTimeOffset","warn","handled","func","codeInput","authCode","headerElement","sentTypeElement","CODELENGTH","codeInputField","submitCode","cleanup","monkey","params","phone_code_hash","phone_code","response","isMobile","load","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","args","sentCode","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","className","asDiv","icon","noRipple","rippleSquare","onlyMobile","disabled","putPreloader","returnDiv","html","div","insertAdjacentHTML","lastElementChild","setButtonLoader","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","menuOverlay","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","element","removeManual","timeout","onCancel","appNavigationController","navigations","manual","log","debug","currentHash","location","isPossibleSwipe","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","noBlurOnPop","i","index","ret","findItemByType","backByItem","splice","noHistory","origin","pathname","single","simulateEvent","event","Event","bubbles","cancelable","sequentialDom","promises","raf","scheduled","kind","scheduleFlush","do","read","write","serverTimeManager","to","addTaskListener","task","payload","isSwipingBackSafari","TouchEvent","bytesToHex","bytes","arr","toString","join","bytesFromHex","hexString","len","Uint8Array","ceil","start","parseInt","charAt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","String","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","bufferConcats","reduce","acc","v","byteLength","tmp","ArrayBuffer","getLanguageChangeButton","appendTo","getConfig","config","suggested_lang_code","lastRequestedLangCode","getStrings","getCacheLangPack","strings","backup","string","backupString","btnChangeLanguage"],"mappings":"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","file":"13.e32751cf9be91bb5497a.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.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 elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.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(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { ripple } from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\r\n // const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter(country => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll(page.pageEl.parentElement.parentElement, countryInput, 'start', 4);\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n let good = !![c.name, c.default_name].filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch(err => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then(module => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach(dcId => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n apiManager.getNetworker(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport { bytesCmp, bytesToBase64 } from '../helpers/bytes';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport { pause } from '../helpers/schedulers/pause';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + encoded.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/\\=+$/, \"\");\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then(m => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nconst Button = (className: string, options: 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 const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\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' | 'global-search' | 'voice',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n 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","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } 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 promise = isInDOM(element) ? this.mutate() : Promise.resolve();\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 private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\n * 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\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().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"],"sourceRoot":""} \ No newline at end of file diff --git a/public/14.11183df10f220f2bd1db.chunk.js b/public/14.11183df10f220f2bd1db.chunk.js new file mode 100644 index 000000000..95bd89745 --- /dev/null +++ b/public/14.11183df10f220f2bd1db.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[14],{101:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(51);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=i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then(e=>(this.animation=e,this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},i.a.waitForFirstFrame(e)))}remove(){this.animation&&this.animation.remove()}}},112:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(51);class n{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const s=e.input;s.addEventListener("blur",()=>{this.playAnimation(0)}),s.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const s=this.needFrame>t?-1:1;this.animation.setDirection(s),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.a.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.a.waitForFirstFrame(e))),i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.a.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},113:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(38);class n extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let s=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===s)return;s=n})}}},148:function(e,t,s){"use strict";s.r(t),s.d(t,"AppDialogsManager",(function(){return Pr}));var i=s(40),n=s(71),a=s(15),o=s(44),r=s(53),l=s(30),c=s(5),d=s(117),h=s(147),p=s(151);const u=[...h.a].concat([...p.a]);var m=new Set(u);function g(e,t){e.setAttribute("dir","auto"),e.innerHTML=t}var b=s(37),v=s(102),f=s(41);function y(e){Object(f.d)(e.history,(t,s,i)=>{t.action.photo||(i.splice(s,1),void 0!==e.count&&--e.count)})}var w=s(32);class S{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,Object(w.g)(this,e)}setTargets(e,t,s){this.previous=e,this.next=t,this.reverse=s}get index(){return void 0!==this.count?this.previous.length:-1}reset(e=!1){this.current=void 0,this.previous=[],this.next=[],this.loadedAllUp=this.loadedAllDown=e,this.loadPromiseUp=this.loadPromiseDown=null}go(e,t=!0){let s,i;if(e>0){if(s=this.next.splice(0,e),i=s.pop(),!i)return;this.previous.push(this.current,...s)}else{if(s=this.previous.splice(this.previous.length+e,-e),i=s.shift(),!i)return;this.next.unshift(...s,this.current)}return this.next.length0),this.current}load(e){if(e&&this.loadedAllDown)return Promise.resolve();if(!e&&this.loadedAllUp)return Promise.resolve();if(e&&this.loadPromiseDown)return this.loadPromiseDown;if(!e&&this.loadPromiseUp)return this.loadPromiseUp;let t;t=e?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0];const s=this.loadMore(t,e,this.loadCount).then(t=>{if(e&&this.loadPromiseDown!==s||!e&&this.loadPromiseUp!==s)return;t.items.length{const s=this.processItem?this.processItem(t):t;s&&(e?this.reverse?this.previous.unshift(s):this.next.push(s):this.reverse?this.next.push(s):this.previous.unshift(s))}),this.onLoadedMore&&this.onLoadedMore()},()=>{}).then(()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null});return e?this.loadPromiseDown=s:this.loadPromiseUp=s,s}}class L extends S{constructor(e={}){super(Object.assign(Object.assign({},e),{loadMore:(e,t,s)=>{var n;const a=t?0:s;let o=null===(n=this.current)||void 0===n?void 0:n.mid;return e&&(o=e.mid),t||(o=v.a.incrementMessageId(o,1)),i.a.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:o,limit:a?0:s,backLimit:a})).then(e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&y(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history}))},processItem:t=>{if(this.filterMids([t.mid]).length)return e.processItem(t)}})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const s=s=>s.peerId===e&&t.has(s.mid),i=(e,t,i)=>{s(e)&&i.splice(t,1)};Object(f.d)(this.previous,i),Object(f.d)(this.next,i),this.current&&s(this.current)&&this.onEmptied&&this.onEmptied()},this.onHistoryMultiappend=e=>{if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;const t=e[this.searchContext.peerId];if(!t)return;const s=Array.from(t).sort((e,t)=>e-t),i=this.filterMids(s).map(e=>this.processItem(e)).filter(Boolean);i.length&&this.next.push(...i)},this.onMessageSent=({message:e})=>{this.onHistoryMultiappend({[e.peerId]:new Set([e.mid])})},a.default.addEventListener("history_delete",this.onHistoryDelete),a.default.addEventListener("history_multiappend",this.onHistoryMultiappend),a.default.addEventListener("message_sent",this.onMessageSent)}filterMids(e){const t=this.searchContext.isScheduled?i.a.getScheduledMessagesStorage(this.searchContext.peerId):i.a.getMessagesStorage(this.searchContext.peerId);return i.a.filterMessagesByInputFilter(this.searchContext.inputFilter._,e,t,e.length)}setSearchContext(e){this.searchContext=e,void 0!==this.searchContext.folderId&&(this.loadedAllUp=!0,void 0===this.searchContext.nextRate&&(this.loadedAllDown=!0)),"inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(this.loadedAllUp=!0),this.searchContext.useSearch||(this.loadedAllDown=this.loadedAllUp=!0)}reset(){super.reset(),this.searchContext=void 0}cleanup(){this.reset(),a.default.removeEventListener("history_delete",this.onHistoryDelete),a.default.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.default.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0}}var E=s(66),C=s(68),I=s(62),M=s(17),P=s(39),T=s(47),k=s(36),x=s(16);class O{constructor(e,t,s=!0,i,n=!0,a=!0,o){this.name=e,this.type=t,this.clearable=s,this.autonomous=a,this.onFound=o,this.list=kr.createChatList(),this.container=document.createElement("div"),i&&(this.container.className=i),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append(Object(x.i18n)(e)),this.container.append(this.nameEl)),this.container.classList.add("search-group","search-group-"+t),this.container.append(this.list),this.container.style.display="none",n&&kr.setListClickListener(this.list,o,void 0,a)}clear(){this.container.style.display="none",this.clearable&&(this.list.innerHTML="")}setActive(){this.container.style.display=""}toggle(){this.list.childElementCount?this.setActive():this.clear()}}class A{constructor(e,t,s,i){this.container=e,this.searchInput=t,this.searchGroups=s,this.onSearch=i,this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1,this.searchPromise=null,this.searchTimeout=0,this.query="",this.listsContainer=null,this.threadId=0,this.scrollable=new T.b(this.container),this.listsContainer=this.scrollable.container;for(let e in this.searchGroups)this.listsContainer.append(this.searchGroups[e].container);this.searchGroups.messages&&this.scrollable.setVirtualContainer(this.searchGroups.messages.list),this.searchInput.onChange=e=>{this.query=e,this.reset(!1),this.searchMore()},this.scrollable.onScrolledBottom=()=>{this.query.trim()&&(this.searchTimeout||(this.searchTimeout=window.setTimeout(()=>{this.searchMore(),this.searchTimeout=0},0)))}}reset(e=!0){e&&(this.searchInput.value="",this.query="",this.peerId=void 0,this.threadId=0),this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1;for(let e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,s=""){this.peerId=e,this.threadId=t,this.query!==s&&(this.searchInput.inputField.value=s),this.searchInput.input.focus()}searchMore(){if(this.searchPromise)return this.searchPromise;const e=this.query;if(!e.trim())return void(this.onSearch&&this.onSearch(0));if(-1!==this.foundCount&&this.loadedCount>=this.foundCount)return Promise.resolve();const t=this.minMsgId||0;return this.searchPromise=i.a.getSearch({peerId:this.peerId,query:e,inputFilter:{_:"inputMessagesFilterEmpty"},maxId:t,limit:20,threadId:this.threadId}).then(t=>{if(this.searchPromise=null,this.searchInput.value!==e)return;const{count:s,history:i}=t;i.length&&i[0].mid===this.minMsgId&&i.shift();const n=this.searchGroups.messages;i.forEach(t=>{const s=this.peerId?t.fromId:t.peerId,{dialog:i,dom:n}=kr.addDialogNew({dialog:s,container:this.scrollable,drawStatus:!1,avatarSize:54,meAsSaved:!1});t.peerId!==s&&(n.listEl.dataset.peerId=""+t.peerId),kr.setLastMessage(i,t,n,e)}),n.toggle(),this.minMsgId=i.length&&i[i.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=i.length,-1===this.foundCount&&(this.foundCount=s,n.nameEl&&Object(k.a)(n.nameEl,Object(x.i18n)(s?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[s])),this.onSearch&&this.onSearch(this.foundCount))}).catch(e=>{console.error("search error",e),this.searchPromise=null})}}var _=s(38);class F{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;let e=this.value;e!==this.prevValue&&(this.prevValue=e,clearTimeout(this.timeout),this.timeout=window.setTimeout(()=>{this.onChange(e)},200))},this.onClearClick=()=>{this.value="",this.onChange&&this.onChange(""),this.onClear&&this.onClear()},this.inputField=new _.b({placeholder:e,plainText:!0}),this.container=this.inputField.container,this.container.classList.remove("input-field"),this.container.classList.add("input-search"),this.onChange=t,this.input=this.inputField.input,this.input.classList.add("input-search-input");const s=document.createElement("i");s.classList.add("tgico","tgico-search"),this.clearBtn=document.createElement("i"),this.clearBtn.classList.add("tgico","btn-icon","tgico-close"),this.input.addEventListener("input",this.onInput),this.clearBtn.addEventListener("click",this.onClearClick),this.container.append(s,this.clearBtn)}get value(){return this.inputField.value}set value(e){this.prevValue=e,clearTimeout(this.timeout),this.inputField.value=e}remove(){clearTimeout(this.timeout),this.input.removeEventListener("input",this.onInput),this.clearBtn.removeEventListener("click",this.onClearClick)}}var D=s(124),j=s(50),B=s(54),R=s(87),U=s(34);var H=(e,t={})=>Object(U.a)("btn-icon",Object.assign({icon:e||void 0},t)),N=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class z{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=H("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 T.b(this.content,void 0,void 0,!0),this.container.append(this.header,this.content),this.slider.addTab(this),this.listenerSetter=new R.a}close(){return this.slider.closeTab(this)}open(...e){return N(this,void 0,void 0,(function*(){if(this.init)try{const e=this.init();this.init=null,e instanceof Promise&&(yield e)}catch(e){console.error("open tab error",e)}return this.slider.selectTab(this)}))}init(){}onCloseAfterTimeout(){this.destroyable&&(this.slider.tabs.delete(this),this.container.remove()),this.listenerSetter&&this.listenerSetter.removeAll()}setTitle(e){this.title.innerHTML="",this.title.append(Object(x.i18n)(e))}}class V extends z{constructor(e){super(e),this.eventListener=new B.a}onCloseAfterTimeout(){return this.eventListener.dispatchEvent("destroy"),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}class G{constructor(e){this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{j.a.findItemByType(this.navigationType)?j.a.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,s)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return!1;const i=this.historyTabIds.pop();this.onCloseTab(i,t,s);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof z?n.container:n:this.canHideFirst?-1:0,t),!0},Object(w.g)(this,e),this.tabs||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=Object(D.a)(this.tabsContainer,"navigation",250),this.canHideFirst||this._selectTab(0),Array.from(this.sidebarEl.querySelectorAll(".sidebar-close-button")).forEach(e=>{Object(l.b)(e,this.onCloseBtnClick)})}selectTab(e){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const t=e instanceof z?e:this.tabs.get(e);return t&&(t.onOpen&&t.onOpen(),t.onOpenAfterTimeout&&setTimeout(()=>{t.onOpenAfterTimeout()},250)),j.a.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof z?e.container:e),!0}removeTabFromHistory(e){Object(f.e)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let s=this.historyTabIds.length-1;s>=0;--s){const i=this.historyTabIds[s];if(i!==t){if(i instanceof e)break;this.removeTabFromHistory(i)}}}getTab(e){return this.historyTabIds.find(t=>t instanceof e)}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,s){s||j.a.removeByType(this.navigationType,!0);const i=e instanceof z?e:this.tabs.get(e);i&&(i.onClose&&i.onClose(),i.onCloseAfterTimeout&&setTimeout(()=>{i.onCloseAfterTimeout()},250))}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}}var K=s(48),W=s(138);class q{constructor(e){this.container=document.createElement("div"),this.container.classList.add("avatar-edit"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("avatar-edit-canvas"),this.icon=document.createElement("span"),this.icon.classList.add("tgico","tgico-cameraadd"),this.container.append(this.canvas,this.icon),this.container.addEventListener("click",()=>{(new W.a).open(this.canvas,e)})}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}var Q=(e={})=>Object(U.a)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e);class $ extends z{constructor(){super(...arguments),this.searchGroup=new O(!0,"contacts",!0,"new-group-members disable-hover",!1),this.uploadAvatar=null}init(){this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new q(e=>{this.uploadAvatar=e});const e=document.createElement("div");e.classList.add("input-wrapper"),this.groupNameInputField=new _.b({label:"CreateGroup.NameHolder",maxLength:128}),e.append(this.groupNameInputField.container),this.groupNameInputField.input.addEventListener("input",()=>{const e=this.groupNameInputField.value;this.nextBtn.classList.toggle("is-visible",!!e.length&&!this.groupNameInputField.input.classList.contains("error"))}),this.nextBtn=Q({icon:"arrow_next"}),this.nextBtn.addEventListener("click",()=>{const e=this.groupNameInputField.value;this.nextBtn.disabled=!0,K.a.createChat(e,this.peerIds.map(e=>e.toUserId())).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{K.a.editPhoto(e,t)}),mn.removeTabFromHistory(this),mn.selectTab(0)})});const t=document.createElement("div");t.classList.add("chatlist-container"),t.append(this.searchGroup.container),this.content.append(this.nextBtn),this.scrollable.append(this.avatarEdit.container,e,t)}onCloseAfterTimeout(){this.searchGroup.clear(),this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.nextBtn.disabled=!1}open(e){const t=super.open();return t.then(()=>{this.peerIds=e,this.peerIds.forEach(e=>{let{dom:t}=kr.addDialogNew({dialog:e,container:this.searchGroup.list,drawStatus:!1,rippleEnabled:!1,avatarSize:48});t.lastMessageSpan.append(P.a.getUserStatusString(e))}),this.searchGroup.nameEl.textContent="",this.searchGroup.nameEl.append(Object(x.i18n)("Members",[this.peerIds.length])),this.searchGroup.setActive()}),t}}var Y=s(78),X=s(43),J=s(31),Z=s(123),ee=s(75),te=s(35),se=s(18),ie=s(93),ne=s(88),ae=s(46),oe=s(56),re=s(0),le=s(51),ce=s(149),de=s(29),he=s(73),pe=s(52),ue=s(1),me=s(104),ge=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const be=(()=>{try{return re.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})();const ve=new class{constructor(){if(this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this._volume=1,this._muted=!1,this._playbackRate=1,this.seekBackward=e=>{const t=this.playingMedia;t&&(t.currentTime=Math.max(0,t.currentTime-(e.seekOffset||10)))},this.seekForward=e=>{const t=this.playingMedia;t&&(t.currentTime=Math.min(t.duration,t.currentTime+(e.seekOffset||10)))},this.seekTo=e=>{const t=this.playingMedia;t&&(t.currentTime=e.seekTime)},this.onMediaDocumentLoad=e=>{const t=this.mediaDetails.get(e),s=E.a.getDoc(t.docId);"audio"===s.type&&s.supportsStreaming&&be&&this.handleSafariStreamable(e);const i=he.a.getCacheContext(s);e.src=i.url;const n=this.waitingDocumentsForLoad[s.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[s.id])},this.onPlay=e=>{const t=e.target,s=this.mediaDetails.get(t),{peerId:n,mid:o}=s,r=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop();const e=e=>e.mid===o&&e.peerId===n;if(!this.listLoader.current||!e(this.listLoader.current)){let t,s=this.listLoader.previous.findIndex(e);-1!==s?t=-(this.listLoader.previous.length-s):(s=this.listLoader.next.findIndex(e),-1!==s&&(t=s+1)),-1!==s?t&&this.listLoader.go(t,!1):this.setTargets({peerId:n,mid:o})}this.setMedia(t,r)}setTimeout(()=>{a.default.dispatchEvent("media_play",{doc:i.a.getMediaFromMessage(r),message:r,media:t})},0)},this.onPause=e=>{a.default.dispatchEvent("media_pause")},this.onEnded=e=>{e.isTrusted&&(this.onPause(e),this.next()||(this.stop(),a.default.dispatchEvent("media_stop")))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=()=>{const e=this.playingMedia;if(!e)return!1;e.paused||e.pause(),e.currentTime=0,Object(pe.a)(e,"ended");const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const s=t.peerId,i=t.isScheduled?this.scheduled:this.media,n=i.get(s);n&&(n.delete(t.mid),n.size||i.delete(s)),e.remove(),this.mediaDetails.delete(e)}return this.playingMedia=void 0,!0},this.playItem=e=>{const{peerId:t,mid:s}=e,i=this.searchContext.isScheduled;this.getMedia(t,s,i).play(),setTimeout(()=>{this.resolveWaitingForLoadMedia(t,s,i)},0)},this.next=()=>!this.lockedSwitchers&&this.listLoader.go(1),this.previous=()=>{const e=this.playingMedia;return e&&(e.currentTime>5||!this.listLoader.previous.length)?(e.currentTime=0,void this.toggle(!0)):!this.lockedSwitchers&&this.listLoader.go(-1)},this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const e={play:this.play,pause:this.pause,stop:this.stop,seekbackward:this.seekBackward,seekforward:this.seekForward,seekto:this.seekTo,previoustrack:this.previous,nexttrack:this.next};for(const t in e)try{navigator.mediaSession.setActionHandler(t,e[t])}catch(e){console.warn("MediaSession action is not supported:",t)}}a.default.addEventListener("document_downloaded",e=>{const t=this.waitingDocumentsForLoad[e.id];if(t)for(const e of t)this.onMediaDocumentLoad(e)});const e={};["volume","muted","playbackRate"].forEach(t=>{const s="_"+t;e[t]={get:()=>this[s],set:e=>{this[s]!==e&&(this[s]=e,this.playingMedia&&(this.playingMedia[t]=e),this.dispatchPlaybackParams())}}}),Object.defineProperties(this,e)}dispatchPlaybackParams(){const{volume:e,muted:t,playbackRate:s}=this;a.default.dispatchEvent("media_playback_params",{volume:e,muted:t,playbackRate:s})}addMedia(e,t,s){const{peerId:n,mid:o}=e,r=!!e.pFlags.is_scheduled?this.scheduled:this.media;let l=r.get(e.peerId);l||r.set(e.peerId,l=new Map);let c=l.get(o);if(c)return c;const d=i.a.getMediaFromMessage(e);l.set(o,c=document.createElement("round"===d.type||"video"===d.type?"video":"audio")),"round"===d.type&&c.setAttribute("playsinline","true");const h={peerId:n,mid:o,docId:d.id,clean:s,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(c,h),c.volume=1,this.container.append(c),c.addEventListener("play",this.onPlay),c.addEventListener("pause",this.onPause),c.addEventListener("ended",this.onEnded),"audio"!==d.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==a.default.myId&&c.addEventListener("timeupdate",()=>{i.a.readMessages(n,[o])},{once:!0});const p=Object(ae.a)();if(t)p.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let s=t.get(n);s||t.set(n,s=new Map),s.set(o,p)}return p.then(()=>{const e=he.a.getCacheContext(d);if(d.supportsStreaming||e.url)this.onMediaDocumentLoad(c);else{let e=this.waitingDocumentsForLoad[d.id];e||(e=this.waitingDocumentsForLoad[d.id]=new Set),e.add(c),E.a.downloadDoc(d)}}),c}getMedia(e,t,s){const i=(s?this.scheduled:this.media).get(e);return null==i?void 0:i.get(t)}handleSafariStreamable(e){e.addEventListener("play",()=>{const t=e.currentTime;e.addEventListener("progress",()=>{e.currentTime=e.duration-1,e.addEventListener("progress",()=>{e.currentTime=t,e.paused||e.play()},{once:!0})},{once:!0})})}resolveWaitingForLoadMedia(e,t,s){const i=s?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=i.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||i.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var s;return ge(this,void 0,void 0,(function*(){yield Object(me.e)(t,void 0,!1);const n=i.a.getMediaFromMessage(e),a=[],l="voice"===n.type||"round"===n.type;let c="",h="";if(null===(s=n.thumbs)||void 0===s?void 0:s.length){const s=n.thumbs[n.thumbs.length-1];if(!s.bytes){const i=he.a.getCacheContext(n,s.type);if(i.url)a.push({src:i.url,sizes:`${s.w}x${s.h}`,type:"image/jpeg"});else{r.a.preloadPhoto(n,s).then(()=>{this.playingMedia===t&&i.url&&this.setNewMediadata(e)})}}}else if(l){const s=e.fromId||e.peerId,i=o.a.getPeerPhoto(s);if(i){const n=d.a.loadAvatar(s,i,"photo_small");if(n.cached){const e=yield n.loadPromise;a.push({src:e,sizes:"160x160",type:"image/jpeg"})}else n.loadPromise.then(s=>{this.playingMedia===t&&s&&this.setNewMediadata(e)})}c=o.a.getPeerTitle(s,!0,!1),h=x.default.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!l){const e=n.attributes.find(e=>"documentAttributeAudio"===e._);c=e&&e.title||n.file_name,h=e&&e.performer}a.length||(re.IS_APPLE?ue.IS_TOUCH_SUPPORTED?a.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):a.push({src:"assets/img/apple-touch-icon.png",sizes:"180x180",type:"image/png"}):[72,96,144,192,256,384,512].forEach(e=>{const t=`${e}x${e}`;a.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})}));const p=new MediaMetadata({title:c,artist:h,artwork:a});navigator.mediaSession.metadata=p}))}getMessageByMedia(e){const t=this.mediaDetails.get(e),{peerId:s,mid:n}=t;return t.isScheduled?i.a.getScheduledMessageByPeer(s,n):i.a.getMessageByPeer(s,n)}toggle(e){return!!this.playingMedia&&(void 0===e&&(e=this.playingMedia.paused),this.playingMedia.paused===e&&(e?this.playingMedia.play():this.playingMedia.pause(),!0))}willBePlayed(e){this.willBePlayedMedia=e}setSearchContext(e){return!Object(w.b)(this.searchContext,e)&&(this.searchContext=Object(w.a)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,s){this.listLoader?this.listLoader.reset():this.listLoader=new L({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{a.default.dispatchEvent("media_stop"),this.stop()}});const i=void 0===this.searchContext.folderId;t?this.listLoader.setTargets(t,s,i):this.listLoader.reverse=i,this.listLoader.setSearchContext(this.searchContext),this.listLoader.current=e,this.listLoader.load(!0),this.listLoader.load(!1)}setMedia(e,t){this.playingMedia=e,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const s=this.playingMedia,i=this.pause();return this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),()=>{this.toggleSwitchers(!0),s&&(this.mediaDetails.get(s)?this.setMedia(s,this.getMessageByMedia(s)):this.next()||this.previous()),e&&this.playingMedia===e&&this.stop(),i&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}};de.a.appMediaPlaybackController=ve;var fe=ve,ye=s(103);function we(e,t,s,i){const n=e=>{s({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),i&&i({x:t.pageX,y:t.pageY,event:t})},o=s=>{0===s.button?(t({x:s.pageX,y:s.pageY,event:s}),n(s),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a,{once:!0})):e.addEventListener("mousedown",o,{once:!0})};e.addEventListener("mousedown",o,{once:!0});const r=e=>{e.preventDefault(),s({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},l=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",c,{passive:!1,once:!0}),i&&i({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},c=e=>{t({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e}),r(e),document.addEventListener("touchmove",r,{passive:!1}),document.addEventListener("touchend",l,{passive:!1,once:!0})};return e.addEventListener("touchstart",c,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",c),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",l)}}class Se{constructor(e,t=0){this.mousedown=!1,this.events={},this.withTransition=!1,this.useTransform=!1,this.vertical=!1,this.onMouseMove=e=>{this.scrub(e)},this.onMouseDown=e=>{var t;this.rect=this.container.getBoundingClientRect(),this.mousedown=!0,this.scrub(e),this.container.classList.add("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseDown)&&this.events.onMouseDown(e)},this.onMouseUp=e=>{var t;this.mousedown=!1,this.container.classList.remove("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseUp)&&this.events.onMouseUp(e)},this.onInput=()=>{var e;const t=+this.seek.value;this.setFilled(t),(null===(e=this.events)||void 0===e?void 0:e.onScrub)&&this.events.onScrub(t)},Object(w.g)(this,e),this.container=document.createElement("div"),this.container.classList.add("progress-line"),this.useTransform?this.container.classList.add("use-transform"):this.withTransition&&this.container.classList.add("with-transition"),this.filled=document.createElement("div"),this.filled.classList.add("progress-line__filled");const s=this.seek=document.createElement("input");s.classList.add("progress-line__seek"),s.type="range",s.step=""+this.step,s.min=""+this.min,s.max=""+this.max,s.value=""+t,t&&this.setProgress(t);const i=""+this.step,n=i.indexOf(".");this.decimals=-1===n?0:i.length-n-1,this.container.append(this.filled,s)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=we(this.container,this.onMouseDown,this.onMouseMove,this.onMouseUp)}setProgress(e){this.seek.value=""+e,this.setFilled(+this.seek.value)}addProgress(e){this.seek.value=""+(+this.seek.value+e),this.setFilled(+this.seek.value)}setFilled(e){let t=(e-this.min)/(this.max-this.min);t=Object(I.a)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const s=this.vertical?this.rect.height:this.rect.width,i=Object(I.a)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,s);let n=this.min+i/s*(this.max-this.min);return n-this.min<(this.max-this.min)/2&&(n-=this.step/10),n=+n.toFixed(this.decimals),n=Object(I.a)(n,this.min,this.max),this.setProgress(n),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(n),n}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}const Le=e=>{if(e.element)return e.element;const{icon:t,text:s,onClick:i,checkboxField:n,noCheckboxClickListener:a}=e,o=document.createElement("div");o.className="btn-menu-item"+(t?" tgico-"+t:""),Object(se.ripple)(o);let r=e.textElement;r||(r=e.textElement=s?Object(x.i18n)(s):document.createElement("span"),e.regularText&&(r.innerHTML=e.regularText)),r.classList.add("btn-menu-item-text"),o.append(r);const d=!!n||!!e.keepOpen;return Object(l.b)(o,e=>{Object(c.a)(e);!1!==i(e)&&(d||Object(te.c)(),n&&!a&&(n.checked="radio"===n.input.type||!n.checked))},e.options),n&&o.append(n.label),e.element=o};var Ee=(e,t)=>{const s=document.createElement("div");s.classList.add("btn-menu"),t&&e.forEach(e=>{e.options?e.options.listenerSetter=t:e.options={listenerSetter:t}});const i=e.map(Le);return s.append(...i),s};const Ce=(e,t,s)=>{((null==s?void 0:s.listenerSetter)?s.listenerSetter.add(e):e.addEventListener.bind(e))(l.a,s=>{if(!e.classList.contains("btn-menu-toggle"))return!1;const i=e.querySelector(".btn-menu");Object(c.a)(s),e.classList.contains("menu-open")?Object(te.c)():(t&&t(s),Object(te.d)(i))})};var Ie=(e={},t,s,i)=>{e.asDiv=!0;const n=H("more btn-menu-toggle",e),a=Ee(s,e.listenerSetter);return a.classList.add(t),Ce(n,i,e),n.append(a),n},Me=s(6);class Pe extends B.a{constructor(){super(!1),this.hideControls=()=>{clearTimeout(this.showControlsTimeout),this.showControlsTimeout=0;const e=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!e||this.controlsLocked)return}else if(!e)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.showControlsTimeout?(clearTimeout(this.showControlsTimeout),this.showControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.showControlsTimeout=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.showControlsTimeout=0}setup(e){Object(w.g)(this,e);const{listenerSetter:t,element:s}=this;ue.IS_TOUCH_SUPPORTED?t.add(s)("click",()=>{this.toggleControls()}):(t.add(s)("mousemove",()=>{this.showControls()}),t.add(s)("mouseenter",()=>{this.showControls(!1)}),t.add(s)("mouseleave",e=>{e.relatedTarget&&this.showOnLeaveToClassName&&Object(Me.a)(e.relatedTarget,this.showOnLeaveToClassName)?this.showControls(!1):this.hideControls()}))}lockControls(e){this.controlsLocked=e,this.element.classList.toggle("disable-hover",!1===e),this.toggleControls(e)}}var Te=s(108);class ke extends Se{constructor(e,t,s,i){super({step:1e3/60/1e3,min:0,max:1,withTransition:s,useTransform:i},0),this.progressRAF=0,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{let e=()=>{this.setProgress(),this.progressRAF=this.media.paused?0:window.requestAnimationFrame(e)};this.progressRAF&&window.cancelAnimationFrame(this.progressRAF),this.streamable&&this.setLoadProgress(),this.progressRAF=window.requestAnimationFrame(e)},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e&&this.setMedia(e,t)}setMedia(e,t=!1){this.media&&this.removeListeners(),t&&!this.filledLoad?(this.filledLoad=document.createElement("div"),this.filledLoad.classList.add("progress-line__filled","progress-line__loaded"),this.container.prepend(this.filledLoad)):this.filledLoad&&this.filledLoad.classList.toggle("hide",!t),this.media=e,this.streamable=t,(!e.paused||e.currentTime>0)&&this.onPlay();let s=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{s=!this.media.paused,s&&this.media.pause()},onMouseUp:e=>{s&&this.media.play()}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(fe.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,s=this.media.currentTime;let i=0,n=0;for(let a=0;a=t&&t>=i&&(i=t,n=e.end(a))}const a=this.media.duration?n/this.media.duration:0;this.filledLoad.style.width=100*a+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(fe.isSafariBuffering(this.media))return;const e=this.media.currentTime;super.setProgress(e)}setListeners(){super.setListeners(),this.media.addEventListener("ended",this.onEnded),this.media.addEventListener("play",this.onPlay),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=0)}}class xe extends Se{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&Object(c.a)(e),fe.muted=!fe.muted},this.setVolume=()=>{const{volume:e,muted:t}=fe;let s;s=!e||t?"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z":e>.5?"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z":e>0&&e<.25?"M7 9v6h4l5 5V4l-5 5H7z":"M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z";try{this.volumeSvg.innerHTML=``}catch(e){}this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);fe.muted=!1,fe.volume=t}}),this.btn=document.createElement("div"),this.btn.classList.add("player-volume"),this.btn.innerHTML='\n \n ',this.btn.classList.add("btn-icon"),this.volumeSvg=this.btn.firstElementChild,this.btn.append(this.container),Object(l.b)(this.volumeSvg,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("media_playback_params",this.setVolume),this.setVolume()}}class Oe extends Pe{constructor(e,t=!1,s=!1,i){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.listenerSetter=new R.a,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!this.video.paused,showOnLeaveToClassName:"media-viewer-caption"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(i),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new ke(e,s),t.prepend(this.progress.container)}if(t){e.play().catch(t=>{"NotAllowedError"===t.name&&(e.muted=!0,e.autoplay=!0,e.play())}).finally(()=>{this.wrapper.classList.toggle("is-playing",!this.video.paused)})}}stylePlayer(e){const{wrapper:t,video:s,skin:i,listenerSetter:n}=this;t.classList.add(i);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===i){const e=t.querySelectorAll(".toggle"),i=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.innerHTML=String(0|s.duration).toHHMMSS();const l=new xe(n),d=t.querySelector(".left-controls");l.btn.classList.remove("btn-icon"),d.insertBefore(l.btn,o.parentElement),Array.from(e).forEach(e=>{n.add(e)("click",()=>{this.togglePlay()})}),ue.IS_TOUCH_SUPPORTED||(n.add(s)("click",()=>{this.togglePlay()}),n.add(document)("keydown",e=>{if(a.default.overlaysActive>1)return;const{key:s,code:i}=e;let n=!0;return"KeyF"===i?this.toggleFullScreen():"KeyM"===i?fe.muted=!fe.muted:"Space"===i?this.togglePlay():e.altKey&&"Equal"===i?fe.playbackRate+=.25:e.altKey&&"Minus"===i?fe.playbackRate-=.25:!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?n=!1:"ArrowLeft"===s?fe.seekBackward({action:"seekbackward"}):fe.seekForward({action:"seekforward"}),n?(Object(c.a)(e),!1):void 0})),n.add(s)("dblclick",()=>{ue.IS_TOUCH_SUPPORTED||this.toggleFullScreen()}),n.add(i)("click",()=>{this.toggleFullScreen()}),Object(Te.a)(t,this.onFullScreen.bind(this,i),n),n.add(s)("timeupdate",()=>{o.innerHTML=String(0|s.currentTime).toHHMMSS()}),n.add(s)("play",()=>{t.classList.add("played")},{once:!0}),n.add(s)("pause",()=>{this.showControls(!1)})}n.add(s)("play",()=>{t.classList.add("is-playing")}),n.add(s)("pause",()=>{t.classList.remove("is-playing")}),s.duration||e?r.innerHTML=String(Math.round(s.duration||e)).toHHMMSS():Object(me.e)(s).then(()=>{r.innerHTML=String(Math.round(s.duration)).toHHMMSS()})}togglePlay(){this.video[this.video.paused?"play":"pause"]()}buildControls(){const e=this.skin;if("default"===e)return`\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n \n
\n
\n
`}setBtnMenuToggle(){const e=[.25,.5,1,1.25,1.5,2].map(e=>({regularText:1===e?"Normal":""+e,onClick:()=>{this.video.playbackRate=e}})),t=Ee(e),s=this.wrapper.querySelector(".settings");t.classList.add("top-left"),Ce(s),s.append(t)}toggleFullScreen(){const e=this.wrapper;if(re.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}Object(Te.d)()?Object(Te.b)():Object(Te.e)(e)}onFullScreen(e){const t=Object(Te.d)();this.wrapper.classList.toggle("ckin__fullscreen",t),t?(e.classList.remove("tgico-fullscreen"),e.classList.add("tgico-smallscreen"),e.setAttribute("title","Exit Full Screen")):(e.classList.remove("tgico-smallscreen"),e.classList.add("tgico-fullscreen"),e.setAttribute("title","Full Screen"))}removeListeners(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners()}}var Ae=s(115),_e=s(81),Fe=s(96),De=s(42);function je(e){return function(e,t){let s,i=!1;return(...n)=>{s=n,i||(i=!0,e(()=>{i=!1,t(...s)}))}}(De.b,e)}var Be=s(45);function Re(e){e.classList.add("is-voice");const t=e.message,s=i.a.getMediaFromMessage(t);t.pFlags.out&&e.classList.add("is-out");const n=b.b.isMobile?16:23,a=b.b.isMobile?152:190,o=b.b.isMobile?190:256,r=s.duration,d=Object(I.a)(r/60*o,a,o),h=document.createElementNS("http://www.w3.org/2000/svg","svg");h.classList.add("audio-waveform"),h.setAttributeNS(null,"width",""+d),h.setAttributeNS(null,"height",""+n),h.setAttributeNS(null,"viewBox",`0 0 ${d} ${n}`);const p=document.createElement("div");p.classList.add("audio-time"),e.append(h,p);let u=s.attributes.find(e=>"documentAttributeAudio"===e._).waveform||new Uint8Array([]);u=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let s;try{const i=new DataView(e.buffer);s=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){s=new Uint8Array([])}return s}(u.slice(0,63));const m=Math.max(...u),g=u.length?u.length:100,v=Math.min(d/4|0,g);let f=0;const y=n-4;let w="";for(let e=0,t=0,s=0;e=g){s=s+v-g,s<(v+1)/2&&f\n `,t+=4,f=s<(v+1)/2?0:i}else f{let t=e.audio;const s=()=>{const e=t.currentTime===t.duration?0:Math.ceil(t.currentTime/t.duration*v);S.forEach((t,s)=>t.classList.toggle("active",s0&&t.currentTime!==t.duration)&&s();const i=je(s);return e.addAudioListener("timeupdate",i),e.addAudioListener("ended",i),e.readyPromise.then(()=>{let e=!1,s=!1;function i(e){let s;if(e instanceof MouseEvent)s=e.offsetX;else{const t=e.target.getBoundingClientRect();s=e.targetTouches[0].pageX-t.left}const i=s/d*t.duration;t.currentTime=i}L.addEventListener("mouseleave",i=>{e&&(t.play(),e=!1),s=!1}),L.addEventListener("mousemove",t=>{s=!0,e&&i(t)}),L.addEventListener("mousedown",s=>{s.preventDefault(),0===s.button&&(t.paused||t.pause(),i(s),e=!0)}),L.addEventListener("mouseup",i=>{s&&e&&(t.play(),e=!1)}),Object(l.b)(L,e=>{Object(c.a)(e),t.paused||i(e)})},_e.a),()=>{L.remove(),L=null,t=null}}}function Ue(e=!0){const t=new ye.a({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}a.default.addEventListener("messages_media_read",({mids:e,peerId:t})=>{e.forEach(e=>{const s=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${s}, .media-round.is-unread${s}`)).forEach(e=>{e.classList.remove("is-unread")})})});const He=e=>{let t,s;const i=!e.classList.contains("search-super-item"),n=Object(Me.a)(e,i?"bubbles-inner":"tabs-tab");if(n){const a=':not([data-is-outgoing="1"])',o=".audio:not(.is-voice)"+a;let r;if(r=e.matches(o)?[o]:[".audio.is-voice"+a,".media-round"+a],i){const e=".bubble:not(.webpage) ";r=r.map(t=>e+t)}const l=r.join(", "),c=Array.from(n.querySelectorAll(l)),d=c.indexOf(e),h=c.map(e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid}));t=h.slice(0,d),s=h.slice(d+1)}return[t,s]};class Ne extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new R.a}render(){var e,t;this.classList.add("audio"),this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=i.a.getMediaFromMessage(this.message),n="voice"===s.type,a=!this.voiceAsMusic&&n,o=this.message.pFlags.is_outgoing,r=o&&this.preloader,d=String(0|s.duration).toHHMMSS();this.innerHTML='\n
\n
\n
\n
\n
\n
';const h=this.firstElementChild,p=document.createElement("div");p.classList.add("audio-download");"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),r&&(this.classList.add("is-outgoing"),this.append(p));const u=a?Re(this):function(e){const t=e.withTime,s=e.message,n=i.a.getMediaFromMessage(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");if(o.classList.add("audio-description"),!a){const a=[];n.audioPerformer&&a.push(Object(Fe.a)(n.audioPerformer)),t?a.push(Object(oe.d)(s.date)):a.length||a.push(Object(I.b)(n.size)),e.showSender&&a.push(i.a.wrapSenderToPeer(s)),o.append(...Object(x.joinElementsWith)(a," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const r=e.querySelector(".audio-title"),l=new Ae.a;l.dataset.fontWeight=e.dataset.fontWeight,a?l.append(i.a.wrapSenderToPeer(s)):l.innerHTML=n.audioTitle||n.fileName,r.append(l),e.showSender&&r.append(i.a.wrapSentTime(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,s=new ke(e.audio,n.supportsStreaming);e.addAudioListener("ended",()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1});const i=()=>{t||(e.classList.add("audio-show-progress"),t=!0,s&&c.lastChild.replaceWith(s.container))};return e.addAudioListener("play",i),(!e.audio.paused||e.audio.currentTime>0)&&i(),()=>{s.removeListeners(),s.container.remove(),s=null}}}(this),m=this.querySelector(".audio-time");m.innerHTML=d;const g=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=fe.addMedia(this.message,e),s=this.readyPromise=Object(ae.a)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?s.resolve():this.addAudioListener("canplay",()=>s.resolve(),{once:!0}),this.onTypeDisconnect=u();const i=()=>String(0|t.currentTime).toHHMMSS()+(a?" / "+d:""),n=()=>{m.innerText=i(),h.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&n();const o=(e,s=t.paused)=>{if(e&&Object(c.a)(e),s){const e=!!this.searchContext;if(fe.setSearchContext(this.searchContext||{peerId:Be.b,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,s]=e?He(this):[];fe.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,s)}t.play().catch(()=>{})}else t.pause()};return Object(l.b)(h,e=>o(e),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",()=>{h.classList.remove("playing"),m.innerText=d}),this.addAudioListener("timeupdate",()=>{!t.currentTime&&t.paused||fe.isSafariBuffering(t)||(m.innerText=i())}),this.addAudioListener("pause",()=>{h.classList.remove("playing")}),this.addAudioListener("play",n),o};if(null===(e=s.thumbs)||void 0===e?void 0:e.length){const e=[],t=Ls({photo:s,message:null,container:h,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});h.style.width=h.style.height="",t.images.thumb&&e.push(t.images.thumb),t.images.full&&e.push(t.images.full),this.classList.add("audio-with-thumb"),e.forEach(e=>e.classList.add("audio-thumb"))}if(o)r&&(this.dataset.isOutgoing="1",this.preloader.attach(p,!1));else{let e=this.preloader;g("audio"!==s.type&&!this.noAutoDownload);const i=t=>{if(this.audio.src)return;fe.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(fe.willBePlayed(this.audio),re.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=Ue(!1),s=Object(ae.a)();s.notifyAll({done:75,total:100}),s.catch(()=>{this.audio.pause(),fe.willBePlayed(void 0)}),s.cancel=()=>{s.cancel=_e.a;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(p,!1,s),e=this.addAudioListener("pause",()=>{s.cancel()},{once:!0}),i()},s=this.addAudioListener("play",t);this.readyPromise.then(()=>{this.listenerSetter.remove(s),this.listenerSetter.remove(e)})}else{e=Ue(),t||(this.readyPromise=Object(ae.a)());const n=()=>{i();const n=E.a.downloadDoc(s);return t||n.then(()=>{this.readyPromise.resolve()}),e.attach(p,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.append(p),this.classList.add("downloading"),this.readyPromise.then(()=>{this.classList.remove("downloading"),p.classList.add("downloaded"),setTimeout(()=>{p.remove()},200),fe.willBePlayedMedia===this.audio&&(this.audio.play(),fe.willBePlayed(void 0))})};(null===(t=this.audio)||void 0===t?void 0:t.src)||("audio"===s.type||this.noAutoDownload?Object(l.b)(h,()=>{i(!0)},{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}):i(!1))}}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter.removeAll(),this.listenerSetter=null,this.preloader=null)}}customElements.define("audio-element",Ne);class ze{constructor(e,t){this.className=e,this.fill=t,this.container=document.createElement("div"),this.container.className=e,this.border=document.createElement("div"),this.border.classList.add(e+"-border"),this.content=document.createElement("div"),this.content.classList.add(e+"-content"),this.title=document.createElement("div"),this.title.classList.add(e+"-title"),this.title.setAttribute("dir","auto"),this.subtitle=document.createElement("div"),this.subtitle.classList.add(e+"-subtitle"),this.subtitle.setAttribute("dir","auto"),this.content.append(this.title,this.subtitle),this.container.append(this.border,this.content)}}function Ve(e){var t,s;let{title:n,titleEl:a,subtitle:o,subtitleEl:l,mediaEl:c,message:d,loadPromises:h}=e;void 0!==n&&("string"==typeof n&&(n=Object(Y.f)(n,140),n=J.a.wrapEmojiText(n)),Object(k.a)(a,n)),h||(h=[]);let p=d&&d.media,u=!1,m=!1;const g=c?Array.from(c.children).slice():[];let b;if(p&&c){if(l.textContent="",l.append(i.a.wrapMessageForReply(d,void 0,void 0,void 0,void 0,!0)),p.webpage&&(p=p.webpage),p.photo||p.document&&(null===(t=p.document.thumbs)||void 0===t?void 0:t.length)){b=er.chat.bubbles.getMiddleware();const e=er.chat.bubbles.lazyLoadQueue;if("sticker"===(null===(s=p.document)||void 0===s?void 0:s.type))u=!0,Cs({doc:p.document,div:c,lazyLoadQueue:e,group:Xo,width:32,height:32,middleware:b,loadPromises:h});else{const t=p.photo||p.document;m="round"===t.type;try{Ls({photo:t,container:c,boxWidth:32,boxHeight:32,size:r.a.choosePhotoSize(t,32,32),middleware:b,lazyLoadQueue:e,noBlur:!0,withoutPreloader:!0,loadPromises:h}),u=!0}catch(e){}}}}else d?(l.textContent="",l.append(i.a.wrapMessageForReply(d,d.message&&Object(Y.f)(d.message,140)))):("string"==typeof o&&(o=Object(Y.f)(o,140),o=J.a.wrapEmojiText(o)),Object(k.a)(l,o||""));return Promise.all(h).then(()=>{b&&!b()||(g.forEach(e=>e.remove()),c&&c.classList.toggle("is-round",m))}),u}class Ge extends ze{constructor(e){super(e,(e,t="",s)=>{this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const i=Ve({title:e,titleEl:this.title,subtitle:t,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s});this.container.classList.toggle("is-media",i),i?this.content.prepend(this.mediaEl):this.mediaEl.remove()}),this.className=e}}const Ke=0,We=1,qe=2,Qe=4,$e=8;class Ye{constructor(e,t,s,i,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=s,this.spacing=i,this.maxHeight=n,this.count=e.length,this.ratios=Ye.countRatios(e),this.proportions=Ye.countProportions(this.ratios),this.averageRatio=Object(f.a)(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find(e=>e>2)?new Xe(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:$e|We|qe},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:$e|Qe|qe}]}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:We|$e|Qe},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:We|qe|Qe}]}layoutTwoLeftRight(){const e=Math.round(1.5*this.minWidth),t=Math.min(Math.round(Math.max(.4*(this.maxWidth-this.spacing),(this.maxWidth-this.spacing)/this.ratios[0]/(1/this.ratios[0]+1/this.ratios[1]))),this.maxWidth-this.spacing-e),s=this.maxWidth-t-this.spacing,i=Math.min(this.maxHeight,Math.round(Math.min(s/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:s,height:i},sides:We|$e|Qe},{geometry:{x:s+this.spacing,y:0,width:t,height:i},sides:We|qe|Qe}]}layoutThreeLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min((this.maxHeight-this.spacing)/2,this.ratios[1]*(this.maxWidth-this.spacing)/(this.ratios[2]+this.ratios[1]))),s=e-t-this.spacing,i=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],s*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-i);return[{geometry:{x:0,y:0,width:n,height:e},sides:We|$e|Qe},{geometry:{x:n+this.spacing,y:0,width:i,height:s},sides:We|qe},{geometry:{x:n+this.spacing,y:s+this.spacing,width:i,height:t},sides:Qe|qe}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),s=(this.maxWidth-this.spacing)/2,i=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(s/this.ratios[1],s/this.ratios[2]))),n=e-s-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:$e|We|qe},{geometry:{x:0,y:t+this.spacing,width:s,height:i},sides:Qe|$e},{geometry:{x:s+this.spacing,y:t+this.spacing,width:n,height:i},sides:Qe|qe}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),s=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),i=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),s*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),s*this.ratios[3])),a=e-i-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,s);return[{geometry:{x:0,y:0,width:e,height:t},sides:$e|We|qe},{geometry:{x:0,y:t+this.spacing,width:i,height:o},sides:Qe|$e},{geometry:{x:i+this.spacing,y:t+this.spacing,width:a,height:o},sides:Qe},{geometry:{x:i+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:qe|Qe}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),s=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),i=Math.round(s/this.ratios[1]),n=Math.round(s/this.ratios[2]),a=e-i-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,s));return[{geometry:{x:0,y:0,width:t,height:e},sides:We|$e|Qe},{geometry:{x:t+this.spacing,y:0,width:o,height:i},sides:We|qe},{geometry:{x:t+this.spacing,y:i+this.spacing,width:o,height:n},sides:qe},{geometry:{x:t+this.spacing,y:i+n+2*this.spacing,width:o,height:a},sides:Qe|qe}]}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 Xe{constructor(e,t,s,i,n,a=4*s/3){this.averageRatio=t,this.maxWidth=s,this.minWidth=i,this.spacing=n,this.maxHeight=a,this.ratios=Xe.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map(e=>t>1.1?Object(I.a)(e,1,2.75):Object(I.a)(e,.6667,1))}layout(){let e=new Array(this.count),t=[];const s=(e,t)=>{const s=this.ratios.slice(e,e+t),i=Object(f.a)(s,0);return(this.maxWidth-(t-1)*this.spacing)/i},i=e=>{let i=[],n=0;for(let t of e)i.push(s(n,t)),n+=t;t.push({lineCounts:e,heights:i})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||i([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const s=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||s>3||i([e,t,s])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let s=1;s!==this.count-e-t;++s){const n=this.count-e-t-s;e>3||t>3||s>3||n>3||i([e,t,s,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:s}=e,i=s.length,o=Object(f.a)(t,0)+this.spacing*(i-1),r=Math.min(...t),l=(Math.max(...t),r{for(let e=1;e!==i;++e)if(s[e-1]>s[e])return 1.5;return 1})(),d=Math.abs(o-this.maxHeight)*l*c;(!n||d{if(this.uploadAvatar)return!0;let e=0,t=0,s=0;return this.inputFields.forEach(i=>{i.isValid()&&(i.isChanged()&&++e,i.required&&++s),i.required&&++t}),t===s&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},Object(w.g)(this,e),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=Q({icon:"check"}),e.withoutAvatar||(this.avatarElem=document.createElement("avatar-element"),this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.setAttribute("peer",""+this.peerId),e.doNotEditAvatar||(this.avatarEdit=new q(e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()}),this.avatarEdit.container.append(this.avatarElem))),this.inputFields.forEach(e=>{this.listenerSetter.add(e.input)("input",this.handleChange)}),this.handleChange()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this.inputFields.forEach(t=>t.input.toggleAttribute("disabled",e)),this.handleChange()}lockWithPromise(e,t=!1){this.disabled=!0,e.then(()=>{t&&(this.disabled=!1)},()=>{this.disabled=!1})}}function tt(e,t){const s=document.createElement("form");return e.forEach(e=>{const{container:i,input:n}=e;s.append(i),n.addEventListener("change",e=>{n.checked&&t(n.value,e)})}),s}class st{constructor(e={}){this.freezed=!1,this.container=document.createElement(e.radioField||e.checkboxField?"label":"div"),this.container.classList.add("row"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("row-subtitle"),this.subtitle.setAttribute("dir","auto"),e.subtitle?"string"==typeof e.subtitle?g(this.subtitle,e.subtitle):this.subtitle.append(e.subtitle):e.subtitleLangKey&&this.subtitle.append(Object(x.i18n)(e.subtitleLangKey,e.subtitleLangArgs)),this.container.append(this.subtitle);let t=!!e.havePadding;if(e.radioField||e.checkboxField){if(t=!0,e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label)),e.checkboxField){this.checkboxField=e.checkboxField;const t=e.checkboxField.label.classList.contains("checkbox-field-toggle");t?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):this.container.append(this.checkboxField.label),e.noCheckboxSubtitle||t||this.checkboxField.input.addEventListener("change",()=>{Object(k.a)(this.subtitle,Object(x.i18n)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))})}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;if(e.titleRight?(t=document.createElement("div"),t.classList.add("row-title-row"),this.container.append(t)):t=this.container,this.title=document.createElement("div"),this.title.classList.add("row-title"),this.title.setAttribute("dir","auto"),e.title?this.title.innerHTML=e.title:this.title.append(Object(x.i18n)(e.titleLangKey)),t.append(this.title),e.titleRight){const s=document.createElement("div");s.classList.add("row-title","row-title-right"),"string"==typeof e.titleRight?s.innerHTML=e.titleRight:s.append(e.titleRight),t.append(s)}}e.icon&&(t=!0,this.title.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),t&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&this.container.addEventListener("click",t=>{this.freezed||e.clickable(t)}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||Object(se.ripple)(this.container,void 0,void 0,!0))}}const it=(e,t)=>tt(e.map(e=>({container:e.container,input:e.radioField.input})),t);function nt(e){navigator.clipboard?navigator.clipboard.writeText(e):function(e){var t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{document.execCommand("copy")}catch(e){}document.body.removeChild(t)}(e)}var at=s(65);class ot{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field");const s=this.input=document.createElement("input");s.type="radio",s.name="input-radio-"+e.name,e.value&&(s.value=e.value,e.stateKey&&(M.default.getState().then(t=>{s.checked=Object(w.d)(t,e.stateKey)===e.value}),s.addEventListener("change",()=>{M.default.setByKey(e.stateKey,e.value)})));const i=this.main=document.createElement("div");i.classList.add("radio-field-main"),e.text?i.innerHTML=e.text:e.langKey&&Object(x._i18n)(i,e.langKey),t.append(s,i)}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}}const rt=document.createElement("div");function lt(e){Object(k.a)(rt,e),document.body.append(rt),rt.dataset.timeout&&clearTimeout(+rt.dataset.timeout),rt.dataset.timeout=""+setTimeout(()=>{rt.remove(),delete rt.dataset.timeout},3e3)}function ct(e){lt(Object(x.i18n)(e.langPackKey))}function dt(e,t,s=!0,i=!0){let n,a,o,r,l=!1;return(...c)=>(a||(a=new Promise((e,t)=>(o=e,r=t))),n?(clearTimeout(n),l=!0,r(),a=new Promise((e,t)=>(o=e,r=t))):s&&(o(e(...c)),l=!1),n=setTimeout(()=>{!i||s&&!l||o(e(...c)),n=a=o=r=void 0,l=!1},t),a.catch(()=>{}),a)}rt.classList.add("toast");var ht=s(33);class pt extends _.b{constructor(e){super(e),this.checkUsernameDebounced=dt(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(_.a.Neutral,this.options.label),void(this.options.onChange&&this.options.onChange());J.b.isUsernameValid(e)?this.setState(_.a.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?this.options.onChange&&this.options.onChange():this.checkUsernameDebounced(e)})}getValue(){let e=this.value;return this.options.head&&(e=e.slice(this.options.head.length),this.setValueSilently(this.options.head+e)),e}checkUsername(e){this.checkUsernamePromise||(this.options.peerId?this.checkUsernamePromise=ht.a.invokeApi("channels.checkUsername",{channel:K.a.getChannelInput(this.options.peerId.toChatId()),username:e}):this.checkUsernamePromise=ht.a.invokeApi("account.checkUsername",{username:e}),this.checkUsernamePromise.then(t=>{this.getValue()===e&&(t?this.setState(_.a.Valid,this.options.availableText):this.setError(this.options.takenText))},t=>{if(this.getValue()===e)switch(t.type){case"USERNAME_INVALID":this.setError(this.options.invalidText)}}).then(()=>{this.checkUsernamePromise=void 0,this.options.onChange&&this.options.onChange();const t=this.getValue();t!==e&&this.isValidToChange()&&J.b.isUsernameValid(t)&&this.checkUsername(t)}))}}var ut=s(59),mt=s(55);class gt extends ut.b{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),t.buttons&&Object(ut.a)(t.buttons),Object.assign({overlayClosable:!0},t)),this.className=e,t.peerId){let e=new ur;e.setAttribute("dialog","1"),e.setAttribute("peer",""+t.peerId),e.classList.add("avatar-32"),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append(Object(x.i18n)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const s=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append(Object(x.i18n)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(e.innerHTML=t.description),s.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach(e=>{e.withRipple=!1;const t=new mt.a(e);e.checkboxField=t,s.append(t.label)}),t.buttons.forEach(e=>{if(e.callback){const s=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach(t=>{t.checkboxField.checked&&e.add(t.text)}),s(e)}}})),this.container.insertBefore(s,this.header.nextElementSibling)}}var bt=s(58);class vt extends V{init(){this.container.classList.add("edit-peer-container","group-type-container");const e=K.a.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new dn({name:e?"ChannelType":"GroupType"}),s=Object(at.b)(),i=new st({radioField:new ot({langKey:e?"ChannelPrivate":"MegaPrivate",name:s,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),a=new st({radioField:new ot({langKey:e?"ChannelPublic":"MegaPublic",name:s,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),o=it([i,a],e=>{const t=[c,p];"public"===e&&t.reverse(),t[0].container.classList.remove("hide"),t[1].container.classList.add("hide"),m()}),r=K.a.getChat(this.chatId);t.content.append(o);const c=new dn({}),d=new st({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{nt(this.chatFull.exported_invite.link),lt(x.default.format("LinkCopied",!0))}}),h=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});Object(l.b)(h,()=>{new gt("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=Object(bt.a)([h],!0);n.default.getChatInviteLink(this.chatId,!0).then(t=>{e(),d.title.innerHTML=t})}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()},{listenerSetter:this.listenerSetter}),c.content.append(d.container,h);const p=new dn({caption:e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup",noDelimiter:!0}),u=document.createElement("div");u.classList.add("input-wrapper");const m=()=>{const e=i.radioField.checked&&"t.me/"!==b||g.isValidToChange()&&g.input.classList.contains("valid");v.classList.toggle("is-visible",e)},g=new pt({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:m,peerId:this.chatId.toPeerId(!0),head:"t.me/"}),b="t.me/"+(r.username||"");u.append(g.container),p.content.append(u);const v=Q({icon:"check",className:"is-visible"});this.content.append(v),Object(l.b)(v,()=>{Object(te.g)(v);const e=a.radioField.checked?g.getValue():"";K.a.migrateChat(this.chatId).then(t=>K.a.updateUsername(t,e)).then(()=>{this.close()})},{listenerSetter:this.listenerSetter}),("t.me/"!==b?a:i).radioField.checked=!0,g.setOriginalValue(b),this.scrollable.append(t.container,c.container,p.container)}}var ft=s(63);class yt{constructor(e){this.loading=!1,this.loaded=!1,Object(w.g)(this,e),e.scrollable.onScrolledBottom=()=>{this.load()}}load(){return this.loaded?Promise.resolve():this.loading?this.promise:(this.loading=!0,void(this.promise=this.getPromise().then(e=>{this.loading=!1,this.promise=void 0,e?(this.loaded=!0,this.scrollable.onScrolledBottom=null):this.scrollable.checkForTriggers()},()=>{this.promise=void 0,this.loading=!1})))}}var wt=s(89),St=s(85),Lt=s(49),Et=s(92),Ct=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class It{constructor(e){this.container=document.createElement("div"),this.list=kr.createChatList(),this.chatsContainer=document.createElement("div"),this.selected=new Set,this.freezed=!1,this.folderId=0,this.offsetIndex=0,this.query="",this.loadedWhat={},this.renderedPeerIds=new Set,this.peerType=["dialogs"],this.multiSelect=!0,this.rippleEnabled=!0,this.avatarSize=48,this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=null),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(let e in this.tempIds)++this.tempIds[e];this.list=kr.createChatList(),this.promise=null,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},Object(w.g)(this,e),this.container.classList.add("selector");const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>(this.needSwitchList&&(this.scrollable.splitUp.replaceWith(this.list),this.scrollable.setVirtualContainer(this.list),this.needSwitchList=!1),e=e.filter(e=>{const t=!this.renderedPeerIds.has(e);return t&&this.renderedPeerIds.add(e),t}),this.filterPeerTypeBy&&(e=e.filter(e=>{if(e.isPeerId()){if(!o.a.getPeer(e).deleted)return this.filterPeerTypeBy.find(t=>o.a[t](e))}return!0})),t(e)),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?Object(x._i18n)(this.input,this.placeholder,void 0,"placeholder"):Object(x._i18n)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){let e=document.createElement("div");e.classList.add("selector-search-container"),this.selectedContainer=document.createElement("div"),this.selectedContainer.classList.add("selector-search"),this.selectedContainer.append(this.input),e.append(this.selectedContainer),this.selectedScrollable=new T.b(e);let t=document.createElement("hr");this.selectedContainer.addEventListener("click",e=>{if(this.freezed)return;let t=e.target;if(t=Object(Me.a)(t,"selector-user"),!t)return;const s=t.dataset.key,i=this.chatsContainer.querySelector('[data-peer-id="'+s+'"]');i?i.click():this.remove(s.toPeerId())}),this.container.append(e,t)}this.chatsContainer.classList.add("chatlist-container"),this.chatsContainer.append(this.list),this.scrollable=new T.b(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),this.chatsContainer.addEventListener("click",e=>{const t=Object(St.a)(e.target,"data-peer-id");if(Object(c.a)(e),!t)return;if(this.freezed)return;let s=t.dataset.peerId;if(s=s.isPeerId()?s.toPeerId():s,!this.multiSelect)return void this.add(s);this.selected.has(s)?this.remove(s):this.add(s);const i=t.querySelector("input");i.checked=!i.checked});const s=dt(this.onInput,200,!1,!0);this.input.addEventListener("input",s),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout(()=>{let t=this.getMoreResults();e.onFirstRender&&t.then(()=>{e.onFirstRender()})},0)}renderSaved(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!P.a.testSelfSearch(this.query)||this.renderResultsFunc([a.default.myId])}getTempId(e){return void 0===this.tempIds[e]&&(this.tempIds[e]=0),++this.tempIds[e]}getMoreDialogs(){return Ct(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=Et.a.height/72*1.25|0,t=this.getTempId("dialogs"),s=i.a.getConversations(this.query,this.offsetIndex,e,this.folderId,!0).promise;this.promise=s;const n=yield s;if(this.tempIds.dialogs!==t)return;this.promise=null;let o=n.dialogs;if(o.length){const e=o[o.length-1].index||0;o=o.slice(),o.findAndSplice(e=>e.peerId===a.default.myId),this.chatRightsAction&&(o=o.filter(e=>this.filterByRights(e.peerId))),this.renderSaved(),this.offsetIndex=e}if(this.renderResultsFunc(o.map(e=>e.peerId)),n.isEnd){if(!this.loadedWhat.dialogs)return this.renderSaved(),this.loadedWhat.dialogs=!0,this.offsetIndex=0,this.folderId=1,this.getMoreDialogs();if(this.loadedWhat.archived=!0,!this.loadedWhat.contacts)return this.getMoreContacts()}}))}filterByRights(e){return e.isUser()&&("send_messages"!==this.chatRightsAction||P.a.canSendToUser(e))||K.a.hasRights(e.toChatId(),this.chatRightsAction)}getMoreContacts(){return Ct(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const t=this.getTempId("contacts"),s=Promise.all([e?P.a.getContactsPeerIds(this.query):[],this.query?P.a.searchContacts(this.query):void 0]);this.promise=s;let[i,n]=yield s;if(this.tempIds.contacts!==t)return;if(n){let t=e?n.my_results.concat(n.results):n.my_results;this.chatRightsAction&&(t=t.filter(e=>this.filterByRights(e))),this.peerType.includes("dialogs")||(t=t.filter(e=>e.isUser())),this.cachedContacts=Object(f.b)(i.concat(t))}else this.cachedContacts=i.slice();Object(f.e)(this.cachedContacts,a.default.myId),this.promise=null}const t=Et.a.height/72*1.25|0,s=this.cachedContacts.splice(0,t);this.renderResultsFunc(s),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return Ct(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.channelParticipants)return;const e=this.getTempId("channelParticipants"),t=n.default.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount),s=yield t;if(this.tempIds.channelParticipants!==e)return;const i=s.participants.map(e=>K.a.getParticipantPeerId(e));Object(f.e)(i,a.default.myId),this.renderResultsFunc(i),(this.list.childElementCount>=s.count||s.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){const e=(()=>{const e=[];return!this.peerType.includes("dialogs")||this.loadedWhat.archived||(e.push(this.getMoreDialogs()),this.loadedWhat.archived)?(!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts||e.push(this.getMoreContacts()),this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants&&e.push(this.getMoreChannelParticipants()),e):e})(),t=Promise.all(e);return e.length&&t.then(this.checkForTriggers),t}renderResults(e){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=e.filter(e=>P.a.isNonContactUser(e))),e.forEach(e=>{const{dom:t}=kr.addDialogNew({dialog:e,container:this.scrollable,drawStatus:!1,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const s=this.selected.has(e),i=new mt.a;s&&(i.input.checked=!0),t.containerEl.prepend(i.label)}let s;s=e.isAnyChat()?n.default.getChatMembersString(e.toChatId()):e===a.default.myId?Object(x.i18n)(this.selfPresence):P.a.getUserStatusString(e),t.lastMessageSpan.append(s)})}add(e,t,s=!0){if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const i=document.createElement("div");i.classList.add("selector-user","scale-in");const n=document.createElement("avatar-element");return n.classList.add("selector-user-avatar","tgico"),n.setAttribute("dialog","1"),n.classList.add("avatar-32"),i.dataset.key=""+e,e.isPeerId()&&(void 0===t&&(t=new Lt.a({peerId:e.toPeerId(),dialog:!0}).element),n.setAttribute("peer",""+e)),t&&("string"==typeof t?i.innerHTML=t:(Object(k.a)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",n),this.selectedContainer.insertBefore(i,this.input),this.onChange&&this.onChange(this.selected.size),s&&this.selectedScrollable.scrollIntoViewNew(this.input,"center"),i}remove(e){if(!this.multiSelect)return;const t=this.selectedContainer.querySelector(`[data-key="${e}"]`);t.classList.remove("scale-in"),t.offsetWidth,t.classList.add("scale-out");const s=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};a.default.settings.animationsEnabled?t.addEventListener("animationend",s,{once:!0}):s()}getSelected(){return[...this.selected]}addInitial(e){e.forEach(e=>{this.add(e,void 0,!1)}),window.requestAnimationFrame(()=>{this.selectedScrollable.scrollIntoViewNew(this.input,"center",void 0,void 0,wt.a.Static)})}}var Mt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Pt extends ut.b{constructor(e){super("popup-forward",null,{closable:!0,overlayClosable:!0,body:!0}),this.selector=new It({appendTo:this.body,onChange:()=>Mt(this,void 0,void 0,(function*(){const t=this.selector.getSelected(),s=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(s);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()})),peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),ue.IS_TOUCH_SUPPORTED||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:46,peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence}),this.title.append(this.selector.input)}}class Tt extends V{init(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new dn({name:"UserRestrictionsCanDo"}),s=document.createElement("div");s.classList.add("chatlist-container"),t.content.insertBefore(s,t.title);const i=kr.createChatList({new:!0});s.append(i);const{dom:n}=kr.addDialogNew({dialog:this.userId.toPeerId(!1),container:i,drawStatus:!1,rippleEnabled:!0,avatarSize:48});n.lastMessageSpan.append(P.a.getUserStatusString(this.userId));const a=new xt({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0});e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&Object(w.b)(this.participant.banned_rights.pFlags,e.pFlags)||K.a.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new dn({});if("channelParticipantBanned"===this.participant._){const s=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});Object(l.b)(s,()=>{const t=Object(bt.a)([s],!0);K.a.clearChannelParticipantBannedRights(this.chatId,this.participant).then(()=>{this.eventListener.removeEventListener("destroy",e),this.close()},()=>{t()})},{listenerSetter:this.listenerSetter}),t.content.append(s)}const s=Object(U.a)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});Object(l.b)(s,()=>{Object(bt.a)([s],!0);K.a.kickFromChannel(this.chatId,this.participant).then(()=>{this.eventListener.removeEventListener("destroy",e),this.close()})},{listenerSetter:this.listenerSetter}),t.content.append(s),this.scrollable.append(t.container)}}}var kt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class xt{constructor(e){this.v=[{flags:["send_messages"],text:"UserRestrictionsSend",exceptionText:"UserRestrictionsNoSend"},{flags:["send_media"],text:"UserRestrictionsSendMedia",exceptionText:"UserRestrictionsNoSendMedia"},{flags:["send_stickers","send_gifs"],text:"UserRestrictionsSendStickers",exceptionText:"UserRestrictionsNoSendStickers"},{flags:["send_polls"],text:"UserRestrictionsSendPolls",exceptionText:"UserRestrictionsNoSendPolls"},{flags:["embed_links"],text:"UserRestrictionsEmbedLinks",exceptionText:"UserRestrictionsNoEmbedLinks"},{flags:["invite_users"],text:"UserRestrictionsInviteUsers",exceptionText:"UserRestrictionsNoInviteUsers"},{flags:["pin_messages"],text:"UserRestrictionsPinMessages",exceptionText:"UserRestrictionsNoPinMessages"},{flags:["change_info"],text:"UserRestrictionsChangeInfo",exceptionText:"UserRestrictionsNoChangeInfo"}],this.toggleWith={send_messages:["send_media","send_stickers","send_polls","embed_links"]};const t=K.a.getChat(e.chatId).default_banned_rights,s=e.participant?K.a.combineParticipantBannedRights(e.chatId,e.participant.banned_rights):t;for(const i of this.v){const n=i.flags[0];i.checkboxField=new mt.a({text:i.text,checked:K.a.hasRights(e.chatId,n,s),restriction:!0,withRipple:!0}),e.participant&&t.pFlags[n]&&(i.checkboxField.input.disabled=!0,Object(l.b)(i.checkboxField.label,e=>{lt(x.default.format("UserRestrictionsDisabled",!0))},{listenerSetter:e.listenerSetter})),this.toggleWith[n]&&e.listenerSetter.add(i.checkboxField.input)("change",()=>{if(!i.checkboxField.checked){this.v.filter(e=>this.toggleWith[n].includes(e.flags[0])).forEach(e=>{e.checkboxField.checked=!1})}}),e.appendTo.append(i.checkboxField.label)}}takeOut(){const e={_:"chatBannedRights",until_date:2147483647,pFlags:{}};for(const t of this.v){!t.checkboxField.checked&&t.flags.forEach(t=>{e.pFlags[t]=!0})}return e}}class Ot extends V{init(){return kt(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new dn({name:"ChannelPermissionsHeader"});e=new xt({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content}),this.eventListener.addEventListener("destroy",()=>{K.a.editChatDefaultBannedRights(this.chatId,e.takeOut())},{once:!0}),this.scrollable.append(t.container)}{const t=new dn({name:"PrivacyExceptions"}),s=new st({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new Pt({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout(()=>{i(e)},0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})}}),i=e=>kt(this,void 0,void 0,(function*(){let t;try{t=yield n.default.getChannelParticipant(this.chatId,e)}catch(e){return void lt("User is no longer participant")}const s=new Tt(this.slider);s.participant=t,s.chatId=this.chatId,s.userId=e,s.open()}));t.content.append(s.container);const r=t.generateContentElement();r.classList.add("chatlist-container");const c=kr.createChatList({new:!0});r.append(c),Object(l.b)(c,e=>{const t=Object(ft.a)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();i(s)},{listenerSetter:this.listenerSetter});const d=(t,s)=>{const i=s.banned_rights,n=K.a.getChat(this.chatId).default_banned_rights,a=[];e.v.forEach(e=>{const t=e.flags[0];i.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)});const o=t.querySelector(".user-last-message");a.length&&(o.innerHTML="",o.append(...Object(x.join)(a.map(e=>Object(x.i18n)(e)),!1))),o.classList.toggle("hide",!a.length)},h=(e,t)=>{const{dom:s}=kr.addDialogNew({dialog:o.a.getPeerId(e.peer),container:c,drawStatus:!1,rippleEnabled:!0,avatarSize:48,append:t});d(s.listEl,e)};this.listenerSetter.add(a.default)("updateChannelParticipant",e=>{var t,s,i;const n="channelParticipantBanned"===(null===(t=e.new_participant)||void 0===t?void 0:t._)&&!e.new_participant.banned_rights.pFlags.view_messages,a=c.querySelector(`[data-peer-id="${e.user_id}"]`);n?(a?d(a,e.new_participant):h(e.new_participant,!1),"channelParticipantBanned"!==(null===(s=e.prev_participant)||void 0===s?void 0:s._)&&++m):(a&&a.remove(),"channelParticipantBanned"===(null===(i=e.prev_participant)||void 0===i?void 0:i._)&&--m),p()});const p=()=>{Object(k.a)(s.subtitle,Object(x.i18n)(m?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[m]))};let u,m=0;const g=()=>(u=new yt({scrollable:this.scrollable,getPromise:()=>n.default.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,c.childElementCount).then(e=>{for(const t of e.participants)h(t,!0);return m=e.count,p(),e.participants.length<50||e.count===c.childElementCount})}),u.load());this.scrollable.append(t.container),K.a.isChannel(this.chatId)?yield g():(p(),this.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,g())}))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}class At{constructor(e,t=o.a.getDialogType(e),s){const n=new Lt.a({peerId:e}).element,a=(t,n=p&&!!t.size)=>{let a=K.a.leave(e.toChatId());n&&(a=a.finally(()=>i.a.flushHistory(e))),s&&s(a)},r=t=>{let n;if(e.isUser())n=i.a.flushHistory(e,!1,p?!!t.size:void 0);else{if(!t.size)return a(t);n=K.a.delete(e.toChatId())}s&&s(n)};let l,c,d,h,p;switch(t){case"channel":K.a.hasRights(e.toChatId(),"delete_chat")?(K.a.deleteChannel,l="ChannelDeleteMenu",c="AreYouSureDeleteAndExitChannel",h=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:r}],p=[{text:"DeleteChannelForAll"}]):(l="LeaveChannelMenu",c="ChannelLeaveAlertWithName",d=[n],h=[{langKey:"LeaveChannel",isDanger:!0,callback:a}]);break;case"chat":l="DeleteChatUser",c="AreYouSureDeleteThisChatWithUser",d=[n],h=[{langKey:"DeleteChatUser",isDanger:!0,callback:r}],p=[{text:"DeleteMessagesOptionAlso",textArgs:[new Lt.a({peerId:e}).element]}];break;case"saved":l="DeleteChatUser",c="AreYouSureDeleteThisChatSavedMessages",h=[{langKey:"DeleteChatUser",isDanger:!0,callback:r}];break;case"megagroup":case"group":K.a.hasRights(e.toChatId(),"delete_chat")?(l="DeleteMegaMenu",c="AreYouSureDeleteAndExit",h=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:r}],p=[{text:"DeleteChat.DeleteGroupForAll"}]):(l="LeaveMegaMenu",c="AreYouSureDeleteAndExitName",d=[n],h=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>a(e,!0)}])}new gt("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:p}).show()}}var _t=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ft extends z{_init(){return _t(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.innerHTML="",this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");const e=yield n.default.getChatFull(this.chatId,!0),t=K.a.getChat(this.chatId),s=K.a.isBroadcast(this.chatId),i=K.a.isChannel(this.chatId),o=[],r=e=>{o.push(e)};this.listenerSetter.add(a.default)("chat_update",e=>{this.chatId===e&&o.forEach(e=>e())});const c=this.chatId.toPeerId(!0);{const i=new dn({noDelimiter:!0}),n=[],o=document.createElement("div");if(o.classList.add("input-wrapper"),this.chatNameInputField=new _.b({label:s?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new _.b({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(t.title),this.descriptionInputField.setOriginalValue(e.about),o.append(this.chatNameInputField.container,this.descriptionInputField.container),n.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new et({peerId:c,inputFields:n,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),i.content.append(this.editPeer.avatarEdit.container,o),K.a.hasRights(this.chatId,"change_type")){const n=new st({titleLangKey:s?"ChannelType":"GroupType",clickable:()=>{const t=new vt(this.slider);t.chatId=this.chatId,t.chatFull=e,t.open(),this.listenerSetter.add(t.eventListener)("destroy",a)},icon:"lock"}),a=()=>{let e;n.subtitle.textContent="",e=s?t.username?"TypePublic":"TypePrivate":t.username?"TypePublicGroup":"TypePrivateGroup",n.subtitle.append(Object(x.i18n)(e))};a(),i.content.append(n.container)}if(K.a.hasRights(this.chatId,"change_permissions")&&!s){const e=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],s=new st({titleLangKey:"ChannelPermissions",clickable:()=>{const e=new Ot(this.slider);e.chatId=this.chatId,e.open()},icon:"permissions"}),n=()=>{s.subtitle.innerHTML=e.reduce((e,s)=>e+ +K.a.hasRights(this.chatId,s,t.default_banned_rights),0)+"/"+e.length};n(),i.content.append(s.container),this.listenerSetter.add(a.default)("chat_update",e=>{this.chatId===e&&n()})}if(this.scrollable.append(i.container),Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0;let e=[];const t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(K.a.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(K.a.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then(e=>K.a.editPhoto(t,e))),Promise.race(e).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()})},{listenerSetter:this.listenerSetter}),s&&K.a.hasRights(this.chatId,"change_info")){const e=new mt.a({text:"PeerInfo.SignMessages",checked:!!t.pFlags.signatures,withRipple:!0});this.listenerSetter.add(e.input)("change",()=>{const t=e.toggleDisability(!0);K.a.toggleSignatures(this.chatId,e.checked).then(()=>{t()})}),r(()=>{e.setValueSilently(!!t.pFlags.signatures)}),i.content.append(e.label)}}if(!s){const t=new dn({});if(!s&&K.a.hasRights(this.chatId,"change_permissions")){const s=new mt.a({text:"ChatHistory",withRipple:!0});this.listenerSetter.add(s.input)("change",()=>{const e=s.toggleDisability(!0);K.a.togglePreHistoryHidden(this.chatId,!s.checked).then(()=>{e()})});const n=()=>{s.setValueSilently(i&&!e.pFlags.hidden_prehistory)};n(),r(n),t.content.append(s.label)}this.scrollable.append(t.container)}if(K.a.hasRights(this.chatId,"delete_chat")){const e=new dn({}),t=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:s?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});Object(l.b)(t,()=>{new At(c,void 0,e=>{const s=Object(bt.a)([t],!0);e.then(()=>{this.close()},()=>{s()})})},{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}i||this.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{c===e&&(this.chatId=t.toChatId(),this._init())})}))}init(){return this._init()}}var Dt=s(97);class jt extends z{init(){this.container.classList.add("edit-peer-container","edit-contact-container");const e=!P.a.isContact(this.peerId.toUserId());this.setTitle(e?"AddContactTitle":"Edit");{const t=new dn({noDelimiter:!0}),s=[],n=document.createElement("div");if(n.classList.add("input-wrapper"),this.nameInputField=new _.b({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new _.b({label:"LastName",name:"contact-lastname",maxLength:70}),this.peerId){const t=P.a.getUser(this.peerId);e?(this.nameInputField.setDraftValue(t.first_name),this.lastNameInputField.setDraftValue(t.last_name)):(this.nameInputField.setOriginalValue(t.first_name),this.lastNameInputField.setOriginalValue(t.last_name))}if(n.append(this.nameInputField.container,this.lastNameInputField.container),s.push(this.nameInputField,this.lastNameInputField),this.editPeer=new et({peerId:this.peerId,inputFields:s,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),this.peerId){const s=document.createElement("div");s.classList.add("avatar-edit"),s.append(this.editPeer.avatarElem);const r=new mt.a({text:"Notifications"});r.input.addEventListener("change",e=>{e.isTrusted&&i.a.mutePeer(this.peerId)}),this.listenerSetter.add(a.default)("notify_settings",e=>{if("notifyPeer"!==e.peer._)return;const t=o.a.getPeerId(e.peer.peer);if(this.peerId===t){const t=!Dt.a.isMuted(e.notify_settings);t!==r.checked&&(r.checked=t)}});const l=document.createElement("div");l.classList.add("profile-name"),l.append(new Lt.a({peerId:this.peerId}).element);const c=document.createElement("div");if(c.classList.add("profile-subtitle"),c.append(Object(x.i18n)("EditContact.OriginalName")),t.content.append(s,l,c,n),e){const e=P.a.getUser(this.peerId),s=new st({icon:"phone",titleLangKey:e.phone?void 0:"MobileHidden",title:e.phone?P.a.formatUserPhone(e.phone):void 0,subtitleLangKey:e.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:e.phone?void 0:[new Lt.a({peerId:this.peerId}).element]});t.content.append(s.container)}else{const e=new st({checkboxField:r}),s=!Dt.a.isPeerLocalMuted(this.peerId,!1);r.checked=s,t.content.append(e.container)}}else t.content.append(n);this.scrollable.append(t.container),Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0,P.a.addContact(this.peerId,this.nameInputField.value,this.lastNameInputField.value,P.a.getUser(this.peerId).phone).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()})},{listenerSetter:this.listenerSetter})}if(!e){const e=new dn({}),t=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});Object(l.b)(t,()=>{new gt("popup-delete-contact",{peerId:this.peerId,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:Object(ut.a)([{langKey:"Delete",callback:()=>{const e=Object(bt.a)([t],!0);P.a.deleteContacts([this.peerId]).then(()=>{this.close()},()=>{e()})},isDanger:!0}])}).show()},{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}}}class Bt extends z{init(){this.nextBtn=Q({icon:"arrow_next"}),this.content.append(this.nextBtn),this.scrollable.container.remove(),this.nextBtn.addEventListener("click",()=>{const e=this.selector.getSelected().map(e=>e.toPeerId());if(this.skippable)this.takeOut(e),this.close();else{const t=this.takeOut(e);t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()}})}attachToPromise(e){const t=Object(te.g)(this.nextBtn,"arrow_next");e.then(()=>{this.close()},()=>{t()})}open(e){const t=super.open();this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const s="privacy"===this.peerType;return this.selector=new It({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[s?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:s,filterPeerTypeBy:s?["isAnyGroup","isUser"]:void 0}),e.selectedPeerIds&&this.selector.addInitial(e.selectedPeerIds),this.nextBtn.classList.add("tgico-arrow_next"),this.nextBtn.innerHTML="",this.nextBtn.disabled=!1,this.nextBtn.classList.toggle("is-visible",this.skippable),t}}var Rt=!re.IS_FIREFOX&&!1;function Ut(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 24 24"),e.setAttributeNS(null,"width","24"),e.setAttributeNS(null,"height","24"),e.classList.add("verified-icon");const t=document.createElementNS("http://www.w3.org/2000/svg","use");t.setAttributeNS(null,"href","#verified-background"),t.classList.add("verified-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-check"),s.classList.add("verified-check"),e.append(t,s),e}const Ht=e=>e.touches?e.touches[0]:e,Nt=window;let zt=!1;a.default.addEventListener("context_menu_toggle",e=>{zt=e});class Vt{constructor(e){this.cursor="grabbing",this.cancelEvent=!0,this.listenerOptions=!1,this.hadMove=!1,this.xDown=null,this.yDown=null,this.reset=e=>{ue.IS_TOUCH_SUPPORTED?Nt.removeEventListener("touchmove",this.handleMove,{capture:!0}):(Nt.removeEventListener("mousemove",this.handleMove),this.setCursorTo.style.cursor=""),this.onReset&&this.hadMove&&this.onReset(),this.xDown=this.yDown=null,this.hadMove=!1},this.handleStart=e=>{const t=Ht(e);if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return this.reset();this.xDown=t.clientX,this.yDown=t.clientY,ue.IS_TOUCH_SUPPORTED?Nt.addEventListener("touchmove",this.handleMove,{passive:!1,capture:!0}):Nt.addEventListener("mousemove",this.handleMove,!1)},this.handleMove=e=>{if(null===this.xDown||null===this.yDown||zt)return void this.reset();this.cancelEvent&&Object(c.a)(e);const t=Ht(e),s=t.clientX,i=t.clientY,n=this.xDown-s,a=this.yDown-i;if(!this.hadMove){if(!n&&!a)return;this.hadMove=!0,ue.IS_TOUCH_SUPPORTED||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),this.onFirstSwipe&&this.onFirstSwipe()}const o=this.onSwipe(n,a,e);void 0!==o&&o&&this.reset()},Object(w.g)(this,e),this.setCursorTo=this.element,this.setListeners()}setListeners(){ue.IS_TOUCH_SUPPORTED?(this.element.addEventListener("touchstart",this.handleStart,this.listenerOptions),Nt.addEventListener("touchend",this.reset)):(this.element.addEventListener("mousedown",this.handleStart,this.listenerOptions),Nt.addEventListener("mouseup",this.reset))}removeListeners(){ue.IS_TOUCH_SUPPORTED?(this.element.removeEventListener("touchstart",this.handleStart,this.listenerOptions),Nt.removeEventListener("touchend",this.reset)):(this.element.removeEventListener("mousedown",this.handleStart,this.listenerOptions),Nt.removeEventListener("mouseup",this.reset))}setCursor(e){this.cursor=e,!ue.IS_TOUCH_SUPPORTED&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}}var Gt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Kt{constructor(e){this.scrollable=e,this.loadCallbacks=new Map,this.processItem=e=>{const t=document.createElement("div");let s;t.classList.add(Kt.BASE_CLASS+"-avatar","media-container"),e&&(s="object"!=typeof e?r.a.getPhoto(e):e.action.photo);const i=new Image;i.classList.add("avatar-photo"),i.draggable=!1;const n=()=>{if(s){const e=Ls({container:t,photo:s,size:r.a.choosePhotoSize(s,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach(e=>{e.classList.add("avatar-photo")})}else{const e=o.a.getPeerPhoto(this.peerId);d.a.putAvatar(t,this.peerId,e,"photo_big",i)}};return this.avatars.childElementCount<=3?n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.avatars.append(t),this.addTab(),e},this.container=document.createElement("div"),this.container.classList.add(Kt.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(Kt.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(Kt.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(Kt.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(Kt.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(Kt.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(Kt.BASE_CLASS+"-arrow",Kt.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext);const t=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew(this.scrollable.container.firstElementChild,"start"),!1);let s=!1,i=!1;Object(l.b)(this.container,e=>Gt(this,void 0,void 0,(function*(){if(i)return void Object(c.a)(e);if(s)return void(s=!1);if(!t())return;const n=this.container.getBoundingClientRect(),a=e.pageX,o=a-n.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||o>n.width*(1/3)&&o{t.push({element:this.avatars.children[s],item:e})});const s=t.slice(0,this.listLoader.previous.length),n=t.slice(this.listLoader.previous.length+1),a=this.avatars.children[this.listLoader.previous.length];i=!0,dr(a,e,()=>e===this.peerId,this.listLoader.current,s,n),i=!1}else{const e=a>n.right-n.width/2;let t;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,t=0!==this.listLoader.index||e?this.listLoader.index===this.listLoader.count-1&&e?-(this.listLoader.count-1):e?1:-1:this.listLoader.count-1,this.listLoader.go(t),Object(De.b)(()=>{this.avatars.classList.remove("no-transition")})}})));const n=()=>{s=!0,document.body.addEventListener(ue.IS_TOUCH_SUPPORTED?"touchend":"click",e=>{s=!1},{once:!0})};let a=0,h=0,p=0,u=0;new Vt({element:this.avatars,onSwipe:(e,t)=>{p=e;let s=h+e*-Kt.SCALE;return s>0?s=0:st()?!this.container.classList.contains("is-single")&&!i:(n(),Object(c.a)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();a=e.width,u=-a*(this.tabs.childElementCount-1),h=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=Kt.TRANSLATE_TEMPLATE.replace("{x}",h+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(p)/(a/Kt.SCALE))*(p>=0?1:-1);n(),this.avatars.classList.remove("no-transition"),Object(De.b)(()=>{this.listLoader.go(e),this.container.classList.remove("is-swiping")})}});this.intersectionObserver=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&this.loadNearestToTarget(e.target)})})}setPeer(e){this.peerId=e;const t=o.a.getPeerPhoto(e);if(!t)return;const s=this.listLoader=new S({loadCount:50,loadMore:(t,a,o)=>{if(!a)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t||s.current;return r.a.getUserPhotos(e,i,o).then(e=>({count:e.count,items:e.photos}))}{const t=[];return s.current||t.push(n.default.getChatFull(e.toChatId())),t.push(i.a.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:o,backLimit:0})),Promise.all(t).then(e=>{const t=e.pop();if(y(t),!s.current){const n=e[0],a=t.history.findAndSplice(e=>e.action.photo.id===n.chat_photo.id);s.current=a||i.a.generateFakeAvatarMessage(this.peerId,n.chat_photo)}return{count:t.count,items:t.history}})}},processItem:this.processItem,onJump:(e,t)=>{const s=this.listLoader.index,i=100*Kt.SCALE*s;this.avatars.style.transform=Kt.TRANSLATE_TEMPLATE.replace("{x}",`-${i}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active");this.tabs.children[s].classList.add("active"),this.loadNearestToTarget(this.avatars.children[s])}});"userProfilePhoto"===t._&&(s.current=t.photo_id),this.processItem(s.current),s.load(!0)}addTab(){const e=document.createElement("div");e.classList.add(Kt.BASE_CLASS+"-tab"),this.tabs.append(e),1===this.tabs.childElementCount&&e.classList.add("active"),this.container.classList.toggle("is-single",this.tabs.childElementCount<=1)}loadNearestToTarget(e){const t=Array.from(e.parentElement.children),s=t.indexOf(e);t.slice(Math.max(0,s-3),Math.min(t.length,s+3)).forEach(e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))})}}Kt.BASE_CLASS="profile-avatars",Kt.SCALE=Rt?2:1,Kt.TRANSLATE_TEMPLATE=Rt?`translate3d({x}, 0, -1px) scale(${Kt.SCALE})`:"translate({x}, 0)";let Wt=(e,t)=>{t.title.innerHTML=e,t.container.style.display=""};class qt{constructor(e){this.scrollable=e,this.setPeerStatus=(e=!1)=>{if(!this.peerId)return;const t=this.peerId;er.setPeerStatus(this.peerId,this.subtitle,e,!0,()=>t===this.peerId)},Rt||this.scrollable.container.classList.add("no-parallax")}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new dn({noDelimiter:!0}),this.avatar=new ur,this.avatar.classList.add("profile-avatar","avatar-120"),this.avatar.setAttribute("dialog","1"),this.avatar.setAttribute("clickable",""),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 st({title:" ",subtitleLangKey:"UserBio",icon:"info",clickable:e=>{"A"!==e.target.tagName&&n.default.getProfileByPeerId(this.peerId).then(e=>{nt(e.about),lt(x.default.format("BioCopied",!0))})}}),this.bio.title.classList.add("pre-wrap"),this.username=new st({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{nt("@"+o.a.getPeer(this.peerId).username),lt(x.default.format("UsernameCopied",!0))}}),this.phone=new st({title:" ",subtitleLangKey:"Phone",icon:"phone",clickable:()=>{nt("+"+P.a.getUser(this.peerId).phone),lt(x.default.format("PhoneCopied",!0))}}),this.notifications=new st({checkboxField:new mt.a({toggle:!0}),titleLangKey:"Notifications",icon:"unmute"}),this.section.content.append(this.phone.container,this.username.container,this.bio.container,this.notifications.container),this.element.append(this.section.container,pn()),this.notifications.checkboxField.input.addEventListener("change",e=>{e.isTrusted&&i.a.mutePeer(this.peerId)}),a.default.addEventListener("dialog_notify_settings",e=>{if(this.peerId===e.peerId){const e=Dt.a.isPeerLocalMuted(this.peerId,!1);this.notifications.checkboxField.checked=!e}}),a.default.addEventListener("peer_typings",({peerId:e})=>{this.peerId===e&&this.setPeerStatus()}),a.default.addEventListener("peer_bio_edit",e=>{e===this.peerId&&this.setBio(!0)}),a.default.addEventListener("user_update",e=>{this.peerId===e&&this.setPeerStatus()}),a.default.addEventListener("contacts_update",e=>{if(this.peerId===e){const t=P.a.getUser(e);t.pFlags.self||(t.phone?Wt(P.a.formatUserPhone(t.phone),this.phone):this.phone.container.style.display="none")}}),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4)}cleanupHTML(){this.bio.container.style.display="none",this.phone.container.style.display="none",this.username.container.style.display="none",this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0,this.setBioTimeout&&(window.clearTimeout(this.setBioTimeout),this.setBioTimeout=0)}setAvatar(){if(this.peerId!==a.default.myId){if(o.a.getPeerPhoto(this.peerId)){const e=this.avatars;return this.avatars=new Kt(this.scrollable),this.avatars.setPeer(this.peerId),this.avatars.info.append(this.name,this.subtitle),this.avatar.remove(),e?e.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),void(Rt&&this.scrollable.container.classList.add("parallax"))}}Rt&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars=void 0),this.avatar.setAttribute("peer",""+this.peerId),this.section.content.prepend(this.avatar,this.name,this.subtitle)}fillProfileElements(){var e;if(!this.cleaned)return;this.cleaned=!1;const t=this.peerId;if(this.cleanupHTML(),this.setAvatar(),t!==a.default.myId){o.a.getPeerUsername(t)&&Wt(o.a.getPeerUsername(t),this.username);const e=Dt.a.isPeerLocalMuted(t,!1);this.notifications.checkboxField.checked=!e}else Object(De.b)(()=>{this.notifications.container.style.display="none"});if(t.isUser()){let e=P.a.getUser(t);e.phone&&t!==a.default.myId&&Wt(P.a.formatUserPhone(e.phone),this.phone)}this.setBio(),Object(k.a)(this.name,new Lt.a({peerId:t,dialog:!0}).element);const s=o.a.getPeer(t);(null===(e=null==s?void 0:s.pFlags)||void 0===e?void 0:e.verified)&&this.name.append(Ut()),this.setPeerStatus(!0)}setBio(e){this.setBioTimeout&&(window.clearTimeout(this.setBioTimeout),this.setBioTimeout=0);const t=this.peerId,s=this.threadId;if(!t)return;let i;i=t.isUser()?n.default.getProfile(t,e).then(e=>this.peerId===t&&this.threadId===s&&(e.rAbout&&t!==a.default.myId&&Wt(e.rAbout,this.bio),!0)):n.default.getChatFull(t.toChatId(),e).then(e=>this.peerId===t&&this.threadId===s&&(e.about&&Wt(J.b.wrapRichText(e.about),this.bio),!0)),i.then(e=>{e&&(this.setBioTimeout=window.setTimeout(()=>this.setBio(!0),6e4))})}setPeer(e,t=0){this.peerId===e&&this.threadId===t||(this.init&&this.init(),this.peerId=e,this.threadId=t,this.cleaned=!0)}}class Qt extends z{constructor(e){super(e,!1),this.threadId=0,this.historiesStorage={}}init(){this.container.classList.add("shared-media-container","profile-container");const e=Object(U.a)("btn-icon sidebar-close-button",{noRipple:!0});this.closeBtn.replaceWith(e),this.closeBtn=e;const t=document.createElement("div");t.classList.add("animated-close-icon"),e.append(t);const s=document.createElement("div");s.className="transition slide-fade";const i=document.createElement("div");i.classList.add("transition-item"),this.title.append(Object(x.i18n)("Profile")),this.editBtn=H("edit"),i.append(this.title,this.editBtn);const n=document.createElement("div");n.classList.add("transition-item");const o=this.title.cloneNode();o.append(Object(x.i18n)("PeerInfo.SharedMedia")),n.append(o),s.append(i,n),this.header.append(s),this.profile=new qt(this.scrollable),this.profile.init(),this.scrollable.append(this.profile.element);this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const s=e.top-1<=56;t.classList.toggle("state-back",s),this.searchSuper.container.classList.toggle("is-full-viewport",s),r(+s),s||this.searchSuper.cleanScrollPositions()};const r=Object(D.a)(s,"slide-fade",400,null,!1);r(0),Object(l.b)(this.closeBtn,e=>{this.closeBtn.firstElementChild.classList.contains("state-back")?(this.scrollable.scrollIntoViewNew(this.scrollable.container.firstElementChild,"start"),r(0),t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),Object(l.b)(this.editBtn,e=>{let t;t=this.peerId.isAnyChat()?new Ft(this.slider):new jt(this.slider),t&&(t instanceof Ft?t.chatId=this.peerId.toChatId():t.peerId=this.peerId,t.open())}),a.default.addEventListener("contacts_update",e=>{this.peerId===e&&this.toggleEditBtn()}),a.default.addEventListener("chat_update",e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()}),a.default.addEventListener("history_multiappend",e=>{for(const t in e)this.renderNewMessages(t.toPeerId(),Array.from(e[t]))}),a.default.addEventListener("history_delete",({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))}),a.default.addEventListener("message_sent",({message:e})=>{this.renderNewMessages(e.peerId,[e.mid])}),this.searchSuper=new ei({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"PeerMedia.Members",type:"members"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:this.scrollable,onChangeTab:e=>{let t="members"===e.type&&a.default.settings.animationsEnabled?250:0;setTimeout(()=>{c.classList.toggle("is-hidden","members"!==e.type)},t)}}),this.profile.element.append(this.searchSuper.container);const c=Q({icon:"addmember_filled"});this.content.append(c),c.addEventListener("click",()=>{const e=this.peerId,t=this.peerId.toChatId(),s=K.a.isChannel(t),i=(t,i)=>{let n,a,o,r,l;if(t.length>1)n="AddMembersAlertTitle",a=[Object(x.i18n)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map(e=>{const t=document.createElement("b");return t.append(new Lt.a({peerId:e}).element),t}),s||(l=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new Lt.a({peerId:t[0]}).element),r=[e],s||(l=[{text:"AddOneMemberForwardMessages",textArgs:[new Lt.a({peerId:t[0]}).element],checked:!0}])}r.push(new Lt.a({peerId:e}).element),new gt("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:i}],checkboxes:l}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&ct({langPackKey:"InviteToGroupError"})};if(s){const e=new Bt(this.slider);e.open({type:"channel",skippable:!1,takeOut:s=>(i(s,()=>{const i=K.a.inviteToChannel(t,s);i.catch(n),e.attachToPromise(i)}),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new Pt({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout(()=>{i([e],s=>{K.a.addChatUser(t,e,s.size?void 0:0).catch(n)})},0)}})})}renderNewMessages(e,t){if(!this.init&&this.historiesStorage[e]){t=t.slice().reverse();for(const s of this.searchSuper.mediaTabs){const n=s.inputFilter,a=this.searchSuper.filterMessagesByType(t.map(t=>i.a.getMessageByPeer(e,t)),n);if(a.length){const t=this.historiesStorage[e][n];t&&t.unshift(...a.map(e=>({mid:e.mid,peerId:e.peerId}))),this.peerId===e&&-1!==this.searchSuper.usedFromHistory[n]&&(this.searchSuper.usedFromHistory[n]+=a.length,this.searchSuper.performSearchResult(a,s,!1))}}}}deleteDeletedMessages(e,t){if(!this.init&&this.historiesStorage[e]){for(const s of t)for(const t of this.searchSuper.mediaTabs){const i=t.inputFilter,n=this.historiesStorage[e][i];if(!n)continue;const a=n.findIndex(e=>e.mid===s);if(-1!==a){if(n.splice(a,1),this.peerId===e){const t=this.searchSuper.tabs[i].querySelector(`div[data-mid="${s}"][data-peer-id="${e}"]`);t&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(t),t.remove()),this.searchSuper.usedFromHistory[i]>=a+1&&this.searchSuper.usedFromHistory[i]--}break}}this.scrollable.onScroll()}}cleanupHTML(){this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",this.searchSuper.canViewMembers()&&K.a.hasRights(this.peerId.toChatId(),"invite_users"))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t=0){var s;return(this.peerId!==e||this.threadId!==t)&&(this.peerId=e,this.threadId=t,this.peerChanged=!0,this.init&&(this.init(),this.init=null),this.searchSuper.setQuery({peerId:e,historyStorage:null!==(s=this.historiesStorage[e])&&void 0!==s?s:this.historiesStorage[e]={}}),this.profile.setPeer(e,t),!0)}fillProfileElements(){this.peerChanged&&(this.peerChanged=!1,this.cleanupHTML(),this.profile.fillProfileElements(),this.toggleEditBtn())}toggleEditBtn(){let e;e=this.peerId.isUser()?this.peerId!==a.default.myId&&P.a.isContact(this.peerId.toUserId()):K.a.hasRights(this.peerId.toChatId(),"change_info"),this.editBtn.classList.toggle("hide",!e)}loadSidebarMedia(e,t=!1){this.searchSuper.load(e,t)}onOpenAfterTimeout(){this.scrollable.onScroll()}}const $t=new class extends G{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1,b.b.addEventListener("changeScreen",(e,t)=>{t===b.a.medium&&e!==b.a.mobile&&this.toggleSidebar(!1)}),b.b.addEventListener("resize",()=>{this.setColumnProportion()}),this.sharedMediaTab=new Qt(this)}onCloseTab(e,t,s){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,s)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const s=document.body.classList.contains("is-right-column-shown");let i;if(void 0!==e?e?s||(i=!0):s&&(i=!0):i=!0,!i)return Promise.resolve();s||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const n=er.selectTab(s?1:2,t);return document.body.classList.toggle("is-right-column-shown",e),n}};de.a.appSidebarRight=$t;var Yt=$t;class Xt extends z{init(){this.container.id="poll-results-container",this.container.classList.add("chatlist-container"),this.resultsDiv=document.createElement("div"),this.resultsDiv.classList.add("poll-results"),this.scrollable.append(this.resultsDiv)}open(e){const t=super.open(),s=Je.a.getPoll(e.media.poll.id);this.setTitle(s.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");i.innerHTML=s.poll.rQuestion;const n=s.results.results.map(e=>e.voters/s.results.total_voters*100);es(n);const a=document.createDocumentFragment();return s.results.results.forEach((t,i)=>{if(!t.voters)return;const o=document.createElement("hr"),r=s.poll.answers[i],l=document.createElement("div");l.classList.add("poll-results-answer");const c=document.createElement("div");c.innerHTML=J.a.wrapEmojiText(r.text);const d=document.createElement("div");d.innerText=Math.round(n[i])+"%",l.append(c,d);const h=kr.createChatList();h.classList.add("poll-results-voters"),kr.setListClickListener(h,()=>{Yt.onCloseBtnClick()},void 0,!0),h.style.minHeight=50*Math.min(t.voters,4)+"px",a.append(o,l,h);let p,u=4,m=!1,g=t.voters-4;const b=()=>{m||(m=!0,Je.a.getVotes(e,r.option,p,u).then(e=>{e.votes.forEach(e=>{const{dom:t}=kr.addDialogNew({dialog:e.user_id.toPeerId(!1),container:h,drawStatus:!1,rippleEnabled:!1,meAsSaved:!1,avatarSize:32});t.lastMessageSpan.parentElement.remove()}),p&&(g-=e.votes.length,v.lastElementChild.replaceWith(Object(x.i18n)("PollResults.LoadMore",[Math.min(20,g)]))),p=e.next_offset,u=20,g&&e.votes.length||v.remove()}).finally(()=>{m=!1}))};if(b(),g<=0)return;const v=document.createElement("div");v.classList.add("poll-results-more","show-more","rp-overflow"),v.addEventListener("click",b),Object(se.ripple)(v);const f=document.createElement("div");f.classList.add("tgico-down"),v.append(f,Object(x.i18n)("PollResults.LoadMore",[Math.min(20,g)])),a.append(v)}),this.resultsDiv.append(i,a),Yt.toggleSidebar(!0).then(()=>{}),t}}var Jt=s(57);let Zt=0;const es=e=>{const t=e.reduce((e,t)=>e+Math.round(t),0);if(t>100){const s=t-100,i=e.length;for(let t=0;t=.5&&is&&(s=i,t=n)}if(-1===t)return;e[t]+=1-s}}};a.default.addEventListener("poll_update",({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach(s=>{s.isClosed=!!e.pFlags.closed,s.performResults(t,e.chosenIndexes)})}),a.default.addEventListener("peer_changed",()=>{ss&&ts(ss,is,ns)}),b.b.addEventListener("resize",()=>{as.setMaxLength(),as.resizePolls()}),b.b.addEventListener("changeScreen",()=>{as.setMaxLength()});const ts=(e,t,s)=>{e.classList.remove("active"),clearTimeout(s),setTimeout(()=>{t(),e.remove(),ss===e&&is===t&&ns===s&&(ss=is=null,ns=0)},200)};let ss,is,ns;class as extends HTMLElement{constructor(){super(),this.isClosed=!1,this.isQuiz=!1,this.isRetracted=!1,this.isPublic=!1,this.isMultiple=!1,this.chosenIndexes=[],this.chosingIndexes=[],this.sentVote=!1}static setMaxLength(){const e=Et.a.width<=360?Et.a.width-120:b.b.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){if(!this.MAX_LENGTH)return;Array.from(document.querySelectorAll("poll-element.is-voted")).forEach(e=>{e.svgLines.forEach((t,s)=>{e.setLineProgress(s,1)})})}render(){Zt||(Zt=document.getElementById("poll-line").getTotalLength(),as.setMaxLength());const e=this.message.media.poll.id,{poll:t,results:s}=Je.a.getPoll(e);let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),t.pFlags&&(this.isPublic=!!t.pFlags.public_voters,this.isQuiz=!!t.pFlags.quiz,this.isClosed=!!t.pFlags.closed,this.isMultiple=!!t.pFlags.multiple_choice,this.isClosed?(i="Chat.Poll.Type.Closed",this.classList.add("is-closed")):i=this.isQuiz?this.isPublic?"Chat.Poll.Type.Quiz":"Chat.Poll.Type.AnonymousQuiz":this.isPublic?"Chat.Poll.Type.Public":"Chat.Poll.Type.Anonymous"),this.classList.toggle("is-multiple",this.isMultiple);const n=this.isMultiple?'':"",a=t.answers.map((e,t)=>`\n
\n
\n
\n \n \n \n ${n}\n
\n
\n
${J.a.wrapEmojiText(e.text)}
\n \n \n
\n `).join("");if(this.innerHTML=`\n
${t.rQuestion}
\n
\n
\n
\n
\n ${a}`,this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append(Object(x.i18n)(i)),this.isQuiz&&(this.classList.add("is-quiz"),t.close_period&&t.close_date)){const e=document.createElement("div");e.classList.add("poll-time"),this.descDiv.append(e);const s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("poll-quiz-timer"),this.quizTimer=s;const i=2,n=7,a=2*Math.PI*n,o=document.createElementNS("http://www.w3.org/2000/svg","circle");o.classList.add("poll-quiz-timer-circle"),o.setAttributeNS(null,"cx","16"),o.setAttributeNS(null,"cy","16"),o.setAttributeNS(null,"r",""+n),o.setAttributeNS(null,"stroke-width",""+i),s.append(o),this.descDiv.append(s);const r=1e3*t.close_period,l=1e3*(t.close_date-Ze.a.serverTimeOffset);this.quizInterval=window.setInterval(()=>{const t=Date.now(),s=(l-t)/r,i=(l-t)/1e3+1|0;e.innerHTML=String(i).toHHMMSS(),i<=5&&(e.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+s*a,o.style.strokeDasharray=`${a} ${a}`,t>=l&&(clearInterval(this.quizInterval),e.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout(()=>{Je.a.getResults(this.message)},3e3))},1e3)}this.answerDivs=Array.from(this.querySelectorAll(".poll-answer")),this.svgLines=Array.from(this.querySelectorAll(".poll-line")),this.numberDivs=Array.from(this.querySelectorAll(".poll-answer-percents"));const o=document.createElement("div");o.classList.add("poll-footer"),this.viewResults=document.createElement("div"),this.viewResults.className="poll-footer-button poll-view-results hide",this.viewResults.append(Object(x.i18n)("Chat.Poll.ViewResults")),this.votersCountDiv=document.createElement("div"),this.votersCountDiv.className="poll-votes-count",o.append(this.viewResults,this.votersCountDiv),this.append(o),this.viewResults.addEventListener("click",e=>{Object(c.a)(e),Yt.isTabExists(Xt)||new Xt(Yt).open(this.message)}),Object(se.ripple)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append(Object(x.i18n)("Chat.Poll.SubmitVote")),Object(se.ripple)(this.sendVoteBtn),t.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),Object(l.b)(this.sendVoteBtn,e=>{Object(c.a)(e),this.chosingIndexes.length&&this.sendVotes(this.chosingIndexes).then(()=>{this.chosingIndexes.length=0,this.answerDivs.forEach(e=>{e.classList.remove("is-chosing")})})}),o.append(this.sendVoteBtn));const r=!(t.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(s,t.chosenIndexes,!1),r&&(this.setVotersCount(s),Object(l.b)(this,this.clickHandler))}initQuizHint(e){if(e.solution&&e.solution_entities){const t=document.createElement("div");if(t.classList.add("tgico-tip","poll-hint"),this.descDiv.append(t),Object(l.b)(t,s=>{Object(c.a)(s),t.classList.add("active"),((e,t,s)=>{ss&&ts(ss,is,ns);const i=document.createElement("div");i.classList.add("quiz-hint");const n=document.createElement("div");n.classList.add("container","tgico");const a=document.createElement("div");a.classList.add("text"),n.append(a),i.append(n),a.innerHTML=J.a.wrapRichText(e,{entities:t}),er.chat.bubbles.bubblesContainer.append(i),i.offsetLeft,i.classList.add("active"),ss=i,is=s,ns=window.setTimeout(()=>{ts(i,s,ns)},ue.IS_TOUCH_SUPPORTED?5e3:7e3)})(e.solution,e.solution_entities,()=>{t.classList.remove("active")})}),this.sentVote){const s=e.results.find(e=>e.pFlags.correct);s&&!s.pFlags.chosen&&t.click()}}}clickHandler(e){const t=Object(Me.a)(e.target,"poll-answer");if(!t)return;Object(c.a)(e);const s=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(s);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(s)}else this.sendVotes([s])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter((t,s)=>e.includes(s));return t.forEach(e=>{e.classList.add("is-voting")}),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=Je.a.sendVote(this.message,e).then(()=>{t.forEach(e=>{e.classList.remove("is-voting")}),this.classList.remove("disable-hover")}).catch(()=>{this.sentVote=!1}).finally(()=>{this.sendVotePromise=null})}performResults(e,t,s=!0){var i,n;if(a.default.settings.animationsEnabled||(s=!1),this.isQuiz&&((null===(i=e.results)||void 0===i?void 0:i.length)||this.isClosed)){this.answerDivs.forEach((t,s)=>{t.classList.toggle("is-correct",!!e.results[s].pFlags.correct)}),this.initQuizHint&&(this.initQuizHint(e),this.initQuizHint=null),this.quizInterval&&(clearInterval(this.quizInterval),this.quizInterval=0),(null===(n=this.quizTimer)||void 0===n?void 0:n.parentElement)&&this.quizTimer.remove();const t=this.descDiv.querySelector(".poll-time");t&&t.remove()}if(this.isClosed&&(this.classList.add("is-closed"),Object(k.a)(this.typeDiv,Object(x.i18n)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?Object(l.b)(this,this.clickHandler):Object(l.c)(this,this.clickHandler)),this.chosenIndexes.length||this.isRetracted||this.isClosed){const t=e.results.map(t=>e.total_voters?t.voters/e.total_voters*100:0);this.classList.toggle("no-transition",!s),s&&Object(Jt.a)(this,"",!this.isRetracted,340),Object(De.b)(()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,s),this.percents=t,this.isRetracted=!1})}if(this.setVotersCount(e),this.isPublic){this.isMultiple||(this.viewResults.classList.toggle("hide",!e.total_voters||!this.chosenIndexes.length),this.votersCountDiv.classList.toggle("hide",!!this.chosenIndexes.length));let t="";e.recent_voters.forEach((e,s)=>{t+=``}),this.avatarsDiv.innerHTML=t}if(this.isMultiple){const t=!!this.chosenIndexes.length,s=this.isClosed||t,i=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",s),this.viewResults.classList.toggle("hide",i),this.votersCountDiv.classList.toggle("hide",!s||!i)}}setResults(e,t,s){this.svgLines.forEach(e=>e.style.display=""),this.answerDivs.forEach((e,s)=>{e.classList.toggle("is-chosen",t.includes(s))});const i=Math.max(...e);if(this.maxPercents=e.map(e=>e/i),this.isRetracted)this.svgLines.forEach((e,t)=>{this.setLineProgress(t,-1)});else{const e=()=>{this.svgLines.forEach((e,t)=>{this.setLineProgress(t,1)})};s?Object(De.b)(e):e()}let n;e=e.slice(),es(e);const a=t=>{e.forEach((e,s)=>{const i=n(e,t);this.numberDivs[s].innerText=i+"%"})};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),s)for(let e=9,t=0;e>=0;--e,++t)setTimeout(()=>{a(e)},34*t);else a(0);else if(n=(e,t)=>Math.round(e/10*(t+1)),s)for(let e=0;e<10;++e)setTimeout(()=>{a(e)},34*e);else a(9);if(this.isRetracted){s&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach(e=>e.style.display="none")};s?setTimeout(()=>{this.classList.remove("is-retracting"),e()},340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let s,i=[t];s=this.isClosed?this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesResultEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesResultEmpty":this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesEmpty",Object(k.a)(this.votersCountDiv,Object(x.i18n)(s,i))}setLineProgress(e,t){const s=this.svgLines[e];-1===t?(s.style.strokeDasharray="",s.style.strokeDashoffset=""):(s.style.strokeDasharray=t*this.maxPercents[e]*as.MAX_LENGTH+", 485.9",s.style.strokeDashoffset=""+t*as.MAX_OFFSET)}}as.MAX_OFFSET=-46.5,as.MAX_LENGTH=0,customElements.define("poll-element",as);var os=s(111),rs=s(98),ls=s(60),cs=s(99),ds=s(120),hs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const ps=new class{constructor(){this.storage=new cs.a(ds.a,"stickerSets"),this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.getAnimatedEmojiStickerSet(),a.default.addMultipleEventsListeners({updateNewStickerSet:e=>{this.saveStickerSet(e.stickerset,e.stickerset.set.id),a.default.dispatchEvent("stickers_installed",e.stickerset.set)}}),this.getGreetingStickersTimeout=window.setTimeout(()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)},5e3)}getGreetingSticker(e=!1){return this.getGreetingStickersTimeout&&(clearTimeout(this.getGreetingStickersTimeout),this.getGreetingStickersTimeout=void 0),this.getGreetingStickersPromise||(this.getGreetingStickersPromise=this.getStickersByEmoticon("👋⭐️",!1).then(e=>{if(!e.length)throw"NO_STICKERS";this.greetingStickers=e.slice(),this.greetingStickers.sort((e,t)=>Math.random()-Math.random())})),this.getGreetingStickersPromise.then(()=>{let t;return e||(t=this.greetingStickers.shift(),this.greetingStickers.push(t)),E.a.downloadDoc(this.greetingStickers[0]),t})}saveStickers(e){Object(f.d)(e,(t,s)=>{(t=E.a.saveDoc(t))?e[s]=t:e.splice(s,1)})}getStickerSet(e,t={}){return hs(this,void 0,void 0,(function*(){const s=e.id;return this.getStickerSetPromises[s]?this.getStickerSetPromises[s]:this.getStickerSetPromises[s]=new Promise(i=>hs(this,void 0,void 0,(function*(){var n;if(!t.overwrite){const e=yield this.storage.get(s);if(e&&(null===(n=e.documents)||void 0===n?void 0:n.length)&&(Date.now()-e.refreshTime<36e5||t.useCache))return this.saveStickers(e.documents),i(e),void delete this.getStickerSetPromises[s]}try{const n=yield ht.a.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e)}),a=t.saveById?s:n.set.id;this.saveStickerSet(n,a),i(n)}catch(e){i(null)}delete this.getStickerSetPromises[s]})))}))}getAnimatedEmojiStickerSet(){return this.getStickerSet({id:"emoji"},{saveById:!0})}getRecentStickers(){return hs(this,void 0,void 0,(function*(){const e=yield ht.a.invokeApiHashable("messages.getRecentStickers");return this.saveStickers(e.stickers),e}))}getAnimatedEmojiSticker(e){const t=this.storage.getFromCache("emoji");if(!t||!t.documents)return;e=e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"");const s=t.packs.find(t=>t.emoticon===e);return s?E.a.getDoc(s.documents[0]):void 0}preloadAnimatedEmojiSticker(e,t,s){return this.getAnimatedEmojiStickerSet().then(()=>{const i=this.getAnimatedEmojiSticker(e);if(i)return E.a.downloadDoc(i).then(ne.c).then(n=>hs(this,void 0,void 0,(function*(){const a=b.b.active.emojiSticker,o=Object(ie.d)(e),r=yield le.a.loadAnimationWorker({container:void 0,animationData:n,width:null!=t?t:a.width,height:null!=s?s:a.height,name:"doc"+i.id,autoplay:!1,loop:!1},"none",o);r.addEventListener("firstFrame",()=>{E.a.saveLottiePreview(i,r.canvas,o),r.remove()},{once:!0})})))})}saveStickerSet(e,t){const s={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents};let i=this.storage.getFromCache(t);i?Object.assign(i,s):i=this.storage.setToCache(t,s),this.saveStickers(e.documents);const n=i.set.installed_date||"emoji"===t;i.refreshTime=Date.now(),this.storage.set({[t]:i},!n)}getStickerSetThumbDownloadOptions(e){var t;const s=e.thumbs.find(e=>"photoSize"===e._),i=e.thumb_dc_id,n=null===(t=e.pFlags)||void 0===t?void 0:t.animated;return{dcId:i,location:{_:"inputStickerSetThumb",stickerset:this.getStickerSetInput(e),thumb_version:e.thumb_version},size:s.size,mimeType:n?"application/x-tgsticker":"image/webp"}}getStickerSetInput(e){return"emoji"===e.id?{_:"inputStickerSetAnimatedEmoji"}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return hs(this,void 0,void 0,(function*(){const e=yield ht.a.invokeApiHashable("messages.getFeaturedStickers");return e.sets.forEach(e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)}),e.sets}))}toggleStickerSet(e){return hs(this,void 0,void 0,(function*(){if(e.installed_date){if(yield ht.a.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,a.default.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else{if(yield ht.a.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,a.default.dispatchEvent("stickers_installed",e),!0}return!1}))}searchStickerSets(e,t=!0){return hs(this,void 0,void 0,(function*(){const s=t?1:0,i=yield ht.a.invokeApiHashable("messages.searchStickerSets",{flags:s,exclude_featured:t||void 0,q:e});i.sets.forEach(e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)});const n=[],a=this.storage.getCache();for(let t in a){const{set:s}=a[t];s.title.toLowerCase().includes(e.toLowerCase())&&!i.sets.find(e=>e.set.id===s.id)&&n.push({_:"stickerSetCovered",set:s,cover:null})}return i.sets.concat(n)}))}getAllStickers(){return ht.a.invokeApiHashable("messages.getAllStickers")}preloadStickerSets(){return this.getAllStickers().then(e=>Promise.all(e.sets.map(e=>this.getStickerSet(e,{useCache:!0}))))}getStickersByEmoticon(e,t=!0){return e=J.b.fixEmoji(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([ht.a.invokeApiHashable("messages.getStickers",{emoticon:e}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then(([t,s,i])=>{const n=t.stickers.map(e=>E.a.saveDoc(e)),a=[],o=[],r=t=>{for(const s of t){if(J.b.fixEmoji(s.emoticon).includes(e))for(const e of s.documents){const t=E.a.getDoc(e);(t.animated?a:o).push(t)}}};if(i){r(i.packs);const e=i.stickers;[a,o].forEach(t=>{t.sort((t,s)=>e.indexOf(t)-e.indexOf(s))})}for(const e of s)r(e.packs);return[...new Set(a.concat(o,n))]})}pushRecentSticker(e){const t=J.b.fixEmoji(e.stickerEmojiRaw);for(const s in this.getStickersByEmoticonsPromises){this.getStickersByEmoticonsPromises[s].then(i=>{const n=i.findAndSplice(t=>t.id===e.id);n?i.unshift(n):s.includes(t)&&i.unshift(e)})}}};de.a.appStickersManager=ps;var us=ps,ms=s(61),gs=s(127),bs=s(130),vs=s(121),fs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};let ys=0;function ws({doc:e,container:t,message:s,boxWidth:i,boxHeight:n,withTail:o,isOut:r,middleware:d,lazyLoadQueue:h,noInfo:p,group:u,onlyPreview:m,withoutPreloader:g,loadPromises:v,noPlayButton:f,noAutoDownload:y,size:w,searchContext:S}){var L,I;const M=!(i&&n),P=("video"!==e.type||e.size<=52428800&&!M)&&("gif"===e.type?a.default.settings.autoPlay.gifs:a.default.settings.autoPlay.videos);let T,k;if(!p){T=document.createElement("span"),T.classList.add("video-time"),t.append(T);let s=!1;"gif"!==e.type?(T.innerText=(e.duration+"").toHHMMSS(!1),f||"round"===e.type||(P&&!y?T.classList.add("tgico","can-autoplay"):s=!0)):(T.innerText="GIF",P||f||(s=!0,y=void 0)),s&&(k=document.createElement("span"),k.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(k))}let x,O={};if("image/gif"===e.mime_type){const a=Ls({photo:e,message:s,container:t,boxWidth:i,boxHeight:n,withTail:o,isOut:r,lazyLoadQueue:h,middleware:d,withoutPreloader:g,loadPromises:v,noAutoDownload:y,size:w});return O.thumb=a,O.loadPromise=a.loadPromises.full,O}const A=document.createElement("video");if(A.classList.add("media-video"),A.setAttribute("playsinline","true"),A.muted=!0,"round"===e.type){const i=document.createElement("div");i.classList.add("media-round","z-depth-1"),i.dataset.mid=""+s.mid,i.dataset.peerId=""+s.peerId,i.message=s;const n=b.b.active.round,a=n.width/2,o=3.5,r=a-2*o;i.innerHTML=`\n \n `;const d=i.firstElementChild.firstElementChild;ys||(ys=2*Math.PI*r),d.style.strokeDasharray=ys+" "+ys,d.style.strokeDashoffset=""+ys,T.classList.add("tgico");s.pFlags.media_unread&&i.classList.add("is-unread");const h=document.createElement("canvas");h.width=h.height=e.w,i.prepend(h,T),i.append(A),t.append(i);const p=h.getContext("2d"),u=()=>{const e=i.message,t=fe.addMedia(e,!y),s=()=>{(er.chat.setPeerPromise||Promise.resolve()).finally(()=>{Object(ms.a)(t)||(t.removeEventListener("play",r),t.removeEventListener("timeupdate",o),t.removeEventListener("pause",u),t.removeEventListener("ended",m))})},n=()=>{p.drawImage(t,0,0);const e=ys-t.currentTime/t.duration*ys;return d.style.strokeDashoffset=""+e,!t.paused},a=()=>{t.duration&&(Object(ms.a)(t)?(t.paused&&n(),T.innerText=(t.duration-t.currentTime+"").toHHMMSS(!1)):s())},o=je(a),r=()=>{A.classList.add("hide"),i.classList.remove("is-paused"),Object(os.b)(n,h),x&&x.preloader&&x.preloader.classList.contains("manual")&&x.onClick()},u=()=>{Object(ms.a)(t)?i.classList.add("is-paused"):s()},m=()=>{A.classList.remove("hide"),i.classList.add("is-paused"),A.currentTime=0,T.innerText=(""+t.duration).toHHMMSS(!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",r),t.addEventListener("timeupdate",o),t.addEventListener("pause",u),t.addEventListener("ended",m),Object(l.b)(h,s=>{if(Object(c.a)(s),x&&!x.detached&&x.onClick(),t.paused){const s=!!S;if(fe.setSearchContext(S||{peerId:Be.b,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=s?He(i):[];fe.setTargets({peerId:e.peerId,mid:e.mid},t,n)}t.play()}else t.pause()}),t.paused?t.duration&&t.currentTime!==t.duration&&t.currentTime>0?(n(),a(),A.classList.add("hide")):u():r()};s.pFlags.is_outgoing?(i.onLoad=u,i.dataset.isOutgoing="1"):u()}else A.autoplay=!0;let _;if(s){if(_=Ls({photo:e,message:s,container:t,boxWidth:i,boxHeight:n,withTail:o,isOut:r,lazyLoadQueue:h,middleware:d,withoutPreloader:!0,loadPromises:v,noAutoDownload:y,size:w}),O.thumb=_,!P&&"gif"!==e.type||m)return O.loadPromise=_.loadPromises.full,O;if(o){const e=(_.images.thumb||_.images.full).parentElement;A.width=+e.getAttributeNS(null,"width"),A.height=+e.getAttributeNS(null,"height"),e.append(A)}}else{const t=E.a.getThumb(e,!1);t&&t.promise.then(()=>{A.poster=t.cacheContext.url})}!A.parentElement&&t&&((null==_?void 0:_.aspecter)||t).append(A);const F=he.a.getCacheContext(e),D=!!(null===(L=null==s?void 0:s.media)||void 0===L?void 0:L.preloader);D?(x=s.media.preloader,x.attach(t,!1),y=void 0):F.downloaded||e.supportsStreaming?e.supportsStreaming&&(x=new ye.a({cancelable:!1,attachMethod:"prepend"})):x=new ye.a({attachMethod:"prepend"});const j=Object(ae.a)();A.addEventListener("error",e=>{4!==A.error.code&&console.error("Error "+A.error.code+"; details: "+A.error.message),x&&!D&&x.detach(),j.isFulfilled||j.resolve()},{once:!0}),Object(me.e)(A).then(()=>{u&&C.a.addAnimation(A,u),x&&!D&&x.detach(),j.resolve()}),"video"===e.type&&A.addEventListener("timeupdate",()=>{T.innerText=(A.duration-A.currentTime+"").toHHMMSS(!1)}),A.muted=!0,A.loop=!0,A.autoplay=!0;let B=y&&(null===(I=null==_?void 0:_.preloader)||void 0===I?void 0:I.loadFunc);const R=()=>{x&&y&&!g&&(x.construct(),x.setManual());let i=Promise.resolve();if(x&&!D)if(F.downloaded||e.supportsStreaming)e.supportsStreaming&&(y?i=Promise.reject():F.downloaded||(x.attach(t,!1,null),A.addEventListener(re.IS_SAFARI?"timeupdate":"canplay",()=>{x.detach()},{once:!0})));else{const s=i=E.a.downloadDoc(e,null==h?void 0:h.queueId,y);x.attach(t,!1,s)}return!y&&B&&(B(),B=null),y=void 0,i.then(()=>{!d||d()?("round"===e.type&&fe.resolveWaitingForLoadMedia(s.peerId,s.mid,s.pFlags.is_scheduled),Object(rs.a)(A,F.url)):j.resolve()},()=>{}),{download:i,render:j}};return x&&!D&&x.setDownloadFunction(R),"gif"!==e.type||P?O.loadPromise=h?(h.push({div:t,load:()=>R().render}),Promise.resolve()):R().render:Object(l.b)(t,e=>{Object(c.a)(e),k.remove(),R()},{capture:!0,once:!0}),O}function Ss({message:e,withTime:t,fontWeight:s,voiceAsMusic:n,showSender:o,searchContext:c,loadPromises:d,noAutoDownload:h,lazyLoadQueue:p}){var u,g;s||(s=500);const b=e.media.document||e.media.webpage.document,v=e.pFlags.is_outgoing&&(null===(u=e.media)||void 0===u?void 0:u.preloader);if("audio"===b.type||"voice"===b.type||"round"===b.type){const i=new Ne;return i.withTime=t,i.message=e,i.noAutoDownload=h,i.lazyLoadQueue=p,i.loadPromises=d,n&&(i.voiceAsMusic=n),c&&(i.searchContext=c),o&&(i.showSender=o),v&&(i.preloader=e.media.preloader),i.dataset.fontWeight=""+s,i.render(),i}let f=b.file_name?b.file_name.split("."):"",y="";y=f.length>1&&Array.isArray(f)?Object(gs.a)(f.pop().split(" ",1)[0].toLowerCase()):"file";let w=document.createElement("div");w.classList.add("document","ext-"+y),w.dataset.docId=""+b.id;const S=document.createElement("div");S.classList.add("document-ico");const L=he.a.getCacheContext(b);if((null===(g=b.thumbs)||void 0===g?void 0:g.length)||e.pFlags.is_outgoing&&L.url&&"photo"===b.type){w.classList.add("document-with-thumb");let t=[];if(e.pFlags.is_outgoing)S.innerHTML=``,t.push(S.firstElementChild);else{const e=Ls({photo:b,message:null,container:S,boxWidth:54,boxHeight:54,loadPromises:d,withoutPreloader:!0,lazyLoadQueue:p,size:r.a.choosePhotoSize(b,54,54,!0)});S.style.width=S.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 S.innerText=y;let C=b.fileName||"Unknown.file";document.createElement("div").classList.add("document-description");const M=[Object(I.b)(b.size)];t&&M.push(Object(oe.d)(e.date)),o&&M.push(i.a.wrapSenderToPeer(e)),w.innerHTML=`\n ${L.downloaded&&!v?"":'
'}\n
\n
\n `;const P=w.querySelector(".document-name"),T=new Ae.a;T.dataset.fontWeight=""+s,T.innerHTML=C,P.append(T),o&&P.append(i.a.wrapSentTime(e));if(w.querySelector(".document-size").append(...Object(x.joinElementsWith)(M," · ")),w.prepend(S),!v&&e.pFlags.is_outgoing)return w;let k,O=null;const A=()=>{if(k){k.classList.add("downloaded");const e=k;setTimeout(()=>{e.remove()},200),k=null}O&&(O=null)},_=e=>{var t;const s=!e||e.isTrusted,i=E.a.getDoc(w.dataset.docId);let n;const o=er.chat.bubbles?er.chat.bubbles.lazyLoadQueue.queueId:void 0;return s?"pdf"===i.type?(n=E.a.downloadDoc(i,o),n.then(()=>{setTimeout(()=>{const e=he.a.getCacheContext(i).url;window.open(e)},a.default.settings.animationsEnabled?250:0)})):n=m.has(i.mime_type)&&(null===(t=i.thumbs)||void 0===t?void 0:t.length)?E.a.downloadDoc(i,o):E.a.saveDocFile(i,o):n=E.a.downloadDoc(i,o),k&&(n.then(A),O.attach(k,!0,n)),{download:n}};return E.a.downloading.has(b.id)?(k=w.querySelector(".document-download"),O=new ye.a,O.attach(k,!1,E.a.downloading.get(b.id))):L.downloaded&&!v||(k=w.querySelector(".document-download"),O=e.media.preloader,O?(O.attach(k),e.media.promise.then(A)):(O=new ye.a,O.construct(),O.setManual(),O.attach(k),O.setDownloadFunction(_))),Object(l.b)(w,e=>{O?O.onClick(e):_(e)}),w}function Ls({photo:e,message:t,container:s,boxWidth:i,boxHeight:n,withTail:o,isOut:l,lazyLoadQueue:c,middleware:d,size:h,withoutPreloader:p,loadPromises:u,noAutoDownload:m,noBlur:g,noThumb:v,noFadeIn:f,blurAfter:y}){var w;if(!e.sizes&&!e.thumbs)return i&&n&&!h&&"document"===e._&&r.a.setAttachmentSize(e,s,i,n,void 0,t),{loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null};h||(void 0===i&&(i=b.b.active.regular.width),void 0===n&&(n=b.b.active.regular.height)),s.classList.add("media-container");let S,L,C,I=s,M=!0,P=Promise.resolve();const T="document"===e._&&"image/gif"===e.mime_type&&!h;if(L=new Image,i&&n&&!h){const a=r.a.setAttachmentSize(e,s,i,n,void 0,t,void 0,T?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:"full"}:void 0);if(h=a.photoSize,M=a.isFit,C=he.a.getCacheContext(e,h.type),!M){I=document.createElement("div"),I.classList.add("media-container-aspecter"),I.style.width=a.size.width+"px",I.style.height=a.size.height+"px";const i=r.a.getStrippedThumbIfNeeded(e,C,!g,!0);if(i){P=i.loadPromise;const e=i.image;e.classList.add("media-photo"),s.append(e)}else{Ls({container:s,message:t,photo:e,boxWidth:0,boxHeight:0,size:h,lazyLoadQueue:c,isOut:l,loadPromises:u,middleware:d,withoutPreloader:p,withTail:o,noAutoDownload:m,noBlur:g,noThumb:!0,blurAfter:!0}).images.full.classList.add("media-photo","thumbnail")}s.classList.add("media-container-fitted"),s.append(I)}}else h||(h=r.a.choosePhotoSize(e,i,n,!0)),C=he.a.getCacheContext(e,null==h?void 0:h.type);if(!v){const t=r.a.getStrippedThumbIfNeeded(e,C,!g);t&&(P=Promise.all([P,t.loadPromise]),S=t.image,S.classList.add("media-photo"),I.append(S))}L.classList.add("media-photo");const k=(S||!C.downloaded)&&a.default.settings.animationsEnabled&&!f;let x;(null===(w=null==t?void 0:t.media)||void 0===w?void 0:w.preloader)&&!p?(x=t.media.preloader,x.attach(s),m=void 0):C.downloaded||(x=new ye.a({attachMethod:"prepend"}));const O=e=>Es(s,L,e,k,I,S),A=()=>d&&!d()?Promise.resolve():y?Object(bs.a)(C.url,12).then(e=>O(e)):O(C.url);let _;const F=h.w>=150&&h.h>=150||m,D=()=>{m&&!p&&x&&(x.construct(),x.setManual());const t=T&&!h?E.a.downloadDoc(e,null==c?void 0:c.queueId):r.a.preloadPhoto(e,h,null==c?void 0:c.queueId,m);x&&!C.downloaded&&!p&&F&&x.attach(s,!1,t),m=void 0;const i=t.then(A);return i.catch(()=>{}),{download:t,render:i}};return x&&x.setDownloadFunction(D),C.downloaded?P=_=D().render:c?c.push({div:s,load:()=>D().download}):_=D().render,u&&P&&u.push(P),{loadPromises:{thumb:P,full:_||Promise.resolve()},images:{thumb:S,full:L},preloader:x,aspecter:I}}function Es(e,t,s,i,n=e,a){return i&&t.classList.add("fade-in"),new Promise(o=>{Object(rs.a)(t,s,()=>{ls.a.mutateElement(e,()=>{n.append(t),Object(De.b)(()=>{o()}),i&&t.addEventListener("animationend",()=>{ls.a.mutate(()=>{t.classList.remove("fade-in"),a&&a.remove()})},{once:!0})})})})}function Cs({doc:e,div:t,middleware:s,lazyLoadQueue:i,group:n,play:o,onlyThumb:d,emoji:h,width:p,height:u,withThumb:m,loop:g,loadPromises:b,needFadeIn:v}){var f;const y=e.sticker;if(p||(p=h?void 0:200),u||(u=h?void 0:200),2===y&&le.a.loadLottieWorkers(),!y)throw console.error("wrong doc for wrapSticker!",e),new Error("wrong doc for wrapSticker!");t.dataset.docId=""+e.id,t.classList.add("media-sticker-wrapper");const w=he.a.getCacheContext(e),S=h?Object(ie.d)(h):-1,L=w.downloaded&&!v;let C=Object(ae.a)(),I=!1;if(((null===(f=e.thumbs)||void 0===f?void 0:f.length)||e.stickerCachedThumbs)&&!t.firstElementChild&&(!L||2===y||d)){let n,a=e.stickerCachedThumbs&&e.stickerCachedThumbs[S]||e.thumbs[0];const o=()=>{t.childElementCount||(n.classList.add("media-sticker","thumbnail"),ls.a.mutateElement(t,()=>{t.append(n),C.resolve()}))};if("url"in a)n=new Image,Object(rs.a)(n,a.url,o),I=!0;else if("bytes"in a){if("photoPathSize"===a._)if(a.bytes.length){const s=r.a.getPathFromPhotoPathSize(a);t.innerHTML=`\n \n `}else a=e.thumbs.find(e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length})||a;a&&"photoPathSize"!==a._&&S<=0&&(n=new Image,vs.a||e.pFlags.stickerThumbConverted||w.url?(Object(rs.a)(n,r.a.getPreviewURLFromThumb(e,a,!0),o),I=!0):ce.a.convert(""+e.id,a.bytes).then(i=>{a.bytes=i,e.pFlags.stickerThumbConverted=!0,s&&!s()||t.childElementCount||Object(rs.a)(n,r.a.getPreviewURLFromThumb(e,a,!0),o)}).catch(()=>{}))}else if(2===y&&(m||d)&&S<=0){n=new Image;const r=()=>{if(t.childElementCount||s&&!s())return;const i=()=>{t.childElementCount||s&&!s()||Object(rs.a)(n,w.url,o)};return w.url?(i(),Promise.resolve()):E.a.getThumbURL(e,a).promise.then(i)};if(i&&d)return i.push({div:t,load:r}),Promise.resolve();r(),a.url&&(I=!0)}}if(b&&I&&b.push(C),d)return Promise.resolve();const M=()=>fs(this,void 0,void 0,(function*(){if(!s||s())if(2===y)yield E.a.downloadDoc(e,null==i?void 0:i.queueId).then(ne.c).then(i=>fs(this,void 0,void 0,(function*(){if(s&&!s())return;let r=yield le.a.loadAnimationWorker({container:t,loop:g&&!h,autoplay:o,animationData:i,width:p,height:u,name:"doc"+e.id},n,S);r.addEventListener("firstFrame",()=>{const s=t.firstElementChild;v=(v||!s||"svg"===s.tagName)&&a.default.settings.animationsEnabled;const i=()=>{s&&s!==r.canvas&&s.remove()};v?ls.a.mutate(()=>{r.canvas.classList.add("fade-in"),s&&s.classList.add("fade-out"),r.canvas.addEventListener("animationend",()=>{ls.a.mutate(()=>{r.canvas.classList.remove("fade-in"),i()})},{once:!0})}):s&&ls.a.mutate(i),E.a.saveLottiePreview(e,r.canvas,S)},{once:!0}),h&&Object(l.b)(t,e=>{Object(c.a)(e);let s=le.a.getAnimation(t);s.paused&&(s.autoplay=!0,s.restart())})})));else if(1===y){const n=new Image,o=t.firstElementChild!==n&&t.firstElementChild;return v=(v||!L||o)&&a.default.settings.animationsEnabled,n.classList.add("media-sticker"),v&&n.classList.add("fade-in"),new Promise((a,r)=>{const l=()=>{if(s&&!s())return a();Object(rs.a)(n,w.url,()=>{ls.a.mutateElement(t,()=>{t.append(n),o&&o.classList.add("fade-out"),a(),v&&n.addEventListener("animationend",()=>{n.classList.remove("fade-in"),o&&o.remove()},{once:!0})})})};w.url?l():E.a.downloadDoc(e,null==i?void 0:i.queueId).then(l,a)})}})),P=!i||L&&2!==y?M():(i.push({div:t,load:M}),Promise.resolve());return L&&1===y&&(C=P,b&&b.push(C)),P}function Is({set:e,lazyLoadQueue:t,container:s,group:i,autoplay:n,width:a,height:o}){var r;return fs(this,void 0,void 0,(function*(){if(null===(r=e.thumbs)||void 0===r?void 0:r.length)return s.classList.add("media-sticker-wrapper"),void t.push({div:s,load:()=>{const t=us.getStickerSetThumbDownloadOptions(e),r=he.a.download(t);if(e.pFlags.animated)return r.then(ne.c).then(t=>{le.a.loadAnimationWorker({container:s,loop:!0,autoplay:n,animationData:t,width:a,height:o,needUpscale:!0,name:"setThumb"+e.id},i)});{const e=new Image;return e.classList.add("media-sticker"),r.then(t=>{Object(rs.a)(e,URL.createObjectURL(t),()=>{s.append(e)})})}}});const l=us.getStickerSet(e),c=yield l;"documentEmpty"!==c.documents[0]._&&Cs({doc:c.documents[0],div:s,group:i,lazyLoadQueue:t})}))}function Ms(e,t,s){const i=new Ge("reply");return i.fill(e,t,s),i.container}function Ps(e){const t=new Ye(e.items,e.maxWidth,e.minWidth,e.spacing,e.maxHeight).layout(),s=t.find(e=>e.sides&qe),i=s.geometry.width+s.geometry.x,n=t.find(e=>e.sides&Qe),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=i+"px",o.style.height=a+"px";const r=o.children;t.forEach(({geometry:t,sides:s},n)=>{let l;if(l=r[n],l||(l=document.createElement("div"),o.append(l)),l.classList.add("album-item","grouped-item"),l.style.width=t.width/i*100+"%",l.style.height=t.height/a*100+"%",l.style.top=t.y/a*100+"%",l.style.left=t.x/i*100+"%",s&$e&&s&We&&(l.style.borderTopLeftRadius="inherit"),s&$e&&s&Qe&&(l.style.borderBottomLeftRadius="inherit"),s&qe&&s&We&&(l.style.borderTopRightRadius="inherit"),s&qe&&s&Qe&&(l.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),l.append(e)}})}function Ts({groupId:e,attachmentDiv:t,middleware:s,uploading:n,lazyLoadQueue:a,isOut:o,chat:l,loadPromises:c,noAutoDownload:d}){const h=[],p=i.a.getMidsByAlbum(e);for(const e of p){const t=l.getMessage(e),s=t.media.photo||t.media.document,i="photo"===s._?r.a.choosePhotoSize(s,480,480):{w:s.w,h:s.h};h.push({size:i,media:s,message:t})}Ps({container:t,items:h.map(e=>({w:e.size.w,h:e.size.h})),maxWidth:b.b.active.album.width,minWidth:100,spacing:2,forMedia:!0}),h.forEach((e,i)=>{const{size:n,media:r,message:l}=e,h=t.children[i];h.dataset.mid=""+l.mid,h.dataset.peerId=""+l.peerId;const p=h.firstElementChild;"photo"===r._?Ls({photo:r,message:l,container:p,boxWidth:0,boxHeight:0,isOut:o,lazyLoadQueue:a,middleware:s,size:n,loadPromises:c,noAutoDownload:d}):ws({doc:l.media.document,container:p,message:l,boxWidth:0,boxHeight:0,withTail:!1,isOut:o,lazyLoadQueue:a,middleware:s,loadPromises:c,noAutoDownload:d})})}b.b.addEventListener("changeScreen",(e,t)=>{if(t===b.a.mobile||e===b.a.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=b.b.active.round.width,s=t/2,i=s-7;ys=2*Math.PI*i,e.forEach(e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+s),n.setAttributeNS(null,"cy",""+s),n.setAttributeNS(null,"r",""+i),n.style.strokeDasharray=ys+" "+ys,n.style.strokeDashoffset=""+ys})}}),a.default.addEventListener("download_start",e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach(e=>{e.querySelector(".preloader-container.manual")&&Object(l.d)(e)})});var ks=s(83),xs=s(110),Os=s(84);function As(e,t,s,i){return void 0===i&&(i=e.parentElement===t?Object(Os.a)(e):-1),i!==s&&(-1!==i&&is?t.insertBefore(e,t.children[s]):t.append(e):t.prepend(e),!0)}class _s{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),this.middleware=Object(xs.a)(),Object(w.g)(this,e),this.elements=new Map,this.sorted=[]}clear(){this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach(e=>{this.update(e.id,!0)}),this.onSort&&this.sorted.forEach((e,t)=>{this.onSort(e,t)})}updateList(e){const t=this.middleware.get();this.updateListWith(s=>{if(!t()||void 0!==s&&!s)return e(!1);this._updateList(),e(!0)})}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e,t=!1,s,i=t){let n=this.get(e);if(n)return n;const a={id:e,index:0};return n=this.onElementCreate(a,t),this.elements.set(e,n),this.update(e,i,n,s),n}delete(e,t){const s=this.elements.get(e);if(!s)return!1;this.elements.delete(e);const i=this.sorted.indexOf(s);if(-1!==i&&this.sorted.splice(i,1),this.onDelete)if(t)this.onDelete(s);else{const e=this.middleware.get();this.updateElementWith(()=>{e()&&this.onDelete(s)})}return!0}update(e,t=!1,s=this.get(e),i){if(!s)return;s.index=this.getIndex(s),this.onUpdate&&this.onUpdate(s);const n=Object(f.f)(this.sorted,s,"index");if(!t&&this.onSort){const e=this.middleware.get();(i||this.updateElementWith)(()=>{e()&&this.onSort(s,n)})}}}var Fs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ds extends _s{constructor(e={}){let t;super({getIndex:e=>P.a.getUserStatusForSort(e.id),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e=>{const t=P.a.getUserStatusString(e.id);Object(k.a)(e.dom.lastMessageSpan,t)},onSort:(e,t)=>{const s=e.dom.listEl.parentElement!==this.list;As(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=kr.addDialogNew({dialog:e.id,container:!1,drawStatus:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});return e.dom=t,e},updateElementWith:De.b,updateListWith:e=>Fs(this,void 0,void 0,(function*(){return Object(ms.a)(this.list)?(yield Object(ks.c)(),Object(ms.a)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize=48,this.rippleEnabled=!0,this.autonomous=!0,Object(w.g)(this,e),this.list=kr.createChatList(this.createChatListOptions);const s=()=>{t=window.setTimeout(()=>{this.updateList(e=>{e&&s()})},Ds.SORT_INTERVAL)};s()}}Ds.SORT_INTERVAL=3e4;var js=s(72);function Bs(e){let t=!1;return new Vt(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!Object(Me.a)(t.target,"progress-line")&&!Object(js.a)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(s,i,n)=>{if(!t&&Math.abs(i)>20)return!0;if(Math.abs(s)>Math.abs(i))Object(c.a)(n),t=!0;else if(!t&&Math.abs(i)>Math.abs(s))return!0;return e.onSwipe(s,i,n)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}function Rs(e){return Bs(Object.assign(Object.assign({},e),{onSwipe:(t,s,i)=>{if(Math.abs(t)>50)return e.onSwipe(t,s,i),Object(te.b)(),!0}}))}var Us=s(107),Hs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ns extends Pt{constructor(e,t,s=!1){super({peerTypes:["dialogs","contacts"],onSelect:s?t:s=>Hs(this,void 0,void 0,(function*(){if(t){const e=t(s);e instanceof Promise&&(yield e)}er.setInnerPeer(s),er.chat.input.initMessagesForward(e)})),placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}class zs{constructor(e,t,s,n){const r=new Lt.a({peerId:e}).element;t=t.slice();const l=(a,o)=>{n&&n(),"scheduled"===s?i.a.deleteScheduledMessages(e,t):i.a.deleteMessages(e,t,!!a.size||o)};let c,d,h,p,u,m=[];if(1===t.length?c="DeleteSingleMessagesTitle":(c="DeleteMessagesTitle",d=[Object(x.i18n)("messages",[t.length])]),h=o.a.isMegagroup(e)?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",u=[{langKey:"Delete",isDanger:!0,callback:l}],e===a.default.myId||"scheduled"===s);else if(e.isUser())m.push({text:"DeleteMessagesOptionAlso",textArgs:[r]});else{const s=K.a.getChat(e.toChatId()),n=K.a.hasRights(e.toChatId(),"delete_messages");if("chat"===s._){const s=n?t.slice():t.filter(t=>i.a.getMessageByPeer(e,t).fromId===a.default.myId);s.length&&(s.length===t.length?m.push({text:"DeleteForAll"}):(m.push({text:"DeleteMessagesOption"}),h="DeleteMessagesTextGroup",p=[Object(x.i18n)("messages",[s.length])]))}else u[0].callback=e=>l(e,!0)}Object(ut.a)(u);new gt("popup-delete-chat",{peerId:e,titleLangKey:c,titleLangArgs:d,descriptionLangKey:h,descriptionLangArgs:p,buttons:u,checkboxes:m}).show()}}var Vs=s(136);class Gs{constructor(e,t,s){let n,a,o=[];n=`Send Message${t.length>1?"s":""} Now`,a=t.length>1?"Send "+t.length+" messages now?":"Send message now?";o.push({langKey:"Send",callback:()=>{s&&s(),i.a.sendScheduledMessages(e,t)}});new gt("popup-delete-chat",{peerId:e,title:n,description:a,buttons:o}).show()}}var Ks=s(7);function Ws(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}var qs=s(106);const Qs=e=>[...e.values()].reduce((e,t)=>e+t.size,0);class $s{constructor(e){if(this.selectedMids=new Map,this.isSelecting=!1,this.cancelSelection=()=>{this.onCancelSelection&&this.onCancelSelection(),this.selectedMids.clear(),this.toggleSelection(),Ws()},Object(w.g)(this,e),this.navigationType="multiselect-"+Object(at.b)(),ue.IS_TOUCH_SUPPORTED)return this.listenerSetter.add(this.listenElement)("touchend",()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")}),void Object(te.a)(this.listenElement,e=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),this.listenElement.addEventListener("touchend",e=>{Object(c.a)(e),document.body.classList.remove("no-select")},{once:!0,capture:!0}),Ws();const t=this.getElementFromTarget(e.target);t&&this.toggleByElement(t)},this.listenerSetter);const t=(e,t)=>{if(e===t)return[];const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),n=(s.top-i.top||s.left-i.left)<0,a=Object(Me.a)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),l=o.indexOf(t);n||([l,r]=[r,l]);return o.slice(r+1,l)};this.listenerSetter.add(this.listenElement)("mousedown",e=>{const s=Object(Me.a)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,s))return;const i=new Map;let n,a=s;const o=(e,s=!0)=>{const r=+e.dataset.mid;if(!r||!e.dataset.peerId)return;const l=e.dataset.peerId.toPeerId();Object(ms.a)(a)||(a=e);let c=i.get(l);if(c||i.set(l,c=new Set),!c.has(r)){const d=this.isMidSelected(l,r);if(void 0===n&&(n=!d),c.add(r),n&&!d||!n&&d){const n=Qs(i);if(this.toggleByElement&&s){n<2&&Object(qs.a)(e,a)&&(a=e);const s=t(a,e);s.length&&s.forEach(e=>{o(e,!1)})}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===n&&this.toggleByMid)for(const[e,t]of i)for(const s of t)this.toggleByMid(e,s)}}};let r=!1;const d=e=>{r||(Ws(),r=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,n)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",d),void this.listenerSetter.removeManual(document,"mouseup",h,p)):void o(t)},h=e=>{i.size&&Object(l.b)(window,c.a,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",d),Ws()},p={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",d),this.listenerSetter.add(document)("mouseup",h,p)})}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const s=!!this.getCheckboxInputFromElement(e);if(t){if(s)return!1;const t=new mt.a({name:e.dataset.mid,round:!0});this.isSelecting&&this.isElementShouldBeSelected(e)&&(t.input.checked=!0,e.classList.add("is-selected")),this.appendCheckbox(e,t)}else s&&this.getCheckboxInputFromElement(e).parentElement.remove();return!0}getCheckboxInputFromElement(e){var t;return"LABEL"===(null===(t=e.firstElementChild)||void 0===t?void 0:t.tagName)&&e.firstElementChild.firstElementChild}updateContainer(e=!1){const t=this.selectedMids.size;if(!t&&!e)return;let s=!t,i=!t,n=!t;for(const[e,t]of this.selectedMids){const n=this.isScheduled?this.appMessagesManager.getScheduledMessagesStorage(e):this.appMessagesManager.getMessagesStorage(e);for(const e of t){const t=this.appMessagesManager.getMessageFromStorage(n,e);if(s||t.action&&(s=!0),!i){this.appMessagesManager.canDeleteMessage(t)||(i=!0)}if(s&&i)break}if(s&&i)break}this.onUpdateContainer&&this.onUpdateContainer(s,i,n)}toggleSelection(e=!0,t=!1){const s=this.isSelecting,i=this.selectedMids.size;if(this.isSelecting=!!i||t,s===this.isSelecting)return!1;ue.IS_TOUCH_SUPPORTED||(this.listenElement.classList.toggle("no-select",this.isSelecting),s&&Ws()),Object(Ks.a)();const n=!!i||t;return this.onToggleSelection&&this.onToggleSelection(n),re.IS_MOBILE_SAFARI||(n?j.a.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):j.a.removeByType(this.navigationType)),t&&this.updateContainer(t),!0}cleanup(){this.selectedMids.clear(),this.toggleSelection(!1)}updateElementSelection(e,t){this.toggleElementCheckbox(e,!0);this.getCheckboxInputFromElement(e).checked=t,this.toggleSelection(),this.updateContainer(),Object(Jt.a)(e,"is-selected",t,200)}isMidSelected(e,t){const s=this.selectedMids.get(e);return null==s?void 0:s.has(t)}length(){return Qs(this.selectedMids)}toggleMid(e,t,s){let i=this.selectedMids.get(e);if(s||void 0===s&&(null==i?void 0:i.has(t)))i&&(i.delete(t),i.size||this.selectedMids.delete(e));else{if(a.default.config.forwarded_count_max-this.length()-1<0)return lt(x.default.format("Chat.Selection.LimitToast",!0)),!1;i||(i=new Set,this.selectedMids.set(e,i)),i.add(t)}return!0}deleteSelectedMids(e,t){const s=this.selectedMids.get(e);s&&(t.forEach(e=>{s.delete(e)}),s.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class Ys extends $s{constructor(e,t){super({appMessagesManager:t,listenElement:e.container,listenerSetter:new R.a,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>Object(Me.a)(e,"search-super-item"),targetLookupClassName:"search-super-item",lookupBetweenParentClassName:"tabs-tab",lookupBetweenElementsQuery:".search-super-item"}),this.searchSuper=e,this.toggleByElement=e=>{const t=+e.dataset.mid,s=e.dataset.peerId.toPeerId();this.toggleMid(s,t)&&this.updateElementSelection(e,this.isMidSelected(s,t))},this.toggleByMid=(e,t)=>{const s=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(s)},this.onUpdateContainer=(e,t,s)=>{const i=this.length();Object(k.a)(this.selectionCountEl,Object(x.i18n)("messages",[i])),this.selectionGotoBtn.classList.toggle("hide",1!==i),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=e=>{if(Object(Jt.a)(this.searchSuper.navScrollableContainer,"is-selecting",e,200,()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)}),Object(Jt.a)(this.searchSuper.container,"is-selecting",e,200),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=H(`close ${e}-cancel`,{noRipple:!0});this.listenerSetter.add(t)("click",this.cancelSelection,{once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=H(`message ${e}-goto`);const s={listenerSetter:this.listenerSetter};Object(l.b)(this.selectionGotoBtn,()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),a.default.dispatchEvent("history_focus",{peerId:e,mid:t})},s),this.selectionForwardBtn=H(`forward ${e}-forward`),Object(l.b)(this.selectionForwardBtn,()=>{const e={};for(const[t,s]of this.selectedMids)e[t]=Array.from(s).sort((e,t)=>e-t);new Ns(e,()=>{this.cancelSelection()})},s),this.isPrivate&&(this.selectionDeleteBtn=H(`delete danger ${e}-delete`),Object(l.b)(this.selectionDeleteBtn,()=>{const e=[...this.selectedMids.keys()][0];new zs(e,[...this.selectedMids.get(e)],"chat",()=>{this.cancelSelection()})},s)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const i=this.selectionContainer;i.style.opacity="0",this.searchSuper.navScrollableContainer.append(i),i.offsetLeft,i.style.opacity=""}},this.isPrivate=!e.showSender}toggleSelection(e=!0,t=!1){const s=super.toggleSelection(e,t);if(s&&e){Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach(e=>{this.toggleElementCheckbox(e,this.isSelecting)})}return s}}class Xs extends $s{constructor(e,t,s,i){super({appMessagesManager:i,listenElement:t.bubblesContainer,listenerSetter:t.listenerSetter,getElementFromTarget:e=>Object(Me.a)(e,"grouped-item")||Object(Me.a)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,s)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===s&&!this.selectedMids.size),verifyTouchLongPress:()=>!this.chat.input.recording,targetLookupClassName:"bubble",lookupBetweenParentClassName:"bubbles-inner",lookupBetweenElementsQuery:".bubble:not(.is-multiple-documents), .grouped-item",isScheduled:"scheduled"===e.type}),this.chat=e,this.bubbles=t,this.input=s,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const e=this.selectedMids.get(this.bubbles.peerId);if(e){this.chat.getMidsByMid(t).forEach(t=>e.delete(t))}}return void this.bubbles.getBubbleGroupedItems(e).forEach(this.toggleByElement)}if(!this.toggleMid(this.bubbles.peerId,t))return;if(e.classList.contains("grouped-item")){const s=Object(Me.a)(e,"bubble"),i=this.isGroupedBubbleSelected(s),n=this.isGroupedMidsSelected(t);(n||i)&&this.updateElementSelection(s,n)}this.updateElementSelection(e,this.isMidSelected(this.bubbles.peerId,t))},this.toggleByMid=(e,t)=>{const s=this.bubbles.getMountedBubble(t);s&&this.toggleByElement(s.bubble)},this.onToggleSelection=e=>{let t="",s="";if(e){const e=this.input.rowsWrapper.parentElement,i=e.querySelector(".fake-selection-wrapper"),n=e.querySelector(".fake-rows-wrapper"),a=i.getBoundingClientRect(),o=n.getBoundingClientRect(),r=o.width,l=a.width;if(r!==l){const e=l/r,i=(r-l)/2;if(t=`translateX(${a.left-o.left-i}px) scaleX(${e})`,e<1){const t=12;s=t+t*(1-e)+"px"}}}if(Object(Jt.a)(this.input.rowsWrapper,"is-centering",e,200),this.input.rowsWrapper.style.transform=t,this.input.rowsWrapper.style.borderRadius=s,Object(Jt.a)(this.listenElement,"is-selecting",e,200,()=>{this.isSelecting||(this.selectionInputWrapper.remove(),this.selectionInputWrapper=this.selectionContainer=this.selectionSendNowBtn=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0),Object(De.b)(()=>{this.bubbles.onScroll()})}),this.isSelecting&&!this.selectionContainer){this.selectionInputWrapper=document.createElement("div"),this.selectionInputWrapper.classList.add("chat-input-wrapper","selection-wrapper"),this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add("selection-container");const e={listenerSetter:this.listenerSetter},t=H("close",{noRipple:!0});Object(l.b)(t,this.cancelSelection,{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=Object(U.a)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append(Object(x.i18n)("MessageScheduleSend")),Object(l.b)(this.selectionSendNowBtn,()=>{new Gs(this.bubbles.peerId,[...this.selectedMids.get(this.bubbles.peerId)],()=>{this.cancelSelection()})},e)):(this.selectionForwardBtn=Object(U.a)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append(Object(x.i18n)("Forward")),Object(l.b)(this.selectionForwardBtn,()=>{const e={};for(const[t,s]of this.selectedMids)e[t]=Array.from(s).sort((e,t)=>e-t);new Ns(e,()=>{this.cancelSelection()})},e)),this.selectionDeleteBtn=Object(U.a)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append(Object(x.i18n)("Delete")),Object(l.b)(this.selectionDeleteBtn,()=>{new zs(this.bubbles.peerId,[...this.selectedMids.get(this.bubbles.peerId)],this.chat.type,()=>{this.cancelSelection()})},e),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.rowsWrapper.parentElement.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity=""}},this.onUpdateContainer=(e,t,s)=>{Object(k.a)(this.selectionCountEl,Object(x.i18n)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",s),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>{for(const[e,t]of this.selectedMids)for(const e of t){const t=this.bubbles.getMountedBubble(e);t&&this.toggleByElement(t.bubble)}}}appendCheckbox(e,t){t.label.classList.add("bubble-select-checkbox"),e.classList.contains("document-container")?e.querySelector(".document, audio-element").append(t.label):super.appendCheckbox(e,t)}toggleSelection(e=!0,t=!1){const s=super.toggleSelection(e,t);if(s&&e)for(const e in this.bubbles.bubbles){const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return s}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const s=super.toggleElementCheckbox(e,t);if(s){e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach(e=>this.toggleElementCheckbox(e,t))}return s}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(+e.dataset.mid))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}isGroupedMidsSelected(e){const t=this.chat.getMidsByMid(e),s=t.filter(e=>this.isMidSelected(this.bubbles.peerId,e));return t.length===s.length}getCheckboxInputFromElement(e){return e.classList.contains("document-container")?e.querySelector("label input"):super.getCheckboxInputFromElement(e)}canSelectBubble(e){return!e.classList.contains("service")&&!e.classList.contains("is-sending")&&!e.classList.contains("bubble-first")}}var Js=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Zs{constructor(e,t){this.attachTo=e,this.searchSuper=t,this.onGotoClick=()=>{a.default.dispatchEvent("history_focus",{peerId:this.peerId,mid:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?Object(l.d)(this.searchSuper.selection.selectionForwardBtn):new Ns({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?Object(l.d)(this.searchSuper.selection.selectionDeleteBtn):new zs(this.peerId,[this.mid],"chat")};const s=e=>{let s;this.init&&(this.init(),this.init=null);try{s=Object(Me.a)(e.target,"search-super-item")}catch(e){}if(s){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),this.target=s,this.peerId=s.dataset.peerId.toPeerId(),this.mid=+s.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),this.buttons.forEach(e=>{let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||e.verify()),e.element.classList.toggle("hide",!t)}),s.classList.add("menu-open"),Object(te.e)(e,this.element),Object(te.d)(this.element,()=>{s.classList.remove("menu-open")})}};ue.IS_TOUCH_SUPPORTED||Object(te.a)(e,s)}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionForwardBtn.classList.contains("hide"),withSelection:!0},{icon:"message",text:"Message.Context.Goto",onClick:this.onGotoClick,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>i.a.canDeleteMessage(i.a.getMessageByPeer(this.peerId,this.mid))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionDeleteBtn.classList.contains("hide"),withSelection:!0}],this.element=Ee(this.buttons),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class ei{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new ee.d,this.middleware=Object(xs.a)(),this.historyStorage={},this.usedFromHistory={},this.urlsToRevoke=[],this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=Object(X.b)("SEARCH-SUPER"),this.monthContainers={},this.mediaTabsMap=new Map,this.asChatList=!1,this.groupByMonth=!0,this.hideEmptyTabs=!0,this.showSender=!1,this.onTransitionStart=()=>{this.container.classList.add("sliding")},this.onTransitionEnd=()=>{this.container.classList.remove("sliding")},Object(w.g)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.searchContextMenu=new Zs(this.container,this),this.selection=new Ys(this,i.a);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const s=this.navScrollable=new T.a(t);s.container.classList.add("search-super-nav-scrollable");const n=this.nav=document.createElement("nav");n.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=n,s.container.append(n);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const s=document.createElement("span"),i=document.createElement("i");s.append(Object(x.i18n)(e.name)),s.append(i),t.append(s),Object(se.ripple)(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"),ue.IS_TOUCH_SUPPORTED&&Rs({element:this.tabsContainer,onSwipe:(e,t,s)=>{const i=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=i+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{Object(c.a)(e)};let s=2;const i=()=>{--s||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",i,{once:!0}),i}(this.tabsContainer),this.selectTab(o))}});for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const s=document.createElement("div");s.classList.add("search-super-content-"+e.type),t.append(s),this.tabsContainer.append(t),this.tabs[e.inputFilter]=s,e.contentTab=s}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new O(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.mediaTab.contentTab.childElementCount&&this.load(!0)},this.selectTab=Object(Z.a)(this.tabsMenu,this.tabsContainer,(e,t,s)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew(this.container,"start");const i=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(i);const n=this.mediaTab;if(this.mediaTab=i,-1!==this.prevTabId&&s&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(i.scroll={scrollTop:n,scrollHeight:0})}if(i.scroll){const e=n.scroll.scrollTop-i.scroll.scrollTop;e&&(i.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||i.contentTab.childElementCount||this.load(!0),this.prevTabId=e},()=>{this.scrollable.onScroll(),void 0!==this.mediaTab.scroll&&(this.mediaTab.contentTab.style.transform="",this.scrollable.scrollTop=this.mediaTab.scroll.scrollTop),a&&(a(),a=void 0),this.onTransitionEnd()},void 0,s),Object(l.b)(this.tabsContainer,e=>{this.selection.isSelecting&&(Object(c.a)(e),this.selection.toggleByElement(Object(Me.a)(e.target,"search-super-item")))},{capture:!0,passive:!1});const o=(e,t,s,n)=>{const a=Object(Me.a)(n.target,e);if(!a)return;const o=+a.dataset.mid;if(!o)return void this.log.warn("no messageId by click on target:",a);const r=a.dataset.peerId.toPeerId(),l=Array.from(this.tabs[s].querySelectorAll("."+t)).map(t=>{const s=Object(Me.a)(t,e);return{element:t,mid:+s.dataset.mid,peerId:s.dataset.peerId.toPeerId()}}),c=l.findIndex(e=>e.mid===o&&e.peerId===r),d=i.a.getMessageByPeer(r,o);(new nr).setSearchContext(this.copySearchContext(s)).openMedia(d,l[c].element,0,!1,l.slice(0,c),l.slice(c+1))};Object(l.b)(this.tabs.inputMessagesFilterPhotoVideo,o.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo")),Object(l.b)(this.tabs.inputMessagesFilterDocument,o.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument")),this.mediaTab=this.mediaTabs[0],Object(ks.a)(()=>{this.lazyLoadQueue.lock()},()=>{this.lazyLoadQueue.unlockAndRefresh()})}filterMessagesByType(e,t){if("inputMessagesFilterEmpty"===t)return e;"inputMessagesFilterUrl"!==t&&(e=e.filter(e=>!!e.media));let s=[];switch(t){case"inputMessagesFilterPhotoVideo":for(let t of e){let e=t.media.photo||t.media.document||t.media.webpage&&t.media.webpage.document;e&&("document"===e._&&"video"!==e.type||s.push(t))}break;case"inputMessagesFilterDocument":for(let t of e)t.media.document&&!["voice","audio","gif","sticker","round"].includes(t.media.document.type)&&s.push(t);break;case"inputMessagesFilterUrl":for(let t of e)s.push(t);break;case"inputMessagesFilterMusic":for(let t of e)t.media.document&&"audio"===t.media.document.type&&s.push(t);break;case"inputMessagesFilterVoice":for(let t of e)t.media.document&&"voice"===t.media.document.type&&s.push(t);break;case"inputMessagesFilterRoundVoice":for(let t of e)t.media.document&&["voice","round"].includes(t.media.document.type)&&s.push(t)}return s}performSearchResult(e,t,s=!0){var n;return Js(this,void 0,void 0,(function*(){const a=[],o=t.contentTab,l=[],c=this.middleware.get();let d,h=t.inputFilter;switch(yield Object(ks.c)(),"inputMessagesFilterPhotoVideo"===h&&this.searchContext.query.trim()?(h="inputMessagesFilterEmpty",d=this.searchGroupMedia,o.append(d.container)):"inputMessagesFilterEmpty"===h&&(d=this.searchGroups.messages),h){case"inputMessagesFilterEmpty":for(const t of e){const{dialog:e,dom:s}=kr.addDialogNew({dialog:t.peerId,container:d.list,drawStatus:!1,avatarSize:54});kr.setLastMessage(e,t,s,this.searchContext.query)}d.list.childElementCount&&d.setActive();break;case"inputMessagesFilterPhotoVideo":for(const t of e){const e=t.media.photo||t.media.document||t.media.webpage&&t.media.webpage.document,s=document.createElement("div");let i;s.classList.add("grid-item");const n=r.a.choosePhotoSize(e,200,200);i="photo"!==e._?ws({doc:e,message:t,container:s,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:c,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,size:n}).thumb:Ls({photo:e,message:t,container:s,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:c,withoutPreloader:!0,noBlur:!0,size:n}),[i.images.thumb,i.images.full].filter(Boolean).forEach(e=>{e.classList.add("grid-item-media")}),l.push(i.loadPromises.thumb),a.push({element:s,message:t})}break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":for(const t of e){const e=this.showSender||["voice","round"].includes(t.media.document.type),s=Ss({message:t,withTime:!e,fontWeight:400,voiceAsMusic:!0,showSender:e,searchContext:this.copySearchContext(h),lazyLoadQueue:this.lazyLoadQueue,noAutoDownload:!0});["audio","voice","round"].includes(t.media.document.type)&&s.classList.add("audio-48"),a.push({element:s,message:t})}break;case"inputMessagesFilterUrl":for(let t of e){let e;if((null===(n=t.media)||void 0===n?void 0:n.webpage)&&"webPageEmpty"!==t.media.webpage._)e=t.media.webpage;else{const s=t.totalEntities?t.totalEntities.find(e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._):null;let i,n,a;if(s)a=t.message.slice(s.offset,s.offset+s.length);else{const e=J.b.matchUrl(t.message);if(!e)continue;i=e[0]}i="messageEntityTextUrl"===(null==s?void 0:s._)?s.url:i||a,n=i;const o=t.message===i;i.match(/^(ftp|http|https):\/\//)||(n="https://"+i,i=i.includes("@")?i:"https://"+i),n=new URL(n).hostname,e={url:i,display_url:n},o||(e.description=t.message,e.rDescription=J.b.wrapRichText(Object(Y.f)(t.message,150,180)))}document.createElement("div");let s=document.createElement("div");if(s.classList.add("preview","row-media"),e.photo){Ls({container:s,message:null,photo:e.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:c,size:r.a.choosePhotoSize(e.photo,60,60,!1),loadPromises:l,noBlur:!0})}else s.classList.add("empty"),s.innerHTML=J.b.getAbbreviation(e.title||e.display_url||e.description||e.url,!0);let o=e.rTitle||"",d=e.rDescription||"";const h=Object(Vs.a)(d),p=Object(Vs.a)(J.b.wrapRichText(e.url||"")).firstElementChild;p instanceof HTMLAnchorElement&&(p.innerText=decodeURIComponent(p.href)),h.firstChild&&h.append("\n"),h.append(p),this.showSender&&h.append("\n",i.a.wrapSenderToPeer(t)),o||(o=J.b.wrapPlainText(e.display_url.split("/",1)[0]));const u=new st({title:o,titleRight:i.a.wrapSentTime(t),subtitle:h,havePadding:!0,clickable:!0,noRipple:!0});u.container.append(s),u.container.innerText.trim().length&&a.push({element:u.container,message:t})}}if(this.loadMutex&&l.push(this.loadMutex),!l.length||(yield Promise.all(l),c())){if(a.length){const e=s?"append":"prepend";a.forEach(t=>{const{element:s,message:i}=t,n=this.getMonthContainerByTimestamp(this.groupByMonth?i.date:0,h);s.classList.add("search-super-item"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,n.items[e](s),this.selection.isSelecting&&this.selection.toggleElementCheckbox(s,!0)})}this.afterPerforming("inputMessagesFilterEmpty"===h?1:e.length,o)}}))}afterPerforming(e,t){if(t){const s=t.parentElement;if(Array.from(s.children).slice(1).forEach(e=>{e.remove()}),!e&&!t.childElementCount){const e=document.createElement("div");e.innerText="Nothing interesting here yet...",e.classList.add("position-center","text-center","content-empty","no-select"),s.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(let e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const s=this.searchContext.query;if(s){const r=(t,i,r=!1)=>{t.forEach(t=>{if(e.has(t))return;e.add(t);const l=o.a.getPeer(t),{dom:c}=kr.addDialogNew({dialog:t,container:i.list,drawStatus:!1,avatarSize:48,autonomous:i.autonomous});if(r&&(l.participants_count||l.participants)){const e=new RegExp(`(${Object(Y.e)(s)}|${Object(Y.e)(Object(gs.b)(s))})`,"gi");c.titleSpan.innerHTML=c.titleSpan.innerHTML.replace(e,"$1"),c.lastMessageSpan.append(n.default.getChatMembersString(t.toChatId()))}else if(t===a.default.myId)c.lastMessageSpan.append(Object(x.i18n)("Presence.YourChat"));else{let e=o.a.getPeerUsername(t);if(e)e="@"+e;else{const s=P.a.getUser(t);s&&s.phone&&(e="+"+Object(Us.a)(s.phone).formatted)}c.lastMessageSpan.innerHTML=""+e+""}}),i.toggle()},l=e=>{if(t())return e};return Promise.all([P.a.getContactsPeerIds(s,!0).then(l).then(e=>{e&&r(e,this.searchGroups.contacts,!0)}),P.a.searchContacts(s,20).then(l).then(e=>{if(e&&(r(e.my_results,this.searchGroups.contacts,!0),r(e.results,this.searchGroups.globalContacts),this.searchGroups.globalContacts.nameEl.lastElementChild&&this.searchGroups.globalContacts.nameEl.lastElementChild.remove(),this.searchGroups.globalContacts.container.classList.add("is-short"),this.searchGroups.globalContacts.list.childElementCount>3)){const e=document.createElement("div");e.classList.add("search-group__show-more"),e.innerText="Show more",this.searchGroups.globalContacts.nameEl.append(e),e.addEventListener("click",()=>{const t=this.searchGroups.globalContacts.container.classList.toggle("is-short");e.innerText=t?"Show more":"Show less"})}}),i.a.getConversations(s,0,20,0).promise.then(l).then(e=>{e&&r(e.dialogs.map(e=>e.peerId),this.searchGroups.contacts,!0)})])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>M.default.getState().then(s=>{t()&&(this.searchGroups.recent.list.innerHTML="",s.recentSearch.slice(0,20).forEach(e=>{let{dialog:t,dom:s}=kr.addDialogNew({dialog:e,container:this.searchGroups.recent.list,drawStatus:!1,meAsSaved:!0,avatarSize:48,autonomous:!0});s.lastMessageSpan.append(e.isUser()?P.a.getUserStatusString(e):n.default.getChatMembersString(e.toChatId()))}),s.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())});return Promise.all([P.a.getTopPeers("correspondents").then(e=>{if(!t())return;const s=e.findIndex(e=>e.id===a.default.myId);-1!==s&&(e=e.slice()).splice(s,1),e.length&&e.forEach(e=>{kr.addDialogNew({dialog:e.id,container:this.searchGroups.people.list,drawStatus:!1,onlyFirstName:!0,avatarSize:54,autonomous:!1})}),this.searchGroups.people.setActive()}),e()])}}loadMembers(e){const t=this.searchContext.peerId.toChatId(),s=this.middleware.get();let i;const a=t=>Js(this,void 0,void 0,(function*(){this.loadMutex&&(yield this.loadMutex,!s())||(this.membersList||(this.membersList=new Ds({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1}),this.membersList.list.addEventListener("click",e=>{const t=Object(ft.a)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();let i=Promise.resolve();b.b.isMobile&&(i=Yt.toggleSidebar(!1)),i.then(()=>{er.setInnerPeer(s)})}),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab)),t.forEach(e=>{const t=K.a.getParticipantPeerId(e);if(t.isAnyChat())return;P.a.getUser(t).pFlags.deleted||this.membersList.add(t)}))}));if(K.a.isChannel(t)){const o=this.membersList?200:50;i=n.default.getChannelParticipants(t,void 0,o,this.nextRates[e.inputFilter]).then(t=>{if(!s())return;let i=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(i?i.childElementCount:0)+t.participants.length,t.participants.length{if(!s())return;this.loaded[e.inputFilter]=!0;const i=t.participants;return"chatParticipantsForbidden"!==i._?a(i.participants):void 0});return this.loadPromises[e.inputFilter]=i.finally(()=>{s()&&(this.loadPromises[e.inputFilter]=null)})}loadType(e,t,s,n){var a,o;const r=e.inputFilter;if(this.loadPromises[r])return this.loadPromises[r];if("members"===e.type)return this.loadMembers(e);const l=null!==(a=this.historyStorage[r])&&void 0!==a?a:this.historyStorage[r]=[];if(!("inputMessagesFilterEmpty"!==r||l.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[r]=!0,Promise.resolve();const c="load ["+r+"]: ";if(l.length&&this.usedFromHistory[r]i.a.getMessageByPeer(e.peerId,e.mid)),r))}while(a{setTimeout(()=>{this.scrollable.checkForTriggers()},0)})}let d=l.length?l[l.length-1].mid:0;return this.loadPromises[r]=i.a.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:r},maxId:d,limit:s,nextRate:null!==(o=this.nextRates[r])&&void 0!==o?o:this.nextRates[r]=0})).then(i=>{if(l.push(...i.history.map(e=>({mid:e.mid,peerId:e.peerId}))),this.log(c+"search house of glass",r,i),n())return(i.history.length{setTimeout(()=>{if(n()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then(()=>{n()&&setTimeout(()=>{this.scrollable.checkForTriggers()},0)})}},0)}),this.performSearchResult(this.filterMessagesByType(i.history,r),e))}).catch(e=>{this.log.error("load error:",e)}).finally(()=>{this.loadPromises[r]=null})}load(e=!1,t=!1){return Js(this,void 0,void 0,(function*(){const s=this.searchContext.peerId;this.log("load",e,s,this.loadPromises);const n=this.middleware.get();if(this.firstLoad){if(this.hideEmptyTabs){const e=this.mediaTabs.filter(e=>"inputMessagesFilterEmpty"!==e.inputFilter),t=e.map(e=>({_:e.inputFilter})),a=yield i.a.getSearchCounters(s,t);if(!n())return;if(this.loadMutex&&(yield this.loadMutex,!n()))return;let o,r=0;e.forEach(e=>{const t=a.find(t=>t.filter._===e.inputFilter);e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&void 0===o&&(o=e),t.count&&++r});const l=this.mediaTabsMap.get("members"),c=this.canViewMembers();l.menuTab.classList.toggle("hide",!c),c&&(o=l),this.container.classList.toggle("hide",!o),this.container.parentElement.classList.toggle("search-empty",!o),o&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(o),!1),o.menuTab.classList.add("active"),this.navScrollableContainer.classList.toggle("hide",r<=1))}this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter(e=>e!==this.mediaTab);if(a=a.filter(e=>{const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"members"===e.type),!a.length)return;const o=t?50:Math.round(3*(Et.a.height/130|0)*1.25),r=a.map(e=>this.loadType(e,t,o,n));return Promise.all(r).catch(e=>{this.log.error("Load error all promises:",e)})}))}getMonthContainerByTimestamp(e,t){var s;const i=new Date(1e3*e);i.setHours(0,0,0),i.setDate(1);const n=i.getTime(),a=null!==(s=this.monthContainers[t])&&void 0!==s?s:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const s=document.createElement("div");s.classList.add("search-super-month-name");const o={month:"long"};i.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new x.default.IntlDateElement({date:i,options:o}).element;s.append(r),e.append(s);const l=document.createElement("div");l.classList.add("search-super-month-items"),e.append(s,l);const c=Object(w.e)(a,"desc");let d=0;for(;dc[d])break}a[n]={container:e,items:l},As(e,this.tabs[t],d)}return a[n]}canViewMembers(){return this.searchContext.peerId.isAnyChat()&&!K.a.isBroadcast(this.searchContext.peerId.toChatId())&&K.a.hasRights(this.searchContext.peerId.toChatId(),"view_participants")}cleanup(){this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.lazyLoadQueue.clear(),this.mediaTabs.forEach(e=>{this.usedFromHistory[e.inputFilter]=-1}),this.selection.isSelecting&&this.selection.cancelSelection(),this.middleware.clean(),this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach(e=>{e.scroll=void 0})}cleanupHTML(e=!1){this.urlsToRevoke.length&&(this.urlsToRevoke.forEach(e=>{URL.revokeObjectURL(e)}),this.urlsToRevoke.length=0),this.mediaTabs.forEach(e=>{if(e.contentTab.innerHTML="",this.hideEmptyTabs&&(this.container.classList.add("hide"),this.container.parentElement.classList.add("search-empty")),"chats"!==e.type&&!this.historyStorage[e.inputFilter]){const t=e.contentTab.parentElement;t.querySelector(".preloader")||Object(te.f)(t,!0);const s=t.querySelector(".content-empty");s&&s.remove()}}),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=Object(w.a)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:s,historyStorage:i,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:s,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=i?i:{},this.cleanup()}}var ti,si=s(74);!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(ti||(ti={}));const ii=new class{constructor(){this.privacy={},a.default.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,a.default.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return ht.a.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then(s=>(P.a.saveApiUsers(s.users),K.a.saveApiChats(s.chats),si.a.processLocalUpdate({_:"updatePrivacy",key:{_:Object(Y.b)(e)},rules:t.map(e=>{const t={};return Object.assign(t,e),t._=Object(Y.b)(t._),t})}),s.rules))}getPrivacy(e){const t=Object(Y.b)(e),s=this.privacy[t];return s?Promise.resolve(s):this.privacy[t]=ht.a.invokeApi("account.getPrivacy",{key:{_:e}}).then(e=>(P.a.saveApiUsers(e.users),K.a.saveApiChats(e.chats),this.privacy[t]=e.rules))}getPrivacyRulesDetails(e){const t=[];let s={users:[],chats:[]},i={users:[],chats:[]};return e.forEach(e=>{switch(e._){case"privacyValueAllowAll":t.push(2);break;case"privacyValueDisallowAll":t.push(0);break;case"privacyValueAllowContacts":t.push(1);break;case"privacyValueAllowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueAllowUsers":s.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":i.chats.push(...e.chats);break;case"privacyValueDisallowUsers":i.users.push(...e.users)}}),{type:t[0],disallowPeers:i,allowPeers:s}}};de.a.appPrivacyManager=ii;var ni=ii;class ai{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],s=this.radioSection.caption;t?Object(x._i18n)(s,t):s.innerHTML="",s.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===ti.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===ti.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse(),this.radioSection=new dn({name:e.title,caption:!0}),this.radioRows=new Map;let t=[{type:ti.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:ti.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:ti.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(t=t.filter(t=>!e.skipTypes.includes(t.type)));const s=Object(at.b)();t.forEach(({type:e,langKey:t})=>{const i=new st({radioField:new ot({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)});const i=it([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(i),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=hn(e.appendTo,"PrivacyExceptions","PrivacySettingsController.PeerInfo");this.exceptions=new Map([["disallow",{titleLangKey:e.exceptionTexts[0],key:"disallow",row:null,icon:"deleteuser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}],["allow",{titleLangKey:e.exceptionTexts[1],key:"allow",row:null,icon:"adduser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}]]),this.exceptions.forEach(s=>{s.row=new st(s),s.row.container.addEventListener("click",()=>{n.then(()=>{const t=this.peerIds[s.key];new Bt(e.tab.slider).open({type:"privacy",skippable:!0,title:s.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),s.row.subtitle.innerHTML="",s.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})})}),t.append(s.row.container)})}const n=ni.getPrivacy(e.inputKey).then(t=>{const s=ni.getPrivacyRulesDetails(t);this.setRadio(s.type),this.exceptions&&(this.peerIds={},["allow","disallow"].forEach(e=>{const t=[],i="allow"===e?s.allowPeers:s.disallowPeers;t.push(...i.users.map(e=>e.toPeerId())),t.push(...i.chats.map(e=>e.toPeerId(!0))),this.peerIds[e]=t;const n=this.exceptions.get(e).row.subtitle;n.innerHTML="",n.append(...this.generateStr(i))})),e.tab.eventListener.addEventListener("destroy",()=>{const t=[];switch(this.type){case ti.Everybody:t.push({_:"inputPrivacyValueAllowAll"});break;case ti.Contacts:t.push({_:"inputPrivacyValueAllowContacts"});break;case ti.Nobody:t.push({_:"inputPrivacyValueDisallowAll"})}this.exceptions&&[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]].forEach(([e,s,i],n)=>{if(this.exceptions.get(e).row.container.classList.contains("hide"))return;const a=this.peerIds[e];if(a){const e=this.splitPeersByType(a);e.chats.length&&t.push({_:s,chats:e.chats}),e.users.length&&t.push({_:i,users:e.users.map(e=>P.a.getUserInput(e))})}}),ni.setPrivacy(e.inputKey,t)},{once:!0})})}setRadio(e){const t=this.radioRows.get(e);this.onRadioChange(e),t.radioField.input.checked=!0}splitPeersByType(e){const t={users:[],chats:[]};return e.forEach(e=>{t[e.isAnyChat()?"chats":"users"].push(e.isAnyChat()?e.toChatId():e)}),t}generateStr(e){return e.users.length||e.chats.length?Object(x.join)([e.users.length?Object(x.i18n)("Users",[e.users.length]):null,e.chats.length?Object(x.i18n)("Chats",[e.chats.length]):null].filter(Boolean),!1):[Object(x.i18n)("PrivacySettingsController.AddUsers")]}}class oi extends V{init(){this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e=new ai({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:["PrivacyPhoneInfo","PrivacyPhoneInfo",""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{t.setRadio(ti.Everybody),t.radioSection.container.classList.toggle("hide",e!==ti.Nobody)}}),t=new ai({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:["PrivacyPhoneInfo3","PrivacyPhoneInfo3",""],noExceptions:!0,skipTypes:[ti.Nobody]});this.scrollable.container.insertBefore(t.radioSection.container,e.radioSection.container.nextSibling)}}var ri=s(79);class li extends z{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new dn({caption:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=us.getAnimatedEmojiSticker("🥳"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!0,play:!0,width:160,height:160}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=Object(U.a)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});Object(l.b)(a,e=>{this.close()}),this.slider.sliceTabsUntilTab(tn,this),n.append(a),i.append(n),this.scrollable.container.append(e.container)}}var ci=s(113);function di(e){return!re.IS_MOBILE_SAFARI||!e}class hi extends z{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 dn({caption:!0,noDelimiter:!0});Object(x._i18n)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=us.getAnimatedEmojiSticker("📬"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"📬"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=this.codeInputField=new ci.a({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),ri.a.confirmPasswordEmail(""+e).then(e=>{c()}).catch(e=>{switch(e.type){case"CODE_INVALID":a.input.classList.add("error"),Object(k.a)(a.label,Object(x.i18n)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":a.input.classList.add("error"),Object(k.a)(a.label,Object(x.i18n)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}d(!1)})}}),o=Object(U.a)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),r=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),c=()=>{new li(this.slider).open()},d=e=>{Object(bt.a)([a.input,o,r],e)};Object(l.b)(o,e=>{d(!0),ri.a.cancelPasswordEmail().then(e=>{this.slider.sliceTabsUntilTab(pi,this),this.close()},()=>{d(!1)})}),Object(l.b)(r,e=>{d(!0);const t=Object(te.f)(r);ri.a.resendPasswordEmail().then(e=>{t.remove(),d(!1)})}),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){di(this.isFirst)&&this.codeInputField.input.focus()}}class pi extends z{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new dn({caption:!0,noDelimiter:!0}),t=us.getAnimatedEmojiSticker("💌"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"💌"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=this.inputField=new _.b({name:"recovery-email",label:"RecoveryEmail",plainText:!0});a.input.addEventListener("keypress",e=>{if("Enter"===e.key)return Object(c.a)(e),h()}),a.input.addEventListener("input",e=>{a.input.classList.remove("error")});const o=Object(U.a)("btn-primary btn-color-primary",{text:"Continue"}),r=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),d=()=>{new li(this.slider).open()},h=()=>{const e=a.value.trim(),t=J.b.matchEmail(e);if(!t||t[0].length!==e.length)return void a.input.classList.add("error");p(!0);const s=Object(te.f)(o);ri.a.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then(e=>{d()},t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const s=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],i=new hi(this.slider);i.state=this.state,i.email=e,i.length=s,i.open()}else console.log("password set error",t);p(!1),s.remove()})};Object(l.b)(o,h);const p=e=>{e?(o.setAttribute("disabled","true"),r.setAttribute("disabled","true")):(o.removeAttribute("disabled"),r.removeAttribute("disabled"))};Object(l.b)(r,e=>{new gt("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{p(!0),Object(te.f)(r),ri.a.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then(()=>{d()},e=>{p(!1)})},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()}),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){di(this.isFirst)&&this.inputField.input.focus()}}var ui=s(101),mi=s(95),gi=s(112);class bi extends z{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new dn({noDelimiter:!0}),t=us.getAnimatedEmojiSticker("💡"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"💡"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=document.createElement("div");i.classList.add("input-wrapper");const n=this.inputField=new _.b({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});n.input.addEventListener("keypress",e=>{if("Enter"===e.key)return Object(c.a)(e),n.value?d():h()});const a=(e,t)=>{e&&Object(c.a)(e);const s=t?n.value:void 0;if(s&&this.newPassword===s)return void lt(x.default.format("PasswordAsHintError",!0));const i=new pi(this.slider);i.state=this.state,i.plainPassword=this.plainPassword,i.newPassword=this.newPassword,i.hint=s,i.open()},o=Object(U.a)("btn-primary btn-color-primary",{text:"Continue"}),r=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),d=e=>a(e,!0),h=e=>a(e,!1);Object(l.b)(o,d),Object(l.b)(r,h),i.append(n.container,o,r),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class vi extends z{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 dn({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const s=this.passwordInputField=new mi.a({name:"re-enter-password",label:"PleaseReEnterPassword"}),i=new gi.a(s,157),n=Object(U.a)("btn-primary btn-color-primary",{text:"Continue"});t.append(s.container,n),e.content.append(i.container,t),this.scrollable.container.append(e.container),s.input.addEventListener("keypress",e=>{if(s.input.classList.contains("error")&&s.setState(_.a.Neutral),"Enter"===e.key)return o()});const a=()=>this.newPassword===s.value||(s.setError(),!1),o=e=>{if(e&&Object(c.a)(e),!a())return;const t=new bi(this.slider);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return Object(l.b)(n,o),i.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class fi extends z{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 dn({noDelimiter:!0}),s=document.createElement("div");s.classList.add("input-wrapper");const i=this.passwordInputField=new mi.a({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?J.b.wrapEmojiText(this.state.hint):void 0}),n=new ui.a(i,157),a=Object(U.a)("btn-primary btn-color-primary"),o=new x.default.IntlElement({key:"Continue"});a.append(o.element),s.append(i.container,a),t.content.append(n.container,s),this.scrollable.container.append(t.container),i.input.addEventListener("keypress",e=>{if(i.input.classList.contains("error")&&(i.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return d()});const r=()=>!!i.value.length||(i.input.classList.add("error"),!1);let d;if(e)d=e=>{if(e&&Object(c.a)(e),!r())return;const t=new vi(this.slider);t.state=this.state,t.newPassword=i.value,t.plainPassword=this.plainPassword,t.open()};else{let e,t=()=>(e||(e=window.setInterval(t,1e4)),ri.a.getState().then(e=>{this.state=e,this.state.hint?i.label.innerHTML=J.b.wrapEmojiText(this.state.hint):Object(k.a)(i.label,Object(x.i18n)("LoginPassword"))}));d=s=>{if(!r())return void Object(c.a)(s);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const l=Object(te.f)(a),d=i.value;ri.a.check(i.value,this.state).then(t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=new yi(this.slider);t.state=this.state,t.plainPassword=d,t.open(),this.slider.removeTabFromHistory(this)}},e=>{a.removeAttribute("disabled"),i.input.classList.add("error"),e.type,o.key="TwoStepAuth.InvalidPassword",o.update(),l.remove(),i.select(),t()})},t()}return Object(l.b)(a,d),n.load()}onOpenAfterTimeout(){di(this.isFirst)&&this.passwordInputField.input.focus()}}class yi extends z{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new dn({caption:!0,noDelimiter:!0}),t=us.getAnimatedEmojiSticker("🔐"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!1,play:!0,width:168,height:168,emoji:"🔐"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement();if(this.state.pFlags.has_password){Object(x._i18n)(e.caption,"TwoStepAuth.GenericHelp");const t=Object(U.a)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=Object(U.a)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=Object(U.a)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});Object(l.b)(t,()=>{const e=new fi(this.slider);e.state=this.state,e.plainPassword=this.plainPassword,e.open()}),Object(l.b)(s,()=>{new gt("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{ri.a.updateSettings({currentPassword:this.plainPassword}).then(()=>{this.slider.sliceTabsUntilTab(tn,this),this.close()})},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()}),Object(l.b)(n,()=>{const e=new pi(this.slider);e.state=this.state,e.hint=this.state.hint,e.plainPassword=this.plainPassword,e.newPassword=this.plainPassword,e.isFirst=!0,e.open()}),i.append(t,s,n)}else{Object(x._i18n)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=Object(U.a)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),Object(l.b)(s,e=>{const t=new fi(this.slider);t.state=this.state,t.open()})}this.scrollable.container.append(e.container)}}class wi extends V{init(){this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new ai({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable})}}class Si extends V{init(){this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new ai({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[ti.Nobody]})}}class Li extends V{init(){this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new ai({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}class Ei extends V{init(){this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new ai({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[ti.Nobody]})}}class Ci extends V{init(){this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new ai({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable});{const e="PrivacySettingsController.P2p.Desc";new ai({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}}class Ii extends z{init(){this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new st({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:Object(oe.c)(new Date(1e3*Math.max(e.date_active,e.date_created)))});t.container.dataset.hash=""+e.hash;const s=document.createElement("div");return s.classList.add("row-midtitle"),s.innerHTML=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t.subtitle.parentElement.insertBefore(s,t.subtitle),t},t=this.authorizations.slice();{const n=new dn({name:"CurrentSession"}),a=t.findAndSplice(e=>e.pFlags.current),o=e(a);if(n.content.append(o.container),t.length){const e=Object(U.a)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});Object(l.b)(e,t=>{new gt("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=Object(bt.a)([e],!0);ht.a.invokeApi("auth.resetAuthorizations").then(t=>{e.remove(),s.container.remove(),this.privacyTab.updateActiveSessions()},i).finally(()=>{t()})}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()}),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const s=new dn({name:"OtherSessions"});t.forEach(t=>{s.content.append(e(t).container)}),this.scrollable.append(s.container);const i=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&<(x.default.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new gt("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{ht.a.invokeApi("account.resetAuthorization",{hash:e}).then(e=>{e&&(n.remove(),this.privacyTab.updateActiveSessions())},i)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=Ee([{icon:"stop",text:"Terminate",onClick:a}]);o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),Object(te.a)(this.scrollable.container,e=>{n=Object(Me.a)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),Object(te.e)(e,o),Object(te.d)(o))}),Object(l.b)(this.scrollable.container,e=>{n=Object(Me.a)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()})}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}class Mi extends z{init(){this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");{const e=new dn({caption:"BlockedUsersInfo"});this.scrollable.append(e.container)}const e=Q({icon:"add",className:"is-visible"});this.content.append(e),Object(l.b)(e,e=>{new Pt({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{P.a.toggleBlock(e,!0)}})},{listenerSetter:this.listenerSetter});const t=kr.createChatList();this.scrollable.container.classList.add("chatlist-container"),this.scrollable.append(t);const s=(e,s)=>{const{dom:i}=kr.addDialogNew({dialog:e,container:t,drawStatus:!1,rippleEnabled:!0,avatarSize:48,append:s}),n=P.a.getUser(e);n.pFlags.bot?i.lastMessageSpan.append("@"+n.username):n.phone?i.lastMessageSpan.innerHTML=P.a.formatUserPhone(n.phone):i.lastMessageSpan.append(n.username?"@"+n.username:P.a.getUserStatusString(e))};for(const e of this.peerIds)s(e,!0);let i;const n=this.menuElement=Ee([{icon:"lockoff",text:"Unblock",onClick:()=>{const e=i.dataset.peerId.toPeerId();P.a.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]);n.id="blocked-users-contextmenu",n.classList.add("contextmenu"),document.getElementById("page-chats").append(n),Object(te.a)(this.scrollable.container,e=>{i=Object(ft.a)(e.target,"LI"),i&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),Object(te.e)(e,n),Object(te.d)(n))},this.listenerSetter),this.listenerSetter.add(a.default)("peer_block",e=>{const{peerId:i,blocked:n}=e,a=t.querySelector(`[data-peer-id="${i}"]`);n?a||s(i,!1):a&&a.remove()});let o=!1;this.scrollable.onScrolledBottom=()=>{o||(o=!0,P.a.getBlocked(t.childElementCount,50).then(e=>{for(const t of e.peerIds)s(t,!0);(e.peerIds.length<50||t.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()}).finally(()=>{o=!1}))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var Pi=s(116);class Ti extends V{init(){this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");{const e=new dn({noDelimiter:!0});let t;const s=new st({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:"Loading",clickable:()=>{const e=new Mi(this.slider);e.peerIds=t,e.open()}});let i;s.freezed=!0;const n=new st({icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:"Loading",clickable:e=>{let t;i.pFlags.has_password?t=new fi(this.slider):i.email_unconfirmed_pattern?(t=new hi(this.slider),t.email=i.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,ri.a.resendPasswordEmail()):t=new yi(this.slider),t.state=i,t.open()}});n.freezed=!0;const o=this.activeSessionsRow=new st({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:"Loading",clickable:()=>{const e=new Ii(this.slider);e.privacyTab=this,e.authorizations=this.authorizations,e.open()}});o.freezed=!0,e.content.append(s.container,n.container,o.container),this.scrollable.append(e.container);const r=e=>{e?Object(k.a)(s.subtitle,Object(x.i18n)("PrivacySettingsController.UserCount",[e])):Object(k.a)(s.subtitle,Object(x.i18n)("BlockedEmpty",[e]))};this.listenerSetter.add(a.default)("peer_block",()=>{l()});const l=()=>{P.a.getBlocked().then(e=>{s.freezed=!1,r(e.count),t=e.peerIds})};l(),ri.a.getState().then(e=>{i=e,Object(k.a)(n.subtitle,Object(x.i18n)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),n.freezed=!1}),this.updateActiveSessions()}{const e=new dn({name:"PrivacyTitle"});e.content.classList.add("privacy-navigation-container");const t={},s=t.inputPrivacyKeyPhoneNumber=new st({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:"Loading",clickable:()=>{new oi(this.slider).open()}}),i=t.inputPrivacyKeyStatusTimestamp=new st({titleLangKey:"LastSeenTitle",subtitleLangKey:"Loading",clickable:()=>{new wi(this.slider).open()}}),n=t.inputPrivacyKeyProfilePhoto=new st({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:"Loading",clickable:()=>{new Si(this.slider).open()}}),o=t.inputPrivacyKeyPhoneCall=new st({titleLangKey:"WhoCanCallMe",subtitleLangKey:"Loading",clickable:()=>{new Ci(this.slider).open()}}),r=t.inputPrivacyKeyForwards=new st({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:"Loading",clickable:()=>{new Li(this.slider).open()}}),l=t.inputPrivacyKeyChatInvite=new st({titleLangKey:"WhoCanAddMe",subtitleLangKey:"Loading",clickable:()=>{new Ei(this.slider).open()}}),c=e=>{const s=t[e];s&&ni.getPrivacy(e).then(e=>{const t=ni.getPrivacyRulesDetails(e),i=t.type===ti.Everybody?"PrivacySettingsController.Everbody":t.type===ti.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=t.disallowPeers.users.length+t.disallowPeers.chats.length,a=t.allowPeers.users.length+t.allowPeers.chats.length;s.subtitle.innerHTML="";const o=Object(x.i18n)(i);s.subtitle.append(o),(n||a)&&s.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)})};e.content.append(s.container,i.container,n.container,o.container,r.container,l.container),this.scrollable.append(e.container);for(const e in t)c(e);a.default.addEventListener("privacy_update",e=>{c(Object(Y.c)(e.key._))})}const e=[];{const t=new dn({name:"Privacy.SensitiveContent"});t.container.classList.add("hide"),e.push(ht.a.invokeApi("account.getContentSettings").then(e=>{if(!e.pFlags.sensitive_can_change)return;const s=e.pFlags.sensitive_enabled,i=new st({checkboxField:new mt.a({text:"PrivacyAndSecurity.SensitiveText",checked:s}),subtitleLangKey:"PrivacyAndSecurity.SensitiveDesc",noCheckboxSubtitle:!0});t.content.append(i.container),t.container.classList.remove("hide"),this.eventListener.addEventListener("destroy",()=>{const e=i.checkboxField.checked;e!==s&&ht.a.invokeApi("account.setContentSettings",{sensitive_enabled:e})},{once:!0})})),this.scrollable.append(t.container)}{const e=new dn({name:"FilterChats"}),t=()=>{new gt("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=Object(bt.a)([s],!0);Pi.a.clearAllDrafts().then(()=>{e()})},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},s=Object(U.a)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(s)("click",t),e.content.append(s),this.scrollable.append(e.container)}return Promise.all(e)}updateActiveSessions(){ht.a.invokeApi("account.getAuthorizations").then(e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,Object(x._i18n)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])})}}function ki(e,t,s,i=1){e/=255,t/=255,s/=255;const n=Math.max(e,t,s),a=Math.min(e,t,s);let o,r,l=(n+a)/2;if(n===a)o=r=0;else{let i=n-a;switch(r=l>.5?i/(2-n-a):i/(n+a),n){case e:o=(t-s)/i+(t1&&(s-=1),s<1/6?e+6*(t-e)*s:s<.5?t:s<2/3?e+(t-e)*(2/3-s)*6:e},r=s<.5?s*(1+t):s+t-s*t,l=2*s-r;n=i(l,r,e+1/3),a=i(l,r,e),o=i(l,r,e-1/3)}return[Math.round(255*n),Math.round(255*a),Math.round(255*o),Math.round(255*i)]}function Oi(e){const t=[];if(4===e.length)for(let s=1;s("0"+e.toString(16)).slice(-2)).join("")}function _i(e){return Ai(function(e){const t=e.slice(5,-1).split(", "),s=+t.pop(),i=t.map(e=>e.endsWith("%")?+e.slice(0,-1):+e);return xi(i[0],i[1],i[2],s)}(e))}function Fi(e){let{h:t,s:s,l:i}=ki(e[0],e[1],e[2]);s>0&&(s=Math.min(100,s+5+.1*(100-s))),i=Math.max(0,.65*i);return`hsla(${t}, ${s}%, ${i}%, .4)`}var Di=s(105);class ji{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(ji.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 _.b({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new _.b({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=ji.BASE_CLASS+"-inputs",t.append(this.hexInputField.container,this.rgbInputField.container),this.container.append(t),this.hexInputField.input.addEventListener("input",()=>{let e=this.hexInputField.value.replace(/#/g,"").slice(0,6);const t=e.match(/([a-fA-F\d]+)/),s=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(s?_.a.Neutral:_.a.Error),e="#"+e,this.hexInputField.setValueSilently(e),s&&this.setColor(e,!1,!0)});const s=/^(?:rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(?:\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(?:([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$/;this.rgbInputField.input.addEventListener("input",()=>{const e=this.rgbInputField.value.match(s);this.rgbInputField.setState(e?_.a.Neutral:_.a.Error),e&&this.setColor(ki(+e[1],+e[2],+e[3]),!0,!1)}),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){we(this.elements.box,()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()},e=>{this.saturationHandler(e.x,e.y)},()=>{this.onGrabEnd()})}attachHueListeners(){we(this.elements.hue,()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()},e=>{this.hueHandler(e.x)},()=>{this.onGrabEnd()})}setColor(e,t=!0,s=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=function(e){const t=Oi(e);return ki(t[0],t[1],t[2],t[3])}(e);else{const t=e.match(/[.?\d]+/g);e=ki(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const i=this.boxRect.width/100*e.s,n=100-e.l/(100-e.s/2)*100,a=this.boxRect.height/100*n;this.saturationHandler(this.boxRect.left+i,this.boxRect.top+a,!1),this.hueRect=this.elements.hue.getBoundingClientRect();const o=e.h/360,r=this.hueRect.left+this.hueRect.width*o;this.hueHandler(r,!1),this.hue=e.h,this.saturation=e.s,this.lightness=e.l,this.alpha=e.a,this.updatePicker(t,s)}getCurrentColor(){const e=xi(this.hue,this.saturation,this.lightness,this.alpha),t=Ai(e),s=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:s,hsla:`hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,rgba:`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`,hexa:t,rgbaArray:e}}updatePicker(e=!0,t=!0){const s=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",s.hex),e&&(this.hexInputField.setValueSilently(s.hex),this.hexInputField.setState(_.a.Neutral)),t&&(this.rgbInputField.setValueSilently(s.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(_.a.Neutral)),this.onChange&&this.onChange(s)}hueHandler(e,t=!0){const s=Object(I.a)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*s);const i=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*s+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",i),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",i),t&&this.updatePicker()}saturationHandler(e,t,s=!0){const i=this.boxRect.width,n=this.boxRect.height,a=Object(I.a)(e-this.boxRect.left,0,i)/i*100,o=Object(I.a)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const l=Object(I.a)(a,0,100),c=100-l/2,d=100-Object(I.a)(o,0,100),h=Object(I.a)(d/100*c,0,100);this.saturation=l,this.lightness=h,s&&this.updatePicker()}}ji.BASE_CLASS="color-picker";class Bi extends z{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=Oi(e),s=this.theme.background,i=Fi(t);s.color=e.toLowerCase(),s.type="color",s.highlightningColor=i,M.default.pushToState("settings",a.default.settings),er.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=a.default.getTheme();const e=new dn({});this.colorPicker=new ji,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=this.grid=document.createElement("div");t.classList.add("grid");["#E6EBEE","#B2CEE1","#008DD0","#C6E7CB","#C4E1A6","#60B16E","#CCD0AF","#A6A997","#7A7072","#FDD7AF","#FDB76E","#DD8851"].forEach(e=>{const s=document.createElement("div");s.classList.add("grid-item"),s.dataset.color=e.toLowerCase();const i=document.createElement("div");i.classList.add("grid-item-media"),i.style.backgroundColor=e,s.append(i),t.append(s)}),Object(l.b)(t,e=>{const t=Object(Me.a)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const s=t.dataset.color;s&&this.applyColor(s)},{listenerSetter:this.listenerSetter}),this.scrollable.append(t),this.applyColor=Object(Di.a)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.background,s="color"===t.type?this.grid.querySelector(`.grid-item[data-color="${t.color}"]`):null;e!==s&&(e&&e.classList.remove("active"),s&&s.classList.add("active"))}onOpen(){setTimeout(()=>{const e=this.theme.background;"color"===e.type&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(e.color||"#cccccc"),"color"!==e.type&&(this.colorPicker.onChange=this.onColorChange)},0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}let Ri=0;class Ui extends z{constructor(){super(...arguments),this.tempId=0,this.clicked=new Set,this.onUploadClick=()=>{Object(me.f)("image/x-png,image/png,image/jpeg").then(e=>{const t="wallpaper-upload-"+ ++Ri,s={_:"photoSize",h:0,w:0,location:{},size:e.size,type:"full"};let i={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[s],file_name:e.name};i=E.a.saveDoc(i);const n=he.a.getCacheContext(i);n.downloaded=e.size,n.url=URL.createObjectURL(e);let a={_:"wallPaper",access_hash:"",document:i,id:t,slug:t,pFlags:{}};const o=he.a.upload(e,e.name),r=Object(ae.a)();r.addNotifyListener=o.addNotifyListener,r.cancel=o.cancel,o.then(t=>{ht.a.invokeApi("account.uploadWallPaper",{file:t,mime_type:e.type,settings:{_:"wallPaperSettings"}}).then(e=>{const t=e.document,s=he.a.getCacheContext(t);Object.assign(s,n),a=e,a.document=E.a.saveDoc(a.document),c.dataset.docId=""+a.document.id,c.dataset.slug=a.slug,this.setBackgroundDocument(a.slug,a.document).then(r.resolve,r.reject)},r.reject)},r.reject),r.then(()=>{this.clicked.delete(a.document.id)},e=>{c.remove()});const l=new ye.a({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),c=this.addWallPaper(a,!1);this.clicked.add(a.document.id),l.attach(c,!1,r)})},this.onResetClick=()=>{const e=M.STATE_INIT.settings.themes.find(e=>e.name===this.theme.name);e&&(++this.tempId,this.theme.background=Object(w.a)(e.background),M.default.pushToState("settings",a.default.settings),er.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=Object(Me.a)(e.target,"grid-item");if(!t)return;const{docId:s,slug:i}=t.dataset;if(this.clicked.has(s))return;this.clicked.add(s);const n=new ye.a({cancelable:!0,tryAgainOnFail:!1}),a=E.a.getDoc(s),o=()=>{const e=this.setBackgroundDocument(i,a);he.a.getCacheContext(a).url&&!this.theme.background.blur||n.attach(t,!0,e)};n.construct(),Object(l.b)(t,e=>{n.preloader.parentElement?(n.onClick(e),n.detach()):o()},{listenerSetter:this.listenerSetter}),o()},this.saveToCache=(e,t)=>{fetch(t).then(t=>{he.a.cacheStorage.save("backgrounds/"+e,t)})},this.setBackgroundDocument=(e,t)=>{let s=++this.tempId;const i=()=>s===this.tempId,n=E.a.downloadDoc(t,er.chat.bubbles?er.chat.bubbles.lazyLoadQueue.queueId:0),o=Object(ae.a)();return o.addNotifyListener=n.addNotifyListener,o.cancel=n.cancel,n.then(()=>{if(!i())return void o.resolve();const s=this.theme.background,n=t=>{(e=>{const t=document.createElement("img");return new Promise(s=>{Object(rs.a)(t,e,()=>{const e=document.createElement("canvas"),i=t.naturalWidth/t.naturalHeight;1===i?(e.width=50,e.height=e.width/i):i>1?(e.height=50,e.width=e.height/i):e.width=e.height=50;const n=e.getContext("2d");n.drawImage(t,0,0,t.naturalWidth,t.naturalHeight,0,0,e.width,e.height);const a=new Array(4).fill(0),o=n.getImageData(0,0,e.width,e.height).data;for(let e=0;e{if(!i())return void o.resolve();const r=Fi(Array.from(n));s.slug=e,s.type="image",s.highlightningColor=r,M.default.pushToState("settings",a.default.settings),this.saveToCache(e,t),er.applyCurrentTheme(e,t).then(o.resolve)})},r=he.a.getCacheContext(t);s.blur?setTimeout(()=>{Object(bs.a)(r.url,12,4).then(e=>{i()?n(e):o.resolve()})},200):n(r.url)}),o},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.theme.background,s="image"===t.type?this.grid.querySelector(`.grid-item[data-slug="${t.slug}"]`):null;e!==s&&(e&&e.classList.remove("active"),s&&s.classList.add("active"))}}init(){this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground"),this.theme=a.default.getTheme();{const t=hn(this.scrollable),s=Object(U.a)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),i=Object(U.a)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),n=Object(U.a)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});Object(l.b)(s,this.onUploadClick,{listenerSetter:this.listenerSetter}),Object(l.b)(i,()=>{new Bi(this.slider).open()},{listenerSetter:this.listenerSetter}),Object(l.b)(n,this.onResetClick,{listenerSetter:this.listenerSetter});const o=this.blurCheckboxField=new mt.a({text:"ChatBackground.Blur",name:"blur",checked:this.theme.background.blur,withRipple:!0});this.listenerSetter.add(o.input)("change",()=>{this.theme.background.blur=o.input.checked,M.default.pushToState("settings",a.default.settings);const t=e.querySelector(".active");t&&setTimeout(()=>{this.setBackgroundDocument(t.dataset.slug,E.a.getDoc(t.dataset.docId))},100)}),t.append(s,i,n,o.label)}a.default.addEventListener("background_change",this.setActive),ht.a.invokeApiHashable("account.getWallPapers").then(e=>{e.wallpapers.forEach(e=>{this.addWallPaper(e)})});const e=this.grid=document.createElement("div");e.classList.add("grid"),Object(l.b)(e,this.onGridClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(e)}addWallPaper(e,t=!0){if(e.pFlags.pattern||!e.document||0===e.document.mime_type.indexOf("application/"))return;e.document=E.a.saveDoc(e.document);const s=document.createElement("div");s.classList.add("grid-item");const i=document.createElement("div");i.classList.add("grid-item-media");const n=Ls({photo:e.document,message:null,container:i,withoutPreloader:!0,size:r.a.choosePhotoSize(e.document,200,200)});return s.dataset.docId=""+e.document.id,s.dataset.slug=e.slug,"image"===this.theme.background.type&&this.theme.background.slug===e.slug&&s.classList.add("active"),(n.loadPromises.thumb||n.loadPromises.full).then(()=>{ls.a.mutate(()=>{s.append(i)})}),this.grid[t?"append":"prepend"](s),s}}var Hi=s(109);class Ni extends ut.b{constructor(e){super("popup-stickers",null,{closable:!0,overlayClosable:!0,body:!0}),this.stickerSetInput=e,this.onStickersClick=e=>{const t=Object(Me.a)(e.target,"sticker-set-sticker");if(!t)return;const s=t.dataset.docId;er.chat.input.sendMessageWithDocument(s)?this.hide():console.warn("got no doc by id:",s)},this.h6=document.createElement("h6"),this.h6.append(Object(x.i18n)("Loading")),this.header.append(this.h6),this.addEventListener("close",()=>{C.a.setOnlyOnePlayableGroup("")});const t=document.createElement("div");t.classList.add("sticker-set"),this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("sticker-set-stickers","is-loading"),Object(l.b)(this.stickersDiv,this.onStickersClick,{listenerSetter:this.listenerSetter}),Object(te.f)(this.stickersDiv,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer"),t.append(this.stickersDiv);const s=Object(U.a)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(s),this.body.append(t);new T.b(this.body);this.body.append(this.stickersFooter),this.loadStickerSet()}loadStickerSet(){return us.getStickerSet(this.stickerSetInput).then(e=>{let t;this.set=e.set,C.a.setOnlyOnePlayableGroup("STICKERS-POPUP"),this.h6.innerHTML=J.a.wrapEmojiText(e.set.title),this.stickersFooter.classList.toggle("add",!e.set.installed_date),e.set.installed_date?(t=Object(U.a)("btn-primary btn-primary-transparent danger",{noRipple:!0}),t.append(Object(x.i18n)("RemoveStickersCount",[Object(x.i18n)("Stickers",[e.set.count])]))):(t=Object(U.a)("btn-primary btn-color-primary",{noRipple:!0}),t.append(Object(x.i18n)("AddStickersCount",[Object(x.i18n)("Stickers",[e.set.count])]))),this.stickersFooter.textContent="",this.stickersFooter.append(t),Object(l.b)(t,()=>{const e=Object(bt.a)([t],!0);us.toggleStickerSet(this.set).then(()=>{this.hide()}).catch(()=>{e()})});const s=new ee.d;this.stickersDiv.classList.remove("is-loading"),this.stickersDiv.innerHTML="";for(let t of e.documents){if("documentEmpty"===t._)continue;const e=document.createElement("div");e.classList.add("sticker-set-sticker");const i=b.b.active.esgSticker.width;Cs({doc:t,div:e,lazyLoadQueue:s,group:"STICKERS-POPUP",play:!0,loop:!0,width:i,height:i}),this.stickersDiv.append(e)}})}}var zi=s(2);class Vi{constructor(e,t,s,i,n){const a="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(a);const o=document.createElement("div");o.classList.add(a+"-details");const r=document.createElement("div");r.classList.add(a+"-name"),Object(x._i18n)(r,e);const l=document.createElement("div");l.classList.add(a+"-value"),l.innerHTML=""+s,o.append(r,l),this.range=new Se({step:t,min:i,max:n},s),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),l.innerText=""+e}}),this.container.append(o,this.range.container)}}class Gi extends V{init(){this.container.classList.add("general-settings-container"),this.setTitle("General");const e=hn.bind(null,this.scrollable);{const t=e("Settings"),s=new Vi("TextSize",1,a.default.settings.messagesTextSize,12,20);s.onChange=e=>{M.default.setByKey("settings.messagesTextSize",e)};const i=Object(U.a)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"});Object(l.b)(i,()=>{new Ui(this.slider).open()});const n=new mt.a({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",withRipple:!0});t.append(s.container,i,n.label)}{const t=e("General.Keyboard"),s=document.createElement("form"),i="send-shortcut",n="settings.sendShortcut",a=new st({radioField:new ot({langKey:"General.SendShortcut.Enter",name:i,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new st({radioField:new ot({name:i,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});Object(x._i18n)(o.radioField.main,"General.SendShortcut.CtrlEnter",[re.IS_APPLE?"⌘":"Ctrl"]),s.append(a.container,o.container),t.append(s)}{const t=e("General.TimeFormat"),s=document.createElement("form"),i="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map(([e,t])=>new st({radioField:new ot({langKey:t,name:i,value:e,stateKey:n})})),r=function(e,t=!0){const s=e;let i;return t||(e=_e.a),function t(){e(),i=zi.a.setTimeout(t,1e3*(60-(new Date).getSeconds()))}(),e=s,()=>{clearTimeout(i)}}(()=>{const e=new Date;a.forEach(([t],s)=>{const i=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[s].subtitle.textContent=i})});this.eventListener.addEventListener("destroy",r),s.append(...o.map(e=>e.container)),t.append(s)}{const t=e("AutoDownloadMedia"),s=new mt.a({text:"AutodownloadContacts",name:"contacts",stateKey:"settings.autoDownload.contacts",withRipple:!0}),i=new mt.a({text:"AutodownloadPrivateChats",name:"private",stateKey:"settings.autoDownload.private",withRipple:!0}),n=new mt.a({text:"AutodownloadGroupChats",name:"groups",stateKey:"settings.autoDownload.groups",withRipple:!0}),a=new mt.a({text:"AutodownloadChannels",name:"channels",stateKey:"settings.autoDownload.channels",withRipple:!0});t.append(s.label,i.label,n.label,a.label)}{const t=e("General.AutoplayMedia"),s=new mt.a({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",withRipple:!0}),i=new mt.a({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",withRipple:!0});t.append(s.label,i.label)}{const t=e("Emoji"),s=new mt.a({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",withRipple:!0}),i=new mt.a({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",withRipple:!0});t.append(s.label,i.label)}{const t=e("Telegram.InstalledStickerPacksController"),s=new mt.a({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",withRipple:!0}),i=new mt.a({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",withRipple:!0}),n={},o=new ee.d,r=(e,s="append")=>{const i=new st({title:J.b.wrapEmojiText(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new Ni({id:e.id,access_hash:e.access_hash}).show()}});n[e.id]=i;const a=document.createElement("div");a.classList.add("row-media"),Is({set:e,container:a,group:"GENERAL-SETTINGS",lazyLoadQueue:o,width:48,height:48,autoplay:!0}),i.container.append(a),t[s](i.container)};us.getAllStickers().then(e=>{Object(Hi.a)(e);for(const t of e.sets)r(t)}),this.listenerSetter.add(a.default)("stickers_installed",e=>{const t=e;n[t.id]||r(t,"prepend")}),this.listenerSetter.add(a.default)("stickers_deleted",e=>{const t=e;n[t.id]&&(n[t.id].container.remove(),delete n[t.id])}),t.append(s.label,i.label)}}onOpen(){this.init&&(this.init(),this.init=null)}}var Ki=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Wi extends z{init(){return Ki(this,void 0,void 0,(function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const e=[];{const t=document.createElement("div");t.classList.add("input-wrapper"),this.firstNameInputField=new _.b({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new _.b({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new _.b({label:"EditProfile.BioLabel",name:"bio",maxLength:70}),t.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const s=document.createElement("div");s.classList.add("caption"),Object(x.i18n_)({element:s,key:"Bio.Description"}),e.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.scrollable.append(t,s)}this.scrollable.append(document.createElement("hr")),this.editPeer=new et({peerId:a.default.myId,inputFields:e,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),this.scrollable.prepend(this.editPeer.avatarEdit.container);{const t=document.createElement("div");t.classList.add("sidebar-left-h2"),Object(x.i18n_)({element:t,key:"EditAccount.Username"});const s=document.createElement("div");s.classList.add("input-wrapper"),this.usernameInputField=new pt({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange(),this.setProfileUrl()},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"}),s.append(this.usernameInputField.container);const i=document.createElement("div");i.classList.add("caption"),i.append(Object(x.i18n)("UsernameSettings.ChangeDescription")),i.append(document.createElement("br"),document.createElement("br"));const n=this.profileUrlContainer=document.createElement("div");n.classList.add("profile-url-container");const a=this.profileUrlAnchor=document.createElement("a");a.classList.add("profile-url"),a.href="#",a.target="_blank",n.append(Object(x.i18n)("UsernameHelpLink",[a])),i.append(n),e.push(this.usernameInputField),this.scrollable.append(t,s,i)}Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0;let e=[];e.push(n.default.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value).then(()=>{this.close()},e=>{console.error("updateProfile error:",e)})),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then(e=>n.default.uploadProfilePhoto(e))),this.usernameInputField.isValidToChange()&&e.push(P.a.updateUsername(this.usernameInputField.value)),Promise.race(e).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled")})},{listenerSetter:this.listenerSetter});const t=P.a.getSelf(),s=yield n.default.getProfile(t.id,!0);this.firstNameInputField.setOriginalValue(t.first_name,!0),this.lastNameInputField.setOriginalValue(t.last_name,!0),this.bioInputField.setOriginalValue(s.about,!0),this.usernameInputField.setOriginalValue(t.username,!0),this.setProfileUrl(),this.editPeer.handleChange()}))}setProfileUrl(){if(this.usernameInputField.input.classList.contains("error")||!this.usernameInputField.value.length)this.profileUrlContainer.style.display="none";else{this.profileUrlContainer.style.display="";let e="https://t.me/"+this.usernameInputField.value;this.profileUrlAnchor.innerText=e,this.profileUrlAnchor.href=e}}}var qi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Qi extends z{constructor(){super(...arguments),this.renderResults=e=>qi(this,void 0,void 0,(function*(){yield P.a.getContacts(),e.forEach(e=>{const{dom:t}=kr.addDialogNew({dialog:e,container:this.selector.scrollable,drawStatus:!1,rippleEnabled:!0,avatarSize:46}),s=this.selector.selected.has(e);t.containerEl.append(this.checkbox(s));const i=[];this.dialogsByFilters.forEach((t,s)=>{if(t.has(e)){const e=document.createElement("span");e.innerHTML=J.b.wrapEmojiText(s.title),i.push(e)}});Object(x.join)(i,!1).forEach(e=>{t.lastMessageSpan.append(e)})})})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(){return this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=H("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),this.confirmBtn.addEventListener("click",()=>{const e=this.selector.getSelected();if("included"===this.type)for(const e in this.filter.pFlags)0!==e.indexOf("exclude_")&&delete this.filter.pFlags[e];else for(const e in this.filter.pFlags)0===e.indexOf("exclude_")&&delete this.filter.pFlags[e];const t=[];for(const s of e)s.isPeerId()?t.push(s.toPeerId()):this.filter.pFlags[s]=!0;let s;s="included"===this.type?e=>t.includes(e):e=>!t.includes(e),Object(f.d)(this.filter.pinnedPeerIds,(e,t)=>{s(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))});const i="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";Object(f.d)(this.filter[i],(e,s)=>{t.includes(e)&&(this.filter[i].splice(s,1),this.filter[n].splice(s,1))}),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=t.map(e=>o.a.getInputPeerById(e)),this.editFolderTab.setFilter(this.filter,!1),this.close()}),this.dialogsByFilters=new Map,i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.dialogsByFilters.set(t,new Set(i.a.dialogsStorage.getFolderDialogs(t.id).map(e=>e.peerId)))})}checkbox(e){const t=new mt.a({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.init&&(this.init(),this.init=null),this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=document.createDocumentFragment(),s=new dn({noDelimiter:!0,name:"FilterChatTypes"});let i;s.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 n=document.createDocumentFragment();for(const e in i){const t=Object(U.a)("btn-primary btn-transparent folder-category-button",{icon:i[e].ico,text:i[e].text});t.dataset.peerId=e,t.append(this.checkbox()),n.append(t)}s.content.append(n);const a=new dn({name:"FilterChats"});t.append(s.container,a.container);const o=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new It({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search"}),this.selector.selected=new Set(o);let r=!1;const l=this.selector.add.bind(this.selector);this.selector.add=(e,t,s)=>{if(this.selector.selected.size>=100&&r&&!i[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);t&&setTimeout(()=>{t.checked=!1},0);return void lt(x.default.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0))}const n=l(e,i[e]?Object(x.i18n)(i[e].text):void 0,s);return i[e]&&n.querySelector("avatar-element").classList.add("tgico-"+i[e].ico),n};const c=this.selector.list.parentElement;a.content.append(this.selector.list),c.append(t),this.selector.addInitial(o),r=!0;for(const t in e.pFlags)i.hasOwnProperty(t)&&e.pFlags[t]&&s.content.querySelector(`[data-peer-id="${t}"]`).click()}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}open(e,t,s){return this.originalFilter=e,this.filter=Object(w.a)(this.originalFilter),this.type=t,this.editFolderTab=s,super.open()}}class $i extends z{constructor(){super(...arguments),this.flags={}}init(){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append(Object(x.i18n)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=H("check btn-confirm hide blue");const e={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new gt("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{e.element.setAttribute("disabled","true"),i.a.filtersStorage.updateDialogFilter(this.filter,!0).then(e=>{e&&this.close()}).finally(()=>{e.element.removeAttribute("disabled")})},isDanger:!0}]}).show()}};this.menuBtn=Ie({},"bottom-left",[e]),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const t=document.createElement("div");t.classList.add("input-wrapper"),this.nameInputField=new _.b({label:"FilterNameInputLabel",maxLength:12}),t.append(this.nameInputField.container);const s=(e,t,s,i)=>{const n=new dn({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),s.forEach(e=>{const t=Object(U.a)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(i[e.name]=t),a.append(t)}),n};this.includePeerIds=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,this.includePeerIds.container,this.excludePeerIds.container);const n=this.includePeerIds.container.querySelector(".folder-categories"),a=this.excludePeerIds.container.querySelector(".folder-categories");return n.querySelector(".btn").addEventListener("click",()=>{new Qi(this.slider).open(this.filter,"included",this)}),a.querySelector(".btn").addEventListener("click",()=>{new Qi(this.slider).open(this.filter,"excluded",this)}),this.confirmBtn.addEventListener("click",()=>{if(this.nameInputField.input.classList.contains("error"))return;if(!this.nameInputField.value.trim())return void this.nameInputField.input.classList.add("error");let e,t=Array.from(n.children).slice(1).reduce((e,t)=>e+ +!t.style.display,0);t+=this.filter.include_peers.length,t?(this.confirmBtn.setAttribute("disabled","true"),e=this.filter.id?i.a.filtersStorage.updateDialogFilter(this.filter):i.a.filtersStorage.createDialogFilter(this.filter),e.then(e=>{e&&this.close()}).catch(e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?lt("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)}).finally(()=>{this.confirmBtn.removeAttribute("disabled")})):lt("Please choose at least one chat for this folder.")}),this.nameInputField.input.addEventListener("input",()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()}),this.loadAnimationPromise=le.a.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_2").then(e=>(this.animation=e,le.a.waitForFirstFrame(e)))}onOpenAfterTimeout(){this.loadAnimationPromise.then(()=>{this.animation.autoplay=!0,this.animation.play()})}onCreateOpen(){this.caption.style.display="",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.caption.style.display="none",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=J.b.wrapDraftText(e.title);for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach(t=>{const s=this[t],i=kr.createChatList(),n=e[t].slice(),a=e=>{for(let t=0,s=Math.min(n.length,e);ta(20)),o.append(Object(x.i18n)("FilterShowMoreChats",[n.length])),e.append(o)}a(4)})}editCheckForChange(){if("edit"===this.type){const e=!Object(w.b)(this.originalFilter,this.filter);this.confirmBtn.classList.toggle("hide",!e),this.menuBtn.classList.toggle("hide",e)}}setFilter(e,t){Array.from(this.container.querySelectorAll("ul, .load-more")).forEach(e=>e.remove()),t?(this.originalFilter=e,this.filter=Object(w.a)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}open(e){const t=super.open();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.onCreateOpen()):(this.setFilter(e,!0),this.type="edit",this.onEditOpen()),t}}var Yi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Xi extends z{constructor(){super(...arguments),this.filtersRendered={}}renderFolder(e,t,s){let n,a,r="",c=[];if("dialogFilterSuggested"===e._)n=e.filter,r=e.description;else{if(n=e,1===Object.keys(n.pFlags).length){const e=n.pFlags;let t;e.contacts?t="FilterAllContacts":e.non_contacts?t="FilterAllNonContacts":e.groups?t="FilterAllGroups":e.broadcasts?t="FilterAllChannels":e.bots&&(t="FilterAllBots"),t&&c.push(Object(x.i18n)(t))}if(!c.length){const e=i.a.dialogsStorage.getFolderDialogs(n.id);let t=0,s=0,a=0;for(const i of e)o.a.isAnyGroup(i.peerId)?a++:o.a.isBroadcast(i.peerId)?s++:t++;t&&c.push(Object(x.i18n)("Chats",[t])),s&&c.push(Object(x.i18n)("Channels",[s])),a&&c.push(Object(x.i18n)("Groups",[a]))}}if(s)s.subtitle.textContent="",Object(x.join)(c).forEach(e=>{s.subtitle.append(e)});else if(s=new st({title:J.a.wrapEmojiText(n.title),subtitle:r,clickable:!0}),c.length&&Object(x.join)(c).forEach(e=>{s.subtitle.append(e)}),"dialogFilter"===e._){const e=n.id;this.filtersRendered.hasOwnProperty(n.id)||Object(l.b)(s.container,()=>{new $i(this.slider).open(i.a.filtersStorage.getFilter(e))},{listenerSetter:this.listenerSetter}),this.filtersRendered[n.id]=s}return a=s.container,n.hasOwnProperty("orderIndex")?As(a,a.parentElement||t,n.orderIndex):t&&t.append(a),a}init(){return Yi(this,void 0,void 0,(function*(){this.container.classList.add("chat-folders-container"),this.setTitle("ChatList.Filter.List.Title"),this.scrollable.container.classList.add("chat-folders"),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container");const e=document.createElement("div");e.classList.add("caption"),Object(x.i18n_)({element:e,key:"ChatList.Filter.Header"}),this.createFolderBtn=Object(U.a)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new dn({name:"Filters"}),this.foldersSection.container.style.display="none",this.suggestedSection=new dn({name:"FilterRecommended"}),this.suggestedSection.container.style.display="none",this.scrollable.append(this.stickerContainer,e,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),Object(l.b)(this.createFolderBtn,()=>{Object.keys(this.filtersRendered).length>=10?lt("Sorry, you can't create more folders."):new $i(this.slider).open()},{listenerSetter:this.listenerSetter});const t=()=>{this.foldersSection.container.style.display=Object.keys(this.filtersRendered).length?"":"none"};return i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.renderFolder(t,this.foldersSection.content);t()}),this.listenerSetter.add(a.default)("filter_update",e=>{this.filtersRendered.hasOwnProperty(e.id)?this.renderFolder(e,null,this.filtersRendered[e.id]):this.renderFolder(e,this.foldersSection.content),t(),this.getSuggestedFilters()}),this.listenerSetter.add(a.default)("filter_delete",e=>{this.filtersRendered.hasOwnProperty(e.id)&&(this.getSuggestedFilters(),this.filtersRendered[e.id].container.remove(),delete this.filtersRendered[e.id]),t()}),this.listenerSetter.add(a.default)("filter_order",e=>{e.forEach((e,t)=>{const s=this.filtersRendered[e].container;As(s,s.parentElement,t+1)})}),this.loadAnimationPromise=le.a.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_1").then(e=>(this.animation=e,le.a.waitForFirstFrame(e))),this.getSuggestedFilters(),this.loadAnimationPromise}))}onOpenAfterTimeout(){this.loadAnimationPromise.then(()=>{this.animation.autoplay=!0,this.animation.play()})}getSuggestedFilters(){return ht.a.invokeApi("messages.getSuggestedDialogFilters").then(e=>{this.suggestedSection.container.style.display=e.length?"":"none",Array.from(this.suggestedSection.content.children).slice(1).forEach(e=>e.remove()),e.forEach(e=>{const t=this.renderFolder(e),s=Object(U.a)("btn-primary btn-color-primary",{text:"Add"});t.append(s),this.suggestedSection.content.append(t),Object(l.b)(s,n=>{if(Object(c.a)(n),Object.keys(this.filtersRendered).length>=10)return void lt("Sorry, you can't create more folders.");s.setAttribute("disabled","true");const a=e.filter;a.includePeerIds=[],a.excludePeerIds=[],a.pinnedPeerIds=[],i.a.filtersStorage.createDialogFilter(a,!0).then(e=>{e&&t.remove()}).finally(()=>{s.removeAttribute("disabled")})},{listenerSetter:this.listenerSetter})})})}}class Ji extends V{init(){this.container.classList.add("notifications-container"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new dn({name:e.name}),s=new st({checkboxField:new mt.a({text:e.typeText,checked:!0}),subtitleLangKey:"Loading"}),i=new st({checkboxField:new mt.a({text:"Notifications.MessagePreview",checked:!0}),subtitleLangKey:"Loading"});t.content.append(s.container,i.container),this.scrollable.append(t.container);const n={_:e.inputKey},o=Dt.a.getNotifySettings(n);(o instanceof Promise?o:Promise.resolve(o)).then(t=>{const o=()=>{const e=Dt.a.isMuted(t);return s.checkboxField.checked=!e,i.checkboxField.checked=t.show_previews,e};o(),this.eventListener.addEventListener("destroy",()=>{const e=!s.checkboxField.checked,a=i.checkboxField.checked;if(e===Dt.a.isMuted(t)&&a===t.show_previews)return;const o=Object(w.a)(t);o._="inputPeerNotifySettings",o.mute_until=e?2147483647:0,o.show_previews=a,Dt.a.updateNotifySettings(n,o)},{once:!0}),this.listenerSetter.add(a.default)("notify_settings",s=>{const i=Object(Y.c)(s.peer._);e.inputKey===i&&(t=s.notify_settings,o())})})};e({name:"NotificationsPrivateChats",typeText:"NotificationsForPrivateChats",inputKey:"inputNotifyUsers"}),e({name:"NotificationsGroups",typeText:"NotificationsForGroups",inputKey:"inputNotifyChats"}),e({name:"NotificationsChannels",typeText:"NotificationsForChannels",inputKey:"inputNotifyBroadcasts"});{const e=new dn({name:"NotificationsOther"}),t=new st({checkboxField:new mt.a({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading"}),s=new st({checkboxField:new mt.a({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound"}),subtitleLangKey:"Loading"});M.default.getState().then(e=>{s.checkboxField.checked=e.settings.notifications.sound}),e.content.append(t.container,s.container),this.scrollable.append(e.container),Dt.a.getContactSignUpNotification().then(e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",()=>{const s=t.checkboxField.checked;e!==s&&Dt.a.setContactSignUpNotification(!s)},{once:!0})})}}}var Zi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class en extends z{init(){return Zi(this,void 0,void 0,(function*(){this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const e=new dn({}),t=new Map,s=ht.a.invokeApiCacheable("langpack.getLanguages",{lang_pack:"macos"}).then(s=>{const i=Object(at.b)();s.forEach(e=>{const s=new st({radioField:new ot({text:e.name,name:i,value:e.lang_code}),subtitle:e.native_name});t.set(e.lang_code,s)});const n=it([...t.values()],e=>{x.default.getLangPack(e)});x.default.getCacheLangPack().then(e=>{const s=t.get(e.lang_code);s?s.radioField.setValueSilently(!0):console.error("no row",s,e)}),e.content.append(n)});return this.scrollable.append(e.container),s}))}}class tn extends z{constructor(){super(...arguments),this.buttons={}}init(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=Ie({},"bottom-left",[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new gt("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{ht.a.logOut()},isDanger:!0}]}).show()}}]);this.header.append(e),this.avatarElem=new ur,this.avatarElem.setAttribute("clickable",""),this.avatarElem.classList.add("profile-avatar","avatar-120"),this.nameDiv=document.createElement("div"),this.nameDiv.classList.add("profile-name"),this.phoneDiv=document.createElement("div"),this.phoneDiv.classList.add("profile-subtitle");const t=document.createElement("div");t.classList.add("profile-buttons");const s="profile-button btn-primary btn-transparent";t.append(this.buttons.edit=Object(U.a)(s,{icon:"edit",text:"EditAccount.Title"})),t.append(this.buttons.folders=Object(U.a)(s,{icon:"folder",text:"AccountSettings.Filters"})),t.append(this.buttons.general=Object(U.a)(s,{icon:"settings",text:"Telegram.GeneralSettingsViewController"})),t.append(this.buttons.notifications=Object(U.a)(s,{icon:"unmute",text:"AccountSettings.Notifications"})),t.append(this.buttons.privacy=Object(U.a)(s,{icon:"lock",text:"AccountSettings.PrivacyAndSecurity"})),t.append(this.buttons.language=Object(U.a)(s,{icon:"language",text:"AccountSettings.Language"})),this.scrollable.append(this.avatarElem,this.nameDiv,this.phoneDiv,t),this.scrollable.container.classList.add("profile-content-wrapper"),this.buttons.edit.addEventListener("click",()=>{new Wi(this.slider).open()}),this.buttons.folders.addEventListener("click",()=>{new Xi(this.slider).open()}),this.buttons.general.addEventListener("click",()=>{new Gi(this.slider).open()}),this.buttons.notifications.addEventListener("click",()=>{new Ji(this.slider).open()}),this.buttons.privacy.addEventListener("click",()=>{new Ti(this.slider).open()}),this.buttons.language.addEventListener("click",()=>{new en(this.slider).open()}),le.a.loadLottieWorkers(),this.fillElements()}fillElements(){const e=P.a.getSelf(),t=e.id.toPeerId(!1);this.avatarElem.setAttribute("peer",""+t),this.nameDiv.append(new Lt.a({peerId:t}).element),this.phoneDiv.innerHTML=e.phone?P.a.formatUserPhone(e.phone):""}}class sn extends z{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new q(e=>{this.uploadAvatar=e});const e=document.createElement("div");e.classList.add("input-wrapper"),this.channelNameInputField=new _.b({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new _.b({label:"DescriptionOptionalPlaceholder",maxLength:255}),e.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const t=()=>{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",t),this.channelDescriptionInputField.input.addEventListener("input",t);const s=document.createElement("div");s.classList.add("caption"),Object(x._i18n)(s,"Channel.DescriptionHolderDescrpiton"),this.nextBtn=Q({icon:"arrow_next"}),this.nextBtn.addEventListener("click",()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,K.a.createChannel(e,t).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{K.a.editPhoto(e,t)}),mn.removeTabFromHistory(this),new Bt(this.slider).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>K.a.inviteToChannel(e,t)})})}),this.content.append(this.nextBtn),this.scrollable.append(this.avatarEdit.container,e,s)}onCloseAfterTimeout(){return this.avatarEdit.clear(),this.uploadAvatar=null,this.channelNameInputField.value="",this.channelDescriptionInputField.value="",this.nextBtn.disabled=!1,super.onCloseAfterTimeout()}}var nn=s(125);class an extends ut.b{constructor(){super("popup-create-contact popup-send-photo popup-new-media",null,{closable:!0,withConfirm:"Add"}),Object(x._i18n)(this.title,"AddContactTitle"),Object(l.b)(this.btnConfirm,()=>{const e=P.a.importContact(s.value,i.value,n.value);e.then(()=>{this.hide()},e=>{"NO_USER"===e.type&&(ct({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),c.disabled=!1)}),c.lockWithPromise(e)},{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const s=new _.b({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),i=new _.b({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new nn.a({required:!0});e.push(s,i,n);const a=()=>{const e=s.value+" "+i.value;c.avatarElem.setAttribute("peer-title",e),c.avatarElem.update()};this.listenerSetter.add(s.input)("input",a),this.listenerSetter.add(i.input)("input",a);const o=P.a.getSelf(),r=Object(Us.a)(o.phone);r&&(n.validate=()=>!!n.value.match(/\d/),n.value="+"+r.code.country_code);const c=new et({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(s.container,i.container,c.avatarElem),this.container.append(t,n.container),this.show()}}class on extends z{init(){this.container.id="contacts-container";const e=Q({icon:"add",className:"is-visible"});this.content.append(e),Object(l.b)(e,()=>{new an},{listenerSetter:this.listenerSetter}),this.inputSearch=new F("Search",e=>{this.openContacts(e)}),this.listenerSetter.add(a.default)("contacts_update",e=>{const t=P.a.isContact(e),s=e.toPeerId();t?this.sortedUserList.add(s):this.sortedUserList.delete(s)}),this.title.replaceWith(this.inputSearch.container),this.middleware=Object(xs.a)()}createList(){const e=new Ds,t=e.list;return t.id="contacts",t.classList.add("contacts-container"),kr.setListClickListener(t,()=>{this.close()},void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!re.IS_MOBILE&&di(!0)&&this.inputSearch.input.focus()}openContacts(e){this.init&&(this.init(),this.init=null),this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",P.a.getContactsPeerIds(e,void 0,"online").then(e=>{if(!t())return;const s=this.sortedUserList=this.createList();let i=()=>{const t=Et.a.height/72*1.25|0;e.splice(0,t).forEach(e=>{s.add(e)}),e.length||(i=void 0,this.scrollable.onScrolledBottom=null)};i(),this.scrollable.onScrolledBottom=()=>{i?i():this.scrollable.onScrolledBottom=null},Object(k.a)(this.scrollable.container,s.list)})}open(){return this.openContacts(),super.open()}}class rn extends z{init(){if(this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),!kr.sortedLists[rn.filterId]){const e=kr.createChatList();kr.generateScrollable(e,rn.filterId).container.append(e),kr.setListClickListener(e,null,!0)}const e=kr.scrollables[rn.filterId];this.scrollable.container.replaceWith(e.container),this.scrollable=e}onOpen(){this.init&&(this.init(),this.init=null),this.wasFilterId=kr.filterId,kr.setFilterId(rn.filterId),kr.onTabChange()}onOpenAfterTimeout(){kr.sortedLists[this.wasFilterId].clear()}onClose(){kr.setFilterId(this.wasFilterId),kr.onTabChange()}onCloseAfterTimeout(){return kr.sortedLists[rn.filterId].clear(),super.onCloseAfterTimeout()}}rn.filterId=1;var ln=s(8),cn=s(67);class dn{constructor(e){if(this.container=document.createElement("div"),this.container.classList.add("sidebar-left-section"),e.fakeGradientDelimiter)this.container.append(pn()),this.container.classList.add("with-fake-delimiter");else if(e.noDelimiter)this.container.classList.add("no-delimiter");else{const e=document.createElement("hr");this.container.append(e)}this.content=this.generateContentElement(),e.name&&(this.title=document.createElement("div"),this.title.classList.add("sidebar-left-h2","sidebar-left-section-name"),Object(x.i18n_)({element:this.title,key:e.name}),this.content.append(this.title)),e.caption&&(this.caption=this.generateContentElement(),this.caption.classList.add("sidebar-left-section-caption"),!0!==e.caption&&Object(x.i18n_)({element:this.caption,key:e.caption}))}generateContentElement(){const e=document.createElement("div");return e.classList.add("sidebar-left-section-content"),this.container.append(e),e}}const hn=(e,t,s)=>{const i=new dn({name:t,caption:s});return e.append(i.container),i.content},pn=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e},un=new class extends G{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={},this.inputSearch=new F("Search");const e=this.sidebarEl.querySelector(".item-main .sidebar-header");e.append(this.inputSearch.container);const t=()=>{new on(this).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const s={icon:"archive",text:"ArchivedChats",onClick:()=>{new rn(this).open()},verify:()=>!!i.a.dialogsStorage.getFolderDialogs(1,!1).length||!i.a.dialogsStorage.isDialogsLoaded(1)},n=new mt.a({toggle:!0,checked:"night"===a.default.getTheme().name});n.input.addEventListener("change",()=>{a.default.settings.theme=n.input.checked?"night":"day",M.default.pushToState("settings",a.default.settings),a.default.dispatchEvent("theme_change")}),a.default.addEventListener("theme_change",()=>{n.setValueSilently("night"===a.default.getTheme().name)});const o=[{icon:"saved",text:"SavedMessages",onClick:()=>{setTimeout(()=>{er.setPeer(er.myId)},0)}},s,{icon:"user",text:"Contacts",onClick:t},{icon:"settings",text:"Settings",onClick:()=>{new tn(this).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:n},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new mt.a({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{er.openUsername("TelegramTips")}},{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([cn.a.set({kz_version:"Z"}),cn.a.delete("tgme_sync")]).then(()=>{location.href="https://web.telegram.org/z/"})},verify:()=>ln.a.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{cn.a.delete("tgme_sync").then(()=>{location.href="https://web.telegram.org/?legacy=1"})},verify:()=>ln.a.isMainDomain}];this.toolsBtn=Ie({},"bottom-right",o,e=>{o.forEach(e=>{e.verify&&e.element.classList.toggle("hide",!e.verify())})}),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn);const r=this.toolsBtn.querySelector(".btn-menu"),c=document.createElement("a");c.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",c.target="_blank",c.rel="noopener noreferrer",c.classList.add("btn-menu-footer"),c.addEventListener(l.a,e=>{e.stopPropagation(),Object(te.c)()});const d=document.createElement("span");d.classList.add("btn-menu-footer-text"),d.innerHTML="Telegram Web"+ln.a.suffix+" alpha "+ln.a.versionFull,c.append(d),r.classList.add("has-footer"),r.append(c),this.newBtnMenu=Ie({},"top-left",[{icon:"newchannel",text:"NewChannel",onClick:()=>{new sn(this).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{new Bt(this).open({type:"chat",skippable:!1,takeOut:e=>{new $(this).open(e)},title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:t}]),this.newBtnMenu.className="btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon",this.newBtnMenu.insertAdjacentHTML("afterbegin",'\n \n \n '),this.newBtnMenu.id="new-menu",e.nextElementSibling.append(this.newBtnMenu),this.inputSearch.input.addEventListener("focus",()=>this.initSearch(),{once:!0}),this.archivedCount=document.createElement("span"),this.archivedCount.className="archived-count badge badge-24 badge-gray",s.element.append(this.archivedCount),a.default.addEventListener("folder_unread",e=>{if(1===e.id){const t=e.unreadDialogsCount;this.archivedCount.innerText=""+Object(I.c)(t,1),this.archivedCount.classList.toggle("hide",!t)}}),P.a.getTopPeers("correspondents"),M.default.getState().then(e=>{const t=e.recentSearch||[];for(let e=0,s=t.length;e{this.backBtn.click()};this.searchGroups={contacts:new O("Search.Chats","contacts",void 0,void 0,void 0,void 0,s),globalContacts:new O("Search.Global","contacts",void 0,void 0,void 0,void 0,s),messages:new O("Search.Messages","messages"),people:new O(!1,"contacts",!0,"search-group-people",!0,!1,s),recent:new O("Recent","contacts",!0,"search-group-recent",!0,!0,s)};const n=this.searchSuper=new ei({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"FilterChats",type:"chats"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:t,searchGroups:this.searchGroups,asChatList:!0,hideEmptyTabs:!1,showSender:!0});e.prepend(n.nav.parentElement.parentElement),t.container.append(n.container);n.setQuery({peerId:"".toPeerId(),folderId:0}),n.selectTab(0),n.load(!0);let a=[],o="".toPeerId(),r=0,l=0;const c=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===a.length),this.inputSearch.container.classList.toggle("is-picked",!!a.length),a.length?this.inputSearch.input.style.setProperty("--paddingLeft",a[a.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},d=document.createElement("div");d.classList.add("search-helper"),d.addEventListener("click",e=>{const t=Object(Me.a)(e.target,"selector-user");if(!t)return;const s=t.dataset.key;if(0===s.indexOf("date_")){const[e,t,i]=s.split("_");r=+t,l=+i}else o=s.toPeerId();t.addEventListener("click",()=>{p(t)}),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),a.push(t),c()}),n.nav.parentElement.append(d);const h=(e,t)=>{const s=document.createElement("div");s.classList.add("selector-user");const i=document.createElement("avatar-element");return i.classList.add("selector-user-avatar","tgico"),i.setAttribute("dialog","1"),i.classList.add("avatar-30"),s.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new Lt.a({peerId:e.toPeerId()}).element),i.setAttribute("peer",""+e)):i.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?s.innerHTML=t:(Object(k.a)(s,t),s.append(t))),s.insertAdjacentElement("afterbegin",i),s},p=e=>{0===e.dataset.key.indexOf("date_")?r=l=0:o="".toPeerId(),e.remove(),Object(f.e)(a,e),setTimeout(()=>{c(),this.inputSearch.onChange(this.inputSearch.value)},0)};this.inputSearch.onClear=()=>{a.forEach(e=>{p(e)})},this.inputSearch.onChange=e=>{if(n.cleanupHTML(),n.setQuery({peerId:o,folderId:o?void 0:0,query:e,minDate:r,maxDate:l}),n.load(!0),d.innerHTML="",n.nav.classList.remove("hide"),!o&&e.trim()){const t=n.middleware.get();Promise.all([i.a.getConversations(e).promise.then(({dialogs:e})=>e.map(e=>e.peerId)),P.a.getContactsPeerIds(e,!0)]).then(e=>{if(!t())return;new Set(e[0].concat(e[1])).forEach(e=>{d.append(h(e))}),n.nav.classList.toggle("hide",!!d.innerHTML)})}if(!r&&e.trim()){const t=[];Object(oe.b)(e,t),t.forEach(e=>{d.append(h("date_"+e.minDate+"_"+e.maxDate,e.title))}),n.nav.classList.toggle("hide",!!d.innerHTML)}},n.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",e=>{const t=Object(ft.a)(e.target,"LI");if(!t)return;const s=Object(Me.a)(t,"search-group");if(!s||s.classList.contains("search-group-recent")||s.classList.contains("search-group-people"))return;const i=t.getAttribute("data-peer-id").toPeerId();M.default.getState().then(e=>{const t=e.recentSearch||[];if(t[0]!==i){Object(f.e)(t,i),t.unshift(i),t.length>20&&(t.length=20),M.default.pushToState("recentSearch",t);for(const e of t)M.default.requestPeer(e,"recentSearch")}})},{capture:!0});let u=document.createElement("div");u.classList.add("search-group-scrollable"),u.append(this.searchGroups.people.list),this.searchGroups.people.container.append(u);new T.a(u);let m,g=!0;const b=Object(D.a)(e.parentElement,"zoom-fade",150,e=>{m&&clearTimeout(m),0!==e||g||(n.selectTab(0,!1),this.inputSearch.onClearClick(),m=window.setTimeout(()=>{m=0,this.newBtnMenu.classList.remove("is-hidden")},150)),g=!1});b(0);const v=()=>{this.toolsBtn.classList.remove("is-visible"),this.backBtn.classList.add("is-visible"),this.newBtnMenu.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0),re.IS_MOBILE_SAFARI||j.a.findItemByType("global-search")||j.a.pushItem({onPop:()=>{s()},type:"global-search"}),b(1)};this.inputSearch.input.addEventListener("focus",v),v(),this.backBtn.addEventListener("click",e=>{this.toolsBtn.classList.add("is-visible"),this.backBtn.classList.remove("is-visible"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),j.a.removeByType("global-search"),b(0)});const y=document.createElement("button");y.classList.add("btn-icon","tgico-close"),this.searchGroups.recent.nameEl.append(y),y.addEventListener("click",()=>{this.searchGroups.recent.clear(),M.default.pushToState("recentSearch",[])})}};de.a.appSidebarLeft=un;var mn=un;class gn{constructor(e){this.chat=e,this.bubbles=[],this.detailsMap=new Map,this.groups=[],this.newGroupDiff=121}removeBubble(e){const t=this.detailsMap.get(e);t&&(t.group.length&&(t.group.findAndSplice(t=>t.bubble===e),t.group.length?this.updateGroup(t.group):Object(f.e)(this.groups,t.group)),this.detailsMap.delete(e))}changeBubbleMid(e,t){const s=this.detailsMap.get(e);s&&(s.mid=t)}addBubble(e,t,s){const i=t.date,n=t.mid;let o,r=t.viaBotId||t.fromId;r===a.default.myId&&t.peerId===a.default.myId&&t.fwdFromId===r&&(r=r.toPeerId(!0)),this.removeBubble(e);const l={bubble:e,mid:n,timestamp:i};if(this.bubbles.length){let e,t=-1;for(let e=0;es.mid)break}if(-1!==t&&(e=this.bubbles[t]),e){o=e.group;let t=0,s=0;for(;tt.mid===e);t&&this.updateGroup(t.group)}cleanup(){this.bubbles=[],this.groups=[],this.detailsMap.clear()}}class bn extends ut.b{constructor(e,t,s={}){if(super("popup-date-picker",s.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],Object.assign({body:!0,overlayClosable:!0},s)),this.onPick=t,this.options=s,this.onPrevClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()-1),this.setMonth(),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.nextBtn.removeAttribute("disabled")},this.onNextClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()+1),this.setMonth(),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),this.prevBtn.removeAttribute("disabled")},this.onDateClick=e=>{const t=e.target;if(!t.dataset.timestamp)return;if(this.selectedEl){if(this.selectedEl===t)return;this.selectedEl.classList.remove("active")}this.selectedEl=t,t.classList.add("active");const s=+t.dataset.timestamp;this.selectedDate=new Date(s),this.setTitle(),this.setTimeTitle()},this.minDate=s.minDate||new Date("2013-08-01T00:00:00"),e{const n=""+e;this.listenerSetter.add(t.input)("input",a=>{let o=t.value.replace(/\D/g,"");o.length>2?o=o.slice(0,2):(1===o.length&&+o[0]>+n[0]||2===o.length&&+o>e)&&(2===o.length&&i&&i(+o[1]),o="0"+o[0]),t.setValueSilently(o),s(o.length)})};this.hoursInputField=new _.b({plainText:!0}),this.minutesInputField=new _.b({plainText:!0}),s(23,this.hoursInputField,e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()},e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)}),s(59,this.minutesInputField,e=>{e||this.hoursInputField.input.focus(),this.setTimeTitle()}),this.selectedDate=e,e.setMinutes(e.getMinutes()+10),this.hoursInputField.setValueSilently(("0"+e.getHours()).slice(-2)),this.minutesInputField.setValueSilently(("0"+e.getMinutes()).slice(-2)),e.setHours(0,0,0,0),this.timeDiv.append(this.hoursInputField.container,t,this.minutesInputField.container),Object(l.b)(this.btnConfirm,()=>{this.onPick&&(this.selectedDate.setHours(+this.hoursInputField.value||0,+this.minutesInputField.value||0,0,0),this.onPick(this.selectedDate.getTime()/1e3|0)),this.hide()},{listenerSetter:this.listenerSetter}),this.body.append(this.timeDiv),this.prevBtn.classList.add("primary"),this.nextBtn.classList.add("primary")}const i=document.createElement("div");i.classList.add("popup-centerer"),i.append(this.container),this.element.append(i),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=s.maxDate||new Date,this.maxDate.setHours(0,0,0,0),this.selectedMonth=new Date(this.selectedDate),this.selectedMonth.setDate(1),this.maxMonth=new Date(this.maxDate),this.maxMonth.setDate(1),this.minMonth=new Date(this.minDate),this.minMonth.setHours(0,0,0,0),this.minMonth.setDate(1),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),s.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e,t=[];const s=new Date;s.setHours(0,0,0,0);const i={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===s.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const i={month:"short",day:"numeric"};n.getFullYear()!==s.getFullYear()&&(i.year="numeric"),t.push(new x.default.IntlDateElement({date:n,options:i}).element)}t.push(new x.default.IntlDateElement({date:n,options:i}).element),this.btnConfirm.firstChild.replaceWith(Object(x.i18n)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new x.default.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const s=document.createElement("button");return s.classList.add("btn-icon","date-picker-month-date"),e&&s.setAttribute("disabled","true"),t&&s.append(t),s}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&b.b.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new x.default.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const s=new Date,i=s.getDay();1!==i&&s.setHours(-24*(i-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new x.default.IntlDateElement({date:s,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),s.setDate(s.getDate()+1)}let n=e.getDay()-1;-1===n&&(n=6);const a=new Date(e.getTime());a.setDate(a.getDate()-n-1);for(let e=0;ethis.maxDate||e{for(const t of e){const e=t.boundingClientRect,s=t.target.parentElement,i=t.rootBounds;e.bottom=i.top&&e.bottom{let t=e.filter(e=>e.boundingClientRect.top<0).sort((e,t)=>e.boundingClientRect.top-t.boundingClientRect.top)[0];if(!t)return;let s=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,s)},{root:this.container})}addSentinel(e,t){const s=document.createElement("div");return s.classList.add("sticky_sentinel",t),e.appendChild(s)}observeStickyHeaderChanges(e){const t=this.addSentinel(e,"sticky_sentinel--top");this.headersObserver.observe(t),this.elementsObserver.observe(e)}disconnect(){this.headersObserver.disconnect(),this.elementsObserver.disconnect()}unobserve(e,t){this.elementsObserver.unobserve(e),this.headersObserver.unobserve(t)}}a.default.addEventListener("replies_updated",e=>{const t=e;Array.from(document.querySelectorAll(`replies-element[data-post-key="${t.peerId}_${t.mid}"]`)).forEach(e=>{e.message=t,e.render()})});class fn extends HTMLElement{constructor(){super(),this.updated=!1}init(){this.render(),this.dataset.postKey=this.message.peerId+"_"+this.message.mid,this.classList.add("replies","replies-"+this.type)}render(){const e=this.message.replies;if("footer"===this.type){let t,s;if(this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),t||(t=document.createElement("div"),t.classList.add("replies-footer-avatars")),e.recent_repliers.slice().reverse().forEach((e,s)=>{let i=t.children[s];i||(i=new ur,i.setAttribute("dialog","0"),i.classList.add("avatar-30"),i.lazyLoadQueue=this.lazyLoadQueue,this.loadPromises&&(i.loadPromises=this.loadPromises)),i.setAttribute("peer",""+o.a.getPeerId(e)),i.parentNode||t.append(i)}),Array.from(t.children).slice(e.recent_repliers.length).forEach(e=>e.remove())):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.append(t),s=e?e.replies?Object(x.i18n)("Comments",[e.replies]):Object(x.i18n)("LeaveAComment"):Object(x.i18n)("ViewInChat"),e){const t=i.a.getHistoryStorage(e.channel_id.toPeerId(!0));let s=!1;e.replies&&(s=void 0!==e.read_max_id&&void 0!==e.max_id?e.read_max_id${(null==e?void 0:e.replies)?Object(I.c)(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(i.a.subscribeRepliesThread(this.message.peerId,this.message.mid),i.a.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define("replies-element",fn);const yn=()=>{const e=document.createElement("i");return e.classList.add("edited"),Object(x._i18n)(e,"EditedMessage"),e};var wn,Sn;(Sn=wn||(wn={})).setTime=(e,t,s,i,n)=>{var a;const o=new Date(1e3*t.date),r=[];let l,c=Object(oe.e)(o);if(t.views){const e=t.post_author||(null===(a=t.fwd_from)||void 0===a?void 0:a.post_author);s.classList.add("channel-post");const i=document.createElement("span");i.classList.add("post-views"),i.innerHTML=Object(I.c)(t.views,1);const n=document.createElement("i");if(n.classList.add("tgico-channelviews","time-icon"),r.push(i,n),e){const t=document.createElement("span");t.innerHTML=J.b.wrapEmojiText(e)+", ",r.push(t)}}if(t.edit_date&&"scheduled"!==e.type&&!t.pFlags.edit_hide&&(s.classList.add("is-edited"),r.unshift(l=yn())),"pinned"!==e.type&&t.pFlags.pinned){s.classList.add("is-pinned");const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),r.unshift(e)}r.push(c);const d=Object(oe.f)(o)+(t.edit_date?"\nEdited: "+Object(oe.f)(new Date(1e3*t.edit_date)):"")+(t.fwd_from?"\nOriginal: "+Object(oe.f)(new Date(1e3*t.fwd_from.date)):""),h=document.createElement("span");h.classList.add("time","tgico"),h.title=d,h.append(...r);const p=document.createElement("div");p.classList.add("inner","tgico"),p.title=d;let u=r;return l&&(u[u.indexOf(l)]=yn()),u=u.map(e=>e instanceof HTMLElement&&!e.classList.contains("i18n")?e.cloneNode(!0):e),u[u.length-1]=Object(oe.e)(o),p.append(...u),h.append(p),n.append(h),h},Sn.renderReplies=({bubble:e,bubbleContainer:t,message:s,messageDiv:i,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new fn;return r.message=s,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},Sn.setReply=({chat:e,bubble:t,bubbleContainer:s,message:i})=>{const n=!s;n&&(s=t.querySelector(".bubble-content"));const a=n?s.querySelector(".reply"):null;if(!i.reply_to_mid)return a&&a.remove(),void t.classList.remove("is-reply");const o=i.reply_to.reply_to_peer_id?e.appPeersManager.getPeerId(i.reply_to.reply_to_peer_id):e.peerId;let r,l=e.appMessagesManager.getMessageByPeer(o,i.reply_to_mid);"messageEmpty"===l._?(e.appMessagesManager.wrapSingleMessage(o,i.reply_to_mid),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:i.reply_to_mid,mid:i.mid}),r=Object(x.i18n)("Loading")):r=new Lt.a({peerId:l.fromId||l.fwdFromId,dialog:!1,onlyFirstName:!1,plainText:!1}).element;const c=Ms(r,void 0,l);a?a.replaceWith(c):s.append(c),t.classList.add("is-reply")};var Ln=s(128);function En(e,t,s){const i=e.getBoundingClientRect(),n="center"===s?Math.ceil(i.left+(i.right-i.left)/2+1):Math.ceil(i.left+1),a="bottom"===t?Math.floor(i.top+i.height-1):Math.ceil(i.top+1);return document.elementFromPoint(n,a)}function Cn(e){e.style.display="none",e.offsetLeft,e.style.display=""}de.a.getElementByPoint=En;var In=s(82),Mn=s(150),Pn=s(114),Tn=s(80);const kn={keywords:{},version:0,langCode:ln.a.langPackCode};class xn{constructor(){this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={}}getEmojiKeywords(e=ln.a.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const s="emojiKeywords_"+e;return this.getKeywordsPromises[e]=Tn.a.get(s).then(t=>(Object(Mn.a)(t)||(t={}),Object(w.k)(kn,t),t.langCode=e,this.keywordLangPacks[e]=t,ht.a.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then(e=>{t.version=e.version;const i=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return x.default.lastRequestedLangCode!==ln.a.langPackCode&&e.push(this.getEmojiKeywords(x.default.lastRequestedLangCode)),this.recent||e.push(this.getRecentEmojis()),Promise.all(e)}indexEmojis(){this.index||(this.index=new Pn.a(void 0,2));for(const e in this.keywordLangPacks){if(this.indexedLangPacks[e])continue;const t=this.keywordLangPacks[e].keywords;for(const e in t){const s=t[e];this.index.indexObject(s,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const s=this.index.search(e);t=Array.from(s).reduce((e,t)=>e.concat(t),[])}else t=this.recent.concat(xn.POPULAR_EMOJI).slice(0,36);return t=Array.from(new Set(t)),t}getRecentEmojis(){return this.getRecentEmojisPromise?this.getRecentEmojisPromise:this.getRecentEmojisPromise=M.default.getState().then(e=>this.recent=Array.isArray(e.recentEmoji)?e.recentEmoji:[])}pushRecentEmoji(e){e=J.b.fixEmoji(e),this.getRecentEmojis().then(t=>{Object(f.e)(t,e),t.unshift(e),t.length>36&&(t.length=36),M.default.pushToState("recentEmoji",t),a.default.dispatchEvent("emoji_recent",e)})}}xn.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];const On=new xn;de.a&&(de.a.appEmojiManager=On);var An=On,_n=s(133),Fn=s(10);const Dn=new Set;function jn(e,t,s=!1,i=!1){const n=document.createElement("span");let o;if(n.classList.add("super-emoji"),i&&!Fn.a?o=J.a.wrapSingleEmoji(e):(e=J.a.fixEmoji(e),o=J.a.wrapEmojiText(e)),n.innerHTML=o,n.children.length>1){const e=n.firstElementChild;n.innerHTML="",n.append(e)}if(n.firstElementChild&&!Fn.a){const e=n.firstElementChild,t=e.src;if(!Dn.has(t)){e.setAttribute("loading","lazy");const s=document.createElement("span");s.classList.add("emoji-placeholder"),a.default.settings.animationsEnabled&&(e.style.opacity="0",s.style.opacity="1"),e.addEventListener("load",()=>{Object(De.b)(()=>{a.default.settings.animationsEnabled&&(e.style.opacity="",s.style.opacity=""),n.classList.remove("empty"),Dn.add(t)})},{once:!0}),n.append(s)}}s?t.prepend(n):t.appendChild(n)}function Bn(e){return Object(Me.a)(e,"super-emoji")?3===e.nodeType?e.nodeValue:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),e.getAttribute("alt")||e.innerText):""}class Rn{constructor(){this.closeScrollTop=0,this.onContentClick=e=>{Object(c.a)(e);const t=Bn(e.target);t&&(er.chat.input.onEmojiSelected(t,!1),ue.IS_TOUCH_SUPPORTED&&Object(Ks.a)())}}init(){this.content=document.getElementById("content-emoji");const e=["Emoji.SmilesAndPeople","Emoji.AnimalsAndNature","Emoji.FoodAndDrink","Emoji.TravelAndPlaces","Emoji.ActivityAndSport","Emoji.Objects","Emoji.Flags","Skin Tones"],t={},s=new Map([["Emoji.Recent",[]]]);for(const t in _n.a.Emoji){const i=""+_n.a.Emoji[t],n=e[+i[0]-1];if(!n)continue;let a=s.get(n);a||(a=[],s.set(n,a)),a[+i.slice(1)||0]=t}s.delete(e.pop()),s.forEach((e,s)=>{const i=document.createElement("div");i.classList.add("emoji-category");const n=document.createElement("div");n.classList.add("category-title"),n.append(Object(x.i18n)(s));const a=document.createElement("div");a.classList.add("super-emojis"),i.append(n,a),e.forEach(e=>{jn(Object(ie.a)(e),a,!1)}),t[s]=i});const i=this.menu=this.content.previousElementSibling,n=this.scroll=new T.b(this.content,"EMOJI"),o=Object(te.f)(this.content,!0);Promise.all([Object(In.a)(200),An.getRecentEmojis().then(e=>{const t=!!e.length,s=t?0:1;this.menu.children[0].classList.toggle("hide",!t),this.menu.children[s].classList.add("active");const a=sa.menuOnClick(i,n,void 0,s);return this.stickyIntersector=a.stickyIntersector,this.setMenuActive=a.setActive,e})]).then(([s,i])=>{o.remove(),this.recentItemsDiv=t["Emoji.Recent"].querySelector(".super-emojis");for(const e of i)jn(e,this.recentItemsDiv);this.recentItemsDiv.parentElement.classList.toggle("hide",!this.recentItemsDiv.childElementCount),e.unshift("Emoji.Recent"),e.map(e=>{const s=t[e];return s||console.error("no div by category:",e),n.container.append(s),this.stickyIntersector.observeStickyHeaderChanges(s),s})}),this.content.addEventListener("click",this.onContentClick),this.init=null,a.default.addEventListener("emoji_recent",e=>{const t=Array.from(this.recentItemsDiv.children);for(let s=0,i=t.length;s{this.closeScrollTop=this.scroll.scrollTop})}onClose(){}}var Un=s(122),Hn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Nn{constructor(e,t,s,i=!0){this.element=e,this.group=t,this.scrollable=s,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=Object(ae.a)(),this.timeout=window.setTimeout(()=>{this.timeout=0,this.scrollPromise.resolve()},150)},this.processInvisibleDiv=e=>this.scrollPromise.then(()=>Hn(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),s=e.querySelector("img");if(s&&(s&&s.classList.remove("hide"),yield Object(De.a)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t){t.remove(),t.src="",t.load();C.a.getAnimations(t).forEach(e=>{C.a.checkAnimation(e,!0,!0)})}}))),this.lazyLoadQueue=new ee.c(void 0,(e,t)=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)}),i&&this.attach()}attach(){this.scrollable.container.addEventListener("scroll",this.onScroll)}detach(){this.clear(),this.scrollable.container.removeEventListener("scroll",this.onScroll)}clear(){this.lazyLoadQueue.clear()}processVisibleDiv(e){if(e.querySelector("video"))return;this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId,s=E.a.getDoc(t);return this.scrollPromise.then(()=>{const t=ws({doc:s,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0}).loadPromise;return t.finally(()=>{const t=e.querySelector("video");e.style.opacity="";const s=e.querySelector("img");s&&s.classList.add("hide"),t&&!t.parentElement&&setTimeout(()=>{t.src="",t.load();C.a.getAnimations(t).forEach(e=>{C.a.checkAnimation(e,!0,!0)})},0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)}),t})}})}add(e,t=this.element){var s;let i=e.w,n=e.h;n<100&&(i*=100/n,n=100);const a=Math.min(300,400,i),o=Object(Un.a)(i,n,a,100),r=document.createElement("div");r.classList.add("gif","fade-in-transition"),r.style.width=o.width+"px",r.style.opacity="0",r.dataset.docId=""+e.id,t.append(r),this.lazyLoadQueue.observe(r);const l=E.a.getThumb(e,!1);let c;!!l&&(c=new Image,c.classList.add("media-poster"),l.cacheContext.url||l.promise.then(()=>{c.src=l.cacheContext.url}));const d=()=>{c&&(r.append(c),r.style.opacity="")};(null===(s=null==l?void 0:l.cacheContext)||void 0===s?void 0:s.url)?Object(rs.a)(c,l.cacheContext.url,d):d()}}class zn{init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;e.addEventListener("click",sa.onMediaClick);const t=new T.b(this.content,"GIFS"),s=new Nn(e,ta,t),i=Object(te.f)(this.content,!0);ht.a.invokeApi("messages.getSavedGifs",{hash:"0"}).then(e=>{"messages.savedGifs"===e._&&e.gifs.forEach((t,i)=>{e.gifs[i]=t=E.a.saveDoc(t),s.add(t)}),i.remove()}),na.addLazyLoadQueueRepeat(s.lazyLoadQueue,s.processInvisibleDiv),this.init=null}onClose(){}}var Vn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Gn{constructor(e,t){this.regularLazyLoadQueue=e,this.group=t,this.animatedDivs=new Set,this.checkAnimationContainer=(e,t)=>{C.a.getAnimations(e).forEach(e=>{t?C.a.checkAnimation(e,!1):C.a.checkAnimation(e,!0,!0)})},this.processVisibleDiv=e=>{const t=e.dataset.docId,s=E.a.getDoc(t),i=b.b.active.esgSticker.width,n=Cs({doc:s,div:e,width:i,height:i,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0});return n.then(()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))}),n},this.processInvisibleDiv=e=>{const t=e.dataset.docId,s=E.a.getDoc(t);this.checkAnimationContainer(e,!1),e.innerHTML="",this.renderSticker(s,e)},this.lazyLoadQueue=new ee.b(void 0,(e,t)=>{t||this.processInvisibleDiv(e)})}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,s){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),2===e.sticker&&this.observeAnimatedDiv(t)),Cs({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:2===e.sticker,loadPromises:s}),t}observeAnimatedDiv(e){this.animatedDivs.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisibleDiv})}}class Kn{constructor(){this.stickerSets={},this.recentStickers=[],this.mounted=!1,this.queueCategoryPush=[]}categoryPush(e,t="",s,i){const n=document.createElement("div");n.classList.add("category-items","super-stickers");const a=document.createElement("div");return a.classList.add("category-title"),t&&(a.innerHTML=t),e.append(a,n),this.stickyIntersector.observeStickyHeaderChanges(e),this.queueCategoryPush.push({element:e,prepend:i}),s.then(e=>{e.forEach(e=>{n.append(this.superStickerRenderer.renderSticker(e))}),this.queueCategoryPush.length&&(this.queueCategoryPush.forEach(({element:e,prepend:t})=>{t?this.recentDiv.parentElement?(this.stickersDiv.prepend(e),this.stickersDiv.prepend(this.recentDiv)):this.stickersDiv.prepend(e):this.stickersDiv.append(e)}),this.queueCategoryPush.length=0)}),{titleDiv:a}}renderStickerSet(e,t=!1){return Vn(this,void 0,void 0,(function*(){const s=document.createElement("div");s.classList.add("sticker-category"),s.dataset.id=""+e.id,s.dataset.access_hash=""+e.access_hash;const i=document.createElement("button");i.classList.add("btn-icon","menu-horizontal-div-item"),this.stickerSets[e.id]={stickers:s,tab:i},t?this.menu.insertBefore(i,this.menu.firstElementChild.nextSibling):this.menu.append(i);const n=us.getStickerSet(e);this.categoryPush(s,J.a.wrapEmojiText(e.title),n.then(e=>e.documents),t);yield n;Is({set:e,container:i,group:ta,lazyLoadQueue:sa.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){this.content=document.getElementById("content-stickers"),this.recentDiv=document.createElement("div"),this.recentDiv.classList.add("sticker-category","stickers-recent");let e=this.content.previousElementSibling;this.menu=e.firstElementChild;let t=new T.a(e);this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("stickers-categories"),this.content.append(this.stickersDiv),a.default.addEventListener("stickers_installed",e=>{const t=e;!this.stickerSets[t.id]&&this.mounted&&this.renderStickerSet(t,!0)}),a.default.addEventListener("stickers_deleted",e=>{const t=e;if(this.stickerSets[t.id]&&this.mounted){const e=this.stickerSets[t.id];e.stickers.remove(),e.tab.remove(),delete this.stickerSets[t.id]}}),this.stickersDiv.addEventListener("click",e=>{const t=e.target;if(Object(Me.a)(t,"category-title")){const e=Object(St.a)(t,"data-id");new Ni({id:e.dataset.id,access_hash:e.dataset.access_hash}).show()}else sa.onMediaClick(e)});const s=(e=!1)=>{a.default.dispatchEvent("choosing_sticker",!e)};this.scroll=new T.b(this.content,"STICKERS"),this.scroll.setVirtualContainer(this.stickersDiv),this.scroll.onAdditionalScroll=()=>{s()},na.addEventListener("closed",()=>{s(!0)}),na.addEventListener("opened",()=>{s()}),this.stickyIntersector=sa.menuOnClick(this.menu,this.scroll,t).stickyIntersector;const i=Object(te.f)(this.content,!0);Promise.all([us.getRecentStickers().then(e=>{this.recentStickers=e.stickers.slice(0,20),this.stickerSets.recent={stickers:this.recentDiv,tab:this.menu.firstElementChild},i.remove();const{titleDiv:t}=this.categoryPush(this.recentDiv,"",Promise.resolve(this.recentStickers),!0);t.append(Object(x.i18n)("Stickers.Recent"))}),us.getAllStickers().then(e=>{i.remove();for(let t of e.sets)this.renderStickerSet(t)})]).finally(()=>{this.mounted=!0,s()}),this.superStickerRenderer=new Gn(sa.lazyLoadQueue,ta),na.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue,this.superStickerRenderer.processInvisibleDiv),this.init=null}pushRecentSticker(e){var t;if(us.pushRecentSticker(e),!(null===(t=this.recentDiv)||void 0===t?void 0:t.parentElement))return;let s=this.recentDiv.querySelector(`[data-doc-id="${e.id}"]`);s||(s=this.superStickerRenderer.renderSticker(e));const i=this.recentDiv.querySelector(".category-items");i.prepend(s),i.childElementCount>20&&Array.from(i.children).slice(20).forEach(e=>e.remove())}onClose(){}}var Wn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const qn=new class{constructor(){this.inlineResults={},this.setHash={}}getGeoInput(e){return"geoPoint"===e._?{_:"inputGeoPoint",lat:e.lat,long:e.long,accuracy_radius:e.accuracy_radius}:{_:"inputGeoPointEmpty"}}getInlineResults(e,t,s="",i="",n){return ht.a.invokeApi("messages.getInlineBotResults",{bot:P.a.getUserInput(t),peer:o.a.getInputPeerById(e),query:s,geo_point:n?this.getGeoInput(n):void 0,offset:i},{stopTime:-1,noErrorBox:!0}).then(e=>{const t=e.query_id;return e.results.forEach(e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=E.a.saveDoc(e.document)),e.photo&&(e.photo=r.a.savePhoto(e.photo))),this.inlineResults[this.generateQId(t,e.id)]=e}),e})}generateQId(e,t){return e+"_"+t}pushPopularBot(e){P.a.getTopPeers("bots_inline").then(t=>{const s=e.toPeerId(),i=t.findIndex(e=>e.id===s);let n;n=-1!==i?t[i]:{id:s,rating:0},++n.rating,Object(f.f)(t,n,"rating"),M.default.setKeyValueToStorage("topPeersCache")})}switchToPM(e,t,s){return this.setHash[t]={peerId:e,time:Date.now()},a.default.dispatchEvent("history_focus",{peerId:t.toPeerId()}),i.a.startBot(t,void 0,s)}checkSwitchReturn(e){return Wn(this,void 0,void 0,(function*(){const t=P.a.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const s=this.setHash[e];return s&&(delete this.setHash[e],Date.now()-s.time<36e5)?s.peerId:void 0}))}switchInlineQuery(e,t,s,i){a.default.dispatchEvent("history_focus",{peerId:e,threadId:t}),Pi.a.setDraft(e,t,"@"+P.a.getUser(s).username+" "+i)}callbackButtonClick(e,t,s){return ht.a.invokeApi("messages.getBotCallbackAnswer",{peer:o.a.getInputPeerById(e),msg_id:v.a.getServerMessageId(t),data:s.data},{stopTime:-1,noErrorBox:!0}).then(e=>{"string"==typeof e.message&&e.message.length&<(J.a.wrapRichText(e.message,{noLinks:!0,noLinebreaks:!0}))})}sendInlineResult(e,t,s,n={}){var a;const o=this.inlineResults[s];if(!o)return;this.pushPopularBot(t);const l=s.split("_"),c=l.shift(),d=l.join("_");if(n.viaBotId=t,n.queryId=c,n.resultId=d,o.send_message.reply_markup&&(n.replyMarkup=o.send_message.reply_markup),"botInlineMessageText"===o.send_message._)n.entities=o.send_message.entities,i.a.sendText(e,o.send_message.message,n);else{let t,s="";const l=o.send_message;switch(l._){case"botInlineMessageMediaAuto":if(s=l.message,"botInlineMediaResult"===o._){const{document:e,photo:s}=o;t=e?E.a.getMediaInput(e):r.a.getMediaInput(s)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(l.geo)},n.geoPoint=l.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(l.geo),title:l.title,address:l.address,provider:l.provider,venue_id:l.venue_id,venue_type:l.venue_type},n.geoPoint=l.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:l.phone_number,first_name:l.first_name,last_name:l.last_name,vcard:l.vcard}}t||(t={_:"messageMediaPending",type:o.type,file_name:o.title||(null===(a=o.content)||void 0===a?void 0:a.url)||o.url,size:0,progress:{percent:30,total:0}}),i.a.sendOther(e,t,n)}}};de.a&&(de.a.appInlineBotsManager=qn);var Qn=qn,$n=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Yn extends z{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>{const t=Object(Me.a)(e.target,"gif");if(!t)return;const s=t.dataset.docId;er.chat.input.sendMessageWithDocument(s)?b.b.isMobile&&Yt.onCloseBtnClick():console.warn("got no doc by id:",s)}}init(){this.container.id="search-gifs-container",this.inputSearch=new F("SearchGifsTitle",e=>{this.reset(),this.search(e)}),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),Object(l.b)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new Nn(this.gifsDiv,"GIFS-SEARCH",this.scrollable)}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",C.a.checkAnimations(void 0,"GIFS-SEARCH"),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}open(){const e=super.open();return Yt.toggleSidebar(!0).then(()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}),e}search(e,t=!0){return $n(this,void 0,void 0,(function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield P.a.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=Qn.getInlineResults(Be.b,this.gifBotPeerId,e,this.nextOffset);const{results:s,next_offset:i}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=i,t&&(this.gifsDiv.innerHTML=""),s.length?s.forEach(e=>{"botInlineMediaResult"===e._&&e.document&&this.masonry.add(e.document)}):this.loadedAll=!0,this.scrollable.onScroll()}catch(e){throw this.searchPromise=null,console.error("gifs loading error:",e),e}}}))}}class Xn extends z{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new ee.d,this.inputSearch=new F("StickersTab.SearchPlaceholder",e=>{this.search(e)}),this.title.replaceWith(this.inputSearch.container),this.setsDiv=document.createElement("div"),this.setsDiv.classList.add("sticker-sets"),this.scrollable.append(this.setsDiv),Object(l.b)(this.setsDiv,e=>{const t=Object(Me.a)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void er.chat.input.sendMessageWithDocument(e)}const s=Object(Me.a)(e.target,"sticker-set");if(!s)return;const i=s.dataset.stickerSet,n=s.dataset.access_hash,a=Object(Me.a)(e.target,"sticker-set-button");a?(e.preventDefault(),e.cancelBubble=!0,a.setAttribute("disabled","true"),us.getStickerSet({id:i,access_hash:n}).then(e=>{us.toggleStickerSet(e.set).then(t=>{t&&(a.textContent="",a.append(Object(x.i18n)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),a.classList.toggle("gray",!!e.set.installed_date))}).finally(()=>{a.removeAttribute("disabled")})})):us.getStickerSet({id:i,access_hash:n}).then(e=>{new Ni(e.set).show()})},{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",C.a.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const s=document.createElement("div");s.classList.add("sticker-set-header");const i=document.createElement("div");i.classList.add("sticker-set-details"),i.innerHTML=`\n
${J.a.wrapEmojiText(e.title)}
\n `;const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append(Object(x.i18n)("Stickers",[e.count])),i.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append(Object(x.i18n)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),s.append(i,a);const o=document.createElement("div");o.classList.add("sticker-set-stickers");const r=Math.min(5,e.count);for(let e=0;e{for(let t=0;t{this.renderFeatured()}),e}renderFeatured(){return us.getFeaturedStickers().then(e=>{this.inputSearch.value||(e=this.filterRendered("",e)).forEach(e=>{this.renderSet(e.set)})})}filterRendered(e,t){t=t.slice();const s=Array.from(this.setsDiv.children);return Object(f.d)(s,s=>{const i=s.dataset.stickerSet,n=t.findIndex(e=>e.set.id===i);-1!==n?t.splice(n,1):e&&s.dataset.title.toLowerCase().includes(e.toLowerCase())||s.remove()}),C.a.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?us.searchStickerSets(e,!1).then(t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach(e=>{this.renderSet(e.set)})}):this.renderFeatured()}}var Jn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Zn extends B.a{constructor(e){super(!1),this.forceClose=!1,this.inited=!1,this.onMouseOut=e=>{if(clearTimeout(this.displayTimeout),!this.isActive())return;const t=e.toElement;t&&Object(qs.a)(t,this.element)||(this.displayTimeout=window.setTimeout(()=>{this.toggle(!1)},200))},this.toggle=e=>Jn(this,void 0,void 0,(function*(){const t=!!this.element.style.display&&void 0===e||e;if(this.init){if(!t)return;this.init(),this.init=null}if(t!==this.isActive())if(this.element.style.display&&void 0===e||e){const e=this.dispatchEvent("open");yield Promise.all(e),this.element.style.display="",this.element.offsetLeft,this.element.classList.add("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.forceClose=!1,this.dispatchEvent("opened")},ue.IS_TOUCH_SUPPORTED?0:200)}else this.dispatchEvent("close"),this.element.classList.remove("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")},ue.IS_TOUCH_SUPPORTED?0:200)})),Object(w.g)(this,e)}attachButtonListener(e,t){let s=!0;ue.IS_TOUCH_SUPPORTED?Object(l.b)(e,()=>{s?(s=!1,this.toggle(!0)):this.toggle()},{listenerSetter:t}):t.add(e)("mouseover",i=>{s&&(t.add(e)("mouseout",this.onMouseOut),s=!1),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.toggle(!0)},200)})}init(){ue.IS_TOUCH_SUPPORTED||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||clearTimeout(this.displayTimeout)})}isActive(){return this.element.classList.contains("active")}}var ea=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const ta="emoticons-dropdown";class sa extends Zn{constructor(){super({element:document.getElementById("emoji-dropdown")}),this.tabId=-1,this.onSelectTabClick=e=>{this.tabId!==e&&(C.a.checkAnimations(!0,ta),this.tabId=e,this.searchButton.classList.toggle("hide",0===this.tabId),this.deleteBtn.classList.toggle("hide",0!==this.tabId))},this.checkRights=()=>{const{peerId:e,threadId:t}=er.chat,s=this.tabsEl.children,n=Array.from(s),a=i.a.canSendToPeer(e,t,"send_stickers");n[2].toggleAttribute("disabled",!a);const o=i.a.canSendToPeer(e,t,"send_gifs");n[3].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||1===Object(Os.a)(r)||a&&o||this.selectTab(0,!1)},this.addEventListener("open",()=>ea(this,void 0,void 0,(function*(){ue.IS_TOUCH_SUPPORTED&&Object(Ks.a)()&&(yield Object(In.a)(100)),this.element.parentElement!==er.chat.input.chatInput&&er.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),sa.lazyLoadQueue.lock(),C.a.lockIntersectionGroup(ta)}))),this.addEventListener("opened",()=>{C.a.unlockIntersectionGroup(ta),sa.lazyLoadQueue.unlock(),sa.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover")}),this.addEventListener("close",()=>{sa.lazyLoadQueue.lock(),C.a.lockIntersectionGroup(ta),C.a.checkAnimations(!0,ta)}),this.addEventListener("closed",()=>{C.a.unlockIntersectionGroup(ta),sa.lazyLoadQueue.unlock(),sa.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover"),this.savedRange=void 0})}init(){this.emojiTab=new Rn,this.stickersTab=new Kn,this.gifsTab=new zn,this.tabs={0:this.emojiTab,1:this.stickersTab,2:this.gifsTab},this.container=this.element.querySelector(".emoji-container .tabs-container"),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=Object(Z.a)(this.tabsEl,this.container,this.onSelectTabClick,()=>{const e=this.tabs[this.tabId];e.init&&e.init(),e.onCloseAfterTimeout&&e.onCloseAfterTimeout(),C.a.checkAnimations(!1,ta)}),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",()=>{1===this.tabId?Yt.isTabExists(Xn)||new Xn(Yt).open():Yt.isTabExists(Yn)||new Yn(Yt).open()}),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),this.deleteBtn.addEventListener("click",e=>{var t;const s=er.chat.input.messageInput;(null===(t=s.lastChild)||void 0===t?void 0:t.tagName)?s.lastElementChild.remove():s.lastChild&&(s.lastChild.textContent.length?s.lastChild.textContent=s.lastChild.textContent.slice(0,-1):s.lastChild.remove());const i=new Event("input",{bubbles:!0,cancelable:!0});er.chat.input.messageInput.dispatchEvent(i),Object(c.a)(e)});const e=re.IS_APPLE_MOBILE,t=e?1:0;return e&&this.tabsEl.children[1].classList.add("hide"),this.tabsEl.children[t+1].click(),this.tabs[t].init&&this.tabs[t].init(),a.default.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",()=>{e.lock()}),this.addEventListener("closed",()=>{const s=e.intersector.getVisible();for(const e of s)t(e);e.intersector.clearVisible()}),this.addEventListener("opened",()=>{e.unlockAndRefresh()})}getSavedRange(){return this.getGoodRange()||this.savedRange}getGoodRange(){const e=document.getSelection();if(e.rangeCount&&document.activeElement===er.chat.input.messageInput)return e.getRangeAt(0)}}sa.lazyLoadQueue=new ee.d,sa.menuOnClick=(e,t,s,i=0)=>{let n=-1;const a=t=>t!==i&&(e.children[i].classList.remove("active"),e.children[t].classList.add("active"),i=t,!0),o=new vn(t.container,(i,o)=>{if(Math.abs(n-t.container.scrollTop)<=1)return;n=-1;const r=Object(Os.a)(o);!i&&r||(a(r),s&&(r{let s=e.target;if(s=Object(Me.a)(s,"menu-horizontal-div-item"),!s)return;const i=Object(Os.a)(s);if(!a(i))return;const o=(t.splitUp||t.container).children[i].offsetTop+1;t.container.scrollTop=n=o}),{stickyIntersector:o,setActive:a}},sa.onMediaClick=(e,t=!1)=>{let s=e.target;if(s=Object(ft.a)(s,"DIV"),!s)return!1;const i=s.dataset.docId;return!!i&&(er.chat.input.sendMessageWithDocument(i,void 0,t)?(ia.container&&(ia.forceClose=!0,ia.container.classList.add("disable-hover"),ia.toggle(!1)),!0):(console.warn("got no doc by id:",i),!1))};const ia=new sa;de.a.emoticonsDropdown=ia;var na=ia;var aa=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const oa=new Set(["messageActionHistoryClear","messageActionChatCreate"]);let ra=void 0,la=0;class ca{constructor(e,t,s,i,n,o,r,l,d,h){if(this.chat=e,this.appMessagesManager=t,this.appStickersManager=s,this.appUsersManager=i,this.appInlineBotsManager=n,this.appPhotosManager=o,this.appPeersManager=r,this.appProfileManager=l,this.appDraftsManager=d,this.appMessagesIdsManager=h,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.loadedTopTimes=0,this.loadedBottomTimes=0,this.messagesQueuePromise=null,this.messagesQueue=[],this.messagesQueueOnRender=null,this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middleware=Object(xs.a)(),this.replyFollowHistory=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.onBubblesClick=e=>{var t;let s=e.target,i=null;try{i=Object(Me.a)(s,"bubble")}catch(e){}if(!i)return;if(i.classList.contains("is-date")&&Object(Me.a)(s,"bubble-content")){if(i.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages){if(this.dateMessages[e].div===i){new bn(new Date(+e),this.onDatePick).show();break}}return}if(!ue.IS_TOUCH_SUPPORTED&&Object(Me.a)(s,"time"))return void this.chat.selection.toggleByElement(i);if(this.chat.selection.isSelecting&&e.isTrusted){if(i.classList.contains("service")&&void 0===i.dataset.mid)return;return Object(c.a)(e),ue.IS_TOUCH_SUPPORTED&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement(Object(Me.a)(s,"grouped-item")||i)}const n=Object(Me.a)(s,"contact");if(n)return void this.chat.appImManager.setInnerPeer(n.dataset.peerId.toPeerId());if(Object(Me.a)(s,"replies")){const e=+i.dataset.mid;if(this.peerId===Be.c){const t=this.chat.getMessage(e),s=this.appPeersManager.getPeerId(t.reply_to.reply_to_peer_id),i=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread(s,n,i)}else{const t=this.appMessagesManager.filterMessages(this.chat.getMessage(e),e=>!!e.replies)[0],s=t.replies;s&&this.appMessagesManager.getDiscussionMessage(this.peerId,t.mid).then(e=>{this.chat.appImManager.setInnerPeer(s.channel_id.toPeerId(!0),void 0,"discussion",e.mid)})}return}const a=Object(Me.a)(s,"is-via");if(a){const t=a.querySelector(".peer-title");if(s===t||Object(qs.a)(s,t)){const s=t.innerText+" ";return this.appDraftsManager.setDraft(this.peerId,this.chat.threadId,s),void Object(c.a)(e)}}const o=Object(Me.a)(s,"peer-title")||Object(ft.a)(s,"AVATAR-ELEMENT")||Object(St.a)(s,"data-saved-from");if(o&&o!==i){s=o||s;const e=s.dataset.peerId||s.getAttribute("peer"),t=s.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,s]=t.split("_");this.chat.appImManager.setInnerPeer(e.toPeerId(),+s)}else{const t=e.toPeerId();t!==Be.b?this.chat.appImManager.setInnerPeer(t):lt(x.default.format("HidAccount",!0))}return}if(i.classList.contains("sticker")&&s.parentElement.classList.contains("attachment")){const e=+i.dataset.mid,s=null===(t=this.chat.getMessage(e).media)||void 0===t?void 0:t.document;return void((null==s?void 0:s.stickerSetInput)&&new Ni(s.stickerSetInput).show())}const r=Object(Me.a)(s,"document-with-thumb");if("IMG"===s.tagName&&!s.classList.contains("emoji")&&!s.classList.contains("document-thumb")||s.classList.contains("album-item")||"VIDEO"===s.tagName&&!i.classList.contains("round")||r&&!r.querySelector(".preloader-container")){const t=+(Object(Me.a)(s,"album-item")||Object(Me.a)(s,"document-container")||i).dataset.mid,n=this.chat.getMessage(t);if(!n)return void this.log.warn("no message by messageId:",t);const a="webpage",o=i.classList.contains(a),l=r?e=>nr.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),d=[],h=o?[t]:Object.keys(this.bubbles).map(e=>+e).filter(e=>{const t=this.chat.getMessage(e),s=this.appMessagesManager.getMediaFromMessage(t);return s&&l(s)}).sort((e,t)=>e-t);h.forEach(e=>{let t;if(r)t=".document-container";else{t=".album-item video, .album-item img, .preview video, .preview img, ",t+=this.bubbles[e].classList.contains("with-media-tail")?".bubble__media-container":".attachment video, .attachment img"}const s=Array.from(this.bubbles[e].querySelectorAll(t)),i=new Set;if(r)s.forEach(e=>{d.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})});else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");s.forEach(s=>{if(t&&!Object(Me.a)(s,"media-container-aspecter"))return;let n=Object(Me.a)(s,"album-item");const a=n||s.parentElement;i.has(a)||(i.add(a),d.push({element:s,mid:n?+n.dataset.mid:e,peerId:this.peerId}))})}}),d.sort((e,t)=>e.mid-t.mid);let p=d.findIndex(e=>e.mid===t);return de.b&&this.log("open mediaViewer single with ids:",h,p,d),d[p]?((new nr).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:r?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!o,isScheduled:"scheduled"===this.chat.type}).openMedia(n,d[p].element,0,!0,d.slice(0,p),d.slice(p+1)),void Object(c.a)(e)):void this.log("no target for media viewer!",s)}if(-1===["IMG","DIV","SPAN"].indexOf(s.tagName)&&(s=Object(ft.a)(s,"DIV")),-1!==["DIV","SPAN"].indexOf(s.tagName)){if(s.classList.contains("goto-original")){const e=i.dataset.savedFrom,[t,s]=e.split("_");return void this.chat.appImManager.setInnerPeer(t.toPeerId(),+s)}if(s.classList.contains("forward")){const e=+i.dataset.mid,t=this.appMessagesManager.getMessageByPeer(this.peerId,e);return void new Ns({[this.peerId]:this.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!Object(Me.a)(e.target,"reply")}catch(e){}if(t&&i.classList.contains("is-reply")){const e=+i.dataset.mid;this.replyFollowHistory.push(e);const t=this.chat.getMessage(e),s=t.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer(s,n,this.chat.type,this.chat.threadId)}}},this.onScroll=()=>{this.isHeavyAnimationInProgress&&this.scrolledDown||(ue.IS_TOUCH_SUPPORTED||(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)),this.scrollable.getDistanceToEnd()<300&&this.scrollable.loadedAll.bottom?(this.bubblesContainer.classList.add("scrolled-down"),this.scrolledDown=!0):this.bubblesContainer.classList.contains("scrolled-down")&&(this.bubblesContainer.classList.remove("scrolled-down"),this.scrolledDown=!1),this.chat.topbar.pinnedMessage&&this.chat.topbar.pinnedMessage.setCorrectIndex(this.scrollable.lastScrollDirection))},this.onDatePick=e=>{const t=this.peerId;this.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then(e=>{var s;(null===(s=null==e?void 0:e.messages)||void 0===s?void 0:s.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")})},this.listenerSetter=new R.a,this.bubblesContainer=document.createElement("div"),this.bubblesContainer.classList.add("bubbles","scrolled-down"),this.chatInner=document.createElement("div"),this.chatInner.classList.add("bubbles-inner"),this.setScroll(),this.bubblesContainer.append(this.scrollable.container),this.log=this.chat.log,this.bubbleGroups=new gn(this.chat),this.preloader=new ye.a({cancelable:!1}),this.lazyLoadQueue=new ee.d,this.lazyLoadQueue.queueId=++la,this.listenerSetter.add(a.default)("history_update",({storage:e,peerId:t,mid:s})=>{if(this.chat.getMessagesStorage()===e){const e=this.bubbles[s];if(!e)return;const t=this.chat.getMessage(s);if(+e.dataset.timestamp>=t.date+Ze.a.serverTimeOffset-1)return void this.bubbleGroups.changeBubbleMid(e,s);this.setBubblePosition(e,t,!1),this.scrollingToBubble&&this.scrollToBubbleEnd()}}),this.listenerSetter.add(a.default)("dialog_flush",({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map(e=>+e))}),this.listenerSetter.add(a.default)("message_sent",e=>{var t,s,i,n,o,r,l,c;const{storage:d,tempId:h,tempMessage:p,mid:u}=e;if(this.chat.getMessagesStorage()!==d)return;const m=this.getMountedBubble(h,p)||this.getMountedBubble(u);if(m){const e=this.chat.getMessage(u),a=m.bubble;if(e.replies){const t=a.querySelector("replies-element");t&&(t.message=e,t.init())}if(null===(t=e.media)||void 0===t?void 0:t.document){const t=a.querySelector(`.document-container[data-mid="${h}"] .document`);if(t){const a=Object(Me.a)(t,"document-container");!(null===(n=null===(i=null===(s=p.media)||void 0===s?void 0:s.document)||void 0===i?void 0:i.thumbs)||void 0===n?void 0:n.length)&&(null===(o=e.media.document.thumbs)||void 0===o?void 0:o.length)&&t.replaceWith(Ss({message:e})),a&&(a.dataset.mid=""+u)}}if(e.grouped_id){const e=a.querySelector(`.grouped-item[data-mid="${h}"]`)||a;e&&(e.dataset.mid=""+u)}if(null===(r=e.media)||void 0===r?void 0:r.poll){const t=a.querySelector("poll-element");if(t){const s=e.media.poll;t.message=e,t.setAttribute("poll-id",s.id),t.setAttribute("message-id",""+u)}}if(null===(l=e.media)||void 0===l?void 0:l.document){const t=a.querySelector(`audio-element[data-mid="${h}"], .document[data-doc-id="${h}"], .media-round[data-mid="${h}"]`);t&&(t instanceof Ne||t.classList.contains("media-round")?(t.dataset.mid=""+e.mid,delete t.dataset.isOutgoing,t.message=e,t.onLoad(!0)):t.dataset.docId=e.media.document.id)}(null===(c=e.media)||void 0===c?void 0:c.webpage)&&!a.querySelector(".web")&&Object(ks.c)().then(()=>{this.safeRenderMessage(e,!0,!1,a,!1),this.scrollToBubbleIfLast(a)})}else this.log.warn("message_sent there is no bubble",e);const g=this.bubbles;if(g[h]){const e=g[h];g[u]=e,delete g[h],Object(De.b)(()=>{e.classList.contains("is-sending")&&(e.classList.remove("is-sending"),e.classList.add(this.peerId===a.default.myId&&"scheduled"!==this.chat.type?"is-read":"is-sent"))}),e.dataset.mid=""+u}if(this.unreadOut.has(h)&&(this.unreadOut.delete(h),this.unreadOut.add(u)),"scheduled"===this.chat.type){(Date.now()/1e3|0)>=p.date-10&&this.deleteMessagesByIds([u])}}),this.listenerSetter.add(a.default)("message_edit",({storage:e,peerId:t,mid:s})=>{if(e!==this.chat.getMessagesStorage())return;const i=this.chat.getMessage(s),n=i.grouped_id?this.getGroupedBubble(i.grouped_id):this.getMountedBubble(s);if(!n)return;const a="scheduled"===this.chat.type,o=this.scrolledDown;this.safeRenderMessage(n.message,!0,!1,n.bubble,a),o&&this.scrollToBubbleIfLast(n.bubble),a&&(this.messagesQueuePromise||Promise.resolve()).then(()=>{this.deleteEmptyDateGroups()})}),this.listenerSetter.add(a.default)("album_edit",({peerId:e,groupId:t,deletedMids:s})=>{if(e!==this.peerId)return;const i=this.appMessagesManager.getMidsByAlbum(t).concat(s).find(e=>this.bubbles[e]);if(!i)return;const n=Object(w.e)(this.appMessagesManager.groupedMessagesStorage[t],"asc").pop();this.safeRenderMessage(this.chat.getMessage(n),!0,!1,this.bubbles[i],!1)}),this.listenerSetter.add(a.default)("messages_downloaded",({peerId:e,mids:t})=>{const s=this.getMiddleware();Object(ks.c)().then(()=>{s()&&t.forEach(t=>{Object(f.d)(this.needUpdate,(s,i)=>{if(s.replyMid===t&&s.replyToPeerId===e){const{mid:e,replyMid:t}=this.needUpdate.splice(i,1)[0],n=this.bubbles[e];if(!n)return;const a=this.chat.getMessage(e);this.appMessagesManager.getMessageByPeer(s.replyToPeerId,t).deleted&&delete a.reply_to_mid,wn.setReply({chat:this.chat,bubble:n,message:a})}})})})}),this.listenerSetter.add(this.bubblesContainer)("click",this.onBubblesClick),ue.IS_TOUCH_SUPPORTED){const e="is-gesturing-reply",t=64,s=.75*t;let i,n,a=!1;Bs({element:this.bubblesContainer,verifyTouchTarget:t=>!(this.chat.selection.isSelecting||!this.appMessagesManager.canSendToPeer(this.peerId,this.chat.threadId))&&(i=Object(Me.a)(t.target,"bubble"),i&&(Object(Jt.a)(i,e,!0,250),i.offsetLeft,n?(n.classList.remove("is-visible"),n.style.opacity=""):(n=document.createElement("span"),n.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),i.append(n)),!!i),onSwipe:(e,o)=>{a=e>=s,a&&!n.classList.contains("is-visible")&&n.classList.add("is-visible"),n.style.opacity=""+Math.min(1,e/s);const r=-Math.max(0,Math.min(t,e));i.style.transform=`translateX(${r}px)`,Object(te.b)()},onReset:()=>{const t=i;Object(Jt.a)(t,e,!1,250,()=>{n.parentElement===t&&(n.classList.remove("is-visible"),n.remove())}),Object(De.b)(()=>{if(t.style.transform="",a){const{mid:e}=t.dataset;this.chat.input.initMessageReply(+e),a=!1}})},listenerOptions:{capture:!0}})}let p;de.b&&this.listenerSetter.add(this.bubblesContainer)("dblclick",e=>{const t=Object(Me.a)(e.target,"grouped-item")||Object(Me.a)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",this.chat.getMessage(e)),this.highlightBubble(t)}}),re.IS_MOBILE||"pinned"===this.chat.type||this.listenerSetter.add(this.bubblesContainer)("dblclick",e=>{if(this.chat.selection.isSelecting||!this.appMessagesManager.canSendToPeer(this.peerId,this.chat.threadId))return;const t=e.target,s=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(s&&!s.classList.contains("bubble-first")){const e=+s.dataset.mid;if(this.chat.getMessage(e).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}}),this.stickyIntersector=new vn(this.scrollable.container,(e,t)=>{for(const s in this.dateMessages){const i=this.dateMessages[s];if(i.container===t){i.div.classList.toggle("is-sticky",e);break}}}),Object(ks.a)(()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),p=this.getMiddleware()},()=>{this.isHeavyAnimationInProgress=!1,p&&p()&&(this.lazyLoadQueue.unlock(),this.lazyLoadQueue.refresh()),p=null},this.listenerSetter)}constructPeerHelpers(){if(this.listenerSetter.add(a.default)("history_append",({storage:e,mid:t})=>{e===this.chat.getMessagesStorage()&&(this.scrollable.loadedAll.bottom?this.renderNewMessagesByIds([t],!0):this.chat.setMessageId())}),this.listenerSetter.add(a.default)("history_multiappend",e=>{if(!(this.peerId in e))return;const t=Array.from(e[this.peerId]).slice().sort((e,t)=>t-e);this.renderNewMessagesByIds(t)}),this.listenerSetter.add(a.default)("history_delete",({peerId:e,msgs:t})=>{e===this.peerId&&this.deleteMessagesByIds(Array.from(t))}),this.listenerSetter.add(a.default)("dialog_unread",({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),this.updateUnreadByDialog())}),this.listenerSetter.add(a.default)("dialogs_multiupdate",e=>{e[this.peerId]&&this.chat.input.setUnreadCount()}),this.listenerSetter.add(a.default)("dialog_notify_settings",e=>{this.peerId===e.peerId&&this.chat.input.setUnreadCount()}),this.listenerSetter.add(a.default)("chat_update",e=>{if(this.peerId===e.toPeerId(!0)){this.chatInner.classList.contains("has-rights")!==this.appMessagesManager.canSendToPeer(this.peerId,this.chat.threadId)&&(this.finishPeerChange(),this.chat.input.updateMessageInput())}}),this.listenerSetter.add(a.default)("settings_updated",e=>{if("settings.emoji.big"===e.key){const e=this.scrollable.isScrolledDown;e||this.setMessagesQueuePromise();Object(w.e)(this.bubbles,"desc").forEach(e=>{const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji")){const s=this.chat.getMessage(e);this.safeRenderMessage(s,void 0,!1,t)}}),e?this.scrollable.scrollTop=99999:this.performHistoryResult([],!0,!1,void 0)}}),this.listenerSetter.add(a.default)("message_views",({peerId:e,views:t,mid:s})=>{this.peerId===e&&Object(De.b)(()=>{const e=this.bubbles[s];if(!e)return;const i=Array.from(e.querySelectorAll(".post-views"));if(i.length){const e=Object(I.c)(t,1);let s=!1;i.forEach(t=>{(s||t.innerHTML!==e)&&(s=!0,t.innerHTML=e)})}})}),this.unreadedObserver=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const t=e.target,s=this.unreaded.get(t);this.onUnreadedInViewport(t,s)}})}),this.viewsObserver=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&(this.viewsMids.add(+e.target.dataset.mid),this.viewsObserver.unobserve(e.target),this.sendViewCountersDebounced())})}),this.sendViewCountersDebounced=dt(()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.appMessagesManager.incrementMessageViews(this.peerId,e)},1e3,!1,!0),"ResizeObserver"in window){let e=this.scrollable.container.offsetHeight,t=!1,s=!1,i=0,n=0,a=0;const o=()=>{const o=this.scrollable.container.offsetHeight,r=this.scrollable.isScrolledDown;o===e||s&&r||(n+=e-o),n&&(this.scrollable.scrollTop+=Math.round(n)),e=o,i=0,a=0,n=0,t=!1,s=!1},r=e=>{a&&window.cancelAnimationFrame(a),a=window.requestAnimationFrame(e?o:()=>{a=window.requestAnimationFrame(o)})};new ResizeObserver(a=>{if(s)return void r(!1);const o=a[0].contentRect.height;if(!e)return void(e=o);const l=e-o;let c=l+n;const d=c%1;if(c-=d,!t&&(t=!0,l<0&&this.scrollable.isScrolledDown))return n=-l,s=!0,void r(!1);if(i+=c,c){const e=this.scrollable.scrollTop+c;this.scrollable.scrollTop=e}r(!1),n=d,e=o}).observe(this.bubblesContainer)}}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.unreadedObserver.unobserve(e),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=a.default.idle.focusPromise.then(()=>{if(!e())return;let t=Math.max(...Array.from(this.unreadedSeen));if(this.scrollable.loadedAll.bottom){const e=Math.max(...Object.keys(this.bubbles).map(e=>+e));t>=e&&(t=Math.max(this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId).maxId||0,t))}this.unreaded.forEach((e,s)=>{e<=t&&this.onUnreadedInViewport(s,e)});const s=[];for(const e of this.unreadedSeen){const t=this.chat.getMessage(e);this.appMessagesManager.isMentionUnread(t)&&s.push(e)}return this.appMessagesManager.readMessages(this.peerId,s),this.unreadedSeen.clear(),de.b&&this.log("will readHistory by maxId:",t),this.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch(e=>{this.log.error("readHistory err:",e),this.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)}).finally(()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())})})}constructPinnedHelpers(){this.listenerSetter.add(a.default)("peer_pinned_messages",e=>{const{peerId:t,mids:s,pinned:i}=e;t===this.peerId&&s&&(i||this.deleteMessagesByIds(s))})}constructScheduledHelpers(){const e=()=>{this.chat.topbar.setTitle(this.appMessagesManager.getScheduledMessagesStorage(this.peerId).size)};this.listenerSetter.add(a.default)("scheduled_new",({peerId:t,mid:s})=>{t===this.peerId&&(this.renderNewMessagesByIds([s]),e())}),this.listenerSetter.add(a.default)("scheduled_delete",({peerId:t,mids:s})=>{t===this.peerId&&(this.deleteMessagesByIds(s),e())})}onGoDownClick(){if(this.replyFollowHistory.length){Object(f.d)(this.replyFollowHistory,(e,t)=>{const s=this.bubbles[e];let i=!0;if(s){const e=s.getBoundingClientRect();i=Et.a.height/2>e.top}else{this.chat.getMessage(e).deleted||(i=!1)}i&&this.replyFollowHistory.splice(t,1)}),this.replyFollowHistory.sort((e,t)=>t-e);const e=this.replyFollowHistory.pop();this.chat.setMessageId(e)}else this.chat.setMessageId()}getBubbleByPoint(e){let t=En(this.scrollable.container,e,"center");return t&&(t=Object(Me.a)(t,"bubble")),t}getGroupedBubble(e){const t=this.appMessagesManager.groupedMessagesStorage[e];for(const[e]of t)if(this.bubbles[e]){const s=Math.max(...t.keys());return{bubble:this.bubbles[e],mid:+e,message:this.chat.getMessage(s)}}return null}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t=this.chat.getMessage(e)){if(t.grouped_id&&this.appMessagesManager.getMidsByAlbum(t.grouped_id).length>1){const s=this.getGroupedBubble(t.grouped_id);if(s)return s.bubble=s.bubble.querySelector(`.document-container[data-mid="${e}"]`)||s.bubble,s}const s=this.bubbles[e];if(s)return{bubble:s,mid:e,message:t}}findNextMountedBubbleByMsgId(e){return this.bubbles[Object(w.e)(this.bubbles).find(t=>{var s;return!(t+e).sort((e,t)=>e-t);if(s.length)if(e)de.b&&this.log("Will load more (up) history by id:",s[0],"maxId:",s[s.length-1],t),this.getHistory(s[0],!0,void 0,void 0,t);else{const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);if(-1!==s.indexOf(e.maxId))return void this.setLoaded("bottom",!0);de.b&&this.log("Will load more (down) history by id:",s[s.length-1],t),this.getHistory(s[s.length-1],!1,!0,void 0,t)}}setScroll(){this.scrollable=new T.b(null,"IM",300),this.setLoaded("top",!1),this.setLoaded("bottom",!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),ue.IS_TOUCH_SUPPORTED&&(this.scrollable.container.addEventListener("touchmove",()=>{this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling")},{passive:!0}),this.scrollable.container.addEventListener("touchend",()=>{this.chatInner.classList.contains("is-scrolling")&&(this.isScrollingTimeout&&clearTimeout(this.isScrollingTimeout),this.isScrollingTimeout=window.setTimeout(()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0},1350))},{passive:!0}))}updateUnreadByDialog(){const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId),t=this.peerId===a.default.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(t.classList.contains("is-sending"))continue;t.classList.remove("is-sent","is-sending"),t.classList.add("is-read")}this.unreadOut.delete(e)}}deleteMessagesByIds(e,t=!0){e.forEach(e=>{if(!(e in this.bubbles))return;const t=this.bubbles[e];delete this.bubbles[e],this.skippedMids.delete(e),this.firstUnreadBubble===t&&(this.firstUnreadBubble=null),this.bubbleGroups.removeBubble(t),this.unreadedObserver&&(this.unreadedObserver.unobserve(t),this.unreaded.delete(t)),this.viewsObserver&&(this.viewsObserver.unobserve(t),this.viewsMids.delete(e)),t.remove(),this.emptyPlaceholderMid===e&&(this.emptyPlaceholderMid=void 0)}),t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),C.a.checkAnimations(!1,Xo),this.deleteEmptyDateGroups()}renderNewMessagesByIds(e,t){if(!this.scrollable.loadedAll.bottom)return;this.chat.threadId&&(e=e.filter(e=>{const t=this.chat.getMessage(e).reply_to;return t&&(t.reply_to_top_id||t.reply_to_msg_id)===this.chat.threadId})),e=e.filter(e=>!this.bubbles[e]),t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()));const s=this.getMiddleware();let i,n=!1;if(!this.isTopPaddingSet){const{clientHeight:e,scrollHeight:t}=this.scrollable.container;n=e===t,n&&(i=this.chatInner,i.style.paddingTop=e+"px",this.scrollable.scrollTop=t,this.isTopPaddingSet=!0)}const a=this.performHistoryResult(e,!1,!0);t&&a.then(()=>{if(!s())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[Math.max(...e)]);const a=this.scrollToBubbleEnd(t)||Promise.resolve();n&&a.then(()=>{s()&&n&&(i.style.paddingTop="",this.isTopPaddingSet=!1)})})}getLastBubble(){const e=this.getLastDateGroup();if(e)return e.lastElementChild}scrollToBubble(e,t,s,i){const n=Object(Me.a)(e,"bubble");if("center"===t&&Object(Os.a)(n)===(this.stickyIntersector?2:1)){const s=n.parentElement;0===Object(Os.a)(s)&&(e=s,t="start")}const a=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper");return this.scrollable.scrollIntoViewNew(e,t,4,void 0,s,i,"y",a?({rect:e})=>{let t=Et.a.height;return t-=this.bubblesContainer.offsetTop,t-=b.b.isMobile||Et.a.height<570?58:78,t}:void 0)}scrollToBubbleEnd(e=this.getLastBubble()){if(e){this.scrollingToBubble=e;const t=this.getMiddleware();return this.scrollToBubble(e,"end",void 0,void 0).then(()=>{t()&&(this.scrollingToBubble=void 0)})}}getLastDateGroup(){let e,t=0;for(const s in this.dateMessages){const i=this.dateMessages[s];i.firstTimestamp>t&&(e=i.container,t=i.firstTimestamp)}return e}scrollToBubbleIfLast(e){e.parentElement.lastElementChild===e&&this.getLastDateGroup().parentElement.lastElementChild===e.parentElement&&this.scrollToBubbleEnd(e)}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)}getDateContainerByMessage(e,t){const s=new Date(1e3*e.date);s.setHours(0,0,0);const i=s.getTime();if(!this.dateMessages[i]){let t;const n=new Date;n.setHours(0,0,0,0);const a="scheduled"===this.chat.type;if(n.getTime()===s.getTime())t=Object(x.i18n)(a?"Chat.Date.ScheduledForToday":"Date.Today");else if(a&&2147483646===e.date)t=Object(x.i18n)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};s.getFullYear()!==n.getFullYear()&&(e.year="numeric"),t=new x.default.IntlDateElement({date:s,options:e}).element,a&&(t=Object(x.i18n)("Chat.Date.ScheduledFor",[t]))}const o=document.createElement("div");o.className="bubble service is-date";const r=document.createElement("div");r.classList.add("bubble-content");const l=document.createElement("div");l.classList.add("service-msg"),l.append(t),r.append(l),o.append(r);const c=document.createElement("div");c.className="bubbles-date-group",c.append(o),this.dateMessages[i]={div:o,container:c,firstTimestamp:s.getTime()};const d=Object(w.e)(this.dateMessages,"asc");let h,p=0,u=d.length;for(;p+e)))}else this.isFirstLoad=!0;const u=this.chatInner;this.cleanup();const m=this.chatInner=document.createElement("div");let g;i?(m.className=u.className,m.classList.remove("disable-hover","is-scrolling")):m.classList.add("bubbles-inner"),this.lazyLoadQueue.lock(),g=r?{promise:Object(ks.c)().then(()=>this.performHistoryResult(r.mids,!0,!1,void 0)),cached:!0}:this.getHistory(t,!0,c,h);const{promise:b,cached:v}=g;v||i||(d.container.textContent="",this.chat.finishPeerChange(o,c,t),this.preloader.attach(this.bubblesContainer)),C.a.lockGroup(Xo);const f=b.then(()=>{if(v?i||this.chat.finishPeerChange(o,c,t):this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),d.lastScrollDirection=0,d.lastScrollTop=0,Object(k.a)(d.container,m),C.a.unlockGroup(Xo),C.a.checkAnimations(!1,Xo),this.lazyLoadQueue.unlock(),r)d.scrollTop=r.top;else if(a&&c||o){const e=p>0&&(p{d.checkForTriggers()}),this.chat.dispatchEvent("setPeer",t,!c);const u=this.appMessagesManager.isFetchIntervalNeeded(e);if(r||u?h.then(()=>{if(s()&&(d.checkForTriggers(),u)){const t=()=>{this.fetchNewPromise=new Promise(i=>{s()&&this.appMessagesManager.isFetchIntervalNeeded(e)?this.appMessagesManager.getNewHistory(e,this.chat.threadId).then(e=>{if(!s()||!e)return void i();const n=e.history.slice.isEnd(Ln.a.Bottom);d.loadedAll.bottom&&d.loadedAll.bottom!==n&&(this.setLoaded("bottom",n),this.onScroll()),setTimeout(t,3e4),i()}):i()}).finally(()=>{this.fetchNewPromise=void 0})};i?setTimeout(t,3e4):t()}}):t&&!this.bubbles[a]&&t!==a||this.setLoaded("bottom",!0),this.log("scrolledAllDown:",d.loadedAll.bottom),d.loadedAll.bottom&&a&&!this.unreaded.size&&this.onScrolledAllDown(),"chat"===n){const t=this.appMessagesManager.getDialogOnly(e);(null==t?void 0:t.pFlags.unread_mark)&&this.appMessagesManager.markDialogUnread(e,!0)}}).catch(e=>{throw this.log.error("getHistory promise error:",e),this.preloader.detach(),e});return{cached:v,promise:f}}onScrolledAllDown(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);this.appMessagesManager.readHistory(this.peerId,e.maxId,this.chat.threadId,!0)}}finishPeerChange(){const e=this.peerId,t=this.appPeersManager.isChannel(e),s=this.appMessagesManager.canSendToPeer(e,this.chat.threadId);this.chatInner.classList.toggle("has-rights",s),this.bubblesContainer.classList.toggle("is-chat-input-hidden",!s),this.chatInner.classList.toggle("is-chat",this.chat.isAnyGroup()),this.chatInner.classList.toggle("is-channel",t)}renderMessagesQueue(e,t,s,i){this.messagesQueue.push({message:e,bubble:t,reverse:s,promises:i}),this.setMessagesQueuePromise()}setMessagesQueuePromise(){!this.messagesQueuePromise&&this.messagesQueue.length&&(this.messagesQueuePromise=new Promise((e,t)=>{setTimeout(()=>{const s=this.messagesQueue.slice();this.messagesQueue.length=0;const i=s.reduce((e,{promises:t})=>e.concat(t),[]);this.log("promises to call",i,s,this.isHeavyAnimationInProgress);const n=this.getMiddleware();Promise.all(i).then(()=>{if(!n())throw"setMessagesQueuePromise: peer changed!";this.messagesQueueOnRender&&this.messagesQueueOnRender(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional(),s.forEach(({message:e,bubble:t,reverse:s})=>{this.setBubblePosition(t,e,s)}),e(),this.messagesQueuePromise=null,this.messagesQueue.length&&this.setMessagesQueuePromise(),this.setUnreadDelimiter()}).catch(t)},0)}))}setBubblePosition(e,t,s){if(t.id<0)return void this.chatInner.prepend(e);const i=this.getDateContainerByMessage(t,s);if("scheduled"===this.chat.type||"pinned"===this.chat.type){const s=this.stickyIntersector?2:1;let n=Array.from(i.container.children).slice(s),a=0,o=0;for(;as.includes(e)));i.className=n.join(" "),v=i.lastElementChild,v.classList.contains("bubble-content-wrapper")||(v=i.querySelector(".bubble-content-wrapper")),m=v.firstElementChild,m.innerHTML="",m.style.cssText="",v.innerHTML="",v.appendChild(m);const a=v.style.transitionDelay;v.style.cssText="",v.style.transitionDelay=a,i===this.firstUnreadBubble&&i.classList.add("is-first-unread");const o=+i.dataset.mid;+e.mid===o||(delete this.bubbles[o],this.skippedMids.delete(o))}else if(v=document.createElement("div"),v.classList.add("bubble-content-wrapper"),m=document.createElement("div"),m.classList.add("bubble-content"),(i=document.createElement("div")).classList.add("bubble"),v.appendChild(m),i.appendChild(v),!p&&!e.pFlags.out&&this.unreadedObserver){(e.pFlags.unread||this.appMessagesManager.isMentionUnread(e)||void 0!==this.historyStorage.readMaxId&&this.historyStorage.readMaxId"messageEntityEmoji"===e._),t=y.length;if(e.reduce((e,t)=>e+t.length,0)===t&&e.length<=3){if(a.default.settings.emoji.big){let t=this.appStickersManager.getAnimatedEmojiSticker(y);if(1===e.length&&!S&&t)S={_:"messageMediaDocument",document:t};else{let t=document.createElement("div");t.classList.add("attachment"),t.innerHTML=L,i.classList.add("emoji-"+e.length+"x"),m.append(t)}i.classList.add("is-message-empty","emoji-big"),C=!0,E=!1,I=!1}i.classList.add("can-have-big-emoji")}}I&&g(u,L);const M=wn.setTime(this.chat,e,i,m,u);if(m.prepend(u),e.views&&!(null===(r=e.fwd_from)||void 0===r?void 0:r.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),m.prepend(e),i.classList.add("with-beside-button")}if(e.views&&!e.pFlags.is_outgoing&&this.viewsObserver&&this.viewsObserver.observe(i),e.reply_markup&&"replyInlineMarkup"===e.reply_markup._&&e.reply_markup.rows&&e.reply_markup.rows.length){const t=e.reply_markup.rows,s=document.createElement("div");s.classList.add("reply-markup"),t.forEach(t=>{const i=t.buttons;if(!i||!i.length)return;const n=document.createElement("div");n.classList.add("reply-markup-row"),i.forEach(t=>{const s=J.b.wrapRichText(t.text,{noLinks:!0,noLinebreaks:!0});let i;switch(t._){case"keyboardButtonUrl":{const e=J.b.wrapRichText(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=Object(Vs.a)(e).firstElementChild,i.classList.add("is-link","tgico");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline","tgico"),Object(l.b)(i,s=>{Object(c.a)(s);const i=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.appInlineBotsManager.checkSwitchReturn(i).then(e=>e||new Promise((e,t)=>{new Ns({[this.peerId]:[]},t=>{e(t)},!0).addEventListener("close",()=>{t()})})),n.then(e=>{const s=this.peerId===e?this.chat.threadId:void 0;this.appInlineBotsManager.switchInlineQuery(e,s,i,t.query)})});break;default:i=document.createElement("button")}i.classList.add("reply-markup-button","rp"),i.insertAdjacentHTML("beforeend",s),Object(se.ripple)(i),n.append(i)}),s.append(n)}),Object(l.b)(s,s=>{let i=s.target;if(i.classList.contains("reply-markup-button")||(i=Object(Me.a)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline"))return;Object(c.a)(s);const n=Object(Os.a)(i),a=t[Object(Os.a)(i.parentElement)];if(!a.buttons||!a.buttons[n])return void this.log.warn("no such button",a,n,e);const o=a.buttons[n];this.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,o)}),E=!1,i.classList.add("with-reply-markup"),v.append(s)}const P=e.pFlags.is_outgoing;if(p){(e.pFlags.unread||P)&&this.unreadOut.add(e.mid);let t="";t=P?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}const T=this.appMessagesManager.getMessageWithReplies(e),k=!!T&&e.mid>0;k&&i.classList.add("with-replies");const O=p&&(!e.fwd_from||this.peerId!==a.default.myId);let A=m;if(S){let t=document.createElement("div");t.classList.add("attachment"),y||i.classList.add("is-message-empty");let s=!1;switch(S._){case"messageMediaPhoto":{const s=S.photo;y||(E=!1),e.viaBotId||i.classList.add("hide-name"),i.classList.add("photo");const n=this.appMessagesManager.groupedMessagesStorage[e.grouped_id];if(e.grouped_id&&1!==n.size&&d){i.classList.add("is-album","is-grouped"),Ts({groupId:e.grouped_id,attachmentDiv:t,middleware:this.getMiddleware(),isOut:p,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:f,noAutoDownload:this.chat.noAutoDownloadMedia});break}const a=!re.IS_ANDROID&&E&&!k&&!1;a&&i.classList.add("with-media-tail"),Ls({photo:s,message:e,container:t,withTail:a,isOut:O,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:f,noAutoDownload:this.chat.noAutoDownloadMedia});break}case"messageMediaWebPage":{s=!0;let t=S.webpage;if("webPage"!==t._)break;i.classList.add("webpage");let n=document.createElement("div");n.classList.add("web");let a,o,r=document.createElement("div");r.classList.add("quote");const l=t.photo;(l||t.document)&&(a=document.createElement("div"),a.classList.add("preview-resizer"),o=document.createElement("div"),o.classList.add("preview"),a.append(o));const c=t.document;if(c)if("gif"===c.type||"video"===c.type||"round"===c.type){const t="round"===c.type?b.b.active.round:b.b.active.webpage;"round"===c.type?(i.classList.add("round"),o.classList.add("is-round")):i.classList.add("video"),ws({doc:c,container:o,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:O,group:Xo,loadPromises:f,noAutoDownload:this.chat.noAutoDownloadMedia})}else{const t=Ss({message:e,noAutoDownload:this.chat.noAutoDownloadMedia,lazyLoadQueue:this.lazyLoadQueue,loadPromises:f});o.append(t),o.classList.add("preview-with-document")}let d,h=document.createElement("div");if(h.classList.add("quote-text"),a&&h.append(a),t.site_name){const e=J.b.wrapRichText(t.url),s=Object(Vs.a)(e).firstElementChild;s.classList.add("webpage-name"),g(s,J.b.wrapEmojiText(t.site_name)),h.append(s),d=s}if(t.rTitle){let e=document.createElement("div");e.classList.add("title"),g(e,t.rTitle),h.append(e),d=e}if(t.rDescription){let e=document.createElement("div");e.classList.add("text"),g(e,t.rDescription),h.append(e),d=e}if(r.append(h),l&&!c){i.classList.add("photo");const t=l.sizes[l.sizes.length-1];let s=!1;t.w===t.h&&d?(i.classList.add("is-square-photo"),s=!0,this.appPhotosManager.setAttachmentSize(l,o,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),Ls({photo:l,message:e,container:o,boxWidth:s?0:b.b.active.webpage.width,boxHeight:s?0:b.b.active.webpage.height,isOut:O,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:f,withoutPreloader:s,noAutoDownload:this.chat.noAutoDownloadMedia})}n.append(r),u.insertBefore(n,M);break}case"messageMediaDocument":{const n=S.document;if(n.sticker){i.classList.add("sticker"),E=!1,C=!0,n.animated&&i.classList.add("sticker-animated");const e=b.b.active,s=i.classList.contains("emoji-big")?e.emojiSticker:n.animated?e.animatedSticker:e.staticSticker;this.appPhotosManager.setAttachmentSize(n,t,s.width,s.height),m.style.height=t.style.height,m.style.width=t.style.width,Cs({doc:n,div:t,middleware:this.getMiddleware(),lazyLoadQueue:this.lazyLoadQueue,group:Xo,play:!0,loop:!0,emoji:i.classList.contains("emoji-big")?y:void 0,withThumb:!0,loadPromises:f})}else if("video"===n.type||"gif"===n.type||"round"===n.type){const s="round"===n.type;s&&(C=!0),!s&&y||(E=!1),e.viaBotId||i.classList.add("hide-name"),i.classList.add(s?"round":"video");const a=this.appMessagesManager.groupedMessagesStorage[e.grouped_id];if(e.grouped_id&&1!==a.size&&d)i.classList.add("is-album","is-grouped"),Ts({groupId:e.grouped_id,attachmentDiv:t,middleware:this.getMiddleware(),isOut:p,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:f,noAutoDownload:this.chat.noAutoDownloadMedia});else{const a=!re.IS_ANDROID&&!re.IS_APPLE&&!s&&E&&!k&&!1;a&&i.classList.add("with-media-tail"),ws({doc:n,container:t,message:e,boxWidth:b.b.active.regular.width,boxHeight:b.b.active.regular.height,withTail:a,isOut:O,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),group:Xo,loadPromises:f,noAutoDownload:this.chat.noAutoDownloadMedia,searchContext:s?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0})}}else{const t=function({albumMustBeRenderedFull:e,message:t,bubble:s,messageDiv:i,chat:n,loadPromises:a,noAutoDownload:o,lazyLoadQueue:r,searchContext:l,useSearch:c}){let d;const h=e?n.getMidsByMid(t.mid):[t.mid];return h.forEach((e,t)=>{const s=n.getMessage(e),c=Ss({message:s,loadPromises:a,noAutoDownload:o,lazyLoadQueue:r,searchContext:l}),p=document.createElement("div");p.classList.add("document-container"),p.dataset.mid=""+e,p.dataset.peerId=""+s.peerId;const u=document.createElement("div");if(u.classList.add("document-wrapper"),s.message){const e=document.createElement("div");e.classList.add("document-message");const t=J.b.wrapRichText(s.message,{entities:s.totalEntities});e.innerHTML=t,u.append(e)}if(h.length>1){const e=document.createElement("div");e.classList.add("document-selection"),p.append(e),p.classList.add("grouped-item"),0===t&&(d=u)}u.append(c),p.append(u),i.append(p)}),h.length>1&&s.classList.add("is-multiple-documents","is-grouped"),d}({albumMustBeRenderedFull:d,message:e,bubble:i,messageDiv:u,chat:this.chat,loadPromises:f,noAutoDownload:this.chat.noAutoDownloadMedia,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});t&&(A=t);const a=u.lastElementChild.querySelector(".document-message, .document-size, .audio");a&&a.append(M.cloneNode(!0)),i.classList.remove("is-message-empty"),u.classList.add((["photo","pdf"].includes(n.type)?"document":n.type||"document")+"-message"),s=!0}break}case"messageMediaContact":{const t=document.createElement("div");t.classList.add("contact"),t.dataset.peerId=""+S.user_id,u.classList.add("contact-message"),s=!0;const n=[];e.media.first_name&&n.push(J.b.wrapEmojiText(e.media.first_name)),e.media.last_name&&n.push(J.b.wrapEmojiText(e.media.last_name)),t.innerHTML=`\n
\n
${n.join(" ")}
\n
${e.media.phone_number?"+"+Object(Us.a)(e.media.phone_number).formatted:"Unknown phone number"}
\n
`;const a=new ur;a.lazyLoadQueue=this.lazyLoadQueue,a.setAttribute("peer",""+e.media.user_id),a.classList.add("contact-avatar","avatar-54"),t.prepend(a),i.classList.remove("is-message-empty"),u.classList.add("contact-message"),u.append(t);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e){const t=new as;return t.message=e,t.setAttribute("peer-id",""+e.peerId),t.setAttribute("poll-id",e.media.poll.id),t.setAttribute("message-id",""+e.mid),t.render(),t}(e);u.prepend(t),u.classList.add("poll-message");break}default:i.classList.remove("is-message-empty"),u.innerHTML='This message is currently not supported on Telegram Web. Try desktop.telegram.org',u.append(M),this.log.warn("unrecognized media type:",e.media._,e)}s||m.append(t)}C&&i.classList.add("just-media"),this.chat.selection.isSelecting&&this.chat.selection.toggleElementCheckbox(i,!0);let _="";const F=e.fromId!==a.default.myId&&this.appPeersManager.isAnyChat(h)&&!this.appPeersManager.isBroadcast(h)||e.viaBotId;if(F||e.fwd_from||e.reply_to_mid){let t,s;const n=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===e.fwdFromId;let o,r=e.fwd_from&&!e.fwd_from.from_id&&!e.fwd_from.channel_id;if(e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+this.appUsersManager.getUser(e.viaBotId).username,s.classList.add("peer-title"),i.classList.add("must-have-name")),r?(t=document.createElement("span"),t.innerHTML=J.b.wrapEmojiText(e.fwd_from.from_name),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new Lt.a({peerId:e.fwdFromId||e.fromId}).element,e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&wn.setReply({chat:this.chat,bubble:i,bubbleContainer:m,message:e}),e.fwdFromId||e.fwd_from)if(this.peerId===a.default.myId||n||i.classList.add("forwarded"),e.savedFrom&&(_=e.savedFrom,t.dataset.savedFrom=_),o=document.createElement("div"),t.dataset.peerId=e.fwdFromId,this.peerId!==a.default.myId&&this.peerId!==Be.c&&!n||C){const e=[t];C&&e.unshift(document.createElement("br")),o.append(Object(x.i18n)("ForwardedFrom",[e]))}else o.style.color=this.appPeersManager.getPeerColorById(e.fwdFromId,!1),o.append(t);else e.viaBotId||(!C&&F?(o=document.createElement("div"),o.append(t),p||(o.style.color=this.appPeersManager.getPeerColorById(e.fromId,!1)),o.dataset.peerId=e.fromId):i.classList.add("hide-name"));if(e.viaBotId){o?o.append(" "):o=document.createElement("div");const e=document.createElement("span");e.append(Object(x.i18n)("ViaBot")," ",s),e.classList.add("is-via"),o.append(e)}o&&(o.classList.add("name"),A.append(o));if(this.chat.isAnyGroup()&&!O){let t=new ur;t.lazyLoadQueue=this.lazyLoadQueue,t.classList.add("user-avatar","avatar-40"),t.loadPromises=f,!e.fwdFromId&&e.fwd_from&&e.fwd_from.from_name&&t.setAttribute("peer-title",e.fwd_from.from_name),t.setAttribute("peer",""+((e.fwd_from&&(this.peerId===a.default.myId||this.peerId===Be.c)||n?e.fwdFromId:e.fromId)||Be.b)),v.append(t)}}else i.classList.add("hide-name");"pinned"===this.chat.type&&(_=`${this.chat.peerId}_${e.mid}`);if(T&&T.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),_&&("pinned"===this.chat.type||e.fwd_from.saved_from_msg_id)&&this.peerId!==Be.c){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),m.append(e),i.dataset.savedFrom=_,i.classList.add("with-beside-button")}if(i.classList.add(O?"is-out":"is-in"),n&&this.renderMessagesQueue(e,i,t,f),k){wn.renderReplies({bubble:i,bubbleContainer:m,message:T,messageDiv:u,loadPromises:f,lazyLoadQueue:this.lazyLoadQueue})&&(E=!0)}return E&&(i.classList.add("can-have-tail"),m.append(da())),i}safeRenderMessage(e,t,s,i,n){try{return this.renderMessage(e,t,s,i,n)}catch(e){this.log.error("renderMessage error:",e)}}performHistoryResult(e,t,s,i){return aa(this,void 0,void 0,(function*(){let s;e=e.slice(),i&&e.unshift(i),this.messagesQueueOnRender=()=>{const{scrollTop:e,scrollHeight:i}=this.scrollable;s=t?i-e:e,this.messagesQueueOnRender=void 0},this.needReflowScroll&&(Cn(this.scrollable.container),this.needReflowScroll=!1);const n=e=>{const s=this.chat.getMessage(e);s.id>0?this.safeRenderMessage(s,t,!0):this.processLocalMessageRender(s)},a=e.length;if(t)for(let t=0;t=0;--t)n(e[t]);if("scheduled"!==this.chat.type){const t=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId),s=t.history.first,i=t.history.last;!s.isEnd(Ln.a.Bottom)||s.length&&!e.includes(s[0])||this.setLoaded("bottom",!0,!1),!i.isEnd(Ln.a.Top)||i.length&&!e.includes(i[i.length-1])||this.setLoaded("top",!0,!1)}else this.setLoaded("top",!0),this.setLoaded("bottom",!0);if(yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional()),void 0!==s){const e=t?this.scrollable.scrollHeight-s:s;this.scrollable.scrollTop=e,re.IS_SAFARI&&Cn(this.scrollable.container)}return!0}))}requestHistory(e,t,s){if("chat"===this.chat.type||"discussion"===this.chat.type)return this.appMessagesManager.getHistory(this.peerId,e,t,s,this.chat.threadId);if("pinned"===this.chat.type){return this.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:s}).then(e=>({history:e.history.map(e=>e.mid)}))}return"scheduled"===this.chat.type?this.appMessagesManager.getScheduledMessages(this.peerId).then(e=>({history:e.slice().reverse()})):void 0}animateAsLadder(e,t,s,i,n){return aa(this,void 0,void 0,(function*(){if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,s,i,n));if(!Object.keys(this.bubbles).length)return;let a,o=Object(w.e)(this.bubbles,"desc");s&&t.length&&(o=o.filter(e=>!t.includes(e))),a=i?n||Math.max(...o):e||Math.max(...o);const r=o.slice(o.findIndex(e=>a>e)),l=s?[]:[a],c=s?[]:o.slice(0,o.findIndex(e=>a>=e)).reverse();de.b&&this.log("getHistory: targeting mid:",a,n,e,r.map(e=>this.appMessagesIdsManager.getServerMessageId(e)),c.map(e=>this.appMessagesIdsManager.getServerMessageId(e)));const d=[];this.chatInner.classList.add("zoom-fading");const h=s?10:40,p=s?0:1,u=(e,t=0)=>{const s=Object(ae.a)();let i=0;return e.forEach((n,a)=>{if(!this.bubbles[n]||this.skippedMids.has(n))return void this.log.warn("animateAsLadder: no bubble by mid:",n);const o=this.bubbles[n].lastElementChild;if(i=(a+t||.1)*h,o.classList.add("zoom-fade"),o.style.transitionDelay=i+"ms",a===e.length-1){const e=t=>{t.target===o&&(s.resolve(),o.removeEventListener("transitionend",e))};o.addEventListener("transitionend",e)}d.push(o)}),e.length||s.resolve(),{lastMsDelay:i,animationPromise:s}},m=u(r,p),g=u(l),b=u(c,p),v=[m.animationPromise,g.animationPromise,b.animationPromise],f=[m.lastMsDelay,g.lastMsDelay,b.lastMsDelay];let y;return this.onAnimateLadder&&(yield this.onAnimateLadder()),Object(De.b)(()=>{d.forEach(e=>{e.classList.remove("zoom-fade")})}),(r.length||l.length||c.length)&&(y=Promise.all(v),Object(ks.b)(y,Math.max(...f)+200).then(()=>{Object(De.b)(()=>{d.forEach(e=>{e.style.transitionDelay=""}),this.chatInner.classList.remove("zoom-fading")}),re.IS_SAFARI||(this.needReflowScroll=!0)})),y}))}renderEmptyPlaceholder(e,t,s,i){const n="empty-bubble-placeholder";let a,o;if(t.classList.add(n,n+"-"+e),"group"===e?a=Object(x.i18n)("GroupEmptyTitle1"):"saved"===e?a=Object(x.i18n)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?a=Object(x.i18n)("NoMessages"):"noScheduledMessages"===e&&(a=Object(x.i18n)("NoScheduledMessages")),a.classList.add("center",n+"-title"),i.push(a),"group"===e)i.push(Object(x.i18n)("GroupEmptyTitle2")),o=[Object(x.i18n)("GroupDescription1"),Object(x.i18n)("GroupDescription2"),Object(x.i18n)("GroupDescription3"),Object(x.i18n)("GroupDescription4")];else if("saved"===e)o=[Object(x.i18n)("ChatYourSelfDescription1"),Object(x.i18n)("ChatYourSelfDescription2"),Object(x.i18n)("ChatYourSelfDescription3"),Object(x.i18n)("ChatYourSelfDescription4")];else if("greeting"===e){const e=Object(x.i18n)("NoMessagesGreetingsDescription");e.classList.add("center",n+"-subtitle"),this.messagesQueue.findAndSplice(e=>e.bubble===t);const a=document.createElement("div");a.classList.add(n+"-sticker");const o=this.getMiddleware(),r=this.appStickersManager.getGreetingSticker().then(e=>{if(!o())return;const t=[];return Cs({doc:e,div:a,middleware:o,lazyLoadQueue:this.lazyLoadQueue,group:Xo,play:!0,loop:!0,withThumb:!0,loadPromises:t}),Object(l.b)(a,e=>{Object(c.a)(e),sa.onMediaClick({target:e.target})}),Promise.all(t)});this.renderMessagesQueue(s,t,!1,[r]),i.push(e,a)}o&&(i.push(...o.map(e=>{const t=document.createElement("span");return t.classList.add(n+"-list-item"),t.append(e),t})),"group"===e?o.forEach(e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)}):"saved"===e&&o.forEach(e=>{const t=document.createElement("span");t.classList.add(n+"-list-bullet"),t.innerText="•",e.prepend(t)})),i.length>1&&t.classList.add("has-description"),i.forEach(e=>e.classList.add(n+"-line"))}processLocalMessageRender(e){const t=this.safeRenderMessage(e,void 0,void 0,void 0,!1);t.classList.add("bubble-first","is-group-last","is-group-first"),t.classList.remove("can-have-tail","is-in");const s=t.querySelector(".message, .service-msg"),i=[],n=this.appPeersManager.isBot(this.peerId);if(n&&"message"===e._){const e=document.createElement("b");e.append(Object(x.i18n)("BotInfoTitle")),i.push(e,"\n\n")}else this.appPeersManager.isAnyGroup(this.peerId)&&this.appPeersManager.getPeer(this.peerId).pFlags.creator?this.renderEmptyPlaceholder("group",t,e,i):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",t,e,i):a.default.myId===this.peerId?this.renderEmptyPlaceholder("saved",t,e,i):this.appPeersManager.isUser(this.peerId)&&!n&&this.appMessagesManager.canSendToPeer(this.peerId)&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",t,e,i):this.renderEmptyPlaceholder("noMessages",t,e,i);s.prepend(...i),this.messagesQueueOnRenderAdditional?this.onAnimateLadder=()=>{if(this.chatInner.prepend(t),this.onAnimateLadder=void 0,!this.messagesQueuePromise)return Object(De.d)()}:this.chatInner.prepend(t),this.emptyPlaceholderMid=e.mid}generateLocalFirstMessage(e,t){const s=this.appMessagesIdsManager.generateMessageId("scheduled"===this.chat.type?-1:0),i={_:e?"messageService":"message",date:0,id:-(+this.peerId+s),peer_id:this.appPeersManager.getOutputPeer(this.peerId),pFlags:{}};return e||(i.message=""),Object(Hi.a)(i),t&&t(i),this.appMessagesManager.saveMessages([i]),i}setLoaded(e,t,s=!0){if(this.scrollable.loadedAll[e]!==t){if(this.scrollable.loadedAll[e]=t,"top"===e&&t&&this.appPeersManager.isBot(this.peerId)){this.log("inject bot description");const e=this.getMiddleware();return this.appProfileManager.getProfile(this.peerId.toUserId()).then(t=>{var s;if(!e())return;if(!(null===(s=t.bot_info)||void 0===s?void 0:s.description))return void this.checkIfEmptyPlaceholderNeeded();const i=this.generateLocalFirstMessage(!1,e=>{e.message=t.bot_info.description});this.processLocalMessageRender(i)})}this.checkIfEmptyPlaceholderNeeded()}}checkIfEmptyPlaceholderNeeded(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderMid&&(!this.appMessagesManager.getHistoryStorage(this.peerId).count||Object.keys(this.bubbles).length&&!this.getRenderedLength()||"scheduled"===this.chat.type&&!Object.keys(this.bubbles).length)){this.log("inject empty peer placeholder");const e=this.generateLocalFirstMessage(!0);return this.processLocalMessageRender(e),!0}return!1}getHistory(e=0,t=!1,s=!1,i=0,n=!1){const o=this.peerId,r=Math.min(30,Et.a.height/38|0),l=Object.keys(this.bubbles).length>0?Math.max(40,r):r;let c=l;if(void 0!==ra){if(!ra)return{cached:!1,promise:Promise.resolve(!0)};Object.keys(this.bubbles).length>0&&--ra}let d,h=0;if(s&&(h=c,t||(c=0)),i&&!s)if("pinned"===this.chat.type)d=[i];else{const t=this.appMessagesManager.getHistoryStorage(o,this.chat.threadId).history.slice;if(t.length=0;--e){if(!this.chat.getMessage(d[e]).grouped_id)break;d.splice(e,1)}e=d[d.length-1]||e}}let p,u=this.requestHistory(e,c,h);const m=(null==d?void 0:d.length)&&u instanceof Promise,g=this.isFirstLoad&&h&&u instanceof Promise||m;m&&(p=u,u={history:d}),this.isFirstLoad=!1;const b=e=>aa(this,void 0,void 0,(function*(){if("offsetIdOffset"in e&&e.history.isEnd(Ln.a.Top)){if("discussion"===this.chat.type){const t=this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId+"_"+this.chat.threadId];t&&e.history.push(t),e.history.push(...this.chat.getMidsByMid(this.chat.threadId).reverse())}yield this.setLoaded("top",!0)}})),v=e=>Object(ks.c)().then(()=>b(e)).then(()=>this.performHistoryResult(e.history||[],t,s,!m&&i)),f=e=>{const s=e.then(e=>(t?this.getHistoryTopPromise!==s:this.getHistoryBottomPromise!==s)?(this.log.warn("getHistory: peer changed"),Promise.reject()):n?(this.scrollable.onScroll(),!0):v(e),e=>{throw this.log.error("getHistory error:",e),e});return s};let y,S;if(u instanceof Promise)S=!1,y=f(u);else{if(n)return null;S=!0,y=v(u)}const L=m?f(p):y;if(g&&a.default.settings.animationsEnabled){let s=m?2:1;this.messagesQueueOnRenderAdditional=()=>{if(this.log("ship went past rocks of magnets"),--s)return;this.messagesQueueOnRenderAdditional=void 0;(this.animateAsLadder(i,d,m,h,e)||Promise.resolve()).then(()=>{setTimeout(()=>{this.loadMoreHistory(t,!0)},0)})}}else this.messagesQueueOnRenderAdditional=void 0;return t?this.getHistoryTopPromise=L:this.getHistoryBottomPromise=L,L.then(()=>{t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0}),n?null:(!g&&y.then(()=>{let e;t?(this.loadedTopTimes++,this.loadedBottomTimes=Math.max(0,--this.loadedBottomTimes)):(this.loadedBottomTimes++,this.loadedTopTimes=Math.max(0,--this.loadedTopTimes)),(t&&this.loadedTopTimes>2||!t&&this.loadedBottomTimes>2)&&(e=Object(w.e)(this.bubbles));const s=2*l;e&&e.length>s&&(t?(e=e.slice(s),this.setLoaded("bottom",!1)):(e=e.slice(0,e.length-s),this.setLoaded("top",!1)),this.deleteMessagesByIds(e,!1))}),y.then(()=>{"chat"===this.chat.type&&setTimeout(()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)},0)}),{cached:S,promise:y})}setUnreadDelimiter(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);let t=this.appMessagesManager.getReadMaxIdIfUnread(this.peerId,this.chat.threadId);if(t&&(t=Object.keys(this.bubbles).filter(e=>!this.bubbles[e].classList.contains("is-out")).map(e=>+e).sort((e,t)=>e-t).find(e=>e>t),t&&this.bubbles[t])){let s=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==s&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e.maxId&&s.classList.add("is-first-unread"),this.firstUnreadBubble=s,this.attachedUnreadBubble=!0}}deleteEmptyDateGroups(){const e=+!!this.stickyIntersector+1;for(const t in this.dateMessages){const s=this.dateMessages[t];s.container.childElementCount===e&&(s.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(s.container,s.div),delete this.dateMessages[t])}this.checkIfEmptyPlaceholderNeeded()}}function da(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 11 20"),e.setAttributeNS(null,"width","11"),e.setAttributeNS(null,"height","20"),e.classList.add("bubble-tail");const t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS(null,"href","#message-tail-filled"),e.append(t),e}class ha{constructor(e,t,s,n){var r;let l,c,d,h=[],p=[];const u=o.a.canPinMessage(e),m=(a,o,r)=>{setTimeout(()=>{let a;a=s&&!t?u?i.a.unpinAllMessages(e):i.a.hidePinnedMessages(e):i.a.updatePinnedMessage(e,t,s,r,o),n&&a.then(n)},300)};if(s){let s="UnpinMessage";t?(l="UnpinMessageAlertTitle",c="Chat.Confirm.Unpin"):u?(l="Popup.Unpin.AllTitle",c="Chat.UnpinAllMessagesConfirmation",d=[""+((null===(r=i.a.pinnedMessages[e])||void 0===r?void 0:r.count)||1)]):(l="Popup.Unpin.HideTitle",c="Popup.Unpin.HideDescription",s="Popup.Unpin.Hide"),h.push({langKey:s,isDanger:!0,callback:m})}else{l="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(h.push({langKey:t,callback:e=>m(0,!1,!e.size)}),K.a.isBroadcast(e.toChatId())?c="PinMessageAlertChannel":(c="PinMessageAlert",p.push({text:"PinNotify",checked:!0}))):(c="PinMessageAlertChat",e===a.default.myId?h.push({langKey:t,callback:m}):(h.push({langKey:t,callback:e=>m(0,!e.size)}),p.push({text:"PinAlsoFor",textArgs:[new Lt.a({peerId:e}).element],checked:!0})))}Object(ut.a)(h);new gt("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:p}).show()}}function pa(e=window.getSelection()){if(!e||!e.rangeCount)return!0;const t=e.getRangeAt(0);return!t.toString()||!t.START_TO_END}class ua extends gt{constructor(e,t,s,n){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{o.isValid()&&(n&&n(),i.a.reportMessages(e,t,s,o.value).then(e=>{e&&ct({langPackKey:"ReportSentInfo"})}))}}],body:!0});const a=document.createElement("div");Cs({doc:us.getAnimatedEmojiSticker(ua.STICKER_EMOJI),div:a,emoji:ua.STICKER_EMOJI,width:100,height:100,loop:!1,play:!0}).finally(()=>{this.show()}),this.header.append(a);const o=new _.b({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});o.input.addEventListener("input",()=>{this.buttons[0].element.toggleAttribute("disabled",!o.isValid())}),this.body.append(o.container)}}ua.STICKER_EMOJI="👮‍♀️";class ma extends gt{constructor(e,t,s){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const i=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"]];i.forEach(e=>{const t=Object(U.a)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)});const n=us.preloadAnimatedEmojiSticker(ua.STICKER_EMOJI);Object(l.b)(this.body,a=>{const o=Object(Me.a)(a.target,"btn-primary"),r=i[Object(Os.a)(o)][1];n.then(()=>{this.hide(),new ua(e,t,r,s)})},{listenerSetter:this.listenerSetter}),this.body.style.margin="0 -1rem",this.buttonsEl.style.marginTop=".5rem",this.show()}}class ga{constructor(e,t,s,i,n,a,o){this.attachTo=e,this.chat=t,this.appMessagesManager=s,this.appPeersManager=i,this.appPollsManager=n,this.appDocsManager=a,this.appMessagesIdsManager=o,this.onSendScheduledClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionSendNowBtn):new Gs(this.peerId,this.chat.getMidsByMid(this.mid))},this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>{if(pa()){nt((this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort((e,t)=>e-t):[this.mid]).reduce((e,t)=>{const s=this.chat.getMessage(t);return e+((null==s?void 0:s.message)?s.message+"\n":"")},"").trim())}else document.execCommand("copy")},this.onCopyAnchorLinkClick=()=>{nt(this.target.href)},this.onCopyLinkClick=()=>{let e;"discussion"===this.chat.type&&(e=this.appMessagesManager.getMessageByPeer(this.peerId,this.chat.threadId));const t=this.appPeersManager.getPeerUsername(e?e.fromId:this.peerId),s=this.appMessagesIdsManager.getServerMessageId(this.mid);let i,n="https://t.me/";t?(n+=t+"/"+(e?this.appMessagesIdsManager.getServerMessageId(e.fwd_from.channel_post):s),e&&(n+="?comment="+s),i="LinkCopied"):(n+="c/"+this.peerId.toChatId()+"/"+s,e&&(n+="?thread="+this.appMessagesIdsManager.getServerMessageId(e.mid)),i="LinkCopiedPrivateInfo"),lt(x.default.format(i,!0)),nt(n)},this.onPinClick=()=>{new ha(this.peerId,this.mid)},this.onUnpinClick=()=>{new ha(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>{if(this.chat.selection.isSelecting)Object(l.d)(this.chat.selection.selectionForwardBtn);else{const e=this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid);new Ns({[this.peerId]:e})}},this.onSelectClick=()=>{this.chat.selection.toggleByElement(Object(Me.a)(this.target,"grouped-item")||Object(Me.a)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionDeleteBtn):new zs(this.peerId,this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid),this.chat.type)};const r=e=>{let s,i;this.init&&(this.init(),this.init=null);try{i=Object(Me.a)(e.target,"bubble-content-wrapper"),s=i?i.parentElement:Object(Me.a)(e.target,"bubble")}catch(e){}if(!s||s.classList.contains("bubble-first"))return;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),this.element.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+s.dataset.mid;if(!n)return;if(this.isSelectable=this.chat.selection.canSelectBubble(s),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!pa(),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"),t.selection.isSelecting&&!i){const e=this.chat.getMidsByMid(n);if(e.length>1){const t=this.chat.selection.isMidSelected(this.peerId,n)?n:e.find(e=>this.chat.selection.isMidSelected(this.peerId,e));t&&(n=t)}}const a=Object(Me.a)(this.target,"grouped-item");this.isTargetAGroupedItem=!!a,this.mid=a?+a.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=this.chat.getMessage(this.mid),this.buttons.forEach(e=>{let s;t.selection.isSelecting&&!e.withSelection?s=!1:(i||ue.IS_TOUCH_SUPPORTED,s=e.verify()),e.element.classList.toggle("hide",!s)});const o=s.classList.contains("is-in")?"left":"right";Object(te.e)(e.touches?e.touches[0]:e,this.element,o),Object(te.d)(this.element,()=>{this.mid=0,this.peerId=void 0,this.target=null})};ue.IS_TOUCH_SUPPORTED?Object(l.b)(e,e=>{if(t.selection.isSelecting)return;const s=e.target.className;if(!s||!s.includes)return;t.log("touchend",e);["bubble","bubble-content-wrapper","bubble-content","message","time","inner"].find(e=>s.match(new RegExp(e+"($|\\s)")))&&(Object(c.a)(e),r(e))},{listenerSetter:this.chat.bubbles.listenerSetter}):Object(te.a)(e,r,this.chat.bubbles.listenerSetter)}init(){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(()=>{this.appMessagesManager.editMessage(this.message,this.message.message,{scheduleDate:this.chat.input.scheduleDate,entities:this.message.entities}),this.chat.input.onMessageSent(!1,!1)},new Date(1e3*this.message.date))},verify:()=>"scheduled"===this.chat.type},{icon:"reply",text:"Reply",onClick:this.onReplyClick,verify:()=>this.appMessagesManager.canSendToPeer(this.peerId,this.chat.threadId)&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>this.appMessagesManager.canEditMessage(this.message,"text")&&!!this.chat.input.messageInput},{icon:"copy",text:"Copy",onClick:this.onCopyClick,verify:()=>!(!this.message.message||this.isTextSelected||this.isAnchorTarget&&this.message.message===this.target.innerText)},{icon:"copy",text:"Chat.CopySelectedText",onClick:this.onCopyClick,verify:()=>!!this.message.message&&this.isTextSelected},{icon:"copy",text:"Message.Context.Selection.Copy",onClick:this.onCopyClick,verify:()=>{if(!this.isSelected)return!1;for(const[e,t]of this.chat.selection.selectedMids)for(const s of t)if(this.appMessagesManager.getMessageByPeer(e,s).message)return!0;return!1},notDirect:()=>!0,withSelection:!0},{icon:"copy",text:"CopyLink",onClick:this.onCopyAnchorLinkClick,verify:()=>this.isAnchorTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Username",onClick:()=>{nt(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{nt(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>this.appPeersManager.isChannel(this.peerId)&&!this.message.pFlags.is_outgoing},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&this.appPeersManager.canPinMessage(this.peerId)&&"scheduled"!==this.chat.type},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>this.message.pFlags.pinned&&this.appPeersManager.canPinMessage(this.peerId)},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{this.appDocsManager.saveDocFile(this.message.media.document)},verify:()=>{var e;if(this.message.pFlags.is_outgoing)return!1;const t=null===(e=this.message.media)||void 0===e?void 0:e.document;if(!t)return!1;let s=!!ue.IS_TOUCH_SUPPORTED;const i=!t.type||!["gif","video","sticker"].includes(t.type);return i&&(s=s||!!Object(Me.a)(this.target,"document")||!!Object(Me.a)(this.target,"audio")),i&&s}},{icon:"checkretract",text:"Chat.Poll.Unvote",onClick:this.onRetractVote,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return t&&t.chosenIndexes.length&&!t.pFlags.closed&&!t.pFlags.quiz}},{icon:"stop",text:"Chat.Poll.Stop",onClick:this.onStopPoll,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return this.appMessagesManager.canEditMessage(this.message,"poll")&&t&&!t.pFlags.closed&&!this.message.pFlags.is_outgoing}},{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>"scheduled"!==this.chat.type&&!this.message.pFlags.is_outgoing&&"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 ma(this.peerId,[this.mid])},verify:()=>!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&this.appPeersManager.isChannel(this.peerId),notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick,verify:()=>!this.message.action&&!this.isSelected&&this.isSelectable,notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,notDirect:()=>!0,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>this.appMessagesManager.canDeleteMessage(this.message)},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.chat.selection.selectionDeleteBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0}],this.element=Ee(this.buttons,this.chat.bubbles.listenerSetter),this.element.id="bubble-contextmenu",this.element.classList.add("contextmenu"),this.chat.container.append(this.element)}}var ba=s(154),va=s.n(ba),fa=s(145);class ya{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=Ee(this.sendMenuButtons,e.listenerSetter),this.sendMenu.classList.add("menu-send",e.openSide),Object(te.a)(e.onContextElement,t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach(e=>{e.element.classList.toggle("hide",!e.verify())}),Object(c.a)(t),Object(te.d)(this.sendMenu))},e.listenerSetter)}setPeerId(e){this.type=e===a.default.myId?"reminder":"schedule"}}var wa=s(69),Sa=s(90);class La extends ut.b{constructor(e){if(super("popup-create-poll popup-new-media",null,{closable:!0,withConfirm:"Create",body:!0}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,s=Object(ft.a)(t,"LABEL"),i=Object(Sa.a)(t);i||(t.parentElement.classList.add("is-filled"),s.classList.remove("hidden-widget"),s.firstElementChild.removeAttribute("disabled"));!s.nextElementSibling&&!i&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,s=Object(ft.a)(t,"LABEL"),i=Object(Os.a)(s);this.correctAnswers&&this.correctAnswers[0][0]===i&&(this.correctAnswers=void 0),s.remove(),this.optionInputFields.splice(i,1),this.optionInputFields.forEach((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1);x.default.weakMap.get(e.label.firstElementChild).update()}),this.handleChange()},Object(x._i18n)(this.title,"NewPoll"),this.questionInputField=new _.b({placeholder:"AskAQuestion",label:"AskAQuestion",name:"question",maxLength:255}),this.listenerSetter.add(this.questionInputField.input)("input",()=>{this.handleChange()}),this.optionInputFields=[],"scheduled"!==this.chat.type){const e=new ya({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending(()=>{this.send()})},openSide:"bottom-left",onContextElement:this.btnConfirm});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.header.append(this.questionInputField.container);const t=document.createElement("hr"),s=document.createElement("div");s.classList.add("caption"),Object(x._i18n)(s,"PollOptions"),this.questions=document.createElement("form"),this.questions.classList.add("poll-create-questions");const i=document.createElement("div");i.classList.add("poll-create-settings");const n=document.createElement("div");n.classList.add("caption"),Object(x._i18n)(n,"Settings"),this.chat.appPeersManager.isBroadcast(this.chat.peerId)||(this.anonymousCheckboxField=new mt.a({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new mt.a({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new mt.a({text:"NewPoll.Quiz",name:"quiz"}),this.listenerSetter.add(this.multipleCheckboxField.input)("change",()=>{const e=this.multipleCheckboxField.input.checked;this.quizCheckboxField.input.toggleAttribute("disabled",e)}),this.listenerSetter.add(this.quizCheckboxField.input)("change",()=>{const e=this.quizCheckboxField.input.checked;Array.from(this.questions.children).map(t=>{t.classList.toggle("radio-field",e)}),e||(this.correctAnswers=void 0,this.quizSolutionField.setValueSilently("")),a.forEach(t=>t.classList.toggle("hide",!e)),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()}),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const a=[],o=document.createElement("div");o.classList.add("caption"),Object(x._i18n)(o,"AccDescrQuizExplanation");const r=document.createElement("hr"),c=document.createElement("div");c.classList.add("poll-create-questions"),this.quizSolutionField=new _.b({placeholder:"NewPoll.Explanation.Placeholder",label:"NewPoll.Explanation.Placeholder",name:"solution",maxLength:200}),this.listenerSetter.add(this.questionInputField.input)("input",()=>{this.handleChange()});const d=document.createElement("div");d.classList.add("subtitle"),Object(x._i18n)(d,"AddAnExplanationInfo"),c.append(this.quizSolutionField.container,d),a.push(r,o,c),a.forEach(e=>e.classList.add("hide")),this.body.parentElement.insertBefore(t,this.body),this.body.append(s,this.questions,document.createElement("hr"),n,i,...a),Object(l.b)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new T.b(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}getFilledAnswers(){return Array.from(this.questions.children).map((e,t)=>{const s=e.querySelector(".input-field-input");return s instanceof HTMLInputElement?s.value:Object(wa.a)(s,!1).value}).filter(e=>!!e.trim())}validate(){var e;const t=this.questionInputField.value;if(!t)return!1;if(t.length>255)return!1;if(this.quizCheckboxField.input.checked&&!(null===(e=this.correctAnswers)||void 0===e?void 0:e.length))return!1;const s=this.getFilledAnswers();if(s.length<2)return!1;if(s.find(e=>e.length>100))return!1;const{value:i}=Object(wa.a)(this.quizSolutionField.input,!1);return!(i.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){const t=this.questionInputField.value,s=this.getFilledAnswers(),{value:i,entities:n}=Object(wa.a)(this.quizSolutionField.input);if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending(()=>{this.send(!0)});this.hide();const a={};this.anonymousCheckboxField&&!this.anonymousCheckboxField.input.checked&&(a.public_voters=!0),this.multipleCheckboxField.input.checked&&(a.multiple_choice=!0),this.quizCheckboxField.input.checked&&(a.quiz=!0);const o={_:"poll",pFlags:a,question:t,answers:s.map((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])})),id:void 0},r=this.chat.appPollsManager.getInputMediaPoll(o,this.correctAnswers,i,n);this.chat.appMessagesManager.sendOther(this.chat.peerId,r,{threadId:this.chat.threadId,replyToMsgId:this.chat.input.replyToMsgId,scheduleDate:this.chat.input.scheduleDate,silent:this.chat.input.sendSilent}),"reply"===this.chat.input.helperType&&this.chat.input.clearHelper(),this.chat.input.onMessageSent(!1,!1)}appendMoreField(){const e=this.tempId++,t=this.questions.childElementCount+1,s=new _.b({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(s.input)("input",this.onInput);const i=new ot({text:"",name:"question"});i.main.append(s.container),Object(l.b)(s.input,c.a,{listenerSetter:this.listenerSetter}),i.label.classList.add("hidden-widget"),i.input.disabled=!0,this.quizCheckboxField.input.checked||i.label.classList.remove("radio-field"),this.listenerSetter.add(i.input)("change",()=>{if(i.input.checked){const e=Object(Os.a)(i.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}});const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),s.container.append(n),Object(l.b)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(i.label),this.scrollable.scrollIntoViewNew(this.questions.lastElementChild,"center"),this.optionInputFields.push(s)}}var Ea=s(100);function Ca(e){const t=e.src;return fetch(t).then(e=>e.arrayBuffer()).then(e=>{const t=new Uint8Array(e);let s=0;for(let e=0,i=t.length;e{const t=e.target;if(t!==this.input){if("INPUT"===t.tagName||t.hasAttribute("contenteditable"))return;this.input.focus(),Object(Ea.a)(this.input)}},this.attachFile=e=>{const t=this.willAttach,s=this.shouldCompress(e.type),i={};i.file=e;const n=document.createElement("div");n.classList.add("popup-item"),i.itemDiv=n;const a=s?this.attachMedia(e,i,n):this.attachDocument(e,i,n);return t.sendFileDetails.push(i),a},this.willAttach={type:s,sendFileDetails:[],group:!1},Object(l.b)(this.btnConfirm,()=>this.send(),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new ya({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 T.b(null);i.container.append(this.mediaContainer),this.inputField=new _.b({placeholder:"PreviewSender.CaptionPlaceholder",label:"Caption",name:"photo-caption",maxLength:a.default.config.caption_length_max}),this.input=this.inputField.input,this.inputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value="",this.body.append(i.container),this.container.append(this.inputField.container),this.attachFiles(),this.addEventListener("close",()=>{this.files=[],Ia=void 0}),Ia=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 mt.a({text:"PreviewSender.GroupItems",name:"group-items"}),this.container.append(...[this.groupCheckboxField.label,null===(e=this.mediaCheckboxField)||void 0===e?void 0:e.label,this.inputField.container].filter(Boolean)),this.willAttach.group=!0,this.groupCheckboxField.setValueSilently(this.willAttach.group),this.listenerSetter.add(this.groupCheckboxField.input)("change",()=>{const e=this.groupCheckboxField.checked;this.willAttach.group=e,this.attachFiles()})):this.groupCheckboxField&&this.groupCheckboxField.label.classList.toggle("hide",!t)}appendMediaCheckboxField(){var e;const t=!!this.files.find(e=>m.has(e.type));t&&!this.mediaCheckboxField?(this.mediaCheckboxField=new mt.a({text:"PreviewSender.CompressFile",name:"compress-items"}),this.container.append(...[null===(e=this.groupCheckboxField)||void 0===e?void 0:e.label,this.mediaCheckboxField.label,this.inputField.container].filter(Boolean)),this.mediaCheckboxField.setValueSilently("media"===this.willAttach.type),this.listenerSetter.add(this.mediaCheckboxField.input)("change",()=>{const e=this.mediaCheckboxField.checked;this.willAttach.type=e?"media":"document",this.attachFiles()})):this.mediaCheckboxField&&this.mediaCheckboxField.label.classList.toggle("hide",!t)}addFiles(e){const t=e.filter(e=>!this.files.find(t=>t.lastModified===e.lastModified&&t.name===e.name&&t.size===e.size));t.length&&(this.files.push(...t),this.attachFiles())}send(e=!1){if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending(()=>{this.send(!0)});let t=this.inputField.value;if(t.length>a.default.config.caption_length_max)return void lt(x.default.format("Error.PreviewSender.CaptionTooLong",!0));this.hide();const s=this.willAttach;s.isMedia="media"===s.type||void 0;const{sendFileDetails:i,isMedia:n}=s,{peerId:o,input:r}=this.chat,{sendSilent:l,scheduleDate:c}=r;i.forEach(e=>{e.itemDiv=void 0});const{length:d}=i,h=r.replyToMsgId;this.iterate(e=>{t&&e.length!==d&&(this.chat.appMessagesManager.sendText(o,t,{replyToMsgId:h,threadId:this.chat.threadId,silent:l,scheduleDate:c,clearDraft:!0}),t=void 0);const i=Object.assign(Object.assign({},s),{sendFileDetails:e});this.chat.appMessagesManager.sendAlbum(o,i.sendFileDetails.map(e=>e.file),Object.assign({caption:t,replyToMsgId:h,threadId:this.chat.threadId,isMedia:n,silent:l,scheduleDate:c,clearDraft:!0},i)),t=void 0}),r.replyToMsgId=this.chat.threadId,r.onMessageSent()}attachMedia(e,t,s){s.classList.add("popup-item-media");let i;if(e.type.startsWith("video/")){const n=document.createElement("video"),a=document.createElement("source");a.src=t.objectURL=URL.createObjectURL(e),n.autoplay=!0,n.controls=!1,n.muted=!0,n.setAttribute("playsinline","true"),n.addEventListener("timeupdate",()=>{n.pause()},{once:!0}),i=Object(me.e)(n).then(()=>{t.width=n.videoWidth,t.height=n.videoHeight,t.duration=Math.floor(n.duration);const e=n.webkitAudioDecodedByteCount;return void 0!==e&&(t.noSound=!e),s.append(n),Object(me.c)(n).then(e=>{t.thumb=Object.assign({url:URL.createObjectURL(e.blob)},e)})}),n.append(a)}else{const n=new Image;i=new Promise(i=>{n.onload=()=>{t.width=n.naturalWidth,t.height=n.naturalHeight,s.append(n),"image/gif"===e.type?(t.noSound=!0,Promise.all([Ca(n).then(e=>{t.duration=Math.ceil(e)}),Object(me.b)(n).then(e=>{t.thumb=Object.assign({url:URL.createObjectURL(e.blob)},e)})]).then(()=>{i()})):i()}}),n.src=t.objectURL=URL.createObjectURL(e)}return i}attachDocument(e,t,s){s.classList.add("popup-item-document");const i=e.type.startsWith("image/"),n=e.type.startsWith("audio/");(i||n)&&(t.objectURL=URL.createObjectURL(e));const a={_:"document",file:e,file_name:e.name||"",fileName:e.name?J.b.wrapEmojiText(e.name):"",size:e.size,type:i?"photo":"doc"},o=he.a.getCacheContext(a);o.url=t.objectURL,o.downloaded=e.size;const r=Ss({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:a}}});return new Promise(e=>{const n=()=>{s.append(r),e()};if(i){const e=new Image;e.src=t.objectURL,e.onload=()=>{t.width=e.naturalWidth,t.height=e.naturalHeight,n()},e.onerror=n}else n()})}shouldCompress(e){return"media"===this.willAttach.type&&m.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),this.addEventListener("close",()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)}),this.show())}setTitle(){const{willAttach:e,title:t,files:s}=this;let i;const n=[];if("document"===e.type)i="PreviewSender.SendFile",n.push(s.length);else{let e=0,t=0,a=0;s.forEach(s=>{s.type.startsWith("image/")?++e:s.type.startsWith("video/")?++t:++a}),[e,t,a].filter(e=>e>0).length>1?(i="PreviewSender.SendFile",n.push(s.length)):e?(i="PreviewSender.SendPhoto",n.push(e)):t&&(i="PreviewSender.SendVideo",n.push(t))}Object(k.a)(t,Object(x.i18n)(i,n))}appendMediaToContainer(e,t){if(this.shouldCompress(t.file.type)){const s=Object(Un.a)(t.width,t.height,380,320);e.style.width=s.width+"px",e.style.height=s.height+"px"}this.mediaContainer.append(e)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach(t=>e([t]));const s=t.length;for(let i=0;i{s.innerHTML="",e.length&&(this.setTitle(),this.iterate(e=>{if(this.shouldCompress(e[0].file.type)&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map(e=>e.itemDiv)),Ps({container:t,items:e.map(e=>({w:e.width,h:e.height})),maxWidth:380,minWidth:100,spacing:4}),s.append(t)}else e.forEach(e=>{this.appendMediaToContainer(e.itemDiv,e)})}))}).then(()=>{this.onRender()})}}const Ta=["ArrowUp","ArrowDown"],ka=["ArrowLeft","ArrowRight"];function xa({list:e,type:t,onSelect:s,once:i,waitForKey:n}){const a=new Set("xy"===t?Ta.concat(ka):"x"===t?ka:Ta);let o;const r=()=>o||e.querySelector(".active")||e.firstElementChild,d=(e,s)=>{if(o===e)return;let i=!1;o&&(i=!0,o.classList.remove("active")),o=e,o&&(o.classList.add("active"),i&&m&&s&&Object(wt.b)(m,o,"center",void 0,void 0,void 0,100,"x"===t?"x":"y"))},h=(t,s)=>{let i;return i=s?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,i};let p;p="xy"===t?(t,s)=>"ArrowUp"===s||"ArrowDown"===s?((t,s)=>{const i=s?"nextElementSibling":"previousElementSibling",n=s?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[i]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[i]||e[n]}return o})(t,"ArrowDown"===s):h(t,"ArrowRight"===s):(e,t)=>h(e,"ArrowRight"===t||"ArrowDown"===t);let u=s=>{const i=s.key;if(a.has(i)){if(Object(c.a)(s),e.childElementCount>1){let e=r();e=p(e,i),d(e,!0)}}else("Enter"===i||"xy"!==t&&"Tab"===i)&&(Object(c.a)(s),v(r()))};const m=Object(Me.a)(e,"scrollable");e.classList.add("navigable-list");const g=t=>{const s=Object(qs.a)(t.target,e);s&&d(s,!1)},b=t=>{Object(c.a)(t);const s=Object(qs.a)(t.target,e);s&&(d(s,!1),v(r()))},v=e=>{const t=s(e);(void 0!==t?!t:i)&&f()},f=()=>{document.removeEventListener("keydown",u,{capture:!0}),e.removeEventListener("mousemove",g),Object(l.c)(e,b)},y=()=>{n||d(e.firstElementChild,!1)};if(n){const e=u;u=t=>{t.key===n&&(Object(c.a)(t),document.removeEventListener("keydown",u,{capture:!0}),u=e,document.addEventListener("keydown",u,{capture:!0,passive:!1}),n=void 0,y())}}else y();return document.addEventListener("keydown",u,{capture:!0,passive:!1}),e.addEventListener("mousemove",g,{passive:!0}),Object(l.b)(e,b),{detach:f,resetTarget:y}}class Oa extends B.a{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{detach:t,resetTarget:s}=xa({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.detach=t,this.resetTarget=s,re.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},j.a.pushItem(this.navigationItem)),this.addEventListener("hidden",()=>{this.resetTarget=void 0,this.detach=void 0,e.innerHTML="",t(),this.navigationItem&&(j.a.removeItem(this.navigationItem),this.navigationItem=void 0)},{once:!0})},Object(w.g)(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.addHelper(this)}attachNavigation(){this.addEventListener("visible",this.onVisible)}toggle(e,t=!1){this.init||(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden!==e?(this.hidden=e,e?(this.navigationItem&&(j.a.removeItem(this.navigationItem),this.navigationItem=void 0),t||this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller.hideOtherHelpers(this),this.dispatchEvent("visible")),Object(Jt.a)(this.container,"is-visible",!e,a.default.settings.animationsEnabled?200:0,()=>{this.hidden&&this.dispatchEvent("hidden")})):e||this.dispatchEvent("visible"))}}class Aa extends Oa{constructor(e,t){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>!sa.onMediaClick({target:e},!0),waitForKey:"ArrowUp"}),this.container.classList.add("stickers-helper"),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0),a.default.dispatchEvent("choosing_sticker",!0)}),this.addEventListener("hidden",()=>{this.onChangeScreen&&(b.b.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0),a.default.dispatchEvent("choosing_sticker",!1)})}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),us.preloadAnimatedEmojiSticker(e),us.getStickersByEmoticon(e).then(e=>{if(!t())return;this.init&&(this.init(),this.init=null);const s=this.list.cloneNode();let i;this.lazyLoadQueue.clear(),i=e.length?new Promise(t=>{const i=[];e.forEach(e=>{s.append(this.superStickerRenderer.renderSticker(e,void 0,i))}),Promise.all(i).finally(t)}):Promise.resolve(),i.then(()=>{this.list.replaceWith(s),this.list=s,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*b.b.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},b.b.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!e.length),this.scrollable.scrollTop=0})})}init(){this.list=document.createElement("div"),this.list.classList.add("stickers-helper-stickers","super-stickers"),this.container.append(this.list),this.scrollable=new T.b(this.container),this.lazyLoadQueue=new ee.d,this.superStickerRenderer=new Gn(this.lazyLoadQueue,Xo)}}const _a=()=>{const e=new Date;return e.setHours(0,0,0,0),e},Fa=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class Da extends bn{constructor(e,t,s){var i;if(super((i=e).getTime()>Fa().getTime()?new Date:i,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:_a(),maxDate:Fa(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),s){const e=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),Object(l.b)(e,()=>{t(2147483646),this.hide()})}}}var ja=s(142),Ba=s(86);function Ra(e,t=!0){const s=[],i=[],n=window.getSelection();let a,o;if(n&&n.rangeCount){const t=n.getRangeAt(0),s=t.startOffset;if(t.startContainer&&t.startContainer==t.endContainer&&s==t.endOffset){const i=s-1,n=e.childNodes;if(t.startContainer===e&&n[i]){a=n[i],o=0;for(let e=0;e{s.onEmojiSelected(Bn(e),!0)}}),this.appEmojiManager=i,this.container.classList.add("emoji-helper")}init(){this.list=document.createElement("div"),this.list.classList.add("emoji-helper-emojis","super-emojis"),this.container.append(this.list),this.scrollable=new T.a(this.container),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollLeft=0},0)})}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}(e=e.slice(0,80)).length&&(this.list.innerHTML="",e.forEach(e=>{jn(e,this.list,!1,!0)})),this.waitForKey=t?"ArrowUp":void 0,this.toggle(!e.length)}checkQuery(e,t){const s=this.controller.getMiddleware();this.appEmojiManager.getBothEmojiKeywords().then(()=>{if(!s())return;const i=e.replace(/^:/,""),n=this.appEmojiManager.searchEmojis(i);this.render(n,":"!==t)})}}class Ha extends Oa{constructor(e,t,s,i){super({appendTo:e,controller:t,listType:"y",onSelect:i}),this.className=s,this.container.classList.add(Ha.BASE_CLASS,s)}init(){this.list=document.createElement("div"),this.list.classList.add(Ha.BASE_CLASS+"-list"),this.container.append(this.list),this.scrollable=new T.b(this.container),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0)})}render(e){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach(e=>{const t=Ha.listElement({className:this.className,peerId:e.peerId,name:e.name,description:e.description});this.list.append(t)})),this.toggle(!e.length)}static listElement(e){const t=Ha.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const s=document.createElement("div");s.classList.add(t,e.className),s.dataset.peerId=""+e.peerId;const i=new ur;i.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),i.setAttribute("dialog","0"),i.setAttribute("peer",""+e.peerId);const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?n.innerHTML=J.b.wrapEmojiText(e.name):n.append(new Lt.a({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),s.append(i,n),e.description){const i=document.createElement("div");i.classList.add(t+"-description",e.className+"-description"),i.innerHTML=J.b.wrapEmojiText(e.description),s.append(i)}return s}}Ha.BASE_CLASS="autocomplete-peer-helper",Ha.BASE_CLASS_LIST_ELEMENT=Ha.BASE_CLASS+"-list-element";class Na extends Ha{constructor(e,t,s,i,n){super(e,t,"commands-helper",e=>{const t=e.querySelector(`.${Ha.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return s.getReadyToSend(()=>{s.messageInput.innerHTML=t,s.sendMessage(!0)})}),this.appProfileManager=i,this.appUsersManager=n}checkQuery(e,t){if(!this.appUsersManager.isBot(t))return!1;const s=this.controller.getMiddleware();return this.appProfileManager.getProfileByPeerId(t).then(t=>{if(!s())return;const i=[].concat(t.bot_info),n=new Pn.a({ignoreCase:!0}),a=new Map;i.forEach(e=>{e.commands.forEach(t=>{const s="/"+t.command;a.set(t.command,{peerId:e.user_id.toPeerId(!1),name:s,description:t.description}),n.indexObject(t.command,s)})});const o=n.search(e),r=Array.from(o).map(e=>a.get(e));this.render(r)}),!0}}class za{constructor(){this.helpers=new Set,this.middleware=Object(xs.a)()}getMiddleware(){return this.middleware.clean(),this.middleware.get()}addHelper(e){this.helpers.add(e)}hideOtherHelpers(e){this.helpers.forEach(t=>{t!==e&&t.toggle(!0,!0)}),e||this.middleware.clean()}}class Va extends Ha{constructor(e,t,s,i,n){super(e,t,"mentions-helper",e=>{const t=n.getUser(e.dataset.peerId.toUserId());let i,a="";t.username?a="@"+t.username:(a=t.first_name||t.last_name,i={_:"messageEntityMentionName",length:a.length,offset:0,user_id:t.id}),a+=" ",s.insertAtCaret(a,i)}),this.appProfileManager=i,this.appUsersManager=n}checkQuery(e,t,s){const i=e.trim();if(e.length!==i.length)return!1;const n=this.controller.getMiddleware();return this.appProfileManager.getMentions(t&&t.toChatId(),i,s).then(e=>{if(!n())return;const t=i.slice(1).toLowerCase();this.render(e.map(e=>{const s=this.appUsersManager.getUser(e);if(!s.username||s.username.toLowerCase()!==t)return{peerId:e,description:s.username?"@"+s.username:void 0}}).filter(Boolean))}),!0}}var Ga=s(4);class Ka extends Zn{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;Object(qs.a)(t,this.element)||t===this.btnHover||(Object(c.a)(e),this.toggle(!1))},Object(w.g)(this,e),this.element.classList.add(Ka.BASE_CLASS),this.element.style.display="none",this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(a.default)("history_reply_markup",({peerId:e})=>{this.peerId===e&&(this.checkAvailability()&&this.isActive()&&this.render(),Object(ks.c)().then(()=>{this.checkForceReply()}))})}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",()=>{this.render(),ue.IS_TOUCH_SUPPORTED&&(this.touchListener=this.listenerSetter.add(document.body)("touchstart",this.onBodyTouchStart,{passive:!1,capture:!0}),this.listenerSetter.add(this)("close",()=>{this.listenerSetter.remove(this.touchListener)},{once:!0}))}),this.listenerSetter.add(this.element)("click",e=>{const t=Object(Me.a)(e.target,"btn");t&&(this.appMessagesManager.sendText(this.peerId,t.dataset.text),this.toggle(!1))}),super.init()}checkForceReply(){const e=this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}getReplyMarkup(){var e;return null!==(e=this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide"}}render(e=this.getReplyMarkup()){this.element.innerHTML="";for(const t of e.rows){const e=document.createElement("div");e.classList.add(Ka.BASE_CLASS+"-row");for(const s of t.buttons){const t=document.createElement("button");t.classList.add(Ka.BASE_CLASS+"-button","btn"),t.innerHTML=J.b.wrapEmojiText(s.text),t.dataset.text=s.text,e.append(t)}this.element.append(e)}}checkAvailability(e=this.getReplyMarkup()){var t;const s="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",s),s&&this.toggle(!1),!s}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}Ka.BASE_CLASS="reply-keyboard";var Wa=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class qa extends Oa{constructor(e,t,s,i,n){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>{const{peerId:t,botId:s,queryId:i}=this.list.dataset;return this.chat.input.getReadyToSend(()=>{const n=this.appInlineBotsManager.generateQId(i,e.dataset.resultId);this.appInlineBotsManager.sendInlineResult(t.toPeerId(),s,n,{clearDraft:!0,scheduleDate:this.chat.input.scheduleDate,silent:this.chat.input.sendSilent,replyToMsgId:this.chat.input.replyToMsgId}),this.chat.input.onMessageSent(!0,!0)})}}),this.chat=s,this.appUsersManager=i,this.appInlineBotsManager=n,this._checkQuery=(e,t,s)=>Wa(this,void 0,void 0,(function*(){const i=this.controller.getMiddleware(),n=yield this.appUsersManager.resolveUsername(t);if(!i())throw"PEER_CHANGED";if("user"!==n._)throw"NOT_A_BOT";const a=this.appInlineBotsManager.getInlineResults(e,n.id,s).then(t=>{var s;if(!i())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const a=this.list.cloneNode();a.dataset.peerId=""+e,a.dataset.botId=""+n.id,a.dataset.queryId=""+t.query_id;const o=new Nn(null,"INLINE-HELPER",this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],c=!!t.pFlags.gallery;for(const e of t.results){const t=document.createElement("div");t.classList.add("inline-helper-result"),t.dataset.resultId=e.id;const n=c?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),a.append(t),c)t.classList.add("grid-item");else{n.classList.add("empty"),n.innerHTML=J.b.wrapEmojiText([...e.title.trim()][0]);const s=document.createElement("div");s.classList.add("inline-helper-result-title"),s.innerHTML=J.b.wrapEmojiText(e.title);const i=document.createElement("div");i.classList.add("inline-helper-result-description"),i.innerHTML=J.b.wrapRichText(e.description,{noCommands:!0,noLinks:!0}),t.append(s,i);const o=document.createElement("div");o.classList.add("inline-helper-separator"),a.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let s;n?(s=document.createElement("div"),n.append(s)):s=t,s.classList.add("media-container"),c&&s.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>he.a.download({dcId:4,location:{_:"inputWebFileLocation",access_hash:e.thumb.access_hash,url:e.thumb.url},size:e.thumb.size,mimeType:e.thumb.mime_type}).then(e=>{const t=new Image;t.classList.add("media-photo"),Object(ne.b)(e).then(e=>{Es(s,t,e,!0)})})})}}else{const a=e.document||e.photo;if(["sticker","gif"].includes(null===(s=a)||void 0===s?void 0:s.type)&&c)Object(Hi.a)(a),"gif"===a.type?o.add(a,t):"sticker"===a.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(a,t,r),2===a.sticker&&this.superStickerRenderer.observeAnimatedDiv(t));else if(a){const e=c?48:void 0;c&&t.classList.add("no-border-radius"),Ls({photo:a,container:c?t:n,boxWidth:e,boxHeight:e,middleware:i,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then(()=>{if(!i())return void o.clear();a.classList.toggle("is-gallery",c),a.classList.toggle("super-stickers",c),this.container.classList.toggle("is-gallery",c);const s=this.list.parentElement;if(s.textContent="",t.switch_pm){const i=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary");i.insertAdjacentHTML("beforeend",J.b.wrapEmojiText(t.switch_pm.text)),Object(l.b)(i,s=>{this.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)}),s.append(i)}s.append(this.list=a),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=o,o.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*b.b.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},b.b.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0})});return{user:n,renderPromise:a}})),this.container.classList.add("inline-helper"),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0)}),this.checkQuery=dt(this._checkQuery,200,!0,!0),this.addEventListener("hidden",()=>{this.onChangeScreen&&(b.b.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0)})}init(){this.list=document.createElement("div"),this.list.classList.add("inline-helper-results"),this.container.append(this.list),this.scrollable=new T.b(this.container),this.lazyLoadQueue=new ee.d,this.superStickerRenderer=new Gn(this.lazyLoadQueue,"INLINE-HELPER")}}var Qa=s(3);class $a{constructor(e,t,s,i,n,o,r,d,h,p,u,m,g,b){this.chat=e,this.appMessagesManager=t,this.appMessagesIdsManager=s,this.appDocsManager=i,this.appChatsManager=n,this.appPeersManager=o,this.appWebPagesManager=r,this.appImManager=d,this.appDraftsManager=h,this.serverTimeManager=p,this.appNotificationsManager=u,this.appEmojiManager=m,this.appUsersManager=g,this.appInlineBotsManager=b,this.lastUrl="",this.lastTimeType=0,this.replyElements={},this.willSendWebPage=null,this.recording=!1,this.recordCanceled=!1,this.recordStartTime=0,this.lockRedo=!1,this.canRedoFromHTML="",this.undoHistory=[],this.executedHistory=[],this.canUndoFromHTML="",this.onCancelRecordClick=e=>{e&&Object(c.a)(e),this.recordCanceled=!0,this.recorder.stop(),fa.a.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=ue.IS_TOUCH_SUPPORTED?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=ue.IS_TOUCH_SUPPORTED?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>{const{peerId:s}=this.chat,i=this.chat.bubbles.getMiddleware(),n=a.default.myId!==s&&s.isUser()&&this.appUsersManager.isUserOnlineVisible(s);new Da(t,t=>{if(!i())return;t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout(()=>{i()&&this.appImManager.openScheduled(s)},0)},n).show()},this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,s)=>{Object(c.a)(e);let i=this.messageInput.innerHTML;if(i&&i!==s){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const s=this.messageInput.innerHTML;if(i===s){if(++e>2)break}else e=0;i=s}while(i!==s);this.lockRedo=!1}},this.handleMarkdownShortcut=e=>{const t={KeyB:"bold",KeyI:"italic",KeyU:"underline",KeyS:"strikethrough",KeyM:"monospace"};this.appImManager.markupTooltip&&(t.KeyK="link");const s=e.code,i=t[s];if(document.getSelection().toString().trim().length&&i&&("KeyK"===s?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(i),Object(c.a)(e)),"KeyZ"===s){let t=this.messageInput.innerHTML;e.shiftKey?this.undoHistory.length&&(this.executedHistory.push(t),t=this.undoHistory.pop(),this.undoRedo(e,"redo",t),t=this.messageInput.innerHTML,this.canRedoFromHTML=this.undoHistory.length?t:"",this.canUndoFromHTML=t):!this.executedHistory.length||this.canUndoFromHTML&&t!==this.canUndoFromHTML||(this.undoHistory.push(t),t=this.executedHistory.pop(),this.undoRedo(e,"undo",t),this.canUndoFromHTML=this.canRedoFromHTML=this.messageInput.innerHTML)}},this.onMessageInput=e=>{var t;const{value:s,entities:i,caretPos:n}=Ra(this.messageInputField.input),a=J.b.parseMarkdown(s,i,!0),o=J.b.mergeEntities(i,J.b.parseEntities(a));this.canRedoFromHTML&&!this.lockRedo&&this.messageInput.innerHTML!==this.canRedoFromHTML&&(this.canRedoFromHTML="",this.undoHistory.length=0);const r=!(null===(t=this.editMessage)||void 0===t?void 0:t.media)&&o.filter(e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._);if(r.length)for(const e of r){let t;if("messageEntityTextUrl"===e._)t=e.url;else if(t=s.slice(e.offset,e.offset+e.length),!t.includes("http://")&&!t.includes("https://"))continue;if(this.lastUrl!==t){this.lastUrl=t;const e=this.getWebPagePromise=ht.a.invokeApiHashable("messages.getWebPage",{url:t}).then(s=>{s=this.appWebPagesManager.saveWebPage(s),this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===s._?(this.setTopInfo("webpage",()=>{},s.site_name||s.title||"Webpage",s.description||s.url||""),delete this.noWebPage,this.willSendWebPage=s):this.willSendWebPage&&this.onHelperCancel())})}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(s.trim()){const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"}))}else this.lastTimeType&&this.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"}),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide();this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(s,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{this.insertAtCaret(e,J.b.getEmojiEntityFromEmoji(e),t)},this.onBtnSendClick=e=>{if(Object(c.a)(e),!this.recorder||this.recording||!this.isInputEmpty()||this.forwarding||this.editMsgId)this.recording?Date.now()-this.recordStartTime<500?this.onCancelRecordClick():this.recorder.stop():this.sendMessage();else{if(this.chat.peerId.isAnyChat()&&!this.appMessagesManager.canSendToPeer(this.chat.peerId,this.chat.threadId,"send_media"))return void lt("Posting media content isn't allowed in this group.");this.chatInput.classList.add("is-locked"),Object(Ks.a)(),this.recorder.start().then(()=>{this.releaseMediaPlayback=fe.setSingleMedia(),this.recordCanceled=!1,this.chatInput.classList.add("is-recording"),this.recording=!0,this.updateSendBtn(),fa.a.setKeepAlive(!0);const e=()=>{new gt("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{Object(l.d)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",t=>{Object(Me.a)(t.target,"chat-input")||Object(Me.a)(t.target,"popup-cancel-record")||(Object(c.a)(t),e())},{capture:!0,passive:!1}),j.a.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout(()=>{e()},0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,s=t.context.createAnalyser();t.connect(s),s.fftSize=32;const i=new Uint8Array(s.frequencyBinCount),n=255*i.length;let a=()=>{if(!this.recording)return;s.getByteFrequencyData(i);let e=0;i.forEach(t=>{e+=t});let t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;let o=Date.now()-this.recordStartTime,r=o%1e3,l=(""+o/1e3).toHHMMSS()+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=l,Object(De.b)(a)};a()}).catch(e=>{switch(e.name){case"NotAllowedError":lt("Please allow access to your microphone");break;case"NotReadableError":lt(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),lt(e.message)}this.chatInput.classList.remove("is-recording","is-locked")})}},this.onHelperCancel=(e,t)=>{if(e&&Object(c.a)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(this.helperFunc(),t=!0),this.lastUrl=e,this.noWebPage=!0,this.willSendWebPage=null,t)return}if("edit"===this.helperType&&!t){const e=this.editMessage,t=J.b.parseMarkdown(this.messageInputField.value,[]);if(e.message!==t)return void new gt("discard-editing",{buttons:[{langKey:"Alert.Confirm.Discard",callback:()=>{this.onHelperCancel(void 0,!0)}}],descriptionLangKey:"Chat.Edit.Cancel.Text"}).show()}this.clearHelper(),this.updateSendBtn()},this.onHelperClick=e=>{if(Object(c.a)(e),Object(Me.a)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&ue.IS_TOUCH_SUPPORTED&&!e.container.classList.contains("active")&&Object(te.d)(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new R.a}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input"),this.chatInput.style.display="none",this.inputContainer=document.createElement("div"),this.inputContainer.classList.add("chat-input-container"),this.rowsWrapper=document.createElement("div"),this.rowsWrapper.classList.add("rows-wrapper","chat-input-wrapper");const e=da();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const s=document.createElement("div");s.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapper,t,s),this.chatInput.append(this.inputContainer),this.goDownBtn=Q({icon:"arrow_down",className:"bubbles-corner-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),Object(l.b)(this.goDownBtn,e=>{Object(c.a)(e),this.chat.bubbles.onGoDownClick()},{listenerSetter:this.listenerSetter})}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=H(""),this.replyElements.cancelBtn=H("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>(i=!0,this.canToggleHideAuthor()),t=()=>{i=!1},s=this.forwardElements={};let i=!1;const n=[s.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkboxField:new mt.a({checked:!0})},s.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new mt.a({checked:!1})},s.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new mt.a({checked:!0})},s.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new mt.a({checked:!1})},s.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],o=s.container=Ee(n,this.listenerSetter),r=Array.from(o.children);if([{elements:r.slice(0,2),onChange:(e,t)=>{const n=!!+e;i&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=x.default.weakMap.get(e),i=s.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=i,t.update()}}},{elements:r.slice(2,4),onChange:e=>{const t=!!+e;let i;i=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?s.hideSender:s.showSender:t?s.showSender:s.hideSender,i.checkboxField.checked=!0}}].forEach(e=>{const t=tt(e.elements.map(e=>({container:e,input:e.querySelector("input")})),e.onChange),s=document.createElement("hr");t.append(s),o.append(t)}),o.append(s.changePeer.element),!ue.IS_TOUCH_SUPPORTED){this.forwardHover=new Zn({element:o})}s.modifyArgs=n.slice(0,-1),this.replyElements.container.append(o),s.modifyArgs.forEach((e,t)=>{const{input:s}=e.checkboxField;s.type="radio",s.name=t<2?"author":"caption",s.value=""+ +!(t%2)}),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.btnToggleEmoticons=H("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),"chat"===this.chat.type&&(this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=Q({icon:"mention",className:"bubbles-corner-button bubbles-go-mention"}),this.goMentionUnreadBadge=document.createElement("span"),this.goMentionUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goMentionBtn.append(this.goMentionUnreadBadge),this.inputContainer.append(this.goMentionBtn),Object(l.b)(this.goMentionBtn,e=>{Object(c.a)(e),this.appMessagesManager.goToNextMention(this.chat.peerId)},{listenerSetter:this.listenerSetter}),this.btnScheduled=H("scheduled btn-scheduled float hide",{noRipple:!0}),Object(l.b)(this.btnScheduled,e=>{this.appImManager.openScheduled(this.chat.peerId)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("scheduled_new",({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")}),this.listenerSetter.add(a.default)("scheduled_delete",({peerId:e})=>{this.chat.peerId===e&&this.appMessagesManager.getScheduledMessages(this.chat.peerId).then(e=>{this.btnScheduled.classList.toggle("hide",!e.length)})}),this.btnToggleReplyMarkup=H("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new Ka({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,appMessagesManager:this.appMessagesManager,btnHover:this.btnToggleReplyMarkup,chatInput:this}),this.listenerSetter.add(this.replyKeyboard)("open",()=>this.btnToggleReplyMarkup.classList.add("active")),this.listenerSetter.add(this.replyKeyboard)("close",()=>this.btnToggleReplyMarkup.classList.remove("active"))),this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...m].join(", ");this.fileInput.setAttribute("accept",e),this.willAttachType="media",this.fileInput.click()},verify:(e,t)=>this.appMessagesManager.canSendToPeer(e,t,"send_media")},{icon:"document",text:"Chat.Input.Attach.Document",onClick:()=>{this.fileInput.value="",this.fileInput.removeAttribute("accept"),this.willAttachType="document",this.fileInput.click()},verify:(e,t)=>this.appMessagesManager.canSendToPeer(e,t,"send_media")},{icon:"poll",text:"Poll",onClick:()=>{new La(this.chat).show()},verify:(e,t)=>e.isAnyChat()&&this.appMessagesManager.canSendToPeer(e,t,"send_polls")}],this.attachMenu=Ie({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.btnToggleEmoticons,this.inputMessageContainer,this.btnScheduled,this.btnToggleReplyMarkup,this.attachMenu,this.recordTimeEl,this.fileInput].filter(Boolean)),this.rowsWrapper.append(this.replyElements.container),this.autocompleteHelperController=new za,this.stickersHelper=new Aa(this.rowsWrapper,this.autocompleteHelperController),this.emojiHelper=new Ua(this.rowsWrapper,this.autocompleteHelperController,this,this.appEmojiManager),this.commandsHelper=new Na(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.mentionsHelper=new Va(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.inlineHelper=new qa(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.appUsersManager,this.appInlineBotsManager),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=H("delete danger btn-circle z-depth-1 btn-record-cancel"),this.btnSendContainer=document.createElement("div"),this.btnSendContainer.classList.add("btn-send-container"),this.recordRippleEl=document.createElement("div"),this.recordRippleEl.classList.add("record-ripple"),this.btnSend=H("none btn-circle z-depth-1 btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),"scheduled"!==this.chat.type&&(this.sendMenu=new ya({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),na.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(na)("open",this.onEmoticonsOpen),this.listenerSetter.add(na)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(a.default)("settings_updated",()=>{(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),this.messageInputField&&this.messageInputField.onFakeInput()}),this.listenerSetter.add(a.default)("draft_updated",({peerId:e,threadId:t,draft:s,force:i})=>{this.chat.threadId===t&&this.chat.peerId===e&&this.setDraft(s,!0,i)}),this.listenerSetter.add(a.default)("peer_changing",e=>{this.chat===e&&this.saveDraft()}),"scheduled"===this.chat.type?this.listenerSetter.add(a.default)("scheduled_delete",({peerId:e,mids:t})=>{this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()}):this.listenerSetter.add(a.default)("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"))});try{this.recorder=new va.a({encoderSampleRate:48e3,monitorGain:0,numberOfChannels:1,recordingGain:1,reuseWorker:!0})}catch(e){console.error("Recorder constructor error:",e)}this.updateSendBtn(),this.listenerSetter.add(this.fileInput)("change",e=>{let t=e.target.files;t.length&&(new Pa(this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")},!1),Object(l.b)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&(Object(l.b)(this.btnCancelRecord,this.onCancelRecordClick,{listenerSetter:this.listenerSetter}),this.recorder.onstop=()=>{this.recording=!1,this.chatInput.classList.remove("is-recording","is-locked"),this.updateSendBtn(),this.recordRippleEl.style.transform=""},this.recorder.ondataavailable=e=>{if(this.releaseMediaPlayback&&(this.releaseMediaPlayback(),this.releaseMediaPlayback=void 0),this.recordingOverlayListener&&(this.listenerSetter.remove(this.recordingOverlayListener),this.recordingOverlayListener=void 0),this.recordingNavigationItem&&(j.a.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:s}=this.chat,i=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});fa.a.decode(e,!0).then(e=>{fa.a.setKeepAlive(!1),this.appMessagesManager.sendFile(t,a,{isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:i,threadId:s,clearDraft:!0}),this.onMessageSent(!1,!0)})}),Object(l.b)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),Object(l.b)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=dt(()=>this.saveDraft(),2500,!1,!0)}constructPinnedHelpers(){const e=document.createElement("div");e.classList.add("pinned-container"),this.pinnedControlBtn=Object(U.a)("btn-primary btn-transparent text-bold pinned-container-button",{icon:"unpin"}),e.append(this.pinnedControlBtn);const t=e.cloneNode(!0);this.fakePinnedControlBtn=t.firstChild,this.fakeRowsWrapper.append(t),this.listenerSetter.add(this.pinnedControlBtn)("click",()=>{const e=this.chat.peerId;new ha(e,0,!0,()=>{this.chat.appImManager.setPeer(Be.b);const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)})}),this.rowsWrapper.append(e),this.chatInput.classList.add("type-pinned"),this.rowsWrapper.classList.add("is-centered")}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){const e=this.appMessagesManager.getDialogOnly(this.chat.peerId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",this.appNotificationsManager.isPeerLocalMuted(this.chat.peerId,!0)),this.goMentionUnreadBadge&&"chat"===this.chat.type){const t=!!(null==e?void 0:e.unread_mentions_count);this.goMentionUnreadBadge.innerText=t?""+e.unread_mentions_count:"",this.goMentionBtn.classList.toggle("is-visible",t)}}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const{value:e,entities:t}=Object(wa.a)(this.messageInputField.input);let s;(e.length||this.replyToMsgId)&&(s={_:"draftMessage",date:Object(oe.g)(!0)+this.serverTimeManager.serverTimeOffset,message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),this.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,s)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.style.display="none",this.goDownBtn.classList.add("hide")),Ws(),this.lastTimeType=0,this.messageInput&&(this.clearInput(),e&&this.clearHelper())}setDraft(e,t=!0,s=!1){return!(!s&&!Object(Sa.a)(this.messageInput)||"scheduled"===this.chat.type)&&(e||(e=this.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId))?(this.messageInputField.value!==e.rMessage||this.replyToMsgId!==e.reply_to_msg_id)&&(t&&this.clearHelper(),this.noWebPage=e.pFlags.no_webpage,e.reply_to_msg_id&&this.initMessageReply(e.reply_to_msg_id),this.setInputValue(e.rMessage,t,t),!0):(s&&(this.chat.container.classList.contains("is-helper-active")&&this.t(),this.messageInputField.inputFake.textContent="",this.messageInputField.onFakeInput(!1),(this.chat.bubbles.messagesQueuePromise||Promise.resolve()).then(()=>{Object(De.b)(()=>{this.onMessageSent()})})),!1))}finishPeerChange(){const e=this.chat.peerId,{forwardElements:t,btnScheduled:s,replyKeyboard:i,sendMenu:n,goDownBtn:a,chatInput:o}=this;o.style.display="";const r=this.appPeersManager.isBroadcast(e);if(a.classList.toggle("is-broadcast",r),a.classList.remove("hide"),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&o.classList.toggle("can-pin",this.appPeersManager.canPinMessage(e)),t&&(this.forwardWasDroppingAuthor=!1,t.showCaption.checkboxField.setValueSilently(!0),t.showSender.checkboxField.setValueSilently(!0)),s){s.classList.add("hide");const t=this.chat.bubbles.getMiddleware();this.appMessagesManager.getScheduledMessages(e).then(e=>{t()&&s.classList.toggle("hide",!e.length)})}i&&i.setPeer(e),n&&n.setPeerId(e),this.messageInput?this.updateMessageInput():this.pinnedControlBtn&&(this.appPeersManager.canPinMessage(this.chat.peerId)?(this.pinnedControlBtn.append(Object(x.i18n)("Chat.Input.UnpinAll")),this.fakePinnedControlBtn.append(Object(x.i18n)("Chat.Input.UnpinAll"))):(this.pinnedControlBtn.append(Object(x.i18n)("Chat.Pinned.DontShow")),this.fakePinnedControlBtn.append(Object(x.i18n)("Chat.Pinned.DontShow"))))}updateMessageInput(){const{chatInput:e,attachMenu:t,messageInput:s}=this,{peerId:i,threadId:n}=this.chat,a=this.appMessagesManager.canSendToPeer(i,n);e.classList.add("no-transition"),e.classList.toggle("is-hidden",!a),e.offsetLeft,e.classList.remove("no-transition");const o=x.default.weakMap.get(s);if(o){let e;e=n?"Comment":this.appPeersManager.isBroadcast(i)?"ChannelBroadcast":this.appMessagesManager.isAnonymousSending(i)?"SendAnonymously":"Message",o.key!==e&&(o.key=e,o.update())}const r=this.attachMenuButtons.filter(e=>{const t=e.verify(i,n);return e.element.classList.toggle("hide",!t),t});a?(s.setAttribute("contenteditable","true"),this.setDraft(void 0,!1),s.innerHTML||this.messageInputField.onFakeInput()):s.removeAttribute("contenteditable"),t.toggleAttribute("disabled",!r.length),t.classList.toggle("btn-disabled",!r.length),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new _.b({placeholder:"Message",name:"message",animate:!0}),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),this.messageInput=this.messageInputField.input,this.messageInput.classList.add("no-scrollbar"),this.attachMessageInputListeners(),Qa.a&&Object(Qa.b)(this.messageInput),e?(e.input.replaceWith(this.messageInputField.input),e.inputFake.replaceWith(this.messageInputField.inputFake)):this.inputMessageContainer.append(this.messageInputField.input,this.messageInputField.inputFake)}attachMessageInputListeners(){this.listenerSetter.add(this.messageInput)("keydown",e=>{const t=e.key;if(Object(ja.a)(e))Object(c.a)(e),this.sendMessage();else if(e.ctrlKey||e.metaKey)this.handleMarkdownShortcut(e);else if(("PageUp"===t||"PageDown"===t)&&!e.shiftKey)if(e.preventDefault(),"PageUp"===t){const e=document.createRange(),t=window.getSelection();e.setStart(this.messageInput.childNodes[0]||this.messageInput,0),e.collapse(!0),t.removeAllRanges(),t.addRange(e)}else Object(Ea.a)(this.messageInput)}),ue.IS_TOUCH_SUPPORTED&&Object(l.b)(this.messageInput,e=>{this.appImManager.selectTab(1),na.toggle(!1)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",()=>{this.checkAutocomplete()}),"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.listenerSetter.add(this.messageInput)("focusin",()=>{this.chat.bubbles.scrollable.loadedAll.bottom&&this.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)})}applyMarkdown(e,t){const s={bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",monospace:()=>document.execCommand("fontName",!1,"monospace"),link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null)};if(!s[e])return!1;const i=s[e],n=this.prepareDocumentExecute(),a=[];if(a.push(document.execCommand("styleWithCSS",!1,"true")),"monospace"===e){let t=!1;const s=window.getSelection();if(!s.isCollapsed){const i=s.getRangeAt(0),n=Ba.b[e],a=i.commonAncestorContainer;(a.parentNode.matches(n.match)||a instanceof HTMLElement&&a.matches(n.match))&&(t=!0)}t?a.push(document.execCommand("fontName",!1,"Roboto")):a.push("function"==typeof i?i():document.execCommand(i,!1,null))}else a.push("function"==typeof i?i():document.execCommand(i,!1,null));return a.push(document.execCommand("styleWithCSS",!1,"false")),n(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),!0}insertAtCaret(e,t,s=!0){const{value:i,caretPos:n,entities:a}=Ra(this.messageInput),o=n>=0?n:i.length,r=i.substr(0,o),l=i.substr(o),c=s?r.match($a.AUTO_COMPLETE_REG_EXP):null,d=c?c.index+(c[0].length-c[2].length):r.length,h=r.slice(0,d)+e+l,p=J.b.parseEntities(i);J.b.mergeEntities(a,p);const u=t?Math.max(t.length,e.length):e.length,m=[];t&&(m.push(t),t.offset=d);const g=c?u-c[2].length:u;a.forEach(e=>{e.offset>=d&&(e.offset+=g)}),J.b.mergeEntities(a,m);{const e={_:"messageEntityCaret",offset:d+u,length:0};let t=0;for(let s=a.length;te.offset)break}a.splice(t,0,e)}const b=J.b.wrapDraftText(h,{entities:a});this.messageInputField.setValueSilently(b,!0);const v=this.messageInput.querySelector(".composer-sel");v&&(!function(e){const t=e;if(1===(e=e.previousSibling).nodeType){const s=document.createTextNode("");e.parentNode.insertBefore(s,t.nextSibling&&t.nextSibling.nodeType!==e.nodeType?t.nextSibling:t),e=s}if(window.getSelection&&document.createRange){const t=document.createRange();e&&(t.setStartAfter(e),t.insertNode(e),t.setStart(e,e.nodeValue.length)),t.collapse(!0);const s=window.getSelection();s.removeAllRanges(),s.addRange(t)}}(v),v.remove()),this.onMessageInput()}checkAutocomplete(e,t,s){if(void 0===e){const i=Ra(this.messageInputField.input,!0);e=i.value,t=i.caretPos,s=i.entities}if(-1===t&&(t=e.length),void 0===s){const t=J.b.parseMarkdown(e,s,!0);s=J.b.mergeEntities(s,J.b.parseEntities(t))}if(e=e.substr(0,t),this.previousQuery===e)return;this.previousQuery=e;const i=e.match($a.AUTO_COMPLETE_REG_EXP);let n;if(i){const t=s[0];let o=i[2];const r=o[0];if(this.stickersHelper&&a.default.settings.stickers.suggest&&this.appMessagesManager.canSendToPeer(this.chat.peerId,this.chat.threadId,"send_stickers")&&"messageEntityEmoji"===(null==t?void 0:t._)&&t.length===e.length&&!t.offset)n=this.stickersHelper,this.stickersHelper.checkEmoticon(e);else if("@"===r){const e=this.chat.threadId?this.appMessagesIdsManager.getServerMessageId(this.chat.threadId):void 0;this.mentionsHelper.checkQuery(o,this.chat.peerId.isUser()?Be.b:this.chat.peerId,e)&&(n=this.mentionsHelper)}else i[1]||"/"!==r?a.default.settings.emoji.suggest&&(o=o.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!o||(n=this.emojiHelper,this.emojiHelper.checkQuery(o,r))):this.commandsHelper.checkQuery(o,this.chat.peerId)&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}checkInlineAutocomplete(e,t){let s=!1;if(!t){const i=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(i){const n=i[1],a=e.slice(i[0].length);s=i[0].length===e.length,t=this.inlineHelper,this.btnPreloader?Object(Jt.a)(this.btnPreloader,"show",!0,400):(this.btnPreloader=H("none btn-preloader float show disable-hover",{noRipple:!0}),Object(te.f)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,n,a).then(({user:e,renderPromise:t})=>{s&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then(()=>{Object(Jt.a)(this.btnPreloader,"show",!1,400)})}).catch(_e.a)}}return s||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&this.btnPreloader&&Object(Jt.a)(this.btnPreloader,"show",!1,400),t}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=this.helperFunc;this.clearHelper(),this.updateSendBtn();let t=!1;new Ns(Object(w.a)(this.forwarding),()=>{t=!0}).addEventListener("close",()=>{this.helperWaitingForward=!1,t||e()})}clearInput(e=!0,t=!0,s=""){if(document.activeElement===this.messageInput&&re.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),Object(Ga.a)(e),this.messageInputField.setValueSilently(s),Object(Ga.a)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(s);ue.IS_TOUCH_SUPPORTED||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let i=!1;e&&(i=this.setDraft(void 0,!1)),!i&&t&&this.onMessageInput()}isInputEmpty(){return Object(Sa.a)(this.messageInput)}updateSendBtn(){let e;const t=this.isInputEmpty();e=this.editMsgId?"edit":!this.recorder||this.recording||!t||this.forwarding?"scheduled"===this.chat.type?"schedule":"send":"record",["send","record","edit","schedule"].forEach(t=>{this.btnSend.classList.toggle(t,e===t)}),this.btnScheduled&&this.btnScheduled.classList.toggle("show",t),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t)}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const s=this.messageInputField.value;J.b.parseEntities(s).filter(e=>"messageEntityEmoji"===e._).forEach(e=>{const t=Object(ie.a)(e.unicode);this.appEmojiManager.pushRecentEmoji(t)}),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.clearInput()),(t||e)&&this.clearHelper(),this.updateSendBtn()}sendMessage(e=!1){const{editMsgId:t,chat:s}=this;if("scheduled"===s.type&&!e&&!t)return void this.scheduleSending();const{threadId:i,peerId:n}=s,{replyToMsgId:a,noWebPage:o,sendSilent:r,scheduleDate:l}=this,{value:c,entities:d}=Object(wa.a)(this.messageInputField.input);if(t){const e=this.editMessage;if(!c.trim()&&!e.media)return void new zs(n,[t],s.type);this.appMessagesManager.editMessage(e,c,{entities:d,noWebPage:o}),this.onMessageSent()}else c.trim()&&(this.appMessagesManager.sendText(n,c,{entities:d,replyToMsgId:a,threadId:i,noWebPage:o,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,scheduleDate:l,silent:r,clearDraft:!0}),this.onMessageSent(!1,!1));if(this.forwarding){const e=Object(w.a)(this.forwarding);setTimeout(()=>{for(const t in e)this.appMessagesManager.forwardMessages(n,t.toPeerId(),e[t],{silent:r,scheduleDate:l,dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()});c||this.onMessageSent()},0)}}sendMessageWithDocument(e,t=!1,s=!1){var i;const n="sticker"===(e=this.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!this.appMessagesManager.canSendToPeer(this.chat.peerId,this.chat.threadId,n)?(lt("Posting media content isn't allowed in this group."),!1):"scheduled"!==this.chat.type||t?!!e&&(this.appMessagesManager.sendFile(this.chat.peerId,e,{isMedia:!0,replyToMsgId:this.replyToMsgId,threadId:this.chat.threadId,silent:this.sendSilent,scheduleDate:this.scheduleDate,clearDraft:s||void 0}),this.onMessageSent(s,!0),"sticker"===e.type&&(null===(i=na.stickersTab)||void 0===i||i.pushRecentSticker(e)),!0):(this.scheduleSending(()=>this.sendMessageWithDocument(e,!0,s)),!1)}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||Object(ft.a)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){const t=this.chat.getMessage(e);let s=J.b.wrapDraftText(t.message,{entities:t.totalEntities});const i=()=>{const n=this.appMessagesManager.wrapMessageForReply(t,void 0,[t.mid]);this.setTopInfo("edit",i,Object(x.i18n)("AccDescrEditing"),n,s,t),this.editMsgId=e,this.editMessage=t,s=void 0};i()}initMessagesForward(e){const t=()=>{const s=Object.keys(e).map(e=>e.toPeerId()),i=new Set;let n=0,o=0;s.forEach(t=>{const s=e[t];s.forEach(e=>{var s;const n=this.appMessagesManager.getMessageByPeer(t,e);!(null===(s=n.fwd_from)||void 0===s?void 0:s.from_name)||n.fromId||n.fwdFromId?i.add("P"+n.fromId):i.add("N"+n.fwd_from.from_name),n.media&&n.message&&++o}),n+=s.length});const r=i.size>2,l=[...i].map(e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===a.default.myId?Object(x.i18n)("Chat.Accessory.Forward.You"):new Lt.a({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e}),{forwardElements:c}=this;Object(ft.a)(c.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!o);const d=c.hideCaption.checkboxField.checked;o&&d?c.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?c.hideSender:c.showSender).checkboxField.setValueSilently(!0);const h=c.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",p=Object(x.i18n)(h,[n]),u=document.createDocumentFragment();let m,g;if(l.length<3?u.append(...Object(x.join)(l,!1)):u.append(l[0],Object(x.i18n)("AndOther",[l.length-1])),1===s.length){const t=s[0],i=e[t];if(m=this.appMessagesManager.getMessageByPeer(t,i[0]),g=!!m.grouped_id,g){const e=this.appMessagesManager.getMidsByMessage(m);(e.length!==n||e.find(e=>!i.includes(e)))&&(g=!1)}}const b=document.createDocumentFragment();if(g||1===n){const t=e[s[0]],i=this.appMessagesManager.wrapMessageForReply(m,void 0,t);b.append(u,": ",i)}else b.append(Object(x.i18n)("Chat.Accessory.Forward.From"),": ",u);let v=this.setTopInfo("forward",t,p,b);c.modifyArgs.forEach((e,t)=>{const i=e.textElement,n=x.default.weakMap.get(i);n.args=[t<2?s.length:o],n.update()}),this.forwardHover&&this.forwardHover.attachButtonListener(v,this.listenerSetter),this.forwarding=e};t()}initMessageReply(e){if(this.replyToMsgId===e)return;let t=this.chat.getMessage(e);const s=()=>{let i;"messageEmpty"===t._?(i=Object(x.i18n)("Loading"),this.chat.appMessagesManager.wrapSingleMessage(this.chat.peerId,e).then(i=>{this.replyToMsgId===e&&(t=i,"messageEmpty"===t._?this.clearHelper("reply"):s())})):i=new Lt.a({peerId:t.fromId,dialog:!1}).element,this.setTopInfo("reply",s,i,t&&t.message,void 0,t),this.replyToMsgId=e};s()}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.replyToMsgId=void 0,this.forwarding=void 0),this.editMsgId=this.editMessage=void 0,this.helperType=this.helperFunc=void 0,this.chat.container.classList.contains("is-helper-active")&&(j.a.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){Object(Jt.a)(this.chat.container,"is-toggling-helper",!0,150,()=>{this.chat.container.classList.remove("is-toggling-helper")})}setInputValue(e,t=!0,s=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),Object(De.b)(()=>{s&&Object(Ea.a)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight})}setTopInfo(e,t,s="",i="",n,a){if(this.willSendWebPage&&"reply"===e)return;"webpage"!==e&&(this.clearHelper(e),this.helperType=e,this.helperFunc=t);const o=this.replyElements.container,r=o.lastElementChild.previousElementSibling,l=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=H(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const c=Ms(s,i,a);return l?r.replaceWith(c):o.insertBefore(c,o.lastElementChild),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),re.IS_MOBILE||j.a.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout(()=>{this.updateSendBtn()},0),c}}$a.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;class Ya{constructor(e){this.floating=!1,Object(w.g)(this,e);const{divAndCaption:t,className:s}=this;t.container.classList.add("pinned-container","hide"),t.title.classList.add("pinned-container-title"),t.subtitle.classList.add("pinned-container-subtitle"),t.content.classList.add("pinned-container-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add("pinned-container-close",`pinned-${s}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("pinned-container-wrapper"),Object(se.ripple)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add("pinned-container-wrapper-utils"),this.wrapperUtils.append(this.btnClose),this.wrapper.append(...Array.from(t.container.children),this.wrapperUtils),t.container.append(this.wrapper),this.attachOnCloseEvent(this.btnClose)}attachOnCloseEvent(e){Object(l.b)(e,e=>{Object(c.a)(e),((this.onClose?this.onClose():null)||Promise.resolve(!0)).then(e=>{e&&this.toggle(!0)})},{listenerSetter:this.listenerSetter})}toggle(e){const t=this.divAndCaption.container.classList.contains("hide");if(void 0===e)e=!t;else if(e===t)return;const s=(this.floating||b.b.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",s),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",s),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}fill(e,t,s){this.divAndCaption.container.dataset.peerId=""+s.peerId,this.divAndCaption.container.dataset.mid=""+s.mid,this.divAndCaption.fill(e,t,s),this.topbar.setUtilsWidth()}}class Xa extends Ya{constructor(e,t,s){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new ze("pinned-audio",(e,t)=>{Object(k.a)(this.divAndCaption.title,e),Object(k.a)(this.divAndCaption.subtitle,t)}),onClose:()=>{fe.stop()},floating:!0}),this.topbar=e,this.chat=t,this.appMessagesManager=s,this.divAndCaption.border.remove();const i=H("pprevious active",{noRipple:!0}),n=H("nnext active",{noRipple:!0});i.innerHTML='',n.innerHTML='';const o=(e,t)=>{Object(l.b)(e,e=>{Object(c.a)(e),t()},{listenerSetter:this.topbar.listenerSetter})};o(i,()=>{fe.previous()}),o(n,()=>{fe.next()}),this.toggleEl=H("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),o(this.toggleEl,()=>{fe.toggle()}),this.wrapper.prepend(this.wrapper.firstElementChild,i,this.toggleEl,n),this.volumeSelector=new xe(this.listenerSetter,!0);const r=document.createElement("div");r.classList.add("progress-line-container"),r.append(this.volumeSelector.container);const d=document.createElement("div");d.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(d),this.volumeSelector.btn.append(r),this.wrapperUtils.prepend(this.volumeSelector.btn);const h=document.createElement("div");h.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new ke(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),h.append(this.progressLine.container),this.wrapper.insertBefore(h,this.wrapperUtils),this.topbar.listenerSetter.add(a.default)("media_play",({doc:e,message:t,media:s})=>{let i,n;"voice"===e.type||"round"===e.type?(i=new Lt.a({peerId:t.fromId}).element,n=Object(oe.d)(t.date)):(i=e.audioTitle||e.fileName,n=e.audioPerformer||Object(x.i18n)("AudioUnknownArtist")),this.progressLine.setMedia(s),this.fill(i,n,t),this.toggleEl.classList.add("flip-icon"),this.toggle(!1)}),this.topbar.listenerSetter.add(a.default)("media_pause",()=>{this.toggleEl.classList.remove("flip-icon")}),this.topbar.listenerSetter.add(a.default)("media_stop",()=>{this.toggle(!0)})}}var Ja;!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"}(Ja||(Ja={}));class Za{constructor(){this.drawRect=(e,t,s,i,n)=>`M${e},${t+n}a${n},${n},0,0,1,${s},0v${i-2*n}a${n},${n},0,0,1,${-s},0Z`,this.getClipPath=(e,t,s)=>{let i="";if(2===s)i=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let s;return e<=1?s=Ja.ONE:2===e?s=Ja.TWO:3===e?s=Ja.THREE:4===e?s=Ja.FOUR:e>3&&(s=Ja.MORE),s},this.getMarkHeight=(e,t)=>{let s;return e<=1?s=Ja.ONE:2===e?s=Ja.TWO:3===e?s=Ja.THREE:4===e?s=Ja.FOUR:e>3&&(s=Ja.MORE),s},this.getMarkTranslateY=(e,t,s)=>1===s?0:2===s?e?t+1:0:3===s?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,s,i)=>t<=4||e<=1?0:e>=t-2?i-Ja.ONE-s:(e-2)*s+1*e,this.getTrackHeight=(e,t)=>e<=3?Ja.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add("pinned-message-border"),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className="pinned-message-border-wrapper-1",this.border.classList.remove("pinned-message-border-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const s=this.getBarHeight(e,t),i=this.getMarkHeight(e,t),n=this.getTrackHeight(e,s),a="clipPath_"+e,o=this.getClipPath(a,s,e),r=this.getMarkTranslateY(t,s,e),l=this.getTrackTranslateY(t,e,s,n);return this.border.classList.toggle("pinned-message-border-mask",e>4),t<=1?(this.border.classList.add("mask-bottom"),this.border.classList.remove("mask-top")):t>=e-2?(this.border.classList.add("mask-top"),this.border.classList.remove("mask-bottom")):this.border.classList.add("mask-top","mask-bottom"),this.wrapper.className="pinned-message-border-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${l}px);`,this.svg||(this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.setAttributeNS(null,"height","0"),this.svg.setAttributeNS(null,"width","0"),this.defs=document.createElementNS("http://www.w3.org/2000/svg","defs"),this.defs.append(o),this.svg.append(this.defs),this.mark=document.createElement("div"),this.mark.classList.add("pinned-message-border-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${i}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var eo=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class to{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=to.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const s=document.createElement("div"),i=!Object.keys(this.rows).length&&!t;return s.className=to.BASE_CLASS+"-row"+(i?"":" is-hiding hide"),this.rows[e]={element:s,new:!0},this.container.append(s),s}clearRow(e){this.rows[e]&&(this.rows[e].element.remove(),delete this.rows[e])}clearRows(e){this.clearTimeout&&clearTimeout(this.clearTimeout),this.clearTimeout=window.setTimeout(()=>{for(const t in this.rows)+t!==e&&this.clearRow(+t)},to.DURATION)}setNewRow(e,t=!1){const s=this.rows[e];s.new&&(t?(s.element.classList.remove("hide"),s.element.offsetLeft):s.element.classList.remove("is-hiding","hide"),delete s.new),this.clearRows(e)}animate(e,t,s=e>t,i=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!i)return this.setNewRow(e);const o=["from-top","from-bottom"];s||o.reverse(),n.element.classList.add(o[0]),n.element.classList.remove(o[1]),a&&(a.element.classList.add(o[1]),a.element.classList.remove(o[0])),n.new&&this.setNewRow(e,!0),n.element.classList.toggle("is-hiding",!1),a&&a.element.classList.toggle("is-hiding",!0),this.clearRows(e)}}to.DURATION=200,to.BASE_CLASS="animated-super";class so{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=so.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=so.BASE_CLASS+"-decimal";const s=document.createElement("div");s.className=so.BASE_CLASS+"-decimal-placeholder";const i=new to;return i.container.className=so.BASE_CLASS+"-decimal-wrapper",t.append(s,i.container),this.container.append(t),this.decimals[e]={container:t,placeholder:s,animatedSuper:i}}clear(e){this.clearTimeout&&clearTimeout(this.clearTimeout);const t=(""+e).length;t>=this.decimals.length||(this.clearTimeout=window.setTimeout(()=>{this.decimals.splice(t,this.decimals.length-t).forEach(e=>{e.container.remove()})},to.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach(t=>{const s=+t.placeholder.innerText||0;t.animatedSuper.getRow(so.EMPTY_INDEX,!0);t.animatedSuper.animate(so.EMPTY_INDEX,s,this.reverse?ethis.previousNumber,!0)}),this.clear(e)}setCount(e){const t=Array.from(""+this.previousNumber).map(e=>+e);Array.from(""+e).map(e=>+e).forEach((s,i)=>{var n;const a=this.getDecimal(i),o=a.animatedSuper.getRow(s,!0),r=null!==(n=t[i])&&void 0!==n?n:so.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+s,a.animatedSuper.animate(s,r,this.reverse?ethis.previousNumber,!0)}),this.hideLeft(e),this.previousNumber=e}}so.EMPTY_INDEX=-1,so.BASE_CLASS="animated-counter";class io{constructor(e,t,s,i){this.topbar=e,this.chat=t,this.appMessagesManager=s,this.appPeersManager=i,this.pinnedMaxMid=0,this.pinnedMid=0,this.pinnedIndex=-1,this.wasPinnedIndex=0,this.wasPinnedMediaIndex=0,this.locked=!1,this.waitForScrollBottom=!1,this.count=0,this.mids=[],this.offsetIndex=0,this.loading=!1,this.loadedBottom=!1,this.loadedTop=!1,this.scrollDownListenerSetter=null,this.hidden=!1,this.getCurrentIndexPromise=null,this.isStatic=!1,this.debug=!1,this.listenerSetter=new R.a;const n=new Ge("pinned-message");this.pinnedMessageContainer=new Ya({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:n,onClose:()=>eo(this,void 0,void 0,(function*(){return i.canPinMessage(this.topbar.peerId)?new ha(this.topbar.peerId,this.pinnedMid,!0):new ha(this.topbar.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new Za,n.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new to,n.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new to,this.animatedMedia.container.classList.add("pinned-message-media-container"),n.content.prepend(this.animatedMedia.container),this.animatedCounter=new so(!0),n.title.append(Object(x.i18n)("PinnedMessage")," ",this.animatedCounter.container);const o=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(o),n.container.prepend(o),this.btnOpen=H("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),Object(l.b)(this.btnOpen,e=>{Object(c.a)(e),this.topbar.openPinned(!0)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("peer_pinned_messages",({peerId:e})=>{e===this.topbar.peerId&&(this.hidden&&this.pinnedMessageContainer.toggle(this.hidden=!1),this.loadedTop=this.loadedBottom=!1,this.pinnedIndex=-1,this.pinnedMid=0,this.count=0,this.mids=[],this.offsetIndex=0,this.pinnedMaxMid=0,this.setCorrectIndex(0))}),this.listenerSetter.add(a.default)("peer_pinned_hidden",({peerId:e})=>{e===this.topbar.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)}),this.setPinnedMessage=dt(()=>this._setPinnedMessage(),100,!0,!0),this.isStatic="discussion"===this.chat.type}destroy(){this.pinnedMessageContainer.divAndCaption.container.remove(),this.pinnedMessageContainer.toggle(!0),this.listenerSetter.removeAll(),this.unsetScrollDownListener(!1)}setCorrectIndex(e){if(this.isStatic)return;if(this.locked||this.hidden)return;if((this.loadedBottom||this.loadedTop)&&!this.count)return;let t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const s=t.dataset.mid;t&&void 0!==s&&this.testMid(+s,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let s=this.mids.findIndex(t=>t<=e);if(-1===s||this.isNeededMore(s)){if(!(this.loadedTop&&es))return;this.pinnedIndex=s,this.pinnedMid=this.mids.find(t=>t<=e)||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>io.LOAD_COUNT&&(!this.loadedBottom&&e<=io.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=io.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return eo(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{let s=!1;const i=[this.appMessagesManager.getSearch({peerId:this.topbar.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:io.LOAD_COUNT,backLimit:io.LOAD_COUNT}).then(e=>(s=!0,e))];if(!this.pinnedMaxMid){const e=this.appMessagesManager.getPinnedMessage(this.topbar.peerId).then(e=>{e.maxId&&(this.pinnedMaxMid=e.maxId,!s&&t&&(this.mids=[this.pinnedMaxMid],this.count=e.count,this.pinnedIndex=0,this.pinnedMid=this.mids[0],this.setPinnedMessage()))});i.push(e)}const n=(yield Promise.all(i))[0];let a=n.history.findIndex(t=>t.mid<=e);-1===a&&(a=n.history.length),this.offsetIndex=n.offset_id_offset?n.offset_id_offset-a:0,this.mids=n.history.map(e=>e.mid).slice(),this.count=n.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,this.debug&&this.chat.log("[PM]: getCurrentIndex result:",e,n,a,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.chat.log.error("[PM]: getCurrentIndex error",e)}this.loading=!1,this.locked?this.testMid(e):t&&this.setCorrectIndex(0),this.getCurrentIndexPromise=null}}))}setScrollDownListener(){this.waitForScrollBottom=!0,this.scrollDownListenerSetter||(this.scrollDownListenerSetter=new R.a,function(e,t,s,i){if(ue.IS_TOUCH_SUPPORTED){let n;const a={passive:!0};i.add(e)("touchstart",t=>{t.touches.length>1?r():(n=t.touches[0].clientY,i.add(e)("touchmove",o,a),i.add(e)("touchend",r,a))},a);const o=e=>{const i=e.touches[0].clientY,a=i{i.removeManual(e,"touchmove",o,a),i.removeManual(e,"touchend",r,a)}}else i.add(e)("wheel",e=>{const i=e.deltaY>0;"bottom"===t&&i?s():"top"!==t||i||s()},{passive:!0})}(this.chat.bubbles.scrollable.container,"bottom",()=>{this.unsetScrollDownListener()},this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return eo(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.chat.log("[PM]: handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield Object(ks.c)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.chat.log("[PM]: handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.chat.log.error("[PM]: handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return eo(this,void 0,void 0,(function*(){const t=this.chat.getMessage(e);t&&!t.deleted&&(this.chat.setMessageId(e),(this.chat.setPeerPromise||Promise.resolve()).then(()=>{this.handleFollowingPinnedMessage(),this.testMid(this.pinnedIndex>=this.count-1?this.pinnedMaxMid:e-1)}))}))}_setPinnedMessage(){return eo(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,s=this.chat.getMessage(this.pinnedMid),i=0===t;this.animatedCounter.container.classList.toggle("is-last",i),i||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.chat.log("[PM]: setPinnedMessage: fromTop",n,t,this.wasPinnedIndex);const a=this.animatedSubtitle.getRow(t),o=this.animatedMedia.getRow(t);o.classList.add("pinned-message-media");const r=[],l=Ve({title:void 0,titleEl:null,subtitle:s.message,subtitleEl:a,message:s,mediaEl:o,loadPromises:r});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",l),this.animatedSubtitle.animate(t,this.wasPinnedIndex),l?(this.animatedMedia.animate(t,this.wasPinnedMediaIndex),this.wasPinnedMediaIndex=t):this.animatedMedia.clearRows(),this.pinnedMessageBorder.render(e,e-t-1),this.wasPinnedIndex=t,this.pinnedMessageContainer.divAndCaption.container.dataset.mid=""+s.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}io.LOAD_COUNT=50,io.LOAD_OFFSET=5;var no=!("undefined"==typeof RTCPeerConnection||re.IS_FIREFOX);class ao{constructor(e,t,s,i,n,a,o,r,l){this.chat=e,this.appSidebarRight=t,this.appMessagesManager=s,this.appPeersManager=i,this.appChatsManager=n,this.appNotificationsManager=a,this.appProfileManager=o,this.appUsersManager=r,this.appGroupCallsManager=l,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&Object(c.a)(e);const s=e=>{e.forEach(e=>{e.element.classList.toggle("hide",!e.verify())})};t&&(s(this.menuButtons),this.menuButtons[this.menuButtons.length-1].element.lastChild.replaceWith(Object(x.i18n)(this.appPeersManager.getDeleteButtonText(this.peerId)))),s(this.buttonsToVerify)},this.verifyVideoChatButton=e=>{var t;if(!no||this.peerId.isUser())return!1;const s=this.appGroupCallsManager.groupCall,i=this.peerId.toChatId();if((null==s?void 0:s.chatId)===i)return!1;if(e&&(this.peerId.isBroadcast()&&"group"===e||this.peerId.isAnyGroup()&&"broadcast"===e))return!1;return(null===(t=this.appChatsManager.getChatTyped(i).pFlags)||void 0===t?void 0:t.call_active)||this.appChatsManager.hasRights(i,"manage_call")},this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",b.b.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===b.a.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),re.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame(()=>{re.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 s=t.divAndCaption.container.classList.contains("is-floating");return this.container.classList.toggle(`is-pinned-${t.className}-floating`,s),e+ +s},0);this.container.dataset.floating=""+e},this.setPeerStatus=(e=!1)=>{if(!this.subtitle)return;const t=this.peerId;this.chat.appImManager.setPeerStatus(this.peerId,this.subtitle,e,!1,()=>t===this.peerId)},this.listenerSetter=new R.a,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar"),this.container.dataset.floating="0",this.btnBack=H("left sidebar-close-button",{noRipple:!0}),this.chatInfoContainer=document.createElement("div"),this.chatInfoContainer.classList.add("chat-info-container"),this.chatInfo=document.createElement("div"),this.chatInfo.classList.add("chat-info");const e=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const s=document.createElement("div");s.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),s.append(this.title);const i=document.createElement("div");i.classList.add("bottom"),this.subtitle&&i.append(this.subtitle),t.append(s,i),this.avatarElement&&e.append(this.avatarElement),e.append(t),this.chatInfo.append(e),this.chatUtils=document.createElement("div"),this.chatUtils.classList.add("chat-utils"),this.chatAudio=new Xa(this,this.chat,this.appMessagesManager),this.menuButtons.length&&(this.btnMore=Ie({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.btnGroupCall,this.btnMute,this.btnSearch,this.btnMore].filter(Boolean)),this.pushButtonToVerify(this.btnGroupCall,this.verifyVideoChatButton),this.chatInfoContainer.append(this.btnBack,this.chatInfo,this.chatUtils),this.container.append(this.chatInfoContainer),this.chatAudio&&this.container.append(this.chatAudio.divAndCaption.container),this.listenerSetter.add(window)("resize",this.onResize),this.listenerSetter.add(b.b)("changeScreen",this.onChangeScreen),Object(l.b)(this.container,e=>{const t=Object(Me.a)(e.target,"pinned-container");if(Object(Ks.a)(),t){if(Object(c.a)(e),Object(Me.a)(e.target,"progress-line"))return;const s=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(s);else{const e=t.dataset.peerId.toPeerId(),i=fe.getSearchContext();this.chat.appImManager.setInnerPeer(e,s,i.isScheduled?"scheduled":i.threadId?"discussion":void 0,i.threadId)}}else b.b.activeScreen===b.a.medium&&document.body.classList.contains("is-left-column-shown")?n():Object(ft.a)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains("is-right-column-shown")):this.appSidebarRight.toggleSidebar(!0)},{listenerSetter:this.listenerSetter});const n=e=>{if(e&&Object(c.a)(e),b.b.activeScreen===b.a.medium&&document.body.classList.contains("is-left-column-shown"))this.chat.appImManager.setPeer(this.peerId);else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);j.a.back(e?"im":"chat")}};Object(l.b)(this.btnBack,n,{listenerSetter:this.listenerSetter})}pushButtonToVerify(e,t){e&&this.buttonsToVerify.push({element:e,verify:t})}constructUtils(){this.menuButtons=[{icon:"search",text:"Search",onClick:()=>{this.chat.initSearch()},verify:()=>b.b.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:()=>{this.appMessagesManager.mutePeer(this.peerId)},verify:()=>"chat"===this.chat.type&&a.default.myId!==this.peerId&&!this.appNotificationsManager.isPeerLocalMuted(this.peerId,!1)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.appMessagesManager.mutePeer(this.peerId)},verify:()=>"chat"===this.chat.type&&a.default.myId!==this.peerId&&this.appNotificationsManager.isPeerLocalMuted(this.peerId,!1)},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();this.appProfileManager.getChannelFull(this.peerId.toChatId()).then(t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer(t.linked_chat_id.toPeerId(!0))})},verify:()=>{var e;const t=this.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null===(e=t)||void 0===e?void 0:e.linked_chat_id)}},{icon:"videochat",text:"PeerInfo.Action.LiveStream",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"broadcast")},{icon:"videochat",text:"PeerInfo.Action.VoiceChat",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"group")},{icon:"select",text:"Chat.Menu.SelectMessages",onClick:()=>{const e=this.chat.selection;e.toggleSelection(!0,!0),M.default.getState().then(t=>{if(t.chatContextMenuHintWasShown)return;const s=e.toggleByElement.bind(e);e.toggleByElement=t=>{M.default.pushToState("chatContextMenuHintWasShown",!0),lt(Object(x.i18n)("Chat.Menu.Hint")),e.toggleByElement=s,e.toggleByElement(t)}})},verify:()=>!this.chat.selection.isSelecting&&!!Object.keys(this.chat.bubbles.bubbles).length},{icon:"select",text:"Chat.Menu.ClearSelection",onClick:()=>{this.chat.selection.cancelSelection()},verify:()=>this.chat.selection.isSelecting},{icon:"adduser",text:"AddContact",onClick:()=>{if(!this.appSidebarRight.isTabExists(jt)){const e=new jt(this.appSidebarRight);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>this.peerId.isUser()&&!this.appPeersManager.isContact(this.peerId)},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new Pt({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise((s,i)=>{new gt("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new Lt.a({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{s(),this.appMessagesManager.sendOther(t,this.appUsersManager.getContactMediaInput(e)),this.chat.appImManager.setInnerPeer(t)}},{langKey:"Cancel",callback:()=>{i()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()}),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>a.default.myId!==this.peerId&&this.peerId.isUser()&&this.appPeersManager.isContact(this.peerId)},{icon:"lock",text:"BlockUser",onClick:()=>{new gt("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new Lt.a({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.appUsersManager.toggleBlock(this.peerId,!0).then(e=>{e&&ct({langPackKey:"UserBlocked"})})}}]}).show()},verify:()=>{var e;if(!this.peerId.isUser())return!1;const t=this.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==a.default.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}},{icon:"lockoff",text:"Unblock",onClick:()=>{this.appUsersManager.toggleBlock(this.peerId,!1).then(e=>{e&&ct({langPackKey:"UserUnblocked"})})},verify:()=>{var e;const t=this.appProfileManager.getCachedFullUser(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.blocked)}},{icon:"delete danger",text:"Delete",onClick:()=>{new At(this.peerId)},verify:()=>"chat"===this.chat.type&&!!this.appMessagesManager.getDialogOnly(this.peerId)}],this.btnSearch=H("search"),this.attachClickEvent(this.btnSearch,e=>{this.chat.initSearch()},!0)}attachClickEvent(e,t,s){Object(l.b)(e,e=>{Object(c.a)(e),!s&&Object(Ks.a)(),t(e)},{listenerSetter:this.listenerSetter})}constructPeerHelpers(){return this.avatarElement=new ur,this.avatarElement.setAttribute("dialog","1"),this.avatarElement.classList.add("avatar-42","person-avatar"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new io(this,this.chat,this.appMessagesManager,this.appPeersManager),this.btnJoin=Object(U.a)("btn-primary btn-color-primary chat-join hide"),this.btnGroupCall=H("videochat"),this.btnPinned=H("pinlist"),this.btnMute=H("mute"),this.attachClickEvent(this.btnGroupCall,this.onJoinGroupCallClick),this.attachClickEvent(this.btnPinned,()=>{this.openPinned(!0)}),this.attachClickEvent(this.btnMute,()=>{this.appMessagesManager.mutePeer(this.peerId)}),this.attachClickEvent(this.btnJoin,()=>{const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let s;s=this.appChatsManager.isChannel(t)?this.appChatsManager.joinChannel(t):this.appChatsManager.addChatUser(t,a.default.myId),s.finally(()=>{e()&&this.btnJoin.removeAttribute("disabled")})}),this.listenerSetter.add(a.default)("chat_update",e=>{var t,s;if(this.peerId===e.toPeerId(!0)){const i=this.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(s=null===(t=i)||void 0===t?void 0:t.pFlags)||void 0===s?void 0:s.left)),this.setUtilsWidth(),this.verifyButtons()}}),this.listenerSetter.add(a.default)("dialog_notify_settings",e=>{e.peerId===this.peerId&&this.setMutedState()}),this.listenerSetter.add(a.default)("peer_typings",({peerId:e})=>{this.peerId===e&&this.setPeerStatus()}),this.listenerSetter.add(a.default)("user_update",e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()}),this.listenerSetter.add(a.default)("peer_full_update",e=>{this.peerId===e&&this.verifyButtons()}),this.pinnedMessage&&this.chat.addEventListener("setPeer",(e,t)=>{const s=this.chat.bubbles.getMiddleware();M.default.getState().then(i=>{s()&&(this.pinnedMessage.hidden=!!i.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))})}),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}constructPinnedHelpers(){this.listenerSetter.add(a.default)("peer_pinned_messages",({peerId:e,mids:t})=>{e===this.peerId&&t&&this.setTitle()})}constructDiscussionHelpers(){this.pinnedMessage=new io(this,this.chat,this.appMessagesManager,this.appPeersManager)}openPinned(e){this.chat.appImManager.setInnerPeer(this.peerId,e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,"pinned")}destroy(){this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),this.pinnedMessage&&this.pinnedMessage.destroy(),delete this.chatAudio,delete this.pinnedMessage}setPeer(e){this.wasPeerId=this.peerId,this.peerId=e,this.container.style.display=e?"":"none"}finishPeerChange(e,t,s){var i,n;const a=this.peerId;this.avatarElement&&(this.avatarElement.setAttribute("peer",""+a),this.avatarElement.update());const o=this.appPeersManager.isBroadcast(a);if(this.btnMute&&this.btnMute.classList.toggle("hide",!o),this.appPeersManager.isAnyChat(a)&&this.btnJoin){const e=a.toChatId();Object(k.a)(this.btnJoin,Object(x.i18n)(this.appChatsManager.isChannel(e)?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(n=null===(i=this.appChatsManager.getChat(e))||void 0===i?void 0:i.pFlags)||void 0===n?void 0:n.left))}this.setUtilsWidth(),this.verifyButtons();const r=this.chat.bubbles.getMiddleware();if(this.pinnedMessage)if("chat"===this.chat.type){if(void 0!==this.wasPeerId){const e=new io(this,this.chat,this.appMessagesManager,this.appPeersManager);this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy(),this.pinnedMessage=e}M.default.getState().then(t=>{r()&&(this.pinnedMessage.hidden=!!t.hiddenPinnedMessages[a],e||this.pinnedMessage.setCorrectIndex(0))})}else"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage());Object(De.b)(()=>{this.setTitle(),this.setPeerStatus(!0),this.setMutedState()})}setTitle(e){var t;let s;if("pinned"===this.chat.type?(s=void 0===e?Object(x.i18n)("Loading"):Object(x.i18n)("PinnedMessagesCount",[e]),void 0===e&&this.appMessagesManager.getSearchCounters(this.peerId,[{_:"inputMessagesFilterPinned"}],!1).then(e=>{const t=e[0].count;if(this.setTitle(t),!t){this.chat.appImManager.setPeer(Be.b);const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}})):"scheduled"===this.chat.type?(s=this.peerId===a.default.myId?Object(x.i18n)("Reminders"):Object(x.i18n)("ScheduledMessages"),void 0===e&&this.appMessagesManager.getScheduledMessages(this.peerId).then(e=>{this.setTitle(e.length)})):"discussion"===this.chat.type?(s=void 0===e?Object(x.i18n)("Loading"):Object(x.i18n)("Chat.Title.Comments",[e]),void 0===e&&Promise.all([this.appMessagesManager.getHistory(this.peerId,0,1,0,this.chat.threadId),Promise.resolve()]).then(()=>{const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId).count;null===e?setTimeout(()=>{this.setTitle()},30):this.setTitle(e)})):"chat"===this.chat.type&&(s=new Lt.a({peerId:this.peerId,dialog:!0}).element),Object(k.a)(this.title,s),"chat"===this.chat.type){const e=this.appPeersManager.getPeer(this.peerId);(null===(t=null==e?void 0:e.pFlags)||void 0===t?void 0:t.verified)&&this.title.append(Ut())}}setMutedState(){if(!this.btnMute)return;const e=this.peerId;let t=this.appNotificationsManager.isPeerLocalMuted(e,!1);this.appPeersManager.isBroadcast(e)?(this.btnMute.classList.remove("tgico-mute","tgico-unmute"),this.btnMute.classList.add(t?"tgico-unmute":"tgico-mute"),this.btnMute.style.display=""):this.btnMute.style.display="none"}}class oo extends z{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new F("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=H("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const e=document.createElement("div");e.classList.add("chatlist-container"),this.scrollable.container.replaceWith(e),this.appSearch=new A(e,this.inputSearch,{messages:new O("Chat.Search.PrivateSearch","messages")})}open(e,t,s,i){const n=super.open();return this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,i):(this.query=i,this.peerId=e,this.threadId=t,this.onDatePick=s,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&Object(l.b)(this.btnPickDate,()=>{new bn(new Date,this.onDatePick).show()}),i&&this.appSearch.searchInput.inputField.setValueSilently(i),Yt.toggleSidebar(!0)),n}}class ro{constructor(e,t,s){this.topbar=e,this.chat=t,this.query=s,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{Object(c.a)(e),new bn(new Date,this.chat.bubbles.onDatePick).show()},this.selectResult=e=>{if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),s=+e.dataset.mid||void 0,i=Object(Os.a)(e);i===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),i?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active");const n=this.chat.setPeer(t,s);this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then(()=>{this.selectedIndex=i,Object(k.a)(this.foundCountEl,Object(x.i18n)("Of",[i+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()}).finally(()=>{this.setPeerPromise=null})},this.onResultsClick=e=>{const t=Object(ft.a)(e.target,"LI");t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.bubblesContainer.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{Object(c.a)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{Object(c.a)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex-1])},this.element=document.createElement("div"),this.element.classList.add("sidebar-header","chat-search","chatlist-container"),this.backBtn=document.createElement("button"),this.backBtn.classList.add("btn-icon","tgico-left","sidebar-close-button"),Object(se.ripple)(this.backBtn),this.backBtn.addEventListener("click",()=>{this.topbar.container.classList.remove("hide-pinned"),this.element.remove(),this.inputSearch.remove(),this.results.remove(),this.footer.remove(),this.footer.removeEventListener("click",this.onFooterClick),this.dateBtn.removeEventListener("click",this.onDateClick),this.upBtn.removeEventListener("click",this.onUpClick),this.downBtn.removeEventListener("click",this.onDownClick),this.searchGroup.list.removeEventListener("click",this.onResultsClick),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active")},{once:!0}),this.inputSearch=new F("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new O(!1,"messages",void 0,"",!1),this.searchGroup.list.addEventListener("click",this.onResultsClick),this.appSearch=new A(this.results,this.inputSearch,{messages:this.searchGroup},e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):(this.foundCountEl.replaceWith(this.inputSearch.value?Object(x.i18n)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"))}),this.appSearch.beginSearch(this.chat.peerId,this.chat.threadId),this.chat.bubbles.bubblesContainer.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),this.footer.addEventListener("click",this.onFooterClick),Object(se.ripple)(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"),this.dateBtn.addEventListener("click",this.onDateClick),this.upBtn.addEventListener("click",this.onUpClick),this.downBtn.addEventListener("click",this.onDownClick),this.controls.append(this.upBtn,this.downBtn),this.footer.append(this.foundCountEl,this.dateBtn,this.controls),this.topbar.container.parentElement.insertBefore(this.footer,t.input.chatInput),this.element.append(this.backBtn,this.inputSearch.container),this.topbar.container.classList.add("hide-pinned"),this.topbar.container.parentElement.append(this.element),this.inputSearch.input.focus(),s&&(this.inputSearch.inputField.value=s)}}class lo extends B.a{constructor(e,t,s,i,n,a,o,r,l,c,d,h,p,u,m,g,b,v,f,y){super(),this.appImManager=e,this.appChatsManager=t,this.appDocsManager=s,this.appInlineBotsManager=i,this.appMessagesManager=n,this.appPeersManager=a,this.appPhotosManager=o,this.appProfileManager=r,this.appStickersManager=l,this.appUsersManager=c,this.appWebPagesManager=d,this.appPollsManager=h,this.apiManager=p,this.appDraftsManager=u,this.serverTimeManager=m,this.storage=g,this.appNotificationsManager=b,this.appEmojiManager=v,this.appMessagesIdsManager=f,this.appGroupCallsManager=y,this.wasAlreadyUsed=!1,this.type="chat",this.inited=!1,this.container=document.createElement("div"),this.container.classList.add("chat","tabs-tab"),this.backgroundEl=document.createElement("div"),this.backgroundEl.classList.add("chat-background"),this.log=Object(X.b)("CHAT",X.a.Log|X.a.Warn|X.a.Debug|X.a.Error),this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container)}setBackground(e){const t=a.default.getTheme();let s;if("color"===t.background.type&&"grabbing"===document.documentElement.style.cursor){const e=this.backgroundEl.lastElementChild;e&&e.dataset.type===t.background.type&&(s=e)}return s||(s=document.createElement("div"),s.classList.add("chat-background-item"),s.dataset.type=t.background.type),"color"===t.background.type&&(s.style.backgroundColor=t.background.color,s.style.backgroundImage="none"),new Promise(t=>{const i=()=>{const e=this.backgroundEl.lastElementChild;e!==s?(this.backgroundEl.append(s),Object(De.b)(()=>{Object(De.b)(()=>{Object(Jt.a)(s,"is-visible",!0,200,e?()=>{e.remove()}:null)})}),t()):t()};e?Object(rs.a)(s,e,i):i()})}setType(e){this.type=e,"scheduled"===this.type&&(this.getMessagesStorage=()=>this.appMessagesManager.getScheduledMessagesStorage(this.peerId))}init(){this.topbar=new ao(this,Yt,this.appMessagesManager,this.appPeersManager,this.appChatsManager,this.appNotificationsManager,this.appProfileManager,this.appUsersManager,this.appGroupCallsManager),this.bubbles=new ca(this,this.appMessagesManager,this.appStickersManager,this.appUsersManager,this.appInlineBotsManager,this.appPhotosManager,this.appPeersManager,this.appProfileManager,this.appDraftsManager,this.appMessagesIdsManager),this.input=new $a(this,this.appMessagesManager,this.appMessagesIdsManager,this.appDocsManager,this.appChatsManager,this.appPeersManager,this.appWebPagesManager,this.appImManager,this.appDraftsManager,this.serverTimeManager,this.appNotificationsManager,this.appEmojiManager,this.appUsersManager,this.appInlineBotsManager),this.selection=new Xs(this,this.bubbles,this.input,this.appMessagesManager),this.contextMenu=new ga(this.bubbles.bubblesContainer,this,this.appMessagesManager,this.appPeersManager,this.appPollsManager,this.appDocsManager,this.appMessagesIdsManager),"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()),this.container.classList.add("type-"+this.type),this.container.append(this.topbar.container,this.bubbles.bubblesContainer,this.input.chatInput),this.bubbles.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer(t)}),this.bubbles.listenerSetter.add(a.default)("dialog_drop",e=>{e.peerId===this.peerId&&this.appImManager.setPeer(Be.b)})}beforeDestroy(){this.bubbles.cleanup()}destroy(){this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),delete this.topbar,delete this.bubbles,delete this.input,delete this.selection,delete this.contextMenu,this.container.remove()}cleanup(e=!0){this.input.cleanup(e),this.selection.cleanup()}setPeer(e,t){e?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=!1;const s=this.peerId===e;if(s){if(this.setPeerPromise)return}else a.default.dispatchEvent("peer_changing",this),this.peerId=e;if(!e)return Yt.toggleSidebar(!1),this.cleanup(!0),this.topbar.setPeer(e),this.bubbles.setPeer(e),void a.default.dispatchEvent("peer_changed",e);if(!s){const t=Yt.getTab(oo);t&&t.close(),Yt.sharedMediaTab.setPeer(e,this.threadId),this.input.clearHelper(),this.selection.cleanup(),this.setAutoDownloadMedia()}this.peerChanged=s;const i=this.bubbles.setPeer(e,t);if(!i)return;const{promise:n}=i,o=this.setPeerPromise=n.finally(()=>{this.setPeerPromise===o&&(this.setPeerPromise=null)});return s||(Yt.sharedMediaTab.setLoadMutex(this.setPeerPromise),Yt.sharedMediaTab.loadSidebarMedia(!0)),i}setAutoDownloadMedia(){const e=this.peerId;if(!e)return;let t;t=e.isUser()?e.isContact()?"contacts":"private":e.isBroadcast()?"channels":"groups",this.noAutoDownloadMedia=!a.default.settings.autoDownload[t]}setMessageId(e){return this.setPeer(this.peerId,e)}finishPeerChange(e,t,s){if(this.peerChanged)return;let i=this.peerId;this.peerChanged=!0,this.cleanup(!1),this.topbar.setPeer(i),this.topbar.finishPeerChange(e,t,s),this.bubbles.finishPeerChange(),this.input.finishPeerChange(),Yt.sharedMediaTab.fillProfileElements(),this.log.setPrefix("CHAT-"+i+"-"+this.type),a.default.dispatchEvent("peer_changed",i),this.wasAlreadyUsed=!0}getMessagesStorage(){return this.appMessagesManager.getMessagesStorage(this.peerId)}getMessage(e){return this.appMessagesManager.getMessageFromStorage(this.getMessagesStorage(),e)}getMidsByMid(e){return this.appMessagesManager.getMidsByMessage(this.getMessage(e))}isAnyGroup(){return this.peerId===a.default.myId||this.peerId===Be.c||this.appPeersManager.isAnyGroup(this.peerId)}initSearch(e){if(this.peerId)if(b.b.isMobile)new ro(this.topbar,this,e);else{let t=Yt.getTab(oo);t||(t=new oo(Yt)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}}var co=s(146);class ho{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,ue.IS_TOUCH_SUPPORTED){if(Object(c.a)(e),0!=this.mouseUpCounter++)return void this.hide();this.resetSelection(this.savedRange)}this.show()}}init(){this.container=document.createElement("div"),this.container.classList.add("markup-tooltip","z-depth-1","hide"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("markup-tooltip-wrapper");const e=document.createElement("div"),t=document.createElement("div");e.classList.add("markup-tooltip-tools"),t.classList.add("markup-tooltip-tools");["bold","italic","underline","strikethrough","monospace","link"].forEach(t=>{const s=H(t,{noRipple:!0});e.append(this.buttons[t]=s),"link"!==t?s.addEventListener("mousedown",e=>{Object(c.a)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()}):Object(l.b)(s,e=>{Object(c.a)(e),this.showLinkEditor(),this.cancelClosening()})}),this.linkBackButton=H("left",{noRipple:!0}),this.linkInput=document.createElement("input"),Object(x._i18n)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",e=>{const t=!this.linkInput.value.length||!!J.b.matchUrl(this.linkInput.value);"Enter"===e.key&&(t?this.applyLink(e):(this.linkInput.classList.contains("error")&&(this.linkInput.classList.remove("error"),this.linkInput.offsetLeft),this.linkInput.classList.add("error")))}),this.linkInput.addEventListener("input",e=>{const t=this.isLinkValid();this.linkInput.classList.toggle("is-valid",t),this.linkInput.classList.remove("error")}),this.linkBackButton.addEventListener("mousedown",e=>{Object(c.a)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()}),this.linkApplyButton=H("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",e=>{this.applyLink(e)});const s=document.createElement("div");s.classList.add("markup-tooltip-link-apply-container");const i=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");i.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(i,this.buttons.link),s.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,s),this.wrapper.append(e,t),this.container.append(this.wrapper),document.body.append(this.container),window.addEventListener("resize",()=>{this.hide()})}showLinkEditor(){this.container&&this.container.classList.contains("is-visible")||this.show();const e=this.buttons.link;this.container.classList.add("is-link");const t=document.getSelection();if(this.savedRange=t.getRangeAt(0),e.classList.contains("active")){const e=this.savedRange.startContainer.parentElement;this.linkInput.value=e.href}else this.linkInput.value="";this.setTooltipPosition(!0),setTimeout(()=>{this.linkInput.focus()},200),this.linkInput.classList.toggle("is-valid",this.isLinkValid())}applyLink(e){Object(c.a)(e),this.resetSelection();let t=this.linkInput.value;t&&!J.b.matchUrlProtocol(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout(()=>{this.hide()},0)}isLinkValid(){return!this.linkInput.value.length||!!J.b.matchUrl(this.linkInput.value)}resetSelection(e=this.savedRange){const t=window.getSelection();t.removeAllRanges(),t.addRange(e),this.appImManager.chat.input.messageInput.focus()}hide(){this.init||(this.container.classList.remove("is-visible"),document.removeEventListener("mouseup",this.onMouseUpSingle),this.waitingForMouseUp=!1,j.a.removeByType("markup"),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=window.setTimeout(()=>{this.hideTimeout=void 0,this.container.classList.add("hide"),this.container.classList.remove("is-link")},200))}getActiveMarkupButton(){const e=function(){const e=[],t=window.getSelection();for(let s=0;s!!e)}(),t=[...new Set(e.map(e=>e.parentNode))],s=new Set;return t.forEach(e=>{for(const t in Ba.b){const i=Ba.b[t];e.closest(i.match+", [contenteditable]")!==this.appImManager.chat.input.messageInput&&s.add(this.buttons[t])}}),[...s]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const s=this.buttons[t];s.classList.toggle("active",e.includes(s))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),s=document.body.getBoundingClientRect(),i=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=i.top+-1*s.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,l=n.left,c=n.left+n.width-Math.min(n.width,o.width);let d;if(e){const e=this.container.getBoundingClientRect();d=Object(I.a)(e.left,l,c)}else{const e=i.left+(i.width-o.width)/2;d=Object(I.a)(e,l,c)}this.container.style.transform=`translate3d(${d}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),pa())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"),re.IS_MOBILE||j.a.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){ue.IS_TOUCH_SUPPORTED&&!re.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",e=>{Object(c.a)(e),this.mouseUpCounter=1,this.waitingForMouseUp=!1,this.setMouseUpEvent()},{once:!0}))}handleSelection(){this.addedListener||(this.addedListener=!0,document.addEventListener("selectionchange",e=>{if(document.activeElement===this.linkInput)return;if(document.activeElement!==this.appImManager.chat.input.messageInput)return void this.hide();const t=document.getSelection();if(pa(t))this.hide();else if(ue.IS_TOUCH_SUPPORTED)if(re.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=t.getRangeAt(0),this.setMouseUpEvent()}else this.setMouseUpEvent()}))}}function po(e,t,s,i,n,a,o){return[e,",",t," ",s," ",i,",",n," ",a,",",o].join("")}function uo(e,t,s,i,n,a,o,r){const l=[];return l.push("M"+(e+s/2)+","+t),l.push("H"+(e+s-a)),a>0&&l.push("A"+po(a,a,0,0,1,e+s,t+a)),l.push("V"+(t+i-o)),o>0&&l.push("A"+po(o,o,0,0,1,e+s-o,t+i)),l.push("H"+(e+r)),r>0&&l.push("A"+po(r,r,0,0,1,e+0,t+i-r)),l.push("V"+(t+n)),n>0&&l.push("A"+po(n,n,0,0,1,e+n,t+0)),l.push("Z"),l.join(" ")}de.a.generatePathData=uo;class mo{constructor(e,t){let s;this.options=t,this.onDragOver=e=>{this.container.classList.add("is-dragover")},this.onDragLeave=e=>{this.container.classList.remove("is-dragover")},this.onDrop=e=>{this.options.onDrop(e)},this.container=document.createElement("div"),this.container.classList.add("drop","z-depth-1"),this.outlineWrapper=document.createElement("div"),this.outlineWrapper.classList.add("drop-outline-wrapper"),this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("drop-outline"),this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.classList.add("drop-outline-path"),t.icon&&(s=document.createElement("div"),s.classList.add("drop-icon","tgico-"+t.icon));const i=document.createElement("div");let n;i.classList.add("drop-header"),i.append(Object(x.i18n)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append(Object(x.i18n)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,s,i,n].filter(Boolean)),e.append(this.container),this.container.addEventListener("dragover",this.onDragOver),this.container.addEventListener("dragleave",this.onDragLeave),this.container.addEventListener("drop",this.onDrop)}destroy(){delete this.options,this.container.remove(),this.container.removeEventListener("dragover",this.onDragOver),this.container.removeEventListener("dragleave",this.onDragLeave),this.container.removeEventListener("drop",this.onDrop)}setPath(){const e=this.outlineWrapper.getBoundingClientRect();this.svg.setAttributeNS(null,"preserveAspectRatio","none"),this.svg.setAttributeNS(null,"viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttributeNS(null,"width",""+e.width),this.svg.setAttributeNS(null,"height",""+e.height);const t=uo(5,5,e.width-10,e.height-10,10,10,10,10);this.path.setAttributeNS(null,"d",t)}}function go(e){e.forEach(e=>e.classList.add("no-transition")),Object(De.a)().then(()=>{e.forEach(e=>e.classList.remove("no-transition"))})}var bo,vo=s(140);class fo extends ut.b{constructor(e,t){super("popup-join-chat-invite",Object(ut.a)([{langKey:t.pFlags.broadcast?"JoinByPeekChannelTitle":"JoinByPeekGroupTitle",callback:()=>{ht.a.invokeApi("messages.importChatInvite",{hash:e}).then(e=>{si.a.processUpdateMessage(e);const t=e.chats[0].id.toPeerId(!0);a.default.dispatchEvent("history_focus",{peerId:t})})}}]),{closable:!0,overlayClosable:!0,body:!0}),this.header.remove();const s=new ur;s.setAttribute("dialog","0"),s.classList.add("avatar-100"),"photo"===t.photo._?(t.photo=r.a.savePhoto(t.photo),Ls({container:s,message:null,photo:t.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):d.a.putPhoto(s,Be.b,!1,t.title);const i=document.createElement("div");i.classList.add("chat-title"),i.innerHTML=J.b.wrapEmojiText(t.title);const n=t.pFlags.broadcast,o=Object(x.i18n)(n?"Subscribers":"Members",[t.participants_count]);o.classList.add("chat-participants-count"),this.body.append(s,i,o)}}!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"}(bo||(bo={}));var yo=s(24),wo=s(137),So=s(118);class Lo{constructor(e){this.maxRadius=10,this.minRadius=0,this.N=e,this.radius=new Array(e+1),this.radiusNext=new Array(e+1),this.progress=new Array(e+1),this.speed=new Array(e+1);for(let t=0;t<=e;t++)this.generateBlob(this.radius,t),this.generateBlob(this.radiusNext,t),this.progress[t]=0}generateBlob(e,t){const{maxRadius:s,minRadius:i,speed:n}=this,a=s-i;e[t]=i+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:s,N:i}=this;for(let n=0;n=1&&(i[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,s,i,n,a,o,r){if(n.getContext){const l=n.getContext("2d");l.beginPath(),l.moveTo(s,i),l.lineTo(e,i);const{radius:c,radiusNext:d,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const s=this.progress[n],i=(t-(c[n]*(1-s)+d[n]*s))*r+o*(1-r);l.lineTo(e,i)}else{const a=this.progress[n-1],p=c[n-1]*(1-a)+d[n-1]*a,u=this.progress[n],m=(s-e)/h*(n-1),g=(s-e)/h*n,b=m+(g-m)/2,v=(t-p)*r+o*(1-r),f=(t-(c[n]*(1-u)+d[n]*u))*r+o*(1-r);l.bezierCurveTo(b,v,b,f,g,f),n===h&&l.lineTo(s,i)}a(l),l.fill(),l.closePath()}}}class Eo{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,s,i,n,a)=>{t.fillStyle=Eo.getGradientFromType(t,e,s,i,n,a)}}static getGradientFromType(e,t,s,i,n,a){const o=e.createLinearGradient(s,i,n,a);return t===So.a.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===So.a.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===So.a.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===So.a.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,s,i){}}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:s,lbd2:i,scale:n,left:a,top:o,right:r,bottom:l,currentState:c,previousState:d,focused:h,resizing:p,canvas:u}=this;if(!h&&!p&&this.progressToState>=1)return;let m=Date.now()-this.lastUpdateTime;m>20&&(m=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*m,this.animateAmplitudeDiff>0?this.amplitude>this.animateToAmplitude&&(this.amplitude=this.animateToAmplitude):this.amplitude0?this.amplitude2>this.animateToAmplitude&&(this.amplitude2=this.animateToAmplitude):this.amplitude21&&(this.progressToState=1,this.previousState=null));const{amplitude:g,amplitude2:b,progressToState:v}=this,f=6*b*n,y=6*b*n;u.getContext("2d").clearRect(0,0,u.width,u.height),t.minRadius=0,t.maxRadius=(2+2*g)*n,s.minRadius=0,s.maxRadius=(3+9*g)*n,i.minRadius=0,i.maxRadius=(3+9*g)*n,t.update(g,.3),s.update(g,.7),i.update(g,.7);for(let e=0;e<2;e++){if(0===e&&!d)continue;let n=1,h=null;0===e?(n=1-v,h=d):(n=d?v:1,c.update(l-o,r-a,m,g),h=c);const p=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,l)},b=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,l)};s.draw(a,o-f,r,l,u,p,o,1),i.draw(a,o-y,r,l,u,p,o,1),t.draw(a,o,r,l,u,b,o,1)}e||(this.raf=requestAnimationFrame(()=>this.draw()))},this.setCurrentState=(e,t)=>{const{currentState:s,states:i}=this;(null==s?void 0:s.stateId)!==e&&(this.previousState=t?s:null,this.currentState=i.get(e),this.progressToState=this.previousState?0:1)},this.focused=!0,this.resizing=!1,this.lastUpdateTime=Date.now(),this.amplitude=0,this.amplitude2=0,this.states=new Map([[So.a.UNMUTED,new Eo(So.a.UNMUTED)],[So.a.MUTED,new Eo(So.a.MUTED)],[So.a.MUTED_BY_ADMIN,new Eo(So.a.MUTED_BY_ADMIN)],[So.a.CONNECTING,new Eo(So.a.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(So.a.CONNECTING),this.progressToState=1}componentDidMount(){this.mounted||(this.mounted=!0,window.addEventListener("resize",this.handleResize),this.media=window.matchMedia("screen and (min-resolution: 2dppx)"),this.media.addEventListener("change",this.handleDevicePixelRatioChanged),this.setSize(),this.forceUpdate(),this.lbd=new Lo(3),this.lbd1=new Lo(7),this.lbd2=new Lo(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(){const e=this.container=document.createElement("div");e.classList.add("topbar-call-weave");const t=this.canvas=document.createElement("canvas");return t.classList.add("topbar-call-weave-canvas"),e.append(t),e}}var Io=new class{constructor(){this.cache={},a.default.addEventListener("theme_change",()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(let t in e)this.getProperty(t)})}getProperty(e){let t=this.cache[e];return t||(this.computedStyle||(this.computedStyle=window.getComputedStyle(document.documentElement)),t=this.computedStyle.getPropertyValue("--"+e).trim(),this.cache[e]=t)}};class Mo{constructor(e,t){this.item=e,Object(w.g)(this,t)}play(){return this.item.playPart(this)}}class Po{constructor(e,t){this.icon=e,this.autoplay=!1,Object(w.g)(this,t),this.parts=this.parts.map(e=>this.createPart(e))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:s,canvas:i,width:n,height:a}=this.icon;return t=le.a.loadAnimationAsAsset({container:s,canvas:i,width:n,height:a,group:"none",loop:!1,autoplay:null!==(e=this.autoplay)&&void 0!==e&&e,initFrame:this.initFrame,skipFirstFrameRendering:void 0===this.initFrame,color:this.color,inverseColor:this.inverseColor},this.name).then(e=>le.a.waitForFirstFrame(e)).then(e=>{this.player=e}),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){return this.icon.playPart(this,e)}}class To{constructor(e){Object(w.g)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:s}=this;this.container.style.width=t+"px",this.container.style.height=s+"px";const i=this.canvas=document.createElement("canvas");i.classList.add("rlottie"),i.width=t,i.height=s,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(_e.a)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new Po(this,e);return this.items.set(e.name,t),t}playPart(e,t){if(!e.player)return;const s=e.getPart(t);e.player.playPart({from:s.startFrame,to:s.endFrame})}playToPart(e,t,s){if(!e.player)return;const i=e.getPart(t),n=s?i.endFrame:i.startFrame;e.player.playToFrame({frame:n})}static generateEqualParts(e,t){return new Array(e).fill(0).map((e,s)=>{const i=s*t;return{startFrame:i,endFrame:i+t-1}})}}class ko extends To{constructor(e){super({width:e.width,height:e.height}),Object(w.g)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const s=this.getPart(e),i=void 0!==t&&this.getColor&&this.getColor(t),n=s.item;n.initFrame=s.endFrame,n.color=i;const a=[...this.items.values()].map(e=>e.load());return Promise.all(a).then(_e.a)}setState(e,t){this.loaded||this.load(e,t),void 0!==e&&this.setPartState(e),void 0!==t&&this.getColor&&this.setColorState(t)}setPartState(e){const{partState:t}=this;if(t===e)return;this.partState=e;this.getPart(e,t).play()}setColorState(e){const{colorState:t}=this;if(t===e)return;this.colorState=e;const s=this.getItem();if(s.player){const i=this.getColor(e,t);s.player.setColor(i)}}destroy(){this.items.forEach(e=>{e.loadPromise.then(()=>{e.player.remove()})})}}class xo extends ko{constructor(){super({width:36,height:36,getPart:(e,t)=>{const s=Vo;let i;switch(e){case s.HAND:i=t===s.MUTED?"muted-to-hand":"unmuted-to-hand";break;case s.MUTED:i=t===s.HAND?"hand-to-muted":"mute";break;case s.UNMUTED:i="unmute"}return this.getItem().getPart(i)}});this.container.classList.add("group-call-microphone-icon-container");this.add({name:"voip_filled",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:172,name:"unmuted-to-hand"},{startFrame:173,endFrame:201,name:"scheduled-crossing"},{startFrame:202,endFrame:236,name:"scheduled-to-muted"},{startFrame:237,endFrame:273,name:"scheduled-to-hand"},{startFrame:274,endFrame:310,name:"scheduled-crossed-to-hand"},{startFrame:311,endFrame:343,name:"scheduled-uncrossing"},{startFrame:344,endFrame:375,name:"scheduled-to-muted"},{startFrame:376,endFrame:403,name:"play-to-muted"}]})}}function Oo(e){return new Promise((t,s)=>{const{button:i,checkbox:n}=e;i.callback=e=>{t(e?!!e.size:void 0)};const a=Object(ut.a)([]);a[0].callback=()=>{s()},a.unshift(i),e.buttons=a,e.checkboxes=n&&[n],new gt("popup-confirmation",e).show()})}class Ao extends ko{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const s=zo;let i;switch(e){case s.HAND:i=3;break;case s.MUTED:i=t===s.HAND?0:2;break;case s.UNMUTED:i=1}return this.getItem().getPart(i)},getColor:e?(e,t)=>function(e){const t=zo;let s,i;switch(e){case t.HAND:i="blue";break;case t.MUTED:case t.MUTED_FOR_ME:case t.MUTED_BY_ADMIN:i=e===t.MUTED?"secondary":"red";break;case t.UNMUTED:i="green"}const n=Io.getProperty("gc-"+i+"-text-color");return s=function(e){return Oi(e.slice(0,7))}(n),s}(e):void 0}),this.colored=e;this.container.classList.add("group-call-participant-muted-icon-container");const t=To.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=zo;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}class _o{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add("group-call-participant-status-container")}setState(e,t){const s=zo,i=this.withIcons.filter(e=>!!t[e]).map(e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),s=document.createElement("i");return s.classList.add("group-call-participant-status-icon","group-call-participant-status-icon-"+e,t),s});let n,a;if(e===s.MUTED_FOR_ME)n=Object(x.i18n)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===s.UNMUTED)n=Object(x.i18n)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===s.HAND)n=Object(x.i18n)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!i.length)return void g(this.container,J.b.wrapEmojiText(t.about));n=Object(x.i18n)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add("group-call-participant-status",a),o.append(...i,n),Object(k.a)(this.container,o)}}class Fo extends _s{constructor(e){super({getIndex:e=>e.participant.date,onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>{const{participant:t}=e,s=Ko(t);e.mutedIcon.setState(s),e.status.setState(s,t)},onSort:(e,t)=>{As(e.dom.listEl,this.list,t)},onElementCreate:t=>{const{dom:s}=kr.addDialogNew({dialog:t.id,container:!1,drawStatus:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});s.listEl.classList.add("group-call-participant");const i=e.participants.get(t.id),n=Ko(i),a=new Ao(!0),o=new _o(["presentation","video"]);return a.setState(n),o.setState(n,i),Object(k.a)(s.lastMessageSpan,o.container),s.listEl.append(a.container),t.dom=s,t.participant=i,t.mutedIcon=a,t.status=o,t},updateElementWith:De.b}),this.instance=e,this.avatarSize=54,this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=kr.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach(e=>{this.onElementDestroy(e)})}onElementDestroy(e){e.mutedIcon.destroy()}}class Do{constructor(e,t,s){this.appPeersManager=e,this.instance=t,this.source=s,this.container=document.createElement("div"),this.container.classList.add("group-call-participant-video-container"),this.info=document.createElement("div"),this.info.classList.add("group-call-participant-video-info"),this.left=document.createElement("div"),this.left.classList.add("group-call-participant-video-info-left"),this.right=document.createElement("div"),this.right.classList.add("group-call-participant-video-info-right"),this.info.append(this.left,this.right),this.container.append(this.info)}setPinned(e){if(!e)return void(this.header&&(this.header.remove(),this.header=void 0));if(this.header)return;this.header=document.createElement("div"),this.header.classList.add("group-call-participant-video-header");const t=document.createElement("i");t.classList.add("group-call-pin-icon","tgico-pin"),this.header.append(t),this.container.append(this.header)}setParticipant(e,t,s){let i;e.pFlags.self?(i=Object(x.i18n)("VoiceChat.Status.You"),i.classList.add("peer-title")):(this.peerTitle=new Lt.a({peerId:this.appPeersManager.getPeerId(e.peer)}),i=this.peerTitle.element),this.groupCallParticipantMutedIcon=new Ao(!1),this.groupCallParticipantStatus=new _o([t]),this.left.append(i,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container);const n="group-call-participant-video";s.classList.add(n),s.paused&&s.play();const a=document.createElement("canvas");a.classList.add(n+"-blur");if(a.width=16,a.height=16,s){const e=a.getContext("2d");e.filter="blur(2px)";const t=()=>{e.drawImage(s,0,0,s.videoWidth,s.videoHeight,0,0,a.width,a.height)};Object(os.a)(()=>(t(),a.isConnected)),t()}this.container.prepend(a,s),this.updateParticipant(e)}updateParticipant(e){const t=Ko(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class jo extends Pe{constructor(e){super(),Object(w.g)(this,e);const t=this.container=document.createElement("div");this.container.classList.add("group-call-participants-video-container"),e.appendTo.append(t),this.participantsElements=new Map,this.containers=new Map;const{listenerSetter:s}=this;s.add(a.default)("group_call_participant",({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)}),s.add(a.default)("group_call_pinned",({instance:e,source:t})=>{this.instance===e&&this.participantsElements.forEach(e=>{e.forEach(e=>{this.setElementDisplay(e,t)})})}),Object(l.b)(this.container,e=>{const t=Object(Me.a)(e.target,"group-call-participant-video-container");if(!t)return;const s=this.containers.get(t);this.instance.pinnedSource!==s.source?this.instance.pinSource(s.source):this.instance.unpinAll()},{listenerSetter:s}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:s,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const s=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!s);const i=e.source===t;e.setPinned(i)}updateParticipant(e){const t=this.appPeersManager.getPeerId(e.peer),s=["video","presentation"],i=s.some(t=>!!e[t]);let n=this.participantsElements.get(t);(i||n)&&(n||this.participantsElements.set(t,n=new Map),s.forEach(s=>{let i=n.get(s);const a=e[s];if(!!a!=!!i){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,s);if(!t)return;const{video:a,source:o}=t;i=new Do(this.appPeersManager,this.instance,o),this.containers.set(i.container,i),this.setElementDisplay(i,this.instance.pinnedSource),n.set(s,i),i.setParticipant(e,s,a),this.container.prepend(i.container)}else n.delete(s),i.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(i.container),i.destroy());this._onLengthChange()}else i&&i.updateParticipant(e)}))}_onLengthChange(){const e=this.container.childElementCount;this.container.dataset.length=""+e,this.container.dataset.layout=e<=2?"1":3===e?"3":"4",this.onLengthChange&&this.onLengthChange(e)}setInstance(e){e.participants.forEach(e=>{this.updateParticipant(e)})}destroy(){this.containers.forEach(e=>{e.destroy()})}}class Bo{constructor(e){this.onOpenProfileClick=()=>{const e=ut.b.getPopup(qo);e&&e.hide(),a.default.dispatchEvent("history_focus",{peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.appGroupCallsManager.editParticipant(this.instance.id,this.participant,{muted:e})},this.buttons=[{icon:"gc_microphoneoff",text:"VoiceChat.MutePeer",verify:()=>this.canManageCall&&this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmutePeer",verify:()=>this.canManageCall&&!this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"gc_microphoneoff",text:"VoiceChat.MuteForMe",verify:()=>!this.canManageCall&&!this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmuteForMe",verify:()=>!this.canManageCall&&this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"newprivate",text:"VoiceChat.OpenProfile",verify:()=>!0,onClick:this.onOpenProfileClick},{icon:"deleteuser danger",text:"VoiceChat.RemovePeer",verify:()=>this.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>{Oo({peerId:this.targetPeerId,title:new Lt.a({peerId:this.targetPeerId}).element,descriptionLangKey:this.appChatsManager.isBroadcast(this.chatId)?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new Lt.a({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then(()=>{this.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)},_e.a)}}];const{listenerSetter:t}=e;this.appChatsManager=e.appChatsManager,this.appPeersManager=e.appPeersManager,this.appGroupCallsManager=e.appGroupCallsManager,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=Ee(this.buttons,t),this.element.classList.add("group-call-participant-menu","night"),Object(te.a)(e.onContextElement,e=>{const t=Object(Me.a)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==s&&s.append(this.element);const i=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=this.instance.getParticipantByPeerId(i),this.participant.pFlags.self||(this.canManageCall=this.appChatsManager.hasRights(this.chatId,"manage_call"),this.buttons.forEach(e=>{e.element.classList.toggle("hide",!e.verify(i))}),Object(c.a)(e),Object(te.e)(e.touches?e.touches[0]:e,this.element,"right"),Object(te.d)(this.element))},t),t.add(a.default)("group_call_participant",({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=this.appPeersManager.getPeerId(t.peer);this.targetPeerId===e&&Object(te.c)()}});let s=document.body;Object(Te.a)(document.body,()=>{const e=Object(Te.d)();s=e?ut.b.getPopup(qo).getContainer():document.body,e||Object(te.c)()},t)}}class Ro{constructor(e){Object(w.g)(this,e);const t=new T.b(void 0);t.container.classList.add("group-call-participants-scrollable");const s=this.container=document.createElement("div");s.classList.add("group-call-participants");const i=this.sortedList=new Fo(this.instance),{instance:n,listenerSetter:o}=this;this.contextMenu=new Bo(Object.assign(Object.assign({},e),{onContextElement:i.list,listenerSetter:o,instance:n})),this.groupCallParticipantsVideo=new jo(Object.assign(Object.assign({},e),{appendTo:t.container,displayPinned:!1})),t.append(i.list),s.append(t.container),e.appendTo.append(s),o.add(a.default)("group_call_participant",({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)});new yt({scrollable:t,getPromise:()=>this.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants:e,isEnd:t})=>(e.forEach(e=>{this.updateParticipant(e)}),t))});this.setInstance(n)}updateParticipant(e){const t=this.appPeersManager.getPeerId(e.peer),s=this.sortedList.has(t);e.pFlags.left?s&&this.sortedList.delete(t):s?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){e.participants.forEach(e=>{this.updateParticipant(e)})}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class Uo{constructor(e){this.appendTo=e,this.descriptionIntl=new x.default.IntlElement({key:"VoiceChat.Status.Connecting"}),this.descriptionIntl.element.classList.add("group-call-description"),e.append(this.descriptionIntl.element)}update(e){const{state:t}=e;let s,i;t===So.a.CONNECTING?s="VoiceChat.Status.Connecting":(s="VoiceChat.Status.Members",i=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.key===s&&Object(w.b)(n.args,i)||(n.key=s,n.args=i,n.update())}}class Ho{constructor(e){this.appendTo=e,this.peerTitle=new Lt.a({peerId:0})}update(e){const{peerTitle:t,appendTo:s}=this,i=e.groupCall,n=e.chatId.toPeerId(!0);i.title?g(s,J.b.wrapEmojiText(i.title)):t.peerId!==n&&(t.peerId=n,t.update(),s.append(t.element))}}class No extends B.a{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},Object(w.g)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add("movable-element"),this.addResizeHandlers(),this.setSwipeHandler(),b.b.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove("movable-element"),this.handlers&&this.handlers.forEach(e=>{e.remove()})}destroy(){b.b.removeEventListener("resize",this.onResize),this.swipeHandler.removeListeners()}addResizeHandlers(){this.handlers=["n","e","s","w","ne","se","sw","nw"].map(e=>{const t=document.createElement("div");return t.dataset.side=e,t.classList.add("movable-element-resize-handler","movable-element-resize-handler-side-"+e),this.element.append(t),t})}setSwipeHandler(){let e,t,s,i,n;const a=this.swipeHandler=new Vt({element:this.element,onSwipe:(a,o,r)=>{if(a*=-1,o*=-1,n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,i=Math.abs(a)*(e?1:-1),o=n.includes("e")?Et.a.width-t:s+t;this.width=Math.min(o,s+i)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,s=Math.abs(o)*(t?1:-1),a=n.includes("s")?Et.a.height-e:i+e;this.height=Math.min(a,i+s)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+s-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+i-this.minHeight,e+o))}else this.top=e+o,this.left=t+a;this.fixPosition(),this.setPosition()},verifyTouchTarget:e=>{const t=e.target;if(Object(Me.a)(t,"chatlist")||Object(Me.a)(t,"group-call-button")||Object(Me.a)(t,"btn-icon")||Object(Me.a)(t,"group-call-participants-video-container")||Object(Te.d)())return!1;const s=Object(Me.a)(t,"movable-element-resize-handler");return s?(n=s.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,s=this.width,i=this.height}})}setPositionToCenter(){this.top=Et.a.height/2-this.height/2,this.left=Et.a.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=Object(I.a)(this.width,this.minWidth,Et.a.width),this.height=Object(I.a)(this.height,this.minHeight,Et.a.height)}fixPosition(){this.top=Object(I.a)(this.top,0,Et.a.height-this.height),this.left=Object(I.a)(this.left,0,Et.a.width-this.width)}setPosition(){this.element.style.top=this.top+"px",this.element.style.left=this.left+"px",this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.width=this.width+"px",this.element.style.height=this.height+"px",this.dispatchEvent("resize")}get width(){return this._width}get height(){return this._height}set width(e){this._width=e}set height(e){this._height=e}get state(){const{top:e,left:t,width:s,height:i}=this;return{top:e,left:t,width:s,height:i}}set state(e){const{top:t,left:s,width:i,height:n}=e;this.top=t,this.left=s,this.width=i,this.height=n,this.onResize()}}var zo,Vo,Go=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}));function Ko(e){const t=zo;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"}(zo||(zo={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(Vo||(Vo={}));let Wo={width:420,height:640};class qo extends ut.b{constructor(e){super("popup-group-call",void 0,{body:!0,withoutOverlay:!0,closable:!0}),this.onFullScreenChange=()=>{this.toggleBigLayout();const e=Object(Te.d)(),{btnFullScreen:t,btnExitFullScreen:s}=this,i=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),s&&s.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==i&&(C.a.checkAnimations(e),a.default.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{const e=(Object(Te.d)()||!!(this.movable&&this.movable.width>=680))&&!!this.videosCount,t=this.container.classList.contains("is-big-layout");let s;e&&!t&&(s=Array.from(this.buttonsContainer.children),s.forEach(e=>{e.style.opacity="0"}),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",e),this.btnInvite.classList.toggle("hide",e),this.btnShowColumn.classList.toggle("hide",!e),s&&s.forEach(e=>{e.style.opacity=""})},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},Object(w.g)(this,e),this.videosCount=0,this.container.classList.add("group-call","night");const t=this.instance=this.appGroupCallsManager.groupCall,{listenerSetter:s}=this;if(!re.IS_APPLE_MOBILE){const e=this.btnFullScreen=H("fullscreen"),t=(this.btnFullScreen2=H("fullscreen group-call-cfs"),this.btnExitFullScreen=H("smallscreen"));Object(l.b)(e,()=>{Object(Te.e)(this.container)},{listenerSetter:s}),Object(l.b)(t,()=>{Object(Te.b)()},{listenerSetter:s}),Object(Te.a)(this.container,this.onFullScreenChange,s)}this.btnInvite=H("adduser");const i=this.btnShowColumn=H("rightpanel group-call-only-big");this.toggleMovable(!ue.IS_TOUCH_SUPPORTED),Object(l.b)(i,this.toggleRightColumn,{listenerSetter:s});const n=document.createElement("div");n.classList.add("group-call-header-info"),this.title.classList.add("group-call-header-title");const o=document.createElement("div");o.classList.add("group-call-header-subtitle"),n.append(this.title,o),this.header.classList.add("group-call-header"),this.header.append(...[this.btnExitFullScreen,n,this.btnFullScreen,i].filter(Boolean));const r=this.header.cloneNode(!1),c=n.cloneNode(!1),d=this.title.cloneNode(!1);c.append(d);const h=H("rightpanel");r.append(...[h,c,this.btnFullScreen2].filter(Boolean)),Object(l.b)(h,this.toggleRightColumn,{listenerSetter:s}),this.body.prepend(r);const p=new T.b(void 0);p.container.classList.add("group-call-big-video-container"),this.container.append(p.container),this.groupCallTitle=new Ho(this.title),this.groupCallDescription=new Uo(o),this.groupCallBodyHeaderDescription=new Uo(d),this.groupCallParticipantsVideo=new jo(Object.assign({appendTo:p.container,instance:t,listenerSetter:s,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()}},e)),this.groupCallParticipants=new Ro(Object.assign({appendTo:this.body,instance:t,listenerSetter:s},e));{const e=this.buttonsContainer=document.createElement("div");e.classList.add("group-call-buttons"),this.listenerSetter.add(this.groupCallParticipantsVideo)("toggleControls",t=>{this.container.classList.toggle("show-controls",t),e.classList.toggle("show-controls",t)});const t=e=>{const t=document.createElement("div");return t.classList.add("group-call-button","rp-overflow"),e.noRipple||Object(se.ripple)(t),e.isDanger&&t.classList.add("group-call-button-red"),t},i=t({text:"VoiceChat.Video.Stream.Video"});i.classList.add("tgico-videocamera_filled"),Object(l.b)(i,()=>{const e=Object(bt.a)([i],!0);this.instance.toggleVideoSharing().finally(()=>{e()})},{listenerSetter:s});const n=t({text:"VoiceChat.Video.Stream.Screencast"});n.classList.add("tgico-sharescreen_filled"),n.classList.toggle("hide",!Go),Object(l.b)(n,()=>{const e=Object(bt.a)([n],!0);this.instance.toggleScreenSharing().finally(()=>{e()})},{listenerSetter:s});const a=t({noRipple:!0});a.classList.add("group-call-microphone-button");const o=this.groupCallMicrophoneIcon=new xo;a.append(o.container);const r=Object(Di.a)(()=>{const e=this.instance.participant;e.pFlags.can_self_unmute?this.instance.toggleMuted():void 0===e.raise_hand_rating&&this.instance.changeRaiseHand(!0)},600,!0);Object(l.b)(a,r,{listenerSetter:s});const c=t({text:"VoiceChat.Video.Stream.More"});c.classList.add("tgico-settings_filled","btn-disabled"),c.classList.toggle("hide",!Go);const d=t({text:"VoiceChat.Leave",isDanger:!0});d.classList.add("tgico-close"),Object(l.b)(d,()=>{const e=e=>{this.instance.hangUp(e)};this.appChatsManager.hasRights(this.instance.chatId,"manage_call")?new gt("popup-end-video-chat",{titleLangKey:"VoiceChat.End.Title",descriptionLangKey:"VoiceChat.End.Text",checkboxes:[{text:"VoiceChat.End.Third"}],buttons:[{langKey:"VoiceChat.End.OK",callback:t=>{e(!!t.size)},isDanger:!0}]}).show():e(!1)},{listenerSetter:s}),e.append(i,n,a,c,d),this.container.append(e)}s.add(a.default)("group_call_state",e=>{this.instance===e&&this.updateInstance()}),s.add(a.default)("group_call_update",e=>{this.instance.id===e.id&&this.updateInstance()}),s.add(a.default)("group_call_pinned",({instance:e})=>{this.instance===e&&this.setHasPinned()}),s.add(b.b)("changeScreen",(e,t)=>{t!==b.a.mobile&&e!==b.a.mobile||this.toggleMovable(!ue.IS_TOUCH_SUPPORTED)}),this.addEventListener("close",()=>{const{movable:e}=this;e&&(Wo=e.state),this.groupCallParticipantsVideo.destroy(),this.groupCallParticipants.destroy(),this.groupCallMicrophoneIcon.destroy(),e&&e.destroy()}),this.toggleRightColumn(),this.onFullScreenChange(),this.updateInstance()}getContainer(){return this.container}toggleMovable(e){if(e){if(this.movable)return;const e=this.movable=new No({minWidth:400,minHeight:480,element:this.element});e.state=Wo,void 0===Wo.top&&e.setPositionToCenter(),this.listenerSetter.add(e)("resize",this.toggleBigLayout)}else{if(!this.movable)return;this.movable.destroyElements(),this.movable.destroy(),this.movable=void 0}}setHasPinned(){this.container.classList.toggle("has-pinned",!!this.instance.pinnedSource)}updateInstance(){if(this.instance.state===So.a.CLOSED)return this.container.classList.contains("is-full-screen")&&Object(Te.b)(),void this.hide();this.setTitle(),this.setDescription(),this.setHasPinned();const e=function(e,t){const s=Vo;return t.pFlags.can_self_unmute?t.pFlags.muted?s.MUTED:s.UNMUTED:s.HAND}(this.instance.groupCall,this.instance.participant);this.container.dataset.micState=e===Vo.HAND?"hand":e===Vo.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(e)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}class Qo extends ko{constructor(){super({width:36,height:36,getPart:e=>this.getItem().getPart(e?"unmute":"mute")}),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"}]})}}class $o{constructor(e,t,s){this.appGroupCallsManager=e,this.appPeersManager=t,this.appChatsManager=s;const i=this.listenerSetter=new R.a;i.add(a.default)("group_call_state",e=>{this.updateInstance(e)}),i.add(a.default)("group_call_update",e=>{const t=this.appGroupCallsManager.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)}),i.add(a.default)("group_call_amplitude",({amplitudes:e,type:t})=>{const{weave:s}=this;if(!e.length||!s)return;let i=0;for(let t=0;ti?n:i}s.setAmplitude(i)})}updateInstance(e){this.construct&&(this.construct(),this.construct=void 0);const{state:t,id:s}=e,{weave:i,container:n}=this;i.componentDidMount();const a=t===So.a.CLOSED;if(document.body.classList.contains("is-calling")&&!a||(a&&i.setAmplitude(0),Object(Jt.a)(document.body,"is-calling",!a,250,a?()=>{i.componentWillUnmount()}:void 0)),a)return;t===So.a.CONNECTING?i.setCurrentState(So.a.CONNECTING,!0):i.setCurrentState(t,!0),n.dataset.callId=""+s,this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(t===So.a.UNMUTED);const o="state-"+t;n.classList.contains(o)}setDescription(e){return this.groupCallDescription.update(e)}setTitle(e){return this.groupCallTitle.update(e)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header","topbar-call-container");const s=document.createElement("div");s.classList.add("topbar-call-left");const i=this.groupCallMicrophoneIconMini=new Qo,n=H();n.append(i.container),s.append(n);const a=Object(Di.a)(()=>{this.appGroupCallsManager.toggleMuted()},600,!0);Object(l.b)(n,e=>{Object(c.a)(e),a()},{listenerSetter:e});const o=this.center=document.createElement("div");o.classList.add("topbar-call-center"),this.groupCallTitle=new Ho(o),this.groupCallDescription=new Uo(s);const r=document.createElement("div");r.classList.add("topbar-call-right");const d=H("endcall_filled");r.append(d),Object(l.b)(d,e=>{Object(c.a)(e),this.appGroupCallsManager.hangUp(t.dataset.callId,!1,!1)},{listenerSetter:e}),Object(l.b)(t,()=>{ut.b.getPopup(qo)||new qo({appGroupCallsManager:this.appGroupCallsManager,appPeersManager:this.appPeersManager,appChatsManager:this.appChatsManager}).show()},{listenerSetter:e}),t.append(s,o,r);const h=this.weave=new Co,p=h.render();t.prepend(p),document.getElementById("column-center").prepend(t),h.componentDidMount()}}var Yo=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Xo="chat",Jo=ue.IS_TOUCH_SUPPORTED?"touchstart":"mousemove";const Zo=new class{constructor(){this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.tabId=-1,this.chats=[],this.backgroundPromises={},this.onHashChange=()=>{const e=location.hash,t=e.split("?"),s=this.parseUriParams(e,t);if(this.log("hashchange",e,t[0],s),s.tgaddr){j.a.replaceState();const{onclick:e}=J.b.wrapUrl(s.tgaddr);if(e){const t=document.createElement("a");t.href=s.tgaddr,window[e](t)}}else switch(t[0]){case"#/im":{const e=s.p;let t=void 0!==s.post?v.a.generateMessageId(+s.post):void 0;switch(e[0]){case"@":this.openUsername(e,t);break;default:this.setInnerPeer(t?e.toPeerId(!0):e.toPeerId(),t)}}}},this.setSettings=()=>{document.documentElement.style.setProperty("--messages-text-size",a.default.settings.messagesTextSize+"px"),document.body.classList.toggle("animation-level-0",!a.default.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",a.default.settings.animationsEnabled),this.chatsSelectTabDebounced=dt(()=>{const e=this.chat.topbar;e.pinnedMessage&&e.pinnedMessage.setCorrectIndex(0),ht.a.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)},a.default.settings.animationsEnabled?250:0,!1,!0),le.a.setLoop(a.default.settings.stickers.loop),C.a.checkAnimations(!1);for(const e of this.chats)e.setAutoDownloadMedia();x.default.setTimeFormat(a.default.settings.timeFormat)},this.onDocumentPaste=(e,t)=>{const s=Ma();if(this.canDrag()||s){if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&Object(c.a)(e)}Object(me.d)(e).then(e=>{if(e.length){if(s)return void s.addFiles(e);const i=this.chat.input;i.willAttachType=t||(m.has(e[0].type)?"media":"document"),new Pa(this.chat,e,i.willAttachType)}})}},si.a.attach(),Dt.a.start(),this.log=Object(X.b)("IM",X.a.Log|X.a.Warn|X.a.Debug|X.a.Error),this.selectTab(0),window.addEventListener("blur",()=>{C.a.checkAnimations(!0),this.offline=a.default.idle.isIDLE=!0,this.updateStatus(),clearInterval(this.updateStatusInterval),a.default.dispatchEvent("idle",a.default.idle.isIDLE),window.addEventListener("focus",()=>{this.offline=a.default.idle.isIDLE=!1,this.updateStatus(),this.updateStatusInterval=window.setInterval(()=>this.updateStatus(),5e4),C.a.checkAnimations(!1),a.default.dispatchEvent("idle",a.default.idle.isIDLE)},{once:!0})}),window.addEventListener(Jo,()=>{this.updateStatusInterval=window.setInterval(()=>this.updateStatus(),5e4),this.updateStatus(),this.offline=a.default.idle.isIDLE=!1,a.default.dispatchEvent("idle",a.default.idle.isIDLE)},{once:!0,passive:!0}),this.chatsContainer=document.createElement("div"),this.chatsContainer.classList.add("chats-container","tabs-container"),this.chatsContainer.dataset.animation="navigation",this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),j.a.onHashChange=this.onHashChange,this.setSettings(),a.default.addEventListener("settings_updated",this.setSettings),Object(ks.a)(()=>{C.a.setOnlyOnePlayableGroup("lock"),C.a.checkAnimations(!0)},()=>{C.a.setOnlyOnePlayableGroup(""),C.a.checkAnimations(!1)}),this.applyCurrentTheme(),b.b.addEventListener("changeScreen",(e,t)=>{document.body.classList.contains("is-left-column-shown")&&document.body.classList.contains("is-right-column-shown")&&Yt.toggleSidebar(!1)}),a.default.addEventListener("history_focus",e=>{let{peerId:t,threadId:s,mid:i}=e;s&&(s=v.a.generateMessageId(s)),i&&(i=v.a.generateMessageId(i)),this.setInnerPeer(t,i,s?"discussion":void 0,s)}),a.default.addEventListener("peer_changing",e=>{this.saveChatPosition(e)}),a.default.addEventListener("theme_change",()=>{this.applyCurrentTheme()}),a.default.addEventListener("choosing_sticker",e=>{this.setChoosingStickerTyping(!e)}),a.default.addEventListener("instance_deactivated",()=>{const e=new ut.b("popup-instance-deactivated",void 0,{overlayClosable:!0}),t=document.createElement("div");t.classList.add("instance-deactivated-container"),e.container.replaceWith(t);const s=document.createElement("div");s.classList.add("header"),s.append(Object(x.i18n)("Deactivated.Title"));const i=document.createElement("div");i.classList.add("subtitle"),i.append(Object(x.i18n)("Deactivated.Subtitle")),t.append(s,i),document.body.classList.add("deactivated"),e.onClose=()=>{document.body.classList.add("deactivated-backwards"),vo.a.activateInstance(),setTimeout(()=>{document.body.classList.remove("deactivated","deactivated-backwards")},333)},e.show()}),Tn.a.get("chatPositions").then(e=>{Tn.a.setToCache("chatPositions",e||{})}),this.topbarCall=new $o(wo.a,o.a,K.a),vo.a.activateInstance();const e=()=>{yo.default.setAuthorized(!0)};setInterval(e,oe.a),e(),this.addAnchorListener({name:"showMaskedAlert",callback:(e,t)=>{const s=t.href,i=t.cloneNode(!0);i.className="anchor-url",i.innerText=s,i.removeAttribute("onclick"),new gt("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[i],buttons:[{langKey:"Open",callback:()=>{i.click()}}]}).show()}}),this.addAnchorListener({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:s}=e;i.a.sendText(this.chat.peerId,"/"+t+(s?"@"+s:""))}}),this.addAnchorListener({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),this.addAnchorListener({name:"addstickers",callback:({pathnameParams:e})=>{const t={_:bo.STICKER_SET,set:e[1]};this.processInternalLink(t)}}),this.addAnchorListener({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:bo.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),no&&this.addAnchorListener({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(bo.VOICE_CHAT,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"im",callback:({pathnameParams:e,uriParams:t})=>Yo(this,void 0,void 0,(function*(){let s;s="c"===e[0]?{_:bo.PRIVATE_POST,channel:e[1],post:e[2],thread:"thread"in t?t.thread:void 0,comment:t.comment}:{_:bo.MESSAGE,domain:e[0],post:e[1],comment:t.comment},this.processInternalLink(s)}))}),this.addAnchorListener({name:"resolve",protocol:"tg",callback:({uriParams:e})=>{let t;"telegrampassport"===e.domain||(t=this.makeLink(bo.MESSAGE,e)),this.processInternalLink(t)}}),this.addAnchorListener({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(bo.PRIVATE_POST,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"addstickers",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(bo.STICKER_SET,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"joinchat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(bo.JOIN_CHAT,e);this.processInternalLink(t)}}),this.onHashChange(),this.attachKeydownListener()}get myId(){return a.default.myId}get chat(){return this.chats[this.chats.length-1]}attachKeydownListener(){const e=new Set(["PageUp","PageDown","Meta","Control"]);document.body.addEventListener("keydown",t=>{var s;const n=t.key;if(a.default.isOverlayActive||e.has(n))return;const o=t.target,r=this.chat;if("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===o.tagName){if(!t.altKey||"ArrowUp"!==n&&"ArrowDown"!==n){if("ArrowUp"===n){if(r.input.editMsgId||!r.input.isInputEmpty())return;{const e=i.a.getHistoryStorage(r.peerId,r.threadId).history.slice;if(e.isEnd(Ln.a.Bottom)&&e.length){let s;for(const t of e){const e=r.getMessage(t);if((this.myId===r.peerId?e.fromId===this.myId:e.pFlags.out)&&i.a.canEditMessage(r.getMessage(t),"text")){s=t;break}}s&&(r.input.initMessageEditing(s),Object(c.a)(t))}}}else if("ArrowDown"===n)return}else{const e=i.a.dialogsStorage.getFolderDialogs(a.default.filterId,!0);let t;if(a.default.peerId){const s=e.findIndex(e=>e.peerId===a.default.peerId);if(-1!==s){t=e["ArrowUp"===n?s-1:s+1]}}else"ArrowDown"===n&&(t=e[0]);t&&this.setPeer(t.peerId)}if((null===(s=null==r?void 0:r.input)||void 0===s?void 0:s.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==o.tagName&&!o.hasAttribute("contenteditable")&&!ue.IS_TOUCH_SUPPORTED&&(!b.b.isMobile||1===this.tabId)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),Object(Ea.a)(r.input.messageInput);const e=new KeyboardEvent(t.type,t);r.input.messageInput.dispatchEvent(e)}}})}makeLink(e,t){return Object.assign({_:e},t)}processInternalLink(e){return Yo(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case bo.MESSAGE:{const t=e.post?v.a.generateMessageId(+e.post):void 0,s=e.comment?v.a.generateMessageId(+e.comment):void 0;this.openUsername(e.domain,t,void 0,s);break}case bo.PRIVATE_POST:{const t=e.channel.toChatId(),s=t.toPeerId(!0);if(K.a.getChat(t).deleted)try{yield K.a.resolveChannel(t)}catch(e){throw ct({langPackKey:"LinkNotFound"}),e}const i=v.a.generateMessageId(+e.post),n=e.thread?v.a.generateMessageId(+e.thread):void 0;n?this.openThread(s,i,n):this.setInnerPeer(s,i);break}case bo.STICKER_SET:new Ni({id:e.set}).show();break;case bo.JOIN_CHAT:ht.a.invokeApi("messages.checkChatInvite",{hash:e.invite}).then(t=>{t.chat&&K.a.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new fo(e.invite,t).show():this.setInnerPeer(t.chat.id.toPeerId(!0))},e=>{"INVITE_HASH_EXPIRED"===e.type&<(Object(x.i18n)("InviteExpired"))});break;case bo.VOICE_CHAT:no&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;default:this.log.warn("Not supported internal link:",e)}}))}addAnchorListener(e){window[(e.protocol?e.protocol+"_":"")+e.name]=t=>{Object(c.a)(null);const s=t.href;let i,n;e.noPathnameParams||(i=new URL(t.href).pathname.split("/").slice(1)),e.noUriParams||(n=this.parseUriParams(s));const a=e.callback({pathnameParams:i,uriParams:n},t);return void 0===a&&a}}parseUriParams(e,t=e.split("?")){const s={};return t[1]?(t[1].split("&").forEach(e=>{s[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])}),s):s}openUsername(e,t,s,i){return P.a.resolveUsername(e).then(e=>{const n="user"===e._?e.id.toPeerId():e.id.toPeerId(!0);return s?this.openThread(n,t,s):i?this.openComment(n,t,i):this.setInnerPeer(n,t)},e=>{"USERNAME_NOT_OCCUPIED"===e.type?ct({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&ct({langPackKey:"Alert.UserDoesntExists"})})}openThread(e,t,s){return i.a.wrapSingleMessage(e,s).then(()=>{const n=i.a.getMessageByPeer(e,s);return i.a.generateThreadServiceStartMessage(n),this.setInnerPeer(e,t,"discussion",s)})}openComment(e,t,s){return i.a.getDiscussionMessage(e,t).then(e=>this.openThread(e.peerId,s,e.mid))}joinGroupCall(e,t){return Yo(this,void 0,void 0,(function*(){const s=e.toChatId(),i=K.a.hasRights(s,"manage_call");if(t){if("groupCallDiscarded"===(yield wo.a.getGroupCallFull(t))._){if(!i)return void ct({langPackKey:"VoiceChat.Chat.Ended"});yield Oo({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}}const a=wo.a.groupCall;a&&(yield Oo({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[new Lt.a({peerId:a.chatId.toPeerId(!0)}).element,new Lt.a({peerId:e}).element],button:{langKey:"OK"}}),wo.a.groupCall===a&&(yield a.hangUp())),(()=>{Yo(this,void 0,void 0,(function*(){const e=yield n.default.getChatFull(s);let t;if(e.call)t=wo.a.saveGroupCall(e.call,s);else{if(!i)return;t=yield wo.a.createGroupCall(s)}wo.a.joinGroupCall(s,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){const t=a.default.getTheme();if("image"===t.background.type||"default"===t.background.type&&t.background.slug){const s=M.AppStateManager.STATE_INIT.settings.themes.find(e=>e.name===t.name);if(!(t.background.blur===s.background.blur&&t.background.slug===s.background.slug))return this.getBackground(t.background.slug).then(t=>this.setBackground(t,e),()=>(t.background=Object(w.a)(s.background),this.setBackground("",!0)))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=he.a.cacheStorage.getFile("backgrounds/"+e).then(e=>URL.createObjectURL(e))}setBackground(e,t=!0){const s=this.chats.map(t=>t.setBackground(e));return s[s.length-1].then(()=>{t&&a.default.dispatchEvent("background_change")})}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,s=t.scrollable.scrollTop,i=e.peerId+(e.threadId?"_"+e.threadId:""),n=Tn.a.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!Object.keys(t.bubbles).length)delete n[i],this.log("deleted chat position");else{const e={mids:Object(w.e)(t.bubbles,"desc"),top:s};n[i]=e,this.log("saved chat position:",e)}Tn.a.set({chatPositions:n},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),s=Tn.a.getFromCache("chatPositions");return s&&s[t]}applyHighlightningColor(){let e;const t=a.default.getTheme();t.background.highlightningColor?(e=t.background.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",e)):document.documentElement.style.removeProperty("--message-highlightning-color"),!ue.IS_TOUCH_SUPPORTED&&e&&(a.default.themeColor=function(e){return _i(e).slice(0,-2)}(e))}applyCurrentTheme(e,t,s){return this.applyHighlightningColor(),a.default.setTheme(),t&&(this.backgroundPromises[e]=Promise.resolve(t)),this.setCurrentBackground(void 0===s?!!e:s)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&go([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),a.default.settings.animationsEnabled&&!1!==t&&Object(ks.b)(Object(In.a)(400),400);const s=Object(Os.a)(this.prevTab);Object(Os.a)(e)>s&&j.a.pushItem({type:"chat",onPop:e=>{this.setPeer(Be.b,void 0,e),Object(Ks.a)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),ue.IS_TOUCH_SUPPORTED||this.attachDragAndDropListeners(),this.markupTooltip=new ho(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let s=!1;const i=(r,l)=>Yo(this,void 0,void 0,(function*(){if(l===s)return;const c=r.dataTransfer.types,d=c.contains?c.contains("Files"):c.indexOf("Files")>=0,h=Ma();if(!d||!this.canDrag()&&!h)return void(n=0);const p=h?o:a,u=h?t:e;if(l&&!u.length){const e=yield Object(me.d)(r,!0),t=d&&!e.length,s=e.filter(e=>m.has(e)).length;this.log("drag files",e),h?(h.appendDrops(p),(e.length||t)&&u.push(new mo(p,{header:"Preview.Dragging.AddItems",headerArgs:[e.length],onDrop:e=>{i(e,!1),Zo.log("drop",e),Zo.onDocumentPaste(e,"document")}}))):((e.length||t)&&u.push(new mo(p,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{i(e,!1),Zo.log("drop",e),Zo.onDocumentPaste(e,"document")}})),(s||t)&&u.push(new mo(p,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{i(e,!1),Zo.log("drop",e),Zo.onDocumentPaste(e,"media")}})),this.chat.container.append(p))}Object(Jt.a)(p,"is-visible",l,200,()=>{l||(u.forEach(e=>{e.destroy()}),u.length=0)}),l?u.forEach(e=>{e.setPath()}):n=0,document.body.classList.toggle("is-dragging",l),s=l}));let n=0;document.body.addEventListener("dragenter",e=>{n++}),document.body.addEventListener("dragover",e=>{i(e,!0),Object(c.a)(e)}),document.body.addEventListener("dragleave",e=>{n--,0===n&&i(e,!1)});const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){var e;const t=null===(e=this.chat)||void 0===e?void 0:e.peerId;return!(!t||a.default.isOverlayActive||!i.a.canSendToPeer(t,this.chat.threadId,"send_media"))}selectTab(e,t){!1===t&&go([mn.sidebarEl,this.columnEl,Yt.sidebarEl]),document.body.classList.toggle("is-left-column-shown",0===e);const s=this.tabId;this.log("selectTab",e,s);let i=a.default.settings.animationsEnabled?Object(De.a)():Promise.resolve();if(-1!==s&&s!==e&&a.default.settings.animationsEnabled&&!1!==t){const e=100+(b.b.isMobile?250:200);i=Object(In.a)(e),Object(ks.b)(i,e)}return this.tabId=e,Object(Ks.a)(),b.b.isMobile&&2===s&&e<2&&document.body.classList.remove("is-right-column-shown"),-1!==s&&e>s&&(e<2||!j.a.findItemByType("im"))&&j.a.pushItem({type:"im",onPop:e=>{this.setPeer(Be.b,void 0,e)}}),a.default.dispatchEvent("im_tab_change",e),i}updateStatus(){return this.myId?(P.a.setUserStatus(this.myId,this.offline),ht.a.invokeApiSingle("account.updateStatus",{offline:this.offline})):Promise.resolve()}createNewChat(){const e=new lo(this,K.a,E.a,Qn,i.a,o.a,r.a,n.default,us,P.a,co.a,Je.a,ht.a,Pi.a,Ze.a,Tn.a,Dt.a,An,v.a,wo.a);this.chats.length&&e.backgroundEl.append(this.chat.backgroundEl.lastElementChild.cloneNode(!0)),this.chats.push(e)}spliceChats(e,t=!0,s,i){if(!(e>=this.chats.length)){this.chats.length>1&&t&&a.default.dispatchEvent("peer_changing",this.chat),i||(i=this.chats.splice(e,this.chats.length-e));for(let e=0;e1&&i.slice(0,-1).forEach(e=>{e.container.remove()}),this.chatsSelectTab(this.chat.container,s),t){a.default.dispatchEvent("peer_changed",this.chat.peerId);const e=Yt.getTab(oo);e&&e.close();Yt.sharedMediaTab.setPeer(this.chat.peerId,this.chat.threadId)&&(Yt.sharedMediaTab.loadSidebarMedia(!0),Yt.sharedMediaTab.fillProfileElements())}i.forEach(e=>{e.beforeDestroy()}),setTimeout(()=>{i.forEach(e=>{e.destroy()})},350)}}setPeer(e,t,s){this.init&&(this.init(),this.init=null);const i=this.chat,n=this.chats.indexOf(i);if(e){if(n>0&&i.peerId&&i.peerId!==e){const s=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===e)return void this.spliceChats(0,!0,!0,s);{const i=this.setPeer(e,t);return this.spliceChats(0,!1,!1,s),i}}}else{if(n>0)return void this.spliceChats(n,void 0,s);if(b.b.activeScreen===b.a.medium)return void this.selectTab(+!this.tabId,s)}if(e===i.peerId&&b.b.activeScreen<=b.a.medium&&document.body.classList.contains("is-left-column-shown"))return this.selectTab(1,s),!1;if(e||b.b.activeScreen!==b.a.mobile){const n=i.setPeer(e,t),a=(null==n?void 0:n.cached)?n.promise:Promise.resolve();e&&a.then(()=>{setTimeout(()=>{setTimeout(()=>{this.chatsSelectTab(this.chat.container)},0),this.selectTab(1,s)},0)})}return e?void 0:(this.selectTab(0,s),!1)}setInnerPeer(e,t,s="chat",i){if(e===Be.b||!e)return;const n=this.chats.findIndex(t=>t.peerId===e&&t.type===s);if(-1!==n)return this.spliceChats(n+1),this.setPeer(e,t);return this.chat.inited&&this.createNewChat(),s&&(this.chat.setType(s),i&&(this.chat.threadId=i)),this.setPeer(e,t)}openScheduled(e){this.setInnerPeer(e,void 0,"scheduled")}getTypingElement(e){const t=document.createElement("span");let s="peer-typing";switch(t.classList.add(s),t.dataset.action=e._,e._){case"sendMessageTypingAction":s+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=s+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":s+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":s+="-record";break;case"sendMessageChooseStickerAction":s+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=s+"-eye",t.append(e)}}return t.classList.add(s),t}getPeerTyping(e,t){if(!P.a.isBot(e)){const s=n.default.getPeerTypings(e);if(!s||!s.length)return;const i=s[0],a={private:{sendMessageTypingAction:"Peer.Activity.User.TypingText",sendMessageUploadAudioAction:"Peer.Activity.User.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.User.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.User.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.User.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.User.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.User.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.User.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.User.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.User.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.User.ChoosingSticker"},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"},multi:{sendMessageTypingAction:"Peer.Activity.Chat.Multi.TypingText1",sendMessageUploadAudioAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadDocumentAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadPhotoAction:"Peer.Activity.Chat.Multi.SendingPhoto1",sendMessageUploadVideoAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageUploadRoundAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageRecordVideoAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageRecordAudioAction:"Peer.Activity.Chat.Multi.RecordingAudio1",sendMessageRecordRoundAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageGamePlayAction:"Peer.Activity.Chat.Multi.PlayingGame1",sendMessageChooseStickerAction:"Peer.Activity.Chat.Multi.ChoosingSticker1"}},o=e.isUser()?a.private:s.length>1?a.multi:a.chat;let r=i.action;if(s.length>1){const e={};s.forEach(t=>{const s=t.action._;void 0===e[s]&&(e[s]=0),++e[s]}),Object.keys(e).length>1&&(r={_:"sendMessageTypingAction"})}const l=o[r._];if(!l)return;t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),"sendMessageChooseStickerAction"===r._&&t.classList.add("peer-typing-flex");let c,d=t.firstElementChild;d?d.dataset.action!==r._&&d.replaceWith(this.getTypingElement(r)):(d=this.getTypingElement(r),t.prepend(d)),e.isAnyChat()&&(c=[new Lt.a({peerId:i.userId.toPeerId(!1),onlyFirstName:!0}).element,s.length-1]);const h=Object(x.i18n)(l,c);return h.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(h):t.append(h),t}}getPeerStatus(e){var t;return Yo(this,void 0,void 0,(function*(){let s;if(e){if(e.isAnyChat()){let t=this.getPeerTyping(e);if(t)return t;const i=e.toChatId(),a=yield n.default.getChatFull(i);this.chat.log("chatInfo res:",a);const o=a.participants_count||a.participants&&a.participants.participants&&a.participants.participants.length||1;if(s=n.default.getChatMembersString(i),o<2)return s;const r=yield n.default.getOnlines(i);if(r>1){const e=document.createElement("span");e.append(...Object(x.join)([s,Object(x.i18n)("OnlineCount",[Object(I.d)(r)])],!1)),s=e}return s}{const i=P.a.getUser(e);if(a.default.myId===e)return;if(i){if(s=P.a.getUserStatusString(i.id),!P.a.isBot(e)){let n=this.getPeerTyping(e);if(n||"userStatusOnline"!==(null===(t=i.status)||void 0===t?void 0:t._)||(n=document.createElement("span"),n.classList.add("online"),n.append(s)),n)return n}return s}}}}))}setPeerStatus(e,t,s,i,n){s&&(t.innerHTML=i?"‎":"");const a=t.querySelector(".peer-typing-container");a&&this.getPeerTyping(e,a)||this.getPeerStatus(e).then(e=>{n()&&Object(k.a)(t,e||(i?"‎":""))})}setChoosingStickerTyping(e){i.a.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"})}};de.a&&(de.a.appImManager=Zo);var er=Zo;var tr=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class sr extends B.a{constructor(e,t){super(!1),this.listLoader=e,this.author={},this.content={},this.buttons={},this.tempId=0,this.preloader=null,this.preloaderStreamable=null,this.isFirstOpen=!0,this.pageEl=document.getElementById("page-chats"),this.zoomElements={},this.zoomSwipeStartX=0,this.zoomSwipeStartY=0,this.zoomSwipeX=0,this.zoomSwipeY=0,this.setZoomValue=(e=this.zoomElements.rangeSelector.value)=>{1===e&&(this.zoomSwipeX=0,this.zoomSwipeY=0),this.moversContainer.style.transform=`matrix(${e}, 0, 0, ${e}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`,this.zoomElements.btnOut.classList.toggle("inactive",.5===e),this.zoomElements.btnIn.classList.toggle("inactive",4===e),this.toggleZoom(1!==e)},this.onClick=e=>{if(this.setMoverAnimationPromise)return;const t=e.target;if("A"===t.tagName)return;if(Object(c.a)(e),ue.IS_TOUCH_SUPPORTED)return this.highlightSwitchersTimeout?clearTimeout(this.highlightSwitchersTimeout):this.wholeDiv.classList.add("highlight-switchers"),void(this.highlightSwitchersTimeout=window.setTimeout(()=>{this.wholeDiv.classList.remove("highlight-switchers"),this.highlightSwitchersTimeout=0},3e3));const s=this.isZooming();let i=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];s&&n.push("media-viewer-movers"),n.find(e=>{try{if(i=Object(Me.a)(t,e),i)return!0}catch(e){return!1}}),i&&(s||"IMG"!==t.tagName&&"image"!==t.tagName)||this.buttons.close.click()},this.onKeyDown=e=>{if(a.default.overlaysActive>1)return;const t=e.key;let s=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):s=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),s&&Object(c.a)(e)},this.onKeyUp=e=>{a.default.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(a.default.overlaysActive>1||Object(Me.a)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&(Object(c.a)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.log=Object(X.b)("AMV"),this.preloader=new ye.a,this.preloaderStreamable=new ye.a({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new ee.a,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add("media-viewer-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const s=document.createElement("div");s.classList.add("media-viewer");const i=this.topbar=document.createElement("div");i.classList.add("media-viewer-topbar","media-viewer-appear");const n=document.createElement("div");n.classList.add("media-viewer-topbar-left"),this.buttons["mobile-close"]=H("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add("media-viewer-author","no-select");const o=document.createElement("div");this.author.avatarEl=new ur,this.author.avatarEl.classList.add("media-viewer-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add("media-viewer-name"),this.author.date=document.createElement("div"),this.author.date.classList.add("media-viewer-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const r=document.createElement("div");r.classList.add("media-viewer-buttons"),t.concat(["download","zoom","close"]).forEach(e=>{const t=H(e,{noRipple:!0});this.buttons[e]=t,r.append(t)}),this.buttons.zoom.classList.add("zoom-in"),this.zoomElements.container=document.createElement("div"),this.zoomElements.container.classList.add("zoom-container"),this.zoomElements.btnOut=H("zoomout",{noRipple:!0}),this.zoomElements.btnOut.addEventListener("click",()=>this.changeZoom(!1)),this.zoomElements.btnIn=H("zoomin",{noRipple:!0}),this.zoomElements.btnIn.addEventListener("click",()=>this.changeZoom(!0)),this.zoomElements.rangeSelector=new Se({step:.5,min:.5,max:4,withTransition:!0},1),this.zoomElements.rangeSelector.setListeners(),this.zoomElements.rangeSelector.setHandlers({onScrub:this.setZoomValue,onMouseUp:()=>this.setZoomValue()}),this.zoomElements.container.append(this.zoomElements.btnOut,this.zoomElements.rangeSelector.container,this.zoomElements.btnIn),this.wholeDiv.append(this.zoomElements.container),this.content.main=document.createElement("div"),this.content.main.classList.add("media-viewer-content"),this.content.container=document.createElement("div"),this.content.container.classList.add("media-viewer-container"),this.content.media=document.createElement("div"),this.content.media.classList.add("media-viewer-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),s.append(this.content.main),this.overlaysDiv.append(s),n.append(this.buttons["mobile-close"],this.author.container),i.append(n,r),this.buttons.prev=document.createElement("div"),this.buttons.prev.className="media-viewer-switcher media-viewer-switcher-left",this.buttons.prev.innerHTML='',this.buttons.next=document.createElement("div"),this.buttons.next.className="media-viewer-switcher media-viewer-switcher-right",this.buttons.next.innerHTML='',this.moversContainer=document.createElement("div"),this.moversContainer.classList.add("media-viewer-movers"),this.wholeDiv.append(this.overlaysDiv,this.buttons.prev,this.buttons.next,this.topbar,this.moversContainer),this.setNewMover()}get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}setListeners(){if(this.buttons.download.addEventListener("click",this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach(e=>{e.addEventListener("click",this.close.bind(this))}),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach(([e,t])=>{t.addEventListener("click",t=>{Object(c.a)(t),this.setMoverPromise||this.listLoader.go(e)})}),this.buttons.zoom.addEventListener("click",()=>{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)},ue.IS_TOUCH_SUPPORTED){new Vt({element:this.wholeDiv,onSwipe:(e,t)=>{if(Object(Te.d)())return;if(Math.abs(e)/Et.a.width>.2||e>125)return e<0?this.buttons.prev.click():this.buttons.next.click(),!0;return(Math.abs(t)/Et.a.height>.2||t>125)&&(this.buttons.close.click(),!0)},verifyTouchTarget:e=>"INPUT"!==e.target.tagName&&!Object(Me.a)(e.target,"media-viewer-caption")})}}toggleZoom(e){const t=this.isZooming();if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),t===e)return;void 0===e&&(e=!t),this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",e);const s=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(s),this.zoomElements.rangeSelector.setProgress(s),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const s=-1;this.zoomSwipeHandler=new Vt({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(i,n)=>{[i,n]=[i*s,n*s],this.zoomSwipeX+=i-e,this.zoomSwipeY+=n-t,[e,t]=[i,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(s)}else e||this.zoomSwipeHandler.removeListeners()}changeZoom(e){this.zoomElements.rangeSelector.addProgress(.5*(e?1:-1)),this.setZoomValue()}isZooming(){return this.zoomElements.container.classList.contains("is-visible")}setBtnMenuToggle(e){const t=Ie({onlyMobile:!0},"bottom-left",e);this.topbar.append(t)}close(e){var t;if(e&&Object(c.a)(e),this.setMoverAnimationPromise)return Promise.reject();j.a.removeByType("media"),this.lazyLoadQueue.clear();const s=this.setMoverToTarget(null===(t=this.target)||void 0===t?void 0:t.element,!0).then(({onAnimationEnd:e})=>e);return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer=void 0,this.zoomSwipeHandler&&(this.zoomSwipeHandler.removeListeners(),this.zoomSwipeHandler=void 0),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),window.removeEventListener("wheel",this.onWheel,{capture:!0}),s.finally(()=>{this.wholeDiv.remove(),a.default.isOverlayActive=!1,C.a.checkAnimations(!1)}),s}setMoverToTarget(e,t=!1,s=0){return tr(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const i=this.content.mover;t||(i.innerHTML="");const n=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(i);const o=0!==s,r=a.default.settings.animationsEnabled?o?350:200:0;let l,c;e&&(e instanceof ur||e.classList.contains("grid-item")?(l=e,c=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(l=Object(Me.a)(e,"attachment"),c=l.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(l=Object(Me.a)(e,"profile-avatars-container"),c=l.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==c.left&&(e=l=c=void 0))),e||(e=this.content.media),c||(l=e.parentElement,c=e.getBoundingClientRect());let d=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const s=function(e,t){const s=e.getBoundingClientRect(),i=t.getBoundingClientRect();let{top:n,bottom:a}=i;const o=t.querySelector(".sticky");if(o){n=o.getBoundingClientRect().bottom}if(s.top>=a||s.bottom<=n||s.right<=i.left||s.left>=i.right)return null;const r={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},l="visualViewport"in window?window.visualViewport:window,c=(l.width||l.innerWidth,l.height||l.innerHeight);return{rect:{top:s.topa&&a!==c?(r.bottom=!0,++r.vertical,a):s.bottom,left:0},overflow:r}}(l,Object(Me.a)(l,"scrollable"));!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(d=!0):(l=(e=this.content.media).parentElement,c=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let p,u,m,g="";if(o?(p=1===s?Et.a.width:-h.width,u=h.top):(p=c.left,u=c.top),g+=`translate3d(${p}px,${u}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(i.firstElementChild&&i.firstElementChild.classList.contains("media-viewer-aspecter")){m=i.firstElementChild;const e=m.querySelector(".ckin__player");if(e){const t=e.firstElementChild;m.append(t),e.remove()}m.style.cssText||(i.classList.remove("active"),this.setFullAspect(m,h,c),i.offsetLeft,i.classList.add("active"))}else m=document.createElement("div"),m.classList.add("media-viewer-aspecter"),i.prepend(m);m.style.cssText=`width: ${c.width}px; height: ${c.height}px; transform: scale3d(${h.width/c.width}, ${h.height/c.height}, 1);`}i.style.width=h.width+"px",i.style.height=h.height+"px";const b=c.width/h.width,v=c.height/h.height;o||(g+=`scale3d(${b},${v},1) `);let f=window.getComputedStyle(l).getPropertyValue("border-radius");const y=function(e){let t=e.split(" ");if(4!==t.length){t[0]||(t[0]="0px");for(let e=t.length;e<4;++e)t[e]=t[e%2]||t[0]||"0px"}return t}(f);if(f=y.map(e=>parseInt(e)/b+"px").join(" "),o||(i.style.borderRadius=f),t&&1!==n){const e=Et.a.width/2-c.width/2,t=Et.a.height/2-c.height/2,s=c.left-e,i=c.top-t;this.moversContainer.style.transform=`matrix(${b}, 0, 0, ${v}, ${s}, ${i})`}else i.style.transform=g;let w;d&&(i.style.opacity="0");const S=e.classList.contains("is-out"),L=this.setMoverAnimationPromise=Object(ae.a)(),E={onAnimationEnd:L},C=setTimeout(()=>{L.isFulfilled||L.isRejected||L.resolve()},1e3);if(L.finally(()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===L&&(this.setMoverAnimationPromise=null),clearTimeout(C)}),t)return e instanceof SVGSVGElement&&(w=i.querySelector("path"),w&&this.sizeTailPath(w,h,b,r,!1,S,f)),e.classList.contains("media-viewer-media")&&i.classList.add("hiding"),this.wholeDiv.classList.add("backwards"),setTimeout(()=>{this.wholeDiv.classList.remove("active")},0),setTimeout(()=>{i.style.borderRadius=f,i.firstElementChild&&(i.firstElementChild.style.borderRadius=f)},r/2),setTimeout(()=>{i.innerHTML="",i.classList.remove("moving","active","hiding"),i.style.cssText="display: none;",L.resolve()},r),i.classList.remove("opening"),E;{let t,s;if(e instanceof HTMLVideoElement){const t=Array.from(e.parentElement.querySelectorAll("img"));t.length&&(e=t.pop())}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const n=Array.from(e.querySelectorAll("img")).pop();n&&(t=new Image,s=n.src,i.append(t))}else if(e instanceof HTMLImageElement)t=new Image,s=e.src;else if(e instanceof HTMLVideoElement)t=document.createElement("video"),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,s=t+"-mv",{width:n,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+n),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${n} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,s)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,s));const r=o.firstElementChild,l=r.firstElementChild.firstElementChild;if(l instanceof SVGUseElement){let e,t=l.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,(e,t,s,i,o)=>`translate(${t=2!==(t=+t)?n-2/b:2/b}, ${a}) scale(${+i/b}, ${+o/v})`),l.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const s=f.split(" ").map(e=>parseInt(e));e=S?uo(0,0,n-9/b,a,...s):uo(9/b,0,n-9/b,a,...s),w.setAttributeNS(null,"d",e)}const c=o.lastElementChild;c.setAttributeNS(null,"width",""+h.width),c.setAttributeNS(null,"height",""+h.height),i.prepend(o)}m&&(m.style.borderRadius=f,t&&m.append(t)),t=i.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),m||(t.style.width=h.width+"px",t.style.height=h.height+"px"),s&&(yield Object(rs.b)(t,s))),i.style.display="",Object(De.b)(()=>{i.classList.add(o?"moving":"active")})}return i.classList.add("opening"),yield Object(De.a)(),i.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,d&&(i.style.opacity=""),m&&this.setFullAspect(m,h,c),setTimeout(()=>{i.style.borderRadius="",i.firstElementChild&&(i.firstElementChild.style.borderRadius="")},0),i.dataset.timeout=""+setTimeout(()=>{i.classList.remove("moving","opening"),m&&(i.querySelector("video"),i.classList.remove("active"),m.style.cssText="",i.offsetLeft),i.classList.add("center","no-transition"),i.classList.add("active"),delete i.dataset.timeout,L.resolve()},r),w&&this.sizeTailPath(w,h,b,r,!0,S,f),E}))}setFullAspect(e,t,s){const i=t.width/t.height;let{width:n,height:a}=s;i>0?n=a*i:a=n*i,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,s,i,n,a,o){const r=Date.now(),{width:l,height:c}=t;i/=2;const d=o.split(" ").map(e=>parseInt(e)),h=()=>{const t=Date.now()-r;let o=i?t/i:1;o>1&&(o=1),n&&(o=1-o);const p=d.map(e=>e*o);let u;u=a?uo(0,0,l-9/s*o,c,...p):uo(9/s*o,0,l,c,...p),e.setAttributeNS(null,"d",u),t{const a=t?-i.width:s;return e.replace(n,a+"px")});e.style.transform=n,setTimeout(()=>{e.remove()},350)}setNewMover(){const e=document.createElement("div");if(e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover){this.content.mover.parentElement.append(e)}else this.moversContainer.append(e);return this.content.mover=e}updateMediaSource(e,t,s){const i=e.tagName.toLowerCase()===s?e:e.querySelector(s);if(i&&!Object(Me.a)(e,"document")){if(Object(Me.a)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===s)return void(t.classList.contains("manual")&&t.click());t.remove()}}Object(rs.a)(i,t),i.classList.contains("thumbnail")&&i.parentElement.classList.contains("media-container-aspecter")&&i.classList.remove("thumbnail")}}setAuthorInfo(e,t){Object(k.a)(this.author.date,Object(oe.d)(t));const s=e.isPeerId();let i;s?i=new Lt.a({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1}).element:(i=document.createElement("span"),i.innerHTML=J.b.wrapEmojiText(e),i.classList.add("peer-title")),Object(k.a)(this.author.nameEl,i);let n=this.author.avatarEl;this.author.avatarEl=n.cloneNode(),s?this.author.avatarEl.removeAttribute("peer-title"):this.author.avatarEl.setAttribute("peer-title",""+e),this.author.avatarEl.setAttribute("peer",""+(e||Be.b)),n.parentElement.replaceChild(this.author.avatarEl,n)}_openMedia(e,t,s,i,n,o=!1,l=[],c=[],d){return tr(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;this.setAuthorInfo(s,t);const h="document"===e._,p=h&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(l,c,o),window.appMediaViewer=this),this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length);const u=this.content.media,m=!n||n===u;m&&(n=u),this.target={element:n};const g=++this.tempId;u.firstElementChild&&(u.innerHTML="");if(0!==i)this.moveTheMover(this.content.mover,1===i),this.setNewMover();else{window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),ue.IS_TOUCH_SUPPORTED||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0});const e=document.getElementById("main-columns");this.pageEl.insertBefore(this.wholeDiv,e),this.wholeDiv.offsetLeft,this.wholeDiv.classList.add("active"),a.default.isOverlayActive=!0,C.a.checkAnimations(!0),re.IS_MOBILE_SAFARI||j.a.pushItem({type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}})}const v=this.content.mover,f=Et.a.width;let y=0;const w=Et.a.height;w<1e6&&!b.b.isMobile&&(y=120);const S=w-120-y;let L=Promise.resolve();const I=r.a.setAttachmentSize(e,u,f,S,!b.b.isMobile,void 0,!!(h&&e.w&&e.h)).photoSize;if(m){const t=he.a.getCacheContext(e,I.type);let s;if(t.downloaded)s=new Image,s.src=t.url;else{const i=r.a.getStrippedThumbIfNeeded(e,t,!0);i&&(L=i.loadPromise,s=i.image)}s&&(s.classList.add("thumbnail"),u.append(s))}const M=!(!h||!e.supportsStreaming),P=M?this.preloaderStreamable:this.preloader;let T;if(p){const t=d&&"gif"!==e.type,s=document.createElement("video"),a=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:i})=>{const a=v.firstElementChild&&v.firstElementChild.classList.contains("media-viewer-aspecter")?v.firstElementChild:v,o=v.querySelector("video");o&&o.remove(),s.setAttribute("playsinline","true"),s.addEventListener("timeupdate",()=>{this.tempId!==g&&s.pause()}),s.addEventListener("error",()=>{4!==s.error.code&&this.log.error("Error "+s.error.code+"; details: "+s.error.message),P&&P.detach()},{once:!0}),this.addEventListener("setMoverAfter",()=>{s.src="",s.load()},{once:!0}),re.IS_SAFARI&&(s.autoplay=!0),"gif"===e.type&&(s.muted=!0,s.autoplay=!0,s.loop=!0),a.append(s);const r=new Promise(e=>{s.addEventListener("canplay",e,{once:!0})}),l=()=>{"gif"!==e.type&&(s.dataset.ckin="default",s.dataset.overlay="1",Promise.all([r,i]).then(()=>{if(this.tempId!==g)return;(this.videoPlayer=new Oe(s,!0,M)).addEventListener("toggleControls",e=>{this.wholeDiv.classList.toggle("has-video-controls",e)}),this.addEventListener("setMoverBefore",()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.removeListeners(),this.videoPlayer=void 0},{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1)}))};if(M){i.then(()=>{s.readyState{s.addEventListener("canplay",()=>{P.detach(),s.parentElement.classList.remove("is-buffering")},{once:!0})};s.addEventListener("waiting",()=>{const t=s.networkState===s.NETWORK_LOADING,i=s.readyState{const o=he.a.getCacheContext(e),r=M?Promise.resolve():E.a.downloadDoc(e);return M||i.then(()=>{o.url||P.attach(v,!0,r)}),Promise.all([r,i]).then(()=>{if(this.tempId!==g)return void this.log.warn("media viewer changed video");if(t){const e=fe.setSingleMedia(s,d);this.addEventListener("setMoverBefore",()=>{e()},{once:!0})}const e=o.url;n instanceof SVGSVGElement?a.firstElementChild.lastElementChild.append(s):Object(rs.a)(s,e),this.updateMediaSource(n,e,"video"),l()}),r}})});T=L.then(a)}else{const t=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>{const s=he.a.getCacheContext(e,I.type),i=h?E.a.downloadDoc(e):r.a.preloadPhoto(e,I);return t.then(()=>{s.url||this.preloader.attachPromise(i)}),Promise.all([t,i]).then(()=>{var e;if(this.tempId!==g)return void this.log.warn("media viewer changed photo");const t=s.url;if(n instanceof SVGSVGElement){if(this.updateMediaSource(n,t,"img"),this.updateMediaSource(v,t,"img"),b.b.isMobile){const e=v.querySelectorAll("img");e&&e.length&&e.forEach(e=>{e.classList.remove("thumbnail")})}}else{const s=v.firstElementChild&&v.firstElementChild.classList.contains("media-viewer-aspecter")?v.firstElementChild:v,i="IMG"===(null===(e=s.firstElementChild)||void 0===e?void 0:e.tagName)?s.firstElementChild:null;if(!i||i.src!==t){let e=new Image;e.classList.add("thumbnail"),Object(rs.a)(e,t,()=>{this.updateMediaSource(n,t,"img"),i&&Object(De.b)(()=>{i.remove()}),s.append(e)})}}}).catch(e=>{this.log.error(e),this.preloader.attach(v),this.preloader.setManual()}),i}})});T=L.then(t)}return this.setMoverPromise=T.catch(()=>{this.setMoverAnimationPromise=null}).finally(()=>{this.setMoverPromise=null})}))}}var ir=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class nr extends sr{constructor(){let e;super(new L({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:s,peerId:n}=e,a=i.a.getMediaFromMessage(e);if(a&&(!t||nr.isMediaCompatibleForDocumentViewer(a)))return{element:null,mid:s,peerId:n}}}),["delete","forward"]),this.onPrevClick=e=>{this.openMedia(this.getMessageByPeer(e.peerId,e.mid),e.element,-1)},this.onNextClick=e=>{this.openMedia(this.getMessageByPeer(e.peerId,e.mid),e.element,1)},this.onDeleteClick=()=>{const e=this.target;new zs(e.peerId,[e.mid],"chat",()=>{this.target={element:this.content.media},this.close()})},this.onForwardClick=()=>{const e=this.target;e.mid&&new Ns({[e.peerId]:[e.mid]},()=>this.close())},this.onAuthorClick=e=>{const{mid:t,peerId:s}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const i=this.searchContext.threadId,n=this.getMessageByPeer(s,t);this.close(e).then(()=>{if(b.b.isMobile){const e=Yt.getTab(Qt);e&&e.close()}er.setInnerPeer(n.peerId,t,i?"discussion":void 0,i)})}},this.onDownloadClick=()=>{const{peerId:e,mid:t}=this.target,s=this.getMessageByPeer(e,t);if(s.media.photo)r.a.savePhotoFile(s.media.photo,er.chat.bubbles.lazyLoadQueue.queueId);else{let e=null;e=s.media.webpage?s.media.webpage.document:s.media.document,e&&E.a.saveDocFile(e,er.chat.bubbles.lazyLoadQueue.queueId)}},this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add("media-viewer-caption");const t=()=>{e&&clearTimeout(e),e=window.setTimeout(()=>{e=void 0,this.content.caption.classList.remove("is-focused")},800)};this.content.caption.addEventListener("touchstart",()=>{b.b.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))});new T.b(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),Object(l.b)(this.buttons.delete,this.onDeleteClick);const s=[{icon:"forward",text:"Forward",onClick:this.onForwardClick},{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick}];this.setBtnMenuToggle(s),this.btnMenuDelete=s[s.length-1].element,this.setListeners()}get searchContext(){return this.listLoader.searchContext}setListeners(){super.setListeners(),this.buttons.forward.addEventListener("click",this.onForwardClick),this.author.container.addEventListener("click",this.onAuthorClick);const e=t=>{if(t.target instanceof HTMLAnchorElement){const s=t.target.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return Object(c.a)(t),this.close().then(()=>{this.content.caption.removeEventListener("click",e,{capture:!0}),t.target.click()}),!1}};this.content.caption.addEventListener("click",e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?i.a.getScheduledMessageByPeer(e,t):i.a.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let s="";t&&(s=J.b.wrapRichText(t,{entities:e.totalEntities})),g(this.content.caption.firstElementChild,s),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,s=0,n=!1,a=[],o=[]){const r=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return ir(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const l=e.mid,c=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,d=i.a.getMediaFromMessage(e);this.buttons.forward.classList.toggle("hide","messageService"===e._);const h=i.a.canDeleteMessage(e);[this.buttons.delete,this.btnMenuDelete].forEach(e=>{e.classList.toggle("hide",!h)}),this.setCaption(e);const p=r._openMedia.call(this,d,e.date,c,s,t,n,a,o,e);return this.target.mid=l,this.target.peerId=e.peerId,p}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||m.has(e.mime_type)}}class ar extends S{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,s)=>{if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const i=null==e?void 0:e.photoId;return r.a.getUserPhotos(this.peerId,i,s).then(e=>{const t=e.photos.map(e=>({element:null,photoId:e}));return{count:e.count,items:t}})}})),this.loadedAllUp=!0,this.peerId=e.peerId}}var or=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class rr extends sr{constructor(e){super(new ar({peerId:e}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>{r.a.savePhotoFile(r.a.getPhoto(this.target.photoId),er.chat.bubbles.lazyLoadQueue.queueId)},this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,s=0,i,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return or(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=r.a.getPhoto(e),l=a._openMedia.call(this,o,o.date,this.peerId,s,t,!1,i,n);return this.target.photoId=o.id,l}))}}var lr=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const cr=e=>{d.a.removeFromAvatarsCache(e),Array.from(document.querySelectorAll('avatar-element[peer="'+e+'"]')).forEach(e=>{e.update()})};function dr(e,t,s,a,o,l){return lr(this,void 0,void 0,(function*(){let c=yield n.default.getFullPhoto(t);if(!s()||!c)return;const d=()=>Array.from(e.querySelectorAll("img")).find(e=>!e.classList.contains("emoji"))?e:null;if(t.isAnyChat()){const e=!!a,n="inputMessagesFilterChatPhotos";if(!a&&(a=yield i.a.getSearch({peerId:t,inputFilter:{_:n},maxId:0,limit:1}).then(e=>e.history[0]),!s()))return;if(a){a.action.photo.id!==c.id&&(e||(a=i.a.generateFakeAvatarMessage(t,c)));const s=e=>e.map(e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId}));return void(new nr).setSearchContext({peerId:t,inputFilter:{_:n}}).openMedia(a,d(),void 0,void 0,o?s(o):void 0,l?s(l):void 0)}}if(c){Object(w.f)(a)||(c=r.a.getPhoto(a));const e=e=>e.map(e=>({element:e.element,photoId:e.item}));new rr(t).openMedia(c.id,d(),void 0,o?e(o):void 0,l?e(l):void 0)}}))}a.default.addEventListener("avatar_update",cr),a.default.addEventListener("peer_title_edit",e=>{d.a.isAvatarCached(e)||cr(e)});const hr=new Map,pr=new Set;class ur extends HTMLElement{constructor(){super(...arguments),this.isDialog=!1,this.addedToQueue=!1}connectedCallback(){if(this.isDialog="1"===this.getAttribute("dialog"),""===this.getAttribute("clickable")){this.setAttribute("clickable","set");let e=!1;Object(l.b)(this,t=>lr(this,void 0,void 0,(function*(){if(Object(c.a)(t),e)return;const s=this.peerId;e=!0,yield dr(this,this.peerId,()=>this.peerId===s),e=!1})))}}disconnectedCallback(){const e=hr.get(this.peerId);e&&e.has(this)&&(e.delete(this),e.size||hr.delete(this.peerId)),this.lazyLoadQueue&&this.lazyLoadQueue.unobserve(this)}static get observedAttributes(){return["peer","dialog","peer-title"]}attributeChangedCallback(e,t,s){if("peer"===e){const e=(s||"").toPeerId()||Be.b;if(this.peerId===e)return;this.peerId=o.a.getPeerMigratedTo(e)||e;const i=(t||"").toPeerId()||Be.b;if(i){const e=hr.get(i);e&&(e.delete(this),e.size||hr.delete(i))}this.update()}else"peer-title"===e?this.peerTitle=s:"dialog"===e&&(this.isDialog="1"===s)}r(e=!1){const t=d.a.putPhoto(this,this.peerId,this.isDialog,this.peerTitle,e),s=t?t.loadPromise:Promise.resolve();return this.loadPromises&&(t&&t.cached&&this.loadPromises.push(s),s.finally(()=>{this.loadPromises=void 0})),t}update(){if(this.lazyLoadQueue){if(!pr.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;let e=hr.get(this.peerId);return e||(e=new Set,hr.set(this.peerId,e)),e.add(this),this.r(!0),void this.lazyLoadQueue.push({div:this,load:()=>(pr.add(this.peerId),this.update())})}this.addedToQueue&&this.lazyLoadQueue.unobserve(this)}pr.add(this.peerId);const e=this.r(),t=e?e.loadPromise:Promise.resolve();this.addedToQueue&&t.finally(()=>{this.addedToQueue=!1});const s=hr.get(this.peerId);if(s){s.delete(this);const e=Array.from(s);hr.delete(this.peerId);for(let t=0,s=e.length;t{let e=i.a.getDialogOnly(this.selectedId);e&&i.a.editPeerFolders([e.peerId],+!e.folder_id)},this.onPinClick=()=>{i.a.toggleDialogPin(this.selectedId,this.filterId).catch(e=>{"PINNED_DIALOGS_TOO_MUCH"===e.type&&(this.filterId>=1?ct({langPackKey:"PinFolderLimitReached"}):new gt("pinned-dialogs-too-much",{buttons:[{langKey:"OK",isCancel:!0},{langKey:"FiltersSetupPinAlert",callback:()=>{new Xi(mn).open()}}],descriptionLangKey:"PinToTopLimitReached2",descriptionLangArgs:[Object(x.i18n)("Chats",[a.default.config.pinned_dialogs_count_max])]}).show())})},this.onUnmuteClick=()=>{i.a.mutePeer(this.selectedId,!1)},this.onMuteClick=()=>{i.a.mutePeer(this.selectedId,!0)},this.onUnreadClick=()=>{const e=i.a.getDialogOnly(this.selectedId);e&&(e.unread_count?(i.a.readHistory(this.selectedId,e.top_message),i.a.markDialogUnread(this.selectedId,!0)):i.a.markDialogUnread(this.selectedId))},this.onDeleteClick=()=>{new At(this.selectedId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=Object(ft.a)(e.target,"LI")}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),this.filterId=kr.filterId,this.selectedId=t.dataset.peerId.toPeerId(),this.dialog=i.a.getDialogOnly(this.selectedId),this.buttons.forEach(e=>{const t=e.verify();e.element.classList.toggle("hide",!t)}),this.buttons[this.buttons.length-1].element.lastChild.replaceWith(Object(x.i18n)(o.a.getDeleteButtonText(this.selectedId))),t.classList.add("menu-open"),Object(te.e)(e,this.element),Object(te.d)(this.element,()=>{t.classList.remove("menu-open"),this.selectedId=this.dialog=this.filterId=void 0})}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>!i.a.isDialogUnread(this.dialog)},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>i.a.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>{var e;return!(this.filterId>1?i.a.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned))}},{icon:"unpin",text:"ChatList.Context.Unpin",onClick:this.onPinClick,verify:()=>{var e;return this.filterId>1?i.a.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>this.selectedId!==a.default.myId&&!Dt.a.isPeerLocalMuted(this.dialog.peerId)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>this.selectedId!==a.default.myId&&Dt.a.isPeerLocalMuted(this.dialog.peerId)},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.selectedId!==a.default.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.selectedId!==a.default.myId},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>!0}],this.element=Ee(this.buttons),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var gr,br;!function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(gr||(gr={}));class vr{constructor(e){this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=()=>{cn.a.get("dc").then(e=>{e||(e=ln.a.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const t=a.default.connectionStatus["NET-"+e],s=t&&t.status===gr.Connected;this.connecting&&s&&si.a.forceGetDifference(),s&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=t&&t.status===gr.TimedOut,this.connecting=!s,this.retryAt=t&&t.retryAt,de.b&&this.log("connecting",this.connecting),this.setState()})},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,Object(k.a)(this.statusEl,Object(x.i18n)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{const e=vr.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",()=>ht.a.forceReconnect());this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,s=()=>{const s=Date.now();e.innerText=""+Math.round((t-s)/1e3),s>t&&clearInterval(i)},i=setInterval(s,1e3);s();const n=this.getA("ConnectionStatus.Reconnect",()=>ht.a.forceReconnectTimeout());this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");de.b&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame(()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout);this.setStateTimeout=window.setTimeout(()=>{Object(Jt.a)(this.statusContainer,"is-shown",this.connecting||this.updating,200),this.setStateTimeout=0,de.b&&this.log("setState: isShown:",this.connecting||this.updating)},e)})},this.log=Object(X.b)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=Object(U.a)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new ye.a({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),e.prepend(this.statusContainer),a.default.addEventListener("connection_status_change",e=>{console.log(e),this.setConnectionStatus()}),a.default.addEventListener("state_synchronizing",e=>{e||(this.updating=!0,de.b&&this.log("updating",this.updating),this.setState())}),a.default.addEventListener("state_synchronized",e=>{de.b&&this.log("state_synchronized",e),e||(this.updating=!1,de.b&&this.log("updating",this.updating),this.setState())}),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,vr.CHANGE_STATE_DELAY+1e3)}getA(e,t){const s=document.createElement("a");return s.classList.add("force-reconnect"),s.append(Object(x.i18n)(e)),s.addEventListener("click",e=>{Object(c.a)(e),t()}),s}}function fr(e,t,s,i,n,a,o,r){if("number"==typeof a)a={tl:a,tr:a,br:a,bl:a};else{const e={tl:0,tr:0,br:0,bl:0};for(const t in e)a[t]=a[t]||e[t]}e.beginPath(),e.moveTo(t+a.tl,s),e.lineTo(t+i-a.tr,s),e.quadraticCurveTo(t+i,s,t+i,s+a.tr),e.lineTo(t+i,s+n-a.br),e.quadraticCurveTo(t+i,s+n,t+i-a.br,s+n),e.lineTo(t+a.bl,s+n),e.quadraticCurveTo(t,s+n,t,s+n-a.bl),e.lineTo(t,s+a.tl),e.quadraticCurveTo(t,s,t+a.tl,s),e.closePath(),o&&e.fill(),r&&e.stroke()}vr.CHANGE_STATE_DELAY=1e3,function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(br||(br={}));const yr=window.devicePixelRatio,wr=20*yr,Sr=2.5*yr,Lr=2*yr,Er=1*yr;function Cr(e=!1){const t=document.createElement("canvas");t.width=t.height=wr;const s=t.getContext("2d"),i=(wr-(3*Lr+2*Sr))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=Date.now(),r=(l=(o-n)%1e3,c=0,d=1e3,-1/2*(Math.cos(Math.PI*l/d)-1)+c);var l,c,d;s.clearRect(0,0,wr,wr),s.fillStyle=e&&!b.b.isMobile?Io.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=r>=.5?e%2?2-2*r:2*(r-.5):e%2?2*r:1-2*r;let n=4+8*t;n*=yr;fr(s,i+e*Lr+e*Sr,(wr-n)/2,Lr,n,Er,!0)}return!0};return{canvas:t,startAnimation:()=>{Object(os.a)(o),o()},setActive:t=>{e=t,o()}}}var Ir=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Mr extends _s{constructor(e,t,s){super({getIndex:e=>i.a.getDialogOnly(e.id)[this.indexKey],onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onSort:(e,t)=>{const s=e.dom.listEl.parentElement!==this.list;As(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:(e,t)=>{const s=t?[]:void 0,{dom:i}=Tr.addListDialog({dialog:e.id,loadPromises:s,isBatch:t});return e.dom=i,(null==s?void 0:s.length)&&(e.loadPromises=s,Promise.all(s).finally(()=>{delete e.loadPromises})),e},updateElementWith:De.c}),this.list=e,this.indexKey=t,this.onListLengthChange=s}clear(){this.list.innerHTML="",super.clear()}}class Pr{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.scroll=null,this.log=Object(X.b)("DIALOGS",X.a.Log|X.a.Error|X.a.Warn|X.a.Debug),this.contextMenu=new mr,this.sortedLists={},this.scrollables={},this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.offsets={top:0,bottom:0},this.initedListeners=!1,this.loadedDialogsAtLeastOnce=!1,this.onTabChange=()=>{this.scroll=this.scrollables[this.filterId],this.scroll.loadedAll.top=!0,this.scroll.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsPromise=void 0,this.sortedList=this.sortedLists[this.filterId],this.onChatsScroll()},this._onListLengthChange=()=>{if(!this.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId>0)return;const e=this.chatList,t=e.childElementCount,s=e.parentElement.parentElement,i=e.parentElement.nextElementSibling,n=!!i.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;s.classList.add("with-contacts");const a=new dn({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),P.a.getContactsPeerIds(void 0,void 0,"online").then(e=>{let t=!1;const s=()=>{t&&a.container.classList.toggle("hide",!i.list.childElementCount)},i=new Ds({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:s});this.loadContacts=()=>{const t=Et.a.height/60|0;e.splice(0,t).filter(this.verifyPeerIdForContacts).forEach(e=>{i.add(e)}),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>{if(e.isAnyChat())return;const t=this.verifyPeerIdForContacts(e),s=i.has(e);!s&&t?i.add(e):s&&!t&&i.delete(e)};const n=i.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,s()}),i.append(a.container)},this.verifyPeerIdForContacts=e=>e.isContact()&&!i.a.getDialogOnly(e),this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout(()=>{this.sliceTimeout=void 0,this.chatList.childElementCount&&!this.processContact&&Object(De.c)(()=>{const e=performance.now(),t=this.scroll.scrollTop,s=this.chatList.firstElementChild,i=this.scroll.container.getBoundingClientRect(),n=s.getBoundingClientRect(),a=Array.from(this.scroll.splitUp.children);let o=this.scroll.splitUp.offsetTop;o&&t{const t=e.dataset.peerId.toPeerId();this.deleteDialog(t)}),this.setOffsets(),this.scroll.scrollTop=c.offsetTop-h,this.log("slice time",performance.now()-e)})},200)},this.onChatsScrollTop=()=>{this.onChatsScroll("top")},this.onChatsScroll=(e="bottom")=>{if(!this.scroll.loadedAll[e])return this.loadDialogsPromise?this.loadDialogsPromise:(this.log("onChatsScroll",e),this.loadDialogs(e));this.loadContacts&&this.loadContacts()},this.chatsPreloader=Object(te.f)(null,!0),this.allUnreadCount=this.folders.menu.querySelector(".badge"),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=dt(this._onListLengthChange,100,!1,!0);const e=document.createElement("div");e.classList.add("connection-status-bottom"),e.append(this.folders.container),ue.IS_TOUCH_SUPPORTED&&Rs({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e>0?t+1:t-1)}}),this.setFilterId(0),this.addFilter({id:this.filterId,title:"",titleEl:Object(x.i18n)("ChatList.Filter.AllChats"),orderIndex:0}),this.sortedList=this.sortedLists[this.filterId],this.scroll=this.scrollables[this.filterId],a.default.addEventListener("state_cleared",()=>{M.default.getState().then(e=>{this.loadedDialogsAtLeastOnce=!1,P.a.clear(),K.a.clear();const t=i.a.filtersStorage.filters;for(const e in t)a.default.dispatchEvent("updateDialogFilter",{_:"updateDialogFilter",id:+e});i.a.clear(),this.sortedList.clear(),this.onTabChange(),this.onStateLoaded(e)})});const t=new T.a(this.folders.menuScrollContainer);e.prepend(this.folders.menuScrollContainer);const s=Object(Z.a)(this.folders.menu,this.folders.container,(e,t)=>{e=+t.dataset.filterId||0,this.filterId!==e&&(this.sortedLists[e].clear(),this.setFilterId(e),this.onTabChange())},()=>{for(const e in this.sortedLists)+e!==this.filterId&&this.sortedLists[e].clear()},void 0,t);this.folders.menu.firstElementChild.click(),i.a.construct(),M.default.getState().then(e=>this.onStateLoaded(e)),new vr(this.chatsContainer),this.chatsContainer.append(e),setTimeout(()=>{le.a.loadLottieWorkers()},200)}get chatList(){return this.sortedList.list}setFilterId(e){this.filterId=e,this.indexKey=i.a.dialogsStorage?i.a.dialogsStorage.getDialogIndexKey(this.filterId):"index",a.default.filterId=e}setOnlineStatus(e,t){const s=e.classList.contains("is-online");!s&&t&&e.classList.add("is-online"),Object(Jt.a)(e,"is-visible",t,250,t?void 0:()=>{e.classList.remove("is-online")},t&&!s?2:0)}initListeners(){a.default.addEventListener("user_update",e=>{var t;const s=e.toPeerId(),i=this.getDialogDom(s);if(i&&!P.a.isBot(e)&&s!==a.default.myId){const s="userStatusOnline"===(null===(t=P.a.getUser(e).status)||void 0===t?void 0:t._);this.setOnlineStatus(i.avatarEl,s)}}),a.default.addEventListener("chat_update",e=>{const t=e.toPeerId(!0),s=i.a.getDialogOnly(t);s&&this.processDialogForCallStatus(s)}),a.default.addEventListener("folder_unread",e=>{this.setFilterUnreadCount(e.id)}),a.default.addEventListener("contacts_update",e=>{this.processContact&&this.processContact(e.toPeerId())}),a.default.addEventListener("dialog_flush",({peerId:e})=>{const t=i.a.getDialogOnly(e);t&&(this.setLastMessage(t,void 0,void 0,void 0,void 0,void 0,!0),this.validateDialogForFilter(t),this.setFiltersUnreadCount())}),a.default.addEventListener("dialogs_multiupdate",e=>{for(const t in e){const s=e[t];this.updateDialog(s),this.processContact&&this.processContact(t.toPeerId()),this.validateDialogForFilter(s)}}),a.default.addEventListener("dialog_drop",({peerId:e})=>{this.deleteDialog(e),this.processContact&&this.processContact(e)}),a.default.addEventListener("dialog_unread",({peerId:e})=>{const t=i.a.getDialogOnly(e);t&&(this.setUnreadMessages(t),this.validateDialogForFilter(t))}),a.default.addEventListener("dialog_notify_settings",e=>{this.setUnreadMessages(e),this.setFiltersUnreadCount()}),a.default.addEventListener("dialog_draft",({dialog:e,drop:t,peerId:s})=>{t?this.sortedList.delete(s):this.updateDialog(e),this.processContact&&this.processContact(s)}),a.default.addEventListener("peer_changed",e=>{for(const t of this.lastActiveElements)t.dataset.peerId.toPeerId()!==e&&this.setDialogActive(t,!1);Array.from(document.querySelectorAll(`[data-autonomous="0"] li[data-peer-id="${e}"]`)).forEach(e=>{this.setDialogActive(e,!0)})}),a.default.addEventListener("filter_update",e=>{if(!this.filtersRendered[e.id])return void this.addFilter(e);if(e.id===this.filterId){const e=i.a.dialogsStorage.getCachedDialogs(!0);this.validateListForFilter();for(let t=0,s=e.length;t{const t=this.filtersRendered[e.id];t&&(this.folders.menu.firstElementChild.click(),t.container.remove(),t.menu.remove(),delete this.sortedLists[e.id],delete this.scrollables[e.id],delete this.filtersRendered[e.id],Object.keys(this.filtersRendered).length<=1&&this.folders.menuScrollContainer.classList.add("hide"))}),a.default.addEventListener("filter_order",e=>{const t=this.folders.menu;e.forEach(e=>{const s=i.a.filtersStorage.getFilter(e),n=this.filtersRendered[e];this.sortedLists[e].indexKey=i.a.dialogsStorage.getDialogIndexKey(e),As(n.menu,t,s.orderIndex),As(n.container,this.folders.container,s.orderIndex)}),this.indexKey=i.a.dialogsStorage.getDialogIndexKey(this.filterId)}),a.default.addEventListener("peer_typings",({peerId:e,typings:t})=>{const s=i.a.getDialogOnly(e);s&&(t.length?this.setTyping(s):this.unsetTyping(s))})}setDialogActive(e,t){const s=e.dialogDom;e.classList.toggle("active",t),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==s?void 0:s.callIcon)&&s.callIcon.setActive(t)}onStateLoaded(e){return Ir(this,void 0,void 0,(function*(){Dt.a.getNotifyPeerTypeSettings(),this.initedListeners||(this.initListeners(),this.initedListeners=!0);const t=i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.addFilter(t)});return e.filters&&Object.keys(e.filters).length&&(yield t,this.showFiltersPromise&&(yield this.showFiltersPromise)),M.default.storagesResults.dialogs.length&&Pi.a.addMissedDialogs(),this.onChatsScroll().then(()=>{i.a.fillConversations()})}))}getOffsetIndex(e){return{index:this.scroll.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){if(void 0!==e.migratedTo||!this.testDialogForFilter(e))return!1;const t=this.getOffsetIndex("top"),s=this.getOffsetIndex("bottom");if(!t.index&&!s.index)return!0;const i=e[this.indexKey];return(!t.index||i<=t.index)&&(!s.index||i>=s.index)}deleteDialog(e){this.sortedList.delete(e)}updateDialog(e){if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e.peerId);if(!this.sortedList.has(e.peerId))return void this.sortedList.add(e.peerId);const t=this.getDialogDom(e.peerId);t&&(this.setLastMessage(e,void 0,t,void 0,void 0,void 0,!0),this.sortedList.update(e.peerId))}setFilterUnreadCount(e){var t;const s=0===e?this.allUnreadCount:null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!s)return;const n=i.a.dialogsStorage.getFolder(e),a=0===e||!!n.dialogs.find(e=>(e.unread_count||e.pFlags.unread_mark)&&!Dt.a.isPeerLocalMuted(e.peerId,!0));s.classList.toggle("badge-gray",!a);const o=n.unreadDialogsCount;s.innerText=o?""+o:""}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e);this.setFilterUnreadCount(0)}validateListForFilter(){const e=i.a.filtersStorage.getFilter(this.filterId)||null;this.sortedList.getAll().forEach(t=>{const s=i.a.getDialogOnly(t.id);this.testDialogForFilter(s,e)||this.deleteDialog(t.id)})}validateDialogForFilter(e,t){this.getDialogDom(e.peerId)&&(this.testDialogForFilter(e,t)||this.deleteDialog(e.peerId))}testDialogForFilter(e,t=i.a.filtersStorage.getFilter(this.filterId)){return!(!e||t&&!i.a.filtersStorage.testDialogForFilter(e,t)||!t&&this.filterId!==e.folder_id)}generateScrollable(e,t){const s=new T.b(null,"CL",500);s.container.addEventListener("scroll",this.onChatsRegularScroll),s.container.dataset.filterId=""+t,s.onScrolledTop=this.onChatsScrollTop,s.onScrolledBottom=this.onChatsScroll,s.setVirtualContainer(e);const n=new Mr(e,i.a.dialogsStorage?i.a.dialogsStorage.getDialogIndexKey(t):"index",this.onListLengthChange);return this.scrollables[t]=s,this.sortedLists[t]=n,s}addFilter(e){if(this.filtersRendered[e.id])return;const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const s=document.createElement("span"),i=document.createElement("span");i.classList.add("text-super"),e.titleEl?i.append(e.titleEl):i.innerHTML=J.a.wrapEmojiText(e.title);const n=document.createElement("div");n.classList.add("badge","badge-20","badge-primary");const a=document.createElement("i");s.append(i,n,a),t.append(s),Object(se.ripple)(t);As(t,this.folders.menu,e.orderIndex);const o=this.createChatList(),r=this.generateScrollable(o,e.id);r.container.classList.add("tabs-tab","chatlist-parts");const l=document.createElement("div");l.classList.add("chatlist-top");const c=document.createElement("div");c.classList.add("chatlist-bottom"),l.append(o),r.container.append(l,c);const d=r.container;As(r.container,this.folders.container,e.orderIndex),this.setListClickListener(o,null,!0),this.filtersRendered[e.id]={menu:t,container:d,unread:n,title:i},!this.showFiltersPromise&&Object.keys(this.filtersRendered).length>1&&(this.showFiltersPromise=new Promise(e=>{window.setTimeout(()=>{this.showFiltersPromise=void 0,Object.keys(this.filtersRendered).length>1&&(this.folders.menuScrollContainer.classList.remove("hide"),this.setFiltersUnreadCount()),e()},0)}))}loadDialogs(e){if(this.loadDialogsPromise)return this.loadDialogsPromise;const t=new Promise(s=>Ir(this,void 0,void 0,(function*(){const{chatList:n,filterId:a,indexKey:o}=this;let r=Et.a.height/72*1.25|0,l=0;const{index:c}=this.getOffsetIndex(e);if(c)if("top"===e){const e=i.a.dialogsStorage.getFolderDialogs(a,!0),t=e.findIndex(e=>e[o]<=c),s=Math.max(0,t-r);r=t-s,l=e[s][o]+1}else l=c;try{const s=i.a.getConversations("",l,r,a,!0);if(!s.cached&&!n.childElementCount){n.parentElement.append(this.chatsPreloader)}const c=yield s.promise;if(this.loadDialogsPromise!==t)return;if("bottom"===e?c.isEnd&&(this.scroll.loadedAll[e]=!0):c.isTopEnd&&(this.scroll.loadedAll[e]=!0),this.loadedDialogsAtLeastOnce=!0,c.dialogs.length){const t="top"===e?c.dialogs.slice().reverse():c.dialogs,s=[],n=[],a=e=>{n.push(e)};t.forEach(e=>{if(!i.a.getDialogOnly(e.peerId))return;const t=this.sortedList.add(e.peerId,!0,a,!1);t.loadPromises&&s.push(...t.loadPromises)}),yield Promise.all(s).finally(),n.forEach(e=>e())}else this.onListLengthChange();const d=c.dialogs["top"===e?0:c.dialogs.length-1];d&&(this.offsets[e]=d[o]),this.log.debug("getDialogs "+r+" dialogs by offset:",l,c,n.childElementCount),setTimeout(()=>{this.scroll.onScroll()},0)}catch(e){this.log.error(e)}this.chatsPreloader.parentElement&&this.chatsPreloader.remove(),s()}))).finally(()=>{this.loadDialogsPromise=void 0});return this.loadDialogsPromise=t}generateEmptyPlaceholder(e){const t="empty-placeholder",s=document.createElement("div");s.classList.add(t,t+"-"+e.classNameType);const i=document.createElement("div");i.classList.add(t+"-header"),Object(x._i18n)(i,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&Object(x._i18n)(n,e.subtitle,e.subtitleArgs),s.append(i,n),{container:s,header:i,subtitle:n}}checkIfPlaceholderNeeded(){if(1===this.filterId)return;const e=this.chatList,t=e.parentElement;let s=Array.from(t.children).find(e=>e.matches(".empty-placeholder"));const n=this.scroll.loadedAll.bottom&&!e.childElementCount;if(n&&s)return;if(!n)return void(s&&(t.classList.remove("with-placeholder"),s.remove()));let a;if(this.filterId){a=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:"folder"}),s=a.container,s.prepend(function({emoji:e,width:t,height:s}){const i=document.createElement("div"),n=us.getAnimatedEmojiSticker(e);return n?Cs({doc:n,div:i,loop:!1,play:!0,width:t,height:s,emoji:e}).then(()=>{}):i.classList.add("media-sticker-wrapper"),{container:i}}({emoji:"📂",width:128,height:128}).container);const e=Object(U.a)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});Object(l.b)(e,()=>{new $i(mn).open(i.a.filtersStorage.getFilter(this.filterId))}),s.append(e)}else{a=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:"dialogs"}),s=a.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),Promise.all([P.a.getContacts().then(e=>{let t,s;e.length?(t="ChatList.Main.EmptyPlaceholder.Subtitle",s=[Object(x.i18n)("Contacts.Count",[e.length])]):(t="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",s=[]);new x.default.IntlElement({key:t,args:s,element:a.subtitle})}),Object(rs.b)(e,"assets/img/EmptyChats.svg"),Object(De.d)()]).then(()=>{s.classList.add("visible")}),s.prepend(e)}t.append(s),t.classList.add("with-placeholder")}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,s=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),s.innerHTML="",this.loadContacts=void 0,this.processContact=void 0}setOffsets(){const e=this.chatList,t=this.getDialogFromElement(e.firstElementChild),s=this.getDialogFromElement(e.lastElementChild),i=this.indexKey;this.offsets.top=t[i],this.offsets.bottom=s[i]}getDialogFromElement(e){return i.a.getDialogOnly(e.dataset.peerId.toPeerId())}setListClickListener(e,t,s=!1,n=!1,a=!1){let o;const r=(a?er.setInnerPeer:er.setPeer).bind(er);e.dataset.autonomous=""+ +n,e.addEventListener("mousedown",e=>{if(0!==e.button)return;this.log("dialogs click list");const s=e.target,i=Object(ft.a)(s,"LI");if(i){if(n){const e=o===i;o&&!e&&o.classList.remove("active"),i&&(i.classList.add("active"),o=i,this.lastActiveElements.add(i))}if(i){t&&t();const e=i.dataset.peerId.toPeerId(),s=+i.dataset.mid||void 0;r(e,s)}else r(Be.b)}},{capture:!0}),de.b&&e.addEventListener("dblclick",e=>{const t=Object(ft.a)(e.target,"LI");if(t){const e=t.dataset.peerId.toPeerId();this.log("debug dialog:",i.a.getDialogByPeerId(e))}}),s&&Object(te.a)(e,this.contextMenu.onContextMenu)}createChatList(e={}){const t=document.createElement("ul");return t.classList.add("chatlist"),e.new&&t.classList.add("chatlist-new"),e.dialogSize&&t.classList.add("chatlist-"+e.dialogSize),t}setLastMessage(e,t,s,n,l,c=!1,d=!1){if(!s&&!(s=this.getDialogDom(e.peerId)))return;let h;if(t||(e.draft&&"draftMessage"===e.draft._&&(h=e.draft),t=i.a.getMessageByPeer(e.peerId,e.top_message)),"messageEmpty"===t._)return s.lastMessageSpan.innerHTML="",s.lastTimeSpan.innerHTML="",delete s.listEl.dataset.mid,void(d&&this.setUnreadMessages(e,s,c));const p=e.peerId;{let e;if(!t.deleted&&!h){const s=i.a.getMediaFromMessage(t);if(s&&("photo"===s._||["video","gif"].includes(s.type))){const i=r.a.choosePhotoSize(s,20,20);if("photoSizeEmpty"!==i._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),Ls({photo:s,message:t,container:e,withoutPreloader:!0,size:i,loadPromises:l}),"video"===s.type)){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}const c=!!e&&!!(null==t?void 0:t.message);let d;if(d=n&&t.message?i.a.wrapMessageForReply(t,void 0,void 0,!1,n,c):h?i.a.wrapMessageForReply(h):t.deleted?document.createDocumentFragment():i.a.wrapMessageForReply(t,void 0,void 0,!1,void 0,c),e&&d.prepend(e),Object(k.a)(s.lastMessageSpan,d),h){const e=document.createElement("b");e.classList.add("danger"),e.append(Object(x.i18n)("Draft"),": "),s.lastMessageSpan.prepend(e)}else if(p.isAnyChat()&&p!==t.fromId&&!t.action){const e=o.a.getPeer(t.fromId);if(e&&e.id){const i=document.createElement("b");e.id===a.default.myId?i.append(Object(x.i18n)("FromYou")):i.append(new Lt.a({peerId:t.fromId,onlyFirstName:!0}).element),i.append(": "),s.lastMessageSpan.prepend(i)}}}if(!t.deleted||h){const e=h?Math.max(h.date,t.date||0):t.date;Object(k.a)(s.lastTimeSpan,Object(oe.c)(new Date(1e3*e)))}else s.lastTimeSpan.textContent="";null!==d&&(d?this.setUnreadMessages(e,s,c):s.listEl.dataset.mid=t.mid)}setUnreadMessages(e,t=this.getDialogDom(e.peerId),s=!1){var n;if(!t)return;if(!s){const s=Dt.a.isPeerLocalMuted(e.peerId,!0);s!==t.listEl.classList.contains("is-muted")&&Object(Jt.a)(t.listEl,"is-muted",s,200)}let o;if("draftMessage"!==(null===(n=e.draft)||void 0===n?void 0:n._)){const t=i.a.getMessageByPeer(e.peerId,e.top_message);!t.deleted&&t.pFlags.out&&t.peerId!==a.default.myId&&(o=t)}!function(e,t,s){let i;if((null==t?void 0:t.pFlags.out)&&(i=t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!i)return void(e.textContent="");const n="tgico-"+i,a=e.lastElementChild;if(a&&a.classList.contains(n))return;const o=document.createElement("i");o.classList.add("sending-status-icon",n),e.append(o),a&&a.remove()}(t.statusSpan,o);const r=i.a.filtersStorage.getFilter(this.filterId);let l;l=r?-1!==r.pinnedPeerIds.indexOf(e.peerId):!!e.pFlags.pinned;const c=i.a.isDialogUnread(e),d=l||c,h=Object(ms.a)(t.unreadBadge);d&&!h&&t.subtitleEl.append(t.unreadBadge);const p=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),u=t.mentionsBadge&&Object(ms.a)(t.mentionsBadge);p&&(t.mentionsBadge||(t.mentionsBadge=document.createElement("div"),t.mentionsBadge.className="dialog-subtitle-badge badge badge-24 mention mention-badge",t.mentionsBadge.innerText="@",t.subtitleEl.insertBefore(t.mentionsBadge,t.lastMessageSpan.nextSibling)));const m=s?0:200;if(Object(Jt.a)(t.unreadBadge,"is-visible",d,m,d?void 0:()=>{t.unreadBadge.remove()},h?0:2),t.mentionsBadge&&Object(Jt.a)(t.mentionsBadge,"is-visible",p,m,p?void 0:()=>{t.mentionsBadge.remove(),delete t.mentionsBadge},u?0:2),!d)return;l?t.unreadBadge.classList.add("tgico-chatspinned","tgico"):t.unreadBadge.classList.remove("tgico-chatspinned","tgico");let g=!0,b=!1;e.unread_mentions_count&&1===e.unread_count?(t.unreadBadge.innerText="@",b=!0):c?t.unreadBadge.innerText=""+(e.unread_count||" "):(t.unreadBadge.innerText="",g=!1),t.unreadBadge.classList.toggle("unread",g),t.unreadBadge.classList.toggle("mention",b)}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialog(e){if("object"!=typeof e&&e){const t=i.a.getDialogOnly(e);return t||{peerId:e,peer:o.a.getOutputPeer(e),pFlags:{}}}return e}setCallStatus(e,t){let{callIcon:s,listEl:i}=e;if(!s&&t){const{canvas:t,startAnimation:n}=e.callIcon=s=Cr(i.classList.contains("active"));t.classList.add("dialog-group-call-icon"),i.append(t),n()}s&&Object(Jt.a)(e.callIcon.canvas,"is-visible",t,200,t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},t?2:0)}addListDialog(e){const t=this.getDialog(e.dialog);e.autonomous=!1;const s=this.addDialogNew(e);if(s){const{peerId:i}=t;Dt.a.isPeerLocalMuted(i,!0)&&s.dom.listEl.classList.add("is-muted"),i.isUser()||this.processDialogForCallStatus(t,s.dom),this.setLastMessage(t,void 0,s.dom,void 0,e.loadPromises,e.isBatch,!0)}return s}processDialogForCallStatus(e,t){if(!no)return;if(t||(t=this.getDialogDom(e.peerId)),!t)return;const s=K.a.getChat(e.peerId.toChatId());this.setCallStatus(t,!(!s.pFlags.call_active||!s.pFlags.call_not_empty))}addDialogNew(e){return this.addDialog(e.dialog,e.container,e.drawStatus,e.rippleEnabled,e.onlyFirstName,e.meAsSaved,e.append,e.avatarSize,e.autonomous,e.lazyLoadQueue,e.loadPromises)}addDialog(e,t,s=!0,i=!0,n=!1,r=!0,l=!0,c=54,d=!!t,h,p){var u,m,g;const b=this.getDialog(e),v=b.peerId,f=new ur;if(f.loadPromises=p,f.lazyLoadQueue=h,f.setAttribute("dialog",r?"1":"0"),f.setAttribute("peer",""+v),f.classList.add("dialog-avatar","avatar-"+c),s&&v!==a.default.myId&&v.isUser()){"userStatusOnline"===(null===(u=P.a.getUser(v).status)||void 0===u?void 0:u._)&&this.setOnlineStatus(f,!0)}const y=document.createElement("div");y.classList.add("user-caption");const w=document.createElement("span");w.classList.add("user-title");const S=new Lt.a({peerId:v,dialog:r,onlyFirstName:n,plainText:!1});w.append(S.element),w.classList.add("tgico");const L=o.a.getPeer(v);(null===(m=null==L?void 0:L.pFlags)||void 0===m?void 0:m.verified)&&w.append(Ut());const E=document.createElement("span");E.classList.add("user-last-message"),E.setAttribute("dir","auto");const C=document.createElement("li");C.classList.add("chatlist-chat"),i&&Object(se.ripple)(C),C.append(f,y),C.dataset.peerId=""+v;const I=document.createElement("span");I.classList.add("message-status","sending-status");const M=document.createElement("span");M.classList.add("message-time");const T=document.createElement("div");T.className="dialog-subtitle-badge badge badge-24";const k=document.createElement("p");k.classList.add("dialog-title");const x=document.createElement("span");x.classList.add("dialog-title-details"),x.append(I,M),k.append(w,x);const O=document.createElement("p");O.classList.add("dialog-subtitle"),O.append(E),y.append(k,O);const A={avatarEl:f,captionDiv:y,titleSpan:S.element,titleSpanContainer:w,statusSpan:I,lastTimeSpan:M,unreadBadge:T,lastMessageSpan:E,containerEl:C,listEl:C,subtitleEl:O};if(t){t[l?"append":"prepend"](C)}return d||(C.dialogDom=A,(null===(g=er.chat)||void 0===g?void 0:g.peerId)===v&&this.setDialogActive(C,!0)),{dom:A,dialog:b}}setTyping(e){const t=this.getDialogDom(e.peerId);if(!t)return;let s=t.lastMessageSpan.querySelector(".peer-typing-container");s?er.getPeerTyping(e.peerId,s):(s=er.getPeerTyping(e.peerId),Object(k.a)(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.setLastMessage(e,null,t,void 0,void 0,void 0,null))}}const Tr=new Pr;de.a.appDialogsManager=Tr;var kr=t.default=Tr},154:function(e,t,s){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function s(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,s),n.l=!0,n.exports}return s.m=e,s.c=t,s.d=function(e,t,i){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(s.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)s.d(i,n,function(t){return e[t]}.bind(null,n));return i},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="",s(s.s=0)}([function(e,t,s){"use strict";(function(t){var s=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return s&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],s=0;s{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,s)=>{var i=s=>{switch(s.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=s.data.samplePosition,e(s.data.page);break;case"done":this.encoder.removeEventListener("message",i),this.finish()}};this.encoder.addEventListener("message",i),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,s)=>{var i=s=>{"flushed"===s.data.message&&(t.removeEventListener("message",i),this.onpause(),e())};t.addEventListener("message",i),t.postMessage({command:"flush"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var s=i=>{"done"===i.data.message&&(e.removeEventListener("message",s),t())};e.addEventListener("message",s),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,s){return e.set(s,t),t+s.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,s(1))},function(e,t){var s;s=function(){return this}();try{s=s||new Function("return this")()}catch(e){"object"==typeof window&&(s=window)}e.exports=s}])},18:function(e,t,s){"use strict";s.r(t),s.d(t,"ripple",(function(){return l}));var i=s(6),n=s(60),a=s(1),o=s(15);let r=0;function l(e,t=(()=>Promise.resolve()),s=null,l=!1){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let c=document.createElement("div");c.classList.add("c-ripple");let d;e.classList.contains("rp-square")&&c.classList.add("is-square"),e[l?"prepend":"append"](c);const h=(e,i)=>{const o=Date.now(),l=document.createElement("div"),h=r++,p=1e3*+window.getComputedStyle(c).getPropertyValue("--ripple-duration").replace("s","");d=()=>{let e=Date.now()-o;const t=()=>{n.a.mutate(()=>{l.remove()}),s&&s(h)};if(el.classList.add("hiding"),Math.max(s-p/2,0)),setTimeout(t,s)}else l.classList.add("hiding"),setTimeout(t,p/2);a.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",d),d=null,u=!1},t&&t(h),window.requestAnimationFrame(()=>{const t=c.getBoundingClientRect();l.classList.add("c-ripple__circle");const s=e-t.left,n=i-t.top,a=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(s-t.width/2)+t.width/2,2)),o=s-a/2,r=n-a/2;l.style.width=l.style.height=a+"px",l.style.left=o+"px",l.style.top=r+"px",c.append(l)})},p=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==c);let u=!1;if(a.IS_TOUCH_SUPPORTED){let t=()=>{d&&d()};e.addEventListener("touchstart",s=>{if(!o.default.settings.animationsEnabled)return;if(s.touches.length>1||u||p(s))return;u=!0;let{clientX:i,clientY:n}=s.touches[0];h(i,n),e.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",s=>{s.cancelBubble=!0,s.stopPropagation(),t(),e.removeEventListener("touchend",t)},{once:!0})},{passive:!0})}else e.addEventListener("mousedown",t=>{if(![0,2].includes(t.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===e.dataset.ripple||p(t))return;if(u)return void(u=!1);let{clientX:s,clientY:i}=t;h(s,i),window.addEventListener("mouseup",d,{once:!0,passive:!0}),window.addEventListener("contextmenu",d,{once:!0,passive:!0})},{passive:!0})}},30:function(e,t,s){"use strict";s.d(t,"a",(function(){return a})),s.d(t,"b",(function(){return o})),s.d(t,"c",(function(){return r})),s.d(t,"d",(function(){return l}));var i=s(1),n=s(52);const a=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function o(e,t,s={}){const i=s.listenerSetter?s.listenerSetter.add(e):e.addEventListener.bind(e);s.touchMouseDown=!0,i(a,t,s)}function r(e,t,s){e.removeEventListener(a,t,s)}function l(e){Object(n.a)(e,a)}},34:function(e,t,s){"use strict";var i=s(16),n=s(18);t.a=(e,t={})=>{const s=document.createElement(t.asDiv?"div":"button");return s.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&s.classList.add("rp-square"),Object(n.ripple)(s)),t.onlyMobile&&s.classList.add("only-handhelds"),t.disabled&&s.setAttribute("disabled","true"),t.text&&s.append(Object(i.i18n)(t.text)),s}},35:function(e,t,s){"use strict";s.d(t,"f",(function(){return h})),s.d(t,"g",(function(){return p})),s.d(t,"c",(function(){return g})),s.d(t,"d",(function(){return y})),s.d(t,"e",(function(){return w})),s.d(t,"b",(function(){return E})),s.d(t,"a",(function(){return C}));var i=s(29),n=s(5),a=s(30),o=s(37),r=s(1),l=s(0),c=s(15),d=s(50);function h(e,t=!1){const s='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=s,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",s),e.lastElementChild}function p(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,h(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=h;let u=e=>{let t=b.getBoundingClientRect(),{clientX:s,clientY:i}=e,n=s>=t.right?s-t.right:t.left-s,a=i>=t.bottom?i-t.bottom:t.top-i;(n>=100||a>=100)&&g()};const m=e=>{g()},g=()=>{b&&(b.classList.remove("active"),b.parentElement.classList.remove("menu-open"),f&&f.remove(),b=null,c.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",u),window.removeEventListener("contextmenu",m)),document.removeEventListener(a.a,m),l.IS_MOBILE_SAFARI||d.a.removeByType("menu")};window.addEventListener("resize",()=>{b&&g()});let b=null,v=null,f=null;function y(e,t){g(),l.IS_MOBILE_SAFARI||d.a.pushItem({type:"menu",onPop:e=>{g()}}),b=e,b.classList.add("active"),b.parentElement.classList.add("menu-open"),f||(f=document.createElement("div"),f.classList.add("btn-menu-overlay"),f.addEventListener(a.a,e=>{Object(n.a)(e),m()})),b.parentElement.insertBefore(f,b),v=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",u),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(a.a,m),c.default.dispatchEvent("context_menu_toggle",!0)}function w({pageX:e,pageY:t},s,i){let{scrollWidth:n,scrollHeight:a}=s;const r=document.body.getBoundingClientRect(),l=r.width,c=r.height;i=o.b.isMobile?"right":"left";let d="top";const h={x:{left:e,right:e-n},intermediateX:"right"===i?8:l-n-8,y:{top:t,bottom:t-a},intermediateY:t=8},u={top:h.y.top+a+8<=c,bottom:h.y.bottom-8>=8};{let e;e=p[i]?h.x[i]:(i="center",h.intermediateX),s.style.left=e+"px"}{let e;e=u[d]?h.y[d]:(d="center",h.intermediateY),s.style.top=e+"px"}s.className=s.className.replace(/(top|center|bottom)-(left|center|right)/g,""),s.classList.add(("center"===d?d:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let S=!1,L=0;function E(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,S=!1},400),S=!0}function C(e,t,s){const i=s?s.add(e):e.addEventListener.bind(e),a=s?s.removeManual.bind(s,e):e.removeEventListener.bind(e);if(l.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let s;const o={capture:!0},r=()=>{clearTimeout(s),a("touchmove",r,o),a("touchend",r,o),a("touchcancel",r,o)};i("touchstart",a=>{a.touches.length>1?r():(i("touchmove",r,o),i("touchend",r,o),i("touchcancel",r,o),s=window.setTimeout(()=>{S?r():(t(a.touches[0]),r(),b&&e.addEventListener("touchend",n.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?s=>{t(s),b&&e.addEventListener("touchend",n.a,{once:!0})}:t)}},50:function(e,t,s){"use strict";var i=s(29),n=s(0),a=s(43),o=s(7),r=s(5),l=s(41),c=s(72);const d=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(a.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const s=this.navigations.pop();s?(this.manual=!e,this.handleItem(s)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),n.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(c.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",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||Object(o.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const s=this.navigations[t];if(s.type===e)return{item:s,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)}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){Object(l.e)(this.navigations,e)}removeByType(e,t=!1){for(let s=this.navigations.length-1;s>=0;--s){if(this.navigations[s].type===e&&(this.navigations.splice(s,1),t))break}}};i.a.appNavigationController=d,t.a=d},52:function(e,t,s){"use strict";function i(e,t){const s=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(s)}s.d(t,"a",(function(){return i}))},60:function(e,t,s){"use strict";var i=s(42),n=s(46),a=s(29),o=s(61);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let s=this.promises[e];return s||(this.scheduleFlush(),s=this.promises[e]=Object(n.a)()),void 0!==t&&s.then(()=>t()),s}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const s=Object(o.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&s.then(()=>t()),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};a.a&&(a.a.sequentialDom=r),t.a=r},72:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(0);function n(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},79:function(e,t,s){"use strict";var i=s(29),n=s(33);const a=new class{getState(){return n.a.invokeApi("account.getPassword").then(e=>e)}updateSettings(e={}){return this.getState().then(t=>{let s,i;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};s=e.currentPassword?n.a.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=t.new_algo,r=new Uint8Array(o.salt1.length+32);return r.randomize(),r.set(o.salt1,0),o.salt1=r,i=e.newPassword?n.a.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([s,i]).then(e=>(a.password=e[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=e[1],n.a.invokeApi("account.updatePasswordSettings",a)))})}check(e,t,s={}){return n.a.invokeCrypto("computeSRP",e,t,!1).then(e=>n.a.invokeApi("auth.checkPassword",{password:e},s).then(e=>("auth.authorization"===e._&&n.a.setUser(e.user),e)))}confirmPasswordEmail(e){return n.a.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return n.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return n.a.invokeApi("account.cancelPasswordEmail")}};i.a.passwordManager=a,t.a=a},95:function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(5),n=s(38);class a extends n.b{constructor(e={}){super(Object.assign({plainText:!0},e)),this.passwordVisible=!1,this.onVisibilityClick=e=>{Object(i.a)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const t=this.input;t.type="password",t.setAttribute("required",""),t.autocomplete="off";const s=document.createElement("input");s.classList.add("stealthy"),s.tabIndex=-1,s.type="password",t.parentElement.prepend(s),t.parentElement.insertBefore(s.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}}}]); +//# sourceMappingURL=14.11183df10f220f2bd1db.chunk.js.map \ No newline at end of file diff --git a/public/14.11183df10f220f2bd1db.chunk.js.map b/public/14.11183df10f220f2bd1db.chunk.js.map new file mode 100644 index 000000000..d84f474e4 --- /dev/null +++ b/public/14.11183df10f220f2bd1db.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/monkeys/password.ts","webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/environment/mediaMimeTypesSupport.ts","webpack:///./src/helpers/dom/setInnerHTML.ts","webpack:///./src/helpers/filterChatPhotosMessages.ts","webpack:///./src/helpers/listLoader.ts","webpack:///./src/helpers/searchListLoader.ts","webpack:///./src/components/appSearch.ts","webpack:///./src/components/inputSearch.ts","webpack:///./src/components/buttonIcon.ts","webpack:///./src/components/sliderTab.ts","webpack:///./src/components/slider.ts","webpack:///./src/components/avatarEdit.ts","webpack:///./src/components/buttonCorner.ts","webpack:///./src/components/sidebarLeft/tabs/newGroup.ts","webpack:///./src/components/appMediaPlaybackController.ts","webpack:///./src/helpers/dom/attachGrabListeners.ts","webpack:///./src/components/rangeSelector.ts","webpack:///./src/components/buttonMenu.ts","webpack:///./src/components/buttonMenuToggle.ts","webpack:///./src/helpers/dom/controlsHover.ts","webpack:///./src/lib/mediaPlayer.ts","webpack:///./src/helpers/schedulers/throttleWithRaf.ts","webpack:///./src/helpers/schedulers/throttleWith.ts","webpack:///./src/components/audio.ts","webpack:///./src/components/divAndCaption.ts","webpack:///./src/components/chat/replyContainer.ts","webpack:///./src/components/groupedLayout.ts","webpack:///./src/components/editPeer.ts","webpack:///./src/components/radioForm.ts","webpack:///./src/components/row.ts","webpack:///./src/helpers/clipboard.ts","webpack:///./src/components/radioField.ts","webpack:///./src/components/toast.ts","webpack:///./src/helpers/schedulers/debounce.ts","webpack:///./src/components/usernameInputField.ts","webpack:///./src/components/popups/peer.ts","webpack:///./src/components/sidebarRight/tabs/chatType.ts","webpack:///./src/helpers/scrollableLoader.ts","webpack:///./src/components/appSelectPeers.ts","webpack:///./src/components/popups/pickUser.ts","webpack:///./src/components/sidebarRight/tabs/userPermissions.ts","webpack:///./src/components/sidebarRight/tabs/groupPermissions.ts","webpack:///./src/components/popups/deleteDialog.ts","webpack:///./src/components/sidebarRight/tabs/editChat.ts","webpack:///./src/components/sidebarRight/tabs/editContact.ts","webpack:///./src/components/sidebarLeft/tabs/addMembers.ts","webpack:///./src/environment/parallaxSupport.ts","webpack:///./src/components/generateVerifiedIcon.ts","webpack:///./src/components/swipeHandler.ts","webpack:///./src/components/peerProfileAvatars.ts","webpack:///./src/components/peerProfile.ts","webpack:///./src/components/sidebarRight/tabs/sharedMedia.ts","webpack:///./src/components/sidebarRight/index.ts","webpack:///./src/components/sidebarRight/tabs/pollResults.ts","webpack:///./src/components/poll.ts","webpack:///./src/lib/appManagers/appStickersManager.ts","webpack:///./src/components/wrappers.ts","webpack:///./src/helpers/dom/positionElementByIndex.ts","webpack:///./src/helpers/sortedList.ts","webpack:///./src/components/sortedUserList.ts","webpack:///./src/helpers/dom/handleHorizontalSwipe.ts","webpack:///./src/helpers/dom/handleTabSwipe.ts","webpack:///./src/components/popups/forward.ts","webpack:///./src/components/popups/deleteMessages.ts","webpack:///./src/components/popups/sendNow.ts","webpack:///./src/helpers/dom/cancelSelection.ts","webpack:///./src/components/chat/selection.ts","webpack:///./src/helpers/dom/getSelectedText.ts","webpack:///./src/components/appSearchSuper..ts","webpack:///./src/helpers/dom/lockTouchScroll.ts","webpack:///./src/lib/appManagers/appPrivacyManager.ts","webpack:///./src/components/privacySection.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack:///./src/helpers/dom/canFocus.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/email.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/index.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack:///./src/components/sidebarLeft/tabs/activeSessions.ts","webpack:///./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack:///./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack:///./src/helpers/color.ts","webpack:///./src/helpers/highlightningColor.ts","webpack:///./src/components/colorPicker.ts","webpack:///./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack:///./src/components/sidebarLeft/tabs/background.ts","webpack:///./src/helpers/averageColor.ts","webpack:///./src/components/popups/stickers.ts","webpack:///./src/components/sidebarLeft/tabs/generalSettings.ts","webpack:///./src/helpers/eachMinute.ts","webpack:///./src/components/sidebarLeft/tabs/editProfile.ts","webpack:///./src/components/sidebarLeft/tabs/includedChats.ts","webpack:///./src/components/sidebarLeft/tabs/editFolder.ts","webpack:///./src/components/sidebarLeft/tabs/chatFolders.ts","webpack:///./src/components/sidebarLeft/tabs/notifications.ts","webpack:///./src/components/sidebarLeft/tabs/language.ts","webpack:///./src/components/sidebarLeft/tabs/settings.ts","webpack:///./src/components/sidebarLeft/tabs/newChannel.ts","webpack:///./src/components/popups/createContact.ts","webpack:///./src/components/sidebarLeft/tabs/contacts.ts","webpack:///./src/components/sidebarLeft/tabs/archivedTab.ts","webpack:///./src/components/sidebarLeft/index.ts","webpack:///./src/components/chat/bubbleGroups.ts","webpack:///./src/components/popups/datePicker.ts","webpack:///./src/components/stickyIntersector.ts","webpack:///./src/components/chat/replies.ts","webpack:///./src/components/chat/messageRender.ts","webpack:///./src/helpers/dom/getElementByPoint.ts","webpack:///./src/helpers/dom/reflowScrollableElement.ts","webpack:///./src/lib/appManagers/appEmojiManager.ts","webpack:///./src/components/emoticonsDropdown/tabs/emoji.ts","webpack:///./src/components/gifsMasonry.ts","webpack:///./src/components/emoticonsDropdown/tabs/gifs.ts","webpack:///./src/components/emoticonsDropdown/tabs/stickers.ts","webpack:///./src/lib/appManagers/appInlineBotsManager.ts","webpack:///./src/components/sidebarRight/tabs/gifs.ts","webpack:///./src/components/sidebarRight/tabs/stickers.ts","webpack:///./src/helpers/dropdownHover.ts","webpack:///./src/components/emoticonsDropdown/index.ts","webpack:///./src/components/chat/bubbles.ts","webpack:///./src/lib/mtproto/constants.ts","webpack:///./src/components/popups/unpinMessage.ts","webpack:///./src/helpers/dom/isSelectionEmpty.ts","webpack:///./src/components/popups/reportMessagesConfirm.ts","webpack:///./src/components/popups/reportMessages.ts","webpack:///./src/components/chat/contextMenu.ts","webpack:///./src/components/chat/sendContextMenu.ts","webpack:///./src/components/popups/createPoll.ts","webpack:///./src/helpers/getGifDuration.ts","webpack:///./src/components/popups/newMedia.ts","webpack:///./src/helpers/dom/attachListNavigation.ts","webpack:///./src/components/chat/autocompleteHelper.ts","webpack:///./src/components/chat/stickersHelper.ts","webpack:///./src/components/popups/schedule.ts","webpack:///./src/helpers/dom/getRichValueWithCaret.ts","webpack:///./src/components/chat/emojiHelper.ts","webpack:///./src/components/chat/autocompletePeerHelper.ts","webpack:///./src/components/chat/commandsHelper.ts","webpack:///./src/components/chat/autocompleteHelperController.ts","webpack:///./src/components/chat/mentionsHelper.ts","webpack:///./src/components/chat/replyKeyboard.ts","webpack:///./src/components/chat/inlineHelper.ts","webpack:///./src/components/chat/input.ts","webpack:///./src/helpers/dom/setCaretAt.ts","webpack:///./src/components/chat/pinnedContainer.ts","webpack:///./src/components/chat/audio.ts","webpack:///./src/components/chat/pinnedMessageBorder.ts","webpack:///./src/components/chat/pinnedMessage.ts","webpack:///./src/helpers/dom/handleScrollSideEvent.ts","webpack:///./src/environment/groupCallSupport.ts","webpack:///./src/environment/webrtcSupport.ts","webpack:///./src/components/chat/topbar.ts","webpack:///./src/components/sidebarRight/tabs/search.ts","webpack:///./src/components/chat/search.ts","webpack:///./src/components/chat/chat.ts","webpack:///./src/components/chat/markupTooltip.ts","webpack:///./src/helpers/dom/getSelectedNodes.ts","webpack:///./src/helpers/generatePathData.ts","webpack:///./src/components/chat/dragAndDrop.ts","webpack:///./src/helpers/dom/disableTransition.ts","webpack:///./src/lib/appManagers/internalLink.ts","webpack:///./src/components/popups/joinChatInvite.ts","webpack:///./src/components/lineBlobDrawable.ts","webpack:///./src/components/topbarWeave.ts","webpack:///./src/helpers/dom/customProperties.ts","webpack:///./src/lib/rlottie/rlottieIcon.ts","webpack:///./src/components/superIcon.ts","webpack:///./src/components/groupCall/microphoneIcon.ts","webpack:///./src/components/confirmationPopup.ts","webpack:///./src/components/groupCall/participantMutedIcon.ts","webpack:///./src/components/groupCall/index.ts","webpack:///./src/components/groupCall/participantStatus.ts","webpack:///./src/components/groupCall/participantsList.ts","webpack:///./src/components/groupCall/participantVideo.ts","webpack:///./src/components/groupCall/participantVideos.ts","webpack:///./src/components/groupCall/participants.ts","webpack:///./src/components/groupCall/description.ts","webpack:///./src/components/groupCall/title.ts","webpack:///./src/components/movableElement.ts","webpack:///./src/environment/screenSharingSupport.ts","webpack:///./src/components/topbarCall.ts","webpack:///./src/lib/appManagers/appImManager.ts","webpack:///./src/components/appMediaViewerBase.ts","webpack:///./src/helpers/dom/getVisibleRect.ts","webpack:///./src/helpers/fillPropertyValue.ts","webpack:///./src/components/appMediaViewer.ts","webpack:///./src/helpers/avatarListLoader.ts","webpack:///./src/components/appMediaViewerAvatar.ts","webpack:///./src/components/avatar.ts","webpack:///./src/components/dialogsContextMenu.ts","webpack:///./src/lib/mtproto/connectionStatus.ts","webpack:///./src/components/sendingStatus.ts","webpack:///./src/components/connectionStatus.ts","webpack:///./src/helpers/roundRect.ts","webpack:///./src/components/groupCallActiveIcon.ts","webpack:///./src/helpers/easing/easeInOutSine.ts","webpack:///./src/lib/appManagers/appDialogsManager.ts","webpack:///./public/recorder.min.js","webpack:///./src/components/ripple.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/components/passwordInputField.ts"],"names":["PasswordMonkey","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","waitForFirstFrame","remove","TrackingMonkey","inputField","max","input","playAnimation","e","value","length","frame","Math","min","round","idleAnimation","stop","canvas","style","display","Promise","all","CodeInputField","options","super","plainText","type","setAttribute","autocomplete","lastLength","setLabel","replace","slice","setValueSilently","onFill","concat","Set","setInnerHTML","elem","html","innerHTML","filterChatPhotosMessages","history","message","idx","arr","action","photo","splice","undefined","count","previous","next","reverse","loadCount","loadWhenLeft","loadedAllUp","loadedAllDown","loadedAll","current","loadPromiseUp","loadPromiseDown","dispatchJump","items","item","pop","push","shift","unshift","load","onJump","older","resolve","anchor","promise","loadMore","result","forEach","bind","processed","processItem","onLoadedMore","backLimit","maxId","mid","incrementMessageId","getSearch","searchContext","peerId","limit","inputFilter","_","next_rate","nextRate","filterMids","onHistoryDelete","msgs","shouldBeDeleted","has","filter","onEmptied","onHistoryMultiappend","obj","folderId","mids","sorted","Array","from","sort","a","b","targets","map","Boolean","onMessageSent","rootScope","storage","isScheduled","getScheduledMessagesStorage","getMessagesStorage","filterMessagesByInputFilter","context","useSearch","reset","removeEventListener","name","clearable","className","clickable","autonomous","onFound","list","createChatList","nameEl","append","setListClickListener","childElementCount","setActive","clear","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","threadId","scrollable","i","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","window","setTimeout","focus","res","searchGroup","fromId","dialog","dom","addDialogNew","drawStatus","avatarSize","meAsSaved","listEl","dataset","setLastMessage","toggle","replaceContent","catch","err","console","error","placeholder","prevValue","timeout","onInput","clearTimeout","onClearClick","onClear","searchIcon","clearBtn","icon","slider","destroyable","_constructor","header","closeBtn","noRipple","title","content","addTab","listenerSetter","closeTab","args","init","selectTab","tabs","delete","removeAll","key","eventListener","dispatchEvent","cleanup","onCloseAfterTimeout","historyTabIds","canHideFirst","onCloseBtnClick","appNavigationController","findItemByType","navigationType","back","id","animate","isNavigation","closingId","onCloseTab","tab","_selectTab","Map","tabsContainer","sidebarEl","querySelector","querySelectorAll","el","get","onOpen","onOpenAfterTimeout","pushItem","onPop","canAnimate","tabConstructor","preserveTab","removeTabFromHistory","find","t","getTab","removeByType","onClose","parentElement","open","getContext","clearRect","uploadAvatar","setTitle","avatarEdit","_upload","inputWrapper","groupNameInputField","label","maxLength","nextBtn","contains","disabled","createChat","peerIds","toUserId","chatId","inputFile","editPhoto","chatsContainer","userId","rippleEnabled","lastMessageSpan","getUserStatusString","textContent","SHOULD_USE_SAFARI_FIX","navigator","userAgent","match","appMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","_volume","_muted","_playbackRate","seekBackward","details","playingMedia","currentTime","seekOffset","seekForward","duration","seekTo","seekTime","onMediaDocumentLoad","doc","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","appDownloadManager","getCacheContext","src","url","set","onPlay","target","getMessageByMedia","verify","element","listLoader","jumpLength","findIndex","go","setTargets","setMedia","getMediaFromMessage","onPause","onEnded","isTrusted","paused","clean","s","playItem","getMedia","resolveWaitingForLoadMedia","lockedSwitchers","cssText","body","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","setActionHandler","warn","properties","_key","dispatchPlaybackParams","Object","defineProperties","volume","muted","playbackRate","autoload","pFlags","is_scheduled","media_unread","myId","readMessages","once","deferred","w","waitingStorage","downloadDoc","safariBuffering","artwork","isVoice","artist","thumbs","bytes","sizes","h","preloadPhoto","setNewMediadata","peerPhoto","getPeerPhoto","appAvatarsManager","loadAvatar","cached","getPeerTitle","format","attribute","attributes","file_name","performer","metadata","MediaMetadata","getScheduledMessageByPeer","getMessageByPeer","willBePlayedMedia","prev","addMedia","setSearchContext","wasPlaying","willBePlayed","toggleSwitchers","enabled","attachGrabListeners","onStart","onMove","onEnd","onMouseMove","event","x","pageX","y","pageY","onMouseUp","onMouseDown","button","onTouchMove","preventDefault","touches","clientX","clientY","isTouch","onTouchEnd","onTouchStart","passive","mousedown","events","withTransition","useTransform","vertical","scrub","rect","getBoundingClientRect","seek","setFilled","onScrub","filled","step","setProgress","stepStr","index","indexOf","decimals","_removeListeners","percents","transform","rectMax","offsetAxisValue","bottom","left","toFixed","ButtonMenuItem","text","onClick","checkboxField","noCheckboxClickListener","ripple","textElement","regularText","keepOpen","cancelEvent","checked","buttons","ButtonMenuToggleHandler","openedMenu","asDiv","btnMenu","hideControls","showControlsTimeout","isShown","controlsLocked","canHideControls","showControls","setHideTimeout","toggleControls","show","relatedTarget","showOnLeaveToClassName","findUpClassName","visible","streamable","progressRAF","onLoadedData","r","requestAnimationFrame","cancelAnimationFrame","setLoadProgress","onTimeUpdate","onProgress","removeListeners","filledLoad","prepend","setSeekMax","setListeners","setHandlers","scrubTime","isSafariBuffering","buf","buffered","numRanges","nearestStart","end","start","onMuteClick","setVolume","d","volumeSvg","btn","firstElementChild","video","wrapper","setup","parentNode","insertBefore","appendChild","skin","stylePlayer","controls","progress","finally","initDuration","buildControls","timeDuration","insertAdjacentHTML","fullScreenButton","timeElapsed","String","toHHMMSS","volumeSelector","leftControls","togglePlay","overlaysActive","code","good","toggleFullScreen","altKey","onFullScreen","rate","settingsButton","player","webkitEnterFullscreen","enterFullscreen","isFull","throttleWithRaf","fn","schedulerFn","waiting","_args","throttleWith","wrapVoiceMessage","audioEl","out","barHeightMax","mediaSizes","isMobile","minW","maxW","availW","svg","createElementNS","setAttributeNS","timeDiv","waveform","Uint8Array","valueCount","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","rects","children","audio","lastIndex","ceil","node","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","offsetX","MouseEvent","targetTouches","noop","constructDownloadPreloader","tryAgainOnFail","preloader","cancelable","construct","circle","totalLength","attr","findMediaTargets","isBubbles","justAudioSelector","selectors","matches","prefix","selector","join","elements","mediaItems","toPeerId","HTMLElement","withTime","voiceAsMusic","showSender","isRealVoice","isOutgoing","is_outgoing","uploading","durationStr","downloadDiv","onTypeLoad","descriptionEl","parts","audioPerformer","htmlToSpan","date","wrapSenderToPeer","titleEl","middleEllipsisEl","fontWeight","audioTitle","fileName","wrapSentTime","subtitleDiv","launched","progressLine","lastChild","replaceWith","wrapAudio","audioTimeDiv","onLoad","readyState","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","innerText","hadSearchContext","imgs","wrapped","wrapPhoto","boxWidth","boxHeight","loadPromises","withoutPreloader","lazyLoadQueue","images","thumb","full","img","attach","noAutoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","reject","playListener","download","setDownloadFunction","capture","isConnected","customElements","define","DivAndCaption","fill","border","subtitle","wrapReplyDivAndCaption","subtitleEl","mediaEl","wrapEmojiText","isRound","mediaChildren","middleware","wrapMessageForReply","webpage","chat","bubbles","getMiddleware","wrapSticker","div","group","CHAT_ANIMATION_GROUP","choosePhotoSize","noBlur","child","isMediaSet","RectPart","maxWidth","minWidth","spacing","maxHeight","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","sides","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","ratio","cropRatios","attempts","multiHeight","offset","sum","pushAttempt","lineCounts","heights","first","second","third","fourth","optimalAttempt","optimalDiff","attempt","counts","lineCount","totalHeight","minLineHeight","bad1","bad2","line","diff","abs","optimalCounts","optimalHeights","rowCount","row","colCount","lineHeight","col","_disabled","isChanged","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","toggleAttribute","withoutAvatar","avatarElem","doNotEditAvatar","unlockOnSuccess","RadioForm","radios","form","freezed","radioField","subtitleLangKey","subtitleLangArgs","havePadding","isToggle","titleRight","noCheckboxSubtitle","titleLangKey","c","navigationTab","RadioFormFromRows","rows","copyTextToClipboard","clipboard","writeText","textArea","top","position","select","execCommand","removeChild","fallbackCopyTextToClipboard","stateKey","appStateManager","getState","state","setByKey","main","langKey","Event","toastEl","toast","toastNew","langPackKey","debounce","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","_resolve","_reject","checkUsernameDebounced","checkUsername","getValue","originalValue","setState","Neutral","isUsernameValid","setError","invalidText","head","username","checkUsernamePromise","invokeApi","channel","getChannelInput","toChatId","available","Valid","availableText","takenText","isValidToChange","overlayClosable","avatarEl","noTitle","titleLangArgs","fragment","createDocumentFragment","descriptionLangKey","description","p","descriptionLangArgs","checkboxes","o","withRipple","callback","original","nextElementSibling","isBroadcast","section","random","privateRow","publicRow","privateSection","publicSection","getChat","linkRow","chatFull","exported_invite","link","btnRevoke","toggleDisability","getChatInviteLink","caption","noDelimiter","changed","linkInputField","applyBtn","migrateChat","channelId","updateUsername","close","setOriginalValue","loading","loaded","getPromise","checkForTriggers","selected","offsetIndex","loadedWhat","renderedPeerIds","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","includes","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","splitUp","notRendered","filterPeerTypeBy","isPeerId","getPeer","deleted","method","topContainer","selectedContainer","selectedScrollable","delimiter","li","click","findUpAttribute","checkbox","debouncedInput","appendTo","getResultsPromise","onFirstRender","testSelfSearch","dialogs","archived","pageCount","windowSize","tempId","getTempId","getConversations","newOffsetIndex","findAndSplice","chatRightsAction","filterByRights","renderSaved","isEnd","getMoreDialogs","contacts","getMoreContacts","isUser","canSendToUser","hasRights","isGlobalSearch","getContactsPeerIds","searchContacts","searchResult","resultPeerIds","my_results","results","channelParticipants","getChannelParticipants","q","participants","participant","getParticipantPeerId","promises","getMoreChannelParticipants","isNonContactUser","containerEl","isAnyChat","getChatMembersString","scroll","insertAdjacentElement","scrollIntoViewNew","offsetWidth","onAnimationEnd","settings","animationsEnabled","values","Static","closable","getSelected","onSelect","hide","peerTypes","destroyListener","new","rights","takeOut","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","btnDelete","kickFromChannel","v","flags","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","combineParticipantBannedRights","info","mainFlag","restriction","until_date","flag","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","generateContentElement","findUpTag","setSubtitle","bannedRights","cantWhat","getPeerId","peer","update","needAdd","new_participant","view_messages","user_id","prev_participant","exceptionsCount","setLength","loader","setLoader","isChannel","migrateFrom","migrateTo","onScroll","getDialogType","peerTitleElement","callbackLeave","flush","leave","flushHistory","callbackDelete","descriptionArgs","deleteChannel","isDanger","textArgs","getChatFull","chatUpdateListeners","addChatUpdateListener","chatNameInputField","descriptionInputField","about","editPeer","chatTypeRow","setChatTypeSubtitle","permissionsRow","setPermissionsLength","reduce","acc","editTitle","editAbout","race","removeAttribute","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","onChatUpdate","hidden_prehistory","_init","isNew","isContact","nameInputField","lastNameInputField","user","getUser","setDraftValue","first_name","last_name","notificationsCheckboxField","mutePeer","isMuted","notify_settings","profileNameDiv","profileSubtitleDiv","phoneRow","phone","formatUserPhone","notificationsRow","isPeerLocalMuted","addContact","deleteContacts","sel","skippable","attachToPromise","removeLoader","ret","isPrivacy","selectedPeerIds","addInitial","generateVerifiedIcon","use","use2","getEvent","attachGlobalListenerTo","RESET_GLOBAL","cursor","listenerOptions","hadMove","xDown","yDown","handleMove","setCursorTo","onReset","handleStart","_e","verifyTouchTarget","xUp","yUp","xDiff","yDiff","setProperty","onFirstSwipe","onSwipeResult","onSwipe","loadCallbacks","photoId","avatar","BASE_CLASS","getPhoto","Image","draggable","loadCallback","putAvatar","avatars","intersectionObserver","observe","gradient","arrowPrevious","arrowNext","checkScrollTop","scrollTop","freeze","clickX","prevTargets","nextTargets","openAvatarViewer","toRight","right","distance","offsetLeft","cancelNextClick","lastDiffX","minX","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","IntersectionObserver","entries","entry","isIntersecting","loadNearestToTarget","getUserPhotos","photos","Number","MAX_SAFE_INTEGER","m","chat_photo","generateFakeAvatarMessage","activeTab","photo_id","unobserve","setText","setPeerStatus","needClear","bio","tagName","getProfileByPeerId","notifications","generateDelimiter","setBio","self","setPeerStatusInterval","setInterval","setBioTimeout","oldAvatars","setPeer","cleaned","cleanupHTML","setAvatar","getPeerUsername","verified","override","getProfile","userFull","rAbout","wrapRichText","canSetNext","historiesStorage","newCloseBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","editBtn","transitionLastItem","secondTitle","cloneNode","profile","onAdditionalScroll","searchSuper","nav","isSharedMedia","transition","cleanScrollPositions","isHeavyAnimationInProgress","toggleEditBtn","msgIdsByPeer","renderNewMessages","deleteDeletedMessages","mediaTabs","onChangeTab","mediaTab","btnAddMembers","showConfirmation","onError","inviteToChannel","addChatUser","filtered","filterMessagesByType","usedFromHistory","performSearchResult","selection","isSelecting","toggleByElement","canViewMembers","loadMutex","peerChanged","setQuery","historyStorage","fillProfileElements","single","justLoad","getElementById","isColumnProportionSet","to","medium","mobile","toggleSidebar","setColumnProportion","sharedMediaTab","proportion","scrollWidth","previousElementSibling","documentElement","enable","active","willChange","animationPromise","appSidebarRight","resultsDiv","poll","getPoll","quiz","rQuestion","voters","total_voters","roundPercents","hr","answer","answers","answerEl","answerTitle","answerPercents","minHeight","getVotes","option","votesList","votes","vote","showMore","lastElementChild","next_offset","down","lineTotalLength","minIndex","minRemainder","k","remainder","maxRemainder","pollElement","isClosed","closed","performResults","chosenIndexes","prevQuizHint","hideQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","setMaxLength","resizePolls","onHide","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","getTotalLength","pollId","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","strokeWidth","radius","circumference","PI","period","closeTime","serverTimeOffset","quizInterval","time","Date","now","timeLeft","color","stroke","strokeDashoffset","strokeDasharray","clearInterval","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","isTabExists","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","solution","solution_entities","toggleHint","textEl","entities","bubblesContainer","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","initQuizHint","timeEl","setResults","recent_voters","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","cb","getPercentValue","iterate","fullTime","times","votersCount","multiplier","getStickerSetPromises","getStickersByEmoticonsPromises","getAnimatedEmojiStickerSet","addMultipleEventsListeners","updateNewStickerSet","saveStickerSet","stickerset","getGreetingStickersTimeout","getGreetingSticker","justPreload","getGreetingStickersPromise","getStickersByEmoticon","docs","greetingStickers","saveDoc","params","overwrite","cachedSet","documents","refreshTime","useCache","saveStickers","stickerSet","getStickerSetInput","saveById","getStickerSet","invokeApiHashable","stickers","emoji","getFromCache","pack","packs","emoticon","getAnimatedEmojiSticker","json","mediaSize","emojiSticker","toneIndex","lottieLoader","loadAnimationWorker","animationData","saveLottiePreview","newSet","assign","setToCache","needSave","installed_date","dcId","thumb_dc_id","isAnimated","animated","location","thumb_version","mimeType","access_hash","short_name","sets","covered","excludeFeatured","exclude_featured","foundSaved","cache","getCache","toLowerCase","cover","getAllStickers","allStickers","includeOurStickers","fixEmoji","preloadStickerSets","getRecentStickers","messagesStickers","installedSets","recentStickers","foundStickers","sticker","cachedStickersAnimated","cachedStickersStatic","iteratePacks","docEmoticon","stickerEmojiRaw","_doc","appStickersManager","roundVideoCircumference","wrapVideo","withTail","isOut","noInfo","onlyPreview","noPlayButton","isAlbumItem","canAutoplay","autoPlay","gifs","videos","spanTime","spanPlay","needPlayButton","mime_type","photoRes","divRound","halfSize","ctx","globalVideo","setPeerPromise","isInDOM","onPaused","onFrame","drawImage","detached","foreignObject","getAttributeNS","gotThumb","getThumb","poster","aspecter","isUpload","downloaded","attachMethod","renderDeferred","detach","isFulfilled","animationIntersector","addAnimation","loadPhotoThumbFunc","loadFunc","setManual","queueId","renderImageFromUrl","render","wrapDocument","audioElement","extSplitted","split","ext","isArray","docDiv","icoDiv","descriptionParts","nameDiv","_downloadDiv","save","saveDocFile","downloading","noThumb","noFadeIn","blurAfter","setAttachmentSize","regular","thumbImage","image","isFit","loadThumbPromise","isGif","photoSize","getStrippedThumbIfNeeded","needFadeIn","renderOnLoad","renderImageWithFadeIn","canAttachPreloader","renderPromise","sequentialDom","mutateElement","mutate","onlyThumb","withThumb","stickerType","loadLottieWorkers","haveThumbCached","stickerCachedThumbs","afterRender","getPathFromPhotoPathSize","stickerThumbConverted","getPreviewURLFromThumb","webpWorkerController","convert","getThumbURL","getAnimation","restart","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","needUpscale","blob","URL","createObjectURL","wrapReply","replyContainer","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","wrapAlbum","groupId","attachmentDiv","getMidsByAlbum","getMessage","album","positionElementByIndex","pos","prevPos","whichChild","updateElementWith","updateListWith","onSort","canUpdate","_updateList","batch","updateBatch","base","onElementCreate","noScheduler","onDelete","getIndex","onUpdate","getUserStatusForSort","onListLengthChange","status","willChangeLength","createChatListOptions","doTimeout","updateList","SORT_INTERVAL","handleHorizontalSwipe","cancelY","isSwipingBackSafari","handleTabSwipe","peerIdMids","overrideOnSelect","setInnerPeer","initMessagesForward","onConfirm","revoke","deleteScheduledMessages","deleteMessages","titleArgs","isMegagroup","canRevoke","sendScheduledMessages","cancelSelection","getSelection","empty","removeAllRanges","accumulateMapSet","selectedMids","onCancelSelection","toggleSelection","listenElement","selectedText","toString","createRange","verifyTouchLongPress","getElementFromTarget","getElementsBetween","last","firstRect","lastRect","isHigher","parent","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","targetLookupClassName","verifyTarget","seen","selecting","firstTarget","processElement","checkBetween","seenSet","isSelected","isMidSelected","seenLength","findUpAsChild","elementsBetween","toggleByMid","canceledSelection","verifyMouseMoveTarget","removeManual","documentListenerOptions","hasCheckbox","getCheckboxInputFromElement","isElementShouldBeSelected","appendCheckbox","forceSelection","cantForward","cantDelete","cantSend","appMessagesManager","getMessageFromStorage","canDeleteMessage","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","forwards","onToggleSelection","updateContainer","toggleElementCheckbox","unselect","config","forwarded_count_max","toggleMid","updateElementSelection","contentTab","selectionCountEl","selectionGotoBtn","selectionForwardBtn","selectionDeleteBtn","navScrollableContainer","selectionContainer","btnCancel","attachClickOptions","keys","fromPeerId","isPrivate","transitionElement","opacity","recording","bubble","canSelectBubble","isGroupedBubbleSelected","getMidsByMid","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","borderRadius","rowsWrapper","fakeSelectionWrapper","fakeRowsWrapper","fakeSelectionRect","fakeRowsRect","widthFrom","widthTo","scale","initTranslateX","br","selectionInputWrapper","selectionSendNowBtn","isGrouped","groupedCheckboxInput","attachTo","onGotoClick","onForwardClick","onSelectClick","onClearSelectionClick","onDeleteClick","onContextMenu","cancelBubble","withSelection","prevTabId","urlsToRevoke","nextRates","loadedChats","firstLoad","log","logger","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","onTransitionStart","onTransitionEnd","searchContextMenu","navScrollable","tabsMenu","menuTab","span","unlockScroll","prevId","lockers","lockTouchScroll","searchGroupMedia","horizontalMenu","tabContent","skipScroll","newMediaTab","fromMediaTab","offsetTop","scrollHeight","rect2","onMediaClick","targetClassName","copySearchContext","openMedia","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","lock","unlockAndRefresh","elemsToAppend","sharedMediaDiv","entity","totalEntities","display_url","sliced","matchUrl","same","hostname","rDescription","previewDiv","getAbbreviation","rTitle","subtitleFragment","htmlToDocumentFragment","HTMLAnchorElement","decodeURIComponent","href","firstChild","wrapPlainText","monthContainer","getMonthContainerByTimestamp","afterPerforming","inputMessagesFilterEmpty","showMembersCount","participants_count","regExp","RegExp","cleanSearchText","titleSpan","formatPhoneNumber","formatted","arg","globalContacts","isShort","minDate","renderRecentSearch","recent","recentSearch","getTopPeers","peers","people","onlyFirstName","renderParticipants","membersList","LOAD_COUNT","loadMembers","loadChats","logStr","used","slicedLength","ids","filters","counters","getSearchCounters","firstMediaTab","counter","membersTab","toLoad","loadType","timestamp","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","IntlDateElement","haveTimestamps","goFirst","revokeObjectURL","newInputFilter","maxDate","PrivacyType","appPrivacyManager","privacy","updatePrivacy","rules","inputKey","privacyRules","saveApiUsers","users","saveApiChats","chats","apiUpdatesManager","processLocalUpdate","inputRule","rule","privacyKey","types","allowPeers","disallowPeers","onRadioChange","captions","captionElement","radioSection","exceptions","Everybody","Nobody","radioRows","Contacts","skipTypes","noExceptions","generateSection","exceptionTexts","exception","_peerIds","newPeerIds","generateStr","splitPeersByType","getPrivacy","getPrivacyRulesDetails","setRadio","chatKey","usersKey","splitted","getUserInput","setPrivacy","phoneSection","nextSibling","stickerContainer","inputContent","btnReturn","sliceTabsUntilTab","canFocus","isFirstInput","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","disable","cancelPasswordEmail","resendPasswordEmail","onContinueClick","btnContinue","btnSkip","matchEmail","toggleButtons","updateSettings","hint","currentPassword","plainPassword","newPassword","symbols","isCancel","onSkipClick","saveHint","monkey","verifyInput","has_password","labelText","IntlElement","getStateInterval","_state","check","auth","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","Session","app_name","app_version","ip","country","date_active","date_created","hash","midtitle","device_model","system_version","platform","authorizations","session","btnTerminate","otherSection","privacyTab","updateActiveSessions","onTerminateClick","menuElement","btnAdd","toggleBlock","bot","blocked","getBlocked","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRow","email_unconfirmed_pattern","activeSessionsRow","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","updatePrivacyRow","disallowLength","allowLength","sensitive_can_change","sensitive_enabled","sensitiveRow","_enabled","deleteButton","clearAllDrafts","auths","rgbaToHsla","g","l","hslaToRgba","hue2rgb","hexaToRgba","hexa","parseInt","rgbaToHexa","rgba","hslaStringToHexa","hsla","alpha","val","endsWith","hslaStringToRgba","highlightningColor","hue","saturation","lightness","onGrabStart","boxDragger","onGrabEnd","box","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","hexaToHsla","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","rgbaArray","hex","hsl","getCurrentColor","maxX","maxY","posX","posY","lightnessX","lightnessY","_applyColor","updateColorPicker","colorPicker","background","theme","pushToState","applyCurrentTheme","onColorChange","applyColor","getTheme","grid","backgroundColor","throttle","uploadTempId","clicked","onUploadClick","file","dc_id","file_reference","wallpaper","slug","upload","addNotifyListener","_wallpaper","newDoc","newCacheContext","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","themes","blurCheckboxField","blur","onGridClick","saveToCache","fetch","response","cacheStorage","_tempId","onReady","imageUrl","naturalWidth","naturalHeight","pixel","pixels","getImageData","data","pixelsLength","outPixel","Uint8ClampedArray","averageColor","uploadButton","colorButton","resetButton","accountWallpapers","wallpapers","pattern","stickerSetInput","onStickersClick","fileId","sendMessageWithDocument","h6","setOnlyOnePlayableGroup","stickersDiv","stickersFooter","loadStickerSet","toggleStickerSet","esgSticker","initialValue","minValue","valueDiv","range","messagesTextSize","chatBackgroundButton","animationsCheckboxField","enterRow","ctrlEnterRow","formats","runFirst","_callback","run","getSeconds","eachMinute","str","toLocaleTimeString","hour","minute","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","gifsCheckboxField","videosCheckboxField","suggestCheckboxField","bigCheckboxField","loopCheckboxField","stickerSets","renderStickerSet","assumeType","firstNameInputField","bioInputField","usernameInputField","setProfileUrl","profileUrlContainer","profileUrlAnchor","updateProfile","uploadProfilePhoto","getSelf","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","cmp","pinnedPeerIds","pinned_peers","other","otherLegacy","getInputPeerById","editFolderTab","setFilter","filtersStorage","getDialogFilters","dialogsStorage","getFolderDialogs","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","non_contacts","groups","broadcasts","bots","chatsSection","selectedPeers","includePeerIds","excludePeerIds","addedInitial","_add","hasOwnProperty","originalFilter","deleteFolderButton","updateDialogFilter","bool","menuBtn","generateList","h2Text","categories","includedFlagsContainer","excludedFlagsContainer","include","include_peers","createDialogFilter","editCheckForChange","loadAnimationPromise","wrapDraftText","ul","renderMore","_length","firstTime","onEditOpen","exclude_peers","onCreateOpen","filtersRendered","dialogFilter","folder","channels","isAnyGroup","filterId","getFilter","orderIndex","createFolderBtn","foldersSection","suggestedSection","onFiltersContainerUpdate","renderFolder","getSuggestedFilters","order","suggestedFilters","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","show_previews","mute","showPreviews","inputSettings","mute_until","updateNotifySettings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","invokeApiCacheable","lang_pack","languages","language","lang_code","native_name","getLangPack","getCacheLangPack","langPack","logOut","phoneDiv","buttonsDiv","edit","folders","general","fillElements","channelNameInputField","channelDescriptionInputField","onLengthChange","createChannel","withConfirm","btnConfirm","importContact","telInputField","lockWithPromise","validate","country_code","inputSearch","openContacts","sortedUserList","createList","renderPage","sortedLists","chatList","generateScrollable","scrollables","wasFilterId","setFilterId","onTabChange","fakeGradientDelimiter","appSidebarLeft","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","menuButtons","openUsername","sessionStorage","kz_version","isMainDomain","toolsBtn","btnMenuFooter","rel","stopPropagation","suffix","versionFull","newBtnMenu","initSearch","archivedCount","unreadDialogsCount","requestPeer","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","getAttribute","peopleContainer","hideNewBtnMenuTimeout","onFocus","clearRecentSearchBtn","detailsMap","newGroupDiff","updateGroup","viaBotId","fwdFromId","removeBubble","insertObject","foundBubble","foundAtIndex","foundMidOnSameTimestamp","_timestamp","_mid","bubbleGroup","insertIndex","initDate","onPick","noButtons","selectedDate","onPrevClick","selectedMonth","setMonth","getMonth","minMonth","prevBtn","onNextClick","maxMonth","onDateClick","selectedEl","setTimeTitle","setFullYear","getDate","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","number","setMinutes","getMinutes","getHours","popupCenterer","timeOptions","sendDate","dateOptions","day","weekday","firstDate","weekStartDate","getDay","renderElement","dayIndex","clonedDate","showOverflowMonths","lines","StickyIntersector","handler","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","root","elementsObserver","sentinel","headerSentinel","addSentinel","disconnect","updated","postKey","replies","leftPart","recent_repliers","getHistoryStorage","channel_id","isUnread","read_max_id","max_id","readMaxId","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","MessageRender","setTime","bubbleContainer","messageDiv","editedSpan","views","postAuthor","post_author","fwd_from","postViewsSpan","channelViews","edit_date","edit_hide","pinned","timeSpan","inner","clonedArgs","renderReplies","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","reply_to_mid","replyToPeerId","reply_to","reply_to_peer_id","appPeersManager","originalPeerTitle","originalMessage","wrapSingleMessage","needUpdate","replyMid","getElementByPoint","verticalSide","horizontalSide","floor","elementFromPoint","reflowScrollableElement","EMOJI_LANG_PACK","keywords","version","langCode","langPackCode","keywordLangPacks","indexedLangPacks","getKeywordsPromises","storageKey","stateStorage","from_version","keywordsDifference","packKeywords","keyword","emoticons","getEmojiKeywords","lastRequestedLangCode","getRecentEmojis","indexObject","emojis","indexEmojis","search","POPULAR_EMOJI","getRecentEmojisPromise","recentEmoji","appEmojiManager","loadedURLs","appendEmoji","unify","spanEmoji","kek","wrapSingleEmoji","getEmojiFromElement","nodeType","nodeValue","closeScrollTop","onContentClick","onEmojiSelected","divs","Emoji","category","titleDiv","itemsDiv","unified","menu","emojiScroll","hasRecent","activeId","menuOnClick","stickyIntersector","setMenuActive","recentItemsDiv","observeStickyHeaderChanges","scrollPromise","processInvisibleDiv","intersector","isVisible","getAnimations","checkAnimation","processVisibleDiv","gifWidth","gifHeight","willUseWidth","calcImageInBox","gifsContainer","masonry","EMOTICONSSTICKERGROUP","addLazyLoadQueueRepeat","regularLazyLoadQueue","animatedDivs","checkAnimationContainer","renderSticker","observeAnimatedDiv","queueCategoryPush","categoryDiv","categoryTitle","superStickerRenderer","recentDiv","categoryPush","menuWrapper","menuScroll","setTyping","pushRecentSticker","inlineResults","setHash","geo","lat","long","accuracy_radius","botId","geo_point","getGeoInput","stopTime","noErrorBox","botResults","queryId","query_id","savePhoto","generateQId","resultId","topPeers","botPeerId","topPeer","rating","setKeyValueToStorage","startParam","startBot","bot_inline_placeholder","peerData","setDraft","msg_id","getServerMessageId","callbackAnswer","noLinks","noLinebreaks","queryAndResultIds","inlineResult","pushPopularBot","queryID","resultID","send_message","reply_markup","replyMarkup","sendText","inputMedia","sendMessage","getMediaInput","geoPoint","address","provider","venue_id","venue_type","phone_number","vcard","percent","sendOther","appInlineBotsManager","nextOffset","onGifsClick","gifsDiv","checkAnimations","newSearch","gifBotPeerId","resolveUsername","getInlineResults","setsDiv","countDiv","stickerDiv","renderFeatured","getFeaturedStickers","coveredSets","filterRendered","renderSet","searchStickerSets","forceClose","inited","onMouseOut","displayTimeout","isActive","toElement","willBeActive","onmouseout","onmouseover","tabId","onSelectTabClick","searchButton","deleteBtn","checkRights","tabsEl","tabsElements","canSendStickers","canSendToPeer","canSendGifs","chatInput","savedRange","getGoodRange","lockIntersectionGroup","unlockIntersectionGroup","unlock","refresh","emojiTab","stickersTab","gifsTab","0","1","2","messageInput","HIDE_EMOJI_TAB","INIT_TAB_ID","getVisible","clearVisible","rangeCount","activeElement","getRangeAt","jumpedTo","stuck","which","scrollLeft","clearDraft","emoticonsDropdown","IGNORE_ACTIONS","TEST_SCROLL","appUsersManager","appPhotosManager","appProfileManager","appDraftsManager","appMessagesIdsManager","unreadOut","skippedMids","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","loadedTopTimes","loadedBottomTimes","messagesQueuePromise","messagesQueue","messagesQueueOnRender","messagesQueueOnRenderAdditional","firstUnreadBubble","replyFollowHistory","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","onBubblesClick","chatInner","onDatePick","contactDiv","appImManager","bubbleMid","reply_to_top_id","lastMsgId","saved_from_msg_id","openThread","filterMessages","getDiscussionMessage","via","peerIdStr","savedFrom","messageId","documentDiv","SINGLE_MEDIA_CLASSNAME","isSingleMedia","isMediaCompatibleForDocumentViewer","parents","hasAspecter","albumItem","getMidsByMessage","isReplyClick","replyToMid","reply_to_msg_id","getDistanceToEnd","topbar","pinnedMessage","setCorrectIndex","lastScrollDirection","requestHistory","setMessageId","setScroll","bubbleGroups","changeBubbleMid","setBubblePosition","scrollingToBubble","scrollToBubbleEnd","deleteMessagesByIds","tempMessage","repliesElement","grouped_id","newPoll","safeRenderMessage","scrollToBubbleIfLast","getGroupedBubble","updatePosition","deleteEmptyDateGroups","deletedMids","renderedId","renderMaxId","groupedMessagesStorage","MAX","replyAfter","shouldReply","_target","initMessageReply","highlightBubble","dateMessage","renderNewMessagesByIds","msgIds","setUnreadCount","updateUnreadByDialog","finishPeerChange","updateMessageInput","isScrolledDown","setMessagesQueuePromise","performHistoryResult","postViewsElements","different","postViews","unreadedObserver","onUnreadedInViewport","viewsObserver","sendViewCountersDebounced","incrementMessageViews","wasHeight","offsetHeight","resizing","skip","scrolled","part","rAF","onResizeEnd","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","readUnreaded","readPromise","idle","focusPromise","bubblesMaxId","readContents","isMentionUnread","readHistory","bad","getHistoryTopPromise","getHistoryBottomPromise","getHistory","setLoaded","onScrolledTop","loadMoreHistory","readOutboxMaxId","msgId","permanent","emptyPlaceholderMid","deleteSelectedMids","replyTo","getLastBubble","setPaddingTo","isPaddingNeeded","clientHeight","paddingTop","lastDateGroup","getLastDateGroup","forceDirection","forceDuration","dateGroup","isChangingHeight","scrollToBubble","lastElem","lastTime","firstTimestamp","datasetKey","today","bubbleContent","serviceMsg","bubblesToo","attachedUnreadBubble","fetchNewPromise","onAnimateLadder","resolveLadderAnimation","samePeer","chatType","topMessage","pinnedMessages","isTarget","savedPosition","getChatSavedPosition","getReadMaxIdIfUnread","isJump","apiManager","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","getBubbleByPoint","oldChatInner","lockGroup","lastScrollTop","unlockGroup","fromUp","followingUnread","mountedByLastMsgId","findNextMountedBubbleByMsgId","afterSetPromise","needFetchInterval","isFetchIntervalNeeded","getNewHistory","isBottomEnd","Bottom","onScrolledAllDown","getDialogOnly","unread_mark","markDialogUnread","canWrite","queue","setUnreadDelimiter","getDateContainerByMessage","addBubble","multipleRender","albumMustBeRenderedFull","our","contentWrapper","wasClassNames","classNames","transitionDelay","originalMid","unread","chat_id","wrapMessageActionTextNew","renderMessagesQueue","is_single","messageMessage","messageMedia","getAlbumText","richText","canHaveTail","isStandaloneMedia","needToSetHTML","emojiEntities","strLength","curr","big","forward","containerDiv","rowDiv","buttonEl","same_peer","checkSwitchReturn","switchInlineQuery","column","callbackButtonClick","messageWithReplies","getMessageWithReplies","withReplies","nameContainer","processingWebPage","noAutoDownloadMedia","previewResizer","preview","quote","quoteTextDiv","site_name","textDiv","isSquare","animatedSticker","staticSticker","newNameContainer","wrapGroupedDocuments","lastContainer","texts","wrapPoll","needName","titleVia","isForwardFromChannel","from_id","isHidden","from_name","getPeerColorById","goto","generateTail","renderMessage","isBackLimit","previousScrollHeightMinusTop","needReflowScroll","processLocalMessageRender","firstSlice","lastSlice","Top","newScrollTop","getScheduledMessages","additionMsgIds","isAdditionRender","animateAsLadder","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","delay","lastMsDelay","topRes","middleRes","bottomRes","delays","listElements","creator","renderEmptyPlaceholder","service","generateMessageId","peer_id","getOutputPeer","saveMessages","side","checkPlaceholders","bot_info","checkIfEmptyPlaceholderNeeded","generateLocalFirstMessage","getRenderedLength","realLoadCount","Both","resultPromise","isFirstMessageRender","processResult","historyResult","serviceStartMessageId","threadsServiceMessagesIdsStorage","sup","processPromise","waitPromise","safeCount","mustBeCount","unpin","canUnpin","canPinMessage","oneSide","silent","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","reason","reportMessages","STICKER_EMOJI","preloadStickerPromise","preloadAnimatedEmojiSticker","margin","buttonsEl","marginTop","appPollsManager","appDocsManager","onSendScheduledClick","onReplyClick","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","threadMessage","channel_post","onPinClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","isTargetAGroupedItem","isSelectable","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","groupedItem","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","hasTarget","isGoodType","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","onSubmitClick","send","radioLabel","isEmpty","isInputEmpty","questions","appendMoreField","correctAnswers","optionInputFields","labelOptions","weakMap","questionInputField","sendSilent","setPeerId","dd","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","onEscape","getFilledAnswers","HTMLInputElement","getRichValue","question","quizSolution","force","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","replyToMsgId","helperType","clearHelper","questionField","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","files","willAttachType","confirmShortcutIsSendShortcut","onKeyDown","placeCaretAtEnd","attachFile","willAttach","shouldCompress","itemDiv","attachMedia","attachDocument","sendFileDetails","mediaContainer","caption_length_max","wasInputValue","messageInputField","attachFiles","groupCheckboxField","mediaCheckboxField","toPush","_file","lastModified","isMedia","sendAlbum","startsWith","source","objectURL","videoWidth","videoHeight","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onload","isPhoto","isAudio","finish","onerror","foundPhotos","foundVideos","foundFiles","n","firstType","appendGroupCheckboxField","appendMediaCheckboxField","albumContainer","appendMediaToContainer","onRender","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","keyNames","getCurrentTarget","setCurrentTarget","scrollTo","hadTarget","fastSmoothScroll","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","property","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","resetTarget","_onKeyDown","hidden","onVisible","listType","navigationItem","noBlurOnPop","removeItem","attachNavigation","controller","addHelper","fromController","hideOtherHelpers","onChangeScreen","ready","getMinDate","getMaxDate","canSendWhenOnline","btnSendWhenOnline","getRichValueWithCaret","field","withEntities","selNode","selOffset","startOffset","startContainer","endContainer","endOffset","possibleChildrenFocusOffset","childNodes","alt","getRichElementValue","caretPos","substr","combineSameEntities","firstChar","getBothEmojiKeywords","searchEmojis","listElement","BASE","BASE_CLASS_LIST_ELEMENT","getReadyToSend","botInfos","ignoreCase","commands","botInfo","botCommand","command","found","helpers","preserveHelper","insertAtCaret","topMsgId","trimmed","getMentions","onBodyTouchStart","btnHover","attachButtonListener","checkAvailability","checkForceReply","touchListener","getReplyMarkup","sendInlineResult","_checkQuery","gifsMasonry","isGallery","gallery","noCommands","separator","dataURL","switch_pm","btnSwitchToPM","switchToPM","start_param","checkQuery","appChatsManager","appWebPagesManager","serverTimeManager","appNotificationsManager","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","setKeepAlive","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","shiftKey","onMessageInput","richValue","markdownEntities","parseMarkdown","mergeEntities","parseEntities","urlEntities","getWebPagePromise","saveWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","getEmojiEntityFromEmoji","onBtnSendClick","forwarding","releaseMediaPlayback","setSingleMedia","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","recordTimeEl","needReturn","onHelperClick","forwardElements","inputContainer","tail","goDownBtn","onGoDownClick","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","attachMenuButtons","fileInput","accept","attachMenu","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","onFakeInput","draft","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","touchMouseDown","onstop","ondataavailable","typedArray","dataBlob","Blob","decode","sendFile","isVoiceMessage","pinnedControlBtn","fakeContainer","fakePinnedControlBtn","originalChat","pinnedMessageContainer","unread_count","hasMentions","unread_mentions_count","no_webpage","syncDraft","helperToo","clearInput","fromUpdate","getDraft","rMessage","setInputValue","inputFake","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","isSendShortcutPressed","ctrlKey","metaKey","setStart","collapse","addRange","readAllHistory","commandsMap","bold","italic","underline","strikethrough","monospace","saveExecuted","executed","haveThisType","isCollapsed","tag","commonAncestorContainer","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","AUTO_COMPLETE_REG_EXP","matchIndex","newValue","hadEntities","insertLength","addEntities","caretEntity","insertCaretAtIndex","caret","originalNode","previousSibling","newNode","createTextNode","setStartAfter","insertNode","setCaretAt","_value","foundHelper","suggest","checkEmoticon","checkInlineAutocomplete","needPlaceholder","inlineMatch","btnPreloader","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","clearReply","unicode","pushRecentEmoji","webPage","forwardMessages","dropAuthor","dropCaptions","isDroppingCaptions","hideCaptionCheckboxField","replyFragment","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","usingFullAlbum","albumMids","newReply","intl","peerTitleEl","_message","callerFunc","replyParent","oldReply","haveReply","floating","divAndCaption","CLASSNAME_BASE","btnClose","wrapperUtils","attachOnCloseEvent","needClose","isFloating","setFloating","setUtilsWidth","prevEl","nextEl","attachClick","toggleEl","volumeProgressLineContainer","tunnel","progressWrapper","BAR_HEIGHTS","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","path","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","defs","mark","AnimatedSuper","animateFirst","currentIndex","clearRow","DURATION","reflow","clearRows","previousIndex","fromTop","ignorePrevious","setNewRow","previousRow","AnimatedCounter","previousNumber","animatedSuper","decimal","previousDecimalNumber","getRow","EMPTY_INDEX","previousByDecimal","decimalNumber","getDecimal","hideLeft","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","locked","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","debug","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","lastY","isDown","deltaY","handleScrollSideEvent","refreshPosition","setScrollDownListener","handleFollowingPinnedMessage","isLast","setCount","writeTo","writeMediaTo","appGroupCallsManager","verifyButtons","isMenuOpen","btnMore","getDeleteButtonText","buttonsToVerify","verifyVideoChatButton","currentGroupCall","groupCall","getChatTyped","call_active","onJoinGroupCallClick","joinGroupCall","onResize","resize","setUtilsRAF","chatUtils","chatAudio","btnBack","chatInfoContainer","chatInfo","person","avatarElement","btnJoin","btnPinned","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","followPinnedMessage","getSearchContext","activeScreen","onBtnBackClick","isFirstChat","getChannelFull","channelFull","linked_chat_id","getCachedFullChat","chatContextMenuHintWasShown","contactPeerId","getContactMediaInput","getCachedFullUser","attachClickEvent","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","byCurrent","destroy","wasPeerId","newPinnedMessage","appSearch","beginSearch","btnPickDate","selectedIndex","selectResult","upBtn","downBtn","foundCountEl","renderedCount","onResultsClick","onFooterClick","onUpClick","onDownClick","footer","dateBtn","wasAlreadyUsed","backgroundEl","Log","Warn","Debug","_item","backgroundImage","contextMenu","constructUtils","constructPeerHelpers","constructPinnedHelpers","constructDiscussionHelpers","constructScheduledHelpers","searchTab","setAutoDownloadMedia","setLoadMutex","loadSidebarMedia","autoDownload","setPrefix","addedListener","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","hideTimeout","nodes","getSelectedNodes","currentMarkups","closest","activeButtons","getActiveMarkupButton","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","containerRect","isFirstShow","setMouseUpEvent","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","generatePathData","tl","tr","bl","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","disableTransition","INTERNAL_LINK_TYPE","chatInvite","broadcast","updates","processUpdateMessage","putPhoto","peopleCount","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","amplitude","speedScale","paint","pinnedTop","progressToPinned","beginPath","moveTo","lineTo","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","closePath","stateId","createGradient","shader","fillStyle","getGradientFromType","x0","y0","createLinearGradient","MUTED_BY_ADMIN","addColorStop","UNMUTED","MUTED","CONNECTING","dt","handleDevicePixelRatioChanged","setSize","forceUpdate","handleResize","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","raf","draw","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","globalAlpha","setCurrentState","states","matchMedia","setAmplitude","devicePixelRatio","setCanvasSize","computedStyle","getProperty","getComputedStyle","getPropertyValue","playPart","createPart","initFrame","skipFirstFrameRendering","inverseColor","getPart","startFrame","endFrame","toEnd","toFrame","playToFrame","frameCount","partState","colorState","getColor","setPartState","setColorState","prevState","getItem","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","confirmationPopup","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","propertyValue","hexToRgb","getColorByMutedState","generateEqualParts","clearMutedStateModifier","withIcons","icons","iconClassName","element2","actionClassName","instance","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","mutedState","dialogSize","peerTitle","groupCallParticipantMutedIcon","groupCallParticipantStatus","renderFrame","updateParticipant","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","displayPinned","shouldDisplay","shouldDisplayElement","isPinned","setPinned","hasAnyVideo","some","participantElements","participantVideo","getVideoElementFromParticipantByType","setParticipant","_onLengthChange","onOpenProfileClick","popup","getPopup","targetPeerId","toggleParticipantMuted","editParticipant","canManageCall","can_self_unmute","muted_by_you","kickFromChat","getParticipantByPeerId","getContainer","sortedList","groupCallParticipantsVideo","getGroupCallParticipants","descriptionIntl","fixDimensions","fixPosition","setPosition","addResizeHandlers","setSwipeHandler","handlers","swipeHandler","resizeHandlerClassName","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setCursor","_width","_height","mediaDevices","raise_hand_rating","withoutOverlay","onFullScreenChange","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","setThemeColor","isBig","movable","videosCount","wasBig","buttonsContainer","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","toggleMovable","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","groupCallParticipants","_className","btnVideo","toggleVideoSharing","btnScreen","toggleScreenSharing","microphoneIcon","groupCallMicrophoneIcon","throttledMuteClick","toggleMuted","changeRaiseHand","btnLeave","hangUp","discard","updateInstance","setHasPinned","setPositionToCenter","destroyElements","CLOSED","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","amplitudes","weave","componentDidMount","componentWillUnmount","callId","groupCallMicrophoneIconMini","center","weaveContainer","FOCUS_EVENT_NAME","columnEl","offline","updateStatusInterval","backgroundPromises","onHashChange","parseUriParams","tgaddr","replaceState","onclick","wrapUrl","postId","post","setSettings","chatsSelectTabDebounced","setLoop","setTimeFormat","timeFormat","onDocumentPaste","attachType","newMediaPopup","canDrag","DragEvent","_types","dataTransfer","addFiles","isIDLE","updateStatus","createNewChat","chatsSelectTab","saveChatPosition","choosing","setChoosingStickerTyping","singleInstance","activateInstance","topbarCall","setAuthorized","telegramMeWebManager","addAnchorListener","uriParams","hashtag","pathnameParams","STICKER_SET","processInternalLink","JOIN_CHAT","invite","protocol","makeLink","VOICE_CHAT","PRIVATE_POST","thread","comment","MESSAGE","domain","attachKeydownListener","IGNORE_KEYS","isOverlayActive","goodMid","nextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","saveApiChat","noPathnameParams","pathname","noUriParams","uri","openComment","generateThreadServiceStartMessage","getGroupCallFull","call","saveGroupCall","createGroupCall","broadcastEvent","STATE_INIT","getBackground","setBackground","getFile","chatBubbles","chatPositions","themeColor","hslaStringToHex","backgroundUrl","applyHighlightningColor","setTheme","setCurrentBackground","prevTab","prevIdx","attachDragAndDropListeners","handleSelection","drops","mediaDrops","mount","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","foundMedia","appendDrops","drop","setPath","transitionTime","setUserStatus","invokeApiSingle","fromIndex","justReturn","spliced","beforeDestroy","chatIndex","spliceChats","existingIndex","setType","dot","eye","typings","getPeerTypings","typing","langPackKeys","private","multi","mapa","typingElement","getTypingElement","descriptionElement","getPeerTyping","onlines","getOnlines","useWhitespace","typingContainer","getPeerStatus","topButtons","author","preloaderStreamable","isFirstOpen","pageEl","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","highlightSwitchersTimeout","wholeDiv","isZooming","mover","ctrlKeyDown","changeZoom","onKeyUp","onWheel","scrollingUp","MEDIA_VIEWER_CLASSNAME","overlaysDiv","mainDiv","topbarLeft","onlyMobile","authorRight","zoom","setNewMover","onDownloadClick","moveLength","setMoverPromise","evt","zoomValue","videoPlayer","lockControls","zoomSwipeHandler","lastDiffY","addProgress","btnMenuToggle","setMoverToTarget","appMediaViewer","closing","fromRight","removeCenterFromMover","wasActive","realParent","SVGImageElement","SVGForeignObjectElement","needOpacity","visibleRect","overflowElement","overflowRect","overflowTop","overflowBottom","sticky","overflow","horizontal","visualViewport","windowHeight","innerWidth","innerHeight","getVisibleRect","HTMLImageElement","HTMLVideoElement","setFullAspect","scaleX","scaleY","brSplitted","fillPropertyValue","willBeLeft","willBeTop","isRejected","SVGSVGElement","sizeTailPath","mediaElement","clipId","newClipId","newSvg","outerHTML","SVGUseElement","sX","sY","upscale","_br","toLeft","windowW","newTransform","p1","newMover","oldAvatar","replaceChild","setAuthorInfo","isDocument","isVideo","useContainerAsTarget","moveTheMover","mainColumns","padding","windowH","thumbPromise","useController","moverVideo","canPlayThrough","createPlayer","ckin","overlay","HAVE_FUTURE_DATA","attachCanPlay","networkState","NETWORK_LOADING","isntEnoughData","rollback","updateMediaSource","cancellablePromise","attachPromise","haveImage","captionTimeout","isForDocument","onAuthorClick","savePhotoFile","setCaptionTimeout","setBtnMenuToggle","btnMenuDelete","onCaptionClick","setCaption","_openMedia","onAvatarUpdate","removeFromAvatarsCache","getFullPhoto","getTarget","hadMessage","isAvatarCached","believeMe","isDialog","addedToQueue","oldValue","newPeerId","getPeerMigratedTo","onArchiveClick","selectedId","editPeerFolders","folder_id","toggleDialogPin","pinned_dialogs_count_max","onUnmuteClick","onUnreadClick","top_message","isDialogUnread","ConnectionStatus","SENDING_STATUS","hadConnect","connecting","timedOut","updating","setConnectionStatus","baseDcId","setFirstConnectionTimeout","connectionStatus","online","Connected","forceGetDifference","TimedOut","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","CHANGE_STATE_DELAY","getA","forceReconnect","timerSpan","interval","forceReconnectTimeout","setStateTimeout","statusContainer","constructContainer","roundRect","defaultRadius","quadraticCurveTo","DPR","SIZE","MARGIN","RADIUS","groupCallActiveIcon","START_X","startTime","wasMounted","cos","itemProgress","startAnimation","indexKey","appDialogsManager","addListDialog","isBatch","menuScrollContainer","lastActiveElements","offsets","initedListeners","loadedDialogsAtLeastOnce","loadDialogsPromise","onChatsScroll","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","loadContacts","verifyPeerIdForContacts","processContact","added","onChatsRegularScroll","sliceTimeout","perf","performance","scrollTopWas","rectContainer","rectTarget","firstY","firstElement","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialog","setOffsets","onChatsScrollTop","loadDialogs","chatsPreloader","allUnreadCount","bottomPart","addFilter","onStateLoaded","foldersScrollable","getDialogIndexKey","hasClassName","getDialogDom","setOnlineStatus","processDialogForCallStatus","setFilterUnreadCount","validateDialogForFilter","setFiltersUnreadCount","updateDialog","setUnreadMessages","setDialogActive","getCachedDialogs","validateListForFilter","containerToAppend","renderedFilter","unsetTyping","dialogDom","callIcon","getNotifyPeerTypeSettings","initListeners","renderFiltersPromise","showFiltersPromise","storagesResults","addMissedDialogs","fillConversations","migratedTo","testDialogForFilter","topOffset","getOffsetIndex","bottomOffset","isDialogMustBeInViewport","unreadSpan","getFolder","foundUnmuted","getAll","sortedDialogList","currentOffsetIndex","needIndex","getConversationsResult","isTopEnd","callbacks","cccc","offsetDialog","classNameType","subtitleArgs","placeholderContainer","generateEmptyPlaceholder","wrapLocalSticker","firstDialog","getDialogFromElement","lastDialog","withContext","openInner","lastActiveListElement","setPeerFunc","sameElement","getDialogByPeerId","lastMessage","highlightWord","setUnread","draftMessage","lastTimeSpan","playIcon","withoutMediaType","sender","senderBold","setStatusMessage","disableAnimationIfRippleFound","setSendingStatus","statusSpan","hasUnreadBadge","isUnreadBadgeMounted","unreadBadge","hasMentionsBadge","isMentionBadgeMounted","mentionsBadge","transitionDuration","isMention","originalDialog","getDialog","setCallStatus","call_not_empty","addDialog","_dialog","captionDiv","titleSpanContainer","titleP","rightSpan","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","create","default","prototype","AudioContext","webkitAudioContext","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","getUserMedia","WebAssembly","clearStream","stream","getTracks","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","postMessage","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","createGain","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","createMediaStreamSource","loadWorker","Worker","initWorker","streamPage","storePage","recordedPages","samplePosition","page","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","gain","setTargetAtTime","onstart","destroyWorker","Function","rippleClickId","drawRipple","clickId","elapsedTime","touchStartFired","clickY","sqrt","isRippleUnneeded","touchEnd","CLICK_EVENT_NAME","detachClickEvent","simulateClickEvent","rippleSquare","putPreloader","returnDiv","setButtonLoader","diffX","diffY","closeBtnMenu","menuOverlay","openedMenuOnClose","openBtnMenu","positionMenu","menuWidth","menuHeight","windowWidth","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","onCancel","navigations","manual","currentHash","isPossibleSwipe","pushState","handleItem","scrollRestoration","backByItem","noHistory","origin","simulateEvent","kind","scheduleFlush","do","read","write","TouchEvent","currentHashPromise","newHashPromise","password","new_settings","invokeCrypto","newAlgo","new_algo","salt1","randomize","hashes","new_password_hash","inputCheckPassword","setUser","PasswordInputField","onVisibilityClick","toggleVisible","stealthy","tabIndex"],"mappings":"uFAAA,8CAUe,MAAMA,EAMnB,YAAsBC,EAAkDC,GAAlD,KAAAD,qBAAkD,KAAAC,OAHjE,KAAAC,UAAY,EAIjBC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,yBAGxB,OACL,OAAGL,KAAKM,YAAoBN,KAAKM,YAC1BN,KAAKM,YAAc,IAAaC,qBAAqB,CAC1DN,UAAWD,KAAKC,UAChBO,MAAM,EACNC,UAAU,EACVC,MAAOV,KAAKF,KACZa,OAAQX,KAAKF,KACbc,SAAS,GAER,4BAA4BC,KAAKC,IAElCd,KAAKe,UAAYD,EACjBd,KAAKe,UAAUC,iBAAiB,aAAcC,KAGX,IAA7BjB,KAAKe,UAAUG,WAAmBD,GAAgBjB,KAAKD,YAC1B,IAA9BC,KAAKe,UAAUG,WAAoBD,GAAgBjB,KAAKD,aACvDC,KAAKe,UAAUI,SAAS,GACxBnB,KAAKe,UAAUK,WAIrBpB,KAAKH,mBAAmBwB,4BAA8B,KACjDrB,KAAKH,mBAAmByB,iBACzBtB,KAAKe,UAAUQ,aAAa,GAC5BvB,KAAKe,UAAUS,SAAW,EAC1BxB,KAAKD,UAAY,GACjBC,KAAKe,UAAUU,SAEfzB,KAAKe,UAAUQ,cAAc,GAC7BvB,KAAKe,UAAUS,SAAW,GAC1BxB,KAAKD,UAAY,EACjBC,KAAKe,UAAUU,SAIZ,IAAaC,kBAAkBZ,KAInC,SACFd,KAAKe,WACNf,KAAKe,UAAUY,Y,iCChErB,8CAUe,MAAMC,EAWnB,YAAsBC,EAAkC/B,GAAlC,KAAA+B,aAAkC,KAAA/B,OAR9C,KAAAgC,IAAM,GACN,KAAA/B,UAAY,EAQpBC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,yBAE7B,MAAM0B,EAAQF,EAAWE,MAEzBA,EAAMf,iBAAiB,OAAQ,KAC7BhB,KAAKgC,cAAc,KAGrBD,EAAMf,iBAAiB,QAAUiB,IAC/BjC,KAAKgC,cAAcH,EAAWK,MAAMC,UAUjC,cAAcA,GACnB,IAAInC,KAAKe,UAAW,OAGpB,IAAIqB,GADJD,EAASE,KAAKC,IAAIH,EAAQ,MAGxBC,EAAQC,KAAKE,MAAMF,KAAKC,IAAItC,KAAK8B,IAAKK,IAAW,IAAMnC,KAAK8B,KAAO,OAEhE9B,KAAKwC,gBACNxC,KAAKwC,cAAcC,MAAK,GACxBzC,KAAKwC,cAAcE,OAAOC,MAAMC,QAAU,QAG5C5C,KAAKe,UAAU2B,OAAOC,MAAMC,QAAU,IAYtCR,EAAQ,EAIV,MAAMlB,EAAYlB,KAAKD,UAAYqC,GAAS,EAAI,EAGhDpC,KAAKe,UAAUQ,aAAaL,GACN,IAAnBlB,KAAKD,WAA6B,IAAVqC,GACzBpC,KAAKe,UAAUI,SAAS,GAI1BnB,KAAKD,UAAYqC,EAEjBpC,KAAKe,UAAUU,OAMV,OACL,OAAGzB,KAAKM,YAAoBN,KAAKM,YAC1BN,KAAKM,YAAcuC,QAAQC,IAAI,CACpC,IAAavC,qBAAqB,CAChCN,UAAWD,KAAKC,UAChBO,MAAM,EACNC,UAAU,EACVC,MAAOV,KAAKF,KACZa,OAAQX,KAAKF,MACZ,4BAA4Be,KAAKE,IAClCf,KAAKwC,cAAgBzB,EAGjBf,KAAK6B,WAAWK,MAAMC,QACxBpB,EAAUU,OAGL,IAAaC,kBAAkBX,KAGxC,IAAaR,qBAAqB,CAChCN,UAAWD,KAAKC,UAChBO,MAAM,EACNC,UAAU,EACVC,MAAOV,KAAKF,KACZa,OAAQX,KAAKF,MACZ,gCAAgCe,KAAKC,IACtCd,KAAKe,UAAYD,EAEbd,KAAK6B,WAAWK,MAAMC,SACxBnC,KAAKe,UAAU2B,OAAOC,MAAMC,QAAU,QAGxC5C,KAAKe,UAAUC,iBAAiB,aAAcC,KAIX,IAA7BjB,KAAKe,UAAUG,WAAmBD,GAAgBjB,KAAKD,YAC1B,IAA9BC,KAAKe,UAAUG,WAAoBD,GAAgBjB,KAAKD,aACzDC,KAAKe,UAAUI,SAAS,GACxBnB,KAAKe,UAAUK,SAGG,IAAjBH,GAAyC,IAAnBjB,KAAKD,WAGzBC,KAAKwC,gBACNxC,KAAKwC,cAAcE,OAAOC,MAAMC,QAAU,GAC1C5C,KAAKwC,cAAcf,OACnBzB,KAAKe,UAAU2B,OAAOC,MAAMC,QAAU,UAMrC,IAAalB,kBAAkBZ,OAKrC,SACFd,KAAKe,WAAWf,KAAKe,UAAUY,SAC/B3B,KAAKwC,eAAexC,KAAKwC,cAAcb,Y,iCCtJ9C,8CAQe,MAAMoB,UAAuB,IAC1C,YAAYC,GAIVC,MAAM,OAAD,QACHC,WAAW,GACRF,IAGL,MAAMjB,EAAQ/B,KAAK+B,MACnBA,EAAMoB,KAAO,MACbpB,EAAMqB,aAAa,WAAY,IAC/BrB,EAAMsB,aAAe,MAErB,IAAIC,EAAa,EACjBtD,KAAK+B,MAAMf,iBAAiB,QAAUiB,IACpCjC,KAAK+B,MAAM3B,UAAUuB,OAAO,SAC5B3B,KAAKuD,WAEL,MAAMrB,EAAQlC,KAAKkC,MAAMsB,QAAQ,MAAO,IAAIC,MAAM,EAAGT,EAAQb,QAC7DnC,KAAK0D,iBAAiBxB,GAEtB,MAAMC,EAASnC,KAAKkC,MAAMC,OAC1B,GAAGA,IAAWa,EAAQb,OACpBa,EAAQW,OAAO3D,KAAKkC,YACf,GAAGC,IAAWmB,EACnB,OAGFA,EAAanB,O,iLCnCnB,MAAM,EAAM,IAAI,KAA4ByB,OAAO,IAAI,MAIxC,MAFoB,IAAIC,IAAI,GCC5B,SAASC,EAAaC,EAAeC,GAClDD,EAAKX,aAAa,MAAO,QACzBW,EAAKE,UAAYD,E,6BCEJ,SAASE,EAAyBhC,GAM/C,YAAeA,EAAMiC,QAAS,CAACC,EAASC,EAAKC,KACrCF,EAAmCG,OAAoDC,QAC3FF,EAAIG,OAAOJ,EAAK,QACGK,IAAhBxC,EAAMyC,SACLzC,EAAMyC,S,YCDD,MAAM,EAoBnB,YAAY3B,GAlBL,KAAA4B,SAAgB,GAChB,KAAAC,KAAY,GAEZ,KAAAC,SAAU,EAIP,KAAAC,UAAY,GACZ,KAAAC,aAAe,GAKf,KAAAC,aAAc,EACd,KAAAC,eAAgB,EAKxB,YAAWlF,KAAMgD,GAGZ,WAAW4B,EAAeC,EAAWC,GAC1C9E,KAAK4E,SAAWA,EAChB5E,KAAK6E,KAAOA,EACZ7E,KAAK8E,QAAUA,EAGjB,YACE,YAAsBJ,IAAf1E,KAAK2E,MAAsB3E,KAAK4E,SAASzC,QAAU,EAGrD,MAAMgD,GAAY,GACvBnF,KAAKoF,aAAUV,EACf1E,KAAK4E,SAAW,GAChB5E,KAAK6E,KAAO,GACZ7E,KAAKiF,YAAcjF,KAAKkF,cAAgBC,EACxCnF,KAAKqF,cAAgBrF,KAAKsF,gBAAkB,KAGvC,GAAGnD,EAAgBoD,GAAe,GACvC,IAAIC,EAAYC,EAChB,GAAGtD,EAAS,EAAG,CAGb,GAFAqD,EAAQxF,KAAK6E,KAAKJ,OAAO,EAAGtC,GAC5BsD,EAAOD,EAAME,OACTD,EACF,OAGFzF,KAAK4E,SAASe,KAAK3F,KAAKoF,WAAYI,OAC/B,CAGL,GAFAA,EAAQxF,KAAK4E,SAASH,OAAOzE,KAAK4E,SAASzC,OAASA,GAASA,GAC7DsD,EAAOD,EAAMI,SACTH,EACF,OAGFzF,KAAK6E,KAAKgB,WAAWL,EAAOxF,KAAKoF,SAanC,OAVGpF,KAAK6E,KAAK1C,OAASnC,KAAKgF,cACzBhF,KAAK8F,MAAM9F,KAAK8E,SAGf9E,KAAK4E,SAASzC,OAASnC,KAAKgF,cAC7BhF,KAAK8F,KAAK9F,KAAK8E,SAGjB9E,KAAKoF,QAAUK,EACfF,GAAgBvF,KAAK+F,QAAU/F,KAAK+F,OAAON,EAAMtD,EAAS,GACnDnC,KAAKoF,QAIP,KAAKY,GACV,GAAGA,GAAShG,KAAKkF,cAAe,OAAOrC,QAAQoD,UAC1C,IAAID,GAAShG,KAAKiF,YAAa,OAAOpC,QAAQoD,UAEnD,GAAGD,GAAShG,KAAKsF,gBAAiB,OAAOtF,KAAKsF,gBACzC,IAAIU,GAAShG,KAAKqF,cAAe,OAAOrF,KAAKqF,cAElD,IAAIa,EAEFA,EADCF,EACQhG,KAAK8E,QAAU9E,KAAK4E,SAAS,GAAK5E,KAAK6E,KAAK7E,KAAK6E,KAAK1C,OAAS,GAE/DnC,KAAK8E,QAAU9E,KAAK6E,KAAK7E,KAAK6E,KAAK1C,OAAS,GAAKnC,KAAK4E,SAAS,GAG1E,MAAMuB,EAAUnG,KAAKoG,SAASF,EAAQF,EAAOhG,KAAK+E,WAAWlE,KAAKwF,IAChE,GAAIL,GAAShG,KAAKsF,kBAAoBa,IAAcH,GAAShG,KAAKqF,gBAAkBc,EAClF,OAGCE,EAAOb,MAAMrD,OAASnC,KAAK+E,YACzBiB,EAAOhG,KAAKkF,eAAgB,EAC1BlF,KAAKiF,aAAc,QAGRP,IAAf1E,KAAK2E,QACN3E,KAAK2E,MAAQ0B,EAAO1B,OAAS0B,EAAOb,MAAMrD,SAG7B6D,EAAQK,EAAOb,MAAMc,QAAQC,KAAKF,EAAOb,OAAS,IAAee,KAAK,KAAMF,EAAOb,QAC1FC,IACN,MAAMe,EAAYxG,KAAKyG,YAAczG,KAAKyG,YAAYhB,GAAQA,EAE1De,IAEDR,EACEhG,KAAK8E,QAAS9E,KAAK4E,SAASiB,QAAQW,GAClCxG,KAAK6E,KAAKc,KAAKa,GAEjBxG,KAAK8E,QAAS9E,KAAK6E,KAAKc,KAAKa,GAC3BxG,KAAK4E,SAASiB,QAAQW,MAI/BxG,KAAK0G,cAAgB1G,KAAK0G,gBACzB,QAAU7F,KAAK,KACbmF,EAAOhG,KAAKsF,gBAAkB,KAC5BtF,KAAKqF,cAAgB,OAM5B,OAHGW,EAAOhG,KAAKsF,gBAAkBa,EAC5BnG,KAAKqF,cAAgBc,EAEnBA,GCnII,MAAM,UAAqE,EAIxF,YAAYnD,EAAiG,IAC3GC,MAAM,OAAD,wBACAD,GAAO,CACVoD,SAAU,CAACF,EAAQF,EAAOjB,K,MACxB,MAAM4B,EAAYX,EAAQ,EAAIjB,EAC9B,IAAI6B,EAAoB,QAAZ,EAAA5G,KAAKoF,eAAO,eAAEyB,IAK1B,OAHGX,IAAQU,EAAQV,EAAOW,KACtBb,IAAOY,EAAQ,IAAsBE,mBAAmBF,EAAO,IAE5D,IAAmBG,UAAU,OAAD,wBAC9B/G,KAAKgH,eAAa,CACrBC,OAAQjH,KAAKgH,cAAcC,SAAUf,aAAM,EAANA,EAAQe,QAC7CL,QACAM,MAAOP,EAAY,EAAI5B,EACvB4B,eACC9F,KAAKqB,IAKkC,kCAArClC,KAAKgH,cAAcG,YAAYC,GAChClD,EAAyBhC,GAGxBA,EAAMmF,YACPrH,KAAKgH,cAAcM,SAAWpF,EAAMmF,WAG/B,CAAC1C,MAAOzC,EAAMyC,MAAOa,MAAOtD,EAAMiC,YAG7CsC,YAAcrC,IAEZ,GADiBpE,KAAKuH,WAAW,CAACnD,EAAQyC,MAC7B1E,OAIb,OAAOa,EAAQyD,YAAYrC,OAiBvB,KAAAoD,gBAAkB,EAAEP,SAAQQ,WACpC,MAAMC,EAAmBjC,GAAeA,EAAKwB,SAAWA,GAAUQ,EAAKE,IAAIlC,EAAKoB,KAC1Ee,EAAS,CAACnC,EAAYpB,EAAaC,KACpCoD,EAAgBjC,IACjBnB,EAAIG,OAAOJ,EAAK,IAIpB,YAAerE,KAAK4E,SAAUgD,GAC9B,YAAe5H,KAAK6E,KAAM+C,GAEvB5H,KAAKoF,SAAWsC,EAAgB1H,KAAKoF,UAKzBpF,KAAK6H,WAChB7H,KAAK6H,aAKD,KAAAC,qBAAwBC,IAGhC,QAAmCrD,IAAhC1E,KAAKgH,cAAcgB,SACpB,OAIF,IAAIhI,KAAKiF,aAAejF,KAAKqF,cAC3B,OAGF,MAAM4C,EAAOF,EAAI/H,KAAKgH,cAAcC,QACpC,IAAIgB,EACF,OAGF,MAAMC,EAASC,MAAMC,KAAKH,GAAMI,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAE7CC,EADWxI,KAAKuH,WAAWW,GACRO,IAAIrE,GAAWpE,KAAKyG,YAAYrC,IAAUwD,OAAOc,SACvEF,EAAQrG,QACTnC,KAAK6E,KAAKc,QAAQ6C,IAIZ,KAAAG,cAAgB,EAAEvE,cAC1BpE,KAAK8H,qBAAqB,CACxB,CAAC1D,EAAQ6C,QAAS,IAAIpD,IAAI,CAACO,EAAQyC,SA9DrC+B,EAAA,QAAU5H,iBAAiB,iBAAkBhB,KAAKwH,iBAClDoB,EAAA,QAAU5H,iBAAiB,sBAAuBhB,KAAK8H,sBACvDc,EAAA,QAAU5H,iBAAiB,eAAgBhB,KAAK2I,eAGxC,WAAWV,GACnB,MAAMY,EAAU7I,KAAKgH,cAAc8B,YACjC,IAAmBC,4BAA4B/I,KAAKgH,cAAcC,QAClE,IAAmB+B,mBAAmBhJ,KAAKgH,cAAcC,QAE1D,OADiB,IAAmBgC,4BAA4BjJ,KAAKgH,cAAcG,YAAYC,EAAGa,EAAMY,EAASZ,EAAK9F,QAyDlH,iBAAiB+G,GACtBlJ,KAAKgH,cAAgBkC,OAEcxE,IAAhC1E,KAAKgH,cAAcgB,WACpBhI,KAAKiF,aAAc,OAEgBP,IAAhC1E,KAAKgH,cAAcM,WACpBtH,KAAKkF,eAAgB,IAIe,kCAArClF,KAAKgH,cAAcG,YAAYC,IAChCpH,KAAKiF,aAAc,GAGjBjF,KAAKgH,cAAcmC,YACrBnJ,KAAKkF,cAAgBlF,KAAKiF,aAAc,GAIrC,QACLhC,MAAMmG,QACNpJ,KAAKgH,mBAAgBtC,EAGhB,UACL1E,KAAKoJ,QACLR,EAAA,QAAUS,oBAAoB,iBAAkBrJ,KAAKwH,iBACrDoB,EAAA,QAAUS,oBAAoB,sBAAuBrJ,KAAK8H,sBAC1Dc,EAAA,QAAUS,oBAAoB,eAAgBrJ,KAAK2I,eACnD3I,KAAK6H,eAAYnD,G,oECjJd,MAAM,EAKX,YAAmB4E,EAAoCnG,EAAsBoG,GAAY,EAAMC,EAAoBC,GAAY,EAAaC,GAAa,EAAaC,GAAnJ,KAAAL,OAAoC,KAAAnG,OAAsB,KAAAoG,YAA+D,KAAAG,aAA0B,KAAAC,UACpK3J,KAAK4J,KAAO,GAAkBC,iBAC9B7J,KAAKC,UAAYC,SAASC,cAAc,OACrCqJ,IAAWxJ,KAAKC,UAAUuJ,UAAYA,GAEtCF,IACDtJ,KAAK8J,OAAS5J,SAASC,cAAc,OACrCH,KAAK8J,OAAO1J,UAAUC,IAAI,sBACN,iBAAX,GACPL,KAAK8J,OAAOC,OAAO,eAAKT,IAE1BtJ,KAAKC,UAAU8J,OAAO/J,KAAK8J,SAG7B9J,KAAKC,UAAUG,UAAUC,IAAI,eAAgB,gBAAkB8C,GAC/DnD,KAAKC,UAAU8J,OAAO/J,KAAK4J,MAC3B5J,KAAKC,UAAU0C,MAAMC,QAAU,OAE5B6G,GACD,GAAkBO,qBAAqBhK,KAAK4J,KAAMD,OAASjF,EAAWgF,GAI1E,QACE1J,KAAKC,UAAU0C,MAAMC,QAAU,OAE5B5C,KAAKuJ,YACNvJ,KAAK4J,KAAK3F,UAAY,IAI1B,YACEjE,KAAKC,UAAU0C,MAAMC,QAAU,GAGjC,SACK5C,KAAK4J,KAAKK,kBACXjK,KAAKkK,YAELlK,KAAKmK,SAOI,MAAM,EAiBnB,YAAmBlK,EAA+BmK,EAAiCC,EAAgEC,GAAhI,KAAArK,YAA+B,KAAAmK,cAAiC,KAAAC,eAAgE,KAAAC,WAhB3I,KAAAC,SAAW,EACX,KAAAC,aAAe,EACf,KAAAC,YAAc,EAEd,KAAAC,cAA+B,KAC/B,KAAAC,cAAwB,EAExB,KAAAC,MAAQ,GAER,KAAAC,eAAiC,KAGjC,KAAAC,SAAW,EAKjB9K,KAAK+K,WAAa,IAAI,IAAW/K,KAAKC,WACtCD,KAAK6K,eAAiB7K,KAAK+K,WAAW9K,UACtC,IAAI,IAAI+K,KAAKhL,KAAKqK,aAChBrK,KAAK6K,eAAed,OAAO/J,KAAKqK,aAAaW,GAAsB/K,WAGlED,KAAKqK,aAAaY,UACnBjL,KAAK+K,WAAWG,oBAAoBlL,KAAKqK,aAAaY,SAASrB,MAGjE5J,KAAKoK,YAAYe,SAAYjJ,IAM3BlC,KAAK4K,MAAQ1I,EACblC,KAAKoJ,OAAM,GACXpJ,KAAKoL,cAGPpL,KAAK+K,WAAWM,iBAAmB,KAC7BrL,KAAK4K,MAAMU,SAEXtL,KAAK2K,gBACP3K,KAAK2K,cAAgBY,OAAOC,WAAW,KACrCxL,KAAKoL,aACLpL,KAAK2K,cAAgB,GACpB,MAKF,MAAM7H,GAAM,GACdA,IACD9C,KAAKoK,YAAYlI,MAAQ,GACzBlC,KAAK4K,MAAQ,GACb5K,KAAKiH,YAASvC,EACd1E,KAAK8K,SAAW,GAGlB9K,KAAKuK,SAAW,EAChBvK,KAAKwK,aAAe,EACpBxK,KAAKyK,YAAc,EAEnB,IAAI,IAAIO,KAAKhL,KAAKqK,aAChBrK,KAAKqK,aAAaW,GAAsBb,QAG1CnK,KAAK0K,cAAgB,KAGhB,YAAYzD,EAAiB6D,EAAW,EAAGF,EAAQ,IACxD5K,KAAKiH,OAASA,EACdjH,KAAK8K,SAAWA,EAEb9K,KAAK4K,QAAUA,IAChB5K,KAAKoK,YAAYvI,WAAWK,MAAQ0I,GAGtC5K,KAAKoK,YAAYrI,MAAM0J,QAGlB,aACL,GAAGzL,KAAK0K,cAAe,OAAO1K,KAAK0K,cAEnC,MAAME,EAAQ5K,KAAK4K,MAEnB,IAAIA,EAAMU,OAER,YADAtL,KAAKsK,UAAYtK,KAAKsK,SAAS,IAIjC,IAAwB,IAArBtK,KAAKyK,YAAqBzK,KAAKwK,aAAexK,KAAKyK,WACpD,OAAO5H,QAAQoD,UAGjB,MAAMW,EAAQ5G,KAAKuK,UAAY,EAE/B,OAAOvK,KAAK0K,cAAgB,IAAmB3D,UAAU,CACvDE,OAAQjH,KAAKiH,OACb2D,QACAzD,YAAa,CAACC,EAAG,4BACjBR,QACAM,MAAO,GACP4D,SAAU9K,KAAK8K,WACdjK,KAAK6K,IAGN,GAFA1L,KAAK0K,cAAgB,KAElB1K,KAAKoK,YAAYlI,QAAU0I,EAC5B,OAKF,MAAM,MAACjG,EAAK,QAAER,GAAWuH,EAEtBvH,EAAQhC,QAAUgC,EAAQ,GAAG0C,MAAQ7G,KAAKuK,UAC3CpG,EAAQyB,QAGV,MAAM+F,EAAc3L,KAAKqK,aAAaY,SAEtC9G,EAAQmC,QAASlC,IACf,MAAM6C,EAASjH,KAAKiH,OAAS7C,EAAQwH,OAASxH,EAAQ6C,QAChD,OAAC4E,EAAM,IAAEC,GAAO,GAAkBC,aAAa,CACnDF,OAAQ5E,EACRhH,UAAWD,KAAK+K,WAChBiB,YAAY,EACZC,WAAY,GACZC,WAAW,IAGV9H,EAAQ6C,SAAWA,IACpB6E,EAAIK,OAAOC,QAAQnF,OAAS,GAAK7C,EAAQ6C,QAG3C,GAAkBoF,eAAeR,EAAQzH,EAAS0H,EAAKlB,KAGzDe,EAAYW,SAEZtM,KAAKuK,SAAWpG,EAAQhC,QAAUgC,EAAQA,EAAQhC,OAAS,GAAG0E,KAErC,IAAtB7G,KAAKwK,cACNxK,KAAKwK,YAAc,GAErBxK,KAAKwK,aAAerG,EAAQhC,QAEJ,IAArBnC,KAAKyK,aACNzK,KAAKyK,WAAa9F,EAEfgH,EAAY7B,QACb,OAAAyC,EAAA,GAAeZ,EAAY7B,OAAQ,eAAKnF,EAAQ,4BAA8B,8BAA+B,CAACA,KAGhH3E,KAAKsK,UAAYtK,KAAKsK,SAAStK,KAAKyK,eAErC+B,MAAMC,IACPC,QAAQC,MAAM,eAAgBF,GAC9BzM,KAAK0K,cAAgB,Q,YCpNZ,MAAM,EAWnB,YAAYkC,EAA0BzB,GAL/B,KAAA0B,UAAY,GACZ,KAAAC,QAAU,EA+BjB,KAAAC,QAAU,KACR,IAAI/M,KAAKmL,SAAU,OAEnB,IAAIjJ,EAAQlC,KAAKkC,MAIdA,IAAUlC,KAAK6M,YAChB7M,KAAK6M,UAAY3K,EACjB8K,aAAahN,KAAK8M,SAClB9M,KAAK8M,QAAUvB,OAAOC,WAAW,KAC/BxL,KAAKmL,SAASjJ,IACb,OAIP,KAAA+K,aAAe,KACbjN,KAAKkC,MAAQ,GACblC,KAAKmL,UAAYnL,KAAKmL,SAAS,IAC/BnL,KAAKkN,SAAWlN,KAAKkN,WA7CrBlN,KAAK6B,WAAa,IAAI,IAAW,CAC/B+K,cACA1J,WAAW,IAGblD,KAAKC,UAAYD,KAAK6B,WAAW5B,UACjCD,KAAKC,UAAUG,UAAUuB,OAAO,eAChC3B,KAAKC,UAAUG,UAAUC,IAAI,gBAE7BL,KAAKmL,SAAWA,EAEhBnL,KAAK+B,MAAQ/B,KAAK6B,WAAWE,MAC7B/B,KAAK+B,MAAM3B,UAAUC,IAAI,sBAEzB,MAAM8M,EAAajN,SAASC,cAAc,KAC1CgN,EAAW/M,UAAUC,IAAI,QAAS,gBAElCL,KAAKoN,SAAWlN,SAASC,cAAc,KACvCH,KAAKoN,SAAShN,UAAUC,IAAI,QAAS,WAAY,eAEjDL,KAAK+B,MAAMf,iBAAiB,QAAShB,KAAK+M,SAC1C/M,KAAKoN,SAASpM,iBAAiB,QAAShB,KAAKiN,cAE7CjN,KAAKC,UAAU8J,OAAOoD,EAAYnN,KAAKoN,UAyBzC,YACE,OAAOpN,KAAK6B,WAAWK,MAGzB,UAAUA,GACRlC,KAAK6M,UAAY3K,EACjB8K,aAAahN,KAAK8M,SAClB9M,KAAK6B,WAAWK,MAAQA,EAGnB,SACL8K,aAAahN,KAAK8M,SAClB9M,KAAK+B,MAAMsH,oBAAoB,QAASrJ,KAAK+M,SAC7C/M,KAAKoN,SAAS/D,oBAAoB,QAASrJ,KAAKiN,e,6CClErC,MATI,CAACzD,EAAoBxG,EAAuE,KAC9F,YAAO,WAAY,OAAF,QAC9BqK,KAAM7D,QAAa9E,GAChB1B,I,sSCaQ,MAAM,EAcnB,YAAYsK,EAAuBC,GACjCvN,KAAKwN,aAAaF,EAAQC,GAGrB,aAAaD,EAAuBC,GAAc,GACvDvN,KAAKsN,OAASA,EACdtN,KAAKuN,YAAcA,EAEnBvN,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,WAAY,uBAGzCL,KAAKyN,OAASvN,SAASC,cAAc,OACrCH,KAAKyN,OAAOrN,UAAUC,IAAI,kBAE1BL,KAAK0N,SAAW,EAAW,4BAA6B,CAACC,UAAU,IACnE3N,KAAK4N,MAAQ1N,SAASC,cAAc,OACpCH,KAAK4N,MAAMxN,UAAUC,IAAI,yBACzBL,KAAKyN,OAAO1D,OAAO/J,KAAK0N,SAAU1N,KAAK4N,OAGvC5N,KAAK6N,QAAU3N,SAASC,cAAc,OACtCH,KAAK6N,QAAQzN,UAAUC,IAAI,mBAE3BL,KAAK+K,WAAa,IAAI,IAAW/K,KAAK6N,aAASnJ,OAAWA,GAAW,GAErE1E,KAAKC,UAAU8J,OAAO/J,KAAKyN,OAAQzN,KAAK6N,SAExC7N,KAAKsN,OAAOQ,OAAO9N,MAEnBA,KAAK+N,eAAiB,IAAI,IAGrB,QACL,OAAO/N,KAAKsN,OAAOU,SAAShO,MAGjB,QAAQiO,G,yCACnB,GAAGjO,KAAKkO,KACN,IACE,MAAM7H,EAASrG,KAAKkO,OACpBlO,KAAKkO,KAAO,KAET7H,aAAkBxD,gBACbwD,GAER,MAAMoG,GACNC,QAAQC,MAAM,iBAAkBF,GAIpC,OAAOzM,KAAKsN,OAAOa,UAAUnO,SAGrB,QAIH,sBACFA,KAAKuN,cACNvN,KAAKsN,OAAOc,KAAKC,OAAOrO,MACxBA,KAAKC,UAAU0B,UAGd3B,KAAK+N,gBACN/N,KAAK+N,eAAeO,YAId,SAASC,GACjBvO,KAAK4N,MAAM3J,UAAY,GACvBjE,KAAK4N,MAAM7D,OAAO,eAAKwE,KAIpB,MAAM,UAAgC,EAK3C,YAAYjB,GACVrK,MAAMqK,GACNtN,KAAKwO,cAAgB,IAAI,IAG3B,sBAGE,OAFAxO,KAAKwO,cAAcC,cAAc,WACjCzO,KAAKwO,cAAcE,UACZzL,MAAM0L,uBC3GF,MAAM,EASnB,YAAY3L,GAPL,KAAA4L,cAA6C,GAI5C,KAAAC,cAAe,EA0BhB,KAAAC,gBAAkB,KACVC,EAAA,EAAwBC,eAAehP,KAAKiP,gBAEvDF,EAAA,EAAwBG,KAAKlP,KAAKiP,gBAC1BjP,KAAK4O,cAAczM,QAC3BnC,KAAKgO,SAAShO,KAAK4O,cAAc5O,KAAK4O,cAAczM,OAAS,KAK1D,KAAA6L,SAAW,CAACmB,EAA8BC,EAAmBC,KAClE,QAAU3K,IAAPyK,GAAoBnP,KAAK4O,cAAc5O,KAAK4O,cAAczM,OAAS,KAAOgN,EAC3E,OAAO,EAIT,MAAMG,EAAYtP,KAAK4O,cAAclJ,MACrC1F,KAAKuP,WAAWD,EAAWF,EAASC,GAEpC,MAAMG,EAAMxP,KAAK4O,cAAc5O,KAAK4O,cAAczM,OAAS,GAE3D,OADAnC,KAAKyP,gBAAmB/K,IAAR8K,EAAqBA,aAAe,EAAiBA,EAAIvP,UAAYuP,EAAQxP,KAAK6O,cAAgB,EAAI,EAAIO,IACnH,GAtCP,YAAWpP,KAAMgD,GAEbhD,KAAKoO,OACPpO,KAAKoO,KAAO,IAAIsB,KAGlB1P,KAAK2P,cAAgB3P,KAAK4P,UAAUC,cAAc,mBAClD7P,KAAKyP,WAAa,YAAiBzP,KAAK2P,cAAe,aA3BnC,KA4BhB3P,KAAK6O,cACP7O,KAAKyP,WAAW,GAGlBtH,MAAMC,KAAKpI,KAAK4P,UAAUE,iBAAiB,0BAAkDxJ,QAAQyJ,IACnG,YAAiBA,EAAI/P,KAAK8O,mBA4BvB,UAAUK,GAKf,GAAGnP,KAAK4O,cAAc5O,KAAK4O,cAAczM,OAAS,KAAOgN,EACvD,OAAO,EAGT,MAAMK,EAAiBL,aAAc,EAAiBA,EAAKnP,KAAKoO,KAAK4B,IAAIb,GAyBzE,OAxBGK,IACEA,EAAIS,QACLT,EAAIS,SAGHT,EAAIU,oBACL1E,WAAW,KACTgE,EAAIU,sBA9EU,MAoFlBnB,EAAA,EAAwBoB,SAAS,CAC/BhN,KAAMnD,KAAKiP,eACXmB,MAAQC,IACNrQ,KAAKgO,cAAStJ,EAAW2L,GAAY,IAC9B,KAKbrQ,KAAK4O,cAAcjJ,KAAKwJ,GACxBnP,KAAKyP,WAAWN,aAAc,EAAiBA,EAAGlP,UAAYkP,IACvD,EAGF,qBAAqBA,GAC1B,YAAiBnP,KAAK4O,cAAeO,GACrCnP,KAAKuP,WAAWJ,OAAIzK,GAGf,kBAAkB4L,EAA6CC,GACpE,IAAI,IAAIvF,EAAIhL,KAAK4O,cAAczM,OAAS,EAAG6I,GAAK,IAAKA,EAAG,CACtD,MAAMwE,EAAMxP,KAAK4O,cAAc5D,GAC/B,GAAGwE,IAAQe,EAAX,CACK,GAAGf,aAAec,EACrB,MAGFtQ,KAAKwQ,qBAAqBhB,KAKvB,OAAOc,GACZ,OAAOtQ,KAAK4O,cAAc6B,KAAKC,GAAKA,aAAaJ,GAG5C,YAAYA,GACjB,QAAStQ,KAAK2Q,OAAOL,GAGb,WAAWnB,EAA6BC,EAAkBC,GAC9DA,GACFN,EAAA,EAAwB6B,aAAa5Q,KAAKiP,gBAAgB,GAG5D,MAAMO,EAAiBL,aAAc,EAAiBA,EAAKnP,KAAKoO,KAAK4B,IAAIb,GACtEK,IACEA,EAAIqB,SACLrB,EAAIqB,UAGHrB,EAAIb,qBACLnD,WAAW,KACTgE,EAAIb,uBAzIU,MA+If,OAAOa,GACRA,EAAIvP,UAAU6Q,gBAChB9Q,KAAK2P,cAAc5F,OAAOyF,EAAIvP,WAE3BuP,EAAI9B,UACL8B,EAAI9B,SAAS1M,iBAAiB,QAAShB,KAAK8O,mB,qBCxJrC,MAAM,EAKnB,YAAY3D,GACVnL,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,eAE7BL,KAAK0C,OAASxC,SAASC,cAAc,UACrCH,KAAK0C,OAAOtC,UAAUC,IAAI,sBAE1BL,KAAKqN,KAAOnN,SAASC,cAAc,QACnCH,KAAKqN,KAAKjN,UAAUC,IAAI,QAAS,mBAEjCL,KAAKC,UAAU8J,OAAO/J,KAAK0C,OAAQ1C,KAAKqN,MAExCrN,KAAKC,UAAUe,iBAAiB,QAAS,MACvC,IAAI,KAAc+P,KAAK/Q,KAAK0C,OAAQyI,KAIjC,QACOnL,KAAK0C,OAAOsO,WAAW,MAC/BC,UAAU,EAAG,EAAGjR,KAAK0C,OAAOhC,MAAOV,KAAK0C,OAAO/B,SCrBxC,MALM,CAACqC,EAAwG,KAC7G,YAAO,mCAAqCA,EAAQwG,UAAY,IAAMxG,EAAQwG,UAAY,IAAKxG,GCSjG,MAAM,UAAuB,EAA5C,c,oBACU,KAAA2I,YAAc,IAAI,GAAY,EAAM,YAAY,EAAM,mCAAmC,GAEzF,KAAAuF,aAAyC,KAKvC,OACRlR,KAAKC,UAAUG,UAAUC,IAAI,uBAC7BL,KAAKmR,SAAS,YAEdnR,KAAKoR,WAAa,IAAI,EAAYC,IAChCrR,KAAKkR,aAAeG,IAGtB,MAAMC,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3BL,KAAKuR,oBAAsB,IAAI,IAAW,CACxCC,MAAO,yBACPC,UAAW,MAGbH,EAAavH,OAAO/J,KAAKuR,oBAAoBtR,WAE7CD,KAAKuR,oBAAoBxP,MAAMf,iBAAiB,QAAS,KACvD,MAAMkB,EAAQlC,KAAKuR,oBAAoBrP,MACvClC,KAAK0R,QAAQtR,UAAUkM,OAAO,eAAgBpK,EAAMC,SAAWnC,KAAKuR,oBAAoBxP,MAAM3B,UAAUuR,SAAS,YAGnH3R,KAAK0R,QAAU,EAAa,CAACrE,KAAM,eAEnCrN,KAAK0R,QAAQ1Q,iBAAiB,QAAS,KACrC,MAAM4M,EAAQ5N,KAAKuR,oBAAoBrP,MAEvClC,KAAK0R,QAAQE,UAAW,EACxB,IAAgBC,WAAWjE,EAAO5N,KAAK8R,QAAQrJ,IAAIxB,GAAUA,EAAO8K,aAAalR,KAAMmR,IAClFhS,KAAKkR,cACNlR,KAAKkR,eAAerQ,KAAMoR,IACxB,IAAgBC,UAAUF,EAAQC,KAItC,GAAezB,qBAAqBxQ,MACpC,GAAemO,UAAU,OAI7B,MAAMgE,EAAiBjS,SAASC,cAAc,OAC9CgS,EAAe/R,UAAUC,IAAI,sBAC7B8R,EAAepI,OAAO/J,KAAK2L,YAAY1L,WAEvCD,KAAK6N,QAAQ9D,OAAO/J,KAAK0R,SACzB1R,KAAK+K,WAAWhB,OAAO/J,KAAKoR,WAAWnR,UAAWqR,EAAca,GAG3D,sBACLnS,KAAK2L,YAAYxB,QACjBnK,KAAKoR,WAAWjH,QAChBnK,KAAKkR,aAAe,KACpBlR,KAAKuR,oBAAoBrP,MAAQ,GACjClC,KAAK0R,QAAQE,UAAW,EAGnB,KAAKE,GACV,MAAMzL,EAASpD,MAAM8N,OAqBrB,OApBA1K,EAAOxF,KAAK,KACVb,KAAK8R,QAAUA,EAEf9R,KAAK8R,QAAQxL,QAAQ8L,IACnB,IAAI,IAACtG,GAAO,GAAkBC,aAAa,CACzCF,OAAQuG,EACRnS,UAAWD,KAAK2L,YAAY/B,KAC5BoC,YAAY,EACZqG,eAAe,EACfpG,WAAY,KAGdH,EAAIwG,gBAAgBvI,OAAO,IAAgBwI,oBAAoBH,MAGjEpS,KAAK2L,YAAY7B,OAAO0I,YAAc,GACtCxS,KAAK2L,YAAY7B,OAAOC,OAAO,eAAK,UAAW,CAAC/J,KAAK8R,QAAQ3P,UAC7DnC,KAAK2L,YAAYzB,cAGZ7D,G,mdCxEX,MAAMoM,GAAwB,MAC5B,IACE,OAAO,eAAcC,UAAUC,UAAUC,MAAM,mBAAmB,GAAK,GACvE,MAAMnG,GACN,OAAO,IAJmB,GA6rB9B,MAAMoG,GAA6B,IArqBnC,MAwBE,cAME,GA5BM,KAAAC,MAAoD,IAAIpD,IACxD,KAAAqD,UAAiD,IAAIrD,IACrD,KAAAsD,aAAoD,IAAItD,IAGxD,KAAAuD,oBAA0E,IAAIvD,IAC9E,KAAAwD,6BAAkF,IAAIxD,IACtF,KAAAyD,wBAAoE,GAUpE,KAAAC,QAAU,EACV,KAAAC,QAAS,EACT,KAAAC,cAAgB,EA2EjB,KAAAC,aAAgBC,IACrB,MAAMV,EAAQ9S,KAAKyT,aAChBX,IACDA,EAAMY,YAAcrR,KAAKP,IAAI,EAAGgR,EAAMY,aAAeF,EAAQG,YAnH/C,OAuHX,KAAAC,YAAeJ,IACpB,MAAMV,EAAQ9S,KAAKyT,aAChBX,IACDA,EAAMY,YAAcrR,KAAKC,IAAIwQ,EAAMe,SAAUf,EAAMY,aAAeF,EAAQG,YA1H5D,OA8HX,KAAAG,OAAUN,IACf,MAAMV,EAAQ9S,KAAKyT,aAChBX,IACDA,EAAMY,YAAcF,EAAQO,WA4GxB,KAAAC,oBAAuBlB,IAC7B,MAAMU,EAAUxT,KAAKgT,aAAahD,IAAI8C,GAChCmB,EAAM,IAAeC,OAAOV,EAAQW,OAC1B,UAAbF,EAAI9Q,MAAoB8Q,EAAIG,mBAAqB3B,IAClDzS,KAAKqU,uBAAuBvB,GAI9B,MAAMwB,EAAeC,GAAA,EAAmBC,gBAAgBP,GACxDnB,EAAM2B,IAAMH,EAAaI,IAGzB,MAAMC,EAAM3U,KAAKmT,wBAAwBc,EAAI9E,IAC1CwF,IACDA,EAAItG,OAAOyE,GAEP6B,EAAI7U,aACCE,KAAKmT,wBAAwBc,EAAI9E,MA4KtC,KAAAyF,OAAU3S,IAChB,MAAM6Q,EAAQ7Q,EAAE4S,OACVrB,EAAUxT,KAAKgT,aAAahD,IAAI8C,IAChC,OAAC7L,EAAM,IAAEJ,GAAO2M,EAIhBpP,EAAUpE,KAAK8U,kBAAkBhC,GAGvC,GADsB9S,KAAKyT,eACNX,EAAO,CAC1B9S,KAAKyC,OAEL,MAAMsS,EAAUC,GAAuBA,EAAQnO,MAAQA,GAAOmO,EAAQ/N,SAAWA,EACjF,IAAIjH,KAAKiV,WAAW7P,UAAY2P,EAAO/U,KAAKiV,WAAW7P,SAAU,CAC/D,IACI8P,EADA7Q,EAAMrE,KAAKiV,WAAWrQ,SAASuQ,UAAUJ,IAEjC,IAAT1Q,EACD6Q,IAAelV,KAAKiV,WAAWrQ,SAASzC,OAASkC,IAEjDA,EAAMrE,KAAKiV,WAAWpQ,KAAKsQ,UAAUJ,IACzB,IAAT1Q,IACD6Q,EAAa7Q,EAAM,KAIX,IAATA,EACE6Q,GACDlV,KAAKiV,WAAWG,GAAGF,GAAY,GAGjClV,KAAKqV,WAAW,CAACpO,SAAQJ,QAI7B7G,KAAKsV,SAASxC,EAAO1O,GAIvBoH,WAAW,KACT5C,EAAA,QAAU6F,cAAc,aAAc,CAACwF,IAAK,IAAmBsB,oBAAoBnR,GAAUA,UAAS0O,WACrG,IAGG,KAAA0C,QAAWvT,IAQjB2G,EAAA,QAAU6F,cAAc,gBAGlB,KAAAgH,QAAWxT,IACbA,EAAEyT,YAIN1V,KAAKwV,QAAQvT,GAITjC,KAAK6E,SACP7E,KAAKyC,OACLmG,EAAA,QAAU6F,cAAc,iBA0BrB,KAAAhN,KAAO,IACLzB,KAAKsM,QAAO,GAGd,KAAAlL,MAAQ,IACNpB,KAAKsM,QAAO,GAGd,KAAA7J,KAAO,KACZ,MAAMqQ,EAAQ9S,KAAKyT,aACnB,IAAIX,EACF,OAAO,EAGLA,EAAM6C,QACR7C,EAAM1R,QAGR0R,EAAMY,YAAc,EACpB,aAAcZ,EAAO,SAErB,MAAMU,EAAUxT,KAAKgT,aAAahD,IAAI8C,GACtC,GAAGU,aAAO,EAAPA,EAASoC,MAAO,CACjB9C,EAAM2B,IAAM,GACZ,MAAMxN,EAASuM,EAAQvM,OACjB4O,EAAIrC,EAAQ1K,YAAc9I,KAAK+S,UAAY/S,KAAK8S,MAChDjK,EAAUgN,EAAE7F,IAAI/I,GACnB4B,IACDA,EAAQwF,OAAOmF,EAAQ3M,KAEnBgC,EAAQ/I,MACV+V,EAAExH,OAAOpH,IAIb6L,EAAMnR,SAEN3B,KAAKgT,aAAa3E,OAAOyE,GAK3B,OAFA9S,KAAKyT,kBAAe/O,GAEb,GAGF,KAAAoR,SAAYrQ,IACjB,MAAM,OAACwB,EAAM,IAAEJ,GAAOpB,EAChBqD,EAAc9I,KAAKgH,cAAc8B,YACzB9I,KAAK+V,SAAS9O,EAAQJ,EAAKiC,GAMnCrH,OAEN+J,WAAW,KACTxL,KAAKgW,2BAA2B/O,EAAQJ,EAAKiC,IAC5C,IAGE,KAAAjE,KAAO,KACJ7E,KAAKiW,iBAAmBjW,KAAKiV,WAAWG,GAAG,GAG9C,KAAAxQ,SAAW,KAChB,MAAMkO,EAAQ9S,KAAKyT,aACnB,OAAGX,IAAUA,EAAMY,YAAc,IAAM1T,KAAKiV,WAAWrQ,SAASzC,SAC9D2Q,EAAMY,YAAc,OACpB1T,KAAKsM,QAAO,KAINtM,KAAKiW,iBAAmBjW,KAAKiV,WAAWG,IAAI,IAtiBpDpV,KAAKC,UAAYC,SAASC,cAAc,OAExCH,KAAKC,UAAU0C,MAAMuT,QAAU,iBAC/BhW,SAASiW,KAAKpM,OAAO/J,KAAKC,WAEvByS,UAAU0D,aAAc,CACzB,MAAMC,EAAwE,CAC5E5U,KAAMzB,KAAKyB,KACXL,MAAOpB,KAAKoB,MACZqB,KAAMzC,KAAKyC,KACX6T,aAActW,KAAKuT,aACnBgD,YAAavW,KAAK4T,YAClB4C,OAAQxW,KAAK8T,OACb2C,cAAezW,KAAK4E,SACpB8R,UAAW1W,KAAK6E,MAGlB,IAAI,MAAMN,KAAU8R,EAClB,IACE3D,UAAU0D,aAAaO,iBAAiBpS,EAA8B8R,EAAQ9R,IAC9E,MAAMkI,GACNC,QAAQkK,KAAK,wCAAyCrS,IAK5DqE,EAAA,QAAU5H,iBAAiB,sBAAwBiT,IACjD,MAAMU,EAAM3U,KAAKmT,wBAAwBc,EAAI9E,IAC7C,GAAGwF,EACD,IAAI,MAAM7B,KAAS6B,EACjB3U,KAAKgU,oBAAoBlB,KAK/B,MAAM+D,EAAuD,GAChD,CACX,SACA,QACA,gBAEGvQ,QAAQiI,IACX,MAAMuI,EAAQ,IAAMvI,EACpBsI,EAAWtI,GAAO,CAChByB,IAAK,IAAMhQ,KAAK8W,GAChBnC,IAAMzS,IACDlC,KAAK8W,KAAU5U,IAKlBlC,KAAK8W,GAAQ5U,EACVlC,KAAKyT,eAENzT,KAAKyT,aAAalF,GAAOrM,GAG3BlC,KAAK+W,8BAIXC,OAAOC,iBAAiBjX,KAAM6W,GAGxB,yBACN,MAAM,OAACK,EAAM,MAAEC,EAAK,aAAEC,GAAgBpX,KACtC4I,EAAA,QAAU6F,cAAc,wBAAyB,CAC/CyI,SAAQC,QAAOC,iBAyBZ,SAAShT,EAA0BiT,EAAmBzB,GAC3D,MAAM,OAAC3O,EAAM,IAAEJ,GAAOzC,EAGhByR,IADgBzR,EAAQkT,OAAOC,aACbvX,KAAK+S,UAAY/S,KAAK8S,MAC9C,IAAIjK,EAAUgN,EAAE7F,IAAI5L,EAAQ6C,QACxB4B,GACFgN,EAAElB,IAAIvQ,EAAQ6C,OAAQ4B,EAAU,IAAI6G,KAGtC,IAAIoD,EAAQjK,EAAQmH,IAAInJ,GACxB,GAAGiM,EACD,OAAOA,EAGT,MAAMmB,EAAkB,IAAmBsB,oBAAoBnR,GAC/DyE,EAAQ8L,IAAI9N,EAAKiM,EAAQ5S,SAASC,cAA2B,UAAb8T,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,KAAmB,QAAU,UAIzF,UAAb8Q,EAAI9Q,MACL2P,EAAM1P,aAAa,cAAe,QAIpC,MAAMoQ,EAAwB,CAC5BvM,SACAJ,MACAsN,MAAOF,EAAI9E,GACXyG,QACA9M,YAAa1E,EAAQkT,OAAOC,cAG9BvX,KAAKgT,aAAa2B,IAAI7B,EAAOU,GAG7BV,EAAMoE,OAAS,EAGflX,KAAKC,UAAU8J,OAAO+I,GAEtBA,EAAM9R,iBAAiB,OAAQhB,KAAK4U,QACpC9B,EAAM9R,iBAAiB,QAAShB,KAAKwV,SACrC1C,EAAM9R,iBAAiB,QAAShB,KAAKyV,SAErB,UAAbxB,EAAI9Q,OAAoBiB,aAAO,EAAPA,EAASkT,OAAOE,eAAgBpT,EAAQwH,SAAWhD,EAAA,QAAU6O,MACtF3E,EAAM9R,iBAAiB,aAAc,KACnC,IAAmB0W,aAAazQ,EAAQ,CAACJ,KACxC,CAAC8Q,MAAM,IAiBZ,MAAMC,EAAW,eACjB,GAAGP,EACDO,EAAS3R,cACJ,CACL,MAAM4R,EAAIzT,EAAQkT,OAAOC,aAAevX,KAAKkT,6BAA+BlT,KAAKiT,oBACjF,IAAI6E,EAAiBD,EAAE7H,IAAI/I,GACvB6Q,GACFD,EAAElD,IAAI1N,EAAQ6Q,EAAiB,IAAIpI,KAGrCoI,EAAenD,IAAI9N,EAAK+Q,GAqB1B,OAlBAA,EAAS/W,KAAK,KAIZ,MAAMyT,EAAeC,GAAA,EAAmBC,gBAAgBP,GACxD,GAAGA,EAAIG,mBAAqBE,EAAaI,IACvC1U,KAAKgU,oBAAoBlB,OACpB,CACL,IAAI6B,EAAM3U,KAAKmT,wBAAwBc,EAAI9E,IACvCwF,IACFA,EAAM3U,KAAKmT,wBAAwBc,EAAI9E,IAAM,IAAItL,KAGnD8Q,EAAItU,IAAIyS,GACR,IAAeiF,YAAY9D,MAIxBnB,EAGF,SAAS7L,EAAgBJ,EAAaiC,GAC3C,MAAM+M,GAAK/M,EAAc9I,KAAK+S,UAAY/S,KAAK8S,OAAO9C,IAAI/I,GAC1D,OAAO4O,aAAC,EAADA,EAAG7F,IAAInJ,GA2BR,uBAAuBiM,GAC7BA,EAAM9R,iBAAiB,OAAQ,KAM7B,MAAM0S,EAAcZ,EAAMY,YAG1BZ,EAAM9R,iBAAiB,WAAY,KACjC8R,EAAMY,YAAcZ,EAAMe,SAAW,EAErCf,EAAM9R,iBAAiB,WAAY,KACjC8R,EAAMY,YAAcA,EAIhBZ,EAAM6C,QACR7C,EAAMrR,QAEP,CAACkW,MAAM,KACT,CAACA,MAAM,MAIP,2BAA2B1Q,EAAgBJ,EAAaiC,GAC7D,MAAM+O,EAAI/O,EAAc9I,KAAKkT,6BAA+BlT,KAAKiT,oBAC3DpK,EAAUgP,EAAE7H,IAAI/I,GACtB,IAAI4B,EACF,OAGF,MAAM1C,EAAU0C,EAAQmH,IAAInJ,GACzBV,IACDA,EAAQF,UACR4C,EAAQwF,OAAOxH,GAEXgC,EAAQ/I,MACV+X,EAAExJ,OAAOpH,IAQR,kBAAkB6L,GAEvB,QAASA,EAAMkF,gBAGT,mBAAmBlF,EAAyB5Q,GAElD4Q,EAAMkF,gBAAkB9V,EAGZ,gBAAgBkC,EAA0BqP,EAAezT,KAAKyT,c,sDACpE,aAAYA,OAAc/O,GAAW,GAE3C,MAAMuP,EAAM,IAAmBsB,oBAAoBnR,GAE7C6T,EAAwB,GAExBC,EAAuB,UAAbjE,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,KAC5C,IAAIyK,EAAQ,GAAIuK,EAAS,GAEzB,GAAa,QAAV,EAAAlE,EAAImE,cAAM,eAAEjW,OAAQ,CACrB,MAAMrC,EAAOmU,EAAImE,OAAOnE,EAAImE,OAAOjW,OAAS,GAC5C,IAAKrC,EAAqCuY,MAAO,CAC/C,MAAM/D,EAAeC,GAAA,EAAmBC,gBAAgBP,EAAKnU,EAAKqD,MAElE,GAAGmR,EAAaI,IACduD,EAAQtS,KAAK,CACX8O,IAAKH,EAAaI,IAClB4D,MAAO,GAAIxY,EAA6B+X,KAAM/X,EAA6ByY,IAC3EpV,KAAM,mBAEH,CACY,IAAiBqV,aAAavE,EAAKnU,GAC3Ce,KAAK,KACTb,KAAKyT,eAAiBA,GAAiBa,EAAaI,KAIvD1U,KAAKyY,gBAAgBrU,YAItB,GAAG8T,EAAS,CACjB,MAAMjR,EAAS7C,EAAQwH,QAAUxH,EAAQ6C,OACnCyR,EAAY,IAAgBC,aAAa1R,GAC/C,GAAGyR,EAAW,CACZ,MAAMrS,EAASuS,EAAA,EAAkBC,WAAW5R,EAAQyR,EAAW,eAC/D,GAAGrS,EAAOyS,OAAQ,CAChB,MAAMpE,QAAYrO,EAAO/F,YACzB2X,EAAQtS,KAAK,CACX8O,IAAKC,EACL4D,MAAO,UACPnV,KAAM,oBAGRkD,EAAO/F,YAAYO,KAAM6T,IACpB1U,KAAKyT,eAAiBA,GAAiBiB,GAI1C1U,KAAKyY,gBAAgBrU,KAK3BwJ,EAAQ,IAAgBmL,aAAa9R,GAAQ,GAAM,GACnDkR,EAAS,UAAKa,OAAoB,UAAb/E,EAAI9Q,KAAmB,cAAgB,eAAe,GAG7E,IAAI+U,EAAS,CACX,MAAMe,EAAYhF,EAAIiF,WAAWzI,KAAKwI,GAA6B,2BAAhBA,EAAU7R,GAC7DwG,EAAQqL,GAAaA,EAAUrL,OAASqG,EAAIkF,UAC5ChB,EAASc,GAAaA,EAAUG,UAG9BnB,EAAQ9V,SACP,YACE,sBACD8V,EAAQtS,KAAK,CACX8O,IAAK,8CACL6D,MAAO,UACPnV,KAAM,cAGR8U,EAAQtS,KAAK,CACX8O,IAAK,kCACL6D,MAAO,UACPnV,KAAM,cAIV,CAAC,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,KAAKmD,QAAQxG,IACxC,MAAMwY,EAAQ,GAAGxY,KAAQA,IACzBmY,EAAQtS,KAAK,CACX8O,IAAK,6BAA6B6D,QAClCA,QACAnV,KAAM,iBAMd,MAAMkW,EAAW,IAAIC,cAAc,CACjC1L,QACAuK,SACAF,YAGFvF,UAAU0D,aAAaiD,SAAWA,KAG5B,kBAAkBvG,GACxB,MAAMU,EAAUxT,KAAKgT,aAAahD,IAAI8C,IAChC,OAAC7L,EAAM,IAAEJ,GAAO2M,EAEtB,OADgBA,EAAQ1K,YAAc,IAAmByQ,0BAA0BtS,EAAQJ,GAAO,IAAmB2S,iBAAiBvS,EAAQJ,GA0EzI,OAAOpF,GACZ,QAAIzB,KAAKyT,oBAIG/O,IAATjD,IACDA,EAAOzB,KAAKyT,aAAakC,QAGxB3V,KAAKyT,aAAakC,SAAWlU,IAI7BA,EACDzB,KAAKyT,aAAahS,OAElBzB,KAAKyT,aAAarS,SAGb,IA+EF,aAAa0R,GAClB9S,KAAKyZ,kBAAoB3G,EAGpB,iBAAiB5J,GACtB,OAAG,YAAUlJ,KAAKgH,cAAekC,KAIjClJ,KAAKgH,cAAgB,YAAKkC,IACnB,GAGF,mBACL,OAAOlJ,KAAKgH,cAGP,WAAW5B,EAAoBsU,EAAoB7U,GACpD7E,KAAKiV,WAiBPjV,KAAKiV,WAAW7L,QAhBhBpJ,KAAKiV,WAAa,IAAI,EAAiB,CACrClQ,UAAW,GACXC,aAAc,EACdyB,YAAcrC,IACZpE,KAAK2Z,SAASvV,GAAS,GAChB,CAAC6C,OAAQ7C,EAAQ6C,OAAQJ,IAAKzC,EAAQyC,MAE/Cd,OAAQ,CAACN,EAAMO,KACbhG,KAAK8V,SAASrQ,IAEhBoC,UAAW,KACTe,EAAA,QAAU6F,cAAc,cACxBzO,KAAKyC,UAOX,MAAMqC,OAA0CJ,IAAhC1E,KAAKgH,cAAcgB,SAChC0R,EACD1Z,KAAKiV,WAAWI,WAAWqE,EAAM7U,EAAMC,GAEvC9E,KAAKiV,WAAWnQ,QAAUA,EAG5B9E,KAAKiV,WAAW2E,iBAAiB5Z,KAAKgH,eACtChH,KAAKiV,WAAW7P,QAAUA,EAE1BpF,KAAKiV,WAAWnP,MAAK,GACrB9F,KAAKiV,WAAWnP,MAAK,GAGhB,SAASgN,EAAyB1O,GACvCpE,KAAKyT,aAAeX,EACpB9S,KAAKyT,aAAayD,OAASlX,KAAKkX,OAChClX,KAAKyT,aAAa0D,MAAQnX,KAAKmX,MAC/BnX,KAAKyT,aAAa2D,aAAepX,KAAKoX,aAEnC,iBAAkB1E,WACnB1S,KAAKyY,gBAAgBrU,GAIlB,eAAe0O,EAA0B1O,GAC9C,MAAMqP,EAAezT,KAAKyT,aAEpBoG,EAAa7Z,KAAKoB,QAOxB,OALApB,KAAK8Z,kBAAapV,GACfoO,EAAO9S,KAAKsV,SAASxC,EAAO1O,GAC1BpE,KAAKyT,kBAAe/O,EACzB1E,KAAK+Z,iBAAgB,GAEd,KACL/Z,KAAK+Z,iBAAgB,GAElBtG,IACEzT,KAAKgT,aAAahD,IAAIyD,GACvBzT,KAAKsV,SAAS7B,EAAczT,KAAK8U,kBAAkBrB,IAEnDzT,KAAK6E,QAAU7E,KAAK4E,YAIrBkO,GAAS9S,KAAKyT,eAAiBX,GAChC9S,KAAKyC,OAGJoX,GACD7Z,KAAKyB,QAKJ,gBAAgBuY,GACrBha,KAAKiW,iBAAmB+D,IAK5B,KAAenH,2BAA6BA,GAC7B,U,UCxtBA,SAASoH,GAAoBjF,EAC1CkF,EACAC,EACAC,GAEA,MAAMC,EAAeC,IACnBH,EAAO,CAACI,EAAGD,EAAME,MAAOC,EAAGH,EAAMI,MAAOJ,WAGpCK,EAAaL,IACjBpa,SAASmJ,oBAAoB,YAAagR,GAC1CrF,EAAQhU,iBAAiB,YAAa4Z,EAAa,CAACjD,MAAM,IAC1DyC,GAASA,EAAM,CAACG,EAAGD,EAAME,MAAOC,EAAGH,EAAMI,MAAOJ,WAG5CM,EAAeN,IACC,IAAjBA,EAAMO,QAKTX,EAAQ,CAACK,EAAGD,EAAME,MAAOC,EAAGH,EAAMI,MAAOJ,UACzCD,EAAYC,GAEZpa,SAASc,iBAAiB,YAAaqZ,GACvCna,SAASc,iBAAiB,UAAW2Z,EAAW,CAAChD,MAAM,KARrD3C,EAAQhU,iBAAiB,YAAa4Z,EAAa,CAACjD,MAAM,KAW9D3C,EAAQhU,iBAAiB,YAAa4Z,EAAa,CAACjD,MAAM,IAG1D,MAAMmD,EAAeR,IACnBA,EAAMS,iBACNZ,EAAO,CAACI,EAAGD,EAAMU,QAAQ,GAAGC,QAASR,EAAGH,EAAMU,QAAQ,GAAGE,QAASC,SAAS,EAAMb,WAG7Ec,EAAcd,IAClBpa,SAASmJ,oBAAoB,YAAayR,GAC1C9F,EAAQhU,iBAAiB,aAAcqa,EAAc,CAACC,SAAS,EAAO3D,MAAM,IAC5EyC,GAASA,EAAM,CAACG,EAAGD,EAAMU,QAAQ,GAAGC,QAASR,EAAGH,EAAMU,QAAQ,GAAGE,QAASC,SAAS,EAAMb,WAGrFe,EAAgBf,IACpBJ,EAAQ,CAACK,EAAGD,EAAMU,QAAQ,GAAGC,QAASR,EAAGH,EAAMU,QAAQ,GAAGE,QAASC,SAAS,EAAMb,UAClFQ,EAAYR,GAEZpa,SAASc,iBAAiB,YAAa8Z,EAAa,CAACQ,SAAS,IAC9Dpb,SAASc,iBAAiB,WAAYoa,EAAY,CAACE,SAAS,EAAO3D,MAAM,KAK3E,OAFA3C,EAAQhU,iBAAiB,aAAcqa,EAAc,CAACC,SAAS,EAAO3D,MAAM,IAErE,KACL3C,EAAQ3L,oBAAoB,YAAauR,GACzC1a,SAASmJ,oBAAoB,YAAagR,GAC1Cna,SAASmJ,oBAAoB,UAAWsR,GAExC3F,EAAQ3L,oBAAoB,aAAcgS,GAC1Cnb,SAASmJ,oBAAoB,YAAayR,GAC1C5a,SAASmJ,oBAAoB,WAAY+R,ICzD9B,MAAM,GAyBnB,YACEpY,EAQAd,EAAQ,GA7BH,KAAAqZ,WAAY,EAIX,KAAAC,OAKH,GAOK,KAAAC,gBAAiB,EACjB,KAAAC,cAAe,EACf,KAAAC,UAAW,EA0DX,KAAAtB,YAAeC,IACvBta,KAAK4b,MAAMtB,IAGH,KAAAM,YAAeN,I,MACvBta,KAAK6b,KAAO7b,KAAKC,UAAU6b,wBAC3B9b,KAAKub,WAAY,EACjBvb,KAAK4b,MAAMtB,GACXta,KAAKC,UAAUG,UAAUC,IAAI,eAClB,QAAX,EAAAL,KAAKwb,cAAM,eAAEZ,cAAe5a,KAAKwb,OAAOZ,YAAYN,IAG5C,KAAAK,UAAaL,I,MACrBta,KAAKub,WAAY,EACjBvb,KAAKC,UAAUG,UAAUuB,OAAO,eACrB,QAAX,EAAA3B,KAAKwb,cAAM,eAAEb,YAAa3a,KAAKwb,OAAOb,UAAUL,IAQ3C,KAAAvN,QAAU,K,MACf,MAAM7K,GAASlC,KAAK+b,KAAK7Z,MACzBlC,KAAKgc,UAAU9Z,IACJ,QAAX,EAAAlC,KAAKwb,cAAM,eAAES,UAAWjc,KAAKwb,OAAOS,QAAQ/Z,IAvE5C,YAAWlC,KAAMgD,GAEjBhD,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,iBAG1BL,KAAK0b,aACN1b,KAAKC,UAAUG,UAAUC,IAAI,iBACrBL,KAAKyb,gBACbzb,KAAKC,UAAUG,UAAUC,IAAI,mBAG/BL,KAAKkc,OAAShc,SAASC,cAAc,OACrCH,KAAKkc,OAAO9b,UAAUC,IAAI,yBAE1B,MAAM0b,EAAO/b,KAAK+b,KAAO7b,SAASC,cAAc,SAChD4b,EAAK3b,UAAUC,IAAI,uBAEnB0b,EAAK5Y,KAAO,QACZ4Y,EAAKI,KAAO,GAAKnc,KAAKmc,KACtBJ,EAAKzZ,IAAM,GAAKtC,KAAKsC,IACrByZ,EAAKja,IAAM,GAAK9B,KAAK8B,IACrBia,EAAK7Z,MAAQ,GAAKA,EAEfA,GACDlC,KAAKoc,YAAYla,GAGnB,MAAMma,EAAU,GAAKrc,KAAKmc,KACpBG,EAAQD,EAAQE,QAAQ,KAC9Bvc,KAAKwc,UAAsB,IAAXF,EAAe,EAAID,EAAQla,OAASma,EAAQ,EAI5Dtc,KAAKC,UAAU8J,OAAO/J,KAAKkc,OAAQH,GAGrC,YACE,OAAQ/b,KAAK+b,KAAK7Z,MAGb,YAAYsZ,GACjBxb,KAAKwb,OAASA,EAqBT,eACLxb,KAAK+b,KAAK/a,iBAAiB,QAAShB,KAAK+M,SACzC/M,KAAKyc,iBAAmBxC,GAAoBja,KAAKC,UAAWD,KAAK4a,YAAa5a,KAAKqa,YAAara,KAAK2a,WAShG,YAAYzY,GACjBlC,KAAK+b,KAAK7Z,MAAQ,GAAKA,EACvBlC,KAAKgc,WAAWhc,KAAK+b,KAAK7Z,OAGrB,YAAYA,GACjBlC,KAAK+b,KAAK7Z,MAAQ,KAAOlC,KAAK+b,KAAK7Z,MAAQA,GAC3ClC,KAAKgc,WAAWhc,KAAK+b,KAAK7Z,OAGrB,UAAUA,GACf,IAAIwa,GAAYxa,EAAQlC,KAAKsC,MAAQtC,KAAK8B,IAAM9B,KAAKsC,KACrDoa,EAAW,YAAMA,EAAU,EAAG,GAG3B1c,KAAK0b,aACN1b,KAAKkc,OAAOvZ,MAAMga,UAAY,UAAUD,KAExC1c,KAAKkc,OAAOvZ,MAAMjC,MAAoB,IAAXgc,EAAkB,IAIvC,MAAMpC,G,MACd,MAAMsC,EAAU5c,KAAK2b,SAAW3b,KAAK6b,KAAKlb,OAASX,KAAK6b,KAAKnb,MACvDmc,EAAkB,YAAM7c,KAAK2b,WAAarB,EAAMG,EAAIza,KAAK6b,KAAKiB,QAAUxC,EAAMC,EAAIva,KAAK6b,KAAKkB,KAAM,EAAGH,GAE3G,IAAI1a,EAAQlC,KAAKsC,IAAOua,EAAkBD,GAAW5c,KAAK8B,IAAM9B,KAAKsC,KAerE,OAbIJ,EAAQlC,KAAKsC,KAAStC,KAAK8B,IAAM9B,KAAKsC,KAAO,IAC/CJ,GAASlC,KAAKmc,KAAO,IAGvBja,GAASA,EAAM8a,QAAQhd,KAAKwc,UAC5Bta,EAAQ,YAAMA,EAAOlC,KAAKsC,IAAKtC,KAAK8B,KAKpC9B,KAAKoc,YAAYla,IACN,QAAX,EAAAlC,KAAKwb,cAAM,eAAES,UAAWjc,KAAKwb,OAAOS,QAAQ/Z,GAErCA,EAGF,kBACFlC,KAAKyc,mBACNzc,KAAKyc,mBACLzc,KAAKyc,iBAAmB,MAG1Bzc,KAAK+b,KAAK1S,oBAAoB,QAASrJ,KAAK+M,SAE5C/M,KAAKwb,OAAS,IChJlB,MAAMyB,GAAkBja,IACtB,GAAGA,EAAQgS,QAAS,OAAOhS,EAAQgS,QAEnC,MAAM,KAAC3H,EAAI,KAAE6P,EAAI,QAAEC,EAAO,cAAEC,EAAa,wBAAEC,GAA2Bra,EAChE+M,EAAK7P,SAASC,cAAc,OAClC4P,EAAGvG,UAAY,iBAAmB6D,EAAO,UAAYA,EAAO,IAC5D,OAAAiQ,GAAA,QAAOvN,GAEP,IAAIwN,EAAcva,EAAQua,YACtBA,IACFA,EAAcva,EAAQua,YAAcL,EAAO,eAAKA,GAAQhd,SAASC,cAAc,QAC5E6C,EAAQwa,cAAaD,EAAYtZ,UAAYjB,EAAQwa,cAG1DD,EAAYnd,UAAUC,IAAI,sBAC1B0P,EAAGhG,OAAOwT,GAEV,MAAME,IAAaL,KAAmBpa,EAAQya,SAwB9C,OArBA,YAAiB1N,EAAsD9N,IACrE,OAAAyb,EAAA,GAAYzb,IAGE,IAFCkb,EAAQlb,KAMnBwb,GACF,eAGCL,IAAkBC,IACnBD,EAAcO,QAAuC,UAA7BP,EAAcrb,MAAMoB,OAA2Bia,EAAcO,WAEtE3a,EAAQA,SAExBoa,GACDrN,EAAGhG,OAAOqT,EAAc5L,OAGnBxO,EAAQgS,QAAUjF,GAwBZ,OArBI,CAAC6N,EAAkC7P,KACpD,MAAMgC,EAAK7P,SAASC,cAAc,OAClC4P,EAAG3P,UAAUC,IAAI,YAEd0N,GACD6P,EAAQtX,QAAQiC,IACXA,EAAEvF,QACHuF,EAAEvF,QAAQ+K,eAAiBA,EAE3BxF,EAAEvF,QAAU,CAAC+K,oBAKnB,MAAMvI,EAAQoY,EAAQnV,IAAIwU,IAI1B,OAFAlN,EAAGhG,UAAUvE,GAENuK,GC7ET,MAYM8N,GAA0B,CAAC9N,EAAiBE,EAA6BjN,OACjEA,aAAO,EAAPA,EAAS+K,gBAAiB/K,EAAQ+K,eAAe1N,IAAI0P,GAAMA,EAAG/O,iBAAiBuF,KAAKwJ,IAG5F,IAAmB9N,IAErB,IAAI8N,EAAG3P,UAAUuR,SAAS,mBAAoB,OAAO,EAGrD,MAAMmM,EAAa/N,EAAGF,cAAc,aACpC,OAAA6N,EAAA,GAAYzb,GAET8N,EAAG3P,UAAUuR,SAAS,aACvB,gBAEA1B,GAAUA,EAAOhO,GACjB,aAAY6b,OAMH,OAlCU,CAAC9a,EAAuG,GAAI9B,EAAsE0c,EAAkC3N,KAC3OjN,EAAQ+a,OAAQ,EAChB,MAAMlD,EAAS,EAAW,uBAAwB7X,GAE5Cgb,EAAU,GAAWJ,EAAS5a,EAAQ+K,gBAI5C,OAHAiQ,EAAQ5d,UAAUC,IAAIa,GACtB2c,GAAwBhD,EAAQ5K,EAAQjN,GACxC6X,EAAO9Q,OAAOiU,GACPnD,G,QCTM,MAAM,WAAsB,IAWzC,cACE5X,OAAM,GAgDD,KAAAgb,aAAe,KACpBjR,aAAahN,KAAKke,qBAClBle,KAAKke,oBAAsB,EAE3B,MAAMC,EAAUne,KAAKgV,QAAQ5U,UAAUuR,SAAS,iBAChD,IAA2B,IAAxB3R,KAAKoe,gBACN,GAAIpe,KAAKqe,kBAAmBre,KAAKqe,oBAA+BF,GAAWne,KAAKoe,eAC9E,YAEG,IAAID,EACT,OAGFne,KAAKyO,cAAc,kBAAkB,GACrCzO,KAAKgV,QAAQ5U,UAAUuB,OAAO,kBAGzB,KAAA2c,aAAe,CAACC,GAAiB,KACnCve,KAAKke,qBACNlR,aAAahN,KAAKke,qBAClBle,KAAKke,oBAAsB,GAClBle,KAAKgV,QAAQ5U,UAAUuR,SAAS,mBAA4C,IAAxB3R,KAAKoe,iBAClEpe,KAAKyO,cAAc,kBAAkB,GACrCzO,KAAKgV,QAAQ5U,UAAUC,IAAI,kBAGzBke,IAAkBve,KAAKoe,iBAI3Bpe,KAAKke,oBAAsB3S,OAAOC,WAAWxL,KAAKie,aAAc,OAG3D,KAAAO,eAAkBC,IACvB,MAAMN,EAAUne,KAAKgV,QAAQ5U,UAAUuR,SAAS,iBAEhD,QAAYjN,IAAT+Z,EACEN,EAASne,KAAKie,eACZje,KAAKse,mBACL,IAAGG,IAASN,EAAS,QACX,IAATM,EAAgBze,KAAKie,eACxBje,KAAKse,iBAxFVte,KAAKke,oBAAsB,EAGtB,MAAMlb,GAMX,YAAWhD,KAAMgD,GAEjB,MAAM,eAAC+K,EAAc,QAAEiH,GAAWhV,KAE/B,sBACD+N,EAAe1N,IAAI2U,EAAnBjH,CAA4B,QAAS,KACnC/N,KAAKwe,oBAaPzQ,EAAe1N,IAAI2U,EAAnBjH,CAA4B,YAAa,KACvC/N,KAAKse,iBAGPvQ,EAAe1N,IAAI2U,EAAnBjH,CAA4B,aAAc,KACxC/N,KAAKse,cAAa,KAGpBvQ,EAAe1N,IAAI2U,EAAnBjH,CAA4B,aAAe9L,IACtCA,EAAEyc,eAAiB1e,KAAK2e,wBAA0B,OAAAC,GAAA,GAAgB3c,EAAEyc,cAAe1e,KAAK2e,wBACzF3e,KAAKse,cAAa,GAIpBte,KAAKie,kBAiDJ,aAAaY,GAClB7e,KAAKoe,eAAiBS,EAEtB7e,KAAKgV,QAAQ5U,UAAUkM,OAAO,iBAA6B,IAAZuS,GAC/C7e,KAAKwe,eAAeK,I,cCnGjB,MAAM,WAA0B,GAQrC,YAAY/L,EAA6CgM,EAAsBrD,EAA0BC,GACvGzY,MAAM,CACJkZ,KAAM,IAAO,GAAK,IAClB7Z,IAAK,EACLR,IAAK,EACL2Z,iBACAC,gBACC,GAZK,KAAAqD,YAAc,EAuDd,KAAAC,aAAe,KACvBhf,KAAK8B,IAAM9B,KAAK8S,MAAMe,SACtB7T,KAAK+b,KAAK3Y,aAAa,MAAO,GAAKpD,KAAK8B,MAGhC,KAAA2T,QAAU,KAClBzV,KAAKoc,eAGG,KAAAxH,OAAS,KACjB,IAAIqK,EAAI,KACNjf,KAAKoc,cAELpc,KAAK+e,YAAc/e,KAAK8S,MAAM6C,OAAS,EAAIpK,OAAO2T,sBAAsBD,IAGvEjf,KAAK+e,aACNxT,OAAO4T,qBAAqBnf,KAAK+e,aAGhC/e,KAAK8e,YACN9e,KAAKof,kBAGPpf,KAAK+e,YAAcxT,OAAO2T,sBAAsBD,IAGxC,KAAAI,aAAe,KACpBrf,KAAK8S,MAAM6C,SACZ3V,KAAKoc,cAEFpc,KAAK8e,YACN9e,KAAKof,oBAKD,KAAAE,WAAcrd,IACtBjC,KAAKof,mBA/EFtM,GACD9S,KAAKsV,SAASxC,EAAOgM,GAIlB,SAAShM,EAAyBgM,GAAa,GACjD9e,KAAK8S,OACN9S,KAAKuf,kBAGJT,IAAe9e,KAAKwf,YACrBxf,KAAKwf,WAAatf,SAASC,cAAc,OACzCH,KAAKwf,WAAWpf,UAAUC,IAAI,wBAAyB,yBACvDL,KAAKC,UAAUwf,QAAQzf,KAAKwf,aAEpBxf,KAAKwf,YACbxf,KAAKwf,WAAWpf,UAAUkM,OAAO,QAASwS,GAG5C9e,KAAK8S,MAAQA,EACb9S,KAAK8e,WAAaA,IACdhM,EAAM6C,QAAU7C,EAAMY,YAAc,IACtC1T,KAAK4U,SAGP,IAAIiF,GAAa,EACjB7Z,KAAK0f,aACL1f,KAAK2f,eACL3f,KAAK4f,YAAY,CACfhF,YAAa,KACXf,GAAc7Z,KAAK8S,MAAM6C,OACzBkE,GAAc7Z,KAAK8S,MAAM1R,SAG3BuZ,UAAY1Y,IAEV4X,GAAc7Z,KAAK8S,MAAMrR,UA8CrB,MAAMQ,GACd,MAAM4d,EAAY5c,MAAM2Y,MAAM3Z,GAE9B,OADAjC,KAAK8S,MAAMY,YAAcmM,EAClBA,EAGC,kBACR,GAAG,GAA2BC,kBAAkB9f,KAAK8S,OAAQ,OAC7D,MAAMiN,EAAM/f,KAAK8S,MAAMkN,SACjBC,EAAYF,EAAI5d,OAEhBuR,EAAc1T,KAAK8S,MAAMY,YAC/B,IAAIwM,EAAe,EAAGC,EAAM,EAC5B,IAAI,IAAInV,EAAI,EAAGA,EAAIiV,IAAajV,EAAG,CACjC,MAAMoV,EAAQL,EAAIK,MAAMpV,GACrB0I,GAAe0M,GAASA,GAASF,IAClCA,EAAeE,EACfD,EAAMJ,EAAII,IAAInV,IAQlB,MAAM0R,EAAW1c,KAAK8S,MAAMe,SAAWsM,EAAMngB,KAAK8S,MAAMe,SAAW,EACnE7T,KAAKwf,WAAW7c,MAAMjC,MAAoB,IAAXgc,EAAkB,IAIzC,aACR1c,KAAK8B,IAAM9B,KAAK8S,MAAMe,UAAY,EAC/B7T,KAAK8B,IAAM,EACZ9B,KAAKgf,eAELhf,KAAK8S,MAAM9R,iBAAiB,aAAchB,KAAKgf,cAI5C,cACL,GAAG,GAA2Bc,kBAAkB9f,KAAK8S,OAAQ,OAC7D,MAAMY,EAAc1T,KAAK8S,MAAMY,YAE/BzQ,MAAMmZ,YAAY1I,GAGb,eACLzQ,MAAM0c,eACN3f,KAAK8S,MAAM9R,iBAAiB,QAAShB,KAAKyV,SAC1CzV,KAAK8S,MAAM9R,iBAAiB,OAAQhB,KAAK4U,QACzC5U,KAAK8S,MAAM9R,iBAAiB,aAAchB,KAAKqf,cAC/Crf,KAAK8e,YAAc9e,KAAK8S,MAAM9R,iBAAiB,WAAYhB,KAAKsf,YAG3D,kBACLrc,MAAMsc,kBAENvf,KAAK8S,MAAMzJ,oBAAoB,aAAcrJ,KAAKgf,cAClDhf,KAAK8S,MAAMzJ,oBAAoB,QAASrJ,KAAKyV,SAC7CzV,KAAK8S,MAAMzJ,oBAAoB,OAAQrJ,KAAK4U,QAC5C5U,KAAK8S,MAAMzJ,oBAAoB,aAAcrJ,KAAKqf,cAClDrf,KAAK8e,YAAc9e,KAAK8S,MAAMzJ,oBAAoB,WAAYrJ,KAAKsf,YAEhEtf,KAAK+e,cACNxT,OAAO4T,qBAAqBnf,KAAK+e,aACjC/e,KAAK+e,YAAc,IAKlB,MAAM,WAAuB,GAIlC,YAAsBhR,EAA0C4N,GAAW,GACzE1Y,MAAM,CACJkZ,KAAM,IACN7Z,IAAK,EACLR,IAAK,EACL6Z,YACC,GANiB,KAAA5N,iBAA0C,KAAA4N,WAyCxD,KAAA0E,YAAepe,IACrBA,GAAK,OAAAyb,EAAA,GAAYzb,GACjB,GAA2BkV,OAAS,GAA2BA,OAGzD,KAAAmJ,UAAY,KAElB,MAAM,OAACpJ,EAAM,MAAEC,GAAS,GACxB,IAAIoJ,EAEFA,GADErJ,GAAUC,EACR,kWACID,EAAS,GACb,8LACIA,EAAS,GAAKA,EAAS,IAC3B,yBAEA,2FAGN,IACElX,KAAKwgB,UAAUvc,UAAY,YAAYsc,aACvC,MAAM9T,IAEJzM,KAAKub,WACPvb,KAAKoc,YAAYjF,EAAQ,EAAID,IAzD/BlX,KAAK2f,eACL3f,KAAK4f,YAAY,CACf3D,QAASvI,IACP,MAAMxR,EAAQG,KAAKP,IAAIO,KAAKC,IAAIoR,EAAa,GAAI,GAIjD,GAA2ByD,OAAQ,EACnC,GAA2BD,OAAShV,KAQxClC,KAAKygB,IAAMvgB,SAASC,cAAc,OAClCH,KAAKygB,IAAIrgB,UAAUC,IAAI,iBAEvBL,KAAKygB,IAAIxc,UAAY,+GAGrBjE,KAAKygB,IAAIrgB,UAAUC,IAAI,YACvBL,KAAKwgB,UAAYxgB,KAAKygB,IAAIC,kBAE1B1gB,KAAKygB,IAAI1W,OAAO/J,KAAKC,WAErB,YAAiBD,KAAKwgB,UAAWxgB,KAAKqgB,YAAa,CAACtS,eAAgB/N,KAAK+N,iBACzE/N,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,wBAAyBA,KAAKsgB,WAEjEtgB,KAAKsgB,aAgCM,MAAM,WAAoB,GAUvC,YAAsBK,EAAyBlf,GAAO,EAAOqd,GAAa,EAAOjL,GAyB/E,GAxBA5Q,QADoB,KAAA0d,QAGpB3gB,KAAK4gB,QAAU1gB,SAASC,cAAc,OACtCH,KAAK4gB,QAAQxgB,UAAUC,IAAI,gBAE3BL,KAAK+N,eAAiB,IAAI,IAE1B/N,KAAK6gB,MAAM,CACT7L,QAAShV,KAAK4gB,QACd7S,eAAgB/N,KAAK+N,eACrBsQ,gBAAiB,KACPre,KAAK2gB,MAAMhL,OAErBgJ,uBAAwB,yBAG1BgC,EAAMG,WAAWC,aAAa/gB,KAAK4gB,QAASD,GAC5C3gB,KAAK4gB,QAAQI,YAAYL,GAEzB3gB,KAAKihB,KAAO,UAEZjhB,KAAKkhB,YAAYrN,GAGA,YAAd7T,KAAKihB,KAAoB,CAC1B,MAAME,EAAWnhB,KAAK4gB,QAAQ/Q,cAAc,qCAC5C7P,KAAKohB,SAAW,IAAI,GAAkBT,EAAO7B,GAC7CqC,EAAS1B,QAAQzf,KAAKohB,SAASnhB,WAGjC,GAAGwB,EAA4B,CACbkf,EAAMlf,OACd+K,MAAOC,IACG,oBAAbA,EAAInD,OACLqX,EAAMxJ,OAAQ,EACdwJ,EAAMlgB,UAAW,EACjBkgB,EAAMlf,UAEP4f,QAAQ,KACTrhB,KAAK4gB,QAAQxgB,UAAUkM,OAAO,cAAetM,KAAK2gB,MAAMhL,WAMtD,YAAY2L,GAClB,MAAM,QAACV,EAAO,MAAED,EAAK,KAAEM,EAAI,eAAElT,GAAkB/N,KAE/C4gB,EAAQxgB,UAAUC,IAAI4gB,GAEtB,MAAMjd,EAAOhE,KAAKuhB,gBAElB,IAAIC,EAEJ,GAHAZ,EAAQa,mBAAmB,YAAazd,GAG5B,YAATid,EAAoB,CACrB,MAAM3U,EAASsU,EAAQ9Q,iBAAiB,WAClC4R,EAAmBd,EAAQ/Q,cAAc,eACzC8R,EAAcf,EAAQ/Q,cAAc,iBAC1C2R,EAAeZ,EAAQ/Q,cAAc,kBACrC2R,EAAavd,UAAY2d,OAAwB,EAAjBjB,EAAM9M,UAAcgO,WAEpD,MAAMC,EAAiB,IAAI,GAAe/T,GAEpCgU,EAAenB,EAAQ/Q,cAAc,kBAC3CiS,EAAerB,IAAIrgB,UAAUuB,OAAO,YACpCogB,EAAahB,aAAae,EAAerB,IAAKkB,EAAY7Q,eAE1D3I,MAAMC,KAAKkE,GAAQhG,QAASuU,IAC1B9M,EAAe1N,IAAIwa,EAAnB9M,CAA2B,QAAS,KAClC/N,KAAKgiB,iBAIL,wBACFjU,EAAe1N,IAAIsgB,EAAnB5S,CAA0B,QAAS,KACjC/N,KAAKgiB,eAGPjU,EAAe1N,IAAIH,SAAnB6N,CAA6B,UAAY9L,IACvC,GAAG2G,EAAA,QAAUqZ,eAAiB,EAC5B,OAGF,MAAM,IAAC1T,EAAG,KAAE2T,GAAQjgB,EAEpB,IAAIkgB,GAAO,EAkBX,MAjBY,SAATD,EACDliB,KAAKoiB,mBACY,SAATF,EACR,GAA2B/K,OAAS,GAA2BA,MAC9C,UAAT+K,EACRliB,KAAKgiB,aACG/f,EAAEogB,QAAmB,UAATH,EACpB,GAA2B9K,cAAgB,IACnCnV,EAAEogB,QAAmB,UAATH,EACpB,GAA2B9K,cAAgB,KACnCwJ,EAAQxgB,UAAUuR,SAAS,qBAAgC,cAARpD,GAA+B,eAARA,EAIlF4T,GAAO,EAHI,cAAR5T,EAAqB,GAA2BgF,aAAa,CAAChP,OAAQ,iBACpE,GAA2BqP,YAAY,CAACrP,OAAQ,gBAKpD4d,GACD,OAAAzE,EAAA,GAAYzb,IACL,QAFT,KAkBJ8L,EAAe1N,IAAIsgB,EAAnB5S,CAA0B,WAAY,KAChC,uBACF/N,KAAKoiB,qBAITrU,EAAe1N,IAAIqhB,EAAnB3T,CAAqC,QAAS,KAC5C/N,KAAKoiB,qBAGP,aAAsBxB,EAAS5gB,KAAKsiB,aAAa/b,KAAKvG,KAAM0hB,GAAmB3T,GAE/EA,EAAe1N,IAAIsgB,EAAnB5S,CAA0B,aAAc,KACtC4T,EAAY1d,UAAY2d,OAA2B,EAApBjB,EAAMjN,aAAiBmO,aAGxD9T,EAAe1N,IAAIsgB,EAAnB5S,CAA0B,OAAQ,KAChC6S,EAAQxgB,UAAUC,IAAI,WACrB,CAACsX,MAAM,IAEV5J,EAAe1N,IAAIsgB,EAAnB5S,CAA0B,QAAS,KACjC/N,KAAKse,cAAa,KAItBvQ,EAAe1N,IAAIsgB,EAAnB5S,CAA0B,OAAQ,KAChC6S,EAAQxgB,UAAUC,IAAI,gBAGxB0N,EAAe1N,IAAIsgB,EAAnB5S,CAA0B,QAAS,KACjC6S,EAAQxgB,UAAUuB,OAAO,gBAGxBgf,EAAM9M,UAAYyN,EACnBE,EAAavd,UAAY2d,OAAOvf,KAAKE,MAAMoe,EAAM9M,UAAYyN,IAAeO,WAE5E,aAAYlB,GAAO9f,KAAK,KACtB2gB,EAAavd,UAAY2d,OAAOvf,KAAKE,MAAMoe,EAAM9M,WAAWgO,aAKxD,aACR7hB,KAAK2gB,MAAM3gB,KAAK2gB,MAAMhL,OAAS,OAAS,WAGlC,gBACN,MAAMsL,EAAOjhB,KAAKihB,KAClB,GAAY,YAATA,EACD,MAAO,0BACUA,iFACHA,gEACAA,mJAGkBA,oVAQAA,gIACAA,uHAO1B,mBACR,MAAMrD,EAA4C,CAAC,IAAM,GAAK,EAAG,KAAM,IAAK,GAAGnV,IAAK8Z,IAC3E,CACL/E,YAAsB,IAAT+E,EAAa,SAAW,GAAKA,EAC1CpF,QAAS,KACPnd,KAAK2gB,MAAMvJ,aAAemL,MAI1BvE,EAAU,GAAWJ,GACrB4E,EAAiBxiB,KAAK4gB,QAAQ/Q,cAAc,aAClDmO,EAAQ5d,UAAUC,IAAI,YACtBwd,GAAwB2E,GACxBA,EAAezY,OAAOiU,GAGd,mBACR,MAAMyE,EAASziB,KAAK4gB,QAGpB,GAAG,mBAAiB,CAClB,MAAMD,EAAQ3gB,KAAK2gB,MAGnB,OAFAA,EAAM+B,6BACN/B,EAAMgC,kBAIJ,eAyBF,eAdA,aAAkBF,GAkBZ,aAAaf,GACrB,MAAMkB,EAAS,eACf5iB,KAAK4gB,QAAQxgB,UAAUkM,OAAO,mBAAoBsW,GAC9CA,GAKFlB,EAAiBthB,UAAUuB,OAAO,oBAClC+f,EAAiBthB,UAAUC,IAAI,qBAC/BqhB,EAAiBte,aAAa,QAAS,sBANvCse,EAAiBthB,UAAUuB,OAAO,qBAClC+f,EAAiBthB,UAAUC,IAAI,oBAC/BqhB,EAAiBte,aAAa,QAAS,gBAQpC,kBACLH,MAAMyL,UACN1O,KAAK+N,eAAeO,YACpBtO,KAAKohB,SAAS7B,mB,yCCthBH,SAASsD,GAA6CC,GACnE,OCHa,SAAmDC,EAAgCD,GAChG,IACI7U,EADA+U,GAAU,EAGd,MAAO,IAAIC,KACThV,EAAOgV,EAEFD,IACHA,GAAU,EAEVD,EAAY,KACVC,GAAU,EAEVF,KAAM7U,ODVLiV,CAAa,KAASJ,G,aEwE/B,SAASK,GAAiBC,GACxBA,EAAQhjB,UAAUC,IAAI,YAEtB,MAAM+D,EAAUgf,EAAQhf,QAClB6P,EAAM,IAAmBsB,oBAAoBnR,GAEhDA,EAAQkT,OAAO+L,KAChBD,EAAQhjB,UAAUC,IAAI,UAGxB,MAGMijB,EAAeC,EAAA,EAAWC,SAAW,GAAK,GAG1CC,EAAOF,EAAA,EAAWC,SAAW,IAAM,IACnCE,EAAOH,EAAA,EAAWC,SAAW,IAAM,IACnC3P,EAAWI,EAAIJ,SACf8P,EAAS,YAAM9P,EAAW,GAAK6P,EAAMD,EAAMC,GAE3CE,EAAM1jB,SAAS2jB,gBAAgB,6BAA8B,OACnED,EAAIxjB,UAAUC,IAAI,kBAClBujB,EAAIE,eAAe,KAAM,QAAS,GAAKH,GACvCC,EAAIE,eAAe,KAAM,SAAU,GAAKR,GACxCM,EAAIE,eAAe,KAAM,UAAW,OAAOH,KAAUL,KAErD,MAAMS,EAAU7jB,SAASC,cAAc,OACvC4jB,EAAQ3jB,UAAUC,IAAI,cACtB+iB,EAAQrZ,OAAO6Z,EAAKG,GAEpB,IAAIC,EAAY/P,EAAIiF,WAAWzI,KAAKwI,GAA6B,2BAAhBA,EAAU7R,GAA6E4c,UAAY,IAAIC,WAAW,IACnKD,EArEK,SAAwBA,GACxBA,aAAoBC,aACvBD,EAAW,IAAIC,WAAWD,IAG5B,MACME,EAD6B,EAAlBF,EAAS7hB,OACI,EAAI,EAClC,IAAI+hB,EACF,OAAO,IAAID,WAAW,IAGxB,IAAI5d,EACJ,IACE,MAAM8d,EAAW,IAAIC,SAASJ,EAASK,QACvChe,EAAS,IAAI4d,WAAWC,GACxB,IAAI,IAAIlZ,EAAI,EAAGA,EAAIkZ,EAAYlZ,IAAK,CAClC,MAAMsZ,EAAgB,EAAJtZ,EAAQ,EAAI,EACxBuZ,EAAe,EAAJvZ,EAAQ,EACnB9I,EAAQiiB,EAASK,UAAUF,GAAW,GAC5Cje,EAAO2E,GAAM9I,GAASqiB,EAAY,IAEpC,MAAM9X,GACNpG,EAAS,IAAI4d,WAAW,IAY1B,OAAO5d,EAmCIoe,CAAeT,EAASvgB,MAAM,EAAG,KAI5C,MAAMihB,EAAYriB,KAAKP,OAAOkiB,GACxBW,EAASX,EAAS7hB,OAAS6hB,EAAS7hB,OAAS,IAC7CyiB,EAAWviB,KAAKC,IAAKqhB,EAAS,EAA0B,EAAGgB,GAEjE,IAAIE,EAAW,EACf,MAAMC,EAAWxB,EA7BI,EA+BrB,IAAItf,EAAO,GACX,IAAI,IAAIgH,EAAI,EAAG+Z,EAAO,EAAGC,EAAO,EAAGha,EAAI2Z,IAAU3Z,EAAG,CAClD,MAAM9I,EAAQ8hB,EAAShZ,IAAM,EAC7B,GAAIga,EAAOJ,GAAaD,EAAQ,CAC9BK,EAAOA,EAAOJ,EAAWD,EACzBK,GAAQJ,EAAW,GAAK,GACvBC,EAAW3iB,IAAO2iB,EAAW3iB,GAG9B,MAAM+iB,EAAY5iB,KAAKP,KAAM+iB,EAAWC,GAAcJ,EAAY,GAAK,IAAOA,EAAY,GAxCzE,GA6CjB1gB,GAHU,oBACC+gB,SAAYzB,EAAe2B,wBAA0CA,mCAIhFF,GAAQG,EAGNL,EADCG,GAAQJ,EAAW,GAAK,EACd,EAEA1iB,OAGV2iB,EAAW3iB,IAAO2iB,EAAW3iB,GAEhC8iB,GAAQJ,EAIZhB,EAAInC,mBAAmB,YAAazd,GACpC,MAAMmhB,EAAQhd,MAAMC,KAAKwb,EAAIwB,UAE7B,IAAIhE,EAAWgC,EAAQvT,cAAc,mBA+ErC,MA7Ee,KACb,IAAIwV,EAAQjC,EAAQiC,MAEpB,MAAMhG,EAAe,KACnB,MAAMiG,EAAYD,EAAM3R,cAAgB2R,EAAMxR,SAAW,EAAIxR,KAAKkjB,KAAKF,EAAM3R,YAAc2R,EAAMxR,SAAW+Q,GAI5GO,EAAM7e,QAAQ,CAACkf,EAAMnhB,IAAQmhB,EAAKplB,UAAUkM,OAAO,SAAUjI,EAAMihB,OAMjED,EAAM1P,QAAW0P,EAAM3R,YAAc,GAAK2R,EAAM3R,cAAgB2R,EAAMxR,WACxEwL,IAGF,MAAMoG,EAAsB5C,GAAgBxD,GAoD5C,OAnDA+D,EAAQsC,iBAAiB,aAAcD,GACvCrC,EAAQsC,iBAAiB,QAASD,GAElCrC,EAAQuC,aAAa9kB,KAAK,KACxB,IAAI0a,GAAY,EAAOqK,GAAY,EAiCnC,SAAShK,EAAM3Z,GACb,IAAI4jB,EACJ,GAAG5jB,aAAa6jB,WACdD,EAAU5jB,EAAE4jB,YACP,CACL,MAAMhK,EAAQ5Z,EAAE4S,OAAuBiH,wBACvC+J,EAAU5jB,EAAE8jB,cAAc,GAAGvL,MAAQqB,EAAKkB,KAG5C,MAAM8C,EAAYgG,EAAUlC,EAAqB0B,EAAMxR,SACvDwR,EAAM3R,YAAcmM,EA1CtBuB,EAASpgB,iBAAiB,aAAeiB,IACpCsZ,IACD8J,EAAM5jB,OACN8Z,GAAY,GAEdqK,GAAY,IAEdxE,EAASpgB,iBAAiB,YAAciB,IACtC2jB,GAAY,EACTrK,GAAWK,EAAM3Z,KAEtBmf,EAASpgB,iBAAiB,YAAciB,IACtCA,EAAE8Y,iBACc,IAAb9Y,EAAE4Y,SACDwK,EAAM1P,QACR0P,EAAMjkB,QAGRwa,EAAM3Z,GACNsZ,GAAY,KAEd6F,EAASpgB,iBAAiB,UAAYiB,IACjC2jB,GAAarK,IACd8J,EAAM5jB,OACN8Z,GAAY,KAGhB,YAAiB6F,EAAWnf,IAC1B,OAAAyb,EAAA,GAAYzb,GACRojB,EAAM1P,QAAQiG,EAAM3Z,MAezB+jB,GAAA,GAEI,KACL5E,EAASzf,SACTyf,EAAW,KACXiE,EAAQ,OAqGd,SAASY,GAA2BC,GAAiB,GACnD,MAAMC,EAAY,IAAI,KAAqB,CAACC,YAAY,EAAMF,mBAQ9D,OAPAC,EAAUE,YAENH,IACFC,EAAUG,OAAOxC,eAAe,KAAM,IAAK,MAC3CqC,EAAUI,YAAc,cAGnBJ,EApTTvd,EAAA,QAAU5H,iBAAiB,sBAAuB,EAAEiH,OAAMhB,aACxDgB,EAAK3B,QAAQO,IACX,MAAM2f,EAAO,cAAc3f,qBAAuBI,MACjDkB,MAAMC,KAAKlI,SAAS4P,iBAAiB,0BAA0B0W,4BAA+BA,MAA4BlgB,QAAQvC,IACjIA,EAAK3D,UAAUuB,OAAO,mBAmTrB,MAAM8kB,GAAoBvgB,IAC/B,IAAIwT,EAAmB7U,EAErB,MAAM6hB,GAAaxgB,EAAO9F,UAAUuR,SAAS,qBACvC1R,EAAY,OAAA2e,GAAA,GAAgB1Y,EAASwgB,EAAyB,gBAAb,YACvD,GAAGzmB,EAAW,CACZ,MAAMumB,EAAO,+BACPG,EAAoB,wBAAwBH,EAClD,IAAII,EAOJ,GAHEA,EAHE1gB,EAAO2gB,QAAQF,GAGL,CAACA,GAFD,CAAC,kBAAkBH,EAAQ,eAAeA,GAKrDE,EAAW,CACZ,MAAMI,EAAS,yBACfF,EAAYA,EAAUne,IAAIoN,GAAKiR,EAASjR,GAG1C,MAAMkR,EAAWH,EAAUI,KAAK,MAE1BC,EAAW9e,MAAMC,KAAKnI,EAAU6P,iBAAiBiX,IACjD1iB,EAAM4iB,EAAS1K,QAAQrW,GAEvBghB,EAA0BD,EAASxe,IAAIuM,IAAW,CAAE/N,OAAQ+N,EAAQ5I,QAAQnF,OAAOkgB,WAAYtgB,KAAMmO,EAAQ5I,QAAQvF,OAE3H6S,EAAOwN,EAAWzjB,MAAM,EAAGY,GAC3BQ,EAAOqiB,EAAWzjB,MAAMY,EAAM,GAIlC,MAAO,CAACqV,EAAM7U,IAGD,MAAM,WAAqBuiB,YAA1C,c,oBAIS,KAAAC,UAAW,EACX,KAAAC,cAAe,EAEf,KAAAC,YAAa,EAKZ,KAAAxZ,eAAiB,IAAI,IAKtB,S,QACL/N,KAAKI,UAAUC,IAAI,SAEnBL,KAAKoM,QAAQvF,IAAM,GAAK7G,KAAKoE,QAAQyC,IACrC7G,KAAKoM,QAAQnF,OAAS,GAAKjH,KAAKoE,QAAQ6C,OAExC,MAAMgN,EAAkB,IAAmBsB,oBAAoBvV,KAAKoE,SAC9DojB,EAA2B,UAAbvT,EAAI9Q,KAClB+U,GAAWlY,KAAKsnB,cAAgBE,EAChCC,EAAaznB,KAAKoE,QAAQkT,OAAOoQ,YACjCC,EAAYF,GAAcznB,KAAKmmB,UAE/ByB,EAAchG,OAAsB,EAAf3N,EAAIJ,UAAcgO,WAE7C7hB,KAAKiE,UAAY,wOAQjB,MAAMqI,EAAStM,KAAK0gB,kBAEdmH,EAAc3nB,SAASC,cAAc,OAC3C0nB,EAAYznB,UAAUC,IAAI,kBAEI,UAAb4T,EAAI9Q,MAAoBnD,KAAKoE,SAAWpE,KAAKoE,QAAQkT,OAAOE,cAE3ExX,KAAKI,UAAUC,IAAI,aAGlBsnB,IACD3nB,KAAKI,UAAUC,IAAI,eACnBL,KAAK+J,OAAO8d,IAGd,MAAMC,EAAa5P,EAAUiL,GAAiBnjB,MAnMlD,SAAmBojB,GACjB,MAAMiE,EAAWjE,EAAQiE,SAEnBjjB,EAAUgf,EAAQhf,QAClB6P,EAAkB,IAAmBsB,oBAAoBnR,GAEzD8T,EAAuB,UAAbjE,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,KACtC4kB,EAAgB7nB,SAASC,cAAc,OAG7C,GAFA4nB,EAAc3nB,UAAUC,IAAI,sBAExB6X,EAAS,CACX,MAAM8P,EAA2B,GAC9B/T,EAAIgU,gBACLD,EAAMriB,KAAK,OAAAuiB,GAAA,GAAWjU,EAAIgU,iBAGzBZ,EACDW,EAAMriB,KAAK,aAAmBvB,EAAQ+jB,OAC7BH,EAAM7lB,QACf6lB,EAAMriB,KAAK,YAAYsO,EAAInU,OAG1BsjB,EAAQmE,YACTS,EAAMriB,KAAK,IAAmByiB,iBAAiBhkB,IAGjD2jB,EAAche,UAAU,2BAAiBie,EAAO,QAQlD5E,EAAQ3B,mBAAmB,YALd,wJAOb,MAAM4G,EAAUjF,EAAQvT,cAAc,gBAEhCyY,EAAmB,IAAI,KAC7BA,EAAiBlc,QAAQmc,WAAanF,EAAQhX,QAAQmc,WACnDrQ,EACDoQ,EAAiBve,OAAO,IAAmBqe,iBAAiBhkB,IAE5DkkB,EAAiBrkB,UAAYgQ,EAAIuU,YAAcvU,EAAIwU,SAGrDJ,EAAQte,OAAOue,GAEZlF,EAAQmE,YACTc,EAAQte,OAAO,IAAmB2e,aAAatkB,IAGjD,MAAMukB,EAAcvF,EAAQvT,cAAc,mBAuC1C,OAtCA8Y,EAAY5e,OAAOge,GAEJ,KACb,IAAIa,GAAW,EAEXC,EAAe,IAAI,GAAkBzF,EAAQiC,MAAOpR,EAAIG,mBAE5DgP,EAAQsC,iBAAiB,QAAS,KAChCtC,EAAQhjB,UAAUuB,OAAO,uBAEzBgnB,EAAYG,UAAUC,YAAYhB,GAClCa,GAAW,IAGb,MAAMhU,EAAS,KACTgU,IACFxF,EAAQhjB,UAAUC,IAAI,uBACtBuoB,GAAW,EAERC,GACDF,EAAYG,UAAUC,YAAYF,EAAa5oB,aAWrD,OANAmjB,EAAQsC,iBAAiB,OAAQ9Q,KAE7BwO,EAAQiC,MAAM1P,QAAUyN,EAAQiC,MAAM3R,YAAc,IACtDkB,IAGK,KACLiU,EAAatJ,kBACbsJ,EAAa5oB,UAAU0B,SACvBknB,EAAe,OA4GqCG,CAAUhpB,MAE1DipB,EAAejpB,KAAK6P,cAAc,eACxCoZ,EAAahlB,UAAY2jB,EAEzB,MAAMsB,EAASlpB,KAAKkpB,OAAU7R,IAC5BrX,KAAKkpB,YAASxkB,EAEd,MAAM2gB,EAAQrlB,KAAKqlB,MAAQ,GAA2B1L,SAAS3Z,KAAKoE,QAASiT,GAEvEsO,EAAe3lB,KAAK2lB,aAAe,eACtC3lB,KAAKqlB,MAAM8D,YAAcnpB,KAAKqlB,MAAM+D,kBAAmBzD,EAAa1f,UAErEjG,KAAK0lB,iBAAiB,UAAW,IAAMC,EAAa1f,UAAW,CAAC0R,MAAM,IAGxE3X,KAAKqpB,iBAAmBvB,IAExB,MAAMwB,EAAa,IAAM1H,OAA2B,EAApByD,EAAM3R,aAAiBmO,YAAc3J,EAAW,MAAQ0P,EAAe,IAEjGhT,EAAS,KACbqU,EAAaM,UAAYD,IACzBhd,EAAOlM,UAAUkM,OAAO,WAAY+Y,EAAM1P,WAGxC0P,EAAM1P,QAAW0P,EAAM3R,YAAc,GAAK2R,EAAM3R,cAAgB2R,EAAMxR,WACxEe,IAGF,MAAMoN,EAAa,CAAC/f,EAAW0T,EAAS0P,EAAM1P,UAG5C,GAFA1T,GAAK,OAAAyb,EAAA,GAAYzb,GAEd0T,EAAQ,CACT,MAAM6T,IAAqBxpB,KAAKgH,cAChC,GAAG,GAA2B4S,iBAAiB5Z,KAAKgH,eAAiB,CACnEC,OAAQ,KACRE,YAAa,CAACC,EAAG,4BACjB+B,WAAW,IACT,CACF,MAAOuQ,EAAM7U,GAAS2kB,EAAwB/C,GAAiBzmB,MAAtB,GACzC,GAA2BqV,WAAW,CAACpO,OAAQjH,KAAKoE,QAAQ6C,OAAQJ,IAAK7G,KAAKoE,QAAQyC,KAAM6S,EAAM7U,GAGpGwgB,EAAM5jB,OAAO+K,MAAM,aAEnB6Y,EAAMjkB,SAsBV,OAlBA,YAAiBkL,EAASrK,GAAM+f,EAAW/f,GAAI,CAAC8L,eAAgB/N,KAAK+N,iBAErE/N,KAAK0lB,iBAAiB,QAAS,KAC7BpZ,EAAOlM,UAAUuB,OAAO,WACxBsnB,EAAaM,UAAY3B,IAG3B5nB,KAAK0lB,iBAAiB,aAAc,MAC7BL,EAAM3R,aAAe2R,EAAM1P,QAAW,GAA2BmK,kBAAkBuF,KACxF4D,EAAaM,UAAYD,OAG3BtpB,KAAK0lB,iBAAiB,QAAS,KAC7BpZ,EAAOlM,UAAUuB,OAAO,aAG1B3B,KAAK0lB,iBAAiB,OAAQ9Q,GAEvBoN,GAGT,GAAa,QAAV,EAAA/N,EAAImE,cAAM,eAAEjW,OAAQ,CACrB,MAAMsnB,EAA2B,GAC3BC,EAAUC,GAAU,CACxBnlB,MAAOyP,EACP7P,QAAS,KACTnE,UAAWqM,EACXsd,SAAU,GACVC,UAAW,GACXC,aAAc9pB,KAAK8pB,aACnBC,kBAAkB,EAClBC,cAAehqB,KAAKgqB,gBAEtB1d,EAAO3J,MAAMjC,MAAQ4L,EAAO3J,MAAMhC,OAAS,GACxC+oB,EAAQO,OAAOC,OAAOT,EAAK9jB,KAAK+jB,EAAQO,OAAOC,OAC/CR,EAAQO,OAAOE,MAAMV,EAAK9jB,KAAK+jB,EAAQO,OAAOE,MAEjDnqB,KAAKI,UAAUC,IAAI,oBACnBopB,EAAKnjB,QAAQ8jB,GAAOA,EAAIhqB,UAAUC,IAAI,gBAGxC,GAAIonB,EAsHME,IACR3nB,KAAKoM,QAAQqb,WAAa,IAC1BznB,KAAKmmB,UAAUkE,OAAOxC,GAAa,QAxHrB,CACd,IAAI1B,EAAkCnmB,KAAKmmB,UAE3C+C,EAAoB,UAAbjV,EAAI9Q,OAAqBnD,KAAKsqB,gBAErC,MAAMrL,EAAKsL,IACT,GAAGvqB,KAAKqlB,MAAM5Q,IACZ,OAGF,GAA2BuB,2BAA2BhW,KAAKoE,QAAQ6C,OAAQjH,KAAKoE,QAAQyC,IAAK7G,KAAKoE,QAAQkT,OAAOC,cAEjH,MAAMiT,EAAiB,KAClBD,IACD,GAA2BzQ,aAAa9Z,KAAKqlB,OAE1C,eAAcrlB,KAAKqlB,MAAM5kB,WAC1BT,KAAKqlB,MAAM5kB,UAAW,KAO5B,GAFA+pB,KAEIrE,EACF,GAAGlS,EAAIG,kBAAmB,CAGxB,IAAIqW,EAFJzqB,KAAKI,UAAUC,IAAI,mBAGnB,MAAMuU,EAAS,KACb,MAAMuR,EAAYF,IAA2B,GACvCrO,EAAW,eACjBA,EAAS8S,UAAU,CAACC,KAAM,GAAIC,MAAO,MACrChT,EAASpL,MAAM,KACbxM,KAAKqlB,MAAMjkB,QACX,GAA2B0Y,kBAAapV,KAE1CkT,EAASiT,OAAS,KAChBjT,EAASiT,OAAS7E,GAAA,EAClB,MAAMvZ,EAAM,IAAIqe,MACfre,EAAYtJ,KAAO,WACpByU,EAASmT,OAAOte,IAElB0Z,EAAUkE,OAAOxC,GAAa,EAAOjQ,GAErC6S,EAAgBzqB,KAAK0lB,iBAAiB,QAAS,KAC7C9N,EAASiT,UACR,CAAClT,MAAM,IAEV6S,KAOIQ,EAAoBhrB,KAAK0lB,iBAAiB,OAAQ9Q,GACxD5U,KAAK2lB,aAAa9kB,KAAK,KACrBb,KAAK+N,eAAepM,OAAOqpB,GAC3BhrB,KAAK+N,eAAepM,OAAO8oB,SAExB,CACLtE,EAAYF,KAERsE,IACFvqB,KAAK2lB,aAAe,gBAGtB,MAAM7f,EAAO,KACX0kB,IAEA,MAAMS,EAAW,IAAelT,YAAY9D,GAS5C,OAPIsW,GACFU,EAASpqB,KAAK,KACZb,KAAK2lB,aAAa1f,YAItBkgB,EAAUkE,OAAOxC,GAAa,EAAOoD,GAC9B,CAACA,aAGV9E,EAAU+E,oBAAoBplB,GAC9BA,IAIJ9F,KAAK+J,OAAO8d,GAEZ7nB,KAAKI,UAAUC,IAAI,eAEnBL,KAAK2lB,aAAa9kB,KAAK,KACrBb,KAAKI,UAAUuB,OAAO,eACtBkmB,EAAYznB,UAAUC,IAAI,cAC1BmL,WAAW,KACTqc,EAAYlmB,UACX,KAIE,GAA2B8X,oBAAsBzZ,KAAKqlB,QACvDrlB,KAAKqlB,MAAM5jB,OACX,GAA2BqY,kBAAapV,QAMlC,QAAV,EAAA1E,KAAKqlB,aAAK,eAAE5Q,OACE,UAAbR,EAAI9Q,MAAqBnD,KAAKsqB,eAG/B,YAAiBhe,EAAQ,KACvB2S,GAAE,IACD,CAACtH,MAAM,EAAMwT,SAAS,EAAM7P,SAAS,EAAOvN,eAAgB/N,KAAK+N,iBAJpEkR,GAAE,KAcV,uBACE,OAAOjf,KAAK+N,eAAe1N,IAAIL,KAAKqlB,OAGtC,uBACKrlB,KAAKorB,cAILprB,KAAKqpB,mBACNrpB,KAAKqpB,mBACLrpB,KAAKqpB,iBAAmB,MAGvBrpB,KAAK2lB,cACN3lB,KAAK2lB,aAAaoF,SAGpB/qB,KAAK+N,eAAeO,YACpBtO,KAAK+N,eAAiB,KAEtB/N,KAAKmmB,UAAY,OAIrBkF,eAAeC,OAAO,gBAAiB,IC1pBxB,MAAMC,GAOnB,YAAsB/hB,EAA0BgiB,GAA1B,KAAAhiB,YAA0B,KAAAgiB,OAC9CxrB,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUuJ,UAAYA,EAE3BxJ,KAAKyrB,OAASvrB,SAASC,cAAc,OACrCH,KAAKyrB,OAAOrrB,UAAUC,IAAImJ,EAAY,WAEtCxJ,KAAK6N,QAAU3N,SAASC,cAAc,OACtCH,KAAK6N,QAAQzN,UAAUC,IAAImJ,EAAY,YAEvCxJ,KAAK4N,MAAQ1N,SAASC,cAAc,OACpCH,KAAK4N,MAAMxN,UAAUC,IAAImJ,EAAY,UACrCxJ,KAAK4N,MAAMxK,aAAa,MAAO,QAE/BpD,KAAK0rB,SAAWxrB,SAASC,cAAc,OACvCH,KAAK0rB,SAAStrB,UAAUC,IAAImJ,EAAY,aACxCxJ,KAAK0rB,SAAStoB,aAAa,MAAO,QAElCpD,KAAK6N,QAAQ9D,OAAO/J,KAAK4N,MAAO5N,KAAK0rB,UACrC1rB,KAAKC,UAAU8J,OAAO/J,KAAKyrB,OAAQzrB,KAAK6N,UCfrC,SAAS8d,GAAuB3oB,G,QASrC,IAAI,MAAC4K,EAAK,QAAEya,EAAO,SAAEqD,EAAQ,WAAEE,EAAU,QAAEC,EAAO,QAAEznB,EAAO,aAAE0lB,GAAgB9mB,OAChE0B,IAAVkJ,IACoB,iBAAZ,IACPA,EAAQ,YAAaA,EAAO,KAC5BA,EAAQ,IAAkBke,cAAcle,IAG1C,OAAArB,EAAA,GAAe8b,EAASza,IAGtBkc,IACFA,EAAe,IAGjB,IAAIhX,EAAQ1O,GAAWA,EAAQ0O,MAC3BwC,GAAW,EAAOyW,GAAU,EAChC,MAAMC,EAAgBH,EAAU1jB,MAAMC,KAAKyjB,EAAQzG,UAAU3hB,QAAU,GACvE,IAAIwoB,EACJ,GAAGnZ,GAAS+Y,GAUV,GATAD,EAAWpZ,YAAc,GACzBoZ,EAAW7hB,OAAO,IAAmBmiB,oBAAoB9nB,OAASM,OAAWA,OAAWA,OAAWA,GAAW,IAI3GoO,EAAMqZ,UACPrZ,EAAQA,EAAMqZ,SAGbrZ,EAAMtO,OAAUsO,EAAM5S,WAAiC,QAArB,EAAA4S,EAAM5S,SAASkY,cAAM,eAAEjW,QAA0G,CACpK8pB,EAAa,GAAaG,KAAKC,QAAQC,gBACvC,MAAMtC,EAAgB,GAAaoC,KAAKC,QAAQrC,cAEhD,GAA4B,aAAX,QAAd,EAAAlX,EAAM5S,gBAAQ,eAAEiD,MACjBmS,GAAW,EACXiX,GAAY,CACVtY,IAAKnB,EAAM5S,SACXssB,IAAKX,EACL7B,gBACAyC,MAAOC,GAEPhsB,MAnDS,GAoDTC,OApDS,GAqDTsrB,aACAnC,qBAEG,CACL,MAAMtlB,EAAQsO,EAAMtO,OAASsO,EAAM5S,SAEnC6rB,EAAyB,UAAfvnB,EAAMrB,KAEhB,IACEwmB,GAAU,CACRnlB,QACAvE,UAAW4rB,EACXjC,SAjEO,GAkEPC,UAlEO,GAmEP/pB,KAAM,IAAiB6sB,gBAAgBnoB,EAnEhC,OAoEPynB,aACAjC,gBACA4C,QAAQ,EACR7C,kBAAkB,EAClBD,iBAEFxU,GAAW,EACX,MAAM7I,YAMTrI,GACDwnB,EAAWpZ,YAAc,GACzBoZ,EAAW7hB,OAAO,IAAmBmiB,oBAAoB9nB,EAASA,EAAQA,SAAW,YAAaA,EAAQA,QAAS,SAE3F,iBAAf,IACPsnB,EAAW,YAAaA,EAAU,KAClCA,EAAW,IAAkBI,cAAcJ,IAG7C,OAAAnf,EAAA,GAAeqf,EAAYF,GAAY,KAa3C,OATA7oB,QAAQC,IAAIgnB,GAAcjpB,KAAK,KAC1BorB,IAAeA,MAClBD,EAAc1lB,QAAQumB,GAASA,EAAMlrB,UAElCkqB,GACDA,EAAQzrB,UAAUkM,OAAO,WAAYyf,MAIlCzW,EAGM,MAAM,WAAuBiW,GAG1C,YAAsB/hB,GACpBvG,MAAMuG,EAAW,CAACoE,EAAO8d,EAAW,GAAItnB,KAClCpE,KAAK6rB,UACP7rB,KAAK6rB,QAAU3rB,SAASC,cAAc,OACtCH,KAAK6rB,QAAQzrB,UAAUC,IAAIL,KAAKwJ,UAAY,WAG9C,MAAMsjB,EAAanB,GAAuB,CACxC/d,QACAya,QAASroB,KAAK4N,MACd8d,WACAE,WAAY5rB,KAAK0rB,SACjBG,QAAS7rB,KAAK6rB,QACdznB,YAGFpE,KAAKC,UAAUG,UAAUkM,OAAO,WAAYwgB,GACzCA,EACD9sB,KAAK6N,QAAQ4R,QAAQzf,KAAK6rB,SAE1B7rB,KAAK6rB,QAAQlqB,WApBG,KAAA6H,aCpGjB,MAAMujB,GACL,EADKA,GAEN,EAFMA,GAGJ,EAHIA,GAIH,EAJGA,GAKL,EAID,MAAM,GAOX,YAAoBzU,EAAuB0U,EAA0BC,EAA0BC,EAAyBC,EAAYH,GAAhH,KAAA1U,QAAuB,KAAA0U,WAA0B,KAAAC,WAA0B,KAAAC,UAAyB,KAAAC,YACtHntB,KAAK2E,MAAQ2T,EAAMnW,OACnBnC,KAAKotB,OAAS,GAASC,YAAY/U,GACnCtY,KAAKstB,YAAc,GAASC,iBAAiBvtB,KAAKotB,QAClDptB,KAAKwtB,aAAe,YAAWxtB,KAAKotB,OAAQ,GAAKptB,KAAK2E,MACtD3E,KAAKytB,aAAeT,EAAWhtB,KAAKmtB,UAG/B,SACL,OAAIntB,KAAK2E,MAGN3E,KAAK2E,OAAS,GAAK3E,KAAKotB,OAAO3c,KAAKwO,GAAKA,EAAI,GACvC,IAAI,GAAgBjf,KAAKotB,OAAQptB,KAAKwtB,aAAcxtB,KAAKgtB,SAAUhtB,KAAKitB,SAAUjtB,KAAKktB,SAASQ,SAGvF,IAAf1tB,KAAK2E,MAAoB3E,KAAK2tB,YACV,IAAf3tB,KAAK2E,MAAoB3E,KAAK4tB,cAC/B5tB,KAAK6tB,aATW,GAYjB,YACN,MAAyB,OAArB7tB,KAAKstB,aACHttB,KAAKwtB,aAAe,IAAMxtB,KAAKytB,cAC/BztB,KAAKotB,OAAO,GAAKptB,KAAKotB,OAAO,GAAK,GAC/BptB,KAAK8tB,qBACiB,OAArB9tB,KAAKstB,aAA6C,OAArBttB,KAAKstB,YACnCttB,KAAK+tB,0BAEP/tB,KAAKguB,qBAGN,cAEN,MAA2B,MAAxBhuB,KAAKstB,YAAY,GACXttB,KAAKiuB,0BAEPjuB,KAAKkuB,yBAGN,aACN,MAA2B,MAAxBluB,KAAKstB,YAAY,GACXttB,KAAKmuB,wBAEPnuB,KAAKouB,yBAGN,qBACN,MAAM1tB,EAAQV,KAAKgtB,SACbrsB,EAAS0B,KAAKE,MAAMF,KAAKC,IAC7B5B,EAAQV,KAAKotB,OAAO,GACpB/qB,KAAKC,IACH5B,EAAQV,KAAKotB,OAAO,IACnBptB,KAAKmtB,UAAYntB,KAAKktB,SAAW,KAEtC,MAAO,CACL,CACEmB,SAAU,CAAC9T,EAAG,EAAGE,EAAG,EAAG/Z,QAAOC,UAC9B2tB,MAAOvB,GAAgBA,GAAeA,IAExC,CACEsB,SAAU,CAAC9T,EAAG,EAAGE,EAAG9Z,EAASX,KAAKktB,QAASxsB,QAAOC,UAClD2tB,MAAOvB,GAAgBA,GAAkBA,KAKvC,0BACN,MAAMrsB,GAASV,KAAKgtB,SAAWhtB,KAAKktB,SAAW,EACzCvsB,EAAS0B,KAAKE,MAAMF,KAAKC,IAC7B5B,EAAQV,KAAKotB,OAAO,GACpB/qB,KAAKC,IAAI5B,EAAQV,KAAKotB,OAAO,GAAqB,EAAjBptB,KAAKmtB,aAExC,MAAO,CACL,CACEkB,SAAU,CAAC9T,EAAG,EAAGE,EAAG,EAAG/Z,QAAOC,UAC9B2tB,MAAOvB,GAAeA,GAAgBA,IAExC,CACEsB,SAAU,CAAC9T,EAAG7Z,EAAQV,KAAKktB,QAASzS,EAAG,EAAG/Z,QAAOC,UACjD2tB,MAAOvB,GAAeA,GAAiBA,KAKrC,qBACN,MAAMwB,EAAelsB,KAAKE,MAAsB,IAAhBvC,KAAKitB,UAC/BuB,EAAcnsB,KAAKC,IACvBD,KAAKE,MAAMF,KAAKP,IACd,IAAO9B,KAAKgtB,SAAWhtB,KAAKktB,UAC3BltB,KAAKgtB,SAAWhtB,KAAKktB,SAAWltB,KAAKotB,OAAO,IACxC,EAAIptB,KAAKotB,OAAO,GAAK,EAAIptB,KAAKotB,OAAO,MAC5CptB,KAAKgtB,SAAWhtB,KAAKktB,QAAUqB,GAC3BE,EAAazuB,KAAKgtB,SACpBwB,EACAxuB,KAAKktB,QACHvsB,EAAS0B,KAAKC,IAClBtC,KAAKmtB,UACL9qB,KAAKE,MAAMF,KAAKC,IACdmsB,EAAazuB,KAAKotB,OAAO,GACzBoB,EAAcxuB,KAAKotB,OAAO,MAE9B,MAAO,CACL,CACEiB,SAAU,CAAC9T,EAAG,EAAGE,EAAG,EAAG/Z,MAAO+tB,EAAY9tB,UAC1C2tB,MAAOvB,GAAeA,GAAgBA,IAExC,CACEsB,SAAU,CAAC9T,EAAGkU,EAAazuB,KAAKktB,QAASzS,EAAG,EAAG/Z,MAAO8tB,EAAa7tB,UACnE2tB,MAAOvB,GAAeA,GAAiBA,KAKrC,0BACN,MAAM2B,EAAc1uB,KAAKmtB,UACnBwB,EAActsB,KAAKE,MAAMF,KAAKC,KACjCtC,KAAKmtB,UAAYntB,KAAKktB,SAAW,EACjCltB,KAAKotB,OAAO,IAAMptB,KAAKgtB,SAAWhtB,KAAKktB,UACnCltB,KAAKotB,OAAO,GAAKptB,KAAKotB,OAAO,MAC9BwB,EAAeF,EACjBC,EACA3uB,KAAKktB,QACH2B,EAAaxsB,KAAKP,IACtB9B,KAAKitB,SACL5qB,KAAKE,MAAMF,KAAKC,KACbtC,KAAKgtB,SAAWhtB,KAAKktB,SAAW,EACjC7qB,KAAKC,IACHqsB,EAAc3uB,KAAKotB,OAAO,GAC1BwB,EAAe5uB,KAAKotB,OAAO,OAC3B0B,EAAYzsB,KAAKC,IACrBD,KAAKE,MAAMmsB,EAAc1uB,KAAKotB,OAAO,IACrCptB,KAAKgtB,SAAWhtB,KAAKktB,QAAU2B,GAEjC,MAAO,CACL,CACER,SAAU,CAAC9T,EAAG,EAAGE,EAAG,EAAG/Z,MAAOouB,EAAWnuB,OAAQ+tB,GACjDJ,MAAOvB,GAAeA,GAAgBA,IAExC,CACEsB,SAAU,CAAC9T,EAAGuU,EAAY9uB,KAAKktB,QAASzS,EAAG,EAAG/Z,MAAOmuB,EAAYluB,OAAQiuB,GACzEN,MAAOvB,GAAeA,IAExB,CACEsB,SAAU,CAAC9T,EAAGuU,EAAY9uB,KAAKktB,QAASzS,EAAGmU,EAAe5uB,KAAKktB,QAASxsB,MAAOmuB,EAAYluB,OAAQguB,GACnGL,MAAOvB,GAAkBA,KAKvB,yBACN,MAAM0B,EAAazuB,KAAKgtB,SAClB0B,EAAcrsB,KAAKE,MAAMF,KAAKC,IAClCmsB,EAAazuB,KAAKotB,OAAO,GACS,KAAjCptB,KAAKmtB,UAAYntB,KAAKktB,WACnBsB,GAAexuB,KAAKgtB,SAAWhtB,KAAKktB,SAAW,EAC/C0B,EAAevsB,KAAKC,IACxBtC,KAAKmtB,UAAYuB,EAAc1uB,KAAKktB,QACpC7qB,KAAKE,MAAMF,KAAKC,IACdksB,EAAcxuB,KAAKotB,OAAO,GAC1BoB,EAAcxuB,KAAKotB,OAAO,MACxB2B,EAAaN,EAAaD,EAAcxuB,KAAKktB,QAEnD,MAAO,CACL,CACEmB,SAAU,CAAC9T,EAAG,EAAGE,EAAG,EAAG/Z,MAAO+tB,EAAY9tB,OAAQ+tB,GAClDJ,MAAOvB,GAAgBA,GAAeA,IAExC,CACEsB,SAAU,CAAC9T,EAAG,EAAGE,EAAGiU,EAAc1uB,KAAKktB,QAASxsB,MAAO8tB,EAAa7tB,OAAQiuB,GAC5EN,MAAOvB,GAAkBA,IAE3B,CACEsB,SAAU,CAAC9T,EAAGiU,EAAcxuB,KAAKktB,QAASzS,EAAGiU,EAAc1uB,KAAKktB,QAASxsB,MAAOquB,EAAYpuB,OAAQiuB,GACpGN,MAAOvB,GAAkBA,KAKvB,wBACN,MAAMlV,EAAI7X,KAAKgtB,SACTgC,EAAK3sB,KAAKE,MAAMF,KAAKC,IACzBuV,EAAI7X,KAAKotB,OAAO,GACkB,KAAjCptB,KAAKmtB,UAAYntB,KAAKktB,WACnB3U,EAAIlW,KAAKE,OACZvC,KAAKgtB,SAAW,EAAIhtB,KAAKktB,UACrBltB,KAAKotB,OAAO,GAAKptB,KAAKotB,OAAO,GAAKptB,KAAKotB,OAAO,KAC/C6B,EAAK5sB,KAAKP,IACd9B,KAAKitB,SACL5qB,KAAKE,MAAMF,KAAKC,IACuB,IAApCtC,KAAKgtB,SAAW,EAAIhtB,KAAKktB,SAC1B3U,EAAIvY,KAAKotB,OAAO,MACd8B,EAAK7sB,KAAKE,MAAMF,KAAKP,IACzBO,KAAKP,IACa,EAAhB9B,KAAKitB,SACgC,KAApCjtB,KAAKgtB,SAAW,EAAIhtB,KAAKktB,UAC5B3U,EAAIvY,KAAKotB,OAAO,KACZ+B,EAAKtX,EAAIoX,EAAKC,EAAK,EAAIlvB,KAAKktB,QAC5BkC,EAAK/sB,KAAKC,IACdtC,KAAKmtB,UAAY6B,EAAKhvB,KAAKktB,QAC3B3U,GAEF,MAAO,CACL,CACE8V,SAAU,CAAC9T,EAAG,EAAGE,EAAG,EAAG/Z,MAAOmX,EAAGlX,OAAQquB,GACzCV,MAAOvB,GAAgBA,GAAeA,IAExC,CACEsB,SAAU,CAAC9T,EAAG,EAAGE,EAAGuU,EAAKhvB,KAAKktB,QAASxsB,MAAOuuB,EAAItuB,OAAQyuB,GAC1Dd,MAAOvB,GAAkBA,IAE3B,CACEsB,SAAU,CAAC9T,EAAG0U,EAAKjvB,KAAKktB,QAASzS,EAAGuU,EAAKhvB,KAAKktB,QAASxsB,MAAOyuB,EAAIxuB,OAAQyuB,GAC1Ed,MAAOvB,IAET,CACEsB,SAAU,CAAC9T,EAAG0U,EAAKjvB,KAAKktB,QAAUiC,EAAKnvB,KAAKktB,QAASzS,EAAGuU,EAAKhvB,KAAKktB,QAASxsB,MAAOwuB,EAAIvuB,OAAQyuB,GAC9Fd,MAAOvB,GAAiBA,KAKtB,yBACN,MAAMxU,EAAIvY,KAAKmtB,UACT8B,EAAK5sB,KAAKE,MAAMF,KAAKC,IACzBiW,EAAIvY,KAAKotB,OAAO,GACiB,IAAhCptB,KAAKgtB,SAAWhtB,KAAKktB,WAElBrV,EAAIxV,KAAKE,OACZvC,KAAKmtB,UAAY,EAAIntB,KAAKktB,UACtB,EAAKltB,KAAKotB,OAAO,GAAK,EAAKptB,KAAKotB,OAAO,GAAK,EAAKptB,KAAKotB,OAAO,KAE9D4B,EAAK3sB,KAAKE,MAAMsV,EAAI7X,KAAKotB,OAAO,IAChCgC,EAAK/sB,KAAKE,MAAMsV,EAAI7X,KAAKotB,OAAO,IAChCiC,EAAK9W,EAAIyW,EAAKI,EAAK,EAAIpvB,KAAKktB,QAC5BiC,EAAK9sB,KAAKP,IACd9B,KAAKitB,SACL5qB,KAAKC,IAAItC,KAAKgtB,SAAWiC,EAAKjvB,KAAKktB,QAASrV,IAE9C,MAAO,CACL,CACEwW,SAAU,CAAC9T,EAAG,EAAGE,EAAG,EAAG/Z,MAAOuuB,EAAItuB,OAAQ4X,GAC1C+V,MAAOvB,GAAeA,GAAgBA,IAExC,CACEsB,SAAU,CAAC9T,EAAG0U,EAAKjvB,KAAKktB,QAASzS,EAAG,EAAG/Z,MAAOyuB,EAAIxuB,OAAQquB,GAC1DV,MAAOvB,GAAeA,IAExB,CACEsB,SAAU,CAAC9T,EAAG0U,EAAKjvB,KAAKktB,QAASzS,EAAGuU,EAAKhvB,KAAKktB,QAASxsB,MAAOyuB,EAAIxuB,OAAQyuB,GAC1Ed,MAAOvB,IAET,CACEsB,SAAU,CAAC9T,EAAG0U,EAAKjvB,KAAKktB,QAASzS,EAAGuU,EAAKI,EAAK,EAAIpvB,KAAKktB,QAASxsB,MAAOyuB,EAAIxuB,OAAQ0uB,GACnFf,MAAOvB,GAAkBA,KAKvB,mBAAmBzU,GACzB,OAAOA,EAAM7P,IAAI3I,GAAQA,EAAK+X,EAAI/X,EAAKyY,GAGjC,wBAAwB6U,GAC9B,OAAOA,EAAO3kB,IAAI6mB,GAAUA,EAAQ,IAAO,IAAOA,EAAQ,GAAO,IAAM,KAAKtI,KAAK,KAIrF,MAAM,GAIJ,YAAYoG,EAA0BI,EAA8BR,EAA0BC,EAA0BC,EAAyBC,EAAuB,EAAXH,EAAe,GAAtI,KAAAQ,eAA8B,KAAAR,WAA0B,KAAAC,WAA0B,KAAAC,UAAyB,KAAAC,YAC/IntB,KAAKotB,OAAS,GAAgBmC,WAAWnC,EAAQI,GACjDxtB,KAAK2E,MAAQyoB,EAAOjrB,OAGd,kBAAkBirB,EAAkBI,GAG1C,OAAOJ,EAAO3kB,IAAI6mB,GACT9B,EAAe,IACrB,YAAM8B,EAAO,EAJE,MAKf,YAAMA,EAJS,MAIS,IAItB,SACL,IAAIjpB,EAAS,IAAI8B,MAAwBnI,KAAK2E,OAE1C6qB,EAAsB,GAC1B,MAAMC,EAAc,CAACC,EAAgB/qB,KACnC,MAAMyoB,EAASptB,KAAKotB,OAAO3pB,MAAMisB,EAAQA,EAAS/qB,GAC5CgrB,EAAM,YAAWvC,EAAQ,GAC/B,OAAQptB,KAAKgtB,UAAYroB,EAAQ,GAAK3E,KAAKktB,SAAWyC,GAElDC,EAAeC,IACnB,IAAIC,EAAoB,GACpBJ,EAAS,EACb,IAAI,IAAI/qB,KAASkrB,EACfC,EAAQnqB,KAAK8pB,EAAYC,EAAQ/qB,IACjC+qB,GAAU/qB,EAEZ6qB,EAAS7pB,KAAK,CAACkqB,aAAYC,aAG7B,IAAI,IAAIC,EAAQ,EAAGA,IAAU/vB,KAAK2E,QAASorB,EAAO,CAChD,MAAMC,EAAShwB,KAAK2E,MAAQorB,EACzBA,EAAQ,GAAKC,EAAS,GAGzBJ,EAAY,CAACG,EAAOC,IAEtB,IAAI,IAAID,EAAQ,EAAGA,IAAU/vB,KAAK2E,MAAQ,IAAKorB,EAC7C,IAAI,IAAIC,EAAS,EAAGA,IAAWhwB,KAAK2E,MAAQorB,IAASC,EAAQ,CAC3D,MAAMC,EAAQjwB,KAAK2E,MAAQorB,EAAQC,EAC/BD,EAAQ,GACNC,GAAWhwB,KAAKwtB,aAAe,IAAQ,EAAI,IAC3CyC,EAAQ,GAGdL,EAAY,CAACG,EAAOC,EAAQC,IAGhC,IAAI,IAAIF,EAAQ,EAAGA,IAAU/vB,KAAK2E,MAAQ,IAAKorB,EAC7C,IAAI,IAAIC,EAAS,EAAGA,IAAWhwB,KAAK2E,MAAQorB,IAASC,EACnD,IAAI,IAAIC,EAAQ,EAAGA,IAAUjwB,KAAK2E,MAAQorB,EAAQC,IAAUC,EAAO,CACjE,MAAMC,EAASlwB,KAAK2E,MAAQorB,EAAQC,EAASC,EAC1CF,EAAQ,GAAKC,EAAS,GAAKC,EAAQ,GAAKC,EAAS,GAGpDN,EAAY,CAACG,EAAOC,EAAQC,EAAOC,IAKzC,IAAIC,EAA0B,KAC1BC,EAAc,EAClB,IAAI,MAAMC,KAAWb,EAAU,CAC7B,MAAM,QAACM,EAASD,WAAYS,GAAUD,EAChCE,EAAYD,EAAOnuB,OACnBquB,EAAc,YAAWV,EAAS,GACpC9vB,KAAKktB,SAAWqD,EAAY,GAC1BE,EAAgBpuB,KAAKC,OAAOwtB,GAE5BY,GADgBruB,KAAKP,OAAOguB,GACpBW,EAAgBzwB,KAAKitB,SAAY,IAAM,GAC/C0D,EAAO,MACX,IAAI,IAAIC,EAAO,EAAGA,IAASL,IAAaK,EACtC,GAAGN,EAAOM,EAAO,GAAKN,EAAOM,GAC3B,OAAO,IAGX,OAAO,GANI,GAQPC,EAAOxuB,KAAKyuB,IAAIN,EAAcxwB,KAAKmtB,WAAauD,EAAOC,IACzDR,GAAkBU,EAAOT,KAC3BD,EAAiBE,EACjBD,EAAcS,GAIlB,MAAME,EAAgBZ,EAAeN,WAChCmB,EAAiBb,EAAeL,QAC/BmB,EAAWF,EAAc5uB,OAE/B,IAAIma,EAAQ,EACR7B,EAAI,EACR,IAAI,IAAIyW,EAAM,EAAGA,IAAQD,IAAYC,EAAK,CACxC,MAAMC,EAAWJ,EAAcG,GACzBE,EAAaJ,EAAeE,GAC5BvwB,EAAS0B,KAAKE,MAAM6uB,GAE1B,IAAI7W,EAAI,EACR,IAAI,IAAI8W,EAAM,EAAGA,IAAQF,IAAYE,EAAK,CACxC,MAAM/C,EAAQvB,IACD,IAARmE,EAAYnE,GAAeA,KAC3BmE,IAAQD,EAAW,EAAIlE,GAAkBA,KACjC,IAARsE,EAAYtE,GAAgBA,KAC5BsE,IAAQF,EAAW,EAAIpE,GAAiBA,IAEvCuC,EAAQtvB,KAAKotB,OAAO9Q,GACpB5b,EAAS2wB,IAAQF,EAAW,EAC7BnxB,KAAKgtB,SAAWzS,EACjBlY,KAAKE,MAAM+sB,EAAQ8B,GACvB/qB,EAAOiW,GAAS,CACd+R,SAAU,CAAC9T,IAAGE,IAAG/Z,QAAOC,UACxB2tB,SAGF/T,GAAK7Z,EAAQV,KAAKktB,UAChB5Q,EAEJ7B,GAAK9Z,EAASX,KAAKktB,QAGrB,OAAO7mB,G,uBCraI,MAAM,GAenB,YAAYrD,GAHJ,KAAAsuB,WAAY,EACZ,KAAArlB,WAAa,IAiEd,KAAAslB,UAAY,KACjB,GAAGvxB,KAAKkR,aACN,OAAO,EAGT,IAAIsgB,EAAgB,EAAGC,EAAiB,EAAGC,EAAsB,EAiBjE,OAhBA1xB,KAAK2xB,YAAYrrB,QAAQzE,IACpBA,EAAW+vB,YACT/vB,EAAW0vB,eACVC,EAGD3vB,EAAWgwB,YACVH,GAIH7vB,EAAWgwB,YACVJ,IAICA,IAAmBC,GAAuBF,EAAgB,GAG5D,KAAAM,aAAe,KACpB9xB,KAAK0R,QAAQtR,UAAUkM,OAAO,aAActM,KAAKuxB,cAhFjD,YAAWvxB,KAAMgD,GAEbhD,KAAK0R,QAEE1R,KAAK0R,QAAQtR,UAAUuR,SAAS,gBACzC3R,KAAK8xB,aAAe,KAClB9xB,KAAK0R,QAAQqgB,gBAAgB,YAAa/xB,KAAKuxB,aAAevxB,KAAK4R,YAHrE5R,KAAK0R,QAAU,EAAa,CAACrE,KAAM,UAOjCrK,EAAQgvB,gBACVhyB,KAAKiyB,WAAa/xB,SAASC,cAAc,kBACzCH,KAAKiyB,WAAW7xB,UAAUC,IAAI,qBAAsB,UAAYL,KAAKiM,YACrEjM,KAAKiyB,WAAW7uB,aAAa,OAAQ,GAAKpD,KAAKiH,QAE3CjE,EAAQkvB,kBACVlyB,KAAKoR,WAAa,IAAI,EAAYC,IAChCrR,KAAKkR,aAAeG,EACpBrR,KAAK8xB,eACL9xB,KAAKiyB,WAAWtwB,WAGlB3B,KAAKoR,WAAWnR,UAAU8J,OAAO/J,KAAKiyB,cAI1CjyB,KAAK2xB,YAAYrrB,QAAQzE,IACvB7B,KAAK+N,eAAe1N,IAAIwB,EAAWE,MAAnC/B,CAA0C,QAASA,KAAK8xB,gBAG1D9xB,KAAK8xB,eAGP,eACE,OAAO9xB,KAAKsxB,UAGd,aAAoBpvB,GAClBlC,KAAKsxB,UAAYpvB,EACjBlC,KAAK2xB,YAAYrrB,QAAQzE,GAAcA,EAAWE,MAAMgwB,gBAAgB,WAAY7vB,IACpFlC,KAAK8xB,eAGA,gBAAgB3rB,EAAuBgsB,GAAkB,GAC9DnyB,KAAK4R,UAAW,EAChBzL,EAAQtF,KAAK,KACRsxB,IACDnyB,KAAK4R,UAAW,IAEjB,KACD5R,KAAK4R,UAAW,KClFP,SAASwgB,GAAUC,EAA6DlnB,GAC7F,MAAMmnB,EAAOpyB,SAASC,cAAc,QAYpC,OAVAkyB,EAAO/rB,QAAQ2Y,IACb,MAAM,UAAChf,EAAS,MAAE8B,GAASkd,EAC3BqT,EAAKvoB,OAAO9J,GACZ8B,EAAMf,iBAAiB,SAAWiB,IAC7BF,EAAM4b,SACPxS,EAASpJ,EAAMG,MAAOD,OAKrBqwB,ECJM,MAAM,GAUnB,YAAYtvB,EAeP,IAjBE,KAAAuvB,SAAU,EAkBfvyB,KAAKC,UAAYC,SAASC,cAAc6C,EAAQwvB,YAAcxvB,EAAQoa,cAAgB,QAAU,OAChGpd,KAAKC,UAAUG,UAAUC,IAAI,OAE7BL,KAAK0rB,SAAWxrB,SAASC,cAAc,OACvCH,KAAK0rB,SAAStrB,UAAUC,IAAI,gBAC5BL,KAAK0rB,SAAStoB,aAAa,MAAO,QAC/BJ,EAAQ0oB,SACuB,iBAAtB1oB,EAAgB,SACxBc,EAAa9D,KAAK0rB,SAAU1oB,EAAQ0oB,UAEpC1rB,KAAK0rB,SAAS3hB,OAAO/G,EAAQ0oB,UAEvB1oB,EAAQyvB,iBAChBzyB,KAAK0rB,SAAS3hB,OAAO,eAAK/G,EAAQyvB,gBAAiBzvB,EAAQ0vB,mBAE7D1yB,KAAKC,UAAU8J,OAAO/J,KAAK0rB,UAE3B,IAAIiH,IAAgB3vB,EAAQ2vB,YAC5B,GAAG3vB,EAAQwvB,YAAcxvB,EAAQoa,cAAe,CAO9C,GANAuV,GAAc,EACX3vB,EAAQwvB,aACTxyB,KAAKwyB,WAAaxvB,EAAQwvB,WAC1BxyB,KAAKC,UAAU8J,OAAO/J,KAAKwyB,WAAWhhB,QAGrCxO,EAAQoa,cAAe,CACxBpd,KAAKod,cAAgBpa,EAAQoa,cAE7B,MAAMwV,EAAW5vB,EAAQoa,cAAc5L,MAAMpR,UAAUuR,SAAS,yBAC7DihB,GACD5yB,KAAKC,UAAUG,UAAUC,IAAI,mBAC7B2C,EAAQ6vB,WAAa7yB,KAAKod,cAAc5L,OAExCxR,KAAKC,UAAU8J,OAAO/J,KAAKod,cAAc5L,OAGvCxO,EAAQ8vB,oBAAuBF,GACjC5yB,KAAKod,cAAcrb,MAAMf,iBAAiB,SAAU,KAClD,OAAAuL,EAAA,GAAevM,KAAK0rB,SAAU,eAAK1rB,KAAKod,cAAcrb,MAAM4b,QAAU,mBAAqB,yBAKvF3a,EAAQwvB,YAAcxvB,EAAQoa,eACtC5L,MAAMpR,UAAUC,IAAI,iBAGxB,GAAG2C,EAAQ4K,OAAS5K,EAAQ+vB,aAAc,CACxC,IAAIC,EAmBJ,GAlBGhwB,EAAQ6vB,YACTG,EAAI9yB,SAASC,cAAc,OAC3B6yB,EAAE5yB,UAAUC,IAAI,iBAChBL,KAAKC,UAAU8J,OAAOipB,IAEtBA,EAAIhzB,KAAKC,UAGXD,KAAK4N,MAAQ1N,SAASC,cAAc,OACpCH,KAAK4N,MAAMxN,UAAUC,IAAI,aACzBL,KAAK4N,MAAMxK,aAAa,MAAO,QAC5BJ,EAAQ4K,MACT5N,KAAK4N,MAAM3J,UAAYjB,EAAQ4K,MAE/B5N,KAAK4N,MAAM7D,OAAO,eAAK/G,EAAQ+vB,eAEjCC,EAAEjpB,OAAO/J,KAAK4N,OAEX5K,EAAQ6vB,WAAY,CACrB,MAAMA,EAAa3yB,SAASC,cAAc,OAC1C0yB,EAAWzyB,UAAUC,IAAI,YAAa,mBAEJ,iBAAxB2C,EAAkB,WAC1B6vB,EAAW5uB,UAAYjB,EAAQ6vB,WAE/BA,EAAW9oB,OAAO/G,EAAQ6vB,YAG5BG,EAAEjpB,OAAO8oB,IAIV7vB,EAAQqK,OACTslB,GAAc,EACd3yB,KAAK4N,MAAMxN,UAAUC,IAAI,QAAS,SAAW2C,EAAQqK,MACrDrN,KAAKC,UAAUG,UAAUC,IAAI,kBAG5BsyB,GACD3yB,KAAKC,UAAUG,UAAUC,IAAI,oBAG5B2C,EAAQiwB,gBACTjwB,EAAQyG,UAAY,IAAMzG,EAAQiwB,cAAcliB,SAG/C/N,EAAQyG,WAAazG,EAAQwvB,YAAcxvB,EAAQoa,iBACnB,mBAAvBpa,EAAiB,WACzBhD,KAAKC,UAAUe,iBAAiB,QAAUiB,IACrCjC,KAAKuyB,SACPvvB,EAAQyG,UAAkBxH,KAI/BjC,KAAKC,UAAUG,UAAUC,IAAI,gBAAiB,gBAE1C2C,EAAQ2K,UACV,OAAA2P,GAAA,QAAOtd,KAAKC,eAAWyE,OAAWA,GAAW,KAY9C,MAAMwuB,GAAoB,CAACC,EAAahoB,IACtCinB,GAAUe,EAAK1qB,IAAIwW,IAAK,CAAEhf,UAAWgf,EAAEhf,UAAW8B,MAAOkd,EAAEuT,WAAWzwB,SAAUoJ,GChIlF,SAASioB,GAAoBlW,GAC9BxK,UAAU2gB,UAKd3gB,UAAU2gB,UAAUC,UAAUpW,GA/BhC,SAAqCA,GACnC,IAAIqW,EAAWrzB,SAASC,cAAc,YACtCozB,EAASrxB,MAAQgb,EAGjBqW,EAAS5wB,MAAM6wB,IAAM,IACrBD,EAAS5wB,MAAMoa,KAAO,IACtBwW,EAAS5wB,MAAM8wB,SAAW,QAE1BvzB,SAASiW,KAAK6K,YAAYuS,GAC1BA,EAAS9nB,QACT8nB,EAASG,SAET,IACExzB,SAASyzB,YAAY,QAIrB,MAAMlnB,IAIRvM,SAASiW,KAAKyd,YAAYL,GAKxBM,CAA4B3W,G,aCxBjB,MAAM,GAKnB,YAAYla,GAOV,MAAMwO,EAAQxR,KAAKwR,MAAQtR,SAASC,cAAc,SAClDqR,EAAMpR,UAAUC,IAAI,eAEpB,MAAM0B,EAAQ/B,KAAK+B,MAAQ7B,SAASC,cAAc,SAClD4B,EAAMoB,KAAO,QACIpB,EAAMuH,KAAO,eAAiBtG,EAAQsG,KAEpDtG,EAAQd,QACTH,EAAMG,MAAQc,EAAQd,MAEnBc,EAAQ8wB,WACTC,EAAA,QAAgBC,WAAWnzB,KAAKozB,IAC9BlyB,EAAM4b,QAAU,YAAgBsW,EAAOjxB,EAAQ8wB,YAAc9wB,EAAQd,QAGvEH,EAAMf,iBAAiB,SAAU,KAC/B+yB,EAAA,QAAgBG,SAASlxB,EAAQ8wB,SAAU9wB,EAAQd,WAKzD,MAAMiyB,EAAOn0B,KAAKm0B,KAAOj0B,SAASC,cAAc,OAChDg0B,EAAK/zB,UAAUC,IAAI,oBAEhB2C,EAAQka,KACTiX,EAAKlwB,UAAYjB,EAAQka,KAWjBla,EAAQoxB,SAChB,gBAAMD,EAAMnxB,EAAQoxB,SAGtB5iB,EAAMzH,OAAOhI,EAAOoyB,GAGtB,cACE,OAAOn0B,KAAK+B,MAAM4b,QAGpB,YAAYA,GACV3d,KAAK0D,iBAAiBia,GAEtB,MAAMrD,EAAQ,IAAI+Z,MAAM,SAAU,CAAChI,SAAS,EAAMjG,YAAY,IAC9DpmB,KAAK+B,MAAM0M,cAAc6L,GAGpB,iBAAiBqD,GACtB3d,KAAK+B,MAAM4b,QAAUA,GCpEzB,MAAM2W,GAAUp0B,SAASC,cAAc,OAEhC,SAASo0B,GAAM1mB,GACpB,OAAAtB,EAAA,GAAe+nB,GAASzmB,GACxB3N,SAASiW,KAAKpM,OAAOuqB,IAElBA,GAAQloB,QAAQU,SAASE,cAAcsnB,GAAQloB,QAAQU,SAC1DwnB,GAAQloB,QAAQU,QAAU,GAAKtB,WAAW,KACxC8oB,GAAQ3yB,gBACD2yB,GAAQloB,QAAQU,SACtB,KAGE,SAAS0nB,GAASxxB,GAGvBuxB,GAAM,eAAKvxB,EAAQyxB,cCrBN,SAASC,GACtB5R,EACA6R,EACAC,GAAiB,EACjBC,GAAgB,GAEhB,IAAIC,EACAC,EAAiD9uB,EAAgC8kB,EACjFiK,GAAa,EAEjB,MAAO,IAAI/mB,KACL8mB,IAAgBA,EAAiB,IAAIlyB,QAAQ,CAACoyB,EAAUC,KAAajvB,EAAUgvB,EAAUlK,EAASmK,KAEnGJ,GACD9nB,aAAa8nB,GACbE,GAAa,EACbjK,IACAgK,EAAiB,IAAIlyB,QAAQ,CAACoyB,EAAUC,KAAajvB,EAAUgvB,EAAUlK,EAASmK,KAC1EN,IAER3uB,EAAQ6c,KAAM7U,IACd+mB,GAAa,GAGfF,EAAiBtpB,WAAW,MAEvBqpB,GAAmBD,IAAkBI,GAEtC/uB,EAAQ6c,KAAM7U,IAGhB6mB,EAAiBC,EAAiB9uB,EAAU8kB,OAASrmB,EACrDswB,GAAa,GACZL,GAEHI,EAAevoB,MAAM,QACduoB,GD9BXT,GAAQl0B,UAAUC,IAAI,S,aEIf,MAAM,WAA2B,IAatC,YAAY2C,GACVC,MAAMD,GAENhD,KAAKm1B,uBAAyBT,GAAS10B,KAAKo1B,cAAc7uB,KAAKvG,MAAO,KAAK,GAAO,GAElFgD,EAAQ+K,eAAe1N,IAAIL,KAAK+B,MAAhCiB,CAAuC,QAAS,KAC9C,MAAMd,EAAQlC,KAAKq1B,WAGnB,GAAGnzB,IAAUlC,KAAKs1B,gBAAkBpzB,EAAMC,OAGxC,OAFAnC,KAAKu1B,SAAS,IAAWC,QAASx1B,KAAKgD,QAAQwO,YAC/CxR,KAAKgD,QAAQmI,UAAYnL,KAAKgD,QAAQmI,YAE7B,IAAkBsqB,gBAAgBvzB,GAG3ClC,KAAKu1B,SAAS,IAAWC,SAFzBx1B,KAAK01B,SAAS11B,KAAKgD,QAAQ2yB,aAK1B31B,KAAK+B,MAAM3B,UAAUuR,SAAS,SAC/B3R,KAAKgD,QAAQmI,UAAYnL,KAAKgD,QAAQmI,WAIxCnL,KAAKm1B,uBAAuBjzB,KAIzB,WACL,IAAIA,EAAQlC,KAAKkC,MAMjB,OALGlC,KAAKgD,QAAQ4yB,OACd1zB,EAAQA,EAAMuB,MAAMzD,KAAKgD,QAAQ4yB,KAAKzzB,QACtCnC,KAAK0D,iBAAiB1D,KAAKgD,QAAQ4yB,KAAO1zB,IAGrCA,EAGD,cAAc2zB,GACjB71B,KAAK81B,uBAEL91B,KAAKgD,QAAQiE,OACdjH,KAAK81B,qBAAuB,KAAWC,UAAU,yBAA0B,CACzEC,QAAS,IAAgBC,gBAAgBj2B,KAAKgD,QAAQiE,OAAOivB,YAC7DL,aAGF71B,KAAK81B,qBAAuB,KAAWC,UAAU,wBAAyB,CAACF,aAG7E71B,KAAK81B,qBAAqBj1B,KAAKs1B,IAC1Bn2B,KAAKq1B,aAAeQ,IAEpBM,EACDn2B,KAAKu1B,SAAS,IAAWa,MAAOp2B,KAAKgD,QAAQqzB,eAE7Cr2B,KAAK01B,SAAS11B,KAAKgD,QAAQszB,aAE3B7pB,IACF,GAAGzM,KAAKq1B,aAAeQ,EAEvB,OAAOppB,EAAItJ,MACT,IAAK,mBACHnD,KAAK01B,SAAS11B,KAAKgD,QAAQ2yB,gBAI9B90B,KAAK,KACNb,KAAK81B,0BAAuBpxB,EAC5B1E,KAAKgD,QAAQmI,UAAYnL,KAAKgD,QAAQmI,WAEtC,MAAMjJ,EAAQlC,KAAKq1B,WAChBnzB,IAAU2zB,GAAY71B,KAAKu2B,mBAAqB,IAAkBd,gBAAgBvzB,IACnFlC,KAAKo1B,cAAclzB,O,sBCxEZ,MAAM,WAAkB,KACrC,YAAoBsH,EAAmBxG,EAA4B,IAGjE,GAFAC,MAAM,cAAgBuG,EAAY,IAAMA,EAAY,IAAKxG,EAAQ4a,SAAW,aAAgB5a,EAAQ4a,SAAU,OAAF,QAAG4Y,iBAAiB,GAASxzB,IADvH,KAAAwG,YAGfxG,EAAQiE,OAAQ,CACjB,IAAIwvB,EAAW,IAAI,GACnBA,EAASrzB,aAAa,SAAU,KAChCqzB,EAASrzB,aAAa,OAAQ,GAAKJ,EAAQiE,QAC3CwvB,EAASr2B,UAAUC,IAAI,aACvBL,KAAKyN,OAAOgS,QAAQgX,GAGlBzzB,EAAQ0zB,UACP1zB,EAAQ+vB,eAAiB/vB,EAAQ4K,MAAO5N,KAAK4N,MAAM7D,OAAO,eAAK/G,EAAQ+vB,cAAgB,UAAW/vB,EAAQ2zB,gBACrG3zB,EAAQ4K,iBAAiBwZ,YAC/BpnB,KAAK4N,MAAM7D,OAAO/G,EAAQ4K,OACrB5N,KAAK4N,MAAM2b,UAAYvmB,EAAQ4K,OAAS,IAGjD,MAAMgpB,EAAW12B,SAAS22B,yBAE1B,GAAG7zB,EAAQ8zB,oBAAsB9zB,EAAQ+zB,YAAa,CACpD,MAAMC,EAAI92B,SAASC,cAAc,KACjC62B,EAAE52B,UAAUC,IAAI,qBACb2C,EAAQ8zB,mBAAoBE,EAAEjtB,OAAO,eAAK/G,EAAQ8zB,mBAAoB9zB,EAAQi0B,sBACzEj0B,EAAQ+zB,cAAaC,EAAE/yB,UAAYjB,EAAQ+zB,aAEnDH,EAAS7sB,OAAOitB,GAGfh0B,EAAQk0B,aACTl3B,KAAKC,UAAUG,UAAUC,IAAI,iBAE7B2C,EAAQk0B,WAAW5wB,QAAQ6wB,IACzBA,EAAEC,YAAa,EACf,MAAMha,EAAgB,IAAI,KAAc+Z,GACxCA,EAAE/Z,cAAgBA,EAClBwZ,EAAS7sB,OAAOqT,EAAc5L,SAGhCxO,EAAQ4a,QAAQtX,QAAQuU,IACtB,GAAGA,EAAOwc,SAAU,CAClB,MAAMC,EAAWzc,EAAOwc,SACxBxc,EAAOwc,SAAW,KAChB,MAAMrE,EAAsB,IAAInvB,IAChCb,EAAQk0B,WAAW5wB,QAAQ6wB,IACtBA,EAAE/Z,cAAcO,SACjBqV,EAAE3yB,IAAI82B,EAAEja,QAGZoa,EAAStE,QAMjBhzB,KAAKC,UAAU8gB,aAAa6V,EAAU52B,KAAKyN,OAAO8pB,qB,aC3DvC,MAAM,WAAuB,EAIhC,OACRv3B,KAAKC,UAAUG,UAAUC,IAAI,sBAAuB,wBAEpD,MAAMm3B,EAAc,IAAgBA,YAAYx3B,KAAKgS,QAErDhS,KAAKmR,SAASqmB,EAAc,cAAgB,aAE5C,MAAMC,EAAU,IAAI,GAAe,CACjCnuB,KAAMkuB,EAAc,cAAgB,cAGhCE,EAAS,eACTC,EAAa,IAAI,GAAI,CACzBnF,WAAY,IAAI,GAAW,CACzB4B,QAASoD,EAAc,iBAAmB,cAC1CluB,KAAMouB,EACNx1B,MAAO,YAETuwB,gBAAiB+E,EAAc,qBAAuB,oBAElDI,EAAY,IAAI,GAAI,CACxBpF,WAAY,IAAI,GAAW,CACzB4B,QAASoD,EAAc,gBAAkB,aACzCluB,KAAMouB,EACNx1B,MAAO,WAETuwB,gBAAiB+E,EAAc,oBAAsB,mBAEjDlF,EAAOY,GAAkB,CAACyE,EAAYC,GAAa11B,IACvD,MAAMoG,EAAI,CAACuvB,EAAgBC,GACd,WAAV51B,GAAoBoG,EAAExD,UAEzBwD,EAAE,GAAGrI,UAAUG,UAAUuB,OAAO,QAChC2G,EAAE,GAAGrI,UAAUG,UAAUC,IAAI,QAE7B8K,MAGIihB,EAAa,IAAgB2L,QAAQ/3B,KAAKgS,QAEhDylB,EAAQ5pB,QAAQ9D,OAAOuoB,GAEvB,MAAMuF,EAAiB,IAAI,GAAe,IAGpCG,EAAU,IAAI,GAAI,CACtBpqB,MAAQ5N,KAAKi4B,SAASC,gBAA0DC,KAChF1F,gBAAiB+E,EAAc,yBAA2B,sBAC1D/tB,UAAW,KACT2pB,GAAqBpzB,KAAKi4B,SAASC,gBAA0DC,MAC7F5D,GAAM,UAAKvb,OAAO,cAAc,OAI9Bof,EAAY,YAAO,qCAAsC,CAAC/qB,KAAM,SAAU6P,KAAM,eAEtF,YAAiBkb,EAAW,KAC1B,IAAI,GAAU,cAAe,CAC3Bxa,QAAS,CAAC,CACRwW,QAAS,eACTiD,SAAU,KACR,MAAM/qB,EAAS,OAAA+rB,GAAA,GAAiB,CAACD,IAAY,GAE7C,UAAkBE,kBAAkBt4B,KAAKgS,QAAQ,GAAMnR,KAAKs3B,IAC1D7rB,IACA0rB,EAAQpqB,MAAM3J,UAAYk0B,OAMhCpF,aAAc,aACd+D,mBAAoB,gBACnBrY,QACF,CAAC1Q,eAAgB/N,KAAK+N,iBAEzB8pB,EAAehqB,QAAQ9D,OAAOiuB,EAAQ/3B,UAAWm4B,GAEjD,MAAMN,EAAgB,IAAI,GAAe,CACvCS,QAASf,EAAc,+BAAiC,6BACxDgB,aAAa,IAGTlnB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAEM8K,EAAW,KACf,MAAMstB,EAAWd,EAAWnF,WAAW7U,SAHrB,UAGiC2X,GAC7CoD,EAAenC,mBAAqBmC,EAAe32B,MAAM3B,UAAUuR,SAAS,SAClFgnB,EAASv4B,UAAUkM,OAAO,aAAcmsB,IAGpCC,EAAiB,IAAI,GAAmB,CAC5ClnB,MAAO,oBACPlI,KAAM,oBACNpG,WAAW,EACX6K,eAAgB/N,KAAK+N,eACrBsoB,cAAe,iBACfV,YAAa,eACbW,UAAW,aACXnrB,SAAUA,EACVlE,OAAQjH,KAAKgS,OAAOmV,UAAS,GAC7ByO,KAlBkB,UAqBdN,EArBc,SAqBkBlJ,EAAsByJ,UAAY,IAExEvkB,EAAavH,OAAO2uB,EAAez4B,WACnC63B,EAAcjqB,QAAQ9D,OAAOuH,GAE7B,MAAMqnB,EAAW,EAAa,CAACtrB,KAAM,QAAS7D,UAAW,eACzDxJ,KAAK6N,QAAQ9D,OAAO4uB,GAEpB,YAAiBA,EAAU,KACC,aAAgBA,GAC1C,MAAM9C,EAAW+B,EAAUpF,WAAW7U,QAAU+a,EAAerD,WAAa,GAC5E,IAAgBuD,YAAY54B,KAAKgS,QAAQnR,KAAKg4B,GACrC,IAAgBC,eAAeD,EAAWhD,IAChDh1B,KAAK,KAENb,KAAK+4B,WAEN,CAAChrB,eAAgB/N,KAAK+N,kBAtCL,UAwCnBunB,EAAgCsC,EAAYD,GAAYnF,WAAW7U,SAAU,EAC9E+a,EAAeM,iBAAiB1D,GAEhCt1B,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,UAAW43B,EAAe53B,UAAW63B,EAAc73B,Y,aCrJvE,MAAM,GAOnB,YAAY+C,GANL,KAAAi2B,SAAU,EAIT,KAAAC,QAAS,EAMf,YAAWl5B,KAAMgD,GAEjBA,EAAQ+H,WAAWM,iBAAmB,KACpCrL,KAAK8F,QAIF,OACL,OAAG9F,KAAKk5B,OACCr2B,QAAQoD,UAGdjG,KAAKi5B,QACCj5B,KAAKmG,SAGdnG,KAAKi5B,SAAU,OACfj5B,KAAKmG,QAAUnG,KAAKm5B,aAAat4B,KAAK8pB,IACpC3qB,KAAKi5B,SAAU,EACfj5B,KAAKmG,aAAUzB,EAEZimB,GACD3qB,KAAKk5B,QAAS,EACdl5B,KAAK+K,WAAWM,iBAAmB,MAEnCrL,KAAK+K,WAAWquB,oBAEjB,KACDp5B,KAAKmG,aAAUzB,EACf1E,KAAKi5B,SAAU,O,+UClBN,MAAM,GAiDnB,YAAYj2B,GAhDL,KAAA/C,UAAYC,SAASC,cAAc,OACnC,KAAAyJ,KAAO,GAAkBC,iBAIzB,KAAAsI,eAAiBjS,SAASC,cAAc,OAQxC,KAAAk5B,SAAW,IAAIx1B,IAEf,KAAA0uB,SAAU,EAET,KAAAvqB,SAAW,EACX,KAAAsxB,YAAc,EAGd,KAAA1uB,MAAQ,GAGR,KAAA2uB,WAAkG,GAElG,KAAAC,gBAA+B,IAAI31B,IAInC,KAAA41B,SAAmC,CAAC,WAGpC,KAAAC,aAAc,EACd,KAAArnB,eAAgB,EAChB,KAAApG,WAAa,GACb,KAAA0tB,YAAa,EAGb,KAAAC,QAA+D,GAK/D,KAAAC,aAA4B,oBAE5B,KAAAC,gBAAiB,EAkJjB,KAAA/sB,QAAU,KAChB,MAAM7K,EAAQlC,KAAK+B,MAAMG,MACzB,GAAGlC,KAAK4K,QAAU1I,EAAO,EACpBlC,KAAKy5B,SAASM,SAAS,aAAe/5B,KAAKy5B,SAASM,SAAS,cAC9D/5B,KAAKg6B,eAAiB,MAGrBh6B,KAAKy5B,SAASM,SAAS,aACxB/5B,KAAKgI,SAAW,EAChBhI,KAAKs5B,YAAc,GAGrB,IAAI,IAAItuB,KAAKhL,KAAK45B,UAEd55B,KAAK45B,QAAQ5uB,GAGjBhL,KAAK4J,KAAO,GAAkBC,iBAE9B7J,KAAKmG,QAAU,KACfnG,KAAKu5B,WAAa,GAClBv5B,KAAK4K,MAAQ1I,EACblC,KAAKw5B,gBAAgBrvB,QACrBnK,KAAK85B,gBAAiB,EAGtB95B,KAAKi6B,mBAiLT,KAAAb,iBAAmB,KACjBp5B,KAAK+K,WAAWquB,oBA5UhB,YAAWp5B,KAAMgD,GAEjBhD,KAAKC,UAAUG,UAAUC,IAAI,YAE7B,MAAM65B,GAAKl6B,KAAKm6B,mBAAqBn6B,KAAKo6B,eAAe7zB,KAAKvG,MAwC9D,GAvCAA,KAAKm6B,kBAAqBroB,IACrB9R,KAAK85B,iBACN95B,KAAK+K,WAAWsvB,QAAQtR,YAAY/oB,KAAK4J,MACzC5J,KAAK+K,WAAWG,oBAAoBlL,KAAK4J,MACzC5J,KAAK85B,gBAAiB,GAGxBhoB,EAAUA,EAAQlK,OAAOX,IACvB,MAAMqzB,GAAet6B,KAAKw5B,gBAAgB7xB,IAAIV,GAE9C,OADGqzB,GAAat6B,KAAKw5B,gBAAgBn5B,IAAI4G,GAClCqzB,IAGNt6B,KAAKu6B,mBACNzoB,EAAUA,EAAQlK,OAAOX,IACvB,GAAGA,EAAOuzB,WAAY,CAEpB,IADa,IAAgBC,QAAQxzB,GAC5ByzB,QACP,OAAO16B,KAAKu6B,iBAAiB9pB,KAAKkqB,GAAU,IAAgBA,GAAQ1zB,IAIxE,OAAO,KAIJizB,EAAEpoB,IAGX9R,KAAK+B,MAAQ7B,SAASC,cAAc,SACpCH,KAAK+B,MAAM3B,UAAUC,IAAI,yBACtBL,KAAK4M,YACN,gBAAM5M,KAAK+B,MAAO/B,KAAK4M,iBAAalI,EAAW,eAE/C,gBAAM1E,KAAK+B,MAAO,qBAAiB2C,EAAW,eAGhD1E,KAAK+B,MAAMoB,KAAO,OAEfnD,KAAK05B,YAAa,CACnB,IAAIkB,EAAe16B,SAASC,cAAc,OAC1Cy6B,EAAax6B,UAAUC,IAAI,6BAE3BL,KAAK66B,kBAAoB36B,SAASC,cAAc,OAChDH,KAAK66B,kBAAkBz6B,UAAUC,IAAI,mBAErCL,KAAK66B,kBAAkB9wB,OAAO/J,KAAK+B,OACnC64B,EAAa7wB,OAAO/J,KAAK66B,mBACzB76B,KAAK86B,mBAAqB,IAAI,IAAWF,GAEzC,IAAIG,EAAY76B,SAASC,cAAc,MAEvCH,KAAK66B,kBAAkB75B,iBAAiB,QAAUiB,IAChD,GAAGjC,KAAKuyB,QAAS,OACjB,IAAI1d,EAAS5S,EAAE4S,OAGf,GAFAA,EAAS,OAAA+J,GAAA,GAAgB/J,EAAQ,kBAE7BA,EAAQ,OAEZ,MAAM5N,EAAS4N,EAAOzI,QAAQmC,IACxBysB,EAAKh7B,KAAKmS,eAAetC,cAAc,kBAAoB5I,EAAS,MACtE+zB,EAGFA,EAAGC,QAFHj7B,KAAK2B,OAAOsF,EAAOkgB,cAMvBnnB,KAAKC,UAAU8J,OAAO6wB,EAAcG,GAGtC/6B,KAAKmS,eAAe/R,UAAUC,IAAI,sBAClCL,KAAKmS,eAAepI,OAAO/J,KAAK4J,MAChC5J,KAAK+K,WAAa,IAAI,IAAW/K,KAAKmS,gBACtCnS,KAAK+K,WAAWG,oBAAoBlL,KAAK4J,MAEzC5J,KAAKmS,eAAenR,iBAAiB,QAAUiB,IAC7C,MAAM4S,EAAS,OAAAqmB,GAAA,GAAgBj5B,EAAE4S,OAAQ,gBAGzC,GAFA,OAAA6I,EAAA,GAAYzb,IAER4S,EAAQ,OACZ,GAAG7U,KAAKuyB,QAAS,OAEjB,IAAIhkB,EAAuBsG,EAAOzI,QAAQnF,OAG1C,GAFAsH,EAAMA,EAAIisB,WAAajsB,EAAI4Y,WAAa5Y,GAEpCvO,KAAK05B,YAEP,YADA15B,KAAKK,IAAIkO,GAKRvO,KAAKq5B,SAAS1xB,IAAI4G,GACnBvO,KAAK2B,OAAO4M,GAEZvO,KAAKK,IAAIkO,GAGX,MAAM4sB,EAAWtmB,EAAOhF,cAAc,SACtCsrB,EAASxd,SAAWwd,EAASxd,UAG/B,MAAMyd,EAAiB1G,GAAS10B,KAAK+M,QAAS,KAAK,GAAO,GAC1D/M,KAAK+B,MAAMf,iBAAiB,QAASo6B,GAErCp7B,KAAK+K,WAAWM,iBAAmB,KACjCrL,KAAKi6B,kBAGPj6B,KAAKC,UAAU8J,OAAO/J,KAAKmS,gBAC3BnS,KAAKq7B,SAAStxB,OAAO/J,KAAKC,WAG1BuL,WAAW,KACT,IAAI8vB,EAAoBt7B,KAAKi6B,iBAC1Bj3B,EAAQu4B,eACTD,EAAkBz6B,KAAK,KACrBmC,EAAQu4B,mBAGX,GAiCG,cACFv7B,KAAK25B,YACN35B,KAAKs5B,aACY,IAAlBt5B,KAAKgI,WACLhI,KAAKy5B,SAASM,SAAS,YACrB/5B,KAAK4K,QAAS,IAAgB4wB,eAAex7B,KAAK4K,QACpD5K,KAAKm6B,kBAAkB,CAACvxB,EAAA,QAAU6O,OAI9B,UAAUtU,GAKhB,YAJ0BuB,IAAvB1E,KAAK45B,QAAQz2B,KACdnD,KAAK45B,QAAQz2B,GAAQ,KAGdnD,KAAK45B,QAAQz2B,GAGV,iB,0CACZ,GAAGnD,KAAKmG,QAAS,OAAOnG,KAAKmG,QAE7B,GAAGnG,KAAKu5B,WAAWkC,SAAWz7B,KAAKu5B,WAAWmC,SAC5C,OAIF,MAAMC,EAAYC,GAAA,EAAWj7B,OAAS,GAAK,KAAO,EAE5Ck7B,EAAS77B,KAAK87B,UAAU,WACxB31B,EAAU,IAAmB41B,iBAAiB/7B,KAAK4K,MAAO5K,KAAKs5B,YAAaqC,EAAW37B,KAAKgI,UAAU,GAAM7B,QAClHnG,KAAKmG,QAAUA,EACf,MAAMjE,QAAciE,EACpB,GAAGnG,KAAK45B,QAAQ6B,UAAYI,EAC1B,OAGF77B,KAAKmG,QAAU,KAEf,IAAIs1B,EAAUv5B,EAAMu5B,QACpB,GAAGA,EAAQt5B,OAAQ,CACjB,MAAM65B,EAAiBP,EAAQA,EAAQt5B,OAAS,GAAGma,OAAS,EAE5Dmf,EAAUA,EAAQh4B,QAClBg4B,EAAQQ,cAAc1b,GAAKA,EAAEtZ,SAAW2B,EAAA,QAAU6O,MAE/CzX,KAAKk8B,mBACNT,EAAUA,EAAQ7zB,OAAO2Y,GAAKvgB,KAAKm8B,eAAe5b,EAAEtZ,UAGtDjH,KAAKo8B,cAELp8B,KAAKs5B,YAAc0C,EAKrB,GAFAh8B,KAAKm6B,kBAAkBsB,EAAQhzB,IAAIoD,GAAUA,EAAO5E,SAEjD/E,EAAMm6B,MAAO,CACd,IAAIr8B,KAAKu5B,WAAWkC,QAOlB,OANAz7B,KAAKo8B,cAELp8B,KAAKu5B,WAAWkC,SAAU,EAC1Bz7B,KAAKs5B,YAAc,EACnBt5B,KAAKgI,SAAW,EAEThI,KAAKs8B,iBAIZ,GAFAt8B,KAAKu5B,WAAWmC,UAAW,GAEvB17B,KAAKu5B,WAAWgD,SAClB,OAAOv8B,KAAKw8B,sBAMZ,eAAev1B,GACrB,OACEA,EAAOw1B,WACoB,kBAA1Bz8B,KAAKk8B,kBAAwC,IAAgBQ,cAAcz1B,KACzE,IAAgB01B,UAAU11B,EAAOivB,WAAYl2B,KAAKk8B,kBAG3C,kB,0CACZ,GAAGl8B,KAAKmG,QAAS,OAAOnG,KAAKmG,QAE7B,GAAGnG,KAAKu5B,WAAWgD,SACjB,OAGF,MAAMK,EAAiB58B,KAAKy5B,SAASM,SAAS,YAE9C,IAAI/5B,KAAKg6B,eAAgB,CAQvB,MAAM6B,EAAS77B,KAAK87B,UAAU,YACxB31B,EAAUtD,QAAQC,IAAI,CAC1B85B,EAAiB,IAAgBC,mBAAmB78B,KAAK4K,OAAS,GAClE5K,KAAK4K,MAAQ,IAAgBkyB,eAAe98B,KAAK4K,YAASlG,IAG5D1E,KAAKmG,QAAUA,EACf,IAAK6zB,EAAgB+C,SAAsB52B,EAC3C,GAAGnG,KAAK45B,QAAQ2C,WAAaV,EAC3B,OAGF,GAAGkB,EAAc,CAEf,IAAIC,EAAgBJ,EAAiBG,EAAaE,WAAWr5B,OAAOm5B,EAAaG,SAAWH,EAAaE,WAEtGj9B,KAAKk8B,mBACNc,EAAgBA,EAAcp1B,OAAOX,GAAUjH,KAAKm8B,eAAel1B,KAGjEjH,KAAKy5B,SAASM,SAAS,aACzBiD,EAAgBA,EAAcp1B,OAAOX,GAAUA,EAAOw1B,WAGxDz8B,KAAKg6B,eAAiB,YAAaA,EAAep2B,OAAOo5B,SACpDh9B,KAAKg6B,eAAiBA,EAAev2B,QAE5C,YAAiBzD,KAAKg6B,eAAgBpxB,EAAA,QAAU6O,MAChDzX,KAAKmG,QAAU,KAIf,MAAMw1B,EAAYC,GAAA,EAAWj7B,OAAS,GAAK,KAAO,EAC5C2D,EAAMtE,KAAKg6B,eAAev1B,OAAO,EAAGk3B,GAC1C37B,KAAKm6B,kBAAkB71B,GAGrBtE,KAAKg6B,eAAe73B,SACtBnC,KAAKu5B,WAAWgD,UAAW,MASjB,6B,0CACZ,GAAGv8B,KAAKmG,QAAS,OAAOnG,KAAKmG,QAE7B,GAAGnG,KAAKu5B,WAAW4D,oBACjB,OAGF,MAEMtB,EAAS77B,KAAK87B,UAAU,uBACxB31B,EAAU,UAAkBi3B,uBAAuBp9B,KAAKiH,OAAOivB,WAAY,CAAC9uB,EAAG,4BAA6Bi2B,EAAGr9B,KAAK4K,OAHxG,GAG2H5K,KAAK4J,KAAKK,mBACjJqzB,QAAqBn3B,EAC3B,GAAGnG,KAAK45B,QAAQuD,sBAAwBtB,EACtC,OAGF,MAAM/pB,EAAUwrB,EAAaA,aAAa70B,IAAI80B,GACrC,IAAgBC,qBAAqBD,IAE9C,YAAiBzrB,EAASlJ,EAAA,QAAU6O,MACpCzX,KAAKm6B,kBAAkBroB,IAEpB9R,KAAK4J,KAAKK,mBAAqBqzB,EAAa34B,OAAS24B,EAAaA,aAAan7B,OAfhE,MAgBhBnC,KAAKu5B,WAAW4D,qBAAsB,MAQlC,iBACN,MAmCMM,EAnCM,MACV,MAAMA,EAA2B,GAejC,OAAIz9B,KAAKy5B,SAASM,SAAS,YAAkD/5B,KAAKu5B,WAAWmC,WAC3F+B,EAAS93B,KAAK3F,KAAKs8B,kBAEft8B,KAAKu5B,WAAWmC,YAKlB17B,KAAKy5B,SAASM,SAAS,cAAe/5B,KAAKy5B,SAASM,SAAS,YAAgB/5B,KAAKu5B,WAAWgD,UAC/FkB,EAAS93B,KAAK3F,KAAKw8B,mBAGlBx8B,KAAKy5B,SAASM,SAAS,yBAA2B/5B,KAAKu5B,WAAW4D,qBACnEM,EAAS93B,KAAK3F,KAAK09B,8BAGdD,GAZIA,GAeIztB,GACX7J,EAAUtD,QAAQC,IAAI26B,GAK5B,OAJGA,EAASt7B,QACVgE,EAAQtF,KAAKb,KAAKo5B,kBAGbjzB,EAGD,cAAc2L,IAIhB9R,KAAKy5B,SAASM,SAAS,YAAc/5B,KAAKu5B,WAAWgD,WACvDzqB,EAAUA,EAAQlK,OAAOX,GAChB,IAAgB02B,iBAAiB12B,KAI5C6K,EAAQxL,QAAQW,IACd,MAAM,IAAC6E,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ5E,EACRhH,UAAWD,KAAK+K,WAChBiB,YAAY,EACZqG,cAAerS,KAAKqS,cACpBpG,WAAYjM,KAAKiM,aAGnB,GAAGjM,KAAK05B,YAAa,CACnB,MAAML,EAAWr5B,KAAKq5B,SAAS1xB,IAAIV,GAC7BmW,EAAgB,IAAI,KAEvBic,IAEDjc,EAAcrb,MAAM4b,SAAU,GAGhC7R,EAAI8xB,YAAYne,QAAQrC,EAAc5L,OAGxC,IAAIoa,EAEFA,EADC3kB,EAAO42B,YACK,UAAkBC,qBAAqB72B,EAAOivB,YACnDjvB,IAAW2B,EAAA,QAAU6O,KAChB,eAAKzX,KAAK65B,cAEV,IAAgBtnB,oBAAoBtL,GAGnD6E,EAAIwG,gBAAgBvI,OAAO6hB,KAIxB,IAAIrd,EAAsBX,EAA8BmwB,GAAS,GAItE,GAFA/9B,KAAKq5B,SAASh5B,IAAIkO,IAEdvO,KAAK05B,YAEP,YADA15B,KAAKmL,SAASnL,KAAKq5B,SAASv5B,MAI3BE,KAAK4K,MAAMU,SACZtL,KAAK+B,MAAMG,MAAQ,GACnBlC,KAAK+M,WAGP,MAAMyf,EAAMtsB,SAASC,cAAc,OACnCqsB,EAAIpsB,UAAUC,IAAI,gBAAiB,YAEnC,MAAMo2B,EAAWv2B,SAASC,cAAc,kBAiCxC,OAhCAs2B,EAASr2B,UAAUC,IAAI,uBAAwB,SAC/Co2B,EAASrzB,aAAa,SAAU,KAChCqzB,EAASr2B,UAAUC,IAAI,aAEvBmsB,EAAIpgB,QAAQmC,IAAM,GAAKA,EACpBA,EAAIisB,kBACQ91B,IAAVkJ,IACDA,EAAQ,IAAI,KAAU,CAAC3G,OAAQsH,EAAI4Y,WAAYtb,QAAQ,IAAOmJ,SAGhEyhB,EAASrzB,aAAa,OAAQ,GAAKmL,IAGlCX,IACoB,iBAAZ,EACP4e,EAAIvoB,UAAY2J,GAEhB,OAAArB,EAAA,GAAeigB,EAAK5e,GACpB4e,EAAIziB,OAAO6D,KAIf4e,EAAIwR,sBAAsB,aAAcvH,GAExCz2B,KAAK66B,kBAAkB9Z,aAAayL,EAAKxsB,KAAK+B,OAE9C/B,KAAKmL,UAAYnL,KAAKmL,SAASnL,KAAKq5B,SAASv5B,MAE1Ci+B,GACD/9B,KAAK86B,mBAAmBmD,kBAAkBj+B,KAAK+B,MAAO,UAGjDyqB,EAGF,OAAOje,GACZ,IAAIvO,KAAK05B,YAAa,OAEtB,MAAMlN,EAAMxsB,KAAK66B,kBAAkBhrB,cAAc,cAActB,OAC/Die,EAAIpsB,UAAUuB,OAAO,YAChB6qB,EAAI0R,YACT1R,EAAIpsB,UAAUC,IAAI,aAElB,MAAM89B,EAAiB,KACrBn+B,KAAKq5B,SAAShrB,OAAOE,GACrBie,EAAI7qB,SACJ3B,KAAKmL,UAAYnL,KAAKmL,SAASnL,KAAKq5B,SAASv5B,OAG5C8I,EAAA,QAAUw1B,SAASC,kBACpB7R,EAAIxrB,iBAAiB,eAAgBm9B,EAAgB,CAACxmB,MAAM,IAE5DwmB,IAIG,cACL,MAAO,IAAIn+B,KAAKq5B,UAGX,WAAWiF,GAChBA,EAAOh4B,QAAQpE,IACblC,KAAKK,IAAI6B,OAAOwC,GAAW,KAG7B6G,OAAO2T,sBAAsB,KAC3Blf,KAAK86B,mBAAmBmD,kBAAkBj+B,KAAK+B,MAAO,cAAU2C,OAAWA,EAAW,KAAe65B,W,2SCjlB5F,MAAM,WAAsB,KAGzC,YAAYv7B,GAQVC,MAAM,gBAAiB,KAAM,CAACu7B,UAAU,EAAMhI,iBAAiB,EAAMrgB,MAAM,IAE3EnW,KAAK+mB,SAAW,IAAI,GAAe,CACjCsU,SAAUr7B,KAAKmW,KACfhL,SAAU,IAAW,mCACnB,MAAMkuB,EAAWr5B,KAAK+mB,SAAS0X,cACzBx3B,EAASoyB,EAASA,EAASl3B,OAAS,GAAGglB,WAE7C,GAAGnkB,EAAQ07B,SAAU,CACnB,MAAMhzB,EAAM1I,EAAQ07B,SAASz3B,GAC7B,GAAGyE,aAAe7I,QAChB,UACQ6I,EACN,MAAMe,GACN,QAKNzM,KAAK+mB,SAAW,KAChB/mB,KAAK2+B,UAEPlF,SAAUz2B,EAAQ47B,UAClBrD,cAAe,KACbv7B,KAAKye,OACLze,KAAK+mB,SAASqS,mBAEV,uBACFp5B,KAAK+mB,SAAShlB,MAAM0J,SAGxBywB,iBAAkBl5B,EAAQk5B,iBAC1BxC,aAAa,EACbrnB,eAAe,EACfpG,WAAY,GACZhF,OAAQjE,EAAQiE,OAChB2F,YAAa5J,EAAQ4J,YACrBitB,aAAc72B,EAAQ62B,eAKxB75B,KAAK4N,MAAM7D,OAAO/J,KAAK+mB,SAAShlB,QC9CrB,MAAM,WAA8B,EAKvC,OAIR,IAAI88B,EAHJ7+B,KAAKC,UAAUG,UAAUC,IAAI,sBAAuB,8BACpDL,KAAKmR,SAAS,oBAId,CACE,MAAMsmB,EAAU,IAAI,GAAe,CACjCnuB,KAAM,0BAGFkjB,EAAMtsB,SAASC,cAAc,OACnCqsB,EAAIpsB,UAAUC,IAAI,sBAClBo3B,EAAQ5pB,QAAQkT,aAAayL,EAAKiL,EAAQ7pB,OAE1C,MAAMhE,EAAO,GAAkBC,eAAe,CAACi1B,KAAK,IACpDtS,EAAIziB,OAAOH,GAEX,MAAM,IAACkC,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ7L,KAAKoS,OAAO+U,UAAS,GAC7BlnB,UAAW2J,EACXoC,YAAY,EACZqG,eAAe,EACfpG,WAAY,KAGdH,EAAIwG,gBAAgBvI,OAAO,IAAgBwI,oBAAoBvS,KAAKoS,SAEpE,MAAM4kB,EAAI,IAAI,GAAgB,CAC5BhlB,OAAQhS,KAAKgS,OACbjE,eAAgB/N,KAAK+N,eACrBstB,SAAU5D,EAAQ5pB,QAClB0vB,YAAoC,6BAAvBv9B,KAAKu9B,YAAYn2B,EAAmCpH,KAAKu9B,iBAAc74B,IAGtFm6B,EAAkB,KAEhB,MAAME,EAAS/H,EAAEgI,UACS,6BAAvBh/B,KAAKu9B,YAAYn2B,GAAoC,YAAUpH,KAAKu9B,YAAY0B,cAAc3nB,OAAQynB,EAAOznB,SAIhH,IAAgB4nB,WAAWl/B,KAAKgS,OAAQhS,KAAKu9B,YAAawB,IAG5D/+B,KAAKwO,cAAcxN,iBAAiB,UAAW69B,EAAiB,CAAClnB,MAAM,IAEvE3X,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAGjC,CACE,MAAMw3B,EAAU,IAAI,GAAe,IAEnC,GAA0B,6BAAvBz3B,KAAKu9B,YAAYn2B,EAAkC,CACpD,MAAM+3B,EAAqB,YAAO,qCAAsC,CAAC9xB,KAAM,SAAU6P,KAAM,2BAE/F,YAAiBiiB,EAAoB,KACnC,MAAM7yB,EAAS,OAAA+rB,GAAA,GAAiB,CAAC8G,IAAqB,GACtD,IAAgBC,oCAAoCp/B,KAAKgS,OAAQhS,KAAKu9B,aAAa18B,KAAK,KACtFb,KAAKwO,cAAcnF,oBAAoB,UAAWw1B,GAClD7+B,KAAK+4B,SACJ,KACDzsB,OAED,CAACyB,eAAgB/N,KAAK+N,iBAEzB0pB,EAAQ5pB,QAAQ9D,OAAOo1B,GAGzB,MAAME,EAAY,YAAO,qCAAsC,CAAChyB,KAAM,aAAc6P,KAAM,0BAE1F,YAAiBmiB,EAAW,KACX,OAAAhH,GAAA,GAAiB,CAACgH,IAAY,GAC7C,IAAgBC,gBAAgBt/B,KAAKgS,OAAQhS,KAAKu9B,aAAa18B,KAAK,KAClEb,KAAKwO,cAAcnF,oBAAoB,UAAWw1B,GAClD7+B,KAAK+4B,WAqBN,CAAChrB,eAAgB/N,KAAK+N,iBAEzB0pB,EAAQ5pB,QAAQ9D,OAAOs1B,GAEvBr/B,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,a,2SCjG9B,MAAM,GASX,YAAY+C,GAMVhD,KAAKu/B,EAAI,CACP,CAACC,MAAO,CAAC,iBAAkBtiB,KAAM,uBAAwBuiB,cAAe,0BACxE,CAACD,MAAO,CAAC,cAAetiB,KAAM,4BAA6BuiB,cAAe,+BAC1E,CAACD,MAAO,CAAC,gBAAiB,aAActiB,KAAM,+BAAgCuiB,cAAe,kCAC7F,CAACD,MAAO,CAAC,cAAetiB,KAAM,4BAA6BuiB,cAAe,+BAC1E,CAACD,MAAO,CAAC,eAAgBtiB,KAAM,6BAA8BuiB,cAAe,gCAC5E,CAACD,MAAO,CAAC,gBAAiBtiB,KAAM,8BAA+BuiB,cAAe,iCAC9E,CAACD,MAAO,CAAC,gBAAiBtiB,KAAM,8BAA+BuiB,cAAe,iCAC9E,CAACD,MAAO,CAAC,eAAgBtiB,KAAM,6BAA8BuiB,cAAe,iCAG9Ez/B,KAAK0/B,WAAa,CAChB,cAAiB,CAAC,aAAc,gBAAiB,aAAc,gBAGjE,MACMC,EADkB,IAAgB5H,QAAQ/0B,EAAQgP,QACvB4tB,sBAC3Bb,EAAS/7B,EAAQu6B,YAAc,IAAgBsC,+BAA+B78B,EAAQgP,OAAQhP,EAAQu6B,YAAY0B,eAAiBU,EAEzI,IAAI,MAAMG,KAAQ9/B,KAAKu/B,EAAG,CACxB,MAAMQ,EAAWD,EAAKN,MAAM,GAC5BM,EAAK1iB,cAAgB,IAAI,KAAc,CACrCF,KAAM4iB,EAAK5iB,KACXS,QAAS,IAAgBgf,UAAU35B,EAAQgP,OAAQ+tB,EAAUhB,GAC7DiB,aAAa,EACb5I,YAAY,IAIXp0B,EAAQu6B,aAAeoC,EAAoBroB,OAAOyoB,KACnDD,EAAK1iB,cAAcrb,MAAM6P,UAAW,EAYpC,YAAiBkuB,EAAK1iB,cAAc5L,MAAQvP,IAC1CsyB,GAAM,UAAKvb,OAAO,4BAA4B,KAC7C,CAACjL,eAAgB/K,EAAQ+K,kBAG3B/N,KAAK0/B,WAAWK,IACjB/8B,EAAQ+K,eAAe1N,IAAIy/B,EAAK1iB,cAAcrb,MAA9CiB,CAAqD,SAAU,KAC7D,IAAI88B,EAAK1iB,cAAcO,QAAS,CAChB3d,KAAKu/B,EAAE33B,OAAOoD,GAAKhL,KAAK0/B,WAAWK,GAAUhG,SAAS/uB,EAAEw0B,MAAM,KACtEl5B,QAAQw5B,IACZA,EAAK1iB,cAAcO,SAAU,OAMrC3a,EAAQq4B,SAAStxB,OAAO+1B,EAAK1iB,cAAc5L,QAIxC,UACL,MAAMutB,EAA2B,CAC/B33B,EAAG,mBACH64B,WAAY,WACZ3oB,OAAQ,IAGV,IAAI,MAAMwoB,KAAQ9/B,KAAKu/B,EAAG,EACRO,EAAK1iB,cAAcO,SAEjCmiB,EAAKN,MAAMl5B,QAAQ45B,IAEjBnB,EAAOznB,OAAO4oB,IAAQ,IAK5B,OAAOnB,GAII,MAAM,WAA+B,EAGlC,O,0CAId,IAAIoB,EAHJngC,KAAKC,UAAUG,UAAUC,IAAI,sBAAuB,+BACpDL,KAAKmR,SAAS,sBAGd,CACE,MAAMsmB,EAAU,IAAI,GAAe,CACjCnuB,KAAM,6BAGR62B,EAAkB,IAAI,GAAgB,CACpCnuB,OAAQhS,KAAKgS,OACbjE,eAAgB/N,KAAK+N,eACrBstB,SAAU5D,EAAQ5pB,UAGpB7N,KAAKwO,cAAcxN,iBAAiB,UAAW,KAC7C,IAAgBo/B,4BAA4BpgC,KAAKgS,OAAQmuB,EAAgBnB,YACxE,CAACrnB,MAAM,IAEV3X,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAGjC,CACE,MAAMw3B,EAAU,IAAI,GAAe,CACjCnuB,KAAM,sBAGF+2B,EAAkB,IAAI,GAAI,CAC9BtN,aAAc,sBACdN,gBAAiB,UACjBplB,KAAM,UACN5D,UAAW,KACT,IAAI,GAAc,CAChBm1B,UAAW,CAAC,uBACZF,SAAWz3B,IACTuE,WAAW,KACT80B,EAAgBr5B,IACf,IAEL2F,YAAa,oCACb3F,QAASjH,KAAKgS,YAKdsuB,EAAwBr5B,GAAmB,mCAC/C,IAAIs2B,EACJ,IACEA,QAAoB,UAAkBgD,sBAAsBvgC,KAAKgS,OAAQ/K,GACzE,MAAMwF,GAEN,YADA8nB,GAAM,iCAIR,MAAM/kB,EAAM,IAAI,GAAsBxP,KAAKsN,QAC3CkC,EAAI+tB,YAAcA,EAClB/tB,EAAIwC,OAAShS,KAAKgS,OAClBxC,EAAI4C,OAASnL,EACbuI,EAAIuB,UAGN0mB,EAAQ5pB,QAAQ9D,OAAOs2B,EAAgBpgC,WAWvC,MAAM+yB,EAAIyE,EAAQ+I,yBAClBxN,EAAE5yB,UAAUC,IAAI,sBAEhB,MAAMuJ,EAAO,GAAkBC,eAAe,CAACi1B,KAAK,IACpD9L,EAAEjpB,OAAOH,GAET,YAAiBA,EAAO3H,IACtB,MAAM4S,EAAS,OAAA4rB,GAAA,GAAUx+B,EAAE4S,OAAQ,MACnC,IAAIA,EAAQ,OAEZ,MAAM5N,EAAS4N,EAAOzI,QAAQnF,OAAOkgB,WACrCmZ,EAAgBr5B,IACf,CAAC8G,eAAgB/N,KAAK+N,iBAEzB,MAAM2yB,EAAc,CAAC1F,EAAauC,KAChC,MAAMoD,EAAepD,EAAY0B,cAC3BU,EAAuB,IAAgB5H,QAAQ/3B,KAAKgS,QAAyB4tB,sBAG7EgB,EAA0B,GAChCT,EAAgBZ,EAAEj5B,QAAQw5B,IACxB,MAAMC,EAAWD,EAAKN,MAAM,GAEzBmB,EAAarpB,OAAOyoB,KAAcJ,EAAoBroB,OAAOyoB,IAC9Da,EAASj7B,KAAKm6B,EAAKL,iBAOvB,MAAM1vB,EAAKirB,EAAGnrB,cAAc,sBAEzB+wB,EAASz+B,SACV4N,EAAG9L,UAAY,GACf8L,EAAGhG,UAAU,eAAK62B,EAASn4B,IAAIiI,GAAK,eAAKA,KAAK,KAKhDX,EAAG3P,UAAUkM,OAAO,QAASs0B,EAASz+B,SAGlC9B,EAAM,CAACk9B,EAA0DxzB,KACrE,MAAM,IAAC+B,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ,IAAgBg1B,UAAUtD,EAAYuD,MAC9C7gC,UAAW2J,EACXoC,YAAY,EACZqG,eAAe,EACfpG,WAAY,GACZlC,WAGF22B,EAAY50B,EAAIK,OAAQoxB,IAM1Bv9B,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,2BAA6B+gC,I,UAC9D,MAAMC,EAAwC,8BAAR,QAAtB,EAAAD,EAAOE,uBAAe,eAAE75B,KAAqC25B,EAAOE,gBAAgBhC,cAAc3nB,OAAO4pB,cACnHlG,EAAKpxB,EAAKiG,cAAc,kBAAkBkxB,EAAOI,aACpDH,GACGhG,EAGF0F,EAAY1F,EAAI+F,EAAOE,iBAFvB5gC,EAAI0gC,EAAOE,iBAAgE,GAK3C,8BAAR,QAAvB,EAAAF,EAAOK,wBAAgB,eAAEh6B,MACxBi6B,IAGDrG,GACDA,EAAGr5B,SAG6B,8BAAR,QAAvB,EAAAo/B,EAAOK,wBAAgB,eAAEh6B,MACxBi6B,GAINC,MAGF,MAAMA,EAAY,KAChB,OAAA/0B,EAAA,GAAe8zB,EAAgB3U,SAAU,eAAK2V,EAAkB,8BAAgC,2BAA4B,CAACA,MAG/H,IACIE,EADAF,EAAkB,EAEtB,MAAMG,EAAY,KAEhBD,EAAS,IAAI,GAAiB,CAC5Bx2B,WAAY/K,KAAK+K,WACjBouB,WAAY,IACH,UAAkBiE,uBAAuBp9B,KAAKgS,OAAQ,CAAC5K,EAAG,4BAA6Bi2B,EAAG,IAJlF,GAImGzzB,EAAKK,mBAAmBpJ,KAAK6K,IAC7I,IAAI,MAAM6xB,KAAe7xB,EAAI4xB,aAC3Bj9B,EAAIk9B,GAA4D,GAMlE,OAHA8D,EAAkB31B,EAAI/G,MACtB28B,IAEO51B,EAAI4xB,aAAan7B,OAZX,IAYkCuJ,EAAI/G,QAAUiF,EAAKK,sBAKjEs3B,EAAOz7B,QAGhB9F,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAE5B,IAAgBwhC,UAAUzhC,KAAKgS,cAC1BwvB,KAENF,IAEAthC,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,iBAAkB,EAAE0hC,cAAaC,gBAC/D3hC,KAAKgS,SAAW0vB,IACjB1hC,KAAKgS,OAAS2vB,EACdH,YAOV,qBACExhC,KAAK+K,WAAW62B,YC7TL,MAAM,GACnB,YACE36B,EAEAwyB,EAAqB,IAAgBoI,cAAc56B,GACnDy3B,GAEA,MAAMoD,EAAmB,IAAI,KAAU,CAAC76B,WAAS+N,QAO3C+sB,EAAgB,CAACpkB,EAA4CqkB,EAAQ9K,KAAgBvZ,EAAQ7d,QACjG,IAAIqG,EAAU,IAAgB87B,MAAMh7B,EAAOivB,YAExC8L,IACD77B,EAAUA,EAAQkb,QAAQ,IACjB,IAAmB6gB,aAAaj7B,KAI3Cy3B,GAAYA,EAASv4B,IAGjBg8B,EAAkBxkB,IACtB,IAAIxX,EAEJ,GAAGc,EAAOw1B,SACRt2B,EAAU,IAAmB+7B,aAAaj7B,GAAQ,EAAOiwB,IAAevZ,EAAQ7d,UAAO4E,OAClF,CACL,IAAGiZ,EAAQ7d,KAGT,OAAOiiC,EAAcpkB,GAFrBxX,EAAU,IAAgBkI,OAAOpH,EAAOivB,YAM5CwI,GAAYA,EAASv4B,IAGvB,IAAIyH,EAAoBmpB,EAA0BqL,EAAwBxkB,EAAsCsZ,EAChH,OAAOuC,GACL,IAAK,UACiC,IAAgBkD,UAAU11B,EAAOivB,WAAY,gBAC/E,IAAgBmM,cAChBz0B,EAAQ,oBACRmpB,EAAc,iCACdnZ,EAAU,CAAC,CACTwW,QAAS,oBACTkO,UAAU,EACVjL,SAAU8K,IAGZjL,EAAa,CAAC,CACZha,KAAM,0BAGRtP,EAAQ,mBACRmpB,EAAc,4BACdqL,EAAkB,CAACN,GACnBlkB,EAAU,CAAC,CACTwW,QAAS,eACTkO,UAAU,EACVjL,SAAU0K,KAId,MAeF,IAAK,OACHn0B,EAAQ,iBACRmpB,EAAc,mCACdqL,EAAkB,CAACN,GAEnBlkB,EAAU,CAAC,CACTwW,QAAS,iBACTkO,UAAU,EACVjL,SAAU8K,IAGZjL,EAAa,CAAC,CACZha,KAAM,2BACNqlB,SAAU,CACR,IAAI,KAAU,CAACt7B,WAAS+N,WAI5B,MAGF,IAAK,QACHpH,EAAQ,iBACRmpB,EAAc,wCACdnZ,EAAU,CAAC,CACTwW,QAAS,iBACTkO,UAAU,EACVjL,SAAU8K,IAGZ,MAGF,IAAK,YACL,IAAK,QACiC,IAAgBxF,UAAU11B,EAAOivB,WAAY,gBAC/EtoB,EAAQ,iBACRmpB,EAAc,0BACdnZ,EAAU,CAAC,CACTwW,QAAS,iBACTkO,UAAU,EACVjL,SAAU8K,IAGZjL,EAAa,CAAC,CACZha,KAAM,mCAGRtP,EAAQ,gBACRmpB,EAAc,8BACdqL,EAAkB,CAACN,GACnBlkB,EAAU,CAAC,CACTwW,QAAS,iBACTkO,UAAU,EACVjL,SAAWH,GAAe6K,EAAc7K,GAAY,MAQ5D,IAAI,GAAU,oBAAqB,CACjCjwB,SACA8rB,aAAcnlB,EACdkpB,mBAAoBC,EACpBE,oBAAqBmL,EACrBxkB,UACAsZ,eACCzY,Q,2SC9IQ,MAAM,WAAuB,EAM1B,Q,0CAEdze,KAAK+N,eAAeO,YACpBtO,KAAK+K,WAAW9K,UAAUgE,UAAY,GAEtCjE,KAAKC,UAAUG,UAAUC,IAAI,sBAAuB,wBACpDL,KAAKmR,SAAS,QAEd,MAAM8mB,QAAiB,UAAkBuK,YAAYxiC,KAAKgS,QAAQ,GAE5Doa,EAAiC,IAAgB2L,QAAQ/3B,KAAKgS,QAC9DwlB,EAAc,IAAgBA,YAAYx3B,KAAKgS,QAC/CyvB,EAAY,IAAgBA,UAAUzhC,KAAKgS,QAE3CywB,EAAsC,GACtCC,EAAyBrL,IAC7BoL,EAAoB98B,KAAK0xB,IAG3Br3B,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,cAAgBgS,IAC9ChS,KAAKgS,SAAWA,GACjBywB,EAAoBn8B,QAAQ+wB,GAAYA,OAI5C,MAAMpwB,EAASjH,KAAKgS,OAAOmV,UAAS,GAEpC,CACE,MAAMsQ,EAAU,IAAI,GAAe,CAACe,aAAa,IAC3C7G,EAA4B,GAE5BrgB,EAAepR,SAASC,cAAc,OA+B5C,GA9BAmR,EAAalR,UAAUC,IAAI,iBAE3BL,KAAK2iC,mBAAqB,IAAI,IAAW,CACvCnxB,MAAOgmB,EAAc,mBAAqB,yBAC1CluB,KAAM,YACNmI,UAAW,IACXogB,UAAU,IAEZ7xB,KAAK4iC,sBAAwB,IAAI,IAAW,CAC1CpxB,MAAO,yBACPlI,KAAM,mBACNmI,UAAW,MAGbzR,KAAK2iC,mBAAmB3J,iBAAiB5M,EAAKxe,OAC9C5N,KAAK4iC,sBAAsB5J,iBAAiBf,EAAS4K,OAErDvxB,EAAavH,OAAO/J,KAAK2iC,mBAAmB1iC,UAAWD,KAAK4iC,sBAAsB3iC,WAElF0xB,EAAYhsB,KAAK3F,KAAK2iC,mBAAoB3iC,KAAK4iC,uBAE/C5iC,KAAK8iC,SAAW,IAAI,GAAS,CAC3B77B,SACA0qB,cACA5jB,eAAgB/N,KAAK+N,iBAEvB/N,KAAK6N,QAAQ9D,OAAO/J,KAAK8iC,SAASpxB,SAElC+lB,EAAQ5pB,QAAQ9D,OAAO/J,KAAK8iC,SAAS1xB,WAAWnR,UAAWqR,GAExD,IAAgBqrB,UAAU38B,KAAKgS,OAAQ,eAAgB,CACxD,MAAM+wB,EAAc,IAAI,GAAI,CAC1BhQ,aAAcyE,EAAc,cAAgB,YAC5C/tB,UAAW,KACT,MAAM+F,EAAM,IAAI,GAAexP,KAAKsN,QACpCkC,EAAIwC,OAAShS,KAAKgS,OAClBxC,EAAIyoB,SAAWA,EACfzoB,EAAIuB,OAEJ/Q,KAAK+N,eAAe1N,IAAImP,EAAIhB,cAA5BxO,CAA2C,UAAWgjC,IAExD31B,KAAM,SAGF21B,EAAsB,KAG1B,IAAIz0B,EAFJw0B,EAAYrX,SAASlZ,YAAc,GAIjCjE,EADCipB,EACMpL,EAAsByJ,SAAW,aAAe,cAEhDzJ,EAAsByJ,SAAW,kBAAoB,mBAG9DkN,EAAYrX,SAAS3hB,OAAO,eAAKwE,KAGnCy0B,IACAvL,EAAQ5pB,QAAQ9D,OAAOg5B,EAAY9iC,WAGrC,GAAG,IAAgB08B,UAAU38B,KAAKgS,OAAQ,wBAA0BwlB,EAAa,CAC/E,MAAMgI,EAAQ,CACZ,gBACA,aACA,gBACA,aACA,cACA,eACA,eACA,eAGIyD,EAAiB,IAAI,GAAI,CAC7BlQ,aAAc,qBACdtpB,UAAW,KACT,MAAM+F,EAAM,IAAI,GAAuBxP,KAAKsN,QAC5CkC,EAAIwC,OAAShS,KAAKgS,OAClBxC,EAAIuB,QAEN1D,KAAM,gBAGF61B,EAAuB,KAC3BD,EAAevX,SAASznB,UAAYu7B,EAAM2D,OAAO,CAACC,EAAKlJ,IAAMkJ,IAAO,IAAgBzG,UAAU38B,KAAKgS,OAAQkoB,EAAG9N,EAAKwT,uBAAwB,GAAK,IAAMJ,EAAMr9B,QAG9J+gC,IACAzL,EAAQ5pB,QAAQ9D,OAAOk5B,EAAehjC,WAEtCD,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,cAAgBgS,IAC9ChS,KAAKgS,SAAWA,GACjBkxB,MA+DN,GAjDAljC,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAE/B,YAAiBD,KAAK8iC,SAASpxB,QAAS,KACtC1R,KAAK8iC,SAASpxB,QAAQE,UAAW,EAEjC,IAAI6rB,EAA2B,GAE/B,MAAMtuB,EAAKnP,KAAKgS,OACbhS,KAAK2iC,mBAAmBpM,mBACzBkH,EAAS93B,KAAK,IAAgB09B,UAAUl0B,EAAInP,KAAK2iC,mBAAmBzgC,QAGnElC,KAAK4iC,sBAAsBrM,mBAC5BkH,EAAS93B,KAAK,IAAgB29B,UAAUn0B,EAAInP,KAAK4iC,sBAAsB1gC,QAGtElC,KAAK8iC,SAAS5xB,cACfusB,EAAS93B,KAAK3F,KAAK8iC,SAAS5xB,eAAerQ,KAAKoR,GACvC,IAAgBC,UAAU/C,EAAI8C,KAIzCpP,QAAQ0gC,KAAK9F,GAAUpc,QAAQ,KAC7BrhB,KAAK8iC,SAASpxB,QAAQ8xB,gBAAgB,YACtCxjC,KAAK+4B,WAEN,CAAChrB,eAAgB/N,KAAK+N,iBAuBtBypB,GAAe,IAAgBmF,UAAU38B,KAAKgS,OAAQ,eAAgB,CACvE,MAAMyxB,EAA4B,IAAI,KAAc,CAClDvmB,KAAM,wBACNS,UAAYyO,EAAsB9U,OAAOosB,WACzCtM,YAAY,IAGdp3B,KAAK+N,eAAe1N,IAAIojC,EAA0B1hC,MAAlD/B,CAAyD,SAAU,KACjE,MAAMsM,EAASm3B,EAA0BpL,kBAAiB,GAC1D,IAAgBsL,iBAAiB3jC,KAAKgS,OAAQyxB,EAA0B9lB,SAAS9c,KAAK,KACpFyL,QAIJo2B,EAAsB,KACpBe,EAA0B//B,mBAAoB0oB,EAAsB9U,OAAOosB,cAG7EjM,EAAQ5pB,QAAQ9D,OAAO05B,EAA0BjyB,QAIrD,IAAIgmB,EAAa,CACf,MAAMC,EAAU,IAAI,GAAe,IAcnC,IAAID,GAAe,IAAgBmF,UAAU38B,KAAKgS,OAAQ,sBAAuB,CAC/E,MAAM4xB,EAA+B,IAAI,KAAc,CACrD1mB,KAAM,cACNka,YAAY,IAGdp3B,KAAK+N,eAAe1N,IAAIujC,EAA6B7hC,MAArD/B,CAA4D,SAAU,KACpE,MAAMsM,EAASs3B,EAA6BvL,kBAAiB,GAC7D,IAAgBwL,uBAAuB7jC,KAAKgS,QAAS4xB,EAA6BjmB,SAAS9c,KAAK,KAC9FyL,QAIJ,MAAMw3B,EAAe,KACnBF,EAA6BlgC,iBAAiB+9B,IAAexJ,EAAkC3gB,OAAOysB,oBAGxGD,IACApB,EAAsBoB,GAEtBrM,EAAQ5pB,QAAQ9D,OAAO65B,EAA6BpyB,OAGtDxR,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAGjC,GAAG,IAAgB08B,UAAU38B,KAAKgS,OAAQ,eAAgB,CACxD,MAAMylB,EAAU,IAAI,GAAe,IAE7B4H,EAAY,YAAO,qCAAsC,CAAChyB,KAAM,SAAU6P,KAAMsa,EAAc,yBAA2B,wBAE/H,YAAiB6H,EAAW,KAC1B,IAAI,GAAkBp4B,OAAwBvC,EAAYyB,IACxD,MAAMmG,EAAS,OAAA+rB,GAAA,GAAiB,CAACgH,IAAY,GAC7Cl5B,EAAQtF,KAAK,KACXb,KAAK+4B,SACJ,KACDzsB,SAGH,CAACyB,eAAgB/N,KAAK+N,iBAEzB0pB,EAAQ5pB,QAAQ9D,OAAOs1B,GAEvBr/B,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAG7BwhC,GAEFzhC,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,iBAAkB,EAAE0hC,cAAaC,gBAC/D16B,IAAWy6B,IACZ1hC,KAAKgS,OAAS2vB,EAAUzL,WACxBl2B,KAAKgkC,cAMH,OACR,OAAOhkC,KAAKgkC,S,aChSD,MAAM,WAA0B,EAMnC,OACRhkC,KAAKC,UAAUG,UAAUC,IAAI,sBAAuB,0BACpD,MAAM4jC,GAAS,IAAgBC,UAAUlkC,KAAKiH,OAAO8K,YACrD/R,KAAKmR,SAAS8yB,EAAQ,kBAAoB,QAE1C,CACE,MAAMxM,EAAU,IAAI,GAAe,CAACe,aAAa,IAC3C7G,EAA4B,GAE5BrgB,EAAepR,SAASC,cAAc,OAe5C,GAdAmR,EAAalR,UAAUC,IAAI,iBAE3BL,KAAKmkC,eAAiB,IAAI,IAAW,CACnC3yB,MAAO,YACPlI,KAAM,eACNmI,UAAW,GACXogB,UAAU,IAEZ7xB,KAAKokC,mBAAqB,IAAI,IAAW,CACvC5yB,MAAO,WACPlI,KAAM,mBACNmI,UAAW,KAGVzR,KAAKiH,OAAQ,CACd,MAAMo9B,EAAO,IAAgBC,QAAQtkC,KAAKiH,QAEvCg9B,GACDjkC,KAAKmkC,eAAeI,cAAcF,EAAKG,YACvCxkC,KAAKokC,mBAAmBG,cAAcF,EAAKI,aAE3CzkC,KAAKmkC,eAAenL,iBAAiBqL,EAAKG,YAC1CxkC,KAAKokC,mBAAmBpL,iBAAiBqL,EAAKI,YAelD,GAXAnzB,EAAavH,OAAO/J,KAAKmkC,eAAelkC,UAAWD,KAAKokC,mBAAmBnkC,WAC3E0xB,EAAYhsB,KAAK3F,KAAKmkC,eAAgBnkC,KAAKokC,oBAE3CpkC,KAAK8iC,SAAW,IAAI,GAAS,CAC3B77B,OAAQjH,KAAKiH,OACb0qB,cACA5jB,eAAgB/N,KAAK+N,eACrBmkB,iBAAiB,IAEnBlyB,KAAK6N,QAAQ9D,OAAO/J,KAAK8iC,SAASpxB,SAE/B1R,KAAKiH,OAAQ,CACd,MAAMulB,EAAMtsB,SAASC,cAAc,OACnCqsB,EAAIpsB,UAAUC,IAAI,eAClBmsB,EAAIziB,OAAO/J,KAAK8iC,SAAS7Q,YAEzB,MAAMyS,EAA6B,IAAI,KAAc,CACnDxnB,KAAM,kBAGRwnB,EAA2B3iC,MAAMf,iBAAiB,SAAWiB,IACvDA,EAAEyT,WAIN,IAAmBivB,SAAS3kC,KAAKiH,UAGnCjH,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,kBAAoB+gC,IACrD,GAAqB,eAAlBA,EAAOD,KAAK15B,EAAoB,OACnC,MAAMH,EAAS,IAAgB45B,UAAUE,EAAOD,KAAKA,MACrD,GAAG9gC,KAAKiH,SAAWA,EAAQ,CACzB,MAAM+S,GAAW,KAAwB4qB,QAAQ7D,EAAO8D,iBACrD7qB,IAAY0qB,EAA2B/mB,UACxC+mB,EAA2B/mB,QAAU3D,MAK3C,MAAM8qB,EAAiB5kC,SAASC,cAAc,OAC9C2kC,EAAe1kC,UAAUC,IAAI,gBAC7BykC,EAAe/6B,OAAO,IAAI,KAAU,CAClC9C,OAAQjH,KAAKiH,SACZ+N,SAGH,MAAM+vB,EAAqB7kC,SAASC,cAAc,OAMlD,GALA4kC,EAAmB3kC,UAAUC,IAAI,oBACjC0kC,EAAmBh7B,OAAO,eAAK,6BAE/B0tB,EAAQ5pB,QAAQ9D,OAAOyiB,EAAKsY,EAAgBC,EAAoBzzB,GAE5D2yB,EASG,CACL,MAAMI,EAAO,IAAgBC,QAAQtkC,KAAKiH,QAEpC+9B,EAAW,IAAI,GAAI,CACvB33B,KAAM,QACN0lB,aAAcsR,EAAKY,WAAQvgC,EAAY,eACvCkJ,MAAOy2B,EAAKY,MAAQ,IAAgBC,gBAAgBb,EAAKY,YAASvgC,EAClE+tB,gBAAiB4R,EAAKY,MAAQ,QAAU,4BACxCvS,iBAAkB2R,EAAKY,WAAQvgC,EAAY,CAAC,IAAI,KAAU,CAACuC,OAAQjH,KAAKiH,SAAS+N,WAGnFyiB,EAAQ5pB,QAAQ9D,OAAOi7B,EAAS/kC,eApBvB,CACT,MAAMklC,EAAmB,IAAI,GAAI,CAC/B/nB,cAAesnB,IAGX1qB,GAAW,KAAwBorB,iBAAiBplC,KAAKiH,QAAQ,GACvEy9B,EAA2B/mB,QAAU3D,EAErCyd,EAAQ5pB,QAAQ9D,OAAOo7B,EAAiBllC,iBAe1Cw3B,EAAQ5pB,QAAQ9D,OAAOuH,GAGzBtR,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAE/B,YAAiBD,KAAK8iC,SAASpxB,QAAS,KACtC1R,KAAK8iC,SAASpxB,QAAQE,UAAW,EAEjC,IAAgByzB,WAAWrlC,KAAKiH,OAAQjH,KAAKmkC,eAAejiC,MAAOlC,KAAKokC,mBAAmBliC,MAAO,IAAgBoiC,QAAQtkC,KAAKiH,QAAQg+B,OACtI5jB,QAAQ,KACPrhB,KAAK8iC,SAASpxB,QAAQ8xB,gBAAgB,YACtCxjC,KAAK+4B,WAEN,CAAChrB,eAAgB/N,KAAK+N,iBAG3B,IAAIk2B,EAAO,CACT,MAAMxM,EAAU,IAAI,GAAe,IAI7B4H,EAAY,YAAO,qCAAsC,CAAChyB,KAAM,SAAU6P,KAAM,2BAEtF,YAAiBmiB,EAAW,KAC1B,IAAI,GAAU,uBAAwB,CACpCp4B,OAAQjH,KAAKiH,OACb8rB,aAAc,gBACd+D,mBAAoB,0BACpBlZ,QAAS,aAAgB,CAAC,CACxBwW,QAAS,SACTiD,SAAU,KACR,MAAM/qB,EAAS,OAAA+rB,GAAA,GAAiB,CAACgH,IAAY,GAE7C,IAAgBiG,eAAe,CAACtlC,KAAKiH,SAASpG,KAAK,KACjDb,KAAK+4B,SACJ,KACDzsB,OAGJg2B,UAAU,OAEX7jB,QACF,CAAC1Q,eAAgB/N,KAAK+N,iBAEzB0pB,EAAQ5pB,QAAQ9D,OAAOs1B,GAEvBr/B,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,aChLtB,MAAM,WAAyB,EAOlC,OACRD,KAAK0R,QAAU,EAAa,CAACrE,KAAM,eACnCrN,KAAK6N,QAAQ9D,OAAO/J,KAAK0R,SACzB1R,KAAK+K,WAAW9K,UAAU0B,SAE1B3B,KAAK0R,QAAQ1Q,iBAAiB,QAAS,KACrC,MAAM8Q,EAAU9R,KAAK+mB,SAAS0X,cAAch2B,IAAI88B,GAAOA,EAAIpe,YAE3D,GAAGnnB,KAAKwlC,UACNxlC,KAAKg/B,QAAQltB,GACb9R,KAAK+4B,YACA,CACL,MAAM5yB,EAAUnG,KAAKg/B,QAAQltB,GAE1B3L,aAAmBtD,QACpB7C,KAAKylC,gBAAgBt/B,QACDzB,IAAZyB,GACRnG,KAAK+4B,WAMN,gBAAgB5yB,GACrB,MAAMu/B,EAAe,aAAgB1lC,KAAK0R,QAAS,cAEnDvL,EAAQtF,KAAK,KACXb,KAAK+4B,SACJ,KACD2M,MAIG,KAAK1iC,GAQV,MAAM2iC,EAAM1iC,MAAM8N,OAElB/Q,KAAKmR,SAASnO,EAAQ4K,OACtB5N,KAAKy5B,SAAWz2B,EAAQG,KACxBnD,KAAKg/B,QAAUh8B,EAAQg8B,QACvBh/B,KAAKwlC,UAAYxiC,EAAQwiC,UAEzB,MAAMI,EAA8B,YAAlB5lC,KAAKy5B,SAqBvB,OApBAz5B,KAAK+mB,SAAW,IAAI,GAAe,CACjCsU,SAAUr7B,KAAK6N,QACf1C,SAAUnL,KAAKwlC,UAAY,KAAQrjC,IACjCnC,KAAK0R,QAAQtR,UAAUkM,OAAO,eAAgBnK,IAEhDs3B,SAAU,CAACmM,EAAY,UAAY,YACnCh5B,YAAa5J,EAAQ4J,YACrB+sB,WAAYiM,EACZrL,iBAAkBqL,EAAY,CAAC,aAAc,eAAYlhC,IAGxD1B,EAAQ6iC,iBACT7lC,KAAK+mB,SAAS+e,WAAW9iC,EAAQ6iC,iBAGnC7lC,KAAK0R,QAAQtR,UAAUC,IAAI,oBAC3BL,KAAK0R,QAAQzN,UAAY,GACzBjE,KAAK0R,QAAQE,UAAW,EACxB5R,KAAK0R,QAAQtR,UAAUkM,OAAO,aAActM,KAAKwlC,WAE1CG,GCpFI,QAFa,gBAAc,ECF3B,SAASI,KACtB,MAAMniB,EAAM1jB,SAAS2jB,gBAAgB,6BAA8B,OACnED,EAAIE,eAAe,KAAM,UAAW,aACpCF,EAAIE,eAAe,KAAM,QAAS,MAClCF,EAAIE,eAAe,KAAM,SAAU,MACnCF,EAAIxjB,UAAUC,IAAI,iBAElB,MAAM2lC,EAAM9lC,SAAS2jB,gBAAgB,6BAA8B,OACnEmiB,EAAIliB,eAAe,KAAM,OAAQ,wBACjCkiB,EAAI5lC,UAAUC,IAAI,uBAElB,MAAM4lC,EAAO/lC,SAAS2jB,gBAAgB,6BAA8B,OAMpE,OALAoiB,EAAKniB,eAAe,KAAM,OAAQ,mBAClCmiB,EAAK7lC,UAAUC,IAAI,kBAEnBujB,EAAI7Z,OAAOi8B,EAAKC,GAETriB,ECNT,MAAMsiB,GAAYjkC,GACRA,EAAiB+Y,QAAW/Y,EAAiB+Y,QAAQ,GAAK/Y,EAG9DkkC,GAAyB56B,OAE/B,IAAI66B,IAAe,EACnBx9B,EAAA,QAAU5H,iBAAiB,sBAAwB6d,IACjDunB,GAAevnB,IAcF,MAAM,GAenB,YAAY7b,GATJ,KAAAqjC,OAA6M,WAC7M,KAAA3oB,aAAc,EACd,KAAA4oB,iBAAqD,EAGrD,KAAAC,SAAU,EACV,KAAAC,MAAgB,KAChB,KAAAC,MAAgB,KAsCxB,KAAAr9B,MAASnH,IAKJ,sBACDkkC,GAAuB98B,oBAAoB,YAAarJ,KAAK0mC,WAAY,CAACvb,SAAS,KAEnFgb,GAAuB98B,oBAAoB,YAAarJ,KAAK0mC,YAC7D1mC,KAAK2mC,YAAYhkC,MAAM0jC,OAAS,IAG/BrmC,KAAK4mC,SAAW5mC,KAAKumC,SACtBvmC,KAAK4mC,UAGP5mC,KAAKwmC,MAAQxmC,KAAKymC,MAAQ,KAC1BzmC,KAAKumC,SAAU,GAGjB,KAAAM,YAAeC,IACb,MAAM7kC,EAAIikC,GAASY,GACnB,GAAG9mC,KAAK+mC,oBAAsB/mC,KAAK+mC,kBAAkBD,GACnD,OAAO9mC,KAAKoJ,QAGdpJ,KAAKwmC,MAAQvkC,EAAEgZ,QACfjb,KAAKymC,MAAQxkC,EAAEiZ,QAEZ,sBACDirB,GAAuBnlC,iBAAiB,YAAahB,KAAK0mC,WAAY,CAACprB,SAAS,EAAO6P,SAAS,IAEhGgb,GAAuBnlC,iBAAiB,YAAahB,KAAK0mC,YAAY,IAI1E,KAAAA,WAAcI,IACZ,GAAkB,OAAf9mC,KAAKwmC,OAAiC,OAAfxmC,KAAKymC,OAAkBL,GAE/C,YADApmC,KAAKoJ,QAIJpJ,KAAK0d,aACN,OAAAA,EAAA,GAAYopB,GAGd,MAAM7kC,EAAIikC,GAASY,GACbE,EAAM/kC,EAAEgZ,QACRgsB,EAAMhlC,EAAEiZ,QAERgsB,EAAQlnC,KAAKwmC,MAAQQ,EACrBG,EAAQnnC,KAAKymC,MAAQQ,EAE3B,IAAIjnC,KAAKumC,QAAS,CAChB,IAAIW,IAAUC,EACZ,OAGFnnC,KAAKumC,SAAU,EAEX,uBACFvmC,KAAK2mC,YAAYhkC,MAAMykC,YAAY,SAAUpnC,KAAKqmC,OAAQ,aAGzDrmC,KAAKqnC,cACNrnC,KAAKqnC,eAmBT,MAAMC,EAAgBtnC,KAAKunC,QAAQL,EAAOC,EAAOL,QAC5BpiC,IAAlB4iC,GAA+BA,GAChCtnC,KAAKoJ,SAzHP,YAAWpJ,KAAMgD,GAEjBhD,KAAK2mC,YAAc3mC,KAAKgV,QAExBhV,KAAK2f,eAGA,eACD,uBAIF3f,KAAKgV,QAAQhU,iBAAiB,aAAchB,KAAK6mC,YAAa7mC,KAAKsmC,iBACnEH,GAAuBnlC,iBAAiB,WAAYhB,KAAKoJ,SAJzDpJ,KAAKgV,QAAQhU,iBAAiB,YAAahB,KAAK6mC,YAAa7mC,KAAKsmC,iBAClEH,GAAuBnlC,iBAAiB,UAAWhB,KAAKoJ,QAOrD,kBACD,uBAIFpJ,KAAKgV,QAAQ3L,oBAAoB,aAAcrJ,KAAK6mC,YAAa7mC,KAAKsmC,iBACtEH,GAAuB98B,oBAAoB,WAAYrJ,KAAKoJ,SAJ5DpJ,KAAKgV,QAAQ3L,oBAAoB,YAAarJ,KAAK6mC,YAAa7mC,KAAKsmC,iBACrEH,GAAuB98B,oBAAoB,UAAWrJ,KAAKoJ,QAOxD,UAAUi9B,GACfrmC,KAAKqmC,OAASA,GAEV,uBAAsBrmC,KAAKumC,SAC7BvmC,KAAK2mC,YAAYhkC,MAAMykC,YAAY,SAAUpnC,KAAKqmC,OAAQ,c,2SCtDjD,MAAM,GAgBnB,YAAmBt7B,GAAA,KAAAA,aAFX,KAAAy8B,cAA0C,IAAI93B,IAsR/C,KAAAjJ,YAAeghC,IACpB,MAAMC,EAASxnC,SAASC,cAAc,OAGtC,IAAIqE,EAFJkjC,EAAOtnC,UAAUC,IAAI,GAAmBsnC,WAAa,UAAW,mBAG7DF,IACDjjC,EAA4B,iBAAd,EACZ,IAAiBojC,SAASH,GACzBA,EAAQljC,OAAuDC,OAGpE,MAAM4lB,EAAM,IAAIyd,MAChBzd,EAAIhqB,UAAUC,IAAI,gBAClB+pB,EAAI0d,WAAY,EAEhB,MAAMC,EAAe,KACnB,GAAGvjC,EAAO,CACR,MAAMkH,EAAMie,GAAU,CACpB1pB,UAAWynC,EACXljC,QACA1E,KAAM,IAAiB6sB,gBAAgBnoB,EAAO,IAAK,KAAK,GACxDulB,kBAAkB,IAGpB,CAACre,EAAIue,OAAOC,MAAOxe,EAAIue,OAAOE,MAAMviB,OAAOc,SAASpC,QAAQ8jB,IAC1DA,EAAIhqB,UAAUC,IAAI,sBAEf,CACL,MAAMmE,EAAQ,IAAgBmU,aAAa3Y,KAAKiH,QAChD2R,EAAA,EAAkBovB,UAAUN,EAAQ1nC,KAAKiH,OAAQzC,EAAO,YAAa4lB,KAezE,OAXGpqB,KAAKioC,QAAQh+B,mBAvUC,EAwUf89B,KAEA/nC,KAAKkoC,qBAAqBC,QAAQT,GAClC1nC,KAAKwnC,cAAc7yB,IAAI+yB,EAAQK,IAGjC/nC,KAAKioC,QAAQl+B,OAAO29B,GAEpB1nC,KAAK8N,SAEE25B,GA/TPznC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,GAAmBsnC,WAAa,cAE7D3nC,KAAKioC,QAAU/nC,SAASC,cAAc,OACtCH,KAAKioC,QAAQ7nC,UAAUC,IAAI,GAAmBsnC,WAAa,YAE3D3nC,KAAKooC,SAAWloC,SAASC,cAAc,OACvCH,KAAKooC,SAAShoC,UAAUC,IAAI,GAAmBsnC,WAAa,aAE5D3nC,KAAK8/B,KAAO5/B,SAASC,cAAc,OACnCH,KAAK8/B,KAAK1/B,UAAUC,IAAI,GAAmBsnC,WAAa,SAExD3nC,KAAKoO,KAAOlO,SAASC,cAAc,OACnCH,KAAKoO,KAAKhO,UAAUC,IAAI,GAAmBsnC,WAAa,SAExD3nC,KAAKqoC,cAAgBnoC,SAASC,cAAc,OAC5CH,KAAKqoC,cAAcjoC,UAAUC,IAAI,GAAmBsnC,WAAa,SAAU,wBAM3E3nC,KAAKsoC,UAAYpoC,SAASC,cAAc,OACxCH,KAAKsoC,UAAUloC,UAAUC,IAAI,GAAmBsnC,WAAa,SAAU,GAAmBA,WAAa,cAAe,oBAMtH3nC,KAAKC,UAAU8J,OAAO/J,KAAKioC,QAASjoC,KAAKooC,SAAUpoC,KAAK8/B,KAAM9/B,KAAKoO,KAAMpO,KAAKqoC,cAAeroC,KAAKsoC,WAElG,MAAMC,EAAiB,IACY,IAA9BvoC,KAAK+K,WAAWy9B,YACjBxoC,KAAK+K,WAAWkzB,kBAAkBj+B,KAAK+K,WAAW9K,UAAUygB,kBAAkC,UACvF,GAOX,IAAImK,GAAS,EACT4d,GAAS,EACb,YAAiBzoC,KAAKC,UAAiB6mC,GAAO,mCAC5C,GAAG2B,EAED,YADA,OAAA/qB,EAAA,GAAYopB,GAId,GAAGjc,EAED,YADAA,GAAS,GAIX,IAAI0d,IACF,OAGF,MAAM1sB,EAAO7b,KAAKC,UAAU6b,wBAItBvB,EADIusB,EACEtsB,MAENkuB,EAASnuB,EAAIsB,EAAKkB,KACxB,IAAK/c,KAAKiV,WAAWrQ,SAASzC,SAAWnC,KAAKiV,WAAWpQ,KAAK1C,QACxDumC,EAAU7sB,EAAKnb,OA1BH,EAAI,IA0BuBgoC,EAAU7sB,EAAKnb,MAAQmb,EAAKnb,OA1BvD,EAAI,GA0B0E,CAC9F,MAAMuG,EAASjH,KAAKiH,OAEduB,EAAsF,GAC5FxI,KAAKiV,WAAWrQ,SAAShB,OAAO5D,KAAKiV,WAAW7P,QAASpF,KAAKiV,WAAWpQ,MAAMyB,QAAQ,CAACb,EAAMpB,KAC5FmE,EAAQ7C,KAAK,CACXqP,QAAmBhV,KAAKioC,QAAQ7iB,SAAS/gB,GACzCoB,WAIJ,MAAMkjC,EAAcngC,EAAQ/E,MAAM,EAAGzD,KAAKiV,WAAWrQ,SAASzC,QACxDymC,EAAcpgC,EAAQ/E,MAAMzD,KAAKiV,WAAWrQ,SAASzC,OAAS,GAE9D0S,EAAS7U,KAAKioC,QAAQ7iB,SAASplB,KAAKiV,WAAWrQ,SAASzC,QAC9DsmC,GAAS,EACTI,GAAiBh0B,EAAQ5N,EAAQ,IAAMA,IAAWjH,KAAKiH,OAAQjH,KAAKiV,WAAW7P,QAASujC,EAAaC,GACrGH,GAAS,MACJ,CACL,MACMK,EAAUvuB,EADAsB,EAAKktB,MAASltB,EAAKnb,MAAQ,EAQzC,IAAIsoC,EAHJhpC,KAAKioC,QAAQ7nC,UAAUC,IAAI,iBACtBL,KAAKioC,QAAQgB,WAIwDD,EAD7C,IAA1BhpC,KAAKiV,WAAWqH,OAAgBwsB,EAC3B9oC,KAAKiV,WAAWqH,QAAWtc,KAAKiV,WAAWtQ,MAAQ,GAAMmkC,IAAsB9oC,KAAKiV,WAAWtQ,MAAQ,GAC/FmkC,EAAU,GAAK,EAFwB9oC,KAAKiV,WAAWtQ,MAAQ,EAG/E3E,KAAKiV,WAAWG,GAAG4zB,GAEnB,aAAQ,KACNhpC,KAAKioC,QAAQ7nC,UAAUuB,OAAO,wBAMtC,MAAMunC,EAAkB,KACtBre,GAAS,EACT3qB,SAASiW,KAAKnV,iBAAiB,sBAAqB,WAAa,QAAUiB,IACzE4oB,GAAS,GACR,CAAClT,MAAM,KAGZ,IAAIjX,EAAQ,EAAG6Z,EAAI,EAAG4uB,EAAY,EAAkBC,EAAO,EACtC,IAAI,GAAa,CACpCp0B,QAAShV,KAAKioC,QACdV,QAAS,CAACL,EAAOC,KACfgC,EAAYjC,EACZ,IAAImC,EAAQ9uB,EAAI2sB,GAAS,GAAmBoC,MAM5C,OALGD,EAAQ,EAAGA,EAAQ,EACdA,EAAQD,IAAMC,EAAQD,GAE9BppC,KAAKioC,QAAQtlC,MAAMga,UAAY,GAAmB4sB,mBAAmB/lC,QAAQ,MAAO6lC,EAAQ,OAErF,GAETtC,kBAAoB9kC,GACdsmC,KAIMvoC,KAAKC,UAAUG,UAAUuR,SAAS,eAAgB82B,GAH1DS,IACA,OAAAxrB,EAAA,GAAYzb,IACL,GAOXolC,aAAc,KACZ,MAAMxrB,EAAO7b,KAAKioC,QAAQnsB,wBAC1Bpb,EAAQmb,EAAKnb,MACb0oC,GAAQ1oC,GAASV,KAAKoO,KAAKnE,kBAAoB,GAI/CsQ,EAAIsB,EAAKkB,KAAO/c,KAAKC,UAAU6b,wBAAwBiB,KAEvD/c,KAAKioC,QAAQtlC,MAAMga,UAAY,GAAmB4sB,mBAAmB/lC,QAAQ,MAAO+W,EAAI,MAExFva,KAAKC,UAAUG,UAAUC,IAAI,cAC7BL,KAAKioC,QAAQ7nC,UAAUC,IAAI,iBACtBL,KAAKioC,QAAQgB,YAEpBrC,QAAS,KACP,MAAM4C,EAAWnnC,KAAKkjB,KAAKljB,KAAKyuB,IAAIqY,IAAczoC,EAAQ,GAAmB4oC,SAAWH,GAAa,EAAI,GAAK,GAC9GD,IAIAlpC,KAAKioC,QAAQ7nC,UAAUuB,OAAO,iBAC9B,aAAQ,KACN3B,KAAKiV,WAAWG,GAAGo0B,GACnBxpC,KAAKC,UAAUG,UAAUuB,OAAO,mBAKtC3B,KAAKkoC,qBAAuB,IAAIuB,qBAAqBC,IACnDA,EAAQpjC,QAAQqjC,IACVA,EAAMC,gBAIV5pC,KAAK6pC,oBAAoBF,EAAM90B,YAK9B,QAAQ5N,GACbjH,KAAKiH,OAASA,EAEd,MAAMzC,EAAQ,IAAgBmU,aAAa1R,GAC3C,IAAIzC,EACF,OAGF,MAAMyQ,EAA+CjV,KAAKiV,WAAa,IAAI,EAAW,CACpFlQ,UAAW,GACXqB,SAAU,CAACF,EAAQF,EAAOjB,KACxB,IAAIiB,EAAO,OAAOnD,QAAQoD,QAAQ,CAACtB,WAAOD,EAAWc,MAAO,KAE5D,GAAGyB,EAAOw1B,SAAU,CAClB,MAAM71B,EAA4BV,GAAU+O,EAAW7P,QACvD,OAAO,IAAiB0kC,cAAc7iC,EAAQL,EAAO7B,GAAWlE,KAAKqB,IAC5D,CACLyC,MAAOzC,EAAMyC,MACba,MAAOtD,EAAM6nC,UAGZ,CACL,MAAMtM,EAA6E,GAenF,OAdIxoB,EAAW7P,SACbq4B,EAAS93B,KAAK,UAAkB68B,YAAYv7B,EAAOivB,aAGrDuH,EAAS93B,KAAK,IAAmBoB,UAAU,CACzCE,SACAL,MAAOojC,OAAOC,iBACd9iC,YAAa,CACXC,EAAG,iCAELF,MAAOnC,EACP4B,UAAW,KAGN9D,QAAQC,IAAI26B,GAAU58B,KAAMwF,IACjC,MAAMnE,EAAQmE,EAAOX,MAIrB,GAFAxB,EAAyBhC,IAErB+S,EAAW7P,QAAS,CACtB,MAAM6yB,EAAW5xB,EAAO,GAClBjC,EAAUlC,EAAMiC,QAAQ83B,cAAciO,GACjCA,EAA6B3lC,OAAuDC,MAAM2K,KAAO8oB,EAASkS,WAAWh7B,IAGhI8F,EAAW7P,QAAUhB,GAAW,IAAmBgmC,0BAA0BpqC,KAAKiH,OAAQgxB,EAASkS,YAIrG,MAAO,CACLxlC,MAAOzC,EAAMyC,MACba,MAAOtD,EAAMiC,aAKrBsC,YAAazG,KAAKyG,YAClBV,OAAQ,CAACN,EAAMO,KACb,MAAMmJ,EAAKnP,KAAKiV,WAAWqH,MAErB/B,EAAI,IAAM,GAAmB+uB,MAAQn6B,EAC3CnP,KAAKioC,QAAQtlC,MAAMga,UAAY,GAAmB4sB,mBAAmB/lC,QAAQ,MAAO,IAAI+W,MAExF,MAAM8vB,EAAYrqC,KAAKoO,KAAKyB,cAAc,WACvCw6B,GAAWA,EAAUjqC,UAAUuB,OAAO,UAE7B3B,KAAKoO,KAAKgX,SAASjW,GAC3B/O,UAAUC,IAAI,UAElBL,KAAK6pC,oBAAoB7pC,KAAKioC,QAAQ7iB,SAASjW,OAIpC,qBAAZ3K,EAAM4C,IACP6N,EAAW7P,QAAUZ,EAAM8lC,UAG7BtqC,KAAKyG,YAAYwO,EAAW7P,SAG5B6P,EAAWnP,MAAK,GAGX,SACL,MAAM0J,EAAMtP,SAASC,cAAc,OACnCqP,EAAIpP,UAAUC,IAAI,GAAmBsnC,WAAa,QAClD3nC,KAAKoO,KAAKrE,OAAOyF,GAEkB,IAAhCxP,KAAKoO,KAAKnE,mBACXuF,EAAIpP,UAAUC,IAAI,UAGpBL,KAAKC,UAAUG,UAAUkM,OAAO,YAAatM,KAAKoO,KAAKnE,mBAAqB,GAkDtE,oBAAoB4K,GAC1B,MAAMuQ,EAAWjd,MAAMC,KAAKyM,EAAO/D,cAAcsU,UAC3C/gB,EAAM+gB,EAAS7I,QAAQ1H,GACfuQ,EAAS3hB,MAAMpB,KAAKP,IAAI,EAAGuC,EAxVxB,GAwV6ChC,KAAKC,IAAI8iB,EAASjjB,OAAQkC,EAxVvE,IA0VXiC,QAAQuO,IACZ,MAAMwiB,EAAWr3B,KAAKwnC,cAAcx3B,IAAI6E,GACrCwiB,IACDA,IACAr3B,KAAKwnC,cAAcn5B,OAAOwG,GAC1B7U,KAAKkoC,qBAAqBqC,UAAU11B,OA5V3B,GAAA8yB,WAAa,kBACb,GAAA2B,MAAQ,GAAqB,EAAI,EACjC,GAAAC,mBAAqB,GAAqB,mCAAmC,GAAmBD,SAAW,oBCE5H,IAAIkB,GAAU,CAACttB,EAAcgU,KAEzBA,EAAItjB,MAAM3J,UAAYiZ,EACtBgU,EAAIjxB,UAAU0C,MAAMC,QAAU,IAInB,MAAM,GAmBnB,YAAmBmI,GAAA,KAAAA,aA+HZ,KAAA0/B,cAAgB,CAACC,GAAY,KAClC,IAAI1qC,KAAKiH,OAAQ,OAEjB,MAAMA,EAASjH,KAAKiH,OACpB,GAAawjC,cAAczqC,KAAKiH,OAAQjH,KAAK0rB,SAAUgf,GAAW,EAAM,IAAMzjC,IAAWjH,KAAKiH,SAlI1F,IACFjH,KAAK+K,WAAW9K,UAAUG,UAAUC,IAAI,eAIrC,OACLL,KAAKkO,KAAO,KAEZlO,KAAKgV,QAAU9U,SAASC,cAAc,OACtCH,KAAKgV,QAAQ5U,UAAUC,IAAI,mBAE3BL,KAAKy3B,QAAU,IAAI,GAAe,CAChCe,aAAa,IAGfx4B,KAAK0nC,OAAS,IAAI,GAClB1nC,KAAK0nC,OAAOtnC,UAAUC,IAAI,iBAAkB,cAC5CL,KAAK0nC,OAAOtkC,aAAa,SAAU,KACnCpD,KAAK0nC,OAAOtkC,aAAa,YAAa,IAEtCpD,KAAKsJ,KAAOpJ,SAASC,cAAc,OACnCH,KAAKsJ,KAAKlJ,UAAUC,IAAI,gBAExBL,KAAK0rB,SAAWxrB,SAASC,cAAc,OACvCH,KAAK0rB,SAAStrB,UAAUC,IAAI,oBAE5BL,KAAK2qC,IAAM,IAAI,GAAI,CACjB/8B,MAAO,IACP6kB,gBAAiB,UACjBplB,KAAM,OACN5D,UAAYxH,IAC+B,MAArCA,EAAE4S,OAAuB+1B,SAI7B,UAAkBC,mBAAmB7qC,KAAKiH,QAAQpG,KAAKspB,IACrDiJ,GAAoBjJ,EAAK0Y,OACzBtO,GAAM,UAAKvb,OAAO,aAAa,SAKrChZ,KAAK2qC,IAAI/8B,MAAMxN,UAAUC,IAAI,YAE7BL,KAAK61B,SAAW,IAAI,GAAI,CACtBjoB,MAAO,IACP6kB,gBAAiB,WACjBplB,KAAM,WACN5D,UAAW,KAET2pB,GAAoB,IADc,IAAgBqH,QAAQz6B,KAAKiH,QAChC4uB,UAC/BtB,GAAM,UAAKvb,OAAO,kBAAkB,OAIxChZ,KAAKilC,MAAQ,IAAI,GAAI,CACnBr3B,MAAO,IACP6kB,gBAAiB,QACjBplB,KAAM,QACN5D,UAAW,KAET2pB,GAAoB,IADD,IAAgBkR,QAAQtkC,KAAKiH,QACjBg+B,OAC/B1Q,GAAM,UAAKvb,OAAO,eAAe,OAIrChZ,KAAK8qC,cAAgB,IAAI,GAAI,CAC3B1tB,cAAe,IAAI,KAAc,CAAC9Q,QAAQ,IAC1CymB,aAAc,gBACd1lB,KAAM,WAGRrN,KAAKy3B,QAAQ5pB,QAAQ9D,OAAO/J,KAAKilC,MAAMhlC,UAAWD,KAAK61B,SAAS51B,UAAWD,KAAK2qC,IAAI1qC,UAAWD,KAAK8qC,cAAc7qC,WAElHD,KAAKgV,QAAQjL,OAAO/J,KAAKy3B,QAAQx3B,UAAW8qC,MAE5C/qC,KAAK8qC,cAAc1tB,cAAcrb,MAAMf,iBAAiB,SAAWiB,IAC7DA,EAAEyT,WAKN,IAAmBivB,SAAS3kC,KAAKiH,UAGnC2B,EAAA,QAAU5H,iBAAiB,yBAA2B6K,IACpD,GAAG7L,KAAKiH,SAAW4E,EAAO5E,OAAQ,CAChC,MAAMkQ,EAAQ,KAAwBiuB,iBAAiBplC,KAAKiH,QAAQ,GACpEjH,KAAK8qC,cAAc1tB,cAAcO,SAAWxG,KAIhDvO,EAAA,QAAU5H,iBAAiB,eAAgB,EAAEiG,aACxCjH,KAAKiH,SAAWA,GACjBjH,KAAKyqC,kBAIT7hC,EAAA,QAAU5H,iBAAiB,gBAAkBiG,IACxCA,IAAWjH,KAAKiH,QACjBjH,KAAKgrC,QAAO,KAIhBpiC,EAAA,QAAU5H,iBAAiB,cAAgBoR,IACtCpS,KAAKiH,SAAWmL,GACjBpS,KAAKyqC,kBAIT7hC,EAAA,QAAU5H,iBAAiB,kBAAoBoR,IAC7C,GAAGpS,KAAKiH,SAAWmL,EAAQ,CACzB,MAAMiyB,EAAO,IAAgBC,QAAQlyB,GACjCiyB,EAAK/sB,OAAO2zB,OACX5G,EAAKY,MACNuF,GAAQ,IAAgBtF,gBAAgBb,EAAKY,OAAQjlC,KAAKilC,OAE1DjlC,KAAKilC,MAAMhlC,UAAU0C,MAAMC,QAAU,WAM7C5C,KAAKkrC,sBAAwB3/B,OAAO4/B,YAAYnrC,KAAKyqC,cAAe,KAU/D,cACLzqC,KAAK2qC,IAAI1qC,UAAU0C,MAAMC,QAAU,OACnC5C,KAAKilC,MAAMhlC,UAAU0C,MAAMC,QAAU,OACrC5C,KAAK61B,SAAS51B,UAAU0C,MAAMC,QAAU,OACxC5C,KAAK8qC,cAAc7qC,UAAU0C,MAAMC,QAAU,GAC7C5C,KAAK8qC,cAAc1tB,cAAcO,SAAU,EACxC3d,KAAKorC,gBACN7/B,OAAOyB,aAAahN,KAAKorC,eACzBprC,KAAKorC,cAAgB,GAIlB,YACL,GAAGprC,KAAKiH,SAAW2B,EAAA,QAAU6O,KAAM,CAGjC,GAFc,IAAgBkB,aAAa3Y,KAAKiH,QAEtC,CACR,MAAMokC,EAAarrC,KAAKioC,QAcxB,OAbAjoC,KAAKioC,QAAU,IAAI,GAAmBjoC,KAAK+K,YAC3C/K,KAAKioC,QAAQqD,QAAQtrC,KAAKiH,QAC1BjH,KAAKioC,QAAQnI,KAAK/1B,OAAO/J,KAAKsJ,KAAMtJ,KAAK0rB,UAEzC1rB,KAAK0nC,OAAO/lC,SAET0pC,EAAYA,EAAWprC,UAAU8oB,YAAY/oB,KAAKioC,QAAQhoC,WACxDD,KAAKgV,QAAQyK,QAAQzf,KAAKioC,QAAQhoC,gBAEpC,IACDD,KAAK+K,WAAW9K,UAAUG,UAAUC,IAAI,cAO3C,IACDL,KAAK+K,WAAW9K,UAAUG,UAAUuB,OAAO,YAG1C3B,KAAKioC,UACNjoC,KAAKioC,QAAQhoC,UAAU0B,SACvB3B,KAAKioC,aAAUvjC,GAGjB1E,KAAK0nC,OAAOtkC,aAAa,OAAQ,GAAKpD,KAAKiH,QAE3CjH,KAAKy3B,QAAQ5pB,QAAQ4R,QAAQzf,KAAK0nC,OAAQ1nC,KAAKsJ,KAAMtJ,KAAK0rB,UAGrD,sB,MACL,IAAI1rB,KAAKurC,QAAS,OAClBvrC,KAAKurC,SAAU,EAEf,MAAMtkC,EAASjH,KAAKiH,OAOpB,GALAjH,KAAKwrC,cAELxrC,KAAKyrC,YAGFxkC,IAAW2B,EAAA,QAAU6O,KAAM,CACb,IAAgBi0B,gBAAgBzkC,IAE7CujC,GAAQ,IAAgBkB,gBAAgBzkC,GAASjH,KAAK61B,UAGxD,MAAM1e,EAAQ,KAAwBiuB,iBAAiBn+B,GAAQ,GAC/DjH,KAAK8qC,cAAc1tB,cAAcO,SAAWxG,OAE5C,aAAQ,KACNnX,KAAK8qC,cAAc7qC,UAAU0C,MAAMC,QAAU,SAKjD,GAAGqE,EAAOw1B,SAAU,CAGlB,IAAI4H,EAAO,IAAgBC,QAAQr9B,GAChCo9B,EAAKY,OAASh+B,IAAW2B,EAAA,QAAU6O,MACpC+yB,GAAQ,IAAgBtF,gBAAgBb,EAAKY,OAAQjlC,KAAKilC,OAM9DjlC,KAAKgrC,SAEL,OAAAz+B,EAAA,GAAevM,KAAKsJ,KAAM,IAAI,KAAU,CACtCrC,SACA4E,QAAQ,IACPmJ,SAEH,MAAM8rB,EAAO,IAAgBrG,QAAQxzB,IACtB,QAAZ,EAAA65B,aAAI,EAAJA,EAAMxpB,cAAM,eAAEq0B,WACf3rC,KAAKsJ,KAAKS,OAAOg8B,MAGnB/lC,KAAKyqC,eAAc,GAGd,OAAOmB,GACT5rC,KAAKorC,gBACN7/B,OAAOyB,aAAahN,KAAKorC,eACzBprC,KAAKorC,cAAgB,GAGvB,MAAMnkC,EAASjH,KAAKiH,OACd6D,EAAW9K,KAAK8K,SAEtB,IAAI7D,EACF,OAGF,IAAId,EAEFA,EADCc,EAAOw1B,SACE,UAAkBoP,WAAW5kC,EAAQ2kC,GAAU/qC,KAAKirC,GACzD9rC,KAAKiH,SAAWA,GAAUjH,KAAK8K,WAAaA,IAK5CghC,EAASC,QAAU9kC,IAAW2B,EAAA,QAAU6O,MACzC+yB,GAAQsB,EAASC,OAAQ/rC,KAAK2qC,MAIzB,IAGC,UAAkBnI,YAAYv7B,EAAOivB,WAAY0V,GAAU/qC,KAAMo3B,GACtEj4B,KAAKiH,SAAWA,GAAUjH,KAAK8K,WAAaA,IAO5CmtB,EAAS4K,OACV2H,GAAQ,IAAkBwB,aAAa/T,EAAS4K,OAAQ7iC,KAAK2qC,MAGxD,IAIXxkC,EAAQtF,KAAMorC,IACTA,IACDjsC,KAAKorC,cAAgB7/B,OAAOC,WAAW,IAAMxL,KAAKgrC,QAAO,GAAO,QAK/D,QAAQ/jC,EAAgB6D,EAAW,GACrC9K,KAAKiH,SAAWA,GAAUjH,KAAK8K,WAAaA,IAE5C9K,KAAKkO,MACNlO,KAAKkO,OAGPlO,KAAKiH,OAASA,EACdjH,KAAK8K,SAAWA,EAEhB9K,KAAKurC,SAAU,ICtUJ,MAAM,WAA0B,EAiB7C,YAAYj+B,GACVrK,MAAMqK,GAAQ,GAdR,KAAAxC,SAAW,EAEX,KAAAohC,iBAIJ,GAWG,OAGLlsC,KAAKC,UAAUG,UAAUC,IAAI,yBAA0B,qBAGvD,MAAM8rC,EAAc,YAAO,gCAAiC,CAACx+B,UAAU,IACvE3N,KAAK0N,SAASqb,YAAYojB,GAC1BnsC,KAAK0N,SAAWy+B,EAEhB,MAAMC,EAAoBlsC,SAASC,cAAc,OACjDisC,EAAkBhsC,UAAUC,IAAI,uBAChC8rC,EAAYpiC,OAAOqiC,GAEnB,MAAMC,EAAsBnsC,SAASC,cAAc,OACnDksC,EAAoB7iC,UAAY,wBAEhC,MAAM8iC,EAAsBpsC,SAASC,cAAc,OACnDmsC,EAAoBlsC,UAAUC,IAAI,mBAElCL,KAAK4N,MAAM7D,OAAO,eAAK,YACvB/J,KAAKusC,QAAU,EAAW,QAG1BD,EAAoBviC,OAAO/J,KAAK4N,MAAO5N,KAAKusC,SAE5C,MAAMC,EAAqBtsC,SAASC,cAAc,OAClDqsC,EAAmBpsC,UAAUC,IAAI,mBAEjC,MAAMosC,EAA2BzsC,KAAK4N,MAAM8+B,YAC5CD,EAAY1iC,OAAO,eAAK,yBAExByiC,EAAmBziC,OAAO0iC,GAE1BJ,EAAoBtiC,OAAOuiC,EAAqBE,GAEhDxsC,KAAKyN,OAAO1D,OAAOsiC,GAInBrsC,KAAK2sC,QAAU,IAAI,GAAY3sC,KAAK+K,YACpC/K,KAAK2sC,QAAQz+B,OAEblO,KAAK+K,WAAWhB,OAAO/J,KAAK2sC,QAAQ33B,SAGpChV,KAAK+K,WAAW6hC,mBAAqB,KACnC,MAAM/wB,EAAO7b,KAAK6sC,YAAYC,IAAIhxB,wBAClC,IAAID,EAAKnb,MAAO,OAEhB,MACMqsC,EADMlxB,EAAK2X,IAAM,GALH,GAOpB4Y,EAAkBhsC,UAAUkM,OAAO,aAAcygC,GACjD/sC,KAAK6sC,YAAY5sC,UAAUG,UAAUkM,OAAO,mBAAoBygC,GAChEC,GAAYD,GAERA,GACF/sC,KAAK6sC,YAAYI,wBAIrB,MAAMD,EAAa,YAAiBX,EAAqB,aAAc,IAAK,MAAM,GAElFW,EAAW,GAEX,YAAiBhtC,KAAK0N,SAAWzL,IAC5BjC,KAAK0N,SAASgT,kBAAkBtgB,UAAUuR,SAAS,eACpD3R,KAAK+K,WAAWkzB,kBAAkBj+B,KAAK+K,WAAW9K,UAAUygB,kBAAkC,SAC9FssB,EAAW,GACXZ,EAAkBhsC,UAAUuB,OAAO,eAC1B3B,KAAK+K,WAAWmiC,4BACzBltC,KAAKsN,OAAOwB,oBAIhB,YAAiB9O,KAAKusC,QAAUtqC,IAC9B,IAAIuN,EAEFA,EADCxP,KAAKiH,OAAO42B,YACP,IAAI,GAAe79B,KAAKsN,QAExB,IAAI,GAAkBtN,KAAKsN,QAGhCkC,IACEA,aAAe,GAChBA,EAAIwC,OAAShS,KAAKiH,OAAOivB,WAEzB1mB,EAAIvI,OAASjH,KAAKiH,OAGpBuI,EAAIuB,UAIRnI,EAAA,QAAU5H,iBAAiB,kBAAoBoR,IAC1CpS,KAAKiH,SAAWmL,GACjBpS,KAAKmtC,kBAITvkC,EAAA,QAAU5H,iBAAiB,cAAgBgR,IACtChS,KAAKiH,SAAW+K,EAAOmV,UAAS,IACjCnnB,KAAKmtC,kBAITvkC,EAAA,QAAU5H,iBAAiB,sBAAwBosC,IACjD,IAAI,MAAMnmC,KAAUmmC,EAClBptC,KAAKqtC,kBAAkBpmC,EAAOkgB,WAAYhf,MAAMC,KAAKglC,EAAanmC,OAItE2B,EAAA,QAAU5H,iBAAiB,iBAAkB,EAAEiG,SAAQQ,WACrDzH,KAAKstC,sBAAsBrmC,EAAQkB,MAAMC,KAAKX,MAIhDmB,EAAA,QAAU5H,iBAAiB,eAAgB,EAAEoD,cAC3CpE,KAAKqtC,kBAAkBjpC,EAAQ6C,OAAQ,CAAC7C,EAAQyC,QAKlD7G,KAAK6sC,YAAc,IAAI,GAAe,CACpCU,UAAW,CAAC,CACVpmC,YAAa,2BACbmC,KAAM,oBACNnG,KAAM,WACL,CACDgE,YAAa,gCACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,8BACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,yBACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,2BACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,gCACbmC,KAAM,kBACNnG,KAAM,UAER4H,WAAY/K,KAAK+K,WACjByiC,YAAcC,IACZ,IAAI3gC,EAA4B,YAAlB2gC,EAAStqC,MAAsByF,EAAA,QAAUw1B,SAASC,kBAAoB,IAAM,EAC1F7yB,WAAW,KACTkiC,EAActtC,UAAUkM,OAAO,YAA+B,YAAlBmhC,EAAStqC,OACpD2J,MAIP9M,KAAK2sC,QAAQ33B,QAAQjL,OAAO/J,KAAK6sC,YAAY5sC,WAE7C,MAAMytC,EAAgB,EAAa,CAACrgC,KAAM,qBAC1CrN,KAAK6N,QAAQ9D,OAAO2jC,GAEpBA,EAAc1sC,iBAAiB,QAAS,KACtC,MAAMiG,EAASjH,KAAKiH,OACdkI,EAAKnP,KAAKiH,OAAOivB,WACjBuL,EAAY,IAAgBA,UAAUtyB,GAEtCw+B,EAAmB,CAAC77B,EAAmBulB,KAC3C,IAAItE,EAA2B4D,EAC7BG,EAAiCG,EACjCC,EAEF,GAAGplB,EAAQ3P,OAAS,EAClB4wB,EAAe,uBACf4D,EAAgB,CAAC,eAAK,UAAW,CAAC7kB,EAAQ3P,UAC1C20B,EAAqB,2BACrBG,EAAsBnlB,EAAQrJ,IAAIxB,IAChC,MAAMsB,EAAIrI,SAASC,cAAc,KAEjC,OADAoI,EAAEwB,OAAO,IAAI,KAAU,CAAC9C,WAAS+N,SAC1BzM,IAGLk5B,IACFvK,EAAa,CAAC,CACZha,KAAM,4BACNS,SAAS,SAGR,CACLoV,EAAe,yBACf+D,EAAqB,2BACrB,MAAMvuB,EAAIrI,SAASC,cAAc,KACjCoI,EAAEwB,OAAO,IAAI,KAAU,CACrB9C,OAAQ6K,EAAQ,KACfkD,SACHiiB,EAAsB,CAAC1uB,GAEnBk5B,IACFvK,EAAa,CAAC,CACZha,KAAM,8BACNqlB,SAAU,CAAC,IAAI,KAAU,CAACt7B,OAAQ6K,EAAQ,KAAKkD,SAC/C2I,SAAS,KAKfsZ,EAAoBtxB,KAAK,IAAI,KAAU,CACrCsB,WACC+N,SAEH,IAAI,GAAU,oBAAqB,CACjC/N,SACA8rB,eACA+D,qBACAG,sBACArZ,QAAS,CAAC,CACRwW,QAAS,MACTiD,aAEFH,eACCzY,QAGCmvB,EAAWnhC,IACC,4BAAbA,EAAItJ,MACLqxB,GAAS,CAACC,YAAa,wBAI3B,GAAGgN,EAAW,CACZ,MAAMjyB,EAAM,IAAI,GAAiBxP,KAAKsN,QACtCkC,EAAIuB,KAAK,CACP5N,KAAM,UACNqiC,WAAW,EACXxG,QAAUltB,IACR67B,EAAiB77B,EAAS,KACxB,MAAM3L,EAAU,IAAgB0nC,gBAAgB1+B,EAAI2C,GACpD3L,EAAQqG,MAAMohC,GACdp+B,EAAIi2B,gBAAgBt/B,MAGf,GAETyH,MAAO,kBACPhB,YAAa,uBAGf,IAAI,GAAc,CAChBgyB,UAAW,CAAC,YACZhyB,YAAa,SACb8xB,SAAWz3B,IACTuE,WAAW,KACTmiC,EAAiB,CAAC1mC,GAAU0W,IAC1B,IAAgBmwB,YAAY3+B,EAAIlI,EAAQ0W,EAAQ7d,UAAO4E,EAAY,GAClE8H,MAAMohC,MAER,QASN,kBAAkB3mC,EAAgBgB,GACvC,IAAGjI,KAAKkO,MAEJlO,KAAKksC,iBAAiBjlC,GAA1B,CAEAgB,EAAOA,EAAKxE,QAAQqB,UACpB,IAAI,MAAM2oC,KAAYztC,KAAK6sC,YAAYU,UAAW,CAChD,MAAMpmC,EAAcsmC,EAAStmC,YACvB4mC,EAAW/tC,KAAK6sC,YAAYmB,qBAAqB/lC,EAAKQ,IAAI5B,GAAO,IAAmB2S,iBAAiBvS,EAAQJ,IAAOM,GAC1H,GAAG4mC,EAAS5rC,OAAQ,CAClB,MAAMgC,EAAUnE,KAAKksC,iBAAiBjlC,GAAQE,GAC3ChD,GACDA,EAAQ0B,WAAWkoC,EAAStlC,IAAIrE,IAAW,CAAEyC,IAAKzC,EAAQyC,IAAKI,OAAQ7C,EAAQ6C,WAG9EjH,KAAKiH,SAAWA,IAA6D,IAAnDjH,KAAK6sC,YAAYoB,gBAAgB9mC,KAC5DnH,KAAK6sC,YAAYoB,gBAAgB9mC,IAAgB4mC,EAAS5rC,OAC1DnC,KAAK6sC,YAAYqB,oBAAoBH,EAAUN,GAAU,OAM1D,sBAAsBxmC,EAAgBgB,GAC3C,IAAGjI,KAAKkO,MAEJlO,KAAKksC,iBAAiBjlC,GAA1B,CAEA,IAAI,MAAMJ,KAAOoB,EACf,IAAI,MAAM9E,KAAQnD,KAAK6sC,YAAYU,UAAW,CAC5C,MAAMpmC,EAAchE,EAAKgE,YAEnBhD,EAAUnE,KAAKksC,iBAAiBjlC,GAAQE,GAC9C,IAAIhD,EAAS,SAEb,MAAME,EAAMF,EAAQgR,UAAU+0B,GAAKA,EAAErjC,MAAQA,GAC7C,IAAY,IAATxC,EAAY,CAGb,GAFAF,EAAQM,OAAOJ,EAAK,GAEjBrE,KAAKiH,SAAWA,EAAQ,CACzB,MACMulB,EADYxsB,KAAK6sC,YAAYz+B,KAAKjH,GAClB0I,cAAc,iBAAiBhJ,qBAAuBI,OACzEulB,IACExsB,KAAK6sC,YAAYsB,UAAUC,aAC5BpuC,KAAK6sC,YAAYsB,UAAUE,gBAAgB7hB,GAG7CA,EAAI7qB,UAGH3B,KAAK6sC,YAAYoB,gBAAgB9mC,IAAiB9C,EAAM,GACzDrE,KAAK6sC,YAAYoB,gBAAgB9mC,KAIrC,OAKNnH,KAAK+K,WAAW62B,YAGX,cAEL5hC,KAAK2sC,QAAQnB,cAEbxrC,KAAKusC,QAAQnsC,UAAUC,IAAI,QAE3BL,KAAK6sC,YAAYrB,aAAY,GAE7BxrC,KAAKC,UAAUG,UAAUkM,OAAO,kBAAmBtM,KAAK6sC,YAAYyB,kBAAoB,IAAgB3R,UAAU38B,KAAKiH,OAAOivB,WAAY,iBAKrI,aAAa/vB,GAClBnG,KAAK6sC,YAAY0B,UAAYpoC,EAGxB,QAAQc,EAAgB6D,EAAW,G,MACxC,OAAG9K,KAAKiH,SAAWA,GAAUjH,KAAK8K,WAAaA,KAE/C9K,KAAKiH,OAASA,EACdjH,KAAK8K,SAAWA,EAChB9K,KAAKwuC,aAAc,EAEhBxuC,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGdlO,KAAK6sC,YAAY4B,SAAS,CACxBxnC,SAEAynC,eAA6C,QAA7B,EAAA1uC,KAAKksC,iBAAiBjlC,UAAO,QAAKjH,KAAKksC,iBAAiBjlC,GAAU,KAGpFjH,KAAK2sC,QAAQrB,QAAQrkC,EAAQ6D,IAEtB,GAGF,sBACD9K,KAAKwuC,cAITxuC,KAAKwuC,aAAc,EAEnBxuC,KAAKwrC,cAELxrC,KAAK2sC,QAAQgC,sBAEb3uC,KAAKmtC,iBAGC,gBACN,IAAI1uB,EAEFA,EADCze,KAAKiH,OAAOw1B,SACNz8B,KAAKiH,SAAW2B,EAAA,QAAU6O,MAAQ,IAAgBysB,UAAUlkC,KAAKiH,OAAO8K,YAExE,IAAgB4qB,UAAU38B,KAAKiH,OAAOivB,WAAY,eAG3Dl2B,KAAKusC,QAAQnsC,UAAUkM,OAAO,QAASmS,GAGlC,iBAAiBmwB,EAAiBC,GAAW,GAClD7uC,KAAK6sC,YAAY/mC,KAAK8oC,EAAQC,GAGhC,qBACE7uC,KAAK+K,WAAW62B,YCrTpB,MAAM,GAAkB,IA7HjB,cAA8B,EAInC,cACE3+B,MAAM,CACJ2M,UAAW1P,SAAS4uC,eAAe,gBACnCjgC,cAAc,EACdI,eAAgB,UANZ,KAAA8/B,uBAAwB,EAS9BxrB,EAAA,EAAWviB,iBAAiB,eAAgB,CAACoH,EAAM4mC,KAC9CA,IAAO,IAAWC,QAAU7mC,IAAS,IAAW8mC,QACjDlvC,KAAKmvC,eAAc,KAIvB5rB,EAAA,EAAWviB,iBAAiB,SAAU,KACpChB,KAAKovC,wBAGPpvC,KAAKqvC,eAAiB,IAAI,GAAkBrvC,MAGvC,WAAWmP,EAAYC,EAAkBC,GAC1CrP,KAAK4O,cAAczM,QACrBnC,KAAKmvC,eAAc,EAAO//B,GAG5BnM,MAAMsM,WAAWJ,EAAIC,EAASC,GAaxB,sBACN,MAAMigC,EAAatvC,KAAK4P,UAAU2/B,YAAcvvC,KAAK4P,UAAU4/B,uBAAuBD,YACtFrvC,SAASuvC,gBAAgB9sC,MAAMykC,YAAY,4BAA6B,GAAKkI,GAGxE,cAAcI,EAAkBtgC,GAGrC,MAAMugC,EAASzvC,SAASiW,KAAK/V,UAAUuR,SApDE,yBAqDzC,IAAIi+B,EAaJ,QAZclrC,IAAXgrC,EACEA,EACGC,IACFC,GAAa,GAEPD,IACRC,GAAa,GAGfA,GAAa,GAGXA,EAAY,OAAO/sC,QAAQoD,UAE3B0pC,GAAW3vC,KAAK4O,cAAczM,QAChCnC,KAAKqvC,eAAet+B,OAIlB/Q,KAAK+uC,wBACP/uC,KAAKovC,sBACLpvC,KAAK+uC,uBAAwB,GAG/B,MAAMc,EAAmB,GAAa1hC,UAAUwhC,EAAS,EAAI,EAAGvgC,GAEhE,OADAlP,SAASiW,KAAK/V,UAAUkM,OA/EiB,wBA+EqBojC,GACvDG,IAgDX,KAAeC,gBAAkB,GAClB,UC9HA,MAAM,WAA0B,EAGnC,OACR9vC,KAAKC,UAAUkP,GAAK,yBACpBnP,KAAKC,UAAUG,UAAUC,IAAI,sBAE7BL,KAAK+vC,WAAa7vC,SAASC,cAAc,OACzCH,KAAK+vC,WAAW3vC,UAAUC,IAAI,gBAC9BL,KAAK+K,WAAWhB,OAAO/J,KAAK+vC,YAGvB,KAAK3rC,GACV,MAAMuhC,EAAM1iC,MAAM8N,OACZi/B,EAAO,KAAgBC,QAAQ7rC,EAAQ0O,MAAMk9B,KAAK7gC,IAExDnP,KAAKmR,SAAS6+B,EAAKA,KAAK14B,OAAO44B,KAAO,yBAA2B,0BAEjE,MAAMtiC,EAAQ1N,SAASC,cAAc,MACrCyN,EAAM3J,UAAY+rC,EAAKA,KAAKG,UAE5B,MAAMzzB,EAAWszB,EAAK9S,QAAQA,QAAQz0B,IAAI82B,GAAKA,EAAE6Q,OAASJ,EAAK9S,QAAQmT,aAAe,KACtFC,GAAc5zB,GAEd,MAAMka,EAAW12B,SAAS22B,yBAyF1B,OAxFAmZ,EAAK9S,QAAQA,QAAQ52B,QAAQ,CAACD,EAAQhC,KACpC,IAAIgC,EAAO+pC,OAAQ,OAEnB,MAAMG,EAAKrwC,SAASC,cAAc,MAE5BqwC,EAASR,EAAKA,KAAKS,QAAQpsC,GAG3BqsC,EAAWxwC,SAASC,cAAc,OACxCuwC,EAAStwC,UAAUC,IAAI,uBAEvB,MAAMswC,EAAczwC,SAASC,cAAc,OAC3CwwC,EAAY1sC,UAAY,IAAkB6nB,cAAc0kB,EAAOtzB,MAE/D,MAAM0zB,EAAiB1wC,SAASC,cAAc,OAC9CywC,EAAernB,UAAYlnB,KAAKE,MAAMma,EAASrY,IAAQ,IAEvDqsC,EAAS3mC,OAAO4mC,EAAaC,GAG7B,MAAMhnC,EAAO,GAAkBC,iBAC/BD,EAAKxJ,UAAUC,IAAI,uBAEnB,GAAkB2J,qBAAqBJ,EAAM,KAC3C,GAAgBkF,wBACfpK,GAAW,GAEdkF,EAAKjH,MAAMkuC,UAAyC,GAA7BxuC,KAAKC,IAAI+D,EAAO+pC,OAAQ,GAAU,KAEzDxZ,EAAS7sB,OAAOwmC,EAAIG,EAAU9mC,GAE9B,IAAI8lB,EAAgBxoB,EAAQ,EAAG+xB,GAAU,EAAOlc,EAAO1W,EAAO+pC,OAAS,EACvE,MAAMtqC,EAAO,KACRmzB,IACHA,GAAU,EAEV,KAAgB6X,SAAS1sC,EAASosC,EAAOO,OAAQrhB,EAAQxoB,GAAOrG,KAAKmwC,IACnEA,EAAUC,MAAM3qC,QAAQ4qC,IACtB,MAAM,IAACplC,GAAO,GAAkBC,aAAa,CAC3CF,OAAQqlC,EAAK/P,QAAQha,UAAS,GAC9BlnB,UAAW2J,EACXoC,YAAY,EACZqG,eAAe,EACfnG,WAAW,EACXD,WAAY,KAEdH,EAAIwG,gBAAgBxB,cAAcnP,WAGjC+tB,IACD3S,GAAQi0B,EAAUC,MAAM9uC,OACvBgvC,EAASC,iBAAiCroB,YAAY,eAAK,uBAAwB,CAAC1mB,KAAKC,IAAI,GAAIya,OAGpG2S,EAASshB,EAAUK,YACnBnqC,EAAQ,GAEJ6V,GAASi0B,EAAUC,MAAM9uC,QAC3BgvC,EAASxvC,WAEV0f,QAAQ,KACT4X,GAAU,MAMd,GAFAnzB,IAEGiX,GAAQ,EAAG,OAEd,MAAMo0B,EAAWjxC,SAASC,cAAc,OACxCgxC,EAAS/wC,UAAUC,IAAI,oBAAqB,YAAa,eACzD8wC,EAASnwC,iBAAiB,QAAS8E,GACnC,OAAAwX,GAAA,QAAO6zB,GACP,MAAMG,EAAOpxC,SAASC,cAAc,OACpCmxC,EAAKlxC,UAAUC,IAAI,cACnB8wC,EAASpnC,OAAOunC,EAAM,eAAK,uBAAwB,CAACjvC,KAAKC,IAAI,GAAIya,MAEjE6Z,EAAS7sB,OAAOonC,KAGlBnxC,KAAK+vC,WAAWhmC,OAAO6D,EAAOgpB,GAE9B,GAAgBuY,eAAc,GAAMtuC,KAAK,QAMlC8kC,G,aCtGX,IAAI4L,GAAkB,EACtB,MAKajB,GAAiB5zB,IAG5B,MAAMiT,EAAMjT,EAASymB,OAAO,CAACC,EAAKpM,IAAMoM,EAAM/gC,KAAKE,MAAMy0B,GAAI,GAC7D,GAAGrH,EAAM,IAAK,CACZ,MAAMkB,EAAOlB,EAAM,IACbxtB,EAASua,EAASva,OACxB,IAAI,IAAI6I,EAAI,EAAGA,EAAI6lB,IAAQ7lB,EAAG,CAC5B,IAAIwmC,GAAY,EAAGC,EAAe,EAClC,IAAI,IAAIC,EAAI,EAAGA,EAAIvvC,IAAUuvC,EAAG,CAC9B,IAAIC,EAAYj1B,EAASg1B,GAAK,EAC3BC,GAAa,IAAOA,EAAYF,IACjCA,EAAeE,EACfH,EAAWE,GAIf,IAAiB,IAAdF,EAED,OAGF90B,EAAS80B,IAAaC,QAEnB,GAAG9hB,EAAM,IAAK,CACnB,MAAMkB,EAAO,IAAMlB,EACbxtB,EAASua,EAASva,OACxB,IAAI,IAAI6I,EAAI,EAAGA,EAAI6lB,IAAQ7lB,EAAG,CAC5B,IAAIwmC,GAAY,EAAGI,EAAe,EAClC,IAAI,IAAIF,EAAI,EAAGA,EAAIvvC,IAAUuvC,EAAG,CAC9B,IAAIC,EAAYj1B,EAASg1B,GAAK,EAC3BC,EAAY,IAAOA,EAAYC,IAChCA,EAAeD,EACfH,EAAWE,GAIf,IAAiB,IAAdF,EAED,OAGF90B,EAAS80B,IAAa,EAAII,KAqBhChpC,EAAA,QAAU5H,iBAAiB,cAAe,EAAEgvC,OAAM9S,cAC3B/0B,MAAMC,KAAKlI,SAAS4P,iBAAiB,yBAAyBkgC,EAAK7gC,SAC3E7I,QAAQurC,IAEnBA,EAAYC,WAAa9B,EAAK14B,OAAOy6B,OACrCF,EAAYG,eAAe9U,EAAS8S,EAAKiC,mBAI7CrpC,EAAA,QAAU5H,iBAAiB,eAAgB,KACtCkxC,IACDC,GAAaD,GAAcE,GAAoBC,MAInD9uB,EAAA,EAAWviB,iBAAiB,SAAU,KACpC,GAAYsxC,eACZ,GAAYC,gBAGdhvB,EAAA,EAAWviB,iBAAiB,eAAgB,KAC1C,GAAYsxC,iBAGd,MAAMH,GAAe,CAACn9B,EAAsBw9B,EAAoB1lC,KAC9DkI,EAAQ5U,UAAUuB,OAAO,UAEzBqL,aAAaF,GACbtB,WAAW,KACTgnC,IACAx9B,EAAQrT,SAELuwC,KAAiBl9B,GAAWo9B,KAAuBI,GAAUH,KAAwBvlC,IACtFolC,GAAeE,GAAqB,KACpCC,GAAsB,IAEvB,MAGL,IAAIH,GAA2BE,GAAgCC,GA+BhD,MAAM,WAAoBjrB,YAmCvC,cACEnkB,QApBK,KAAA6uC,UAAW,EACV,KAAAW,QAAS,EACT,KAAAC,aAAc,EACd,KAAAC,UAAW,EACX,KAAAC,YAAa,EACb,KAAAX,cAA0B,GAS1B,KAAAY,eAA2B,GAG3B,KAAAC,UAAW,EAOZ,sBACL,MAAMpyC,EAAQk7B,GAAA,EAAWl7B,OAAS,IAAMk7B,GAAA,EAAWl7B,MAAQ,IAAM6iB,EAAA,EAAWosB,OAAOK,KAAKtvC,MACxFV,KAAK+yC,WAAaryC,EApLH,EAoLwBV,KAAKgzC,YAAc,KAGrD,qBACL,IAAIhzC,KAAK+yC,WAAY,OACA5qC,MAAMC,KAAKlI,SAAS4P,iBAAiB,0BAC7CxJ,QAAQurC,IACnBA,EAAYoB,SAAS3sC,QAAQ,CAACsd,EAAKvf,KAEjCwtC,EAAYqB,gBAAgB7uC,EAAK,OAKhC,SAIDktC,KACFA,GAAmBrxC,SAAS4uC,eAAe,aAAuCqE,iBAElF,GAAYb,gBAGd,MAAMc,EAASpzC,KAAKoE,QAAQ0O,MAAMk9B,KAAK7gC,IACjC,KAAC6gC,EAAI,QAAE9S,GAAW,KAAgB+S,QAAQmD,GAUhD,IAAIC,EANDrzC,KAAKoE,QAAQkT,OAAOC,cACrBvX,KAAKI,UAAUC,IAAI,iBAMlB2vC,EAAK14B,SACNtX,KAAK2yC,WAAa3C,EAAK14B,OAAOg8B,cAC9BtzC,KAAKyyC,SAAWzC,EAAK14B,OAAO44B,KAC5BlwC,KAAK8xC,WAAa9B,EAAK14B,OAAOy6B,OAC9B/xC,KAAK4yC,aAAe5C,EAAK14B,OAAOi8B,gBAE7BvzC,KAAK8xC,UACNuB,EAAU,wBACVrzC,KAAKI,UAAUC,IAAI,cAEnBgzC,EADQrzC,KAAKyyC,OACHzyC,KAAK2yC,SAAW,sBAAwB,+BAExC3yC,KAAK2yC,SAAW,wBAA0B,4BAIxD3yC,KAAKI,UAAUkM,OAAO,cAAetM,KAAK4yC,YAE1C,MAAMY,EAAiBxzC,KAAK4yC,WAAa,yDAA2D,GAC9F3B,EAAQjB,EAAKS,QAAQhoC,IAAI,CAAC+nC,EAAQnsC,IAC/B,kDACkCA,4PAMjCmvC,oHAG4B,IAAkB1nB,cAAc0kB,EAAOtzB,kWAO1E8J,KAAK,IAkBR,GAhBAhnB,KAAKiE,UAAY,mCACW+rC,EAAKG,wJAK7Bc,IAEJjxC,KAAKyzC,QAAUzzC,KAAK0gB,kBAAkB6W,mBACtCv3B,KAAK0zC,QAAU1zC,KAAKyzC,QAAQ/yB,kBAC5B1gB,KAAK2zC,WAAa3zC,KAAKyzC,QAAQrC,iBAE5BiC,GACDrzC,KAAK0zC,QAAQ3pC,OAAO,eAAKspC,IAGxBrzC,KAAKyyC,SACNzyC,KAAKI,UAAUC,IAAI,WAEhB2vC,EAAK4D,cAAgB5D,EAAK6D,YAAY,CACvC,MAAMC,EAAc5zC,SAASC,cAAc,OAC3C2zC,EAAY1zC,UAAUC,IAAI,aAC1BL,KAAKyzC,QAAQ1pC,OAAO+pC,GAEpB,MAAMlwB,EAAM1jB,SAAS2jB,gBAAgB,6BAA8B,OAEnED,EAAIxjB,UAAUC,IAAI,mBAElBL,KAAK+zC,UAAYnwB,EAEjB,MAAMowB,EAAc,EACdC,EAAS,EACTC,EAAgB,EAAI7xC,KAAK8xC,GAAKF,EAE9B3tB,EAASpmB,SAAS2jB,gBAAgB,6BAA8B,UACtEyC,EAAOlmB,UAAUC,IAAI,0BACrBimB,EAAOxC,eAAe,KAAM,KAAM,MAClCwC,EAAOxC,eAAe,KAAM,KAAM,MAClCwC,EAAOxC,eAAe,KAAM,IAAK,GAAKmwB,GACtC3tB,EAAOxC,eAAe,KAAM,eAAgB,GAAKkwB,GAEjDpwB,EAAI7Z,OAAOuc,GACXtmB,KAAKyzC,QAAQ1pC,OAAO6Z,GAEpB,MAAMwwB,EAA6B,IAApBpE,EAAK4D,aACdS,EAAqE,KAAxDrE,EAAK6D,WAAa,KAAkBS,kBAavDt0C,KAAKu0C,aAAehpC,OAAO4/B,YAAY,KACrC,MAAMqJ,EAAOC,KAAKC,MACZh4B,GAAY23B,EAAYG,GAAQJ,EAChCO,GAAYN,EAAYG,GAAQ,IAAO,EAAI,EACjDV,EAAY7vC,UAAY2d,OAAO+yB,GAAU9yB,WAErC8yB,GAAY,IACdb,EAAYnxC,MAAMiyC,MAAQ,UAC1BtuB,EAAO3jB,MAAMkyC,OAAS,WAKxBvuB,EAAO3jB,MAAMmyC,iBAAmBZ,EAAgBx3B,EAAWw3B,EAC3D5tB,EAAO3jB,MAAMoyC,gBAAkB,GAAGb,KAAiBA,IAEhDM,GAAQH,IACTW,cAAch1C,KAAKu0C,cACnBT,EAAY7vC,UAAY,GAExBqiB,EAAO3jB,MAAMmyC,iBAAmBZ,EAChCl0C,KAAKu0C,aAAe,EAEpB/oC,WAAW,KAET,KAAgBypC,WAAWj1C,KAAKoE,UAC/B,OAEJ,KAIPpE,KAAKk1C,WAAa/sC,MAAMC,KAAKpI,KAAK8P,iBAAiB,iBACnD9P,KAAKizC,SAAW9qC,MAAMC,KAAKpI,KAAK8P,iBAAiB,eACjD9P,KAAKm1C,WAAahtC,MAAMC,KAAKpI,KAAK8P,iBAAiB,0BAEnD,MAAMslC,EAAYl1C,SAASC,cAAc,OACzCi1C,EAAUh1C,UAAUC,IAAI,eAExBL,KAAKq1C,YAAcn1C,SAASC,cAAc,OAC1CH,KAAKq1C,YAAY7rC,UAAY,4CAC7BxJ,KAAKq1C,YAAYtrC,OAAO,eAAK,0BAE7B/J,KAAKs1C,eAAiBp1C,SAASC,cAAc,OAC7CH,KAAKs1C,eAAe9rC,UAAY,mBAEhC4rC,EAAUrrC,OAAO/J,KAAKq1C,YAAar1C,KAAKs1C,gBACxCt1C,KAAK+J,OAAOqrC,GAEZp1C,KAAKq1C,YAAYr0C,iBAAiB,QAAUiB,IAC1C,OAAAyb,EAAA,GAAYzb,GAER,GAAgBszC,YAAY,KAC9B,IAAI,GAAkB,IAAiBxkC,KAAK/Q,KAAKoE,WAGrD,OAAAkZ,GAAA,QAAOtd,KAAKq1C,aAETr1C,KAAK4yC,aACN5yC,KAAKw1C,YAAct1C,SAASC,cAAc,OAC1CH,KAAKw1C,YAAYp1C,UAAUC,IAAI,qBAAsB,kBACrDL,KAAKw1C,YAAYzrC,OAAO,eAAK,yBAC7B,OAAAuT,GAAA,QAAOtd,KAAKw1C,aAERxF,EAAKiC,cAAc9vC,QACrBnC,KAAKs1C,eAAel1C,UAAUC,IAAI,QAGpC,YAAiBL,KAAKw1C,YAAcvzC,IAClC,OAAAyb,EAAA,GAAYzb,GAKTjC,KAAK6yC,eAAe1wC,QACrBnC,KAAKy1C,UAAUz1C,KAAK6yC,gBAAgBhyC,KAAK,KACvCb,KAAK6yC,eAAe1wC,OAAS,EAC7BnC,KAAKk1C,WAAW5uC,QAAQyJ,IACtBA,EAAG3P,UAAUuB,OAAO,oBAM5ByzC,EAAUrrC,OAAO/J,KAAKw1C,cAOxB,MAAME,IAAY1F,EAAKiC,cAAc9vC,QAAUnC,KAAK8xC,UAChD4D,IAAW11C,KAAK2yC,UAClB3yC,KAAKgyC,eAAe9U,EAAS8S,EAAKiC,eAAe,GAGhDyD,IACD11C,KAAK21C,eAAezY,GACpB,YAAiBl9B,KAAMA,KAAK41C,eAIhC,aAAa1Y,GACX,GAAGA,EAAQ2Y,UAAY3Y,EAAQ4Y,kBAAmB,CAChD,MAAMC,EAAa71C,SAASC,cAAc,OAgB1C,GAfA41C,EAAW31C,UAAUC,IAAI,YAAa,aACtCL,KAAKyzC,QAAQ1pC,OAAOgsC,GAGpB,YAAiBA,EAAa9zC,IAC5B,OAAAyb,EAAA,GAAYzb,GAGZ8zC,EAAW31C,UAAUC,IAAI,UA9Tb,EAACw1C,EAAkBC,EAA0BtD,KAC5DN,IACDC,GAAaD,GAAcE,GAAoBC,IAGjD,MAAMr9B,EAAU9U,SAASC,cAAc,OACvC6U,EAAQ5U,UAAUC,IAAI,aAEtB,MAAMJ,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAUC,IAAI,YAAa,SAErC,MAAM21C,EAAS91C,SAASC,cAAc,OACtC61C,EAAO51C,UAAUC,IAAI,QAErBJ,EAAU8J,OAAOisC,GACjBhhC,EAAQjL,OAAO9J,GAEf+1C,EAAO/xC,UAAY,IAAkB+nC,aAAa6J,EAAU,CAACI,SAAUH,IACvE,GAAa1pB,KAAKC,QAAQ6pB,iBAAiBnsC,OAAOiL,GAE7CA,EAAQi0B,WACbj0B,EAAQ5U,UAAUC,IAAI,UAEtB6xC,GAAel9B,EACfo9B,GAAqBI,EACrBH,GAAsB9mC,OAAOC,WAAW,KACtC2mC,GAAan9B,EAASw9B,EAAQH,KAC7B,sBAAqB,IAAO,MAoSzB8D,CAAYjZ,EAAQ2Y,SAAU3Y,EAAQ4Y,kBAAmB,KAEvDC,EAAW31C,UAAUuB,OAAO,cAI7B3B,KAAK8yC,SAAU,CAChB,MAAMsD,EAAgBlZ,EAAQA,QAAQzsB,KAAKwO,GAAKA,EAAE3H,OAAO++B,SACtDD,IAAkBA,EAAc9+B,OAAOg/B,QACxCP,EAAW9a,UAMnB,aAAah5B,GACX,MAAM4S,EAAS,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAAQ,eACzC,IAAIA,EACF,OAGF,OAAA6I,EAAA,GAAYzb,GACZ,MAAMs0C,GAAe1hC,EAAOzI,QAAQkQ,MACpC,GAAGtc,KAAK4yC,WAAY,CAClB/9B,EAAOzU,UAAUkM,OAAO,cAExB,MAAMkqC,EAAax2C,KAAK6yC,eAAet2B,QAAQg6B,IAC5B,IAAhBC,EACDx2C,KAAK6yC,eAAepuC,OAAO+xC,EAAY,GAEvCx2C,KAAK6yC,eAAeltC,KAAK4wC,QAG3Bv2C,KAAKy1C,UAAU,CAACc,IAUpB,UAAUE,GACR,GAAGz2C,KAAK02C,gBAAiB,OAAO12C,KAAK02C,gBAErC,MAAMluC,EAAUxI,KAAKk1C,WAAWttC,OAAO,CAACR,EAAG/C,IAAQoyC,EAAQ1c,SAAS11B,IAOpE,OANAmE,EAAQlC,QAAQuO,IACdA,EAAOzU,UAAUC,IAAI,eAGvBL,KAAKI,UAAUC,IAAI,iBACnBL,KAAK8yC,UAAW,EACT9yC,KAAK02C,gBAAkB,KAAgBC,SAAS32C,KAAKoE,QAASqyC,GAAS51C,KAAK,KACjF2H,EAAQlC,QAAQuO,IACdA,EAAOzU,UAAUuB,OAAO,eAG1B3B,KAAKI,UAAUuB,OAAO,mBACrB6K,MAAM,KACPxM,KAAK8yC,UAAW,IACfzxB,QAAQ,KACTrhB,KAAK02C,gBAAkB,OAI3B,eAAexZ,EAAsB+U,EAAyB7iC,GAAU,G,QAKtE,GAJIxG,EAAA,QAAUw1B,SAASC,oBACrBjvB,GAAU,GAGTpP,KAAKyyC,UAA0B,QAAf,EAAAvV,EAAQA,eAAO,eAAE/6B,SAAUnC,KAAK8xC,UAAW,CAC5D9xC,KAAKk1C,WAAW5uC,QAAQ,CAACyJ,EAAI1L,KAC3B0L,EAAG3P,UAAUkM,OAAO,eAAgB4wB,EAAQA,QAAQ74B,GAAKiT,OAAO++B,WAG/Dr2C,KAAK42C,eACN52C,KAAK42C,aAAa1Z,GAClBl9B,KAAK42C,aAAe,MAGnB52C,KAAKu0C,eACNS,cAAch1C,KAAKu0C,cACnBv0C,KAAKu0C,aAAe,IAGL,QAAd,EAAAv0C,KAAK+zC,iBAAS,eAAEjjC,gBACjB9Q,KAAK+zC,UAAUpyC,SAGjB,MAAMk1C,EAAS72C,KAAKyzC,QAAQ5jC,cAAc,cACvCgnC,GACDA,EAAOl1C,SAsBX,GAlBG3B,KAAK8xC,WACN9xC,KAAKI,UAAUC,IAAI,aACnB,OAAAkM,EAAA,GAAevM,KAAK0zC,QAAS,eAAK,4BAIjC1zC,KAAKiyC,cAAc9vC,SAAW8vC,EAAc9vC,QAAUnC,KAAK8xC,YAC5D9xC,KAAK0yC,YAAc1yC,KAAKiyC,cAAc9vC,SAAW8vC,EAAc9vC,OAC/DnC,KAAKiyC,cAAgBA,EAAcxuC,QAEhCzD,KAAK0yC,YACN,YAAiB1yC,KAAMA,KAAK41C,cAE5B,YAAiB51C,KAAMA,KAAK41C,eAK7B51C,KAAKiyC,cAAc9vC,QAAUnC,KAAK0yC,aAAe1yC,KAAK8xC,SAAU,CACjE,MAAMp1B,EAAWwgB,EAAQA,QAAQz0B,IAAI82B,GAAKrC,EAAQmT,aAAe9Q,EAAE6Q,OAASlT,EAAQmT,aAAe,IAAM,GAEzGrwC,KAAKI,UAAUkM,OAAO,iBAAkB8C,GACrCA,GACD,aAAcpP,KAAM,IAAKA,KAAK0yC,YAAa,KAG7C,aAAQ,KACN1yC,KAAK82C,WAAW92C,KAAK0yC,YAAc1yC,KAAK0c,SAAWA,EAAU1c,KAAKiyC,cAAe7iC,GACjFpP,KAAK0c,SAAWA,EAChB1c,KAAK0yC,aAAc,IAMvB,GAFA1yC,KAAK21C,eAAezY,GAEjBl9B,KAAK2yC,SAAU,CACZ3yC,KAAK4yC,aACP5yC,KAAKq1C,YAAYj1C,UAAUkM,OAAO,QAAS4wB,EAAQmT,eAAiBrwC,KAAKiyC,cAAc9vC,QACvFnC,KAAKs1C,eAAel1C,UAAUkM,OAAO,SAAUtM,KAAKiyC,cAAc9vC,SAGpE,IAAI6B,EAAO,GAMXk5B,EAAQ6Z,cAAsCzwC,QAAQ,CAAC8L,EAAQ/N,KAE7DL,GAAQ,kEAAkEoO,MADpD,IAAR/N,EAAY,GAAK,iCAAuC,EAANA,+BAGlErE,KAAK2zC,WAAW1vC,UAAYD,EAG9B,GAAGhE,KAAK4yC,WAAY,CAClB,MAAMoE,IAAYh3C,KAAKiyC,cAAc9vC,OAE/B80C,EAAkBj3C,KAAK8xC,UAAYkF,EACnCE,GAAsBl3C,KAAK2yC,WAAazV,EAAQmT,eAAkB2G,IAAYh3C,KAAK8xC,SACzF9xC,KAAKw1C,YAAYp1C,UAAUkM,OAAO,OAAQ2qC,GAC1Cj3C,KAAKq1C,YAAYj1C,UAAUkM,OAAO,OAAQ4qC,GAC1Cl3C,KAAKs1C,eAAel1C,UAAUkM,OAAO,QAAS2qC,IAAoBC,IAItE,WAAWx6B,EAAoBu1B,EAAyB7iC,GACtDpP,KAAKizC,SAAS3sC,QAAQsd,GAAOA,EAAIjhB,MAAMC,QAAU,IAEjD5C,KAAKk1C,WAAW5uC,QAAQ,CAACyJ,EAAI1L,KAC3B0L,EAAG3P,UAAUkM,OAAO,YAAa2lC,EAAclY,SAAS11B,MAG1D,MAAMwgB,EAAWxiB,KAAKP,OAAO4a,GAK7B,GAHA1c,KAAKm3C,YAAcz6B,EAASjU,IAAIuuB,GAAKA,EAAInS,GAGtC7kB,KAAK0yC,YACN1yC,KAAKizC,SAAS3sC,QAAQ,CAACsd,EAAKvf,KAC1BrE,KAAKkzC,gBAAgB7uC,GAAM,SAExB,CACL,MAAM+yC,EAAK,KACTp3C,KAAKizC,SAAS3sC,QAAQ,CAACsd,EAAKvf,KAE1BrE,KAAKkzC,gBAAgB7uC,EAAK,MAI9B+K,EAAU,aAAQgoC,GAAMA,IAK1B,IAAIC,EAFJ36B,EAAWA,EAASjZ,QACpB6sC,GAAc5zB,GAEd,MAAM46B,EAAWtsC,IACf0R,EAASpW,QAAQ,CAACoW,EAAUrY,KAC1B,MAAMnC,EAAQm1C,EAAgB36B,EAAU1R,GACxChL,KAAKm1C,WAAW9wC,GAAKklB,UAAYrnB,EAAQ,OAI7C,GAAGlC,KAAK0yC,YAGN,GAFA2E,EAAkB,CAAC36B,EAAUJ,IAAUja,KAAKE,MAAMma,EAjnB1C,GAinB6DJ,GAElElN,EACD,IAAI,IAAIpE,EAAI,EAAa0mC,EAAI,EAAG1mC,GAAK,IAAKA,IAAK0mC,EAC7ClmC,WAAW,KACT8rC,EAAQtsC,IApnBJusC,GAqnBO7F,QAGf4F,EAAQ,QAKV,GAFAD,EAAkB,CAAC36B,EAAUJ,IAAUja,KAAKE,MAAMma,EA7nB1C,IA6nB8DJ,EAAQ,IAE3ElN,EACD,IAAI,IAAIpE,EAAI,EAAGA,EAhoBT,KAgoBsBA,EAC1BQ,WAAW,KACT8rC,EAAQtsC,IAhoBJusC,GAioBOvsC,QAGfssC,EAAQE,GAIZ,GAAGx3C,KAAK0yC,YAAa,CAChBtjC,GACDpP,KAAKI,UAAUC,IAAI,iBAGrBL,KAAKI,UAAUuB,OAAO,YACtB,MAAMy1C,EAAK,KACTp3C,KAAKizC,SAAS3sC,QAAQsd,GAAOA,EAAIjhB,MAAMC,QAAU,SAGhDwM,EACD5D,WAAW,KACTxL,KAAKI,UAAUuB,OAAO,iBACtBy1C,KAtpBO,KAypBTA,SAGFp3C,KAAKI,UAAUC,IAAI,YAIvB,eAAe68B,GACb,MAAMua,EAAcva,EAAQmT,cAAgB,EAC5C,IAAI9hC,EAAkBN,EAAO,CAACwpC,GAEZlpC,EADfvO,KAAK8xC,SACH9xC,KAAKyyC,OAAcgF,EAAc,uBAAyB,kCAClDA,EAAc,wBAA0B,kCAEhDz3C,KAAKyyC,OAAcgF,EAAc,uBAAyB,4BAClDA,EAAc,wBAA0B,4BAGrD,OAAAlrC,EAAA,GAAevM,KAAKs1C,eAAgB,eAAK/mC,EAAKN,IAGhD,gBAAgBqO,EAAeo7B,GAC7B,MAAM9zB,EAAM5jB,KAAKizC,SAAS32B,IAEP,IAAhBo7B,GACD9zB,EAAIjhB,MAAMoyC,gBAAkB,GAC5BnxB,EAAIjhB,MAAMmyC,iBAAmB,KAG7BlxB,EAAIjhB,MAAMoyC,gBAAmB2C,EAAa13C,KAAKm3C,YAAY76B,GAAS,GAAYy2B,WAAc,UAE9FnvB,EAAIjhB,MAAMmyC,iBAAmB,GAAK4C,EAAa,GAAY1E,aA/iBjD,GAAAA,YAAc,KACd,GAAAD,WAAa,EAqjB7B1nB,eAAeC,OAAO,eAAgB,I,0VCvUtC,MAAM,GAAqB,IAzXpB,MAUL,cATQ,KAAAziB,QAAU,IAAI,KAAoE,KAAgB,eAElG,KAAA8uC,sBAAsE,GACtE,KAAAC,+BAA4E,GAOlF53C,KAAK63C,6BAELjvC,EAAA,QAAUkvC,2BAA2B,CACnCC,oBAAsBhX,IACpB/gC,KAAKg4C,eAAejX,EAAOkX,WAAYlX,EAAOkX,WAAWtjC,IAAIxF,IAC7DvG,EAAA,QAAU6F,cAAc,qBAAsBsyB,EAAOkX,WAAWtjC,QAIpE3U,KAAKk4C,2BAA6B3sC,OAAOC,WAAW,KAClDxL,KAAKk4C,gCAA6BxzC,EAClC1E,KAAKm4C,oBAAmB,IACvB,KAGE,mBAAmBC,GAAc,GActC,OAbGp4C,KAAKk4C,6BACNlrC,aAAahN,KAAKk4C,4BAClBl4C,KAAKk4C,gCAA6BxzC,GAGhC1E,KAAKq4C,6BACPr4C,KAAKq4C,2BAA6Br4C,KAAKs4C,sBAAsB,QAAQ,GAAOz3C,KAAK03C,IAC/E,IAAIA,EAAKp2C,OAAQ,KAAM,cACvBnC,KAAKw4C,iBAAmBD,EAAK90C,QAC7BzD,KAAKw4C,iBAAiBnwC,KAAK,CAACC,EAAGC,IAAMlG,KAAKq1B,SAAWr1B,KAAKq1B,aAIvD13B,KAAKq4C,2BAA2Bx3C,KAAK,KAC1C,IAAIoT,EAQJ,OAPImkC,IACFnkC,EAAMjU,KAAKw4C,iBAAiB5yC,QAC5B5F,KAAKw4C,iBAAiB7yC,KAAKsO,IAG7B,IAAe8D,YAAY/X,KAAKw4C,iBAAiB,IAE1CvkC,IAIJ,aAAaskC,GAClB,YAAeA,EAAM,CAACtkC,EAAK5P,MACzB4P,EAAM,IAAewkC,QAAQxkC,IAGxBskC,EAAKl0C,GAAO4P,EADRskC,EAAK9zC,OAAOJ,EAAK,KAKjB,cAAcsQ,EAAwB+jC,EAI9C,I,0CACH,MAAMvpC,EAAKwF,EAAIxF,GACf,OAAGnP,KAAK23C,sBAAsBxoC,GACrBnP,KAAK23C,sBAAsBxoC,GAG7BnP,KAAK23C,sBAAsBxoC,GAAM,IAAItM,QAAcoD,GAAY,mC,MACpE,IAAIyyC,EAAOC,UAAW,CACpB,MAAMC,QAAkB54C,KAAK6I,QAAQmH,IAAIb,GACzC,GAAGypC,IAAgC,QAAnB,EAAAA,EAAUC,iBAAS,eAAE12C,UAAYsyC,KAAKC,MAAQkE,EAAUE,YAlF7D,MAkF0FJ,EAAOK,UAI1G,OAHA/4C,KAAKg5C,aAAaJ,EAAUC,WAC5B5yC,EAAQ2yC,eACD54C,KAAK23C,sBAAsBxoC,GAKtC,IACE,MAAM8pC,QAAmB,KAAWljB,UAAU,yBAA0B,CACtEkiB,WAAYj4C,KAAKk5C,mBAAmBvkC,KAGhCwkC,EAAWT,EAAOS,SAAWhqC,EAAK8pC,EAAWtkC,IAAIxF,GACvDnP,KAAKg4C,eAAeiB,EAAYE,GAEhClzC,EAAQgzC,GACR,MAAMxsC,GACNxG,EAAQ,aAGHjG,KAAK23C,sBAAsBxoC,UAI/B,6BACL,OAAOnP,KAAKo5C,cAAc,CAACjqC,GAAI,SAAU,CAACgqC,UAAU,IAGzC,oB,0CAGX,MAAMztC,QAAY,KAAW2tC,kBAAkB,8BAI/C,OAFAr5C,KAAKg5C,aAAattC,EAAI4tC,UAEf5tC,KAGF,wBAAwB6tC,GAC7B,MAAMN,EAAaj5C,KAAK6I,QAAQ2wC,aAAa,SAC7C,IAAIP,IAAeA,EAAWJ,UAAW,OAEzCU,EAAQA,EAAM/1C,QAAQ,UAAW,IAAIA,QAAQ,kBAAmB,IAChE,MAAMi2C,EAAOR,EAAWS,MAAMjpC,KAAKumB,GAAKA,EAAE2iB,WAAaJ,GACvD,OAAOE,EAAO,IAAevlC,OAAOulC,EAAKZ,UAAU,SAAMn0C,EAGpD,4BAA4B60C,EAAe74C,EAAgBC,GAChE,OAAOX,KAAK63C,6BAA6Bh3C,KAAK,KAC5C,MAAMoT,EAAMjU,KAAK45C,wBAAwBL,GACzC,GAAGtlC,EACD,OAAO,IAAe8D,YAAY9D,GACjCpT,KAAK,MACLA,KAAWg5C,GAAS,mCACnB,MAAMC,EAAYv2B,EAAA,EAAWosB,OAAOoK,aAC9BC,EAAY,aAAkBT,GAC9Bx4C,QAAkBk5C,GAAA,EAAaC,oBAAoB,CACvDj6C,eAAWyE,EACXy1C,cAAeN,EACfn5C,MAAOA,UAASo5C,EAAUp5C,MAC1BC,OAAQA,UAAUm5C,EAAUn5C,OAC5B2I,KAAM,MAAQ2K,EAAI9E,GAClB1O,UAAU,EACVD,MAAM,GACL,OAAQw5C,GAEXj5C,EAAUC,iBAAiB,aAAc,KACvC,IAAeo5C,kBAAkBnmC,EAAKlT,EAAU2B,OAAQs3C,GACxDj5C,EAAUY,UACT,CAACgW,MAAM,UAMX,eAAejM,EAAuDyD,GAG3E,MAAMkrC,EAA6B,CACjCjzC,EAAG,sBACHuN,IAAKjJ,EAAIiJ,IACT+kC,MAAOhuC,EAAIguC,MACXb,UAAWntC,EAAImtC,WAGjB,IAAII,EAAaj5C,KAAK6I,QAAQ2wC,aAAarqC,GACxC8pC,EACDjiC,OAAOsjC,OAAOrB,EAAYoB,GAE1BpB,EAAaj5C,KAAK6I,QAAQ0xC,WAAWprC,EAAIkrC,GAG3Cr6C,KAAKg5C,aAAattC,EAAImtC,WAGtB,MAAM2B,EAAWvB,EAAWtkC,IAAI8lC,gBAAyB,UAAPtrC,EAClD8pC,EAAWH,YAAcrE,KAAKC,MAC9B10C,KAAK6I,QAAQ8L,IAAI,CAAC,CAACxF,GAAK8pC,IAAcuB,GAGjC,kCAAkCvB,G,MACvC,MAAM/uB,EAAQ+uB,EAAW7gC,OAAO3H,KAAKyZ,GAAqB,cAAZA,EAAM9iB,GAC9CszC,EAAOzB,EAAW0B,YAElBC,EAA8B,QAAjB,EAAA3B,EAAW3hC,cAAM,eAAEujC,SAQtC,MAAO,CAACH,OAAMI,SANwC,CACpD1zC,EAAG,uBACH6wC,WAAYj4C,KAAKk5C,mBAAmBD,GACpC8B,cAAe9B,EAAW8B,eAGGj7C,KAAMoqB,EAAMpqB,KAAMk7C,SAAUJ,EAAa,0BAA4B,cAsB/F,mBAAmBjmC,GACxB,MAAc,UAAXA,EAAIxF,GACE,CACL/H,EAAG,gCAEIuN,EAAIsmC,YAMN,CACL7zC,EAAG,oBACH+H,GAAIwF,EAAIxF,GACR8rC,YAAatmC,EAAIsmC,aARZ,CACL7zC,EAAG,2BACH8zC,WAAY,GAAKvmC,EAAIxF,IAWd,sB,0CACX,MAAMzD,QAAY,KAAW2tC,kBAAkB,gCAM/C,OAJA3tC,EAAIyvC,KAAK70C,QAAQ80C,IACfp7C,KAAKg4C,eAAe,CAACrjC,IAAKymC,EAAQzmC,IAAKkkC,UAAW,GAAIa,MAAO,IAAK0B,EAAQzmC,IAAIxF,MAGzEzD,EAAIyvC,QAGA,iBAAiBxmC,G,0CAC5B,GAAGA,EAAI8lC,eAAgB,CAKrB,SAJkB,KAAW1kB,UAAU,+BAAgC,CACrEkiB,WAAYj4C,KAAKk5C,mBAAmBvkC,KAOpC,cAHOA,EAAI8lC,eACX7xC,EAAA,QAAU6F,cAAc,mBAAoBkG,GAC5C3U,KAAK6I,QAAQwF,OAAOsG,EAAIxF,IAAI,IACrB,MAEJ,CAML,SALkB,KAAW4mB,UAAU,6BAA8B,CACnEkiB,WAAYj4C,KAAKk5C,mBAAmBvkC,GACpC+mB,UAAU,IAMV,OAFA/mB,EAAI8lC,eAAiBhG,KAAKC,MAAQ,IAAO,EACzC9rC,EAAA,QAAU6F,cAAc,qBAAsBkG,IACvC,EAIX,OAAO,KAGI,kBAAkB/J,EAAeywC,GAAkB,G,0CAC9D,MAAM7b,EAAQ6b,EAAkB,EAAI,EAC9B3vC,QAAY,KAAW2tC,kBAAkB,6BAA8B,CAC3E7Z,QACA8b,iBAAkBD,QAAmB32C,EACrC24B,EAAGzyB,IAGLc,EAAIyvC,KAAK70C,QAAQ80C,IACfp7C,KAAKg4C,eAAe,CAACrjC,IAAKymC,EAAQzmC,IAAKkkC,UAAW,GAAIa,MAAO,IAAK0B,EAAQzmC,IAAIxF,MAGhF,MAAMosC,EAAkC,GAClCC,EAAQx7C,KAAK6I,QAAQ4yC,WAC3B,IAAI,IAAItsC,KAAMqsC,EAAO,CACnB,MAAM,IAAC7mC,GAAO6mC,EAAMrsC,GAEjBwF,EAAI/G,MAAM8tC,cAAc3hB,SAASnvB,EAAM8wC,iBAAmBhwC,EAAIyvC,KAAK1qC,KAAKuiB,GAAKA,EAAEre,IAAIxF,KAAOwF,EAAIxF,KAC/FosC,EAAW51C,KAAK,CAACyB,EAAG,oBAAqBuN,MAAKgnC,MAAO,OAIzD,OAAOjwC,EAAIyvC,KAAKv3C,OAAO23C,MAGlB,iBACL,OAAO,KAAWlC,kBAAkB,2BAG/B,qBACL,OAAOr5C,KAAK47C,iBAAiB/6C,KAAKg7C,GACzBh5C,QAAQC,IAAK+4C,EAAwDV,KAAK1yC,IAAIkM,GAAO3U,KAAKo5C,cAAczkC,EAAK,CAACokC,UAAU,OAK5H,sBAAsBY,EAAkBmC,GAAqB,GAElE,OADAnC,EAAW,IAAkBoC,SAASpC,GACnC35C,KAAK43C,+BAA+B+B,GAAkB35C,KAAK43C,+BAA+B+B,GAEtF35C,KAAK43C,+BAA+B+B,GAAY92C,QAAQC,IAAI,CACjE,KAAWu2C,kBAAkB,uBAAwB,CACnDM,aAEFmC,EAAqB97C,KAAKg8C,qBAAuB,GACjDF,EAAqB97C,KAAKi8C,yBAAsBv3C,IAC/C7D,KAAK,EAAEq7C,EAAkBC,EAAeC,MACzC,MAAMC,EAAiBH,EAAuD5C,SAAS7wC,IAAI6zC,GAAW,IAAe7D,QAAQ6D,IACvHC,EAA8C,GAAIC,EAA4C,GAI9FC,EAAgB/C,IACpB,IAAI,MAAMD,KAAQC,EAAO,CAEvB,GADqB,IAAkBqC,SAAStC,EAAKE,UACrC5f,SAAS4f,GACvB,IAAI,MAAMxlC,KAASslC,EAAKZ,UAAW,CACjC,MAAM5kC,EAAM,IAAeC,OAAOC,IACjCF,EAAI4mC,SAAW0B,EAAyBC,GAAsB72C,KAAKsO,MAM5E,GAAGmoC,EAAgB,CACjBK,EAAaL,EAAe1C,OAC5B,MAAMJ,EAAW8C,EAAe9C,SAChC,CAACiD,EAAwBC,GAAsBl2C,QAAQuP,IACrDA,EAAExN,KAAK,CAACC,EAAGC,IAAM+wC,EAAS/8B,QAAQjU,GAAKgxC,EAAS/8B,QAAQhU,MAI5D,IAAI,MAAMoM,KAAOwnC,EACfM,EAAa9nC,EAAI+kC,OAiBnB,MAFiB,IAAI,IAAI71C,IAAI04C,EAAuB34C,OAAO44C,EAAsBH,OAM9E,kBAAkBpoC,GACvB,MAAMyoC,EAAc,IAAkBX,SAAS9nC,EAAI0oC,iBACnD,IAAI,MAAMhD,KAAY35C,KAAK43C,+BAAgC,CACzC53C,KAAK43C,+BAA+B+B,GAC5C94C,KAAKy4C,IACX,MAAMsD,EAAOtD,EAASrd,cAAc2gB,GAAQA,EAAKztC,KAAO8E,EAAI9E,IACzDytC,EACDtD,EAASzzC,QAAQ+2C,GACTjD,EAAS5f,SAAS2iB,IAC1BpD,EAASzzC,QAAQoO,QAQ3B,KAAe4oC,mBAAqB,GACrB,U,8UCjWf,IAAIC,GAA0B,EAuBvB,SAASC,IAAU,IAAC9oC,EAAG,UAAEhU,EAAS,QAAEmE,EAAO,SAAEwlB,EAAQ,UAAEC,EAAS,SAAEmzB,EAAQ,MAAEC,EAAK,WAAEhxB,EAAU,cAAEjC,EAAa,OAAEkzB,EAAM,MAAEzwB,EAAK,YAAE0wB,EAAW,iBAAEpzB,EAAgB,aAAED,EAAY,aAAEszB,EAAY,eAAE9yB,EAAc,KAAExqB,EAAI,cAAEkH,I,QAoBnN,MAAMq2C,IAAgBzzB,GAAYC,GAC5ByzB,GAA4B,UAAbrpC,EAAI9Q,MAAqB8Q,EAAInU,MA9CpB,WA8CwDu9C,KACnE,QAAbppC,EAAI9Q,KAAiByF,EAAA,QAAUw1B,SAASmf,SAASC,KAAO50C,EAAA,QAAUw1B,SAASmf,SAASE,QAC1F,IAAIC,EAAuBC,EAE3B,IAAIT,EAAQ,CACVQ,EAAWx9C,SAASC,cAAc,QAClCu9C,EAASt9C,UAAUC,IAAI,cACvBJ,EAAU8J,OAAO2zC,GAEjB,IAAIE,GAAiB,EACL,QAAb3pC,EAAI9Q,MACLu6C,EAASn0B,WAAatV,EAAIJ,SAAW,IAAIgO,UAAS,GAE9Cu7B,GAA6B,UAAbnpC,EAAI9Q,OACnBm6C,IAAgBhzB,EACjBozB,EAASt9C,UAAUC,IAAI,QAAS,gBAEhCu9C,GAAiB,KAIrBF,EAASn0B,UAAY,MAEjB+zB,GAAgBF,IAClBQ,GAAiB,EACjBtzB,OAAiB5lB,IAIlBk5C,IACDD,EAAWz9C,SAASC,cAAc,QAClCw9C,EAASv9C,UAAUC,IAAI,aAAc,kBAAmB,aAAc,mBACtEJ,EAAU8J,OAAO4zC,IAIrB,IAgCIx3B,EAhCAza,EAGA,GAEJ,GAAqB,cAAlBuI,EAAI4pC,UAA2B,CAChC,MAAMC,EAAWn0B,GAAU,CACzBnlB,MAAOyP,EACP7P,UACAnE,YACA2pB,WACAC,YACAmzB,WACAC,QACAjzB,gBACAiC,aACAlC,mBACAD,eACAQ,iBACAxqB,SAKF,OAFA4L,EAAIwe,MAAQ4zB,EACZpyC,EAAIpL,YAAcw9C,EAASh0B,aAAaK,KACjCze,EAUT,MAAMiV,EAAQzgB,SAASC,cAAc,SAIrC,GAHAwgB,EAAMvgB,UAAUC,IAAI,eACpBsgB,EAAMvd,aAAa,cAAe,QAClCud,EAAMxJ,OAAQ,EACE,UAAblD,EAAI9Q,KAAkB,CACvB,MAAM46C,EAAW79C,SAASC,cAAc,OACxC49C,EAAS39C,UAAUC,IAAI,cAAe,aACtC09C,EAAS3xC,QAAQvF,IAAM,GAAKzC,EAAQyC,IACpCk3C,EAAS3xC,QAAQnF,OAAS,GAAK7C,EAAQ6C,OACtC82C,EAAiB35C,QAAUA,EAE5B,MAAMtE,EAAOyjB,EAAA,EAAWosB,OAAOptC,MACzBy7C,EAAWl+C,EAAKY,MAAQ,EACxBszC,EAAc,IACdC,EAAS+J,EAA0B,EAAdhK,EAC3B+J,EAAS95C,UAAY,qCAAqCnE,EAAKY,kBAAkBZ,EAAKY,6IACMszC,UAAoBgK,UAAiBA,SAAgB/J,sCAGjJ,MAAM3tB,EAASy3B,EAASr9B,kBAAkBA,kBACtCo8B,KACFA,GAA0B,EAAIz6C,KAAK8xC,GAAKF,GAE1C3tB,EAAO3jB,MAAMoyC,gBAAkB+H,GAA0B,IAAMA,GAC/Dx2B,EAAO3jB,MAAMmyC,iBAAmB,GAAKgI,GAErCY,EAASt9C,UAAUC,IAAI,SAEN+D,EAAQkT,OAAOE,cAE9BumC,EAAS39C,UAAUC,IAAI,aAGzB,MAAMqC,EAASxC,SAASC,cAAc,UACtCuC,EAAOhC,MAAQgC,EAAO/B,OAASsT,EAAI4D,EAEnCkmC,EAASt+B,QAAQ/c,EAAQg7C,GACzBK,EAASh0C,OAAO4W,GAChB1gB,EAAU8J,OAAOg0C,GAEjB,MAAME,EAAMv7C,EAAOsO,WAAW,MAKxBkY,EAAS,KACb,MAAM9kB,EAA4B25C,EAAiB35C,QAC7C85C,EAAc,GAA2BvkC,SAASvV,GAAUkmB,GAC5DngB,EAAQ,MACX,GAAaiiB,KAAK+xB,gBAAkBt7C,QAAQoD,WAAWob,QAAQ,KAC3D,OAAA+8B,GAAA,GAAQF,KAIXA,EAAY70C,oBAAoB,OAAQuL,GACxCspC,EAAY70C,oBAAoB,aAAcoc,GAC9Cy4B,EAAY70C,oBAAoB,QAASg1C,GACzCH,EAAY70C,oBAAoB,QAASoM,OAIvC6oC,EAAU,KACdL,EAAIM,UAAUL,EAAa,EAAG,GAE9B,MAAMxuB,EAASotB,GAA0BoB,EAAYxqC,YAAcwqC,EAAYrqC,SAAWipC,GAG1F,OAFAx2B,EAAO3jB,MAAMmyC,iBAAmB,GAAKplB,GAE7BwuB,EAAYvoC,QAGhB0J,EAAe,KACf6+B,EAAYrqC,WAIZ,OAAAuqC,GAAA,GAAQF,IAKTA,EAAYvoC,QACb2oC,IAGFZ,EAASn0B,WAAa20B,EAAYrqC,SAAWqqC,EAAYxqC,YAAc,IAAImO,UAAS,IARlF1X,MAWEsb,EAAsB5C,GAAgBxD,GAEtCzK,EAAS,KACb+L,EAAMvgB,UAAUC,IAAI,QACpB09C,EAAS39C,UAAUuB,OAAO,aAC1B,aAAc28C,EAAS57C,GAEpByjB,GAAaA,EAAUA,WAAaA,EAAUA,UAAU/lB,UAAUuR,SAAS,WAC5EwU,EAAUhJ,WAIRkhC,EAAW,KACX,OAAAD,GAAA,GAAQF,GAKZH,EAAS39C,UAAUC,IAAI,aAJrB8J,KAOEsL,EAAU,KACdkL,EAAMvgB,UAAUuB,OAAO,QACvBo8C,EAAS39C,UAAUC,IAAI,aAEvBsgB,EAAMjN,YAAc,EACpBgqC,EAASn0B,WAAa,GAAK20B,EAAYrqC,UAAUgO,UAAS,GAEvDq8B,EAAYxqC,cACbwqC,EAAYxqC,YAAc,IAI9BwqC,EAAYl9C,iBAAiB,OAAQ4T,GACrCspC,EAAYl9C,iBAAiB,aAAcykB,GAC3Cy4B,EAAYl9C,iBAAiB,QAASq9C,GACtCH,EAAYl9C,iBAAiB,QAASyU,GAEtC,YAAiB/S,EAAST,IAaxB,GAZA,OAAAyb,EAAA,GAAYzb,GAGTkkB,IAAcA,EAAUq4B,UACzBr4B,EAAUhJ,UAQT+gC,EAAYvoC,OAAQ,CACrB,MAAM6T,IAAqBxiB,EAC3B,GAAG,GAA2B4S,iBAAiB5S,GAAiB,CAC9DC,OAAQ,KACRE,YAAa,CAACC,EAAG,4BACjB+B,WAAW,IACT,CACF,MAAOuQ,EAAM7U,GAAS2kB,EAAwB/C,GAAiBs3B,GAAtB,GACzC,GAA2B1oC,WAAW,CAACpO,OAAQ7C,EAAQ6C,OAAQJ,IAAKzC,EAAQyC,KAAM6S,EAAM7U,GAG1Fq5C,EAAYz8C,YAEZy8C,EAAY98C,UAIb88C,EAAYvoC,OACVuoC,EAAYrqC,UAAYqqC,EAAYxqC,cAAgBwqC,EAAYrqC,UAAYqqC,EAAYxqC,YAAc,GACvG4qC,IACAj/B,IACAsB,EAAMvgB,UAAUC,IAAI,SAEpBg+C,IAGFzpC,KAIDxQ,EAAQkT,OAAOoQ,aACfq2B,EAAiB70B,OAASA,EAC3B60B,EAAS3xC,QAAQqb,WAAa,KAE9ByB,SAGFvI,EAAMlgB,UAAW,EAGnB,IAAIq9C,EACJ,GAAG15C,EAAS,CAmBV,GAlBA05C,EAAWn0B,GAAU,CACnBnlB,MAAOyP,EACP7P,UACAnE,YACA2pB,WACAC,YACAmzB,WACAC,QACAjzB,gBACAiC,aACAlC,kBAAkB,EAClBD,eACAQ,iBACAxqB,SAGF4L,EAAIwe,MAAQ4zB,GAEPR,GAA4B,QAAbrpC,EAAI9Q,MAAmBg6C,EAEzC,OADAzxC,EAAIpL,YAAcw9C,EAASh0B,aAAaK,KACjCze,EAGT,GAAGsxC,EAAU,CACX,MAAMyB,GAAiBX,EAAS7zB,OAAOC,OAAS4zB,EAAS7zB,OAAOE,MAAMrZ,cACtE6P,EAAMjgB,OAAS+9C,EAAcC,eAAe,KAAM,SAClD/9B,EAAMhgB,QAAU89C,EAAcC,eAAe,KAAM,UACnDD,EAAc10C,OAAO4W,QAElB,CACL,MAAMg+B,EAAW,IAAeC,SAAS3qC,GAAK,GAC3C0qC,GACDA,EAASx4C,QAAQtF,KAAK,KACpB8f,EAAMk+B,OAASF,EAASrqC,aAAaI,OAKvCiM,EAAM7P,eAAiB7Q,KACxB69C,aAAQ,EAARA,EAAUgB,WAAY7+C,GAAW8J,OAAO4W,GAG3C,MAAMrM,EAAeC,GAAA,EAAmBC,gBAAgBP,GAElD8qC,KAAoC,QAAvB,EAAC36C,aAAO,EAAPA,EAAS0O,aAAa,eAAEqT,WACzC44B,GACD54B,EAAa/hB,EAAQ0O,MAAcqT,UACnCA,EAAUkE,OAAOpqB,GAAW,GAC5BqqB,OAAiB5lB,GACR4P,EAAa0qC,YAAe/qC,EAAIG,kBAIjCH,EAAIG,oBACZ+R,EAAY,IAAI,KAAqB,CACnCC,YAAY,EACZ64B,aAAc,aANhB94B,EAAY,IAAI,KAAqB,CACnC84B,aAAc,YASlB,MAAMC,EAAiB,eACvBv+B,EAAM3f,iBAAiB,QAAUiB,IACP,IAArB0e,EAAMhU,MAAMuV,MACbxV,QAAQC,MAAM,SAAWgU,EAAMhU,MAAMuV,KAAO,cAAgBvB,EAAMhU,MAAMvI,SAGvE+hB,IAAc44B,GACf54B,EAAUg5B,SAGRD,EAAeE,aACjBF,EAAej5C,WAEhB,CAAC0R,MAAM,IAEV,aAAYgJ,GAAO9f,KAAK,KACnB4rB,GACD4yB,EAAA,EAAqBC,aAAa3+B,EAAO8L,GAGxCtG,IAAc44B,GACf54B,EAAUg5B,SAGZD,EAAej5C,YAGD,UAAbgO,EAAI9Q,MACLwd,EAAM3f,iBAAiB,aAAc,KACnC08C,EAASn0B,WAAa5I,EAAM9M,SAAW8M,EAAMjN,YAAc,IAAImO,UAAS,KAI5ElB,EAAMxJ,OAAQ,EACdwJ,EAAMngB,MAAO,EAEbmgB,EAAMlgB,UAAW,EAEjB,IAAI8+C,EAAqBj1B,IAAqC,QAAnB,EAAAwzB,aAAQ,EAARA,EAAU33B,iBAAS,eAAEq5B,UAChE,MAAM15C,EAAO,KACRqgB,GAAamE,IAAmBP,IACjC5D,EAAUE,YACVF,EAAUs5B,aAGZ,IAAIn/C,EAA4BuC,QAAQoD,UACxC,GAAGkgB,IAAc44B,EACf,GAAIzqC,EAAa0qC,YAAe/qC,EAAIG,kBAG1BH,EAAIG,oBACTkW,EACDhqB,EAAcuC,QAAQkoB,SACbzW,EAAa0qC,aACtB74B,EAAUkE,OAAOpqB,GAAW,EAAO,MACnC0gB,EAAM3f,iBAAiB,aAAY,aAAe,UAAW,KAC3DmlB,EAAUg5B,UACT,CAACxnC,MAAM,UAVyC,CACrD,MAAMxR,EAAU7F,EAAc,IAAeyX,YAAY9D,EAAK+V,aAAa,EAAbA,EAAe01B,QAASp1B,GACtFnE,EAAUkE,OAAOpqB,GAAW,EAAOkG,GAiCvC,OApBImkB,GAAkBi1B,IACpBA,IACAA,EAAqB,MAGvBj1B,OAAiB5lB,EAEjBpE,EAAYO,KAAK,MACZorB,GAAeA,KAKF,UAAbhY,EAAI9Q,MACL,GAA2B6S,2BAA2B5R,EAAQ6C,OAAQ7C,EAAQyC,IAAKzC,EAAQkT,OAAOC,cAGpG,OAAAooC,GAAA,GAAmBh/B,EAAOrM,EAAaI,MARrCwqC,EAAej5C,WAShB,QAEI,CAACglB,SAAU3qB,EAAas/C,OAAQV,IAmCzC,OAhCG/4B,IAAc44B,GACf54B,EAAU+E,oBAAoBplB,GAqBhB,QAAbmO,EAAI9Q,MAAmBm6C,EAOxB5xC,EAAIpL,YAAe0pB,GAAiCA,EAAcrkB,KAAK,CAAC6mB,IAAKvsB,EAAW6F,KAAM,IAAMA,IAAO85C,SAAU/8C,QAAQoD,WAA1FH,IAAO85C,OAN1C,YAAiB3/C,EAAYgC,IAC3B,OAAAyb,EAAA,GAAYzb,GACZ07C,EAASh8C,SACTmE,KACC,CAACqlB,SAAS,EAAMxT,MAAM,IAKpBjM,EAYF,SAASm0C,IAAa,QAACz7C,EAAO,SAAEijB,EAAQ,WAAEkB,EAAU,aAAEjB,EAAY,WAAEC,EAAU,cAAEvgB,EAAa,aAAE8iB,EAAY,eAAEQ,EAAc,cAAEN,I,QAW9HzB,IAAYA,EAAa,KAE7B,MAAMtU,EAAO7P,EAAQ0O,MAAM5S,UAAYkE,EAAQ0O,MAAMqZ,QAAQjsB,SACvDynB,EAAYvjB,EAAQkT,OAAOoQ,cAA4B,QAAb,EAAAtjB,EAAQ0O,aAAK,eAAEqT,WAC/D,GAAgB,UAAblS,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,KAAkB,CACvE,MAAM28C,EAAe,IAAI,GAczB,OAbAA,EAAaz4B,SAAWA,EACxBy4B,EAAa17C,QAAUA,EACvB07C,EAAax1B,eAAiBA,EAC9Bw1B,EAAa91B,cAAgBA,EAC7B81B,EAAah2B,aAAeA,EAEzBxC,IAAcw4B,EAAax4B,aAAeA,GAC1CtgB,IAAe84C,EAAa94C,cAAgBA,GAC5CugB,IAAYu4B,EAAav4B,WAAaA,GACtCI,IAAWm4B,EAAa35B,UAAY/hB,EAAQ0O,MAAMqT,WAErD25B,EAAa1zC,QAAQmc,WAAa,GAAKA,EACvCu3B,EAAaF,SACNE,EAGT,IAAIC,EAAc9rC,EAAIkF,UAAYlF,EAAIkF,UAAU6mC,MAAM,KAAO,GACzDC,EAAM,GACVA,EAAMF,EAAY59C,OAAS,GAAKgG,MAAM+3C,QAAQH,GAC5C,aAAqBA,EAAYr6C,MAAMs6C,MAAM,IAAK,GAAG,GAAGtE,eACxD,OAEF,IAAIyE,EAASjgD,SAASC,cAAc,OACpCggD,EAAO//C,UAAUC,IAAI,WAAY,OAAO4/C,GACxCE,EAAO/zC,QAAQ+H,MAAQ,GAAKF,EAAI9E,GAEhC,MAAMixC,EAASlgD,SAASC,cAAc,OACtCigD,EAAOhgD,UAAUC,IAAI,gBAErB,MAAMiU,EAAeC,GAAA,EAAmBC,gBAAgBP,GACxD,IAAc,QAAV,EAAAA,EAAImE,cAAM,eAAEjW,SAAWiC,EAAQkT,OAAOoQ,aAAepT,EAAaI,KAAoB,UAAbT,EAAI9Q,KAA2D,CAC1Ig9C,EAAO//C,UAAUC,IAAI,uBAErB,IAAIopB,EAA2B,GAC/B,GAAGrlB,EAAQkT,OAAOoQ,YAChB04B,EAAOn8C,UAAY,aAAaqQ,EAAaI,QAC7C+U,EAAK9jB,KAAKy6C,EAAO1/B,uBACZ,CACL,MAAMgJ,EAAUC,GAAU,CACxBnlB,MAAOyP,EACP7P,QAAS,KACTnE,UAAWmgD,EACXx2B,SAAU,GACVC,UAAW,GACXC,eACAC,kBAAkB,EAClBC,gBACAlqB,KAAM,IAAiB6sB,gBAAgB1Y,EAAK,GAAI,IAAI,KAEtDmsC,EAAOz9C,MAAMjC,MAAQ0/C,EAAOz9C,MAAMhC,OAAS,GACxC+oB,EAAQO,OAAOC,OAAOT,EAAK9jB,KAAK+jB,EAAQO,OAAOC,OAC/CR,EAAQO,OAAOE,MAAMV,EAAK9jB,KAAK+jB,EAAQO,OAAOE,MAGnDV,EAAKnjB,QAAQ8jB,GAAOA,EAAIhqB,UAAUC,IAAI,wBAEtC+/C,EAAO72B,UAAY02B,EAIrB,IAAIx3B,EAAWxU,EAAIwU,UAAY,eACTvoB,SAASC,cAAc,OAC/BC,UAAUC,IAAI,wBAC5B,MAAMggD,EAAgE,CAAC,YAAYpsC,EAAInU,OAEpFunB,GACDg5B,EAAiB16C,KAAK,aAAmBvB,EAAQ+jB,OAGhDZ,GACD84B,EAAiB16C,KAAK,IAAmByiB,iBAAiBhkB,IAG5D+7C,EAAOl8C,UAAY,OACjBqQ,EAAa0qC,aAAer3B,EAAY,GAAK,wHAK/C,MAAM24B,EAAUH,EAAOtwC,cAAc,kBAC/ByY,EAAmB,IAAI,KAC7BA,EAAiBlc,QAAQmc,WAAa,GAAKA,EAC3CD,EAAiBrkB,UAAYwkB,EAE7B63B,EAAQv2C,OAAOue,GAEZf,GACD+4B,EAAQv2C,OAAO,IAAmB2e,aAAatkB,IAQjD,GALgB+7C,EAAOtwC,cAAc,kBAC7B9F,UAAU,2BAAiBs2C,EAAkB,QAErDF,EAAO1gC,QAAQ2gC,IAEXz4B,GAAavjB,EAAQkT,OAAOoQ,YAC9B,OAAOy4B,EAGT,IAAIt4B,EAA0B1B,EAAkC,KAChE,MAAM+C,EAAS,KACb,GAAGrB,EAAa,CACdA,EAAYznB,UAAUC,IAAI,cAC1B,MAAMkgD,EAAe14B,EACrBrc,WAAW,KACT+0C,EAAa5+C,UACZ,KACHkmB,EAAc,KAGb1B,IACDA,EAAY,OAIVrgB,EAAQ7D,I,MACZ,MAAMu+C,GAAQv+C,GAAKA,EAAEyT,UACfzB,EAAM,IAAeC,OAAOisC,EAAO/zC,QAAQ+H,OACjD,IAAI8W,EACJ,MAAMy0B,EAAU,GAAatzB,KAAKC,QAAU,GAAaD,KAAKC,QAAQrC,cAAc01B,aAAUh7C,EAsB9F,OArBI87C,EAEmB,QAAbvsC,EAAI9Q,MACZ8nB,EAAW,IAAelT,YAAY9D,EAAKyrC,GAC3Cz0B,EAASpqB,KAAK,KACZ2K,WAAW,KACT,MAAMkJ,EAAMH,GAAA,EAAmBC,gBAAgBP,GAAKS,IACpDnJ,OAAOwF,KAAK2D,IACX9L,EAAA,QAAUw1B,SAASC,kBAAoB,IAAM,MAGlDpT,EADQ,EAA2BtjB,IAAIsM,EAAI4pC,aAAwB,QAAV,EAAA5pC,EAAImE,cAAM,eAAEjW,QAC1D,IAAe4V,YAAY9D,EAAKyrC,GAEhC,IAAee,YAAYxsC,EAAKyrC,GAZ3Cz0B,EAAW,IAAelT,YAAY9D,EAAKyrC,GAe1C73B,IACDoD,EAASpqB,KAAKqoB,GACd/C,EAAUkE,OAAOxC,GAAa,EAAMoD,IAG/B,CAACA,aAgCV,OA7BG,IAAey1B,YAAY/4C,IAAIsM,EAAI9E,KACpC0Y,EAAcs4B,EAAOtwC,cAAc,sBACnCsW,EAAY,IAAI,KAChBA,EAAUkE,OAAOxC,GAAa,EAAO,IAAe64B,YAAY1wC,IAAIiE,EAAI9E,MAC/DmF,EAAa0qC,aAAcr3B,IACpCE,EAAcs4B,EAAOtwC,cAAc,sBACnCsW,EAAY/hB,EAAQ0O,MAAMqT,UAEtBA,GAQFA,EAAUkE,OAAOxC,GACjBzjB,EAAQ0O,MAAM3M,QAAQtF,KAAKqoB,KAR3B/C,EAAY,IAAI,KAEhBA,EAAUE,YACVF,EAAUs5B,YACVt5B,EAAUkE,OAAOxC,GACjB1B,EAAU+E,oBAAoBplB,KAOlC,YAAiBq6C,EAASl+C,IACrBkkB,EACDA,EAAUhJ,QAAQlb,GAElB6D,EAAK7D,KAIFk+C,EA8DF,SAASx2B,IAAU,MAACnlB,EAAK,QAAEJ,EAAO,UAAEnE,EAAS,SAAE2pB,EAAQ,UAAEC,EAAS,SAAEmzB,EAAQ,MAAEC,EAAK,cAAEjzB,EAAa,WAAEiC,EAAU,KAAEnsB,EAAI,iBAAEiqB,EAAgB,aAAED,EAAY,eAAEQ,EAAc,OAAEsC,EAAM,QAAE+zB,EAAO,SAAEC,EAAQ,UAAEC,I,MAmBtM,IAAMr8C,EAAkB8T,QAAU9T,EAAqB4T,OAKrD,OAJGwR,GAAYC,IAAc/pB,GAAoB,aAAZ0E,EAAM4C,GACzC,IAAiB05C,kBAAkBt8C,EAAOvE,EAAW2pB,EAAUC,OAAWnlB,EAAWN,GAGhF,CACL0lB,aAAc,CACZI,MAAOrnB,QAAQoD,UACfkkB,KAAMtnB,QAAQoD,WAEhBgkB,OAAQ,CACNC,MAAO,KACPC,KAAM,MAERhE,UAAW,KACX24B,SAAU,MAIVh/C,SACc4E,IAAbklB,IAAwBA,EAAWrG,EAAA,EAAWosB,OAAOoR,QAAQrgD,YAC/CgE,IAAdmlB,IAAyBA,EAAYtG,EAAA,EAAWosB,OAAOoR,QAAQpgD,SAGpEV,EAAUG,UAAUC,IAAI,mBACxB,IAII2gD,EACAC,EACA3sC,EANAwqC,EAAW7+C,EAEXihD,GAAQ,EACRC,EAAiCt+C,QAAQoD,UAI7C,MAAMm7C,EAAoB,aAAZ58C,EAAM4C,GAAwC,cAApB5C,EAAMq5C,YAA8B/9C,EAM1E,GAFAmhD,EAAQ,IAAIpZ,MAETje,GAAYC,IAAc/pB,EAAM,CACjC,MAAM6U,EAAM,IAAiBmsC,kBAAkBt8C,EAAOvE,EAAW2pB,EAAUC,OAAWnlB,EAAWN,OAASM,EAAW08C,EAAQ,CAC3Hh6C,EAAG,YACHyQ,EAAGrT,EAAMqT,EACTU,EAAG/T,EAAM+T,EACTzY,KAAM0E,EAAM1E,KACZqD,KAAM,aACJuB,GAKJ,GAJA5E,EAAO6U,EAAI0sC,UACXH,EAAQvsC,EAAIusC,MACZ5sC,EAAeC,GAAA,EAAmBC,gBAAgBhQ,EAAO1E,EAAKqD,OAE1D+9C,EAAO,CACTpC,EAAW5+C,SAASC,cAAc,OAClC2+C,EAAS1+C,UAAUC,IAAI,4BACvBy+C,EAASn8C,MAAMjC,MAAQiU,EAAI7U,KAAKY,MAAQ,KACxCo+C,EAASn8C,MAAMhC,OAASgU,EAAI7U,KAAKa,OAAS,KAE1C,MAAMg+C,EAAW,IAAiB2C,yBAAyB98C,EAAO8P,GAAesY,GAAQ,GACzF,GAAG+xB,EAAU,CACXwC,EAAmBxC,EAASr+C,YAC5B,MAAM0gD,EAAarC,EAASsC,MAC5BD,EAAW5gD,UAAUC,IAAI,eACzBJ,EAAU8J,OAAOi3C,OACZ,CACOr3B,GAAU,CACpB1pB,YACAmE,UACAI,QACAolB,SAAU,EACVC,UAAW,EACX/pB,OACAkqB,gBACAizB,QACAnzB,eACAmC,aACAlC,mBACAizB,WACA1yB,iBACAsC,SACA+zB,SAAS,EACTE,WAAW,IAGU52B,OAAOE,KACnB/pB,UAAUC,IAAI,cAAe,aAI1CJ,EAAUG,UAAUC,IAAI,0BACxBJ,EAAU8J,OAAO+0C,SAGfh/C,IACFA,EAAO,IAAiB6sB,gBAAgBnoB,EAAOolB,EAAUC,GAAW,IAGtEvV,EAAeC,GAAA,EAAmBC,gBAAgBhQ,EAAO1E,aAAI,EAAJA,EAAMqD,MAGjE,IAAIw9C,EAAS,CACX,MAAMhC,EAAW,IAAiB2C,yBAAyB98C,EAAO8P,GAAesY,GAC9E+xB,IACDwC,EAAmBt+C,QAAQC,IAAI,CAACq+C,EAAkBxC,EAASr+C,cAC3D0gD,EAAarC,EAASsC,MACtBD,EAAW5gD,UAAUC,IAAI,eACzBy+C,EAAS/0C,OAAOi3C,IAKtBC,EAAM7gD,UAAUC,IAAI,eAIpB,MAAMkhD,GAAcP,IAAe1sC,EAAa0qC,aAAep2C,EAAA,QAAUw1B,SAASC,oBAAsBuiB,EAExG,IAAIz6B,GACa,QAAd,EAAA/hB,aAAO,EAAPA,EAAS0O,aAAK,eAAEqT,aAAc4D,GAC/B5D,EAAY/hB,EAAQ0O,MAAMqT,UAC1BA,EAAUkE,OAAOpqB,GACjBqqB,OAAiB5lB,GACR4P,EAAa0qC,aACtB74B,EAAY,IAAI,KAAqB,CACnC84B,aAAc,aAIlB,MAQMuC,EAAgB9sC,GACb+sC,GAAsBxhD,EAAWghD,EAAOvsC,EAAK6sC,EAAYzC,EAAUkC,GAGtE93B,EAAS,IACV+C,IAAeA,IAAqBppB,QAAQoD,UAE5C46C,EACM,aAAKvsC,EAAaI,IAAK,IAAI7T,KAAK6T,GAC9B8sC,EAAa9sC,IAIjB8sC,EAAaltC,EAAaI,KAGnC,IAAIpU,EACJ,MAAMohD,EACH5hD,EAA6B+X,GAAK,KAClC/X,EAA6ByY,GAAK,KAC9B+R,EACDxkB,EAAO,KACRwkB,IAAmBP,GAAoB5D,IACxCA,EAAUE,YACVF,EAAUs5B,aAGZ,MAAMt5C,EAlCUi7C,IAAUthD,EACxB,IAAeiY,YAAYvT,EAAwBwlB,aAAa,EAAbA,EAAe01B,SAClE,IAAiBlnC,aAAahU,EAAO1E,EAAMkqB,aAAa,EAAbA,EAAe01B,QAASp1B,GAkClEnE,IACA7R,EAAa0qC,aACbj1B,GACD23B,GAEAv7B,EAAUkE,OAAOpqB,GAAW,EAAOkG,GAGrCmkB,OAAiB5lB,EAEjB,MAAMi9C,EAAgBx7C,EAAQtF,KAAKqoB,GAEnC,OADAy4B,EAAcn1C,MAAM,QACb,CAACye,SAAU9kB,EAASy5C,OAAQ+B,IAsBrC,OAnBGx7B,GACDA,EAAU+E,oBAAoBplB,GAG7BwO,EAAa0qC,WACdmC,EAAmB7gD,EAAcwF,IAAO85C,OAEpC51B,EAKMA,EAAcrkB,KAAK,CAAC6mB,IAAKvsB,EAAW6F,KAAM,IAAMA,IAAOmlB,WAL9C3qB,EAAcwF,IAAO85C,OAQvC91B,GAAgBq3B,GACjBr3B,EAAankB,KAAKw7C,GAGb,CACLr3B,aAAc,CACZI,MAAOi3B,EACPh3B,KAAM7pB,GAAeuC,QAAQoD,WAE/BgkB,OAAQ,CACNC,MAAO82B,EACP72B,KAAM82B,GAER96B,YACA24B,YAIG,SAAS2C,GAAsBxhD,EACpCghD,EACAvsC,EACA6sC,EACAzC,EAAW7+C,EACX+gD,GAMA,OAJGO,GACDN,EAAM7gD,UAAUC,IAAI,WAGf,IAAIwC,QAAeoD,IAMxB,OAAA05C,GAAA,GAAmBsB,EAAOvsC,EAAK,KAC7BktC,GAAA,EAAcC,cAAc5hD,EAAW,KACrC6+C,EAAS/0C,OAAOk3C,GAEhB,aAAQ,KACNh7C,MAGCs7C,GACDN,EAAMjgD,iBAAiB,eAAgB,KACrC4gD,GAAA,EAAcE,OAAO,KACnBb,EAAM7gD,UAAUuB,OAAO,WAEpBq/C,GACDA,EAAWr/C,YAGd,CAACgW,MAAM,UA4Db,SAAS4U,IAAY,IAACtY,EAAG,IAAEuY,EAAG,WAAEP,EAAU,cAAEjC,EAAa,MAAEyC,EAAK,KAAEhrB,EAAI,UAAEsgD,EAAS,MAAExI,EAAK,MAAE74C,EAAK,OAAEC,EAAM,UAAEqhD,EAAS,KAAExhD,EAAI,aAAEspB,EAAY,WAAEy3B,I,MAgB7I,MAAMU,EAAchuC,EAAIqoC,QAexB,GAbI57C,IACFA,EAAS64C,OAAc70C,EAAN,KAGf/D,IACFA,EAAU44C,OAAc70C,EAAN,KAGD,IAAhBu9C,GAED,KAAaC,qBAGXD,EAEF,MADAv1C,QAAQC,MAAM,6BAA8BsH,GACtC,IAAI6W,MAAM,8BAGlB0B,EAAIpgB,QAAQ+H,MAAQ,GAAKF,EAAI9E,GAC7Bqd,EAAIpsB,UAAUC,IAAI,yBAIlB,MAAMiU,EAAeC,GAAA,EAAmBC,gBAAgBP,GAElD+lC,EAAYT,EAAQ,aAAkBA,IAAU,EAChDyF,EAAa1qC,EAAa0qC,aAAeuC,EAE/C,IAAIJ,EAAmB,eACnBgB,GAAkB,EACtB,KAAc,QAAV,EAAAluC,EAAImE,cAAM,eAAEjW,SAAU8R,EAAImuC,uBAAyB51B,EAAI9L,qBAAuBs+B,GAA8B,IAAhBiD,GAAqBF,GAA0D,CAC7K,IAIIf,EAJA92B,EAAQjW,EAAImuC,qBAAuBnuC,EAAImuC,oBAAoBpI,IAAc/lC,EAAImE,OAAO,GAKxF,MAAMiqC,EAAc,KACd71B,EAAIviB,oBACN+2C,EAAW5gD,UAAUC,IAAI,gBAAiB,aAE1CuhD,GAAA,EAAcC,cAAcr1B,EAAK,KAC/BA,EAAIziB,OAAOi3C,GACXG,EAAiBl7C,cAKvB,GAAG,QAASikB,EACV82B,EAAa,IAAInZ,MACjB,OAAA8X,GAAA,GAAmBqB,EAAY92B,EAAMxV,IAAK2tC,GAC1CF,GAAkB,OACb,GAAG,UAAWj4B,EAAO,CAC1B,GAAe,kBAAZA,EAAM9iB,EACP,GAAG8iB,EAAM7R,MAAMlW,OAAQ,CACrB,MAAMoe,EAAI,IAAiB+hC,yBAAyBp4B,GACpDsC,EAAIvoB,UAAY,gKAAgKgQ,EAAI4D,GAAK,OAAO5D,EAAIsE,GAAK,oDAC5LgI,8BAGb2J,EAAQjW,EAAImE,OAAO3H,KAAKC,IAAI,MAAC,OAAwC,QAAxC,EAACA,EAAkC2H,aAAK,eAAElW,UAAW+nB,EAInFA,GAAqB,kBAAZA,EAAM9iB,GAAyB4yC,GAAa,IACtDgH,EAAa,IAAInZ,MAEb,MAAqB5zB,EAAIqD,OAAOirC,uBAAyBjuC,EAAaI,KACxE,OAAAirC,GAAA,GAAmBqB,EAAY,IAAiBwB,uBAAuBvuC,EAAKiW,GAAsC,GAAOm4B,GACzHF,GAAkB,GAElBM,GAAA,EAAqBC,QAAQ,GAAKzuC,EAAI9E,GAAK+a,EAAsC7R,OAAqBxX,KAAKwX,IACxG6R,EAAsC7R,MAAQA,EAC/CpE,EAAIqD,OAAOirC,uBAAwB,EAEhCt2B,IAAeA,KAEdO,EAAIviB,mBACN,OAAA01C,GAAA,GAAmBqB,EAAY,IAAiBwB,uBAAuBvuC,EAAKiW,GAAsC,GAAOm4B,KAE1H71C,MAAM,cAGR,GAAmB,IAAhBy1C,IAAsBD,GAAaD,IAAc/H,GAAa,EAAG,CACzEgH,EAAa,IAAInZ,MAEjB,MAAM/hC,EAAO,KACX,GAAG0mB,EAAIviB,mBAAsBgiB,IAAeA,IAAe,OAE3D,MAAMhN,EAAI,KACLuN,EAAIviB,mBAAsBgiB,IAAeA,KAC5C,OAAA0zB,GAAA,GAAmBqB,EAAY1sC,EAAaI,IAAK2tC,IAGnD,OAAG/tC,EAAaI,KACduK,IACOpc,QAAQoD,WAER,IAAe08C,YAAY1uC,EAAKiW,GAAsC/jB,QAAQtF,KAAKoe,IAI9F,GAAG+K,GAAiB+3B,EAElB,OADA/3B,EAAcrkB,KAAK,CAAC6mB,MAAK1mB,SAClBjD,QAAQoD,UAEfH,IAEIokB,EAAcxV,MAChBytC,GAAkB,IAU1B,GAJGr4B,GAAgBq4B,GACjBr4B,EAAankB,KAAKw7C,GAGjBY,EACD,OAAOl/C,QAAQoD,UAGjB,MAAMH,EAAO,IAAW,mCACtB,IAAGmmB,GAAeA,IAElB,GAAmB,IAAhBg2B,QAYkB,IAAelqC,YAAY9D,EAAsB+V,aAAa,EAAbA,EAAe01B,SAClF7+C,KAAK,MAELA,KAAWg5C,GAAS,mCAGnB,GAAG5tB,IAAeA,IAAc,OAEhC,IAAIlrB,QAAkB,KAAam5C,oBAAoB,CACrDj6C,UAAWusB,EACXhsB,KAAMA,IAAS+4C,EACf94C,SAAUgB,EACV04C,cAAeN,EACfn5C,QACAC,SACA2I,KAAM,MAAQ2K,EAAI9E,IACjBsd,EAAOutB,GAIVj5C,EAAUC,iBAAiB,aAAc,KACvC,MAAMgU,EAAUwX,EAAI9L,kBACpB6gC,GAAcA,IAAevsC,GAA+B,QAApBA,EAAQ41B,UAAsBhiC,EAAA,QAAUw1B,SAASC,kBAEzF,MAAM+Y,EAAK,KACNpiC,GAAWA,IAAYjU,EAAU2B,QAClCsS,EAAQrT,UAIR4/C,EAKFK,GAAA,EAAcE,OAAO,KACnB/gD,EAAU2B,OAAOtC,UAAUC,IAAI,WAC5B2U,GACDA,EAAQ5U,UAAUC,IAAI,YAGxBU,EAAU2B,OAAO1B,iBAAiB,eAAgB,KAChD4gD,GAAA,EAAcE,OAAO,KACnB/gD,EAAU2B,OAAOtC,UAAUuB,OAAO,WAClCy1C,OAED,CAACz/B,MAAM,MAfT3C,GACD4sC,GAAA,EAAcE,OAAO1K,GAkBzB,IAAegD,kBAAkBnmC,EAAKlT,EAAU2B,OAAQs3C,IAGvD,CAACriC,MAAM,IAEP4hC,GACD,YAAiB/sB,EAAMvqB,IACrB,OAAAyb,EAAA,GAAYzb,GACZ,IAAIlB,EAAY,KAAa6hD,aAAap2B,GAEvCzrB,EAAU4U,SACX5U,EAAUN,UAAW,EACrBM,EAAU8hD,sBAUb,GAAmB,IAAhBZ,EAAmB,CAC3B,MAAMhB,EAAQ,IAAIpZ,MACZmZ,EAAax0B,EAAI9L,oBAAsBugC,GAASz0B,EAAI9L,kBAS1D,OARA6gC,GAAcA,IAAevC,GAAcgC,IAAep4C,EAAA,QAAUw1B,SAASC,kBAE7E4iB,EAAM7gD,UAAUC,IAAI,iBAEjBkhD,GACDN,EAAM7gD,UAAUC,IAAI,WAGf,IAAIwC,QAAc,CAACoD,EAAS8kB,KACjC,MAAM9L,EAAI,KACR,GAAGgN,IAAeA,IAAc,OAAOhmB,IAEvC,OAAA05C,GAAA,GAAmBsB,EAAO3sC,EAAaI,IAAK,KAC1CktC,GAAA,EAAcC,cAAcr1B,EAAK,KAC/BA,EAAIziB,OAAOk3C,GACRD,GACDA,EAAW5gD,UAAUC,IAAI,YAG3B4F,IAEGs7C,GACDN,EAAMjgD,iBAAiB,eAAgB,KACrCigD,EAAM7gD,UAAUuB,OAAO,WACpBq/C,GACDA,EAAWr/C,UAEZ,CAACgW,MAAM,SAMfrD,EAAaI,IAAKuK,IAEnB,IAAelH,YAAY9D,EAAsB+V,aAAa,EAAbA,EAAe01B,SAAS7+C,KAAKoe,EAAGhZ,SAMnF3F,GAA4B0pB,GAAmBg1B,GAA8B,IAAhBiD,EAEjEn8C,KADCkkB,EAAcrkB,KAAK,CAAC6mB,MAAK1mB,SAAQjD,QAAQoD,WAU5C,OAPG+4C,GAA8B,IAAhBiD,IACfd,EAAmB7gD,EAChBwpB,GACDA,EAAankB,KAAKw7C,IAIf7gD,EAGF,SAAewiD,IAAoB,IAACnuC,EAAG,cAAEqV,EAAa,UAAE/pB,EAAS,MAAEwsB,EAAK,SAAEhsB,EAAQ,MAAEC,EAAK,OAAEC,I,gDAShG,GAAa,QAAV,EAAAgU,EAAIyD,cAAM,eAAEjW,OAqCb,OApCAlC,EAAUG,UAAUC,IAAI,8BACxB2pB,EAAcrkB,KAAK,CACjB6mB,IAAKvsB,EACL6F,KAAM,KACJ,MAAMi9C,EAAkB,GAAmBC,kCAAkCruC,GACvExO,EAAUoO,GAAA,EAAmB0W,SAAS83B,GAE5C,GAAGpuC,EAAI2C,OAAOujC,SACZ,OAAO10C,EACNtF,KAAK,MAELA,KAAKg5C,IACJI,GAAA,EAAaC,oBAAoB,CAC/Bj6C,YACAO,MAAM,EACNC,WACA05C,cAAeN,EACfn5C,QACAC,SACAsiD,aAAa,EACb35C,KAAM,WAAaqL,EAAIxF,IACtBsd,KAEA,CACL,MAAMw0B,EAAQ,IAAIpZ,MAGlB,OAFAoZ,EAAM7gD,UAAUC,IAAI,iBAEb8F,EAAQtF,KAAKqiD,IAClB,OAAAvD,GAAA,GAAmBsB,EAAOkC,IAAIC,gBAAgBF,GAAO,KACnDjjD,EAAU8J,OAAOk3C,WAU7B,MAAM96C,EAAU,GAAmBizC,cAAczkC,GAC3CskC,QAAmB9yC,EACQ,kBAA9B8yC,EAAWJ,UAAU,GAAGzxC,GACzBmlB,GAAY,CACVtY,IAAKglC,EAAWJ,UAAU,GAC1BrsB,IAAKvsB,EACLwsB,MAAOA,EACPzC,qBAkCC,SAASq5B,GAAUz1C,EAA8C8d,EAAiDtnB,GACvH,MAAMk/C,EAAiB,IAAI,GAAe,SAG1C,OAFAA,EAAe93B,KAAK5d,EAAO8d,EAAUtnB,GAE9Bk/C,EAAerjD,UAGjB,SAASsjD,GAAavgD,GAS3B,MACM0qB,EADW,IAAI,GAAS1qB,EAAQwC,MAAOxC,EAAQgqB,SAAUhqB,EAAQiqB,SAAUjqB,EAAQkqB,QAASlqB,EAAQmqB,WAClFO,SAElB81B,EAAY91B,EAAOjd,KAAKhL,GAAQA,EAAK6oB,MAAQvB,IAC7CrsB,EAAQ8iD,EAAUn1B,SAAS3tB,MAAQ8iD,EAAUn1B,SAAS9T,EAEtDkpC,EAAa/1B,EAAOjd,KAAKhL,GAAQA,EAAK6oB,MAAQvB,IAC9CpsB,EAAS8iD,EAAWp1B,SAAS1tB,OAAS8iD,EAAWp1B,SAAS5T,EAE1Dxa,EAAY+C,EAAQ/C,UAC1BA,EAAU0C,MAAMjC,MAAQA,EAAQ,KAChCT,EAAU0C,MAAMhC,OAASA,EAAS,KAClC,MAAMykB,EAAWnlB,EAAUmlB,SAE3BsI,EAAOpnB,QAAQ,EAAE+nB,WAAUC,SAAQjqB,KACjC,IAAImoB,EA8BJ,GA7BAA,EAAMpH,EAAS/gB,GACXmoB,IACFA,EAAMtsB,SAASC,cAAc,OAC7BF,EAAU8J,OAAOyiB,IAGnBA,EAAIpsB,UAAUC,IAAI,aAAc,gBAEhCmsB,EAAI7pB,MAAMjC,MAAS2tB,EAAS3tB,MAAQA,EAAQ,IAAO,IACnD8rB,EAAI7pB,MAAMhC,OAAU0tB,EAAS1tB,OAASA,EAAS,IAAO,IACtD6rB,EAAI7pB,MAAM6wB,IAAOnF,EAAS5T,EAAI9Z,EAAS,IAAO,IAC9C6rB,EAAI7pB,MAAMoa,KAAQsR,EAAS9T,EAAI7Z,EAAQ,IAAO,IAE3C4tB,EAAQvB,IAAiBuB,EAAQvB,KAClCP,EAAI7pB,MAAM+gD,oBAAsB,WAG/Bp1B,EAAQvB,IAAiBuB,EAAQvB,KAClCP,EAAI7pB,MAAMghD,uBAAyB,WAGlCr1B,EAAQvB,IAAkBuB,EAAQvB,KACnCP,EAAI7pB,MAAMihD,qBAAuB,WAGhCt1B,EAAQvB,IAAkBuB,EAAQvB,KACnCP,EAAI7pB,MAAMkhD,wBAA0B,WAGnC7gD,EAAQ8gD,SAAU,CACnB,MAAMC,EAAW7jD,SAASC,cAAc,OACxC4jD,EAAS3jD,UAAUC,IAAI,oBAEvBmsB,EAAIziB,OAAOg6C,MAiBV,SAASC,IAAU,QAACC,EAAO,cAAEC,EAAa,WAAEj4B,EAAU,UAAEtE,EAAS,cAAEqC,EAAa,MAAEizB,EAAK,KAAE7wB,EAAI,aAAEtC,EAAY,eAAEQ,IAWlH,MAAM9kB,EAAiE,GAGjEqD,EAAU,IAAmBs7C,eAAeF,GAClD,IAAI,MAAMp9C,KAAOgC,EAAS,CACxB,MAAMqhC,EAAI9d,EAAKg4B,WAAWv9C,GACpBiM,EAAQo3B,EAAEp3B,MAAMtO,OAAS0lC,EAAEp3B,MAAM5S,SAEjCJ,EAAwB,UAAZgT,EAAM1L,EAAgB,IAAiBulB,gBAAgB7Z,EAAO,IAAK,KAAO,CAAC+E,EAAG/E,EAAM+E,EAAGU,EAAGzF,EAAMyF,GAClH/S,EAAMG,KAAK,CAAC7F,OAAMgT,QAAO1O,QAAS8lC,IAQpCqZ,GAAa,CACXtjD,UAAWikD,EACX1+C,MAAOA,EAAMiD,IAAIuC,IAAK,CAAE6M,EAAG7M,EAAElL,KAAK+X,EAAGU,EAAGvN,EAAElL,KAAKyY,KAC/CyU,SAAUzJ,EAAA,EAAWosB,OAAO0U,MAAM3jD,MAClCusB,SAAU,IACVC,QAAS,EACT42B,UAAU,IAGZt+C,EAAMc,QAAQ,CAACb,EAAMpB,KACnB,MAAM,KAACvE,EAAI,MAAEgT,EAAK,QAAE1O,GAAWqB,EAEzB+mB,EAAM03B,EAAc9+B,SAAS/gB,GACnCmoB,EAAIpgB,QAAQvF,IAAM,GAAKzC,EAAQyC,IAC/B2lB,EAAIpgB,QAAQnF,OAAS,GAAK7C,EAAQ6C,OAClC,MAAM88C,EAAWv3B,EAAI9L,kBACN,UAAZ5N,EAAM1L,EACPuiB,GAAU,CACRnlB,MAAOsO,EACP1O,UACAnE,UAAW8jD,EACXn6B,SAAU,EACVC,UAAW,EACXozB,QACAjzB,gBACAiC,aACAnsB,OACAgqB,eACAQ,mBAGFyyB,GAAU,CACR9oC,IAAK7P,EAAQ0O,MAAM5S,SACnBD,UAAW8jD,EACX3/C,UACAwlB,SAAU,EACVC,UAAW,EACXmzB,UAAU,EACVC,QACAjzB,gBACAiC,aACAnC,eACAQ,qBAjjDR/G,EAAA,EAAWviB,iBAAiB,eAAgB,CAACoH,EAAM4mC,KACjD,GAAGA,IAAO,IAAWE,QAAU9mC,IAAS,IAAW8mC,OAAQ,CACzD,MAAMjoB,EAAW9e,MAAMC,KAAKlI,SAAS4P,iBAAiB,gCAChDpP,EAAQ6iB,EAAA,EAAWosB,OAAOptC,MAAM7B,MAChCs9C,EAAWt9C,EAAQ,EACnBuzC,EAAS+J,EAAW,EAC1BlB,GAA0B,EAAIz6C,KAAK8xC,GAAKF,EACxChtB,EAAS3gB,QAAQ0O,IACfA,EAAQ8O,eAAe,KAAM,QAAS,GAAKpjB,GAC3CsU,EAAQ8O,eAAe,KAAM,SAAU,GAAKpjB,GAE5C,MAAM4lB,EAAStR,EAAQ0L,kBACvB4F,EAAOxC,eAAe,KAAM,KAAM,GAAKk6B,GACvC13B,EAAOxC,eAAe,KAAM,KAAM,GAAKk6B,GACvC13B,EAAOxC,eAAe,KAAM,IAAK,GAAKmwB,GAEtC3tB,EAAO3jB,MAAMoyC,gBAAkB+H,GAA0B,IAAMA,GAC/Dx2B,EAAO3jB,MAAMmyC,iBAAmB,GAAKgI,QAwc3Cl0C,EAAA,QAAU5H,iBAAiB,iBAAmBmT,IAC3BhM,MAAMC,KAAKlI,SAAS4P,iBAAiB,0BAA0BqE,QACvE7N,QAAQ0O,IACZA,EAAQnF,cAAc,gCACvB,YAAmBmF,O,gCC5gBV,SAASsvC,GAAuBtvC,EAAsB/U,EAAwBskD,EAAaC,GAKxG,YAJe9/C,IAAZ8/C,IACDA,EAAUxvC,EAAQlE,gBAAkB7Q,EAAY,OAAAwkD,GAAA,GAAWzvC,IAAY,GAGtEwvC,IAAYD,KAEQ,IAAbC,GAAkBA,EAAUD,IACpCA,GAAO,GAGLA,EAEMtkD,EAAUgK,kBAAoBs6C,EACtCtkD,EAAU8gB,aAAa/L,EAAS/U,EAAUmlB,SAASm/B,IAEnDtkD,EAAU8J,OAAOiL,GAJjB/U,EAAUwf,QAAQzK,IAOb,GCXM,MAAM,GAenB,YAAYhS,GALF,KAAA0hD,kBAAqBrtB,GAAyBA,IAC9C,KAAAstB,eAAkBttB,GAAuDA,GAAS,GAElF,KAAApL,WAAa,eAYrB,YAAWjsB,KAAMgD,GAEjBhD,KAAKinB,SAAW,IAAIvX,IACpB1P,KAAKkI,OAAS,GAGT,QACLlI,KAAKisB,WAAWrW,QAChB5V,KAAKinB,SAAS9c,QACdnK,KAAKkI,OAAO/F,OAAS,EAGb,cACRnC,KAAKinB,SAAS3gB,QAAQ0O,IACpBhV,KAAK+gC,OAAO/rB,EAAQ7F,IAAI,KAGvBnP,KAAK4kD,QACN5kD,KAAKkI,OAAO5B,QAAQ,CAAC0O,EAAS3Q,KAC5BrE,KAAK4kD,OAAO5vC,EAAS3Q,KAKpB,WAAWgzB,GAChB,MAAMpL,EAAajsB,KAAKisB,WAAWjc,MACnChQ,KAAK2kD,eAAgBE,IACnB,IAAI54B,UAA+BvnB,IAAdmgD,IAA4BA,EAC/C,OAAOxtB,GAAS,GAGlBr3B,KAAK8kD,cAELztB,GAAS,KAIN,IAAIloB,GACT,OAAOnP,KAAKinB,SAAStf,IAAIwH,GAGpB,IAAIA,GACT,OAAOnP,KAAKinB,SAASjX,IAAIb,GAGpB,SACL,OAAOnP,KAAKinB,SAGP,IAAI9X,EAAqB41C,GAAQ,EAAOL,EAAoEM,EAAcD,GAC/H,IAAI/vC,EAAUhV,KAAKgQ,IAAIb,GACvB,GAAG6F,EACD,OAAOA,EAGT,MAAMiwC,EAA0B,CAC9B91C,KACAmN,MAAO,GAOT,OAJAtH,EAAUhV,KAAKklD,gBAAgBD,EAAMF,GACrC/kD,KAAKinB,SAAStS,IAAIxF,EAAI6F,GACtBhV,KAAK+gC,OAAO5xB,EAAI61C,EAAahwC,EAAS0vC,GAE/B1vC,EAGF,OAAO7F,EAAqBg2C,GACjC,MAAMnwC,EAAUhV,KAAKinB,SAASjX,IAAIb,GAClC,IAAI6F,EACF,OAAO,EAGThV,KAAKinB,SAAS5Y,OAAOc,GAErB,MAAM9K,EAAMrE,KAAKkI,OAAOqU,QAAQvH,GAKhC,IAJY,IAAT3Q,GACDrE,KAAKkI,OAAOzD,OAAOJ,EAAK,GAGvBrE,KAAKolD,SACN,GAAGD,EACDnlD,KAAKolD,SAASpwC,OACT,CACL,MAAMiX,EAAajsB,KAAKisB,WAAWjc,MACnChQ,KAAK0kD,kBAAkB,KACjBz4B,KAIJjsB,KAAKolD,SAASpwC,KAKpB,OAAO,EAGF,OAAO7F,EAAqB41C,GAAQ,EAAO/vC,EAAUhV,KAAKgQ,IAAIb,GAAKu1C,GACxE,IAAI1vC,EACF,OAGFA,EAAQsH,MAAQtc,KAAKqlD,SAASrwC,GAC9BhV,KAAKslD,UAAYtlD,KAAKslD,SAAStwC,GAE/B,MAAM3Q,EAAM,YAA2BrE,KAAKkI,OAAQ8M,EAAS,SAC7D,IAAI+vC,GAAS/kD,KAAK4kD,OAAQ,CACxB,MAAM34B,EAAajsB,KAAKisB,WAAWjc,OAClC00C,GAAqB1kD,KAAK0kD,mBAAmB,KACxCz4B,KAKJjsB,KAAK4kD,OAAO5vC,EAAS3Q,O,2SCvId,MAAM,WAAuB,GAW1C,YAAYrB,EAOP,IAsDH,IAAI8J,EArDJ7J,MAAM,CACJoiD,SAAWrwC,GAAY,IAAgBuwC,qBAAqBvwC,EAAQ7F,IACpEi2C,SAAWpwC,IACTA,EAAQlJ,IAAIK,OAAOxK,SACnB3B,KAAKwlD,oBAAsBxlD,KAAKwlD,sBAElCF,SAAWtwC,IACT,MAAMywC,EAAS,IAAgBlzC,oBAAoByC,EAAQ7F,IAC3D,OAAA5C,EAAA,GAAeyI,EAAQlJ,IAAIwG,gBAAiBmzC,IAE9Cb,OAAQ,CAAC5vC,EAAS3Q,KAChB,MAAMqhD,EAAmB1wC,EAAQlJ,IAAIK,OAAO2E,gBAAkB9Q,KAAK4J,KACnE06C,GAAuBtvC,EAAQlJ,IAAIK,OAAQnM,KAAK4J,KAAMvF,GAEnDqhD,GAAoB1lD,KAAKwlD,oBAC1BxlD,KAAKwlD,sBAGTN,gBAAkBD,IAChB,MAAM,IAACn5C,GAAO,GAAkBC,aAAa,CAC3CF,OAAQo5C,EAAK91C,GACblP,WAAW,EACX+L,YAAY,EACZC,WAAYjM,KAAKiM,WACjBvC,WAAY1J,KAAK0J,WACjBwC,WAAW,EACXmG,cAAerS,KAAKqS,cACpB2X,cAAehqB,KAAKgqB,gBAItB,OADCi7B,EAAoBn5C,IAAMA,EACpBm5C,GAETP,kBAAmB,KACnBC,eAAsBttB,GAAa,mCACjC,OAAI,OAAA+mB,GAAA,GAAQp+C,KAAK4J,aAIX,eAEF,OAAAw0C,GAAA,GAAQp+C,KAAK4J,WAIjBytB,GAAS,GAHAA,GAAS,IANTA,GAAS,QAlDd,KAAAprB,WAAa,GACb,KAAAoG,eAAgB,EAChB,KAAA3I,YAAa,EA6DrB,YAAW1J,KAAMgD,GAEjBhD,KAAK4J,KAAO,GAAkBC,eAAe7J,KAAK2lD,uBAGlD,MAAMC,EAAY,KAChB94C,EAAUvB,OAAOC,WAAW,KAC1BxL,KAAK6lD,WAAY1jC,IACZA,GACDyjC,OAGH,GAAeE,gBAGpBF,KAlFe,GAAAE,cAAgB,I,aCPpB,SAASC,GAAsB/iD,GAC5C,IAAIgjD,GAAU,EACd,OAAO,IAAI,GAAa,OAAD,wBAClBhjD,GAAO,CACV+jC,kBAAoB9kC,IACV,OAAA2c,GAAA,GAAgB3c,EAAE4S,OAAQ,mBAC/B,OAAAoxC,GAAA,GAAoBhkD,MACpBe,EAAQ+jC,mBAAoB/jC,EAAQ+jC,kBAAkB9kC,IAE3DslC,QAAS,CAACL,EAAOC,EAAOllC,KACtB,IAAI+jD,GAAW3jD,KAAKyuB,IAAIqW,GAAS,GAC/B,OAAO,EAGT,GAAG9kC,KAAKyuB,IAAIoW,GAAS7kC,KAAKyuB,IAAIqW,GAC5B,OAAAzpB,EAAA,GAAYzb,GACZ+jD,GAAU,OACL,IAAIA,GAAW3jD,KAAKyuB,IAAIqW,GAAS9kC,KAAKyuB,IAAIoW,GAC/C,OAAO,EAOT,OAAOlkC,EAAQukC,QAAQL,EAAOC,EAAOllC,IAEvC2kC,QAAS,KACPof,GAAU,EACVhjD,EAAQ4jC,SAAW5jC,EAAQ4jC,WAE7BlpB,aAAa,KCrCF,SAASwoC,GAAeljD,GACrC,OAAO+iD,GAAsB,OAAD,wBACvB/iD,GAAO,CACVukC,QAAS,CAACL,EAAOC,EAAOllC,KACtB,GAAGI,KAAKyuB,IAAIoW,GAAS,GAInB,OAHAlkC,EAAQukC,QAAQL,EAAOC,EAAOllC,GAC9B,gBAEO,M,qTCRA,MAAM,WAAqB,GACxC,YACEkkD,EACAznB,EACA0nB,GAAmB,GAEnBnjD,MAAM,CACJ27B,UAAW,CAAC,UAAW,YACvBF,SAAU0nB,EAAmB1nB,EAAiBz3B,GAAW,mCACvD,GAAGy3B,EAAU,CACX,MAAMhzB,EAAMgzB,EAASz3B,GAClByE,aAAe7I,gBACV6I,GAIV,GAAa26C,aAAap/C,GAC1B,GAAamlB,KAAKrqB,MAAMukD,oBAAoBH,MAE9Cv5C,YAAa,uCACbsvB,iBAAkB,gBAClBrC,aAAc,kBCdL,MAAM,GACnB,YAAY5yB,EAAgBgB,EAAgB9E,EAAgBojD,GAC1D,MAAMzkB,EAAmB,IAAI,KAAU,CAAC76B,WAAS+N,QAEjD/M,EAAOA,EAAKxE,QACZ,MAAM4zB,EAAW,CAAC1Z,EAA4C6oC,KAC5DD,GAAaA,IACD,cAATpjD,EACD,IAAmBsjD,wBAAwBx/C,EAAQgB,GAEnD,IAAmBy+C,eAAez/C,EAAQgB,IAAQ0V,EAAQ7d,MAAQ0mD,IAItE,IAAI54C,EAAoB+4C,EAAkB5vB,EAA0BqL,EAAwBxkB,EAAsCsZ,EAA6C,GAoB/K,GAnBmB,IAAhBjvB,EAAK9F,OACNyL,EAAQ,6BAERA,EAAQ,sBACR+4C,EAAY,CAAC,eAAK,WAAY,CAAC1+C,EAAK9F,WAIpC40B,EADC,IAAgB6vB,YAAY3/C,GACC,IAAhBgB,EAAK9F,OAAe,oCAAsC,kCAE1C,IAAhB8F,EAAK9F,OAAe,gCAAkC,8BAGtEyb,EAAU,CAAC,CACTwW,QAAS,SACTkO,UAAU,EACVjL,aAGCpwB,IAAW2B,EAAA,QAAU6O,MAAiB,cAATtU,QAG9B,GAAG8D,EAAOw1B,SACRvF,EAAWvxB,KAAK,CACduX,KAAM,2BACNqlB,SAAU,CAACT,SAER,CACL,MAAM1V,EAAO,IAAgB2L,QAAQ9wB,EAAOivB,YAEtCyG,EAAY,IAAgBA,UAAU11B,EAAOivB,WAAY,mBAC/D,GAAc,SAAX9J,EAAKhlB,EAAc,CACpB,MAAMy/C,EAAYlqB,EAAY10B,EAAKxE,QAAUwE,EAAKL,OAAOf,GACvC,IAAmB2S,iBAAiBvS,EAAQJ,GAC7C+E,SAAWhD,EAAA,QAAU6O,MAGnCovC,EAAU1kD,SACR0kD,EAAU1kD,SAAW8F,EAAK9F,OAC3B+0B,EAAWvxB,KAAK,CACduX,KAAM,kBAGRga,EAAWvxB,KAAK,CACduX,KAAM,yBAGR6Z,EAAc,0BACdqL,EAAkB,CAAC,eAAK,WAAY,CAACykB,EAAU1kD,iBAKnDyb,EAAQ,GAAGyZ,SAAY1Z,GAAY0Z,EAAS1Z,GAAS,GAK3D,aAAgBC,GAEF,IAAI,GAAU,oBAAqB,CAC/C3W,SACA8rB,aAAcnlB,EACd+oB,cAAegwB,EACf7vB,mBAAoBC,EACpBE,oBAAqBmL,EACrBxkB,UACAsZ,eAGIzY,Q,cC3FK,MAAM,GACnB,YAAYxX,EAAgBgB,EAAgBs+C,GAC1C,IAAI34C,EAAempB,EAAqBnZ,EAAyB,GAEjEhQ,EAAQ,eAAe3F,EAAK9F,OAAS,EAAI,IAAM,SAC/C40B,EAAc9uB,EAAK9F,OAAS,EAAI,QAAU8F,EAAK9F,OAAS,iBAAmB,oBAO3Eyb,EAAQjY,KAAK,CACXyuB,QAAS,OACTiD,SAPe,KACfkvB,GAAaA,IACb,IAAmBO,sBAAsB7/C,EAAQgB,MAQrC,IAAI,GAAU,oBAAqB,CAC/ChB,SACA2G,QACAmpB,cACAnZ,YAGIa,Q,YC5BK,SAASsoC,KACnBx7C,OAAOy7C,aACLz7C,OAAOy7C,eAAeC,MACvB17C,OAAOy7C,eAAeC,QACd17C,OAAOy7C,eAAeE,iBAC9B37C,OAAOy7C,eAAeE,kBAGhBhnD,SAASiuC,WAEjBjuC,SAASiuC,UAAU8Y,Q,cCuBvB,MAAME,GAAoB1+C,GACjB,IAAIA,EAAI61B,UAAU6E,OAAO,CAACC,EAAK7D,IAAM6D,EAAM7D,EAAEz/B,KAAM,GAK5D,MAAM,GA2BJ,YAAYkD,GAiBV,GA3CK,KAAAokD,aAAyC,IAAI13C,IAC7C,KAAA0+B,aAAc,EAgXd,KAAA2Y,gBAAkB,KACvB/mD,KAAKqnD,mBAAqBrnD,KAAKqnD,oBAC/BrnD,KAAKonD,aAAaj9C,QAClBnK,KAAKsnD,kBACLP,MA9UA,YAAW/mD,KAAMgD,GAEjBhD,KAAKiP,eAAiB,eAAiB,eAEpC,sBA0BD,OAzBAjP,KAAK+N,eAAe1N,IAAIL,KAAKunD,cAA7BvnD,CAA4C,WAAY,KAClDA,KAAKouC,cACTpuC,KAAKwnD,aCrFRj8C,OAAOy7C,aACDz7C,OAAOy7C,eAAeS,WAErBvnD,SAASiuC,UAEVjuC,SAASiuC,UAAUuZ,cAAcxqC,KAGnC,WDgFH,aAA0Bld,KAAKunD,cAAgBtlD,IAC7C,GAAGjC,KAAKouC,aAAgBpuC,KAAK2nD,uBAAyB3nD,KAAK2nD,uBAAyB,OAGpFznD,SAASiW,KAAK/V,UAAUC,IAAI,aAC5BL,KAAKunD,cAAcvmD,iBAAiB,WAAaiB,IAC/C,OAAAyb,EAAA,GAAYzb,GACZ/B,SAASiW,KAAK/V,UAAUuB,OAAO,cAG9B,CAACgW,MAAM,EAAMwT,SAAS,IAEzB47B,KAEA,MAAM/xC,EAAUhV,KAAK4nD,qBAAqB3lD,EAAE4S,QACzCG,GACDhV,KAAKquC,gBAAgBr5B,IAEtBhV,KAAK+N,gBAKV,MAAM85C,EAAqB,CAAC93B,EAAoB+3B,KAC9C,GAAG/3B,IAAU+3B,EACX,MAAO,GAGT,MAAMC,EAAYh4B,EAAMjU,wBAClBksC,EAAWF,EAAKhsC,wBAEhBmsC,GADcF,EAAUv0B,IAAMw0B,EAASx0B,KAASu0B,EAAUhrC,KAAOirC,EAASjrC,MAClD,EAExBmrC,EAAS,OAAAtpC,GAAA,GAAgBmR,EAAO/vB,KAAKmoD,8BAC3C,IAAID,EACF,MAAO,GAGT,MAAMjhC,EAAW9e,MAAMC,KAAK8/C,EAAOp4C,iBAAiB9P,KAAKooD,6BACzD,IAAIC,EAAaphC,EAAS1K,QAAQwT,GAC9BzK,EAAY2B,EAAS1K,QAAQurC,GAE7BG,KACD3iC,EAAW+iC,GAAc,CAACA,EAAY/iC,IAOzC,OAJc2B,EAASxjB,MAAM4kD,EAAa,EAAG/iC,IAO/CtlB,KAAK+N,eAAe1N,IAAIL,KAAKunD,cAA7BvnD,CAA4C,YAAciC,IAExD,MAAM+S,EAAU,OAAA4J,GAAA,GAAgB3c,EAAE4S,OAAQ7U,KAAKsoD,uBAC/C,GAAgB,IAAbrmD,EAAE4Y,OACH,OAGF,GAAG7a,KAAKuoD,eAAiBvoD,KAAKuoD,aAAatmD,EAAG+S,GAC5C,OAGF,MAAMwzC,EAAqC,IAAI94C,IAC/C,IAAI+4C,EAaAC,EAAc1zC,EAElB,MAAM2zC,EAAiB,CAAC3zC,EAAsB4zC,GAAe,KAC3D,MAAM/hD,GAAOmO,EAAQ5I,QAAQvF,IAC7B,IAAIA,IAAQmO,EAAQ5I,QAAQnF,OAAQ,OACpC,MAAMA,EAAS+N,EAAQ5I,QAAQnF,OAAOkgB,WAElC,OAAAi3B,GAAA,GAAQsK,KACVA,EAAc1zC,GAGhB,IAAI6zC,EAAUL,EAAKx4C,IAAI/I,GAKvB,GAJI4hD,GACFL,EAAK7zC,IAAI1N,EAAQ4hD,EAAU,IAAIhlD,MAG7BglD,EAAQlhD,IAAId,GAAM,CACpB,MAAMiiD,EAAa9oD,KAAK+oD,cAAc9hD,EAAQJ,GAQ9C,QAPiBnC,IAAd+jD,IAEDA,GAAaK,GAGfD,EAAQxoD,IAAIwG,GAER4hD,IAAcK,IAAiBL,GAAaK,EAAa,CAC3D,MAAME,EAAa7B,GAAiBqB,GACpC,GAAGxoD,KAAKquC,iBAAmBua,EAAc,CACpCI,EAAa,GACX,OAAAC,GAAA,GAAcj0C,EAAS0zC,KACxBA,EAAc1zC,GAIlB,MAAMk0C,EAAkBrB,EAAmBa,EAAa1zC,GAErDk0C,EAAgB/mD,QACjB+mD,EAAgB5iD,QAAQ0O,IACtB2zC,EAAe3zC,GAAS,KAK9B,GAAIhV,KAAKonD,aAAatnD,KAQZE,KAAKquC,iBACbruC,KAAKquC,gBAAgBr5B,QARrB,GAAkB,IAAfg0C,GAAoBhpD,KAAKmpD,YAC1B,IAAI,MAAOliD,EAAQgB,KAASugD,EAC1B,IAAI,MAAM3hD,KAAOoB,EACfjI,KAAKmpD,YAAYliD,EAAQJ,MAYvC,IAAIuiD,GAAoB,EACxB,MAAM/uC,EAAepY,IACfmnD,IACFrC,KACAqC,GAAoB,GAYtB,MAAMp0C,EAAUhV,KAAK4nD,qBAAqB3lD,EAAE4S,QAC5C,GAAIG,EAKJ,OAAGhV,KAAKqpD,wBAA0BrpD,KAAKqpD,sBAAsBpnD,EAAG+S,EAASyzC,IACvEzoD,KAAK+N,eAAeu7C,aAAatpD,KAAKunD,cAAe,YAAaltC,QAClEra,KAAK+N,eAAeu7C,aAAappD,SAAU,UAAWya,EAAW4uC,SAInEZ,EAAe3zC,IAGX2F,EAAa1Y,IACdumD,EAAK1oD,MACN,YAAiByL,OAAQmS,EAAA,EAAa,CAACyN,SAAS,EAAMxT,MAAM,EAAM2D,SAAS,IAG7Etb,KAAK+N,eAAeu7C,aAAatpD,KAAKunD,cAAe,YAAaltC,GAIlE0sC,MAGIwC,EAA0B,CAAC5xC,MAAM,GACvC3X,KAAK+N,eAAe1N,IAAIL,KAAKunD,cAA7BvnD,CAA4C,YAAaqa,GACzDra,KAAK+N,eAAe1N,IAAIH,SAAxBF,CAAkC,UAAW2a,EAAW4uC,KAIlD,0BAA0Bv0C,GAClC,OAAOhV,KAAK+oD,cAAc/zC,EAAQ5I,QAAQnF,OAAOkgB,YAAanS,EAAQ5I,QAAQvF,KAGtE,eAAemO,EAAsBoI,GAC7CpI,EAAQyK,QAAQrC,EAAc5L,OAGzB,sBAAsBwD,EAAsByJ,GACjD,MAAM+qC,IAAgBxpD,KAAKypD,4BAA4Bz0C,GACvD,GAAGyJ,EAAM,CACP,GAAG+qC,EACD,OAAO,EAGT,MAAMpsC,EAAgB,IAAI,KAAc,CACtC9T,KAAM0L,EAAQ5I,QAAQvF,IACtBtE,OAAO,IAINvC,KAAKouC,aACHpuC,KAAK0pD,0BAA0B10C,KAChCoI,EAAcrb,MAAM4b,SAAU,EAC9B3I,EAAQ5U,UAAUC,IAAI,gBAI1BL,KAAK2pD,eAAe30C,EAASoI,QACrBosC,GACRxpD,KAAKypD,4BAA4Bz0C,GAASlE,cAAcnP,SAG1D,OAAO,EAGC,4BAA4BqT,G,MACpC,MAA8C,WAAd,QAAzB,EAAAA,EAAQ0L,yBAAiB,eAAEkqB,UAChC51B,EAAQ0L,kBAAkBA,kBAGpB,gBAAgBkpC,GAAiB,GACzC,MAAM9pD,EAAOE,KAAKonD,aAAatnD,KAC/B,IAAIA,IAAS8pD,EAAgB,OAE7B,IAAIC,GAAe/pD,EACjBgqD,GAAchqD,EACdiqD,GAAYjqD,EACd,IAAI,MAAOmH,EAAQgB,KAASjI,KAAKonD,aAAc,CAC7C,MAAMv+C,EAAU7I,KAAK8I,YAAc9I,KAAKgqD,mBAAmBjhD,4BAA4B9B,GAAUjH,KAAKgqD,mBAAmBhhD,mBAAmB/B,GAC5I,IAAI,MAAMJ,KAAOoB,EAAM,CACrB,MAAM7D,EAAUpE,KAAKgqD,mBAAmBC,sBAAsBphD,EAAShC,GAOvE,GANIgjD,GACCzlD,EAAQG,SACTslD,GAAc,IAIdC,EAAY,CACI9pD,KAAKgqD,mBAAmBE,iBAAiB9lD,KAEzD0lD,GAAa,GAIjB,GAAGD,GAAeC,EAAY,MAGhC,GAAGD,GAAeC,EAAY,MAGhC9pD,KAAKmqD,mBAAqBnqD,KAAKmqD,kBAAkBN,EAAaC,EAAYC,GAGrE,gBAAgBK,GAAmB,EAAMR,GAAiB,GAC/D,MAAMS,EAAerqD,KAAKouC,YACpBtuC,EAAOE,KAAKonD,aAAatnD,KAG/B,GAFAE,KAAKouC,cAAgBtuC,GAAQ8pD,EAE1BS,IAAiBrqD,KAAKouC,YAAa,OAAO,EAYzC,wBACFpuC,KAAKunD,cAAcnnD,UAAUkM,OAAO,YAAatM,KAAKouC,aAEnDic,GAEDtD,MAaJ,OAAAuD,GAAA,KAEA,MAAMC,IAAazqD,GAAQ8pD,EAoB3B,OAnBA5pD,KAAKwqD,mBAAqBxqD,KAAKwqD,kBAAkBD,GAE7C,sBACCA,EACDx7C,EAAA,EAAwBoB,SAAS,CAC/BhN,KAAMnD,KAAKiP,eACXmB,MAAO,KACLpQ,KAAK+mD,qBAITh4C,EAAA,EAAwB6B,aAAa5Q,KAAKiP,iBAI3C26C,GACD5pD,KAAKyqD,gBAAgBb,IAGhB,EAUF,UACL5pD,KAAKonD,aAAaj9C,QAClBnK,KAAKsnD,iBAAgB,GAGb,uBAAuBtyC,EAAsB8zC,GACrD9oD,KAAK0qD,sBAAsB11C,GAAS,GACtBhV,KAAKypD,4BAA4Bz0C,GACzC2I,QAAUmrC,EAEhB9oD,KAAKsnD,kBACLtnD,KAAKyqD,kBACL,aAAcz1C,EAAS,cAAe8zC,EAAY,KAG7C,cAAc7hD,EAAgBJ,GACnC,MAAM8N,EAAM3U,KAAKonD,aAAap3C,IAAI/I,GAClC,OAAO0N,aAAG,EAAHA,EAAKhN,IAAId,GAGX,SACL,OAAOsgD,GAAiBnnD,KAAKonD,cAGrB,UAAUngD,EAAgBJ,EAAa8jD,GAC/C,IAAIh2C,EAAM3U,KAAKonD,aAAap3C,IAAI/I,GAChC,GAAG0jD,QAA0BjmD,IAAbimD,IAA0Bh2C,aAAG,EAAHA,EAAKhN,IAAId,IAC9C8N,IACDA,EAAItG,OAAOxH,GAEP8N,EAAI7U,MACNE,KAAKonD,aAAa/4C,OAAOpH,QAGxB,CAEL,GADa2B,EAAA,QAAUgiD,OAAOC,oBAAsB7qD,KAAKmC,SAAW,EAC1D,EAER,OADAoyB,GAAM,UAAKvb,OAAO,6BAA6B,KACxC,EAgBLrE,IACFA,EAAM,IAAI9Q,IACV7D,KAAKonD,aAAazyC,IAAI1N,EAAQ0N,IAGhCA,EAAItU,IAAIwG,GAGV,OAAO,EAMF,mBAAmBI,EAAgBgB,GACxC,MAAM0M,EAAM3U,KAAKonD,aAAap3C,IAAI/I,GAC9B0N,IAIJ1M,EAAK3B,QAAQO,IACX8N,EAAItG,OAAOxH,KAGT8N,EAAI7U,MACNE,KAAKonD,aAAa/4C,OAAOpH,GAG3BjH,KAAKyqD,kBACLzqD,KAAKsnD,oBAIF,MAAM,WAAwB,GASnC,YAAoBza,EAA6Bmd,GAC/C/mD,MAAM,CACJ+mD,qBACAzC,cAAe1a,EAAY5sC,UAC3B8N,eAAgB,IAAI,IACpBw6C,aAAc,CAACtmD,EAAG4S,MAAaA,GAAU7U,KAAKouC,YAC9CwZ,qBAAuB/yC,GAAW,OAAA+J,GAAA,GAAgB/J,EAAQ,qBAC1DyzC,sBAAuB,oBACvBH,6BAA8B,WAC9BC,2BAA4B,uBATZ,KAAAvb,cAsCb,KAAAwB,gBAAmBr5B,IACxB,MAAMnO,GAAOmO,EAAQ5I,QAAQvF,IACvBI,EAAS+N,EAAQ5I,QAAQnF,OAAOkgB,WAElCnnB,KAAK8qD,UAAU7jD,EAAQJ,IAI3B7G,KAAK+qD,uBAAuB/1C,EAAShV,KAAK+oD,cAAc9hD,EAAQJ,KAG3D,KAAAsiD,YAAc,CAACliD,EAAgBJ,KACpC,MAAMmO,EAAUhV,KAAK6sC,YAAYY,SAASud,WAAWn7C,cAAc,oCAAoC5I,iBAAsBJ,OAC7H7G,KAAKquC,gBAAgBr5B,IAGb,KAAAm1C,kBAAoB,CAACN,EAAsBC,EAAqBC,KACxE,MAAM5nD,EAASnC,KAAKmC,SACpB,OAAAoK,EAAA,GAAevM,KAAKirD,iBAAkB,eAAK,WAAY,CAAC9oD,KACxDnC,KAAKkrD,iBAAiB9qD,UAAUkM,OAAO,OAAmB,IAAXnK,GAC/CnC,KAAKmrD,oBAAoB/qD,UAAUkM,OAAO,OAAQu9C,GAClD7pD,KAAKorD,oBAAsBprD,KAAKorD,mBAAmBhrD,UAAUkM,OAAO,OAAQw9C,IAGpE,KAAAU,kBAAqBD,IAc7B,GAbA,aAAcvqD,KAAK6sC,YAAYwe,uBAAwB,eAAgBd,EAAU,IAAK,KAChFvqD,KAAKouC,cACPpuC,KAAKsrD,mBAAmB3pD,SACxB3B,KAAKsrD,mBACHtrD,KAAKmrD,oBACLnrD,KAAKorD,mBACL,KACFprD,KAAKwnD,kBAAe9iD,KAIxB,aAAc1E,KAAK6sC,YAAY5sC,UAAW,eAAgBsqD,EAAU,KAEjEvqD,KAAKouC,cACFpuC,KAAKsrD,mBAAoB,CAC3B,MAAM3jB,EAAa,yBACnB3nC,KAAKsrD,mBAAqBprD,SAASC,cAAc,OACjDH,KAAKsrD,mBAAmBlrD,UAAUC,IAAIsnC,EAAa,cAEnD,MAAM4jB,EAAY,EAAW,SAAS5jB,WAAqB,CAACh6B,UAAU,IACtE3N,KAAK+N,eAAe1N,IAAIkrD,EAAxBvrD,CAAmC,QAASA,KAAK+mD,gBAAiB,CAACpvC,MAAM,IAEzE3X,KAAKirD,iBAAmB/qD,SAASC,cAAc,OAC/CH,KAAKirD,iBAAiB7qD,UAAUC,IAAIsnC,EAAa,UAEjD3nC,KAAKkrD,iBAAmB,EAAW,WAAWvjB,UAE9C,MAAM6jB,EAAyC,CAACz9C,eAAgB/N,KAAK+N,gBACrE,YAAiB/N,KAAKkrD,iBAAkB,KACtC,MAAMjkD,EAAS,IAAIjH,KAAKonD,aAAaqE,QAAQ,GACvC5kD,EAAM,IAAI7G,KAAKonD,aAAap3C,IAAI/I,IAAS,GAC/CjH,KAAK+mD,kBAELn+C,EAAA,QAAU6F,cAAc,gBAAiB,CACvCxH,SACAJ,SAED2kD,GAEHxrD,KAAKmrD,oBAAsB,EAAW,WAAWxjB,aACjD,YAAiB3nC,KAAKmrD,oBAAqB,KACzC,MAAMpjD,EAAwC,GAC9C,IAAI,MAAO2jD,EAAYzjD,KAASjI,KAAKonD,aACnCr/C,EAAI2jD,GAAcvjD,MAAMC,KAAKH,GAAMI,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAGxD,IAAI,GAAaR,EAAK,KACpB/H,KAAK+mD,qBAENyE,GAEAxrD,KAAK2rD,YACN3rD,KAAKorD,mBAAqB,EAAW,iBAAiBzjB,YACtD,YAAiB3nC,KAAKorD,mBAAoB,KACxC,MAAMnkD,EAAS,IAAIjH,KAAKonD,aAAaqE,QAAQ,GAC7C,IAAI,GAAoBxkD,EAAQ,IAAIjH,KAAKonD,aAAap3C,IAAI/I,IAAU,OAAQ,KAC1EjH,KAAK+mD,qBAENyE,IAGLxrD,KAAKsrD,mBAAmBvhD,UAAU,CAChCwhD,EACAvrD,KAAKirD,iBACLjrD,KAAKkrD,iBACLlrD,KAAKmrD,oBACLnrD,KAAKorD,oBACLxjD,OAAOc,UAET,MAAMkjD,EAAoB5rD,KAAKsrD,mBAC/BM,EAAkBjpD,MAAMkpD,QAAU,IAClC7rD,KAAK6sC,YAAYwe,uBAAuBthD,OAAO6hD,GAE1CA,EAAkB3iB,WACvB2iB,EAAkBjpD,MAAMkpD,QAAU,KA7HtC7rD,KAAK2rD,WAAa9e,EAAYtlB,WAazB,gBAAgB6iC,GAAmB,EAAMR,GAAiB,GAC/D,MAAMjkB,EAAM1iC,MAAMqkD,gBAAgB8C,EAAkBR,GAEpD,GAAGjkB,GAAOykB,EAAkB,CACTjiD,MAAMC,KAAKpI,KAAK6sC,YAAYl9B,cAAcG,iBAAiB,uBACnExJ,QAAQ0O,IACfhV,KAAK0qD,sBAAsB11C,EAAShV,KAAKouC,eAI7C,OAAOzI,GA4GI,MAAM,WAAsB,GAQzC,YAAoBvZ,EAAoBC,EAA8BtqB,EAAkBioD,GACtF/mD,MAAM,CACJ+mD,qBACAzC,cAAel7B,EAAQ6pB,iBACvBnoC,eAAgBse,EAAQte,eACxB65C,qBAAuB/yC,GAAW,OAAA+J,GAAA,GAAgB/J,EAAQ,iBAAmB,OAAA+J,GAAA,GAAgB/J,EAAQ,UACrG0zC,aAAc,CAACtmD,EAAG4S,OAGH7U,KAAKonD,aAAatnD,OACxBmC,EAAE4S,OAAuBzU,UAAUuR,SAAS,YAC5C1P,EAAE4S,OAAuBzU,UAAUuR,SAAS,uBAC9CkD,GAIPw0C,sBAAuB,CAACpnD,EAAG+S,EAASyzC,MACtBxmD,EAAE4S,SAAWG,IACrB/S,EAAE4S,OAAuBzU,UAAUuR,SAAS,4BAChCjN,IAAd+jD,IACCzoD,KAAKonD,aAAatnD,MAGvB6nD,qBAAsB,KAAO3nD,KAAKosB,KAAKrqB,MAAM+pD,UAC7CxD,sBAAuB,SACvBH,6BAA8B,gBAC9BC,2BAA4B,qDAC5Bt/C,YAA2B,cAAdsjB,EAAKjpB,OA3BF,KAAAipB,OAAoB,KAAAC,UAA8B,KAAAtqB,QAoE/D,KAAAssC,gBAAmB0d,IACxB,IAAI/rD,KAAKgsD,gBAAgBD,GAAS,OAElC,MAAMllD,GAAOklD,EAAO3/C,QAAQvF,IAG5B,GADkBklD,EAAO3rD,UAAUuR,SAAS,cAC9B,CACZ,IAAI3R,KAAKisD,wBAAwBF,GAAS,CACxC,MAAMp3C,EAAM3U,KAAKonD,aAAap3C,IAAIhQ,KAAKqsB,QAAQplB,QAC/C,GAAG0N,EAAK,CACO3U,KAAKosB,KAAK8/B,aAAarlD,GAC/BP,QAAQO,GAAO8N,EAAItG,OAAOxH,KAKnC,YADA7G,KAAKqsB,QAAQ8/B,sBAAsBJ,GAAQzlD,QAAQtG,KAAKquC,iBAI1D,IAAIruC,KAAK8qD,UAAU9qD,KAAKqsB,QAAQplB,OAAQJ,GACtC,OAIF,GADsBklD,EAAO3rD,UAAUuR,SAAS,gBAC9B,CAChB,MAAMy6C,EAAiB,OAAAxtC,GAAA,GAAgBmtC,EAAQ,UACzCM,EAAoBrsD,KAAKisD,wBAAwBG,GACjDE,EAAwBtsD,KAAKssD,sBAAsBzlD,IAEtCylD,GAAyBD,IAE1CrsD,KAAK+qD,uBAAuBqB,EAAgBE,GAIhDtsD,KAAK+qD,uBAAuBgB,EAAQ/rD,KAAK+oD,cAAc/oD,KAAKqsB,QAAQplB,OAAQJ,KAGpE,KAAAsiD,YAAc,CAACliD,EAAgBJ,KACvC,MAAM0lD,EAAUvsD,KAAKqsB,QAAQmgC,iBAAiB3lD,GAC3C0lD,GACDvsD,KAAKquC,gBAAgBke,EAAQR,SA6CvB,KAAAvB,kBAAqBD,IAC7B,IAAI5tC,EAAY,GAAI8vC,EAAe,GACnC,GAAGlC,EAAU,CACX,MAAMvzB,EAAIh3B,KAAK+B,MAAM2qD,YAAY57C,cAC3B67C,EAAuB31B,EAAEnnB,cAAc,2BACvC+8C,EAAkB51B,EAAEnnB,cAAc,sBAClCg9C,EAAoBF,EAAqB7wC,wBACzCgxC,EAAeF,EAAgB9wC,wBAC/BixC,EAAYD,EAAapsD,MACzBssD,EAAUH,EAAkBnsD,MAElC,GAAGqsD,IAAcC,EAAS,CACxB,MAAMC,EAAQ,EAAsBF,EAC9BG,GAAkBH,EAAYC,GAAW,EAI/C,GAFArwC,EAAY,cADWkwC,EAAkB9vC,KAAO+vC,EAAa/vC,KAAOmwC,eACdD,KAEnDA,EAAQ,EAAG,CACZ,MAAME,EAAK,GACXV,EAAqBU,EAAKA,GAAM,EAAIF,GAAU,OA4BpD,GAtBA,aAAcjtD,KAAK+B,MAAM2qD,YAAa,eAAgBnC,EAAU,KAChEvqD,KAAK+B,MAAM2qD,YAAY/pD,MAAMga,UAAYA,EACzC3c,KAAK+B,MAAM2qD,YAAY/pD,MAAM8pD,aAAeA,EAC5C,aAAczsD,KAAKunD,cAAe,eAAgBgD,EAAU,IAAK,KAC3DvqD,KAAKouC,cACPpuC,KAAKotD,sBAAsBzrD,SAC3B3B,KAAKotD,sBACHptD,KAAKsrD,mBACLtrD,KAAKqtD,oBACLrtD,KAAKmrD,oBACLnrD,KAAKorD,mBACL,KACFprD,KAAKwnD,kBAAe9iD,GAGtB,aAAQ,KACN1E,KAAKqsB,QAAQuV,eAMd5hC,KAAKouC,cACFpuC,KAAKsrD,mBAAoB,CAC3BtrD,KAAKotD,sBAAwBltD,SAASC,cAAc,OACpDH,KAAKotD,sBAAsBhtD,UAAUC,IAAI,qBAAsB,qBAE/DL,KAAKsrD,mBAAqBprD,SAASC,cAAc,OACjDH,KAAKsrD,mBAAmBlrD,UAAUC,IAAI,uBAEtC,MAAMmrD,EAAyC,CAACz9C,eAAgB/N,KAAK+N,gBAC/Dw9C,EAAY,EAAW,QAAS,CAAC59C,UAAU,IACjD,YAAiB49C,EAAWvrD,KAAK+mD,gBAAiB,CAACpvC,MAAM,EAAM5J,eAAgB/N,KAAK+N,iBAEpF/N,KAAKirD,iBAAmB/qD,SAASC,cAAc,OAC/CH,KAAKirD,iBAAiB7qD,UAAUC,IAAI,6BAEd,cAAnBL,KAAKosB,KAAKjpB,MACXnD,KAAKqtD,oBAAsB,YAAO,2EAA4E,CAAChgD,KAAM,UACrHrN,KAAKqtD,oBAAoBtjD,OAAO,eAAK,wBACrC,YAAiB/J,KAAKqtD,oBAAqB,KACzC,IAAI,GAAartD,KAAKqsB,QAAQplB,OAAQ,IAAIjH,KAAKonD,aAAap3C,IAAIhQ,KAAKqsB,QAAQplB,SAAU,KACrFjH,KAAK+mD,qBAENyE,KAEHxrD,KAAKmrD,oBAAsB,YAAO,oEAAqE,CAAC99C,KAAM,YAC9GrN,KAAKmrD,oBAAoBphD,OAAO,eAAK,YACrC,YAAiB/J,KAAKmrD,oBAAqB,KACzC,MAAMpjD,EAAwC,GAC9C,IAAI,MAAO2jD,EAAYzjD,KAASjI,KAAKonD,aACnCr/C,EAAI2jD,GAAcvjD,MAAMC,KAAKH,GAAMI,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAGxD,IAAI,GAAaR,EAAK,KACpB/H,KAAK+mD,qBAENyE,IAGLxrD,KAAKorD,mBAAqB,YAAO,0EAA2E,CAAC/9C,KAAM,WACnHrN,KAAKorD,mBAAmBrhD,OAAO,eAAK,WACpC,YAAiB/J,KAAKorD,mBAAoB,KACxC,IAAI,GAAoBprD,KAAKqsB,QAAQplB,OAAQ,IAAIjH,KAAKonD,aAAap3C,IAAIhQ,KAAKqsB,QAAQplB,SAAUjH,KAAKosB,KAAKjpB,KAAM,KAC5GnD,KAAK+mD,qBAENyE,GAEHxrD,KAAKsrD,mBAAmBvhD,UAAU,CAChCwhD,EACAvrD,KAAKirD,iBACLjrD,KAAKqtD,oBACLrtD,KAAKmrD,oBACLnrD,KAAKorD,oBACLxjD,OAAOc,UAET1I,KAAKotD,sBAAsBzqD,MAAMkpD,QAAU,IAC3C7rD,KAAKotD,sBAAsBrjD,OAAO/J,KAAKsrD,oBACvCtrD,KAAK+B,MAAM2qD,YAAY57C,cAAc/G,OAAO/J,KAAKotD,uBAE5CptD,KAAKotD,sBAAsBnkB,WAChCjpC,KAAKotD,sBAAsBzqD,MAAMkpD,QAAU,KAKvC,KAAA1B,kBAAoB,CAACN,EAAsBC,EAAqBC,KACxE,OAAAx9C,EAAA,GAAevM,KAAKirD,iBAAkB,eAAK,WAAY,CAACjrD,KAAKmC,YAC7DnC,KAAKqtD,qBAAuBrtD,KAAKqtD,oBAAoBt7B,gBAAgB,WAAYg4B,GACjF/pD,KAAKmrD,qBAAuBnrD,KAAKmrD,oBAAoBp5B,gBAAgB,WAAY83B,GACjF7pD,KAAKorD,mBAAmBr5B,gBAAgB,WAAY+3B,IAG5C,KAAAzC,kBAAoB,KAC5B,IAAI,MAAOpgD,EAAQgB,KAASjI,KAAKonD,aAC/B,IAAI,MAAMvgD,KAAOoB,EAAM,CACrB,MAAMskD,EAAUvsD,KAAKqsB,QAAQmgC,iBAAiB3lD,GAC3C0lD,GAEDvsD,KAAKquC,gBAAgBke,EAAQR,UAvP9B,eAAeA,EAAqB3uC,GACzCA,EAAc5L,MAAMpR,UAAUC,IAAI,0BAE/B0rD,EAAO3rD,UAAUuR,SAAS,sBAC3Bo6C,EAAOl8C,cAAc,4BAA4B9F,OAAOqT,EAAc5L,OAEtEvO,MAAM0mD,eAAeoC,EAAQ3uC,GAI1B,gBAAgBgtC,GAAmB,EAAMR,GAAiB,GAC/D,MAAMjkB,EAAM1iC,MAAMqkD,gBAAgB8C,EAAkBR,GAEpD,GAAGjkB,GAAOykB,EACR,IAAI,MAAMvjD,KAAO7G,KAAKqsB,QAAQA,QAAS,CACrC,MAAM0/B,EAAS/rD,KAAKqsB,QAAQA,QAAQxlB,GACpC7G,KAAK0qD,sBAAsBqB,EAAQ/rD,KAAKouC,aAI5C,OAAOzI,EAGF,sBAAsBomB,EAAqBttC,GAChD,IAAIze,KAAKgsD,gBAAgBD,GAAS,OAElC,MAAMpmB,EAAM1iC,MAAMynD,sBAAsBqB,EAAQttC,GAChD,GAAGknB,EAAK,CACYomB,EAAO3rD,UAAUuR,SAAS,eAE1C3R,KAAKqsB,QAAQ8/B,sBAAsBJ,GAAQzlD,QAAQb,GAAQzF,KAAK0qD,sBAAsBjlD,EAAMgZ,IAIhG,OAAOknB,EAgDF,0BAA0B3wB,GAC/B,MAAMs4C,EAAYt4C,EAAQ5U,UAAUuR,SAAS,cAC7C,OAAO1O,MAAMymD,0BAA0B10C,MAAcs4C,GAAattD,KAAKssD,uBAAuBt3C,EAAQ5I,QAAQvF,MAGtG,wBAAwBklD,GAChC,MAAMwB,EAAuBvtD,KAAKypD,4BAA4BsC,GAC9D,OAAOwB,aAAoB,EAApBA,EAAsB5vC,QAGrB,sBAAsB9W,GAC9B,MAAMoB,EAAOjI,KAAKosB,KAAK8/B,aAAarlD,GAC9BugD,EAAen/C,EAAKL,OAAOf,GAAO7G,KAAK+oD,cAAc/oD,KAAKqsB,QAAQplB,OAAQJ,IAChF,OAAOoB,EAAK9F,SAAWilD,EAAajlD,OAG5B,4BAA4B4pD,GAgBpC,OAAOA,EAAO3rD,UAAUuR,SAAS,sBAC/Bo6C,EAAOl8C,cAAc,eACrB5M,MAAMwmD,4BAA4BsC,GAG/B,gBAAgBA,GACrB,OAAQA,EAAO3rD,UAAUuR,SAAS,aAAeo6C,EAAO3rD,UAAUuR,SAAS,gBAAkBo6C,EAAO3rD,UAAUuR,SAAS,iB,2SEpuB3H,MAAM,GAQJ,YACU67C,EACA3gB,GADA,KAAA2gB,WACA,KAAA3gB,cAkGF,KAAA4gB,YAAc,KACpB7kD,EAAA,QAAU6F,cAAc,gBAAiB,CACvCxH,OAAQjH,KAAKiH,OACbJ,IAAK7G,KAAK6G,IACViE,SAAU9K,KAAK6sC,YAAY7lC,cAAc8D,YAIrC,KAAA4iD,eAAiB,KACpB1tD,KAAK6sC,YAAYsB,UAAUC,YAC5B,YAAmBpuC,KAAK6sC,YAAYsB,UAAUgd,qBAE9C,IAAI,GAAa,CACf,CAACnrD,KAAKiH,QAAS,CAACjH,KAAK6G,QAKnB,KAAA8mD,cAAgB,KACtB3tD,KAAK6sC,YAAYsB,UAAUE,gBAAgBruC,KAAK6U,SAG1C,KAAA+4C,sBAAwB,KAC9B5tD,KAAK6sC,YAAYsB,UAAU4Y,mBAGrB,KAAA8G,cAAgB,KACnB7tD,KAAK6sC,YAAYsB,UAAUC,YAC5B,YAAmBpuC,KAAK6sC,YAAYsB,UAAUid,oBAE9C,IAAI,GAAoBprD,KAAKiH,OAAQ,CAACjH,KAAK6G,KAAM,SA9HnD,MAAMinD,EAAiB7rD,IAMrB,IAAIwD,EALDzF,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAId,IACEzI,EAAO,OAAAmZ,GAAA,GAAgB3c,EAAE4S,OAAQ,qBACjC,MAAM5S,IAER,GAAIwD,EAAJ,CAGA,GADGxD,aAAa6jB,YAAY7jB,EAAE8Y,iBAC3B/a,KAAKgV,QAAQ5U,UAAUuR,SAAS,UACjC,OAAO,EAEN1P,aAAa6jB,aAAY7jB,EAAE8rD,cAAe,GAE7C/tD,KAAK6U,OAASpP,EACdzF,KAAKiH,OAASxB,EAAK2G,QAAQnF,OAAOkgB,WAClCnnB,KAAK6G,KAAOpB,EAAK2G,QAAQvF,IACzB7G,KAAK8oD,WAAajc,EAAYsB,UAAU4a,cAAc/oD,KAAKiH,OAAQjH,KAAK6G,KAExE7G,KAAK4d,QAAQtX,QAAQuU,IACnB,IAAIsH,EAGFA,IADCniB,KAAK8oD,aAAejuC,EAAOmzC,kBAGrBnzC,EAAO9F,QAAS8F,EAAO9F,UAGhC8F,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAAS6V,KAG3C1c,EAAKrF,UAAUC,IAAI,aAEnB,aAAa4B,EAAGjC,KAAKgV,SACrB,aAAYhV,KAAKgV,QAAS,KACxBvP,EAAKrF,UAAUuB,OAAO,iBAIvB,uBAGD,aAA0B6rD,EAAUM,GAIhC,OACN9tD,KAAK4d,QAAU,CAAC,CACdvQ,KAAM,UACN6P,KAAM,UACNC,QAASnd,KAAK0tD,gBACb,CACDrgD,KAAM,UACN6P,KAAM,oCACNC,QAASnd,KAAK0tD,eACd34C,OAAQ,IAAM/U,KAAK8oD,aAChB9oD,KAAK6sC,YAAYsB,UAAUgd,oBAAoB/qD,UAAUuR,SAAS,QACrEq8C,eAAe,GACd,CACD3gD,KAAM,UACN6P,KAAM,uBACNC,QAASnd,KAAKytD,YACdO,eAAe,GACd,CACD3gD,KAAM,SACN6P,KAAM,yBACNC,QAASnd,KAAK2tD,eACb,CACDtgD,KAAM,SACN6P,KAAM,kCACNC,QAASnd,KAAK4tD,sBACd74C,OAAQ,IAAM/U,KAAK8oD,WACnBkF,eAAe,GACd,CACD3gD,KAAM,gBACN6P,KAAM,SACNC,QAASnd,KAAK6tD,cACd94C,OAAQ,IAAM,IAAmBm1C,iBAAiB,IAAmB1wC,iBAAiBxZ,KAAKiH,OAAQjH,KAAK6G,OACvG,CACDwG,KAAM,gBACN6P,KAAM,mCACNC,QAASnd,KAAK6tD,cACd94C,OAAQ,IAAM/U,KAAK8oD,aAAe9oD,KAAK6sC,YAAYsB,UAAUid,mBAAmBhrD,UAAUuR,SAAS,QACnGq8C,eAAe,IAGjBhuD,KAAKgV,QAAU,GAAWhV,KAAK4d,SAC/B5d,KAAKgV,QAAQ5U,UAAUC,IAAI,qBAAsB,eACjDH,SAAS4uC,eAAe,cAAc/kC,OAAO/J,KAAKgV,UAsCvC,MAAM,GA8DnB,YAAYhS,GA7DL,KAAAoL,KAAiD,GAUhD,KAAA6/C,WAAa,EAEb,KAAAjkC,cAAgB,IAAI,KACrB,KAAAiC,WAAa,eAEb,KAAAyiB,eAAwF,GACxF,KAAAT,gBAAgE,GAChE,KAAAigB,aAAyB,GAGzB,KAAA3f,UAA0B1rC,QAAQoD,UAEjC,KAAAkoD,UAA0D,GAC1D,KAAArkC,aAAoE,GACpE,KAAAoP,OAAwD,GACxD,KAAAk1B,aAAc,EACd,KAAAC,WAAY,EAEZ,KAAAC,IAAM,OAAAC,EAAA,GAAO,gBAGb,KAAAC,gBAOH,GAIE,KAAAC,aAA+D,IAAI/+C,IAUnE,KAAAg/C,YAAc,EACd,KAAAC,cAAgB,EAChB,KAAAC,eAAiB,EAEjB,KAAArnC,YAAc,EAkQb,KAAAsnC,kBAAoB,KAC1B7uD,KAAKC,UAAUG,UAAUC,IAAI,YAGvB,KAAAyuD,gBAAkB,KACxB9uD,KAAKC,UAAUG,UAAUuB,OAAO,YAjQhC,YAAW3B,KAAMgD,GAEjBhD,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,gBAE7BL,KAAK+uD,kBAAoB,IAAI,GAAkB/uD,KAAKC,UAAWD,MAC/DA,KAAKmuC,UAAY,IAAI,GAAgBnuC,KAAM,KAE3C,MAAMqrD,EAAyBrrD,KAAKqrD,uBAAyBnrD,SAASC,cAAc,OACpFkrD,EAAuBjrD,UAAUC,IAAI,+BAAgC,6BAA8B,UAEnG,MAAM2uD,EAAgBhvD,KAAKgvD,cAAgB,IAAI,IAAY3D,GAC3D2D,EAAc/uD,UAAUG,UAAUC,IAAI,+BAEtC,MAAMysC,EAAM9sC,KAAK8sC,IAAM5sC,SAASC,cAAc,OAC9C2sC,EAAI1sC,UAAUC,IAAI,oBAAqB,uBACvCL,KAAKivD,SAAWniB,EAEhBkiB,EAAc/uD,UAAU8J,OAAO+iC,GAE/B,IAAI,MAAMW,KAAYztC,KAAKutC,UAAW,CACpC,MAAM2hB,EAAUhvD,SAASC,cAAc,OACvC+uD,EAAQ9uD,UAAUC,IAAI,4BACtB,MAAM8uD,EAAOjvD,SAASC,cAAc,QAC9B6K,EAAI9K,SAASC,cAAc,KAEjCgvD,EAAKplD,OAAO,eAAK0jC,EAASnkC,OAC1B6lD,EAAKplD,OAAOiB,GAEZkkD,EAAQnlD,OAAOolD,GAEf,OAAA7xC,GAAA,QAAO4xC,GAEPlvD,KAAKivD,SAASllD,OAAOmlD,GAErBlvD,KAAKyuD,aAAa95C,IAAI84B,EAAStqC,KAAMsqC,GAErCA,EAASyhB,QAAUA,EAMrB,IAAIE,EAHJpvD,KAAK2P,cAAgBzP,SAASC,cAAc,OAC5CH,KAAK2P,cAAcvP,UAAUC,IAAI,8BAA+B,kBAG7D,uBACD6lD,GAAe,CACblxC,QAAShV,KAAK2P,cACd43B,QAAS,CAACL,EAAOC,EAAOllC,KACtB,MAAMotD,EAASrvD,KAAKmO,UAAUkhD,SACxBjqC,EAAWjd,MAAMC,KAAKpI,KAAKivD,SAAS7pC,UAC1C,IAAI/gB,EACJ,GAAG6iC,EAAQ,GACT,IAAI,IAAIl8B,EAAIqkD,EAAS,EAAGrkD,EAAIoa,EAASjjB,SAAU6I,EAC7C,IAAIoa,EAASpa,GAAG5K,UAAUuR,SAAS,QAAS,CAC1CtN,EAAM2G,EACN,YAIJ,IAAI,IAAIA,EAAIqkD,EAAS,EAAGrkD,GAAK,IAAKA,EAChC,IAAIoa,EAASpa,GAAG5K,UAAUuR,SAAS,QAAS,CAC1CtN,EAAM2G,EACN,WAKKtG,IAARL,IACD+qD,EC1VG,SAAyBnvD,GACtC,MAAM6a,EAAe7Y,IACnB,OAAAyb,EAAA,GAAYzb,IAGd,IAAIqtD,EAAU,EACd,MAAMlY,EAAK,OACHkY,GACJrvD,EAAUoJ,oBAAoB,YAAayR,EAAa,CAACqQ,SAAS,KAOtE,OAHAlrB,EAAUe,iBAAiB,YAAa8Z,EAAa,CAACqQ,SAAS,EAAM7P,SAAS,IAC9Erb,EAAUe,iBAAiB,WAAYo2C,EAAI,CAACz/B,MAAM,IAE3Cy/B,ED2UkBmY,CAAgBvvD,KAAK2P,eACpC3P,KAAKmO,UAAU9J,OAMvB,IAAI,MAAMopC,KAAYztC,KAAKutC,UAAW,CACpC,MAAMttC,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAUC,IAAI,0BAA4BotC,EAAStqC,KAAM,YAEnE,MAAM0K,EAAU3N,SAASC,cAAc,OACvC0N,EAAQzN,UAAUC,IAAI,wBAA0BotC,EAAStqC,MAEzDlD,EAAU8J,OAAO8D,GAEjB7N,KAAK2P,cAAc5F,OAAO9J,GAE1BD,KAAKoO,KAAKq/B,EAAStmC,aAAe0G,EAElC4/B,EAASud,WAAan9C,EAGxB7N,KAAKC,UAAU8J,OAAOshD,EAAwBrrD,KAAK2P,eAInD3P,KAAKwvD,iBAAmB,IAAI,GAAY,EAAO,YAAY,GAE3DxvD,KAAK+K,WAAWM,iBAAmB,KAC9BrL,KAAKytC,SAASud,YAAchrD,KAAKytC,SAASud,WAAW/gD,mBAEtDjK,KAAK8F,MAAK,IAKd9F,KAAKmO,UAAY,OAAAshD,EAAA,GAAezvD,KAAKivD,SAAUjvD,KAAK2P,cAAe,CAACR,EAAIugD,EAAYtgD,KAClF,GAAGpP,KAAKiuD,YAAc9+C,IAAOnP,KAAK2vD,WAEhC,YADA3vD,KAAK+K,WAAWkzB,kBAAkBj+B,KAAKC,UAAW,SAIpD,MAAM2vD,EAAc5vD,KAAKutC,UAAUp+B,GAChCnP,KAAKwtC,aACNxtC,KAAKwtC,YAAYoiB,GAGnB,MAAMC,EAAe7vD,KAAKytC,SAO1B,GANAztC,KAAKytC,SAAWmiB,GAEO,IAApB5vD,KAAKiuD,WAAoB7+C,GAC1BpP,KAAK6uD,oBAGJ7uD,KAAK2vD,WACN3vD,KAAK2vD,YAAa,MACb,CACL,MAAMG,EAAY9vD,KAAKC,UAAU6vD,UACjC,IAAItnB,EAAYxoC,KAAK+K,WAAWy9B,UAQhC,GAPGA,EAAYsnB,IACb9vD,KAAK+K,WAAWkzB,kBAAkBj+B,KAAKC,UAAW,SAClDuoC,EAAYsnB,GAGdD,EAAa9xB,OAAS,CAACyK,UAAWA,EAAWunB,aAAc/vD,KAAK+K,WAAWglD,mBAEjDrrD,IAAvBkrD,EAAY7xB,OAAsB,CACnC,MAAMliB,EAAO7b,KAAKC,UAAU6b,wBACtBk0C,EAAQhwD,KAAKC,UAAU6Q,cAAcgL,wBACrC+U,EAAOhV,EAAKpB,EAAIu1C,EAAMv1C,EAEzB+tB,EAAY3X,IACb++B,EAAY7xB,OAAS,CAACyK,UAAW3X,EAAMk/B,aAAc,IAIzD,GAAGH,EAAY7xB,OAAQ,CACrB,MAAMlN,EAAOg/B,EAAa9xB,OAAOyK,UAAYonB,EAAY7xB,OAAOyK,UAI7D3X,IAKC++B,EAAY5E,WAAWroD,MAAMga,UAAY,cAAckU,UAaxC,IAApB7wB,KAAKiuD,WAAqB2B,EAAY5E,WAAW/gD,mBAElDjK,KAAK8F,MAAK,GAGZ9F,KAAKiuD,UAAY9+C,GAChB,KACDnP,KAAK+K,WAAW62B,gBAGYl9B,IAAzB1E,KAAKytC,SAAS1P,SACf/9B,KAAKytC,SAASud,WAAWroD,MAAMga,UAAY,GAC3C3c,KAAK+K,WAAWy9B,UAAYxoC,KAAKytC,SAAS1P,OAAOyK,WAGhD4mB,IACDA,IACAA,OAAe1qD,GAGjB1E,KAAK8uD,wBACJpqD,EAAWsqD,GAEd,YAAiBhvD,KAAK2P,cAAgB1N,IACjCjC,KAAKmuC,UAAUC,cAChB,OAAA1wB,EAAA,GAAYzb,GACZjC,KAAKmuC,UAAUE,gBAAgB,OAAAzvB,GAAA,GAAgB3c,EAAE4S,OAAQ,wBAE1D,CAACsW,SAAS,EAAM7P,SAAS,IAE5B,MAAM20C,EAAe,CAACzmD,EAAmB0mD,EAAyB/oD,EAAoClF,KACpG,MAAM4S,EAAS,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAA0BrL,GAC3D,IAAIqL,EAAQ,OAEZ,MAAMhO,GAAOgO,EAAOzI,QAAQvF,IAC5B,IAAIA,EAEF,YADA7G,KAAKsuD,IAAI13C,KAAK,mCAAoC/B,GAIpD,MAAM5N,EAAS4N,EAAOzI,QAAQnF,OAAOkgB,WAE/B3e,EAAWL,MAAMC,KAAKpI,KAAKoO,KAAKjH,GAAa2I,iBAAiB,IAAMogD,IAAoCznD,IAAIsH,IAChH,MAAM6tB,EAAc,OAAAhf,GAAA,GAAgB7O,EAAIvG,GACxC,MAAO,CACLwL,QAASjF,EACTlJ,KAAM+2B,EAAYxxB,QAAQvF,IAC1BI,OAAQ22B,EAAYxxB,QAAQnF,OAAOkgB,cAKjC9iB,EAAMmE,EAAQ2M,UAAU1P,GAAQA,EAAKoB,MAAQA,GAAOpB,EAAKwB,SAAWA,GAEpE7C,EAAU,IAAmBoV,iBAAiBvS,EAAQJ,IAC5D,IAAI,IACH+S,iBAAiB5Z,KAAKmwD,kBAAkBhpD,IACxCipD,UAAUhsD,EAASoE,EAAQnE,GAAK2Q,QAAS,GAAG,EAAOxM,EAAQ/E,MAAM,EAAGY,GAAMmE,EAAQ/E,MAAMY,EAAM,KAGjG,YAAiBrE,KAAKoO,KAAKiiD,8BAA+BJ,EAAa1pD,KAAK,KAAM,YAAa,YAAa,kCAC5G,YAAiBvG,KAAKoO,KAAKkiD,4BAA6BL,EAAa1pD,KAAK,KAAM,sBAAuB,kBAAmB,gCAc1HvG,KAAKytC,SAAWztC,KAAKutC,UAAU,GAE/B,OAAAgjB,GAAA,GAAuB,KACrBvwD,KAAKgqB,cAAcwmC,QAClB,KACDxwD,KAAKgqB,cAAcymC,qBAYhB,qBAAqBxlD,EAAiB9H,GAC3C,GAAY,6BAATA,EAAqC,OAAO8H,EAEnC,2BAAT9H,IACD8H,EAAWA,EAASrD,OAAOxD,KAAaA,EAAQ0O,QAclD,IAAIi7B,EAAkB,GAEtB,OAAO5qC,GACL,IAAK,gCACH,IAAI,IAAIiB,KAAW6G,EAAU,CAC3B,IAAI6H,EAAQ1O,EAAQ0O,MAAMtO,OAASJ,EAAQ0O,MAAM5S,UAAakE,EAAQ0O,MAAMqZ,SAAW/nB,EAAQ0O,MAAMqZ,QAAQjsB,SACzG4S,IAKW,aAAZA,EAAM1L,GAAmC,UAAf0L,EAAM3P,MAKnC4qC,EAASpoC,KAAKvB,IAGhB,MAGF,IAAK,8BACH,IAAI,IAAIA,KAAW6G,EACb7G,EAAQ0O,MAAM5S,WAAY,CAAC,QAAS,QAAS,MAAO,UAAW,SAAS65B,SAAS31B,EAAQ0O,MAAM5S,SAASiD,OAI5G4qC,EAASpoC,KAAKvB,GAEhB,MAGF,IAAK,yBAEH,IAAI,IAAIA,KAAW6G,EAEf8iC,EAASpoC,KAAKvB,GAIlB,MAGF,IAAK,2BACH,IAAI,IAAIA,KAAW6G,EACb7G,EAAQ0O,MAAM5S,UAA4C,UAAhCkE,EAAQ0O,MAAM5S,SAASiD,MAIrD4qC,EAASpoC,KAAKvB,GAGhB,MAGF,IAAK,2BACH,IAAI,IAAIA,KAAW6G,EACb7G,EAAQ0O,MAAM5S,UAA4C,UAAhCkE,EAAQ0O,MAAM5S,SAASiD,MAIrD4qC,EAASpoC,KAAKvB,GAGhB,MAGF,IAAK,gCACH,IAAI,IAAIA,KAAW6G,EACb7G,EAAQ0O,MAAM5S,UAAc,CAAC,QAAS,SAAkC65B,SAAS31B,EAAQ0O,MAAM5S,SAASiD,OAI5G4qC,EAASpoC,KAAKvB,GAUpB,OAAO2pC,EAGI,oBAAoB9iC,EAAiBwiC,EAA+B1jC,GAAS,G,gDACxF,MAAM2mD,EAAwD,GACxDC,EAA8BljB,EAASud,WACvCvtB,EAA2B,GAC3BxR,EAAajsB,KAAKisB,WAAWjc,MACnC,IAIIrE,EAJAxE,EAAcsmC,EAAStmC,YAc3B,aAZM,eAGa,kCAAhBA,GAAqDnH,KAAKgH,cAAc4D,MAAMU,QAC/EnE,EAAc,2BACdwE,EAAc3L,KAAKwvD,iBACnBmB,EAAe5mD,OAAO4B,EAAY1L,YACV,6BAAhBkH,IACRwE,EAAc3L,KAAKqK,aAAaY,UAI3B9D,GACL,IAAK,2BACH,IAAI,MAAM/C,KAAW6G,EAAU,CAC7B,MAAM,OAACY,EAAM,IAAEC,GAAO,GAAkBC,aAAa,CACnDF,OAAQzH,EAAQ6C,OAChBhH,UAAW0L,EAAY/B,KACvBoC,YAAY,EACZC,WAAY,KAEd,GAAkBI,eAAeR,EAAQzH,EAAS0H,EAAK9L,KAAKgH,cAAc4D,OAGzEe,EAAY/B,KAAKK,mBAClB0B,EAAYzB,YAEd,MAGF,IAAK,gCACH,IAAI,MAAM9F,KAAW6G,EAAU,CAC7B,MAAM6H,EAAQ1O,EAAQ0O,MAAMtO,OAASJ,EAAQ0O,MAAM5S,UAAakE,EAAQ0O,MAAMqZ,SAAW/nB,EAAQ0O,MAAMqZ,QAAQjsB,SAEzGssB,EAAMtsB,SAASC,cAAc,OAInC,IAAIupB,EAHJ8C,EAAIpsB,UAAUC,IAAI,aAIlB,MAAMP,EAAO,IAAiB6sB,gBAAgB7Z,EAAO,IAAK,KAExD4W,EADa,UAAZ5W,EAAM1L,EACG21C,GAAU,CAClB9oC,IAAKnB,EACL1O,UACAnE,UAAWusB,EACX5C,SAAU,EACVC,UAAW,EACXG,cAAehqB,KAAKgqB,cACpBiC,aACAkxB,aAAa,EACbpzB,kBAAkB,EAClBqzB,cAAc,EACdt9C,SACCoqB,MAEOP,GAAU,CAClBnlB,MAAOsO,EACP1O,UACAnE,UAAWusB,EACX5C,SAAU,EACVC,UAAW,EACXG,cAAehqB,KAAKgqB,cACpBiC,aACAlC,kBAAkB,EAClB6C,QAAQ,EACR9sB,SAIJ,CAAC4pB,EAAQO,OAAOC,MAAOR,EAAQO,OAAOE,MAAMviB,OAAOc,SAASpC,QAAQ26C,IAClEA,EAAM7gD,UAAUC,IAAI,qBAGtBo9B,EAAS93B,KAAK+jB,EAAQI,aAAaI,OAEnCwmC,EAAc/qD,KAAK,CAACqP,QAASwX,EAAKpoB,YAGpC,MAGF,IAAK,2BACL,IAAK,gCACL,IAAK,2BACL,IAAK,8BACH,IAAI,MAAMA,KAAW6G,EAAU,CAC7B,MAAMsc,EAAavnB,KAAKunB,YAAe,CAAC,QAAS,SAAkCwS,SAAS31B,EAAQ0O,MAAM5S,SAASiD,MAC7GqpB,EAAMqzB,GAAa,CACvBz7C,UACAijB,UAAWE,EACXgB,WAAY,IACZjB,cAAc,EACdC,aACAvgB,cAAehH,KAAKmwD,kBAAkBhpD,GACtC6iB,cAAehqB,KAAKgqB,cACpBM,gBAAgB,IAGd,CAAC,QAAS,QAAS,SAAkCyP,SAAS31B,EAAQ0O,MAAM5S,SAASiD,OACvFqpB,EAAIpsB,UAAUC,IAAI,YAGpBqwD,EAAc/qD,KAAK,CAACqP,QAASwX,EAAKpoB,YAEpC,MAGF,IAAK,yBACH,IAAI,IAAIA,KAAW6G,EAAU,CAC3B,IAAIkhB,EAEJ,IAAgB,QAAb,EAAA/nB,EAAQ0O,aAAK,eAAEqZ,UAAuC,iBAA5B/nB,EAAQ0O,MAAMqZ,QAAQ/kB,EACjD+kB,EAAU/nB,EAAQ0O,MAAMqZ,YACnB,CACL,MAAMykC,EAASxsD,EAAQysD,cAAgBzsD,EAAQysD,cAAcpgD,KAAMxO,GAAmB,qBAARA,EAAEmF,GAAoC,yBAARnF,EAAEmF,GAAgC,KAC9I,IAAIsN,EAAao8C,EAAqBC,EAEtC,GAAIH,EAUFG,EAAS3sD,EAAQA,QAAQX,MAAMmtD,EAAOlhC,OAAQkhC,EAAOlhC,OAASkhC,EAAOzuD,YAV3D,CAEV,MAAMyQ,EAAQ,IAAkBo+C,SAAS5sD,EAAQA,SACjD,IAAIwO,EAEF,SAGF8B,EAAM9B,EAAM,GAMZ8B,EADe,0BAAdk8C,aAAM,EAANA,EAAQxpD,GACHwpD,EAAOl8C,IAGPA,GAAOq8C,EAGfD,EAAcp8C,EAEd,MAAMu8C,EAAO7sD,EAAQA,UAAYsQ,EAC7BA,EAAI9B,MAAM,4BACZk+C,EAAc,WAAap8C,EAC3BA,EAAMA,EAAIqlB,SAAS,KAAOrlB,EAAM,WAAaA,GAG/Co8C,EAAc,IAAI3N,IAAI2N,GAAaI,SAEnC/kC,EAAU,CACRzX,MACAo8C,eAGEG,IACF9kC,EAAQ4K,YAAc3yB,EAAQA,QAC9B+nB,EAAQglC,aAAe,IAAkBnlB,aAAa,YAAa5nC,EAAQA,QAAS,IAAK,OAInFlE,SAASC,cAAc,OAAjC,IAEIixD,EAAalxD,SAASC,cAAc,OAKxC,GAJAixD,EAAWhxD,UAAUC,IAAI,UAAW,aAIjC8rB,EAAQ3nB,MAAO,CACJmlB,GAAU,CACpB1pB,UAAWmxD,EACXhtD,QAAS,KACTI,MAAO2nB,EAAQ3nB,MACfolB,SAAU,EACVC,UAAW,EACXE,kBAAkB,EAClBC,cAAehqB,KAAKgqB,cACpBiC,aACAnsB,KAAM,IAAiB6sB,gBAAgBR,EAAQ3nB,MAAO,GAAI,IAAI,GAC9DslB,aAAc2T,EACd7Q,QAAQ,SAGVwkC,EAAWhxD,UAAUC,IAAI,SACzB+wD,EAAWntD,UAAY,IAAkBotD,gBAAgBllC,EAAQve,OAASue,EAAQ2kC,aAAe3kC,EAAQ4K,aAAe5K,EAAQzX,KAAK,GAGvI,IAAI9G,EAAQue,EAAQmlC,QAAU,GAC1B5lC,EAAWS,EAAQglC,cAAgB,GAEvC,MAAMI,EAAmB,OAAAC,GAAA,GAAuB9lC,GAE1CpjB,EADY,OAAAkpD,GAAA,GAAuB,IAAkBxlB,aAAa7f,EAAQzX,KAAO,KACnEgM,kBACjBpY,aAAampD,oBACdnpD,EAAEihB,UAAYmoC,mBAAmBppD,EAAEqpD,OAGlCJ,EAAiBK,YAClBL,EAAiBxnD,OAAO,MAG1BwnD,EAAiBxnD,OAAOzB,GAErBtI,KAAKunB,YACNgqC,EAAiBxnD,OAAO,KAAM,IAAmBqe,iBAAiBhkB,IAGhEwJ,IAEFA,EAAQ,IAAkBikD,cAAc1lC,EAAQ2kC,YAAY9Q,MAAM,IAAK,GAAG,KAG5E,MAAM9uB,EAAM,IAAI,GAAI,CAClBtjB,QACAilB,WAAY,IAAmBnK,aAAatkB,GAC5CsnB,SAAU6lC,EACV5+B,aAAa,EACblpB,WAAW,EACXkE,UAAU,IAMZujB,EAAIjxB,UAAU8J,OAAOqnD,GAWlBlgC,EAAIjxB,UAAUspB,UAAUje,OAAOnJ,QAChCuuD,EAAc/qD,KAAK,CAACqP,QAASkc,EAAIjxB,UAAWmE,aAgBpD,GAJGpE,KAAKuuC,WACN9Q,EAAS93B,KAAK3F,KAAKuuC,YAGlB9Q,EAASt7B,eACJU,QAAQC,IAAI26B,GACdxR,KAFN,CAQA,GAAGykC,EAAcvuD,OAAQ,CACvB,MAAMw4B,EAAS5wB,EAAS,SAAW,UACnC2mD,EAAcpqD,QAAQkN,IACpB,MAAM,QAACwB,EAAO,QAAE5Q,GAAWoP,EACrBs+C,EAAiB9xD,KAAK+xD,6BAA6B/xD,KAAK2uD,aAAevqD,EAAQ+jB,KAAO,EAAGhhB,GAC/F6N,EAAQ5U,UAAUC,IAAI,qBACtB2U,EAAQ5I,QAAQvF,IAAM,GAAKzC,EAAQyC,IACnCmO,EAAQ5I,QAAQnF,OAAS,GAAK7C,EAAQ6C,OACtC6qD,EAAetsD,MAAMm1B,GAAQ3lB,GAE1BhV,KAAKmuC,UAAUC,aAChBpuC,KAAKmuC,UAAUuc,sBAAsB11C,GAAS,KAMlDhV,KAAKgyD,gBAAgC,6BAAhB7qD,EAA6C,EAAI8D,EAAS9I,OAAQwuD,OAInF,gBAAgBxuD,EAAgB6oD,GACtC,GAAGA,EAAY,CACb,MAAM9C,EAAS8C,EAAWl6C,cAO1B,GANA3I,MAAMC,KAAK8/C,EAAO9iC,UAAU3hB,MAAM,GAAG6C,QAAQumB,IAC3CA,EAAMlrB,YAKJQ,IAAW6oD,EAAW/gD,kBAAmB,CAC3C,MAAMuiB,EAAMtsB,SAASC,cAAc,OACnCqsB,EAAIjD,UAAY,kCAChBiD,EAAIpsB,UAAUC,IAAI,kBAAmB,cAAe,gBAAiB,aAErE6nD,EAAOn+C,OAAOyiB,KAKZ,YACN,MAAMgN,EAA+B,IAAI31B,IACnCooB,EAAajsB,KAAKisB,WAAWjc,MAEnC,IAAI,IAAIhF,KAAKhL,KAAKqK,aAAc,CAC9B,MAAMoiB,EAAQzsB,KAAKqK,aAAaW,GAChChL,KAAKoO,KAAK6jD,yBAAyBloD,OAAO0iB,EAAMxsB,WAChDwsB,EAAMtiB,QAGR,MAAMS,EAAQ5K,KAAKgH,cAAc4D,MACjC,GAAGA,EAAO,CACR,MAAMksC,EAAa,CAAC5Z,EAAmBzQ,EAAoBylC,GAAmB,KAC5Eh1B,EAAQ52B,QAASW,IACf,GAAGuyB,EAAgB7xB,IAAIV,GACrB,OAGFuyB,EAAgBn5B,IAAI4G,GAEpB,MAAM65B,EAAO,IAAgBrG,QAAQxzB,IAI/B,IAAC6E,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ5E,EACRhH,UAAWwsB,EAAM7iB,KACjBoC,YAAY,EACZC,WAAY,GACZvC,WAAY+iB,EAAM/iB,aAGpB,GAAGwoD,IAAqBpxB,EAAKqxB,oBAAsBrxB,EAAKxD,cAAe,CACrE,MAAM80B,EAAS,IAAIC,OAAO,IAAI,YAAaznD,MAAU,YAAa,OAAA0nD,GAAA,GAAgB1nD,OAAY,MAC9FkB,EAAIymD,UAAUtuD,UAAY6H,EAAIymD,UAAUtuD,UAAUT,QAAQ4uD,EAAQ,aAClEtmD,EAAIwG,gBAAgBvI,OAAO,UAAkB+zB,qBAAqB72B,EAAOivB,kBACpE,GAAGjvB,IAAW2B,EAAA,QAAU6O,KAC7B3L,EAAIwG,gBAAgBvI,OAAO,eAAK,0BAC3B,CACL,IAAI8rB,EAAW,IAAgB6V,gBAAgBzkC,GAC/C,GAAI4uB,EAMFA,EAAW,IAAMA,MANL,CACZ,MAAMwO,EAAO,IAAgBC,QAAQr9B,GAClCo9B,GAAQA,EAAKY,QACdpP,EAAW,IAAM,OAAA28B,GAAA,GAAkBnuB,EAAKY,OAAOwtB,WAMnD3mD,EAAIwG,gBAAgBrO,UAAY,MAAQ4xB,EAAW,UAIvDpJ,EAAMngB,UAGF4c,EAAawpC,IACjB,GAAIzmC,IAMJ,OAAOymC,GAGT,OAAO7vD,QAAQC,IAAI,CACjB,IAAgB+5B,mBAAmBjyB,GAAO,GACzC/J,KAAKqoB,GACLroB,KAAM07B,IACFA,GACDua,EAAWva,EAAUv8B,KAAKqK,aAAakyB,UAAU,KAIrD,IAAgBO,eAAelyB,EAAO,IACrC/J,KAAKqoB,GACLroB,KAAM07B,IACL,GAAGA,IACDua,EAAWva,EAASU,WAAYj9B,KAAKqK,aAAakyB,UAAU,GAC5Dua,EAAWva,EAASW,QAA4El9B,KAAKqK,aAAasoD,gBAE/G3yD,KAAKqK,aAAasoD,eAAe7oD,OAAOsnC,kBACzCpxC,KAAKqK,aAAasoD,eAAe7oD,OAAOsnC,iBAAiBzvC,SAG3D3B,KAAKqK,aAAasoD,eAAe1yD,UAAUG,UAAUC,IAAI,YAEtDL,KAAKqK,aAAasoD,eAAe/oD,KAAKK,kBAAoB,GAAG,CAC9D,MAAMknC,EAAWjxC,SAASC,cAAc,OACxCgxC,EAAS/wC,UAAUC,IAAI,2BACvB8wC,EAAS5nB,UAAY,YACrBvpB,KAAKqK,aAAasoD,eAAe7oD,OAAOC,OAAOonC,GAC/CA,EAASnwC,iBAAiB,QAAS,KACjC,MAAM4xD,EAAU5yD,KAAKqK,aAAasoD,eAAe1yD,UAAUG,UAAUkM,OAAO,YAC5E6kC,EAAS5nB,UAAYqpC,EAAU,YAAc,iBAMrD,IAAmB72B,iBAAiBnxB,EAAO,EAAG,GAAI,GAAGzE,QACpDtF,KAAKqoB,GACLroB,KAAKqB,IACDA,GACD40C,EAAW50C,EAAMu5B,QAAQhzB,IAAI8X,GAAKA,EAAEtZ,QAASjH,KAAKqK,aAAakyB,UAAU,OAI1E,GAAIv8B,KAAKgH,cAAcC,QAAWjH,KAAKgH,cAAc6rD,QA0DrD,OAAOhwD,QAAQoD,UA1D+C,CACnE,MAAM6sD,EAAqB,CAAC5oD,GAAY,IAC/B6pB,EAAA,QAAgBC,WAAWnzB,KAAKozB,IACjChI,MAIJjsB,KAAKqK,aAAa0oD,OAAOnpD,KAAK3F,UAAY,GAE1CgwB,EAAM++B,aAAavvD,MAAM,EAAG,IAAI6C,QAAQW,IACtC,IAAI,OAAC4E,EAAM,IAAEC,GAAO,GAAkBC,aAAa,CACjDF,OAAQ5E,EACRhH,UAAWD,KAAKqK,aAAa0oD,OAAOnpD,KACpCoC,YAAY,EACZE,WAAW,EACXD,WAAY,GACZvC,YAAY,IAGdoC,EAAIwG,gBAAgBvI,OAAO9C,EAAOw1B,SAAW,IAAgBlqB,oBAAoBtL,GAAU,UAAkB62B,qBAAqB72B,EAAOivB,eAGvIjC,EAAM++B,aAAa7wD,OAEb+H,GACRlK,KAAKqK,aAAa0oD,OAAO7oD,YAFzBlK,KAAKqK,aAAa0oD,OAAO5oD,WAO/B,OAAOtH,QAAQC,IAAI,CACjB,IAAgBmwD,YAAY,kBAAkBpyD,KAAKqyD,IACjD,IAAIjnC,IAAc,OAElB,MAAM5nB,EAAM6uD,EAAM/9C,UAAU2rB,GAAQA,EAAK3xB,KAAOvG,EAAA,QAAU6O,OAC9C,IAATpT,IACD6uD,EAAQA,EAAMzvD,SACRgB,OAAOJ,EAAK,GAGjB6uD,EAAM/wD,QACP+wD,EAAM5sD,QAASw6B,IACb,GAAkB/0B,aAAa,CAC7BF,OAAQi1B,EAAK3xB,GACblP,UAAWD,KAAKqK,aAAa8oD,OAAOvpD,KACpCoC,YAAY,EACZonD,eAAe,EACfnnD,WAAY,GACZvC,YAAY,MAKlB1J,KAAKqK,aAAa8oD,OAAOjpD,cAG3B4oD,OAKE,YAAYrlB,GAClB,MAAMt+B,EAAKnP,KAAKgH,cAAcC,OAAOivB,WAC/BjK,EAAajsB,KAAKisB,WAAWjc,MACnC,IAAI7J,EAEJ,MAAMktD,EAA2B/1B,GAA2D,mCACvFt9B,KAAKuuC,kBACAvuC,KAAKuuC,WAEPtiB,OAKFjsB,KAAKszD,cACPtzD,KAAKszD,YAAc,IAAI,GAAe,CAACtpC,cAAehqB,KAAKgqB,cAAe3X,eAAe,IACzFrS,KAAKszD,YAAY1pD,KAAK5I,iBAAiB,QAAUiB,IAC/C,MAAM+4B,EAAK,OAAAyF,GAAA,GAAUx+B,EAAE4S,OAAQ,MAC/B,IAAImmB,EACF,OAGF,MAAM/zB,EAAS+zB,EAAG5uB,QAAQnF,OAAOkgB,WACjC,IAAIhhB,EAAwBtD,QAAQoD,UACjCsd,EAAA,EAAWC,WACZrd,EAAU,GAAgBgpC,eAAc,IAG1ChpC,EAAQtF,KAAK,KACX,GAAawlD,aAAap/C,OAG9BwmC,EAASud,WAAWjhD,OAAO/J,KAAKszD,YAAY1pD,MAC5C5J,KAAKgyD,gBAAgB,EAAGvkB,EAASud,aAGnC1tB,EAAah3B,QAAQi3B,IACnB,MAAMt2B,EAAS,IAAgBu2B,qBAAqBD,GACpD,GAAGt2B,EAAO42B,YACR,OAGW,IAAgByG,QAAQr9B,GAC7BqQ,OAAOojB,SAIf16B,KAAKszD,YAAYjzD,IAAI4G,SAIzB,GAAG,IAAgBw6B,UAAUtyB,GAAK,CAChC,MAAMokD,EAAcvzD,KAAKszD,YAAmB,IAAL,GACvCntD,EAAU,UAAkBi3B,uBAAuBjuB,OAAIzK,EAAW6uD,EAAYvzD,KAAKmuD,UAAU1gB,EAAStmC,cAActG,KAAKy8B,IACvH,IAAIrR,IACF,OAGF,IAAIriB,EAAO6jC,EAASud,WAAWtqC,kBAO/B,OANA1gB,KAAKmuD,UAAU1gB,EAAStmC,cAAgByC,EAAOA,EAAKK,kBAAoB,GAAKqzB,EAAaA,aAAan7B,OAEpGm7B,EAAaA,aAAan7B,OAASoxD,IACpCvzD,KAAKk5B,OAAOuU,EAAStmC,cAAe,GAG/BksD,EAAmB/1B,EAAaA,qBAGzCn3B,EAAW,UAAkBq8B,YAAYrzB,GAAmCtO,KAAKo3B,IAC/E,IAAIhM,IACF,OAIFjsB,KAAKk5B,OAAOuU,EAAStmC,cAAe,EACpC,MAAMm2B,EAAerF,EAASqF,aAC9B,MAAsB,8BAAnBA,EAAal2B,EAITisD,EAAmB/1B,EAAaA,mBAJvC,IAQJ,OAAOt9B,KAAK8pB,aAAa2jB,EAAStmC,aAAehB,EAAQkb,QAAQ,KAC3D4K,MAIJjsB,KAAK8pB,aAAa2jB,EAAStmC,aAAe,QAItC,SAASsmC,EAA+BoB,EAAmB9pC,EAAmBknB,G,QACpF,MAAM9oB,EAAOsqC,EAAStmC,YAEtB,GAAGnH,KAAK8pB,aAAa3mB,GACnB,OAAOnD,KAAK8pB,aAAa3mB,GAG3B,GAAqB,YAAlBsqC,EAAStqC,KACV,OAAOnD,KAAKwzD,YAAY/lB,GAG1B,MAAMtpC,EAAmC,QAAzB,EAAAnE,KAAK0uC,eAAevrC,UAAK,QAAKnD,KAAK0uC,eAAevrC,GAAQ,GAE1E,KAAY,6BAATA,GAAwCgB,EAAQhC,SAC7CnC,KAAKouD,cACPpuD,KAAKyzD,YACLzzD,KAAKouD,aAAc,GAGjBpuD,KAAKgH,cAAc4D,MAAMU,QAAWtL,KAAKgH,cAAcC,QAAWjH,KAAKgH,cAAc6rD,UAEvF,OADA7yD,KAAKk5B,OAAO/1B,IAAQ,EACbN,QAAQoD,UAInB,MAAMytD,EAAS,SAAWvwD,EAAO,MAGjC,GAAGgB,EAAQhC,QAAUnC,KAAKiuC,gBAAgB9qC,GAAQgB,EAAQhC,SAAW0sC,EAAU,CAC7E,IAAI5jC,EAAkB,GAClB0oD,EAAOtxD,KAAKP,IAAI,EAAG9B,KAAKiuC,gBAAgB9qC,IACxCywD,EAAe,EAEnB,EAAG,CACD,IAAIC,EAAM1vD,EAAQV,MAAMkwD,EAAMA,EAAO5uD,GAErC4uD,GAAQE,EAAI1xD,OACZyxD,GAAgBC,EAAI1xD,OAEpB8I,EAAStF,QAAQ3F,KAAKguC,qBAAqB6lB,EAAIprD,IAAIyhC,GAAK,IAAmB1wB,iBAAiB0wB,EAAEjjC,OAAQijC,EAAErjC,MAAO1D,UACzGywD,EAAe7uD,GAAa4uD,EAAOxvD,EAAQhC,QAWjD,OAFFnC,KAAKiuC,gBAAgB9qC,GAAQwwD,EAEpB3zD,KAAKkuC,oBAAoBjjC,EAAUwiC,GAAUpsB,QAAQ,KAC1D7V,WAAW,KACTxL,KAAK+K,WAAWquB,oBACf,KAOT,IAAIxyB,EAAQzC,EAAQhC,OAASgC,EAAQA,EAAQhC,OAAS,GAAG0E,IAAM,EAK/D,OAAO7G,KAAK8pB,aAAa3mB,GAAQ,IAAmB4D,UAAU,OAAD,wBACxD/G,KAAKgH,eAAa,CACrBG,YAAa,CAACC,EAAGjE,GACjByD,QACAM,MAAOnC,EACPuC,SAA8B,QAApB,EAAAtH,KAAKmuD,UAAUhrD,UAAK,QAAKnD,KAAKmuD,UAAUhrD,GAAQ,KACzDtC,KAAKqB,IAKN,GAJAiC,EAAQwB,QAAQzD,EAAMiC,QAAQsE,IAAIyhC,IAAK,CAAErjC,IAAKqjC,EAAErjC,IAAKI,OAAQijC,EAAEjjC,WAE/DjH,KAAKsuD,IAAIoF,EAAS,wBAAyBvwD,EAAMjB,GAE7C+pB,IAcJ,OARG/pB,EAAMiC,QAAQhC,OAAS4C,QAA8CL,IAAhC1E,KAAKgH,cAAcgB,WAA2B9F,EAAMmF,WAAcnF,EAAMiC,QAAQhC,SAAWD,EAAMyC,SAGvI3E,KAAKk5B,OAAO/1B,IAAQ,GAGtBnD,KAAKmuD,UAAUhrD,GAAQjB,EAAMmF,UAE1BwnC,EACMhsC,QAAQoD,WAGjBjG,KAAKiuC,gBAAgB9qC,GAAQgB,EAAQhC,OAEjCnC,KAAKk5B,OAAO/1B,KACbnD,KAAK8pB,aAAa3mB,IAASN,QAAQoD,WAAWpF,KAAK,KAClD2K,WAAW,KACT,GAAIygB,KAEDjsB,KAAKytC,WAAaA,EAAU,CAC7B,MAAMtnC,EAAUnG,KAAK8F,MAAK,GAAM,GAC7BK,GACDA,EAAQtF,KAAK,KACPorB,KAEJzgB,WAAW,KACTxL,KAAK+K,WAAWquB,oBACf,OAIR,KAKEp5B,KAAKkuC,oBAAoBluC,KAAKguC,qBAAqB9rC,EAAMiC,QAAShB,GAAOsqC,MAEjFjhC,MAAMC,IACPzM,KAAKsuD,IAAI3hD,MAAM,cAAeF,KAC7B4U,QAAQ,KACTrhB,KAAK8pB,aAAa3mB,GAAQ,OAIjB,KAAKyrC,GAAS,EAAOC,GAAW,G,0CAO3C,MAAM5nC,EAASjH,KAAKgH,cAAcC,OAClCjH,KAAKsuD,IAAI,OAAQ1f,EAAQ3nC,EAAQjH,KAAK8pB,cACtC,MAAMmC,EAAajsB,KAAKisB,WAAWjc,MAEnC,GAAGhQ,KAAKquD,UAAW,CACjB,GAAGruD,KAAK4uD,cAAe,CACrB,MAAMrhB,EAAYvtC,KAAKutC,UAAU3lC,OAAO6lC,GAAqC,6BAAzBA,EAAStmC,aACvD2sD,EAAUvmB,EAAU9kC,IAAIglC,IAAY,CAAErmC,EAAGqmC,EAAStmC,eAElD4sD,QAAiB,IAAmBC,kBAAkB/sD,EAAQ6sD,GACpE,IAAI7nC,IACF,OAGF,GAAGjsB,KAAKuuC,kBACAvuC,KAAKuuC,WAEPtiB,KACF,OAIJ,IAAIgoC,EACAtvD,EAAQ,EACZ4oC,EAAUjnC,QAAQmnC,IAChB,MAAMymB,EAAUH,EAAStjD,KAAKuiB,GAAKA,EAAEprB,OAAOR,IAAMqmC,EAAStmC,aAE3DsmC,EAASyhB,QAAQ9uD,UAAUkM,OAAO,QAAS4nD,EAAQvvD,OACnD8oC,EAASyhB,QAAQ9uD,UAAUuB,OAAO,UAG/BuyD,EAAQvvD,YAA2BD,IAAlBuvD,IAClBA,EAAgBxmB,GAGfymB,EAAQvvD,SAASA,IAGtB,MAAMwvD,EAAan0D,KAAKyuD,aAAaz+C,IAAI,WACnCs+B,EAAiBtuC,KAAKsuC,iBAC5B6lB,EAAWjF,QAAQ9uD,UAAUkM,OAAO,QAASgiC,GAE1CA,IACD2lB,EAAgBE,GAGlBn0D,KAAKC,UAAUG,UAAUkM,OAAO,QAAS2nD,GACzCj0D,KAAKC,UAAU6Q,cAAc1Q,UAAUkM,OAAO,gBAAiB2nD,GAC5DA,IACDj0D,KAAK2vD,YAAa,EAClB3vD,KAAKmO,UAAUnO,KAAKutC,UAAUhxB,QAAQ03C,IAAgB,GACtDA,EAAc/E,QAAQ9uD,UAAUC,IAAI,UAEpCL,KAAKqrD,uBAAuBjrD,UAAUkM,OAAO,OAAQ3H,GAAS,IAIlE3E,KAAKquD,WAAY,EAGnB,IAAI+F,EAASxlB,EAAS,CAAC5uC,KAAKytC,UAAYztC,KAAKutC,UAAU3lC,OAAO8I,GAAKA,IAAM1Q,KAAKytC,UAU9E,GATA2mB,EAASA,EAAOxsD,OAAO6lC,IACrB,MAAMtmC,EAAcsmC,EAAStmC,YAC7B,OAAQnH,KAAKk5B,OAAO/xB,IAAiBnH,KAAK0uC,eAAevnC,IAAgBnH,KAAKiuC,gBAAgB9mC,GAAenH,KAAK0uC,eAAevnC,GAAahF,SAG7I8E,EAAOw1B,UACR23B,EAAOn4B,cAAcwR,GAA8B,YAAlBA,EAAStqC,OAGxCixD,EAAOjyD,OACT,OAGF,MAAM4C,EAAY8pC,EAAW,GAAKxsC,KAAKE,MAAsC,GAA/Bq5B,GAAA,EAAWj7B,OAAS,IAAM,GAAS,MAE3E88B,EAA2B22B,EAAO3rD,IAAIglC,GACnCztC,KAAKq0D,SAAS5mB,EAAUoB,EAAU9pC,EAAWknB,IAGtD,OAAOppB,QAAQC,IAAI26B,GAAUjxB,MAAMC,IACjCzM,KAAKsuD,IAAI3hD,MAAM,2BAA4BF,QAIxC,6BAA6B6nD,EAAmBnxD,G,MACrD,MAAMglB,EAAO,IAAIssB,KAAiB,IAAZ6f,GACtBnsC,EAAKosC,SAAS,EAAG,EAAG,GACpBpsC,EAAKqsC,QAAQ,GACb,MAAMC,EAAgBtsC,EAAKusC,UACrBC,EAAuC,QAA1B,EAAA30D,KAAKwuD,gBAAgBrrD,UAAK,QAAKnD,KAAKwuD,gBAAgBrrD,GAAQ,GAC/E,KAAKsxD,KAAiBE,GAAa,CACjC,MAAM10D,EAAYC,SAASC,cAAc,OACzCF,EAAUuJ,UAAY,qBAEtB,MAAMF,EAAOpJ,SAASC,cAAc,OACpCmJ,EAAKlJ,UAAUC,IAAI,2BAEnB,MAAM2C,EAAsC,CAC1C4xD,MAAO,QAGNzsC,EAAK0sC,iBAAkB,IAAIpgB,MAAOogB,gBACnC7xD,EAAQ8xD,KAAO,WAGjB,MAAMC,EAAc,IAAI,UAAKC,gBAAgB,CAC3C7sC,OACAnlB,YACCgS,QACH1L,EAAKS,OAAOgrD,GAEZ90D,EAAU8J,OAAOT,GAEjB,MAAM9D,EAAQtF,SAASC,cAAc,OACrCqF,EAAMpF,UAAUC,IAAI,4BAEpBJ,EAAU8J,OAAOT,EAAM9D,GAEvB,MAAMyvD,EAAiB,YAAqBN,EAAY,QACxD,IAAI3pD,EAAI,EACR,KAAMA,EAAIiqD,EAAe9yD,SAAU6I,EAAG,CAEpC,GAAGypD,EADOQ,EAAejqD,GAEvB,MAIJ2pD,EAAWF,GAAiB,CAACx0D,YAAWuF,SACxC8+C,GAAuBrkD,EAAWD,KAAKoO,KAAKjL,GAAO6H,GAGrD,OAAO2pD,EAAWF,GAGb,iBACL,OAAOz0D,KAAKgH,cAAcC,OAAO42B,cAAgB,IAAgBrG,YAAYx3B,KAAKgH,cAAcC,OAAOivB,aAAe,IAAgByG,UAAU38B,KAAKgH,cAAcC,OAAOivB,WAAY,qBAGjL,UACLl2B,KAAK8pB,aAAe,GACpB9pB,KAAKk5B,OAAS,GACdl5B,KAAKouD,aAAc,EACnBpuD,KAAKmuD,UAAY,GACjBnuD,KAAKquD,WAAY,EAEjBruD,KAAKgqB,cAAc7f,QAEnBnK,KAAKutC,UAAUjnC,QAAQmnC,IACrBztC,KAAKiuC,gBAAgBR,EAAStmC,cAAgB,IAG7CnH,KAAKmuC,UAAUC,aAChBpuC,KAAKmuC,UAAU4Y,kBAUjB/mD,KAAKisB,WAAWrW,QAChB5V,KAAKitC,uBACLjtC,KAAKszD,iBAAc5uD,EAGd,uBACL1E,KAAKutC,UAAUjnC,QAAQmnC,IACrBA,EAAS1P,YAASr5B,IAIf,YAAYwwD,GAAU,GACxBl1D,KAAKkuD,aAAa/rD,SACnBnC,KAAKkuD,aAAa5nD,QAAQoO,IACxByuC,IAAIgS,gBAAgBzgD,KAEtB1U,KAAKkuD,aAAa/rD,OAAS,GAG7BnC,KAAKutC,UAAUjnC,QAASkJ,IAStB,GARAA,EAAIw7C,WAAW/mD,UAAY,GAExBjE,KAAK4uD,gBAEN5uD,KAAKC,UAAUG,UAAUC,IAAI,QAC7BL,KAAKC,UAAU6Q,cAAc1Q,UAAUC,IAAI,iBAG7B,UAAbmP,EAAIrM,OAIHnD,KAAK0uC,eAAel/B,EAAIrI,aAAc,CACxC,MAAM+gD,EAAS14C,EAAIw7C,WAAWl6C,cAExBo3C,EAAOr4C,cAAc,eACvB,aAAaq4C,GAAQ,GAIzB,MAAMjB,EAAQiB,EAAOr4C,cAAc,kBAChCo3C,GACDA,EAAMtlD,YAiBZ3B,KAAKwuD,gBAAkB,GACvBxuD,KAAKwvD,iBAAiBrlD,QACtBnK,KAAK+K,WAAWy9B,UAAY,EActB,kBAAkB4sB,GACxB,MAAMlsD,EAAU,YAAKlJ,KAAKgH,eAG1B,OAFAkC,EAAQ/B,YAAc,CAACC,EAAGguD,GAC1BlsD,EAAQ5B,SAAWtH,KAAKmuD,UAAUiH,GAC3BlsD,EAGF,UAAS,OAACjC,EAAM,MAAE2D,EAAK,SAAEE,EAAQ,eAAE4jC,EAAc,SAAE1mC,EAAQ,QAAE6qD,EAAO,QAAEwC,IAS3Er1D,KAAKgH,cAAgB,CACnBC,SACA2D,MAAOA,GAAS,GAChBzD,YAAa,CAACC,EAAGpH,KAAKytC,SAAStmC,aAC/B2D,WACA9C,WACA6qD,UACAwC,WAGFr1D,KAAK0uC,eAAiBA,UAAkB,GAExC1uC,KAAK0O,W,IEpkDG4mD,G,UAAZ,SAAYA,GACV,6BACA,2BACA,uBAHF,CAAYA,QAAW,KA6GvB,MAAMC,GAAoB,IAvGnB,MAKL,cAJQ,KAAAC,QAEH,GAGH5sD,EAAA,QAAUkvC,2BAA2B,CACnC2d,cAAgB10B,IACd,MAAMxyB,EAAMwyB,EAAOxyB,IAAInH,EACvBpH,KAAKw1D,QAAQjnD,GAAOwyB,EAAO20B,MAC3B9sD,EAAA,QAAU6F,cAAc,iBAAkBsyB,MAKzC,WAAW40B,EAAgCD,GAChD,OAAO,KAAW3/B,UAAU,qBAAsB,CAChDxnB,IAAK,CACHnH,EAAGuuD,GAELD,UACC70D,KAAK+0D,IACN,IAAgBC,aAAaD,EAAaE,OAC1C,IAAgBC,aAAaH,EAAaI,OAE1CC,GAAA,EAAkBC,mBAAmB,CACnC9uD,EAAG,gBACHmH,IAAK,CACHnH,EAAG,YAAqBuuD,IAE1BD,MAAOA,EAAMjtD,IAAI0tD,IACf,MAAMC,EAAoB,GAG1B,OAFAp/C,OAAOsjC,OAAO8b,EAAMD,GACpBC,EAAKhvD,EAAI,YAAqBgvD,EAAKhvD,GAC5BgvD,MAMJR,EAAaF,QAIjB,WAAWC,GAChB,MAAMU,EAA8B,YAAqBV,GACnDD,EAAQ11D,KAAKw1D,QAAQa,GAC3B,OAAGX,EACM7yD,QAAQoD,QAAQyvD,GAGlB11D,KAAKw1D,QAAQa,GAAc,KAAWtgC,UAAU,qBAAsB,CAC3ExnB,IAAK,CACHnH,EAAGuuD,KAEJ90D,KAAK+0D,IACN,IAAgBC,aAAaD,EAAaE,OAC1C,IAAgBC,aAAaH,EAAaI,OAInCh2D,KAAKw1D,QAAQa,GAAcT,EAAaF,QAI5C,uBAAuBA,GAC5B,MAAMY,EAAuB,GAG7B,IAAIC,EAAoB,CAACT,MAAO,GAAIE,MAAO,IAAKQ,EAAuB,CAACV,MAAO,GAAIE,MAAO,IA8B1F,OA7BAN,EAAMpvD,QAAQ8vD,IACZ,OAAOA,EAAKhvD,GACV,IAAK,uBACHkvD,EAAM3wD,KAAK,GACX,MACF,IAAK,0BACH2wD,EAAM3wD,KAAK,GACX,MACF,IAAK,4BACH2wD,EAAM3wD,KAAK,GACX,MAIF,IAAK,oCACH4wD,EAAWP,MAAMrwD,QAAQywD,EAAKJ,OAC9B,MACF,IAAK,yBACHO,EAAWT,MAAMnwD,QAAQywD,EAAKN,OAC9B,MACF,IAAK,uCACHU,EAAcR,MAAMrwD,QAAQywD,EAAKJ,OACjC,MACF,IAAK,4BACHQ,EAAcV,MAAMnwD,QAAQywD,EAAKN,UAKhC,CAAC3yD,KAAMmzD,EAAM,GAAIE,gBAAeD,gBAK3C,KAAehB,kBAAoBA,GACpB,UC3GA,MAAM,GAiBnB,YAAmBvyD,GAAA,KAAAA,UA8KX,KAAAyzD,cAAiBv0D,IACvBA,GAASA,EACTlC,KAAKmD,KAAOjB,EAEZ,MAAMq2B,EAAUv4B,KAAKgD,QAAQ0zD,SAAS12D,KAAKmD,MACrCwzD,EAAiB32D,KAAK42D,aAAar+B,QACrCA,EAGF,gBAAMo+B,EAAgBp+B,GAFtBo+B,EAAe1yD,UAAY,GAI7B0yD,EAAev2D,UAAUkM,OAAO,QAASisB,GAEtCv4B,KAAK62D,aACN72D,KAAK62D,WAAW7mD,IAAI,SAASkhB,IAAIjxB,UAAUG,UAAUkM,OAAO,OAAQtM,KAAKmD,OAASmyD,GAAYwB,WAC9F92D,KAAK62D,WAAW7mD,IAAI,YAAYkhB,IAAIjxB,UAAUG,UAAUkM,OAAO,OAAQtM,KAAKmD,OAASmyD,GAAYyB,SAGnG/2D,KAAKgD,QAAQyzD,eAAiBz2D,KAAKgD,QAAQyzD,cAAcv0D,IArLtDc,EAAQ0zD,UACT1zD,EAAQ0zD,SAAS5xD,UAGnB9E,KAAK42D,aAAe,IAAI,GAAe,CAACttD,KAAMtG,EAAQ4K,MAAO2qB,SAAS,IAEtEv4B,KAAKg3D,UAAY,IAAItnD,IAErB,IAAIuP,EAAsD,CAAC,CACzD9b,KAAMmyD,GAAYwB,UAClB1iC,QAAS,sCACR,CACDjxB,KAAMmyD,GAAY2B,SAClB7iC,QAAS,wCACR,CACDjxB,KAAMmyD,GAAYyB,OAClB3iC,QAAS,qCAGRpxB,EAAQk0D,YACTj4C,EAAIA,EAAErX,OAAOqX,IAAMjc,EAAQk0D,UAAUn9B,SAAS9a,EAAE9b,QAGlD,MAAMu0B,EAAS,eACfzY,EAAE3Y,QAAQ,EAAEnD,OAAMixB,cAChB,MAAMlD,EAAM,IAAI,GAAI,CAClBsB,WAAY,IAAI,GAAW,CACzB4B,UACA9qB,KAAMouB,EACNx1B,MAAO,GAAKiB,MAIhBnD,KAAKg3D,UAAUriD,IAAIxR,EAAM+tB,KAG3B,MAAMoB,EAAOY,GAAkB,IAAIlzB,KAAKg3D,UAAU14B,UAAWt+B,KAAKy2D,eAOlE,GALAz2D,KAAK42D,aAAa/oD,QAAQ9D,OAAOuoB,GAC9BtvB,EAAQq4B,UACTr4B,EAAQq4B,SAAStxB,OAAO/J,KAAK42D,aAAa32D,YAGxC+C,EAAQm0D,aAAc,CACxB,MAAMl3D,EAAYm3D,GAAgBp0D,EAAQq4B,SAAU,oBAAqB,sCAEzEr7B,KAAK62D,WAAa,IAAInnD,IAAI,CAAC,CACzB,WACA,CACEqjB,aAAc/vB,EAAQq0D,eAAe,GACrC9oD,IAAK,WACL2iB,IAAK,KACL7jB,KAAM,aACNolB,gBAAiB,qCACjBhpB,WAAW,IAEZ,CACD,QACA,CACEspB,aAAc/vB,EAAQq0D,eAAe,GACrC9oD,IAAK,QACL2iB,IAAK,KACL7jB,KAAM,UACNolB,gBAAiB,qCACjBhpB,WAAW,MAIfzJ,KAAK62D,WAAWvwD,QAASgxD,IACvBA,EAAUpmC,IAAM,IAAI,GAAIomC,GAExBA,EAAUpmC,IAAIjxB,UAAUe,iBAAiB,QAAS,KAChDmF,EAAQtF,KAAK,KACX,MAAM02D,EAAWv3D,KAAK8R,QAAQwlD,EAAU/oD,KACxC,IAAI,GAAiBvL,EAAQwM,IAAIlC,QAAQyD,KAAK,CAC5C5N,KAAM,UACNqiC,WAAW,EACX53B,MAAO0pD,EAAUvkC,aACjBnmB,YAAa,kCACboyB,QAAUw4B,IACRD,EAASp1D,OAAS,EAClBo1D,EAAS5xD,QAAQ6xD,GACjBF,EAAUpmC,IAAIxF,SAASznB,UAAY,GACnCqzD,EAAUpmC,IAAIxF,SAAS3hB,UAAU/J,KAAKy3D,YAAYz3D,KAAK03D,iBAAiBF,MAE1E3xB,gBAAiB0xB,QAKvBt3D,EAAU8J,OAAOutD,EAAUpmC,IAAIjxB,aAQnC,MAAMkG,EAAU,GAAkBwxD,WAAW30D,EAAQ2yD,UAAU90D,KAAK60D,IAClE,MAAMliD,EAAU,GAAkBokD,uBAAuBlC,GACzD11D,KAAK63D,SAASrkD,EAAQrQ,MAEnBnD,KAAK62D,aACN72D,KAAK8R,QAAU,GACf,CAAC,QAAkB,YAAqBxL,QAAQorC,IAC9C,MAAMptC,EAAM,GACN8D,EAAa,UAANspC,EAAgBl+B,EAAQ+iD,WAAa/iD,EAAQgjD,cAC1DlyD,EAAIqB,QAAQyC,EAAK0tD,MAAMrtD,IAAI0G,GAAMA,EAAGgY,aACpC7iB,EAAIqB,QAAQyC,EAAK4tD,MAAMvtD,IAAI0G,GAAMA,EAAGgY,UAAS,KAC7CnnB,KAAK8R,QAAQ4/B,GAAKptC,EAClB,MAAMuR,EAAI7V,KAAK62D,WAAW7mD,IAAI0hC,GAAGxgB,IAAIxF,SACrC7V,EAAE5R,UAAY,GACd4R,EAAE9L,UAAU/J,KAAKy3D,YAAYrvD,OAIjCpF,EAAQwM,IAAIhB,cAAcxN,iBAAiB,UAAW,KACpD,MAAM00D,EAA4B,GAElC,OAAO11D,KAAKmD,MACV,KAAKmyD,GAAYwB,UACfpB,EAAM/vD,KAAK,CAACyB,EAAG,8BACf,MACF,KAAKkuD,GAAY2B,SACfvB,EAAM/vD,KAAK,CAACyB,EAAG,mCACf,MACF,KAAKkuD,GAAYyB,OACfrB,EAAM/vD,KAAK,CAACyB,EAAG,iCAIhBpH,KAAK62D,YACL,CACC,CAAC,QAAa,yCAA8C,+BAC5D,CAAC,WAAa,4CAA8C,mCAK1DvwD,QAAQ,EAAEorC,EAAGomB,EAASC,GAAW1zD,KACnC,GAAGrE,KAAK62D,WAAW7mD,IAAI0hC,GAAGxgB,IAAIjxB,UAAUG,UAAUuR,SAAS,QACzD,OAGF,MAAM4lD,EAAWv3D,KAAK8R,QAAQ4/B,GAC9B,GAAG6lB,EAAU,CACX,MAAMS,EAAWh4D,KAAK03D,iBAAiBH,GACpCS,EAAShC,MAAM7zD,QAChBuzD,EAAM/vD,KAAK,CAACyB,EAAG0wD,EAAS9B,MAAOgC,EAAShC,QAGvCgC,EAASlC,MAAM3zD,QAChBuzD,EAAM/vD,KAAK,CAACyB,EAAG2wD,EAAUjC,MAAOkC,EAASlC,MAAMrtD,IAAI0G,GAAM,IAAgB8oD,aAAa9oD,SAM9F,GAAkB+oD,WAAWl1D,EAAQ2yD,SAAUD,IAC9C,CAAC/9C,MAAM,MAyBP,SAASxU,GACd,MAAM+tB,EAAMlxB,KAAKg3D,UAAUhnD,IAAI7M,GAC/BnD,KAAKy2D,cAActzD,GACnB+tB,EAAIsB,WAAWzwB,MAAM4b,SAAU,EAGzB,iBAAiB7L,GACvB,MAAMohD,EAAQ,CAAC4C,MAAO,GAAgBE,MAAO,IAK7C,OAJAlkD,EAAQxL,QAAQW,IACdisD,EAAMjsD,EAAO42B,YAAc,QAAU,SAASl4B,KAAKsB,EAAO42B,YAAc52B,EAAOivB,WAAajvB,KAGvFisD,EAGD,YAAYA,GAClB,OAAIA,EAAM4C,MAAM3zD,QAAW+wD,EAAM8C,MAAM7zD,OAIhC,eAAK,CACV+wD,EAAM4C,MAAM3zD,OAAS,eAAK,QAAS,CAAC+wD,EAAM4C,MAAM3zD,SAAW,KAC3D+wD,EAAM8C,MAAM7zD,OAAS,eAAK,QAAS,CAAC+wD,EAAM8C,MAAM7zD,SAAW,MAC3DyF,OAAOc,UAAU,GANV,CAAC,eAAK,wCC7OJ,MAAM,WAAiC,EAC1C,OACR1I,KAAKC,UAAUG,UAAUC,IAAI,cAAe,wBAC5CL,KAAKmR,SAAS,gBAEd,MACMgnD,EAAe,IAAI,GAAe,CACtC3oD,IAAKxP,KACL4N,MAAO,oBACP+nD,SAAU,6BACVe,SAAU,CALsB,sCAKO,IACvCW,eAAgB,CAAC,uCAAwC,yCACzDh8B,SAAUr7B,KAAK+K,WACf0rD,cAAgBtzD,IACd0S,EAAEgiD,SAASvC,GAAYwB,WACvBjhD,EAAE+gD,aAAa32D,UAAUG,UAAUkM,OAAO,OAAQnJ,IAASmyD,GAAYyB,WAKrElhD,EAAI,IAAI,GAAe,CAC3BrG,IAAKxP,KACL4N,MAAO,qBACP+nD,SAAU,8BACVe,SAAU,CALkB,wCAKG,IAC/BS,cAAc,EACdD,UAAW,CAAC5B,GAAYyB,UAG1B/2D,KAAK+K,WAAW9K,UAAU8gB,aAAalL,EAAE+gD,aAAa32D,UAAWk4D,EAAavB,aAAa32D,UAAUm4D,c,aC1B1F,MAAM,WAAqC,EAC9C,OACRp4D,KAAKC,UAAUG,UAAUC,IAAI,wBAAyB,6BACtDL,KAAKmR,SAAS,kCAEd,MAAMsmB,EAAU,IAAI,GAAe,CACjCc,QAAS,qCACTC,aAAa,IAITvkB,EAAM,GAAmB2lC,wBADjB,MAERye,EAAmBn4D,SAASC,cAAc,OAE7C8T,EACDsY,GAAY,CACVtY,MACAuY,IAAK6rC,EACL73D,MAAM,EACNiB,MAAM,EACNf,MAAO,IACPC,OAAQ,MACPE,KAAK,QAIRw3D,EAAiBj4D,UAAUC,IAAI,yBAGjCo3B,EAAQ5pB,QAAQ9D,OAAOsuD,GAEvB,MAAMC,EAAe7gC,EAAQ+I,yBAEvBlvB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAAMk4D,EAAY,YAAO,gCAAiC,CAACr7C,KAAM,8CAEjE,YAAiBq7C,EAAYt2D,IAC3BjC,KAAK+4B,UAGP/4B,KAAKsN,OAAOkrD,kBAAkB,GAAgBx4D,MAE9CsR,EAAavH,OAAOwuD,GAEpBD,EAAavuD,OAAOuH,GAEpBtR,KAAK+K,WAAW9K,UAAU8J,OAAO0tB,EAAQx3B,Y,cCtDtC,SAASw4D,GAASC,GACvB,OAAQ,sBAAqBA,ECchB,MAAM,WAAmD,EAAxE,c,oBAKS,KAAAC,SAAU,EAEP,OACR34D,KAAKC,UAAUG,UAAUC,IAAI,wBAAyB,4CACtDL,KAAKmR,SAAS,6BAEd,MAAMsmB,EAAU,IAAI,GAAe,CACjCc,SAAS,EACTC,aAAa,IAGf,gBAAMf,EAAQc,QAAS,mCAAoC,CAACv4B,KAAK44D,QAEjE,MACM3kD,EAAM,GAAmB2lC,wBADjB,MAERye,EAAmBn4D,SAASC,cAAc,OAE7C8T,EACDsY,GAAY,CACVtY,MACAuY,IAAK6rC,EACL73D,MAAM,EACNiB,MAAM,EACNf,MAAO,IACPC,OAAQ,IACR44C,MAZU,OAaT14C,KAAK,QAIRw3D,EAAiBj4D,UAAUC,IAAI,yBAGjCo3B,EAAQ5pB,QAAQ9D,OAAOsuD,GAEvB,MAAMC,EAAe7gC,EAAQ+I,yBAEvBlvB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAAMwB,EAAa7B,KAAK64D,eAAiB,IAAI,KAAe,CAC1DvvD,KAAM,sBACNkI,MAAO,2BACPrP,OAAQnC,KAAKmC,OACbwB,OAASue,IACPumB,GAAO,GAEPqwB,GAAA,EAAgBC,qBAAqB,GAAK72C,GACzCrhB,KAAKqB,IAKJ82D,MAEDxsD,MAAMC,IACL,OAAOA,EAAItJ,MACT,IAAK,eACHtB,EAAWE,MAAM3B,UAAUC,IAAI,SAC/B,OAAAkM,EAAA,GAAe1K,EAAW2P,MAAO,eAAK,oCACtC,MAEF,IAAK,qBACH3P,EAAWE,MAAM3B,UAAUC,IAAI,SAC/B,OAAAkM,EAAA,GAAe1K,EAAW2P,MAAO,eAAK,oCACtC,MAEF,QACE9E,QAAQC,MAAM,gBAAiBF,GAInCg8B,GAAO,QAKPwwB,EAAY,YAAO,8CAA+C,CAAC/7C,KAAM,qCACzEg8C,EAAY,YAAO,4DAA6D,CAACh8C,KAAM,eAEvF87C,EAAS,KACb,IAAI,GAA6Bh5D,KAAKsN,QAAQyD,QAG1C03B,EAAU0wB,IACd,OAAA9gC,GAAA,GAAiB,CAACx2B,EAAWE,MAAOk3D,EAAWC,GAAYC,IAG7D,YAAiBF,EAAYh3D,IAC3BwmC,GAAO,GACPqwB,GAAA,EAAgBM,sBAAsBv4D,KAAKqB,IACzClC,KAAKsN,OAAOkrD,kBAAkB,GAAgCx4D,MAC9DA,KAAK+4B,SACJ,KACD0P,GAAO,OAIX,YAAiBywB,EAAYj3D,IAC3BwmC,GAAO,GACP,MAAMloB,EAAI,aAAa24C,GACvBJ,GAAA,EAAgBO,sBAAsBx4D,KAAKqB,IACzCqe,EAAE5e,SACF8mC,GAAO,OAIXn3B,EAAavH,OAAOlI,EAAW5B,UAAWg5D,EAAWC,GAErDZ,EAAavuD,OAAOuH,GAEpBtR,KAAK+K,WAAW9K,UAAU8J,OAAO0tB,EAAQx3B,WAG3C,qBACMw4D,GAASz4D,KAAK24D,UAClB34D,KAAK64D,eAAe92D,MAAM0J,SCzHf,MAAM,WAAuC,EAA5D,c,oBAMS,KAAAktD,SAAU,EAEP,OACR34D,KAAKC,UAAUG,UAAUC,IAAI,wBAAyB,+BACtDL,KAAKmR,SAAS,sBAEd,MAAMsmB,EAAU,IAAI,GAAe,CACjCc,SAAS,EACTC,aAAa,IAITvkB,EAAM,GAAmB2lC,wBADjB,MAERye,EAAmBn4D,SAASC,cAAc,OAE7C8T,EACDsY,GAAY,CACVtY,MACAuY,IAAK6rC,EACL73D,MAAM,EACNiB,MAAM,EACNf,MAAO,IACPC,OAAQ,IACR44C,MAZU,OAaT14C,KAAK,QAIRw3D,EAAiBj4D,UAAUC,IAAI,yBAGjCo3B,EAAQ5pB,QAAQ9D,OAAOsuD,GAEvB,MAAMC,EAAe7gC,EAAQ+I,yBAEvBlvB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAAMwB,EAAa7B,KAAK6B,WAAa,IAAI,IAAW,CAClDyH,KAAM,iBACNkI,MAAO,gBACPtO,WAAW,IAGbrB,EAAWE,MAAMf,iBAAiB,WAAaiB,IAC7C,GAAa,UAAVA,EAAEsM,IAEH,OADA,OAAAmP,EAAA,GAAYzb,GACLq3D,MAIXz3D,EAAWE,MAAMf,iBAAiB,QAAUiB,IAC1CJ,EAAWE,MAAM3B,UAAUuB,OAAO,WAGpC,MAAM43D,EAAc,YAAO,gCAAiC,CAACr8C,KAAM,aAC7Ds8C,EAAU,YAAO,4DAA6D,CAACt8C,KAAM,kBAErF87C,EAAS,KACb,IAAI,GAA6Bh5D,KAAKsN,QAAQyD,QAG1CuoD,EAAkB,KACtB,MAAMV,EAAQ/2D,EAAWK,MAAMoJ,OACzBsH,EAAQ,IAAkB6mD,WAAWb,GAC3C,IAAIhmD,GAASA,EAAM,GAAGzQ,SAAWy2D,EAAMz2D,OAErC,YADAN,EAAWE,MAAM3B,UAAUC,IAAI,SAIjCq5D,GAAc,GACd,MAAMn5C,EAAI,aAAag5C,GAEvBT,GAAA,EAAgBa,eAAe,CAC7BC,KAAM55D,KAAK45D,KACXC,gBAAiB75D,KAAK85D,cACtBC,YAAa/5D,KAAK+5D,YAClBnB,UACC/3D,KAAMqB,IACP82D,KACEvsD,IACF,GAAGA,EAAItJ,KAAK42B,SAAS,qBAAsB,CACzC,MAAMigC,GAAWvtD,EAAItJ,KAAKyP,MAAM,4BAA4B,GAEtDpD,EAAM,IAAI,GAA2CxP,KAAKsN,QAChEkC,EAAIykB,MAAQj0B,KAAKi0B,MACjBzkB,EAAIopD,MAAQA,EACZppD,EAAIrN,OAAS63D,EACbxqD,EAAIuB,YAEJrE,QAAQ4hD,IAAI,qBAAsB7hD,GAGpCitD,GAAc,GACdn5C,EAAE5e,YAGN,YAAiB43D,EAAaD,GAE9B,MAAMI,EAAiBjxB,IAClBA,GACD8wB,EAAYn2D,aAAa,WAAY,QACrCo2D,EAAQp2D,aAAa,WAAY,UAEjCm2D,EAAY/1B,gBAAgB,YAC5Bg2B,EAAQh2B,gBAAgB,cAI5B,YAAiBg2B,EAAUv3D,IACX,IAAI,GAAU,mBAAoB,CAC9C2b,QAAS,CAAC,CACRwW,QAAS,SACT6lC,UAAU,GACT,CACD7lC,QAAS,gBACTiD,SAAU,KAERqiC,GAAc,GACd,aAAaF,GACbV,GAAA,EAAgBa,eAAe,CAC7BC,KAAM55D,KAAK45D,KACXC,gBAAiB75D,KAAK85D,cACtBC,YAAa/5D,KAAK+5D,YAClBnB,MAAO,KACN/3D,KAAK,KACNm4D,KACEvsD,IACFitD,GAAc,MAGlBp3B,UAAU,IAEZvP,aAAc,uBACd+D,mBAAoB,6BAGhBrY,SAGRnN,EAAavH,OAAOlI,EAAW5B,UAAWs5D,EAAaC,GAEvDlB,EAAavuD,OAAOuH,GAEpBtR,KAAK+K,WAAW9K,UAAU8J,OAAO0tB,EAAQx3B,WAG3C,qBACMw4D,GAASz4D,KAAK24D,UAClB34D,KAAK6B,WAAWE,MAAM0J,S,iCC/JX,MAAM,WAAsC,EAM/C,OACRzL,KAAKC,UAAUG,UAAUC,IAAI,wBAAyB,8BACtDL,KAAKmR,SAAS,8BAEd,MAAMsmB,EAAU,IAAI,GAAe,CACjCe,aAAa,IAITvkB,EAAM,GAAmB2lC,wBADjB,MAERye,EAAmBn4D,SAASC,cAAc,OAE7C8T,EACDsY,GAAY,CACVtY,MACAuY,IAAK6rC,EACL73D,MAAM,EACNiB,MAAM,EACNf,MAAO,IACPC,OAAQ,IACR44C,MAZU,OAaT14C,KAAK,QAIRw3D,EAAiBj4D,UAAUC,IAAI,yBAGjCo3B,EAAQ5pB,QAAQ9D,OAAOsuD,GAEvB,MAAM/mD,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAAMwB,EAAa7B,KAAK6B,WAAa,IAAI,IAAW,CAClDyH,KAAM,OACNkI,MAAO,qCAGT3P,EAAWE,MAAMf,iBAAiB,WAAaiB,IAC7C,GAAa,UAAVA,EAAEsM,IAEH,OADA,OAAAmP,EAAA,GAAYzb,GACLJ,EAAWK,MAAQo3D,IAAoBY,MAIlD,MAAMlB,EAAS,CAAC/2D,EAAWk4D,KACtBl4D,GACD,OAAAyb,EAAA,GAAYzb,GAGd,MAAM23D,EAAOO,EAAWt4D,EAAWK,WAAQwC,EAC3C,GAAGk1D,GAAQ55D,KAAK+5D,cAAgBH,EAE9B,YADArlC,GAAM,UAAKvb,OAAO,uBAAuB,IAI3C,MAAMxJ,EAAM,IAAI,GAA+BxP,KAAKsN,QACpDkC,EAAIykB,MAAQj0B,KAAKi0B,MACjBzkB,EAAIsqD,cAAgB95D,KAAK85D,cACzBtqD,EAAIuqD,YAAc/5D,KAAK+5D,YACvBvqD,EAAIoqD,KAAOA,EAEXpqD,EAAIuB,QAGAwoD,EAAc,YAAO,gCAAiC,CAACr8C,KAAM,aAC7Ds8C,EAAU,YAAO,4DAA6D,CAACt8C,KAAM,kBAErFo8C,EAAmBr3D,GAAc+2D,EAAO/2D,GAAG,GAC3Ci4D,EAAej4D,GAAc+2D,EAAO/2D,GAAG,GAC7C,YAAiBs3D,EAAaD,GAC9B,YAAiBE,EAASU,GAE1B5oD,EAAavH,OAAOlI,EAAW5B,UAAWs5D,EAAaC,GAEvD/hC,EAAQ5pB,QAAQ9D,OAAOuH,GAEvBtR,KAAK+K,WAAW9K,UAAU8J,OAAO0tB,EAAQx3B,WAG3C,qBACED,KAAK6B,WAAWE,MAAM0J,SCzFX,MAAM,WAAiD,EAM1D,OACRzL,KAAKC,UAAUG,UAAUC,IAAI,wBAAyB,uCAAwC,2CAC9FL,KAAKmR,SAAS,yBAEd,MAAMsmB,EAAU,IAAI,GAAe,CACjCe,aAAa,IAGTlnB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAAMR,EAAqBG,KAAKH,mBAAqB,IAAI,KAAmB,CAC1EyJ,KAAM,oBACNkI,MAAO,0BAGH4oD,EAAS,IAAI,KAAev6D,EAAoB,KAEhD05D,EAAc,YAAO,gCAAiC,CAACr8C,KAAM,aAEnE5L,EAAavH,OAAOlK,EAAmBI,UAAWs5D,GAClD9hC,EAAQ5pB,QAAQ9D,OAAOqwD,EAAOn6D,UAAWqR,GAEzCtR,KAAK+K,WAAW9K,UAAU8J,OAAO0tB,EAAQx3B,WAEzCJ,EAAmBkC,MAAMf,iBAAiB,WAAaiB,IAKrD,GAJGpC,EAAmBkC,MAAM3B,UAAUuR,SAAS,UAC7C9R,EAAmB01B,SAAS,IAAWC,SAG5B,UAAVvzB,EAAEsM,IACH,OAAO+qD,MAIX,MAAMe,EAAc,IACfr6D,KAAK+5D,cAAgBl6D,EAAmBqC,QACzCrC,EAAmB61B,YACZ,GAML4jC,EAAmBr3D,IAKvB,GAJGA,GACD,OAAAyb,EAAA,GAAYzb,IAGVo4D,IAAe,OAEnB,MAAM7qD,EAAM,IAAI,GAA8BxP,KAAKsN,QACnDkC,EAAIykB,MAAQj0B,KAAKi0B,MACjBzkB,EAAIsqD,cAAgB95D,KAAK85D,cACzBtqD,EAAIuqD,YAAc/5D,KAAK+5D,YACvBvqD,EAAIuB,QAIN,OAFA,YAAiBwoD,EAAaD,GAEvBc,EAAOt0D,OAGhB,qBACE9F,KAAKH,mBAAmBkC,MAAM0J,SC/DnB,MAAM,WAA+C,EAApE,c,oBAIS,KAAAktD,SAAU,EAEP,OACR,MAAM10B,GAASjkC,KAAKi0B,MAAM3c,OAAOgjD,cAAgBt6D,KAAK85D,cACtD95D,KAAKC,UAAUG,UAAUC,IAAI,wBAAyB,wCACtDL,KAAKmR,SAAS8yB,EAAQ,2BAA6B,8BAEnD,MAAMxM,EAAU,IAAI,GAAe,CACjCe,aAAa,IAGTlnB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAAMR,EAAqBG,KAAKH,mBAAqB,IAAI,KAAmB,CAC1EyJ,KAAM,iBACNkI,MAAOyyB,EAAQ,2BAA8BjkC,KAAKi0B,MAAM2lC,UAAOl1D,EAAY,gBAC3E61D,WAAYt2B,GAASjkC,KAAKi0B,MAAM2lC,KAAO,IAAkB9tC,cAAc9rB,KAAKi0B,MAAM2lC,WAAQl1D,IAGtF01D,EAAS,IAAI,KAAev6D,EAAoB,KAEhD05D,EAAc,YAAO,iCACrBvjB,EAAS,IAAI,UAAKwkB,YAAY,CAACjsD,IAAK,aAE1CgrD,EAAYxvD,OAAOisC,EAAOhhC,SAE1B1D,EAAavH,OAAOlK,EAAmBI,UAAWs5D,GAClD9hC,EAAQ5pB,QAAQ9D,OAAOqwD,EAAOn6D,UAAWqR,GAEzCtR,KAAK+K,WAAW9K,UAAU8J,OAAO0tB,EAAQx3B,WAEzCJ,EAAmBkC,MAAMf,iBAAiB,WAAaiB,IAOrD,GANGpC,EAAmBkC,MAAM3B,UAAUuR,SAAS,WAC7C9R,EAAmBkC,MAAM3B,UAAUuB,OAAO,SAC1Cq0C,EAAOznC,IAAM,WACbynC,EAAOjV,UAGI,UAAV9+B,EAAEsM,IACH,OAAO+qD,MAIX,MAAMe,EAAc,MACdx6D,EAAmBqC,MAAMC,SAC3BtC,EAAmBkC,MAAM3B,UAAUC,IAAI,UAChC,GAMX,IAAIi5D,EACJ,GAAIr1B,EAkEFq1B,EAAmBr3D,IAKjB,GAJGA,GACD,OAAAyb,EAAA,GAAYzb,IAGVo4D,IAAe,OAEnB,MAAM7qD,EAAM,IAAI,GAAyCxP,KAAKsN,QAC9DkC,EAAIykB,MAAQj0B,KAAKi0B,MACjBzkB,EAAIuqD,YAAcl6D,EAAmBqC,MACrCsN,EAAIsqD,cAAgB95D,KAAK85D,cACzBtqD,EAAIuB,YA7EG,CACT,IAAI0pD,EAEAzmC,EAAW,KAETymC,IACFA,EAAmBlvD,OAAO4/B,YAAYnX,EAAU,MAG3C8kC,GAAA,EAAgB9kC,WAAWnzB,KAAK65D,IACrC16D,KAAKi0B,MAAQymC,EAEV16D,KAAKi0B,MAAM2lC,KACZ/5D,EAAmB2R,MAAMvN,UAAY,IAAkB6nB,cAAc9rB,KAAKi0B,MAAM2lC,MAEhF,OAAArtD,EAAA,GAAe1M,EAAmB2R,MAAO,eAAK,qBA+CpD8nD,EA1CgBr3D,IACd,IAAIo4D,IAEF,YADA,OAAA38C,EAAA,GAAYzb,GAIds3D,EAAYn2D,aAAa,WAAY,QACrC4yC,EAAOznC,IAAM,aACbynC,EAAOjV,SACP,MAAM5a,EAAY,aAAaozC,GAEzBO,EAAgBj6D,EAAmBqC,MACzC42D,GAAA,EAAgB6B,MAAM96D,EAAmBqC,MAAOlC,KAAKi0B,OAAOpzB,KAAK+5D,IAG/D,GAFAluD,QAAQ4hD,IAAIsM,GAEE,uBAAXA,EAAKxzD,EAA4B,CAClC4tC,cAAcylB,GACXL,GAAQA,EAAOz4D,SAClB,MAAM6N,EAAM,IAAI,GAA0BxP,KAAKsN,QAC/CkC,EAAIykB,MAAQj0B,KAAKi0B,MACjBzkB,EAAIsqD,cAAgBA,EACpBtqD,EAAIuB,OACJ/Q,KAAKsN,OAAOkD,qBAAqBxQ,QAEjCyM,IACF8sD,EAAY/1B,gBAAgB,YAC5B3jC,EAAmBkC,MAAM3B,UAAUC,IAAI,SAEhCoM,EAAItJ,KAGP6yC,EAAOznC,IAAM,8BACbynC,EAAOjV,SACP5a,EAAUxkB,SACV9B,EAAmB6zB,SAIvBM,OAMJA,IAmBF,OAFA,YAAiBulC,EAAaD,GAEvBc,EAAOt0D,OAGhB,qBACM2yD,GAASz4D,KAAK24D,UAClB34D,KAAKH,mBAAmBkC,MAAM0J,SCrJnB,MAAM,WAAkC,EAI3C,OACRzL,KAAKC,UAAUG,UAAUC,IAAI,wBAAyB,8BACtDL,KAAKmR,SAAS,4BAEd,MAAMsmB,EAAU,IAAI,GAAe,CACjCc,SAAS,EACTC,aAAa,IAITvkB,EAAM,GAAmB2lC,wBADjB,MAERye,EAAmBn4D,SAASC,cAAc,OAE7C8T,EACDsY,GAAY,CACVtY,MACAuY,IAAK6rC,EACL73D,MAAM,EACNiB,MAAM,EACNf,MAAO,IACPC,OAAQ,IACR44C,MAZU,OAaT14C,KAAK,QAIRw3D,EAAiBj4D,UAAUC,IAAI,yBAGjCo3B,EAAQ5pB,QAAQ9D,OAAOsuD,GAEvB,MAAMrlC,EAAIyE,EAAQ+I,yBAClB,GAAGxgC,KAAKi0B,MAAM3c,OAAOgjD,aAAc,CACjC,gBAAM7iC,EAAQc,QAAS,2BAEvB,MAAMsiC,EAAoB,YAAO,8BAA+B,CAACxtD,KAAM,OAAQ6P,KAAM,+BAC/E49C,EAAqB,YAAO,8BAA+B,CAACztD,KAAM,cAAe6P,KAAM,+BACvF69C,EAAsB,YAAO,8BAA+B,CAAC1tD,KAAM,QAAS6P,KAAMld,KAAKi0B,MAAM3c,OAAO0jD,aAAe,0BAA4B,2BAErJ,YAAiBH,EAAmB,KAClC,MAAMrrD,EAAM,IAAI,GAAuCxP,KAAKsN,QAC5DkC,EAAIykB,MAAQj0B,KAAKi0B,MACjBzkB,EAAIsqD,cAAgB95D,KAAK85D,cACzBtqD,EAAIuB,SAGN,YAAiB+pD,EAAoB,KACrB,IAAI,GAAU,yBAA0B,CACpDl9C,QAAS,CAAC,CACRwW,QAAS,UACTiD,SAAU,KACRyhC,GAAA,EAAgBa,eAAe,CAACE,gBAAiB75D,KAAK85D,gBAAgBj5D,KAAK,KACzEb,KAAKsN,OAAOkrD,kBAAkB,GAAgBx4D,MAC9CA,KAAK+4B,WAGTuJ,UAAU,IAEZvP,aAAc,+BACd+D,mBAAoB,4BAGhBrY,SAGR,YAAiBs8C,EAAqB,KACpC,MAAMvrD,EAAM,IAAI,GAA+BxP,KAAKsN,QACpDkC,EAAIykB,MAAQj0B,KAAKi0B,MACjBzkB,EAAIoqD,KAAO55D,KAAKi0B,MAAM2lC,KACtBpqD,EAAIsqD,cAAgB95D,KAAK85D,cACzBtqD,EAAIuqD,YAAc/5D,KAAK85D,cACvBtqD,EAAImpD,SAAU,EACdnpD,EAAIuB,SAGNiiB,EAAEjpB,OAAO8wD,EAAmBC,EAAoBC,OAC3C,CACL,gBAAMtjC,EAAQc,QAAS,+BAEvB,MAAMjnB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAAM46D,EAAiB,YAAO,gCAAiC,CAAC/9C,KAAM,mCAEtE5L,EAAavH,OAAOkxD,GACpBjoC,EAAEjpB,OAAOuH,GAET,YAAiB2pD,EAAiBh5D,IAChC,MAAMuN,EAAM,IAAI,GAAuCxP,KAAKsN,QAC5DkC,EAAIykB,MAAQj0B,KAAKi0B,MACjBzkB,EAAIuB,SAIR/Q,KAAK+K,WAAW9K,UAAU8J,OAAO0tB,EAAQx3B,YC5G9B,MAAM,WAA8B,EACvC,OACRD,KAAKC,UAAUG,UAAUC,IAAI,cAAe,qBAC5CL,KAAKmR,SAAS,mBAEd,MAAMonB,EAAuB,gDAC7B,IAAI,GAAe,CACjB/oB,IAAKxP,KACL4N,MAAO,gBACP+nD,SAAU,iCACVe,SAAU,CAACn+B,EAASA,EAASA,GAC7B8+B,eAAgB,CAAC,uCAAwC,yCACzDh8B,SAAUr7B,KAAK+K,cCXN,MAAM,WAAkC,EAC3C,OACR/K,KAAKC,UAAUG,UAAUC,IAAI,cAAe,yBAC5CL,KAAKmR,SAAS,uBAEd,MAAMonB,EAAuB,oDAC7B,IAAI,GAAe,CACjB/oB,IAAKxP,KACL4N,MAAO,2BACP+nD,SAAU,8BACVe,SAAU,CAACn+B,EAASA,EAASA,GAC7B8+B,eAAgB,CAAC,uCAAwC,yCACzDh8B,SAAUr7B,KAAK+K,WACfmsD,UAAW,CAAC5B,GAAYyB,WCdf,MAAM,WAAqC,EAC9C,OACR/2D,KAAKC,UAAUG,UAAUC,IAAI,cAAe,4BAC5CL,KAAKmR,SAAS,4BAEd,MAAMonB,EAAuB,gDAC7B,IAAI,GAAe,CACjB/oB,IAAKxP,KACL4N,MAAO,uBACP+nD,SAAU,0BACVe,SAAU,CAACn+B,EAASA,EAASA,GAC7B8+B,eAAgB,CAAC,uCAAwC,yCACzDh8B,SAAUr7B,KAAK+K,cCXN,MAAM,WAAiC,EAC1C,OACR/K,KAAKC,UAAUG,UAAUC,IAAI,cAAe,yBAC5CL,KAAKmR,SAAS,0BAEd,MAAMonB,EAAuB,6CAC7B,IAAI,GAAe,CACjB/oB,IAAKxP,KACL4N,MAAO,cACP+nD,SAAU,4BACVe,SAAU,CAACn+B,EAASA,EAASA,GAC7B8+B,eAAgB,CAAC,uCAAwC,yCACzDh8B,SAAUr7B,KAAK+K,WACfmsD,UAAW,CAAC5B,GAAYyB,WCdf,MAAM,WAA2B,EACpC,OACR/2D,KAAKC,UAAUG,UAAUC,IAAI,cAAe,iBAC5CL,KAAKmR,SAAS,8BAEd,MAAMonB,EAAuB,iDAC7B,IAAI,GAAe,CACjB/oB,IAAKxP,KACL4N,MAAO,eACP+nD,SAAU,2BACVe,SAAU,CAACn+B,EAASA,EAASA,GAC7B8+B,eAAgB,CAAC,uCAAwC,yCACzDh8B,SAAUr7B,KAAK+K,aAGjB,CACE,MAAMwtB,EAAuB,qCAC7B,IAAI,GAAe,CACjB/oB,IAAKxP,KACL4N,MAAO,mBACP+nD,SAAU,0BACVe,SAAU,CAACn+B,EAASA,EAASA,GAC7B8+B,eAAgB,CAAC,uCAAwC,yCACzDh8B,SAAUr7B,KAAK+K,eCVR,MAAM,WAA6B,EAKtC,OACR/K,KAAKC,UAAUG,UAAUC,IAAI,6BAC7BL,KAAKmR,SAAS,iBAEd,MAAM+pD,EAAWN,IACf,MAAM1pC,EAAM,IAAI,GAAI,CAClBtjB,MAAO,CAACgtD,EAAKO,SAAUP,EAAKQ,aAAap0C,KAAK,KAC9C0E,SAAU,CAACkvC,EAAKS,GAAIT,EAAKU,SAASt0C,KAAK,OACvCvd,WAAW,EACXopB,WAAY+nC,EAAKtjD,OAAOlS,aAAUV,EAAY,aAA8B,IAAI+vC,KAAqD,IAAhDpyC,KAAKP,IAAI84D,EAAKW,YAAaX,EAAKY,kBAGvHtqC,EAAIjxB,UAAUmM,QAAQqvD,KAAO,GAAKb,EAAKa,KAEvC,MAAMC,EAAWx7D,SAASC,cAAc,OAMxC,OALAu7D,EAASt7D,UAAUC,IAAI,gBACvBq7D,EAASz3D,UAAY,CAAC22D,EAAKe,aAAcf,EAAKgB,gBAAkBhB,EAAKiB,UAAUj0D,OAAOc,SAASse,KAAK,MAEpGkK,EAAIxF,SAAS5a,cAAciQ,aAAa26C,EAAUxqC,EAAIxF,UAE/CwF,GAGH4qC,EAAiB97D,KAAK87D,eAAer4D,QAE3C,CACE,MAAMg0B,EAAU,IAAI,GAAe,CACjCnuB,KAAM,mBAGFsxD,EAAOkB,EAAe7/B,cAAc2+B,GAAQA,EAAKtjD,OAAOlS,SACxD22D,EAAUb,EAAQN,GAIxB,GAFAnjC,EAAQ5pB,QAAQ9D,OAAOgyD,EAAQ97D,WAE5B67D,EAAe35D,OAAQ,CACxB,MAAM65D,EAAe,YAAO,qCAAsC,CAAC3uD,KAAM,OAAQ6P,KAAM,yBACvF,YAAiB8+C,EAAe/5D,IAC9B,IAAI,GAAU,iBAAkB,CAC9B2b,QAAS,CAAC,CACRwW,QAAS,YACTkO,UAAU,EACVjL,SAAU,KACR,MAAM/qB,EAAS,OAAA+rB,GAAA,GAAiB,CAAC2jC,IAAe,GAChD,KAAWjmC,UAAU,4BAA4Bl1B,KAAKqB,IAEpD85D,EAAar6D,SACbs6D,EAAah8D,UAAU0B,SACvB3B,KAAKk8D,WAAWC,wBACfvuB,GAASvsB,QAAQ,KAClB/U,SAINymB,aAAc,0BACd+D,mBAAoB,uBACnBrY,SAGLgZ,EAAQ5pB,QAAQ9D,OAAOiyD,GAGzBh8D,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAGjC,IAAI67D,EAAe35D,OACjB,OAGF,MAAM85D,EAAe,IAAI,GAAe,CACtC3yD,KAAM,kBAGRwyD,EAAex1D,QAAQs0D,IACrBqB,EAAapuD,QAAQ9D,OAAOmxD,EAAQN,GAAM36D,aAG5CD,KAAK+K,WAAWhB,OAAOkyD,EAAah8D,WAEpC,MAAM2tC,EAAWnhC,IACC,wCAAbA,EAAItJ,MACLoxB,GAAM,UAAKvb,OAAO,mCAAmC,KAIzD,IAAInE,EACJ,MAAMunD,EAAmB,KACvB,MAAMX,EAAO5mD,EAAOzI,QAAQqvD,KAE5B,IAAI,GAAU,iBAAkB,CAC9B79C,QAAS,CAAC,CACRwW,QAAS,YACTkO,UAAU,EACVjL,SAAU,KACR,KAAWtB,UAAU,6BAA8B,CAAC0lC,SACnD56D,KAAKqB,IACDA,IACD2S,EAAOlT,SACP3B,KAAKk8D,WAAWC,yBAEjBvuB,MAGP7a,aAAc,yBACd+D,mBAAoB,yBACnBrY,QAGCzJ,EAAUhV,KAAKq8D,YAAc,GAAW,CAAC,CAC7ChvD,KAAM,OACN6P,KAAM,YACNC,QAASi/C,KAEXpnD,EAAQ7F,GAAK,8BACb6F,EAAQ5U,UAAUC,IAAI,eAEtBH,SAAS4uC,eAAe,cAAc/kC,OAAOiL,GAE7C,aAA0BhV,KAAK+K,WAAW9K,UAAYgC,IACpD4S,EAAS,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAAQ,OAC/BA,GAAkC,MAAxBA,EAAOzI,QAAQqvD,OAI1Bx5D,aAAa6jB,YAAY7jB,EAAE8Y,iBAE3B9Y,aAAa6jB,aAAY7jB,EAAE8rD,cAAe,GAE7C,aAAa9rD,EAAG+S,GAChB,aAAYA,MAGd,YAAiBhV,KAAK+K,WAAW9K,UAAYgC,IAC3C4S,EAAS,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAAQ,OAC/BA,GAAkC,MAAxBA,EAAOzI,QAAQqvD,MAI7BW,MAIJ,sBAKE,OAJGp8D,KAAKq8D,aACNr8D,KAAKq8D,YAAY16D,SAGZsB,MAAM0L,uBC7JF,MAAM,WAA2B,EAIpC,OACR3O,KAAKC,UAAUG,UAAUC,IAAI,2BAC7BL,KAAKmR,SAAS,gBAEd,CACE,MAAMsmB,EAAU,IAAI,GAAe,CACjCc,QAAS,qBAGXv4B,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAGjC,MAAMq8D,EAAS,EAAa,CAACjvD,KAAM,MAAO7D,UAAW,eACrDxJ,KAAK6N,QAAQ9D,OAAOuyD,GAEpB,YAAiBA,EAASr6D,IACxB,IAAI,GAAc,CAChB28B,UAAW,CAAC,YACZhyB,YAAa,gCACb8xB,SAAWz3B,IAET,IAAgBs1D,YAAYt1D,GAAQ,OAGvC,CAAC8G,eAAgB/N,KAAK+N,iBAEzB,MAAMnE,EAAO,GAAkBC,iBAC/B7J,KAAK+K,WAAW9K,UAAUG,UAAUC,IAAI,sBACxCL,KAAK+K,WAAWhB,OAAOH,GAEvB,MAAMvJ,EAAM,CAAC4G,EAAgB8C,KAC3B,MAAM,IAAC+B,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ5E,EACRhH,UAAW2J,EACXoC,YAAY,EACZqG,eAAe,EACfpG,WAAY,GACZlC,WAGIs6B,EAAO,IAAgBC,QAAQr9B,GAClCo9B,EAAK/sB,OAAOklD,IACb1wD,EAAIwG,gBAAgBvI,OAAO,IAAMs6B,EAAKxO,UAEnCwO,EAAKY,MAAOn5B,EAAIwG,gBAAgBrO,UAAY,IAAgBihC,gBAAgBb,EAAKY,OAC/En5B,EAAIwG,gBAAgBvI,OAAOs6B,EAAKxO,SAAW,IAAMwO,EAAKxO,SAAW,IAAgBtjB,oBAAoBtL,KAO9G,IAAI,MAAMA,KAAUjH,KAAK8R,QACvBzR,EAAI4G,GAAQ,GAGd,IAAI4N,EACJ,MAKMG,EAAUhV,KAAKq8D,YAAc,GAAW,CAAC,CAC7ChvD,KAAM,UACN6P,KAAM,UACNC,QARgB,KAChB,MAAMlW,EAAS4N,EAAOzI,QAAQnF,OAAOkgB,WACrC,IAAgBo1C,YAAYt1D,GAAQ,IAOpCjE,QAAS,CAAC+K,eAAgB/N,KAAK+N,mBAEjCiH,EAAQ7F,GAAK,4BACb6F,EAAQ5U,UAAUC,IAAI,eAEtBH,SAAS4uC,eAAe,cAAc/kC,OAAOiL,GAE7C,aAA0BhV,KAAK+K,WAAW9K,UAAYgC,IACpD4S,EAAS,OAAA4rB,GAAA,GAAUx+B,EAAE4S,OAAQ,MACzBA,IAID5S,aAAa6jB,YAAY7jB,EAAE8Y,iBAE3B9Y,aAAa6jB,aAAY7jB,EAAE8rD,cAAe,GAE7C,aAAa9rD,EAAG+S,GAChB,aAAYA,KACXhV,KAAK+N,gBAER/N,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,aAAe+gC,IAChD,MAAM,OAAC95B,EAAM,QAAEw1D,GAAW17B,EACpB/F,EAAKpxB,EAAKiG,cAAc,kBAAkB5I,OAC7Cw1D,EACGzhC,GACF36B,EAAI4G,GAAQ,GAGX+zB,GACDA,EAAGr5B,WAMT,IAAIs3B,GAAU,EACdj5B,KAAK+K,WAAWM,iBAAmB,KAC9B4tB,IAIHA,GAAU,EACV,IAAgByjC,WAAW9yD,EAAKK,kBARf,IAQ8CpJ,KAAK6K,IAClE,IAAI,MAAMzE,KAAUyE,EAAIoG,QACtBzR,EAAI4G,GAAQ,IAGXyE,EAAIoG,QAAQ3P,OAbA,IAauByH,EAAKK,oBAAsByB,EAAI/G,SACnE3E,KAAK+K,WAAWM,iBAAmB,MAGrCrL,KAAK+K,WAAWquB,qBACf/X,QAAQ,KACT4X,GAAU,MAKhB,qBACEj5B,KAAK+K,WAAW62B,WAGlB,sBAKE,OAJG5hC,KAAKq8D,aACNr8D,KAAKq8D,YAAY16D,SAGZsB,MAAM0L,uB,cCzHF,MAAM,WAAiC,EAI1C,OACR3O,KAAKC,UAAUG,UAAUC,IAAI,wBAC7BL,KAAKmR,SAAS,mBAId,CACE,MAAMsmB,EAAU,IAAI,GAAe,CAACe,aAAa,IAEjD,IAAImkC,EACJ,MAAMC,EAAkB,IAAI,GAAI,CAC9BvvD,KAAM,aACN0lB,aAAc,eACdN,gBAT0B,UAU1BhpB,UAAW,KACT,MAAM+F,EAAM,IAAI,GAAmBxP,KAAKsN,QACxCkC,EAAIsC,QAAU6qD,EACdntD,EAAIuB,UAKR,IAAI8rD,EAFJD,EAAgBrqC,SAAU,EAG1B,MAuBMuqC,EAAe,IAAI,GAvBG,CAC1BzvD,KAAM,OACN0lB,aAAc,sBACdN,gBAtB0B,UAuB1BhpB,UAAYxH,IACV,IAAIuN,EACDqtD,EAAcvlD,OAAOgjD,aACtB9qD,EAAM,IAAI,GAAuCxP,KAAKsN,QAC9CuvD,EAAcE,2BACtBvtD,EAAM,IAAI,GAA2CxP,KAAKsN,QAC1DkC,EAAIopD,MAAQiE,EAAcE,0BAC1BvtD,EAAIrN,OAAS,EACbqN,EAAImpD,SAAU,EACdG,GAAA,EAAgBO,uBAEhB7pD,EAAM,IAAI,GAA0BxP,KAAKsN,QAG3CkC,EAAIykB,MAAQ4oC,EACZrtD,EAAIuB,UAKR+rD,EAAavqC,SAAU,EAEvB,MAAMyqC,EAAoBh9D,KAAKg9D,kBAAoB,IAAI,GAAI,CACzD3vD,KAAM,iBACN0lB,aAAc,gBACdN,gBAhD0B,UAiD1BhpB,UAAW,KACT,MAAM+F,EAAM,IAAI,GAAqBxP,KAAKsN,QAC1CkC,EAAI0sD,WAAal8D,KACjBwP,EAAIssD,eAAiB97D,KAAK87D,eAC1BtsD,EAAIuB,UAGRisD,EAAkBzqC,SAAU,EAE5BkF,EAAQ5pB,QAAQ9D,OAAO6yD,EAAgB38D,UAAW68D,EAAa78D,UAAW+8D,EAAkB/8D,WAC5FD,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAE/B,MAAMg9D,EAAmBt4D,IACpBA,EACD,OAAA4H,EAAA,GAAeqwD,EAAgBlxC,SAAU,eAAK,sCAAuC,CAAC/mB,KAEtF,OAAA4H,EAAA,GAAeqwD,EAAgBlxC,SAAU,eAAK,eAAgB,CAAC/mB,MAInE3E,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,aAAc,KAM/Ck9D,MAGF,MAAMA,EAAgB,KACpB,IAAgBR,aAAa77D,KAAK6K,IAChCkxD,EAAgBrqC,SAAU,EAC1B0qC,EAAgBvxD,EAAI/G,OACpBg4D,EAAiBjxD,EAAIoG,WAIzBorD,IAEApE,GAAA,EAAgB9kC,WAAWnzB,KAAKozB,IAC9B4oC,EAAgB5oC,EAChB,OAAA1nB,EAAA,GAAeuwD,EAAapxC,SAAU,eAAKuI,EAAM3c,OAAOgjD,aAAe,6BAA+B,gCACtGwC,EAAavqC,SAAU,IAKzBvyB,KAAKm8D,uBAGP,CACE,MAAM1kC,EAAU,IAAI,GAAe,CAACnuB,KAAM,iBAE1CmuB,EAAQ5pB,QAAQzN,UAAUC,IAAI,gCAE9B,MAAM88D,EAED,GAECC,EAAsBD,EAAuC,2BAAI,IAAI,GAAI,CAC7EpqC,aAAc,oBACdN,gBA9G0B,UA+G1BhpB,UAAW,KACT,IAAI,GAAyBzJ,KAAKsN,QAAQyD,UAIxCssD,EAAkBF,EAA2C,+BAAI,IAAI,GAAI,CAC7EpqC,aAAc,gBACdN,gBAtH0B,UAuH1BhpB,UAAW,KACT,IAAI,GAAsBzJ,KAAKsN,QAAQyD,UAIrCusD,EAAqBH,EAAwC,4BAAI,IAAI,GAAI,CAC7EpqC,aAAc,2BACdN,gBA9H0B,UA+H1BhpB,UAAW,KACT,IAAI,GAA0BzJ,KAAKsN,QAAQyD,UAIzCwsD,EAAUJ,EAAqC,yBAAI,IAAI,GAAI,CAC/DpqC,aAAc,eACdN,gBAtI0B,UAuI1BhpB,UAAW,KACT,IAAI,GAAmBzJ,KAAKsN,QAAQyD,UAIlCysD,EAAiBL,EAAoC,wBAAI,IAAI,GAAI,CACrEpqC,aAAc,uBACdN,gBA9I0B,UA+I1BhpB,UAAW,KACT,IAAI,GAA6BzJ,KAAKsN,QAAQyD,UAI5C0sD,EAAmBN,EAAsC,0BAAI,IAAI,GAAI,CACzEpqC,aAAc,cACdN,gBAtJ0B,UAuJ1BhpB,UAAW,KACT,IAAI,GAAyBzJ,KAAKsN,QAAQyD,UAIxC2sD,EAAoBnvD,IACxB,MAAM2iB,EAAMisC,EAAW5uD,GACnB2iB,GAIJ,GAAkBymC,WAAWppD,GAAK1N,KAAK60D,IACrC,MAAMliD,EAAU,GAAkBokD,uBAAuBlC,GACnDthC,EAAU5gB,EAAQrQ,OAASmyD,GAAYwB,UAAY,qCAAwCtjD,EAAQrQ,OAASmyD,GAAY2B,SAAW,uCAAyC,mCAC5K0G,EAAiBnqD,EAAQgjD,cAAcV,MAAM3zD,OAASqR,EAAQgjD,cAAcR,MAAM7zD,OAClFy7D,EAAcpqD,EAAQ+iD,WAAWT,MAAM3zD,OAASqR,EAAQ+iD,WAAWP,MAAM7zD,OAE/E+uB,EAAIxF,SAASznB,UAAY,GACzB,MAAM4R,EAAI,eAAKue,GACflD,EAAIxF,SAAS3hB,OAAO8L,IACjB8nD,GAAkBC,IACnB1sC,EAAIxF,SAAS3hB,OAAO,KAAK,EAAE4zD,EAAgBC,EAAc,IAAMA,EAAc,GAAGh2D,OAAOc,SAASse,KAAK,aAK3GyQ,EAAQ5pB,QAAQ9D,OAAOqzD,EAAoBn9D,UAAWo9D,EAAgBp9D,UAAWq9D,EAAmBr9D,UAAWs9D,EAAQt9D,UAAWu9D,EAAev9D,UAAWw9D,EAAiBx9D,WAC7KD,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAE/B,IAAI,MAAMsO,KAAO4uD,EACfO,EAAiBnvD,GAGnB3F,EAAA,QAAU5H,iBAAiB,iBAAmB+/B,IAC5C28B,EAAiB,YAAqB38B,EAAOxyB,IAAInH,MAIrD,MAAMq2B,EAA2B,GACjC,CACE,MAAMhG,EAAU,IAAI,GAAe,CAACnuB,KAAM,6BAC1CmuB,EAAQx3B,UAAUG,UAAUC,IAAI,QAEhCo9B,EAAS93B,KAAK,KAAWowB,UAAU,8BAA8Bl1B,KAAKu9B,IACpE,IAAIA,EAAS9mB,OAAOumD,qBAClB,OAGF,MAAM7jD,EAAUokB,EAAS9mB,OAAOwmD,kBAE1BC,EAAe,IAAI,GAAI,CAC3B3gD,cAAe,IAAI,KAAc,CAACF,KAAM,mCAAoCS,QAAS3D,IACrFyY,gBAAiB,mCACjBK,oBAAoB,IAGtB2E,EAAQ5pB,QAAQ9D,OAAOg0D,EAAa99D,WACpCw3B,EAAQx3B,UAAUG,UAAUuB,OAAO,QAEnC3B,KAAKwO,cAAcxN,iBAAiB,UAAW,KAC7C,MAAMg9D,EAAWD,EAAa3gD,cAAcO,QAC1BqgD,IAAahkD,GAK/B,KAAW+b,UAAU,6BAA8B,CACjD+nC,kBAAmBE,KAEpB,CAACrmD,MAAM,OAGZ3X,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAGjC,CACE,MAAMw3B,EAAU,IAAI,GAAe,CAACnuB,KAAM,gBAEpCukD,EAAgB,KACN,IAAI,GAAU,sBAAuB,CACjDjwC,QAAS,CAAC,CACRwW,QAAS,SACTiD,SAAU,KACR,MAAM/qB,EAAS,OAAA+rB,GAAA,GAAiB,CAAC4lC,IAAe,GAChD,KAAiBC,iBAAiBr9D,KAAK,KACrCyL,OAGJg2B,UAAU,IAEZvP,aAAc,6BACd+D,mBAAoB,0BAGhBrY,QAGFw/C,EAAe,YAAO,8BAA+B,CAAC5wD,KAAM,SAAU6P,KAAM,6BAClFld,KAAK+N,eAAe1N,IAAI49D,EAAxBj+D,CAAsC,QAAS6tD,GAC/Cp2B,EAAQ5pB,QAAQ9D,OAAOk0D,GAcvBj+D,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAGjC,OAAO4C,QAAQC,IAAI26B,GAGd,uBACL,KAAW1H,UAAU,6BAA6Bl1B,KAAKs9D,IACrDn+D,KAAKg9D,kBAAkBzqC,SAAU,EACjCvyB,KAAK87D,eAAiBqC,EAAMrC,eAC5B,gBAAM97D,KAAKg9D,kBAAkBtxC,SAAU,kBAAmB,CAAC1rB,KAAK87D,eAAe35D,YC1S9E,SAASi8D,GAAWn/C,EAAWo/C,EAAW91D,EAAWD,EAAY,GACtE2W,GAAK,IAAKo/C,GAAK,IAAK91D,GAAK,IACzB,MAAMzG,EAAMO,KAAKP,IAAImd,EAAGo/C,EAAG91D,GACrBjG,EAAMD,KAAKC,IAAI2c,EAAGo/C,EAAG91D,GAC3B,IAAIgQ,EAAG1C,EAAGyoD,GAAKx8D,EAAMQ,GAAO,EAE5B,GAAGR,IAAQQ,EACTiW,EAAI1C,EAAI,MACH,CACL,IAAI0K,EAAIze,EAAMQ,EAEd,OADAuT,EAAIyoD,EAAI,GAAM/9C,GAAK,EAAIze,EAAMQ,GAAOie,GAAKze,EAAMQ,GACvCR,GACN,KAAKmd,EACH1G,GAAK8lD,EAAI91D,GAAKgY,GAAK89C,EAAI91D,EAAI,EAAI,GAC/B,MACF,KAAK81D,EACH9lD,GAAKhQ,EAAI0W,GAAKsB,EAAI,EAClB,MACF,KAAKhY,EACHgQ,GAAK0G,EAAIo/C,GAAK99C,EAAI,EAGtBhI,GAAK,EAGP,MAAO,CACLA,EAAO,IAAJA,EACH1C,EAAO,IAAJA,EACHyoD,EAAO,IAAJA,EACHh2D,KAgBG,SAASi2D,GAAWhmD,EAAW1C,EAAWyoD,EAAWh2D,GAE1D,IAAI2W,EAAWo/C,EAAW91D,EAE1B,GAHAgQ,GAAK,IAAe+lD,GAAK,IAGhB,KAHCzoD,GAAK,KAIboJ,EAAIo/C,EAAI91D,EAAI+1D,MACP,CACL,MAAME,EAAU,SAAiBxnC,EAAWqG,EAAW3sB,GAGrD,OAFGA,EAAI,IAAGA,GAAK,GACZA,EAAI,IAAGA,GAAK,GACZA,EAAI,EAAE,EAAUsmB,EAAc,GAATqG,EAAIrG,GAAStmB,EAClCA,EAAI,GAAY2sB,EAChB3sB,EAAI,EAAE,EAAUsmB,GAAKqG,EAAIrG,IAAM,EAAE,EAAItmB,GAAK,EACtCsmB,GAGHqG,EAAIihC,EAAI,GAAMA,GAAK,EAAIzoD,GAAKyoD,EAAIzoD,EAAIyoD,EAAIzoD,EACxCmhB,EAAI,EAAIsnC,EAAIjhC,EAClBpe,EAAIu/C,EAAQxnC,EAAGqG,EAAG9kB,EAAI,EAAE,GACxB8lD,EAAIG,EAAQxnC,EAAGqG,EAAG9kB,GAClBhQ,EAAIi2D,EAAQxnC,EAAGqG,EAAG9kB,EAAI,EAAE,GAG1B,MAAO,CAAClW,KAAKE,MAAU,IAAJ0c,GAAU5c,KAAKE,MAAU,IAAJ87D,GAAUh8D,KAAKE,MAAU,IAAJgG,GAAUlG,KAAKE,MAAU,IAAJ+F,IAiB7E,SAASm2D,GAAWC,GACzB,MAAMp6D,EAAiB,GAEvB,GAAmB,IAAhBo6D,EAAKv8D,OACN,IAAI,IAAI6I,EAFK,EAEOA,EAAI0zD,EAAKv8D,SAAU6I,EACrC1G,EAAIqB,KAAKg5D,SAASD,EAAK1zD,GAAK0zD,EAAK1zD,GAAI,UAElC,GAAmB,IAAhB0zD,EAAKv8D,OAAyB,CACtC,IAAI,IAAI6I,EANK,EAMOA,EAAK0zD,EAAKv8D,OAAS,IAAM6I,EAC3C1G,EAAIqB,KAAKg5D,SAASD,EAAK1zD,GAAK0zD,EAAK1zD,GAAI,KAGvC1G,EAAIqB,KAAKg5D,SAASD,EAAKA,EAAKv8D,OAAS,GAAI,UAEzC,IAAI,IAAI6I,EAZK,EAYOA,EAAI0zD,EAAKv8D,OAAQ6I,GAAK,EACxC1G,EAAIqB,KAAKg5D,SAASD,EAAKj7D,MAAMuH,EAAGA,EAAI,GAAI,KAI5C,OAAO1G,EAYF,SAASs6D,GAAWC,GACzB,MAAO,IAAMA,EAAKp2D,IAAI82B,IAAM,IAAMA,EAAEkoB,SAAS,KAAKhkD,OAAO,IAAIujB,KAAK,IAG7D,SAAS83C,GAAiBC,GAC/B,OAAOH,GAlDF,SAA0BG,GAC/B,MAAM/G,EAAW+G,EAAKt7D,MAAM,GAAI,GAAGu8C,MAAM,MACnCgf,GAAShH,EAAStyD,MAClBpB,EAAM0zD,EAASvvD,IAAKw2D,GACrBA,EAAIC,SAAS,MACND,EAAIx7D,MAAM,GAAI,IAGhBw7D,GAGV,OAAOV,GAAWj6D,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAI06D,GAuCxBG,CAAiBJ,ICzItB,SAASK,GAAmBP,GACzC,IAAI,EAACtmD,EAAC,EAAE1C,EAAC,EAAEyoD,GAAKF,GAAWS,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAC/ChpD,EAAI,IACLA,EAAIxT,KAAKC,IAAI,IAAKuT,EAAI,EAAI,IAAO,IAAMA,KAEzCyoD,EAAIj8D,KAAKP,IAAI,EAAO,IAAJw8D,GAGhB,MADa,QAAQ/lD,MAAM1C,OAAOyoD,U,cCKrB,MAAM,GAyBnB,cAhBO,KAAAe,IAAM,EACN,KAAAC,WAAa,IACb,KAAAC,UAAY,GACZ,KAAAP,MAAQ,EACP,KAAA/3C,SAOJ,GAoGI,KAAAu4C,YAAc,KACpBt/D,SAASuvC,gBAAgB9sC,MAAM0jC,OAASrmC,KAAKinB,SAASw4C,WAAW98D,MAAM0jC,OAAS,YAG1E,KAAAq5B,UAAY,KAClBx/D,SAASuvC,gBAAgB9sC,MAAM0jC,OAASrmC,KAAKinB,SAASw4C,WAAW98D,MAAM0jC,OAAS,IAnGhFrmC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,GAAYsnC,YAEzC,MAAM3jC,EAAO,uBACG,GAAY2jC,WAAa,g+BAgBvB,GAAYA,WAAa,cAAc,GAAYA,WAAa,mKAIlE,GAAYA,WAAa,qCACvB,GAAYA,WAAa,6tBAavB,GAAYA,WAAa,cAAc,GAAYA,WAAa,mLAOpF3nC,KAAKC,UAAUgE,UAAYD,EAE3BhE,KAAKinB,SAAS04C,IAAM3/D,KAAKC,UAAUygB,kBACnC1gB,KAAKinB,SAASw4C,WAAaz/D,KAAKinB,SAAS04C,IAAIvuB,iBAC7CpxC,KAAKinB,SAASq4C,WAAat/D,KAAKinB,SAAS04C,IAAIj/C,kBAAkBA,kBAE/D1gB,KAAKinB,SAAS24C,QAAU5/D,KAAKinB,SAAS04C,IAAIpoC,mBAE1Cv3B,KAAKinB,SAASo4C,IAAMr/D,KAAKinB,SAAS24C,QAAQl/C,kBAC1C1gB,KAAKinB,SAAS44C,WAAa7/D,KAAKinB,SAASo4C,IAAIjuB,iBAE7CpxC,KAAK8/D,cAAgB,IAAI,IAAW,CAAC58D,WAAW,EAAMsO,MAAO,yBAC7DxR,KAAK+/D,cAAgB,IAAI,IAAW,CAAC78D,WAAW,EAAMsO,MAAO,yBAE7D,MAAMwuD,EAAS9/D,SAASC,cAAc,OACtC6/D,EAAOx2D,UAAY,GAAYm+B,WAAa,UAC5Cq4B,EAAOj2D,OAAO/J,KAAK8/D,cAAc7/D,UAAWD,KAAK+/D,cAAc9/D,WAC/DD,KAAKC,UAAU8J,OAAOi2D,GAEtBhgE,KAAK8/D,cAAc/9D,MAAMf,iBAAiB,QAAS,KACjD,IAAIkB,EAAQlC,KAAK8/D,cAAc59D,MAAMsB,QAAQ,KAAM,IAAIC,MAAM,EAAG,GAEhE,MAAMmP,EAAQ1Q,EAAM0Q,MAAM,iBACpBqtD,EAAQrtD,GAASA,EAAM,GAAGzQ,SAAWD,EAAMC,QAAU,CAAa,GAAG43B,SAAS73B,EAAMC,QAC1FnC,KAAK8/D,cAAcvqC,SAAS0qC,EAAQ,IAAWzqC,QAAU,IAAW1K,OAEpE5oB,EAAQ,IAAMA,EACdlC,KAAK8/D,cAAcp8D,iBAAiBxB,GAEjC+9D,GACDjgE,KAAKkgE,SAASh+D,GAAO,GAAO,KAKhC,MAAMi+D,EAAY,wHAClBngE,KAAK+/D,cAAch+D,MAAMf,iBAAiB,QAAS,KACjD,MAAM4R,EAAQ5S,KAAK+/D,cAAc79D,MAAM0Q,MAAMutD,GAC7CngE,KAAK+/D,cAAcxqC,SAAS3iB,EAAQ,IAAW4iB,QAAU,IAAW1K,OAEjElY,GACD5S,KAAKkgE,SAAS9B,IAAYxrD,EAAM,IAAKA,EAAM,IAAKA,EAAM,KAAK,GAAM,KAIrE5S,KAAKogE,qBACLpgE,KAAKqgE,qBAWC,qBACNpmD,GAAoBja,KAAKinB,SAAS04C,IAAY,KAC5C3/D,KAAKw/D,cACLx/D,KAAKsgE,QAAUtgE,KAAKinB,SAAS04C,IAAI7jD,yBAE/ByoC,IACFvkD,KAAKugE,kBAAkBhc,EAAIhqC,EAAGgqC,EAAI9pC,IACjC,KACDza,KAAK0/D,cAID,qBACNzlD,GAAoBja,KAAKinB,SAASo4C,IAAY,KAC5Cr/D,KAAKw/D,cACLx/D,KAAKwgE,QAAUxgE,KAAKinB,SAASo4C,IAAIvjD,yBAE/ByoC,IACFvkD,KAAKygE,WAAWlc,EAAIhqC,IACnB,KACDva,KAAK0/D,cAIF,SAAS9qB,EAA2B8rB,GAAiB,EAAMC,GAAiB,GACjF,QAAaj8D,IAAVkwC,EACDA,EAAQ,CACNr8B,EAAG,EACH1C,EAAG,IACHyoD,EAAG,GACHh2D,EAAG,QAEA,GAAqB,iBAAZ,EACd,GAAgB,MAAbssC,EAAM,GACPA,EF/CD,SAAoB8pB,GACzB,MAAMG,EAAOJ,GAAWC,GACxB,OAAON,GAAWS,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IE6CpC+B,CAAWhsB,OACd,CACL,MAAMisB,EAAMjsB,EAAMhiC,MAAM,YACxBgiC,EAAQwpB,IAAYyC,EAAI,IAAKA,EAAI,IAAKA,EAAI,QAAen8D,IAAXm8D,EAAI,GAAmB,GAAKA,EAAI,IAKlF7gE,KAAKsgE,QAAUtgE,KAAKinB,SAAS04C,IAAI7jD,wBAEjC,MAAMglD,EAAO9gE,KAAKsgE,QAAQ5/D,MAAQ,IAAMk0C,EAAM/+B,EACxCkrD,EAAW,IAAOnsB,EAAM0pB,GAAK,IAAM1pB,EAAM/+B,EAAI,GAAM,IACnDmrD,EAAOhhE,KAAKsgE,QAAQ3/D,OAAS,IAAMogE,EAEzC/gE,KAAKugE,kBAAkBvgE,KAAKsgE,QAAQvjD,KAAO+jD,EAAM9gE,KAAKsgE,QAAQ9sC,IAAMwtC,GAAM,GAG1EhhE,KAAKwgE,QAAUxgE,KAAKinB,SAASo4C,IAAIvjD,wBAEjC,MAAMmlD,EAAarsB,EAAMr8B,EAAI,IACvB2oD,EAAOlhE,KAAKwgE,QAAQzjD,KAAO/c,KAAKwgE,QAAQ9/D,MAAQugE,EAEtDjhE,KAAKygE,WAAWS,GAAM,GAGtBlhE,KAAKq/D,IAAMzqB,EAAMr8B,EACjBvY,KAAKs/D,WAAa1qB,EAAM/+B,EACxB7V,KAAKu/D,UAAY3qB,EAAM0pB,EACvBt+D,KAAKg/D,MAAQpqB,EAAMtsC,EAEnBtI,KAAKmhE,aAAaT,EAAgBC,GAG7B,kBACL,MAAMS,EAAY7C,GAAWv+D,KAAKq/D,IAAKr/D,KAAKs/D,WAAYt/D,KAAKu/D,UAAWv/D,KAAKg/D,OACvEN,EAAOE,GAAWwC,GAClBC,EAAM3C,EAAKj7D,MAAM,GAAI,GAE3B,MAAO,CACL69D,IAAK,OAAOthE,KAAKq/D,QAAQr/D,KAAKs/D,gBAAgBt/D,KAAKu/D,cACnDsB,IAAK,OAAOO,EAAU,OAAOA,EAAU,OAAOA,EAAU,MACxDC,IAAKA,EACLtC,KAAM,QAAQ/+D,KAAKq/D,QAAQr/D,KAAKs/D,gBAAgBt/D,KAAKu/D,eAAev/D,KAAKg/D,SACzEH,KAAM,QAAQuC,EAAU,OAAOA,EAAU,OAAOA,EAAU,OAAOA,EAAU,MAC3E1C,KAAMA,EACN0C,UAAWA,GAIR,aAAaV,GAAiB,EAAMC,GAAiB,GAC1D,MAAM/rB,EAAQ50C,KAAKuhE,kBACnBvhE,KAAKinB,SAASw4C,WAAW37C,eAAe,KAAM,OAAQ8wB,EAAMysB,KAEzDX,IACD1gE,KAAK8/D,cAAcp8D,iBAAiBkxC,EAAMysB,KAC1CrhE,KAAK8/D,cAAcvqC,SAAS,IAAWC,UAGtCmrC,IACD3gE,KAAK+/D,cAAcr8D,iBAAiBkxC,EAAMwsB,UAAU39D,MAAM,GAAI,GAAGujB,KAAK,OACtEhnB,KAAK+/D,cAAcxqC,SAAS,IAAWC,UAGtCx1B,KAAKmL,UACNnL,KAAKmL,SAASypC,GAIV,WAAWp6B,EAAeumB,GAAS,GACzC,MAEMrkB,EAFS,YAAMlC,EAAQxa,KAAKwgE,QAAQzjD,KAAM,EAAG/c,KAAKwgE,QAAQ9/D,OAEtCV,KAAKwgE,QAAQ9/D,MACvCV,KAAKq/D,IAAMh9D,KAAKE,MAAM,IAAMma,GAE5B,MAAMqiD,EAAO,QAAQ/+D,KAAKq/D,mBAAmBr/D,KAAKg/D,SAElDh/D,KAAKinB,SAAS44C,WAAW/7C,eAAe,KAAM,IAAiB,IAAXpH,EAAkB,KACtE1c,KAAKinB,SAAS44C,WAAW/7C,eAAe,KAAM,OAAQi7C,GAEtD/+D,KAAKinB,SAASq4C,WAAWluB,iBAAiBttB,eAAe,KAAM,aAAci7C,GAE1Eh+B,GACD/gC,KAAKmhE,eAID,kBAAkB3mD,EAAeE,EAAeqmB,GAAS,GAC/D,MAAMygC,EAAOxhE,KAAKsgE,QAAQ5/D,MACpB+gE,EAAOzhE,KAAKsgE,QAAQ3/D,OAKpB+gE,EAHS,YAAMlnD,EAAQxa,KAAKsgE,QAAQvjD,KAAM,EAAGykD,GAG7BA,EAAO,IACvBG,EAHS,YAAMjnD,EAAQ1a,KAAKsgE,QAAQ9sC,IAAK,EAAGiuC,GAG5BA,EAAO,IAEvBhC,EAAaz/D,KAAKinB,SAASw4C,WACjCA,EAAW37C,eAAe,KAAM,IAAK49C,EAAO,KAC5CjC,EAAW37C,eAAe,KAAM,IAAK69C,EAAO,KAE5C,MAAMrC,EAAa,YAAMoC,EAAM,EAAG,KAE5BE,EAAa,IAAMtC,EAAa,EAChCuC,EAAa,IAAM,YAAMF,EAAM,EAAG,KAElCpC,EAAY,YAAMsC,EAAa,IAAMD,EAAY,EAAG,KAE1D5hE,KAAKs/D,WAAaA,EAClBt/D,KAAKu/D,UAAYA,EAEdx+B,GACD/gC,KAAKmhE,gBAhRM,GAAAx5B,WAAa,eCEf,MAAM,WAA8B,EAAnD,c,oBAuFU,KAAAm6B,YAAc,CAACT,EAAaU,GAAoB,KACtD,GAAGA,EACD/hE,KAAKgiE,YAAY9B,SAASmB,OACrB,CACL,MAAMxC,EAAOJ,GAAW4C,GAClBY,EAAajiE,KAAKkiE,MAAMD,WACxBlD,EAAOK,GAAmBP,GAEhCoD,EAAWrtB,MAAQysB,EAAI3lB,cACvBumB,EAAW9+D,KAAO,QAClB8+D,EAAW7C,mBAAqBL,EAChChrC,EAAA,QAAgBouC,YAAY,WAAYv5D,EAAA,QAAUw1B,UAElD,GAAagkC,uBAAkB19D,OAAWA,GAAW,GACrD1E,KAAKkK,cAID,KAAAm4D,cAAiBztB,IACvB50C,KAAKsiE,WAAW1tB,EAAMysB,KAAK,IApG7B,OACErhE,KAAKC,UAAUG,UAAUC,IAAI,uBAAwB,8BACrDL,KAAKmR,SAAS,YAEdnR,KAAKkiE,MAAQt5D,EAAA,QAAU25D,WAEvB,MAAM9qC,EAAU,IAAI,GAAe,IACnCz3B,KAAKgiE,YAAc,IAAI,GAEvBvqC,EAAQ5pB,QAAQ9D,OAAO/J,KAAKgiE,YAAY/hE,WAExCD,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAE/B,MAAMuiE,EAAOxiE,KAAKwiE,KAAOtiE,SAASC,cAAc,OAChDqiE,EAAKpiE,UAAUC,IAAI,QAEJ,CACb,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGKiG,QAAQsuC,IACb,MAAMnvC,EAAOvF,SAASC,cAAc,OACpCsF,EAAKrF,UAAUC,IAAI,aACnBoF,EAAK2G,QAAQwoC,MAAQA,EAAM8G,cAG3B,MAAM5oC,EAAQ5S,SAASC,cAAc,OACrC2S,EAAM1S,UAAUC,IAAI,mBACpByS,EAAMnQ,MAAM8/D,gBAAkB7tB,EAE9BnvC,EAAKsE,OAAO+I,GACZ0vD,EAAKz4D,OAAOtE,KAGd,YAAiB+8D,EAAOvgE,IACtB,MAAM4S,EAAS,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAAQ,aACzC,IAAIA,GAAUA,EAAOzU,UAAUuR,SAAS,UACtC,OAGF,MAAMijC,EAAQ//B,EAAOzI,QAAQwoC,MACzBA,GAIJ50C,KAAKsiE,WAAW1tB,IACf,CAAC7mC,eAAgB/N,KAAK+N,iBAEzB/N,KAAK+K,WAAWhB,OAAOy4D,GAEvBxiE,KAAKsiE,WAAa,OAAAI,GAAA,GAAS1iE,KAAK8hE,YAAa,IAAI,GAG3C,YACN,MAAMnyB,EAAS3vC,KAAKwiE,KAAK3yD,cAAc,WACjCoyD,EAAajiE,KAAKkiE,MAAMD,WACxBptD,EAA6B,UAApBotD,EAAW9+D,KAAmBnD,KAAKwiE,KAAK3yD,cAAc,0BAA0BoyD,EAAWrtB,WAAa,KACpHjF,IAAW96B,IAIX86B,GACDA,EAAOvvC,UAAUuB,OAAO,UAGvBkT,GACDA,EAAOzU,UAAUC,IAAI,WA0BzB,SACEmL,WAAW,KACT,MAAMy2D,EAAajiE,KAAKkiE,MAAMD,WAGP,UAApBA,EAAW9+D,OACZnD,KAAKgiE,YAAY72D,SAAWnL,KAAKqiE,eAGnCriE,KAAKgiE,YAAY9B,SAAS+B,EAAWrtB,OAAS,WAEvB,UAApBqtB,EAAW9+D,OACZnD,KAAKgiE,YAAY72D,SAAWnL,KAAKqiE,gBAElC,GAGL,sBAIE,OAHAriE,KAAKgiE,YAAY72D,cAAWzG,EAC5B1E,KAAKgiE,iBAAct9D,EAEZzB,MAAM0L,uBCrHjB,IAAIg0D,GAAe,EAEJ,MAAM,WAAyB,EAA9C,c,oBAEU,KAAA9mC,OAAS,EAET,KAAA+mC,QAAsB,IAAI/+D,IAgE1B,KAAAg/D,cAAgB,KACtB,aAAY,oCAAoChiE,KAAKiiE,IACnD,MAAM3zD,EAAK,uBAAwBwzD,GAE7Bz4C,EAAQ,CACZ9iB,EAAG,YACHmR,EAAG,EACHV,EAAG,EACHijC,SAAU,GACVh7C,KAAMgjE,EAAKhjE,KACXqD,KAAM,QAER,IAAIjD,EAAuB,CACzBkH,EAAG,WACH6zC,YAAa,GACb/hC,WAAY,GACZ6pD,MAAO,EACPC,eAAgB,GAChB7zD,KACA0uC,UAAWilB,EAAK3/D,KAChBrD,KAAMgjE,EAAKhjE,KACXqoB,KAAMssB,KAAKC,MAAQ,IACnBp9B,OAAQ,GACRc,OAAQ,CAAC8R,GACT/Q,UAAW2pD,EAAKx5D,MAGlBpJ,EAAW,IAAeu4C,QAAQv4C,GAElC,MAAMoU,EAAeC,GAAA,EAAmBC,gBAAgBtU,GACxDoU,EAAa0qC,WAAa8jB,EAAKhjE,KAC/BwU,EAAaI,IAAMyuC,IAAIC,gBAAgB0f,GAEvC,IAAIG,EAAiC,CACnC77D,EAAG,YACH6zC,YAAa,GACb/6C,SAAUA,EACViP,KACA+zD,KAAM/zD,EACNmI,OAAQ,IAGV,MAAM6rD,EAAS5uD,GAAA,EAAmB4uD,OAAOL,EAAMA,EAAKx5D,MAE9CsO,EAAW,eACjBA,EAASwrD,kBAAoBD,EAAOC,kBACpCxrD,EAASiT,OAASs4C,EAAOt4C,OAEzBs4C,EAAOtiE,KAAKoR,IACV,KAAW8jB,UAAU,0BAA2B,CAC9C+sC,KAAM7wD,EACN4rC,UAAWilB,EAAK3/D,KAChBi7B,SAAU,CACRh3B,EAAG,uBAEJvG,KAAKwiE,IACN,MAAMC,EAAUD,EAAmCnjE,SAC7CqjE,EAAkBhvD,GAAA,EAAmBC,gBAAgB8uD,GAC3DtsD,OAAOsjC,OAAOipB,EAAiBjvD,GAE/B2uD,EAAYI,EACZJ,EAAU/iE,SAAW,IAAeu4C,QAAQwqB,EAAU/iE,UAEtDD,EAAUmM,QAAQ+H,MAAQ,GAAK8uD,EAAU/iE,SAASiP,GAClDlP,EAAUmM,QAAQ82D,KAAOD,EAAUC,KAEnCljE,KAAKwjE,sBAAsBP,EAAUC,KAAMD,EAAU/iE,UAAUW,KAAK+W,EAAS3R,QAAS2R,EAASmT,SAC9FnT,EAASmT,SACXnT,EAASmT,QAEZnT,EAAS/W,KAAK,KACZb,KAAK4iE,QAAQv0D,OAAO40D,EAAU/iE,SAASiP,KACrC1C,IACFxM,EAAU0B,WAIZ,MAAMwkB,EAAY,IAAI,KAAqB,CACzC44B,UAAU,EACV34B,YAAY,EACZF,gBAAgB,IAGZjmB,EAAYD,KAAKyjE,aAAaR,GAAW,GAC/CjjE,KAAK4iE,QAAQviE,IAAI4iE,EAAU/iE,SAASiP,IAEpCgX,EAAUkE,OAAOpqB,GAAW,EAAO2X,MAI/B,KAAA8rD,aAAe,KACrB,MAAMC,EAAe,aAAWvlC,SAASwlC,OAAOnzD,KAAKC,GAAKA,EAAEpH,OAAStJ,KAAKkiE,MAAM54D,MAC7Eq6D,MACC3jE,KAAK67B,OACP77B,KAAKkiE,MAAMD,WAAa,YAAK0B,EAAa1B,YAC1CluC,EAAA,QAAgBouC,YAAY,WAAYv5D,EAAA,QAAUw1B,UAClD,GAAagkC,uBAAkB19D,OAAWA,GAAW,GACrD1E,KAAK6jE,kBAAkBngE,iBAAiB1D,KAAKkiE,MAAMD,WAAW6B,QA6C1D,KAAAC,YAAe9hE,IACrB,MAAM4S,EAAS,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAAQ,aACzC,IAAIA,EAAQ,OAEZ,MAAM,MAACV,EAAK,KAAE+uD,GAAQruD,EAAOzI,QAC7B,GAAGpM,KAAK4iE,QAAQj7D,IAAIwM,GAAQ,OAC5BnU,KAAK4iE,QAAQviE,IAAI8T,GAEjB,MAAMgS,EAAY,IAAI,KAAqB,CACzCC,YAAY,EACZF,gBAAgB,IAGZjS,EAAM,IAAeC,OAAOC,GAE5BrO,EAAO,KACX,MAAMK,EAAUnG,KAAKwjE,sBAAsBN,EAAMjvD,GAC5BM,GAAA,EAAmBC,gBAAgBP,GACvCS,MAAO1U,KAAKkiE,MAAMD,WAAW6B,MAC5C39C,EAAUkE,OAAOxV,GAAQ,EAAM1O,IAInCggB,EAAUE,YAEV,YAAiBxR,EAAS5S,IACrBkkB,EAAUA,UAAUrV,eACrBqV,EAAUhJ,QAAQlb,GAClBkkB,EAAUg5B,UAEVr5C,KAED,CAACiI,eAAgB/N,KAAK+N,iBAEzBjI,KAKM,KAAAk+D,YAAc,CAACd,EAAcxuD,KACnCuvD,MAAMvvD,GAAK7T,KAAKqjE,IACd3vD,GAAA,EAAmB4vD,aAAa3jB,KAAK,eAAiB0iB,EAAMgB,MAIxD,KAAAV,sBAAwB,CAACN,EAAcjvD,KAC7C,IAAImwD,IAAYpkE,KAAK67B,OACrB,MAAM5P,EAAa,IAAMm4C,IAAYpkE,KAAK67B,OAEpC5Q,EAAW,IAAelT,YAAY9D,EAAK,GAAamY,KAAKC,QAAU,GAAaD,KAAKC,QAAQrC,cAAc01B,QAAU,GAEzH9nC,EAAW,eAkDjB,OAjDAA,EAASwrD,kBAAoBn4C,EAASm4C,kBACtCxrD,EAASiT,OAASI,EAASJ,OAE3BI,EAASpqB,KAAK,KACZ,IAAIorB,IAEF,YADArU,EAAS3R,UAIX,MAAMg8D,EAAajiE,KAAKkiE,MAAMD,WACxBoC,EAAW3vD,ICzSK,CAAC4vD,IAC3B,MAAMl6C,EAAMlqB,SAASC,cAAc,OACnC,OAAO,IAAI0C,QAA4BoD,IACrC,OAAA05C,GAAA,GAAmBv1B,EAAKk6C,EAAU,KAChC,MAAM5hE,EAASxC,SAASC,cAAc,UAChCmvB,EAAQlF,EAAIm6C,aAAen6C,EAAIo6C,cAExB,IAAVl1C,GACD5sB,EAAOhC,MAFU,GAGjBgC,EAAO/B,OAAS+B,EAAOhC,MAAQ4uB,GACvBA,EAAQ,GAChB5sB,EAAO/B,OALU,GAMjB+B,EAAOhC,MAAQgC,EAAO/B,OAAS2uB,GAE/B5sB,EAAOhC,MAAQgC,EAAO/B,OARL,GAWnB,MAAMuI,EAAUxG,EAAOsO,WAAW,MAClC9H,EAAQq1C,UAAUn0B,EAAK,EAAG,EAAGA,EAAIm6C,aAAcn6C,EAAIo6C,cAAe,EAAG,EAAG9hE,EAAOhC,MAAOgC,EAAO/B,QAE7F,MAAM8jE,EAAQ,IAAIt8D,MAAM,GAAGqjB,KAAK,GAC1Bk5C,EAASx7D,EAAQy7D,aAAa,EAAG,EAAGjiE,EAAOhC,MAAOgC,EAAO/B,QAAQikE,KACvE,IAAI,IAAI55D,EAAI,EAAGA,EAAI05D,EAAOviE,OAAQ6I,GAAK,EACrCy5D,EAAM,IAAMC,EAAO15D,GACnBy5D,EAAM,IAAMC,EAAO15D,EAAI,GACvBy5D,EAAM,IAAMC,EAAO15D,EAAI,GACvBy5D,EAAM,IAAMC,EAAO15D,EAAI,GAGzB,MAAM65D,EAAeH,EAAOviE,OAAS,EAC/B2iE,EAAW,IAAIC,kBAAkB,GACvCD,EAAS,GAAKL,EAAM,GAAKI,EACzBC,EAAS,GAAKL,EAAM,GAAKI,EACzBC,EAAS,GAAKL,EAAM,GAAKI,EACzBC,EAAS,GAAKL,EAAM,GAAKI,EACzB5+D,EAAQ6+D,QDwQNE,CAAatwD,GAAK7T,KAAK4jE,IACrB,IAAIx4C,IAEF,YADArU,EAAS3R,UAIX,MAAM84D,EAAOK,GAAmBj3D,MAAMC,KAAKq8D,IAG3CxC,EAAWiB,KAAOA,EAClBjB,EAAW9+D,KAAO,QAClB8+D,EAAW7C,mBAAqBL,EAChChrC,EAAA,QAAgBouC,YAAY,WAAYv5D,EAAA,QAAUw1B,UAElDp+B,KAAKgkE,YAAYd,EAAMxuD,GACvB,GAAa0tD,kBAAkBc,EAAMxuD,GAAK7T,KAAK+W,EAAS3R,YAItDqO,EAAeC,GAAA,EAAmBC,gBAAgBP,GACrDguD,EAAW6B,KACZt4D,WAAW,KACT,aAAK8I,EAAaI,IAAK,GAAI,GAC1B7T,KAAK6T,IACAuX,IAKJo4C,EAAQ3vD,GAJNkD,EAAS3R,aAMZ,KAEHo+D,EAAQ/vD,EAAaI,OAIlBkD,GAGD,KAAA1N,UAAY,KAClB,MAAMylC,EAAS3vC,KAAKwiE,KAAK3yD,cAAc,WACjCoyD,EAAajiE,KAAKkiE,MAAMD,WACxBptD,EAA6B,UAApBotD,EAAW9+D,KAAmBnD,KAAKwiE,KAAK3yD,cAAc,yBAAyBoyD,EAAWiB,UAAY,KAClHvzB,IAAW96B,IAIX86B,GACDA,EAAOvvC,UAAUuB,OAAO,UAGvBkT,GACDA,EAAOzU,UAAUC,IAAI,YAhUzB,OACEL,KAAKC,UAAUG,UAAUC,IAAI,uBAAwB,8BACrDL,KAAKmR,SAAS,kBAEdnR,KAAKkiE,MAAQt5D,EAAA,QAAU25D,WAEvB,CACE,MAAMtiE,EAAYm3D,GAAgBp3D,KAAK+K,YAEjCk6D,EAAe,YAAO,8BAA+B,CAAC53D,KAAM,YAAa6P,KAAM,mCAC/EgoD,EAAc,YAAO,8BAA+B,CAAC73D,KAAM,WAAY6P,KAAM,aAC7EioD,EAAc,YAAO,8BAA+B,CAAC93D,KAAM,aAAc6P,KAAM,qBAErF,YAAiB+nD,EAAcjlE,KAAK6iE,cAAe,CAAC90D,eAAgB/N,KAAK+N,iBAEzE,YAAiBm3D,EAAa,KAC5B,IAAI,GAAsBllE,KAAKsN,QAAQyD,QACtC,CAAChD,eAAgB/N,KAAK+N,iBAEzB,YAAiBo3D,EAAanlE,KAAK0jE,aAAc,CAAC31D,eAAgB/N,KAAK+N,iBAEvE,MAAM81D,EAAoB7jE,KAAK6jE,kBAAoB,IAAI,KAAc,CACnE3mD,KAAM,sBACN5T,KAAM,OACNqU,QAAS3d,KAAKkiE,MAAMD,WAAW6B,KAC/B1sC,YAAY,IAGdp3B,KAAK+N,eAAe1N,IAAIwjE,EAAkB9hE,MAA1C/B,CAAiD,SAAU,KACzDA,KAAKkiE,MAAMD,WAAW6B,KAAOD,EAAkB9hE,MAAM4b,QACrDoW,EAAA,QAAgBouC,YAAY,WAAYv5D,EAAA,QAAUw1B,UAElD,MAAMuR,EAAS6yB,EAAK3yD,cAAc,WAC9B8/B,GAGJnkC,WAAW,KACTxL,KAAKwjE,sBAAsB7zB,EAAOvjC,QAAQ82D,KAAM,IAAehvD,OAAOy7B,EAAOvjC,QAAQ+H,SACpF,OAGLlU,EAAU8J,OAAOk7D,EAAcC,EAAaC,EAAatB,EAAkBryD,OAG7E5I,EAAA,QAAU5H,iBAAiB,oBAAqBhB,KAAKkK,WAErD,KAAWmvC,kBAAkB,yBAAyBx4C,KAAMukE,IACtCA,EAA0DC,WACnE/+D,QAAS28D,IAClBjjE,KAAKyjE,aAAaR,OAMtB,MAAMT,EAAOxiE,KAAKwiE,KAAOtiE,SAASC,cAAc,OAChDqiE,EAAKpiE,UAAUC,IAAI,QACnB,YAAiBmiE,EAAMxiE,KAAK+jE,YAAa,CAACh2D,eAAgB/N,KAAK+N,iBAC/D/N,KAAK+K,WAAWhB,OAAOy4D,GAwGjB,aAAaS,EAAgCl5D,GAAS,GAC5D,GAAGk5D,EAAU3rD,OAAOguD,UACjBrC,EAAU/iE,UAC8D,IAAxE+iE,EAAU/iE,SAAwB29C,UAAUthC,QAAQ,gBACrD,OAGF0mD,EAAU/iE,SAAW,IAAeu4C,QAAQwqB,EAAU/iE,UAEtD,MAAMD,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAUC,IAAI,aAExB,MAAMyS,EAAQ5S,SAASC,cAAc,OACrC2S,EAAM1S,UAAUC,IAAI,mBAEpB,MAAMqpB,EAAUC,GAAU,CACxBnlB,MAAOy+D,EAAU/iE,SACjBkE,QAAS,KACTnE,UAAW6S,EACXiX,kBAAkB,EAClBjqB,KAAM,IAAiB6sB,gBAAgBs2C,EAAU/iE,SAAU,IAAK,OAkBlE,OAfAD,EAAUmM,QAAQ+H,MAAQ,GAAK8uD,EAAU/iE,SAASiP,GAClDlP,EAAUmM,QAAQ82D,KAAOD,EAAUC,KAED,UAA/BljE,KAAKkiE,MAAMD,WAAW9+D,MAAoBnD,KAAKkiE,MAAMD,WAAWiB,OAASD,EAAUC,MACpFjjE,EAAUG,UAAUC,IAAI,WAGzBqpB,EAAQI,aAAaI,OAASR,EAAQI,aAAaK,MAAMtpB,KAAK,KAC7D+gD,GAAA,EAAcE,OAAO,KACnB7hD,EAAU8J,OAAO+I,OAIrB9S,KAAKwiE,KAAKz4D,EAAS,SAAW,WAAW9J,GAElCA,G,cEvNI,MAAM,WAAsB,KAOzC,YAAoBslE,GAClBtiE,MAAM,iBAAkB,KAAM,CAACu7B,UAAU,EAAMhI,iBAAiB,EAAMrgB,MAAM,IAD1D,KAAAovD,kBA0CZ,KAAAC,gBAAmBvjE,IACzB,MAAM4S,EAAS,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAAQ,uBACzC,IAAIA,EAAQ,OAEZ,MAAM4wD,EAAS5wD,EAAOzI,QAAQ+H,MAC3B,GAAaiY,KAAKrqB,MAAM2jE,wBAAwBD,GACjDzlE,KAAK2+B,OAELjyB,QAAQkK,KAAK,oBAAqB6uD,IA/CpCzlE,KAAK2lE,GAAKzlE,SAASC,cAAc,MACjCH,KAAK2lE,GAAG57D,OAAO,eAAK,YAEpB/J,KAAKyN,OAAO1D,OAAO/J,KAAK2lE,IAExB3lE,KAAKgB,iBAAiB,QAAS,KAC7Bq+C,EAAA,EAAqBumB,wBAAwB,MAG/C,MAAMp5C,EAAMtsB,SAASC,cAAc,OACnCqsB,EAAIpsB,UAAUC,IAAI,eAElBL,KAAK6lE,YAAc3lE,SAASC,cAAc,OAC1CH,KAAK6lE,YAAYzlE,UAAUC,IAAI,uBAAwB,cAEvD,YAAiBL,KAAK6lE,YAAa7lE,KAAKwlE,gBAAiB,CAACz3D,eAAgB/N,KAAK+N,iBAE/E,aAAa/N,KAAK6lE,aAAa,GAE/B7lE,KAAK8lE,eAAiB5lE,SAASC,cAAc,OAC7CH,KAAK8lE,eAAe1lE,UAAUC,IAAI,sBAElCmsB,EAAIziB,OAAO/J,KAAK6lE,aAEhB,MAAMplD,EAAM,YAAO,oDAAqD,CAAC9S,UAAU,EAAMuP,KAAM,YAC/Fld,KAAK8lE,eAAe/7D,OAAO0W,GAE3BzgB,KAAKmW,KAAKpM,OAAOyiB,GACE,IAAI,IAAWxsB,KAAKmW,MACvCnW,KAAKmW,KAAKpM,OAAO/J,KAAK8lE,gBAOtB9lE,KAAK+lE,iBAeC,iBACN,OAAO,GAAmB3sB,cAAcp5C,KAAKulE,iBAAiB1kE,KAAK8T,IAUjE,IAAIkG,EAPJ7a,KAAK2U,IAAMA,EAAIA,IAEf0qC,EAAA,EAAqBumB,wBArEH,kBAuElB5lE,KAAK2lE,GAAG1hE,UAAY,IAAkB6nB,cAAcnX,EAAIA,IAAI/G,OAC5D5N,KAAK8lE,eAAe1lE,UAAUkM,OAAO,OAAQqI,EAAIA,IAAI8lC,gBAGlD9lC,EAAIA,IAAI8lC,gBACT5/B,EAAS,YAAO,6CAA8C,CAAClN,UAAU,IACzEkN,EAAO9Q,OAAO,eAAK,sBAAuB,CAAC,eAAK,WAAY,CAAC4K,EAAIA,IAAIhQ,aAErEkW,EAAS,YAAO,gCAAiC,CAAClN,UAAU,IAC5DkN,EAAO9Q,OAAO,eAAK,mBAAoB,CAAC,eAAK,WAAY,CAAC4K,EAAIA,IAAIhQ,YAGpE3E,KAAK8lE,eAAetzD,YAAc,GAClCxS,KAAK8lE,eAAe/7D,OAAO8Q,GAE3B,YAAiBA,EAAQ,KACvB,MAAMvO,EAAS,OAAA+rB,GAAA,GAAiB,CAACxd,IAAS,GAE1C,GAAmBmrD,iBAAiBhmE,KAAK2U,KAAK9T,KAAK,KACjDb,KAAK2+B,SACJnyB,MAAM,KACPF,QAIJ,MAAM0d,EAAgB,IAAI,KAE1BhqB,KAAK6lE,YAAYzlE,UAAUuB,OAAO,cAClC3B,KAAK6lE,YAAY5hE,UAAY,GAC7B,IAAI,IAAIgQ,KAAOU,EAAIkkC,UAAW,CAC5B,GAAa,kBAAV5kC,EAAI7M,EACL,SAGF,MAAMolB,EAAMtsB,SAASC,cAAc,OACnCqsB,EAAIpsB,UAAUC,IAAI,uBAElB,MAAMP,EAAOyjB,EAAA,EAAWosB,OAAOs2B,WAAWvlE,MAE1C6rB,GAAY,CACVtY,MACAuY,MACAxC,gBACAyC,MAlHc,iBAmHdhrB,MAAM,EACNjB,MAAM,EACNE,MAAOZ,EACPa,OAAQb,IAGVE,KAAK6lE,YAAY97D,OAAOyiB,O,YCpHzB,MAAM,GAMX,YAAYljB,EAAmB6S,EAAc+pD,EAAsBC,EAAkBthD,GACnF,MAAM8iB,EAAa,yBACnB3nC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAIsnC,GAE7B,MAAMn0B,EAAUtT,SAASC,cAAc,OACvCqT,EAAQpT,UAAUC,IAAIsnC,EAAa,YAEnC,MAAM2Y,EAAUpgD,SAASC,cAAc,OACvCmgD,EAAQlgD,UAAUC,IAAIsnC,EAAa,SACnC,gBAAM2Y,EAASh3C,GAEf,MAAM88D,EAAWlmE,SAASC,cAAc,OACxCimE,EAAShmE,UAAUC,IAAIsnC,EAAa,UACpCy+B,EAASniE,UAAY,GAAKiiE,EAE1B1yD,EAAQzJ,OAAOu2C,EAAS8lB,GAExBpmE,KAAKqmE,MAAQ,IAAI,GAAc,CAC7BlqD,OACA7Z,IAAK6jE,EACLrkE,IAAK+iB,GACJqhD,GACHlmE,KAAKqmE,MAAM1mD,eACX3f,KAAKqmE,MAAMzmD,YAAY,CACrB3D,QAAS/Z,IACJlC,KAAKmL,UACNnL,KAAKmL,SAASjJ,GAIhBkkE,EAAS78C,UAAY,GAAKrnB,KAI9BlC,KAAKC,UAAU8J,OAAOyJ,EAASxT,KAAKqmE,MAAMpmE,YAI/B,MAAM,WAA8B,EACjD,OACED,KAAKC,UAAUG,UAAUC,IAAI,8BAC7BL,KAAKmR,SAAS,WAEd,MAAMsmB,EAAU2/B,GAAgB7wD,KAAK,KAAMvG,KAAK+K,YAEhD,CACE,MAAM9K,EAAYw3B,EAAQ,YAEpB4uC,EAAQ,IAAI,GAAqB,WAAY,EAAGz9D,EAAA,QAAUw1B,SAASkoC,iBAAkB,GAAI,IAC/FD,EAAMl7D,SAAYjJ,IAChB6xB,EAAA,QAAgBG,SAAS,4BAA6BhyB,IAGxD,MAAMqkE,EAAuB,YAAO,8BAA+B,CAACl5D,KAAM,QAAS6P,KAAM,mBAEzF,YAAiBqpD,EAAsB,KACrC,IAAI,GAAiBvmE,KAAKsN,QAAQyD,SAGpC,MAAMy1D,EAA0B,IAAI,KAAc,CAChDtpD,KAAM,mBACN5T,KAAM,aACNwqB,SAAU,6BACVsD,YAAY,IAGdn3B,EAAU8J,OAAOs8D,EAAMpmE,UAAWsmE,EAAsBC,EAAwBh1D,OAGlF,CACE,MAAMvR,EAAYw3B,EAAQ,oBAEpBnF,EAAOpyB,SAASC,cAAc,QAE9BmJ,EAAO,gBACPwqB,EAAW,wBAEX2yC,EAAW,IAAI,GAAI,CACvBj0C,WAAY,IAAI,GAAW,CACzB4B,QAAS,6BACT9qB,OACApH,MAAO,QACP4xB,aAEFrB,gBAAiB,4CAGbi0C,EAAe,IAAI,GAAI,CAC3Bl0C,WAAY,IAAI,GAAW,CACzBlpB,OACApH,MAAO,YACP4xB,aAEFrB,gBAAiB,uCAEnB,gBAAMi0C,EAAal0C,WAAW2B,KAAM,iCAAkC,CAAC,YAAW,IAAM,SAExF7B,EAAKvoB,OAAO08D,EAASxmE,UAAWymE,EAAazmE,WAC7CA,EAAU8J,OAAOuoB,GAGnB,CACE,MAAMryB,EAAYw3B,EAAQ,sBAEpBnF,EAAOpyB,SAASC,cAAc,QAE9BmJ,EAAO,cACPwqB,EAAW,sBAEX6yC,EAA4D,CAChE,CAAC,MAAO,0BACR,CAAC,MAAO,2BAGJxzC,EAAOwzC,EAAQl+D,IAAI,EAAEuQ,EAAQyb,KACrB,IAAI,GAAI,CAClBjC,WAAY,IAAI,GAAW,CACzB4B,QAASK,EACTnrB,OACApH,MAAO8W,EACP8a,gBAOAjJ,ECxJG,SAAoBwM,EAAqBuvC,GAAW,GACjE,MAKMC,EAAYxvC,EAKlB,IAAIvqB,EAQJ,OAZI85D,IACFvvC,EAAWrR,GAAA,GAIb,SAAU8gD,IACRzvC,IACAvqB,EAAU,KAAItB,WAAWs7D,EAAsC,KAAhC,IAAK,IAAIryB,MAAOsyB,eAFjD,GAKA1vC,EAAWwvC,EAhBI,KACb75D,aAAaF,IDsJIk6D,CAAW,KACxB,MAAM7+C,EAAO,IAAIssB,KAEjBkyB,EAAQrgE,QAAQ,EAAE0S,GAAS3U,KACzB,MAAM4iE,EAAM9+C,EAAK++C,mBAAmB,cAAgBluD,EAAQ,CAC1DmuD,KAAM,UACNC,OAAQ,YAGVj0C,EAAK9uB,GAAKqnB,SAASlZ,YAAcy0D,MAIrCjnE,KAAKwO,cAAcxN,iBAAiB,UAAW6pB,GAE/CyH,EAAKvoB,UAAUopB,EAAK1qB,IAAIyoB,GAAOA,EAAIjxB,YACnCA,EAAU8J,OAAOuoB,GAGnB,CACE,MAAMryB,EAAYw3B,EAAQ,qBAGpB4vC,EAAwB,IAAI,KAAc,CAC9CnqD,KAAM,uBACN5T,KAAM,WACNwqB,SAAU,iCACVsD,YAAY,IAERkwC,EAAuB,IAAI,KAAc,CAC7CpqD,KAAM,2BACN5T,KAAM,UACNwqB,SAAU,gCACVsD,YAAY,IAERmwC,EAAsB,IAAI,KAAc,CAC5CrqD,KAAM,yBACN5T,KAAM,SACNwqB,SAAU,+BACVsD,YAAY,IAERowC,EAAwB,IAAI,KAAc,CAC9CtqD,KAAM,uBACN5T,KAAM,WACNwqB,SAAU,iCACVsD,YAAY,IAGdn3B,EAAU8J,OAAOs9D,EAAsB71D,MAAO81D,EAAqB91D,MAAO+1D,EAAoB/1D,MAAOg2D,EAAsBh2D,OAG7H,CACE,MAAMvR,EAAYw3B,EAAQ,yBAGpBgwC,EAAoB,IAAI,KAAc,CAC1CvqD,KAAM,cACN5T,KAAM,OACNwqB,SAAU,yBACVsD,YAAY,IAERswC,EAAsB,IAAI,KAAc,CAC5CxqD,KAAM,gBACN5T,KAAM,SACNwqB,SAAU,2BACVsD,YAAY,IAGdn3B,EAAU8J,OAAO09D,EAAkBj2D,MAAOk2D,EAAoBl2D,OAGhE,CACE,MAAMvR,EAAYw3B,EAAQ,SAEpBkwC,EAAuB,IAAI,KAAc,CAC7CzqD,KAAM,kCACN5T,KAAM,gBACNwqB,SAAU,yBACVsD,YAAY,IAERwwC,EAAmB,IAAI,KAAc,CACzC1qD,KAAM,2BACN5T,KAAM,YACNwqB,SAAU,qBACVsD,YAAY,IAGdn3B,EAAU8J,OAAO49D,EAAqBn2D,MAAOo2D,EAAiBp2D,OAGhE,CACE,MAAMvR,EAAYw3B,EAAQ,4CAEpBkwC,EAAuB,IAAI,KAAc,CAC7CzqD,KAAM,2BACN5T,KAAM,UACNwqB,SAAU,4BACVsD,YAAY,IAERywC,EAAoB,IAAI,KAAc,CAC1C3qD,KAAM,iCACN5T,KAAM,OACNwqB,SAAU,yBACVsD,YAAY,IAGR0wC,EAAmC,GAEnC99C,EAAgB,IAAI,KACpB+9C,EAAmB,CAAC9uB,EAAmCte,EAA+B,YAC1F,MAAMzJ,EAAM,IAAI,GAAI,CAClBtjB,MAAO,IAAkBke,cAAcmtB,EAAWrrC,OAClD6kB,gBAAiB,WACjBC,iBAAkB,CAACumB,EAAWt0C,OAC9BguB,aAAa,EACblpB,UAAW,KACT,IAAI,GAAc,CAAC0F,GAAI8pC,EAAW9pC,GAAI8rC,YAAahC,EAAWgC,cAAcx8B,UAIhFqpD,EAAY7uB,EAAW9pC,IAAM+hB,EAE7B,MAAM1E,EAAMtsB,SAASC,cAAc,OACnCqsB,EAAIpsB,UAAUC,IAAI,aAElByiD,GAAoB,CAClBnuC,IAAKskC,EACLh5C,UAAWusB,EACXC,MAAO,mBACPzC,gBACAtpB,MAAO,GACPC,OAAQ,GACRF,UAAU,IAGZywB,EAAIjxB,UAAU8J,OAAOyiB,GAErBvsB,EAAU06B,GAAQzJ,EAAIjxB,YAGxB,GAAmB27C,iBAAiB/6C,KAAKg7C,IACvC,OAAAmsB,GAAA,GAAoDnsB,GACpD,IAAI,MAAM5C,KAAc4C,EAAYV,KAClC4sB,EAAiB9uB,KAIrBj5C,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,qBAAuBiC,IACxD,MAAM0S,EAA6B1S,EAE/B6lE,EAAYnzD,EAAIxF,KAClB44D,EAAiBpzD,EAAK,aAI1B3U,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,mBAAqBiC,IACtD,MAAM0S,EAA6B1S,EAEhC6lE,EAAYnzD,EAAIxF,MACjB24D,EAAYnzD,EAAIxF,IAAIlP,UAAU0B,gBACvBmmE,EAAYnzD,EAAIxF,OAI3BlP,EAAU8J,OAAO49D,EAAqBn2D,MAAOq2D,EAAkBr2D,QAInE,SACKxR,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,O,2SE3TH,MAAM,WAA0B,EAW7B,O,0CACdlO,KAAKC,UAAUG,UAAUC,IAAI,0BAC7BL,KAAKmR,SAAS,qBAEd,MAAMwgB,EAA4B,GAElC,CACE,MAAMrgB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3BL,KAAKioE,oBAAsB,IAAI,IAAW,CACxCz2D,MAAO,6BACPlI,KAAM,aACNmI,UAAW,KAEbzR,KAAKokC,mBAAqB,IAAI,IAAW,CACvC5yB,MAAO,sCACPlI,KAAM,YACNmI,UAAW,KAEbzR,KAAKkoE,cAAgB,IAAI,IAAW,CAClC12D,MAAO,uBACPlI,KAAM,MACNmI,UAAW,KAGbH,EAAavH,OAAO/J,KAAKioE,oBAAoBhoE,UAAWD,KAAKokC,mBAAmBnkC,UAAWD,KAAKkoE,cAAcjoE,WAE9G,MAAMs4B,EAAUr4B,SAASC,cAAc,OACvCo4B,EAAQn4B,UAAUC,IAAI,WACtB,gBAAM,CAAC2U,QAASujB,EAAShqB,IAAK,oBAE9BojB,EAAYhsB,KAAK3F,KAAKioE,oBAAqBjoE,KAAKokC,mBAAoBpkC,KAAKkoE,eACzEloE,KAAK+K,WAAWhB,OAAOuH,EAAcinB,GAGvCv4B,KAAK+K,WAAWhB,OAAO7J,SAASC,cAAc,OAE9CH,KAAK8iC,SAAW,IAAI,GAAS,CAC3B77B,OAAQ2B,EAAA,QAAU6O,KAClBka,cACA5jB,eAAgB/N,KAAK+N,iBAEvB/N,KAAK6N,QAAQ9D,OAAO/J,KAAK8iC,SAASpxB,SAClC1R,KAAK+K,WAAW0U,QAAQzf,KAAK8iC,SAAS1xB,WAAWnR,WAEjD,CACE,MAAMovB,EAAKnvB,SAASC,cAAc,OAClCkvB,EAAGjvB,UAAUC,IAAI,mBACjB,gBAAM,CAAC2U,QAASqa,EAAI9gB,IAAK,yBAEzB,MAAM+C,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3BL,KAAKmoE,mBAAqB,IAAI,GAAmB,CAC/C32D,MAAO,6BACPlI,KAAM,WACNpG,WAAW,EACX6K,eAAgB/N,KAAK+N,eACrB5C,SAAU,KACRnL,KAAK8iC,SAAShR,eACd9xB,KAAKooE,iBAEP/xC,cAAe,iCACfC,UAAW,6BACXX,YAAa,iCAGfrkB,EAAavH,OAAO/J,KAAKmoE,mBAAmBloE,WAE5C,MAAMs4B,EAAUr4B,SAASC,cAAc,OACvCo4B,EAAQn4B,UAAUC,IAAI,WACtBk4B,EAAQxuB,OAAO,eAAK,uCACpBwuB,EAAQxuB,OAAO7J,SAASC,cAAc,MAAOD,SAASC,cAAc,OAEpE,MAAMkoE,EAAsBroE,KAAKqoE,oBAAsBnoE,SAASC,cAAc,OAC9EkoE,EAAoBjoE,UAAUC,IAAI,yBAElC,MAAMioE,EAAmBtoE,KAAKsoE,iBAAmBpoE,SAASC,cAAc,KACxEmoE,EAAiBloE,UAAUC,IAAI,eAC/BioE,EAAiB3W,KAAO,IACxB2W,EAAiBzzD,OAAS,SAE1BwzD,EAAoBt+D,OAAO,eAAK,mBAAoB,CAACu+D,KAErD/vC,EAAQxuB,OAAOs+D,GAEf12C,EAAYhsB,KAAK3F,KAAKmoE,oBACtBnoE,KAAK+K,WAAWhB,OAAOslB,EAAI/d,EAAcinB,GAG3C,YAAiBv4B,KAAK8iC,SAASpxB,QAAS,KACtC1R,KAAK8iC,SAASpxB,QAAQE,UAAW,EAEjC,IAAI6rB,EAA2B,GAE/BA,EAAS93B,KAAK,UAAkB4iE,cAAcvoE,KAAKioE,oBAAoB/lE,MAAOlC,KAAKokC,mBAAmBliC,MAAOlC,KAAKkoE,cAAchmE,OAAOrB,KAAK,KAC1Ib,KAAK+4B,SACHtsB,IACFC,QAAQC,MAAM,uBAAwBF,MAGrCzM,KAAK8iC,SAAS5xB,cACfusB,EAAS93B,KAAK3F,KAAK8iC,SAAS5xB,eAAerQ,KAAKoR,GACvC,UAAkBu2D,mBAAmBv2D,KAI7CjS,KAAKmoE,mBAAmB5xC,mBACzBkH,EAAS93B,KAAK,IAAgBmzB,eAAe94B,KAAKmoE,mBAAmBjmE,QAGvEW,QAAQ0gC,KAAK9F,GAAUpc,QAAQ,KAC7BrhB,KAAK8iC,SAASpxB,QAAQ8xB,gBAAgB,eAEvC,CAACz1B,eAAgB/N,KAAK+N,iBAEzB,MAAMs2B,EAAO,IAAgBokC,UAEvB38B,QAAiB,UAAkBD,WAAWxH,EAAKl1B,IAAI,GAE7DnP,KAAKioE,oBAAoBjvC,iBAAiBqL,EAAKG,YAAY,GAC3DxkC,KAAKokC,mBAAmBpL,iBAAiBqL,EAAKI,WAAW,GACzDzkC,KAAKkoE,cAAclvC,iBAAiB8S,EAASjJ,OAAO,GACpD7iC,KAAKmoE,mBAAmBnvC,iBAAiBqL,EAAKxO,UAAU,GAExD71B,KAAKooE,gBACLpoE,KAAK8iC,SAAShR,kBAGR,gBACN,GAAG9xB,KAAKmoE,mBAAmBpmE,MAAM3B,UAAUuR,SAAS,WAAa3R,KAAKmoE,mBAAmBjmE,MAAMC,OAC7FnC,KAAKqoE,oBAAoB1lE,MAAMC,QAAU,WACpC,CACL5C,KAAKqoE,oBAAoB1lE,MAAMC,QAAU,GACzC,IAAI8R,EAAM,gBAAkB1U,KAAKmoE,mBAAmBjmE,MACpDlC,KAAKsoE,iBAAiB/+C,UAAY7U,EAClC1U,KAAKsoE,iBAAiB3W,KAAOj9C,I,2SC9IpB,MAAM,WAA4B,EAAjD,c,oBAwGE,KAAA0lB,cAAsBtoB,GAAsB,yCAGpC,IAAgB42D,cACtB52D,EAAQxL,QAAQW,IAGd,MAAM,IAAC6E,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ5E,EACRhH,UAAWD,KAAK+mB,SAAShc,WACzBiB,YAAY,EACZqG,eAAe,EACfpG,WAAY,KAGRotB,EAAWr5B,KAAK+mB,SAASsS,SAAS1xB,IAAIV,GAC5C6E,EAAI8xB,YAAY7zB,OAAO/J,KAAKm7B,SAAS9B,IAGrC,MAAMsvC,EAAgC,GACtC3oE,KAAK4oE,iBAAiBtiE,QAAQ,CAACm1B,EAAS7zB,KACtC,GAAG6zB,EAAQ9zB,IAAIV,GAAS,CACtB,MAAMkoD,EAAOjvD,SAASC,cAAc,QACpCgvD,EAAKlrD,UAAY,IAAkB6nB,cAAclkB,EAAOgG,OACxD+6D,EAAehjE,KAAKwpD,MAIT,eAAKwZ,GAAgB,GAC7BriE,QAAQyJ,IACbjE,EAAIwG,gBAAgBvI,OAAOgG,UA4GjC,KAAA84D,eAAkB1mE,IAEC,aAAdnC,KAAKmD,OACNnD,KAAK8oE,WAAWnmE,MAAMC,QAAUT,EAAS,GAAK,SA1OxC,OA2ER,OA1EAnC,KAAK6N,QAAQlM,SACb3B,KAAKC,UAAUG,UAAUC,IAAI,+BAC7BL,KAAK8oE,WAAa,EAAW,yBAA0B,CAACn7D,UAAU,IAClE3N,KAAK8oE,WAAWnmE,MAAMC,QAAU,OAEhC5C,KAAKyN,OAAO1D,OAAO/J,KAAK8oE,YAExB9oE,KAAK8oE,WAAW9nE,iBAAiB,QAAS,KACxC,MAAMq4B,EAAWr5B,KAAK+mB,SAAS0X,cAI/B,GAAiB,aAAdz+B,KAAKmD,KACN,IAAI,MAAMoL,KAAOvO,KAAK4H,OAAO0P,OACI,IAA5B/I,EAAIgO,QAAQ,oBAKRvc,KAAK4H,OAAO0P,OAAO/I,QAG5B,IAAI,MAAMA,KAAOvO,KAAK4H,OAAO0P,OACI,IAA5B/I,EAAIgO,QAAQ,oBAKRvc,KAAK4H,OAAO0P,OAAO/I,GAI9B,MAAMuD,EAAoB,GAC1B,IAAI,MAAMvD,KAAO8qB,EACZ9qB,EAAIisB,WACL1oB,EAAQnM,KAAK4I,EAAI4Y,YAGjBnnB,KAAK4H,OAAO0P,OAAO/I,IAAO,EAI9B,IAAIw6D,EAEFA,EADe,aAAd/oE,KAAKmD,KACC8D,GAAW6K,EAAQioB,SAAS9yB,GAE5BA,IAAY6K,EAAQioB,SAAS9yB,GAGtC,YAAejH,KAAK4H,OAAOohE,cAAe,CAAC/hE,EAAQ5C,KAC7C0kE,EAAI9hE,KACNjH,KAAK4H,OAAOohE,cAAcvkE,OAAOJ,EAAK,GACtCrE,KAAK4H,OAAOqhE,aAAaxkE,OAAOJ,EAAK,MAIzC,MAAM6kE,EAAsB,aAAdlpE,KAAKmD,KAAsB,iBAAmB,iBACtDgmE,EAA4B,aAAdnpE,KAAKmD,KAAsB,gBAAkB,gBACjE,YAAenD,KAAK4H,OAAOshE,GAAQ,CAACjiE,EAAQ5C,KACvCyN,EAAQioB,SAAS9yB,KAClBjH,KAAK4H,OAAOshE,GAAOzkE,OAAOJ,EAAK,GAC/BrE,KAAK4H,OAAOuhE,GAAa1kE,OAAOJ,EAAK,MAIzCrE,KAAK4H,OAAqB,aAAd5H,KAAKmD,KAAsB,iBAAmB,kBAAoB2O,EAC9E9R,KAAK4H,OAAqB,aAAd5H,KAAKmD,KAAsB,gBAAkB,iBAAmB2O,EAAQrJ,IAAIxB,GAAU,IAAgBmiE,iBAAiBniE,IAGnIjH,KAAKqpE,cAAcC,UAAUtpE,KAAK4H,QAAQ,GAC1C5H,KAAK+4B,UAGP/4B,KAAK4oE,iBAAmB,IAAIl5D,IACrB,IAAmB65D,eAAeC,mBAAmB3oE,KAAKizD,IAC/D,IAAI,MAAMlsD,KAAUksD,EAClB9zD,KAAK4oE,iBAAiBj0D,IAAI/M,EAAQ,IAAI/D,IAAI,IAAmB4lE,eAAeC,iBAAiB9hE,EAAOuH,IAAI1G,IAAI8X,GAAKA,EAAEtZ,YAKzH,SAASoyB,GACP,MAAMjc,EAAgB,IAAI,KAAc,CACtC7a,OAAO,IAMT,OAJG82B,IACDjc,EAAcrb,MAAM4b,QAAU0b,GAGzBjc,EAAc5L,MAsCvB,SACKxR,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGdlO,KAAK8oE,WAAWnmE,MAAMC,QAAwB,aAAd5C,KAAKmD,KAAsB,GAAK,OAChEnD,KAAKmR,SAAuB,aAAdnR,KAAKmD,KAAsB,mBAAqB,mBAE9D,MAAMyE,EAAS5H,KAAK4H,OAEdgvB,EAAW12B,SAAS22B,yBAEpB8yC,EAAoB,IAAI,GAAe,CAC3CnxC,aAAa,EACblvB,KAAM,oBAKR,IAAIkK,EAFJm2D,EAAkB1pE,UAAUG,UAAUC,IAAI,qBAIxCmT,EADe,aAAdxT,KAAKmD,KACI,CACRymE,cAAe,CAACC,IAAK,OAAQ3sD,KAAM,8BACnC4sD,iBAAkB,CAACD,IAAK,UAAW3sD,KAAM,2BACzC6sD,aAAc,CAACF,IAAK,YAAa3sD,KAAM,8BAG/B,CACRqf,SAAU,CAACstC,IAAK,aAAc3sD,KAAM,4BACpC8sD,aAAc,CAACH,IAAK,cAAe3sD,KAAM,+BACzC+sD,OAAQ,CAACJ,IAAK,QAAS3sD,KAAM,0BAC7BgtD,WAAY,CAACL,IAAK,aAAc3sD,KAAM,4BACtCitD,KAAM,CAACN,IAAK,OAAQ3sD,KAAM,yBAI9B,MAAMgd,EAAIh6B,SAAS22B,yBACnB,IAAI,MAAMtoB,KAAOiF,EAAS,CACxB,MAAMqH,EAAS,YAAO,qDAAsD,CAACxN,KAAMmG,EAAQjF,GAAKs7D,IAAK3sD,KAAM1J,EAAQjF,GAAK2O,OACxHrC,EAAOzO,QAAQnF,OAASsH,EACxBsM,EAAO9Q,OAAO/J,KAAKm7B,YACnBjB,EAAEnwB,OAAO8Q,GAEX8uD,EAAkB97D,QAAQ9D,OAAOmwB,GAEjC,MAAMkwC,EAAe,IAAI,GAAe,CACtC9gE,KAAM,gBAGRstB,EAAS7sB,OAAO4/D,EAAkB1pE,UAAWmqE,EAAanqE,WAI1D,MAAMoqE,GAA+B,aAAdrqE,KAAKmD,KAAsByE,EAAO0iE,eAAiB1iE,EAAO2iE,gBAAgB9mE,QAEjGzD,KAAK+mB,SAAW,IAAI,GAAe,CACjCsU,SAAUr7B,KAAKC,UACfkL,SAAUnL,KAAK6oE,eACfpvC,SAAU,CAAC,WACXU,kBAAmBn6B,KAAKo6B,cACxBxtB,YAAa,WAEf5M,KAAK+mB,SAASsS,SAAW,IAAIx1B,IAAIwmE,GAEjC,IAAIG,GAAe,EACnB,MAAMC,EAAOzqE,KAAK+mB,SAAS1mB,IAAIkG,KAAKvG,KAAK+mB,UACzC/mB,KAAK+mB,SAAS1mB,IAAM,CAAC4G,EAAQ2G,EAAOmwB,KAClC,GAAG/9B,KAAK+mB,SAASsS,SAASv5B,MAAQ,KAAO0qE,IAAiBh3D,EAAQvM,GAAS,CACzE,MAAM8I,EAAuB/P,KAAK+mB,SAASnd,KAAKiG,cAAc,kBAAkB5I,yBAC7E8I,GACDvE,WAAW,KACTuE,EAAG4N,SAAU,GACZ,GAKL,YADA4W,GADY,UAAKvb,OAAqB,aAAdhZ,KAAKmD,KAAsB,uCAAwC,wCAAwC,IAKrI,MAAMqpB,EAAMi+C,EAAKxjE,EAAQuM,EAAQvM,GAAU,eAAKuM,EAAQvM,GAAQiW,WAAQxY,EAAWq5B,GAInF,OAHGvqB,EAAQvM,IACTulB,EAAI3c,cAAc,kBAAkBzP,UAAUC,IAAI,SAAWmT,EAAQvM,GAAQ4iE,KAExEr9C,GAGT,MAAM07B,EAASloD,KAAK+mB,SAASnd,KAAKkH,cAClCs5D,EAAav8D,QAAQ9D,OAAO/J,KAAK+mB,SAASnd,MAC1Cs+C,EAAOn+C,OAAO6sB,GAEd52B,KAAK+mB,SAAS+e,WAAWukC,GACzBG,GAAe,EAEf,IAAI,MAAMtqC,KAAQt4B,EAAO0P,OAEpB9D,EAAQk3D,eAAexqC,IAAWt4B,EAAO0P,OAAO4oB,IAChDypC,EAAkB97D,QAAQgC,cAAc,kBAAkBqwB,OAA0BjF,QAY3F,sBAME,OALGj7B,KAAK+mB,WACN/mB,KAAK+mB,SAAS9mB,UAAU0B,SACxB3B,KAAK+mB,SAAW,MAGX9jB,MAAM0L,sBAMR,KAAK/G,EAAuBzE,EAAgCkmE,GAMjE,OALArpE,KAAK2qE,eAAiB/iE,EACtB5H,KAAK4H,OAAS,YAAK5H,KAAK2qE,gBACxB3qE,KAAKmD,KAAOA,EACZnD,KAAKqpE,cAAgBA,EAEdpmE,MAAM8N,QCxQF,MAAM,WAAyB,EAA9C,c,oBAUU,KAAAyuB,MAAsJ,GASpJ,OACRx/B,KAAKC,UAAUG,UAAUC,IAAI,yBAC7BL,KAAKu4B,QAAUr4B,SAASC,cAAc,OACtCH,KAAKu4B,QAAQn4B,UAAUC,IAAI,WAC3BL,KAAKu4B,QAAQxuB,OAAO,eAAK,6BACzB/J,KAAKq4D,iBAAmBn4D,SAASC,cAAc,OAC/CH,KAAKq4D,iBAAiBj4D,UAAUC,IAAI,qBAEpCL,KAAK8oE,WAAa,EAAW,+BAC7B,MAAM8B,EAA4C,CAChDv9D,KAAM,gBACN6P,KAAM,mBACNC,QAAS,KACP,IAAI,GAAU,gBAAiB,CAC7B4V,aAAc,wCACd+D,mBAAoB,sCACpBlZ,QAAS,CAAC,CACRwW,QAAS,SACTiD,SAAU,KACRuzC,EAAmB51D,QAAQ5R,aAAa,WAAY,QACpD,IAAmBmmE,eAAesB,mBAAmB7qE,KAAK4H,QAAQ,GAAM/G,KAAKiqE,IACxEA,GACD9qE,KAAK+4B,UAEN1X,QAAQ,KACTupD,EAAmB51D,QAAQwuB,gBAAgB,eAG/ClB,UAAU,MAEX7jB,SAGPze,KAAK+qE,QAAU,GAAiB,GAAI,cAAe,CAACH,IACpD5qE,KAAK+qE,QAAQ3qE,UAAUC,IAAI,QAE3BL,KAAKyN,OAAO1D,OAAO/J,KAAK8oE,WAAY9oE,KAAK+qE,SAEzC,MAAMz5D,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3BL,KAAKmkC,eAAiB,IAAI,IAAW,CACnC3yB,MAAO,uBACPC,UAhEyB,KAmE3BH,EAAavH,OAAO/J,KAAKmkC,eAAelkC,WAExC,MAAM+qE,EAAe,CAACxhE,EAAmByhE,EAAqBrtD,EAAgFoxB,KAC5I,MAAMvX,EAAU,IAAI,GAAe,CACjCnuB,KAAM2hE,EACNzyC,aAAa,IAGff,EAAQx3B,UAAUG,UAAUC,IAAI,cAAemJ,GAE/C,MAAM0hE,EAAazzC,EAAQ+I,yBAiB3B,OAhBA0qC,EAAW9qE,UAAUC,IAAI,qBAEzBud,EAAQtX,QAAQ6wB,IACd,MAAMtc,EAAS,YAAO,yDAA0D,CAC9ExN,KAAM8pB,EAAE9pB,KACR6P,KAAMia,EAAEja,KACRvP,UAAUwpB,EAAEC,iBAAa1yB,IAGxByyB,EAAE7tB,OACH0lC,EAAG7X,EAAE7tB,MAAQuR,GAGfqwD,EAAWnhE,OAAO8Q,KAGb4c,GAGTz3B,KAAKsqE,eAAiBU,EAAa,uBAAwB,gBAAiB,CAAC,CAC3E39D,KAAM,cACN6P,KAAM,kCACNka,YAAY,GACX,CACDla,KAAM,2BACN7P,KAAM,aACN/D,KAAM,YACL,CACD4T,KAAM,8BACN7P,KAAM,cACN/D,KAAM,gBACL,CACD4T,KAAM,yBACN7P,KAAM,QACN/D,KAAM,UACL,CACD4T,KAAM,2BACN7P,KAAM,UACN/D,KAAM,cACL,CACD4T,KAAM,uBACN7P,KAAM,OACN/D,KAAM,SACJtJ,KAAKw/B,OAETx/B,KAAKuqE,eAAiBS,EAAa,uBAAwB,gBAAiB,CAAC,CAC3E39D,KAAM,gBACN6P,KAAM,kCACNka,YAAY,GACX,CACDla,KAAM,6BACN7P,KAAM,OACN/D,KAAM,iBACL,CACD4T,KAAM,0BACN7P,KAAM,UACN/D,KAAM,oBACL,CACD4T,KAAM,4BACN7P,KAAM,YACN/D,KAAM,iBACJtJ,KAAKw/B,OAETx/B,KAAK+K,WAAWhB,OAAO/J,KAAKq4D,iBAAkBr4D,KAAKu4B,QAASjnB,EAActR,KAAKsqE,eAAerqE,UAAWD,KAAKuqE,eAAetqE,WAE7H,MAAMkrE,EAAyBnrE,KAAKsqE,eAAerqE,UAAU4P,cAAc,sBACrEu7D,EAAyBprE,KAAKuqE,eAAetqE,UAAU4P,cAAc,sBAyD3E,OAvDAs7D,EAAuBt7D,cAAc,QAAQ7O,iBAAiB,QAAS,KACrE,IAAI,GAAoBhB,KAAKsN,QAAQyD,KAAK/Q,KAAK4H,OAAQ,WAAY5H,QAGrEorE,EAAuBv7D,cAAc,QAAQ7O,iBAAiB,QAAS,KACrE,IAAI,GAAoBhB,KAAKsN,QAAQyD,KAAK/Q,KAAK4H,OAAQ,WAAY5H,QAGrEA,KAAK8oE,WAAW9nE,iBAAiB,QAAS,KACxC,GAAGhB,KAAKmkC,eAAepiC,MAAM3B,UAAUuR,SAAS,SAC9C,OAGF,IAAI3R,KAAKmkC,eAAejiC,MAAMoJ,OAE5B,YADAtL,KAAKmkC,eAAepiC,MAAM3B,UAAUC,IAAI,SAI1C,IAUI8F,EAVAklE,EAAWljE,MAAMC,KAAK+iE,EAAuB/lD,UAA4B3hB,MAAM,GAAG0/B,OAAO,CAACC,EAAKrzB,IAAOqzB,KAAQrzB,EAAGpN,MAAMC,QAAS,GACpIyoE,GAAWrrE,KAAK4H,OAAO0jE,cAAcnpE,OAEjCkpE,GAKJrrE,KAAK8oE,WAAW1lE,aAAa,WAAY,QAMvC+C,EAHEnG,KAAK4H,OAAOuH,GAGJ,IAAmBo6D,eAAesB,mBAAmB7qE,KAAK4H,QAF1D,IAAmB2hE,eAAegC,mBAAmBvrE,KAAK4H,QAKtEzB,EAAQtF,KAAKiqE,IACRA,GACD9qE,KAAK+4B,UAENvsB,MAAMC,IACS,4BAAbA,EAAItJ,KACLoxB,GAAM,yCAEN7nB,QAAQC,MAAM,4BAA6BF,KAE5C4U,QAAQ,KACTrhB,KAAK8oE,WAAWtlC,gBAAgB,eAxBhCjP,GAAM,sDA4BVv0B,KAAKmkC,eAAepiC,MAAMf,iBAAiB,QAAS,KAClDhB,KAAK4H,OAAOgG,MAAQ5N,KAAKmkC,eAAejiC,MACxClC,KAAKwrE,uBAGAxrE,KAAKyrE,qBAAuBxxB,GAAA,EAAa15C,qBAAqB,CACnEN,UAAWD,KAAKq4D,iBAChB73D,MAAM,EACNC,UAAU,EACVC,MAAO,GACPC,OAAQ,IACP,aAAaE,KAAK4hB,IACnBziB,KAAKe,UAAY0hB,EAEVw3B,GAAA,EAAav4C,kBAAkB+gB,KAI1C,qBACEziB,KAAKyrE,qBAAqB5qE,KAAK,KAC7Bb,KAAKe,UAAUN,UAAW,EAC1BT,KAAKe,UAAUU,SAIX,eACNzB,KAAKu4B,QAAQ51B,MAAMC,QAAU,GAC7B5C,KAAKmR,SAAS,aACdnR,KAAK+qE,QAAQ3qE,UAAUC,IAAI,QAC3BL,KAAK8oE,WAAW1oE,UAAUuB,OAAO,QACjC3B,KAAKmkC,eAAejiC,MAAQ,GAE5B,IAAI,MAAMg+B,KAAQlgC,KAAKw/B,MAErBx/B,KAAKw/B,MAAMU,GAAMv9B,MAAMC,QAAU,OAI7B,aACN5C,KAAKu4B,QAAQ51B,MAAMC,QAAU,OAC7B5C,KAAKmR,SAAuB,WAAdnR,KAAKmD,KAAoB,YAAc,oBAEpC,SAAdnD,KAAKmD,OACNnD,KAAK+qE,QAAQ3qE,UAAUuB,OAAO,QAC9B3B,KAAK8oE,WAAW1oE,UAAUC,IAAI,SAGhC,MAAMuH,EAAS5H,KAAK4H,OACpB5H,KAAKmkC,eAAejiC,MAAQ,IAAkBwpE,cAAc9jE,EAAOgG,OAEnE,IAAI,MAAMsyB,KAAQlgC,KAAKw/B,MACrBx/B,KAAKw/B,MAAMU,GAAyCv9B,MAAMC,QAAYgF,EAAO0P,OAAO4oB,GAA2C,GAAK,OAGtI,CAAE,iBAA2B,kBAA4B55B,QAAQiI,IAC/D,MAAMkpB,EAAUz3B,KAAKuO,GACfo9D,EAAK,GAAkB9hE,iBAEvBqpD,EAAQtrD,EAAO2G,GAAK9K,QAEpBmoE,EAAcC,IAClB,IAAI,IAAI7gE,EAAI,EAAG7I,EAASE,KAAKC,IAAI4wD,EAAM/wD,OAAQ0pE,GAAU7gE,EAAI7I,IAAU6I,EAAG,CACxE,MAAM/D,EAASisD,EAAMttD,SAEf,IAACkG,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ5E,EACRhH,UAAW0rE,EACX3/D,YAAY,EACZqG,eAAe,EACfnG,WAAW,EACXD,WAAY,KAEdH,EAAIwG,gBAAgBxB,cAAcnP,SAGjCuxD,EAAM/wD,OACPgvC,EAASC,iBAAiBroB,YAAY,eAAK,sBAAuB,CAACmqC,EAAM/wD,UACjEgvC,GACRA,EAASxvC,UAMb,IAAIwvC,EACJ,GAHA1Z,EAAQ+I,yBAAyBz2B,OAAO4hE,GAGrCzY,EAAM/wD,OAAQ,CACf,MAAM0L,EAAU4pB,EAAQ+I,yBACxB2Q,EAAW,YAAO,yDAA0D,CAAC9jC,KAAM,SACnF8jC,EAAS/wC,UAAUC,IAAI,YAAa,eACpC8wC,EAASnwC,iBAAiB,QAAS,IAAM4qE,EAAW,KACpDz6B,EAASpnC,OAAO,eAAK,sBAAuB,CAACmpD,EAAM/wD,UAEnD0L,EAAQ9D,OAAOonC,GAGjBy6B,EAAW,KAIf,qBACE,GAAiB,SAAd5rE,KAAKmD,KAAiB,CACvB,MAAMs1B,GAAW,YAAUz4B,KAAK2qE,eAAgB3qE,KAAK4H,QACrD5H,KAAK8oE,WAAW1oE,UAAUkM,OAAO,QAASmsB,GAC1Cz4B,KAAK+qE,QAAQ3qE,UAAUkM,OAAO,OAAQmsB,IAI1C,UAAU7wB,EAAsBkkE,GAE9B3jE,MAAMC,KAAKpI,KAAKC,UAAU6P,iBAAiB,mBAAmBxJ,QAAQyJ,GAAMA,EAAGpO,UAE5EmqE,GACD9rE,KAAK2qE,eAAiB/iE,EACtB5H,KAAK4H,OAAS,YAAKA,KAEnB5H,KAAK4H,OAASA,EACd5H,KAAK+rE,aACL/rE,KAAKwrE,sBAIF,KAAK5jE,GACV,MAAM+9B,EAAM1iC,MAAM8N,OAuBlB,YArBcrM,IAAXkD,GACD5H,KAAKspE,UAAU,CACbliE,EAAG,eACH+H,GAAI,EACJvB,MAAO,GACP0J,OAAQ,GACR2xD,aAAc,GACdqC,cAAe,GACfU,cAAe,GACfhD,cAAe,GACfsB,eAAgB,GAChBC,eAAgB,KACf,GACHvqE,KAAKmD,KAAO,SACZnD,KAAKisE,iBAELjsE,KAAKspE,UAAU1hE,GAAQ,GACvB5H,KAAKmD,KAAO,OACZnD,KAAK+rE,cAGApmC,G,2SCnVI,MAAM,WAA0B,EAA/C,c,oBAOU,KAAAumC,gBAA6C,GAG7C,aAAaC,EAAqElsE,EAAyBixB,GACjH,IAAItpB,EA2CA4kB,EA1CAuK,EAAc,GACdxW,EAAmB,GACvB,GAAsB,0BAAnB4rD,EAAa/kE,EACdQ,EAASukE,EAAavkE,OACtBmvB,EAAco1C,EAAap1C,gBACtB,CAQL,GAPAnvB,EAASukE,EAOa,IALDn1D,OAAOy0C,KAAK7jD,EAAO0P,QAAQnV,OAKvB,CACvB,MAAMmV,EAAS1P,EAAO0P,OACtB,IAAIo6B,EACDp6B,EAAOilB,SAAUmV,EAAI,oBAChBp6B,EAAO0yD,aAAct4B,EAAI,uBACzBp6B,EAAO2yD,OAAQv4B,EAAI,kBACnBp6B,EAAO4yD,WAAYx4B,EAAI,oBACvBp6B,EAAO6yD,OAAMz4B,EAAI,iBAEtBA,GACDnxB,EAAE5a,KAAK,eAAK+rC,IAIhB,IAAInxB,EAAEpe,OAAQ,CACZ,MAAMiqE,EAAS,IAAmB3C,eAAeC,iBAAiB9hE,EAAOuH,IACzE,IAAI6mD,EAAQ,EAAGqW,EAAW,EAAGpC,EAAS,EACtC,IAAI,MAAMp+D,KAAUugE,EACf,IAAgBE,WAAWzgE,EAAO5E,QAASgjE,IACtC,IAAgBzyC,YAAY3rB,EAAO5E,QAASolE,IAC/CrW,IAGJA,GAAOz1C,EAAE5a,KAAK,eAAK,QAAS,CAACqwD,KAC7BqW,GAAU9rD,EAAE5a,KAAK,eAAK,WAAY,CAAC0mE,KACnCpC,GAAQ1pD,EAAE5a,KAAK,eAAK,SAAU,CAACskE,MAKtC,GAAI/4C,EAwBFA,EAAIxF,SAASlZ,YAAc,GAC3B,eAAK+N,GAAGja,QAAQyJ,IACdmhB,EAAIxF,SAAS3hB,OAAOgG,UAbtB,GAZAmhB,EAAM,IAAI,GAAI,CACZtjB,MAAO,IAAkBke,cAAclkB,EAAOgG,OAC9C8d,SAAUqL,EACVttB,WAAW,IAGV8W,EAAEpe,QACH,eAAKoe,GAAGja,QAAQyJ,IACdmhB,EAAIxF,SAAS3hB,OAAOgG,KAIF,iBAAnBo8D,EAAa/kE,EAAsB,CACpC,MAAMmlE,EAAW3kE,EAAOuH,GACpBnP,KAAKksE,gBAAgBxB,eAAe9iE,EAAOuH,KAC7C,YAAiB+hB,EAAIjxB,UAAW,KAC9B,IAAI,GAAiBD,KAAKsN,QAAQyD,KAAK,IAAmBw4D,eAAeiD,UAAUD,KAClF,CAACx+D,eAAgB/N,KAAK+N,iBAG3B/N,KAAKksE,gBAAgBtkE,EAAOuH,IAAM+hB,EAgBtC,OAPA1E,EAAM0E,EAAIjxB,UAEN2H,EAA0B8iE,eAAe,cAE3CpmB,GAAuB93B,EAAKA,EAAI1b,eAAiB7Q,EAAY2H,EAA0B6kE,YAC/ExsE,GAAWA,EAAU8J,OAAOyiB,GAE/BA,EAGO,O,0CACdxsB,KAAKC,UAAUG,UAAUC,IAAI,0BAC7BL,KAAKmR,SAAS,8BAEdnR,KAAK+K,WAAW9K,UAAUG,UAAUC,IAAI,gBAExCL,KAAKq4D,iBAAmBn4D,SAASC,cAAc,OAC/CH,KAAKq4D,iBAAiBj4D,UAAUC,IAAI,qBAEpC,MAAMk4B,EAAUr4B,SAASC,cAAc,OACvCo4B,EAAQn4B,UAAUC,IAAI,WACtB,gBAAM,CAAC2U,QAASujB,EAAShqB,IAAK,2BAE9BvO,KAAK0sE,gBAAkB,YAAO,kDAAmD,CAC/ExvD,KAAM,2BACN7P,KAAM,QAGRrN,KAAK2sE,eAAiB,IAAI,GAAe,CACvCrjE,KAAM,YAERtJ,KAAK2sE,eAAe1sE,UAAU0C,MAAMC,QAAU,OAE9C5C,KAAK4sE,iBAAmB,IAAI,GAAe,CACzCtjE,KAAM,sBAERtJ,KAAK4sE,iBAAiB3sE,UAAU0C,MAAMC,QAAU,OAEhD5C,KAAK+K,WAAWhB,OAAO/J,KAAKq4D,iBAAkB9/B,EAASv4B,KAAK0sE,gBAAiB1sE,KAAK2sE,eAAe1sE,UAAWD,KAAK4sE,iBAAiB3sE,WAElI,YAAiBD,KAAK0sE,gBAAiB,KAClC11D,OAAOy0C,KAAKzrD,KAAKksE,iBAAiB/pE,QAAU,GAC7CoyB,GAAM,yCAEN,IAAI,GAAiBv0B,KAAKsN,QAAQyD,QAEnC,CAAChD,eAAgB/N,KAAK+N,iBAEzB,MAAM8+D,EAA2B,KAC/B7sE,KAAK2sE,eAAe1sE,UAAU0C,MAAMC,QAAUoU,OAAOy0C,KAAKzrD,KAAKksE,iBAAiB/pE,OAAS,GAAK,QA+DhG,OA5DA,IAAmBonE,eAAeC,mBAAmB3oE,KAAKizD,IACxD,IAAI,MAAMlsD,KAAUksD,EAClB9zD,KAAK8sE,aAAallE,EAAQ5H,KAAK2sE,eAAe9+D,SAGhDg/D,MAGF7sE,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAkB4H,IAChD5H,KAAKksE,gBAAgBxB,eAAe9iE,EAAOuH,IAC5CnP,KAAK8sE,aAAallE,EAAQ,KAAM5H,KAAKksE,gBAAgBtkE,EAAOuH,KAE5DnP,KAAK8sE,aAAallE,EAAQ5H,KAAK2sE,eAAe9+D,SAGhDg/D,IAEA7sE,KAAK+sE,wBAGP/sE,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAkB4H,IAChD5H,KAAKksE,gBAAgBxB,eAAe9iE,EAAOuH,MAM5CnP,KAAK+sE,sBAEL/sE,KAAKksE,gBAAgBtkE,EAAOuH,IAAIlP,UAAU0B,gBACnC3B,KAAKksE,gBAAgBtkE,EAAOuH,KAGrC09D,MAGF7sE,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,eAAiBgtE,IAClDA,EAAM1mE,QAAQ,CAACimE,EAAUloE,KACvB,MAAMpE,EAAYD,KAAKksE,gBAAgBK,GAAUtsE,UACjDqkD,GAAuBrkD,EAAWA,EAAU6Q,cAAezM,EAAM,OAIrErE,KAAKyrE,qBAAuBxxB,GAAA,EAAa15C,qBAAqB,CAC5DN,UAAWD,KAAKq4D,iBAChB73D,MAAM,EACNC,UAAU,EACVC,MAAO,GACPC,OAAQ,IACP,aAAaE,KAAK4hB,IACnBziB,KAAKe,UAAY0hB,EAEVw3B,GAAA,EAAav4C,kBAAkB+gB,KAGxCziB,KAAK+sE,sBAKE/sE,KAAKyrE,wBAGd,qBACEzrE,KAAKyrE,qBAAqB5qE,KAAK,KAC7Bb,KAAKe,UAAUN,UAAW,EAC1BT,KAAKe,UAAUU,SAIX,sBACN,OAAO,KAAWs0B,UAAU,sCAAsCl1B,KAAKosE,IACrEjtE,KAAK4sE,iBAAiB3sE,UAAU0C,MAAMC,QAAUqqE,EAAiB9qE,OAAS,GAAK,OAC/EgG,MAAMC,KAAKpI,KAAK4sE,iBAAiB/+D,QAAQuX,UAAU3hB,MAAM,GAAG6C,QAAQyJ,GAAMA,EAAGpO,UAE7EsrE,EAAiB3mE,QAAQsB,IACvB,MAAM4kB,EAAMxsB,KAAK8sE,aAAallE,GACxBiT,EAAS,YAAO,gCAAiC,CAACqC,KAAM,QAC9DsP,EAAIziB,OAAO8Q,GACX7a,KAAK4sE,iBAAiB/+D,QAAQ9D,OAAOyiB,GAErC,YAAiB3R,EAAS5Y,IAGxB,GAFA,OAAAyb,EAAA,GAAYzb,GAET+U,OAAOy0C,KAAKzrD,KAAKksE,iBAAiB/pE,QAAU,GAE7C,YADAoyB,GAAM,yCAIR1Z,EAAOzX,aAAa,WAAY,QAEhC,MAAM82B,EAAItyB,EAAOA,OACjBsyB,EAAEowC,eAAiB,GACnBpwC,EAAEqwC,eAAiB,GACnBrwC,EAAE8uC,cAAgB,GAElB,IAAmBO,eAAegC,mBAAmBrxC,GAAG,GAAMr5B,KAAKiqE,IAC9DA,GACDt+C,EAAI7qB,WAEL0f,QAAQ,KACTxG,EAAO2oB,gBAAgB,eAExB,CAACz1B,eAAgB/N,KAAK+N,sBCvPlB,MAAM,WAA4B,EACrC,OACR/N,KAAKC,UAAUG,UAAUC,IAAI,2BAC7BL,KAAKmR,SAAS,+CAEd,MAAM+7D,EAAiBlqE,IAKrB,MAAMy0B,EAAU,IAAI,GAAe,CACjCnuB,KAAMtG,EAAQsG,OAGV6jE,EAAa,IAAI,GAAI,CACzB/vD,cAAe,IAAI,KAAc,CAACF,KAAMla,EAAQoqE,SAAUzvD,SAAS,IACnE8U,gBAAiB,YAGb46C,EAAoB,IAAI,GAAI,CAChCjwD,cAAe,IAAI,KAAc,CAACF,KAAM,+BAAgCS,SAAS,IACjF8U,gBAAiB,YAGnBgF,EAAQ5pB,QAAQ9D,OAAOojE,EAAWltE,UAAWotE,EAAkBptE,WAE/DD,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAE/B,MAAMqtE,EAAkB,CAAClmE,EAAGpE,EAAQ2yD,UAC9BhwB,EAAM,KAAwB4nC,kBAAkBD,IACrD3nC,aAAe9iC,QAAU8iC,EAAM9iC,QAAQoD,QAAQ0/B,IAAM9kC,KAAM2sE,IAC1D,MAAMC,EAAgB,KACpB,MAAMt2D,EAAQ,KAAwBytB,QAAQ4oC,GAI9C,OAHAL,EAAW/vD,cAAcO,SAAWxG,EACpCk2D,EAAkBjwD,cAAcO,QAAU6vD,EAAeE,cAElDv2D,GAGTs2D,IAEAztE,KAAKwO,cAAcxN,iBAAiB,UAAW,KAC7C,MAAM2sE,GAAQR,EAAW/vD,cAAcO,QACjCiwD,EAAeP,EAAkBjwD,cAAcO,QAErD,GAAGgwD,IAAS,KAAwB/oC,QAAQ4oC,IAAmBI,IAAiBJ,EAAeE,cAC7F,OAGF,MAAMG,EAAqB,YAAKL,GAChCK,EAAczmE,EAAI,0BAClBymE,EAAcC,WAAaH,EAAO,WAAa,EAC/CE,EAAcH,cAAgBE,EAE9B,KAAwBG,qBAAqBT,EAAiBO,IAC7D,CAACl2D,MAAM,IAEV3X,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,kBAAoB+gC,IACrD,MAAM40B,EAAW,YAAqB50B,EAAOD,KAAK15B,GAC/CpE,EAAQ2yD,WAAaA,IACtB6X,EAAiBzsC,EAAO8D,gBACxB4oC,UAMRP,EAAc,CACZ5jE,KAAM,4BACN8jE,SAAU,+BACVzX,SAAU,qBAGZuX,EAAc,CACZ5jE,KAAM,sBACN8jE,SAAU,yBACVzX,SAAU,qBAGZuX,EAAc,CACZ5jE,KAAM,wBACN8jE,SAAU,2BACVzX,SAAU,0BAGZ,CACE,MAAMl+B,EAAU,IAAI,GAAe,CACjCnuB,KAAM,uBAGF0kE,EAAoB,IAAI,GAAI,CAChC5wD,cAAe,IAAI,KAAc,CAACF,KAAM,gBAAiBS,SAAS,IAClE8U,gBAAiB,YAGbw7C,EAAW,IAAI,GAAI,CACvB7wD,cAAe,IAAI,KAAc,CAACF,KAAM,sBAAuBS,SAAS,EAAMmW,SAAU,iCACxFrB,gBAAiB,YAGnBsB,EAAA,QAAgBC,WAAWnzB,KAAKozB,IAC9Bg6C,EAAS7wD,cAAcO,QAAUsW,EAAMmK,SAAS0M,cAAcojC,QAGhEz2C,EAAQ5pB,QAAQ9D,OAAOikE,EAAkB/tE,UAAWguE,EAAShuE,WAE7DD,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAE/B,KAAwBkuE,+BAA+BttE,KAAKmZ,IAC1Dg0D,EAAkB5wD,cAAcO,QAAU3D,EAE1Cha,KAAKwO,cAAcxN,iBAAiB,UAAW,KAC7C,MAAMg9D,EAAWgQ,EAAkB5wD,cAAcO,QAC9C3D,IAAYgkD,GACb,KAAwBoQ,8BAA8BpQ,IAEvD,CAACrmD,MAAM,Q,2SC1HH,MAAM,WAAuB,EAC1B,O,0CACd3X,KAAKC,UAAUG,UAAUC,IAAI,sBAC7BL,KAAKmR,SAAS,mCAEd,MAAMsmB,EAAU,IAAI,GAAe,IAE7Bu/B,EAA8B,IAAItnD,IAElCvJ,EAAU,KAAWkoE,mBAAmB,wBAAyB,CACrEC,UAAW,UACVztE,KAAM0tE,IACP,MAAM72C,EAAS,eACf62C,EAAUjoE,QAASkoE,IACjB,MAAMt9C,EAAM,IAAI,GAAI,CAClBsB,WAAY,IAAI,GAAW,CACzBtV,KAAMsxD,EAASllE,KACfA,KAAMouB,EACNx1B,MAAOssE,EAASC,YAElB/iD,SAAU8iD,EAASE,cAGrB1X,EAAUriD,IAAI65D,EAASC,UAAWv9C,KAGpC,MAAMoB,EAAOY,GAAkB,IAAI8jC,EAAU14B,UAAYp8B,IACvD,UAAKysE,YAAYzsE,KAGnB,UAAK0sE,mBAAmB/tE,KAAKguE,IAC3B,MAAM39C,EAAM8lC,EAAUhnD,IAAI6+D,EAASJ,WAC/Bv9C,EAKJA,EAAIsB,WAAW9uB,kBAAiB,GAJ9BgJ,QAAQC,MAAM,SAAUukB,EAAK29C,KAOjCp3C,EAAQ5pB,QAAQ9D,OAAOuoB,KAKzB,OAFAtyB,KAAK+K,WAAWhB,OAAO0tB,EAAQx3B,WAExBkG,MCpCI,MAAM,WAAuB,EAA5C,c,oBAKU,KAAAyX,QAOJ,GAEM,OACR5d,KAAKC,UAAUG,UAAUC,IAAI,sBAC7BL,KAAKmR,SAAS,YAEd,MAAM6M,EAAU,GAAiB,GAAI,cAAe,CAAC,CACnD3Q,KAAM,SACN6P,KAAM,qBACNC,QAAS,KACP,IAAI,GAAU,SAAU,CACtB4V,aAAc,SACd+D,mBAAoB,qBACpBlZ,QAAS,CAAC,CACRwW,QAAS,SACTiD,SAAU,KACR,KAAWy3C,UAEbxsC,UAAU,MAEX7jB,WAIPze,KAAKyN,OAAO1D,OAAOiU,GAEnBhe,KAAKiyB,WAAa,IAAI,GACtBjyB,KAAKiyB,WAAW7uB,aAAa,YAAa,IAC1CpD,KAAKiyB,WAAW7xB,UAAUC,IAAI,iBAAkB,cA4ChDL,KAAKsgD,QAAUpgD,SAASC,cAAc,OACtCH,KAAKsgD,QAAQlgD,UAAUC,IAAI,gBAE3BL,KAAK+uE,SAAW7uE,SAASC,cAAc,OACvCH,KAAK+uE,SAAS3uE,UAAUC,IAAI,oBAE5B,MAAM2uE,EAAa9uE,SAASC,cAAc,OAC1C6uE,EAAW5uE,UAAUC,IAAI,mBAEzB,MAAMmJ,EAAY,6CAClBwlE,EAAWjlE,OAAO/J,KAAK4d,QAAQqxD,KAAO,YAAOzlE,EAAW,CAAC6D,KAAM,OAAQ6P,KAAM,uBAC7E8xD,EAAWjlE,OAAO/J,KAAK4d,QAAQsxD,QAAU,YAAO1lE,EAAW,CAAC6D,KAAM,SAAU6P,KAAM,6BAClF8xD,EAAWjlE,OAAO/J,KAAK4d,QAAQuxD,QAAU,YAAO3lE,EAAW,CAAC6D,KAAM,WAAY6P,KAAM,4CACpF8xD,EAAWjlE,OAAO/J,KAAK4d,QAAQktB,cAAgB,YAAOthC,EAAW,CAAC6D,KAAM,SAAU6P,KAAM,mCACxF8xD,EAAWjlE,OAAO/J,KAAK4d,QAAQ43C,QAAU,YAAOhsD,EAAW,CAAC6D,KAAM,OAAQ6P,KAAM,wCAChF8xD,EAAWjlE,OAAO/J,KAAK4d,QAAQ4wD,SAAW,YAAOhlE,EAAW,CAAC6D,KAAM,WAAY6P,KAAM,8BAErFld,KAAK+K,WAAWhB,OAAO/J,KAAKiyB,WAAYjyB,KAAKsgD,QAAStgD,KAAK+uE,SAAUC,GACrEhvE,KAAK+K,WAAW9K,UAAUG,UAAUC,IAAI,2BAMxCL,KAAK4d,QAAQqxD,KAAKjuE,iBAAiB,QAAS,KAC9B,IAAI,GAAkBhB,KAAKsN,QACnCyD,SAGN/Q,KAAK4d,QAAQsxD,QAAQluE,iBAAiB,QAAS,KAC7C,IAAI,GAAkBhB,KAAKsN,QAAQyD,SAGrC/Q,KAAK4d,QAAQuxD,QAAQnuE,iBAAiB,QAAS,KAC7C,IAAI,GAAsBhB,KAAKsN,QAAQyD,SAGzC/Q,KAAK4d,QAAQktB,cAAc9pC,iBAAiB,QAAS,KACnD,IAAI,GAAoBhB,KAAKsN,QAAQyD,SAGvC/Q,KAAK4d,QAAQ43C,QAAQx0D,iBAAiB,QAAS,KAC7C,IAAI,GAAyBhB,KAAKsN,QAAQyD,SAG5C/Q,KAAK4d,QAAQ4wD,SAASxtE,iBAAiB,QAAS,KAC9C,IAAI,GAAehB,KAAKsN,QAAQyD,SAGlCkpC,GAAA,EAAaiI,oBAEbliD,KAAKovE,eAGA,eACL,MAAM/qC,EAAO,IAAgBokC,UACvBxhE,EAASo9B,EAAKl1B,GAAGgY,UAAS,GAChCnnB,KAAKiyB,WAAW7uB,aAAa,OAAQ,GAAK6D,GAE1CjH,KAAKsgD,QAAQv2C,OAAO,IAAI,KAAU,CAAC9C,OAAQA,IAAS+N,SACpDhV,KAAK+uE,SAAS9qE,UAAYogC,EAAKY,MAAQ,IAAgBC,gBAAgBb,EAAKY,OAAS,ICtJ1E,MAAM,WAAyB,EAA9C,c,oBACU,KAAA/zB,aAAyC,KAOvC,OACRlR,KAAKC,UAAUG,UAAUC,IAAI,yBAC7BL,KAAKmR,SAAS,cAEdnR,KAAKoR,WAAa,IAAI,EAAYC,IAChCrR,KAAKkR,aAAeG,IAGtB,MAAMC,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3BL,KAAKqvE,sBAAwB,IAAI,IAAW,CAC1C79D,MAAO,mBACPC,UAAW,MAGbzR,KAAKsvE,6BAA+B,IAAI,IAAW,CACjD99D,MAAO,iCACPC,UAAW,MAGbH,EAAavH,OAAO/J,KAAKqvE,sBAAsBpvE,UAAWD,KAAKsvE,6BAA6BrvE,WAE5F,MAAMsvE,EAAiB,KACrBvvE,KAAK0R,QAAQtR,UAAUkM,OAAO,eAAgBtM,KAAKqvE,sBAAsBntE,MAAMC,SAC5EnC,KAAKqvE,sBAAsBttE,MAAM3B,UAAUuR,SAAS,WACpD3R,KAAKsvE,6BAA6BvtE,MAAM3B,UAAUuR,SAAS,WAGhE3R,KAAKqvE,sBAAsBttE,MAAMf,iBAAiB,QAASuuE,GAC3DvvE,KAAKsvE,6BAA6BvtE,MAAMf,iBAAiB,QAASuuE,GAElE,MAAMh3C,EAAUr4B,SAASC,cAAc,OACvCo4B,EAAQn4B,UAAUC,IAAI,WACtB,gBAAMk4B,EAAS,uCAEfv4B,KAAK0R,QAAU,EAAa,CAACrE,KAAM,eAEnCrN,KAAK0R,QAAQ1Q,iBAAiB,QAAS,KACrC,MAAM4M,EAAQ5N,KAAKqvE,sBAAsBntE,MACnC2gC,EAAQ7iC,KAAKsvE,6BAA6BptE,MAEhDlC,KAAK0R,QAAQE,UAAW,EACxB,IAAgB49D,cAAc5hE,EAAOi1B,GAAOhiC,KAAMg4B,IAC7C74B,KAAKkR,cACNlR,KAAKkR,eAAerQ,KAAMoR,IACxB,IAAgBC,UAAU2mB,EAAW5mB,KAIzC,GAAezB,qBAAqBxQ,MACpC,IAAI,GAAiBA,KAAKsN,QAAQyD,KAAK,CACrC5N,KAAM,UACNqiC,WAAW,EACX53B,MAAO,kBACPhB,YAAa,gBACboyB,QAAUltB,GACD,IAAgB+7B,gBAAgBhV,EAAW/mB,SAM1D9R,KAAK6N,QAAQ9D,OAAO/J,KAAK0R,SACzB1R,KAAK+K,WAAWhB,OAAO/J,KAAKoR,WAAWnR,UAAWqR,EAAcinB,GAG3D,sBAML,OALAv4B,KAAKoR,WAAWjH,QAChBnK,KAAKkR,aAAe,KACpBlR,KAAKqvE,sBAAsBntE,MAAQ,GACnClC,KAAKsvE,6BAA6BptE,MAAQ,GAC1ClC,KAAK0R,QAAQE,UAAW,EACjB3O,MAAM0L,uB,cClFF,MAAM,WAA2B,KAC9C,cACE1L,MAAM,wDAAyD,KAAM,CAACu7B,UAAU,EAAMixC,YAAa,QAEnG,gBAAMzvE,KAAK4N,MAAO,mBAElB,YAAiB5N,KAAK0vE,WAAY,KAChC,MAAMvpE,EAAU,IAAgBwpE,cAAcxrC,EAAejiC,MAAOkiC,EAAmBliC,MAAO0tE,EAAc1tE,OAE5GiE,EAAQtF,KAAK,KACXb,KAAK2+B,QACHlyB,IACc,YAAbA,EAAItJ,OACLqxB,GAAS,CAACC,YAAa,sCACvBqO,EAASlxB,UAAW,KAIxBkxB,EAAS+sC,gBAAgB1pE,IACxB,CAAC4H,eAAgB/N,KAAK+N,iBAEzB,MAAM4jB,EAA4B,GAC5BnF,EAAMtsB,SAASC,cAAc,OACnCqsB,EAAIpsB,UAAUC,IAAI,eAClB,MAAM8jC,EAAiB,IAAI,IAAW,CACpC3yB,MAAO,YACPlI,KAAM,sBACNmI,UAAW,GACXogB,UAAU,IAENuS,EAAqB,IAAI,IAAW,CACxC5yB,MAAO,WACPlI,KAAM,0BACNmI,UAAW,KAEPm+D,EAAgB,IAAI,KAAc,CAAC/9C,UAAU,IACnDF,EAAYhsB,KAAKw+B,EAAgBC,EAAoBwrC,GAErD,MAAM7iE,EAAU,KACd,MAAMzD,EAAO66B,EAAejiC,MAAQ,IAAMkiC,EAAmBliC,MAE7D4gC,EAAS7Q,WAAW7uB,aAAa,aAAckG,GAC/Cw5B,EAAS7Q,WAAW8O,UAGtB/gC,KAAK+N,eAAe1N,IAAI8jC,EAAepiC,MAAvC/B,CAA8C,QAAS+M,GACvD/M,KAAK+N,eAAe1N,IAAI+jC,EAAmBriC,MAA3C/B,CAAkD,QAAS+M,GAE3D,MAAMs3B,EAAO,IAAgBokC,UACvBhW,EAAY,OAAAD,GAAA,GAAkBnuB,EAAKY,OACtCwtB,IACDmd,EAAcE,SAAW,MACdF,EAAc1tE,MAAM0Q,MAAM,MAGrCg9D,EAAc1tE,MAAQ,IAAMuwD,EAAUvwC,KAAK6tD,cAG7C,MAAMjtC,EAAW,IAAI,GAAS,CAC5BnR,cACA5jB,eAAgB/N,KAAK+N,eACrBmkB,iBAAiB,EACjBxgB,QAAS1R,KAAK0vE,WACdzjE,WAAY,MAGdugB,EAAIziB,OAAOo6B,EAAelkC,UAAWmkC,EAAmBnkC,UAAW6iC,EAAS7Q,YAC5EjyB,KAAKC,UAAU8J,OAAOyiB,EAAKojD,EAAc3vE,WAEzCD,KAAKye,QC9DM,MAAM,WAAuB,EAKhC,OACRze,KAAKC,UAAUkP,GAAK,qBAIpB,MAAMmtD,EAAS,EAAa,CAACjvD,KAAM,MAAO7D,UAAW,eACrDxJ,KAAK6N,QAAQ9D,OAAOuyD,GAEpB,YAAiBA,EAAQ,KACvB,IAAI,IACH,CAACvuD,eAAgB/N,KAAK+N,iBAEzB/N,KAAKgwE,YAAc,IAAI,EAAY,SAAW9tE,IAC5ClC,KAAKiwE,aAAa/tE,KAGpBlC,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,kBAAoBoS,IACrD,MAAM8xB,EAAY,IAAgBA,UAAU9xB,GACtCnL,EAASmL,EAAO+U,WACnB+c,EAAWlkC,KAAKkwE,eAAe7vE,IAAI4G,GACjCjH,KAAKkwE,eAAe7hE,OAAOpH,KAGlCjH,KAAK4N,MAAMmb,YAAY/oB,KAAKgwE,YAAY/vE,WAExCD,KAAKisB,WAAa,eAMV,aACR,MAAMikD,EAAiB,IAAI,GACrBtmE,EAAOsmE,EAAetmE,KAM5B,OALAA,EAAKuF,GAAK,WACVvF,EAAKxJ,UAAUC,IAAI,sBACnB,GAAkB2J,qBAAqBJ,EAAM,KAC3C5J,KAAK+4B,cACJr0B,GAAW,GACPwrE,EAGC,UACRlwE,KAAKisB,WAAWrW,QAMR,sBACL,cAAc6iD,IAAS,IAC1Bz4D,KAAKgwE,YAAYjuE,MAAM0J,QAGlB,aAAab,GACf5K,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGdlO,KAAKisB,WAAWrW,QAChB,MAAMqW,EAAajsB,KAAKisB,WAAWjc,MACnChQ,KAAK+K,WAAWM,iBAAmB,KACnCrL,KAAK+K,WAAW9K,UAAUuS,YAAc,GAExC,IAAgBqqB,mBAAmBjyB,OAAOlG,EAAW,UAAU7D,KAAK07B,IAClE,IAAItQ,IACF,OAGF,MAAMikD,EAAiBlwE,KAAKkwE,eAAiBlwE,KAAKmwE,aAElD,IAAIC,EAAa,KACf,MAAMz0C,EAAYC,GAAA,EAAWj7B,OAAS,GAAK,KAAO,EACtC47B,EAAS93B,OAAO,EAAGk3B,GAE3Br1B,QAASW,IACXipE,EAAe7vE,IAAI4G,KAGjBs1B,EAASp6B,SACXiuE,OAAa1rE,EACb1E,KAAK+K,WAAWM,iBAAmB,OAIvC+kE,IACApwE,KAAK+K,WAAWM,iBAAmB,KAC9B+kE,EACDA,IAEApwE,KAAK+K,WAAWM,iBAAmB,MAIvC,OAAAkB,EAAA,GAAevM,KAAK+K,WAAW9K,UAAWiwE,EAAetmE,QAItD,OAEL,OADA5J,KAAKiwE,eACEhtE,MAAM8N,QCxHF,MAAM,WAAuB,EAI1C,OAIE,GAHA/Q,KAAKC,UAAUkP,GAAK,2BACpBnP,KAAKmR,SAAS,kBAEV,GAAkBk/D,YAAY,GAAe9D,UAAW,CAC1D,MAAM+D,EAAW,GAAkBzmE,iBACnC,GAAkB0mE,mBAAmBD,EAAU,GAAe/D,UAAUtsE,UAAU8J,OAAOumE,GACzF,GAAkBtmE,qBAAqBsmE,EAAU,MAAM,GAIzD,MAAMvlE,EAAa,GAAkBylE,YAAY,GAAejE,UAChEvsE,KAAK+K,WAAW9K,UAAU8oB,YAAYhe,EAAW9K,WACjDD,KAAK+K,WAAaA,EAGpB,SACK/K,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGdlO,KAAKywE,YAAc,GAAkBlE,SACrC,GAAkBmE,YAAY,GAAenE,UAC7C,GAAkBoE,cAIpB,qBACE,GAAkBN,YAAYrwE,KAAKywE,aAAatmE,QAGlD,UACE,GAAkBumE,YAAY1wE,KAAKywE,aACnC,GAAkBE,cAGpB,sBAEE,OADA,GAAkBN,YAAY,GAAe9D,UAAUpiE,QAChDlH,MAAM0L,uBA1CA,GAAA49D,SAAW,E,qBCikBrB,MAAM,GAMX,YAAYvpE,GASV,GAHAhD,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,wBAE1B2C,EAAQ4tE,sBACT5wE,KAAKC,UAAU8J,OAAOghC,MACtB/qC,KAAKC,UAAUG,UAAUC,IAAI,4BACxB,GAAI2C,EAAQw1B,YAIjBx4B,KAAKC,UAAUG,UAAUC,IAAI,oBAJC,CAC9B,MAAMkwC,EAAKrwC,SAASC,cAAc,MAClCH,KAAKC,UAAU8J,OAAOwmC,GAKxBvwC,KAAK6N,QAAU7N,KAAKwgC,yBAEjBx9B,EAAQsG,OACTtJ,KAAK4N,MAAQ1N,SAASC,cAAc,OACpCH,KAAK4N,MAAMxN,UAAUC,IAAI,kBAAmB,6BAC5C,gBAAM,CAAC2U,QAAShV,KAAK4N,MAAOW,IAAKvL,EAAQsG,OACzCtJ,KAAK6N,QAAQ9D,OAAO/J,KAAK4N,QAGxB5K,EAAQu1B,UACTv4B,KAAKu4B,QAAUv4B,KAAKwgC,yBACpBxgC,KAAKu4B,QAAQn4B,UAAUC,IAAI,iCAEJ,IAApB2C,EAAQu1B,SACT,gBAAM,CAACvjB,QAAShV,KAAKu4B,QAAShqB,IAAKvL,EAAQu1B,WAK1C,yBACL,MAAM1qB,EAAU3N,SAASC,cAAc,OAGvC,OAFA0N,EAAQzN,UAAUC,IAAI,gCACtBL,KAAKC,UAAU8J,OAAO8D,GACfA,GAIJ,MAAMupD,GAAkB,CAAC/7B,EAAsB/xB,EAAoBivB,KACxE,MAAMd,EAAU,IAAI,GAAe,CAACnuB,OAAMivB,YAE1C,OADA8C,EAAStxB,OAAO0tB,EAAQx3B,WACjBw3B,EAAQ5pB,SAGJk9B,GAAoB,KAC/B,MAAMhQ,EAAY76B,SAASC,cAAc,OAEzC,OADA46B,EAAU36B,UAAUC,IAAI,sBACjB06B,GAGH81C,GAAiB,IA9lBhB,cAA6B,EAelC,cACE5tE,MAAM,CACJ2M,UAAW1P,SAAS4uC,eAAe,eACnC7/B,eAAgB,SANZ,KAAA5E,aAAuG,GAW7GrK,KAAKgwE,YAAc,IAAI,EAAY,UACnC,MAAMc,EAAgB9wE,KAAK4P,UAAUC,cAAc,8BACnDihE,EAAc/mE,OAAO/J,KAAKgwE,YAAY/vE,WAEtC,MAYM8wE,EAAkB,KACtB,IAAI,GAAe/wE,MAAM+Q,QAI3B/Q,KAAKgxE,QAAUhxE,KAAK4P,UAAUC,cAAc,wBAE5C,MAAMohE,EAA+D,CACnE5jE,KAAM,UACN6P,KAAM,gBACNC,QAAS,KACP,IAAI,GAAend,MAAM+Q,QAE3BgE,OAAQ,MACS,IAAmB00D,eAAeC,iBAAiB,GAAG,GACrDvnE,SAAW,IAAmBsnE,eAAeyH,gBAAgB,IAI3EC,EAAqB,IAAI,KAAc,CAC3C7kE,QAAQ,EACRqR,QAAuC,UAA9B/U,EAAA,QAAU25D,WAAWj5D,OAEhC6nE,EAAmBpvE,MAAMf,iBAAiB,SAAU,KAClD4H,EAAA,QAAUw1B,SAAS8jC,MAAQiP,EAAmBpvE,MAAM4b,QAAU,QAAU,MACxEoW,EAAA,QAAgBouC,YAAY,WAAYv5D,EAAA,QAAUw1B,UAClDx1B,EAAA,QAAU6F,cAAc,kBAG1B7F,EAAA,QAAU5H,iBAAiB,eAAgB,KACzCmwE,EAAmBztE,iBAA+C,UAA9BkF,EAAA,QAAU25D,WAAWj5D,QAG3D,MAAM8nE,EAAoE,CAAC,CACzE/jE,KAAM,QACN6P,KAAM,gBACNC,QAAS,KACP3R,WAAW,KACT,GAAa8/B,QAAQ,GAAa7zB,OACjC,KAEJw5D,EAAY,CACb5jE,KAAM,OACN6P,KAAM,WACNC,QAAS4zD,GACR,CACD1jE,KAAM,WACN6P,KAAM,WACNC,QAAS,KACP,IAAI,GAAend,MAAM+Q,SAE1B,CACD1D,KAAM,WACN6P,KAAM,WACNC,QAAS,OAGTC,cAAe+zD,GACd,CACD9jE,KAAM,aACN6P,KAAM,aACNC,QAAS,OAGTC,cAAe,IAAI,KAAc,CAC/B9Q,QAAQ,EACRqR,SAAS,EACTmW,SAAU,gCAEX,CACDzmB,KAAM,OACN6P,KAAM,mBACNC,QAAS,KACP,GAAak0D,aAAa,kBAE3B,CACDhkE,KAAM,MACN6P,KAAM,YACNC,QAAS,KACP,MAAM7U,EAAIpI,SAASC,cAAc,KACjCmI,EAAEuM,OAAS,SACXvM,EAAEqpD,KAAO,kDACTzxD,SAASiW,KAAKpM,OAAOzB,GACrBA,EAAE2yB,QACFzvB,WAAW,KACTlD,EAAE3G,UACD,KAEJ,CACD0L,KAAM,SACN6P,KAAM,2BACNC,QAAS,KACPta,QAAQC,IAAI,CACVwuE,GAAA,EAAe38D,IAAI,CAAC48D,WAAY,MAChCD,GAAA,EAAejjE,OAAO,eACrBxN,KAAK,KACNi6C,SAAS6W,KAAO,iCAGpB58C,OAAQ,IAAM,KAAIy8D,cACjB,CACDnkE,KAAM,SACN6P,KAAM,kCACNC,QAAS,KACPm0D,GAAA,EAAejjE,OAAO,aAAaxN,KAAK,KACtCi6C,SAAS6W,KAAO,wCAGpB58C,OAAQ,IAAM,KAAIy8D,eAGpBxxE,KAAKyxE,SAAW,GAAiB,GAAI,eAAgBL,EAAcnvE,IACjEmvE,EAAY9qE,QAAQuU,IACfA,EAAO9F,QACR8F,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAASuO,EAAO9F,cAItD/U,KAAKyxE,SAASrxE,UAAUuB,OAAO,cAC/B3B,KAAKyxE,SAASrxE,UAAUC,IAAI,uBAAwB,cAEpDL,KAAKgxE,QAAQlgE,cAAciQ,aAAa/gB,KAAKyxE,SAAUzxE,KAAKgxE,SAE5D,MAAMhzD,EAAUhe,KAAKyxE,SAAS5hE,cAAc,aAEtC6hE,EAAgBxxE,SAASC,cAAc,KAC7CuxE,EAAc/f,KAAO,iEACrB+f,EAAc78D,OAAS,SACvB68D,EAAcC,IAAM,sBACpBD,EAActxE,UAAUC,IAAI,mBAC5BqxE,EAAc1wE,iBAAiB,IAAmBiB,IAChDA,EAAE2vE,kBACF,iBAEF,MAAMlhE,EAAIxQ,SAASC,cAAc,QACjCuQ,EAAEtQ,UAAUC,IAAI,wBAChBqQ,EAAEzM,UAAY,eAAiB,KAAI4tE,OAAS,UAAY,KAAIC,YAC5DJ,EAAc3nE,OAAO2G,GACrBsN,EAAQ5d,UAAUC,IAAI,cACtB2d,EAAQjU,OAAO2nE,GAEf1xE,KAAK+xE,WAAa,GAAiB,GAAI,WAAY,CAAC,CAClD1kE,KAAM,aACN6P,KAAM,aACNC,QAAS,KACP,IAAI,GAAiBnd,MAAM+Q,SAE5B,CACD1D,KAAM,WACN6P,KAAM,WACNC,QAlKsB,KACtB,IAAI,GAAiBnd,MAAM+Q,KAAK,CAC9B5N,KAAM,OACNqiC,WAAW,EACXxG,QAAUltB,IACR,IAAI,EAAe9R,MAAM+Q,KAAKe,IAEhClE,MAAO,kBACPhB,YAAa,oBA2Jd,CACDS,KAAM,aACN6P,KAAM,iBACNC,QAAS4zD,KAEX/wE,KAAK+xE,WAAWvoE,UAAY,0EAC5BxJ,KAAK+xE,WAAWtwD,mBAAmB,aAAc,6GAIjDzhB,KAAK+xE,WAAW5iE,GAAK,WACrB2hE,EAAcv5C,mBAAmBxtB,OAAO/J,KAAK+xE,YAE7C/xE,KAAKgwE,YAAYjuE,MAAMf,iBAAiB,QAAS,IAAMhB,KAAKgyE,aAAc,CAACr6D,MAAM,IAIjF3X,KAAKiyE,cAAgB/xE,SAASC,cAAc,QAC5CH,KAAKiyE,cAAczoE,UAAY,2CAE/BynE,EAAWj8D,QAAQjL,OAAO/J,KAAKiyE,eAE/BrpE,EAAA,QAAU5H,iBAAiB,gBAAkBorE,IAC3C,GAAiB,IAAdA,EAAOj9D,GAAU,CAElB,MAAMxK,EAAQynE,EAAO8F,mBACrBlyE,KAAKiyE,cAAc1oD,UAAY,GAAK,YAAa5kB,EAAO,GACxD3E,KAAKiyE,cAAc7xE,UAAUkM,OAAO,QAAS3H,MAIjD,IAAgBsuD,YAAY,kBAE5Bl/B,EAAA,QAAgBC,WAAWnzB,KAAKozB,IAC9B,MAAM++B,EAAe/+B,EAAM++B,cAAgB,GAC3C,IAAI,IAAIhoD,EAAI,EAAG7I,EAAS6wD,EAAa7wD,OAAQ6I,EAAI7I,IAAU6I,EACzD+oB,EAAA,QAAgBo+C,YAAYnf,EAAahoD,GAAI,kBAK3C,aACN,MAAMonE,EAAkBpyE,KAAK4P,UAAUC,cAAc,qBAE/C9E,EAAa,IAAI,IAAWqnE,GAE5Br5C,EAAQ,KAEV/4B,KAAKgxE,QAAQ/1C,SAIjBj7B,KAAKqK,aAAe,CAClBkyB,SAAU,IAAI,EAAY,eAAgB,gBAAY73B,OAAWA,OAAWA,OAAWA,EAAWq0B,GAClG45B,eAAgB,IAAI,EAAY,gBAAiB,gBAAYjuD,OAAWA,OAAWA,OAAWA,EAAWq0B,GACzG9tB,SAAU,IAAI,EAAY,kBAAmB,YAC7CkoD,OAAQ,IAAI,GAAY,EAAO,YAAY,EAAM,uBAAuB,GAAM,EAAOp6B,GACrFg6B,OAAQ,IAAI,EAAY,SAAU,YAAY,EAAM,uBAAuB,GAAM,EAAMh6B,IAGzF,MAAM8T,EAAc7sC,KAAK6sC,YAAc,IAAI,GAAe,CACxDU,UAAW,CAAC,CACVpmC,YAAa,2BACbmC,KAAM,cACNnG,KAAM,SACL,CACDgE,YAAa,gCACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,yBACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,8BACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,2BACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,gCACbmC,KAAM,kBACNnG,KAAM,UAER4H,aACAV,aAAcrK,KAAKqK,aACnBqkD,YAAY,EACZE,eAAe,EACfrnC,YAAY,IAGd6qD,EAAgB3yD,QAAQotB,EAAYC,IAAIh8B,cAAcA,eACtD/F,EAAW9K,UAAU8J,OAAO8iC,EAAY5sC,WAGtC4sC,EAAY4B,SAAS,CACnBxnC,OAAQ,GAAGkgB,WACXnf,SAAU,IAEZ6kC,EAAY1+B,UAAU,GACtB0+B,EAAY/mC,MAAK,GAKnB,IAAIusE,EAAgC,GAChCC,EAAyB,GAAGnrD,WAC5BorD,EAAkB,EAClBC,EAAkB,EACtB,MAAMC,EAAe,KAEnBzyE,KAAKgwE,YAAY/vE,UAAUG,UAAUkM,OAAO,kBAA6C,IAA1B+lE,EAAelwE,QAC9EnC,KAAKgwE,YAAY/vE,UAAUG,UAAUkM,OAAO,cAAe+lE,EAAelwE,QAEvEkwE,EAAelwE,OAChBnC,KAAKgwE,YAAYjuE,MAAMY,MAAMykC,YAAY,gBAAkBirC,EAAeA,EAAelwE,OAAS,GAAG2Z,wBAAwBitB,MAAQ/oC,KAAKgwE,YAAYjuE,MAAM+Z,wBAAwBiB,KAAQ,MAE5L/c,KAAKgwE,YAAYjuE,MAAMY,MAAM+vE,eAAe,kBAI1CC,EAASzyE,SAASC,cAAc,OACtCwyE,EAAOvyE,UAAUC,IAAI,iBACrBsyE,EAAO3xE,iBAAiB,QAAUiB,IAChC,MAAM4S,EAAS,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAAQ,iBACzC,IAAIA,EACF,OAGF,MAAMtG,EAAMsG,EAAOzI,QAAQmC,IAC3B,GAA4B,IAAzBA,EAAIgO,QAAQ,SAAgB,CAC7B,MAAOnV,EAAGyrD,EAASwC,GAAW9mD,EAAIyxC,MAAM,KACxCuyB,GAAmB1f,EACnB2f,GAAmBnd,OAEnBid,EAAiB/jE,EAAI4Y,WAGvBtS,EAAO7T,iBAAiB,QAAS,KAC/B4xE,EAAe/9D,KAGjB7U,KAAKgwE,YAAY/vE,UAAU8J,OAAO8K,GAClC7U,KAAKgwE,YAAY7kE,SAASnL,KAAKgwE,YAAY9tE,MAAQ,IACnDmwE,EAAe1sE,KAAKkP,GACpB49D,MAGF5lC,EAAYC,IAAIh8B,cAAc/G,OAAO4oE,GAErC,MAAME,EAAe,CAACtkE,EAAsBX,KAC1C,MAAM4e,EAAMtsB,SAASC,cAAc,OACnCqsB,EAAIpsB,UAAUC,IAAI,iBAElB,MAAMo2B,EAAWv2B,SAASC,cAAc,kBA2BxC,OA1BAs2B,EAASr2B,UAAUC,IAAI,uBAAwB,SAC/Co2B,EAASrzB,aAAa,SAAU,KAChCqzB,EAASr2B,UAAUC,IAAI,aAEvBmsB,EAAIpgB,QAAQmC,IAAM,GAAKA,EACpBA,EAAIisB,iBACQ91B,IAAVkJ,IACDA,EAAQ,IAAI,KAAU,CAAC3G,OAAQsH,EAAI4Y,aAAanS,SAGlDyhB,EAASrzB,aAAa,OAAQ,GAAKmL,IAEnCkoB,EAASr2B,UAAUC,IAAI,wBAGtBuN,IACoB,iBAAZ,EACP4e,EAAIvoB,UAAY2J,GAEhB,OAAArB,EAAA,GAAeigB,EAAK5e,GACpB4e,EAAIziB,OAAO6D,KAIf4e,EAAIwR,sBAAsB,aAAcvH,GAEjCjK,GAGHomD,EAAkB/9D,IAEM,IADhBA,EAAOzI,QAAQmC,IACpBgO,QAAQ,SACbg2D,EAAkBC,EAAkB,EAEpCF,EAAiB,GAAGnrD,WAGtBtS,EAAOlT,SACP,YAAiB0wE,EAAgBx9D,GAEjCrJ,WAAW,KACTinE,IACAzyE,KAAKgwE,YAAY7kE,SAASnL,KAAKgwE,YAAY9tE,QAC1C,IAGLlC,KAAKgwE,YAAY9iE,QAAU,KACzBmlE,EAAe/rE,QAAQyJ,IACrB6iE,EAAe7iE,MAInB/P,KAAKgwE,YAAY7kE,SAAYjJ,IAgB3B,GAfA2qC,EAAYrB,cACZqB,EAAY4B,SAAS,CACnBxnC,OAAQqrE,EACRtqE,SAAUsqE,OAAiB5tE,EAAY,EACvCkG,MAAO1I,EACP2wD,QAAS0f,EACTld,QAASmd,IAEX3lC,EAAY/mC,MAAK,GAEjB6sE,EAAO1uE,UAAY,GACnB4oC,EAAYC,IAAI1sC,UAAUuB,OAAO,SAI7B2wE,GAAkBpwE,EAAMoJ,OAAQ,CAClC,MAAM2gB,EAAa4gB,EAAY5gB,WAAWjc,MAC1CnN,QAAQC,IAAI,CAEV,IAAmBi5B,iBAAiB75B,GAAOiE,QAAQtF,KAAK,EAAE46B,aAAaA,EAAQhzB,IAAI8X,GAAKA,EAAEtZ,SAC1F,IAAgB41B,mBAAmB36B,GAAO,KACzCrB,KAAKq8B,IACN,IAAIjR,IAAc,OACF,IAAIpoB,IAAIq5B,EAAQ,GAAGt5B,OAAOs5B,EAAQ,KAE1C52B,QAAQW,IACd0rE,EAAO5oE,OAAO8oE,EAAa5rE,MAG7B4lC,EAAYC,IAAI1sC,UAAUkM,OAAO,SAAUqmE,EAAO1uE,aAKtD,IAAIsuE,GAAmBrwE,EAAMoJ,OAAQ,CACnC,MAAMwnE,EAAoB,GAC1B,aAAa5wE,EAAO4wE,GACpBA,EAAMxsE,QAAQysE,IACZJ,EAAO5oE,OAAO8oE,EAAa,QAAUE,EAASlgB,QAAU,IAAMkgB,EAAS1d,QAAS0d,EAASnlE,UAG3Fi/B,EAAYC,IAAI1sC,UAAUkM,OAAO,SAAUqmE,EAAO1uE,aAItD4oC,EAAYz+B,KAAK6jD,yBAAyBjxD,iBAAiB,YAAciB,IACvE,MAAM4S,EAAS,OAAA4rB,GAAA,GAAUx+B,EAAE4S,OAAQ,MACnC,IAAIA,EACF,OAGF,MAAMlJ,EAAc,OAAAiT,GAAA,GAAgB/J,EAAQ,gBAC5C,IAAIlJ,GAAeA,EAAYvL,UAAUuR,SAAS,wBAA0BhG,EAAYvL,UAAUuR,SAAS,uBACzG,OAGF,MAAM1K,EAAS4N,EAAOm+D,aAAa,gBAAgB7rD,WACnD4M,EAAA,QAAgBC,WAAWnzB,KAAKozB,IAC9B,MAAM++B,EAAe/+B,EAAM++B,cAAgB,GAC3C,GAAGA,EAAa,KAAO/rD,EAAQ,CAC7B,YAAiB+rD,EAAc/rD,GAC/B+rD,EAAantD,QAAQoB,GAClB+rD,EAAa7wD,OAAS,KACvB6wD,EAAa7wD,OAAS,IAGxB4xB,EAAA,QAAgBouC,YAAY,eAAgBnP,GAC5C,IAAI,MAAM/rD,KAAU+rD,EAClBj/B,EAAA,QAAgBo+C,YAAYlrE,EAAQ,oBAIzC,CAACkkB,SAAS,IAEb,IAAI8nD,EAAkB/yE,SAASC,cAAc,OAC7C8yE,EAAgB7yE,UAAUC,IAAI,2BAC9B4yE,EAAgBlpE,OAAO/J,KAAKqK,aAAa8oD,OAAOvpD,MAChD5J,KAAKqK,aAAa8oD,OAAOlzD,UAAU8J,OAAOkpE,GACnB,IAAI,IAAYA,GAAvC,IAGIC,EADAnjD,GAAQ,EAGZ,MAAMid,EAAa,YAAiBolC,EAAgBthE,cAAe,YAAa,IAAM3B,IACjF+jE,GAAuBlmE,aAAakmE,GAE7B,IAAP/jE,GAAa4gB,IACd8c,EAAY1+B,UAAU,GAAG,GACzBnO,KAAKgwE,YAAY/iE,eACjBimE,EAAwB3nE,OAAOC,WAAW,KACxC0nE,EAAwB,EACxBlzE,KAAK+xE,WAAW3xE,UAAUuB,OAAO,cAChC,MAGLouB,GAAQ,IAGVid,EAAW,GAEX,MACMmmC,EAAU,KACdnzE,KAAKyxE,SAASrxE,UAAUuB,OAFF,cAGtB3B,KAAKgxE,QAAQ5wE,UAAUC,IAHD,cAItBL,KAAK+xE,WAAW3xE,UAAUC,IAAI,aAC9BL,KAAKyxE,SAAS3gE,cAAc4P,kBAAkBtgB,UAAUkM,OAAO,cAAc,GAEzE,qBAAqByC,EAAA,EAAwBC,eAAe,kBAC9DD,EAAA,EAAwBoB,SAAS,CAC/BC,MAAO,KACL2oB,KAEF51B,KAAM,kBAIV6pC,EAAW,IAGbhtC,KAAKgwE,YAAYjuE,MAAMf,iBAAiB,QAASmyE,GACjDA,IAEAnzE,KAAKgxE,QAAQhwE,iBAAiB,QAAUiB,IACtCjC,KAAKyxE,SAASrxE,UAAUC,IAvBF,cAwBtBL,KAAKgxE,QAAQ5wE,UAAUuB,OAxBD,cAyBtB3B,KAAKyxE,SAAS3gE,cAAc4P,kBAAkBtgB,UAAUkM,OAAO,cAAc,GAE7EyC,EAAA,EAAwB6B,aAAa,iBAErCo8B,EAAW,KAGb,MAAMomC,EAAuBlzE,SAASC,cAAc,UACpDizE,EAAqBhzE,UAAUC,IAAI,WAAY,eAC/CL,KAAKqK,aAAa0oD,OAAOjpD,OAAOC,OAAOqpE,GACvCA,EAAqBpyE,iBAAiB,QAAS,KAC7ChB,KAAKqK,aAAa0oD,OAAO5oD,QACzB4pB,EAAA,QAAgBouC,YAAY,eAAgB,QAsElD,KAAe0O,eAAiBA,GACjB,UC/nBA,MAAM,GAOnB,YAAoBzkD,GAAA,KAAAA,OANZ,KAAAC,QAA8B,GAC9B,KAAAgnD,WAA4C,IAAI3jE,IAChD,KAAAu6D,OAAuB,GAEvB,KAAAqJ,aAAe,IAMvB,aAAavnB,GACX,MAAMv4C,EAAUxT,KAAKqzE,WAAWrjE,IAAI+7C,GACjCv4C,IACEA,EAAQiZ,MAAMtqB,SACfqR,EAAQiZ,MAAMwP,cAAc1b,GAAKA,EAAEwrC,SAAWA,GAC1Cv4C,EAAQiZ,MAAMtqB,OAGhBnC,KAAKuzE,YAAY//D,EAAQiZ,OAFzB,YAAiBzsB,KAAKiqE,OAAQz2D,EAAQiZ,QAM1CzsB,KAAKqzE,WAAWhlE,OAAO09C,IAI3B,gBAAgBA,EAAqBllD,GACnC,MAAM2M,EAAUxT,KAAKqzE,WAAWrjE,IAAI+7C,GACjCv4C,IACDA,EAAQ3M,IAAMA,GAIlB,UAAUklD,EAAqB3nD,EAAoBU,GAGjD,MAAMwvD,EAAYlwD,EAAQ+jB,KACpBthB,EAAMzC,EAAQyC,IACpB,IACI4lB,EADA7gB,EAASxH,EAAQovE,UAAYpvE,EAAQwH,OAItCA,IAAWhD,EAAA,QAAU6O,MAAQrT,EAAQ6C,SAAW2B,EAAA,QAAU6O,MAASrT,EAAgBqvE,YAAc7nE,IAClGA,EAASA,EAAOub,UAAS,IAI3BnnB,KAAK0zE,aAAa3nB,GAElB,MAAM4nB,EAAe,CAAC5nB,SAAQllD,MAAKytD,aACnC,GAAGt0D,KAAKqsB,QAAQlqB,OAAQ,CACtB,IAAIyxE,EACAC,GAAgB,EACpB,IAAI,IAAI7oE,EAAI,EAAGA,EAAIhL,KAAKqsB,QAAQlqB,SAAU6I,EAAG,CAC3C,MAAM+gD,EAAS/rD,KAAKqsB,QAAQrhB,GACtB6lB,EAAOxuB,KAAKyuB,IAAIi7B,EAAOuI,UAAYA,GAGzC,GAFavI,EAAOngD,SAAWA,GAAUilB,GAAQ7wB,KAAKszE,cAKpD,GAFAO,EAAe7oE,EAEO,cAAnBhL,KAAKosB,KAAKjpB,KACX,WAGF0wE,GAAgB,EAGlB,GAAsB,cAAnB7zE,KAAKosB,KAAKjpB,MACR0D,EAAMklD,EAAOllD,IACd,MAaN,IARqB,IAAlBgtE,IACDD,EAAc5zE,KAAKqsB,QAAQwnD,IAOzBD,EACC,CACHnnD,EAAQmnD,EAAYnnD,MAEpB,IAAIzhB,EAAI,EAAG8oE,EAA0B,EACrC,KAAM9oE,EAAIyhB,EAAMtqB,SAAU6I,EAAG,CAC3B,MAAM+oE,EAAatnD,EAAMzhB,GAAGspD,UACtB0f,EAAOvnD,EAAMzhB,GAAGnE,IAEtB,GAAGytD,EAAYyf,EACb,MAKF,GAJUzf,IAAcyf,IACtBD,EAA0BE,GAGzBF,GAA2BjtE,EAAMitE,EAClC,MAIJrnD,EAAMhoB,OAAOuG,EAAG,EAAG2oE,QApBJ3zE,KAAKiqE,OAAOtkE,KAAK8mB,EAAQ,CAACknD,SAuB3C3zE,KAAKiqE,OAAOtkE,KAAK8mB,EAAQ,CAACknD,IAK5B,MAAMM,EAAc,CAAC3f,YAAW1oD,SAAQ/E,IAAKzC,EAAQyC,IAAK4lB,SAC1D,IAAIynD,EAAc,EAClB,KAAMA,EAAcl0E,KAAKqsB,QAAQlqB,UAC5BnC,KAAKqsB,QAAQ6nD,GAAartE,IAAMA,KADMqtE,GAM3Cl0E,KAAKqsB,QAAQ5nB,OAAOyvE,EAAa,EAAG,CAAC5f,YAAW1oD,SAAQ/E,IAAKzC,EAAQyC,IAAK4lB,UAC1EzsB,KAAKuzE,YAAY9mD,GAEjBzsB,KAAKqzE,WAAW1+D,IAAIo3C,EAAQkoB,GAqD9B,YAAYxnD,GASR,IAAIA,EAAMtqB,OACR,OAGF,MAAM4tB,EAAQtD,EAAM,GAAGs/B,OAIvB,GAAoB,IAAjBt/B,EAAMtqB,OAGP,YAFA4tB,EAAM3vB,UAAUC,IAAI,iBAAkB,iBAItC0vB,EAAM3vB,UAAUuB,OAAO,iBACvBouB,EAAM3vB,UAAUC,IAAI,kBAItB,MAAM8B,EAASsqB,EAAMtqB,OAAS,EAC9B,IAAI,IAAI6I,EAAI,EAAGA,EAAI7I,IAAU6I,EAAG,CACfyhB,EAAMzhB,GAAG+gD,OACjB3rD,UAAUuB,OAAO,gBAAiB,kBAI3C,MAAMmmD,EAAOr7B,EAAMA,EAAMtqB,OAAS,GAAG4pD,OACrCjE,EAAK1nD,UAAUuB,OAAO,kBACtBmmD,EAAK1nD,UAAUC,IAAI,iBAKvB,uBAAuBwG,GACrB,MAAM2M,EAAUxT,KAAKqsB,QAAQ5b,KAAK4tD,GAAKA,EAAEx3D,MAAQA,GAC9C2M,GACDxT,KAAKuzE,YAAY//D,EAAQiZ,OAI7B,UACEzsB,KAAKqsB,QAAU,GACfrsB,KAAKiqE,OAAS,GACdjqE,KAAKqzE,WAAWlpE,SCrOL,MAAM,WAAwB,KAqB3C,YAAYgqE,EAAuBC,EAA+CpxE,EAO9D,IA4ClB,GA3CAC,MAAM,oBAAqBD,EAAQqxE,UAAY,GAAK,CAAC,CACnDjgD,QAAS,aACTiD,SAAU,KACLr3B,KAAKo0E,QACNp0E,KAAKo0E,OAAOp0E,KAAKs0E,aAAa5f,UAAY,IAAO,KAGpD,CACDtgC,QAAS,SACT6lC,UAAU,IACR,OAAF,QAAG9jD,MAAM,EAAMqgB,iBAAiB,GAASxzB,IAlBV,KAAAoxE,SAA+C,KAAApxE,UAsKlF,KAAAuxE,YAAetyE,IACbjC,KAAKw0E,cAAcC,SAASz0E,KAAKw0E,cAAcE,WAAa,GAC5D10E,KAAKy0E,WAEFz0E,KAAKw0E,cAAc9f,YAAc10D,KAAK20E,SAASjgB,WAChD10D,KAAK40E,QAAQxxE,aAAa,WAAY,QAGxCpD,KAAK0R,QAAQ8xB,gBAAgB,aAG/B,KAAAqxC,YAAe5yE,IACbjC,KAAKw0E,cAAcC,SAASz0E,KAAKw0E,cAAcE,WAAa,GAC5D10E,KAAKy0E,WAEFz0E,KAAKw0E,cAAc9f,YAAc10D,KAAK80E,SAASpgB,WAChD10D,KAAK0R,QAAQtO,aAAa,WAAY,QAGxCpD,KAAK40E,QAAQpxC,gBAAgB,aAG/B,KAAAuxC,YAAe9yE,IAEb,MAAM4S,EAAS5S,EAAE4S,OAEjB,IAAIA,EAAOzI,QAAQkoD,UAAW,OAE9B,GAAGt0D,KAAKg1E,WAAY,CAClB,GAAGh1E,KAAKg1E,aAAengE,EAAQ,OAC/B7U,KAAKg1E,WAAW50E,UAAUuB,OAAO,UAGnC3B,KAAKg1E,WAAangE,EAElBA,EAAOzU,UAAUC,IAAI,UACrB,MAAMi0D,GAAaz/C,EAAOzI,QAAQkoD,UAElCt0D,KAAKs0E,aAAe,IAAI7/B,KAAK6f,GAE7Bt0D,KAAKmR,WACLnR,KAAKi1E,gBA3LLj1E,KAAK6yD,QAAU7vD,EAAQ6vD,SAAW,IAAIpe,KAAK,uBAExC0/B,EAAWn0E,KAAK6yD,SACjBshB,EAASe,YAAYl1E,KAAK6yD,QAAQgC,cAAe70D,KAAK6yD,QAAQ6hB,WAAY10E,KAAK6yD,QAAQsiB,WAIzFn1E,KAAKo1E,YAAcl1E,SAASC,cAAc,OAC1CH,KAAKo1E,YAAYh1E,UAAUC,IAAI,wBAE/BL,KAAK40E,QAAU10E,SAASC,cAAc,UACtCH,KAAK40E,QAAQx0E,UAAUC,IAAI,WAAY,aAAc,oBACrD,YAAiBL,KAAK40E,QAAS50E,KAAKu0E,YAAa,CAACxmE,eAAgB/N,KAAK+N,iBAEvE/N,KAAK0R,QAAUxR,SAASC,cAAc,UACtCH,KAAK0R,QAAQtR,UAAUC,IAAI,WAAY,aAAc,oBACrD,YAAiBL,KAAK0R,QAAS1R,KAAK60E,YAAa,CAAC9mE,eAAgB/N,KAAK+N,iBAEvE/N,KAAKq1E,WAAan1E,SAASC,cAAc,OACzCH,KAAKq1E,WAAWj1E,UAAUC,IAAI,2BAE9BL,KAAKo1E,YAAYrrE,OAAO/J,KAAK40E,QAAS50E,KAAKq1E,WAAYr1E,KAAK0R,SAG5D1R,KAAKs1E,gBAAkBp1E,SAASC,cAAc,OAC9CH,KAAKs1E,gBAAgBl1E,UAAUC,IAAI,sBACnC,YAAiBL,KAAKs1E,gBAAiBt1E,KAAK+0E,YAAa,CAAChnE,eAAgB/N,KAAK+N,iBAE/E/N,KAAKmW,KAAKpM,OAAO/J,KAAKo1E,YAAap1E,KAAKs1E,iBAGrCtyE,EAAQqkB,SAAU,CACnBrnB,KAAK+jB,QAAU7jB,SAASC,cAAc,OACtCH,KAAK+jB,QAAQ3jB,UAAUC,IAAI,oBAE3B,MAAM06B,EAAY76B,SAASC,cAAc,OACzC46B,EAAU36B,UAAUC,IAAI,8BACxB06B,EAAUhxB,OAAO,KAEjB,MAAMwrE,EAAkB,CAACzzE,EAAaD,EAAwBkL,EAAmCyoE,KAC/F,MAAMC,EAAY,GAAK3zE,EACvB9B,KAAK+N,eAAe1N,IAAIwB,EAAWE,MAAnC/B,CAA0C,QAAUiC,IAClD,IAAIC,EAAQL,EAAWK,MAAMsB,QAAQ,MAAO,IACzCtB,EAAMC,OAAS,EAChBD,EAAQA,EAAMuB,MAAM,EAAG,IAEF,IAAjBvB,EAAMC,SAAiBD,EAAM,IAAMuzE,EAAU,IAAyB,IAAjBvzE,EAAMC,SAAiBD,EAAQJ,KAClE,IAAjBI,EAAMC,QAAgBqzE,GACvBA,GAAYtzE,EAAM,IAGpBA,EAAQ,IAAMA,EAAM,IAIxBL,EAAW6B,iBAAiBxB,GAC5B6K,EAAQ7K,EAAMC,WAIlBnC,KAAK01E,gBAAkB,IAAI,IAAW,CAACxyE,WAAW,IAClDlD,KAAK21E,kBAAoB,IAAI,IAAW,CAACzyE,WAAW,IAEpDqyE,EAAgB,GAAIv1E,KAAK01E,gBAAkBvzE,IAC3B,IAAXA,GACDnC,KAAK21E,kBAAkB5zE,MAAM0J,QAG/BzL,KAAKi1E,gBACHW,IACF51E,KAAK21E,kBAAkBzzE,OAAS0zE,EAAS51E,KAAK21E,kBAAkBzzE,OAAOuB,MAAM,EAAG,KAElF8xE,EAAgB,GAAIv1E,KAAK21E,kBAAoBxzE,IACvCA,GACFnC,KAAK01E,gBAAgB3zE,MAAM0J,QAG7BzL,KAAKi1E,iBAGPj1E,KAAKs0E,aAAeH,EAEpBA,EAAS0B,WAAW1B,EAAS2B,aAAe,IAE5C91E,KAAK01E,gBAAgBhyE,kBAAkB,IAAMywE,EAAS4B,YAAYtyE,OAAO,IACzEzD,KAAK21E,kBAAkBjyE,kBAAkB,IAAMywE,EAAS2B,cAAcryE,OAAO,IAE7E0wE,EAAS5f,SAAS,EAAG,EAAG,EAAG,GAE3Bv0D,KAAK+jB,QAAQha,OAAO/J,KAAK01E,gBAAgBz1E,UAAW86B,EAAW/6B,KAAK21E,kBAAkB11E,WAEtF,YAAiBD,KAAK0vE,WAAY,KAC7B1vE,KAAKo0E,SACNp0E,KAAKs0E,aAAa/f,UAAUv0D,KAAK01E,gBAAgBxzE,OAAS,GAAIlC,KAAK21E,kBAAkBzzE,OAAS,EAAG,EAAG,GACpGlC,KAAKo0E,OAAOp0E,KAAKs0E,aAAa5f,UAAY,IAAO,IAGnD10D,KAAK2+B,QACJ,CAAC5wB,eAAgB/N,KAAK+N,iBAEzB/N,KAAKmW,KAAKpM,OAAO/J,KAAK+jB,SAEtB/jB,KAAK40E,QAAQx0E,UAAUC,IAAI,WAC3BL,KAAK0R,QAAQtR,UAAUC,IAAI,WAG7B,MAAM21E,EAAgB91E,SAASC,cAAc,OAC7C61E,EAAc51E,UAAUC,IAAI,kBAC5B21E,EAAcjsE,OAAO/J,KAAKC,WAC1BD,KAAKgV,QAAQjL,OAAOisE,GAIpB7B,EAAS5f,SAAS,EAAG,EAAG,EAAG,GAC3Bv0D,KAAKs0E,aAAeH,EAEpBn0E,KAAKq1D,QAAUryD,EAAQqyD,SAAW,IAAI5gB,KACtCz0C,KAAKq1D,QAAQd,SAAS,EAAG,EAAG,EAAG,GAE/Bv0D,KAAKw0E,cAAgB,IAAI//B,KAAKz0C,KAAKs0E,cACnCt0E,KAAKw0E,cAAchgB,QAAQ,GAE3Bx0D,KAAK80E,SAAW,IAAIrgC,KAAKz0C,KAAKq1D,SAC9Br1D,KAAK80E,SAAStgB,QAAQ,GAEtBx0D,KAAK20E,SAAW,IAAIlgC,KAAKz0C,KAAK6yD,SAC9B7yD,KAAK20E,SAASpgB,SAAS,EAAG,EAAG,EAAG,GAChCv0D,KAAK20E,SAASngB,QAAQ,GAEnBx0D,KAAKw0E,cAAc9f,YAAc10D,KAAK20E,SAASjgB,WAChD10D,KAAK40E,QAAQxxE,aAAa,WAAY,QAGrCpD,KAAKw0E,cAAc9f,YAAc10D,KAAK80E,SAASpgB,WAChD10D,KAAK0R,QAAQtO,aAAa,WAAY,QAGrCJ,EAAQ0zB,UACT12B,KAAKmR,SAAW,QAGlBnR,KAAKi1E,eACLj1E,KAAKmR,WACLnR,KAAKy0E,WA+CA,eACL,GAAGz0E,KAAK0vE,YAAc1vE,KAAKs0E,aAAc,CACvC,IAAI/lE,EAAkBN,EAAc,GACpC,MAAMka,EAAO,IAAIssB,KACjBtsB,EAAKosC,SAAS,EAAG,EAAG,EAAG,GAEvB,MAAM0hB,EAA0C,CAC9C7O,OAAQ,UACRD,KAAM,WAGF+O,EAAW,IAAIzhC,KAAKz0C,KAAKs0E,aAAa5f,WAG5C,GAFAwhB,EAAS3hB,UAAUv0D,KAAK01E,gBAAgBxzE,OAAQlC,KAAK21E,kBAAkBzzE,OAEpElC,KAAKs0E,aAAa5f,YAAcvsC,EAAKusC,UACtCnmD,EAAM,yBAGE,CACRA,EAAM,oBAEN,MAAM4nE,EAA0C,CAC9CvhB,MAAO,QACPwhB,IAAK,WAGJF,EAASrhB,gBAAkB1sC,EAAK0sC,gBACjCshB,EAAYrhB,KAAO,WAGrB7mD,EAAKtI,KAAK,IAAI,UAAKqvD,gBAAgB,CACjC7sC,KAAM+tD,EACNlzE,QAASmzE,IACRnhE,SAGL/G,EAAKtI,KAAK,IAAI,UAAKqvD,gBAAgB,CACjC7sC,KAAM+tD,EACNlzE,QAASizE,IACRjhE,SAEHhV,KAAK0vE,WAAW9d,WAAW7oC,YAAY,eAAKxa,EAAKN,KAI9C,WAGLjO,KAAK4N,MAAM4E,YAAc,GACzBxS,KAAK4N,MAAM7D,OAAO,IAAI,UAAKirD,gBAAgB,CACzC7sC,KAAMnoB,KAAKs0E,aACXtxE,QAAS,CACPozE,IAAK,UACLxhB,MAAO,OACPyhB,QAAS,WAEVrhE,SAGG,cAAcpD,EAAmB2X,EAAkC,IACzE,MAAMxZ,EAAK7P,SAASC,cAAc,UAWlC,OAVA4P,EAAG3P,UAAUC,IAAI,WAAY,0BAE1BuR,GACD7B,EAAG3M,aAAa,WAAY,QAG3BmmB,GACDxZ,EAAGhG,OAAOwf,GAGLxZ,EAGF,WACL,MAAMumE,EAAY,IAAI7hC,KAAKz0C,KAAKw0E,eAE1BxxE,EAAsC,CAC1C8xD,KAAM,UACNF,MAAO50D,KAAK+jB,SAAWR,EAAA,EAAWC,SAAW,QAAU,QAGzDxjB,KAAKq1E,WAAW7iE,YAAc,GAC9BxS,KAAKq1E,WAAWtrE,OAAO,IAAI,UAAKirD,gBAAgB,CAAC7sC,KAAMmuD,EAAWtzE,YAAUgS,SAGzEhV,KAAK40D,OACN50D,KAAK40D,MAAMjzD,SAGb3B,KAAK40D,MAAQ10D,SAASC,cAAc,OACpCH,KAAK40D,MAAMx0D,UAAUC,IAAI,qBAEzB,MAAMk2E,EAAgB,IAAI9hC,KACpB2hC,EAAMG,EAAcC,SACf,IAARJ,GACDG,EAAchiB,UAAU,IAAM6hB,EAAM,IAGtC,IAAI,IAAIprE,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAM+E,EAAK/P,KAAKy2E,eAAc,EAAM,IAAI,UAAKzhB,gBAAgB,CAAC7sC,KAAMouD,EAAevzE,QAAS,CAACqzE,QAAS,YAAYrhE,SAClHjF,EAAG3P,UAAUuB,OAAO,0BACpBoO,EAAG3P,UAAUC,IAAI,yBACjBL,KAAK40D,MAAM7qD,OAAOgG,GAClBwmE,EAAc/hB,QAAQ+hB,EAAcpB,UAAY,GAIlD,IAAIuB,EAAWJ,EAAUE,SAAW,GACnB,IAAdE,IAAiBA,EAAW,GAE/B,MAAMC,EAAa,IAAIliC,KAAK6hC,EAAU5hB,WACtCiiB,EAAWniB,QAAQmiB,EAAWxB,UAAYuB,EAAW,GAGrD,IAAI,IAAI1rE,EAAI,EAAGA,EAAI0rE,IAAY1rE,EAC1BhL,KAAKgD,QAAQ4zE,oBACdD,EAAWniB,QAAQmiB,EAAWxB,UAAY,GAC1Cn1E,KAAK40D,MAAM7qD,OAAO/J,KAAKy2E,eAAc,EAAM,GAAKE,EAAWxB,aAE3Dn1E,KAAK40D,MAAM7qD,OAAO/J,KAAKy2E,eAAc,IAIzC,EAAG,CACD,MAAMtuD,EAAOmuD,EAAUnB,UACjBplE,EAAK/P,KAAKy2E,cAAcH,EAAYt2E,KAAKq1D,SAAWihB,EAAYt2E,KAAK6yD,QAAS,GAAK1qC,GACzFpY,EAAG3D,QAAQkoD,UAAY,GAAKgiB,EAAU5hB,UAEnC4hB,EAAU5hB,YAAc10D,KAAKs0E,aAAa5f,YAC3C10D,KAAKg1E,WAAajlE,EAClBA,EAAG3P,UAAUC,IAAI,WAGnBL,KAAK40D,MAAM7qD,OAAOgG,GAElBumE,EAAU9hB,QAAQrsC,EAAO,SACK,IAAxBmuD,EAAUnB,WAElB,MAAMxjC,EAAY3xC,KAAK40D,MAAM3qD,kBAAoB,EACjD,GAAGjK,KAAKgD,QAAQ4zE,oBAAsBjlC,EACpC,IAAI,IAAI3mC,EAAI2mC,EAAW3mC,EAAI,IAAKA,EAC9BhL,KAAK40D,MAAM7qD,OAAO/J,KAAKy2E,eAAc,EAAM,GAAKH,EAAUnB,YAC1DmB,EAAU9hB,QAAQ8hB,EAAUnB,UAAY,GAI5C,MAAM0B,EAAQx0E,KAAKkjB,KAAKvlB,KAAK40D,MAAM3qD,kBAAoB,GACvDjK,KAAKC,UAAUmM,QAAQyqE,MAAQ,GAAKA,EAEpC72E,KAAKs1E,gBAAgBvrE,OAAO/J,KAAK40D,QCnYtB,MAAMkiB,GAInB,YAAoB72E,EAAgC82E,GAAhC,KAAA92E,YAAgC,KAAA82E,UAClD/2E,KAAKg3E,iBACLh3E,KAAKi3E,kBAQC,iBACNj3E,KAAKk3E,gBAAkB,IAAIztC,qBAAsBC,IAC/C,IAAI,MAAMC,KAASD,EAAS,CAC1B,MAAMytC,EAAaxtC,EAAMytC,mBACnBC,EAAe1tC,EAAM90B,OAAO/D,cAC5BwmE,EAAiB3tC,EAAM4tC,WAG1BJ,EAAWr6D,OAASw6D,EAAe9jD,KACpCxzB,KAAK+2E,SAAQ,EAAMM,GAIlBF,EAAWr6D,QAAUw6D,EAAe9jD,KACnC2jD,EAAWr6D,OAASw6D,EAAex6D,QACrC9c,KAAK+2E,SAAQ,EAAOM,KAGvB,CAACG,UAAW,EAAGC,KAAMz3E,KAAKC,YAGvB,kBACND,KAAK03E,iBAAmB,IAAIjuC,qBAAsBC,IAChD,IAAIC,EAAQD,EAAQ9hC,OAAO+hC,GAASA,EAAMytC,mBAAmB5jD,IAAM,GAAGnrB,KAAK,CAACC,EAAGC,IAAMD,EAAE8uE,mBAAmB5jD,IAAMjrB,EAAE6uE,mBAAmB5jD,KAAK,GAC1I,IAAImW,EAAO,OACX,IAAI1pC,EAAY0pC,EAAMC,eAAiBD,EAAM90B,OAAS80B,EAAM90B,OAAO0iB,mBACnEv3B,KAAK+2E,SAAQ,EAAM92E,IAClB,CAACw3E,KAAMz3E,KAAKC,YAOT,YAAYA,EAAwBuJ,GAC1C,MAAMmuE,EAAWz3E,SAASC,cAAc,OAExC,OADAw3E,EAASv3E,UAAUC,IAAI,kBAAmBmJ,GACnCvJ,EAAU+gB,YAAY22D,GAQxB,2BAA2B3iE,GAChC,MAAM4iE,EAAiB53E,KAAK63E,YAAY7iE,EAAS,wBACjDhV,KAAKk3E,gBAAgB/uC,QAAQyvC,GAE7B53E,KAAK03E,iBAAiBvvC,QAAQnzB,GAGzB,aACLhV,KAAKk3E,gBAAgBY,aACrB93E,KAAK03E,iBAAiBI,aAGjB,UAAU9iE,EAAsB4iE,GACrC53E,KAAK03E,iBAAiBntC,UAAUv1B,GAChChV,KAAKk3E,gBAAgB3sC,UAAUqtC,IC3DnChvE,EAAA,QAAU5H,iBAAiB,kBAAoBiB,IAC7C,MAAMmC,EAAUnC,EACfkG,MAAMC,KAAKlI,SAAS4P,iBAA4B,kCAAmB1L,EAAQ6C,UAAU7C,EAAQyC,UAA+BP,QAAQ0O,IACnIA,EAAQ5Q,QAAUA,EAClB4Q,EAAQ4qC,aAIG,MAAM,WAAuBx4B,YAQ1C,cACEnkB,QAHM,KAAA80E,SAAU,EAMX,OACL/3E,KAAK4/C,SACL5/C,KAAKoM,QAAQ4rE,QAAUh4E,KAAKoE,QAAQ6C,OAAS,IAAMjH,KAAKoE,QAAQyC,IAChE7G,KAAKI,UAAUC,IAAI,UAAW,WAAaL,KAAKmD,MAG3C,SACL,MAAM80E,EAAUj4E,KAAKoE,QAAQ6zE,QAM7B,GAAiB,WAAdj4E,KAAKmD,KAAmB,CACzB,IAAI+0E,EAsDAh7D,EAWJ,GAhEGld,KAAK0gB,oBACNw3D,EAAWl4E,KAAK0gB,oBAGfu3D,aAAO,EAAPA,EAASE,kBACPD,IAAaA,EAAS93E,UAAUuR,SAAS,4BAC1C3R,KAAKiE,UAAY,GACjBi0E,EAAW,MAGTA,IACFA,EAAWh4E,SAASC,cAAc,OAClC+3E,EAAS93E,UAAUC,IAAI,2BAGzB43E,EAAQE,gBAAgB10E,QAAQqB,UAAUwB,QAAQ,CAACw6B,EAAMz8B,KACvD,IAAI4tB,EAAaimD,EAAS9yD,SAAS/gB,GAC/B4tB,IACFA,EAAa,IAAI,GACjBA,EAAW7uB,aAAa,SAAU,KAClC6uB,EAAW7xB,UAAUC,IAAI,aACzB4xB,EAAWjI,cAAgBhqB,KAAKgqB,cAE7BhqB,KAAK8pB,eACNmI,EAAWnI,aAAe9pB,KAAK8pB,eAInCmI,EAAW7uB,aAAa,OAAQ,GAAK,IAAgBy9B,UAAUC,IAE3D7O,EAAWnR,YACbo3D,EAASnuE,OAAOkoB,KAKnB9pB,MAAMC,KAAK8vE,EAAS9yD,UAA4B3hB,MAAMw0E,EAAQE,gBAAgBh2E,QAAQmE,QAAQyJ,GAAMA,EAAGpO,YAErGu2E,IAAaA,EAAS93E,UAAUuR,SAAS,oBAC1CumE,EAASv2E,SACTu2E,EAAW,MAGTA,IACFA,EAAWh4E,SAASC,cAAc,QAClC+3E,EAAS93E,UAAUC,IAAI,oBAIvB63E,EAASpnE,eACX9Q,KAAK+J,OAAOmuE,GAMVh7D,EAFD+6D,EACEA,EAAQA,QACF,eAAK,WAAY,CAACA,EAAQA,UAE1B,eAAK,iBAGP,eAAK,cAGXA,EAAS,CACV,MAAMvpC,EAAiB,IAAmB0pC,kBAAkBH,EAAQI,WAAWlxD,UAAS,IACxF,IAAImxD,GAAW,EACZL,EAAQA,UAEPK,OADyB5zE,IAAxBuzE,EAAQM,kBAAgD7zE,IAAnBuzE,EAAQO,OACnCP,EAAQM,YAAcN,EAAQO,QAE7B9pC,EAAe+pC,WAAa/pC,EAAe+pC,WAAaR,EAAQO,QAAU,IAG1Fx4E,KAAKI,UAAUkM,OAAO,YAAagsE,GAGrC,IAAII,EAAW14E,KAAKolB,SAAS,GAC7B,IAAIszD,EAAU,CACZA,EAAWx4E,SAASC,cAAc,QAClCu4E,EAASt4E,UAAUC,IAAI,uBAEvB,MAAMs4E,EAAWz4E,SAASC,cAAc,QACxCw4E,EAASv4E,UAAUC,IAAI,cAEvB,MAAMu4E,EAAkB14E,SAASC,cAAc,OAC/C,OAAAmd,GAAA,QAAOs7D,GAEP54E,KAAK+J,OAAO2uE,EAAUC,EAAUC,GAGlC,OAAArsE,EAAA,GAAemsE,EAAUx7D,QAEzBld,KAAKI,UAAUC,IAAI,wBACnBL,KAAKiE,UAAY,iFAAgFg0E,aAAO,EAAPA,EAASA,SAAU,YAAaA,EAAQA,QAAS,GAAK,aAGtJA,GAAYj4E,KAAK+3E,SAAY/3E,KAAKoE,QAAQkT,OAAOoQ,cAClD,IAAmBmxD,uBAAuB74E,KAAKoE,QAAQ6C,OAAQjH,KAAKoE,QAAQyC,KAC5E,IAAmBiyE,cAAc94E,KAAKoE,QAAQ6C,OAAQjH,KAAKoE,QAAQyC,IAAK,mBACxE7G,KAAK+3E,SAAU,GAGd/3E,KAAK8pB,eACN9pB,KAAK8pB,kBAAeplB,IAK1B2mB,eAAeC,OAlJE,kBAkJe,ICnJhC,MAEMytD,GAAa,KACjB,MAAMC,EAAS94E,SAASC,cAAc,KAGtC,OAFA64E,EAAO54E,UAAUC,IAAI,UACrB,gBAAM24E,EAAQ,iBACPA,GAGF,IAAU,GAAAC,OAAA,QAAa,KAKfC,QAAU,CAAC9sD,EAAYhoB,EAA0B2nD,EAAqBotB,EAA8BC,K,MAC/G,MAAMjxD,EAAO,IAAIssB,KAAoB,IAAfrwC,EAAQ+jB,MACxBla,EAAiC,GACvC,IAsBIorE,EAtBA7kC,EAAO,aAAWrsB,GAEtB,GAAG/jB,EAAQk1E,MAAO,CAChB,MAAMC,EAAan1E,EAAQo1E,cAA+B,QAAhB,EAAAp1E,EAAQq1E,gBAAQ,eAAED,aAE5DztB,EAAO3rD,UAAUC,IAAI,gBAErB,MAAMq5E,EAAgBx5E,SAASC,cAAc,QAC7Cu5E,EAAct5E,UAAUC,IAAI,cAC5Bq5E,EAAcz1E,UAAY,YAAaG,EAAQk1E,MAAO,GAEtD,MAAMK,EAAez5E,SAASC,cAAc,KAI5C,GAHAw5E,EAAav5E,UAAUC,IAAI,qBAAsB,aAEjD4N,EAAKtI,KAAK+zE,EAAeC,GACtBJ,EAAY,CACb,MAAMpqB,EAAOjvD,SAASC,cAAc,QACpCgvD,EAAKlrD,UAAY,IAAkB6nB,cAAcytD,GAAhC,UACjBtrE,EAAKtI,KAAKwpD,IAWd,GANG/qD,EAAQw1E,WAA2B,cAAdxtD,EAAKjpB,OAAyBiB,EAAQkT,OAAOuiE,YACnE9tB,EAAO3rD,UAAUC,IAAI,aAErB4N,EAAKpI,QAAQwzE,EAAaN,OAGX,WAAd3sD,EAAKjpB,MAAqBiB,EAAQkT,OAAOwiE,OAAQ,CAClD/tB,EAAO3rD,UAAUC,IAAI,aAErB,MAAM2K,EAAI9K,SAASC,cAAc,KACjC6K,EAAE5K,UAAUC,IAAI,mBAAoB,aACpC4N,EAAKpI,QAAQmF,GAGfiD,EAAKtI,KAAK6uC,GAEV,MAAM5mC,EAAQ,aAAYua,IACrB/jB,EAAQw1E,UAAY,aAAa,aAAY,IAAInlC,KAAyB,IAApBrwC,EAAQw1E,YAAuB,KACrFx1E,EAAQq1E,SAAW,eAAe,aAAY,IAAIhlC,KAA6B,IAAxBrwC,EAAQq1E,SAAStxD,OAAkB,IAEzF4xD,EAAW75E,SAASC,cAAc,QACxC45E,EAAS35E,UAAUC,IAAI,OAAQ,SAC/B05E,EAASnsE,MAAQA,EACjBmsE,EAAShwE,UAAUkE,GAEnB,MAAM+rE,EAAQ95E,SAASC,cAAc,OACrC65E,EAAM55E,UAAUC,IAAI,QAAS,SAC7B25E,EAAMpsE,MAAQA,EAEd,IAAIqsE,EAAahsE,EAYjB,OAXGorE,IACDY,EAAWA,EAAW19D,QAAQ88D,IAAeN,MAE/CkB,EAAaA,EAAWxxE,IAAIH,GAAKA,aAAa8e,cAAgB9e,EAAElI,UAAUuR,SAAS,QAAUrJ,EAAEokC,WAAU,GAAuBpkC,GAChI2xE,EAAWA,EAAW93E,OAAS,GAAK,aAAWgmB,GAC/C6xD,EAAMjwE,UAAUkwE,GAEhBF,EAAShwE,OAAOiwE,GAEhBZ,EAAWrvE,OAAOgwE,GAEXA,GAGI,GAAAG,cAAgB,EAAEnuB,SAAQotB,kBAAiB/0E,UAASg1E,aAAYtvD,eAAcE,oBAQzF,MAAMmwD,GAAYpuB,EAAO3rD,UAAUuR,SAAS,aAAeo6C,EAAO3rD,UAAUuR,SAAS,eAAiBo6C,EAAO3rD,UAAUuR,SAAS,SAC1HyoE,EAAgB,IAAI,GAO1B,OANAA,EAAch2E,QAAUA,EACxBg2E,EAAcj3E,KAAOg3E,EAAW,SAAW,SAC3CC,EAActwD,aAAeA,EAC7BswD,EAAcpwD,cAAgBA,EAC9BowD,EAAclsE,OACdirE,EAAgB15D,QAAQ26D,GACjBD,GAGI,GAAAE,SAAW,EAAEjuD,OAAM2/B,SAAQotB,kBAAiB/0E,cAMvD,MAAMk2E,GAAenB,EAClBmB,IACDnB,EAAkBptB,EAAOl8C,cAAc,oBAGzC,MAAM0qE,EAAkBD,EAAcnB,EAAgBtpE,cAAc,UAAY,KAChF,IAAIzL,EAAQo2E,aAMV,OALGD,GACDA,EAAgB54E,cAGlBoqD,EAAO3rD,UAAUuB,OAAO,YAK1B,MAAM84E,EAAgBr2E,EAAQs2E,SAASC,iBAAmBvuD,EAAKwuD,gBAAgB/5C,UAAUz8B,EAAQs2E,SAASC,kBAAoBvuD,EAAKnlB,OAEnI,IACI4zE,EADAC,EAAkB1uD,EAAK49B,mBAAmBxwC,iBAAiBihE,EAAer2E,EAAQo2E,cAM7D,iBAAtBM,EAAgB1zE,GAEjBglB,EAAK49B,mBAAmB+wB,kBAAkBN,EAAer2E,EAAQo2E,cACjEpuD,EAAKC,QAAQ2uD,WAAWr1E,KAAK,CAAC80E,gBAAeQ,SAAU72E,EAAQo2E,aAAc3zE,IAAKzC,EAAQyC,MAE1Fg0E,EAAoB,eAAK,YAEzBA,EAAoB,IAAI,KAAU,CAChC5zE,OAAQ6zE,EAAgBlvE,QAAUkvE,EAAgBrH,UAClD5nE,QAAQ,EACRunD,eAAe,EACflwD,WAAW,IACV8R,QAGL,MAAM0U,EAAU25B,GAAUw3B,OAAmBn2E,EAAWo2E,GACrDP,EACDA,EAAgBxxD,YAAYW,GAE5ByvD,EAAgBpvE,OAAO2f,GAGzBqiC,EAAO3rD,UAAUC,IAAI,a,cCpKlB,SAAS66E,GAAkBj7E,EAAwBk7E,EAAgCC,GAExF,MAAMv/D,EAAO5b,EAAU6b,wBACjBvB,EAAuB,WAAnB6gE,EAA8B/4E,KAAKkjB,KAAK1J,EAAKkB,MAASlB,EAAKktB,MAAQltB,EAAKkB,MAAQ,EAAK,GAAK1a,KAAKkjB,KAAK1J,EAAKkB,KAAO,GACpHtC,EAAqB,WAAjB0gE,EAA4B94E,KAAKg5E,MAAMx/D,EAAK2X,IAAM3X,EAAKlb,OAAS,GAAK0B,KAAKkjB,KAAK1J,EAAK2X,IAAM,GACpG,OAAOtzB,SAASo7E,iBAAiB/gE,EAAGE,GCPvB,SAAS8gE,GAAwBvmE,GAC9CA,EAAQrS,MAAMC,QAAU,OACnBoS,EAAQi0B,WACbj0B,EAAQrS,MAAMC,QAAU,GDO1B,KAAes4E,kBAAoBA,G,0CEWnC,MAAMM,GAAiC,CACrCC,SAAU,GACVC,QAAS,EACTC,SAAU,KAAIC,cAKT,MAAM,GAAb,cAEU,KAAAC,iBAEJ,GAGI,KAAAC,iBAAkD,GAElD,KAAAC,oBAAoE,GAiErE,iBAAiBJ,EAAmB,KAAIC,cAC7C,MAAMz1E,EAAUnG,KAAK+7E,oBAAoBJ,GACzC,GAAGx1E,EACD,OAAOA,EAGT,MAAM61E,EAAkB,iBAAmBL,EAC3C,OAAO37E,KAAK+7E,oBAAoBJ,GAAYM,GAAA,EAAajsE,IAAIgsE,GAAYn7E,KAAM44C,IACzE,aAASA,KACXA,EAAO,IAGT,YAAmB+hC,GAAiB/hC,GAGpCA,EAAKkiC,SAAWA,EAChB37E,KAAK67E,iBAAiBF,GAAYliC,EAE3B,KAAW1jB,UAAU,sCAAuC,CACjE04C,UAAWh1B,EAAKkiC,SAChBO,aAAcziC,EAAKiiC,UAClB76E,KAAMs7E,IACP1iC,EAAKiiC,QAAUS,EAAmBT,QAElC,MAAMU,EAAe3iC,EAAKgiC,SACpBA,EAAWU,EAAmBV,SACpC,IAAI,IAAIzwE,EAAI,EAAG7I,EAASs5E,EAASt5E,OAAQ6I,EAAI7I,IAAU6I,EAAG,CACxD,MAAM,QAACqxE,EAAO,UAAEC,GAAab,EAASzwE,GACtCoxE,EAAaC,GAAWC,EAO1B,OAJAL,GAAA,EAAatnE,IAAI,CACf,CAACqnE,GAAaviC,IAGTA,GACN,IACMA,KAKN,uBACL,MAAMhc,EAA2B,CAC/Bz9B,KAAKu8E,oBAWP,OARG,UAAKC,wBAA0B,KAAIZ,cACpCn+C,EAAS93B,KAAK3F,KAAKu8E,iBAAiB,UAAKC,wBAGvCx8E,KAAK+yD,QACPt1B,EAAS93B,KAAK3F,KAAKy8E,mBAGd55E,QAAQC,IAAI26B,GAGd,cACDz9B,KAAKsc,QACPtc,KAAKsc,MAAQ,IAAI,UAAY5X,EAAW,IAG1C,IAAI,MAAMi3E,KAAY37E,KAAK67E,iBAAkB,CAC3C,GAAG77E,KAAK87E,iBAAiBH,GACvB,SAGF,MACMF,EADOz7E,KAAK67E,iBAAiBF,GACbF,SAEtB,IAAI,MAAMY,KAAWZ,EAAU,CAC7B,MAAMa,EAAYb,EAASY,GAC3Br8E,KAAKsc,MAAMogE,YAAYJ,EAAWD,GAGpCr8E,KAAK87E,iBAAiBH,IAAY,GAI/B,aAAat+C,GAMlB,IAAIs/C,EACJ,GANA38E,KAAK48E,eAELv/C,EAAIA,EAAEqe,cAAcl4C,QAAQ,KAAM,MAI7B8H,OAAQ,CACX,MAAMqJ,EAAM3U,KAAKsc,MAAMugE,OAAOx/C,GAC9Bs/C,EAASx0E,MAAMC,KAAKuM,GAAKwuB,OAAO,CAACC,EAAK7D,IAAM6D,EAAIx/B,OAAO27B,GAAI,SAE3Do9C,EAAS38E,KAAK+yD,OAAOnvD,OAAO,GAAgBk5E,eAAer5E,MAAM,EAvK7C,IAmLtB,OATAk5E,EAASx0E,MAAMC,KAAK,IAAIvE,IAAI84E,IASrBA,EAGF,kBACL,OAAG38E,KAAK+8E,uBAA+B/8E,KAAK+8E,uBACrC/8E,KAAK+8E,uBAAyBhpD,EAAA,QAAgBC,WAAWnzB,KAAKozB,GAC5Dj0B,KAAK+yD,OAAS5qD,MAAM+3C,QAAQjsB,EAAM+oD,aAAe/oD,EAAM+oD,YAAc,IAIzE,gBAAgBzjC,GACrBA,EAAQ,IAAkBwC,SAASxC,GACnCv5C,KAAKy8E,kBAAkB57E,KAAKkyD,IAC1B,YAAiBA,EAAQxZ,GACzBwZ,EAAOltD,QAAQ0zC,GACZwZ,EAAO5wD,OAlMU,KAmMlB4wD,EAAO5wD,OAnMW,IAsMpB4xB,EAAA,QAAgBouC,YAAY,cAAepP,GAC3CnqD,EAAA,QAAU6F,cAAc,eAAgB8qC,MApM7B,GAAAujC,cAAgB,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAyMxO,MAAM,GAAkB,IAAI,GAC5B,OAAmB,KAAeG,gBAAkB,IACrC,U,mBCtNf,MAAMC,GAA0B,IAAIr5E,IAC7B,SAASs5E,GAAY5jC,EAAet5C,EAAwBwf,GAAU,EAAO29D,GAAQ,GAK1F,MAAMC,EAAYn9E,SAASC,cAAc,QAGzC,IAAIm9E,EAiBJ,GAnBAD,EAAUj9E,UAAUC,IAAI,eAGrB+8E,IAAU,KACXE,EAAM,IAAkBC,gBAAgBhkC,IAExCA,EAAQ,IAAkBwC,SAASxC,GACnC+jC,EAAM,IAAkBxxD,cAAcytB,IAUxC8jC,EAAUp5E,UAAYq5E,EAEnBD,EAAUj4D,SAASjjB,OAAS,EAAG,CAChC,MAAM4tB,EAAQstD,EAAU38D,kBACxB28D,EAAUp5E,UAAY,GACtBo5E,EAAUtzE,OAAOgmB,GAGnB,GAAGstD,EAAU38D,oBAAsB,KAAoB,CACrD,MAAMugC,EAAQo8B,EAAU38D,kBAElBhM,EAAMusC,EAAMxsC,IAClB,IAAIyoE,GAAWv1E,IAAI+M,GAAM,CACvBusC,EAAM79C,aAAa,UAAW,QAC9B,MAAMwJ,EAAc1M,SAASC,cAAc,QAC3CyM,EAAYxM,UAAUC,IAAI,qBAEvBuI,EAAA,QAAUw1B,SAASC,oBACpB4iB,EAAMt+C,MAAMkpD,QAAU,IACtBj/C,EAAYjK,MAAMkpD,QAAU,KAG9B5K,EAAMjgD,iBAAiB,OAAQ,KAC7B,aAAQ,KACH4H,EAAA,QAAUw1B,SAASC,oBACpB4iB,EAAMt+C,MAAMkpD,QAAU,GACtBj/C,EAAYjK,MAAMkpD,QAAU,IAG9BwxB,EAAUj9E,UAAUuB,OAAO,SAE3Bu7E,GAAW78E,IAAIqU,MAEhB,CAACiD,MAAM,IAEV0lE,EAAUtzE,OAAO6C,IAMlB6S,EAASxf,EAAUwf,QAAQ49D,GACzBp9E,EAAU+gB,YAAYq8D,GAGtB,SAASG,GAAoBxoE,GAClC,OAAI,OAAA4J,GAAA,GAAgB5J,EAAS,eAEL,IAArBA,EAAQyoE,SAAuBzoE,EAAQ0oE,WACnB,SAApB1oE,EAAQ41B,UAAuB51B,EAAQ5U,UAAUuR,SAAS,UAAYqD,EAAQ0L,oBAC/E1L,EAAUA,EAAQ0L,mBAGb1L,EAAQg+D,aAAa,QAAUh+D,EAAQuU,WAPM,GAUvC,MAAM,GAArB,cASU,KAAAo0D,eAAiB,EA2KzB,KAAAC,eAAkB37E,IAChB,OAAAyb,EAAA,GAAYzb,GAEZ,MAAMs3C,EAAQikC,GAAoBv7E,EAAE4S,QAChC0kC,IAIJ,GAAantB,KAAKrqB,MAAM87E,gBAAgBtkC,GAAO,GAC5C,uBACD,OAAA+Q,GAAA,OAlLJ,OACEtqD,KAAK6N,QAAU3N,SAAS4uC,eAAe,iBAEvC,MAAMo8B,EAA4B,CAChC,wBACA,yBACA,qBACA,wBACA,yBACA,gBAEA,cACA,cAEI4S,EAEF,GAEE51E,EAAqC,IAAIwH,IAAI,CACjD,CACE,eACA,MAIJ,IAAI,MAAM6pC,KAAS,KAAOwkC,MAAO,CAC/B,MACM/yE,EAAI,GADM,KAAO+yE,MAAMxkC,GAEvBykC,EAAW9S,GAAYlgE,EAAE,GAAK,GACpC,IAAIgzE,EAAU,SAEd,IAAInoE,EAAI3N,EAAO8H,IAAIguE,GACfnoE,IACFA,EAAI,GACJ3N,EAAOyM,IAAIqpE,EAAUnoE,IAGvBA,GAAG7K,EAAEvH,MAAM,IAAM,GAAK81C,EAOxBrxC,EAAOmG,OAAO68D,EAAWxlE,OAGzBwC,EAAO5B,QAAQ,CAACq2E,EAAQqB,KACtB,MAAMxxD,EAAMtsB,SAASC,cAAc,OACnCqsB,EAAIpsB,UAAUC,IAAI,kBAElB,MAAM49E,EAAW/9E,SAASC,cAAc,OACxC89E,EAAS79E,UAAUC,IAAI,kBACvB49E,EAASl0E,OAAO,eAAKi0E,IAErB,MAAME,EAAWh+E,SAASC,cAAc,OACxC+9E,EAAS99E,UAAUC,IAAI,gBAEvBmsB,EAAIziB,OAAOk0E,EAAUC,GAErBvB,EAAOr2E,QAAQ63E,IAsBbhB,GAjBY,aAAoBgB,GAiBoCD,GAAU,KAOhFJ,EAAKE,GAAYxxD,IAKnB,MAAM4xD,EAAOp+E,KAAKo+E,KAAOp+E,KAAK6N,QAAQ2hC,uBAChC6uC,EAAcr+E,KAAK+9B,OAAS,IAAI,IAAW/9B,KAAK6N,QAAS,SAIzDsY,EAAY,aAAanmB,KAAK6N,SAAS,GAE7ChL,QAAQC,IAAI,CACV,OAAA1B,GAAA,GAAM,KACN,GAAgBq7E,kBAAkB57E,KAAKkyD,IACrC,MAAMurB,IAAcvrB,EAAO5wD,OACrBo8E,EAAWD,EAAY,EAAI,EACjCt+E,KAAKo+E,KAAKh5D,SAAS,GAAGhlB,UAAUkM,OAAO,QAASgyE,GAChDt+E,KAAKo+E,KAAKh5D,SAASm5D,GAAUn+E,UAAUC,IAAI,UAC3C,MAAM6pC,EAAI,GAAkBs0C,YAAYJ,EAAMC,OAAa35E,EAAW65E,GAGtE,OAFAv+E,KAAKy+E,kBAAoBv0C,EAAEu0C,kBAC3Bz+E,KAAK0+E,cAAgBx0C,EAAEhgC,UAChB6oD,MAERlyD,KAAK,EAAEuG,EAAG2rD,MACX5sC,EAAUxkB,SAEV3B,KAAK2+E,eAAiBb,EAAK,gBAAgBjuE,cAAc,iBACzD,IAAI,MAAM0pC,KAASwZ,EACjBoqB,GAAY5jC,EAAOv5C,KAAK2+E,gBAG1B3+E,KAAK2+E,eAAe7tE,cAAc1Q,UAAUkM,OAAO,QAAStM,KAAK2+E,eAAe10E,mBAEhFihE,EAAWrlE,QAAQ,gBACnBqlE,EAAWziE,IAAIu1E,IACb,MAAMxxD,EAAMsxD,EAAKE,GAQjB,OANIxxD,GACF9f,QAAQC,MAAM,sBAAuBqxE,GAGvCK,EAAYp+E,UAAU8J,OAAOyiB,GAC7BxsB,KAAKy+E,kBAAkBG,2BAA2BpyD,GAC3CA,MAIXxsB,KAAK6N,QAAQ7M,iBAAiB,QAAShB,KAAK49E,gBAC5C59E,KAAKkO,KAAO,KAEZtF,EAAA,QAAU5H,iBAAiB,eAAiBu4C,IAC1C,MAAMn0B,EAAWjd,MAAMC,KAAKpI,KAAK2+E,eAAev5D,UAChD,IAAI,IAAIpa,EAAI,EAAG7I,EAASijB,EAASjjB,OAAQ6I,EAAI7I,IAAU6I,EAAG,CACxD,MAAM+E,EAAKqV,EAASpa,GAEpB,GAAGuuC,IADY,IAAkBwC,SAASyhC,GAAoBztE,IACzC,CACnB,GAAS,IAAN/E,EACD,OAGF+E,EAAGpO,UAIPw7E,GAAY5jC,EAAOv5C,KAAK2+E,gBAAgB,GACxC3+E,KAAK2+E,eAAe7tE,cAAc1Q,UAAUuB,OAAO,QACnD3B,KAAKo+E,KAAKh5D,SAAS,GAAGhlB,UAAUuB,OAAO,QAEnC3B,KAAK29E,gBACP39E,KAAK0+E,cAAc,KAIvB,GAAkB19E,iBAAiB,QAAS,KAC1ChB,KAAK29E,eAAiB39E,KAAK+9B,OAAOyK,YAkBtC,Y,qTCvRa,MAAM,GAKnB,YAAoBxzB,EAA8ByX,EAAuB1hB,EAAwBsf,GAAS,GAAtF,KAAArV,UAA8B,KAAAyX,QAAuB,KAAA1hB,aAHjE,KAAA8zE,cAA0Ch8E,QAAQoD,UAClD,KAAA6G,QAAkB,EAyBlB,KAAA80B,SAAW,KACd5hC,KAAK8M,QACNE,aAAahN,KAAK8M,SAElB9M,KAAK6+E,cAAgB,eAIvB7+E,KAAK8M,QAAUvB,OAAOC,WAAW,KAC/BxL,KAAK8M,QAAU,EACf9M,KAAK6+E,cAAc54E,WAElB,MA8EE,KAAA64E,oBAAuBtyD,GACrBxsB,KAAK6+E,cAAch+E,KAAK,IAAW,mCAGxC,GAAGb,KAAKgqB,cAAc+0D,YAAYC,UAAUxyD,GAC1C,OAGF,MAAM7L,EAAQ6L,EAAI3c,cAAc,SAC1Bua,EAAMoC,EAAI3c,cAAc,OAQ9B,GANGua,IACDA,GAAOA,EAAIhqB,UAAUuB,OAAO,cAEtB,iBAGL3B,KAAKgqB,cAAc+0D,YAAYC,UAAUxyD,IAIzC7L,EAAO,CACRA,EAAMhf,SACNgf,EAAMlM,IAAM,GACZkM,EAAM7a,OACau5C,EAAA,EAAqB4/B,cAAct+D,GAC3Cra,QAAQb,IACjB45C,EAAA,EAAqB6/B,eAAez5E,GAAM,GAAM,UA3ItDzF,KAAKgqB,cAAgB,IAAI,UAAqBtlB,EAAW,CAACmQ,EAAQgK,KAC7DA,EACD7e,KAAKm/E,kBAAkBtqE,GAEvB7U,KAAK8+E,oBAAoBjqE,KAa1BwV,GACDrqB,KAAKqqB,SAmBF,SACLrqB,KAAK+K,WAAW9K,UAAUe,iBAAiB,SAAUhB,KAAK4hC,UAGrD,SACL5hC,KAAKmK,QACLnK,KAAK+K,WAAW9K,UAAUoJ,oBAAoB,SAAUrJ,KAAK4hC,UAGxD,QACL5hC,KAAKgqB,cAAc7f,QAGb,kBAAkBqiB,GAExB,GADcA,EAAI3c,cAAc,SAE9B,OAwDF7P,KAAKgqB,cAAcrkB,KAAK,CAAC6mB,MAAK1mB,KAnDjB,KACX,MAAMqO,EAAQqY,EAAIpgB,QAAQ+H,MACpBF,EAAM,IAAeC,OAAOC,GA4ClC,OA1CgBnU,KAAK6+E,cAAch+E,KAAK,KACtC,MASMsF,EATM42C,GAAU,CACpB9oC,MACAhU,UAAWusB,EACXxC,cAAe,KAEfyC,MAAOzsB,KAAKysB,MACZywB,QAAQ,IAGU58C,YAyBpB,OAxBA6F,EAAQkb,QAAQ,KACd,MAAMV,EAAQ6L,EAAI3c,cAAc,SAEhC2c,EAAI7pB,MAAMkpD,QAAU,GACpB,MAAMzhC,EAAMoC,EAAI3c,cAAc,OAC9Bua,GAAOA,EAAIhqB,UAAUC,IAAI,QAEtBsgB,IAAUA,EAAM7P,eACjBtF,WAAW,KACTmV,EAAMlM,IAAM,GACZkM,EAAM7a,OACau5C,EAAA,EAAqB4/B,cAAct+D,GAC3Cra,QAAQb,IACjB45C,EAAA,EAAqB6/B,eAAez5E,GAAM,GAAM,MAEjD,GAIDzF,KAAKgqB,cAAc+0D,YAAYC,UAAUxyD,IAC3CxsB,KAAK8+E,oBAAoBtyD,KAItBrmB,OAgDN,IAAI8N,EAAiBonB,EAAWr7B,KAAKgV,S,MAC1C,IAAIoqE,EAAWnrE,EAAI4D,EACfwnE,EAAYprE,EAAIsE,EACjB8mE,EA5JQ,MA6JTD,GA7JS,IA6JWC,EACpBA,EA9JS,KAiKX,MAAMC,EAAej9E,KAAKC,IAlKP,IADT,IAmK2C88E,GAC/Ct/E,EAAO,OAAAy/E,GAAA,GAAeH,EAAUC,EAAWC,EAlKtC,KAiLL9yD,EAAMtsB,SAASC,cAAc,OACnCqsB,EAAIpsB,UAAUC,IAAI,MAAO,sBACzBmsB,EAAI7pB,MAAMjC,MAAQZ,EAAKY,MAAQ,KAC/B8rB,EAAI7pB,MAAMkpD,QAAU,IAEpBr/B,EAAIpgB,QAAQ+H,MAAQ,GAAKF,EAAI9E,GAE7BksB,EAAStxB,OAAOyiB,GAGhBxsB,KAAKgqB,cAAcme,QAAQ3b,GAI3B,MAAMmyB,EAAW,IAAeC,SAAS3qC,GAAK,GAG9C,IAAImW,IADoBu0B,IAGtBv0B,EAAM,IAAIyd,MACVzd,EAAIhqB,UAAUC,IAAI,gBAEds+C,EAASrqC,aAAaI,KACxBiqC,EAASx4C,QAAQtF,KAAK,KACpBupB,EAAI3V,IAAMkqC,EAASrqC,aAAaI,OAKtC,MAAM2tC,EAAc,KACfj4B,IACDoC,EAAIziB,OAAOqgB,GACXoC,EAAI7pB,MAAMkpD,QAAU,MAID,QAAtB,EAAAlN,aAAQ,EAARA,EAAUrqC,oBAAY,eAAEI,KAAM,OAAAirC,GAAA,GAAmBv1B,EAAKu0B,EAASrqC,aAAaI,IAAK2tC,GAAeA,KC1NtF,MAAM,GAGnB,OACEriD,KAAK6N,QAAU3N,SAAS4uC,eAAe,gBACvC,MAAM0wC,EAAgBx/E,KAAK6N,QAAQ6S,kBACnC8+D,EAAcx+E,iBAAiB,QAAS,GAAkBivD,cAE1D,MAAMlyB,EAAS,IAAI,IAAW/9B,KAAK6N,QAAS,QACtC4xE,EAAU,IAAI,GAAYD,EAAeE,GAAuB3hD,GAChE5X,EAAY,aAAanmB,KAAK6N,SAAS,GAE7C,KAAWkoB,UAAU,wBAAyB,CAAC0lC,KAAM,MAAM56D,KAAM6K,IAGlD,uBAAVA,EAAItE,GACLsE,EAAI8xC,KAAKl3C,QAAQ,CAAC2N,EAAK5P,KACrBqH,EAAI8xC,KAAKn5C,GAAO4P,EAAM,IAAewkC,QAAQxkC,GAE7CwrE,EAAQp/E,IAAI4T,KAIhBkS,EAAUxkB,WAGZ,GAAkBg+E,uBAAuBF,EAAQz1D,cAAey1D,EAAQX,qBAExE9+E,KAAKkO,KAAO,KAGd,Y,2SCpBK,MAAM,GAIX,YAAoB0xE,EAA6CnzD,GAA7C,KAAAmzD,uBAA6C,KAAAnzD,QAFzD,KAAAozD,aAAoC,IAAIh8E,IA8CxC,KAAAi8E,wBAA0B,CAACtzD,EAAkB3N,KAEnCwgC,EAAA,EAAqB4/B,cAAczyD,GAC3ClmB,QAAQmc,IACV5D,EAGFwgC,EAAA,EAAqB6/B,eAAez8D,GAAQ,GAF5C48B,EAAA,EAAqB6/B,eAAez8D,GAAQ,GAAM,MAOhD,KAAA08D,kBAAqB3yD,IAC3B,MAAMrY,EAAQqY,EAAIpgB,QAAQ+H,MACpBF,EAAM,IAAeC,OAAOC,GAE5BrU,EAAOyjB,EAAA,EAAWosB,OAAOs2B,WAAWvlE,MAIpCyF,EAAUomB,GAAY,CAC1BtY,MACAuY,IAAKA,EACL9rB,MAAOZ,EACPa,OAAQb,EACRkqB,cAAe,KACfyC,MAAOzsB,KAAKysB,MACZs1B,WAAW,EACXtgD,MAAM,EACNjB,MAAM,IAYR,OATA2F,EAAQtF,KAAK,KAEXb,KAAK8/E,wBAAwBtzD,EAAKxsB,KAAKgqB,cAAc+0D,YAAYC,UAAUxyD,MAOtErmB,GAGF,KAAA24E,oBAAuBtyD,IAC5B,MAAMrY,EAAQqY,EAAIpgB,QAAQ+H,MACpBF,EAAM,IAAeC,OAAOC,GAIlCnU,KAAK8/E,wBAAwBtzD,GAAK,GAElCA,EAAIvoB,UAAY,GAChBjE,KAAK+/E,cAAc9rE,EAAKuY,IAhGxBxsB,KAAKgqB,cAAgB,IAAI,UAAoBtlB,EAAW,CAACmQ,EAAQgK,KAC3DA,GACF7e,KAAK8+E,oBAAoBjqE,KAKxB,QACL7U,KAAKgqB,cAAc7f,QAGd,cAAc8J,EAAiBuY,EAAsB1C,GAoB1D,OAnBI0C,KACFA,EAAMtsB,SAASC,cAAc,QACzBC,UAAUC,IAAI,YAAa,iBAEZ,IAAhB4T,EAAIqoC,SACLt8C,KAAKggF,mBAAmBxzD,IAK5BD,GAAY,CACVtY,MACAuY,MACAxC,cAAehqB,KAAK4/E,qBACpBnzD,MAAOzsB,KAAKysB,MACZs1B,UAA2B,IAAhB9tC,EAAIqoC,QACfxyB,iBAGK0C,EAGF,mBAAmBA,GACxBxsB,KAAK6/E,aAAax/E,IAAImsB,GAEtBxsB,KAAKgqB,cAAcme,QAAQ,CACzB3b,MACA1mB,KAAM9F,KAAKm/E,qBA6DF,MAAM,GAArB,cAIU,KAAArX,YAGH,GAGG,KAAA1rB,eAA+B,GAM/B,KAAAmQ,SAAU,EAEV,KAAA0zB,kBAAgE,GAMxE,aAAaC,EAA0BC,EAAwB,GAAIh6E,EAAgCsZ,GAGjG,MAAMy+D,EAAWh+E,SAASC,cAAc,OACxC+9E,EAAS99E,UAAUC,IAAI,iBAAkB,kBAEzC,MAAM49E,EAAW/9E,SAASC,cAAc,OAmCxC,OAlCA89E,EAAS79E,UAAUC,IAAI,kBAEpB8/E,IACDlC,EAASh6E,UAAYk8E,GAGvBD,EAAYn2E,OAAOk0E,EAAUC,GAE7Bl+E,KAAKy+E,kBAAkBG,2BAA2BsB,GAElDlgF,KAAKigF,kBAAkBt6E,KAAK,CAACqP,QAASkrE,EAAazgE,YAEnDtZ,EAAQtF,KAAKg4C,IACXA,EAAUvyC,QAAQ2N,IAEhBiqE,EAASn0E,OAAO/J,KAAKogF,qBAAqBL,cAAc9rE,MAGvDjU,KAAKigF,kBAAkB99E,SACxBnC,KAAKigF,kBAAkB35E,QAAQ,EAAE0O,UAASyK,cACrCA,EACEzf,KAAKqgF,UAAUvvE,eAChB9Q,KAAK6lE,YAAYpmD,QAAQzK,GACzBhV,KAAK6lE,YAAYpmD,QAAQzf,KAAKqgF,YAE9BrgF,KAAK6lE,YAAYpmD,QAAQzK,GAEtBhV,KAAK6lE,YAAY97D,OAAOiL,KAGjChV,KAAKigF,kBAAkB99E,OAAS,KAI7B,CAAC87E,YAGJ,iBAAiBtpE,EAA4B8K,GAAU,G,0CAC3D,MAAMygE,EAAchgF,SAASC,cAAc,OAC3C+/E,EAAY9/E,UAAUC,IAAI,oBAC1B6/E,EAAY9zE,QAAQ+C,GAAK,GAAKwF,EAAIxF,GAClC+wE,EAAY9zE,QAAQ6uC,YAAc,GAAKtmC,EAAIsmC,YAE3C,MAAMpgC,EAAS3a,SAASC,cAAc,UACtC0a,EAAOza,UAAUC,IAAI,WAAY,4BAEjCL,KAAK8nE,YAAYnzD,EAAIxF,IAAM,CACzBmqC,SAAU4mC,EACV1wE,IAAKqL,GAGJ4E,EACDzf,KAAKo+E,KAAKr9D,aAAalG,EAAQ7a,KAAKo+E,KAAK19D,kBAAkB03C,aAE3Dp4D,KAAKo+E,KAAKr0E,OAAO8Q,GAKnB,MAAM1U,EAAU,GAAmBizC,cAAczkC,GACjD3U,KAAKsgF,aAAaJ,EAAa,IAAkBp0D,cAAcnX,EAAI/G,OAAQzH,EAAQtF,KAAKo4C,GAAcA,EAAWJ,WAA4Bp5B,SACpHtZ,EAIzB28C,GAAoB,CAClBnuC,MACA1U,UAAW4a,EACX4R,MAAOizD,GACP11D,cAAe,GAAkBA,cACjCtpB,MAAO,GACPC,OAAQ,GACRF,UAAU,OAId,OACET,KAAK6N,QAAU3N,SAAS4uC,eAAe,oBAGvC9uC,KAAKqgF,UAAYngF,SAASC,cAAc,OACxCH,KAAKqgF,UAAUjgF,UAAUC,IAAI,mBAAoB,mBAEjD,IAAIkgF,EAAcvgF,KAAK6N,QAAQ2hC,uBAC/BxvC,KAAKo+E,KAAOmC,EAAY7/D,kBAExB,IAAI8/D,EAAa,IAAI,IAAYD,GAEjCvgF,KAAK6lE,YAAc3lE,SAASC,cAAc,OAC1CH,KAAK6lE,YAAYzlE,UAAUC,IAAI,uBAC/BL,KAAK6N,QAAQ9D,OAAO/J,KAAK6lE,aAmBzBj9D,EAAA,QAAU5H,iBAAiB,qBAAuBiB,IAChD,MAAM0S,EAA6B1S,GAE/BjC,KAAK8nE,YAAYnzD,EAAIxF,KAAOnP,KAAKusD,SACnCvsD,KAAK+nE,iBAAiBpzD,GAAK,KAI/B/L,EAAA,QAAU5H,iBAAiB,mBAAqBiB,IAC9C,MAAM0S,EAA6B1S,EAEnC,GAAGjC,KAAK8nE,YAAYnzD,EAAIxF,KAAOnP,KAAKusD,QAAS,CAC3C,MAAMtlC,EAAWjnB,KAAK8nE,YAAYnzD,EAAIxF,IACtC8X,EAASqyB,SAAS33C,SAClBslB,EAASzX,IAAI7N,gBACN3B,KAAK8nE,YAAYnzD,EAAIxF,OAIhCnP,KAAK6lE,YAAY7kE,iBAAiB,QAAUiB,IAC1C,MAAM4S,EAAS5S,EAAE4S,OACjB,GAAG,OAAA+J,GAAA,GAAgB/J,EAAQ,kBAA3B,CACE,MAAM9E,EAAK,OAAAmrB,GAAA,GAAgBrmB,EAAQ,WACnC,IAAI,GAAc,CAAC1F,GAAIY,EAAG3D,QAAQ+C,GAAI8rC,YAAalrC,EAAG3D,QAAQ6uC,cAAcx8B,YAI9E,GAAkBwxC,aAAahuD,KAGjC,MAAMw+E,EAAY,CAAC51D,GAAS,KAC1BjiB,EAAA,QAAU6F,cAAc,oBAAqBoc,IAG/C7qB,KAAK+9B,OAAS,IAAI,IAAW/9B,KAAK6N,QAAS,YAC3C7N,KAAK+9B,OAAO7yB,oBAAoBlL,KAAK6lE,aACrC7lE,KAAK+9B,OAAO6O,mBAAqB,KAC/B6zC,KAGF,GAAkBz/E,iBAAiB,SAAU,KAC3Cy/E,GAAU,KAGZ,GAAkBz/E,iBAAiB,SAAU,KAC3Cy/E,MAGFzgF,KAAKy+E,kBAAoB,GAAkBD,YAAYx+E,KAAKo+E,KAAMp+E,KAAK+9B,OAAQyiD,GAAY/B,kBAE3F,MAAMt4D,EAAY,aAAanmB,KAAK6N,SAAS,GAE7ChL,QAAQC,IAAI,CACV,GAAmBm5C,oBAAoBp7C,KAAKy4C,IAC1Ct5C,KAAKo8C,eAAiB9C,EAASA,SAAS71C,MAAM,EAAG,IAIjDzD,KAAK8nE,YAAoB,OAAI,CAC3BxuB,SAAUt5C,KAAKqgF,UACf7wE,IAAKxP,KAAKo+E,KAAK19D,mBAGjByF,EAAUxkB,SACV,MAAM,SAACs8E,GAAYj+E,KAAKsgF,aAAatgF,KAAKqgF,UAAW,GAAIx9E,QAAQoD,QAAQjG,KAAKo8C,iBAAiB,GAC/F6hC,EAASl0E,OAAO,eAAK,sBAGvB,GAAmB6xC,iBAAiB/6C,KAAM6K,IACxCya,EAAUxkB,SAEV,IAAI,IAAIgT,KAAQjJ,EAAgDyvC,KAC9Dn7C,KAAK+nE,iBAAiBpzD,OAGzB0M,QAAQ,KACTrhB,KAAKusD,SAAU,EACfk0B,MAGFzgF,KAAKogF,qBAAuB,IAAI,GAAqB,GAAkBp2D,cAAe01D,IAEtF,GAAkBC,uBAAuB3/E,KAAKogF,qBAAqBp2D,cAAehqB,KAAKogF,qBAAqBtB,qBAU5G9+E,KAAKkO,KAAO,KAGd,kBAAkB+F,G,MAGhB,GAFA,GAAmBysE,kBAAkBzsE,KAEnB,QAAd,EAAAjU,KAAKqgF,iBAAS,eAAEvvE,eAClB,OAGF,IAAI0b,EAAMxsB,KAAKqgF,UAAUxwE,cAAc,iBAAiBoE,EAAI9E,QACxDqd,IACFA,EAAMxsB,KAAKogF,qBAAqBL,cAAc9rE,IAGhD,MAAMzO,EAAQxF,KAAKqgF,UAAUxwE,cAAc,mBAC3CrK,EAAMia,QAAQ+M,GAEXhnB,EAAMyE,kBAAoB,IAC1B9B,MAAMC,KAAK5C,EAAM4f,UAA4B3hB,MAAM,IAAI6C,QAAQyJ,GAAMA,EAAGpO,UAI7E,Y,2SCiBF,MAAM,GAAuB,IAtXtB,MAAP,cACU,KAAAg/E,cAAgE,GAChE,KAAAC,QAKJ,GAEG,YAAYC,GACjB,MAAiB,aAAVA,EAAIz5E,EAAmB,CAC5BA,EAAG,gBACH05E,IAAKD,EAAIC,IACTC,KAAMF,EAAIE,KACVC,gBAAiBH,EAAIG,iBACnB,CACF55E,EAAG,sBAIA,iBAAiBH,EAAgBg6E,EAAcr2E,EAAQ,GAAI8kB,EAAS,GAAImxD,GAC7E,OAAO,KAAgB9qD,UAAU,+BAAgC,CAC/DymC,IAAK,IAAgBvE,aAAagpB,GAClCngD,KAAM,IAAgBsoC,iBAAiBniE,GACvC2D,QACAs2E,UAAWL,EAAM7gF,KAAKmhF,YAAYN,QAAOn8E,EACzCgrB,UACC,CAAmB0xD,UAAW,EAAGC,YAAY,IAAOxgF,KAAKygF,IAC1D,MAAMC,EAAUD,EAAWE,SAoB3B,OAdAF,EAAWpkD,QAAQ52B,QAAQD,IACT,yBAAbA,EAAOe,IACLf,EAAOnG,WACRmG,EAAOnG,SAAW,IAAeu4C,QAAQpyC,EAAOnG,WAG/CmG,EAAO7B,QACR6B,EAAO7B,MAAQ,IAAiBi9E,UAAUp7E,EAAO7B,SAIrDxE,KAAK2gF,cAAc3gF,KAAK0hF,YAAYH,EAASl7E,EAAO8I,KAAO9I,IAGtDi7E,IAIJ,YAAYC,EAA4DI,GAC7E,OAAOJ,EAAU,IAAMI,EAGjB,eAAeV,GACrB,IAAgBhuB,YAAY,eAAepyD,KAAM+gF,IAC/C,MAAMC,EAAYZ,EAAM95D,WAClB7K,EAAQslE,EAASzsE,UAAU2sE,GAAWA,EAAQ3yE,KAAO0yE,GAC3D,IAAIC,EAEFA,GADY,IAAXxlE,EACSslE,EAAStlE,GAET,CACRnN,GAAI0yE,EACJE,OAAQ,KAIVD,EAAQC,OACV,YAA2BH,EAAUE,EAAS,UAE9C/tD,EAAA,QAAgBiuD,qBAAqB,mBAMlC,WAAWt2B,EAAoBu1B,EAAcgB,GAGlD,OAFAjiF,KAAK4gF,QAAQK,GAAS,CAACh6E,OAAQykD,EAAYlX,KAAMC,KAAKC,OACtD9rC,EAAA,QAAU6F,cAAc,gBAAiB,CAACxH,OAAQg6E,EAAM95D,aACjD,IAAmB+6D,SAASjB,OAAOv8E,EAAWu9E,GA8G1C,kBAAkBhB,G,0CAC7B,MAAMzkB,EAAM,IAAgBl4B,QAAQ28C,GACpC,IAAIzkB,IAAQA,EAAIllD,OAAOklD,MAAQA,EAAI2lB,uBACjC,OAGF,MAAMC,EAAWpiF,KAAK4gF,QAAQK,GAC9B,OAAGmB,WACMpiF,KAAK4gF,QAAQK,GAChBxsC,KAAKC,MAAQ0tC,EAAS5tC,KAAQ,MACzB4tC,EAASn7E,YAHpB,KAQK,kBAAkBA,EAAgB6D,EAAkBm2E,EAAcr2E,GACvEhC,EAAA,QAAU6F,cAAc,gBAAiB,CAACxH,SAAQ6D,aAClD,KAAiBu3E,SAASp7E,EAAQ6D,EAAU,IAAM,IAAgBw5B,QAAQ28C,GAAOprD,SAAW,IAAMjrB,GAG7F,oBAAoB3D,EAAgBJ,EAAagU,GACtD,OAAO,KAAgBkb,UAAU,gCAAiC,CAChE+K,KAAM,IAAgBsoC,iBAAiBniE,GACvCq7E,OAAQ,IAAsBC,mBAAmB17E,GACjD+9D,KAAM/pD,EAAO+pD,MACZ,CAAmBwc,UAAW,EAAGC,YAAY,IAAOxgF,KAAM2hF,IACtB,iBAA3BA,EAAep+E,SAAwBo+E,EAAep+E,QAAQjC,QACtEoyB,GAAM,IAAkByX,aAAaw2C,EAAep+E,QAAS,CAACq+E,SAAS,EAAMC,cAAc,OAyB1F,iBAAiBz7E,EAAgBg6E,EAAc0B,EAA2B3/E,EAW5E,I,MACH,MAAM4/E,EAAe5iF,KAAK2gF,cAAcgC,GACxC,IAAIC,EACF,OAGF5iF,KAAK6iF,eAAe5B,GACpB,MAAMjpB,EAAW2qB,EAAkB3iC,MAAM,KACnC8iC,EAAU9qB,EAASpyD,QACnBm9E,EAAW/qB,EAAShxC,KAAK,KAQ/B,GAPAhkB,EAAQwwE,SAAWyN,EACnBj+E,EAAQu+E,QAAUuB,EAClB9/E,EAAQ2+E,SAAWoB,EAChBH,EAAaI,aAAaC,eAC3BjgF,EAAQkgF,YAAcN,EAAaI,aAAaC,cAGf,yBAAhCL,EAAaI,aAAa57E,EAC3BpE,EAAQizC,SAAW2sC,EAAaI,aAAa/sC,SAC7C,IAAmBktC,SAASl8E,EAAQ27E,EAAaI,aAAa5+E,QAASpB,OAClE,CACL,IACIogF,EADA7qD,EAAU,GAEd,MAAM8qD,EAAcT,EAAaI,aACjC,OAAOK,EAAYj8E,GACjB,IAAK,4BAGH,GAFAmxB,EAAU8qD,EAAYj/E,QAEA,yBAAnBw+E,EAAax7E,EAA8B,CAC5C,MAAM,SAAClH,EAAQ,MAAEsE,GAASo+E,EAExBQ,EADCljF,EACY,IAAeojF,cAAcpjF,GAE7B,IAAiBojF,cAAc9+E,GAIhD,MAGF,IAAK,2BACH4+E,EAAa,CACXh8E,EAAG,qBACH85E,UAAWlhF,KAAKmhF,YAAYkC,EAAYxC,MAG1C79E,EAAQugF,SAAWF,EAAYxC,IAE/B,MAGF,IAAK,6BACHuC,EAAa,CACXh8E,EAAG,kBACH85E,UAAWlhF,KAAKmhF,YAAYkC,EAAYxC,KACxCjzE,MAAOy1E,EAAYz1E,MACnB41E,QAASH,EAAYG,QACrBC,SAAUJ,EAAYI,SACtBC,SAAUL,EAAYK,SACtBC,WAAYN,EAAYM,YAG1B3gF,EAAQugF,SAAWF,EAAYxC,IAE/B,MAGF,IAAK,+BACHuC,EAAa,CACXh8E,EAAG,oBACHw8E,aAAcP,EAAYO,aAC1Bp/C,WAAY6+C,EAAY7+C,WACxBC,UAAW4+C,EAAY5+C,UACvBo/C,MAAOR,EAAYQ,OAOrBT,IACFA,EAAa,CACXh8E,EAAG,sBACHjE,KAAMy/E,EAAaz/E,KACnBgW,UAAWypE,EAAah1E,QACmC,QAAxD,EAAAg1E,EAAiD/0E,eAAO,eAAE6G,MAC1DkuE,EAAiDluE,IACpD5U,KAAM,EACNshB,SAAU,CAAC0iE,QAAS,GAAIl5D,MAAO,KAInC,IAAmBm5D,UAAU98E,EAAQm8E,EAAYpgF,MA4BvD,OAAmB,KAAeghF,qBAAuB,IAC1C,U,uSC7XA,MAAM,WAAmB,EAAxC,c,oBAIU,KAAAC,WAAa,GACb,KAAA9+E,WAAY,EA2BZ,KAAA++E,YAAejiF,IACrB,MAAM4S,EAAS,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAAQ,OACzC,IAAIA,EAAQ,OAEZ,MAAM4wD,EAAS5wD,EAAOzI,QAAQ+H,MAC3B,GAAaiY,KAAKrqB,MAAM2jE,wBAAwBD,GAC9CliD,EAAA,EAAWC,UACZ,GAAgB1U,kBAGlBpC,QAAQkK,KAAK,oBAAqB6uD,IA9B5B,OACRzlE,KAAKC,UAAUkP,GAAK,wBAEpBnP,KAAKgwE,YAAc,IAAI,EAAY,kBAAoB9tE,IACrDlC,KAAKoJ,QACLpJ,KAAK68E,OAAO36E,KAGdlC,KAAK4N,MAAMmb,YAAY/oB,KAAKgwE,YAAY/vE,WAExCD,KAAKmkF,QAAUjkF,SAASC,cAAc,OACtCH,KAAKmkF,QAAQ/jF,UAAUC,IAAI,gBAC3B,YAAiBL,KAAKmkF,QAASnkF,KAAKkkF,YAAa,CAACn2E,eAAgB/N,KAAK+N,iBAEvE/N,KAAK+K,WAAWhB,OAAO/J,KAAKmkF,SAE5BnkF,KAAKy/E,QAAU,IAAI,GAAYz/E,KAAKmkF,QA9BjB,cA8B0CnkF,KAAK+K,YAkB7D,UACL/K,KAAK+K,WAAWM,iBAAmB,OAG9B,sBAKL,OAJArL,KAAKoJ,QACLpJ,KAAKmkF,QAAQlgF,UAAY,GACzBo7C,EAAA,EAAqB+kC,qBAAgB1/E,EAvDlB,eAwDnB1E,KAAKgwE,YAAYruE,SACVsB,MAAM0L,sBAGP,QACN3O,KAAK0K,cAAgB,KACrB1K,KAAKikF,WAAa,GAClBjkF,KAAKmF,WAAY,EACjBnF,KAAKy/E,QAAQt1E,QAGR,OACL,MAAMw7B,EAAM1iC,MAAM8N,OAQlB,OAPA,GAAgBo+B,eAAc,GAAMtuC,KAAK,KACvCb,KAAK68E,OAAO,IAAI,GAEhB78E,KAAK+K,WAAWM,iBAAmB,KACjCrL,KAAK68E,OAAO78E,KAAKgwE,YAAY9tE,OAAO,MAGjCyjC,EAGI,OAAO/6B,EAAey5E,GAAY,G,0CAC7C,IAAGrkF,KAAK0K,gBAAiB1K,KAAKmF,UAA9B,CAEInF,KAAKskF,eACPtkF,KAAKskF,oBAAsB,IAAgBC,gBAAgB,QAAQp1E,GAAGgY,UAAS,IAGjF,IACEnnB,KAAK0K,cAAgB,GAAqB85E,iBAAiB,KAAcxkF,KAAKskF,aAAc15E,EAAO5K,KAAKikF,YACxG,MAAM,QAAE/mD,EAAO,YAAEmU,SAAsBrxC,KAAK0K,cAE5C,GAAG1K,KAAKgwE,YAAY9tE,QAAU0I,EAC5B,OAGF5K,KAAK0K,cAAgB,KACrB1K,KAAKikF,WAAa5yC,EACfgzC,IACDrkF,KAAKmkF,QAAQlgF,UAAY,IAGxBi5B,EAAQ/6B,OACT+6B,EAAQ52B,QAASD,IACC,yBAAbA,EAAOe,GAAgCf,EAAOnG,UAC/CF,KAAKy/E,QAAQp/E,IAAIgG,EAAOnG,YAI5BF,KAAKmF,WAAY,EAGnBnF,KAAK+K,WAAW62B,WAChB,MAAMn1B,GAGN,MAFAzM,KAAK0K,cAAgB,KACrBgC,QAAQC,MAAM,sBAAuBF,GAC/BA,QChHG,MAAM,WAAuB,EAKhC,OACRzM,KAAKC,UAAUkP,GAAK,qBACpBnP,KAAKC,UAAUG,UAAUC,IAAI,sBAE7BL,KAAKgqB,cAAgB,IAAI,KAEzBhqB,KAAKgwE,YAAc,IAAI,EAAY,gCAAkC9tE,IACnElC,KAAK68E,OAAO36E,KAGdlC,KAAK4N,MAAMmb,YAAY/oB,KAAKgwE,YAAY/vE,WAExCD,KAAKykF,QAAUvkF,SAASC,cAAc,OACtCH,KAAKykF,QAAQrkF,UAAUC,IAAI,gBAC3BL,KAAK+K,WAAWhB,OAAO/J,KAAKykF,SAE5B,YAAiBzkF,KAAKykF,QAAUxiF,IAC9B,MAAMq6C,EAAU,OAAA19B,GAAA,GAAgB3c,EAAE4S,OAAQ,uBAC1C,GAAGynC,EAAS,CACV,MAAMnoC,EAAQmoC,EAAQlwC,QAAQ+H,MAE9B,YADA,GAAaiY,KAAKrqB,MAAM2jE,wBAAwBvxD,GAIlD,MAAMU,EAAS,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAAQ,eACzC,IAAIA,EAAQ,OAEZ,MAAM1F,EAAK0F,EAAOzI,QAAQ6sC,WACpBgC,EAAcpmC,EAAOzI,QAAQ6uC,YAE7BpgC,EAAS,OAAA+D,GAAA,GAAgB3c,EAAE4S,OAAQ,sBACtCgG,GACD5Y,EAAE8Y,iBACF9Y,EAAE8rD,cAAe,EAEjBlzC,EAAOzX,aAAa,WAAY,QAEhC,GAAmBg2C,cAAc,CAACjqC,KAAI8rC,gBAAcp6C,KAAKspB,IACvD,GAAmB67C,iBAAiB77C,EAAKxV,KAAK9T,KAAK43B,IAC9CA,IACD5d,EAAOrI,YAAc,GACrBqI,EAAO9Q,OAAO,eAAKogB,EAAKxV,IAAI8lC,eAAiB,uBAAyB,uBACtE5/B,EAAOza,UAAUkM,OAAO,SAAU6d,EAAKxV,IAAI8lC,mBAE5Cp5B,QAAQ,KAETxG,EAAO2oB,gBAAgB,iBAI3B,GAAmB4V,cAAc,CAACjqC,KAAI8rC,gBAAcp6C,KAAKspB,IACvD,IAAI,GAAcA,EAAKxV,KAAK8J,UAG/B,CAAC1Q,eAAgB/N,KAAK+N,iBAGpB,sBAGL,OAFA/N,KAAKykF,QAAQxgF,UAAY,GACzBo7C,EAAA,EAAqB+kC,qBAAgB1/E,EAAW,mBACzCzB,MAAM0L,sBAGR,UAAUgG,GAEf,MAAM6X,EAAMtsB,SAASC,cAAc,OACnCqsB,EAAIpsB,UAAUC,IAAI,eAElB,MAAMoN,EAASvN,SAASC,cAAc,OACtCsN,EAAOrN,UAAUC,IAAI,sBAErB,MAAMmT,EAAUtT,SAASC,cAAc,OACvCqT,EAAQpT,UAAUC,IAAI,uBACtBmT,EAAQvP,UAAY,yCACc,IAAkB6nB,cAAcnX,EAAI/G,qBAGtE,MAAM82E,EAAWxkF,SAASC,cAAc,OACxCukF,EAAStkF,UAAUC,IAAI,qBACvBqkF,EAAS36E,OAAO,eAAK,WAAY,CAAC4K,EAAIhQ,SACtC6O,EAAQzJ,OAAO26E,GAEf,MAAM7pE,EAAS3a,SAASC,cAAc,UACtC0a,EAAOza,UAAUC,IAAI,cAAe,oBAAqB,sBACzDwa,EAAO9Q,OAAO,eAAK4K,EAAI8lC,eAAiB,uBAAyB,uBAG9D9lC,EAAI8lC,gBACL5/B,EAAOza,UAAUC,IAAI,QAKvBoN,EAAO1D,OAAOyJ,EAASqH,GAEvB,MAAMgrD,EAAc3lE,SAASC,cAAc,OAC3C0lE,EAAYzlE,UAAUC,IAAI,wBAE1B,MAAMsE,EAAQtC,KAAKC,IAAI,EAAGqS,EAAIhQ,OAC9B,IAAI,IAAIqG,EAAI,EAAGA,EAAIrG,IAASqG,EAAG,CAC7B,MAAM25E,EAAazkF,SAASC,cAAc,OAC1CwkF,EAAWvkF,UAAUC,IAAI,uBAEzBwlE,EAAY97D,OAAO46E,GAGrB,GAAmBvrC,cAAczkC,GAAK9T,KAAK8T,IAGzC,IAAI,IAAI3J,EAAI,EAAGA,EAAIrG,IAASqG,EAAG,CAC7B,MAAMwhB,EAAMq5C,EAAYzgD,SAASpa,GAC3BiJ,EAAMU,EAAIkkC,UAAU7tC,GACb,kBAAViJ,EAAI7M,GAIPmlB,GAAY,CACVtY,MACAuY,MACAxC,cAAehqB,KAAKgqB,cACpByC,MAAO,kBAGPhrB,MAAM,EACNjB,MAAM,EACNE,MAAO,GACPC,OAAQ,QA8Bd6rB,EAAIpgB,QAAQ6sC,WAAa,GAAKtkC,EAAIxF,GAClCqd,EAAIpgB,QAAQ6uC,YAAc,GAAKtmC,EAAIsmC,YACnCzuB,EAAIpgB,QAAQwB,MAAQ+G,EAAI/G,MAExB4e,EAAIziB,OAAO0D,EAAQo4D,GAEnB7lE,KAAKykF,QAAQ16E,OAAOyiB,GAGf,OACL,MAAMmZ,EAAM1iC,MAAM8N,OAKlB,OAJA,GAAgBo+B,eAAc,GAAMtuC,KAAK,KACvCb,KAAK4kF,mBAGAj/C,EAGF,iBACL,OAAO,GAAmBk/C,sBAAsBhkF,KAAKikF,IAChD9kF,KAAKgwE,YAAY9tE,QAIpB4iF,EAAc9kF,KAAK+kF,eAAe,GAAID,IAC1Bx+E,QAAQqO,IAClB3U,KAAKglF,UAAUrwE,EAAIA,SAKjB,eAAe/J,EAAek6E,GACpCA,EAAcA,EAAYrhF,QAE1B,MAAM2hB,EAAWjd,MAAMC,KAAKpI,KAAKykF,QAAQr/D,UAczC,OAbA,YAAeA,EAAUrV,IACvB,MAAMZ,EAAKY,EAAG3D,QAAQ6sC,WAChB38B,EAAQwoE,EAAY3vE,UAAUimC,GAAWA,EAAQzmC,IAAIxF,KAAOA,IAEpD,IAAXmN,EACDwoE,EAAYrgF,OAAO6X,EAAO,GACjB1R,GAAUmF,EAAG3D,QAAQwB,MAAM8tC,cAAc3hB,SAASnvB,EAAM8wC,gBACjE3rC,EAAGpO,WAIP09C,EAAA,EAAqB+kC,qBAAgB1/E,EAAW,mBAEzCogF,EAGF,OAAOl6E,GACZ,OAAIA,EAIG,GAAmBq6E,kBAAkBr6E,GAAO,GAAO/J,KAAKikF,IAC1D9kF,KAAKgwE,YAAY9tE,QAAU0I,IAM9Bk6E,EAAc9kF,KAAK+kF,eAAen6E,EAAOk6E,IAC7Bx+E,QAAQqO,IAClB3U,KAAKglF,UAAUrwE,EAAIA,SAZd3U,KAAK4kF,kB,2SC3NH,MAAM,WAAsB,IAWzC,YAAY5hF,GAGVC,OAAM,GANE,KAAAiiF,YAAa,EACb,KAAAC,QAAS,EAoCX,KAAAC,WAAcnjF,IAGpB,GADA+K,aAAahN,KAAKqlF,iBACdrlF,KAAKslF,WAAY,OAErB,MAAMC,EAAatjF,EAAUsjF,UAC1BA,GAAa,OAAAt8B,GAAA,GAAcs8B,EAAWvlF,KAAKgV,WAI9ChV,KAAKqlF,eAAiB95E,OAAOC,WAAW,KACtCxL,KAAKsM,QAAO,IA3DK,OA6Ed,KAAAA,OAAeojC,GAAqB,mCAEzC,MAAM81C,IAAkBxlF,KAAKgV,QAAQrS,MAAMC,cAAsB8B,IAAXgrC,GAAyBA,EAC/E,GAAG1vC,KAAKkO,KAAM,CACZ,IAAGs3E,EAID,OAHAxlF,KAAKkO,OACLlO,KAAKkO,KAAO,KAMhB,GAAGs3E,IAAiBxlF,KAAKslF,WAIzB,GAAItlF,KAAKgV,QAAQrS,MAAMC,cAAsB8B,IAAXgrC,GAAyBA,EAAQ,CACjE,MAAMhkC,EAAM1L,KAAKyO,cAAc,cACzB5L,QAAQC,IAAI4I,GAElB1L,KAAKgV,QAAQrS,MAAMC,QAAU,GACxB5C,KAAKgV,QAAQi0B,WAClBjpC,KAAKgV,QAAQ5U,UAAUC,IAAI,UAE3B2M,aAAahN,KAAKqlF,gBAClBrlF,KAAKqlF,eAAiB95E,OAAOC,WAAW,KACtCxL,KAAKklF,YAAa,EAClBllF,KAAKyO,cAAc,WAClB,sBAAqB,EAxGH,UAqHrBzO,KAAKyO,cAAc,SAEnBzO,KAAKgV,QAAQ5U,UAAUuB,OAAO,UAE9BqL,aAAahN,KAAKqlF,gBAClBrlF,KAAKqlF,eAAiB95E,OAAOC,WAAW,KACtCxL,KAAKgV,QAAQrS,MAAMC,QAAU,OAC7B5C,KAAKklF,YAAa,EAClBllF,KAAKyO,cAAc,WAClB,sBAAqB,EA9HH,QAiBvB,YAAWzO,KAAMgD,GAGZ,qBAAqB6X,EAAqB9M,GAC/C,IAAI+9D,GAAY,EACb,sBACD,YAAiBjxD,EAAQ,KACpBixD,GACDA,GAAY,EACZ9rE,KAAKsM,QAAO,IAEZtM,KAAKsM,UAEN,CAACyB,mBAEJA,EAAe1N,IAAIwa,EAAnB9M,CAA2B,YAAc9L,IAEpC6pE,IACD/9D,EAAe1N,IAAIwa,EAAnB9M,CAA2B,WAAY/N,KAAKolF,YAC5CtZ,GAAY,GAGd9+D,aAAahN,KAAKqlF,gBAClBrlF,KAAKqlF,eAAiB95E,OAAOC,WAAW,KACtCxL,KAAKsM,QAAO,IA1CC,OA+DX,OACJ,wBACFtM,KAAKgV,QAAQywE,WAAazlF,KAAKolF,WAC/BplF,KAAKgV,QAAQ0wE,YAAezjF,IACvBjC,KAAKklF,YAKRl4E,aAAahN,KAAKqlF,kBAyEjB,WACL,OAAOrlF,KAAKgV,QAAQ5U,UAAUuR,SAAS,W,2SCjIpC,MAAM+tE,GAAwB,qBAO9B,MAAM,WAA0B,GAoBrC,cACEz8E,MAAM,CACJ+R,QAAS9U,SAAS4uC,eAAe,oBAb7B,KAAA62C,OAAS,EA2IT,KAAAC,iBAAoBz2E,IACvBnP,KAAK2lF,QAAUx2E,IAIlBkwC,EAAA,EAAqB+kC,iBAAgB,EAAM1E,IAE3C1/E,KAAK2lF,MAAQx2E,EACbnP,KAAK6lF,aAAazlF,UAAUkM,OAAO,OAAuB,IAAftM,KAAK2lF,OAChD3lF,KAAK8lF,UAAU1lF,UAAUkM,OAAO,OAAuB,IAAftM,KAAK2lF,SAGvC,KAAAI,YAAc,KACpB,MAAM,OAAC9+E,EAAM,SAAE6D,GAAY,GAAashB,KAClChH,EAAWplB,KAAKgmF,OAAO5gE,SACvB6gE,EAAe99E,MAAMC,KAAKgd,GAE1B8gE,EAAkB,IAAmBC,cAAcl/E,EAAQ6D,EAAU,iBAC3Em7E,EAAa,GAAGl0D,gBAAgB,YAAam0D,GAE7C,MAAME,EAAc,IAAmBD,cAAcl/E,EAAQ6D,EAAU,aACvEm7E,EAAa,GAAGl0D,gBAAgB,YAAaq0D,GAE7C,MAAMz2C,EAAS3vC,KAAKgmF,OAAOn2E,cAAc,YACtC8/B,GAAiC,IAAvB,OAAA8U,GAAA,GAAW9U,IAAmBu2C,GAAoBE,GAC7DpmF,KAAKmO,UAAU,GAAG,IApJpBnO,KAAKgB,iBAAiB,OAAQ,IAAW,mCACpC,uBAEE,OAAAspD,GAAA,aACK,OAAAlpD,GAAA,GAAM,MAIbpB,KAAKgV,QAAQlE,gBAAkB,GAAasb,KAAKrqB,MAAMskF,WACxD,GAAaj6D,KAAKrqB,MAAMskF,UAAUt8E,OAAO/J,KAAKgV,SAGhDhV,KAAKsmF,WAAatmF,KAAKumF,eAEvB,GAAkBv8D,cAAcwmC,OAEhCnR,EAAA,EAAqBmnC,sBAAsB9G,QAG7C1/E,KAAKgB,iBAAiB,SAAU,KAC9Bq+C,EAAA,EAAqBonC,wBAAwB/G,IAC7C,GAAkB11D,cAAc08D,SAChC,GAAkB18D,cAAc28D,UAEhC3mF,KAAKC,UAAUG,UAAUuB,OAAO,mBAGlC3B,KAAKgB,iBAAiB,QAAS,KAC7B,GAAkBgpB,cAAcwmC,OAIhCnR,EAAA,EAAqBmnC,sBAAsB9G,IAC3CrgC,EAAA,EAAqB+kC,iBAAgB,EAAM1E,MAG7C1/E,KAAKgB,iBAAiB,SAAU,KAE9Bq+C,EAAA,EAAqBonC,wBAAwB/G,IAC7C,GAAkB11D,cAAc08D,SAChC,GAAkB18D,cAAc28D,UAEhC3mF,KAAKC,UAAUG,UAAUuB,OAAO,iBAEhC3B,KAAKsmF,gBAAa5hF,IAIZ,OACR1E,KAAK4mF,SAAW,IAAI,GACpB5mF,KAAK6mF,YAAc,IAAI,GACvB7mF,KAAK8mF,QAAU,IAAI,GAEnB9mF,KAAKoO,KAAO,CACV24E,EAAG/mF,KAAK4mF,SACRI,EAAGhnF,KAAK6mF,YACRI,EAAGjnF,KAAK8mF,SAGV9mF,KAAKC,UAAYD,KAAKgV,QAAQnF,cAAc,oCAC5C7P,KAAKgmF,OAAShmF,KAAKgV,QAAQnF,cAAc,eACzC7P,KAAKmO,UAAY,OAAAshD,EAAA,GAAezvD,KAAKgmF,OAAQhmF,KAAKC,UAAWD,KAAK4lF,iBAAkB,KAClF,MAAMp2E,EAAMxP,KAAKoO,KAAKpO,KAAK2lF,OACxBn2E,EAAItB,MACLsB,EAAItB,OAGNsB,EAAIb,qBAAuBa,EAAIb,sBAC/B0wC,EAAA,EAAqB+kC,iBAAgB,EAAO1E,MAG9C1/E,KAAK6lF,aAAe7lF,KAAKgV,QAAQnF,cAAc,sBAC/C7P,KAAK6lF,aAAa7kF,iBAAiB,QAAS,KACxB,IAAfhB,KAAK2lF,MACF,GAAgBpwC,YAAY,KAC9B,IAAI,GAAe,IAAiBxkC,OAGlC,GAAgBwkC,YAAY,KAC9B,IAAI,GAAW,IAAiBxkC,SAKtC/Q,KAAK8lF,UAAY9lF,KAAKgV,QAAQnF,cAAc,sBAC5C7P,KAAK8lF,UAAU9kF,iBAAiB,QAAUiB,I,MACxC,MAAMF,EAAQ,GAAaqqB,KAAKrqB,MAAMmlF,cACX,QAAvB,EAAAnlF,EAAM+mB,iBAAiB,eAAE8hB,SAC3B7oC,EAAMqvC,iBAAiBzvC,SACfI,EAAM+mB,YACV/mB,EAAM+mB,UAAUtW,YAAYrQ,OAG9BJ,EAAM+mB,UAAUtW,YAAczQ,EAAM+mB,UAAUtW,YAAY/O,MAAM,GAAI,GAFpE1B,EAAM+mB,UAAUnnB,UAMpB,MAAM2Y,EAAQ,IAAI+Z,MAAM,QAAS,CAAChI,SAAS,EAAMjG,YAAY,IAC7D,GAAagG,KAAKrqB,MAAMmlF,aAAaz4E,cAAc6L,GAGnD,OAAAoD,EAAA,GAAYzb,KAGd,MAAMklF,EAAiB,mBAEjBC,EAAcD,EAAiB,EAAI,EAczC,OAZGA,GACAnnF,KAAKgmF,OAAO5gE,SAAS,GAAmBhlB,UAAUC,IAAI,QAGxDL,KAAKgmF,OAAO5gE,SAASgiE,EAAc,GAAqBnsD,QACtDj7B,KAAKoO,KAAKg5E,GAAal5E,MACxBlO,KAAKoO,KAAKg5E,GAAal5E,OAGzBtF,EAAA,QAAU5H,iBAAiB,eAAgBhB,KAAK+lF,aAChD/lF,KAAK+lF,cAEE9iF,MAAMiL,OA8HR,uBAAuB8b,EAAyC80D,GACrE9+E,KAAKgB,iBAAiB,QAAS,KAC7BgpB,EAAcwmC,SAGhBxwD,KAAKgB,iBAAiB,SAAU,KAC9B,MAAM88E,EAAO9zD,EAAc+0D,YAAYsI,aAEvC,IAAI,MAAM76D,KAAOsxD,EACfgB,EAAoBtyD,GAGtBxC,EAAc+0D,YAAYuI,iBAG5BtnF,KAAKgB,iBAAiB,SAAU,KAC9BgpB,EAAcymC,qBAIX,gBACL,OAAOzwD,KAAKumF,gBAAkBvmF,KAAKsmF,WAG7B,eACN,MAAM/gD,EAAMrlC,SAAS8mD,eACrB,GAAGzhB,EAAIgiD,YAAcrnF,SAASsnF,gBAAkB,GAAap7D,KAAKrqB,MAAMmlF,aACtE,OAAO3hD,EAAIkiD,WAAW,IAzSZ,GAAAz9D,cAAgB,IAAI,KAgLpB,GAAAw0D,YAAc,CAACJ,EAAmBrgD,EAAoByiD,EAA0BnxB,EAAS,KACrG,IAAIq4B,GAAY,EAEhB,MAAMx9E,EAAaiF,GACdA,IAAOkgD,IAIV+uB,EAAKh5D,SAASiqC,GAAQjvD,UAAUuB,OAAO,UACvCy8E,EAAKh5D,SAASjW,GAAI/O,UAAUC,IAAI,UAChCgvD,EAASlgD,GAEF,GAGHsvE,EAAoB,IAAI3H,GAAkB/4C,EAAO99B,UAAW,CAAC0nF,EAAO9yE,KAGxE,GAAGxS,KAAKyuB,IAAI42D,EAAW3pD,EAAO99B,UAAUuoC,YAAc,EACpD,OAEAk/C,GAAY,EAGd,MAAME,EAAQ,OAAAnjC,GAAA,GAAW5vC,IACrB8yE,GAASC,IAIb19E,EAAU09E,GAEPpH,IACEoH,EAAQxJ,EAAKn0E,kBAAoB,EAClCu2E,EAAWvgF,UAAU4nF,WAA2B,IAAbD,EAAQ,GAE3CpH,EAAWvgF,UAAU4nF,WAAqB,GAARD,MA+BxC,OA1BAxJ,EAAKp9E,iBAAiB,QAAUiB,IAC9B,IAAI4S,EAAS5S,EAAE4S,OAGf,GAFAA,EAAS,OAAA+J,GAAA,GAAgB/J,EAAQ,6BAE7BA,EACF,OAGF,MAAM+yE,EAAQ,OAAAnjC,GAAA,GAAW5vC,GAMzB,IAAI3K,EAAU09E,GACZ,OAGF,MACM93B,GADW/xB,EAAO1D,SAAW0D,EAAO99B,WAAWmlB,SAASwiE,GACpC93B,UAAY,EAEtC/xB,EAAO99B,UAAUuoC,UAAYk/C,EAAW53B,IAKnC,CAAC2uB,oBAAmBv0E,cAGf,GAAA+lD,aAAe,CAAChuD,EAAoC6lF,GAAa,KAC7E,IAAIjzE,EAAS5S,EAAE4S,OAGf,GAFAA,EAAS,OAAA4rB,GAAA,GAAU5rB,EAAQ,QAEvBA,EAAQ,OAAO,EAEnB,MAAM4wD,EAAS5wD,EAAOzI,QAAQ+H,MAC9B,QAAIsxD,IAED,GAAar5C,KAAKrqB,MAAM2jE,wBAAwBD,OAAQ/gE,EAAWojF,IAGjEC,GAAkB9nF,YACnB8nF,GAAkB7C,YAAa,EAC/B6C,GAAkB9nF,UAAUG,UAAUC,IAAI,iBAC1C0nF,GAAkBz7E,QAAO,KAGpB,IAEPI,QAAQkK,KAAK,oBAAqB6uD,IAC3B,KAoCb,MAAMsiB,GAAoB,IAAI,GAC9B,KAAeA,kBAAoBA,GACpB,U,2SCpQf,MACMC,GAA6D,IAAInkF,IAAI,CACzE,4BACA,4BAKF,IAAIokF,QAD8BvjF,EAG9B,GAAU,EAIC,MAAM,GAkFnB,YACU0nB,EACA49B,EACAnN,EACAqrC,EACAlE,EACAmE,EACAvN,EACAwN,EACAC,EACAC,GAuQR,GAhRQ,KAAAl8D,OACA,KAAA49B,qBACA,KAAAnN,qBACA,KAAAqrC,kBACA,KAAAlE,uBACA,KAAAmE,mBACA,KAAAvN,kBACA,KAAAwN,oBACA,KAAAC,mBACA,KAAAC,wBAjFF,KAAAC,UAAY,IAAI1kF,IACjB,KAAAm3E,WAAuE,GAEvE,KAAA3uD,QAA2C,GAC3C,KAAAm8D,YAA2B,IAAI3kF,IAC9B,KAAA4kF,aAKH,GAEG,KAAAC,cAAe,EACf,KAAAC,mBAAqB,EAKrB,KAAAC,SAAqC,IAAIl5E,IACzC,KAAAm5E,aAA4B,IAAIhlF,IAKhC,KAAAsiB,UAAkC,KAElC,KAAA2iE,eAAiB,EACjB,KAAAC,kBAAoB,EAErB,KAAAC,qBAAsC,KACrC,KAAAC,cAAoG,GACpG,KAAAC,sBAAoC,KACpC,KAAAC,gCAA8C,KAE9C,KAAAC,kBAAoC,KAKpC,KAAAn9D,WAAa,eAMb,KAAAo9D,mBAA+B,GAE/B,KAAAn8C,4BAA6B,EAG7B,KAAAo8C,aAAc,EAMd,KAAAC,aAEH,GAQG,KAAAC,UAAyB,IAAI3lF,IAG7B,KAAA4lF,iBAAkB,EA0tBnB,KAAAC,eAAkBznF,I,MACvB,IAAI4S,EAAS5S,EAAE4S,OACXk3C,EAAsB,KAC1B,IACEA,EAAS,OAAAntC,GAAA,GAAgB/J,EAAQ,UACjC,MAAMpI,IAER,IAAIs/C,EAAQ,OAEZ,GAAGA,EAAO3rD,UAAUuR,SAAS,YAAc,OAAAiN,GAAA,GAAgB/J,EAAQ,kBAAmB,CACpF,GAAGk3C,EAAO3rD,UAAUuR,SAAS,eAAiB3R,KAAK2pF,UAAUvpF,UAAUuR,SAAS,gBAC9E,OAGF,IAAI,MAAM2iD,KAAat0D,KAAKyoF,aAAc,CAExC,GADUzoF,KAAKyoF,aAAan0B,GACvB9nC,MAAQu/B,EAAQ,CACnB,IAAI,GAAgB,IAAItX,MAAM6f,GAAYt0D,KAAK4pF,YAAYnrE,OAC3D,OAIJ,OAGF,IAAI,uBAAsB,OAAAG,GAAA,GAAgB/J,EAAQ,QAEhD,YADA7U,KAAKosB,KAAK+hB,UAAUE,gBAAgB0d,GAKtC,GAAG/rD,KAAKosB,KAAK+hB,UAAUC,aAAensC,EAAEyT,UAAW,CACjD,GAAGq2C,EAAO3rD,UAAUuR,SAAS,iBAAqCjN,IAAvBqnD,EAAO3/C,QAAQvF,IACxD,OAMF,OAHA,OAAA6W,EAAA,GAAYzb,GAGT,uBAAsBjC,KAAKosB,KAAK+hB,UAAUqZ,kBAC3CxnD,KAAKosB,KAAK+hB,UAAUqZ,kBAAe9iD,QAKrC1E,KAAKosB,KAAK+hB,UAAUE,gBAAgB,OAAAzvB,GAAA,GAAgB/J,EAAQ,iBAAmBk3C,GAIjF,MAAM89B,EAA0B,OAAAjrE,GAAA,GAAgB/J,EAAQ,WACxD,GAAGg1E,EAED,YADA7pF,KAAKosB,KAAK09D,aAAazjC,aAAawjC,EAAWz9E,QAAQnF,OAAOkgB,YAKhE,GADiC,OAAAvI,GAAA,GAAgB/J,EAAQ,WACzC,CACd,MAAMk1E,GAAah+B,EAAO3/C,QAAQvF,IAClC,GAAG7G,KAAKiH,SAAW,KAAiB,CAClC,MAAM7C,EAAUpE,KAAKosB,KAAKg4B,WAAW2lC,GAC/B9iF,EAASjH,KAAK46E,gBAAgB/5C,UAAUz8B,EAAQs2E,SAASC,kBACzD7vE,EAAW1G,EAAQs2E,SAASsP,gBAC5BC,EAAY7lF,EAAQq1E,SAASyQ,kBACnClqF,KAAKosB,KAAK09D,aAAaK,WAAWljF,EAAQgjF,EAAWn/E,OAChD,CACL,MAAM1G,EAAUpE,KAAKgqD,mBAAmBogC,eAAepqF,KAAKosB,KAAKg4B,WAAW2lC,GAAY3lF,KAAcA,EAA4B6zE,SAAS,GACrIA,EAAU7zE,EAAQ6zE,QACrBA,GACDj4E,KAAKgqD,mBAAmBqgC,qBAAqBrqF,KAAKiH,OAAQ7C,EAAQyC,KAAKhG,KAAKuD,IAC1EpE,KAAKosB,KAAK09D,aAAazjC,aAAa4xB,EAAQI,WAAWlxD,UAAS,QAAOziB,EAAW,aAAeN,EAAsByC,OAK7H,OAGF,MAAMyjF,EAAM,OAAA1rE,GAAA,GAAgB/J,EAAQ,UACpC,GAAGy1E,EAAK,CACN,MAAMv6E,EAAKu6E,EAAIz6E,cAAc,eAC7B,GAAGgF,IAAW9E,GAAM,OAAAk5C,GAAA,GAAcp0C,EAAQ9E,GAAK,CAC7C,MAAM3L,EAAU2L,EAAGwZ,UAAY,IAI/B,OAHAvpB,KAAKqoF,iBAAiBhG,SAASriF,KAAKiH,OAAQjH,KAAKosB,KAAKthB,SAAU1G,QAChE,OAAAsZ,EAAA,GAAYzb,IAMhB,MAAMq+C,EAAU,OAAA1hC,GAAA,GAAgB/J,EAAQ,eAAiB,OAAA4rB,GAAA,GAAU5rB,EAAQ,mBAAqB,OAAAqmB,GAAA,GAAgBrmB,EAAQ,mBACxH,GAAGyrC,GAAWA,IAAYyL,EAAQ,CAChCl3C,EAASyrC,GAAWzrC,EACpB,MAAM01E,EAAY11E,EAAOzI,QAAQnF,QAAU4N,EAAOm+D,aAAa,QACzDwX,EAAY31E,EAAOzI,QAAQo+E,UACjC,GAAyB,iBAAhB,GAA4BA,EACnC,GAAGA,EAAW,CACZ,MAAOvjF,EAAQJ,GAAO2jF,EAAUxqC,MAAM,KAEtChgD,KAAKosB,KAAK09D,aAAazjC,aAAap/C,EAAOkgB,YAAatgB,OACnD,CACL,MAAMI,EAASsjF,EAAUpjE,WACtBlgB,IAAW,KACZjH,KAAKosB,KAAK09D,aAAazjC,aAAap/C,GAEpCstB,GAAM,UAAKvb,OAAO,cAAc,IAKtC,OAaF,GAAG+yC,EAAO3rD,UAAUuR,SAAS,YAAckD,EAAO/D,cAAc1Q,UAAUuR,SAAS,cAAe,CAChG,MAAM84E,GAAa1+B,EAAO3/C,QAAQvF,IAG5BoN,EAAmB,QAAb,EAFIjU,KAAKosB,KAAKg4B,WAAWqmC,GAEjB33E,aAAK,eAAE5S,SAM3B,aAJG+T,aAAG,EAAHA,EAAKsxD,kBACN,IAAI,GAActxD,EAAIsxD,iBAAiB9mD,QAM3C,MAAMisE,EAAc,OAAA9rE,GAAA,GAAgB/J,EAAQ,uBAC5C,GAAuB,QAAnBA,EAAO+1B,UAAsB/1B,EAAOzU,UAAUuR,SAAS,WAAakD,EAAOzU,UAAUuR,SAAS,mBAC7FkD,EAAOzU,UAAUuR,SAAS,eAEN,UAAnBkD,EAAO+1B,UAAwBmhB,EAAO3rD,UAAUuR,SAAS,UACzD+4E,IAAgBA,EAAY76E,cAAc,wBAA0B,CACxE,MACM46E,IADc,OAAA7rE,GAAA,GAAgB/J,EAAQ,eAAiB,OAAA+J,GAAA,GAAgB/J,EAAQ,uBAClDk3C,GAAQ3/C,QAAQvF,IAC7CzC,EAAUpE,KAAKosB,KAAKg4B,WAAWqmC,GACrC,IAAIrmF,EAEF,YADApE,KAAKsuD,IAAI13C,KAAK,2BAA4B6zE,GAI5C,MAAME,EAAyB,UACzBC,EAAgB7+B,EAAO3rD,UAAUuR,SAASg5E,GAE1CzwD,EAAIwwD,EAAe53E,GAChB,GAAe+3E,mCAAmC/3E,GACtDA,GACgB,UAAZA,EAAM1L,GAAiB,CAAC,QAAS,OAAO2yB,SAASjnB,EAAM3P,MAG1DqF,EAAiE,GACjEqrD,EAAM+2B,EAAgB,CAACH,GAAazzE,OAAOy0C,KAAKzrD,KAAKqsB,SAAS5jB,IAAIipC,IAAMA,GAAG9pC,OAAOuH,IAMtF,MAAM/K,EAAUpE,KAAKosB,KAAKg4B,WAAWj1C,GAC/B2D,EAAQ9S,KAAKgqD,mBAAmBz0C,oBAAoBnR,GAE1D,OAAO0O,GAASonB,EAAEpnB,KACjBzK,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAEtBsrD,EAAIvtD,QAAQ6I,IACV,IAAI4X,EACJ,GAAG2jE,EACD3jE,EAAW,0BACN,CAELA,EAAW,qEAETA,GAHe/mB,KAAKqsB,QAAQld,GAAI/O,UAAUuR,SAAS,mBAGvC,2BAEA,qCAIhB,MAAMsV,EAAW9e,MAAMC,KAAKpI,KAAKqsB,QAAQld,GAAIW,iBAAiBiX,IACxD+jE,EAA4B,IAAIjnF,IACtC,GAAG6mF,EACDzjE,EAAS3gB,QAAS0O,IAChBxM,EAAQ7C,KAAK,CACXqP,QAASA,EAAQnF,cAAc,iBAC/BhJ,KAAMmO,EAAQ5I,QAAQvF,IACtBI,OAAQjH,KAAKiH,eAGZ,CACL,MAAM8jF,IAAgB/qF,KAAKqsB,QAAQld,GAAIU,cAAc,6BACrDoX,EAAS3gB,QAAS0O,IAChB,GAAG+1E,IAAgB,OAAAnsE,GAAA,GAAgB5J,EAAS,4BAA6B,OACzE,IAAIg2E,EAAY,OAAApsE,GAAA,GAAgB5J,EAAS,cACzC,MAAMkzC,EAAS8iC,GAAah2E,EAAQlE,cACjCg6E,EAAQnjF,IAAIugD,KACf4iC,EAAQzqF,IAAI6nD,GACZ1/C,EAAQ7C,KAAK,CACXqP,UACAnO,IAAKmkF,GAAaA,EAAU5+E,QAAQvF,IAAMsI,EAC1ClI,OAAQjH,KAAKiH,eAMrBuB,EAAQH,KAAK,CAACC,EAAGC,IAAMD,EAAEzB,IAAM0B,EAAE1B,KAEjC,IAAIxC,EAAMmE,EAAQ2M,UAAUzE,GAAKA,EAAE7J,MAAQ4jF,GAM3C,OAJG,MACDzqF,KAAKsuD,IAAI,oCAAqCuF,EAAKxvD,EAAKmE,GAGtDA,EAAQnE,KAKZ,IAAI,IACHuV,iBAAiB,CAChB9O,SAAU9K,KAAKosB,KAAKthB,SACpB7D,OAAQjH,KAAKiH,OACbE,YAAa,CAACC,EAAGsjF,EAAc,8BAAgC,iCAC/DvhF,UAA8B,cAAnBnJ,KAAKosB,KAAKjpB,OAAyBynF,EAC9C9hF,YAAgC,cAAnB9I,KAAKosB,KAAKjpB,OAExBitD,UAAUhsD,EAASoE,EAAQnE,GAAK2Q,QAAS,GAAG,EAAMxM,EAAQ/E,MAAM,EAAGY,GAAMmE,EAAQ/E,MAAMY,EAAM,SAE9F,OAAAqZ,EAAA,GAAYzb,SAdVjC,KAAKsuD,IAAI,8BAA+Bz5C,GAqB5C,IAFkE,IAA/D,CAAC,MAAO,MAAO,QAAmB0H,QAAQ1H,EAAO+1B,WAAiB/1B,EAAS,OAAA4rB,GAAA,GAAU5rB,EAAQ,SAEhD,IAA7C,CAAC,MAAO,QAAQ0H,QAAQ1H,EAAO+1B,SAAiD,CACjF,GAAG/1B,EAAOzU,UAAUuR,SAAS,iBAAkB,CAC7C,MAAM64E,EAAYz+B,EAAO3/C,QAAQo+E,WAC1BvjF,EAAQJ,GAAO2jF,EAAUxqC,MAAM,KAGtC,YADAhgD,KAAKosB,KAAK09D,aAAazjC,aAAap/C,EAAOkgB,YAAatgB,GAEnD,GAAGgO,EAAOzU,UAAUuR,SAAS,WAAY,CAC9C,MAAM9K,GAAOklD,EAAO3/C,QAAQvF,IACtBzC,EAAUpE,KAAKgqD,mBAAmBxwC,iBAAiBxZ,KAAKiH,OAAQJ,GAKtE,YAJA,IAAI,GAAa,CACf,CAAC7G,KAAKiH,QAASjH,KAAKgqD,mBAAmBihC,iBAAiB7mF,KAM5D,IAAI8mF,GAAe,EAEnB,IACEA,IAAiB,OAAAtsE,GAAA,GAAgB3c,EAAE4S,OAAQ,SAC3C,MAAMpI,IAER,GAAGy+E,GAAgBn/B,EAAO3rD,UAAUuR,SAAS,YAA6D,CACxG,MAAMo4E,GAAah+B,EAAO3/C,QAAQvF,IAClC7G,KAAKqpF,mBAAmB1jF,KAAKokF,GAE7B,MAAM3lF,EAAUpE,KAAKosB,KAAKg4B,WAAW2lC,GAE/BtP,EAAgBr2E,EAAQs2E,SAASC,iBAAmB36E,KAAK46E,gBAAgB/5C,UAAUz8B,EAAQs2E,SAASC,kBAAoB36E,KAAKiH,OAC7HkkF,EAAa/mF,EAAQs2E,SAAS0Q,gBAEpCprF,KAAKosB,KAAK09D,aAAazjC,aAAao0B,EAAe0Q,EAAYnrF,KAAKosB,KAAKjpB,KAAMnD,KAAKosB,KAAKthB,aA+JxF,KAAA82B,SAAW,KAIb5hC,KAAKktC,4BAA8BltC,KAAK0oF,eAGvC,wBACC1oF,KAAK2oF,mBACN37E,aAAahN,KAAK2oF,oBACT3oF,KAAK2pF,UAAUvpF,UAAUuR,SAAS,iBAC3C3R,KAAK2pF,UAAUvpF,UAAUC,IAAI,gBAG/BL,KAAK2oF,mBAAqBp9E,OAAOC,WAAW,KAC1CxL,KAAK2pF,UAAUvpF,UAAUuB,OAAO,gBAChC3B,KAAK2oF,mBAAqB,GACzB,OAGF3oF,KAAK+K,WAAWsgF,mBAAqB,KAAOrrF,KAAK+K,WAAW5F,UAAU2X,QACvE9c,KAAKk2C,iBAAiB91C,UAAUC,IAAI,iBACpCL,KAAK0oF,cAAe,GACZ1oF,KAAKk2C,iBAAiB91C,UAAUuR,SAAS,mBACjD3R,KAAKk2C,iBAAiB91C,UAAUuB,OAAO,iBACvC3B,KAAK0oF,cAAe,GAGnB1oF,KAAKosB,KAAKk/D,OAAOC,eAClBvrF,KAAKosB,KAAKk/D,OAAOC,cAAcC,gBAAgBxrF,KAAK+K,WAAW0gF,uBA+9DnE,KAAA7B,WAAct1B,IACZ,MAAMrtD,EAASjH,KAAKiH,OACpBjH,KAAKgqD,mBAAmB0hC,eAAezkF,EAAQ,EAAG,GAAI,EAAGqtD,EAAWt0D,KAAKosB,KAAKthB,UAAUjK,KAAKsD,I,OACtE,QAAjB,EAAAA,aAAO,EAAPA,EAAS8G,gBAAQ,eAAE9I,QAGbnC,KAAKiH,SAAWA,GAI1BjH,KAAKosB,KAAKu/D,aAAcxnF,EAAQ8G,SAAS,GAAiBpE,KANxD7G,KAAKsuD,IAAI3hD,MAAM,kBA3nGnB3M,KAAK+N,eAAiB,IAAI,IAE1B/N,KAAKk2C,iBAAmBh2C,SAASC,cAAc,OAC/CH,KAAKk2C,iBAAiB91C,UAAUC,IAAI,UAAW,iBAE/CL,KAAK2pF,UAAYzpF,SAASC,cAAc,OACxCH,KAAK2pF,UAAUvpF,UAAUC,IAAI,iBAE7BL,KAAK4rF,YAEL5rF,KAAKk2C,iBAAiBnsC,OAAO/J,KAAK+K,WAAW9K,WAI7CD,KAAKsuD,IAAMtuD,KAAKosB,KAAKkiC,IACrBtuD,KAAK6rF,aAAe,IAAI,GAAa7rF,KAAKosB,MAC1CpsB,KAAKmmB,UAAY,IAAI,KAAqB,CACxCC,YAAY,IAEdpmB,KAAKgqB,cAAgB,IAAI,KACzBhqB,KAAKgqB,cAAc01B,UAAY,GAK/B1/C,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,iBAAkB,EAAE6I,UAAS5B,SAAQJ,UACtE,GAAG7G,KAAKosB,KAAKpjB,uBAAyBH,EAAS,CAC7C,MAAMkjD,EAAS/rD,KAAKqsB,QAAQxlB,GAC5B,IAAIklD,EAAQ,OAEZ,MAAM3nD,EAAUpE,KAAKosB,KAAKg4B,WAAWv9C,GAErC,IAAIklD,EAAO3/C,QAAQkoD,WAAclwD,EAAQ+jB,KAAO,KAAkBmsB,iBAAmB,EAEnF,YADAt0C,KAAK6rF,aAAaC,gBAAgB//B,EAAQllD,GAI5C7G,KAAK+rF,kBAAkBhgC,EAAQ3nD,GAAS,GAGrCpE,KAAKgsF,mBACNhsF,KAAKisF,uBASXjsF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,eAAgB,EAAEiH,aAChDjH,KAAKiH,SAAWA,GACjBjH,KAAKksF,oBAAoBl1E,OAAOy0C,KAAKzrD,KAAKqsB,SAAS5jB,IAAIyhC,IAAMA,MAKjElqC,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,eAAiBiC,I,oBAClD,MAAM,QAAC4G,EAAO,OAAEgzB,EAAM,YAAEswD,EAAW,IAAEtlF,GAAO5E,EAG5C,GAAGjC,KAAKosB,KAAKpjB,uBAAyBH,EACpC,OAKF,MAAM0jD,EAAUvsD,KAAKwsD,iBAAiB3wB,EAAQswD,IAAgBnsF,KAAKwsD,iBAAiB3lD,GACpF,GAAG0lD,EAAS,CACV,MAAMnoD,EAAUpE,KAAKosB,KAAKg4B,WAAWv9C,GAC/BklD,EAASQ,EAAQR,OAKvB,GAAG3nD,EAAQ6zE,QAAS,CAClB,MAAMmU,EAAiBrgC,EAAOl8C,cAAc,mBACzCu8E,IACDA,EAAehoF,QAAUA,EACzBgoF,EAAel+E,QAInB,GAAgB,QAAb,EAAA9J,EAAQ0O,aAAK,eAAE5S,SAAU,CAC1B,MAAMssB,EAAMu/B,EAAOl8C,cAAc,iCAAiCgsB,iBAClE,GAAGrP,EAAK,CACN,MAAMvsB,EAAY,OAAA2e,GAAA,GAAgB4N,EAAK,wBAEA,QAAnC,EAA2B,QAA3B,EAAiB,QAAjB,EAAA2/D,EAAYr5E,aAAK,eAAE5S,gBAAQ,eAAEkY,cAAM,eAAEjW,UAAuC,QAA7B,EAAAiC,EAAQ0O,MAAM5S,SAASkY,cAAM,eAAEjW,SAChFqqB,EAAIzD,YAAY82B,GAAa,CAACz7C,aAG7BnE,IACDA,EAAUmM,QAAQvF,IAAM,GAAKA,IAMnC,GAAGzC,EAAQioF,WAAY,CACrB,MAAM5mF,EAAQsmD,EAAOl8C,cAAc,2BAA2BgsB,QAA+BkwB,EAC1FtmD,IACDA,EAAK2G,QAAQvF,IAAM,GAAKA,GAI5B,GAAgB,QAAb,EAAAzC,EAAQ0O,aAAK,eAAEk9B,KAAM,CACtB,MAAM6B,EAAcka,EAAOl8C,cAAc,gBACzC,GAAGgiC,EAAa,CACd,MAAMy6C,EAAUloF,EAAQ0O,MAAMk9B,KAC9B6B,EAAYztC,QAAUA,EACtBytC,EAAYzuC,aAAa,UAAWkpF,EAAQn9E,IAC5C0iC,EAAYzuC,aAAa,aAAc,GAAKyD,IAIhD,GAAgB,QAAb,EAAAzC,EAAQ0O,aAAK,eAAE5S,SAAU,CAC1B,MAAM8U,EAAU+2C,EAAOl8C,cAAc,2BAA2BgsB,+BAAoCA,+BAAoCA,OACrI7mB,IACEA,aAAmB,IAAgBA,EAAQ5U,UAAUuR,SAAS,gBAC/DqD,EAAQ5I,QAAQvF,IAAM,GAAKzC,EAAQyC,WAC5BmO,EAAQ5I,QAAQqb,WACtBzS,EAAgB5Q,QAAUA,EAC1B4Q,EAAgBkU,QAAO,IAExBlU,EAAQ5I,QAAQ+H,MAAQ/P,EAAQ0O,MAAM5S,SAASiP,KAWrC,QAAb,EAAA/K,EAAQ0O,aAAK,eAAEqZ,WAAY4/B,EAAOl8C,cAAc,SACjD,eAA2BhP,KAAK,KAC9Bb,KAAKusF,kBAAkBnoF,GAAS,GAAM,EAAO2nD,GAAQ,GACrD/rD,KAAKwsF,qBAAqBzgC,UAS9B/rD,KAAKsuD,IAAI13C,KAAK,kCAAmC3U,GAGnD,MAAMoqB,EAAUrsB,KAAKqsB,QACrB,GAAGA,EAAQwP,GAAS,CAClB,MAAMkwB,EAAS1/B,EAAQwP,GACvBxP,EAAQxlB,GAAOklD,SACR1/B,EAAQwP,GAGb,aAAQ,KACHkwB,EAAO3rD,UAAUuR,SAAS,gBAC3Bo6C,EAAO3rD,UAAUuB,OAAO,cACxBoqD,EAAO3rD,UAAUC,IAAIL,KAAKiH,SAAW2B,EAAA,QAAU6O,MAA2B,cAAnBzX,KAAKosB,KAAKjpB,KAAuB,UAAY,cAK1G4oD,EAAO3/C,QAAQvF,IAAM,GAAKA,EAS5B,GANG7G,KAAKuoF,UAAU5gF,IAAIk0B,KACpB77B,KAAKuoF,UAAUl6E,OAAOwtB,GACtB77B,KAAKuoF,UAAUloF,IAAIwG,IAIC,cAAnB7G,KAAKosB,KAAKjpB,KAAsB,EACfsxC,KAAKC,MAAQ,IAAO,IACjBy3C,EAAYhkE,KAAO,IAGtCnoB,KAAKksF,oBAAoB,CAACrlF,OAKhC7G,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,eAAgB,EAAE6I,UAAS5B,SAAQJ,UAElE,GAAGgC,IAAY7I,KAAKosB,KAAKpjB,qBAAsB,OAC/C,MAAM5E,EAAUpE,KAAKosB,KAAKg4B,WAAWv9C,GAC/B0lD,EAAUnoD,EAAQioF,WAAarsF,KAAKysF,iBAAiBroF,EAAQioF,YAAcrsF,KAAKwsD,iBAAiB3lD,GACvG,IAAI0lD,EAAS,OAEb,MAAMmgC,EAAoC,cAAnB1sF,KAAKosB,KAAKjpB,KAC3BulF,EAAe1oF,KAAK0oF,aAC1B1oF,KAAKusF,kBAAkBhgC,EAAQnoD,SAAS,GAAM,EAAOmoD,EAAQR,OAAQ2gC,GAClEhE,GACD1oF,KAAKwsF,qBAAqBjgC,EAAQR,QAGjC2gC,IACA1sF,KAAKgpF,sBAAwBnmF,QAAQoD,WAAWpF,KAAK,KACpDb,KAAK2sF,4BAMb3sF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,aAAc,EAAEiH,SAAQg9C,UAAS2oC,kBAEhE,GAAG3lF,IAAWjH,KAAKiH,OAAQ,OAC3B,MACM4lF,EADO7sF,KAAKgqD,mBAAmB7F,eAAeF,GAC5BrgD,OAAOgpF,GAAan8E,KAAK5J,GAAO7G,KAAKqsB,QAAQxlB,IACrE,IAAIgmF,EAAY,OAEhB,MAAMC,EAAc,YAAqB9sF,KAAKgqD,mBAAmB+iC,uBAAuB9oC,GAAU,OAAOv+C,MAEzG1F,KAAKusF,kBAAkBvsF,KAAKosB,KAAKg4B,WAAW0oC,IAAc,GAAM,EAAO9sF,KAAKqsB,QAAQwgE,IAAa,KAIrG7sF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,sBAAuB,EAAEiH,SAAQgB,WAClE,MAAMgkB,EAAajsB,KAAKssB,gBACxB,eAA2BzrB,KAAK,KAC1BorB,KAEHhkB,EAAkB3B,QAAQO,IAKzB,YAAe7G,KAAKg7E,WAAY,CAACjzE,EAAK1D,KACpC,GAAG0D,EAAIkzE,WAAap0E,GAAOkB,EAAI0yE,gBAAkBxzE,EAAQ,CACvD,MAAM,IAACJ,EAAG,SAAEo0E,GAAYj7E,KAAKg7E,WAAWv2E,OAAOJ,EAAK,GAAG,GAGjD0nD,EAAS/rD,KAAKqsB,QAAQxlB,GAC5B,IAAIklD,EAAQ,OAEZ,MAAM3nD,EAAUpE,KAAKosB,KAAKg4B,WAAWv9C,GAEd7G,KAAKgqD,mBAAmBxwC,iBAAiBzR,EAAI0yE,cAAeQ,GACjEvgD,gBACTt2B,EAAQo2E,aAGjB,GAAcH,SAAS,CACrBjuD,KAAMpsB,KAAKosB,KACX2/B,SACA3nD,qBASZpE,KAAK+N,eAAe1N,IAAIL,KAAKk2C,iBAA7Bl2C,CAA+C,QAASA,KAAK0pF,gBAE1D,sBAAoB,CACrB,MAAMlgF,EAAY,qBACZwjF,EAAM,GACNC,EAAmB,IAAND,EACnB,IACIn4E,EACAxH,EAFA6/E,GAAc,EAGlBnnC,GAAsB,CACpB/wC,QAAShV,KAAKk2C,iBACdnP,kBAAoB9kC,KACfjC,KAAKosB,KAAK+hB,UAAUC,cAAgBpuC,KAAKgqD,mBAAmBm8B,cAAcnmF,KAAKiH,OAAQjH,KAAKosB,KAAKthB,aAKpG+J,EAAS,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAAQ,UAChCA,IACD,aAAcA,EAAQrL,GAAW,EAAM,KAClCqL,EAAOo0B,WAER57B,GAIFA,EAAKjN,UAAUuB,OAAO,cACtB0L,EAAK1K,MAAMkpD,QAAU,KAJrBx+C,EAAOnN,SAASC,cAAc,QAC9BkN,EAAKjN,UAAUC,IAAI,qBAAsB,8BAM3CwU,EAA8C9K,OAAOsD,MAG9CwH,GAEX0yB,QAAS,CAACL,EAAOC,KACf+lD,EAAchmD,GAAS+lD,EAEpBC,IAAgB7/E,EAAKjN,UAAUuR,SAAS,eACzCtE,EAAKjN,UAAUC,IAAI,cAErBgN,EAAK1K,MAAMkpD,QAAU,GAAKxpD,KAAKC,IAAI,EAAG4kC,EAAQ+lD,GAE9C,MAAM1yE,GAAKlY,KAAKP,IAAI,EAAGO,KAAKC,IAAI0qF,EAAK9lD,IACrCryB,EAAOlS,MAAMga,UAAY,cAAcpC,OACvC,gBAEFqsB,QAAS,KACP,MAAMumD,EAAUt4E,EAChB,aAAcs4E,EAAS3jF,GAAW,EAAO,IAAK,KACzC6D,EAAKyD,gBAAkBq8E,IACxB9/E,EAAKjN,UAAUuB,OAAO,cACtB0L,EAAK1L,YAIT,aAAQ,KAGN,GAFAwrF,EAAQxqF,MAAMga,UAAY,GAEvBuwE,EAAa,CACd,MAAM,IAACrmF,GAAOsmF,EAAQ/gF,QACtBpM,KAAKosB,KAAKrqB,MAAMqrF,kBAAkBvmF,GAClCqmF,GAAc,MAIpB5mD,gBAAiB,CAACnb,SAAS,KAiD/B,IAAIc,EA7CD,MACDjsB,KAAK+N,eAAe1N,IAAIL,KAAKk2C,iBAA7Bl2C,CAA+C,WAAaiC,IAC1D,MAAM8pD,EAAS,OAAAntC,GAAA,GAAgB3c,EAAE4S,OAAQ,iBAAmB,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAAQ,UACtF,GAAGk3C,EAAQ,CACT,MAAMllD,GAAOklD,EAAO3/C,QAAQvF,IAC5B7G,KAAKsuD,IAAI,iBAAkBtuD,KAAKosB,KAAKg4B,WAAWv9C,IAChD7G,KAAKqtF,gBAAgBthC,MAKvB,cAAgC,WAAnB/rD,KAAKosB,KAAKjpB,MACzBnD,KAAK+N,eAAe1N,IAAIL,KAAKk2C,iBAA7Bl2C,CAA+C,WAAaiC,IAC1D,GAAGjC,KAAKosB,KAAK+hB,UAAUC,cACpBpuC,KAAKgqD,mBAAmBm8B,cAAcnmF,KAAKiH,OAAQjH,KAAKosB,KAAKthB,UAC9D,OAGF,MAAM+J,EAAS5S,EAAE4S,OACXk3C,EAASl3C,EAAOzU,UAAUuR,SAAS,UACvCkD,EACCA,EAAOzU,UAAUuR,SAAS,sBAAwBkD,EAAO/D,cAAgB,KAC5E,GAAGi7C,IAAWA,EAAO3rD,UAAUuR,SAAS,gBAAiB,CACvD,MAAM9K,GAAOklD,EAAO3/C,QAAQvF,IAE5B,GADgB7G,KAAKosB,KAAKg4B,WAAWv9C,GAC1ByQ,OAAOoQ,YAChB,OAGF1nB,KAAKosB,KAAKrqB,MAAMqrF,iBAAiBvmF,MAKvB7G,KAAKy+E,kBAAoB,IAAI3H,GAAkB92E,KAAK+K,WAAW9K,UAAW,CAAC0nF,EAAO9yE,KAChG,IAAI,MAAMy/C,KAAat0D,KAAKyoF,aAAc,CACxC,MAAM6E,EAActtF,KAAKyoF,aAAan0B,GACtC,GAAGg5B,EAAYrtF,YAAc4U,EAAQ,CACnCy4E,EAAY9gE,IAAIpsB,UAAUkM,OAAO,YAAaq7E,GAC9C,UAON,OAAAp3B,GAAA,GAAuB,KACrBvwD,KAAKktC,4BAA6B,EAClCltC,KAAKgqB,cAAcwmC,OACnBvkC,EAAajsB,KAAKssB,iBACjB,KACDtsB,KAAKktC,4BAA6B,EAE/BjhB,GAAcA,MACfjsB,KAAKgqB,cAAc08D,SACnB1mF,KAAKgqB,cAAc28D,WAGrB16D,EAAa,MACZjsB,KAAK+N,gBAGH,uBAgIL,GA9HA/N,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,iBAAkB,EAAE6I,UAAShC,UAC3DgC,IAAY7I,KAAKosB,KAAKpjB,uBAErBhJ,KAAK+K,WAAW5F,UAAU2X,OAG5B9c,KAAKutF,uBAAuB,CAAC1mF,IAAM,GAFnC7G,KAAKosB,KAAKu/D,kBAMd3rF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,sBAAwBotC,IACzD,KAAKptC,KAAKiH,UAAUmmC,GAAe,OACnC,MAAMogD,EAASrlF,MAAMC,KAAKglC,EAAaptC,KAAKiH,SAASxD,QAAQ4E,KAAK,CAACC,EAAGC,IAAMA,EAAID,GAChFtI,KAAKutF,uBAAuBC,KAG9BxtF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,iBAAkB,EAAEiH,SAAQQ,WAC1DR,IAAWjH,KAAKiH,QACjBjH,KAAKksF,oBAAoB/jF,MAAMC,KAAKX,MAIxCzH,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAiB,EAAEiH,aACjDA,IAAWjH,KAAKiH,SACjBjH,KAAKosB,KAAKrqB,MAAM0rF,iBAChBztF,KAAK0tF,0BAIT1tF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,sBAAwBy7B,IACtDA,EAAQz7B,KAAKiH,SACdjH,KAAKosB,KAAKrqB,MAAM0rF,mBAIpBztF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,yBAA2B6L,IACzD7L,KAAKiH,SAAW4E,EAAO5E,QACxBjH,KAAKosB,KAAKrqB,MAAM0rF,mBAIpBztF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,cAAgBgS,IACjD,GAAGhS,KAAKiH,SAAW+K,EAAOmV,UAAS,GAAO,CACtBnnB,KAAK2pF,UAAUvpF,UAAUuR,SAAS,gBAClC3R,KAAKgqD,mBAAmBm8B,cAAcnmF,KAAKiH,OAAQjH,KAAKosB,KAAKthB,YAG7E9K,KAAK2tF,mBACL3tF,KAAKosB,KAAKrqB,MAAM6rF,yBAKtB5tF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,mBAAqBiC,IACtD,GAAa,uBAAVA,EAAEsM,IAA8B,CACjC,MAAMs/E,EAAiB7tF,KAAK+K,WAAW8iF,eACnCA,GACF7tF,KAAK8tF,0BAGM,YAAqB9tF,KAAKqsB,QAAS,QAC3C/lB,QAAQO,IACX,MAAMklD,EAAS/rD,KAAKqsB,QAAQxlB,GAC5B,GAAGklD,EAAO3rD,UAAUuR,SAAS,sBAAuB,CAClD,MAAMvN,EAAUpE,KAAKosB,KAAKg4B,WAAWv9C,GACrC7G,KAAKusF,kBAAkBnoF,OAASM,GAAW,EAAOqnD,MAKnD8hC,EACD7tF,KAAK+K,WAAWy9B,UAAY,MAE5BxoC,KAAK+tF,qBAAqB,IAAI,GAAM,OAAOrpF,MAKjD1E,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAiB,EAAEiH,SAAQqyE,QAAOzyE,UAChE7G,KAAKiH,SAAWA,GAEnB,aAAQ,KACN,MAAM8kD,EAAS/rD,KAAKqsB,QAAQxlB,GAC5B,IAAIklD,EAAQ,OAEZ,MAAMiiC,EAAoB7lF,MAAMC,KAAK2jD,EAAOj8C,iBAAiB,gBAC7D,GAAGk+E,EAAkB7rF,OAAQ,CAC3B,MAAM8kE,EAAM,YAAaqS,EAAO,GAChC,IAAI2U,GAAY,EAChBD,EAAkB1nF,QAAQ4nF,KACrBD,GAAaC,EAAUjqF,YAAcgjE,KACtCgnB,GAAY,EACZC,EAAUjqF,UAAYgjE,UAOhCjnE,KAAKmuF,iBAAmB,IAAI1kD,qBAAsBC,IAChDA,EAAQpjC,QAAQqjC,IACd,GAAGA,EAAMC,eAAgB,CACvB,MAAM/0B,EAAS80B,EAAM90B,OACfhO,EAAM7G,KAAK4oF,SAAS54E,IAAI6E,GAC9B7U,KAAKouF,qBAAqBv5E,EAAQhO,QAKxC7G,KAAKquF,cAAgB,IAAI5kD,qBAAsBC,IAC7CA,EAAQpjC,QAAQqjC,IACXA,EAAMC,iBACP5pC,KAAKwpF,UAAUnpF,KAAMspC,EAAM90B,OAAuBzI,QAAQvF,KAC1D7G,KAAKquF,cAAc9jD,UAAUZ,EAAM90B,QACnC7U,KAAKsuF,iCAKXtuF,KAAKsuF,0BAA4B55D,GAAS,KACxC,MAAMzsB,EAAO,IAAIjI,KAAKwpF,WACtBxpF,KAAKwpF,UAAUr/E,QAEfnK,KAAKgqD,mBAAmBukC,sBAAsBvuF,KAAKiH,OAAQgB,IAC1D,KAAM,GAAO,GAEb,mBAAoBsD,OAAQ,CAC7B,IAAIijF,EAAYxuF,KAAK+K,WAAW9K,UAAUwuF,aACtCC,GAAW,EACXC,GAAO,EACPC,EAAW,EACXC,EAAO,EACPC,EAAM,EAEV,MAAMC,EAAc,KAClB,MAAMpuF,EAASX,KAAK+K,WAAW9K,UAAUwuF,aACnCZ,EAAiB7tF,KAAK+K,WAAW8iF,eACpCltF,IAAW6tF,GAAeG,GAASd,IACpCgB,GAAQL,EAAY7tF,GAOnBkuF,IACD7uF,KAAK+K,WAAWy9B,WAAanmC,KAAKE,MAAMssF,IAG1CL,EAAY7tF,EACZiuF,EAAW,EACXE,EAAM,EACND,EAAO,EACPH,GAAW,EACXC,GAAO,GAGHK,EAAapgD,IACdkgD,GAAKvjF,OAAO4T,qBAAqB2vE,GACpCA,EAAMvjF,OAAO2T,sBAAsB0vB,EAASmgD,EAAc,KACxDD,EAAMvjF,OAAO2T,sBAAsB6vE,MA4DhB,IAAIE,eAvDHvlD,IACtB,GAAGilD,EAED,YADAK,GAAU,GAIZ,MACMruF,EADQ+oC,EAAQ,GACDwlD,YAAYvuF,OAEjC,IAAI6tF,EAEF,YADAA,EAAY7tF,GAId,MAAMwuF,EAAWX,EAAY7tF,EAC7B,IAAIkwB,EAAOs+D,EAAWN,EACtB,MAAMO,EAAQv+D,EAAO,EAGrB,GAFAA,GAAQu+D,GAEJV,IACFA,GAAW,EAMRS,EAAW,GAAKnvF,KAAK+K,WAAW8iF,gBAOjC,OALEgB,GAAQM,EAGVR,GAAO,OACPK,GAAU,GAWd,GANAJ,GAAY/9D,EAMTA,EAAM,CACP,MAAMw+D,EAAgBrvF,KAAK+K,WAAWy9B,UAAY3X,EAClD7wB,KAAK+K,WAAWy9B,UAAY6mD,EAG9BL,GAAU,GAEVH,EAAOO,EACPZ,EAAY7tF,IAKCwnC,QAAQnoC,KAAKk2C,mBAIzB,oBACL,OAAOl/B,OAAOy0C,KAAKzrD,KAAKqsB,SAASlqB,OAASnC,KAAKwoF,YAAY1oF,KAGrD,qBAAqB+U,EAAqBhO,GAChD7G,KAAK6oF,aAAaxoF,IAAIwG,GACtB7G,KAAKmuF,iBAAiB5jD,UAAU11B,GAChC7U,KAAK4oF,SAASv6E,OAAOwG,GACrB7U,KAAKsvF,eAGC,eACN,GAAGtvF,KAAKuvF,YAAa,OAErB,MAAMtjE,EAAajsB,KAAKssB,gBACxBtsB,KAAKuvF,YAAc3mF,EAAA,QAAU4mF,KAAKC,aAAa5uF,KAAK,KAClD,IAAIorB,IAAc,OAClB,IAAIrlB,EAAQvE,KAAKP,OAAOqG,MAAMC,KAAKpI,KAAK6oF,eAGxC,GAAG7oF,KAAK+K,WAAW5F,UAAU2X,OAAQ,CACnC,MAAM4yE,EAAertF,KAAKP,OAAOkV,OAAOy0C,KAAKzrD,KAAKqsB,SAAS5jB,IAAIuC,IAAMA,IAClEpE,GAAS8oF,IACV9oF,EAAQvE,KAAKP,IAAI9B,KAAKgqD,mBAAmBouB,kBAAkBp4E,KAAKiH,OAAQjH,KAAKosB,KAAKthB,UAAUlE,OAAS,EAAGA,IAI5G5G,KAAK4oF,SAAStiF,QAAQ,CAACO,EAAKgO,KACvBhO,GAAOD,GACR5G,KAAKouF,qBAAqBv5E,EAAQhO,KAItC,MAAM8oF,EAAyB,GAC/B,IAAI,MAAM9oF,KAAO7G,KAAK6oF,aAAc,CAClC,MAAMzkF,EAAqBpE,KAAKosB,KAAKg4B,WAAWv9C,GAC7C7G,KAAKgqD,mBAAmB4lC,gBAAgBxrF,IACzCurF,EAAahqF,KAAKkB,GActB,OAVA7G,KAAKgqD,mBAAmBtyC,aAAa1X,KAAKiH,OAAQ0oF,GAElD3vF,KAAK6oF,aAAa1+E,QAEf,MACDnK,KAAKsuD,IAAI,6BAA8B1nD,GAKlC5G,KAAKgqD,mBAAmB6lC,YAAY7vF,KAAKiH,OAAQL,EAAO5G,KAAKosB,KAAKthB,UAAU0B,MAAOC,IACxFzM,KAAKsuD,IAAI3hD,MAAM,mBAAoBF,GACnCzM,KAAKgqD,mBAAmB6lC,YAAY7vF,KAAKiH,OAAQL,EAAO5G,KAAKosB,KAAKthB,YACjEuW,QAAQ,KACL4K,MACJjsB,KAAKuvF,iBAAc7qF,EAEhB1E,KAAK6oF,aAAa/oF,MACnBE,KAAKsvF,oBAMN,yBACLtvF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,uBAAyBiC,IAC1D,MAAM,OAACgF,EAAM,KAAEgB,EAAI,OAAE6xE,GAAU73E,EAC5BgF,IAAWjH,KAAKiH,QAEhBgB,IACG6xE,GACF95E,KAAKksF,oBAAoBjkF,MAM1B,4BACL,MAAMq9C,EAAW,KACftlD,KAAKosB,KAAKk/D,OAAOn6E,SAASnR,KAAKgqD,mBAAmBjhD,4BAA4B/I,KAAKiH,QAAQnH,OAG7FE,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAiB,EAAEiH,SAAQJ,UACzDI,IAAWjH,KAAKiH,SAEnBjH,KAAKutF,uBAAuB,CAAC1mF,IAC7By+C,OAGFtlD,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,mBAAoB,EAAEiH,SAAQgB,WAC5DhB,IAAWjH,KAAKiH,SAEnBjH,KAAKksF,oBAAoBjkF,GACzBq9C,OAoSG,gBACL,GAAGtlD,KAAKqpF,mBAAmBlnF,OAAQ,CACjC,YAAenC,KAAKqpF,mBAAoB,CAACxiF,EAAKxC,KAC5C,MAAM0nD,EAAS/rD,KAAKqsB,QAAQxlB,GAC5B,IAAIipF,GAAM,EACV,GAAG/jC,EAAQ,CACT,MAAMlwC,EAAOkwC,EAAOjwC,wBACpBg0E,EAAOl0D,GAAA,EAAWj7B,OAAS,EAAKkb,EAAK2X,QAChC,CACWxzB,KAAKosB,KAAKg4B,WAAWv9C,GACzB6zB,UACVo1D,GAAM,GAIPA,GACD9vF,KAAKqpF,mBAAmB5kF,OAAOJ,EAAK,KAIxCrE,KAAKqpF,mBAAmBhhF,KAAK,CAACC,EAAGC,IAAMA,EAAID,GAE3C,MAAMzB,EAAM7G,KAAKqpF,mBAAmB3jF,MACpC1F,KAAKosB,KAAKu/D,aAAa9kF,QAEvB7G,KAAKosB,KAAKu/D,eAYP,iBAAiBxQ,GACtB,IAAInmE,EAAUkmE,GAAkBl7E,KAAK+K,WAAW9K,UAAWk7E,EAAc,UAkBzE,OAFGnmE,IAASA,EAAU,OAAA4J,GAAA,GAAgB5J,EAAS,WAExCA,EAGF,iBAAiBivC,GACtB,MAAMx3B,EAAQzsB,KAAKgqD,mBAAmB+iC,uBAAuB9oC,GAC7D,IAAI,MAAOp9C,KAAQ4lB,EACjB,GAAGzsB,KAAKqsB,QAAQxlB,GAAM,CACpB,MAAMD,EAAQvE,KAAKP,OAAO2qB,EAAMg/B,QAChC,MAAO,CACLM,OAAQ/rD,KAAKqsB,QAAQxlB,GACrBA,KAAMA,EACNzC,QAASpE,KAAKosB,KAAKg4B,WAAWx9C,IAKpC,OAAO,KAGF,sBAAsBmlD,GAC3B,OAAO5jD,MAAMC,KAAK2jD,EAAOj8C,iBAAiB,kBAGrC,iBAAiBjJ,EAAazC,EAAUpE,KAAKosB,KAAKg4B,WAAWv9C,IAClE,GAAGzC,EAAQioF,YAAcrsF,KAAKgqD,mBAAmB7F,eAAe//C,EAAQioF,YAAYlqF,OAAS,EAAG,CAC9F,MAAMmG,EAAItI,KAAKysF,iBAAiBroF,EAAQioF,YACxC,GAAG/jF,EAED,OADAA,EAAEyjD,OAASzjD,EAAEyjD,OAAOl8C,cAAc,iCAAiChJ,QAAYyB,EAAEyjD,OAC1EzjD,EAIX,MAAMyjD,EAAS/rD,KAAKqsB,QAAQxlB,GAC5B,GAAIklD,EAEJ,MAAO,CAACA,SAAQllD,MAAKzC,WAGf,6BAA6ByC,GACnC,OAAO7G,KAAKqsB,QAAQ,YAAqBrsB,KAAKqsB,SAAS5b,KAAKtB,I,MAC1D,QAAGA,EAAKtI,OACiB,QAAhB,EAAA7G,KAAKqsB,QAAQld,UAAG,eAAE2B,kBAIxB,gBAAgB0iB,EAAcqb,GAAW,GAE9C,IAAI7uC,KAAKiH,QAEPjH,KAAKosB,KAAK+xB,gBACVn+C,KAAKktC,4BACJ1Z,IAAQxzB,KAAK+vF,sBAAwB/vF,KAAK+K,WAAW5F,UAAUquB,OAC9DA,IAAQxzB,KAAKgwF,yBAA2BhwF,KAAK+K,WAAW5F,UAAU2X,QAEpE,OAIF,MAAM3Y,EAAU6S,OAAOy0C,KAAKzrD,KAAKqsB,SAAS5jB,IAAI0G,IAAOA,GAAI9G,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAC5E,GAAIpE,EAAQhC,OAEZ,GAAGqxB,EACE,MACDxzB,KAAKsuD,IAAI,qCAAsCnqD,EAAQ,GAAI,SAAUA,EAAQA,EAAQhC,OAAS,GAAI0sC,GAOrF7uC,KAAKiwF,WAAW9rF,EAAQ,IAAI,OAAMO,OAAWA,EAAWmqC,OAClE,CAEL,MAAMH,EAAiB1uC,KAAKgqD,mBAAmBouB,kBAAkBp4E,KAAKiH,OAAQjH,KAAKosB,KAAKthB,UAGxF,IAA8C,IAA3C3G,EAAQoY,QAAQmyB,EAAe9nC,OAEhC,YADA5G,KAAKkwF,UAAU,UAAU,GAIxB,MACDlwF,KAAKsuD,IAAI,uCAAwCnqD,EAAQA,EAAQhC,OAAS,GAAI0sC,GAGjE7uC,KAAKiwF,WAAW9rF,EAAQA,EAAQhC,OAAS,IAAI,GAAO,OAAMuC,EAAWmqC,IAqCjF,YACL7uC,KAAK+K,WAAa,IAAI,IAAW,KAAM,KAAiB,KACxD/K,KAAKkwF,UAAU,OAAO,GACtBlwF,KAAKkwF,UAAU,UAAU,GAEzBlwF,KAAK+K,WAAW9K,UAAU8J,OAAO/J,KAAK2pF,WAatC3pF,KAAK+K,WAAW6hC,mBAAqB5sC,KAAK4hC,SAC1C5hC,KAAK+K,WAAWolF,cAAgB,IAAMnwF,KAAKowF,iBAAgB,GAC3DpwF,KAAK+K,WAAWM,iBAAmB,IAAMrL,KAAKowF,iBAAgB,GAG3D,wBACDpwF,KAAK+K,WAAW9K,UAAUe,iBAAiB,YAAa,KACnDhB,KAAK2oF,mBACN37E,aAAahN,KAAK2oF,oBACT3oF,KAAK2pF,UAAUvpF,UAAUuR,SAAS,iBAC3C3R,KAAK2pF,UAAUvpF,UAAUC,IAAI,iBAE9B,CAACib,SAAS,IAEbtb,KAAK+K,WAAW9K,UAAUe,iBAAiB,WAAY,KACjDhB,KAAK2pF,UAAUvpF,UAAUuR,SAAS,kBAInC3R,KAAK2oF,oBACN37E,aAAahN,KAAK2oF,oBAGpB3oF,KAAK2oF,mBAAqBp9E,OAAOC,WAAW,KAC1CxL,KAAK2pF,UAAUvpF,UAAUuB,OAAO,gBAChC3B,KAAK2oF,mBAAqB,GACzB,QACF,CAACrtE,SAAS,KAIV,uBACL,MAAMozB,EAAiB1uC,KAAKgqD,mBAAmBouB,kBAAkBp4E,KAAKiH,OAAQjH,KAAKosB,KAAKthB,UAClFlE,EAAQ5G,KAAKiH,SAAW2B,EAAA,QAAU6O,KAAOi3B,EAAe+pC,UAAY/pC,EAAe2hD,gBAIzF,IAAI,MAAMC,KAAStwF,KAAKuoF,UACtB,GAAG+H,EAAQ,GAAKA,GAAS1pF,EAAO,CAC9B,MAAMmlD,EAAS/rD,KAAKqsB,QAAQikE,GAC5B,GAAGvkC,EAAQ,CACT,GAAGA,EAAO3rD,UAAUuR,SAAS,cAC3B,SAGFo6C,EAAO3rD,UAAUuB,OAAO,UAAW,cACnCoqD,EAAO3rD,UAAUC,IAAI,WAGvBL,KAAKuoF,UAAUl6E,OAAOiiF,IAKrB,oBAAoBroF,EAAgBsoF,GAAY,GACrDtoF,EAAK3B,QAAQO,IACX,KAAKA,KAAO7G,KAAKqsB,SAAU,OAK3B,MAAM0/B,EAAS/rD,KAAKqsB,QAAQxlB,UACrB7G,KAAKqsB,QAAQxlB,GACpB7G,KAAKwoF,YAAYn6E,OAAOxH,GAErB7G,KAAKopF,oBAAsBr9B,IAC5B/rD,KAAKopF,kBAAoB,MAG3BppF,KAAK6rF,aAAanY,aAAa3nB,GAC5B/rD,KAAKmuF,mBACNnuF,KAAKmuF,iBAAiB5jD,UAAUwhB,GAChC/rD,KAAK4oF,SAASv6E,OAAO09C,IAEpB/rD,KAAKquF,gBACNruF,KAAKquF,cAAc9jD,UAAUwhB,GAC7B/rD,KAAKwpF,UAAUn7E,OAAOxH,IAGxBklD,EAAOpqD,SAGJ3B,KAAKwwF,sBAAwB3pF,IAC9B7G,KAAKwwF,yBAAsB9rF,KAI5B6rF,GAAavwF,KAAKosB,KAAK+hB,UAAUC,aAClCpuC,KAAKosB,KAAK+hB,UAAUsiD,mBAAmBzwF,KAAKiH,OAAQgB,GAGtDo3C,EAAA,EAAqB+kC,iBAAgB,EAAO13D,IAC5C1sB,KAAK2sF,wBAGA,uBAAuB1kF,EAAgBygF,GAC5C,IAAI1oF,KAAK+K,WAAW5F,UAAU2X,OAE5B,OAGC9c,KAAKosB,KAAKthB,WACX7C,EAAOA,EAAKL,OAAOf,IACjB,MACM6pF,EADU1wF,KAAKosB,KAAKg4B,WAAWv9C,GACb6zE,SACxB,OAAOgW,IAAYA,EAAQ1G,iBAAmB0G,EAAQtF,mBAAqBprF,KAAKosB,KAAKthB,YAIzF7C,EAAOA,EAAKL,OAAOf,IAAQ7G,KAAKqsB,QAAQxlB,IAMpC6hF,IACFA,EAAe1oF,KAAK0oF,gBAAkB1oF,KAAKgsF,mBAAqBhsF,KAAKgsF,oBAAsBhsF,KAAK2wF,kBAGlG,MAAM1kE,EAAajsB,KAAKssB,gBACxB,IACIskE,EADAC,GAAkB,EAEtB,IAAI7wF,KAAKypF,gBAAiB,CACxB,MAAM,aAACqH,EAAY,aAAE/gC,GAAgB/vD,KAAK+K,WAAW9K,UACrD4wF,EAAkBC,IAAiB/gC,EAShC8gC,IAIDD,EAAe5wF,KAAK2pF,UACpBiH,EAAajuF,MAAMouF,WAAaD,EAAe,KAC/C9wF,KAAK+K,WAAWy9B,UAAYunB,EAC5B/vD,KAAKypF,iBAAkB,GAI3B,MAAMtjF,EAAUnG,KAAK+tF,qBAAqB9lF,GAAM,GAAO,GACpDygF,GACDviF,EAAQtF,KAAK,KACX,IAAIorB,IAAc,OAKlB,IAAI8/B,EACkB,cAAnB/rD,KAAKosB,KAAKjpB,OACX4oD,EAAS/rD,KAAKqsB,QAAQhqB,KAAKP,OAAOmG,KAGpC,MAAM9B,EAAUnG,KAAKisF,kBAAkBlgC,IAAWlpD,QAAQoD,UACvD4qF,GACD1qF,EAAQtF,KAAK,KACRorB,KAAgB4kE,IACjBD,EAAajuF,MAAMouF,WAAa,GAChC/wF,KAAKypF,iBAAkB,OAc5B,gBACL,MAAMuH,EAAgBhxF,KAAKixF,mBAC3B,GAAGD,EACD,OAAOA,EAAc5/C,iBAIlB,eACLp8B,EACAye,EACAy9D,EACAC,GAGA,MAAMplC,EAAS,OAAAntC,GAAA,GAAgB5J,EAAS,UAGxC,GAAgB,WAAbye,GAAyB,OAAAgxB,GAAA,GAAWsH,MAAa/rD,KAAKy+E,kBAAoB,EAAI,GAAI,CACnF,MAAM2S,EAAYrlC,EAAOj7C,cACI,IAA1B,OAAA2zC,GAAA,GAAW2sC,KACZp8E,EAAUo8E,EACV39D,EAAW,SAIf,MAAM49D,EAAoBrxF,KAAKosB,KAAKrqB,MAAMmlF,cAAgBlnF,KAAKosB,KAAKrqB,MAAMmlF,aAAa9mF,UAAUuR,SAAS,uBAA0B3R,KAAKosB,KAAKnsB,UAAUG,UAAUuR,SAAS,sBAC3K,OAAO3R,KAAK+K,WAAWkzB,kBACrBjpB,EACAye,EACA,OACA/uB,EACAwsF,EACAC,EACA,IACAE,EAAmB,EAAEx1E,WAGnB,IAAIlb,EAASi7B,GAAA,EAAWj7B,OAIxB,OAFAA,GAAUX,KAAKk2C,iBAAiB4Z,UAChCnvD,GAAU4iB,EAAA,EAAWC,UAAYoY,GAAA,EAAWj7B,OAAS,IAAM,GAAK,GACzDA,QAKL+D,GAID,kBAAkBqnD,EAAS/rD,KAAK2wF,iBAKrC,GAAG5kC,EAAQ,CACT/rD,KAAKgsF,kBAAoBjgC,EACzB,MAAM9/B,EAAajsB,KAAKssB,gBACxB,OAAOtsB,KAAKsxF,eAAevlC,EAAQ,WAAOrnD,OAAWA,GAAW7D,KAAK,KAC/DorB,MACJjsB,KAAKgsF,uBAAoBtnF,MAMvB,mBACN,IAAkB6sF,EAAdC,EAAW,EACf,IAAI,MAAMxmF,KAAKhL,KAAKyoF,aAAc,CAChC,MAAM6E,EAActtF,KAAKyoF,aAAaz9E,GACnCsiF,EAAYmE,eAAiBD,IAC9BD,EAAWjE,EAAYrtF,UACvBuxF,EAAWlE,EAAYmE,gBAI3B,OAAOF,EAGF,qBAAqBxlC,GACvBA,EAAOj7C,cAAcsgC,mBAAqB2a,GAC3C/rD,KAAKixF,mBAAmBngF,cAAcsgC,mBAAqB2a,EAAOj7C,eAClE9Q,KAAKisF,kBAAkBlgC,GAIpB,gBAAgB/2C,GACrB,MAAM08E,EAAa,mBAChB18E,EAAQ5I,QAAQslF,KACjB1kF,cAAcgI,EAAQ5I,QAAQslF,IAC9B18E,EAAQ5U,UAAUuB,OAAO,kBACpBqT,EAAQkpB,aAGflpB,EAAQ5U,UAAUC,IAAI,kBACtB2U,EAAQ5I,QAAQslF,GAAc,GAAKlmF,WAAW,KAC5CwJ,EAAQ5U,UAAUuB,OAAO,yBAClBqT,EAAQ5I,QAAQslF,IACtB,KAGE,0BAA0BttF,EAAcU,GAC7C,MAAMqjB,EAAO,IAAIssB,KAAoB,IAAfrwC,EAAQ+jB,MAC9BA,EAAKosC,SAAS,EAAG,EAAG,GACpB,MAAME,EAAgBtsC,EAAKusC,UAC3B,IAAI10D,KAAKyoF,aAAah0B,GAAgB,CACpC,IAAIM,EAEJ,MAAM48B,EAAQ,IAAIl9C,KAClBk9C,EAAMp9B,SAAS,EAAG,EAAG,EAAG,GAExB,MAAMzrD,EAAiC,cAAnB9I,KAAKosB,KAAKjpB,KAE9B,GAAGwuF,EAAMj9B,YAAcvsC,EAAKusC,UAC1BK,EAAc,eAAKjsD,EAAc,8BAAgC,mBAC5D,GAAGA,GClpD0B,aDkpDX1E,EAAQ+jB,KAC/B4sC,EAAc,eAAK,mCACd,CACL,MAAM/xD,EAAsC,CAC1CozE,IAAK,UACLxhB,MAAO,QAGNzsC,EAAK0sC,gBAAkB88B,EAAM98B,gBAC9B7xD,EAAQ8xD,KAAO,WAGjBC,EAAc,IAAI,UAAKC,gBAAgB,CACrC7sC,OACAnlB,YACCgS,QAEAlM,IACDisD,EAAc,eAAK,yBAA0B,CAACA,KAIlD,MAAMhJ,EAAS7rD,SAASC,cAAc,OACtC4rD,EAAOviD,UAAY,yBACnB,MAAMooF,EAAgB1xF,SAASC,cAAc,OAC7CyxF,EAAcxxF,UAAUC,IAAI,kBAC5B,MAAMwxF,EAAa3xF,SAASC,cAAc,OAC1C0xF,EAAWzxF,UAAUC,IAAI,eAEzBwxF,EAAW9nF,OAAOgrD,GAElB68B,EAAc7nF,OAAO8nF,GACrB9lC,EAAOhiD,OAAO6nF,GAGd,MAAM3xF,EAAYC,SAASC,cAAc,OACzCF,EAAUuJ,UAAY,qBACtBvJ,EAAU8J,OAAOgiD,GAEjB/rD,KAAKyoF,aAAah0B,GAAiB,CACjCjoC,IAAKu/B,EACL9rD,YACAwxF,eAAgBtpE,EAAKusC,WAGvB,MAAMO,EAAiB,YAAqBj1D,KAAKyoF,aAAc,OAC/D,IAA2C1nE,EAAvC/V,EAAI,EAAG7I,EAAS8yD,EAAe9yD,OACnC,KAAM6I,EAAIiqD,EAAe9yD,SAAU6I,EAAG,CACpC,MAAM0F,EAAIukD,EAAejqD,GAEzB,GADA+V,EAAe/gB,KAAKyoF,aAAa/3E,GAAGzQ,UACjCw0D,EAAgB/jD,EACjB,MAID1F,IAAM7I,GAAU4e,IACjBA,EAAeA,EAAawW,oBAG1BxW,EAGF/gB,KAAK2pF,UAAU5oE,aAAa9gB,EAAW8gB,GAFvC/gB,KAAK2pF,UAAU5/E,OAAO9J,GAKrBD,KAAKy+E,mBACNz+E,KAAKy+E,kBAAkBG,2BAA2B3+E,GAItD,OAAOD,KAAKyoF,aAAah0B,GAGpB,UAGLz0D,KAAK+K,WAAWolF,cAAgBnwF,KAAK+K,WAAWM,iBAAmBrL,KAAK+K,WAAW6hC,mBAAqB,KAExG5sC,KAAK+N,eAAeO,YAEpBtO,KAAKgqB,cAAc7f,QACnBnK,KAAKmuF,kBAAoBnuF,KAAKmuF,iBAAiBrW,aAC/C93E,KAAKquF,eAAiBruF,KAAKquF,cAAcvW,aACzC93E,KAAKy+E,mBAAqBz+E,KAAKy+E,kBAAkB3G,oBAE1C93E,KAAKgqB,cACZhqB,KAAKmuF,yBAA2BnuF,KAAKmuF,iBACrCnuF,KAAKquF,sBAAwBruF,KAAKquF,cAClCruF,KAAKy+E,0BAA4Bz+E,KAAKy+E,kBAGjC,QAAQqT,GAAa,GAE1B9xF,KAAKkwF,UAAU,OAAO,GACtBlwF,KAAKkwF,UAAU,UAAU,GAGzB,aAAqBlwF,KAAK+K,WAAW9K,WAGrC,oBAEmByE,IAAhBujF,KACDA,QA/pD4BvjF,GAkqD9B1E,KAAKqsB,QAAU,GACfrsB,KAAKwoF,YAAYr+E,QACjBnK,KAAKyoF,aAAe,GACpBzoF,KAAK6rF,aAAan9E,UAClB1O,KAAKuoF,UAAUp+E,QACfnK,KAAKg7E,WAAW74E,OAAS,EACzBnC,KAAKgqB,cAAc7f,QAGhB2nF,IACD9xF,KAAK+K,WAAW9K,UAAUuS,YAAc,IAG1CxS,KAAKopF,kBAAoB,KACzBppF,KAAK+xF,sBAAuB,EAE5B/xF,KAAKipF,cAAc9mF,OAAS,EAC5BnC,KAAKgpF,qBAAuB,KAE5BhpF,KAAK+vF,qBAAuB/vF,KAAKgwF,6BAA0BtrF,EAC3D1E,KAAKgyF,qBAAkBttF,EAEpB1E,KAAKy+E,mBACNz+E,KAAKy+E,kBAAkB3G,aAGtB93E,KAAKmuF,mBACNnuF,KAAKmuF,iBAAiBrW,aACtB93E,KAAK4oF,SAASz+E,QACdnK,KAAK6oF,aAAa1+E,QAClBnK,KAAKuvF,iBAAc7qF,GAGlB1E,KAAKquF,gBACNruF,KAAKquF,cAAcvW,aACnB93E,KAAKwpF,UAAUr/E,SAGjBnK,KAAK8oF,eAAiB9oF,KAAK+oF,kBAAoB,EAE/C/oF,KAAKisB,WAAWrW,QAEhB5V,KAAKiyF,qBAAkBvtF,EACvB1E,KAAKkyF,4BAAyBxtF,EAC9B1E,KAAKwwF,yBAAsB9rF,EAE3B1E,KAAKgsF,uBAAoBtnF,EAGzB1E,KAAKypF,iBAAkB,EAGlB,QAAQxiF,EAAgBgjF,G,MAI7B,IAAIhjF,EAGF,OAFAjH,KAAK0O,SAAQ,GACb1O,KAAKiH,OAASA,EACP,KAGT,MAAMkrF,EAAWnyF,KAAKiH,SAAWA,EAM3BmrF,EAAWpyF,KAAKosB,KAAKjpB,KAEX,cAAbivF,IACDnI,EAAY,GAGdjqF,KAAK0uC,eAAiB1uC,KAAKgqD,mBAAmBouB,kBAAkBnxE,EAAQjH,KAAKosB,KAAKthB,UAClF,IAAIunF,EAA0B,WAAbD,EAAwBpyF,KAAKgqD,mBAAmBsoC,eAAerrF,GAAQL,MAAiC,QAAzB,EAAA5G,KAAK0uC,eAAe9nC,aAAK,QAAI,EAC7H,MAAM2rF,OAAyB7tF,IAAdulF,EAOjB,IAAmBuI,EAAf/Z,EAAY,EACZ8Z,IACEJ,IACFK,EAAgBxyF,KAAKosB,KAAK09D,aAAa2I,qBAAqBzyF,KAAKosB,OAGhEomE,GAEOH,IACR5Z,EAAYz4E,KAAKgqD,mBAAmB0oC,qBAAqBzrF,EAAQjH,KAAKosB,KAAKthB,UAEzEm/E,EAD0BxR,IAAc0Z,EAC5B1Z,EAEA4Z,IAMlB,MAAMM,EAAS1I,IAAcoI,GAEvB,WAACtnF,GAAc/K,KAErB,GAAGmyF,EAAU,CACX,MAAM5lC,EAAUvsD,KAAKwsD,iBAAiBy9B,GACtC,GAAG19B,EAWD,OAVGgmC,GACDvyF,KAAKsxF,eAAe/kC,EAAQR,OAAQ,UACpC/rD,KAAKqtF,gBAAgB9gC,EAAQR,QAC7B/rD,KAAKosB,KAAK3d,cAAc,UAAWw7E,GAAW,IACtCoI,IAAeM,IAEvB5nF,EAAWy9B,UAAYz9B,EAAWglD,aAClC/vD,KAAKosB,KAAK3d,cAAc,UAAWw7E,GAAW,IAGzC,UAGNjqF,KAAKiH,SACNjH,KAAKgqB,cAAc01B,UAAY,GAC/B1/C,KAAKosB,KAAKwmE,WAAWC,WAAW7yF,KAAKosB,KAAKC,QAAQrC,cAAc01B,UAGlE1/C,KAAKiH,OAASA,EACdjH,KAAKqpF,mBAAmBlnF,OAAS,EAEjCnC,KAAKupF,aAAe,CAClBuJ,wBAAyB9yF,KAAK46E,gBAAgBtO,WAAWrlE,IAAWjH,KAAKkoF,gBAAgB6K,MAAM9rF,IAIhG,MACDjH,KAAKsuD,IAAI,kBAAmBrnD,EAAQjH,KAAK0uC,eAAgBu7C,EAAWoI,GAItE,MAAMW,EAAgBL,GAAuB,cAAbP,EAA2B,EAAIC,EAQ/D,IAAIY,EAAc,EAClB,GAAGd,EAAU,CACX,IAAIpiF,EAAK/P,KAAKkzF,iBAAiB,UAE5BnjF,IACDkjF,GAAeljF,EAAG3D,QAAQvF,KAGzBosF,GAAe,IAChBA,EAAc5wF,KAAKP,OAAOkV,OAAOy0C,KAAKzrD,KAAKqsB,SAAS5jB,IAAI5B,IAAQA,UAGlE7G,KAAKspF,aAAc,EAGrB,MAAM6J,EAAenzF,KAAK2pF,UAC1B3pF,KAAK0O,UACL,MAAMi7E,EAAY3pF,KAAK2pF,UAAYzpF,SAASC,cAAc,OAU1D,IAAIkG,EATD8rF,GACDxI,EAAUngF,UAAY2pF,EAAa3pF,UACnCmgF,EAAUvpF,UAAUuB,OAAO,gBAAiB,iBAE5CgoF,EAAUvpF,UAAUC,IAAI,iBAG1BL,KAAKgqB,cAAcwmC,OAMjBnqD,EAHEmsF,EAGO,CACPrsF,QAAS,eAA2BtF,KAAK,IAChCb,KAAK+tF,qBAAqByE,EAAcvqF,MAAM,GAAM,OAAOvD,IAEpEoU,QAAQ,GAND9Y,KAAKiwF,WAAWhG,GAAW,EAAM0I,EAAQK,GAUpD,MAAM,QAAC7sF,EAAO,OAAE2S,GAAUzS,EAGtByS,GACEq5E,IACFpnF,EAAW9K,UAAUuS,YAAc,GAEnCxS,KAAKosB,KAAKuhE,iBAAiB4E,EAAUI,EAAQ1I,GAC7CjqF,KAAKmmB,UAAUkE,OAAOrqB,KAAKk2C,mBAQ/BmJ,EAAA,EAAqB+zC,UAAU1mE,IAC/B,MAAMyxB,EAAiBh4C,EAAQtF,KAAK,KA8BlC,GA3BGiY,EACGq5E,GACFnyF,KAAKosB,KAAKuhE,iBAAiB4E,EAAUI,EAAQ1I,GAG/CjqF,KAAKmmB,UAAUg5B,SAGdn/C,KAAKkyF,yBACNlyF,KAAKkyF,yBACLlyF,KAAKkyF,4BAAyBxtF,GAKhCqG,EAAW0gF,oBAAsB,EACjC1gF,EAAWsoF,cAAgB,EAC3B,OAAA9mF,EAAA,GAAexB,EAAW9K,UAAW0pF,GAErCtqC,EAAA,EAAqBi0C,YAAY5mE,IACjC2yB,EAAA,EAAqB+kC,iBAAgB,EAAO13D,IAG1C1sB,KAAKgqB,cAAc08D,SAIlB8L,EACDznF,EAAWy9B,UAAYgqD,EAAch/D,SAYhC,GAAI6+D,GAAcM,GAAWJ,EAAU,CAC5C,MAAMgB,EAASN,EAAc,IAAMA,EAAchJ,GAAaA,EAAY,GACpEuJ,EAAkB/a,IAAcwR,IAAcsI,GAChDgB,GAAUpB,EACZpnF,EAAWy9B,UAAY,MACf+qD,IACRxoF,EAAWy9B,UAAY,GAGzB,MAAMirD,EAAqBzzF,KAAKwsD,iBAAiBy9B,GACjD,IAAIl+B,EAAuBynC,GAAmBxzF,KAAKopF,oBAAsBqK,aAAkB,EAAlBA,EAAoB1nC,SACzFA,aAAM,EAANA,EAAQj7C,iBACVi7C,EAAS/rD,KAAK0zF,6BAA6BzJ,IAI1Cl+B,IACD/rD,KAAKsxF,eAAevlC,EAAQynC,EAAkB,QAAU,SAAWrB,OAAmCztF,EAAxB,KAAe65B,QACzFi1D,GACFxzF,KAAKqtF,gBAAgBthC,SAIzBhhD,EAAWy9B,UAAY,MAGzBxoC,KAAK4hC,WAEL,MAAM3V,EAAajsB,KAAKssB,gBAClBqnE,EAAkB9wF,QAAQC,IAAI,CAACq7C,EAAgB,iBACrDw1C,EAAgB9yF,KAAK,KACnBkK,EAAWquB,qBAGbp5B,KAAKosB,KAAK3d,cAAc,UAAWw7E,GAAY0I,GAE/C,MAAMiB,EAAoB5zF,KAAKgqD,mBAAmB6pC,sBAAsB5sF,GA4DxE,GA3DqBurF,GAAiBoB,EAOpCD,EAAgB9yF,KAAK,KACnB,GAAIorB,MAIJlhB,EAAWquB,mBAERw6D,GAAmB,CACpB,MAAM15D,EAAI,KACRl6B,KAAKgyF,gBAAkB,IAAInvF,QAAeoD,IACpCgmB,KAAiBjsB,KAAKgqD,mBAAmB6pC,sBAAsB5sF,GAKnEjH,KAAKgqD,mBAAmB8pC,cAAc7sF,EAAQjH,KAAKosB,KAAKthB,UAAUjK,KAAM6tC,IACtE,IAAIziB,MAAiByiB,EAEnB,YADAzoC,IAIF,MACM8tF,EADQrlD,EAAevqC,QAAQV,MACX44B,MAAM,KAAS23D,QACtCjpF,EAAW5F,UAAU2X,QAAU/R,EAAW5F,UAAU2X,SAAWi3E,IAChE/zF,KAAKkwF,UAAU,SAAU6D,GACzB/zF,KAAK4hC,YAGPp2B,WAAW0uB,EAAG,KACdj0B,MAlBAA,MAoBDob,QAAQ,KACTrhB,KAAKgyF,qBAAkBttF,KAIxBytF,EACD3mF,WAAW0uB,EAAG,KAEdA,OA3CF+vD,IAAajqF,KAAKqsB,QAAQgmE,IAAepI,IAAcoI,GACzDryF,KAAKkwF,UAAU,UAAU,GAgD7BlwF,KAAKsuD,IAAI,mBAAoBvjD,EAAW5F,UAAU2X,QAG/C/R,EAAW5F,UAAU2X,QAAUu1E,IAAeryF,KAAK4oF,SAAS9oF,MAC7DE,KAAKi0F,oBAGS,SAAb7B,EAAqB,CACtB,MAAMvmF,EAAS7L,KAAKgqD,mBAAmBkqC,cAAcjtF,IAClD4E,aAAM,EAANA,EAAQyL,OAAO68E,cAChBn0F,KAAKgqD,mBAAmBoqC,iBAAiBntF,GAAQ,MAUpDuF,MAAMC,IAGP,MAFAzM,KAAKsuD,IAAI3hD,MAAM,4BAA6BF,GAC5CzM,KAAKmmB,UAAUg5B,SACT1yC,IAGR,MAAO,CAACqM,SAAQ3S,QAASg4C,GAGpB,oBACL,GAAsB,SAAnBn+C,KAAKosB,KAAKjpB,MAAsC,eAAnBnD,KAAKosB,KAAKjpB,KAAuB,CAC/D,MAAM0F,EAAU7I,KAAKgqD,mBAAmBouB,kBAAkBp4E,KAAKiH,OAAQjH,KAAKosB,KAAKthB,UACjF9K,KAAKgqD,mBAAmB6lC,YAAY7vF,KAAKiH,OAAQ4B,EAAQjC,MAAO5G,KAAKosB,KAAKthB,UAAU,IAIjF,mBACL,MAAM7D,EAASjH,KAAKiH,OACdw6B,EAAYzhC,KAAK46E,gBAAgBn5C,UAAUx6B,GAC3CotF,EAAWr0F,KAAKgqD,mBAAmBm8B,cAAcl/E,EAAQjH,KAAKosB,KAAKthB,UAEzE9K,KAAK2pF,UAAUvpF,UAAUkM,OAAO,aAAc+nF,GAC9Cr0F,KAAKk2C,iBAAiB91C,UAAUkM,OAAO,wBAAyB+nF,GAEhEr0F,KAAK2pF,UAAUvpF,UAAUkM,OAAO,UAAWtM,KAAKosB,KAAKkgD,cACrDtsE,KAAK2pF,UAAUvpF,UAAUkM,OAAO,aAAcm1B,GAGzC,oBAAoBr9B,EAAc2nD,EAAqBjnD,EAAkB24B,GAU9Ez9B,KAAKipF,cAActjF,KAAK,CAACvB,UAAS2nD,SAAQjnD,UAAS24B,aAEnDz9B,KAAK8tF,0BAGA,2BACF9tF,KAAKgpF,sBAAyBhpF,KAAKipF,cAAc9mF,SAEpDnC,KAAKgpF,qBAAuB,IAAInmF,QAAQ,CAACoD,EAAS8kB,KAChDvf,WAAW,KACT,MAAM8oF,EAAQt0F,KAAKipF,cAAcxlF,QACjCzD,KAAKipF,cAAc9mF,OAAS,EAE5B,MAAMs7B,EAAW62D,EAAMnxD,OAAO,CAACC,GAAM3F,cAAc2F,EAAIx/B,OAAO65B,GAAW,IAMzEz9B,KAAKsuD,IAAI,mBAAoB7wB,EAAU62D,EAAOt0F,KAAKktC,4BACnD,MAAMjhB,EAAajsB,KAAKssB,gBACxBzpB,QAAQC,IAAI26B,GAAU58B,KAAK,KACzB,IAAIorB,IACF,KAAM,yCAGLjsB,KAAKkpF,uBACNlpF,KAAKkpF,wBAGJlpF,KAAKmpF,iCACNnpF,KAAKmpF,kCAGPmL,EAAMhuF,QAAQ,EAAElC,UAAS2nD,SAAQjnD,cAC/B9E,KAAK+rF,kBAAkBhgC,EAAQ3nD,EAASU,KAIxCmB,IAEFjG,KAAKgpF,qBAAuB,KAEzBhpF,KAAKipF,cAAc9mF,QACpBnC,KAAK8tF,0BAGP9tF,KAAKu0F,uBACJ/nF,MAAMue,IACR,MAMA,kBAAkBghC,EAAqB3nD,EAAcU,GAC1D,GAAGV,EAAQ+K,GAAK,EAEd,YADAnP,KAAK2pF,UAAUlqE,QAAQssC,GAIzB,MAAMuhC,EAActtF,KAAKw0F,0BAA0BpwF,EAASU,GAC5D,GAAsB,cAAnB9E,KAAKosB,KAAKjpB,MAA2C,WAAnBnD,KAAKosB,KAAKjpB,KAAiC,CAC9E,MAAMusB,EAAS1vB,KAAKy+E,kBAAoB,EAAI,EAC5C,IAAIr5D,EAAWjd,MAAMC,KAAKklF,EAAYrtF,UAAUmlB,UAAU3hB,MAAMisB,GAC5D1kB,EAAI,EAAG8oE,EAA0B,EACrC,KAAM9oE,EAAIoa,EAASjjB,SAAU6I,EAAG,CAC9B,MAAM0F,EAAI0U,EAASpa,GACbspD,GAAa5jD,EAAEtE,QAAQkoD,UAC7B,GAAGlwD,EAAQ+jB,KAAOmsC,EAChB,MAKF,GAJUlwD,EAAQ+jB,OAASmsC,IACzBwf,GAA2BpjE,EAAEtE,QAAQvF,KAGpCitE,GAA2B1vE,EAAQyC,IAAMitE,EAC1C,MAKJ,IAAIx3D,EAAQoT,EAAS1kB,EAQrBs5C,GAAuByH,EAAQuhC,EAAYrtF,UAAWqc,QAEnDxX,EACDwoF,EAAYrtF,UAAU8gB,aAAagrC,EAAQuhC,EAAYrtF,UAAUmlB,SAASplB,KAAKy+E,kBAAoB,EAAI,GAAGrmB,aAE1Gk1B,EAAYrtF,UAAU8J,OAAOgiD,GAIhB,YAAd3nD,EAAQgD,EACTpH,KAAK6rF,aAAa4I,UAAU1oC,EAAQ3nD,EAASU,GAE7CinD,EAAO3rD,UAAUC,IAAI,iBAAkB,iBAIpC,gBACL,OAAOL,KAAKisB,WAAWjc,MAIjB,cAAc5L,EAAcU,GAAU,EAAO4vF,GAAiB,EAAO3oC,EAAyB,KAAM2gC,GAAiB,G,QAI3H,IAAI3gC,GAAU/rD,KAAKqsB,QAAQjoB,EAAQyC,KACjC,OAIF,MAAM8tF,EAA6C,WAAnB30F,KAAKosB,KAAKjpB,KAC1C,GAAGiB,EAAQs2B,QAAS,OACf,GAAGt2B,EAAQioF,YAAcsI,EAAyB,CACrD,MAAM9rF,EAAU7I,KAAKgqD,mBAAmB+iC,uBAAuB3oF,EAAQioF,YACjEzlF,EAAQvE,KAAKP,OAAO+G,EAAQ4iD,QAClC,GAAGrnD,EAAQyC,IAAMD,EACf,OAIJ,MAAMK,EAASjH,KAAKiH,OAEd2tF,EAAMxwF,EAAQwH,SAAWhD,EAAA,QAAU6O,MAASrT,EAAQkT,OAAO+L,KAAOrjB,KAAK46E,gBAAgBh0B,YAAY5mD,KAAKiH,QAExGmyE,EAAal5E,SAASC,cAAc,OAK1C,IAAIg5E,EACA0b,EAGJ,GARAzb,EAAWh5E,UAAUC,IAAI,WAQrB0rD,EAsBG,CACL,MAAMvL,EAAO,CAAC,iBAAkB,iBAAkB,iBAC5Cs0C,EAAgB/oC,EAAOviD,UAAUw2C,MAAM,KACvC+0C,EAAa,CAAC,UAAUnxF,OAAO48C,EAAK54C,OAAOorB,GAAK8hE,EAAc/6D,SAAS/G,KAC7E+4B,EAAOviD,UAAYurF,EAAW/tE,KAAK,KAEnC6tE,EAAiB9oC,EAAO3a,iBACpByjD,EAAez0F,UAAUuR,SAAS,4BACpCkjF,EAAiB9oC,EAAOl8C,cAAc,4BAGxCspE,EAAkB0b,EAAen0E,kBACjCy4D,EAAgBl1E,UAAY,GAC5Bk1E,EAAgBx2E,MAAMuT,QAAU,GAChC2+E,EAAe5wF,UAAY,GAC3B4wF,EAAe7zE,YAAYm4D,GAE3B,MAAM6b,EAAkBH,EAAelyF,MAAMqyF,gBAC7CH,EAAelyF,MAAMuT,QAAU,GAC/B2+E,EAAelyF,MAAMqyF,gBAAkBA,EAEpCjpC,IAAW/rD,KAAKopF,mBACjBr9B,EAAO3rD,UAAUC,IAAI,mBAIvB,MAAM40F,GAAelpC,EAAO3/C,QAAQvF,KACnBzC,EAAQyC,MAAQouF,WAMxBj1F,KAAKqsB,QAAQ4oE,GACpBj1F,KAAKwoF,YAAYn6E,OAAO4mF,SA5C1B,GAXAJ,EAAiB30F,SAASC,cAAc,OACxC00F,EAAez0F,UAAUC,IAAI,0BAE7B84E,EAAkBj5E,SAASC,cAAc,OACzCg5E,EAAgB/4E,UAAUC,IAAI,mBAE9B0rD,EAAS7rD,SAASC,cAAc,QACzBC,UAAUC,IAAI,UACrBw0F,EAAe7zE,YAAYm4D,GAC3BptB,EAAO/qC,YAAY6zE,IAEfD,IAAQxwF,EAAQkT,OAAO+L,KAAOrjB,KAAKmuF,iBAAkB,EAEtC/pF,EAAQkT,OAAO49E,QAC9Bl1F,KAAKgqD,mBAAmB4lC,gBAAgBxrF,SACLM,IAAlC1E,KAAK0uC,eAAe+pC,WAA2Bz4E,KAAK0uC,eAAe+pC,UAAYr0E,EAAQyC,OAExF7G,KAAKmuF,iBAAiBhmD,QAAQ4jB,GAC9B/rD,KAAK4oF,SAASj0E,IAAIo3C,EAAQ3nD,EAAQyC,MA4CxC7G,KAAKqsB,SAASjoB,EAAQyC,KAAOklD,EAC7BA,EAAO3/C,QAAQvF,IAAMzC,EAAQyC,IAC7BklD,EAAO3/C,QAAQnF,OAAS,GAAK7C,EAAQ6C,OACrC8kD,EAAO3/C,QAAQkoD,UAAYlwD,EAAQ+jB,KAEnC,MAAM2B,EAA+B,GAErC,GAAiB,mBAAd1lB,EAAQgD,EAAwB,CACjC,OAAA4gE,GAAA,GAAmC5jE,GAEnC,MAAMG,EAASH,EAAQG,OACvB,GAAGA,EAAQ,CACT,MAAM6C,EAAI7C,EAAO6C,EACjB,GAAG4gF,GAAergF,IAAIP,IAAOynE,EAAA,SAASnE,eAAetjE,KAAOynE,EAAA,SAASznE,GAEnE,OADApH,KAAKwoF,YAAYnoF,KAAK+D,EAAQyC,KACvBklD,EAIXA,EAAOviD,UAAY,iBAEnB2vE,EAAgBl1E,UAAY,GAC5B,MAAM4R,EAAI3V,SAASC,cAAc,OAqBjC,OApBA0V,EAAEzV,UAAUC,IAAI,eACbkE,IACe,oCAAbA,EAAO6C,EACRyO,EAAE9L,OAAO,eAAK,qBAAsB,CAAC,IAAI,KAAU,CAAC9C,OAAQ1C,EAAO4wF,QAAQhuE,UAAS,KAAQnS,WACvE,+BAAbzQ,EAAO6C,EACfyO,EAAE9L,OAAO,eAAK,mBAAoB,CAAC,IAAI,KAAU,CAAC9C,OAAQ1C,EAAO8zE,WAAWlxD,UAAS,KAAQnS,WAE7Fa,EAAE9L,OAAO/J,KAAKgqD,mBAAmBorC,yBAAyBhxF,KAG9D+0E,EAAgBpvE,OAAO8L,GAEpB62E,IACD1sF,KAAKq1F,oBAAoBjxF,EAAS2nD,EAAQjnD,EAASglB,GAEhD1lB,EAAQkT,OAAOg+E,WAChBvpC,EAAO3rD,UAAUC,IAAI,kBAIlB0rD,EAGT,IAEIwpC,EAAwB1kC,EAFxB2kC,EAAepxF,EAAQ0O,MAG3B,IAAG0iF,aAAY,EAAZA,EAAct1F,YAAa,CAAC,QAAS,OAAO65B,SAASy7D,EAAat1F,SAASiD,YAEvE,GAAGiB,EAAQioF,YAAcsI,EAAyB,CACvD,MAAMjkF,EAAI1Q,KAAKgqD,mBAAmByrC,aAAarxF,EAAQioF,YACvDkJ,EAAiB7kF,EAAEtM,QAEnBysD,EAAgBngD,EAAEmgD,kBACuB,aAAX,QAAtB,EAAA2kC,aAAY,EAAZA,EAAct1F,gBAAQ,eAAEiD,QAChCoyF,EAAiBnxF,EAAQA,QAEzBysD,EAAgBzsD,EAAQysD,eAM1B,IAAI6kC,EAAW,IAAkB1pD,aAAaupD,EAAgB,CAC5Dt/C,SAAU4a,EACV04B,aAAcvpF,KAAKupF,eAGjBoM,GAAc,EACdC,GAAoB,EACpBC,GAAgB,EACpB,GAAGhlC,IAAkB2kC,EAAc,CACjC,IAAIM,EAAgBjlC,EAAcjpD,OAAQ3F,GAAc,uBAARA,EAAEmF,GAC9C2uF,EAAYR,EAAepzF,OAG/B,GAFqB2zF,EAAc3yD,OAAO,CAACC,EAAa4yD,IAAc5yD,EAAM4yD,EAAK7zF,OAAQ,KAEnE4zF,GAAaD,EAAc3zF,QAAU,EAAG,CAC5D,GAAGyG,EAAA,QAAUw1B,SAASmb,MAAM08C,IAAK,CAC/B,IAAI35C,EAAUt8C,KAAK68C,mBAAmBjD,wBAAwB27C,GAC9D,GAA4B,IAAzBO,EAAc3zF,SAAiBqzF,GAAgBl5C,EAChDk5C,EAAe,CACbpuF,EAAG,uBACHlH,SAAUo8C,OAEP,CACL,IAAI4H,EAAgBhkD,SAASC,cAAc,OAC3C+jD,EAAc9jD,UAAUC,IAAI,cAE5B6jD,EAAcjgD,UAAYyxF,EAE1B3pC,EAAO3rD,UAAUC,IAAI,SAAWy1F,EAAc3zF,OAAS,KAEvDg3E,EAAgBpvE,OAAOm6C,GAGzB6H,EAAO3rD,UAAUC,IAAI,mBAAoB,aACzCu1F,GAAoB,EACpBD,GAAc,EACdE,GAAgB,EAGlB9pC,EAAO3rD,UAAUC,IAAI,uBAStBw1F,GACD/xF,EAAas1E,EAAYsc,GAG3B,MAAM3b,EAAW,GAAcb,QAAQl5E,KAAKosB,KAAMhoB,EAAS2nD,EAAQotB,EAAiBC,GAIpF,GAHAD,EAAgB15D,QAAQ25D,GAGrBh1E,EAAQk1E,SAA0B,QAAhB,EAAAl1E,EAAQq1E,gBAAQ,eAAEyQ,oBAAwC,WAAnBlqF,KAAKosB,KAAKjpB,KAAmB,CACvF,MAAM+yF,EAAUh2F,SAASC,cAAc,OACvC+1F,EAAQ91F,UAAUC,IAAI,uBAAwB,UAAW,wBACzD84E,EAAgB15D,QAAQy2E,GACxBnqC,EAAO3rD,UAAUC,IAAI,sBAOvB,GAJG+D,EAAQk1E,QAAUl1E,EAAQkT,OAAOoQ,aAAe1nB,KAAKquF,eACtDruF,KAAKquF,cAAclmD,QAAQ4jB,GAG1B3nD,EAAQ6+E,cAA2C,sBAA3B7+E,EAAQ6+E,aAAa77E,GAA6BhD,EAAQ6+E,aAAa9vD,MAAQ/uB,EAAQ6+E,aAAa9vD,KAAKhxB,OAAQ,CAC1I,MAAMgxB,EAAQ/uB,EAAQ6+E,aAAiD9vD,KAEjEgjE,EAAej2F,SAASC,cAAc,OAC5Cg2F,EAAa/1F,UAAUC,IAAI,gBAC3B8yB,EAAK7sB,QAAS4qB,IACZ,MAAMtT,EAAUsT,EAAItT,QACpB,IAAIA,IAAYA,EAAQzb,OAAQ,OAEhC,MAAMi0F,EAASl2F,SAASC,cAAc,OACtCi2F,EAAOh2F,UAAUC,IAAI,oBAErBud,EAAQtX,QAASuU,IACf,MAAMqC,EAAO,IAAkB8uB,aAAanxB,EAAOqC,KAAM,CAACulE,SAAS,EAAMC,cAAc,IAEvF,IAAI2T,EAEJ,OAAOx7E,EAAOzT,GACZ,IAAK,oBAAqB,CACxB,MAAM6X,EAAI,IAAkB+sB,aAAa,IAAK,CAC5CiK,SAAU,CAAC,CACT7uC,EAAG,uBACHjF,OAAQ,EACRutB,OAAQ,EACRhb,IAAKmG,EAAOnG,QAIhB2hF,EAAW,OAAA7kC,GAAA,GAAuBvyC,GAAGyB,kBACrC21E,EAASj2F,UAAUC,IAAI,UAAW,SAElC,MAGF,IAAK,6BACHg2F,EAAWn2F,SAASC,cAAc,UAClCk2F,EAASj2F,UAAUC,IAAI,mBAAoB,SAC3C,YAAiBg2F,EAAWp0F,IAC1B,OAAAyb,EAAA,GAAYzb,GAEZ,MAAMg/E,EAAQ78E,EAAQovE,UAAYpvE,EAAQwH,OAC1C,IAAIzF,EACwBA,EAAzB0U,EAAOvD,OAAOg/E,UAAqBzzF,QAAQoD,QAAQjG,KAAKiH,QAC5CjH,KAAKgkF,qBAAqBuS,kBAAkBtV,GAAOpgF,KAAKoG,GAClEA,GAII,IAAIpE,QAAgB,CAACoD,EAAS8kB,KACrB,IAAI,GAAa,CAC7B,CAAC/qB,KAAKiH,QAAS,IACbA,IACFhB,EAAQgB,KACP,GAEGjG,iBAAiB,QAAS,KAC9B+pB,SAKN5kB,EAAQtF,KAAKoG,IACX,MAAM6D,EAAW9K,KAAKiH,SAAWA,EAASjH,KAAKosB,KAAKthB,cAAWpG,EAC/D1E,KAAKgkF,qBAAqBwS,kBAAkBvvF,EAAQ6D,EAAUm2E,EAAOpmE,EAAOjQ,WAGhF,MAGF,QACEyrF,EAAWn2F,SAASC,cAAc,UAKtCk2F,EAASj2F,UAAUC,IAAI,sBAAuB,MAC9Cg2F,EAAS50E,mBAAmB,YAAavE,GAEzC,OAAAI,GAAA,QAAO+4E,GAEPD,EAAOrsF,OAAOssF,KAGhBF,EAAapsF,OAAOqsF,KAGtB,YAAiBD,EAAel0F,IAC9B,IAAI4S,EAAS5S,EAAE4S,OAGf,GADIA,EAAOzU,UAAUuR,SAAS,yBAAwBkD,EAAS,OAAA+J,GAAA,GAAgB/J,EAAQ,yBACnFA,GAAUA,EAAOzU,UAAUuR,SAAS,YAAckD,EAAOzU,UAAUuR,SAAS,oBAAqB,OAErG,OAAA+L,EAAA,GAAYzb,GAEZ,MAAMw0F,EAAS,OAAAhyC,GAAA,GAAW5vC,GACpBqc,EAAMiC,EAAK,OAAAsxB,GAAA,GAAW5vC,EAAO/D,gBAEnC,IAAIogB,EAAItT,UAAYsT,EAAItT,QAAQ64E,GAE9B,YADAz2F,KAAKsuD,IAAI13C,KAAK,iBAAkBsa,EAAKulE,EAAQryF,GAI/C,MAAMyW,EAASqW,EAAItT,QAAQ64E,GAC3Bz2F,KAAKgkF,qBAAqB0S,oBAAoB12F,KAAKiH,OAAQ7C,EAAQyC,IAAKgU,KAG1E86E,GAAc,EACd5pC,EAAO3rD,UAAUC,IAAI,qBACrBw0F,EAAe9qF,OAAOosF,GAGxB,MAAM1uE,EAAarjB,EAAQkT,OAAOoQ,YAClC,GAAGktE,EAAK,EACHxwF,EAAQkT,OAAO49E,QAAUztE,IAAYznB,KAAKuoF,UAAUloF,IAAI+D,EAAQyC,KACnE,IAAI4+C,EAAS,GACEA,EAAZh+B,EAAqB,aACVrjB,EAAQkT,OAAO49E,QAAU9wF,EAAQkT,OAAOC,aAAe,UAAY,UACjFw0C,EAAO3rD,UAAUC,IAAIolD,GAGvB,MAAMkxC,EAAqB32F,KAAKgqD,mBAAmB4sC,sBAAsBxyF,GACnEyyF,IAAgBF,GAAsBvyF,EAAQyC,IAAM,EAEvDgwF,GACD9qC,EAAO3rD,UAAUC,IAAI,gBAGvB,MAAM48C,EAAQ23C,KAASxwF,EAAQq1E,UAAYz5E,KAAKiH,SAAW2B,EAAA,QAAU6O,MACrE,IAAIq/E,EAA6B3d,EAGjC,GAAGqc,EAA8D,CAC/D,IAAItxC,EAAgBhkD,SAASC,cAAc,OAC3C+jD,EAAc9jD,UAAUC,IAAI,cAExBk1F,GACFxpC,EAAO3rD,UAAUC,IAAI,oBAGvB,IAAI02F,GAAoB,EAExB,OAAOvB,EAAapuF,GAClB,IAAK,oBAAqB,CACxB,MAAM5C,EAAQgxF,EAAahxF,MAGvB+wF,IACFI,GAAc,GAGZvxF,EAAQovE,UACVznB,EAAO3rD,UAAUC,IAAI,aAGvB0rD,EAAO3rD,UAAUC,IAAI,SAErB,MAAMwI,EAAU7I,KAAKgqD,mBAAmB+iC,uBAAuB3oF,EAAQioF,YACvE,GAAGjoF,EAAQioF,YAA+B,IAAjBxjF,EAAQ/I,MAAc60F,EAAyB,CACtE5oC,EAAO3rD,UAAUC,IAAI,WAAY,cACjC2jD,GAAU,CACRC,QAAS7/C,EAAQioF,WACjBnoC,gBACAj4B,WAAYjsB,KAAKssB,gBACjB2wB,MAAO23C,EACP5qE,cAAehqB,KAAKgqB,cACpBoC,KAAMpsB,KAAKosB,KACXtC,eACAQ,eAAgBtqB,KAAKosB,KAAK4qE,sBAG5B,MAGF,MAAMh6C,GAAY,eAAc24C,IAAgBkB,IAhjFlC,EAijFX75C,GAAU+O,EAAO3rD,UAAUC,IAAI,mBAClCspB,GAAU,CACRnlB,QACAJ,UACAnE,UAAWikD,EACXlH,WACAC,QACAjzB,cAAehqB,KAAKgqB,cACpBiC,WAAYjsB,KAAKssB,gBACjBxC,eACAQ,eAAgBtqB,KAAKosB,KAAK4qE,sBAG5B,MAGF,IAAK,sBAAuB,CAC1BD,GAAoB,EAEpB,IAAI5qE,EAAmBqpE,EAAarpE,QAEpC,GAAiB,YAAdA,EAAQ/kB,EACT,MAGF2kD,EAAO3rD,UAAUC,IAAI,WAErB,IAAIs/D,EAAMz/D,SAASC,cAAc,OACjCw/D,EAAIv/D,UAAUC,IAAI,OAElB,IAGI42F,EAAgCC,EAHhCC,EAAQj3F,SAASC,cAAc,OACnCg3F,EAAM/2F,UAAUC,IAAI,SAGpB,MAAMmE,EAAqB2nB,EAAQ3nB,OAChCA,GAAS2nB,EAAQjsB,YAClB+2F,EAAiB/2F,SAASC,cAAc,OACxC82F,EAAe72F,UAAUC,IAAI,mBAC7B62F,EAAUh3F,SAASC,cAAc,OACjC+2F,EAAQ92F,UAAUC,IAAI,WACtB42F,EAAeltF,OAAOmtF,IAGxB,MAAMjjF,EAAMkY,EAAQjsB,SACpB,GAAG+T,EACD,GAAgB,QAAbA,EAAI9Q,MAA+B,UAAb8Q,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,KAAkB,CAErE,MAAM22C,EAAyB,UAAb7lC,EAAI9Q,KAAmBogB,EAAA,EAAWosB,OAAOptC,MAAQghB,EAAA,EAAWosB,OAAOxjB,QACrE,UAAblY,EAAI9Q,MACL4oD,EAAO3rD,UAAUC,IAAI,SACrB62F,EAAQ92F,UAAUC,IAAI,aAEtB0rD,EAAO3rD,UAAUC,IAAI,SAEvB08C,GAAU,CACR9oC,MACAhU,UAAWi3F,EACX9yF,UACAwlB,SAAUkwB,EAAUp5C,MACpBmpB,UAAWiwB,EAAUn5C,OACrBqpB,cAAehqB,KAAKgqB,cACpBiC,WAAYjsB,KAAKssB,gBACjB2wB,QACAxwB,MAAOC,GACP5C,eACAQ,eAAgBtqB,KAAKosB,KAAK4qE,0BAGvB,CACL,MAAM72C,EAASN,GAAa,CAC1Bz7C,UACAkmB,eAAgBtqB,KAAKosB,KAAK4qE,oBAC1BhtE,cAAehqB,KAAKgqB,cACpBF,iBAEFotE,EAAQntF,OAAOo2C,GACf+2C,EAAQ92F,UAAUC,IAAI,yBAM1B,IAOIqQ,EAPA0mF,EAAel3F,SAASC,cAAc,OAQ1C,GAPAi3F,EAAah3F,UAAUC,IAAI,cAExB42F,GACDG,EAAartF,OAAOktF,GAInB9qE,EAAQkrE,UAAW,CACpB,MAAMrzF,EAAO,IAAkBgoC,aAAa7f,EAAQzX,KAC9CpM,EAAuB,OAAAkpD,GAAA,GAAuBxtD,GAAM0c,kBAC1DpY,EAAElI,UAAUC,IAAI,gBAChByD,EAAawE,EAAG,IAAkBwjB,cAAcK,EAAQkrE,YACxDD,EAAartF,OAAOzB,GACpBoI,EAAIpI,EAGN,GAAG6jB,EAAQmlC,OAAQ,CACjB,IAAI2sB,EAAW/9E,SAASC,cAAc,OACtC89E,EAAS79E,UAAUC,IAAI,SACvByD,EAAam6E,EAAU9xD,EAAQmlC,QAC/B8lC,EAAartF,OAAOk0E,GACpBvtE,EAAIutE,EAGN,GAAG9xD,EAAQglC,aAAc,CACvB,IAAImmC,EAAUp3F,SAASC,cAAc,OACrCm3F,EAAQl3F,UAAUC,IAAI,QACtByD,EAAawzF,EAASnrE,EAAQglC,cAC9BimC,EAAartF,OAAOutF,GACpB5mF,EAAI4mF,EAWN,GAFAH,EAAMptF,OAAOqtF,GAEV5yF,IAAUyP,EAAK,CAChB83C,EAAO3rD,UAAUC,IAAI,SAErB,MAAMP,EAA4B0E,EAAM8T,MAAM9T,EAAM8T,MAAMnW,OAAS,GACnE,IAAIo1F,GAAW,EACZz3F,EAAK+X,IAAM/X,EAAKyY,GAAK7H,GACtBq7C,EAAO3rD,UAAUC,IAAI,mBACrBk3F,GAAW,EACXv3F,KAAKmoF,iBAAiBrnC,kBAAkBt8C,EAAO0yF,EAAS,GAAI,IAAI,IAKxDp3F,EAAKyY,EAAIzY,EAAK+X,GACtBk0C,EAAO3rD,UAAUC,IAAI,qBAGvBspB,GAAU,CACRnlB,QACAJ,UACAnE,UAAWi3F,EACXttE,SAAU2tE,EAAW,EAAIh0E,EAAA,EAAWosB,OAAOxjB,QAAQzrB,MACnDmpB,UAAW0tE,EAAW,EAAIh0E,EAAA,EAAWosB,OAAOxjB,QAAQxrB,OACpDs8C,QACAjzB,cAAehqB,KAAKgqB,cACpBiC,WAAYjsB,KAAKssB,gBACjBxC,eACAC,iBAAkBwtE,EAClBjtE,eAAgBtqB,KAAKosB,KAAK4qE,sBAI9Br3B,EAAI51D,OAAOotF,GAIT/d,EAAWr4D,aAAa4+C,EAAKoa,GAO/B,MAGF,IAAK,uBAAwB,CAC3B,MAAM9lE,EAAMuhF,EAAat1F,SAIzB,GAAG+T,EAAIqoC,QAAkC,CACvCyP,EAAO3rD,UAAUC,IAAI,WACrBs1F,GAAc,EACdC,GAAoB,EAEjB3hF,EAAI4mC,UACLkR,EAAO3rD,UAAUC,IAAI,oBAGvB,MAAMiY,EAAQiL,EAAA,EAAWosB,OACnB7vC,EAAOisD,EAAO3rD,UAAUuR,SAAS,aAAe2G,EAAMyhC,aAAgB9lC,EAAI4mC,SAAWviC,EAAMk/E,gBAAkBl/E,EAAMm/E,cACzHz3F,KAAKmoF,iBAAiBrnC,kBAAkB7sC,EAAKiwC,EAAepkD,EAAKY,MAAOZ,EAAKa,QAE7Ew4E,EAAgBx2E,MAAMhC,OAASujD,EAAcvhD,MAAMhC,OACnDw4E,EAAgBx2E,MAAMjC,MAAQwjD,EAAcvhD,MAAMjC,MAElD6rB,GAAY,CACVtY,MACAuY,IAAK03B,EACLj4B,WAAYjsB,KAAKssB,gBACjBtC,cAAehqB,KAAKgqB,cACpByC,MAAOC,GAEPjrB,MAAM,EACNjB,MAAM,EACN+4C,MAAOwS,EAAO3rD,UAAUuR,SAAS,aAAe4jF,OAAiB7wF,EACjEs9C,WAAW,EACXl4B,sBAEG,GAAgB,UAAb7V,EAAI9Q,MAAiC,QAAb8Q,EAAI9Q,MAA+B,UAAb8Q,EAAI9Q,KAA4C,CAGtG,MAAM4oB,EAAuB,UAAb9X,EAAI9Q,KACjB4oB,IACD6pE,GAAoB,IAGnB7pE,GAAYwpE,IACbI,GAAc,GAGZvxF,EAAQovE,UACVznB,EAAO3rD,UAAUC,IAAI,aAGvB0rD,EAAO3rD,UAAUC,IAAI0rB,EAAU,QAAU,SACzC,MAAMljB,EAAU7I,KAAKgqD,mBAAmB+iC,uBAAuB3oF,EAAQioF,YACvE,GAAGjoF,EAAQioF,YAA+B,IAAjBxjF,EAAQ/I,MAAc60F,EAC7C5oC,EAAO3rD,UAAUC,IAAI,WAAY,cAEjC2jD,GAAU,CACRC,QAAS7/C,EAAQioF,WACjBnoC,gBACAj4B,WAAYjsB,KAAKssB,gBACjB2wB,MAAO23C,EACP5qE,cAAehqB,KAAKgqB,cACpBoC,KAAMpsB,KAAKosB,KACXtC,eACAQ,eAAgBtqB,KAAKosB,KAAK4qE,0BAEvB,CACL,MAAMh6C,GAAY,gBAAe,cAAajxB,GAAW4pE,IAAgBkB,IA5xF/D,EA6xFP75C,GAAU+O,EAAO3rD,UAAUC,IAAI,mBAClC08C,GAAU,CACR9oC,MACAhU,UAAWikD,EACX9/C,UACAwlB,SAAUrG,EAAA,EAAWosB,OAAOoR,QAAQrgD,MACpCmpB,UAAWtG,EAAA,EAAWosB,OAAOoR,QAAQpgD,OACrCq8C,WACAC,QACAjzB,cAAehqB,KAAKgqB,cACpBiC,WAAYjsB,KAAKssB,gBACjBG,MAAOC,GACP5C,eACAQ,eAAgBtqB,KAAKosB,KAAK4qE,oBAC1BhwF,cAAe+kB,EAAU,CACvB9kB,OAAQjH,KAAKiH,OACbE,YAAa,CAACC,EAAG,iCACjB0D,SAAU9K,KAAKosB,KAAKthB,SACpB3B,WAAY/E,EAAQkT,OAAOC,aAC3BzO,YAAa1E,EAAQkT,OAAOC,mBAC1B7S,SAGH,CACL,MAAMgzF,EvE1xCX,UAA8B,wBAAC/C,EAAuB,QAAEvwF,EAAO,OAAE2nD,EAAM,WAAEqtB,EAAU,KAAEhtD,EAAI,aAAEtC,EAAY,eAAEQ,EAAc,cAAEN,EAAa,cAAEhjB,EAAa,UAAEmC,IAa5J,IAAI2tF,EACJ,MAAM7uF,EAAO0sF,EAA0BvoE,EAAK8/B,aAAa9nD,EAAQyC,KAAO,CAACzC,EAAQyC,KAwDjF,OAnDAoB,EAAK3B,QAAQ,CAACO,EAAKxC,KACjB,MAAMD,EAAUgoB,EAAKg4B,WAAWv9C,GAC1B2lB,EAAMqzB,GAAa,CACvBz7C,UACA0lB,eACAQ,iBACAN,gBACAhjB,kBAGI/G,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAUC,IAAI,sBACxBJ,EAAUmM,QAAQvF,IAAM,GAAKA,EAC7B5G,EAAUmM,QAAQnF,OAAS,GAAK7C,EAAQ6C,OAExC,MAAM2Z,EAAU1gB,SAASC,cAAc,OAGvC,GAFAygB,EAAQxgB,UAAUC,IAAI,oBAEnB+D,EAAQA,QAAS,CAClB,MAAMg1E,EAAal5E,SAASC,cAAc,OAC1Ci5E,EAAWh5E,UAAUC,IAAI,oBAEzB,MAAMq1F,EAAW,IAAkB1pD,aAAa5nC,EAAQA,QAAS,CAC/D6xC,SAAU7xC,EAAQysD,gBAGpBuoB,EAAWn1E,UAAYyxF,EACvB90E,EAAQ7W,OAAOqvE,GAGjB,GAAGnxE,EAAK9F,OAAS,EAAG,CAClB,MAAMgsC,EAAYjuC,SAASC,cAAc,OACzCguC,EAAU/tC,UAAUC,IAAI,sBACxBJ,EAAU8J,OAAOokC,GAEjBluC,EAAUG,UAAUC,IAAI,gBAEb,IAARgE,IACDyyF,EAAgBl2E,GAIpBA,EAAQ7W,OAAOyiB,GACfvsB,EAAU8J,OAAO6W,GACjBw4D,EAAWrvE,OAAO9J,KAGjBgI,EAAK9F,OAAS,GACf4pD,EAAO3rD,UAAUC,IAAI,wBAAyB,cAGzCy2F,EuEotC4Ba,CAAqB,CAC5ChD,0BACAvwF,UACA2nD,SACAqtB,aACAhtD,KAAMpsB,KAAKosB,KACXtC,eACAQ,eAAgBtqB,KAAKosB,KAAK4qE,oBAC1BhtE,cAAehqB,KAAKgqB,cACpBhjB,cAA4B,UAAbiN,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,KAAmB,CAC5D8D,OAAQjH,KAAKiH,OACbE,YAAa,CAACC,EAAgB,UAAb6M,EAAI9Q,KAAmB,gCAAkC,4BAC1E2H,SAAU9K,KAAKosB,KAAKthB,SACpB3B,WAAY/E,EAAQkT,OAAOC,aAC3BzO,YAAa1E,EAAQkT,OAAOC,mBAC1B7S,IAGHgzF,IACDZ,EAAgBY,GAGlB,MAAME,EAAgBxe,EAAWhoC,iBAAiBvhC,cAAc,6CAChE+nF,GAAiBA,EAAc7tF,OAAOgwE,EAASrtC,WAAU,IAEzDqf,EAAO3rD,UAAUuB,OAAO,oBACxBy3E,EAAWh5E,UAAUC,KAAO,CAAC,QAAS,OAAgC05B,SAAS9lB,EAAI9Q,MAAiC,WAAzB8Q,EAAI9Q,MAAQ,YAA2B,YAClI4zF,GAAoB,EAGtB,MAGF,IAAK,sBAAuB,CAG1B,MAAMlN,EAAa3pF,SAASC,cAAc,OAC1C0pF,EAAWzpF,UAAUC,IAAI,WACzBwpF,EAAWz9E,QAAQnF,OAAS,GAAKuuF,EAAar0D,QAE9Ci4C,EAAWh5E,UAAUC,IAAI,mBACzB02F,GAAoB,EAEpB,MAAMc,EAAQ,GACXzzF,EAAQ0O,MAAM0xB,YAAYqzD,EAAMlyF,KAAK,IAAkBmmB,cAAc1nB,EAAQ0O,MAAM0xB,aACnFpgC,EAAQ0O,MAAM2xB,WAAWozD,EAAMlyF,KAAK,IAAkBmmB,cAAc1nB,EAAQ0O,MAAM2xB,YAErFolD,EAAW5lF,UAAY,wFAES4zF,EAAM7wE,KAAK,yDACT5iB,EAAQ0O,MAAM8wE,aAAe,IAAM,OAAApxB,GAAA,GAAkBpuD,EAAQ0O,MAAM8wE,cAAcnxB,UAAY,mDAG/H,MAAMxgC,EAAa,IAAI,GACvBA,EAAWjI,cAAgBhqB,KAAKgqB,cAChCiI,EAAW7uB,aAAa,OAAQ,GAAKgB,EAAQ0O,MAAMquB,SACnDlP,EAAW7xB,UAAUC,IAAI,iBAAkB,aAE3CwpF,EAAWpqE,QAAQwS,GAEnB85B,EAAO3rD,UAAUuB,OAAO,oBACxBy3E,EAAWh5E,UAAUC,IAAI,mBACzB+4E,EAAWrvE,OAAO8/E,GAElB,MAGF,IAAK,mBAAoB,CACvB99B,EAAO3rD,UAAUuB,OAAO,oBAExB,MAAMkwC,EvEvxCT,SAAkBztC,GACvB,MAAML,EAAO,IAAI,GAMjB,OALAA,EAAKK,QAAUA,EACfL,EAAKX,aAAa,UAAW,GAAKgB,EAAQ6C,QAC1ClD,EAAKX,aAAa,UAAWgB,EAAQ0O,MAAMk9B,KAAK7gC,IAChDpL,EAAKX,aAAa,aAAc,GAAKgB,EAAQyC,KAC7C9C,EAAK67C,SACE77C,EuEgxCqB+zF,CAAS1zF,GAC7Bg1E,EAAW35D,QAAQoyB,GACnBunC,EAAWh5E,UAAUC,IAAI,gBAEzB,MAGF,QACE0rD,EAAO3rD,UAAUuB,OAAO,oBACxBy3E,EAAWn1E,UAAY,mLACvBm1E,EAAWrvE,OAAOgwE,GAClB/5E,KAAKsuD,IAAI13C,KAAK,2BAA4BxS,EAAQ0O,MAAM1L,EAAGhD,GAI3D2yF,GACF5d,EAAgBpvE,OAAOm6C,GAYxB0xC,GACD7pC,EAAO3rD,UAAUC,IAAI,cAGpBL,KAAKosB,KAAK+hB,UAAUC,aACrBpuC,KAAKosB,KAAK+hB,UAAUuc,sBAAsBqB,GAAQ,GAGpD,IAAIy+B,EAAY,GAGhB,MAAMuN,EAAY3zF,EAAQwH,SAAWhD,EAAA,QAAU6O,MAAQzX,KAAK46E,gBAAgB/8C,UAAU52B,KAAYjH,KAAK46E,gBAAgBpjD,YAAYvwB,IAAY7C,EAAQovE,SACvJ,GAAGukB,GAAY3zF,EAAQq1E,UAAYr1E,EAAQo2E,aAAc,CACvD,IAAI5sE,EACAoqF,EAEJ,MAAMC,EAAuB7zF,EAAQ8zF,SAAiC,gBAAtB9zF,EAAQ8zF,QAAQ9wF,GAAuBhD,EAAQwH,SAAWxH,EAAQqvE,UAElH,IA8BInzB,EA9BA63C,EAAW/zF,EAAQq1E,WAAar1E,EAAQq1E,SAASye,UAAY9zF,EAAQq1E,SAASpB,WA+BlF,GA9BGj0E,EAAQovE,WACTwkB,EAAW93F,SAASC,cAAc,QAClC63F,EAASzuE,UAAY,IAAMvpB,KAAKkoF,gBAAgB5jD,QAAQlgC,EAAQovE,UAAU39C,SAC1EmiE,EAAS53F,UAAUC,IAAI,cACvB0rD,EAAO3rD,UAAUC,IAAI,mBAGpB83F,GAEDvqF,EAAQ1N,SAASC,cAAc,QAC/ByN,EAAM3J,UAAY,IAAkB6nB,cAAc1nB,EAAQq1E,SAAS2e,WACnExqF,EAAMxN,UAAUC,IAAI,cAEpB0rD,EAAO3rD,UAAUC,IAAI,mBAErBuN,EAAQ,IAAI,KAAU,CAAC3G,OAAQ7C,EAAQqvE,WAAarvE,EAAQwH,SAASoJ,QAGpE5Q,EAAQo2E,cAAgBp2E,EAAQo2E,eAAiBx6E,KAAKosB,KAAKthB,UAC5D,GAAcuvE,SAAS,CACrBjuD,KAAMpsB,KAAKosB,KACX2/B,SACAotB,kBACA/0E,YAOAA,EAAQqvE,WAAarvE,EAAQq1E,SAa/B,GAZGz5E,KAAKiH,SAAW2B,EAAA,QAAU6O,MAASwgF,GACpClsC,EAAO3rD,UAAUC,IAAI,aAGpB+D,EAAQomF,YACTA,EAAYpmF,EAAQomF,UACpB58E,EAAMxB,QAAQo+E,UAAYA,GAG5BlqC,EAAUpgD,SAASC,cAAc,OACjCyN,EAAMxB,QAAQnF,OAAS7C,EAAQqvE,UAE3BzzE,KAAKiH,SAAW2B,EAAA,QAAU6O,MAAQzX,KAAKiH,SAAW,OAAmBgxF,GAA0BrC,EAG5F,CAGL,MAAM3nF,EAA2B,CAACL,GAC/BgoF,GACD3nF,EAAKpI,QAAQ3F,SAASC,cAAc,OAEtCmgD,EAAQv2C,OAAO,eAAK,gBAAiB,CAACkE,UATtCqyC,EAAQ39C,MAAMiyC,MAAQ50C,KAAK46E,gBAAgByd,iBAAiBj0F,EAAQqvE,WAAW,GAC/EnzB,EAAQv2C,OAAO6D,QAURxJ,EAAQovE,YACboiB,GAAqBmC,GACvBz3C,EAAUpgD,SAASC,cAAc,OACjCmgD,EAAQv2C,OAAO6D,GAEXgnF,IACFt0C,EAAQ39C,MAAMiyC,MAAQ50C,KAAK46E,gBAAgByd,iBAAiBj0F,EAAQwH,QAAQ,IAG9E00C,EAAQl0C,QAAQnF,OAAS7C,EAAQwH,QAEjCmgD,EAAO3rD,UAAUC,IAAI,cAIzB,GAAG+D,EAAQovE,SAAU,CACflzB,EAGFA,EAAQv2C,OAAO,KAFfu2C,EAAUpgD,SAASC,cAAc,OAKnC,MAAMgvD,EAAOjvD,SAASC,cAAc,QACpCgvD,EAAKplD,OAAO,eAAK,UAAW,IAAKiuF,GACjC7oC,EAAK/uD,UAAUC,IAAI,UAEnBigD,EAAQv2C,OAAOolD,GAGd7O,IACDA,EAAQlgD,UAAUC,IAAI,QACtBy2F,EAAc/sF,OAAOu2C,IAIvB,GADmBtgD,KAAKosB,KAAKkgD,eAAiBrvB,EAC/B,CACb,IAAIhrB,EAAa,IAAI,GACrBA,EAAWjI,cAAgBhqB,KAAKgqB,cAChCiI,EAAW7xB,UAAUC,IAAI,cAAe,aACxC4xB,EAAWnI,aAAeA,GAEtB1lB,EAAQqvE,WAAarvE,EAAQq1E,UAAYr1E,EAAQq1E,SAAS2e,WAC5DnmE,EAAW7uB,aAAa,aAA8BgB,EAAQq1E,SAAS2e,WAGzEnmE,EAAW7uB,aAAa,OAAQ,KAAQgB,EAAQq1E,WAAaz5E,KAAKiH,SAAW2B,EAAA,QAAU6O,MAAQzX,KAAKiH,SAAW,OAAqBgxF,EAAuB7zF,EAAQqvE,UAAYrvE,EAAQwH,SAAW,OAKlMipF,EAAe9qF,OAAOkoB,SAGxB85B,EAAO3rD,UAAUC,IAAI,aAGD,WAAnBL,KAAKosB,KAAKjpB,OACXqnF,EAAY,GAAGxqF,KAAKosB,KAAKnlB,UAAU7C,EAAQyC,OAQ7C,GALwB8vF,GAAsBA,EAAmB9vF,MAAQ7G,KAAKosB,KAAKthB,UAEjFihD,EAAO3rD,UAAUC,IAAI,oBAAqB,iBAGzCmqF,IAAiC,WAAnBxqF,KAAKosB,KAAKjpB,MAAqBiB,EAAQq1E,SAASyQ,oBAAsBlqF,KAAKiH,SAAW,KAAiB,CACtH,MAAMqxF,EAAOp4F,SAASC,cAAc,OACpCm4F,EAAKl4F,UAAUC,IAAI,uBAAwB,gBAAiB,oBAC5D84E,EAAgBpvE,OAAOuuF,GACvBvsC,EAAO3/C,QAAQo+E,UAAYA,EAC3Bz+B,EAAO3rD,UAAUC,IAAI,sBAQvB,GALA0rD,EAAO3rD,UAAUC,IAAI48C,EAAQ,SAAW,SACrCyvC,GACD1sF,KAAKq1F,oBAAoBjxF,EAAS2nD,EAAQjnD,EAASglB,GAGlD+sE,EAAa,CACG,GAAc3c,cAAc,CAC3CnuB,SACAotB,kBACA/0E,QAASuyF,EACTvd,aACAtvD,eACAE,cAAehqB,KAAKgqB,kBAIpB2rE,GAAc,GAUlB,OANGA,IACD5pC,EAAO3rD,UAAUC,IAAI,iBAErB84E,EAAgBpvE,OAAOwuF,OAGlBxsC,EAGD,kBAAkB3nD,EAAcU,EAAmB4vF,EAA0B3oC,EAAyB2gC,GAC5G,IACE,OAAO1sF,KAAKw4F,cAAcp0F,EAASU,EAAS4vF,EAAgB3oC,EAAQ2gC,GACpE,MAAMjgF,GACNzM,KAAKsuD,IAAI3hD,MAAM,uBAAwBF,IAI9B,qBAAqBtI,EAAmBW,EAAkB2zF,EAAsBzF,G,0CAyC3F,IAAI0F,EAzBJv0F,EAAUA,EAAQV,QAEfuvF,GACD7uF,EAAQ0B,QAAQmtF,GAyBhBhzF,KAAKkpF,sBAAwB,KAC3B,MAAM,UAAC1gD,EAAS,aAAEunB,GAAgB/vD,KAAK+K,WAIvC2tF,EAA+B5zF,EAAUirD,EAAevnB,EAAYA,EAYpExoC,KAAKkpF,2BAAwBxkF,GAK9B1E,KAAK24F,mBACNpd,GAAwBv7E,KAAK+K,WAAW9K,WACxCD,KAAK24F,kBAAmB,GAG1B,MAAMvhD,EAAMvwC,IACV,MAAMzC,EAAUpE,KAAKosB,KAAKg4B,WAAWv9C,GAClCzC,EAAQ+K,GAAK,EACdnP,KAAKusF,kBAAkBnoF,EAASU,GAAS,GAEzC9E,KAAK44F,0BAA0Bx0F,IAI7BjC,EAASgC,EAAQhC,OACvB,GAAG2C,EAAS,IAAI,IAAIkG,EAAI,EAAGA,EAAI7I,IAAU6I,EAAGosC,EAAGjzC,EAAQ6G,SAClD,IAAI,IAAIA,EAAI7I,EAAS,EAAG6I,GAAK,IAAKA,EAAGosC,EAAGjzC,EAAQ6G,IAErD,GAAsB,cAAnBhL,KAAKosB,KAAKjpB,KAAsB,CACjC,MAAMurC,EAAiB1uC,KAAKgqD,mBAAmBouB,kBAAkBp4E,KAAKiH,OAAQjH,KAAKosB,KAAKthB,UAClF+tF,EAAanqD,EAAevqC,QAAQ4rB,MACpC+oE,EAAYpqD,EAAevqC,QAAQ2jD,MACtC+wC,EAAWx8D,MAAM,KAAS23D,SAAa6E,EAAW12F,SAAUgC,EAAQ41B,SAAS8+D,EAAW,KACzF74F,KAAKkwF,UAAU,UAAU,GAAM,IAG9B4I,EAAUz8D,MAAM,KAAS08D,MAAUD,EAAU32F,SAAUgC,EAAQ41B,SAAS++D,EAAUA,EAAU32F,OAAS,KACtGnC,KAAKkwF,UAAU,OAAO,GAAM,QAG9BlwF,KAAKkwF,UAAU,OAAO,GACtBlwF,KAAKkwF,UAAU,UAAU,GAa3B,SAVMlwF,KAAKgpF,qBAERhpF,KAAK+K,WAAW5F,UAAUquB,KAAOxzB,KAAKmpF,kCACvCnpF,KAAKmpF,kCAEFnpF,KAAKmpF,iCACNnpF,KAAKmpF,wCAI2BzkF,IAAjCg0F,EAA4C,CAgB7C,MAAMM,EAAel0F,EAAU9E,KAAK+K,WAAWglD,aAAe2oC,EAA+BA,EAQ7F14F,KAAK+K,WAAWy9B,UAAYwwD,EAIzB,cACDzd,GAAwBv7E,KAAK+K,WAAW9K,WAQ5C,OAAO,KAkBF,eAAe2G,EAAe7B,EAAmB4B,GAEtD,GAAsB,SAAnB3G,KAAKosB,KAAKjpB,MAAsC,eAAnBnD,KAAKosB,KAAKjpB,KACxC,OAAOnD,KAAKgqD,mBAAmBimC,WAAWjwF,KAAKiH,OAAQL,EAAO7B,EAAW4B,EAAW3G,KAAKosB,KAAKthB,UACzF,GAAsB,WAAnB9K,KAAKosB,KAAKjpB,KAAmB,CAUrC,OATgBnD,KAAKgqD,mBAAmBjjD,UAAU,CAChDE,OAAQjH,KAAKiH,OACbE,YAAa,CAACC,EAAG,6BACjBR,QACAM,MAAOnC,EACP4B,cAED9F,KAAKqB,IAAS,CAAEiC,QAASjC,EAAMiC,QAAQsE,IAAIyhC,GAAKA,EAAErjC,QAG9C,MAAsB,cAAnB7G,KAAKosB,KAAKjpB,KACXnD,KAAKgqD,mBAAmBivC,qBAAqBj5F,KAAKiH,QAAQpG,KAAKoH,IAG7D,CAAC9D,QAAS8D,EAAKxE,QAAQqB,kBAJ3B,EASK,gBAAgBkuF,EAAuBkG,EAA0BC,EAA2BxyF,EAAmBC,G,0CAI3H,GAAG5G,KAAKosB,KAAK+xB,iBAAmBn+C,KAAKkyF,uBAGnC,YADAlyF,KAAKkyF,uBAAyBlyF,KAAKo5F,gBAAgB7yF,KAAKvG,KAAMgzF,EAAekG,EAAgBC,EAAkBxyF,EAAWC,IAQ5H,IAAIoQ,OAAOy0C,KAAKzrD,KAAKqsB,SAASlqB,OAC5B,OAGF,IAMIk3F,EANAC,EAAa,YAAqBt5F,KAAKqsB,QAAS,QAEjD8sE,GAAoBD,EAAe/2F,SACpCm3F,EAAaA,EAAW1xF,OAAOf,IAAQqyF,EAAen/D,SAASlzB,KAK/DwyF,EADC1yF,EACWC,GAASvE,KAAKP,OAAOw3F,GAE9BtG,GAGW3wF,KAAKP,OAAOw3F,GAI5B,MAAMC,EAASD,EAAW71F,MAAM61F,EAAWnkF,UAAUtO,GAAOwyF,EAAYxyF,IAClE2yF,EAAYL,EAAmB,GAAK,CAACE,GACrCI,EAAYN,EAAmB,GAAKG,EAAW71F,MAAM,EAAG61F,EAAWnkF,UAAUtO,GAAOwyF,GAAaxyF,IAAM/B,UAE1G,MACD9E,KAAKsuD,IAAI,6BAA8B+qC,EAAWzyF,EAAOosF,EACvDuG,EAAO9wF,IAAIyhC,GAAKlqC,KAAKsoF,sBAAsB/F,mBAAmBr4C,IAC9DuvD,EAAUhxF,IAAIyhC,GAAKlqC,KAAKsoF,sBAAsB/F,mBAAmBr4C,KAGrE,MAAMwvD,EAA4B,GAElC15F,KAAK2pF,UAAUvpF,UAAUC,IAAI,eAC7B,MAAMs5F,EAAQR,EAAmB,GAAK,GAChC7/D,EAAc6/D,EAAmB,EAAI,EACrCC,EAAkB,CAACnxF,EAAgBqxB,EAAc,KACrD,MAAMuW,EAAmB,eACzB,IAAI+pD,EAAc,EAsClB,OArCA3xF,EAAK3B,QAAQ,CAACO,EAAKxC,KACjB,IAAIrE,KAAKqsB,QAAQxlB,IAAQ7G,KAAKwoF,YAAY7gF,IAAId,GAE5C,YADA7G,KAAKsuD,IAAI13C,KAAK,qCAAsC/P,GAItD,MAAMguF,EAAiB70F,KAAKqsB,QAAQxlB,GAAKuqC,iBASzC,GAPAwoD,GAAgBv1F,EAAMi1B,GAAgB,IAAOqgE,EAI7C9E,EAAez0F,UAAUC,IAAI,aAC7Bw0F,EAAelyF,MAAMqyF,gBAAkB4E,EAAc,KAElDv1F,IAAS4D,EAAK9F,OAAS,EAAI,CAC5B,MAAM2sD,EAAmB7sD,IACpBA,EAAE4S,SAAWggF,IAIhBhlD,EAAiB5pC,UACjB4uF,EAAexrF,oBAAoB,gBAAiBylD,KAGtD+lC,EAAe7zF,iBAAiB,gBAAiB8tD,GAKnD4qC,EAAW/zF,KAAKkvF,KAGd5sF,EAAK9F,QACP0tC,EAAiB5pC,UAGZ,CAAC2zF,cAAa/pD,qBAGjBgqD,EAAST,EAAgBG,EAAQjgE,GACjCwgE,EAAYV,EAAgBI,GAC5BO,EAAYX,EAAgBK,EAAWngE,GACvCmE,EAAW,CAACo8D,EAAOhqD,iBAAkBiqD,EAAUjqD,iBAAkBkqD,EAAUlqD,kBAC3EmqD,EAAmB,CAACH,EAAOD,YAAaE,EAAUF,YAAaG,EAAUH,aAc/E,IAAIzzF,EAsBJ,OAlCGnG,KAAKiyF,wBACAjyF,KAAKiyF,mBAIb,aAAQ,KACNyH,EAAWpzF,QAAQuuF,IACjBA,EAAez0F,UAAUuB,OAAO,kBAMjC43F,EAAOp3F,QAAUq3F,EAAUr3F,QAAUs3F,EAAUt3F,UAChDgE,EAAUtD,QAAQC,IAAI26B,GAEtB,aAA4Bt3B,EAAS9D,KAAKP,OAAOk4F,GAAU,KAC1Dn5F,KAAK,KACJ,aAAQ,KACN64F,EAAWpzF,QAAQuuF,IACjBA,EAAelyF,MAAMqyF,gBAAkB,KAGzCh1F,KAAK2pF,UAAUvpF,UAAUuB,OAAO,iBAK9B,eACF3B,KAAK24F,kBAAmB,MAKvBxyF,KAGD,uBAAuBhD,EAA6E4oD,EAAqB3nD,EAAc6iB,GAC7I,MAAM0gB,EAAa,2BAGnB,IAAI/5B,EASAqsF,EACJ,GAZAluC,EAAO3rD,UAAUC,IAAIsnC,EAAYA,EAAa,IAAMxkC,GAGxC,UAATA,EAAkByK,EAAQ,eAAK,oBACjB,UAATzK,EAAkByK,EAAQ,eAAK,qBACtB,eAATzK,GAAkC,aAATA,EAAqByK,EAAQ,eAAK,cAClD,wBAATzK,IAAgCyK,EAAQ,eAAK,wBACrDA,EAAMxN,UAAUC,IAAI,SAAUsnC,EAAa,UAE3C1gB,EAASthB,KAAKiI,GAGF,UAATzK,EACD8jB,EAASthB,KAAK,eAAK,qBACnBs0F,EAAe,CACb,eAAK,qBACL,eAAK,qBACL,eAAK,qBACL,eAAK,2BAEF,GAAY,UAAT92F,EACR82F,EAAe,CACb,eAAK,4BACL,eAAK,4BACL,eAAK,4BACL,eAAK,kCAEF,GAAY,aAAT92F,EAAqB,CAC7B,MAAMuoB,EAAW,eAAK,kCACtBA,EAAStrB,UAAUC,IAAI,SAAUsnC,EAAa,aAE9C3nC,KAAKipF,cAAchtD,cAAcoB,GAAKA,EAAE0uB,SAAWA,GAEnD,MAAM44B,EAAazkF,SAASC,cAAc,OAC1CwkF,EAAWvkF,UAAUC,IAAIsnC,EAAa,YAEtC,MAAM1b,EAAajsB,KAAKssB,gBAElBhsB,EAAcN,KAAK68C,mBAAmB1E,qBAAqBt3C,KAAKoT,IACpE,IAAIgY,IAAc,OAElB,MAAMnC,EAA+B,GAoBrC,OAnBAyC,GAAY,CACVtY,MAEAuY,IAAKm4D,EACL14D,aACAjC,cAAehqB,KAAKgqB,cACpByC,MAAOC,GAEPjrB,MAAM,EACNjB,MAAM,EACNwhD,WAAW,EACXl4B,iBAGF,YAAiB66D,EAAa1iF,IAC5B,OAAAyb,EAAA,GAAYzb,GACZ,GAAkBguD,aAAa,CAACp7C,OAAQ5S,EAAE4S,WAGrChS,QAAQC,IAAIgnB,KAGrB9pB,KAAKq1F,oBAAoBjxF,EAAS2nD,GAAQ,EAAO,CAACzrD,IAElD2mB,EAASthB,KAAK+lB,EAAUi5D,GAGvBsV,IACDhzE,EAASthB,QACJs0F,EAAaxxF,IAAI1E,IAClB,MAAMorD,EAAOjvD,SAASC,cAAc,QAGpC,OAFAgvD,EAAK/uD,UAAUC,IAAIsnC,EAAa,cAChCwnB,EAAKplD,OAAOhG,GACLorD,KAIC,UAAThsD,EACD82F,EAAa3zF,QAAQvC,IACnB,MAAMiH,EAAI9K,SAASC,cAAc,QACjC6K,EAAE5K,UAAUC,IAAI,eAChB0D,EAAK0b,QAAQzU,KAEE,UAAT7H,GACR82F,EAAa3zF,QAAQvC,IACnB,MAAMiH,EAAI9K,SAASC,cAAc,QACjC6K,EAAE5K,UAAUC,IAAIsnC,EAAa,gBAC7B38B,EAAEue,UAAY,IACdxlB,EAAK0b,QAAQzU,MAKhBic,EAAS9kB,OAAS,GACnB4pD,EAAO3rD,UAAUC,IAAI,mBAGvB4mB,EAAS3gB,QAAS0O,GAAiBA,EAAQ5U,UAAUC,IAAIsnC,EAAa,UAGhE,0BAA0BvjC,GAChC,MAAM2nD,EAAS/rD,KAAKusF,kBAAkBnoF,OAASM,OAAWA,OAAWA,GAAW,GAChFqnD,EAAO3rD,UAAUC,IAAI,eAAgB,gBAAiB,kBACtD0rD,EAAO3rD,UAAUuB,OAAO,gBAAiB,SAEzC,MAAMy3E,EAAartB,EAAOl8C,cAAc,0BAClCoX,EAA8B,GAC9B8rE,EAAQ/yF,KAAK46E,gBAAgBmY,MAAM/yF,KAAKiH,QAC9C,GAAG8rF,GAAuB,YAAd3uF,EAAQgD,EAAiB,CACnC,MAAMmB,EAAIrI,SAASC,cAAc,KACjCoI,EAAEwB,OAAO,eAAK,iBACdkd,EAASthB,KAAK4C,EAAG,aACTvI,KAAK46E,gBAAgBtO,WAAWtsE,KAAKiH,SAAWjH,KAAK46E,gBAAgBngD,QAAQz6B,KAAKiH,QAAQqQ,OAAO4iF,QACzGl6F,KAAKm6F,uBAAuB,QAASpuC,EAAQ3nD,EAAS6iB,GAC3B,cAAnBjnB,KAAKosB,KAAKjpB,KAClBnD,KAAKm6F,uBAAuB,sBAAuBpuC,EAAQ3nD,EAAS6iB,GAC5Dre,EAAA,QAAU6O,OAASzX,KAAKiH,OAChCjH,KAAKm6F,uBAAuB,QAASpuC,EAAQ3nD,EAAS6iB,GAC9CjnB,KAAK46E,gBAAgBn+C,OAAOz8B,KAAKiH,UAAY8rF,GAAS/yF,KAAKgqD,mBAAmBm8B,cAAcnmF,KAAKiH,SAA8B,SAAnBjH,KAAKosB,KAAKjpB,KAC9HnD,KAAKm6F,uBAAuB,WAAYpuC,EAAQ3nD,EAAS6iB,GAEzDjnB,KAAKm6F,uBAAuB,aAAcpuC,EAAQ3nD,EAAS6iB,GAO7DmyD,EAAW35D,WAAWwH,GAEnBjnB,KAAKmpF,gCACNnpF,KAAKiyF,gBAAkB,KAKrB,GAJAjyF,KAAK2pF,UAAUlqE,QAAQssC,GACvB/rD,KAAKiyF,qBAAkBvtF,GAGnB1E,KAAKgpF,qBACP,OAAO,gBAIXhpF,KAAK2pF,UAAUlqE,QAAQssC,GAGzB/rD,KAAKwwF,oBAAsBpsF,EAAQyC,IAG7B,0BAA6CuzF,EAAa5uE,GAChE,MAAMkE,EAAS1vB,KAAKsoF,sBAAsB+R,kBAAqC,cAAnBr6F,KAAKosB,KAAKjpB,MAAwB,EAAI,GAE5FiB,EAA0F,CAC9FgD,EAAGgzF,EAAU,iBAAmB,UAChCjyE,KAAM,EACNhZ,MAAOnP,KAAKiH,OAASyoB,GACrB4qE,QAASt6F,KAAK46E,gBAAgB2f,cAAcv6F,KAAKiH,QACjDqQ,OAAQ,IAYV,OATI8iF,IACFh2F,EAAQA,QAAU,IAGpB,OAAA4jE,GAAA,GAAwC5jE,GAExConB,GAAQA,EAAKpnB,GAEbpE,KAAKgqD,mBAAmBwwC,aAAa,CAACp2F,IAC/BA,EAGD,UAAUq2F,EAAkBv4F,EAAgBw4F,GAAoB,GAEtE,GADmB16F,KAAK+K,WAAW5F,UAAUs1F,KAAUv4F,EACvD,CAUA,GANAlC,KAAK+K,WAAW5F,UAAUs1F,GAAQv4F,EAMtB,QAATu4F,GAAkBv4F,GAASlC,KAAK46E,gBAAgBmY,MAAM/yF,KAAKiH,QAAS,CACrEjH,KAAKsuD,IAAI,0BAET,MAAMriC,EAAajsB,KAAKssB,gBACxB,OAAOtsB,KAAKooF,kBAAkBv8C,WAAW7rC,KAAKiH,OAAO8K,YAAYlR,KAAKirC,I,MACpE,IAAI7f,IACF,OAGF,KAAqB,QAAjB,EAAA6f,EAAS6uD,gBAAQ,eAAE5jE,aAErB,YADA/2B,KAAK46F,gCAIP,MAAMx2F,EAAUpE,KAAK66F,2BAA0B,EAAOz2F,IACpDA,EAAQA,QAAU0nC,EAAS6uD,SAAS5jE,cAGtC/2B,KAAK44F,0BAA0Bx0F,KAInCpE,KAAK46F,iCAGA,gCACL,GAAG56F,KAAK+K,WAAW5F,UAAUquB,KAC3BxzB,KAAK+K,WAAW5F,UAAU2X,aACGpY,IAA7B1E,KAAKwwF,uBAEFxwF,KAAKgqD,mBAAmBouB,kBAAkBp4E,KAAKiH,QAAQtC,OAEtDqS,OAAOy0C,KAAKzrD,KAAKqsB,SAASlqB,SACzBnC,KAAK86F,qBAEY,cAAnB96F,KAAKosB,KAAKjpB,OAAyB6T,OAAOy0C,KAAKzrD,KAAKqsB,SAASlqB,QAEhE,CACAnC,KAAKsuD,IAAI,iCAET,MAAMlqD,EAAUpE,KAAK66F,2BAA0B,GAG/C,OAFA76F,KAAK44F,0BAA0Bx0F,IAExB,EAGT,OAAO,EAWF,WAAWwC,EAAQ,EAAG9B,GAAU,EAAO2zF,GAAc,EAAOzF,EAAgB,EAAGnkD,GAAW,GAC/F,MAAM5nC,EAASjH,KAAKiH,OAGd00B,EAAYt5B,KAAKC,IAAI,GAAIs5B,GAAA,EAAWj7B,OAAS,GAAkB,GAE/Do6F,EAAgB/jF,OAAOy0C,KAAKzrD,KAAKqsB,SAASlqB,OAAS,EAA2BE,KAAKP,IAAI,GAAI65B,GAAaA,EAE9G,IAAI52B,EAAYg2F,EAOhB,QAAmBr2F,IAAhBujF,GAA2B,CAC5B,IAAGA,GAKD,MAAO,CAACnvE,QAAQ,EAAO3S,QAAStD,QAAQoD,SAAQ,IAJ7C+Q,OAAOy0C,KAAKzrD,KAAKqsB,SAASlqB,OAAS,KAClC8lF,GASR,IAUIiR,EAVAvyF,EAAY,EAWhB,GAVG8xF,IACD9xF,EAAY5B,EAERD,IACFC,EAAY,IAMbiuF,IAAkByF,EACnB,GAAsB,WAAnBz4F,KAAKosB,KAAKjpB,KACX+1F,EAAiB,CAAClG,OACb,CACL,MACMvvF,EADiBzD,KAAKgqD,mBAAmBouB,kBAAkBnxE,EAAQjH,KAAKosB,KAAKthB,UACtD3G,QAAQV,MACrC,GAAGA,EAAMtB,OAAS4C,IAActB,EAAM44B,MAAM,KAAS2+D,MAAO,CAC1D9B,EAAiBz1F,EAAMA,QAGvB,IAAI,IAAIuH,EAAIkuF,EAAe/2F,OAAS,EAAG6I,GAAK,IAAKA,EAAG,CAElD,IADgBhL,KAAKosB,KAAKg4B,WAAW80C,EAAeluF,IACzCqhF,WACN,MADkB6M,EAAez0F,OAAOuG,EAAG,GAIlDpE,EAAQsyF,EAAeA,EAAe/2F,OAAS,IAAMyE,GAQ3D,IACIq0F,EADA50F,EAA6ErG,KAAK0rF,eAAe9kF,EAAO7B,EAAW4B,GAIvH,MAAMwyF,GAAmBD,aAAc,EAAdA,EAAgB/2F,SAAUkE,aAAkBxD,QAC/Dq4F,EAAwBl7F,KAAKspF,aAAe3iF,GAAaN,aAAkBxD,SAAYs2F,EAC1FA,IACD8B,EAAgB50F,EAChBA,EAAS,CAAClC,QAAS+0F,IAIrBl5F,KAAKspF,aAAc,EAEnB,MAAM6R,EAAsBC,GAAiC,mCAC3D,GAAG,mBAAoBA,GAAiBA,EAAcj3F,QAAQk4B,MAAM,KAAS08D,KAAM,CACjF,GAAsB,eAAnB/4F,KAAKosB,KAAKjpB,KAAuB,CAElC,MAAMk4F,EAAwBr7F,KAAKgqD,mBAAmBsxC,iCAAiCt7F,KAAKiH,OAAS,IAAMjH,KAAKosB,KAAKthB,UAClHuwF,GAAuBD,EAAcj3F,QAAQwB,KAAK01F,GACrDD,EAAcj3F,QAAQwB,QAAQ3F,KAAKosB,KAAK8/B,aAAalsD,KAAKosB,KAAKthB,UAAUhG,iBAGrE9E,KAAKkwF,UAAU,OAAO,OAI1BqL,EAAOl1F,GASJ,eAA2BxF,KAAK,IAC9Bs6F,EAAc90F,IACpBxF,KAAK,IACCb,KAAK+tF,qBAAqB1nF,EAAOlC,SAAW,GAAIW,EAAS2zF,GAAcU,GAAoBnG,IAIhGwI,EAAkBn1F,IACtB,MAAMF,EAAUE,EAAOxF,KAAMwF,IAGxBvB,EAAU9E,KAAK+vF,uBAAyB5pF,EAAUnG,KAAKgwF,0BAA4B7pF,IACpFnG,KAAKsuD,IAAI13C,KAAK,4BAEP/T,QAAQkoB,UAGd8jB,GACD7uC,KAAK+K,WAAW62B,YACT,GAIF25D,EAAIl1F,GACToG,IAEF,MADAzM,KAAKsuD,IAAI3hD,MAAM,oBAAqBF,GAC9BA,IAGR,OAAOtG,GAGT,IAAIA,EAA2B2S,EAC/B,GAAGzS,aAAkBxD,QACnBiW,GAAS,EACT3S,EAAUq1F,EAAen1F,OACpB,IAAGwoC,EACR,OAAO,KAEP/1B,GAAS,EAET3S,EAAUo1F,EAAIl1F,GAKhB,MAAMo1F,EAActC,EAAmBqC,EAAeP,GAAiB90F,EAEvE,GAAG+0F,GAAwBtyF,EAAA,QAAUw1B,SAASC,kBAAkC,CAC9E,IAAImZ,EAAQ2hD,EAAmB,EAAI,EACnCn5F,KAAKmpF,gCAAkC,KAGrC,GAFAnpF,KAAKsuD,IAAI,qCAEJ9W,EAAO,OAEZx3C,KAAKmpF,qCAAkCzkF,GAEvB1E,KAAKo5F,gBAAgBpG,EAAekG,EAAgBC,EAAkBxyF,EAAWC,IACrF/D,QAAQoD,WAAWpF,KAAK,KAClC2K,WAAW,KACTxL,KAAKowF,gBAAgBtrF,GAAS,IAC7B,WAIP9E,KAAKmpF,qCAAkCzkF,EAQzC,OALCI,EAAU9E,KAAK+vF,qBAAuB0L,EAAcz7F,KAAKgwF,wBAA0ByL,EACpFA,EAAY56F,KAAK,KACdiE,EAAU9E,KAAK+vF,0BAAuBrrF,EAAY1E,KAAKgwF,6BAA0BtrF,IAGjFmqC,EACM,OAGOqsD,GAAwB/0F,EAAQtF,KAAK,KASnD,IAAIgzD,EARD/uD,GACD9E,KAAK8oF,iBACL9oF,KAAK+oF,kBAAoB1mF,KAAKP,IAAI,IAAK9B,KAAK+oF,qBAE5C/oF,KAAK+oF,oBACL/oF,KAAK8oF,eAAiBzmF,KAAKP,IAAI,IAAK9B,KAAK8oF,kBAIvChkF,GAAW9E,KAAK8oF,eAAiB,IAAQhkF,GAAW9E,KAAK+oF,kBAAoB,KAC/El1B,EAAM,YAAqB7zD,KAAKqsB,UAIlC,MAAMqvE,EAA4B,EAAhBX,EAEflnC,GAAOA,EAAI1xD,OAASu5F,IAClB52F,GAGD+uD,EAAMA,EAAIpwD,MAAMi4F,GAChB17F,KAAKkwF,UAAU,UAAU,KAOzBr8B,EAAMA,EAAIpwD,MAAM,EAAGowD,EAAI1xD,OAASu5F,GAChC17F,KAAKkwF,UAAU,OAAO,IAQxBlwF,KAAKksF,oBAAoBr4B,GAAK,MAIlC1tD,EAAQtF,KAAK,KAGW,SAAnBb,KAAKosB,KAAKjpB,MAITqI,WAAW,KACN1G,EACD9E,KAAKowF,iBAAgB,GAAM,GAE3BpwF,KAAKowF,iBAAgB,GAAO,IAE7B,KAMF,CAACt3E,SAAQ3S,YAGX,qBACL,GAAwB,SAAnBnG,KAAKosB,KAAKjpB,MAAsC,eAAnBnD,KAAKosB,KAAKjpB,KAC1C,OAGF,GAAGnD,KAAK+xF,qBACN,OAGF,MAAMrjD,EAAiB1uC,KAAKgqD,mBAAmBouB,kBAAkBp4E,KAAKiH,OAAQjH,KAAKosB,KAAKthB,UACxF,IAAI2tE,EAAYz4E,KAAKgqD,mBAAmB0oC,qBAAqB1yF,KAAKiH,OAAQjH,KAAKosB,KAAKthB,UACpF,GAAI2tE,IAEJA,EAAYzhE,OAAOy0C,KAAKzrD,KAAKqsB,SAC5BzkB,OAAOf,IAAQ7G,KAAKqsB,QAAQxlB,GAAKzG,UAAUuR,SAAS,WACpDlJ,IAAIuC,IAAMA,GACV3C,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GACnBkI,KAAKzF,GAAKA,EAAIytE,GAEZA,GAAaz4E,KAAKqsB,QAAQosD,IAAY,CACvC,IAAI1sB,EAAS/rD,KAAKqsB,QAAQosD,GACvBz4E,KAAKopF,mBAAqBppF,KAAKopF,oBAAsBr9B,IACtD/rD,KAAKopF,kBAAkBhpF,UAAUuB,OAAO,mBACxC3B,KAAKopF,kBAAoB,MAGxB3Q,IAAc/pC,EAAe9nC,OAC9BmlD,EAAO3rD,UAAUC,IAAI,mBAGvBL,KAAKopF,kBAAoBr9B,EACzB/rD,KAAK+xF,sBAAuB,GAIzB,wBACL,MAAM4J,KAAqB37F,KAAKy+E,kBAAZ,EACpB,IAAI,MAAMzzE,KAAKhL,KAAKyoF,aAAc,CAChC,MAAM6E,EAActtF,KAAKyoF,aAAaz9E,GAEnCsiF,EAAYrtF,UAAUgK,oBAAsB0xF,IAC7CrO,EAAYrtF,UAAU0B,SACnB3B,KAAKy+E,mBACNz+E,KAAKy+E,kBAAkBl0C,UAAU+iD,EAAYrtF,UAAWqtF,EAAY9gE,YAE/DxsB,KAAKyoF,aAAaz9E,IAI7BhL,KAAK46F,iCAIF,SAASrC,KACd,MAAM30E,EAAM1jB,SAAS2jB,gBAAgB,6BAA8B,OACnED,EAAIE,eAAe,KAAM,UAAW,aACpCF,EAAIE,eAAe,KAAM,QAAS,MAClCF,EAAIE,eAAe,KAAM,SAAU,MACnCF,EAAIxjB,UAAUC,IAAI,eAElB,MAAM2lC,EAAM9lC,SAAS2jB,gBAAgB,6BAA8B,OAKnE,OAJAmiB,EAAIliB,eAAe,KAAM,OAAQ,wBAEjCF,EAAI7Z,OAAOi8B,GAEJpiB,EE3/HM,MAAM,GACnB,YAAY3c,EAAgBJ,EAAa+0F,EAAcr1C,G,MACrD,IAAI34C,EAAoBmpB,EAA0BqL,EAChDxkB,EAAuC,GAAIsZ,EAA6C,GAE1F,MAAM2kE,EAAW,IAAgBC,cAAc70F,GAEzCowB,EAAW,CAAC1Z,EAA4Co+E,EAAmBC,KAC/ExwF,WAAW,KACT,IAAIrF,EAGAA,EAFDy1F,IAAU/0F,EACRg1F,EACS,IAAmBI,iBAAiBh1F,GAEpC,IAAmBi1F,mBAAmBj1F,GAGxC,IAAmBk1F,oBAAoBl1F,EAAQJ,EAAK+0F,EAAOI,EAAQD,GAG5Ex1C,GACDpgD,EAAQtF,KAAK0lD,IAEd,MAGL,GAAGq1C,EAAO,CACR,IAAIQ,EAA0B,eAC1Bv1F,GAWF+G,EAAQ,yBACRmpB,EAAc,sBAXX8kE,GACDjuF,EAAQ,uBACRmpB,EAAc,oCACdqL,EAAkB,CAAC,KAA+C,QAAzC,MAAmBkwD,eAAerrF,UAAO,eAAEtC,QAAS,MAE7EiJ,EAAQ,wBACRmpB,EAAc,8BACdqlE,EAAa,oBAOjBx+E,EAAQjY,KAAK,CACXyuB,QAASgoE,EACT95D,UAAU,EACVjL,iBAEG,CACLzpB,EAAQ,uBACR,MAAMyuF,EAA6B,aAEhCp1F,EAAO42B,aACRjgB,EAAQjY,KAAK,CACXyuB,QAASioE,EACThlE,SAAW1Z,GAAY0Z,EAAS1Z,GAAS,GAAQA,EAAQ7d,QAGxD,IAAgB03B,YAAYvwB,EAAOivB,YACpCa,EAAc,0BAEdA,EAAc,kBAEdG,EAAWvxB,KAAK,CACduX,KAAM,YACNS,SAAS,OAIboZ,EAAc,sBAEX9vB,IAAW2B,EAAA,QAAU6O,KACtBmG,EAAQjY,KAAK,CACXyuB,QAASioE,EACThlE,cAGFzZ,EAAQjY,KAAK,CACXyuB,QAASioE,EACThlE,SAAW1Z,GAAY0Z,EAAS1Z,GAAUA,EAAQ7d,QAGpDo3B,EAAWvxB,KAAK,CACduX,KAAM,aACNqlB,SAAU,CAAC,IAAI,KAAU,CAACt7B,WAAS+N,SACnC2I,SAAS,MAMjB,aAAgBC,GAEF,IAAI,GAAU,oBAAqB,CAC/C3W,SACA8rB,aAAcnlB,EACdkpB,mBAAoBC,EACpBE,oBAAqBmL,EACrBxkB,UACAsZ,eAGIzY,QC/GK,SAAS69E,GAAiBnuD,EAAY5iC,OAAOy7C,gBAC1D,IAAI7Y,IAAcA,EAAUo5C,WAC1B,OAAO,EAGT,MAAMgV,EAAiBpuD,EAAUs5C,WAAW,GAC5C,OAAI8U,EAAe90C,aAAe80C,EAAeC,aCEpC,MAAM,WAAmC,GAEtD,YAAYv1F,EAAgBgB,EAAgBw0F,EAA2Bl2C,GACrEtjD,MAAM,gCAAiC,CACrCyzB,SAAS,EACTI,mBAAoB,aACpBlZ,QAAS,CAAC,CACRwW,QAAS,aACTiD,SAAU,KACJx1B,EAAW+vB,YAIf20B,GAAaA,IACb,IAAmBm2C,eAAez1F,EAAQgB,EAAMw0F,EAAQ56F,EAAWK,OAAOrB,KAAKiqE,IACzEA,GAEJt2C,GAAS,CACPC,YAAa,yBAKrBte,MAAM,IAGR,MAAMqW,EAAMtsB,SAASC,cAAc,OAGnCosB,GAAY,CACVtY,IAHU,GAAmB2lC,wBAAwB,GAA2B+iD,eAIhFnwE,MACA+sB,MAAO,GAA2BojD,cAClCj8F,MALW,IAMXC,OANW,IAOXH,MAAM,EACNiB,MAAM,IACL4f,QAAQ,KACTrhB,KAAKye,SAGPze,KAAKyN,OAAO1D,OAAOyiB,GAEnB,MAAM3qB,EAAa,IAAI,IAAW,CAChC2P,MAAO,aACPC,UAAW,IACX7E,YAAa,0BAGf/K,EAAWE,MAAMf,iBAAiB,QAAS,KACzChB,KAAK4d,QAAQ,GAAG5I,QAAQ+c,gBAAgB,YAAalwB,EAAW+vB,aAGlE5xB,KAAKmW,KAAKpM,OAAOlI,EAAW5B,YApDhB,GAAA08F,cAAgB,QCCjB,MAAM,WAA4B,GAC/C,YAAY11F,EAAgBgB,EAAgBs+C,GAC1CtjD,MAAM,wBAAyB,CAAC8vB,aAAc,2BAA4BnV,QAAS,GAAIzH,MAAM,IAE7FlO,EAAOA,EAAKxE,QAEZ,MAAMma,EAA8C,CAClD,CAAC,iBAAkB,yBACnB,CAAC,qBAAsB,6BACvB,CAAC,kBAAmB,+BACpB,CAAC,wBAAyB,gCAC1B,CAAC,kBAAmB,2BAItBA,EAAQtX,QAAQiC,IACd,MAAMsS,EAAS,YAFC,8BAEiB,CAAqBqC,KAAM3U,EAAE,KAC9DvI,KAAKmW,KAAKpM,OAAO8Q,KAGnB,MAAM+hF,EAAwB,GAAmBC,4BAA4B,GAA2BF,eAExG,YAAiB38F,KAAKmW,KAAOlU,IAC3B,MAAM4S,EAAS,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAAQ,eACnC4nF,EAAS7+E,EAAQ,OAAA6mC,GAAA,GAAW5vC,IAAS,GAE3C+nF,EAAsB/7F,KAAK,KACzBb,KAAK2+B,OAEL,IAAI,GAA2B13B,EAAQgB,EAAMw0F,EAAQl2C,MAEtD,CAACx4C,eAAgB/N,KAAK+N,iBAEzB/N,KAAKmW,KAAKxT,MAAMm6F,OAAS,UACzB98F,KAAK+8F,UAAUp6F,MAAMq6F,UAAY,QAEjCh9F,KAAKye,QCvBM,MAAM,GAenB,YAAoB+uC,EACVphC,EACA49B,EACA4wB,EACAqiB,EACAC,EACA5U,GANU,KAAA96B,WACV,KAAAphC,OACA,KAAA49B,qBACA,KAAA4wB,kBACA,KAAAqiB,kBACA,KAAAC,iBACA,KAAA5U,wBA6TF,KAAA6U,qBAAuB,KAC1Bn9F,KAAKosB,KAAK+hB,UAAUC,YACrB,YAAmBpuC,KAAKosB,KAAK+hB,UAAUkf,qBAEvC,IAAI,GAAartD,KAAKiH,OAAQjH,KAAKosB,KAAK8/B,aAAalsD,KAAK6G,OAItD,KAAAu2F,aAAe,KACrBp9F,KAAKosB,KAAKrqB,MAAMqrF,iBAAiBptF,KAAK6G,MAGhC,KAAAw2F,YAAc,KACpBr9F,KAAKosB,KAAKrqB,MAAMu7F,mBAAmBt9F,KAAK6G,MAGlC,KAAA02F,YAAc,KACpB,GAAGjB,KAAoB,CAUrBlpE,IATapzB,KAAKosB,KAAK+hB,UAAUC,YAC/B,IAAIpuC,KAAKosB,KAAK+hB,UAAUiZ,aAAap3C,IAAIhQ,KAAKiH,SAASoB,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAC1E,CAACvI,KAAK6G,MAESs8B,OAAO,CAACC,EAAKv8B,KAC5B,MAAMzC,EAAUpE,KAAKosB,KAAKg4B,WAAWv9C,GACrC,OAAOu8B,IAAOh/B,aAAO,EAAPA,EAASA,SAAUA,EAAQA,QAAU,KAAO,KACzD,IAAIkH,aAIPpL,SAASyzB,YAAY,SAKjB,KAAA6pE,sBAAwB,KAC9BpqE,GAAqBpzB,KAAK6U,OAA6B88C,OAGjD,KAAA8rC,gBAAkB,KACxB,IAAIC,EACkB,eAAnB19F,KAAKosB,KAAKjpB,OACXu6F,EAAgB19F,KAAKgqD,mBAAmBxwC,iBAAiBxZ,KAAKiH,OAAQjH,KAAKosB,KAAKthB,WAGlF,MAAM+qB,EAAW71B,KAAK46E,gBAAgBlvC,gBAAgBgyD,EAAgBA,EAAc9xF,OAAS5L,KAAKiH,QAC5FqpF,EAAQtwF,KAAKsoF,sBAAsB/F,mBAAmBviF,KAAK6G,KACjE,IACI0H,EADAmG,EAAM,gBAEPmhB,GACDnhB,GAAOmhB,EAAW,KAAO6nE,EAAgB19F,KAAKsoF,sBAAsB/F,mBAAmBmb,EAAcjkB,SAASkkB,cAAgBrN,GAC3HoN,IAAehpF,GAAO,YAAc47E,GACvC/hF,EAAM,eAENmG,GAAO,KAAO1U,KAAKiH,OAAOivB,WAAa,IAAMo6D,EAC1CoN,IAAehpF,GAAO,WAAa1U,KAAKsoF,sBAAsB/F,mBAAmBmb,EAAc72F,MAClG0H,EAAM,yBAGRgmB,GAAM,UAAKvb,OAAOzK,GAAK,IAEvB6kB,GAAoB1e,IAGd,KAAAkpF,WAAa,KACnB,IAAI,GAAgB59F,KAAKiH,OAAQjH,KAAK6G,MAGhC,KAAAg3F,aAAe,KACrB,IAAI,GAAgB79F,KAAKiH,OAAQjH,KAAK6G,KAAK,IAGrC,KAAAi3F,cAAgB,KACtB99F,KAAKi9F,gBAAgBtmD,SAAS32C,KAAKoE,QAAS,KAGtC,KAAA25F,WAAa,KACnB/9F,KAAKi9F,gBAAgBe,SAASh+F,KAAKoE,UAG7B,KAAAspD,eAAiB,KACvB,GAAG1tD,KAAKosB,KAAK+hB,UAAUC,YACrB,YAAmBpuC,KAAKosB,KAAK+hB,UAAUgd,yBAClC,CACL,MAAMljD,EAAOjI,KAAKi+F,qBAAuB,CAACj+F,KAAK6G,KAAO7G,KAAKosB,KAAK8/B,aAAalsD,KAAK6G,KAClF,IAAI,GAAa,CACf,CAAC7G,KAAKiH,QAASgB,MAKb,KAAA0lD,cAAgB,KACtB3tD,KAAKosB,KAAK+hB,UAAUE,gBAAgB,OAAAzvB,GAAA,GAAgB5e,KAAK6U,OAAQ,iBAAmB,OAAA+J,GAAA,GAAgB5e,KAAK6U,OAAQ,YAG3G,KAAA+4C,sBAAwB,KAC9B5tD,KAAKosB,KAAK+hB,UAAU4Y,mBAGd,KAAA8G,cAAgB,KACnB7tD,KAAKosB,KAAK+hB,UAAUC,YACrB,YAAmBpuC,KAAKosB,KAAK+hB,UAAUid,oBAEvC,IAAI,GAAoBprD,KAAKiH,OAAQjH,KAAKi+F,qBAAuB,CAACj+F,KAAK6G,KAAO7G,KAAKosB,KAAK8/B,aAAalsD,KAAK6G,KAAM7G,KAAKosB,KAAKjpB,OAja5H,MAAM2qD,EAAiB7rD,IAMrB,IAAI8pD,EAAqB8oC,EALtB70F,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAKd,IACE2mF,EAAiB,OAAAj2E,GAAA,GAAgB3c,EAAE4S,OAAQ,0BAC3Ck3C,EAAS8oC,EAAiBA,EAAe/jF,cAAgB,OAAA8N,GAAA,GAAgB3c,EAAE4S,OAAQ,UACnF,MAAM5S,IAGR,IAAI8pD,GAAUA,EAAO3rD,UAAUuR,SAAS,gBAAiB,OAGzD,IADG1P,aAAa6jB,YAAc7jB,EAAEyoE,eAAe,oBAAoBzoE,EAAU8Y,iBAC1E/a,KAAKgV,QAAQ5U,UAAUuR,SAAS,UACjC,OAAO,GAEN1P,aAAa6jB,YAAc7jB,EAAEyoE,eAAe,mBAAkBzoE,EAAU8rD,cAAe,GAE1F,IAAIlnD,GAAOklD,EAAO3/C,QAAQvF,IAC1B,IAAIA,EAAK,OAcT,GAZA7G,KAAKk+F,aAAel+F,KAAKosB,KAAK+hB,UAAU6d,gBAAgBD,GACxD/rD,KAAKiH,OAASjH,KAAKosB,KAAKnlB,OAExBjH,KAAK6U,OAAS5S,EAAE4S,OAChB7U,KAAKm+F,gBAAkB7B,KACvBt8F,KAAKo+F,eAAyC,MAAxBp+F,KAAK6U,OAAO+1B,UACc,WAA7C5qC,KAAK6U,OAA6BA,QACnC7U,KAAK6U,OAAOzU,UAAUuR,SAAS,eAEjC3R,KAAKq+F,iBAA2C,MAAxBr+F,KAAK6U,OAAO+1B,SAAmB5qC,KAAK6U,OAAOzU,UAAUuR,SAAS,WAGnFya,EAAK+hB,UAAUC,cAAgBymD,EAAgB,CAChD,MAAM5sF,EAAOjI,KAAKosB,KAAK8/B,aAAarlD,GACpC,GAAGoB,EAAK9F,OAAS,EAAG,CAClB,MAAMm8F,EAAct+F,KAAKosB,KAAK+hB,UAAU4a,cAAc/oD,KAAKiH,OAAQJ,GACjEA,EACAoB,EAAKwI,KAAK5J,GAAO7G,KAAKosB,KAAK+hB,UAAU4a,cAAc/oD,KAAKiH,OAAQJ,IAC/Dy3F,IACDz3F,EAAMy3F,IAKZ,MAAMC,EAAc,OAAA3/E,GAAA,GAAgB5e,KAAK6U,OAAQ,gBACjD7U,KAAKi+F,uBAAyBM,EAE5Bv+F,KAAK6G,IADJ03F,GACWA,EAAYnyF,QAAQvF,IAErBA,EAGb7G,KAAK8oD,WAAa9oD,KAAKosB,KAAK+hB,UAAU4a,cAAc/oD,KAAKiH,OAAQjH,KAAK6G,KACtE7G,KAAKoE,QAAUpE,KAAKosB,KAAKg4B,WAAWpkD,KAAK6G,KAEzC7G,KAAK4d,QAAQtX,QAAQuU,IACnB,IAAIsH,EAGDiK,EAAK+hB,UAAUC,cAAgBvzB,EAAOmzC,cACvC7rC,GAAO,GAEA0yE,GAAkB,sBAAzB1yE,EACEtH,EAAO9F,UAIX8F,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAAS6V,KAG3C,MAAMs4E,EAAyB1uC,EAAO3rD,UAAUuR,SAAS,SAAW,OAAS,QAG7E,aAAc1P,EAAiB+Y,QAAW/Y,EAAiB+Y,QAAQ,GAAK/Y,EAAiBjC,KAAKgV,QAASylF,GACvG,aAAYz6F,KAAKgV,QAAS,KACxBhV,KAAK6G,IAAM,EACX7G,KAAKiH,YAASvC,EACd1E,KAAK6U,OAAS,QAIf,sBACD,YAAiB24C,EAAWvrD,IAC1B,GAAGmqB,EAAK+hB,UAAUC,YAChB,OAGF,MAAM5kC,EAAavH,EAAE4S,OAAuBrL,UAC5C,IAAIA,IAAcA,EAAUuwB,SAAU,OAEtC3N,EAAKkiC,IAAI,WAAYrsD,GAER,CAAC,SAAU,yBAA0B,iBAAkB,UAAW,OAAQ,SAASwO,KAAKuiB,GAAKxpB,EAAUoJ,MAAM,IAAIy/C,OAAOr/B,EAAI,eAEvI,OAAAtV,EAAA,GAAYzb,GAGZ6rD,EAAc7rD,KAEf,CAAC8L,eAAgB/N,KAAKosB,KAAKC,QAAQte,iBACjC,aAA0By/C,EAAUM,EAAe9tD,KAAKosB,KAAKC,QAAQte,gBAGtE,OACN/N,KAAK4d,QAAU,CAAC,CACdvQ,KAAM,QACN6P,KAAM,sBACNC,QAASnd,KAAKm9F,qBACdpoF,OAAQ,IAAyB,cAAnB/U,KAAKosB,KAAKjpB,OAAyBnD,KAAKoE,QAAQkT,OAAOoQ,aACpE,CACDra,KAAM,QACN6P,KAAM,oCACNC,QAASnd,KAAKm9F,qBACdpoF,OAAQ,IAAyB,cAAnB/U,KAAKosB,KAAKjpB,MAAwBnD,KAAK8oD,aAAe9oD,KAAKosB,KAAK+hB,UAAUkf,oBAAoBmxC,aAAa,YACzHC,UAAW,KAAM,EACjBzwC,eAAe,GACd,CACD3gD,KAAM,WACN6P,KAAM,0BACNC,QAAS,KACPnd,KAAKosB,KAAKrqB,MAAM28F,gBAAgB,KAC9B1+F,KAAKgqD,mBAAmB20C,YAAY3+F,KAAKoE,QAASpE,KAAKoE,QAAQA,QAAS,CACtEw6F,aAAc5+F,KAAKosB,KAAKrqB,MAAM68F,aAC9B3oD,SAAUj2C,KAAKoE,QAAQ6xC,WAGzBj2C,KAAKosB,KAAKrqB,MAAM4G,eAAc,GAAO,IACpC,IAAI8rC,KAAyB,IAApBz0C,KAAKoE,QAAQ+jB,QAE3BpT,OAAQ,IAAyB,cAAnB/U,KAAKosB,KAAKjpB,MACvB,CACDkK,KAAM,QACN6P,KAAM,QACNC,QAASnd,KAAKo9F,aACdroF,OAAQ,IAAM/U,KAAKgqD,mBAAmBm8B,cAAcnmF,KAAKiH,OAAQjH,KAAKosB,KAAKthB,YACxE9K,KAAKoE,QAAQkT,OAAOoQ,eACnB1nB,KAAKosB,KAAKrqB,MAAMmlF,cACC,cAAnBlnF,KAAKosB,KAAKjpB,MAEX,CACDkK,KAAM,OACN6P,KAAM,OACNC,QAASnd,KAAKq9F,YACdtoF,OAAQ,IAAM/U,KAAKgqD,mBAAmB60C,eAAe7+F,KAAKoE,QAAS,WAAapE,KAAKosB,KAAKrqB,MAAMmlF,cAC/F,CACD75E,KAAM,OACN6P,KAAM,OACNC,QAASnd,KAAKu9F,YACdxoF,OAAQ,OAAQ/U,KAAKoE,QAAQA,SAAYpE,KAAKm+F,gBAAoBn+F,KAAKo+F,gBAAkBp+F,KAAKoE,QAAQA,UAAYpE,KAAK6U,OAAO0U,YAC7H,CACDlc,KAAM,OACN6P,KAAM,wBACNC,QAASnd,KAAKu9F,YACdxoF,OAAQ,MAAQ/U,KAAKoE,QAAQA,SAAWpE,KAAKm+F,gBAC5C,CACD9wF,KAAM,OACN6P,KAAM,iCACNC,QAASnd,KAAKu9F,YACdxoF,OAAQ,KACN,IAAI/U,KAAK8oD,WACP,OAAO,EAGT,IAAI,MAAO7hD,EAAQgB,KAASjI,KAAKosB,KAAK+hB,UAAUiZ,aAC9C,IAAI,MAAMvgD,KAAOoB,EACf,GAAKjI,KAAKgqD,mBAAmBxwC,iBAAiBvS,EAAQJ,GAAKzC,QACzD,OAAO,EAKb,OAAO,GAETq6F,UAAW,KAAM,EACjBzwC,eAAe,GACd,CACD3gD,KAAM,OACN6P,KAAM,WACNC,QAASnd,KAAKw9F,sBACdzoF,OAAQ,IAAM/U,KAAKo+F,eACnBpwC,eAAe,GACd,CACD3gD,KAAM,OACN6P,KAAM,6BACNC,QAAS,KACPiW,GAAoBpzB,KAAK6U,OAAO5Q,YAElC8Q,OAAQ,IAAM/U,KAAKq+F,iBACnBrwC,eAAe,GACd,CACD3gD,KAAM,OACN6P,KAAM,4BACNC,QAAS,KACPiW,GAAoBpzB,KAAK6U,OAAO5Q,YAElC8Q,OAAQ,IAAM/U,KAAK6U,OAAOzU,UAAUuR,SAAS,kBAC7Cq8C,eAAe,GACd,CACD3gD,KAAM,OACN6P,KAAM,kCACNC,QAASnd,KAAKy9F,gBACd1oF,OAAQ,IAAM/U,KAAK46E,gBAAgBn5C,UAAUzhC,KAAKiH,UAAYjH,KAAKoE,QAAQkT,OAAOoQ,aACjF,CACDra,KAAM,MACN6P,KAAM,sBACNC,QAASnd,KAAK49F,WACd7oF,OAAQ,KAAO/U,KAAKoE,QAAQkT,OAAOoQ,aACd,mBAAnB1nB,KAAKoE,QAAQgD,IACZpH,KAAKoE,QAAQkT,OAAOwiE,QACrB95E,KAAK46E,gBAAgBkhB,cAAc97F,KAAKiH,SACrB,cAAnBjH,KAAKosB,KAAKjpB,MACX,CACDkK,KAAM,QACN6P,KAAM,wBACNC,QAASnd,KAAK69F,aACd9oF,OAAQ,IAAM/U,KAAKoE,QAAQkT,OAAOwiE,QAAU95E,KAAK46E,gBAAgBkhB,cAAc97F,KAAKiH,SACnF,CACDoG,KAAM,WACN6P,KAAM,+BACNC,QAAS,KACPnd,KAAKk9F,eAAez8C,YAAYzgD,KAAKoE,QAAQ0O,MAAM5S,WAErD6U,OAAQ,K,MACN,GAAG/U,KAAKoE,QAAQkT,OAAOoQ,YACrB,OAAO,EAGT,MAAMzT,EAAoC,QAAlB,EAAAjU,KAAKoE,QAAQ0O,aAAK,eAAE5S,SAC5C,IAAI+T,EAAK,OAAO,EAEhB,IAAI6qF,IAAc,sBAClB,MAAMC,GAAc9qF,EAAI9Q,OAAU,CAAC,MAAO,QAAS,WAAoC42B,SAAS9lB,EAAI9Q,MAEpG,OADG47F,IAAYD,EAAYA,KAAe,OAAAlgF,GAAA,GAAgB5e,KAAK6U,OAAQ,eAAiB,OAAA+J,GAAA,GAAgB5e,KAAK6U,OAAQ,UAC9GkqF,GAAcD,IAEtB,CACDzxF,KAAM,eACN6P,KAAM,mBACNC,QAASnd,KAAK89F,cACd/oF,OAAQ,K,MACN,MAAMi7B,EAAyB,QAAlB,EAAAhwC,KAAKoE,QAAQ0O,aAAK,eAAEk9B,KACjC,OAAOA,GAAQA,EAAKiC,cAAc9vC,SAAW6tC,EAAK14B,OAAOy6B,SAAW/B,EAAK14B,OAAO44B,OAGjF,CACD7iC,KAAM,OACN6P,KAAM,iBACNC,QAASnd,KAAK+9F,WACdhpF,OAAQ,K,MACN,MAAMi7B,EAAyB,QAAlB,EAAAhwC,KAAKoE,QAAQ0O,aAAK,eAAEk9B,KACjC,OAAOhwC,KAAKgqD,mBAAmB60C,eAAe7+F,KAAKoE,QAAS,SAAW4rC,IAASA,EAAK14B,OAAOy6B,SAAW/xC,KAAKoE,QAAQkT,OAAOoQ,cAG5H,CACDra,KAAM,UACN6P,KAAM,UACNC,QAASnd,KAAK0tD,eACd34C,OAAQ,IAAyB,cAAnB/U,KAAKosB,KAAKjpB,OAAyBnD,KAAKoE,QAAQkT,OAAOoQ,aAAkC,mBAAnB1nB,KAAKoE,QAAQgD,GAChG,CACDiG,KAAM,UACN6P,KAAM,oCACNC,QAASnd,KAAK0tD,eACd34C,OAAQ,IAAM/U,KAAKosB,KAAK+hB,UAAUgd,qBAChCnrD,KAAK8oD,aACJ9oD,KAAKosB,KAAK+hB,UAAUgd,oBAAoBqzC,aAAa,YACxDC,UAAW,KAAM,EACjBzwC,eAAe,GACd,CACD3gD,KAAM,OACN6P,KAAM,aACNC,QAAS,KACP,IAAI,GAAoBnd,KAAKiH,OAAQ,CAACjH,KAAK6G,OAE7CkO,OAAQ,KAAO/U,KAAKoE,QAAQkT,OAAO+L,KAA0B,YAAnBrjB,KAAKoE,QAAQgD,IAAoBpH,KAAKoE,QAAQkT,OAAOoQ,aAAe1nB,KAAK46E,gBAAgBn5C,UAAUzhC,KAAKiH,QAClJw3F,UAAW,KAAM,EACjBzwC,eAAe,GACd,CACD3gD,KAAM,SACN6P,KAAM,yBACNC,QAASnd,KAAK2tD,cACd54C,OAAQ,KAAO/U,KAAKoE,QAAQG,SAAWvE,KAAK8oD,YAAc9oD,KAAKk+F,aAC/DO,UAAW,KAAM,EACjBzwC,eAAe,GACd,CACD3gD,KAAM,SACN6P,KAAM,kCACNC,QAASnd,KAAK4tD,sBACd74C,OAAQ,IAAM/U,KAAK8oD,WACnB21C,UAAW,KAAM,EACjBzwC,eAAe,GACd,CACD3gD,KAAM,gBACN6P,KAAM,SACNC,QAASnd,KAAK6tD,cACd94C,OAAQ,IAAM/U,KAAKgqD,mBAAmBE,iBAAiBlqD,KAAKoE,UAC3D,CACDiJ,KAAM,gBACN6P,KAAM,mCACNC,QAASnd,KAAK6tD,cACd94C,OAAQ,IAAM/U,KAAK8oD,aAAe9oD,KAAKosB,KAAK+hB,UAAUid,mBAAmBozC,aAAa,YACtFC,UAAW,KAAM,EACjBzwC,eAAe,IAGjBhuD,KAAKgV,QAAU,GAAWhV,KAAK4d,QAAS5d,KAAKosB,KAAKC,QAAQte,gBAC1D/N,KAAKgV,QAAQ7F,GAAK,qBAClBnP,KAAKgV,QAAQ5U,UAAUC,IAAI,eAC3BL,KAAKosB,KAAKnsB,UAAU8J,OAAO/J,KAAKgV,U,mCChWrB,MAAM,GAKnB,YAAYhS,GAQVhD,KAAKg/F,gBAAkB,CAAC,CACtB3xF,KAAM,OACN6P,KAAM,yBACNC,QAASna,EAAQi8F,cACjBlqF,OAAQ,IAAoB,aAAd/U,KAAKmD,MAClB,CACDkK,KAAM,WACN6P,KAAM,6BACNC,QAASna,EAAQk8F,gBACjBnqF,OAAQ,IAAoB,aAAd/U,KAAKmD,MAClB,CACDkK,KAAM,WACN6P,KAAM,wBACNC,QAASna,EAAQk8F,gBACjBnqF,OAAQ,IAAoB,aAAd/U,KAAKmD,OAGrBnD,KAAKm/F,SAAW,GAAWn/F,KAAKg/F,gBAAiBh8F,EAAQ+K,gBACzD/N,KAAKm/F,SAAS/+F,UAAUC,IAAI,YAAa2C,EAAQo8F,UAEjD,aAA0Bp8F,EAAQq8F,iBAAmBp9F,IAChDe,EAAQiN,SAAWjN,EAAQiN,WAI9BjQ,KAAKg/F,gBAAgB14F,QAAQuU,IAC3BA,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAASuO,EAAO9F,YAGlD,OAAA2I,EAAA,GAAYzb,GACZ,aAAYjC,KAAKm/F,YAChBn8F,EAAQ+K,gBAGN,UAAU9G,GACfjH,KAAKmD,KAAO8D,IAAW2B,EAAA,QAAU6O,KAAO,WAAa,Y,sBClC1C,MAAM,WAAwB,KAc3C,YAAoB2U,GAkBlB,GAjBAnpB,MAAM,oCAAqC,KAAM,CAACu7B,UAAU,EAAMixC,YAAa,SAAUt5D,MAAM,IAD7E,KAAAiW,OAVZ,KAAAyP,OAAS,EAmKT,KAAAyjE,cAAgB,KACtBt/F,KAAKu/F,QA2GP,KAAAxyF,QAAW9K,IACT,MAAM4S,EAAS5S,EAAE4S,OAEX2qF,EAAa,OAAA/+D,GAAA,GAAU5rB,EAAQ,SAC/B4qF,EAAU,OAAAC,GAAA,GAAa7qF,GACzB4qF,IACF5qF,EAAO/D,cAAc1Q,UAAUC,IAAI,aACnCm/F,EAAWp/F,UAAUuB,OAAO,iBAC5B69F,EAAW9+E,kBAAkB8iB,gBAAgB,cAG/Bg8D,EAAWjoE,qBACbkoE,GAAWz/F,KAAK2/F,UAAU11F,kBAAoB,IAC1DjK,KAAK4/F,kBAGP5/F,KAAK8xB,gBAGP,KAAA+7B,cAAiB5rD,IACf,MAAM4S,EAAS5S,EAAE4S,OACXrD,EAAQ,OAAAivB,GAAA,GAAU5rB,EAAQ,SAC1BxQ,EAAM,OAAAogD,GAAA,GAAWjzC,GAEpBxR,KAAK6/F,gBAAkB7/F,KAAK6/F,eAAe,GAAG,KAAOx7F,IACtDrE,KAAK6/F,oBAAiBn7F,GAGxB8M,EAAM7P,SACN3B,KAAK8/F,kBAAkBr7F,OAAOJ,EAAK,GAEnCrE,KAAK8/F,kBAAkBx5F,QAAQ,CAACzE,EAAYwC,KAC1CxC,EAAWmB,QAAQ+8F,aAAa59F,OAAS,EACzCN,EAAWmB,QAAQ+8F,aAAap6F,KAAKtB,EAAM,GACvB,UAAK27F,QAAQhwF,IAAInO,EAAW2P,MAAMkP,mBAC1CqgB,WAGd/gC,KAAK8xB,gBAxSL,gBAAM9xB,KAAK4N,MAAO,WAElB5N,KAAKigG,mBAAqB,IAAI,IAAW,CACvCrzF,YAAa,eACb4E,MAAO,eACPlI,KAAM,WACNmI,UA3BsB,MA8BxBzR,KAAK+N,eAAe1N,IAAIL,KAAKigG,mBAAmBl+F,MAAhD/B,CAAuD,QAAS,KAC9DA,KAAK8xB,iBAGP9xB,KAAK8/F,kBAAoB,GAEH,cAAnB9/F,KAAKosB,KAAKjpB,KAAsB,CACjC,MAAMg8F,EAAW,IAAI,GAAgB,CACnCF,cAAe,KACbj/F,KAAKosB,KAAKrqB,MAAMm+F,YAAa,EAC7BlgG,KAAKu/F,QAEPL,gBAAiB,KACfl/F,KAAKosB,KAAKrqB,MAAM28F,gBAAgB,KAC9B1+F,KAAKu/F,UAGTH,SAAU,cACVC,iBAAkBr/F,KAAK0vE,aAGzByvB,EAASgB,UAAUngG,KAAKosB,KAAKnlB,QAE7BjH,KAAKyN,OAAO1D,OAAOo1F,EAASA,UAG9Bn/F,KAAKyN,OAAO1D,OAAO/J,KAAKigG,mBAAmBhgG,WAE3C,MAAMswC,EAAKrwC,SAASC,cAAc,MAC5BogB,EAAIrgB,SAASC,cAAc,OACjCogB,EAAEngB,UAAUC,IAAI,WAChB,gBAAMkgB,EAAG,eAETvgB,KAAK2/F,UAAYz/F,SAASC,cAAc,QACxCH,KAAK2/F,UAAUv/F,UAAUC,IAAI,yBAE7B,MAAM+/F,EAAKlgG,SAASC,cAAc,OAClCigG,EAAGhgG,UAAUC,IAAI,wBAEjB,MAAMggG,EAAkBngG,SAASC,cAAc,OAC/CkgG,EAAgBjgG,UAAUC,IAAI,WAC9B,gBAAMggG,EAAiB,YAEnBrgG,KAAKosB,KAAKwuD,gBAAgBpjD,YAAYx3B,KAAKosB,KAAKnlB,UAClDjH,KAAKsgG,uBAAyB,IAAI,KAAc,CAC9CpjF,KAAM,oBACN5T,KAAM,cAERtJ,KAAKsgG,uBAAuBv+F,MAAM4b,SAAU,EAC5CyiF,EAAGr2F,OAAO/J,KAAKsgG,uBAAuB9uF,QAGxCxR,KAAKugG,sBAAwB,IAAI,KAAc,CAC7CrjF,KAAM,yBACN5T,KAAM,aAERtJ,KAAKwgG,kBAAoB,IAAI,KAAc,CACzCtjF,KAAM,eACN5T,KAAM,SAGRtJ,KAAK+N,eAAe1N,IAAIL,KAAKugG,sBAAsBx+F,MAAnD/B,CAA0D,SAAU,KAClE,MAAM2d,EAAU3d,KAAKugG,sBAAsBx+F,MAAM4b,QACjD3d,KAAKwgG,kBAAkBz+F,MAAMgwB,gBAAgB,WAAYpU,KAG3D3d,KAAK+N,eAAe1N,IAAIL,KAAKwgG,kBAAkBz+F,MAA/C/B,CAAsD,SAAU,KAC9D,MAAM2d,EAAU3d,KAAKwgG,kBAAkBz+F,MAAM4b,QAE5CxV,MAAMC,KAAKpI,KAAK2/F,UAAUv6E,UAA4B3c,IAAIsH,IACzDA,EAAG3P,UAAUkM,OAAO,cAAeqR,KAGjCA,IACF3d,KAAK6/F,oBAAiBn7F,EACtB1E,KAAKygG,kBAAkB/8F,iBAAiB,KAG1Cg9F,EAAap6F,QAAQyJ,GAAMA,EAAG3P,UAAUkM,OAAO,QAASqR,IAExD3d,KAAKugG,sBAAsBx+F,MAAMgwB,gBAAgB,WAAYpU,GAC7D3d,KAAK8xB,iBAGPsuE,EAAGr2F,OAAO/J,KAAKugG,sBAAsB/uF,MAAOxR,KAAKwgG,kBAAkBhvF,OAEnE,MAAMkvF,EAA8B,GAE9BC,EAAsBzgG,SAASC,cAAc,OACnDwgG,EAAoBvgG,UAAUC,IAAI,WAClC,gBAAMsgG,EAAqB,2BAE3B,MAAMC,EAAS1gG,SAASC,cAAc,MAEhC0gG,EAAwB3gG,SAASC,cAAc,OACrD0gG,EAAsBzgG,UAAUC,IAAI,yBAEpCL,KAAKygG,kBAAoB,IAAI,IAAW,CACtC7zF,YAAa,kCACb4E,MAAO,kCACPlI,KAAM,WACNmI,UAjIsB,MAoIxBzR,KAAK+N,eAAe1N,IAAIL,KAAKigG,mBAAmBl+F,MAAhD/B,CAAuD,QAAS,KAC9DA,KAAK8xB,iBAGP,MAAMgvE,EAAuB5gG,SAASC,cAAc,OACpD2gG,EAAqB1gG,UAAUC,IAAI,YACnC,gBAAMygG,EAAsB,wBAE5BD,EAAsB92F,OAAO/J,KAAKygG,kBAAkBxgG,UAAW6gG,GAE/DJ,EAAa/6F,KAAKi7F,EAAQD,EAAqBE,GAC/CH,EAAap6F,QAAQyJ,GAAMA,EAAG3P,UAAUC,IAAI,SAE5CL,KAAKmW,KAAKrF,cAAciQ,aAAawvB,EAAIvwC,KAAKmW,MAC9CnW,KAAKmW,KAAKpM,OAAOwW,EAAGvgB,KAAK2/F,UAAWz/F,SAASC,cAAc,MAAOkgG,EAAiBD,KAAOM,GAE1F,YAAiB1gG,KAAK0vE,WAAY1vE,KAAKs/F,cAAe,CAACvxF,eAAgB/N,KAAK+N,iBAE5E/N,KAAK+K,WAAa,IAAI,IAAW/K,KAAKmW,MACtCnW,KAAK4/F,kBAEL5/F,KAAK+gG,SAAW,KACN/gG,KAAKghG,mBAAmB7+F,OAGlCnC,KAAK8xB,eAGC,mBAMN,OALgB3pB,MAAMC,KAAKpI,KAAK2/F,UAAUv6E,UAAU3c,IAAI,CAACsH,EAAI1L,KAC3D,MAAMtC,EAAQgO,EAAGF,cAAc,sBAC/B,OAAO9N,aAAiBk/F,iBAAmBl/F,EAAMG,MAAQ,OAAAg/F,GAAA,GAAan/F,GAAO,GAAOG,QACnF0F,OAAO23B,KAAOA,EAAEj0B,QASb,W,MACN,MAAM61F,EAAWnhG,KAAKigG,mBAAmB/9F,MACzC,IAAIi/F,EACF,OAAO,EAGT,GAAGA,EAASh/F,OArLY,IAsLtB,OAAO,EAGT,GAAGnC,KAAKwgG,kBAAkBz+F,MAAM4b,WAA+B,QAAnB,EAAA3d,KAAK6/F,sBAAc,eAAE19F,QAC/D,OAAO,EAGT,MAAMsuC,EAAUzwC,KAAKghG,mBACrB,GAAGvwD,EAAQtuC,OAAS,EAClB,OAAO,EAIT,GADsBsuC,EAAQhgC,KAAKnI,GAAKA,EAAEnG,OAjMpB,KAmMpB,OAAO,EAGT,MAAOD,MAAOk/F,GAAgB,OAAAF,GAAA,GAAalhG,KAAKygG,kBAAkB1+F,OAAO,GACzE,QAAGq/F,EAAaj/F,OAtMQ,KA6MlB,eACN,MAAM89D,EAAQjgE,KAAK8vE,WACnB9vE,KAAK0vE,WAAW39C,gBAAgB,YAAakuC,GAGxC,KAAKohC,GAAQ,GAClB,MAAMF,EAAWnhG,KAAKigG,mBAAmB/9F,MAEnCuuC,EAAUzwC,KAAKghG,oBAEd9+F,MAAOk/F,EAAcnrD,SAAUqrD,GAAwB,OAAAJ,GAAA,GAAalhG,KAAKygG,kBAAkB1+F,OAElG,GAAsB,cAAnB/B,KAAKosB,KAAKjpB,OAAyBk+F,EAKpC,YAJArhG,KAAKosB,KAAKrqB,MAAM28F,gBAAgB,KAC9B1+F,KAAKu/F,MAAK,KAMdv/F,KAAK2+B,OAKL,MAAMrnB,EAAyB,GAE5BtX,KAAKsgG,yBAA2BtgG,KAAKsgG,uBAAuBv+F,MAAM4b,UACnErG,EAAOg8B,eAAgB,GAGtBtzC,KAAKugG,sBAAsBx+F,MAAM4b,UAClCrG,EAAOi8B,iBAAkB,GAGxBvzC,KAAKwgG,kBAAkBz+F,MAAM4b,UAC9BrG,EAAO44B,MAAO,GAGhB,MAAMF,EAAa,CACjB5oC,EAAG,OACHkQ,SACA6pF,WACA1wD,QAASA,EAAQhoC,IAAI,CAACvG,EAAOmC,KACpB,CACL+C,EAAG,aACH8V,KAAMhb,EACN6uC,OAAQ,IAAI9sB,WAAW,CAAC5f,OAG5B8K,QAAIzK,GAIA68F,EAAiBvhG,KAAKosB,KAAK6wE,gBAAgBuE,kBAAkBxxD,EAAMhwC,KAAK6/F,eAAgBuB,EAAcE,GAI5GthG,KAAKosB,KAAK49B,mBAAmB+5B,UAAU/jF,KAAKosB,KAAKnlB,OAAQs6F,EAAgB,CACvEz2F,SAAU9K,KAAKosB,KAAKthB,SACpB22F,aAAczhG,KAAKosB,KAAKrqB,MAAM0/F,aAC9B7C,aAAc5+F,KAAKosB,KAAKrqB,MAAM68F,aAC9B5C,OAAQh8F,KAAKosB,KAAKrqB,MAAMm+F,aAGQ,UAA/BlgG,KAAKosB,KAAKrqB,MAAM2/F,YACjB1hG,KAAKosB,KAAKrqB,MAAM4/F,cAGlB3hG,KAAKosB,KAAKrqB,MAAM4G,eAAc,GAAO,GA4C/B,kBACN,MAAMkzB,EAAS77B,KAAK67B,SACdx3B,EAAMrE,KAAK2/F,UAAU11F,kBAAoB,EACzC23F,EAAgB,IAAI,IAAW,CACnCh1F,YAAa,2BACb4E,MAAO,sBACPuuF,aAAc,CAAC17F,GACfiF,KAAM,YAAcuyB,EACpBpqB,UAvUoB,MAyUtBzR,KAAK+N,eAAe1N,IAAIuhG,EAAc7/F,MAAtC/B,CAA6C,QAASA,KAAK+M,SAE3D,MAAMylB,EAAa,IAAI,GAAW,CAChCtV,KAAM,GACN5T,KAAM,aAERkpB,EAAW2B,KAAKpqB,OAAO63F,EAAc3hG,WACrC,YAAiB2hG,EAAc7/F,MAAO2b,EAAA,EAAa,CAAC3P,eAAgB/N,KAAK+N,iBACzEykB,EAAWhhB,MAAMpR,UAAUC,IAAI,iBAC/BmyB,EAAWzwB,MAAM6P,UAAW,EACxB5R,KAAKwgG,kBAAkBz+F,MAAM4b,SAC/B6U,EAAWhhB,MAAMpR,UAAUuB,OAAO,eAEpC3B,KAAK+N,eAAe1N,IAAImyB,EAAWzwB,MAAnC/B,CAA0C,SAAU,KAElD,GADgBwyB,EAAWzwB,MAAM4b,QACrB,CACV,MAAMtZ,EAAM,OAAAogD,GAAA,GAAWjyB,EAAWhhB,OAClCxR,KAAK6/F,eAAiB,CAAC,IAAI57E,WAAW,CAAC5f,KACvCrE,KAAK8xB,kBAIT,MAAMg0D,EAAY5lF,SAASC,cAAc,QACzC2lF,EAAU1lF,UAAUC,IAAI,WAAY,eACpCuhG,EAAc3hG,UAAU8J,OAAO+7E,GAE/B,YAAiBA,EAAW9lF,KAAK6tD,cAAe,CAAC9/C,eAAgB/N,KAAK+N,eAAgB4J,MAAM,IAE5F3X,KAAK2/F,UAAU51F,OAAOyoB,EAAWhhB,OAEjCxR,KAAK+K,WAAWkzB,kBAAkBj+B,KAAK2/F,UAAUvuD,iBAAiC,UAGlFpxC,KAAK8/F,kBAAkBn6F,KAAKi8F,I,cC9XjB,SAASC,GAAe5gD,GACrC,MAAMxsC,EAAMwsC,EAAMxsC,IAElB,OAAOwvD,MAAMxvD,GACZ5T,KAAKqjE,GAAYA,EAAS49B,eAC1BjhG,KAAKihG,IACJ,MAAMvhF,EAAI,IAAI0D,WAAW69E,GAGzB,IAAIjuF,EAAW,EACf,IAAI,IAAI7I,EAAI,EAAG7I,EAASoe,EAAEpe,OAAQ6I,EAAI7I,IAAU6I,EAE9C,GAAW,IAARuV,EAAEvV,IACW,KAAZuV,EAAEvV,EAAI,IACM,GAAZuV,EAAEvV,EAAI,IACM,GAAZuV,EAAEvV,EAAI,GAAY,CAEpB,MAAM2uF,EAASp5E,EAAEvV,EAAI,IAAM,EAAiB,IAAXuV,EAAEvV,EAAI,GAIvC6I,GAAY8lF,EAAQ,EAAI,GAAKA,EAIjC,OAAO9lF,EAAW,MCetB,IAAIkuF,GAEG,SAASC,KACd,OAAOD,GAGM,MAAM,WAAsB,KAezC,YAAoB31E,EAAoB61E,EAAeC,GAWrD,GAVAj/F,MAAM,mCAAoC,KAAM,CAACu7B,UAAU,EAAMixC,YAAa,aAAc0yB,+BAA+B,EAAMhsF,MAAM,IADrH,KAAAiW,OAAoB,KAAA61E,QAuIhC,KAAAG,UAAangG,IACnB,MAAM4S,EAAS5S,EAAE4S,OACjB,GAAGA,IAAW7U,KAAK+B,MAAO,CACxB,GAAsB,UAAnB8S,EAAO+1B,SAAuB/1B,EAAO2pF,aAAa,mBACnD,OAGFx+F,KAAK+B,MAAM0J,QACX,OAAA42F,GAAA,GAAgBriG,KAAK+B,SAiNjB,KAAAugG,WAAcx/B,IACpB,MAAMy/B,EAAaviG,KAAKuiG,WAClBC,EAAiBxiG,KAAKwiG,eAAe1/B,EAAK3/D,MAE1Cu1C,EAAyB,GAC/BA,EAAOoqB,KAAOA,EAEd,MAAM2/B,EAAUviG,SAASC,cAAc,OACvCsiG,EAAQriG,UAAUC,IAAI,cAEtBq4C,EAAO+pD,QAAUA,EAEjB,MAAMt8F,EAAUq8F,EAAiBxiG,KAAK0iG,YAAY5/B,EAAMpqB,EAAQ+pD,GAAWziG,KAAK2iG,eAAe7/B,EAAMpqB,EAAQ+pD,GAE7G,OADAF,EAAWK,gBAAgBj9F,KAAK+yC,GACzBvyC,GA3WPnG,KAAKuiG,WAAa,CAChBp/F,KAAM++F,EACNU,gBAAiB,GACjBn2E,OAAO,GAGT,YAAiBzsB,KAAK0vE,WAAY,IAAM1vE,KAAKu/F,OAAQ,CAACxxF,eAAgB/N,KAAK+N,iBAErD,cAAnB/N,KAAKosB,KAAKjpB,KAAsB,CACjC,MAAMg8F,EAAW,IAAI,GAAgB,CACnCF,cAAe,KACbj/F,KAAKosB,KAAKrqB,MAAMm+F,YAAa,EAC7BlgG,KAAKu/F,QAEPL,gBAAiB,KACfl/F,KAAKosB,KAAKrqB,MAAM28F,gBAAgB,KAC9B1+F,KAAKu/F,UAGTH,SAAU,cACVC,iBAAkBr/F,KAAK0vE,WACvB3hE,eAAgB/N,KAAK+N,iBAGvBoxF,EAASgB,UAAUngG,KAAKosB,KAAKnlB,QAE7BjH,KAAKyN,OAAO1D,OAAOo1F,EAASA,UAG9Bn/F,KAAK6iG,eAAiB3iG,SAASC,cAAc,OAC7CH,KAAK6iG,eAAeziG,UAAUC,IAAI,eAClC,MAAM0K,EAAa,IAAI,IAAW,MAClCA,EAAW9K,UAAU8J,OAAO/J,KAAK6iG,gBAEjC7iG,KAAK6B,WAAa,IAAI,IAAW,CAC/B+K,YAAa,mCACb4E,MAAO,UACPlI,KAAM,gBACNmI,UAAW7I,EAAA,QAAUgiD,OAAOk4C,qBAE9B9iG,KAAK+B,MAAQ/B,KAAK6B,WAAWE,MAE7B/B,KAAK6B,WAAWK,MAAQlC,KAAK+iG,cAAgB/iG,KAAKosB,KAAKrqB,MAAMihG,kBAAkBjhG,MAAMkC,UACrFjE,KAAKosB,KAAKrqB,MAAMihG,kBAAkB9gG,MAAQ,GAE1ClC,KAAKmW,KAAKpM,OAAOgB,EAAW9K,WAC5BD,KAAKC,UAAU8J,OAAO/J,KAAK6B,WAAW5B,WAEtCD,KAAKijG,cAELjjG,KAAKgB,iBAAiB,QAAS,KAC7BhB,KAAKiiG,MAAQ,GACbF,QAAer9F,IAGjBq9F,GAAe/hG,KAGV,YAAYgV,GACjBhV,KAAKmW,KAAKpM,OAAOiL,GAGnB,WACE,OAAOhV,KAAKuiG,WAAWp/F,KAGzB,SAASA,GACPnD,KAAKuiG,WAAWp/F,KAAOA,EAGjB,2B,MACN,MAAMgf,EAAOniB,KAAKiiG,MAAM9/F,OAAS,EAC9BggB,IAASniB,KAAKkjG,oBACfljG,KAAKkjG,mBAAqB,IAAI,KAAc,CAC1ChmF,KAAM,2BACN5T,KAAM,gBAERtJ,KAAKC,UAAU8J,UAAU,CAAC/J,KAAKkjG,mBAAmB1xF,MAA8B,QAAvB,EAAAxR,KAAKmjG,0BAAkB,eAAE3xF,MAAOxR,KAAK6B,WAAW5B,WAAW2H,OAAOc,UAE3H1I,KAAKuiG,WAAW91E,OAAQ,EACxBzsB,KAAKkjG,mBAAmBx/F,iBAAiB1D,KAAKuiG,WAAW91E,OAEzDzsB,KAAK+N,eAAe1N,IAAIL,KAAKkjG,mBAAmBnhG,MAAhD/B,CAAuD,SAAU,KAC/D,MAAM2d,EAAU3d,KAAKkjG,mBAAmBvlF,QAExC3d,KAAKuiG,WAAW91E,MAAQ9O,EAExB3d,KAAKijG,iBAECjjG,KAAKkjG,oBACbljG,KAAKkjG,mBAAmB1xF,MAAMpR,UAAUkM,OAAO,QAAS6V,GAIpD,2B,MACN,MAAMA,IAASniB,KAAKiiG,MAAMxxF,KAAKqyD,GAAQ,EAA2Bn7D,IAAIm7D,EAAK3/D,OACxEgf,IAASniB,KAAKmjG,oBACfnjG,KAAKmjG,mBAAqB,IAAI,KAAc,CAC1CjmF,KAAM,6BACN5T,KAAM,mBAERtJ,KAAKC,UAAU8J,UAAU,CAAwB,QAAvB,EAAA/J,KAAKkjG,0BAAkB,eAAE1xF,MAAOxR,KAAKmjG,mBAAmB3xF,MAAOxR,KAAK6B,WAAW5B,WAAW2H,OAAOc,UAE3H1I,KAAKmjG,mBAAmBz/F,iBAA0C,UAAzB1D,KAAKuiG,WAAWp/F,MAEzDnD,KAAK+N,eAAe1N,IAAIL,KAAKmjG,mBAAmBphG,MAAhD/B,CAAuD,SAAU,KAC/D,MAAM2d,EAAU3d,KAAKmjG,mBAAmBxlF,QAExC3d,KAAKuiG,WAAWp/F,KAAOwa,EAAU,QAAU,WAE3C3d,KAAKijG,iBAECjjG,KAAKmjG,oBACbnjG,KAAKmjG,mBAAmB3xF,MAAMpR,UAAUkM,OAAO,QAAS6V,GAIrD,SAAS8/E,GACd,MAAMmB,EAASnB,EAAMr6F,OAAOk7D,IACZ9iE,KAAKiiG,MAAMxxF,KAAK4yF,GACrBA,EAAMC,eAAiBxgC,EAAKwgC,cAAgBD,EAAM/5F,OAASw5D,EAAKx5D,MAAQ+5F,EAAMvjG,OAASgjE,EAAKhjE,OAMpGsjG,EAAOjhG,SACRnC,KAAKiiG,MAAMt8F,QAAQy9F,GACnBpjG,KAAKijG,eAgBD,KAAK5B,GAAQ,GACnB,GAAsB,cAAnBrhG,KAAKosB,KAAKjpB,OAAyBk+F,EAKpC,YAJArhG,KAAKosB,KAAKrqB,MAAM28F,gBAAgB,KAC9B1+F,KAAKu/F,MAAK,KAMd,IAAIhnE,EAAUv4B,KAAK6B,WAAWK,MAC9B,GAAGq2B,EAAQp2B,OAASyG,EAAA,QAAUgiD,OAAOk4C,mBAEnC,YADAvuE,GAAM,UAAKvb,OAAO,sCAAsC,IAI1DhZ,KAAK2+B,OACL,MAAM4jE,EAAaviG,KAAKuiG,WACxBA,EAAWgB,QAA8B,UAApBhB,EAAWp/F,WAA0BuB,EAC1D,MAAM,gBAACk+F,EAAe,QAAEW,GAAWhB,GAI7B,OAACt7F,EAAM,MAAElF,GAAS/B,KAAKosB,MACvB,WAAC8zE,EAAU,aAAEtB,GAAgB78F,EAEnC6gG,EAAgBt8F,QAAQia,IACtBA,EAAEkiF,aAAU/9F,IAGd,MAAM,OAACvC,GAAUygG,EACXnB,EAAe1/F,EAAM0/F,aAC3BzhG,KAAKs3C,QAASsrD,IACTrqE,GAAWqqE,EAAgBzgG,SAAWA,IACvCnC,KAAKosB,KAAK49B,mBAAmBm5B,SAASl8E,EAAQsxB,EAAS,CACrDkpE,eACA32F,SAAU9K,KAAKosB,KAAKthB,SACpBkxF,OAAQkE,EACRtB,eACA9W,YAAY,IAGdvvD,OAAU7zB,GAGZ,MAAMmT,EAAI,OAAH,wBACF0qF,GAAU,CACbK,oBAGF5iG,KAAKosB,KAAK49B,mBAAmBw5C,UAAUv8F,EAAQ4Q,EAAE+qF,gBAAgBn6F,IAAI8X,GAAKA,EAAEuiD,MAAO9rD,OAAOsjC,OAAO,CAC/F/hB,UACAkpE,eACA32F,SAAU9K,KAAKosB,KAAKthB,SACpBy4F,QAASA,EACTvH,OAAQkE,EACRtB,eACA9W,YAAY,GACXjwE,IAEH0gB,OAAU7zB,IAGZ3C,EAAM0/F,aAAezhG,KAAKosB,KAAKthB,SAC/B/I,EAAM4G,gBAGA,YAAYm6D,EAAYpqB,EAAwB+pD,GACtDA,EAAQriG,UAAUC,IAAI,oBAItB,IAAI8F,EACJ,GAHgB28D,EAAK3/D,KAAKsgG,WAAW,UAGzB,CACV,MAAM9iF,EAAQzgB,SAASC,cAAc,SAC/BujG,EAASxjG,SAASC,cAAc,UACtCujG,EAAOjvF,IAAMikC,EAAOirD,UAAYxgD,IAAIC,gBAAgB0f,GACpDniD,EAAMlgB,UAAW,EACjBkgB,EAAMQ,UAAW,EACjBR,EAAMxJ,OAAQ,EACdwJ,EAAMvd,aAAa,cAAe,QAElCud,EAAM3f,iBAAiB,aAAc,KACnC2f,EAAMvf,SACL,CAACuW,MAAM,IAEVxR,EAAU,aAAYwa,GAAO9f,KAAK,KAChC63C,EAAOh4C,MAAQigB,EAAMijF,WACrBlrD,EAAO/3C,OAASggB,EAAMkjF,YACtBnrD,EAAO7kC,SAAWxR,KAAKg5E,MAAM16D,EAAM9M,UAEnC,MAAMiwF,EAAyBnjF,EAAcojF,4BAM7C,YAL6Br/F,IAA1Bo/F,IACDprD,EAAOsrD,SAAWF,GAGpBrB,EAAQ14F,OAAO4W,GACR,aAAsBA,GAAO9f,KAAKqpB,IACvCwuB,EAAOxuB,MAAQ,OAAH,QACVxV,IAAKyuC,IAAIC,gBAAgBl5B,EAAMg5B,OAC5Bh5B,OAKTvJ,EAAM5W,OAAO25F,OACR,CACL,MAAMt5E,EAAM,IAAIyd,MAChB1hC,EAAU,IAAItD,QAAeoD,IAC3BmkB,EAAI65E,OAAS,KACXvrD,EAAOh4C,MAAQ0pB,EAAIm6C,aACnB7rB,EAAO/3C,OAASypB,EAAIo6C,cAEpBi+B,EAAQ14F,OAAOqgB,GAEE,cAAd04C,EAAK3/D,MACNu1C,EAAOsrD,SAAU,EAEjBnhG,QAAQC,IAAI,CACV++F,GAAez3E,GAAKvpB,KAAKgT,IACvB6kC,EAAO7kC,SAAWxR,KAAKkjB,KAAK1R,KAG9B,aAAsBuW,GAAKvpB,KAAKqpB,IAC9BwuB,EAAOxuB,MAAQ,OAAH,QACVxV,IAAKyuC,IAAIC,gBAAgBl5B,EAAMg5B,OAC5Bh5B,OAGNrpB,KAAK,KACNoF,OAGFA,OAKNmkB,EAAI3V,IAAMikC,EAAOirD,UAAYxgD,IAAIC,gBAAgB0f,GAGnD,OAAO38D,EAGD,eAAe28D,EAAYpqB,EAAwB+pD,GACzDA,EAAQriG,UAAUC,IAAI,uBAEtB,MAAM6jG,EAAUphC,EAAK3/D,KAAKsgG,WAAW,UAC/BU,EAAUrhC,EAAK3/D,KAAKsgG,WAAW,WAClCS,GAAWC,KACZzrD,EAAOirD,UAAYxgD,IAAIC,gBAAgB0f,IAGzC,MAAM7uD,EAAM,CACV7M,EAAG,WACH07D,KAAMA,EACN3pD,UAAW2pD,EAAKx5D,MAAQ,GACxBmf,SAAUq6C,EAAKx5D,KAAO,IAAkBwiB,cAAcg3C,EAAKx5D,MAAQ,GACnExJ,KAAMgjE,EAAKhjE,KACXqD,KAAM+gG,EAAU,QAAU,OAGtB5vF,EAAeC,GAAA,EAAmBC,gBAAgBP,GACxDK,EAAaI,IAAMgkC,EAAOirD,UAC1BrvF,EAAa0qC,WAAa8jB,EAAKhjE,KAE/B,MAAMqgD,EAASN,GAAa,CAC1Bz7C,QAAS,CACPgD,EAAG,UACHkQ,OAAQ,CACNoQ,aAAa,GAEf7gB,IAAK,EACLI,OAAQ,EACR6L,MAAO,CACL1L,EAAG,uBACHlH,SAAU+T,MA2BhB,OAtBgB,IAAIpR,QAAeoD,IACjC,MAAMm+F,EAAS,KACb3B,EAAQ14F,OAAOo2C,GACfl6C,KAGF,GAAGi+F,EAAS,CACV,MAAM95E,EAAM,IAAIyd,MAChBzd,EAAI3V,IAAMikC,EAAOirD,UACjBv5E,EAAI65E,OAAS,KACXvrD,EAAOh4C,MAAQ0pB,EAAIm6C,aACnB7rB,EAAO/3C,OAASypB,EAAIo6C,cAEpB4/B,KAGFh6E,EAAIi6E,QAAUD,OAEdA,MAwBE,eAAeppD,GACrB,MAAgC,UAAzBh7C,KAAKuiG,WAAWp/F,MAAoB,EAA2BwE,IAAIqzC,GAGpE,WAEFh7C,KAAKgV,QAAQ5U,UAAUuR,SAAS,YAClC3R,KAAK+N,eAAe1N,IAAIH,SAASiW,KAAjCnW,CAAuC,UAAWA,KAAKoiG,WACvDpiG,KAAKgB,iBAAiB,QAAS,KAC1BhB,KAAK+iG,gBACN/iG,KAAKosB,KAAKrqB,MAAMihG,kBAAkB9gG,MAAQlC,KAAK+iG,iBAGnD/iG,KAAKye,QAID,WACN,MAAM,WAAC8jF,EAAU,MAAE30F,EAAK,MAAEq0F,GAASjiG,KACnC,IAAIuO,EACJ,MAAMN,EAA2B,GACjC,GAAuB,aAApBs0F,EAAWp/F,KACZoL,EAAM,yBACNN,EAAKtI,KAAKs8F,EAAM9/F,YACX,CACL,IAAImiG,EAAc,EAAGC,EAAc,EAAGC,EAAa,EACnDvC,EAAM37F,QAAQw8D,IACTA,EAAK3/D,KAAKsgG,WAAW,YAAaa,EAC7BxhC,EAAK3/D,KAAKsgG,WAAW,YAAac,IACnCC,IAGN,CAACF,EAAaC,EAAaC,GAAY58F,OAAO68F,GAAKA,EAAI,GAAGtiG,OAAS,GACpEoM,EAAM,yBACNN,EAAKtI,KAAKs8F,EAAM9/F,SAQLmiG,GACX/1F,EAAM,0BACNN,EAAKtI,KAAK2+F,IACFC,IACRh2F,EAAM,0BACNN,EAAKtI,KAAK4+F,IAId,OAAAh4F,EAAA,GAAeqB,EAAO,eAAKW,EAAKN,IAG1B,uBAAuBue,EAAkBksB,GAC/C,GAAG14C,KAAKwiG,eAAe9pD,EAAOoqB,KAAK3/D,MAAO,CACxC,MAAMrD,EAAO,OAAAy/E,GAAA,GAAe7mC,EAAOh4C,MAAOg4C,EAAO/3C,OAAQ,IAAK,KAC9D6rB,EAAI7pB,MAAMjC,MAAQZ,EAAKY,MAAQ,KAC/B8rB,EAAI7pB,MAAMhC,OAASb,EAAKa,OAAS,KAGnCX,KAAK6iG,eAAe94F,OAAOyiB,GAGrB,QAAQ4qB,GACd,MAAM,gBAACwrD,GAAmB5iG,KAAKuiG,WAC/B,IAAIviG,KAAKuiG,WAAW91E,MAElB,YADAm2E,EAAgBt8F,QAAQ0wB,GAAKogB,EAAG,CAACpgB,KAInC,MAAM70B,EAASygG,EAAgBzgG,OAC/B,IAAI,IAAI6I,EAAI,EAAGA,EAAI7I,GAAS,CAC1B,MAAMuiG,EAAY9B,EAAgB53F,GAAG83D,KAAK3/D,KAC1C,IAAIuuC,EAAI,EACR,KAAMA,EAAI,IAAM1mC,EAAI7I,IAAU6I,IAAK0mC,EAAG,CACpC,MAAMvuC,EAAOy/F,EAAgB53F,GAAG83D,KAAK3/D,KACrC,GAAGnD,KAAKwiG,eAAekC,KAAe1kG,KAAKwiG,eAAer/F,GACxD,MAIJi0C,EAAGwrD,EAAgBn/F,MAAMuH,EAAI0mC,EAAG1mC,KAI5B,cACN,MAAM,MAACi3F,EAAK,WAAEM,EAAU,eAAEM,GAAkB7iG,KAC5CuiG,EAAWK,gBAAgBzgG,OAAS,EAEpCnC,KAAK2kG,2BACL3kG,KAAK4kG,2BAEL/hG,QAAQC,IAAIm/F,EAAMx5F,IAAIzI,KAAKsiG,aAAazhG,KAAK,KAC3CgiG,EAAe5+F,UAAY,GAEvBg+F,EAAM9/F,SAIVnC,KAAKmR,WAELnR,KAAKs3C,QAASsrD,IACZ,GAAG5iG,KAAKwiG,eAAeI,EAAgB,GAAG9/B,KAAK3/D,OAASy/F,EAAgBzgG,OAAS,EAAG,CAClF,MAAM0iG,EAAiB3kG,SAASC,cAAc,OAC9C0kG,EAAezkG,UAAUC,IAAI,mBAAoB,cACjDwkG,EAAe96F,UAAU64F,EAAgBn6F,IAAIoN,GAAKA,EAAE4sF,UAEpDl/C,GAAa,CACXtjD,UAAW4kG,EACXr/F,MAAOo9F,EAAgBn6F,IAAI0uB,IAAK,CAAEtf,EAAGsf,EAAEz2B,MAAO6X,EAAG4e,EAAEx2B,UACnDqsB,SAAU,IACVC,SAAU,IACVC,QAAS,IAGX21E,EAAe94F,OAAO86F,QAEtBjC,EAAgBt8F,QAASoyC,IACvB14C,KAAK8kG,uBAAuBpsD,EAAO+pD,QAAS/pD,UAIjD73C,KAAK,KACNb,KAAK+kG,cChiBX,MAGMC,GAA0B,CAAC,UAAW,aACtCC,GAA0B,CAAC,YAAa,cAE/B,SAASC,IAAqB,KAACt7F,EAAI,KAAEzG,EAAI,SAAEu7B,EAAQ,KAAE/mB,EAAI,WAAEwtF,IAOxE,MAAMC,EAAW,IAAIvhG,IAAa,OAATV,EAAgB6hG,GAAYphG,OAAOqhG,IAAyB,MAAT9hG,EAAe8hG,GAAcD,IAEzG,IAAInwF,EACJ,MAAMwwF,EAAmB,IAChBxwF,GAAUjL,EAAKiG,cAAc,YAA4BjG,EAAK8W,kBAGjE4kF,EAAmB,CAACnY,EAAkBoY,KAC1C,GAAG1wF,IAAWs4E,EACZ,OAGF,IAAIqY,GAAY,EACb3wF,IACD2wF,GAAY,EACZ3wF,EAAOzU,UAAUuB,OA3BG,WA8BtBkT,EAASs4E,EACLt4E,IACJA,EAAOzU,UAAUC,IAhCK,UAkCnBmlG,GAAaz6F,GAAcw6F,GAC5B,OAAAE,GAAA,GAAiB16F,EAAY8J,EAAuB,cAAUnQ,OAAWA,OAAWA,EAAW,IAAc,MAATvB,EAAe,IAAM,OAIvHuiG,EAAiB,CAACC,EAAwBC,KAC9C,IAAIC,EAIJ,OAHWA,EAARD,EAAqBD,EAAcpuE,oBAAsB3tB,EAAK8W,kBAC/CilF,EAAcn2D,wBAA0B5lC,EAAKwnC,iBAExDy0D,GAqBT,IAAIC,EAEFA,EADU,OAAT3iG,EACgB,CAACwiG,EAAep3F,IACpB,YAARA,GAA6B,cAARA,EArBL,EAACo3F,EAAwBC,KAC9C,MAAMG,EAAWH,EAAS,qBAAuB,yBAC3CI,EAAcJ,EAAS,oBAAsB,mBAC7CK,EAAcN,EAAc7pF,wBAElC,IAAI+pF,EAAaF,EAAcI,IAAan8F,EAAKo8F,GACjD,KAAMH,IAAeF,GAAe,CAClC,MAAMO,EAAaL,EAAW/pF,wBAC9B,GAAGoqF,EAAW3rF,IAAM0rF,EAAY1rF,GAAK2rF,EAAWzrF,IAAMwrF,EAAYxrF,EAChE,MAGForF,EAAaA,EAAWE,IAAan8F,EAAKo8F,GAG5C,OAAOH,GAM+CM,CAAeR,EAAuB,cAARp3F,GACtEm3F,EAAeC,EAAuB,eAARp3F,GAG3B,CAACo3F,EAAep3F,IAAQm3F,EAAeC,EAAuB,eAARp3F,GAAgC,cAARA,GAGjG,IAAI6zF,EAAangG,IACf,MAAMsM,EAAMtM,EAAEsM,IACd,GAAI62F,EAASz9F,IAAI4G,IAWjB,GAFA,OAAAmP,EAAA,GAAYzb,GAET2H,EAAKK,kBAAoB,EAAG,CAC7B,IAAI07F,EAAgBN,IACpBM,EAAgBG,EAAeH,EAAep3F,GAC9C+2F,EAAiBK,GAAe,SAbrB,UAARp3F,GAA6B,OAATpL,GAAyB,QAARoL,KACtC,OAAAmP,EAAA,GAAYzb,GACZmkG,EAAWf,OAejB,MAAMt6F,EAAa,OAAA6T,GAAA,GAAgBhV,EAAM,cACzCA,EAAKxJ,UAAUC,IAAI,kBAEnB,MAAMga,EAAepY,IACnB,MAAM4S,EAAS,OAAAo0C,GAAA,GAAchnD,EAAE4S,OAAQjL,GACnCiL,GAIJywF,EAAiBzwF,GAAQ,IAGrBsI,EAAWlb,IACf,OAAAyb,EAAA,GAAYzb,GAEZ,MAAM4S,EAAS,OAAAo0C,GAAA,GAAchnD,EAAE4S,OAAQjL,GACnCiL,IAIJywF,EAAiBzwF,GAAQ,GACzBuxF,EAAWf,OAGPe,EAAcvxF,IAClB,MAAMwxF,EAAc3nE,EAAS7pB,SACVnQ,IAAhB2hG,GAA6BA,EAAc1uF,IAC5CwnC,KAIEA,EAAS,KAEbj/C,SAASmJ,oBAjIQ,UAiI0B+4F,EAAW,CAACj3E,SAAS,IAChEvhB,EAAKP,oBAAoB,YAAagR,GACtC,YAAiBzQ,EAAMuT,IAGnBmpF,EAAc,KACfnB,GACHG,EAAiB17F,EAAK8W,mBAAmB,IAG3C,GAAGykF,EAAY,CACb,MAAMoB,EAAanE,EACnBA,EAAangG,IACRA,EAAEsM,MAAQ42F,IACX,OAAAznF,EAAA,GAAYzb,GAEZ/B,SAASmJ,oBAjJI,UAiJ8B+4F,EAAW,CAACj3E,SAAS,IAChEi3E,EAAYmE,EACZrmG,SAASc,iBAnJI,UAmJ2BohG,EAAW,CAACj3E,SAAS,EAAM7P,SAAS,IAE5E6pF,OAAazgG,EACb4hG,WAIJA,IASF,OAJApmG,SAASc,iBA/JU,UA+JqBohG,EAAW,CAACj3E,SAAS,EAAM7P,SAAS,IAC5E1R,EAAK5I,iBAAiB,YAAaqZ,EAAa,CAACiB,SAAS,IAC1D,YAAiB1R,EAAMuT,GAEhB,CACLgiC,SACAmnD,eCnKW,MAAM,WAA2B,IAkB9C,YAAYtjG,GAOVC,OAAM,GArBE,KAAAujG,QAAS,EAmCT,KAAAC,UAAY,KACjBzmG,KAAKm/C,QACNn/C,KAAKm/C,SAGP,MAAMv1C,EAAO5J,KAAK4J,MACZ,OAACu1C,EAAM,YAAEmnD,GAAepB,GAAqB,CACjDt7F,OACAzG,KAAMnD,KAAK0mG,SACXhoE,SAAU1+B,KAAK0+B,SACf/mB,MAAM,EACNwtF,WAAYnlG,KAAKmlG,aAGnBnlG,KAAKm/C,OAASA,EACdn/C,KAAKsmG,YAAcA,EACf,cAActmG,KAAK2mG,iBACrB3mG,KAAK2mG,eAAiB,CACpBxjG,KAAM,sBACNiN,MAAO,KACLpQ,KAAK2mG,oBAAiBjiG,EACtB1E,KAAKsM,QAAO,IAEds6F,aAAa,GAGf73F,EAAA,EAAwBoB,SAASnQ,KAAK2mG,iBAGxC3mG,KAAKgB,iBAAiB,SAAU,KAC9BhB,KAAKsmG,iBAAc5hG,EACnB1E,KAAKm/C,YAASz6C,EAEdkF,EAAK3F,UAAY,GACjBk7C,IAEGn/C,KAAK2mG,iBACN53F,EAAA,EAAwB83F,WAAW7mG,KAAK2mG,gBACxC3mG,KAAK2mG,oBAAiBjiG,IAEvB,CAACiT,MAAM,KApDV,YAAW3X,KAAMgD,GAEjBhD,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,sBAAuB,aAEpD2C,EAAQq4B,SAAStxB,OAAO/J,KAAKC,WAE7BD,KAAK8mG,mBAEL9mG,KAAK+mG,WAAWC,UAAUhnG,MA8ClB,mBACRA,KAAKgB,iBAAiB,UAAWhB,KAAKymG,WAGjC,OAAO9nE,EAAgBsoE,GAAiB,GAC1CjnG,KAAKkO,YAIIxJ,IAATi6B,IACDA,EAAO3+B,KAAKC,UAAUG,UAAUuR,SAAS,gBAAkB3R,KAAKC,UAAUG,UAAUuR,SAAS,cAG5F3R,KAAKwmG,SAAW7nE,GAQnB3+B,KAAKwmG,OAAS7nE,EAEVA,GAIC3+B,KAAK2mG,iBACN53F,EAAA,EAAwB83F,WAAW7mG,KAAK2mG,gBACxC3mG,KAAK2mG,oBAAiBjiG,GAGpBuiG,GACFjnG,KAAK+mG,WAAWG,mBAGflnG,KAAKm/C,QACNn/C,KAAKm/C,WAbPn/C,KAAK+mG,WAAWG,iBAAiBlnG,MACjCA,KAAKyO,cAAc,YAgBrB,aAAczO,KAAKC,UAAW,cAAe0+B,EAAM/1B,EAAA,QAAUw1B,SAASC,kBAAoB,IAAM,EAAG,KACjGr+B,KAAKwmG,QAAUxmG,KAAKyO,cAAc,aA5B9BkwB,GACF3+B,KAAKyO,cAAc,aC9FZ,MAAM,WAAuB,GAM1C,YAAY4sB,EAAuB0rE,GACjC9jG,MAAM,CACJo4B,WACA0rE,aACAL,SAAU,KACVhoE,SAAW7pB,IACD,GAAkBo7C,aAAa,CAACp7C,WAAS,GAEnDswF,WAAY,YAGdnlG,KAAKC,UAAUG,UAAUC,IAAI,mBAE7BL,KAAKgB,iBAAiB,UAAW,KAC/BwK,WAAW,KACTxL,KAAK+K,WAAW9K,UAAUuoC,UAAY,GACrC,GAEH5/B,EAAA,QAAU6F,cAAc,oBAAoB,KAG9CzO,KAAKgB,iBAAiB,SAAU,KAC3BhB,KAAKmnG,iBACN5jF,EAAA,EAAWla,oBAAoB,eAAgBrJ,KAAKmnG,gBACpDnnG,KAAKmnG,oBAAiBziG,GAGxBkE,EAAA,QAAU6F,cAAc,oBAAoB,KAIzC,cAAckrC,GACnB,MAAM1tB,EAAajsB,KAAK+mG,WAAWz6E,gBAEhCtsB,KAAKgqB,eACNhqB,KAAKgqB,cAAc7f,QAGrB,GAAmB0yF,4BAA4BljD,GAC/C,GAAmBrB,sBAAsBqB,GACxC94C,KAAMy4C,IACL,IAAIrtB,IACF,OAGCjsB,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGd,MAAMjO,EAAYD,KAAK4J,KAAK8iC,YAE5B,IAAI06D,EAEJpnG,KAAKgqB,cAAc7f,QAEjBi9F,EADC9tD,EAASn3C,OACF,IAAIU,QAAeoD,IACzB,MAAMw3B,EAA2B,GACjC6b,EAAShzC,QAAQg2C,IACfr8C,EAAU8J,OAAO/J,KAAKogF,qBAAqBL,cAAczjC,OAAuB53C,EAAW+4B,MAG5F56B,QAAQC,IAAI26B,GAA2Bpc,QAAQpb,KAG1CpD,QAAQoD,UAGlBmhG,EAAMvmG,KAAK,KACTb,KAAK4J,KAAKmf,YAAY9oB,GACtBD,KAAK4J,KAAO3J,EAERD,KAAKmnG,iBACPnnG,KAAKmnG,eAAiB,KACpB,MAAMzmG,EAASV,KAAK4J,KAAKK,kBAAoBsZ,EAAA,EAAWosB,OAAOs2B,WAAWvlE,OAAUV,KAAK4J,KAAKK,kBAAoB,GAClHjK,KAAK4J,KAAKjH,MAAMjC,MAAQA,EAAQ,MAElC6iB,EAAA,EAAWviB,iBAAiB,eAAgBhB,KAAKmnG,iBAGnDnnG,KAAKmnG,iBAELnnG,KAAKsM,QAAQgtC,EAASn3C,QACtBnC,KAAK+K,WAAWy9B,UAAY,MAKxB,OACRxoC,KAAK4J,KAAO1J,SAASC,cAAc,OACnCH,KAAK4J,KAAKxJ,UAAUC,IAAI,2BAA4B,kBAEpDL,KAAKC,UAAU8J,OAAO/J,KAAK4J,MAE3B5J,KAAK+K,WAAa,IAAI,IAAW/K,KAAKC,WACtCD,KAAKgqB,cAAgB,IAAI,KACzBhqB,KAAKogF,qBAAuB,IAAI,GAAqBpgF,KAAKgqB,cAAe0C,KC7G7E,MAAM26E,GAAa,KACjB,MAAMl/E,EAAO,IAAIssB,KAGjB,OADAtsB,EAAKosC,SAAS,EAAG,EAAG,EAAG,GAChBpsC,GAGHm/E,GAAa,KACjB,MAAMn/E,EAAO,IAAIssB,KAGjB,OAFAtsB,EAAK+sD,YAAY/sD,EAAK0sC,cAAgB,GACtC1sC,EAAKqsC,QAAQrsC,EAAKgtD,UAAY,GACvBhtD,GAOM,MAAM,WAAsB,GACzC,YAAYgsD,EAAgBC,EAAqCmzB,GALjD,IAACp/E,EAuBf,GAjBAllB,OANeklB,EAMCgsD,GALNzf,UAAY4yC,KAAa5yC,UAAY,IAAIjgB,KAAStsB,EAKjCisD,EAAQ,CACjCC,WAAW,EACX39C,SAAS,EACT8H,UAAU,EACVixC,aAAa,EACb5c,QAASw0C,KACThyC,QAASiyC,KACTjgF,UAAU,EACVuvD,oBAAoB,EACpBurB,+BAA+B,IAGjCniG,KAAKgV,QAAQ5U,UAAUC,IAAI,kBAC3BL,KAAKyN,OAAO1D,OAAO/J,KAAKo1E,aACxBp1E,KAAK4N,MAAMmb,YAAY/oB,KAAKq1E,YAC5Br1E,KAAKmW,KAAKpM,OAAO/J,KAAK0vE,YAEnB63B,EAAmB,CACpB,MAAMC,EAAoB,YAAO,4DAA6D,CAACtqF,KAAM,4BACrGld,KAAKmW,KAAKpM,OAAOy9F,GAEjB,YAAiBA,EAAmB,KAClCpzB,EbrDkC,YasDlCp0E,KAAK2+B,W,uBCvCE,SAAS8oE,GAAsBC,EAAoBC,GAAe,GAC/E,MAAM9wB,EAAkB,GAClBjmD,EAAiB,GAEjB2U,EAAMh6B,OAAOy7C,eACnB,IAAI4gD,EACAC,EACJ,GAAGtiE,GAAOA,EAAIgiD,WAAY,CACxB,MAAMlhB,EAAQ9gC,EAAIkiD,WAAW,GACvBqgB,EAAczhC,EAAMyhC,YAC1B,GACEzhC,EAAM0hC,gBACN1hC,EAAM0hC,gBAAkB1hC,EAAM2hC,cAC9BF,GAAezhC,EAAM4hC,UACrB,CAEA,MAAMC,EAA8BJ,EAAc,EAC5CK,EAAaT,EAAMS,WACzB,GAAG9hC,EAAM0hC,iBAAmBL,GAASS,EAAWD,GAA8B,CAC5EN,EAAUO,EAAWD,GACrBL,EAAY,EAEZ,IAAI,IAAI78F,EAAI,EAAGA,EAAIq7D,EAAM4hC,YAAaj9F,EAAG,CACvC,MAAMwa,EAAO2iF,EAAWn9F,GAClB9I,EAAQsjB,EAAKk4D,WAAcl4D,EAA0B4iF,IAExDlmG,IACD2lG,GAAa3lG,EAAMC,cAIvBylG,EAAUvhC,EAAM0hC,eAChBF,EAAYC,GAKlB,MAAM7xD,EAA4B0xD,EAAe,QAAKjjG,EACtD,OAAA2jG,GAAA,GAAoBX,EAAO7wB,EAAOjmD,EAAMg3E,EAASC,EAAW5xD,GAEzDrlB,EAAKzuB,QACN00E,EAAMlxE,KAAKirB,EAAK5J,KAAK,KAGvB,IAAI9kB,EAAQ20E,EAAM7vD,KAAK,MACvB,MAAMshF,EAAWpmG,EAAMqa,QAAQ,KAU/B,OATgB,GAAb+rF,IACDpmG,EAAQA,EAAMqmG,OAAO,EAAGD,GAAYpmG,EAAMqmG,OAAOD,EAAW,IAE9DpmG,EAAQA,EAAMsB,QAAQ,UAAW,KAE9ByyC,GACD,IAAkBuyD,oBAAoBvyD,GAGjC,CAAC/zC,QAAO+zC,WAAUqyD,YCzDZ,MAAM,WAAoB,GAGvC,YAAYjtE,EACV0rE,EACA1gB,EACQpJ,GACRh6E,MAAM,CACJo4B,WACA0rE,aACAL,SAAU,IACVhoE,SAAW7pB,IACTwxE,EAAUxI,gBAAgBL,GAAoB3oE,IAAgB,MAN1D,KAAAooE,kBAURj9E,KAAKC,UAAUG,UAAUC,IAAI,gBAGrB,OACRL,KAAK4J,KAAO1J,SAASC,cAAc,OACnCH,KAAK4J,KAAKxJ,UAAUC,IAAI,sBAAuB,gBAE/CL,KAAKC,UAAU8J,OAAO/J,KAAK4J,MAE3B5J,KAAK+K,WAAa,IAAI,IAAY/K,KAAKC,WAEvCD,KAAKgB,iBAAiB,UAAW,KAC/BwK,WAAW,KACTxL,KAAK+K,WAAW9K,UAAU4nF,WAAa,GACtC,KAIA,OAAOlL,EAAkBwoB,GAC9B,GAAGnlG,KAAKkO,KAAM,CACZ,IAAIyuE,EAAOx6E,OACT,OAGFnC,KAAKkO,OACLlO,KAAKkO,KAAO,MAGdyuE,EAASA,EAAOl5E,MAAM,EAAG,KAEftB,SACRnC,KAAK4J,KAAK3F,UAAY,GACtB04E,EAAOr2E,QAAQizC,IACb4jC,GAAY5jC,EAAOv5C,KAAK4J,MAAM,GAAO,MAIzC5J,KAAKmlG,WAAaA,EAAa,eAAYzgG,EAC3C1E,KAAKsM,QAAQqwE,EAAOx6E,QAOf,WAAWyI,EAAe69F,GAC/B,MAAMx8E,EAAajsB,KAAK+mG,WAAWz6E,gBACnCtsB,KAAKi9E,gBAAgByrB,uBAAuB7nG,KAAK,KAC/C,IAAIorB,IACF,OAGF,MAAMoR,EAAIzyB,EAAMpH,QAAQ,KAAM,IACxBm5E,EAAS38E,KAAKi9E,gBAAgB0rB,aAAatrE,GACjDr9B,KAAK4/C,OAAO+8B,EAAsB,MAAd8rB,MCtEX,MAAM,WAA+B,GAKlD,YAAYptE,EAAuB0rE,EAAoDv9F,EAAmBk1B,GACxGz7B,MAAM,CACJo4B,WACA0rE,aACAL,SAAU,IACVhoE,aALmF,KAAAl1B,YAQrFxJ,KAAKC,UAAUG,UAAUC,IAAI,GAAuBsnC,WAAYn+B,GAGxD,OACRxJ,KAAK4J,KAAO1J,SAASC,cAAc,OACnCH,KAAK4J,KAAKxJ,UAAUC,IAAI,GAAuBsnC,WAAa,SAE5D3nC,KAAKC,UAAU8J,OAAO/J,KAAK4J,MAE3B5J,KAAK+K,WAAa,IAAI,IAAW/K,KAAKC,WAEtCD,KAAKgB,iBAAiB,UAAW,KAC/BwK,WAAW,KACTxL,KAAK+K,WAAW9K,UAAUuoC,UAAY,GACrC,KAIA,OAAOo8B,GACZ,GAAG5kE,KAAKkO,KAAM,CACZ,IAAI02D,EAAKziE,OACP,OAGFnC,KAAKkO,OACLlO,KAAKkO,KAAO,KAGX02D,EAAKziE,SACNnC,KAAK4J,KAAK3F,UAAY,GACtB2gE,EAAKt+D,QAAQia,IACX,MAAMiM,EAAM,GAAuBo8E,YAAY,CAC7Cp/F,UAAWxJ,KAAKwJ,UAChBvC,OAAQsZ,EAAEtZ,OACVqC,KAAMiX,EAAEjX,KACRytB,YAAaxW,EAAEwW,cAGjB/2B,KAAK4J,KAAKG,OAAOyiB,MAIrBxsB,KAAKsM,QAAQs4D,EAAKziE,QAGb,mBAAmBa,GAMxB,MAAM6lG,EAAO,GAAuBC,wBACpC9lG,EAAQwG,WAAa,gBAErB,MAAMgjB,EAAMtsB,SAASC,cAAc,OACnCqsB,EAAIpsB,UAAUC,IAAIwoG,EAAM7lG,EAAQwG,WAChCgjB,EAAIpgB,QAAQnF,OAAS,GAAKjE,EAAQiE,OAElC,MAAMygC,EAAS,IAAI,GACnBA,EAAOtnC,UAAUC,IAAI,YAAawoG,EAAO,UAAW7lG,EAAQwG,UAAY,WACxEk+B,EAAOtkC,aAAa,SAAU,KAC9BskC,EAAOtkC,aAAa,OAAQ,GAAKJ,EAAQiE,QAEzC,MAAMqC,EAAOpJ,SAASC,cAAc,OAepC,GAdAmJ,EAAKlJ,UAAUC,IAAIwoG,EAAO,QAAS7lG,EAAQwG,UAAY,SACnDxG,EAAQsG,KAQVA,EAAKrF,UAAY,IAAkB6nB,cAAc9oB,EAAQsG,MAPzDA,EAAKS,OAAO,IAAI,KAAU,CACxB9C,OAAQjE,EAAQiE,OAChB4E,QAAQ,EACRunD,eAAe,EACflwD,WAAW,IACV8R,SAKLwX,EAAIziB,OAAO29B,EAAQp+B,GAEhBtG,EAAQ+zB,YAAa,CACtB,MAAMA,EAAc72B,SAASC,cAAc,OAC3C42B,EAAY32B,UAAUC,IAAIwoG,EAAO,eAAgB7lG,EAAQwG,UAAY,gBACrEutB,EAAY9yB,UAAY,IAAkB6nB,cAAc9oB,EAAQ+zB,aAChEvK,EAAIziB,OAAOgtB,GAGb,OAAOvK,GAjGQ,GAAAmb,WAAa,2BACb,GAAAmhE,wBAA0B,GAAuBnhE,WAAa,gBCDlE,MAAM,WAAuB,GAC1C,YAAYtM,EACV0rE,EACA1gB,EACQ+B,EACAF,GACRjlF,MAAMo4B,EACJ0rE,EACA,kBACClyF,IACC,MAAM5Q,EAAY4Q,EAAOhF,cAAc,IAAI,GAAuBi5F,gCAAgC7kG,UAClG,OAAOoiF,EAAU0iB,eAAe,KAC9B1iB,EAAUa,aAAajjF,UAAYA,EACnCoiF,EAAUhD,aAAY,OATpB,KAAA+E,oBACA,KAAAF,kBAcH,WAAWt9E,EAAe3D,GAC/B,IAAIjH,KAAKkoF,gBAAgB6K,MAAM9rF,GAC7B,OAAO,EAGT,MAAMglB,EAAajsB,KAAK+mG,WAAWz6E,gBA+BnC,OA9BAtsB,KAAKooF,kBAAkBv9C,mBAAmB5jC,GAAQpG,KAAKspB,IACrD,IAAI8B,IACF,OAGF,MAAM+8E,EAA8B,GAAGplG,OAAOumB,EAAKwwE,UAC7Cr+E,EAAQ,IAAI,KAAoB,CACpC2sF,YAAY,IAGRC,EAA6E,IAAIx5F,IACvFs5F,EAAS1iG,QAAQ6iG,IACfA,EAAQD,SAAS5iG,QAAQ8iG,IACvB,MAAMp2E,EAAI,IAAMo2E,EAAWC,QAC3BH,EAASv0F,IAAIy0F,EAAWC,QAAS,CAC/BpiG,OAAQkiG,EAAQhoE,QAAQha,UAAS,GACjC7d,KAAM0pB,EACN+D,YAAaqyE,EAAWryE,cAG1Bza,EAAMogE,YAAY0sB,EAAWC,QAASr2E,OAI1C,MAAMs2E,EAAQhtF,EAAMugE,OAAOjyE,GACrBmjC,EAAW5lC,MAAMC,KAAKkhG,GAAO7gG,IAAI4gG,GAAWH,EAASl5F,IAAIq5F,IAC/DrpG,KAAK4/C,OAAO7R,MAIP,GC5DI,MAAM,GAArB,cACU,KAAAw7D,QAAmC,IAAI1lG,IACvC,KAAAooB,WAAa,eAWd,gBAEL,OADAjsB,KAAKisB,WAAWrW,QACT5V,KAAKisB,WAAWjc,MAGlB,UAAU2iE,GACf3yE,KAAKupG,QAAQlpG,IAAIsyE,GAGZ,iBAAiB62B,GACtBxpG,KAAKupG,QAAQjjG,QAAQqsE,IAChBA,IAAW62B,GACZ72B,EAAOrmE,QAAO,GAAM,KAIpBk9F,GACFxpG,KAAKisB,WAAWrW,SC1BP,MAAM,WAAuB,GAC1C,YAAYylB,EACV0rE,EACA1gB,EACQ+B,EACAF,GACRjlF,MAAMo4B,EACJ0rE,EACA,kBACClyF,IACC,MAAMwvB,EAAO6jD,EAAgB5jD,QAASzvB,EAAuBzI,QAAQnF,OAAO8K,YAC5E,IAAc6+C,EAAVqW,EAAM,GACP5iC,EAAKxO,SACNoxC,EAAM,IAAM5iC,EAAKxO,UAEjBoxC,EAAM5iC,EAAKG,YAAcH,EAAKI,UAC9BmsB,EAAS,CACPxpD,EAAG,2BACHjF,OAAQ8kE,EAAI9kE,OACZutB,OAAQ,EACRyR,QAASkD,EAAKl1B,KAIlB83D,GAAO,IACPof,EAAUojB,cAAcxiC,EAAKrW,KArBzB,KAAAw3B,oBACA,KAAAF,kBAyBH,WAAWt9E,EAAe3D,EAAgByiG,GAC/C,MAAMC,EAAU/+F,EAAMU,OACtB,GAAGV,EAAMzI,SAAWwnG,EAAQxnG,OAAQ,OAAO,EAE3C,MAAM8pB,EAAajsB,KAAK+mG,WAAWz6E,gBAkBnC,OAjBAtsB,KAAKooF,kBAAkBwhB,YAAY3iG,GAAUA,EAAOivB,WAAYyzE,EAASD,GAAU7oG,KAAKiR,IACtF,IAAIma,IAAc,OAElB,MAAM4J,EAAW8zE,EAAQlmG,MAAM,GAAGi4C,cAClC17C,KAAK4/C,OAAO9tC,EAAQrJ,IAAIxB,IACtB,MAAMo9B,EAAOrkC,KAAKkoF,gBAAgB5jD,QAAQr9B,GAC1C,IAAGo9B,EAAKxO,UAAYwO,EAAKxO,SAAS6lB,gBAAkB7lB,EAIpD,MAAO,CACL5uB,SACA8vB,YAAasN,EAAKxO,SAAW,IAAMwO,EAAKxO,cAAWnxB,KAEpDkD,OAAOc,aAGL,G,YC7CI,MAAM,WAAsB,GAUzC,YAAY1F,GAOVC,MAAM,CACJ+R,QAAS9U,SAASC,cAAc,SAiD5B,KAAA0pG,iBAAoB5nG,IAC1B,MAAM4S,EAAS5S,EAAE+Y,QAAQ,GAAGnG,OACxB,OAAAo0C,GAAA,GAAcp0C,EAAQ7U,KAAKgV,UAAYH,IAAW7U,KAAK8pG,WACzD,OAAApsF,EAAA,GAAYzb,GACZjC,KAAKsM,QAAO,KAlDd,YAAWtM,KAAMgD,GAEjBhD,KAAKgV,QAAQ5U,UAAUC,IAAI,GAAcsnC,YACzC3nC,KAAKgV,QAAQrS,MAAMC,QAAU,OAE7B5C,KAAK+pG,qBAAqB/pG,KAAK8pG,SAAU9pG,KAAK+N,gBAC9C/N,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,uBAAwB,EAAEiH,aACxDjH,KAAKiH,SAAWA,IACdjH,KAAKgqG,qBAAuBhqG,KAAKslF,YAClCtlF,KAAK4/C,SAGP,eAA2B/+C,KAAK,KAC9Bb,KAAKiqG,uBAMH,OAwBR,OAvBAjqG,KAAKq7B,SAAStxB,OAAO/J,KAAKgV,SAE1BhV,KAAK+N,eAAe1N,IAAIL,KAAxBA,CAA8B,OAAQ,KACpCA,KAAK4/C,SAEF,wBACD5/C,KAAKkqG,cAAgBlqG,KAAK+N,eAAe1N,IAAIH,SAASiW,KAAjCnW,CAAuC,aAAcA,KAAK6pG,iBAAkB,CAACvuF,SAAS,EAAO6P,SAAS,IAC3HnrB,KAAK+N,eAAe1N,IAAIL,KAAxBA,CAA8B,QAAS,KACrCA,KAAK+N,eAAepM,OAAO3B,KAAKkqG,gBAC/B,CAACvyF,MAAM,OAId3X,KAAK+N,eAAe1N,IAAIL,KAAKgV,QAA7BhV,CAAsC,QAAUiC,IAC9C,MAAM4S,EAAS,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAAQ,OACrCA,IAIJ7U,KAAKgqD,mBAAmBm5B,SAASnjF,KAAKiH,OAAQ4N,EAAOzI,QAAQ8Q,MAC7Dld,KAAKsM,QAAO,MAGPrJ,MAAMiL,OAWR,kBACL,MAAMg1E,EAAcljF,KAAKmqG,iBACJ,4BAAlBjnB,EAAY97E,GACZ87E,EAAY5rE,OAAOkvF,QACnBtjB,EAAY5rE,OAAOq8C,OACpBuvB,EAAY5rE,OAAOq8C,MAAO,EAC1B3zD,KAAKqmF,UAAU+G,iBAAiBlK,EAAYr8E,MAIxC,iB,MACN,OAAyE,QAAlE,EAAA7G,KAAKgqD,mBAAmBouB,kBAAkBp4E,KAAKiH,QAAQi8E,mBAAW,QAAI,CAC3E97E,EAAG,qBAIA,OAAO87E,EAA+CljF,KAAKmqG,kBAChEnqG,KAAKgV,QAAQ/Q,UAAY,GAEzB,IAAI,MAAMitB,KAAOgyD,EAAY/vD,KAAM,CACjC,MAAM3G,EAAMtsB,SAASC,cAAc,OACnCqsB,EAAIpsB,UAAUC,IAAI,GAAcsnC,WAAa,QAE7C,IAAI,MAAM9sB,KAAUqW,EAAItT,QAAS,CAC/B,MAAM6C,EAAMvgB,SAASC,cAAc,UACnCsgB,EAAIrgB,UAAUC,IAAI,GAAcsnC,WAAa,UAAW,OACxDlnB,EAAIxc,UAAY,IAAkB6nB,cAAcjR,EAAOqC,MACvDuD,EAAIrU,QAAQ8Q,KAAOrC,EAAOqC,KAC1BsP,EAAIziB,OAAO0W,GAGbzgB,KAAKgV,QAAQjL,OAAOyiB,IAIjB,kBAAkB02D,EAA2BljF,KAAKmqG,kB,MACvD,MAAMxrE,EAAyB,sBAAlBukD,EAAY97E,KAAiF,QAAnD,EAAC87E,EAA8C/vD,YAAI,eAAEhxB,QAO5G,OANAnC,KAAK8pG,SAAS1pG,UAAUkM,OAAO,OAAQqyB,GAEpCA,GACD3+B,KAAKsM,QAAO,IAGNqyB,EAGH,QAAQ13B,GACbjH,KAAKiH,OAASA,EAEdjH,KAAKgqG,oBACLhqG,KAAKiqG,mBA5HQ,GAAAtiE,WAAa,iB,2SCUf,MAAM,WAAqB,GAQxC,YAAYtM,EACV0rE,EACQ36E,EACA87D,EACAlE,GACR/gF,MAAM,CACJo4B,WACA0rE,aACAL,SAAU,KACVhoE,SAAW7pB,IACT,MAAM,OAAC5N,EAAM,MAAEg6E,EAAK,QAAEM,GAAWvhF,KAAK4J,KAAKwC,QAC3C,OAAOpM,KAAKosB,KAAKrqB,MAAMgnG,eAAe,KACpC,MAAMpmB,EAAoB3iF,KAAKgkF,qBAAqBtC,YAAYH,EAAU1sE,EAAuBzI,QAAQu1E,UACzG3hF,KAAKgkF,qBAAqBomB,iBAAiBnjG,EAAOkgB,WAAY85D,EAAO0B,EAAmB,CACtFmF,YAAY,EACZ8W,aAAc5+F,KAAKosB,KAAKrqB,MAAM68F,aAC9B5C,OAAQh8F,KAAKosB,KAAKrqB,MAAMm+F,WACxBuB,aAAczhG,KAAKosB,KAAKrqB,MAAM0/F,eAGhCzhG,KAAKosB,KAAKrqB,MAAM4G,eAAc,GAAM,QAlBlC,KAAAyjB,OACA,KAAA87D,kBACA,KAAAlE,uBAuCH,KAAAqmB,YAAc,CAAMpjG,EAAgB4uB,EAAkBjrB,IAAkB,mCAC7E,MAAMqhB,EAAajsB,KAAK+mG,WAAWz6E,gBAE7BwU,QAAa9gC,KAAKkoF,gBAAgB3D,gBAAgB1uD,GACxD,IAAI5J,IACF,KAAM,eAGR,GAAc,SAAX6U,EAAK15B,EACN,KAAM,YAGR,MAAMu6C,EAAgB3hD,KAAKgkF,qBAAqBQ,iBAAiBv9E,EAAQ65B,EAAK3xB,GAAIvE,GAAO/J,KAAKygF,I,MAC5F,IAAIr1D,IACF,KAAM,eAGLjsB,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGd,MAAMtE,EAAO5J,KAAK4J,KAAK8iC,YACvB9iC,EAAKwC,QAAQnF,OAAS,GAAKA,EAC3B2C,EAAKwC,QAAQ60E,MAAQ,GAAKngD,EAAK3xB,GAC/BvF,EAAKwC,QAAQm1E,QAAU,GAAKD,EAAWE,SAEvC,MAAM8oB,EAAc,IAAI,GAAY,KAjFlB,gBAiFyCtqG,KAAK+K,YAAY,GAE5E/K,KAAKgqB,cAAc7f,QACnBnK,KAAKogF,qBAAqBj2E,QAE1B,MAAM2f,EAA+B,GAC/BygF,IAAcjpB,EAAWhqE,OAAOkzF,QAEtC,IAAI,MAAM/kG,KAAQ67E,EAAWpkD,QAAS,CACpC,MAAMj9B,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAUC,IAAI,wBACxBJ,EAAUmM,QAAQu1E,SAAWl8E,EAAK0J,GAElC,MAAM+nF,EAAUqT,OAAY7lG,EAAYxE,SAASC,cAAc,OAS/D,GARG+2F,IACDA,EAAQ92F,UAAUC,IAAI,gCAEtBJ,EAAU8J,OAAOmtF,IAGnBttF,EAAKG,OAAO9J,GAERsqG,EAsBFtqG,EAAUG,UAAUC,IAAI,iBAtBX,CACb62F,EAAQ92F,UAAUC,IAAI,SACtB62F,EAAQjzF,UAAY,IAAkB6nB,cAAc,IAAIrmB,EAAKmI,MAAMtC,QAAQ,IAE3E,MAAMsC,EAAQ1N,SAASC,cAAc,OACrCyN,EAAMxN,UAAUC,IAAI,8BACpBuN,EAAM3J,UAAY,IAAkB6nB,cAAcrmB,EAAKmI,OAEvD,MAAMmpB,EAAc72B,SAASC,cAAc,OAC3C42B,EAAY32B,UAAUC,IAAI,oCAC1B02B,EAAY9yB,UAAY,IAAkB+nC,aAAavmC,EAAKsxB,YAAa,CACvE0zE,YAAY,EACZhoB,SAAS,IAGXxiF,EAAU8J,OAAO6D,EAAOmpB,GAExB,MAAM2zE,EAAYxqG,SAASC,cAAc,OACzCuqG,EAAUtqG,UAAUC,IAAI,2BAExBuJ,EAAKG,OAAO2gG,GAKd,GAAc,oBAAXjlG,EAAK2B,GACN,GAAG3B,EAAKykB,OAAoD,IAA3CzkB,EAAKykB,MAAM2zB,UAAUthC,QAAQ,UAAiB,CAC7D,IAAIsmF,EACD3L,GACD2L,EAAiB3iG,SAASC,cAAc,OACxC+2F,EAAQntF,OAAO84F,IAEfA,EAAiB5iG,EAGnB4iG,EAAeziG,UAAUC,IAAI,mBAC7BkqG,GAAa1H,EAAeziG,UAAUC,IAAI,oBAE1CL,KAAKgqB,cAAcrkB,KAAK,CACtB6mB,IAAKvsB,EACL6F,KAAM,IACGyO,GAAA,EAAmB0W,SAAS,CACjCyvB,KAAM,EACNI,SAAU,CACR1zC,EAAG,uBACH6zC,YAAcx1C,EAAKykB,MAAkC+wB,YACrDvmC,IAAKjP,EAAKykB,MAAMxV,KAElB5U,KAAM2F,EAAKykB,MAAMpqB,KACjBk7C,SAAUv1C,EAAKykB,MAAM2zB,YACpBh9C,KAAKqiD,IACN,MAAMjC,EAAQ,IAAIpZ,MAClBoZ,EAAM7gD,UAAUC,IAAI,eACpB,aAAkB6iD,GAAMriD,KAAK8pG,IAC3BlpD,GAAsBohD,EAAgB5hD,EAAO0pD,GAAS,cAM3D,CACL,MAAM73F,EAAQrN,EAAKvF,UAA0BuF,EAAKjB,MAClD,GAAI,CAAC,UAAW,OAAgCu1B,SAA8B,QAApB,EAAAjnB,SAAoB,eAAE3P,OAASonG,EACvF,OAAAviC,GAAA,GAAuBl1D,GAEL,QAAfA,EAAM3P,KACPmnG,EAAYjqG,IAAIyS,EAAO7S,GACA,YAAf6S,EAAM3P,OACdlD,EAAUG,UAAUC,IAAI,iBACxBL,KAAKogF,qBAAqBL,cAAcjtE,EAAO7S,EAAW6pB,GACrC,IAAlBhX,EAAMwpC,SACPt8C,KAAKogF,qBAAqBJ,mBAAmB//E,SAG5C,GAAG6S,EAAO,CACf,MAAMhT,EAAOyqG,EAAY,QAAK7lG,EAC9B6lG,GAAatqG,EAAUG,UAAUC,IAAI,oBACrCspB,GAAU,CACRnlB,MAAOsO,EACP7S,UAAWsqG,EAAYtqG,EAAYi3F,EACnCttE,SAAU9pB,EACV+pB,UAAW/pB,EACXmsB,aACAjC,cAAehqB,KAAKgqB,cACpBF,mBAMR,OAAOjnB,QAAQC,IAAIgnB,GAAcjpB,KAAK,KACpC,IAAIorB,IAEF,YADAq+E,EAAYngG,QAIdP,EAAKxJ,UAAUkM,OAAO,aAAci+F,GACpC3gG,EAAKxJ,UAAUkM,OAAO,iBAAkBi+F,GACxCvqG,KAAKC,UAAUG,UAAUkM,OAAO,aAAci+F,GAQ9C,MAAMriD,EAASloD,KAAK4J,KAAKkH,cAEzB,GADAo3C,EAAO11C,YAAc,GAClB8uE,EAAWspB,UAAW,CACvB,MAAMC,EAAgB,YAAO,6DAC7BA,EAAcppF,mBAAmB,YAAa,IAAkBqK,cAAcw1D,EAAWspB,UAAU1tF,OACnG,YAAiB2tF,EAAgB5oG,IAC/BjC,KAAKgkF,qBAAqB8mB,WAAW7jG,EAAQ65B,EAAK3xB,GAAImyE,EAAWspB,UAAUG,eAE7E7iD,EAAOn+C,OAAO8gG,GAEhB3iD,EAAOn+C,OAAO/J,KAAK4J,KAAOA,GAEvB5J,KAAKsqG,aACNtqG,KAAKsqG,YAAYnrD,SAEnBn/C,KAAKsqG,YAAcA,EACnBA,EAAYjgF,SAERrqB,KAAKmnG,iBACPnnG,KAAKmnG,eAAiB,KACpB,GAAGnnG,KAAK4J,KAAKxJ,UAAUuR,SAAS,cAAe,CAC7C,MAAMjR,EAASV,KAAK4J,KAAKK,kBAAoBsZ,EAAA,EAAWosB,OAAOs2B,WAAWvlE,OAAUV,KAAK4J,KAAKK,kBAAoB,GAClHjK,KAAK4J,KAAKjH,MAAMjC,MAAQA,EAAQ,UAEhCV,KAAK4J,KAAKjH,MAAMjC,MAAQ,IAG5B6iB,EAAA,EAAWviB,iBAAiB,eAAgBhB,KAAKmnG,iBAGnDnnG,KAAKmnG,iBAELnnG,KAAKsM,QAAQg1E,EAAWpkD,QAAQ/6B,SAAWm/E,EAAWspB,WACtD5qG,KAAK+K,WAAWy9B,UAAY,MAIhC,MAAO,CAACnE,KAAMvD,EAAM6gB,oBAlNpB3hD,KAAKC,UAAUG,UAAUC,IAAI,iBAE7BL,KAAKgB,iBAAiB,UAAW,KAC/BwK,WAAW,KACTxL,KAAK+K,WAAW9K,UAAUuoC,UAAY,GACrC,KAGLxoC,KAAKgrG,WAAat2E,GAAS10B,KAAKqqG,YAAa,KAAK,GAAM,GAExDrqG,KAAKgB,iBAAiB,SAAU,KAC3BhB,KAAKmnG,iBACN5jF,EAAA,EAAWla,oBAAoB,eAAgBrJ,KAAKmnG,gBACpDnnG,KAAKmnG,oBAAiBziG,KAwMlB,OACR1E,KAAK4J,KAAO1J,SAASC,cAAc,OACnCH,KAAK4J,KAAKxJ,UAAUC,IAAI,yBAExBL,KAAKC,UAAU8J,OAAO/J,KAAK4J,MAE3B5J,KAAK+K,WAAa,IAAI,IAAW/K,KAAKC,WACtCD,KAAKgqB,cAAgB,IAAI,KACzBhqB,KAAKogF,qBAAuB,IAAI,GAAqBpgF,KAAKgqB,cAjQtC,kB,YCkET,MAAM,GA2GnB,YAAoBoC,EACV49B,EACAs+B,EACA4U,EACA+N,EACArwB,EACAswB,EACAphB,EACAzB,EACA8iB,EACAC,EACAnuB,EACAiL,EACAlE,GAbU,KAAA53D,OACV,KAAA49B,qBACA,KAAAs+B,wBACA,KAAA4U,iBACA,KAAA+N,kBACA,KAAArwB,kBACA,KAAAswB,qBACA,KAAAphB,eACA,KAAAzB,mBACA,KAAA8iB,oBACA,KAAAC,0BACA,KAAAnuB,kBACA,KAAAiL,kBACA,KAAAlE,uBA/GF,KAAAqnB,QAAU,GACV,KAAAC,aAAe,EAiBf,KAAAC,cAIJ,GAeI,KAAAC,gBAA2B,KAU5B,KAAA1/C,WAAY,EACX,KAAA2/C,gBAAiB,EAGjB,KAAAC,gBAAkB,EAclB,KAAAC,UAAW,EACX,KAAAC,gBAAkB,GACT,KAAAC,YAAwB,GACxB,KAAAC,gBAA4B,GACrC,KAAAC,gBAAkB,GAonBlB,KAAAC,oBAAuB/pG,IAC1BA,GACD,OAAAyb,EAAA,GAAYzb,GAGdjC,KAAKyrG,gBAAiB,EACtBzrG,KAAKisG,SAASxpG,OACdypG,GAAA,EAAqBC,cAAa,IAG5B,KAAAC,gBAAkB,KACxB,MAAMC,EAAc,sBAAqB,YAAc,SACvDrsG,KAAKssG,mBAAmBlsG,UAAUkM,OAAO+/F,GAAa,IAGhD,KAAAE,iBAAmB,KACzB,MAAMF,EAAc,sBAAqB,YAAc,SACvDrsG,KAAKssG,mBAAmBlsG,UAAUkM,OAAO+/F,GAAa,IAOjD,KAAA3N,gBAAkB,CAACrnE,EAAuBr3B,KAAKqjF,YAAY98E,KAAKvG,MAAM,GAAOm0E,EAAW,IAAI1/B,QACjG,MAAM,OAACxtC,GAAUjH,KAAKosB,KAChBH,EAAajsB,KAAKosB,KAAKC,QAAQC,gBAC/Bi7E,EAAoB3+F,EAAA,QAAU6O,OAASxQ,GAAUA,EAAOw1B,UAAYz8B,KAAKkoF,gBAAgBskB,oBAAoBvlG,GAEnH,IAAI,GAAcktE,EAAW7f,IAC3B,IAAIroC,IACF,OAICqoC,GAD4C,IAAzB7f,KAAKC,MAAQ,IAAO,KAExC4f,OAAY5vD,GAGd1E,KAAK4+F,aAAetqC,EACpBj9B,IAEsB,cAAnBr3B,KAAKosB,KAAKjpB,MAAwBmxD,GACnC9oD,WAAW,KACLygB,KAIJjsB,KAAK8pF,aAAa2iB,cAAcxlG,IAC/B,IAEJsgG,GAAmB9oF,QAsThB,KAAAiuF,uBAAyB,KAC/B1sG,KAAK8rG,gBAAgBnmG,KAAK3F,KAAKknF,aAAajjF,WACrC,IAAMjE,KAAK+rG,gBAAkB/rG,KAAKknF,aAAajjF,WAGhD,KAAA0oG,SAAW,CAAC1qG,EAAUkB,EAAuBypG,KACnD,OAAAlvF,EAAA,GAAYzb,GAEZ,IAAI+B,EAAOhE,KAAKknF,aAAajjF,UAC7B,GAAGD,GAAQA,IAAS4oG,EAAU,CAC5B5sG,KAAK2rG,UAAW,EAEhB,IAAIkB,EAAgB,EACpB,EAAG,CACD3sG,SAASyzB,YAAYxwB,GAAM,EAAO,MAClC,MAAM2pG,EAAc9sG,KAAKknF,aAAajjF,UACtC,GAAGD,IAAS8oG,GACV,KAAKD,EAAgB,EACnB,WAGFA,EAAgB,EAGlB7oG,EAAO8oG,QACD9oG,IAAS4oG,GAEjB5sG,KAAK2rG,UAAW,IAmGZ,KAAAoB,uBAA0B9qG,IAEhC,MAAM+qG,EAA4C,CAChD,KAAQ,OACR,KAAQ,SACR,KAAQ,YACR,KAAQ,gBACR,KAAQ,aAGPhtG,KAAK8pF,aAAamjB,gBACnBD,EAAiB,KAAI,QAGvB,MAAM9qF,EAAOjgB,EAAEigB,KACTgrF,EAAgBF,EAAW9qF,GAejC,GAbkBhiB,SAAS8mD,eACdS,WAAWn8C,OAAOnJ,QAAU+qG,IAE3B,SAAThrF,EACDliB,KAAK8pF,aAAamjB,cAAcE,iBAEhCntG,KAAKktG,cAAcA,GAGrB,OAAAxvF,EAAA,GAAYzb,IAIF,SAATigB,EAAiB,CAClB,IAAIle,EAAOhE,KAAKknF,aAAajjF,UAE1BhC,EAAEmrG,SACAptG,KAAK6rG,YAAY1pG,SAClBnC,KAAK8rG,gBAAgBnmG,KAAK3B,GAC1BA,EAAOhE,KAAK6rG,YAAYnmG,MACxB1F,KAAK2sG,SAAS1qG,EAAG,OAAQ+B,GACzBA,EAAOhE,KAAKknF,aAAajjF,UACzBjE,KAAK4rG,gBAAkB5rG,KAAK6rG,YAAY1pG,OAAS6B,EAAO,GACxDhE,KAAK+rG,gBAAkB/nG,IAItBhE,KAAK8rG,gBAAgB3pG,QAAYnC,KAAK+rG,iBAAmB/nG,IAAShE,KAAK+rG,kBACxE/rG,KAAK6rG,YAAYlmG,KAAK3B,GACtBA,EAAOhE,KAAK8rG,gBAAgBpmG,MAC5B1F,KAAK2sG,SAAS1qG,EAAG,OAAQ+B,GAGzBhE,KAAK+rG,gBAAkB/rG,KAAK4rG,gBAAkB5rG,KAAKknF,aAAajjF,aAMhE,KAAAopG,eAAkBprG,I,MAexB,MAAOC,MAAOorG,EAAWr3D,SAAUs3D,EAAgB,SAAEjF,GAAYb,GAAsBznG,KAAKgjG,kBAAkBjhG,OAGxGG,EAAQ,IAAkBsrG,cAAcF,EAAWC,GAAkB,GACrEt3D,EAAW,IAAkBw3D,cAAcF,EAAkB,IAAkBG,cAAcxrG,IAIhGlC,KAAK4rG,kBAAoB5rG,KAAK2rG,UAAY3rG,KAAKknF,aAAajjF,YAAcjE,KAAK4rG,kBAChF5rG,KAAK4rG,gBAAkB,GACvB5rG,KAAK6rG,YAAY1pG,OAAS,GAG5B,MAAMwrG,IAA2G,QAAhB,EAAA3tG,KAAK2+F,mBAAW,eAAE7rF,QAASmjC,EAASruC,OAAO3F,GAAa,qBAARA,EAAEmF,GAAoC,yBAARnF,EAAEmF,GACjL,GAAGumG,EAAYxrG,OACb,IAAI,MAAMyuD,KAAU+8C,EAAa,CAC/B,IAAIj5F,EACJ,GAAgB,yBAAbk8C,EAAOxpD,EACRsN,EAAMk8C,EAAOl8C,SAIb,GAFAA,EAAM44F,EAAU7pG,MAAMmtD,EAAOlhC,OAAQkhC,EAAOlhC,OAASkhC,EAAOzuD,SAEvDuS,EAAIqlB,SAAS,aAAcrlB,EAAIqlB,SAAS,YAC3C,SAMJ,GAAG/5B,KAAKqrG,UAAY32F,EAAK,CACvB1U,KAAKqrG,QAAU32F,EAEf,MAAMvO,EAAUnG,KAAK4tG,kBAAoB,KAAWv0D,kBAAkB,sBAAuB,CAC3F3kC,QACC7T,KAAMsrB,IACPA,EAAUnsB,KAAKkrG,mBAAmB2C,YAAY1hF,GAC3CnsB,KAAK4tG,oBAAsBznG,IAASnG,KAAK4tG,uBAAoBlpG,GAC7D1E,KAAKqrG,UAAY32F,IACF,YAAfyX,EAAQ/kB,GAGTpH,KAAK8tG,WAAW,UAAW,OAAU3hF,EAAQkrE,WAAalrE,EAAQve,OAAS,UAAWue,EAAQ4K,aAAe5K,EAAQzX,KAAO,WACrH1U,KAAK+tG,UACZ/tG,KAAKwrG,gBAAkBr/E,GACfnsB,KAAKwrG,iBACbxrG,KAAKguG,oBAKX,WAEMhuG,KAAKqrG,UACbrrG,KAAKqrG,QAAU,UACRrrG,KAAK+tG,UACZ/tG,KAAKwrG,gBAAkB,KAEpBxrG,KAAK0hG,WACN1hG,KAAKiuG,aAELjuG,KAAK2hG,eAIT,GAAI2L,EAAUhiG,OAQP,CACL,MAAMkpC,EAAOC,KAAKC,MACfF,EAAOx0C,KAAKsrG,cAAgB,MAC7BtrG,KAAKsrG,aAAe92D,EACpBx0C,KAAKgqD,mBAAmBy2B,UAAUzgF,KAAKosB,KAAKnlB,OAAQ,CAACG,EAAG,kCAXvDpH,KAAKsrG,cACNtrG,KAAKgqD,mBAAmBy2B,UAAUzgF,KAAKosB,KAAKnlB,OAAQ,CAACG,EAAG,4BAGvDpH,KAAK8pF,aAAamjB,eACnBjtG,KAAK8pF,aAAamjB,cAActuE,OAUhC3+B,KAAKkuG,WACPluG,KAAKmuG,qBAGPnuG,KAAKouG,kBAAkBd,EAAWhF,EAAUryD,GAE5Cj2C,KAAKquG,iBA0EA,KAAAxwB,gBAAkB,CAACtkC,EAAel2C,KACvCrD,KAAKypG,cAAclwD,EAAO,IAAkB+0D,wBAAwB/0D,GAAQl2C,IAgHtE,KAAAkrG,eAAkBtsG,IAGxB,GAFA,OAAAyb,EAAA,GAAYzb,IAERjC,KAAKisG,UAAYjsG,KAAK8rD,YAAc9rD,KAAK0/F,gBAAkB1/F,KAAKwuG,YAAcxuG,KAAKkuG,UAClFluG,KAAK8rD,UACFrX,KAAKC,MAAQ10C,KAAK0rG,gBA3gDN,IA4gDd1rG,KAAKgsG,sBAELhsG,KAAKisG,SAASxpG,OAGhBzC,KAAKqjF,kBAEF,CACL,GAAGrjF,KAAKosB,KAAKnlB,OAAO42B,cAAgB79B,KAAKgqD,mBAAmBm8B,cAAcnmF,KAAKosB,KAAKnlB,OAAQjH,KAAKosB,KAAKthB,SAAU,cAE9G,YADAypB,GAphD0B,sDAwhD5Bv0B,KAAKqmF,UAAUjmF,UAAUC,IAAI,aAC7B,OAAAiqD,GAAA,KAEAtqD,KAAKisG,SAAS7rF,QAAQvf,KAAK,KACzBb,KAAKyuG,qBAAuB,GAA2BC,iBACvD1uG,KAAKyrG,gBAAiB,EAEtBzrG,KAAKqmF,UAAUjmF,UAAUC,IAAI,gBAC7BL,KAAK8rD,WAAY,EACjB9rD,KAAKquG,gBACLnC,GAAA,EAAqBC,cAAa,GAElC,MAAMwC,EAAmB,KACvB,IAAI,GAAU,sBAAuB,CACnC57E,aAAc,2BACd+D,mBAAoB,iCACpBlZ,QAAS,CAAC,CACRwW,QAAS,4BACTiD,SAAU,KACR,YAAmBr3B,KAAK4uG,mBAEzB,CACDx6E,QAAS,WACT6lC,UAAU,MAEXx7C,QAGLze,KAAK6uG,yBAA2B7uG,KAAK+N,eAAe1N,IAAIH,SAASiW,KAAjCnW,CAAuC,YAAciC,IAC/E,OAAA2c,GAAA,GAAgB3c,EAAE4S,OAAQ,eAAkB,OAAA+J,GAAA,GAAgB3c,EAAE4S,OAAQ,yBACxE,OAAA6I,EAAA,GAAYzb,GACZ0sG,MAED,CAACxjF,SAAS,EAAM7P,SAAS,IAE5BvM,EAAA,EAAwBoB,SAASnQ,KAAK8uG,wBAA0B,CAC9D3rG,KAAM,QACNiN,MAAO,KACL5E,WAAW,KACTmjG,KACC,IAEI,KAIX3uG,KAAK0rG,gBAAkBj3D,KAAKC,MAE5B,MAAMq6D,EAAyC/uG,KAAKisG,SAAS8C,WAGvDC,EAFUD,EAAW7lG,QAEF+lG,iBACzBF,EAAWG,QAAQF,GAEnBA,EAASG,QAAU,GAEnB,MAAMC,EAAgB,IAAInrF,WAAW+qF,EAASK,mBACxCvtG,EAA6B,IAAvBstG,EAAcjtG,OAE1B,IAAI8c,EAAI,KACN,IAAIjf,KAAK8rD,UAAW,OAEpBkjD,EAASM,qBAAqBF,GAE9B,IAAIz/E,EAAM,EACVy/E,EAAc9oG,QAAQpE,IACpBytB,GAAOztB,IAGT,IAAIwa,EAAWra,KAAKC,IAAI,EAAIqtB,EAAM7tB,EAXxB,KAcV9B,KAAKuvG,eAAe5sG,MAAMga,UAAY,SAASD,KAE/C,IAAImU,EAAO4jB,KAAKC,MAAQ10C,KAAK0rG,gBACzB/2E,EAAK9D,EAAO,IAEZ4hC,GAAa,GAAM5hC,EAAO,KAAOhP,WAAa,KAAO,KAAOxf,KAAKE,MAAMoyB,EAAK,KAAKlxB,OAAO,GAE5FzD,KAAKwvG,aAAajmF,UAAYkpC,EAE9B,aAAQxzC,IAGVA,MACCzS,MAAOvK,IACR,OAAOA,EAAEqH,MACP,IAAK,kBACHirB,GAAM,0CACN,MAGF,IAAK,mBACHA,GAAMtyB,EAAEmC,SACR,MAGF,QACEsI,QAAQC,MAAM,wBAAyB1K,EAAGA,EAAEqH,KAAMrH,EAAEmC,SACpDmwB,GAAMtyB,EAAEmC,SAIZpE,KAAKqmF,UAAUjmF,UAAUuB,OAAO,eAAgB,iBAK9C,KAAAqsG,eAAiB,CAAC/rG,EAAWo/F,KAKnC,GAJGp/F,GACD,OAAAyb,EAAA,GAAYzb,GAGXjC,KAAKwrG,gBAAiB,CACvB,MAAMH,EAAUrrG,KAAKqrG,QACrB,IAAIoE,GAAa,EAcjB,GAbGzvG,KAAK0hG,aAEJ1hG,KAAKiuG,aAGPwB,GAAa,GAIfzvG,KAAKqrG,QAAUA,EACfrrG,KAAK+tG,WAAY,EACjB/tG,KAAKwrG,gBAAkB,KAEpBiE,EAAY,OAGjB,GAAuB,SAApBzvG,KAAK0hG,aAA0BL,EAAO,CACvC,MAAMj9F,EAAUpE,KAAK2+F,YACfz8F,EAAQ,IAAkBsrG,cAAcxtG,KAAKgjG,kBAAkB9gG,MAAO,IAC5E,GAAGkC,EAAQA,UAAYlC,EAWrB,YAVA,IAAI,GAAU,kBAAmB,CAC/B0b,QAAS,CAAC,CACRwW,QAAS,wBACTiD,SAAU,KACRr3B,KAAKguG,oBAAetpG,GAAW,MAGnCoyB,mBAAoB,0BACnBrY,OAMPze,KAAK2hG,cACL3hG,KAAKquG,iBAGC,KAAAqB,cAAiBztG,IAGvB,GAFA,OAAAyb,EAAA,GAAYzb,GAER,OAAA2c,GAAA,GAAgB3c,EAAE4S,OAAQ,SAC9B,GAAuB,YAApB7U,KAAK0hG,WAA0B,CAChC,MAAM,gBAACiO,GAAmB3vG,KACvB2vG,GAAmB,wBAAuBA,EAAgB1vG,UAAUG,UAAUuR,SAAS,WACxF,aAAYg+F,EAAgB1vG,eAEF,UAApBD,KAAK0hG,WACb1hG,KAAKosB,KAAKu/D,aAAa3rF,KAAKyhG,cACA,SAApBzhG,KAAK0hG,YACb1hG,KAAKosB,KAAKu/D,aAAa3rF,KAAKkuG,YAhkD9BluG,KAAK+N,eAAiB,IAAI,IAGrB,YACL/N,KAAKqmF,UAAYnmF,SAASC,cAAc,OACxCH,KAAKqmF,UAAUjmF,UAAUC,IAAI,cAC7BL,KAAKqmF,UAAU1jF,MAAMC,QAAU,OAE/B5C,KAAK4vG,eAAiB1vG,SAASC,cAAc,OAC7CH,KAAK4vG,eAAexvG,UAAUC,IAAI,wBAElCL,KAAK0sD,YAAcxsD,SAASC,cAAc,OAC1CH,KAAK0sD,YAAYtsD,UAAUC,IAAI,eAAgB,sBAE/C,MAAMwvG,EAAOtX,KACbv4F,KAAK0sD,YAAY3iD,OAAO8lG,GAExB,MAAMjjD,EAAkB5sD,KAAK4sD,gBAAkB1sD,SAASC,cAAc,OACtEysD,EAAgBxsD,UAAUC,IAAI,eAAgB,qBAE9C,MAAMssD,EAAuBzsD,SAASC,cAAc,OACpDwsD,EAAqBvsD,UAAUC,IAAI,eAAgB,0BAEnDL,KAAK4vG,eAAe7lG,OAAO/J,KAAK0sD,YAAaE,EAAiBD,GAC9D3sD,KAAKqmF,UAAUt8E,OAAO/J,KAAK4vG,gBAE3B5vG,KAAK8vG,UAAY,EAAa,CAACziG,KAAM,aAAc7D,UAAW,+CAC9DxJ,KAAK4vG,eAAe7lG,OAAO/J,KAAK8vG,WAEhC,YAAiB9vG,KAAK8vG,UAAY7tG,IAChC,OAAAyb,EAAA,GAAYzb,GACZjC,KAAKosB,KAAKC,QAAQ0jF,iBACjB,CAAChiG,eAAgB/N,KAAK+N,iBAsEpB,uBACL/N,KAAKurG,cAActrG,UAAYC,SAASC,cAAc,OACtDH,KAAKurG,cAActrG,UAAUG,UAAUC,IAAI,iBAE3CL,KAAKurG,cAAcyE,QAAU,EAAW,IACxChwG,KAAKurG,cAAc0E,UAAY,EAAW,qBAAsB,CAACtiG,UAAU,IAE3E3N,KAAKurG,cAActrG,UAAU8J,OAAO/J,KAAKurG,cAAcyE,QAAShwG,KAAKurG,cAAc0E,WAInF,MAAMC,EAAoB,KACxBC,GAAmB,EACZnwG,KAAKowG,uBAGRC,EAAqB,KACzBF,GAAmB,GAGfR,EAAgD3vG,KAAK2vG,gBAAkB,GAC7E,IAAIQ,GAAmB,EACvB,MAAMG,EAA0C,CAC9CX,EAAgBpoF,WAAa,CAC3BrK,KAAM,kCACNC,QAAS+yF,EACT9yF,cAAe,IAAI,KAAc,CAACO,SAAS,KAE7CgyF,EAAgBY,WAAa,CAC3BrzF,KAAM,kCACNC,QAAS+yF,EACT9yF,cAAe,IAAI,KAAc,CAACO,SAAS,KAE7CgyF,EAAgBa,YAAc,CAC5BtzF,KAAM,wCACNC,QAASkzF,EACTjzF,cAAe,IAAI,KAAc,CAACO,SAAS,KAE7CgyF,EAAgBc,YAAc,CAC5BvzF,KAAM,wCACNC,QAASkzF,EACTjzF,cAAe,IAAI,KAAc,CAACO,SAAS,KAE7CgyF,EAAgBe,WAAa,CAC3BxzF,KAAM,oCACNC,QAAS,KACPnd,KAAK2wG,0BAEPtjG,KAAM,YAGJujG,EAAiBjB,EAAgB1vG,UAAY,GAAWqwG,EAAgBtwG,KAAK+N,gBAG7EqX,EAAWjd,MAAMC,KAAKwoG,EAAexrF,UAkD3C,GA9CM,CAAC,CACL6B,SAAU7B,EAAS3hB,MAAM,EAAG,GAC5B0H,SAAU,CAACjJ,EAAOD,KAChB,MAAM0b,KAAazb,EAChBiuG,IACDnwG,KAAK6wG,0BAA4BlzF,GAGnC,MAAMmzF,EAAa9wG,KAAKurG,cAActrG,UAAU4P,cAAc,gBAC9D,GAAGihG,EAAY,CACb,MAAM/gG,EAAK+gG,EAAWpwF,kBAChB1V,EAAI,UAAKg1F,QAAQhwF,IAAID,GACrB0kB,EAA2Bk7E,EAAgBpoF,WAAWnK,cAAcO,QAAU,yBAA2B,wBAC/G3S,EAAEuD,IAAMkmB,EACRzpB,EAAE+1B,YAGL,CACD9Z,SAAU7B,EAAS3hB,MAAM,EAAG,GAC5B0H,SAAWjJ,IACT,MAAMyb,KAAazb,EACnB,IAAIqG,EAEFA,EADCoV,QAA6CjZ,IAAlC1E,KAAK6wG,yBACb7wG,KAAK6wG,yBAA2BlB,EAAgBY,WAAaZ,EAAgBpoF,WAE7E5J,EAAUgyF,EAAgBpoF,WAAaooF,EAAgBY,WAG7DhoG,EAAE6U,cAAcO,SAAU,KAGvBrX,QAAQmmB,IACb,MAAMxsB,EAAYmyB,GAAU3F,EAAMxF,SAASxe,IAAIxG,IACtC,CACLhC,UAAWgC,EACXF,MAAOE,EAAE4N,cAAc,YAEvB4c,EAAMthB,UAEJolC,EAAKrwC,SAASC,cAAc,MAClCF,EAAU8J,OAAOwmC,GACjBqgE,EAAe7mG,OAAO9J,KAGxB2wG,EAAe7mG,OAAO4lG,EAAgBe,WAAW17F,UAE7C,sBAAoB,CACDhV,KAAK+wG,aAAe,IAAI,GAAc,CACzD/7F,QAAS47F,IAIbjB,EAAgBqB,WAAaV,EAAe7sG,MAAM,GAAI,GACtDzD,KAAKurG,cAActrG,UAAU8J,OAAO6mG,GAEpCjB,EAAgBqB,WAAW1qG,QAAQ,CAACiC,EAAGlE,KACrC,MAAM,MAACtC,GAASwG,EAAE6U,cAClBrb,EAAMoB,KAAO,QACbpB,EAAMuH,KAAOjF,EAAM,EAAI,SAAW,UAClCtC,EAAMG,MAAQ,OAAQmC,EAAM,KAK9BrE,KAAKixG,kBAAoB/wG,SAASC,cAAc,OAChDH,KAAKixG,kBAAkB7wG,UAAUC,IAAI,uBAErCL,KAAKssG,mBAAqB,EAAW,wBAAyB,CAAC3+F,UAAU,IAEzE3N,KAAKkxG,sBAAwBhxG,SAASC,cAAc,OACpDH,KAAKkxG,sBAAsB9wG,UAAUC,IAAI,2BAEnB,SAAnBL,KAAKosB,KAAKjpB,OACXnD,KAAKmxG,kBAAoBjxG,SAASC,cAAc,QAChDH,KAAKmxG,kBAAkB/wG,UAAUC,IAAI,QAAS,WAAY,iBAC1DL,KAAK8vG,UAAU/lG,OAAO/J,KAAKmxG,mBAE3BnxG,KAAKoxG,aAAe,EAAa,CAAC/jG,KAAM,UAAW7D,UAAW,6CAC9DxJ,KAAKqxG,qBAAuBnxG,SAASC,cAAc,QACnDH,KAAKqxG,qBAAqBjxG,UAAUC,IAAI,QAAS,WAAY,iBAC7DL,KAAKoxG,aAAarnG,OAAO/J,KAAKqxG,sBAC9BrxG,KAAK4vG,eAAe7lG,OAAO/J,KAAKoxG,cAEhC,YAAiBpxG,KAAKoxG,aAAenvG,IACnC,OAAAyb,EAAA,GAAYzb,GACZjC,KAAKgqD,mBAAmBsnD,gBAAgBtxG,KAAKosB,KAAKnlB,SACjD,CAAC8G,eAAgB/N,KAAK+N,iBAEzB/N,KAAKuxG,aAAe,EAAW,qCAAsC,CAAC5jG,UAAU,IAEhF,YAAiB3N,KAAKuxG,aAAetvG,IACnCjC,KAAK8pF,aAAa2iB,cAAczsG,KAAKosB,KAAKnlB,SACzC,CAAC8G,eAAgB/N,KAAK+N,iBAEzB/N,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAiB,EAAEiH,aACjDjH,KAAKosB,KAAKnlB,SAAWA,GAIxBjH,KAAKuxG,aAAanxG,UAAUuB,OAAO,UAGrC3B,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,mBAAoB,EAAEiH,aACpDjH,KAAKosB,KAAKnlB,SAAWA,GAIxBjH,KAAKgqD,mBAAmBivC,qBAAqBj5F,KAAKosB,KAAKnlB,QAAQpG,KAAKqB,IAClElC,KAAKuxG,aAAanxG,UAAUkM,OAAO,QAASpK,EAAMC,YAItDnC,KAAKwxG,qBAAuB,EAAW,wCAAyC,CAAC7jG,UAAU,IAC3F3N,KAAKyxG,cAAgB,IAAI,GAAc,CACrCp2E,SAAUr7B,KAAK0sD,YACf3+C,eAAgB/N,KAAK+N,eACrBi8C,mBAAoBhqD,KAAKgqD,mBACzB8/C,SAAU9pG,KAAKwxG,qBACfnrB,UAAWrmF,OAEbA,KAAK+N,eAAe1N,IAAIL,KAAKyxG,cAA7BzxG,CAA4C,OAAQ,IAAMA,KAAKwxG,qBAAqBpxG,UAAUC,IAAI,WAClGL,KAAK+N,eAAe1N,IAAIL,KAAKyxG,cAA7BzxG,CAA4C,QAAS,IAAMA,KAAKwxG,qBAAqBpxG,UAAUuB,OAAO,YAGxG3B,KAAK0xG,kBAAoB,CAAC,CACxBrkG,KAAM,QACN6P,KAAM,iCACNC,QAAS,KACPnd,KAAK2xG,UAAUzvG,MAAQ,GACvB,MAAM0vG,EAAS,IAAI,GAA4B5qF,KAAK,MACpDhnB,KAAK2xG,UAAUvuG,aAAa,SAAUwuG,GACtC5xG,KAAKkiG,eAAiB,QACtBliG,KAAK2xG,UAAU12E,SAEjBlmB,OAAQ,CAAC9N,EAAQ6D,IAAa9K,KAAKgqD,mBAAmBm8B,cAAcl/E,EAAQ6D,EAAU,eACrF,CACDuC,KAAM,WACN6P,KAAM,6BACNC,QAAS,KACPnd,KAAK2xG,UAAUzvG,MAAQ,GACvBlC,KAAK2xG,UAAUnuE,gBAAgB,UAC/BxjC,KAAKkiG,eAAiB,WACtBliG,KAAK2xG,UAAU12E,SAEjBlmB,OAAQ,CAAC9N,EAAQ6D,IAAa9K,KAAKgqD,mBAAmBm8B,cAAcl/E,EAAQ6D,EAAU,eACrF,CACDuC,KAAM,OACN6P,KAAM,OACNC,QAAS,KACP,IAAI,GAAgBnd,KAAKosB,MAAM3N,QAEjC1J,OAAQ,CAAC9N,EAAQ6D,IAAa7D,EAAO42B,aAAe79B,KAAKgqD,mBAAmBm8B,cAAcl/E,EAAQ6D,EAAU,gBAG9G9K,KAAK6xG,WAAa,GAAiB,CAAClkG,UAAU,EAAMI,eAAgB/N,KAAK+N,gBAAiB,WAAY/N,KAAK0xG,mBAC3G1xG,KAAK6xG,WAAWzxG,UAAUC,IAAI,cAAe,gBAC7CL,KAAK6xG,WAAWzxG,UAAUuB,OAAO,cAIjC3B,KAAKwvG,aAAetvG,SAASC,cAAc,OAC3CH,KAAKwvG,aAAapvG,UAAUC,IAAI,eAEhCL,KAAK2xG,UAAYzxG,SAASC,cAAc,SACxCH,KAAK2xG,UAAUxuG,KAAO,OACtBnD,KAAK2xG,UAAUG,UAAW,EAC1B9xG,KAAK2xG,UAAUhvG,MAAMC,QAAU,OAE/B5C,KAAKixG,kBAAkBlnG,UAAU,CAAC/J,KAAKssG,mBAAoBtsG,KAAKkxG,sBAAuBlxG,KAAKuxG,aAAcvxG,KAAKwxG,qBAAsBxxG,KAAK6xG,WAAY7xG,KAAKwvG,aAAcxvG,KAAK2xG,WAAW/pG,OAAOc,UAEhM1I,KAAK0sD,YAAY3iD,OAAO/J,KAAKurG,cAActrG,WAC3CD,KAAK+xG,6BAA+B,IAAI,GACxC/xG,KAAKgyG,eAAiB,IAAI,GAAehyG,KAAK0sD,YAAa1sD,KAAK+xG,8BAChE/xG,KAAKiyG,YAAc,IAAI,GAAYjyG,KAAK0sD,YAAa1sD,KAAK+xG,6BAA8B/xG,KAAMA,KAAKi9E,iBACnGj9E,KAAKkyG,eAAiB,IAAI,GAAelyG,KAAK0sD,YAAa1sD,KAAK+xG,6BAA8B/xG,KAAMA,KAAKosB,KAAKg8D,kBAAmBpoF,KAAKosB,KAAK87D,iBAC3IloF,KAAKmyG,eAAiB,IAAI,GAAenyG,KAAK0sD,YAAa1sD,KAAK+xG,6BAA8B/xG,KAAMA,KAAKosB,KAAKg8D,kBAAmBpoF,KAAKosB,KAAK87D,iBAC3IloF,KAAKoyG,aAAe,IAAI,GAAapyG,KAAK0sD,YAAa1sD,KAAK+xG,6BAA8B/xG,KAAKosB,KAAMpsB,KAAKkoF,gBAAiBloF,KAAKgkF,sBAChIhkF,KAAK0sD,YAAY3iD,OAAO/J,KAAKixG,mBAE7BjxG,KAAK4uG,gBAAkB,EAAW,wDAElC5uG,KAAKqyG,iBAAmBnyG,SAASC,cAAc,OAC/CH,KAAKqyG,iBAAiBjyG,UAAUC,IAAI,sBAEpCL,KAAKuvG,eAAiBrvG,SAASC,cAAc,OAC7CH,KAAKuvG,eAAenvG,UAAUC,IAAI,iBAElCL,KAAKsyG,QAAU,EAAW,2DAC1BtyG,KAAKsyG,QAAQ7wF,mBAAmB,aAAc,qMAO9CzhB,KAAKqyG,iBAAiBtoG,OAAO/J,KAAKuvG,eAAgBvvG,KAAKsyG,SAEjC,cAAnBtyG,KAAKosB,KAAKjpB,OACXnD,KAAKm/F,SAAW,IAAI,GAAS,CAC3BF,cAAe,KACbj/F,KAAKkgG,YAAa,EAClBlgG,KAAKqjF,eAEP6b,gBAAiB,KACfl/F,KAAK0+F,qBAAgBh6F,IAEvBqJ,eAAgB/N,KAAK+N,eACrBqxF,SAAU,WACVC,iBAAkBr/F,KAAKsyG,QACvBriG,OAAQ,KACEjQ,KAAK0/F,kBAAoB1oF,OAAOy0C,KAAKzrD,KAAKwuG,YAAYrsG,SAIlEnC,KAAKqyG,iBAAiBtoG,OAAO/J,KAAKm/F,SAASA,WAG7Cn/F,KAAK4vG,eAAe7lG,OAAO/J,KAAK4uG,gBAAiB5uG,KAAKqyG,kBAEtD,GAAkBtI,qBAAqB/pG,KAAKssG,mBAAoBtsG,KAAK+N,gBACrE/N,KAAK+N,eAAe1N,IAAI,GAAxBL,CAA2C,OAAQA,KAAKosG,iBACxDpsG,KAAK+N,eAAe1N,IAAI,GAAxBL,CAA2C,QAASA,KAAKusG,kBAEzDvsG,KAAKuyG,0BAWLvyG,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,mBAAoB,MAClDA,KAAKgyG,gBAAkBhyG,KAAKiyG,eAE7BjyG,KAAKwyG,cAAgB,GACrBxyG,KAAKouG,qBAQJpuG,KAAKgjG,mBACNhjG,KAAKgjG,kBAAkByP,gBAI3BzyG,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAiB,EAAEiH,SAAQ6D,WAAU4nG,QAAOrR,YAC1ErhG,KAAKosB,KAAKthB,WAAaA,GAAY9K,KAAKosB,KAAKnlB,SAAWA,GAC3DjH,KAAKqiF,SAASqwB,GAAO,EAAMrR,KAG7BrhG,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAkBosB,IAChDpsB,KAAKosB,OAASA,GACfpsB,KAAK2yG,cAIa,cAAnB3yG,KAAKosB,KAAKjpB,KACXnD,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,mBAAoB,EAAEiH,SAAQgB,WAC5DjI,KAAKosB,KAAKnlB,SAAWA,GAAUgB,EAAK8xB,SAAS/5B,KAAKkuG,YACnDluG,KAAK2I,kBAIT3I,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,iBAAkB,EAAEiH,SAAQQ,WAC1DzH,KAAKosB,KAAKnlB,SAAWA,IACnBQ,EAAKE,IAAI3H,KAAKkuG,YACfluG,KAAK2I,gBAGJ3I,KAAKyhG,cAAgBh6F,EAAKE,IAAI3H,KAAKyhG,eACpCzhG,KAAK2hG,YAAY,YAMzB,IACE3hG,KAAKisG,SAAW,IAAI,KAAS,CAG3B2G,kBAAmB,KACnBC,YAAa,EACbC,iBAAkB,EAClBC,cAAe,EACfC,aAAa,IAEf,MAAMvmG,GACNC,QAAQC,MAAM,8BAA+BF,GAG/CzM,KAAKquG,gBAELruG,KAAK+N,eAAe1N,IAAIL,KAAK2xG,UAA7B3xG,CAAwC,SAAWiC,IACjD,IAAIggG,EAAShgG,EAAE4S,OAA0CotF,MACrDA,EAAM9/F,SAIV,IAAI,GAAcnC,KAAKosB,KAAMjkB,MAAMC,KAAK65F,GAAOx+F,QAASzD,KAAKkiG,gBAC7DliG,KAAK2xG,UAAUzvG,MAAQ,MACtB,GAkBH,YAAiBlC,KAAKsyG,QAAStyG,KAAKuuG,eAAgB,CAACxgG,eAAgB/N,KAAK+N,eAAgBklG,gBAAgB,IAEvGjzG,KAAKisG,WACN,YAAiBjsG,KAAK4uG,gBAAiB5uG,KAAKgsG,oBAAqB,CAACj+F,eAAgB/N,KAAK+N,iBAEvF/N,KAAKisG,SAASiH,OAAS,KACrBlzG,KAAK8rD,WAAY,EACjB9rD,KAAKqmF,UAAUjmF,UAAUuB,OAAO,eAAgB,aAChD3B,KAAKquG,gBACLruG,KAAKuvG,eAAe5sG,MAAMga,UAAY,IAGxC3c,KAAKisG,SAASkH,gBAAmBC,IAgB/B,GAfGpzG,KAAKyuG,uBACNzuG,KAAKyuG,uBACLzuG,KAAKyuG,0BAAuB/pG,GAG3B1E,KAAK6uG,2BACN7uG,KAAK+N,eAAepM,OAAO3B,KAAK6uG,0BAChC7uG,KAAK6uG,8BAA2BnqG,GAG/B1E,KAAK8uG,0BACN//F,EAAA,EAAwB83F,WAAW7mG,KAAK8uG,yBACxC9uG,KAAK8uG,6BAA0BpqG,GAG9B1E,KAAKyrG,eACN,OAGF,MAAM,OAACxkG,EAAM,SAAE6D,GAAY9K,KAAKosB,KAC1Bq1E,EAAezhG,KAAKyhG,aAEpB5tF,GAAY4gC,KAAKC,MAAQ10C,KAAK0rG,iBAAmB,IAAO,EACxD2H,EAAW,IAAIC,KAAK,CAACF,GAAa,CAACjwG,KAAM,cAK/C+oG,GAAA,EAAqBqH,OAAOH,GAAY,GAAMvyG,KAAKwF,IAGjD6lG,GAAA,EAAqBC,cAAa,GAGlCnsG,KAAKgqD,mBAAmBwpD,SAASvsG,EAAQosG,EAAU,CACjDI,gBAAgB,EAChBlQ,SAAS,EACT1vF,WACAmQ,SAAU3d,EAAO2d,SACjB2/E,UAAWt9F,EAAOqO,IAClB+sF,eACA32F,WACAg9E,YAAY,IAGd9nF,KAAK2I,eAAc,GAAO,OAKhC,YAAiB3I,KAAKurG,cAAc0E,UAAWjwG,KAAKguG,eAAgB,CAACjgG,eAAgB/N,KAAK+N,iBAC1F,YAAiB/N,KAAKurG,cAActrG,UAAWD,KAAK0vG,cAAe,CAAC3hG,eAAgB/N,KAAK+N,iBAEzF/N,KAAKmuG,mBAAqBz5E,GAAS,IAAM10B,KAAK2yG,YAAa,MAAM,GAAO,GAGnE,yBACL,MAAM1yG,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAUC,IAAI,oBAExBL,KAAK0zG,iBAAmB,YAAO,gEAAiE,CAACrmG,KAAM,UACvGpN,EAAU8J,OAAO/J,KAAK0zG,kBAEtB,MAAMC,EAAgB1zG,EAAUysC,WAAU,GAC1C1sC,KAAK4zG,qBAAuBD,EAAc/hD,WAC1C5xD,KAAK4sD,gBAAgB7iD,OAAO4pG,GAE5B3zG,KAAK+N,eAAe1N,IAAIL,KAAK0zG,iBAA7B1zG,CAA+C,QAAS,KACtD,MAAMiH,EAASjH,KAAKosB,KAAKnlB,OAEzB,IAAI,GAAgBA,EAAQ,GAAG,EAAM,KACnCjH,KAAKosB,KAAK09D,aAAax+C,QAAQ,MAG/B,MAAMuoE,EAAe7zG,KAAKosB,KAAK09D,aAAa19D,KACzCynF,EAAavoB,OAAOC,eACrBsoB,EAAavoB,OAAOC,cAAcuoB,uBAAuBxnG,QAAO,OAKtEtM,KAAK0sD,YAAY3iD,OAAO9J,GAExBD,KAAKqmF,UAAUjmF,UAAUC,IAAI,eAC7BL,KAAK0sD,YAAYtsD,UAAUC,IAAI,eAuB1B,eAAeg3B,GACpB,MAA0B,cAAnBr3B,KAAKosB,KAAKjpB,MAAwBnD,KAAK0+F,gBAAgBrnE,IAAW,IAASA,KAAY,GAiCzF,iBACL,MAAMxrB,EAAS7L,KAAKgqD,mBAAmBkqC,cAAcl0F,KAAKosB,KAAKnlB,QACzDtC,EAAQkH,aAAM,EAANA,EAAQkoG,aAItB,GAHA/zG,KAAKmxG,kBAAkB5nF,UAAY,IAAM5kB,GAAS,IAClD3E,KAAKmxG,kBAAkB/wG,UAAUkM,OAAO,aAActM,KAAKorG,wBAAwBhmE,iBAAiBplC,KAAKosB,KAAKnlB,QAAQ,IAEnHjH,KAAKqxG,sBAA2C,SAAnBrxG,KAAKosB,KAAKjpB,KAAiB,CACzD,MAAM6wG,KAAgBnoG,aAAM,EAANA,EAAQooG,uBAC9Bj0G,KAAKqxG,qBAAqB9nF,UAAYyqF,EAAc,GAAMnoG,EAA4B,sBAAI,GAC1F7L,KAAKoxG,aAAahxG,UAAUkM,OAAO,aAAc0nG,IAI9C,YACL,IAAIh0G,KAAKosB,KAAKnlB,QAAUjH,KAAKkuG,WAAgC,cAAnBluG,KAAKosB,KAAKjpB,KAAsB,OAE1E,MAAM,MAACjB,EAAK,SAAE+zC,GAAY,OAAAirD,GAAA,GAAalhG,KAAKgjG,kBAAkBjhG,OAE9D,IAAI2wG,GACDxwG,EAAMC,QAAUnC,KAAKyhG,gBACtBiR,EAAQ,CACNtrG,EAAG,eACH+gB,KAAM,cAAM,GAAQnoB,KAAKmrG,kBAAkB72D,iBAC3ClwC,QAASlC,EACT+zC,SAAUA,EAAS9zC,OAAS8zC,OAAWvxC,EACvC4S,OAAQ,CACN48F,WAAYl0G,KAAK+tG,WAEnB3iB,gBAAiBprF,KAAKyhG,eAI1BzhG,KAAKqoF,iBAAiB8rB,UAAUn0G,KAAKosB,KAAKnlB,OAAQjH,KAAKosB,KAAKthB,SAAU4nG,GAGjE,UAGL1yG,KAAK+N,eAAeO,YAGf,QAAQ8lG,GAAY,GACrBp0G,KAAKosB,KAAKnlB,SACZjH,KAAKqmF,UAAU1jF,MAAMC,QAAU,OAC/B5C,KAAK8vG,UAAU1vG,UAAUC,IAAI,SAG/B0mD,KAEA/mD,KAAKsrG,aAAe,EAEjBtrG,KAAKknF,eACNlnF,KAAKq0G,aACLD,GAAap0G,KAAK2hG,eAIf,SAAS+Q,EAAwB4B,GAAa,EAAMjT,GAAQ,GACjE,SAAKA,IAAU,OAAA3B,GAAA,GAAa1/F,KAAKknF,eAAqC,cAAnBlnF,KAAKosB,KAAKjpB,QAEzDuvG,IACFA,EAAQ1yG,KAAKqoF,iBAAiBksB,SAASv0G,KAAKosB,KAAKnlB,OAAQjH,KAAKosB,KAAKthB,YAyBlE9K,KAAKgjG,kBAAkB9gG,QAAUwwG,EAAM8B,UAAYx0G,KAAKyhG,eAAiBiR,EAAMtnB,mBAE/EkpB,GACDt0G,KAAK2hG,cAGP3hG,KAAK+tG,UAAY2E,EAAMp7F,OAAO48F,WAC3BxB,EAAMtnB,iBACPprF,KAAKotF,iBAAiBslB,EAAMtnB,iBAG9BprF,KAAKy0G,cAAc/B,EAAM8B,SAAUF,EAAYA,IACxC,IAlCAjT,IAIErhG,KAAKosB,KAAKnsB,UAAUG,UAAUuR,SAAS,qBACxC3R,KAAK0Q,IAGP1Q,KAAKgjG,kBAAkB0R,UAAUliG,YAAc,GAC/CxS,KAAKgjG,kBAAkByP,aAAY,IAEjCzyG,KAAKosB,KAAKC,QAAQ28D,sBAAwBnmF,QAAQoD,WAA4BpF,KAAK,KACnF,aAAQ,KACNb,KAAK2I,sBAKJ,IAmBN,mBACL,MAAM1B,EAASjH,KAAKosB,KAAKnlB,QAEnB,gBAAC0oG,EAAe,aAAE4B,EAAY,cAAEE,EAAa,SAAEtS,EAAQ,UAAE2Q,EAAS,UAAEzpB,GAAarmF,KACvFqmF,EAAU1jF,MAAMC,QAAU,GAE1B,MAAM40B,EAAcx3B,KAAK46E,gBAAgBpjD,YAAYvwB,GAmBrD,GAlBA6oG,EAAU1vG,UAAUkM,OAAO,eAAgBkrB,GAC3Cs4E,EAAU1vG,UAAUuB,OAAO,QAExB3B,KAAKmxG,mBACNnxG,KAAKytF,iBAGe,WAAnBztF,KAAKosB,KAAKjpB,MACXkjF,EAAUjmF,UAAUkM,OAAO,UAAWtM,KAAK46E,gBAAgBkhB,cAAc70F,IAIxE0oG,IACD3vG,KAAK6wG,0BAA2B,EAChClB,EAAgBa,YAAYpzF,cAAc1Z,kBAAiB,GAC3DisG,EAAgBpoF,WAAWnK,cAAc1Z,kBAAiB,IAGzD6tG,EAAc,CACfA,EAAanxG,UAAUC,IAAI,QAC3B,MAAM4rB,EAAajsB,KAAKosB,KAAKC,QAAQC,gBACrCtsB,KAAKgqD,mBAAmBivC,qBAAqBhyF,GAAQpG,KAAKoH,IACpDgkB,KACJslF,EAAanxG,UAAUkM,OAAO,QAASrE,EAAK9F,UAI7CsvG,GACDA,EAAcnmE,QAAQrkC,GAGrBk4F,GACDA,EAASgB,UAAUl5F,GAGlBjH,KAAKknF,aACNlnF,KAAK4tF,qBACG5tF,KAAK0zG,mBACV1zG,KAAK46E,gBAAgBkhB,cAAc97F,KAAKosB,KAAKnlB,SAC9CjH,KAAK0zG,iBAAiB3pG,OAAO,eAAK,wBAClC/J,KAAK4zG,qBAAqB7pG,OAAO,eAAK,0BAEtC/J,KAAK0zG,iBAAiB3pG,OAAO,eAAK,yBAClC/J,KAAK4zG,qBAAqB7pG,OAAO,eAAK,2BAKrC,qBACL,MAAM,UAACs8E,EAAS,WAAEwrB,EAAU,aAAE3qB,GAAgBlnF,MACxC,OAACiH,EAAM,SAAE6D,GAAY9K,KAAKosB,KAC1BioE,EAAWr0F,KAAKgqD,mBAAmBm8B,cAAcl/E,EAAQ6D,GAC/Du7E,EAAUjmF,UAAUC,IAAI,iBACxBgmF,EAAUjmF,UAAUkM,OAAO,aAAc+nF,GACpChO,EAAUp9C,WACfo9C,EAAUjmF,UAAUuB,OAAO,iBAE3B,MAAMqJ,EAAI,UAAKg1F,QAAQhwF,IAAIk3E,GAC3B,GAAGl8E,EAAG,CACJ,IAAIuD,EAEFA,EADCzD,EACK,UACE9K,KAAK46E,gBAAgBpjD,YAAYvwB,GACnC,mBACEjH,KAAKgqD,mBAAmB2qD,mBAAmB1tG,GAC7C,kBAEA,UAGL+D,EAAEuD,MAAQA,IACXvD,EAAEuD,IAAMA,EACRvD,EAAE+1B,UAIN,MAAMliB,EAAU7e,KAAK0xG,kBAAkB9pG,OAAOiT,IAC5C,MAAMsH,EAAOtH,EAAO9F,OAAO9N,EAAQ6D,GAEnC,OADA+P,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAAS6V,GAClCA,IAGLkyE,GAGFnN,EAAa9jF,aAAa,kBAAmB,QAC7CpD,KAAKqiF,cAAS39E,GAAW,GAErBwiF,EAAajjF,WACfjE,KAAKgjG,kBAAkByP,eANzBvrB,EAAa1jD,gBAAgB,mBAU/BquE,EAAW9/E,gBAAgB,YAAalT,EAAQ1c,QAChD0vG,EAAWzxG,UAAUkM,OAAO,gBAAiBuS,EAAQ1c,QACrDnC,KAAKquG,gBAGC,0BACN,MAAMuG,EAAgB50G,KAAKgjG,kBAC3BhjG,KAAKgjG,kBAAoB,IAAI,IAAW,CACtCp2F,YAAa,UACbtD,KAAM,UACN8F,SAAS,IAGXpP,KAAKgjG,kBAAkBjhG,MAAM3B,UAAUoD,QAAQ,oBAAqB,uBACpExD,KAAKgjG,kBAAkB0R,UAAUt0G,UAAUoD,QAAQ,oBAAqB,uBACxExD,KAAKknF,aAAelnF,KAAKgjG,kBAAkBjhG,MAC3C/B,KAAKknF,aAAa9mF,UAAUC,IAAI,gBAChCL,KAAK60G,8BAEF,MACD,OAAAC,GAAA,GAA6B90G,KAAKknF,cAGjC0tB,GACDA,EAAc7yG,MAAMgnB,YAAY/oB,KAAKgjG,kBAAkBjhG,OACvD6yG,EAAcF,UAAU3rF,YAAY/oB,KAAKgjG,kBAAkB0R,YAE3D10G,KAAKkxG,sBAAsBnnG,OAAO/J,KAAKgjG,kBAAkBjhG,MAAO/B,KAAKgjG,kBAAkB0R,WAInF,8BACN10G,KAAK+N,eAAe1N,IAAIL,KAAKknF,aAA7BlnF,CAA2C,UAAYiC,IACrD,MAAMsM,EAAMtM,EAAEsM,IACd,GAAG,OAAAwmG,GAAA,GAAsB9yG,GACvB,OAAAyb,EAAA,GAAYzb,GACZjC,KAAKqjF,mBACA,GAAGphF,EAAE+yG,SAAW/yG,EAAEgzG,QACvBj1G,KAAK+sG,uBAAuB9qG,QACvB,IAAY,WAARsM,GAA4B,aAARA,KAAwBtM,EAAEmrG,SAGvD,GAFAnrG,EAAE8Y,iBAES,WAARxM,EAAkB,CACnB,MAAM83D,EAAQnmE,SAASwnD,cACjBniB,EAAMh6B,OAAOy7C,eAEnBqf,EAAM6uC,SAASl1G,KAAKknF,aAAaihB,WAAW,IAAMnoG,KAAKknF,aAAc,GACrE7gB,EAAM8uC,UAAS,GAEf5vE,EAAI2hB,kBACJ3hB,EAAI6vE,SAAS/uC,QAEb,OAAAg8B,GAAA,GAAgBriG,KAAKknF,gBAKxB,uBACD,YAAiBlnF,KAAKknF,aAAejlF,IACnCjC,KAAK8pF,aAAa37E,UAAU,GAE5B,GAAkB7B,QAAO,IACxB,CAACyB,eAAgB/N,KAAK+N,iBA8B3B/N,KAAK+N,eAAe1N,IAAIL,KAAKknF,aAA7BlnF,CAA2C,QAASA,KAAKqtG,gBACzDrtG,KAAK+N,eAAe1N,IAAIL,KAAKknF,aAA7BlnF,CAA2C,QAAS,KAClDA,KAAKouG,sBAGe,SAAnBpuG,KAAKosB,KAAKjpB,MAAsC,eAAnBnD,KAAKosB,KAAKjpB,MACxCnD,KAAK+N,eAAe1N,IAAIL,KAAKknF,aAA7BlnF,CAA2C,UAAW,KACjDA,KAAKosB,KAAKC,QAAQthB,WAAW5F,UAAU2X,QACxC9c,KAAKgqD,mBAAmBqrD,eAAer1G,KAAKosB,KAAKnlB,OAAQjH,KAAKosB,KAAKthB,YAqCpE,cAAc3H,EAAoBwuD,GACvC,MAAM2jD,EAAsE,CAC1EC,KAAM,OACNC,OAAQ,SACRC,UAAW,YACXC,cAAe,gBACfC,UAAW,IAAMz1G,SAASyzB,YAAY,YAAY,EAAO,aACzDwE,KAAMw5B,EAAO,IAAMzxD,SAASyzB,YAAY,cAAc,EAAOg+B,GAAQ,IAAMzxD,SAASyzB,YAAY,UAAU,EAAO,OAGnH,IAAI2hF,EAAYnyG,GACd,OAAO,EAGT,MAAMkmG,EAAUiM,EAAYnyG,GAItByyG,EAAe51G,KAAK0sG,yBACpBmJ,EAAkB,GAuCxB,GAFAA,EAASlwG,KAAKzF,SAASyzB,YAAY,gBAAgB,EAAO,SAE9C,cAATxwB,EAAsB,CACvB,IAAI2yG,GAAe,EAGnB,MAAM3nE,EAAY5iC,OAAOy7C,eACzB,IAAI7Y,EAAU4nE,YAAa,CACzB,MAAM1vC,EAAQl4B,EAAUs5C,WAAW,GAC7BuuB,EAAM,KAAa7yG,GAEnBqiB,EAAO6gD,EAAM4vC,yBACfzwF,EAAK1E,WAA2B+F,QAAQmvF,EAAIpjG,QAAW4S,aAAgB4B,aAAe5B,EAAKqB,QAAQmvF,EAAIpjG,UACzGkjG,GAAe,GAMhBA,EACDD,EAASlwG,KAAKzF,SAASyzB,YAAY,YAAY,EAAO,WAEtDkiF,EAASlwG,KAAyB,mBAAd,EAA2B0jG,IAAYnpG,SAASyzB,YAAY01E,GAAS,EAAO,YAGlGwM,EAASlwG,KAAyB,mBAAd,EAA2B0jG,IAAYnpG,SAASyzB,YAAY01E,GAAS,EAAO,OAWlG,OARAwM,EAASlwG,KAAKzF,SAASyzB,YAAY,gBAAgB,EAAO,UAG1DiiF,IACG51G,KAAK8pF,aAAamjB,eACnBjtG,KAAK8pF,aAAamjB,cAAciJ,yBAG3B,EAmKF,cAAcC,EAAoBC,EAA8BC,GAAW,GAChF,MAAOn0G,MAAOo0G,EAAS,SAAEhO,EAAQ,SAAEryD,GAAYwxD,GAAsBznG,KAAKknF,cACpE3iC,EAAM+jD,GAAY,EAAIA,EAAWgO,EAAUn0G,OAC3C2kB,EAASwvF,EAAU/N,OAAO,EAAGhkD,GAC7BstB,EAASykC,EAAU/N,OAAOhkD,GAE1B19B,EAAUwvF,EAAWvvF,EAAOlU,MAAM,GAAU2jG,uBAAyB,KAErEC,EAAa3vF,EAAUA,EAAQvK,OAASuK,EAAQ,GAAG1kB,OAAS0kB,EAAQ,GAAG1kB,QAAU2kB,EAAO3kB,OAExFs0G,EADY3vF,EAAOrjB,MAAM,EAAG+yG,GACLL,EAAatkC,EAGpC6kC,EAAc,IAAkBhJ,cAAc4I,GACpD,IAAkB7I,cAAcx3D,EAAUygE,GAG1C,MAAMC,EAAeP,EAAe/zG,KAAKP,IAAIs0G,EAAaj0G,OAAQg0G,EAAWh0G,QAAUg0G,EAAWh0G,OAC5Fy0G,EAA+B,GAClCR,IACDQ,EAAYjxG,KAAKywG,GACjBA,EAAa1mF,OAAS8mF,GAIxB,MAAM3lF,EAAOhK,EAAU8vF,EAAe9vF,EAAQ,GAAG1kB,OAASw0G,EAC1D1gE,EAAS3vC,QAAQsqD,IACZA,EAAOlhC,QAAU8mF,IAClB5lD,EAAOlhC,QAAUmB,KAIrB,IAAkB48E,cAAcx3D,EAAU2gE,GAEqB,CAC7D,MAAMC,EAAgD,CACpDzvG,EAAG,qBACHsoB,OAAQ8mF,EAAaG,EACrBx0G,OAAQ,GAGV,IAAI20G,EAAqB,EACzB,IAAI,IAAI30G,EAAS8zC,EAAS9zC,OAAQ20G,EAAqB30G,IAAU20G,EAAoB,CAEnF,GADe7gE,EAAS6gE,GACdpnF,OAASmnF,EAAYnnF,OAC7B,MAIJumB,EAASxxC,OAAOqyG,EAAoB,EAAGD,GAKzC,MAAM30G,EAAQ,IAAkBwpE,cAAc+qC,EAAU,CAACxgE,aACzDj2C,KAAKgjG,kBAAkBt/F,iBAAiBxB,GAAO,GAE/C,MAAM60G,EAAQ/2G,KAAKknF,aAAar3E,cAAc,iBAC3CknG,KC39CQ,SAAoBvxF,GAGjC,MAAMwxF,EAAexxF,EAGrB,GAAqB,KAFrBA,EAAOA,EAAKyxF,iBAEJx5B,SAAgB,CACtB,MAAMy5B,EAAUh3G,SAASi3G,eAAe,IACxC3xF,EAAK1E,WAAWC,aAAam2F,EAAUF,EAAa5+C,aAAe4+C,EAAa5+C,YAAYqlB,WAAaj4D,EAAKi4D,SAA0Bu5B,EAAa5+C,YAA5B4+C,GACzHxxF,EAAO0xF,EAGT,GAAG3rG,OAAOy7C,cAAgB9mD,SAASwnD,YAAa,CAC9C,MAAM2e,EAAQnmE,SAASwnD,cACpBliC,IACD6gD,EAAM+wC,cAAc5xF,GACpB6gD,EAAMgxC,WAAW7xF,GACjB6gD,EAAM6uC,SAAS1vF,EAAMA,EAAKk4D,UAAUv7E,SAGtCkkE,EAAM8uC,UAAS,GAEf,MAAM5vE,EAAMh6B,OAAOy7C,eACnBzhB,EAAI2hB,kBACJ3hB,EAAI6vE,SAAS/uC,IDo8CXixC,CAAWP,GACXA,EAAMp1G,UAIR3B,KAAKqtG,iBAWC,kBAAkBnrG,EAAgBomG,EAAmBryD,GAG3D,QAAavxC,IAAVxC,EAAqB,CACtB,MAAM+c,EAAIwoF,GAAsBznG,KAAKgjG,kBAAkBjhG,OAAO,GAC9DG,EAAQ+c,EAAE/c,MACVomG,EAAWrpF,EAAEqpF,SACbryD,EAAWh3B,EAAEg3B,SAOf,IAJiB,IAAdqyD,IACDA,EAAWpmG,EAAMC,aAGHuC,IAAbuxC,EAAwB,CACzB,MAAMshE,EAAS,IAAkB/J,cAActrG,EAAO+zC,GAAU,GAChEA,EAAW,IAAkBw3D,cAAcx3D,EAAU,IAAkBy3D,cAAc6J,IAKvF,GAFAr1G,EAAQA,EAAMqmG,OAAO,EAAGD,GAErBtoG,KAAKwyG,gBAAkBtwG,EACxB,OAGFlC,KAAKwyG,cAAgBtwG,EAErB,MAAM2kB,EAAU3kB,EAAM0Q,MAAM,GAAU2jG,uBACtC,IAAIiB,EACJ,GAAG3wF,EAAS,CACV,MAAM+pC,EAAS3a,EAAS,GAExB,IAAIrrC,EAAQic,EAAQ,GACpB,MAAM4hF,EAAY79F,EAAM,GAExB,GAAG5K,KAAKgyG,gBACNppG,EAAA,QAAUw1B,SAASkb,SAASm+D,SAC5Bz3G,KAAKgqD,mBAAmBm8B,cAAcnmF,KAAKosB,KAAKnlB,OAAQjH,KAAKosB,KAAKthB,SAAU,kBAC9D,wBAAd8lD,aAAM,EAANA,EAAQxpD,IAA8BwpD,EAAOzuD,SAAWD,EAAMC,SAAWyuD,EAAOlhC,OAChF8nF,EAAcx3G,KAAKgyG,eACnBhyG,KAAKgyG,eAAe0F,cAAcx1G,QAC7B,GAAiB,MAAdumG,EAAmB,CAC3B,MAAMiB,EAAW1pG,KAAKosB,KAAKthB,SAAW9K,KAAKsoF,sBAAsB/F,mBAAmBviF,KAAKosB,KAAKthB,eAAYpG,EACvG1E,KAAKmyG,eAAenH,WAAWpgG,EAAO5K,KAAKosB,KAAKnlB,OAAOw1B,SAAW,KAAez8B,KAAKosB,KAAKnlB,OAAQyiG,KACpG8N,EAAcx3G,KAAKmyG,qBAEZtrF,EAAQ,IAAoB,MAAd4hF,EAIf7/F,EAAA,QAAUw1B,SAASmb,MAAMk+D,UACjC7sG,EAAQA,EAAMpH,QAAQ,OAAQ,IAC1BtB,EAAM0Q,MAAM,mBAAsB1Q,EAAM0Q,MAAM,uBAAwBhI,IACxE4sG,EAAcx3G,KAAKiyG,YACnBjyG,KAAKiyG,YAAYjH,WAAWpgG,EAAO69F,KAPlCzoG,KAAKkyG,eAAelH,WAAWpgG,EAAO5K,KAAKosB,KAAKnlB,UACjDuwG,EAAcx3G,KAAKkyG,gBAWzBsF,EAAcx3G,KAAK23G,wBAAwBz1G,EAAOs1G,GAElDx3G,KAAK+xG,6BAA6B7K,iBAAiBsQ,GAG7C,wBAAwBt1G,EAAes1G,GAC7C,IAAII,GAAkB,EAEtB,IAAIJ,EAAa,CACf,MAAMK,EAAc31G,EAAM0Q,MAAM,4BAChC,GAAGilG,EAAa,CACd,MAAMhiF,EAAWgiF,EAAY,GACvBjtG,EAAQ1I,EAAMuB,MAAMo0G,EAAY,GAAG11G,QACzCy1G,EAAkBC,EAAY,GAAG11G,SAAWD,EAAMC,OAElDq1G,EAAcx3G,KAAKoyG,aAEfpyG,KAAK83G,aAKP,aAAc93G,KAAK83G,aAAc,QAAQ,EAAM,MAJ/C93G,KAAK83G,aAAe,EAAW,8CAA+C,CAACnqG,UAAU,IACzF,aAAa3N,KAAK83G,cAAc,GAChC93G,KAAKkxG,sBAAsBpgG,cAAciQ,aAAa/gB,KAAK83G,aAAc93G,KAAKkxG,sBAAsB94C,cAKtGp4D,KAAKoyG,aAAapH,WAAWhrG,KAAKosB,KAAKnlB,OAAQ4uB,EAAUjrB,GAAO/J,KAAK,EAAEwjC,OAAMsd,oBACxEi2D,GAAmBvzE,EAAK89C,yBACzBniF,KAAKknF,aAAa96E,QAAQ2rG,kBAAoB1zE,EAAK89C,wBAGrDxgC,EAAc9gD,KAAK,KACjB,aAAcb,KAAK83G,aAAc,QAAQ,EAAO,SAEjDtrG,MAAMwZ,GAAA,IAcb,OAVI4xF,UACK53G,KAAKknF,aAAa96E,QAAQ2rG,kBAGhCP,IAAgBx3G,KAAKoyG,cACnBpyG,KAAK83G,cACN,aAAc93G,KAAK83G,aAAc,QAAQ,EAAO,KAI7CN,EAgMD,yBACN,GAAGx3G,KAAKg4G,qBAAsB,OAC9Bh4G,KAAKg4G,sBAAuB,EAE5B,MAAM/J,EAAajuG,KAAKiuG,WACxBjuG,KAAK2hG,cACL3hG,KAAKquG,gBACL,IAAIh1E,GAAW,EACD,IAAI,GAAa,YAAKr5B,KAAKwuG,YAAa,KACpDn1E,GAAW,IAGPr4B,iBAAiB,QAAS,KAC9BhB,KAAKg4G,sBAAuB,EAExB3+E,GACF40E,MAKC,WAAWgK,GAAc,EAAMC,GAAY,EAAMC,EAAa,IACnE,GAAGj4G,SAASsnF,gBAAkBxnF,KAAKknF,cAAgB,oBAAkB,CACnE,MAAMl8E,EAAI9K,SAASC,cAAc,SACjCD,SAASiW,KAAKpM,OAAOiB,GACrB,OAAAotG,GAAA,GAAqBptG,GACrBhL,KAAKgjG,kBAAkBt/F,iBAAiBy0G,GACxC,OAAAC,GAAA,GAAqBp4G,KAAKknF,cAC1Bl8E,EAAErJ,cAEF3B,KAAKgjG,kBAAkBt/F,iBAAiBy0G,GAGvC,wBAODn4G,KAAK4rG,gBAAkB,GACvB5rG,KAAK6rG,YAAY1pG,OAAS,EAC1BnC,KAAK8rG,gBAAgB3pG,OAAS,EAC9BnC,KAAK+rG,gBAAkB,IAGzB,IAAIp3F,GAAM,EACPsjG,IACDtjG,EAAM3U,KAAKqiF,cAAS39E,GAAW,KAG7BiQ,GAAOujG,GACTl4G,KAAKqtG,iBAIF,eACL,OAAO,OAAA3N,GAAA,GAAa1/F,KAAKknF,cAGpB,gBACL,IAAI75E,EAEJ,MAAMqyF,EAAe1/F,KAAK0/F,eAEPryF,EAAhBrN,KAAKkuG,UAAkB,QACjBluG,KAAKisG,UAAYjsG,KAAK8rD,YAAc4zC,GAAgB1/F,KAAKwuG,WAAsC,cAAnBxuG,KAAKosB,KAAKjpB,KAAuB,WAAa,OACvH,SAEZ,CAAC,OAAQ,SAAU,OAAQ,YAAYmD,QAAQ0E,IAC7ChL,KAAKsyG,QAAQlyG,UAAUkM,OAAOtB,EAAGqC,IAASrC,KAGzChL,KAAKuxG,cACNvxG,KAAKuxG,aAAanxG,UAAUkM,OAAO,OAAQozF,GAG1C1/F,KAAKwxG,sBACNxxG,KAAKwxG,qBAAqBpxG,UAAUkM,OAAO,OAAQozF,GAIhD,cAAc2U,GAAa,EAAMgE,GAChB,cAAnBr4G,KAAKosB,KAAKjpB,MACXnD,KAAKgqD,mBAAmBqrD,eAAer1G,KAAKosB,KAAKnlB,OAAQjH,KAAKosB,KAAKthB,UAAU,GAG/E9K,KAAK4+F,kBAAel6F,EACpB1E,KAAKkgG,gBAAax7F,EAElB,MAAMxC,EAAQlC,KAAKgjG,kBAAkB9gG,MACpB,IAAkBwrG,cAAcxrG,GACkB0F,OAAOgpD,GAAuB,uBAAbA,EAAOxpD,GAC7Ed,QAAQsqD,IACpB,MAAMrX,EAAQ,aAAoBqX,EAAO0nD,SACzCt4G,KAAKi9E,gBAAgBs7B,gBAAgBh/D,KAGpC86D,IACDr0G,KAAKqrG,QAAU,UACRrrG,KAAK+tG,UACZ/tG,KAAKwrG,gBAAkB,KACvBxrG,KAAKq0G,eAGJgE,GAAchE,IACfr0G,KAAK2hG,cAGP3hG,KAAKquG,gBAGA,YAAYhN,GAAQ,GACzB,MAAM,UAAC6M,EAAS,KAAE9hF,GAAQpsB,KAC1B,GAAiB,cAAdosB,EAAKjpB,OAAyBk+F,IAAU6M,EAEzC,YADAluG,KAAK0+F,kBAIP,MAAM,SAAC5zF,EAAQ,OAAE7D,GAAUmlB,GACrB,aAACq1E,EAAY,UAAEsM,EAAS,WAAE7N,EAAU,aAAEtB,GAAgB5+F,MAEtD,MAACkC,EAAK,SAAE+zC,GAAY,OAAAirD,GAAA,GAAalhG,KAAKgjG,kBAAkBjhG,OAG9D,GAAGmsG,EAAW,CACZ,MAAM9pG,EAAUpE,KAAK2+F,YACrB,IAAGz8F,EAAMoJ,SAAUlH,EAAQ0O,MAUzB,YAFA,IAAI,GAAoB7L,EAAQ,CAACinG,GAAY9hF,EAAKjpB,MAPlDnD,KAAKgqD,mBAAmB20C,YAAYv6F,EAASlC,EAAO,CAClD+zC,WACA83D,UAAWA,IAGb/tG,KAAK2I,qBAMCzG,EAAMoJ,SACdtL,KAAKgqD,mBAAmBm5B,SAASl8E,EAAQ/E,EAAO,CAC9C+zC,WACAwrD,aAAcA,EACd32F,SAAUA,EACVijG,UAAWA,EACXyK,QAASx4G,KAAK4tG,uBAAoBlpG,EAAY1E,KAAKwrG,gBACnD5M,aAAcA,EACd5C,OAAQkE,EACRpY,YAAY,IAGd9nF,KAAK2I,eAAc,GAAO,IAK5B,GAAG3I,KAAKwuG,WAAY,CAClB,MAAMA,EAAa,YAAKxuG,KAAKwuG,YAC7BhjG,WAAW,KACT,IAAI,MAAMkgD,KAAc8iD,EACtBxuG,KAAKgqD,mBAAmByuD,gBAAgBxxG,EAAQykD,EAAWvkC,WAAYqnF,EAAW9iD,GAAa,CAC7FswC,OAAQkE,EACRtB,aAAcA,EACd8Z,WAAY14G,KAAK2vG,iBAAmB3vG,KAAK2vG,gBAAgBY,WAAWnzF,cAAcO,QAClFg7F,aAAc34G,KAAK44G,uBAInB12G,GACFlC,KAAK2I,iBAEN,IAMA,wBAAwBzI,EAA+BmhG,GAAQ,EAAOvZ,GAAa,G,MAGxF,MAAM5nD,EAAyB,aAF/BhgC,EAAWF,KAAKk9F,eAAehpF,OAAOhU,IAEhBiD,KAAqB,gBAAqC,QAAlBjD,EAASiD,KAAiB,YAAc,aACtG,OAAGnD,KAAKosB,KAAKnlB,OAAO42B,cAAgB79B,KAAKgqD,mBAAmBm8B,cAAcnmF,KAAKosB,KAAKnlB,OAAQjH,KAAKosB,KAAKthB,SAAUo1B,IAC9G3L,GAx3D4B,uDAy3DrB,GAGa,cAAnBv0B,KAAKosB,KAAKjpB,MAAyBk+F,IAKnCnhG,IACDF,KAAKgqD,mBAAmBwpD,SAASxzG,KAAKosB,KAAKnlB,OAAQ/G,EAAU,CAC3DqjG,SAAS,EACT9B,aAAczhG,KAAKyhG,aACnB32F,SAAU9K,KAAKosB,KAAKthB,SACpBkxF,OAAQh8F,KAAKkgG,WACbtB,aAAc5+F,KAAK4+F,aACnB9W,WAAYA,QAAcpjF,IAE5B1E,KAAK2I,cAAcm/E,GAAY,GAEV,YAAlB5nF,EAASiD,OACmB,QAA7B,KAAkB0jF,mBAAW,SAAEnG,kBAAkBxgF,KAG5C,IAnBPF,KAAK0+F,gBAAgB,IAAM1+F,KAAK0lE,wBAAwBxlE,GAAU,EAAM4nF,KACjE,GAwBH,sBACN,MAAM,gBAAC6nB,GAAmB3vG,KAC1B,IAAI2vG,EAAiB,OAAO,EAC5B,MAAMkJ,EAA2BlJ,EAAgBc,YAAYrzF,cAC7D,OAAQy7F,EAAyBl7F,SAC/B,OAAA8iB,GAAA,GAAUo4E,EAAyBrnG,MAAO,QAAQpR,UAAUuR,SAAS,QAGjE,qBACN,OAAQ3R,KAAKowG,sBAeR,mBAAmBvpG,GACxB,MAAMzC,EAA2BpE,KAAKosB,KAAKg4B,WAAWv9C,GAEtD,IAAI9E,EAAQ,IAAkB2pE,cAActnE,EAAQA,QAAS,CAAC6xC,SAAU7xC,EAAQysD,gBAChF,MAAM32B,EAAI,KACR,MAAM4+E,EAAgB94G,KAAKgqD,mBAAmB99B,oBAAoB9nB,OAASM,EAAW,CAACN,EAAQyC,MAC/F7G,KAAK8tG,WAAW,OAAQ5zE,EAAG,eAAK,mBAAoB4+E,EAAe/2G,EAAOqC,GAE1EpE,KAAKkuG,UAAYrnG,EACjB7G,KAAK2+F,YAAcv6F,EACnBrC,OAAQ2C,GAEVw1B,IAGK,oBAAoB6+E,GACzB,MAAM7+E,EAAI,KAER,MAAM8+E,EAAchiG,OAAOy0C,KAAKstD,GAAiBtwG,IAAIijD,GAAcA,EAAWvkC,YACxE8xF,EAAoB,IAAIp1G,IAC9B,IAAI1B,EAAS,EAAG+2G,EAA6B,EAE7CF,EAAY1yG,QAAQolD,IAClB,MAAMzjD,EAAO8wG,EAAgBrtD,GAC7BzjD,EAAK3B,QAAQO,I,MACX,MAAMzC,EAA2BpE,KAAKgqD,mBAAmBxwC,iBAAiBkyC,EAAY7kD,KACnE,QAAhB,EAAAzC,EAAQq1E,gBAAQ,eAAE2e,YAAch0F,EAAQwH,QAAWxH,EAAQqvE,UAG5DwlC,EAAK54G,IAAI,IAAM+D,EAAQwH,QAFvBqtG,EAAK54G,IAAI,IAAM+D,EAAQq1E,SAAS2e,WAK/Bh0F,EAAQ0O,OAAS1O,EAAQA,WACxB80G,IAIN/2G,GAAU8F,EAAK9F,SAGjB,MAAMixD,EAAgB6lD,EAAKn5G,KAAO,EAC5Bq5G,EAAa,IAAIF,GAAMxwG,IAAIwwG,IAC/B,MAAM91G,EAAO81G,EAAK,GAElB,GADAA,EAAOA,EAAKx1G,MAAM,GACN,MAATN,EAAc,CACf,MAAM8D,EAASgyG,EAAK9xF,WACpB,OAAOlgB,IAAW2B,EAAA,QAAU6O,KAAO,eAAK,8BAAgC,IAAI,KAAU,CAACxQ,SAAQ4E,QAAQ,EAAOunD,kBAAgBp+C,QAE9H,OAAOo+C,EAAgB6lD,EAAKj5D,MAAM,KAAK,GAAKi5D,KAI1C,gBAACtJ,GAAmB3vG,KACb,OAAAygC,GAAA,GAAUkvE,EAAgBa,YAAYpzF,cAAc5L,MAAO,QACnEpR,UAAUkM,OAAO,QAAS4sG,GAC/B,MAAMzI,EAAcd,EAAgBc,YAAYrzF,cAAcO,QAC3Du7F,GAA8BzI,EAC/Bd,EAAgBY,WAAWnzF,cAAc1Z,kBAAiB,QAChBgB,IAAlC1E,KAAK6wG,2BACZ7wG,KAAK6wG,yBAA2BlB,EAAgBY,WAAaZ,EAAgBpoF,YAAYnK,cAAc1Z,kBAAiB,GAG3H,MAAM01G,EAAwBzJ,EAAgBpoF,WAAWnK,cAAcO,QAAU,yBAA2B,wBACtG/P,EAAQ,eAAKwrG,EAAU,CAACj3G,IAExBk3G,EAAen5G,SAAS22B,yBAO9B,IAAIyiF,EAA+BC,EACnC,GAPGJ,EAAWh3G,OAAS,EACrBk3G,EAAatvG,UAAU,eAAKovG,GAAY,IAExCE,EAAatvG,OAAOovG,EAAW,GAAI,eAAK,WAAY,CAACA,EAAWh3G,OAAS,KAIjD,IAAvB62G,EAAY72G,OAAc,CAC3B,MAAMupD,EAAastD,EAAY,GACzB/wG,EAAO8wG,EAAgBrtD,GAI7B,GAHA4tD,EAAet5G,KAAKgqD,mBAAmBxwC,iBAAiBkyC,EAAYzjD,EAAK,IAEzEsxG,IAAmBD,EAAajtB,WAC7BktB,EAAgB,CACjB,MAAMC,EAAYx5G,KAAKgqD,mBAAmBihC,iBAAiBquB,IACxDE,EAAUr3G,SAAWA,GAAUq3G,EAAU/oG,KAAK5J,IAAQoB,EAAK8xB,SAASlzB,OACrE0yG,GAAiB,IAKvB,MAAMhoD,EAAmBrxD,SAAS22B,yBAElC,GAAG0iF,GAA6B,IAAXp3G,EAAc,CACjC,MAAM8F,EAAO8wG,EAAgBC,EAAY,IACnCF,EAAgB94G,KAAKgqD,mBAAmB99B,oBAAoBotF,OAAc50G,EAAWuD,GAC3FspD,EAAiBxnD,OACfsvG,EALc,KAOdP,QAGFvnD,EAAiBxnD,OACf,eAAK,+BAXS,KAadsvG,GAIJ,IAAII,EAAWz5G,KAAK8tG,WAAW,UAAW5zE,EAAGtsB,EAAO2jD,GAEpDo+C,EAAgBqB,WAAW1qG,QAAQ,CAACiC,EAAGlE,KACrC,MAAM6Y,EAAO3U,EAAEgV,YACTm8F,EAAyB,UAAK1Z,QAAQhwF,IAAIkN,GAChDw8F,EAAKzrG,KAAO,CAAC5J,EAAM,EAAI20G,EAAY72G,OAAS+2G,GAC5CQ,EAAK34E,WAGJ/gC,KAAK+wG,cACN/wG,KAAK+wG,aAAahH,qBAAqB0P,EAAUz5G,KAAK+N,gBAGxD/N,KAAKwuG,WAAauK,GAGpB7+E,IAGK,iBAAiBrzB,GACtB,GAAG7G,KAAKyhG,eAAiB56F,EACvB,OAGF,IAAIzC,EAAmBpE,KAAKosB,KAAKg4B,WAAWv9C,GAC5C,MAAMqzB,EAAI,KACR,IAAIy/E,EACa,iBAAdv1G,EAAQgD,GACTuyG,EAAc,eAAK,WAEnB35G,KAAKosB,KAAK49B,mBAAmB+wB,kBAAkB/6E,KAAKosB,KAAKnlB,OAAQJ,GAAKhG,KAAM+4G,IACvE55G,KAAKyhG,eAAiB56F,IAIzBzC,EAAUw1G,EACO,iBAAdx1G,EAAQgD,EACTpH,KAAK2hG,YAAY,SAEjBznE,QAIJy/E,EAAc,IAAI,KAAU,CAC1B1yG,OAAQ7C,EAAQwH,OAChBC,QAAQ,IACPmJ,QAGLhV,KAAK8tG,WAAW,QAAS5zE,EAAGy/E,EAAav1G,GAAYA,EAA4BA,aAASM,EAAWN,GACrGpE,KAAKyhG,aAAe56F,GAEtBqzB,IAGK,YAAY/2B,GACM,SAApBnD,KAAK0hG,YAAkC,SAATv+F,GAC/BnD,KAAKq0G,aAGJlxG,IACDnD,KAAKqrG,QAAU,UACRrrG,KAAK+tG,UACZ/tG,KAAKwrG,gBAAkB,MAGb,UAATroG,IACDnD,KAAKyhG,kBAAe/8F,EACpB1E,KAAKwuG,gBAAa9pG,GAGpB1E,KAAKkuG,UAAYluG,KAAK2+F,iBAAcj6F,EACpC1E,KAAK0hG,WAAa1hG,KAAKiuG,gBAAavpG,EAEjC1E,KAAKosB,KAAKnsB,UAAUG,UAAUuR,SAAS,sBACxC5C,EAAA,EAAwB6B,aAAa,gBACrC5Q,KAAKosB,KAAKnsB,UAAUG,UAAUuB,OAAO,oBACrC3B,KAAK0Q,KAID,IAEN,aAAc1Q,KAAKosB,KAAKnsB,UADN,sBAC4B,EAAM,IAAK,KACvDD,KAAKosB,KAAKnsB,UAAUG,UAAUuB,OAFd,wBAMb,cAAcO,EAAeiI,GAAQ,EAAMsB,GAAQ,GACpDvJ,IAAOA,EAAQ,IAEhBiI,EAAOnK,KAAKq0G,YAAW,GAAO,EAAOnyG,GACnClC,KAAKgjG,kBAAkBt/F,iBAAiBxB,GAE7C,aAAQ,KACNuJ,GAAS,OAAA42F,GAAA,GAAgBriG,KAAKknF,cAC9BlnF,KAAKqtG,iBACLrtG,KAAKknF,aAAa1+C,UAAYxoC,KAAKknF,aAAan3B,eAI7C,WACL5sD,EACA02G,EACAjsG,EAAyC,GACzC8d,EAA4C,GAC5C3pB,EACAqC,GAEA,GAAGpE,KAAKwrG,iBAA4B,UAATroG,EACzB,OAGU,YAATA,IACDnD,KAAK2hG,YAAYx+F,GACjBnD,KAAK0hG,WAAav+F,EAClBnD,KAAKiuG,WAAa4L,GAGpB,MAAMC,EAAc95G,KAAKurG,cAActrG,UACjC85G,EAAWD,EAAY1oE,iBAAiB5B,uBACxCwqE,EAAYD,EAAS35G,UAAUuR,SAAS,SAE9C3R,KAAKurG,cAAcyE,QAAQjnF,YAAY/oB,KAAKurG,cAAcyE,QAAU,GAAqB,YAAT7sG,EAAqB,OAASA,GAAQ,qBAAsB,CAACwK,UAAU,KACvJ,MAAM8rG,EAAWp2D,GAAUz1C,EAAO8d,EAAUtnB,GAkC5C,OAjCG41G,EACDD,EAAShxF,YAAY0wF,GAErBK,EAAY/4F,aAAa04F,EAAUK,EAAY1oE,kBAG7CpxC,KAAKosB,KAAKnsB,UAAUG,UAAUuR,SAAS,sBACzC3R,KAAKosB,KAAKnsB,UAAUG,UAAUC,IAAI,oBAClCL,KAAK0Q,KAQH,cACF3B,EAAA,EAAwBoB,SAAS,CAC/BhN,KAAM,eACNiN,MAAO,KACLpQ,KAAKguG,yBAKEtpG,IAAV3C,GACD/B,KAAKy0G,cAAc1yG,GAGrByJ,WAAW,KACTxL,KAAKquG,iBACJ,GAEIoL,GA/qEM,GAAAlD,sBAAwB,yDE3E1B,MAAM,GAenB,YAAYvzG,GAJF,KAAAi3G,UAAW,EAanB,YAAWj6G,KAAMgD,GAEjB,MAAM,cAACk3G,EAAa,UAAE1wG,GAAaxJ,KACnCk6G,EAAcj6G,UAAUG,UAAUC,IA9Bf,mBA8BmC,QACtD65G,EAActsG,MAAMxN,UAAUC,IAAI85G,0BAClCD,EAAcxuF,SAAStrB,UAAUC,IAAI85G,6BACrCD,EAAcrsG,QAAQzN,UAAUC,IAAI85G,4BAEpCn6G,KAAKo6G,SAAWl6G,SAASC,cAAc,UACvCH,KAAKo6G,SAASh6G,UAAUC,IAAI85G,yBAA2B,UAAU3wG,UAAmB,WAAY,eAEhGxJ,KAAK4gB,QAAU1gB,SAASC,cAAc,OACtCH,KAAK4gB,QAAQxgB,UAAUC,IAAI85G,4BAC3B,OAAA78F,GAAA,QAAOtd,KAAK4gB,SAEZ5gB,KAAKq6G,aAAen6G,SAASC,cAAc,OAC3CH,KAAKq6G,aAAaj6G,UAAUC,IAAI85G,kCAChCn6G,KAAKq6G,aAAatwG,OAAO/J,KAAKo6G,UAE9Bp6G,KAAK4gB,QAAQ7W,UAAU5B,MAAMC,KAAK8xG,EAAcj6G,UAAUmlB,UAAWplB,KAAKq6G,cAE1EH,EAAcj6G,UAAU8J,OAAO/J,KAAK4gB,SAEpC5gB,KAAKs6G,mBAAmBt6G,KAAKo6G,UAGxB,mBAAmBr2G,GACxB,YAAiBA,EAAO9B,IACtB,OAAAyb,EAAA,GAAYzb,KAEVjC,KAAK6Q,QAAU7Q,KAAK6Q,UAAY,OAAShO,QAAQoD,SAAQ,IAAOpF,KAAK05G,IAClEA,GACDv6G,KAAKsM,QAAO,MAGf,CAACyB,eAAgB/N,KAAK+N,iBAGpB,OAAO4wB,GACZ,MAAMw5D,EAAWn4F,KAAKk6G,cAAcj6G,UAAUG,UAAUuR,SAAS,QACjE,QAAYjN,IAATi6B,EACDA,GAAQw5D,OACH,GAAGx5D,IAASw5D,EACjB,OAKF,MAAMqiB,GAAcx6G,KAAKi6G,UAAY12F,EAAA,EAAWC,YAAcmb,EAG9D3+B,KAAKk6G,cAAcj6G,UAAUG,UAAUkM,OAAO,cAAekuG,GAC7Dx6G,KAAKk6G,cAAcj6G,UAAUG,UAAUkM,OAAO,OAAQqyB,GAEtD3+B,KAAKsrF,OAAOrrF,UAAUG,UAAUkM,OAAO,qBAAsBkuG,GAC7Dx6G,KAAKsrF,OAAOrrF,UAAUG,UAAUkM,OAAO,aAAatM,KAAKwJ,mBAAoBm1B,GAU7E3+B,KAAKsrF,OAAOmvB,cACZz6G,KAAKsrF,OAAOovB,gBAGP,KAAK9sG,EAAgD8d,EAAmDtnB,GAC7GpE,KAAKk6G,cAAcj6G,UAAUmM,QAAQnF,OAAS,GAAK7C,EAAQ6C,OAC3DjH,KAAKk6G,cAAcj6G,UAAUmM,QAAQvF,IAAM,GAAKzC,EAAQyC,IACxD7G,KAAKk6G,cAAc1uF,KAAK5d,EAAO8d,EAAUtnB,GACzCpE,KAAKsrF,OAAOovB,iBChGD,MAAM,WAAkB,GAKrC,YAAsBpvB,EAA8Bl/D,EAAsB49B,GACxE/mD,MAAM,CACJqoF,SACAl/D,OACAre,eAAgBu9E,EAAOv9E,eACvBvE,UAAW,QACX0wG,cAAe,IAAI3uF,GACjB,eACA,CAAC3d,EAAgD8d,KAC/C,OAAAnf,EAAA,GAAevM,KAAKk6G,cAActsG,MAAOA,GACzC,OAAArB,EAAA,GAAevM,KAAKk6G,cAAcxuF,SAAUA,KAGhD7a,QAAS,KACP,GAA2BpO,QAE7Bw3G,UAAU,IAhBQ,KAAA3uB,SAA8B,KAAAl/D,OAAsB,KAAA49B,qBAmBxEhqD,KAAKk6G,cAAczuF,OAAO9pB,SAE1B,MAAMg5G,EAAS,EAAW,mBAAoB,CAAChtG,UAAU,IACnDitG,EAAS,EAAW,eAAgB,CAACjtG,UAAU,IAErDgtG,EAAO12G,UAAY,yKACnB22G,EAAO32G,UAAY,iLAEnB,MAAM42G,EAAc,CAAC92G,EAAmBszB,KACtC,YAAiBtzB,EAAO9B,IACtB,OAAAyb,EAAA,GAAYzb,GACZo1B,KACC,CAACtpB,eAAgB/N,KAAKsrF,OAAOv9E,kBAGlC8sG,EAAYF,EAAQ,KAClB,GAA2B/1G,aAG7Bi2G,EAAYD,EAAQ,KAClB,GAA2B/1G,SAG7B7E,KAAK86G,SAAW,EAAW,GAAI,CAACntG,UAAU,IAC1C3N,KAAK86G,SAAS16G,UAAUC,IAAI,SAAU,mBAAoB,SAC1Dw6G,EAAY76G,KAAK86G,SAAU,KACzB,GAA2BxuG,WAE7BtM,KAAK4gB,QAAQnB,QAAQzf,KAAK4gB,QAAQF,kBAAmBi6F,EAAQ36G,KAAK86G,SAAUF,GAE5E56G,KAAK8hB,eAAiB,IAAI,GAAe9hB,KAAK+N,gBAAgB,GAC9D,MAAMgtG,EAA8B76G,SAASC,cAAc,OAC3D46G,EAA4B36G,UAAUC,IAAI,2BAC1C06G,EAA4BhxG,OAAO/J,KAAK8hB,eAAe7hB,WACvD,MAAM+6G,EAAS96G,SAASC,cAAc,OACtC66G,EAAO56G,UAAUC,IAAI,8BACrBL,KAAK8hB,eAAerB,IAAIrgB,UAAUC,IAAI,sBAAuB,UAC7DL,KAAK8hB,eAAerB,IAAIhB,QAAQu7F,GAChCh7G,KAAK8hB,eAAerB,IAAI1W,OAAOgxG,GAC/B/6G,KAAKq6G,aAAa56F,QAAQzf,KAAK8hB,eAAerB,KAE9C,MAAMw6F,EAAkB/6G,SAASC,cAAc,OAC/C86G,EAAgB76G,UAAUC,IAAI,iCAE9BL,KAAK6oB,aAAe,IAAI,QAAkBnkB,OAAWA,GAAW,GAAM,GACtE1E,KAAK6oB,aAAa5oB,UAAUG,UAAUC,IAAI,yBAC1C46G,EAAgBlxG,OAAO/J,KAAK6oB,aAAa5oB,WACzCD,KAAK4gB,QAAQG,aAAak6F,EAAiBj7G,KAAKq6G,cAEhDr6G,KAAKsrF,OAAOv9E,eAAe1N,IAAIuI,EAAA,QAA/B5I,CAA0C,aAAc,EAAEiU,MAAK7P,UAAS0O,YACtE,IAAIlF,EAA6B8d,EACjB,UAAbzX,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,MAC7ByK,EAAQ,IAAI,KAAU,CAAC3G,OAAQ7C,EAAQwH,SAASoJ,QAGhD0W,EAAW,aAAmBtnB,EAAQ+jB,QAEtCva,EAAQqG,EAAIuU,YAAcvU,EAAIwU,SAC9BiD,EAAWzX,EAAIgU,gBAAkB,eAAK,uBAGxCjoB,KAAK6oB,aAAavT,SAASxC,GAE3B9S,KAAKwrB,KAAK5d,EAAO8d,EAAUtnB,GAC3BpE,KAAK86G,SAAS16G,UAAUC,IAAI,aAC5BL,KAAKsM,QAAO,KAGdtM,KAAKsrF,OAAOv9E,eAAe1N,IAAIuI,EAAA,QAA/B5I,CAA0C,cAAe,KACvDA,KAAK86G,SAAS16G,UAAUuB,OAAO,eAGjC3B,KAAKsrF,OAAOv9E,eAAe1N,IAAIuI,EAAA,QAA/B5I,CAA0C,aAAc,KACtDA,KAAKsM,QAAO,MCrHlB,IAAK4uG,IAAL,SAAKA,GACH,kBACA,kBACA,sBACA,mBACA,mBALF,CAAKA,QAAW,KAYD,MAAMC,GAArB,cAYU,KAAAC,SAAW,CAAC7gG,EAAWE,EAAW/Z,EAAeC,EAAgBszC,IAChE,IAAI15B,KAAKE,EAAIw5B,KAAUA,KAAUA,WAAgBvzC,OAAWC,EAAS,EAAIszC,KAAUA,KAAUA,YAAiBvzC,OAG/G,KAAA26G,YAAc,CAAClsG,EAAYmsG,EAAmB32G,KAGpD,IAAI4b,EAAI,GAKJ,GAAa,IAAV5b,EACL4b,EAAIvgB,KAAKo7G,SAAS,EAAG,EA5Bb,EA4BuBE,EARlB,GAQuCt7G,KAAKo7G,SAAS,EAAGE,EAAYC,EA5BzE,EA4ByFD,EARpF,QAUb,IAAI,IAAItwG,EAAI,EAAGA,EAAIrG,IAASqG,EAC1BuV,GAAKvgB,KAAKo7G,SAAS,GAAIE,EAhCnB,GAgCsCtwG,EA/BpC,EA+B8CswG,EAXzC,GAyBf,OAVIt7G,KAAKw7G,WACPx7G,KAAKw7G,SAAWt7G,SAAS2jB,gBAAgB,6BAA8B,YACvE7jB,KAAKy7G,KAAOv7G,SAAS2jB,gBAAgB,6BAA8B,QAEnE7jB,KAAKw7G,SAASzxG,OAAO/J,KAAKy7G,OAG5Bz7G,KAAKw7G,SAASrsG,GAAKA,EACnBnP,KAAKy7G,KAAK33F,eAAe,KAAM,IAAKvD,GAE7BvgB,KAAKw7G,UAGN,KAAAE,aAAe,CAAC/2G,EAAe2X,KACrC,IAAIg/F,EAaJ,OAZG32G,GAAS,EACV22G,EAAYJ,GAAYS,IACN,IAAVh3G,EACR22G,EAAYJ,GAAYU,IACN,IAAVj3G,EACR22G,EAAYJ,GAAYW,MACN,IAAVl3G,EACR22G,EAAYJ,GAAYY,KAChBn3G,EAAQ,IAChB22G,EAAYJ,GAAYa,MAGnBT,GAGD,KAAAU,cAAgB,CAACr3G,EAAe2X,KACtC,IAAI2/F,EAaJ,OAZGt3G,GAAS,EACVs3G,EAAaf,GAAYS,IACP,IAAVh3G,EACRs3G,EAAaf,GAAYU,IACP,IAAVj3G,EACRs3G,EAAaf,GAAYW,MACP,IAAVl3G,EACRs3G,EAAaf,GAAYY,KACjBn3G,EAAQ,IAChBs3G,EAAaf,GAAYa,MAGpBE,GAGD,KAAAC,kBAAoB,CAAC5/F,EAAeg/F,EAAmB32G,IAChD,IAAVA,EACM,EACW,IAAVA,EACA2X,EAAYg/F,EAvFd,EAuFU,EAGL,IAAV32G,EACG2X,EAEgB,IAAVA,EACDg/F,EA9FH,EAiGa,EAAZA,EAAgBC,EAAU,EALxB,GAODD,EAnGF,GAmGqBh/F,EAIvB,KAAA6/F,mBAAqB,CAAC7/F,EAAe3X,EAAe22G,EAAmBc,IAC1Ez3G,GAAS,GAIT2X,GAAS,EAHH,EAKCA,GAAU3X,EAAQ,EACnBy3G,EAAclB,GAAYS,IAAML,GAIjCh/F,EAAQ,GAAKg/F,EAnHb,EAmHyBh/F,EAI3B,KAAA+/F,eAAiB,CAAC13G,EAAe22G,IAChC32G,GAAS,EAAIu2G,GAAYS,IAAML,EAAY32G,EAxH1C,GAwHyDA,EAAQ,GAGpE,OAAOA,EAAe2X,GAS3B,GARItc,KAAKyrB,SACPzrB,KAAKyrB,OAASvrB,SAASC,cAAc,OACrCH,KAAKyrB,OAAOrrB,UAAUC,IA5HT,yBA8HbL,KAAK4gB,QAAU1gB,SAASC,cAAc,OACtCH,KAAKyrB,OAAO1hB,OAAO/J,KAAK4gB,UAGb,IAAVjc,EAOD,OANG3E,KAAK2E,QAAUA,IAChB3E,KAAK4gB,QAAQpX,UAAY,kCACzBxJ,KAAKyrB,OAAOrrB,UAAUuB,OAAO,8BAC7B3B,KAAK4gB,QAAQ3c,UAAYjE,KAAK4gB,QAAQje,MAAMuT,QAAU,IAGjDlW,KAAKyrB,OAGd,MAAM6vF,EAAYt7G,KAAK07G,aAAa/2G,EAAO2X,GACrC2/F,EAAaj8G,KAAKg8G,cAAcr3G,EAAO2X,GACvC8/F,EAAcp8G,KAAKq8G,eAAe13G,EAAO22G,GAEzCgB,EAAa,YAAY33G,EACzB62G,EAAWx7G,KAAKq7G,YAAYiB,EAAYhB,EAAW32G,GAEnD43G,EAAiBv8G,KAAKk8G,kBAAkB5/F,EAAOg/F,EAAW32G,GAC1D63G,EAAkBx8G,KAAKm8G,mBAAmB7/F,EAAO3X,EAAO22G,EAAWc,GAwCzE,OAtCAp8G,KAAKyrB,OAAOrrB,UAAUkM,OAAO,6BAAsB3H,EAAQ,GAExD2X,GAAS,GACVtc,KAAKyrB,OAAOrrB,UAAUC,IAAI,eAC1BL,KAAKyrB,OAAOrrB,UAAUuB,OAAO,aACrB2a,GAAU3X,EAAQ,GAC1B3E,KAAKyrB,OAAOrrB,UAAUC,IAAI,YAC1BL,KAAKyrB,OAAOrrB,UAAUuB,OAAO,gBAE7B3B,KAAKyrB,OAAOrrB,UAAUC,IAAI,WAAY,eAGxCL,KAAK4gB,QAAQpX,UAAY,gCACzBxJ,KAAK4gB,QAAQje,MAAMuT,QAAU,mBAAmBomG,2BAAoCF,+BAAyCI,QAEzHx8G,KAAK4jB,MACP5jB,KAAK4jB,IAAM1jB,SAAS2jB,gBAAgB,6BAA8B,OAClE7jB,KAAK4jB,IAAIE,eAAe,KAAM,SAAU,KACxC9jB,KAAK4jB,IAAIE,eAAe,KAAM,QAAS,KAEvC9jB,KAAKy8G,KAAOv8G,SAAS2jB,gBAAgB,6BAA8B,QACnE7jB,KAAKy8G,KAAK1yG,OAAOyxG,GAEjBx7G,KAAK4jB,IAAI7Z,OAAO/J,KAAKy8G,MAErBz8G,KAAK08G,KAAOx8G,SAASC,cAAc,OACnCH,KAAK08G,KAAKt8G,UAAUC,IAAI,+BAGtBL,KAAK4jB,IAAI9S,eACX9Q,KAAK4gB,QAAQ7W,OAAO/J,KAAK4jB,IAAK5jB,KAAK08G,MAGrC18G,KAAK08G,KAAK/5G,MAAMuT,QAAU,WAAW+lG,8BAAuCM,QAE5Ev8G,KAAK2E,MAAQA,EACb3E,KAAKsc,MAAQA,EAENtc,KAAKyrB,Q,2SChLhB,MAAMkxF,GAOJ,cAHA,KAAAxpF,KAAgF,GAI9EnzB,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUuJ,UAAYmzG,GAAch1E,WAGpC,OAAOrrB,EAAesgG,GAAe,GAC1C,GAAG58G,KAAKmzB,KAAK7W,GAAQ,OAAOtc,KAAKmzB,KAAK7W,GAAOtH,QAC7C,MAAMkc,EAAMhxB,SAASC,cAAc,OAC7Bw4D,GAAW3hD,OAAOy0C,KAAKzrD,KAAKmzB,MAAMhxB,SAAWy6G,EAInD,OAHA1rF,EAAI1nB,UAAYmzG,GAAch1E,WAAa,QAAUgxB,EAAU,GAAK,mBACpE34D,KAAKmzB,KAAK7W,GAAS,CAACtH,QAASkc,EAAK4N,KAAK,GACvC9+B,KAAKC,UAAU8J,OAAOmnB,GACfA,EAGF,SAAS5U,GACVtc,KAAKmzB,KAAK7W,KACdtc,KAAKmzB,KAAK7W,GAAOtH,QAAQrT,gBAClB3B,KAAKmzB,KAAK7W,IAGZ,UAAUugG,GACZ78G,KAAKgN,cAAcA,aAAahN,KAAKgN,cACxChN,KAAKgN,aAAezB,OAAOC,WAAW,KACpC,IAAI,MAAMR,KAAKhL,KAAKmzB,MACdnoB,IAAM6xG,GACV78G,KAAK88G,UAAU9xG,IAEhB2xG,GAAcI,UAGZ,UAAUzgG,EAAe0gG,GAAS,GACvC,MAAM9rF,EAAMlxB,KAAKmzB,KAAK7W,GACnB4U,EAAI4N,MACFk+E,GACD9rF,EAAIlc,QAAQ5U,UAAUuB,OAAO,QACxBuvB,EAAIlc,QAAQi0B,YAEjB/X,EAAIlc,QAAQ5U,UAAUuB,OAAO,YAAa,eAGrCuvB,EAAI4N,KAGb9+B,KAAKi9G,UAAU3gG,GAGV,QAAQA,EAAe4gG,EAAuBC,EAAU7gG,EAAQ4gG,EAAeE,GAAiB,GACrG,GAAG9gG,IAAU4gG,EACX,OAAOl9G,KAAKq9G,UAAU/gG,GAGxB,MAAM4U,EAAMlxB,KAAKmzB,KAAK7W,GAChBghG,EAAct9G,KAAKmzB,KAAK+pF,GAC9B,IAAII,IAAgBF,EAClB,OAAOp9G,KAAKq9G,UAAU/gG,GAGxB,MAAMgS,EAAQ,CAAC,WAAY,eACvB6uF,GAAS7uF,EAAMxpB,UAEnBosB,EAAIlc,QAAQ5U,UAAUC,IAAIiuB,EAAM,IAChC4C,EAAIlc,QAAQ5U,UAAUuB,OAAO2sB,EAAM,IAChCgvF,IACDA,EAAYtoG,QAAQ5U,UAAUC,IAAIiuB,EAAM,IACxCgvF,EAAYtoG,QAAQ5U,UAAUuB,OAAO2sB,EAAM,KAG1C4C,EAAI4N,KACL9+B,KAAKq9G,UAAU/gG,GAAO,GAGxB4U,EAAIlc,QAAQ5U,UAAUkM,OAAO,aAAa,GAC1CgxG,GAAeA,EAAYtoG,QAAQ5U,UAAUkM,OAAO,aAAa,GAajEtM,KAAKi9G,UAAU3gG,IA5FV,GAAAygG,SAAW,IACX,GAAAp1E,WAAa,iBA+FtB,MAAM41E,GAYJ,YAAoBz4G,GAAU,GAAV,KAAAA,UARpB,KAAA0X,SAIM,GACN,KAAAghG,eAAiB,EAIfx9G,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUuJ,UAAY+zG,GAAgB51E,WAG7C,WAAWrrB,GACT,GAAGtc,KAAKwc,SAASF,GAAQ,OAAOtc,KAAKwc,SAASF,GAC9C,MAAM7W,EAAOvF,SAASC,cAAc,OACpCsF,EAAK+D,UAAY+zG,GAAgB51E,WAAa,WAE9C,MAAM/6B,EAAc1M,SAASC,cAAc,OAC3CyM,EAAYpD,UAAY+zG,GAAgB51E,WAAa,uBAErD,MAAM81E,EAAgB,IAAId,GAO1B,OANAc,EAAcx9G,UAAUuJ,UAAY+zG,GAAgB51E,WAAa,mBAEjEliC,EAAKsE,OAAO6C,EAAa6wG,EAAcx9G,WAEvCD,KAAKC,UAAU8J,OAAOtE,GAEfzF,KAAKwc,SAASF,GAAS,CAACrc,UAAWwF,EAAMmH,cAAa6wG,iBAG/D,MAAM7nC,GACD51E,KAAKgN,cAAcA,aAAahN,KAAKgN,cAExC,MAAMwP,GAAY,GAAKo5D,GAAQzzE,OAC5Bqa,GAAYxc,KAAKwc,SAASra,SAI7BnC,KAAKgN,aAAezB,OAAOC,WAAW,KAClBxL,KAAKwc,SAAS/X,OAAO+X,EAAUxc,KAAKwc,SAASra,OAASqa,GAC9DlW,QAASo3G,IACjBA,EAAQz9G,UAAU0B,YAEnBg7G,GAAcI,WAYnB,SAASnnC,GACP,MAAMp5D,GAAY,GAAKo5D,GAAQzzE,OACbnC,KAAKwc,SAAS/Y,MAAM+Y,GAC5BlW,QAASo3G,IACjB,MAAMC,GAAyBD,EAAQ9wG,YAAY2c,WAAa,EACpDm0F,EAAQD,cAAcG,OAAOL,GAAgBM,aAAa,GACtEH,EAAQD,cAAcruG,QAAQmuG,GAAgBM,YAAaF,EAAuB39G,KAAK8E,QAAU8wE,EAAS51E,KAAKw9G,eAAiB5nC,EAAS51E,KAAKw9G,gBAAgB,KAGhKx9G,KAAKmK,MAAMyrE,GAGb,SAASA,GAGP,MAAMkoC,EAAoB31G,MAAMC,KAAK,GAAKpI,KAAKw9G,gBAAgB/0G,IAAIg8F,IAAMA,GACvDt8F,MAAMC,KAAK,GAAKwtE,GAAQntE,IAAIg8F,IAAMA,GAC1Cn+F,QAAQ,CAACy3G,EAAe15G,K,MAChC,MAAMq5G,EAAU19G,KAAKg+G,WAAW35G,GAE1B6sB,EAAMwsF,EAAQD,cAAcG,OAAOG,GAAe,GAClDJ,EAA8C,QAAtB,EAAAG,EAAkBz5G,UAAI,QAAIk5G,GAAgBM,YACxE3sF,EAAI3H,UAAYm0F,EAAQ9wG,YAAY2c,UAAY,GAAKw0F,EAErDL,EAAQD,cAAcruG,QAAQ2uG,EAAeJ,EAAuB39G,KAAK8E,QAAU8wE,EAAS51E,KAAKw9G,eAAiB5nC,EAAS51E,KAAKw9G,gBAAgB,KAGlJx9G,KAAKi+G,SAASroC,GAEd51E,KAAKw9G,eAAiB5nC,GAxFjB,GAAAioC,aAAe,EACf,GAAAl2E,WAAa,mBA2FP,MAAM,GA0CnB,YAAoB2jD,EAA4Bl/D,EAAoB49B,EAAgD4wB,GAAhG,KAAA0Q,SAA4B,KAAAl/D,OAAoB,KAAA49B,qBAAgD,KAAA4wB,kBAnC7G,KAAAsjC,aAAe,EACf,KAAAC,UAAY,EACZ,KAAAC,aAAe,EACf,KAAAC,eAAiB,EACjB,KAAAC,oBAAsB,EAEtB,KAAAC,QAAS,EACT,KAAAC,qBAAsB,EAEtB,KAAA75G,MAAQ,EACR,KAAAsD,KAAiB,GACjB,KAAAqxB,YAAc,EAEd,KAAAL,SAAU,EACV,KAAAwlF,cAAe,EACf,KAAAC,WAAY,EAOZ,KAAAC,yBAA2C,KAE3C,KAAAnY,QAAS,EAET,KAAAoY,uBAAuC,KAKtC,KAAAC,UAAW,EAEX,KAAAC,OAAQ,EAGd9+G,KAAK+N,eAAiB,IAAI,IAE1B,MAAMgxG,EAAM,IAAI,GAAe,kBAC/B/+G,KAAK8zG,uBAAyB,IAAI,GAAgB,CAChDxoB,SACAl/D,OACAre,eAAgB/N,KAAK+N,eACrBvE,UAAW,UACX0wG,cAAe6E,EACfluG,QAAS,IAAW,mCAOlB,OANG+pE,EAAgBkhB,cAAc97F,KAAKsrF,OAAOrkF,QAC3C,IAAI,GAAgBjH,KAAKsrF,OAAOrkF,OAAQjH,KAAKm+G,WAAW,GAExD,IAAI,GAAgBn+G,KAAKsrF,OAAOrkF,OAAQ,GAAG,IAGtC,OAIXjH,KAAKg/G,oBAAsB,IAAI7D,GAC/B4D,EAAItzF,OAAO1C,YAAY/oB,KAAKg/G,oBAAoBp/D,OAAO,EAAG,IAE1D5/C,KAAKi/G,iBAAmB,IAAItC,GAC5BoC,EAAIrzF,SAAS3hB,OAAO/J,KAAKi/G,iBAAiBh/G,WAE1CD,KAAKk/G,cAAgB,IAAIvC,GACzB38G,KAAKk/G,cAAcj/G,UAAUG,UAAUC,IAAI,kCAC3C0+G,EAAIlxG,QAAQ4R,QAAQzf,KAAKk/G,cAAcj/G,WAEvCD,KAAKm/G,gBAAkB,IAAI5B,IAAgB,GAC3CwB,EAAInxG,MAAM7D,OAAO,eAAK,iBAAkB,IAAK/J,KAAKm/G,gBAAgBl/G,WAElE,MAAMm6G,EAAWp6G,KAAK8zG,uBAAuBsG,SAAS1tE,WAAU,GAChE1sC,KAAK8zG,uBAAuBwG,mBAAmBF,GAC/C2E,EAAI9+G,UAAUwf,QAAQ26F,GAEtBp6G,KAAKo/G,QAAU,EAAW,wDAAyD,CAACzxG,UAAU,IAE9F3N,KAAK8zG,uBAAuBuG,aAAa56F,QAAQzf,KAAKo/G,SAEtD,YAAiBp/G,KAAKo/G,QAAUn9G,IAC9B,OAAAyb,EAAA,GAAYzb,GACZjC,KAAKsrF,OAAO+zB,YAAW,IACtB,CAACtxG,eAAgB/N,KAAK+N,iBAEzB/N,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,uBAAwB,EAAEiH,aACxDA,IAAWjH,KAAKsrF,OAAOrkF,SAGnBjH,KAAKwmG,QACNxmG,KAAK8zG,uBAAuBxnG,OAAOtM,KAAKwmG,QAAS,GAGnDxmG,KAAK0+G,UAAY1+G,KAAKy+G,cAAe,EACrCz+G,KAAKo+G,aAAe,EACpBp+G,KAAKm+G,UAAY,EACjBn+G,KAAK2E,MAAQ,EACb3E,KAAKiI,KAAO,GACZjI,KAAKs5B,YAAc,EACnBt5B,KAAKk+G,aAAe,EACpBl+G,KAAKwrF,gBAAgB,MAK3BxrF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,qBAAsB,EAAEiH,aACtDA,IAAWjH,KAAKsrF,OAAOrkF,QACxBjH,KAAK8zG,uBAAuBxnG,OAAOtM,KAAKwmG,QAAS,KAMrDxmG,KAAKs/G,iBAAmB5qF,GAAS,IAAM10B,KAAKu/G,oBAAqB,KAAK,GAAM,GAE5Ev/G,KAAK6+G,SAA8B,eAAnB7+G,KAAKosB,KAAKjpB,KAGrB,UACLnD,KAAK8zG,uBAAuBoG,cAAcj6G,UAAU0B,SACpD3B,KAAK8zG,uBAAuBxnG,QAAO,GACnCtM,KAAK+N,eAAeO,YACpBtO,KAAKw/G,yBAAwB,GAGxB,gBAAgB/zB,GACrB,GAAGzrF,KAAK6+G,SAAU,OAGlB,GAAG7+G,KAAKu+G,QAAUv+G,KAAKwmG,OACrB,OAGF,IAAIxmG,KAAKy+G,cAAgBz+G,KAAK0+G,aAAe1+G,KAAK2E,MAChD,OAIF,IAAIoL,EAAK/P,KAAKosB,KAAKC,QAAQ6mE,iBAAiB,UAE5C,IAAInjF,EAAI,OAIR,MAAMlJ,EAAMkJ,EAAG3D,QAAQvF,IACpBkJ,QAAcrL,IAARmC,GAEP7G,KAAKy/G,SAAS54G,EAAK4kF,GAIhB,QAAQ5kF,EAAa4kF,GAC1B,GAAGzrF,KAAK6+G,SAAU,OAGlB,GAAG7+G,KAAKwmG,OAAQ,OAIhB,IAAIqW,EAAuB78G,KAAKiI,KAAKkN,UAAU6+D,GAAQA,GAAQntE,GAC/D,IAAqB,IAAlBg2G,GAAwB78G,KAAK0/G,aAAa7C,GAEtC,MAAG78G,KAAK0+G,WAAa73G,EAAM7G,KAAKiI,KAAKjI,KAAKiI,KAAK9F,OAAS,IAQ7D,YAJInC,KAAK4+G,yBACP5+G,KAAK4+G,uBAAyB5+G,KAAK2/G,gBAAgB94G,OAA6BnC,IAAxB+mF,KAH1DoxB,EAAe78G,KAAKiI,KAAK9F,OAAS,EAAInC,KAAKs5B,iBAH3CujF,GAAgB78G,KAAKs5B,YAqBvB,GADgBt5B,KAAKo+G,cAAgBvB,EACzB,CACV,GAAG78G,KAAKw+G,0BAA+C95G,IAAxB+mF,IACL,IAArBzrF,KAAKo+G,aAAqBp+G,KAAKo+G,YAAcvB,GAC9C,OAIJ78G,KAAKo+G,YAAcvB,EACnB78G,KAAKm+G,UAAYn+G,KAAKiI,KAAKwI,KAAKujE,GAAQA,GAAQntE,IAAQ7G,KAAKiI,KAAKjI,KAAKiI,KAAK9F,OAAS,GACrFnC,KAAKs/G,oBAID,aAAazC,GACnB,OAAQ78G,KAAK2E,MAAQ,GAAkB4uD,cAEjCvzD,KAAKy+G,cAAgB5B,GAAgB,GAAkB+C,cACvD5/G,KAAK0+G,WAAc1+G,KAAK2E,MAAQ,EAAIk4G,GAAiB,GAAkB+C,aAKjE,gBAAgB/4G,EAAag5G,GAAe,G,0CACxD,IAAG7/G,KAAKi5B,QAAR,CACAj5B,KAAKi5B,SAAU,EAEf,IACE,IAAI6mF,GAAU,EACd,MAAMriF,EAAW,CACfz9B,KAAKgqD,mBAAmBjjD,UAAU,CAChCE,OAAQjH,KAAKsrF,OAAOrkF,OACpBE,YAAa,CAACC,EAAG,6BACjBR,MAAOC,EACPK,MAAO,GAAkBqsD,WACzB5sD,UAAW,GAAkB4sD,aAE9B1yD,KAAKoe,IACJ6gG,GAAU,EACH7gG,KAIX,IAAIjf,KAAKk+G,aAAc,CACrB,MAAM/3G,EAAUnG,KAAKgqD,mBAAmB+1D,iBAAiB//G,KAAKsrF,OAAOrkF,QAAQpG,KAAKm2B,IAC5EA,EAAEpwB,QACN5G,KAAKk+G,aAAelnF,EAAEpwB,OAElBk5G,GAAWD,IACb7/G,KAAKiI,KAAO,CAACjI,KAAKk+G,cAClBl+G,KAAK2E,MAAQqyB,EAAEryB,MACf3E,KAAKo+G,YAAc,EACnBp+G,KAAKm+G,UAAYn+G,KAAKiI,KAAK,GAC3BjI,KAAKs/G,uBAKT7hF,EAAS93B,KAAKQ,GAGhB,MAAME,SAAgBxD,QAAQC,IAAI26B,IAAW,GAE7C,IAAIuiF,EAAc35G,EAAOlC,QAAQgR,UAAU/Q,GAAWA,EAAQyC,KAAOA,IACjD,IAAjBm5G,IACDA,EAAc35G,EAAOlC,QAAQhC,QAK/BnC,KAAKs5B,YAAcjzB,EAAO45G,iBAAmB55G,EAAO45G,iBAAmBD,EAAc,EACrFhgH,KAAKiI,KAAO5B,EAAOlC,QAAQsE,IAAIrE,GAAWA,EAAQyC,KAAKpD,QACvDzD,KAAK2E,MAAQ0B,EAAO1B,MAEhB3E,KAAK2E,OACP3E,KAAK8zG,uBAAuBxnG,QAAO,GAGrCtM,KAAK0+G,UAAa1+G,KAAKs5B,YAAct5B,KAAKiI,KAAK9F,SAAYnC,KAAK2E,MAChE3E,KAAKy+G,cAAgBz+G,KAAKs5B,YAE1Bt5B,KAAK8+G,OAAS9+G,KAAKosB,KAAKkiC,IAAI,gCAAiCznD,EAAKR,EAAQ25G,EAAahgH,KAAKs5B,YAAat5B,KAAK0+G,UAAW1+G,KAAKy+G,cAC9H,MAAMhyG,GACNzM,KAAKosB,KAAKkiC,IAAI3hD,MAAM,8BAA+BF,GAGrDzM,KAAKi5B,SAAU,EAEZj5B,KAAKu+G,OACNv+G,KAAKy/G,QAAQ54G,GACLg5G,GACR7/G,KAAKwrF,gBAAgB,GAGvBxrF,KAAK4+G,uBAAyB,SAIzB,wBACL5+G,KAAKw+G,qBAAsB,EAEvBx+G,KAAK2+G,2BACP3+G,KAAK2+G,yBAA2B,IAAI,IC5e3B,SAA+B56G,EAAmB02F,EAAwBpjE,EAAsBtpB,GAC7G,GAAG,sBAAoB,CACrB,IAAImyG,EACJ,MAAMl9G,EAAU,CAACsY,SAAS,GAC1BvN,EAAe1N,IAAI0D,EAAnBgK,CAAyB,aAAe9L,IACnCA,EAAE+Y,QAAQ7Y,OAAS,EACpBiZ,KAIF8kG,EAAQj+G,EAAE+Y,QAAQ,GAAGE,QAErBnN,EAAe1N,IAAI0D,EAAnBgK,CAAyB,YAAa+M,EAAa9X,GACnD+K,EAAe1N,IAAI0D,EAAnBgK,CAAyB,WAAYqN,EAAYpY,KAChDA,GAEH,MAAM8X,EAAe7Y,IACnB,MAAMiZ,EAAUjZ,EAAE+Y,QAAQ,GAAGE,QAEvBilG,EAASjlG,EAAUglG,EACb,WAATzlB,GAAqB0lB,EAAQ9oF,IACf,QAATojE,GAAmB0lB,GAAQ9oF,IACnC6oF,EAAQhlG,GAIJE,EAAa,KACjBrN,EAAeu7C,aAAavlD,EAAM,YAAa+W,EAAa9X,GAC5D+K,EAAeu7C,aAAavlD,EAAM,WAAYqX,EAAYpY,SAG5D+K,EAAe1N,IAAI0D,EAAnBgK,CAAyB,QAAU9L,IACjC,MAAMk+G,EAASl+G,EAAEm+G,OAAS,EAEd,WAAT3lB,GAAqB0lB,EAAQ9oF,IACf,QAATojE,GAAmB0lB,GAAQ9oF,KAClC,CAAC/b,SAAS,IDycX+kG,CAAsBrgH,KAAKosB,KAAKC,QAAQthB,WAAW9K,UAAW,SAAU,KACtED,KAAKw/G,2BACJx/G,KAAK2+G,2BAIL,wBAAwB2B,GAAkB,GAC/CtgH,KAAKw+G,qBAAsB,EAExBx+G,KAAK2+G,2BACN3+G,KAAK2+G,yBAAyBrwG,YAC9BtO,KAAK2+G,yBAA2B,MAG/B2B,GACDtgH,KAAKwrF,gBAAgB,GAIZ,+B,0CACXxrF,KAAKu+G,QAAS,EAEdv+G,KAAK8+G,OAAS9+G,KAAKosB,KAAKkiC,IAAI,sCAC5B,IACEtuD,KAAKugH,wBAEL,MAAMpiE,EAAiBn+C,KAAKosB,KAAK+xB,eAC9BA,aAA0Bt7C,gBACrBs7C,SAIF,eAEHn+C,KAAK4+G,+BACA5+G,KAAK4+G,wBAGb5+G,KAAK8+G,OAAS9+G,KAAKosB,KAAKkiC,IAAI,8CAC5BtuD,KAAKu+G,QAAS,EAOd,MAAM9xG,GACNzM,KAAKosB,KAAKkiC,IAAI3hD,MAAM,4CAA6CF,GAEjEzM,KAAKu+G,QAAS,EACdv+G,KAAKw+G,qBAAsB,EAC3Bx+G,KAAKwrF,gBAAgB,OAIZ,oBAAoB3kF,G,0CAC/B,MAAMzC,EAAUpE,KAAKosB,KAAKg4B,WAAWv9C,GAClCzC,IAAYA,EAAQs2B,UACrB16B,KAAKosB,KAAKu/D,aAAa9kF,IACtB7G,KAAKosB,KAAK+xB,gBAAkBt7C,QAAQoD,WAAWpF,KAAK,KACnDb,KAAKwgH,+BACLxgH,KAAKy/G,QAAQz/G,KAAKo+G,aAAgBp+G,KAAK2E,MAAQ,EAAK3E,KAAKk+G,aAAer3G,EAAM,SAKvE,oB,0CAQT,MAAMlC,EAAQ3E,KAAK2E,MACnB,GAAGA,EAAO,CACR,MAAMy5G,EAAcp+G,KAAKo+G,YACnBh6G,EAAUpE,KAAKosB,KAAKg4B,WAAWpkD,KAAKm+G,WAKlCsC,EAAyB,IAAhBrC,EACfp+G,KAAKm/G,gBAAgBl/G,UAAUG,UAAUkM,OAAO,UAAWm0G,GAEvDA,GACFzgH,KAAKm/G,gBAAgBuB,SAAS/7G,EAAQy5G,GAK1Cp+G,KAAK8zG,uBAAuBxnG,QAAO,GAEnC,MAAM6wG,EAAUiB,EAAcp+G,KAAKq+G,eAEnCr+G,KAAK8+G,OAAS9+G,KAAKosB,KAAKkiC,IAAI,kCAAmC6uD,EAASiB,EAAap+G,KAAKq+G,gBAE1F,MAAMsC,EAAU3gH,KAAKi/G,iBAAiBrB,OAAOQ,GACvCwC,EAAe5gH,KAAKk/G,cAActB,OAAOQ,GAC/CwC,EAAaxgH,UAAUC,IAAI,wBAE3B,MAAMypB,EAA+B,GAC/BgD,EAAanB,GAAuB,CACxC/d,WAAOlJ,EACP2jB,QAAS,KACTqD,SAAUtnB,EAAQA,QAClBwnB,WAAY+0F,EACZv8G,UACAynB,QAAS+0F,EACT92F,uBAGIjnB,QAAQC,IAAIgnB,GAElB9pB,KAAK8zG,uBAAuBoG,cAAcj6G,UAAUG,UAAUkM,OAAO,WAAYwgB,GAG/E9sB,KAAKi/G,iBAAiB7vG,QAAQgvG,EAAap+G,KAAKq+G,gBAC7CvxF,GACD9sB,KAAKk/G,cAAc9vG,QAAQgvG,EAAap+G,KAAKs+G,qBAC7Ct+G,KAAKs+G,oBAAsBF,GAE3Bp+G,KAAKk/G,cAAcjC,YAIvBj9G,KAAKg/G,oBAAoBp/D,OAAOj7C,EAAOA,EAAQy5G,EAAc,GAC7Dp+G,KAAKq+G,eAAiBD,EACtBp+G,KAAK8zG,uBAAuBoG,cAAcj6G,UAAUmM,QAAQvF,IAAM,GAAKzC,EAAQyC,SAE/E7G,KAAK8zG,uBAAuBxnG,QAAO,GACnCtM,KAAKq+G,eAAiB,EAGxBr+G,KAAK8zG,uBAAuBoG,cAAcj6G,UAAUG,UAAUkM,OAAO,UAAWtM,KAAK2E,MAAQ,OAranF,GAAA4uD,WAAa,GACb,GAAAqsD,YAAc,EEpNf,SCF8C,oBAAxB,mBAAwC,eCkD9D,MAAM,GA6BnB,YACUxzF,EACA0jB,EACAka,EACA4wB,EACAqwB,EACAG,EACAhjB,EACAF,EACA24B,GARA,KAAAz0F,OACA,KAAA0jB,kBACA,KAAAka,qBACA,KAAA4wB,kBACA,KAAAqwB,kBACA,KAAAG,0BACA,KAAAhjB,oBACA,KAAAF,kBACA,KAAA24B,uBAiKF,KAAAC,cAAiB7+G,IACvB,MAAM8+G,IAAe9+G,MAAQjC,KAAKghH,UAAWhhH,KAAKghH,QAAQ5gH,UAAUuR,SAAS,cAE7E1P,GAAK,OAAAyb,EAAA,GAAYzb,GAEjB,MAAM6+G,EAAiBljG,IACrBA,EAAQtX,QAAQuU,IACdA,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAASuO,EAAO9F,aAIjDgsG,IACDD,EAAc9gH,KAAKoxE,aAGnBpxE,KAAKoxE,YAAYpxE,KAAKoxE,YAAYjvE,OAAS,GAAG6S,QAAQ8T,UAAUC,YAAY,eAAK/oB,KAAK46E,gBAAgBqmC,oBAAoBjhH,KAAKiH,WAGjI65G,EAAc9gH,KAAKkhH,kBAGb,KAAAC,sBAAyBh+G,I,MAC/B,IAAI,IAA2BnD,KAAKiH,OAAOw1B,SAAU,OAAO,EAE5D,MAAM2kF,EAAmBphH,KAAK6gH,qBAAqBQ,UAC7CrvG,EAAShS,KAAKiH,OAAOivB,WAC3B,IAAGkrF,aAAgB,EAAhBA,EAAkBpvG,UAAWA,EAC9B,OAAO,EAGT,GAAG7O,IACGnD,KAAKiH,OAAOuwB,eAA0B,UAATr0B,GAC9BnD,KAAKiH,OAAOqlE,cAAyB,cAATnpE,GAC7B,OAAO,EAKX,OAAmC,QAA5B,EADMnD,KAAKirG,gBAAgBqW,aAAatvG,GAClBsF,cAAM,eAAEiqG,cAAevhH,KAAKirG,gBAAgBtuE,UAAU3qB,EAAQ,gBAwMrF,KAAAwvG,qBAAuB,KAC7BxhH,KAAKosB,KAAK09D,aAAa23B,cAAczhH,KAAKiH,SA8HpC,KAAAy6G,SAAW,KACjB1hH,KAAK06G,eAAc,GACnB16G,KAAKy6G,eAGC,KAAAtT,eAAiB,CAAC/+F,EAAkB4mC,KAC1ChvC,KAAKC,UAAUG,UAAUkM,OAAO,qBAAsBiX,EAAA,EAAWC,UAEjExjB,KAAKurF,eAAiBvrF,KAAKurF,cAAcuoB,uBAAuBoG,cAAcj6G,UAAUG,UAAUkM,OAAO,cAAe0iC,IAAO,IAAWE,QAC1IlvC,KAAK0hH,YAyKA,KAAAhH,cAAgB,CAACiH,GAAS,KAE5B3hH,KAAK4hH,aAAar2G,OAAO4T,qBAAqBnf,KAAK4hH,aAEnD,cAAaD,GACd3hH,KAAK6hH,UAAUzhH,UAAUC,IAAI,QAI/BL,KAAK4hH,YAAcr2G,OAAO2T,sBAAsB,KAKvC,cAAayiG,GACd3hH,KAAK6hH,UAAUzhH,UAAUuB,OAAO,QAIlC,MAAMjB,EAAmCV,KAAK6hH,UAAU/lG,wBAAwBpb,MAChFV,KAAKosB,KAAKkiC,IAAI,eAAgB5tD,GAC9BV,KAAKC,UAAU0C,MAAMykC,YAAY,gBAAiB1mC,EAAQ,MAI5DV,KAAK4hH,YAAc,KAOlB,KAAAnH,YAAc,KACnB,MACM91G,EADa,CAAC3E,KAAK8hH,UAAW9hH,KAAKurF,eAAiBvrF,KAAKurF,cAAcuoB,wBAAwBlsG,OAAOc,SACnFy6B,OAAO,CAACC,EAAKnjC,KACpC,MAAMu6G,EAAav6G,EAAUi6G,cAAcj6G,UAAUG,UAAUuR,SAAS,eAExE,OADA3R,KAAKC,UAAUG,UAAUkM,OAAO,aAAarM,EAAUuJ,qBAAsBgxG,GACtEp3E,IAAOo3E,GACb,GACHx6G,KAAKC,UAAUmM,QAAQ6tG,SAAW,GAAKt1G,GAGlC,KAAA8lC,cAAgB,CAACC,GAAY,KAClC,IAAI1qC,KAAK0rB,SAAU,OAEnB,MAAMzkB,EAASjH,KAAKiH,OACpBjH,KAAKosB,KAAK09D,aAAar/C,cAAczqC,KAAKiH,OAAQjH,KAAK0rB,SAAUgf,GAAW,EAAO,IAAMzjC,IAAWjH,KAAKiH,SA5uBzGjH,KAAK+N,eAAiB,IAAI,IAE1B/N,KAAKoxE,YAAc,GACnBpxE,KAAKkhH,gBAAkB,GAGlB,YAGLlhH,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,iBAAkB,UAC/CL,KAAKC,UAAUmM,QAAQ6tG,SAAW,IAElCj6G,KAAK+hH,QAAU,EAAW,4BAA6B,CAACp0G,UAAU,IAGlE3N,KAAKgiH,kBAAoB9hH,SAASC,cAAc,OAChDH,KAAKgiH,kBAAkB5hH,UAAUC,IAAI,uBAErCL,KAAKiiH,SAAW/hH,SAASC,cAAc,OACvCH,KAAKiiH,SAAS7hH,UAAUC,IAAI,aAE5B,MAAM6hH,EAAShiH,SAASC,cAAc,OACtC+hH,EAAO9hH,UAAUC,IAAI,UAErB,MAAMwN,EAAU3N,SAASC,cAAc,OACvC0N,EAAQzN,UAAUC,IAAI,WAEtB,MAAMmzB,EAAMtzB,SAASC,cAAc,OACnCqzB,EAAIpzB,UAAUC,IAAI,OAElBL,KAAK4N,MAAQ1N,SAASC,cAAc,OACpCH,KAAK4N,MAAMxN,UAAUC,IAAI,cAEzBmzB,EAAIzpB,OAAO/J,KAAK4N,OAEhB,MAAMkP,EAAS5c,SAASC,cAAc,OACtC2c,EAAO1c,UAAUC,IAAI,UAElBL,KAAK0rB,UACN5O,EAAO/S,OAAO/J,KAAK0rB,UAGrB7d,EAAQ9D,OAAOypB,EAAK1W,GACjB9c,KAAKmiH,eACND,EAAOn4G,OAAO/J,KAAKmiH,eAGrBD,EAAOn4G,OAAO8D,GACd7N,KAAKiiH,SAASl4G,OAAOm4G,GAGrBliH,KAAK6hH,UAAY3hH,SAASC,cAAc,OACxCH,KAAK6hH,UAAUzhH,UAAUC,IAAI,cAE7BL,KAAK8hH,UAAY,IAAI,GAAU9hH,KAAMA,KAAKosB,KAAMpsB,KAAKgqD,oBAElDhqD,KAAKoxE,YAAYjvE,SAClBnC,KAAKghH,QAAU,GAAiB,CAACjzG,eAAgB/N,KAAK+N,gBAAiB,cAAe/N,KAAKoxE,YAAapxE,KAAK8gH,gBAG/G9gH,KAAK6hH,UAAU93G,UAAU,CAEvB/J,KAAKurF,cAAgBvrF,KAAKurF,cAAcuoB,uBAAuBoG,cAAcj6G,UAAY,KACzFD,KAAKoiH,QACLpiH,KAAKqiH,UACLriH,KAAKsiH,aACLtiH,KAAKuiH,QACLviH,KAAKwiH,UACLxiH,KAAKghH,SACLp5G,OAAOc,UAET1I,KAAKyiH,mBAAmBziH,KAAKsiH,aAActiH,KAAKmhH,uBAEhDnhH,KAAKgiH,kBAAkBj4G,OAAO/J,KAAK+hH,QAAS/hH,KAAKiiH,SAAUjiH,KAAK6hH,WAChE7hH,KAAKC,UAAU8J,OAAO/J,KAAKgiH,mBAExBhiH,KAAK8hH,WAEN9hH,KAAKC,UAAU8J,OAAO/J,KAAK8hH,UAAU5H,cAAcj6G,WAOrDD,KAAK+N,eAAe1N,IAAIkL,OAAxBvL,CAAgC,SAAUA,KAAK0hH,UAC/C1hH,KAAK+N,eAAe1N,IAAIkjB,EAAA,EAAxBvjB,CAAoC,eAAgBA,KAAKmnG,gBAEzD,YAAiBnnG,KAAKC,UAAYgC,IAChC,MAAMhC,EAAY,OAAA2e,GAAA,GAAgB3c,EAAE4S,OAAQ,oBAE5C,GADA,OAAAy1C,GAAA,KACGrqD,EAAW,CAGZ,GAFA,OAAAyd,EAAA,GAAYzb,GAET,OAAA2c,GAAA,GAAgB3c,EAAE4S,OAAQ,iBAC3B,OAGF,MAAMhO,GAAO5G,EAAUmM,QAAQvF,IAC/B,GAAG5G,EAAUG,UAAUuR,SAAS,kBAE5B3R,KAAKurF,cAAcm3B,oBAAoB77G,OAEpC,CACL,MAAMI,EAAShH,EAAUmM,QAAQnF,OAAOkgB,WAClCngB,EAAgB,GAA2B27G,mBACjD3iH,KAAKosB,KAAK09D,aAAazjC,aACrBp/C,EACAJ,EACAG,EAAc8B,YAAc,YAAe9B,EAAc8D,SAAW,kBAAepG,EACnFsC,EAAc8D,gBAIfyY,EAAA,EAAWq/F,eAAiB,IAAW3zE,QAAU/uC,SAASiW,KAAK/V,UAAUuR,SlDpKxC,wBkDqKlCkxG,IACQ,OAAApiF,GAAA,GAAUx+B,EAAE4S,OAAQ,kBAC5B7U,KAAK8vC,gBAAgBX,eAAejvC,SAASiW,KAAK/V,UAAUuR,S3GtMzB,0B2GwMnC3R,KAAK8vC,gBAAgBX,eAAc,IAGtC,CAACphC,eAAgB/N,KAAK+N,iBAEzB,MAAM80G,EAAkB5gH,IAOtB,GANGA,GACD,OAAAyb,EAAA,GAAYzb,GAKXshB,EAAA,EAAWq/F,eAAiB,IAAW3zE,QAAU/uC,SAASiW,KAAK/V,UAAUuR,SlDrLtC,wBkDsLpC3R,KAAKosB,KAAK09D,aAAax+C,QAAQtrC,KAAKiH,YAC/B,CACL,MAAM67G,EAAkE,IAApD9iH,KAAKosB,KAAK09D,aAAa9zB,MAAMz5C,QAAQvc,KAAKosB,MAC9Drd,EAAA,EAAwBG,KAAK4zG,EAAc,KAAO,UAYtD,YAAiB9iH,KAAK+hH,QAASc,EAAgB,CAAC90G,eAAgB/N,KAAK+N,iBAG/D,mBAAmBiH,EAAsBD,GAC3CC,GAIJhV,KAAKkhH,gBAAgBv7G,KAAK,CAACqP,UAASD,WA4C/B,iBACL/U,KAAKoxE,YAAc,CAAC,CAClB/jE,KAAM,SACN6P,KAAM,SACNC,QAAS,KACPnd,KAAKosB,KAAK4lD,cAEZj9D,OAAQ,IAAMwO,EAAA,EAAWC,UAMtB,CACHnW,KAAM,OACN6P,KAAM,wBACNC,QAAS,KACPnd,KAAKgqD,mBAAmBrlB,SAAS3kC,KAAKiH,SAExC8N,OAAQ,IAAyB,SAAnB/U,KAAKosB,KAAKjpB,MAAmByF,EAAA,QAAU6O,OAASzX,KAAKiH,SAAWjH,KAAKorG,wBAAwBhmE,iBAAiBplC,KAAKiH,QAAQ,IACxI,CACDoG,KAAM,SACN6P,KAAM,0BACNC,QAAS,KACPnd,KAAKgqD,mBAAmBrlB,SAAS3kC,KAAKiH,SAExC8N,OAAQ,IAAyB,SAAnB/U,KAAKosB,KAAKjpB,MAAmByF,EAAA,QAAU6O,OAASzX,KAAKiH,QAAUjH,KAAKorG,wBAAwBhmE,iBAAiBplC,KAAKiH,QAAQ,IACvI,CACDoG,KAAM,WACN6P,KAAM,iBACNC,QAAS,KACP,MAAM8O,EAAajsB,KAAKosB,KAAKC,QAAQC,gBACrCtsB,KAAKooF,kBAAkB26B,eAAe/iH,KAAKiH,OAAOivB,YAAYr1B,KAAKmiH,IAC9D/2F,KAAgB+2F,EAAYC,gBAC7BjjH,KAAKosB,KAAK09D,aAAazjC,aAAa28D,EAAYC,eAAe97F,UAAS,OAI9EpS,OAAQ,K,MACN,MAAMkjB,EAAWj4B,KAAKooF,kBAAkB86B,kBAAkBljH,KAAKiH,OAAOivB,YACtE,MAA0B,SAAnBl2B,KAAKosB,KAAKjpB,SAAuD,QAAlC,EAAC80B,SAAiC,eAAEgrF,kBAE3E,CACD51G,KAAM,YACN6P,KAAM,6BACNC,QAASnd,KAAKwhH,qBACdzsG,OAAQ/U,KAAKmhH,sBAAsB56G,KAAKvG,KAAM,cAC7C,CACDqN,KAAM,YACN6P,KAAM,4BACNC,QAASnd,KAAKwhH,qBACdzsG,OAAQ/U,KAAKmhH,sBAAsB56G,KAAKvG,KAAM,UAC7C,CACDqN,KAAM,SACN6P,KAAM,2BACNC,QAAS,KACP,MAAMgxB,EAAYnuC,KAAKosB,KAAK+hB,UAC5BA,EAAUmZ,iBAAgB,GAAM,GAChCvzB,EAAA,QAAgBC,WAAWnzB,KAAKozB,IAC9B,GAAGA,EAAMkvF,4BACP,OAGF,MAAM7rF,EAAW6W,EAAUE,gBAAgB9nC,KAAK4nC,GAChDA,EAAUE,gBAAmB0d,IAC3Bh4B,EAAA,QAAgBouC,YAAY,+BAA+B,GAC3D5tC,GAAM,eAAK,mBAEX4Z,EAAUE,gBAAkB/W,EAC5B6W,EAAUE,gBAAgB0d,OAIhCh3C,OAAQ,KAAO/U,KAAKosB,KAAK+hB,UAAUC,eAAiBp3B,OAAOy0C,KAAKzrD,KAAKosB,KAAKC,QAAQA,SAASlqB,QAC1F,CACDkL,KAAM,SACN6P,KAAM,2BACNC,QAAS,KACPnd,KAAKosB,KAAK+hB,UAAU4Y,mBAEtBhyC,OAAQ,IAAM/U,KAAKosB,KAAK+hB,UAAUC,aACjC,CACD/gC,KAAM,UACN6P,KAAM,aACNC,QAAS,KACP,IAAInd,KAAK8vC,gBAAgByF,YAAY,IAAoB,CACvD,MAAM/lC,EAAM,IAAI,GAAkBxP,KAAK8vC,iBACvCtgC,EAAIvI,OAASjH,KAAKiH,OAClBuI,EAAIuB,OAEJ/Q,KAAK8vC,gBAAgBX,eAAc,KAGvCp6B,OAAQ,IAAM/U,KAAKiH,OAAOw1B,WAAaz8B,KAAK46E,gBAAgB12C,UAAUlkC,KAAKiH,SAC1E,CACDoG,KAAM,UACN6P,KAAM,eACNC,QAAS,KACP,MAAMimG,EAAgBpjH,KAAKiH,OAC3B,IAAI,GAAc,CAChB23B,UAAW,CAAC,UAAW,YACvBF,SAAWz3B,GACF,IAAIpE,QAAQ,CAACoD,EAAS8kB,KAC3B,IAAI,GAAU,GAAI,CAChBgI,aAAc,mBACd+D,mBAAoB,yBACpBG,oBAAqB,CAAC,IAAI,KAAU,CAAChwB,SAAQ4E,QAAQ,IAAOmJ,SAC5D4I,QAAS,CAAC,CACRwW,QAAS,OACTiD,SAAU,KACRpxB,IAEAjG,KAAKgqD,mBAAmB+5B,UAAU98E,EAAQjH,KAAKkoF,gBAAgBm7B,qBAAqBD,IACpFpjH,KAAKosB,KAAK09D,aAAazjC,aAAap/C,KAErC,CACDmtB,QAAS,SACTiD,SAAU,KACRtM,KAEFkvC,UAAU,IAEZhzD,SACAuvB,iBAAiB,IAChB/X,SAGP7R,YAAa,gCACbsvB,iBAAkB,gBAClBrC,aAAc,kBAGlB9kB,OAAQ,IAAMnM,EAAA,QAAU6O,OAASzX,KAAKiH,QAAUjH,KAAKiH,OAAOw1B,UAAYz8B,KAAK46E,gBAAgB12C,UAAUlkC,KAAKiH,SAC3G,CACDoG,KAAM,OACN6P,KAAM,YACNC,QAAS,KACP,IAAI,GAAU,GAAI,CAChBlW,OAAQjH,KAAKiH,OACb8rB,aAAc,YACd+D,mBAAoB,0BACpBG,oBAAqB,CAAC,IAAI,KAAU,CAAChwB,OAAQjH,KAAKiH,SAAS+N,SAC3D4I,QAAS,CAAC,CACRwW,QAAS,YACTkO,UAAU,EACVjL,SAAU,KACRr3B,KAAKkoF,gBAAgB3rB,YAAYv8D,KAAKiH,QAAQ,GAAMpG,KAAKqB,IACpDA,GACDsyB,GAAS,CAACC,YAAa,uBAK9BhW,QAEL1J,OAAQ,K,MACN,IAAI/U,KAAKiH,OAAOw1B,SAAU,OAAO,EACjC,MAAMqP,EAAW9rC,KAAKooF,kBAAkBk7B,kBAAkBtjH,KAAKiH,OAAO8K,YACtE,OAAO/R,KAAKiH,SAAW2B,EAAA,QAAU6O,MAAQq0B,KAA4B,QAAf,EAAAA,EAASx0B,cAAM,eAAEmlD,WAExE,CACDpvD,KAAM,UACN6P,KAAM,UACNC,QAAS,KACPnd,KAAKkoF,gBAAgB3rB,YAAYv8D,KAAKiH,QAAQ,GAAOpG,KAAKqB,IACrDA,GACDsyB,GAAS,CAACC,YAAa,qBAI7B1f,OAAQ,K,MACN,MAAM+2B,EAAW9rC,KAAKooF,kBAAkBk7B,kBAAkBtjH,KAAKiH,OAAO8K,YACtE,SAAyB,QAAhB,EAAA+5B,aAAQ,EAARA,EAAUx0B,cAAM,eAAEmlD,WAE5B,CACDpvD,KAAM,gBACN6P,KAAM,SACNC,QAAS,KACP,IAAI,GAAkBnd,KAAKiH,SAE7B8N,OAAQ,IAAyB,SAAnB/U,KAAKosB,KAAKjpB,QAAqBnD,KAAKgqD,mBAAmBkqC,cAAcl0F,KAAKiH,UAG1FjH,KAAKwiH,UAAY,EAAW,UAC5BxiH,KAAKujH,iBAAiBvjH,KAAKwiH,UAAYvgH,IACrCjC,KAAKosB,KAAK4lD,eACT,GAGE,iBAAiBjiE,EAAiBqnC,EAA6BxqB,GACpE,YAAiB7c,EAAK9N,IACpB,OAAAyb,EAAA,GAAYzb,IACX2qB,GAAU,OAAA09B,GAAA,KACXlT,EAAGn1C,IACF,CAAC8L,eAAgB/N,KAAK+N,iBAOpB,uBAsGL,OArGA/N,KAAKmiH,cAAgB,IAAI,GACzBniH,KAAKmiH,cAAc/+G,aAAa,SAAU,KAE1CpD,KAAKmiH,cAAc/hH,UAAUC,IAAI,YAAa,iBAE9CL,KAAK0rB,SAAWxrB,SAASC,cAAc,OACvCH,KAAK0rB,SAAStrB,UAAUC,IAAI,QAE5BL,KAAKurF,cAAgB,IAAI,GAAkBvrF,KAAMA,KAAKosB,KAAMpsB,KAAKgqD,mBAAoBhqD,KAAK46E,iBAE1F56E,KAAKoiH,QAAU,YAAO,gDACtBpiH,KAAKsiH,aAAe,EAAW,aAC/BtiH,KAAKqiH,UAAY,EAAW,WAC5BriH,KAAKuiH,QAAU,EAAW,QAE1BviH,KAAKujH,iBAAiBvjH,KAAKsiH,aAActiH,KAAKwhH,sBAE9CxhH,KAAKujH,iBAAiBvjH,KAAKqiH,UAAW,KACpCriH,KAAKq/G,YAAW,KAGlBr/G,KAAKujH,iBAAiBvjH,KAAKuiH,QAAS,KAClCviH,KAAKgqD,mBAAmBrlB,SAAS3kC,KAAKiH,UAGxCjH,KAAKujH,iBAAiBvjH,KAAKoiH,QAAS,KAClC,MAAMn2F,EAAajsB,KAAKosB,KAAKC,QAAQC,gBACrCtsB,KAAKoiH,QAAQh/G,aAAa,WAAY,QAEtC,MAAM4O,EAAShS,KAAKiH,OAAOivB,WAC3B,IAAI/vB,EAEFA,EADCnG,KAAKirG,gBAAgBxpE,UAAUzvB,GACtBhS,KAAKirG,gBAAgBuY,YAAYxxG,GAEjChS,KAAKirG,gBAAgBn9D,YAAY97B,EAAQpJ,EAAA,QAAU6O,MAG/DtR,EAAQkb,QAAQ,KACV4K,KAIJjsB,KAAKoiH,QAAQ5+E,gBAAgB,gBAIjCxjC,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,cAAgBgS,I,QACjD,GAAGhS,KAAKiH,SAAW+K,EAAOmV,UAAS,GAAO,CACxC,MAAMiF,EAAOpsB,KAAKirG,gBAAgBlzE,QAAQ/lB,GAE1ChS,KAAKoiH,QAAQhiH,UAAUkM,OAAO,SAAkC,QAAzB,EAAiB,QAAjB,EAAC8f,SAAgB,eAAE9U,cAAM,eAAEyF,OAClE/c,KAAK06G,gBACL16G,KAAK8gH,mBAIT9gH,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,yBAA2B6L,IACzDA,EAAO5E,SAAWjH,KAAKiH,QACxBjH,KAAKyjH,kBAITzjH,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,eAAgB,EAAEiH,aAChDjH,KAAKiH,SAAWA,GACjBjH,KAAKyqC,kBAITzqC,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,cAAgBoS,IAC9CpS,KAAKiH,SAAWmL,EAAO+U,YACxBnnB,KAAKyqC,kBAITzqC,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,mBAAqBiH,IACnDjH,KAAKiH,SAAWA,GACjBjH,KAAK8gH,kBAIN9gH,KAAKurF,eACNvrF,KAAKosB,KAAKprB,iBAAiB,UAAW,CAAC6F,EAAK68G,KAC1C,MAAMz3F,EAAajsB,KAAKosB,KAAKC,QAAQC,gBACrCyH,EAAA,QAAgBC,WAAWnzB,KAAMozB,IAC3BhI,MAEJjsB,KAAKurF,cAAcib,SAAWvyE,EAAM0vF,qBAAqB3jH,KAAKosB,KAAKnlB,QAEhEy8G,GACD1jH,KAAKurF,cAAci0B,0BACnBx/G,KAAKurF,cAAck0B,QAAQ54G,EAAK,IACvB7G,KAAKurF,cAAcgzB,SAC5Bv+G,KAAKurF,cAAci1B,+BACnBxgH,KAAKurF,cAAck0B,QAAQ54G,SAMnC7G,KAAKkrC,sBAAwB3/B,OAAO4/B,YAAYnrC,KAAKyqC,cAAe,KAE7DzqC,KAGF,yBACLA,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,uBAAwB,EAAEiH,SAAQgB,WAChEhB,IAAWjH,KAAKiH,QAEhBgB,GACDjI,KAAKmR,aAKJ,6BACLnR,KAAKurF,cAAgB,IAAI,GAAkBvrF,KAAMA,KAAKosB,KAAMpsB,KAAKgqD,mBAAoBhqD,KAAK46E,iBAGrF,WAAWgpC,GAChB5jH,KAAKosB,KAAK09D,aAAazjC,aAAarmD,KAAKiH,OAAQ28G,GAAa5jH,KAAKurF,cAAcuoB,uBAAuBoG,cAAcj6G,UAAUmM,QAAQvF,IAAM,EAAG,UAe5I,UAGL7G,KAAK+N,eAAeO,YACpB/C,OAAOypC,cAAch1C,KAAKkrC,uBAEvBlrC,KAAKurF,eACNvrF,KAAKurF,cAAcs4B,iBAGd7jH,KAAK8hH,iBACL9hH,KAAKurF,cAGP,QAAQtkF,GACbjH,KAAK8jH,UAAY9jH,KAAKiH,OACtBjH,KAAKiH,OAASA,EAEdjH,KAAKC,UAAU0C,MAAMC,QAAUqE,EAAS,GAAK,OAGxC,iBAAiBsrF,EAAmBI,EAAiB1I,G,QAC1D,MAAMhjF,EAASjH,KAAKiH,OAEjBjH,KAAKmiH,gBACNniH,KAAKmiH,cAAc/+G,aAAa,OAAQ,GAAK6D,GAC7CjH,KAAKmiH,cAAcphF,UAGrB,MAAMvJ,EAAcx3B,KAAK46E,gBAAgBpjD,YAAYvwB,GAErD,GADAjH,KAAKuiH,SAAWviH,KAAKuiH,QAAQniH,UAAUkM,OAAO,QAASkrB,GACpDx3B,KAAK46E,gBAAgB/8C,UAAU52B,IAC7BjH,KAAKoiH,QAAS,CACf,MAAMpwG,EAAS/K,EAAOivB,WACtB,OAAA3pB,EAAA,GAAevM,KAAKoiH,QAAS,eAAKpiH,KAAKirG,gBAAgBxpE,UAAUzvB,GAAU,iBAAmB,gBAC9FhS,KAAKoiH,QAAQhiH,UAAUkM,OAAO,SAAqD,QAA5C,EAAoC,QAApC,EAAAtM,KAAKirG,gBAAgBlzE,QAAQ/lB,UAAO,eAAEsF,cAAM,eAAEyF,OAIzF/c,KAAK06G,gBAEL16G,KAAK8gH,gBAEL,MAAM70F,EAAajsB,KAAKosB,KAAKC,QAAQC,gBACrC,GAAGtsB,KAAKurF,cACN,GAAsB,SAAnBvrF,KAAKosB,KAAKjpB,KAAiB,CAC5B,QAAsBuB,IAAnB1E,KAAK8jH,UAAyB,CAC/B,MAAMC,EAAmB,IAAI,GAAkB/jH,KAAMA,KAAKosB,KAAMpsB,KAAKgqD,mBAAoBhqD,KAAK46E,iBAC9F56E,KAAKurF,cAAcuoB,uBAAuBoG,cAAcj6G,UAAU8oB,YAAYg7F,EAAiBjQ,uBAAuBoG,cAAcj6G,WACpID,KAAKurF,cAAcs4B,UAEnB7jH,KAAKurF,cAAgBw4B,EAGvBhwF,EAAA,QAAgBC,WAAWnzB,KAAMozB,IAC3BhI,MAEJjsB,KAAKurF,cAAcib,SAAWvyE,EAAM0vF,qBAAqB18G,GAErDsrF,GACFvyF,KAAKurF,cAAcC,gBAAgB,UAGZ,eAAnBxrF,KAAKosB,KAAKjpB,OAClBnD,KAAKurF,cAAc4yB,UAAYn+G,KAAKosB,KAAKthB,SACzC9K,KAAKurF,cAAc5mF,MAAQ,EAC3B3E,KAAKurF,cAAc6yB,YAAc,EACjCp+G,KAAKurF,cAAcg0B,qBAIvB,aAAQ,KACNv/G,KAAKmR,WACLnR,KAAKyqC,eAAc,GACnBzqC,KAAKyjH,kBAIF,SAAS9+G,G,MACd,IAAI0jB,EAgEJ,GA/DsB,WAAnBroB,KAAKosB,KAAKjpB,MACaklB,OAAX3jB,IAAVC,EAA+B,eAAK,WACxB,eAAK,sBAAuB,CAACA,SAE/BD,IAAVC,GACD3E,KAAKgqD,mBAAmBgK,kBAAkBh0D,KAAKiH,OAAQ,CAAC,CAACG,EAAG,+BAA+B,GAAOvG,KAAKwF,IACrG,MAAM1B,EAAQ0B,EAAO,GAAG1B,MAIxB,GAHA3E,KAAKmR,SAASxM,IAGVA,EAAO,CACT3E,KAAKosB,KAAK09D,aAAax+C,QAAQ,MAG/B,MAAMuoE,EAAe7zG,KAAKosB,KAAK09D,aAAa19D,KACzCynF,EAAavoB,OAAOC,eACrBsoB,EAAavoB,OAAOC,cAAcuoB,uBAAuBxnG,QAAO,OAK7C,cAAnBtM,KAAKosB,KAAKjpB,MAGhBklB,EAFCroB,KAAKiH,SAAW2B,EAAA,QAAU6O,KAEjB,eAAK,aAEL,eAAK,0BAIJ/S,IAAVC,GACD3E,KAAKgqD,mBAAmBivC,qBAAqBj5F,KAAKiH,QAAQpG,KAAKoH,IAC7DjI,KAAKmR,SAASlJ,EAAK9F,WAGI,eAAnBnC,KAAKosB,KAAKjpB,MACMklB,OAAX3jB,IAAVC,EAA+B,eAAK,WACxB,eAAK,sBAAuB,CAACA,SAE/BD,IAAVC,GACD9B,QAAQC,IAAI,CACV9C,KAAKgqD,mBAAmBimC,WAAWjwF,KAAKiH,OAAQ,EAAG,EAAG,EAAGjH,KAAKosB,KAAKthB,UACnEjI,QAAQoD,YACPpF,KAAK,KACN,MAAM8D,EAAQ3E,KAAKgqD,mBAAmBouB,kBAAkBp4E,KAAKiH,OAAQjH,KAAKosB,KAAKthB,UAAUnG,MAC5E,OAAVA,EACD6G,WAAW,KACTxL,KAAKmR,YACJ,IAEHnR,KAAKmR,SAASxM,MAIO,SAAnB3E,KAAKosB,KAAKjpB,OAClBklB,EAAU,IAAI,KAAU,CACtBphB,OAAQjH,KAAKiH,OACb4E,QAAQ,IACPmJ,SAGL,OAAAzI,EAAA,GAAevM,KAAK4N,MAAOya,GAEL,SAAnBroB,KAAKosB,KAAKjpB,KAAiB,CAC5B,MAAM29B,EAAO9gC,KAAK46E,gBAAgBngD,QAAQz6B,KAAKiH,SAChC,QAAZ,EAAA65B,aAAI,EAAJA,EAAMxpB,cAAM,eAAEq0B,WACf3rC,KAAK4N,MAAM7D,OAAOg8B,OAKjB,gBACL,IAAI/lC,KAAKuiH,QAAS,OAElB,MAAMt7G,EAASjH,KAAKiH,OACpB,IAAIkQ,EAAQnX,KAAKorG,wBAAwBhmE,iBAAiBn+B,GAAQ,GAC/DjH,KAAK46E,gBAAgBpjD,YAAYvwB,IAClCjH,KAAKuiH,QAAQniH,UAAUuB,OAAO,aAAc,gBAC5C3B,KAAKuiH,QAAQniH,UAAUC,IAAI8W,EAAQ,eAAiB,cACpDnX,KAAKuiH,QAAQ5/G,MAAMC,QAAU,IAE7B5C,KAAKuiH,QAAQ5/G,MAAMC,QAAU,QCvwBpB,MAAM,WAA4B,EAAjD,c,oBAMU,KAAAkI,SAAW,EACX,KAAAF,MAAQ,GAGhB,qBACE5K,KAAKgkH,UAAUC,YAAYjkH,KAAKiH,OAAQjH,KAAK8K,SAAU9K,KAAK4K,OAGpD,OACR5K,KAAKC,UAAUkP,GAAK,2BACpBnP,KAAKC,UAAUG,UAAUC,IAAI,sBAC7BL,KAAKgwE,YAAc,IAAI,EAAY,UACnChwE,KAAK4N,MAAMmb,YAAY/oB,KAAKgwE,YAAY/vE,WAExCD,KAAKkkH,YAAc,EAAW,iCAC9BlkH,KAAKyN,OAAO1D,OAAO/J,KAAKkkH,aAExB,MAAMlxF,EAAI9yB,SAASC,cAAc,OACjC6yB,EAAE5yB,UAAUC,IAAI,sBAChBL,KAAK+K,WAAW9K,UAAU8oB,YAAYiK,GACtChzB,KAAKgkH,UAAY,IAAI,EAAUhxF,EAAGhzB,KAAKgwE,YAAa,CAClD/kE,SAAU,IAAI,EAAY,4BAA6B,cAI3D,KAAKhE,EAAgB6D,EAAmB8+E,EAAgDh/E,GACtF,MAAM+6B,EAAM1iC,MAAM8N,OAsBlB,OApBI/Q,KAAKiH,OAiBPjH,KAAKgkH,UAAUC,YAAYjkH,KAAKiH,OAAQjH,KAAK8K,SAAUF,IAhBvD5K,KAAK4K,MAAQA,EACb5K,KAAKiH,OAASA,EACdjH,KAAK8K,SAAWA,EAChB9K,KAAK4pF,WAAaA,EAElB5pF,KAAKkkH,YAAY9jH,UAAUkM,OAAO,QAAStM,KAAK4pF,YAC7C5pF,KAAK4pF,YACN,YAAiB5pF,KAAKkkH,YAAa,KACjC,IAAI,GAAgB,IAAIzvE,KAAQz0C,KAAK4pF,YAAYnrE,SAIrD7T,GAAS5K,KAAKgkH,UAAU55G,YAAYvI,WAAW6B,iBAAiBkH,GAEhE,GAAgBukC,eAAc,IAKzBxJ,GClDI,MAAM,GAqBnB,YAAoB2lD,EAA4Bl/D,EAAoBxhB,GAAhD,KAAA0gF,SAA4B,KAAAl/D,OAAoB,KAAAxhB,QAJ5D,KAAAH,WAAa,EACb,KAAA05G,cAAgB,EAkGxB,KAAApvC,YAAe9yE,IACb,OAAAyb,EAAA,GAAYzb,GACZ,IAAI,GAAgB,IAAIwyC,KAAQz0C,KAAKosB,KAAKC,QAAQu9D,YAAYnrE,QAGhE,KAAA2lG,aAAgBrgH,IACd,GAAG/D,KAAKm+C,eAAgB,OAAOn+C,KAAKm+C,eAEpC,MAAMl3C,EAASlD,EAAKqI,QAAQnF,OAAOkgB,WAC7B8iE,GAAalmF,EAAKqI,QAAQvF,UAAOnC,EAEjC4X,EAAQ,OAAAmoC,GAAA,GAAW1gD,GAEtBuY,IAAWtc,KAAKyK,WAAa,EAC9BzK,KAAKqkH,MAAMjhH,aAAa,WAAY,QAEpCpD,KAAKqkH,MAAM7gF,gBAAgB,YAGzBlnB,EAGFtc,KAAKskH,QAAQ9gF,gBAAgB,YAF7BxjC,KAAKskH,QAAQlhH,aAAa,WAAY,QAKxCpD,KAAKk9B,QAAQ98B,UAAUuB,OAAO,UAC9B3B,KAAKosB,KAAKC,QAAQ6pB,iBAAiB91C,UAAUuB,OAAO,yBAEpD,MAAM+J,EAAM1L,KAAKosB,KAAKkf,QAAQrkC,EAAQgjF,GACtCjqF,KAAKm+C,gBAAmBzyC,aAAe7I,QAAU6I,EAAM7I,QAAQoD,QAAQyF,IAAuB7K,KAAK,KACjGb,KAAKmkH,cAAgB7nG,EACrB,OAAA/P,EAAA,GAAevM,KAAKukH,aAAc,eAAK,KAAM,CAACjoG,EAAQ,EAAGtc,KAAKyK,cAE9D,MAAM+5G,EAAgBxkH,KAAK2L,YAAY/B,KAAKK,kBACzCjK,KAAKmkH,eAAkBK,EAAgB,GACxCxkH,KAAKgkH,UAAU54G,eAEhBiW,QAAQ,KACTrhB,KAAKm+C,eAAiB,QAI1B,KAAAsmE,eAAkBxiH,IAChB,MAAM4S,EAAS,OAAA4rB,GAAA,GAAUx+B,EAAE4S,OAAQ,MAChCA,GACD7U,KAAKokH,aAAavvG,IAItB,KAAA6vG,cAAiBziH,IACZjC,KAAKyK,aACNzK,KAAKosB,KAAKC,QAAQ6pB,iBAAiB91C,UAAUkM,OAAO,yBACpDtM,KAAKk9B,QAAQ98B,UAAUkM,OAAO,YAIlC,KAAAq4G,UAAa1iH,IACX,OAAAyb,EAAA,GAAYzb,GACZjC,KAAKokH,aAAapkH,KAAK2L,YAAY/B,KAAKwb,SAASplB,KAAKmkH,cAAgB,KAGxE,KAAAS,YAAe3iH,IACb,OAAAyb,EAAA,GAAYzb,GACZjC,KAAKokH,aAAapkH,KAAK2L,YAAY/B,KAAKwb,SAASplB,KAAKmkH,cAAgB,KA7JtEnkH,KAAKgV,QAAU9U,SAASC,cAAc,OACtCH,KAAKgV,QAAQ5U,UAAUC,IAAI,iBAAkB,cAAe,sBAE5DL,KAAKgxE,QAAU9wE,SAASC,cAAc,UACtCH,KAAKgxE,QAAQ5wE,UAAUC,IAAI,WAAY,aAAc,wBACrD,OAAAid,GAAA,QAAOtd,KAAKgxE,SAEZhxE,KAAKgxE,QAAQhwE,iBAAiB,QAAS,KACrChB,KAAKsrF,OAAOrrF,UAAUG,UAAUuB,OAAO,eACvC3B,KAAKgV,QAAQrT,SACb3B,KAAKgwE,YAAYruE,SACjB3B,KAAKk9B,QAAQv7B,SACb3B,KAAK6kH,OAAOljH,SACZ3B,KAAK6kH,OAAOx7G,oBAAoB,QAASrJ,KAAK0kH,eAC9C1kH,KAAK8kH,QAAQz7G,oBAAoB,QAASrJ,KAAK+0E,aAC/C/0E,KAAKqkH,MAAMh7G,oBAAoB,QAASrJ,KAAK2kH,WAC7C3kH,KAAKskH,QAAQj7G,oBAAoB,QAASrJ,KAAK4kH,aAC/C5kH,KAAK2L,YAAY/B,KAAKP,oBAAoB,QAASrJ,KAAKykH,gBACxDzkH,KAAKosB,KAAKC,QAAQ6pB,iBAAiB91C,UAAUuB,OAAO,0BACnD,CAACgW,MAAM,IAEV3X,KAAKgwE,YAAc,IAAI,EAAY,UAGnChwE,KAAKk9B,QAAUh9B,SAASC,cAAc,OACtCH,KAAKk9B,QAAQ98B,UAAUC,IAAI,sBAAuB,sBAElDL,KAAK2L,YAAc,IAAI,GAAY,EAAO,gBAAYjH,EAAW,IAAI,GACrE1E,KAAK2L,YAAY/B,KAAK5I,iBAAiB,QAAShB,KAAKykH,gBAErDzkH,KAAKgkH,UAAY,IAAI,EAAUhkH,KAAKk9B,QAASl9B,KAAKgwE,YAAa,CAC7D/kE,SAAUjL,KAAK2L,aACbhH,IACF3E,KAAKyK,WAAa9F,EAEd3E,KAAKyK,WAOPzK,KAAKokH,aAAapkH,KAAK2L,YAAY/B,KAAKwb,SAAS,KANjDplB,KAAKukH,aAAax7F,YAAY/oB,KAAKgwE,YAAY9tE,MAAQ,eAAK,YAAc,IAC1ElC,KAAKk9B,QAAQ98B,UAAUuB,OAAO,UAC9B3B,KAAKosB,KAAKC,QAAQ6pB,iBAAiB91C,UAAUuB,OAAO,yBACpD3B,KAAKqkH,MAAMjhH,aAAa,WAAY,QACpCpD,KAAKskH,QAAQlhH,aAAa,WAAY,WAK1CpD,KAAKgkH,UAAUC,YAAYjkH,KAAKosB,KAAKnlB,OAAQjH,KAAKosB,KAAKthB,UAGvD9K,KAAKosB,KAAKC,QAAQ6pB,iBAAiBnsC,OAAO/J,KAAKk9B,SAG/Cl9B,KAAK6kH,OAAS3kH,SAASC,cAAc,OACrCH,KAAK6kH,OAAOzkH,UAAUC,IAAI,sBAE1BL,KAAK6kH,OAAO7jH,iBAAiB,QAAShB,KAAK0kH,eAC3C,OAAApnG,GAAA,QAAOtd,KAAK6kH,QAEZ7kH,KAAKukH,aAAerkH,SAASC,cAAc,QAC3CH,KAAKukH,aAAankH,UAAUC,IAAI,qBAEhCL,KAAK8kH,QAAU5kH,SAASC,cAAc,UACtCH,KAAK8kH,QAAQ1kH,UAAUC,IAAI,WAAY,kBAEvCL,KAAKmhB,SAAWjhB,SAASC,cAAc,OACvCH,KAAKmhB,SAAS/gB,UAAUC,IAAI,wBAE5BL,KAAKqkH,MAAQnkH,SAASC,cAAc,UACpCH,KAAKqkH,MAAMjkH,UAAUC,IAAI,WAAY,YACrCL,KAAKskH,QAAUpkH,SAASC,cAAc,UACtCH,KAAKskH,QAAQlkH,UAAUC,IAAI,WAAY,cAEvCL,KAAKqkH,MAAMjhH,aAAa,WAAY,QACpCpD,KAAKskH,QAAQlhH,aAAa,WAAY,QAEtCpD,KAAK8kH,QAAQ9jH,iBAAiB,QAAShB,KAAK+0E,aAC5C/0E,KAAKqkH,MAAMrjH,iBAAiB,QAAShB,KAAK2kH,WAC1C3kH,KAAKskH,QAAQtjH,iBAAiB,QAAShB,KAAK4kH,aAC5C5kH,KAAKmhB,SAASpX,OAAO/J,KAAKqkH,MAAOrkH,KAAKskH,SAEtCtkH,KAAK6kH,OAAO96G,OAAO/J,KAAKukH,aAAcvkH,KAAK8kH,QAAS9kH,KAAKmhB,UAEzDnhB,KAAKsrF,OAAOrrF,UAAU6Q,cAAciQ,aAAa/gB,KAAK6kH,OAAQz4F,EAAKrqB,MAAMskF,WAGzErmF,KAAKgV,QAAQjL,OAAO/J,KAAKgxE,QAAShxE,KAAKgwE,YAAY/vE,WAEnDD,KAAKsrF,OAAOrrF,UAAUG,UAAUC,IAAI,eACpCL,KAAKsrF,OAAOrrF,UAAU6Q,cAAc/G,OAAO/J,KAAKgV,SAEhDhV,KAAKgwE,YAAYjuE,MAAM0J,QAEvBb,IAAU5K,KAAKgwE,YAAYnuE,WAAWK,MAAQ0I,ICrFnC,MAAM,WAAa,IA2BhC,YAAmBk/E,EACVmhB,EACA/N,EACAlZ,EACAh6B,EACA4wB,EACAuN,EACAC,EACAvrC,EACAqrC,EACAgjB,EACAjO,EACArK,EACAvK,EACA8iB,EACAtiG,EACAuiG,EACAnuB,EACAqL,EACAu4B,GAEP59G,QArBiB,KAAA6mF,eACV,KAAAmhB,kBACA,KAAA/N,iBACA,KAAAlZ,uBACA,KAAAh6B,qBACA,KAAA4wB,kBACA,KAAAuN,mBACA,KAAAC,oBACA,KAAAvrC,qBACA,KAAAqrC,kBACA,KAAAgjB,qBACA,KAAAjO,kBACA,KAAArK,aACA,KAAAvK,mBACA,KAAA8iB,oBACA,KAAAtiG,UACA,KAAAuiG,0BACA,KAAAnuB,kBACA,KAAAqL,wBACA,KAAAu4B,uBAlCF,KAAAkE,gBAAiB,EASjB,KAAA5hH,KAAiB,OAIjB,KAAAgiF,QAAS,EAyBdnlF,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,OAAQ,YAErCL,KAAKglH,aAAe9kH,SAASC,cAAc,OAC3CH,KAAKglH,aAAa5kH,UAAUC,IAAI,mBAIhCL,KAAKsuD,IAAM,OAAAC,EAAA,GAAO,OAAQ,IAAS02D,IAAM,IAASC,KAAO,IAASC,MAAQ,IAASr6F,OAGnF9qB,KAAKC,UAAU8J,OAAO/J,KAAKglH,cAC3BhlH,KAAK8pF,aAAa33E,eAAepI,OAAO/J,KAAKC,WAGxC,cAAcyU,GACnB,MAAMwtD,EAAQt5D,EAAA,QAAU25D,WAExB,IAAI98D,EACJ,GAA6B,UAA1By8D,EAAMD,WAAW9+D,MAA8D,aAA1CjD,SAASuvC,gBAAgB9sC,MAAM0jC,OAAuB,CAC5F,MAAM++E,EAAQplH,KAAKglH,aAAa5zE,iBAC7Bg0E,GAASA,EAAMh5G,QAAQjJ,OAAS++D,EAAMD,WAAW9+D,OAClDsC,EAAO2/G,GAeX,OAXI3/G,IACFA,EAAOvF,SAASC,cAAc,OAC9BsF,EAAKrF,UAAUC,IAAI,wBACnBoF,EAAK2G,QAAQjJ,KAAO++D,EAAMD,WAAW9+D,MAGV,UAA1B++D,EAAMD,WAAW9+D,OAClBsC,EAAK9C,MAAM8/D,gBAAkBP,EAAMD,WAAWrtB,MAC9CnvC,EAAK9C,MAAM0iH,gBAAkB,QAGxB,IAAIxiH,QAAeoD,IACxB,MAAMmxC,EAAK,KACT,MAAM19B,EAAO1Z,KAAKglH,aAAa5zE,iBAE5B13B,IAASjU,GAKZzF,KAAKglH,aAAaj7G,OAAOtE,GAIzB,aAAQ,KACN,aAAQ,KACN,aAAcA,EAAM,cAAc,EAAM,IAAKiU,EAAO,KAClDA,EAAK/X,UACH,UAIRsE,KAhBEA,KAmBDyO,EACD,OAAAirC,GAAA,GAAmBl6C,EAAMiP,EAAK0iC,GAE9BA,MAKC,QAAQj0C,GACbnD,KAAKmD,KAAOA,EAEK,cAAdnD,KAAKmD,OACNnD,KAAKgJ,mBAAqB,IAAMhJ,KAAKgqD,mBAAmBjhD,4BAA4B/I,KAAKiH,SAKtF,OAGLjH,KAAKsrF,OAAS,IAAI,GAAWtrF,KAAM,GAAiBA,KAAKgqD,mBAAoBhqD,KAAK46E,gBAAiB56E,KAAKirG,gBAAiBjrG,KAAKorG,wBAAyBprG,KAAKooF,kBAAmBpoF,KAAKkoF,gBAAiBloF,KAAK6gH,sBAC1M7gH,KAAKqsB,QAAU,IAAI,GAAYrsB,KAAMA,KAAKgqD,mBAAoBhqD,KAAK68C,mBAAoB78C,KAAKkoF,gBAAiBloF,KAAKgkF,qBAAsBhkF,KAAKmoF,iBAAkBnoF,KAAK46E,gBAAiB56E,KAAKooF,kBAAmBpoF,KAAKqoF,iBAAkBroF,KAAKsoF,uBACzOtoF,KAAK+B,MAAQ,IAAI,GAAU/B,KAAMA,KAAKgqD,mBAAoBhqD,KAAKsoF,sBAAuBtoF,KAAKk9F,eAAgBl9F,KAAKirG,gBAAiBjrG,KAAK46E,gBAAiB56E,KAAKkrG,mBAAoBlrG,KAAK8pF,aAAc9pF,KAAKqoF,iBAAkBroF,KAAKmrG,kBAAmBnrG,KAAKorG,wBAAyBprG,KAAKi9E,gBAAiBj9E,KAAKkoF,gBAAiBloF,KAAKgkF,sBACjUhkF,KAAKmuC,UAAY,IAAI,GAAcnuC,KAAMA,KAAKqsB,QAASrsB,KAAK+B,MAAO/B,KAAKgqD,oBACxEhqD,KAAKslH,YAAc,IAAI,GAAgBtlH,KAAKqsB,QAAQ6pB,iBAAkBl2C,KAAMA,KAAKgqD,mBAAoBhqD,KAAK46E,gBAAiB56E,KAAKi9F,gBAAiBj9F,KAAKk9F,eAAgBl9F,KAAKsoF,uBAE1J,SAAdtoF,KAAKmD,MACNnD,KAAKsrF,OAAOi6B,iBACZvlH,KAAKsrF,OAAOk6B,wBACU,WAAdxlH,KAAKmD,KACbnD,KAAKsrF,OAAOm6B,yBACU,eAAdzlH,KAAKmD,OACbnD,KAAKsrF,OAAOi6B,iBACZvlH,KAAKsrF,OAAOo6B,8BAGd1lH,KAAKsrF,OAAOjlE,YACZrmB,KAAK+B,MAAMskB,YAEM,SAAdrmB,KAAKmD,MACNnD,KAAKqsB,QAAQm5F,uBACbxlH,KAAK+B,MAAMyjH,wBACW,WAAdxlH,KAAKmD,MACbnD,KAAKqsB,QAAQo5F,yBACbzlH,KAAK+B,MAAM0jH,0BACW,cAAdzlH,KAAKmD,MACbnD,KAAKqsB,QAAQs5F,4BACb3lH,KAAK+B,MAAMyjH,wBACW,eAAdxlH,KAAKmD,OACbnD,KAAKqsB,QAAQm5F,uBACbxlH,KAAK+B,MAAMyjH,wBAGbxlH,KAAKC,UAAUG,UAAUC,IAAI,QAAUL,KAAKmD,MAC5CnD,KAAKC,UAAU8J,OAAO/J,KAAKsrF,OAAOrrF,UAAWD,KAAKqsB,QAAQ6pB,iBAAkBl2C,KAAK+B,MAAMskF,WAEvFrmF,KAAKqsB,QAAQte,eAAe1N,IAAIuI,EAAA,QAAhC5I,CAA2C,iBAAkB,EAAE0hC,cAAaC,gBACvE3hC,KAAKiH,SAAWy6B,GACjB1hC,KAAKsrC,QAAQ3J,KAIjB3hC,KAAKqsB,QAAQte,eAAe1N,IAAIuI,EAAA,QAAhC5I,CAA2C,cAAgBiC,IACtDA,EAAEgF,SAAWjH,KAAKiH,QACnBjH,KAAK8pF,aAAax+C,QAAQ,QAKzB,gBACLtrC,KAAKqsB,QAAQ3d,UAGR,UAGL1O,KAAKsrF,OAAOu4B,UACZ7jH,KAAKqsB,QAAQw3F,UACb7jH,KAAK+B,MAAM8hH,iBAEJ7jH,KAAKsrF,cACLtrF,KAAKqsB,eACLrsB,KAAK+B,aACL/B,KAAKmuC,iBACLnuC,KAAKslH,YAEZtlH,KAAKC,UAAU0B,SAKV,QAAQyyG,GAAY,GACzBp0G,KAAK+B,MAAM2M,QAAQ0lG,GACnBp0G,KAAKmuC,UAAUz/B,UAGV,QAAQzH,EAAgBgjF,GACzBhjF,EAEOjH,KAAKmlF,SACXnlF,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGdlO,KAAKmlF,QAAS,GAPdnlF,KAAKmlF,QAAS,EAUhB,MAAMgN,EAAWnyF,KAAKiH,SAAWA,EACjC,GAAIkrF,GAGG,GAAGnyF,KAAKm+C,eACb,YAHAv1C,EAAA,QAAU6F,cAAc,gBAAiBzO,MACzCA,KAAKiH,OAASA,EAQhB,IAAIA,EAOF,OANA,GAAgBkoC,eAAc,GAC9BnvC,KAAK0O,SAAQ,GACb1O,KAAKsrF,OAAOhgD,QAAQrkC,GACpBjH,KAAKqsB,QAAQif,QAAQrkC,QACrB2B,EAAA,QAAU6F,cAAc,eAAgBxH,GAM1C,IAAIkrF,EAAU,CACZ,MAAMyzB,EAAY,GAAgBj1G,OAAO,IACtCi1G,GACDA,EAAU7sF,QAGZ,GAAgBsW,eAAe/D,QAAQrkC,EAAQjH,KAAK8K,UACpD9K,KAAK+B,MAAM4/F,cACX3hG,KAAKmuC,UAAUz/B,UACf1O,KAAK6lH,uBAGP7lH,KAAKwuC,YAAc2jD,EAEnB,MAAM9rF,EAASrG,KAAKqsB,QAAQif,QAAQrkC,EAAQgjF,GAC5C,IAAI5jF,EACF,OAGF,MAAM,QAACF,GAAWE,EAIZ83C,EAAiBn+C,KAAKm+C,eAAiBh4C,EAAQkb,QAAQ,KACxDrhB,KAAKm+C,iBAAmBA,IACzBn+C,KAAKm+C,eAAiB,QAY1B,OARIg0C,IACF,GAAgB9iD,eAAey2E,aAAa9lH,KAAKm+C,gBACjD,GAAgB9O,eAAe02E,kBAAiB,IAM3C1/G,EAGF,uBACL,MAAMY,EAASjH,KAAKiH,OACpB,IAAIA,EACF,OAGF,IAAI9D,EAUAA,EARA8D,EAAOw1B,SAONx1B,EAAOi9B,YACD,WAEA,UATNj9B,EAAOuwB,cACD,WAEA,SAUXx3B,KAAKg3F,qBAAuBpuF,EAAA,QAAUw1B,SAAS4nF,aAAa7iH,GAGvD,aAAasnF,GAClB,OAAOzqF,KAAKsrC,QAAQtrC,KAAKiH,OAAQwjF,GAG5B,iBAAiB8H,EAAmBI,EAAiB1I,GAC1D,GAAGjqF,KAAKwuC,YAAa,OAErB,IAAIvnC,EAASjH,KAAKiH,OAClBjH,KAAKwuC,aAAc,EAEnBxuC,KAAK0O,SAAQ,GAEb1O,KAAKsrF,OAAOhgD,QAAQrkC,GACpBjH,KAAKsrF,OAAOqC,iBAAiB4E,EAAUI,EAAQ1I,GAC/CjqF,KAAKqsB,QAAQshE,mBACb3tF,KAAK+B,MAAM4rF,mBAEX,GAAgBt+C,eAAeV,sBAE/B3uC,KAAKsuD,IAAI23D,UAAU,QAAUh/G,EAAS,IAAMjH,KAAKmD,MAEjDyF,EAAA,QAAU6F,cAAc,eAAgBxH,GACxCjH,KAAK+kH,gBAAiB,EAGjB,qBACL,OAAO/kH,KAAKgqD,mBAAmBhhD,mBAAmBhJ,KAAKiH,QAGlD,WAAWJ,GAChB,OAAO7G,KAAKgqD,mBAAmBC,sBAAsBjqD,KAAKgJ,qBAAsBnC,GAI3E,aAAaA,GAClB,OAAO7G,KAAKgqD,mBAAmBihC,iBAAiBjrF,KAAKokD,WAAWv9C,IAG3D,aACL,OAAO7G,KAAKiH,SAAW2B,EAAA,QAAU6O,MAAQzX,KAAKiH,SAAW,MAAmBjH,KAAK46E,gBAAgBtO,WAAWtsE,KAAKiH,QAG5G,WAAW2D,GAChB,GAAI5K,KAAKiH,OAET,GAAGsc,EAAA,EAAWC,SACZ,IAAI,GAAWxjB,KAAKsrF,OAAQtrF,KAAM4K,OAC7B,CACL,IAAI4E,EAAM,GAAgBmB,OAAO,IAC7BnB,IACFA,EAAM,IAAI,GAAoB,KAGhCA,EAAIuB,KAAK/Q,KAAKiH,OAAQjH,KAAK8K,SAAU9K,KAAKqsB,QAAQu9D,WAAYh/E,K,cChYrD,MAAM,GAcnB,YAAoBk/E,GAAA,KAAAA,eAXZ,KAAAlsE,QAAiD,GAIjD,KAAAsoG,eAAgB,EAChB,KAAAC,mBAAoB,EAGpB,KAAAC,eAAyB,EA+SzB,KAAAC,gBAAmBpkH,IAIzB,GAFAjC,KAAKmmH,mBAAoB,EAEtB,sBAAoB,CAErB,GADA,OAAAzoG,EAAA,GAAYzb,GACiB,GAA1BjC,KAAKomH,iBAIN,YADApmH,KAAK2+B,OAFL3+B,KAAKsmH,eAAetmH,KAAKsmF,YAO7BtmF,KAAKye,QAtTC,OACNze,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,iBAAkB,YAAa,QAE5DL,KAAK4gB,QAAU1gB,SAASC,cAAc,OACtCH,KAAK4gB,QAAQxgB,UAAUC,IAAI,0BAE3B,MAAMkmH,EAASrmH,SAASC,cAAc,OAChCqmH,EAAStmH,SAASC,cAAc,OACtComH,EAAOnmH,UAAUC,IAAI,wBACrBmmH,EAAOpmH,UAAUC,IAAI,wBAET,CAAC,OAAQ,SAAU,YAAa,gBAAiB,YAAa,QACtEiG,QAAQ0sB,IACV,MAAMnY,EAAS,EAAWmY,EAAG,CAACrlB,UAAU,IACxC44G,EAAOx8G,OAAO/J,KAAK4d,QAAQoV,GAAKnY,GAEvB,SAANmY,EACDnY,EAAO7Z,iBAAiB,YAAciB,IACpC,OAAAyb,EAAA,GAAYzb,GACZjC,KAAK8pF,aAAa19D,KAAKrqB,MAAMmrG,cAAcl6E,GAC3ChzB,KAAKymH,oBAOP,YAAiB5rG,EAAS5Y,IACxB,OAAAyb,EAAA,GAAYzb,GACZjC,KAAKmtG,iBACLntG,KAAKymH,sBAKXzmH,KAAK0mH,eAAiB,EAAW,OAAQ,CAAC/4G,UAAU,IACpD3N,KAAK2mH,UAAYzmH,SAASC,cAAc,SACxC,gBAAMH,KAAK2mH,UAAW,qCAAiCjiH,EAAW,eAClE1E,KAAK2mH,UAAUvmH,UAAUC,IAAI,eAC7BL,KAAK2mH,UAAU3lH,iBAAiB,UAAYiB,IAC1C,MAAMg+D,GAASjgE,KAAK2mH,UAAUzkH,MAAMC,UAAY,IAAkB6uD,SAAShxD,KAAK2mH,UAAUzkH,OAE7E,UAAVD,EAAEsM,MACC0xD,EAQFjgE,KAAK4mH,UAAU3kH,IAPZjC,KAAK2mH,UAAUvmH,UAAUuR,SAAS,WACnC3R,KAAK2mH,UAAUvmH,UAAUuB,OAAO,SAC3B3B,KAAK2mH,UAAU19E,YAGtBjpC,KAAK2mH,UAAUvmH,UAAUC,IAAI,aAOnCL,KAAK2mH,UAAU3lH,iBAAiB,QAAUiB,IACxC,MAAMg+D,EAAQjgE,KAAK6mH,cAEnB7mH,KAAK2mH,UAAUvmH,UAAUkM,OAAO,WAAY2zD,GAC5CjgE,KAAK2mH,UAAUvmH,UAAUuB,OAAO,WAGlC3B,KAAK0mH,eAAe1lH,iBAAiB,YAAciB,IAEjD,OAAAyb,EAAA,GAAYzb,GACZjC,KAAKC,UAAUG,UAAUuB,OAAO,WAEhC3B,KAAKsmH,iBACLtmH,KAAK8mH,qBACL9mH,KAAKymH,oBAGPzmH,KAAK+mH,gBAAkB,EAAW,kCAAmC,CAACp5G,UAAU,IAChF3N,KAAK+mH,gBAAgB/lH,iBAAiB,YAAciB,IAElDjC,KAAK4mH,UAAU3kH,KAGjB,MAAM+kH,EAAW9mH,SAASC,cAAc,OACxC6mH,EAAS5mH,UAAUC,IAAI,uCAEvB,MAAM4mH,EAAa/mH,SAASC,cAAc,QACpC+mH,EAAahnH,SAASC,cAAc,QACpCgnH,EAAajnH,SAASC,cAAc,QAC1C8mH,EAAW7mH,UAAUC,IAAI,4BACzB6mH,EAAW9mH,UAAUC,IAAI,4BACzB8mH,EAAW/mH,UAAUC,IAAI,4BACzBkmH,EAAOxlG,aAAakmG,EAAYjnH,KAAK4d,QAAQua,MAC7C6uF,EAASj9G,OAAOo9G,EAAYnnH,KAAK+mH,iBACjCP,EAAOz8G,OAAO/J,KAAK0mH,eAAgBQ,EAAYlnH,KAAK2mH,UAAWK,GAG/DhnH,KAAK4gB,QAAQ7W,OAAOw8G,EAAQC,GAC5BxmH,KAAKC,UAAU8J,OAAO/J,KAAK4gB,SAC3B1gB,SAASiW,KAAKpM,OAAO/J,KAAKC,WAE1BsL,OAAOvK,iBAAiB,SAAU,KAChChB,KAAK2+B,SAIF,iBACD3+B,KAAKC,WAAcD,KAAKC,UAAUG,UAAUuR,SAAS,eACvD3R,KAAKye,OAGP,MAAM5D,EAAS7a,KAAK4d,QAAQua,KAC5Bn4B,KAAKC,UAAUG,UAAUC,IAAI,WAE7B,MAAM8tC,EAAYjuC,SAAS8mD,eAG3B,GAFAhnD,KAAKsmF,WAAan4C,EAAUs5C,WAAW,GAEpC5sE,EAAOza,UAAUuR,SAAS,UAAW,CACtC,MACMzL,EADiBlG,KAAKsmF,WAAWyhB,eACTj3F,cAC9B9Q,KAAK2mH,UAAUzkH,MAAQgE,EAAOyrD,UAE9B3xD,KAAK2mH,UAAUzkH,MAAQ,GAGzBlC,KAAK8mH,oBAAmB,GAExBt7G,WAAW,KACTxL,KAAK2mH,UAAUl7G,SACd,KACHzL,KAAK2mH,UAAUvmH,UAAUkM,OAAO,WAAYtM,KAAK6mH,eAG3C,UAAU5kH,GAChB,OAAAyb,EAAA,GAAYzb,GACZjC,KAAKsmH,iBACL,IAAI5xG,EAAM1U,KAAK2mH,UAAUzkH,MACtBwS,IAAQ,IAAkB0yG,iBAAiB1yG,KAC5CA,EAAM,WAAaA,GAErB1U,KAAK8pF,aAAa19D,KAAKrqB,MAAMmrG,cAAc,OAAQx4F,GACnDlJ,WAAW,KACTxL,KAAK2+B,QACJ,GAGG,cACN,OAAQ3+B,KAAK2mH,UAAUzkH,MAAMC,UAAY,IAAkB6uD,SAAShxD,KAAK2mH,UAAUzkH,OAG7E,eAAemkE,EAAermE,KAAKsmF,YACzC,MAAMn4C,EAAY5iC,OAAOy7C,eACzB7Y,EAAU+Y,kBACV/Y,EAAUinE,SAAS/uC,GACnBrmE,KAAK8pF,aAAa19D,KAAKrqB,MAAMmlF,aAAaz7E,QAGrC,OAGFzL,KAAKkO,OAERlO,KAAKC,UAAUG,UAAUuB,OAAO,cAEhCzB,SAASmJ,oBAAoB,UAAWrJ,KAAKqmH,iBAC7CrmH,KAAKmmH,mBAAoB,EAEzBp3G,EAAA,EAAwB6B,aAAa,UAElC5Q,KAAKqnH,aAAar6G,aAAahN,KAAKqnH,aACvCrnH,KAAKqnH,YAAc97G,OAAOC,WAAW,KACnCxL,KAAKqnH,iBAAc3iH,EACnB1E,KAAKC,UAAUG,UAAUC,IAAI,QAC7BL,KAAKC,UAAUG,UAAUuB,OAAO,YAC/B,MAGE,wBACL,MAAM2lH,EChNK,WACb,MAAMA,EAAgB,GAChBn5E,EAAY5iC,OAAOy7C,eACzB,IAAI,IAAIh8C,EAAI,EAAGA,EAAImjC,EAAUo5C,aAAcv8E,EAAG,CAC5C,MAAMq7D,EAAQl4B,EAAUs5C,WAAWz8E,GACnC,IAAI,eAAC+8F,EAAc,aAAEC,GAAgB3hC,EAGrC,IAF6B,IAA1B2hC,EAAavqB,WAAgBuqB,EAAeA,EAAap2C,YAEtDm2C,GAAkBA,IAAmBC,GACzCsf,EAAM3hH,KAAiC,IAA5BoiG,EAAetqB,SAAiBsqB,EAAiBA,EAAen2C,YAC3Em2C,EAAiBA,EAAe3vC,YAG/BkvD,EAAMA,EAAMnlH,OAAS,KAAO6lG,GAC7Bsf,EAAM3hH,KAAKqiG,GAKf,OAAOsf,EAAM1/G,OAAO4d,KAAUA,GD6Ld+hG,GACRz8B,EAAU,IAAI,IAAIjnF,IAAIyjH,EAAM7+G,IAAI+c,GAAQA,EAAK1E,cAG7C0mG,EAAmC,IAAI3jH,IAY7C,OAXCinF,EAA0BxkF,QAAQkf,IACjC,IAAI,MAAMriB,KAAQ,KAAc,CAC9B,MAAM6yG,EAAM,KAAa7yG,GACTqiB,EAAKiiG,QAAQzR,EAAIpjG,MAAQ,yBAC1B5S,KAAK8pF,aAAa19D,KAAKrqB,MAAMmlF,cAC1CsgC,EAAennH,IAAIL,KAAK4d,QAAQza,OAM/B,IAAIqkH,GAGN,wBACL,MAAME,EAAgB1nH,KAAK2nH,wBAE3B,IAAI,MAAM38G,KAAKhL,KAAK4d,QAAS,CAE3B,MAAM/C,EAAS7a,KAAK4d,QAAQ5S,GAC5B6P,EAAOza,UAAUkM,OAAO,SAAUo7G,EAAc3tF,SAASlf,KAIrD,mBAAmB+sG,GAAe,GACxC,MACMvhD,EADYnmE,SAAS8mD,eACHygC,WAAW,GAE7BogC,EAAW3nH,SAASiW,KAAK2F,wBACzBgsG,EAAgBzhD,EAAMvqD,wBACtBisG,EAAY/nH,KAAK8pF,aAAa19D,KAAKrqB,MAAM2qD,YAAY5wC,wBAE3D9b,KAAKC,UAAU0C,MAAMqqB,SAAW+6F,EAAUrnH,MAAQ,KAElD,MAAMsnH,EAAeF,EAAct0F,KAAuB,EAAhBq0F,EAASr0F,IAI7Cy0F,GAFejoH,KAAKC,UAAUG,UAAUuR,SAAS,WAAa3R,KAAK4gB,QAAQwwB,iBAAmBpxC,KAAK4gB,QAAQF,mBAElF5E,wBACzB0X,EAAMw0F,EAAeC,EAAUtnH,OAAS,EAExCyoC,EAAO2+E,EAAUhrG,KACjBykD,EAAQumD,EAAUhrG,KAAOgrG,EAAUrnH,MAAS2B,KAAKC,IAAIylH,EAAUrnH,MAAOunH,EAAUvnH,OACtF,IAAIqc,EACJ,GAAG6qG,EAAc,CACf,MAAMM,EAAgBloH,KAAKC,UAAU6b,wBACrCiB,EAAO,YAAMmrG,EAAcnrG,KAAMqsB,EAAMo4B,OAClC,CACL,MAAMjnD,EAAIutG,EAAc/qG,MAAQ+qG,EAAcpnH,MAAQunH,EAAUvnH,OAAS,EACzEqc,EAAO,YAAMxC,EAAG6uB,EAAMo4B,GAOxBxhE,KAAKC,UAAU0C,MAAMga,UAAY,eAAeI,QAAWyW,UAGtD,OAML,GALGxzB,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGXouF,KAED,YADAt8F,KAAK2+B,OAQP,QAJwBj6B,IAArB1E,KAAKqnH,aACNr6G,aAAahN,KAAKqnH,aAGjBrnH,KAAKC,UAAUG,UAAUuR,SAAS,cACnC,OAGF3R,KAAKk2G,wBAELl2G,KAAKC,UAAUG,UAAUuB,OAAO,WAChC,MAAMwmH,EAAcnoH,KAAKC,UAAUG,UAAUuR,SAAS,QACnDw2G,IACDnoH,KAAKC,UAAUG,UAAUuB,OAAO,QAChC3B,KAAKC,UAAUG,UAAUC,IAAI,kBAG/BL,KAAK8mH,qBAEFqB,IACInoH,KAAKC,UAAUgpC,WACpBjpC,KAAKC,UAAUG,UAAUuB,OAAO,kBAGlC3B,KAAKC,UAAUG,UAAUC,IAAI,cAEzB,cACF0O,EAAA,EAAwBoB,SAAS,CAC/BhN,KAAM,SACNiN,MAAO,KACLpQ,KAAK2+B,UAmCN,kBACF3+B,KAAKmmH,oBACRnmH,KAAKmmH,mBAAoB,EAIzBjmH,SAASc,iBAAiB,UAAWhB,KAAKqmH,gBAAiB,CAAC1uG,MAAM,KAG7D,kBACF,wBAAuB,cACxBzX,SAASmJ,oBAAoB,UAAWrJ,KAAKqmH,iBAC7CnmH,SAASc,iBAAiB,UAAYiB,IACpC,OAAAyb,EAAA,GAAYzb,GACZjC,KAAKomH,eAAiB,EACtBpmH,KAAKmmH,mBAAoB,EACzBnmH,KAAKooH,mBACJ,CAACzwG,MAAM,KAIP,kBACF3X,KAAKkmH,gBACRlmH,KAAKkmH,eAAgB,EACrBhmH,SAASc,iBAAiB,kBAAoBiB,IAG5C,GAAG/B,SAASsnF,gBAAkBxnF,KAAK2mH,UACjC,OAGF,GAAGzmH,SAASsnF,gBAAkBxnF,KAAK8pF,aAAa19D,KAAKrqB,MAAMmlF,aAEzD,YADAlnF,KAAK2+B,OAIP,MAAMwP,EAAYjuC,SAAS8mD,eAC3B,GAAGs1C,GAAiBnuD,GAClBnuC,KAAK2+B,YAIP,GAAG,sBACD,GAAG,YACD3+B,KAAKye,OACLze,KAAK8mH,yBACA,CACL,GAA2B,IAAxB9mH,KAAKomH,eAEN,YADApmH,KAAKomH,eAAiB,GAIxBpmH,KAAKsmF,WAAan4C,EAAUs5C,WAAW,GACvCznF,KAAKooH,uBAQPpoH,KAAKooH,sBEpZb,SAASC,GAAaC,EAAYC,EAAYC,EAAuBC,EAAsBC,EAAmBnuG,EAAWE,GACvH,MAAO,CAAC6tG,EAAI,IAAKC,EAAI,IACbC,EAAe,IACfC,EAAc,IACdC,EAAW,IACXnuG,EAAG,IAAKE,GAAIuM,KAAK,IAGZ,SAAS2hG,GAAiBpuG,EAAWE,EAAW/Z,EAAeC,EAAgBioH,EAAYC,EAAY17D,EAAY27D,GAChI,MAAMlkD,EAAiB,GAwCvB,OArCAA,EAAKj/D,KAAK,KAAO4U,EAAI7Z,EAAQ,GAAK,IAAM+Z,GAGxCmqD,EAAKj/D,KAAK,KAAO4U,EAAI7Z,EAAQmoH,IAE1BA,EAAK,GAENjkD,EAAKj/D,KAAK,IAAM0iH,GAAaQ,EAAIA,EAAI,EAAG,EAAG,EAAItuG,EAAI7Z,EAAS+Z,EAAIouG,IAIlEjkD,EAAKj/D,KAAK,KAAO8U,EAAI9Z,EAASwsD,IAE3BA,EAAK,GAENyX,EAAKj/D,KAAK,IAAM0iH,GAAal7D,EAAIA,EAAI,EAAG,EAAG,EAAI5yC,EAAI7Z,EAAQysD,EAAM1yC,EAAI9Z,IAIvEikE,EAAKj/D,KAAK,KAAO4U,EAAIuuG,IAElBA,EAAK,GAENlkD,EAAKj/D,KAAK,IAAM0iH,GAAaS,EAAIA,EAAI,EAAG,EAAG,EAAIvuG,EAAI,EAAKE,EAAI9Z,EAASmoH,IAIvElkD,EAAKj/D,KAAK,KAAO8U,EAAImuG,IAElBA,EAAK,GAENhkD,EAAKj/D,KAAK,IAAM0iH,GAAaO,EAAIA,EAAI,EAAG,EAAG,EAAIruG,EAAIquG,EAAMnuG,EAAI,IAI/DmqD,EAAKj/D,KAAK,KAEHi/D,EAAK59C,KAAK,KAGnB,KAAe2hG,iBAAmBA,GCtDnB,MAAM,GAMnB,YAAYttF,EAA+Br4B,GAmBzC,IAAI+lH,EAnBqC,KAAA/lH,UA+C3C,KAAAgmH,WAAc/mH,IACZjC,KAAKC,UAAUG,UAAUC,IAAI,gBAI/B,KAAA4oH,YAAehnH,IACbjC,KAAKC,UAAUG,UAAUuB,OAAO,gBAIlC,KAAAunH,OAAUjnH,IACRjC,KAAKgD,QAAQkmH,OAAOjnH,IAnDpBjC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,OAAQ,aAErCL,KAAKmpH,eAAiBjpH,SAASC,cAAc,OAC7CH,KAAKmpH,eAAe/oH,UAAUC,IAAI,wBAElCL,KAAK4jB,IAAM1jB,SAAS2jB,gBAAgB,6BAA8B,OAClE7jB,KAAK4jB,IAAIxjB,UAAUC,IAAI,gBAEvBL,KAAKy7G,KAAOv7G,SAAS2jB,gBAAgB,6BAA8B,QACnE7jB,KAAKy7G,KAAKr7G,UAAUC,IAAI,qBAGrB2C,EAAQqK,OACT07G,EAAW7oH,SAASC,cAAc,OAClC4oH,EAAS3oH,UAAUC,IAAI,YAAa,SAAW2C,EAAQqK,OAGzD,MAAM+7G,EAAalpH,SAASC,cAAc,OAI1C,IAAIkpH,EAHJD,EAAWhpH,UAAUC,IAAI,eACzB+oH,EAAWr/G,OAAO,eAAK/G,EAAQyK,OAAQzK,EAAQsmH,aAG5CtmH,EAAQ0oB,WACT29F,EAAenpH,SAASC,cAAc,OACtCkpH,EAAajpH,UAAUC,IAAI,iBAC3BgpH,EAAat/G,OAAO,eAAK/G,EAAQ0oB,YAGnC1rB,KAAK4jB,IAAI7Z,OAAO/J,KAAKy7G,MACrBz7G,KAAKmpH,eAAep/G,OAAO/J,KAAK4jB,KAEhC5jB,KAAKC,UAAU8J,UAAU,CAAC/J,KAAKmpH,eAAgBJ,EAAUK,EAAYC,GAAczhH,OAAOc,UAC1F2yB,EAAStxB,OAAO/J,KAAKC,WAErBD,KAAKC,UAAUe,iBAAiB,WAAYhB,KAAKgpH,YACjDhpH,KAAKC,UAAUe,iBAAiB,YAAahB,KAAKipH,aAClDjpH,KAAKC,UAAUe,iBAAiB,OAAQhB,KAAKkpH,QAiB/C,iBACSlpH,KAAKgD,QACZhD,KAAKC,UAAU0B,SACf3B,KAAKC,UAAUoJ,oBAAoB,WAAYrJ,KAAKgpH,YACpDhpH,KAAKC,UAAUoJ,oBAAoB,YAAarJ,KAAKipH,aACrDjpH,KAAKC,UAAUoJ,oBAAoB,OAAQrJ,KAAKkpH,QAGlD,UACE,MAAMrtG,EAAO7b,KAAKmpH,eAAertG,wBACjC9b,KAAK4jB,IAAIE,eAAe,KAAM,sBAAuB,QACrD9jB,KAAK4jB,IAAIE,eAAe,KAAM,UAAW,OAAOjI,EAAKnb,SAASmb,EAAKlb,UACnEX,KAAK4jB,IAAIE,eAAe,KAAM,QAAS,GAAGjI,EAAKnb,OAC/CV,KAAK4jB,IAAIE,eAAe,KAAM,SAAU,GAAGjI,EAAKlb,QAEhD,MAKM4f,EAAIooG,GADE10E,IAFEp4B,EAAKnb,MAFJ,GAGDmb,EAAKlb,OAHJ,gBAMfX,KAAKy7G,KAAK33F,eAAe,KAAM,IAAKvD,ICzFzB,SAASgpG,GAAkBtiG,GACxCA,EAAS3gB,QAAQyJ,GAAMA,EAAG3P,UAAUC,IAAI,kBAExC,eAAYQ,KAAK,KACfomB,EAAS3gB,QAAQyJ,GAAMA,EAAG3P,UAAUuB,OAAO,oB,ICNnC6nH,G,UCgBG,MAAM,WAA4B,KAC/C,YAAY/tD,EAAcguD,GACxBxmH,MAAM,yBAA0B,aAAgB,CAAC,CAC/CmxB,QAASq1F,EAAWnyG,OAAOoyG,UAAY,yBAA2B,uBAClEryF,SAAU,KACR,KAAWtB,UAAU,4BAA6B,CAAC0lC,SAClD56D,KAAM8oH,IACL1zD,GAAA,EAAkB2zD,qBAAqBD,GACvC,MACM1iH,EADQ0iH,EAA4B3zD,MAAM,GAC5B7mD,GAAGgY,UAAS,GAChCve,EAAA,QAAU6F,cAAc,gBAAiB,CAACxH,iBAG3C,CAACu3B,UAAU,EAAMhI,iBAAiB,EAAMrgB,MAAM,IAEnDnW,KAAKyN,OAAO9L,SAeZ,MAAMswB,EAAa,IAAI,GACvBA,EAAW7uB,aAAa,SAAU,KAClC6uB,EAAW7xB,UAAUC,IAAI,cACC,UAAvBopH,EAAWjlH,MAAM4C,GAClBqiH,EAAWjlH,MAAQ,IAAiBi9E,UAAUgoC,EAAWjlH,OACzDmlB,GAAU,CACR1pB,UAAWgyB,EACX7tB,QAAS,KACTI,MAAOilH,EAAWjlH,MAClBqlB,UAAW,IACXD,SAAU,IACVG,kBAAkB,IAEpBkI,EAAWtvB,MAAMjC,MAAQuxB,EAAWtvB,MAAMhC,OAAS,IAEnDiY,EAAA,EAAkBixG,SAAS53F,EAAY,MAAc,EAAOw3F,EAAW77G,OAGzE,MAAMA,EAAQ1N,SAASC,cAAc,OACrCyN,EAAMxN,UAAUC,IAAI,cACpBuN,EAAM3J,UAAY,IAAkB6nB,cAAc29F,EAAW77G,OAG7D,MAAM4pB,EAAciyF,EAAWnyG,OAAOoyG,UAChCI,EAAc,eAAKtyF,EAAc,cAAgB,UAAW,CAACiyF,EAAWt3D,qBAC9E23D,EAAY1pH,UAAUC,IAAI,2BAE1BL,KAAKmW,KAAKpM,OAAOkoB,EAAYrkB,EAAOk8G,KDzExC,SAAYN,GACV,yBACA,mCACA,iCACA,6BACA,+BALF,CAAYA,QAAkB,K,iCEYf,MAAMO,GASnB,YAAYtlB,GACVzkG,KAAKgqH,UAAY,GACjBhqH,KAAKiqH,UAAY,EAEjBjqH,KAAKkqH,EAAIzlB,EACTzkG,KAAKi0C,OAAS,IAAI9rC,MAAMs8F,EAAI,GAE5BzkG,KAAKmqH,WAAa,IAAIhiH,MAAMs8F,EAAI,GAChCzkG,KAAKohB,SAAW,IAAIjZ,MAAMs8F,EAAI,GAC9BzkG,KAAKoqH,MAAQ,IAAIjiH,MAAMs8F,EAAI,GAE3B,IAAI,IAAIz5F,EAAI,EAAGA,GAAKy5F,EAAGz5F,IACrBhL,KAAKqqH,aAAarqH,KAAKi0C,OAAQjpC,GAC/BhL,KAAKqqH,aAAarqH,KAAKmqH,WAAYn/G,GACnChL,KAAKohB,SAASpW,GAAK,EAIf,aAAaipC,EAAgBjpC,GACnC,MAAM,UAACg/G,EAAS,UAAEC,EAAS,MAAEG,GAASpqH,KAEhCsqH,EAASN,EAAYC,EAC3Bh2E,EAAOjpC,GAAKi/G,EAAY5nH,KAAKq1B,SAAW4yF,EACxCF,EAAMp/G,GAAK,KAAQ,KAAQ3I,KAAKq1B,SAG1B,mBACN,MAAM,OAACuc,EAAM,WAAEk2E,EAAU,SAAE/oG,EAAQ,EAAE8oG,GAAKlqH,KAC1C,IAAI,IAAIgL,EAAI,EAAGA,EAAIk/G,EAAGl/G,IACpBhL,KAAKqqH,aAAap2E,EAAQjpC,GAC1BhL,KAAKqqH,aAAaF,EAAYn/G,GAC9BoW,EAASpW,GAAK,EAIX,OAAOu/G,EAAmBC,GAC/B,MAAM,EAACN,EAAC,SAAE9oG,EAAQ,MAAEgpG,EAAK,OAAEn2E,EAAM,WAAEk2E,GAAcnqH,KACjD,IAAI,IAAIgL,EAAI,EAAGA,GAAKk/G,EAAGl/G,IACrBoW,EAASpW,IArDU,GAqDHo/G,EAAMp/G,GAAkBu/G,EAAYH,EAAMp/G,GAtDvC,IAsDwDw/G,EACxEppG,EAASpW,IAAM,IAChBoW,EAASpW,GAAK,EACdipC,EAAOjpC,GAAKm/G,EAAWn/G,GACvBhL,KAAKqqH,aAAaF,EAAYn/G,IAK7B,KAAK+R,EAAcyW,EAAauV,EAAejsB,EAAgBpa,EAA2B+nH,EAAgDC,EAAmBC,GAClK,GAAGjoH,EAAOsO,WAAY,CACpB,MAAMitC,EAAMv7C,EAAOsO,WAAW,MAI9BitC,EAAI2sE,YACJ3sE,EAAI4sE,OAAO9hF,EAAOjsB,GAClBmhC,EAAI6sE,OAAO/tG,EAAMD,GAEjB,MAAM,OAACm3B,EAAM,WAAEk2E,EAAU,EAAED,GAAKlqH,KAChC,IAAI,IAAIgL,EAAI,EAAGA,GAAKk/G,EAAGl/G,IACrB,GAAS,IAANA,EAAS,CACV,MAAMoW,EAAWphB,KAAKohB,SAASpW,GAEzByP,GAAK+Y,GADAygB,EAAOjpC,IAAM,EAAMoW,GAAY+oG,EAAWn/G,GAAKoW,IACnCupG,EAAmBD,GAAa,EAAMC,GAC7D1sE,EAAI6sE,OAAO/tG,EAAMtC,OACZ,CACL,MAAM2G,EAAWphB,KAAKohB,SAASpW,EAAI,GAC7B+/G,EAAK92E,EAAOjpC,EAAI,IAAM,EAAMoW,GAAY+oG,EAAWn/G,EAAI,GAAKoW,EAC5D4pG,EAAehrH,KAAKohB,SAASpW,GAE7BigH,GAAMliF,EAAQhsB,GAAQmtG,GAAKl/G,EAAI,GAC/BkgH,GAAMniF,EAAQhsB,GAAQmtG,EAAIl/G,EAC1BmgH,EAAKF,GAAMC,EAAKD,GAAM,EAEtBG,GAAM53F,EAAMu3F,GAAMJ,EAAmBD,GAAa,EAAMC,GACxDU,GAAM73F,GANDygB,EAAOjpC,IAAM,EAAMggH,GAAgBb,EAAWn/G,GAAKggH,IAMtCL,EAAmBD,GAAa,EAAMC,GAC9D1sE,EAAIqtE,cAAcH,EAAIC,EAAID,EAAIE,EAAIH,EAAIG,GACnCrgH,IAAMk/G,GACPjsE,EAAI6sE,OAAO/hF,EAAOjsB,GAMxB2tG,EAAMxsE,GACNA,EAAIzyB,OACJyyB,EAAIstE,cClGH,MAAM,GAGX,YAAmBC,GAAA,KAAAA,UACjBxrH,KAAKyrH,eAAeD,GAGf,eAAeA,GACpBxrH,KAAK0rH,OAAS,CAACztE,EAAKlhC,EAAMyW,EAAKuV,EAAOjsB,KACpCmhC,EAAI0tE,UAAY,GAAaC,oBAAoB3tE,EAAKutE,EAASzuG,EAAMyW,EAAKuV,EAAOjsB,IAKrF,2BAA2BmhC,EAA+B96C,EAAwB0oH,EAAYC,EAAYb,EAAYG,GACpH,MAAMhjF,EAAW6V,EAAI8tE,qBAAqBF,EAAIC,EAAIb,EAAIG,GAgBtD,OAfGjoH,IAAS,KAAiB6oH,gBAC3B5jF,EAAS6jF,aAAa,EAAG,WACzB7jF,EAAS6jF,aAAa,GAAI,WAC1B7jF,EAAS6jF,aAAa,EAAG,YACjB9oH,IAAS,KAAiB+oH,SAClC9jF,EAAS6jF,aAAa,EAAG,WACzB7jF,EAAS6jF,aAAa,EAAG,YACjB9oH,IAAS,KAAiBgpH,OAClC/jF,EAAS6jF,aAAa,EAAG,WACzB7jF,EAAS6jF,aAAa,EAAG,YACjB9oH,IAAS,KAAiBipH,aAClChkF,EAAS6jF,aAAa,EAAG,WACzB7jF,EAAS6jF,aAAa,EAAG,YAGpB7jF,EAGT,OAAOznC,EAAgBD,EAAe2rH,EAAY9B,KAKrC,MAAM,GAmCnB,cAmEQ,KAAA+B,8BAAiCrqH,IACvCjC,KAAKusH,UACLvsH,KAAKwsH,eAGC,KAAAC,aAAe,KAClBzsH,KAAK0sH,gBACN1/G,aAAahN,KAAK0sH,eAClB1sH,KAAK0sH,cAAgB,MAGvB1sH,KAAK0uF,UAAW,EAChB1uF,KAAK2sH,eACL3sH,KAAK0sH,cAAgBnhH,OAAOC,WAAW,KACrCxL,KAAK0uF,UAAW,EAChB1uF,KAAK4sH,cACJ,MAWG,KAAAC,YAAc,KACpB7sH,KAAK8sH,SAAU,EACf9sH,KAAK4sH,cAGC,KAAAG,WAAa,KACnB/sH,KAAK8sH,SAAU,GAGT,KAAAF,WAAa,KAChB5sH,KAAKgtH,KAERhtH,KAAKitH,QAGC,KAAAA,KAAO,CAAC5rB,GAAQ,KAEtB,GADArhG,KAAKgtH,IAAM,MACPhtH,KAAKusD,QACP,OAEF,MAAM,IAAC2gE,EAAG,KAAEC,EAAI,KAAEC,EAAI,MAAEngE,EAAK,KAAElwC,EAAI,IAAEyW,EAAG,MAAEuV,EAAK,OAAEjsB,EAAM,aAAEuwG,EAAY,cAAEC,EAAa,QAAER,EAAO,SAAEp+B,EAAQ,OAAEhsF,GAAU1C,KACnH,IAAI8sH,IAAYp+B,GAAY1uF,KAAKutH,iBAAmB,EAClD,OAMF,IAAIlB,EADY53E,KAAKC,MACD10C,KAAKwtH,eACtBnB,EAAK,KACNA,EAAK,IAIJrsH,KAAKytH,qBAAuBztH,KAAKuqH,YAClCvqH,KAAKuqH,WAAavqH,KAAK0tH,qBAAuBrB,EAC3CrsH,KAAK0tH,qBAAuB,EAC1B1tH,KAAKuqH,UAAYvqH,KAAKytH,qBACvBztH,KAAKuqH,UAAYvqH,KAAKytH,oBAGrBztH,KAAKuqH,UAAYvqH,KAAKytH,qBACvBztH,KAAKuqH,UAAYvqH,KAAKytH,qBAKzBztH,KAAKytH,qBAAuBztH,KAAK2tH,aAClC3tH,KAAK2tH,YAAc3tH,KAAK4tH,sBAAwBvB,EAC7CrsH,KAAK4tH,sBAAwB,EAC3B5tH,KAAK2tH,WAAa3tH,KAAKytH,qBACxBztH,KAAK2tH,WAAa3tH,KAAKytH,oBAGtBztH,KAAK2tH,WAAa3tH,KAAKytH,qBACxBztH,KAAK2tH,WAAa3tH,KAAKytH,qBAK1BH,IACDttH,KAAKutH,iBAAmBlB,EAAK,IAC1BrsH,KAAKutH,gBAAkB,IACxBvtH,KAAKutH,gBAAkB,EACvBvtH,KAAKstH,cAAgB,OAIzB,MAAM,UAAC/C,EAAS,WAAEoD,EAAU,gBAAEJ,GAAmBvtH,KAE3C6tH,EAAO,EAAIF,EAAa1gE,EACxB6gE,EAAO,EAAIH,EAAa1gE,EAElBvqD,EAAOsO,WAAW,MAC1BC,UAAU,EAAG,EAAGvO,EAAOhC,MAAOgC,EAAO/B,QAEzCusH,EAAIjD,UAAY,EAChBiD,EAAIlD,WAAa,EAAI,EAAIO,GAAat9D,EACtCkgE,EAAKlD,UAAY,EACjBkD,EAAKnD,WAAa,EAAI,EAAIO,GAAat9D,EACvCmgE,EAAKnD,UAAY,EACjBmD,EAAKpD,WAAa,EAAI,EAAIO,GAAat9D,EAEvCigE,EAAInsF,OAAOwpF,EAAW,IACtB4C,EAAKpsF,OAAOwpF,EAAW,IACvB6C,EAAKrsF,OAAOwpF,EAAW,IAEvB,IAAI,IAAIv/G,EAAI,EAAGA,EAAI,EAAGA,IAAK,CACzB,GAAS,IAANA,IAAYsiH,EACb,SAGF,IAAItuD,EAAQ,EACR/qC,EAAsB,KACjB,IAANjpB,GACDg0D,EAAQ,EAAIuuD,EACZt5F,EAAQq5F,IAGRtuD,EAAQsuD,EAAgBC,EAAkB,EAC1CF,EAAatsF,OAAOjkB,EAAS0W,EAAKuV,EAAQhsB,EAAMsvG,EAAI9B,GACpDt2F,EAAQo5F,GAIV,MAAMU,EAAU9vE,IACdA,EAAI+vE,YAAc,GAAMhvD,EACxB/qC,EAAMy3F,OAAOztE,EAAKlhC,EAAMyW,EAAKuV,EAAOjsB,IAEhC2tG,EAASxsE,IACbA,EAAI+vE,YAAoB,IAANhjH,EAAU,EAAIg0D,EAChC/qC,EAAMy3F,OAAOztE,EAAKlhC,EAAMyW,EAAKuV,EAAOjsB,IAGtCqwG,EAAKF,KAAKlwG,EAAMyW,EAAMq6F,EAAM9kF,EAAOjsB,EAAQpa,EAAQqrH,EAAQv6F,EAAK,GAChE45F,EAAKH,KAAKlwG,EAAMyW,EAAMs6F,EAAM/kF,EAAOjsB,EAAQpa,EAAQqrH,EAAQv6F,EAAK,GAChE05F,EAAID,KAAKlwG,EAAMyW,EAAKuV,EAAOjsB,EAAQpa,EAAQ+nH,EAAOj3F,EAAK,GAGrD6tE,IACFrhG,KAAKgtH,IAAM9tG,sBAAsB,IAAMlf,KAAKitH,UAIzC,KAAAgB,gBAAkB,CAACzC,EAA2B3wE,KACnD,MAAM,aAACwyE,EAAY,OAAEa,GAAUluH,MAE5BqtH,aAAY,EAAZA,EAAc7B,WAAYA,IAI7BxrH,KAAKstH,cAAgBzyE,EAAWwyE,EAAe,KAC/CrtH,KAAKqtH,aAAea,EAAOl+G,IAAIw7G,GAC/BxrH,KAAKutH,gBAAkBvtH,KAAKstH,cAAgB,EAAM,IAlOlDttH,KAAK8sH,SAAU,EACf9sH,KAAK0uF,UAAW,EAChB1uF,KAAKwtH,eAAiB/4E,KAAKC,MAC3B10C,KAAKuqH,UAAY,EACjBvqH,KAAK2tH,WAAa,EAElB3tH,KAAKkuH,OAAS,IAAIx+G,IAAI,CACpB,CAAC,KAAiBw8G,QAAS,IAAI,GAAa,KAAiBA,UAC7D,CAAC,KAAiBC,MAAO,IAAI,GAAa,KAAiBA,QAC3D,CAAC,KAAiBH,eAAgB,IAAI,GAAa,KAAiBA,iBACpE,CAAC,KAAiBI,WAAY,IAAI,GAAa,KAAiBA,eAElEpsH,KAAKstH,cAAgB,KACrBttH,KAAKqtH,aAAertH,KAAKkuH,OAAOl+G,IAAI,KAAiBo8G,YACrDpsH,KAAKutH,gBAAkB,EAGlB,oBACFvtH,KAAKusD,UAIRvsD,KAAKusD,SAAU,EAGfhhD,OAAOvK,iBAAiB,SAAUhB,KAAKysH,cACvCzsH,KAAK8S,MAAQvH,OAAO4iH,WAAW,sCAC/BnuH,KAAK8S,MAAM9R,iBAAiB,SAAUhB,KAAKssH,+BAE3CtsH,KAAKusH,UACLvsH,KAAKwsH,cAELxsH,KAAKktH,IAAM,IAAInD,GAAiB,GAChC/pH,KAAKmtH,KAAO,IAAIpD,GAAiB,GACjC/pH,KAAKotH,KAAO,IAAIrD,GAAiB,GACjC/pH,KAAKouH,aAAapuH,KAAKuqH,WAEvBvqH,KAAKitH,QAGA,uBACLjtH,KAAKusD,SAAU,EAGfhhD,OAAOlC,oBAAoB,SAAUrJ,KAAKysH,cAC1CzsH,KAAK8S,MAAM9R,iBAAiB,SAAUhB,KAAKssH,+BAE3C,MAAM,OAAC5pH,GAAU1C,KACL0C,EAAOsO,WAAW,MAC1BC,UAAU,EAAG,EAAGvO,EAAOhC,MAAOgC,EAAO/B,QAGnC,UACNX,KAAKitD,MAAQ1hD,OAAO8iH,iBACpBruH,KAAKwzB,IAAM,GAAKxzB,KAAKitD,MACrBjtD,KAAK+oC,OAAS/oC,KAAKusD,QAAUvsD,KAAKC,UAAUi+B,YAAc,MAAQl+B,KAAKitD,MACvEjtD,KAAK8c,QAAU9c,KAAKusD,QAAUvsD,KAAKC,UAAUwuF,aAAe,IAAMzuF,KAAKitD,MACvEjtD,KAAK+c,KAAO,EAAI/c,KAAKitD,MACrBjtD,KAAKsuH,gBAGC,gBACNtuH,KAAK0C,OAAOhC,MAAQV,KAAK+oC,MACzB/oC,KAAK0C,OAAO/B,OAASX,KAAK8c,OAsBpB,eACN9c,KAAKitD,MAAQ1hD,OAAO8iH,iBACpBruH,KAAK+oC,MAAQ/oC,KAAKC,UAAUi+B,YAAcl+B,KAAKitD,MAE/CjtD,KAAKwsH,cACLxsH,KAAK4sH,aA2IA,aAAa1qH,GAClB,MAAM,UAACqoH,GAAavqH,KACpBA,KAAKytH,mBAAqBvrH,EAC1BlC,KAAK0tH,sBAAwBxrH,EAAQqoH,GAAa,IAClDvqH,KAAK4tH,uBAAyB1rH,EAAQqoH,GAAa,IAG7C,cACNvqH,KAAKsuH,gBAGA,SACL,MACMruH,EAAYD,KAAKC,UAAYC,SAASC,cAAc,OAC1DF,EAAUG,UAAUC,IAFF,qBAIlB,MAAMqC,EAAS1C,KAAK0C,OAASxC,SAASC,cAAc,UAKpD,OAJAuC,EAAOtC,UAAUC,IAAImJ,4BAErBvJ,EAAU8J,OAAOrH,GAEVzC,GCvSI,OADU,IAjClB,MAIL,cACED,KAAKw7C,MAAQ,GAEb5yC,EAAA,QAAU5H,iBAAiB,eAAgB,KACzChB,KAAKuuH,mBAAgB7pH,EACrB,MAAM82C,EAAQx7C,KAAKw7C,MACnBx7C,KAAKw7C,MAAQ,GAEb,IAAI,IAAIxwC,KAAKwwC,EACXx7C,KAAKwuH,YAAYxjH,KAKhB,YAAY1B,GACjB,IAAIpH,EAAQlC,KAAKw7C,MAAMlyC,GACvB,OAAGpH,IAIClC,KAAKuuH,gBACPvuH,KAAKuuH,cAAgBhjH,OAAOkjH,iBAAiBvuH,SAASuvC,kBAGxDvtC,EAAQlC,KAAKuuH,cAAcG,iBAAiB,KAAOplH,GAAMgC,OAClDtL,KAAKw7C,MAAMlyC,GAAQpH,KCLvB,MAAM,GAKX,YAAmBuD,EAAuBzC,GAAvB,KAAAyC,OACjB,YAAWzF,KAAMgD,GAGZ,OACL,OAAOhD,KAAKyF,KAAKkpH,SAAS3uH,OAMvB,MAAM,GAUX,YAAmBqN,EAAmBrK,GAAnB,KAAAqK,OACjBrN,KAAKS,UAAW,EAEhB,YAAWT,KAAMgD,GAEjBhD,KAAKgoB,MAAQhoB,KAAKgoB,MAAMvf,IAAIzF,GAAWhD,KAAK4uH,WAAW5rH,IAGlD,O,MACL,IAAI1C,EAAcN,KAAKM,YACvB,GAAGA,EACD,OAAOA,EAGT,MAAM,UAACL,EAAS,OAAEyC,EAAM,MAAEhC,EAAK,OAAEC,GAAUX,KAAKqN,KAqBhD,OApBA/M,EAAc25C,GAAA,EAAa15C,qBAAqB,CAC9CN,YACAyC,SACAhC,QACAC,SACA8rB,MAAO,OACPjsB,MAAM,EACNC,SAAuB,QAAb,EAAAT,KAAKS,gBAAQ,SACvBouH,UAAW7uH,KAAK6uH,UAChBC,6BAA4CpqH,IAAnB1E,KAAK6uH,UAC9Bj6E,MAAO50C,KAAK40C,MACZm6E,aAAc/uH,KAAK+uH,cAClB/uH,KAAKsJ,MAAMzI,KAAK4hB,GACVw3B,GAAA,EAAav4C,kBAAkB+gB,IACrC5hB,KAAK4hB,IACNziB,KAAKyiB,OAASA,IAGhBziB,KAAKM,YAAcA,EACnBN,KAAKqN,KAAKyc,aAAanV,IAAI3U,KAAKsJ,KAAMhJ,GAC/BA,EAGF,WAAW0C,GAChB,OAAO,IAAI,GAAoBhD,KAAMgD,GAGhC,QAAQsZ,GACb,OAAGA,aAAiB,GAA4BA,EACtB,iBAAZ,EAA6Btc,KAAKgoB,MAAMvX,KAAKo+E,GAAQA,EAAKvlF,OAASgT,GACrEtc,KAAKgoB,MAAM1L,GAGlB,SAASuyE,GACd,OAAO7uF,KAAKqN,KAAKshH,SAAS3uH,KAAM6uF,IAIrB,MAAM,GASnB,YAAY7rF,GACV,YAAWhD,KAAMgD,GAEbhD,KAAKC,YAAWD,KAAKC,UAAYC,SAASC,cAAc,QAC5DH,KAAKC,UAAUG,UAAUC,IAAI,gBAE7B,MAAM,MAACK,EAAK,OAAEC,GAAUX,KACxBA,KAAKC,UAAU0C,MAAMjC,MAAQA,EAAQ,KACrCV,KAAKC,UAAU0C,MAAMhC,OAASA,EAAS,KAEvC,MAAM+B,EAAS1C,KAAK0C,OAASxC,SAASC,cAAc,UACpDuC,EAAOtC,UAAUC,IAAI,WACrBqC,EAAOhC,MAAQA,EACfgC,EAAO/B,OAASA,EAEhBX,KAAKwF,MAAQ,IAAIkK,IACjB1P,KAAK8pB,aAAe,IAAIpa,IAG1B,kBACE,OAAO7M,QAAQC,IAAI,IAAI9C,KAAK8pB,aAAawU,WAAWz9B,KAAKmlB,GAAA,GAGpD,QAAQ1c,GACb,OAAQA,GAA4B,IAApBtJ,KAAKwF,MAAM1F,KAAgDE,KAAKwF,MAAMwK,IAAI1G,GAAlDtJ,KAAKwF,MAAM84B,SAASz5B,OAAO3C,MAG9D,IAAIc,GACT,MAAMyC,EAAO,IAAI,GAAgBzF,KAAMgD,GAGvC,OAFAhD,KAAKwF,MAAMmP,IAAI3R,EAAQsG,KAAM7D,GAEtBA,EAGF,SAASA,EAAuB6W,GACrC,IAAI7W,EAAKgd,OAAQ,OACjB,MAAMosE,EAAOppF,EAAKupH,QAAQ1yG,GAC1B7W,EAAKgd,OAAOksG,SAAS,CACnBvmH,KAAMymF,EAAKogC,WACXjgF,GAAI6/C,EAAKqgC,WAIN,WAAWzpH,EAAuB6W,EAAkD6yG,GACzF,IAAI1pH,EAAKgd,OAAQ,OACjB,MAAMosE,EAAOppF,EAAKupH,QAAQ1yG,GACpB8yG,EAAUD,EAAQtgC,EAAKqgC,SAAWrgC,EAAKogC,WAC7CxpH,EAAKgd,OAAO4sG,YAAY,CACtBjtH,MAAOgtH,IAIJ,0BAA0BjtH,EAAgBmtH,GAC/C,OAAO,IAAInnH,MAAMhG,GAAQqpB,KAAK,GAAG/iB,IAAI,CAACrB,EAAG/C,KACvC,MAAM4qH,EAAa5qH,EAAMirH,EACzB,MAAO,CAACL,aAAYC,SAAUD,EAAaK,EAAa,MCzKvD,MAAM,WAGF,GAQT,YAAYtsH,GAMVC,MAAM,CACJvC,MAAOsC,EAAQtC,MACfC,OAAQqC,EAAQrC,SAGlB,YAAWX,KAAMgD,GAWZ,KAAKusH,EAAiCC,GAC3C,GAAGxvH,KAAKk5B,OACN,OAAOl5B,KAAKM,YAGdN,KAAKk5B,QAAS,EACdl5B,KAAKuvH,UAAYA,EACjBvvH,KAAKwvH,WAAaA,EAElB,MAAM3gC,EAAO7uF,KAAKgvH,QAAQO,GACpB36E,OAAuBlwC,IAAf8qH,GAA4BxvH,KAAKyvH,UAAYzvH,KAAKyvH,SAASD,GAEnE/pH,EAAOopF,EAAKppF,KAClBA,EAAKopH,UAAYhgC,EAAKqgC,SACtBzpH,EAAKmvC,MAAQA,EAEb,MAAMnX,EAAW,IAAIz9B,KAAKwF,MAAM84B,UAAU71B,IAAIhD,GAAQA,EAAKK,QAC3D,OAAOjD,QAAQC,IAAI26B,GAAU58B,KAAKmlB,GAAA,GAG7B,SAASupG,EAAiCC,GAC3CxvH,KAAKk5B,QAAQl5B,KAAK8F,KAAKypH,EAAWC,QACrB9qH,IAAd6qH,GAAyBvvH,KAAK0vH,aAAaH,QAC5B7qH,IAAf8qH,GAA4BxvH,KAAKyvH,UAAUzvH,KAAK2vH,cAAcH,GAG5D,aAAav7F,GAClB,MAAOs7F,UAAWK,GAAa5vH,KAC/B,GAAG4vH,IAAc37F,EACf,OAGFj0B,KAAKuvH,UAAYt7F,EAEJj0B,KAAKgvH,QAAQ/6F,EAAO27F,GAC5BnuH,OAGA,cAAcwyB,GACnB,MAAOu7F,WAAYI,GAAa5vH,KAChC,GAAG4vH,IAAc37F,EACf,OAGFj0B,KAAKwvH,WAAav7F,EAElB,MAAMxuB,EAAOzF,KAAK6vH,UAClB,GAAGpqH,EAAKgd,OAAQ,CACd,MAAMmyB,EAAQ50C,KAAKyvH,SAASx7F,EAAO27F,GACnCnqH,EAAKgd,OAAOy9C,SAAStrB,IAIlB,UACL50C,KAAKwF,MAAMc,QAAQb,IACjBA,EAAKnF,YAAYO,KAAK,KACpB4E,EAAKgd,OAAO9gB,cCvFL,MAAM,WAAgC,GAGnD,cACEsB,MAAM,CACJvC,MAAO,GACPC,OAAQ,GACRquH,QAAS,CAAC/6F,EAAO27F,KACf,MAAM1B,EAAS4B,GACf,IAAIC,EACJ,OAAO97F,GACL,KAAKi6F,EAAO8B,KACVD,EAAWH,IAAc1B,EAAO/B,MAAQ,gBAAkB,kBAC1D,MACF,KAAK+B,EAAO/B,MACV4D,EAAWH,IAAc1B,EAAO8B,KAAO,gBAAkB,OACzD,MACF,KAAK9B,EAAOhC,QACV6D,EAAW,SAIf,OAAO/vH,KAAK6vH,UAAUb,QAAQe,MAKlC/vH,KAAKC,UAAUG,UAAUC,IAAImJ,wCAoD7BxJ,KAAKK,IAAI,CACPiJ,KAAM,cACN0e,MApD0C,CAAC,CAC3CinG,WAAY,EACZC,SAAU,GACV5lH,KAAM,iBACL,CACD2lH,WAAY,GACZC,SAAU,GACV5lH,KAAM,UACL,CACD2lH,WAAY,GACZC,SAAU,GACV5lH,KAAM,QACL,CACD2lH,WAAY,GACZC,SAAU,IACV5lH,KAAM,iBACL,CACD2lH,WAAY,IACZC,SAAU,IACV5lH,KAAM,mBACL,CACD2lH,WAAY,IACZC,SAAU,IACV5lH,KAAM,sBACL,CACD2lH,WAAY,IACZC,SAAU,IACV5lH,KAAM,sBACL,CACD2lH,WAAY,IACZC,SAAU,IACV5lH,KAAM,qBACL,CACD2lH,WAAY,IACZC,SAAU,IACV5lH,KAAM,6BACL,CACD2lH,WAAY,IACZC,SAAU,IACV5lH,KAAM,wBACL,CACD2lH,WAAY,IACZC,SAAU,IACV5lH,KAAM,sBACL,CACD2lH,WAAY,IACZC,SAAU,IACV5lH,KAAM,qBCvEG,SAAS2mH,GAAkBjtH,GACxC,OAAO,IAAIH,QAAwB,CAACoD,EAAS8kB,KAC3C,MAAM,OAAClQ,EAAM,SAAEsgB,GAAYn4B,EAC3B6X,EAAOwc,SAAY1iB,IACjB1O,EAAQ0O,IAAQA,EAAI7U,UAAO4E,IAG7B,MAAMkZ,EAAU,aAAgB,IACXA,EAAQ,GAChByZ,SAAW,KACtBtM,KAGFnN,EAAQ/X,QAAQgV,GAChB7X,EAAQ4a,QAAUA,EAClB5a,EAAQk0B,WAAaiE,GAAY,CAACA,GAElC,IAAI,GAAU,qBAAsBn4B,GAASyb,SCtBlC,MAAM,WAAsC,GAIzD,YAAoByxG,GAClBjtH,MAAM,CACJvC,MAAO,GACPC,OAAQ,GACRquH,QAAS,CAAC/6F,EAAO27F,KACf,MAAM1B,EAASiC,GAEf,IAAI7zG,EACJ,OAAO2X,GACL,KAAKi6F,EAAO8B,KACV1zG,EAAQ,EACR,MACF,KAAK4xG,EAAO/B,MACV7vG,EAAQszG,IAAc1B,EAAO8B,KAAO,EAAI,EACxC,MACF,KAAK9B,EAAOhC,QACV5vG,EAAQ,EAIZ,OAAOtc,KAAK6vH,UAAUb,QAAQ1yG,IAEhCmzG,SAAUS,EAAU,CAACj8F,EAAO27F,ICqC3B,SAA8B37F,GACnC,MAAMi6F,EAASiC,GACf,IAAIv7E,EAAqBw7E,EACzB,OAAOn8F,GACL,KAAKi6F,EAAO8B,KACVI,EAAW,OACX,MACF,KAAKlC,EAAO/B,MACZ,KAAK+B,EAAOmC,aACZ,KAAKnC,EAAOlC,eACVoE,EAAWn8F,IAAUi6F,EAAO/B,MAAQ,YAAc,MAClD,MACF,KAAK+B,EAAOhC,QACVkE,EAAW,QAIf,MAAME,EAAgB,GAAiB9B,YAAY,MAAQ4B,EAAW,eAGtE,OAFAx7E,EzFmCK,SAAkBysB,GACvB,OAAO5C,GAAW4C,EAAI59D,MAAM,EAAG,IyFpCvB8sH,CAASD,GAEV17E,EDxDM47E,CAAqBv8F,QAC1BvvB,IAxBY,KAAAwrH,UA4BlBlwH,KAAKC,UAAUG,UAAUC,IAAImJ,+CAE7B,MAAMwe,EAAQ,GAAYyoG,mBAAmB,EAAG,IAChDzwH,KAAKK,IAAI,CACPiJ,KAAM,kBACN0e,UAIG,SAASiM,GACd,OAAOhxB,MAAMsyB,SCUV,SAAiCtB,GACtC,MAAMi6F,EAASiC,GACf,OAAOl8F,GACL,KAAKi6F,EAAOlC,eACZ,KAAKkC,EAAOmC,aACV,OAAOnC,EAAO/B,MAChB,QACE,OAAOl4F,GDjBay8F,CAAwBz8F,GAAQA,IErC3C,MAAM,GAGnB,YAAoB08F,GAAA,KAAAA,YAClB3wH,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,2CAGxB,SAAS4zB,EAA2CsJ,GACzD,MAAM2wF,EAASiC,GACTS,EAAQ5wH,KAAK2wH,UAAU/oH,OAAOzE,KAAUo6B,EAAYp6B,IAAOsF,IAAItF,IACnE,MAAM0tH,EAAgB,UAAkB,iBAAT1tH,EAA0B,kBAAoB,sBACvE6H,EAAI9K,SAASC,cAAc,KAEjC,OADA6K,EAAE5K,UAAUC,IAAI,qCAAqB,sCAAuB8C,EAAM0tH,GAC3D7lH,IAGT,IAAI8lH,EAAuBC,EAC3B,GAAG98F,IAAUi6F,EAAOmC,aAClBS,EAAW,eAAK,gCAChBC,EAAkB,gBACb,GAAG98F,IAAUi6F,EAAOhC,QACzB4E,EAAW,eAAK,6BAChBC,EAAkB,mBACb,GAAG98F,IAAUi6F,EAAO8B,KACzBc,EAAW,eAAK,+BAChBC,EAAkB,iBACb,IAAGxzF,EAAYsF,QAAU+tF,EAAMzuH,OAEpC,YADA2B,EAAa9D,KAAKC,UAAW,IAAkB6rB,cAAcyR,EAAYsF,QAGzEiuF,EAAW,eAAK,8BAChBC,EAAkB,eAGpB,MAAM5hE,EAAOjvD,SAASC,cAAc,QACpCgvD,EAAK/uD,UAAUC,IArCD,gCAqCgB0wH,GAC9B5hE,EAAKplD,UAAU6mH,EAAOE,GAEtB,OAAAvkH,EAAA,GAAevM,KAAKC,UAAWkvD,IC7BpB,MAAM,WAAkC,GASrD,YAAoB6hE,GAClB/tH,MAAM,CACJoiD,SAAWrwC,GAAYA,EAAQuoB,YAAYpV,KAC3Ci9B,SAAWpwC,IACTA,EAAQlJ,IAAIK,OAAOxK,SACnB3B,KAAKixH,iBAAiBj8G,IAExBswC,SAAWtwC,IACT,MAAM,YAACuoB,GAAevoB,EAEhBif,EAAQi9F,GAAkC3zF,GAEhDvoB,EAAQm8G,UAAU57F,SAAStB,GAC3Bjf,EAAQywC,OAAOlwB,SAAStB,EAAOsJ,IAEjCqnB,OAAQ,CAAC5vC,EAAS3Q,KAChBigD,GAAuBtvC,EAAQlJ,IAAIK,OAAQnM,KAAK4J,KAAMvF,IAExD6gD,gBAAkBD,IAChB,MAAM,IAACn5C,GAAO,GAAkBC,aAAa,CAC3CF,OAAQo5C,EAAK91C,GACblP,WAAW,EACX+L,YAAY,EACZC,WAAYjM,KAAKiM,WACjBvC,WAAY1J,KAAK0J,WACjBwC,WAAW,EACXmG,cAAerS,KAAKqS,cACpB2X,cAAehqB,KAAKgqB,gBAItBle,EAAIK,OAAO/L,UAAUC,IADH,0BAGlB,MAAMk9B,EAAcyzF,EAAS1zF,aAAattB,IAAIi1C,EAAK91C,IAC7CiiH,EAAaF,GAAkC3zF,GAE/C4zF,EAAY,IAAI,IAA8B,GAC9C1rE,EAAS,IAAI,GAAkC,CAAC,eAAgB,UAatE,OAXA0rE,EAAU57F,SAAS67F,GACnB3rE,EAAOlwB,SAAS67F,EAAY7zF,GAE5B,OAAAhxB,EAAA,GAAeT,EAAIwG,gBAAiBmzC,EAAOxlD,WAC3C6L,EAAIK,OAAOpC,OAAOonH,EAAUlxH,WAE3BglD,EAA2Bn5C,IAAMA,EACjCm5C,EAA2B1nB,YAAcA,EACzC0nB,EAA2BksE,UAAYA,EACvClsE,EAA2BQ,OAASA,EAE9BR,GAETP,kBAAmB,OApDH,KAAAssE,WALV,KAAA/kH,WAAa,GACb,KAAAoG,eAAgB,EAChB,KAAA3I,YAAa,EACb,KAAAi8C,sBAA4E,CAAkB0rE,WAAY,IAyDlHrxH,KAAK4J,KAAO,GAAkBC,eAAe7J,KAAK2lD,uBAG7C,UACL3lD,KAAKinB,SAAS3gB,QAAS0O,IACrBhV,KAAKixH,iBAAiBj8G,KAIhB,iBAAiBA,GACzBA,EAAQm8G,UAAUtN,WChFP,MAAM,GAWnB,YAAoBjpC,EAA0Co2C,EAAoCttB,GAA9E,KAAA9oB,kBAA0C,KAAAo2C,WAAoC,KAAAttB,SAChG1jG,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,0CAE7BL,KAAK8/B,KAAO5/B,SAASC,cAAc,OACnCH,KAAK8/B,KAAK1/B,UAAUC,IAAI,qCAExBL,KAAK+c,KAAO7c,SAASC,cAAc,OACnCH,KAAK+c,KAAK3c,UAAUC,IAAI,0CAExBL,KAAK+oC,MAAQ7oC,SAASC,cAAc,OACpCH,KAAK+oC,MAAM3oC,UAAUC,IAAI,2CAEzBL,KAAK8/B,KAAK/1B,OAAO/J,KAAK+c,KAAM/c,KAAK+oC,OAEjC/oC,KAAKC,UAAU8J,OAAO/J,KAAK8/B,MAGtB,UAAU59B,GACf,IAAIA,EAMF,YALGlC,KAAKyN,SACNzN,KAAKyN,OAAO9L,SACZ3B,KAAKyN,YAAS/I,IAIX,GAAG1E,KAAKyN,OACb,OAIAzN,KAAKyN,OAASvN,SAASC,cAAc,OACrCH,KAAKyN,OAAOrN,UAAUC,IAAI,uCAE1B,MAAMgN,EAAOnN,SAASC,cAAc,KACpCkN,EAAKjN,UAAUC,IAAI,sBAAuB,aAC1CL,KAAKyN,OAAO1D,OAAOsD,GAEnBrN,KAAKC,UAAU8J,OAAO/J,KAAKyN,QAMxB,eAAe8vB,EAAmCp6B,EAAqCwd,GAC5F,IAAImhB,EACDvE,EAAYjmB,OAAO2zB,MACpBnJ,EAAmB,eAAK,wBACxBA,EAAiB1hC,UAAUC,IAAI,gBAE/BL,KAAKsxH,UAAY,IAAI,KAAU,CAC7BrqH,OAAQjH,KAAK46E,gBAAgB/5C,UAAUtD,EAAYuD,QAGrDgB,EAAmB9hC,KAAKsxH,UAAUt8G,SAGpChV,KAAKuxH,8BAAgC,IAAI,IAA8B,GACvEvxH,KAAKwxH,2BAA6B,IAAI,GAAkC,CAACruH,IAEzEnD,KAAK+c,KAAKhT,OAAO+3B,EAAkB9hC,KAAKwxH,2BAA2BvxH,WAEnED,KAAK+oC,MAAMh/B,OAAO/J,KAAKuxH,8BAA8BtxH,WAErD,MAAMuJ,EAAY,+BAClBmX,EAAMvgB,UAAUC,IAAImJ,GAEjBmX,EAAMhL,QACPgL,EAAMlf,OAGR,MAAMiB,EAASxC,SAASC,cAAc,UACtCuC,EAAOtC,UAAUC,IAAImJ,EAAY,SAKjC,GAHA9G,EAAOhC,MADM,GAEbgC,EAAO/B,OAFM,GAIVggB,EAAO,CACR,MAAMs9B,EAAMv7C,EAAOsO,WAAW,MAC9BitC,EAAIr2C,OAAS,YACb,MAAM6pH,EAAc,KAClBxzE,EAAIM,UAAU59B,EAAO,EAAG,EAAGA,EAAMijF,WAAYjjF,EAAMkjF,YAAa,EAAG,EAAGnhG,EAAOhC,MAAOgC,EAAO/B,SAG7F,aAAQ,KACN8wH,IACO/uH,EAAO0oB,cAGhBqmG,IAGFzxH,KAAKC,UAAUwf,QAAQ/c,EAAQie,GAE/B3gB,KAAK0xH,kBAAkBn0F,GAGlB,kBAAkBA,GACvB,MAAMtJ,EAAQi9F,GAAkC3zF,GAEhDv9B,KAAKuxH,8BAA8Bh8F,SAAStB,GAC5Cj0B,KAAKwxH,2BAA2Bj8F,SAAStB,EAAOsJ,GAG3C,UACLv9B,KAAKuxH,8BAA8B1N,WCtHxB,MAAM,WAA0C,GAU7D,YAAY7gH,GASVC,QACA,YAAWjD,KAAMgD,GAEjB,MACM/C,EAAYD,KAAKC,UAAYC,SAASC,cAAc,OAC1DH,KAAKC,UAAUG,UAAUC,IAAImJ,2CAE7BxG,EAAQq4B,SAAStxB,OAAO9J,GAExBD,KAAK2xH,qBAAuB,IAAIjiH,IAChC1P,KAAK20D,WAAa,IAAIjlD,IAEtB,MAAM,eAAC3B,GAAkB/N,KAEzB+N,EAAe1N,IAAIuI,EAAA,QAAnBmF,CAA8B,yBAA0B,EAAE6jH,cAAar0F,kBAClEv9B,KAAKgxH,SAAS7hH,KAAOyiH,GACtB5xH,KAAK0xH,kBAAkBn0F,KAI3BxvB,EAAe1N,IAAIuI,EAAA,QAAnBmF,CAA8B,oBAAqB,EAAEijH,WAAUttB,aAC1D1jG,KAAKgxH,WAAaA,GACnBhxH,KAAK2xH,qBAAqBrrH,QAASmC,IACjCA,EAAInC,QAAS0O,IACXhV,KAAK6xH,kBAAkB78G,EAAS0uF,SAMxC,YAAiB1jG,KAAKC,UAAYgC,IAChC,MAAMhC,EAAY,OAAA2e,GAAA,GAAgB3c,EAAE4S,OAAQ,0CAC5C,IAAI5U,EACF,OAGF,MAAM+U,EAAUhV,KAAK20D,WAAW3kD,IAAI/P,GACjCD,KAAKgxH,SAASc,eAAiB98G,EAAQ0uF,OAK1C1jG,KAAKgxH,SAASe,UAAU/8G,EAAQ0uF,QAJ9B1jG,KAAKgxH,SAASgB,YAKf,CAACjkH,mBAEJ/N,KAAKiyH,YAAYjyH,KAAKgxH,UAEtBhxH,KAAK6gB,MAAM,CACT7L,QAAS/U,EACT8N,eAAgBA,EAChB4Q,uBAAwB,uBAIpB,qBAAqB3J,EAA2C88G,GACtE,OAAO9xH,KAAKkyH,eAAiBJ,GAAgB98G,EAAQ0uF,SAAWouB,EAAeA,GAAgB98G,EAAQ0uF,SAAWouB,EAG5G,kBAAkB98G,EAA2C88G,GACnE,MAAMK,EAAgBnyH,KAAKoyH,qBAAqBp9G,EAAS88G,GACzD98G,EAAQ/U,UAAUG,UAAUkM,OAAO,gBAAiB6lH,GAEpD,MAAME,EAAWr9G,EAAQ0uF,SAAWouB,EACpC98G,EAAQs9G,UAAUD,GAGZ,kBAAkB90F,GACxB,MAAMt2B,EAASjH,KAAK46E,gBAAgB/5C,UAAUtD,EAAYuD,MACpDw1B,EAAyC,CAAC,QAAS,gBACnDi8D,EAAcj8D,EAAMk8D,KAAKrvH,KAAUo6B,EAAYp6B,IACrD,IAAIsvH,EAAsBzyH,KAAK2xH,qBAAqB3hH,IAAI/I,IACpDsrH,GAAgBE,KAIhBA,GACFzyH,KAAK2xH,qBAAqBh9G,IAAI1N,EAAQwrH,EAAsB,IAAI/iH,KAGlE4mD,EAAMhwD,QAAQnD,IACZ,IAAI6R,EAAUy9G,EAAoBziH,IAAI7M,GACtC,MAAMuvH,EAAmBn1F,EAAYp6B,GACrC,KAAKuvH,KAAuB19G,EAA5B,CAQA,GAAG09G,EAAkB,CACnB,MAAMrsH,EAASrG,KAAKgxH,SAAS2B,qCAAqCp1F,EAAap6B,GAC/E,IAAIkD,EACF,OAGF,MAAM,MAACsa,EAAK,OAAE+iF,GAAUr9F,EAExB2O,EAAU,IAAI,GAAiChV,KAAK46E,gBAAiB56E,KAAKgxH,SAAUttB,GAEpF1jG,KAAK20D,WAAWhgD,IAAIK,EAAQ/U,UAAW+U,GAEvChV,KAAK6xH,kBAAkB78G,EAAShV,KAAKgxH,SAASc,cAC9CW,EAAoB99G,IAAIxR,EAAM6R,GAC9BA,EAAQ49G,eAAer1F,EAAap6B,EAAMwd,GAE1C3gB,KAAKC,UAAUwf,QAAQzK,EAAQ/U,gBAE/BwyH,EAAoBpkH,OAAOlL,GAC3B6R,EAAQ/U,UAAU0B,SAEd8wH,EAAoB3yH,OACtBE,KAAK2xH,qBAAqBtjH,OAAOpH,GACjCjH,KAAK20D,WAAWtmD,OAAO2G,EAAQ/U,WAC/B+U,EAAQ6uG,WAIZ7jH,KAAK6yH,uBAnCA79G,GACDA,EAAQ08G,kBAAkBn0F,MAsC1B,kBACN,MAAMp7B,EAASnC,KAAKC,UAAUgK,kBAC9BjK,KAAKC,UAAUmM,QAAQjK,OAAS,GAAKA,EACrCnC,KAAKC,UAAUmM,QAAQshB,OAASvrB,GAAU,EAAI,IAAkB,IAAXA,EAAe,IAAM,IAE1EnC,KAAKuvE,gBAAkBvvE,KAAKuvE,eAAeptE,GAGtC,YAAY6uH,GACjBA,EAAS1zF,aAAah3B,QAASi3B,IAC7Bv9B,KAAK0xH,kBAAkBn0F,KAIpB,UACLv9B,KAAK20D,WAAWruD,QAAS0O,IACvBA,EAAQ6uG,aClJP,MAAM,GAYX,YAAY7gH,GA8GJ,KAAA8vH,mBAAqB,KAC3B,MAAMC,EAAQ,KAAaC,SAAS,IACjCD,GACDA,EAAMp0F,OAGR/1B,EAAA,QAAU6F,cAAc,gBAAiB,CACvCxH,OAAQjH,KAAKizH,gBAIT,KAAAC,uBAA0B/7G,IAChCnX,KAAK6gH,qBAAqBsS,gBAAgBnzH,KAAKgxH,SAAS7hH,GAAInP,KAAKu9B,YAAa,CAC5EpmB,WAnHFnX,KAAK4d,QAAU,CAAC,CACdvQ,KAAM,mBACN6P,KAAM,qBACNnI,OAAQ,IAAM/U,KAAKozH,eAAiBpzH,KAAKu9B,YAAYjmB,OAAO+7G,gBAC5Dl2G,QAAS,IAAMnd,KAAKkzH,wBAAuB,IAC1C,CACD7lH,KAAM,gBACN6P,KAAM,uBACNnI,OAAQ,IAAM/U,KAAKozH,gBAAkBpzH,KAAKu9B,YAAYjmB,OAAO+7G,gBAC7Dl2G,QAAS,IAAMnd,KAAKkzH,wBAAuB,IAC1C,CACD7lH,KAAM,mBACN6P,KAAM,sBACNnI,OAAQ,KAAO/U,KAAKozH,gBAAkBpzH,KAAKu9B,YAAYjmB,OAAOg8G,aAC9Dn2G,QAAS,IAAMnd,KAAKkzH,wBAAuB,IAC1C,CACD7lH,KAAM,gBACN6P,KAAM,wBACNnI,OAAQ,KAAO/U,KAAKozH,eAAiBpzH,KAAKu9B,YAAYjmB,OAAOg8G,aAC7Dn2G,QAAS,IAAMnd,KAAKkzH,wBAAuB,IAC1C,CACD7lH,KAAM,aACN6P,KAAM,wBACNnI,OAAQ,KAAM,EACdoI,QAASnd,KAAK8yH,oBACb,CACDzlH,KAAM,oBACN6P,KAAM,uBACNnI,OAAQ,IAAM/U,KAAKirG,gBAAgBtuE,UAAU38B,KAAKgS,OAAQ,aAC1DmL,QAAS,KACP8yG,GAAkB,CAChBhpH,OAAQjH,KAAKizH,aACbrlH,MAAO,IAAI,KAAU,CAAC3G,OAAQjH,KAAKizH,eAAej+G,QAClD8hB,mBAAoB92B,KAAKirG,gBAAgBzzE,YAAYx3B,KAAKgS,QAAU,uCAAyC,+BAC7GilB,oBAAqB,CAAC,IAAI,KAAU,CAAChwB,OAAQjH,KAAKizH,eAAej+G,SACjE6F,OAAQ,CACNuZ,QAAS,kCACTkO,UAAU,KAEXzhC,KAAK,KACNb,KAAKirG,gBAAgBsoB,aAAavzH,KAAKgS,OAAQhS,KAAKizH,eACnDjtG,GAAA,MAIP,MAAM,eAACjY,GAAkB/K,EACzBhD,KAAKirG,gBAAkBjoG,EAAQioG,gBAC/BjrG,KAAK46E,gBAAkB53E,EAAQ43E,gBAC/B56E,KAAK6gH,qBAAuB79G,EAAQ69G,qBACpC7gH,KAAKgxH,SAAWhuH,EAAQguH,SACxBhxH,KAAKgS,OAAShS,KAAKgxH,SAASh/G,OAE5BhS,KAAKgV,QAAU,GAAWhV,KAAK4d,QAAS7P,GACxC/N,KAAKgV,QAAQ5U,UAAUC,IAAI,8BAA+B,SAE1D,aAA0B2C,EAAQq8F,iBAAmBp9F,IACnD,MAAM+4B,EAAK,OAAApc,GAAA,GAAgB3c,EAAE4S,OAAQ,0BACrC,IAAImmB,EACF,OAGCh7B,KAAKgV,QAAQlE,gBAAkBuqB,GAChCA,EAAStxB,OAAO/J,KAAKgV,SAGvB,MAAM/N,EAASjH,KAAKizH,aAAej4F,EAAG5uB,QAAQnF,OAAOkgB,WACrDnnB,KAAKu9B,YAAcv9B,KAAKgxH,SAASwC,uBAAuBvsH,GACrDjH,KAAKu9B,YAAYjmB,OAAO2zB,OAI3BjrC,KAAKozH,cAAgBpzH,KAAKirG,gBAAgBtuE,UAAU38B,KAAKgS,OAAQ,eAEjEhS,KAAK4d,QAAQtX,QAAQuU,IACnBA,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAASuO,EAAO9F,OAAO9N,MAGzD,OAAAyW,EAAA,GAAYzb,GACZ,aAAcA,EAAiB+Y,QAAW/Y,EAAiB+Y,QAAQ,GAAK/Y,EAAiBjC,KAAKgV,QAAS,SACvG,aAAYhV,KAAKgV,WAChBjH,GAEHA,EAAe1N,IAAIuI,EAAA,QAAnBmF,CAA8B,yBAA0B,EAAE6jH,cAAar0F,kBACrE,GAAGv9B,KAAKgxH,SAAS7hH,KAAOyiH,EAAa,CACnC,MAAM3qH,EAASjH,KAAK46E,gBAAgB/5C,UAAUtD,EAAYuD,MACvD9gC,KAAKizH,eAAiBhsH,GACvB,kBAKN,IAAIo0B,EAAwBn7B,SAASiW,KACrC,aAAsBjW,SAASiW,KAAM,KACnC,MAAMyM,EAAS,eACfyY,EAAWzY,EAAU,KAAaowG,SAAS,IAAmCS,eAAgBvzH,SAASiW,KAEnGyM,GACF,gBAED7U,IAqBQ,MAAM,GAWnB,YAAY/K,GAQV,YAAWhD,KAAMgD,GAEjB,MAEM+H,EAAa,IAAI,SAAWrG,GAClCqG,EAAW9K,UAAUG,UAAUC,IAAImJ,sCAEnC,MAAMvJ,EAAYD,KAAKC,UAAYC,SAASC,cAAc,OAC1DF,EAAUG,UAAUC,IANF,2BAUlB,MAAMqzH,EAAa1zH,KAAK0zH,WAAa,IAAI,GAA0B1zH,KAAKgxH,WAElE,SAACA,EAAQ,eAAEjjH,GAAkB/N,KACnCA,KAAKslH,YAAc,IAAI,GAAgC,OAAD,wBACjDtiH,GAAO,CACVq8F,iBAAkBq0B,EAAW9pH,KAC7BmE,iBACAijH,cAGFhxH,KAAK2zH,2BAA6B,IAAI,GAAkC,OAAD,wBAClE3wH,GAAO,CACVq4B,SAAUtwB,EAAW9K,UACrBiyH,eAAe,KAGjBnnH,EAAWhB,OAAqB2pH,EAAW9pH,MAC3C3J,EAAU8J,OAAOgB,EAAW9K,WAE5B+C,EAAQq4B,SAAStxB,OAAO9J,GAExB8N,EAAe1N,IAAIuI,EAAA,QAAnBmF,CAA8B,yBAA0B,EAAE6jH,cAAar0F,kBAClEv9B,KAAKgxH,SAAS7hH,KAAOyiH,GACtB5xH,KAAK0xH,kBAAkBn0F,KAIF,IAAI,GAAiB,CAC5CxyB,aACAouB,WAAY,IACHn5B,KAAK6gH,qBAAqB+S,yBAAyB5zH,KAAKgxH,SAAS7hH,IAAItO,KAAK,EAAEy8B,eAAcjB,YAC/FiB,EAAah3B,QAAQi3B,IACnBv9B,KAAK0xH,kBAAkBn0F,KAGlBlB,MAKbr8B,KAAKiyH,YAAYjB,GAGX,kBAAkBzzF,GACxB,MAAMt2B,EAASjH,KAAK46E,gBAAgB/5C,UAAUtD,EAAYuD,MACpDn5B,EAAM3H,KAAK0zH,WAAW/rH,IAAIV,GAC7Bs2B,EAAYjmB,OAAOyF,KACjBpV,GACD3H,KAAK0zH,WAAWrlH,OAAOpH,GAMvBU,EAKJ3H,KAAK0zH,WAAW3yF,OAAO95B,GAJrBjH,KAAK0zH,WAAWrzH,IAAI4G,GAOjB,YAAY+pH,GAiBjBA,EAAS1zF,aAAah3B,QAASi3B,IAC7Bv9B,KAAK0xH,kBAAkBn0F,KAIpB,UACLv9B,KAAK0zH,WAAW7P,UAChB7jH,KAAK2zH,2BAA2B9P,WCjRrB,MAAM,GAGnB,YAAoBxoF,GAAA,KAAAA,WAClBr7B,KAAK6zH,gBAAkB,IAAI,UAAKr5D,YAAY,CAC1CjsD,IAAK,gCAGPvO,KAAK6zH,gBAAgB7+G,QAAQ5U,UAAUC,IAAI,0BAE3Cg7B,EAAStxB,OAAO/J,KAAK6zH,gBAAgB7+G,SAGhC,OAAOg8G,GACZ,MAAM,MAAC/8F,GAAS+8F,EAEhB,IAAIziH,EAAkBN,EACnBgmB,IAAU,KAAiBm4F,WAC5B79G,EAAM,+BAENA,EAAM,2BACNN,EAAO,CAAE+iH,EAAS3P,UAAkClvD,qBAGtD,MAAM,gBAAC0hE,GAAmB7zH,KAEvB6zH,EAAgBtlH,MAAQA,GAAQ,YAAUslH,EAAgB5lH,KAAMA,KACjE4lH,EAAgBtlH,IAAMA,EACtBslH,EAAgB5lH,KAAOA,EACvB4lH,EAAgB9yF,WC7BP,MAAM,GAGnB,YAAoB1F,GAAA,KAAAA,WAClBr7B,KAAKsxH,UAAY,IAAI,KAAU,CAACrqH,OAAQ,IAGnC,OAAO+pH,GACZ,MAAM,UAACM,EAAS,SAAEj2F,GAAYr7B,KACxBqhH,EAAY2P,EAAS3P,UACrBp6G,EAAS+pH,EAASh/G,OAAOmV,UAAS,GACrCk6F,EAAUzzG,MACX9J,EAAau3B,EAAU,IAAkBvP,cAAcu1F,EAAUzzG,QACzD0jH,EAAUrqH,SAAWA,IAC7BqqH,EAAUrqH,OAASA,EACnBqqH,EAAUvwF,SACV1F,EAAStxB,OAAOunH,EAAUt8G,WCFjB,MAAM,WAAuB,IAe1C,YAAYhS,GAKVC,OAAM,GAYA,KAAAy+G,SAAW,KACjB1hH,KAAK8zH,gBACL9zH,KAAK+zH,cACL/zH,KAAKg0H,eAdL,YAAWh0H,KAAMgD,GAEjBhD,KAAKwzB,IAAMxzB,KAAK+c,KAAO/c,KAAKU,MAAQV,KAAKW,OAAS,EAClDX,KAAKgV,QAAQ5U,UAAUC,IA3BT,mBA6BdL,KAAKi0H,oBACLj0H,KAAKk0H,kBAEL3wG,EAAA,EAAWviB,iBAAiB,SAAUhB,KAAK0hH,UAStC,kBACL1hH,KAAKgV,QAAQ5U,UAAUuB,OA1CT,mBA4CX3B,KAAKm0H,UACNn0H,KAAKm0H,SAAS7tH,QAAQywE,IACpBA,EAAQp1E,WAKP,UACL4hB,EAAA,EAAWla,oBAAoB,SAAUrJ,KAAK0hH,UAC9C1hH,KAAKo0H,aAAa70G,kBAGZ,oBAENvf,KAAKm0H,SADuB,CAAC,IAAK,IAAK,IAAK,IAAK,KAAM,KAAM,KAAM,MAC7C1rH,IAAIgyF,IACxB,MAAMjuE,EAAMtsB,SAASC,cAAc,OAInC,OAHAqsB,EAAIpgB,QAAQquF,KAAOA,EACnBjuE,EAAIpsB,UAAUC,IA5DW,iCA4DiBg0H,uCAAoC55B,GAC9Ez6F,KAAKgV,QAAQjL,OAAOyiB,GACbA,IAIH,kBACN,IAAI8nG,EAAkBC,EAAmBC,EAAoBC,EAAqBC,EAClF,MAAMN,EAAep0H,KAAKo0H,aAAe,IAAI,GAAa,CACxDp/G,QAAShV,KAAKgV,QACduyB,QAAS,CAACL,EAAOC,EAAOllC,KAKtB,GAJAilC,IAAU,EACVC,IAAU,EAGPutF,EAAc,CACf,GAAGA,EAAa36F,SAAS,MAAQ26F,EAAa36F,SAAS,KAAM,CAC3D,MAAM46F,EAAcD,EAAa36F,SAAS,MAAQmN,EAAQ,GAAKwtF,EAAa36F,SAAS,MAAQmN,EAAQ,EAC/F0tF,EAAavyH,KAAKyuB,IAAIoW,IAAUytF,EAAc,GAAK,GAEnDE,EAAcH,EAAa36F,SAAS,KAAO6B,GAAA,EAAWl7B,MAAQ6zH,EAAYC,EAAaD,EAC7Fv0H,KAAKU,MAAQ2B,KAAKC,IAAIuyH,EAAaL,EAAaI,GAGlD,GAAGF,EAAa36F,SAAS,MAAQ26F,EAAa36F,SAAS,KAAM,CAC3D,MAAM46F,EAAcD,EAAa36F,SAAS,MAAQoN,EAAQ,GAAKutF,EAAa36F,SAAS,MAAQoN,EAAQ,EAC/FytF,EAAavyH,KAAKyuB,IAAIqW,IAAUwtF,EAAc,GAAK,GAEnDE,EAAcH,EAAa36F,SAAS,KAAO6B,GAAA,EAAWj7B,OAAS2zH,EAAWG,EAAcH,EAC9Ft0H,KAAKW,OAAS0B,KAAKC,IAAIuyH,EAAaJ,EAAcG,GAGpD50H,KAAK8zH,gBAEFY,EAAa36F,SAAS,OACvB/5B,KAAK+c,KAAO1a,KAAKC,IAAIiyH,EAAYC,EAAax0H,KAAKitB,SAAUsnG,EAAYrtF,IAGxEwtF,EAAa36F,SAAS,OACvB/5B,KAAKwzB,IAAMnxB,KAAKC,IAAIgyH,EAAWG,EAAcz0H,KAAK6wC,UAAWyjF,EAAWntF,SAG1EnnC,KAAKwzB,IAAM8gG,EAAWntF,EACtBnnC,KAAK+c,KAAOw3G,EAAYrtF,EAG1BlnC,KAAK+zH,cACL/zH,KAAKg0H,eAEPjtF,kBAAoB9kC,IAClB,MAAM4S,EAAS5S,EAAE4S,OACjB,GAAG,OAAA+J,GAAA,GAAgB/J,EAAQ,aACzB,OAAA+J,GAAA,GAAgB/J,EAAQ,sBACxB,OAAA+J,GAAA,GAAgB/J,EAAQ,aACxB,OAAA+J,GAAA,GAAgB/J,EAAQ,4CACxB,eACA,OAAO,EAGT,MAAM63G,EAAgB,OAAA9tG,GAAA,GAAgB/J,EAvHf,kCAgIvB,OARG63G,GACDgI,EAAehI,EAActgH,QAAQquF,KACrC25B,EAAaU,UAAU,MAEvBJ,OAAehwH,EACf0vH,EAAaU,UAAU,cAGlB,GAETztF,aAAc,KACZitF,EAAWt0H,KAAKwzB,IAChB+gG,EAAYv0H,KAAK+c,KACjBy3G,EAAax0H,KAAKU,MAClB+zH,EAAcz0H,KAAKW,UAKlB,sBACLX,KAAKwzB,IAAOoI,GAAA,EAAWj7B,OAAS,EAAMX,KAAKW,OAAS,EACpDX,KAAK+c,KAAQ6e,GAAA,EAAWl7B,MAAQ,EAAMV,KAAKU,MAAQ,EACnDV,KAAKg0H,cAGC,gBACNh0H,KAAKU,MAAQ,YAAMV,KAAKU,MAAOV,KAAKitB,SAAU2O,GAAA,EAAWl7B,OACzDV,KAAKW,OAAS,YAAMX,KAAKW,OAAQX,KAAK6wC,UAAWjV,GAAA,EAAWj7B,QAGtD,cACNX,KAAKwzB,IAAM,YAAMxzB,KAAKwzB,IAAK,EAAGoI,GAAA,EAAWj7B,OAASX,KAAKW,QACvDX,KAAK+c,KAAO,YAAM/c,KAAK+c,KAAM,EAAG6e,GAAA,EAAWl7B,MAAQV,KAAKU,OAGlD,cACNV,KAAKgV,QAAQrS,MAAM6wB,IAAMxzB,KAAKwzB,IAAM,KACpCxzB,KAAKgV,QAAQrS,MAAMoa,KAAO/c,KAAK+c,KAAO,KACtC/c,KAAKgV,QAAQrS,MAAMomC,MAAQ,OAC3B/oC,KAAKgV,QAAQrS,MAAMma,OAAS,OAC5B9c,KAAKgV,QAAQrS,MAAMjC,MAAQV,KAAKU,MAAQ,KACxCV,KAAKgV,QAAQrS,MAAMhC,OAASX,KAAKW,OAAS,KAE1CX,KAAKyO,cAAc,UAGrB,YACE,OAAOzO,KAAK+0H,OAGd,aACE,OAAO/0H,KAAKg1H,QAGd,UAAkB9yH,GAChBlC,KAAK+0H,OAAS7yH,EAGhB,WAAmBA,GACjBlC,KAAKg1H,QAAU9yH,EAGjB,YACE,MAAM,IAACsxB,EAAG,KAAEzW,EAAI,MAAErc,EAAK,OAAEC,GAAUX,KACnC,MAAO,CACLwzB,MACAzW,OACArc,QACAC,UAIJ,UAAiBszB,GACf,MAAM,IAACT,EAAG,KAAEzW,EAAI,MAAErc,EAAK,OAAEC,GAAUszB,EACnCj0B,KAAKwzB,IAAMA,EACXxzB,KAAK+c,KAAOA,EACZ/c,KAAKU,MAAQA,EACbV,KAAKW,OAASA,EACdX,KAAK0hH,YC5NM,ITqCHyO,GAyDAL,GS9FG,MAFwB,qBAA+B,OAATp9G,gBAAS,IAATA,eAAS,EAATA,UAAWuiH,eAAgB,KTiDjF,SAAS/D,GAAkC3zF,GAChD,MAAM2wF,EAASiC,GACf,OAAG5yF,EAAYjmB,OAAOg8G,aACbpF,EAAOmC,kBAC4B3rH,IAAlC64B,EAAY23F,kBACbhH,EAAO8B,KACNzyF,EAAYjmB,OAAOH,MACpBomB,EAAYjmB,OAAO+7G,gBAAkBnF,EAAO/B,MAAQ+B,EAAOlC,eAE3DkC,EAAOhC,SAnBlB,SAAYiE,GACV,yBACA,qBACA,mCACA,uCACA,mBALF,CAAYA,QAAkC,KAyD9C,SAAYL,GACV,mBACA,qBACA,yBAHF,CAAYA,QAAkC,KAiB9C,IAAIxC,GAA8B,CAChC5sH,MAAO,IACPC,OAAQ,KAGK,MAAM,WAAuB,KAoB1C,YAAYqC,GAKVC,MAAM,wBAAoByB,EAAW,CACnCyR,MAAM,EACNg/G,gBAAgB,EAChB32F,UAAU,IA4RN,KAAA42F,mBAAqB,KAC3Bp1H,KAAKq1H,kBACL,MAAMzyG,EAAS,gBAET,cAAC0yG,EAAa,kBAAEC,GAAqBv1H,KAErCw1H,EAAgBx1H,KAAKC,UAAUG,UAAUuR,SAAS,kBACxD3R,KAAKC,UAAUG,UAAUkM,OAAO,iBAAkBsW,GAClD0yG,GAAiBA,EAAcl1H,UAAUkM,OAAO,OAAQsW,GACxD2yG,GAAqBA,EAAkBn1H,UAAUkM,OAAO,QAASsW,GACjE5iB,KAAKo6G,SAASh6G,UAAUkM,OAAO,OAAQsW,GAEpCA,IAAW4yG,IACZn2E,EAAA,EAAqB+kC,gBAAgBxhE,GAErCha,EAAA,QAAU6sH,cAAc7yG,EAAS,eAAYle,KAIzC,KAAA2wH,gBAAkB,KACxB,MACMK,GADS,mBACa11H,KAAK21H,SAAW31H,KAAK21H,QAAQj1H,OAAS,SAAWV,KAAK41H,YAO5EC,EAAS71H,KAAKC,UAAUG,UAAUuR,SAAS,iBACjD,IAAIiM,EACD83G,IAAUG,IACXj4G,EAAUzV,MAAMC,KAAKpI,KAAK81H,iBAAiB1wG,UAC3CxH,EAAQtX,QAAQ0O,IACdA,EAAQrS,MAAMkpD,QAAU,MAGrB7rD,KAAK81H,iBAAiB7sF,YAG7BjpC,KAAKC,UAAUG,UAAUkM,OAAO,gBAAiBopH,GACjD11H,KAAK+1H,UAAU31H,UAAUkM,OAAO,OAAQopH,GACxC11H,KAAKg2H,cAAc51H,UAAUkM,OAAO,QAASopH,GAE1C93G,GAECA,EAAQtX,QAAQ0O,IACdA,EAAQrS,MAAMkpD,QAAU,MAMxB,KAAAoqE,kBAAoB,KAC1Bj2H,KAAKC,UAAUG,UAAUkM,OAAO,0BA9UhC,YAAWtM,KAAMgD,GAEjBhD,KAAK41H,YAAc,EACnB51H,KAAKC,UAAUG,UAAUC,IAAI,aAAc,SAE3C,MAAM2wH,EAAWhxH,KAAKgxH,SAAWhxH,KAAK6gH,qBAAqBQ,WACrD,eAACtzG,GAAkB/N,KAEzB,IAAI,mBAAiB,CACnB,MAAMs1H,EAAgBt1H,KAAKs1H,cAAgB,EAAW,cAEhDC,GADiBv1H,KAAKk2H,eAAiB,EAAW,6BAC9Bl2H,KAAKu1H,kBAAoB,EAAW,gBAE9D,YAAiBD,EAAe,KAC9B,aAAkBt1H,KAAKC,YACtB,CAAC8N,mBAEJ,YAAiBwnH,EAAmB,KAClC,gBACC,CAACxnH,mBAEJ,aAAsB/N,KAAKC,UAAWD,KAAKo1H,mBAAoBrnH,GAG/C/N,KAAK+1H,UAAY,EAAW,WAA9C,MACMC,EAAgBh2H,KAAKg2H,cAAgB,EAAW,kCACtDh2H,KAAKm2H,eAAe,uBAEpB,YAAiBH,EAAeh2H,KAAKi2H,kBAAmB,CAACloH,mBAEzD,MAAMqoH,EAAal2H,SAASC,cAAc,OAC1Ci2H,EAAWh2H,UAAUC,IAAI,0BAEzBL,KAAK4N,MAAMxN,UAAUC,IAAI,2BAEzB,MAAMqrB,EAAWxrB,SAASC,cAAc,OACxCurB,EAAStrB,UAAUC,IAAI,8BAEvB+1H,EAAWrsH,OAAO/J,KAAK4N,MAAO8d,GAE9B1rB,KAAKyN,OAAOrN,UAAUC,IAAI,qBAC1BL,KAAKyN,OAAO1D,UAAU,CAAC/J,KAAKu1H,kBAAmBa,EAA6Bp2H,KAAKs1H,cAAeU,GAAepuH,OAAOc,UAEtH,MAAM2tH,EAAYr2H,KAAKyN,OAAOi/B,WAAU,GAClC4pF,EAAgBF,EAAW1pF,WAAU,GACrC6pF,EAAiBv2H,KAAK4N,MAAM8+B,WAAU,GAE5C4pF,EAAcvsH,OAAOwsH,GAErB,MAAMC,EAAgB,EAAW,cACjCH,EAAUtsH,UAAU,CAACysH,EAAeF,EAAet2H,KAAKk2H,gBAAgBtuH,OAAOc,UAE/E,YAAiB8tH,EAAex2H,KAAKi2H,kBAAmB,CAACloH,mBAEzD/N,KAAKmW,KAAKsJ,QAAQ42G,GAElB,MAAMI,EAAmB,IAAI,SAAW/xH,GACxC+xH,EAAiBx2H,UAAUG,UAAUC,IAAI,kCACzCL,KAAKC,UAAU8J,OAAO0sH,EAAiBx2H,WAEvCD,KAAK02H,eAAiB,IAAI,GAAsB12H,KAAK4N,OACrD5N,KAAK22H,qBAAuB,IAAI,GAA4BjrG,GAC5D1rB,KAAK42H,+BAAiC,IAAI,GAA4BL,GACtEv2H,KAAK2zH,2BAA6B,IAAI,GAAkC,OAAD,QACrEt4F,SAAUo7F,EAAiBx2H,UAC3B+wH,WACAjjH,iBACAmkH,eAAe,EACf3iD,eAAiBptE,IACfnC,KAAK41H,YAAczzH,EACnBnC,KAAKq1H,oBAEJryH,IAELhD,KAAK62H,sBAAwB,IAAI,GAA6B,OAAD,QAC3Dx7F,SAAUr7B,KAAKmW,KACf66G,WACAjjH,kBACG/K,IAKL,CACE,MAAM4a,EAAU5d,KAAK81H,iBAAmB51H,SAASC,cAAc,OAC/Dyd,EAAQxd,UAAUC,IAAImJ,sBAEtBxJ,KAAK+N,eAAe1N,IAAIL,KAAK2zH,2BAA7B3zH,CAAyD,iBAAmBye,IAC1Eze,KAAKC,UAAUG,UAAUkM,OAAO,gBAAiBmS,GACjDb,EAAQxd,UAAUkM,OAAO,gBAAiBmS,KAG5C,MAAMlW,EAAKvF,IAKT,MACMwpB,EAAMtsB,SAASC,cAAc,OAWnC,OAVAqsB,EAAIpsB,UAAUC,IAFKmJ,oBAEW,eAE1BxG,EAAQ2K,UACV,OAAA2P,GAAA,QAAOkP,GAGNxpB,EAAQs/B,UACT9V,EAAIpsB,UAAUC,IAAIy2H,yBAGbtqG,GAGHuqG,EAAWxuH,EAAE,CACjB2U,KAAM,iCAGR65G,EAAS32H,UAAUC,IAAI,4BAEvB,YAAiB02H,EAAU,KACzB,MAAMzqH,EAAS,OAAA+rB,GAAA,GAAiB,CAAC0+F,IAAW,GAC5C/2H,KAAKgxH,SAASgG,qBAAqB31G,QAAQ,KACzC/U,OAED,CAACyB,mBAEJ,MAAMkpH,EAAY1uH,EAAE,CAClB2U,KAAM,sCAGR+5G,EAAU72H,UAAUC,IAAI,4BACxB42H,EAAU72H,UAAUkM,OAAO,QAAS,IAEpC,YAAiB2qH,EAAW,KAC1B,MAAM3qH,EAAS,OAAA+rB,GAAA,GAAiB,CAAC4+F,IAAY,GAC7Cj3H,KAAKgxH,SAASkG,sBAAsB71G,QAAQ,KAC1C/U,OAED,CAACyB,mBAEJ,MAAMw0G,EAAUh6G,EAAE,CAACoF,UAAU,IAC7B40G,EAAQniH,UAAUC,IAAI,gCAEtB,MAAM82H,EAAiBn3H,KAAKo3H,wBAA0B,IAAI,GAC1D7U,EAAQx4G,OAAOotH,EAAel3H,WAE9B,MAAMo3H,EAAqB,OAAA30D,GAAA,GAAS,KAClC,MAAMnlC,EAAcv9B,KAAKgxH,SAASzzF,YAC9BA,EAAYjmB,OAAO+7G,gBAKrBrzH,KAAKgxH,SAASsG,mBAJuB5yH,IAAlC64B,EAAY23F,mBACbl1H,KAAKgxH,SAASuG,iBAAgB,IAKjC,KAAK,GAER,YAAiBhV,EAAS8U,EAAoB,CAACtpH,mBAE/C,MAAMizG,EAAUz4G,EAAE,CAChB2U,KAAM,gCAGR8jG,EAAQ5gH,UAAUC,IAAI,wBAAyB,gBAC/C2gH,EAAQ5gH,UAAUkM,OAAO,QAAS,IAElC,MAAMkrH,EAAWjvH,EAAE,CACjB2U,KAAM,kBACNolB,UAAU,IAGZk1F,EAASp3H,UAAUC,IAAI,eAEvB,YAAiBm3H,EAAU,KACzB,MAAMC,EAAUC,IACd13H,KAAKgxH,SAASyG,OAAOC,IAGpB13H,KAAKirG,gBAAgBtuE,UAAU38B,KAAKgxH,SAASh/G,OAAQ,eACtD,IAAI,GAAU,uBAAwB,CACpC+gB,aAAc,sBACd+D,mBAAoB,qBACpBI,WAAY,CAAC,CACXha,KAAM,wBAERU,QAAS,CAAC,CACRwW,QAAS,mBACTiD,SAAWH,IACTugG,IAASvgG,EAAWp3B,OAEtBwiC,UAAU,MAEX7jB,OAEHg5G,GAAO,IAER,CAAC1pH,mBAEJ6P,EAAQ7T,OAAOgtH,EAAUE,EAAW1U,EAASvB,EAASwW,GAEtDx3H,KAAKC,UAAU8J,OAAO6T,GAGxB7P,EAAe1N,IAAIuI,EAAA,QAAnBmF,CAA8B,mBAAqBijH,IAC9ChxH,KAAKgxH,WAAaA,GACnBhxH,KAAK23H,mBAIT5pH,EAAe1N,IAAIuI,EAAA,QAAnBmF,CAA8B,oBAAsBszG,IAC/CrhH,KAAKgxH,SAAS7hH,KAAOkyG,EAAUlyG,IAChCnP,KAAK23H,mBAIT5pH,EAAe1N,IAAIuI,EAAA,QAAnBmF,CAA8B,oBAAqB,EAAEijH,eAChDhxH,KAAKgxH,WAAaA,GACnBhxH,KAAK43H,iBAIT7pH,EAAe1N,IAAIkjB,EAAA,EAAnBxV,CAA+B,eAAgB,CAAC3F,EAAM4mC,KACjDA,IAAO,IAAWE,QAAU9mC,IAAS,IAAW8mC,QACjDlvC,KAAKm2H,eAAe,yBAIxBn2H,KAAKgB,iBAAiB,QAAS,KAC7B,MAAM,QAAC20H,GAAW31H,KACf21H,IACDrI,GAAgBqI,EAAQ1hG,OAG1Bj0B,KAAK2zH,2BAA2B9P,UAChC7jH,KAAK62H,sBAAsBhT,UAC3B7jH,KAAKo3H,wBAAwBvT,UAE1B8R,GACDA,EAAQ9R,YAIZ7jH,KAAKi2H,oBACLj2H,KAAKo1H,qBAELp1H,KAAK23H,iBAGA,eACL,OAAO33H,KAAKC,UAGN,cAAc+Z,GACpB,GAAGA,EAAS,CACV,GAAGha,KAAK21H,QACN,OAGF,MAAMA,EAAU31H,KAAK21H,QAAU,IAAI,GAAe,CAEhD1oG,SAAU,IACV4jB,UAAW,IACX77B,QAAShV,KAAKgV,UAGhB2gH,EAAQ1hG,MAAQq5F,QACS5oH,IAAtB4oH,GAAc95F,KACfmiG,EAAQkC,sBAGV73H,KAAK+N,eAAe1N,IAAIs1H,EAAxB31H,CAAiC,SAAUA,KAAKq1H,qBAC3C,CACL,IAAIr1H,KAAK21H,QACP,OAGF31H,KAAK21H,QAAQmC,kBACb93H,KAAK21H,QAAQ9R,UACb7jH,KAAK21H,aAAUjxH,GA4DX,eACN1E,KAAKC,UAAUG,UAAUkM,OAAO,eAAgBtM,KAAKgxH,SAASc,cAGxD,iBACN,GAAG9xH,KAAKgxH,SAAS/8F,QAAU,KAAiB8jG,OAM1C,OALG/3H,KAAKC,UAAUG,UAAUuR,SAAS,mBACnC,oBAGF3R,KAAK2+B,OAIP3+B,KAAKmR,WACLnR,KAAKg4H,iBACLh4H,KAAK43H,eAEL,MAAMK,EAlZH,SAA2C5W,EAAgC9jF,GAChF,MAAM2wF,EAAS4B,GACf,OAAIvyF,EAAYjmB,OAAO+7G,gBAEb91F,EAAYjmB,OAAOH,MACpB+2G,EAAO/B,MAEP+B,EAAOhC,QAJPgC,EAAO8B,KA+YgBkI,CAAkCl4H,KAAKgxH,SAAS3P,UAAkBrhH,KAAKgxH,SAASzzF,aAC9Gv9B,KAAKC,UAAUmM,QAAQ+rH,SAAWF,IAA0BnI,GAAmCE,KAAO,OAAUiI,IAA0BnI,GAAmC3D,MAAQ,QAAU,UAC/LnsH,KAAKo3H,wBAAwB7hG,SAAS0iG,GAGhC,WACNj4H,KAAK02H,eAAe31F,OAAO/gC,KAAKgxH,UAG1B,iBACNhxH,KAAK22H,qBAAqB51F,OAAO/gC,KAAKgxH,UACtChxH,KAAK42H,+BAA+B71F,OAAO/gC,KAAKgxH,WU3e7C,MAAM,WAAoC,GAG/C,cACE/tH,MAAM,CACJvC,MAAO,GACPC,OAAQ,GACRquH,QAAU/6F,GACDj0B,KAAK6vH,UAAUb,QAAQ/6F,EAAQ,SAAW,UAIrDj0B,KAAKK,IAAI,CACPiJ,KAAM,aACN0e,MAAO,CAAC,CACNinG,WAAY,EACZC,SAAU,GACV5lH,KAAM,iBACL,CACD2lH,WAAY,GACZC,SAAU,GACV5lH,KAAM,UACL,CACD2lH,WAAY,GACZC,SAAU,GACV5lH,KAAM,QACL,CACD2lH,WAAY,GACZC,SAAU,IACV5lH,KAAM,iBACL,CACD2lH,WAAY,IACZC,SAAU,IACV5lH,KAAM,uBAMC,MAAM,GASnB,YACUu3G,EACAjmC,EACAqwB,GAFA,KAAA4V,uBACA,KAAAjmC,kBACA,KAAAqwB,kBAER,MAAMl9F,EAAiB/N,KAAK+N,eAAiB,IAAI,IAEjDA,EAAe1N,IAAIuI,EAAA,QAAnBmF,CAA8B,mBAAqBijH,IACjDhxH,KAAK23H,eAAe3G,KAGtBjjH,EAAe1N,IAAIuI,EAAA,QAAnBmF,CAA8B,oBAAsBszG,IAClD,MAAM2P,EAAWhxH,KAAK6gH,qBAAqBQ,WACxC2P,aAAQ,EAARA,EAAU7hH,MAAOkyG,EAAUlyG,IAC5BnP,KAAK23H,eAAe3G,KAIxBjjH,EAAe1N,IAAIuI,EAAA,QAAnBmF,CAA8B,uBAAwB,EAAEqqH,aAAYj1H,WAClE,MAAM,MAACk1H,GAASr4H,KAChB,IAAIo4H,EAAWj2H,SAAWk2H,EAAiC,OAE3D,IAAIv2H,EAAM,EACV,IAAI,IAAIkJ,EAAI,EAAGA,EAAIotH,EAAWj2H,SAAU6I,EAAG,CACzC,MAAM,KAAC7H,EAAI,MAAEjB,GAASk2H,EAAWptH,GACjClJ,EAAMI,EAAQJ,EAAMI,EAAQJ,EAG9Bu2H,EAAMjK,aAAatsH,KAIf,eAAekvH,GAClBhxH,KAAKqmB,YACNrmB,KAAKqmB,YACLrmB,KAAKqmB,eAAY3hB,GAGnB,MAAM,MAACuvB,EAAK,GAAE9kB,GAAM6hH,GAEd,MAACqH,EAAK,UAAEp4H,GAAaD,KAE3Bq4H,EAAMC,oBAEN,MAAMxmF,EAAW7d,IAAU,KAAiB8jG,OAW5C,GAVI73H,SAASiW,KAAK/V,UAAUuR,SAAS,gBAAiBmgC,IACjDA,GACDumF,EAAMjK,aAAa,GAGrB,aAAcluH,SAASiW,KAAM,cAAe27B,EAAU,IAAKA,EAAW,KACpEumF,EAAME,6BACL7zH,IAGFotC,EACD,OAGC7d,IAAU,KAAiBm4F,WAC5BiM,EAAMpK,gBAAgB,KAAiB7B,YAAY,GAUnDiM,EAAMpK,gBAAgBh6F,GAAO,GAG/Bh0B,EAAUmM,QAAQosH,OAAS,GAAKrpH,EAEhCnP,KAAKmR,SAAS6/G,GACdhxH,KAAKg4H,eAAehH,GACpBhxH,KAAKy4H,4BAA4BljG,SAAStB,IAAU,KAAiBi4F,SAErE,MAAM1iH,EAAY,SAAWyqB,EAC1Bh0B,EAAUG,UAAUuR,SAASnI,GAK1B,eAAewnH,GACrB,OAAOhxH,KAAK22H,qBAAqB51F,OAAOiwF,GAGlC,SAASA,GACf,OAAOhxH,KAAK02H,eAAe31F,OAAOiwF,GAG5B,YACN,MAAM,eAACjjH,GAAkB/N,KACnBC,EAAYD,KAAKC,UAAYC,SAASC,cAAc,OAC1DF,EAAUG,UAAUC,IAAI,iBAAkB,yBAE1C,MAAM0c,EAAO7c,SAASC,cAAc,OACpC4c,EAAK3c,UAAUC,IAAI,oBAEnB,MAAMo4H,EAA8Bz4H,KAAKy4H,4BAA8B,IAAI,GAErE9qD,EAAO,IACbA,EAAK5jE,OAAO0uH,EAA4Bx4H,WACxC8c,EAAKhT,OAAO4jE,GAEZ,MAAM0pD,EAAqB,OAAA30D,GAAA,GAAS,KAClC1iE,KAAK6gH,qBAAqByW,eACzB,KAAK,GAER,YAAiB3pD,EAAO1rE,IACtB,OAAAyb,EAAA,GAAYzb,GACZo1H,KACC,CAACtpH,mBAEJ,MAAM2qH,EAAS14H,KAAK04H,OAASx4H,SAASC,cAAc,OACpDu4H,EAAOt4H,UAAUC,IAAI,sBAErBL,KAAK02H,eAAiB,IAAI,GAAsBgC,GAChD14H,KAAK22H,qBAAuB,IAAI,GAA4B55G,GAE5D,MAAMgsB,EAAQ7oC,SAASC,cAAc,OACrC4oC,EAAM3oC,UAAUC,IAAI,qBAEpB,MAAM8f,EAAM,EAAW,kBACvB4oB,EAAMh/B,OAAOoW,GAEb,YAAiBA,EAAMle,IACrB,OAAAyb,EAAA,GAAYzb,GACZjC,KAAK6gH,qBAAqB4W,OAAOx3H,EAAUmM,QAAQosH,QAAQ,GAAO,IACjE,CAACzqH,mBAEJ,YAAiB9N,EAAW,KACvB,KAAa+yH,SAAS,KAIzB,IAAI,GAAe,CACjBnS,qBAAsB7gH,KAAK6gH,qBAC3BjmC,gBAAiB56E,KAAK46E,gBACtBqwB,gBAAiBjrG,KAAKirG,kBACrBxsF,QACF,CAAC1Q,mBAEJ9N,EAAU8J,OAAOgT,EAAM27G,EAAQ3vF,GAE/B,MAAMsvF,EAAQr4H,KAAKq4H,MAAQ,IAAI,GACzBM,EAAiBN,EAAMz4E,SAC7B3/C,EAAUwf,QAAQk5G,GAElBz4H,SAAS4uC,eAAe,iBAAiBrvB,QAAQxf,GACjDo4H,EAAMC,qB,2SC7IH,MAAM5rG,GAAuB,OAC9BksG,GAAmB,sBAAqB,aAAe,YAgiD7D,MAAM,GAAe,IAzhDd,MA8BL,cA7BO,KAAAC,SAAW34H,SAAS4uC,eAAe,iBAGnC,KAAAgqF,SAAU,EACV,KAAAC,qBAAuB,EAIvB,KAAA56E,eAAgC,KAEhC,KAAAwnC,OAAS,EAET,KAAA3vB,MAAgB,GAKf,KAAAgjE,mBAAwD,GAijBxD,KAAAC,aAAe,KACrB,MAAMx9D,EAAO3gB,SAAS2gB,KAChBzD,EAAWyD,EAAKzb,MAAM,KAEtBtH,EAAS14C,KAAKk5H,eAAez9D,EAAMzD,GAIzC,GAFAh4D,KAAKsuD,IAAI,aAAcmN,EAAMzD,EAAS,GAAItf,GAEvCA,EAAOygF,OAAV,CACEpqH,EAAA,EAAwBqqH,eACxB,MAAM,QAACC,GAAW,IAAkBC,QAAQ5gF,EAAOygF,QACnD,GAAGE,EAAS,CACV,MAAM/wH,EAAIpI,SAASC,cAAc,KACjCmI,EAAEqpD,KAAOjZ,EAAOygF,OACf5tH,OAAe8tH,GAAS/wH,SAK7B,OAAO0vD,EAAS,IACd,IAAK,OAAQ,CACX,MAAMhhC,EAAY0hB,EAAO1hB,EACzB,IAAIuiG,OAAyB70H,IAAhBg0C,EAAO8gF,KAAqB,IAAsBn/B,mBAAmB3hD,EAAO8gF,WAAQ90H,EAEjG,OAAOsyB,EAAE,IACP,IAAK,IACHh3B,KAAKqxE,aAAar6C,EAAGuiG,GACrB,MAGF,QACEv5H,KAAKqmD,aAAakzE,EAASviG,EAAE7P,UAAS,GAAQ6P,EAAE7P,WAAYoyG,OAyN9D,KAAAE,YAAc,KACpBv5H,SAASuvC,gBAAgB9sC,MAAMykC,YAAY,uBAAwBx+B,EAAA,QAAUw1B,SAASkoC,iBAAmB,MAEzGpmE,SAASiW,KAAK/V,UAAUkM,OAAO,qBAAsB1D,EAAA,QAAUw1B,SAASC,mBACxEn+B,SAASiW,KAAK/V,UAAUkM,OAAO,qBAAqB,GACpDpM,SAASiW,KAAK/V,UAAUkM,OAAO,oBAAqB1D,EAAA,QAAUw1B,SAASC,mBAEvEr+B,KAAK05H,wBAA0BhlG,GAAS,KACtC,MAAM42D,EAAStrF,KAAKosB,KAAKk/D,OACtBA,EAAOC,eACRD,EAAOC,cAAcC,gBAAgB,GAGvC,KAAWqH,WAAW7yF,KAAKosB,KAAKC,QAAQrC,cAAc01B,UACrD92C,EAAA,QAAUw1B,SAASC,kBAAoB,IAAM,GAAG,GAAO,GAE1D4b,GAAA,EAAa0/E,QAAQ/wH,EAAA,QAAUw1B,SAASkb,SAAS94C,MACjD6+C,EAAA,EAAqB+kC,iBAAgB,GAErC,IAAI,MAAMh4D,KAAQpsB,KAAKg2D,MACrB5pC,EAAKy5F,uBAGP,UAAK+T,cAAchxH,EAAA,QAAUw1B,SAASy7F,aA4LhC,KAAAC,gBAAkB,CAAC73H,EAA+B83H,KACxD,MAAMC,EAAgBh4B,KACtB,GAAIhiG,KAAKi6H,WAAcD,EAAvB,CAKA,GAAG/3H,aAAai4H,UAAW,CACzB,MAAMC,EAASl4H,EAAEm4H,aAAa9jE,OAEd6jE,EAAOxoH,SAAWwoH,EAAOxoH,SAAS,SAAWwoH,EAAO59G,QAAQ,UAAY,IAEtF,OAAAmB,EAAA,GAAYzb,GAIhB,aAAkBA,GAAGpB,KAAMohG,IACzB,GAAGA,EAAM9/F,OAAQ,CACf,GAAG63H,EAED,YADAA,EAAcK,SAASp4B,GAIzB,MAAM5b,EAAYrmF,KAAKosB,KAAKrqB,MAC5BskF,EAAU6b,eAAiB63B,IAAe,EAA2BpyH,IAAIs6F,EAAM,GAAG9+F,MAAQ,QAAU,YACpG,IAAI,GAAcnD,KAAKosB,KAAM61E,EAAO5b,EAAU6b,qBAxgClDjsC,GAAA,EAAkB5rC,SAClB,KAAwBjK,QAExBpgB,KAAKsuD,IAAM,OAAAC,EAAA,GAAO,KAAM,IAAS02D,IAAM,IAASC,KAAO,IAASC,MAAQ,IAASr6F,OAEjF9qB,KAAKmO,UAAU,GAEf5C,OAAOvK,iBAAiB,OAAQ,KAC9Bq+C,EAAA,EAAqB+kC,iBAAgB,GAErCpkF,KAAK84H,QAAUlwH,EAAA,QAAU4mF,KAAK8qC,QAAS,EACvCt6H,KAAKu6H,eACLvlF,cAAch1C,KAAK+4H,sBACnBnwH,EAAA,QAAU6F,cAAc,OAAQ7F,EAAA,QAAU4mF,KAAK8qC,QAE/C/uH,OAAOvK,iBAAiB,QAAS,KAC/BhB,KAAK84H,QAAUlwH,EAAA,QAAU4mF,KAAK8qC,QAAS,EACvCt6H,KAAKu6H,eACLv6H,KAAK+4H,qBAAuBxtH,OAAO4/B,YAAY,IAAMnrC,KAAKu6H,eAAgB,KAG1El7E,EAAA,EAAqB+kC,iBAAgB,GAErCx7E,EAAA,QAAU6F,cAAc,OAAQ7F,EAAA,QAAU4mF,KAAK8qC,SAC9C,CAAC3iH,MAAM,MAIZpM,OAAOvK,iBAAiB43H,GAAkB,KACxC54H,KAAK+4H,qBAAuBxtH,OAAO4/B,YAAY,IAAMnrC,KAAKu6H,eAAgB,KAC1Ev6H,KAAKu6H,eAELv6H,KAAK84H,QAAUlwH,EAAA,QAAU4mF,KAAK8qC,QAAS,EACvC1xH,EAAA,QAAU6F,cAAc,OAAQ7F,EAAA,QAAU4mF,KAAK8qC,SAC9C,CAAC3iH,MAAM,EAAM2D,SAAS,IAEzBtb,KAAKmS,eAAiBjS,SAASC,cAAc,OAC7CH,KAAKmS,eAAe/R,UAAUC,IAAI,kBAAmB,kBACrDL,KAAKmS,eAAe/F,QAAQrL,UAAY,aAExCf,KAAK64H,SAAS9uH,OAAO/J,KAAKmS,gBAE1BnS,KAAKw6H,gBACLx6H,KAAKy6H,eAAez6H,KAAKosB,KAAKnsB,WAE9B8O,EAAA,EAAwBkqH,aAAej5H,KAAKi5H,aAG5Cj5H,KAAKy5H,cACL7wH,EAAA,QAAU5H,iBAAiB,mBAAoBhB,KAAKy5H,aAEpD,OAAAlpE,GAAA,GAAuB,KACrBlR,EAAA,EAAqBumB,wBAAwB,QAC7CvmB,EAAA,EAAqB+kC,iBAAgB,IACpC,KACD/kC,EAAA,EAAqBumB,wBAAwB,IAC7CvmB,EAAA,EAAqB+kC,iBAAgB,KAGvCpkF,KAAKoiE,oBAGL7+C,EAAA,EAAWviB,iBAAiB,eAAgB,CAACoH,EAAM4mC,KAC9C9uC,SAASiW,KAAK/V,UAAUuR,ShF9IW,yBgF+IjCzR,SAASiW,KAAK/V,UAAUuR,SzI9KU,0ByI+KrC,GAAgBw9B,eAAc,KAIlCvmC,EAAA,QAAU5H,iBAAiB,gBAAkBiB,IAC3C,IAAI,OAACgF,EAAM,SAAE6D,EAAQ,IAAEjE,GAAO5E,EAC3B6I,IAAUA,EAAW,IAAsBuvF,kBAAkBvvF,IAC7DjE,IAAKA,EAAM,IAAsBwzF,kBAAkBxzF,IAEtD7G,KAAKqmD,aAAap/C,EAAQJ,EAAKiE,EAAW,kBAAepG,EAAWoG,KAGtElC,EAAA,QAAU5H,iBAAiB,gBAAkBorB,IAC3CpsB,KAAK06H,iBAAiBtuG,KAGxBxjB,EAAA,QAAU5H,iBAAiB,eAAgB,KACzChB,KAAKoiE,sBAGPx5D,EAAA,QAAU5H,iBAAiB,mBAAqB25H,IAC9C36H,KAAK46H,0BAA0BD,KAGjC/xH,EAAA,QAAU5H,iBAAiB,uBAAwB,KACjD,MAAM+xH,EAAQ,IAAI,KAAa,kCAA8BruH,EAAW,CAAC8xB,iBAAiB,IACpFxD,EAAI9yB,SAASC,cAAc,OACjC6yB,EAAE5yB,UAAUC,IAAI,kCACf0yH,EAAc9yH,UAAU8oB,YAAYiK,GAErC,MAAMvlB,EAASvN,SAASC,cAAc,OACtCsN,EAAOrN,UAAUC,IAAI,UACrBoN,EAAO1D,OAAO,eAAK,sBAEnB,MAAM2hB,EAAWxrB,SAASC,cAAc,OACxCurB,EAAStrB,UAAUC,IAAI,YACvBqrB,EAAS3hB,OAAO,eAAK,yBAErBipB,EAAEjpB,OAAO0D,EAAQie,GAEjBxrB,SAASiW,KAAK/V,UAAUC,IAAI,eAE3B0yH,EAAcliH,QAAU,KACvB3Q,SAASiW,KAAK/V,UAAUC,IAAI,yBAE5Bw6H,GAAA,EAAeC,mBAEftvH,WAAW,KACTtL,SAASiW,KAAK/V,UAAUuB,OAAO,cAAe,0BAC7C,MAGLoxH,EAAMt0G,SAGRw9D,GAAA,EAAajsE,IAAI,iBAAiBnP,KAAMmyB,IACtCipD,GAAA,EAAa1hC,WAAW,gBAAiBvnB,GAAK,MAGhDhzB,KAAK+6H,WAAa,IAAI,GAAW,KAAsB,IAAiB,KAIxEF,GAAA,EAAeC,mBAEf,MAAME,EAAgB,KACpBC,GAAA,QAAqBD,eAAc,IAGrC7vF,YAAY6vF,EAAe,MAC3BA,IAEAh7H,KAAKk7H,kBAAsB,CACzB5xH,KAAM,kBACN+tB,SAAU,CAACqhB,EAAQ1jC,KACjB,MAAM28C,EAAO38C,EAAQ28C,KAEfrpD,EAAI0M,EAAQ03B,WAAU,GAC5BpkC,EAAEkB,UAAY,aACdlB,EAAEihB,UAAYooC,EACdrpD,EAAEk7B,gBAAgB,WAElB,IAAI,GAAU,mBAAoB,CAChCzQ,aAAc,eACd+D,mBAAoB,gBACpBG,oBAAqB,CAAC3uB,GACtBsV,QAAS,CAAC,CACRwW,QAAS,OACTiD,SAAU,KACR/uB,EAAE2yB,aAGLxc,UAIPze,KAAKk7H,kBAA+D,CAClE5xH,KAAM,iBACN+tB,SAAU,EAAE8jG,gBACV,MAAM,QAAC9xB,EAAO,IAAE7sC,GAAO2+D,EAOvB,IAAmBh4C,SAASnjF,KAAKosB,KAAKnlB,OAAQ,IAAMoiG,GAAW7sC,EAAM,IAAMA,EAAM,QAMrFx8D,KAAKk7H,kBAAkD,CACrD5xH,KAAM,kBACN+tB,SAAU,EAAE8jG,gBACV,MAAM,QAACC,GAAWD,EACdC,GAIJp7H,KAAKosB,KAAK4lD,WAAW,IAAMopD,EAAU,QAIzCp7H,KAAKk7H,kBAA6D,CAChE5xH,KAAM,cACN+tB,SAAU,EAAEgkG,qBACV,MAAMljG,EAAqB,CACzB/wB,EAAGoiH,GAAmB8R,YACtB3mH,IAAK0mH,EAAe,IAGtBr7H,KAAKu7H,oBAAoBpjG,MAK7Bn4B,KAAKk7H,kBAA0D,CAC7D5xH,KAAM,WACN+tB,SAAU,EAAEgkG,qBACV,MAAMljG,EAAqB,CACzB/wB,EAAGoiH,GAAmBgS,UACtBC,OAAQJ,EAAe,IAAM3pE,mBAAmB2pE,EAAe,IAAI53H,MAAM,IAG3EzD,KAAKu7H,oBAAoBpjG,MAI1B,IACDn4B,KAAKk7H,kBAEF,CACD5xH,KAAM,YACNoyH,SAAU,KACVrkG,SAAU,EAAE8jG,gBACV,MAAMhjG,EAAOn4B,KAAK27H,SAASnS,GAAmBoS,WAAYT,GAC1Dn7H,KAAKu7H,oBAAoBpjG,MAK/Bn4B,KAAKk7H,kBAQF,CACD5xH,KAAM,KACN+tB,SAAU,EAAOgkG,iBAAgBF,eAAe,mCAC9C,IAAIhjG,EAEFA,EADuB,MAAtBkjG,EAAe,GACT,CACLj0H,EAAGoiH,GAAmBqS,aACtB7lG,QAASqlG,EAAe,GACxB7B,KAAM6B,EAAe,GACrBS,OAAQ,WAAYX,EAAYA,EAAUW,YAASp3H,EACnDq3H,QAASZ,EAAUY,SAGd,CACL30H,EAAGoiH,GAAmBwS,QACtBC,OAAQZ,EAAe,GACvB7B,KAAM6B,EAAe,GACrBU,QAASZ,EAAUY,SAIvB/7H,KAAKu7H,oBAAoBpjG,QAI7Bn4B,KAAKk7H,kBAqBF,CACD5xH,KAAM,UACNoyH,SAAU,KACVrkG,SAAU,EAAE8jG,gBACV,IAAIhjG,EACoB,qBAArBgjG,EAAUc,SAGX9jG,EAAOn4B,KAAK27H,SAASnS,GAAmBwS,QAASb,IAGnDn7H,KAAKu7H,oBAAoBpjG,MAI7Bn4B,KAAKk7H,kBAOF,CACD5xH,KAAM,cACNoyH,SAAU,KACVrkG,SAAU,EAAE8jG,gBACV,MAAMhjG,EAAOn4B,KAAK27H,SAASnS,GAAmBqS,aAAcV,GAC5Dn7H,KAAKu7H,oBAAoBpjG,MAI7Bn4B,KAAKk7H,kBAIF,CACD5xH,KAAM,cACNoyH,SAAU,KACVrkG,SAAU,EAAE8jG,gBACV,MAAMhjG,EAAOn4B,KAAK27H,SAASnS,GAAmB8R,YAAaH,GAC3Dn7H,KAAKu7H,oBAAoBpjG,MAI7Bn4B,KAAKk7H,kBAIF,CACD5xH,KAAM,WACNoyH,SAAU,KACVrkG,SAAU,EAAE8jG,gBACV,MAAMhjG,EAAOn4B,KAAK27H,SAASnS,GAAmBgS,UAAWL,GACzDn7H,KAAKu7H,oBAAoBpjG,MAI7Bn4B,KAAKi5H,eACLj5H,KAAKk8H,wBA5VP,WACE,OAAOtzH,EAAA,QAAU6O,KAGnB,WACE,OAAOzX,KAAKg2D,MAAMh2D,KAAKg2D,MAAM7zD,OAAS,GA0VhC,wBACN,MAAMg6H,EAAc,IAAIt4H,IAAI,CAAC,SAAU,WAAY,OAAQ,YAqF3D3D,SAASiW,KAAKnV,iBAAiB,UApFZiB,I,MACjB,MAAMsM,EAAMtM,EAAEsM,IACd,GAAG3F,EAAA,QAAUwzH,iBAAmBD,EAAYx0H,IAAI4G,GAAM,OAEtD,MAAMsG,EAAS5S,EAAE4S,OAMXuX,EAAOpsB,KAAKosB,KAElB,GAAc,SAAXnqB,EAAEigB,OAAoBjgB,EAAE+yG,UAAW/yG,EAAEgzG,SAA+B,UAAnBpgG,EAAO+1B,QAA3D,CAEO,IAAG3oC,EAAEogB,QAAmB,YAAR9T,GAA6B,cAARA,GAkBrC,GAAW,YAARA,EAAmB,CAC3B,GAAI6d,EAAKrqB,MAAMmsG,YAAa9hF,EAAKrqB,MAAM29F,eA0BrC,OA1BqD,CACrD,MACMj8F,EADiB,IAAmB20E,kBAAkBhsD,EAAKnlB,OAAQmlB,EAAKthB,UACjD3G,QAAQV,MACrC,GAAGA,EAAM44B,MAAM,KAAS23D,SAAWvwF,EAAMtB,OAAQ,CAC/C,IAAIk6H,EACJ,IAAI,MAAMx1H,KAAOpD,EAAO,CACtB,MAAMW,EAAUgoB,EAAKg4B,WAAWv9C,GAGhC,IAFa7G,KAAKyX,OAAS2U,EAAKnlB,OAAS7C,EAAQwH,SAAW5L,KAAKyX,KAAOrT,EAAQkT,OAAO+L,MAGlF,IAAmBw7E,eAAezyE,EAAKg4B,WAAWv9C,GAAM,QAAS,CAClEw1H,EAAUx1H,EACV,OAQHw1H,IACDjwG,EAAKrqB,MAAMu7F,mBAAmB++B,GAC9B,OAAA3+G,EAAA,GAAYzb,WAMb,GAAW,cAARsM,EACR,WAhDgE,CAChE,MAAM69D,EAAS,IAAmB3C,eAAeC,iBAAiB9gE,EAAA,QAAU2jE,UAAU,GACtF,IAAI+vD,EACJ,GAAI1zH,EAAA,QAAU3B,OAIP,CACL,MAAM5C,EAAM+nE,EAAOj3D,UAAUtJ,GAAUA,EAAO5E,SAAW2B,EAAA,QAAU3B,QACnE,IAAY,IAAT5C,EAAY,CAEbi4H,EAAalwD,EADa,YAAR79D,EAAoBlK,EAAM,EAAIA,EAAM,QAN7C,cAARkK,IACD+tH,EAAalwD,EAAO,IAUrBkwD,GACDt8H,KAAKsrC,QAAQgxF,EAAWr1H,QAmC5B,IACa,QAAX,EAAAmlB,aAAI,EAAJA,EAAMrqB,aAAK,eAAEmlF,eACbjlF,EAAE4S,SAAWuX,EAAKrqB,MAAMmlF,cACL,UAAnBryE,EAAO+1B,UACN/1B,EAAO2pF,aAAa,qBACpB,yBACCj7E,EAAA,EAAWC,UAA2B,IAAfxjB,KAAK2lF,SAC7Bv5D,EAAK+hB,UAAUC,cACfhiB,EAAKrqB,MAAM+pD,UACZ,CACA1/B,EAAKrqB,MAAMmlF,aAAaz7E,QACxB,OAAA42F,GAAA,GAAgBj2E,EAAKrqB,MAAMmlF,cAG3B,MAAMq1C,EAAW,IAAIC,cAAcv6H,EAAEkB,KAAMlB,GAC3CmqB,EAAKrqB,MAAMmlF,aAAaz4E,cAAc8tH,OAOpC,SAAuCp5H,EAASg4H,GACtD,OAAO,eACL/zH,EAAGjE,GACAg4H,GAIM,oBAAoBhjG,G,0CAC/B,OAAOA,aAAI,EAAJA,EAAM/wB,GACX,KAAKoiH,GAAmBwS,QAAS,CAC/B,MAAMzC,EAASphG,EAAKqhG,KAAO,IAAsBn/B,mBAAmBliE,EAAKqhG,WAAQ90H,EAC3E+3H,EAAYtkG,EAAK4jG,QAAU,IAAsB1hC,mBAAmBliE,EAAK4jG,cAAWr3H,EAE1F1E,KAAKqxE,aAAal5C,EAAK8jG,OAAQ1C,OAAQ70H,EAAW+3H,GAClD,MAGF,KAAKjT,GAAmBqS,aAAc,CACpC,MAAM7pH,EAASmmB,EAAKnC,QAAQE,WACtBjvB,EAAS+K,EAAOmV,UAAS,GAG/B,GADa,IAAgB4Q,QAAQ/lB,GAC7B0oB,QACN,UACQ,IAAgBgiG,eAAe1qH,GACrC,MAAMvF,GAEN,MADA+nB,GAAS,CAACC,YAAa,iBACjBhoB,EAIV,MAAM8sH,EAAS,IAAsBl/B,mBAAmBliE,EAAKqhG,MACvD1uH,EAAWqtB,EAAK2jG,OAAS,IAAsBzhC,mBAAmBliE,EAAK2jG,aAAUp3H,EAEpFoG,EAAU9K,KAAKmqF,WAAWljF,EAAQsyH,EAAQzuH,GACxC9K,KAAKqmD,aAAap/C,EAAQsyH,GAC/B,MAGF,KAAK/P,GAAmB8R,YACtB,IAAI,GAAc,CAACnsH,GAAIgpB,EAAKxjB,MAAM8J,OAClC,MAGF,KAAK+qG,GAAmBgS,UACtB,KAAWzlG,UAAU,2BAA4B,CAC/C0lC,KAAMtjC,EAAKsjG,SACV56H,KAAK4oH,IACFA,EAAyCr9F,MAC3C,IAAgBuwG,YAAalT,EAAyCr9F,MAAM,GAK1D,sBAAjBq9F,EAAWriH,GACK,mBAAjBqiH,EAAWriH,EAKb,IAAI,GAAoB+wB,EAAKsjG,OAAQhS,GAAYhrG,OAJ/Cze,KAAKqmD,aAAaojE,EAAWr9F,KAAKjd,GAAGgY,UAAS,KAK9C1a,IACc,wBAAbA,EAAItJ,MACLoxB,GAAM,eAAK,oBAGf,MAGF,KAAKi1F,GAAmBoS,WACnB,IACD57H,KAAKyhH,cAActpF,EAAKg9D,QAAQhuE,UAAS,GAAOgR,EAAKhpB,IAGvD,MAGF,QACEnP,KAAKsuD,IAAI13C,KAAK,+BAAgCuhB,OAM5C,kBAA0En1B,GAQ/EuI,QAAgBvI,EAAQ04H,SAAW14H,EAAQ04H,SAAW,IAAM,IAAM14H,EAAQsG,MAAS0L,IAClF,OAAA0I,EAAA,GAAY,MAEZ,MAAMi0C,EAAO38C,EAAQ28C,KACrB,IAAI0pE,EACAF,EAEAn4H,EAAQ45H,mBAAkBvB,EAAiB,IAAIl4E,IAAInuC,EAAQ28C,MAAMkrE,SAAS78E,MAAM,KAAKv8C,MAAM,IAC3FT,EAAQ85H,cAAa3B,EAAYn7H,KAAKk5H,eAAevnE,IAEzD,MAAMjmD,EAAM1I,EAAQq0B,SAAS,CAACgkG,iBAAgBF,aAAsBnmH,GACpE,YAAetQ,IAARgH,GAAoBA,GAIvB,eAAeqxH,EAAa/kE,EAAW+kE,EAAI/8E,MAAM,MACvD,MAAMtH,EAAc,GACpB,OAAIsf,EAAS,IACbA,EAAS,GAAGhY,MAAM,KAAK15C,QAAQb,IAC7BizC,EAAOjzC,EAAKu6C,MAAM,KAAK,IAAM0R,mBAAmBjsD,EAAKu6C,MAAM,KAAK,MAG3DtH,GALiBA,EAkDnB,aAAa7iB,EAAkBy6D,EAAgBxlF,EAAmB2xH,GACvE,OAAO,IAAgBl4C,gBAAgB1uD,GAAUh1B,KAAKigC,IACpD,MACM75B,EADoB,SAAX65B,EAAK15B,EACI05B,EAAK3xB,GAAGgY,WAAa2Z,EAAK3xB,GAAGgY,UAAS,GAE9D,OAAGrc,EAAiB9K,KAAKmqF,WAAWljF,EAAQqpF,EAAOxlF,GAC3C2xH,EAAkBz8H,KAAKg9H,YAAY/1H,EAAQqpF,EAAOmsC,GAC9Cz8H,KAAKqmD,aAAap/C,EAAQqpF,IACpC7jF,IACc,0BAAbA,EAAItJ,KACLqxB,GAAS,CAACC,YAAa,oBACF,qBAAbhoB,EAAItJ,MACZqxB,GAAS,CAACC,YAAa,6BAQtB,WAAWxtB,EAAgBgjF,EAAmBn/E,GACnD,OAAO,IAAmBiwE,kBAAkB9zE,EAAQ6D,GAAUjK,KAAK,KACjE,MAAMuD,EAAU,IAAmBoV,iBAAiBvS,EAAQ6D,GAG5D,OAFA,IAAmBmyH,kCAAkC74H,GAE9CpE,KAAKqmD,aAAap/C,EAAQgjF,EAAW,aAAcn/E,KAOvD,YAAY7D,EAAgBqpF,EAAemsC,GAChD,OAAO,IAAmBpyC,qBAAqBpjF,EAAQqpF,GAAOzvF,KAAKuD,GAC1DpE,KAAKmqF,WAAW/lF,EAAQ6C,OAAQw1H,EAAWr4H,EAAQyC,MAIjD,cAAcI,EAAgB2qH,G,0CACzC,MAAM5/G,EAAS/K,EAAOivB,WAChByG,EAAY,IAAgBA,UAAU3qB,EAAQ,eAiBpD,GAAG4/G,EAAa,CAEd,GAAmB,8BADK,KAAqBsL,iBAAiBtL,IACjDxqH,EAA4B,CACvC,IAAIu1B,EAKF,YAJAnI,GAAS,CACPC,YAAa,+BAMXw7F,GAAkB,CACtBn5F,mBAAoB,0BACpBjc,OAAQ,CACNuZ,QAAS,iCAMjB,MAAMgtF,EAAmB,KAAqBC,UAC3CD,UACK6O,GAAkB,CACtBl9F,aAAc,oCACd+D,mBAAoB,0CACpBG,oBAAqB,CACnB,IAAI,KAAU,CAAChwB,OAAQm6G,EAAiBpvG,OAAOmV,UAAS,KAAQnS,QAChE,IAAI,KAAU,CAAC/N,OAAQA,IAAS+N,SAElC6F,OAAQ,CACNuZ,QAAS,QAIV,KAAqBitF,YAAcD,UAC9BA,EAAiBqW,WAnDd,MAAW,mCACtB,MAAMx/F,QAAiB,UAAkBuK,YAAYxwB,GACrD,IAAImrH,EACJ,GAAIllG,EAASklG,KAOXA,EAAO,KAAqBC,cAAcnlG,EAASklG,KAAMnrH,OAPxC,CACjB,IAAI2qB,EACF,OAGFwgG,QAAa,KAAqBE,gBAAgBrrH,GAKpD,KAAqByvG,cAAczvG,EAAQmrH,EAAKhuH,IAAI,GAAM,OA0C5DtK,MAGK,qBAAqBy4H,GAAiB,GAC3C,MAAMp7D,EAAQt5D,EAAA,QAAU25D,WAExB,GAA6B,UAA1BL,EAAMD,WAAW9+D,MAA+C,YAA1B++D,EAAMD,WAAW9+D,MAAsB++D,EAAMD,WAAWiB,KAAO,CACtG,MAAMS,EAAe,kBAAgB45D,WAAWn/F,SAASwlC,OAAOnzD,KAAKC,GAAKA,EAAEpH,OAAS44D,EAAM54D,MAI3F,KAH4B44D,EAAMD,WAAW6B,OAASH,EAAa1B,WAAW6B,MAC5E5B,EAAMD,WAAWiB,OAASS,EAAa1B,WAAWiB,MAGlD,OAAOljE,KAAKw9H,cAAct7D,EAAMD,WAAWiB,MAAMriE,KAAM6T,GAC9C1U,KAAKy9H,cAAc/oH,EAAK4oH,GAC9B,KACDp7D,EAAMD,WAAa,YAAK0B,EAAa1B,YAC9BjiE,KAAKy9H,cAAc,IAAI,KAKpC,OAAOz9H,KAAKy9H,cAAc,GAAIH,GAGxB,cAAcp6D,GACpB,OAAGljE,KAAKg5H,mBAAmB91D,GAAcljE,KAAKg5H,mBAAmB91D,GAC1DljE,KAAKg5H,mBAAmB91D,GAAQ3uD,GAAA,EAAmB4vD,aAAau5D,QAAQ,eAAiBx6D,GAAMriE,KAAKqiD,GAClGC,IAAIC,gBAAgBF,IAIxB,cAAcxuC,EAAa4oH,GAAiB,GACjD,MAAM7/F,EAAWz9B,KAAKg2D,MAAMvtD,IAAI2jB,GAAQA,EAAKqxG,cAAc/oH,IAC3D,OAAO+oB,EAASA,EAASt7B,OAAS,GAAGtB,KAAK,KACrCy8H,GACD10H,EAAA,QAAU6F,cAAc,uBAKvB,iBAAiB2d,GACtB,IAAK,CAAC,OAAQ,cAA6B2N,SAAS3N,EAAKjpB,QAAUipB,EAAKnlB,OACtE,OAMA,MAAM02H,EAAcvxG,EAAKC,QACnBmH,EAAMmqG,EAAY5yH,WAAWy9B,UAE7Bj6B,EAAM6d,EAAKnlB,QAAUmlB,EAAKthB,SAAW,IAAMshB,EAAKthB,SAAW,IAE3D8yH,EAAgB3hD,GAAA,EAAaziC,aAAa,iBAChD,GAAKmkF,EAAY5yH,WAAWsgF,oBAAsB,IAAMsyC,EAAY5yH,WAAW5F,UAAU2X,SAAW9F,OAAOy0C,KAAKkyE,EAAYtxG,SAASlqB,cAU5Hy7H,EAAcrvH,GAErBvO,KAAKsuD,IAAI,6BAZkI,CAC3I,MAAM76B,EAAW,CACfxrB,KAAM,YAAqB01H,EAAYtxG,QAAS,QAChDmH,OAGFoqG,EAAcrvH,GAAOklB,EAErBzzB,KAAKsuD,IAAI,uBAAwB76B,GAOnCwoD,GAAA,EAAatnE,IAAI,CAACipH,kBAAgB,GAI/B,qBAAqBxxG,GAC1B,IAAK,CAAC,OAAQ,cAA6B2N,SAAS3N,EAAKjpB,QAAUipB,EAAKnlB,OACtE,OAGF,MAAMsH,EAAM6d,EAAKnlB,QAAUmlB,EAAKthB,SAAW,IAAMshB,EAAKthB,SAAW,IAC3D0wC,EAAQygC,GAAA,EAAaziC,aAAa,iBACxC,OAAOgC,GAASA,EAAMjtC,GAGjB,0BACL,IAAIwwD,EACJ,MAAMmD,EAAQt5D,EAAA,QAAU25D,WACrBL,EAAMD,WAAW7C,oBAClBL,EAAOmD,EAAMD,WAAW7C,mBACxBl/D,SAASuvC,gBAAgB9sC,MAAMykC,YAAY,gCAAiC23B,IAE5E7+D,SAASuvC,gBAAgB9sC,MAAM+vE,eAAe,kCAG5C,uBAAsB3T,IACxBn2D,EAAA,QAAUi1H,WpGvvBT,SAAyB9+D,GAC9B,OAAOD,GAAiBC,GAAMt7D,MAAM,GAAI,GoGsvBbq6H,CAAgB/+D,IAIpC,kBAAkBmE,EAAe66D,EAAwBT,GAS9D,OARAt9H,KAAKg+H,0BAELp1H,EAAA,QAAUq1H,WAEPF,IACD/9H,KAAKg5H,mBAAmB91D,GAAQrgE,QAAQoD,QAAQ83H,IAG3C/9H,KAAKk+H,0BAAwCx5H,IAAnB44H,IAAiCp6D,EAAOo6D,GA+BnE,eAAe9tH,EAAkBJ,GACvC,GAAGpP,KAAKm+H,UAAY3uH,EAApB,CAQA,IAJe,IAAZJ,GAAqBpP,KAAKm+H,SAC3B5U,GAAkB,CAAC/5G,EAAKxP,KAAKm+H,SAASv2H,OAAOc,UAG5C1I,KAAKm+H,QAAS,CACfn+H,KAAKm+H,QAAQ/9H,UAAUuB,OAAO,UAC9B3B,KAAK05H,0BAGF9wH,EAAA,QAAUw1B,SAASC,oBAAiC,IAAZjvB,GACzC,aAA4B,OAAAhO,GAAA,GAAM,KAAY,KAGhD,MAAMg9H,EAAU,OAAA35E,GAAA,GAAWzkD,KAAKm+H,SACpB,OAAA15E,GAAA,GAAWj1C,GACd4uH,GACPrvH,EAAA,EAAwBoB,SAAS,CAC/BhN,KAAM,OACNiN,MAAQC,IACNrQ,KAAKsrC,QAAQ,UAAc5mC,EAAW2L,GACtC,OAAAi6C,GAAA,QAMR96C,EAAIpP,UAAUC,IAAI,UAClBL,KAAKm+H,QAAU3uH,GAGT,OACNtP,SAASc,iBAAiB,QAAShB,KAAK85H,iBAAiB,GAErD,uBACF95H,KAAKq+H,6BAILr+H,KAAKitG,cAAgB,IAAI,GAAcjtG,MACvCA,KAAKitG,cAAcqxB,kBAIf,6BACN,MAAMC,EAA2B,GAC3BC,EAAgC,GACtC,IAAIjyE,GAAU,EACd,MAAMjgD,EAAS,CAAMrK,EAAcw8H,IAAmB,mCACpD,GAAGA,IAAUlyE,EAAS,OAEtB,MAAM4tE,EAASl4H,EAAEm4H,aAAa9jE,MAExBooE,EAAUvE,EAAOxoH,SAAWwoH,EAAOxoH,SAAS,SAAWwoH,EAAO59G,QAAQ,UAAY,EAElFy9G,EAAgBh4B,KACtB,IAAI08B,IAAa1+H,KAAKi6H,YAAcD,EAElC,YADA9lE,EAAU,GAIZ,MAAMyqE,EAAkB3E,EAAgB4E,EAAsBC,EACxDC,EAAS9E,EAAgBwE,EAAaD,EAE5C,GAAGE,IAAUK,EAAO38H,OAAQ,CAC1B,MAAMm0D,QAAwB,aAAkBr0D,GAAG,GAC7Co/F,EAAQq9B,IAAYpoE,EAAMn0D,OAE1B48H,EAAazoE,EAAM1uD,OAAO8I,GAAK,EAA2B/I,IAAI+I,IAAIvO,OAGxEnC,KAAKsuD,IAAI,aAAcgI,GAEpB0jE,GACDA,EAAcgF,YAAYL,IAEvBroE,EAAMn0D,QAAUk/F,IACjBy9B,EAAOn5H,KAAK,IAAI,GAAgBg5H,EAAiB,CAC/ClxH,OAAQ,4BACR67G,WAAY,CAAChzD,EAAMn0D,QACnB+mH,OAASjnH,IACPqK,EAAOrK,GAAG,GACV,GAAaqsD,IAAI,OAAQrsD,GACzB,GAAa63H,gBAAgB73H,EAAG,mBAKnCq0D,EAAMn0D,QAAUk/F,IACjBy9B,EAAOn5H,KAAK,IAAI,GAAgBg5H,EAAiB,CAC/CtxH,KAAM,YACNI,OAAQ,iBACRie,SAAU,uBACVw9F,OAASjnH,IACPqK,EAAOrK,GAAG,GACV,GAAaqsD,IAAI,OAAQrsD,GACzB,GAAa63H,gBAAgB73H,EAAG,iBAMnC88H,GAAc19B,IACfy9B,EAAOn5H,KAAK,IAAI,GAAgBg5H,EAAiB,CAC/CtxH,KAAM,YACNI,OAAQ,iBACRie,SAAU,qBACVw9F,OAASjnH,IACPqK,EAAOrK,GAAG,GACV,GAAaqsD,IAAI,OAAQrsD,GACzB,GAAa63H,gBAAgB73H,EAAG,aAKtCjC,KAAKosB,KAAKnsB,UAAU8J,OAAO40H,IAM/B,aAAcA,EAAiB,aAAcF,EAAO,IAAK,KACnDA,IACFK,EAAOx4H,QAAQ24H,IACbA,EAAKpb,YAGPib,EAAO38H,OAAS,KAIjBs8H,EACDK,EAAOx4H,QAAQ24H,IACbA,EAAKC,YAGPhrE,EAAU,EAGZh0D,SAASiW,KAAK/V,UAAUkM,OAAO,cAAemyH,GAC9ClyE,EAAUkyE,KAOZ,IAAIvqE,EAAU,EACdh0D,SAASiW,KAAKnV,iBAAiB,YAAciB,IAC3CiyD,MAGFh0D,SAASiW,KAAKnV,iBAAiB,WAAaiB,IAE1CqK,EAAOrK,GAAG,GACV,OAAAyb,EAAA,GAAYzb,KAGd/B,SAASiW,KAAKnV,iBAAiB,YAAciB,IAG3CiyD,IACe,IAAZA,GAED5nD,EAAOrK,GAAG,KAId,MAAM48H,EAAiB3+H,SAASC,cAAc,OAC9C0+H,EAAez+H,UAAUC,IAAI,mBAE7B,MAAMu+H,EAAsBC,EAAenyF,WAAU,GAG/C,U,MACN,MAAMzlC,EAAkB,QAAT,EAAAjH,KAAKosB,YAAI,eAAEnlB,OAC1B,SAAUA,GAAU2B,EAAA,QAAUwzH,kBAAoB,IAAmBj2C,cAAcl/E,EAAQjH,KAAKosB,KAAKthB,SAAU,eAiC1G,UAAUqE,EAAYC,IACZ,IAAZA,GACDm6G,GAAkB,CAAC,GAAe35G,UAAW5P,KAAK64H,SAAU,GAAgBjpH,YAG9E1P,SAASiW,KAAK/V,UAAUkM,OhFjmCgB,uBgFimC4B,IAAP6C,GAE7D,MAAM8+C,EAAYjuD,KAAK2lF,MAEvB3lF,KAAKsuD,IAAI,YAAan/C,EAAI8+C,GAE1B,IAAIpe,EAAiCjnC,EAAA,QAAUw1B,SAASC,kBAAoB,eAAcx7B,QAAQoD,UAClG,IAAkB,IAAfgoD,GAAoBA,IAAc9+C,GAAMvG,EAAA,QAAUw1B,SAASC,oBAAiC,IAAZjvB,EAAmB,CACpG,MAAM+vH,EAAqD,KAAnC57G,EAAA,EAAWC,SAAW,IAAM,KACpDqsB,EAAmB,OAAAzuC,GAAA,GAAM+9H,GACzB,aAA4BtvF,EAAkBsvF,GAgChD,OAvBAn/H,KAAK2lF,MAAQx2E,EACb,OAAAm7C,GAAA,KACG/mC,EAAA,EAAWC,UAA0B,IAAdyqC,GAAmB9+C,EAAK,GAChDjP,SAASiW,KAAK/V,UAAUuB,OzItpCe,0ByIypCvB,IAAfssD,GAAoB9+C,EAAK8+C,IACvB9+C,EAAK,IAAMJ,EAAA,EAAwBC,eAAe,QACnDD,EAAA,EAAwBoB,SAAS,CAC/BhN,KAAM,KACNiN,MAAQC,IAENrQ,KAAKsrC,QAAQ,UAAc5mC,EAAW2L,MAM9CzH,EAAA,QAAU6F,cAAc,gBAAiBU,GAKlC0gC,EAGF,eACL,OAAI7vC,KAAKyX,MAET,IAAgB2nH,cAAcp/H,KAAKyX,KAAMzX,KAAK84H,SACvC,KAAWuG,gBAAgB,uBAAwB,CAACvG,QAAS94H,KAAK84H,WAHnDj2H,QAAQoD,UAMxB,gBACN,MAAMmmB,EAAO,IAAI,GAAKpsB,KACpB,IACA,IACA,GACA,IACA,IACA,IACA,UACA,GACA,IACA,KACA,KACA,KACA,KACA,KACAi8E,GAAA,EACA,KACA,GACA,IACA,MAGCj8E,KAAKg2D,MAAM7zD,QACZiqB,EAAK44F,aAAaj7G,OAAO/J,KAAKosB,KAAK44F,aAAa5zE,iBAAiB1E,WAAU,IAG7E1sC,KAAKg2D,MAAMrwD,KAAKymB,GAGV,YAAYkzG,EAAmBC,GAAa,EAAMnwH,EAAmBowH,GAC3E,KAAGF,GAAat/H,KAAKg2D,MAAM7zD,QAA3B,CAEGnC,KAAKg2D,MAAM7zD,OAAS,GAAKo9H,GAC1B32H,EAAA,QAAU6F,cAAc,gBAAiBzO,KAAKosB,MAG5CozG,IACFA,EAAUx/H,KAAKg2D,MAAMvxD,OAAO66H,EAAWt/H,KAAKg2D,MAAM7zD,OAASm9H,IAI7D,IAAI,IAAIt0H,EAAI,EAAGA,EAAIw0H,EAAQr9H,OAAS,IAAK6I,EACvC+D,EAAA,EAAwB6B,aAAa,QAAQ,GAY/C,GARG4uH,EAAQr9H,OAAS,GAClBq9H,EAAQ/7H,MAAM,GAAI,GAAG6C,QAAQ8lB,IAC3BA,EAAKnsB,UAAU0B,WAInB3B,KAAKy6H,eAAez6H,KAAKosB,KAAKnsB,UAAWmP,GAEtCmwH,EAAY,CACb32H,EAAA,QAAU6F,cAAc,eAAgBzO,KAAKosB,KAAKnlB,QAElD,MAAM2+G,EAAY,GAAgBj1G,OAAO,IACtCi1G,GACDA,EAAU7sF,QAGE,GAAgBsW,eAAe/D,QAAQtrC,KAAKosB,KAAKnlB,OAAQjH,KAAKosB,KAAKthB,YAE/E,GAAgBukC,eAAe02E,kBAAiB,GAChD,GAAgB12E,eAAeV,uBAQnC6wF,EAAQl5H,QAAQ8lB,IACdA,EAAKqzG,kBAGPj0H,WAAW,KAETg0H,EAAQl5H,QAAQ8lB,IACdA,EAAKy3F,aAEN,MAGE,QAAQ58G,EAAgBgjF,EAAoB76E,GAC9CpP,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGd,MAAMke,EAAOpsB,KAAKosB,KACZszG,EAAY1/H,KAAKg2D,MAAMz5C,QAAQ6P,GAErC,GAAInlB,GAQG,GAAGy4H,EAAY,GAAKtzG,EAAKnlB,QAAUmlB,EAAKnlB,SAAWA,EAAQ,CAO9D,MAAMu4H,EAAUx/H,KAAKg2D,MAAMvxD,OAAO,EAAGzE,KAAKg2D,MAAM7zD,OAAS,GACzD,GAAGnC,KAAKosB,KAAKnlB,SAAWA,EAEtB,YADAjH,KAAK2/H,YAAY,GAAG,GAAM,EAAMH,GAE3B,CACL,MAAM75F,EAAM3lC,KAAKsrC,QAAQrkC,EAAQgjF,GAEjC,OADAjqF,KAAK2/H,YAAY,GAAG,GAAO,EAAOH,GAC3B75F,QAtBD,CACV,GAAG+5F,EAAY,EAEb,YADA1/H,KAAK2/H,YAAYD,OAAWh7H,EAAW0K,GAElC,GAAGmU,EAAA,EAAWq/F,eAAiB,IAAW3zE,OAE/C,YADAjvC,KAAKmO,YAAYnO,KAAK2lF,MAAOv2E,GA2BjC,GAAGnI,IAAWmlB,EAAKnlB,QAAUsc,EAAA,EAAWq/F,cAAgB,IAAW3zE,QAAU/uC,SAASiW,KAAK/V,UAAUuR,ShFpxC7D,wBgFsxCtC,OADA3R,KAAKmO,UAAU,EAAGiB,IACX,EAGT,GAAGnI,GAAUsc,EAAA,EAAWq/F,eAAiB,IAAW1zE,OAAQ,CAC1D,MAAM7oC,EAAS+lB,EAAKkf,QAAQrkC,EAAQgjF,GAG9B9jF,GAAUE,aAAM,EAANA,EAAQyS,QAASzS,EAAOF,QAAUtD,QAAQoD,UACvDgB,GACDd,EAAQtF,KAAK,KAEX2K,WAAW,KACTA,WAAW,KACTxL,KAAKy6H,eAAez6H,KAAKosB,KAAKnsB,YAC7B,GACHD,KAAKmO,UAAU,EAAGiB,IACjB,KAKT,OAAInI,OAAJ,GACEjH,KAAKmO,UAAU,EAAGiB,IACX,GAIJ,aAAanI,EAAgBgjF,EAAoB9mF,EAAiB,OAAQ2H,GAC/E,GAAG7D,IAAW,OAAiBA,EAC7B,OAIF,MAAM24H,EAAgB5/H,KAAKg2D,MAAM7gD,UAAUiX,GAAQA,EAAKnlB,SAAWA,GAAUmlB,EAAKjpB,OAASA,GAC3F,IAAsB,IAAnBy8H,EAED,OADA5/H,KAAK2/H,YAAYC,EAAgB,GAC1B5/H,KAAKsrC,QAAQrkC,EAAQgjF,GAkB9B,OAfajqF,KAAKosB,KACV+4D,QACNnlF,KAAKw6H,gBAGJr3H,IACDnD,KAAKosB,KAAKyzG,QAAQ18H,GAEf2H,IACD9K,KAAKosB,KAAKthB,SAAWA,IAMlB9K,KAAKsrC,QAAQrkC,EAAQgjF,GAGvB,cAAchjF,GACnBjH,KAAKqmD,aAAap/C,OAAQvC,EAAW,aAG/B,iBAAiBH,GACvB,MAAMwL,EAAK7P,SAASC,cAAc,QAClC,IAAI6yB,EAAI,cAGR,OAFAjjB,EAAG3P,UAAUC,IAAI2yB,GACjBjjB,EAAG3D,QAAQ7H,OAASA,EAAO6C,EACpB7C,EAAO6C,GACZ,IAAK,0BAEH4rB,GAAK,QACL,IAAI,IAAIhoB,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAM80H,EAAM5/H,SAASC,cAAc,QACnC2/H,EAAIt2H,UAAYwpB,EAAI,OACpBjjB,EAAGhG,OAAO+1H,GAEZ,MAGF,IAAK,+BACL,IAAK,kCACL,IAAK,+BACL,IAAK,+BACL,IAAK,+BACH9sG,GAAK,UAIL,MAGF,IAAK,+BACL,IAAK,+BACL,IAAK,+BACHA,GAAK,UACL,MAGF,IAAK,iCACHA,GAAK,oBACL,IAAI,IAAIhoB,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAM+0H,EAAM7/H,SAASC,cAAc,OACnC4/H,EAAIv2H,UAAYwpB,EAAI,OACpBjjB,EAAGhG,OAAOg2H,IAQhB,OAFAhwH,EAAG3P,UAAUC,IAAI2yB,GAEVjjB,EAGF,cAAc9I,EAAgBhH,GACnC,IAAI,IAAgB8yF,MAAM9rF,GAAS,CACjC,MAAM+4H,EAAU,UAAkBC,eAAeh5H,GACjD,IAAI+4H,IAAYA,EAAQ79H,OACtB,OAGF,MAAM+9H,EAASF,EAAQ,GAEjBG,EAEF,CACFC,QAAS,CACP,wBAA2B,gCAC3B,6BAAgC,iCAChC,gCAAmC,iCACnC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,0BAA6B,iCAC7B,+BAAkC,sCAEpCh0G,KAAM,CACJ,wBAA2B,gCAC3B,6BAAgC,iCAChC,gCAAmC,iCACnC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,0BAA6B,iCAC7B,+BAAkC,sCAEpCi0G,MAAO,CACL,wBAA2B,uCAC3B,6BAAgC,wCAChC,gCAAmC,wCACnC,6BAAgC,yCAChC,6BAAgC,yCAChC,6BAAgC,yCAChC,6BAAgC,2CAChC,6BAAgC,2CAChC,6BAAgC,2CAChC,0BAA6B,wCAC7B,+BAAkC,8CAIhCC,EAAOr5H,EAAOw1B,SAAW0jG,EAAaC,QAAWJ,EAAQ79H,OAAS,EAAIg+H,EAAaE,MAAQF,EAAa/zG,KAC9G,IAAI7nB,EAAS27H,EAAO37H,OAEpB,GAAGy7H,EAAQ79H,OAAS,EAAG,CACrB,MAAM0T,EAAS,GACfmqH,EAAQ15H,QAAQ45H,IACd,MAAM/8H,EAAO+8H,EAAO37H,OAAO6C,OACZ1C,IAAZmR,EAAE1S,KAAqB0S,EAAE1S,GAAQ,KAClC0S,EAAE1S,KAGH6T,OAAOy0C,KAAK51C,GAAG1T,OAAS,IACzBoC,EAAS,CACP6C,EAAG,4BAKT,MAAMqtB,EAAc6rG,EAAK/7H,EAAO6C,GAChC,IAAIqtB,EACF,OAGEx0B,IACFA,EAAYC,SAASC,cAAc,SACzBC,UAAUC,IAAI,SAAU,yBAGpB,mCAAbkE,EAAO6C,GACRnH,EAAUG,UAAUC,IAAI,oBAG1B,IAUI4N,EAVAsyH,EAAgBtgI,EAAUygB,kBAC1B6/G,EAICA,EAAcn0H,QAAQ7H,SAAWA,EAAO6C,GACzCm5H,EAAcx3G,YAAY/oB,KAAKwgI,iBAAiBj8H,KAJlDg8H,EAAgBvgI,KAAKwgI,iBAAiBj8H,GACtCtE,EAAUwf,QAAQ8gH,IAQjBt5H,EAAO42B,cACR5vB,EAAO,CACL,IAAI,KAAU,CAAChH,OAAQi5H,EAAO9tH,OAAO+U,UAAS,GAAQisC,eAAe,IAAOp+C,QAC5EgrH,EAAQ79H,OAAS,IAGrB,MAAMs+H,EAAqB,eAAKhsG,EAAaxmB,GAK7C,OAJAwyH,EAAmBrgI,UAAUC,IAAI,2BAE9BJ,EAAUgK,kBAAoB,EAAGhK,EAAUmxC,iBAAiBroB,YAAY03G,GACtExgI,EAAU8J,OAAO02H,GACfxgI,GAIE,cAAcgH,G,gDACzB,IAAIykB,EACJ,GAAIzkB,EAAJ,CAEA,GAAGA,EAAO42B,YAAa,CACrB,IAAIsxB,EAAOnvD,KAAK0gI,cAAcz5H,GAC9B,GAAGkoD,EACD,OAAOA,EAGT,MAAMn9C,EAAS/K,EAAOivB,WAChB+rF,QAAiB,UAAkBz/E,YAAYxwB,GACrDhS,KAAKosB,KAAKkiC,IAAI,gBAAiB2zD,GAE/B,MAAM9vD,EAAqB8vD,EAAS9vD,oBAAuB8vD,EAAS3kF,cAAgB2kF,EAAS3kF,aAAaA,cAAgB2kF,EAAS3kF,aAAaA,aAAan7B,QAAW,EAItK,GAFAupB,EAAW,UAAkBoS,qBAAqB9rB,GAE/CmgD,EAAqB,EACtB,OAAOzmC,EAGT,MAAMi1G,QAAgB,UAAkBC,WAAW5uH,GACnD,GAAG2uH,EAAU,EAAG,CACd,MAAMxxE,EAAOjvD,SAASC,cAAc,QAEpCgvD,EAAKplD,UAAU,eAAK,CAAC2hB,EAAU,eAAK,cAAe,CAAC,OAAAkqD,EAAA,GAAuB+qD,OAAa,IACxFj1G,EAAWyjC,EAGb,OAAOzjC,EAEJ,CACL,MAAM2Y,EAAO,IAAgBC,QAAQr9B,GAErC,GAAG2B,EAAA,QAAU6O,OAASxQ,EACpB,OACK,GAAGo9B,EAAM,CAGd,GAFA3Y,EAAW,IAAgBnZ,oBAAoB8xB,EAAKl1B,KAEhD,IAAgB4jF,MAAM9rF,GAAS,CACjC,IAAIkoD,EAAOnvD,KAAK0gI,cAAcz5H,GAO9B,GANIkoD,GAA2B,sBAAR,QAAX,EAAA9qB,EAAKohB,cAAM,eAAEr+C,KACvB+nD,EAAOjvD,SAASC,cAAc,QAC9BgvD,EAAK/uD,UAAUC,IAAI,UACnB8uD,EAAKplD,OAAO2hB,IAGXyjC,EACD,OAAOA,EAIX,OAAOzjC,QAKN,cAAczkB,EAAgB+N,EAAsB01B,EAAoBm2F,EAAwB50G,GAClGye,IACD11B,EAAQ/Q,UAAY48H,EAAgB,IAAM,IAI5C,MAAMC,EAAkB9rH,EAAQnF,cAAc,0BAC3CixH,GAAmB9gI,KAAK0gI,cAAcz5H,EAAQ65H,IAIjD9gI,KAAK+gI,cAAc95H,GAAQpG,KAAM6qB,IAC3BO,KAIJ,OAAA1f,EAAA,GAAeyI,EAAS0W,IAAam1G,EAAgB,IAAM,OAIxD,yBAAyBh2G,GAC9B,IAAmB41D,UAAUzgF,KAAKosB,KAAKnlB,OAAQ,CAACG,EAAGyjB,EAAS,0BAA4B,qCAK5F,OAAmB,KAAei/D,aAAe,IAClC,U,2SC7jDA,MAAM,WAIV,IA+DT,YACY70E,EACV+rH,GAEA/9H,OAAM,GAHI,KAAAgS,aA1DF,KAAAgsH,OAA6E,GAC7E,KAAApzH,QAAgG,GAChG,KAAA+P,QAAwH,GAIxH,KAAAie,OAAS,EACT,KAAA1V,UAAkC,KAClC,KAAA+6G,oBAA4C,KAO5C,KAAAC,aAAc,EAId,KAAAC,OAASlhI,SAAS4uC,eAAe,cAejC,KAAAuyF,aAKN,GAGM,KAAAC,gBAAkB,EAClB,KAAAC,gBAAkB,EAClB,KAAAC,WAAa,EACb,KAAAC,WAAa,EA6Qb,KAAAC,aAAe,CAACx/H,EAAQlC,KAAKqhI,aAAaM,cAAcz/H,SA9UzC,IAgVpBA,IACDlC,KAAKwhI,WAAa,EAClBxhI,KAAKyhI,WAAa,GAGpBzhI,KAAK4hI,gBAAgBj/H,MAAMga,UAAY,UAAUza,YAAgBA,MAAUlC,KAAKwhI,eAAexhI,KAAKyhI,cAEpGzhI,KAAKqhI,aAAaQ,OAAOzhI,UAAUkM,OAAO,WAtVvB,KAsVmCpK,GACtDlC,KAAKqhI,aAAaS,MAAM1hI,UAAUkM,OAAO,WAtVtB,IAsVkCpK,GAErDlC,KAAK+hI,WA1VkB,IA0VP7/H,IAuDlB,KAAAib,QAAWlb,IACT,GAAGjC,KAAKgiI,yBAA0B,OAElC,MAAMntH,EAAS5S,EAAE4S,OACjB,GAAsB,MAAnBA,EAAO+1B,QAAiB,OAG3B,GAFA,OAAAltB,EAAA,GAAYzb,GAET,sBAYD,OAXGjC,KAAKiiI,0BACNj1H,aAAahN,KAAKiiI,2BAElBjiI,KAAKkiI,SAAS9hI,UAAUC,IAAI,4BAG9BL,KAAKiiI,0BAA4B12H,OAAOC,WAAW,KACjDxL,KAAKkiI,SAAS9hI,UAAUuB,OAAO,uBAC/B3B,KAAKiiI,0BAA4B,GAChC,MAKL,MAAME,EAAYniI,KAAKmiI,YACvB,IAAIC,EAAqB,KACzB,MAAMrtC,EAAa,CAAC,eAAgB,uBAAwB,sBAAuB,uBAAwB,kBACxGotC,GACDptC,EAAWpvF,KAAK,uBAGlBovF,EAAWtkF,KAAKoF,IACd,IAEE,GADAusH,EAAQ,OAAAxjH,GAAA,GAAgB/J,EAAQgB,GAC7BusH,EAAO,OAAO,EACjB,MAAM31H,GAAM,OAAO,KAGiB21H,IAAWD,GAAiC,QAAnBttH,EAAO+1B,SAAwC,UAAnB/1B,EAAO+1B,UAClG5qC,KAAK4d,QAAQmb,MAAMkC,SAIf,KAAAmnE,UAAangG,IAEnB,GAAG2G,EAAA,QAAUqZ,eAAiB,EAC5B,OAGF,MAAM1T,EAAMtM,EAAEsM,IAEd,IAAI4T,GAAO,EACA,eAAR5T,EACDvO,KAAK4d,QAAQ/Y,KAAKo2B,QACF,cAAR1sB,EACRvO,KAAK4d,QAAQlE,KAAKuhB,QACF,MAAR1sB,GAAuB,MAARA,EACpBvO,KAAKqiI,aACNriI,KAAKsiI,WAAmB,MAAR/zH,GAGlB4T,GAAO,GAGNlgB,EAAE+yG,SAAW/yG,EAAEgzG,WAChBj1G,KAAKqiI,aAAc,GAGlBlgH,GACD,OAAAzE,EAAA,GAAYzb,IAIR,KAAAsgI,QAAWtgI,IACd2G,EAAA,QAAUqZ,eAAiB,GAIzBhgB,EAAE+yG,SAAW/yG,EAAEgzG,UAClBj1G,KAAKqiI,aAAc,EAEhBriI,KAAKmiI,aACNniI,KAAK0hI,iBAKH,KAAAc,QAAWvgI,IACjB,KAAG2G,EAAA,QAAUqZ,eAAiB,GAAM,OAAArD,GAAA,GAAgB3c,EAAE4S,OAAQ,0BAA4B7U,KAAKqiI,eAI/F,OAAA3kH,EAAA,GAAYzb,GAETjC,KAAKqiI,aAAa,CACnB,MAAMI,EAAcxgI,EAAEm+G,OAAS,EAE/BpgH,KAAKsiI,aAAaG,KA7ZpBziI,KAAKsuD,IAAM,OAAAC,EAAA,GAAO,OAClBvuD,KAAKmmB,UAAY,IAAI,KACrBnmB,KAAKkhI,oBAAsB,IAAI,KAAqB,CAClD96G,YAAY,EACZtH,YAAY,IAEd9e,KAAKmmB,UAAUE,YACfrmB,KAAKkhI,oBAAoB76G,YACzBrmB,KAAKgqB,cAAgB,IAAI,KAEzBhqB,KAAKkiI,SAAWhiI,SAASC,cAAc,OACvCH,KAAKkiI,SAAS9hI,UAAUC,IAAIqiI,sBAE5B1iI,KAAK2iI,YAAcziI,SAASC,cAAc,OAC1CH,KAAK2iI,YAAYviI,UAAUC,IAAI,YAE/B,MAAMuiI,EAAU1iI,SAASC,cAAc,OACvCyiI,EAAQxiI,UAAUC,IA5FgB,gBA8FlC,MAAMirF,EAAStrF,KAAKsrF,OAASprF,SAASC,cAAc,OACpDmrF,EAAOlrF,UAAUC,IAAIqiI,sBAAoCA,uBAEzD,MAAMG,EAAa3iI,SAASC,cAAc,OAC1C0iI,EAAWziI,UAAUC,IAAIqiI,4BAEzB1iI,KAAK4d,QAAQ,gBAAkB,EAAW,QAAS,CAACklH,YAAY,IAGhE9iI,KAAKihI,OAAOhhI,UAAYC,SAASC,cAAc,OAC/CH,KAAKihI,OAAOhhI,UAAUG,UAAUC,IAAIqiI,sBAAoC,aACxE,MAAMK,EAAc7iI,SAASC,cAAc,OAE3CH,KAAKihI,OAAOxqG,SAAW,IAAI,GAC3Bz2B,KAAKihI,OAAOxqG,SAASr2B,UAAUC,IAAIqiI,uBAAqC,aAExE1iI,KAAKihI,OAAOn3H,OAAS5J,SAASC,cAAc,OAC5CH,KAAKihI,OAAOn3H,OAAO1J,UAAUC,IAAIqiI,qBAEjC1iI,KAAKihI,OAAO94G,KAAOjoB,SAASC,cAAc,OAC1CH,KAAKihI,OAAO94G,KAAK/nB,UAAUC,IAAIqiI,qBAE/BK,EAAYh5H,OAAO/J,KAAKihI,OAAOn3H,OAAQ9J,KAAKihI,OAAO94G,MAEnDnoB,KAAKihI,OAAOhhI,UAAU8J,OAAO/J,KAAKihI,OAAOxqG,SAAUssG,GAGnD,MAAM/zD,EAAa9uE,SAASC,cAAc,OAC1C6uE,EAAW5uE,UAAUC,IAAIqiI,wBAEzB1B,EAAWp9H,OAAO,CAAC,WAAY,OAAQ,UAAU0C,QAAQgD,IACvD,MAAMuR,EAAS,EAAWvR,EAAM,CAACqE,UAAU,IAC3C3N,KAAK4d,QAAQtU,GAAQuR,EACrBm0D,EAAWjlE,OAAO8Q,KAGpB7a,KAAK4d,QAAQolH,KAAK5iI,UAAUC,IAAI,WAGhCL,KAAKqhI,aAAaphI,UAAYC,SAASC,cAAc,OACrDH,KAAKqhI,aAAaphI,UAAUG,UAAUC,IAAI,kBAE1CL,KAAKqhI,aAAaQ,OAAS,EAAW,UAAW,CAACl0H,UAAU,IAC5D3N,KAAKqhI,aAAaQ,OAAO7gI,iBAAiB,QAAS,IAAMhB,KAAKsiI,YAAW,IACzEtiI,KAAKqhI,aAAaS,MAAQ,EAAW,SAAU,CAACn0H,UAAU,IAC1D3N,KAAKqhI,aAAaS,MAAM9gI,iBAAiB,QAAS,IAAMhB,KAAKsiI,YAAW,IAExEtiI,KAAKqhI,aAAaM,cAAgB,IAAI,GAAc,CAClDxlH,KAvJY,GAwJZ7Z,IAtJiB,GAuJjBR,IAtJiB,EAuJjB2Z,gBAAgB,GAzJK,GA2JvBzb,KAAKqhI,aAAaM,cAAchiH,eAChC3f,KAAKqhI,aAAaM,cAAc/hH,YAAY,CAC1C3D,QAASjc,KAAK0hI,aACd/mH,UAAW,IAAM3a,KAAK0hI,iBAGxB1hI,KAAKqhI,aAAaphI,UAAU8J,OAAO/J,KAAKqhI,aAAaQ,OAAQ7hI,KAAKqhI,aAAaM,cAAc1hI,UAAWD,KAAKqhI,aAAaS,OAE1H9hI,KAAKkiI,SAASn4H,OAAO/J,KAAKqhI,aAAaphI,WAGvCD,KAAK6N,QAAQsmB,KAAOj0B,SAASC,cAAc,OAC3CH,KAAK6N,QAAQsmB,KAAK/zB,UAAUC,IAAIqiI,wBAEhC1iI,KAAK6N,QAAQ5N,UAAYC,SAASC,cAAc,OAChDH,KAAK6N,QAAQ5N,UAAUG,UAAUC,IAAIqiI,0BAErC1iI,KAAK6N,QAAQiF,MAAQ5S,SAASC,cAAc,OAC5CH,KAAK6N,QAAQiF,MAAM1S,UAAUC,IAAIqiI,sBAEjC1iI,KAAK6N,QAAQ5N,UAAU8J,OAAO/J,KAAK6N,QAAQiF,OAE3C9S,KAAK6N,QAAQsmB,KAAKpqB,OAAO/J,KAAK6N,QAAQ5N,WACtC2iI,EAAQ74H,OAAO/J,KAAK6N,QAAQsmB,MAC5Bn0B,KAAK2iI,YAAY54H,OAAO64H,GAGxBC,EAAW94H,OAAO/J,KAAK4d,QAAQ,gBAAiB5d,KAAKihI,OAAOhhI,WAC5DqrF,EAAOvhF,OAAO84H,EAAY7zD,GAE1BhvE,KAAK4d,QAAQlE,KAAOxZ,SAASC,cAAc,OAC3CH,KAAK4d,QAAQlE,KAAKlQ,UAAY,mDAC9BxJ,KAAK4d,QAAQlE,KAAKzV,UAAY,4DAE9BjE,KAAK4d,QAAQ/Y,KAAO3E,SAASC,cAAc,OAC3CH,KAAK4d,QAAQ/Y,KAAK2E,UAAY,oDAC9BxJ,KAAK4d,QAAQ/Y,KAAKZ,UAAY,4DAE9BjE,KAAK4hI,gBAAkB1hI,SAASC,cAAc,OAC9CH,KAAK4hI,gBAAgBxhI,UAAUC,IAAIqiI,uBAEnC1iI,KAAKkiI,SAASn4H,OAAO/J,KAAK2iI,YAAa3iI,KAAK4d,QAAQlE,KAAM1Z,KAAK4d,QAAQ/Y,KAAM7E,KAAKsrF,OAAQtrF,KAAK4hI,iBAI/F5hI,KAAKijI,cAnIP,aACE,OAAOjjI,KAAKiV,WAAW7P,QAGzB,WAAWlD,GACTlC,KAAKiV,WAAW7P,QAAUlD,EAiIlB,eA6BR,GA5BAlC,KAAK4d,QAAQqN,SAASjqB,iBAAiB,QAAShB,KAAKkjI,iBACrD,CAACljI,KAAK4d,QAAQmb,MAAO/4B,KAAK4d,QAAQ,gBAAiB5d,KAAKkhI,oBAAoB/6G,WAAW7f,QAAQyJ,IAC7FA,EAAG/O,iBAAiB,QAAShB,KAAK+4B,MAAMxyB,KAAKvG,SAG9C,CAAC,EAAE,EAAGA,KAAK4d,QAAQlE,MAAO,CAAC,EAAG1Z,KAAK4d,QAAQ/Y,OAAmCyB,QAAQ,EAAE68H,EAAYtoH,MACnGA,EAAO7Z,iBAAiB,QAAUiB,IAChC,OAAAyb,EAAA,GAAYzb,GACTjC,KAAKojI,iBAERpjI,KAAKiV,WAAWG,GAAG+tH,OAIvBnjI,KAAK4d,QAAQolH,KAAKhiI,iBAAiB,QAAS,KACvChB,KAAKmiI,YAAaniI,KAAK+hI,YAAW,GAEnC/hI,KAAKsiI,YAAW,KAIpBtiI,KAAKkiI,SAASlhI,iBAAiB,QAAShB,KAAKmd,SAE7Cnd,KAAKiV,WAAWlP,OAAS,CAACN,EAAMO,KAC3BA,EAAOhG,KAAK60E,YAAYpvE,GACtBzF,KAAKu0E,YAAY9uE,IAGrB,sBAAoB,CACA,IAAI,GAAa,CACpCuP,QAAShV,KAAKkiI,SACd36F,QAAS,CAACL,EAAOC,KACf,GAAG,eACD,OAKF,GADiB9kC,KAAKyuB,IAAIoW,GAAStL,GAAA,EAAWl7B,MAChC,IAAMwmC,EAAQ,IAS1B,OANGA,EAAQ,EACTlnC,KAAK4d,QAAQlE,KAAKuhB,QAElBj7B,KAAK4d,QAAQ/Y,KAAKo2B,SAGb,EAIT,OADkB54B,KAAKyuB,IAAIqW,GAASvL,GAAA,EAAWj7B,OAChC,IAAMwmC,EAAQ,OAC3BnnC,KAAK4d,QAAQmb,MAAMkC,SACZ,IAKX8L,kBAAoBs8F,GAEyB,UAAvCA,EAAIxuH,OAAuB+1B,UAAuB,OAAAhsB,GAAA,GAAgBykH,EAAIxuH,OAAQ,2BAUhF,WAAW66B,GACnB,MAAMsvC,EAAYh/E,KAAKmiI,YAKvB,IAJGniI,KAAKqhI,aAAaM,cAAcpmH,WAAavb,KAAKqiI,eACnD3yF,GAAS,GAGRsvC,IAActvC,EAAQ,YAEXhrC,IAAXgrC,IACDA,GAAUsvC,GAGZh/E,KAAK4d,QAAQolH,KAAK5iI,UAAUkM,OAAO,WAAYojC,GAC/C1vC,KAAKqhI,aAAaphI,UAAUG,UAAUkM,OAAO,aAAcojC,GAC3D,MAAM4zF,EAAY5zF,EAAS1vC,KAAKqhI,aAAaM,cAAcz/H,MAAQ,EAQnE,GAPAlC,KAAK0hI,aAAa4B,GAClBtjI,KAAKqhI,aAAaM,cAAcvlH,YAAYknH,GAEzCtjI,KAAKujI,aACNvjI,KAAKujI,YAAYC,cAAa9zF,QAAiBhrC,GAG9CgrC,EAAQ,CACT,GAAI1vC,KAAKyjI,iBAuBPzjI,KAAKyjI,iBAAiB9jH,mBAvBG,CACzB,IAAIwpB,EAAmBu6F,EACvB,MAAMhsF,GAAc,EACpB13C,KAAKyjI,iBAAmB,IAAI,GAAa,CACvCzuH,QAAShV,KAAK4hI,gBACdv6F,aAAc,KACZ8B,EAAYu6F,EAAY,EACxB1jI,KAAK4hI,gBAAgBxhI,UAAUC,IAAI,kBAErCknC,QAAS,CAACL,EAAOC,MACdD,EAAOC,GAAS,CAACD,EAAQwQ,EAAYvQ,EAAQuQ,GAC9C13C,KAAKwhI,YAAct6F,EAAQiC,EAC3BnpC,KAAKyhI,YAAct6F,EAAQu8F,GAC1Bv6F,EAAWu6F,GAAa,CAACx8F,EAAOC,GAEjCnnC,KAAK0hI,gBAEP96F,QAAS,KACP5mC,KAAK4hI,gBAAgBxhI,UAAUuB,OAAO,kBAExC0kC,OAAQ,SAMZrmC,KAAKqhI,aAAaM,cAAcvlH,YAAYknH,QACnC5zF,GACT1vC,KAAKyjI,iBAAiBlkH,kBAIhB,WAAWlf,GACnBL,KAAKqhI,aAAaM,cAAcgC,YA3UlB,IA2U2CtjI,EAAM,GAAK,IACpEL,KAAK0hI,eAkBG,YACR,OAAO1hI,KAAKqhI,aAAaphI,UAAUG,UAAUuR,SAAS,cAG9C,iBAAiBiM,GACzB,MAAMgmH,EAAgB,GAAiB,CAACd,YAAY,GAAO,cAAellH,GAC1E5d,KAAKsrF,OAAOvhF,OAAO65H,GAGd,MAAM3hI,G,MAKX,GAJGA,GACD,OAAAyb,EAAA,GAAYzb,GAGXjC,KAAKgiI,yBAA0B,OAAOn/H,QAAQkoB,SAEjDhc,EAAA,EAAwB6B,aAAa,SAErC5Q,KAAKgqB,cAAc7f,QAEnB,MAAMhE,EAAUnG,KAAK6jI,iBAA4B,QAAX,EAAA7jI,KAAK6U,cAAM,eAAEG,SAAS,GAAMnU,KAAK,EAAEs9B,oBAAoBA,GA6B7F,OA3BAn+B,KAAKiV,WAAW7L,QACfpJ,KAAKiV,WAAmBvG,SAAY1O,KAAKiV,WAAmBvG,UAC7D1O,KAAKojI,gBAAkB,KACvBpjI,KAAK67B,QAAU,EACdtwB,OAAeu4H,oBAAiBp/H,EAE9B1E,KAAKyjI,mBACNzjI,KAAKyjI,iBAAiBlkH,kBACtBvf,KAAKyjI,sBAAmB/+H,GAS1B6G,OAAOlC,oBAAoB,UAAWrJ,KAAKoiG,WAC3C72F,OAAOlC,oBAAoB,QAASrJ,KAAKuiI,SACzCh3H,OAAOlC,oBAAoB,QAASrJ,KAAKwiI,QAAS,CAACr3G,SAAS,IAE5DhlB,EAAQkb,QAAQ,KACdrhB,KAAKkiI,SAASvgI,SACdiH,EAAA,QAAUwzH,iBAAkB,EAC5B/8E,EAAA,EAAqB+kC,iBAAgB,KAGhCj+E,EAsGO,iBAAiB0O,EAAqBkvH,GAAU,EAAOC,EAAY,G,0CACjFhkI,KAAKyO,cAAc,kBAEnB,MAAM2zH,EAAQpiI,KAAK6N,QAAQu0H,MAEvB2B,IACF3B,EAAMn+H,UAAY,IAIpB,MAAMq/H,EAAYtjI,KAAKmiI,aAAe4B,EAAyB/jI,KAAKqhI,aAAaM,cAAcz/H,MA9fxE,EA+felC,KAAKikI,sBAAsB7B,GAEjE,MAAM8B,EAA0B,IAAdF,EAEZrqC,EAAQ/wF,EAAA,QAAUw1B,SAASC,kBAAqB6lG,EAAY,IAAM,IAAO,EAY/E,IAAIC,EAEAtoH,EACDhH,IACEA,aAAkB,IAAiBA,EAAOzU,UAAUuR,SAAS,cAC9DwyH,EAAatvH,EACbgH,EAAOhH,EAAOiH,yBACNjH,aAAkBuvH,iBAAmBvvH,EAAO/D,yBAAyBuzH,yBAC7EF,EAAa,OAAAvlH,GAAA,GAAgB/J,EAAQ,cACrCgH,EAAOsoH,EAAWroH,yBACVjH,EAAOzU,UAAUuR,SAAS,4BAClCwyH,EAAa,OAAAvlH,GAAA,GAAgB/J,EAAQ,6BACrCgH,EAAOsoH,EAAWroH,wBAGfioH,GAAWlvH,EAAOiH,wBAAwBiB,OAASlB,EAAKkB,OACzDlI,EAASsvH,EAAatoH,OAAOnX,KAK/BmQ,IACFA,EAAS7U,KAAK6N,QAAQiF,OAGpB+I,IACFsoH,EAAatvH,EAAO/D,cACpB+K,EAAOhH,EAAOiH,yBAGhB,IAAIwoH,GAAc,EAClB,GAAGzvH,IAAW7U,KAAK6N,QAAQiF,QAAU+B,EAAOzU,UAAUuR,SAAS,0BAA2B,CACxF,MACM4yH,ECzlBG,SAAwBvvH,EAAsBwvH,GAC3D,MAAM3oH,EAAO7G,EAAQ8G,wBACf2oH,EAAeD,EAAgB1oH,wBAErC,IAAK0X,IAAKkxG,EAAa5nH,OAAQ6nH,GAAkBF,EAGjD,MAAMG,EAASJ,EAAgB30H,cAAc,WAC7C,GAAG+0H,EAAQ,CAETF,EADmBE,EAAO9oH,wBACDgB,OAG3B,GAAGjB,EAAK2X,KAAOmxG,GACV9oH,EAAKiB,QAAU4nH,GACf7oH,EAAKktB,OAAS07F,EAAa1nH,MAC3BlB,EAAKkB,MAAQ0nH,EAAa17F,MAC7B,OAAO,KAGT,MAAM87F,EAAW,CACfrxG,KAAK,EACLuV,OAAO,EACPjsB,QAAQ,EACRC,MAAM,EACNpB,SAAU,EACVmpH,WAAY,GAIRjtH,EAAS,mBAAoBtM,OAASA,OAAOw5H,eAAiBx5H,OAE9Dy5H,GADcntH,EAAEnX,OAASmX,EAAEotH,WACZptH,EAAElX,QAAUkX,EAAEqtH,aAEnC,MAAO,CACLrpH,KAAM,CACJ2X,IAAK3X,EAAK2X,IAAMkxG,GAA+B,IAAhBA,GAAqBG,EAASrxG,KAAM,IAAQqxG,EAASlpH,SAAU+oH,GAAe7oH,EAAK2X,IAClHuV,MAAO,EACPjsB,OAAQjB,EAAKiB,OAAS6nH,GAAkBA,IAAmBK,GAAgBH,EAAS/nH,QAAS,IAAQ+nH,EAASlpH,SAAUgpH,GAAkB9oH,EAAKiB,OAC/IC,KAAM,GAER8nH,YDgjBsBM,CAAehB,EADX,OAAAvlH,GAAA,GAAgBulH,EAAY,gBAGjDJ,GAAaQ,GAAiD,IAAlCA,EAAYM,SAASlpH,UAAsD,IAApC4oH,EAAYM,SAASC,YAIjFP,GAAkD,IAAlCA,EAAYM,SAASlpH,UAAsD,IAApC4oH,EAAYM,SAASC,aACpFR,GAAc,IAHdH,GADAtvH,EAAS7U,KAAK6N,QAAQiF,OACFhC,cACpB+K,EAAOhH,EAAOiH,yBAMlB,MAAMosG,EAAgBloH,KAAK6N,QAAQiF,MAAMgJ,wBAEzC,IACIiB,EACAyW,EA6BAsrB,EA/BAniC,EAAY,GAgChB,GA5BGunH,GACDnnH,EAAqB,IAAdinH,EAAkBpoG,GAAA,EAAWl7B,OAASwnH,EAAcxnH,MAC3D8yB,EAAM00F,EAAc10F,MAEpBzW,EAAOlB,EAAKkB,KACZyW,EAAM3X,EAAK2X,KAWb7W,GAAa,eAAeI,OAAUyW,UAYnC3e,aAAkBuwH,kBAAoBvwH,aAAkBwwH,kBAAuC,QAAnBxwH,EAAO+1B,QAAmB,CACvG,GAAGw3F,EAAM1hH,mBAAqB0hH,EAAM1hH,kBAAkBtgB,UAAUuR,SAAS,yBAA0B,CACjGmtC,EAAWsjF,EAAM1hH,kBAEjB,MAAM+B,EAASq8B,EAASjvC,cAAc,iBACtC,GAAG4S,EAAQ,CACT,MAAM9B,EAAQ8B,EAAO/B,kBACrBo+B,EAAS/0C,OAAO4W,GAChB8B,EAAO9gB,SAGLm9C,EAASn8C,MAAMuT,UACjBksH,EAAMhiI,UAAUuB,OAAO,UACvB3B,KAAKslI,cAAcxmF,EAAUopE,EAAersG,GACvCumH,EAAMn5F,WACXm5F,EAAMhiI,UAAUC,IAAI,gBAGtBy+C,EAAW5+C,SAASC,cAAc,OAClC2+C,EAAS1+C,UAAUC,IAAI,yBACvB+hI,EAAM3iH,QAAQq/B,GAGhBA,EAASn8C,MAAMuT,QAAU,UAAU2F,EAAKnb,oBAAoBmb,EAAKlb,gCAAgCunH,EAAcxnH,MAAQmb,EAAKnb,UAAUwnH,EAAcvnH,OAASkb,EAAKlb,cAGpKyhI,EAAMz/H,MAAMjC,MAAQwnH,EAAcxnH,MAAQ,KAC1C0hI,EAAMz/H,MAAMhC,OAASunH,EAAcvnH,OAAS,KAI5C,MAAM4kI,EAAS1pH,EAAKnb,MAAQwnH,EAAcxnH,MACpC8kI,EAAS3pH,EAAKlb,OAASunH,EAAcvnH,OACvCujI,IACFvnH,GAAa,WAAW4oH,KAAUC,SAGpC,IAAI/4E,EAAelhD,OAAOkjH,iBAAiB0V,GAAYzV,iBAAiB,iBACxE,MAAM+W,EE5qBK,SAA2Bx+D,GACxC,IAAIjP,EAAWiP,EAAIjnB,MAAM,KACzB,GAAuB,IAApBgY,EAAS71D,OAAc,CACpB61D,EAAS,KAAIA,EAAS,GAAK,OAC/B,IAAI,IAAIhtD,EAAIgtD,EAAS71D,OAAQ6I,EAAI,IAAKA,EACpCgtD,EAAShtD,GAAKgtD,EAAShtD,EAAI,IAAMgtD,EAAS,IAAM,MAIpD,OAAOA,EFmqBc0tE,CAAkBj5E,GAOrC,GANAA,EAAeg5E,EAAWh9H,IAAIwW,GAAM0/C,SAAS1/C,GAAKsmH,EAAU,MAAMv+G,KAAK,KACnEk9G,IACF9B,EAAMz/H,MAAM8pD,aAAeA,GAI1Bs3E,GAAyB,IAAdT,EAAiB,CAG7B,MAAMqC,EAAa/pG,GAAA,EAAWl7B,MAAQ,EAAImb,EAAKnb,MAAQ,EACjDklI,EAAYhqG,GAAA,EAAWj7B,OAAS,EAAIkb,EAAKlb,OAAS,EAClDoc,EAAOlB,EAAKkB,KAAO4oH,EACnBnyG,EAAM3X,EAAK2X,IAAMoyG,EACvB5lI,KAAK4hI,gBAAgBj/H,MAAMga,UAAY,UAAU4oH,YAAiBC,MAAWzoH,MAASyW,UAEtF4uG,EAAMz/H,MAAMga,UAAYA,EAS1B,IAAI8+F,EANJ6oB,IAAgBlC,EAAMz/H,MAAMkpD,QAAU,KAOtC,MAAM5O,EAAQpoC,EAAOzU,UAAUuR,SAAS,UAElCiG,EAAW5X,KAAKgiI,yBAA2B,eAC3Cr8F,EAAM,CAACxH,eAAgBvmB,GAEvB9K,EAAUtB,WAAW,KACrBoM,EAASwnC,aAAgBxnC,EAASiuH,YACpCjuH,EAAS3R,WAEV,KAYH,GAVA2R,EAASyJ,QAAQ,KACfrhB,KAAKyO,cAAc,iBAEhBzO,KAAKgiI,2BAA6BpqH,IACnC5X,KAAKgiI,yBAA2B,MAGlCh1H,aAAaF,KAGXi3H,EA+JF,OArCGlvH,aAAkBixH,gBACnBrqB,EAAO2mB,EAAMvyH,cAAc,QAExB4rG,GACDz7G,KAAK+lI,aAAatqB,EAAMyM,EAAeqd,EAAQ5rC,GAAO,EAAO18C,EAAOwP,IAIrE53C,EAAOzU,UAAUuR,SAAS,uBAC3BywH,EAAMhiI,UAAUC,IAAI,UAGtBL,KAAKkiI,SAAS9hI,UAAUC,IAAI,aAC5BmL,WAAW,KACTxL,KAAKkiI,SAAS9hI,UAAUuB,OAAO,WAC9B,GAIH6J,WAAW,KACT42H,EAAMz/H,MAAM8pD,aAAeA,EAExB21E,EAAM1hH,oBACN0hH,EAAM1hH,kBAAkC/d,MAAM8pD,aAAeA,IAE/DktC,EAAQ,GAEXnuF,WAAW,KACT42H,EAAMn+H,UAAY,GAClBm+H,EAAMhiI,UAAUuB,OAAO,SAAU,SAAU,UAC3CygI,EAAMz/H,MAAMuT,QAAU,iBAEtB0B,EAAS3R,WACR0zF,GAEHyoC,EAAMhiI,UAAUuB,OAAO,WAEhBgkC,EA/JI,CACX,IAAIqgG,EACAvxH,EAEJ,GAAGI,aAAkBwwH,iBAAkB,CACrC,MAAMp+G,EAAW9e,MAAMC,KAAKyM,EAAO/D,cAAchB,iBAAiB,QAC/DmX,EAAS9kB,SACV0S,EAASoS,EAASvhB,OAItB,GAAsB,QAAnBmP,EAAO+1B,SAAwC,mBAAnB/1B,EAAO+1B,QAA8B,CAClE,MACMqW,EADS94C,MAAMC,KAAKyM,EAAO/E,iBAAiB,QAC7BpK,MAClBu7C,IACD+kF,EAAe,IAAIn+F,MACnBpzB,EAAMwsC,EAAMxsC,IACZ2tH,EAAMr4H,OAAOi8H,SAKV,GAAGnxH,aAAkBuwH,iBAC1BY,EAAe,IAAIn+F,MACnBpzB,EAAMI,EAAOJ,SACR,GAAGI,aAAkBwwH,iBAC1BW,EAAe9lI,SAASC,cAAc,SACtC6lI,EAAavxH,IAAMI,EAAOJ,SACrB,GAAGI,aAAkBixH,cAAe,CACzC,MAAMG,EAASpxH,EAAOzI,QAAQ65H,OACxBC,EAAYD,EAAS,OAErB,MAACvlI,EAAK,OAAEC,GAAUunH,EAElBie,EAASjmI,SAAS2jB,gBAAgB,6BAA8B,OACtEsiH,EAAOriH,eAAe,KAAM,QAAS,GAAKpjB,GAC1CylI,EAAOriH,eAAe,KAAM,SAAU,GAAKnjB,GAG3CwlI,EAAOriH,eAAe,KAAM,UAAW,OAAOpjB,KAASC,KACvDwlI,EAAOriH,eAAe,KAAM,sBAAuB,iBAEnDqiH,EAAO1kH,mBAAmB,YAAa5M,EAAO6L,kBAAkB0lH,UAAU5iI,QAAQyiI,EAAQC,IAC1FC,EAAO1kH,mBAAmB,YAAa5M,EAAOu8B,iBAAiBg1F,UAAU5iI,QAAQyiI,EAAQC,IAGzF,MAAMzpB,EAAO0pB,EAAOzlH,kBACdslB,EAAMy2E,EAAK/7F,kBAAkBA,kBACnC,GAAGslB,aAAeqgG,cAAe,CAC/B,IAmBI9lH,EAnBA5D,EAAYqpB,EAAI0Y,eAAe,KAAM,aACzC/hC,EAAYA,EAAUnZ,QAAQ,kDAAmD,CAACoP,EAAO2H,EAAGE,EAAG6rH,EAAIC,IAU1F,aAPLhsH,EADO,KADTA,GAAKA,GAEC7Z,EAAS,EAAI6kI,EAEb,EAAIA,MAGN5kI,aAEmC2lI,EAAKf,OAAYgB,EAAKf,MAE/Dx/F,EAAIliB,eAAe,KAAM,YAAanH,GAGtC8+F,EAAOgB,EAAK/7F,kBAAkB0wB,iBAI9B,MAAM+b,EAAuCV,EAAazM,MAAM,KAAKv3C,IAAI82B,GAAKo/B,SAASp/B,IAC7Ehf,EAAP08B,EAAW0rE,GAAiB,EAAG,EAAGjoH,EAAQ,EAAI6kI,EAAQ5kI,KAAWwsD,GAC3Dw7D,GAAiB,EAAI4c,EAAQ,EAAG7kI,EAAQ,EAAI6kI,EAAQ5kI,KAAWwsD,GACxEsuD,EAAK33F,eAAe,KAAM,IAAKvD,GAGjC,MAAMk+B,EAAgB0nF,EAAO/0F,iBAC7BqN,EAAc36B,eAAe,KAAM,QAAS,GAAKokG,EAAcxnH,OAC/D+9C,EAAc36B,eAAe,KAAM,SAAU,GAAKokG,EAAcvnH,QAEhEyhI,EAAM3iH,QAAQ0mH,GAGbrnF,IACDA,EAASn8C,MAAM8pD,aAAeA,EAE3Bu5E,GACDlnF,EAAS/0C,OAAOi8H,IAIpBA,EAAe5D,EAAMvyH,cAAc,cAChCm2H,aAAwBZ,mBACzBY,EAAa5lI,UAAUC,IAAI,aACvBy+C,IACFknF,EAAarjI,MAAMjC,MAAQwnH,EAAcxnH,MAAQ,KACjDslI,EAAarjI,MAAMhC,OAASunH,EAAcvnH,OAAS,MAGlD8T,UACK,OAAAkrC,GAAA,GAA0BqmF,EAAcvxH,KAYlD2tH,EAAMz/H,MAAMC,QAAU,GAEtB,aAAQ,KACNw/H,EAAMhiI,UAAUC,IAAI6jI,EAAY,SAAW,YA4G/C,OA5DA9B,EAAMhiI,UAAUC,IAAI,iBAKd,eAON+hI,EAAMz/H,MAAMga,UAAY,eAAeurG,EAAcnrG,UAAUmrG,EAAc10F,0BAE7E8wG,IAAgBlC,EAAMz/H,MAAMkpD,QAAU,IAEnC/M,GACD9+C,KAAKslI,cAAcxmF,EAAUopE,EAAersG,GAK9CrQ,WAAW,KACT42H,EAAMz/H,MAAM8pD,aAAe,GAExB21E,EAAM1hH,oBACN0hH,EAAM1hH,kBAAkC/d,MAAM8pD,aAAe,KAE/D,GAEH21E,EAAMh2H,QAAQU,QAAU,GAAKtB,WAAW,KACtC42H,EAAMhiI,UAAUuB,OAAO,SAAU,WAE9Bm9C,IACEsjF,EAAMvyH,cAAc,SACrBuyH,EAAMhiI,UAAUuB,OAAO,UACvBm9C,EAASn8C,MAAMuT,QAAU,GACpBksH,EAAMn5F,YAOfm5F,EAAMhiI,UAAUC,IAAI,SAAU,iBAM9B+hI,EAAMhiI,UAAUC,IAAI,iBACb+hI,EAAMh2H,QAAQU,QAErB8K,EAAS3R,WACR0zF,GAEA8hB,GACDz7G,KAAK+lI,aAAatqB,EAAMyM,EAAeqd,EAAQ5rC,GAAO,EAAM18C,EAAOwP,GAG9D9mB,KAGC,cAAcmZ,EAA0BopE,EAAwBrsG,GAQxE,MAAMyzB,EAAa44E,EAAcxnH,MAAQwnH,EAAcvnH,OAEvD,IAAI,MAACD,EAAK,OAAEC,GAAUkb,EAIjByzB,EAAa,EACd5uC,EAAQC,EAAS2uC,EAEjB3uC,EAASD,EAAQ4uC,EAKnBwP,EAASn8C,MAAMuT,QAAU,UAAUxV,gBAAoBC,2BAAgCunH,EAAcxnH,MAAQA,MAAUwnH,EAAcvnH,OAASA,SAIxI,aAAa86G,EAAsB5/F,EAAe0pH,EAAgB5rC,EAAe6sC,EAAkBvpF,EAAgBwP,GAC3H,MAAMrsC,EAAQq0B,KAAKC,OACb,MAACh0C,EAAK,OAAEC,GAAUkb,EACxB89E,GAAgB,EAEhB,MAAMxsC,EAAKV,EAAazM,MAAM,KAAKv3C,IAAI82B,GAAKo/B,SAASp/B,IAE/CpjB,EAAO,KACX,MAAM0U,EAAO4jB,KAAKC,MAAQt0B,EAE1B,IAAIgB,EAAWu4E,EAAQ9oE,EAAO8oE,EAAQ,EACnCv4E,EAAW,IAAGA,EAAW,GACzBolH,IAASplH,EAAW,EAAIA,GAE3B,MAAMqlH,EAAwCt5E,EAAG1kD,IAAI82B,GAAKA,EAAIne,GAE9D,IAAIb,EACMA,EAAP08B,EAAW0rE,GAAiB,EAAG,EAAGjoH,EAAS,EAAI6kI,EAASnkH,EAAWzgB,KAAW8lI,GACxE9d,GAAiB,EAAI4c,EAASnkH,EAAU,EAAG1gB,EAA4CC,KAAW8lI,GAC3GhrB,EAAK33F,eAAe,KAAM,IAAKvD,GAE5BsQ,EAAO8oE,GAAO,aAAQx9E,IAI3BA,IAGQ,sBAAsBimH,GAC9B,GAAGA,EAAMhiI,UAAUuR,SAAS,UAAW,CAErC,MAAMkK,EAAO7b,KAAK6N,QAAQiF,MAAMgJ,wBAChCsmH,EAAMz/H,MAAMga,UAAY,eAAed,EAAKkB,UAAUlB,EAAK2X,WAC3D4uG,EAAMhiI,UAAUuB,OAAO,UAClBygI,EAAMn5F,WACXm5F,EAAMhiI,UAAUuB,OAAO,kBAIjB,aAAaygI,EAAoBsE,GAAS,GAClD,MAAMC,EAAU/qG,GAAA,EAAWl7B,MAE3BV,KAAKikI,sBAAsB7B,GAG3BA,EAAMhiI,UAAUC,IAAI,UAEjB+hI,EAAMh2H,QAAQU,SACfE,cAAco1H,EAAMh2H,QAAQU,SAG9B,MAAM+O,EAAOumH,EAAMtmH,wBAEb8qH,EAAexE,EAAMz/H,MAAMga,UAAUnZ,QAAQ,sBAAuB,CAACoP,EAAOi0H,KAChF,MAAMtsH,EAAImsH,GAAU7qH,EAAKnb,MAAQimI,EAGjC,OAAO/zH,EAAMpP,QAAQqjI,EAAItsH,EAAI,QAI/B6nH,EAAMz/H,MAAMga,UAAYiqH,EAExBp7H,WAAW,KACT42H,EAAMzgI,UACL,KAGK,cACR,MAAMmlI,EAAW5mI,SAASC,cAAc,OAIxC,GAHA2mI,EAAS1mI,UAAUC,IAAI,sBACvBymI,EAASnkI,MAAMC,QAAU,OAEtB5C,KAAK6N,QAAQu0H,MAAO,CACJpiI,KAAK6N,QAAQu0H,MACrBtxH,cAAc/G,OAAO+8H,QAE9B9mI,KAAK4hI,gBAAgB73H,OAAO+8H,GAG9B,OAAO9mI,KAAK6N,QAAQu0H,MAAQ0E,EAGpB,kBAAkBjyH,EAAqBH,EAAak2B,GAE1D,MAAM76B,EAAK8E,EAAO+1B,QAAQ8Q,gBAAkB9Q,EAAU/1B,EAASA,EAAOhF,cAAc+6B,GACpF,GAAG76B,IAAO,OAAA6O,GAAA,GAAgB/J,EAAQ,YAAa,CAC7C,GAAG,OAAA+J,GAAA,GAAgB/J,EAAQ,cAAe,CAExC,MAAMsR,EAAYtR,EAAO/D,cAAcA,cAAcjB,cAAc,wBACnE,GAAGsW,EAAW,CACZ,GAAe,UAAZykB,EAMD,YALGzkB,EAAU/lB,UAAUuR,SAAS,WAC9BwU,EAAU8U,SAOd9U,EAAUxkB,UAId,OAAAg+C,GAAA,GAAmB5vC,EAAI2E,GAGpB3E,EAAG3P,UAAUuR,SAAS,cAAgB5B,EAAGe,cAAc1Q,UAAUuR,SAAS,6BAC3E5B,EAAG3P,UAAUuB,OAAO,cAQlB,cAAciK,EAAyB0oD,GAC/C,OAAA/nD,EAAA,GAAevM,KAAKihI,OAAO94G,KAAM,aAAmBmsC,IAEpD,MAAM95B,EAAW5uB,EAAO4uB,WACxB,IAAI5sB,EACD4sB,EACD5sB,EAAQ,IAAI,KAAU,CACpB3G,OAAQ2E,EACRC,QAAQ,EACRunD,eAAe,EACflwD,WAAW,IACV8R,SAEHpH,EAAQ1N,SAASC,cAAc,QAC/ByN,EAAM3J,UAAY,IAAkB6nB,cAAclgB,GAClDgC,EAAMxN,UAAUC,IAAI,eAGtB,OAAAkM,EAAA,GAAevM,KAAKihI,OAAOn3H,OAAQ8D,GAEnC,IAAIm5H,EAAY/mI,KAAKihI,OAAOxqG,SAC5Bz2B,KAAKihI,OAAOxqG,SAAYswG,EAAUr6F,YAE9BlS,EAGFx6B,KAAKihI,OAAOxqG,SAAS+M,gBAAgB,cAFrCxjC,KAAKihI,OAAOxqG,SAASrzB,aAAa,aAAc,GAAKwI,GAKvD5L,KAAKihI,OAAOxqG,SAASrzB,aAAa,OAAQ,IAAMwI,GAAU,OAE1Dm7H,EAAUj2H,cAAck2H,aAAahnI,KAAKihI,OAAOxqG,SAAUswG,GAG7C,WACdj0H,EACAwhD,EACA1oD,EACAo4H,EACAnvH,EACA/P,GAAU,EACV6jC,EAA4B,GAC5BC,EAA4B,GAC5BxkC,G,0CAGA,GAAGpE,KAAKojI,gBAAiB,OAAOpjI,KAAKojI,gBAMrCpjI,KAAKinI,cAAcr7H,EAAQ0oD,GAE3B,MAAM4yE,EAAyB,aAAZp0H,EAAM1L,EACnB+/H,EAAUD,GAAcp0H,EAAM+qC,YAAe,CAAC,QAAS,OAAgC9jB,SAASjnB,EAAM3P,OAA+C,IAAtC2P,EAAM+qC,UAAUthC,QAAQ,WAE1Ivc,KAAKmhI,cAGNnhI,KAAKmhI,aAAc,EACnBnhI,KAAKiV,WAAWI,WAAWszB,EAAaC,EAAa9jC,GACpDyG,OAAeu4H,eAAiB9jI,MAgBnCA,KAAK4d,QAAQlE,KAAKtZ,UAAUkM,OAAO,QAAStM,KAAKiV,WAAWrQ,SAASzC,QACrEnC,KAAK4d,QAAQ/Y,KAAKzE,UAAUkM,OAAO,QAAStM,KAAKiV,WAAWpQ,KAAK1C,QAEjE,MAAMlC,EAAYD,KAAK6N,QAAQiF,MACzBs0H,GAAwBvyH,GAAUA,IAAW5U,EAChDmnI,IAAsBvyH,EAAS5U,GAElCD,KAAK6U,OAAS,CAACG,QAASH,GACxB,MAAMgnB,IAAW77B,KAAK67B,OAEnB57B,EAAUygB,oBACXzgB,EAAUgE,UAAY,IAMxB,GADgC,IAAd+/H,EAEhBhkI,KAAKqnI,aAAarnI,KAAK6N,QAAQu0H,MAAqB,IAAd4B,GACtChkI,KAAKijI,kBACA,CACL13H,OAAOvK,iBAAiB,UAAWhB,KAAKoiG,WACxC72F,OAAOvK,iBAAiB,QAAShB,KAAKuiI,SAClC,uBAAoBh3H,OAAOvK,iBAAiB,QAAShB,KAAKwiI,QAAS,CAAClnH,SAAS,EAAO6P,SAAS,IACjG,MAAMm8G,EAAcpnI,SAAS4uC,eAAe,gBAC5C9uC,KAAKohI,OAAOrgH,aAAa/gB,KAAKkiI,SAAUoF,GACnCtnI,KAAKkiI,SAASj5F,WACnBjpC,KAAKkiI,SAAS9hI,UAAUC,IAAI,UAC5BuI,EAAA,QAAUwzH,iBAAkB,EAC5B/8E,EAAA,EAAqB+kC,iBAAgB,GAEjC,qBACFr1E,EAAA,EAAwBoB,SAAS,CAC/BhN,KAAM,QACNiN,MAAQC,IACN,GAAGrQ,KAAKgiI,yBACN,OAAO,EAGThiI,KAAK+4B,WAQb,MAAMqpG,EAAQpiI,KAAK6N,QAAQu0H,MAErBp1G,EAAW4O,GAAA,EAAWl7B,MAG5B,IAAI6mI,EAAU,EACd,MAAMC,EAAU5rG,GAAA,EAAWj7B,OACxB6mI,EAAU,MAAYjkH,EAAA,EAAWC,WAClC+jH,EAAU,KAEZ,MAAMp6G,EAAYq6G,EAAU,IAAMD,EAClC,IAAIE,EAA6B5kI,QAAQoD,UACzC,MAAMnG,EAAO,IAAiBghD,kBAAkBhuC,EAAO7S,EAAW+sB,EAAUG,GAAW5J,EAAA,EAAWC,cAAyB9e,KAAcwiI,GAAcp0H,EAAM+E,GAAK/E,EAAMyF,IAAI8oC,UAC5K,GAAG+lF,EAAsB,CACvB,MAAM9yH,EAAeC,GAAA,EAAmBC,gBAAgB1B,EAAOhT,EAAKqD,MACpE,IAAIinB,EACJ,GAAG9V,EAAa0qC,WACd50B,EAAM,IAAIyd,MACVzd,EAAI3V,IAAMH,EAAaI,QAClB,CACL,MAAMiqC,EAAW,IAAiB2C,yBAAyBxuC,EAAOwB,GAAc,GAC7EqqC,IACD8oF,EAAe9oF,EAASr+C,YACxB8pB,EAAMu0B,EAASsC,OAIhB72B,IACDA,EAAIhqB,UAAUC,IAAI,aAClBJ,EAAU8J,OAAOqgB,IASrB,MAAMhW,KAAgC8yH,IAAcp0H,EAAMsB,mBACpD+R,EAAY/R,EAAoBpU,KAAKkhI,oBAAsBlhI,KAAKmmB,UAEtE,IAAIi9G,EACJ,GAAG+D,EAAS,CAKV,MAAMO,EAAgBtjI,GAA0B,QAAf0O,EAAM3P,KACjCwd,EAEDzgB,SAASC,cAAc,SAEtBwU,EAAM,IAAM3U,KAAK6jI,iBAAiBhvH,GAAQ,EAAOmvH,GAAWnjI,KAAK,EAAEs9B,qBAKvE,MAAM3R,EAAM41G,EAAM1hH,mBAAqB0hH,EAAM1hH,kBAAkBtgB,UAAUuR,SAAS,yBAA2BywH,EAAM1hH,kBAAoB0hH,EAGjIuF,EAAavF,EAAMvyH,cAAc,SACpC83H,GACDA,EAAWhmI,SAKbgf,EAAMvd,aAAa,cAAe,QAGlCud,EAAM3f,iBAAiB,aAAc,KAChChB,KAAK67B,SAAWA,GACjBlb,EAAMvf,UAIVuf,EAAM3f,iBAAiB,QAAS,KACN,IAArB2f,EAAMhU,MAAMuV,MACbliB,KAAKsuD,IAAI3hD,MAAM,SAAWgU,EAAMhU,MAAMuV,KAAO,cAAgBvB,EAAMhU,MAAMvI,SAGxE+hB,GACDA,EAAUg5B,UAEX,CAACxnC,MAAM,IAEV3X,KAAKgB,iBAAiB,gBAAiB,KACrC2f,EAAMlM,IAAM,GACZkM,EAAM7a,QACL,CAAC6R,MAAM,IAEP,eAGDgJ,EAAMlgB,UAAW,GAGD,QAAfqS,EAAM3P,OACPwd,EAAMxJ,OAAQ,EACdwJ,EAAMlgB,UAAW,EACjBkgB,EAAMngB,MAAO,GAIbgsB,EAAIziB,OAAO4W,GAGb,MAAMinH,EAAiB,IAAI/kI,QAASoD,IAClC0a,EAAM3f,iBAAiB,UAAWiF,EAAS,CAAC0R,MAAM,MAG9CkwH,EAAe,KACD,QAAf/0H,EAAM3P,OACPwd,EAAMvU,QAAQ07H,KAAO,UACrBnnH,EAAMvU,QAAQ27H,QAAU,IAExBllI,QAAQC,IAAI,CAAC8kI,EAAgBzpG,IAAiBt9B,KAAK,KACjD,GAAGb,KAAK67B,SAAWA,EACjB,QAKa77B,KAAKujI,YAAc,IAAI,GAAY5iH,GADrC,EACkDvM,IACxDpT,iBAAiB,iBAAmByd,IACzCze,KAAKkiI,SAAS9hI,UAAUkM,OAAO,qBAAsBmS,KAGvDze,KAAKgB,iBAAiB,iBAAkB,KACtChB,KAAKkiI,SAAS9hI,UAAUuB,OAAO,sBAC/B3B,KAAKujI,YAAYhkH,kBACjBvf,KAAKujI,iBAAc7+H,GAClB,CAACiT,MAAM,IAEP3X,KAAKmiI,aACNniI,KAAKujI,YAAYC,cAAa,OAQtC,GAAGpvH,EAAmB,CACpB+pB,EAAet9B,KAAK,KACf8f,EAAMwI,WAAaxI,EAAMqnH,kBAC1B7hH,EAAUkE,OAAO+3G,GAAO,KAQ5B,MAAM6F,EAAgB,KACpBtnH,EAAM3f,iBAAiB,UAAW,KAEhCmlB,EAAUg5B,SACVx+B,EAAM7P,cAAc1Q,UAAUuB,OAAO,iBACpC,CAACgW,MAAM,KAGZgJ,EAAM3f,iBAAiB,UAAW,KAChC,MAAMi4B,EAAUtY,EAAMunH,eAAiBvnH,EAAMwnH,gBACvCC,EAAiBznH,EAAMwI,WAAaxI,EAAMqnH,iBAG7C/uG,GAAWmvG,IACZH,IAEA9hH,EAAUkE,OAAO+3G,GAAO,GAGxBzhH,EAAM7P,cAAc1Q,UAAUC,IAAI,mBAItC4nI,IAmDAjoI,KAAKgqB,cAAcnkB,QAAQ,CAACC,KA/Cf,KAKX,MAAMwO,EAAeC,GAAA,EAAmBC,gBAAgB1B,GAClD3M,EAAwBiO,EAAoBvR,QAAQoD,UAAY,IAAe8R,YAAYjF,GAsCjG,OApCIsB,GACF+pB,EAAet9B,KAAK,KACdyT,EAAaI,KACfyR,EAAUkE,OAAO+3G,GAAO,EAAMj8H,KAKpCtD,QAAQC,IAAI,CAACqD,EAASg4B,IAAiBt9B,KAAK,KAC1C,GAAGb,KAAK67B,SAAWA,EAEjB,YADA77B,KAAKsuD,IAAI13C,KAAK,8BAIhB,GAAG8wH,EAAe,CAChB,MAAMW,EAAW,GAA2B35B,eAAe/tF,EAAOvc,GAElEpE,KAAKgB,iBAAiB,iBAAkB,KACtCqnI,KACC,CAAC1wH,MAAM,IAGZ,MAAMjD,EAAMJ,EAAaI,IACtBG,aAAkBixH,cAEjBt5G,EAAI9L,kBAAkB0wB,iBAAiBrnC,OAAO4W,GAGhD,OAAAg/B,GAAA,GAAmBh/B,EAAOjM,GAG5B1U,KAAKsoI,kBAAkBzzH,EAAQH,EAAK,SAEpCmzH,MAGK1hI,OAObi9H,EAAkBqE,EAAa5mI,KAAK8T,OAC/B,CACL,MAAMA,EAAM,IAAM3U,KAAK6jI,iBAAiBhvH,GAAQ,EAAOmvH,GAAWnjI,KAAK,EAAEs9B,qBAsEvEn+B,KAAKgqB,cAAcnkB,QAAQ,CAACC,KAjEf,KACX,MAAMwO,EAAeC,GAAA,EAAmBC,gBAAgB1B,EAAOhT,EAAKqD,MAC9DolI,EAAqBrB,EAAa,IAAenvH,YAAYjF,GAAS,IAAiB0F,aAAa1F,EAAOhT,GA4DjH,OA1DAq+B,EAAet9B,KAAK,KACdyT,EAAaI,KACf1U,KAAKmmB,UAAUqiH,cAAcD,KAKjC1lI,QAAQC,IAAI,CAACq7B,EAAgBoqG,IAAqB1nI,KAAK,K,MACrD,GAAGb,KAAK67B,SAAWA,EAEjB,YADA77B,KAAKsuD,IAAI13C,KAAK,8BAMhB,MAAMlC,EAAMJ,EAAaI,IACzB,GAAGG,aAAkBixH,eAInB,GAHA9lI,KAAKsoI,kBAAkBzzH,EAAQH,EAAK,OACpC1U,KAAKsoI,kBAAkBlG,EAAO1tH,EAAK,OAEhC6O,EAAA,EAAWC,SAAU,CACtB,MAAMiG,EAAO24G,EAAMtyH,iBAAiB,OACjC2Z,GAAQA,EAAKtnB,QACdsnB,EAAKnjB,QAAQ8jB,IACXA,EAAIhqB,UAAUuB,OAAO,oBAItB,CACL,MAAM6qB,EAAM41G,EAAM1hH,mBAAqB0hH,EAAM1hH,kBAAkBtgB,UAAUuR,SAAS,yBAA2BywH,EAAM1hH,kBAAoB0hH,EACjIqG,EAA+C,SAAd,QAArB,EAAAj8G,EAAI9L,yBAAiB,eAAEkqB,SAAoBpe,EAAI9L,kBAAwC,KACzG,IAAI+nH,GAAaA,EAAUh0H,MAAQC,EAAM,CACvC,IAAIusC,EAAQ,IAAIpZ,MAChBoZ,EAAM7gD,UAAUC,IAAI,aAIpB,OAAAs/C,GAAA,GAAmBsB,EAAOvsC,EAAK,KAC7B1U,KAAKsoI,kBAAkBzzH,EAAQH,EAAK,OAEjC+zH,GACD,aAAQ,KACNA,EAAU9mI,WAId6qB,EAAIziB,OAAOk3C,SAMhBz0C,MAAMC,IACPzM,KAAKsuD,IAAI3hD,MAAMF,GACfzM,KAAKmmB,UAAUkE,OAAO+3G,GACtBpiI,KAAKmmB,UAAUs5B,cAGV8oF,OAMXnF,EAAkBqE,EAAa5mI,KAAK8T,GAGtC,OAAO3U,KAAKojI,gBAAkBA,EAAgB52H,MAAM,KAClDxM,KAAKgiI,yBAA2B,OAC/B3gH,QAAQ,KACTrhB,KAAKojI,gBAAkB,W,2SGt+Cd,MAAM,WAAuB,GAQ1C,cA4BE,IAAIsF,EA3BJzlI,MAAM,IAAI,EAAiB,CACzBwD,YAAchB,IACZ,MAAMkjI,EAAqD,gCAArC3oI,KAAKgH,cAAcG,YAAYC,GAC/C,IAACP,EAAG,OAAEI,GAAUxB,EAChBqN,EAA8B,IAAmByC,oBAAoB9P,GAE3E,GAAIqN,KAED61H,GAAkB,GAAe99C,mCAAmC/3E,IAIvE,MAAO,CAACkC,QAAS,KAAqBnO,MAAKI,aAE3C,CAAC,SAAU,YA4GjB,KAAAstE,YAAe1/D,IACb7U,KAAKowD,UAAUpwD,KAAKwZ,iBAAiB3E,EAAO5N,OAAQ4N,EAAOhO,KAAMgO,EAAOG,SAAU,IAGpF,KAAA6/D,YAAehgE,IACb7U,KAAKowD,UAAUpwD,KAAKwZ,iBAAiB3E,EAAO5N,OAAQ4N,EAAOhO,KAAMgO,EAAOG,QAAS,IAGnF,KAAA64C,cAAgB,KACd,MAAMh5C,EAAS7U,KAAK6U,OACpB,IAAI,GAAoBA,EAAO5N,OAAQ,CAAC4N,EAAOhO,KAAM,OAAQ,KAC3D7G,KAAK6U,OAAS,CAACG,QAAShV,KAAK6N,QAAQiF,OACrC9S,KAAK+4B,WAIT,KAAA20B,eAAiB,KACf,MAAM74C,EAAS7U,KAAK6U,OACjBA,EAAOhO,KAER,IAAI,GAAa,CACf,CAACgO,EAAO5N,QAAS,CAAC4N,EAAOhO,MACxB,IACM7G,KAAK+4B,UAKlB,KAAA6vG,cAAiB3mI,IACf,MAAM,IAAC4E,EAAG,OAAEI,GAAUjH,KAAK6U,OAC3B,GAAGhO,GAAOA,IAAQmjC,OAAOC,iBAAkB,CACzC,MAAMn/B,EAAW9K,KAAKgH,cAAc8D,SAC9B1G,EAAUpE,KAAKwZ,iBAAiBvS,EAAQJ,GAC9C7G,KAAK+4B,MAAM92B,GAEVpB,KAAK,KACJ,GAAG0iB,EAAA,EAAWC,SAAU,CACtB,MAAMhU,EAAM,GAAgBmB,OAAO,IAChCnB,GACDA,EAAIupB,QAIR,GAAastB,aAAajiD,EAAQ6C,OAAQJ,EAAKiE,EAAW,kBAAepG,EAAWoG,OAK1F,KAAAo4H,gBAAkB,KAChB,MAAM,OAACj8H,EAAM,IAAEJ,GAAO7G,KAAK6U,OACrBzQ,EAAUpE,KAAKwZ,iBAAiBvS,EAAQJ,GAC9C,GAAGzC,EAAQ0O,MAAMtO,MACf,IAAiBqkI,cAAczkI,EAAQ0O,MAAMtO,MAAO,GAAa4nB,KAAKC,QAAQrC,cAAc01B,aACvF,CACL,IAAIx/C,EAAuB,KAEDA,EAAvBkE,EAAQ0O,MAAMqZ,QAAoB/nB,EAAQ0O,MAAMqZ,QAAQjsB,SAC3CkE,EAAQ0O,MAAM5S,SAE3BA,GAED,IAAeugD,YAAYvgD,EAAU,GAAaksB,KAAKC,QAAQrC,cAAc01B,WAvKjF1/C,KAAKiV,WAAWpN,UAAY,KAC1B7H,KAAK+4B,SAOP/4B,KAAK6N,QAAQ0qB,QAAUr4B,SAASC,cAAc,OAC9CH,KAAK6N,QAAQ0qB,QAAQn4B,UAAUC,IAAIqiI,wBAGnC,MAAMoG,EAAoB,KACrBJ,GACD17H,aAAa07H,GAGfA,EAAiBn9H,OAAOC,WAAW,KACjCk9H,OAAiBhkI,EACjB1E,KAAK6N,QAAQ0qB,QAAQn4B,UAAUuB,OAAO,eACrC,MAEL3B,KAAK6N,QAAQ0qB,QAAQv3B,iBAAiB,aAAc,KAC9CuiB,EAAA,EAAWC,WAEfxjB,KAAK6N,QAAQ0qB,QAAQn4B,UAAUC,IAAI,cAEhCqoI,IACD17H,aAAa07H,GACbA,OAAiBhkI,GAGnBxE,SAASc,iBAAiB,WAAY8nI,EAAmB,CAACnxH,MAAM,OAGxC,IAAI,IAAW3X,KAAK6N,QAAQ0qB,SACpCqU,mBAAqBk8F,EAGvC9oI,KAAKkiI,SAASn4H,OAAO/J,KAAK6N,QAAQ0qB,SAElC,YAAiBv4B,KAAK4d,QAAQvP,OAAQrO,KAAK6tD,eAE3C,MAAMjwC,EAAmC,CAAC,CACxCvQ,KAAM,UACN6P,KAAM,UACNC,QAASnd,KAAK0tD,gBACb,CACDrgD,KAAM,WACN6P,KAAM,+BACNC,QAASnd,KAAKkjI,iBACb,CACD71H,KAAM,gBACN6P,KAAM,SACNC,QAASnd,KAAK6tD,gBAGhB7tD,KAAK+oI,iBAAiBnrH,GACtB5d,KAAKgpI,cAAgBprH,EAAQA,EAAQzb,OAAS,GAAG6S,QAIjDhV,KAAK2f,eAnFP,oBACE,OAAO3f,KAAKiV,WAAWjO,cAqFf,eACR/D,MAAM0c,eACN3f,KAAK4d,QAAQs4E,QAAQl1F,iBAAiB,QAAShB,KAAK0tD,gBACpD1tD,KAAKihI,OAAOhhI,UAAUe,iBAAiB,QAAShB,KAAK4oI,eAErD,MAAMK,EAAkBhnI,IACtB,GAAGA,EAAE4S,kBAAkB48C,kBAAmB,CACxC,MAAM4nE,EAAWp3H,EAAE4S,OAAuBm+D,aAAa,WACvD,IAAIqmD,GAAWA,EAAQt/F,SAAS,mBAC9B,OAUF,OAPA,OAAArc,EAAA,GAAYzb,GAEZjC,KAAK+4B,QAAQl4B,KAAK,KAChBb,KAAK6N,QAAQ0qB,QAAQlvB,oBAAoB,QAAS4/H,EAAgB,CAAC99G,SAAS,IAC3ElpB,EAAE4S,OAA6BomB,WAG3B,IAGXj7B,KAAK6N,QAAQ0qB,QAAQv3B,iBAAiB,QAASioI,EAAgB,CAAC99G,SAAS,IAejE,iBAAiBlkB,EAAgBJ,GACzC,OAAO7G,KAAKgH,cAAc8B,YAAc,IAAmByQ,0BAA0BtS,EAAQJ,GAAO,IAAmB2S,iBAAiBvS,EAAQJ,GAqE1I,WAAWzC,GACjB,MAAMm0B,EAAWn0B,EAA4BA,QAC7C,IAAIJ,EAAO,GACRu0B,IACDv0B,EAAO,IAAkBgoC,aAAazT,EAAS,CAC7C0d,SAAW7xC,EAA4BysD,iBAK3C/sD,EAAa9D,KAAK6N,QAAQ0qB,QAAQ7X,kBAAmB1c,GACrDhE,KAAK6N,QAAQ0qB,QAAQn4B,UAAUkM,OAAO,QAASisB,GAI1C,iBAAiBrvB,GAGtB,OAFAlJ,KAAKiV,WAAW2E,iBAAiB1Q,GAE1BlJ,KAGI,UAAUoE,EAAoByQ,EAAsBmvH,EAAY,EAAGl/H,GAAU,EACxF6jC,EAA0C,GAAIC,EAA0C,I,8GACxF,GAAG5oC,KAAKojI,gBAAiB,OAAOpjI,KAAKojI,gBAErC,MAAMv8H,EAAMzC,EAAQyC,IACd+E,EAAUxH,EAA4Bq1E,WAAar1E,EAAQwH,OAAUxH,EAA4Bq1E,SAAS2e,UAAYh0F,EAAQwH,OAC9HkH,EAAQ,IAAmByC,oBAAoBnR,GAErDpE,KAAK4d,QAAQs4E,QAAQ91F,UAAUkM,OAAO,OAAsB,mBAAdlI,EAAQgD,GAEtD,MAAM8iD,EAAmB,IAAmBA,iBAAiB9lD,GAC7D,CAACpE,KAAK4d,QAAQvP,OAAQrO,KAAKgpI,eAAe1iI,QAAQuU,IAChDA,EAAOza,UAAUkM,OAAO,QAAS49C,KAGnClqD,KAAKkpI,WAAW9kI,GAChB,MAAM+B,EAAU,EAAMgjI,WAAU,UAACr2H,EAAO1O,EAAQ+jB,KAAMvc,EAAQo4H,EAAWnvH,EAAQ/P,EAAS6jC,EAAaC,EAAaxkC,GAIpH,OAHApE,KAAK6U,OAAOhO,IAAMA,EAClB7G,KAAK6U,OAAO5N,OAAS7C,EAAQ6C,OAEtBd,KAGF,0CAA0C2M,GAC/C,MAAmB,UAAZA,EAAM1L,GAAiB,EAA2BO,IAAImL,EAAM+qC,YCxQxD,MAAM,WAAoE,EAGvF,YAAY76C,GACVC,MAAM,OAAD,wBACAD,GAAO,CACVoD,SAAU,CAACF,EAAQF,EAAOjB,KACxB,GAAG/E,KAAKiH,OAAO42B,cAAgB73B,EAAO,OAAOnD,QAAQoD,QAAQ,CAACtB,MAAO,EAAGa,MAAO,KAE/E,MAAMoB,EAAQV,aAAM,EAANA,EAAQuhC,QACtB,OAAO,IAAiBqC,cAAc9pC,KAAKiH,OAAQL,EAAO7B,GAAWlE,KAAKqB,IACxE,MAAMsD,EAAQtD,EAAM6nC,OAAOthC,IAAIg/B,IACtB,CAACzyB,QAAS,KAAqByyB,aAGxC,MAAO,CAAC9iC,MAAOzC,EAAMyC,MAAOa,eAKlCxF,KAAKiF,aAAc,EACnBjF,KAAKiH,OAASjE,EAAQiE,Q,2SClBX,MAAM,WAA6B,GAGhD,YAAYA,GACVhE,MAAM,IAAI,GAAiB,CAACgE,WAAU,IAmBxC,KAAAstE,YAAe1/D,IACb7U,KAAKowD,UAAUv7C,EAAO4yB,QAAS5yB,EAAOG,SAAU,IAGlD,KAAA6/D,YAAehgE,IACb7U,KAAKowD,UAAUv7C,EAAO4yB,QAAS5yB,EAAOG,QAAS,IAGjD,KAAAkuH,gBAAkB,KAChB,IAAiB2F,cAAc,IAAiBjhG,SAAS5nC,KAAK6U,OAAO4yB,SAAU,GAAarb,KAAKC,QAAQrC,cAAc01B,UA1BvH1/C,KAAKiH,OAASA,EAEdjH,KAAK+oI,iBAAiB,CAAC,CACrB17H,KAAM,WACN6P,KAAM,+BACNC,QAASnd,KAAKkjI,mBAShBljI,KAAK2f,eAeM,UAAU8nB,EAA4B5yB,EAAsBmvH,EAAY,EAAGr7F,EAAgDC,G,8GACtI,GAAG5oC,KAAKojI,gBAAiB,OAAOpjI,KAAKojI,gBAErC,MAAM5+H,EAAQ,IAAiBojC,SAASH,GAClC9B,EAAM,EAAMwjG,WAAU,UAAC3kI,EAAOA,EAAM2jB,KAAMnoB,KAAKiH,OAAQ+8H,EAAWnvH,GAAQ,EAAO8zB,EAAaC,GAGpG,OAFA5oC,KAAK6U,OAAO4yB,QAAUjjC,EAAM2K,GAErBw2B,M,2SClCX,MAAMyjG,GAAkBniI,IACtB2R,EAAA,EAAkBywH,uBAAuBpiI,GACxCkB,MAAMC,KAAKlI,SAAS4P,iBAAiB,wBAA0B7I,EAAS,OAA2BX,QAAQvC,IAE1GA,EAAKg9B,YAWF,SAAe8H,GACpBh0B,EACA5N,EACAglB,EACA7nB,EACAukC,EACAC,G,0CAEA,IAAIpkC,QAAc,UAAkB8kI,aAAariI,GACjD,IAAIglB,MAAiBznB,EACnB,OAGF,MAAM+kI,EAAY,IACHphI,MAAMC,KAAKyM,EAAO/E,iBAAiB,QAAQW,KAAK2Z,IAAQA,EAAIhqB,UAAUuR,SAAS,UAC9EkD,EAAS,KAGzB,GAAG5N,EAAO42B,YAAa,CACrB,MAAM2rG,IAAeplI,EACf+C,EAAc,gCACpB,IAAI/C,IACFA,QAAgB,IAAmB2C,UAAU,CAC3CE,SACAE,YAAa,CAACC,EAAGD,GACjBP,MAAO,EACPM,MAAO,IACNrG,KAAKqB,GAGCA,EAAMiC,QAAQ,KAGnB8nB,KACF,OAIJ,GAAG7nB,EAAS,CAEWA,EAAQG,OAAOC,MACpB2K,KAAO3K,EAAM2K,KACvBq6H,IACFplI,EAAU,IAAmBgmC,0BAA0BnjC,EAAQzC,KAMnE,MAAM01B,EAAK51B,GAA4BA,EAAImE,IAAIsH,IAAM,CACnDiF,QAASjF,EAAGiF,QACZnO,IAAMkJ,EAAGtK,KAAgCoB,IACzCI,OAAS8I,EAAGtK,KAAgCwB,UAU9C,YAPA,IAAI,IACH2S,iBAAiB,CAChB3S,SACAE,YAAa,CAACC,EAAGD,KAElBipD,UAAUhsD,EAASmlI,SAAa7kI,OAAWA,EAAWikC,EAAczO,EAAEyO,QAAejkC,EAAWkkC,EAAc1O,EAAE0O,QAAelkC,IAMpI,GAAGF,EAAO,CACJ,YAASJ,KACXI,EAAQ,IAAiBojC,SAASxjC,IAGpC,MAAM81B,EAAK51B,GAA4BA,EAAImE,IAAIsH,IAAM,CACnDiF,QAASjF,EAAGiF,QACZyyB,QAAS13B,EAAGtK,QAGd,IAAI,GAAqBwB,GAAQmpD,UAAU5rD,EAAM2K,GAAIo6H,SAAa7kI,EAAWikC,EAAczO,EAAEyO,QAAejkC,EAAWkkC,EAAc1O,EAAE0O,QAAelkC,OAnF1JkE,EAAA,QAAU5H,iBAAiB,gBAAiBooI,IAC5CxgI,EAAA,QAAU5H,iBAAiB,kBAAoBiG,IACzC2R,EAAA,EAAkB6wH,eAAexiI,IACnCmiI,GAAeniI,KAoFnB,MAAMyiI,GAA6C,IAAIh6H,IACjD,GAAoB,IAAI7L,IAEf,MAAM,WAAsBujB,YAA3C,c,oBAEU,KAAAuiH,UAAW,EAIX,KAAAC,cAAe,EAEvB,oBAKE,GADA5pI,KAAK2pI,SAA2C,MAAhC3pI,KAAKgzE,aAAa,UACI,KAAnChzE,KAAKgzE,aAAa,aAAqB,CACxChzE,KAAKoD,aAAa,YAAa,OAC/B,IAAI61B,GAAU,EACd,YAAiBj5B,KAAYiC,GAAM,mCAEjC,GADA,OAAAyb,EAAA,GAAYzb,GACTg3B,EAAS,OAEZ,MAAMhyB,EAASjH,KAAKiH,OACpBgyB,GAAU,QACJ4P,GAAiB7oC,KAAMA,KAAKiH,OAAQ,IAAMjH,KAAKiH,SAAWA,GAChEgyB,GAAU,OAKhB,uBAGE,MAAMtkB,EAAM+0H,GAAU15H,IAAIhQ,KAAKiH,QAC5B0N,GAAOA,EAAIhN,IAAI3H,QAChB2U,EAAItG,OAAOrO,MACP2U,EAAI7U,MACN4pI,GAAUr7H,OAAOrO,KAAKiH,SAIvBjH,KAAKgqB,eACNhqB,KAAKgqB,cAAcugB,UAAUvqC,MAIjC,gCACE,MAAO,CAAC,OAAQ,SAAU,cAG5B,yBAAyBsJ,EAAcugI,EAAkBpzB,GAGvD,GAAY,SAATntG,EAAiB,CAClB,MAAMwgI,GAAarzB,GAAY,IAAItvF,YAAc,KACjD,GAAGnnB,KAAKiH,SAAW6iI,EACjB,OAGF9pI,KAAKiH,OAAS,IAAgB8iI,kBAAkBD,IAAcA,EAE9D,MAAMhmB,GAAa+lB,GAAY,IAAI1iH,YAAc,KACjD,GAAG28F,EAAW,CACZ,MAAMnvG,EAAM+0H,GAAU15H,IAAI8zG,GACvBnvG,IACDA,EAAItG,OAAOrO,MACP2U,EAAI7U,MACN4pI,GAAUr7H,OAAOy1G,IAKvB9jH,KAAK+gC,aACY,eAATz3B,EACRtJ,KAAKsxH,UAAY7a,EACA,WAATntG,IACRtJ,KAAK2pI,SAAwB,MAAblzB,GAIZ,EAAE10D,GAAY,GACpB,MAAMr2C,EAAMkN,EAAA,EAAkBixG,SAAS7pH,KAAMA,KAAKiH,OAAQjH,KAAK2pI,SAAU3pI,KAAKsxH,UAAWvvE,GACnF57C,EAAUuF,EAAMA,EAAIpL,YAAcuC,QAAQoD,UAWhD,OAVGjG,KAAK8pB,eACHpe,GAAOA,EAAIoN,QACZ9Y,KAAK8pB,aAAankB,KAAKQ,GAGzBA,EAAQkb,QAAQ,KACdrhB,KAAK8pB,kBAAeplB,KAIjBgH,EAGF,SACL,GAAG1L,KAAKgqB,cAAe,CACrB,IAAI,GAAKriB,IAAI3H,KAAKiH,QAAS,CACzB,GAAGjH,KAAK4pI,aAAc,OACtB5pI,KAAK4pI,cAAe,EAEpB,IAAIj1H,EAAM+0H,GAAU15H,IAAIhQ,KAAKiH,QAkB7B,OAjBI0N,IACFA,EAAM,IAAI9Q,IACV6lI,GAAU/0H,IAAI3U,KAAKiH,OAAQ0N,IAG7BA,EAAItU,IAAIL,MAERA,KAAKif,GAAE,QAEPjf,KAAKgqB,cAAcrkB,KAAK,CACtB6mB,IAAKxsB,KACL8F,KAAM,KACJ,GAAKzF,IAAIL,KAAKiH,QACPjH,KAAK+gC,YAKR/gC,KAAK4pI,cACb5pI,KAAKgqB,cAAcugB,UAAUvqC,MAIjC,GAAKK,IAAIL,KAAKiH,QAEd,MAAMyE,EAAM1L,KAAKif,IACX9Y,EAAUuF,EAAMA,EAAIpL,YAAcuC,QAAQoD,UAE7CjG,KAAK4pI,cACNzjI,EAAQkb,QAAQ,KACdrhB,KAAK4pI,cAAe,IAIxB,MAAMj1H,EAAM+0H,GAAU15H,IAAIhQ,KAAKiH,QAC/B,GAAG0N,EAAK,CACNA,EAAItG,OAAOrO,MACX,MAAMsE,EAAM6D,MAAMC,KAAKuM,GACvB+0H,GAAUr7H,OAAOrO,KAAKiH,QAGtB,IAAI,IAAI+D,EAAI,EAAG7I,EAASmC,EAAInC,OAAQ6I,EAAI7I,IAAU6I,EAChD1G,EAAI0G,GAAG+1B,SAIX,OAAO56B,GAIXklB,eAAeC,OAAO,iBAAkB,ICzPzB,MAAM,GAArB,cAwEU,KAAA0+G,eAAiB,KACvB,IAAIn+H,EAAS,IAAmBqoF,cAAcl0F,KAAKiqI,YAChDp+H,GACD,IAAmBq+H,gBAAgB,CAACr+H,EAAO5E,UAAW4E,EAAOs+H,YAIzD,KAAAvsC,WAAa,KACnB,IAAmBwsC,gBAAgBpqI,KAAKiqI,WAAYjqI,KAAKusE,UAAU//D,MAAMC,IACvD,4BAAbA,EAAItJ,OACFnD,KAAKusE,UAAY,EAClB/3C,GAAS,CAACC,YAAa,0BAEvB,IAAI,GAAU,0BAA2B,CACvC7W,QAAS,CAAC,CACRwW,QAAS,KACT6lC,UAAU,GACT,CACD7lC,QAAS,uBACTiD,SAAU,KACR,IAAI,GAAkB,IAAgBtmB,UAG1C+lB,mBAAoB,wBACpBG,oBAAqB,CAAC,eAAK,QAAS,CAACruB,EAAA,QAAUgiD,OAAOy/E,8BACrD5rH,WAMH,KAAA6rH,cAAgB,KACtB,IAAmB3lG,SAAS3kC,KAAKiqI,YAAY,IAGvC,KAAA5pH,YAAc,KACpB,IAAmBskB,SAAS3kC,KAAKiqI,YAAY,IAGvC,KAAAM,cAAgB,KACtB,MAAM1+H,EAAS,IAAmBqoF,cAAcl0F,KAAKiqI,YACjDp+H,IAEDA,EAAOkoG,cACR,IAAmBlkB,YAAY7vF,KAAKiqI,WAAYp+H,EAAO2+H,aACvD,IAAmBp2C,iBAAiBp0F,KAAKiqI,YAAY,IAErD,IAAmB71C,iBAAiBp0F,KAAKiqI,cAIrC,KAAAp8E,cAAgB,KACtB,IAAI,GAAkB7tD,KAAKiqI,aAG7B,KAAAn8E,cAAiB7rD,IACZjC,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGd,IAAI8sB,EAAkB,KAEtB,IACEA,EAAK,OAAAyF,GAAA,GAAUx+B,EAAE4S,OAAQ,MACzB,MAAM5S,IAER,GAAI+4B,EAAJ,CAGA,GADG/4B,aAAa6jB,YAAY7jB,EAAE8Y,iBAC3B/a,KAAKgV,QAAQ5U,UAAUuR,SAAS,UACjC,OAAO,EAEN1P,aAAa6jB,aAAY7jB,EAAE8rD,cAAe,GAE7C/tD,KAAKusE,SAAW,GAAkBA,SAElCvsE,KAAKiqI,WAAajvG,EAAG5uB,QAAQnF,OAAOkgB,WACpCnnB,KAAK6L,OAAS,IAAmBqoF,cAAcl0F,KAAKiqI,YAEpDjqI,KAAK4d,QAAQtX,QAAQuU,IACnB,MAAMsH,EAAOtH,EAAO9F,SAEpB8F,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAAS6V,KAI3CniB,KAAK4d,QAAQ5d,KAAK4d,QAAQzb,OAAS,GAAG6S,QAAQ8T,UAAUC,YAAY,eAAK,IAAgBk4F,oBAAoBjhH,KAAKiqI,cAElHjvG,EAAG56B,UAAUC,IAAI,aACjB,aAAa4B,EAAGjC,KAAKgV,SACrB,aAAYhV,KAAKgV,QAAS,KACxBgmB,EAAG56B,UAAUuB,OAAO,aACpB3B,KAAKiqI,WAAajqI,KAAK6L,OAAS7L,KAAKusE,cAAW7nE,MA7J5C,OACN1E,KAAK4d,QAAU,CAAC,CACdvQ,KAAM,SACN6P,KAAM,eACNC,QAASnd,KAAKuqI,cACdx1H,OAAQ,KAAO,IAAmB01H,eAAezqI,KAAK6L,SACrD,CACDwB,KAAM,YACN6P,KAAM,aACNC,QAASnd,KAAKuqI,cACdx1H,OAAQ,IAAM,IAAmB01H,eAAezqI,KAAK6L,SACpD,CACDwB,KAAM,MACN6P,KAAM,uBACNC,QAASnd,KAAK49F,WACd7oF,OAAQ,K,MAEN,QADiB/U,KAAKusE,SAAW,EAAI,IAAmBhD,eAAeiD,UAAUxsE,KAAKusE,UAAUvD,cAAcjvC,SAAS/5B,KAAK6L,OAAO5E,WAA8B,QAAlB,EAAAjH,KAAK6L,OAAOyL,cAAM,eAAEwiE,WAGpK,CACDzsE,KAAM,QACN6P,KAAM,yBACNC,QAASnd,KAAK49F,WACd7oF,OAAQ,K,MAEN,OADiB/U,KAAKusE,SAAW,EAAI,IAAmBhD,eAAeiD,UAAUxsE,KAAKusE,UAAUvD,cAAcjvC,SAAS/5B,KAAK6L,OAAO5E,WAA8B,QAAlB,EAAAjH,KAAK6L,OAAOyL,cAAM,eAAEwiE,UAGpK,CACDzsE,KAAM,OACN6P,KAAM,wBACNC,QAASnd,KAAKqgB,YACdtL,OAAQ,IACC/U,KAAKiqI,aAAerhI,EAAA,QAAU6O,OAAS,KAAwB2tB,iBAAiBplC,KAAK6L,OAAO5E,SAEpG,CACDoG,KAAM,SACN6P,KAAM,0BACNC,QAASnd,KAAKsqI,cACdv1H,OAAQ,IACC/U,KAAKiqI,aAAerhI,EAAA,QAAU6O,MAAQ,KAAwB2tB,iBAAiBplC,KAAK6L,OAAO5E,SAEnG,CACDoG,KAAM,UACN6P,KAAM,UACNC,QAASnd,KAAKgqI,eACdj1H,OAAQ,IAAwB,IAAlB/U,KAAKusE,UAAkBvsE,KAAKiqI,aAAerhI,EAAA,QAAU6O,MAClE,CACDpK,KAAM,YACN6P,KAAM,YACNC,QAASnd,KAAKgqI,eACdj1H,OAAQ,IAAwB,IAAlB/U,KAAKusE,UAAkBvsE,KAAKiqI,aAAerhI,EAAA,QAAU6O,MAClE,CACDpK,KAAM,gBACN6P,KAAM,SACNC,QAASnd,KAAK6tD,cACd94C,OAAQ,KAAM,IAGhB/U,KAAKgV,QAAU,GAAWhV,KAAK4d,SAC/B5d,KAAKgV,QAAQ7F,GAAK,sBAClBnP,KAAKgV,QAAQ5U,UAAUC,IAAI,eAC3BH,SAAS4uC,eAAe,cAAc/kC,OAAO/J,KAAKgV,UCpFtD,IAAY01H,GCKAC,IDLZ,SAAYD,GACV,6BACA,+BACA,uBACA,2BAJF,CAAYA,QAAgB,KEeb,MAAM,GAoBnB,YAAYv4H,GAXJ,KAAAy4H,YAAa,EAEb,KAAAC,YAAa,EACb,KAAAC,UAAW,EACX,KAAAC,UAAW,EA2DX,KAAAC,oBAAsB,KAC5B15D,GAAA,EAAethE,IAAI,MAAMnP,KAAKoqI,IACxBA,IACFA,EAAW,KAAIA,UAGdjrI,KAAKkrI,4BACNl+H,aAAahN,KAAKkrI,2BAClBlrI,KAAKkrI,0BAA4B,GAGnC,MAAMzlF,EAAS78C,EAAA,QAAUuiI,iBAAiB,OAASF,GAC7CG,EAAS3lF,GAAUA,EAAOA,SAAWilF,GAAiBW,UAEzDrrI,KAAK6qI,YAAcO,GACpBn1E,GAAA,EAAkBq1E,qBAGjBF,IAAWprI,KAAK4qI,aACjB5qI,KAAK4qI,YAAa,GAGpB5qI,KAAK8qI,SAAWrlF,GAAUA,EAAOA,SAAWilF,GAAiBa,SAC7DvrI,KAAK6qI,YAAcO,EACnBprI,KAAKwrI,QAAU/lF,GAAUA,EAAO+lF,QAChC,MAASxrI,KAAKsuD,IAAI,aAActuD,KAAK6qI,YACrC7qI,KAAKu1B,cAID,KAAAk2G,cAAgB,CAACh3G,EAA0BxmB,KAC9CjO,KAAK0rI,qBAAuBj3G,IAC/Bz0B,KAAK0rI,mBAAqBj3G,EAC1B,OAAAloB,EAAA,GAAevM,KAAK2rI,SAAU,eAAKl3G,EAAaxmB,IAChDjO,KAAK4rI,gBAAgBvhH,OAAOrqB,KAAK2rI,YAe3B,KAAAp2G,SAAW,KACjB,MAAMzoB,EAAU,GAA0B++H,mBAC1C,GAAG7rI,KAAK6qI,WACN,GAAG7qI,KAAK8qI,SAAU,CAChB,MAAMxiI,EAAItI,KAAK8rI,KAAK,kCAAmC,IAAM,KAAWC,kBACxE/rI,KAAKyrI,cAAc,4BAA6B,CAACnjI,SAC5C,GAAGtI,KAAK4qI,WACb,QAAoBlmI,IAAjB1E,KAAKwrI,QAAuB,CAC7B,MAAMQ,EAAY9rI,SAASC,cAAc,QACnCqrI,EAAUxrI,KAAKwrI,QACftyD,EAAU,KACd,MAAMxkC,EAAMD,KAAKC,MACjBs3F,EAAUziH,UAAY,GAAKlnB,KAAKE,OAAOipI,EAAU92F,GAAO,KACrDA,EAAM82F,GACPx2F,cAAci3F,IAGZA,EAAW9gG,YAAY+tC,EAAS,KACtCA,IAEA,MAAM5wE,EAAItI,KAAK8rI,KAAK,6BAA8B,IAAM,KAAWI,yBACnElsI,KAAKyrI,cAAc,+BAAgC,CAACO,EAAW1jI,SAE/DtI,KAAKyrI,cAAc,sCAGrBzrI,KAAKyrI,cAAc,iCAEbzrI,KAAK+qI,UACb/qI,KAAKyrI,cAAc,YAGrB,MAASzrI,KAAKsuD,IAAI,WAAYtuD,KAAK6qI,YAAc7qI,KAAK+qI,UACtDx/H,OAAO2T,sBAAsB,KACxBlf,KAAKmsI,iBAAiBn/H,aAAahN,KAAKmsI,iBAQ3CnsI,KAAKmsI,gBAAkB5gI,OAAOC,WANnB,KACT,aAAcxL,KAAKosI,gBAAiB,WAAYpsI,KAAK6qI,YAAc7qI,KAAK+qI,SAAU,KAClF/qI,KAAKmsI,gBAAkB,EACvB,MAASnsI,KAAKsuD,IAAI,qBAAsBtuD,KAAK6qI,YAAc7qI,KAAK+qI,WAGrBj+H,MA9I/C9M,KAAKsuD,IAAM,OAAAC,EAAA,GAAO,UAAM7pD,OAAWA,GAEnC1E,KAAKosI,gBAAkBlsI,SAASC,cAAc,OAC9CH,KAAKosI,gBAAgBhsI,UAAUC,IAAI,qBAEnCL,KAAK2rI,SAAW,YAAO,kDAAmD,CAACh+H,UAAU,IACrF3N,KAAK4rI,gBAAkB,IAAI,KAAqB,CAACxlH,YAAY,IAC7DpmB,KAAK4rI,gBAAgBS,mBAAmB,CAACz3F,MAAO,cAAe2gE,MAAM,IACrEv1G,KAAKosI,gBAAgBriI,OAAO/J,KAAK2rI,UAEjCx5H,EAAesN,QAAQzf,KAAKosI,iBAE5BxjI,EAAA,QAAU5H,iBAAiB,2BAA6BykD,IACtD/4C,QAAQ4hD,IAAI7I,GAEZzlD,KAAKgrI,wBAGPpiI,EAAA,QAAU5H,iBAAiB,sBAAwB63B,IAC7CA,IACF74B,KAAK+qI,UAAW,EAChB,MAAS/qI,KAAKsuD,IAAI,WAAYtuD,KAAK+qI,UACnC/qI,KAAKu1B,cAIT3sB,EAAA,QAAU5H,iBAAiB,qBAAuB63B,IAChD,MAAS74B,KAAKsuD,IAAI,qBAAsBz1B,GACpCA,IACF74B,KAAK+qI,UAAW,EAChB,MAAS/qI,KAAKsuD,IAAI,WAAYtuD,KAAK+qI,UACnC/qI,KAAKu1B,cAITv1B,KAAKkrI,0BAA4B3/H,OAAOC,WAAWxL,KAAKgrI,oBAAqB,GAA0Ba,mBAAqB,KAqDtH,KAAKp3G,EAA0B4C,GACrC,MAAM/uB,EAAIpI,SAASC,cAAc,KAQjC,OAPAmI,EAAElI,UAAUC,IAAI,mBAChBiI,EAAEyB,OAAO,eAAK0qB,IACdnsB,EAAEtH,iBAAiB,QAAUiB,IAC3B,OAAAyb,EAAA,GAAYzb,GACZo1B,MAGK/uB,GC3II,SAASgkI,GACtBruF,EACA1jC,EACAE,EACA/Z,EACAC,EACAszC,EACAzoB,EACAqpB,GAEA,GAAsB,iBAAb,EACPZ,EAAS,CAAC20E,GAAI30E,EAAQ40E,GAAI50E,EAAQkZ,GAAIlZ,EAAQ60E,GAAI70E,OAC7C,CACL,MAAMs4F,EAAgB,CAAC3jB,GAAI,EAAGC,GAAI,EAAG17D,GAAI,EAAG27D,GAAI,GAChD,IAAI,MAAMruB,KAAQ8xC,EAEhBt4F,EAAOwmD,GAAQxmD,EAAOwmD,IAAS8xC,EAAc9xC,GAIjDx8C,EAAI2sE,YACJ3sE,EAAI4sE,OAAOtwG,EAAI05B,EAAO20E,GAAInuG,GAC1BwjC,EAAI6sE,OAAOvwG,EAAI7Z,EAAQuzC,EAAO40E,GAAIpuG,GAClCwjC,EAAIuuF,iBAAiBjyH,EAAI7Z,EAAO+Z,EAAGF,EAAI7Z,EAAO+Z,EAAIw5B,EAAO40E,IACzD5qE,EAAI6sE,OAAOvwG,EAAI7Z,EAAO+Z,EAAI9Z,EAASszC,EAAOkZ,IAC1ClP,EAAIuuF,iBAAiBjyH,EAAI7Z,EAAO+Z,EAAI9Z,EAAQ4Z,EAAI7Z,EAAQuzC,EAAOkZ,GAAI1yC,EAAI9Z,GACvEs9C,EAAI6sE,OAAOvwG,EAAI05B,EAAO60E,GAAIruG,EAAI9Z,GAC9Bs9C,EAAIuuF,iBAAiBjyH,EAAGE,EAAI9Z,EAAQ4Z,EAAGE,EAAI9Z,EAASszC,EAAO60E,IAC3D7qE,EAAI6sE,OAAOvwG,EAAGE,EAAIw5B,EAAO20E,IACzB3qE,EAAIuuF,iBAAiBjyH,EAAGE,EAAGF,EAAI05B,EAAO20E,GAAInuG,GAC1CwjC,EAAIstE,YAED//F,GACDyyB,EAAIzyB,OAGHqpB,GACDoJ,EAAIpJ,SDfQ,GAAAg3F,mBAAqB,IDXrC,SAAYlB,GACV,sBACA,yBACA,mBACA,mBAJF,CAAYA,QAAc,KGC1B,MAAM8B,GAAMlhI,OAAO8iH,iBACbqe,GAAO,GAAKD,GACZE,GAAS,IAAMF,GACf,GAAQ,EAAIA,GACZG,GAAS,EAAIH,GAOJ,SAASI,GAAoBvnD,GAAW,GACrD,MAAM5iF,EAASxC,SAASC,cAAc,UACtCuC,EAAOhC,MAAQgC,EAAO/B,OAAS+rI,GAC/B,MAAMxjI,EAAUxG,EAAOsO,WAAW,MAG5B87H,GAAWJ,IAZJ,EAWgB,GAAQ,EAAeC,KACb,EAEjCI,EAAYt4F,KAAKC,MACvB,IAAIs4F,GAAa,EAEjB,MAAMvb,EAAc,KAClB,GAAI/uH,EAAO0oB,YAIA4hH,IACTA,EAAatqI,EAAO0oB,kBAJpB,GAAG4hH,EACD,OAAO,EAMX,MAAMx4F,EAAOC,KAAKC,MAKZtzB,GC/C6B1Q,GD+CH8jC,EAAOu4F,GA3B1B,ICpBiCxkI,ED+CgB,EC/CMgY,EDoBvD,KA2BoD,EC9CvD,GAAKle,KAAK4qI,IAAI5qI,KAAK8xC,GAAKzjC,EAAI6P,GAAK,GAAKhY,GADrC,IAAwBmI,EAAWnI,EAAsBgY,EDiDpErX,EAAQ+H,UAAU,EAAG,EAAGy7H,GAAMA,IAC9BxjI,EAAQyiH,UAAYrmC,IAAa/hE,EAAA,EAAWC,SAAW,GAAiBgrG,YAAY,iBAAmB,OAEvG,IAAI,IAAIxjH,EAAI,EAAGA,EApCJ,IAoCkBA,EAAG,CAG9B,IAAIkiI,EAEFA,EADC9rH,GAAY,GACEpW,EAAI,EAAI,EAAe,EAAXoW,EAAiC,GAAjBA,EAAW,IAEvCpW,EAAI,EAAe,EAAXoW,EAAe,EAAe,EAAXA,EAG5C,IAAIzgB,EA5CS,EA4C6B,EAAfusI,EAK3BvsI,GAAU8rI,GAGVH,GAAUpjI,EAjBA4jI,EAAW9hI,EAAI,GAAUA,EAAI2hI,IAe5BD,GAAO/rI,GAAU,EAEH,GAAOA,EAAQisI,IAAQ,GAGlD,OAAO,GAGT,MAAO,CACLlqI,SACAyqI,eAAgB,KACd,aAAQ1b,GACRA,KAEFvnH,UAAYylC,IACV21C,EAAW31C,EACX8hF,M,2SEHN,MAAM,WAAyB,GAC7B,YACS7nH,EACAwjI,EACA5nF,GAEPviD,MAAM,CACJoiD,SAAWrwC,GAAY,IAAmBk/E,cAAcl/E,EAAQ7F,IAAInP,KAAKotI,UACzEhoF,SAAWpwC,IACTA,EAAQlJ,IAAIK,OAAOxK,SACnB3B,KAAKwlD,oBAAsBxlD,KAAKwlD,sBAElCZ,OAAQ,CAAC5vC,EAAS3Q,KAChB,MAAMqhD,EAAmB1wC,EAAQlJ,IAAIK,OAAO2E,gBAAkB9Q,KAAK4J,KACnE06C,GAAuBtvC,EAAQlJ,IAAIK,OAAQnM,KAAK4J,KAAMvF,GAEnDqhD,GACD1lD,KAAKwlD,oBAAsBxlD,KAAKwlD,sBAGpCN,gBAAiB,CAACD,EAAMF,KACtB,MAAMj7B,EAA+Bi7B,EAAQ,QAAKrgD,GAE5C,IAACoH,GAAOuhI,GAAkBC,cAAc,CAACzhI,OAAQo5C,EAAK91C,GAAI2a,eAAcyjH,QAASxoF,IAUvF,OATCE,EAAsBn5C,IAAMA,GAE1Bge,aAAY,EAAZA,EAAc3nB,UACd8iD,EAAsBn7B,aAAeA,EACtCjnB,QAAQC,IAAIgnB,GAAczI,QAAQ,YACxB4jC,EAAsBn7B,gBAI3Bm7B,GAETP,kBAAmB,OAjCd,KAAA96C,OACA,KAAAwjI,WACA,KAAA5nF,qBAmCF,QACLxlD,KAAK4J,KAAK3F,UAAY,GACtBhB,MAAMkH,SAOH,MAAM,GAgDX,cA/CQ,KAAAgI,eAAiBjS,SAAS4uC,eAAe,sBAKzC,KAAA/Q,OAAqB,KAErB,KAAAuwB,IAAM,OAAAC,EAAA,GAAO,UAAW,IAAS02D,IAAM,IAASn6F,MAAQ,IAASo6F,KAAO,IAASC,OAEjF,KAAAG,YAAc,IAAI,GAGnB,KAAAj1C,YAAsD,GACtD,KAAAG,YAAgD,GAE/C,KAAAtB,QAA8E,CACpFkP,KAAMl+E,SAAS4uC,eAAe,gBAC9B0+F,oBAAqB,KACrBvtI,UAAWC,SAAS4uC,eAAe,sBAE7B,KAAAo9B,gBAOJ,GAMI,KAAAuhE,mBAAuC,IAAI5pI,IAE3C,KAAA6pI,QAAyC,CAACl6G,IAAK,EAAG1W,OAAQ,GAO1D,KAAA6wH,iBAAkB,EAGlB,KAAAC,0BAA2B,EAqc5B,KAAAj9D,YAAc,KACnB3wE,KAAK+9B,OAAS/9B,KAAKwwE,YAAYxwE,KAAKusE,UACpCvsE,KAAK+9B,OAAO54B,UAAUquB,KAAM,EAC5BxzB,KAAK+9B,OAAO54B,UAAU2X,QAAS,EAC/B9c,KAAK0tI,QAAQl6G,IAAMxzB,KAAK0tI,QAAQ5wH,OAAS,EACzC9c,KAAK6tI,wBAAqBnpI,EAC1B1E,KAAK0zH,WAAa1zH,KAAKqwE,YAAYrwE,KAAKusE,UACxCvsE,KAAK8tI,iBA6YC,KAAAC,oBAAsB,KAC5B,IAAI/tI,KAAK4tI,yBACP,OAKF,GAFA5tI,KAAKguI,2BAEFhuI,KAAKusE,SAAW,EAAG,OAEtB,MAAM+D,EAAWtwE,KAAKswE,SAChB3rE,EAAQ2rE,EAASrmE,kBAEjB+d,EAAQsoD,EAASx/D,cAAcA,cAC/BgM,EAASwzD,EAASx/D,cAAcymB,mBAChC02G,IAAgBnxH,EAAO7S,kBAC7B,GAAGtF,GAAS,GAKV,YAJGspI,GACDjuI,KAAKkuI,6BAIF,GAAGD,EAAa,OAEvBjmH,EAAM5nB,UAAUC,IAAI,iBAEpB,MAAMo3B,EAAU,IAAI,GAAe,CACjCnuB,KAAM,WACNkvB,aAAa,EACbo4C,uBAAuB,IAGzBn5C,EAAQx3B,UAAUG,UAAUC,IAAI,QAEhC,IAAgBw8B,wBAAmBn4B,OAAWA,EAAW,UAAU7D,KAAK07B,IACtE,IAAI6qE,GAAQ,EACZ,MAAM5hD,EAAqB,KACtB4hD,GACD3vE,EAAQx3B,UAAUG,UAAUkM,OAAO,QAAS4jE,EAAetmE,KAAKK,oBAI9DimE,EAAiB,IAAI,GAAe,CACxCjkE,WAAY,GACZ05C,sBAAuB,CACrB0rE,WAAY,GACZvyF,KAAK,GAEPp1B,YAAY,EACZ87C,uBAGFxlD,KAAKmuI,aAAe,KAClB,MAAMxyG,EAAYC,GAAA,EAAWj7B,OAAS,GAAK,EAC/B47B,EAAS93B,OAAO,EAAGk3B,GAAW/zB,OAAO5H,KAAKouI,yBAElD9nI,QAASW,IACXipE,EAAe7vE,IAAI4G,KAGjBs1B,EAASp6B,SACXnC,KAAKmuI,kBAAezpI,IAIxB1E,KAAKmuI,eAELnuI,KAAKquI,eAAkBpnI,IACrB,GAAGA,EAAO42B,YACR,OAGF,MAAM1b,EAAOniB,KAAKouI,wBAAwBnnI,GACpCqnI,EAAQp+D,EAAevoE,IAAIV,IAC7BqnI,GAASnsH,EAAM+tD,EAAe7vE,IAAI4G,GAC9BqnI,IAAUnsH,GAAM+tD,EAAe7hE,OAAOpH,IAGhD,MAAM2C,EAAOsmE,EAAetmE,KAC5BA,EAAKxJ,UAAUC,IAAI,gBACnBL,KAAKgK,qBAAqBJ,GAC1B6tB,EAAQ5pB,QAAQ9D,OAAOH,GAEvBw9F,GAAQ,EACR5hD,MAGF1oC,EAAO/S,OAAO0tB,EAAQx3B,YAGhB,KAAAmuI,wBAA2BnnI,GAC1BA,EAAOi9B,cAAgB,IAAmBgwD,cAAcjtF,GAG1D,KAAAsnI,qBAAuB,KAGzBvuI,KAAKwuI,cAAcxhI,aAAahN,KAAKwuI,cACxCxuI,KAAKwuI,aAAejjI,OAAOC,WAAW,KACpCxL,KAAKwuI,kBAAe9pI,EAEhB1E,KAAKswE,SAASrmE,oBAAqBjK,KAAKquI,gBAY5C,aAAoB,KAEpB,MAAMI,EAAOC,YAAYh6F,MAEnBi6F,EAAe3uI,KAAK+9B,OAAOyK,UAE3B9nB,EAAoB1gB,KAAKswE,SAAS5vD,kBAClCkuH,EAAgB5uI,KAAK+9B,OAAO99B,UAAU6b,wBACtC+yH,EAAanuH,EAAkB5E,wBAC/BsJ,EAAWjd,MAAMC,KAAKpI,KAAK+9B,OAAO1D,QAAQjV,UAIhD,IAAI0qC,EAAY9vD,KAAK+9B,OAAO1D,QAAQy1B,UACjCA,GAAa6+E,EAAe7+E,IAAWA,GAAa6+E,GAEvD,MAAMG,EAASF,EAAcn0H,EAAIq1C,EAC3BowD,EAAQ0uB,EAAcn0H,EAEtBs0H,EAAe,OAAAtuG,GAAA,GAAUvgC,SAASo7E,iBAAiBj5E,KAAKkjB,KAAKspH,EAAWt0H,GAAIlY,KAAKkjB,KAAKupH,EAAS,IAAKpuH,EAAkBkqB,SACtHokG,EAAc,OAAAvuG,GAAA,GAAUvgC,SAASo7E,iBAAiBj5E,KAAKkjB,KAAKspH,EAAWt0H,GAAIlY,KAAKg5E,MAAM6kC,EAAQ0uB,EAAcjuI,OAAS,IAAK+f,EAAkBkqB,SAIlJ,IAAImkG,IAAiBC,EACnB,OAKF,MACMC,EADmBF,EAAajzH,wBACGrB,EAAIq0H,EAEvC/9E,EAAwB,GACxB1I,EAAajjC,EAAS7I,QAAQwyH,GAC9BzpH,EAAYF,EAAS7I,QAAQyyH,GAI7BE,EAAiB,aAAY,GAAK9pH,EAAS3hB,MAAM,EAAGpB,KAAKP,IAAI,EAAGumD,EAFnD,KAGb8mF,EAAe/pH,EAAS3hB,MAAM6hB,EAHjB,IAiBhB4pH,EAAe/sI,SAChBnC,KAAK+9B,OAAO54B,UAAUquB,KAAM,GAG3B27G,EAAahtI,SACdnC,KAAK+9B,OAAO54B,UAAU2X,QAAS,GAGjCi0C,EAAOprD,QAAQupI,GACfn+E,EAAOprD,QAAQwpI,GAEfp+E,EAAOzqD,QAAQyJ,IACb,MAAM9I,EAAS8I,EAAG3D,QAAQnF,OAAOkgB,WACjCnnB,KAAKovI,aAAanoI,KAGpBjH,KAAKqvI,aAQLrvI,KAAK+9B,OAAOyK,UAAYumG,EAAaj/E,UAAYm/E,EAEjDjvI,KAAKsuD,IAAI,aAAcogF,YAAYh6F,MAAQ+5F,MAM1C,MAiBE,KAAAa,iBAAmB,KACxBtvI,KAAK8tI,cAAc,QAGd,KAAAA,cAAgB,CAACrzC,EAAmB,YACzC,IAAGz6F,KAAK+9B,OAAO54B,UAAUs1F,GAMlB,OAAGz6F,KAAK6tI,mBAA2B7tI,KAAK6tI,oBAE/C7tI,KAAKsuD,IAAI,gBAAiBmsC,GACnBz6F,KAAKuvI,YAAY90C,IARnBz6F,KAAKmuI,cACNnuI,KAAKmuI,gBApjCTnuI,KAAKwvI,eAAiB,aAAa,MAAM,GAEzCxvI,KAAKyvI,eAAiBzvI,KAAKkvE,QAAQkP,KAAKvuE,cAAc,UAEtD7P,KAAKkvE,QAAQs+D,oBAAsBxtI,KAAKkvE,QAAQkP,KAAKttE,cAErD9Q,KAAKwlD,mBAAqB9wB,GAAS10B,KAAK+tI,oBAAqB,KAAK,GAAO,GAEzE,MAAM2B,EAAaxvI,SAASC,cAAc,OAC1CuvI,EAAWtvI,UAAUC,IAAI,4BACzBqvI,EAAW3lI,OAAO/J,KAAKkvE,QAAQjvE,WAwB5B,uBACDimD,GAAe,CACblxC,QAAShV,KAAKkvE,QAAQjvE,UACtBsnC,QAAUL,IACR,MAAMmoB,EAASlhD,EAAUkhD,SACzBlhD,EAAU+4B,EAAQ,EAAImoB,EAAS,EAAIA,EAAS,MAKlDrvD,KAAK0wE,YAAY,GACjB1wE,KAAK2vI,UAAU,CACbxgI,GAAInP,KAAKusE,SACT3+D,MAAO,GACPya,QAAS,eAAK,4BACdokD,WAAY,IAGdzsE,KAAK0zH,WAAa1zH,KAAKqwE,YAAYrwE,KAAKusE,UACxCvsE,KAAK+9B,OAAS/9B,KAAKwwE,YAAYxwE,KAAKusE,UAkBpC3jE,EAAA,QAAU5H,iBAAiB,gBAAiB,KAE1C+yB,EAAA,QAAgBC,WAAWnzB,KAAMozB,IAC/Bj0B,KAAK4tI,0BAA2B,EAEhC,IAAgBzjI,QAChB,IAAgBA,QAEhB,MACM2pD,EADiB,IAAmByV,eACXzV,QAC/B,IAAI,MAAMyY,KAAYzY,EACpBlrD,EAAA,QAAU6F,cAAc,qBAAsB,CAC5CrH,EAAG,qBACH+H,IAAKo9D,IAIT,IAAmBpiE,QAUnBnK,KAAK0zH,WAAWvpH,QAChBnK,KAAK2wE,cACL3wE,KAAK4vI,cAAc37G,OAIvB,MAAM47G,EAAoB,IAAI,IAAY7vI,KAAKkvE,QAAQs+D,qBACvDkC,EAAWjwH,QAAQzf,KAAKkvE,QAAQs+D,qBAChC,MAAMr/H,EAAY,OAAAshD,EAAA,GAAezvD,KAAKkvE,QAAQkP,KAAMp+E,KAAKkvE,QAAQjvE,UAAW,CAACkP,EAAIugD,KAK/EvgD,GAAMugD,EAAWtjD,QAAQmgE,UAAY,EAElCvsE,KAAKusE,WAAap9D,IAErBnP,KAAKqwE,YAAYlhE,GAAIhF,QACrBnK,KAAK0wE,YAAYvhE,GACjBnP,KAAK2wE,gBACJ,KACD,IAAI,MAAM3oE,KAAYhI,KAAKqwE,aACrBroE,IAAahI,KAAKusE,UACpBvsE,KAAKqwE,YAAYroE,GAAUmC,cAG9BzF,EAAWmrI,GAGb7vI,KAAKkvE,QAAQkP,KAAK19D,kBAAkCua,QACrD,IAAmB5U,YACnB0N,EAAA,QAAgBC,WAAWnzB,KAAMozB,GACxBj0B,KAAK4vI,cAAc37G,IAkB5B,IAAI,GAA0Bj0B,KAAKmS,gBACnCnS,KAAKmS,eAAepI,OAAO2lI,GAE3BlkI,WAAW,KACTyuC,GAAA,EAAaiI,qBACZ,KAGL,eACE,OAAOliD,KAAK0zH,WAAW9pH,KAGlB,YAAY2iE,GACjBvsE,KAAKusE,SAAWA,EAChBvsE,KAAKotI,SAAW,IAAmB3jE,eAAiB,IAAmBA,eAAeqmE,kBAAkB9vI,KAAKusE,UAAY,QACzH3jE,EAAA,QAAU2jE,SAAWA,EAGf,gBAAgBv3D,EAAsBo2H,GAC5C,MACM2E,EAAe/6H,EAAQ5U,UAAUuR,SADrB,cAEjBo+H,GAAgB3E,GAAUp2H,EAAQ5U,UAAUC,IAF3B,aAGlB,aAAc2U,EAAS,aAAco2H,EAAQ,IAAKA,OAAS1mI,EAAY,KACrEsQ,EAAQ5U,UAAUuB,OAJF,cAKfypI,IAAW2E,EAAe,EAAI,GAG3B,gBACNnnI,EAAA,QAAU5H,iBAAiB,cAAgBoR,I,MAGzC,MAAMnL,EAASmL,EAAO+U,WAChBrb,EAAM9L,KAAKgwI,aAAa/oI,GAC9B,GAAG6E,IAAQ,IAAgBinF,MAAM3gF,IAAWnL,IAAW2B,EAAA,QAAU6O,KAAM,CACrE,MACM2zH,EAA4B,sBAAR,QAAX,EADF,IAAgB9mG,QAAQlyB,GACjBqzC,cAAM,eAAEr+C,GAC5BpH,KAAKiwI,gBAAgBnkI,EAAI2qB,SAAU20G,MAIvCxiI,EAAA,QAAU5H,iBAAiB,cAAgBgR,IACzC,MAAM/K,EAAS+K,EAAOmV,UAAS,GACzBtb,EAAS,IAAmBqoF,cAAcjtF,GAC7C4E,GACD7L,KAAKkwI,2BAA2BrkI,KAapCjD,EAAA,QAAU5H,iBAAiB,gBAAkBorE,IAC3CpsE,KAAKmwI,qBAAqB/jE,EAAOj9D,MAGnCvG,EAAA,QAAU5H,iBAAiB,kBAAoBoR,IAC7CpS,KAAKquI,gBAAkBruI,KAAKquI,eAAej8H,EAAO+U,cAGpDve,EAAA,QAAU5H,iBAAiB,eAAgB,EAAEiG,aAC3C,MAAM4E,EAAS,IAAmBqoF,cAAcjtF,GAC7C4E,IACD7L,KAAKqM,eAAeR,OAAQnH,OAAWA,OAAWA,OAAWA,OAAWA,GAAW,GACnF1E,KAAKowI,wBAAwBvkI,GAC7B7L,KAAKqwI,2BAITznI,EAAA,QAAU5H,iBAAiB,sBAAwBy6B,IACjD,IAAI,MAAMx0B,KAAUw0B,EAAS,CAC3B,MAAM5vB,EAAS4vB,EAAQx0B,GACvBjH,KAAKswI,aAAazkI,GAEf7L,KAAKquI,gBACNruI,KAAKquI,eAAepnI,EAAOkgB,YAG7BnnB,KAAKowI,wBAAwBvkI,MAIjCjD,EAAA,QAAU5H,iBAAiB,cAAe,EAAEiG,aAC1CjH,KAAKovI,aAAanoI,GAEfjH,KAAKquI,gBACNruI,KAAKquI,eAAepnI,KAIxB2B,EAAA,QAAU5H,iBAAiB,gBAAiB,EAAEiG,aAC5C,MAAM4E,EAAS,IAAmBqoF,cAAcjtF,GAC7C4E,IACD7L,KAAKuwI,kBAAkB1kI,GACvB7L,KAAKowI,wBAAwBvkI,MAIjCjD,EAAA,QAAU5H,iBAAiB,yBAA2B6K,IACpD7L,KAAKuwI,kBAAkB1kI,GACvB7L,KAAKqwI,0BAGPznI,EAAA,QAAU5H,iBAAiB,eAAgB,EAAE6K,SAAQozH,OAAMh4H,aACtDg4H,EACDj/H,KAAK0zH,WAAWrlH,OAAOpH,GAEvBjH,KAAKswI,aAAazkI,GAGjB7L,KAAKquI,gBACNruI,KAAKquI,eAAepnI,KAIxB2B,EAAA,QAAU5H,iBAAiB,eAAiBiG,IAE1C,IAAI,MAAM+N,KAAWhV,KAAKytI,mBACrBz4H,EAAQ5I,QAAQnF,OAAOkgB,aAAelgB,GACvCjH,KAAKwwI,gBAAgBx7H,GAAS,GAIjB7M,MAAMC,KAAKlI,SAAS4P,iBAAiB,0CAA0C7I,QACvFX,QAAQ0O,IACfhV,KAAKwwI,gBAAgBx7H,GAAS,OAKlCpM,EAAA,QAAU5H,iBAAiB,gBAAkB4G,IAC3C,IAAI5H,KAAKksE,gBAAgBtkE,EAAOuH,IAE9B,YADAnP,KAAK2vI,UAAU/nI,GAEV,GAAGA,EAAOuH,KAAOnP,KAAKusE,SAAU,CACrC,MAAM9wC,EAAU,IAAmBguC,eAAegnE,kBAAiB,GACnEzwI,KAAK0wI,wBACL,IAAI,IAAI1lI,EAAI,EAAG7I,EAASs5B,EAAQt5B,OAAQ6I,EAAI7I,IAAU6I,EAAG,CACvD,MAAMa,EAAS4vB,EAAQzwB,GACvBhL,KAAKswI,aAAazkI,IAIL7L,KAAKksE,gBAAgBtkE,EAAOuH,IACpCvB,MAAM3J,UAAY,IAAkB6nB,cAAclkB,EAAOgG,SAGpEhF,EAAA,QAAU5H,iBAAiB,gBAAkB4G,IAC3C,MAAMqf,EAAWjnB,KAAKksE,gBAAgBtkE,EAAOuH,IACzC8X,IAIHjnB,KAAKkvE,QAAQkP,KAAK19D,kBAAkCua,QAErDhU,EAAShnB,UAAU0B,SACnBslB,EAASm3D,KAAKz8E,gBAEP3B,KAAKqwE,YAAYzoE,EAAOuH,WACxBnP,KAAKwwE,YAAY5oE,EAAOuH,WACxBnP,KAAKksE,gBAAgBtkE,EAAOuH,IAEhC6H,OAAOy0C,KAAKzrD,KAAKksE,iBAAiB/pE,QAAU,GAC7CnC,KAAKkvE,QAAQs+D,oBAAoBptI,UAAUC,IAAI,WAInDuI,EAAA,QAAU5H,iBAAiB,eAAiBgsE,IAC1C,MAAM2jE,EAAoB3wI,KAAKkvE,QAAQkP,KACvCpR,EAAM1mE,QAASimE,IACb,MAAM3kE,EAAS,IAAmB2hE,eAAeiD,UAAUD,GACrDqkE,EAAiB5wI,KAAKksE,gBAAgBK,GAEzBvsE,KAAKqwE,YAAY9D,GACzB6gE,SAAW,IAAmB3jE,eAAeqmE,kBAAkBvjE,GAE1EjoB,GAAuBssF,EAAexyD,KAAMuyD,EAAmB/oI,EAAO6kE,YACtEnoB,GAAuBssF,EAAe3wI,UAAWD,KAAKkvE,QAAQjvE,UAAW2H,EAAO6kE,cAGlFzsE,KAAKotI,SAAW,IAAmB3jE,eAAeqmE,kBAAkB9vI,KAAKusE,YAQ3E3jE,EAAA,QAAU5H,iBAAiB,eAAgB,EAAEiG,SAAQ+4H,cACnD,MAAMn0H,EAAS,IAAmBqoF,cAAcjtF,GAC5C4E,IAEDm0H,EAAQ79H,OACTnC,KAAKygF,UAAU50E,GAEf7L,KAAK6wI,YAAYhlI,MAKf,gBAAgBM,EAAqBwjC,GAE3C,MAAM7jC,EAAMK,EAAO2kI,UACnB3kI,EAAO/L,UAAUkM,OAAO,SAAUqjC,GAC/BA,EACD3vC,KAAKytI,mBAAmBptI,IAAI8L,GAE5BnM,KAAKytI,mBAAmBp/H,OAAOlC,IAG9BL,aAAG,EAAHA,EAAKilI,WACNjlI,EAAIilI,SAAS7mI,UAAUylC,GAIb,cAAc1b,G,0CAC1B,KAAwB+8G,4BAEpBhxI,KAAK2tI,kBACP3tI,KAAKixI,gBACLjxI,KAAK2tI,iBAAkB,GAGzB,MAAMuD,EAAuB,IAAmB3nE,eAAeC,mBAAmB3oE,KAAMizD,IACtF,IAAI,MAAMlsD,KAAUksD,EAClB9zD,KAAK2vI,UAAU/nI,KAenB,OAXGqsB,EAAM6/B,SAAW98C,OAAOy0C,KAAKx3B,EAAM6/B,SAAS3xD,eACvC+uI,EACHlxI,KAAKmxI,2BACAnxI,KAAKmxI,qBAIZp9G,EAAA,QAAgBq9G,gBAAgB31G,QAAQt5B,QACzC,KAAiBkvI,mBAGZrxI,KAAK8tI,gBAAgBjtI,KAAK,KAC/B,IAAmBywI,yBAgBf,eAAe72C,GACrB,MAAO,CAACn+E,MAAOtc,KAAK+9B,OAAO54B,UAAUs1F,GAAQ,EAAIz6F,KAAK0tI,QAAQjzC,IAGxD,yBAAyB5uF,GAC/B,QAAyBnH,IAAtBmH,EAAO0lI,aAA6BvxI,KAAKwxI,oBAAoB3lI,GAAS,OAAO,EAEhF,MAAM4lI,EAAYzxI,KAAK0xI,eAAe,OAChCC,EAAe3xI,KAAK0xI,eAAe,UAEzC,IAAID,EAAUn1H,QAAUq1H,EAAar1H,MACnC,OAAO,EAGT,MAAMA,EAAQzQ,EAAO7L,KAAKotI,UAC1B,QAASqE,EAAUn1H,OAASA,GAASm1H,EAAUn1H,UAAYq1H,EAAar1H,OAASA,GAASq1H,EAAar1H,OAGjG,aAAarV,GACnBjH,KAAK0zH,WAAWrlH,OAAOpH,GAGjB,aAAa4E,GACnB,IAAG7L,KAAK4xI,yBAAyB/lI,GAO/B,YADA7L,KAAKovI,aAAavjI,EAAO5E,QALzB,IAAIjH,KAAK0zH,WAAW/rH,IAAIkE,EAAO5E,QAE7B,YADAjH,KAAK0zH,WAAWrzH,IAAIwL,EAAO5E,QAQ/B,MAAM6E,EAAM9L,KAAKgwI,aAAankI,EAAO5E,QAClC6E,IACD9L,KAAKqM,eAAeR,OAAQnH,EAAWoH,OAAKpH,OAAWA,OAAWA,GAAW,GAC7E1E,KAAK0zH,WAAW3yF,OAAOl1B,EAAO5E,SAc1B,qBAAqBslE,G,MAC3B,MAAMslE,EAA0B,IAAbtlE,EAAiBvsE,KAAKyvI,eAA+C,QAA9B,EAAAzvI,KAAKksE,gBAAgBK,UAAS,eAAE2oB,OAC1F,IAAI28C,EACF,OAGF,MAAMzlE,EAAS,IAAmB3C,eAAeqoE,UAAUvlE,GACrDwlE,EAA4B,IAAbxlE,KAAoBH,EAAO3wC,QAAQhrB,KAAK5E,IACnDA,EAAOkoG,cAAgBloG,EAAOyL,OAAO68E,eAAiB,KAAwB/uD,iBAAiBv5B,EAAO5E,QAAQ,IAGxH4qI,EAAWzxI,UAAUkM,OAAO,cAAeylI,GAE3C,MAAMpiH,EAAMy8C,EAAO8F,mBACnB2/D,EAAWtoH,UAAYoG,EAAM,GAAKA,EAAM,GAGlC,wBACN,IAAI,MAAM48C,KAAYvsE,KAAKksE,gBACzBlsE,KAAKmwI,sBAAsB5jE,GAG7BvsE,KAAKmwI,qBAAqB,GAMpB,wBACN,MAAMvoI,EAAS,IAAmB2hE,eAAeiD,UAAUxsE,KAAKusE,WAAa,KAC7EvsE,KAAK0zH,WAAWse,SAAS1rI,QAAS0O,IAChC,MAAMnJ,EAAS,IAAmBqoF,cAAcl/E,EAAQ7F,IACpDnP,KAAKwxI,oBAAoB3lI,EAAQjE,IACnC5H,KAAKovI,aAAap6H,EAAQ7F,MAQxB,wBAAwBtD,EAAgBjE,GAC1C5H,KAAKgwI,aAAankI,EAAO5E,UAIzBjH,KAAKwxI,oBAAoB3lI,EAAQjE,IACnC5H,KAAKovI,aAAavjI,EAAO5E,SAItB,oBAAoB4E,EAAgBjE,EAAS,IAAmB2hE,eAAeiD,UAAUxsE,KAAKusE,WACnG,SAAI1gE,GACDjE,IAAW,IAAmB2hE,eAAeioE,oBAAoB3lI,EAAQjE,KACxEA,GAAU5H,KAAKusE,WAAa1gE,EAAOs+H,WAOlC,mBAAmBvgI,EAAwB2iE,GAChD,MAAMxhE,EAAa,IAAI,IAAW,KAAM,KAAM,KAC9CA,EAAW9K,UAAUe,iBAAiB,SAAUhB,KAAKuuI,sBACrDxjI,EAAW9K,UAAUmM,QAAQmgE,SAAW,GAAKA,EAC7CxhE,EAAWolF,cAAgBnwF,KAAKsvI,iBAChCvkI,EAAWM,iBAAmBrL,KAAK8tI,cACnC/iI,EAAWG,oBAAoBtB,GAE/B,MAAMqoI,EAAmB,IAAI,GAC3BroI,EACA,IAAmB6/D,eAAiB,IAAmBA,eAAeqmE,kBAAkBvjE,GAAY,QACpGvsE,KAAKwlD,oBASP,OANAxlD,KAAKwwE,YAAYjE,GAAYxhE,EAC7B/K,KAAKqwE,YAAY9D,GAAY0lE,EAKtBlnI,EAGD,UAAUnD,GAChB,GAAG5H,KAAKksE,gBAAgBtkE,EAAOuH,IAAK,OAEpC,MAAM+/C,EAAUhvD,SAASC,cAAc,OACvC+uD,EAAQ9uD,UAAUC,IAAI,4BACtB,MAAM8uD,EAAOjvD,SAASC,cAAc,QAC9BoyD,EAAYryD,SAASC,cAAc,QACzCoyD,EAAUnyD,UAAUC,IAAI,cACrBuH,EAAOygB,QAASkqC,EAAUxoD,OAAOnC,EAAOygB,SACtCkqC,EAAUtuD,UAAY,IAAkB6nB,cAAclkB,EAAOgG,OAClE,MAAMikI,EAAa3xI,SAASC,cAAc,OAC1C0xI,EAAWzxI,UAAUC,IAAI,QAAS,WAAY,iBAC9C,MAAM2K,EAAI9K,SAASC,cAAc,KACjCgvD,EAAKplD,OAAOwoD,EAAWs/E,EAAY7mI,GACnCkkD,EAAQnlD,OAAOolD,GACf,OAAA7xC,GAAA,QAAO4xC,GAGP5K,GAAuB4K,EADGlvD,KAAKkvE,QAAQkP,KACYx2E,EAAO6kE,YAG1D,MAAMd,EAAK3rE,KAAK6J,iBACVkB,EAAa/K,KAAKuwE,mBAAmB5E,EAAI/jE,EAAOuH,IAEtDpE,EAAW9K,UAAUG,UAAUC,IAAI,WAAY,kBAK/C,MAAMmzB,EAAMtzB,SAASC,cAAc,OACnCqzB,EAAIpzB,UAAUC,IAAI,gBAElB,MAAMyc,EAAS5c,SAASC,cAAc,OACtC2c,EAAO1c,UAAUC,IAAI,mBAErBmzB,EAAIzpB,OAAO4hE,GACX5gE,EAAW9K,UAAU8J,OAAOypB,EAAK1W,GAIjC,MAAM0P,EAAMzhB,EAAW9K,UAEvBqkD,GAAuBv5C,EAAW9K,UAAWD,KAAKkvE,QAAQjvE,UAAW2H,EAAO6kE,YAE5EzsE,KAAKgK,qBAAqB2hE,EAAI,MAAM,GAEpC3rE,KAAKksE,gBAAgBtkE,EAAOuH,IAAM,CAChCivE,KAAMlvB,EACNjvD,UAAWusB,EACX0oE,OAAQ28C,EACRjkI,MAAO2kD,IAGLvyD,KAAKmxI,oBAAsBn6H,OAAOy0C,KAAKzrD,KAAKksE,iBAAiB/pE,OAAS,IACxEnC,KAAKmxI,mBAAqB,IAAItuI,QAAeoD,IAC3CsF,OAAOC,WAAW,KAChBxL,KAAKmxI,wBAAqBzsI,EACvBsS,OAAOy0C,KAAKzrD,KAAKksE,iBAAiB/pE,OAAS,IAC5CnC,KAAKkvE,QAAQs+D,oBAAoBptI,UAAUuB,OAAO,QAClD3B,KAAKqwI,yBAEPpqI,KACC,MAKD,YAAYw0F,GAKlB,GAAGz6F,KAAK6tI,mBAAqC,OAAO7tI,KAAK6tI,mBAEzD,MAAM1nI,EAAU,IAAItD,QAAoBoD,GAAY,mCAClD,MAAM,SAACqqE,EAAQ,SAAE/D,EAAQ,SAAE6gE,GAAYptI,KAKvC,IAAI+E,EAAY62B,GAAA,EAAWj7B,OAAS,GAAK,KAAO,EAC5C24B,EAAc,EAElB,MAAOhd,MAAO41H,GAAsBlyI,KAAK0xI,eAAej3C,GACxD,GAAGy3C,EACD,GAAY,QAATz3C,EAAgB,CACjB,MAAM5xF,EAAU,IAAmB4gE,eAAeC,iBAAiB6C,GAAU,GACvEjwD,EAAQzT,EAAQsM,UAAUtJ,GAAUA,EAAOuhI,IAAa8E,GACxDC,EAAY9vI,KAAKP,IAAI,EAAGwa,EAAQvX,GACtCA,EAAYuX,EAAQ61H,EACpB74G,EAAczwB,EAAQspI,GAAW/E,GAAY,OAE7C9zG,EAAc44G,EAMlB,IAGE,MAAME,EAAyB,IAAmBr2G,iBAAiB,GAAIzC,EAAav0B,EAAWwnE,GAAU,GACzG,IAAI6lE,EAAuBt5H,SAAWw3D,EAASrmE,kBAAmB,CAC9CqmE,EAASx/D,cACjB/G,OAAO/J,KAAKwvI,gBAGxB,MAAMnpI,QAAe+rI,EAAuBjsI,QAE5C,GAAGnG,KAAK6tI,qBAAuB1nI,EAC7B,OAmBF,GAVY,WAATs0F,EACEp0F,EAAOg2B,QACRr8B,KAAK+9B,OAAO54B,UAAUs1F,IAAQ,GAExBp0F,EAAOgsI,WACfryI,KAAK+9B,OAAO54B,UAAUs1F,IAAQ,GAGhCz6F,KAAK4tI,0BAA2B,EAE7BvnI,EAAOo1B,QAAQt5B,OAAQ,CACxB,MAAMs5B,EAAmB,QAATg/D,EAAiBp0F,EAAOo1B,QAAQh4B,QAAQqB,UAAYuB,EAAOo1B,QAErE3R,EAA+B,GAE/BwoH,EAA4B,GAC5BC,EAAQl7G,IACZi7G,EAAU3sI,KAAK0xB,IAGjBoE,EAAQn1B,QAASuF,IAGf,IADwB,IAAmBqoF,cAAcroF,EAAO5E,QAE9D,OAGF,MAAM+N,EAAUhV,KAAK0zH,WAAWrzH,IAAIwL,EAAO5E,QAAQ,EAAMsrI,GAAM,GAC5Dv9H,EAAQ8U,cACTA,EAAankB,QAAQqP,EAAQ8U,sBAI3BjnB,QAAQC,IAAIgnB,GAAczI,UAEhCixH,EAAUhsI,QAAQ+wB,GAAYA,UAE9Br3B,KAAKwlD,qBAGP,MAAMgtF,EAAensI,EAAOo1B,QAAiB,QAATg/D,EAAiB,EAAIp0F,EAAOo1B,QAAQt5B,OAAS,GAC9EqwI,IACDxyI,KAAK0tI,QAAQjzC,GAAQ+3C,EAAapF,IAGpCptI,KAAKsuD,IAAIwwD,MAAM,cAAgB/5G,EAAY,sBAAuBu0B,EAAajzB,EAAQiqE,EAASrmE,mBAEhGuB,WAAW,KACTxL,KAAK+9B,OAAO6D,YACX,GACH,MAAMn1B,GACNzM,KAAKsuD,IAAI3hD,MAAMF,GAGdzM,KAAKwvI,eAAe1+H,eACrB9Q,KAAKwvI,eAAe7tI,SAGtBsE,QACCob,QAAQ,KACTrhB,KAAK6tI,wBAAqBnpI,IAG5B,OAAO1E,KAAK6tI,mBAAqB1nI,EAG3B,yBAAyBnD,GAM/B,MAAM2kC,EAAa,oBACb1nC,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAUC,IAAIsnC,EAAYA,EAAa,IAAM3kC,EAAQyvI,eAE/D,MAAMhlI,EAASvN,SAASC,cAAc,OACtCsN,EAAOrN,UAAUC,IAAIsnC,EAAa,WAClC,gBAAMl6B,EAAQzK,EAAQ4K,OAEtB,MAAM8d,EAAWxrB,SAASC,cAAc,OAQxC,OAPAurB,EAAStrB,UAAUC,IAAIsnC,EAAa,aACjC3kC,EAAQ0oB,UACT,gBAAMA,EAAU1oB,EAAQ0oB,SAAU1oB,EAAQ0vI,cAG5CzyI,EAAU8J,OAAO0D,EAAQie,GAElB,CAACzrB,YAAWwN,SAAQie,YAGrB,2BACN,GAAqB,IAAlB1rB,KAAKusE,SACN,OAGF,MAAM+D,EAAWtwE,KAAKswE,SAChBue,EAAOve,EAASx/D,cACtB,IAAI6hI,EAAwBxqI,MAAMC,KAAKymF,EAAKzpE,UAA4B3U,KAAKV,GAAMA,EAAG8W,QAAQ,uBAC9F,MAAM+wF,EAAkB53G,KAAK+9B,OAAO54B,UAAU2X,SAAWwzD,EAASrmE,kBAGlE,GAAG2tG,GAAmB+6B,EACpB,OACK,IAAI/6B,EAMT,YALG+6B,IACD9jD,EAAKzuF,UAAUuB,OAAO,oBACtBgxI,EAAqBhxI,WAMzB,IAAIiL,EACJ,GAAI5M,KAAKusE,SAoCF,CACL3/D,EAAc5M,KAAK4yI,yBAAyB,CAC1ChlI,MAAO,yBACP8d,SAAU,6BACV+mH,cAAe,WAGjBE,EAAuB/lI,EAAY3M,UAEnC0yI,EAAqBlzH,QpJ0cpB,UAA0B,MAAC85B,EAAK,MAAE74C,EAAK,OAAEC,IAO9C,MAAMV,EAAYC,SAASC,cAAc,OAEnC8T,EAAM,GAAmB2lC,wBAAwBL,GAiBvD,OAhBGtlC,EACDsY,GAAY,CACVtY,MACAuY,IAAKvsB,EACLO,MAAM,EACNiB,MAAM,EACNf,QACAC,SACA44C,UACC14C,KAAK,QAIRZ,EAAUG,UAAUC,IAAI,yBAGnB,CAACJ,aoJpeyB4yI,CAAiB,CAC5Ct5F,MAAO,KACP74C,MAAO,IACPC,OAAQ,MACPV,WAEH,MAAM4a,EAAS,YAAO,kDAAmD,CACvEqC,KAAM,mBACN7P,KAAM,aAGR,YAAiBwN,EAAQ,KACvB,IAAI,GAAiB,IAAgB9J,KAAK,IAAmBw4D,eAAeiD,UAAUxsE,KAAKusE,aAG7FomE,EAAqB5oI,OAAO8Q,OA5DX,CACjBjO,EAAc5M,KAAK4yI,yBAAyB,CAC1ChlI,MAAO,uCACP6kI,cAAe,YAGjBE,EAAuB/lI,EAAY3M,UAEnC,MAAMmqB,EAAMlqB,SAASC,cAAc,OACnCiqB,EAAIhqB,UAAUC,IAAI,kCAElBwC,QAAQC,IAAI,CACV,IAAgB4lE,cAAc7nE,KAAKi1D,IACjC,IAAIvnD,EAAkBN,EAEnB6nD,EAAM3zD,QACPoM,EAAM,0CACNN,EAAO,CAAC,eAAK,iBAAkB,CAAC6nD,EAAM3zD,YAEtCoM,EAAM,oDACNN,EAAO,IAGU,IAAI,UAAKusD,YAAY,CACtCjsD,MACAN,OACA+G,QAASpI,EAAY8e,aAGzB,OAAAi0B,GAAA,GAA0Bv1B,EAAK,6BAC/B,iBACCvpB,KAAK,KACN8xI,EAAqBvyI,UAAUC,IAAI,aAGrCsyI,EAAqBlzH,QAAQ2K,GA4B/BykE,EAAK9kF,OAAO4oI,GACZ9jD,EAAKzuF,UAAUC,IAAI,oBAGb,4BACN,MAAMiwE,EAAWtwE,KAAKswE,SAChBtoD,EAAQsoD,EAASx/D,cAAcA,cAC/BgM,EAASwzD,EAASx/D,cAAcymB,mBACtCvP,EAAM5nB,UAAUuB,OAAO,iBACvBmb,EAAO7Y,UAAY,GACnBjE,KAAKmuI,kBAAezpI,EACpB1E,KAAKquI,oBAAiB3pI,EA4MhB,aACN,MAAM4rE,EAAWtwE,KAAKswE,SAChBwiE,EAAc9yI,KAAK+yI,qBAAqBziE,EAAS5vD,mBACjDsyH,EAAahzI,KAAK+yI,qBAAqBziE,EAASl/B,kBAEhDg8F,EAAWptI,KAAKotI,SACtBptI,KAAK0tI,QAAQl6G,IAAMs/G,EAAY1F,GAC/BptI,KAAK0tI,QAAQ5wH,OAASk2H,EAAW5F,GAG3B,qBAAqBp4H,GAC3B,OAAO,IAAmBk/E,cAAcl/E,EAAQ5I,QAAQnF,OAAOkgB,YAoB1D,qBAAqBvd,EAAwBD,EAAsBspI,GAAc,EAAOvpI,GAAa,EAAOwpI,GAAY,GAC7H,IAAIC,EAEJ,MAAMC,GAAeF,EAAY,GAAa7sF,aAAe,GAAa/a,SAAS/kC,KAAK,IAExFqD,EAAKwC,QAAQ1C,WAAa,KAAMA,EAChCE,EAAK5I,iBAAiB,YAAciB,IAClC,GAAgB,IAAbA,EAAE4Y,OAAc,OAGnB7a,KAAKsuD,IAAI,sBACT,MAAMz5C,EAAS5S,EAAE4S,OACX9Q,EAAO,OAAA08B,GAAA,GAAU5rB,EAAQ,MAE/B,GAAI9Q,EAAJ,CAIA,GAAG2F,EAAY,CACb,MAAM2pI,EAAcF,IAA0BpvI,EAC3CovI,IAA0BE,GAC3BF,EAAsB/yI,UAAUuB,OAAO,UAGtCoC,IACDA,EAAK3D,UAAUC,IAAI,UACnB8yI,EAAwBpvI,EACxB/D,KAAKytI,mBAAmBptI,IAAI0D,IAIhC,GAAGA,EAAM,CACJ4F,GAASA,IAEZ,MAAM1C,EAASlD,EAAKqI,QAAQnF,OAAOkgB,WAC7B8iE,GAAalmF,EAAKqI,QAAQvF,UAAOnC,EAEvC0uI,EAAYnsI,EAAQgjF,QAEpBmpD,EAAY,QAEb,CAACjoH,SAAS,IAEV,MACDvhB,EAAK5I,iBAAiB,WAAaiB,IACjC,MAAM+4B,EAAK,OAAAyF,GAAA,GAAUx+B,EAAE4S,OAAQ,MAC/B,GAAGmmB,EAAI,CACL,MAAM/zB,EAAS+zB,EAAG5uB,QAAQnF,OAAOkgB,WACjCnnB,KAAKsuD,IAAI,gBAAiB,IAAmBglF,kBAAkBrsI,OAKlEgsI,GACD,aAA0BrpI,EAAM5J,KAAKslH,YAAYx3D,eAI9C,eAAe9qD,EAMlB,IACF,MAAM4G,EAAO1J,SAASC,cAAc,MAgBpC,OAfAyJ,EAAKxJ,UAAUC,IAAI,YAGhB2C,EAAQ87B,KACTl1B,EAAKxJ,UAAUC,IAAI,gBAGlB2C,EAAQquH,YACTznH,EAAKxJ,UAAUC,IAAI,YAAc2C,EAAQquH,YAOpCznH,EAGF,eACLiC,EACA0nI,EACAznI,EACA0nI,EACA1pH,EACAyjH,GAAU,EACVkG,GAAY,GAGZ,IAAI3nI,KACFA,EAAM9L,KAAKgwI,aAAankI,EAAO5E,SAI7B,OAIJ,IAAIysI,EASJ,GARIH,IACC1nI,EAAO6mG,OAA4B,iBAAnB7mG,EAAO6mG,MAAMtrG,IAC9BssI,EAAe7nI,EAAO6mG,OAGxB6gC,EAAc,IAAmB/5H,iBAAiB3N,EAAO5E,OAAQ4E,EAAO2+H,cAGrD,iBAAlB+I,EAAYnsI,EASb,OARA0E,EAAIwG,gBAAgBrO,UAAY,GAChC6H,EAAI6nI,aAAa1vI,UAAY,UACtB6H,EAAIK,OAAOC,QAAQvF,SAEvB4sI,GACDzzI,KAAKuwI,kBAAkB1kI,EAAQC,EAAKyhI,IAMxC,MAAMtmI,EAAS4E,EAAO5E,OAK2C,CAE/D,IAAI47F,EACJ,IAAI0wC,EAAY74G,UAAYg5G,EAAc,CACxC,MAAM5gI,EAA8B,IAAmByC,oBAAoBg+H,GAC3E,GAAGzgI,IAAsB,UAAZA,EAAM1L,GAAkB,CAAC,QAAS,OAAgC2yB,SAASjnB,EAAM3P,OAAQ,CACpG,MAAMrD,EAAO,IAAiB6sB,gBAAgB7Z,EAAO,GAAI,IAEzD,GAAc,mBAAXhT,EAAKsH,IACNy7F,EAAiB3iG,SAASC,cAAc,OACxC0iG,EAAeziG,UAAUC,IAAI,yBAE7BspB,GAAU,CACRnlB,MAAOsO,EACP1O,QAASmvI,EACTtzI,UAAW4iG,EACX94E,kBAAkB,EAClBjqB,OACAgqB,iBAGgC,UAA9BhX,EAAqB3P,MAAkB,CACzC,MAAMywI,EAAW1zI,SAASC,cAAc,QACxCyzI,EAASxzI,UAAUC,IAAI,cAEvBwiG,EAAe94F,OAAO6pI,KAM9B,MAAMC,IAAqBhxC,MAAoB0wC,aAAW,EAAXA,EAAanvI,SAE5D,IAAIwyB,EAkBJ,GAhBEA,EADC48G,GAAiBD,EAAYnvI,QACnB,IAAmB8nB,oBAAoBqnH,OAAa7uI,OAAWA,GAAW,EAAO8uI,EAAeK,GACnGH,EACG,IAAmBxnH,oBAAoBwnH,GACzCH,EAAY74G,QAGVx6B,SAAS22B,yBAFT,IAAmB3K,oBAAoBqnH,OAAa7uI,OAAWA,GAAW,OAAOA,EAAWmvI,GAKtGhxC,GACDjsE,EAASnX,QAAQojF,GAGnB,OAAAt2F,EAAA,GAAeT,EAAIwG,gBAAiBskB,GAGjC88G,EAAc,CACf,MAAMn+B,EAAOr1G,SAASC,cAAc,KACpCo1G,EAAKn1G,UAAUC,IAAI,UACnBk1G,EAAKxrG,OAAO,eAAK,SAAU,MAC3B+B,EAAIwG,gBAAgBmN,QAAQ81F,QACvB,GAAGtuG,EAAO42B,aAAe52B,IAAWssI,EAAY3nI,SAAW2nI,EAAYhvI,OAAQ,CACpF,MAAMuvI,EAAS,IAAgBr5G,QAAQ84G,EAAY3nI,QACnD,GAAGkoI,GAAUA,EAAO3kI,GAAI,CACtB,MAAM4kI,EAAa7zI,SAASC,cAAc,KAEvC2zI,EAAO3kI,KAAOvG,EAAA,QAAU6O,KACzBs8H,EAAWhqI,OAAO,eAAK,YAGvBgqI,EAAWhqI,OAAO,IAAI,KAAU,CAC9B9C,OAAQssI,EAAY3nI,OACpBwnD,eAAe,IACdp+C,SAGL++H,EAAWhqI,OAAO,MAElB+B,EAAIwG,gBAAgBmN,QAAQs0H,KAKlC,IAAIR,EAAY74G,SAAWg5G,EAAwD,CACjF,MAAMvrH,EAAOurH,EAAerxI,KAAKP,IAAI4xI,EAAavrH,KAAMorH,EAAYprH,MAAQ,GAAKorH,EAAYprH,KAC7F,OAAA5b,EAAA,GAAeT,EAAI6nI,aAAc,aAA8B,IAAIl/F,KAAY,IAAPtsB,UACnErc,EAAI6nI,aAAanhI,YAAc,GAErB,OAAdihI,IACEA,EACDzzI,KAAKuwI,kBAAkB1kI,EAAQC,EAAKyhI,GAEpCzhI,EAAIK,OAAOC,QAAQvF,IAAM0sI,EAAY1sI,KAKnC,kBAAkBgF,EAAgBC,EAAM9L,KAAKgwI,aAAankI,EAAO5E,QAASsmI,GAAU,G,MAC1F,IAAIzhI,EAEF,OAGF,IAAIyhI,EAAS,CACX,MAAM3oG,EAAU,KAAwBQ,iBAAiBv5B,EAAO5E,QAAQ,GAErE29B,IADc94B,EAAIK,OAAO/L,UAAUuR,SAAS,aAE7C,aAAc7F,EAAIK,OAAQ,WAAYy4B,EAAS,KAInD,IAAIovG,EACJ,GAAuB,kBAAR,QAAZ,EAAAnoI,EAAO6mG,aAAK,eAAEtrG,GAAsB,CACrC,MAAMmsI,EAAyB,IAAmB/5H,iBAAiB3N,EAAO5E,OAAQ4E,EAAO2+H,cACrF+I,EAAY74G,SAAW64G,EAAYj8H,OAAO+L,KAAOkwH,EAAYtsI,SAAW2B,EAAA,QAAU6O,OACpFu8H,EAAmBT,ILr8CpB,SACLtzI,EACAmE,EACA6vI,GAEA,IAAIzqI,EAWJ,IAVGpF,aAAO,EAAPA,EAASkT,OAAO+L,OAEf7Z,EADCpF,EAAQkT,OAAOoQ,YACJ,UACJtjB,EAAQkT,OAAO49E,OACX,QAEA,WAIZ1rF,EAEF,YADAvJ,EAAUuS,YAAc,IAI1B,MAAMq+G,EAAgB,SAAWrnH,EAC3BwlI,EAAc/uI,EAAUmxC,iBAC9B,GAAG49F,GAAeA,EAAY5uI,UAAUuR,SAASk/G,GAC/C,OAGF,MAAM77G,EAAU9U,SAASC,cAAc,KACvC6U,EAAQ5U,UAAUC,IAAI,sBAAgDwwH,GACtE5wH,EAAU8J,OAAOiL,GAEdg6H,GACDA,EAAYrtI,SKy6CZuyI,CAAiBpoI,EAAIqoI,WAAYH,GAEjC,MAAMpsI,EAAS,IAAmB2hE,eAAeiD,UAAUxsE,KAAKusE,UAChE,IAAI8lD,EAEFA,EADCzqH,GAC2D,IAAjDA,EAAOohE,cAAczsD,QAAQ1Q,EAAO5E,UAElC4E,EAAOyL,OAAOwiE,OAG7B,MAAM2wD,EAAiB,IAAmBA,eAAe5+H,GACnDuoI,EAAiB/hB,GAAYoY,EAG7B4J,EAAuB,OAAAj2F,GAAA,GAAQtyC,EAAIwoI,aACtCF,IAAmBC,GACpBvoI,EAAI8f,WAAW7hB,OAAO+B,EAAIwoI,aAG5B,MAAMC,EAAmB1oI,EAAOooG,wBAA0BpoG,EAAOooG,sBAAwB,GAAKpoG,EAAOkoG,aAAe,GAC9GygC,EAAwB1oI,EAAI2oI,eAAiB,OAAAr2F,GAAA,GAAQtyC,EAAI2oI,eAC5DF,IACGzoI,EAAI2oI,gBACN3oI,EAAI2oI,cAAgBv0I,SAASC,cAAc,OAC3C2L,EAAI2oI,cAAcjrI,UAAY,6DAC9BsC,EAAI2oI,cAAclrH,UAAY,IAC9Bzd,EAAI8f,WAAW7K,aAAajV,EAAI2oI,cAAe3oI,EAAIwG,gBAAgB8lD,eAIvE,MAAMs8E,EAAqBnH,EAAU,EAAI,IAazC,GAXA,aAAczhI,EAAIwoI,YAAa,aAAcF,EAAgBM,EAAoBN,OAAiB1vI,EAAY,KAC5GoH,EAAIwoI,YAAY3yI,UACd0yI,EAA2B,EAAJ,GAExBvoI,EAAI2oI,eACL,aAAc3oI,EAAI2oI,cAAe,aAAcF,EAAkBG,EAAoBH,OAAmB7vI,EAAY,KAClHoH,EAAI2oI,cAAc9yI,gBACXmK,EAAI2oI,eACTD,EAA4B,EAAJ,IAG1BJ,EACF,OAGC/hB,EACDvmH,EAAIwoI,YAAYl0I,UAAUC,IAAI,oBAAqB,SAEnDyL,EAAIwoI,YAAYl0I,UAAUuB,OAAO,oBAAqB,SAGxD,IAAI22E,GAAW,EAAMq8D,GAAY,EAC9B9oI,EAAOooG,uBAAiD,IAAxBpoG,EAAOkoG,cACxCjoG,EAAIwoI,YAAY/qH,UAAY,IAC5BorH,GAAY,GAEJlK,EAER3+H,EAAIwoI,YAAY/qH,UAAY,IAAM1d,EAAOkoG,cAAgB,MAEzDjoG,EAAIwoI,YAAY/qH,UAAY,GAC5B+uD,GAAW,GAGbxsE,EAAIwoI,YAAYl0I,UAAUkM,OAAO,SAAUgsE,GAC3CxsE,EAAIwoI,YAAYl0I,UAAUkM,OAAO,UAAWqoI,GAGtC,aAAa1tI,GAEnB,MAAM+N,EAAUhV,KAAK0zH,WAAW1jH,IAAI/I,GACpC,OAAO+N,aAAO,EAAPA,EAASlJ,IAGV,UAAUD,GAChB,GAAsB,iBAAb,GAAyBA,EAAQ,CACxC,MAAM+oI,EAAiB,IAAmB1gD,cAAcroF,GACxD,OAAI+oI,GACK,CACL3tI,OAAQ4E,EACRi1B,KAAM,IAAgBy5D,cAAc1uF,GACpCyL,OAAQ,IAOd,OAAOzL,EAGD,cAAcC,EAAgB+S,GACpC,IAAI,SAACkyH,EAAQ,OAAE5kI,GAAUL,EACzB,IAAIilI,GAAYlyH,EAAS,CACvB,MAAM,OAACnc,EAAM,eAAEyqI,GAAkBrhI,EAAIilI,SAAWA,EAAWlE,GAAoB1gI,EAAO/L,UAAUuR,SAAS,WACzGjP,EAAOtC,UAAUC,IAAI,0BACrB8L,EAAOpC,OAAOrH,GACdyqI,IAGE4D,GAIJ,aAAcjlI,EAAIilI,SAASruI,OAAQ,aAAcmc,EAAS,IAAKA,OAAUna,EAAY,KACnFoH,EAAIilI,SAASruI,OAAOf,SACpBmK,EAAIilI,cAAWrsI,GACdma,EAAU,EAAI,GAGZ,cAAc7b,GACnB,MAAM6I,EAAS7L,KAAK60I,UAAU7xI,EAAQ6I,QAEtC7I,EAAQ0G,YAAa,EAErB,MAAMi8B,EAAM3lC,KAAK+L,aAAa/I,GAE9B,GAAG2iC,EAAK,CACN,MAAM,OAAC1+B,GAAU4E,EACD,KAAwBu5B,iBAAiBn+B,GAAQ,IAE/D0+B,EAAI75B,IAAIK,OAAO/L,UAAUC,IAAI,YAG3B4G,EAAOw1B,UACTz8B,KAAKkwI,2BAA2BrkI,EAAQ85B,EAAI75B,KAG9C9L,KAAKqM,eAAeR,OAAQnH,EAAWihC,EAAI75B,SAAKpH,EAAW1B,EAAQ8mB,aAAc9mB,EAAQuqI,SAAS,GAGpG,OAAO5nG,EAGD,2BAA2B95B,EAAgBC,GACjD,IAAI,GACF,OAIF,GADIA,IAAKA,EAAM9L,KAAKgwI,aAAankI,EAAO5E,UACpC6E,EAAK,OAET,MAAMsgB,EAAiC,IAAgB2L,QAAQlsB,EAAO5E,OAAOivB,YAC7El2B,KAAK80I,cAAchpI,KAAQsgB,EAAK9U,OAAOiqG,cAAen1F,EAAK9U,OAAOy9H,iBAG7D,aAAa/xI,GAalB,OAAOhD,KAAKg1I,UAAUhyI,EAAQ6I,OAAQ7I,EAAQ/C,UAAW+C,EAAQgJ,WAAYhJ,EAAQqP,cAAerP,EAAQowD,cAAepwD,EAAQkJ,UAAWlJ,EAAQ+G,OAAQ/G,EAAQiJ,WAAYjJ,EAAQ0G,WAAY1G,EAAQgnB,cAAehnB,EAAQ8mB,cAGhO,UAAUmrH,EACfh1I,EACA+L,GAAa,EACbqG,GAAgB,EAChB+gD,GAAgB,EAChBlnD,GAAY,EACZnC,GAAS,EACTkC,EAAa,GACbvC,IAAezJ,EACf+pB,EACAF,G,UACA,MAAMje,EAAS7L,KAAK60I,UAAUI,GACxBhuI,EAAS4E,EAAO5E,OAEhBwvB,EAAW,IAAI,GAOrB,GANAA,EAAS3M,aAAeA,EACxB2M,EAASzM,cAAgBA,EACzByM,EAASrzB,aAAa,SAAU8I,EAAY,IAAM,KAClDuqB,EAASrzB,aAAa,OAAQ,GAAK6D,GACnCwvB,EAASr2B,UAAUC,IAAI,gBAAiB,UAAY4L,GAEjDD,GAAc/E,IAAW2B,EAAA,QAAU6O,MAAQxQ,EAAOw1B,SAAU,CAEvC,sBAAR,QAAX,EADU,IAAgB6H,QAAQr9B,GAC7Bw+C,cAAM,eAAEr+C,IACdpH,KAAKiwI,gBAAgBx5G,GAAU,GAInC,MAAMy+G,EAAah1I,SAASC,cAAc,OAC1C+0I,EAAW90I,UAAUC,IAAI,gBAEzB,MAAM80I,EAAqBj1I,SAASC,cAAc,QAClDg1I,EAAmB/0I,UAAUC,IAAI,cAEjC,MAAMixH,EAAY,IAAI,KAAU,CAC9BrqH,SACA4E,OAAQK,EACRknD,gBACAlwD,WAAW,IAGbiyI,EAAmBprI,OAAOunH,EAAUt8G,SAOlCmgI,EAAmB/0I,UAAUC,IAAI,SAEjC,MAAMygC,EAAO,IAAgBrG,QAAQxzB,IACtB,QAAZ,EAAA65B,aAAI,EAAJA,EAAMxpB,cAAM,eAAEq0B,WACfwpG,EAAmBprI,OAAOg8B,MAI9B,MAAMopB,EAAOjvD,SAASC,cAAc,QACpCgvD,EAAK/uD,UAAUC,IAAI,qBACnB8uD,EAAK/rD,aAAa,MAAO,QAKzB,MAAM43B,EAAK96B,SAASC,cAAc,MAClC66B,EAAG56B,UAAUC,IAAI,iBACdgS,GACD,OAAAiL,GAAA,QAAO0d,GAGTA,EAAGjxB,OAAO0sB,EAAUy+G,GACpBl6G,EAAG5uB,QAAQnF,OAAS,GAAKA,EAEzB,MAAMktI,EAAaj0I,SAASC,cAAc,QAC1Cg0I,EAAW/zI,UAAUC,IAAI,iBAAkB,kBAE3C,MAAMszI,EAAezzI,SAASC,cAAc,QAC5CwzI,EAAavzI,UAAUC,IAAI,gBAE3B,MAAMi0I,EAAcp0I,SAASC,cAAc,OAC3Cm0I,EAAY9qI,UAAY,uCAExB,MAAM4rI,EAASl1I,SAASC,cAAc,KACtCi1I,EAAOh1I,UAAUC,IAAI,gBAErB,MAAMg1I,EAAYn1I,SAASC,cAAc,QACzCk1I,EAAUj1I,UAAUC,IAAI,wBACxBg1I,EAAUtrI,OAAOoqI,EAAYR,GAC7ByB,EAAOrrI,OAAOorI,EAAoBE,GAElC,MAAMzpH,EAAa1rB,SAASC,cAAc,KAC1CyrB,EAAWxrB,UAAUC,IAAI,mBACzBurB,EAAW7hB,OAAOolD,GAElB+lF,EAAWnrI,OAAOqrI,EAAQxpH,GAE1B,MAAM9f,EAAiB,CACrB2qB,WACAy+G,aACA3iF,UAAW++D,EAAUt8G,QACrBmgI,qBACAhB,aACAR,eACAW,cACAhiI,gBAAiB68C,EACjBvxB,YAAa5C,EACb7uB,OAAQ6uB,EACRpP,cASF,GAAG3rB,EAAW,CAEZA,EADe8J,EAAS,SAAW,WACjBixB,GAYpB,OATItxB,IAEFsxB,EAAG81G,UAAYhlI,GAEK,QAAjB,KAAasgB,YAAI,eAAEnlB,UAAWA,GAC/BjH,KAAKwwI,gBAAgBx1G,GAAI,IAItB,CAAClvB,MAAKD,UAGR,UAAUA,GACf,MAAMC,EAAM9L,KAAKgwI,aAAankI,EAAO5E,QACrC,IAAI6E,EACF,OAGF,IAAIy0H,EAAgBz0H,EAAIwG,gBAAgBzC,cAAc,0BACnD0wH,EACD,GAAaG,cAAc70H,EAAO5E,OAAQs5H,IAE1CA,EAAgB,GAAaG,cAAc70H,EAAO5E,QAClD,OAAAsF,EAAA,GAAeT,EAAIwG,gBAAiBiuH,GACpCz0H,EAAIwG,gBAAgBlS,UAAUC,IAAI,gBAI/B,YAAYwL,GACjB,MAAMC,EAAM9L,KAAKgwI,aAAankI,EAAO5E,QACjC6E,IAIJA,EAAIwG,gBAAgBlS,UAAUuB,OAAO,eACrC3B,KAAKqM,eAAeR,EAAQ,KAAMC,OAAKpH,OAAWA,OAAWA,EAAW,QAI5E,MAAM2oI,GAAoB,IAAI,GAC9B,KAAeA,kBAAoBA,GACpB,qB,oBCzyDsL,oBAAoBpiG,MAAKA,KAA7JqqG,EAAOC,QAAmL,SAAStzI,GAAG,IAAIyO,EAAE,GAAG,SAASymB,EAAEnsB,GAAG,GAAG0F,EAAE1F,GAAG,OAAO0F,EAAE1F,GAAGuqI,QAAQ,IAAI9wC,EAAE/zF,EAAE1F,GAAG,CAACA,EAAEA,EAAEszD,GAAE,EAAGi3E,QAAQ,IAAI,OAAOtzI,EAAE+I,GAAGmyH,KAAK14B,EAAE8wC,QAAQ9wC,EAAEA,EAAE8wC,QAAQp+G,GAAGstE,EAAEnmC,GAAE,EAAGmmC,EAAE8wC,QAAQ,OAAOp+G,EAAE+S,EAAEjoC,EAAEk1B,EAAEnE,EAAEtiB,EAAEymB,EAAE5W,EAAE,SAASte,EAAEyO,EAAE1F,GAAGmsB,EAAEA,EAAEl1B,EAAEyO,IAAIsG,OAAOw+H,eAAevzI,EAAEyO,EAAE,CAAC+kI,YAAW,EAAGzlI,IAAIhF,KAAKmsB,EAAElY,EAAE,SAAShd,GAAG,oBAAoByzI,QAAQA,OAAOC,aAAa3+H,OAAOw+H,eAAevzI,EAAEyzI,OAAOC,YAAY,CAACzzI,MAAM,WAAW8U,OAAOw+H,eAAevzI,EAAE,aAAa,CAACC,OAAM,KAAMi1B,EAAEzmB,EAAE,SAASzO,EAAEyO,GAAG,GAAG,EAAEA,IAAIzO,EAAEk1B,EAAEl1B,IAAI,EAAEyO,EAAE,OAAOzO,EAAE,GAAG,EAAEyO,GAAG,iBAAiBzO,GAAGA,GAAGA,EAAE2zI,WAAW,OAAO3zI,EAAE,IAAI+I,EAAEgM,OAAO6+H,OAAO,MAAM,GAAG1+G,EAAElY,EAAEjU,GAAGgM,OAAOw+H,eAAexqI,EAAE,UAAU,CAACyqI,YAAW,EAAGvzI,MAAMD,IAAI,EAAEyO,GAAG,iBAAiBzO,EAAE,IAAI,IAAIwiG,KAAKxiG,EAAEk1B,EAAE5W,EAAEvV,EAAEy5F,EAAE,SAAS/zF,GAAG,OAAOzO,EAAEyO,IAAInK,KAAK,KAAKk+F,IAAI,OAAOz5F,GAAGmsB,EAAEstE,EAAE,SAASxiG,GAAG,IAAIyO,EAAEzO,GAAGA,EAAE2zI,WAAW,WAAW,OAAO3zI,EAAE6zI,SAAS,WAAW,OAAO7zI,GAAG,OAAOk1B,EAAE5W,EAAE7P,EAAE,IAAIA,GAAGA,GAAGymB,EAAEA,EAAE,SAASl1B,EAAEyO,GAAG,OAAOsG,OAAO++H,UAAUrrE,eAAeyyD,KAAKl7H,EAAEyO,IAAIymB,EAAEH,EAAE,GAAGG,EAAEA,EAAEthB,EAAE,GAAj5B,CAAq5B,CAAC,SAAS5T,EAAEyO,EAAEymB,GAAG,cAAa,SAAUzmB,GAAG,IAAIymB,EAAEzmB,EAAEslI,cAActlI,EAAEulI,mBAAmBjrI,EAAE,SAAS/I,GAAG,IAAI+I,EAAEkrI,uBAAuB,MAAM,IAAIprH,MAAM,8CAA8C7oB,IAAIA,EAAE,IAAIjC,KAAKi0B,MAAM,WAAWj0B,KAAK4qD,OAAO5zC,OAAOsjC,OAAO,CAAC67F,aAAa,KAAKC,mBAAmB,KAAKC,iBAAiB,GAAGC,YAAY,uBAAuB1jC,kBAAkB,KAAK2jC,iBAAiB,GAAGC,uBAAsB,EAAG3jC,YAAY,EAAEC,iBAAiB,EAAEC,cAAc,EAAE0jC,gBAAgB,EAAEC,aAAY,EAAG1jC,aAAY,EAAG2jC,YAAY,IAAI10I,GAAGjC,KAAK42I,sBAAsB,GAAG5rI,EAAEkrI,qBAAqB,WAAW,OAAO/+G,GAAGzmB,EAAEgC,WAAWhC,EAAEgC,UAAUuiH,cAAcvkH,EAAEgC,UAAUuiH,aAAa4hB,cAAcnmI,EAAEomI,aAAa9rI,EAAE+qI,UAAUgB,YAAY,WAAW/2I,KAAKg3I,SAASh3I,KAAKg3I,OAAOC,UAAUj3I,KAAKg3I,OAAOC,YAAY3wI,SAAQ,SAAUrE,GAAGA,EAAEQ,UAAUzC,KAAKg3I,OAAOv0I,cAAczC,KAAKg3I,QAAQh3I,KAAKk3I,cAAcl3I,KAAKm3I,oBAAoBn3I,KAAKk3I,aAAan+G,eAAe/4B,KAAKk3I,eAAelsI,EAAE+qI,UAAUqB,cAAc,SAASn1I,GAAG,GAAG,cAAcjC,KAAKi0B,MAAM,CAAC,IAAI,IAAIvjB,EAAE,GAAGymB,EAAE,EAAEA,EAAEl1B,EAAE6wG,iBAAiB37E,IAAIzmB,EAAEymB,GAAGl1B,EAAEo1I,eAAelgH,GAAGn3B,KAAKs3I,QAAQC,YAAY,CAACluC,QAAQ,SAASmuC,QAAQ9mI,MAAM1F,EAAE+qI,UAAU0B,iBAAiB,SAASx1I,GAAG,OAAOA,GAAGA,EAAEiH,SAASlJ,KAAKk3I,aAAaj1I,EAAEiH,QAAQlJ,KAAKm3I,mBAAkB,IAAKn3I,KAAKk3I,aAAa,IAAI//G,EAAEn3B,KAAKm3I,mBAAkB,GAAIn3I,KAAKk3I,cAAclsI,EAAE+qI,UAAU2B,eAAe,WAAW13I,KAAKo3I,cAAc,kBAAkBp3I,KAAKo3I,eAAep3I,KAAK23I,oBAAoB33I,KAAKk3I,aAAaU,sBAAsB53I,KAAK4qD,OAAOurF,aAAan2I,KAAK4qD,OAAOkoD,iBAAiB9yG,KAAK4qD,OAAOkoD,kBAAkB9yG,KAAK23I,oBAAoBzoC,QAAQlvG,KAAKk3I,aAAaW,aAAa73I,KAAK23I,oBAAoBG,eAAe71I,IAAIjC,KAAKo3I,cAAcn1I,EAAE81I,cAAc/3I,KAAKg4I,gBAAgBh4I,KAAKk3I,aAAae,aAAaj4I,KAAKk4I,eAAel4I,KAAK4qD,OAAOioD,aAAa7yG,KAAKg4I,gBAAgB9oC,QAAQlvG,KAAKk3I,aAAaW,aAAa73I,KAAKm4I,kBAAkBn4I,KAAKk3I,aAAae,aAAaj4I,KAAKo4I,iBAAiBp4I,KAAK4qD,OAAOmoD,eAAe/yG,KAAKm4I,kBAAkBjpC,QAAQlvG,KAAK23I,sBAAsB3sI,EAAE+qI,UAAUsC,eAAe,SAASp2I,GAAG,OAAOA,GAAGA,EAAEiH,QAAQwH,EAAE7N,QAAQoD,QAAQhE,GAAGyO,EAAEgC,UAAUuiH,aAAa4hB,aAAa,CAACxxH,MAAMrlB,KAAK4qD,OAAO4rF,wBAAwB31I,KAAKoB,IAAIjC,KAAKg3I,OAAO/0I,EAAEjC,KAAKk3I,aAAaoB,wBAAwBr2I,MAAM+I,EAAE+qI,UAAUwC,WAAW,WAAWv4I,KAAKs3I,UAAUt3I,KAAKs3I,QAAQ,IAAI5mI,EAAE8nI,OAAOx4I,KAAK4qD,OAAO0rF,eAAetrI,EAAE+qI,UAAU0C,WAAW,WAAW,IAAIx2I,GAAGjC,KAAK4qD,OAAO8rF,YAAY12I,KAAK04I,WAAW14I,KAAK24I,WAAWpyI,KAAKvG,MAAM,OAAOA,KAAK44I,cAAc,GAAG54I,KAAKumB,YAAY,EAAEvmB,KAAKu4I,aAAa,IAAI11I,QAAQ,CAAC6N,EAAEymB,KAAK,IAAInsB,EAAEmsB,IAAI,OAAOA,EAAEytC,KAAKxgE,SAAS,IAAI,QAAQsM,IAAI,MAAM,IAAI,OAAO1Q,KAAK42I,sBAAsBz/G,EAAEytC,KAAKi0E,eAAe52I,EAAEk1B,EAAEytC,KAAKk0E,MAAM,MAAM,IAAI,OAAO94I,KAAKs3I,QAAQjuI,oBAAoB,UAAU2B,GAAGhL,KAAKokG,WAAWpkG,KAAKs3I,QAAQt2I,iBAAiB,UAAUgK,GAAGhL,KAAKs3I,QAAQC,YAAYvgI,OAAOsjC,OAAO,CAAC+uD,QAAQ,OAAO0vC,mBAAmB/4I,KAAKk3I,aAAa8B,WAAWC,cAAcj5I,KAAKk3I,aAAa8B,YAAYh5I,KAAK4qD,YAAY5/C,EAAE+qI,UAAU30I,MAAM,SAASa,GAAG,GAAG,cAAcjC,KAAKi0B,MAAM,CAAC,GAAGj0B,KAAKi0B,MAAM,SAAShyB,GAAGjC,KAAK4qD,OAAO8rF,YAAY,CAAC,IAAIhmI,EAAE1Q,KAAKs3I,QAAQ,OAAO,IAAIz0I,QAAQ,CAACZ,EAAEk1B,KAAK,IAAInsB,EAAEmsB,IAAI,YAAYA,EAAEytC,KAAKxgE,UAAUsM,EAAErH,oBAAoB,UAAU2B,GAAGhL,KAAKk5I,UAAUj3I,MAAMyO,EAAE1P,iBAAiB,UAAUgK,GAAG0F,EAAE6mI,YAAY,CAACluC,QAAQ,YAAY,OAAOrpG,KAAKk5I,UAAUr2I,QAAQoD,YAAY+E,EAAE+qI,UAAUoD,OAAO,WAAW,WAAWn5I,KAAKi0B,QAAQj0B,KAAKi0B,MAAM,YAAYj0B,KAAKo5I,aAAapuI,EAAE+qI,UAAUqC,iBAAiB,SAASn2I,GAAGjC,KAAK4qD,OAAOmoD,cAAc9wG,EAAEjC,KAAKm4I,mBAAmBn4I,KAAKk3I,cAAcl3I,KAAKm4I,kBAAkBkB,KAAKC,gBAAgBr3I,EAAEjC,KAAKk3I,aAAaxjI,YAAY,MAAM1I,EAAE+qI,UAAUmC,eAAe,SAASj2I,GAAGjC,KAAK4qD,OAAOioD,YAAY5wG,EAAEjC,KAAKg4I,iBAAiBh4I,KAAKk3I,cAAcl3I,KAAKg4I,gBAAgBqB,KAAKC,gBAAgBr3I,EAAEjC,KAAKk3I,aAAaxjI,YAAY,MAAM1I,EAAE+qI,UAAU31H,MAAM,SAASne,GAAG,GAAG,aAAajC,KAAKi0B,MAAM,OAAOj0B,KAAKy3I,iBAAiBx1I,GAAGjC,KAAK03I,iBAAiB13I,KAAK42I,sBAAsB,EAAE52I,KAAKy4I,aAAa53I,KAAK,IAAIb,KAAKq4I,eAAep2I,IAAIpB,KAAKoB,IAAIjC,KAAK+uG,WAAW9sG,EAAEjC,KAAKi0B,MAAM,YAAYj0B,KAAKu5I,UAAUv5I,KAAKs3I,QAAQC,YAAY,CAACluC,QAAQ,mBAAmBrpG,KAAK+uG,WAAWG,QAAQlvG,KAAKg4I,iBAAiBh4I,KAAK+uG,WAAWG,QAAQlvG,KAAKm4I,sBAAsBntI,EAAE+qI,UAAUtzI,KAAK,WAAW,GAAG,aAAazC,KAAKi0B,MAAM,CAACj0B,KAAKi0B,MAAM,WAAWj0B,KAAKg4I,gBAAgBlgE,aAAa93E,KAAK23I,oBAAoB7/D,aAAa93E,KAAKm4I,kBAAkBrgE,aAAa93E,KAAK+uG,WAAWj3B,aAAa93E,KAAK+2I,cAAc,IAAI90I,EAAEjC,KAAKs3I,QAAQ,OAAO,IAAIz0I,QAAQ6N,IAAI,IAAIymB,EAAEnsB,IAAI,SAASA,EAAE45D,KAAKxgE,UAAUnC,EAAEoH,oBAAoB,UAAU8tB,GAAGzmB,MAAMzO,EAAEjB,iBAAiB,UAAUm2B,GAAGl1B,EAAEs1I,YAAY,CAACluC,QAAQ,SAASrpG,KAAK4qD,OAAOooD,aAAa/wG,EAAEs1I,YAAY,CAACluC,QAAQ,YAAY,OAAOxmG,QAAQoD,WAAW+E,EAAE+qI,UAAUyD,cAAc,WAAW,aAAax5I,KAAKi0B,OAAOj0B,KAAKs3I,UAAUt3I,KAAKs3I,QAAQC,YAAY,CAACluC,QAAQ,iBAAiBrpG,KAAKs3I,UAAUtsI,EAAE+qI,UAAU4C,UAAU,SAAS12I,GAAGjC,KAAK44I,cAAcjzI,KAAK1D,GAAGjC,KAAKumB,aAAatkB,EAAEE,QAAQ6I,EAAE+qI,UAAU2C,WAAW,SAASz2I,GAAGjC,KAAKmzG,gBAAgBlxG,IAAI+I,EAAE+qI,UAAU3xC,OAAO,WAAW,IAAIpkG,KAAK4qD,OAAO8rF,YAAY,CAAC,IAAIz0I,EAAE,IAAIgiB,WAAWjkB,KAAKumB,aAAavmB,KAAK44I,cAAcz1G,QAAO,SAAUzyB,EAAEymB,GAAG,OAAOl1B,EAAE0S,IAAIwiB,EAAEzmB,GAAGA,EAAEymB,EAAEh1B,SAAS,GAAGnC,KAAKmzG,gBAAgBlxG,GAAGjC,KAAKkzG,SAASlzG,KAAK4qD,OAAOooD,oBAAoBhzG,KAAKs3I,SAAStsI,EAAE+qI,UAAU5iC,gBAAgB,aAAanoG,EAAE+qI,UAAUmD,QAAQ,aAAaluI,EAAE+qI,UAAUqD,SAAS,aAAapuI,EAAE+qI,UAAUwD,QAAQ,aAAavuI,EAAE+qI,UAAU7iC,OAAO,aAAajxG,EAAEszI,QAAQvqI,IAAImyH,KAAKn9H,KAAKm3B,EAAE,KAAK,SAASl1B,EAAEyO,GAAG,IAAIymB,EAAEA,EAAE,WAAW,OAAOn3B,KAAlB,GAA0B,IAAIm3B,EAAEA,GAAG,IAAIsiH,SAAS,cAAb,GAA8B,MAAMx3I,GAAG,iBAAiBsJ,SAAS4rB,EAAE5rB,QAAQtJ,EAAEszI,QAAQp+G,M,gCCA7oN,gFAWA,IAAIuiH,EAAgB,EACb,SAASp8H,EAAOvZ,EAAmBszB,EAAoD,KAAMx0B,QAAQoD,WAAWmU,EAA8B,KAAMqF,GAAU,GAEnK,GAAG1b,EAAK8L,cAAc,aAAc,OACpC9L,EAAK3D,UAAUC,IAAI,MAEnB,IAAI4e,EAAI/e,SAASC,cAAc,OAC/B8e,EAAE7e,UAAUC,IAAI,YAShB,IAAI02E,EAPahzE,EAAK3D,UAAUuR,SAAS,cAEvCsN,EAAE7e,UAAUC,IAAI,aAGlB0D,EAAK0b,EAAU,UAAY,UAAUR,GAIrC,MAAM06H,EAAa,CAAC1+H,EAAiBC,KACnC,MAAM6xH,EAAYt4F,KAAKC,MACjB3wC,EAAO7D,SAASC,cAAc,OAE9By5I,EAAUF,IAIV7lI,EAAgG,KAApFtI,OAAOkjH,iBAAiBxvG,GAAGyvG,iBAAiB,qBAAqBlrH,QAAQ,IAAK,IAGhGuzE,EAAU,KAMR,IAAI8iE,EAAcplG,KAAKC,MAAQq4F,EAC/B,MAAM31F,EAAK,KAET,IAAc0K,OAAO,KACnB/9C,EAAKpC,WAGJyY,GAAOA,EAAMw/H,IAElB,GAAGC,EAAchmI,EAAU,CACzB,IAAI8lF,EAAQt3F,KAAKP,IAAI+R,EAAWgmI,EAAahmI,EAAW,GACxDrI,WAAW,IAAMzH,EAAK3D,UAAUC,IAAI,UAAWgC,KAAKP,IAAI63F,EAAQ9lF,EAAW,EAAG,IAE9ErI,WAAW4rC,EAAIuiD,QAEf51F,EAAK3D,UAAUC,IAAI,UACnBmL,WAAW4rC,EAAIvjC,EAAW,GAGxB,sBACFtI,OAAOlC,oBAAoB,cAAe0tE,GAG5CA,EAAU,KACV+iE,GAAkB,GAIpBziH,GAAYA,EAASuiH,GAenBruI,OAAO2T,sBAAsB,KAC3B,MAAMrD,EAAOoD,EAAEnD,wBACf/X,EAAK3D,UAAUC,IAAI,oBAEnB,MAAMqoC,EAASztB,EAAUY,EAAKkB,KACxBg9H,EAAS7+H,EAAUW,EAAK2X,IAGxB1zB,EADSuC,KAAK23I,KAAK,SAAC33I,KAAKyuB,IAAIipH,EAASl+H,EAAKlb,OAAS,GAAKkb,EAAKlb,OAAS,EAAM,GAAI,SAAC0B,KAAKyuB,IAAI4X,EAAS7sB,EAAKnb,MAAQ,GAAKmb,EAAKnb,MAAQ,EAAM,IAIzI6Z,EAAImuB,EAAS5oC,EAAO,EACpB2a,EAAIs/H,EAASj6I,EAAO,EAI1BiE,EAAKpB,MAAMjC,MAAQqD,EAAKpB,MAAMhC,OAASb,EAAO,KAC9CiE,EAAKpB,MAAMoa,KAAOxC,EAAI,KACtBxW,EAAKpB,MAAM6wB,IAAM/Y,EAAI,KAgBrBwE,EAAElV,OAAOhG,MAQTk2I,EAAoBh4I,GAAaA,EAAE4S,SAAW9Q,IAChD,CAAC,SAAU,KAAKg2B,SAAU93B,EAAE4S,OAAuB+1B,UAChD,YAAgB3oC,EAAE4S,OAAuB,cAAgBoK,GAIhE,IAAI66H,GAAkB,EACtB,GAAG,qBAAoB,CACrB,IAAII,EAAW,KACbnjE,GAAWA,KAGbhzE,EAAK/C,iBAAiB,aAAeiB,IACnC,IAAI,UAAUm8B,SAASC,kBACrB,OAIF,GAAGp8B,EAAE+Y,QAAQ7Y,OAAS,GAAK23I,GAAmBG,EAAiBh4I,GAC7D,OAIF63I,GAAkB,EAElB,IAAI,QAAC7+H,EAAO,QAAEC,GAAWjZ,EAAE+Y,QAAQ,GACnC2+H,EAAW1+H,EAASC,GACpBnX,EAAK/C,iBAAiB,WAAYk5I,EAAU,CAACviI,MAAM,IAEnDpM,OAAOvK,iBAAiB,YAAciB,IACpCA,EAAE8rD,cAAe,EACjB9rD,EAAE2vE,kBACFsoE,IACAn2I,EAAKsF,oBAAoB,WAAY6wI,IACpC,CAACviI,MAAM,KACT,CAAC2D,SAAS,SAEbvX,EAAK/C,iBAAiB,YAAciB,IAClC,IAAI,CAAC,EAAG,GAAG83B,SAAS93B,EAAE4Y,QACpB,OAGF,IAAI,UAAUujB,SAASC,kBACrB,OAIF,GAA2B,MAAxBt6B,EAAKqI,QAAQkR,QAAkB28H,EAAiBh4I,GACjD,OACK,GAAG63I,EAER,YADAA,GAAkB,GAIpB,IAAI,QAAC7+H,EAAO,QAAEC,GAAWjZ,EACzB03I,EAAW1+H,EAASC,GACpB3P,OAAOvK,iBAAiB,UAAW+1E,EAAS,CAACp/D,MAAM,EAAM2D,SAAS,IAClE/P,OAAOvK,iBAAiB,cAAe+1E,EAAS,CAACp/D,MAAM,EAAM2D,SAAS,KACrE,CAACA,SAAS,M,gCC7LjB,2JAUO,MAAM6+H,EAA8D,qBAAqB,YAAc,QAEvG,SAAS52B,EAAiBx/G,EAA4BszB,EAAsDr0B,EAA8B,IAC/I,MAAM3C,EAAM2C,EAAQ+K,eAAiB/K,EAAQ+K,eAAe1N,IAAI0D,GAAQA,EAAK/C,iBAAiBuF,KAAKxC,GAGnGf,EAAQiwG,gBAAiB,EA4BzB5yG,EAAI85I,EAAkB9iH,EAAUr0B,GAG3B,SAASo3I,EAAiBr2I,EAAmBszB,EAAgDr0B,GAIhGe,EAAKsF,oBAAoB8wI,EAAkB9iH,EAAUr0B,GAIlD,SAASq3I,EAAmBt2I,GACjC,YAAcA,EAAMo2I,K,gCCxDtB,oBA4Ce,IAnCA,CAAC3wI,EAAmBxG,EAQ9B,MACH,MAAM6X,EAA4B3a,SAASC,cAAc6C,EAAQ+a,MAAQ,MAAQ,UAuBjF,OAtBAlD,EAAOrR,UAAYA,GAAaxG,EAAQqK,KAAO,UAAYrK,EAAQqK,KAAO,IAEtErK,EAAQ2K,WACP3K,EAAQs3I,cACTz/H,EAAOza,UAAUC,IAAI,aAGvB,iBAAOwa,IAGN7X,EAAQ8/H,YACTjoH,EAAOza,UAAUC,IAAI,kBAGpB2C,EAAQ4O,UACTiJ,EAAOzX,aAAa,WAAY,QAG/BJ,EAAQka,MACTrC,EAAO9Q,OAAO,eAAK/G,EAAQka,OAGtBrC,I,gCCzCT,+SAgBO,SAAS0/H,EAAax2I,EAAey2I,GAAY,GACtD,MAAMx2I,EAAO,wMAKb,GAAGw2I,EAAW,CACZ,MAAMhuH,EAAMtsB,SAASC,cAAc,OAQnC,OAPAqsB,EAAIpsB,UAAUC,IAAI,aAClBmsB,EAAIvoB,UAAYD,EAEbD,GACDA,EAAKid,YAAYwL,GAGZA,EAIT,OADAzoB,EAAK0d,mBAAmB,YAAazd,GAC9BD,EAAKqtC,iBAKP,SAASqpG,EAAgB12I,EAAyBsJ,EAAO,SAK9D,OAJAtJ,EAAK3D,UAAUuB,OAAO,SAAW0L,GACjCtJ,EAAK6N,UAAW,EAChB2oI,EAAax2I,GAEN,KACLA,EAAKE,UAAY,GACjBF,EAAK3D,UAAUC,IAAI,SAAWgN,GAC9BtJ,EAAKy/B,gBAAgB,aAVzB,IAAe+2G,aAAeA,EAsB9B,IAAIlgI,EAAepY,IACjB,IAAI4Z,EAAOiC,EAAWhC,yBAClB,QAACb,EAAO,QAAEC,GAAWjZ,EAErBy4I,EAAQz/H,GAAWY,EAAKktB,MAAQ9tB,EAAUY,EAAKktB,MAAQltB,EAAKkB,KAAO9B,EACnE0/H,EAAQz/H,GAAWW,EAAKiB,OAAS5B,EAAUW,EAAKiB,OAASjB,EAAK2X,IAAMtY,GAErEw/H,GAAS,KAAOC,GAAS,MAC1BC,KAMJ,MAAMz9H,EAAWlb,IAEf24I,KAWWA,EAAe,KACvB98H,IACDA,EAAW1d,UAAUuB,OAAO,UAC5Bmc,EAAWhN,cAAc1Q,UAAUuB,OAAO,aAEvCk5I,GAAaA,EAAYl5I,SAC5Bmc,EAAa,KAEb,UAAUrP,cAAc,uBAAuB,IAG9CqsI,IACDA,IACAA,EAAoB,MAGlB,uBACFvvI,OAAOlC,oBAAoB,YAAagR,GAExC9O,OAAOlC,oBAAoB,cAAe8T,IAG5Cjd,SAASmJ,oBAAoB,IAAkB8T,GAE3C,oBACF,IAAwBvM,aAAa,SAIzCrF,OAAOvK,iBAAiB,SAAU,KAC7B8c,GACD88H,MAWJ,IAAI98H,EAA0B,KAAMg9H,EAAgC,KAAMD,EAA2B,KAC9F,SAASE,EAAY1+E,EAA0BxrD,GACpD+pI,IAEI,oBACF,IAAwBzqI,SAAS,CAC/BhN,KAAM,OACNiN,MAAQC,IACNuqI,OAKN98H,EAAau+C,EACbv+C,EAAW1d,UAAUC,IAAI,UACzByd,EAAWhN,cAAc1Q,UAAUC,IAAI,aAEnCw6I,IACFA,EAAc36I,SAASC,cAAc,OACrC06I,EAAYz6I,UAAUC,IAAI,oBAG1Bw6I,EAAY75I,iBAAiB,IAAmBiB,IAC9C,YAAYA,GACZkb,OAIJW,EAAWhN,cAAciQ,aAAa85H,EAAa/8H,GAInDg9H,EAAoBjqI,EAEhB,uBACFtF,OAAOvK,iBAAiB,YAAaqZ,GAErC9O,OAAOvK,iBAAiB,cAAemc,EAAS,CAACxF,MAAM,KAUzDzX,SAASc,iBAAiB,IAAkBmc,GAE5C,UAAU1O,cAAc,uBAAuB,GAK1C,SAASusI,GAAa,MAACxgI,EAAK,MAAEE,GAA4B3W,EAAmB02F,GAKlF,IAAKlrD,YAAa0rG,EAAWlrF,aAAcmrF,GAAcn3I,EAEzD,MAAM8X,EAAO3b,SAASiW,KAAK2F,wBACrBq/H,EAAct/H,EAAKnb,MACnBskI,EAAenpH,EAAKlb,OAE1B85F,EAAO,IAAWj3E,SAAW,QAAU,OACvC,IAAI23D,EAAkD,MAEtD,MAiBM7sD,EAhBG,CACL/T,EAAG,CACDwC,KAAMvC,EACNuuB,MAAOvuB,EAAQygI,GAEjBG,cAAwB,UAAT3gD,EArBA,EAqBkC0gD,EAAcF,EArBhD,EAuBfxgI,EAAG,CACD+Y,IAAK9Y,EACLoC,OAAQpC,EAAQwgI,GAGlBG,cAAe3gI,EAAQsqH,EAAe,EA7BxB,EA6B0CA,EAAekW,EA7BzD,GAmCZI,EACD,CACDv+H,KAAMuR,EAAM/T,EAAEwC,KAAOk+H,EApCN,GAoCkCE,EACjDpyG,MAAOza,EAAM/T,EAAEwuB,OArCA,GAkCbuyG,EAKD,CACD9nH,IAAKlF,EAAM7T,EAAE+Y,IAAM0nH,EAzCL,GAyCiClW,EAC/CloH,OAAQwR,EAAM7T,EAAEqC,OA1CF,MAoDlB,CAUE,IAAIC,EAQJA,EAAOu+H,EAAgB7gD,GAAQnsE,EAAM/T,EAAEkgF,IAASA,EAAO,SAAUnsE,EAAM8sH,eAEvEr3I,EAAKpB,MAAMoa,KAAOA,EAAO,KAY3B,CACE,IAAIyW,EAEJA,EAAM8nH,EAAgBngE,GAAgB7sD,EAAM7T,EAAE0gE,IAAiBA,EAAe,SAAU7sD,EAAM+sH,eAE9Ft3I,EAAKpB,MAAM6wB,IAAMA,EAAM,KAGzBzvB,EAAKyF,UAAYzF,EAAKyF,UAAUhG,QAAQ,2CAA4C,IACpFO,EAAK3D,UAAUC,KAEK,WAAjB86E,EAA4BA,EAAe,UAC5C,KACU,WAATsf,EAAoBA,EAAiB,SAATA,EAAkB,QAAU,SAG7D,IAAI8gD,GAA4B,EAAOC,EAAmC,EACnE,SAASC,IACXD,GACDxuI,aAAawuI,GAGfA,EAAmCjwI,OAAOC,WAAW,KACnDgwI,EAAmC,EACnCD,GAA4B,GAC3B,KAEHA,GAA4B,EAGvB,SAASG,EAA0B1mI,EAAsBqiB,EAA2CtpB,GACzG,MAAM1N,EAAM0N,EAAiBA,EAAe1N,IAAI2U,GAAWA,EAAQhU,iBAAiBuF,KAAKyO,GACnFrT,EAASoM,EAAiBA,EAAeu7C,aAAa/iD,KAAKwH,EAAgBiH,GAAWA,EAAQ3L,oBAAoB9C,KAAKyO,GAE7H,GAAG,YAAY,qBAAoB,CACjC,IAAIlI,EAEJ,MAAM9J,EAAgC,CAACmoB,SAAS,GAE1CwwH,EAAW,KACf3uI,aAAaF,GAEbnL,EAAO,YAAag6I,EAAU34I,GAE9BrB,EAAO,WAAYg6I,EAAU34I,GAE7BrB,EAAO,cAAeg6I,EAAU34I,IAGlC3C,EAAI,aAAe4B,IACdA,EAAE+Y,QAAQ7Y,OAAS,EACpBw5I,KAIFt7I,EAAI,YAAas7I,EAAU34I,GAC3B3C,EAAI,WAAYs7I,EAAU34I,GAC1B3C,EAAI,cAAes7I,EAAU34I,GAE7B8J,EAAUvB,OAAOC,WAAW,KACvB+vI,EACDI,KAIFtkH,EAASp1B,EAAE+Y,QAAQ,IACnB2gI,IAEG79H,GACD9I,EAAQhU,iBAAiB,WAAY,IAAa,CAAC2W,MAAM,MAE1D,aASLtX,EAAI,cAAe,qBAAsB4B,IACvCo1B,EAASp1B,GAEN6b,GACD9I,EAAQhU,iBAAiB,WAAY,IAAa,CAAC2W,MAAM,KAEzD0f,K,gCC/VR,yDA8MA,MAAMtoB,EAA0B,IAtLzB,MASL,cARQ,KAAA6sI,YAAqC,GACrC,KAAAzsI,GAAKslC,KAAKC,MACV,KAAAmnG,QAAS,EACT,KAAAvtF,IAAM,YAAO,MACb,KAAAwwD,OAAQ,EACR,KAAAg9B,YAAcvwI,OAAOuvC,SAAS2gB,KAIpC,IAAIsgF,GAAkB,EAqCtB,GApCAxwI,OAAOvK,iBAAiB,WAAaiB,IAGnC,GAFAjC,KAAK8+G,OAAS9+G,KAAKsuD,IAAI,WAAYrsD,EAAG85I,GAEnCxwI,OAAOuvC,SAAS2gB,OAASz7D,KAAK87I,YAG/B,OAFA97I,KAAKi5H,cAAgBj5H,KAAKi5H,oBAC1Bj5H,KAAKo5H,eAGPp5H,KAAK87I,YAAcvwI,OAAOuvC,SAAS2gB,KAGnC,GADmBx5D,EAAEgyB,QACXj0B,KAAKmP,GAEb,YADAnP,KAAKg8I,YAIP,MAAMv2I,EAAOzF,KAAK47I,YAAYl2I,MAC1BD,GAKJzF,KAAK67I,QAAUE,EACf/7I,KAAKi8I,WAAWx2I,IALdzF,KAAKg8I,cASTzwI,OAAOvK,iBAAiB,UAAYiB,IAClC,MAAMwD,EAAOzF,KAAK47I,YAAY57I,KAAK47I,YAAYz5I,OAAS,GACpDsD,IACS,WAAVxD,EAAEsM,KAAqB9I,EAAKs7F,WAAWt7F,EAAKs7F,aAC7C,YAAY9+F,GACZjC,KAAKkP,KAAKzJ,EAAKtC,SAEhB,CAACgoB,SAAS,EAAM7P,SAAS,IAEzB,mBAAkB,CACnB,MAAMtY,EAAU,CAACsY,SAAS,GAC1B/P,OAAOvK,iBAAiB,aAAeiB,IAClCA,EAAE+Y,QAAQ7Y,OAAS,IACtBnC,KAAK8+G,OAAS9+G,KAAKsuD,IAAI,cAEpB,YAAoBrsD,KACrB85I,GAAkB,EAElBxwI,OAAOvK,iBAAiB,WAAY,KAClCwK,WAAW,KACTuwI,GAAkB,GACjB,MACF,CAACzgI,SAAS,EAAM3D,MAAM,OAoC1B3U,GAGLmB,QAAQ+3I,kBAAoB,SAE5Bl8I,KAAKg8I,YAGC,WAAWv2I,GACjB,MAAM0c,EAAO1c,EAAK2K,QAAOpQ,KAAK67I,aAAiBn3I,GAC/C1E,KAAK8+G,OAAS9+G,KAAKsuD,IAAI,wBAAyB7oD,EAAMzF,KAAK47I,cAC/C,IAATz5H,EACDniB,KAAKmQ,SAAS1K,GACLA,EAAKmhG,aACd,cAGF5mG,KAAK67I,QAAS,EAGT,eAAe14I,GACpB,IAAI,IAAI6H,EAAIhL,KAAK47I,YAAYz5I,OAAS,EAAG6I,GAAK,IAAKA,EAAG,CACpD,MAAMvF,EAAOzF,KAAK47I,YAAY5wI,GAC9B,GAAGvF,EAAKtC,OAASA,EACf,MAAO,CAACsC,OAAM6W,MAAOtR,IAKpB,KAAK7H,GACV,GAAGA,EAAM,CACP,MAAMwiC,EAAM3lC,KAAKgP,eAAe7L,GAChC,GAAGwiC,EAED,YADA3lC,KAAKm8I,WAAWx2G,EAAIlgC,KAAMkgC,EAAIrpB,OAKlCnY,QAAQ+K,OAGH,WAAWzJ,EAAsB6W,EAAQtc,KAAK47I,YAAYr/H,QAAQ9W,IACvEzF,KAAK67I,QAAS,EAGZ77I,KAAK47I,YAAYn3I,OAAO6X,EAAO,GAC/Btc,KAAKi8I,WAAWx2I,GAIb,SAASA,GACdzF,KAAK47I,YAAYj2I,KAAKF,GACtBzF,KAAK8+G,OAAS9+G,KAAKsuD,IAAI,YAAa7oD,EAAMzF,KAAK47I,aAE3Cn2I,EAAK22I,WACPp8I,KAAKg8I,YAID,YACNh8I,KAAK67I,QAAS,EACd13I,QAAQ63I,UAAUh8I,KAAKmP,GAAI,IAGtB,eACLhL,QAAQi1H,aAAap5H,KAAKmP,GAAI,GAAI2rC,SAASuhG,OAASvhG,SAAS+hF,UAGxD,WAAWp3H,GAChB,YAAiBzF,KAAK47I,YAAan2I,GAG9B,aAAatC,EAA8ByrC,GAAS,GACzD,IAAI,IAAI5jC,EAAIhL,KAAK47I,YAAYz5I,OAAS,EAAG6I,GAAK,IAAKA,EAAG,CAEpD,GADahL,KAAK47I,YAAY5wI,GACtB7H,OAASA,IACfnD,KAAK47I,YAAYn3I,OAAOuG,EAAG,GAExB4jC,GACD,SAQV,IAAe7/B,wBAA0BA,EAC1B,O,gCChNA,SAASutI,EAAcv4I,EAAmBuF,GACvD,MAAMgR,EAAQ,IAAI+Z,MAAM/qB,EAAM,CAAC+iB,SAAS,EAAMjG,YAAY,IAC1DriB,EAAK0K,cAAc6L,GAFrB,mC,gCCAA,oCAuEA,MAAMsnC,EAAgB,IA5DtB,oBACU,KAAAnkB,SAGH,GACG,KAAAuvF,IAAM,IAAQzmH,KAAK,MACnB,KAAAwM,WAAY,EAEZ,GAAGwpI,EAAuCllH,GAChD,IAAIlxB,EAAUnG,KAAKy9B,SAAS8+G,GAU5B,OATIp2I,IACFnG,KAAKw8I,gBACLr2I,EAAUnG,KAAKy9B,SAAS8+G,GAAQ,oBAGlB73I,IAAb2yB,GACDlxB,EAAQtF,KAAK,IAAMw2B,KAGdlxB,EAGF,QAAQkxB,GACb,OAAOr3B,KAAKy8I,GAAG,OAAQplH,GAGlB,OAAOA,GACZ,OAAOr3B,KAAKy8I,GAAG,QAASplH,GAQnB,cAAcriB,EAAsBqiB,GACzC,MAAMlxB,EAAU,YAAQ6O,GAAWhV,KAAK8hD,SAAWj/C,QAAQoD,UAM3D,YAJgBvB,IAAb2yB,GACDlxB,EAAQtF,KAAK,IAAMw2B,KAGdlxB,EAGD,gBACFnG,KAAK+S,YACP/S,KAAK+S,WAAY,EAEjB/S,KAAKgtH,IAAI,KACPhtH,KAAKy9B,SAASi/G,MAAQ18I,KAAKy9B,SAASi/G,KAAKz2I,UACzCjG,KAAKy9B,SAASk/G,OAAS38I,KAAKy9B,SAASk/G,MAAM12I,UAE3CjG,KAAK+S,WAAY,EACjB/S,KAAKy9B,SAAW,QAOxB,MAAmB,IAAemkB,cAAgBA,GACnC,O,gCCzEf,6CAQe,SAASqE,EAAoBhkD,GAC1C,OAAO,oBAAoBA,aAAa26I,YAAc36I,EAAE+Y,QAAQ,GAAGC,QAAU,K,gCCT/E,oBAgHA,MAAM69C,EAAkB,IAjGjB,MACE,WACL,OAAO,IAAW/iC,UAAU,uBAAuBl1B,KAAMwF,GAChDA,GAIJ,eAAe+3B,EAKlB,IAIF,OAAOp+B,KAAKg0B,WAAWnzB,KAAKozB,IAC1B,IAAI4oH,EACAC,EACJ,MAAMpkG,EAAwC,CAC5CqkG,SAAU,KACVC,aAAc,CACZ51I,EAAG,gCACHwyD,KAAMx7B,EAASw7B,KACfhB,MAAOx6B,EAASw6B,QAKlBikF,EADCz+G,EAASy7B,gBACW,IAAWojF,aAAa,aAAc7+G,EAASy7B,gBAAiB5lC,GAAO,GAEvEpxB,QAAQoD,QAAQ,CACnCmB,EAAG,4BAKP,MAAM81I,EAAUjpH,EAAMkpH,SAChBC,EAAQ,IAAIn5H,WAAWi5H,EAAQE,MAAMj7I,OAAS,IAWpD,OAVAi7I,EAAMC,YACND,EAAMzoI,IAAIuoI,EAAQE,MAAO,GACzBF,EAAQE,MAAQA,EAGdN,EADC1+G,EAAS27B,YACO,IAAWkjF,aAAa,aAAc7+G,EAAS27B,YAAa9lC,GAAO,GAEnEpxB,QAAQoD,QAAQ,IAAIge,YAGhCphB,QAAQC,IAAI,CAAC+5I,EAAoBC,IAAiBj8I,KAAMy8I,IAC7D5kG,EAAOqkG,SAAWO,EAAO,GACzB5kG,EAAOskG,aAAaG,SAAWD,EAC/BxkG,EAAOskG,aAAaO,kBAAoBD,EAAO,GAExC,IAAWvnH,UAAU,iCAAkC2iB,OAK7D,MAAMqkG,EAAkB9oH,EAAwBjxB,EAAe,IACpE,OAAO,IAAWi6I,aAAa,aAAcF,EAAU9oH,GAAO,GAAOpzB,KAAM28I,GAElE,IAAWznH,UAAU,qBAAsB,CAChDgnH,SAAUS,GACTx6I,GAASnC,KAAK+5D,IACD,uBAAXA,EAAKxzD,GACN,IAAWq2I,QAAQ7iF,EAAKv2B,MAGnBu2B,KAKN,qBAAqB14C,GAC1B,OAAO,IAAW6T,UAAU,+BAAgC,CAAC7T,SAGxD,sBACL,OAAO,IAAW6T,UAAU,+BAGvB,sBACL,OAAO,IAAWA,UAAU,iCAehC,IAAe+iC,gBAAkBA,EAClB,O,gCClHf,qDASe,MAAM4kF,UAA2B,IAK9C,YAAY16I,EAA6B,IACvCC,MAAM,OAAD,QACHC,WAAW,GACRF,IAPA,KAAA1B,iBAAkB,EAsClB,KAAAq8I,kBAAqB17I,IAC1B,YAAYA,GACZjC,KAAKsB,iBAAmBtB,KAAKsB,gBAE7BtB,KAAK49I,cAAcx9I,UAAUkM,OAAO,aAActM,KAAKsB,iBACtDtB,KAAK+B,MAA2BoB,KAAOnD,KAAKsB,gBAAkB,OAAS,WACxEtB,KAAKqB,6BAA+BrB,KAAKqB,+BAlCzC,MAAMU,EAAQ/B,KAAK+B,MACnBA,EAAMoB,KAAO,WACbpB,EAAMqB,aAAa,WAAY,IAC/BrB,EAAMsB,aAAe,MAQrB,MAAMw6I,EAAW39I,SAASC,cAAc,SACxC09I,EAASz9I,UAAUC,IAAI,YACvBw9I,EAASC,UAAY,EACrBD,EAAS16I,KAAO,WAChBpB,EAAM+O,cAAc2O,QAAQo+H,GAC5B97I,EAAM+O,cAAciQ,aAAa88H,EAASnxG,YAAa3qC,EAAMq2D,aAE7D,MAAMwlF,EAAgB59I,KAAK49I,cAAgB19I,SAASC,cAAc,QAClEy9I,EAAcx9I,UAAUC,IAAI,iBAAkB,SAE9CL,KAAKC,UAAUG,UAAUC,IAAI,wBAC7BL,KAAKC,UAAU8J,OAAO6zI,GAEtBA,EAAc58I,iBAAiB,QAAShB,KAAK29I,mBAC7CC,EAAc58I,iBAAiB,WAAYhB,KAAK29I","file":"14.11183df10f220f2bd1db.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","import IMAGE_MIME_TYPES_SUPPORTED from \"./imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"./videoMimeTypesSupport\";\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function setInnerHTML(elem: Element, html: string) {\r\n elem.setAttribute('dir', 'auto');\r\n elem.innerHTML = html;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, MessageAction } from \"../layer\";\nimport type { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport { forEachReverse } from \"./array\";\n\nexport default function filterChatPhotosMessages(value: {\n count: number;\n next_rate: number;\n offset_id_offset: number;\n history: MyMessage[];\n}) {\n forEachReverse(value.history, (message, idx, arr) => {\n if(!((message as Message.messageService).action as MessageAction.messageActionChatEditPhoto).photo) {\n arr.splice(idx, 1);\n if(value.count !== undefined) {\n --value.count;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { forEachReverse } from \"./array\";\nimport { safeAssign } from \"./object\";\n\nexport type ListLoaderOptions = {\n loadMore: ListLoader['loadMore'],\n loadCount?: ListLoader['loadCount'],\n loadWhenLeft?: ListLoader['loadWhenLeft'],\n processItem?: ListLoader['processItem'],\n onJump?: ListLoader['onJump'],\n onLoadedMore?: ListLoader['onLoadedMore']\n};\n\nexport type ListLoaderResult = {count: number, items: any[]};\nexport default class ListLoader {\n public current: T;\n public previous: T[] = [];\n public next: T[] = [];\n public count: number;\n public reverse = false; // reverse means next = higher msgid\n\n protected loadMore: (anchor: T, older: boolean, loadCount: number) => Promise>;\n protected processItem: (item: P) => T;\n protected loadCount = 50;\n protected loadWhenLeft = 20;\n \n public onJump: (item: T, older: boolean) => void;\n public onLoadedMore: () => void;\n\n protected loadedAllUp = false;\n protected loadedAllDown = false;\n protected loadPromiseUp: Promise;\n protected loadPromiseDown: Promise;\n\n constructor(options: ListLoaderOptions) {\n safeAssign(this, options);\n }\n\n public setTargets(previous: T[], next: T[], reverse: boolean) {\n this.previous = previous;\n this.next = next;\n this.reverse = reverse;\n }\n\n public get index() {\n return this.count !== undefined ? this.previous.length : -1;\n }\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.loadedAllUp = this.loadedAllDown = loadedAll;\n this.loadPromiseUp = this.loadPromiseDown = null;\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 this.previous.push(this.current, ...items);\n } else {\n items = this.previous.splice(this.previous.length + length, -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n this.next.unshift(...items, this.current);\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 // нет смысла делать проверку для reverse и loadMediaPromise\n public load(older: boolean) {\n if(older && this.loadedAllDown) return Promise.resolve();\n else if(!older && this.loadedAllUp) return Promise.resolve();\n\n if(older && this.loadPromiseDown) return this.loadPromiseDown;\n else if(!older && this.loadPromiseUp) return this.loadPromiseUp;\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 const promise = this.loadMore(anchor, older, this.loadCount).then(result => {\n if((older && this.loadPromiseDown !== promise) || (!older && this.loadPromiseUp !== promise)) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n if(older) this.loadedAllDown = true;\n else this.loadedAllUp = true;\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const method = older ? result.items.forEach.bind(result.items) : forEachReverse.bind(null, result.items);\n method((item: any) => {\n const processed = this.processItem ? this.processItem(item) : item;\n\n if(!processed) return;\n\n if(older) {\n if(this.reverse) this.previous.unshift(processed);\n else this.next.push(processed);\n } else {\n if(this.reverse) this.next.push(processed);\n else this.previous.unshift(processed);\n }\n });\n\n this.onLoadedMore && this.onLoadedMore();\n }, () => {}).then(() => {\n if(older) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n });\n\n if(older) this.loadPromiseDown = promise;\n else this.loadPromiseUp = promise;\n\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MediaSearchContext } from \"../components/appMediaPlaybackController\";\nimport type { SearchSuperContext } from \"../components/appSearchSuper.\";\nimport type { Message } from \"../layer\";\nimport appMessagesIdsManager from \"../lib/appManagers/appMessagesIdsManager\";\nimport appMessagesManager, { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport { forEachReverse } from \"./array\";\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 constructor(options: Omit, 'loadMore'> & {onEmptied?: () => void} = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = this.current?.mid;\n\n if(anchor) maxId = anchor.mid;\n if(!older) maxId = appMessagesIdsManager.incrementMessageId(maxId, 1);\n\n return appMessagesManager.getSearch({\n ...this.searchContext,\n peerId: this.searchContext.peerId || anchor?.peerId,\n maxId,\n limit: backLimit ? 0 : loadCount,\n backLimit\n }).then(value => {\n /* if(DEBUG) {\n this.log('loaded more media by maxId:', maxId, value, older, this.reverse);\n } */\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n filterChatPhotosMessages(value);\n }\n\n if(value.next_rate) {\n this.searchContext.nextRate = value.next_rate;\n }\n\n return {count: value.count, items: value.history};\n });\n },\n processItem: (message) => {\n const filtered = this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n }\n\n protected filterMids(mids: number[]) {\n const storage = this.searchContext.isScheduled ? \n appMessagesManager.getScheduledMessagesStorage(this.searchContext.peerId) : \n appMessagesManager.getMessagesStorage(this.searchContext.peerId);\n const filtered = appMessagesManager.filterMessagesByInputFilter(this.searchContext.inputFilter._, mids, storage, mids.length) as Message.message[];\n return filtered;\n }\n\n protected onHistoryDelete = ({peerId, msgs}: {peerId: PeerId, msgs: Set}) => {\n const shouldBeDeleted = (item: Item) => item.peerId === peerId && msgs.has(item.mid);\n const filter = (item: Item, idx: number, arr: Item[]) => {\n if(shouldBeDeleted(item)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n\n if(this.current && shouldBeDeleted(this.current)) {\n /* if(this.go(1)) {\n this.previous.splice(this.previous.length - 1, 1);\n } else if(this.go(-1)) {\n this.next.splice(0, 1);\n } else */if(this.onEmptied) {\n this.onEmptied();\n }\n }\n };\n\n protected onHistoryMultiappend = (obj: {\n [peerId: string]: Set;\n }) => {\n if(this.searchContext.folderId !== undefined) {\n return;\n }\n\n // because it's reversed\n if(!this.loadedAllUp || this.loadPromiseUp) {\n return;\n }\n\n const mids = obj[this.searchContext.peerId];\n if(!mids) {\n return;\n }\n\n const sorted = Array.from(mids).sort((a, b) => a - b);\n const filtered = this.filterMids(sorted);\n const targets = filtered.map(message => this.processItem(message)).filter(Boolean);\n if(targets.length) {\n this.next.push(...targets);\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend({\n [message.peerId]: new Set([message.mid])\n });\n };\n\n public setSearchContext(context: SearchSuperContext) {\n this.searchContext = context;\n\n if(this.searchContext.folderId !== undefined) {\n this.loadedAllUp = true;\n\n if(this.searchContext.nextRate === undefined) {\n this.loadedAllDown = true;\n }\n }\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n this.loadedAllUp = true;\n }\n\n if(!this.searchContext.useSearch) {\n this.loadedAllDown = this.loadedAllUp = true;\n }\n }\n\n public reset() {\n super.reset();\n this.searchContext = undefined;\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}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\r\nimport Scrollable from \"./scrollable\";\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport InputSearch from \"./inputSearch\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nexport class SearchGroup {\r\n container: HTMLDivElement;\r\n nameEl: HTMLDivElement;\r\n list: HTMLUListElement;\r\n\r\n constructor(public name: LangPackKey | boolean, public type: string, private clearable = true, className?: string, clickable = true, public autonomous = true, public onFound?: () => void) {\r\n this.list = appDialogsManager.createChatList();\r\n this.container = document.createElement('div');\r\n if(className) this.container.className = className;\r\n \r\n if(name) {\r\n this.nameEl = document.createElement('div');\r\n this.nameEl.classList.add('search-group__name');\r\n if(typeof(name) === 'string') {\r\n this.nameEl.append(i18n(name));\r\n }\r\n this.container.append(this.nameEl);\r\n }\r\n \r\n this.container.classList.add('search-group', 'search-group-' + type);\r\n this.container.append(this.list);\r\n this.container.style.display = 'none';\r\n\r\n if(clickable) {\r\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\r\n }\r\n }\r\n\r\n clear() {\r\n this.container.style.display = 'none';\r\n\r\n if(this.clearable) {\r\n this.list.innerHTML = '';\r\n }\r\n }\r\n\r\n setActive() {\r\n this.container.style.display = '';\r\n }\r\n\r\n toggle() {\r\n if(this.list.childElementCount) {\r\n this.setActive();\r\n } else {\r\n this.clear();\r\n }\r\n }\r\n}\r\n\r\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\r\n\r\nexport default class AppSearch {\r\n private minMsgId = 0;\r\n private loadedCount = -1;\r\n private foundCount = -1;\r\n\r\n private searchPromise: Promise = null;\r\n private searchTimeout: number = 0;\r\n\r\n private query = '';\r\n\r\n private listsContainer: HTMLDivElement = null;\r\n\r\n private peerId: PeerId; // 0 - means global\r\n private threadId = 0;\r\n\r\n private scrollable: Scrollable;\r\n\r\n constructor(public container: HTMLElement, public searchInput: InputSearch, public searchGroups: {[group in SearchGroupType]: SearchGroup}, public onSearch?: (count: number) => void) {\r\n this.scrollable = new Scrollable(this.container);\r\n this.listsContainer = this.scrollable.container as HTMLDivElement;\r\n for(let i in this.searchGroups) {\r\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\r\n }\r\n\r\n if(this.searchGroups.messages) {\r\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\r\n }\r\n\r\n this.searchInput.onChange = (value) => {\r\n /* if(!value.trim()) {\r\n //this.peerId = 0;\r\n return;\r\n } */\r\n \r\n this.query = value;\r\n this.reset(false);\r\n this.searchMore();\r\n };\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n if(!this.query.trim()) return;\r\n \r\n if(!this.searchTimeout) {\r\n this.searchTimeout = window.setTimeout(() => {\r\n this.searchMore();\r\n this.searchTimeout = 0;\r\n }, 0);\r\n }\r\n };\r\n }\r\n\r\n public reset(all = true) {\r\n if(all) {\r\n this.searchInput.value = '';\r\n this.query = '';\r\n this.peerId = undefined;\r\n this.threadId = 0;\r\n }\r\n\r\n this.minMsgId = 0;\r\n this.loadedCount = -1;\r\n this.foundCount = -1;\r\n\r\n for(let i in this.searchGroups) {\r\n this.searchGroups[i as SearchGroupType].clear();\r\n }\r\n \r\n this.searchPromise = null;\r\n }\r\n\r\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n\r\n if(this.query !== query) {\r\n this.searchInput.inputField.value = query;\r\n }\r\n\r\n this.searchInput.input.focus();\r\n }\r\n\r\n public searchMore() {\r\n if(this.searchPromise) return this.searchPromise;\r\n \r\n const query = this.query;\r\n \r\n if(!query.trim()) {\r\n this.onSearch && this.onSearch(0);\r\n return;\r\n }\r\n \r\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\r\n return Promise.resolve();\r\n }\r\n \r\n const maxId = this.minMsgId || 0;\r\n\r\n return this.searchPromise = appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n query, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n maxId, \r\n limit: 20,\r\n threadId: this.threadId\r\n }).then(res => {\r\n this.searchPromise = null;\r\n \r\n if(this.searchInput.value !== query) {\r\n return;\r\n }\r\n \r\n //console.log('input search result:', this.peerId, query, null, maxId, 20, res);\r\n \r\n const {count, history} = res;\r\n \r\n if(history.length && history[0].mid === this.minMsgId) {\r\n history.shift();\r\n }\r\n \r\n const searchGroup = this.searchGroups.messages;\r\n\r\n history.forEach((message) => {\r\n const peerId = this.peerId ? message.fromId : message.peerId;\r\n const {dialog, dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId, \r\n container: this.scrollable/* searchGroup.list */, \r\n drawStatus: false,\r\n avatarSize: 54,\r\n meAsSaved: false\r\n });\r\n\r\n if(message.peerId !== peerId) {\r\n dom.listEl.dataset.peerId = '' + message.peerId;\r\n }\r\n\r\n appDialogsManager.setLastMessage(dialog, message, dom, query);\r\n });\r\n\r\n searchGroup.toggle();\r\n \r\n this.minMsgId = history.length && history[history.length - 1].mid;\r\n \r\n if(this.loadedCount === -1) {\r\n this.loadedCount = 0;\r\n }\r\n this.loadedCount += history.length;\r\n \r\n if(this.foundCount === -1) {\r\n this.foundCount = count;\r\n\r\n if(searchGroup.nameEl) {\r\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\r\n }\r\n \r\n this.onSearch && this.onSearch(this.foundCount);\r\n }\r\n }).catch(err => {\r\n console.error('search error', err);\r\n this.searchPromise = null;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { getRichValue } from \"../helpers/dom\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport InputField from \"./inputField\";\r\n\r\nexport default class InputSearch {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputField: InputField;\r\n public clearBtn: HTMLElement;\r\n\r\n public prevValue = '';\r\n public timeout = 0;\r\n public onChange: (value: string) => void;\r\n public onClear: () => void;\r\n\r\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\r\n this.inputField = new InputField({\r\n placeholder,\r\n plainText: true\r\n });\r\n\r\n this.container = this.inputField.container;\r\n this.container.classList.remove('input-field');\r\n this.container.classList.add('input-search');\r\n\r\n this.onChange = onChange;\r\n\r\n this.input = this.inputField.input;\r\n this.input.classList.add('input-search-input');\r\n\r\n const searchIcon = document.createElement('i');\r\n searchIcon.classList.add('tgico', 'tgico-search');\r\n\r\n this.clearBtn = document.createElement('i');\r\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\r\n\r\n this.input.addEventListener('input', this.onInput);\r\n this.clearBtn.addEventListener('click', this.onClearClick);\r\n\r\n this.container.append(searchIcon, this.clearBtn);\r\n }\r\n \r\n onInput = () => {\r\n if(!this.onChange) return;\r\n\r\n let value = this.value;\r\n\r\n //this.input.classList.toggle('is-empty', !value.trim());\r\n\r\n if(value !== this.prevValue) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.timeout = window.setTimeout(() => {\r\n this.onChange(value);\r\n }, 200);\r\n }\r\n };\r\n\r\n onClearClick = () => {\r\n this.value = '';\r\n this.onChange && this.onChange('');\r\n this.onClear && this.onClear();\r\n };\r\n\r\n get value() {\r\n return this.inputField.value;\r\n }\r\n\r\n set value(value: string) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.inputField.value = value;\r\n }\r\n\r\n public remove() {\r\n clearTimeout(this.timeout);\r\n this.input.removeEventListener('input', this.onInput);\r\n this.clearBtn.removeEventListener('click', this.onClearClick);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from \"./button\";\r\n\r\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-icon', {\r\n icon: className || undefined, \r\n ...options\r\n });\r\n\r\n return button;\r\n};\r\n\r\nexport default ButtonIcon;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport EventListenerBase from \"../helpers/eventListenerBase\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport Scrollable from \"./scrollable\";\r\nimport SidebarSlider from \"./slider\";\r\n\r\nexport interface SliderTab {\r\n onOpen?: () => void,\r\n onOpenAfterTimeout?: () => void,\r\n onClose?: () => void,\r\n onCloseAfterTimeout?: () => void\r\n}\r\n\r\nexport interface SliderSuperTabConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTab;\r\n}\r\n\r\nexport default class SliderSuperTab implements SliderTab {\r\n public container: HTMLElement;\r\n\r\n public header: HTMLElement;\r\n public closeBtn: HTMLElement;\r\n public title: HTMLElement;\r\n\r\n public content: HTMLElement;\r\n public scrollable: Scrollable;\r\n\r\n public slider: SidebarSlider;\r\n public destroyable: boolean;\r\n public listenerSetter: ListenerSetter;\r\n\r\n constructor(slider: SidebarSlider, destroyable?: boolean) {\r\n this._constructor(slider, destroyable);\r\n }\r\n\r\n public _constructor(slider: SidebarSlider, destroyable = true): any {\r\n this.slider = slider;\r\n this.destroyable = destroyable;\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\r\n\r\n // * Header\r\n this.header = document.createElement('div');\r\n this.header.classList.add('sidebar-header');\r\n\r\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\r\n this.title = document.createElement('div');\r\n this.title.classList.add('sidebar-header__title');\r\n this.header.append(this.closeBtn, this.title);\r\n\r\n // * Content\r\n this.content = document.createElement('div');\r\n this.content.classList.add('sidebar-content');\r\n\r\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\r\n\r\n this.container.append(this.header, this.content);\r\n\r\n this.slider.addTab(this);\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public close() {\r\n return this.slider.closeTab(this);\r\n }\r\n\r\n public async open(...args: any[]) {\r\n if(this.init) {\r\n try {\r\n const result = this.init();\r\n this.init = null;\r\n\r\n if(result instanceof Promise) {\r\n await result;\r\n }\r\n } catch(err) {\r\n console.error('open tab error', err);\r\n }\r\n }\r\n\r\n return this.slider.selectTab(this);\r\n }\r\n\r\n protected init(): Promise | any {\r\n\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\r\n this.slider.tabs.delete(this);\r\n this.container.remove();\r\n }\r\n\r\n if(this.listenerSetter) {\r\n this.listenerSetter.removeAll();\r\n }\r\n }\r\n\r\n protected setTitle(key: LangPackKey) {\r\n this.title.innerHTML = '';\r\n this.title.append(i18n(key));\r\n }\r\n}\r\n\r\nexport class SliderSuperTabEventable extends SliderSuperTab {\r\n public eventListener: EventListenerBase<{\r\n destroy: () => void\r\n }>;\r\n\r\n constructor(slider: SidebarSlider) {\r\n super(slider);\r\n this.eventListener = new EventListenerBase();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.eventListener.dispatchEvent('destroy');\r\n this.eventListener.cleanup();\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n\r\n/* // @ts-ignore\r\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\r\n superConstructor: (...args: any[]) => any;\r\n}\r\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\r\n constructor(slider: SidebarSlider) {\r\n this.superConstructor([slider, true]);\r\n }\r\n}\r\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\r\n\r\n(window as any).lol = SliderSuperEventsTab\r\n\r\nexport {SliderSuperEventsTab}; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { horizontalMenu } from \"./horizontalMenu\";\r\nimport { TransitionSlider } from \"./transition\";\r\nimport appNavigationController, { NavigationItem } from \"./appNavigationController\";\r\nimport SliderSuperTab, { SliderSuperTabConstructable, SliderTab } from \"./sliderTab\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\n\r\nconst TRANSITION_TIME = 250;\r\n\r\nexport type {SliderTab};\r\nexport {SliderSuperTab};\r\n\r\nexport default class SidebarSlider {\r\n protected _selectTab: ReturnType;\r\n public historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\r\n public tabsContainer: HTMLElement;\r\n public sidebarEl: HTMLElement;\r\n public tabs: Map; // * key is any, since right sidebar is ugly now\r\n private canHideFirst = false;\r\n private navigationType: NavigationItem['type']\r\n\r\n constructor(options: {\r\n sidebarEl: SidebarSlider['sidebarEl'],\r\n tabs?: SidebarSlider['tabs'],\r\n canHideFirst?: SidebarSlider['canHideFirst'],\r\n navigationType: SidebarSlider['navigationType']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.tabs) {\r\n this.tabs = new Map();\r\n }\r\n\r\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\r\n this._selectTab = TransitionSlider(this.tabsContainer, 'navigation', TRANSITION_TIME);\r\n if(!this.canHideFirst) {\r\n this._selectTab(0);\r\n }\r\n\r\n Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach(el => {\r\n attachClickEvent(el, this.onCloseBtnClick);\r\n });\r\n }\r\n\r\n public onCloseBtnClick = () => {\r\n const item = appNavigationController.findItemByType(this.navigationType);\r\n if(item) {\r\n appNavigationController.back(this.navigationType);\r\n } else if(this.historyTabIds.length) {\r\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\r\n }\r\n // this.closeTab();\r\n };\r\n\r\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\r\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\r\n return false;\r\n }\r\n\r\n //console.log('sidebar-close-button click:', this.historyTabIDs);\r\n const closingId = this.historyTabIds.pop(); // pop current\r\n this.onCloseTab(closingId, animate, isNavigation);\r\n\r\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\r\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\r\n return true;\r\n };\r\n\r\n public selectTab(id: number | SliderSuperTab): boolean {\r\n /* if(id instanceof SliderSuperTab) {\r\n id = id.id;\r\n } */\r\n\r\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\r\n return false;\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onOpen) {\r\n tab.onOpen();\r\n }\r\n \r\n if(tab.onOpenAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onOpenAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n\r\n //if(!this.canHideFirst || this.historyTabIds.length) {\r\n appNavigationController.pushItem({\r\n type: this.navigationType, \r\n onPop: (canAnimate) => {\r\n this.closeTab(undefined, canAnimate, true);\r\n return true;\r\n }\r\n });\r\n //}\r\n \r\n this.historyTabIds.push(id);\r\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\r\n return true;\r\n }\r\n\r\n public removeTabFromHistory(id: number | SliderSuperTab) {\r\n indexOfAndSplice(this.historyTabIds, id);\r\n this.onCloseTab(id, undefined);\r\n }\r\n\r\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\r\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\r\n const tab = this.historyTabIds[i];\r\n if(tab === preserveTab) continue;\r\n else if(tab instanceof tabConstructor) {\r\n break;\r\n }\r\n\r\n this.removeTabFromHistory(tab);\r\n //appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n }\r\n\r\n public getTab(tabConstructor: SliderSuperTabConstructable) {\r\n return this.historyTabIds.find(t => t instanceof tabConstructor) as SliderSuperTab;\r\n }\r\n\r\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\r\n return !!this.getTab(tabConstructor);\r\n }\r\n\r\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\r\n if(!isNavigation) {\r\n appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onClose) {\r\n tab.onClose();\r\n }\r\n\r\n if(tab.onCloseAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onCloseAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n }\r\n\r\n public addTab(tab: SliderSuperTab) {\r\n if(!tab.container.parentElement) {\r\n this.tabsContainer.append(tab.container);\r\n\r\n if(tab.closeBtn) {\r\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\r\n }\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport type { InputFile } from \"../layer\";\r\nimport PopupAvatar from \"./popups/avatar\";\r\n\r\nexport default class AvatarEdit {\r\n public container: HTMLElement;\r\n private canvas: HTMLCanvasElement;\r\n private icon: HTMLSpanElement;\r\n\r\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('avatar-edit');\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.canvas.classList.add('avatar-edit-canvas');\r\n\r\n this.icon = document.createElement('span');\r\n this.icon.classList.add('tgico', 'tgico-cameraadd');\r\n\r\n this.container.append(this.canvas, this.icon);\r\n\r\n this.container.addEventListener('click', () => {\r\n new PopupAvatar().open(this.canvas, onChange);\r\n });\r\n }\r\n\r\n public clear() {\r\n const ctx = this.canvas.getContext('2d');\r\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from \"./button\";\r\n\r\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\r\n return button;\r\n};\r\n\r\nexport default ButtonCorner;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarLeft from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport { SearchGroup } from \"../../appSearch\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppNewGroupTab extends SliderSuperTab {\r\n private searchGroup = new SearchGroup(true, 'contacts', true, 'new-group-members disable-hover', false);\r\n private avatarEdit: AvatarEdit;\r\n private uploadAvatar: () => Promise = null;\r\n private peerIds: PeerId[];\r\n private nextBtn: HTMLButtonElement;\r\n private groupNameInputField: InputField;\r\n\r\n protected init() {\r\n this.container.classList.add('new-group-container');\r\n this.setTitle('NewGroup');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const 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 inputWrapper.append(this.groupNameInputField.container);\r\n\r\n this.groupNameInputField.input.addEventListener('input', () => {\r\n const value = this.groupNameInputField.value;\r\n this.nextBtn.classList.toggle('is-visible', !!value.length && !this.groupNameInputField.input.classList.contains('error'));\r\n });\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.groupNameInputField.value;\r\n\r\n this.nextBtn.disabled = true;\r\n appChatsManager.createChat(title, this.peerIds.map(peerId => peerId.toUserId())).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n });\r\n });\r\n\r\n const chatsContainer = document.createElement('div');\r\n chatsContainer.classList.add('chatlist-container');\r\n chatsContainer.append(this.searchGroup.container);\r\n\r\n this.content.append(this.nextBtn);\r\n this.scrollable.append(this.avatarEdit.container, inputWrapper, chatsContainer);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.searchGroup.clear();\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.groupNameInputField.value = '';\r\n this.nextBtn.disabled = false;\r\n }\r\n\r\n public open(peerIds: PeerId[]) {\r\n const result = super.open();\r\n result.then(() => {\r\n this.peerIds = peerIds;\r\n\r\n this.peerIds.forEach(userId => {\r\n let {dom} = appDialogsManager.addDialogNew({\r\n dialog: userId,\r\n container: this.searchGroup.list,\r\n drawStatus: false,\r\n rippleEnabled: false,\r\n avatarSize: 48\r\n });\r\n\r\n dom.lastMessageSpan.append(appUsersManager.getUserStatusString(userId));\r\n });\r\n\r\n this.searchGroup.nameEl.textContent = '';\r\n this.searchGroup.nameEl.append(i18n('Members', [this.peerIds.length]));\r\n this.searchGroup.setActive();\r\n });\r\n \r\n return result;\r\n }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { IS_APPLE, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport type { SearchSuperContext } from \"./appSearchSuper.\";\r\nimport { copy, deepEqual } from \"../helpers/object\";\r\nimport { DocumentAttribute, Message, MessageMedia, PhotoSize } from \"../layer\";\r\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport SearchListLoader from \"../helpers/searchListLoader\";\r\nimport { onMediaLoad } from \"../helpers/files\";\r\n\r\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\r\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\r\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\r\n\r\nexport type MediaItem = {mid: number, peerId: PeerId};\r\n\r\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\r\n\r\nconst SHOULD_USE_SAFARI_FIX = (() => {\r\n try {\r\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\r\n } catch(err) {\r\n return false;\r\n }\r\n})();\r\n\r\nconst SEEK_OFFSET = 10;\r\n\r\nexport type MediaSearchContext = SearchSuperContext & Partial<{\r\n isScheduled: boolean,\r\n useSearch: boolean\r\n}>;\r\n\r\ntype MediaDetails = {\r\n peerId: PeerId, \r\n mid: number, \r\n docId: DocId, \r\n clean?: boolean,\r\n isScheduled?: boolean, \r\n isSingle?: boolean\r\n};\r\n\r\nclass AppMediaPlaybackController {\r\n private container: HTMLElement;\r\n private media: Map> = new Map();\r\n private scheduled: AppMediaPlaybackController['media'] = new Map();\r\n private mediaDetails: Map = new Map();\r\n private playingMedia: HTMLMediaElement;\r\n\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 private _volume = 1;\r\n private _muted = false;\r\n private _playbackRate = 1;\r\n private lockedSwitchers: boolean;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n //this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\r\n this.container.style.cssText = 'display: none;';\r\n document.body.append(this.container);\r\n\r\n if(navigator.mediaSession) {\r\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\r\n play: this.play,\r\n pause: this.pause,\r\n stop: this.stop,\r\n seekbackward: this.seekBackward,\r\n seekforward: this.seekForward,\r\n seekto: this.seekTo,\r\n previoustrack: this.previous,\r\n nexttrack: this.next\r\n };\r\n\r\n for(const action in actions) {\r\n try {\r\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\r\n } catch(err) {\r\n console.warn('MediaSession action is not supported:', action);\r\n }\r\n }\r\n }\r\n\r\n rootScope.addEventListener('document_downloaded', (doc) => {\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n for(const media of set) {\r\n this.onMediaDocumentLoad(media);\r\n }\r\n }\r\n });\r\n\r\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\r\n const keys = [\r\n 'volume' as const, \r\n 'muted' as const, \r\n 'playbackRate' as const\r\n ];\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) {\r\n // @ts-ignore\r\n this.playingMedia[key] = value;\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 const {volume, muted, playbackRate} = this;\r\n rootScope.dispatchEvent('media_playback_params', {\r\n volume, muted, playbackRate\r\n });\r\n }\r\n\r\n public seekBackward = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekForward = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekTo = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = details.seekTime;\r\n }\r\n };\r\n\r\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\r\n const {peerId, mid} = message;\r\n\r\n const isScheduled = !!message.pFlags.is_scheduled;\r\n const s = isScheduled ? this.scheduled : this.media;\r\n let storage = s.get(message.peerId);\r\n if(!storage) {\r\n s.set(message.peerId, storage = new Map());\r\n }\r\n\r\n let media = storage.get(mid);\r\n if(media) {\r\n return media;\r\n }\r\n\r\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(message);\r\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\r\n //const source = document.createElement('source');\r\n //source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\r\n\r\n if(doc.type === 'round') {\r\n media.setAttribute('playsinline', 'true');\r\n //media.muted = true;\r\n }\r\n\r\n const details: MediaDetails = {\r\n peerId,\r\n mid,\r\n docId: doc.id,\r\n clean,\r\n isScheduled: message.pFlags.is_scheduled\r\n };\r\n\r\n this.mediaDetails.set(media, details);\r\n\r\n //media.autoplay = true;\r\n media.volume = 1;\r\n //media.append(source);\r\n\r\n this.container.append(media);\r\n\r\n media.addEventListener('play', this.onPlay);\r\n media.addEventListener('pause', this.onPause);\r\n media.addEventListener('ended', this.onEnded);\r\n\r\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\r\n media.addEventListener('timeupdate', () => {\r\n appMessagesManager.readMessages(peerId, [mid]);\r\n }, {once: true});\r\n }\r\n \r\n /* const onError = (e: Event) => {\r\n //console.log('appMediaPlaybackController: video onError', e);\r\n\r\n if(this.nextMid === mid) {\r\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\r\n if(this.nextMid && storage[this.nextMid]) {\r\n storage[this.nextMid].play();\r\n }\r\n });\r\n }\r\n };\r\n\r\n media.addEventListener('error', onError); */\r\n\r\n const deferred = deferredPromise();\r\n if(autoload) {\r\n deferred.resolve();\r\n } else {\r\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n let waitingStorage = w.get(peerId);\r\n if(!waitingStorage) {\r\n w.set(peerId, waitingStorage = new Map());\r\n }\r\n\r\n waitingStorage.set(mid, deferred);\r\n }\r\n\r\n deferred.then(() => {\r\n //media.autoplay = true;\r\n //console.log('will set media url:', media, doc, doc.type, doc.url);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(doc.supportsStreaming || cacheContext.url) {\r\n this.onMediaDocumentLoad(media);\r\n } else {\r\n let set = this.waitingDocumentsForLoad[doc.id];\r\n if(!set) {\r\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\r\n }\r\n\r\n set.add(media);\r\n appDocsManager.downloadDoc(doc);\r\n }\r\n }/* , onError */);\r\n \r\n return media;\r\n }\r\n\r\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\r\n return s?.get(mid);\r\n }\r\n\r\n private onMediaDocumentLoad = (media: HTMLMediaElement) => {\r\n const details = this.mediaDetails.get(media);\r\n const doc = appDocsManager.getDoc(details.docId);\r\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\r\n this.handleSafariStreamable(media);\r\n }\r\n\r\n // setTimeout(() => {\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n media.src = cacheContext.url;\r\n // }, doc.supportsStreaming ? 500e3 : 0);\r\n\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n set.delete(media);\r\n\r\n if(!set.size) {\r\n delete this.waitingDocumentsForLoad[doc.id];\r\n }\r\n }\r\n };\r\n\r\n // safari подгрузит последний чанк и песня включится,\r\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\r\n private handleSafariStreamable(media: HTMLMediaElement) {\r\n media.addEventListener('play', () => {\r\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\r\n return;\r\n } */\r\n\r\n //media.volume = 0;\r\n const currentTime = media.currentTime;\r\n //this.setSafariBuffering(media, true);\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = media.duration - 1;\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = currentTime;\r\n //media.volume = 1;\r\n //this.setSafariBuffering(media, false);\r\n\r\n if(!media.paused) {\r\n media.play()/* .catch(() => {}) */;\r\n }\r\n }, {once: true});\r\n }, {once: true});\r\n }/* , {once: true} */);\r\n }\r\n\r\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n const storage = w.get(peerId);\r\n if(!storage) {\r\n return;\r\n }\r\n\r\n const promise = storage.get(mid);\r\n if(promise) {\r\n promise.resolve();\r\n storage.delete(mid);\r\n\r\n if(!storage.size) {\r\n w.delete(peerId);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Only for audio\r\n */\r\n public isSafariBuffering(media: HTMLMediaElement) {\r\n /// @ts-ignore\r\n return !!media.safariBuffering;\r\n }\r\n\r\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\r\n // @ts-ignore\r\n media.safariBuffering = value;\r\n }\r\n\r\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\r\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\r\n\r\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\r\n \r\n const artwork: MediaImage[] = [];\r\n\r\n const isVoice = doc.type === 'voice' || doc.type === 'round';\r\n let title = '', artist = '';\r\n\r\n if(doc.thumbs?.length) {\r\n const size = doc.thumbs[doc.thumbs.length - 1];\r\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\r\n const cacheContext = appDownloadManager.getCacheContext(doc, size.type);\r\n\r\n if(cacheContext.url) {\r\n artwork.push({\r\n src: cacheContext.url,\r\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n const download = appPhotosManager.preloadPhoto(doc, size);\r\n download.then(() => {\r\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\r\n return;\r\n }\r\n\r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n } else if(isVoice) {\r\n const peerId = message.fromId || message.peerId;\r\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\r\n if(peerPhoto) {\r\n const result = appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\r\n if(result.cached) {\r\n const url = await result.loadPromise;\r\n artwork.push({\r\n src: url,\r\n sizes: '160x160',\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n result.loadPromise.then((url) => {\r\n if(this.playingMedia !== playingMedia || !url) {\r\n return;\r\n }\r\n \r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n\r\n title = appPeersManager.getPeerTitle(peerId, true, false);\r\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\r\n }\r\n\r\n if(!isVoice) {\r\n const attribute = doc.attributes.find(attribute => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\r\n title = attribute && attribute.title || doc.file_name;\r\n artist = attribute && attribute.performer;\r\n }\r\n\r\n if(!artwork.length) {\r\n if(IS_APPLE) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon-precomposed.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n } else {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n }\r\n } else {\r\n [72, 96, 144, 192, 256, 384, 512].forEach(size => {\r\n const sizes = `${size}x${size}`;\r\n artwork.push({\r\n src: `assets/img/android-chrome-${sizes}.png`,\r\n sizes,\r\n type: 'image/png'\r\n });\r\n });\r\n }\r\n }\r\n\r\n const metadata = new MediaMetadata({\r\n title,\r\n artist,\r\n artwork\r\n });\r\n\r\n navigator.mediaSession.metadata = metadata;\r\n }\r\n\r\n private getMessageByMedia(media: HTMLMediaElement) {\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n const message = details.isScheduled ? appMessagesManager.getScheduledMessageByPeer(peerId, mid) : appMessagesManager.getMessageByPeer(peerId, mid);\r\n return message;\r\n }\r\n\r\n private onPlay = (e?: Event) => {\r\n const media = e.target as HTMLMediaElement;\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n\r\n //console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\r\n\r\n const message = this.getMessageByMedia(media);\r\n\r\n const previousMedia = this.playingMedia;\r\n if(previousMedia !== media) {\r\n this.stop();\r\n\r\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\r\n if(!this.listLoader.current || !verify(this.listLoader.current)) {\r\n let idx = this.listLoader.previous.findIndex(verify);\r\n let jumpLength: number;\r\n if(idx !== -1) {\r\n jumpLength = -(this.listLoader.previous.length - idx);\r\n } else {\r\n idx = this.listLoader.next.findIndex(verify);\r\n if(idx !== -1) {\r\n jumpLength = idx + 1;\r\n }\r\n }\r\n \r\n if(idx !== -1) {\r\n if(jumpLength) {\r\n this.listLoader.go(jumpLength, false);\r\n }\r\n } else {\r\n this.setTargets({peerId, mid});\r\n }\r\n }\r\n\r\n this.setMedia(media, message);\r\n }\r\n\r\n // audio_pause не успеет сработать без таймаута\r\n setTimeout(() => {\r\n rootScope.dispatchEvent('media_play', {doc: appMessagesManager.getMediaFromMessage(message), message, media});\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 rootScope.dispatchEvent('media_pause');\r\n };\r\n\r\n private onEnded = (e?: Event) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n\r\n this.onPause(e);\r\n\r\n //console.log('on media end');\r\n\r\n if(!this.next()) {\r\n this.stop();\r\n rootScope.dispatchEvent('media_stop');\r\n }\r\n };\r\n\r\n public toggle(play?: boolean) {\r\n if(!this.playingMedia) {\r\n return false;\r\n }\r\n\r\n if(play === undefined) {\r\n play = this.playingMedia.paused;\r\n }\r\n\r\n if(this.playingMedia.paused !== play) {\r\n return false;\r\n }\r\n\r\n if(play) {\r\n this.playingMedia.play();\r\n } else {\r\n this.playingMedia.pause();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public play = () => {\r\n return this.toggle(true);\r\n };\r\n\r\n public pause = () => {\r\n return this.toggle(false);\r\n };\r\n\r\n public stop = () => {\r\n const media = this.playingMedia;\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(!media.paused) {\r\n media.pause();\r\n }\r\n\r\n media.currentTime = 0;\r\n simulateEvent(media, 'ended');\r\n\r\n const details = this.mediaDetails.get(media);\r\n if(details?.clean) {\r\n media.src = '';\r\n const peerId = details.peerId;\r\n const s = details.isScheduled ? this.scheduled : this.media;\r\n const storage = s.get(peerId);\r\n if(storage) {\r\n storage.delete(details.mid);\r\n \r\n if(!storage.size) {\r\n s.delete(peerId);\r\n }\r\n }\r\n \r\n media.remove();\r\n\r\n this.mediaDetails.delete(media);\r\n }\r\n\r\n this.playingMedia = undefined;\r\n\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 next = () => {\r\n return !this.lockedSwitchers && this.listLoader.go(1);\r\n };\r\n\r\n public previous = () => {\r\n const media = this.playingMedia;\r\n if(media && (media.currentTime > 5 || !this.listLoader.previous.length)) {\r\n media.currentTime = 0;\r\n this.toggle(true);\r\n return;\r\n }\r\n\r\n return !this.lockedSwitchers && this.listLoader.go(-1);\r\n };\r\n\r\n public willBePlayed(media: HTMLMediaElement) {\r\n this.willBePlayedMedia = media;\r\n }\r\n\r\n public setSearchContext(context: MediaSearchContext) {\r\n if(deepEqual(this.searchContext, context)) {\r\n return false;\r\n }\r\n\r\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\r\n return true;\r\n }\r\n\r\n public getSearchContext() {\r\n return this.searchContext;\r\n }\r\n\r\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\r\n if(!this.listLoader) {\r\n this.listLoader = new SearchListLoader({\r\n loadCount: 10,\r\n loadWhenLeft: 5,\r\n processItem: (message: Message.message) => {\r\n this.addMedia(message, false);\r\n return {peerId: message.peerId, mid: message.mid};\r\n },\r\n onJump: (item, older) => {\r\n this.playItem(item);\r\n },\r\n onEmptied: () => {\r\n rootScope.dispatchEvent('media_stop');\r\n this.stop();\r\n }\r\n });\r\n } else {\r\n this.listLoader.reset();\r\n }\r\n\r\n const reverse = this.searchContext.folderId !== undefined ? false : true;\r\n if(prev) {\r\n this.listLoader.setTargets(prev, next, reverse);\r\n } else {\r\n this.listLoader.reverse = reverse;\r\n }\r\n\r\n this.listLoader.setSearchContext(this.searchContext);\r\n this.listLoader.current = current;\r\n\r\n this.listLoader.load(true);\r\n this.listLoader.load(false);\r\n }\r\n\r\n public setMedia(media: HTMLMediaElement, message: Message.message) {\r\n this.playingMedia = media;\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('mediaSession' in navigator) {\r\n this.setNewMediadata(message);\r\n }\r\n }\r\n\r\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\r\n const playingMedia = this.playingMedia;\r\n\r\n const wasPlaying = this.pause();\r\n\r\n this.willBePlayed(undefined);\r\n if(media) this.setMedia(media, message);\r\n else this.playingMedia = undefined;\r\n this.toggleSwitchers(false);\r\n\r\n return () => {\r\n this.toggleSwitchers(true);\r\n\r\n if(playingMedia) {\r\n if(this.mediaDetails.get(playingMedia)) {\r\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\r\n } else {\r\n this.next() || this.previous();\r\n }\r\n }\r\n\r\n if(media && this.playingMedia === media) {\r\n this.stop();\r\n }\r\n\r\n if(wasPlaying) {\r\n this.play();\r\n }\r\n };\r\n }\r\n\r\n public toggleSwitchers(enabled: boolean) {\r\n this.lockedSwitchers = !enabled;\r\n }\r\n}\r\n\r\nconst appMediaPlaybackController = new AppMediaPlaybackController();\r\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\r\nexport default appMediaPlaybackController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\r\n\r\nexport default function attachGrabListeners(element: HTMLElement, \r\n onStart: (position: GrabEvent) => void, \r\n onMove: (position: GrabEvent) => void, \r\n onEnd?: (position: GrabEvent) => void) {\r\n // * Mouse\r\n const onMouseMove = (event: MouseEvent) => {\r\n onMove({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseUp = (event: MouseEvent) => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseDown = (event: MouseEvent) => {\r\n if(event.button !== 0) {\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n return;\r\n }\r\n\r\n onStart({x: event.pageX, y: event.pageY, event});\r\n onMouseMove(event);\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp, {once: true});\r\n };\r\n\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n\r\n // * Touch\r\n const onTouchMove = (event: TouchEvent) => {\r\n event.preventDefault();\r\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchEnd = (event: TouchEvent) => {\r\n document.removeEventListener('touchmove', onTouchMove);\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchStart = (event: TouchEvent) => {\r\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n onTouchMove(event);\r\n\r\n document.addEventListener('touchmove', onTouchMove, {passive: false});\r\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\r\n };\r\n\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n\r\n return () => {\r\n element.removeEventListener('mousedown', onMouseDown);\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n\r\n element.removeEventListener('touchstart', onTouchStart);\r\n document.removeEventListener('touchmove', onTouchMove);\r\n document.removeEventListener('touchend', onTouchEnd);\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { clamp } from \"../helpers/number\";\r\nimport attachGrabListeners, { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\r\nimport { safeAssign } from \"../helpers/object\";\r\n\r\nexport default class RangeSelector {\r\n public container: HTMLDivElement;\r\n protected filled: HTMLDivElement;\r\n protected seek: HTMLInputElement;\r\n\r\n public mousedown = false;\r\n protected rect: DOMRect;\r\n protected _removeListeners: () => void;\r\n\r\n private events: Partial<{\r\n //onMouseMove: ProgressLine['onMouseMove'],\r\n onMouseDown: RangeSelector['onMouseDown'],\r\n onMouseUp: RangeSelector['onMouseUp'],\r\n onScrub: (value: number) => void\r\n }> = {};\r\n\r\n protected decimals: number;\r\n\r\n protected step: number;\r\n protected min: number;\r\n protected max: number;\r\n protected withTransition = false;\r\n protected useTransform = false;\r\n protected vertical = false;\r\n\r\n constructor(\r\n options: {\r\n step: RangeSelector['step'],\r\n min: RangeSelector['min'],\r\n max: RangeSelector['max'],\r\n withTransition?: RangeSelector['withTransition'],\r\n useTransform?: RangeSelector['useTransform'],\r\n vertical?: RangeSelector['vertical']\r\n }, \r\n value = 0\r\n ) {\r\n safeAssign(this, options);\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('progress-line');\r\n\r\n // there is no sense in using transition with transform, because it is updating every frame\r\n if(this.useTransform) {\r\n this.container.classList.add('use-transform');\r\n } else if(this.withTransition) {\r\n this.container.classList.add('with-transition');\r\n }\r\n\r\n this.filled = document.createElement('div');\r\n this.filled.classList.add('progress-line__filled');\r\n\r\n const seek = this.seek = document.createElement('input');\r\n seek.classList.add('progress-line__seek');\r\n //seek.setAttribute('max', '0');\r\n seek.type = 'range';\r\n seek.step = '' + this.step;\r\n seek.min = '' + this.min;\r\n seek.max = '' + this.max;\r\n seek.value = '' + value;\r\n\r\n if(value) {\r\n this.setProgress(value);\r\n }\r\n\r\n const stepStr = '' + this.step;\r\n const index = stepStr.indexOf('.');\r\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\r\n\r\n //this.setListeners();\r\n\r\n this.container.append(this.filled, seek);\r\n }\r\n\r\n get value() {\r\n return +this.seek.value;\r\n }\r\n\r\n public setHandlers(events: RangeSelector['events']) {\r\n this.events = events;\r\n }\r\n\r\n protected onMouseMove = (event: GrabEvent) => {\r\n this.scrub(event);\r\n };\r\n\r\n protected onMouseDown = (event: GrabEvent) => {\r\n this.rect = this.container.getBoundingClientRect();\r\n this.mousedown = true;\r\n this.scrub(event);\r\n this.container.classList.add('is-focused');\r\n this.events?.onMouseDown && this.events.onMouseDown(event);\r\n };\r\n\r\n protected onMouseUp = (event: GrabEvent) => {\r\n this.mousedown = false;\r\n this.container.classList.remove('is-focused');\r\n this.events?.onMouseUp && this.events.onMouseUp(event);\r\n };\r\n\r\n public setListeners() {\r\n this.seek.addEventListener('input', this.onInput);\r\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\r\n }\r\n\r\n public onInput = () => {\r\n const value = +this.seek.value;\r\n this.setFilled(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n };\r\n\r\n public setProgress(value: number) {\r\n this.seek.value = '' + value;\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public addProgress(value: number) {\r\n this.seek.value = '' + (+this.seek.value + value);\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public setFilled(value: number) {\r\n let percents = (value - this.min) / (this.max - this.min);\r\n percents = clamp(percents, 0, 1);\r\n \r\n // using scaleX and width even with vertical because it will be rotated\r\n if(this.useTransform) {\r\n this.filled.style.transform = `scaleX(${percents})`;\r\n } else {\r\n this.filled.style.width = (percents * 100) + '%';\r\n }\r\n }\r\n\r\n protected scrub(event: GrabEvent) {\r\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\r\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\r\n\r\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\r\n\r\n if((value - this.min) < ((this.max - this.min) / 2)) {\r\n value -= this.step / 10;\r\n }\r\n \r\n value = +value.toFixed(this.decimals);\r\n value = clamp(value, this.min, this.max);\r\n\r\n //this.seek.value = '' + value;\r\n //this.onInput();\r\n\r\n this.setProgress(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n\r\n return value;\r\n }\r\n\r\n public removeListeners() {\r\n if(this._removeListeners) {\r\n this._removeListeners();\r\n this._removeListeners = null;\r\n }\r\n\r\n this.seek.removeEventListener('input', this.onInput);\r\n \r\n this.events = {};\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { AttachClickOptions, attachClickEvent, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { i18n, LangPackKey } from \"../lib/langPack\";\nimport CheckboxField from \"./checkboxField\";\nimport { closeBtnMenu } from \"./misc\";\nimport { ripple } from \"./ripple\";\n\nexport type ButtonMenuItemOptions = {\n icon?: string, \n text?: LangPackKey, \n regularText?: string, \n onClick: (e: MouseEvent | TouchEvent) => void | boolean, \n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean\n /* , cancelEvent?: true */\n};\n\nconst ButtonMenuItem = (options: ButtonMenuItemOptions) => {\n if(options.element) return options.element;\n\n const {icon, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item' + (icon ? ' tgico-' + icon : '');\n ripple(el);\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text) : 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 attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ (e) => {\n cancelEvent(e);\n const result = onClick(e);\n\n if(result === false) {\n return;\n }\n\n if(!keepOpen) {\n closeBtnMenu();\n }\n\n if(checkboxField && !noCheckboxClickListener/* && result !== false */) {\n checkboxField.checked = checkboxField.input.type === 'radio' ? true : !checkboxField.checked;\n }\n }/* : onClick */, options.options);\n\n if(checkboxField) {\n el.append(checkboxField.label);\n }\n\n return options.element = el;\n};\n\nconst ButtonMenu = (buttons: ButtonMenuItemOptions[], listenerSetter?: ListenerSetter) => {\n const el = document.createElement('div');\n el.classList.add('btn-menu');\n\n if(listenerSetter) {\n buttons.forEach(b => {\n if(b.options) {\n b.options.listenerSetter = listenerSetter;\n } else {\n b.options = {listenerSetter};\n }\n });\n }\n\n const items = buttons.map(ButtonMenuItem);\n\n el.append(...items);\n\n return el;\n};\n\nexport default ButtonMenu;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { AttachClickOptions, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\r\nimport { closeBtnMenu, openBtnMenu } from \"./misc\";\r\n\r\nconst ButtonMenuToggle = (options: Partial<{noRipple: true, onlyMobile: true, listenerSetter: ListenerSetter, asDiv: boolean}> = {}, direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right', buttons: ButtonMenuItemOptions[], onOpen?: (e: Event) => void) => {\r\n options.asDiv = true;\r\n const button = ButtonIcon('more btn-menu-toggle', options);\r\n\r\n const btnMenu = ButtonMenu(buttons, options.listenerSetter);\r\n btnMenu.classList.add(direction);\r\n ButtonMenuToggleHandler(button, onOpen, options);\r\n button.append(btnMenu);\r\n return button;\r\n};\r\n\r\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\r\nconst ButtonMenuToggleHandler = (el: HTMLElement, onOpen?: (e: Event) => void, options?: AttachClickOptions) => {\r\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\r\n\r\n //console.trace('ButtonMenuToggleHandler attach', el, onOpen, options);\r\n add(CLICK_EVENT_NAME, (e: Event) => {\r\n //console.log('ButtonMenuToggleHandler click', e);\r\n if(!el.classList.contains('btn-menu-toggle')) return false;\r\n\r\n //window.removeEventListener('mousemove', onMouseMove);\r\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\r\n cancelEvent(e);\r\n\r\n if(el.classList.contains('menu-open')) {\r\n closeBtnMenu();\r\n } else {\r\n onOpen && onOpen(e);\r\n openBtnMenu(openedMenu);\r\n }\r\n });\r\n};\r\n\r\nexport { ButtonMenuToggleHandler };\r\nexport default ButtonMenuToggle;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport EventListenerBase from \"../eventListenerBase\";\nimport ListenerSetter from \"../listenerSetter\";\nimport { safeAssign } from \"../object\";\nimport findUpClassName from \"./findUpClassName\";\n\nexport default class ControlsHover extends EventListenerBase<{\n toggleControls: (show: boolean) => void\n}> {\n protected showControlsTimeout: number;\n protected controlsLocked: boolean;\n\n protected canHideControls: () => boolean;\n protected element: HTMLElement;\n protected listenerSetter: ListenerSetter;\n protected showOnLeaveToClassName: string;\n\n constructor() {\n super(false);\n this.showControlsTimeout = 0;\n }\n \n public setup(options: {\n element: HTMLElement, \n listenerSetter: ListenerSetter, \n canHideControls?: () => boolean,\n showOnLeaveToClassName?: string\n }) {\n safeAssign(this, options);\n\n const {listenerSetter, element} = this;\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(element)('click', () => {\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 = () => {\n clearTimeout(this.showControlsTimeout);\n this.showControlsTimeout = 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.showControlsTimeout) {\n clearTimeout(this.showControlsTimeout);\n this.showControlsTimeout = 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.showControlsTimeout = 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 appMediaPlaybackController from \"../components/appMediaPlaybackController\";\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport RangeSelector from \"../components/rangeSelector\";\nimport { onMediaLoad } from \"../helpers/files\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport ButtonMenu from \"../components/buttonMenu\";\nimport { ButtonMenuToggleHandler } from \"../components/buttonMenuToggle\";\nimport rootScope from \"./rootScope\";\nimport { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ControlsHover from \"../helpers/dom/controlsHover\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../helpers/dom/fullScreen\";\n\nexport class MediaProgressLine extends RangeSelector {\n protected filledLoad: HTMLDivElement;\n\n protected progressRAF = 0;\n\n protected media: HTMLMediaElement;\n protected streamable: boolean;\n\n constructor(media?: HTMLAudioElement | HTMLVideoElement, streamable?: boolean, withTransition?: boolean, useTransform?: boolean) {\n super({\n step: 1000 / 60 / 1000, \n min: 0, \n max: 1, \n withTransition, \n useTransform\n }, 0);\n\n if(media) {\n this.setMedia(media, streamable);\n }\n }\n\n public setMedia(media: HTMLMediaElement, streamable = false) {\n if(this.media) {\n this.removeListeners();\n }\n\n if(streamable && !this.filledLoad) {\n this.filledLoad = document.createElement('div');\n this.filledLoad.classList.add('progress-line__filled', 'progress-line__loaded');\n this.container.prepend(this.filledLoad);\n //this.setLoadProgress();\n } else if(this.filledLoad) {\n this.filledLoad.classList.toggle('hide', !streamable);\n }\n\n this.media = media;\n this.streamable = streamable;\n if(!media.paused || media.currentTime > 0) {\n this.onPlay();\n }\n\n let wasPlaying = false;\n this.setSeekMax();\n this.setListeners();\n this.setHandlers({\n onMouseDown: () => {\n wasPlaying = !this.media.paused;\n wasPlaying && this.media.pause();\n },\n\n onMouseUp: (e) => {\n // cancelEvent(e.event);\n wasPlaying && this.media.play();\n }\n });\n }\n\n protected onLoadedData = () => {\n this.max = this.media.duration;\n this.seek.setAttribute('max', '' + this.max);\n };\n\n protected onEnded = () => {\n this.setProgress();\n };\n\n protected onPlay = () => {\n let r = () => {\n this.setProgress();\n\n this.progressRAF = this.media.paused ? 0 : window.requestAnimationFrame(r);\n };\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n }\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n\n this.progressRAF = window.requestAnimationFrame(r);\n };\n\n protected onTimeUpdate = () => {\n if(this.media.paused) {\n this.setProgress();\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n }\n };\n\n protected onProgress = (e: Event) => {\n this.setLoadProgress();\n };\n\n protected scrub(e: GrabEvent) {\n const scrubTime = super.scrub(e);\n this.media.currentTime = scrubTime;\n return scrubTime;\n }\n\n protected setLoadProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const buf = this.media.buffered;\n const numRanges = buf.length;\n\n const currentTime = this.media.currentTime;\n let nearestStart = 0, end = 0;\n for(let i = 0; i < numRanges; ++i) {\n const start = buf.start(i);\n if(currentTime >= start && start >= nearestStart) {\n nearestStart = start;\n end = buf.end(i);\n }\n\n //console.log('onProgress range:', i, buf.start(i), buf.end(i), this.media);\n }\n\n //console.log('onProgress correct range:', nearestStart, end, this.media);\n\n const percents = this.media.duration ? end / this.media.duration : 0;\n this.filledLoad.style.width = (percents * 100) + '%';\n //this.filledLoad.style.transform = 'scaleX(' + percents + ')';\n }\n\n protected setSeekMax() {\n this.max = this.media.duration || 0;\n if(this.max > 0) {\n this.onLoadedData();\n } else {\n this.media.addEventListener('loadeddata', this.onLoadedData);\n }\n }\n\n public setProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const currentTime = this.media.currentTime;\n\n super.setProgress(currentTime);\n }\n\n public setListeners() {\n super.setListeners();\n this.media.addEventListener('ended', this.onEnded);\n this.media.addEventListener('play', this.onPlay);\n this.media.addEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.addEventListener('progress', this.onProgress);\n }\n\n public removeListeners() {\n super.removeListeners();\n\n 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 if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = 0;\n }\n }\n}\n\nexport class VolumeSelector extends RangeSelector {\n public btn: HTMLElement;\n protected volumeSvg: HTMLElement;\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 this.btn = document.createElement('div');\n this.btn.classList.add('player-volume');\n\n this.btn.innerHTML = `\n \n `;\n this.btn.classList.add('btn-icon');\n this.volumeSvg = this.btn.firstElementChild as HTMLElement;\n\n this.btn.append(this.container);\n\n attachClickEvent(this.volumeSvg, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(rootScope)('media_playback_params', this.setVolume);\n\n this.setVolume();\n }\n\n private onMuteClick = (e?: Event) => {\n e && cancelEvent(e);\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n };\n\n private setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n if(!volume || muted) {\n d = `M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z`;\n } else if(volume > .5) {\n d = `M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z`;\n } else if(volume > 0 && volume < .25) {\n d = `M7 9v6h4l5 5V4l-5 5H7z`;\n } else {\n d = `M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z`;\n }\n\n try {\n this.volumeSvg.innerHTML = ``;\n } catch(err) {}\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\n }\n };\n}\n\nexport default class VideoPlayer extends ControlsHover {\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n constructor(protected video: HTMLVideoElement, play = false, streamable = false, duration?: number) {\n super();\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\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;\n },\n showOnLeaveToClassName: 'media-viewer-caption'\n });\n\n video.parentNode.insertBefore(this.wrapper, video);\n this.wrapper.appendChild(video);\n\n this.skin = 'default';\n\n this.stylePlayer(duration);\n // this.setBtnMenuToggle();\n\n if(this.skin === 'default') {\n const controls = this.wrapper.querySelector('.default__controls.ckin__controls') as HTMLDivElement;\n this.progress = new MediaProgressLine(video, streamable);\n controls.prepend(this.progress.container);\n }\n\n if(play/* && video.paused */) {\n const promise = video.play();\n promise.catch((err: Error) => {\n if(err.name === 'NotAllowedError') {\n video.muted = true;\n video.autoplay = true;\n video.play();\n }\n }).finally(() => { // due to autoplay, play will not call\n this.wrapper.classList.toggle('is-playing', !this.video.paused);\n });\n //(this.wrapper.querySelector('.toggle') as HTMLButtonElement).click();\n }\n }\n\n private stylePlayer(initDuration: number) {\n const {wrapper, video, skin, listenerSetter} = this;\n\n wrapper.classList.add(skin);\n \n const html = this.buildControls();\n wrapper.insertAdjacentHTML('beforeend', html);\n let timeDuration: HTMLElement;\n \n if(skin === 'default') {\n const toggle = wrapper.querySelectorAll('.toggle') as NodeListOf;\n const fullScreenButton = wrapper.querySelector('.fullscreen') as HTMLElement;\n const timeElapsed = wrapper.querySelector('#time-elapsed');\n timeDuration = wrapper.querySelector('#time-duration') as HTMLElement;\n timeDuration.innerHTML = String(video.duration | 0).toHHMMSS();\n\n const volumeSelector = new VolumeSelector(listenerSetter);\n\n const leftControls = wrapper.querySelector('.left-controls');\n volumeSelector.btn.classList.remove('btn-icon');\n leftControls.insertBefore(volumeSelector.btn, timeElapsed.parentElement);\n\n Array.from(toggle).forEach((button) => {\n listenerSetter.add(button)('click', () => {\n this.togglePlay();\n });\n });\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('click', () => {\n this.togglePlay();\n });\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(rootScope.overlaysActive > 1) { // forward popup is active, etc\n return;\n }\n\n const {key, code} = e;\n\n let good = true;\n if(code === 'KeyF') {\n this.toggleFullScreen();\n } else if(code === 'KeyM') {\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n } else if(code === 'Space') {\n this.togglePlay();\n } else if(e.altKey && code === 'Equal') {\n appMediaPlaybackController.playbackRate += .25;\n } else if(e.altKey && code === 'Minus') {\n appMediaPlaybackController.playbackRate -= .25;\n } else if(wrapper.classList.contains('ckin__fullscreen') && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if(key === 'ArrowLeft') appMediaPlaybackController.seekBackward({action: 'seekbackward'});\n else appMediaPlaybackController.seekForward({action: 'seekforward'});\n } else {\n good = false;\n }\n\n if(good) {\n cancelEvent(e);\n return false;\n }\n });\n }\n \n /* player.addEventListener('click', (e) => {\n if(e.target !== player) {\n return;\n }\n\n this.togglePlay();\n }); */\n \n /* video.addEventListener('play', () => {\n }); */\n\n listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n listenerSetter.add(fullScreenButton)('click', () => {\n this.toggleFullScreen();\n });\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.innerHTML = String(video.currentTime | 0).toHHMMSS();\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n }\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('is-playing');\n });\n\n listenerSetter.add(video)('pause', () => {\n wrapper.classList.remove('is-playing');\n });\n \n if(video.duration || initDuration) {\n timeDuration.innerHTML = String(Math.round(video.duration || initDuration)).toHHMMSS();\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.innerHTML = String(Math.round(video.duration)).toHHMMSS();\n });\n }\n }\n\n protected togglePlay() {\n this.video[this.video.paused ? 'play' : 'pause']();\n }\n\n private buildControls() {\n const skin = this.skin;\n if(skin === 'default') {\n return `\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0] = [0.25, 0.5, 1, 1.25, 1.5, 2].map((rate) => {\n return { \n regularText: rate === 1 ? 'Normal' : '' + rate, \n onClick: () => {\n this.video.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenu(buttons);\n const settingsButton = this.wrapper.querySelector('.settings') as HTMLElement;\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler(settingsButton);\n settingsButton.append(btnMenu);\n }\n \n protected toggleFullScreen() {\n const player = this.wrapper;\n\n // * https://caniuse.com/#feat=fullscreen\n if(IS_APPLE_MOBILE) {\n const video = this.video as any;\n video.webkitEnterFullscreen();\n video.enterFullscreen();\n return;\n }\n \n if(!isFullScreen()) {\n /* const videoParent = this.video.parentElement;\n const videoWhichChild = whichChild(this.video);\n const needVideoRemount = videoParent !== player;\n\n if(needVideoRemount) {\n this.videoParent = videoParent;\n this.videoWhichChild = videoWhichChild;\n player.prepend(this.video);\n } */\n \n requestFullScreen(player);\n } else {\n /* if(this.videoParent) {\n const {videoWhichChild, videoParent} = this;\n if(!videoWhichChild) {\n videoParent.prepend(this.video);\n } else {\n videoParent.insertBefore(this.video, videoParent.children[videoWhichChild]);\n }\n\n this.videoParent = null;\n this.videoWhichChild = -1;\n } */\n \n cancelFullScreen();\n }\n }\n \n protected onFullScreen(fullScreenButton: HTMLElement) {\n const isFull = isFullScreen();\n this.wrapper.classList.toggle('ckin__fullscreen', isFull);\n if(!isFull) {\n fullScreenButton.classList.remove('tgico-smallscreen');\n fullScreenButton.classList.add('tgico-fullscreen');\n fullScreenButton.setAttribute('title', 'Full Screen');\n } else {\n fullScreenButton.classList.remove('tgico-fullscreen');\n fullScreenButton.classList.add('tgico-smallscreen');\n fullScreenButton.setAttribute('title', 'Exit Full Screen');\n }\n }\n\n public removeListeners() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n }\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 appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\nimport { wrapPhoto } from \"./wrappers\";\nimport ProgressivePreloader from \"./preloader\";\nimport { MediaProgressLine } from \"../lib/mediaPlayer\";\nimport appMediaPlaybackController, { MediaItem, MediaSearchContext } from \"./appMediaPlaybackController\";\nimport { DocumentAttribute, Message } from \"../layer\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../environment/userAgent\";\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport './middleEllipsis';\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\nimport ListenerSetter, { Listener } from \"../helpers/listenerSetter\";\nimport noop from \"../helpers/noop\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { joinElementsWith } from \"../lib/langPack\";\nimport { MiddleEllipsisElement } from \"./middleEllipsis\";\nimport htmlToSpan from \"../helpers/dom/htmlToSpan\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport { clamp, formatBytes } from \"../helpers/number\";\nimport throttleWithRaf from \"../helpers/schedulers/throttleWithRaf\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\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 wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\n\n 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 duration = doc.duration;\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');\n svg.setAttributeNS(null, 'width', '' + availW);\n svg.setAttributeNS(null, 'height', '' + barHeightMax);\n svg.setAttributeNS(null, 'viewBox', `0 0 ${availW} ${barHeightMax}`);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(svg, timeDiv);\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 //console.log('decoded waveform:', waveform);\n\n const normValue = Math.max(...waveform);\n const wfSize = waveform.length ? waveform.length : 100;\n const barCount = Math.min((availW / (barWidth + barMargin)) | 0, wfSize);\n\n let maxValue = 0;\n const maxDelta = barHeightMax - barHeightMin;\n\n let html = '';\n for(let i = 0, barX = 0, sumI = 0; i < wfSize; ++i) {\n const value = waveform[i] || 0;\n if((sumI + barCount) >= wfSize) { // draw bar\n sumI = sumI + barCount - wfSize;\n\t\t\tif(sumI < (barCount + 1) / 2) {\n\t\t\t\tif(maxValue < value) maxValue = value;\n }\n \n const bar_value = Math.max(((maxValue * maxDelta) + ((normValue + 1) / 2)) / (normValue + 1), barHeightMin);\n \n const h = `\n \n `;\n html += h;\n\n barX += barWidth + barMargin;\n\n if(sumI < (barCount + 1) / 2) {\n maxValue = 0;\n } else {\n maxValue = value;\n }\n } else {\n if(maxValue < value) maxValue = value;\n\n sumI += barCount;\n }\n }\n\n svg.insertAdjacentHTML('beforeend', html);\n const rects = Array.from(svg.children) as HTMLElement[];\n\n let progress = audioEl.querySelector('.audio-waveform') as HTMLDivElement;\n \n const onLoad = () => {\n let audio = audioEl.audio;\n\n const onTimeUpdate = () => {\n const lastIndex = audio.currentTime === audio.duration ? 0 : Math.ceil(audio.currentTime / audio.duration * barCount);\n \n //svg.children[lastIndex].setAttributeNS(null, 'fill', '#000');\n //svg.children[lastIndex].classList.add('active'); #Иногда пропускает полоски..\n rects.forEach((node, idx) => node.classList.toggle('active', idx < lastIndex));\n //++lastIndex;\n //console.log('lastIndex:', lastIndex, audio.currentTime);\n //}, duration * 1000 / svg.childElementCount | 0/* 63 * duration / 10 */);\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\n audioEl.readyPromise.then(() => {\n let mousedown = false, mousemove = false;\n progress.addEventListener('mouseleave', (e) => {\n if(mousedown) {\n audio.play();\n mousedown = false;\n }\n mousemove = false;\n })\n progress.addEventListener('mousemove', (e) => {\n mousemove = true;\n if(mousedown) scrub(e);\n });\n progress.addEventListener('mousedown', (e) => {\n e.preventDefault();\n if(e.button !== 0) return;\n if(!audio.paused) {\n audio.pause();\n }\n \n scrub(e);\n mousedown = true;\n });\n progress.addEventListener('mouseup', (e) => {\n if(mousemove && mousedown) {\n audio.play();\n mousedown = false;\n }\n });\n attachClickEvent(progress, (e) => {\n cancelEvent(e);\n if(!audio.paused) scrub(e);\n });\n \n function scrub(e: MouseEvent | TouchEvent) {\n let offsetX: number;\n if(e instanceof MouseEvent) {\n offsetX = e.offsetX;\n } else { // touch\n const rect = (e.target as HTMLElement).getBoundingClientRect();\n offsetX = e.targetTouches[0].pageX - rect.left;\n }\n \n const scrubTime = offsetX / availW /* width */ * audio.duration;\n audio.currentTime = scrubTime;\n }\n }, noop);\n \n return () => {\n progress.remove();\n progress = null;\n audio = null;\n };\n };\n\n return onLoad;\n}\n\nfunction wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(message);\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n \n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(doc.audioPerformer) {\n parts.push(htmlToSpan(doc.audioPerformer));\n }\n\n if(withTime) {\n parts.push(formatFullSentTime(message.date));\n } else if(!parts.length) {\n parts.push(formatBytes(doc.size));\n }\n\n if(audioEl.showSender) {\n parts.push(appMessagesManager.wrapSenderToPeer(message));\n }\n\n descriptionEl.append(...joinElementsWith(parts, ' • '));\n }\n\n const html = `\n
\n
\n
\n
`;\n audioEl.insertAdjacentHTML('beforeend', html);\n\n const titleEl = audioEl.querySelector('.audio-title') as HTMLElement;\n\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = audioEl.dataset.fontWeight;\n if(isVoice) {\n middleEllipsisEl.append(appMessagesManager.wrapSenderToPeer(message));\n } else {\n middleEllipsisEl.innerHTML = doc.audioTitle || doc.fileName;\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(appMessagesManager.wrapSentTime(message));\n }\n \n const subtitleDiv = audioEl.querySelector('.audio-subtitle') as HTMLDivElement;\n subtitleDiv.append(descriptionEl);\n\n const onLoad = () => {\n let launched = false;\n\n let progressLine = new MediaProgressLine(audioEl.audio, doc.supportsStreaming);\n\n audioEl.addAudioListener('ended', () => {\n audioEl.classList.remove('audio-show-progress');\n // Reset subtitle\n subtitleDiv.lastChild.replaceWith(descriptionEl);\n launched = false;\n });\n\n const onPlay = () => {\n if(!launched) {\n audioEl.classList.add('audio-show-progress');\n launched = true;\n\n if(progressLine) {\n subtitleDiv.lastChild.replaceWith(progressLine.container);\n }\n }\n };\n\n audioEl.addAudioListener('play', onPlay);\n\n if(!audioEl.audio.paused || audioEl.audio.currentTime > 0) {\n onPlay();\n }\n\n return () => {\n progressLine.removeListeners();\n progressLine.container.remove();\n progressLine = null;\n };\n };\n\n return onLoad;\n}\n\nfunction constructDownloadPreloader(tryAgainOnFail = true) {\n const preloader = new ProgressivePreloader({cancelable: true, tryAgainOnFail});\n preloader.construct();\n\n if(!tryAgainOnFail) {\n preloader.circle.setAttributeNS(null, 'r', '23');\n preloader.totalLength = 143.58203125;\n }\n\n return preloader;\n}\n\nexport const findMediaTargets = (anchor: HTMLElement/* , 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 return [prev, next];\n};\n\nexport default class AudioElement extends HTMLElement {\n public audio: HTMLAudioElement;\n public preloader: ProgressivePreloader;\n public message: Message.message;\n public withTime = false;\n public voiceAsMusic = false;\n public searchContext: MediaSearchContext;\n public showSender = false;\n public noAutoDownload: boolean;\n public lazyLoadQueue: LazyLoadQueue;\n public loadPromises: Promise[];\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public render() {\n this.classList.add('audio');\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(this.message);\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploading = isOutgoing && this.preloader;\n\n const durationStr = String(doc.duration | 0).toHHMMSS();\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n
`;\n\n const toggle = this.firstElementChild as HTMLElement;\n\n const downloadDiv = document.createElement('div');\n downloadDiv.classList.add('audio-download');\n\n const isUnread = doc.type !== 'audio' && this.message && this.message.pFlags.media_unread;\n if(isUnread) {\n this.classList.add('is-unread');\n }\n\n if(uploading) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = isVoice ? wrapVoiceMessage(this) : wrapAudio(this);\n \n const audioTimeDiv = this.querySelector('.audio-time') as HTMLDivElement;\n audioTimeDiv.innerHTML = durationStr;\n\n const onLoad = this.onLoad = (autoload: boolean) => {\n this.onLoad = undefined;\n\n const audio = this.audio = appMediaPlaybackController.addMedia(this.message, autoload);\n\n const readyPromise = this.readyPromise = deferredPromise();\n if(this.audio.readyState >= this.audio.HAVE_CURRENT_DATA) readyPromise.resolve();\n else {\n this.addAudioListener('canplay', () => readyPromise.resolve(), {once: true});\n }\n\n this.onTypeDisconnect = onTypeLoad();\n \n const getTimeStr = () => String(audio.currentTime | 0).toHHMMSS() + (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.searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: this.message.peerId, mid: this.message.mid}, prev, next);\n }\n\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n attachClickEvent(toggle, (e) => togglePlay(e), {listenerSetter: this.listenerSetter});\n\n this.addAudioListener('ended', () => {\n toggle.classList.remove('playing');\n audioTimeDiv.innerText = durationStr;\n });\n\n this.addAudioListener('timeupdate', () => {\n if((!audio.currentTime && audio.paused) || appMediaPlaybackController.isSafariBuffering(audio)) return;\n audioTimeDiv.innerText = getTimeStr();\n });\n\n this.addAudioListener('pause', () => {\n toggle.classList.remove('playing');\n });\n\n this.addAudioListener('play', onPlay);\n\n return togglePlay;\n };\n\n if(doc.thumbs?.length) {\n const imgs: HTMLImageElement[] = [];\n const wrapped = wrapPhoto({\n photo: doc, \n message: null, \n container: toggle, \n boxWidth: 48, \n boxHeight: 48,\n loadPromises: this.loadPromises,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue\n });\n toggle.style.width = toggle.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n\n this.classList.add('audio-with-thumb');\n imgs.forEach(img => img.classList.add('audio-thumb'));\n }\n\n if(!isOutgoing) {\n let preloader: ProgressivePreloader = this.preloader;\n\n onLoad(doc.type !== 'audio' && !this.noAutoDownload);\n\n const r = (shouldPlay: boolean) => {\n if(this.audio.src) {\n return;\n }\n\n appMediaPlaybackController.resolveWaitingForLoadMedia(this.message.peerId, this.message.mid, this.message.pFlags.is_scheduled);\n\n const onDownloadInit = () => {\n if(shouldPlay) {\n appMediaPlaybackController.willBePlayed(this.audio); // prepare for loading audio\n \n if(IS_SAFARI && !this.audio.autoplay) {\n this.audio.autoplay = true;\n }\n }\n };\n\n onDownloadInit();\n\n if(!preloader) {\n if(doc.supportsStreaming) {\n this.classList.add('corner-download');\n\n let pauseListener: Listener;\n const onPlay = () => {\n const preloader = constructDownloadPreloader(false);\n const deferred = deferredPromise();\n deferred.notifyAll({done: 75, total: 100});\n deferred.catch(() => {\n this.audio.pause();\n appMediaPlaybackController.willBePlayed(undefined);\n });\n deferred.cancel = () => {\n deferred.cancel = noop;\n const err = new Error();\n (err as any).type = 'CANCELED';\n deferred.reject(err);\n };\n preloader.attach(downloadDiv, false, deferred);\n\n pauseListener = this.addAudioListener('pause', () => {\n deferred.cancel();\n }, {once: true}) as any;\n\n onDownloadInit();\n };\n\n /* if(!this.audio.paused) {\n onPlay();\n } */\n\n const playListener: any = this.addAudioListener('play', onPlay);\n this.readyPromise.then(() => {\n this.listenerSetter.remove(playListener);\n this.listenerSetter.remove(pauseListener);\n });\n } else {\n preloader = constructDownloadPreloader();\n\n if(!shouldPlay) {\n this.readyPromise = deferredPromise();\n }\n\n const load = () => {\n onDownloadInit();\n\n const download = appDocsManager.downloadDoc(doc);\n \n if(!shouldPlay) {\n download.then(() => {\n this.readyPromise.resolve();\n });\n }\n\n preloader.attach(downloadDiv, false, download);\n return {download};\n };\n\n preloader.setDownloadFunction(load);\n load();\n }\n }\n\n this.append(downloadDiv);\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(doc.type !== 'audio' && !this.noAutoDownload) {\n r(false);\n } else {\n attachClickEvent(toggle, () => {\n r(true);\n }, {once: true, capture: true, passive: false, listenerSetter: this.listenerSetter});\n }\n }\n } else if(uploading) {\n this.dataset.isOutgoing = '1';\n this.preloader.attach(downloadDiv, false);\n //onLoad();\n }\n }\n\n get addAudioListener() {\n return this.listenerSetter.add(this.audio);\n }\n\n disconnectedCallback() {\n if(this.isConnected) {\n return;\n }\n \n if(this.onTypeDisconnect) {\n this.onTypeDisconnect();\n this.onTypeDisconnect = null;\n }\n\n if(this.readyPromise) {\n this.readyPromise.reject();\n }\n\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n\n this.preloader = null;\n }\n}\n\ncustomElements.define(\"audio-element\", AudioElement);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class DivAndCaption {\r\n public container: HTMLElement;\r\n public border: HTMLElement;\r\n public content: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLElement;\r\n\r\n constructor(protected className: string, public fill?: T) {\r\n this.container = document.createElement('div');\r\n this.container.className = className;\r\n\r\n this.border = document.createElement('div');\r\n this.border.classList.add(className + '-border');\r\n \r\n this.content = document.createElement('div');\r\n this.content.classList.add(className + '-content');\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add(className + '-title');\r\n this.title.setAttribute('dir', 'auto');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add(className + '-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n\r\n this.content.append(this.title, this.subtitle);\r\n this.container.append(this.border, this.content);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport { limitSymbols } from \"../../helpers/string\";\r\nimport appImManager, { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\r\nimport appPhotosManager from \"../../lib/appManagers/appPhotosManager\";\r\nimport { RichTextProcessor } from \"../../lib/richtextprocessor\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { wrapPhoto, wrapSticker } from \"../wrappers\";\r\n\r\nconst MEDIA_SIZE = 32;\r\n\r\nexport function wrapReplyDivAndCaption(options: {\r\n title: string | HTMLElement | DocumentFragment,\r\n titleEl: HTMLElement,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleEl: HTMLElement,\r\n message: any,\r\n mediaEl: HTMLElement,\r\n loadPromises?: Promise[]\r\n}) {\r\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises} = options;\r\n if(title !== undefined) {\r\n if(typeof(title) === 'string') {\r\n title = limitSymbols(title, 140);\r\n title = RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n replaceContent(titleEl, title);\r\n }\r\n\r\n if(!loadPromises) {\r\n loadPromises = [];\r\n }\r\n\r\n let media = message && message.media;\r\n let setMedia = false, isRound = false;\r\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\r\n let middleware: () => boolean;\r\n if(media && mediaEl) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(appMessagesManager.wrapMessageForReply(message, undefined, undefined, undefined, undefined, true));\r\n\r\n //console.log('wrap reply', media);\r\n\r\n if(media.webpage) {\r\n media = media.webpage;\r\n }\r\n \r\n if(media.photo || (media.document && media.document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(media.document.type) !== -1) */) {\r\n middleware = appImManager.chat.bubbles.getMiddleware();\r\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\r\n\r\n if(media.document?.type === 'sticker') {\r\n setMedia = true;\r\n wrapSticker({\r\n doc: media.document,\r\n div: mediaEl,\r\n lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //onlyThumb: media.document.sticker === 2,\r\n width: MEDIA_SIZE,\r\n height: MEDIA_SIZE,\r\n middleware,\r\n loadPromises\r\n });\r\n } else {\r\n const photo = media.photo || media.document;\r\n\r\n isRound = photo.type === 'round';\r\n\r\n try {\r\n wrapPhoto({\r\n photo,\r\n container: mediaEl,\r\n boxWidth: MEDIA_SIZE,\r\n boxHeight: MEDIA_SIZE,\r\n size: appPhotosManager.choosePhotoSize(photo, MEDIA_SIZE, MEDIA_SIZE),\r\n middleware,\r\n lazyLoadQueue,\r\n noBlur: true,\r\n withoutPreloader: true,\r\n loadPromises\r\n });\r\n setMedia = true;\r\n } catch(err) {\r\n\r\n }\r\n }\r\n }\r\n } else {\r\n if(message) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(appMessagesManager.wrapMessageForReply(message, message.message && limitSymbols(message.message, 140)));\r\n } else {\r\n if(typeof(subtitle) === 'string') {\r\n subtitle = limitSymbols(subtitle, 140);\r\n subtitle = RichTextProcessor.wrapEmojiText(subtitle);\r\n }\r\n\r\n replaceContent(subtitleEl, subtitle || '');\r\n }\r\n }\r\n\r\n Promise.all(loadPromises).then(() => {\r\n if(middleware && !middleware()) return;\r\n mediaChildren.forEach(child => child.remove());\r\n\r\n if(mediaEl) {\r\n mediaEl.classList.toggle('is-round', isRound);\r\n }\r\n });\r\n\r\n return setMedia;\r\n}\r\n\r\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void> {\r\n private mediaEl: HTMLElement;\r\n\r\n constructor(protected className: string) {\r\n super(className, (title, subtitle = '', message?) => {\r\n if(!this.mediaEl) {\r\n this.mediaEl = document.createElement('div');\r\n this.mediaEl.classList.add(this.className + '-media');\r\n }\r\n\r\n const isMediaSet = wrapReplyDivAndCaption({\r\n title,\r\n titleEl: this.title,\r\n subtitle,\r\n subtitleEl: this.subtitle,\r\n mediaEl: this.mediaEl,\r\n message\r\n });\r\n \r\n this.container.classList.toggle('is-media', isMediaSet);\r\n if(isMediaSet) {\r\n this.content.prepend(this.mediaEl);\r\n } else {\r\n this.mediaEl.remove();\r\n }\r\n });\r\n }\r\n}\r\n","/*\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\";\r\nimport { clamp } from \"../helpers/number\";\r\n\r\ntype Size = {w: number, h: number};\r\nexport type GroupMediaLayout = {\r\n geometry: {\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number\r\n },\r\n sides: number\r\n};\r\ntype Attempt = {\r\n lineCounts: number[],\r\n heights: number[]\r\n};\r\nexport const RectPart = {\r\n None: 0,\r\n Top: 1,\r\n Right: 2,\r\n Bottom: 4,\r\n Left: 8\r\n};\r\n\r\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\r\nexport class Layouter {\r\n private count: number;\r\n private ratios: number[];\r\n private proportions: string;\r\n private averageRatio: number;\r\n private maxSizeRatio: number;\r\n\r\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\r\n this.count = sizes.length;\r\n this.ratios = Layouter.countRatios(sizes);\r\n this.proportions = Layouter.countProportions(this.ratios);\r\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\r\n this.maxSizeRatio = maxWidth / this.maxHeight;\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n if(!this.count) return [];\r\n //else if(this.count === 1) return this.layoutOne();\r\n\r\n if(this.count >= 5 || this.ratios.find(r => r > 2)) {\r\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\r\n }\r\n\r\n if(this.count === 2) return this.layoutTwo();\r\n else if(this.count === 3) return this.layoutThree();\r\n return this.layoutFour();\r\n }\r\n\r\n private layoutTwo(): ReturnType {\r\n if((this.proportions === \"ww\")\r\n && (this.averageRatio > 1.4 * this.maxSizeRatio)\r\n && (this.ratios[1] - this.ratios[0] < 0.2)) {\r\n return this.layoutTwoTopBottom();\r\n } else if(this.proportions === \"ww\" || this.proportions === \"qq\") {\r\n return this.layoutTwoLeftRightEqual();\r\n }\r\n return this.layoutTwoLeftRight();\r\n }\r\n\r\n private layoutThree(): ReturnType {\r\n //console.log('layoutThree:', this);\r\n if(this.proportions[0] === 'n') {\r\n return this.layoutThreeLeftAndOther();\r\n }\r\n return this.layoutThreeTopAndOther();\r\n }\r\n\r\n private layoutFour(): ReturnType {\r\n if(this.proportions[0] === 'w') {\r\n return this.layoutFourTopAndOther();\r\n }\r\n return this.layoutFourLeftAndOther();\r\n }\r\n\r\n private layoutTwoTopBottom(): ReturnType {\r\n const width = this.maxWidth;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(\r\n width / this.ratios[1],\r\n (this.maxHeight - this.spacing) / 2)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: height + this.spacing, width, height},\r\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRightEqual(): ReturnType {\r\n const width = (this.maxWidth - this.spacing) / 2;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: width + this.spacing, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRight(): ReturnType {\r\n const minimalWidth = Math.round(this.minWidth * 1.5);\r\n const secondWidth = Math.min(\r\n Math.round(Math.max(\r\n 0.4 * (this.maxWidth - this.spacing),\r\n (this.maxWidth - this.spacing) / this.ratios[0]\r\n / (1 / this.ratios[0] + 1 / this.ratios[1]))),\r\n this.maxWidth - this.spacing - minimalWidth);\r\n const firstWidth = this.maxWidth\r\n - secondWidth\r\n - this.spacing;\r\n const height = Math.min(\r\n this.maxHeight,\r\n Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n secondWidth / this.ratios[1])));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutThreeLeftAndOther(): ReturnType {\r\n const firstHeight = this.maxHeight;\r\n const thirdHeight = Math.round(Math.min(\r\n (this.maxHeight - this.spacing) / 2.,\r\n (this.ratios[1] * (this.maxWidth - this.spacing)\r\n / (this.ratios[2] + this.ratios[1]))));\r\n const secondHeight = firstHeight\r\n - thirdHeight\r\n - this.spacing;\r\n const rightWidth = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - this.spacing) / 2.,\r\n Math.min(\r\n thirdHeight * this.ratios[2],\r\n secondHeight * this.ratios[1]))));\r\n const leftWidth = Math.min(\r\n Math.round(firstHeight * this.ratios[0]),\r\n this.maxWidth - this.spacing - rightWidth);\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n \r\n private layoutThreeTopAndOther(): ReturnType {\r\n const firstWidth = this.maxWidth;\r\n const firstHeight = Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const secondWidth = (this.maxWidth - this.spacing) / 2;\r\n const secondHeight = Math.min(\r\n this.maxHeight - firstHeight - this.spacing,\r\n Math.round(Math.min(\r\n secondWidth / this.ratios[1],\r\n secondWidth / this.ratios[2])));\r\n const thirdWidth = firstWidth - secondWidth - this.spacing;\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourTopAndOther(): ReturnType {\r\n const w = this.maxWidth;\r\n const h0 = Math.round(Math.min(\r\n w / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const h = Math.round(\r\n (this.maxWidth - 2 * this.spacing)\r\n / (this.ratios[1] + this.ratios[2] + this.ratios[3]));\r\n const w0 = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - 2 * this.spacing) * 0.4,\r\n h * this.ratios[1])));\r\n const w2 = Math.round(Math.max(\r\n Math.max(\r\n this.minWidth * 1.,\r\n (this.maxWidth - 2 * this.spacing) * 0.33),\r\n h * this.ratios[3]));\r\n const w1 = w - w0 - w2 - 2 * this.spacing;\r\n const h1 = Math.min(\r\n this.maxHeight - h0 - this.spacing,\r\n h);\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w, height: h0},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Bottom,\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\r\n sides: RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourLeftAndOther(): ReturnType {\r\n const h = this.maxHeight;\r\n const w0 = Math.round(Math.min(\r\n h * this.ratios[0],\r\n (this.maxWidth - this.spacing) * 0.6));\r\n \r\n const w = Math.round(\r\n (this.maxHeight - 2 * this.spacing)\r\n / (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\r\n );\r\n const h0 = Math.round(w / this.ratios[1]);\r\n const h1 = Math.round(w / this.ratios[2]);\r\n const h2 = h - h0 - h1 - 2 * this.spacing;\r\n const w1 = Math.max(\r\n this.minWidth,\r\n Math.min(this.maxWidth - w0 - this.spacing, w));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w0, height: h},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private static countRatios(sizes: Size[]) {\r\n return sizes.map(size => size.w / size.h);\r\n }\r\n\r\n private static countProportions(ratios: number[]) {\r\n return ratios.map(ratio => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\r\n }\r\n}\r\n\r\nclass ComplexLayouter {\r\n private ratios: number[];\r\n private count: number;\r\n\r\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\r\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\r\n this.count = ratios.length;\r\n }\r\n\r\n private static cropRatios(ratios: number[], averageRatio: number) {\r\n const kMaxRatio = 2.75;\r\n const kMinRatio = 0.6667;\r\n return ratios.map(ratio => {\r\n return averageRatio > 1.1\r\n\t\t\t ? clamp(ratio, 1., kMaxRatio)\r\n\t\t\t : clamp(ratio, kMinRatio, 1.);\r\n });\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n let result = new Array(this.count);\r\n\r\n let attempts: Attempt[] = [];\r\n const multiHeight = (offset: number, count: number) => {\r\n const ratios = this.ratios.slice(offset, offset + count); // warn\r\n const sum = accumulate(ratios, 0);\r\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\r\n };\r\n const pushAttempt = (lineCounts: number[]) => {\r\n let heights: number[] = [];\r\n let offset = 0;\r\n for(let count of lineCounts) {\r\n heights.push(multiHeight(offset, count));\r\n offset += count;\r\n }\r\n attempts.push({lineCounts, heights}); // warn\r\n };\r\n\r\n for(let first = 1; first !== this.count; ++first) {\r\n const second = this.count - first;\r\n if(first > 3 || second > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second]);\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n const third = this.count - first - second;\r\n if((first > 3)\r\n || (second > ((this.averageRatio < 0.85) ? 4 : 3))\r\n || (third > 3)) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third]);\r\n }\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n for(let third = 1; third !== this.count - first - second; ++third) {\r\n const fourth = this.count - first - second - third;\r\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third, fourth]);\r\n }\r\n }\r\n }\r\n\r\n let optimalAttempt: Attempt = null;\r\n let optimalDiff = 0;\r\n for(const attempt of attempts) {\r\n const {heights, lineCounts: counts} = attempt;\r\n const lineCount = counts.length;\r\n const totalHeight = accumulate(heights, 0) \r\n + this.spacing * (lineCount - 1);\r\n const minLineHeight = Math.min(...heights);\r\n const maxLineHeight = Math.max(...heights);\r\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\r\n const bad2 = (() => {\r\n for(let line = 1; line !== lineCount; ++line) {\r\n if(counts[line - 1] > counts[line]) {\r\n return 1.5;\r\n }\r\n }\r\n return 1.;\r\n })();\r\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\r\n if(!optimalAttempt || diff < optimalDiff) {\r\n optimalAttempt = attempt;\r\n optimalDiff = diff;\r\n }\r\n }\r\n\r\n const optimalCounts = optimalAttempt.lineCounts;\r\n\t const optimalHeights = optimalAttempt.heights;\r\n const rowCount = optimalCounts.length;\r\n \r\n let index = 0;\r\n let y = 0;\r\n for(let row = 0; row !== rowCount; ++row) {\r\n const colCount = optimalCounts[row];\r\n const lineHeight = optimalHeights[row];\r\n const height = Math.round(lineHeight);\r\n\r\n let x = 0;\r\n for(let col = 0; col !== colCount; ++col) {\r\n const sides = RectPart.None\r\n | (row === 0 ? RectPart.Top : RectPart.None)\r\n | (row === rowCount - 1 ? RectPart.Bottom : RectPart.None)\r\n | (col === 0 ? RectPart.Left : RectPart.None)\r\n | (col === colCount - 1 ? RectPart.Right : RectPart.None);\r\n\r\n const ratio = this.ratios[index];\r\n const width = (col === colCount - 1)\r\n ? (this.maxWidth - x)\r\n : Math.round(ratio * lineHeight);\r\n result[index] = {\r\n geometry: {x, y, width, height},\r\n sides\r\n };\r\n\r\n x += width + this.spacing;\r\n ++index;\r\n }\r\n y += height + this.spacing;\r\n }\r\n\r\n return result;\r\n }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { InputFile } from \"../layer\";\r\nimport AvatarEdit from \"./avatarEdit\";\r\nimport AvatarElement from \"./avatar\";\r\nimport InputField from \"./inputField\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport ButtonCorner from \"./buttonCorner\";\r\n\r\nexport default class EditPeer {\r\n public nextBtn: HTMLButtonElement;\r\n\r\n public uploadAvatar: () => Promise;\r\n public avatarEdit: AvatarEdit;\r\n public avatarElem: AvatarElement;\r\n\r\n private inputFields: InputField[];\r\n private listenerSetter: ListenerSetter;\r\n\r\n private peerId: PeerId;\r\n\r\n private _disabled = false;\r\n private avatarSize = 120;\r\n\r\n constructor(options: {\r\n peerId?: EditPeer['peerId'],\r\n inputFields: EditPeer['inputFields'],\r\n listenerSetter: ListenerSetter,\r\n doNotEditAvatar?: boolean,\r\n withoutAvatar?: boolean,\r\n nextBtn?: HTMLButtonElement,\r\n avatarSize?: number\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.nextBtn) {\r\n this.nextBtn = ButtonCorner({icon: 'check'});\r\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\r\n this.handleChange = () => {\r\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\r\n };\r\n }\r\n\r\n if(!options.withoutAvatar) {\r\n this.avatarElem = document.createElement('avatar-element') as AvatarElement;\r\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\r\n this.avatarElem.setAttribute('peer', '' + this.peerId);\r\n \r\n if(!options.doNotEditAvatar) {\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n this.handleChange();\r\n this.avatarElem.remove();\r\n });\r\n \r\n this.avatarEdit.container.append(this.avatarElem);\r\n }\r\n }\r\n\r\n this.inputFields.forEach(inputField => {\r\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\r\n });\r\n\r\n this.handleChange();\r\n }\r\n\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value) {\r\n this._disabled = value;\r\n this.inputFields.forEach(inputField => inputField.input.toggleAttribute('disabled', value));\r\n this.handleChange();\r\n }\r\n\r\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\r\n this.disabled = true;\r\n promise.then(() => {\r\n if(unlockOnSuccess) {\r\n this.disabled = false;\r\n }\r\n }, () => {\r\n this.disabled = false;\r\n });\r\n }\r\n\r\n public isChanged = () => {\r\n if(this.uploadAvatar) {\r\n return true;\r\n }\r\n\r\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\r\n this.inputFields.forEach(inputField => {\r\n if(inputField.isValid()) {\r\n if(inputField.isChanged()) {\r\n ++changedLength;\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredValidLength;\r\n }\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredLength;\r\n }\r\n });\r\n\r\n return requiredLength === requiredValidLength && changedLength > 0;\r\n };\r\n\r\n public handleChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\r\n const form = document.createElement('form');\r\n\r\n radios.forEach(r => {\r\n const {container, input} = r;\r\n form.append(container);\r\n input.addEventListener('change', (e) => {\r\n if(input.checked) {\r\n onChange(input.value, e);\r\n }\r\n });\r\n });\r\n\r\n return form;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CheckboxField from \"./checkboxField\";\r\nimport RadioField from \"./radioField\";\r\nimport { ripple } from \"./ripple\";\r\nimport { SliderSuperTab } from \"./slider\";\r\nimport RadioForm from \"./radioForm\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\n\r\nexport default class Row {\r\n public container: HTMLElement;\r\n public title: HTMLDivElement;\r\n public subtitle: HTMLElement;\r\n\r\n public checkboxField: CheckboxField;\r\n public radioField: RadioField;\r\n\r\n public freezed = false;\r\n\r\n constructor(options: Partial<{\r\n icon: string,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleLangKey: LangPackKey,\r\n subtitleLangArgs: any[],\r\n radioField: Row['radioField'],\r\n checkboxField: Row['checkboxField'],\r\n noCheckboxSubtitle: boolean,\r\n title: string,\r\n titleLangKey: LangPackKey,\r\n titleRight: string | HTMLElement,\r\n clickable: boolean | ((e: Event) => void),\r\n navigationTab: SliderSuperTab,\r\n havePadding: boolean,\r\n noRipple: boolean\r\n }> = {}) {\r\n this.container = document.createElement(options.radioField || options.checkboxField ? 'label' : 'div');\r\n this.container.classList.add('row');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add('row-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n if(options.subtitle) {\r\n if(typeof(options.subtitle) === 'string') {\r\n setInnerHTML(this.subtitle, options.subtitle);\r\n } else {\r\n this.subtitle.append(options.subtitle);\r\n }\r\n } else if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\r\n }\r\n this.container.append(this.subtitle);\r\n\r\n let havePadding = !!options.havePadding;\r\n if(options.radioField || options.checkboxField) {\r\n havePadding = true;\r\n if(options.radioField) {\r\n this.radioField = options.radioField;\r\n this.container.append(this.radioField.label);\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 this.container.append(this.checkboxField.label);\r\n }\r\n\r\n if(!options.noCheckboxSubtitle && !isToggle) {\r\n this.checkboxField.input.addEventListener('change', () => {\r\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\r\n });\r\n }\r\n }\r\n\r\n const i = options.radioField || options.checkboxField;\r\n i.label.classList.add('disable-hover');\r\n } \r\n \r\n if(options.title || options.titleLangKey) {\r\n let c: HTMLElement;\r\n if(options.titleRight) {\r\n c = document.createElement('div');\r\n c.classList.add('row-title-row');\r\n this.container.append(c);\r\n } else {\r\n c = this.container;\r\n }\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add('row-title');\r\n this.title.setAttribute('dir', 'auto');\r\n if(options.title) {\r\n this.title.innerHTML = options.title;\r\n } else {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n c.append(this.title);\r\n\r\n if(options.titleRight) {\r\n const titleRight = document.createElement('div');\r\n titleRight.classList.add('row-title', 'row-title-right');\r\n\r\n if(typeof(options.titleRight) === 'string') {\r\n titleRight.innerHTML = options.titleRight;\r\n } else {\r\n titleRight.append(options.titleRight);\r\n }\r\n\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 this.container.addEventListener('click', (e) => {\r\n if(this.freezed) return;\r\n (options.clickable as any)(e);\r\n });\r\n }\r\n\r\n this.container.classList.add('row-clickable', 'hover-effect');\r\n\r\n if(!options.noRipple) {\r\n ripple(this.container, undefined, undefined, true);\r\n }\r\n\r\n /* if(options.radioField || options.checkboxField) {\r\n this.container.prepend(this.container.lastElementChild);\r\n } */\r\n }\r\n }\r\n\r\n\r\n}\r\n\r\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\r\n return RadioForm(rows.map(r => ({container: r.container, input: r.radioField.input})), onChange);\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// https://stackoverflow.com/a/30810322\r\nfunction fallbackCopyTextToClipboard(text: string) {\r\n var textArea = document.createElement(\"textarea\");\r\n textArea.value = text;\r\n \r\n // Avoid scrolling to bottom\r\n textArea.style.top = \"0\";\r\n textArea.style.left = \"0\";\r\n textArea.style.position = \"fixed\";\r\n\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n\r\n try {\r\n document.execCommand('copy');\r\n //const successful = document.execCommand('copy');\r\n //const msg = successful ? 'successful' : 'unsuccessful';\r\n //console.log('Fallback: Copying text command was ' + msg);\r\n } catch(err) {\r\n //console.error('Fallback: Oops, unable to copy', err);\r\n }\r\n\r\n document.body.removeChild(textArea);\r\n}\r\n\r\nexport function copyTextToClipboard(text: string) {\r\n if(!navigator.clipboard) {\r\n fallbackCopyTextToClipboard(text);\r\n return;\r\n }\r\n \r\n navigator.clipboard.writeText(text);/* .then(function() {\r\n console.log('Async: Copying to clipboard was successful!');\r\n }, function(err) {\r\n console.error('Async: Could not copy text: ', err);\r\n }); */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { getDeepProperty } from \"../helpers/object\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport default class RadioField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public main: HTMLElement;\r\n\r\n constructor(options: {\r\n text?: string, \r\n langKey?: LangPackKey,\r\n name: string, \r\n value?: string, \r\n stateKey?: string\r\n }) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('radio-field');\r\n \r\n const input = this.input = document.createElement('input');\r\n input.type = 'radio';\r\n /* input.id = */input.name = 'input-radio-' + options.name;\r\n \r\n if(options.value) {\r\n input.value = options.value;\r\n \r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\r\n });\r\n \r\n input.addEventListener('change', () => {\r\n appStateManager.setByKey(options.stateKey, options.value);\r\n });\r\n }\r\n }\r\n \r\n const main = this.main = document.createElement('div');\r\n main.classList.add('radio-field-main');\r\n \r\n if(options.text) {\r\n main.innerHTML = options.text;\r\n /* const caption = document.createElement('div');\r\n caption.classList.add('radio-field-main-caption');\r\n caption.innerHTML = text;\r\n \r\n if(subtitle) {\r\n label.classList.add('radio-field-with-subtitle');\r\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\r\n }\r\n \r\n main.append(caption); */\r\n } else if(options.langKey) {\r\n _i18n(main, options.langKey);\r\n }\r\n \r\n label.append(input, main);\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nconst toastEl = document.createElement('div');\r\ntoastEl.classList.add('toast');\r\nexport function toast(content: string | Node) {\r\n replaceContent(toastEl, content);\r\n document.body.append(toastEl);\r\n\r\n if(toastEl.dataset.timeout) clearTimeout(+toastEl.dataset.timeout);\r\n toastEl.dataset.timeout = '' + setTimeout(() => {\r\n toastEl.remove();\r\n delete toastEl.dataset.timeout;\r\n }, 3000);\r\n}\r\n\r\nexport function toastNew(options: Partial<{\r\n langPackKey: LangPackKey\r\n}>) {\r\n toast(i18n(options.langPackKey));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyFunction, Awaited } from \"../../types\";\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) {\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 return (...args: Parameters): typeof waitingPromise => {\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 // @ts-ignore\r\n resolve(fn(...args));\r\n hadNewCall = false;\r\n }\r\n\r\n waitingTimeout = setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n }\r\n\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }, ms) as any;\r\n\r\n waitingPromise.catch(() => {});\r\n return waitingPromise;\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport debounce from \"../helpers/schedulers/debounce\";\r\nimport appChatsManager from \"../lib/appManagers/appChatsManager\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport InputField, { InputFieldOptions, InputState } from \"./inputField\";\r\n\r\nexport class UsernameInputField extends InputField {\r\n private checkUsernamePromise: Promise;\r\n private checkUsernameDebounced: (username: string) => void;\r\n public options: InputFieldOptions & {\r\n peerId?: PeerId,\r\n listenerSetter: ListenerSetter,\r\n onChange?: () => void,\r\n invalidText: LangPackKey,\r\n takenText: LangPackKey,\r\n availableText: LangPackKey,\r\n head?: string\r\n };\r\n\r\n constructor(options: UsernameInputField['options']) {\r\n super(options);\r\n\r\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\r\n\r\n options.listenerSetter.add(this.input)('input', () => {\r\n const value = this.getValue();\r\n\r\n //console.log('userNameInput:', value);\r\n if(value === this.originalValue || !value.length) {\r\n this.setState(InputState.Neutral, this.options.label);\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n } else if(!RichTextProcessor.isUsernameValid(value)) { // does not check the last underscore\r\n this.setError(this.options.invalidText);\r\n } else {\r\n this.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.input.classList.contains('error')) {\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n }\r\n\r\n this.checkUsernameDebounced(value);\r\n });\r\n }\r\n\r\n public getValue() {\r\n let value = this.value;\r\n if(this.options.head) {\r\n value = value.slice(this.options.head.length);\r\n this.setValueSilently(this.options.head + value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private checkUsername(username: string) {\r\n if(this.checkUsernamePromise) return;\r\n\r\n if(this.options.peerId) {\r\n this.checkUsernamePromise = apiManager.invokeApi('channels.checkUsername', {\r\n channel: appChatsManager.getChannelInput(this.options.peerId.toChatId()),\r\n username\r\n });\r\n } else {\r\n this.checkUsernamePromise = apiManager.invokeApi('account.checkUsername', {username});\r\n }\r\n\r\n this.checkUsernamePromise.then(available => {\r\n if(this.getValue() !== username) return;\r\n\r\n if(available) {\r\n this.setState(InputState.Valid, this.options.availableText);\r\n } else {\r\n this.setError(this.options.takenText);\r\n }\r\n }, (err) => {\r\n if(this.getValue() !== username) return;\r\n\r\n switch(err.type) {\r\n case 'USERNAME_INVALID': {\r\n this.setError(this.options.invalidText);\r\n break;\r\n }\r\n }\r\n }).then(() => {\r\n this.checkUsernamePromise = undefined;\r\n this.options.onChange && this.options.onChange();\r\n\r\n const value = this.getValue();\r\n if(value !== username && this.isValidToChange() && RichTextProcessor.isUsernameValid(value)) {\r\n this.checkUsername(value);\r\n }\r\n });\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from \"../avatar\";\nimport PopupElement, { addCancelButton, PopupButton, PopupOptions } from \".\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport CheckboxField, { CheckboxFieldOptions } from \"../checkboxField\";\n\nexport type PopupPeerButton = Omit & Partial<{callback: PopupPeerButtonCallback}>;\nexport type PopupPeerButtonCallbackCheckboxes = Set;\nexport type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void;\nexport type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField};\n\nexport type PopupPeerOptions = PopupOptions & Partial<{\n peerId: PeerId,\n title: string | HTMLElement,\n titleLangKey?: LangPackKey,\n titleLangArgs?: any[],\n noTitle?: boolean,\n description: string,\n descriptionLangKey?: LangPackKey,\n descriptionLangArgs?: any[],\n buttons?: Array,\n checkboxes: Array\n}>;\nexport default class PopupPeer extends PopupElement {\n constructor(private className: string, options: PopupPeerOptions = {}) {\n super('popup-peer' + (className ? ' ' + className : ''), options.buttons && addCancelButton(options.buttons), {overlayClosable: true, ...options});\n\n if(options.peerId) {\n let avatarEl = new AvatarElement();\n avatarEl.setAttribute('dialog', '1');\n avatarEl.setAttribute('peer', '' + options.peerId);\n avatarEl.classList.add('avatar-32');\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 = document.createElement('p');\n p.classList.add('popup-description');\n if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs));\n else if(options.description) p.innerHTML = options.description;\n \n fragment.append(p);\n }\n\n if(options.checkboxes) {\n this.container.classList.add('have-checkbox');\n \n options.checkboxes.forEach(o => {\n o.withRipple = false;\n const checkboxField = new CheckboxField(o);\n o.checkboxField = checkboxField;\n fragment.append(checkboxField.label);\n });\n\n options.buttons.forEach(button => {\n if(button.callback) {\n const original = button.callback;\n button.callback = () => {\n const c: Set = new Set();\n options.checkboxes.forEach(o => {\n if(o.checkboxField.checked) {\n c.add(o.text);\n }\n });\n original(c);\n };\n }\n });\n }\n\n this.container.insertBefore(fragment, this.header.nextElementSibling);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { copyTextToClipboard } from \"../../../helpers/clipboard\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport { Chat, ChatFull, ExportedChatInvite } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport Button from \"../../button\";\r\nimport { setButtonLoader } from \"../../misc\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport { toast } from \"../../toast\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\r\n public chatId: ChatId;\r\n public chatFull: ChatFull;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-peer-container', 'group-type-container');\r\n\r\n const isBroadcast = appChatsManager.isBroadcast(this.chatId);\r\n\r\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\r\n\r\n const section = new SettingSection({\r\n name: isBroadcast ? 'ChannelType' : 'GroupType'\r\n });\r\n\r\n const random = randomLong();\r\n const privateRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate', \r\n name: random, \r\n value: 'private'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\r\n });\r\n const publicRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic', \r\n name: random, \r\n value: 'public'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\r\n });\r\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\r\n const a = [privateSection, publicSection];\r\n if(value === 'public') a.reverse();\r\n\r\n a[0].container.classList.remove('hide');\r\n a[1].container.classList.add('hide');\r\n\r\n onChange();\r\n });\r\n\r\n const chat: Chat = appChatsManager.getChat(this.chatId);\r\n\r\n section.content.append(form);\r\n\r\n const privateSection = new SettingSection({});\r\n\r\n //let revoked = false;\r\n const linkRow = new Row({\r\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\r\n clickable: () => {\r\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\r\n toast(I18n.format('LinkCopied', true));\r\n }\r\n });\r\n\r\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\r\n\r\n attachClickEvent(btnRevoke, () => {\r\n new PopupPeer('revoke-link', {\r\n buttons: [{\r\n langKey: 'RevokeButton',\r\n callback: () => {\r\n const toggle = toggleDisability([btnRevoke], true);\r\n \r\n appProfileManager.getChatInviteLink(this.chatId, true).then(link => {\r\n toggle();\r\n linkRow.title.innerHTML = link;\r\n //revoked = true;\r\n //onChange();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'RevokeLink',\r\n descriptionLangKey: 'RevokeAlert'\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n privateSection.content.append(linkRow.container, btnRevoke);\r\n\r\n const publicSection = new SettingSection({\r\n caption: isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup',\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const placeholder = 't.me/';\r\n\r\n const onChange = () => {\r\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) \r\n || (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\r\n applyBtn.classList.toggle('is-visible', changed);\r\n };\r\n\r\n const linkInputField = new UsernameInputField({\r\n label: 'SetUrlPlaceholder',\r\n name: 'group-public-link',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n availableText: 'Link.Available',\r\n invalidText: 'Link.Invalid',\r\n takenText: 'Link.Taken',\r\n onChange: onChange,\r\n peerId: this.chatId.toPeerId(true),\r\n head: placeholder\r\n });\r\n\r\n const originalValue = placeholder + ((chat as Chat.channel).username || '');\r\n\r\n inputWrapper.append(linkInputField.container)\r\n publicSection.content.append(inputWrapper);\r\n\r\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\r\n this.content.append(applyBtn);\r\n\r\n attachClickEvent(applyBtn, () => {\r\n /* const unsetLoader = */setButtonLoader(applyBtn);\r\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\r\n appChatsManager.migrateChat(this.chatId).then(channelId => {\r\n return appChatsManager.updateUsername(channelId, username);\r\n }).then(() => {\r\n //unsetLoader();\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n (originalValue !== placeholder ? publicRow : privateRow).radioField.checked = true;\r\n linkInputField.setOriginalValue(originalValue);\r\n\r\n this.scrollable.append(section.container, privateSection.container, publicSection.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\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\";\r\n\r\nexport default class ScrollableLoader {\r\n public loading = false;\r\n private scrollable: Scrollable;\r\n private getPromise: () => Promise;\r\n private promise: Promise;\r\n private loaded = false;\r\n\r\n constructor(options: {\r\n scrollable: ScrollableLoader['scrollable'],\r\n getPromise: ScrollableLoader['getPromise']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n options.scrollable.onScrolledBottom = () => {\r\n this.load();\r\n };\r\n }\r\n \r\n public load() {\r\n if(this.loaded) {\r\n return Promise.resolve();\r\n }\r\n \r\n if(this.loading) {\r\n return this.promise;\r\n }\r\n\r\n this.loading = true;\r\n this.promise = this.getPromise().then(done => {\r\n this.loading = false;\r\n this.promise = undefined;\r\n\r\n if(done) {\r\n this.loaded = true;\r\n this.scrollable.onScrolledBottom = null;\r\n } else {\r\n this.scrollable.checkForTriggers();\r\n }\r\n }, () => {\r\n this.promise = undefined;\r\n this.loading = false;\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager, { ChatRights } from \"../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, { Dialog } from \"../lib/appManagers/appMessagesManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport rootScope from \"../lib/rootScope\";\nimport Scrollable from \"./scrollable\";\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\nimport CheckboxField from \"./checkboxField\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { safeAssign } from \"../helpers/object\";\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 { filterUnique, indexOfAndSplice } from \"../helpers/array\";\nimport debounce from \"../helpers/schedulers/debounce\";\nimport windowSize from \"../helpers/windowSize\";\nimport appPeersManager, { IsPeerType } from \"../lib/appManagers/appPeersManager\";\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 public chatsContainer = document.createElement('div');\n public scrollable: Scrollable;\n public selectedScrollable: Scrollable;\n \n public selectedContainer: HTMLElement;\n public input: HTMLInputElement;\n \n //public selected: {[peerId: PeerId]: HTMLElement} = {};\n public selected = new Set();\n\n public freezed = false;\n\n private folderId = 0;\n private offsetIndex = 0;\n private promise: Promise;\n\n private query = '';\n private cachedContacts: PeerId[];\n\n private loadedWhat: Partial<{[k in 'dialogs' | 'archived' | 'contacts' | 'channelParticipants']: true}> = {};\n\n private renderedPeerIds: Set = new Set();\n\n private appendTo: HTMLElement;\n private onChange: (length: number) => void;\n private peerType: SelectSearchPeerType[] = ['dialogs'];\n private renderResultsFunc: (peerIds: PeerId[]) => void;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize = 48;\n private exceptSelf = false;\n private filterPeerTypeBy: IsPeerType[];\n\n private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {};\n private peerId: PeerId;\n\n private placeholder: LangPackKey;\n\n private selfPresence: LangPackKey = 'Presence.YourChat';\n \n private needSwitchList = false;\n \n 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 }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector');\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = (peerIds) => {\n if(this.needSwitchList) {\n this.scrollable.splitUp.replaceWith(this.list);\n this.scrollable.setVirtualContainer(this.list);\n this.needSwitchList = false;\n }\n \n peerIds = peerIds.filter(peerId => {\n const notRendered = !this.renderedPeerIds.has(peerId);\n if(notRendered) this.renderedPeerIds.add(peerId);\n return notRendered;\n });\n\n if(this.filterPeerTypeBy) {\n peerIds = peerIds.filter(peerId => {\n if(peerId.isPeerId()) {\n const peer = appPeersManager.getPeer(peerId);\n if(!peer.deleted) {\n return this.filterPeerTypeBy.find(method => appPeersManager[method](peerId));\n }\n }\n\n return true;\n });\n }\n\n return f(peerIds);\n };\n\n this.input = document.createElement('input');\n this.input.classList.add('selector-search-input');\n if(this.placeholder) {\n _i18n(this.input, this.placeholder, undefined, 'placeholder');\n } else {\n _i18n(this.input, 'SendMessageTo', undefined, 'placeholder');\n }\n\n this.input.type = 'text';\n\n if(this.multiSelect) {\n let topContainer = document.createElement('div');\n topContainer.classList.add('selector-search-container');\n \n this.selectedContainer = document.createElement('div');\n this.selectedContainer.classList.add('selector-search');\n \n this.selectedContainer.append(this.input);\n topContainer.append(this.selectedContainer);\n this.selectedScrollable = new Scrollable(topContainer);\n \n let delimiter = document.createElement('hr');\n\n this.selectedContainer.addEventListener('click', (e) => {\n if(this.freezed) return;\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'selector-user');\n \n if(!target) return;\n \n const peerId = target.dataset.key;\n const li = this.chatsContainer.querySelector('[data-peer-id=\"' + peerId + '\"]') as HTMLElement;\n if(!li) {\n this.remove(peerId.toPeerId());\n } else {\n li.click();\n }\n });\n\n this.container.append(topContainer, delimiter);\n }\n\n this.chatsContainer.classList.add('chatlist-container');\n this.chatsContainer.append(this.list);\n this.scrollable = new Scrollable(this.chatsContainer);\n this.scrollable.setVirtualContainer(this.list);\n\n this.chatsContainer.addEventListener('click', (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.container.append(this.chatsContainer);\n this.appendTo.append(this.container);\n\n // WARNING TIMEOUT\n setTimeout(() => {\n let getResultsPromise = this.getMoreResults() as Promise;\n if(options.onFirstRender) {\n getResultsPromise.then(() => {\n options.onFirstRender();\n });\n }\n }, 0);\n }\n\n private onInput = () => {\n const value = this.input.value;\n if(this.query !== value) {\n if(this.peerType.includes('contacts') || this.peerType.includes('dialogs')) {\n this.cachedContacts = null;\n }\n \n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(let i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = null;\n this.loadedWhat = {};\n this.query = value;\n this.renderedPeerIds.clear();\n this.needSwitchList = true;\n \n //console.log('selectPeers input:', this.query);\n this.getMoreResults();\n }\n };\n\n private renderSaved() {\n if(!this.exceptSelf && \n !this.offsetIndex && \n this.folderId === 0 && \n this.peerType.includes('dialogs') && \n (!this.query || appUsersManager.testSelfSearch(this.query))) {\n this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n if(this.tempIds[type] === undefined) {\n this.tempIds[type] = 0;\n }\n\n return ++this.tempIds[type];\n }\n\n private async getMoreDialogs(): Promise {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n \n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n\n const tempId = this.getTempId('dialogs');\n const promise = appMessagesManager.getConversations(this.query, this.offsetIndex, pageCount, this.folderId, true).promise;\n this.promise = promise;\n const value = await promise;\n if(this.tempIds.dialogs !== tempId) {\n return;\n }\n\n this.promise = null;\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = dialogs[dialogs.length - 1].index || 0;\n\n dialogs = dialogs.slice();\n dialogs.findAndSplice(d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = dialogs.filter(d => this.filterByRights(d.peerId));\n }\n\n this.renderSaved();\n\n this.offsetIndex = newOffsetIndex;\n }\n\n this.renderResultsFunc(dialogs.map(dialog => dialog.peerId));\n \n if(value.isEnd) {\n if(!this.loadedWhat.dialogs) {\n this.renderSaved();\n\n this.loadedWhat.dialogs = true;\n this.offsetIndex = 0;\n this.folderId = 1;\n\n return this.getMoreDialogs();\n } else {\n this.loadedWhat.archived = true;\n\n if(!this.loadedWhat.contacts/* && this.peerType.includes('contacts') */) {\n return this.getMoreContacts();\n }\n }\n }\n }\n\n private filterByRights(peerId: PeerId) {\n return (\n peerId.isUser() && \n (this.chatRightsAction !== 'send_messages' || appUsersManager.canSendToUser(peerId))\n ) || appChatsManager.hasRights(peerId.toChatId(), this.chatRightsAction);\n }\n\n private async getMoreContacts() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.contacts) {\n return;\n }\n\n const isGlobalSearch = this.peerType.includes('contacts');\n\n if(!this.cachedContacts) {\n /* const promises: Promise[] = [appUsersManager.getContacts(this.query)];\n if(!this.peerType.includes('dialogs')) {\n promises.push(appMessagesManager.getConversationsAll());\n }\n\n this.promise = Promise.all(promises);\n this.cachedContacts = (await this.promise)[0].slice(); */\n const tempId = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n this.promise = promise;\n let [cachedContacts, searchResult] = await promise;\n if(this.tempIds.contacts !== tempId) {\n return;\n }\n\n if(searchResult) {\n // do not add global result if only dialogs needed\n let resultPeerIds = isGlobalSearch ? searchResult.my_results.concat(searchResult.results) : searchResult.my_results;\n\n if(this.chatRightsAction) {\n resultPeerIds = resultPeerIds.filter(peerId => this.filterByRights(peerId));\n }\n\n if(!this.peerType.includes('dialogs')) {\n resultPeerIds = resultPeerIds.filter(peerId => peerId.isUser());\n }\n\n this.cachedContacts = filterUnique(cachedContacts.concat(resultPeerIds));\n } else this.cachedContacts = cachedContacts.slice();\n\n indexOfAndSplice(this.cachedContacts, rootScope.myId); // no my account\n this.promise = null;\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n const arr = this.cachedContacts.splice(0, pageCount);\n this.renderResultsFunc(arr);\n // }\n \n if(!this.cachedContacts.length) {\n this.loadedWhat.contacts = true;\n\n // need to load non-contacts\n /* if(!this.peerType.includes('dialogs')) {\n return this.getMoreDialogs();\n } */\n }\n }\n\n private async getMoreChannelParticipants() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const tempId = this.getTempId('channelParticipants');\n const promise = appProfileManager.getChannelParticipants(this.peerId.toChatId(), {_: 'channelParticipantsSearch', q: this.query}, pageCount, this.list.childElementCount);\n const participants = await promise;\n if(this.tempIds.channelParticipants !== tempId) {\n return;\n }\n \n const peerIds = participants.participants.map(participant => {\n return appChatsManager.getParticipantPeerId(participant);\n });\n indexOfAndSplice(peerIds, rootScope.myId);\n this.renderResultsFunc(peerIds);\n\n if(this.list.childElementCount >= participants.count || participants.participants.length < pageCount) {\n this.loadedWhat.channelParticipants = true;\n }\n }\n\n checkForTriggers = () => {\n this.scrollable.checkForTriggers();\n };\n\n private getMoreResults() {\n const get = () => {\n const promises: Promise[] = [];\n\n // if(!loadedAllDialogs && (this.peerType.includes('dialogs')/* || this.peerType.includes('contacts') */)) {\n // if(!loadAllDialogsPromise) {\n // loadAllDialogsPromise = appMessagesManager.getConversationsAll()\n // .then(() => {\n // loadedAllDialogs = true;\n // }).finally(() => {\n // loadAllDialogsPromise = null;\n // });\n // }\n\n // promises.push(loadAllDialogsPromise);\n // }\n \n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n promises.push(this.getMoreDialogs());\n \n if(!this.loadedWhat.archived) {\n return promises;\n }\n }\n \n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n promises.push(this.getMoreContacts());\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n promises.push(this.getMoreChannelParticipants());\n }\n \n return promises;\n };\n \n const promises = get();\n const promise = Promise.all(promises);\n if(promises.length) {\n promise.then(this.checkForTriggers);\n }\n\n return promise;\n }\n\n private renderResults(peerIds: PeerId[]) {\n //console.log('will renderResults:', peerIds);\n\n // оставим только неконтакты с диалогов\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = peerIds.filter(peerId => {\n return appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(peerId => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n container: this.scrollable,\n drawStatus: false,\n rippleEnabled: this.rippleEnabled,\n avatarSize: this.avatarSize\n });\n\n if(this.multiSelect) {\n const selected = this.selected.has(peerId);\n const checkboxField = new CheckboxField();\n\n if(selected) {\n //dom.listEl.classList.add('active');\n checkboxField.input.checked = true;\n }\n\n dom.containerEl.prepend(checkboxField.label);\n }\n\n let subtitleEl: HTMLElement;\n if(peerId.isAnyChat()) {\n subtitleEl = appProfileManager.getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = appUsersManager.getUserStatusString(peerId);\n }\n\n dom.lastMessageSpan.append(subtitleEl);\n });\n }\n\n public add(key: PeerId | string, title?: string | HTMLElement, scroll = true) {\n //console.trace('add');\n this.selected.add(key);\n\n if(!this.multiSelect) {\n this.onChange(this.selected.size);\n return;\n }\n\n if(this.query.trim()) {\n this.input.value = '';\n this.onInput();\n }\n\n const div = document.createElement('div');\n div.classList.add('selector-user', 'scale-in');\n\n const avatarEl = document.createElement('avatar-element');\n avatarEl.classList.add('selector-user-avatar', 'tgico');\n avatarEl.setAttribute('dialog', '1');\n avatarEl.classList.add('avatar-32');\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.setAttribute('peer', '' + key);\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n this.selectedContainer.insertBefore(div, this.input);\n //this.selectedScrollable.scrollTop = this.selectedScrollable.scrollHeight;\n this.onChange && this.onChange(this.selected.size);\n \n if(scroll) {\n this.selectedScrollable.scrollIntoViewNew(this.input, 'center');\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(this.input, 'center', undefined, undefined, FocusDirection.Static);\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport AppSelectPeers from \"../appSelectPeers\";\r\nimport PopupElement from \".\";\r\nimport { LangPackKey, _i18n } from \"../../lib/langPack\";\r\n\r\nexport default class PopupPickUser extends PopupElement {\r\n protected selector: AppSelectPeers;\r\n \r\n constructor(options: {\r\n peerTypes: AppSelectPeers['peerType'], \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n placeholder: LangPackKey,\r\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\r\n peerId?: number,\r\n selfPresence?: LangPackKey\r\n }) {\r\n super('popup-forward', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.body, \r\n onChange: async() => {\r\n const selected = this.selector.getSelected();\r\n const peerId = selected[selected.length - 1].toPeerId();\r\n \r\n if(options.onSelect) {\r\n const res = options.onSelect(peerId);\r\n if(res instanceof Promise) {\r\n try {\r\n await res;\r\n } catch(err) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.selector = null;\r\n this.hide();\r\n }, \r\n peerType: options.peerTypes, \r\n onFirstRender: () => {\r\n this.show();\r\n this.selector.checkForTriggers(); // ! due to zero height before mounting\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.selector.input.focus();\r\n }\r\n }, \r\n chatRightsAction: options.chatRightsAction, \r\n multiSelect: false,\r\n rippleEnabled: false,\r\n avatarSize: 46,\r\n peerId: options.peerId,\r\n placeholder: options.placeholder,\r\n selfPresence: options.selfPresence\r\n });\r\n\r\n //this.scrollable = new Scrollable(this.body);\r\n\r\n this.title.append(this.selector.input);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\nimport { deepEqual } from \"../../../helpers/object\";\nimport { ChannelParticipant } from \"../../../layer\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport Button from \"../../button\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { ChatPermissions } from \"./groupPermissions\";\n\nexport default class AppUserPermissionsTab extends SliderSuperTabEventable {\n public participant: ChannelParticipant;\n public chatId: ChatId;\n public userId: UserId;\n\n protected init() {\n this.container.classList.add('edit-peer-container', 'user-permissions-container');\n this.setTitle('UserRestrictions');\n\n let destroyListener: () => void;\n\n {\n const section = new SettingSection({\n name: 'UserRestrictionsCanDo',\n });\n \n const div = document.createElement('div');\n div.classList.add('chatlist-container');\n section.content.insertBefore(div, section.title);\n\n const list = appDialogsManager.createChatList({new: true});\n div.append(list);\n\n const {dom} = appDialogsManager.addDialogNew({\n dialog: this.userId.toPeerId(false),\n container: list,\n drawStatus: false,\n rippleEnabled: true,\n avatarSize: 48\n });\n\n dom.lastMessageSpan.append(appUsersManager.getUserStatusString(this.userId));\n\n const p = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n participant: this.participant._ === 'channelParticipantBanned' ? this.participant : undefined\n });\n\n destroyListener = () => {\n //appChatsManager.editChatDefaultBannedRights(this.chatId, p.takeOut());\n const rights = p.takeOut();\n if(this.participant._ === 'channelParticipantBanned' && deepEqual(this.participant.banned_rights.pFlags, rights.pFlags)) {\n return;\n }\n\n appChatsManager.editBanned(this.chatId, this.participant, rights);\n };\n\n this.eventListener.addEventListener('destroy', destroyListener, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({});\n\n if(this.participant._ === 'channelParticipantBanned') {\n const btnDeleteException = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'GroupPermission.Delete'});\n\n attachClickEvent(btnDeleteException, () => {\n const toggle = toggleDisability([btnDeleteException], true);\n appChatsManager.clearChannelParticipantBannedRights(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n \n section.content.append(btnDeleteException);\n }\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'deleteuser', text: 'UserRestrictionsBlock'});\n\n attachClickEvent(btnDelete, () => {\n const toggle = toggleDisability([btnDelete], true);\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n });\n /* new PopupPeer('popup-group-kick-user', {\n peerId: -this.chatId,\n title: 'Ban User?',\n description: `Are you sure you want to ban ${appPeersManager.getPeerTitle(this.userId)}`,\n buttons: addCancelButton([{\n text: 'BAN',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show(); */\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport ListenerSetter from \"../../../helpers/listenerSetter\";\nimport ScrollableLoader from \"../../../helpers/scrollableLoader\";\nimport { ChannelParticipant, Chat, ChatBannedRights, Update } from \"../../../layer\";\nimport appChatsManager, { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\nimport I18n, { i18n, join, LangPackKey } from \"../../../lib/langPack\";\nimport rootScope from \"../../../lib/rootScope\";\nimport CheckboxField from \"../../checkboxField\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport Row from \"../../row\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { toast } from \"../../toast\";\nimport AppUserPermissionsTab from \"./userPermissions\";\n\nexport class ChatPermissions {\n public v: Array<{\n flags: ChatRights[],\n text: LangPackKey,\n exceptionText: LangPackKey,\n checkboxField?: CheckboxField,\n }>;\n private toggleWith: Partial<{[chatRight in ChatRights]: ChatRights[]}>;\n\n constructor(options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }) {\n this.v = [\n {flags: ['send_messages'], text: 'UserRestrictionsSend', exceptionText: 'UserRestrictionsNoSend'},\n {flags: ['send_media'], text: 'UserRestrictionsSendMedia', exceptionText: 'UserRestrictionsNoSendMedia'},\n {flags: ['send_stickers', 'send_gifs'], text: 'UserRestrictionsSendStickers', exceptionText: 'UserRestrictionsNoSendStickers'},\n {flags: ['send_polls'], text: 'UserRestrictionsSendPolls', exceptionText: 'UserRestrictionsNoSendPolls'},\n {flags: ['embed_links'], text: 'UserRestrictionsEmbedLinks', exceptionText: 'UserRestrictionsNoEmbedLinks'},\n {flags: ['invite_users'], text: 'UserRestrictionsInviteUsers', exceptionText: 'UserRestrictionsNoInviteUsers'},\n {flags: ['pin_messages'], text: 'UserRestrictionsPinMessages', exceptionText: 'UserRestrictionsNoPinMessages'},\n {flags: ['change_info'], text: 'UserRestrictionsChangeInfo', exceptionText: 'UserRestrictionsNoChangeInfo'}\n ];\n\n this.toggleWith = {\n 'send_messages': ['send_media', 'send_stickers', 'send_polls', 'embed_links']\n };\n\n const chat: Chat.chat = appChatsManager.getChat(options.chatId);\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? appChatsManager.combineParticipantBannedRights(options.chatId, options.participant.banned_rights) : defaultBannedRights;\n \n for(const info of this.v) {\n const mainFlag = info.flags[0];\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: appChatsManager.hasRights(options.chatId, mainFlag, rights),\n restriction: true,\n withRipple: true\n });\n\n // @ts-ignore\n if(options.participant && defaultBannedRights.pFlags[mainFlag]) {\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('UserRestrictionsDisabled', true));\n }, {listenerSetter: options.listenerSetter});\n }\n\n if(this.toggleWith[mainFlag]) {\n options.listenerSetter.add(info.checkboxField.input)('change', () => {\n if(!info.checkboxField.checked) {\n const other = this.v.filter(i => this.toggleWith[mainFlag].includes(i.flags[0]));\n other.forEach(info => {\n info.checkboxField.checked = false;\n });\n }\n });\n }\n\n options.appendTo.append(info.checkboxField.label);\n }\n }\n\n public takeOut() {\n const rights: ChatBannedRights = {\n _: 'chatBannedRights',\n until_date: 0x7FFFFFFF,\n pFlags: {}\n };\n\n for(const info of this.v) {\n const banned = !info.checkboxField.checked;\n if(banned) {\n info.flags.forEach(flag => {\n // @ts-ignore\n rights.pFlags[flag] = true;\n });\n }\n }\n\n return rights;\n }\n}\n\nexport default class AppGroupPermissionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n protected async init() {\n this.container.classList.add('edit-peer-container', 'group-permissions-container');\n this.setTitle('ChannelPermissions');\n\n let chatPermissions: ChatPermissions;\n {\n const section = new SettingSection({\n name: 'ChannelPermissionsHeader',\n });\n\n chatPermissions = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n });\n\n this.eventListener.addEventListener('destroy', () => {\n appChatsManager.editChatDefaultBannedRights(this.chatId, chatPermissions.takeOut());\n }, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({\n name: 'PrivacyExceptions'\n });\n\n const addExceptionRow = new Row({\n titleLangKey: 'ChannelAddException',\n subtitleLangKey: 'Loading',\n icon: 'adduser',\n clickable: () => {\n new PopupPickUser({\n peerTypes: ['channelParticipants'],\n onSelect: (peerId) => {\n setTimeout(() => {\n openPermissions(peerId);\n }, 0);\n },\n placeholder: 'ExceptionModal.Search.Placeholder',\n peerId: -this.chatId,\n });\n }\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = new AppUserPermissionsTab(this.slider);\n tab.participant = participant;\n tab.chatId = this.chatId;\n tab.userId = peerId;\n tab.open();\n };\n\n section.content.append(addExceptionRow.container);\n\n /* const removedUsersRow = new Row({\n titleLangKey: 'ChannelBlockedUsers',\n subtitleLangKey: 'NoBlockedUsers',\n icon: 'deleteuser',\n clickable: true\n });\n\n section.content.append(removedUsersRow.container); */\n\n const c = section.generateContentElement();\n c.classList.add('chatlist-container');\n \n const list = appDialogsManager.createChatList({new: true});\n c.append(list);\n\n attachClickEvent(list, (e) => {\n const target = findUpTag(e.target, 'LI');\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = (li: Element, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;//appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = (appChatsManager.getChat(this.chatId) as Chat.channel).default_banned_rights;\n //const combinedRights = appChatsManager.combineParticipantBannedRights(this.chatId, bannedRights);\n\n const cantWhat: LangPackKey[] = []/* , canWhat: LangPackKey[] = [] */;\n chatPermissions.v.forEach(info => {\n const mainFlag = info.flags[0];\n // @ts-ignore\n if(bannedRights.pFlags[mainFlag] && !defaultBannedRights.pFlags[mainFlag]) {\n cantWhat.push(info.exceptionText);\n // @ts-ignore\n }/* else if(!combinedRights.pFlags[mainFlag]) {\n canWhat.push(info.exceptionText);\n } */\n });\n\n const el = li.querySelector('.user-last-message') as HTMLElement;\n\n if(cantWhat.length) {\n el.innerHTML = '';\n el.append(...join(cantWhat.map(t => i18n(t)), false));\n }/* else if(canWhat.length) {\n str = 'Can ' + canWhat.join(canWhat.length === 2 ? ' and ' : ', ');\n } */\n \n el.classList.toggle('hide', !cantWhat.length);\n };\n\n const add = (participant: ChannelParticipant.channelParticipantBanned, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: appPeersManager.getPeerId(participant.peer),\n container: list,\n drawStatus: false,\n rippleEnabled: true,\n avatarSize: 48,\n append\n });\n\n setSubtitle(dom.listEl, participant);\n\n //dom.titleSpan.innerHTML = 'Chinaza Akachi';\n //dom.lastMessageSpan.innerHTML = 'Can Add Users and Pin Messages';\n };\n\n this.listenerSetter.add(rootScope)('updateChannelParticipant', (update: Update.updateChannelParticipant) => {\n const needAdd = update.new_participant?._ === 'channelParticipantBanned' && !update.new_participant.banned_rights.pFlags.view_messages;\n const li = list.querySelector(`[data-peer-id=\"${update.user_id}\"]`);\n if(needAdd) {\n if(!li) {\n add(update.new_participant as ChannelParticipant.channelParticipantBanned, false);\n } else {\n setSubtitle(li, update.new_participant as ChannelParticipant.channelParticipantBanned);\n }\n\n if(update.prev_participant?._ !== 'channelParticipantBanned') {\n ++exceptionsCount;\n }\n } else {\n if(li) {\n li.remove();\n }\n\n if(update.prev_participant?._ === 'channelParticipantBanned') {\n --exceptionsCount;\n }\n }\n\n setLength();\n });\n\n const setLength = () => {\n replaceContent(addExceptionRow.subtitle, i18n(exceptionsCount ? 'Permissions.ExceptionsCount' : 'Permissions.NoExceptions', [exceptionsCount]));\n };\n\n let exceptionsCount = 0;\n let loader: ScrollableLoader;\n const setLoader = () => {\n const LOAD_COUNT = 50;\n loader = new ScrollableLoader({\n scrollable: this.scrollable,\n getPromise: () => {\n return appProfileManager.getChannelParticipants(this.chatId, {_: 'channelParticipantsBanned', q: ''}, LOAD_COUNT, list.childElementCount).then(res => {\n for(const participant of res.participants) {\n add(participant as ChannelParticipant.channelParticipantBanned, true);\n }\n \n exceptionsCount = res.count;\n setLength();\n \n return res.participants.length < LOAD_COUNT || res.count === list.childElementCount;\n });\n }\n });\n\n return loader.load();\n };\n\n this.scrollable.append(section.container);\n\n if(appChatsManager.isChannel(this.chatId)) {\n await setLoader();\n } else {\n setLength();\n \n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.chatId === migrateFrom) {\n this.chatId = migrateTo;\n setLoader();\n }\n });\n }\n }\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport appPeersManager, { PeerType } from \"../../lib/appManagers/appPeersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\n\nexport default class PopupDeleteDialog {\n constructor(\n peerId: PeerId, \n // actionType: 'leave' | 'delete', \n peerType: PeerType = appPeersManager.getDialogType(peerId), \n onSelect?: (promise: Promise) => void\n ) {\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n /* const callbackFlush = (checked: PopupPeerButtonCallbackCheckboxes) => {\n const promise = appMessagesManager.flushHistory(peerId, checkboxes ? !checked[checkboxes[0].text] : undefined);\n onSelect && onSelect(promise);\n }; */\n\n const callbackLeave = (checked: PopupPeerButtonCallbackCheckboxes, flush = checkboxes && !!checked.size) => {\n let promise = appChatsManager.leave(peerId.toChatId());\n \n if(flush) {\n promise = promise.finally(() => {\n return appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n \n onSelect && onSelect(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(peerId.isUser()) {\n promise = appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n \n onSelect && onSelect(promise);\n };\n\n let title: LangPackKey, description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n appChatsManager.deleteChannel\n title = 'ChannelDeleteMenu';\n description = 'AreYouSureDeleteAndExitChannel';\n buttons = [{\n langKey: 'ChannelDeleteMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChannelForAll'\n }];\n } else {\n title = 'LeaveChannelMenu';\n description = 'ChannelLeaveAlertWithName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'LeaveChannel',\n isDanger: true,\n callback: callbackLeave\n }];\n }\n\n break;\n }\n\n /* case 'megagroup': {\n title = 'Leave Group?';\n description = `Are you sure you want to leave this group?`;\n buttons = [{\n text: 'LEAVE ' + peerTitleElement,\n isDanger: true,\n callback: callbackLeave\n }];\n\n break;\n } */\n\n case 'chat': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatWithUser';\n descriptionArgs = [peerTitleElement];\n\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteMessagesOptionAlso',\n textArgs: [\n new PeerTitle({peerId}).element\n ]\n }];\n\n break;\n }\n\n case 'saved': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatSavedMessages';\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n break;\n }\n\n case 'megagroup':\n case 'group': {\n if(/* actionType === 'delete' && */appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'DeleteMegaMenu';\n description = 'AreYouSureDeleteAndExit';\n buttons = [{\n langKey: 'DeleteMegaMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChat.DeleteGroupForAll'\n }];\n } else {\n title = 'LeaveMegaMenu';\n description = 'AreYouSureDeleteAndExitName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: (checkboxes) => callbackLeave(checkboxes, true)\n }];\n }\n\n break;\n }\n }\n\n new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport Button from \"../../button\";\r\nimport appChatsManager, { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport { Chat, ChatFull } from \"../../../layer\";\r\nimport AppChatTypeTab from \"./chatType\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppGroupPermissionsTab from \"./groupPermissions\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport PopupDeleteDialog from \"../../popups/deleteDialog\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\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 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\r\n this.container.classList.add('edit-peer-container', 'edit-group-container');\r\n this.setTitle('Edit');\r\n \r\n const chatFull = await appProfileManager.getChatFull(this.chatId, true);\r\n\r\n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(this.chatId);\r\n const isBroadcast = appChatsManager.isBroadcast(this.chatId);\r\n const isChannel = appChatsManager.isChannel(this.chatId);\r\n\r\n const chatUpdateListeners: (() => void)[] = [];\r\n const addChatUpdateListener = (callback: () => void) => {\r\n chatUpdateListeners.push(callback);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n chatUpdateListeners.forEach(callback => callback());\r\n }\r\n });\r\n\r\n const peerId = this.chatId.toPeerId(true);\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(appChatsManager.hasRights(this.chatId, 'change_type')) {\r\n const chatTypeRow = new Row({\r\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\r\n clickable: () => {\r\n const tab = new AppChatTypeTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.chatFull = chatFull;\r\n tab.open();\r\n\r\n this.listenerSetter.add(tab.eventListener)('destroy', setChatTypeSubtitle);\r\n },\r\n icon: 'lock'\r\n });\r\n\r\n const setChatTypeSubtitle = () => {\r\n chatTypeRow.subtitle.textContent = '';\r\n\r\n let key: LangPackKey;\r\n if(isBroadcast) {\r\n key = (chat as Chat.channel).username ? 'TypePublic' : 'TypePrivate';\r\n } else {\r\n key = (chat as Chat.channel).username ? 'TypePublicGroup' : 'TypePrivateGroup';\r\n }\r\n\r\n chatTypeRow.subtitle.append(i18n(key));\r\n };\r\n\r\n setChatTypeSubtitle();\r\n section.content.append(chatTypeRow.container);\r\n }\r\n\r\n if(appChatsManager.hasRights(this.chatId, 'change_permissions') && !isBroadcast) {\r\n const flags = [\r\n 'send_messages',\r\n 'send_media',\r\n 'send_stickers',\r\n 'send_polls',\r\n 'embed_links',\r\n 'invite_users',\r\n 'pin_messages',\r\n 'change_info'\r\n ] as ChatRights[];\r\n\r\n const permissionsRow = new Row({\r\n titleLangKey: 'ChannelPermissions',\r\n clickable: () => {\r\n const tab = new AppGroupPermissionsTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.open();\r\n },\r\n icon: 'permissions',\r\n });\r\n\r\n const setPermissionsLength = () => {\r\n permissionsRow.subtitle.innerHTML = flags.reduce((acc, f) => acc + +appChatsManager.hasRights(this.chatId, f, chat.default_banned_rights), 0) + '/' + flags.length;\r\n };\r\n\r\n setPermissionsLength(); \r\n section.content.append(permissionsRow.container);\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n setPermissionsLength();\r\n }\r\n });\r\n }\r\n\r\n /* const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n \r\n let promises: Promise[] = [];\r\n\r\n const id = this.chatId;\r\n if(this.chatNameInputField.isValidToChange()) {\r\n promises.push(appChatsManager.editTitle(id, this.chatNameInputField.value));\r\n }\r\n\r\n if(this.descriptionInputField.isValidToChange()) {\r\n promises.push(appChatsManager.editAbout(id, this.descriptionInputField.value));\r\n }\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then(inputFile => {\r\n return appChatsManager.editPhoto(id, inputFile);\r\n }));\r\n }\r\n \r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n \r\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\r\n const discussionRow = new Row({\r\n titleLangKey: 'PeerInfo.Discussion',\r\n subtitleLangKey: 'PeerInfo.Discussion.Add',\r\n clickable: true,\r\n icon: 'message'\r\n });\r\n\r\n section.content.append(discussionRow.container);\r\n }\r\n\r\n const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + chatFull.admins_count,\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n if(isBroadcast && appChatsManager.hasRights(this.chatId, 'change_info')) {\r\n const signMessagesCheckboxField = new CheckboxField({\r\n text: 'PeerInfo.SignMessages',\r\n checked: !!(chat as Chat.channel).pFlags.signatures,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\r\n const toggle = signMessagesCheckboxField.toggleDisability(true);\r\n appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n addChatUpdateListener(() => {\r\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\r\n });\r\n\r\n section.content.append(signMessagesCheckboxField.label);\r\n }\r\n }\r\n\r\n if(!isBroadcast) {\r\n const section = new SettingSection({\r\n\r\n });\r\n\r\n /* const membersRow = new Row({\r\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\r\n icon: 'newgroup',\r\n clickable: true\r\n });\r\n\r\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\r\n\r\n section.content.append(membersRow.container); */\r\n\r\n if(!isBroadcast && appChatsManager.hasRights(this.chatId, 'change_permissions')) {\r\n const showChatHistoryCheckboxField = new CheckboxField({\r\n text: 'ChatHistory',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\r\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\r\n appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const onChatUpdate = () => {\r\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\r\n };\r\n\r\n onChatUpdate();\r\n addChatUpdateListener(onChatUpdate);\r\n \r\n section.content.append(showChatHistoryCheckboxField.label);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(appChatsManager.hasRights(this.chatId, 'delete_chat')) {\r\n const section = new SettingSection({});\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!isChannel) {\r\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\r\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\r\n if(peerId === migrateFrom) {\r\n this.chatId = migrateTo.toChatId();\r\n this._init();\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected init() {\r\n return this._init();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport appNotificationsManager from \"../../../lib/appManagers/appNotificationsManager\";\r\nimport PeerTitle from \"../../peerTitle\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport { addCancelButton } from \"../../popups\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppEditContactTab extends SliderSuperTab {\r\n private nameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private editPeer: EditPeer;\r\n public peerId: PeerId;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\r\n const isNew = !appUsersManager.isContact(this.peerId.toUserId());\r\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FirstName',\r\n name: 'contact-name',\r\n maxLength: 70,\r\n required: true\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'LastName',\r\n name: 'contact-lastname',\r\n maxLength: 70\r\n });\r\n\r\n if(this.peerId) {\r\n const user = appUsersManager.getUser(this.peerId);\r\n\r\n if(isNew) {\r\n this.nameInputField.setDraftValue(user.first_name);\r\n this.lastNameInputField.setDraftValue(user.last_name);\r\n } else {\r\n this.nameInputField.setOriginalValue(user.first_name);\r\n this.lastNameInputField.setOriginalValue(user.last_name);\r\n }\r\n }\r\n \r\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\r\n inputFields.push(this.nameInputField, this.lastNameInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: this.peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter,\r\n doNotEditAvatar: true\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n if(this.peerId) {\r\n const div = document.createElement('div');\r\n div.classList.add('avatar-edit');\r\n div.append(this.editPeer.avatarElem);\r\n \r\n const notificationsCheckboxField = new CheckboxField({\r\n text: 'Notifications'\r\n });\r\n \r\n notificationsCheckboxField.input.addEventListener('change', (e) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n \r\n appMessagesManager.mutePeer(this.peerId);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('notify_settings', (update) => {\r\n if(update.peer._ !== 'notifyPeer') return;\r\n const peerId = appPeersManager.getPeerId(update.peer.peer);\r\n if(this.peerId === peerId) {\r\n const enabled = !appNotificationsManager.isMuted(update.notify_settings);\r\n if(enabled !== notificationsCheckboxField.checked) {\r\n notificationsCheckboxField.checked = enabled;\r\n }\r\n }\r\n });\r\n \r\n const profileNameDiv = document.createElement('div');\r\n profileNameDiv.classList.add('profile-name');\r\n profileNameDiv.append(new PeerTitle({\r\n peerId: this.peerId\r\n }).element);\r\n //profileNameDiv.innerHTML = 'Karen Stanford';\r\n \r\n const profileSubtitleDiv = document.createElement('div');\r\n profileSubtitleDiv.classList.add('profile-subtitle');\r\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\r\n\r\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\r\n\r\n if(!isNew) {\r\n const notificationsRow = new Row({\r\n checkboxField: notificationsCheckboxField\r\n });\r\n \r\n const enabled = !appNotificationsManager.isPeerLocalMuted(this.peerId, false);\r\n notificationsCheckboxField.checked = enabled;\r\n\r\n section.content.append(notificationsRow.container);\r\n } else {\r\n const user = appUsersManager.getUser(this.peerId);\r\n\r\n const phoneRow = new Row({\r\n icon: 'phone',\r\n titleLangKey: user.phone ? undefined : 'MobileHidden',\r\n title: user.phone ? appUsersManager.formatUserPhone(user.phone) : undefined,\r\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\r\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: this.peerId}).element]\r\n });\r\n\r\n section.content.append(phoneRow.container);\r\n }\r\n } else {\r\n section.content.append(inputWrapper);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n appUsersManager.addContact(this.peerId, this.nameInputField.value, this.lastNameInputField.value, appUsersManager.getUser(this.peerId).phone)\r\n .finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(!isNew) {\r\n const section = new SettingSection({\r\n \r\n });\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupPeer('popup-delete-contact', {\r\n peerId: this.peerId,\r\n titleLangKey: 'DeleteContact',\r\n descriptionLangKey: 'AreYouSureDeleteContact',\r\n buttons: addCancelButton([{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n\r\n appUsersManager.deleteContacts([this.peerId]).then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true\r\n }])\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport { putPreloader, setButtonLoader } from \"../../misc\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppAddMembersTab extends SliderSuperTab {\r\n private nextBtn: HTMLButtonElement;\r\n private selector: AppSelectPeers;\r\n private peerType: 'channel' | 'chat' | 'privacy';\r\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\r\n private skippable: boolean;\r\n\r\n protected init() {\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n this.content.append(this.nextBtn);\r\n this.scrollable.container.remove();\r\n \r\n this.nextBtn.addEventListener('click', () => {\r\n const peerIds = this.selector.getSelected().map(sel => sel.toPeerId());\r\n\r\n if(this.skippable) {\r\n this.takeOut(peerIds);\r\n this.close();\r\n } else {\r\n const promise = this.takeOut(peerIds);\r\n\r\n if(promise instanceof Promise) {\r\n this.attachToPromise(promise);\r\n } else if(promise === undefined) {\r\n this.close();\r\n }\r\n }\r\n });\r\n }\r\n\r\n public attachToPromise(promise: Promise) {\r\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\r\n\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n removeLoader();\r\n });\r\n }\r\n\r\n public open(options: {\r\n title: LangPackKey,\r\n placeholder: LangPackKey,\r\n type: AppAddMembersTab['peerType'], \r\n takeOut?: AppAddMembersTab['takeOut'],\r\n skippable: boolean,\r\n selectedPeerIds?: PeerId[]\r\n }) {\r\n const ret = super.open();\r\n\r\n this.setTitle(options.title);\r\n this.peerType = options.type;\r\n this.takeOut = options.takeOut;\r\n this.skippable = options.skippable;\r\n\r\n const isPrivacy = this.peerType === 'privacy';\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.content, \r\n onChange: this.skippable ? null : (length) => {\r\n this.nextBtn.classList.toggle('is-visible', !!length);\r\n }, \r\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\r\n placeholder: options.placeholder,\r\n exceptSelf: isPrivacy,\r\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined\r\n });\r\n\r\n if(options.selectedPeerIds) {\r\n this.selector.addInitial(options.selectedPeerIds);\r\n }\r\n\r\n this.nextBtn.classList.add('tgico-arrow_next');\r\n this.nextBtn.innerHTML = '';\r\n this.nextBtn.disabled = false;\r\n this.nextBtn.classList.toggle('is-visible', this.skippable);\r\n\r\n return ret;\r\n }\r\n}","import { IS_FIREFOX } from \"./userAgent\";\n\nconst PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default PARALLAX_SUPPORTED;","export default function generateVerifiedIcon() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n svg.setAttributeNS(null, 'width', '24');\n svg.setAttributeNS(null, 'height', '24');\n svg.classList.add('verified-icon');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-background');\n use.classList.add('verified-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-check');\n use2.classList.add('verified-check');\n\n svg.append(use, use2);\n\n return svg;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst getEvent = (e: TouchEvent | MouseEvent) => {\r\n return (e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent;\r\n};\r\n\r\nconst attachGlobalListenerTo = window;\r\n\r\nlet RESET_GLOBAL = false;\r\nrootScope.addEventListener('context_menu_toggle', (visible) => {\r\n RESET_GLOBAL = visible;\r\n});\r\n\r\nexport type SwipeHandlerOptions = {\r\n element: SwipeHandler['element'],\r\n onSwipe: SwipeHandler['onSwipe'],\r\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\r\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\r\n onReset?: SwipeHandler['onReset'],\r\n cursor?: SwipeHandler['cursor'],\r\n cancelEvent?: SwipeHandler['cancelEvent'],\r\n listenerOptions?: SwipeHandler['listenerOptions']\r\n};\r\n\r\nexport default class SwipeHandler {\r\n private element: HTMLElement;\r\n private onSwipe: (xDiff: number, yDiff: number, e: TouchEvent | MouseEvent) => boolean | void;\r\n private verifyTouchTarget: (evt: TouchEvent | MouseEvent) => boolean;\r\n private onFirstSwipe: () => void;\r\n private onReset: () => void;\r\n private cursor: 'grabbing' | 'move' | 'row-resize' | 'col-resize' | 'nesw-resize' | 'nwse-resize' | 'ne-resize' | 'se-resize' | 'sw-resize' | 'nw-resize' | 'n-resize' | 'e-resize' | 's-resize' | 'w-resize' | '' = 'grabbing';\r\n private cancelEvent = true;\r\n private listenerOptions: boolean | AddEventListenerOptions = false;\r\n private setCursorTo: HTMLElement;\r\n\r\n private hadMove = false;\r\n private xDown: number = null;\r\n private yDown: number = null;\r\n\r\n constructor(options: SwipeHandlerOptions) {\r\n safeAssign(this, options);\r\n \r\n this.setCursorTo = this.element;\r\n\r\n this.setListeners();\r\n }\r\n\r\n public setListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.addEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.addEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public removeListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.removeEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.removeEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public setCursor(cursor: SwipeHandler['cursor']) {\r\n this.cursor = cursor;\r\n \r\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n }\r\n\r\n reset = (e?: Event) => {\r\n /* if(e) {\r\n cancelEvent(e);\r\n } */\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.removeEventListener('touchmove', this.handleMove, {capture: true});\r\n } else {\r\n attachGlobalListenerTo.removeEventListener('mousemove', this.handleMove);\r\n this.setCursorTo.style.cursor = '';\r\n }\r\n\r\n if(this.onReset && this.hadMove) {\r\n this.onReset();\r\n }\r\n\r\n this.xDown = this.yDown = null;\r\n this.hadMove = false;\r\n };\r\n\r\n handleStart = (_e: TouchEvent | MouseEvent) => {\r\n const e = getEvent(_e);\r\n if(this.verifyTouchTarget && !this.verifyTouchTarget(_e)) {\r\n return this.reset();\r\n }\r\n\r\n this.xDown = e.clientX;\r\n this.yDown = e.clientY;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.addEventListener('touchmove', this.handleMove, {passive: false, capture: true});\r\n } else {\r\n attachGlobalListenerTo.addEventListener('mousemove', this.handleMove, false);\r\n }\r\n };\r\n\r\n handleMove = (_e: TouchEvent | MouseEvent) => {\r\n if(this.xDown === null || this.yDown === null || RESET_GLOBAL) {\r\n this.reset();\r\n return;\r\n }\r\n\r\n if(this.cancelEvent) {\r\n cancelEvent(_e);\r\n }\r\n\r\n const e = getEvent(_e);\r\n const xUp = e.clientX;\r\n const yUp = e.clientY;\r\n\r\n const xDiff = this.xDown - xUp;\r\n const yDiff = this.yDown - yUp;\r\n\r\n if(!this.hadMove) {\r\n if(!xDiff && !yDiff) {\r\n return;\r\n }\r\n\r\n this.hadMove = true;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n\r\n if(this.onFirstSwipe) {\r\n this.onFirstSwipe();\r\n }\r\n }\r\n\r\n // if(Math.abs(xDiff) > Math.abs(yDiff)) { /*most significant*/\r\n // if(xDiff > 0) { /* left swipe */ \r\n\r\n // } else { /* right swipe */\r\n\r\n // } \r\n // } else {\r\n // if(yDiff > 0) { /* up swipe */ \r\n \r\n // } else { /* down swipe */\r\n \r\n // }\r\n // }\r\n\r\n /* reset values */\r\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\r\n if(onSwipeResult !== undefined && onSwipeResult) {\r\n this.reset();\r\n }\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport filterChatPhotosMessages from \"../helpers/filterChatPhotosMessages\";\nimport ListLoader from \"../helpers/listLoader\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { Message, ChatFull, MessageAction, Photo } from \"../layer\";\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\nimport appMessagesManager, { AppMessagesManager } from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { openAvatarViewer } from \"./avatar\";\nimport Scrollable from \"./scrollable\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { wrapPhoto } from \"./wrappers\";\n\nconst LOAD_NEAREST = 3;\n\nexport default class PeerProfileAvatars {\n private static BASE_CLASS = 'profile-avatars';\n private static SCALE = PARALLAX_SUPPORTED ? 2 : 1;\n private static TRANSLATE_TEMPLATE = 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> = new Map();\n\n constructor(public scrollable: Scrollable) {\n this.container = document.createElement('div');\n this.container.classList.add(PeerProfileAvatars.BASE_CLASS + '-container');\n\n this.avatars = document.createElement('div');\n this.avatars.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatars');\n\n this.gradient = document.createElement('div');\n this.gradient.classList.add(PeerProfileAvatars.BASE_CLASS + '-gradient');\n\n this.info = document.createElement('div');\n this.info.classList.add(PeerProfileAvatars.BASE_CLASS + '-info');\n\n this.tabs = document.createElement('div');\n this.tabs.classList.add(PeerProfileAvatars.BASE_CLASS + '-tabs');\n\n this.arrowPrevious = document.createElement('div');\n this.arrowPrevious.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', 'tgico-avatarprevious');\n\n /* const previousIcon = document.createElement('i');\n previousIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-previous');\n this.arrowBack.append(previousIcon); */\n \n this.arrowNext = document.createElement('div');\n this.arrowNext.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', PeerProfileAvatars.BASE_CLASS + '-arrow-next', 'tgico-avatarnext');\n\n /* const nextIcon = document.createElement('i');\n nextIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-next');\n this.arrowNext.append(nextIcon); */\n\n this.container.append(this.avatars, this.gradient, this.info, this.tabs, this.arrowPrevious, this.arrowNext);\n\n const checkScrollTop = () => {\n if(this.scrollable.scrollTop !== 0) {\n this.scrollable.scrollIntoViewNew(this.scrollable.container.firstElementChild as HTMLElement, 'start');\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 });\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 = 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\n public setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(!photo) {\n return;\n }\n\n const listLoader: PeerProfileAvatars['listLoader'] = this.listLoader = new ListLoader({\n loadCount: 50,\n loadMore: (anchor, older, loadCount) => {\n if(!older) return Promise.resolve({count: undefined, items: []});\n\n if(peerId.isUser()) {\n const maxId: Photo.photo['id'] = (anchor || listLoader.current) as any;\n return appPhotosManager.getUserPhotos(peerId, maxId, loadCount).then(value => {\n return {\n count: value.count,\n items: value.photos\n };\n });\n } else {\n const promises: [Promise, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(appProfileManager.getChatFull(peerId.toChatId()));\n }\n \n promises.push(appMessagesManager.getSearch({\n peerId,\n maxId: Number.MAX_SAFE_INTEGER,\n inputFilter: {\n _: 'inputMessagesFilterChatPhotos'\n },\n limit: loadCount,\n backLimit: 0\n }));\n\n return Promise.all(promises).then((result) => {\n const value = result.pop() as typeof result[1];\n\n filterChatPhotosMessages(value);\n\n if(!listLoader.current) {\n const chatFull = result[0];\n const message = value.history.findAndSplice(m => {\n return ((m as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n \n listLoader.current = message || appMessagesManager.generateFakeAvatarMessage(this.peerId, chatFull.chat_photo);\n }\n\n //console.log('avatars loaded:', value);\n return {\n count: value.count,\n items: value.history\n };\n });\n }\n },\n processItem: this.processItem,\n onJump: (item, older) => {\n const id = this.listLoader.index;\n //const nextId = Math.max(0, id);\n const x = 100 * PeerProfileAvatars.SCALE * id;\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', `-${x}%`);\n\n const activeTab = this.tabs.querySelector('.active');\n if(activeTab) activeTab.classList.remove('active');\n\n const tab = this.tabs.children[id] as HTMLElement;\n tab.classList.add('active');\n\n this.loadNearestToTarget(this.avatars.children[id]);\n }\n });\n\n if(photo._ === 'userProfilePhoto') {\n listLoader.current = photo.photo_id;\n }\n\n this.processItem(listLoader.current);\n\n // listLoader.loaded\n listLoader.load(true);\n }\n\n public addTab() {\n const tab = document.createElement('div');\n tab.classList.add(PeerProfileAvatars.BASE_CLASS + '-tab');\n this.tabs.append(tab);\n\n if(this.tabs.childElementCount === 1) {\n tab.classList.add('active');\n }\n\n this.container.classList.toggle('is-single', this.tabs.childElementCount <= 1);\n }\n\n public processItem = (photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container');\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ? \n appPhotosManager.getPhoto(photoId) : \n (photoId.action as MessageAction.messageActionChannelEditPhoto).photo as Photo.photo;\n }\n\n const img = new Image();\n img.classList.add('avatar-photo');\n img.draggable = false;\n\n const loadCallback = () => {\n if(photo) {\n const res = wrapPhoto({\n container: avatar,\n photo,\n size: appPhotosManager.choosePhotoSize(photo, 420, 420, false),\n withoutPreloader: true\n });\n \n [res.images.thumb, res.images.full].filter(Boolean).forEach(img => {\n img.classList.add('avatar-photo');\n });\n } else {\n const photo = appPeersManager.getPeerPhoto(this.peerId);\n appAvatarsManager.putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\n\n this.avatars.append(avatar);\n\n this.addTab();\n\n return photoId;\n };\n\n private loadNearestToTarget(target: Element) {\n const children = Array.from(target.parentElement.children);\n const idx = children.indexOf(target);\n const slice = children.slice(Math.max(0, idx - LOAD_NEAREST), Math.min(children.length, idx + LOAD_NEAREST));\n\n slice.forEach(target => {\n const callback = this.loadCallbacks.get(target);\n if(callback) {\n callback();\n this.loadCallbacks.delete(target);\n this.intersectionObserver.unobserve(target);\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport { copyTextToClipboard } from \"../helpers/clipboard\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { User } from \"../layer\";\nimport { Channel } from \"../lib/appManagers/appChatsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\nimport appNotificationsManager from \"../lib/appManagers/appNotificationsManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport I18n from \"../lib/langPack\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport rootScope from \"../lib/rootScope\";\nimport AvatarElement from \"./avatar\";\nimport CheckboxField from \"./checkboxField\";\nimport generateVerifiedIcon from \"./generateVerifiedIcon\";\nimport PeerProfileAvatars from \"./peerProfileAvatars\";\nimport PeerTitle from \"./peerTitle\";\nimport Row from \"./row\";\nimport Scrollable from \"./scrollable\";\nimport { SettingSection, generateDelimiter } from \"./sidebarLeft\";\nimport { toast } from \"./toast\";\n\nlet setText = (text: string, row: Row) => {\n //fastRaf(() => {\n row.title.innerHTML = text;\n row.container.style.display = '';\n //});\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n public 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 \n private cleaned: boolean;\n private setBioTimeout: number;\n private setPeerStatusInterval: number;\n\n private peerId: PeerId;\n private threadId: number;\n\n constructor(public scrollable: Scrollable) {\n if(!PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n }\n\n public init() {\n this.init = null;\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.setAttribute('dialog', '1');\n this.avatar.setAttribute('clickable', '');\n\n this.name = document.createElement('div');\n this.name.classList.add('profile-name');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('profile-subtitle');\n\n this.bio = new Row({\n title: ' ',\n subtitleLangKey: 'UserBio',\n icon: 'info',\n clickable: (e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n \n appProfileManager.getProfileByPeerId(this.peerId).then(full => {\n copyTextToClipboard(full.about);\n toast(I18n.format('BioCopied', true));\n });\n }\n });\n\n this.bio.title.classList.add('pre-wrap');\n\n this.username = new Row({\n title: ' ',\n subtitleLangKey: 'Username',\n icon: 'username',\n clickable: () => {\n const peer: Channel | User.user = appPeersManager.getPeer(this.peerId);\n copyTextToClipboard('@' + peer.username);\n toast(I18n.format('UsernameCopied', true));\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitleLangKey: 'Phone',\n icon: 'phone',\n clickable: () => {\n const peer: User = appUsersManager.getUser(this.peerId);\n copyTextToClipboard('+' + peer.phone);\n toast(I18n.format('PhoneCopied', true));\n }\n });\n\n this.notifications = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Notifications',\n icon: 'unmute'\n });\n \n this.section.content.append(this.phone.container, this.username.container, this.bio.container, this.notifications.container);\n\n this.element.append(this.section.container, generateDelimiter());\n\n this.notifications.checkboxField.input.addEventListener('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n //let checked = this.notificationsCheckbox.checked;\n appMessagesManager.mutePeer(this.peerId);\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = appNotificationsManager.isPeerLocalMuted(this.peerId, false);\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n rootScope.addEventListener('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n rootScope.addEventListener('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setBio(true);\n }\n });\n\n rootScope.addEventListener('user_update', (userId) => {\n if(this.peerId === userId) {\n this.setPeerStatus();\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n if(this.peerId === userId) {\n const user = appUsersManager.getUser(userId);\n if(!user.pFlags.self) {\n if(user.phone) {\n setText(appUsersManager.formatUserPhone(user.phone), this.phone);\n } else {\n this.phone.container.style.display = 'none';\n }\n }\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n }\n\n public setPeerStatus = (needClear = false) => {\n if(!this.peerId) return;\n\n const peerId = this.peerId;\n appImManager.setPeerStatus(this.peerId, this.subtitle, needClear, true, () => peerId === this.peerId);\n };\n\n public cleanupHTML() {\n this.bio.container.style.display = 'none';\n this.phone.container.style.display = 'none';\n this.username.container.style.display = 'none';\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n if(this.setBioTimeout) {\n window.clearTimeout(this.setBioTimeout);\n this.setBioTimeout = 0;\n }\n }\n\n public setAvatar() {\n if(this.peerId !== rootScope.myId) {\n const photo = appPeersManager.getPeerPhoto(this.peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable);\n this.avatars.setPeer(this.peerId);\n this.avatars.info.append(this.name, this.subtitle);\n \n this.avatar.remove();\n \n if(oldAvatars) oldAvatars.container.replaceWith(this.avatars.container);\n else this.element.prepend(this.avatars.container);\n\n if(PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('parallax');\n }\n\n return;\n }\n }\n\n if(PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.remove('parallax');\n }\n\n if(this.avatars) {\n this.avatars.container.remove();\n this.avatars = undefined;\n }\n\n this.avatar.setAttribute('peer', '' + this.peerId);\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n }\n\n public fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n \n const peerId = this.peerId;\n\n this.cleanupHTML();\n\n this.setAvatar();\n\n // username\n if(peerId !== rootScope.myId) {\n let username = appPeersManager.getPeerUsername(peerId);\n if(username) {\n setText(appPeersManager.getPeerUsername(peerId), this.username);\n }\n \n const muted = appNotificationsManager.isPeerLocalMuted(peerId, false);\n this.notifications.checkboxField.checked = !muted;\n } else {\n fastRaf(() => {\n this.notifications.container.style.display = 'none';\n });\n }\n \n //let membersLi = this.profileTabs.firstElementChild.children[0] as HTMLLIElement;\n if(peerId.isUser()) {\n //membersLi.style.display = 'none';\n\n let user = appUsersManager.getUser(peerId);\n if(user.phone && peerId !== rootScope.myId) {\n setText(appUsersManager.formatUserPhone(user.phone), this.phone);\n }\n }/* else {\n //membersLi.style.display = appPeersManager.isBroadcast(peerId) ? 'none' : '';\n } */\n\n this.setBio();\n\n replaceContent(this.name, new PeerTitle({\n peerId,\n dialog: true,\n }).element);\n\n const peer = appPeersManager.getPeer(peerId);\n if(peer?.pFlags?.verified) {\n this.name.append(generateVerifiedIcon());\n }\n\n this.setPeerStatus(true);\n }\n\n public setBio(override?: true) {\n if(this.setBioTimeout) {\n window.clearTimeout(this.setBioTimeout);\n this.setBioTimeout = 0;\n }\n\n const peerId = this.peerId;\n const threadId = this.threadId;\n\n if(!peerId) {\n return;\n }\n\n let promise: Promise;\n if(peerId.isUser()) {\n promise = appProfileManager.getProfile(peerId, override).then(userFull => {\n if(this.peerId !== peerId || this.threadId !== threadId) {\n //this.log.warn('peer changed');\n return false;\n }\n \n if(userFull.rAbout && peerId !== rootScope.myId) {\n setText(userFull.rAbout, this.bio);\n }\n \n //this.log('userFull', userFull);\n return true;\n });\n } else {\n promise = appProfileManager.getChatFull(peerId.toChatId(), override).then((chatFull) => {\n if(this.peerId !== peerId || this.threadId !== threadId) {\n //this.log.warn('peer changed');\n return false;\n }\n \n //this.log('chatInfo res 2:', chatFull);\n \n if(chatFull.about) {\n setText(RichTextProcessor.wrapRichText(chatFull.about), this.bio);\n }\n\n return true;\n });\n }\n\n promise.then((canSetNext) => {\n if(canSetNext) {\n this.setBioTimeout = window.setTimeout(() => this.setBio(true), 60e3);\n }\n });\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n if(this.init) {\n this.init();\n }\n\n this.peerId = peerId;\n this.threadId = threadId;\n \n this.cleaned = true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport rootScope from \"../../../lib/rootScope\";\nimport AppSearchSuper, { SearchSuperType } from \"../../appSearchSuper.\";\nimport SidebarSlider, { SliderSuperTab } from \"../../slider\";\nimport { TransitionSlider } from \"../../transition\";\nimport AppEditChatTab from \"./editChat\";\nimport PeerTitle from \"../../peerTitle\";\nimport AppEditContactTab from \"./editContact\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport Button from \"../../button\";\nimport ButtonIcon from \"../../buttonIcon\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { toastNew } from \"../../toast\";\nimport AppAddMembersTab from \"../../sidebarLeft/tabs/addMembers\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerCheckboxOptions } from \"../../popups/peer\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PeerProfile from \"../../peerProfile\";\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n\n private historiesStorage: {\n [peerId: PeerId]: Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n }>\n } = {};\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n constructor(slider: SidebarSlider) {\n super(slider, false);\n }\n\n public init() {\n //const perf = performance.now();\n\n this.container.classList.add('shared-media-container', 'profile-container');\n\n // * header\n const newCloseBtn = Button('btn-icon sidebar-close-button', {noRipple: true});\n this.closeBtn.replaceWith(newCloseBtn);\n this.closeBtn = newCloseBtn;\n\n const animatedCloseIcon = document.createElement('div');\n animatedCloseIcon.classList.add('animated-close-icon');\n newCloseBtn.append(animatedCloseIcon);\n\n const transitionContainer = document.createElement('div');\n transitionContainer.className = 'transition slide-fade';\n \n const transitionFirstItem = document.createElement('div');\n transitionFirstItem.classList.add('transition-item');\n\n this.title.append(i18n('Profile'));\n this.editBtn = ButtonIcon('edit');\n //const moreBtn = ButtonIcon('more');\n\n transitionFirstItem.append(this.title, this.editBtn/* , moreBtn */);\n\n const transitionLastItem = document.createElement('div');\n transitionLastItem.classList.add('transition-item');\n\n const secondTitle: HTMLElement = this.title.cloneNode() as any;\n secondTitle.append(i18n('PeerInfo.SharedMedia'));\n\n transitionLastItem.append(secondTitle);\n\n transitionContainer.append(transitionFirstItem, transitionLastItem);\n\n this.header.append(transitionContainer);\n\n // * body\n\n this.profile = new PeerProfile(this.scrollable);\n this.profile.init();\n \n this.scrollable.append(this.profile.element);\n\n const HEADER_HEIGHT = 56;\n this.scrollable.onAdditionalScroll = () => {\n const rect = this.searchSuper.nav.getBoundingClientRect(); \n if(!rect.width) return;\n\n const top = rect.top - 1;\n const isSharedMedia = top <= HEADER_HEIGHT;\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(this.scrollable.container.firstElementChild as HTMLElement, 'start');\n transition(0);\n animatedCloseIcon.classList.remove('state-back');\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n });\n\n attachClickEvent(this.editBtn, (e) => {\n let tab: AppEditChatTab | AppEditContactTab;\n if(this.peerId.isAnyChat()) {\n tab = new AppEditChatTab(this.slider);\n } else {\n tab = new AppEditContactTab(this.slider);\n }\n\n if(tab) {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = this.peerId.toChatId();\n } else {\n tab.peerId = this.peerId;\n }\n \n tab.open();\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n rootScope.addEventListener('history_multiappend', (msgIdsByPeer) => {\n for(const peerId in msgIdsByPeer) {\n this.renderNewMessages(peerId.toPeerId(), Array.from(msgIdsByPeer[peerId]));\n }\n });\n \n rootScope.addEventListener('history_delete', ({peerId, msgs}) => {\n this.deleteDeletedMessages(peerId, Array.from(msgs));\n });\n\n // Calls when message successfully sent and we have an id\n rootScope.addEventListener('message_sent', ({message}) => {\n this.renderNewMessages(message.peerId, [message.mid]);\n });\n\n //this.container.prepend(this.closeBtn.parentElement);\n\n this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'PeerMedia.Members',\n type: 'members'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable: this.scrollable,\n onChangeTab: (mediaTab) => {\n let timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n }\n });\n\n this.profile.element.append(this.searchSuper.container);\n\n const btnAddMembers = ButtonCorner({icon: 'addmember_filled'});\n this.content.append(btnAddMembers);\n\n btnAddMembers.addEventListener('click', () => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = appChatsManager.isChannel(id);\n\n const showConfirmation = (peerIds: PeerId[], callback: (checked: PopupPeerButtonCallbackCheckboxes) => void) => {\n let titleLangKey: LangPackKey, titleLangArgs: any[],\n descriptionLangKey: LangPackKey, descriptionLangArgs: any[],\n checkboxes: PopupPeerCheckboxOptions[];\n\n if(peerIds.length > 1) {\n titleLangKey = 'AddMembersAlertTitle';\n titleLangArgs = [i18n('Members', [peerIds.length])];\n descriptionLangKey = 'AddMembersAlertCountText';\n descriptionLangArgs = peerIds.map(peerId => {\n const b = document.createElement('b');\n b.append(new PeerTitle({peerId}).element);\n return b;\n });\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddMembersForwardMessages',\n checked: true\n }];\n }\n } else {\n titleLangKey = 'AddOneMemberAlertTitle';\n descriptionLangKey = 'AddMembersAlertNamesText';\n const b = document.createElement('b');\n b.append(new PeerTitle({\n peerId: peerIds[0]\n }).element);\n descriptionLangArgs = [b];\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddOneMemberForwardMessages',\n textArgs: [new PeerTitle({peerId: peerIds[0]}).element],\n checked: true\n }];\n }\n }\n\n descriptionLangArgs.push(new PeerTitle({\n peerId\n }).element);\n\n new PopupPeer('popup-add-members', {\n peerId,\n titleLangKey,\n descriptionLangKey,\n descriptionLangArgs,\n buttons: [{\n langKey: 'Add',\n callback\n }],\n checkboxes\n }).show();\n };\n\n const onError = (err: any) => {\n if(err.type === 'USER_PRIVACY_RESTRICTED') {\n toastNew({langPackKey: 'InviteToGroupError'});\n }\n };\n \n if(isChannel) {\n const tab = new AppAddMembersTab(this.slider);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = appChatsManager.inviteToChannel(id, peerIds);\n promise.catch(onError);\n tab.attachToPromise(promise);\n });\n\n return false;\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n } else {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'Search',\n onSelect: (peerId) => {\n setTimeout(() => {\n showConfirmation([peerId], (checked) => {\n appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n },\n });\n }\n });\n\n //console.log('construct shared media time:', performance.now() - perf);\n }\n\n public renderNewMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!this.historiesStorage[peerId]) return;\n \n mids = mids.slice().reverse(); // ! because it will be ascend sorted array\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const filtered = this.searchSuper.filterMessagesByType(mids.map(mid => appMessagesManager.getMessageByPeer(peerId, mid)), inputFilter);\n if(filtered.length) {\n const history = this.historiesStorage[peerId][inputFilter];\n if(history) {\n history.unshift(...filtered.map(message => ({mid: message.mid, peerId: message.peerId})));\n }\n\n if(this.peerId === peerId && this.searchSuper.usedFromHistory[inputFilter] !== -1) {\n this.searchSuper.usedFromHistory[inputFilter] += filtered.length;\n this.searchSuper.performSearchResult(filtered, mediaTab, false);\n }\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!this.historiesStorage[peerId]) return;\n\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = this.historiesStorage[peerId][inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex(m => m.mid === mid);\n if(idx !== -1) {\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`div[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`) as HTMLElement;\n if(div) {\n if(this.searchSuper.selection.isSelecting) {\n this.searchSuper.selection.toggleByElement(div);\n }\n\n div.remove();\n }\n \n if(this.searchSuper.usedFromHistory[inputFilter] >= (idx + 1)) {\n this.searchSuper.usedFromHistory[inputFilter]--;\n }\n }\n\n break;\n }\n }\n }\n\n this.scrollable.onScroll();\n }\n\n public cleanupHTML() {\n // const perf = performance.now();\n this.profile.cleanupHTML();\n \n this.editBtn.classList.add('hide');\n\n this.searchSuper.cleanupHTML(true);\n\n this.container.classList.toggle('can-add-members', this.searchSuper.canViewMembers() && appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users'));\n\n // console.log('cleanupHTML shared media time:', performance.now() - perf);\n }\n\n public setLoadMutex(promise: Promise) {\n this.searchSuper.loadMutex = promise;\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return false;\n\n this.peerId = peerId;\n this.threadId = threadId;\n this.peerChanged = true;\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.searchSuper.setQuery({\n peerId, \n //threadId, \n historyStorage: this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {})\n });\n\n this.profile.setPeer(peerId, threadId);\n \n return true;\n }\n\n public fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n\n this.cleanupHTML();\n\n this.profile.fillProfileElements();\n\n this.toggleEditBtn();\n }\n\n private toggleEditBtn() {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && appUsersManager.isContact(this.peerId.toUserId());\n } else {\n show = appChatsManager.hasRights(this.peerId.toChatId(), 'change_info');\n }\n\n this.editBtn.classList.toggle('hide', !show);\n }\n\n public loadSidebarMedia(single: boolean, justLoad = false) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppSharedMediaTab = AppSharedMediaTab);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport SidebarSlider from \"../slider\";\r\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\r\nimport AppSharedMediaTab from \"./tabs/sharedMedia\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\r\n\r\nexport class AppSidebarRight extends SidebarSlider {\r\n public sharedMediaTab: AppSharedMediaTab;\r\n private isColumnProportionSet = false;\r\n\r\n constructor() {\r\n super({\r\n sidebarEl: document.getElementById('column-right') as HTMLElement,\r\n canHideFirst: true,\r\n navigationType: 'right'\r\n });\r\n\r\n mediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\r\n this.toggleSidebar(false);\r\n }\r\n });\r\n\r\n mediaSizes.addEventListener('resize', () => {\r\n this.setColumnProportion();\r\n });\r\n\r\n this.sharedMediaTab = new AppSharedMediaTab(this);\r\n }\r\n\r\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\r\n if(!this.historyTabIds.length) {\r\n this.toggleSidebar(false, animate);\r\n }\r\n\r\n super.onCloseTab(id, animate, isNavigation);\r\n }\r\n\r\n /* public selectTab(id: number) {\r\n const res = super.selectTab(id);\r\n\r\n if(id !== -1) {\r\n this.toggleSidebar(true);\r\n }\r\n\r\n return res;\r\n } */\r\n\r\n private setColumnProportion() {\r\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\r\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\r\n }\r\n\r\n public toggleSidebar(enable?: boolean, animate?: boolean) {\r\n /////this.log('sidebarEl', this.sidebarEl, enable, isElementInViewport(this.sidebarEl));\r\n\r\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\r\n let willChange: boolean;\r\n if(enable !== undefined) {\r\n if(enable) {\r\n if(!active) {\r\n willChange = true;\r\n }\r\n } else if(active) {\r\n willChange = true;\r\n }\r\n } else {\r\n willChange = true;\r\n }\r\n\r\n if(!willChange) return Promise.resolve();\r\n\r\n if(!active && !this.historyTabIds.length) {\r\n this.sharedMediaTab.open();\r\n //this.selectTab(this.sharedMediaTab);\r\n }\r\n\r\n if(!this.isColumnProportionSet) {\r\n this.setColumnProportion();\r\n this.isColumnProportionSet = true;\r\n }\r\n\r\n const animationPromise = appImManager.selectTab(active ? 1 : 2, animate);\r\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\r\n return animationPromise;\r\n\r\n /* return new Promise((resolve, reject) => {\r\n const hidden: {element: HTMLDivElement, height: number}[] = [];\r\n const observer = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const bubble = entry.target as HTMLDivElement;\r\n if(!entry.isIntersecting) {\r\n hidden.push({element: bubble, height: bubble.scrollHeight});\r\n }\r\n }\r\n \r\n for(const item of hidden) {\r\n item.element.style.minHeight = item.height + 'px';\r\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\r\n item.element.style.width = '1px';\r\n }\r\n \r\n //console.log('hidden', hidden);\r\n observer.disconnect();\r\n \r\n set();\r\n \r\n setTimeout(() => {\r\n for(const item of hidden) {\r\n item.element.style.minHeight = '';\r\n item.element.style.width = '';\r\n (item.element.firstElementChild as HTMLElement).style.display = '';\r\n }\r\n\r\n resolve();\r\n }, 200);\r\n });\r\n \r\n const length = Object.keys(appImManager.bubbles).length;\r\n if(length) {\r\n for(const i in appImManager.bubbles) {\r\n observer.observe(appImManager.bubbles[i]);\r\n }\r\n } else {\r\n set();\r\n setTimeout(resolve, 200);\r\n }\r\n }); */\r\n }\r\n}\r\n\r\nconst appSidebarRight = new AppSidebarRight();\r\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\r\nexport default appSidebarRight;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport appSidebarRight from \"..\";\r\nimport appPollsManager from \"../../../lib/appManagers/appPollsManager\";\r\nimport { roundPercents } from \"../../poll\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { ripple } from \"../../ripple\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\n\r\nexport default class AppPollResultsTab extends SliderSuperTab {\r\n private resultsDiv: HTMLElement;\r\n\r\n protected init() {\r\n this.container.id = 'poll-results-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.resultsDiv = document.createElement('div');\r\n this.resultsDiv.classList.add('poll-results');\r\n this.scrollable.append(this.resultsDiv);\r\n }\r\n\r\n public open(message: any) {\r\n const ret = super.open();\r\n const poll = appPollsManager.getPoll(message.media.poll.id);\r\n\r\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\r\n\r\n const title = document.createElement('h3');\r\n title.innerHTML = poll.poll.rQuestion;\r\n\r\n const percents = poll.results.results.map(v => v.voters / poll.results.total_voters * 100);\r\n roundPercents(percents);\r\n\r\n const fragment = document.createDocumentFragment();\r\n poll.results.results.forEach((result, idx) => {\r\n if(!result.voters) return;\r\n\r\n const hr = document.createElement('hr');\r\n\r\n const answer = poll.poll.answers[idx];\r\n\r\n // Head\r\n const answerEl = document.createElement('div');\r\n answerEl.classList.add('poll-results-answer');\r\n\r\n const answerTitle = document.createElement('div');\r\n answerTitle.innerHTML = RichTextProcessor.wrapEmojiText(answer.text);\r\n\r\n const answerPercents = document.createElement('div');\r\n answerPercents.innerText = Math.round(percents[idx]) + '%';\r\n\r\n answerEl.append(answerTitle, answerPercents);\r\n\r\n // Humans\r\n const list = appDialogsManager.createChatList();\r\n list.classList.add('poll-results-voters');\r\n\r\n appDialogsManager.setListClickListener(list, () => {\r\n appSidebarRight.onCloseBtnClick();\r\n }, undefined, true);\r\n\r\n list.style.minHeight = Math.min(result.voters, 4) * 50 + 'px';\r\n\r\n fragment.append(hr, answerEl, list);\r\n\r\n let offset: string, limit = 4, loading = false, left = result.voters - 4;\r\n const load = () => {\r\n if(loading) return;\r\n loading = true;\r\n\r\n appPollsManager.getVotes(message, answer.option, offset, limit).then(votesList => {\r\n votesList.votes.forEach(vote => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: vote.user_id.toPeerId(false),\r\n container: list,\r\n drawStatus: false,\r\n rippleEnabled: false, \r\n meAsSaved: false,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n });\r\n\r\n if(offset) {\r\n left -= votesList.votes.length;\r\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n }\r\n \r\n offset = votesList.next_offset;\r\n limit = 20;\r\n\r\n if(!left || !votesList.votes.length) {\r\n showMore.remove();\r\n }\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n\r\n load();\r\n\r\n if(left <= 0) return;\r\n\r\n const showMore = document.createElement('div');\r\n showMore.classList.add('poll-results-more', 'show-more', 'rp-overflow');\r\n showMore.addEventListener('click', load);\r\n ripple(showMore);\r\n const down = document.createElement('div');\r\n down.classList.add('tgico-down');\r\n showMore.append(down, i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n\r\n fragment.append(showMore);\r\n });\r\n\r\n this.resultsDiv.append(title, fragment);\r\n\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n /* appPollsManager.getVotes(mid).then(votes => {\r\n console.log('gOt VotEs', votes);\r\n }); */\r\n });\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport appImManager from \"../lib/appManagers/appImManager\";\r\nimport appPollsManager from \"../lib/appManagers/appPollsManager\";\r\nimport serverTimeManager from \"../lib/mtproto/serverTimeManager\";\r\nimport { RichTextProcessor } from \"../lib/richtextprocessor\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { ripple } from \"./ripple\";\r\nimport appSidebarRight from \"./sidebarRight\";\r\nimport AppPollResultsTab from \"./sidebarRight/tabs/pollResults\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport windowSize from \"../helpers/windowSize\";\r\nimport { Poll, PollResults } from \"../layer\";\r\n\r\nlet lineTotalLength = 0;\r\nconst tailLength = 9;\r\nconst times = 10;\r\nconst fullTime = 340;\r\nconst oneTime = fullTime / times;\r\n\r\nexport const roundPercents = (percents: number[]) => {\r\n //console.log('roundPercents before percents:', percents);\r\n\r\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\r\n if(sum > 100) {\r\n const diff = sum - 100;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, minRemainder = 1;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder >= 0.5 && remainder < minRemainder) {\r\n minRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] -= minRemainder;\r\n }\r\n } else if(sum < 100) {\r\n const diff = 100 - sum;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, maxRemainder = 0;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder < 0.5 && remainder > maxRemainder) {\r\n maxRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] += 1 - maxRemainder;\r\n }\r\n }\r\n\r\n //console.log('roundPercents after percents:', percents);\r\n};\r\n\r\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\r\nrootScope.on('poll_update', (e) => {\r\n const {poll, results} = e as {poll: Poll, results: PollResults};\r\n\r\n //console.log('poll_update', poll, results);\r\n for(const connected of connectedPolls) {\r\n if(connected.id === poll.id) {\r\n const pollElement = connected.element;\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n }\r\n }\r\n}); */\r\n\r\nrootScope.addEventListener('poll_update', ({poll, results}) => {\r\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\r\n pollElements.forEach(pollElement => {\r\n //console.log('poll_update', poll, results);\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n });\r\n});\r\n\r\nrootScope.addEventListener('peer_changed', () => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n});\r\n\r\nmediaSizes.addEventListener('resize', () => {\r\n PollElement.setMaxLength();\r\n PollElement.resizePolls();\r\n});\r\n\r\nmediaSizes.addEventListener('changeScreen', () => {\r\n PollElement.setMaxLength();\r\n});\r\n\r\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\r\n element.classList.remove('active');\r\n\r\n clearTimeout(timeout);\r\n setTimeout(() => {\r\n onHide();\r\n element.remove();\r\n\r\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\r\n prevQuizHint = prevQuizHintOnHide = null;\r\n prevQuizHintTimeout = 0;\r\n }\r\n }, 200);\r\n};\r\n\r\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\r\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n\r\n const element = document.createElement('div');\r\n element.classList.add('quiz-hint');\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('container', 'tgico');\r\n\r\n const textEl = document.createElement('div');\r\n textEl.classList.add('text');\r\n\r\n container.append(textEl);\r\n element.append(container);\r\n\r\n textEl.innerHTML = RichTextProcessor.wrapRichText(solution, {entities: solution_entities});\r\n appImManager.chat.bubbles.bubblesContainer.append(element);\r\n\r\n void element.offsetLeft; // reflow\r\n element.classList.add('active');\r\n\r\n prevQuizHint = element;\r\n prevQuizHintOnHide = onHide;\r\n prevQuizHintTimeout = window.setTimeout(() => {\r\n hideQuizHint(element, onHide, prevQuizHintTimeout);\r\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\r\n};\r\n\r\nexport default class PollElement extends HTMLElement {\r\n public static MAX_OFFSET = -46.5;\r\n public static MAX_LENGTH = 0;\r\n public svgLines: SVGSVGElement[];\r\n private numberDivs: HTMLDivElement[];\r\n private answerDivs: HTMLDivElement[];\r\n private descDiv: HTMLElement;\r\n private typeDiv: HTMLElement;\r\n private avatarsDiv: HTMLElement;\r\n private viewResults: HTMLElement;\r\n private votersCountDiv: HTMLDivElement;\r\n\r\n // private maxLength: number;\r\n // private maxLengths: number[];\r\n private maxPercents: number[];\r\n\r\n public isClosed = false;\r\n private isQuiz = false;\r\n private isRetracted = false;\r\n private isPublic = false;\r\n private isMultiple = false;\r\n private chosenIndexes: number[] = [];\r\n private percents: number[];\r\n\r\n public message: any;\r\n\r\n private quizInterval: number;\r\n private quizTimer: SVGSVGElement;\r\n\r\n private sendVoteBtn: HTMLElement;\r\n private chosingIndexes: number[] = [];\r\n\r\n private sendVotePromise: Promise;\r\n private sentVote = false;\r\n\r\n constructor() {\r\n super();\r\n // элемент создан\r\n }\r\n\r\n public static setMaxLength() {\r\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\r\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\r\n }\r\n\r\n public static resizePolls() {\r\n if(!this.MAX_LENGTH) return;\r\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\r\n pollElements.forEach(pollElement => {\r\n pollElement.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n pollElement.setLineProgress(idx, 1);\r\n });\r\n });\r\n }\r\n\r\n public render() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n if(!lineTotalLength) {\r\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\r\n //console.log('line total length:', lineTotalLength);\r\n PollElement.setMaxLength();\r\n }\r\n\r\n const pollId = this.message.media.poll.id;\r\n const {poll, results} = appPollsManager.getPoll(pollId);\r\n\r\n /* const timestamp = Date.now() / 1000 | 0;\r\n if(timestamp < this.message.date) { */\r\n if(this.message.pFlags.is_scheduled) {\r\n this.classList.add('disable-hover');\r\n }\r\n\r\n //console.log('pollElement poll:', poll, results);\r\n\r\n let descKey: LangPackKey;\r\n if(poll.pFlags) {\r\n this.isPublic = !!poll.pFlags.public_voters;\r\n this.isQuiz = !!poll.pFlags.quiz;\r\n this.isClosed = !!poll.pFlags.closed;\r\n this.isMultiple = !!poll.pFlags.multiple_choice;\r\n\r\n if(this.isClosed) {\r\n descKey = 'Chat.Poll.Type.Closed';\r\n this.classList.add('is-closed');\r\n } else if(this.isQuiz) {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\r\n } else {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\r\n }\r\n }\r\n\r\n this.classList.toggle('is-multiple', this.isMultiple);\r\n\r\n const multipleSelect = this.isMultiple ? '' : '';\r\n const votes = poll.answers.map((answer, idx) => {\r\n return `\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n ${multipleSelect}\r\n
\r\n
\r\n
${RichTextProcessor.wrapEmojiText(answer.text)}
\r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n }).join('');\r\n\r\n this.innerHTML = `\r\n
${poll.rQuestion}
\r\n
\r\n
\r\n
\r\n
\r\n ${votes}`;\r\n\r\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\r\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\r\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\r\n\r\n if(descKey) {\r\n this.typeDiv.append(i18n(descKey));\r\n }\r\n\r\n if(this.isQuiz) {\r\n this.classList.add('is-quiz');\r\n\r\n if(poll.close_period && poll.close_date) {\r\n const timeLeftDiv = document.createElement('div');\r\n timeLeftDiv.classList.add('poll-time');\r\n this.descDiv.append(timeLeftDiv);\r\n\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n //svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\r\n svg.classList.add('poll-quiz-timer');\r\n\r\n this.quizTimer = svg;\r\n\r\n const strokeWidth = 2;\r\n const radius = 7;\r\n const circumference = 2 * Math.PI * radius;\r\n\r\n const circle = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n circle.classList.add('poll-quiz-timer-circle');\r\n circle.setAttributeNS(null, 'cx', '16');\r\n circle.setAttributeNS(null, 'cy', '16');\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\r\n\r\n svg.append(circle);\r\n this.descDiv.append(svg);\r\n \r\n const period = poll.close_period * 1000;\r\n const closeTime = (poll.close_date - serverTimeManager.serverTimeOffset) * 1000;\r\n\r\n //console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\r\n\r\n // let time = Date.now();\r\n // let percents = (closeTime - time) / period;\r\n\r\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\r\n\r\n // // @ts-ignore\r\n // circle.style.strokeDashoffset = circumference + percents * circumference;\r\n // circle.style.strokeDasharray = ${circumference} ${circumference};\r\n\r\n this.quizInterval = window.setInterval(() => {\r\n const time = Date.now();\r\n const percents = (closeTime - time) / period;\r\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\r\n timeLeftDiv.innerHTML = String(timeLeft).toHHMMSS();\r\n \r\n if (timeLeft <= 5) {\r\n timeLeftDiv.style.color = '#ee545c';\r\n circle.style.stroke = '#ee545c';\r\n }\r\n //timeLeftDiv.style.visibility = 'visible';\r\n\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference + percents * circumference;\r\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\r\n\r\n if(time >= closeTime) {\r\n clearInterval(this.quizInterval);\r\n timeLeftDiv.innerHTML = '';\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference;\r\n this.quizInterval = 0;\r\n\r\n setTimeout(() => {\r\n // нужно запросить апдейт чтобы опрос обновился\r\n appPollsManager.getResults(this.message);\r\n }, 3e3);\r\n }\r\n }, 1e3);\r\n }\r\n }\r\n \r\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\r\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\r\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\r\n\r\n const footerDiv = document.createElement('div');\r\n footerDiv.classList.add('poll-footer');\r\n\r\n this.viewResults = document.createElement('div');\r\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\r\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\r\n\r\n this.votersCountDiv = document.createElement('div');\r\n this.votersCountDiv.className = 'poll-votes-count';\r\n\r\n footerDiv.append(this.viewResults, this.votersCountDiv);\r\n this.append(footerDiv);\r\n\r\n this.viewResults.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n\r\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\r\n new AppPollResultsTab(appSidebarRight).open(this.message);\r\n }\r\n });\r\n ripple(this.viewResults);\r\n\r\n if(this.isMultiple) {\r\n this.sendVoteBtn = document.createElement('div');\r\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\r\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\r\n ripple(this.sendVoteBtn);\r\n\r\n if(!poll.chosenIndexes.length) {\r\n this.votersCountDiv.classList.add('hide');\r\n }\r\n\r\n attachClickEvent(this.sendVoteBtn, (e) => {\r\n cancelEvent(e);\r\n /* const indexes = this.answerDivs.filter(el => el.classList.contains('is-chosing')).map(el => +el.dataset.index);\r\n if(indexes.length) {\r\n \r\n } */\r\n if(this.chosingIndexes.length) {\r\n this.sendVotes(this.chosingIndexes).then(() => {\r\n this.chosingIndexes.length = 0;\r\n this.answerDivs.forEach(el => {\r\n el.classList.remove('is-chosing');\r\n });\r\n });\r\n }\r\n });\r\n\r\n footerDiv.append(this.sendVoteBtn);\r\n }\r\n\r\n // const width = this.getBoundingClientRect().width;\r\n // const width = mediaSizes.active.poll.width;\r\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\r\n\r\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\r\n if(!canVote || this.isPublic) {\r\n this.performResults(results, poll.chosenIndexes, false);\r\n }\r\n\r\n if(canVote) {\r\n this.setVotersCount(results);\r\n attachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n\r\n initQuizHint(results: PollResults) {\r\n if(results.solution && results.solution_entities) {\r\n const toggleHint = document.createElement('div');\r\n toggleHint.classList.add('tgico-tip', 'poll-hint');\r\n this.descDiv.append(toggleHint);\r\n\r\n //let active = false;\r\n attachClickEvent(toggleHint, (e) => {\r\n cancelEvent(e);\r\n\r\n //active = true;\r\n toggleHint.classList.add('active');\r\n setQuizHint(results.solution, results.solution_entities, () => {\r\n //active = false;\r\n toggleHint.classList.remove('active');\r\n });\r\n });\r\n\r\n if(this.sentVote) {\r\n const correctResult = results.results.find(r => r.pFlags.correct);\r\n if(correctResult && !correctResult.pFlags.chosen) {\r\n toggleHint.click();\r\n }\r\n }\r\n }\r\n }\r\n\r\n clickHandler(e: Event) {\r\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n \r\n cancelEvent(e);\r\n const answerIndex = +target.dataset.index;\r\n if(this.isMultiple) {\r\n target.classList.toggle('is-chosing');\r\n\r\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\r\n if(foundIndex !== -1) {\r\n this.chosingIndexes.splice(foundIndex, 1);\r\n } else {\r\n this.chosingIndexes.push(answerIndex);\r\n }\r\n } else {\r\n this.sendVotes([answerIndex]);\r\n }\r\n \r\n /* target.classList.add('is-voting');\r\n setTimeout(() => { // simulate\r\n this.setResults([100, 0], answerIndex);\r\n target.classList.remove('is-voting');\r\n }, 1000); */\r\n }\r\n\r\n sendVotes(indexes: number[]) {\r\n if(this.sendVotePromise) return this.sendVotePromise;\r\n\r\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\r\n targets.forEach(target => {\r\n target.classList.add('is-voting');\r\n });\r\n \r\n this.classList.add('disable-hover');\r\n this.sentVote = true;\r\n return this.sendVotePromise = appPollsManager.sendVote(this.message, indexes).then(() => {\r\n targets.forEach(target => {\r\n target.classList.remove('is-voting');\r\n });\r\n\r\n this.classList.remove('disable-hover');\r\n }).catch(() => {\r\n this.sentVote = false;\r\n }).finally(() => {\r\n this.sendVotePromise = null;\r\n });\r\n }\r\n\r\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\r\n });\r\n\r\n if(this.initQuizHint) {\r\n this.initQuizHint(results);\r\n this.initQuizHint = null;\r\n }\r\n\r\n if(this.quizInterval) {\r\n clearInterval(this.quizInterval);\r\n this.quizInterval = 0;\r\n }\r\n\r\n if(this.quizTimer?.parentElement) {\r\n this.quizTimer.remove();\r\n }\r\n\r\n const timeEl = this.descDiv.querySelector('.poll-time');\r\n if(timeEl) {\r\n timeEl.remove();\r\n }\r\n }\r\n\r\n if(this.isClosed) {\r\n this.classList.add('is-closed');\r\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\r\n }\r\n\r\n // set chosen\r\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\r\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\r\n this.chosenIndexes = chosenIndexes.slice();\r\n\r\n if(this.isRetracted) {\r\n attachClickEvent(this, this.clickHandler);\r\n } else {\r\n detachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n \r\n // is need update\r\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\r\n const percents = results.results.map(v => results.total_voters ? v.voters / results.total_voters * 100 : 0);\r\n\r\n this.classList.toggle('no-transition', !animate);\r\n if(animate) {\r\n SetTransition(this, '', !this.isRetracted, 340);\r\n }\r\n\r\n fastRaf(() => {\r\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\r\n this.percents = percents;\r\n this.isRetracted = false;\r\n });\r\n }\r\n \r\n this.setVotersCount(results);\r\n\r\n if(this.isPublic) {\r\n if(!this.isMultiple) {\r\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\r\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\r\n }\r\n\r\n let html = '';\r\n /**\r\n * MACOS, ANDROID - без реверса\r\n * WINDOWS DESKTOP - реверс\r\n * все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!\r\n */\r\n results.recent_voters/* .slice().reverse() */.forEach((userId, idx) => {\r\n const style = idx === 0 ? '' : `style=\"transform: translateX(-${idx * 3}px);\"`;\r\n html += ``;\r\n });\r\n this.avatarsDiv.innerHTML = html;\r\n }\r\n\r\n if(this.isMultiple) {\r\n const isVoted = !!this.chosenIndexes.length;\r\n\r\n const hideSendVoteBtn = this.isClosed || isVoted;\r\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\r\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\r\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\r\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\r\n }\r\n }\r\n\r\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\r\n this.svgLines.forEach(svg => svg.style.display = '');\r\n\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\r\n });\r\n\r\n const maxValue = Math.max(...percents);\r\n // this.maxLengths = percents.map(p => p / maxValue * this.maxLength);\r\n this.maxPercents = percents.map(p => p / maxValue);\r\n\r\n // line\r\n if(this.isRetracted) {\r\n this.svgLines.forEach((svg, idx) => {\r\n this.setLineProgress(idx, -1);\r\n });\r\n } else {\r\n const cb = () => {\r\n this.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n this.setLineProgress(idx, 1);\r\n });\r\n };\r\n \r\n animate ? fastRaf(cb) : cb();\r\n }\r\n\r\n percents = percents.slice();\r\n roundPercents(percents);\r\n let getPercentValue: (percents: number, index: number) => number;\r\n const iterate = (i: number) => {\r\n percents.forEach((percents, idx) => {\r\n const value = getPercentValue(percents, i);\r\n this.numberDivs[idx].innerText = value + '%';\r\n });\r\n };\r\n // numbers\r\n if(this.isRetracted) {\r\n getPercentValue = (percents, index) => Math.round(percents / times * index);\r\n\r\n if(animate) {\r\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * k);\r\n }\r\n } else {\r\n iterate(0);\r\n }\r\n } else {\r\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\r\n\r\n if(animate) {\r\n for(let i = 0; i < times; ++i) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * i);\r\n }\r\n } else {\r\n iterate(times - 1);\r\n }\r\n }\r\n\r\n if(this.isRetracted) {\r\n if(animate) {\r\n this.classList.add('is-retracting');\r\n }\r\n\r\n this.classList.remove('is-voted');\r\n const cb = () => {\r\n this.svgLines.forEach(svg => svg.style.display = 'none');\r\n };\r\n\r\n if(animate) {\r\n setTimeout(() => {\r\n this.classList.remove('is-retracting');\r\n cb();\r\n }, fullTime);\r\n } else {\r\n cb();\r\n }\r\n } else {\r\n this.classList.add('is-voted');\r\n }\r\n }\r\n\r\n setVotersCount(results: PollResults) {\r\n const votersCount = results.total_voters || 0;\r\n let key: LangPackKey, args = [votersCount];\r\n if(this.isClosed) {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\r\n } else {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\r\n }\r\n \r\n replaceContent(this.votersCountDiv, i18n(key, args));\r\n }\r\n\r\n setLineProgress(index: number, multiplier: number) {\r\n const svg = this.svgLines[index];\r\n\r\n if(multiplier === -1) {\r\n svg.style.strokeDasharray = '';\r\n svg.style.strokeDashoffset = '';\r\n } else {\r\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\r\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\r\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\r\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\r\n }\r\n }\r\n\r\n // у элемента могут быть ещё другие методы и свойства\r\n}\r\n\r\ncustomElements.define(\"poll-element\", PollElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered } from '../../layer';\nimport { Modify } from '../../types';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport appDocsManager, { MyDocument } from './appDocsManager';\nimport AppStorage from '../storage';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { forEachReverse } from '../../helpers/array';\nimport DATABASE_STATE from '../../config/databases/state';\nimport { readBlobAsText } from '../../helpers/blob';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport { getEmojiToneIndex } from '../../vendor/emoji';\nimport RichTextProcessor from '../richtextprocessor';\n\nconst CACHE_TIME = 3600e3;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport class AppStickersManager {\n private storage = new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise} = {};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise} = {};\n\n private greetingStickers: Document.document[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n \n constructor() {\n this.getAnimatedEmojiStickerSet();\n\n rootScope.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n this.saveStickerSet(update.stickerset, update.stickerset.set.id);\n rootScope.dispatchEvent('stickers_installed', update.stickerset.set);\n }\n });\n\n this.getGreetingStickersTimeout = window.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then(docs => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n \n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n appDocsManager.downloadDoc(this.greetingStickers[0]); // preload next sticker\n\n return doc;\n });\n }\n\n public saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n public async getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise {\n const id = set.id;\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n return this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n const cachedSet = await this.storage.get(id);\n if(cachedSet && cachedSet.documents?.length && ((Date.now() - cachedSet.refreshTime) < CACHE_TIME || params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n delete this.getStickerSetPromises[id];\n return;\n }\n }\n\n try {\n const stickerSet = await apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n \n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n \n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n \n delete this.getStickerSetPromises[id];\n });\n }\n\n public getAnimatedEmojiStickerSet() {\n return this.getStickerSet({id: 'emoji'}, {saveById: true});\n }\n\n public async getRecentStickers(): Promise> {\n const res = await apiManager.invokeApiHashable('messages.getRecentStickers') as MessagesRecentStickers.messagesRecentStickers;\n\n this.saveStickers(res.stickers);\n\n return res;\n }\n\n public getAnimatedEmojiSticker(emoji: string) {\n const stickerSet = this.storage.getFromCache('emoji');\n if(!stickerSet || !stickerSet.documents) return undefined;\n\n emoji = emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n const pack = stickerSet.packs.find(p => p.emoticon === emoji);\n return pack ? appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n const doc = this.getAnimatedEmojiSticker(emoji);\n if(doc) {\n return appDocsManager.downloadDoc(doc)\n .then(readBlobAsText)\n .then(async(json) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: json,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false\n }, 'none', toneIndex);\n\n animation.addEventListener('firstFrame', () => {\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\n animation.remove();\n }, {once: true});\n });\n }\n });\n }\n \n public saveStickerSet(res: Omit, id: DocId) {\n //console.log('stickers save set', res);w\n\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[]\n };\n \n let stickerSet = this.storage.getFromCache(id);\n if(stickerSet) {\n Object.assign(stickerSet, newSet);\n } else {\n stickerSet = this.storage.setToCache(id, newSet);\n }\n\n this.saveStickers(res.documents);\n \n //console.log('stickers wrote', this.stickerSets);\n const needSave = stickerSet.set.installed_date || id === 'emoji';\n stickerSet.refreshTime = Date.now();\n this.storage.set({[id]: stickerSet}, !needSave);\n }\n\n public getStickerSetThumbDownloadOptions(stickerSet: StickerSet.stickerSet) {\n const thumb = stickerSet.thumbs.find(thumb => thumb._ === 'photoSize') as PhotoSize.photoSize;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: InputFileLocation.inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n thumb_version: stickerSet.thumb_version\n };\n\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\n }\n\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\n const thumb = stickerSet.thumb;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n volume_id: thumb.location.volume_id,\n local_id: thumb.location.local_id\n };\n\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\n return url;\n\n //return promise;\n } */\n\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\n if(set.id === 'emoji') {\n return {\n _: 'inputStickerSetAnimatedEmoji'\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await apiManager.invokeApiHashable('messages.getFeaturedStickers') as MessagesFeaturedStickers.messagesFeaturedStickers;\n \n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res.sets;\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n if(set.installed_date) {\n const res = await apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await apiManager.invokeApiHashable('messages.searchStickerSets', {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n }) as MessagesFoundStickerSets.messagesFoundStickerSets;\n\n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(let id in cache) {\n const {set} = cache[id];\n\n if(set.title.toLowerCase().includes(query.toLowerCase()) && !res.sets.find(c => c.set.id === set.id)) {\n foundSaved.push({_: 'stickerSetCovered', set, cover: null});\n }\n }\n\n return res.sets.concat(foundSaved);\n }\n\n public getAllStickers() {\n return apiManager.invokeApiHashable('messages.getAllStickers');\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then(allStickers => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map(set => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = RichTextProcessor.fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n apiManager.invokeApiHashable('messages.getStickers', {\n emoticon\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map(sticker => appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n //console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = RichTextProcessor.fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = RichTextProcessor.parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter(doc => !doc.animated) */;\n\n return stickers;\n });\n }\n\n public pushRecentSticker(doc: MyDocument) {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then(stickers => {\n const _doc = stickers.findAndSplice(_doc => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n}\n\nconst appStickersManager = new AppStickersManager();\nMOUNT_CLASS_TO.appStickersManager = appStickersManager;\nexport default appStickersManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from './chat/chat';\r\nimport { getEmojiToneIndex } from '../vendor/emoji';\r\nimport { readBlobAsText } from '../helpers/blob';\r\nimport { deferredPromise } from '../helpers/cancellablePromise';\r\nimport { formatFullSentTime } from '../helpers/date';\r\nimport mediaSizes, { ScreenSize } from '../helpers/mediaSizes';\r\nimport { formatBytes } from '../helpers/number';\r\nimport { IS_SAFARI } from '../environment/userAgent';\r\nimport { Message, PhotoSize, StickerSet } from '../layer';\r\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\r\nimport appMessagesManager from '../lib/appManagers/appMessagesManager';\r\nimport appPhotosManager, { MyPhoto } from '../lib/appManagers/appPhotosManager';\r\nimport LottieLoader from '../lib/rlottie/lottieLoader';\r\nimport webpWorkerController from '../lib/webp/webpWorkerController';\r\nimport animationIntersector from './animationIntersector';\r\nimport appMediaPlaybackController, { MediaSearchContext } from './appMediaPlaybackController';\r\nimport AudioElement, { findMediaTargets } from './audio';\r\nimport ReplyContainer from './chat/replyContainer';\r\nimport { Layouter, RectPart } from './groupedLayout';\r\nimport LazyLoadQueue from './lazyLoadQueue';\r\nimport PollElement from './poll';\r\nimport ProgressivePreloader from './preloader';\r\nimport './middleEllipsis';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport appImManager from '../lib/appManagers/appImManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { onMediaLoad } from '../helpers/files';\r\nimport { animateSingle } from '../helpers/animation';\r\nimport renderImageFromUrl from '../helpers/dom/renderImageFromUrl';\r\nimport sequentialDom from '../helpers/sequentialDom';\r\nimport { fastRaf } from '../helpers/schedulers';\r\nimport appDownloadManager, { DownloadBlob, ThumbCache } from '../lib/appManagers/appDownloadManager';\r\nimport appStickersManager from '../lib/appManagers/appStickersManager';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent, simulateClickEvent } from '../helpers/dom/clickEvent';\r\nimport isInDOM from '../helpers/dom/isInDOM';\r\nimport lottieLoader from '../lib/rlottie/lottieLoader';\r\nimport { clearBadCharsAndTrim } from '../helpers/cleanSearchText';\r\nimport blur from '../helpers/blur';\r\nimport IS_WEBP_SUPPORTED from '../environment/webpSupport';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\r\nimport { MiddleEllipsisElement } from './middleEllipsis';\r\nimport { joinElementsWith } from '../lib/langPack';\r\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\r\nimport { NULL_PEER_ID } from '../lib/mtproto/mtproto_config';\r\n\r\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\r\n\r\nlet roundVideoCircumference = 0;\r\nmediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\r\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\r\n const width = mediaSizes.active.round.width;\r\n const halfSize = width / 2;\r\n const radius = halfSize - 7;\r\n roundVideoCircumference = 2 * Math.PI * radius;\r\n elements.forEach(element => {\r\n element.setAttributeNS(null, 'width', '' + width);\r\n element.setAttributeNS(null, 'height', '' + width);\r\n\r\n const circle = element.firstElementChild as SVGCircleElement;\r\n circle.setAttributeNS(null, 'cx', '' + halfSize);\r\n circle.setAttributeNS(null, 'cy', '' + halfSize);\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n\r\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\r\n });\r\n }\r\n});\r\n\r\nexport function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, withoutPreloader, loadPromises, noPlayButton, noAutoDownload, size, searchContext}: {\r\n doc: MyDocument, \r\n container?: HTMLElement, \r\n message?: Message.message, \r\n boxWidth?: number, \r\n boxHeight?: number, \r\n withTail?: boolean, \r\n isOut?: boolean,\r\n middleware?: () => boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n noInfo?: true,\r\n noPlayButton?: boolean,\r\n group?: string,\r\n onlyPreview?: boolean,\r\n withoutPreloader?: boolean,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n size?: PhotoSize,\r\n searchContext?: MediaSearchContext,\r\n}) {\r\n const isAlbumItem = !(boxWidth && boxHeight);\r\n const canAutoplay = (doc.type !== 'video' || (doc.size <= MAX_VIDEO_AUTOPLAY_SIZE && !isAlbumItem)) \r\n && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos);\r\n let spanTime: HTMLElement, spanPlay: HTMLElement;\r\n\r\n if(!noInfo) {\r\n spanTime = document.createElement('span');\r\n spanTime.classList.add('video-time');\r\n container.append(spanTime);\r\n \r\n let needPlayButton = false;\r\n if(doc.type !== 'gif') {\r\n spanTime.innerText = (doc.duration + '').toHHMMSS(false);\r\n\r\n if(!noPlayButton && doc.type !== 'round') {\r\n if(canAutoplay && !noAutoDownload) {\r\n spanTime.classList.add('tgico', 'can-autoplay');\r\n } else {\r\n needPlayButton = true;\r\n }\r\n }\r\n } else {\r\n spanTime.innerText = 'GIF';\r\n\r\n if(!canAutoplay && !noPlayButton) {\r\n needPlayButton = true;\r\n noAutoDownload = undefined;\r\n }\r\n }\r\n\r\n if(needPlayButton) {\r\n spanPlay = document.createElement('span');\r\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\r\n container.append(spanPlay);\r\n }\r\n }\r\n\r\n let res: {\r\n thumb?: typeof photoRes,\r\n loadPromise: Promise\r\n } = {} as any;\r\n\r\n if(doc.mime_type === 'image/gif') {\r\n const photoRes = wrapPhoto({\r\n photo: doc, \r\n message, \r\n container, \r\n boxWidth, \r\n boxHeight, \r\n withTail, \r\n isOut, \r\n lazyLoadQueue, \r\n middleware,\r\n withoutPreloader,\r\n loadPromises,\r\n noAutoDownload,\r\n size\r\n });\r\n\r\n res.thumb = photoRes;\r\n res.loadPromise = photoRes.loadPromises.full;\r\n return res;\r\n }\r\n\r\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\r\n if(video.parentElement) {\r\n video.remove();\r\n } */\r\n\r\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\r\n\r\n const video = document.createElement('video');\r\n video.classList.add('media-video');\r\n video.setAttribute('playsinline', 'true');\r\n video.muted = true;\r\n if(doc.type === 'round') {\r\n const divRound = document.createElement('div');\r\n divRound.classList.add('media-round', 'z-depth-1');\r\n divRound.dataset.mid = '' + message.mid;\r\n divRound.dataset.peerId = '' + message.peerId;\r\n (divRound as any).message = message;\r\n\r\n const size = mediaSizes.active.round;\r\n const halfSize = size.width / 2;\r\n const strokeWidth = 3.5;\r\n const radius = halfSize - (strokeWidth * 2);\r\n divRound.innerHTML = `\r\n \r\n `;\r\n\r\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\r\n if(!roundVideoCircumference) {\r\n roundVideoCircumference = 2 * Math.PI * radius;\r\n }\r\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\r\n \r\n spanTime.classList.add('tgico');\r\n\r\n const isUnread = message.pFlags.media_unread;\r\n if(isUnread) {\r\n divRound.classList.add('is-unread');\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\r\n\r\n divRound.prepend(canvas, spanTime);\r\n divRound.append(video);\r\n container.append(divRound);\r\n\r\n const ctx = canvas.getContext('2d');\r\n /* ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\r\n ctx.clip(); */\r\n\r\n const onLoad = () => {\r\n const message: Message.message = (divRound as any).message;\r\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\r\n const clear = () => {\r\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\r\n if(isInDOM(globalVideo)) {\r\n return;\r\n }\r\n \r\n globalVideo.removeEventListener('play', onPlay);\r\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\r\n globalVideo.removeEventListener('pause', onPaused);\r\n globalVideo.removeEventListener('ended', onEnded);\r\n });\r\n };\r\n \r\n const onFrame = () => {\r\n ctx.drawImage(globalVideo, 0, 0);\r\n \r\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + offset;\r\n \r\n return !globalVideo.paused;\r\n };\r\n\r\n const onTimeUpdate = () => {\r\n if(!globalVideo.duration) {\r\n return;\r\n }\r\n \r\n if(!isInDOM(globalVideo)) {\r\n clear();\r\n return;\r\n }\r\n\r\n if(globalVideo.paused) {\r\n onFrame();\r\n }\r\n \r\n spanTime.innerText = (globalVideo.duration - globalVideo.currentTime + '').toHHMMSS(false);\r\n };\r\n\r\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\r\n \r\n const onPlay = () => {\r\n video.classList.add('hide');\r\n divRound.classList.remove('is-paused');\r\n animateSingle(onFrame, canvas);\r\n \r\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\r\n preloader.onClick();\r\n }\r\n };\r\n \r\n const onPaused = () => {\r\n if(!isInDOM(globalVideo)) {\r\n clear();\r\n return;\r\n }\r\n \r\n divRound.classList.add('is-paused');\r\n };\r\n \r\n const onEnded = () => {\r\n video.classList.remove('hide');\r\n divRound.classList.add('is-paused');\r\n \r\n video.currentTime = 0;\r\n spanTime.innerText = ('' + globalVideo.duration).toHHMMSS(false);\r\n \r\n if(globalVideo.currentTime) {\r\n globalVideo.currentTime = 0;\r\n }\r\n };\r\n \r\n globalVideo.addEventListener('play', onPlay);\r\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\r\n globalVideo.addEventListener('pause', onPaused);\r\n globalVideo.addEventListener('ended', onEnded);\r\n \r\n attachClickEvent(canvas, (e) => {\r\n cancelEvent(e);\r\n \r\n // ! костыль\r\n if(preloader && !preloader.detached) {\r\n preloader.onClick();\r\n }\r\n \r\n // ! can't use it here. on Safari iOS video won't start.\r\n /* if(globalVideo.readyState < 2) {\r\n return;\r\n } */\r\n \r\n if(globalVideo.paused) {\r\n const hadSearchContext = !!searchContext;\r\n if(appMediaPlaybackController.setSearchContext(searchContext || {\r\n peerId: NULL_PEER_ID, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n useSearch: false\r\n })) {\r\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound/* , searchContext.useSearch */);\r\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\r\n }\r\n \r\n globalVideo.play();\r\n } else {\r\n globalVideo.pause();\r\n }\r\n });\r\n \r\n if(globalVideo.paused) {\r\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\r\n onFrame();\r\n onTimeUpdate();\r\n video.classList.add('hide');\r\n } else {\r\n onPaused();\r\n }\r\n } else {\r\n onPlay();\r\n }\r\n };\r\n\r\n if(message.pFlags.is_outgoing) {\r\n (divRound as any).onLoad = onLoad;\r\n divRound.dataset.isOutgoing = '1';\r\n } else {\r\n onLoad();\r\n }\r\n } else {\r\n video.autoplay = true; // для safari\r\n }\r\n\r\n let photoRes: ReturnType;\r\n if(message) {\r\n photoRes = wrapPhoto({\r\n photo: doc, \r\n message, \r\n container, \r\n boxWidth, \r\n boxHeight, \r\n withTail, \r\n isOut, \r\n lazyLoadQueue, \r\n middleware,\r\n withoutPreloader: true,\r\n loadPromises,\r\n noAutoDownload,\r\n size\r\n });\r\n\r\n res.thumb = photoRes;\r\n\r\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\r\n res.loadPromise = photoRes.loadPromises.full;\r\n return res;\r\n }\r\n\r\n if(withTail) {\r\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\r\n video.width = +foreignObject.getAttributeNS(null, 'width');\r\n video.height = +foreignObject.getAttributeNS(null, 'height');\r\n foreignObject.append(video);\r\n }\r\n } else { // * gifs masonry\r\n const gotThumb = appDocsManager.getThumb(doc, false);\r\n if(gotThumb) {\r\n gotThumb.promise.then(() => {\r\n video.poster = gotThumb.cacheContext.url;\r\n });\r\n }\r\n }\r\n\r\n if(!video.parentElement && container) {\r\n (photoRes?.aspecter || container).append(video);\r\n }\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n\r\n const isUpload = !!(message?.media as any)?.preloader;\r\n if(isUpload) { // means upload\r\n preloader = (message.media as any).preloader as ProgressivePreloader;\r\n preloader.attach(container, false);\r\n noAutoDownload = undefined;\r\n } else if(!cacheContext.downloaded && !doc.supportsStreaming) {\r\n preloader = new ProgressivePreloader({\r\n attachMethod: 'prepend'\r\n });\r\n } else if(doc.supportsStreaming) {\r\n preloader = new ProgressivePreloader({\r\n cancelable: false,\r\n attachMethod: 'prepend'\r\n });\r\n }\r\n\r\n const renderDeferred = deferredPromise();\r\n video.addEventListener('error', (e) => {\r\n if(video.error.code !== 4) {\r\n console.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\r\n }\r\n \r\n if(preloader && !isUpload) {\r\n preloader.detach();\r\n }\r\n\r\n if(!renderDeferred.isFulfilled) {\r\n renderDeferred.resolve();\r\n }\r\n }, {once: true});\r\n\r\n onMediaLoad(video).then(() => {\r\n if(group) {\r\n animationIntersector.addAnimation(video, group);\r\n }\r\n\r\n if(preloader && !isUpload) {\r\n preloader.detach();\r\n }\r\n\r\n renderDeferred.resolve();\r\n });\r\n\r\n if(doc.type === 'video') {\r\n video.addEventListener('timeupdate', () => {\r\n spanTime.innerText = (video.duration - video.currentTime + '').toHHMMSS(false);\r\n });\r\n }\r\n\r\n video.muted = true;\r\n video.loop = true;\r\n //video.play();\r\n video.autoplay = true;\r\n\r\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\r\n const load = () => {\r\n if(preloader && noAutoDownload && !withoutPreloader) {\r\n preloader.construct();\r\n preloader.setManual();\r\n }\r\n\r\n let loadPromise: Promise = Promise.resolve();\r\n if(preloader && !isUpload) {\r\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\r\n const promise = loadPromise = appDocsManager.downloadDoc(doc, lazyLoadQueue?.queueId, noAutoDownload);\r\n preloader.attach(container, false, promise);\r\n } else if(doc.supportsStreaming) {\r\n if(noAutoDownload) {\r\n loadPromise = Promise.reject();\r\n } else if(!cacheContext.downloaded) { // * check for uploading video\r\n preloader.attach(container, false, null);\r\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\r\n preloader.detach();\r\n }, {once: true});\r\n }\r\n }\r\n }\r\n\r\n if(!noAutoDownload && loadPhotoThumbFunc) {\r\n loadPhotoThumbFunc();\r\n loadPhotoThumbFunc = null;\r\n }\r\n\r\n noAutoDownload = undefined;\r\n\r\n loadPromise.then(() => {\r\n if(middleware && !middleware()) {\r\n renderDeferred.resolve();\r\n return;\r\n }\r\n\r\n if(doc.type === 'round') {\r\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\r\n }\r\n\r\n renderImageFromUrl(video, cacheContext.url);\r\n }, () => {});\r\n\r\n return {download: loadPromise, render: renderDeferred};\r\n };\r\n\r\n if(preloader && !isUpload) {\r\n preloader.setDownloadFunction(load);\r\n }\r\n\r\n /* if(doc.size >= 20e6 && !doc.downloaded) {\r\n let downloadDiv = document.createElement('div');\r\n downloadDiv.classList.add('download');\r\n\r\n let span = document.createElement('span');\r\n span.classList.add('btn-circle', 'tgico-download');\r\n downloadDiv.append(span);\r\n\r\n downloadDiv.addEventListener('click', () => {\r\n downloadDiv.remove();\r\n loadVideo();\r\n });\r\n\r\n container.prepend(downloadDiv);\r\n\r\n return;\r\n } */\r\n\r\n if(doc.type === 'gif' && !canAutoplay) {\r\n attachClickEvent(container, (e) => {\r\n cancelEvent(e);\r\n spanPlay.remove();\r\n load();\r\n }, {capture: true, once: true});\r\n } else {\r\n res.loadPromise = !lazyLoadQueue ? load().render : (lazyLoadQueue.push({div: container, load: () => load().render}), Promise.resolve());\r\n }\r\n\r\n return res;\r\n}\r\n\r\nrootScope.addEventListener('download_start', (docId) => {\r\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n if(element.querySelector('.preloader-container.manual')) {\r\n simulateClickEvent(element);\r\n }\r\n });\r\n});\r\n\r\nexport function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, noAutoDownload, lazyLoadQueue}: {\r\n message: any, \r\n withTime?: boolean,\r\n fontWeight?: number,\r\n voiceAsMusic?: boolean,\r\n showSender?: boolean,\r\n searchContext?: MediaSearchContext,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n lazyLoadQueue?: LazyLoadQueue\r\n}): HTMLElement {\r\n if(!fontWeight) fontWeight = 500;\r\n\r\n const doc = (message.media.document || message.media.webpage.document) as MyDocument;\r\n const uploading = message.pFlags.is_outgoing && message.media?.preloader;\r\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\r\n const audioElement = new AudioElement();\r\n audioElement.withTime = withTime;\r\n audioElement.message = message;\r\n audioElement.noAutoDownload = noAutoDownload;\r\n audioElement.lazyLoadQueue = lazyLoadQueue;\r\n audioElement.loadPromises = loadPromises;\r\n \r\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\r\n if(searchContext) audioElement.searchContext = searchContext;\r\n if(showSender) audioElement.showSender = showSender;\r\n if(uploading) audioElement.preloader = message.media.preloader;\r\n\r\n audioElement.dataset.fontWeight = '' + fontWeight;\r\n audioElement.render();\r\n return audioElement;\r\n }\r\n\r\n let extSplitted = doc.file_name ? doc.file_name.split('.') : '';\r\n let ext = '';\r\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ? \r\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) : \r\n 'file';\r\n\r\n let docDiv = document.createElement('div');\r\n docDiv.classList.add('document', `ext-${ext}`);\r\n docDiv.dataset.docId = '' + doc.id;\r\n\r\n const icoDiv = document.createElement('div');\r\n icoDiv.classList.add('document-ico');\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\r\n docDiv.classList.add('document-with-thumb');\r\n\r\n let imgs: HTMLImageElement[] = [];\r\n if(message.pFlags.is_outgoing) {\r\n icoDiv.innerHTML = ``;\r\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\r\n } else {\r\n const wrapped = wrapPhoto({\r\n photo: doc, \r\n message: null, \r\n container: icoDiv, \r\n boxWidth: 54, \r\n boxHeight: 54,\r\n loadPromises,\r\n withoutPreloader: true,\r\n lazyLoadQueue,\r\n size: appPhotosManager.choosePhotoSize(doc, 54, 54, true)\r\n });\r\n icoDiv.style.width = icoDiv.style.height = '';\r\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\r\n if(wrapped.images.full) imgs.push(wrapped.images.full);\r\n }\r\n\r\n imgs.forEach(img => img.classList.add('document-thumb'));\r\n } else {\r\n icoDiv.innerText = ext;\r\n }\r\n\r\n //let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\r\n let fileName = doc.fileName || 'Unknown.file';\r\n const descriptionEl = document.createElement('div');\r\n descriptionEl.classList.add('document-description');\r\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [formatBytes(doc.size)];\r\n \r\n if(withTime) {\r\n descriptionParts.push(formatFullSentTime(message.date));\r\n }\r\n\r\n if(showSender) {\r\n descriptionParts.push(appMessagesManager.wrapSenderToPeer(message));\r\n }\r\n\r\n docDiv.innerHTML = `\r\n ${cacheContext.downloaded && !uploading ? '' : `
`}\r\n
\r\n
\r\n `;\r\n\r\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\r\n const middleEllipsisEl = new MiddleEllipsisElement();\r\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\r\n middleEllipsisEl.innerHTML = fileName;\r\n\r\n nameDiv.append(middleEllipsisEl);\r\n\r\n if(showSender) {\r\n nameDiv.append(appMessagesManager.wrapSentTime(message));\r\n }\r\n\r\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\r\n sizeDiv.append(...joinElementsWith(descriptionParts, ' · '));\r\n\r\n docDiv.prepend(icoDiv);\r\n\r\n if(!uploading && message.pFlags.is_outgoing) {\r\n return docDiv;\r\n }\r\n\r\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\r\n const onLoad = () => {\r\n if(downloadDiv) {\r\n downloadDiv.classList.add('downloaded');\r\n const _downloadDiv = downloadDiv;\r\n setTimeout(() => {\r\n _downloadDiv.remove();\r\n }, 200);\r\n downloadDiv = null;\r\n }\r\n\r\n if(preloader) {\r\n preloader = null;\r\n }\r\n };\r\n\r\n const load = (e: Event) => {\r\n const save = !e || e.isTrusted;\r\n const doc = appDocsManager.getDoc(docDiv.dataset.docId);\r\n let download: DownloadBlob;\r\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\r\n if(!save) {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n } else if(doc.type === 'pdf') {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n download.then(() => {\r\n setTimeout(() => { // wait for preloader animation end\r\n const url = appDownloadManager.getCacheContext(doc).url;\r\n window.open(url);\r\n }, rootScope.settings.animationsEnabled ? 250 : 0);\r\n });\r\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n } else {\r\n download = appDocsManager.saveDocFile(doc, queueId);\r\n }\r\n\r\n if(downloadDiv) {\r\n download.then(onLoad);\r\n preloader.attach(downloadDiv, true, download);\r\n }\r\n\r\n return {download};\r\n };\r\n\r\n if(appDocsManager.downloading.has(doc.id)) {\r\n downloadDiv = docDiv.querySelector('.document-download');\r\n preloader = new ProgressivePreloader();\r\n preloader.attach(downloadDiv, false, appDocsManager.downloading.get(doc.id));\r\n } else if(!cacheContext.downloaded || uploading) {\r\n downloadDiv = docDiv.querySelector('.document-download');\r\n preloader = message.media.preloader as ProgressivePreloader;\r\n\r\n if(!preloader) {\r\n preloader = new ProgressivePreloader();\r\n\r\n preloader.construct();\r\n preloader.setManual();\r\n preloader.attach(downloadDiv);\r\n preloader.setDownloadFunction(load);\r\n } else {\r\n preloader.attach(downloadDiv);\r\n message.media.promise.then(onLoad);\r\n }\r\n }\r\n\r\n attachClickEvent(docDiv, (e) => {\r\n if(preloader) {\r\n preloader.onClick(e);\r\n } else {\r\n load(e);\r\n }\r\n });\r\n \r\n return docDiv;\r\n}\r\n\r\n/* function wrapMediaWithTail(photo: MyPhoto | MyDocument, message: {mid: number, message: string}, container: HTMLElement, boxWidth: number, boxHeight: number, isOut: boolean) {\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n svg.classList.add('bubble__media-container', isOut ? 'is-out' : 'is-in');\r\n \r\n const foreignObject = document.createElementNS(\"http://www.w3.org/2000/svg\", 'foreignObject');\r\n\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, true);\r\n if(gotThumb) {\r\n foreignObject.append(gotThumb.image);\r\n }\r\n appPhotosManager.setAttachmentSize(photo, foreignObject, boxWidth, boxHeight);\r\n \r\n const width = +foreignObject.getAttributeNS(null, 'width');\r\n const height = +foreignObject.getAttributeNS(null, 'height');\r\n\r\n svg.setAttributeNS(null, 'width', '' + width);\r\n svg.setAttributeNS(null, 'height', '' + height);\r\n\r\n svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);\r\n svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n\r\n const clipId = 'clip' + message.mid + '_' + nextRandomInt(9999);\r\n svg.dataset.clipId = clipId;\r\n \r\n const defs = document.createElementNS(\"http://www.w3.org/2000/svg\", 'defs');\r\n let clipPathHTML: string = '';\r\n \r\n if(message.message) {\r\n //clipPathHTML += ``;\r\n } else {\r\n if(isOut) {\r\n clipPathHTML += `\r\n \r\n \r\n `;\r\n } else {\r\n clipPathHTML += `\r\n \r\n \r\n `;\r\n }\r\n }\r\n\r\n defs.innerHTML = `${clipPathHTML}`;\r\n \r\n container.style.width = parseInt(container.style.width) - 9 + 'px';\r\n container.classList.add('with-tail');\r\n\r\n svg.append(defs, foreignObject);\r\n container.append(svg);\r\n\r\n let img = foreignObject.firstElementChild as HTMLImageElement;\r\n if(!img) {\r\n foreignObject.append(img = new Image());\r\n }\r\n\r\n return img;\r\n} */\r\n\r\nexport function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, noAutoDownload, noBlur, noThumb, noFadeIn, blurAfter}: {\r\n photo: MyPhoto | MyDocument, \r\n message?: any, \r\n container: HTMLElement, \r\n boxWidth?: number, \r\n boxHeight?: number, \r\n withTail?: boolean, \r\n isOut?: boolean, \r\n lazyLoadQueue?: LazyLoadQueue, \r\n middleware?: () => boolean, \r\n size?: PhotoSize,\r\n withoutPreloader?: boolean,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n noBlur?: boolean,\r\n noThumb?: boolean,\r\n noFadeIn?: boolean,\r\n blurAfter?: boolean,\r\n}) {\r\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs)) {\r\n if(boxWidth && boxHeight && !size && photo._ === 'document') {\r\n appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\r\n }\r\n\r\n return {\r\n loadPromises: {\r\n thumb: Promise.resolve(),\r\n full: Promise.resolve()\r\n },\r\n images: {\r\n thumb: null,\r\n full: null\r\n },\r\n preloader: null,\r\n aspecter: null\r\n };\r\n }\r\n\r\n if(!size) {\r\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\r\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\r\n }\r\n\r\n container.classList.add('media-container');\r\n let aspecter = container;\r\n\r\n let isFit = true;\r\n let loadThumbPromise: Promise = Promise.resolve();\r\n let thumbImage: HTMLImageElement;\r\n let image: HTMLImageElement;\r\n let cacheContext: ThumbCache;\r\n const isGif = photo._ === 'document' && photo.mime_type === 'image/gif' && !size;\r\n // if(withTail) {\r\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\r\n // } else {\r\n image = new Image();\r\n\r\n if(boxWidth && boxHeight && !size) { // !album\r\n const set = appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isGif ? {\r\n _: 'photoSize',\r\n w: photo.w,\r\n h: photo.h,\r\n size: photo.size,\r\n type: 'full'\r\n } : undefined);\r\n size = set.photoSize;\r\n isFit = set.isFit;\r\n cacheContext = appDownloadManager.getCacheContext(photo, size.type);\r\n\r\n if(!isFit) {\r\n aspecter = document.createElement('div');\r\n aspecter.classList.add('media-container-aspecter');\r\n aspecter.style.width = set.size.width + 'px';\r\n aspecter.style.height = set.size.height + 'px';\r\n\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\r\n if(gotThumb) {\r\n loadThumbPromise = gotThumb.loadPromise;\r\n const thumbImage = gotThumb.image; // local scope\r\n thumbImage.classList.add('media-photo');\r\n container.append(thumbImage);\r\n } else {\r\n const res = wrapPhoto({\r\n container,\r\n message,\r\n photo,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n size,\r\n lazyLoadQueue,\r\n isOut,\r\n loadPromises,\r\n middleware,\r\n withoutPreloader,\r\n withTail,\r\n noAutoDownload,\r\n noBlur,\r\n noThumb: true,\r\n blurAfter: true\r\n //noFadeIn: true\r\n });\r\n const thumbImage = res.images.full;\r\n thumbImage.classList.add('media-photo', 'thumbnail');\r\n //container.append(thumbImage);\r\n }\r\n\r\n container.classList.add('media-container-fitted');\r\n container.append(aspecter);\r\n }\r\n } else {\r\n if(!size) {\r\n size = appPhotosManager.choosePhotoSize(photo, boxWidth, boxHeight, true);\r\n }\r\n \r\n cacheContext = appDownloadManager.getCacheContext(photo, size?.type);\r\n }\r\n\r\n if(!noThumb) {\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\r\n if(gotThumb) {\r\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\r\n thumbImage = gotThumb.image;\r\n thumbImage.classList.add('media-photo');\r\n aspecter.append(thumbImage);\r\n }\r\n }\r\n // }\r\n\r\n image.classList.add('media-photo');\r\n \r\n //console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\r\n\r\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\r\n\r\n let preloader: ProgressivePreloader;\r\n if(message?.media?.preloader && !withoutPreloader) { // means upload\r\n preloader = message.media.preloader;\r\n preloader.attach(container);\r\n noAutoDownload = undefined;\r\n } else if(!cacheContext.downloaded) {\r\n preloader = new ProgressivePreloader({\r\n attachMethod: 'prepend'\r\n });\r\n }\r\n\r\n const getDownloadPromise = () => {\r\n const promise = isGif && !size ? \r\n appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) : \r\n appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\r\n\r\n return promise;\r\n };\r\n\r\n const renderOnLoad = (url: string) => {\r\n return renderImageWithFadeIn(container, image, url, needFadeIn, aspecter, thumbImage);\r\n };\r\n\r\n const onLoad = (): Promise => {\r\n if(middleware && !middleware()) return Promise.resolve();\r\n\r\n if(blurAfter) {\r\n return blur(cacheContext.url, 12).then(url => {\r\n return renderOnLoad(url);\r\n });\r\n }\r\n\r\n return renderOnLoad(cacheContext.url);\r\n };\r\n\r\n let loadPromise: Promise;\r\n const canAttachPreloader = (\r\n (size as PhotoSize.photoSize).w >= 150 && \r\n (size as PhotoSize.photoSize).h >= 150\r\n ) || noAutoDownload;\r\n const load = () => {\r\n if(noAutoDownload && !withoutPreloader && preloader) {\r\n preloader.construct();\r\n preloader.setManual();\r\n }\r\n\r\n const promise = getDownloadPromise();\r\n\r\n if(preloader && \r\n !cacheContext.downloaded && \r\n !withoutPreloader && \r\n canAttachPreloader\r\n ) {\r\n preloader.attach(container, false, promise);\r\n }\r\n\r\n noAutoDownload = undefined;\r\n\r\n const renderPromise = promise.then(onLoad);\r\n renderPromise.catch(() => {});\r\n return {download: promise, render: renderPromise};\r\n };\r\n\r\n if(preloader) {\r\n preloader.setDownloadFunction(load);\r\n }\r\n \r\n if(cacheContext.downloaded) {\r\n loadThumbPromise = loadPromise = load().render;\r\n } else {\r\n if(!lazyLoadQueue) loadPromise = load().render;\r\n /* else if(noAutoDownload) {\r\n preloader.construct();\r\n preloader.setManual();\r\n preloader.attach(container);\r\n } */ else lazyLoadQueue.push({div: container, load: () => load().download});\r\n }\r\n\r\n if(loadPromises && loadThumbPromise) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n\r\n return {\r\n loadPromises: {\r\n thumb: loadThumbPromise,\r\n full: loadPromise || Promise.resolve()\r\n },\r\n images: {\r\n thumb: thumbImage,\r\n full: image\r\n },\r\n preloader,\r\n aspecter\r\n };\r\n}\r\n\r\nexport function renderImageWithFadeIn(container: HTMLElement, \r\n image: HTMLImageElement, \r\n url: string, \r\n needFadeIn: boolean, \r\n aspecter = container,\r\n thumbImage?: HTMLImageElement\r\n) {\r\n if(needFadeIn) {\r\n image.classList.add('fade-in');\r\n }\r\n\r\n return new Promise((resolve) => {\r\n /* if(photo._ === 'document') {\r\n console.error('wrapPhoto: will render document', photo, size, cacheContext);\r\n return resolve();\r\n } */\r\n\r\n renderImageFromUrl(image, url, () => {\r\n sequentialDom.mutateElement(container, () => {\r\n aspecter.append(image);\r\n\r\n fastRaf(() => {\r\n resolve();\r\n });\r\n\r\n if(needFadeIn) {\r\n image.addEventListener('animationend', () => {\r\n sequentialDom.mutate(() => {\r\n image.classList.remove('fade-in');\r\n \r\n if(thumbImage) {\r\n thumbImage.remove();\r\n }\r\n });\r\n }, {once: true});\r\n }\r\n });\r\n });\r\n });\r\n}\r\n\r\n// export function renderImageWithFadeIn(container: HTMLElement, \r\n// image: HTMLImageElement, \r\n// url: string, \r\n// needFadeIn: boolean, \r\n// aspecter = container,\r\n// thumbImage?: HTMLImageElement\r\n// ) {\r\n// if(needFadeIn) {\r\n// // image.classList.add('fade-in-new', 'not-yet');\r\n// image.classList.add('fade-in');\r\n// }\r\n\r\n// return new Promise((resolve) => {\r\n// /* if(photo._ === 'document') {\r\n// console.error('wrapPhoto: will render document', photo, size, cacheContext);\r\n// return resolve();\r\n// } */\r\n\r\n// renderImageFromUrl(image, url, () => {\r\n// sequentialDom.mutateElement(container, () => {\r\n// aspecter.append(image);\r\n// // (needFadeIn ? getHeavyAnimationPromise() : Promise.resolve()).then(() => {\r\n\r\n// // fastRaf(() => {\r\n// resolve();\r\n// // });\r\n\r\n// if(needFadeIn) {\r\n// fastRaf(() => {\r\n// /* if(!image.isConnected) {\r\n// alert('aaaa');\r\n// } */\r\n// // fastRaf(() => {\r\n// image.classList.remove('not-yet');\r\n// // });\r\n// });\r\n\r\n// image.addEventListener('transitionend', () => {\r\n// sequentialDom.mutate(() => {\r\n// image.classList.remove('fade-in-new');\r\n \r\n// if(thumbImage) {\r\n// thumbImage.remove();\r\n// }\r\n// });\r\n// }, {once: true});\r\n// }\r\n// // });\r\n// });\r\n// });\r\n// });\r\n// }\r\n\r\nexport function wrapSticker({doc, div, middleware, lazyLoadQueue, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn}: {\r\n doc: MyDocument, \r\n div: HTMLElement, \r\n middleware?: () => boolean, \r\n lazyLoadQueue?: LazyLoadQueue, \r\n group?: string, \r\n play?: boolean, \r\n onlyThumb?: boolean,\r\n emoji?: string,\r\n width?: number,\r\n height?: number,\r\n withThumb?: boolean,\r\n loop?: boolean,\r\n loadPromises?: Promise[],\r\n needFadeIn?: boolean,\r\n}) {\r\n const stickerType = doc.sticker;\r\n\r\n if(!width) {\r\n width = !emoji ? 200 : undefined;\r\n }\r\n\r\n if(!height) {\r\n height = !emoji ? 200 : undefined;\r\n }\r\n\r\n if(stickerType === 2) {\r\n //LottieLoader.loadLottie();\r\n LottieLoader.loadLottieWorkers();\r\n }\r\n \r\n if(!stickerType) {\r\n console.error('wrong doc for wrapSticker!', doc);\r\n throw new Error('wrong doc for wrapSticker!');\r\n }\r\n\r\n div.dataset.docId = '' + doc.id;\r\n div.classList.add('media-sticker-wrapper');\r\n \r\n //console.log('wrap sticker', doc, div, onlyThumb);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n\r\n const toneIndex = emoji ? getEmojiToneIndex(emoji) : -1;\r\n const downloaded = cacheContext.downloaded && !needFadeIn;\r\n \r\n let loadThumbPromise = deferredPromise();\r\n let haveThumbCached = false;\r\n if((doc.thumbs?.length || doc.stickerCachedThumbs) && !div.firstElementChild && (!downloaded || stickerType === 2 || onlyThumb)/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */) {\r\n let thumb = doc.stickerCachedThumbs && doc.stickerCachedThumbs[toneIndex] || doc.thumbs[0];\r\n \r\n //console.log('wrap sticker', thumb, div);\r\n\r\n let thumbImage: HTMLImageElement;\r\n const afterRender = () => {\r\n if(!div.childElementCount) {\r\n thumbImage.classList.add('media-sticker', 'thumbnail');\r\n \r\n sequentialDom.mutateElement(div, () => {\r\n div.append(thumbImage);\r\n loadThumbPromise.resolve();\r\n });\r\n }\r\n };\r\n\r\n if('url' in thumb) {\r\n thumbImage = new Image();\r\n renderImageFromUrl(thumbImage, thumb.url, afterRender);\r\n haveThumbCached = true;\r\n } else if('bytes' in thumb) {\r\n if(thumb._ === 'photoPathSize') {\r\n if(thumb.bytes.length) {\r\n const d = appPhotosManager.getPathFromPhotoPathSize(thumb);\r\n div.innerHTML = `\r\n \r\n `;\r\n } else {\r\n thumb = doc.thumbs.find(t => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\r\n }\r\n } \r\n \r\n if(thumb && thumb._ !== 'photoPathSize' && toneIndex <= 0) {\r\n thumbImage = new Image();\r\n\r\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\r\n renderImageFromUrl(thumbImage, appPhotosManager.getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\r\n haveThumbCached = true;\r\n } else {\r\n webpWorkerController.convert('' + doc.id, (thumb as PhotoSize.photoStrippedSize).bytes as Uint8Array).then(bytes => {\r\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\r\n doc.pFlags.stickerThumbConverted = true;\r\n \r\n if(middleware && !middleware()) return;\r\n \r\n if(!div.childElementCount) {\r\n renderImageFromUrl(thumbImage, appPhotosManager.getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\r\n }\r\n }).catch(() => {});\r\n }\r\n }\r\n } else if(stickerType === 2 && (withThumb || onlyThumb) && toneIndex <= 0) {\r\n thumbImage = new Image();\r\n\r\n const load = () => {\r\n if(div.childElementCount || (middleware && !middleware())) return;\r\n\r\n const r = () => {\r\n if(div.childElementCount || (middleware && !middleware())) return;\r\n renderImageFromUrl(thumbImage, cacheContext.url, afterRender);\r\n };\r\n \r\n if(cacheContext.url) {\r\n r();\r\n return Promise.resolve();\r\n } else {\r\n return appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\r\n }\r\n };\r\n \r\n if(lazyLoadQueue && onlyThumb) {\r\n lazyLoadQueue.push({div, load});\r\n return Promise.resolve();\r\n } else {\r\n load();\r\n\r\n if((thumb as any).url) {\r\n haveThumbCached = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if(loadPromises && haveThumbCached) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n\r\n if(onlyThumb) { // for sticker panel\r\n return Promise.resolve();\r\n }\r\n \r\n const load = async() => {\r\n if(middleware && !middleware()) return;\r\n\r\n if(stickerType === 2) {\r\n /* if(doc.id === '1860749763008266301') {\r\n console.log('loaded sticker:', doc, div);\r\n } */\r\n\r\n //await new Promise((resolve) => setTimeout(resolve, 500));\r\n //return;\r\n\r\n //console.time('download sticker' + doc.id);\r\n\r\n //appDocsManager.downloadDocNew(doc.id).promise.then(res => res.json()).then(async(json) => {\r\n //fetch(doc.url).then(res => res.json()).then(async(json) => {\r\n /* return */ await appDocsManager.downloadDoc(doc, /* undefined, */lazyLoadQueue?.queueId)\r\n .then(readBlobAsText)\r\n //.then(JSON.parse)\r\n .then(async(json) => {\r\n //console.timeEnd('download sticker' + doc.id);\r\n //console.log('loaded sticker:', doc, div/* , blob */);\r\n if(middleware && !middleware()) return;\r\n\r\n let animation = await LottieLoader.loadAnimationWorker({\r\n container: div,\r\n loop: loop && !emoji,\r\n autoplay: play,\r\n animationData: json,\r\n width,\r\n height,\r\n name: 'doc' + doc.id\r\n }, group, toneIndex);\r\n\r\n //const deferred = deferredPromise();\r\n \r\n animation.addEventListener('firstFrame', () => {\r\n const element = div.firstElementChild;\r\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\r\n\r\n const cb = () => {\r\n if(element && element !== animation.canvas) {\r\n element.remove();\r\n }\r\n };\r\n\r\n if(!needFadeIn) {\r\n if(element) {\r\n sequentialDom.mutate(cb);\r\n }\r\n } else {\r\n sequentialDom.mutate(() => {\r\n animation.canvas.classList.add('fade-in');\r\n if(element) {\r\n element.classList.add('fade-out');\r\n }\r\n \r\n animation.canvas.addEventListener('animationend', () => {\r\n sequentialDom.mutate(() => {\r\n animation.canvas.classList.remove('fade-in');\r\n cb();\r\n });\r\n }, {once: true});\r\n });\r\n }\r\n\r\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\r\n\r\n //deferred.resolve();\r\n }, {once: true});\r\n \r\n if(emoji) {\r\n attachClickEvent(div, (e) => {\r\n cancelEvent(e);\r\n let animation = LottieLoader.getAnimation(div);\r\n \r\n if(animation.paused) {\r\n animation.autoplay = true;\r\n animation.restart();\r\n }\r\n });\r\n }\r\n\r\n //return deferred;\r\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\r\n });\r\n\r\n //console.timeEnd('render sticker' + doc.id);\r\n } else if(stickerType === 1) {\r\n const image = new Image();\r\n const thumbImage = div.firstElementChild !== image && div.firstElementChild;\r\n needFadeIn = (needFadeIn || !downloaded || thumbImage) && rootScope.settings.animationsEnabled;\r\n\r\n image.classList.add('media-sticker');\r\n\r\n if(needFadeIn) {\r\n image.classList.add('fade-in');\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const r = () => {\r\n if(middleware && !middleware()) return resolve();\r\n \r\n renderImageFromUrl(image, cacheContext.url, () => {\r\n sequentialDom.mutateElement(div, () => {\r\n div.append(image);\r\n if(thumbImage) {\r\n thumbImage.classList.add('fade-out');\r\n }\r\n\r\n resolve();\r\n\r\n if(needFadeIn) {\r\n image.addEventListener('animationend', () => {\r\n image.classList.remove('fade-in');\r\n if(thumbImage) {\r\n thumbImage.remove();\r\n }\r\n }, {once: true});\r\n }\r\n });\r\n });\r\n };\r\n \r\n if(cacheContext.url) r();\r\n else {\r\n appDocsManager.downloadDoc(doc, /* undefined, */lazyLoadQueue?.queueId).then(r, resolve);\r\n }\r\n });\r\n }\r\n };\r\n\r\n const loadPromise: Promise = lazyLoadQueue && (!downloaded || stickerType === 2) ? \r\n (lazyLoadQueue.push({div, load}), Promise.resolve()) : \r\n load();\r\n\r\n if(downloaded && stickerType === 1) {\r\n loadThumbPromise = loadPromise;\r\n if(loadPromises) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n }\r\n\r\n return loadPromise;\r\n}\r\n\r\nexport async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height}: {\r\n set: StickerSet.stickerSet,\r\n lazyLoadQueue: LazyLoadQueue,\r\n container: HTMLElement,\r\n group: string,\r\n autoplay: boolean,\r\n width: number,\r\n height: number\r\n}) {\r\n if(set.thumbs?.length) {\r\n container.classList.add('media-sticker-wrapper');\r\n lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n const downloadOptions = appStickersManager.getStickerSetThumbDownloadOptions(set);\r\n const promise = appDownloadManager.download(downloadOptions);\r\n\r\n if(set.pFlags.animated) {\r\n return promise\r\n .then(readBlobAsText)\r\n //.then(JSON.parse)\r\n .then(json => {\r\n lottieLoader.loadAnimationWorker({\r\n container,\r\n loop: true,\r\n autoplay,\r\n animationData: json,\r\n width,\r\n height,\r\n needUpscale: true,\r\n name: 'setThumb' + set.id\r\n }, group);\r\n });\r\n } else {\r\n const image = new Image();\r\n image.classList.add('media-sticker');\r\n \r\n return promise.then(blob => {\r\n renderImageFromUrl(image, URL.createObjectURL(blob), () => {\r\n container.append(image);\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n const promise = appStickersManager.getStickerSet(set);\r\n const stickerSet = await promise;\r\n if(stickerSet.documents[0]._ !== 'documentEmpty') { // as thumb will be used first sticker\r\n wrapSticker({\r\n doc: stickerSet.documents[0],\r\n div: container, \r\n group: group,\r\n lazyLoadQueue\r\n }); // kostil\r\n }\r\n}\r\n\r\nexport function wrapLocalSticker({emoji, width, height}: {\r\n doc?: MyDocument,\r\n url?: string,\r\n emoji?: string,\r\n width: number,\r\n height: number,\r\n}) {\r\n const container = document.createElement('div');\r\n\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: container,\r\n loop: false,\r\n play: true,\r\n width,\r\n height,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n return {container};\r\n}\r\n\r\nexport function wrapReply(title: Parameters[0], subtitle: Parameters[1], message?: any) {\r\n const replyContainer = new ReplyContainer('reply');\r\n replyContainer.fill(title, subtitle, message);\r\n /////////console.log('wrapReply', title, subtitle, media);\r\n return replyContainer.container;\r\n}\r\n\r\nexport function prepareAlbum(options: {\r\n container: HTMLElement,\r\n items: {w: number, h: number}[],\r\n maxWidth: number,\r\n minWidth: number,\r\n spacing: number,\r\n maxHeight?: number,\r\n forMedia?: true\r\n}) {\r\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\r\n const layout = layouter.layout();\r\n\r\n const widthItem = layout.find(item => item.sides & RectPart.Right);\r\n const width = widthItem.geometry.width + widthItem.geometry.x;\r\n\r\n const heightItem = layout.find(item => item.sides & RectPart.Bottom);\r\n const height = heightItem.geometry.height + heightItem.geometry.y;\r\n\r\n const container = options.container;\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n const children = container.children;\r\n\r\n layout.forEach(({geometry, sides}, idx) => {\r\n let div: HTMLElement;\r\n div = children[idx] as HTMLElement;\r\n if(!div) {\r\n div = document.createElement('div');\r\n container.append(div);\r\n }\r\n\r\n div.classList.add('album-item', 'grouped-item');\r\n\r\n div.style.width = (geometry.width / width * 100) + '%';\r\n div.style.height = (geometry.height / height * 100) + '%';\r\n div.style.top = (geometry.y / height * 100) + '%';\r\n div.style.left = (geometry.x / width * 100) + '%';\r\n\r\n if(sides & RectPart.Left && sides & RectPart.Top) {\r\n div.style.borderTopLeftRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\r\n div.style.borderBottomLeftRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Right && sides & RectPart.Top) {\r\n div.style.borderTopRightRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\r\n div.style.borderBottomRightRadius = 'inherit';\r\n }\r\n\r\n if(options.forMedia) {\r\n const mediaDiv = document.createElement('div');\r\n mediaDiv.classList.add('album-item-media');\r\n \r\n div.append(mediaDiv);\r\n }\r\n\r\n // @ts-ignore\r\n //div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\r\n });\r\n\r\n /* if(options.forMedia) {\r\n layout.forEach((_, i) => {\r\n const mediaDiv = document.createElement('div');\r\n mediaDiv.classList.add('album-item-media');\r\n \r\n options.container.children[i].append(mediaDiv);\r\n });\r\n } */\r\n}\r\n\r\nexport function wrapAlbum({groupId, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, noAutoDownload}: {\r\n groupId: string, \r\n attachmentDiv: HTMLElement,\r\n middleware?: () => boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n uploading?: boolean,\r\n isOut: boolean,\r\n chat: Chat,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n}) {\r\n const items: {size: PhotoSize.photoSize, media: any, message: any}[] = [];\r\n\r\n // !lowest msgID will be the FIRST in album\r\n const storage = appMessagesManager.getMidsByAlbum(groupId);\r\n for(const mid of storage) {\r\n const m = chat.getMessage(mid);\r\n const media = m.media.photo || m.media.document;\r\n\r\n const size: any = media._ === 'photo' ? appPhotosManager.choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\r\n items.push({size, media, message: m});\r\n }\r\n\r\n /* // * pending\r\n if(storage[0] < 0) {\r\n items.reverse();\r\n } */\r\n\r\n prepareAlbum({\r\n container: attachmentDiv,\r\n items: items.map(i => ({w: i.size.w, h: i.size.h})),\r\n maxWidth: mediaSizes.active.album.width,\r\n minWidth: 100,\r\n spacing: 2,\r\n forMedia: true\r\n });\r\n\r\n items.forEach((item, idx) => {\r\n const {size, media, message} = item;\r\n\r\n const div = attachmentDiv.children[idx] as HTMLElement;\r\n div.dataset.mid = '' + message.mid;\r\n div.dataset.peerId = '' + message.peerId;\r\n const mediaDiv = div.firstElementChild as HTMLElement;\r\n if(media._ === 'photo') {\r\n wrapPhoto({\r\n photo: media,\r\n message,\r\n container: mediaDiv,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n isOut,\r\n lazyLoadQueue,\r\n middleware,\r\n size,\r\n loadPromises,\r\n noAutoDownload\r\n });\r\n } else {\r\n wrapVideo({\r\n doc: message.media.document,\r\n container: mediaDiv,\r\n message,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n withTail: false,\r\n isOut,\r\n lazyLoadQueue,\r\n middleware,\r\n loadPromises,\r\n noAutoDownload\r\n });\r\n }\r\n });\r\n}\r\n\r\nexport function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, noAutoDownload, lazyLoadQueue, searchContext, useSearch}: {\r\n albumMustBeRenderedFull: boolean,\r\n message: any,\r\n messageDiv: HTMLElement,\r\n bubble: HTMLElement,\r\n uploading?: boolean,\r\n chat: Chat,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n searchContext?: MediaSearchContext,\r\n useSearch?: boolean,\r\n}) {\r\n let nameContainer: HTMLElement;\r\n const mids = albumMustBeRenderedFull ? chat.getMidsByMid(message.mid) : [message.mid];\r\n /* if(isPending) {\r\n mids.reverse();\r\n } */\r\n\r\n mids.forEach((mid, idx) => {\r\n const message = chat.getMessage(mid);\r\n const div = wrapDocument({\r\n message,\r\n loadPromises,\r\n noAutoDownload,\r\n lazyLoadQueue,\r\n searchContext\r\n });\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('document-container');\r\n container.dataset.mid = '' + mid;\r\n container.dataset.peerId = '' + message.peerId;\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.classList.add('document-wrapper');\r\n \r\n if(message.message) {\r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('document-message');\r\n\r\n const richText = RichTextProcessor.wrapRichText(message.message, {\r\n entities: message.totalEntities\r\n });\r\n\r\n messageDiv.innerHTML = richText;\r\n wrapper.append(messageDiv);\r\n }\r\n\r\n if(mids.length > 1) {\r\n const selection = document.createElement('div');\r\n selection.classList.add('document-selection');\r\n container.append(selection);\r\n \r\n container.classList.add('grouped-item');\r\n\r\n if(idx === 0) {\r\n nameContainer = wrapper;\r\n }\r\n }\r\n\r\n wrapper.append(div);\r\n container.append(wrapper);\r\n messageDiv.append(container);\r\n });\r\n\r\n if(mids.length > 1) {\r\n bubble.classList.add('is-multiple-documents', 'is-grouped');\r\n }\r\n\r\n return nameContainer;\r\n}\r\n\r\nexport function wrapPoll(message: any) {\r\n const elem = new PollElement();\r\n elem.message = message;\r\n elem.setAttribute('peer-id', '' + message.peerId);\r\n elem.setAttribute('poll-id', message.media.poll.id);\r\n elem.setAttribute('message-id', '' + message.mid);\r\n elem.render();\r\n return elem;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport whichChild from \"./whichChild\";\r\n\r\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\r\n if(prevPos === undefined) {\r\n prevPos = element.parentElement === container ? whichChild(element) : -1;\r\n }\r\n\r\n if(prevPos === pos) {\r\n return false;\r\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\r\n pos += 1;\r\n }\r\n\r\n if(!pos) {\r\n container.prepend(element);\r\n } else if(container.childElementCount > pos) {\r\n container.insertBefore(element, container.children[pos]);\r\n } else {\r\n container.append(element);\r\n }\r\n\r\n return true;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { insertInDescendSortedArray } from \"./array\";\nimport { getMiddleware } from \"./middleware\";\nimport { safeAssign } from \"./object\";\n\nexport type SortedElementId = PeerId;\nexport type SortedElementBase = {\n id: SortedElementId, \n index: number\n};\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => number;\n protected onDelete: (element: SortedElement) => void;\n protected onUpdate: (element: SortedElement) => void;\n protected onSort: (element: SortedElement, idx: number) => void;\n protected onElementCreate: (base: SortedElementBase, batch: boolean) => SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware = getMiddleware();\n\n constructor(options: {\n getIndex: SortedList['getIndex'],\n onDelete?: SortedList['onDelete'],\n onUpdate?: SortedList['onUpdate'],\n onSort?: SortedList['onSort'],\n onElementCreate: SortedList['onElementCreate'],\n\n updateElementWith?: SortedList['updateElementWith'],\n updateListWith?: SortedList['updateListWith']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n }\n\n public clear() {\n this.middleware.clean();\n this.elements.clear();\n this.sorted.length = 0;\n }\n\n protected _updateList() {\n this.elements.forEach(element => {\n this.update(element.id, true);\n });\n\n if(this.onSort) {\n this.sorted.forEach((element, idx) => {\n this.onSort(element, idx);\n });\n }\n }\n\n public updateList(callback: (updated: boolean) => void) {\n const middleware = this.middleware.get();\n this.updateListWith((canUpdate) => {\n if(!middleware() || (canUpdate !== undefined && !canUpdate)) {\n return callback(false);\n }\n\n this._updateList();\n \n callback(true);\n });\n }\n\n public has(id: SortedElementId) {\n return this.elements.has(id);\n }\n\n public get(id: SortedElementId) {\n return this.elements.get(id);\n }\n\n public getAll() {\n return this.elements;\n }\n\n public add(id: SortedElementId, batch = false, updateElementWith?: SortedList['updateElementWith'], updateBatch = batch) {\n let element = this.get(id);\n if(element) {\n return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n element = this.onElementCreate(base, batch);\n this.elements.set(id, element);\n this.update(id, updateBatch, element, updateElementWith);\n\n return element;\n }\n\n public delete(id: SortedElementId, noScheduler?: boolean) {\n const element = this.elements.get(id);\n if(!element) {\n return false;\n }\n \n this.elements.delete(id);\n \n const idx = this.sorted.indexOf(element);\n if(idx !== -1) {\n this.sorted.splice(idx, 1);\n }\n\n if(this.onDelete) {\n if(noScheduler) {\n this.onDelete(element);\n } else {\n const middleware = this.middleware.get();\n this.updateElementWith(() => {\n if(!middleware()) {\n return;\n }\n\n this.onDelete(element);\n });\n }\n }\n\n return true;\n }\n\n public update(id: SortedElementId, batch = false, element = this.get(id), updateElementWith?: SortedList['updateElementWith']) {\n if(!element) {\n return;\n }\n\n element.index = this.getIndex(element);\n this.onUpdate && this.onUpdate(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n if(!batch && this.onSort) {\n const middleware = this.middleware.get();\n (updateElementWith || this.updateElementWith)(() => {\n if(!middleware()) {\n return;\n }\n\n // * в случае пересортировки этого же элемента во время ожидания вызовется вторая такая же. нужно соблюдать последовательность событий\n this.onSort(element, idx);\n /* if(this.get(id) === element) {\n this.onSort(element, this.sorted.indexOf(element));\n } */\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\nimport appDialogsManager, { AppDialogsManager, DialogDom } from \"../lib/appManagers/appDialogsManager\";\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport isInDOM from \"../helpers/dom/isInDOM\";\nimport positionElementByIndex from \"../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport { safeAssign } from \"../helpers/object\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../helpers/sortedList\";\n\ninterface SortedUser extends SortedElementBase {\n dom: DialogDom\n}\n\nexport default class SortedUserList extends SortedList {\n protected static SORT_INTERVAL = 30e3;\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueueIntersector;\n protected avatarSize = 48;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0];\n protected onListLengthChange: () => void;\n\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 }> = {}) {\n super({\n getIndex: (element) => appUsersManager.getUserStatusForSort(element.id),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: (element) => {\n const status = appUsersManager.getUserStatusString(element.id);\n replaceContent(element.dom.lastMessageSpan, status);\n },\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength && this.onListLengthChange) {\n this.onListLengthChange();\n }\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: base.id,\n container: false,\n drawStatus: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n (base as SortedUser).dom = dom;\n return base as SortedUser;\n },\n updateElementWith: fastRaf,\n updateListWith: async(callback) => {\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n \n await getHeavyAnimationPromise();\n \n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n callback(true);\n }\n });\n\n safeAssign(this, options);\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n\n let timeout: number;\n const doTimeout = () => {\n timeout = window.setTimeout(() => {\n this.updateList((good) => {\n if(good) {\n doTimeout();\n }\n });\n }, SortedUserList.SORT_INTERVAL);\n };\n\n doTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SwipeHandler, { SwipeHandlerOptions } from \"../../components/swipeHandler\";\nimport { cancelEvent } from \"./cancelEvent\";\nimport findUpClassName from \"./findUpClassName\";\nimport isSwipingBackSafari from \"./isSwipingBackSafari\";\n\nexport type SwipeHandlerHorizontalOptions = SwipeHandlerOptions & {\n // xThreshold?: number\n};\n\nexport default function handleHorizontalSwipe(options: SwipeHandlerHorizontalOptions) {\n let cancelY = false;\n return new SwipeHandler({\n ...options,\n verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'progress-line') && \n !isSwipingBackSafari(e) && \n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e);\n cancelY = true;\n } else if(!cancelY && Math.abs(yDiff) > Math.abs(xDiff)/* || Math.abs(yDiff) > 20 */) {\n return true;\n }\n\n /* if(!cancelY && options.xThreshold !== undefined && xDiff >= options.xThreshold) {\n cancelY = true;\n } */\n\n return options.onSwipe(xDiff, yDiff, e);\n },\n onReset: () => {\n cancelY = false;\n options.onReset && options.onReset();\n },\n cancelEvent: false // cannot use cancelEvent on Safari iOS because scroll will be canceled too\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelContextMenuOpening } from \"../../components/misc\";\nimport handleHorizontalSwipe, { SwipeHandlerHorizontalOptions } from \"./handleHorizontalSwipe\";\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\n }\n }\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport PopupPickUser from \"./pickUser\";\r\n\r\nexport default class PopupForward extends PopupPickUser {\r\n constructor(\r\n peerIdMids: {[fromPeerId: PeerId]: number[]}, \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n overrideOnSelect = false\r\n ) {\r\n super({\r\n peerTypes: ['dialogs', 'contacts'],\r\n onSelect: overrideOnSelect ? onSelect : async(peerId) => {\r\n if(onSelect) {\r\n const res = onSelect(peerId);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n }\r\n\r\n appImManager.setInnerPeer(peerId);\r\n appImManager.chat.input.initMessagesForward(peerIdMids);\r\n },\r\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\r\n chatRightsAction: 'send_messages',\r\n selfPresence: 'ChatYourSelf'\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport { ChatType } from \"../chat/chat\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\n\nexport default class PopupDeleteMessages {\n constructor(peerId: PeerId, mids: number[], type: ChatType, onConfirm?: () => void) {\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'] = [];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n \n if(appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\n }\n\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n\n if(peerId === rootScope.myId || type === 'scheduled') {\n \n } else {\n if(peerId.isUser()) {\n checkboxes.push({\n text: 'DeleteMessagesOptionAlso',\n textArgs: [peerTitleElement]\n });\n } else {\n const chat = appChatsManager.getChat(peerId.toChatId());\n\n const hasRights = appChatsManager.hasRights(peerId.toChatId(), 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = hasRights ? mids.slice() : mids.filter(mid => {\n const message = appMessagesManager.getMessageByPeer(peerId, mid);\n return message.fromId === rootScope.myId;\n });\n\n if(canRevoke.length) {\n if(canRevoke.length === mids.length) {\n checkboxes.push({\n text: 'DeleteForAll'\n });\n } else {\n checkboxes.push({\n text: 'DeleteMessagesOption'\n });\n\n description = 'DeleteMessagesTextGroup';\n descriptionArgs = [i18n('messages', [canRevoke.length])];\n //description = `You can also delete the ${canRevoke.length} message${canRevoke.length > 1 ? 's' : ''} you sent from the inboxes of other group members by pressing \"${buttonText}\".`;\n }\n }\n } else {\n buttons[0].callback = (checked) => callback(checked, true);\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { PopupButton } from \".\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupSendNow {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n let title: string, description: string, buttons: PopupButton[] = [];\n\n title = `Send Message${mids.length > 1 ? 's' : ''} Now`;\n description = mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?';\n\n const callback = () => {\n onConfirm && onConfirm();\n appMessagesManager.sendScheduledMessages(peerId, mids);\n };\n\n buttons.push({\n langKey: 'Send',\n callback\n });\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n title,\n description,\n buttons\n });\n\n popup.show();\n }\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelSelection() {\r\n if(window.getSelection) {\r\n if(window.getSelection().empty) { // Chrome\r\n window.getSelection().empty();\r\n } else if(window.getSelection().removeAllRanges) { // Firefox\r\n window.getSelection().removeAllRanges();\r\n }\r\n // @ts-ignore\r\n } else if(document.selection) { // IE?\r\n // @ts-ignore\r\n document.selection.empty();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppMessagesManager, MessagesStorage } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatBubbles from \"./bubbles\";\nimport type ChatInput from \"./input\";\nimport type Chat from \"./chat\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport CheckboxField from \"../checkboxField\";\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\nimport PopupForward from \"../popups/forward\";\nimport { toast } from \"../toast\";\nimport SetTransition from \"../singleTransition\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport PopupSendNow from \"../popups/sendNow\";\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport I18n, { i18n, _i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport cancelSelection from \"../../helpers/dom/cancelSelection\";\nimport getSelectedText from \"../../helpers/dom/getSelectedText\";\nimport rootScope from \"../../lib/rootScope\";\nimport { safeAssign } from \"../../helpers/object\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport { randomLong } from \"../../helpers/random\";\nimport { attachContextMenuListener } from \"../misc\";\nimport { attachClickEvent, AttachClickOptions } from \"../../helpers/dom/clickEvent\";\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\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 {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected appMessagesManager: AppMessagesManager;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean) => void;\n protected onUpdateContainer: (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => void;\n protected onCancelSelection: () => void;\n protected toggleByMid: (peerId: PeerId, mid: number) => void;\n protected toggleByElement: (bubble: HTMLElement) => void;\n\n protected navigationType: NavigationItem['type'];\n\n protected getElementFromTarget: (target: HTMLElement) => HTMLElement;\n protected verifyTarget: (e: MouseEvent, target: HTMLElement) => boolean;\n protected verifyMouseMoveTarget: (e: MouseEvent, element: HTMLElement, selecting: boolean) => boolean;\n protected verifyTouchLongPress: () => boolean;\n protected targetLookupClassName: string;\n protected lookupBetweenParentClassName: string;\n protected lookupBetweenElementsQuery: string;\n\n constructor(options: {\n appMessagesManager: AppMessagesManager,\n listenElement: HTMLElement,\n listenerSetter: ListenerSetter,\n getElementFromTarget: AppSelection['getElementFromTarget'],\n verifyTarget?: AppSelection['verifyTarget'],\n verifyMouseMoveTarget?: AppSelection['verifyMouseMoveTarget'],\n verifyTouchLongPress?: AppSelection['verifyTouchLongPress'],\n targetLookupClassName: string,\n lookupBetweenParentClassName: string,\n lookupBetweenElementsQuery: string,\n isScheduled?: AppSelection['isScheduled']\n }) {\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.add(this.listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener(this.listenElement, (e) => {\n if(this.isSelecting || (this.verifyTouchLongPress && !this.verifyTouchLongPress())) return;\n\n // * these two lines will fix instant text selection on iOS Safari\n document.body.classList.add('no-select'); // * need no-select on body because chat-input transforms in channels\n this.listenElement.addEventListener('touchend', (e) => {\n cancelEvent(e); // ! this one will fix propagation to document loader button, etc\n document.body.classList.remove('no-select');\n\n //this.chat.bubbles.onBubblesClick(e);\n }, {once: true, capture: true});\n\n cancelSelection();\n //cancelEvent(e as any);\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(element) {\n this.toggleByElement(element);\n }\n }, this.listenerSetter);\n\n return;\n }\n\n const getElementsBetween = (first: HTMLElement, last: HTMLElement) => { \n if(first === last) {\n return [];\n }\n\n const firstRect = first.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n const difference = (firstRect.top - lastRect.top) || (firstRect.left - lastRect.left);\n const isHigher = difference < 0;\n\n const parent = findUpClassName(first, this.lookupBetweenParentClassName);\n if(!parent) {\n return [];\n }\n\n const elements = Array.from(parent.querySelectorAll(this.lookupBetweenElementsQuery)) as HTMLElement[];\n let firstIndex = elements.indexOf(first);\n let lastIndex = elements.indexOf(last);\n\n if(!isHigher) {\n [lastIndex, firstIndex] = [firstIndex, lastIndex];\n }\n\n const slice = elements.slice(firstIndex + 1, lastIndex);\n\n // console.log('getElementsBetween', first, last, slice, firstIndex, lastIndex, isHigher);\n\n return slice;\n };\n\n this.listenerSetter.add(this.listenElement)('mousedown', (e) => {\n //console.log('selection mousedown', e);\n const element = findUpClassName(e.target, this.targetLookupClassName);\n if(e.button !== 0) {\n return;\n }\n\n if(this.verifyTarget && !this.verifyTarget(e, element)) {\n return;\n }\n \n const seen: AppSelection['selectedMids'] = new Map();\n let selecting: boolean;\n\n /* let good = false;\n const {x, y} = e; */\n\n /* const bubbles = appImManager.bubbles;\n for(const mid in bubbles) {\n const bubble = bubbles[mid];\n bubble.addEventListener('mouseover', () => {\n console.log('mouseover');\n }, {once: true});\n } */\n\n let firstTarget = element;\n\n const processElement = (element: HTMLElement, checkBetween = true) => {\n const mid = +element.dataset.mid;\n if(!mid || !element.dataset.peerId) return;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!isInDOM(firstTarget)) {\n firstTarget = element;\n }\n\n let seenSet = seen.get(peerId);\n if(!seenSet) {\n seen.set(peerId, seenSet = new Set());\n }\n\n if(!seenSet.has(mid)) {\n const isSelected = this.isMidSelected(peerId, mid);\n if(selecting === undefined) {\n //bubblesContainer.classList.add('no-select');\n selecting = !isSelected;\n }\n\n seenSet.add(mid);\n\n if((selecting && !isSelected) || (!selecting && isSelected)) {\n const seenLength = accumulateMapSet(seen);\n if(this.toggleByElement && checkBetween) {\n if(seenLength < 2) {\n if(findUpAsChild(element, firstTarget)) {\n firstTarget = element;\n }\n }\n\n const elementsBetween = getElementsBetween(firstTarget, element);\n // console.log(elementsBetween);\n if(elementsBetween.length) {\n elementsBetween.forEach(element => {\n processElement(element, false);\n });\n }\n }\n\n if(!this.selectedMids.size) {\n if(seenLength === 2 && this.toggleByMid) {\n for(const [peerId, mids] of seen) {\n for(const mid of mids) {\n this.toggleByMid(peerId, mid);\n }\n }\n }\n } else if(this.toggleByElement) {\n this.toggleByElement(element);\n }\n }\n }\n };\n\n //const foundTargets: Map = new Map();\n let canceledSelection = false;\n const onMouseMove = (e: MouseEvent) => {\n if(!canceledSelection) {\n cancelSelection();\n canceledSelection = true;\n }\n /* if(!good) {\n if(Math.abs(e.x - x) > MIN_CLICK_MOVE || Math.abs(e.y - y) > MIN_CLICK_MOVE) {\n good = true;\n } else {\n return;\n }\n } */\n\n /* if(foundTargets.has(e.target as HTMLElement)) return;\n foundTargets.set(e.target as HTMLElement, true); */\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(!element) {\n //console.error('found no bubble', e);\n return;\n }\n\n if(this.verifyMouseMoveTarget && !this.verifyMouseMoveTarget(e, element, selecting)) {\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n this.listenerSetter.removeManual(document, 'mouseup', onMouseUp, documentListenerOptions);\n return;\n }\n\n processElement(element);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n if(seen.size) {\n attachClickEvent(window, cancelEvent, {capture: true, once: true, passive: false});\n }\n\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n //bubblesContainer.classList.remove('no-select');\n\n // ! CANCEL USER SELECTION !\n cancelSelection();\n };\n\n const documentListenerOptions = {once: true};\n this.listenerSetter.add(this.listenElement)('mousemove', onMouseMove);\n this.listenerSetter.add(document)('mouseup', onMouseUp, documentListenerOptions);\n });\n }\n\n protected isElementShouldBeSelected(element: HTMLElement) {\n return this.isMidSelected(element.dataset.peerId.toPeerId(), +element.dataset.mid);\n }\n\n protected appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n element.prepend(checkboxField.label);\n }\n\n public toggleElementCheckbox(element: HTMLElement, show: boolean) {\n const hasCheckbox = !!this.getCheckboxInputFromElement(element);\n if(show) {\n if(hasCheckbox) {\n return false;\n }\n \n const checkboxField = new CheckboxField({\n name: element.dataset.mid, \n round: true\n });\n \n // * if it is a render of new message\n if(this.isSelecting) { // ! avoid breaking animation on start\n if(this.isElementShouldBeSelected(element)) {\n checkboxField.input.checked = true;\n element.classList.add('is-selected');\n }\n }\n \n this.appendCheckbox(element, checkboxField);\n } else if(hasCheckbox) {\n this.getCheckboxInputFromElement(element).parentElement.remove();\n }\n\n return true;\n }\n\n protected getCheckboxInputFromElement(element: HTMLElement): HTMLInputElement {\n return element.firstElementChild?.tagName === 'LABEL' && \n element.firstElementChild.firstElementChild as HTMLInputElement;\n }\n\n protected updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n \n let cantForward = !size, \n cantDelete = !size, \n cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storage = this.isScheduled ? this.appMessagesManager.getScheduledMessagesStorage(peerId) : this.appMessagesManager.getMessagesStorage(peerId);\n for(const mid of mids) {\n const message = this.appMessagesManager.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n if(message.action) {\n cantForward = true;\n }\n }\n \n if(!cantDelete) {\n const canDelete = this.appMessagesManager.canDeleteMessage(message);\n if(!canDelete) {\n cantDelete = true;\n }\n }\n\n if(cantForward && cantDelete) break;\n }\n\n if(cantForward && cantDelete) break;\n }\n \n this.onUpdateContainer && this.onUpdateContainer(cantForward, cantDelete, cantSend);\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const wasSelecting = this.isSelecting;\n const size = this.selectedMids.size;\n this.isSelecting = !!size || forceSelection;\n\n if(wasSelecting === this.isSelecting) return false;\n \n // const bubblesContainer = this.bubbles.bubblesContainer;\n //bubblesContainer.classList.toggle('is-selecting', !!size);\n\n /* if(bubblesContainer.classList.contains('is-chat-input-hidden')) {\n const scrollable = this.appImManager.scrollable;\n if(scrollable.isScrolledDown) {\n scrollable.scrollTo(scrollable.scrollHeight, 'top', true, true, 200);\n }\n } */\n\n if(!IS_TOUCH_SUPPORTED) {\n this.listenElement.classList.toggle('no-select', this.isSelecting);\n\n if(wasSelecting) {\n // ! CANCEL USER SELECTION !\n cancelSelection();\n }\n }/* else {\n if(!wasSelecting) {\n bubblesContainer.classList.add('no-select');\n setTimeout(() => {\n cancelSelection();\n bubblesContainer.classList.remove('no-select');\n cancelSelection();\n }, 100);\n }\n } */\n\n blurActiveElement();\n\n const forwards = !!size || forceSelection;\n this.onToggleSelection && this.onToggleSelection(forwards);\n\n if(!IS_MOBILE_SAFARI) {\n if(forwards) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: () => {\n this.cancelSelection();\n }\n });\n } else {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n if(forceSelection) {\n this.updateContainer(forceSelection);\n }\n\n return true;\n }\n\n public cancelSelection = () => {\n this.onCancelSelection && this.onCancelSelection();\n this.selectedMids.clear();\n this.toggleSelection();\n cancelSelection();\n };\n\n public cleanup() {\n this.selectedMids.clear();\n this.toggleSelection(false);\n }\n\n protected updateElementSelection(element: HTMLElement, isSelected: boolean) {\n this.toggleElementCheckbox(element, true);\n const input = this.getCheckboxInputFromElement(element);\n input.checked = isSelected;\n\n this.toggleSelection();\n this.updateContainer();\n SetTransition(element, 'is-selected', isSelected, 200);\n }\n\n public isMidSelected(peerId: PeerId, mid: number) {\n const set = this.selectedMids.get(peerId);\n return set?.has(mid);\n }\n\n public length() {\n return accumulateMapSet(this.selectedMids);\n }\n\n protected toggleMid(peerId: PeerId, mid: number, unselect?: boolean) {\n let set = this.selectedMids.get(peerId);\n if(unselect || (unselect === undefined && set?.has(mid))) {\n if(set) {\n set.delete(mid);\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n }\n } else {\n const diff = rootScope.config.forwarded_count_max - this.length() - 1;\n if(diff < 0) {\n toast(I18n.format('Chat.Selection.LimitToast', true));\n return false;\n /* const it = this.selectedMids.values();\n do {\n const mid = it.next().value;\n const mounted = this.appImManager.getMountedBubble(mid);\n if(mounted) {\n this.toggleByBubble(mounted.bubble);\n } else {\n const mids = this.appMessagesManager.getMidsByMid(mid);\n for(const mid of mids) {\n this.selectedMids.delete(mid);\n }\n }\n } while(this.selectedMids.size > MAX_SELECTION_LENGTH); */\n }\n\n if(!set) {\n set = new Set();\n this.selectedMids.set(peerId, set);\n }\n\n set.add(mid);\n }\n\n return true;\n }\n\n /**\n * ! Call this method only to handle deleted messages\n */\n public deleteSelectedMids(peerId: PeerId, mids: number[]) {\n const set = this.selectedMids.get(peerId);\n if(!set) {\n return;\n }\n\n mids.forEach(mid => {\n set.delete(mid);\n });\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n\n this.updateContainer();\n this.toggleSelection();\n }\n}\n\nexport class SearchSelection extends AppSelection {\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n public selectionGotoBtn: HTMLElement;\n\n private isPrivate: boolean;\n\n constructor(private searchSuper: AppSearchSuper, appMessagesManager: AppMessagesManager) {\n super({\n appMessagesManager,\n listenElement: searchSuper.container,\n listenerSetter: new ListenerSetter(),\n verifyTarget: (e, target) => !!target && this.isSelecting,\n getElementFromTarget: (target) => findUpClassName(target, 'search-super-item'),\n targetLookupClassName: 'search-super-item',\n lookupBetweenParentClassName: 'tabs-tab',\n lookupBetweenElementsQuery: '.search-super-item'\n });\n\n this.isPrivate = !searchSuper.showSender;\n }\n\n /* public appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(element.classList.contains('document') || element.tagName === 'AUDIO-ELEMENT') {\n element.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n } */\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n const elements = Array.from(this.searchSuper.tabsContainer.querySelectorAll('.search-super-item')) as HTMLElement[];\n elements.forEach(element => {\n this.toggleElementCheckbox(element, this.isSelecting);\n });\n }\n\n return ret;\n }\n\n public toggleByElement = (element: HTMLElement) => {\n const mid = +element.dataset.mid;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!this.toggleMid(peerId, mid)) {\n return;\n }\n\n this.updateElementSelection(element, this.isMidSelected(peerId, mid));\n };\n\n public toggleByMid = (peerId: PeerId, mid: number) => {\n const element = this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id=\"${peerId}\"][data-mid=\"${mid}\"]`) as HTMLElement;\n this.toggleByElement(element);\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n const length = this.length();\n replaceContent(this.selectionCountEl, i18n('messages', [length]));\n this.selectionGotoBtn.classList.toggle('hide', length !== 1);\n this.selectionForwardBtn.classList.toggle('hide', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.classList.toggle('hide', cantDelete);\n };\n\n protected onToggleSelection = (forwards: boolean) => {\n SetTransition(this.searchSuper.navScrollableContainer, 'is-selecting', forwards, 200, () => {\n if(!this.isSelecting) {\n this.selectionContainer.remove();\n this.selectionContainer = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \n null;\n this.selectedText = undefined;\n }\n });\n\n SetTransition(this.searchSuper.container, 'is-selecting', forwards, 200);\n\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n const BASE_CLASS = 'search-super-selection';\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add(BASE_CLASS + '-container');\n\n const btnCancel = ButtonIcon(`close ${BASE_CLASS}-cancel`, {noRipple: true});\n this.listenerSetter.add(btnCancel)('click', this.cancelSelection, {once: true});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add(BASE_CLASS + '-count');\n\n this.selectionGotoBtn = ButtonIcon(`message ${BASE_CLASS}-goto`);\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n attachClickEvent(this.selectionGotoBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n const mid = [...this.selectedMids.get(peerId)][0];\n this.cancelSelection();\n\n rootScope.dispatchEvent('history_focus', {\n peerId,\n mid\n });\n }, attachClickOptions);\n\n this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`);\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n if(this.isPrivate) {\n this.selectionDeleteBtn = ButtonIcon(`delete danger ${BASE_CLASS}-delete`);\n attachClickEvent(this.selectionDeleteBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n new PopupDeleteMessages(peerId, [...this.selectedMids.get(peerId)], 'chat', () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionContainer.append(...[\n btnCancel, \n this.selectionCountEl, \n this.selectionGotoBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean));\n\n const transitionElement = this.selectionContainer;\n transitionElement.style.opacity = '0';\n this.searchSuper.navScrollableContainer.append(transitionElement);\n\n void transitionElement.offsetLeft; // reflow\n transitionElement.style.opacity = '';\n }\n }\n };\n}\n\nexport default class ChatSelection extends AppSelection {\n protected selectionInputWrapper: HTMLElement;\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionSendNowBtn: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n\n constructor(private chat: Chat, private bubbles: ChatBubbles, private input: ChatInput, appMessagesManager: AppMessagesManager) {\n super({\n appMessagesManager,\n listenElement: bubbles.bubblesContainer,\n listenerSetter: bubbles.listenerSetter,\n getElementFromTarget: (target) => findUpClassName(target, 'grouped-item') || findUpClassName(target, 'bubble'),\n verifyTarget: (e, target) => {\n // LEFT BUTTON\n // проверка внизу нужна для того, чтобы не активировать селект если target потомок .bubble\n const bad = !this.selectedMids.size \n && !(e.target as HTMLElement).classList.contains('bubble')\n && !(e.target as HTMLElement).classList.contains('document-selection')\n && target;\n\n return !bad;\n },\n verifyMouseMoveTarget: (e, element, selecting) => {\n const bad = e.target !== element && \n !(e.target as HTMLElement).classList.contains('document-selection') && \n selecting === undefined && \n !this.selectedMids.size;\n return !bad;\n },\n verifyTouchLongPress: () => !this.chat.input.recording,\n targetLookupClassName: 'bubble',\n lookupBetweenParentClassName: 'bubbles-inner',\n lookupBetweenElementsQuery: '.bubble:not(.is-multiple-documents), .grouped-item',\n isScheduled: chat.type === 'scheduled'\n });\n }\n\n public appendCheckbox(bubble: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(bubble.classList.contains('document-container')) {\n bubble.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n for(const mid in this.bubbles.bubbles) {\n const bubble = this.bubbles.bubbles[mid];\n this.toggleElementCheckbox(bubble, this.isSelecting);\n }\n }\n\n return ret;\n }\n\n public toggleElementCheckbox(bubble: HTMLElement, show: boolean) {\n if(!this.canSelectBubble(bubble)) return;\n\n const ret = super.toggleElementCheckbox(bubble, show);\n if(ret) {\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n this.bubbles.getBubbleGroupedItems(bubble).forEach(item => this.toggleElementCheckbox(item, show));\n }\n }\n \n return ret;\n }\n\n public toggleByElement = (bubble: HTMLElement) => {\n if(!this.canSelectBubble(bubble)) return;\n\n const mid = +bubble.dataset.mid;\n\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n if(!this.isGroupedBubbleSelected(bubble)) {\n const set = this.selectedMids.get(this.bubbles.peerId);\n if(set) {\n const mids = this.chat.getMidsByMid(mid);\n mids.forEach(mid => set.delete(mid));\n }\n }\n\n this.bubbles.getBubbleGroupedItems(bubble).forEach(this.toggleByElement);\n return;\n }\n\n if(!this.toggleMid(this.bubbles.peerId, mid)) {\n return;\n }\n\n const isGroupedItem = bubble.classList.contains('grouped-item');\n if(isGroupedItem) {\n const groupContainer = findUpClassName(bubble, 'bubble');\n const isGroupedSelected = this.isGroupedBubbleSelected(groupContainer);\n const isGroupedMidsSelected = this.isGroupedMidsSelected(mid);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.bubbles.peerId, mid));\n };\n\n protected toggleByMid = (peerId: PeerId, mid: number) => {\n const mounted = this.bubbles.getMountedBubble(mid);\n if(mounted) {\n this.toggleByElement(mounted.bubble);\n }\n };\n\n public isElementShouldBeSelected(element: HTMLElement) {\n const isGrouped = element.classList.contains('is-grouped');\n return super.isElementShouldBeSelected(element) && (!isGrouped || this.isGroupedMidsSelected(+element.dataset.mid));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected isGroupedMidsSelected(mid: number) {\n const mids = this.chat.getMidsByMid(mid);\n const selectedMids = mids.filter(mid => this.isMidSelected(this.bubbles.peerId, mid));\n return mids.length === selectedMids.length;\n }\n\n protected getCheckboxInputFromElement(bubble: HTMLElement) {\n /* let perf = performance.now();\n let checkbox = bubble.firstElementChild.tagName === 'LABEL' && bubble.firstElementChild.firstElementChild as HTMLInputElement;\n console.log('getCheckboxInputFromBubble firstElementChild time:', performance.now() - perf);\n \n perf = performance.now();\n checkbox = bubble.querySelector('label input');\n console.log('getCheckboxInputFromBubble querySelector time:', performance.now() - perf); */\n /* let perf = performance.now();\n let contains = bubble.classList.contains('document-container');\n console.log('getCheckboxInputFromBubble classList time:', performance.now() - perf);\n \n perf = performance.now();\n contains = bubble.className.includes('document-container');\n console.log('getCheckboxInputFromBubble className time:', performance.now() - perf); */\n \n return bubble.classList.contains('document-container') ? \n bubble.querySelector('label input') as HTMLInputElement : \n super.getCheckboxInputFromElement(bubble);\n }\n\n public canSelectBubble(bubble: HTMLElement) {\n return !bubble.classList.contains('service') && !bubble.classList.contains('is-sending') && !bubble.classList.contains('bubble-first');\n }\n\n protected onToggleSelection = (forwards: boolean) => {\n let transform = '', borderRadius = '';\n if(forwards) {\n const p = this.input.rowsWrapper.parentElement;\n const fakeSelectionWrapper = p.querySelector('.fake-selection-wrapper');\n const fakeRowsWrapper = p.querySelector('.fake-rows-wrapper');\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\n const fakeRowsRect = 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 const needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\n\n if(scale < 1) {\n const br = 12;\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\n }\n //scale = widthTo / widthFrom;\n }\n }\n\n SetTransition(this.input.rowsWrapper, 'is-centering', forwards, 200);\n this.input.rowsWrapper.style.transform = transform;\n this.input.rowsWrapper.style.borderRadius = borderRadius;\n SetTransition(this.listenElement, 'is-selecting', forwards, 200, () => {\n if(!this.isSelecting) {\n this.selectionInputWrapper.remove();\n this.selectionInputWrapper = \n this.selectionContainer = \n this.selectionSendNowBtn = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \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 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 this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add('selection-container');\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n const btnCancel = ButtonIcon('close', {noRipple: true});\n attachClickEvent(btnCancel, this.cancelSelection, {once: true, listenerSetter: this.listenerSetter});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add('selection-container-count');\n\n if(this.chat.type === 'scheduled') {\n this.selectionSendNowBtn = Button('btn-primary btn-transparent btn-short text-bold selection-container-send', {icon: 'send2'});\n this.selectionSendNowBtn.append(i18n('MessageScheduleSend'));\n attachClickEvent(this.selectionSendNowBtn, () => {\n new PopupSendNow(this.bubbles.peerId, [...this.selectedMids.get(this.bubbles.peerId)], () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n } else {\n this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'});\n this.selectionForwardBtn.append(i18n('Forward'));\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionDeleteBtn = Button('btn-primary btn-transparent danger text-bold selection-container-delete', {icon: 'delete'});\n this.selectionDeleteBtn.append(i18n('Delete'));\n attachClickEvent(this.selectionDeleteBtn, () => {\n new PopupDeleteMessages(this.bubbles.peerId, [...this.selectedMids.get(this.bubbles.peerId)], this.chat.type, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n this.selectionContainer.append(...[\n btnCancel, \n this.selectionCountEl, \n this.selectionSendNowBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean));\n\n this.selectionInputWrapper.style.opacity = '0';\n this.selectionInputWrapper.append(this.selectionContainer);\n this.input.rowsWrapper.parentElement.append(this.selectionInputWrapper);\n\n void this.selectionInputWrapper.offsetLeft; // reflow\n this.selectionInputWrapper.style.opacity = '';\n }\n }\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n replaceContent(this.selectionCountEl, i18n('messages', [this.length()]));\n this.selectionSendNowBtn && this.selectionSendNowBtn.toggleAttribute('disabled', cantSend);\n this.selectionForwardBtn && this.selectionForwardBtn.toggleAttribute('disabled', cantForward);\n this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = () => {\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n const mounted = this.bubbles.getMountedBubble(mid);\n if(mounted) {\n //this.toggleByBubble(mounted.message.grouped_id ? mounted.bubble.querySelector(`.grouped-item[data-mid=\"${mid}\"]`) : mounted.bubble);\n this.toggleByElement(mounted.bubble);\n }\n /* const bubble = this.appImManager.bubbles[mid];\n if(bubble) {\n this.toggleByBubble(bubble);\n } */\n }\n }\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedText(): string {\r\n if(window.getSelection) {\r\n return window.getSelection().toString();\r\n // @ts-ignore\r\n } else if(document.selection) {\r\n // @ts-ignore\r\n return document.selection.createRange().text;\r\n }\r\n \r\n return '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { copy, getObjectKeysAndSort, safeAssign } from \"../helpers/object\";\nimport { escapeRegExp, limitSymbols } from \"../helpers/string\";\nimport appChatsManager from \"../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, { MyInputMessagesFilter, MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport appStateManager from \"../lib/appManagers/appStateManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport { logger } from \"../lib/logger\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport rootScope from \"../lib/rootScope\";\nimport { SearchGroup, SearchGroupType } from \"./appSearch\";\nimport { horizontalMenu } from \"./horizontalMenu\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport { attachContextMenuListener, openBtnMenu, positionMenu, putPreloader } from \"./misc\";\nimport { ripple } from \"./ripple\";\nimport Scrollable, { ScrollableX } from \"./scrollable\";\nimport { wrapDocument, wrapPhoto, wrapVideo } from \"./wrappers\";\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport I18n, { LangPackKey, i18n } from \"../lib/langPack\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { getMiddleware } from \"../helpers/middleware\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { ChannelParticipant, ChatFull, ChatParticipant, ChatParticipants } 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\";\n\n//const testScroll = false;\n\nexport type SearchSuperType = MyInputMessagesFilter/* | 'members' */;\nexport type SearchSuperContext = {\n peerId: PeerId,\n inputFilter: {_: MyInputMessagesFilter},\n query?: string,\n maxId?: number,\n folderId?: number,\n threadId?: number,\n date?: number,\n nextRate?: number,\n minDate?: number,\n maxDate?: number\n};\n\nexport type SearchSuperMediaType = 'members' | 'media' | 'files' | 'links' | 'music' | 'chats' | 'voice';\nexport type SearchSuperMediaTab = {\n inputFilter: SearchSuperType,\n name: LangPackKey,\n type: SearchSuperMediaType,\n contentTab?: HTMLElement,\n menuTab?: HTMLElement,\n scroll?: {scrollTop: number, scrollHeight: number}\n};\n\nclass SearchContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify?: () => boolean, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper\n ) {\n const onContextMenu = (e: MouseEvent) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let item: HTMLElement;\n try {\n item = findUpClassName(e.target, 'search-super-item');\n } catch(e) {}\n\n if(!item) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n this.target = item;\n this.peerId = item.dataset.peerId.toPeerId();\n this.mid = +item.dataset.mid;\n this.isSelected = searchSuper.selection.isMidSelected(this.peerId, this.mid);\n\n this.buttons.forEach(button => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? button.verify() : true;\n }\n\n button.element.classList.toggle('hide', !good);\n });\n\n item.classList.add('menu-open');\n\n positionMenu(e, this.element);\n openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener(attachTo, onContextMenu as any);\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.isSelected && \n !this.searchSuper.selection.selectionForwardBtn.classList.contains('hide'),\n withSelection: true\n }, {\n icon: 'message',\n text: 'Message.Context.Goto',\n onClick: this.onGotoClick,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n withSelection: true\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => appMessagesManager.canDeleteMessage(appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.searchSuper.selection.selectionDeleteBtn.classList.contains('hide'),\n withSelection: true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n rootScope.dispatchEvent('history_focus', {\n peerId: this.peerId,\n mid: this.mid,\n threadId: this.searchSuper.searchContext.threadId\n });\n };\n\n private onForwardClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionForwardBtn);\n } else {\n new PopupForward({\n [this.peerId]: [this.mid]\n });\n }\n };\n\n private onSelectClick = () => {\n this.searchSuper.selection.toggleByElement(this.target);\n };\n\n private onClearSelectionClick = () => {\n this.searchSuper.selection.cancelSelection();\n };\n\n private onDeleteClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, [this.mid], 'chat');\n }\n };\n}\n\nexport 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 constructor(options: Pick) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('search-super');\n\n this.searchContextMenu = new SearchContextMenu(this.container, this);\n this.selection = new SearchSelection(this, appMessagesManager);\n\n const navScrollableContainer = this.navScrollableContainer = document.createElement('div');\n navScrollableContainer.classList.add('search-super-tabs-scrollable', 'menu-horizontal-scrollable', 'sticky');\n\n const navScrollable = this.navScrollable = new ScrollableX(navScrollableContainer);\n navScrollable.container.classList.add('search-super-nav-scrollable');\n\n const nav = this.nav = document.createElement('nav');\n nav.classList.add('search-super-tabs', 'menu-horizontal-div');\n this.tabsMenu = nav;\n\n navScrollable.container.append(nav);\n\n for(const mediaTab of this.mediaTabs) {\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const i = document.createElement('i');\n\n span.append(i18n(mediaTab.name));\n span.append(i);\n\n menuTab.append(span);\n\n ripple(menuTab);\n\n this.tabsMenu.append(menuTab);\n\n this.mediaTabsMap.set(mediaTab.type, mediaTab);\n\n mediaTab.menuTab = menuTab;\n }\n\n this.tabsContainer = document.createElement('div');\n this.tabsContainer.classList.add('search-super-tabs-container', 'tabs-container');\n\n let unlockScroll: ReturnType;\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.tabsContainer, \n onSwipe: (xDiff, yDiff, e) => {\n const prevId = this.selectTab.prevId();\n const children = Array.from(this.tabsMenu.children) as HTMLElement[];\n let idx: number;\n if(xDiff > 0) {\n for(let i = prevId + 1; i < children.length; ++i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n } else {\n for(let i = prevId - 1; i >= 0; --i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n }\n\n if(idx !== undefined) {\n unlockScroll = lockTouchScroll(this.tabsContainer);\n this.selectTab(idx);\n }\n }\n });\n }\n\n for(const mediaTab of this.mediaTabs) {\n const container = document.createElement('div');\n container.classList.add('search-super-container-' + mediaTab.type, 'tabs-tab');\n\n const content = document.createElement('div');\n content.classList.add('search-super-content-' + mediaTab.type);\n\n container.append(content);\n\n this.tabsContainer.append(container);\n\n this.tabs[mediaTab.inputFilter] = content;\n\n mediaTab.contentTab = content;\n }\n\n this.container.append(navScrollableContainer, this.tabsContainer);\n\n // * construct end\n\n this.searchGroupMedia = new SearchGroup(false, 'messages', true);\n\n this.scrollable.onScrolledBottom = () => {\n if(this.mediaTab.contentTab && this.mediaTab.contentTab.childElementCount/* && 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(this.container, 'start');\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(this.container, 'start');\n scrollTop = offsetTop;\n }\n \n fromMediaTab.scroll = {scrollTop: scrollTop, scrollHeight: this.scrollable.scrollHeight};\n \n if(newMediaTab.scroll === undefined) {\n const rect = this.container.getBoundingClientRect();\n const rect2 = this.container.parentElement.getBoundingClientRect();\n const diff = rect.y - rect2.y;\n \n if(scrollTop > diff) {\n newMediaTab.scroll = {scrollTop: diff, scrollHeight: 0};\n }\n }\n \n if(newMediaTab.scroll) {\n const diff = fromMediaTab.scroll.scrollTop - newMediaTab.scroll.scrollTop;\n //console.log('what you gonna do', this.goingHard, diff);\n \n //this.scrollable.scrollTop = scrollTop;\n if(diff/* && diff < 0 */) {\n /* if(diff > -(fromMediaTab.contentTab.scrollHeight + this.nav.scrollHeight)) {\n fromMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n this.scrollable.scrollTop = scrollTop - diff;\n } else { */\n newMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n //}\n }\n }\n }\n \n /* if(this.prevTabId !== -1 && nav.offsetTop) {\n this.scrollable.scrollTop -= nav.offsetTop;\n } */\n\n /* this.log('setVirtualContainer', id, this.sharedMediaSelected, this.sharedMediaSelected.childElementCount);\n this.scroll.setVirtualContainer(this.sharedMediaSelected); */\n\n if(this.prevTabId !== -1 && !newMediaTab.contentTab.childElementCount) { // quick brown fix\n //this.contentContainer.classList.remove('loaded');\n this.load(true);\n }\n\n this.prevTabId = id;\n }, () => {\n this.scrollable.onScroll();\n \n //console.log('what y', this.tabSelected.style.transform);\n if(this.mediaTab.scroll !== undefined) {\n this.mediaTab.contentTab.style.transform = '';\n this.scrollable.scrollTop = this.mediaTab.scroll.scrollTop;\n }\n\n if(unlockScroll) {\n unlockScroll();\n unlockScroll = undefined;\n }\n\n this.onTransitionEnd();\n }, undefined, navScrollable);\n\n attachClickEvent(this.tabsContainer, (e) => {\n if(this.selection.isSelecting) {\n cancelEvent(e);\n this.selection.toggleByElement(findUpClassName(e.target, 'search-super-item'));\n }\n }, {capture: true, passive: false});\n \n const onMediaClick = (className: string, targetClassName: string, inputFilter: MyInputMessagesFilter, e: MouseEvent) => {\n const target = findUpClassName(e.target as HTMLDivElement, className);\n if(!target) return;\n \n const mid = +target.dataset.mid;\n if(!mid) {\n this.log.warn('no messageId by click on target:', target);\n return;\n }\n\n const peerId = target.dataset.peerId.toPeerId();\n\n const targets = (Array.from(this.tabs[inputFilter].querySelectorAll('.' + targetClassName)) as HTMLElement[]).map(el => {\n const containerEl = findUpClassName(el, className);\n return {\n element: el, \n mid: +containerEl.dataset.mid, \n peerId: containerEl.dataset.peerId.toPeerId()\n };\n });\n\n //const ids = Object.keys(this.mediaDivsByIds).map(k => +k).sort((a, b) => a - b);\n const idx = targets.findIndex(item => item.mid === mid && item.peerId === peerId);\n \n const message = appMessagesManager.getMessageByPeer(peerId, mid);\n new AppMediaViewer()\n .setSearchContext(this.copySearchContext(inputFilter))\n .openMedia(message, targets[idx].element, 0, false, targets.slice(0, idx), targets.slice(idx + 1));\n };\n\n attachClickEvent(this.tabs.inputMessagesFilterPhotoVideo, onMediaClick.bind(null, 'grid-item', 'grid-item', 'inputMessagesFilterPhotoVideo'));\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'));\n\n /* attachClickEvent(this.tabs.inputMessagesFilterUrl, (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') {\n return;\n }\n\n try {\n const a = findUpClassName(target, 'row').querySelector('.anchor-url:last-child') as HTMLAnchorElement;\n a.click();\n } catch(err) {}\n }); */\n\n this.mediaTab = this.mediaTabs[0];\n\n useHeavyAnimationCheck(() => {\n this.lazyLoadQueue.lock();\n }, () => {\n this.lazyLoadQueue.unlockAndRefresh(); // ! maybe not so efficient\n });\n }\n\n private onTransitionStart = () => {\n this.container.classList.add('sliding');\n };\n\n private onTransitionEnd = () => {\n this.container.classList.remove('sliding');\n };\n\n public filterMessagesByType(messages: any[], type: SearchSuperType): MyMessage[] {\n if(type === 'inputMessagesFilterEmpty') return messages;\n\n if(type !== 'inputMessagesFilterUrl') {\n messages = messages.filter(message => !!message.media);\n }\n\n /* if(!this.peerId) {\n messages = messages.filter(message => {\n if(message.peerId === rootScope.myId) {\n return true;\n }\n\n const dialog = appMessagesManager.getDialogByPeerId(message.fromId)[0];\n return dialog && dialog.folder_id === 0;\n });\n } */\n\n let filtered: any[] = [];\n\n switch(type) {\n case 'inputMessagesFilterPhotoVideo': {\n for(let message of messages) {\n let media = message.media.photo || message.media.document || (message.media.webpage && message.media.webpage.document);\n if(!media) {\n //this.log('no media!', message);\n continue;\n }\n \n if(media._ === 'document' && media.type !== 'video'/* && media.type !== 'gif' */) {\n //this.log('broken video', media);\n continue;\n }\n\n filtered.push(message);\n }\n \n break;\n }\n\n case 'inputMessagesFilterDocument': {\n for(let message of messages) {\n if(!message.media.document || ['voice', 'audio', 'gif', 'sticker', 'round'].includes(message.media.document.type)) {\n continue;\n }\n \n filtered.push(message);\n }\n break;\n }\n\n case 'inputMessagesFilterUrl': {\n //this.log('inputMessagesFilterUrl', messages);\n for(let message of messages) {\n //if((message.media.webpage && message.media.webpage._ !== 'webPageEmpty')) {\n filtered.push(message);\n //}\n }\n \n break;\n }\n\n case 'inputMessagesFilterMusic': {\n for(let message of messages) {\n if(!message.media.document || message.media.document.type !== 'audio') {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n case 'inputMessagesFilterVoice': {\n for(let message of messages) {\n if(!message.media.document || message.media.document.type !== 'voice') {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n case 'inputMessagesFilterRoundVoice': {\n for(let message of messages) {\n if(!message.media.document || !(['voice', 'round'] as MyDocument['type'][]).includes(message.media.document.type)) {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n default:\n break;\n }\n\n return filtered;\n }\n \n 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 // https://core.telegram.org/type/MessagesFilter\n switch(inputFilter) {\n case 'inputMessagesFilterEmpty': {\n for(const message of messages) {\n const {dialog, dom} = appDialogsManager.addDialogNew({\n dialog: message.peerId, \n container: searchGroup.list, \n drawStatus: false,\n avatarSize: 54\n });\n appDialogsManager.setLastMessage(dialog, message, dom, this.searchContext.query);\n }\n\n if(searchGroup.list.childElementCount) {\n searchGroup.setActive();\n }\n break;\n }\n\n case 'inputMessagesFilterPhotoVideo': {\n for(const message of messages) {\n const media = message.media.photo || message.media.document || (message.media.webpage && message.media.webpage.document);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n //this.log(message, photo);\n\n let wrapped: ReturnType;\n const size = appPhotosManager.choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = wrapVideo({\n doc: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n onlyPreview: true,\n withoutPreloader: true,\n noPlayButton: true,\n size\n }).thumb;\n } else {\n wrapped = wrapPhoto({\n photo: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n noBlur: true,\n size\n });\n }\n\n [wrapped.images.thumb, wrapped.images.full].filter(Boolean).forEach(image => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n elemsToAppend.push({element: div, message});\n }\n \n break;\n }\n \n case 'inputMessagesFilterVoice':\n case 'inputMessagesFilterRoundVoice':\n case 'inputMessagesFilterMusic':\n case 'inputMessagesFilterDocument': {\n for(const message of messages) {\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(message.media.document.type);\n const div = wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n noAutoDownload: true\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(message.media.document.type)) {\n div.classList.add('audio-48');\n }\n\n elemsToAppend.push({element: div, message});\n }\n break;\n }\n \n case 'inputMessagesFilterUrl': {\n for(let message of messages) {\n let webpage: any;\n\n if(message.media?.webpage && message.media.webpage._ !== 'webPageEmpty') {\n webpage = message.media.webpage;\n } else {\n const entity = message.totalEntities ? message.totalEntities.find((e: any) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') : null;\n let url: string, display_url: string, sliced: string;\n\n if(!entity) {\n //this.log.error('NO ENTITY:', message);\n const match = RichTextProcessor.matchUrl(message.message);\n if(!match) {\n //this.log.error('NO ENTITY AND NO MATCH:', message);\n continue;\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 url,\n display_url\n };\n\n if(!same) {\n webpage.description = message.message;\n webpage.rDescription = RichTextProcessor.wrapRichText(limitSymbols(message.message, 150, 180));\n }\n }\n\n let div = document.createElement('div');\n \n let previewDiv = document.createElement('div');\n previewDiv.classList.add('preview', 'row-media');\n \n //this.log('wrapping webpage', webpage);\n \n if(webpage.photo) {\n const res = wrapPhoto({\n container: previewDiv,\n message: null,\n photo: webpage.photo,\n boxWidth: 0,\n boxHeight: 0,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n size: appPhotosManager.choosePhotoSize(webpage.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n previewDiv.innerHTML = RichTextProcessor.getAbbreviation(webpage.title || webpage.display_url || webpage.description || webpage.url, true);\n }\n \n let title = webpage.rTitle || '';\n let subtitle = webpage.rDescription || '';\n\n const subtitleFragment = htmlToDocumentFragment(subtitle);\n const aFragment = htmlToDocumentFragment(RichTextProcessor.wrapRichText(webpage.url || ''));\n const a = aFragment.firstElementChild;\n if(a instanceof HTMLAnchorElement) {\n a.innerText = decodeURIComponent(a.href);\n }\n\n if(subtitleFragment.firstChild) {\n subtitleFragment.append('\\n');\n }\n\n subtitleFragment.append(a);\n\n if(this.showSender) {\n subtitleFragment.append('\\n', appMessagesManager.wrapSenderToPeer(message));\n }\n \n if(!title) {\n //title = new URL(webpage.url).hostname;\n title = RichTextProcessor.wrapPlainText(webpage.display_url.split('/', 1)[0]);\n }\n\n const row = new Row({\n title,\n titleRight: appMessagesManager.wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n /* const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('row-media'); */\n\n row.container.append(previewDiv);\n \n /* ripple(div);\n div.append(previewDiv);\n div.insertAdjacentHTML('beforeend', `\n
${title}${titleAdditionHTML}
\n
${subtitle}
\n
${url}
\n ${sender}\n `); */\n \n if(row.container.innerText.trim().length) {\n elemsToAppend.push({element: row.container, message});\n }\n }\n \n break;\n }\n\n default:\n //this.log.warn('death is my friend', messages);\n break;\n }\n\n if(this.loadMutex) {\n promises.push(this.loadMutex);\n }\n\n if(promises.length) {\n await Promise.all(promises);\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n }\n \n if(elemsToAppend.length) {\n const method = append ? 'append' : 'prepend';\n elemsToAppend.forEach(details => {\n const {element, message} = details;\n const monthContainer = this.getMonthContainerByTimestamp(this.groupByMonth ? message.date : 0, inputFilter);\n element.classList.add('search-super-item');\n element.dataset.mid = '' + message.mid;\n element.dataset.peerId = '' + message.peerId;\n monthContainer.items[method](element);\n\n if(this.selection.isSelecting) {\n this.selection.toggleElementCheckbox(element, true);\n }\n });\n }\n \n //if(type !== 'inputMessagesFilterEmpty') {\n this.afterPerforming(inputFilter === 'inputMessagesFilterEmpty' ? 1 : messages.length, sharedMediaDiv);\n //}\n }\n\n private afterPerforming(length: number, contentTab: HTMLElement) {\n if(contentTab) {\n const parent = contentTab.parentElement;\n Array.from(parent.children).slice(1).forEach(child => {\n child.remove();\n });\n\n //this.contentContainer.classList.add('loaded');\n\n if(!length && !contentTab.childElementCount) {\n const div = document.createElement('div');\n div.innerText = 'Nothing interesting here yet...';\n div.classList.add('position-center', 'text-center', 'content-empty', 'no-select');\n\n parent.append(div);\n }\n }\n }\n\n private loadChats() {\n const renderedPeerIds: Set = new Set();\n const middleware = this.middleware.get();\n\n for(let i in this.searchGroups) {\n const group = this.searchGroups[i as SearchGroupType];\n this.tabs.inputMessagesFilterEmpty.append(group.container);\n group.clear();\n }\n\n const query = this.searchContext.query;\n if(query) {\n const setResults = (results: PeerId[], group: SearchGroup, showMembersCount = false) => {\n results.forEach((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n \n renderedPeerIds.add(peerId);\n \n const peer = appPeersManager.getPeer(peerId);\n \n //////////this.log('contacts peer', peer);\n \n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId, \n container: group.list, \n drawStatus: false,\n avatarSize: 48,\n autonomous: group.autonomous\n });\n \n if(showMembersCount && (peer.participants_count || peer.participants)) {\n const regExp = new RegExp(`(${escapeRegExp(query)}|${escapeRegExp(cleanSearchText(query))})`, 'gi');\n dom.titleSpan.innerHTML = dom.titleSpan.innerHTML.replace(regExp, '$1');\n dom.lastMessageSpan.append(appProfileManager.getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.phone) {\n username = '+' + formatPhoneNumber(user.phone).formatted;\n }\n } else {\n username = '@' + username;\n }\n \n dom.lastMessageSpan.innerHTML = '' + username + '';\n }\n });\n \n group.toggle();\n };\n \n const onLoad = (arg: T) => {\n if(!middleware()) {\n return;\n }\n \n //this.loadedContacts = true;\n \n return arg;\n };\n \n return Promise.all([\n appUsersManager.getContactsPeerIds(query, true)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n \n appUsersManager.searchContacts(query, 20)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts.my_results, this.searchGroups.contacts, true);\n setResults(contacts.results/* .concat(contacts.results, contacts.results, contacts.results) */, this.searchGroups.globalContacts);\n\n if(this.searchGroups.globalContacts.nameEl.lastElementChild) {\n this.searchGroups.globalContacts.nameEl.lastElementChild.remove();\n }\n\n this.searchGroups.globalContacts.container.classList.add('is-short');\n \n if(this.searchGroups.globalContacts.list.childElementCount > 3) {\n const showMore = document.createElement('div');\n showMore.classList.add('search-group__show-more');\n showMore.innerText = 'Show more';\n this.searchGroups.globalContacts.nameEl.append(showMore);\n showMore.addEventListener('click', () => {\n const isShort = this.searchGroups.globalContacts.container.classList.toggle('is-short');\n showMore.innerText = isShort ? 'Show more' : 'Show less';\n });\n }\n }\n }),\n \n appMessagesManager.getConversations(query, 0, 20, 0).promise\n .then(onLoad)\n .then(value => {\n if(value) {\n setResults(value.dialogs.map(d => d.peerId), this.searchGroups.contacts, true);\n }\n })\n ]);\n } else if(!this.searchContext.peerId && !this.searchContext.minDate) {\n const renderRecentSearch = (setActive = true) => {\n return appStateManager.getState().then(state => {\n if(!middleware()) {\n return;\n }\n \n this.searchGroups.recent.list.innerHTML = '';\n \n state.recentSearch.slice(0, 20).forEach(peerId => {\n let {dialog, dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n container: this.searchGroups.recent.list,\n drawStatus: false,\n meAsSaved: true,\n avatarSize: 48,\n autonomous: true\n });\n \n dom.lastMessageSpan.append(peerId.isUser() ? appUsersManager.getUserStatusString(peerId) : appProfileManager.getChatMembersString(peerId.toChatId()));\n });\n \n if(!state.recentSearch.length) {\n this.searchGroups.recent.clear();\n } else if(setActive) {\n this.searchGroups.recent.setActive();\n }\n });\n };\n\n return Promise.all([\n appUsersManager.getTopPeers('correspondents').then(peers => {\n if(!middleware()) return;\n\n const idx = peers.findIndex(peer => peer.id === rootScope.myId);\n if(idx !== -1) {\n peers = peers.slice();\n peers.splice(idx, 1);\n }\n //console.log('got top categories:', categories);\n if(peers.length) {\n peers.forEach((peer) => {\n appDialogsManager.addDialogNew({\n dialog: peer.id, \n container: this.searchGroups.people.list, \n drawStatus: false,\n onlyFirstName: true,\n avatarSize: 54,\n autonomous: false\n });\n });\n }\n \n this.searchGroups.people.setActive();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private loadMembers(mediaTab: SearchSuperMediaTab) {\n const id = this.searchContext.peerId.toChatId();\n const middleware = this.middleware.get();\n let promise: Promise;\n\n const renderParticipants = async(participants: (ChatParticipant | ChannelParticipant)[]) => {\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n \n if(!this.membersList) {\n this.membersList = new SortedUserList({lazyLoadQueue: this.lazyLoadQueue, rippleEnabled: false});\n this.membersList.list.addEventListener('click', (e) => {\n const li = findUpTag(e.target, 'LI');\n if(!li) {\n return;\n }\n\n const peerId = li.dataset.peerId.toPeerId();\n let promise: Promise = Promise.resolve();\n if(mediaSizes.isMobile) {\n promise = appSidebarRight.toggleSidebar(false);\n }\n \n promise.then(() => {\n appImManager.setInnerPeer(peerId);\n });\n });\n mediaTab.contentTab.append(this.membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n participants.forEach(participant => {\n const peerId = appChatsManager.getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n return;\n }\n\n const user = appUsersManager.getUser(peerId);\n if(user.pFlags.deleted) {\n return;\n }\n\n this.membersList.add(peerId);\n });\n };\n\n if(appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then(participants => {\n if(!middleware()) {\n return;\n }\n\n let list = mediaTab.contentTab.firstElementChild as HTMLUListElement;\n this.nextRates[mediaTab.inputFilter] = (list ? list.childElementCount : 0) + participants.participants.length;\n\n if(participants.participants.length < LOAD_COUNT) {\n this.loaded[mediaTab.inputFilter] = true;\n }\n\n return renderParticipants(participants.participants);\n });\n } else {\n promise = (appProfileManager.getChatFull(id) as Promise).then(chatFull => {\n if(!middleware()) {\n return;\n }\n\n //console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = chatFull.participants;\n if(participants._ === 'chatParticipantsForbidden') {\n return;\n }\n \n return renderParticipants(participants.participants);\n });\n }\n\n return this.loadPromises[mediaTab.inputFilter] = promise.finally(() => { \n if(!middleware()) {\n return;\n }\n\n this.loadPromises[mediaTab.inputFilter] = null;\n });\n }\n\n private loadType(mediaTab: SearchSuperMediaTab, justLoad: boolean, loadCount: number, middleware: () => boolean) {\n const type = mediaTab.inputFilter;\n\n if(this.loadPromises[type]) {\n return this.loadPromises[type];\n }\n\n if(mediaTab.type === 'members') {\n return this.loadMembers(mediaTab);\n }\n\n const history = this.historyStorage[type] ?? (this.historyStorage[type] = []);\n\n if(type === 'inputMessagesFilterEmpty' && !history.length) {\n if(!this.loadedChats) {\n this.loadChats();\n this.loadedChats = true;\n }\n\n if(!this.searchContext.query.trim() && !this.searchContext.peerId && !this.searchContext.minDate) {\n this.loaded[type] = true;\n return Promise.resolve();\n }\n }\n\n const logStr = 'load [' + type + ']: ';\n\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n let messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n let ids = history.slice(used, used + loadCount);\n //this.log(logStr + 'will render from cache', used, history, ids, loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n messages.push(...this.filterMessagesByType(ids.map(m => appMessagesManager.getMessageByPeer(m.peerId, m.mid)), type));\n } while(slicedLength < loadCount && used < history.length);\n \n // если перебор\n /* if(slicedLength > loadCount) {\n let diff = messages.length - loadCount;\n messages = messages.slice(0, messages.length - diff);\n used -= diff;\n } */\n\n this.usedFromHistory[type] = used;\n //if(messages.length) {\n return this.performSearchResult(messages, mediaTab).finally(() => {\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n //}\n\n return Promise.resolve();\n }\n \n let maxId = history.length ? history[history.length - 1].mid : 0;\n \n //this.log(logStr + 'search house of glass pre', type, maxId);\n \n //let loadCount = history.length ? 50 : 15;\n return this.loadPromises[type] = appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId, \n limit: loadCount,\n nextRate: this.nextRates[type] ?? (this.nextRates[type] = 0)\n }).then(value => {\n history.push(...value.history.map(m => ({mid: m.mid, peerId: m.peerId})));\n \n this.log(logStr + 'search house of glass', type, value);\n\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n\n // ! Фикс случая, когда не загружаются документы при открытой панели разработчиков (происходит из-за того, что не совпадают критерии отбора документов в getSearch)\n if(value.history.length < loadCount || (this.searchContext.folderId !== undefined && !value.next_rate) || value.history.length === value.count) {\n //if((value.count || history.length === value.count) && history.length >= value.count) {\n //this.log(logStr + 'loaded all media', value, loadCount);\n this.loaded[type] = true;\n }\n\n this.nextRates[type] = value.next_rate;\n\n if(justLoad) {\n return Promise.resolve();\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n (this.loadPromises[type] || Promise.resolve()).then(() => {\n setTimeout(() => {\n if(!middleware()) return;\n //this.log('will preload more');\n if(this.mediaTab === mediaTab) {\n const promise = this.load(true, true);\n if(promise) {\n promise.then(() => {\n if(!middleware()) return;\n //this.log('preloaded more');\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n }\n }\n }, 0);\n });\n }\n\n //if(value.history.length) {\n return this.performSearchResult(this.filterMessagesByType(value.history, type), mediaTab);\n //}\n }).catch(err => {\n this.log.error('load error:', err);\n }).finally(() => {\n this.loadPromises[type] = null;\n });\n }\n \n public async load(single = false, justLoad = false) {\n // if(testScroll/* || 1 === 1 */) {\n // return;\n // }\n\n //return;\n \n const peerId = this.searchContext.peerId;\n this.log('load', single, peerId, this.loadPromises);\n const middleware = this.middleware.get();\n\n if(this.firstLoad) {\n if(this.hideEmptyTabs) {\n const mediaTabs = this.mediaTabs.filter(mediaTab => mediaTab.inputFilter !== 'inputMessagesFilterEmpty')\n const filters = mediaTabs.map(mediaTab => ({_: mediaTab.inputFilter}));\n\n const counters = await appMessagesManager.getSearchCounters(peerId, filters);\n if(!middleware()) {\n return;\n }\n\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n let firstMediaTab: SearchSuperMediaTab;\n let count = 0;\n mediaTabs.forEach(mediaTab => {\n const counter = counters.find(c => c.filter._ === mediaTab.inputFilter);\n\n mediaTab.menuTab.classList.toggle('hide', !counter.count);\n mediaTab.menuTab.classList.remove('active');\n //mediaTab.contentTab.classList.toggle('hide', !counter.count);\n\n if(counter.count && firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n if(counter.count) ++count;\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n const canViewMembers = this.canViewMembers();\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n }\n\n this.container.classList.toggle('hide', !firstMediaTab);\n this.container.parentElement.classList.toggle('search-empty', !firstMediaTab);\n if(firstMediaTab) {\n this.skipScroll = true;\n this.selectTab(this.mediaTabs.indexOf(firstMediaTab), false);\n firstMediaTab.menuTab.classList.add('active');\n\n this.navScrollableContainer.classList.toggle('hide', count <= 1);\n }\n }\n\n this.firstLoad = false;\n }\n \n let toLoad = single ? [this.mediaTab] : this.mediaTabs.filter(t => t !== this.mediaTab);\n toLoad = toLoad.filter(mediaTab => {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n });\n\n if(peerId.isUser()) {\n toLoad.findAndSplice(mediaTab => mediaTab.type === 'members');\n }\n\n if(!toLoad.length) {\n return;\n }\n\n const loadCount = justLoad ? 50 : Math.round((windowSize.height / 130 | 0) * 3 * 1.25); // that's good for all types\n\n const promises: Promise[] = toLoad.map(mediaTab => {\n return this.loadType(mediaTab, justLoad, loadCount, middleware)\n });\n\n return Promise.all(promises).catch(err => {\n this.log.error('Load error all promises:', err);\n });\n }\n \n public getMonthContainerByTimestamp(timestamp: number, type: SearchSuperType) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n date.setDate(1);\n const dateTimestamp = date.getTime();\n const containers = this.monthContainers[type] ?? (this.monthContainers[type] = {});\n if(!(dateTimestamp in containers)) {\n const container = document.createElement('div');\n container.className = 'search-super-month';\n\n const name = document.createElement('div');\n name.classList.add('search-super-month-name');\n\n const options: Intl.DateTimeFormatOptions = {\n month: 'long'\n };\n\n if(date.getFullYear() !== new Date().getFullYear()) {\n options.year = 'numeric';\n }\n\n const dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n name.append(dateElement);\n\n container.append(name);\n\n const items = document.createElement('div');\n items.classList.add('search-super-month-items');\n\n container.append(name, items);\n\n const haveTimestamps = getObjectKeysAndSort(containers, 'desc');\n let i = 0;\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n if(dateTimestamp > t) {\n break;\n }\n }\n \n containers[dateTimestamp] = {container, items};\n positionElementByIndex(container, this.tabs[type], i);\n }\n\n return containers[dateTimestamp];\n }\n\n public canViewMembers() {\n return this.searchContext.peerId.isAnyChat() && !appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()) && appChatsManager.hasRights(this.searchContext.peerId.toChatId(), 'view_participants');\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n\n this.lazyLoadQueue.clear();\n\n this.mediaTabs.forEach(mediaTab => {\n this.usedFromHistory[mediaTab.inputFilter] = -1;\n });\n\n if(this.selection.isSelecting) {\n this.selection.cancelSelection();\n }\n\n // * must go to first tab (это костыль)\n /* const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n const tab = this.canViewMembers() ? membersTab : this.mediaTabs[this.mediaTabs.indexOf(membersTab) + 1];\n this.mediaTab = tab;\n } */\n\n this.middleware.clean();\n this.cleanScrollPositions();\n this.membersList = undefined;\n }\n\n public cleanScrollPositions() {\n this.mediaTabs.forEach(mediaTab => {\n mediaTab.scroll = undefined;\n });\n }\n\n public cleanupHTML(goFirst = false) {\n if(this.urlsToRevoke.length) {\n this.urlsToRevoke.forEach(url => {\n URL.revokeObjectURL(url);\n });\n this.urlsToRevoke.length = 0;\n }\n\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.innerHTML = '';\n\n if(this.hideEmptyTabs) {\n //tab.menuTab.classList.add('hide');\n this.container.classList.add('hide');\n this.container.parentElement.classList.add('search-empty');\n }\n\n if(tab.type === 'chats') {\n return;\n }\n \n if(!this.historyStorage[tab.inputFilter]) {\n const parent = tab.contentTab.parentElement;\n //if(!testScroll) {\n if(!parent.querySelector('.preloader')) {\n putPreloader(parent, true);\n }\n //}\n\n const empty = parent.querySelector('.content-empty');\n if(empty) {\n empty.remove();\n }\n }\n });\n\n /* if(goFirst) {\n const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n let idx = this.canViewMembers() ? 0 : 1;\n membersTab.menuTab.classList.toggle('hide', idx !== 0);\n\n this.selectTab(idx, false);\n } else {\n this.selectTab(0, false);\n }\n } */\n\n this.monthContainers = {};\n this.searchGroupMedia.clear();\n this.scrollable.scrollTop = 0;\n\n /* if(testScroll) {\n for(let i = 0; i < 1500; ++i) {\n let div = document.createElement('div');\n div.insertAdjacentHTML('beforeend', ``);\n div.classList.add('grid-item');\n div.dataset.id = '' + (i / 3 | 0);\n //div.innerText = '' + (i / 3 | 0);\n this.tabs.inputMessagesFilterPhotoVideo.append(div);\n }\n } */\n }\n\n private copySearchContext(newInputFilter: MyInputMessagesFilter) {\n const context = copy(this.searchContext);\n context.inputFilter = {_: newInputFilter};\n context.nextRate = this.nextRates[newInputFilter];\n return context;\n }\n\n public setQuery({peerId, query, threadId, historyStorage, folderId, minDate, maxDate}: {\n peerId: PeerId, \n query?: string, \n threadId?: number, \n historyStorage?: AppSearchSuper['historyStorage'], \n folderId?: number,\n minDate?: number,\n maxDate?: number\n }) {\n this.searchContext = {\n peerId,\n query: query || '',\n inputFilter: {_: this.mediaTab.inputFilter},\n threadId,\n folderId,\n minDate,\n maxDate\n };\n \n this.historyStorage = historyStorage ?? {};\n\n this.cleanup();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"./cancelEvent\";\n\nexport default function lockTouchScroll(container: HTMLElement) {\n const onTouchMove = (e: TouchEvent) => {\n cancelEvent(e);\n };\n\n let lockers = 2;\n const cb = () => {\n if(!--lockers) {\n container.removeEventListener('touchmove', onTouchMove, {capture: true});\n }\n };\n\n container.addEventListener('touchmove', onTouchMove, {capture: true, passive: false});\n container.addEventListener('touchend', cb, {once: true});\n\n return cb;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { InputPrivacyKey, InputPrivacyRule, PrivacyRule, Update, PrivacyKey } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport { convertInputKeyToKey } from \"../../helpers/string\";\r\n\r\nexport enum PrivacyType {\r\n Everybody = 2,\r\n Contacts = 1,\r\n Nobody = 0\r\n}\r\n\r\nexport class AppPrivacyManager {\r\n private privacy: Partial<{\r\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\r\n }> = {};\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updatePrivacy: (update) => {\r\n const key = update.key._;\r\n this.privacy[key] = update.rules;\r\n rootScope.dispatchEvent('privacy_update', update);\r\n }\r\n });\r\n }\r\n\r\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\r\n return apiManager.invokeApi('account.setPrivacy', {\r\n key: {\r\n _: inputKey\r\n },\r\n rules\r\n }).then(privacyRules => {\r\n appUsersManager.saveApiUsers(privacyRules.users);\r\n appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updatePrivacy',\r\n key: {\r\n _: convertInputKeyToKey(inputKey)\r\n },\r\n rules: rules.map(inputRule => {\r\n const rule: PrivacyRule = {} as any;\r\n Object.assign(rule, inputRule);\r\n rule._ = convertInputKeyToKey(rule._) as any;\r\n return rule;\r\n })\r\n });\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\r\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\r\n const rules = this.privacy[privacyKey];\r\n if(rules) {\r\n return Promise.resolve(rules);\r\n }\r\n \r\n return this.privacy[privacyKey] = apiManager.invokeApi('account.getPrivacy', {\r\n key: {\r\n _: inputKey\r\n }\r\n }).then(privacyRules => {\r\n appUsersManager.saveApiUsers(privacyRules.users);\r\n appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return this.privacy[privacyKey] = privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacyRulesDetails(rules: PrivacyRule[]) {\r\n const types: PrivacyType[] = [];\r\n\r\n type peers = {users: UserId[], chats: ChatId[]};\r\n let allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\r\n rules.forEach(rule => {\r\n switch(rule._) {\r\n case 'privacyValueAllowAll':\r\n types.push(2);\r\n break;\r\n case 'privacyValueDisallowAll':\r\n types.push(0);\r\n break;\r\n case 'privacyValueAllowContacts': \r\n types.push(1);\r\n break;\r\n /* case 'privacyValueDisallowContacts':\r\n types.push('Except My Contacts');\r\n break; */\r\n case 'privacyValueAllowChatParticipants':\r\n allowPeers.chats.push(...rule.chats);\r\n break;\r\n case 'privacyValueAllowUsers':\r\n allowPeers.users.push(...rule.users);\r\n break;\r\n case 'privacyValueDisallowChatParticipants':\r\n disallowPeers.chats.push(...rule.chats);\r\n break;\r\n case 'privacyValueDisallowUsers':\r\n disallowPeers.users.push(...rule.users);\r\n break;\r\n }\r\n });\r\n\r\n return {type: types[0], disallowPeers, allowPeers};\r\n }\r\n}\r\n\r\nconst appPrivacyManager = new AppPrivacyManager();\r\nMOUNT_CLASS_TO.appPrivacyManager = appPrivacyManager;\r\nexport default appPrivacyManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { randomLong } from \"../helpers/random\";\r\nimport { InputPrivacyKey, InputPrivacyRule } from \"../layer\";\r\nimport appPrivacyManager, { PrivacyType } from \"../lib/appManagers/appPrivacyManager\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\nimport { i18n, join, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RadioField from \"./radioField\";\r\nimport Row, { RadioFormFromRows } from \"./row\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { SettingSection, generateSection } from \"./sidebarLeft\";\r\nimport AppAddMembersTab from \"./sidebarLeft/tabs/addMembers\";\r\nimport { SliderSuperTabEventable } from \"./sliderTab\";\r\n\r\ntype PrivacySectionStr = LangPackKey | '';\r\nexport default class PrivacySection {\r\n public radioRows: Map;\r\n public radioSection: SettingSection;\r\n public exceptions: Map;\r\n public peerIds: {\r\n disallow?: PeerId[],\r\n allow?: PeerId[]\r\n };\r\n public type: PrivacyType;\r\n\r\n constructor(public options: {\r\n tab: SliderSuperTabEventable,\r\n title: LangPackKey, \r\n inputKey: InputPrivacyKey['_'], \r\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\r\n appendTo?: Scrollable,\r\n noExceptions?: boolean,\r\n onRadioChange?: (value: number) => any,\r\n skipTypes?: PrivacyType[],\r\n exceptionTexts?: [LangPackKey, LangPackKey]\r\n }) {\r\n if(options.captions) {\r\n options.captions.reverse();\r\n }\r\n\r\n this.radioSection = new SettingSection({name: options.title, caption: true});\r\n\r\n this.radioRows = new Map();\r\n\r\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\r\n type: PrivacyType.Everybody,\r\n langKey: 'PrivacySettingsController.Everbody'\r\n }, {\r\n type: PrivacyType.Contacts,\r\n langKey: 'PrivacySettingsController.MyContacts'\r\n }, {\r\n type: PrivacyType.Nobody,\r\n langKey: 'PrivacySettingsController.Nobody'\r\n }];\r\n\r\n if(options.skipTypes) {\r\n r = r.filter(r => !options.skipTypes.includes(r.type));\r\n }\r\n \r\n const random = randomLong();\r\n r.forEach(({type, langKey}) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey, \r\n name: random, \r\n value: '' + type\r\n })\r\n });\r\n \r\n this.radioRows.set(type, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\r\n\r\n this.radioSection.content.append(form);\r\n if(options.appendTo) {\r\n options.appendTo.append(this.radioSection.container);\r\n }\r\n\r\n if(!options.noExceptions) {\r\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\r\n\r\n this.exceptions = new Map([[\r\n 'disallow', \r\n {\r\n titleLangKey: options.exceptionTexts[0],\r\n key: 'disallow',\r\n row: null,\r\n icon: 'deleteuser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ], [\r\n 'allow', \r\n {\r\n titleLangKey: options.exceptionTexts[1],\r\n key: 'allow',\r\n row: null,\r\n icon: 'adduser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ]]);\r\n\r\n this.exceptions.forEach((exception) => {\r\n exception.row = new Row(exception);\r\n\r\n exception.row.container.addEventListener('click', () => {\r\n promise.then(() => {\r\n const _peerIds = this.peerIds[exception.key];\r\n new AppAddMembersTab(options.tab.slider).open({\r\n type: 'privacy',\r\n skippable: true,\r\n title: exception.titleLangKey,\r\n placeholder: 'PrivacyModal.Search.Placeholder',\r\n takeOut: (newPeerIds) => {\r\n _peerIds.length = 0;\r\n _peerIds.push(...newPeerIds);\r\n exception.row.subtitle.innerHTML = '';\r\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\r\n },\r\n selectedPeerIds: _peerIds\r\n });\r\n });\r\n });\r\n\r\n container.append(exception.row.container);\r\n });\r\n }\r\n\r\n /* setTimeout(() => {\r\n this.setRadio(PrivacyType.Contacts);\r\n }, 0); */\r\n\r\n const promise = appPrivacyManager.getPrivacy(options.inputKey).then(rules => {\r\n const details = appPrivacyManager.getPrivacyRulesDetails(rules);\r\n this.setRadio(details.type);\r\n\r\n if(this.exceptions) {\r\n this.peerIds = {};\r\n ['allow' as const, 'disallow' as const].forEach(k => {\r\n const arr = [];\r\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\r\n arr.push(...from.users.map(id => id.toPeerId()));\r\n arr.push(...from.chats.map(id => id.toPeerId(true)));\r\n this.peerIds[k] = arr;\r\n const s = this.exceptions.get(k).row.subtitle;\r\n s.innerHTML = '';\r\n s.append(...this.generateStr(from));\r\n });\r\n }\r\n\r\n options.tab.eventListener.addEventListener('destroy', () => {\r\n const rules: InputPrivacyRule[] = [];\r\n\r\n switch(this.type) {\r\n case PrivacyType.Everybody:\r\n rules.push({_: 'inputPrivacyValueAllowAll'});\r\n break;\r\n case PrivacyType.Contacts:\r\n rules.push({_: 'inputPrivacyValueAllowContacts'});\r\n break;\r\n case PrivacyType.Nobody:\r\n rules.push({_: 'inputPrivacyValueDisallowAll'});\r\n break;\r\n }\r\n\r\n if(this.exceptions) {\r\n ([\r\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\r\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\r\n ] as Array<[\r\n 'allow' | 'disallow', \r\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants', \r\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\r\n ]>).forEach(([k, chatKey, usersKey], idx) => {\r\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\r\n return;\r\n }\r\n\r\n const _peerIds = this.peerIds[k];\r\n if(_peerIds) {\r\n const splitted = this.splitPeersByType(_peerIds);\r\n if(splitted.chats.length) {\r\n rules.push({_: chatKey, chats: splitted.chats});\r\n }\r\n \r\n if(splitted.users.length) {\r\n rules.push({_: usersKey, users: splitted.users.map(id => appUsersManager.getUserInput(id))});\r\n }\r\n }\r\n });\r\n }\r\n \r\n appPrivacyManager.setPrivacy(options.inputKey, rules);\r\n }, {once: true});\r\n });\r\n }\r\n\r\n private onRadioChange = (value: string | PrivacySection['type']) => {\r\n value = +value as PrivacySection['type'];\r\n this.type = value;\r\n\r\n const caption = this.options.captions[this.type];\r\n const captionElement = this.radioSection.caption;\r\n if(!caption) {\r\n captionElement.innerHTML = '';\r\n } else {\r\n _i18n(captionElement, caption);\r\n }\r\n captionElement.classList.toggle('hide', !caption);\r\n\r\n if(this.exceptions) {\r\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\r\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\r\n }\r\n\r\n this.options.onRadioChange && this.options.onRadioChange(value);\r\n };\r\n\r\n public setRadio(type: PrivacySection['type']) {\r\n const row = this.radioRows.get(type);\r\n this.onRadioChange(type);\r\n row.radioField.input.checked = true;\r\n }\r\n \r\n private splitPeersByType(peerIds: PeerId[]) {\r\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\r\n peerIds.forEach(peerId => {\r\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\r\n });\r\n\r\n return peers;\r\n }\r\n\r\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\r\n if(!peers.users.length && !peers.chats.length) {\r\n return [i18n('PrivacySettingsController.AddUsers')];\r\n }\r\n\r\n return join([\r\n peers.users.length ? i18n('Users', [peers.users.length]) : null, \r\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\r\n ].filter(Boolean), false);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\r\n this.setTitle('PrivacyPhone');\r\n\r\n const phoneCaption: LangPackKey = 'PrivacyPhoneInfo';\r\n const phoneSection = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle',\r\n inputKey: 'inputPrivacyKeyPhoneNumber',\r\n captions: [phoneCaption, phoneCaption, ''],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n onRadioChange: (type) => {\r\n s.setRadio(PrivacyType.Everybody);\r\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\r\n }\r\n });\r\n\r\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\r\n const s = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle2',\r\n inputKey: 'inputPrivacyKeyAddedByPhone',\r\n captions: [sCaption, sCaption, ''],\r\n noExceptions: true,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n\r\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport AppSettingsTab from \"../settings\";\r\n\r\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\r\n this.setTitle('TwoStepVerificationPasswordSet');\r\n\r\n const section = new SettingSection({\r\n caption: 'TwoStepVerificationPasswordSetInfo',\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🥳';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: true,\r\n play: true,\r\n width: 160,\r\n height: 160\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\r\n\r\n attachClickEvent(btnReturn, (e) => {\r\n this.close();\r\n });\r\n\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n\r\n inputWrapper.append(btnReturn);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\n\r\nexport function canFocus(isFirstInput: boolean) {\r\n return !IS_MOBILE_SAFARI || !isFirstInput;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport CodeInputField from \"../../../codeInputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport { i18n, _i18n } from \"../../../../lib/langPack\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\r\n public codeInputField: CodeInputField;\r\n public state: AccountPassword;\r\n public email: string;\r\n public length: number;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\r\n this.setTitle('TwoStepAuth.RecoveryTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\r\n\r\n const emoji = '📬';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.codeInputField = new CodeInputField({\r\n name: 'recovery-email-code',\r\n label: 'TwoStepAuth.RecoveryCode',\r\n length: this.length,\r\n onFill: (code) => {\r\n freeze(true);\r\n \r\n passwordManager.confirmPasswordEmail('' + code)\r\n .then(value => {\r\n if(!value) {\r\n\r\n }\r\n\r\n goNext();\r\n })\r\n .catch(err => {\r\n switch(err.type) {\r\n case 'CODE_INVALID':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\r\n break;\r\n\r\n case 'EMAIL_HASH_EXPIRED':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\r\n break;\r\n \r\n default:\r\n console.error('confirm error', err);\r\n break;\r\n }\r\n\r\n freeze(false);\r\n });\r\n }\r\n });\r\n\r\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\r\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\r\n\r\n const goNext = () => {\r\n new AppTwoStepVerificationSetTab(this.slider).open();\r\n };\r\n\r\n const freeze = (disable: boolean) => {\r\n toggleDisability([inputField.input, btnChange, btnResend], disable);\r\n };\r\n\r\n attachClickEvent(btnChange, (e) => {\r\n freeze(true);\r\n passwordManager.cancelPasswordEmail().then(value => {\r\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\r\n this.close();\r\n }, () => {\r\n freeze(false);\r\n });\r\n });\r\n\r\n attachClickEvent(btnResend, (e) => {\r\n freeze(true);\r\n const d = putPreloader(btnResend);\r\n passwordManager.resendPasswordEmail().then(value => {\r\n d.remove();\r\n freeze(false);\r\n });\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnChange, btnResend);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.codeInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport InputField from \"../../../inputField\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./emailConfirmation\";\r\nimport RichTextProcessor from \"../../../../lib/richtextprocessor\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n public hint: string;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\r\n this.setTitle('RecoveryEmailTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💌';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'recovery-email',\r\n label: 'RecoveryEmail',\r\n plainText: true\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n inputField.input.addEventListener('input', (e) => {\r\n inputField.input.classList.remove('error');\r\n });\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const goNext = () => {\r\n new AppTwoStepVerificationSetTab(this.slider).open();\r\n };\r\n\r\n const onContinueClick = () => {\r\n const email = inputField.value.trim();\r\n const match = RichTextProcessor.matchEmail(email);\r\n if(!match || match[0].length !== email.length) {\r\n inputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n toggleButtons(true);\r\n const d = putPreloader(btnContinue);\r\n\r\n passwordManager.updateSettings({\r\n hint: this.hint,\r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email\r\n }).then((value) => {\r\n goNext();\r\n }, (err) => {\r\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\r\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\r\n\r\n const tab = new AppTwoStepVerificationEmailConfirmationTab(this.slider);\r\n tab.state = this.state;\r\n tab.email = email;\r\n tab.length = symbols;\r\n tab.open();\r\n } else {\r\n console.log('password set error', err);\r\n }\r\n\r\n toggleButtons(false);\r\n d.remove();\r\n });\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n const toggleButtons = (freeze: boolean) => {\r\n if(freeze) {\r\n btnContinue.setAttribute('disabled', 'true');\r\n btnSkip.setAttribute('disabled', 'true');\r\n } else {\r\n btnContinue.removeAttribute('disabled');\r\n btnSkip.removeAttribute('disabled');\r\n }\r\n };\r\n\r\n attachClickEvent(btnSkip, (e) => {\r\n const popup = new PopupPeer('popup-skip-email', {\r\n buttons: [{\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }, {\r\n langKey: 'YourEmailSkip',\r\n callback: () => {\r\n //inputContent.classList.add('sidebar-left-section-disabled');\r\n toggleButtons(true);\r\n putPreloader(btnSkip);\r\n passwordManager.updateSettings({\r\n hint: this.hint, \r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email: ''\r\n }).then(() => {\r\n goNext();\r\n }, (err) => {\r\n toggleButtons(false);\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'YourEmailSkipWarning',\r\n descriptionLangKey: 'YourEmailSkipWarningText'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport InputField from \"../../../inputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { toast } from \"../../../toast\";\r\nimport I18n from \"../../../../lib/langPack\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\r\n this.setTitle('TwoStepAuth.SetupHintTitle');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💡';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'hint',\r\n label: 'TwoStepAuth.SetupHintPlaceholder'\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return inputField.value ? onContinueClick() : onSkipClick();\r\n }\r\n });\r\n\r\n const goNext = (e?: Event, saveHint?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n const hint = saveHint ? inputField.value : undefined;\r\n if(hint && this.newPassword === hint) {\r\n toast(I18n.format('PasswordAsHintError', true));\r\n return;\r\n }\r\n\r\n const tab = new AppTwoStepVerificationEmailTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.hint = hint;\r\n\r\n tab.open();\r\n };\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const onContinueClick = (e?: Event) => goNext(e, true);\r\n const onSkipClick = (e?: Event) => goNext(e, false);\r\n attachClickEvent(btnContinue, onContinueClick);\r\n attachClickEvent(btnSkip, onSkipClick);\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n section.content.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport TrackingMonkey from \"../../../monkeys/tracking\";\r\nimport AppTwoStepVerificationHintTab from \"./hint\";\r\nimport { InputState } from \"../../../inputField\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\r\n this.setTitle('PleaseReEnterPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 're-enter-password',\r\n label: 'PleaseReEnterPassword'\r\n });\r\n\r\n const monkey = new TrackingMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.setState(InputState.Neutral);\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(this.newPassword !== passwordInputField.value) {\r\n passwordInputField.setError();\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const onContinueClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = new AppTwoStepVerificationHintTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.open();\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n \r\n onOpenAfterTimeout() {\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AppTwoStepVerificationTab from \".\";\r\nimport { SettingSection } from \"../..\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport I18n, { i18n } from \"../../../../lib/langPack\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport RichTextProcessor from \"../../../../lib/richtextprocessor\";\r\nimport Button from \"../../../button\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport PasswordMonkey from \"../../../monkeys/password\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport AppTwoStepVerificationReEnterPasswordTab from \"./reEnterPassword\";\r\n\r\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public isFirst = true;\r\n \r\n protected init() {\r\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\r\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 'enter-password',\r\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\r\n labelText: !isNew && this.state.hint ? RichTextProcessor.wrapEmojiText(this.state.hint) : undefined\r\n });\r\n\r\n const monkey = new PasswordMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary');\r\n const textEl = new I18n.IntlElement({key: 'Continue'});\r\n\r\n btnContinue.append(textEl.element);\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.input.classList.remove('error');\r\n textEl.key = 'Continue';\r\n textEl.update();\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(!passwordInputField.value.length) {\r\n passwordInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n let onContinueClick: (e?: Event) => void;\r\n if(!isNew) {\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n \r\n return passwordManager.getState().then(_state => {\r\n this.state = _state;\r\n \r\n if(this.state.hint) {\r\n passwordInputField.label.innerHTML = RichTextProcessor.wrapEmojiText(this.state.hint);\r\n } else {\r\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\r\n }\r\n });\r\n };\r\n \r\n const submit = (e?: Event) => {\r\n if(!verifyInput()) {\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n btnContinue.setAttribute('disabled', 'true');\r\n textEl.key = 'PleaseWait';\r\n textEl.update();\r\n const preloader = putPreloader(btnContinue);\r\n \r\n const plainPassword = passwordInputField.value;\r\n passwordManager.check(passwordInputField.value, this.state).then(auth => {\r\n console.log(auth);\r\n \r\n if(auth._ === 'auth.authorization') {\r\n clearInterval(getStateInterval);\r\n if(monkey) monkey.remove();\r\n const tab = new AppTwoStepVerificationTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = plainPassword;\r\n tab.open();\r\n this.slider.removeTabFromHistory(this);\r\n }\r\n }, (err) => {\r\n btnContinue.removeAttribute('disabled');\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnContinue.innerText = err.type;\r\n textEl.key = 'TwoStepAuth.InvalidPassword';\r\n textEl.update();\r\n preloader.remove();\r\n passwordInputField.select();\r\n break;\r\n }\r\n \r\n getState();\r\n });\r\n };\r\n \r\n onContinueClick = submit;\r\n\r\n getState();\r\n } else {\r\n onContinueClick = (e) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = new AppTwoStepVerificationReEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.newPassword = passwordInputField.value;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n };\r\n }\r\n\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport { _i18n } from \"../../../../lib/langPack\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport Button from \"../../../button\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport AppSettingsTab from \"../settings\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./enterPassword\";\r\n\r\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\r\n this.setTitle('TwoStepVerificationTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🔐';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 168,\r\n height: 168,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const c = section.generateContentElement();\r\n if(this.state.pFlags.has_password) {\r\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\r\n\r\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\r\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\r\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\r\n\r\n attachClickEvent(btnChangePassword, () => {\r\n const tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n });\r\n\r\n attachClickEvent(btnDisablePassword, () => {\r\n const popup = new PopupPeer('popup-disable-password', {\r\n buttons: [{\r\n langKey: 'Disable',\r\n callback: () => {\r\n passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n this.close();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'TurnPasswordOffQuestionTitle',\r\n descriptionLangKey: 'TurnPasswordOffQuestion'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n attachClickEvent(btnSetRecoveryEmail, () => {\r\n const tab = new AppTwoStepVerificationEmailTab(this.slider);\r\n tab.state = this.state;\r\n tab.hint = this.state.hint;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.plainPassword;\r\n tab.isFirst = true;\r\n tab.open();\r\n });\r\n\r\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\r\n } else {\r\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\r\n \r\n inputWrapper.append(btnSetPassword);\r\n c.append(inputWrapper);\r\n\r\n attachClickEvent(btnSetPassword, (e) => {\r\n const tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.open();\r\n });\r\n }\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\r\n this.setTitle('PrivacyLastSeen');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'LastSeenTitle',\r\n inputKey: 'inputPrivacyKeyStatusTimestamp',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\r\n this.setTitle('PrivacyProfilePhoto');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyProfilePhotoTitle',\r\n inputKey: 'inputPrivacyKeyProfilePhoto',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\r\n this.setTitle('PrivacySettings.Forwards');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyForwardsTitle',\r\n inputKey: 'inputPrivacyKeyForwards',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\n\r\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\r\n this.setTitle('PrivacySettings.Groups');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanAddMe',\r\n inputKey: 'inputPrivacyKeyChatInvite',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.container.classList.add('privacy-tab', 'privacy-calls');\r\n this.setTitle('PrivacySettings.VoiceCalls');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanCallMe',\r\n inputKey: 'inputPrivacyKeyPhoneCall',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n\r\n {\r\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyP2PHeader',\r\n inputKey: 'inputPrivacyKeyPhoneP2P',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport Button from \"../../button\";\r\nimport Row from \"../../row\";\r\nimport { Authorization } from \"../../../layer\";\r\nimport { formatDateAccordingToTodayNew } from \"../../../helpers/date\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../../misc\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport { toast } from \"../../toast\";\r\nimport AppPrivacyAndSecurityTab from \"./privacyAndSecurity\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppActiveSessionsTab extends SliderSuperTab {\r\n public privacyTab: AppPrivacyAndSecurityTab;\r\n public authorizations: Authorization.authorization[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\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 });\r\n\r\n const auth = authorizations.findAndSplice(auth => auth.pFlags.current);\r\n const session = Session(auth);\r\n\r\n section.content.append(session.container);\r\n\r\n if(authorizations.length) {\r\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\r\n attachClickEvent(btnTerminate, (e) => {\r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n const toggle = toggleDisability([btnTerminate], true);\r\n apiManager.invokeApi('auth.resetAuthorizations').then(value => {\r\n //toggleDisability([btnTerminate], false);\r\n btnTerminate.remove();\r\n otherSection.container.remove();\r\n this.privacyTab.updateActiveSessions();\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 });\r\n\r\n authorizations.forEach(auth => {\r\n otherSection.content.append(Session(auth).container);\r\n });\r\n\r\n this.scrollable.append(otherSection.container);\r\n\r\n const onError = (err: any) => {\r\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\r\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\r\n }\r\n };\r\n\r\n let target: HTMLElement;\r\n const onTerminateClick = () => {\r\n const hash = target.dataset.hash;\r\n \r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n apiManager.invokeApi('account.resetAuthorization', {hash})\r\n .then(value => {\r\n if(value) {\r\n target.remove();\r\n this.privacyTab.updateActiveSessions();\r\n }\r\n }, onError);\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionTitle',\r\n descriptionLangKey: 'TerminateSessionText'\r\n }).show();\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'stop',\r\n text: 'Terminate',\r\n onClick: onTerminateClick\r\n }]);\r\n element.id = 'active-sessions-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n openBtnMenu(element);\r\n });\r\n\r\n attachClickEvent(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n onTerminateClick();\r\n });\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../../misc\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport PopupPickUser from \"../../popups/pickUser\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppBlockedUsersTab extends SliderSuperTab {\r\n public peerIds: PeerId[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.container.classList.add('blocked-users-container');\r\n this.setTitle('BlockedUsers');\r\n\r\n {\r\n const section = new SettingSection({\r\n caption: 'BlockedUsersInfo'\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\r\n this.content.append(btnAdd);\r\n\r\n attachClickEvent(btnAdd, (e) => {\r\n new PopupPickUser({\r\n peerTypes: ['contacts'],\r\n placeholder: 'BlockModal.Search.Placeholder',\r\n onSelect: (peerId) => {\r\n //console.log('block', peerId);\r\n appUsersManager.toggleBlock(peerId, true);\r\n },\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const list = appDialogsManager.createChatList();\r\n this.scrollable.container.classList.add('chatlist-container');\r\n this.scrollable.append(list);\r\n\r\n const add = (peerId: PeerId, append: boolean) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: list,\r\n drawStatus: false,\r\n rippleEnabled: true,\r\n avatarSize: 48,\r\n append\r\n });\r\n\r\n const user = appUsersManager.getUser(peerId);\r\n if(user.pFlags.bot) {\r\n dom.lastMessageSpan.append('@' + user.username);\r\n } else {\r\n if(user.phone) dom.lastMessageSpan.innerHTML = appUsersManager.formatUserPhone(user.phone);\r\n else dom.lastMessageSpan.append(user.username ? '@' + user.username : appUsersManager.getUserStatusString(peerId));\r\n }\r\n\r\n //dom.titleSpan.innerHTML = 'Raaid El Syed';\r\n //dom.lastMessageSpan.innerHTML = '+1 234 567891';\r\n };\r\n\r\n for(const peerId of this.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n let target: HTMLElement;\r\n const onUnblock = () => {\r\n const peerId = target.dataset.peerId.toPeerId();\r\n appUsersManager.toggleBlock(peerId, false);\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'lockoff',\r\n text: 'Unblock',\r\n onClick: onUnblock,\r\n options: {listenerSetter: this.listenerSetter}\r\n }]);\r\n element.id = 'blocked-users-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpTag(e.target, 'LI');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n openBtnMenu(element);\r\n }, this.listenerSetter);\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\r\n const {peerId, blocked} = update;\r\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\r\n if(blocked) {\r\n if(!li) {\r\n add(peerId, false);\r\n }\r\n } else {\r\n if(li) {\r\n li.remove();\r\n }\r\n }\r\n });\r\n\r\n const LOAD_COUNT = 50;\r\n let loading = false;\r\n this.scrollable.onScrolledBottom = () => {\r\n if(loading) {\r\n return;\r\n }\r\n\r\n loading = true;\r\n appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then(res => {\r\n for(const peerId of res.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\r\n this.scrollable.onScrolledBottom = null;\r\n }\r\n\r\n this.scrollable.checkForTriggers();\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.scrollable.onScroll();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport { AccountPassword, Authorization, InputPrivacyKey, Updates } from \"../../../layer\";\r\nimport appPrivacyManager, { PrivacyType } from \"../../../lib/appManagers/appPrivacyManager\";\r\nimport AppPrivacyPhoneNumberTab from \"./privacy/phoneNumber\";\r\nimport AppTwoStepVerificationTab from \"./2fa\";\r\nimport passwordManager from \"../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./2fa/enterPassword\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./2fa/emailConfirmation\";\r\nimport AppPrivacyLastSeenTab from \"./privacy/lastSeen\";\r\nimport AppPrivacyProfilePhotoTab from \"./privacy/profilePhoto\";\r\nimport AppPrivacyForwardMessagesTab from \"./privacy/forwardMessages\";\r\nimport AppPrivacyAddToGroupsTab from \"./privacy/addToGroups\";\r\nimport AppPrivacyCallsTab from \"./privacy/calls\";\r\nimport AppActiveSessionsTab from \"./activeSessions\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport AppBlockedUsersTab from \"./blockedUsers\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { convertKeyToInputKey } from \"../../../helpers/string\";\r\nimport { i18n, LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport appDraftsManager from \"../../../lib/appManagers/appDraftsManager\";\r\nimport Button from \"../../button\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\r\n private activeSessionsRow: Row;\r\n private authorizations: Authorization.authorization[];\r\n\r\n protected init() {\r\n this.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});\r\n\r\n let blockedPeerIds: PeerId[];\r\n const blockedUsersRow = new Row({\r\n icon: 'deleteuser',\r\n titleLangKey: 'BlockedUsers',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = new AppBlockedUsersTab(this.slider);\r\n tab.peerIds = blockedPeerIds;\r\n tab.open();\r\n }\r\n });\r\n blockedUsersRow.freezed = true;\r\n\r\n let passwordState: AccountPassword;\r\n const twoFactorRowOptions = {\r\n icon: 'lock',\r\n titleLangKey: 'TwoStepVerification' as LangPackKey,\r\n subtitleLangKey: SUBTITLE,\r\n clickable: (e: Event) => {\r\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\r\n if(passwordState.pFlags.has_password) {\r\n tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n } else if(passwordState.email_unconfirmed_pattern) {\r\n tab = new AppTwoStepVerificationEmailConfirmationTab(this.slider);\r\n tab.email = passwordState.email_unconfirmed_pattern;\r\n tab.length = 6;\r\n tab.isFirst = true;\r\n passwordManager.resendPasswordEmail();\r\n } else {\r\n tab = new AppTwoStepVerificationTab(this.slider);\r\n }\r\n \r\n tab.state = passwordState;\r\n tab.open();\r\n }\r\n };\r\n \r\n const twoFactorRow = new Row(twoFactorRowOptions);\r\n twoFactorRow.freezed = true;\r\n\r\n const activeSessionsRow = this.activeSessionsRow = new Row({\r\n icon: 'activesessions',\r\n titleLangKey: 'SessionsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = new AppActiveSessionsTab(this.slider);\r\n tab.privacyTab = this;\r\n tab.authorizations = this.authorizations;\r\n tab.open();\r\n }\r\n });\r\n activeSessionsRow.freezed = true;\r\n\r\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n const setBlockedCount = (count: number) => {\r\n if(count) {\r\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\r\n } else {\r\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\r\n }\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', () => {\r\n /* const {blocked, peerId} = update;\r\n if(!blocked) blockedPeerIds.findAndSplice(p => p === peerId);\r\n else blockedPeerIds.unshift(peerId);\r\n blockedCount += blocked ? 1 : -1;\r\n setBlockedCount(blockedCount); */\r\n updateBlocked();\r\n });\r\n\r\n const updateBlocked = () => {\r\n appUsersManager.getBlocked().then(res => {\r\n blockedUsersRow.freezed = false;\r\n setBlockedCount(res.count);\r\n blockedPeerIds = res.peerIds;\r\n });\r\n };\r\n\r\n updateBlocked();\r\n\r\n passwordManager.getState().then(state => {\r\n passwordState = state;\r\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\r\n twoFactorRow.freezed = false;\r\n \r\n //console.log('password state', state);\r\n });\r\n\r\n this.updateActiveSessions();\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'PrivacyTitle'});\r\n\r\n section.content.classList.add('privacy-navigation-container');\r\n\r\n const rowsByKeys: Partial<{\r\n [key in InputPrivacyKey['_']]: Row\r\n }> = {};\r\n\r\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\r\n titleLangKey: 'PrivacyPhoneTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyPhoneNumberTab(this.slider).open();\r\n }\r\n });\r\n\r\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\r\n titleLangKey: 'LastSeenTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyLastSeenTab(this.slider).open();\r\n }\r\n });\r\n\r\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\r\n titleLangKey: 'PrivacyProfilePhotoTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyProfilePhotoTab(this.slider).open();\r\n }\r\n });\r\n\r\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\r\n titleLangKey: 'WhoCanCallMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyCallsTab(this.slider).open();\r\n }\r\n });\r\n\r\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\r\n titleLangKey: 'PrivacyForwardsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyForwardMessagesTab(this.slider).open();\r\n }\r\n });\r\n\r\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\r\n titleLangKey: 'WhoCanAddMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyAddToGroupsTab(this.slider).open();\r\n }\r\n });\r\n\r\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\r\n const row = rowsByKeys[key];\r\n if(!row) {\r\n return;\r\n }\r\n\r\n appPrivacyManager.getPrivacy(key).then(rules => {\r\n const details = appPrivacyManager.getPrivacyRulesDetails(rules);\r\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\r\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\r\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\r\n\r\n row.subtitle.innerHTML = '';\r\n const s = i18n(langKey);\r\n row.subtitle.append(s);\r\n if(disallowLength || allowLength) {\r\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\r\n }\r\n });\r\n };\r\n\r\n section.content.append(numberVisibilityRow.container, lastSeenTimeRow.container, photoVisibilityRow.container, callRow.container, linkAccountRow.container, groupChatsAddRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n for(const key in rowsByKeys) {\r\n updatePrivacyRow(key as keyof typeof rowsByKeys);\r\n }\r\n\r\n rootScope.addEventListener('privacy_update', (update) => {\r\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\r\n });\r\n }\r\n\r\n const promises: Promise[] = [];\r\n {\r\n const section = new SettingSection({name: 'Privacy.SensitiveContent'});\r\n section.container.classList.add('hide');\r\n\r\n promises.push(apiManager.invokeApi('account.getContentSettings').then(settings => {\r\n if(!settings.pFlags.sensitive_can_change) {\r\n return;\r\n }\r\n \r\n const enabled = settings.pFlags.sensitive_enabled;\r\n\r\n const sensitiveRow = new Row({\r\n checkboxField: new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText', checked: enabled}),\r\n subtitleLangKey: 'PrivacyAndSecurity.SensitiveDesc',\r\n noCheckboxSubtitle: true\r\n });\r\n \r\n section.content.append(sensitiveRow.container);\r\n section.container.classList.remove('hide');\r\n \r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = sensitiveRow.checkboxField.checked;\r\n const isChanged = _enabled !== enabled;\r\n if(!isChanged) {\r\n return;\r\n }\r\n \r\n apiManager.invokeApi('account.setContentSettings', {\r\n sensitive_enabled: _enabled\r\n });\r\n }, {once: true});\r\n }));\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'FilterChats'});\r\n\r\n const onDeleteClick = () => {\r\n const popup = new PopupPeer('popup-delete-drafts', {\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([deleteButton], true);\r\n appDraftsManager.clearAllDrafts().then(() => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'AreYouSureClearDraftsTitle',\r\n descriptionLangKey: 'AreYouSureClearDrafts'\r\n });\r\n \r\n popup.show();\r\n };\r\n\r\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\r\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\r\n section.content.append(deleteButton);\r\n\r\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then(drafts => {\r\n const draftsRow = new Row({\r\n titleLangKey: 'PrivacyDeleteCloudDrafts',\r\n subtitleLangKey: 'Drafts',\r\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\r\n icon: 'delete',\r\n clickable: onDeleteClick\r\n });\r\n \r\n section.content.append(draftsRow.container);\r\n })); */\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public updateActiveSessions() {\r\n apiManager.invokeApi('account.getAuthorizations').then(auths => {\r\n this.activeSessionsRow.freezed = false;\r\n this.authorizations = auths.authorizations;\r\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\r\n //console.log('auths', auths);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type ColorHsla = {\r\n h: number,\r\n s: number,\r\n l: number,\r\n a: number\r\n};\r\n\r\nexport type ColorRgba = [number, number, number, number];\r\nexport type ColorRgb = [number, number, number];\r\n\r\n/**\r\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\r\n */\r\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\r\n r /= 255, g /= 255, b /= 255;\r\n const max = Math.max(r, g, b),\r\n min = Math.min(r, g, b);\r\n let h, s, l = (max + min) / 2;\r\n\r\n if(max === min) {\r\n h = s = 0; // achromatic\r\n } else {\r\n let d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max) {\r\n case r:\r\n h = (g - b) / d + (g < b ? 6 : 0);\r\n break;\r\n case g:\r\n h = (b - r) / d + 2;\r\n break;\r\n case b:\r\n h = (r - g) / d + 4;\r\n break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n return {\r\n h: h * 360,\r\n s: s * 100,\r\n l: l * 100,\r\n a\r\n };\r\n}\r\n\r\n// * https://stackoverflow.com/a/9493060/6758968\r\n/**\r\n * Converts an HSL color value to RGB. Conversion formula\r\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\r\n * Assumes h in [0, 360], s, and l are contained in the set [0, 1], a in [0, 1] and\r\n * returns r, g, and b in the set [0, 255].\r\n *\r\n * @param {number} h The hue\r\n * @param {number} s The saturation\r\n * @param {number} l The lightness\r\n * @return {Array} The RGB representation\r\n */\r\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\r\n h /= 360, s /= 100, l /= 100;\r\n let r: number, g: number, b: number;\r\n\r\n if(s === 0) {\r\n r = g = b = l; // achromatic\r\n } else {\r\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\r\n if(t < 0) t += 1;\r\n if(t > 1) t -= 1;\r\n if(t < 1/6) return p + (q - p) * 6 * t;\r\n if(t < 1/2) return q;\r\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n }\r\n\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1/3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1/3);\r\n }\r\n\r\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), Math.round(a * 255)];\r\n}\r\n\r\nexport function hslaStringToRgba(hsla: string) {\r\n const splitted = hsla.slice(5, -1).split(', ');\r\n const alpha = +splitted.pop();\r\n const arr = splitted.map((val) => {\r\n if(val.endsWith('%')) {\r\n return +val.slice(0, -1);\r\n }\r\n \r\n return +val;\r\n });\r\n\r\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\r\n}\r\n\r\nexport function hexaToRgba(hexa: string) {\r\n const arr: ColorRgba = [] as any;\r\n const offset = 1;\r\n if(hexa.length === (3 + offset)) {\r\n for(let i = offset; i < hexa.length; ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n } else if(hexa.length === (4 + offset)) {\r\n for(let i = offset; i < (hexa.length - 1); ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n\r\n arr.push(parseInt(hexa[hexa.length - 1], 16));\r\n } else {\r\n for(let i = offset; i < hexa.length; i += 2) {\r\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\nexport function hexToRgb(hex: string) {\r\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\r\n}\r\n\r\nexport function hexaToHsla(hexa: string) {\r\n const rgba = hexaToRgba(hexa);\r\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\r\n}\r\n\r\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\r\n return '#' + rgba.map(v => ('0' + v.toString(16)).slice(-2)).join('');\r\n}\r\n\r\nexport function hslaStringToHexa(hsla: string) {\r\n return rgbaToHexa(hslaStringToRgba(hsla));\r\n}\r\n\r\nexport function hslaStringToHex(hsla: string) {\r\n return hslaStringToHexa(hsla).slice(0, -2);\r\n}\r\n","import { rgbaToHsla } from \"./color\";\r\n\r\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\r\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\r\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\r\n if(s > 0) {\r\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\r\n }\r\n l = Math.max(0, l * .65);\r\n \r\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\r\n return hsla;\r\n}\r\n","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\";\r\nimport InputField, { InputState } from \"./inputField\";\r\n\r\nexport type ColorPickerColor = { \r\n hsl: string; \r\n rgb: string; \r\n hex: string; \r\n hsla: string; \r\n rgba: string; \r\n hexa: string; \r\n rgbaArray: ColorRgba; \r\n};\r\n\r\nexport default class ColorPicker {\r\n private static BASE_CLASS = 'color-picker';\r\n public container: HTMLElement;\r\n\r\n private boxRect: DOMRect;\r\n //private boxDraggerRect: DOMRect;\r\n private hueRect: DOMRect;\r\n //private hueDraggerRect: DOMRect;\r\n\r\n\tprivate hue = 0;\r\n\tprivate saturation = 100;\r\n\tprivate lightness = 50;\r\n\tprivate alpha = 1;\r\n private elements: {\r\n box: SVGSVGElement,\r\n boxDragger: SVGSVGElement,\r\n sliders: HTMLElement,\r\n hue: SVGSVGElement,\r\n hueDragger: SVGSVGElement,\r\n saturation: SVGLinearGradientElement,\r\n } = {} as any;\r\n private hexInputField: InputField;\r\n private rgbInputField: InputField;\r\n public onChange: (color: ReturnType) => void;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add(ColorPicker.BASE_CLASS);\r\n\r\n const html = `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n\r\n this.container.innerHTML = html;\r\n\r\n this.elements.box = this.container.firstElementChild as any;\r\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\r\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\r\n\r\n this.elements.sliders = this.elements.box.nextElementSibling as any;\r\n\r\n this.elements.hue = this.elements.sliders.firstElementChild as any;\r\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\r\n\r\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\r\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\r\n\r\n const inputs = document.createElement('div');\r\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\r\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\r\n this.container.append(inputs);\r\n\r\n this.hexInputField.input.addEventListener('input', () => {\r\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\r\n\r\n const match = value.match(/([a-fA-F\\d]+)/);\r\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\r\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\r\n\r\n value = '#' + value;\r\n this.hexInputField.setValueSilently(value);\r\n \r\n if(valid) {\r\n this.setColor(value, false, true);\r\n }\r\n });\r\n\r\n // patched https://stackoverflow.com/a/34029238/6758968\r\n const rgbRegExp = /^(?:rgb)?\\(?([01]?\\d\\d?|2[0-4]\\d|25[0-5])(?:\\W+)([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\W+(?:([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\)?)$/;\r\n this.rgbInputField.input.addEventListener('input', () => {\r\n const match = this.rgbInputField.value.match(rgbRegExp);\r\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\r\n\r\n if(match) {\r\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\r\n }\r\n });\r\n\r\n this.attachBoxListeners();\r\n this.attachHueListeners();\r\n }\r\n\r\n private onGrabStart = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\r\n };\r\n\r\n private onGrabEnd = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\r\n };\r\n\r\n private attachBoxListeners() {\r\n attachGrabListeners(this.elements.box as any, () => {\r\n this.onGrabStart();\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n //this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.saturationHandler(pos.x, pos.y);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n private attachHueListeners() {\r\n attachGrabListeners(this.elements.hue as any, () => {\r\n this.onGrabStart();\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n //this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.hueHandler(pos.x);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\r\n if(color === undefined) { // * set to red\r\n color = {\r\n h: 0,\r\n s: 100,\r\n l: 50,\r\n a: 1\r\n };\r\n } else if(typeof(color) === 'string') {\r\n if(color[0] === '#') {\r\n color = hexaToHsla(color);\r\n } else {\r\n const rgb = color.match(/[.?\\d]+/g);\r\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\r\n }\r\n }\r\n\r\n // Set box\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n\r\n const boxX = this.boxRect.width / 100 * color.s;\r\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\r\n const boxY = this.boxRect.height / 100 * percentY;\r\n\r\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\r\n\r\n // Set hue\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n\r\n const percentHue = color.h / 360;\r\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\r\n\r\n this.hueHandler(hueX, false);\r\n\r\n // Set values\r\n this.hue = color.h;\r\n this.saturation = color.s;\r\n this.lightness = color.l;\r\n this.alpha = color.a;\r\n\r\n this.updatePicker(updateHexInput, updateRgbInput);\r\n };\r\n\r\n public getCurrentColor(): ColorPickerColor {\r\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\r\n const hexa = rgbaToHexa(rgbaArray);\r\n const hex = hexa.slice(0, -2);\r\n\r\n return {\r\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\r\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\r\n hex: hex,\r\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\r\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\r\n hexa: hexa,\r\n rgbaArray: rgbaArray\r\n };\r\n }\r\n\r\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\r\n const color = this.getCurrentColor();\r\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\r\n\r\n if(updateHexInput) {\r\n this.hexInputField.setValueSilently(color.hex);\r\n this.hexInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(updateRgbInput) {\r\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\r\n this.rgbInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.onChange) {\r\n this.onChange(color);\r\n }\r\n }\r\n\r\n private hueHandler(pageX: number, update = true) {\r\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\r\n\r\n const percents = eventX / this.hueRect.width;\r\n this.hue = Math.round(360 * percents);\r\n \r\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\r\n\r\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\r\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\r\n \r\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n }\r\n\r\n private saturationHandler(pageX: number, pageY: number, update = true) {\r\n const maxX = this.boxRect.width;\r\n const maxY = this.boxRect.height;\r\n\r\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\r\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\r\n\r\n const posX = eventX / maxX * 100;\r\n const posY = eventY / maxY * 100;\r\n \r\n const boxDragger = this.elements.boxDragger;\r\n boxDragger.setAttributeNS(null, 'x', posX + '%');\r\n boxDragger.setAttributeNS(null, 'y', posY + '%');\r\n\r\n const saturation = clamp(posX, 0, 100);\r\n\r\n const lightnessX = 100 - saturation / 2;\r\n const lightnessY = 100 - clamp(posY, 0, 100);\r\n\r\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\r\n\r\n this.saturation = saturation;\r\n this.lightness = lightness;\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport { hexaToRgba } from \"../../../helpers/color\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport throttle from \"../../../helpers/schedulers/throttle\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appStateManager, { Theme } from \"../../../lib/appManagers/appStateManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport ColorPicker, { ColorPickerColor } from \"../../colorPicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppBackgroundColorTab extends SliderSuperTab {\r\n private colorPicker: ColorPicker;\r\n private grid: HTMLElement;\r\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\r\n private theme: Theme;\r\n\r\n init() {\r\n this.container.classList.add('background-container', 'background-color-container');\r\n this.setTitle('SetColor');\r\n\r\n this.theme = rootScope.getTheme();\r\n\r\n const section = new SettingSection({});\r\n this.colorPicker = new ColorPicker();\r\n\r\n section.content.append(this.colorPicker.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const 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 this.scrollable.append(grid);\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.type === '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.color = hex.toLowerCase();\r\n background.type = 'color';\r\n background.highlightningColor = hsla;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n \r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.setActive();\r\n }\r\n };\r\n\r\n private onColorChange = (color: ColorPickerColor) => {\r\n this.applyColor(color.hex, false);\r\n };\r\n\r\n onOpen() {\r\n setTimeout(() => {\r\n const background = this.theme.background;\r\n\r\n // * set active if type is color\r\n if(background.type === 'color') {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n\r\n this.colorPicker.setColor(background.color || '#cccccc');\r\n \r\n if(background.type !== 'color') {\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 } from \"../../../helpers/averageColor\";\r\nimport blur from \"../../../helpers/blur\";\r\nimport { deferredPromise } from \"../../../helpers/cancellablePromise\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { requestFile } from \"../../../helpers/files\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport { copy } from \"../../../helpers/object\";\r\nimport sequentialDom from \"../../../helpers/sequentialDom\";\r\nimport { AccountWallPapers, PhotoSize, WallPaper } from \"../../../layer\";\r\nimport appDocsManager, { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager from \"../../../lib/appManagers/appDownloadManager\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appPhotosManager from \"../../../lib/appManagers/appPhotosManager\";\r\nimport appStateManager, { Theme, STATE_INIT } from \"../../../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport ProgressivePreloader from \"../../preloader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { wrapPhoto } from \"../../wrappers\";\r\nimport AppBackgroundColorTab from \"./backgroundColor\";\r\n\r\nlet uploadTempId = 0;\r\n\r\nexport default class AppBackgroundTab extends SliderSuperTab {\r\n private grid: HTMLElement;\r\n private tempId = 0;\r\n private theme: Theme;\r\n private clicked: Set = new Set();\r\n private blurCheckboxField: CheckboxField;\r\n\r\n init() {\r\n this.container.classList.add('background-container', 'background-image-container');\r\n this.setTitle('ChatBackground');\r\n\r\n this.theme = rootScope.getTheme();\r\n\r\n {\r\n const container = generateSection(this.scrollable);\r\n\r\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\r\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\r\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\r\n\r\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(colorButton, () => {\r\n new AppBackgroundColorTab(this.slider).open();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\r\n\r\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\r\n text: 'ChatBackground.Blur', \r\n name: 'blur', \r\n checked: this.theme.background.blur,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(blurCheckboxField.input)('change', () => {\r\n this.theme.background.blur = blurCheckboxField.input.checked;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n const active = grid.querySelector('.active') as HTMLElement;\r\n if(!active) return;\r\n\r\n // * wait for animation end\r\n setTimeout(() => {\r\n this.setBackgroundDocument(active.dataset.slug, appDocsManager.getDoc(active.dataset.docId));\r\n }, 100);\r\n });\r\n\r\n container.append(uploadButton, colorButton, resetButton, blurCheckboxField.label);\r\n }\r\n\r\n rootScope.addEventListener('background_change', this.setActive);\r\n\r\n apiManager.invokeApiHashable('account.getWallPapers').then((accountWallpapers) => {\r\n const wallpapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers as WallPaper.wallPaper[];\r\n wallpapers.forEach((wallpaper) => {\r\n this.addWallPaper(wallpaper);\r\n });\r\n\r\n //console.log(accountWallpapers);\r\n });\r\n\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\r\n this.scrollable.append(grid);\r\n }\r\n\r\n private onUploadClick = () => {\r\n requestFile('image/x-png,image/png,image/jpeg').then(file => {\r\n const id = 'wallpaper-upload-' + ++uploadTempId;\r\n\r\n const thumb = {\r\n _: 'photoSize',\r\n h: 0,\r\n w: 0,\r\n location: {} as any,\r\n size: file.size,\r\n type: 'full',\r\n } as PhotoSize.photoSize;\r\n let document: MyDocument = {\r\n _: 'document',\r\n access_hash: '',\r\n attributes: [],\r\n dc_id: 0,\r\n file_reference: [],\r\n id,\r\n mime_type: file.type,\r\n size: file.size,\r\n date: Date.now() / 1000,\r\n pFlags: {},\r\n thumbs: [thumb],\r\n file_name: file.name\r\n };\r\n\r\n document = appDocsManager.saveDoc(document);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(document);\r\n cacheContext.downloaded = file.size;\r\n cacheContext.url = URL.createObjectURL(file);\r\n\r\n let wallpaper: WallPaper.wallPaper = {\r\n _: 'wallPaper',\r\n access_hash: '',\r\n document: document,\r\n id,\r\n slug: id,\r\n pFlags: {}\r\n };\r\n\r\n const upload = appDownloadManager.upload(file, file.name);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = upload.addNotifyListener;\r\n deferred.cancel = upload.cancel;\r\n\r\n upload.then(inputFile => {\r\n apiManager.invokeApi('account.uploadWallPaper', {\r\n file: inputFile,\r\n mime_type: file.type,\r\n settings: {\r\n _: 'wallPaperSettings'\r\n }\r\n }).then(_wallpaper => {\r\n const newDoc = (_wallpaper as WallPaper.wallPaper).document as MyDocument;\r\n const newCacheContext = appDownloadManager.getCacheContext(newDoc);\r\n Object.assign(newCacheContext, cacheContext);\r\n\r\n wallpaper = _wallpaper as WallPaper.wallPaper;\r\n wallpaper.document = appDocsManager.saveDoc(wallpaper.document);\r\n\r\n container.dataset.docId = '' + wallpaper.document.id;\r\n container.dataset.slug = wallpaper.slug;\r\n \r\n this.setBackgroundDocument(wallpaper.slug, wallpaper.document).then(deferred.resolve, deferred.reject);\r\n }, deferred.reject);\r\n }, deferred.reject);\r\n\r\n deferred.then(() => {\r\n this.clicked.delete(wallpaper.document.id);\r\n }, (err) => {\r\n container.remove();\r\n //console.error('i saw the body drop', err);\r\n });\r\n\r\n const preloader = new ProgressivePreloader({\r\n isUpload: true,\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const container = this.addWallPaper(wallpaper, false);\r\n this.clicked.add(wallpaper.document.id);\r\n\r\n preloader.attach(container, false, deferred);\r\n });\r\n };\r\n\r\n private onResetClick = () => {\r\n const defaultTheme = STATE_INIT.settings.themes.find(t => t.name === this.theme.name);\r\n if(defaultTheme) {\r\n ++this.tempId;\r\n this.theme.background = copy(defaultTheme.background);\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.blurCheckboxField.setValueSilently(this.theme.background.blur);\r\n }\r\n };\r\n\r\n private addWallPaper(wallpaper: WallPaper.wallPaper, append = true) {\r\n if(wallpaper.pFlags.pattern || \r\n !wallpaper.document || \r\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0) {\r\n return;\r\n }\r\n\r\n wallpaper.document = appDocsManager.saveDoc(wallpaper.document);\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('grid-item');\r\n\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n\r\n const wrapped = wrapPhoto({\r\n photo: wallpaper.document,\r\n message: null,\r\n container: media,\r\n withoutPreloader: true,\r\n size: appPhotosManager.choosePhotoSize(wallpaper.document, 200, 200)\r\n });\r\n\r\n container.dataset.docId = '' + wallpaper.document.id;\r\n container.dataset.slug = wallpaper.slug;\r\n\r\n if(this.theme.background.type === 'image' && this.theme.background.slug === wallpaper.slug) {\r\n container.classList.add('active');\r\n }\r\n\r\n (wrapped.loadPromises.thumb || wrapped.loadPromises.full).then(() => {\r\n sequentialDom.mutate(() => {\r\n container.append(media);\r\n });\r\n });\r\n\r\n 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 {docId, slug} = target.dataset;\r\n if(this.clicked.has(docId)) return;\r\n this.clicked.add(docId);\r\n\r\n const preloader = new ProgressivePreloader({\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n const load = () => {\r\n const promise = this.setBackgroundDocument(slug, doc);\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(!cacheContext.url || this.theme.background.blur) {\r\n preloader.attach(target, true, promise);\r\n }\r\n };\r\n\r\n preloader.construct();\r\n\r\n attachClickEvent(target, (e) => {\r\n if(preloader.preloader.parentElement) {\r\n preloader.onClick(e);\r\n preloader.detach();\r\n } else {\r\n load();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n load();\r\n\r\n //console.log(doc);\r\n };\r\n\r\n private saveToCache = (slug: string, url: string) => {\r\n fetch(url).then(response => {\r\n appDownloadManager.cacheStorage.save('backgrounds/' + slug, response);\r\n });\r\n };\r\n\r\n private setBackgroundDocument = (slug: string, doc: MyDocument) => {\r\n let _tempId = ++this.tempId;\r\n const middleware = () => _tempId === this.tempId;\r\n\r\n const download = appDocsManager.downloadDoc(doc, appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = download.addNotifyListener;\r\n deferred.cancel = download.cancel;\r\n\r\n download.then(() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n const background = this.theme.background;\r\n const onReady = (url: string) => {\r\n //const perf = performance.now();\r\n averageColor(url).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 //console.log(doc, hsla, performance.now() - perf);\r\n\r\n background.slug = slug;\r\n background.type = 'image';\r\n background.highlightningColor = hsla;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n this.saveToCache(slug, url);\r\n appImManager.applyCurrentTheme(slug, url).then(deferred.resolve);\r\n });\r\n };\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(background.blur) {\r\n setTimeout(() => {\r\n blur(cacheContext.url, 12, 4)\r\n .then(url => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n onReady(url);\r\n });\r\n }, 200);\r\n } else {\r\n onReady(cacheContext.url);\r\n }\r\n });\r\n\r\n return deferred;\r\n };\r\n\r\n private setActive = () => {\r\n const active = this.grid.querySelector('.active');\r\n const background = this.theme.background;\r\n const target = background.type === 'image' ? this.grid.querySelector(`.grid-item[data-slug=\"${background.slug}\"]`) : 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport renderImageFromUrl from \"./dom/renderImageFromUrl\";\r\n\r\nexport const averageColor = (imageUrl: string): Promise => {\r\n const img = document.createElement('img');\r\n return new Promise((resolve) => {\r\n renderImageFromUrl(img, imageUrl, () => {\r\n const canvas = document.createElement('canvas');\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const DIMENSIONS = 50;\r\n if(ratio === 1) {\r\n canvas.width = DIMENSIONS;\r\n canvas.height = canvas.width / ratio;\r\n } else if(ratio > 1) {\r\n canvas.height = DIMENSIONS;\r\n canvas.width = canvas.height / ratio;\r\n } else {\r\n canvas.width = canvas.height = DIMENSIONS;\r\n }\r\n \r\n const context = canvas.getContext('2d');\r\n context.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, 0, 0, canvas.width, canvas.height);\r\n\r\n const pixel = new Array(4).fill(0);\r\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\r\n for(let i = 0; i < pixels.length; i += 4) {\r\n pixel[0] += pixels[i];\r\n pixel[1] += pixels[i + 1];\r\n pixel[2] += pixels[i + 2];\r\n pixel[3] += pixels[i + 3];\r\n }\r\n\r\n const pixelsLength = pixels.length / 4;\r\n const outPixel = new Uint8ClampedArray(4);\r\n outPixel[0] = pixel[0] / pixelsLength;\r\n outPixel[1] = pixel[1] / pixelsLength;\r\n outPixel[2] = pixel[2] / pixelsLength;\r\n outPixel[3] = pixel[3] / pixelsLength;\r\n resolve(outPixel);\r\n });\r\n });\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement from \".\";\r\nimport appStickersManager, { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport { RichTextProcessor } from \"../../lib/richtextprocessor\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { wrapSticker } from \"../wrappers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport { putPreloader } from \"../misc\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport { StickerSet } from \"../../layer\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport Button from \"../button\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport toggleDisability from \"../../helpers/dom/toggleDisability\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\n\r\nconst ANIMATION_GROUP = 'STICKERS-POPUP';\r\n\r\nexport default class PopupStickers extends PopupElement {\r\n private stickersFooter: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n private h6: HTMLElement;\r\n\r\n private set: StickerSet.stickerSet;\r\n\r\n constructor(private stickerSetInput: Parameters[0]) {\r\n super('popup-stickers', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n this.h6.append(i18n('Loading'));\r\n\r\n this.header.append(this.h6);\r\n\r\n this.addEventListener('close', () => {\r\n animationIntersector.setOnlyOnePlayableGroup('');\r\n });\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('sticker-set-stickers', 'is-loading');\r\n\r\n attachClickEvent(this.stickersDiv, this.onStickersClick, {listenerSetter: this.listenerSetter});\r\n\r\n putPreloader(this.stickersDiv, true);\r\n\r\n this.stickersFooter = document.createElement('div');\r\n this.stickersFooter.classList.add('sticker-set-footer');\r\n\r\n div.append(this.stickersDiv);\r\n\r\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\r\n this.stickersFooter.append(btn);\r\n\r\n this.body.append(div);\r\n const scrollable = new Scrollable(this.body);\r\n this.body.append(this.stickersFooter);\r\n \r\n // const editButton = document.createElement('button');\r\n // editButton.classList.add('btn-primary');\r\n\r\n // this.stickersFooter.append(editButton);\r\n\r\n this.loadStickerSet();\r\n }\r\n\r\n private onStickersClick = (e: MouseEvent) => {\r\n const target = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n this.hide();\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n private loadStickerSet() {\r\n return appStickersManager.getStickerSet(this.stickerSetInput).then(set => {\r\n //console.log('PopupStickers loadStickerSet got set:', set);\r\n\r\n this.set = set.set;\r\n\r\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\r\n\r\n this.h6.innerHTML = RichTextProcessor.wrapEmojiText(set.set.title);\r\n this.stickersFooter.classList.toggle('add', !set.set.installed_date);\r\n\r\n let button: HTMLElement;\r\n if(set.set.installed_date) {\r\n button = Button('btn-primary btn-primary-transparent danger', {noRipple: true});\r\n button.append(i18n('RemoveStickersCount', [i18n('Stickers', [set.set.count])]));\r\n } else {\r\n button = Button('btn-primary btn-color-primary', {noRipple: true});\r\n button.append(i18n('AddStickersCount', [i18n('Stickers', [set.set.count])]));\r\n }\r\n\r\n this.stickersFooter.textContent = '';\r\n this.stickersFooter.append(button);\r\n\r\n attachClickEvent(button, () => {\r\n const toggle = toggleDisability([button], true);\r\n\r\n appStickersManager.toggleStickerSet(this.set).then(() => {\r\n this.hide();\r\n }).catch(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n \r\n this.stickersDiv.classList.remove('is-loading');\r\n this.stickersDiv.innerHTML = '';\r\n for(let doc of set.documents) {\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n \r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set-sticker');\r\n\r\n const size = mediaSizes.active.esgSticker.width;\r\n \r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue, \r\n group: ANIMATION_GROUP, \r\n play: true,\r\n loop: true,\r\n width: size,\r\n height: size\r\n });\r\n\r\n this.stickersDiv.append(div);\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 RangeSelector from \"../../rangeSelector\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport RadioField from \"../../radioField\";\r\nimport appStateManager, { State } from \"../../../lib/appManagers/appStateManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { IS_APPLE } from \"../../../environment/userAgent\";\r\nimport Row from \"../../row\";\r\nimport AppBackgroundTab from \"./background\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport assumeType from \"../../../helpers/assumeType\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport { wrapStickerSetThumb } from \"../../wrappers\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport eachMinute from \"../../../helpers/eachMinute\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\n\r\nexport class RangeSettingSelector {\r\n public container: HTMLDivElement;\r\n private range: RangeSelector;\r\n\r\n public onChange: (value: number) => void;\r\n\r\n constructor(name: LangPackKey, step: number, initialValue: number, minValue: number, maxValue: number) {\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 = document.createElement('div');\r\n valueDiv.classList.add(BASE_CLASS + '-value');\r\n valueDiv.innerHTML = '' + initialValue;\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 //console.log('font size scrub:', value);\r\n valueDiv.innerText = '' + value;\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.container.classList.add('general-settings-container');\r\n this.setTitle('General');\r\n\r\n const section = generateSection.bind(null, this.scrollable);\r\n\r\n {\r\n const container = section('Settings');\r\n \r\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\r\n range.onChange = (value) => {\r\n appStateManager.setByKey('settings.messagesTextSize', value);\r\n };\r\n\r\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\r\n\r\n attachClickEvent(chatBackgroundButton, () => {\r\n new AppBackgroundTab(this.slider).open();\r\n });\r\n\r\n const animationsCheckboxField = new CheckboxField({\r\n text: 'EnableAnimations', \r\n name: 'animations', \r\n stateKey: 'settings.animationsEnabled',\r\n withRipple: true\r\n });\r\n \r\n container.append(range.container, chatBackgroundButton, animationsCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('General.Keyboard');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'send-shortcut';\r\n const stateKey = 'settings.sendShortcut';\r\n\r\n const enterRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'General.SendShortcut.Enter', \r\n name, \r\n value: 'enter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\r\n });\r\n\r\n const ctrlEnterRow = new Row({\r\n radioField: new RadioField({\r\n name,\r\n value: 'ctrlEnter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\r\n });\r\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\r\n \r\n form.append(enterRow.container, ctrlEnterRow.container);\r\n container.append(form);\r\n }\r\n\r\n {\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('AutoDownloadMedia');\r\n //container.classList.add('sidebar-left-section-disabled');\r\n\r\n const contactsCheckboxField = new CheckboxField({\r\n text: 'AutodownloadContacts', \r\n name: 'contacts',\r\n stateKey: 'settings.autoDownload.contacts',\r\n withRipple: true\r\n });\r\n const privateCheckboxField = new CheckboxField({\r\n text: 'AutodownloadPrivateChats', \r\n name: 'private',\r\n stateKey: 'settings.autoDownload.private',\r\n withRipple: true\r\n });\r\n const groupsCheckboxField = new CheckboxField({\r\n text: 'AutodownloadGroupChats', \r\n name: 'groups',\r\n stateKey: 'settings.autoDownload.groups',\r\n withRipple: true\r\n });\r\n const channelsCheckboxField = new CheckboxField({\r\n text: 'AutodownloadChannels', \r\n name: 'channels',\r\n stateKey: 'settings.autoDownload.channels',\r\n withRipple: true\r\n });\r\n\r\n container.append(contactsCheckboxField.label, privateCheckboxField.label, groupsCheckboxField.label, channelsCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('General.AutoplayMedia');\r\n //container.classList.add('sidebar-left-section-disabled');\r\n\r\n const gifsCheckboxField = new CheckboxField({\r\n text: 'AutoplayGIF', \r\n name: 'gifs', \r\n stateKey: 'settings.autoPlay.gifs',\r\n withRipple: true\r\n });\r\n const videosCheckboxField = new CheckboxField({\r\n text: 'AutoplayVideo', \r\n name: 'videos', \r\n stateKey: 'settings.autoPlay.videos',\r\n withRipple: true\r\n });\r\n\r\n container.append(gifsCheckboxField.label, videosCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('Emoji');\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.EmojiPrediction', \r\n name: 'suggest-emoji', \r\n stateKey: 'settings.emoji.suggest',\r\n withRipple: true\r\n });\r\n const bigCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.BigEmoji', \r\n name: 'emoji-big', \r\n stateKey: 'settings.emoji.big',\r\n withRipple: true\r\n });\r\n\r\n container.append(suggestCheckboxField.label, bigCheckboxField.label);\r\n }\r\n \r\n {\r\n const container = section('Telegram.InstalledStickerPacksController');\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'Stickers.SuggestStickers', \r\n name: 'suggest', \r\n stateKey: 'settings.stickers.suggest',\r\n withRipple: true\r\n });\r\n const loopCheckboxField = new CheckboxField({\r\n text: 'InstalledStickers.LoopAnimated', \r\n name: 'loop', \r\n stateKey: 'settings.stickers.loop',\r\n withRipple: true\r\n });\r\n\r\n const stickerSets: {[id: string]: Row} = {};\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\r\n const row = new Row({\r\n title: RichTextProcessor.wrapEmojiText(stickerSet.title),\r\n subtitleLangKey: 'Stickers',\r\n subtitleLangArgs: [stickerSet.count],\r\n havePadding: true,\r\n clickable: () => {\r\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\r\n }\r\n });\r\n\r\n stickerSets[stickerSet.id] = row;\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('row-media');\r\n\r\n wrapStickerSetThumb({\r\n set: stickerSet,\r\n container: div,\r\n group: 'GENERAL-SETTINGS',\r\n lazyLoadQueue,\r\n width: 48,\r\n height: 48,\r\n autoplay: true\r\n });\r\n\r\n row.container.append(div);\r\n\r\n container[method](row.container);\r\n };\r\n\r\n appStickersManager.getAllStickers().then(allStickers => {\r\n assumeType(allStickers);\r\n for(const stickerSet of allStickers.sets) {\r\n renderStickerSet(stickerSet);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!stickerSets[set.id]) {\r\n renderStickerSet(set, 'prepend');\r\n }\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(stickerSets[set.id]) {\r\n stickerSets[set.id].container.remove();\r\n delete stickerSets[set.id];\r\n }\r\n });\r\n\r\n container.append(suggestCheckboxField.label, loopCheckboxField.label);\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 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 eachMinute(callback: () => any, 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, (60 - new Date().getSeconds()) * 1000);\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 appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { i18n, i18n_ } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\n\r\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\r\n\r\nexport default class AppEditProfileTab extends SliderSuperTab {\r\n private firstNameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private bioInputField: InputField;\r\n private usernameInputField: InputField;\r\n \r\n private profileUrlContainer: HTMLDivElement;\r\n private profileUrlAnchor: HTMLAnchorElement;\r\n\r\n private editPeer: EditPeer;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-profile-container');\r\n this.setTitle('EditAccount.Title');\r\n\r\n const inputFields: InputField[] = [];\r\n\r\n {\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.firstNameInputField = new InputField({\r\n label: 'EditProfile.FirstNameLabel',\r\n name: 'first-name',\r\n maxLength: 70\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'Login.Register.LastName.Placeholder',\r\n name: 'last-name',\r\n maxLength: 64\r\n });\r\n this.bioInputField = new InputField({\r\n label: 'EditProfile.BioLabel',\r\n name: 'bio',\r\n maxLength: 70\r\n });\r\n \r\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'Bio.Description'});\r\n\r\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\r\n this.scrollable.append(inputWrapper, caption);\r\n }\r\n\r\n this.scrollable.append(document.createElement('hr'));\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 this.content.append(this.editPeer.nextBtn);\r\n this.scrollable.prepend(this.editPeer.avatarEdit.container);\r\n\r\n {\r\n const h2 = document.createElement('div');\r\n h2.classList.add('sidebar-left-h2');\r\n i18n_({element: h2, key: 'EditAccount.Username'});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.usernameInputField = new UsernameInputField({\r\n label: 'EditProfile.Username.Label',\r\n name: 'username',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n onChange: () => {\r\n this.editPeer.handleChange();\r\n this.setProfileUrl();\r\n },\r\n availableText: 'EditProfile.Username.Available',\r\n takenText: 'EditProfile.Username.Taken',\r\n invalidText: 'EditProfile.Username.Invalid'\r\n });\r\n\r\n inputWrapper.append(this.usernameInputField.container);\r\n\r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n caption.append(i18n('UsernameSettings.ChangeDescription'));\r\n caption.append(document.createElement('br'), document.createElement('br'));\r\n\r\n const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\r\n profileUrlContainer.classList.add('profile-url-container');\r\n \r\n const profileUrlAnchor = this.profileUrlAnchor = document.createElement('a');\r\n profileUrlAnchor.classList.add('profile-url');\r\n profileUrlAnchor.href = '#';\r\n profileUrlAnchor.target = '_blank';\r\n\r\n profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\r\n\r\n caption.append(profileUrlContainer);\r\n\r\n inputFields.push(this.usernameInputField);\r\n this.scrollable.append(h2, inputWrapper, caption);\r\n }\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n let promises: Promise[] = [];\r\n \r\n promises.push(appProfileManager.updateProfile(this.firstNameInputField.value, this.lastNameInputField.value, this.bioInputField.value).then(() => {\r\n this.close();\r\n }, (err) => {\r\n console.error('updateProfile error:', err);\r\n }));\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then(inputFile => {\r\n return appProfileManager.uploadProfilePhoto(inputFile);\r\n }));\r\n }\r\n\r\n if(this.usernameInputField.isValidToChange()) {\r\n promises.push(appUsersManager.updateUsername(this.usernameInputField.value));\r\n }\r\n\r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const user = appUsersManager.getSelf();\r\n\r\n const userFull = await appProfileManager.getProfile(user.id, true);\r\n\r\n this.firstNameInputField.setOriginalValue(user.first_name, true);\r\n this.lastNameInputField.setOriginalValue(user.last_name, true);\r\n this.bioInputField.setOriginalValue(userFull.about, true);\r\n this.usernameInputField.setOriginalValue(user.username, true);\r\n\r\n this.setProfileUrl();\r\n this.editPeer.handleChange();\r\n }\r\n\r\n private setProfileUrl() {\r\n if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\r\n this.profileUrlContainer.style.display = 'none';\r\n } else {\r\n this.profileUrlContainer.style.display = '';\r\n let url = 'https://t.me/' + this.usernameInputField.value;\r\n this.profileUrlAnchor.innerText = url;\r\n this.profileUrlAnchor.href = url;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport { copy } from \"../../../helpers/object\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport I18n, { i18n, LangPackKey, _i18n, join } from \"../../../lib/langPack\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport { SettingSection } from \"..\";\r\nimport { toast } from \"../../toast\";\r\nimport { forEachReverse } from \"../../../helpers/array\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\n\r\nexport default class AppIncludedChatsTab extends SliderSuperTab {\r\n private editFolderTab: AppEditFolderTab;\r\n private confirmBtn: HTMLElement;\r\n\r\n private selector: AppSelectPeers;\r\n private type: 'included' | 'excluded';\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private dialogsByFilters: Map>;\r\n\r\n protected init() {\r\n this.content.remove();\r\n this.container.classList.add('included-chatlist-container');\r\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\r\n this.confirmBtn.style.display = 'none';\r\n\r\n this.header.append(this.confirmBtn);\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n const selected = this.selector.getSelected();\r\n\r\n //this.filter.pFlags = {};\r\n\r\n if(this.type === 'included') {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') === 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n } else {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') !== 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n }\r\n\r\n const peerIds: PeerId[] = [];\r\n for(const key of selected) {\r\n if(key.isPeerId()) {\r\n peerIds.push(key.toPeerId());\r\n } else {\r\n // @ts-ignore\r\n this.filter.pFlags[key] = true;\r\n }\r\n }\r\n\r\n let cmp: (peerId: PeerId) => boolean;\r\n if(this.type === 'included') {\r\n cmp = (peerId) => peerIds.includes(peerId);\r\n } else {\r\n cmp = (peerId) => !peerIds.includes(peerId);\r\n }\r\n\r\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\r\n if(!cmp(peerId)) {\r\n this.filter.pinnedPeerIds.splice(idx, 1);\r\n this.filter.pinned_peers.splice(idx, 1);\r\n }\r\n });\r\n\r\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\r\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\r\n forEachReverse(this.filter[other], (peerId, idx) => {\r\n if(peerIds.includes(peerId)) {\r\n this.filter[other].splice(idx, 1);\r\n this.filter[otherLegacy].splice(idx, 1);\r\n }\r\n });\r\n \r\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\r\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = peerIds.map(peerId => appPeersManager.getInputPeerById(peerId));\r\n //this.filter.pinned_peers = this.filter.pinned_peers.filter(peerId => this.filter.include_peers.includes(peerId));\r\n\r\n this.editFolderTab.setFilter(this.filter, false);\r\n this.close();\r\n });\r\n\r\n this.dialogsByFilters = new Map();\r\n return appMessagesManager.filtersStorage.getDialogFilters().then(filters => {\r\n for(const filter of filters) {\r\n this.dialogsByFilters.set(filter, new Set(appMessagesManager.dialogsStorage.getFolderDialogs(filter.id).map(d => d.peerId)));\r\n }\r\n });\r\n }\r\n\r\n checkbox(selected?: boolean) {\r\n const checkboxField = new CheckboxField({\r\n round: true\r\n });\r\n if(selected) {\r\n checkboxField.input.checked = selected;\r\n }\r\n\r\n return checkboxField.label;\r\n }\r\n\r\n renderResults = async(peerIds: PeerId[]) => {\r\n //const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\r\n\r\n await appUsersManager.getContacts();\r\n peerIds.forEach(peerId => {\r\n //if(other.includes(peerId)) return;\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: this.selector.scrollable,\r\n drawStatus: false,\r\n rippleEnabled: true,\r\n avatarSize: 46\r\n });\r\n\r\n const selected = this.selector.selected.has(peerId);\r\n dom.containerEl.append(this.checkbox(selected));\r\n //if(selected) dom.listEl.classList.add('active');\r\n\r\n const foundInFilters: HTMLElement[] = [];\r\n this.dialogsByFilters.forEach((dialogs, filter) => {\r\n if(dialogs.has(peerId)) {\r\n const span = document.createElement('span');\r\n span.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\r\n foundInFilters.push(span);\r\n }\r\n });\r\n\r\n const joined = join(foundInFilters, false);\r\n joined.forEach(el => {\r\n dom.lastMessageSpan.append(el);\r\n });\r\n });\r\n };\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\r\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\r\n\r\n const filter = this.filter;\r\n\r\n const fragment = document.createDocumentFragment();\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 const chatsSection = new SettingSection({\r\n name: 'FilterChats'\r\n });\r\n\r\n fragment.append(categoriesSection.container, chatsSection.container);\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 });\r\n this.selector.selected = new Set(selectedPeers);\r\n\r\n let addedInitial = false;\r\n const _add = this.selector.add.bind(this.selector);\r\n this.selector.add = (peerId, title, scroll) => {\r\n if(this.selector.selected.size >= 100 && addedInitial && !details[peerId]) {\r\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\r\n if(el) {\r\n setTimeout(() => {\r\n el.checked = false;\r\n }, 0);\r\n }\r\n\r\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\r\n toast(str);\r\n return;\r\n }\r\n\r\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\r\n if(details[peerId]) {\r\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\r\n }\r\n return div;\r\n };\r\n\r\n const parent = this.selector.list.parentElement;\r\n chatsSection.content.append(this.selector.list);\r\n parent.append(fragment);\r\n\r\n this.selector.addInitial(selectedPeers);\r\n addedInitial = true;\r\n\r\n for(const flag in filter.pFlags) {\r\n // @ts-ignore\r\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\r\n (categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement).click();\r\n }\r\n }\r\n }\r\n\r\n onSelectChange = (length: number) => {\r\n //const changed = !deepEqual(this.filter, this.originalFilter);\r\n if(this.type === 'included') {\r\n this.confirmBtn.style.display = length ? '' : 'none';\r\n }\r\n };\r\n\r\n onCloseAfterTimeout() {\r\n if(this.selector) {\r\n this.selector.container.remove();\r\n this.selector = null;\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n /**\r\n * Do not ignore arguments!\r\n */\r\n public open(filter?: DialogFilter, type?: 'included' | 'excluded', editFolderTab?: AppIncludedChatsTab['editFolderTab']) {\r\n this.originalFilter = filter;\r\n this.filter = copy(this.originalFilter);\r\n this.type = type;\r\n this.editFolderTab = editFolderTab;\r\n \r\n return super.open();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { deepEqual, copy } from \"../../../helpers/object\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { toast } from \"../../toast\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport InputField from \"../../inputField\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport Button from \"../../button\";\r\nimport AppIncludedChatsTab from \"./includedChats\";\r\nimport { i18n, i18n_, LangPackKey } from \"../../../lib/langPack\";\r\nimport { SettingSection } from \"..\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\n\r\nconst MAX_FOLDER_NAME_LENGTH = 12;\r\n\r\nexport default class AppEditFolderTab extends SliderSuperTab {\r\n private caption: HTMLElement;\r\n private stickerContainer: HTMLElement;\r\n\r\n private confirmBtn: HTMLElement;\r\n private menuBtn: HTMLElement;\r\n private nameInputField: InputField;\r\n\r\n private includePeerIds: SettingSection;\r\n private excludePeerIds: SettingSection;\r\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\r\n\r\n private animation: RLottiePlayer;\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private type: 'edit' | 'create';\r\n private loadAnimationPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-folder-container');\r\n this.caption = document.createElement('div');\r\n this.caption.classList.add('caption');\r\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n\r\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\r\n const deleteFolderButton: ButtonMenuItemOptions = {\r\n icon: 'delete danger',\r\n text: 'FilterMenuDelete',\r\n onClick: () => {\r\n new PopupPeer('filter-delete', {\r\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\r\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n deleteFolderButton.element.setAttribute('disabled', 'true');\r\n appMessagesManager.filtersStorage.updateDialogFilter(this.filter, true).then(bool => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).finally(() => {\r\n deleteFolderButton.element.removeAttribute('disabled');\r\n });\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n };\r\n this.menuBtn = ButtonMenuToggle({}, 'bottom-left', [deleteFolderButton]);\r\n this.menuBtn.classList.add('hide');\r\n\r\n this.header.append(this.confirmBtn, this.menuBtn);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FilterNameInputLabel',\r\n maxLength: MAX_FOLDER_NAME_LENGTH\r\n });\r\n\r\n inputWrapper.append(this.nameInputField.container);\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, inputWrapper, this.includePeerIds.container, this.excludePeerIds.container);\r\n\r\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\r\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\r\n\r\n includedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n new AppIncludedChatsTab(this.slider).open(this.filter, 'included', this);\r\n });\r\n\r\n excludedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n new AppIncludedChatsTab(this.slider).open(this.filter, 'excluded', this);\r\n });\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n if(this.nameInputField.input.classList.contains('error')) {\r\n return;\r\n }\r\n\r\n if(!this.nameInputField.value.trim()) {\r\n this.nameInputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\r\n include += this.filter.include_peers.length;\r\n \r\n if(!include) {\r\n toast('Please choose at least one chat for this folder.');\r\n return;\r\n }\r\n\r\n this.confirmBtn.setAttribute('disabled', 'true');\r\n\r\n let promise: Promise;\r\n if(!this.filter.id) {\r\n promise = appMessagesManager.filtersStorage.createDialogFilter(this.filter);\r\n } else {\r\n promise = appMessagesManager.filtersStorage.updateDialogFilter(this.filter);\r\n }\r\n\r\n promise.then(bool => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).catch(err => {\r\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n console.error('updateDialogFilter error:', err);\r\n }\r\n }).finally(() => {\r\n this.confirmBtn.removeAttribute('disabled');\r\n });\r\n });\r\n \r\n this.nameInputField.input.addEventListener('input', () => {\r\n this.filter.title = this.nameInputField.value;\r\n this.editCheckForChange();\r\n });\r\n\r\n return 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\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private onCreateOpen() {\r\n this.caption.style.display = '';\r\n this.setTitle('FilterNew');\r\n this.menuBtn.classList.add('hide');\r\n this.confirmBtn.classList.remove('hide');\r\n this.nameInputField.value = '';\r\n\r\n for(const flag in this.flags) {\r\n // @ts-ignore\r\n this.flags[flag].style.display = 'none';\r\n }\r\n }\r\n\r\n private onEditOpen() {\r\n this.caption.style.display = 'none';\r\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\r\n\r\n if(this.type === 'edit') {\r\n this.menuBtn.classList.remove('hide');\r\n this.confirmBtn.classList.add('hide');\r\n }\r\n \r\n const filter = this.filter;\r\n this.nameInputField.value = RichTextProcessor.wrapDraftText(filter.title);\r\n\r\n for(const flag in this.flags) {\r\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\r\n }\r\n\r\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(key => {\r\n const section = this[key];\r\n const ul = appDialogsManager.createChatList();\r\n\r\n const peers = filter[key].slice();\r\n\r\n const renderMore = (_length: number) => {\r\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\r\n const peerId = peers.shift();\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: ul,\r\n drawStatus: false,\r\n rippleEnabled: false,\r\n meAsSaved: true,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n }\r\n\r\n if(peers.length) {\r\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\r\n } else if(showMore) {\r\n showMore.remove();\r\n }\r\n };\r\n \r\n section.generateContentElement().append(ul);\r\n\r\n let showMore: HTMLElement;\r\n if(peers.length) {\r\n const content = section.generateContentElement();\r\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\r\n showMore.classList.add('load-more', 'rp-overflow');\r\n showMore.addEventListener('click', () => renderMore(20));\r\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\r\n\r\n content.append(showMore);\r\n }\r\n\r\n renderMore(4);\r\n });\r\n }\r\n\r\n editCheckForChange() {\r\n if(this.type === 'edit') {\r\n const changed = !deepEqual(this.originalFilter, this.filter);\r\n this.confirmBtn.classList.toggle('hide', !changed);\r\n this.menuBtn.classList.toggle('hide', changed);\r\n }\r\n };\r\n\r\n setFilter(filter: DialogFilter, firstTime: boolean) {\r\n // cleanup\r\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach(el => el.remove());\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 const ret = super.open();\r\n \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 this.onCreateOpen();\r\n } else {\r\n this.setFilter(filter, true);\r\n this.type = 'edit';\r\n this.onEditOpen();\r\n }\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport { toast } from \"../../toast\";\r\nimport type { MyDialogFilter } from \"../../../lib/storages/filters\";\r\nimport type { DialogFilterSuggested, DialogFilter } from \"../../../layer\";\r\nimport type _rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport Row from \"../../row\";\r\nimport { SettingSection } from \"..\";\r\nimport { i18n, i18n_, LangPackKey, join } from \"../../../lib/langPack\";\r\nimport { cancelEvent } from \"../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport positionElementByIndex from \"../../../helpers/dom/positionElementByIndex\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class AppChatFoldersTab extends SliderSuperTab {\r\n private createFolderBtn: HTMLElement;\r\n private foldersSection: SettingSection;\r\n private suggestedSection: SettingSection;\r\n private stickerContainer: HTMLElement;\r\n private animation: RLottiePlayer;\r\n\r\n private filtersRendered: {[filterId: number]: Row} = {};\r\n private loadAnimationPromise: ReturnType;\r\n\r\n private renderFolder(dialogFilter: DialogFilterSuggested | DialogFilter | MyDialogFilter, container?: HTMLElement, row?: Row) {\r\n let filter: DialogFilter | MyDialogFilter;\r\n let description = '';\r\n let d: HTMLElement[] = [];\r\n if(dialogFilter._ === 'dialogFilterSuggested') {\r\n filter = dialogFilter.filter;\r\n description = dialogFilter.description;\r\n } else {\r\n filter = dialogFilter;\r\n\r\n let enabledFilters = Object.keys(filter.pFlags).length;\r\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach(key => {\r\n enabledFilters += +!!filter[key].length;\r\n }); */\r\n \r\n if(enabledFilters === 1) {\r\n const pFlags = filter.pFlags;\r\n let k: LangPackKey;\r\n if(pFlags.contacts) k = 'FilterAllContacts';\r\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\r\n else if(pFlags.groups) k = 'FilterAllGroups';\r\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\r\n else if(pFlags.bots) k = 'FilterAllBots';\r\n\r\n if(k) {\r\n d.push(i18n(k));\r\n }\r\n }\r\n \r\n if(!d.length) {\r\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(filter.id);\r\n let chats = 0, channels = 0, groups = 0;\r\n for(const dialog of folder) {\r\n if(appPeersManager.isAnyGroup(dialog.peerId)) groups++;\r\n else if(appPeersManager.isBroadcast(dialog.peerId)) channels++;\r\n else chats++;\r\n }\r\n\r\n if(chats) d.push(i18n('Chats', [chats]));\r\n if(channels) d.push(i18n('Channels', [channels]));\r\n if(groups) d.push(i18n('Groups', [groups]));\r\n }\r\n }\r\n\r\n let div: HTMLElement;\r\n if(!row) {\r\n row = new Row({\r\n title: RichTextProcessor.wrapEmojiText(filter.title),\r\n subtitle: description,\r\n clickable: true\r\n });\r\n\r\n if(d.length) {\r\n join(d).forEach(el => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n \r\n if(dialogFilter._ === 'dialogFilter') {\r\n const filterId = filter.id;\r\n if(!this.filtersRendered.hasOwnProperty(filter.id)) {\r\n attachClickEvent(row.container, () => {\r\n new AppEditFolderTab(this.slider).open(appMessagesManager.filtersStorage.getFilter(filterId));\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n this.filtersRendered[filter.id] = row;\r\n }\r\n } else {\r\n row.subtitle.textContent = '';\r\n join(d).forEach(el => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n\r\n div = row.container;\r\n\r\n if((filter as MyDialogFilter).hasOwnProperty('orderIndex')) {\r\n // ! header will be at 0 index\r\n positionElementByIndex(div, div.parentElement || container, (filter as MyDialogFilter).orderIndex);\r\n } else if(container) container.append(div);\r\n \r\n return div;\r\n }\r\n\r\n protected async init() {\r\n this.container.classList.add('chat-folders-container');\r\n this.setTitle('ChatList.Filter.List.Title');\r\n\r\n this.scrollable.container.classList.add('chat-folders');\r\n\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\r\n \r\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\r\n text: 'ChatList.Filter.NewTitle',\r\n icon: 'add'\r\n });\r\n\r\n this.foldersSection = new SettingSection({\r\n name: 'Filters'\r\n });\r\n this.foldersSection.container.style.display = 'none';\r\n\r\n this.suggestedSection = new SettingSection({\r\n name: 'FilterRecommended'\r\n });\r\n this.suggestedSection.container.style.display = 'none';\r\n\r\n this.scrollable.append(this.stickerContainer, caption, this.createFolderBtn, this.foldersSection.container, this.suggestedSection.container);\r\n\r\n attachClickEvent(this.createFolderBtn, () => {\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n new AppEditFolderTab(this.slider).open();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const onFiltersContainerUpdate = () => {\r\n this.foldersSection.container.style.display = Object.keys(this.filtersRendered).length ? '' : 'none';\r\n };\r\n\r\n appMessagesManager.filtersStorage.getDialogFilters().then(filters => {\r\n for(const filter of filters) {\r\n this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_update', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n this.renderFolder(filter, null, this.filtersRendered[filter.id]);\r\n } else {\r\n this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n\r\n this.getSuggestedFilters();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n /* for(const suggested of this.suggestedFilters) {\r\n if(deepEqual(suggested.filter, filter)) {\r\n \r\n }\r\n } */\r\n this.getSuggestedFilters();\r\n\r\n this.filtersRendered[filter.id].container.remove();\r\n delete this.filtersRendered[filter.id];\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\r\n order.forEach((filterId, idx) => {\r\n const container = this.filtersRendered[filterId].container;\r\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header \r\n });\r\n });\r\n\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_1').then(player => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n });\r\n\r\n this.getSuggestedFilters()\r\n\r\n /* return Promise.all([\r\n this.loadAnimationPromise\r\n ]); */\r\n return this.loadAnimationPromise;\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private getSuggestedFilters() {\r\n return apiManager.invokeApi('messages.getSuggestedDialogFilters').then(suggestedFilters => {\r\n this.suggestedSection.container.style.display = suggestedFilters.length ? '' : 'none';\r\n Array.from(this.suggestedSection.content.children).slice(1).forEach(el => el.remove());\r\n\r\n suggestedFilters.forEach(filter => {\r\n const div = this.renderFolder(filter);\r\n const button = Button('btn-primary btn-color-primary', {text: 'Add'});\r\n div.append(button);\r\n this.suggestedSection.content.append(div);\r\n\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n return;\r\n }\r\n\r\n button.setAttribute('disabled', 'true');\r\n\r\n const f = filter.filter as MyDialogFilter;\r\n f.includePeerIds = [];\r\n f.excludePeerIds = [];\r\n f.pinnedPeerIds = [];\r\n\r\n appMessagesManager.filtersStorage.createDialogFilter(f, true).then(bool => {\r\n if(bool) {\r\n div.remove();\r\n }\r\n }).finally(() => {\r\n button.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n });\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport { InputNotifyPeer, Update } from \"../../../layer\";\r\nimport appNotificationsManager from \"../../../lib/appManagers/appNotificationsManager\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport { copy } from \"../../../helpers/object\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { convertKeyToInputKey } from \"../../../helpers/string\";\r\nimport { LangPackKey } from \"../../../lib/langPack\";\r\nimport appStateManager from \"../../../lib/appManagers/appStateManager\";\r\n\r\ntype InputNotifyKey = Exclude;\r\n\r\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.container.classList.add('notifications-container');\r\n this.setTitle('Telegram.NotificationSettingsViewController');\r\n\r\n const NotifySection = (options: {\r\n name: LangPackKey,\r\n typeText: LangPackKey,\r\n inputKey: InputNotifyKey,\r\n }) => {\r\n const section = new SettingSection({\r\n name: options.name\r\n });\r\n\r\n const enabledRow = new Row({\r\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const previewEnabledRow = new Row({\r\n checkboxField: new CheckboxField({text: 'Notifications.MessagePreview', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n section.content.append(enabledRow.container, previewEnabledRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const inputNotifyPeer = {_: options.inputKey};\r\n const ret = appNotificationsManager.getNotifySettings(inputNotifyPeer);\r\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\r\n const applySettings = () => {\r\n const muted = appNotificationsManager.isMuted(notifySettings);\r\n enabledRow.checkboxField.checked = !muted;\r\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\r\n \r\n return muted;\r\n };\r\n \r\n applySettings();\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const mute = !enabledRow.checkboxField.checked;\r\n const showPreviews = previewEnabledRow.checkboxField.checked;\r\n\r\n if(mute === appNotificationsManager.isMuted(notifySettings) && showPreviews === notifySettings.show_previews) {\r\n return;\r\n }\r\n\r\n const inputSettings: any = copy(notifySettings);\r\n inputSettings._ = 'inputPeerNotifySettings';\r\n inputSettings.mute_until = mute ? 0x7FFFFFFF : 0;\r\n inputSettings.show_previews = showPreviews;\r\n\r\n appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\r\n }, {once: true});\r\n\r\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\r\n const inputKey = convertKeyToInputKey(update.peer._) as any;\r\n if(options.inputKey === inputKey) {\r\n notifySettings = update.notify_settings;\r\n applySettings();\r\n }\r\n });\r\n });\r\n };\r\n\r\n NotifySection({\r\n name: 'NotificationsPrivateChats',\r\n typeText: 'NotificationsForPrivateChats',\r\n inputKey: 'inputNotifyUsers'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsGroups',\r\n typeText: 'NotificationsForGroups',\r\n inputKey: 'inputNotifyChats'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsChannels',\r\n typeText: 'NotificationsForChannels',\r\n inputKey: 'inputNotifyBroadcasts'\r\n });\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'NotificationsOther'\r\n });\r\n\r\n const contactsSignUpRow = new Row({\r\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const soundRow = new Row({\r\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound'}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n soundRow.checkboxField.checked = state.settings.notifications.sound;\r\n });\r\n\r\n section.content.append(contactsSignUpRow.container, soundRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n appNotificationsManager.getContactSignUpNotification().then(enabled => {\r\n contactsSignUpRow.checkboxField.checked = enabled;\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = contactsSignUpRow.checkboxField.checked;\r\n if(enabled !== _enabled) {\r\n appNotificationsManager.setContactSignUpNotification(!_enabled);\r\n }\r\n }, {once: true});\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SliderSuperTab } from \"../../slider\"\r\n\r\nexport default class AppLanguageTab extends SliderSuperTab {\r\n protected async init() {\r\n this.container.classList.add('language-container');\r\n this.setTitle('Telegram.LanguageViewController');\r\n\r\n const section = new SettingSection({});\r\n\r\n const radioRows: Map = new Map();\r\n\r\n const promise = apiManager.invokeApiCacheable('langpack.getLanguages', {\r\n lang_pack: 'macos'\r\n }).then((languages) => {\r\n const random = randomLong();\r\n languages.forEach((language) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n text: language.name, \r\n name: random, \r\n value: language.lang_code\r\n }),\r\n subtitle: language.native_name\r\n });\r\n \r\n radioRows.set(language.lang_code, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\r\n I18n.getLangPack(value);\r\n });\r\n \r\n I18n.getCacheLangPack().then(langPack => {\r\n const row = radioRows.get(langPack.lang_code);\r\n if(!row) {\r\n console.error('no row', row, langPack);\r\n return;\r\n }\r\n \r\n row.radioField.setValueSilently(true);\r\n });\r\n \r\n section.content.append(form);\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n\r\n return promise;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 AvatarElement from \"../../avatar\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\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 PeerTitle from \"../../peerTitle\";\r\nimport AppLanguageTab from \"./language\";\r\nimport lottieLoader from \"../../../lib/rlottie/lottieLoader\";\r\nimport PopupPeer from \"../../popups/peer\";\r\n//import AppMediaViewer from \"../../appMediaViewerNew\";\r\n\r\nexport default class AppSettingsTab extends SliderSuperTab {\r\n private avatarElem: AvatarElement;\r\n private nameDiv: HTMLElement;\r\n private phoneDiv: HTMLElement;\r\n\r\n private buttons: {\r\n edit: HTMLButtonElement,\r\n folders: HTMLButtonElement,\r\n general: HTMLButtonElement,\r\n notifications: HTMLButtonElement,\r\n privacy: HTMLButtonElement,\r\n language: HTMLButtonElement\r\n } = {} as any;\r\n\r\n protected init() {\r\n this.container.classList.add('settings-container');\r\n this.setTitle('Settings');\r\n \r\n const btnMenu = ButtonMenuToggle({}, 'bottom-left', [{\r\n icon: 'logout',\r\n text: 'EditAccount.Logout',\r\n onClick: () => {\r\n new PopupPeer('logout', {\r\n titleLangKey: 'LogOut',\r\n descriptionLangKey: 'LogOut.Description',\r\n buttons: [{\r\n langKey: 'LogOut',\r\n callback: () => {\r\n apiManager.logOut();\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n }]);\r\n\r\n this.header.append(btnMenu);\r\n\r\n this.avatarElem = new AvatarElement();\r\n this.avatarElem.setAttribute('clickable', '');\r\n this.avatarElem.classList.add('profile-avatar', 'avatar-120');\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 this.nameDiv = document.createElement('div');\r\n this.nameDiv.classList.add('profile-name');\r\n\r\n this.phoneDiv = document.createElement('div');\r\n this.phoneDiv.classList.add('profile-subtitle');\r\n\r\n const buttonsDiv = document.createElement('div');\r\n buttonsDiv.classList.add('profile-buttons');\r\n\r\n const className = 'profile-button btn-primary btn-transparent';\r\n buttonsDiv.append(this.buttons.edit = Button(className, {icon: 'edit', text: 'EditAccount.Title'}));\r\n buttonsDiv.append(this.buttons.folders = Button(className, {icon: 'folder', text: 'AccountSettings.Filters'}));\r\n buttonsDiv.append(this.buttons.general = Button(className, {icon: 'settings', text: 'Telegram.GeneralSettingsViewController'}));\r\n buttonsDiv.append(this.buttons.notifications = Button(className, {icon: 'unmute', text: 'AccountSettings.Notifications'}));\r\n buttonsDiv.append(this.buttons.privacy = Button(className, {icon: 'lock', text: 'AccountSettings.PrivacyAndSecurity'}));\r\n buttonsDiv.append(this.buttons.language = Button(className, {icon: 'language', text: 'AccountSettings.Language'}));\r\n \r\n this.scrollable.append(this.avatarElem, this.nameDiv, this.phoneDiv, buttonsDiv);\r\n this.scrollable.container.classList.add('profile-content-wrapper');\r\n\r\n /* rootScope.$on('user_auth', (e) => {\r\n this.fillElements();\r\n }); */\r\n\r\n this.buttons.edit.addEventListener('click', () => {\r\n const tab = new AppEditProfileTab(this.slider);\r\n tab.open();\r\n });\r\n\r\n this.buttons.folders.addEventListener('click', () => {\r\n new AppChatFoldersTab(this.slider).open();\r\n });\r\n\r\n this.buttons.general.addEventListener('click', () => {\r\n new AppGeneralSettingsTab(this.slider).open();\r\n });\r\n\r\n this.buttons.notifications.addEventListener('click', () => {\r\n new AppNotificationsTab(this.slider).open();\r\n });\r\n\r\n this.buttons.privacy.addEventListener('click', () => {\r\n new AppPrivacyAndSecurityTab(this.slider).open();\r\n });\r\n\r\n this.buttons.language.addEventListener('click', () => {\r\n new AppLanguageTab(this.slider).open();\r\n });\r\n\r\n lottieLoader.loadLottieWorkers();\r\n\r\n this.fillElements();\r\n }\r\n\r\n public fillElements() {\r\n const user = appUsersManager.getSelf();\r\n const peerId = user.id.toPeerId(false);\r\n this.avatarElem.setAttribute('peer', '' + peerId);\r\n\r\n this.nameDiv.append(new PeerTitle({peerId: peerId}).element);\r\n this.phoneDiv.innerHTML = user.phone ? appUsersManager.formatUserPhone(user.phone) : '';\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport Button from \"../../button\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport AppAddMembersTab from \"./addMembers\";\r\nimport { _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppNewChannelTab extends SliderSuperTab {\r\n private uploadAvatar: () => Promise = null;\r\n\r\n private channelNameInputField: InputField;\r\n private channelDescriptionInputField: InputField;\r\n private nextBtn: HTMLButtonElement;\r\n private avatarEdit: AvatarEdit;\r\n\r\n protected init() {\r\n this.container.classList.add('new-channel-container');\r\n this.setTitle('NewChannel');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const 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 const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n _i18n(caption, 'Channel.DescriptionHolderDescrpiton');\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.channelNameInputField.value;\r\n const about = this.channelDescriptionInputField.value;\r\n\r\n this.nextBtn.disabled = true;\r\n appChatsManager.createChannel(title, about).then((channelId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(channelId, inputFile);\r\n });\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n new AppAddMembersTab(this.slider).open({\r\n type: 'channel',\r\n skippable: true,\r\n title: 'GroupAddMembers',\r\n placeholder: 'SendMessageTo',\r\n takeOut: (peerIds) => {\r\n return appChatsManager.inviteToChannel(channelId, peerIds);\r\n }\r\n });\r\n });\r\n });\r\n\r\n this.content.append(this.nextBtn);\r\n this.scrollable.append(this.avatarEdit.container, inputWrapper, caption);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.channelNameInputField.value = '';\r\n this.channelDescriptionInputField.value = '';\r\n this.nextBtn.disabled = false;\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport EditPeer from \"../editPeer\";\nimport { _i18n } from \"../../lib/langPack\";\nimport TelInputField from \"../telInputField\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport { toastNew } from \"../toast\";\n\nexport default class PopupCreateContact extends PopupElement {\n constructor() {\n super('popup-create-contact popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Add'});\n\n _i18n(this.title, 'AddContactTitle');\n\n attachClickEvent(this.btnConfirm, () => {\n const promise = appUsersManager.importContact(nameInputField.value, lastNameInputField.value, telInputField.value);\n\n promise.then(() => {\n this.hide();\n }, (err) => {\n if(err.type === 'NO_USER') {\n toastNew({langPackKey: 'Contacts.PhoneNumber.NotRegistred'});\n editPeer.disabled = false;\n }\n });\n\n editPeer.lockWithPromise(promise);\n }, {listenerSetter: this.listenerSetter});\n\n const inputFields: InputField[] = [];\n const div = document.createElement('div');\n div.classList.add('name-fields');\n const nameInputField = new InputField({\n label: 'FirstName',\n name: 'create-contact-name',\n maxLength: 70,\n required: true\n });\n const lastNameInputField = new InputField({\n label: 'LastName',\n name: 'create-contact-lastname',\n maxLength: 70\n });\n const telInputField = new TelInputField({required: true});\n inputFields.push(nameInputField, lastNameInputField, telInputField);\n\n const onInput = () => {\n const name = nameInputField.value + ' ' + lastNameInputField.value;\n // const abbr = RichTextProcessor.getAbbreviation(name);\n editPeer.avatarElem.setAttribute('peer-title', 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 const user = appUsersManager.getSelf();\n const formatted = formatPhoneNumber(user.phone);\n if(formatted) {\n telInputField.validate = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n telInputField.value = '+' + formatted.code.country_code;\n }\n\n const editPeer = new EditPeer({\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true,\n nextBtn: this.btnConfirm,\n avatarSize: 100\n });\n\n div.append(nameInputField.container, lastNameInputField.container, editPeer.avatarElem);\n this.container.append(div, telInputField.container);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SliderSuperTab } from \"../../slider\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport InputSearch from \"../../inputSearch\";\nimport { IS_MOBILE } from \"../../../environment/userAgent\";\nimport { canFocus } from \"../../../helpers/dom/canFocus\";\nimport windowSize from \"../../../helpers/windowSize\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PopupCreateContact from \"../../popups/createContact\";\nimport SortedUserList from \"../../sortedUserList\";\nimport { getMiddleware } from \"../../../helpers/middleware\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport rootScope from \"../../../lib/rootScope\";\n\n// TODO: поиск по людям глобальный, если не нашло в контактах никого\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n \n protected init() {\n this.container.id = 'contacts-container';\n\n // this.list = appDialogsManager.createChatList(/* {avatarSize: 48, handheldsSize: 66} */);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, () => {\n new PopupCreateContact();\n }, {listenerSetter: this.listenerSetter});\n\n this.inputSearch = new InputSearch('Search', (value) => {\n this.openContacts(value);\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n const isContact = appUsersManager.isContact(userId);\n const peerId = userId.toPeerId();\n if(isContact) this.sortedUserList.add(peerId);\n else this.sortedUserList.delete(peerId);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.middleware = getMiddleware();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList();\n const list = sortedUserList.list;\n list.id = 'contacts';\n list.classList.add('contacts-container');\n appDialogsManager.setListClickListener(list, () => {\n this.close();\n }, undefined, true);\n return sortedUserList;\n }\n\n protected onClose() {\n this.middleware.clean();\n /* // need to clear, and left 1 page for smooth slide\n let pageCount = appPhotosManager.windowH / 72 * 1.25 | 0;\n (Array.from(this.list.children) as HTMLElement[]).slice(pageCount).forEach(el => el.remove()); */\n }\n\n protected onOpenAfterTimeout() {\n if(IS_MOBILE || !canFocus(true)) return;\n this.inputSearch.input.focus();\n }\n\n public openContacts(query?: string) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n appUsersManager.getContactsPeerIds(query, undefined, 'online').then(contacts => {\n if(!middleware()) {\n return;\n }\n\n const sortedUserList = this.sortedUserList = this.createList();\n\n let renderPage = () => {\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n const arr = contacts.splice(0, pageCount); // надо splice!\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n renderPage = undefined;\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n renderPage();\n this.scrollable.onScrolledBottom = () => {\n if(renderPage) {\n renderPage();\n } else {\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n replaceContent(this.scrollable.container, sortedUserList.list);\n });\n }\n\n public open() {\n this.openContacts();\n return super.open();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport { SliderSuperTab } from \"../../slider\";\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId = 1;\n private wasFilterId: number;\n\n init() {\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n if(!appDialogsManager.sortedLists[AppArchivedTab.filterId]) {\n const chatList = appDialogsManager.createChatList();\n appDialogsManager.generateScrollable(chatList, AppArchivedTab.filterId).container.append(chatList);\n appDialogsManager.setListClickListener(chatList, null, true);\n //appDialogsManager.setListClickListener(archivedChatList, null, true); // * to test peer changing\n }\n\n const scrollable = appDialogsManager.scrollables[AppArchivedTab.filterId];\n this.scrollable.container.replaceWith(scrollable.container);\n this.scrollable = scrollable;\n }\n\n onOpen() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.wasFilterId = appDialogsManager.filterId;\n appDialogsManager.setFilterId(AppArchivedTab.filterId);\n appDialogsManager.onTabChange();\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.sortedLists[this.wasFilterId].clear();\n }\n\n onClose() {\n appDialogsManager.setFilterId(this.wasFilterId);\n appDialogsManager.onTabChange();\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.sortedLists[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { formatNumber } from \"../../helpers/number\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport appStateManager from \"../../lib/appManagers/appStateManager\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { SearchGroup } from \"../appSearch\";\nimport \"../avatar\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport InputSearch from \"../inputSearch\";\nimport SidebarSlider from \"../slider\";\nimport { TransitionSlider } from \"../transition\";\nimport AppNewGroupTab from \"./tabs/newGroup\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport { DateData, fillTipDates } from \"../../helpers/date\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppSettingsTab from \"./tabs/settings\";\nimport AppNewChannelTab from \"./tabs/newChannel\";\nimport AppContactsTab from \"./tabs/contacts\";\nimport AppArchivedTab from \"./tabs/archivedTab\";\nimport AppAddMembersTab from \"./tabs/addMembers\";\nimport { i18n_, LangPackKey } from \"../../lib/langPack\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport CheckboxField from \"../checkboxField\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport appNavigationController from \"../appNavigationController\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport PeerTitle from \"../peerTitle\";\nimport App from \"../../config/app\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sessionStorage from \"../../lib/sessionStorage\";\nimport { CLICK_EVENT_NAME } from \"../../helpers/dom/clickEvent\";\nimport { closeBtnMenu } from \"../misc\";\nimport { indexOfAndSplice } from \"../../helpers/array\";\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLButtonElement;\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 constructor() {\n super({\n sidebarEl: document.getElementById('column-left') as HTMLDivElement,\n navigationType: 'left'\n });\n\n //this._selectTab(0); // make first tab as default\n\n this.inputSearch = new InputSearch('Search');\n const sidebarHeader = this.sidebarEl.querySelector('.item-main .sidebar-header');\n sidebarHeader.append(this.inputSearch.container);\n\n const onNewGroupClick = () => {\n new AppAddMembersTab(this).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => {\n new AppNewGroupTab(this).open(peerIds);\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n new AppContactsTab(this).open();\n };\n\n //this.toolsBtn = this.sidebarEl.querySelector('.sidebar-tools-button') as HTMLButtonElement;\n this.backBtn = this.sidebarEl.querySelector('.sidebar-back-button') as HTMLButtonElement;\n\n const btnArchive: ButtonMenuItemOptions & {verify?: () => boolean} = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n new AppArchivedTab(this).open();\n },\n verify: () => {\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(1, false);\n return !!folder.length || !appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: rootScope.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', () => {\n rootScope.settings.theme = themeCheckboxField.input.checked ? 'night' : 'day';\n appStateManager.pushToState('settings', rootScope.settings);\n rootScope.dispatchEvent('theme_change');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(rootScope.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[] = [{\n icon: 'saved',\n text: 'SavedMessages',\n onClick: () => {\n setTimeout(() => { // menu doesn't close if no timeout (lol)\n appImManager.setPeer(appImManager.myId);\n }, 0);\n }\n }, btnArchive, {\n icon: 'user',\n text: 'Contacts',\n onClick: onContactsClick\n }, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n new AppSettingsTab(this).open();\n }\n }, {\n icon: 'darkmode',\n text: 'DarkMode',\n onClick: () => {\n \n },\n checkboxField: themeCheckboxField\n }, {\n icon: 'animations',\n text: 'Animations',\n onClick: () => {\n \n },\n checkboxField: new CheckboxField({\n toggle: true, \n checked: true,\n stateKey: 'settings.animationsEnabled',\n })\n }, {\n icon: 'help',\n text: 'TelegramFeatures',\n onClick: () => {\n appImManager.openUsername('TelegramTips');\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 this.toolsBtn = ButtonMenuToggle({}, 'bottom-right', menuButtons, (e) => {\n menuButtons.forEach(button => {\n if(button.verify) {\n button.element.classList.toggle('hide', !button.verify());\n }\n });\n });\n this.toolsBtn.classList.remove('tgico-more');\n this.toolsBtn.classList.add('sidebar-tools-button', 'is-visible');\n\n this.backBtn.parentElement.insertBefore(this.toolsBtn, this.backBtn);\n\n const btnMenu = this.toolsBtn.querySelector('.btn-menu') as HTMLElement;\n\n const btnMenuFooter = document.createElement('a');\n btnMenuFooter.href = 'https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md';\n btnMenuFooter.target = '_blank';\n btnMenuFooter.rel = 'noopener noreferrer';\n btnMenuFooter.classList.add('btn-menu-footer');\n btnMenuFooter.addEventListener(CLICK_EVENT_NAME, (e) => {\n e.stopPropagation();\n closeBtnMenu();\n });\n const t = document.createElement('span');\n t.classList.add('btn-menu-footer-text');\n t.innerHTML = 'Telegram Web' + App.suffix + ' alpha ' + App.versionFull;\n btnMenuFooter.append(t); \n btnMenu.classList.add('has-footer');\n btnMenu.append(btnMenuFooter);\n\n this.newBtnMenu = ButtonMenuToggle({}, 'top-left', [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n new AppNewChannelTab(this).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]);\n this.newBtnMenu.className = 'btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon';\n this.newBtnMenu.insertAdjacentHTML('afterbegin', `\n \n \n `);\n this.newBtnMenu.id = 'new-menu';\n sidebarHeader.nextElementSibling.append(this.newBtnMenu);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n //parseMenuButtonsTo(this.newButtons, this.newBtnMenu.firstElementChild.children);\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n btnArchive.element.append(this.archivedCount);\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 1) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadDialogsCount;\n this.archivedCount.innerText = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n appUsersManager.getTopPeers('correspondents');\n\n appStateManager.getState().then(state => {\n const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n appStateManager.requestPeer(recentSearch[i], 'recentSearch');\n }\n });\n }\n\n private initSearch() {\n const searchContainer = this.sidebarEl.querySelector('#search-container') as HTMLDivElement;\n\n const scrollable = new Scrollable(searchContainer);\n\n const close = () => {\n //setTimeout(() => {\n this.backBtn.click();\n //}, 0);\n };\n\n this.searchGroups = {\n contacts: new SearchGroup('Search.Chats', 'contacts', undefined, undefined, undefined, undefined, close),\n globalContacts: new SearchGroup('Search.Global', 'contacts', undefined, undefined, undefined, undefined, close),\n messages: new SearchGroup('Search.Messages', 'messages'),\n people: new SearchGroup(false, 'contacts', true, 'search-group-people', true, false, close),\n recent: new SearchGroup('Recent', 'contacts', true, 'search-group-recent', true, true, close)\n };\n\n const searchSuper = this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'FilterChats',\n type: 'chats'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable, \n searchGroups: this.searchGroups, \n asChatList: true,\n hideEmptyTabs: false,\n showSender: true\n });\n\n searchContainer.prepend(searchSuper.nav.parentElement.parentElement);\n scrollable.container.append(searchSuper.container);\n\n const resetSearch = () => {\n searchSuper.setQuery({\n peerId: ''.toPeerId(), \n folderId: 0\n });\n searchSuper.selectTab(0);\n searchSuper.load(true); \n };\n\n resetSearch();\n\n let pickedElements: HTMLElement[] = [];\n let selectedPeerId: PeerId = ''.toPeerId();\n let selectedMinDate = 0;\n let selectedMaxDate = 0;\n const updatePicked = () => {\n //(this.inputSearch.input as HTMLInputElement).placeholder = pickedElements.length ? 'Search' : 'Telegram Search';\n this.inputSearch.container.classList.toggle('is-picked-twice', pickedElements.length === 2);\n this.inputSearch.container.classList.toggle('is-picked', !!pickedElements.length);\n\n if(pickedElements.length) {\n this.inputSearch.input.style.setProperty('--paddingLeft', (pickedElements[pickedElements.length - 1].getBoundingClientRect().right - this.inputSearch.input.getBoundingClientRect().left) + 'px');\n } else {\n this.inputSearch.input.style.removeProperty('--paddingLeft');\n }\n };\n\n const helper = document.createElement('div');\n helper.classList.add('search-helper');\n helper.addEventListener('click', (e) => {\n const target = findUpClassName(e.target, 'selector-user');\n if(!target) {\n return;\n }\n\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n const [_, minDate, maxDate] = key.split('_');\n selectedMinDate = +minDate;\n selectedMaxDate = +maxDate;\n } else {\n selectedPeerId = key.toPeerId();\n }\n\n target.addEventListener('click', () => {\n unselectEntity(target);\n });\n\n this.inputSearch.container.append(target);\n this.inputSearch.onChange(this.inputSearch.value = '');\n pickedElements.push(target);\n updatePicked();\n });\n\n searchSuper.nav.parentElement.append(helper);\n\n const renderEntity = (key: PeerId | string, title?: string | HTMLElement) => {\n const div = document.createElement('div');\n div.classList.add('selector-user'/* , 'scale-in' */);\n\n const avatarEl = document.createElement('avatar-element');\n avatarEl.classList.add('selector-user-avatar', 'tgico');\n avatarEl.setAttribute('dialog', '1');\n avatarEl.classList.add('avatar-30');\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.setAttribute('peer', '' + key);\n } else {\n avatarEl.classList.add('tgico-calendarfilter');\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n return div;\n };\n\n const unselectEntity = (target: HTMLElement) => {\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n selectedMinDate = selectedMaxDate = 0;\n } else {\n selectedPeerId = ''.toPeerId();\n }\n \n target.remove();\n indexOfAndSplice(pickedElements, target);\n\n setTimeout(() => {\n updatePicked();\n this.inputSearch.onChange(this.inputSearch.value);\n }, 0);\n };\n\n this.inputSearch.onClear = () => {\n pickedElements.forEach(el => {\n unselectEntity(el);\n });\n };\n\n this.inputSearch.onChange = (value) => {\n searchSuper.cleanupHTML();\n searchSuper.setQuery({\n peerId: selectedPeerId, \n folderId: selectedPeerId ? undefined : 0,\n query: value,\n minDate: selectedMinDate,\n maxDate: selectedMaxDate\n });\n searchSuper.load(true);\n\n helper.innerHTML = '';\n searchSuper.nav.classList.remove('hide');\n if(!value) {\n }\n \n if(!selectedPeerId && value.trim()) {\n const middleware = searchSuper.middleware.get();\n Promise.all([\n // appMessagesManager.getConversationsAll(value).then(dialogs => dialogs.map(d => d.peerId)),\n appMessagesManager.getConversations(value).promise.then(({dialogs}) => dialogs.map(d => d.peerId)),\n appUsersManager.getContactsPeerIds(value, true)\n ]).then(results => {\n if(!middleware()) return;\n const peerIds = new Set(results[0].concat(results[1]));\n \n peerIds.forEach(peerId => {\n helper.append(renderEntity(peerId));\n });\n \n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n //console.log('got peerIds by value:', value, [...peerIds]);\n });\n }\n \n if(!selectedMinDate && value.trim()) {\n const dates: DateData[] = [];\n fillTipDates(value, dates);\n dates.forEach(dateData => {\n helper.append(renderEntity('date_' + dateData.minDate + '_' + dateData.maxDate, dateData.title));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n }\n };\n\n searchSuper.tabs.inputMessagesFilterEmpty.addEventListener('mousedown', (e) => {\n const target = findUpTag(e.target, 'LI') as HTMLElement;\n if(!target) {\n return;\n }\n\n const searchGroup = findUpClassName(target, 'search-group');\n if(!searchGroup || searchGroup.classList.contains('search-group-recent') || searchGroup.classList.contains('search-group-people')) {\n return;\n }\n\n const peerId = target.getAttribute('data-peer-id').toPeerId();\n appStateManager.getState().then(state => {\n const recentSearch = state.recentSearch || [];\n if(recentSearch[0] !== peerId) {\n indexOfAndSplice(recentSearch, peerId);\n recentSearch.unshift(peerId);\n if(recentSearch.length > 20) {\n recentSearch.length = 20;\n }\n \n appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n appStateManager.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }, {capture: true});\n\n let peopleContainer = document.createElement('div');\n peopleContainer.classList.add('search-group-scrollable');\n peopleContainer.append(this.searchGroups.people.list);\n this.searchGroups.people.container.append(peopleContainer);\n let peopleScrollable = new ScrollableX(peopleContainer);\n\n let first = true;\n let hideNewBtnMenuTimeout: number;\n //const transition = Transition.bind(null, searchContainer.parentElement, 150);\n const transition = TransitionSlider(searchContainer.parentElement, 'zoom-fade', 150, (id) => {\n if(hideNewBtnMenuTimeout) clearTimeout(hideNewBtnMenuTimeout);\n\n if(id === 0 && !first) {\n searchSuper.selectTab(0, false);\n this.inputSearch.onClearClick();\n hideNewBtnMenuTimeout = window.setTimeout(() => {\n hideNewBtnMenuTimeout = 0;\n this.newBtnMenu.classList.remove('is-hidden');\n }, 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.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', true);\n\n if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType('global-search')) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: 'global-search'\n });\n }\n\n transition(1);\n };\n\n this.inputSearch.input.addEventListener('focus', onFocus);\n onFocus();\n\n this.backBtn.addEventListener('click', (e) => {\n this.toolsBtn.classList.add(activeClassName);\n this.backBtn.classList.remove(activeClassName);\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', false);\n\n appNavigationController.removeByType('global-search');\n\n transition(0);\n });\n\n const clearRecentSearchBtn = document.createElement('button');\n clearRecentSearchBtn.classList.add('btn-icon', 'tgico-close');\n this.searchGroups.recent.nameEl.append(clearRecentSearchBtn);\n clearRecentSearchBtn.addEventListener('click', () => {\n this.searchGroups.recent.clear();\n appStateManager.pushToState('recentSearch', []);\n });\n }\n}\n\nexport class SettingSection {\n public container: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public caption: HTMLElement;\n\n constructor(options: {\n name?: LangPackKey, \n caption?: LangPackKey | true,\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean\n }) {\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-left-section');\n\n if(options.fakeGradientDelimiter) {\n this.container.append(generateDelimiter());\n this.container.classList.add('with-fake-delimiter');\n } else if(!options.noDelimiter) {\n const hr = document.createElement('hr');\n this.container.append(hr);\n } else {\n this.container.classList.add('no-delimiter');\n }\n\n this.content = this.generateContentElement();\n\n if(options.name) {\n this.title = document.createElement('div');\n this.title.classList.add('sidebar-left-h2', 'sidebar-left-section-name');\n i18n_({element: this.title, key: options.name});\n this.content.append(this.title);\n }\n\n if(options.caption) {\n this.caption = this.generateContentElement();\n this.caption.classList.add('sidebar-left-section-caption');\n\n if(options.caption !== true) {\n i18n_({element: this.caption, key: options.caption});\n }\n }\n }\n\n public generateContentElement() {\n const content = document.createElement('div');\n content.classList.add('sidebar-left-section-content');\n this.container.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\nconst appSidebarLeft = new AppSidebarLeft();\nMOUNT_CLASS_TO.appSidebarLeft = appSidebarLeft;\nexport default appSidebarLeft;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\n//import { generatePathData } from \"../../helpers/dom\";\r\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type Chat from \"./chat\";\r\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\n\r\ntype Group = {bubble: HTMLElement, mid: number, timestamp: number}[];\r\ntype BubbleGroup = {timestamp: number, fromId: PeerId, mid: number, group: Group};\r\nexport default class BubbleGroups {\r\n private bubbles: Array = []; // map to group\r\n private detailsMap: Map = new Map();\r\n private groups: Array = [];\r\n //updateRAFs: Map = new Map();\r\n private newGroupDiff = 121; // * 121 in scheduled messages\r\n\r\n constructor(private chat: Chat) {\r\n\r\n }\r\n\r\n removeBubble(bubble: HTMLElement) {\r\n const details = this.detailsMap.get(bubble);\r\n if(details) {\r\n if(details.group.length) {\r\n details.group.findAndSplice(d => d.bubble === bubble);\r\n if(!details.group.length) {\r\n indexOfAndSplice(this.groups, details.group);\r\n } else {\r\n this.updateGroup(details.group);\r\n }\r\n }\r\n \r\n this.detailsMap.delete(bubble);\r\n }\r\n }\r\n\r\n changeBubbleMid(bubble: HTMLElement, mid: number) {\r\n const details = this.detailsMap.get(bubble);\r\n if(details) {\r\n details.mid = mid;\r\n }\r\n }\r\n \r\n addBubble(bubble: HTMLElement, message: MyMessage, reverse: boolean) {\r\n //return;\r\n\r\n const timestamp = message.date;\r\n const mid = message.mid;\r\n let fromId = message.viaBotId || message.fromId;\r\n let group: Group;\r\n\r\n // fix for saved messages forward to self\r\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as any).fwdFromId === fromId) {\r\n fromId = fromId.toPeerId(true);\r\n }\r\n \r\n // try to find added\r\n this.removeBubble(bubble);\r\n \r\n const insertObject = {bubble, mid, timestamp};\r\n if(this.bubbles.length) {\r\n let foundBubble: BubbleGroup;\r\n let foundAtIndex = -1;\r\n for(let i = 0; i < this.bubbles.length; ++i) {\r\n const bubble = this.bubbles[i];\r\n const diff = Math.abs(bubble.timestamp - timestamp);\r\n const good = bubble.fromId === fromId && diff <= this.newGroupDiff;\r\n\r\n if(good) {\r\n foundAtIndex = i;\r\n\r\n if(this.chat.type === 'scheduled') {\r\n break;\r\n }\r\n } else {\r\n foundAtIndex = -1;\r\n }\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n if(mid > bubble.mid) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if(foundAtIndex !== -1) {\r\n foundBubble = this.bubbles[foundAtIndex];\r\n }\r\n /* const foundBubble = this.bubbles.find(bubble => {\r\n const diff = Math.abs(bubble.timestamp - timestamp);\r\n return bubble.fromId === fromId && diff <= this.newGroupDiff;\r\n }); */\r\n\r\n if(!foundBubble) this.groups.push(group = [insertObject]);\r\n else {\r\n group = foundBubble.group;\r\n \r\n let i = 0, foundMidOnSameTimestamp = 0;\r\n for(; i < group.length; ++i) {\r\n const _timestamp = group[i].timestamp;\r\n const _mid = group[i].mid;\r\n\r\n if(timestamp < _timestamp) {\r\n break;\r\n } else if(timestamp === _timestamp) {\r\n foundMidOnSameTimestamp = _mid;\r\n } \r\n \r\n if(foundMidOnSameTimestamp && mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n\r\n group.splice(i, 0, insertObject);\r\n }\r\n } else {\r\n this.groups.push(group = [insertObject]);\r\n }\r\n\r\n //console.log('[BUBBLE]: addBubble', bubble, message.mid, fromId, reverse, group);\r\n\r\n const bubbleGroup = {timestamp, fromId, mid: message.mid, group};\r\n let insertIndex = 0;\r\n for(; insertIndex < this.bubbles.length; ++insertIndex) {\r\n if(this.bubbles[insertIndex].mid < mid) {\r\n break;\r\n }\r\n }\r\n \r\n this.bubbles.splice(insertIndex, 0, {timestamp, fromId, mid: message.mid, group});\r\n this.updateGroup(group);\r\n\r\n this.detailsMap.set(bubble, bubbleGroup);\r\n }\r\n\r\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\r\n //console.log('setClipIfNeeded', bubble, remove);\r\n const className = bubble.className;\r\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\r\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\r\n //console.log('setClipIfNeeded', bubble, remove, container);\r\n if(!container) return;\r\n\r\n try {\r\n Array.from(container.children).forEach(object => {\r\n if(object instanceof SVGDefsElement) return;\r\n \r\n if(remove) {\r\n object.removeAttributeNS(null, 'clip-path');\r\n } else {\r\n let clipId = container.dataset.clipId;\r\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\r\n let width = +object.getAttributeNS(null, 'width');\r\n let height = +object.getAttributeNS(null, 'height');\r\n let isOut = className.includes('is-out');\r\n let isReply = className.includes('is-reply');\r\n let d = '';\r\n \r\n //console.log('setClipIfNeeded', object, width, height, isOut);\r\n \r\n let tr: number, tl: number;\r\n if(className.includes('forwarded') || isReply) {\r\n tr = tl = 0;\r\n } else if(isOut) {\r\n tr = className.includes('is-group-first') ? 12 : 6;\r\n tl = 12;\r\n } else {\r\n tr = 12;\r\n tl = className.includes('is-group-first') ? 12 : 6;\r\n }\r\n \r\n if(isOut) {\r\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\r\n } else {\r\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\r\n }\r\n \r\n path.setAttributeNS(null, 'd', d);\r\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\r\n }\r\n });\r\n } catch(err) {}\r\n }\r\n } */\r\n \r\n updateGroup(group: Group) {\r\n /* if(this.updateRAFs.has(group)) {\r\n window.cancelAnimationFrame(this.updateRAFs.get(group));\r\n this.updateRAFs.delete(group);\r\n } */\r\n \r\n //this.updateRAFs.set(group, window.requestAnimationFrame(() => {\r\n //this.updateRAFs.delete(group);\r\n \r\n if(!group.length) {\r\n return;\r\n }\r\n \r\n const first = group[0].bubble;\r\n\r\n //console.log('[BUBBLE]: updateGroup', group, first);\r\n \r\n if(group.length === 1) {\r\n first.classList.add('is-group-first', 'is-group-last');\r\n //this.setClipIfNeeded(first);\r\n return;\r\n } else {\r\n first.classList.remove('is-group-last');\r\n first.classList.add('is-group-first');\r\n //this.setClipIfNeeded(first, true);\r\n }\r\n \r\n const length = group.length - 1;\r\n for(let i = 1; i < length; ++i) {\r\n const bubble = group[i].bubble;\r\n bubble.classList.remove('is-group-last', 'is-group-first');\r\n //this.setClipIfNeeded(bubble, true);\r\n }\r\n \r\n const last = group[group.length - 1].bubble;\r\n last.classList.remove('is-group-first');\r\n last.classList.add('is-group-last');\r\n //this.setClipIfNeeded(last);\r\n //}));\r\n }\r\n\r\n updateGroupByMessageId(mid: number) {\r\n const details = this.bubbles.find(g => g.mid === mid);\r\n if(details) {\r\n this.updateGroup(details.group);\r\n }\r\n }\r\n \r\n cleanup() {\r\n this.bubbles = [];\r\n this.groups = [];\r\n this.detailsMap.clear();\r\n /* for(let value of this.updateRAFs.values()) {\r\n window.cancelAnimationFrame(value);\r\n }\r\n this.updateRAFs.clear(); */\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, { PopupOptions } from \".\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport InputField from \"../inputField\";\r\n\r\nexport default class PopupDatePicker extends PopupElement {\r\n protected controlsDiv: HTMLElement;\r\n protected monthTitle: HTMLElement;\r\n protected prevBtn: HTMLElement;\r\n protected nextBtn: HTMLElement;\r\n\r\n protected monthsContainer: HTMLElement;\r\n protected month: HTMLElement;\r\n\r\n protected minMonth: Date;\r\n protected maxMonth: Date;\r\n protected minDate: Date;\r\n protected maxDate: Date;\r\n protected selectedDate: Date;\r\n protected selectedMonth: Date;\r\n protected selectedEl: HTMLElement;\r\n\r\n protected timeDiv: HTMLDivElement;\r\n protected hoursInputField: InputField;\r\n protected minutesInputField: InputField;\r\n\r\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\r\n noButtons: true, \r\n noTitle: true, \r\n minDate: Date,\r\n maxDate: Date\r\n withTime: true,\r\n showOverflowMonths: true\r\n }> & PopupOptions = {}) {\r\n super('popup-date-picker', options.noButtons ? [] : [{\r\n langKey: 'JumpToDate',\r\n callback: () => {\r\n if(this.onPick) {\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n }\r\n }, {\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }], {body: true, overlayClosable: true, ...options});\r\n\r\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\r\n\r\n if(initDate < this.minDate) {\r\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\r\n }\r\n\r\n // Controls\r\n this.controlsDiv = document.createElement('div');\r\n this.controlsDiv.classList.add('date-picker-controls');\r\n\r\n this.prevBtn = document.createElement('button');\r\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\r\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.nextBtn = document.createElement('button');\r\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\r\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.monthTitle = document.createElement('div');\r\n this.monthTitle.classList.add('date-picker-month-title');\r\n\r\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\r\n\r\n // Month\r\n this.monthsContainer = document.createElement('div');\r\n this.monthsContainer.classList.add('date-picker-months');\r\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.controlsDiv, this.monthsContainer);\r\n\r\n // Time inputs\r\n if(options.withTime) {\r\n this.timeDiv = document.createElement('div');\r\n this.timeDiv.classList.add('date-picker-time');\r\n\r\n const delimiter = document.createElement('div');\r\n delimiter.classList.add('date-picker-time-delimiter');\r\n delimiter.append(':');\r\n\r\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\r\n const maxString = '' + max;\r\n this.listenerSetter.add(inputField.input)('input', (e) => {\r\n let value = inputField.value.replace(/\\D/g, '');\r\n if(value.length > 2) {\r\n value = value.slice(0, 2);\r\n } else {\r\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\r\n if(value.length === 2 && onOverflow) {\r\n onOverflow(+value[1]);\r\n }\r\n\r\n value = '0' + value[0];\r\n }\r\n }\r\n\r\n inputField.setValueSilently(value);\r\n onInput(value.length);\r\n });\r\n };\r\n\r\n this.hoursInputField = new InputField({plainText: true});\r\n this.minutesInputField = new InputField({plainText: true});\r\n\r\n handleTimeInput(23, this.hoursInputField, (length) => {\r\n if(length === 2) {\r\n this.minutesInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n }, (number) => {\r\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\r\n });\r\n handleTimeInput(59, this.minutesInputField, (length) => {\r\n if(!length) {\r\n this.hoursInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n });\r\n\r\n this.selectedDate = initDate;\r\n\r\n initDate.setMinutes(initDate.getMinutes() + 10);\r\n \r\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\r\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\r\n\r\n initDate.setHours(0, 0, 0, 0);\r\n \r\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\r\n\r\n attachClickEvent(this.btnConfirm, () => {\r\n if(this.onPick) {\r\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n\r\n this.hide();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.timeDiv);\r\n\r\n this.prevBtn.classList.add('primary');\r\n this.nextBtn.classList.add('primary');\r\n }\r\n\r\n const popupCenterer = document.createElement('div');\r\n popupCenterer.classList.add('popup-centerer');\r\n popupCenterer.append(this.container);\r\n this.element.append(popupCenterer);\r\n\r\n //const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\r\n //this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\r\n initDate.setHours(0, 0, 0, 0);\r\n this.selectedDate = initDate;\r\n\r\n this.maxDate = options.maxDate || new Date();\r\n this.maxDate.setHours(0, 0, 0, 0);\r\n\r\n this.selectedMonth = new Date(this.selectedDate);\r\n this.selectedMonth.setDate(1);\r\n\r\n this.maxMonth = new Date(this.maxDate);\r\n this.maxMonth.setDate(1);\r\n\r\n this.minMonth = new Date(this.minDate);\r\n this.minMonth.setHours(0, 0, 0, 0);\r\n this.minMonth.setDate(1);\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.noTitle) {\r\n this.setTitle = () => {};\r\n }\r\n\r\n this.setTimeTitle();\r\n this.setTitle();\r\n this.setMonth();\r\n }\r\n\r\n onPrevClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n \r\n this.nextBtn.removeAttribute('disabled');\r\n };\r\n\r\n onNextClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n this.prevBtn.removeAttribute('disabled');\r\n };\r\n\r\n onDateClick = (e: MouseEvent) => {\r\n //cancelEvent(e);\r\n const target = e.target as HTMLElement;\r\n\r\n if(!target.dataset.timestamp) return;\r\n\r\n if(this.selectedEl) {\r\n if(this.selectedEl === target) return;\r\n this.selectedEl.classList.remove('active');\r\n }\r\n\r\n this.selectedEl = target;\r\n \r\n target.classList.add('active');\r\n const timestamp = +target.dataset.timestamp;\r\n\r\n this.selectedDate = new Date(timestamp);\r\n\r\n this.setTitle();\r\n this.setTimeTitle();\r\n };\r\n\r\n public setTimeTitle() {\r\n if(this.btnConfirm && this.selectedDate) {\r\n let key: LangPackKey, args: any[] = [];\r\n const date = new Date();\r\n date.setHours(0, 0, 0, 0);\r\n\r\n const timeOptions: Intl.DateTimeFormatOptions = {\r\n minute: '2-digit',\r\n hour: '2-digit'\r\n };\r\n \r\n const sendDate = new Date(this.selectedDate.getTime());\r\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\r\n\r\n if(this.selectedDate.getTime() === date.getTime()) {\r\n key = 'Schedule.SendToday';\r\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\r\n dayStr = 'Tomorrow';\r\n } */ else {\r\n key = 'Schedule.SendDate';\r\n\r\n const dateOptions: Intl.DateTimeFormatOptions = {\r\n month: 'short',\r\n day: 'numeric'\r\n };\r\n\r\n if(sendDate.getFullYear() !== date.getFullYear()) {\r\n dateOptions.year = 'numeric';\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: dateOptions\r\n }).element);\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: timeOptions\r\n }).element);\r\n\r\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\r\n }\r\n }\r\n\r\n public setTitle() {\r\n //const splitted = this.selectedDate.toString().split(' ', 3);\r\n //this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\r\n this.title.textContent = '';\r\n this.title.append(new I18n.IntlDateElement({\r\n date: this.selectedDate,\r\n options: {\r\n day: 'numeric',\r\n month: 'long',\r\n weekday: 'short'\r\n }\r\n }).element);\r\n }\r\n\r\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\r\n const el = document.createElement('button');\r\n el.classList.add('btn-icon', 'date-picker-month-date');\r\n\r\n if(disabled) {\r\n el.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(innerText) {\r\n el.append(innerText);\r\n }\r\n\r\n return el;\r\n }\r\n\r\n public setMonth() {\r\n const firstDate = new Date(this.selectedMonth);\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\r\n };\r\n\r\n this.monthTitle.textContent = '';\r\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\r\n //this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\r\n\r\n if(this.month) {\r\n this.month.remove();\r\n }\r\n\r\n this.month = document.createElement('div');\r\n this.month.classList.add('date-picker-month');\r\n\r\n const weekStartDate = new Date();\r\n const day = weekStartDate.getDay();\r\n if(day !== 1) {\r\n weekStartDate.setHours(-24 * (day - 1)); \r\n }\r\n\r\n for(let i = 0; i < 7; ++i) {\r\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\r\n el.classList.remove('date-picker-month-date');\r\n el.classList.add('date-picker-month-day');\r\n this.month.append(el);\r\n weekStartDate.setDate(weekStartDate.getDate() + 1);\r\n }\r\n\r\n // 0 - sunday\r\n let dayIndex = firstDate.getDay() - 1;\r\n if(dayIndex === -1) dayIndex = 7 - 1;\r\n\r\n const clonedDate = new Date(firstDate.getTime());\r\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\r\n\r\n // Padding first week\r\n for(let i = 0; i < dayIndex; ++i) {\r\n if(this.options.showOverflowMonths) {\r\n clonedDate.setDate(clonedDate.getDate() + 1);\r\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\r\n } else {\r\n this.month.append(this.renderElement(true));\r\n }\r\n }\r\n\r\n do {\r\n const date = firstDate.getDate();\r\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\r\n el.dataset.timestamp = '' + firstDate.getTime();\r\n\r\n if(firstDate.getTime() === this.selectedDate.getTime()) {\r\n this.selectedEl = el;\r\n el.classList.add('active');\r\n }\r\n\r\n this.month.append(el);\r\n\r\n firstDate.setDate(date + 1);\r\n } while(firstDate.getDate() !== 1);\r\n\r\n const remainder = this.month.childElementCount % 7;\r\n if(this.options.showOverflowMonths && remainder) {\r\n for(let i = remainder; i < 7; ++i) {\r\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\r\n firstDate.setDate(firstDate.getDate() + 1);\r\n }\r\n }\r\n\r\n const lines = Math.ceil(this.month.childElementCount / 7);\r\n this.container.dataset.lines = '' + lines;\r\n\r\n this.monthsContainer.append(this.month);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class StickyIntersector {\r\n private headersObserver: IntersectionObserver;\r\n private elementsObserver: IntersectionObserver;\r\n\r\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\r\n this.observeHeaders();\r\n this.observeElements();\r\n }\r\n\r\n /**\r\n * Sets up an intersection observer to notify when elements with the class\r\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\r\n * @param {!Element} container\r\n */\r\n private observeHeaders() {\r\n this.headersObserver = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const targetInfo = entry.boundingClientRect;\r\n const stickyTarget = entry.target.parentElement;\r\n const rootBoundsInfo = entry.rootBounds;\r\n \r\n // Started sticking.\r\n if(targetInfo.bottom < rootBoundsInfo.top) {\r\n this.handler(true, stickyTarget);\r\n }\r\n \r\n // Stopped sticking.\r\n if(targetInfo.bottom >= rootBoundsInfo.top &&\r\n targetInfo.bottom < rootBoundsInfo.bottom) {\r\n this.handler(false, stickyTarget);\r\n }\r\n }\r\n }, {threshold: 0, root: this.container});\r\n }\r\n \r\n private observeElements() {\r\n this.elementsObserver = new IntersectionObserver((entries) => {\r\n let entry = entries.filter(entry => entry.boundingClientRect.top < 0).sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\r\n if(!entry) return;\r\n let 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}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\r\nimport { formatNumber } from \"../../helpers/number\";\r\nimport { Message } from \"../../layer\";\r\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\r\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\r\n\r\nconst TAG_NAME = 'replies-element';\r\n\r\nrootScope.addEventListener('replies_updated', (e) => {\r\n const message = e;\r\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach(element => {\r\n element.message = message;\r\n element.render();\r\n });\r\n});\r\n\r\nexport default class RepliesElement extends HTMLElement {\r\n public message: Message.message;\r\n public type: 'footer' | 'beside';\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueueIntersector;\r\n \r\n private updated = false;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n public init() {\r\n this.render();\r\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\r\n this.classList.add('replies', 'replies-' + this.type);\r\n }\r\n\r\n public render() {\r\n const replies = this.message.replies;\r\n\r\n /* if(this.firstChild) {\r\n this.innerHTML = '';\r\n } */\r\n\r\n if(this.type === 'footer') {\r\n let leftPart: HTMLElement;\r\n if(this.firstElementChild) {\r\n leftPart = this.firstElementChild as HTMLElement;\r\n }\r\n\r\n if(replies?.recent_repliers) {\r\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\r\n this.innerHTML = '';\r\n leftPart = null;\r\n }\r\n\r\n if(!leftPart) {\r\n leftPart = document.createElement('div');\r\n leftPart.classList.add('replies-footer-avatars');\r\n }\r\n\r\n replies.recent_repliers.slice().reverse().forEach((peer, idx) => {\r\n let avatarElem = leftPart.children[idx] as AvatarElement;\r\n if(!avatarElem) {\r\n avatarElem = new AvatarElement();\r\n avatarElem.setAttribute('dialog', '0');\r\n avatarElem.classList.add('avatar-30');\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n \r\n if(this.loadPromises) {\r\n avatarElem.loadPromises = this.loadPromises;\r\n }\r\n }\r\n \r\n avatarElem.setAttribute('peer', '' + appPeersManager.getPeerId(peer));\r\n \r\n if(!avatarElem.parentNode) {\r\n leftPart.append(avatarElem);\r\n }\r\n });\r\n\r\n // if were 3 and became 2\r\n (Array.from(leftPart.children) as HTMLElement[]).slice(replies.recent_repliers.length).forEach(el => el.remove());\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.append(leftPart);\r\n }\r\n \r\n let text: HTMLElement;\r\n if(replies) {\r\n if(replies.replies) {\r\n text = i18n('Comments', [replies.replies]);\r\n } else {\r\n text = i18n('LeaveAComment');\r\n }\r\n } else {\r\n text = i18n('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);\r\n } else {\r\n this.classList.add('bubble-beside-button');\r\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\r\n }\r\n\r\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\r\n appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\r\n appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\r\n this.updated = true;\r\n }\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises = undefined;\r\n }\r\n }\r\n}\r\n\r\ncustomElements.define(TAG_NAME, RepliesElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { formatTime, getFullDate } from \"../../helpers/date\";\nimport { formatNumber } from \"../../helpers/number\";\nimport { Message } from \"../../layer\";\nimport { i18n, _i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport PeerTitle from \"../peerTitle\";\nimport { wrapReply } from \"../wrappers\";\nimport Chat 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\nexport namespace MessageRender {\n /* export const setText = () => {\n\n }; */\n\n export const setTime = (chat: Chat, message: Message.message, bubble: HTMLElement, bubbleContainer: HTMLElement, messageDiv: HTMLElement) => {\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n let time = formatTime(date);\n\n if(message.views) {\n const postAuthor = message.post_author || message.fwd_from?.post_author;\n\n bubble.classList.add('channel-post');\n\n const postViewsSpan = document.createElement('span');\n postViewsSpan.classList.add('post-views');\n postViewsSpan.innerHTML = formatNumber(message.views, 1);\n\n const channelViews = document.createElement('i');\n channelViews.classList.add('tgico-channelviews', 'time-icon');\n\n args.push(postViewsSpan, channelViews);\n if(postAuthor) {\n const span = document.createElement('span');\n span.innerHTML = RichTextProcessor.wrapEmojiText(postAuthor) + ',' + NBSP;\n args.push(span);\n }\n }\n\n let editedSpan: HTMLElement;\n if(message.edit_date && chat.type !== 'scheduled' && !message.pFlags.edit_hide) {\n bubble.classList.add('is-edited');\n\n args.unshift(editedSpan = makeEdited());\n }\n\n if(chat.type !== 'pinned' && message.pFlags.pinned) {\n bubble.classList.add('is-pinned');\n\n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n \n args.push(time);\n\n const title = getFullDate(date) \n + (message.edit_date ? `\\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '')\n + (message.fwd_from ? `\\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('time', 'tgico');\n timeSpan.title = title;\n timeSpan.append(...args);\n\n const inner = document.createElement('div');\n inner.classList.add('inner', 'tgico');\n inner.title = title;\n\n let clonedArgs = args;\n if(editedSpan) {\n clonedArgs[clonedArgs.indexOf(editedSpan)] = makeEdited();\n }\n clonedArgs = clonedArgs.map(a => a instanceof HTMLElement && !a.classList.contains('i18n') ? a.cloneNode(true) as HTMLElement : a);\n clonedArgs[clonedArgs.length - 1] = formatTime(date); // clone time\n inner.append(...clonedArgs);\n\n timeSpan.append(inner);\n\n messageDiv.append(timeSpan);\n\n return timeSpan;\n };\n\n export const renderReplies = ({bubble, bubbleContainer, message, messageDiv, loadPromises, lazyLoadQueue}: {\n bubble: HTMLElement,\n bubbleContainer: HTMLElement,\n message: Message.message,\n messageDiv: HTMLElement,\n loadPromises?: Promise[],\n lazyLoadQueue?: LazyLoadQueueIntersector\n }) => {\n const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big') && !bubble.classList.contains('round');\n const repliesFooter = new RepliesElement();\n repliesFooter.message = message;\n repliesFooter.type = isFooter ? 'footer' : 'beside';\n repliesFooter.loadPromises = loadPromises;\n repliesFooter.lazyLoadQueue = lazyLoadQueue;\n repliesFooter.init();\n bubbleContainer.prepend(repliesFooter);\n return isFooter;\n };\n\n export const setReply = ({chat, bubble, bubbleContainer, message}: {\n chat: Chat,\n bubble: HTMLElement,\n bubbleContainer?: HTMLElement,\n message: Message.message\n }) => {\n const isReplacing = !bubbleContainer;\n if(isReplacing) {\n bubbleContainer = bubble.querySelector('.bubble-content');\n }\n\n const currentReplyDiv = isReplacing ? bubbleContainer.querySelector('.reply') : null;\n if(!message.reply_to_mid) {\n if(currentReplyDiv) {\n currentReplyDiv.remove();\n }\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? chat.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n let originalMessage = chat.appMessagesManager.getMessageByPeer(replyToPeerId, message.reply_to_mid);\n let originalPeerTitle: string | HTMLElement;\n \n /////////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);\n \n // need to download separately\n if(originalMessage._ === 'messageEmpty') {\n //////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n chat.appMessagesManager.wrapSingleMessage(replyToPeerId, message.reply_to_mid);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n \n originalPeerTitle = i18n('Loading');\n } else {\n originalPeerTitle = new PeerTitle({\n peerId: originalMessage.fromId || originalMessage.fwdFromId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const wrapped = wrapReply(originalPeerTitle, undefined, originalMessage);\n if(currentReplyDiv) {\n currentReplyDiv.replaceWith(wrapped);\n } else {\n bubbleContainer.append(wrapped);\n }\n //bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\r\n //return null;\r\n const rect = container.getBoundingClientRect();\r\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\r\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\r\n return document.elementFromPoint(x, y) as any;\r\n};\r\n\r\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function reflowScrollableElement(element: HTMLElement) {\r\n element.style.display = 'none';\r\n void element.offsetLeft; // reflow\r\n element.style.display = '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../config/app\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { indexOfAndSplice } from \"../../helpers/array\";\nimport { validateInitObject } from \"../../helpers/object\";\nimport I18n from \"../langPack\";\nimport { isObject } from \"../mtproto/bin_utils\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport stateStorage from \"../stateStorage\";\nimport appStateManager from \"./appStateManager\";\n\ntype EmojiLangPack = {\n keywords: {\n [keyword: string]: string[],\n },\n version: number,\n langCode: string\n};\n\nconst EMOJI_LANG_PACK: EmojiLangPack = {\n keywords: {},\n version: 0,\n langCode: App.langPackCode\n};\n\nconst RECENT_MAX_LENGTH = 36;\n\nexport class AppEmojiManager {\n private static POPULAR_EMOJI = [\"😂\", \"😘\", \"❤️\", \"😍\", \"😊\", \"😁\", \"👍\", \"☺️\", \"😔\", \"😄\", \"😭\", \"💋\", \"😒\", \"😳\", \"😜\", \"🙈\", \"😉\", \"😃\", \"😢\", \"😝\", \"😱\", \"😡\", \"😏\", \"😞\", \"😅\", \"😚\", \"🙊\", \"😌\", \"😀\", \"😋\", \"😆\", \"👌\", \"😐\", \"😕\"];\n private keywordLangPacks: {\n [langCode: string]: EmojiLangPack\n } = {};\n\n private index: SearchIndex;\n private indexedLangPacks: {[langCode: string]: boolean} = {};\n\n private getKeywordsPromises: {[langCode: string]: Promise} = {};\n\n private recent: string[];\n private getRecentEmojisPromise: Promise;\n\n /* public getPopularEmoji() {\n return stateStorage.get('emojis_popular').then(popEmojis => {\n var result = []\n if (popEmojis && popEmojis.length) {\n for (var i = 0, len = popEmojis.length; i < len; i++) {\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n }\n callback(result)\n return\n }\n\n return stateStorage.get('emojis_recent').then(recentEmojis => {\n recentEmojis = recentEmojis || popular || []\n var shortcut\n var code\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\n shortcut = recentEmojis[i]\n if (Array.isArray(shortcut)) {\n shortcut = shortcut[0]\n }\n if (shortcut && typeof shortcut === 'string') {\n if (shortcut.charAt(0) == ':') {\n shortcut = shortcut.substr(1, shortcut.length - 2)\n }\n if (code = shortcuts[shortcut]) {\n result.push({code: code, rate: 1})\n }\n }\n }\n callback(result)\n });\n });\n }\n\n function pushPopularEmoji (code) {\n getPopularEmoji(function (popularEmoji) {\n var exists = false\n var count = popularEmoji.length\n var result = []\n for (var i = 0; i < count; i++) {\n if (popularEmoji[i].code == code) {\n exists = true\n popularEmoji[i].rate++\n }\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\n }\n if (exists) {\n result.sort(function (a, b) {\n return b[1] - a[1]\n })\n } else {\n if (result.length > 41) {\n result = result.slice(0, 41)\n }\n result.push([code, 1])\n }\n ConfigStorage.set({emojis_popular: result})\n })\n } */\n\n public getEmojiKeywords(langCode: string = App.langPackCode) {\n const promise = this.getKeywordsPromises[langCode];\n if(promise) {\n return promise;\n }\n\n const storageKey: any = 'emojiKeywords_' + langCode;\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\n if(!isObject(pack)) {\n pack = {} as any;\n }\n\n validateInitObject(EMOJI_LANG_PACK, pack);\n\n // important\n pack.langCode = langCode;\n this.keywordLangPacks[langCode] = pack;\n\n return apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\n lang_code: pack.langCode,\n from_version: pack.version\n }).then((keywordsDifference) => {\n pack.version = keywordsDifference.version;\n \n const packKeywords = pack.keywords;\n const keywords = keywordsDifference.keywords;\n for(let i = 0, length = keywords.length; i < length; ++i) {\n const {keyword, emoticons} = keywords[i];\n packKeywords[keyword] = emoticons;\n }\n\n stateStorage.set({\n [storageKey]: pack\n });\n\n return pack;\n }, () => {\n return pack;\n });\n });\n }\n\n public getBothEmojiKeywords() {\n const promises: Promise[] = [\n this.getEmojiKeywords()\n ];\n\n if(I18n.lastRequestedLangCode !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(I18n.lastRequestedLangCode));\n }\n\n if(!this.recent) {\n promises.push(this.getRecentEmojis());\n }\n\n return Promise.all(promises);\n }\n\n public indexEmojis() {\n if(!this.index) {\n this.index = new SearchIndex(undefined, 2);\n }\n\n for(const langCode in this.keywordLangPacks) {\n if(this.indexedLangPacks[langCode]) {\n continue;\n }\n\n const pack = this.keywordLangPacks[langCode];\n const keywords = pack.keywords;\n\n for(const keyword in keywords) {\n const emoticons = keywords[keyword];\n this.index.indexObject(emoticons, keyword);\n }\n\n this.indexedLangPacks[langCode] = true;\n }\n }\n\n public searchEmojis(q: string) {\n this.indexEmojis();\n\n q = q.toLowerCase().replace(/_/g, ' ');\n \n //const perf = performance.now();\n let emojis: Array;\n if(q.trim()) {\n const set = this.index.search(q);\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\n } else {\n emojis = this.recent.concat(AppEmojiManager.POPULAR_EMOJI).slice(0, RECENT_MAX_LENGTH);\n }\n\n emojis = Array.from(new Set(emojis));\n //console.log('searchEmojis', q, 'time', performance.now() - perf);\n\n /* for(let i = 0, length = emojis.length; i < length; ++i) {\n if(emojis[i].includes(zeroWidthJoiner) && !emojis[i].includes('\\ufe0f')) {\n emojis[i] += '\\ufe0f';\n }\n } */\n\n return emojis;\n }\n\n public getRecentEmojis() {\n if(this.getRecentEmojisPromise) return this.getRecentEmojisPromise;\n return this.getRecentEmojisPromise = appStateManager.getState().then(state => {\n return this.recent = Array.isArray(state.recentEmoji) ? state.recentEmoji : [];\n });\n }\n\n public pushRecentEmoji(emoji: string) {\n emoji = RichTextProcessor.fixEmoji(emoji);\n this.getRecentEmojis().then(recent => {\n indexOfAndSplice(recent, emoji);\n recent.unshift(emoji);\n if(recent.length > RECENT_MAX_LENGTH) {\n recent.length = RECENT_MAX_LENGTH;\n }\n\n appStateManager.pushToState('recentEmoji', recent);\n rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n}\n\nconst appEmojiManager = new AppEmojiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appEmojiManager = appEmojiManager);\nexport default appEmojiManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab } from \"..\";\nimport { cancelEvent } from \"../../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\nimport { fastRaf } from \"../../../helpers/schedulers\";\nimport { pause } from \"../../../helpers/schedulers/pause\";\nimport appEmojiManager from \"../../../lib/appManagers/appEmojiManager\";\nimport appImManager from \"../../../lib/appManagers/appImManager\";\nimport Config from \"../../../lib/config\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\nimport rootScope from \"../../../lib/rootScope\";\nimport { emojiFromCodePoints } from \"../../../vendor/emoji\";\nimport { putPreloader } from \"../../misc\";\nimport Scrollable from \"../../scrollable\";\nimport StickyIntersector from \"../../stickyIntersector\";\nimport IS_EMOJI_SUPPORTED from \"../../../environment/emojiSupport\";\nimport { IS_TOUCH_SUPPORTED } from \"../../../environment/touchSupport\";\nimport blurActiveElement from \"../../../helpers/dom/blurActiveElement\";\n\nconst loadedURLs: Set = new Set();\nexport function appendEmoji(emoji: string, container: HTMLElement, prepend = false, unify = false) {\n //const emoji = details.unified;\n //const emoji = (details.unified as string).split('-')\n //.reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n\n let kek: string;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = RichTextProcessor.wrapSingleEmoji(emoji);\n } else {\n emoji = RichTextProcessor.fixEmoji(emoji);\n kek = RichTextProcessor.wrapEmojiText(emoji);\n }\n\n /* if(!kek.includes('emoji')) {\n console.log(emoji, kek, spanEmoji, emoji.length, new TextEncoder().encode(emoji), emojiUnicode(emoji));\n return;\n } */\n\n //console.log(kek);\n\n spanEmoji.innerHTML = kek;\n\n if(spanEmoji.children.length > 1) {\n const first = spanEmoji.firstElementChild;\n spanEmoji.innerHTML = '';\n spanEmoji.append(first);\n }\n\n if(spanEmoji.firstElementChild && !IS_EMOJI_SUPPORTED) {\n const image = spanEmoji.firstElementChild as HTMLImageElement;\n \n const url = image.src;\n if(!loadedURLs.has(url)) {\n image.setAttribute('loading', 'lazy');\n const placeholder = document.createElement('span');\n placeholder.classList.add('emoji-placeholder');\n\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '0';\n placeholder.style.opacity = '1';\n }\n\n image.addEventListener('load', () => {\n fastRaf(() => {\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '';\n placeholder.style.opacity = '';\n }\n\n spanEmoji.classList.remove('empty');\n\n loadedURLs.add(url);\n });\n }, {once: true});\n\n spanEmoji.append(placeholder);\n }\n }\n\n //spanEmoji = spanEmoji.firstElementChild as HTMLSpanElement;\n //spanEmoji.setAttribute('emoji', emoji);\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n}\n\nexport function getEmojiFromElement(element: HTMLElement) {\n if(!findUpClassName(element, 'super-emoji')) return '';\n\n if(element.nodeType === 3) return element.nodeValue;\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n \n return element.getAttribute('alt') || element.innerText;\n}\n\nexport default class EmojiTab implements EmoticonsTab {\n private content: HTMLElement;\n\n private recentItemsDiv: HTMLElement;\n\n private scroll: Scrollable;\n private stickyIntersector: StickyIntersector;\n private menu: HTMLElement;\n\n private closeScrollTop = 0;\n private setMenuActive: (id: number) => boolean;\n\n init() {\n this.content = document.getElementById('content-emoji') as HTMLDivElement;\n\n const categories: LangPackKey[] = [\n 'Emoji.SmilesAndPeople', \n 'Emoji.AnimalsAndNature', \n 'Emoji.FoodAndDrink', \n 'Emoji.TravelAndPlaces', \n 'Emoji.ActivityAndSport', \n 'Emoji.Objects', \n /* 'Emoji.Symbols', */\n 'Emoji.Flags', \n 'Skin Tones' as any\n ];\n const divs: {\n [category in LangPackKey]?: HTMLDivElement\n } = {};\n\n const sorted: Map = new Map([\n [\n 'Emoji.Recent',\n []\n ]\n ]);\n\n for(const emoji in Config.Emoji) {\n const details = Config.Emoji[emoji];\n const i = '' + details;\n const category = categories[+i[0] - 1];\n if(!category) continue; // maybe it's skin tones\n\n let s = sorted.get(category);\n if(!s) {\n s = [];\n sorted.set(category, s);\n }\n \n s[+i.slice(1) || 0] = emoji;\n }\n\n //console.log('emoticons sorted:', sorted);\n\n //Object.keys(sorted).forEach(c => sorted[c].sort((a, b) => a - b));\n\n sorted.delete(categories.pop());\n\n //console.time('emojiParse');\n sorted.forEach((emojis, category) => {\n const div = document.createElement('div');\n div.classList.add('emoji-category');\n\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('category-title');\n titleDiv.append(i18n(category));\n\n const itemsDiv = document.createElement('div');\n itemsDiv.classList.add('super-emojis');\n\n div.append(titleDiv, itemsDiv);\n\n emojis.forEach(unified => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n let emoji = emojiFromCodePoints(unified);\n //if(emoji.includes('🕵')) {\n //console.log('toCodePoints', toCodePoints(emoji));\n //emoji = emoji.replace(/(\\u200d[\\u2640\\u2642\\u2695])(?!\\ufe0f)/, '\\ufe0f$1');\n // const zwjIndex = emoji.indexOf('\\u200d');\n // if(zwjIndex !== -1 && !emoji.includes('\\ufe0f')) {\n // /* if(zwjIndex !== (emoji.length - 1)) {\n // emoji = emoji.replace(/(\\u200d)/g, '\\ufe0f$1');\n // } */\n\n // emoji += '\\ufe0f';\n // //emoji += '\\ufe0f';\n // }\n\n //debugger;\n //}\n\n appendEmoji(emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, itemsDiv, false/* , false */);\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n\n divs[category] = div;\n });\n\n //console.timeEnd('emojiParse');\n\n const menu = this.menu = this.content.previousElementSibling as HTMLElement;\n const emojiScroll = this.scroll = new Scrollable(this.content, 'EMOJI');\n\n //emojiScroll.setVirtualContainer(emojiScroll.container);\n\n const preloader = putPreloader(this.content, true);\n\n Promise.all([\n pause(200),\n appEmojiManager.getRecentEmojis().then(recent => {\n const hasRecent = !!recent.length;\n const activeId = hasRecent ? 0 : 1;\n this.menu.children[0].classList.toggle('hide', !hasRecent);\n this.menu.children[activeId].classList.add('active');\n const m = EmoticonsDropdown.menuOnClick(menu, emojiScroll, undefined, activeId);\n this.stickyIntersector = m.stickyIntersector;\n this.setMenuActive = m.setActive;\n return recent;\n })\n ]).then(([_, recent]) => {\n preloader.remove();\n\n this.recentItemsDiv = divs['Emoji.Recent'].querySelector('.super-emojis');\n for(const emoji of recent) {\n appendEmoji(emoji, this.recentItemsDiv);\n }\n\n this.recentItemsDiv.parentElement.classList.toggle('hide', !this.recentItemsDiv.childElementCount);\n\n categories.unshift('Emoji.Recent');\n categories.map(category => {\n const div = divs[category];\n \n if(!div) {\n console.error('no div by category:', category);\n }\n \n emojiScroll.container.append(div);\n this.stickyIntersector.observeStickyHeaderChanges(div);\n return div;\n });\n });\n\n this.content.addEventListener('click', this.onContentClick);\n this.init = null;\n\n rootScope.addEventListener('emoji_recent', (emoji) => {\n const children = Array.from(this.recentItemsDiv.children) as HTMLElement[];\n for(let i = 0, length = children.length; i < length; ++i) {\n const el = children[i];\n const _emoji = RichTextProcessor.fixEmoji(getEmojiFromElement(el));\n if(emoji === _emoji) {\n if(i === 0) {\n return;\n }\n\n el.remove();\n }\n }\n\n appendEmoji(emoji, this.recentItemsDiv, true);\n this.recentItemsDiv.parentElement.classList.remove('hide');\n this.menu.children[0].classList.remove('hide');\n\n if(!this.closeScrollTop) {\n this.setMenuActive(0);\n }\n });\n\n emoticonsDropdown.addEventListener('close', () => {\n this.closeScrollTop = this.scroll.scrollTop;\n });\n }\n\n onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n \n const emoji = getEmojiFromElement(e.target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n appImManager.chat.input.onEmojiSelected(emoji, false);\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n onClose() {\n\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\r\nimport { wrapVideo } from \"./wrappers\";\r\nimport { LazyLoadQueueRepeat2 } from \"./lazyLoadQueue\";\r\nimport animationIntersector from \"./animationIntersector\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport renderImageFromUrl from \"../helpers/dom/renderImageFromUrl\";\r\nimport calcImageInBox from \"../helpers/calcImageInBox\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\n\r\nconst width = 400;\r\nconst maxSingleWidth = width - 100;\r\nconst height = 100;\r\n\r\nexport default class GifsMasonry {\r\n public lazyLoadQueue: LazyLoadQueueRepeat2;\r\n private scrollPromise: CancellablePromise = Promise.resolve();\r\n private timeout: number = 0;\r\n\r\n constructor(private element: HTMLElement, private group: string, private scrollable: Scrollable, attach = true) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, (target, visible) => {\r\n if(visible) {\r\n this.processVisibleDiv(target);\r\n } else {\r\n this.processInvisibleDiv(target);\r\n }\r\n });\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = animationIntersector.byGroups[group];\r\n\r\n if(players) {\r\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter(p => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\r\n }\r\n }, .25e3); */\r\n\r\n if(attach) {\r\n this.attach();\r\n }\r\n }\r\n \r\n private onScroll = () => {\r\n if(this.timeout) {\r\n clearTimeout(this.timeout);\r\n } else {\r\n this.scrollPromise = deferredPromise();\r\n //animationIntersector.checkAnimations(true, group);\r\n }\r\n\r\n this.timeout = window.setTimeout(() => {\r\n this.timeout = 0;\r\n this.scrollPromise.resolve();\r\n //animationIntersector.checkAnimations(false, group);\r\n }, 150);\r\n };\r\n\r\n public attach() {\r\n this.scrollable.container.addEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public detach() {\r\n this.clear();\r\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n private processVisibleDiv(div: HTMLElement) {\r\n const video = div.querySelector('video');\r\n if(video) {\r\n return;\r\n }\r\n\r\n //console.log('processVisibleDiv');\r\n\r\n const load = () => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n const promise = this.scrollPromise.then(() => {\r\n const res = wrapVideo({\r\n doc,\r\n container: div as HTMLDivElement,\r\n lazyLoadQueue: null,\r\n //lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n group: this.group,\r\n noInfo: true,\r\n });\r\n \r\n const promise = res.loadPromise;\r\n promise.finally(() => {\r\n const video = div.querySelector('video');\r\n\r\n div.style.opacity = '';\r\n const img = div.querySelector('img');\r\n img && img.classList.add('hide');\r\n\r\n if(video && !video.parentElement) {\r\n setTimeout(() => {\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach(item => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }, 0);\r\n }\r\n\r\n //clearTimeout(timeout);\r\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\r\n this.processInvisibleDiv(div);\r\n }\r\n });\r\n\r\n return promise;\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n //return load();\r\n \r\n this.lazyLoadQueue.push({div, load});\r\n }\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n return this.scrollPromise.then(async() => {\r\n //return;\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n\r\n const video = div.querySelector('video');\r\n const img = div.querySelector('img');\r\n \r\n if(img) {\r\n img && img.classList.remove('hide');\r\n \r\n await doubleRaf();\r\n }\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n \r\n if(video) {\r\n video.remove();\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach(item => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }\r\n });\r\n };\r\n\r\n public add(doc: MyDocument, appendTo = this.element) {\r\n let gifWidth = doc.w;\r\n let gifHeight = doc.h;\r\n if(gifHeight < height) {\r\n gifWidth = height / gifHeight * gifWidth;\r\n gifHeight = height;\r\n }\r\n\r\n const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\r\n const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\r\n\r\n /* wastedWidth += w;\r\n\r\n if(wastedWidth === width || h < height) {\r\n wastedWidth = 0;\r\n console.log('completed line', i, line);\r\n line = [];\r\n continue;\r\n }\r\n\r\n line.push(gif); */\r\n\r\n //console.log('gif:', gif, w, h);\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('gif', 'fade-in-transition');\r\n div.style.width = size.width + 'px';\r\n div.style.opacity = '0';\r\n //div.style.height = h + 'px';\r\n div.dataset.docId = '' + doc.id;\r\n\r\n appendTo.append(div);\r\n\r\n //this.lazyLoadQueue.observe({div, load: this.processVisibleDiv});\r\n this.lazyLoadQueue.observe(div);\r\n\r\n //let preloader = new ProgressivePreloader(div);\r\n\r\n const gotThumb = appDocsManager.getThumb(doc, false);\r\n\r\n const willBeAPoster = !!gotThumb;\r\n let img: HTMLImageElement;\r\n if(willBeAPoster) {\r\n img = new Image();\r\n img.classList.add('media-poster');\r\n\r\n if(!gotThumb.cacheContext.url) {\r\n gotThumb.promise.then(() => {\r\n img.src = gotThumb.cacheContext.url;\r\n });\r\n }\r\n }\r\n\r\n const afterRender = () => {\r\n if(img) {\r\n div.append(img);\r\n div.style.opacity = '';\r\n }\r\n };\r\n\r\n (gotThumb?.cacheContext?.url ? renderImageFromUrl(img, gotThumb.cacheContext.url, afterRender) : afterRender());\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP } from \"..\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport Scrollable from \"../../scrollable\";\r\nimport { putPreloader } from \"../../misc\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport appDocsManager, {MyDocument} from \"../../../lib/appManagers/appDocsManager\";\r\n\r\nexport default class GifsTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n\r\n init() {\r\n this.content = document.getElementById('content-gifs');\r\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\r\n gifsContainer.addEventListener('click', EmoticonsDropdown.onMediaClick);\r\n\r\n const scroll = new Scrollable(this.content, 'GIFS');\r\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\r\n const preloader = putPreloader(this.content, true);\r\n\r\n apiManager.invokeApi('messages.getSavedGifs', {hash: '0'}).then((res) => {\r\n //console.log('getSavedGifs res:', res);\r\n\r\n if(res._ === 'messages.savedGifs') {\r\n res.gifs.forEach((doc, idx) => {\r\n res.gifs[idx] = doc = appDocsManager.saveDoc(doc);\r\n //if(doc._ === 'documentEmpty') return;\r\n masonry.add(doc as MyDocument);\r\n });\r\n }\r\n\r\n preloader.remove();\r\n });\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\r\n\r\n this.init = null;\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, { EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab } from \"..\";\r\nimport findUpAttribute from \"../../../helpers/dom/findUpAttribute\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport appDocsManager, { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport LazyLoadQueue, { LazyLoadQueueRepeat } from \"../../lazyLoadQueue\";\r\nimport { putPreloader } from \"../../misc\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport Scrollable, { ScrollableX } from \"../../scrollable\";\r\nimport StickyIntersector from \"../../stickyIntersector\";\r\nimport { wrapSticker, wrapStickerSetThumb } from \"../../wrappers\";\r\n\r\nexport class SuperStickerRenderer {\r\n public lazyLoadQueue: LazyLoadQueueRepeat;\r\n private animatedDivs: Set = new Set();\r\n\r\n constructor(private regularLazyLoadQueue: LazyLoadQueue, private group: string) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, (target, visible) => {\r\n if(!visible) {\r\n this.processInvisibleDiv(target as HTMLDivElement);\r\n }\r\n });\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n public renderSticker(doc: MyDocument, div?: HTMLDivElement, loadPromises?: Promise[]) {\r\n if(!div) {\r\n div = document.createElement('div');\r\n div.classList.add('grid-item', 'super-sticker');\r\n\r\n if(doc.sticker === 2) {\r\n this.observeAnimatedDiv(div);\r\n }\r\n }\r\n\r\n // * This will wrap only a thumb\r\n wrapSticker({\r\n doc, \r\n div,\r\n lazyLoadQueue: this.regularLazyLoadQueue, \r\n group: this.group, \r\n onlyThumb: doc.sticker === 2,\r\n loadPromises\r\n });\r\n\r\n return div;\r\n }\r\n\r\n public observeAnimatedDiv(div: HTMLDivElement) {\r\n this.animatedDivs.add(div);\r\n\r\n this.lazyLoadQueue.observe({\r\n div, \r\n load: this.processVisibleDiv\r\n });\r\n }\r\n\r\n private checkAnimationContainer = (div: HTMLElement, visible: boolean) => {\r\n //console.error('checkAnimationContainer', div, visible);\r\n const players = animationIntersector.getAnimations(div);\r\n players.forEach(player => {\r\n if(!visible) {\r\n animationIntersector.checkAnimation(player, true, true);\r\n } else {\r\n animationIntersector.checkAnimation(player, false);\r\n }\r\n });\r\n };\r\n\r\n private processVisibleDiv = (div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n \r\n const size = mediaSizes.active.esgSticker.width;\r\n\r\n //console.log('processVisibleDiv:', div);\r\n\r\n const promise = wrapSticker({\r\n doc, \r\n div: div as HTMLDivElement,\r\n width: size,\r\n height: size,\r\n lazyLoadQueue: null, \r\n group: this.group, \r\n onlyThumb: false,\r\n play: true,\r\n loop: true\r\n });\r\n\r\n promise.then(() => {\r\n //clearTimeout(timeout);\r\n this.checkAnimationContainer(div, this.lazyLoadQueue.intersector.isVisible(div));\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n //console.log('STICKER INvisible:', /* div, */docId);\r\n\r\n this.checkAnimationContainer(div, false);\r\n\r\n div.innerHTML = '';\r\n this.renderSticker(doc, div as HTMLDivElement);\r\n };\r\n}\r\n\r\nexport default class StickersTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n\r\n private stickerSets: {[id: string]: {\r\n stickers: HTMLElement,\r\n tab: HTMLElement\r\n }} = {};\r\n\r\n private recentDiv: HTMLElement;\r\n private recentStickers: MyDocument[] = [];\r\n\r\n private scroll: Scrollable;\r\n\r\n private menu: HTMLElement;\r\n \r\n private mounted = false;\r\n\r\n private queueCategoryPush: {element: HTMLElement, prepend: boolean}[] = [];\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private superStickerRenderer: SuperStickerRenderer;\r\n\r\n categoryPush(categoryDiv: HTMLElement, categoryTitle: string = '', promise: Promise, prepend?: boolean) {\r\n //if((docs.length % 5) !== 0) categoryDiv.classList.add('not-full');\r\n\r\n const itemsDiv = document.createElement('div');\r\n itemsDiv.classList.add('category-items', 'super-stickers');\r\n\r\n const titleDiv = document.createElement('div');\r\n titleDiv.classList.add('category-title');\r\n\r\n if(categoryTitle) {\r\n titleDiv.innerHTML = categoryTitle;\r\n }\r\n\r\n categoryDiv.append(titleDiv, itemsDiv);\r\n\r\n this.stickyIntersector.observeStickyHeaderChanges(categoryDiv);\r\n\r\n this.queueCategoryPush.push({element: categoryDiv, prepend});\r\n\r\n promise.then(documents => {\r\n documents.forEach(doc => {\r\n //if(doc._ === 'documentEmpty') return;\r\n itemsDiv.append(this.superStickerRenderer.renderSticker(doc));\r\n });\r\n\r\n if(this.queueCategoryPush.length) {\r\n this.queueCategoryPush.forEach(({element, prepend}) => {\r\n if(prepend) {\r\n if(this.recentDiv.parentElement) {\r\n this.stickersDiv.prepend(element);\r\n this.stickersDiv.prepend(this.recentDiv);\r\n } else {\r\n this.stickersDiv.prepend(element);\r\n }\r\n } else this.stickersDiv.append(element);\r\n });\r\n\r\n this.queueCategoryPush.length = 0;\r\n }\r\n });\r\n\r\n return {titleDiv};\r\n }\r\n\r\n async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\r\n const categoryDiv = document.createElement('div');\r\n categoryDiv.classList.add('sticker-category');\r\n categoryDiv.dataset.id = '' + set.id;\r\n categoryDiv.dataset.access_hash = '' + set.access_hash;\r\n\r\n const button = document.createElement('button');\r\n button.classList.add('btn-icon', 'menu-horizontal-div-item');\r\n\r\n this.stickerSets[set.id] = {\r\n stickers: categoryDiv,\r\n tab: button\r\n };\r\n\r\n if(prepend) {\r\n this.menu.insertBefore(button, this.menu.firstElementChild.nextSibling);\r\n } else {\r\n this.menu.append(button);\r\n }\r\n\r\n //stickersScroll.append(categoryDiv);\r\n\r\n const promise = appStickersManager.getStickerSet(set);\r\n this.categoryPush(categoryDiv, RichTextProcessor.wrapEmojiText(set.title), promise.then(stickerSet => stickerSet.documents as MyDocument[]), prepend);\r\n const stickerSet = await promise;\r\n\r\n //console.log('got stickerSet', stickerSet, li);\r\n \r\n wrapStickerSetThumb({\r\n set,\r\n container: button,\r\n group: EMOTICONSSTICKERGROUP,\r\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n width: 32,\r\n height: 32,\r\n autoplay: false\r\n });\r\n }\r\n\r\n init() {\r\n this.content = document.getElementById('content-stickers');\r\n //let stickersDiv = contentStickersDiv.querySelector('.os-content') as HTMLDivElement;\r\n\r\n this.recentDiv = document.createElement('div');\r\n this.recentDiv.classList.add('sticker-category', 'stickers-recent');\r\n\r\n let menuWrapper = this.content.previousElementSibling as HTMLDivElement;\r\n this.menu = menuWrapper.firstElementChild as HTMLUListElement;\r\n\r\n let menuScroll = new ScrollableX(menuWrapper);\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('stickers-categories');\r\n this.content.append(this.stickersDiv);\r\n\r\n /* stickersDiv.addEventListener('mouseover', (e) => {\r\n let target = e.target as HTMLElement;\r\n\r\n if(target.tagName === 'CANVAS') { // turn on sticker\r\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\r\n\r\n if(animation) {\r\n // @ts-ignore\r\n if(animation.currentFrame === animation.totalFrames - 1) {\r\n animation.goToAndPlay(0, true);\r\n } else {\r\n animation.play();\r\n }\r\n }\r\n }\r\n }); */\r\n\r\n rootScope.addEventListener('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!this.stickerSets[set.id] && this.mounted) {\r\n this.renderStickerSet(set, true);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(this.stickerSets[set.id] && this.mounted) {\r\n const elements = this.stickerSets[set.id];\r\n elements.stickers.remove();\r\n elements.tab.remove();\r\n delete this.stickerSets[set.id];\r\n }\r\n });\r\n\r\n this.stickersDiv.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n if(findUpClassName(target, 'category-title')) {\r\n const el = findUpAttribute(target, 'data-id');\r\n new PopupStickers({id: el.dataset.id, access_hash: el.dataset.access_hash}).show();\r\n return;\r\n }\r\n\r\n EmoticonsDropdown.onMediaClick(e);\r\n });\r\n\r\n const setTyping = (cancel = false) => {\r\n rootScope.dispatchEvent('choosing_sticker', !cancel);\r\n };\r\n\r\n this.scroll = new Scrollable(this.content, 'STICKERS');\r\n this.scroll.setVirtualContainer(this.stickersDiv);\r\n this.scroll.onAdditionalScroll = () => {\r\n setTyping();\r\n };\r\n\r\n emoticonsDropdown.addEventListener('closed', () => {\r\n setTyping(true);\r\n });\r\n\r\n emoticonsDropdown.addEventListener('opened', () => {\r\n setTyping();\r\n });\r\n\r\n this.stickyIntersector = EmoticonsDropdown.menuOnClick(this.menu, this.scroll, menuScroll).stickyIntersector;\r\n\r\n const preloader = putPreloader(this.content, true);\r\n\r\n Promise.all([\r\n appStickersManager.getRecentStickers().then(stickers => {\r\n this.recentStickers = stickers.stickers.slice(0, 20) as MyDocument[];\r\n \r\n //stickersScroll.prepend(categoryDiv);\r\n\r\n this.stickerSets['recent'] = {\r\n stickers: this.recentDiv,\r\n tab: this.menu.firstElementChild as HTMLElement\r\n };\r\n\r\n preloader.remove();\r\n const {titleDiv} = this.categoryPush(this.recentDiv, '', Promise.resolve(this.recentStickers), true);\r\n titleDiv.append(i18n('Stickers.Recent'));\r\n }),\r\n\r\n appStickersManager.getAllStickers().then((res) => {\r\n preloader.remove();\r\n\r\n for(let set of (res as MessagesAllStickers.messagesAllStickers).sets) {\r\n this.renderStickerSet(set);\r\n }\r\n })\r\n ]).finally(() => {\r\n this.mounted = true;\r\n setTyping();\r\n });\r\n\r\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP);\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue, this.superStickerRenderer.processInvisibleDiv);\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = Object.values(lottieLoader.players).filter(p => p.width === 80);\r\n \r\n console.log('STICKERS RENDERED IN PANEL:', players.length, players.filter(p => !p.paused).length, this.superStickerRenderer.lazyLoadQueue.intersector.getVisible().length);\r\n }, .25e3); */\r\n \r\n\r\n this.init = null;\r\n }\r\n\r\n pushRecentSticker(doc: MyDocument) {\r\n appStickersManager.pushRecentSticker(doc);\r\n \r\n if(!this.recentDiv?.parentElement) {\r\n return;\r\n }\r\n\r\n let div = this.recentDiv.querySelector(`[data-doc-id=\"${doc.id}\"]`);\r\n if(!div) {\r\n div = this.superStickerRenderer.renderSticker(doc);\r\n }\r\n\r\n const items = this.recentDiv.querySelector('.category-items');\r\n items.prepend(div);\r\n\r\n if(items.childElementCount > 20) {\r\n (Array.from(items.children) as HTMLElement[]).slice(20).forEach(el => el.remove());\r\n }\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { toast } from \"../../components/toast\";\r\nimport { BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessagesBotResults, ReplyMarkup } from \"../../layer\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\r\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\r\nimport appUsersManager, { MyTopPeer } from \"./appUsersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport rootScope from \"../rootScope\";\r\nimport appDraftsManager from \"./appDraftsManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport { insertInDescendSortedArray } from \"../../helpers/array\";\r\nimport appStateManager from \"./appStateManager\";\r\n\r\nexport class AppInlineBotsManager {\r\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\r\n private setHash: {\r\n [botId: UserId]: {\r\n peerId: PeerId, \r\n time: number\r\n }\r\n } = {};\r\n\r\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\r\n return geo._ === 'geoPoint' ? {\r\n _: 'inputGeoPoint',\r\n lat: geo.lat,\r\n long: geo.long,\r\n accuracy_radius: geo.accuracy_radius\r\n } : {\r\n _: 'inputGeoPointEmpty'\r\n };\r\n }\r\n\r\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\r\n return apiManagerProxy.invokeApi('messages.getInlineBotResults', {\r\n bot: appUsersManager.getUserInput(botId),\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n query,\r\n geo_point: geo ? this.getGeoInput(geo) : undefined,\r\n offset\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then(botResults => {\r\n const queryId = botResults.query_id;\r\n\r\n /* if(botResults.switch_pm) {\r\n botResults.switch_pm.rText = RichTextProcessor.wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\r\n } */\r\n \r\n botResults.results.forEach(result => {\r\n if(result._ === 'botInlineMediaResult') {\r\n if(result.document) {\r\n result.document = appDocsManager.saveDoc(result.document);\r\n }\r\n \r\n if(result.photo) {\r\n result.photo = appPhotosManager.savePhoto(result.photo);\r\n }\r\n }\r\n \r\n this.inlineResults[this.generateQId(queryId, result.id)] = result;\r\n });\r\n\r\n return botResults;\r\n });\r\n }\r\n\r\n public generateQId(queryId: MessagesBotResults.messagesBotResults['query_id'], resultId: string) {\r\n return queryId + '_' + resultId;\r\n }\r\n\r\n private pushPopularBot(botId: BotId) {\r\n appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\r\n const botPeerId = botId.toPeerId();\r\n const index = topPeers.findIndex(topPeer => topPeer.id === botPeerId);\r\n let topPeer: MyTopPeer;\r\n if(index !== -1) {\r\n topPeer = topPeers[index];\r\n } else {\r\n topPeer = {\r\n id: botPeerId,\r\n rating: 0\r\n };\r\n }\r\n\r\n ++topPeer.rating;\r\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\r\n\r\n appStateManager.setKeyValueToStorage('topPeersCache');\r\n \r\n // rootScope.$broadcast('inline_bots_popular')\r\n });\r\n }\r\n\r\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\r\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\r\n rootScope.dispatchEvent('history_focus', {peerId: botId.toPeerId()});\r\n return appMessagesManager.startBot(botId, undefined, startParam);\r\n }\r\n \r\n /*\r\n function resolveInlineMention (username) {\r\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\r\n if (peerId.isUser()) {\r\n var bot = AppUsersManager.getUser(peerId)\r\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\r\n var resolvedBot = {\r\n username: username,\r\n id: peerId,\r\n placeholder: bot.bot_inline_placeholder\r\n }\r\n if (bot.pFlags.bot_inline_geo &&\r\n GeoLocationManager.isAvailable()) {\r\n return checkGeoLocationAccess(peerId).then(function () {\r\n return GeoLocationManager.getPosition().then(function (coords) {\r\n resolvedBot.geo = coords\r\n return qSync.when(resolvedBot)\r\n })\r\n })['catch'](function () {\r\n return qSync.when(resolvedBot)\r\n })\r\n }\r\n return qSync.when(resolvedBot)\r\n }\r\n }\r\n return $q.reject()\r\n }, function (error) {\r\n error.handled = true\r\n return $q.reject(error)\r\n })\r\n }\r\n \r\n function regroupWrappedResults (results, rowW, rowH) {\r\n if (!results ||\r\n !results[0] ||\r\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\r\n return\r\n }\r\n var ratios = []\r\n angular.forEach(results, function (result) {\r\n var w\r\n var h, doc\r\n var photo\r\n if (result._ === 'botInlineMediaResult') {\r\n if (doc = result.document) {\r\n w = result.document.w\r\n h = result.document.h\r\n }\r\n else if (photo = result.photo) {\r\n var photoSize = (photo.sizes || [])[0]\r\n w = photoSize && photoSize.w\r\n h = photoSize && photoSize.h\r\n }\r\n }else {\r\n w = result.w\r\n h = result.h\r\n }\r\n if (!w || !h) {\r\n w = h = 1\r\n }\r\n ratios.push(w / h)\r\n })\r\n \r\n var rows = []\r\n var curCnt = 0\r\n var curW = 0\r\n angular.forEach(ratios, function (ratio) {\r\n var w = ratio * rowH\r\n curW += w\r\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\r\n curCnt++\r\n } else {\r\n rows.push(curCnt)\r\n curCnt = 1\r\n curW = w\r\n }\r\n })\r\n if (curCnt) {\r\n rows.push(curCnt)\r\n }\r\n \r\n var i = 0\r\n var thumbs = []\r\n var lastRowI = rows.length - 1\r\n angular.forEach(rows, function (rowCnt, rowI) {\r\n var lastRow = rowI === lastRowI\r\n var curRatios = ratios.slice(i, i + rowCnt)\r\n var sumRatios = 0\r\n angular.forEach(curRatios, function (ratio) {\r\n sumRatios += ratio\r\n })\r\n angular.forEach(curRatios, function (ratio, j) {\r\n var thumbH = rowH\r\n var thumbW = rowW * ratio / sumRatios\r\n var realW = thumbH * ratio\r\n if (lastRow && thumbW > realW) {\r\n thumbW = realW\r\n }\r\n var result = results[i + j]\r\n result.thumbW = Math.floor(thumbW) - 2\r\n result.thumbH = Math.floor(thumbH) - 2\r\n })\r\n \r\n i += rowCnt\r\n })\r\n } */\r\n\r\n public async checkSwitchReturn(botId: BotId) {\r\n const bot = appUsersManager.getUser(botId);\r\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\r\n return;\r\n }\r\n\r\n const peerData = this.setHash[botId];\r\n if(peerData) {\r\n delete this.setHash[botId];\r\n if((Date.now() - peerData.time) < 3600e3) {\r\n return peerData.peerId;\r\n }\r\n }\r\n }\r\n\r\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\r\n rootScope.dispatchEvent('history_focus', {peerId, threadId});\r\n appDraftsManager.setDraft(peerId, threadId, '@' + appUsersManager.getUser(botId).username + ' ' + query);\r\n }\r\n\r\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\r\n return apiManagerProxy.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n msg_id: appMessagesIdsManager.getServerMessageId(mid),\r\n data: button.data\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((callbackAnswer) => {\r\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\r\n toast(RichTextProcessor.wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\r\n }\r\n \r\n //console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\r\n });\r\n }\r\n \r\n /* function gameButtonClick (id) {\r\n var message = AppMessagesManager.getMessage(id)\r\n var peerId = AppMessagesManager.getMessagePeer(message)\r\n \r\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: AppPeersManager.getInputPeerByID(peerId),\r\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\r\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\r\n if (typeof callbackAnswer.message === 'string' &&\r\n callbackAnswer.message.length) {\r\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\r\n }\r\n else if (typeof callbackAnswer.url === 'string') {\r\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\r\n }\r\n })\r\n } */\r\n\r\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: Partial<{\r\n viaBotId: BotId,\r\n queryId: string,\r\n resultId: string,\r\n replyMarkup: ReplyMarkup,\r\n entities: MessageEntity[],\r\n replyToMsgId: number,\r\n clearDraft: true,\r\n scheduleDate: number,\r\n silent: true,\r\n geoPoint: GeoPoint\r\n }> = {}) {\r\n const inlineResult = this.inlineResults[queryAndResultIds];\r\n if(!inlineResult) {\r\n return;\r\n }\r\n\r\n this.pushPopularBot(botId);\r\n const splitted = queryAndResultIds.split('_');\r\n const queryID = splitted.shift();\r\n const resultID = splitted.join('_');\r\n options.viaBotId = botId;\r\n options.queryId = queryID;\r\n options.resultId = resultID;\r\n if(inlineResult.send_message.reply_markup) {\r\n options.replyMarkup = inlineResult.send_message.reply_markup;\r\n }\r\n \r\n if(inlineResult.send_message._ === 'botInlineMessageText') {\r\n options.entities = inlineResult.send_message.entities;\r\n appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\r\n } else {\r\n let caption = '';\r\n let inputMedia: InputMedia;\r\n const sendMessage = inlineResult.send_message;\r\n switch(sendMessage._) {\r\n case 'botInlineMessageMediaAuto': {\r\n caption = sendMessage.message;\r\n\r\n if(inlineResult._ === 'botInlineMediaResult') {\r\n const {document, photo} = inlineResult;\r\n if(document) {\r\n inputMedia = appDocsManager.getMediaInput(document as MyDocument);\r\n } else {\r\n inputMedia = appPhotosManager.getMediaInput(photo as MyPhoto);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaGeo': {\r\n inputMedia = {\r\n _: 'inputMediaGeoPoint',\r\n geo_point: this.getGeoInput(sendMessage.geo)\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n \r\n case 'botInlineMessageMediaVenue': {\r\n inputMedia = {\r\n _: 'inputMediaVenue',\r\n geo_point: this.getGeoInput(sendMessage.geo),\r\n title: sendMessage.title,\r\n address: sendMessage.address,\r\n provider: sendMessage.provider,\r\n venue_id: sendMessage.venue_id,\r\n venue_type: sendMessage.venue_type\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaContact': {\r\n inputMedia = {\r\n _: 'inputMediaContact',\r\n phone_number: sendMessage.phone_number,\r\n first_name: sendMessage.first_name,\r\n last_name: sendMessage.last_name,\r\n vcard: sendMessage.vcard\r\n };\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(!inputMedia) {\r\n inputMedia = {\r\n _: 'messageMediaPending',\r\n type: inlineResult.type,\r\n file_name: inlineResult.title || \r\n (inlineResult as BotInlineResult.botInlineResult).content?.url || \r\n (inlineResult as BotInlineResult.botInlineResult).url,\r\n size: 0,\r\n progress: {percent: 30, total: 0}\r\n } as any;\r\n }\r\n\r\n appMessagesManager.sendOther(peerId, inputMedia, options);\r\n }\r\n }\r\n \r\n /* function checkGeoLocationAccess (botID) {\r\n var key = 'bot_access_geo' + botID\r\n return Storage.get(key).then(function (geoAccess) {\r\n if (geoAccess && geoAccess.granted) {\r\n return true\r\n }\r\n return ErrorService.confirm({\r\n type: 'BOT_ACCESS_GEO_INLINE'\r\n }).then(function () {\r\n var setHash = {}\r\n setHash[key] = {granted: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return true\r\n }, function () {\r\n var setHash = {}\r\n setHash[key] = {denied: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return $q.reject()\r\n })\r\n })\r\n } */\r\n}\r\n\r\nconst appInlineBotsManager = new AppInlineBotsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appInlineBotsManager = appInlineBotsManager);\r\nexport default appInlineBotsManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport appSidebarRight from \"..\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport appInlineBotsManager, { AppInlineBotsManager } from \"../../../lib/appManagers/appInlineBotsManager\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport type { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport { NULL_PEER_ID } from \"../../../lib/mtproto/mtproto_config\";\r\n\r\nconst ANIMATIONGROUP = 'GIFS-SEARCH';\r\n\r\nexport default class AppGifsTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private gifsDiv: HTMLDivElement;\r\n\r\n private nextOffset = '';\r\n private loadedAll = false;\r\n\r\n private gifBotPeerId: PeerId;\r\n private masonry: GifsMasonry;\r\n\r\n private searchPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.id = 'search-gifs-container';\r\n \r\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\r\n this.reset();\r\n this.search(value);\r\n });\r\n \r\n this.title.replaceWith(this.inputSearch.container);\r\n \r\n this.gifsDiv = document.createElement('div');\r\n this.gifsDiv.classList.add('gifs-masonry');\r\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.scrollable.append(this.gifsDiv);\r\n \r\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\r\n //this.backBtn.parentElement.append(this.inputSearch.container);\r\n }\r\n\r\n private onGifsClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'gif');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n if(mediaSizes.isMobile) {\r\n appSidebarRight.onCloseBtnClick();\r\n }\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n public onClose() {\r\n this.scrollable.onScrolledBottom = () => {};\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.reset();\r\n this.gifsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\r\n this.inputSearch.remove();\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n private reset() {\r\n this.searchPromise = null;\r\n this.nextOffset = '';\r\n this.loadedAll = false;\r\n this.masonry.clear();\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.search('', true);\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n this.search(this.inputSearch.value, false);\r\n };\r\n });\r\n return ret;\r\n }\r\n\r\n public async search(query: string, newSearch = true) {\r\n if(this.searchPromise || this.loadedAll) return;\r\n\r\n if(!this.gifBotPeerId) {\r\n this.gifBotPeerId = (await appUsersManager.resolveUsername('gif')).id.toPeerId(false);\r\n }\r\n\r\n try {\r\n this.searchPromise = appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\r\n const { results, next_offset } = await this.searchPromise;\r\n\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n this.searchPromise = null;\r\n this.nextOffset = next_offset;\r\n if(newSearch) {\r\n this.gifsDiv.innerHTML = '';\r\n }\r\n\r\n if(results.length) {\r\n results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult' && result.document) {\r\n this.masonry.add(result.document as MyDocument);\r\n }\r\n });\r\n } else {\r\n this.loadedAll = true;\r\n }\r\n\r\n this.scrollable.onScroll();\r\n } catch(err) {\r\n this.searchPromise = null;\r\n console.error('gifs loading error:', err);\r\n throw err;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport appSidebarRight from \"..\";\r\nimport { StickerSet, StickerSetCovered } from \"../../../layer\";\r\nimport { forEachReverse } from \"../../../helpers/array\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppStickersTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private setsDiv: HTMLDivElement;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n\r\n protected init() {\r\n this.container.id = 'stickers-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n\r\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\r\n this.search(value);\r\n });\r\n\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.setsDiv = document.createElement('div');\r\n this.setsDiv.classList.add('sticker-sets');\r\n this.scrollable.append(this.setsDiv);\r\n\r\n attachClickEvent(this.setsDiv, (e) => {\r\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(sticker) {\r\n const docId = sticker.dataset.docId;\r\n appImManager.chat.input.sendMessageWithDocument(docId);\r\n return;\r\n }\r\n\r\n const target = findUpClassName(e.target, 'sticker-set');\r\n if(!target) return;\r\n\r\n const id = target.dataset.stickerSet as string;\r\n const access_hash = target.dataset.access_hash as string;\r\n\r\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\r\n if(button) {\r\n e.preventDefault();\r\n e.cancelBubble = true;\r\n\r\n button.setAttribute('disabled', 'true');\r\n \r\n appStickersManager.getStickerSet({id, access_hash}).then(full => {\r\n appStickersManager.toggleStickerSet(full.set).then(changed => {\r\n if(changed) {\r\n button.textContent = '';\r\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n button.classList.toggle('gray', !!full.set.installed_date);\r\n }\r\n }).finally(() => {\r\n //button.style.width = set.installed_date ? '68px' : '52px';\r\n button.removeAttribute('disabled');\r\n });\r\n });\r\n } else {\r\n appStickersManager.getStickerSet({id, access_hash}).then(full => {\r\n new PopupStickers(full.set).show();\r\n });\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.setsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n public renderSet(set: StickerSet.stickerSet) {\r\n //console.log('renderSet:', set);\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n const header = document.createElement('div');\r\n header.classList.add('sticker-set-header');\r\n\r\n const details = document.createElement('div');\r\n details.classList.add('sticker-set-details');\r\n details.innerHTML = `\r\n
${RichTextProcessor.wrapEmojiText(set.title)}
\r\n `;\r\n\r\n const countDiv = document.createElement('div');\r\n countDiv.classList.add('sticker-set-count');\r\n countDiv.append(i18n('Stickers', [set.count]));\r\n details.append(countDiv);\r\n \r\n const button = document.createElement('button');\r\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\r\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n // button.style.width = set.installed_date ? '68px' : '52px';\r\n\r\n if(set.installed_date) {\r\n button.classList.add('gray');\r\n }\r\n\r\n //ripple(button);\r\n\r\n header.append(details, button);\r\n\r\n const stickersDiv = document.createElement('div');\r\n stickersDiv.classList.add('sticker-set-stickers');\r\n\r\n const count = Math.min(5, set.count);\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add('sticker-set-sticker');\r\n\r\n stickersDiv.append(stickerDiv);\r\n }\r\n\r\n appStickersManager.getStickerSet(set).then(set => {\r\n //console.log('renderSet got set:', set);\r\n \r\n for(let i = 0; i < count; ++i) {\r\n const div = stickersDiv.children[i] as HTMLDivElement;\r\n const doc = set.documents[i];\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n\r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n group: 'STICKERS-SEARCH', \r\n /* play: false,\r\n loop: false, */\r\n play: true,\r\n loop: true,\r\n width: 68,\r\n height: 68\r\n });\r\n }\r\n });\r\n\r\n /* const onMouseOver = () => {\r\n const animations: AnimationItem['animation'][] = [];\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\r\n const animationItem = animationIntersector.getAnimation(stickerDiv);\r\n if(!animationItem) continue;\r\n\r\n const animation = animationItem.animation;\r\n\r\n animations.push(animation);\r\n animation.loop = true;\r\n animation.play();\r\n }\r\n\r\n div.addEventListener('mouseout', () => {\r\n animations.forEach(animation => {\r\n animation.loop = false;\r\n });\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true});\r\n }, {once: true});\r\n };\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\r\n\r\n div.dataset.stickerSet = '' + set.id;\r\n div.dataset.access_hash = '' + set.access_hash;\r\n div.dataset.title = set.title;\r\n\r\n div.append(header, stickersDiv);\r\n\r\n this.setsDiv.append(div);\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.renderFeatured();\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n public renderFeatured() {\r\n return appStickersManager.getFeaturedStickers().then(coveredSets => {\r\n if(this.inputSearch.value) {\r\n return;\r\n }\r\n\r\n coveredSets = this.filterRendered('', coveredSets);\r\n coveredSets.forEach(set => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n\r\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\r\n coveredSets = coveredSets.slice();\r\n\r\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\r\n forEachReverse(children, el => {\r\n const id = el.dataset.stickerSet;\r\n const index = coveredSets.findIndex(covered => covered.set.id === id);\r\n \r\n if(index !== -1) {\r\n coveredSets.splice(index, 1);\r\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\r\n el.remove();\r\n }\r\n });\r\n\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n\r\n return coveredSets;\r\n }\r\n\r\n public search(query: string) {\r\n if(!query) {\r\n return this.renderFeatured();\r\n }\r\n\r\n return appStickersManager.searchStickerSets(query, false).then(coveredSets => {\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n //console.log('search result:', coveredSets);\r\n\r\n coveredSets = this.filterRendered(query, coveredSets);\r\n coveredSets.forEach(set => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { attachClickEvent } from \"./dom/clickEvent\";\r\nimport findUpAsChild from \"./dom/findUpAsChild\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\nimport ListenerSetter from \"./listenerSetter\";\r\nimport { safeAssign } from \"./object\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\n\r\nconst KEEP_OPEN = false;\r\nconst TOGGLE_TIMEOUT = 200;\r\nconst ANIMATION_DURATION = 200;\r\n\r\nexport default class DropdownHover extends EventListenerBase<{\r\n open: () => Promise | void,\r\n opened: () => any,\r\n close: () => any,\r\n closed: () => any\r\n}> {\r\n protected element: HTMLElement;\r\n protected displayTimeout: number;\r\n protected forceClose = false;\r\n protected inited = false;\r\n\r\n constructor(options: {\r\n element: DropdownHover['element']\r\n }) {\r\n super(false);\r\n safeAssign(this, options);\r\n }\r\n\r\n public attachButtonListener(button: HTMLElement, listenerSetter: ListenerSetter) {\r\n let firstTime = true;\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(button, () => {\r\n if(firstTime) {\r\n firstTime = false;\r\n this.toggle(true);\r\n } else {\r\n this.toggle();\r\n }\r\n }, {listenerSetter});\r\n } else {\r\n listenerSetter.add(button)('mouseover', (e) => {\r\n //console.log('onmouseover button');\r\n if(firstTime) {\r\n listenerSetter.add(button)('mouseout', this.onMouseOut);\r\n firstTime = false;\r\n }\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(true);\r\n }, TOGGLE_TIMEOUT);\r\n });\r\n }\r\n }\r\n\r\n private onMouseOut = (e: MouseEvent) => {\r\n if(KEEP_OPEN) return;\r\n clearTimeout(this.displayTimeout);\r\n if(!this.isActive()) return;\r\n\r\n const toElement = (e as any).toElement as Element;\r\n if(toElement && findUpAsChild(toElement, this.element)) {\r\n return;\r\n }\r\n\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(false);\r\n }, TOGGLE_TIMEOUT);\r\n };\r\n\r\n protected init() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.onmouseout = this.onMouseOut;\r\n this.element.onmouseover = (e) => {\r\n if(this.forceClose) {\r\n return;\r\n }\r\n\r\n //console.log('onmouseover element');\r\n clearTimeout(this.displayTimeout);\r\n };\r\n }\r\n }\r\n\r\n public toggle = async(enable?: boolean) => {\r\n //if(!this.element) return;\r\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\r\n if(this.init) {\r\n if(willBeActive) {\r\n this.init();\r\n this.init = null;\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n if(willBeActive === this.isActive()) {\r\n return;\r\n }\r\n \r\n if((this.element.style.display && enable === undefined) || enable) {\r\n const res = this.dispatchEvent('open');\r\n await Promise.all(res);\r\n\r\n this.element.style.display = '';\r\n void this.element.offsetLeft; // reflow\r\n this.element.classList.add('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.forceClose = false;\r\n this.dispatchEvent('opened');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n // ! can't use together with resizeObserver\r\n /* if(isTouchSupported) {\r\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n console.log('[ESG]: toggle: enable height', height);\r\n appImManager.chat.bubbles.scrollable.scrollTop += height;\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n } else {\r\n this.dispatchEvent('close');\r\n\r\n this.element.classList.remove('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.element.style.display = 'none';\r\n this.forceClose = false;\r\n this.dispatchEvent('closed');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n /* if(isTouchSupported) {\r\n const scrollHeight = this.container.scrollHeight;\r\n if(scrollHeight) {\r\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\r\n }\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n }\r\n\r\n //animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\r\n };\r\n\r\n public isActive() {\r\n return this.element.classList.contains('active');\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport { horizontalMenu } from \"../horizontalMenu\";\nimport LazyLoadQueue, { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport appSidebarRight from \"../sidebarRight\";\nimport StickyIntersector from \"../stickyIntersector\";\nimport EmojiTab from \"./tabs/emoji\";\nimport GifsTab from \"./tabs/gifs\";\nimport StickersTab from \"./tabs/stickers\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppGifsTab from \"../sidebarRight/tabs/gifs\";\nimport AppStickersTab from \"../sidebarRight/tabs/stickers\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport DropdownHover from \"../../helpers/dropdownHover\";\nimport { pause } from \"../../helpers/schedulers/pause\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\n\nexport const EMOTICONSSTICKERGROUP = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n init: () => void,\n onCloseAfterTimeout?: () => void\n}\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue();\n\n private emojiTab: EmojiTab;\n public stickersTab: StickersTab;\n private gifsTab: GifsTab;\n\n private container: HTMLElement;\n private tabsEl: HTMLElement;\n private tabId = -1;\n\n private tabs: {[id: number]: EmoticonsTab};\n\n private searchButton: HTMLElement;\n private deleteBtn: HTMLElement;\n\n private selectTab: ReturnType;\n\n private savedRange: Range;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement\n });\n\n this.addEventListener('open', async() => {\n if(IS_TOUCH_SUPPORTED) {\n //appImManager.chat.input.saveScroll();\n if(blurActiveElement()) {\n await pause(100);\n }\n }\n\n if(this.element.parentElement !== appImManager.chat.input.chatInput) {\n appImManager.chat.input.chatInput.append(this.element);\n }\n\n this.savedRange = this.getGoodRange();\n\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.unlock();\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n });\n\n this.addEventListener('close', () => {\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.lock();\n\n // нужно залочить группу и выключить стикеры\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('closed', () => {\n // теперь можно убрать visible, чтобы они не включились после фокуса\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n\n this.savedRange = undefined;\n });\n }\n\n protected init() {\n this.emojiTab = new EmojiTab();\n this.stickersTab = new StickersTab();\n this.gifsTab = new GifsTab();\n\n this.tabs = {\n 0: this.emojiTab,\n 1: this.stickersTab,\n 2: this.gifsTab\n };\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const tab = this.tabs[this.tabId];\n if(tab.init) {\n tab.init();\n }\n\n tab.onCloseAfterTimeout && tab.onCloseAfterTimeout();\n animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n });\n\n this.searchButton = this.element.querySelector('.emoji-tabs-search');\n this.searchButton.addEventListener('click', () => {\n if(this.tabId === 1) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n new AppStickersTab(appSidebarRight).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n new AppGifsTab(appSidebarRight).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n this.deleteBtn.addEventListener('click', (e) => {\n const input = appImManager.chat.input.messageInput;\n if((input.lastChild as any)?.tagName) {\n input.lastElementChild.remove();\n } else if(input.lastChild) {\n if(!input.lastChild.textContent.length) {\n input.lastChild.remove();\n } else {\n input.lastChild.textContent = input.lastChild.textContent.slice(0, -1);\n }\n }\n\n const event = new Event('input', {bubbles: true, cancelable: true});\n appImManager.chat.input.messageInput.dispatchEvent(event);\n //appSidebarRight.stickersTab.init();\n\n cancelEvent(e);\n });\n \n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? 1 : 0;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n (this.tabsEl.children[INIT_TAB_ID + 1] as HTMLLIElement).click(); // set emoji tab\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\n\n rootScope.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n return;\n }\n \n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === 0);\n this.deleteBtn.classList.toggle('hide', this.tabId !== 0);\n };\n\n private checkRights = () => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const canSendStickers = appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers');\n tabsElements[2].toggleAttribute('disabled', !canSendStickers);\n\n const canSendGifs = appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs');\n tabsElements[3].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== 1 && (!canSendStickers || !canSendGifs)) {\n this.selectTab(0, false);\n }\n };\n\n public static menuOnClick = (menu: HTMLElement, scroll: Scrollable, menuScroll?: ScrollableX, prevId = 0) => {\n let jumpedTo = -1;\n\n const setActive = (id: number) => {\n if(id === prevId) {\n return false;\n }\n\n menu.children[prevId].classList.remove('active');\n menu.children[id].classList.add('active');\n prevId = id;\n\n return true;\n };\n\n const stickyIntersector = new StickyIntersector(scroll.container, (stuck, target) => {\n //console.log('sticky scrollTOp', stuck, target, scroll.container.scrollTop);\n\n if(Math.abs(jumpedTo - scroll.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const which = whichChild(target);\n if(!stuck && which) { // * due to stickyIntersector\n return;\n }\n\n setActive(which);\n\n if(menuScroll) {\n if(which < menu.childElementCount - 4) {\n menuScroll.container.scrollLeft = (which - 3) * 47;\n } else {\n menuScroll.container.scrollLeft = which * 47;\n }\n }\n });\n\n menu.addEventListener('click', (e) => {\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'menu-horizontal-div-item');\n\n if(!target) {\n return;\n }\n\n const which = whichChild(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(!setActive(which)) {\n return;\n }\n\n const element = (scroll.splitUp || scroll.container).children[which] as HTMLElement;\n const offsetTop = element.offsetTop + 1; // * due to stickyIntersector\n\n scroll.container.scrollTop = jumpedTo = offsetTop;\n\n //console.log('set scrollTop:', offsetTop);\n });\n\n return {stickyIntersector, setActive};\n };\n\n public static onMediaClick = (e: {target: EventTarget | Element}, clearDraft = false) => {\n let target = e.target as HTMLElement;\n target = findUpTag(target, 'DIV');\n\n if(!target) return false;\n \n const fileId = target.dataset.docId;\n if(!fileId) return false;\n\n if(appImManager.chat.input.sendMessageWithDocument(fileId, undefined, clearDraft)) {\n /* dropdown.classList.remove('active');\n toggleEl.classList.remove('active'); */\n if(emoticonsDropdown.container) {\n emoticonsDropdown.forceClose = true;\n emoticonsDropdown.container.classList.add('disable-hover');\n emoticonsDropdown.toggle(false);\n }\n\n return true;\n } else {\n console.warn('got no doc by id:', fileId);\n return false;\n }\n };\n\n public addLazyLoadQueueRepeat(lazyLoadQueue: LazyLoadQueueIntersector, processInvisibleDiv: (div: HTMLElement) => void) {\n this.addEventListener('close', () => {\n lazyLoadQueue.lock();\n });\n\n this.addEventListener('closed', () => {\n const divs = lazyLoadQueue.intersector.getVisible();\n\n for(const div of divs) {\n processInvisibleDiv(div);\n }\n\n lazyLoadQueue.intersector.clearVisible();\n });\n\n this.addEventListener('opened', () => {\n lazyLoadQueue.unlockAndRefresh();\n });\n }\n\n public getSavedRange() {\n return this.getGoodRange() || this.savedRange;\n }\n\n private getGoodRange() {\n const sel = document.getSelection();\n if(sel.rangeCount && document.activeElement === appImManager.chat.input.messageInput) {\n return sel.getRangeAt(0);\n }\n }\n}\n\nconst emoticonsDropdown = new EmoticonsDropdown();\nMOUNT_CLASS_TO.emoticonsDropdown = emoticonsDropdown;\nexport default emoticonsDropdown;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport type { AppMessagesManager, HistoryResult, HistoryStorage, MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\r\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\r\nimport type { AppPhotosManager } from \"../../lib/appManagers/appPhotosManager\";\r\nimport type { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\r\nimport type { AppDraftsManager } from \"../../lib/appManagers/appDraftsManager\";\r\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport { getObjectKeysAndSort } from \"../../helpers/object\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport { logger } from \"../../lib/logger\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport BubbleGroups from \"./bubbleGroups\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupStickers from \"../popups/stickers\";\r\nimport ProgressivePreloader from \"../preloader\";\r\nimport Scrollable, { SliceSides } from \"../scrollable\";\r\nimport StickyIntersector from \"../stickyIntersector\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\r\nimport I18n, { FormatterArguments, i18n, langPack } from \"../../lib/langPack\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { ripple } from \"../ripple\";\r\nimport { wrapAlbum, wrapPhoto, wrapVideo, wrapDocument, wrapSticker, wrapPoll, wrapGroupedDocuments } from \"../wrappers\";\r\nimport { MessageRender } from \"./messageRender\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport PollElement from \"../poll\";\r\nimport AudioElement from \"../audio\";\r\nimport { Message, MessageEntity, MessageReplyHeader, Photo, PhotoSize, ReplyMarkup, Update, WebPage } from \"../../layer\";\r\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport { FocusDirection } from \"../../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf, fastRafPromise } from \"../../helpers/schedulers\";\r\nimport { deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport RepliesElement from \"./replies\";\r\nimport DEBUG from \"../../config/debug\";\r\nimport { SliceEnd } from \"../../helpers/slicedArray\";\r\nimport serverTimeManager from \"../../lib/mtproto/serverTimeManager\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport { forEachReverse } from \"../../helpers/array\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { toast } from \"../toast\";\r\nimport { getElementByPoint } from \"../../helpers/dom/getElementByPoint\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\r\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\r\nimport reflowScrollableElement from \"../../helpers/dom/reflowScrollableElement\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { cancelAnimationByKey } from \"../../helpers/animation\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { formatNumber } from \"../../helpers/number\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport windowSize from \"../../helpers/windowSize\";\r\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\r\nimport AppMediaViewer from \"../appMediaViewer\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport handleHorizontalSwipe from \"../../helpers/dom/handleHorizontalSwipe\";\r\nimport { cancelContextMenuOpening } from \"../misc\";\r\nimport findUpAttribute from \"../../helpers/dom/findUpAttribute\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\n\r\nconst USE_MEDIA_TAILS = false;\r\nconst IGNORE_ACTIONS: Set = new Set([\r\n 'messageActionHistoryClear',\r\n 'messageActionChatCreate'/* ,\r\n 'messageActionChannelMigrateFrom' */\r\n]);\r\n\r\nconst 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\nexport default class ChatBubbles {\r\n public bubblesContainer: HTMLDivElement;\r\n private chatInner: HTMLDivElement;\r\n public scrollable: Scrollable;\r\n\r\n private getHistoryTopPromise: Promise;\r\n private getHistoryBottomPromise: Promise;\r\n\r\n public peerId: PeerId;\r\n //public messagesCount: number = -1;\r\n\r\n private unreadOut = new Set();\r\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\r\n\r\n public bubbles: {[mid: string]: HTMLDivElement} = {};\r\n public skippedMids: Set = new Set();\r\n private dateMessages: {[timestamp: number]: { \r\n div: HTMLDivElement, \r\n firstTimestamp: number, \r\n container: HTMLDivElement,\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 unreadedObserver: IntersectionObserver;\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 loadedTopTimes = 0;\r\n private loadedBottomTimes = 0;\r\n\r\n public messagesQueuePromise: Promise = null;\r\n private messagesQueue: {message: any, bubble: HTMLElement, reverse: boolean, promises: Promise[]}[] = [];\r\n private messagesQueueOnRender: () => void = null;\r\n private messagesQueueOnRenderAdditional: () => void = null;\r\n\r\n private firstUnreadBubble: HTMLDivElement = null;\r\n private attachedUnreadBubble: boolean;\r\n\r\n public lazyLoadQueue: LazyLoadQueue;\r\n\r\n private middleware = getMiddleware();\r\n\r\n private log: ReturnType;\r\n\r\n public listenerSetter: ListenerSetter;\r\n\r\n private replyFollowHistory: number[] = [];\r\n\r\n private isHeavyAnimationInProgress = false;\r\n private scrollingToBubble: HTMLElement;\r\n\r\n private isFirstLoad = true;\r\n private needReflowScroll: boolean;\r\n\r\n private fetchNewPromise: Promise;\r\n private historyStorage: HistoryStorage;\r\n\r\n private passEntities: Partial<{\r\n [_ in MessageEntity['_']]: boolean\r\n }> = {};\r\n\r\n private onAnimateLadder: () => Promise | void;\r\n // private ladderDeferred: CancellablePromise;\r\n private resolveLadderAnimation: () => Promise;\r\n private emptyPlaceholderMid: number;\r\n\r\n private viewsObserver: IntersectionObserver;\r\n private viewsMids: Set = new Set();\r\n private sendViewCountersDebounced: () => Promise;\r\n\r\n private isTopPaddingSet = false;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appStickersManager: AppStickersManager, \r\n private appUsersManager: AppUsersManager, \r\n private appInlineBotsManager: AppInlineBotsManager, \r\n private appPhotosManager: AppPhotosManager, \r\n private appPeersManager: AppPeersManager,\r\n private appProfileManager: AppProfileManager,\r\n private appDraftsManager: AppDraftsManager,\r\n private appMessagesIdsManager: AppMessagesIdsManager\r\n ) {\r\n //this.chat.log.error('Bubbles construction');\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.bubblesContainer = document.createElement('div');\r\n this.bubblesContainer.classList.add('bubbles', 'scrolled-down');\r\n\r\n this.chatInner = document.createElement('div');\r\n this.chatInner.classList.add('bubbles-inner');\r\n\r\n this.setScroll();\r\n\r\n this.bubblesContainer.append(this.scrollable.container);\r\n\r\n // * constructor end\r\n\r\n this.log = this.chat.log;\r\n this.bubbleGroups = new BubbleGroups(this.chat);\r\n this.preloader = new ProgressivePreloader({\r\n cancelable: false\r\n });\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n\r\n // * events\r\n\r\n // will call when sent for update pos\r\n this.listenerSetter.add(rootScope)('history_update', ({storage, peerId, mid}) => {\r\n if(this.chat.getMessagesStorage() === storage) {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const message = this.chat.getMessage(mid);\r\n \r\n if(+bubble.dataset.timestamp >= (message.date + serverTimeManager.serverTimeOffset - 1)) {\r\n this.bubbleGroups.changeBubbleMid(bubble, mid);\r\n return;\r\n }\r\n\r\n this.setBubblePosition(bubble, message, false);\r\n //this.log('history_update', this.bubbles[mid], mid, message);\r\n\r\n if(this.scrollingToBubble) {\r\n this.scrollToBubbleEnd();\r\n }\r\n\r\n //this.renderMessage(message, false, false, bubble);\r\n }\r\n });\r\n\r\n //this.listenerSetter.add(rootScope)('')\r\n\r\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n this.deleteMessagesByIds(Object.keys(this.bubbles).map(m => +m));\r\n }\r\n });\r\n\r\n // Calls when message successfully sent and we have an id\r\n this.listenerSetter.add(rootScope)('message_sent', (e) => {\r\n const {storage, tempId, tempMessage, mid} = e;\r\n\r\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\r\n if(this.chat.getMessagesStorage() !== storage) {\r\n return;\r\n }\r\n \r\n //this.log('message_sent', e);\r\n\r\n const mounted = this.getMountedBubble(tempId, tempMessage) || this.getMountedBubble(mid);\r\n if(mounted) {\r\n const message = this.chat.getMessage(mid);\r\n const bubble = mounted.bubble;\r\n //this.bubbles[mid] = bubble;\r\n \r\n /////this.log('message_sent', bubble);\r\n\r\n if(message.replies) {\r\n const repliesElement = bubble.querySelector('replies-element') as RepliesElement;\r\n if(repliesElement) {\r\n repliesElement.message = message;\r\n repliesElement.init();\r\n }\r\n }\r\n\r\n if(message.media?.document) {\r\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\r\n if(div) {\r\n const container = findUpClassName(div, 'document-container');\r\n\r\n if(!tempMessage.media?.document?.thumbs?.length && message.media.document.thumbs?.length) {\r\n div.replaceWith(wrapDocument({message}));\r\n }\r\n\r\n if(container) {\r\n container.dataset.mid = '' + mid;\r\n }\r\n }\r\n }\r\n\r\n // set new mids to album items for mediaViewer\r\n if(message.grouped_id) {\r\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\r\n if(item) {\r\n item.dataset.mid = '' + mid;\r\n }\r\n }\r\n\r\n if(message.media?.poll) {\r\n const pollElement = bubble.querySelector('poll-element') as PollElement;\r\n if(pollElement) {\r\n const newPoll = message.media.poll;\r\n pollElement.message = message;\r\n pollElement.setAttribute('poll-id', newPoll.id);\r\n pollElement.setAttribute('message-id', '' + mid);\r\n }\r\n }\r\n\r\n if(message.media?.document) {\r\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\r\n if(element) {\r\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\r\n element.dataset.mid = '' + message.mid;\r\n delete element.dataset.isOutgoing;\r\n (element as any).message = message;\r\n (element as any).onLoad(true);\r\n } else {\r\n element.dataset.docId = message.media.document.id;\r\n }\r\n }\r\n }\r\n\r\n /* bubble.classList.remove('is-sending');\r\n bubble.classList.add('is-sent');\r\n bubble.dataset.mid = '' + mid;\r\n\r\n this.bubbleGroups.removeBubble(bubble, tempId); */\r\n\r\n if(message.media?.webpage && !bubble.querySelector('.web')) {\r\n getHeavyAnimationPromise().then(() => {\r\n this.safeRenderMessage(message, true, false, bubble, false);\r\n this.scrollToBubbleIfLast(bubble);\r\n });\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return;\r\n this.renderMessage(mounted.message, true, false, mounted.bubble, false); */\r\n }\r\n \r\n //delete this.bubbles[tempId];\r\n } else {\r\n this.log.warn('message_sent there is no bubble', e);\r\n }\r\n\r\n const bubbles = this.bubbles;\r\n if(bubbles[tempId]) {\r\n const bubble = bubbles[tempId];\r\n bubbles[mid] = bubble;\r\n delete bubbles[tempId];\r\n\r\n //getHeavyAnimationPromise().then(() => {\r\n fastRaf(() => {\r\n if(bubble.classList.contains('is-sending')) {\r\n bubble.classList.remove('is-sending');\r\n bubble.classList.add(this.peerId === rootScope.myId && this.chat.type !== 'scheduled' ? 'is-read' : 'is-sent');\r\n }\r\n });\r\n //});\r\n\r\n bubble.dataset.mid = '' + mid;\r\n }\r\n\r\n if(this.unreadOut.has(tempId)) {\r\n this.unreadOut.delete(tempId);\r\n this.unreadOut.add(mid);\r\n }\r\n\r\n // * check timing of scheduled message\r\n if(this.chat.type === 'scheduled') {\r\n const timestamp = Date.now() / 1000 | 0;\r\n const maxTimestamp = tempMessage.date - 10;\r\n //this.log('scheduled timing:', timestamp, maxTimestamp);\r\n if(timestamp >= maxTimestamp) {\r\n this.deleteMessagesByIds([mid]);\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_edit', ({storage, peerId, mid}) => {\r\n // fastRaf(() => {\r\n if(storage !== this.chat.getMessagesStorage()) return;\r\n const message = this.chat.getMessage(mid);\r\n const mounted = message.grouped_id ? this.getGroupedBubble(message.grouped_id) : this.getMountedBubble(mid);\r\n if(!mounted) return;\r\n\r\n const updatePosition = this.chat.type === 'scheduled';\r\n const scrolledDown = this.scrolledDown;\r\n this.safeRenderMessage(mounted.message, true, false, mounted.bubble, updatePosition);\r\n if(scrolledDown) {\r\n this.scrollToBubbleIfLast(mounted.bubble);\r\n }\r\n\r\n if(updatePosition) {\r\n (this.messagesQueuePromise || Promise.resolve()).then(() => {\r\n this.deleteEmptyDateGroups();\r\n });\r\n }\r\n // });\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, groupId, deletedMids}) => {\r\n //fastRaf(() => { // ! can't use delayed smth here, need original bubble to be edited\r\n if(peerId !== this.peerId) return;\r\n const mids = this.appMessagesManager.getMidsByAlbum(groupId);\r\n const renderedId = mids.concat(deletedMids).find(mid => this.bubbles[mid]);\r\n if(!renderedId) return;\r\n\r\n const renderMaxId = getObjectKeysAndSort(this.appMessagesManager.groupedMessagesStorage[groupId], 'asc').pop();\r\n\r\n this.safeRenderMessage(this.chat.getMessage(renderMaxId), true, false, this.bubbles[renderedId], false);\r\n //});\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('messages_downloaded', ({peerId, mids}) => {\r\n const middleware = this.getMiddleware();\r\n getHeavyAnimationPromise().then(() => {\r\n if(!middleware()) return;\r\n\r\n (mids as number[]).forEach(mid => {\r\n /* const promise = (this.scrollable.scrollLocked && this.scrollable.scrollLockedPromise) || Promise.resolve();\r\n promise.then(() => {\r\n \r\n }); */\r\n forEachReverse(this.needUpdate, (obj, idx) => {\r\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\r\n const {mid, replyMid} = this.needUpdate.splice(idx, 1)[0];\r\n \r\n //this.log('messages_downloaded', mid, replyMid, i, this.needUpdate, this.needUpdate.length, mids, this.bubbles[mid]);\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n \r\n const message = this.chat.getMessage(mid);\r\n \r\n const repliedMessage = this.appMessagesManager.getMessageByPeer(obj.replyToPeerId, replyMid);\r\n if(repliedMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\r\n delete message.reply_to_mid; // ! WARNING!\r\n }\r\n \r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n message\r\n });\r\n }\r\n });\r\n });\r\n });\r\n });\r\n\r\n // attachClickEvent(this.bubblesContainer, this.onBubblesClick, {listenerSetter: this.listenerSetter});\r\n this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n const className = 'is-gesturing-reply';\r\n const MAX = 64;\r\n const replyAfter = MAX * .75;\r\n let shouldReply = false;\r\n let target: HTMLElement;\r\n let icon: HTMLElement;\r\n handleHorizontalSwipe({\r\n element: this.bubblesContainer,\r\n verifyTouchTarget: (e) => {\r\n if(this.chat.selection.isSelecting || !this.appMessagesManager.canSendToPeer(this.peerId, this.chat.threadId)) {\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 if(DEBUG) {\r\n this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {\r\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\r\n if(bubble) {\r\n const mid = +bubble.dataset.mid\r\n this.log('debug message:', this.chat.getMessage(mid));\r\n this.highlightBubble(bubble);\r\n }\r\n });\r\n }\r\n\r\n if(!IS_MOBILE && this.chat.type !== 'pinned') {\r\n this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {\r\n if(this.chat.selection.isSelecting || \r\n !this.appMessagesManager.canSendToPeer(this.peerId, this.chat.threadId)) {\r\n return;\r\n }\r\n \r\n const target = e.target as HTMLElement;\r\n const bubble = target.classList.contains('bubble') ? \r\n target : \r\n (target.classList.contains('document-selection') ? target.parentElement : null);\r\n if(bubble && !bubble.classList.contains('bubble-first')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = this.chat.getMessage(mid);\r\n if(message.pFlags.is_outgoing) {\r\n return;\r\n }\r\n \r\n this.chat.input.initMessageReply(mid);\r\n }\r\n });\r\n }\r\n\r\n /* if(false) */this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\r\n for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n if(dateMessage.container === target) {\r\n dateMessage.div.classList.toggle('is-sticky', stuck);\r\n break;\r\n }\r\n }\r\n });\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 this.isHeavyAnimationInProgress = false;\r\n\r\n if(middleware && middleware()) {\r\n this.lazyLoadQueue.unlock();\r\n this.lazyLoadQueue.refresh();\r\n }\r\n\r\n middleware = null;\r\n }, this.listenerSetter);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n // will call when message is sent (only 1)\r\n this.listenerSetter.add(rootScope)('history_append', ({storage, mid}) => {\r\n if(storage !== this.chat.getMessagesStorage()) return;\r\n\r\n if(!this.scrollable.loadedAll.bottom) {\r\n this.chat.setMessageId();\r\n } else {\r\n this.renderNewMessagesByIds([mid], true);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('history_multiappend', (msgIdsByPeer) => {\r\n if(!(this.peerId in msgIdsByPeer)) return;\r\n const msgIds = Array.from(msgIdsByPeer[this.peerId]).slice().sort((a, b) => b - a);\r\n this.renderNewMessagesByIds(msgIds);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(peerId === this.peerId) {\r\n this.deleteMessagesByIds(Array.from(msgs));\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\r\n if(peerId === this.peerId) {\r\n this.chat.input.setUnreadCount();\r\n this.updateUnreadByDialog();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.peerId]) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\r\n if(this.peerId === dialog.peerId) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.peerId === chatId.toPeerId(true)) {\r\n const hadRights = this.chatInner.classList.contains('has-rights');\r\n const hasRights = this.appMessagesManager.canSendToPeer(this.peerId, this.chat.threadId);\r\n\r\n if(hadRights !== hasRights) {\r\n this.finishPeerChange();\r\n this.chat.input.updateMessageInput();\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', (e) => {\r\n if(e.key === 'settings.emoji.big') {\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(!isScrolledDown) {\r\n this.setMessagesQueuePromise();\r\n }\r\n \r\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n mids.forEach(mid => {\r\n const bubble = this.bubbles[mid];\r\n if(bubble.classList.contains('can-have-big-emoji')) {\r\n const message = this.chat.getMessage(mid);\r\n this.safeRenderMessage(message, undefined, false, bubble);\r\n // this.bubbleGroups.addBubble(bubble, message, false);\r\n }\r\n });\r\n\r\n if(isScrolledDown) {\r\n this.scrollable.scrollTop = 99999;\r\n } else {\r\n this.performHistoryResult([], true, false, undefined);\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_views', ({peerId, views, mid}) => {\r\n if(this.peerId !== peerId) return;\r\n\r\n fastRaf(() => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\r\n if(postViewsElements.length) {\r\n const str = formatNumber(views, 1);\r\n let different = false;\r\n postViewsElements.forEach(postViews => {\r\n if(different || postViews.innerHTML !== str) {\r\n different = true;\r\n postViews.innerHTML = str;\r\n }\r\n });\r\n }\r\n });\r\n });\r\n\r\n this.unreadedObserver = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\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\r\n this.viewsObserver = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if(entry.isIntersecting) {\r\n this.viewsMids.add(+(entry.target as HTMLElement).dataset.mid);\r\n this.viewsObserver.unobserve(entry.target);\r\n this.sendViewCountersDebounced();\r\n }\r\n });\r\n });\r\n\r\n this.sendViewCountersDebounced = debounce(() => {\r\n const mids = [...this.viewsMids];\r\n this.viewsMids.clear();\r\n\r\n this.appMessagesManager.incrementMessageViews(this.peerId, mids);\r\n }, 1000, false, true);\r\n\r\n if('ResizeObserver' in window) {\r\n let wasHeight = this.scrollable.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\r\n const onResizeEnd = () => {\r\n const height = this.scrollable.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.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 = (entries: any) => {\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.scrollTop = 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 // @ts-ignore\r\n const resizeObserver = new ResizeObserver(processEntries);\r\n resizeObserver.observe(this.bubblesContainer);\r\n }\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.unreadedObserver.unobserve(target);\r\n this.unreaded.delete(target);\r\n this.readUnreaded();\r\n }\r\n\r\n private readUnreaded() {\r\n if(this.readPromise) return;\r\n\r\n const middleware = this.getMiddleware();\r\n this.readPromise = rootScope.idle.focusPromise.then(() => {\r\n if(!middleware()) return;\r\n let maxId = Math.max(...Array.from(this.unreadedSeen));\r\n\r\n // ? if message with maxId is not rendered ?\r\n if(this.scrollable.loadedAll.bottom) {\r\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map(i => +i));\r\n if(maxId >= bubblesMaxId) {\r\n maxId = Math.max(this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId).maxId || 0, maxId);\r\n }\r\n }\r\n\r\n this.unreaded.forEach((mid, target) => {\r\n if(mid <= maxId) {\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n\r\n const readContents: number[] = [];\r\n for(const mid of this.unreadedSeen) {\r\n const message: MyMessage = this.chat.getMessage(mid);\r\n if(this.appMessagesManager.isMentionUnread(message)) {\r\n readContents.push(mid);\r\n }\r\n }\r\n\r\n this.appMessagesManager.readMessages(this.peerId, readContents);\r\n\r\n this.unreadedSeen.clear();\r\n\r\n if(DEBUG) {\r\n this.log('will readHistory by maxId:', maxId);\r\n }\r\n\r\n // return;\r\n \r\n return this.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\r\n this.log.error('readHistory err:', err);\r\n this.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\r\n }).finally(() => {\r\n if(!middleware()) return;\r\n this.readPromise = undefined;\r\n\r\n if(this.unreadedSeen.size) {\r\n this.readUnreaded();\r\n }\r\n });\r\n });\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', (e) => {\r\n const {peerId, mids, pinned} = e;\r\n if(peerId !== this.peerId) return;\r\n\r\n if(mids) {\r\n if(!pinned) {\r\n this.deleteMessagesByIds(mids);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public constructScheduledHelpers() {\r\n const onUpdate = () => {\r\n this.chat.topbar.setTitle(this.appMessagesManager.getScheduledMessagesStorage(this.peerId).size);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId, mid}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.renderNewMessagesByIds([mid]);\r\n onUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.deleteMessagesByIds(mids);\r\n onUpdate();\r\n });\r\n }\r\n\r\n public onBubblesClick = (e: Event) => {\r\n let target = e.target as HTMLElement;\r\n let bubble: HTMLElement = null;\r\n try {\r\n bubble = findUpClassName(target, 'bubble');\r\n } catch(err) {}\r\n \r\n if(!bubble) return;\r\n\r\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\r\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n for(const timestamp in this.dateMessages) {\r\n const d = this.dateMessages[timestamp];\r\n if(d.div === bubble) {\r\n new PopupDatePicker(new Date(+timestamp), this.onDatePick).show();\r\n break;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\r\n this.chat.selection.toggleByElement(bubble);\r\n return;\r\n }\r\n\r\n // ! Trusted - due to audio autoclick\r\n if(this.chat.selection.isSelecting && e.isTrusted) {\r\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n //console.log('bubble click', e);\r\n\r\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\r\n this.chat.selection.selectedText = undefined;\r\n return;\r\n }\r\n\r\n //this.chatSelection.toggleByBubble(bubble);\r\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\r\n return;\r\n }\r\n\r\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\r\n if(contactDiv) {\r\n this.chat.appImManager.setInnerPeer(contactDiv.dataset.peerId.toPeerId());\r\n return;\r\n }\r\n\r\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\r\n if(commentsDiv) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n if(this.peerId === REPLIES_PEER_ID) {\r\n const message = this.chat.getMessage(bubbleMid) as Message.message;\r\n const peerId = this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id);\r\n const threadId = message.reply_to.reply_to_top_id;\r\n const lastMsgId = message.fwd_from.saved_from_msg_id;\r\n this.chat.appImManager.openThread(peerId, lastMsgId, threadId);\r\n } else {\r\n const message = this.appMessagesManager.filterMessages(this.chat.getMessage(bubbleMid), message => !!(message as Message.message).replies)[0] as Message.message;\r\n const replies = message.replies;\r\n if(replies) {\r\n this.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then(message => {\r\n this.chat.appImManager.setInnerPeer(replies.channel_id.toPeerId(true), undefined, 'discussion', (message as MyMessage).mid);\r\n });\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n const via = findUpClassName(target, 'is-via');\r\n if(via) {\r\n const el = via.querySelector('.peer-title') as HTMLElement;\r\n if(target === el || findUpAsChild(target, el)) {\r\n const message = el.innerText + ' ';\r\n this.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\r\n cancelEvent(e);\r\n \r\n return;\r\n }\r\n }\r\n\r\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\r\n if(nameDiv && nameDiv !== bubble) {\r\n target = nameDiv || target;\r\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer');\r\n const savedFrom = target.dataset.savedFrom;\r\n if(typeof(peerIdStr) === 'string' || savedFrom) {\r\n if(savedFrom) {\r\n const [peerId, mid] = savedFrom.split('_');\r\n \r\n this.chat.appImManager.setInnerPeer(peerId.toPeerId(), +mid);\r\n } else {\r\n const peerId = peerIdStr.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer(peerId);\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n //this.log('chatInner click:', target);\r\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\r\n /* if(isVideoComponentElement) {\r\n const video = target.parentElement.querySelector('video') as HTMLElement;\r\n if(video) {\r\n video.click(); // hot-fix for time and play button\r\n return;\r\n }\r\n } */\r\n\r\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\r\n const messageId = +bubble.dataset.mid;\r\n const message = this.chat.getMessage(messageId);\r\n\r\n const doc = message.media?.document;\r\n\r\n if(doc?.stickerSetInput) {\r\n new PopupStickers(doc.stickerSetInput).show();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const documentDiv = findUpClassName(target, 'document-with-thumb');\r\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) \r\n || target.classList.contains('album-item')\r\n // || isVideoComponentElement\r\n || (target.tagName === 'VIDEO' && !bubble.classList.contains('round'))\r\n || (documentDiv && !documentDiv.querySelector('.preloader-container'))) {\r\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\r\n const messageId = +(groupedItem || bubble).dataset.mid;\r\n const message = this.chat.getMessage(messageId);\r\n if(!message) {\r\n this.log.warn('no message by messageId:', messageId);\r\n return;\r\n }\r\n\r\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\r\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\r\n\r\n const f = documentDiv ? (media: any) => {\r\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\r\n } : (media: any) => {\r\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\r\n };\r\n\r\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\r\n const ids = isSingleMedia ? [messageId] : Object.keys(this.bubbles).map(k => +k).filter(id => {\r\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\r\n return false;\r\n } */\r\n //if(!this.scrollable.visibleElements.find(e => e.element === this.bubbles[id])) return false;\r\n\r\n const message = this.chat.getMessage(id);\r\n const media = this.appMessagesManager.getMediaFromMessage(message);\r\n \r\n return media && f(media);\r\n }).sort((a, b) => a - b);\r\n\r\n ids.forEach(id => {\r\n let selector: string;\r\n if(documentDiv) {\r\n selector = '.document-container';\r\n } else {\r\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\r\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\r\n if(withTail) {\r\n selector += '.bubble__media-container';\r\n } else {\r\n selector += '.attachment video, .attachment img';\r\n }\r\n }\r\n\r\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\r\n const parents: Set = new Set();\r\n if(documentDiv) {\r\n elements.forEach((element) => {\r\n targets.push({\r\n element: element.querySelector('.document-ico'),\r\n mid: +element.dataset.mid,\r\n peerId: this.peerId\r\n });\r\n });\r\n } else {\r\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\r\n elements.forEach((element) => {\r\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\r\n let albumItem = findUpClassName(element, 'album-item');\r\n const parent = albumItem || element.parentElement;\r\n if(parents.has(parent)) return;\r\n parents.add(parent);\r\n targets.push({\r\n element,\r\n mid: albumItem ? +albumItem.dataset.mid : id,\r\n peerId: this.peerId\r\n });\r\n });\r\n }\r\n });\r\n\r\n targets.sort((a, b) => a.mid - b.mid);\r\n\r\n let idx = targets.findIndex(t => t.mid === messageId);\r\n\r\n if(DEBUG) {\r\n this.log('open mediaViewer single with ids:', ids, idx, targets);\r\n }\r\n\r\n if(!targets[idx]) {\r\n this.log('no target for media viewer!', target);\r\n return;\r\n }\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n threadId: this.chat.threadId,\r\n peerId: this.peerId,\r\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\r\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\r\n isScheduled: this.chat.type === 'scheduled'\r\n })\r\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\r\n \r\n cancelEvent(e);\r\n //appMediaViewer.openMedia(message, target as HTMLImageElement);\r\n return;\r\n }\r\n \r\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\r\n \r\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\r\n if(target.classList.contains('goto-original')) {\r\n const savedFrom = bubble.dataset.savedFrom;\r\n const [peerId, mid] = savedFrom.split('_');\r\n ////this.log('savedFrom', peerId, msgID);\r\n this.chat.appImManager.setInnerPeer(peerId.toPeerId(), +mid);\r\n return;\r\n } else if(target.classList.contains('forward')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = this.appMessagesManager.getMessageByPeer(this.peerId, mid);\r\n new PopupForward({\r\n [this.peerId]: this.appMessagesManager.getMidsByMessage(message)\r\n });\r\n //appSidebarRight.forwardTab.open([mid]);\r\n return;\r\n }\r\n \r\n let isReplyClick = false;\r\n \r\n try {\r\n isReplyClick = !!findUpClassName(e.target, 'reply');\r\n } catch(err) {}\r\n \r\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n this.replyFollowHistory.push(bubbleMid);\r\n\r\n const message = this.chat.getMessage(bubbleMid) as Message.message;\r\n\r\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\r\n const replyToMid = message.reply_to.reply_to_msg_id;\r\n\r\n this.chat.appImManager.setInnerPeer(replyToPeerId, replyToMid, this.chat.type, this.chat.threadId);\r\n\r\n /* if(this.chat.type === 'discussion') {\r\n this.chat.appImManager.setMessageId(, originalMessageId);\r\n } else {\r\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\r\n } */\r\n //this.chat.setMessageId(, originalMessageId);\r\n }\r\n }\r\n \r\n //console.log('chatInner click', e);\r\n };\r\n\r\n public onGoDownClick() {\r\n if(this.replyFollowHistory.length) {\r\n forEachReverse(this.replyFollowHistory, (mid, idx) => {\r\n const bubble = this.bubbles[mid];\r\n let bad = true;\r\n if(bubble) {\r\n const rect = bubble.getBoundingClientRect();\r\n bad = (windowSize.height / 2) > rect.top;\r\n } else {\r\n const message = this.chat.getMessage(mid);\r\n if(!message.deleted) {\r\n bad = false;\r\n }\r\n }\r\n \r\n if(bad) {\r\n this.replyFollowHistory.splice(idx, 1);\r\n }\r\n });\r\n\r\n this.replyFollowHistory.sort((a, b) => b - a);\r\n\r\n const mid = this.replyFollowHistory.pop();\r\n this.chat.setMessageId(mid);\r\n } else {\r\n this.chat.setMessageId(/* , dialog.top_message */);\r\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n \r\n // if(dialog) {\r\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\r\n // } else {\r\n // this.log('will scroll down 3');\r\n // this.scroll.scrollTop = this.scroll.scrollHeight;\r\n // }\r\n }\r\n }\r\n\r\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\r\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\r\n /* if(element) {\r\n if(element.classList.contains('bubbles-date-group')) {\r\n const children = Array.from(element.children) as HTMLElement[];\r\n if(verticalSide === 'top') {\r\n element = children[this.stickyIntersector ? 2 : 1];\r\n } else {\r\n element = children[children.length - 1];\r\n }\r\n } else {\r\n element = findUpClassName(element, 'bubble');\r\n if(element && element.classList.contains('is-date')) {\r\n element = element.nextElementSibling as HTMLElement;\r\n }\r\n }\r\n } */\r\n if(element) element = findUpClassName(element, 'bubble');\r\n\r\n return element;\r\n }\r\n\r\n public getGroupedBubble(groupId: string) {\r\n const group = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n for(const [mid] of group) {\r\n if(this.bubbles[mid]) {\r\n const maxId = Math.max(...group.keys()); // * because in scheduled album can be rendered by lowest mid during sending\r\n return {\r\n bubble: this.bubbles[mid], \r\n mid: +mid,\r\n message: this.chat.getMessage(maxId)\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public getBubbleGroupedItems(bubble: HTMLElement) {\r\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\r\n }\r\n\r\n public getMountedBubble(mid: number, message = this.chat.getMessage(mid)) {\r\n if(message.grouped_id && this.appMessagesManager.getMidsByAlbum(message.grouped_id).length > 1) {\r\n const a = this.getGroupedBubble(message.grouped_id);\r\n if(a) {\r\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\r\n return a;\r\n }\r\n }\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n return {bubble, mid, message};\r\n }\r\n\r\n private findNextMountedBubbleByMsgId(mid: number) {\r\n return this.bubbles[getObjectKeysAndSort(this.bubbles).find(id => {\r\n if(id < mid) return false;\r\n return !!this.bubbles[id]?.parentElement;\r\n })];\r\n }\r\n\r\n public loadMoreHistory(top: boolean, justLoad = false) {\r\n //this.log('loadMoreHistory', top);\r\n if(!this.peerId || \r\n /* TEST_SCROLL || */ \r\n this.chat.setPeerPromise || \r\n this.isHeavyAnimationInProgress || \r\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) || \r\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\r\n ) {\r\n return;\r\n }\r\n\r\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\r\n const history = Object.keys(this.bubbles).map(id => +id).sort((a, b) => a - b);\r\n if(!history.length) return;\r\n \r\n if(top) {\r\n if(DEBUG) {\r\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n /* if(history.length === 75) {\r\n this.log('load more', this.scrollable.scrollHeight, this.scrollable.scrollTop, this.scrollable);\r\n return;\r\n } */\r\n /* false && */this.getHistory(history[0], true, undefined, undefined, justLoad);\r\n } else {\r\n //let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n \r\n // if scroll down after search\r\n if(history.indexOf(historyStorage.maxId) !== -1) {\r\n this.setLoaded('bottom', true);\r\n return;\r\n }\r\n\r\n if(DEBUG) {\r\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n /* false && */this.getHistory(history[history.length - 1], false, true, undefined, justLoad);\r\n }\r\n }\r\n\r\n public onScroll = () => {\r\n //return;\r\n \r\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\r\n if(this.isHeavyAnimationInProgress && this.scrolledDown) return;\r\n //lottieLoader.checkAnimations(false, 'chat');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\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);\r\n }\r\n \r\n if(this.scrollable.getDistanceToEnd() < 300 && this.scrollable.loadedAll.bottom) {\r\n this.bubblesContainer.classList.add('scrolled-down');\r\n this.scrolledDown = true;\r\n } else if(this.bubblesContainer.classList.contains('scrolled-down')) {\r\n this.bubblesContainer.classList.remove('scrolled-down');\r\n this.scrolledDown = false;\r\n }\r\n\r\n if(this.chat.topbar.pinnedMessage) {\r\n this.chat.topbar.pinnedMessage.setCorrectIndex(this.scrollable.lastScrollDirection);\r\n }\r\n };\r\n\r\n public setScroll() {\r\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\r\n this.setLoaded('top', false);\r\n this.setLoaded('bottom', false);\r\n\r\n this.scrollable.container.append(this.chatInner);\r\n\r\n /* const getScrollOffset = () => {\r\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\r\n return 300; \r\n };\r\n\r\n window.addEventListener('resize', () => {\r\n this.scrollable.onScrollOffset = getScrollOffset();\r\n });\r\n\r\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\r\n\r\n this.scrollable.onAdditionalScroll = this.onScroll;\r\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\r\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\r\n //this.scrollable.attachSentinels(undefined, 300);\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.scrollable.container.addEventListener('touchmove', () => {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n }, {passive: true});\r\n\r\n this.scrollable.container.addEventListener('touchend', () => {\r\n if(!this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n }\r\n\r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }, {passive: true});\r\n }\r\n }\r\n\r\n public updateUnreadByDialog() {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\r\n \r\n ///////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\r\n \r\n for(const msgId of this.unreadOut) {\r\n if(msgId > 0 && msgId <= maxId) {\r\n const bubble = this.bubbles[msgId];\r\n if(bubble) {\r\n if(bubble.classList.contains('is-sending')) {\r\n continue;\r\n }\r\n \r\n bubble.classList.remove('is-sent', 'is-sending'); // 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 this.unreadOut.delete(msgId);\r\n }\r\n }\r\n }\r\n \r\n public deleteMessagesByIds(mids: number[], permanent = true) {\r\n mids.forEach(mid => {\r\n if(!(mid in this.bubbles)) return;\r\n \r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return; */\r\n\r\n const bubble = this.bubbles[mid];\r\n delete this.bubbles[mid];\r\n this.skippedMids.delete(mid);\r\n\r\n if(this.firstUnreadBubble === bubble) {\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n this.bubbleGroups.removeBubble(bubble);\r\n if(this.unreadedObserver) {\r\n this.unreadedObserver.unobserve(bubble);\r\n this.unreaded.delete(bubble);\r\n }\r\n if(this.viewsObserver) {\r\n this.viewsObserver.unobserve(bubble);\r\n this.viewsMids.delete(mid);\r\n }\r\n //this.unreaded.findAndSplice(mid => mid === id);\r\n bubble.remove();\r\n //bubble.remove();\r\n\r\n if(this.emptyPlaceholderMid === mid) {\r\n this.emptyPlaceholderMid = undefined;\r\n }\r\n });\r\n\r\n if(permanent && this.chat.selection.isSelecting) {\r\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\r\n }\r\n \r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP);\r\n this.deleteEmptyDateGroups();\r\n }\r\n \r\n public renderNewMessagesByIds(mids: number[], scrolledDown?: boolean) {\r\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\r\n //this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\r\n return;\r\n }\r\n\r\n if(this.chat.threadId) {\r\n mids = mids.filter(mid => {\r\n const message = this.chat.getMessage(mid);\r\n const replyTo = message.reply_to as MessageReplyHeader;\r\n return replyTo && (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) === this.chat.threadId;\r\n });\r\n }\r\n\r\n mids = mids.filter(mid => !this.bubbles[mid]);\r\n // ! should scroll even without new messages\r\n /* if(!mids.length) {\r\n return;\r\n } */\r\n\r\n if(!scrolledDown) {\r\n scrolledDown = this.scrolledDown && (!this.scrollingToBubble || this.scrollingToBubble === this.getLastBubble());\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n let isPaddingNeeded = false;\r\n let setPaddingTo: HTMLElement;\r\n if(!this.isTopPaddingSet) {\r\n const {clientHeight, scrollHeight} = this.scrollable.container;\r\n isPaddingNeeded = clientHeight === scrollHeight;\r\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\r\n if(this.chatInner.firstElementChild) {\r\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\r\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\r\n } else {\r\n isPaddingNeeded = true;\r\n } */\r\n\r\n if(isPaddingNeeded) {\r\n /* const add = clientHeight - scrollHeight;\r\n this.chatInner.style.paddingTop = add + 'px';\r\n this.scrollable.scrollTop += add; */\r\n setPaddingTo = this.chatInner;\r\n setPaddingTo.style.paddingTop = clientHeight + 'px';\r\n this.scrollable.scrollTop = scrollHeight;\r\n this.isTopPaddingSet = true;\r\n }\r\n }\r\n\r\n const promise = this.performHistoryResult(mids, false, true);\r\n if(scrolledDown) {\r\n promise.then(() => {\r\n if(!middleware()) return;\r\n //this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\r\n //const bubble = this.bubbles[Math.max(...mids)];\r\n\r\n let bubble: HTMLElement;\r\n if(this.chat.type === 'scheduled') {\r\n bubble = this.bubbles[Math.max(...mids)];\r\n }\r\n\r\n const promise = this.scrollToBubbleEnd(bubble) || Promise.resolve();\r\n if(isPaddingNeeded) {\r\n promise.then(() => { // it will be called only once even if was set multiple times (that won't happen)\r\n if(middleware() && isPaddingNeeded) {\r\n setPaddingTo.style.paddingTop = '';\r\n this.isTopPaddingSet = false;\r\n }\r\n });\r\n }\r\n\r\n //this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\r\n\r\n /* setTimeout(() => {\r\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\r\n }, 10); */\r\n });\r\n }\r\n }\r\n\r\n public getLastBubble() {\r\n const lastDateGroup = this.getLastDateGroup();\r\n if(lastDateGroup) {\r\n return lastDateGroup.lastElementChild as HTMLElement;\r\n }\r\n }\r\n\r\n public scrollToBubble(\r\n element: HTMLElement, \r\n position: ScrollLogicalPosition,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number\r\n ) {\r\n // * 4 = .25rem\r\n const bubble = findUpClassName(element, 'bubble');\r\n\r\n // * if it's a start, then scroll to start of the group\r\n if(position === 'center' && whichChild(bubble) === (this.stickyIntersector ? 2 : 1)) {\r\n const dateGroup = bubble.parentElement;\r\n if(whichChild(dateGroup) === 0) {\r\n element = dateGroup;\r\n position = 'start';\r\n }\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 return this.scrollable.scrollIntoViewNew(\r\n element, \r\n position, \r\n 4, \r\n undefined, \r\n forceDirection, \r\n forceDuration, \r\n 'y', \r\n isChangingHeight ? ({rect}) => {\r\n // return rect.height;\r\n\r\n let height = windowSize.height;\r\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\r\n height -= this.bubblesContainer.offsetTop;\r\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\r\n return height;\r\n\r\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\r\n const diff = rowsWrapperHeight - 54;\r\n return rect.height + diff; */\r\n } : undefined\r\n );\r\n }\r\n\r\n public scrollToBubbleEnd(bubble = this.getLastBubble()) {\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 return this.scrollToBubble(bubble, 'end', undefined, undefined).then(() => {\r\n if(!middleware()) return;\r\n this.scrollingToBubble = undefined;\r\n });\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 scrollToBubbleIfLast(bubble: HTMLElement) {\r\n if(bubble.parentElement.lastElementChild === bubble && \r\n this.getLastDateGroup().parentElement.lastElementChild === bubble.parentElement) {\r\n this.scrollToBubbleEnd(bubble);\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 public getDateContainerByMessage(message: any, reverse: boolean) {\r\n const date = new Date(message.date * 1000);\r\n date.setHours(0, 0, 0);\r\n const dateTimestamp = date.getTime();\r\n if(!this.dateMessages[dateTimestamp]) {\r\n 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 && message.date === 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 ////////this.log('need to render date message', dateTimestamp, str);\r\n\r\n const container = document.createElement('div');\r\n container.className = 'bubbles-date-group';\r\n container.append(bubble);\r\n\r\n this.dateMessages[dateTimestamp] = {\r\n div: bubble,\r\n container,\r\n firstTimestamp: date.getTime()\r\n };\r\n\r\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\r\n let i = 0, length = haveTimestamps.length, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\r\n for(; i < haveTimestamps.length; ++i) {\r\n const t = haveTimestamps[i];\r\n insertBefore = this.dateMessages[t].container;\r\n if(dateTimestamp < t) {\r\n break;\r\n }\r\n }\r\n\r\n if(i === length && insertBefore) {\r\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\r\n }\r\n\r\n if(!insertBefore) {\r\n this.chatInner.append(container);\r\n } else {\r\n this.chatInner.insertBefore(container, insertBefore);\r\n }\r\n\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.observeStickyHeaderChanges(container);\r\n }\r\n }\r\n\r\n return this.dateMessages[dateTimestamp];\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Bubbles destroying');\r\n\r\n this.scrollable.onScrolledTop = this.scrollable.onScrolledBottom = this.scrollable.onAdditionalScroll = null;\r\n\r\n this.listenerSetter.removeAll();\r\n\r\n this.lazyLoadQueue.clear();\r\n this.unreadedObserver && this.unreadedObserver.disconnect();\r\n this.viewsObserver && this.viewsObserver.disconnect();\r\n this.stickyIntersector && this.stickyIntersector.disconnect();\r\n\r\n delete this.lazyLoadQueue;\r\n this.unreadedObserver && delete this.unreadedObserver;\r\n this.viewsObserver && delete this.viewsObserver;\r\n this.stickyIntersector && delete this.stickyIntersector;\r\n }\r\n\r\n public cleanup(bubblesToo = false) {\r\n ////console.time('appImManager cleanup');\r\n this.setLoaded('top', false);\r\n this.setLoaded('bottom', false);\r\n\r\n // cancel scroll\r\n cancelAnimationByKey(this.scrollable.container);\r\n\r\n // do not wait ending of previous scale animation\r\n interruptHeavyAnimation();\r\n\r\n if(TEST_SCROLL !== undefined) {\r\n TEST_SCROLL = TEST_SCROLL_TIMES;\r\n }\r\n\r\n this.bubbles = {};\r\n this.skippedMids.clear();\r\n this.dateMessages = {};\r\n this.bubbleGroups.cleanup();\r\n this.unreadOut.clear();\r\n this.needUpdate.length = 0;\r\n this.lazyLoadQueue.clear();\r\n \r\n // clear messages\r\n if(bubblesToo) {\r\n this.scrollable.container.textContent = '';\r\n }\r\n \r\n this.firstUnreadBubble = null;\r\n this.attachedUnreadBubble = false;\r\n \r\n this.messagesQueue.length = 0;\r\n this.messagesQueuePromise = null;\r\n \r\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\r\n this.fetchNewPromise = undefined;\r\n \r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.disconnect();\r\n }\r\n \r\n if(this.unreadedObserver) {\r\n this.unreadedObserver.disconnect();\r\n this.unreaded.clear();\r\n this.unreadedSeen.clear();\r\n this.readPromise = undefined;\r\n }\r\n\r\n if(this.viewsObserver) {\r\n this.viewsObserver.disconnect();\r\n this.viewsMids.clear();\r\n }\r\n \r\n this.loadedTopTimes = this.loadedBottomTimes = 0;\r\n \r\n this.middleware.clean();\r\n \r\n this.onAnimateLadder = undefined;\r\n this.resolveLadderAnimation = undefined;\r\n this.emptyPlaceholderMid = undefined;\r\n\r\n this.scrollingToBubble = undefined;\r\n ////console.timeEnd('appImManager cleanup');\r\n\r\n this.isTopPaddingSet = false;\r\n }\r\n\r\n public setPeer(peerId: PeerId, lastMsgId?: number): {cached?: boolean, promise: Chat['setPeerPromise']} {\r\n //console.time('appImManager setPeer');\r\n //console.time('appImManager setPeer pre promise');\r\n ////console.time('appImManager: pre render start');\r\n if(!peerId) {\r\n this.cleanup(true);\r\n this.peerId = peerId;\r\n return null;\r\n }\r\n\r\n const samePeer = this.peerId === peerId;\r\n\r\n /* if(samePeer && this.chat.setPeerPromise) {\r\n return {cached: true, promise: this.chat.setPeerPromise};\r\n } */\r\n\r\n const chatType = this.chat.type;\r\n\r\n if(chatType === 'scheduled') {\r\n lastMsgId = 0;\r\n }\r\n\r\n this.historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n let topMessage = chatType === 'pinned' ? this.appMessagesManager.pinnedMessages[peerId].maxId : this.historyStorage.maxId ?? 0;\r\n const isTarget = lastMsgId !== undefined;\r\n\r\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\r\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\r\n topMessage = 0;\r\n } */\r\n\r\n let readMaxId = 0, savedPosition: ReturnType;\r\n if(!isTarget) {\r\n if(!samePeer) {\r\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\r\n }\r\n\r\n if(savedPosition) {\r\n \r\n } else if(topMessage) {\r\n readMaxId = this.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId);\r\n if(/* dialog.unread_count */readMaxId && !samePeer) {\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;\r\n\r\n const {scrollable} = this;\r\n \r\n if(samePeer) {\r\n const mounted = this.getMountedBubble(lastMsgId);\r\n if(mounted) {\r\n if(isTarget) {\r\n this.scrollToBubble(mounted.bubble, 'center');\r\n this.highlightBubble(mounted.bubble);\r\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\r\n } else if(topMessage && !isJump) {\r\n //this.log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\r\n scrollable.scrollTop = scrollable.scrollHeight;\r\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\r\n }\r\n \r\n return null;\r\n }\r\n } else {\r\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n this.chat.apiManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\r\n }\r\n\r\n this.peerId = peerId;\r\n this.replyFollowHistory.length = 0;\r\n\r\n this.passEntities = {\r\n messageEntityBotCommand: this.appPeersManager.isAnyGroup(peerId) || this.appUsersManager.isBot(peerId)\r\n };\r\n }\r\n\r\n if(DEBUG) {\r\n this.log('setPeer peerId:', peerId, this.historyStorage, lastMsgId, topMessage);\r\n }\r\n\r\n // add last message, bc in getHistory will load < max_id\r\n const additionMsgId = isJump || chatType === 'scheduled' ? 0 : topMessage;\r\n\r\n /* this.setPeerPromise = null;\r\n this.preloader.detach();\r\n return true; */\r\n\r\n //////appSidebarRight.toggleSidebar(true);\r\n\r\n let maxBubbleId = 0;\r\n if(samePeer) {\r\n let el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(el) {\r\n maxBubbleId = +el.dataset.mid;\r\n }\r\n\r\n if(maxBubbleId <= 0) {\r\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map(mid => +mid));\r\n }\r\n } else {\r\n this.isFirstLoad = true;\r\n }\r\n\r\n const oldChatInner = this.chatInner;\r\n this.cleanup();\r\n const chatInner = this.chatInner = document.createElement('div');\r\n if(samePeer) {\r\n chatInner.className = oldChatInner.className;\r\n chatInner.classList.remove('disable-hover', 'is-scrolling');\r\n } else {\r\n chatInner.classList.add('bubbles-inner');\r\n }\r\n\r\n this.lazyLoadQueue.lock();\r\n\r\n let result: ReturnType;\r\n if(!savedPosition) {\r\n result = this.getHistory(lastMsgId, true, isJump, additionMsgId);\r\n } else {\r\n result = {\r\n promise: getHeavyAnimationPromise().then(() => {\r\n return this.performHistoryResult(savedPosition.mids, true, false, undefined);\r\n }) as any,\r\n cached: true\r\n };\r\n }\r\n\r\n const {promise, cached} = result;\r\n\r\n // clear \r\n if(!cached) {\r\n if(!samePeer) {\r\n scrollable.container.textContent = '';\r\n //oldChatInner.remove();\r\n this.chat.finishPeerChange(isTarget, isJump, lastMsgId);\r\n this.preloader.attach(this.bubblesContainer);\r\n }\r\n }\r\n\r\n //console.timeEnd('appImManager setPeer pre promise');\r\n /* this.ladderDeferred && this.ladderDeferred.resolve();\r\n this.ladderDeferred = deferredPromise(); */\r\n \r\n animationIntersector.lockGroup(CHAT_ANIMATION_GROUP);\r\n const setPeerPromise = promise.then(() => {\r\n ////this.log('setPeer removing preloader');\r\n\r\n if(cached) {\r\n if(!samePeer) {\r\n this.chat.finishPeerChange(isTarget, isJump, lastMsgId); // * костыль\r\n }\r\n } else {\r\n this.preloader.detach();\r\n }\r\n\r\n if(this.resolveLadderAnimation) {\r\n this.resolveLadderAnimation();\r\n this.resolveLadderAnimation = undefined;\r\n }\r\n\r\n // this.ladderDeferred.resolve();\r\n\r\n scrollable.lastScrollDirection = 0;\r\n scrollable.lastScrollTop = 0;\r\n replaceContent(scrollable.container, chatInner);\r\n\r\n animationIntersector.unlockGroup(CHAT_ANIMATION_GROUP);\r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP/* , true */);\r\n\r\n //fastRaf(() => {\r\n this.lazyLoadQueue.unlock();\r\n //});\r\n\r\n //if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\r\n if(savedPosition) {\r\n scrollable.scrollTop = 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((topMessage && isJump) || isTarget) {\r\n const fromUp = maxBubbleId > 0 && (maxBubbleId < lastMsgId || lastMsgId < 0);\r\n const followingUnread = readMaxId === lastMsgId && !isTarget;\r\n if(!fromUp && samePeer) {\r\n scrollable.scrollTop = 99999;\r\n } else if(fromUp/* && (samePeer || forwardingUnread) */) {\r\n scrollable.scrollTop = 0;\r\n }\r\n\r\n const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n \r\n // ! sometimes there can be no bubble\r\n if(bubble) {\r\n this.scrollToBubble(bubble, followingUnread ? 'start' : 'center', !samePeer ? FocusDirection.Static : undefined);\r\n if(!followingUnread) {\r\n this.highlightBubble(bubble);\r\n }\r\n }\r\n } else {\r\n scrollable.scrollTop = 99999;\r\n }\r\n\r\n this.onScroll();\r\n\r\n const middleware = this.getMiddleware();\r\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\r\n afterSetPromise.then(() => { // check whether list isn't full\r\n scrollable.checkForTriggers();\r\n });\r\n\r\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\r\n\r\n const needFetchInterval = this.appMessagesManager.isFetchIntervalNeeded(peerId);\r\n const needFetchNew = savedPosition || needFetchInterval;\r\n if(!needFetchNew) {\r\n // warning\r\n if(!lastMsgId || this.bubbles[topMessage] || lastMsgId === topMessage) {\r\n this.setLoaded('bottom', true);\r\n }\r\n } else {\r\n afterSetPromise.then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n scrollable.checkForTriggers();\r\n\r\n if(needFetchInterval) {\r\n const f = () => {\r\n this.fetchNewPromise = new Promise((resolve) => {\r\n if(!middleware() || !this.appMessagesManager.isFetchIntervalNeeded(peerId)) {\r\n resolve();\r\n return;\r\n }\r\n \r\n this.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((historyStorage) => {\r\n if(!middleware() || !historyStorage) {\r\n resolve();\r\n return;\r\n }\r\n \r\n const slice = historyStorage.history.slice;\r\n const isBottomEnd = slice.isEnd(SliceEnd.Bottom);\r\n if(scrollable.loadedAll.bottom && scrollable.loadedAll.bottom !== isBottomEnd) {\r\n this.setLoaded('bottom', isBottomEnd);\r\n this.onScroll();\r\n }\r\n\r\n setTimeout(f, 30e3);\r\n resolve();\r\n });\r\n }).finally(() => {\r\n this.fetchNewPromise = undefined;\r\n });\r\n };\r\n \r\n if(samePeer) {\r\n setTimeout(f, 30e3);\r\n } else {\r\n f();\r\n }\r\n }\r\n });\r\n }\r\n \r\n this.log('scrolledAllDown:', scrollable.loadedAll.bottom);\r\n\r\n //if(!this.unreaded.length && dialog) { // lol\r\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\r\n this.onScrolledAllDown();\r\n }\r\n\r\n if(chatType === 'chat') {\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(dialog?.pFlags.unread_mark) {\r\n this.appMessagesManager.markDialogUnread(peerId, true);\r\n }\r\n }\r\n\r\n //this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\r\n\r\n /* if(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\r\n return new Promise((resolve) => fastRaf(resolve));\r\n } */\r\n //console.timeEnd('appImManager setPeer');\r\n }).catch(err => {\r\n this.log.error('getHistory promise error:', err);\r\n this.preloader.detach();\r\n throw err;\r\n });\r\n\r\n return {cached, promise: setPeerPromise};\r\n }\r\n\r\n public onScrolledAllDown() {\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n const storage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n this.appMessagesManager.readHistory(this.peerId, storage.maxId, this.chat.threadId, true);\r\n }\r\n }\r\n\r\n public finishPeerChange() {\r\n const peerId = this.peerId;\r\n const isChannel = this.appPeersManager.isChannel(peerId);\r\n const canWrite = this.appMessagesManager.canSendToPeer(peerId, this.chat.threadId);\r\n \r\n this.chatInner.classList.toggle('has-rights', canWrite);\r\n this.bubblesContainer.classList.toggle('is-chat-input-hidden', !canWrite);\r\n\r\n this.chatInner.classList.toggle('is-chat', this.chat.isAnyGroup());\r\n this.chatInner.classList.toggle('is-channel', isChannel);\r\n }\r\n\r\n public renderMessagesQueue(message: any, bubble: HTMLElement, reverse: boolean, promises: Promise[]) {\r\n /* let dateMessage = this.getDateContainerByMessage(message, reverse);\r\n if(reverse) dateMessage.container.insertBefore(bubble, dateMessage.div.nextSibling);\r\n else dateMessage.container.append(bubble);\r\n return; */\r\n\r\n /* if(DEBUG && message.mid === 4314759167) {\r\n this.log('renderMessagesQueue', message, bubble, reverse, promises);\r\n } */\r\n\r\n this.messagesQueue.push({message, bubble, reverse, promises});\r\n\r\n this.setMessagesQueuePromise(); \r\n }\r\n\r\n public setMessagesQueuePromise() {\r\n if(this.messagesQueuePromise || !this.messagesQueue.length) return;\r\n\r\n this.messagesQueuePromise = new Promise((resolve, reject) => {\r\n setTimeout(() => {\r\n const queue = this.messagesQueue.slice();\r\n this.messagesQueue.length = 0;\r\n\r\n const promises = queue.reduce((acc, {promises}) => acc.concat(promises), []);\r\n\r\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\r\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\r\n // promises.push(getHeavyAnimationPromise());\r\n\r\n this.log('promises to call', promises, queue, this.isHeavyAnimationInProgress);\r\n const middleware = this.getMiddleware();\r\n Promise.all(promises).then(() => {\r\n if(!middleware()) {\r\n throw 'setMessagesQueuePromise: peer changed!';\r\n }\r\n\r\n if(this.messagesQueueOnRender) {\r\n this.messagesQueueOnRender();\r\n }\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n\r\n queue.forEach(({message, bubble, reverse}) => {\r\n this.setBubblePosition(bubble, message, reverse);\r\n });\r\n\r\n //setTimeout(() => {\r\n resolve();\r\n //}, 500);\r\n this.messagesQueuePromise = null;\r\n\r\n if(this.messagesQueue.length) {\r\n this.setMessagesQueuePromise();\r\n }\r\n\r\n this.setUnreadDelimiter(); // не нашёл места лучше\r\n }).catch(reject);\r\n }, 0);\r\n });\r\n\r\n //this.messagesQueuePromise.catch(() => {});\r\n }\r\n\r\n public setBubblePosition(bubble: HTMLElement, message: any, reverse: boolean) {\r\n if(message.id < 0) {\r\n this.chatInner.prepend(bubble);\r\n return;\r\n }\r\n\r\n const dateMessage = this.getDateContainerByMessage(message, reverse);\r\n if(this.chat.type === 'scheduled' || this.chat.type === 'pinned'/* || true */) { // ! TEMP COMMENTED\r\n const offset = this.stickyIntersector ? 2 : 1;\r\n let children = Array.from(dateMessage.container.children).slice(offset) as HTMLElement[];\r\n let i = 0, foundMidOnSameTimestamp = 0;\r\n for(; i < children.length; ++i) {\r\n const t = children[i];\r\n const timestamp = +t.dataset.timestamp;\r\n if(message.date < timestamp) {\r\n break;\r\n } else if(message.date === timestamp) {\r\n foundMidOnSameTimestamp = +t.dataset.mid;\r\n }\r\n \r\n if(foundMidOnSameTimestamp && message.mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n \r\n // * 1 for date, 1 for date sentinel\r\n let index = offset + i;\r\n /* if(bubble.parentElement) { // * if already mounted\r\n const currentIndex = whichChild(bubble);\r\n if(index > currentIndex) {\r\n index -= 1; // * minus for already mounted\r\n }\r\n } */\r\n \r\n positionElementByIndex(bubble, dateMessage.container, index);\r\n } else {\r\n if(reverse) {\r\n dateMessage.container.insertBefore(bubble, dateMessage.container.children[this.stickyIntersector ? 1 : 0].nextSibling);\r\n } else {\r\n dateMessage.container.append(bubble);\r\n }\r\n }\r\n\r\n if(message._ === 'message') {\r\n this.bubbleGroups.addBubble(bubble, message, reverse);\r\n } else {\r\n bubble.classList.add('is-group-first', 'is-group-last');\r\n }\r\n }\r\n\r\n public getMiddleware() {\r\n return this.middleware.get();\r\n }\r\n \r\n // reverse means top\r\n private renderMessage(message: any, reverse = false, multipleRender = false, bubble: HTMLDivElement = null, updatePosition = true) {\r\n /* if(DEBUG) {\r\n this.log.debug('message to render:', message);\r\n } */\r\n if(!bubble && this.bubbles[message.mid]) {\r\n return;\r\n }\r\n\r\n //return;\r\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\r\n if(message.deleted) return;\r\n else if(message.grouped_id && albumMustBeRenderedFull) { // will render only last album's message\r\n const storage = this.appMessagesManager.groupedMessagesStorage[message.grouped_id];\r\n const maxId = Math.max(...storage.keys());\r\n if(message.mid < maxId) {\r\n return;\r\n }\r\n }\r\n \r\n const peerId = this.peerId;\r\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\r\n const our = message.fromId === rootScope.myId || (message.pFlags.out && this.appPeersManager.isMegagroup(this.peerId));\r\n \r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('message');\r\n \r\n //messageDiv.innerText = message.message;\r\n\r\n let bubbleContainer: HTMLDivElement;\r\n let contentWrapper: HTMLElement;\r\n \r\n // bubble\r\n if(!bubble) {\r\n contentWrapper = document.createElement('div');\r\n contentWrapper.classList.add('bubble-content-wrapper');\r\n \r\n bubbleContainer = document.createElement('div');\r\n bubbleContainer.classList.add('bubble-content');\r\n \r\n bubble = document.createElement('div');\r\n bubble.classList.add('bubble');\r\n contentWrapper.appendChild(bubbleContainer);\r\n bubble.appendChild(contentWrapper);\r\n\r\n if(!our && !message.pFlags.out && this.unreadedObserver) {\r\n //this.log('not our message', message, message.pFlags.unread);\r\n const isUnread = message.pFlags.unread || \r\n this.appMessagesManager.isMentionUnread(message) || \r\n (this.historyStorage.readMaxId !== undefined && this.historyStorage.readMaxId < message.mid);\r\n if(isUnread) {\r\n this.unreadedObserver.observe(bubble); \r\n this.unreaded.set(bubble, message.mid);\r\n }\r\n }\r\n } else {\r\n const save = ['is-highlighted', 'is-group-first', 'is-group-last'];\r\n const wasClassNames = bubble.className.split(' ');\r\n const classNames = ['bubble'].concat(save.filter(c => wasClassNames.includes(c)));\r\n bubble.className = classNames.join(' ');\r\n\r\n contentWrapper = bubble.lastElementChild as HTMLElement;\r\n if(!contentWrapper.classList.contains('bubble-content-wrapper')) {\r\n contentWrapper = bubble.querySelector('.bubble-content-wrapper');\r\n }\r\n \r\n bubbleContainer = contentWrapper.firstElementChild as HTMLDivElement;\r\n bubbleContainer.innerHTML = '';\r\n bubbleContainer.style.cssText = '';\r\n contentWrapper.innerHTML = '';\r\n contentWrapper.appendChild(bubbleContainer);\r\n //bubbleContainer.style.marginBottom = '';\r\n const transitionDelay = contentWrapper.style.transitionDelay;\r\n contentWrapper.style.cssText = '';\r\n contentWrapper.style.transitionDelay = transitionDelay;\r\n\r\n if(bubble === this.firstUnreadBubble) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n // * Нужно очистить прошлую информацию, полезно если удалить последний элемент из альбома в ПОСЛЕДНЕМ БАББЛЕ ГРУППЫ (видно по аватару)\r\n const originalMid = +bubble.dataset.mid;\r\n const sameMid = +message.mid === originalMid;\r\n /* if(updatePosition) {\r\n bubble.remove(); // * for positionElementByIndex\r\n } */\r\n\r\n if(!sameMid) {\r\n delete this.bubbles[originalMid];\r\n this.skippedMids.delete(originalMid);\r\n }\r\n\r\n //bubble.innerHTML = '';\r\n }\r\n\r\n // ! reset due to album edit or delete item\r\n this.bubbles[+message.mid] = bubble;\r\n bubble.dataset.mid = message.mid;\r\n bubble.dataset.peerId = '' + message.peerId;\r\n bubble.dataset.timestamp = message.date;\r\n\r\n const loadPromises: Promise[] = [];\r\n\r\n if(message._ === 'messageService') {\r\n assumeType(message);\r\n\r\n const action = message.action;\r\n if(action) {\r\n const _ = action._;\r\n if(IGNORE_ACTIONS.has(_) || (langPack.hasOwnProperty(_) && !langPack[_])) {\r\n this.skippedMids.add(+message.mid);\r\n return bubble;\r\n }\r\n }\r\n\r\n bubble.className = 'bubble service';\r\n\r\n bubbleContainer.innerHTML = '';\r\n const s = document.createElement('div');\r\n s.classList.add('service-msg');\r\n if(action) {\r\n if(action._ === 'messageActionChannelMigrateFrom') {\r\n s.append(i18n('ChatMigration.From', [new PeerTitle({peerId: action.chat_id.toPeerId(true)}).element]));\r\n } else if(action._ === 'messageActionChatMigrateTo') {\r\n s.append(i18n('ChatMigration.To', [new PeerTitle({peerId: action.channel_id.toPeerId(true)}).element]));\r\n } else {\r\n s.append(this.appMessagesManager.wrapMessageActionTextNew(message));\r\n }\r\n }\r\n bubbleContainer.append(s);\r\n\r\n if(updatePosition) {\r\n this.renderMessagesQueue(message, bubble, reverse, loadPromises);\r\n\r\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\r\n bubble.classList.add('is-group-last');\r\n }\r\n }\r\n\r\n return bubble;\r\n }\r\n\r\n let messageMedia = message.media;\r\n\r\n let messageMessage: string, totalEntities: MessageEntity[];\r\n if(messageMedia?.document && !['video', 'gif'].includes(messageMedia.document.type)) {\r\n // * just filter these cases for documents caption\r\n } else if(message.grouped_id && albumMustBeRenderedFull) {\r\n const t = this.appMessagesManager.getAlbumText(message.grouped_id);\r\n messageMessage = t.message;\r\n //totalEntities = t.entities;\r\n totalEntities = t.totalEntities;\r\n } else if(messageMedia?.document?.type !== 'sticker') {\r\n messageMessage = message.message;\r\n //totalEntities = message.entities;\r\n totalEntities = message.totalEntities;\r\n }\r\n \r\n /* let richText = RichTextProcessor.wrapRichText(messageMessage, {\r\n entities: totalEntities\r\n }); */\r\n let richText = RichTextProcessor.wrapRichText(messageMessage, {\r\n entities: totalEntities,\r\n passEntities: this.passEntities\r\n });\r\n\r\n let canHaveTail = true;\r\n let isStandaloneMedia = false;\r\n let needToSetHTML = true;\r\n if(totalEntities && !messageMedia) {\r\n let emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji');\r\n let strLength = messageMessage.length;\r\n let emojiStrLength = emojiEntities.reduce((acc: number, curr: any) => acc + curr.length, 0);\r\n \r\n if(emojiStrLength === strLength && emojiEntities.length <= 3) {\r\n if(rootScope.settings.emoji.big) {\r\n let sticker = this.appStickersManager.getAnimatedEmojiSticker(messageMessage);\r\n if(emojiEntities.length === 1 && !messageMedia && sticker) {\r\n messageMedia = {\r\n _: 'messageMediaDocument',\r\n document: sticker\r\n };\r\n } else {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n attachmentDiv.innerHTML = richText;\r\n \r\n bubble.classList.add('emoji-' + emojiEntities.length + 'x');\r\n \r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n bubble.classList.add('is-message-empty', 'emoji-big');\r\n isStandaloneMedia = true;\r\n canHaveTail = false;\r\n needToSetHTML = false;\r\n }\r\n \r\n bubble.classList.add('can-have-big-emoji');\r\n }\r\n \r\n /* if(strLength === emojiStrLength) {\r\n messageDiv.classList.add('emoji-only');\r\n messageDiv.classList.add('message-empty');\r\n } */\r\n }\r\n\r\n if(needToSetHTML) {\r\n setInnerHTML(messageDiv, richText);\r\n }\r\n \r\n const timeSpan = MessageRender.setTime(this.chat, message, bubble, bubbleContainer, messageDiv);\r\n bubbleContainer.prepend(messageDiv);\r\n //bubble.prepend(timeSpan, messageDiv); // that's bad\r\n\r\n if(message.views && !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.views && !message.pFlags.is_outgoing && this.viewsObserver) {\r\n this.viewsObserver.observe(bubble);\r\n }\r\n\r\n if(message.reply_markup && message.reply_markup._ === 'replyInlineMarkup' && message.reply_markup.rows && message.reply_markup.rows.length) {\r\n const rows = (message.reply_markup as ReplyMarkup.replyKeyboardMarkup).rows;\r\n\r\n const containerDiv = document.createElement('div');\r\n containerDiv.classList.add('reply-markup');\r\n rows.forEach((row) => {\r\n const buttons = row.buttons;\r\n if(!buttons || !buttons.length) return;\r\n\r\n const rowDiv = document.createElement('div');\r\n rowDiv.classList.add('reply-markup-row');\r\n\r\n buttons.forEach((button) => {\r\n const text = RichTextProcessor.wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\r\n\r\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\r\n \r\n switch(button._) {\r\n case 'keyboardButtonUrl': {\r\n const r = RichTextProcessor.wrapRichText(' ', {\r\n entities: [{\r\n _: 'messageEntityTextUrl',\r\n length: 1,\r\n offset: 0,\r\n url: button.url\r\n }]\r\n });\r\n\r\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\r\n buttonEl.classList.add('is-link', 'tgico');\r\n\r\n break;\r\n }\r\n\r\n case 'keyboardButtonSwitchInline': {\r\n buttonEl = document.createElement('button');\r\n buttonEl.classList.add('is-switch-inline', 'tgico');\r\n attachClickEvent(buttonEl, (e) => {\r\n cancelEvent(e);\r\n\r\n const botId = message.viaBotId || message.fromId;\r\n let promise: Promise;\r\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\r\n else promise = this.appInlineBotsManager.checkSwitchReturn(botId).then(peerId => {\r\n if(peerId) {\r\n return peerId;\r\n }\r\n \r\n return new Promise((resolve, reject) => {\r\n const popup = new PopupForward({\r\n [this.peerId]: []\r\n }, (peerId) => {\r\n resolve(peerId);\r\n }, true);\r\n\r\n popup.addEventListener('close', () => {\r\n reject();\r\n });\r\n });\r\n });\r\n \r\n promise.then(peerId => {\r\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\r\n this.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\r\n });\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n buttonEl = document.createElement('button');\r\n break;\r\n }\r\n }\r\n \r\n buttonEl.classList.add('reply-markup-button', 'rp');\r\n buttonEl.insertAdjacentHTML('beforeend', text);\r\n\r\n ripple(buttonEl);\r\n\r\n rowDiv.append(buttonEl);\r\n });\r\n\r\n containerDiv.append(rowDiv);\r\n });\r\n\r\n attachClickEvent(containerDiv, (e) => {\r\n let target = e.target as HTMLElement;\r\n \r\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\r\n if(!target || target.classList.contains('is-link') || target.classList.contains('is-switch-inline')) return;\r\n\r\n cancelEvent(e);\r\n\r\n const column = whichChild(target);\r\n const row = rows[whichChild(target.parentElement)];\r\n\r\n if(!row.buttons || !row.buttons[column]) {\r\n this.log.warn('no such button', row, column, message);\r\n return;\r\n }\r\n\r\n const button = row.buttons[column];\r\n this.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button);\r\n });\r\n\r\n canHaveTail = false;\r\n bubble.classList.add('with-reply-markup');\r\n contentWrapper.append(containerDiv);\r\n }\r\n \r\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\r\n if(our) {\r\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\r\n let status = '';\r\n if(isOutgoing) status = 'is-sending';\r\n else status = message.pFlags.unread || message.pFlags.is_scheduled ? 'is-sent' : 'is-read';\r\n bubble.classList.add(status);\r\n }\r\n\r\n const messageWithReplies = this.appMessagesManager.getMessageWithReplies(message);\r\n const withReplies = !!messageWithReplies && message.mid > 0;\r\n\r\n if(withReplies) {\r\n bubble.classList.add('with-replies');\r\n }\r\n\r\n const isOut = our && (!message.fwd_from || this.peerId !== rootScope.myId);\r\n let nameContainer: HTMLElement = bubbleContainer;\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 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(!message.viaBotId) {\r\n bubble.classList.add('hide-name'); \r\n }\r\n\r\n bubble.classList.add('photo');\r\n \r\n const storage = this.appMessagesManager.groupedMessagesStorage[message.grouped_id];\r\n if(message.grouped_id && storage.size !== 1 && albumMustBeRenderedFull) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n wrapAlbum({\r\n groupId: message.grouped_id, \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 noAutoDownload: this.chat.noAutoDownloadMedia,\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, \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 noAutoDownload: this.chat.noAutoDownloadMedia,\r\n });\r\n\r\n break;\r\n }\r\n \r\n case 'messageMediaWebPage': {\r\n processingWebPage = true;\r\n \r\n let webpage: WebPage = messageMedia.webpage;\r\n ////////this.log('messageMediaWebPage', webpage);\r\n if(webpage._ !== 'webPage') {\r\n break;\r\n } \r\n \r\n bubble.classList.add('webpage');\r\n \r\n let box = document.createElement('div');\r\n box.classList.add('web');\r\n \r\n let quote = document.createElement('div');\r\n quote.classList.add('quote');\r\n\r\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\r\n const photo: Photo.photo = webpage.photo as any;\r\n if(photo || webpage.document) {\r\n previewResizer = document.createElement('div');\r\n previewResizer.classList.add('preview-resizer');\r\n preview = document.createElement('div');\r\n preview.classList.add('preview');\r\n previewResizer.append(preview);\r\n }\r\n \r\n const doc = webpage.document as MyDocument;\r\n if(doc) {\r\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\r\n //if(doc.size <= 20e6) {\r\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\r\n if(doc.type === 'round') {\r\n bubble.classList.add('round');\r\n preview.classList.add('is-round');\r\n } else {\r\n bubble.classList.add('video');\r\n }\r\n wrapVideo({\r\n doc, \r\n container: preview, \r\n message, \r\n boxWidth: mediaSize.width,\r\n boxHeight: mediaSize.height,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n isOut,\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n });\r\n //}\r\n } else {\r\n const docDiv = wrapDocument({\r\n message,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n preview.append(docDiv);\r\n preview.classList.add('preview-with-document');\r\n //messageDiv.classList.add((webpage.type || 'document') + '-message');\r\n //doc = null;\r\n }\r\n }\r\n \r\n let quoteTextDiv = document.createElement('div');\r\n quoteTextDiv.classList.add('quote-text');\r\n\r\n if(previewResizer) {\r\n quoteTextDiv.append(previewResizer);\r\n }\r\n\r\n let t: HTMLElement;\r\n if(webpage.site_name) {\r\n const html = RichTextProcessor.wrapRichText(webpage.url);\r\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\r\n a.classList.add('webpage-name');\r\n setInnerHTML(a, RichTextProcessor.wrapEmojiText(webpage.site_name));\r\n quoteTextDiv.append(a);\r\n t = a;\r\n }\r\n\r\n if(webpage.rTitle) {\r\n let titleDiv = document.createElement('div');\r\n titleDiv.classList.add('title');\r\n setInnerHTML(titleDiv, webpage.rTitle);\r\n quoteTextDiv.append(titleDiv);\r\n t = titleDiv;\r\n }\r\n\r\n if(webpage.rDescription) {\r\n let textDiv = document.createElement('div');\r\n textDiv.classList.add('text');\r\n setInnerHTML(textDiv, webpage.rDescription);\r\n quoteTextDiv.append(textDiv);\r\n t = textDiv;\r\n }\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } else {\r\n box.classList.add('no-text');\r\n } */\r\n\r\n quote.append(quoteTextDiv);\r\n\r\n if(photo && !doc) {\r\n bubble.classList.add('photo');\r\n\r\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\r\n let isSquare = false;\r\n if(size.w === size.h && t) {\r\n bubble.classList.add('is-square-photo');\r\n isSquare = true;\r\n this.appPhotosManager.setAttachmentSize(photo, preview, 48, 48, false);\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } */\r\n } else if(size.h > size.w) {\r\n bubble.classList.add('is-vertical-photo');\r\n }\r\n\r\n wrapPhoto({\r\n photo, \r\n message, \r\n container: preview, \r\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width, \r\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n withoutPreloader: isSquare,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\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;\r\n\r\n //this.log('messageMediaDocument', doc, bubble);\r\n \r\n if(doc.sticker/* && doc.size <= 1e6 */) {\r\n bubble.classList.add('sticker');\r\n canHaveTail = false;\r\n isStandaloneMedia = true;\r\n \r\n if(doc.animated) {\r\n bubble.classList.add('sticker-animated');\r\n }\r\n \r\n const sizes = mediaSizes.active;\r\n const size = bubble.classList.contains('emoji-big') ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\r\n this.appPhotosManager.setAttachmentSize(doc, attachmentDiv, size.width, size.height);\r\n //let preloader = new ProgressivePreloader(attachmentDiv, false);\r\n bubbleContainer.style.height = attachmentDiv.style.height;\r\n bubbleContainer.style.width = attachmentDiv.style.width;\r\n //appPhotosManager.setAttachmentSize(doc, bubble);\r\n wrapSticker({\r\n doc, \r\n div: attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n emoji: bubble.classList.contains('emoji-big') ? messageMessage : undefined,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\r\n //this.log('never get free 2', doc);\r\n\r\n const isRound = doc.type === 'round';\r\n if(isRound) {\r\n isStandaloneMedia = true;\r\n }\r\n\r\n if(isRound || !messageMessage) {\r\n canHaveTail = false;\r\n }\r\n\r\n if(!message.viaBotId) {\r\n bubble.classList.add('hide-name');\r\n }\r\n \r\n bubble.classList.add(isRound ? 'round' : 'video');\r\n const storage = this.appMessagesManager.groupedMessagesStorage[message.grouped_id];\r\n if(message.grouped_id && storage.size !== 1 && albumMustBeRenderedFull) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n \r\n wrapAlbum({\r\n groupId: message.grouped_id, \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 noAutoDownload: this.chat.noAutoDownloadMedia,\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, \r\n boxWidth: mediaSizes.active.regular.width,\r\n boxHeight: mediaSizes.active.regular.height, \r\n withTail, \r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n searchContext: isRound ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\r\n threadId: this.chat.threadId,\r\n useSearch: !message.pFlags.is_scheduled,\r\n isScheduled: message.pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n }\r\n } else {\r\n const newNameContainer = wrapGroupedDocuments({\r\n albumMustBeRenderedFull,\r\n message,\r\n bubble,\r\n messageDiv,\r\n chat: this.chat,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\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.pFlags.is_scheduled,\r\n isScheduled: message.pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n\r\n if(newNameContainer) {\r\n nameContainer = newNameContainer;\r\n }\r\n\r\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document-size, .audio');\r\n lastContainer && lastContainer.append(timeSpan.cloneNode(true));\r\n\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 'messageMediaContact': {\r\n //this.log('wrapping contact', message);\r\n\r\n const contactDiv = document.createElement('div');\r\n contactDiv.classList.add('contact');\r\n contactDiv.dataset.peerId = '' + messageMedia.user_id;\r\n\r\n messageDiv.classList.add('contact-message');\r\n processingWebPage = true;\r\n\r\n const texts = [];\r\n if(message.media.first_name) texts.push(RichTextProcessor.wrapEmojiText(message.media.first_name));\r\n if(message.media.last_name) texts.push(RichTextProcessor.wrapEmojiText(message.media.last_name));\r\n\r\n contactDiv.innerHTML = `\r\n
\r\n
${texts.join(' ')}
\r\n
${message.media.phone_number ? '+' + formatPhoneNumber(message.media.phone_number).formatted : 'Unknown phone number'}
\r\n
`;\r\n\r\n const avatarElem = new AvatarElement();\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n avatarElem.setAttribute('peer', '' + message.media.user_id);\r\n avatarElem.classList.add('contact-avatar', 'avatar-54');\r\n\r\n contactDiv.prepend(avatarElem);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('contact-message');\r\n messageDiv.append(contactDiv);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaPoll': {\r\n bubble.classList.remove('is-message-empty');\r\n \r\n const pollElement = wrapPoll(message);\r\n messageDiv.prepend(pollElement);\r\n messageDiv.classList.add('poll-message');\r\n\r\n break;\r\n }\r\n \r\n default:\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.innerHTML = 'This message is currently not supported on Telegram Web. Try desktop.telegram.org';\r\n messageDiv.append(timeSpan);\r\n this.log.warn('unrecognized media type:', message.media._, message);\r\n break;\r\n }\r\n \r\n if(!processingWebPage) {\r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\r\n bubble.classList.add('no-tail');\r\n\r\n if(!bubble.classList.contains('with-media-tail')) {\r\n bubble.classList.add('use-border-radius');\r\n }\r\n } */\r\n }\r\n\r\n if(isStandaloneMedia) {\r\n bubble.classList.add('just-media');\r\n }\r\n\r\n if(this.chat.selection.isSelecting) {\r\n this.chat.selection.toggleElementCheckbox(bubble, true);\r\n }\r\n\r\n let savedFrom = '';\r\n \r\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\r\n const needName = (message.fromId !== rootScope.myId && this.appPeersManager.isAnyChat(peerId) && !this.appPeersManager.isBroadcast(peerId)) || message.viaBotId;\r\n if(needName || message.fwd_from || message.reply_to_mid) { // chat\r\n let title: HTMLElement | DocumentFragment;\r\n let titleVia: typeof title;\r\n\r\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === message.fwdFromId;\r\n \r\n let isHidden = message.fwd_from && !message.fwd_from.from_id && !message.fwd_from.channel_id;\r\n if(message.viaBotId) {\r\n titleVia = document.createElement('span');\r\n titleVia.innerText = '@' + this.appUsersManager.getUser(message.viaBotId).username;\r\n titleVia.classList.add('peer-title');\r\n bubble.classList.add('must-have-name');\r\n }\r\n \r\n if(isHidden) {\r\n ///////this.log('message to render hidden', message);\r\n title = document.createElement('span');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(message.fwd_from.from_name);\r\n title.classList.add('peer-title');\r\n //title = message.fwd_from.from_name;\r\n bubble.classList.add('hidden-profile');\r\n } else {\r\n title = new PeerTitle({peerId: message.fwdFromId || message.fromId}).element;\r\n }\r\n\r\n if(message.reply_to_mid && message.reply_to_mid !== this.chat.threadId) {\r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n bubbleContainer,\r\n message\r\n });\r\n }\r\n \r\n //this.log(title);\r\n \r\n let nameDiv: HTMLElement;\r\n if((message.fwdFromId || message.fwd_from)) {\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 = message.fwdFromId;\r\n\r\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\r\n nameDiv.style.color = this.appPeersManager.getPeerColorById(message.fwdFromId, false);\r\n nameDiv.append(title);\r\n } else {\r\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(message.fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\r\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\r\n const args: FormatterArguments = [title];\r\n if(isStandaloneMedia) {\r\n args.unshift(document.createElement('br'));\r\n }\r\n nameDiv.append(i18n('ForwardedFrom', [args]));\r\n }\r\n } else if(!message.viaBotId) {\r\n if(!isStandaloneMedia && needName) {\r\n nameDiv = document.createElement('div');\r\n nameDiv.append(title);\r\n\r\n if(!our) {\r\n nameDiv.style.color = this.appPeersManager.getPeerColorById(message.fromId, false);\r\n }\r\n\r\n nameDiv.dataset.peerId = message.fromId;\r\n } else /* if(!message.reply_to_mid) */ {\r\n bubble.classList.add('hide-name');\r\n }\r\n }\r\n\r\n if(message.viaBotId) {\r\n if(!nameDiv) {\r\n nameDiv = document.createElement('div');\r\n } else {\r\n nameDiv.append(' ');\r\n }\r\n\r\n const span = document.createElement('span');\r\n span.append(i18n('ViaBot'), ' ', titleVia);\r\n span.classList.add('is-via');\r\n\r\n nameDiv.append(span);\r\n }\r\n\r\n if(nameDiv) {\r\n nameDiv.classList.add('name');\r\n nameContainer.append(nameDiv);\r\n }\r\n\r\n const needAvatar = this.chat.isAnyGroup() && !isOut;\r\n if(needAvatar) {\r\n let avatarElem = new AvatarElement();\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n avatarElem.classList.add('user-avatar', 'avatar-40');\r\n avatarElem.loadPromises = loadPromises;\r\n\r\n if(!message.fwdFromId && message.fwd_from && message.fwd_from.from_name) {\r\n avatarElem.setAttribute('peer-title', /* '🔥 FF 🔥' */message.fwd_from.from_name);\r\n }\r\n\r\n avatarElem.setAttribute('peer', '' + (((message.fwd_from && (this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID)) || isForwardFromChannel ? message.fwdFromId : message.fromId) || NULL_PEER_ID));\r\n //avatarElem.update();\r\n \r\n //this.log('exec loadDialogPhoto', message);\r\n\r\n contentWrapper.append(avatarElem);\r\n }\r\n } else {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n savedFrom = `${this.chat.peerId}_${message.mid}`;\r\n }\r\n\r\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\r\n if(isThreadStarter) {\r\n bubble.classList.add('is-thread-starter', 'is-group-last');\r\n }\r\n\r\n if(savedFrom && (this.chat.type === 'pinned' || message.fwd_from.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\r\n const goto = document.createElement('div');\r\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\r\n bubbleContainer.append(goto);\r\n bubble.dataset.savedFrom = savedFrom;\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\r\n if(updatePosition) {\r\n this.renderMessagesQueue(message, bubble, reverse, loadPromises);\r\n }\r\n\r\n if(withReplies) {\r\n const isFooter = MessageRender.renderReplies({\r\n bubble,\r\n bubbleContainer,\r\n message: messageWithReplies,\r\n messageDiv,\r\n loadPromises,\r\n lazyLoadQueue: this.lazyLoadQueue\r\n });\r\n\r\n if(isFooter) {\r\n canHaveTail = true;\r\n }\r\n }\r\n\r\n if(canHaveTail) {\r\n bubble.classList.add('can-have-tail');\r\n\r\n bubbleContainer.append(generateTail());\r\n }\r\n\r\n return bubble;\r\n }\r\n\r\n private safeRenderMessage(message: any, reverse?: boolean, multipleRender?: boolean, bubble?: HTMLDivElement, updatePosition?: boolean) {\r\n try {\r\n return this.renderMessage(message, reverse, multipleRender, bubble, updatePosition);\r\n } catch(err) {\r\n this.log.error('renderMessage error:', err);\r\n }\r\n }\r\n\r\n public async performHistoryResult(history: number[], reverse: boolean, isBackLimit: boolean, additionMsgId?: number) {\r\n // commented bot getProfile in getHistory!\r\n // if(!history/* .filter((id: number) => id > 0) */.length) {\r\n // if(!isBackLimit) {\r\n // this.scrollable.loadedAll.top = true;\r\n\r\n // /* if(this.chat.type === 'discussion') {\r\n // const serviceStartMessageId = this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId + '_' + this.chat.threadId];\r\n // if(serviceStartMessageId) history.push(serviceStartMessageId);\r\n // history.push(this.chat.threadId);\r\n // } */\r\n // } else {\r\n // this.scrollable.loadedAll.bottom = true;\r\n // }\r\n // }\r\n\r\n history = history.slice(); // need\r\n\r\n if(additionMsgId) {\r\n history.unshift(additionMsgId);\r\n }\r\n\r\n /* if(testScroll && additionMsgID) {\r\n for(let i = 0; i < 3; ++i) {\r\n let _history = history.slice();\r\n setTimeout(() => {\r\n this.performHistoryResult(_history, reverse, isBackLimit, 0, resetPromises);\r\n }, 0);\r\n }\r\n } */\r\n\r\n //console.time('appImManager render history');\r\n\r\n //await new Promise((resolve) => setTimeout(resolve, 1e3));\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: will render some messages:', history.length, this.isHeavyAnimationInProgress, this.messagesQueuePromise);\r\n } */\r\n\r\n //const padding = 10000;\r\n //const realLength = this.scrollable.container.childElementCount;\r\n let previousScrollHeightMinusTop: number/* , previousScrollHeight: number */;\r\n //if(realLength > 0/* && (reverse || isSafari) */) { // for safari need set when scrolling bottom too\r\n //if(!this.scrollable.isHeavyScrolling) {\r\n this.messagesQueueOnRender = () => {\r\n const {scrollTop, scrollHeight} = this.scrollable;\r\n\r\n //previousScrollHeight = scrollHeight;\r\n //previousScrollHeight = scrollHeight + padding;\r\n previousScrollHeightMinusTop = reverse ? scrollHeight - scrollTop : scrollTop;\r\n\r\n //this.chatInner.style.paddingTop = padding + 'px';\r\n /* if(reverse) {\r\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\r\n } else {\r\n previousScrollHeightMinusTop = scrollTop;\r\n } */\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: messagesQueueOnRender, scrollTop:', scrollTop, scrollHeight, previousScrollHeightMinusTop);\r\n } */\r\n this.messagesQueueOnRender = undefined;\r\n };\r\n //}\r\n //}\r\n\r\n if(this.needReflowScroll) {\r\n reflowScrollableElement(this.scrollable.container);\r\n this.needReflowScroll = false;\r\n }\r\n\r\n const cb = (mid: number) => {\r\n const message = this.chat.getMessage(mid);\r\n if(message.id > 0) {\r\n this.safeRenderMessage(message, reverse, true);\r\n } else {\r\n this.processLocalMessageRender(message);\r\n }\r\n };\r\n\r\n const length = history.length;\r\n if(reverse) for(let i = 0; i < length; ++i) cb(history[i]);\r\n else for(let i = length - 1; i >= 0; --i) cb(history[i]);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n const firstSlice = historyStorage.history.first;\r\n const lastSlice = historyStorage.history.last;\r\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\r\n this.setLoaded('bottom', true, false);\r\n }\r\n \r\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\r\n this.setLoaded('top', true, false);\r\n }\r\n } else {\r\n this.setLoaded('top', true);\r\n this.setLoaded('bottom', true);\r\n }\r\n\r\n await this.messagesQueuePromise;//.then(() => new Promise(resolve => setTimeout(resolve, 100)))\r\n\r\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n }\r\n\r\n if(previousScrollHeightMinusTop !== undefined) {\r\n /* const scrollHeight = this.scrollable.scrollHeight;\r\n const addedHeight = scrollHeight - previousScrollHeight;\r\n \r\n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\r\n /* const scrollHeight = this.scrollable.scrollHeight;\r\n const addedHeight = scrollHeight - previousScrollHeight;\r\n \r\n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\r\n \r\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n this.log('performHistoryResult: will set scrollTop', \r\n previousScrollHeightMinusTop, this.scrollable.scrollHeight, \r\n newScrollTop, this.scrollable.container.clientHeight); */\r\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n const newScrollTop = reverse ? this.scrollable.scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n \r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\r\n } */\r\n\r\n // touchSupport for safari iOS\r\n //isTouchSupported && isApple && (this.scrollable.container.style.overflow = 'hidden');\r\n this.scrollable.scrollTop = newScrollTop;\r\n //this.scrollable.scrollTop = this.scrollable.scrollHeight;\r\n //isTouchSupported && isApple && (this.scrollable.container.style.overflow = '');\r\n\r\n if(IS_SAFARI/* && !isAppleMobile */) { // * fix blinking and jumping\r\n reflowScrollableElement(this.scrollable.container);\r\n }\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, this.scrollable.scrollTop, this.scrollable.scrollHeight, this.isHeavyAnimationInProgress);\r\n } */\r\n }\r\n\r\n return true;\r\n }\r\n\r\n onDatePick = (timestamp: number) => {\r\n const peerId = this.peerId;\r\n this.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then(history => {\r\n if(!history?.messages?.length) {\r\n this.log.error('no history!');\r\n return;\r\n } else if(this.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\r\n //console.log('got history date:', history);\r\n });\r\n };\r\n\r\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\r\n //const middleware = this.getMiddleware();\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n return this.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\r\n } else if(this.chat.type === 'pinned') {\r\n const promise = this.appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId, \r\n limit: loadCount, \r\n backLimit\r\n })\r\n .then(value => ({history: value.history.map(m => m.mid)}));\r\n\r\n return promise;\r\n } else if(this.chat.type === 'scheduled') {\r\n return this.appMessagesManager.getScheduledMessages(this.peerId).then(mids => {\r\n // this.setLoaded('top', true);\r\n // this.setLoaded('bottom', true);\r\n return {history: mids.slice().reverse()};\r\n });\r\n }\r\n }\r\n\r\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\r\n /* const middleware = this.getMiddleware();\r\n await this.ladderDeferred; */\r\n\r\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\r\n // @ts-ignore\r\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n return;\r\n }\r\n\r\n /* if(!middleware()) {\r\n return;\r\n } */\r\n\r\n if(!Object.keys(this.bubbles).length) {\r\n return;\r\n }\r\n\r\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n\r\n if(isAdditionRender && additionMsgIds.length) {\r\n sortedMids = sortedMids.filter(mid => !additionMsgIds.includes(mid));\r\n }\r\n\r\n let targetMid: number;\r\n if(backLimit) {\r\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\r\n } else {\r\n if(additionMsgId) {\r\n targetMid = additionMsgId;\r\n } else { // * if maxId === 0\r\n targetMid = Math.max(...sortedMids);\r\n }\r\n }\r\n\r\n const topIds = sortedMids.slice(sortedMids.findIndex(mid => targetMid > mid));\r\n const middleIds = isAdditionRender ? [] : [targetMid];\r\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex(mid => targetMid >= mid)).reverse();\r\n \r\n if(DEBUG) {\r\n this.log('getHistory: targeting mid:', targetMid, maxId, additionMsgId, \r\n topIds.map(m => this.appMessagesIdsManager.getServerMessageId(m)), \r\n bottomIds.map(m => this.appMessagesIdsManager.getServerMessageId(m)));\r\n }\r\n\r\n const setBubbles: HTMLElement[] = [];\r\n\r\n this.chatInner.classList.add('zoom-fading');\r\n const delay = isAdditionRender ? 10 : 40;\r\n const offsetIndex = isAdditionRender ? 0 : 1;\r\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\r\n const animationPromise = deferredPromise();\r\n let lastMsDelay = 0;\r\n mids.forEach((mid, idx) => {\r\n if(!this.bubbles[mid] || this.skippedMids.has(mid)) {\r\n this.log.warn('animateAsLadder: no bubble by mid:', mid);\r\n return;\r\n }\r\n\r\n const contentWrapper = this.bubbles[mid].lastElementChild as HTMLElement;\r\n\r\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\r\n //lastMsDelay = (idx + offsetIndex) * delay;\r\n //lastMsDelay = (idx || 0.1) * 1000;\r\n \r\n contentWrapper.classList.add('zoom-fade');\r\n contentWrapper.style.transitionDelay = lastMsDelay + 'ms';\r\n\r\n if(idx === (mids.length - 1)) {\r\n const onTransitionEnd = (e: TransitionEvent) => {\r\n if(e.target !== contentWrapper) {\r\n return;\r\n }\r\n\r\n animationPromise.resolve();\r\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\r\n };\r\n\r\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\r\n }\r\n \r\n //this.log('supa', bubble);\r\n\r\n setBubbles.push(contentWrapper);\r\n });\r\n\r\n if(!mids.length) {\r\n animationPromise.resolve();\r\n }\r\n\r\n return {lastMsDelay, animationPromise};\r\n };\r\n\r\n const topRes = animateAsLadder(topIds, offsetIndex);\r\n const middleRes = animateAsLadder(middleIds);\r\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\r\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\r\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\r\n\r\n if(this.onAnimateLadder) {\r\n await this.onAnimateLadder();\r\n }\r\n\r\n // fastRaf(() => {\r\n fastRaf(() => {\r\n setBubbles.forEach(contentWrapper => {\r\n contentWrapper.classList.remove('zoom-fade');\r\n });\r\n });\r\n // });\r\n\r\n let promise: Promise;\r\n if(topIds.length || middleIds.length || bottomIds.length) {\r\n promise = Promise.all(promises);\r\n\r\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\r\n .then(() => { \r\n fastRaf(() => {\r\n setBubbles.forEach(contentWrapper => {\r\n contentWrapper.style.transitionDelay = '';\r\n });\r\n\r\n this.chatInner.classList.remove('zoom-fading');\r\n });\r\n\r\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх, \r\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\r\n if(!IS_SAFARI) {\r\n this.needReflowScroll = true;\r\n }\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private renderEmptyPlaceholder(type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting', bubble: HTMLElement, message: any, elements: (Node | string)[]) {\r\n const BASE_CLASS = 'empty-bubble-placeholder';\r\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\r\n\r\n let title: HTMLElement; \r\n if(type === 'group') title = i18n('GroupEmptyTitle1');\r\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\r\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\r\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\r\n 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 this.messagesQueue.findAndSplice(q => q.bubble === bubble);\r\n\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\r\n\r\n const middleware = this.getMiddleware();\r\n \r\n const loadPromise = this.appStickersManager.getGreetingSticker().then(doc => {\r\n if(!middleware()) return;\r\n\r\n const loadPromises: Promise[] = [];\r\n wrapSticker({\r\n doc, \r\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\r\n div: stickerDiv,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n\r\n attachClickEvent(stickerDiv, (e) => {\r\n cancelEvent(e);\r\n EmoticonsDropdown.onMediaClick({target: e.target});\r\n });\r\n\r\n return Promise.all(loadPromises);\r\n });\r\n\r\n this.renderMessagesQueue(message, bubble, false, [loadPromise]);\r\n\r\n elements.push(subtitle, stickerDiv);\r\n }\r\n\r\n if(listElements) {\r\n elements.push(\r\n ...listElements.map(elem => {\r\n const span = document.createElement('span');\r\n span.classList.add(BASE_CLASS + '-list-item');\r\n span.append(elem);\r\n return span;\r\n })\r\n );\r\n \r\n if(type === 'group') {\r\n listElements.forEach(elem => {\r\n const i = document.createElement('span');\r\n i.classList.add('tgico-check');\r\n elem.prepend(i);\r\n });\r\n } else if(type === 'saved') {\r\n listElements.forEach(elem => {\r\n const i = document.createElement('span');\r\n i.classList.add(BASE_CLASS + '-list-bullet');\r\n i.innerText = '•';\r\n elem.prepend(i);\r\n });\r\n }\r\n }\r\n\r\n if(elements.length > 1) {\r\n bubble.classList.add('has-description');\r\n }\r\n\r\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\r\n }\r\n\r\n private processLocalMessageRender(message: Message.message | Message.messageService) {\r\n const bubble = this.safeRenderMessage(message, undefined, undefined, undefined, false);\r\n bubble.classList.add('bubble-first', 'is-group-last', 'is-group-first');\r\n bubble.classList.remove('can-have-tail', 'is-in');\r\n\r\n const messageDiv = bubble.querySelector('.message, .service-msg');\r\n const elements: (Node | string)[] = [];\r\n const isBot = this.appPeersManager.isBot(this.peerId);\r\n if(isBot && message._ === 'message') {\r\n const b = document.createElement('b');\r\n b.append(i18n('BotInfoTitle'));\r\n elements.push(b, '\\n\\n');\r\n } else if(this.appPeersManager.isAnyGroup(this.peerId) && this.appPeersManager.getPeer(this.peerId).pFlags.creator) {\r\n this.renderEmptyPlaceholder('group', bubble, message, elements);\r\n } else if(this.chat.type === 'scheduled') {\r\n this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\r\n } else if(rootScope.myId === this.peerId) {\r\n this.renderEmptyPlaceholder('saved', bubble, message, elements);\r\n } else if(this.appPeersManager.isUser(this.peerId) && !isBot && this.appMessagesManager.canSendToPeer(this.peerId) && this.chat.type === 'chat') {\r\n this.renderEmptyPlaceholder('greeting', bubble, message, elements);\r\n } else {\r\n this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\r\n }\r\n\r\n /* for(let i = 1; i < elements.length; i += 2) {\r\n elements.splice(i, 0, '\\n');\r\n } */\r\n\r\n messageDiv.prepend(...elements);\r\n \r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.onAnimateLadder = () => {\r\n this.chatInner.prepend(bubble);\r\n this.onAnimateLadder = undefined;\r\n\r\n // need raf here because animation won't fire if this message is single\r\n if(!this.messagesQueuePromise) {\r\n return fastRafPromise();\r\n }\r\n };\r\n } else {\r\n this.chatInner.prepend(bubble);\r\n }\r\n\r\n this.emptyPlaceholderMid = message.mid;\r\n }\r\n\r\n private generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void): GenerateLocalMessageType {\r\n const offset = this.appMessagesIdsManager.generateMessageId(this.chat.type === 'scheduled' ? -1 : 0);\r\n\r\n const message: Omit & {message?: string} = {\r\n _: service ? 'messageService' : 'message',\r\n date: 0,\r\n id: -(+this.peerId + offset),\r\n peer_id: this.appPeersManager.getOutputPeer(this.peerId),\r\n pFlags: {}\r\n };\r\n\r\n if(!service) {\r\n message.message = '';\r\n }\r\n\r\n assumeType>(message);\r\n\r\n fill && fill(message);\r\n\r\n this.appMessagesManager.saveMessages([message]);\r\n return message;\r\n }\r\n\r\n private setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\r\n const willChange = this.scrollable.loadedAll[side] !== value;\r\n if(!willChange) {\r\n return;\r\n }\r\n\r\n this.scrollable.loadedAll[side] = value;\r\n\r\n /* if(!checkPlaceholders) {\r\n return;\r\n } */\r\n\r\n if(side === 'top' && value && this.appPeersManager.isBot(this.peerId)) {\r\n this.log('inject bot description');\r\n\r\n const middleware = this.getMiddleware();\r\n return this.appProfileManager.getProfile(this.peerId.toUserId()).then(userFull => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!userFull.bot_info?.description) {\r\n this.checkIfEmptyPlaceholderNeeded();\r\n return;\r\n }\r\n\r\n const message = this.generateLocalFirstMessage(false, message => {\r\n message.message = userFull.bot_info.description;\r\n });\r\n\r\n this.processLocalMessageRender(message);\r\n });\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n public checkIfEmptyPlaceholderNeeded() {\r\n if(this.scrollable.loadedAll.top && \r\n this.scrollable.loadedAll.bottom && \r\n this.emptyPlaceholderMid === undefined && \r\n (\r\n !this.appMessagesManager.getHistoryStorage(this.peerId).count || \r\n (\r\n Object.keys(this.bubbles).length && \r\n !this.getRenderedLength()\r\n ) ||\r\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\r\n )\r\n ) {\r\n this.log('inject empty peer placeholder');\r\n\r\n const message = this.generateLocalFirstMessage(true);\r\n this.processLocalMessageRender(message);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Load and render history\r\n * @param maxId max message id\r\n * @param reverse 'true' means up\r\n * @param isBackLimit is search\r\n * @param additionMsgId for the last message\r\n * @param justLoad do not render\r\n */\r\n public getHistory(maxId = 0, reverse = false, isBackLimit = false, additionMsgId = 0, justLoad = false): {cached: boolean, promise: Promise} {\r\n const peerId = this.peerId;\r\n\r\n //console.time('appImManager call getHistory');\r\n const pageCount = Math.min(30, windowSize.height / 38/* * 1.25 */ | 0);\r\n //const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\r\n const realLoadCount = Object.keys(this.bubbles).length > 0/* || additionMsgId */ ? Math.max(40, pageCount) : pageCount;//const realLoadCount = 50;\r\n //const realLoadCount = pageCount;//const realLoadCount = 50;\r\n let loadCount = realLoadCount;\r\n \r\n /* if(TEST_SCROLL) {\r\n //loadCount = 1;\r\n if(Object.keys(this.bubbles).length > 0)\r\n return {cached: false, promise: Promise.resolve(true)};\r\n } */\r\n if(TEST_SCROLL !== undefined) {\r\n if(TEST_SCROLL) {\r\n if(Object.keys(this.bubbles).length > 0) {\r\n --TEST_SCROLL;\r\n }\r\n } else {\r\n return {cached: false, promise: Promise.resolve(true)};\r\n }\r\n }\r\n \r\n ////console.time('render history total');\r\n \r\n let backLimit = 0;\r\n if(isBackLimit) {\r\n backLimit = loadCount;\r\n\r\n if(!reverse) { // if not jump\r\n loadCount = 0;\r\n //maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\r\n }\r\n }\r\n\r\n let additionMsgIds: number[];\r\n if(additionMsgId && !isBackLimit) {\r\n if(this.chat.type === 'pinned') {\r\n additionMsgIds = [additionMsgId];\r\n } else {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const slice = historyStorage.history.slice;\r\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\r\n additionMsgIds = slice.slice();\r\n\r\n // * filter last album, because we don't know is it the last item\r\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\r\n const message = this.chat.getMessage(additionMsgIds[i]);\r\n if(message.grouped_id) additionMsgIds.splice(i, 1);\r\n else break;\r\n }\r\n\r\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\r\n }\r\n }\r\n }\r\n\r\n /* const result = additionMsgID ? \r\n {history: [additionMsgID]} : \r\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\r\n let result: ReturnType | {history: number[]} = this.requestHistory(maxId, loadCount, backLimit) as any;\r\n let resultPromise: Promise;\r\n\r\n //const isFirstMessageRender = !!additionMsgID && result instanceof Promise && !appMessagesManager.getMessage(additionMsgID).grouped_id;\r\n const isAdditionRender = additionMsgIds?.length && result instanceof Promise;\r\n const isFirstMessageRender = (this.isFirstLoad && backLimit && result instanceof Promise) || isAdditionRender;\r\n if(isAdditionRender) {\r\n resultPromise = result as Promise;\r\n result = {history: additionMsgIds};\r\n //additionMsgID = 0;\r\n }\r\n\r\n this.isFirstLoad = false;\r\n\r\n const processResult = async(historyResult: typeof result) => {\r\n if('offsetIdOffset' in historyResult && historyResult.history.isEnd(SliceEnd.Top)) {\r\n if(this.chat.type === 'discussion') { // * inject discussion start\r\n //this.log('discussion got history', loadCount, backLimit, historyResult, isTopEnd);\r\n const serviceStartMessageId = this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId + '_' + this.chat.threadId];\r\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\r\n historyResult.history.push(...this.chat.getMidsByMid(this.chat.threadId).reverse());\r\n }\r\n\r\n await this.setLoaded('top', true);\r\n }\r\n };\r\n\r\n const sup = (result: HistoryResult) => {\r\n /* if(maxId && result.history?.length) {\r\n if(this.bubbles[maxId]) {\r\n result.history.findAndSplice(mid => mid === maxId); \r\n }\r\n } */\r\n\r\n ////console.timeEnd('render history total');\r\n \r\n return getHeavyAnimationPromise().then(() => {\r\n return processResult(result);\r\n }).then(() => {\r\n return this.performHistoryResult(result.history || [], reverse, isBackLimit, !isAdditionRender && additionMsgId);\r\n });\r\n };\r\n\r\n const processPromise = (result: Promise) => {\r\n const promise = result.then((result) => {\r\n //this.log('getHistory not cached result by maxId:', maxId, reverse, isBackLimit, result, peerId, justLoad);\r\n\r\n if(reverse ? this.getHistoryTopPromise !== promise : this.getHistoryBottomPromise !== promise) {\r\n this.log.warn('getHistory: peer changed');\r\n ////console.timeEnd('render history total');\r\n return Promise.reject();\r\n }\r\n\r\n if(justLoad) {\r\n this.scrollable.onScroll(); // нужно делать из-за ранней прогрузки\r\n return true;\r\n }\r\n //console.timeEnd('appImManager call getHistory');\r\n\r\n return sup(result);\r\n }, (err) => {\r\n this.log.error('getHistory error:', err);\r\n throw err;\r\n });\r\n \r\n return promise;\r\n };\r\n\r\n let promise: Promise, cached: boolean;\r\n if(result instanceof Promise) {\r\n cached = false;\r\n promise = processPromise(result);\r\n } else if(justLoad) {\r\n return null;\r\n } else {\r\n cached = true;\r\n //this.log('getHistory cached result by maxId:', maxId, reverse, isBackLimit, result, peerId, justLoad);\r\n promise = sup(result as HistoryResult);\r\n //return (reverse ? this.getHistoryTopPromise = promise : this.getHistoryBottomPromise = promise);\r\n //return this.performHistoryResult(result.history || [], reverse, isBackLimit, additionMsgID, true);\r\n }\r\n\r\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\r\n\r\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\r\n let times = isAdditionRender ? 2 : 1;\r\n this.messagesQueueOnRenderAdditional = () => {\r\n this.log('ship went past rocks of magnets');\r\n\r\n if(--times) return;\r\n\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n \r\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n (promise || Promise.resolve()).then(() => {\r\n setTimeout(() => { // preload messages\r\n this.loadMoreHistory(reverse, true);\r\n }, 0);\r\n });\r\n };\r\n } else {\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n }\r\n\r\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\r\n waitPromise.then(() => {\r\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\r\n });\r\n\r\n if(justLoad) {\r\n return null;\r\n }\r\n\r\n /* false && */!isFirstMessageRender && promise.then(() => {\r\n if(reverse) {\r\n this.loadedTopTimes++;\r\n this.loadedBottomTimes = Math.max(0, --this.loadedBottomTimes);\r\n } else {\r\n this.loadedBottomTimes++;\r\n this.loadedTopTimes = Math.max(0, --this.loadedTopTimes);\r\n }\r\n\r\n let ids: number[];\r\n if((reverse && this.loadedTopTimes > 2) || (!reverse && this.loadedBottomTimes > 2)) {\r\n ids = getObjectKeysAndSort(this.bubbles);\r\n }\r\n\r\n //let removeCount = loadCount / 2;\r\n const safeCount = realLoadCount * 2; // cause i've been runningrunningrunning all day\r\n //this.log('getHistory: slice loadedTimes:', reverse, pageCount, this.loadedTopTimes, this.loadedBottomTimes, ids?.length, safeCount);\r\n if(ids && ids.length > safeCount) {\r\n if(reverse) {\r\n //ids = ids.slice(-removeCount);\r\n //ids = ids.slice(removeCount * 2);\r\n ids = ids.slice(safeCount);\r\n this.setLoaded('bottom', false);\r\n\r\n //this.log('getHistory: slice bottom messages:', ids.length, loadCount);\r\n //this.getHistoryBottomPromise = undefined; // !WARNING, это нужно для обратной загрузки истории, если запрос словил флуд\r\n } else {\r\n //ids = ids.slice(0, removeCount);\r\n //ids = ids.slice(0, ids.length - (removeCount * 2));\r\n ids = ids.slice(0, ids.length - safeCount);\r\n this.setLoaded('top', false);\r\n\r\n //this.log('getHistory: slice up messages:', ids.length, loadCount);\r\n //this.getHistoryTopPromise = undefined; // !WARNING, это нужно для обратной загрузки истории, если запрос словил флуд\r\n }\r\n\r\n //this.log('getHistory: will slice ids:', ids, reverse);\r\n\r\n this.deleteMessagesByIds(ids, false);\r\n }\r\n });\r\n\r\n promise.then(() => {\r\n // preload more\r\n //if(!isFirstMessageRender) {\r\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\r\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\r\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\r\n setTimeout(() => {\r\n if(reverse) {\r\n this.loadMoreHistory(true, true);\r\n } else {\r\n this.loadMoreHistory(false, true);\r\n }\r\n }, 0);\r\n //}\r\n }\r\n //}\r\n });\r\n\r\n return {cached, promise};\r\n }\r\n\r\n public setUnreadDelimiter() {\r\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\r\n return;\r\n }\r\n\r\n if(this.attachedUnreadBubble) {\r\n return;\r\n }\r\n\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n let readMaxId = this.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\r\n if(!readMaxId) return;\r\n\r\n readMaxId = Object.keys(this.bubbles)\r\n .filter(mid => !this.bubbles[mid].classList.contains('is-out'))\r\n .map(i => +i)\r\n .sort((a, b) => a - b)\r\n .find(i => i > readMaxId);\r\n\r\n if(readMaxId && this.bubbles[readMaxId]) {\r\n let bubble = this.bubbles[readMaxId];\r\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\r\n this.firstUnreadBubble.classList.remove('is-first-unread');\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n if(readMaxId !== historyStorage.maxId) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n this.firstUnreadBubble = bubble;\r\n this.attachedUnreadBubble = true;\r\n }\r\n }\r\n\r\n public deleteEmptyDateGroups() {\r\n const mustBeCount = 1 + +!!this.stickyIntersector;\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 }\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n}\r\n\r\nexport function generateTail() {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\r\n svg.setAttributeNS(null, 'width', '11');\r\n svg.setAttributeNS(null, 'height', '20');\r\n svg.classList.add('bubble-tail');\r\n\r\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\r\n use.setAttributeNS(null, 'href', '#message-tail-filled');\r\n\r\n svg.append(use);\r\n\r\n return svg;\r\n}\r\n","export const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { FormatterArguments, LangPackKey } from \"../../lib/langPack\";\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class PopupPinMessage {\n constructor(peerId: PeerId, mid: number, unpin?: true, onConfirm?: () => void) {\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments, \n buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const canUnpin = appPeersManager.canPinMessage(peerId);\n\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, oneSide?: boolean, silent?: boolean) => {\n setTimeout(() => { // * костыль, потому что document.elementFromPoint вернёт popup-peer пока он будет закрываться\n let promise: Promise;\n if(unpin && !mid) {\n if(canUnpin) {\n promise = appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = appMessagesManager.updatePinnedMessage(peerId, mid, unpin, silent, oneSide);\n }\n\n if(onConfirm) {\n promise.then(onConfirm);\n }\n }, 300);\n };\n\n if(unpin) {\n let buttonText: LangPackKey = 'UnpinMessage';\n if(!mid) {\n if(canUnpin) {\n title = 'Popup.Unpin.AllTitle';\n description = 'Chat.UnpinAllMessagesConfirmation';\n descriptionArgs = ['' + (appMessagesManager.pinnedMessages[peerId]?.count || 1)];\n } else {\n title = 'Popup.Unpin.HideTitle';\n description = 'Popup.Unpin.HideDescription';\n buttonText = 'Popup.Unpin.Hide';\n }\n } else {\n title = 'UnpinMessageAlertTitle';\n description = 'Chat.Confirm.Unpin';\n }\n \n buttons.push({\n langKey: buttonText,\n isDanger: true,\n callback\n });\n } else {\n title = 'PinMessageAlertTitle';\n const pinButtonText: LangPackKey = 'PinMessage';\n \n if(peerId.isAnyChat()) {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, false, !checked.size)\n });\n\n if(appChatsManager.isBroadcast(peerId.toChatId())) {\n description = 'PinMessageAlertChannel';\n } else {\n description = 'PinMessageAlert';\n \n checkboxes.push({\n text: 'PinNotify',\n checked: true\n });\n }\n } else {\n description = 'PinMessageAlertChat';\n\n if(peerId === rootScope.myId) {\n buttons.push({\n langKey: pinButtonText,\n callback\n });\n } else {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, !checked.size)\n });\n\n checkboxes.push({\n text: 'PinAlsoFor',\n textArgs: [new PeerTitle({peerId}).element],\n checked: true\n });\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function isSelectionEmpty(selection = window.getSelection()) {\r\n if(!selection || !selection.rangeCount) {\r\n return true;\r\n }\r\n\r\n const selectionRange = selection.getRangeAt(0);\r\n if(!selectionRange.toString() || !selectionRange.START_TO_END) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { ReportReason } from \"../../layer\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\nimport InputField from \"../inputField\";\nimport { toastNew } from \"../toast\";\nimport { wrapSticker } from \"../wrappers\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupReportMessagesConfirm extends PopupPeer {\n public static STICKER_EMOJI = '👮‍♀️';\n constructor(peerId: PeerId, mids: number[], reason: ReportReason['_'], onConfirm?: () => void) {\n super('popup-report-messages-confirm', {\n noTitle: true, \n descriptionLangKey: 'ReportInfo', \n buttons: [{\n langKey: 'ReportChat',\n callback: () => {\n if(!inputField.isValid()) {\n return;\n }\n\n onConfirm && onConfirm();\n appMessagesManager.reportMessages(peerId, mids, reason, inputField.value).then(bool => {\n if(!bool) return;\n\n toastNew({\n langPackKey: 'ReportSentInfo'\n });\n });\n }\n }], \n body: true\n });\n\n const div = document.createElement('div');\n const doc = appStickersManager.getAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n const size = 100;\n wrapSticker({\n doc,\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size,\n loop: false,\n play: true\n }).finally(() => {\n this.show();\n });\n\n this.header.append(div);\n\n const inputField = new InputField({\n label: 'ReportHint',\n maxLength: 512,\n placeholder: 'ReportChatDescription'\n });\n\n inputField.input.addEventListener('input', () => {\n this.buttons[0].element.toggleAttribute('disabled', !inputField.isValid());\n });\n\n this.body.append(inputField.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport { ReportReason } from \"../../layer\";\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport Button from \"../button\";\nimport PopupPeer from \"./peer\";\nimport PopupReportMessagesConfirm from \"./reportMessagesConfirm\";\n\nexport default class PopupReportMessages extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-report-messages', {titleLangKey: 'ChatTitle.ReportMessages', buttons: [], body: true});\n\n mids = mids.slice();\n\n const buttons: [LangPackKey, ReportReason['_']][] = [\n ['ReportChatSpam', 'inputReportReasonSpam'],\n ['ReportChatViolence', 'inputReportReasonViolence'],\n ['ReportChatChild', 'inputReportReasonChildAbuse'],\n ['ReportChatPornography', 'inputReportReasonPornography'],\n ['ReportChatOther', 'inputReportReasonOther']\n ];\n\n const className = 'btn-primary btn-transparent';\n buttons.forEach(b => {\n const button = Button(className, {/* icon: 'edit', */text: b[0]});\n this.body.append(button);\n });\n\n const preloadStickerPromise = appStickersManager.preloadAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n\n attachClickEvent(this.body, (e) => {\n const target = findUpClassName(e.target, 'btn-primary');\n const reason = buttons[whichChild(target)][1];\n\n preloadStickerPromise.then(() => {\n this.hide();\n\n new PopupReportMessagesConfirm(peerId, mids, reason, onConfirm);\n });\n }, {listenerSetter: this.listenerSetter});\n \n this.body.style.margin = '0 -1rem';\n this.buttonsEl.style.marginTop = '.5rem';\n\n this.show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type { AppPollsManager } from \"../../lib/appManagers/appPollsManager\";\r\nimport type { AppDocsManager, MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../misc\";\r\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport { copyTextToClipboard } from \"../../helpers/clipboard\";\r\nimport PopupSendNow from \"../popups/sendNow\";\r\nimport { toast } from \"../toast\";\r\nimport I18n, { 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 } from \"../../layer\";\r\nimport PopupReportMessages from \"../popups/reportMessages\";\r\n\r\nexport default class ChatContextMenu {\r\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean, notDirect?: () => boolean, withSelection?: true})[];\r\n private element: HTMLElement;\r\n\r\n private isSelectable: boolean;\r\n private isSelected: boolean;\r\n private target: HTMLElement;\r\n private isTargetAGroupedItem: boolean;\r\n private isTextSelected: boolean;\r\n private isAnchorTarget: boolean;\r\n private isUsernameTarget: boolean;\r\n private peerId: PeerId;\r\n private mid: number;\r\n private message: any;\r\n\r\n constructor(private attachTo: HTMLElement, \r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appPeersManager: AppPeersManager, \r\n private appPollsManager: AppPollsManager,\r\n private appDocsManager: AppDocsManager,\r\n private appMessagesIdsManager: AppMessagesIdsManager\r\n ) {\r\n const onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\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 if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\r\n if(this.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 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(chat.selection.isSelecting && !contentWrapper) {\r\n const mids = this.chat.getMidsByMid(mid);\r\n if(mids.length > 1) {\r\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ? \r\n mid : \r\n mids.find(mid => this.chat.selection.isMidSelected(this.peerId, mid));\r\n if(selectedMid) {\r\n mid = selectedMid;\r\n }\r\n }\r\n }\r\n\r\n const groupedItem = findUpClassName(this.target, 'grouped-item');\r\n this.isTargetAGroupedItem = !!groupedItem;\r\n if(groupedItem) {\r\n this.mid = +groupedItem.dataset.mid;\r\n } else {\r\n this.mid = mid;\r\n }\r\n\r\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\r\n this.message = this.chat.getMessage(this.mid);\r\n\r\n this.buttons.forEach(button => {\r\n let good: boolean;\r\n\r\n //if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\r\n if(chat.selection.isSelecting && !button.withSelection) {\r\n good = false;\r\n } else {\r\n good = contentWrapper || IS_TOUCH_SUPPORTED || true ? \r\n button.verify() : \r\n button.notDirect && button.verify() && button.notDirect();\r\n }\r\n\r\n button.element.classList.toggle('hide', !good);\r\n });\r\n\r\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\r\n //bubble.parentElement.append(this.element);\r\n //appImManager.log('contextmenu', e, bubble, side);\r\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, side);\r\n openBtnMenu(this.element, () => {\r\n this.mid = 0;\r\n this.peerId = undefined;\r\n this.target = null;\r\n });\r\n };\r\n\r\n if(IS_TOUCH_SUPPORTED/* && false */) {\r\n attachClickEvent(attachTo, (e) => {\r\n if(chat.selection.isSelecting) {\r\n return;\r\n }\r\n\r\n const className = (e.target as HTMLElement).className;\r\n if(!className || !className.includes) return;\r\n\r\n chat.log('touchend', e);\r\n\r\n const good = ['bubble', 'bubble-content-wrapper', 'bubble-content', 'message', 'time', 'inner'].find(c => className.match(new RegExp(c + '($|\\\\s)')));\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 onContextMenu(e);\r\n }\r\n }, {listenerSetter: this.chat.bubbles.listenerSetter});\r\n } else attachContextMenuListener(attachTo, onContextMenu, this.chat.bubbles.listenerSetter);\r\n }\r\n\r\n private init() {\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 this.appMessagesManager.editMessage(this.message, this.message.message, {\r\n scheduleDate: this.chat.input.scheduleDate,\r\n entities: this.message.entities\r\n });\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }, new Date(this.message.date * 1000));\r\n },\r\n verify: () => this.chat.type === 'scheduled'\r\n }, {\r\n icon: 'reply',\r\n text: 'Reply',\r\n onClick: this.onReplyClick,\r\n verify: () => this.appMessagesManager.canSendToPeer(this.peerId, this.chat.threadId) && \r\n !this.message.pFlags.is_outgoing && \r\n !!this.chat.input.messageInput && \r\n this.chat.type !== 'scheduled'/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'edit',\r\n text: 'Edit',\r\n onClick: this.onEditClick,\r\n verify: () => this.appMessagesManager.canEditMessage(this.message, 'text') && !!this.chat.input.messageInput\r\n }, {\r\n icon: 'copy',\r\n text: 'Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => !!this.message.message && !this.isTextSelected && (!this.isAnchorTarget || this.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.message.message && this.isTextSelected\r\n }, {\r\n icon: 'copy',\r\n text: 'Message.Context.Selection.Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => {\r\n if(!this.isSelected) {\r\n return false;\r\n }\r\n\r\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\r\n for(const mid of mids) {\r\n if(!!this.appMessagesManager.getMessageByPeer(peerId, mid).message) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'CopyLink',\r\n onClick: this.onCopyAnchorLinkClick,\r\n verify: () => this.isAnchorTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Username',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.isUsernameTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Hashtag',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.target.classList.contains('anchor-hashtag'),\r\n withSelection: true\r\n }, {\r\n icon: 'link',\r\n text: 'MessageContext.CopyMessageLink1',\r\n onClick: this.onCopyLinkClick,\r\n verify: () => this.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'pin',\r\n text: 'Message.Context.Pin',\r\n onClick: this.onPinClick,\r\n verify: () => !this.message.pFlags.is_outgoing && \r\n this.message._ !== 'messageService' && \r\n !this.message.pFlags.pinned && \r\n this.appPeersManager.canPinMessage(this.peerId) && \r\n this.chat.type !== 'scheduled',\r\n }, {\r\n icon: 'unpin',\r\n text: 'Message.Context.Unpin',\r\n onClick: this.onUnpinClick,\r\n verify: () => this.message.pFlags.pinned && this.appPeersManager.canPinMessage(this.peerId),\r\n }, {\r\n icon: 'download',\r\n text: 'MediaViewer.Context.Download',\r\n onClick: () => {\r\n this.appDocsManager.saveDocFile(this.message.media.document);\r\n },\r\n verify: () => {\r\n if(this.message.pFlags.is_outgoing) {\r\n return false;\r\n }\r\n \r\n const doc: MyDocument = this.message.media?.document;\r\n if(!doc) return false;\r\n \r\n let hasTarget = !!IS_TOUCH_SUPPORTED;\r\n const isGoodType = !doc.type || !(['gif', 'video', 'sticker'] as MyDocument['type'][]).includes(doc.type);\r\n if(isGoodType) hasTarget = hasTarget || !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio');\r\n return isGoodType && hasTarget;\r\n }\r\n }, {\r\n icon: 'checkretract',\r\n text: 'Chat.Poll.Unvote',\r\n onClick: this.onRetractVote,\r\n verify: () => {\r\n const poll = this.message.media?.poll as Poll;\r\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'stop',\r\n text: 'Chat.Poll.Stop',\r\n onClick: this.onStopPoll,\r\n verify: () => {\r\n const poll = this.message.media?.poll;\r\n return this.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'forward',\r\n text: 'Forward',\r\n onClick: this.onForwardClick,\r\n verify: () => this.chat.type !== 'scheduled' && !this.message.pFlags.is_outgoing && this.message._ !== 'messageService'\r\n }, {\r\n icon: 'forward',\r\n text: 'Message.Context.Selection.Forward',\r\n onClick: this.onForwardClick,\r\n verify: () => this.chat.selection.selectionForwardBtn && \r\n this.isSelected && \r\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'flag',\r\n text: 'ReportChat',\r\n onClick: () => {\r\n new PopupReportMessages(this.peerId, [this.mid]);\r\n },\r\n verify: () => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && this.appPeersManager.isChannel(this.peerId),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Select',\r\n onClick: this.onSelectClick,\r\n verify: () => !this.message.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 icon: 'delete danger',\r\n text: 'Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.appMessagesManager.canDeleteMessage(this.message)\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Message.Context.Selection.Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }];\r\n\r\n this.element = ButtonMenu(this.buttons, this.chat.bubbles.listenerSetter);\r\n this.element.id = 'bubble-contextmenu';\r\n this.element.classList.add('contextmenu');\r\n this.chat.container.append(this.element);\r\n }\r\n\r\n private onSendScheduledClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\r\n } else {\r\n new PopupSendNow(this.peerId, this.chat.getMidsByMid(this.mid));\r\n }\r\n };\r\n\r\n private onReplyClick = () => {\r\n this.chat.input.initMessageReply(this.mid);\r\n };\r\n\r\n private onEditClick = () => {\r\n this.chat.input.initMessageEditing(this.mid);\r\n };\r\n\r\n private onCopyClick = () => {\r\n if(isSelectionEmpty()) {\r\n const mids = this.chat.selection.isSelecting ? \r\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) : \r\n [this.mid];\r\n\r\n const str = mids.reduce((acc, mid) => {\r\n const message = this.chat.getMessage(mid);\r\n return acc + (message?.message ? message.message + '\\n' : '');\r\n }, '').trim();\r\n\r\n copyTextToClipboard(str);\r\n } else {\r\n document.execCommand('copy');\r\n //cancelSelection();\r\n }\r\n };\r\n\r\n private onCopyAnchorLinkClick = () => {\r\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\r\n };\r\n\r\n private onCopyLinkClick = () => {\r\n let threadMessage: Message.message;\r\n if(this.chat.type === 'discussion') {\r\n threadMessage = this.appMessagesManager.getMessageByPeer(this.peerId, this.chat.threadId);\r\n }\r\n\r\n const username = this.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : this.peerId);\r\n const msgId = this.appMessagesIdsManager.getServerMessageId(this.mid);\r\n let url = 'https://t.me/';\r\n let key: LangPackKey;\r\n if(username) {\r\n url += username + '/' + (threadMessage ? this.appMessagesIdsManager.getServerMessageId(threadMessage.fwd_from.channel_post) : msgId);\r\n if(threadMessage) url += '?comment=' + msgId;\r\n key = 'LinkCopied';\r\n } else {\r\n url += 'c/' + this.peerId.toChatId() + '/' + msgId;\r\n if(threadMessage) url += '?thread=' + this.appMessagesIdsManager.getServerMessageId(threadMessage.mid);\r\n key = 'LinkCopiedPrivateInfo';\r\n }\r\n\r\n toast(I18n.format(key, true));\r\n\r\n copyTextToClipboard(url);\r\n };\r\n\r\n private onPinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid);\r\n };\r\n\r\n private onUnpinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid, true);\r\n };\r\n\r\n private onRetractVote = () => {\r\n this.appPollsManager.sendVote(this.message, []);\r\n };\r\n\r\n private onStopPoll = () => {\r\n this.appPollsManager.stopPoll(this.message);\r\n };\r\n\r\n private onForwardClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\r\n } else {\r\n const mids = this.isTargetAGroupedItem ? [this.mid] : this.chat.getMidsByMid(this.mid);\r\n new PopupForward({\r\n [this.peerId]: mids\r\n });\r\n }\r\n };\r\n\r\n private onSelectClick = () => {\r\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\r\n };\r\n\r\n private onClearSelectionClick = () => {\r\n this.chat.selection.cancelSelection();\r\n };\r\n\r\n private onDeleteClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\r\n } else {\r\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : this.chat.getMidsByMid(this.mid), this.chat.type);\r\n }\r\n };\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport { attachContextMenuListener, openBtnMenu } from \"../misc\";\r\n\r\nexport default class SendMenu {\r\n public sendMenu: HTMLDivElement;\r\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\r\n private type: 'schedule' | 'reminder';\r\n \r\n constructor(options: {\r\n onSilentClick: () => void,\r\n onScheduleClick: () => void,\r\n listenerSetter?: ListenerSetter,\r\n openSide: string,\r\n onContextElement: HTMLElement,\r\n onOpen?: () => boolean\r\n }) {\r\n this.sendMenuButtons = [{\r\n icon: 'mute',\r\n text: 'Chat.Send.WithoutSound',\r\n onClick: options.onSilentClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.ScheduledMessage',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.SetReminder',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'reminder'\r\n }];\r\n \r\n this.sendMenu = ButtonMenu(this.sendMenuButtons, options.listenerSetter);\r\n this.sendMenu.classList.add('menu-send', options.openSide);\r\n\r\n attachContextMenuListener(options.onContextElement, (e: any) => {\r\n if(options.onOpen && !options.onOpen()) {\r\n return;\r\n }\r\n\r\n this.sendMenuButtons.forEach(button => {\r\n button.element.classList.toggle('hide', !button.verify());\r\n });\r\n \r\n cancelEvent(e);\r\n openBtnMenu(this.sendMenu);\r\n }, options.listenerSetter);\r\n }\r\n\r\n public setPeerId(peerId: PeerId) {\r\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"../chat/chat\";\r\nimport PopupElement from \".\";\r\nimport CheckboxField from \"../checkboxField\";\r\nimport InputField from \"../inputField\";\r\nimport RadioField from \"../radioField\";\r\nimport Scrollable from \"../scrollable\";\r\nimport SendContextMenu from \"../chat/sendContextMenu\";\r\nimport I18n, { _i18n } from \"../../lib/langPack\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport getRichValue from \"../../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../../helpers/dom/isInputEmpty\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { Poll } from \"../../layer\";\r\n\r\nconst MAX_LENGTH_QUESTION = 255;\r\nconst MAX_LENGTH_OPTION = 100;\r\nconst MAX_LENGTH_SOLUTION = 200;\r\n\r\nexport default class PopupCreatePoll extends PopupElement {\r\n private questionInputField: InputField;\r\n private questions: HTMLElement;\r\n private scrollable: Scrollable;\r\n private tempId = 0;\r\n\r\n private anonymousCheckboxField: CheckboxField;\r\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n\r\n private correctAnswers: Uint8Array[];\r\n private quizSolutionField: InputField;\r\n private optionInputFields: InputField[];\r\n\r\n constructor(private chat: Chat) {\r\n super('popup-create-poll popup-new-media', null, {closable: true, withConfirm: 'Create', body: true});\r\n\r\n _i18n(this.title, 'NewPoll');\r\n\r\n this.questionInputField = new InputField({\r\n placeholder: 'AskAQuestion',\r\n label: 'AskAQuestion', \r\n name: 'question', \r\n maxLength: MAX_LENGTH_QUESTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n this.optionInputFields = [];\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const sendMenu = new SendContextMenu({\r\n onSilentClick: () => {\r\n this.chat.input.sendSilent = true;\r\n this.send();\r\n },\r\n onScheduleClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n this.send();\r\n });\r\n },\r\n openSide: 'bottom-left',\r\n onContextElement: this.btnConfirm,\r\n });\r\n \r\n sendMenu.setPeerId(this.chat.peerId);\r\n\r\n this.header.append(sendMenu.sendMenu);\r\n }\r\n\r\n this.header.append(this.questionInputField.container);\r\n\r\n const hr = document.createElement('hr');\r\n const d = document.createElement('div');\r\n d.classList.add('caption');\r\n _i18n(d, 'PollOptions');\r\n\r\n this.questions = document.createElement('form');\r\n this.questions.classList.add('poll-create-questions');\r\n\r\n const dd = document.createElement('div');\r\n dd.classList.add('poll-create-settings');\r\n \r\n const settingsCaption = document.createElement('div');\r\n settingsCaption.classList.add('caption');\r\n _i18n(settingsCaption, 'Settings');\r\n\r\n if(!this.chat.appPeersManager.isBroadcast(this.chat.peerId)) {\r\n this.anonymousCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Anonymous', \r\n name: 'anonymous'\r\n });\r\n this.anonymousCheckboxField.input.checked = true;\r\n dd.append(this.anonymousCheckboxField.label);\r\n }\r\n \r\n this.multipleCheckboxField = new CheckboxField({\r\n text: 'NewPoll.MultipleChoice', \r\n name: 'multiple'\r\n });\r\n this.quizCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Quiz', \r\n name: 'quiz'\r\n });\r\n\r\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\r\n const checked = this.multipleCheckboxField.input.checked;\r\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\r\n });\r\n\r\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\r\n const checked = this.quizCheckboxField.input.checked;\r\n\r\n (Array.from(this.questions.children) as HTMLElement[]).map(el => {\r\n el.classList.toggle('radio-field', checked);\r\n });\r\n\r\n if(!checked) {\r\n this.correctAnswers = undefined;\r\n this.quizSolutionField.setValueSilently('');\r\n }\r\n\r\n quizElements.forEach(el => el.classList.toggle('hide', !checked));\r\n\r\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\r\n this.handleChange();\r\n });\r\n\r\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\r\n\r\n const quizElements: HTMLElement[] = [];\r\n\r\n const quizSolutionCaption = document.createElement('div');\r\n quizSolutionCaption.classList.add('caption');\r\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\r\n\r\n const quizHr = document.createElement('hr');\r\n\r\n const quizSolutionContainer = document.createElement('div');\r\n quizSolutionContainer.classList.add('poll-create-questions');\r\n\r\n this.quizSolutionField = new InputField({\r\n placeholder: 'NewPoll.Explanation.Placeholder', \r\n label: 'NewPoll.Explanation.Placeholder',\r\n name: 'solution',\r\n maxLength: MAX_LENGTH_SOLUTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n const quizSolutionSubtitle = document.createElement('div');\r\n quizSolutionSubtitle.classList.add('subtitle');\r\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\r\n\r\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\r\n\r\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\r\n quizElements.forEach(el => el.classList.add('hide'));\r\n\r\n this.body.parentElement.insertBefore(hr, this.body);\r\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\r\n\r\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.scrollable = new Scrollable(this.body);\r\n this.appendMoreField();\r\n\r\n this.onEscape = () => {\r\n return !this.getFilledAnswers().length;\r\n };\r\n\r\n this.handleChange();\r\n }\r\n\r\n private getFilledAnswers() {\r\n const answers = Array.from(this.questions.children).map((el, idx) => {\r\n const input = el.querySelector('.input-field-input') as HTMLElement;\r\n return input instanceof HTMLInputElement ? input.value : getRichValue(input, false).value;\r\n }).filter(v => !!v.trim());\r\n\r\n return answers;\r\n }\r\n\r\n private onSubmitClick = () => {\r\n this.send();\r\n };\r\n\r\n private validate() {\r\n const question = this.questionInputField.value;\r\n if(!question) {\r\n return false;\r\n }\r\n\r\n if(question.length > MAX_LENGTH_QUESTION) {\r\n return false;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\r\n return false;\r\n }\r\n\r\n const answers = this.getFilledAnswers();\r\n if(answers.length < 2) {\r\n return false;\r\n }\r\n \r\n const tooLongOption = answers.find(a => a.length > MAX_LENGTH_OPTION);\r\n if(tooLongOption) {\r\n return false;\r\n }\r\n\r\n const {value: quizSolution} = getRichValue(this.quizSolutionField.input, false);\r\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleChange() {\r\n const valid = this.validate();\r\n this.btnConfirm.toggleAttribute('disabled', !valid);\r\n }\r\n\r\n public send(force = false) {\r\n const question = this.questionInputField.value;\r\n\r\n const answers = this.getFilledAnswers();\r\n\r\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValue(this.quizSolutionField.input);\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.chat.input.scheduleSending(() => {\r\n this.send(true);\r\n });\r\n \r\n return;\r\n }\r\n\r\n this.hide();\r\n\r\n //const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\r\n //const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\r\n\r\n const pFlags: Poll['pFlags'] = {};\r\n\r\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\r\n pFlags.public_voters = true;\r\n }\r\n\r\n if(this.multipleCheckboxField.input.checked) {\r\n pFlags.multiple_choice = true;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked) {\r\n pFlags.quiz = true;\r\n }\r\n\r\n const poll: Poll = {\r\n _: 'poll',\r\n pFlags,\r\n question,\r\n answers: answers.map((value, idx) => {\r\n return {\r\n _: 'pollAnswer',\r\n text: value,\r\n option: new Uint8Array([idx])\r\n };\r\n }),\r\n id: undefined\r\n };\r\n //poll.id = randomIDS;\r\n\r\n const inputMediaPoll = this.chat.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\r\n\r\n //console.log('Will try to create poll:', inputMediaPoll);\r\n\r\n this.chat.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\r\n threadId: this.chat.threadId,\r\n replyToMsgId: this.chat.input.replyToMsgId,\r\n scheduleDate: this.chat.input.scheduleDate,\r\n silent: this.chat.input.sendSilent\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(this.questions.lastElementChild as HTMLElement, 'center');\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\r\n\r\n this.optionInputFields.push(questionField);\r\n }\r\n}\r\n","/**\n * @returns duration in ms\n */\nexport default function getGifDuration(image: HTMLImageElement) {\n const src = image.src;\n\n return fetch(src)\n .then(response => response.arrayBuffer())\n .then(arrayBuffer => {\n const d = new Uint8Array(arrayBuffer);\n // Thanks to http://justinsomnia.org/2006/10/gif-animation-duration-calculation/\n // And http://www.w3.org/Graphics/GIF/spec-gif89a.txt\n let duration = 0;\n for(let i = 0, length = d.length; i < length; ++i) {\n // Find a Graphic Control Extension hex(21F904__ ____ __00)\n if(d[i] == 0x21 \n && d[i + 1] == 0xF9 \n && d[i + 2] == 0x04 \n && d[i + 7] == 0x00) {\n // Swap 5th and 6th bytes to get the delay per frame\n const delay = (d[i + 5] << 8) | (d[i + 4] & 0xFF);\n \n // Should be aware browsers have a minimum frame delay \n // e.g. 6ms for IE, 2ms modern browsers (50fps)\n duration += delay < 2 ? 10 : delay;\n }\n }\n\n return duration / 1000;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from \"../chat/chat\";\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport Scrollable from \"../scrollable\";\nimport { toast } from \"../toast\";\nimport { prepareAlbum, wrapDocument } from \"../wrappers\";\nimport CheckboxField from \"../checkboxField\";\nimport SendContextMenu from \"../chat/sendContextMenu\";\nimport { createPosterFromMedia, createPosterFromVideo, onMediaLoad } from \"../../helpers/files\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport I18n, { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport placeCaretAtEnd from \"../../helpers/dom/placeCaretAtEnd\";\nimport rootScope from \"../../lib/rootScope\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { MediaSize } from \"../../helpers/mediaSizes\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport getGifDuration from \"../../helpers/getGifDuration\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\n\ntype SendFileParams = Partial<{\n file: File,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n width: number,\n height: number,\n duration: number,\n noSound: boolean,\n itemDiv: HTMLElement\n}>;\n\nlet currentPopup: PopupNewMedia;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private input: HTMLElement;\n private mediaContainer: HTMLElement;\n private groupCheckboxField: CheckboxField;\n private mediaCheckboxField: CheckboxField;\n private wasInputValue: string;\n\n private willAttach: Partial<{\n type: 'media' | 'document',\n isMedia: true,\n group: boolean,\n sendFileDetails: SendFileParams[]\n }>;\n private inputField: InputField;\n\n constructor(private chat: Chat, private files: File[], willAttachType: PopupNewMedia['willAttach']['type']) {\n super('popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Modal.Send', confirmShortcutIsSendShortcut: true, body: true});\n\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: false\n };\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n const scrollable = new Scrollable(null);\n scrollable.container.append(this.mediaContainer);\n \n this.inputField = new InputField({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n label: 'Caption',\n name: 'photo-caption',\n maxLength: rootScope.config.caption_length_max\n });\n this.input = this.inputField.input;\n\n this.inputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n\n this.body.append(scrollable.container);\n this.container.append(this.inputField.container);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files = [];\n currentPopup = undefined;\n });\n\n currentPopup = this;\n }\n\n public appendDrops(element: HTMLElement) {\n this.body.append(element);\n }\n\n get type() {\n return this.willAttach.type;\n }\n\n set type(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n }\n\n private appendGroupCheckboxField() {\n const good = this.files.length > 1;\n if(good && !this.groupCheckboxField) {\n this.groupCheckboxField = new CheckboxField({\n text: 'PreviewSender.GroupItems', \n name: 'group-items'\n });\n this.container.append(...[this.groupCheckboxField.label, this.mediaCheckboxField?.label, this.inputField.container].filter(Boolean));\n \n this.willAttach.group = true;\n this.groupCheckboxField.setValueSilently(this.willAttach.group);\n\n this.listenerSetter.add(this.groupCheckboxField.input)('change', () => {\n const checked = this.groupCheckboxField.checked;\n \n this.willAttach.group = checked;\n\n this.attachFiles();\n });\n } else if(this.groupCheckboxField) {\n this.groupCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n private appendMediaCheckboxField() {\n const good = !!this.files.find(file => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n if(good && !this.mediaCheckboxField) {\n this.mediaCheckboxField = new CheckboxField({\n text: 'PreviewSender.CompressFile',\n name: 'compress-items'\n });\n this.container.append(...[this.groupCheckboxField?.label, this.mediaCheckboxField.label, this.inputField.container].filter(Boolean));\n\n this.mediaCheckboxField.setValueSilently(this.willAttach.type === 'media');\n\n this.listenerSetter.add(this.mediaCheckboxField.input)('change', () => {\n const checked = this.mediaCheckboxField.checked;\n \n this.willAttach.type = checked ? 'media' : 'document';\n\n this.attachFiles();\n });\n } else if(this.mediaCheckboxField) {\n this.mediaCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n public addFiles(files: File[]) {\n const toPush = files.filter(file => {\n const found = this.files.find(_file => {\n return _file.lastModified === file.lastModified && _file.name === file.name && _file.size === file.size;\n });\n \n return !found;\n });\n\n if(toPush.length) {\n this.files.push(...toPush);\n this.attachFiles();\n }\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if(target !== this.input) {\n if(target.tagName === 'INPUT' || target.hasAttribute('contenteditable')) {\n return;\n }\n\n this.input.focus();\n placeCaretAtEnd(this.input);\n }\n };\n\n private send(force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n \n return;\n }\n\n let caption = this.inputField.value;\n if(caption.length > rootScope.config.caption_length_max) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n this.hide();\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' ? true : undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n //console.log('will send files with options:', willAttach);\n\n const {peerId, input} = this.chat;\n const {sendSilent, scheduleDate} = input;\n\n sendFileDetails.forEach(d => {\n d.itemDiv = undefined;\n });\n\n const {length} = sendFileDetails;\n const replyToMsgId = input.replyToMsgId;\n this.iterate((sendFileDetails) => {\n if(caption && sendFileDetails.length !== length) {\n this.chat.appMessagesManager.sendText(peerId, caption, {\n replyToMsgId, \n threadId: this.chat.threadId,\n silent: sendSilent, \n scheduleDate,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const w = {\n ...willAttach,\n sendFileDetails\n };\n\n this.chat.appMessagesManager.sendAlbum(peerId, w.sendFileDetails.map(d => d.file), Object.assign({\n caption,\n replyToMsgId,\n threadId: this.chat.threadId,\n isMedia: isMedia,\n silent: sendSilent,\n scheduleDate,\n clearDraft: true as true\n }, w));\n\n caption = undefined;\n });\n \n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n }\n\n private attachMedia(file: File, params: SendFileParams, itemDiv: HTMLElement) {\n itemDiv.classList.add('popup-item-media');\n\n const isVideo = file.type.startsWith('video/');\n\n let promise: Promise;\n if(isVideo) {\n const video = document.createElement('video');\n const source = document.createElement('source');\n source.src = params.objectURL = URL.createObjectURL(file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n video.setAttribute('playsinline', 'true');\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n promise = onMediaLoad(video).then(() => {\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n \n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n itemDiv.append(video);\n return createPosterFromVideo(video).then(thumb => {\n params.thumb = {\n url: URL.createObjectURL(thumb.blob),\n ...thumb\n };\n });\n });\n\n video.append(source);\n } else {\n const img = new Image();\n promise = new Promise((resolve) => {\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n itemDiv.append(img);\n \n if(file.type === 'image/gif') {\n params.noSound = true;\n \n Promise.all([\n getGifDuration(img).then(duration => {\n params.duration = Math.ceil(duration);\n }),\n \n createPosterFromMedia(img).then(thumb => {\n params.thumb = {\n url: URL.createObjectURL(thumb.blob),\n ...thumb\n };\n })\n ]).then(() => {\n resolve();\n });\n } else {\n resolve();\n }\n };\n });\n \n img.src = params.objectURL = URL.createObjectURL(file);\n }\n\n return promise;\n }\n\n private attachDocument(file: File, params: SendFileParams, itemDiv: HTMLElement): ReturnType {\n itemDiv.classList.add('popup-item-document');\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio) {\n params.objectURL = URL.createObjectURL(file);\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n fileName: file.name ? RichTextProcessor.wrapEmojiText(file.name) : '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n const cacheContext = appDownloadManager.getCacheContext(doc);\n cacheContext.url = params.objectURL;\n cacheContext.downloaded = file.size;\n\n const docDiv = wrapDocument({\n message: {\n _: 'message',\n pFlags: {\n is_outgoing: true\n },\n mid: 0,\n peerId: 0,\n media: {\n _: 'messageMediaDocument',\n document: doc\n }\n } as any\n });\n\n const promise = new Promise((resolve) => {\n const finish = () => {\n itemDiv.append(docDiv);\n resolve();\n };\n \n if(isPhoto) {\n const img = new Image();\n img.src = params.objectURL;\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n finish();\n };\n \n img.onerror = finish;\n } else {\n finish();\n }\n });\n\n return promise;\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const params: SendFileParams = {};\n params.file = file;\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(file, params, itemDiv) : this.attachDocument(file, params, itemDiv);\n willAttach.sendFileDetails.push(params);\n return promise;\n };\n \n private shouldCompress(mimeType: string) {\n return this.willAttach.type === 'media' && MEDIA_MIME_TYPES_SUPPORTED.has(mimeType);\n }\n\n private onRender() {\n // show now\n if(!this.element.classList.contains('active')) {\n this.listenerSetter.add(document.body)('keydown', this.onKeyDown);\n this.addEventListener('close', () => {\n if(this.wasInputValue) {\n this.chat.input.messageInputField.value = this.wasInputValue;\n }\n });\n this.show();\n }\n }\n\n private setTitle() {\n const {willAttach, title, files} = this;\n let key: LangPackKey;\n const args: FormatterArguments = [];\n if(willAttach.type === 'document') {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else {\n let foundPhotos = 0, foundVideos = 0, foundFiles = 0;\n files.forEach(file => {\n if(file.type.startsWith('image/')) ++foundPhotos;\n else if(file.type.startsWith('video/')) ++foundVideos;\n else ++foundFiles;\n });\n\n if([foundPhotos, foundVideos, foundFiles].filter(n => n > 0).length > 1) {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else \n \n /* const sum = foundPhotos + foundVideos;\n if(sum > 1 && willAttach.group) {\n key = 'PreviewSender.SendAlbum';\n const albumsLength = Math.ceil(sum / 10);\n args.push(albumsLength);\n } else */if(foundPhotos) {\n key = 'PreviewSender.SendPhoto';\n args.push(foundPhotos);\n } else if(foundVideos) {\n key = 'PreviewSender.SendVideo';\n args.push(foundVideos);\n }\n }\n\n replaceContent(title, i18n(key, args));\n }\n\n private appendMediaToContainer(div: HTMLElement, params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, 380, 320);\n div.style.width = size.width + 'px';\n div.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(div);\n }\n\n private iterate(cb: (sendFileDetails: SendFileParams[]) => void) {\n const {sendFileDetails} = this.willAttach;\n if(!this.willAttach.group) {\n sendFileDetails.forEach(p => cb([p]));\n return;\n }\n\n const length = sendFileDetails.length;\n for(let i = 0; i < length;) {\n const firstType = sendFileDetails[i].file.type;\n let k = 0;\n for(; k < 10 && i < length; ++i, ++k) {\n const type = sendFileDetails[i].file.type;\n if(this.shouldCompress(firstType) !== this.shouldCompress(type)) {\n break;\n }\n }\n\n cb(sendFileDetails.slice(i - k, i));\n }\n }\n\n private attachFiles() {\n const {files, willAttach, mediaContainer} = this;\n willAttach.sendFileDetails.length = 0;\n\n this.appendGroupCheckboxField();\n this.appendMediaCheckboxField();\n\n Promise.all(files.map(this.attachFile)).then(() => {\n mediaContainer.innerHTML = '';\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n if(this.shouldCompress(sendFileDetails[0].file.type) && sendFileDetails.length > 1) {\n const albumContainer = document.createElement('div');\n albumContainer.classList.add('popup-item-album', 'popup-item');\n albumContainer.append(...sendFileDetails.map(s => s.itemDiv));\n\n prepareAlbum({\n container: albumContainer,\n items: sendFileDetails.map(o => ({w: o.width, h: o.height})),\n maxWidth: 380,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params.itemDiv, params);\n });\n }\n });\n }).then(() => {\n this.onRender();\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport fastSmoothScroll from \"../fastSmoothScroll\";\r\nimport { cancelEvent } from \"./cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"./clickEvent\";\r\nimport findUpAsChild from \"./findUpAsChild\";\r\nimport findUpClassName from \"./findUpClassName\";\r\n\r\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\r\nconst HANDLE_EVENT = 'keydown';\r\nconst ACTIVE_CLASS_NAME = 'active';\r\n\r\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\r\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\r\n\r\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: {\r\n list: HTMLElement, \r\n type: 'xy' | 'x' | 'y',\r\n onSelect: (target: Element) => void | boolean,\r\n once: boolean,\r\n waitForKey?: string\r\n}) {\r\n 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(scrollable, target as HTMLElement, 'center', undefined, undefined, undefined, 100, type === 'x' ? 'x' : 'y');\r\n }\r\n };\r\n\r\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\r\n let nextTarget: Element;\r\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\r\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\r\n\r\n return nextTarget;\r\n };\r\n\r\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\r\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\r\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\r\n const currentRect = currentTarget.getBoundingClientRect();\r\n\r\n let nextTarget = currentTarget[property] || list[endProperty];\r\n while(nextTarget !== currentTarget) {\r\n const targetRect = nextTarget.getBoundingClientRect();\r\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\r\n break;\r\n }\r\n\r\n nextTarget = nextTarget[property] || list[endProperty];\r\n }\r\n\r\n return nextTarget;\r\n };\r\n\r\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\r\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\r\n handleArrowKey = (currentTarget, key) => {\r\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\r\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\r\n };\r\n } else { // flex-direction: row | column;\r\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\r\n }\r\n\r\n let onKeyDown = (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(!keyNames.has(key as any)) {\r\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\r\n cancelEvent(e);\r\n fireSelect(getCurrentTarget());\r\n }\r\n\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n\r\n if(list.childElementCount > 1) {\r\n let currentTarget = getCurrentTarget();\r\n currentTarget = handleArrowKey(currentTarget, key as any);\r\n setCurrentTarget(currentTarget, true);\r\n }\r\n };\r\n\r\n const scrollable = findUpClassName(list, 'scrollable');\r\n list.classList.add('navigable-list');\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n };\r\n\r\n const onClick = (e: Event) => {\r\n cancelEvent(e); // cancel keyboard closening\r\n\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n fireSelect(getCurrentTarget());\r\n };\r\n\r\n const fireSelect = (target: Element) => {\r\n const canContinue = onSelect(target);\r\n if(canContinue !== undefined ? !canContinue : once) {\r\n detach();\r\n }\r\n };\r\n\r\n const detach = () => {\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(waitForKey) return;\r\n setCurrentTarget(list.firstElementChild, false);\r\n };\r\n\r\n if(waitForKey) {\r\n const _onKeyDown = onKeyDown;\r\n onKeyDown = (e) => {\r\n if(e.key === waitForKey) {\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 waitForKey = undefined;\r\n resetTarget();\r\n }\r\n };\r\n } else {\r\n resetTarget();\r\n }\r\n\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 return {\r\n detach,\r\n resetTarget\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport attachListNavigation from \"../../helpers/dom/attachListNavigation\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { safeAssign } from \"../../helpers/object\";\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\n\r\nexport default class AutocompleteHelper extends EventListenerBase<{\r\n hidden: () => void,\r\n visible: () => 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 detach: () => void;\r\n protected init?(): void;\r\n\r\n protected controller: AutocompleteHelperController;\r\n protected listType: 'xy' | 'x' | 'y';\r\n protected onSelect: (target: Element) => boolean | void;\r\n protected waitForKey?: string;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n constructor(options: {\r\n appendTo: HTMLElement,\r\n controller: AutocompleteHelper['controller'],\r\n listType: AutocompleteHelper['listType'],\r\n onSelect: AutocompleteHelper['onSelect'],\r\n waitForKey?: AutocompleteHelper['waitForKey']\r\n }) {\r\n super(false);\r\n\r\n safeAssign(this, options);\r\n \r\n this.container = document.createElement('div');\r\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\r\n \r\n options.appendTo.append(this.container);\r\n \r\n this.attachNavigation();\r\n\r\n this.controller.addHelper(this);\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 {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.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.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) {\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.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) {\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 SetTransition(this.container, 'is-visible', !hide, rootScope.settings.animationsEnabled ? 200 : 0, () => {\r\n this.hidden && this.dispatchEvent('hidden');\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class StickersHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private onChangeScreen: () => void;\r\n\r\n constructor(appendTo: HTMLElement, controller: AutocompleteHelperController) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n onSelect: (target) => {\r\n return !EmoticonsDropdown.onMediaClick({target}, true);\r\n }, \r\n waitForKey: 'ArrowUp'\r\n });\r\n\r\n this.container.classList.add('stickers-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n\r\n rootScope.dispatchEvent('choosing_sticker', true);\r\n });\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n\r\n rootScope.dispatchEvent('choosing_sticker', false);\r\n });\r\n }\r\n\r\n public checkEmoticon(emoticon: string) {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n appStickersManager.preloadAnimatedEmojiSticker(emoticon);\r\n appStickersManager.getStickersByEmoticon(emoticon)\r\n .then((stickers) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const container = this.list.cloneNode() as HTMLElement;\r\n\r\n let ready: Promise;\r\n\r\n this.lazyLoadQueue.clear();\r\n if(stickers.length) {\r\n ready = new Promise((resolve) => {\r\n const promises: Promise[] = [];\r\n stickers.forEach(sticker => {\r\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\r\n });\r\n\r\n (Promise.all(promises) as Promise).finally(resolve);\r\n });\r\n } else {\r\n ready = Promise.resolve();\r\n }\r\n\r\n ready.then(() => {\r\n this.list.replaceWith(container);\r\n this.list = container;\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n\r\n this.toggle(!stickers.length);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, CHAT_ANIMATION_GROUP);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport Button from \"../button\";\r\nimport PopupDatePicker from \"./datePicker\";\r\n\r\nconst getMinDate = () => {\r\n const date = new Date();\r\n //date.setDate(date.getDate() - 1);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n};\r\n\r\nconst getMaxDate = () => {\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() + 1);\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n};\r\n\r\nconst checkDate = (date: Date) => {\r\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\r\n};\r\n\r\nexport default class PopupSchedule extends PopupDatePicker {\r\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\r\n super(checkDate(initDate), onPick, {\r\n noButtons: true,\r\n noTitle: true,\r\n closable: true,\r\n withConfirm: true,\r\n minDate: getMinDate(),\r\n maxDate: getMaxDate(),\r\n withTime: true,\r\n showOverflowMonths: true,\r\n confirmShortcutIsSendShortcut: true\r\n });\r\n\r\n this.element.classList.add('popup-schedule');\r\n this.header.append(this.controlsDiv);\r\n this.title.replaceWith(this.monthTitle);\r\n this.body.append(this.btnConfirm);\r\n\r\n if(canSendWhenOnline) {\r\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\r\n this.body.append(btnSendWhenOnline);\r\n\r\n attachClickEvent(btnSendWhenOnline, () => {\r\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\r\n this.hide();\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValueWithCaret(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const sel = window.getSelection();\r\n let selNode: Node;\r\n let selOffset: number;\r\n if(sel && sel.rangeCount) {\r\n const range = sel.getRangeAt(0);\r\n const startOffset = range.startOffset;\r\n if(\r\n range.startContainer &&\r\n range.startContainer == range.endContainer &&\r\n startOffset == range.endOffset\r\n ) {\r\n // * if focused on img, or caret has been set via placeCaretAtEnd\r\n const possibleChildrenFocusOffset = startOffset - 1;\r\n const childNodes = field.childNodes;\r\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\r\n selNode = childNodes[possibleChildrenFocusOffset];\r\n selOffset = 0;\r\n\r\n for(let i = 0; i < range.endOffset; ++i) {\r\n const node = childNodes[i];\r\n const value = node.nodeValue || (node as HTMLImageElement).alt;\r\n\r\n if(value) {\r\n selOffset += value.length;\r\n }\r\n }\r\n } else {\r\n selNode = range.startContainer;\r\n selOffset = startOffset;\r\n }\r\n }\r\n }\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, selNode, selOffset, entities);\r\n\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n const caretPos = value.indexOf('\\x01');\r\n if(caretPos != -1) {\r\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\r\n }\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n return {value, entities, caretPos};\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatInput from \"./input\";\r\nimport type { AppEmojiManager } from \"../../lib/appManagers/appEmojiManager\";\r\nimport { appendEmoji, getEmojiFromElement } from \"../emoticonsDropdown/tabs/emoji\";\r\nimport { ScrollableX } from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class EmojiHelper extends AutocompleteHelper {\r\n private scrollable: ScrollableX;\r\n\r\n constructor(appendTo: HTMLElement, \r\n controller: AutocompleteHelperController, \r\n chatInput: ChatInput, \r\n private appEmojiManager: AppEmojiManager) {\r\n super({\r\n appendTo,\r\n controller, \r\n listType: 'x', \r\n onSelect: (target) => {\r\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\r\n }\r\n });\r\n\r\n this.container.classList.add('emoji-helper');\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new ScrollableX(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollLeft = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(emojis: string[], waitForKey: boolean) {\r\n if(this.init) {\r\n if(!emojis.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n \r\n emojis = emojis.slice(0, 80);\r\n\r\n if(emojis.length) {\r\n this.list.innerHTML = '';\r\n emojis.forEach(emoji => {\r\n appendEmoji(emoji, this.list, false, true);\r\n });\r\n }\r\n\r\n this.waitForKey = waitForKey ? 'ArrowUp' : undefined;\r\n this.toggle(!emojis.length);\r\n\r\n /* window.requestAnimationFrame(() => {\r\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\r\n }); */\r\n }\r\n\r\n public checkQuery(query: string, firstChar: string) {\r\n const middleware = this.controller.getMiddleware();\r\n this.appEmojiManager.getBothEmojiKeywords().then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const q = query.replace(/^:/, '');\r\n const emojis = this.appEmojiManager.searchEmojis(q);\r\n this.render(emojis, firstChar !== ':');\r\n //console.log(emojis);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport AvatarElement from \"../avatar\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\r\n protected static BASE_CLASS = 'autocomplete-peer-helper';\r\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\r\n private scrollable: Scrollable;\r\n\r\n constructor(appendTo: HTMLElement, controller: AutocompleteHelperController, protected className: string, onSelect: (target: Element) => boolean | void) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'y', \r\n onSelect\r\n });\r\n\r\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list');\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}[]) {\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 this.toggle(!data.length);\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.setAttribute('dialog', '0');\r\n avatar.setAttribute('peer', '' + options.peerId);\r\n \r\n const name = document.createElement('div');\r\n name.classList.add(BASE + '-name', options.className + '-name');\r\n if(!options.name) {\r\n name.append(new PeerTitle({\r\n peerId: options.peerId,\r\n dialog: false,\r\n onlyFirstName: false,\r\n plainText: false\r\n }).element);\r\n } else {\r\n name.innerHTML = RichTextProcessor.wrapEmojiText(options.name);\r\n }\r\n \r\n div.append(avatar, name);\r\n\r\n if(options.description) {\r\n const description = document.createElement('div');\r\n description.classList.add(BASE + '-description', options.className + '-description');\r\n description.innerHTML = RichTextProcessor.wrapEmojiText(options.description);\r\n div.append(description);\r\n }\r\n \r\n return div;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from \"./input\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { BotInfo } from \"../../layer\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\nimport SearchIndex from \"../../lib/searchIndex\";\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager) {\n super(appendTo, \n controller,\n 'commands-helper',\n (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n });\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId) {\n if(!this.appUsersManager.isBot(peerId)) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n this.appProfileManager.getProfileByPeerId(peerId).then(full => {\n if(!middleware()) {\n return;\n }\n\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n const index = new SearchIndex({\n ignoreCase: true\n });\n \n const commands: Map = new Map();\n botInfos.forEach(botInfo => {\n botInfo.commands.forEach(botCommand => {\n const c = '/' + botCommand.command;\n commands.set(botCommand.command, {\n peerId: botInfo.user_id.toPeerId(false), \n name: c, \n description: botCommand.description\n });\n\n index.indexObject(botCommand.command, c);\n });\n });\n\n const found = index.search(query);\n const filtered = Array.from(found).map(command => commands.get(command));\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 getMiddleware() {\r\n this.middleware.clean();\r\n return this.middleware.get();\r\n }\r\n\r\n public addHelper(helper: AutocompleteHelper) {\r\n this.helpers.add(helper);\r\n }\r\n\r\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\r\n this.helpers.forEach(helper => {\r\n if(helper !== preserveHelper) {\r\n helper.toggle(true, true);\r\n }\r\n });\r\n\r\n if(!preserveHelper) {\r\n this.middleware.clean();\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from \"./input\";\nimport type { MessageEntity } from \"../../layer\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager) {\n super(appendTo, \n controller,\n 'mentions-helper',\n (target) => {\n const user = appUsersManager.getUser((target as HTMLElement).dataset.peerId.toUserId());\n let str = '', entity: MessageEntity;\n if(user.username) {\n str = '@' + user.username;\n } else {\n str = user.first_name || user.last_name;\n entity = {\n _: 'messageEntityMentionName',\n length: str.length,\n offset: 0,\n user_id: user.id\n };\n }\n\n str += ' ';\n chatInput.insertAtCaret(str, entity);\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId, topMsgId: number) {\n const trimmed = query.trim(); // check that there is no whitespace\n if(query.length !== trimmed.length) return false;\n\n const middleware = this.controller.getMiddleware();\n this.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(peerIds => {\n if(!middleware()) return;\n \n const username = trimmed.slice(1).toLowerCase();\n this.render(peerIds.map(peerId => {\n const user = this.appUsersManager.getUser(peerId);\n if(user.username && user.username.toLowerCase() === username) { // hide full matched suggestion\n return;\n }\n\n return {\n peerId,\n description: user.username ? '@' + user.username : undefined\n };\n }).filter(Boolean));\n });\n\n return true;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type ChatInput from \"./input\";\r\nimport DropdownHover from \"../../helpers/dropdownHover\";\r\nimport { ReplyMarkup } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { safeAssign } from \"../../helpers/object\";\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\n\r\nexport default class ReplyKeyboard extends DropdownHover {\r\n private static BASE_CLASS = 'reply-keyboard';\r\n private appendTo: HTMLElement;\r\n private listenerSetter: ListenerSetter;\r\n private appMessagesManager: AppMessagesManager;\r\n private btnHover: HTMLElement;\r\n private peerId: PeerId;\r\n private touchListener: Listener;\r\n private chatInput: ChatInput;\r\n\r\n constructor(options: {\r\n listenerSetter: ListenerSetter,\r\n appMessagesManager: AppMessagesManager,\r\n appendTo: HTMLElement,\r\n btnHover: HTMLElement,\r\n chatInput: ChatInput\r\n }) {\r\n super({\r\n element: document.createElement('div')\r\n });\r\n\r\n safeAssign(this, options);\r\n\r\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\r\n this.element.style.display = 'none';\r\n\r\n this.attachButtonListener(this.btnHover, this.listenerSetter);\r\n this.listenerSetter.add(rootScope)('history_reply_markup', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n if(this.checkAvailability() && this.isActive()) {\r\n this.render();\r\n }\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.checkForceReply();\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected init() {\r\n this.appendTo.append(this.element);\r\n\r\n this.listenerSetter.add(this)('open', () => {\r\n this.render();\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\r\n this.listenerSetter.add(this)('close', () => {\r\n this.listenerSetter.remove(this.touchListener);\r\n }, {once: true});\r\n }\r\n });\r\n \r\n this.listenerSetter.add(this.element)('click', (e) => {\r\n const target = findUpClassName(e.target, 'btn');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n this.appMessagesManager.sendText(this.peerId, target.dataset.text);\r\n this.toggle(false);\r\n });\r\n\r\n return super.init();\r\n }\r\n\r\n private onBodyTouchStart = (e: TouchEvent) => {\r\n const target = e.touches[0].target as HTMLElement;\r\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\r\n cancelEvent(e);\r\n this.toggle(false);\r\n }\r\n };\r\n\r\n public checkForceReply() {\r\n const replyMarkup = this.getReplyMarkup();\r\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\r\n !replyMarkup.pFlags.hidden && \r\n !replyMarkup.pFlags.used) {\r\n replyMarkup.pFlags.used = true;\r\n this.chatInput.initMessageReply(replyMarkup.mid);\r\n }\r\n }\r\n\r\n private getReplyMarkup(): ReplyMarkup {\r\n return this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup ?? {\r\n _: 'replyKeyboardHide'\r\n };\r\n }\r\n\r\n public render(replyMarkup: ReplyMarkup.replyKeyboardMarkup = this.getReplyMarkup() as any) {\r\n this.element.innerHTML = '';\r\n\r\n for(const row of replyMarkup.rows) {\r\n const div = document.createElement('div');\r\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\r\n\r\n for(const button of row.buttons) {\r\n const btn = document.createElement('button');\r\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\r\n btn.innerHTML = RichTextProcessor.wrapEmojiText(button.text);\r\n btn.dataset.text = button.text;\r\n div.append(btn);\r\n }\r\n\r\n this.element.append(div);\r\n }\r\n }\r\n\r\n public checkAvailability(replyMarkup: ReplyMarkup = this.getReplyMarkup()) {\r\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\r\n this.btnHover.classList.toggle('hide', hide);\r\n\r\n if(hide) {\r\n this.toggle(false);\r\n }\r\n\r\n return !hide;\r\n }\r\n\r\n public setPeer(peerId: PeerId) {\r\n this.peerId = peerId;\r\n\r\n this.checkAvailability();\r\n this.checkForceReply();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\r\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\r\nimport type Chat from \"./chat\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { WebDocument } from \"../../layer\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { renderImageWithFadeIn, wrapPhoto } from \"../wrappers\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport Button from \"../button\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { MyPhoto } from \"../../lib/appManagers/appPhotosManager\";\r\nimport { readBlobAsDataURL } from \"../../helpers/blob\";\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\n\r\nconst ANIMATION_GROUP = 'INLINE-HELPER';\r\n// const GRID_ITEMS = 5;\r\n\r\nexport default class InlineHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private gifsMasonry: GifsMasonry;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private onChangeScreen: () => void;\r\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\r\n\r\n constructor(appendTo: HTMLElement, \r\n controller: AutocompleteHelperController,\r\n private chat: Chat,\r\n private appUsersManager: AppUsersManager,\r\n private appInlineBotsManager: AppInlineBotsManager) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n onSelect: (target) => {\r\n const {peerId, botId, queryId} = this.list.dataset;\r\n return this.chat.input.getReadyToSend(() => {\r\n const queryAndResultIds = this.appInlineBotsManager.generateQId(queryId, (target as HTMLElement).dataset.resultId);\r\n this.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\r\n clearDraft: true,\r\n scheduleDate: this.chat.input.scheduleDate,\r\n silent: this.chat.input.sendSilent,\r\n replyToMsgId: this.chat.input.replyToMsgId\r\n });\r\n\r\n this.chat.input.onMessageSent(true, true);\r\n });\r\n }\r\n });\r\n\r\n this.container.classList.add('inline-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0); \r\n });\r\n\r\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n });\r\n }\r\n\r\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n const peer = await this.appUsersManager.resolveUsername(username);\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(peer._ !== 'user') {\r\n throw 'NOT_A_BOT';\r\n }\r\n\r\n const renderPromise = this.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then(botResults => {\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const list = this.list.cloneNode() as HTMLElement;\r\n list.dataset.peerId = '' + peerId;\r\n list.dataset.botId = '' + peer.id;\r\n list.dataset.queryId = '' + botResults.query_id;\r\n\r\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\r\n\r\n this.lazyLoadQueue.clear();\r\n this.superStickerRenderer.clear();\r\n \r\n const loadPromises: Promise[] = [];\r\n const isGallery = !!botResults.pFlags.gallery;\r\n // botResults.results.length = 3;\r\n for(const item of botResults.results) {\r\n const container = document.createElement('div');\r\n container.classList.add('inline-helper-result');\r\n container.dataset.resultId = item.id;\r\n \r\n const preview = isGallery ? undefined : document.createElement('div');\r\n if(preview) {\r\n preview.classList.add('inline-helper-result-preview');\r\n\r\n container.append(preview);\r\n }\r\n\r\n list.append(container);\r\n\r\n if(!isGallery) {\r\n preview.classList.add('empty');\r\n preview.innerHTML = RichTextProcessor.wrapEmojiText([...item.title.trim()][0]);\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('inline-helper-result-title');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(item.title);\r\n \r\n const description = document.createElement('div');\r\n description.classList.add('inline-helper-result-description');\r\n description.innerHTML = RichTextProcessor.wrapRichText(item.description, {\r\n noCommands: true,\r\n noLinks: true\r\n });\r\n \r\n container.append(title, description);\r\n \r\n const separator = document.createElement('div');\r\n separator.classList.add('inline-helper-separator');\r\n \r\n list.append(separator);\r\n } else {\r\n container.classList.add('grid-item');\r\n }\r\n \r\n if(item._ === 'botInlineResult') {\r\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\r\n let mediaContainer: HTMLElement;\r\n if(preview) {\r\n mediaContainer = document.createElement('div');\r\n preview.append(mediaContainer);\r\n } else {\r\n mediaContainer = container;\r\n }\r\n\r\n mediaContainer.classList.add('media-container'); \r\n isGallery && mediaContainer.classList.add('no-border-radius');\r\n\r\n this.lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n return appDownloadManager.download({\r\n dcId: 4,\r\n location: {\r\n _: 'inputWebFileLocation',\r\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\r\n url: item.thumb.url\r\n },\r\n size: item.thumb.size,\r\n mimeType: item.thumb.mime_type\r\n }).then(blob => {\r\n const image = new Image();\r\n image.classList.add('media-photo');\r\n readBlobAsDataURL(blob).then(dataURL => {\r\n renderImageWithFadeIn(mediaContainer, image, dataURL, true);\r\n });\r\n });\r\n }\r\n });\r\n }\r\n } else {\r\n const media = item.document as MyDocument || item.photo as MyPhoto;\r\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\r\n assumeType(media);\r\n\r\n if(media.type === 'gif') {\r\n gifsMasonry.add(media, container);\r\n } else if(media.type === 'sticker') {\r\n container.classList.add('super-sticker');\r\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\r\n if(media.sticker === 2) {\r\n this.superStickerRenderer.observeAnimatedDiv(container);\r\n }\r\n }\r\n } else if(media) {\r\n const size = isGallery ? 48 : undefined;\r\n isGallery && container.classList.add('no-border-radius');\r\n wrapPhoto({\r\n photo: media,\r\n container: isGallery ? container : preview,\r\n boxWidth: size,\r\n boxHeight: size,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n }\r\n }\r\n }\r\n\r\n return Promise.all(loadPromises).then(() => {\r\n if(!middleware()) {\r\n gifsMasonry.clear();\r\n return;\r\n }\r\n\r\n list.classList.toggle('is-gallery', isGallery);\r\n list.classList.toggle('super-stickers', isGallery);\r\n this.container.classList.toggle('is-gallery', isGallery);\r\n\r\n /* if(isGallery) {\r\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\r\n }\r\n\r\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\r\n\r\n const parent = this.list.parentElement;\r\n parent.textContent = '';\r\n if(botResults.switch_pm) {\r\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\r\n btnSwitchToPM.insertAdjacentHTML('beforeend', RichTextProcessor.wrapEmojiText(botResults.switch_pm.text));\r\n attachClickEvent(btnSwitchToPM, (e) => {\r\n this.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\r\n });\r\n parent.append(btnSwitchToPM);\r\n }\r\n parent.append(this.list = list);\r\n\r\n if(this.gifsMasonry) {\r\n this.gifsMasonry.detach();\r\n }\r\n this.gifsMasonry = gifsMasonry;\r\n gifsMasonry.attach();\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n if(this.list.classList.contains('is-gallery')) {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n } else {\r\n this.list.style.width = '';\r\n }\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n \r\n this.toggle(!botResults.results.length && !botResults.switch_pm);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n\r\n return {user: peer, renderPromise};\r\n };\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('inline-helper-results');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppNotificationsManager } from '../../lib/appManagers/appNotificationsManager';\r\nimport type { AppChatsManager } from '../../lib/appManagers/appChatsManager';\r\nimport type { AppDocsManager, MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from '../../lib/appManagers/appPeersManager';\r\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\r\nimport type { AppImManager } from '../../lib/appManagers/appImManager';\r\nimport type { AppDraftsManager, MyDraftMessage } from '../../lib/appManagers/appDraftsManager';\r\nimport type { AppEmojiManager } from '../../lib/appManagers/appEmojiManager';\r\nimport type { ServerTimeManager } from '../../lib/mtproto/serverTimeManager';\r\nimport type { AppUsersManager } from '../../lib/appManagers/appUsersManager';\r\nimport type { AppInlineBotsManager } from '../../lib/appManagers/appInlineBotsManager';\r\nimport type { AppMessagesIdsManager } from '../../lib/appManagers/appMessagesIdsManager';\r\nimport type Chat from './chat';\r\nimport Recorder from '../../../public/recorder.min';\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport apiManager from \"../../lib/mtproto/mtprotoworker\";\r\n//import Recorder from '../opus-recorder/dist/recorder.min';\r\nimport opusDecodeController from \"../../lib/opusDecodeController\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from '../buttonMenu';\r\nimport emoticonsDropdown from \"../emoticonsDropdown\";\r\nimport PopupCreatePoll from \"../popups/createPoll\";\r\nimport PopupForward from '../popups/forward';\r\nimport PopupNewMedia from '../popups/newMedia';\r\nimport { toast } from \"../toast\";\r\nimport { wrapReply } from \"../wrappers\";\r\nimport InputField from '../inputField';\r\nimport { MessageEntity, DraftMessage, WebPage, Message } from '../../layer';\r\nimport StickersHelper from './stickersHelper';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport ButtonMenuToggle from '../buttonMenuToggle';\r\nimport ListenerSetter, { Listener } from '../../helpers/listenerSetter';\r\nimport Button from '../button';\r\nimport PopupSchedule from '../popups/schedule';\r\nimport SendMenu from './sendContextMenu';\r\nimport rootScope from '../../lib/rootScope';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport { tsNow } from '../../helpers/date';\r\nimport appNavigationController, { NavigationItem } from '../appNavigationController';\r\nimport { IS_MOBILE, IS_MOBILE_SAFARI } from '../../environment/userAgent';\r\nimport I18n, { i18n, join, LangPackKey } from '../../lib/langPack';\r\nimport { generateTail } from './bubbles';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport ButtonCorner from '../buttonCorner';\r\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\r\nimport { cancelEvent } from '../../helpers/dom/cancelEvent';\r\nimport cancelSelection from '../../helpers/dom/cancelSelection';\r\nimport { attachClickEvent, simulateClickEvent } from '../../helpers/dom/clickEvent';\r\nimport getRichValue from '../../helpers/dom/getRichValue';\r\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\r\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\r\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\r\nimport { MarkdownType, markdownTags } from '../../helpers/dom/getRichElementValue';\r\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\r\nimport EmojiHelper from './emojiHelper';\r\nimport CommandsHelper from './commandsHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport MentionsHelper from './mentionsHelper';\r\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\r\nimport { emojiFromCodePoints } from '../../vendor/emoji';\r\nimport ReplyKeyboard from './replyKeyboard';\r\nimport InlineHelper from './inlineHelper';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport noop from '../../helpers/noop';\r\nimport { openBtnMenu, putPreloader } from '../misc';\r\nimport SetTransition from '../singleTransition';\r\nimport PeerTitle from '../peerTitle';\r\nimport { fastRaf } from '../../helpers/schedulers';\r\nimport PopupDeleteMessages from '../popups/deleteMessages';\r\nimport fixSafariStickyInputFocusing, { IS_STICKY_INPUT_BUGGED } from '../../helpers/dom/fixSafariStickyInputFocusing';\r\nimport { copy } from '../../helpers/object';\r\nimport PopupPeer from '../popups/peer';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\r\nimport appMediaPlaybackController from '../appMediaPlaybackController';\r\nimport { 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\n\r\nconst RECORD_MIN_TIME = 500;\r\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\r\n\r\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\r\n\r\nexport default class ChatInput {\r\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\r\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\r\n public messageInput: HTMLElement;\r\n public messageInputField: InputField;\r\n private fileInput: HTMLInputElement;\r\n private inputMessageContainer: HTMLDivElement;\r\n private btnSend: HTMLButtonElement;\r\n private btnCancelRecord: HTMLButtonElement;\r\n private lastUrl = '';\r\n private lastTimeType = 0;\r\n\r\n public chatInput: HTMLElement;\r\n private 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: HTMLButtonElement;\r\n private attachMenuButtons: (ButtonMenuItemOptions & {verify: (peerId: PeerId, threadId: number) => boolean})[];\r\n\r\n private sendMenu: SendMenu;\r\n\r\n private replyElements: {\r\n container: HTMLElement,\r\n cancelBtn: HTMLButtonElement,\r\n iconBtn: HTMLButtonElement\r\n } = {} as any;\r\n\r\n private forwardElements: {\r\n changePeer: ButtonMenuItemOptions,\r\n showSender: ButtonMenuItemOptions,\r\n hideSender: ButtonMenuItemOptions,\r\n showCaption: ButtonMenuItemOptions,\r\n hideCaption: ButtonMenuItemOptions,\r\n container: HTMLElement,\r\n modifyArgs?: ButtonMenuItemOptions[]\r\n }; \r\n private forwardHover: DropdownHover;\r\n private forwardWasDroppingAuthor: boolean;\r\n\r\n private getWebPagePromise: Promise;\r\n private willSendWebPage: WebPage = null;\r\n private forwarding: {[fromPeerId: PeerId]: number[]};\r\n public replyToMsgId: number;\r\n public editMsgId: number;\r\n public editMessage: Message.message;\r\n private noWebPage: true;\r\n public scheduleDate: number;\r\n public sendSilent: true;\r\n\r\n private recorder: any;\r\n public recording = false;\r\n private recordCanceled = false;\r\n private recordTimeEl: HTMLElement;\r\n private recordRippleEl: HTMLElement;\r\n private recordStartTime = 0;\r\n private recordingOverlayListener: Listener;\r\n private recordingNavigationItem: NavigationItem;\r\n\r\n // private scrollTop = 0;\r\n // private scrollOffsetTop = 0;\r\n // private scrollDiff = 0;\r\n\r\n public helperType: Exclude;\r\n private helperFunc: () => void;\r\n private helperWaitingForward: boolean;\r\n\r\n public willAttachType: 'document' | 'media';\r\n\r\n private lockRedo = false;\r\n private canRedoFromHTML = '';\r\n private readonly undoHistory: string[] = [];\r\n private readonly executedHistory: string[] = [];\r\n private canUndoFromHTML = '';\r\n\r\n private autocompleteHelperController: AutocompleteHelperController;\r\n private stickersHelper: StickersHelper;\r\n private emojiHelper: EmojiHelper;\r\n private commandsHelper: CommandsHelper;\r\n private mentionsHelper: MentionsHelper;\r\n private inlineHelper: InlineHelper;\r\n private listenerSetter: ListenerSetter;\r\n\r\n private pinnedControlBtn: HTMLButtonElement;\r\n\r\n private goDownBtn: HTMLButtonElement;\r\n private goDownUnreadBadge: HTMLElement;\r\n private goMentionBtn: HTMLButtonElement;\r\n private goMentionUnreadBadge: HTMLSpanElement;\r\n private btnScheduled: HTMLButtonElement;\r\n\r\n private btnPreloader: HTMLButtonElement;\r\n\r\n private saveDraftDebounced: () => void;\r\n\r\n private fakeRowsWrapper: HTMLDivElement;\r\n private fakePinnedControlBtn: HTMLElement;\r\n\r\n private previousQuery: string;\r\n \r\n private releaseMediaPlayback: () => void;\r\n\r\n constructor(private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appMessagesIdsManager: AppMessagesIdsManager, \r\n private appDocsManager: AppDocsManager, \r\n private appChatsManager: AppChatsManager, \r\n private appPeersManager: AppPeersManager, \r\n private appWebPagesManager: AppWebPagesManager, \r\n private appImManager: AppImManager, \r\n private appDraftsManager: AppDraftsManager, \r\n private serverTimeManager: ServerTimeManager, \r\n private appNotificationsManager: AppNotificationsManager,\r\n private appEmojiManager: AppEmojiManager,\r\n private appUsersManager: AppUsersManager,\r\n private appInlineBotsManager: AppInlineBotsManager\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public construct() {\r\n this.chatInput = document.createElement('div');\r\n this.chatInput.classList.add('chat-input');\r\n this.chatInput.style.display = 'none';\r\n\r\n this.inputContainer = document.createElement('div');\r\n this.inputContainer.classList.add('chat-input-container');\r\n\r\n this.rowsWrapper = document.createElement('div');\r\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\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 = document.createElement('div');\r\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\r\n\r\n this.inputContainer.append(this.rowsWrapper, fakeRowsWrapper, fakeSelectionWrapper);\r\n this.chatInput.append(this.inputContainer);\r\n\r\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button bubbles-go-down hide'});\r\n this.inputContainer.append(this.goDownBtn);\r\n\r\n attachClickEvent(this.goDownBtn, (e) => {\r\n cancelEvent(e);\r\n this.chat.bubbles.onGoDownClick();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n // * constructor end\r\n\r\n /* let setScrollTopTimeout: number;\r\n // @ts-ignore\r\n let height = window.visualViewport.height; */\r\n // @ts-ignore\r\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n // const wasScrolledDown = scrollable.isScrolledDown;\r\n \r\n // /* if(wasScrolledDown) {\r\n // this.saveScroll();\r\n // } */\r\n \r\n // // @ts-ignore\r\n // let newHeight = window.visualViewport.height;\r\n // const diff = height - newHeight;\r\n // const scrollTop = scrollable.scrollTop;\r\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n\r\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n // setScrollTopTimeout = window.setTimeout(() => {\r\n // const diff = height - newHeight;\r\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\r\n // height = newHeight;\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n \r\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n\r\n // /* if(isScrolledDown) {\r\n // scrollable.scrollTop = scrollable.scrollHeight;\r\n // } */\r\n\r\n // //scrollable.scrollTop += diff;\r\n // setScrollTopTimeout = 0;\r\n // }, 0);\r\n // });\r\n\r\n // ! Can't use it with resizeObserver\r\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n const scrollable = this.chat.bubbles.scrollable;\r\n const wasScrolledDown = scrollable.isScrolledDown;\r\n\r\n // @ts-ignore\r\n let newHeight = window.visualViewport.height;\r\n const diff = height - newHeight;\r\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n scrollable.scrollTop = needScrollTop;\r\n height = newHeight;\r\n\r\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\r\n scrollable.scrollTop = needScrollTop;\r\n \r\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n setScrollTopTimeout = 0;\r\n }, 0);\r\n }); */\r\n }\r\n\r\n public constructPeerHelpers() {\r\n this.replyElements.container = document.createElement('div');\r\n this.replyElements.container.classList.add('reply-wrapper');\r\n\r\n this.replyElements.iconBtn = ButtonIcon('');\r\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\r\n\r\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\r\n\r\n //\r\n\r\n const onHideAuthorClick = () => {\r\n isChangingAuthor = true;\r\n return this.canToggleHideAuthor();\r\n };\r\n\r\n const onHideCaptionClick = () => {\r\n isChangingAuthor = false;\r\n };\r\n\r\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\r\n let isChangingAuthor = false;\r\n const forwardButtons: ButtonMenuItemOptions[] = [\r\n forwardElements.showSender = {\r\n text: 'Chat.Alert.Forward.Action.Show1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideSender = {\r\n text: 'Chat.Alert.Forward.Action.Hide1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.showCaption = {\r\n text: 'Chat.Alert.Forward.Action.ShowCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideCaption = {\r\n text: 'Chat.Alert.Forward.Action.HideCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.changePeer = {\r\n text: 'Chat.Alert.Forward.Action.Another',\r\n onClick: () => {\r\n this.changeForwardRecipient();\r\n },\r\n icon: 'replace'\r\n }\r\n ];\r\n const forwardBtnMenu = forwardElements.container = ButtonMenu(forwardButtons, this.listenerSetter);\r\n // forwardBtnMenu.classList.add('top-center');\r\n\r\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\r\n const groups: {\r\n elements: HTMLElement[],\r\n onChange: (value: string, event: Event) => void\r\n }[] = [{\r\n elements: children.slice(0, 2),\r\n onChange: (value, e) => {\r\n const checked = !!+value;\r\n if(isChangingAuthor) {\r\n this.forwardWasDroppingAuthor = !checked;\r\n }\r\n\r\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\r\n if(replyTitle) {\r\n const el = replyTitle.firstElementChild as HTMLElement;\r\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\r\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n i.key = langPackKey;\r\n i.update();\r\n }\r\n }\r\n }, {\r\n elements: children.slice(2, 4),\r\n onChange: (value) => {\r\n const checked = !!+value;\r\n let b: ButtonMenuItemOptions;\r\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\r\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\r\n } else {\r\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\r\n }\r\n\r\n b.checkboxField.checked = true;\r\n }\r\n }];\r\n groups.forEach(group => {\r\n const container = RadioForm(group.elements.map(e => {\r\n return {\r\n container: e, \r\n input: e.querySelector('input')\r\n };\r\n }), group.onChange);\r\n\r\n const hr = document.createElement('hr');\r\n container.append(hr);\r\n forwardBtnMenu.append(container);\r\n });\r\n\r\n forwardBtnMenu.append(forwardElements.changePeer.element);\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const forwardHover = this.forwardHover = new DropdownHover({\r\n element: forwardBtnMenu\r\n });\r\n }\r\n\r\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\r\n this.replyElements.container.append(forwardBtnMenu);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const {input} = b.checkboxField;\r\n input.type = 'radio';\r\n input.name = idx < 2 ? 'author' : 'caption';\r\n input.value = '' + +!(idx % 2);\r\n });\r\n\r\n //\r\n\r\n this.newMessageWrapper = document.createElement('div');\r\n this.newMessageWrapper.classList.add('new-message-wrapper');\r\n\r\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\r\n\r\n this.inputMessageContainer = document.createElement('div');\r\n this.inputMessageContainer.classList.add('input-message-container');\r\n\r\n if(this.chat.type === 'chat') {\r\n this.goDownUnreadBadge = document.createElement('span');\r\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goDownBtn.append(this.goDownUnreadBadge);\r\n\r\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button bubbles-go-mention'});\r\n this.goMentionUnreadBadge = document.createElement('span');\r\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goMentionBtn.append(this.goMentionUnreadBadge);\r\n this.inputContainer.append(this.goMentionBtn);\r\n\r\n attachClickEvent(this.goMentionBtn, (e) => {\r\n cancelEvent(e);\r\n this.appMessagesManager.goToNextMention(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\r\n\r\n attachClickEvent(this.btnScheduled, (e) => {\r\n this.appImManager.openScheduled(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.btnScheduled.classList.remove('hide');\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.appMessagesManager.getScheduledMessages(this.chat.peerId).then(value => {\r\n this.btnScheduled.classList.toggle('hide', !value.length);\r\n });\r\n });\r\n\r\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\r\n this.replyKeyboard = new ReplyKeyboard({\r\n appendTo: this.rowsWrapper,\r\n listenerSetter: this.listenerSetter,\r\n appMessagesManager: this.appMessagesManager,\r\n btnHover: this.btnToggleReplyMarkup,\r\n chatInput: this\r\n });\r\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\r\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\r\n }\r\n\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: (peerId, threadId) => this.appMessagesManager.canSendToPeer(peerId, threadId, '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: (peerId, threadId) => this.appMessagesManager.canSendToPeer(peerId, threadId, 'send_media')\r\n }, {\r\n icon: 'poll',\r\n text: 'Poll',\r\n onClick: () => {\r\n new PopupCreatePoll(this.chat).show();\r\n },\r\n verify: (peerId, threadId) => peerId.isAnyChat() && this.appMessagesManager.canSendToPeer(peerId, threadId, '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.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\r\n\r\n this.rowsWrapper.append(this.replyElements.container);\r\n this.autocompleteHelperController = new AutocompleteHelperController();\r\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController);\r\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.appEmojiManager);\r\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.chat.appProfileManager, this.chat.appUsersManager);\r\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.chat.appProfileManager, this.chat.appUsersManager);\r\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.appUsersManager, this.appInlineBotsManager);\r\n this.rowsWrapper.append(this.newMessageWrapper);\r\n\r\n this.btnCancelRecord = ButtonIcon('delete danger btn-circle z-depth-1 btn-record-cancel');\r\n\r\n this.btnSendContainer = document.createElement('div');\r\n this.btnSendContainer.classList.add('btn-send-container');\r\n\r\n this.recordRippleEl = document.createElement('div');\r\n this.recordRippleEl.classList.add('record-ripple');\r\n\r\n this.btnSend = ButtonIcon('none btn-circle z-depth-1 btn-send animated-button-icon');\r\n this.btnSend.insertAdjacentHTML('afterbegin', `\r\n \r\n \r\n \r\n \r\n `);\r\n\r\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n this.sendMenu = new SendMenu({\r\n onSilentClick: () => {\r\n this.sendSilent = true;\r\n this.sendMessage();\r\n },\r\n onScheduleClick: () => {\r\n this.scheduleSending(undefined);\r\n },\r\n listenerSetter: this.listenerSetter,\r\n openSide: 'top-left',\r\n onContextElement: this.btnSend,\r\n onOpen: () => {\r\n return !this.isInputEmpty() || !!Object.keys(this.forwarding).length;\r\n }\r\n });\r\n \r\n this.btnSendContainer.append(this.sendMenu.sendMenu);\r\n }\r\n\r\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\r\n\r\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\r\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\r\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\r\n\r\n this.attachMessageInputField();\r\n\r\n /* this.attachMenu.addEventListener('mousedown', (e) => {\r\n const hidden = this.attachMenu.querySelectorAll('.hide');\r\n if(hidden.length === this.attachMenuButtons.length) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n cancelEvent(e);\r\n return false;\r\n }\r\n }, {passive: false, capture: true}); */\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', () => {\r\n if(this.stickersHelper || this.emojiHelper) {\r\n // this.previousQuery = undefined;\r\n this.previousQuery = '';\r\n this.checkAutocomplete();\r\n /* if(!rootScope.settings.stickers.suggest) {\r\n this.stickersHelper.checkEmoticon('');\r\n } else {\r\n this.onMessageInput();\r\n } */\r\n }\r\n\r\n if(this.messageInputField) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\r\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId) return;\r\n this.setDraft(draft, true, force);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_changing', (chat) => {\r\n if(this.chat === chat) {\r\n this.saveDraft();\r\n }\r\n });\r\n\r\n 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 });\r\n }\r\n\r\n try {\r\n this.recorder = new Recorder({\r\n //encoderBitRate: 32,\r\n //encoderPath: \"../dist/encoderWorker.min.js\",\r\n encoderSampleRate: 48000,\r\n monitorGain: 0,\r\n numberOfChannels: 1,\r\n recordingGain: 1,\r\n reuseWorker: true\r\n });\r\n } catch(err) {\r\n console.error('Recorder constructor error:', err);\r\n }\r\n\r\n this.updateSendBtn();\r\n\r\n this.listenerSetter.add(this.fileInput)('change', (e) => {\r\n let files = (e.target as HTMLInputElement & EventTarget).files;\r\n if(!files.length) {\r\n return;\r\n }\r\n \r\n new PopupNewMedia(this.chat, Array.from(files).slice(), this.willAttachType);\r\n this.fileInput.value = '';\r\n }, false);\r\n\r\n /* let time = Date.now();\r\n this.btnSend.addEventListener('touchstart', (e) => {\r\n time = Date.now();\r\n });\r\n\r\n let eventName1 = 'touchend';\r\n this.btnSend.addEventListener(eventName1, (e: Event) => {\r\n //cancelEvent(e);\r\n console.log(eventName1 + ', time: ' + (Date.now() - time));\r\n });\r\n\r\n let eventName = 'mousedown';\r\n this.btnSend.addEventListener(eventName, (e: Event) => {\r\n cancelEvent(e);\r\n console.log(eventName + ', time: ' + (Date.now() - time));\r\n }); */\r\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\r\n\r\n if(this.recorder) {\r\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.recorder.onstop = () => {\r\n this.recording = false;\r\n this.chatInput.classList.remove('is-recording', 'is-locked');\r\n this.updateSendBtn();\r\n this.recordRippleEl.style.transform = '';\r\n };\r\n \r\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\r\n if(this.releaseMediaPlayback) {\r\n this.releaseMediaPlayback();\r\n this.releaseMediaPlayback = undefined;\r\n }\r\n\r\n if(this.recordingOverlayListener) {\r\n this.listenerSetter.remove(this.recordingOverlayListener);\r\n this.recordingOverlayListener = undefined;\r\n }\r\n\r\n if(this.recordingNavigationItem) {\r\n appNavigationController.removeItem(this.recordingNavigationItem);\r\n this.recordingNavigationItem = undefined;\r\n }\r\n\r\n if(this.recordCanceled) {\r\n return;\r\n }\r\n\r\n const {peerId, threadId} = this.chat;\r\n const replyToMsgId = this.replyToMsgId;\r\n \r\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\r\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\r\n /* const fileName = new Date().toISOString() + \".opus\";\r\n console.log('Recorder data received', typedArray, dataBlob); */\r\n\r\n //let perf = performance.now();\r\n opusDecodeController.decode(typedArray, true).then(result => {\r\n //console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\r\n \r\n opusDecodeController.setKeepAlive(false);\r\n \r\n // тут objectURL ставится уже с audio/wav\r\n this.appMessagesManager.sendFile(peerId, dataBlob, {\r\n isVoiceMessage: true,\r\n isMedia: true,\r\n duration,\r\n waveform: result.waveform,\r\n objectURL: result.url,\r\n replyToMsgId,\r\n threadId,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, true);\r\n });\r\n };\r\n }\r\n\r\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\r\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n const container = document.createElement('div');\r\n container.classList.add('pinned-container');\r\n\r\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold pinned-container-button', {icon: 'unpin'});\r\n container.append(this.pinnedControlBtn);\r\n\r\n const fakeContainer = container.cloneNode(true);\r\n this.fakePinnedControlBtn = fakeContainer.firstChild as HTMLElement;\r\n this.fakeRowsWrapper.append(fakeContainer);\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(NULL_PEER_ID); // * 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.rowsWrapper.append(container);\r\n\r\n this.chatInput.classList.add('type-pinned');\r\n this.rowsWrapper.classList.add('is-centered');\r\n }\r\n\r\n private onCancelRecordClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n this.recordCanceled = true;\r\n this.recorder.stop();\r\n opusDecodeController.setKeepAlive(false);\r\n };\r\n\r\n private onEmoticonsOpen = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\r\n };\r\n\r\n private onEmoticonsClose = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\r\n };\r\n\r\n public getReadyToSend(callback: () => void) {\r\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\r\n }\r\n\r\n public scheduleSending = (callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\r\n const {peerId} = this.chat;\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && this.appUsersManager.isUserOnlineVisible(peerId);\r\n\r\n new PopupSchedule(initDate, (timestamp) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\r\n if(timestamp <= minTimestamp) {\r\n timestamp = undefined;\r\n }\r\n\r\n this.scheduleDate = timestamp;\r\n callback();\r\n\r\n if(this.chat.type !== 'scheduled' && timestamp) {\r\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.appImManager.openScheduled(peerId);\r\n }, 0);\r\n }\r\n }, canSendWhenOnline).show();\r\n };\r\n\r\n public setUnreadCount() {\r\n const dialog = this.appMessagesManager.getDialogOnly(this.chat.peerId);\r\n const count = dialog?.unread_count;\r\n this.goDownUnreadBadge.innerText = '' + (count || '');\r\n this.goDownUnreadBadge.classList.toggle('badge-gray', this.appNotificationsManager.isPeerLocalMuted(this.chat.peerId, true));\r\n\r\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\r\n const hasMentions = !!dialog?.unread_mentions_count;\r\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\r\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\r\n }\r\n }\r\n\r\n public saveDraft() {\r\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\r\n \r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n let draft: DraftMessage.draftMessage;\r\n if(value.length || this.replyToMsgId) {\r\n draft = {\r\n _: 'draftMessage',\r\n date: tsNow(true) + this.serverTimeManager.serverTimeOffset,\r\n message: value,\r\n entities: entities.length ? entities : undefined,\r\n pFlags: {\r\n no_webpage: this.noWebPage\r\n },\r\n reply_to_msg_id: this.replyToMsgId\r\n };\r\n }\r\n\r\n this.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Input destroying');\r\n\r\n this.listenerSetter.removeAll();\r\n }\r\n\r\n public cleanup(helperToo = true) {\r\n if(!this.chat.peerId) {\r\n this.chatInput.style.display = 'none';\r\n this.goDownBtn.classList.add('hide');\r\n }\r\n\r\n cancelSelection();\r\n\r\n this.lastTimeType = 0;\r\n\r\n if(this.messageInput) {\r\n this.clearInput();\r\n helperToo && this.clearHelper();\r\n }\r\n }\r\n\r\n public setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\r\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\r\n \r\n if(!draft) {\r\n draft = this.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\r\n\r\n if(!draft) {\r\n if(force) { // this situation can only happen when sending message with clearDraft\r\n /* const height = this.chatInput.getBoundingClientRect().height;\r\n const willChangeHeight = 78 - height;\r\n this.willChangeHeight = willChangeHeight; */\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n this.t();\r\n }\r\n\r\n this.messageInputField.inputFake.textContent = '';\r\n this.messageInputField.onFakeInput(false);\r\n\r\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\r\n fastRaf(() => {\r\n this.onMessageSent();\r\n });\r\n });\r\n }\r\n \r\n return false;\r\n }\r\n }\r\n\r\n if(this.messageInputField.value === draft.rMessage && this.replyToMsgId === draft.reply_to_msg_id) return false;\r\n\r\n if(fromUpdate) {\r\n this.clearHelper();\r\n }\r\n\r\n this.noWebPage = draft.pFlags.no_webpage;\r\n if(draft.reply_to_msg_id) {\r\n this.initMessageReply(draft.reply_to_msg_id);\r\n }\r\n\r\n this.setInputValue(draft.rMessage, fromUpdate, fromUpdate);\r\n return true;\r\n }\r\n\r\n public finishPeerChange() {\r\n const peerId = this.chat.peerId;\r\n\r\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput} = this;\r\n chatInput.style.display = '';\r\n \r\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\r\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\r\n goDownBtn.classList.remove('hide');\r\n\r\n if(this.goDownUnreadBadge) {\r\n this.setUnreadCount();\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n chatInput.classList.toggle('can-pin', this.appPeersManager.canPinMessage(peerId));\r\n }/* else if(this.chat.type === 'chat') {\r\n } */\r\n\r\n if(forwardElements) {\r\n this.forwardWasDroppingAuthor = false;\r\n forwardElements.showCaption.checkboxField.setValueSilently(true);\r\n forwardElements.showSender.checkboxField.setValueSilently(true);\r\n }\r\n\r\n if(btnScheduled) {\r\n btnScheduled.classList.add('hide');\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n this.appMessagesManager.getScheduledMessages(peerId).then(mids => {\r\n if(!middleware()) return;\r\n btnScheduled.classList.toggle('hide', !mids.length);\r\n });\r\n }\r\n\r\n if(replyKeyboard) {\r\n replyKeyboard.setPeer(peerId);\r\n }\r\n\r\n if(sendMenu) {\r\n sendMenu.setPeerId(peerId);\r\n }\r\n\r\n if(this.messageInput) {\r\n this.updateMessageInput();\r\n } else if(this.pinnedControlBtn) {\r\n if(this.appPeersManager.canPinMessage(this.chat.peerId)) {\r\n this.pinnedControlBtn.append(i18n('Chat.Input.UnpinAll'));\r\n this.fakePinnedControlBtn.append(i18n('Chat.Input.UnpinAll'));\r\n } else {\r\n this.pinnedControlBtn.append(i18n('Chat.Pinned.DontShow'));\r\n this.fakePinnedControlBtn.append(i18n('Chat.Pinned.DontShow'));\r\n }\r\n }\r\n }\r\n\r\n public updateMessageInput() {\r\n const {chatInput, attachMenu, messageInput} = this;\r\n const {peerId, threadId} = this.chat;\r\n const canWrite = this.appMessagesManager.canSendToPeer(peerId, threadId);\r\n chatInput.classList.add('no-transition');\r\n chatInput.classList.toggle('is-hidden', !canWrite);\r\n void chatInput.offsetLeft; // reflow\r\n chatInput.classList.remove('no-transition');\r\n\r\n const i = I18n.weakMap.get(messageInput) as I18n.IntlElement;\r\n if(i) {\r\n let key: LangPackKey;\r\n if(threadId) {\r\n key = 'Comment';\r\n } else if(this.appPeersManager.isBroadcast(peerId)) {\r\n key = 'ChannelBroadcast';\r\n } else if(this.appMessagesManager.isAnonymousSending(peerId)) {\r\n key = 'SendAnonymously';\r\n } else {\r\n key = 'Message';\r\n }\r\n\r\n if(i.key !== key) {\r\n i.key = key;\r\n i.update();\r\n }\r\n }\r\n\r\n const visible = this.attachMenuButtons.filter(button => {\r\n const good = button.verify(peerId, threadId);\r\n button.element.classList.toggle('hide', !good);\r\n return good;\r\n });\r\n\r\n if(!canWrite) {\r\n messageInput.removeAttribute('contenteditable');\r\n } else {\r\n messageInput.setAttribute('contenteditable', 'true');\r\n this.setDraft(undefined, false);\r\n\r\n if(!messageInput.innerHTML) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n }\r\n \r\n attachMenu.toggleAttribute('disabled', !visible.length);\r\n attachMenu.classList.toggle('btn-disabled', !visible.length);\r\n this.updateSendBtn();\r\n }\r\n\r\n private attachMessageInputField() {\r\n const oldInputField = this.messageInputField;\r\n this.messageInputField = new InputField({\r\n placeholder: 'Message',\r\n name: 'message',\r\n animate: true\r\n });\r\n\r\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInput = this.messageInputField.input;\r\n this.messageInput.classList.add('no-scrollbar');\r\n this.attachMessageInputListeners();\r\n \r\n if(IS_STICKY_INPUT_BUGGED) {\r\n fixSafariStickyInputFocusing(this.messageInput);\r\n }\r\n\r\n if(oldInputField) {\r\n oldInputField.input.replaceWith(this.messageInputField.input);\r\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\r\n } else {\r\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\r\n }\r\n }\r\n\r\n private attachMessageInputListeners() {\r\n this.listenerSetter.add(this.messageInput)('keydown', (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(isSendShortcutPressed(e)) {\r\n cancelEvent(e);\r\n this.sendMessage();\r\n } else if(e.ctrlKey || e.metaKey) {\r\n this.handleMarkdownShortcut(e);\r\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\r\n e.preventDefault();\r\n\r\n if(key === 'PageUp') {\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n \r\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\r\n range.collapse(true);\r\n \r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n } else {\r\n placeCaretAtEnd(this.messageInput);\r\n }\r\n }\r\n });\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(this.messageInput, (e) => {\r\n this.appImManager.selectTab(1); // * set chat tab for album orientation\r\n //this.saveScroll();\r\n emoticonsDropdown.toggle(false);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n /* this.listenerSetter.add(window)('resize', () => {\r\n this.restoreScroll();\r\n }); */\r\n\r\n /* if(isSafari) { \r\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\r\n window.requestAnimationFrame(() => {\r\n window.requestAnimationFrame(() => {\r\n emoticonsDropdown.toggle(false);\r\n });\r\n });\r\n });\r\n } */\r\n }\r\n\r\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n const inputType = (e as InputEvent).inputType;\r\n //console.log('message beforeinput event', e);\r\n\r\n if(inputType.indexOf('format') === 0) {\r\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\r\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\r\n if(this.applyMarkdown(markdownType)) {\r\n cancelEvent(e); // * cancel legacy markdown event\r\n }\r\n }\r\n }); */\r\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\r\n this.listenerSetter.add(this.messageInput)('keyup', () => {\r\n this.checkAutocomplete();\r\n });\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n this.listenerSetter.add(this.messageInput)('focusin', () => {\r\n if(this.chat.bubbles.scrollable.loadedAll.bottom) {\r\n this.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\r\n }\r\n }); \r\n }\r\n }\r\n\r\n private prepareDocumentExecute = () => {\r\n this.executedHistory.push(this.messageInput.innerHTML);\r\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\r\n };\r\n\r\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\r\n cancelEvent(e); // cancel legacy event\r\n\r\n let html = this.messageInput.innerHTML;\r\n if(html && html !== needHTML) {\r\n this.lockRedo = true;\r\n\r\n let sameHTMLTimes = 0;\r\n do {\r\n document.execCommand(type, false, null);\r\n const currentHTML = this.messageInput.innerHTML;\r\n if(html === currentHTML) {\r\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\r\n break;\r\n }\r\n } else {\r\n sameHTMLTimes = 0;\r\n }\r\n\r\n html = currentHTML;\r\n } while(html !== needHTML);\r\n\r\n this.lockRedo = false;\r\n }\r\n };\r\n\r\n public applyMarkdown(type: MarkdownType, href?: string) {\r\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\r\n bold: 'Bold',\r\n italic: 'Italic',\r\n underline: 'Underline',\r\n strikethrough: 'Strikethrough',\r\n monospace: () => document.execCommand('fontName', false, 'monospace'),\r\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null)\r\n };\r\n\r\n if(!commandsMap[type]) {\r\n return false;\r\n }\r\n\r\n const command = commandsMap[type];\r\n\r\n //type = 'monospace';\r\n\r\n const saveExecuted = this.prepareDocumentExecute();\r\n const executed: any[] = [];\r\n /**\r\n * * clear previous formatting, due to Telegram's inability to handle several entities\r\n */\r\n /* const checkForSingle = () => {\r\n const nodes = getSelectedNodes();\r\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\r\n\r\n const parents = [...new Set(nodes.map(node => node.parentNode))];\r\n //const differentParents = !!nodes.find(node => node.parentNode !== firstParent);\r\n const differentParents = parents.length > 1;\r\n\r\n let notSingle = false;\r\n if(differentParents) {\r\n notSingle = true;\r\n } else {\r\n const node = nodes[0];\r\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\r\n notSingle = true;\r\n }\r\n }\r\n\r\n if(notSingle) {\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n //}\r\n\r\n executed.push(document.execCommand('unlink', false, null));\r\n executed.push(document.execCommand('removeFormat', false, null));\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n //}\r\n }\r\n }; */\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n \r\n if(type === 'monospace') {\r\n let haveThisType = false;\r\n //executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const selection = window.getSelection();\r\n if(!selection.isCollapsed) {\r\n const range = selection.getRangeAt(0);\r\n const tag = markdownTags[type];\r\n\r\n const node = range.commonAncestorContainer;\r\n if((node.parentNode as HTMLElement).matches(tag.match) || (node instanceof HTMLElement && node.matches(tag.match))) {\r\n haveThisType = true;\r\n }\r\n }\r\n\r\n //executed.push(document.execCommand('removeFormat', false, null));\r\n\r\n if(haveThisType) {\r\n executed.push(document.execCommand('fontName', false, 'Roboto'));\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n\r\n //checkForSingle();\r\n saveExecuted();\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.setActiveMarkupButton();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\r\n // console.log('handleMarkdownShortcut', e);\r\n const formatKeys: {[key: string]: MarkdownType} = {\r\n 'KeyB': 'bold',\r\n 'KeyI': 'italic',\r\n 'KeyU': 'underline',\r\n 'KeyS': 'strikethrough',\r\n 'KeyM': 'monospace'\r\n };\r\n\r\n if(this.appImManager.markupTooltip) {\r\n formatKeys['KeyK'] = 'link';\r\n }\r\n\r\n const code = e.code;\r\n const applyMarkdown = formatKeys[code];\r\n\r\n const selection = document.getSelection();\r\n if(selection.toString().trim().length && applyMarkdown) {\r\n // * костыльчик\r\n if(code === 'KeyK') {\r\n this.appImManager.markupTooltip.showLinkEditor();\r\n } else {\r\n this.applyMarkdown(applyMarkdown);\r\n }\r\n \r\n cancelEvent(e); // cancel legacy event\r\n }\r\n\r\n //return;\r\n if(code === 'KeyZ') {\r\n let html = this.messageInput.innerHTML;\r\n\r\n if(e.shiftKey) {\r\n if(this.undoHistory.length) {\r\n this.executedHistory.push(html);\r\n html = this.undoHistory.pop();\r\n this.undoRedo(e, 'redo', html);\r\n html = this.messageInput.innerHTML;\r\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\r\n this.canUndoFromHTML = html;\r\n }\r\n } else {\r\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\r\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\r\n this.undoHistory.push(html);\r\n html = this.executedHistory.pop();\r\n this.undoRedo(e, 'undo', html);\r\n\r\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\r\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\r\n }\r\n }\r\n }\r\n };\r\n\r\n private onMessageInput = (e?: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n /* const inputType = (e as InputEvent).inputType;\r\n console.log('message input event', e);\r\n if(inputType === 'formatBold') {\r\n console.log('message input format', this.messageInput.innerHTML);\r\n cancelEvent(e);\r\n }\r\n\r\n if(!isSelectionSingle()) {\r\n alert('not single');\r\n } */\r\n\r\n //console.log('messageInput input', this.messageInput.innerText);\r\n //const value = this.messageInput.innerText;\r\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\r\n \r\n //const entities = RichTextProcessor.parseEntities(value);\r\n const value = RichTextProcessor.parseMarkdown(richValue, markdownEntities, true);\r\n const entities = RichTextProcessor.mergeEntities(markdownEntities, RichTextProcessor.parseEntities(value));\r\n\r\n //this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\r\n\r\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n }\r\n\r\n const urlEntities: Array = !this.editMessage?.media && entities.filter(e => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\r\n if(urlEntities.length) {\r\n for(const entity of urlEntities) {\r\n let url: string;\r\n if(entity._ === 'messageEntityTextUrl') {\r\n url = entity.url;\r\n } else {\r\n url = richValue.slice(entity.offset, entity.offset + entity.length);\r\n\r\n if(!(url.includes('http://') || url.includes('https://'))) {\r\n continue;\r\n }\r\n }\r\n\r\n //console.log('messageInput url:', url);\r\n\r\n if(this.lastUrl !== url) {\r\n this.lastUrl = url;\r\n // this.willSendWebPage = null;\r\n const promise = this.getWebPagePromise = apiManager.invokeApiHashable('messages.getWebPage', {\r\n url,\r\n }).then((webpage) => {\r\n webpage = this.appWebPagesManager.saveWebPage(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 if(!richValue.trim()) {\r\n if(this.lastTimeType) {\r\n this.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'});\r\n }\r\n\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.hide();\r\n }\r\n } else {\r\n const time = Date.now();\r\n if(time - this.lastTimeType >= 6000) {\r\n this.lastTimeType = time;\r\n this.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'});\r\n }\r\n }\r\n\r\n if(!this.editMsgId) {\r\n this.saveDraftDebounced();\r\n }\r\n\r\n this.checkAutocomplete(richValue, caretPos, entities);\r\n\r\n this.updateSendBtn();\r\n };\r\n\r\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\r\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\r\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\r\n const prefix = fullValue.substr(0, pos);\r\n const suffix = fullValue.substr(pos);\r\n\r\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\r\n\r\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\r\n const newPrefix = prefix.slice(0, matchIndex);\r\n const newValue = newPrefix + insertText + suffix;\r\n\r\n // merge emojis\r\n const hadEntities = RichTextProcessor.parseEntities(fullValue);\r\n RichTextProcessor.mergeEntities(entities, hadEntities);\r\n\r\n // max for additional whitespace\r\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\r\n const addEntities: MessageEntity[] = [];\r\n if(insertEntity) {\r\n addEntities.push(insertEntity);\r\n insertEntity.offset = matchIndex;\r\n }\r\n\r\n // add offset to entities next to emoji\r\n const diff = matches ? insertLength - matches[2].length : insertLength;\r\n entities.forEach(entity => {\r\n if(entity.offset >= matchIndex) {\r\n entity.offset += diff;\r\n }\r\n });\r\n\r\n RichTextProcessor.mergeEntities(entities, addEntities);\r\n\r\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\r\n const caretEntity: MessageEntity.messageEntityCaret = {\r\n _: 'messageEntityCaret',\r\n offset: matchIndex + insertLength,\r\n length: 0\r\n };\r\n\r\n let insertCaretAtIndex = 0;\r\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\r\n const entity = entities[insertCaretAtIndex];\r\n if(entity.offset > caretEntity.offset) {\r\n break;\r\n }\r\n }\r\n\r\n entities.splice(insertCaretAtIndex, 0, caretEntity);\r\n }\r\n\r\n //const saveExecuted = this.prepareDocumentExecute();\r\n // can't exec .value here because it will instantly check for autocomplete\r\n const value = RichTextProcessor.wrapDraftText(newValue, {entities});\r\n this.messageInputField.setValueSilently(value, true);\r\n\r\n const caret = this.messageInput.querySelector('.composer-sel');\r\n if(caret) {\r\n setCaretAt(caret);\r\n caret.remove();\r\n }\r\n\r\n // but it's needed to be checked only here\r\n this.onMessageInput();\r\n\r\n //saveExecuted();\r\n\r\n //document.execCommand('insertHTML', true, RichTextProcessor.wrapEmojiText(emoji));\r\n }\r\n\r\n public onEmojiSelected = (emoji: string, autocomplete: boolean) => {\r\n this.insertAtCaret(emoji, RichTextProcessor.getEmojiEntityFromEmoji(emoji), autocomplete);\r\n };\r\n\r\n private checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\r\n //return;\r\n\r\n if(value === undefined) {\r\n const r = getRichValueWithCaret(this.messageInputField.input, true);\r\n value = r.value;\r\n caretPos = r.caretPos;\r\n entities = r.entities;\r\n }\r\n\r\n if(caretPos === -1) {\r\n caretPos = value.length;\r\n }\r\n\r\n if(entities === undefined) {\r\n const _value = RichTextProcessor.parseMarkdown(value, entities, true);\r\n entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(_value));\r\n }\r\n\r\n value = value.substr(0, caretPos);\r\n\r\n if(this.previousQuery === value) {\r\n return;\r\n }\r\n\r\n this.previousQuery = value;\r\n \r\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\r\n let foundHelper: AutocompleteHelper;\r\n if(matches) {\r\n const entity = entities[0];\r\n\r\n let query = matches[2];\r\n const firstChar = query[0];\r\n\r\n if(this.stickersHelper && \r\n rootScope.settings.stickers.suggest && \r\n this.appMessagesManager.canSendToPeer(this.chat.peerId, this.chat.threadId, 'send_stickers') &&\r\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\r\n foundHelper = this.stickersHelper;\r\n this.stickersHelper.checkEmoticon(value);\r\n } else if(firstChar === '@') { // mentions\r\n const topMsgId = this.chat.threadId ? this.appMessagesIdsManager.getServerMessageId(this.chat.threadId) : undefined;\r\n if(this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\r\n foundHelper = this.mentionsHelper;\r\n }\r\n } else if(!matches[1] && firstChar === '/') { // commands\r\n if(this.commandsHelper.checkQuery(query, this.chat.peerId)) {\r\n foundHelper = this.commandsHelper;\r\n }\r\n } else if(rootScope.settings.emoji.suggest) { // emoji\r\n query = query.replace(/^\\s*/, '');\r\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\r\n foundHelper = this.emojiHelper;\r\n this.emojiHelper.checkQuery(query, firstChar);\r\n }\r\n }\r\n }\r\n \r\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\r\n\r\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\r\n }\r\n\r\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\r\n let needPlaceholder = false;\r\n\r\n if(!foundHelper) {\r\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\r\n if(inlineMatch) {\r\n const username = inlineMatch[1];\r\n const query = value.slice(inlineMatch[0].length);\r\n needPlaceholder = inlineMatch[0].length === value.length;\r\n \r\n foundHelper = this.inlineHelper;\r\n\r\n if(!this.btnPreloader) {\r\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\r\n putPreloader(this.btnPreloader, true);\r\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\r\n } else {\r\n SetTransition(this.btnPreloader, 'show', true, 400);\r\n }\r\n \r\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\r\n if(needPlaceholder && user.bot_inline_placeholder) {\r\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\r\n }\r\n\r\n renderPromise.then(() => {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n });\r\n }).catch(noop);\r\n }\r\n }\r\n \r\n if(!needPlaceholder) {\r\n delete this.messageInput.dataset.inlinePlaceholder;\r\n }\r\n\r\n if(foundHelper !== this.inlineHelper) {\r\n if(this.btnPreloader) {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n }\r\n }\r\n\r\n return foundHelper;\r\n }\r\n\r\n private onBtnSendClick = (e: Event) => {\r\n cancelEvent(e);\r\n\r\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\r\n if(this.recording) {\r\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\r\n this.onCancelRecordClick();\r\n } else {\r\n this.recorder.stop();\r\n }\r\n } else {\r\n this.sendMessage();\r\n }\r\n } else {\r\n if(this.chat.peerId.isAnyChat() && !this.appMessagesManager.canSendToPeer(this.chat.peerId, this.chat.threadId, 'send_media')) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return;\r\n }\r\n\r\n this.chatInput.classList.add('is-locked');\r\n blurActiveElement();\r\n\r\n this.recorder.start().then(() => {\r\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\r\n this.recordCanceled = false;\r\n \r\n this.chatInput.classList.add('is-recording');\r\n this.recording = true;\r\n this.updateSendBtn();\r\n opusDecodeController.setKeepAlive(true);\r\n \r\n const showDiscardPopup = () => {\r\n new PopupPeer('popup-cancel-record', {\r\n titleLangKey: 'DiscardVoiceMessageTitle',\r\n descriptionLangKey: 'DiscardVoiceMessageDescription',\r\n buttons: [{\r\n langKey: 'DiscardVoiceMessageAction',\r\n callback: () => {\r\n simulateClickEvent(this.btnCancelRecord);\r\n }\r\n }, {\r\n langKey: 'Continue',\r\n isCancel: true\r\n }]\r\n }).show();\r\n };\r\n\r\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\r\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\r\n cancelEvent(e);\r\n showDiscardPopup();\r\n }\r\n }, {capture: true, passive: false}) as any;\r\n\r\n appNavigationController.pushItem(this.recordingNavigationItem = {\r\n type: 'voice',\r\n onPop: () => {\r\n setTimeout(() => {\r\n showDiscardPopup();\r\n }, 0);\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.recordStartTime = Date.now();\r\n\r\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\r\n const context = sourceNode.context;\r\n\r\n const analyser = context.createAnalyser();\r\n sourceNode.connect(analyser);\r\n //analyser.connect(context.destination);\r\n analyser.fftSize = 32;\r\n\r\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\r\n const max = frequencyData.length * 255;\r\n const min = 54 / 150;\r\n let r = () => {\r\n if(!this.recording) return;\r\n\r\n analyser.getByteFrequencyData(frequencyData);\r\n\r\n let sum = 0;\r\n frequencyData.forEach(value => {\r\n sum += value;\r\n });\r\n \r\n let percents = Math.min(1, (sum / max) + min);\r\n //console.log('frequencyData', frequencyData, percents);\r\n\r\n this.recordRippleEl.style.transform = `scale(${percents})`;\r\n\r\n let diff = Date.now() - this.recordStartTime;\r\n let ms = diff % 1000;\r\n\r\n let formatted = ('' + (diff / 1000)).toHHMMSS() + ',' + ('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.chatInput.classList.remove('is-recording', 'is-locked');\r\n });\r\n }\r\n };\r\n\r\n private onHelperCancel = (e?: Event, force?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.willSendWebPage) {\r\n const lastUrl = this.lastUrl;\r\n let needReturn = false;\r\n if(this.helperType) {\r\n //if(this.helperFunc) {\r\n this.helperFunc();\r\n //}\r\n\r\n needReturn = true;\r\n }\r\n\r\n // * restore values\r\n this.lastUrl = lastUrl;\r\n this.noWebPage = true;\r\n this.willSendWebPage = null;\r\n\r\n if(needReturn) return;\r\n }\r\n\r\n if(this.helperType === 'edit' && !force) {\r\n const message = this.editMessage\r\n const value = RichTextProcessor.parseMarkdown(this.messageInputField.value, []);\r\n if(message.message !== value) {\r\n new PopupPeer('discard-editing', {\r\n buttons: [{\r\n langKey: 'Alert.Confirm.Discard',\r\n callback: () => {\r\n this.onHelperCancel(undefined, true);\r\n }\r\n }],\r\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\r\n }).show();\r\n\r\n return;\r\n }\r\n }\r\n\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n };\r\n\r\n private onHelperClick = (e: Event) => {\r\n cancelEvent(e);\r\n \r\n if(!findUpClassName(e.target, 'reply')) return;\r\n if(this.helperType === 'forward') {\r\n const {forwardElements} = this;\r\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\r\n openBtnMenu(forwardElements.container);\r\n }\r\n } else if(this.helperType === 'reply') {\r\n this.chat.setMessageId(this.replyToMsgId);\r\n } else if(this.helperType === 'edit') {\r\n this.chat.setMessageId(this.editMsgId);\r\n }\r\n };\r\n\r\n private changeForwardRecipient() {\r\n if(this.helperWaitingForward) return;\r\n this.helperWaitingForward = true;\r\n\r\n const helperFunc = this.helperFunc;\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n let selected = false;\r\n const popup = new PopupForward(copy(this.forwarding), () => {\r\n selected = true;\r\n });\r\n\r\n popup.addEventListener('close', () => {\r\n this.helperWaitingForward = false;\r\n\r\n if(!selected) {\r\n helperFunc();\r\n }\r\n });\r\n }\r\n\r\n public clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\r\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\r\n const i = document.createElement('input');\r\n document.body.append(i);\r\n fixSafariStickyInput(i);\r\n this.messageInputField.setValueSilently(clearValue);\r\n fixSafariStickyInput(this.messageInput);\r\n i.remove();\r\n } else {\r\n this.messageInputField.setValueSilently(clearValue);\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n //this.messageInput.innerText = '';\r\n } else {\r\n //this.attachMessageInputField();\r\n //this.messageInput.innerText = '';\r\n\r\n // clear executions\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n this.executedHistory.length = 0;\r\n this.canUndoFromHTML = '';\r\n }\r\n\r\n let set = false;\r\n if(canSetDraft) {\r\n set = this.setDraft(undefined, false);\r\n }\r\n\r\n if(!set && fireEvent) {\r\n this.onMessageInput();\r\n }\r\n }\r\n\r\n public isInputEmpty() {\r\n return isInputEmpty(this.messageInput);\r\n }\r\n\r\n public updateSendBtn() {\r\n let icon: 'send' | 'record' | 'edit' | 'schedule';\r\n\r\n const isInputEmpty = this.isInputEmpty();\r\n\r\n if(this.editMsgId) icon = 'edit';\r\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\r\n else icon = 'record';\r\n\r\n ['send', 'record', 'edit', 'schedule'].forEach(i => {\r\n this.btnSend.classList.toggle(i, icon === i);\r\n });\r\n\r\n if(this.btnScheduled) {\r\n this.btnScheduled.classList.toggle('show', isInputEmpty);\r\n }\r\n\r\n if(this.btnToggleReplyMarkup) {\r\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty);\r\n }\r\n }\r\n\r\n public onMessageSent(clearInput = true, clearReply?: boolean) {\r\n if(this.chat.type !== 'scheduled') {\r\n this.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\r\n }\r\n\r\n this.scheduleDate = undefined;\r\n this.sendSilent = undefined;\r\n\r\n const value = this.messageInputField.value;\r\n const entities = RichTextProcessor.parseEntities(value);\r\n const emojiEntities: MessageEntity.messageEntityEmoji[] = entities.filter(entity => entity._ === 'messageEntityEmoji') as any;\r\n emojiEntities.forEach(entity => {\r\n const emoji = emojiFromCodePoints(entity.unicode);\r\n this.appEmojiManager.pushRecentEmoji(emoji);\r\n });\r\n\r\n if(clearInput) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n this.clearInput();\r\n }\r\n\r\n if(clearReply || clearInput) {\r\n this.clearHelper();\r\n }\r\n\r\n this.updateSendBtn();\r\n }\r\n\r\n public sendMessage(force = false) {\r\n const {editMsgId, chat} = this;\r\n if(chat.type === 'scheduled' && !force && !editMsgId) {\r\n this.scheduleSending();\r\n return;\r\n }\r\n\r\n const {threadId, peerId} = chat;\r\n const {replyToMsgId, noWebPage, sendSilent, scheduleDate} = this;\r\n\r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n //return;\r\n if(editMsgId) {\r\n const message = this.editMessage;\r\n if(value.trim() || message.media) {\r\n this.appMessagesManager.editMessage(message, value, {\r\n entities,\r\n noWebPage: noWebPage\r\n });\r\n\r\n this.onMessageSent();\r\n } else {\r\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\r\n\r\n return;\r\n }\r\n } else if(value.trim()) {\r\n this.appMessagesManager.sendText(peerId, value, {\r\n entities,\r\n replyToMsgId: replyToMsgId,\r\n threadId: threadId,\r\n noWebPage: noWebPage,\r\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\r\n scheduleDate: scheduleDate,\r\n silent: sendSilent,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, false);\r\n // this.onMessageSent();\r\n }\r\n\r\n // * wait for sendText set messageId for invokeAfterMsg\r\n if(this.forwarding) {\r\n const forwarding = copy(this.forwarding);\r\n setTimeout(() => {\r\n for(const fromPeerId in forwarding) {\r\n this.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\r\n silent: sendSilent,\r\n scheduleDate: scheduleDate,\r\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\r\n dropCaptions: this.isDroppingCaptions()\r\n });\r\n }\r\n\r\n if(!value) {\r\n this.onMessageSent();\r\n }\r\n }, 0);\r\n }\r\n\r\n // this.onMessageSent();\r\n }\r\n\r\n public sendMessageWithDocument(document: MyDocument | string, force = false, clearDraft = false) {\r\n document = this.appDocsManager.getDoc(document);\r\n\r\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\r\n if(this.chat.peerId.isAnyChat() && !this.appMessagesManager.canSendToPeer(this.chat.peerId, this.chat.threadId, flag)) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return false;\r\n }\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft));\r\n return false;\r\n }\r\n\r\n if(document) {\r\n this.appMessagesManager.sendFile(this.chat.peerId, document, {\r\n isMedia: true, \r\n replyToMsgId: this.replyToMsgId, \r\n threadId: this.chat.threadId,\r\n silent: this.sendSilent, \r\n scheduleDate: this.scheduleDate,\r\n clearDraft: clearDraft || undefined\r\n });\r\n this.onMessageSent(clearDraft, true);\r\n\r\n if(document.type === 'sticker') {\r\n emoticonsDropdown.stickersTab?.pushRecentSticker(document);\r\n }\r\n\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n private canToggleHideAuthor() {\r\n const {forwardElements} = this;\r\n if(!forwardElements) return false;\r\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\r\n return !hideCaptionCheckboxField.checked ||\r\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\r\n }\r\n\r\n private isDroppingCaptions() {\r\n return !this.canToggleHideAuthor();\r\n }\r\n\r\n /* public sendSomething(callback: () => void, force = false) {\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendSomething(callback, true));\r\n return false;\r\n }\r\n\r\n callback();\r\n this.onMessageSent(false, true);\r\n\r\n return true;\r\n } */\r\n\r\n public initMessageEditing(mid: number) {\r\n const message: Message.message = this.chat.getMessage(mid);\r\n\r\n let input = RichTextProcessor.wrapDraftText(message.message, {entities: message.totalEntities});\r\n const f = () => {\r\n const replyFragment = this.appMessagesManager.wrapMessageForReply(message, undefined, [message.mid]);\r\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\r\n\r\n this.editMsgId = mid;\r\n this.editMessage = message;\r\n input = undefined;\r\n };\r\n f();\r\n }\r\n\r\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\r\n const f = () => {\r\n //const peerTitles: string[]\r\n const fromPeerIds = Object.keys(fromPeerIdsMids).map(fromPeerId => fromPeerId.toPeerId());\r\n const smth: Set = new Set();\r\n let length = 0, messagesWithCaptionsLength = 0;\r\n\r\n fromPeerIds.forEach(fromPeerId => {\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n mids.forEach(mid => {\r\n const message: Message.message = this.appMessagesManager.getMessageByPeer(fromPeerId, mid);\r\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\r\n smth.add('N' + message.fwd_from.from_name);\r\n } else {\r\n smth.add('P' + message.fromId);\r\n }\r\n\r\n if(message.media && message.message) {\r\n ++messagesWithCaptionsLength;\r\n }\r\n });\r\n\r\n length += mids.length;\r\n });\r\n\r\n const onlyFirstName = smth.size > 2;\r\n const peerTitles = [...smth].map(smth => {\r\n const type = smth[0];\r\n smth = smth.slice(1);\r\n if(type === 'P') {\r\n const peerId = smth.toPeerId();\r\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\r\n } else {\r\n return onlyFirstName ? smth.split(' ')[0] : smth;\r\n }\r\n });\r\n\r\n const {forwardElements} = this;\r\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\r\n form.classList.toggle('hide', !messagesWithCaptionsLength);\r\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\r\n if(messagesWithCaptionsLength && hideCaption) {\r\n forwardElements.hideSender.checkboxField.setValueSilently(true);\r\n } else if(this.forwardWasDroppingAuthor !== undefined) {\r\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\r\n }\r\n\r\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n const title = i18n(titleKey, [length]);\r\n\r\n const senderTitles = document.createDocumentFragment();\r\n if(peerTitles.length < 3) {\r\n senderTitles.append(...join(peerTitles, false));\r\n } else {\r\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\r\n }\r\n\r\n let firstMessage: Message.message, usingFullAlbum: boolean;\r\n if(fromPeerIds.length === 1) {\r\n const fromPeerId = fromPeerIds[0];\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n firstMessage = this.appMessagesManager.getMessageByPeer(fromPeerId, mids[0]);\r\n \r\n usingFullAlbum = !!firstMessage.grouped_id;\r\n if(usingFullAlbum) {\r\n const albumMids = this.appMessagesManager.getMidsByMessage(firstMessage);\r\n if(albumMids.length !== length || albumMids.find(mid => !mids.includes(mid))) {\r\n usingFullAlbum = false;\r\n }\r\n }\r\n }\r\n\r\n const subtitleFragment = document.createDocumentFragment();\r\n const delimiter = ': ';\r\n if(usingFullAlbum || length === 1) {\r\n const mids = fromPeerIdsMids[fromPeerIds[0]];\r\n const replyFragment = this.appMessagesManager.wrapMessageForReply(firstMessage, undefined, mids);\r\n subtitleFragment.append(\r\n senderTitles, \r\n delimiter, \r\n replyFragment\r\n );\r\n } else {\r\n subtitleFragment.append(\r\n i18n('Chat.Accessory.Forward.From'), \r\n delimiter, \r\n senderTitles\r\n );\r\n }\r\n \r\n let newReply = this.setTopInfo('forward', f, title, subtitleFragment);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const text = b.textElement;\r\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\r\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\r\n intl.update();\r\n });\r\n\r\n if(this.forwardHover) {\r\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\r\n }\r\n\r\n this.forwarding = fromPeerIdsMids;\r\n };\r\n \r\n f();\r\n }\r\n\r\n public initMessageReply(mid: number) {\r\n if(this.replyToMsgId === mid) {\r\n return;\r\n }\r\n \r\n let message: Message = this.chat.getMessage(mid);\r\n const f = () => {\r\n let peerTitleEl: HTMLElement;\r\n if(message._ === 'messageEmpty') { // load missing replying message\r\n peerTitleEl = i18n('Loading');\r\n\r\n this.chat.appMessagesManager.wrapSingleMessage(this.chat.peerId, mid).then((_message) => {\r\n if(this.replyToMsgId !== mid) {\r\n return;\r\n }\r\n\r\n message = _message;\r\n if(message._ === 'messageEmpty') {\r\n this.clearHelper('reply');\r\n } else {\r\n f();\r\n }\r\n });\r\n } else {\r\n peerTitleEl = new PeerTitle({\r\n peerId: message.fromId,\r\n dialog: false\r\n }).element;\r\n }\r\n\r\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\r\n this.replyToMsgId = mid;\r\n };\r\n f();\r\n }\r\n\r\n public clearHelper(type?: ChatInputHelperType) {\r\n if(this.helperType === 'edit' && type !== 'edit') {\r\n this.clearInput();\r\n }\r\n\r\n if(type) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n }\r\n \r\n if(type !== 'reply') {\r\n this.replyToMsgId = undefined;\r\n this.forwarding = undefined;\r\n }\r\n\r\n this.editMsgId = this.editMessage = undefined;\r\n this.helperType = this.helperFunc = undefined;\r\n\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n appNavigationController.removeByType('input-helper');\r\n this.chat.container.classList.remove('is-helper-active');\r\n this.t();\r\n }\r\n }\r\n\r\n private t() {\r\n const className = 'is-toggling-helper';\r\n SetTransition(this.chat.container, className, true, 150, () => {\r\n this.chat.container.classList.remove(className);\r\n });\r\n }\r\n\r\n public setInputValue(value: string, clear = true, focus = true) {\r\n if(!value) value = '';\r\n\r\n if(clear) this.clearInput(false, false, value);\r\n else this.messageInputField.setValueSilently(value);\r\n\r\n fastRaf(() => {\r\n focus && placeCaretAtEnd(this.messageInput);\r\n this.onMessageInput();\r\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\r\n });\r\n }\r\n\r\n public setTopInfo(\r\n type: ChatInputHelperType, \r\n callerFunc: () => void, \r\n title: Parameters[0] = '', \r\n subtitle: Parameters[1] = '', \r\n input?: string, \r\n message?: any\r\n ) {\r\n if(this.willSendWebPage && type === 'reply') {\r\n return;\r\n }\r\n\r\n if(type !== 'webpage') {\r\n this.clearHelper(type);\r\n this.helperType = type;\r\n this.helperFunc = callerFunc;\r\n }\r\n \r\n const replyParent = this.replyElements.container;\r\n const oldReply = replyParent.lastElementChild.previousElementSibling;\r\n const haveReply = oldReply.classList.contains('reply');\r\n\r\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\r\n const newReply = wrapReply(title, subtitle, message);\r\n if(haveReply) {\r\n oldReply.replaceWith(newReply);\r\n } else {\r\n replyParent.insertBefore(newReply, replyParent.lastElementChild);\r\n }\r\n\r\n if(!this.chat.container.classList.contains('is-helper-active')) {\r\n this.chat.container.classList.add('is-helper-active');\r\n this.t();\r\n }\r\n\r\n /* const scroll = appImManager.scrollable;\r\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\r\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\r\n } */\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'input-helper',\r\n onPop: () => {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n if(input !== undefined) {\r\n this.setInputValue(input);\r\n }\r\n\r\n setTimeout(() => {\r\n this.updateSendBtn();\r\n }, 0);\r\n\r\n return newReply;\r\n }\r\n\r\n // public saveScroll() {\r\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\r\n // this.scrollOffsetTop = this.chatInput.offsetTop;\r\n // }\r\n\r\n // public restoreScroll() {\r\n // if(this.chatInput.style.display) return;\r\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\r\n // let newOffsetTop = this.chatInput.offsetTop;\r\n // let container = this.chat.bubbles.scrollable.container;\r\n // let scrollTop = container.scrollTop;\r\n // let clientHeight = container.clientHeight;\r\n // let maxScrollTop = container.scrollHeight;\r\n\r\n // if(newOffsetTop < this.scrollOffsetTop) {\r\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\r\n // container.scrollTop += this.scrollDiff;\r\n // } else if(scrollTop !== this.scrollTop) {\r\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\r\n // if(endDiff < this.scrollDiff/* && false */) {\r\n // //container.scrollTop -= endDiff;\r\n // } else {\r\n // container.scrollTop -= this.scrollDiff;\r\n // }\r\n // }\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setCaretAt(node: Node) {\n // node.appendChild(document.createTextNode(''));\n\n const originalNode = node;\n node = node.previousSibling;\n\n if(node.nodeType === 1) {\n const newNode = document.createTextNode('');\n node.parentNode.insertBefore(newNode, !originalNode.nextSibling || originalNode.nextSibling.nodeType === node.nodeType ? originalNode : originalNode.nextSibling);\n node = newNode;\n }\n\n if(window.getSelection && document.createRange) {\n const range = document.createRange();\n if(node) {\n range.setStartAfter(node);\n range.insertNode(node);\n range.setStart(node, node.nodeValue.length);\n }\n\n range.collapse(true);\n\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"./chat\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { ripple } from \"../ripple\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { safeAssign } from \"../../helpers/object\";\r\nimport { Message } from \"../../layer\";\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 fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\r\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\r\n this.divAndCaption.container.dataset.mid = '' + message.mid;\r\n this.divAndCaption.fill(title, subtitle, message);\r\n this.topbar.setUtilsWidth();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatTopbar from \"./topbar\";\nimport rootScope from \"../../lib/rootScope\";\nimport appMediaPlaybackController from \"../appMediaPlaybackController\";\nimport DivAndCaption from \"../divAndCaption\";\nimport PinnedContainer from \"./pinnedContainer\";\nimport Chat from \"./chat\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport { formatFullSentTime } from \"../../helpers/date\";\nimport { MediaProgressLine, VolumeSelector } from \"../../lib/mediaPlayer\";\nimport ButtonIcon from \"../buttonIcon\";\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected appMessagesManager: AppMessagesManager) {\n super({\n topbar, \n chat, \n listenerSetter: topbar.listenerSetter, \n className: 'audio', \n divAndCaption: new DivAndCaption(\n 'pinned-audio', \n (title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => {\n replaceContent(this.divAndCaption.title, title);\n replaceContent(this.divAndCaption.subtitle, subtitle);\n }\n ), \n onClose: () => {\n appMediaPlaybackController.stop();\n },\n floating: true\n });\n\n this.divAndCaption.border.remove();\n\n const prevEl = ButtonIcon('pprevious active', {noRipple: true});\n const nextEl = ButtonIcon('nnext active', {noRipple: true});\n\n prevEl.innerHTML = ``;\n nextEl.innerHTML = ``;\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 this.wrapperUtils.prepend(this.volumeSelector.btn);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine(undefined, undefined, true, true);\n this.progressLine.container.classList.add('pinned-audio-progress');\n progressWrapper.append(this.progressLine.container);\n this.wrapper.insertBefore(progressWrapper, this.wrapperUtils);\n\n this.topbar.listenerSetter.add(rootScope)('media_play', ({doc, message, media}) => {\n let title: string | HTMLElement, subtitle: string | HTMLElement | DocumentFragment;\n if(doc.type === 'voice' || doc.type === 'round') {\n title = new PeerTitle({peerId: message.fromId}).element;\n\n //subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n } else {\n title = doc.audioTitle || doc.fileName;\n subtitle = doc.audioPerformer || i18n('AudioUnknownArtist');\n }\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n this.toggleEl.classList.add('flip-icon');\n this.toggle(false);\n });\n\n this.topbar.listenerSetter.add(rootScope)('media_pause', () => {\n this.toggleEl.classList.remove('flip-icon');\n });\n\n this.topbar.listenerSetter.add(rootScope)('media_stop', () => {\n this.toggle(true);\n });\n }\n}\n","// https://github.com/evgeny-nadymov/telegram-react/blob/master/src/Components/ColumnMiddle/PinnedMessageBorder.js\n\nenum BAR_HEIGHTS {\n ONE = 32,\n TWO = 15,\n THREE = 10,\n FOUR = 8,\n MORE = 8\n};\n\nconst GAP = 1;\nconst WIDTH = 2;\nconst BASE_CLASS = 'pinned-message-border';\n\nexport default class PinnedMessageBorder {\n private border: HTMLElement;\n private wrapper: HTMLElement;\n private svg: SVGSVGElement;\n private defs: SVGDefsElement;\n private clipPath: SVGClipPathElement;\n private path: SVGPathElement;\n private mark: HTMLElement;\n\n private count: number;\n private index: number;\n\n private drawRect = (x: number, y: number, width: number, height: number, radius: number) => {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n };\n\n private getClipPath = (id: string, barHeight: number, count: number) => {\n const radius = 1;\n\n let d = '';\n /* if(count === 3) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius)\n + this.drawRect(0, barHeight + GAP, WIDTH, barHeight + 1, radius)\n + this.drawRect(0, barHeight * 2 + GAP * 2 + 1, WIDTH, barHeight, radius);\n } */if(count === 2) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius) + this.drawRect(0, barHeight + GAP * 2, WIDTH, barHeight, radius);\n } else {\n for(let i = 0; i < count; ++i) {\n d += this.drawRect(0, (barHeight + GAP) * i, WIDTH, barHeight, radius);\n }\n }\n\n if(!this.clipPath) {\n this.clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n this.clipPath.append(this.path);\n }\n\n this.clipPath.id = id;\n this.path.setAttributeNS(null, 'd', d);\n\n return this.clipPath;\n };\n\n private getBarHeight = (count: number, index: number) => {\n let barHeight: number;\n if(count <= 1) {\n barHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n barHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n barHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n barHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n barHeight = BAR_HEIGHTS.MORE;\n }\n\n return barHeight;\n };\n\n private getMarkHeight = (count: number, index: number) => {\n let markHeight: number;\n if(count <= 1) {\n markHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n markHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n markHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n markHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n markHeight = BAR_HEIGHTS.MORE;\n }\n\n return markHeight;\n };\n\n private getMarkTranslateY = (index: number, barHeight: number, count: number) => {\n if(count === 1) {\n return 0;\n } else if(count === 2) {\n return !index ? 0 : barHeight + GAP;\n }\n\n if(count === 3) {\n if(!index) {\n return 0;\n } else if(index === 1) {\n return barHeight + GAP;\n }\n\n return barHeight * 2 + GAP * 2 + 1;\n } else {\n return (barHeight + GAP) * index;\n }\n };\n\n private getTrackTranslateY = (index: number, count: number, barHeight: number, trackHeight: number) => {\n if(count <= 4) {\n return 0;\n }\n\n if(index <= 1) {\n return 0;\n } else if(index >= (count - 2)) {\n return trackHeight - BAR_HEIGHTS.ONE - barHeight;\n }\n\n // return (index + 1) * barHeight + index * GAP;\n return (index - 2) * barHeight + index * GAP;\n //return (barHeight + GAP * 2) / 2 + (index - 2) * (barHeight + GAP);\n };\n\n private getTrackHeight = (count: number, barHeight: number) => {\n return count <= 3 ? BAR_HEIGHTS.ONE : barHeight * count + GAP * (count - 1);\n };\n\n public render(count: number, index: number) {\n if(!this.border) {\n this.border = document.createElement('div');\n this.border.classList.add(BASE_CLASS);\n\n this.wrapper = document.createElement('div');\n this.border.append(this.wrapper);\n }\n \n if(count === 1) {\n if(this.count !== count) {\n this.wrapper.className = BASE_CLASS + '-wrapper-1';\n this.border.classList.remove(BASE_CLASS + '-mask');\n this.wrapper.innerHTML = this.wrapper.style.cssText = '';\n }\n\n return this.border;\n }\n\n const barHeight = this.getBarHeight(count, index);\n const markHeight = this.getMarkHeight(count, index);\n const trackHeight = this.getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath_${count}`;\n const clipPath = this.getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = this.getMarkTranslateY(index, barHeight, count);\n const trackTranslateY = this.getTrackTranslateY(index, count, barHeight, trackHeight);\n\n this.border.classList.toggle(BASE_CLASS + '-mask', count > 4);\n\n if(index <= 1) {\n this.border.classList.add('mask-bottom');\n this.border.classList.remove('mask-top');\n } else if(index >= (count - 2)) {\n this.border.classList.add('mask-top');\n this.border.classList.remove('mask-bottom');\n } else {\n this.border.classList.add('mask-top', 'mask-bottom');\n }\n\n this.wrapper.className = BASE_CLASS + '-wrapper';\n this.wrapper.style.cssText = `clip-path: url(#${clipPathId}); width: 2px; height: ${trackHeight}px; transform: translateY(-${trackTranslateY}px);`;\n \n if(!this.svg) {\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.setAttributeNS(null, 'height', '0');\n this.svg.setAttributeNS(null, 'width', '0');\n \n this.defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n this.defs.append(clipPath);\n\n this.svg.append(this.defs);\n\n this.mark = document.createElement('div');\n this.mark.classList.add(BASE_CLASS + '-mark');\n }\n\n if(!this.svg.parentElement) {\n this.wrapper.append(this.svg, this.mark);\n }\n\n this.mark.style.cssText = `height: ${markHeight}px; transform: translateY(${markTranslateY}px);`;\n \n this.count = count;\n this.index = index;\n\n return this.border;\n }\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport PinnedContainer from \"./pinnedContainer\";\r\nimport PinnedMessageBorder from \"./pinnedMessageBorder\";\r\nimport ReplyContainer, { wrapReplyDivAndCaption } from \"./replyContainer\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport Chat from \"./chat\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport handleScrollSideEvent from \"../../helpers/dom/handleScrollSideEvent\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\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 public static LOAD_COUNT = 50;\r\n public static LOAD_OFFSET = 5;\r\n\r\n public pinnedMessageContainer: PinnedContainer;\r\n public pinnedMessageBorder: PinnedMessageBorder;\r\n\r\n public pinnedMaxMid = 0;\r\n public pinnedMid = 0;\r\n public pinnedIndex = -1;\r\n public wasPinnedIndex = 0;\r\n public wasPinnedMediaIndex = 0;\r\n \r\n public locked = false;\r\n public waitForScrollBottom = false;\r\n\r\n public count = 0;\r\n public mids: number[] = [];\r\n public offsetIndex = 0;\r\n\r\n public loading = false;\r\n public loadedBottom = false;\r\n public loadedTop = false;\r\n\r\n public animatedSubtitle: AnimatedSuper;\r\n public animatedMedia: AnimatedSuper;\r\n public animatedCounter: AnimatedCounter;\r\n\r\n public listenerSetter: ListenerSetter;\r\n public scrollDownListenerSetter: ListenerSetter = null;\r\n\r\n public hidden = false;\r\n\r\n public getCurrentIndexPromise: Promise = null;\r\n public btnOpen: HTMLButtonElement;\r\n \r\n public setPinnedMessage: () => void;\r\n\r\n private isStatic = false;\r\n\r\n private debug = false;\r\n \r\n constructor(private topbar: ChatTopbar, private chat: Chat, private appMessagesManager: AppMessagesManager, private appPeersManager: AppPeersManager) {\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n const dAC = new ReplyContainer('pinned-message');\r\n this.pinnedMessageContainer = new PinnedContainer({\r\n topbar, \r\n chat, \r\n listenerSetter: this.listenerSetter, \r\n className: 'message', \r\n divAndCaption: dAC, \r\n onClose: async() => {\r\n if(appPeersManager.canPinMessage(this.topbar.peerId)) {\r\n new PopupPinMessage(this.topbar.peerId, this.pinnedMid, true);\r\n } else {\r\n new PopupPinMessage(this.topbar.peerId, 0, true);\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.pinnedMessageBorder = new PinnedMessageBorder();\r\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\r\n\r\n this.animatedSubtitle = new AnimatedSuper();\r\n dAC.subtitle.append(this.animatedSubtitle.container);\r\n\r\n this.animatedMedia = new AnimatedSuper();\r\n this.animatedMedia.container.classList.add('pinned-message-media-container');\r\n dAC.content.prepend(this.animatedMedia.container);\r\n\r\n this.animatedCounter = new AnimatedCounter(true);\r\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\r\n\r\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\r\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\r\n dAC.container.prepend(btnClose);\r\n\r\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\r\n\r\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\r\n\r\n attachClickEvent(this.btnOpen, (e) => {\r\n cancelEvent(e);\r\n this.topbar.openPinned(true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\r\n if(peerId === this.topbar.peerId) {\r\n //this.wasPinnedIndex = 0;\r\n //setTimeout(() => {\r\n if(this.hidden) {\r\n this.pinnedMessageContainer.toggle(this.hidden = false);\r\n }\r\n\r\n this.loadedTop = this.loadedBottom = false;\r\n this.pinnedIndex = -1;\r\n this.pinnedMid = 0;\r\n this.count = 0;\r\n this.mids = [];\r\n this.offsetIndex = 0;\r\n this.pinnedMaxMid = 0;\r\n this.setCorrectIndex(0);\r\n //}, 300);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\r\n if(peerId === this.topbar.peerId) {\r\n this.pinnedMessageContainer.toggle(this.hidden = true);\r\n }\r\n });\r\n\r\n // * 200 - no lags\r\n // * 100 - need test\r\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\r\n\r\n this.isStatic = this.chat.type === 'discussion';\r\n }\r\n\r\n public destroy() {\r\n this.pinnedMessageContainer.divAndCaption.container.remove();\r\n this.pinnedMessageContainer.toggle(true);\r\n this.listenerSetter.removeAll();\r\n this.unsetScrollDownListener(false);\r\n }\r\n\r\n public setCorrectIndex(lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n //return;\r\n\r\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\r\n return;\r\n }\r\n\r\n if((this.loadedBottom || this.loadedTop) && !this.count) {\r\n return;\r\n }\r\n\r\n //const perf = performance.now();\r\n let el = this.chat.bubbles.getBubbleByPoint('bottom');\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(!el) return;\r\n\r\n //return;\r\n\r\n const mid = el.dataset.mid;\r\n if(el && mid !== undefined) {\r\n //this.chat.log('[PM]: setCorrectIndex will test mid:', mid);\r\n this.testMid(+mid, lastScrollDirection);\r\n }\r\n }\r\n\r\n public testMid(mid: number, lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n \r\n //if(lastScrollDirection !== undefined) return;\r\n if(this.hidden) return;\r\n\r\n //this.chat.log('[PM]: testMid', mid);\r\n\r\n let currentIndex: number = this.mids.findIndex(_mid => _mid <= mid);\r\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\r\n currentIndex += this.offsetIndex;\r\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\r\n //currentIndex = 0;\r\n currentIndex = this.mids.length - 1 + this.offsetIndex;\r\n } else {\r\n if(!this.getCurrentIndexPromise) {\r\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\r\n }\r\n\r\n return;\r\n }\r\n\r\n //const idx = Math.max(0, this.mids.indexOf(mid));\r\n\r\n /* if(currentIndex === this.count) {\r\n currentIndex = 0;\r\n } */\r\n\r\n //this.chat.log('[PM]: testMid: pinned currentIndex', currentIndex, mid);\r\n\r\n const changed = this.pinnedIndex !== currentIndex;\r\n if(changed) {\r\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\r\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\r\n return;\r\n }\r\n }\r\n\r\n this.pinnedIndex = currentIndex;\r\n this.pinnedMid = this.mids.find(_mid => _mid <= mid) || this.mids[this.mids.length - 1];\r\n this.setPinnedMessage();\r\n }\r\n }\r\n\r\n private isNeededMore(currentIndex: number) {\r\n return (this.count > ChatPinnedMessage.LOAD_COUNT && \r\n (\r\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) || \r\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\r\n )\r\n );\r\n }\r\n\r\n private async getCurrentIndex(mid: number, correctAfter = true) {\r\n if(this.loading) return;\r\n this.loading = true;\r\n\r\n try {\r\n let gotRest = false;\r\n const promises = [\r\n this.appMessagesManager.getSearch({\r\n peerId: this.topbar.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId: mid, \r\n limit: ChatPinnedMessage.LOAD_COUNT, \r\n backLimit: ChatPinnedMessage.LOAD_COUNT\r\n })\r\n .then(r => {\r\n gotRest = true;\r\n return r;\r\n })\r\n ];\r\n \r\n if(!this.pinnedMaxMid) {\r\n const promise = this.appMessagesManager.getPinnedMessage(this.topbar.peerId).then(p => {\r\n if(!p.maxId) return;\r\n this.pinnedMaxMid = p.maxId;\r\n\r\n if(!gotRest && correctAfter) {\r\n this.mids = [this.pinnedMaxMid];\r\n this.count = p.count;\r\n this.pinnedIndex = 0;\r\n this.pinnedMid = this.mids[0];\r\n this.setPinnedMessage();\r\n //this.pinnedMessageContainer.toggle(false);\r\n }\r\n });\r\n \r\n promises.push(promise as any);\r\n }\r\n \r\n const result = (await Promise.all(promises))[0];\r\n \r\n let backLimited = result.history.findIndex(message => message.mid <= mid);\r\n if(backLimited === -1) {\r\n backLimited = result.history.length;\r\n }/* else {\r\n backLimited -= 1;\r\n } */\r\n \r\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\r\n this.mids = result.history.map(message => message.mid).slice();\r\n this.count = result.count;\r\n\r\n if(!this.count) {\r\n this.pinnedMessageContainer.toggle(true);\r\n }\r\n \r\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\r\n this.loadedBottom = !this.offsetIndex;\r\n \r\n this.debug && this.chat.log('[PM]: getCurrentIndex result:', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\r\n } catch(err) {\r\n this.chat.log.error('[PM]: getCurrentIndex error', err);\r\n }\r\n \r\n this.loading = false;\r\n\r\n if(this.locked) {\r\n this.testMid(mid);\r\n } else if(correctAfter) {\r\n this.setCorrectIndex(0);\r\n }\r\n\r\n this.getCurrentIndexPromise = null;\r\n //return result.offset_id_offset || 0;\r\n }\r\n\r\n public setScrollDownListener() {\r\n this.waitForScrollBottom = true;\r\n\r\n if(!this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter = new ListenerSetter();\r\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\r\n this.unsetScrollDownListener();\r\n }, this.scrollDownListenerSetter);\r\n }\r\n }\r\n\r\n public unsetScrollDownListener(refreshPosition = true) {\r\n this.waitForScrollBottom = false;\r\n\r\n if(this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter.removeAll();\r\n this.scrollDownListenerSetter = null;\r\n }\r\n\r\n if(refreshPosition) {\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async handleFollowingPinnedMessage() {\r\n this.locked = true;\r\n\r\n this.debug && this.chat.log('[PM]: handleFollowingPinnedMessage');\r\n try {\r\n this.setScrollDownListener();\r\n\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise instanceof Promise) {\r\n await setPeerPromise;\r\n }\r\n \r\n //await this.chat.bubbles.scrollable.scrollLockedPromise;\r\n await getHeavyAnimationPromise();\r\n\r\n if(this.getCurrentIndexPromise) {\r\n await this.getCurrentIndexPromise;\r\n }\r\n\r\n this.debug && this.chat.log('[PM]: handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n\r\n /* // подождём, пока скролл остановится\r\n setTimeout(() => {\r\n this.chat.log('[PM]: handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n }, 50); */\r\n } catch(err) {\r\n this.chat.log.error('[PM]: handleFollowingPinnedMessage error:', err);\r\n\r\n this.locked = false;\r\n this.waitForScrollBottom = false;\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async followPinnedMessage(mid: number) {\r\n const message = this.chat.getMessage(mid);\r\n if(message && !message.deleted) {\r\n this.chat.setMessageId(mid);\r\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\r\n this.handleFollowingPinnedMessage();\r\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\r\n });\r\n }\r\n }\r\n\r\n public async _setPinnedMessage() {\r\n /////this.log('setting pinned message', message);\r\n //return;\r\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\r\n Promise.all([\r\n promise\r\n ]).then(() => { */\r\n //const mids = results[0];\r\n const count = this.count;\r\n if(count) {\r\n const pinnedIndex = this.pinnedIndex;\r\n const message = this.chat.getMessage(this.pinnedMid);\r\n\r\n //this.animatedCounter.prepareNumber(count);\r\n\r\n //setTimeout(() => {\r\n const isLast = pinnedIndex === 0;\r\n this.animatedCounter.container.classList.toggle('is-last', isLast);\r\n //SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\r\n if(!isLast) {\r\n this.animatedCounter.setCount(count - pinnedIndex);\r\n }\r\n //}, 100);\r\n\r\n //this.pinnedMessageContainer.fill(undefined, message.message, message);\r\n this.pinnedMessageContainer.toggle(false);\r\n\r\n const fromTop = pinnedIndex > this.wasPinnedIndex;\r\n\r\n this.debug && this.chat.log('[PM]: setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\r\n\r\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\r\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\r\n writeMediaTo.classList.add('pinned-message-media');\r\n //writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\r\n const loadPromises: Promise[] = [];\r\n const isMediaSet = wrapReplyDivAndCaption({\r\n title: undefined,\r\n titleEl: null,\r\n subtitle: message.message,\r\n subtitleEl: writeTo,\r\n message,\r\n mediaEl: writeMediaTo,\r\n loadPromises\r\n });\r\n\r\n await Promise.all(loadPromises);\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\r\n\r\n //if(this.wasPinnedIndex !== this.pinnedIndex) {\r\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\r\n if(isMediaSet) {\r\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\r\n this.wasPinnedMediaIndex = pinnedIndex;\r\n } else {\r\n this.animatedMedia.clearRows();\r\n }\r\n //}\r\n\r\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\r\n this.wasPinnedIndex = pinnedIndex;\r\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\r\n } else {\r\n this.pinnedMessageContainer.toggle(true);\r\n this.wasPinnedIndex = 0;\r\n }\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\r\n //});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n let lastY: number;\r\n const options = {passive: true};\r\n listenerSetter.add(elem)('touchstart', (e) => {\r\n if(e.touches.length > 1) {\r\n onTouchEnd();\r\n return;\r\n }\r\n\r\n lastY = e.touches[0].clientY;\r\n\r\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\r\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\r\n }, options);\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n const clientY = e.touches[0].clientY;\r\n\r\n const isDown = clientY < lastY;\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n lastY = clientY;\r\n //alert('isDown: ' + !!isDown);\r\n };\r\n \r\n const onTouchEnd = () => {\r\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\r\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\r\n };\r\n } else {\r\n listenerSetter.add(elem)('wheel', (e) => {\r\n const isDown = e.deltaY > 0;\r\n //this.log('wheel', e, isDown);\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n }, {passive: true});\r\n }\r\n}\r\n","import IS_WEBRTC_SUPPORTED from \"./webrtcSupport\";\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\n","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\nimport type { AppNotificationsManager } from \"../../lib/appManagers/appNotificationsManager\";\nimport type { AppChatsManager, Channel } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport type { AppSidebarRight } from \"../sidebarRight\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { AppGroupCallsManager, MyGroupCall } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type Chat from \"./chat\";\nimport { RIGHT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarRight\";\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport rootScope from \"../../lib/rootScope\";\nimport AvatarElement from \"../avatar\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport ChatAudio from \"./audio\";\nimport ChatPinnedMessage from \"./pinnedMessage\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport appStateManager from \"../../lib/appManagers/appStateManager\";\nimport PopupDeleteDialog from \"../popups/deleteDialog\";\nimport appNavigationController from \"../appNavigationController\";\nimport { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarLeft\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport { toast, toastNew } from \"../toast\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { ChatFull, Chat as MTChat, GroupCall } from \"../../layer\";\nimport PopupPickUser from \"../popups/pickUser\";\nimport PopupPeer from \"../popups/peer\";\nimport generateVerifiedIcon from \"../generateVerifiedIcon\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport AppEditContactTab from \"../sidebarRight/tabs/editContact\";\nimport appMediaPlaybackController from \"../appMediaPlaybackController\";\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\nimport IS_GROUP_CALL_SUPPORTED from \"../../environment/groupCallSupport\";\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private chatInfo: HTMLDivElement;\n private avatarElement: AvatarElement;\n private title: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private chatUtils: HTMLDivElement;\n private btnJoin: HTMLButtonElement;\n private btnPinned: HTMLButtonElement;\n private btnGroupCall: HTMLButtonElement;\n private btnMute: HTMLButtonElement;\n private btnSearch: HTMLButtonElement;\n private btnMore: HTMLButtonElement;\n \n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n public peerId: PeerId;\n private wasPeerId: PeerId;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n\n constructor(\n private chat: Chat, \n private appSidebarRight: AppSidebarRight, \n private appMessagesManager: AppMessagesManager, \n private appPeersManager: AppPeersManager, \n private appChatsManager: AppChatsManager, \n private appNotificationsManager: AppNotificationsManager,\n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager,\n private appGroupCallsManager: AppGroupCallsManager\n ) {\n this.listenerSetter = new ListenerSetter();\n\n this.menuButtons = [];\n this.buttonsToVerify = [];\n }\n\n public construct() {\n //this.chat.log.error('Topbar construction');\n\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-header', 'topbar');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n\n // * chat info section\n this.chatInfoContainer = document.createElement('div');\n this.chatInfoContainer.classList.add('chat-info-container');\n\n this.chatInfo = document.createElement('div');\n this.chatInfo.classList.add('chat-info');\n\n const person = document.createElement('div');\n person.classList.add('person');\n\n const content = document.createElement('div');\n content.classList.add('content');\n\n const top = document.createElement('div');\n top.classList.add('top');\n\n this.title = document.createElement('div');\n this.title.classList.add('user-title');\n\n top.append(this.title);\n\n const bottom = document.createElement('div');\n bottom.classList.add('bottom');\n\n if(this.subtitle) {\n bottom.append(this.subtitle);\n }\n\n content.append(top, bottom);\n if(this.avatarElement) {\n person.append(this.avatarElement);\n }\n\n person.append(content);\n this.chatInfo.append(person);\n\n // * chat utils section\n this.chatUtils = document.createElement('div');\n this.chatUtils.classList.add('chat-utils');\n\n this.chatAudio = new ChatAudio(this, this.chat, this.appMessagesManager);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({listenerSetter: this.listenerSetter}, 'bottom-left', this.menuButtons, this.verifyButtons);\n }\n\n this.chatUtils.append(...[\n // this.chatAudio ? this.chatAudio.divAndCaption.container : null, \n this.pinnedMessage ? this.pinnedMessage.pinnedMessageContainer.divAndCaption.container : null, \n this.btnJoin, \n this.btnPinned, \n this.btnGroupCall, \n this.btnMute, \n this.btnSearch, \n this.btnMore\n ].filter(Boolean));\n\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 mid, \n searchContext.isScheduled ? 'scheduled' : (searchContext.threadId ? 'discussion' : undefined), \n 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(this.peerId);\n } else {\n const isFirstChat = this.chat.appImManager.chats.indexOf(this.chat) === 0;\n appNavigationController.back(isFirstChat ? 'im' : 'chat');\n /* return;\n\n if(mediaSizes.activeScreen === ScreenSize.medium && !appNavigationController.findItemByType('chat')) {\n this.chat.appImManager.setPeer(0);\n blurActiveElement();\n } else {\n appNavigationController.back('chat');\n } */\n }\n };\n\n attachClickEvent(this.btnBack, onBtnBackClick, {listenerSetter: this.listenerSetter});\n }\n\n private pushButtonToVerify(element: HTMLElement, verify: () => boolean) {\n if(!element) {\n return;\n }\n \n this.buttonsToVerify.push({element, verify});\n }\n\n private verifyButtons = (e?: Event) => {\n const isMenuOpen = !!e || !!(this.btnMore && this.btnMore.classList.contains('menu-open'));\n\n e && cancelEvent(e);\n\n const verifyButtons = (buttons: ButtonToVerify[]) => {\n buttons.forEach(button => {\n button.element.classList.toggle('hide', !button.verify());\n });\n };\n\n if(isMenuOpen) {\n verifyButtons(this.menuButtons);\n\n // delete button\n this.menuButtons[this.menuButtons.length - 1].element.lastChild.replaceWith(i18n(this.appPeersManager.getDeleteButtonText(this.peerId)));\n }\n\n verifyButtons(this.buttonsToVerify);\n };\n\n private verifyVideoChatButton = (type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser()) return false;\n\n const currentGroupCall = this.appGroupCallsManager.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if((this.peerId.isBroadcast() && type === 'group') || \n (this.peerId.isAnyGroup() && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = this.appChatsManager.getChatTyped(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || this.appChatsManager.hasRights(chatId, 'manage_call');\n };\n\n 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: () => {\n this.appMessagesManager.mutePeer(this.peerId);\n },\n verify: () => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !this.appNotificationsManager.isPeerLocalMuted(this.peerId, false)\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.appMessagesManager.mutePeer(this.peerId);\n },\n verify: () => this.chat.type === 'chat' && rootScope.myId !== this.peerId && this.appNotificationsManager.isPeerLocalMuted(this.peerId, false)\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.appProfileManager.getChannelFull(this.peerId.toChatId()).then(channelFull => {\n if(middleware() && channelFull.linked_chat_id) {\n this.chat.appImManager.setInnerPeer(channelFull.linked_chat_id.toPeerId(true));\n }\n });\n },\n verify: () => {\n const chatFull = this.appProfileManager.getCachedFullChat(this.peerId.toChatId());\n return this.chat.type === 'chat' && !!(chatFull as ChatFull.channelFull)?.linked_chat_id;\n }\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.LiveStream',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'broadcast')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.VoiceChat',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'group')\n }, {\n icon: 'select',\n text: 'Chat.Menu.SelectMessages',\n onClick: () => {\n const selection = this.chat.selection;\n selection.toggleSelection(true, true);\n appStateManager.getState().then(state => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = (bubble) => {\n appStateManager.pushToState('chatContextMenuHintWasShown', true);\n toast(i18n('Chat.Menu.Hint'));\n\n selection.toggleByElement = original;\n selection.toggleByElement(bubble);\n };\n });\n },\n verify: () => !this.chat.selection.isSelecting && !!Object.keys(this.chat.bubbles.bubbles).length\n }, {\n icon: 'select',\n text: 'Chat.Menu.ClearSelection',\n onClick: () => {\n this.chat.selection.cancelSelection();\n },\n verify: () => this.chat.selection.isSelecting\n }, {\n icon: 'adduser',\n text: 'AddContact',\n onClick: () => {\n if(!this.appSidebarRight.isTabExists(AppEditContactTab)) {\n const tab = new AppEditContactTab(this.appSidebarRight);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: () => this.peerId.isUser() && !this.appPeersManager.isContact(this.peerId)\n }, {\n icon: 'forward',\n text: 'ShareContact',\n onClick: () => {\n const contactPeerId = this.peerId;\n new PopupPickUser({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: (peerId) => {\n return new Promise((resolve, reject) => {\n new PopupPeer('', {\n titleLangKey: 'SendMessageTitle',\n descriptionLangKey: 'SendContactToGroupText',\n descriptionLangArgs: [new PeerTitle({peerId, dialog: true}).element],\n buttons: [{\n langKey: 'Send',\n callback: () => {\n resolve();\n\n this.appMessagesManager.sendOther(peerId, this.appUsersManager.getContactMediaInput(contactPeerId));\n this.chat.appImManager.setInnerPeer(peerId);\n }\n }, {\n langKey: 'Cancel',\n callback: () => {\n reject();\n },\n isCancel: true,\n }],\n peerId,\n overlayClosable: true\n }).show();\n });\n },\n placeholder: 'ShareModal.Search.Placeholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n },\n verify: () => rootScope.myId !== this.peerId && this.peerId.isUser() && this.appPeersManager.isContact(this.peerId)\n }, {\n icon: 'lock',\n text: 'BlockUser',\n onClick: () => {\n new PopupPeer('', {\n peerId: this.peerId,\n titleLangKey: 'BlockUser',\n descriptionLangKey: 'AreYouSureBlockContact2',\n descriptionLangArgs: [new PeerTitle({peerId: this.peerId}).element],\n buttons: [{\n langKey: 'BlockUser',\n isDanger: true,\n callback: () => {\n this.appUsersManager.toggleBlock(this.peerId, true).then(value => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: () => {\n if(!this.peerId.isUser()) return false;\n const userFull = this.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return this.peerId !== rootScope.myId && userFull && !userFull.pFlags?.blocked;\n }\n }, {\n icon: 'lockoff',\n text: 'Unblock',\n onClick: () => {\n this.appUsersManager.toggleBlock(this.peerId, false).then(value => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: () => {\n const userFull = this.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return !!userFull?.pFlags?.blocked;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: () => {\n new PopupDeleteDialog(this.peerId/* , 'leave' */);\n },\n verify: () => this.chat.type === 'chat' && !!this.appMessagesManager.getDialogOnly(this.peerId)\n }];\n\n this.btnSearch = ButtonIcon('search');\n this.attachClickEvent(this.btnSearch, (e) => {\n this.chat.initSearch();\n }, true);\n }\n\n public attachClickEvent(el: HTMLElement, cb: (e: MouseEvent) => void, noBlur?: boolean) {\n attachClickEvent(el, (e) => {\n cancelEvent(e);\n !noBlur && blurActiveElement();\n cb(e);\n }, {listenerSetter: this.listenerSetter});\n }\n\n private onJoinGroupCallClick = () => {\n this.chat.appImManager.joinGroupCall(this.peerId);\n };\n\n public constructPeerHelpers() {\n this.avatarElement = new AvatarElement();\n this.avatarElement.setAttribute('dialog', '1');\n //this.avatarElement.setAttribute('clickable', '');\n this.avatarElement.classList.add('avatar-42', 'person-avatar');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n\n this.btnJoin = Button('btn-primary btn-color-primary chat-join hide');\n this.btnGroupCall = ButtonIcon('videochat');\n this.btnPinned = ButtonIcon('pinlist');\n this.btnMute = ButtonIcon('mute');\n\n this.attachClickEvent(this.btnGroupCall, this.onJoinGroupCallClick);\n\n this.attachClickEvent(this.btnPinned, () => {\n this.openPinned(true);\n });\n\n this.attachClickEvent(this.btnMute, () => {\n this.appMessagesManager.mutePeer(this.peerId);\n });\n\n this.attachClickEvent(this.btnJoin, () => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.btnJoin.setAttribute('disabled', 'true');\n\n const chatId = this.peerId.toChatId();\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, rootScope.myId);\n }\n\n promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.btnJoin.removeAttribute('disabled');\n });\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = this.appChatsManager.getChat(chatId) as Channel/* | Chat */;\n \n this.btnJoin.classList.toggle('hide', !(chat as Channel)?.pFlags?.left);\n this.setUtilsWidth();\n this.verifyButtons();\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(dialog.peerId === this.peerId) {\n this.setMutedState();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.verifyButtons();\n }\n });\n\n if(this.pinnedMessage) {\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n appStateManager.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[this.chat.peerId];\n \n if(isTopMessage) {\n this.pinnedMessage.unsetScrollDownListener();\n this.pinnedMessage.testMid(mid, 0); // * because slider will not let get bubble by document.elementFromPoint\n } else if(!this.pinnedMessage.locked) {\n this.pinnedMessage.handleFollowingPinnedMessage();\n this.pinnedMessage.testMid(mid);\n }\n });\n });\n }\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public constructPinnedHelpers() {\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(peerId !== this.peerId) return;\n\n if(mids) {\n this.setTitle();\n }\n });\n }\n \n public constructDiscussionHelpers() {\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n }\n\n public openPinned(byCurrent: boolean) {\n this.chat.appImManager.setInnerPeer(this.peerId, byCurrent ? +this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid : 0, 'pinned');\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\n this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n \n if(this.pinnedMessage) {\n this.pinnedMessage.destroy(); // * возможно это можно не делать\n }\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public setPeer(peerId: PeerId) {\n this.wasPeerId = this.peerId;\n this.peerId = peerId;\n\n this.container.style.display = peerId ? '' : 'none';\n }\n\n public finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number) {\n const peerId = this.peerId;\n\n if(this.avatarElement) {\n this.avatarElement.setAttribute('peer', '' + peerId);\n this.avatarElement.update();\n }\n\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast);\n if(this.appPeersManager.isAnyChat(peerId)) {\n if(this.btnJoin) {\n const chatId = peerId.toChatId();\n replaceContent(this.btnJoin, i18n(this.appChatsManager.isChannel(chatId) ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !this.appChatsManager.getChat(chatId)?.pFlags?.left);\n }\n }\n \n this.setUtilsWidth();\n\n this.verifyButtons();\n\n const middleware = this.chat.bubbles.getMiddleware();\n if(this.pinnedMessage) { // * replace with new one\n if(this.chat.type === 'chat') {\n if(this.wasPeerId !== undefined) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n //this.pinnedMessage.pinnedMessageContainer.toggle(true);\n this.pinnedMessage = newPinnedMessage;\n }\n \n appStateManager.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\n \n if(!isTarget) {\n this.pinnedMessage.setCorrectIndex(0);\n }\n });\n } else if(this.chat.type === 'discussion') {\n this.pinnedMessage.pinnedMid = this.chat.threadId;\n this.pinnedMessage.count = 1;\n this.pinnedMessage.pinnedIndex = 0;\n this.pinnedMessage._setPinnedMessage();\n }\n }\n\n fastRaf(() => {\n this.setTitle();\n this.setPeerStatus(true);\n this.setMutedState();\n });\n }\n\n public setTitle(count?: number) {\n let titleEl: HTMLElement;\n if(this.chat.type === 'pinned') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('PinnedMessagesCount', [count]);\n\n if(count === undefined) {\n this.appMessagesManager.getSearchCounters(this.peerId, [{_: 'inputMessagesFilterPinned'}], false).then(result => {\n const count = result[0].count;\n this.setTitle(count);\n\n // ! костыль х2, это нужно делать в другом месте\n if(!count) {\n this.chat.appImManager.setPeer(NULL_PEER_ID); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n }\n });\n }\n } else if(this.chat.type === 'scheduled') {\n if(this.peerId === rootScope.myId) {\n //title = [count > 1 ? count : false, 'Reminders'].filter(Boolean).join(' ');\n titleEl = i18n('Reminders');\n } else {\n titleEl = i18n('ScheduledMessages');\n //title = [count > 1 ? count : false, 'Scheduled Messages'].filter(Boolean).join(' ');\n }\n \n if(count === undefined) {\n this.appMessagesManager.getScheduledMessages(this.peerId).then(mids => {\n this.setTitle(mids.length);\n });\n }\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n\n if(count === undefined) {\n Promise.all([\n this.appMessagesManager.getHistory(this.peerId, 0, 1, 0, this.chat.threadId),\n Promise.resolve()\n ]).then(() => {\n const count = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId).count;\n if(count === null) {\n setTimeout(() => {\n this.setTitle();\n }, 30);\n } else {\n this.setTitle(count);\n }\n });\n }\n } else if(this.chat.type === 'chat') {\n titleEl = new PeerTitle({\n peerId: this.peerId,\n dialog: true,\n }).element;\n }\n \n replaceContent(this.title, titleEl);\n\n if(this.chat.type === 'chat') {\n const peer = this.appPeersManager.getPeer(this.peerId);\n if(peer?.pFlags?.verified) {\n this.title.append(generateVerifiedIcon());\n }\n }\n }\n\n public setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n let muted = this.appNotificationsManager.isPeerLocalMuted(peerId, false);\n if(this.appPeersManager.isBroadcast(peerId)) { // not human\n this.btnMute.classList.remove('tgico-mute', 'tgico-unmute');\n this.btnMute.classList.add(muted ? 'tgico-unmute' : 'tgico-mute');\n this.btnMute.style.display = '';\n } else {\n this.btnMute.style.display = 'none';\n }\n }\n\n // ! У МЕНЯ ПРОСТО СГОРЕЛО, САФАРИ КОНЧЕННЫЙ БРАУЗЕР - ЕСЛИ НЕ СКРЫВАТЬ БЛОК, ТО ПРИ ПЕРЕВОРОТЕ ЭКРАНА НА АЙФОНЕ БЛОК БУДЕТ НЕПРАВИЛЬНО ШИРИНЫ, ДАЖЕ БЕЗ ЭТОЙ ФУНКЦИИ!\n public setUtilsWidth = (resize = false) => {\n //return;\n if(this.setUtilsRAF) window.cancelAnimationFrame(this.setUtilsRAF);\n\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.add('hide');\n }\n\n //mutationObserver.disconnect();\n this.setUtilsRAF = window.requestAnimationFrame(() => {\n \n //mutationRAF = window.requestAnimationFrame(() => {\n \n //setTimeout(() => {\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.remove('hide');\n }\n /* this.chatInfo.style.removeProperty('--utils-width');\n void this.chatInfo.offsetLeft; // reflow */\n const width = /* chatUtils.scrollWidth */this.chatUtils.getBoundingClientRect().width;\n this.chat.log('utils width:', width);\n this.container.style.setProperty('--utils-width', width + 'px');\n //this.chatInfo.classList.toggle('have-utils-width', !!width);\n //}, 0);\n \n this.setUtilsRAF = 0;\n\n //mutationObserver.observe(chatUtils, observeOptions);\n //});\n });\n };\n\n public setFloating = () => {\n const containers = [this.chatAudio, this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.divAndCaption.container.classList.contains('is-floating');\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatus = (needClear = false) => {\n if(!this.subtitle) return;\n\n const peerId = this.peerId;\n this.chat.appImManager.setPeerStatus(this.peerId, this.subtitle, needClear, false, () => peerId === this.peerId);\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarRight from \"..\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport AppSearch, { SearchGroup } from \"../../appSearch\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport PopupDatePicker from \"../../popups/datePicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppPrivateSearchTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private appSearch: AppSearch;\r\n private btnPickDate: HTMLElement;\r\n\r\n private peerId: PeerId;\r\n private threadId = 0;\r\n private query = '';\r\n private onDatePick: (timestamp: number) => void;\r\n\r\n onOpenAfterTimeout() {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\r\n }\r\n\r\n protected init() {\r\n this.container.id = 'search-private-container';\r\n this.container.classList.add('chatlist-container');\r\n this.inputSearch = new InputSearch('Search');\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\r\n this.header.append(this.btnPickDate);\r\n\r\n const c = document.createElement('div');\r\n c.classList.add('chatlist-container');\r\n this.scrollable.container.replaceWith(c);\r\n this.appSearch = new AppSearch(c, this.inputSearch, {\r\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\r\n });\r\n }\r\n\r\n open(peerId: PeerId, threadId?: number, onDatePick?: AppPrivateSearchTab['onDatePick'], query?: string) {\r\n const ret = super.open();\r\n\r\n if(!this.peerId) {\r\n this.query = query;\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n this.onDatePick = onDatePick;\r\n \r\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\r\n if(this.onDatePick) {\r\n attachClickEvent(this.btnPickDate, () => {\r\n new PopupDatePicker(new Date(), this.onDatePick).show();\r\n });\r\n }\r\n\r\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\r\n \r\n appSidebarRight.toggleSidebar(true);\r\n } else {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\r\n }\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatTopbar from \"./topbar\";\r\nimport AppSearch, { SearchGroup } from \"../appSearch\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport { ripple } from \"../ripple\";\r\nimport InputSearch from \"../inputSearch\";\r\nimport type Chat from \"./chat\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport { i18n } from \"../../lib/langPack\";\r\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\r\n constructor(private topbar: ChatTopbar, private chat: Chat, private 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 this.backBtn.addEventListener('click', () => {\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.footer.removeEventListener('click', this.onFooterClick);\r\n this.dateBtn.removeEventListener('click', this.onDateClick);\r\n this.upBtn.removeEventListener('click', this.onUpClick);\r\n this.downBtn.removeEventListener('click', this.onDownClick);\r\n this.searchGroup.list.removeEventListener('click', this.onResultsClick);\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n }, {once: true});\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 this.searchGroup.list.addEventListener('click', 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 this.foundCountEl.replaceWith(this.inputSearch.value ? i18n('NoResult') : '');\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\r\n }\r\n });\r\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\r\n\r\n //appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\r\n this.chat.bubbles.bubblesContainer.append(this.results);\r\n\r\n // Footer\r\n this.footer = document.createElement('div');\r\n this.footer.classList.add('chat-search-footer');\r\n\r\n this.footer.addEventListener('click', 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 this.dateBtn.addEventListener('click', this.onDateClick);\r\n this.upBtn.addEventListener('click', this.onUpClick);\r\n this.downBtn.addEventListener('click', 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 query && (this.inputSearch.inputField.value = query);\r\n }\r\n\r\n onDateClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n new PopupDatePicker(new Date(), this.chat.bubbles.onDatePick).show();\r\n };\r\n\r\n selectResult = (elem: HTMLElement) => {\r\n if(this.setPeerPromise) return this.setPeerPromise;\r\n\r\n const peerId = elem.dataset.peerId.toPeerId();\r\n const lastMsgId = +elem.dataset.mid || undefined;\r\n\r\n const index = whichChild(elem);\r\n\r\n if(index === (this.foundCount - 1)) {\r\n this.upBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.upBtn.removeAttribute('disabled');\r\n }\r\n\r\n if(!index) {\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.downBtn.removeAttribute('disabled');\r\n }\r\n\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n\r\n const res = this.chat.setPeer(peerId, lastMsgId);\r\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\r\n this.selectedIndex = index;\r\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\r\n\r\n const renderedCount = this.searchGroup.list.childElementCount;\r\n if(this.selectedIndex >= (renderedCount - 6)) {\r\n this.appSearch.searchMore();\r\n }\r\n }).finally(() => {\r\n this.setPeerPromise = null;\r\n });\r\n };\r\n\r\n onResultsClick = (e: MouseEvent) => {\r\n const target = findUpTag(e.target, 'LI');\r\n if(target) {\r\n this.selectResult(target);\r\n }\r\n };\r\n\r\n onFooterClick = (e: MouseEvent) => {\r\n if(this.foundCount) {\r\n this.chat.bubbles.bubblesContainer.classList.toggle('search-results-active');\r\n this.results.classList.toggle('active');\r\n }\r\n };\r\n\r\n 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 onDownClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\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 { AppNotificationsManager } from \"../../lib/appManagers/appNotificationsManager\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppDocsManager } from \"../../lib/appManagers/appDocsManager\";\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport type { AppPhotosManager } from \"../../lib/appManagers/appPhotosManager\";\nimport type { AppPollsManager } from \"../../lib/appManagers/appPollsManager\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\nimport type { ApiManagerProxy } from \"../../lib/mtproto/mtprotoworker\";\nimport type { AppDraftsManager } from \"../../lib/appManagers/appDraftsManager\";\nimport type { AppEmojiManager } from \"../../lib/appManagers/appEmojiManager\";\nimport type { ServerTimeManager } from \"../../lib/mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { State } from \"../../lib/appManagers/appStateManager\";\nimport type stateStorage from '../../lib/stateStorage';\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport { logger, LogTypes } from \"../../lib/logger\";\nimport rootScope from \"../../lib/rootScope\";\nimport appSidebarRight from \"../sidebarRight\";\nimport ChatBubbles from \"./bubbles\";\nimport ChatContextMenu from \"./contextMenu\";\nimport ChatInput from \"./input\";\nimport ChatSelection from \"./selection\";\nimport ChatTopbar from \"./topbar\";\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\nimport SetTransition from \"../singleTransition\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport AppPrivateSearchTab from \"../sidebarRight/tabs/search\";\nimport renderImageFromUrl from \"../../helpers/dom/renderImageFromUrl\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport ChatSearch from \"./search\";\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\n public wasAlreadyUsed = false;\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 = 'chat';\n\n public noAutoDownloadMedia: boolean;\n\n public inited = false;\n \n constructor(public appImManager: AppImManager, \n public appChatsManager: AppChatsManager, \n public appDocsManager: AppDocsManager, \n public appInlineBotsManager: AppInlineBotsManager, \n public appMessagesManager: AppMessagesManager, \n public appPeersManager: AppPeersManager, \n public appPhotosManager: AppPhotosManager, \n public appProfileManager: AppProfileManager, \n public appStickersManager: AppStickersManager, \n public appUsersManager: AppUsersManager, \n public appWebPagesManager: AppWebPagesManager, \n public appPollsManager: AppPollsManager, \n public apiManager: ApiManagerProxy, \n public appDraftsManager: AppDraftsManager, \n public serverTimeManager: ServerTimeManager, \n public storage: typeof stateStorage, \n public appNotificationsManager: AppNotificationsManager,\n public appEmojiManager: AppEmojiManager,\n public appMessagesIdsManager: AppMessagesIdsManager,\n public appGroupCallsManager: AppGroupCallsManager\n ) {\n super();\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.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n }\n\n public setBackground(url: string): Promise {\n const theme = rootScope.getTheme();\n\n let item: HTMLElement;\n if(theme.background.type === 'color' && document.documentElement.style.cursor === 'grabbing') {\n const _item = this.backgroundEl.lastElementChild as HTMLElement;\n if(_item && _item.dataset.type === theme.background.type) {\n item = _item;\n }\n }\n \n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n item.dataset.type = theme.background.type;\n }\n\n if(theme.background.type === 'color') {\n item.style.backgroundColor = theme.background.color;\n item.style.backgroundImage = 'none';\n }\n\n return new Promise((resolve) => {\n const cb = () => {\n const prev = this.backgroundEl.lastElementChild as HTMLElement;\n\n if(prev === item) {\n resolve();\n return;\n }\n\n this.backgroundEl.append(item);\n\n // * одного недостаточно, при обновлении страницы все равно фон появляется неплавно\n // ! с requestAnimationFrame лучше, но все равно иногда моргает, так что использую два фаста.\n fastRaf(() => {\n fastRaf(() => {\n SetTransition(item, 'is-visible', true, 200, prev ? () => {\n prev.remove();\n } : null);\n });\n });\n\n resolve();\n };\n\n if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n }\n\n public setType(type: ChatType) {\n this.type = type;\n\n if(this.type === 'scheduled') {\n this.getMessagesStorage = () => this.appMessagesManager.getScheduledMessagesStorage(this.peerId);\n //this.getMessage = (mid) => this.appMessagesManager.getMessageFromStorage(this.appMessagesManager.getScheduledMessagesStorage(this.peerId), mid);\n }\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.appMessagesManager, this.appPeersManager, this.appChatsManager, this.appNotificationsManager, this.appProfileManager, this.appUsersManager, this.appGroupCallsManager);\n this.bubbles = new ChatBubbles(this, this.appMessagesManager, this.appStickersManager, this.appUsersManager, this.appInlineBotsManager, this.appPhotosManager, this.appPeersManager, this.appProfileManager, this.appDraftsManager, this.appMessagesIdsManager);\n this.input = new ChatInput(this, this.appMessagesManager, this.appMessagesIdsManager, this.appDocsManager, this.appChatsManager, this.appPeersManager, this.appWebPagesManager, this.appImManager, this.appDraftsManager, this.serverTimeManager, this.appNotificationsManager, this.appEmojiManager, this.appUsersManager, this.appInlineBotsManager);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.appMessagesManager);\n this.contextMenu = new ChatContextMenu(this.bubbles.bubblesContainer, this, this.appMessagesManager, this.appPeersManager, this.appPollsManager, this.appDocsManager, this.appMessagesIdsManager);\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 this.container.classList.add('type-' + this.type);\n this.container.append(this.topbar.container, this.bubbles.bubblesContainer, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer(migrateTo);\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (e) => {\n if(e.peerId === this.peerId) {\n this.appImManager.setPeer(NULL_PEER_ID);\n }\n });\n }\n\n public beforeDestroy() {\n this.bubbles.cleanup();\n }\n\n public destroy() {\n //const perf = performance.now();\n\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n\n delete this.topbar;\n delete this.bubbles;\n delete this.input;\n delete this.selection;\n delete this.contextMenu;\n\n this.container.remove();\n\n //this.log.error('Chat destroy time:', performance.now() - perf);\n }\n\n public cleanup(helperToo = true) {\n this.input.cleanup(helperToo);\n this.selection.cleanup();\n }\n\n public setPeer(peerId: PeerId, lastMsgId?: number) {\n if(!peerId) {\n this.inited = false;\n } else if(!this.inited) {\n if(this.init) {\n this.init(/* peerId */);\n this.init = null;\n }\n\n this.inited = true;\n }\n\n const samePeer = this.peerId === peerId;\n if(!samePeer) {\n rootScope.dispatchEvent('peer_changing', this);\n this.peerId = peerId;\n } else if(this.setPeerPromise) {\n return;\n }\n\n //console.time('appImManager setPeer');\n //console.time('appImManager setPeer pre promise');\n ////console.time('appImManager: pre render start');\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.topbar.setPeer(peerId);\n this.bubbles.setPeer(peerId);\n rootScope.dispatchEvent('peer_changed', peerId);\n\n return;\n }\n\n // set new\n if(!samePeer) {\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n\n appSidebarRight.sharedMediaTab.setPeer(peerId, this.threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n this.setAutoDownloadMedia();\n }\n\n this.peerChanged = samePeer;\n\n const result = this.bubbles.setPeer(peerId, lastMsgId);\n if(!result) {\n return;\n }\n\n const {promise} = result;\n\n //console.timeEnd('appImManager setPeer pre promise');\n \n const setPeerPromise = this.setPeerPromise = promise.finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n if(!samePeer) {\n appSidebarRight.sharedMediaTab.setLoadMutex(this.setPeerPromise);\n appSidebarRight.sharedMediaTab.loadSidebarMedia(true);\n }\n /* this.setPeerPromise.then(() => {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(false);\n }); */\n\n return result;\n }\n\n public setAutoDownloadMedia() {\n const peerId = this.peerId;\n if(!peerId) {\n return;\n }\n\n let type: keyof State['settings']['autoDownload'];\n\n if(!peerId.isUser()) {\n if(peerId.isBroadcast()) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n } else {\n if(peerId.isContact()) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n }\n\n this.noAutoDownloadMedia = !rootScope.settings.autoDownload[type];\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer(this.peerId, messageId);\n }\n\n public finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number) {\n if(this.peerChanged) return;\n\n let peerId = this.peerId;\n this.peerChanged = true;\n\n this.cleanup(false);\n\n this.topbar.setPeer(peerId);\n this.topbar.finishPeerChange(isTarget, isJump, lastMsgId);\n this.bubbles.finishPeerChange();\n this.input.finishPeerChange();\n\n appSidebarRight.sharedMediaTab.fillProfileElements();\n\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n rootScope.dispatchEvent('peer_changed', peerId);\n this.wasAlreadyUsed = true;\n }\n\n public getMessagesStorage() {\n return this.appMessagesManager.getMessagesStorage(this.peerId);\n }\n\n public getMessage(mid: number) {\n return this.appMessagesManager.getMessageFromStorage(this.getMessagesStorage(), mid);\n //return this.appMessagesManager.getMessageByPeer(this.peerId, mid);\n }\n\n public getMidsByMid(mid: number) {\n return this.appMessagesManager.getMidsByMessage(this.getMessage(mid));\n }\n\n public isAnyGroup() {\n return this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || this.appPeersManager.isAnyGroup(this.peerId);\n }\n\n public initSearch(query?: string) {\n if(!this.peerId) return;\n\n if(mediaSizes.isMobile) {\n new ChatSearch(this.topbar, this, query);\n } else {\n let tab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(!tab) {\n tab = new AppPrivateSearchTab(appSidebarRight);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { clamp } from \"../../helpers/number\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appNavigationController from \"../appNavigationController\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport getSelectedNodes from \"../../helpers/dom/getSelectedNodes\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { MarkdownType, markdownTags } from \"../../helpers/dom/getRichElementValue\";\r\n//import { logger } from \"../../lib/logger\";\r\n\r\nexport default class MarkupTooltip {\r\n public container: HTMLElement;\r\n private wrapper: HTMLElement;\r\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\r\n private linkBackButton: HTMLElement;\r\n private linkApplyButton: HTMLButtonElement;\r\n private hideTimeout: number;\r\n private addedListener = false;\r\n private waitingForMouseUp = false;\r\n private linkInput: HTMLInputElement;\r\n private savedRange: Range;\r\n private mouseUpCounter: number = 0;\r\n //private log: ReturnType;\r\n\r\n constructor(private appImManager: AppImManager) {\r\n //this.log = logger('MARKUP');\r\n }\r\n\r\n private init() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\r\n\r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add('markup-tooltip-wrapper');\r\n \r\n const tools1 = document.createElement('div');\r\n const tools2 = document.createElement('div');\r\n tools1.classList.add('markup-tooltip-tools');\r\n tools2.classList.add('markup-tooltip-tools');\r\n\r\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'link'] as (keyof MarkupTooltip['buttons'])[];\r\n arr.forEach(c => {\r\n const button = ButtonIcon(c, {noRipple: true});\r\n tools1.append(this.buttons[c] = button);\r\n\r\n if(c !== 'link') {\r\n button.addEventListener('mousedown', (e) => {\r\n cancelEvent(e); \r\n this.appImManager.chat.input.applyMarkdown(c);\r\n this.cancelClosening();\r\n \r\n /* this.mouseUpCounter = 0;\r\n this.setMouseUpEvent(); */\r\n //this.hide();\r\n });\r\n } else {\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n this.showLinkEditor();\r\n this.cancelClosening();\r\n });\r\n }\r\n });\r\n\r\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\r\n this.linkInput = document.createElement('input');\r\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\r\n this.linkInput.classList.add('input-clear');\r\n this.linkInput.addEventListener('keydown', (e) => {\r\n const valid = !this.linkInput.value.length || !!RichTextProcessor.matchUrl(this.linkInput.value);///^(http)|(https):\\/\\//i.test(this.linkInput.value);\r\n\r\n if(e.key === 'Enter') {\r\n if(!valid) {\r\n if(this.linkInput.classList.contains('error')) {\r\n this.linkInput.classList.remove('error');\r\n void this.linkInput.offsetLeft; // reflow\r\n }\r\n\r\n this.linkInput.classList.add('error');\r\n } else {\r\n this.applyLink(e);\r\n }\r\n }\r\n });\r\n\r\n this.linkInput.addEventListener('input', (e) => {\r\n const valid = this.isLinkValid();\r\n\r\n this.linkInput.classList.toggle('is-valid', valid);\r\n this.linkInput.classList.remove('error');\r\n });\r\n\r\n this.linkBackButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkBackButton click');\r\n cancelEvent(e);\r\n this.container.classList.remove('is-link');\r\n //input.value = '';\r\n this.resetSelection();\r\n this.setTooltipPosition();\r\n this.cancelClosening();\r\n });\r\n\r\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\r\n this.linkApplyButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkApplyButton click');\r\n this.applyLink(e);\r\n });\r\n\r\n const applyDiv = document.createElement('div');\r\n applyDiv.classList.add('markup-tooltip-link-apply-container');\r\n \r\n const delimiter1 = document.createElement('span');\r\n const delimiter2 = document.createElement('span');\r\n const delimiter3 = document.createElement('span');\r\n delimiter1.classList.add('markup-tooltip-delimiter');\r\n delimiter2.classList.add('markup-tooltip-delimiter');\r\n delimiter3.classList.add('markup-tooltip-delimiter');\r\n tools1.insertBefore(delimiter1, this.buttons.link);\r\n applyDiv.append(delimiter3, this.linkApplyButton);\r\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\r\n //tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\r\n\r\n this.wrapper.append(tools1, tools2);\r\n this.container.append(this.wrapper);\r\n document.body.append(this.container);\r\n \r\n window.addEventListener('resize', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n public showLinkEditor() {\r\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\r\n this.show();\r\n }\r\n\r\n const button = this.buttons.link;\r\n this.container.classList.add('is-link');\r\n\r\n const selection = document.getSelection();\r\n this.savedRange = selection.getRangeAt(0);\r\n \r\n if(button.classList.contains('active')) {\r\n const startContainer = this.savedRange.startContainer;\r\n const anchor = startContainer.parentElement as HTMLAnchorElement;\r\n this.linkInput.value = anchor.href;\r\n } else {\r\n this.linkInput.value = '';\r\n }\r\n\r\n this.setTooltipPosition(true);\r\n\r\n setTimeout(() => {\r\n this.linkInput.focus(); // !!! instant focus will break animation\r\n }, 200);\r\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\r\n }\r\n\r\n private applyLink(e: Event) {\r\n cancelEvent(e);\r\n this.resetSelection();\r\n let url = this.linkInput.value;\r\n if(url && !RichTextProcessor.matchUrlProtocol(url)) {\r\n url = 'https://' + url;\r\n }\r\n this.appImManager.chat.input.applyMarkdown('link', url);\r\n setTimeout(() => {\r\n this.hide();\r\n }, 0);\r\n }\r\n\r\n private isLinkValid() {\r\n return !this.linkInput.value.length || !!RichTextProcessor.matchUrl(this.linkInput.value);\r\n }\r\n\r\n private resetSelection(range: Range = this.savedRange) {\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n this.appImManager.chat.input.messageInput.focus();\r\n }\r\n\r\n public hide() {\r\n //return;\r\n\r\n if(this.init) return;\r\n\r\n this.container.classList.remove('is-visible');\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n this.waitingForMouseUp = false;\r\n\r\n appNavigationController.removeByType('markup');\r\n\r\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hideTimeout = undefined;\r\n this.container.classList.add('hide');\r\n this.container.classList.remove('is-link');\r\n }, 200);\r\n }\r\n\r\n public getActiveMarkupButton() {\r\n const nodes = getSelectedNodes();\r\n const parents = [...new Set(nodes.map(node => node.parentNode))];\r\n //if(parents.length > 1 && parents) return [];\r\n\r\n const currentMarkups: Set = new Set();\r\n (parents as HTMLElement[]).forEach(node => {\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = node.closest(tag.match + ', [contenteditable]');\r\n if(closest !== this.appImManager.chat.input.messageInput) {\r\n currentMarkups.add(this.buttons[type as MarkdownType]);\r\n }\r\n }\r\n });\r\n \r\n\r\n return [...currentMarkups];\r\n }\r\n\r\n public setActiveMarkupButton() {\r\n const activeButtons = this.getActiveMarkupButton();\r\n\r\n for(const i in this.buttons) {\r\n // @ts-ignore\r\n const button = this.buttons[i];\r\n button.classList.toggle('active', activeButtons.includes(button));\r\n }\r\n }\r\n\r\n private setTooltipPosition(isLinkToggle = false) {\r\n const selection = document.getSelection();\r\n const range = selection.getRangeAt(0);\r\n\r\n const bodyRect = document.body.getBoundingClientRect();\r\n const selectionRect = range.getBoundingClientRect();\r\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\r\n\r\n this.container.style.maxWidth = inputRect.width + 'px';\r\n\r\n const selectionTop = 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 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 if(document.activeElement !== this.appImManager.chat.input.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 {\r\n this.setMouseUpEvent();\r\n }\r\n });\r\n }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedNodes() {\r\n const nodes: Node[] = [];\r\n const selection = window.getSelection();\r\n for(let i = 0; i < selection.rangeCount; ++i) {\r\n const range = selection.getRangeAt(i);\r\n let {startContainer, endContainer} = range;\r\n if(endContainer.nodeType !== 3) endContainer = endContainer.firstChild;\r\n \r\n while(startContainer && startContainer !== endContainer) {\r\n nodes.push(startContainer.nodeType === 3 ? startContainer : startContainer.firstChild);\r\n startContainer = startContainer.nextSibling;\r\n }\r\n \r\n if(nodes[nodes.length - 1] !== endContainer) {\r\n nodes.push(endContainer);\r\n }\r\n }\r\n\r\n // * filter null's due to
\r\n return nodes.filter(node => !!node);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// generate a path's arc data parameter\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\r\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\r\n return [rx, ',', ry, ' ',\r\n xAxisRotation, ' ',\r\n largeArcFlag, ',',\r\n sweepFlag, ' ',\r\n x, ',', y ].join('');\r\n}\r\n\r\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\r\n const data: string[] = [];\r\n\r\n // start point in top-middle of the rectangle\r\n data.push('M' + (x + width / 2) + ',' + y);\r\n\r\n // next we go to the right\r\n data.push('H' + (x + width - tr));\r\n\r\n if(tr > 0) {\r\n // now we draw the arc in the top-right corner\r\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\r\n }\r\n\r\n // next we go down\r\n data.push('V' + (y + height - br));\r\n\r\n if(br > 0) {\r\n // now we draw the arc in the lower-right corner\r\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\r\n }\r\n\r\n // now we go to the left\r\n data.push('H' + (x + bl));\r\n\r\n if(bl > 0) {\r\n // now we draw the arc in the lower-left corner\r\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\r\n }\r\n\r\n // next we go up\r\n data.push('V' + (y + tl));\r\n\r\n if(tl > 0) {\r\n // now we draw the arc in the top-left corner\r\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\r\n }\r\n\r\n // and we close the path\r\n data.push('Z');\r\n\r\n return data.join(' ');\r\n}\r\n\r\nMOUNT_CLASS_TO.generatePathData = generatePathData;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport generatePathData from \"../../helpers/generatePathData\";\r\nimport { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\r\n\r\nexport default class ChatDragAndDrop {\r\n container: HTMLDivElement;\r\n svg: SVGSVGElement;\r\n outlineWrapper: HTMLDivElement;\r\n path: SVGPathElement;\r\n\r\n constructor(appendTo: HTMLElement, private options: {\r\n icon?: string,\r\n header: LangPackKey,\r\n headerArgs?: FormatterArguments,\r\n subtitle?: LangPackKey,\r\n onDrop: (e: DragEvent) => void\r\n }) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('drop', 'z-depth-1');\r\n\r\n this.outlineWrapper = document.createElement('div');\r\n this.outlineWrapper.classList.add('drop-outline-wrapper');\r\n\r\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n this.svg.classList.add('drop-outline');\r\n\r\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n this.path.classList.add('drop-outline-path');\r\n\r\n let dropIcon: HTMLElement;\r\n if(options.icon) {\r\n dropIcon = document.createElement('div');\r\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\r\n }\r\n\r\n const dropHeader = document.createElement('div');\r\n dropHeader.classList.add('drop-header');\r\n dropHeader.append(i18n(options.header, options.headerArgs));\r\n\r\n let dropSubtitle: HTMLElement;\r\n if(options.subtitle) {\r\n dropSubtitle = document.createElement('div');\r\n dropSubtitle.classList.add('drop-subtitle');\r\n dropSubtitle.append(i18n(options.subtitle));\r\n }\r\n\r\n this.svg.append(this.path);\r\n this.outlineWrapper.append(this.svg);\r\n\r\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\r\n appendTo.append(this.container);\r\n\r\n this.container.addEventListener('dragover', this.onDragOver);\r\n this.container.addEventListener('dragleave', this.onDragLeave);\r\n this.container.addEventListener('drop', this.onDrop);\r\n }\r\n\r\n onDragOver = (e: DragEvent) => {\r\n this.container.classList.add('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', true, 500);\r\n };\r\n\r\n onDragLeave = (e: DragEvent) => {\r\n this.container.classList.remove('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', false, 500);\r\n };\r\n\r\n onDrop = (e: DragEvent) => {\r\n this.options.onDrop(e);\r\n };\r\n\r\n destroy() {\r\n delete this.options;\r\n this.container.remove();\r\n this.container.removeEventListener('dragover', this.onDragOver);\r\n this.container.removeEventListener('dragleave', this.onDragLeave);\r\n this.container.removeEventListener('drop', this.onDrop);\r\n }\r\n\r\n setPath() {\r\n const rect = this.outlineWrapper.getBoundingClientRect();\r\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\r\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\r\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\r\n\r\n const radius = 10;\r\n //const strokeWidth = 2;\r\n const sizeX = rect.width - radius;\r\n const sizeY = rect.height - radius;\r\n const pos = radius / 2;\r\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\r\n this.path.setAttributeNS(null, 'd', d);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { doubleRaf } from \"../schedulers\";\r\n\r\nexport default function disableTransition(elements: HTMLElement[]) {\r\n elements.forEach(el => el.classList.add('no-transition'));\r\n\r\n doubleRaf().then(() => {\r\n elements.forEach(el => el.classList.remove('no-transition'));\r\n });\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: 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\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};\n","/*\r\n * https://github.com/morethanwords/tweb\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 { ChatInvite, Updates } from \"../../layer\";\r\nimport apiUpdatesManager from \"../../lib/appManagers/apiUpdatesManager\";\r\nimport appAvatarsManager from \"../../lib/appManagers/appAvatarsManager\";\r\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\r\nimport appPhotosManager from \"../../lib/appManagers/appPhotosManager\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport apiManager from \"../../lib/mtproto/mtprotoworker\";\r\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { wrapPhoto } from \"../wrappers\";\r\n\r\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\r\n\r\nexport default class PopupJoinChatInvite extends PopupElement {\r\n constructor(hash: string, chatInvite: ChatInvite.chatInvite) {\r\n super('popup-join-chat-invite', addCancelButton([{\r\n langKey: chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle',\r\n callback: () => {\r\n apiManager.invokeApi('messages.importChatInvite', {hash})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n const chat = (updates as Updates.updates).chats[0];\r\n const peerId = chat.id.toPeerId(true);\r\n rootScope.dispatchEvent('history_focus', {peerId});\r\n });\r\n }\r\n }]), {closable: true, overlayClosable: true, body: true});\r\n\r\n this.header.remove();\r\n\r\n /* const fakeChat: Chat.channel | Chat.chat = {\r\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\r\n id: FAKE_CHAT_ID,\r\n title: chatInvite.title,\r\n photo: chatInvite.photo as any,\r\n date: Date.now() / 1000 | 0,\r\n version: 0,\r\n participants_count: chatInvite.participants_count,\r\n pFlags: chatInvite.pFlags as any\r\n };\r\n\r\n appChatsManager.saveApiChat(fakeChat); */\r\n \r\n const avatarElem = new AvatarElement();\r\n avatarElem.setAttribute('dialog', '0');\r\n avatarElem.classList.add('avatar-100');\r\n if(chatInvite.photo._ === 'photo') {\r\n chatInvite.photo = appPhotosManager.savePhoto(chatInvite.photo);\r\n wrapPhoto({\r\n container: avatarElem,\r\n message: null,\r\n photo: chatInvite.photo,\r\n boxHeight: 100,\r\n boxWidth: 100,\r\n withoutPreloader: true\r\n });\r\n avatarElem.style.width = avatarElem.style.height = '';\r\n } else {\r\n appAvatarsManager.putPhoto(avatarElem, NULL_PEER_ID, false, chatInvite.title);\r\n }\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('chat-title');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(chatInvite.title);\r\n //avatarElem.setAttribute('peer', '' + -fakeChat.id);\r\n \r\n const isBroadcast = chatInvite.pFlags.broadcast;\r\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [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}\r\n","/*\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 private handleFocus = () => {\n this.focused = true;\n this.invokeDraw();\n }\n \n private 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() {\n const className = 'topbar-call-weave';\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add(className + '-canvas');\n\n container.append(canvas);\n\n return container;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from \"../../lib/rootScope\";\n\nexport type CustomProperty = string;\n\nexport class CustomProperties {\n private cache: {[k in CustomProperty]?: string};\n private computedStyle: CSSStyleDeclaration;\n\n constructor() {\n this.cache = {};\n\n rootScope.addEventListener('theme_change', () => {\n this.computedStyle = undefined;\n const cache = this.cache;\n this.cache = {};\n\n for(let i in cache) {\n this.getProperty(i);\n }\n });\n }\n\n public getProperty(name: CustomProperty) {\n let value = this.cache[name];\n if(value) {\n return value;\n }\n\n if(!this.computedStyle) {\n this.computedStyle = window.getComputedStyle(document.documentElement);\n }\n\n value = this.computedStyle.getPropertyValue('--' + name).trim();\n return this.cache[name] = value;\n }\n}\n\nconst customProperties = new CustomProperties();\nexport default customProperties;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from \"../../helpers/noop\";\nimport { safeAssign } from \"../../helpers/object\";\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};\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() {\n return this.item.playPart(this);\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\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\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) {\n return this.icon.playPart(this, part);\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 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]) {\n if(!item.player) return;\n const part = item.getPart(index);\n item.player.playPart({\n from: part.startFrame, \n to: part.endFrame\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","import noop from \"../helpers/noop\";\nimport { safeAssign } from \"../helpers/object\";\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 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 public setState(partState: Options['PartState'], colorState?: Options['ColorState']) {\n if(!this.loaded) this.load(partState, colorState);\n if(partState !== undefined) this.setPartState(partState);\n if(colorState !== undefined && this.getColor) this.setColorState(colorState);\n }\n\n public setPartState(state: Options['PartState']) {\n const {partState: prevState} = this;\n if(prevState === state) {\n return;\n }\n\n this.partState = state;\n\n const part = this.getPart(state, prevState);\n part.play();\n }\n\n public setColorState(state: Options['ColorState']) {\n const {colorState: prevState} = this;\n if(prevState === state) {\n return;\n }\n\n this.colorState = state;\n \n const item = this.getItem();\n if(item.player) {\n const color = this.getColor(state, prevState);\n item.player.setColor(color);\n }\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 { addCancelButton } from \"./popups\";\nimport PopupPeer, { PopupPeerOptions } from \"./popups/peer\";\n\n// type PopupConfirmationOptions = Pick;\ntype PopupConfirmationOptions = PopupPeerOptions & {\n button: PopupPeerOptions['buttons'][0],\n checkbox?: PopupPeerOptions['checkboxes'][0]\n};\n\nexport default function confirmationPopup(options: PopupConfirmationOptions) {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n resolve(set ? !!set.size : undefined);\n };\n\n const buttons = addCancelButton([]);\n const cancelButton = buttons[0];\n cancelButton.callback = () => {\n reject();\n };\n\n buttons.unshift(button);\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 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 { safeAssign } from \"../../helpers/object\";\nimport { GroupCall, GroupCallParticipant } from \"../../layer\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppGroupCallsManager, GroupCallInstance } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GROUP_CALL_STATE from \"../../lib/calls/groupCallState\";\nimport { LangPackKey } from \"../../lib/langPack\";\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 MovableElement, { MovableState } from \"../movableElement\";\nimport animationIntersector from \"../animationIntersector\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\nimport toggleDisability from \"../../helpers/dom/toggleDisability\";\nimport { ripple } from \"../ripple\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport IS_SCREEN_SHARING_SUPPORTED from \"../../environment/screenSharingSupport\";\n\nexport enum GROUP_CALL_PARTICIPANT_MUTED_STATE {\n UNMUTED,\n MUTED,\n MUTED_FOR_ME,\n MUTED_BY_ADMIN,\n HAND\n}\n\nexport type GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE = Exclude;\n\nexport function getGroupCallParticipantMutedState(participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n if(participant.pFlags.muted_by_you) {\n return states.MUTED_FOR_ME;\n } else if(participant.raise_hand_rating !== undefined) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return participant.pFlags.can_self_unmute ? states.MUTED : states.MUTED_BY_ADMIN;\n } else {\n return states.UNMUTED;\n }\n}\n\nexport function clearMutedStateModifier(state: GROUP_CALL_PARTICIPANT_MUTED_STATE): GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n switch(state) {\n case states.MUTED_BY_ADMIN:\n case states.MUTED_FOR_ME:\n return states.MUTED;\n default:\n return state;\n }\n}\n\nexport function getColorByMutedState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n let color: RLottieColor, colorStr: 'blue' | 'green' | 'secondary' | 'red';\n switch(state) {\n case states.HAND:\n colorStr = 'blue';\n break;\n case states.MUTED:\n case states.MUTED_FOR_ME:\n case states.MUTED_BY_ADMIN:\n colorStr = state === states.MUTED ? 'secondary' : 'red';\n break;\n case states.UNMUTED:\n colorStr = 'green';\n break;\n }\n\n const propertyValue = customProperties.getProperty('gc-' + colorStr + '-text-color');\n color = hexToRgb(propertyValue);\n\n return color;\n}\n\nexport enum GROUP_CALL_MICROPHONE_BUTTON_STATE {\n HAND,\n MUTED,\n UNMUTED,\n}\n\nexport function getGroupCallMicrophoneButtonState(groupCall: GroupCall.groupCall, participant: GroupCallParticipant) {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n if(!participant.pFlags.can_self_unmute) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return states.MUTED\n } else {\n return states.UNMUTED;\n }\n}\n\nlet previousState: MovableState = {\n width: 420,\n height: 640\n};\n\nexport default class PopupGroupCall extends PopupElement {\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private appChatsManager: AppChatsManager;\n private instance: GroupCallInstance;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallBodyHeaderDescription: GroupCallDescriptionElement;\n private groupCallParticipants: GroupCallParticipantsElement;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private groupCallMicrophoneIcon: GroupCallMicrophoneIcon;\n private videosCount: number;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n private btnInvite: HTMLButtonElement;\n private btnShowColumn: HTMLButtonElement;\n private movable: MovableElement;\n private buttonsContainer: HTMLDivElement;\n private btnFullScreen2: HTMLButtonElement;\n\n constructor(options: {\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n appChatsManager: AppChatsManager,\n }) {\n super('popup-group-call', undefined, {\n body: true,\n withoutOverlay: true,\n closable: true\n });\n\n safeAssign(this, options);\n\n this.videosCount = 0;\n this.container.classList.add('group-call', 'night');\n\n const instance = this.instance = this.appGroupCallsManager.groupCall;\n const {listenerSetter} = this;\n\n if(!IS_APPLE_MOBILE) {\n const btnFullScreen = this.btnFullScreen = ButtonIcon('fullscreen');\n const btnFullScreen2 = this.btnFullScreen2 = ButtonIcon('fullscreen group-call-cfs');\n const btnExitFullScreen = this.btnExitFullScreen = ButtonIcon('smallscreen');\n \n attachClickEvent(btnFullScreen, () => {\n requestFullScreen(this.container);\n }, {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 group-call-only-big');\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n\n attachClickEvent(btnShowColumn, this.toggleRightColumn, {listenerSetter});\n\n const headerInfo = document.createElement('div');\n headerInfo.classList.add('group-call-header-info');\n\n this.title.classList.add('group-call-header-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('group-call-header-subtitle');\n\n headerInfo.append(this.title, subtitle);\n\n this.header.classList.add('group-call-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.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n appendTo: videosScrollable.container,\n instance,\n listenerSetter,\n displayPinned: true,\n onLengthChange: (length) => {\n this.videosCount = length;\n this.toggleBigLayout();\n },\n ...options\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n ...options\n });\n\n const className = 'group-call';\n\n {\n const buttons = this.buttonsContainer = document.createElement('div');\n buttons.classList.add(className + '-buttons');\n\n this.listenerSetter.add(this.groupCallParticipantsVideo)('toggleControls', (show) => {\n this.container.classList.toggle('show-controls', show);\n buttons.classList.toggle('show-controls', show);\n });\n\n const b = (options: {\n text?: LangPackKey,\n isDanger?: boolean,\n noRipple?: boolean\n }) => {\n const _className = className + '-button';\n const div = document.createElement('div');\n div.classList.add(_className, 'rp-overflow');\n\n if(!options.noRipple) {\n ripple(div);\n }\n\n if(options.isDanger) {\n div.classList.add(_className + '-red');\n }\n\n return div;\n };\n\n const btnVideo = b({\n text: 'VoiceChat.Video.Stream.Video'\n });\n\n btnVideo.classList.add('tgico-videocamera_filled');\n\n attachClickEvent(btnVideo, () => {\n const toggle = toggleDisability([btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n }, {listenerSetter});\n\n const btnScreen = b({\n text: 'VoiceChat.Video.Stream.Screencast'\n });\n\n btnScreen.classList.add('tgico-sharescreen_filled');\n btnScreen.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n attachClickEvent(btnScreen, () => {\n const toggle = toggleDisability([btnScreen], true);\n this.instance.toggleScreenSharing().finally(() => {\n toggle();\n });\n }, {listenerSetter});\n\n const btnMute = b({noRipple: true});\n btnMute.classList.add('group-call-microphone-button');\n\n const microphoneIcon = this.groupCallMicrophoneIcon = new GroupCallMicrophoneIcon();\n btnMute.append(microphoneIcon.container);\n\n const throttledMuteClick = throttle(() => {\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 }, 600, true);\n\n attachClickEvent(btnMute, throttledMuteClick, {listenerSetter});\n\n const btnMore = b({\n text: 'VoiceChat.Video.Stream.More'\n });\n\n btnMore.classList.add('tgico-settings_filled', 'btn-disabled');\n btnMore.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnLeave = b({\n text: 'VoiceChat.Leave',\n isDanger: true\n });\n\n btnLeave.classList.add('tgico-close');\n\n attachClickEvent(btnLeave, () => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(this.appChatsManager.hasRights(this.instance.chatId, 'manage_call')) {\n new PopupPeer('popup-end-video-chat', {\n titleLangKey: 'VoiceChat.End.Title',\n descriptionLangKey: 'VoiceChat.End.Text',\n checkboxes: [{\n text: 'VoiceChat.End.Third'\n }],\n buttons: [{\n langKey: 'VoiceChat.End.OK',\n callback: (checkboxes) => {\n hangUp(!!checkboxes.size);\n },\n isDanger: true,\n }]\n }).show();\n } else {\n hangUp(false);\n }\n }, {listenerSetter});\n\n buttons.append(btnVideo, btnScreen, btnMute, btnMore, btnLeave);\n\n this.container.append(buttons);\n }\n\n listenerSetter.add(rootScope)('group_call_state', (instance) => {\n if(this.instance === instance) {\n this.updateInstance();\n }\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(rootScope)('group_call_pinned', ({instance}) => {\n if(this.instance === instance) {\n this.setHasPinned();\n }\n });\n\n listenerSetter.add(mediaSizes)('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n }\n });\n\n this.addEventListener('close', () => {\n const {movable} = this;\n if(movable) {\n previousState = movable.state;\n }\n\n this.groupCallParticipantsVideo.destroy();\n this.groupCallParticipants.destroy();\n this.groupCallMicrophoneIcon.destroy();\n\n if(movable) {\n movable.destroy();\n }\n });\n\n this.toggleRightColumn();\n this.onFullScreenChange();\n\n this.updateInstance();\n }\n\n public getContainer() {\n return this.container;\n }\n\n private toggleMovable(enabled: boolean) {\n if(enabled) {\n if(this.movable) {\n return;\n }\n\n const movable = this.movable = new MovableElement({\n // minWidth: 366,\n minWidth: 400,\n minHeight: 480,\n element: this.element\n });\n \n movable.state = previousState;\n if(previousState.top === undefined) {\n movable.setPositionToCenter();\n }\n \n this.listenerSetter.add(movable)('resize', this.toggleBigLayout);\n } else {\n if(!this.movable) {\n return;\n }\n\n this.movable.destroyElements();\n this.movable.destroy();\n this.movable = undefined;\n }\n }\n\n private onFullScreenChange = () => {\n this.toggleBigLayout();\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n rootScope.setThemeColor(isFull ? '#000000' : undefined);\n }\n };\n\n private toggleBigLayout = () => {\n const isFull = isFullScreen();\n const isBig = (isFull || !!(this.movable && this.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 this.setTitle();\n this.setDescription();\n this.setHasPinned();\n\n const microphoneButtonState = getGroupCallMicrophoneButtonState(this.instance.groupCall as any, this.instance.participant);\n this.container.dataset.micState = microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.HAND ? 'hand' : (microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.MUTED ? 'muted' : 'unmuted');\n this.groupCallMicrophoneIcon.setState(microphoneButtonState);\n }\n\n private setTitle() {\n this.groupCallTitle.update(this.instance);\n }\n\n private setDescription() {\n this.groupCallDescription.update(this.instance);\n this.groupCallBodyHeaderDescription.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport { i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { GROUP_CALL_PARTICIPANT_MUTED_STATE } from \".\";\nimport { GroupCallParticipantVideoType } from \"./participantVideo\";\n\nconst className = 'group-call-participant-status';\nexport default class GroupCallParticipantStatusElement {\n public container: HTMLElement;\n\n constructor(private withIcons: GroupCallParticipantVideoType[]) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE, participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n const icons = this.withIcons.filter(type => !!participant[type]).map(type => {\n const iconClassName = `tgico-${type === 'presentation' ? 'listscreenshare' : 'videocamera_filled'}`;\n const i = document.createElement('i');\n i.classList.add(className + '-icon', className + '-icon-' + type, iconClassName);\n return i;\n });\n\n let element2: HTMLElement, actionClassName: string;\n if(state === states.MUTED_FOR_ME) {\n element2 = i18n('VoiceChat.Status.MutedForYou');\n actionClassName = 'is-muted';\n } else if(state === states.UNMUTED) {\n element2 = i18n('VoiceChat.Status.Speaking');\n actionClassName = 'is-speaking';\n } else if(state === states.HAND) {\n element2 = i18n('VoiceChat.Status.WantsSpeak');\n actionClassName = 'is-waiting';\n } else if(participant.about && !icons.length) {\n setInnerHTML(this.container, RichTextProcessor.wrapEmojiText(participant.about));\n return;\n } else {\n element2 = i18n('VoiceChat.Status.Listening');\n actionClassName = 'is-listening';\n }\n\n const span = document.createElement('span');\n span.classList.add(className, actionClassName);\n span.append(...icons, element2);\n \n replaceContent(this.container, span);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport appDialogsManager, { DialogDom, AppDialogsManager } from \"../../lib/appManagers/appDialogsManager\";\nimport { GroupCallInstance } from \"../../lib/appManagers/appGroupCallsManager\";\nimport { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport { getGroupCallParticipantMutedState } from \".\";\nimport GroupCallParticipantMutedIcon from \"./participantMutedIcon\";\nimport GroupCallParticipantStatusElement from \"./participantStatus\";\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n participant: GroupCallParticipant,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueueIntersector;\n protected avatarSize = 54;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0] = {/* new: true, */dialogSize: 72};\n\n constructor(private instance: GroupCallInstance) {\n super({\n getIndex: (element) => element.participant.date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: (element) => {\n const {participant} = element;\n\n const state = getGroupCallParticipantMutedState(participant);\n\n element.mutedIcon.setState(state);\n element.status.setState(state, participant);\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.dom.listEl, this.list, idx);\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: base.id,\n container: false,\n drawStatus: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const participant = instance.participants.get(base.id);\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n \n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n\n (base as SortedParticipant).dom = dom;\n (base as SortedParticipant).participant = participant;\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n return base as SortedParticipant;\n },\n updateElementWith: fastRaf\n });\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n }\n\n public destroy() {\n this.elements.forEach((element) => {\n this.onElementDestroy(element);\n });\n }\n\n protected onElementDestroy(element: SortedParticipant) {\n element.mutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { animate } from \"../../helpers/animation\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport type { GroupCallInstance, GroupCallOutputSource } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport { i18n } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport { getGroupCallParticipantMutedState } from \".\";\nimport GroupCallParticipantMutedIcon from \"./participantMutedIcon\";\nimport GroupCallParticipantStatusElement from \"./participantStatus\";\n\nconst className = 'group-call-participant-video';\n\nexport type GroupCallParticipantVideoType = 'video' | 'presentation';\nexport default class GroupCallParticipantVideoElement {\n public container: HTMLElement;\n private peerTitle: PeerTitle;\n private subtitle: HTMLElement;\n private info: HTMLElement;\n private left: HTMLElement;\n private right: HTMLElement;\n private header: HTMLElement;\n private groupCallParticipantMutedIcon: GroupCallParticipantMutedIcon;\n private groupCallParticipantStatus: GroupCallParticipantStatusElement;\n\n constructor(private appPeersManager: AppPeersManager, private instance: GroupCallInstance, public source: GroupCallOutputSource) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n this.info = document.createElement('div');\n this.info.classList.add(className + '-info');\n\n this.left = document.createElement('div');\n this.left.classList.add(className + '-info-left');\n\n this.right = document.createElement('div');\n this.right.classList.add(className + '-info-right');\n\n this.info.append(this.left, this.right);\n \n this.container.append(this.info);\n }\n\n public setPinned(value: boolean) {\n if(!value) {\n if(this.header) {\n this.header.remove();\n this.header = undefined;\n }\n\n return;\n } else if(this.header) {\n return;\n }\n \n // if(!this.header) {\n this.header = document.createElement('div');\n this.header.classList.add(className + '-header');\n \n const icon = document.createElement('i');\n icon.classList.add('group-call-pin-icon', 'tgico-pin');\n this.header.append(icon);\n \n this.container.append(this.header);\n // }\n \n // this.container.classList.toggle('is-pinned', value);\n }\n\n public setParticipant(participant: GroupCallParticipant, type: GroupCallParticipantVideoType, video: HTMLVideoElement) {\n let peerTitleElement: HTMLElement;\n if(participant.pFlags.self) {\n peerTitleElement = i18n('VoiceChat.Status.You');\n peerTitleElement.classList.add('peer-title');\n } else {\n this.peerTitle = new PeerTitle({\n peerId: this.appPeersManager.getPeerId(participant.peer)\n });\n\n peerTitleElement = this.peerTitle.element;\n }\n\n this.groupCallParticipantMutedIcon = new GroupCallParticipantMutedIcon(false);\n this.groupCallParticipantStatus = new GroupCallParticipantStatusElement([type]);\n\n this.left.append(peerTitleElement, this.groupCallParticipantStatus.container);\n\n this.right.append(this.groupCallParticipantMutedIcon.container);\n\n const className = 'group-call-participant-video';\n video.classList.add(className);\n\n if(video.paused) {\n video.play();\n }\n \n const canvas = document.createElement('canvas');\n canvas.classList.add(className + '-blur');\n const size = 16;\n canvas.width = size;\n canvas.height = size;\n\n if(video) {\n const ctx = canvas.getContext('2d');\n ctx.filter = 'blur(2px)';\n const renderFrame = () => {\n ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, canvas.width, canvas.height);\n };\n\n animate(() => {\n renderFrame();\n return canvas.isConnected;\n });\n\n renderFrame();\n }\n \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\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport { GroupCallInstance, AppGroupCallsManager, GroupCallOutputSource } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport GroupCallParticipantVideoElement, { GroupCallParticipantVideoType } from \"./participantVideo\";\n\nexport default class GroupCallParticipantsVideoElement extends ControlsHover {\n private container: HTMLDivElement;\n private instance: GroupCallInstance;\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n\n constructor(options: {\n appendTo: HTMLElement,\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange']\n }) {\n super();\n safeAssign(this, options);\n\n const className = 'group-call-participants-video';\n const container = this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n \n options.appendTo.append(container);\n\n this.participantsElements = new Map();\n this.containers = new Map();\n\n const {listenerSetter} = this;\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n listenerSetter.add(rootScope)('group_call_pinned', ({instance, source}) => {\n if(this.instance === instance) {\n this.participantsElements.forEach((map) => {\n map.forEach((element) => {\n this.setElementDisplay(element, source);\n });\n });\n }\n });\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'group-call-participant-video-container');\n if(!container) {\n return;\n }\n\n const element = this.containers.get(container);\n if(this.instance.pinnedSource === element.source) {\n this.instance.unpinAll();\n return; \n }\n \n this.instance.pinSource(element.source);\n }, {listenerSetter});\n\n this.setInstance(this.instance);\n\n this.setup({\n element: container,\n listenerSetter: listenerSetter,\n showOnLeaveToClassName: 'group-call-buttons'\n });\n }\n\n private shouldDisplayElement(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n return this.displayPinned ? !pinnedSource || element.source === pinnedSource : pinnedSource && element.source !== pinnedSource;\n }\n\n private setElementDisplay(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n const shouldDisplay = this.shouldDisplayElement(element, pinnedSource);\n element.container.classList.toggle('video-hidden', !shouldDisplay);\n\n const isPinned = element.source === pinnedSource;\n element.setPinned(isPinned);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n const types: GroupCallParticipantVideoType[] = ['video', 'presentation'];\n const hasAnyVideo = types.some(type => !!participant[type]);\n let participantElements = this.participantsElements.get(peerId);\n if(!hasAnyVideo && !participantElements) {\n return;\n }\n\n if(!participantElements) {\n this.participantsElements.set(peerId, participantElements = new Map());\n }\n\n types.forEach(type => {\n let element = participantElements.get(type);\n const participantVideo = participant[type];\n if(!!participantVideo === !!element) {\n if(element) {\n element.updateParticipant(participant);\n }\n\n return;\n }\n\n if(participantVideo) {\n const result = this.instance.getVideoElementFromParticipantByType(participant, type);\n if(!result) {\n return;\n }\n\n const {video, source} = result;\n\n element = new GroupCallParticipantVideoElement(this.appPeersManager, this.instance, source);\n\n this.containers.set(element.container, element);\n\n this.setElementDisplay(element, this.instance.pinnedSource);\n participantElements.set(type, element);\n element.setParticipant(participant, type, video);\n \n this.container.prepend(element.container);\n } else {\n participantElements.delete(type);\n element.container.remove();\n \n if(!participantElements.size) {\n this.participantsElements.delete(peerId);\n this.containers.delete(element.container);\n element.destroy();\n }\n }\n\n this._onLengthChange();\n });\n }\n\n private _onLengthChange() {\n const length = this.container.childElementCount;\n this.container.dataset.length = '' + length;\n this.container.dataset.layout = length <= 2 ? '1' : (length === 3 ? '3' : '4');\n\n this.onLengthChange && this.onLengthChange(length);\n }\n\n public setInstance(instance: GroupCallInstance) {\n instance.participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.containers.forEach((element) => {\n element.destroy();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupGroupCall from \".\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport { addFullScreenListener, isFullScreen } from \"../../helpers/dom/fullScreen\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport noop from \"../../helpers/noop\";\nimport { safeAssign } from \"../../helpers/object\";\nimport ScrollableLoader from \"../../helpers/scrollableLoader\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { GroupCallInstance, AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport confirmationPopup from \"../confirmationPopup\";\nimport { attachContextMenuListener, closeBtnMenu, openBtnMenu, positionMenu } from \"../misc\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupElement from \"../popups\";\nimport Scrollable from \"../scrollable\";\nimport GroupCallParticipantsList from \"./participantsList\";\nimport GroupCallParticipantsVideoElement from \"./participantVideos\";\n\nexport class GroupCallParticipantContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: (peerId: PeerId) => boolean})[];\n private element: HTMLDivElement;\n private appChatsManager: AppChatsManager;\n private appPeersManager: AppPeersManager;\n private appGroupCallsManager: AppGroupCallsManager;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n \n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n appChatsManager: AppChatsManager,\n appPeersManager: AppPeersManager,\n appGroupCallsManager: AppGroupCallsManager,\n instance: GroupCallInstance,\n }) {\n this.buttons = [{\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MutePeer',\n verify: () => this.canManageCall && this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmutePeer',\n verify: () => this.canManageCall && !this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MuteForMe',\n verify: () => !this.canManageCall && !this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmuteForMe',\n verify: () => !this.canManageCall && this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'newprivate',\n text: 'VoiceChat.OpenProfile',\n verify: () => true,\n onClick: this.onOpenProfileClick\n }, {\n icon: 'deleteuser danger',\n text: 'VoiceChat.RemovePeer',\n verify: () => this.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: () => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: this.appChatsManager.isBroadcast(this.chatId) ? 'VoiceChat.RemovePeer.Confirm.Channel' : 'VoiceChat.RemovePeer.Confirm',\n descriptionLangArgs: [new PeerTitle({peerId: this.targetPeerId}).element],\n button: {\n langKey: 'VoiceChat.RemovePeer.Confirm.OK',\n isDanger: true\n }\n }).then(() => {\n this.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.appChatsManager = options.appChatsManager;\n this.appPeersManager = options.appPeersManager;\n this.appGroupCallsManager = options.appGroupCallsManager;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n \n this.element = ButtonMenu(this.buttons, listenerSetter);\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener(options.onContextElement, (e: any) => {\n const li = findUpClassName(e.target, 'group-call-participant');\n if(!li) {\n return;\n }\n\n if(this.element.parentElement !== appendTo) {\n appendTo.append(this.element);\n }\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = this.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n this.buttons.forEach(button => {\n button.element.classList.toggle('hide', !button.verify(peerId));\n });\n \n cancelEvent(e);\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n openBtnMenu(this.element);\n }, listenerSetter);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n closeBtnMenu();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? (PopupElement.getPopup(PopupGroupCall) as PopupGroupCall).getContainer(): document.body;\n\n if(!isFull) {\n closeBtnMenu();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopup(PopupGroupCall);\n if(popup) {\n popup.hide();\n }\n\n rootScope.dispatchEvent('history_focus', {\n peerId: this.targetPeerId\n });\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.appGroupCallsManager.editParticipant(this.instance.id, this.participant, {\n muted\n });\n };\n};\n\nexport default class GroupCallParticipantsElement {\n private container: HTMLDivElement;\n private sortedList: GroupCallParticipantsList;\n private instance: GroupCallInstance;\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private appChatsManager: AppChatsManager;\n\n constructor(options: {\n appendTo: HTMLElement,\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n appChatsManager: AppChatsManager,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter\n }) {\n safeAssign(this, options);\n\n const className = 'group-call-participants';\n\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add(className + '-scrollable');\n\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n // const invite = Button(`btn-primary btn-transparent ${className}-invite`, {icon: 'adduser', text: 'VoiceChat.Invite.InviteMembers'});\n\n const sortedList = this.sortedList = new GroupCallParticipantsList(this.instance);\n \n const {instance, listenerSetter} = this;\n this.contextMenu = new GroupCallParticipantContextMenu({\n ...options,\n onContextElement: sortedList.list,\n listenerSetter,\n instance\n });\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n ...options,\n appendTo: scrollable.container,\n displayPinned: false\n });\n\n scrollable.append(/* invite, */sortedList.list);\n container.append(scrollable.container);\n\n options.appendTo.append(container);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n const scrollableLoader = new ScrollableLoader({\n scrollable,\n getPromise: () => {\n return this.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants, isEnd}) => {\n participants.forEach(participant => {\n this.updateParticipant(participant);\n });\n \n return isEnd;\n });\n }\n });\n\n this.setInstance(instance);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n const has = this.sortedList.has(peerId);\n if(participant.pFlags.left) {\n if(has) {\n this.sortedList.delete(peerId);\n }\n\n return;\n }\n\n if(!has) {\n this.sortedList.add(peerId);\n return;\n }\n\n this.sortedList.update(peerId);\n }\n\n public setInstance(instance: GroupCallInstance) {\n // @ts-ignore\n /* const users = appUsersManager.users;\n for(const userId in users) {\n const participant: GroupCallParticipant = {\n _: 'groupCallParticipant',\n date: 0,\n peer: {_: 'peerUser', user_id: userId.toPeerId()},\n pFlags: {\n muted: true\n },\n source: 1\n };\n\n instance.participants.set(userId.toPeerId(), participant);\n this.updateParticipant(participant);\n } */\n instance.participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n \n public destroy() {\n this.sortedList.destroy();\n this.groupCallParticipantsVideo.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { deepEqual } from \"../../helpers/object\";\nimport { GroupCall } from \"../../layer\";\nimport { GroupCallInstance } from \"../../lib/appManagers/appGroupCallsManager\";\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 appendTo.append(this.descriptionIntl.element);\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 \n if(descriptionIntl.key !== key || !deepEqual(descriptionIntl.args, args)) {\n descriptionIntl.key = key;\n descriptionIntl.args = args;\n descriptionIntl.update();\n }\n }\n}\n","/*\n * 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/appManagers/appGroupCallsManager\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class GroupCallTitleElement {\n private peerTitle: PeerTitle;\n\n constructor(private appendTo: HTMLElement) {\n this.peerTitle = new PeerTitle({peerId: 0});\n }\n\n public update(instance: GroupCallInstance) {\n const {peerTitle, appendTo} = this;\n const groupCall = instance.groupCall as GroupCall.groupCall;\n const peerId = instance.chatId.toPeerId(true);\n if(groupCall.title) {\n setInnerHTML(appendTo, RichTextProcessor.wrapEmojiText(groupCall.title));\n } else if(peerTitle.peerId !== peerId) {\n peerTitle.peerId = peerId;\n peerTitle.update();\n appendTo.append(peerTitle.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 findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { isFullScreen } from \"../helpers/dom/fullScreen\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { clamp } from \"../helpers/number\";\nimport { safeAssign } from \"../helpers/object\";\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 default class MovableElement extends EventListenerBase<{\n resize: () => void\n}> {\n private minWidth: number;\n private minHeight: number;\n private element: HTMLElement;\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: {\n minWidth: MovableElement['minWidth'],\n minHeight: MovableElement['minHeight'],\n element: MovableElement['element']\n }) {\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(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 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","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport type { AppGroupCallsManager, GroupCallInstance } from \"../lib/appManagers/appGroupCallsManager\";\nimport GROUP_CALL_STATE from \"../lib/calls/groupCallState\";\nimport rootScope from \"../lib/rootScope\";\nimport ButtonIcon from \"./buttonIcon\";\nimport TopbarWeave from \"./topbarWeave\";\nimport SetTransition from \"./singleTransition\";\nimport PopupGroupCall from \"./groupCall\";\nimport type { AppPeersManager } from \"../lib/appManagers/appPeersManager\";\nimport type { AppChatsManager } from \"../lib/appManagers/appChatsManager\";\nimport GroupCallDescriptionElement from \"./groupCall/description\";\nimport GroupCallTitleElement from \"./groupCall/title\";\nimport { SuperRLottieIcon } from \"./superIcon\";\nimport PopupElement from \"./popups\";\nimport throttle from \"../helpers/schedulers/throttle\";\n\nexport class GroupCallMicrophoneIconMini extends SuperRLottieIcon<{\n PartState: boolean\n}> {\n constructor() {\n super({\n width: 36,\n height: 36,\n getPart: (state) => {\n return this.getItem().getPart(state ? 'unmute' : 'mute');\n }\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\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 \n constructor(\n private appGroupCallsManager: AppGroupCallsManager,\n private appPeersManager: AppPeersManager,\n private appChatsManager: AppChatsManager\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(rootScope)('group_call_state', (instance) => {\n this.updateInstance(instance);\n });\n \n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = this.appGroupCallsManager.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(rootScope)('group_call_amplitude', ({amplitudes, type}) => {\n const {weave} = this;\n if(!amplitudes.length || !weave/* || type !== 'input' */) return;\n\n let max = 0;\n for(let i = 0; i < amplitudes.length; ++i) {\n const {type, value} = amplitudes[i];\n max = value > max ? value : max;\n }\n\n weave.setAmplitude(max);\n });\n }\n\n private updateInstance(instance: GroupCallInstance) {\n if(this.construct) {\n this.construct();\n this.construct = undefined;\n }\n\n const {state, id} = instance;\n\n const {weave, container} = this;\n\n weave.componentDidMount();\n \n const isClosed = state === GROUP_CALL_STATE.CLOSED;\n if(!document.body.classList.contains('is-calling') || isClosed) {\n if(isClosed) {\n weave.setAmplitude(0);\n }\n\n SetTransition(document.body, 'is-calling', !isClosed, 250, isClosed ? () => {\n weave.componentWillUnmount();\n }: undefined);\n }\n \n if(isClosed) {\n return;\n }\n \n if(state === GROUP_CALL_STATE.CONNECTING) {\n weave.setCurrentState(GROUP_CALL_STATE.CONNECTING, 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 container.dataset.callId = '' + id;\n \n this.setTitle(instance);\n this.setDescription(instance);\n this.groupCallMicrophoneIconMini.setState(state === GROUP_CALL_STATE.UNMUTED);\n \n const className = 'state-' + state;\n if(container.classList.contains(className)) {\n return;\n }\n }\n\n private setDescription(instance: GroupCallInstance) {\n return this.groupCallDescription.update(instance);\n }\n\n private setTitle(instance: GroupCallInstance) {\n return this.groupCallTitle.update(instance);\n }\n\n private construct() {\n const {listenerSetter} = this;\n const container = this.container = document.createElement('div');\n container.classList.add('sidebar-header', 'topbar-call-container');\n\n const left = document.createElement('div');\n left.classList.add('topbar-call-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.appGroupCallsManager.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('topbar-call-center');\n \n this.groupCallTitle = new GroupCallTitleElement(center);\n this.groupCallDescription = new GroupCallDescriptionElement(left);\n \n const right = document.createElement('div');\n right.classList.add('topbar-call-right');\n \n const end = ButtonIcon('endcall_filled');\n right.append(end);\n \n attachClickEvent(end, (e) => {\n cancelEvent(e);\n this.appGroupCallsManager.hangUp(container.dataset.callId, false, false);\n }, {listenerSetter});\n\n attachClickEvent(container, () => {\n if(PopupElement.getPopup(PopupGroupCall)) {\n return;\n }\n \n new PopupGroupCall({\n appGroupCallsManager: this.appGroupCallsManager,\n appPeersManager: this.appPeersManager,\n appChatsManager: this.appChatsManager\n }).show();\n }, {listenerSetter});\n \n container.append(left, center, right);\n\n const weave = this.weave = new TopbarWeave();\n const weaveContainer = weave.render();\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\n//import apiManager from '../mtproto/apiManager';\nimport animationIntersector from '../../components/animationIntersector';\nimport appSidebarLeft, { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../../components/sidebarLeft\";\nimport appSidebarRight, { RIGHT_COLUMN_ACTIVE_CLASSNAME } from '../../components/sidebarRight';\nimport mediaSizes, { ScreenSize } from '../../helpers/mediaSizes';\nimport { logger, LogTypes } from \"../logger\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport apiUpdatesManager from './apiUpdatesManager';\nimport appUsersManager from \"./appUsersManager\";\nimport Chat, { ChatType } from '../../components/chat/chat';\nimport appChatsManager from './appChatsManager';\nimport appDocsManager from './appDocsManager';\nimport appInlineBotsManager from './appInlineBotsManager';\nimport appMessagesManager from './appMessagesManager';\nimport appPeersManager from './appPeersManager';\nimport appPhotosManager from './appPhotosManager';\nimport appProfileManager from './appProfileManager';\nimport appStickersManager from './appStickersManager';\nimport appWebPagesManager from './appWebPagesManager';\nimport PopupNewMedia, { getCurrentNewMediaPopup } from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport { IS_TOUCH_SUPPORTED } from '../../environment/touchSupport';\nimport appPollsManager from './appPollsManager';\nimport SetTransition from '../../components/singleTransition';\nimport ChatDragAndDrop from '../../components/chat/dragAndDrop';\nimport { doubleRaf } from '../../helpers/schedulers';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport useHeavyAnimationCheck, { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport appDraftsManager from './appDraftsManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport stateStorage from '../stateStorage';\nimport appDownloadManager from './appDownloadManager';\nimport { AppStateManager } from './appStateManager';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport appNotificationsManager from './appNotificationsManager';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, { i18n, join, LangPackKey } from '../langPack';\nimport { ChatInvite, Dialog, SendMessageAction } from '../../layer';\nimport { hslaStringToHex } from '../../helpers/color';\nimport { copy, getObjectKeysAndSort } from '../../helpers/object';\nimport { getFilesFromEvent } from '../../helpers/files';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer from '../../components/popups/peer';\nimport { SliceEnd } from '../../helpers/slicedArray';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport { cancelEvent } from '../../helpers/dom/cancelEvent';\nimport disableTransition from '../../helpers/dom/disableTransition';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport appEmojiManager from './appEmojiManager';\nimport PopupElement from '../../components/popups';\nimport singleInstance from '../mtproto/singleInstance';\nimport PopupStickers from '../../components/popups/stickers';\nimport PopupJoinChatInvite from '../../components/popups/joinChatInvite';\nimport { toast, toastNew } from '../../components/toast';\nimport debounce from '../../helpers/schedulers/debounce';\nimport { pause } from '../../helpers/schedulers/pause';\nimport appMessagesIdsManager from './appMessagesIdsManager';\nimport { InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE } from './internalLink';\nimport RichTextProcessor from '../richtextprocessor';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport { NULL_PEER_ID } from '../mtproto/mtproto_config';\nimport telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport { ONE_DAY } from '../../helpers/date';\nimport { numberThousandSplitter } from '../../helpers/number';\nimport appGroupCallsManager, { GroupCallId, MyGroupCall } from './appGroupCallsManager';\nimport TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\n\n//console.log('appImManager included33!');\n\nappSidebarLeft; // just to include\n\nexport const CHAT_ANIMATION_GROUP = 'chat';\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\n\nexport type ChatSavedPosition = {\n mids: number[], \n top: number\n};\n\nexport class AppImManager {\n public columnEl = document.getElementById('column-center') as HTMLDivElement;\n public chatsContainer: HTMLElement;\n\n public offline = false;\n public updateStatusInterval = 0;\n\n public log: ReturnType;\n\n public setPeerPromise: Promise = null;\n\n public tabId = -1;\n \n public chats: Chat[] = [];\n private prevTab: HTMLElement;\n private chatsSelectTabDebounced: () => void;\n \n public markupTooltip: MarkupTooltip;\n private backgroundPromises: {[slug: string]: Promise} = {};\n \n private topbarCall: TopbarCall;\n\n get myId() {\n return rootScope.myId;\n }\n\n get chat(): Chat {\n return this.chats[this.chats.length - 1];\n }\n\n constructor() {\n apiUpdatesManager.attach();\n appNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.selectTab(0);\n \n window.addEventListener('blur', () => {\n animationIntersector.checkAnimations(true);\n \n this.offline = rootScope.idle.isIDLE = true;\n this.updateStatus();\n clearInterval(this.updateStatusInterval);\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n \n window.addEventListener('focus', () => {\n this.offline = rootScope.idle.isIDLE = false;\n this.updateStatus();\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n \n // в обратном порядке\n animationIntersector.checkAnimations(false);\n\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n this.updateStatus();\n\n this.offline = rootScope.idle.isIDLE = false;\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n }, {once: true, passive: true});\n\n this.chatsContainer = document.createElement('div');\n this.chatsContainer.classList.add('chats-container', 'tabs-container');\n this.chatsContainer.dataset.animation = 'navigation';\n\n this.columnEl.append(this.chatsContainer);\n \n this.createNewChat();\n this.chatsSelectTab(this.chat.container);\n\n appNavigationController.onHashChange = this.onHashChange;\n //window.addEventListener('hashchange', this.onHashChange);\n\n this.setSettings();\n rootScope.addEventListener('settings_updated', this.setSettings);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup('');\n animationIntersector.checkAnimations(false);\n });\n\n this.applyCurrentTheme();\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\n rootScope.addEventListener('history_focus', (e) => {\n let {peerId, threadId, mid} = e;\n if(threadId) threadId = appMessagesIdsManager.generateMessageId(threadId);\n if(mid) mid = appMessagesIdsManager.generateMessageId(mid); // because mid can come from notification, i.e. server message id\n \n this.setInnerPeer(peerId, mid, threadId ? 'discussion' : undefined, threadId);\n });\n\n rootScope.addEventListener('peer_changing', (chat) => {\n this.saveChatPosition(chat);\n });\n\n rootScope.addEventListener('theme_change', () => {\n this.applyCurrentTheme();\n });\n\n rootScope.addEventListener('choosing_sticker', (choosing) => {\n this.setChoosingStickerTyping(!choosing);\n });\n\n rootScope.addEventListener('instance_deactivated', () => {\n const popup = new PopupElement('popup-instance-deactivated', undefined, {overlayClosable: true});\n const c = document.createElement('div');\n c.classList.add('instance-deactivated-container');\n (popup as any).container.replaceWith(c);\n\n const header = document.createElement('div');\n header.classList.add('header');\n header.append(i18n('Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n('Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n (popup as any).onClose = () => {\n document.body.classList.add('deactivated-backwards');\n\n singleInstance.activateInstance();\n\n setTimeout(() => {\n document.body.classList.remove('deactivated', 'deactivated-backwards');\n }, 333);\n };\n\n popup.show();\n });\n\n stateStorage.get('chatPositions').then((c) => {\n stateStorage.setToCache('chatPositions', c || {});\n });\n\n this.topbarCall = new TopbarCall(appGroupCallsManager, appPeersManager, appChatsManager);\n\n // ! do not remove this line \n // ! instance can be deactivated before the UI starts, because it waits in background for RAF that is delayed\n singleInstance.activateInstance();\n\n const setAuthorized = () => {\n telegramMeWebManager.setAuthorized(true);\n };\n\n setInterval(setAuthorized, ONE_DAY);\n setAuthorized();\n\n this.addAnchorListener<{}>({\n name: 'showMaskedAlert', \n callback: (params, element) => {\n const href = element.href;\n\n const a = element.cloneNode(true) as HTMLAnchorElement;\n a.className = 'anchor-url';\n a.innerText = href;\n a.removeAttribute('onclick');\n\n new PopupPeer('popup-masked-url', {\n titleLangKey: 'OpenUrlTitle',\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [a],\n buttons: [{\n langKey: 'Open',\n callback: () => {\n a.click();\n },\n }]\n }).show();\n }\n });\n\n this.addAnchorListener<{uriParams: {command: string, bot: string}}>({\n name: 'execBotCommand', \n callback: ({uriParams}) => {\n const {command, bot} = uriParams;\n\n /* const promise = bot ? this.openUsername(bot).then(() => this.chat.peerId) : Promise.resolve(this.chat.peerId);\n promise.then(peerId => {\n appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n //console.log(command, bot);\n }\n });\n\n this.addAnchorListener<{uriParams: {hashtag: string}}>({\n name: 'searchByHashtag', \n callback: ({uriParams}) => {\n const {hashtag} = uriParams;\n if(!hashtag) {\n return;\n }\n\n this.chat.initSearch('#' + hashtag + ' ');\n }\n });\n\n this.addAnchorListener<{pathnameParams: ['addstickers', string]}>({\n name: 'addstickers', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n this.addAnchorListener<{pathnameParams: ['joinchat', string]}>({\n name: 'joinchat', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: pathnameParams[1] || decodeURIComponent(pathnameParams[0]).slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n if(IS_GROUP_CALL_SUPPORTED) {\n this.addAnchorListener<{\n uriParams: Omit\n }>({\n name: 'voicechat',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.VOICE_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n }\n\n this.addAnchorListener<{\n // pathnameParams: ['c', string, string],\n // uriParams: {thread?: number}\n // } | {\n // pathnameParams: [string, string?],\n // uriParams: {comment?: number}\n pathnameParams: ['c', string, string] | [string, string?],\n uriParams: {thread?: string, comment?: string} | {comment?: string}\n }>({\n name: 'im',\n callback: async({pathnameParams, uriParams}) => {\n let link: InternalLink;\n 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 : undefined,\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 };\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n domain: string,\n\n // telegrampassport\n scope?: string,\n nonce?: string,\n payload?: string,\n bot_id?: string,\n public_key?: string,\n callback_url?: string,\n\n // regular\n start?: string,\n startgroup?: string,\n game?: string,\n voicechat?: string,\n post?: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'resolve',\n protocol: 'tg',\n callback: ({uriParams}) => {\n let link: InternalLink;\n if(uriParams.domain === 'telegrampassport') {\n\n } else {\n link = this.makeLink(INTERNAL_LINK_TYPE.MESSAGE, uriParams);\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'privatepost',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.PRIVATE_POST, uriParams);\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name: 'addstickers',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.STICKER_SET, uriParams);\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n invite: string\n }\n }>({\n name: 'joinchat',\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 this.onHashChange();\n this.attachKeydownListener();\n }\n\n private attachKeydownListener() {\n const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(rootScope.isOverlayActive || IGNORE_KEYS.has(key)) return;\n \n const target = e.target as HTMLElement;\n \n //if(target.tagName === 'INPUT') return;\n \n //this.log('onkeydown', e, document.activeElement);\n\n const chat = this.chat;\n\n if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(rootScope.filterId, true);\n let nextDialog: Dialog.dialog;\n if(!rootScope.peerId) {\n if(key === 'ArrowDown') {\n nextDialog = folder[0];\n }\n } else {\n const idx = folder.findIndex(dialog => dialog.peerId === rootScope.peerId);\n if(idx !== -1) {\n const nextIndex = key === 'ArrowUp' ? idx - 1 : idx + 1;\n nextDialog = folder[nextIndex];\n }\n }\n \n if(nextDialog) {\n this.setPeer(nextDialog.peerId);\n }\n } else if(key === 'ArrowUp') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n const historyStorage = appMessagesManager.getHistoryStorage(chat.peerId, chat.threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMid: number;\n for(const mid of slice) {\n const message = chat.getMessage(mid);\n const good = this.myId === chat.peerId ? message.fromId === this.myId : message.pFlags.out;\n\n if(good) {\n if(appMessagesManager.canEditMessage(chat.getMessage(mid), 'text')) {\n goodMid = mid;\n break;\n }\n\n // * this check will allow editing only last message\n //break;\n }\n }\n \n if(goodMid) {\n chat.input.initMessageEditing(goodMid);\n cancelEvent(e); // * prevent from scrolling\n }\n }\n } else {\n return;\n }\n } else if(key === 'ArrowDown') {\n return;\n }\n \n if(\n chat?.input?.messageInput && \n e.target !== chat.input.messageInput && \n target.tagName !== 'INPUT' && \n !target.hasAttribute('contenteditable') && \n !IS_TOUCH_SUPPORTED && \n (!mediaSizes.isMobile || this.tabId === 1) && \n !chat.selection.isSelecting && \n !chat.input.recording\n ) {\n chat.input.messageInput.focus();\n placeCaretAtEnd(chat.input.messageInput);\n\n // clone and dispatch same event to new input. it is needed for sending message if input was blurred\n const newEvent = new KeyboardEvent(e.type, e);\n chat.input.messageInput.dispatchEvent(newEvent);\n }\n };\n \n document.body.addEventListener('keydown', onKeyDown);\n }\n\n private makeLink(type: T, uriParams: Omit) {\n return {\n _: type,\n ...uriParams\n } as any as InternalLinkTypeMap[T];\n }\n\n public async processInternalLink(link: InternalLink) {\n switch(link?._) {\n case INTERNAL_LINK_TYPE.MESSAGE: {\n const postId = link.post ? appMessagesIdsManager.generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? appMessagesIdsManager.generateMessageId(+link.comment) : undefined;\n\n this.openUsername(link.domain, postId, undefined, commentId);\n break;\n }\n\n case INTERNAL_LINK_TYPE.PRIVATE_POST: {\n const chatId = link.channel.toChatId();\n const peerId = chatId.toPeerId(true);\n\n const chat = appChatsManager.getChat(chatId);\n if(chat.deleted) {\n try {\n await appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = appMessagesIdsManager.generateMessageId(+link.post);\n const threadId = link.thread ? appMessagesIdsManager.generateMessageId(+link.thread) : undefined;\n\n if(threadId) this.openThread(peerId, postId, threadId);\n else this.setInnerPeer(peerId, postId);\n break;\n }\n\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n apiManager.invokeApi('messages.checkChatInvite', {\n hash: link.invite\n }).then(chatInvite => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n appChatsManager.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n // console.log(chatInvite);\n\n if(chatInvite._ === 'chatInviteAlready' ||\n chatInvite._ === 'chatInvitePeek'/* && chatInvite.expires > tsNow(true) */) {\n this.setInnerPeer(chatInvite.chat.id.toPeerId(true));\n return;\n }\n\n new PopupJoinChatInvite(link.invite, chatInvite).show();\n }, (err) => {\n if(err.type === 'INVITE_HASH_EXPIRED') {\n toast(i18n('InviteExpired'));\n }\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.VOICE_CHAT: {\n if(IS_GROUP_CALL_SUPPORTED) {\n this.joinGroupCall(link.chat_id.toPeerId(true), link.id);\n }\n \n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n private addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'joinchat' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat', \n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any, \n noPathnameParams?: boolean,\n noUriParams?: boolean\n }) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n cancelEvent(null);\n\n const href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n if(!options.noPathnameParams) pathnameParams = new URL(element.href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = this.parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n }\n\n private parseUriParams(uri: string, splitted = uri.split('?')) {\n const params: any = {};\n if(!splitted[1]) return params;\n splitted[1].split('&').forEach(item => {\n params[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);\n });\n\n return params;\n }\n\n private onHashChange = () => {\n const hash = location.hash;\n const splitted = hash.split('?');\n\n const params = this.parseUriParams(hash, splitted);\n\n this.log('hashchange', hash, splitted[0], params);\n\n if(params.tgaddr) {\n appNavigationController.replaceState();\n const {onclick} = RichTextProcessor.wrapUrl(params.tgaddr);\n if(onclick) {\n const a = document.createElement('a');\n a.href = params.tgaddr;\n (window as any)[onclick](a);\n }\n return;\n }\n\n switch(splitted[0]) {\n case '#/im': {\n const p: string = params.p;\n let postId = params.post !== undefined ? appMessagesIdsManager.generateMessageId(+params.post) : undefined;\n\n switch(p[0]) {\n case '@': {\n this.openUsername(p, postId);\n break;\n }\n\n default: { // peerId\n this.setInnerPeer(postId ? p.toPeerId(true) : p.toPeerId(), postId);\n break;\n }\n }\n }\n }\n\n //appNavigationController.replaceState();\n //location.hash = '';\n };\n\n public openUsername(username: string, msgId?: number, threadId?: number, commentId?: number) {\n return appUsersManager.resolveUsername(username).then(peer => {\n const isUser = peer._ === 'user';\n const peerId = isUser ? peer.id.toPeerId() : peer.id.toPeerId(true);\n\n if(threadId) return this.openThread(peerId, msgId, threadId);\n else if(commentId) return this.openComment(peerId, msgId, commentId);\n else return this.setInnerPeer(peerId, msgId);\n }, (err) => {\n if(err.type === 'USERNAME_NOT_OCCUPIED') {\n toastNew({langPackKey: 'NoUsernameFound'});\n } else if(err.type === 'USERNAME_INVALID') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n }\n\n /**\n * Opens thread when peerId of discussion group is known\n */\n public openThread(peerId: PeerId, lastMsgId: number, threadId: number) {\n return appMessagesManager.wrapSingleMessage(peerId, threadId).then(() => {\n const message = appMessagesManager.getMessageByPeer(peerId, threadId);\n appMessagesManager.generateThreadServiceStartMessage(message);\n\n return this.setInnerPeer(peerId, lastMsgId, 'discussion', threadId);\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(peerId: PeerId, msgId: number, commentId: number) {\n return appMessagesManager.getDiscussionMessage(peerId, msgId).then(message => {\n return this.openThread(message.peerId, commentId, message.mid);\n });\n }\n\n public async joinGroupCall(peerId: PeerId, groupCallId?: GroupCallId) {\n const chatId = peerId.toChatId();\n const hasRights = appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n \n call = await appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = appGroupCallsManager.saveGroupCall(chatFull.call, chatId);\n }\n \n appGroupCallsManager.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await appGroupCallsManager.getGroupCallFull(groupCallId);\n if(groupCall._ === 'groupCallDiscarded') {\n if(!hasRights) {\n toastNew({\n langPackKey: 'VoiceChat.Chat.Ended'\n });\n\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'VoiceChat.Chat.StartNew',\n button: {\n langKey: 'VoiceChat.Chat.StartNew.OK'\n }\n });\n }\n }\n\n const currentGroupCall = appGroupCallsManager.groupCall;\n if(currentGroupCall) {\n await confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Voice.Header',\n descriptionLangKey: 'Call.Confirm.Discard.Voice.ToVoice.Text',\n descriptionLangArgs: [\n new PeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}).element, \n new PeerTitle({peerId: peerId}).element\n ],\n button: {\n langKey: 'OK'\n }\n });\n\n if(appGroupCallsManager.groupCall === currentGroupCall) {\n await currentGroupCall.hangUp();\n }\n }\n\n next();\n };\n\n public setCurrentBackground(broadcastEvent = false) {\n const theme = rootScope.getTheme();\n\n if(theme.background.type === 'image' || (theme.background.type === 'default' && theme.background.slug)) {\n const defaultTheme = AppStateManager.STATE_INIT.settings.themes.find(t => t.name === theme.name);\n const isDefaultBackground = theme.background.blur === defaultTheme.background.blur && \n theme.background.slug === defaultTheme.background.slug;\n\n if(!isDefaultBackground) {\n return this.getBackground(theme.background.slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.background = copy(defaultTheme.background); // * reset background\n return this.setBackground('', true);\n });\n }\n }\n \n return this.setBackground('', broadcastEvent);\n }\n\n private getBackground(slug: string) {\n if(this.backgroundPromises[slug]) return this.backgroundPromises[slug];\n return this.backgroundPromises[slug] = appDownloadManager.cacheStorage.getFile('backgrounds/' + slug).then(blob => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n 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 top = chatBubbles.scrollable.scrollTop;\n\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && Object.keys(chatBubbles.bubbles).length) {\n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc'),\n top\n };\n\n chatPositions[key] = position;\n\n this.log('saved chat position:', position);\n } else {\n delete chatPositions[key];\n\n this.log('deleted chat position');\n }\n\n stateStorage.set({chatPositions}, true);\n //}\n }\n\n public getChatSavedPosition(chat: Chat): ChatSavedPosition {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n \n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const cache = stateStorage.getFromCache('chatPositions');\n return cache && cache[key];\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = rootScope.getTheme();\n if(theme.background.highlightningColor) {\n hsla = theme.background.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n rootScope.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n this.applyHighlightningColor();\n\n rootScope.setTheme();\n\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n \n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n document.documentElement.style.setProperty('--messages-text-size', rootScope.settings.messagesTextSize + 'px');\n \n document.body.classList.toggle('animation-level-0', !rootScope.settings.animationsEnabled);\n document.body.classList.toggle('animation-level-1', false);\n document.body.classList.toggle('animation-level-2', rootScope.settings.animationsEnabled);\n\n this.chatsSelectTabDebounced = debounce(() => {\n const topbar = this.chat.topbar;\n if(topbar.pinnedMessage) { // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n topbar.pinnedMessage.setCorrectIndex(0);\n }\n\n apiManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n lottieLoader.setLoop(rootScope.settings.stickers.loop);\n animationIntersector.checkAnimations(false);\n \n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n \n I18n.setTimeFormat(rootScope.settings.timeFormat);\n };\n\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(NULL_PEER_ID, undefined, canAnimate);\n blurActiveElement();\n }\n });\n }\n }\n\n tab.classList.add('active');\n this.prevTab = tab;\n }\n\n private init() {\n document.addEventListener('paste', this.onDocumentPaste, true);\n \n if(!IS_TOUCH_SUPPORTED) {\n this.attachDragAndDropListeners();\n }\n\n //if(!isTouchSupported) {\n this.markupTooltip = new MarkupTooltip(this);\n this.markupTooltip.handleSelection();\n //}\n }\n\n private attachDragAndDropListeners() {\n const drops: ChatDragAndDrop[] = [];\n const mediaDrops: ChatDragAndDrop[] = [];\n let mounted = false;\n const toggle = async(e: DragEvent, mount: boolean) => {\n if(mount === mounted) return;\n\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n\n const newMediaPopup = getCurrentNewMediaPopup();\n if(!isFiles || (!this.canDrag() && !newMediaPopup)) { // * skip dragging text case\n counter = 0;\n return;\n }\n\n const _dropsContainer = newMediaPopup ? mediaDropsContainer : dropsContainer;\n const _drops = newMediaPopup ? mediaDrops : drops;\n\n if(mount && !_drops.length) {\n const types: string[] = await getFilesFromEvent(e, true);\n const force = isFiles && !types.length; // * can't get file items not from 'drop' on Safari\n \n const foundMedia = types.filter(t => MEDIA_MIME_TYPES_SUPPORTED.has(t)).length;\n // const foundDocuments = types.length - foundMedia;\n \n this.log('drag files', types);\n\n if(newMediaPopup) {\n newMediaPopup.appendDrops(_dropsContainer);\n\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n header: 'Preview.Dragging.AddItems',\n headerArgs: [types.length],\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'document');\n }\n }));\n }\n } else {\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragfiles',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropAsFilesDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'document');\n }\n }));\n }\n \n // if((foundMedia && !foundDocuments) || force) {\n if(foundMedia || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragmedia',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropQuickDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n //if(!mount) return;\n\n SetTransition(_dropsContainer, 'is-visible', mount, 200, () => {\n if(!mount) {\n _drops.forEach(drop => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\n });\n\n if(mount) {\n _drops.forEach(drop => {\n drop.setPath();\n });\n } else {\n counter = 0;\n }\n\n document.body.classList.toggle('is-dragging', mount);\n mounted = mount;\n };\n\n /* document.body.addEventListener('dragover', (e) => {\n cancelEvent(e);\n }); */\n\n let counter = 0;\n document.body.addEventListener('dragenter', (e) => {\n counter++;\n });\n\n document.body.addEventListener('dragover', (e) => {\n //this.log('dragover', e/* , e.dataTransfer.types[0] */);\n toggle(e, true);\n cancelEvent(e);\n });\n\n document.body.addEventListener('dragleave', (e) => {\n //this.log('dragleave', e, counter);\n //if((e.pageX <= 0 || e.pageX >= appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= appPhotosManager.windowH)) {\n counter--;\n if(counter === 0) { \n //if(!findUpClassName(e.target, 'drops-container')) {\n toggle(e, false);\n }\n });\n\n const dropsContainer = document.createElement('div');\n dropsContainer.classList.add('drops-container');\n\n const mediaDropsContainer = dropsContainer.cloneNode(true) as HTMLElement;\n }\n\n private canDrag() {\n const peerId = this.chat?.peerId;\n return !(!peerId || rootScope.isOverlayActive || !appMessagesManager.canSendToPeer(peerId, this.chat.threadId, 'send_media'));\n }\n\n private onDocumentPaste = (e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\n if(!this.canDrag() && !newMediaPopup) return;\n\n //console.log('document paste');\n //console.log('item', event.clipboardData.getData());\n\n if(e instanceof DragEvent) {\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n if(isFiles) {\n cancelEvent(e);\n }\n }\n \n getFilesFromEvent(e).then((files: File[]) => {\n if(files.length) {\n if(newMediaPopup) {\n newMediaPopup.addFiles(files);\n return;\n }\n \n const chatInput = this.chat.input;\n chatInput.willAttachType = attachType || (MEDIA_MIME_TYPES_SUPPORTED.has(files[0].type) ? 'media' : 'document');\n new PopupNewMedia(this.chat, files, chatInput.willAttachType);\n }\n });\n };\n\n public selectTab(id: number, animate?: boolean) {\n if(animate === false) { // * will be used for Safari iOS history swipe\n disableTransition([appSidebarLeft.sidebarEl, this.columnEl, appSidebarRight.sidebarEl]);\n }\n\n document.body.classList.toggle(LEFT_COLUMN_ACTIVE_CLASSNAME, id === 0);\n\n const prevTabId = this.tabId;\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(prevTabId !== -1 && prevTabId !== id && rootScope.settings.animationsEnabled && animate !== false) {\n const transitionTime = (mediaSizes.isMobile ? 250 : 200) + 100; // * cause transition time could be > 250ms\n animationPromise = pause(transitionTime);\n dispatchHeavyAnimationEvent(animationPromise, transitionTime);\n\n // ! it's very heavy operation. will blink in firefox\n /* this.columnEl.classList.add('disable-hover');\n animationPromise.finally(() => {\n this.columnEl.classList.remove('disable-hover');\n }); */\n }\n\n this.tabId = id;\n blurActiveElement();\n if(mediaSizes.isMobile && prevTabId === 2 && id < 2) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== -1 && id > prevTabId) {\n if(id < 2 || !appNavigationController.findItemByType('im')) {\n appNavigationController.pushItem({\n type: 'im', \n onPop: (canAnimate) => {\n //this.selectTab(prevTabId, !isSafari);\n this.setPeer(NULL_PEER_ID, undefined, canAnimate);\n }\n });\n }\n }\n\n rootScope.dispatchEvent('im_tab_change', id);\n\n //this._selectTab(id, mediaSizes.isMobile);\n //document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id === 2);\n\n return animationPromise;\n }\n \n public updateStatus() {\n if(!this.myId) return Promise.resolve();\n \n appUsersManager.setUserStatus(this.myId, this.offline);\n return apiManager.invokeApiSingle('account.updateStatus', {offline: this.offline});\n }\n\n private createNewChat() {\n const chat = new Chat(this, \n appChatsManager, \n appDocsManager, \n appInlineBotsManager, \n appMessagesManager, \n appPeersManager, \n appPhotosManager, \n appProfileManager, \n appStickersManager, \n appUsersManager, \n appWebPagesManager, \n appPollsManager, \n apiManager, \n appDraftsManager, \n serverTimeManager, \n stateStorage, \n appNotificationsManager, \n appEmojiManager,\n appMessagesIdsManager,\n appGroupCallsManager\n );\n\n if(this.chats.length) {\n chat.backgroundEl.append(this.chat.backgroundEl.lastElementChild.cloneNode(true));\n }\n\n this.chats.push(chat);\n }\n\n private spliceChats(fromIndex: number, justReturn = true, animate?: boolean, spliced?: Chat[]) {\n if(fromIndex >= this.chats.length) return;\n\n if(this.chats.length > 1 && justReturn) {\n rootScope.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n // * -1 because one item is being sliced when closing the chat by calling .removeByType\n for(let i = 0; i < spliced.length - 1; ++i) {\n appNavigationController.removeByType('chat', true);\n }\n\n // * fix middle chat z-index on animation\n if(spliced.length > 1) {\n spliced.slice(0, -1).forEach(chat => {\n chat.container.remove();\n });\n }\n\n this.chatsSelectTab(this.chat.container, animate);\n\n if(justReturn) {\n rootScope.dispatchEvent('peer_changed', this.chat.peerId);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n \n const isSet = appSidebarRight.sharedMediaTab.setPeer(this.chat.peerId, this.chat.threadId);\n if(isSet) {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(true);\n appSidebarRight.sharedMediaTab.fillProfileElements();\n }\n \n /* setTimeout(() => {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(false);\n }); */\n }\n\n spliced.forEach(chat => {\n chat.beforeDestroy();\n });\n \n setTimeout(() => {\n //chat.setPeer(0);\n spliced.forEach(chat => {\n chat.destroy();\n });\n }, 250 + 100);\n }\n\n public setPeer(peerId: PeerId, lastMsgId?: number, animate?: boolean): boolean {\n if(this.init) {\n this.init();\n this.init = null;\n }\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(peerId, lastMsgId);\n this.spliceChats(0, false, false, spliced);\n return ret;\n }\n // } else {\n // this.spliceChats(1, false, animate);\n // }\n\n //return ret;\n }\n\n // * don't reset peer if returning\n if(peerId === chat.peerId && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(1, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = chat.setPeer(peerId, lastMsgId);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n promise.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(peerId: PeerId, lastMsgId?: number, type: ChatType = 'chat', threadId?: number) {\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\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(peerId, lastMsgId);\n }\n\n const chat = this.chat;\n if(chat.inited) { // * use first not inited chat\n this.createNewChat();\n }\n\n if(type) {\n this.chat.setType(type);\n\n if(threadId) {\n this.chat.threadId = threadId;\n }\n }\n\n //this.chatsSelectTab(this.chat.container);\n\n return this.setPeer(peerId, lastMsgId);\n }\n\n public openScheduled(peerId: PeerId) {\n this.setInnerPeer(peerId, undefined, 'scheduled');\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 'sendMessageChooseStickerAction': {\n c += '-choosing-sticker';\n for(let i = 0; i < 2; ++i) {\n const eye = document.createElement('div');\n eye.className = c + '-eye';\n el.append(eye);\n }\n break;\n }\n }\n\n el.classList.add(c);\n\n return el;\n }\n\n public getPeerTyping(peerId: PeerId, container?: HTMLElement) {\n if(!appUsersManager.isBot(peerId)) {\n const typings = appProfileManager.getPeerTypings(peerId);\n if(!typings || !typings.length) {\n return;\n }\n\n const typing = typings[0];\n\n const langPackKeys: {\n [peerType in 'private' | 'chat' | 'multi']?: Partial<{[action in SendMessageAction['_']]: LangPackKey}>\n } = {\n private: {\n 'sendMessageTypingAction': 'Peer.Activity.User.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.User.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.User.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.User.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.User.ChoosingSticker'\n },\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 },\n multi: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.Multi.TypingText1',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.Multi.SendingPhoto1',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.Multi.RecordingAudio1',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.Multi.PlayingGame1',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.Multi.ChoosingSticker1'\n }\n };\n\n const mapa = peerId.isUser() ? langPackKeys.private : (typings.length > 1 ? langPackKeys.multi : langPackKeys.chat);\n let action = typing.action;\n\n if(typings.length > 1) {\n const s: any = {};\n typings.forEach(typing => {\n const type = typing.action._;\n if(s[type] === undefined) s[type] = 0;\n ++s[type];\n });\n\n if(Object.keys(s).length > 1) {\n action = {\n _: 'sendMessageTypingAction'\n };\n }\n }\n\n const langPackKey = mapa[action._];\n if(!langPackKey) {\n return;\n }\n\n if(!container) {\n container = document.createElement('span');\n container.classList.add('online', 'peer-typing-container');\n }\n\n if(action._ === 'sendMessageChooseStickerAction') {\n container.classList.add('peer-typing-flex');\n }\n\n let typingElement = container.firstElementChild as HTMLElement;\n if(!typingElement) {\n typingElement = this.getTypingElement(action);\n container.prepend(typingElement);\n } else {\n if(typingElement.dataset.action !== action._) {\n typingElement.replaceWith(this.getTypingElement(action));\n }\n }\n\n let args: any[];\n if(peerId.isAnyChat()) {\n args = [\n new PeerTitle({peerId: typing.userId.toPeerId(false), onlyFirstName: true}).element,\n typings.length - 1\n ];\n }\n const descriptionElement = i18n(langPackKey, args);\n descriptionElement.classList.add('peer-typing-description');\n\n if(container.childElementCount > 1) container.lastElementChild.replaceWith(descriptionElement);\n else container.append(descriptionElement);\n return container;\n }\n }\n\n public async getPeerStatus(peerId: PeerId) {\n let subtitle: HTMLElement;\n if(!peerId) return;\n\n if(peerId.isAnyChat()) { // not human\n let span = this.getPeerTyping(peerId);\n if(span) {\n return span;\n }\n\n const chatId = peerId.toChatId();\n const chatInfo = await appProfileManager.getChatFull(chatId) as any;\n this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = chatInfo.participants_count || (chatInfo.participants && chatInfo.participants.participants && chatInfo.participants.participants.length) || 1;\n //if(participants_count) {\n subtitle = appProfileManager.getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await appProfileManager.getOnlines(chatId);\n if(onlines > 1) {\n const span = document.createElement('span');\n \n span.append(...join([subtitle, i18n('OnlineCount', [numberThousandSplitter(onlines)])], false));\n subtitle = span;\n }\n \n return subtitle;\n //}\n } else { // user\n const user = appUsersManager.getUser(peerId);\n \n if(rootScope.myId === peerId) {\n return;\n } else if(user) {\n subtitle = appUsersManager.getUserStatusString(user.id);\n\n if(!appUsersManager.isBot(peerId)) {\n let span = this.getPeerTyping(peerId);\n if(!span && user.status?._ === 'userStatusOnline') {\n span = document.createElement('span');\n span.classList.add('online');\n span.append(subtitle);\n }\n\n if(span) {\n return span;\n }\n }\n \n return subtitle;\n }\n }\n }\n\n public setPeerStatus(peerId: PeerId, element: HTMLElement, needClear: boolean, useWhitespace: boolean, middleware: () => boolean) {\n if(needClear) {\n element.innerHTML = useWhitespace ? '‎' : ''; // ! HERE U CAN FIND WHITESPACE\n }\n\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && this.getPeerTyping(peerId, typingContainer)) {\n return;\n }\n\n this.getPeerStatus(peerId).then((subtitle) => {\n if(!middleware()) {\n return;\n }\n\n replaceContent(element, subtitle || (useWhitespace ? '‎' : ''));\n });\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'});\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { deferredPromise } from \"../helpers/cancellablePromise\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appPhotosManager, { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport { logger } from \"../lib/logger\";\nimport VideoPlayer from \"../lib/mediaPlayer\";\nimport rootScope from \"../lib/rootScope\";\nimport animationIntersector from \"./animationIntersector\";\nimport appMediaPlaybackController from \"./appMediaPlaybackController\";\nimport AvatarElement from \"./avatar\";\nimport ButtonIcon from \"./buttonIcon\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport ButtonMenuToggle from \"./buttonMenuToggle\";\nimport { LazyLoadQueueBase } from \"./lazyLoadQueue\";\nimport ProgressivePreloader from \"./preloader\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport appNavigationController from \"./appNavigationController\";\nimport { Message } from \"../layer\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport renderImageFromUrl, { renderImageFromUrlPromise } from \"../helpers/dom/renderImageFromUrl\";\nimport getVisibleRect from \"../helpers/dom/getVisibleRect\";\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport fillPropertyValue from \"../helpers/fillPropertyValue\";\nimport generatePathData from \"../helpers/generatePathData\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport PeerTitle from \"./peerTitle\";\nimport { doubleRaf, fastRaf } from \"../helpers/schedulers\";\nimport RangeSelector from \"./rangeSelector\";\nimport windowSize from \"../helpers/windowSize\";\nimport ListLoader from \"../helpers/listLoader\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\nimport { isFullScreen } from \"../helpers/dom/fullScreen\";\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\n// TODO: масштабирование картинок (не SVG) при ресайзе, и правильный возврат на исходную позицию\n// TODO: картинки \"обрезаются\" если возвращаются или появляются с места, где есть их перекрытие (топбар, поле ввода)\n// TODO: видео в мобильной вёрстке, если показываются элементы управления: если свайпнуть в сторону, то элементы вернутся на место, т.е. прыгнут - это не ок, надо бы замаскировать\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\nexport default class AppMediaViewerBase<\n ContentAdditionType extends string, \n ButtonsAdditionType extends string, \n TargetType extends {element: HTMLElement\n}> extends EventListenerBase<{\n setMoverBefore: () => void,\n setMoverAfter: () => void\n}> {\n protected wholeDiv: HTMLElement;\n protected overlaysDiv: HTMLElement;\n protected author: {[k in 'container' | 'avatarEl' | 'nameEl' | 'date']: HTMLElement} = {} as any;\n protected content: {[k in 'main' | 'container' | 'media' | 'mover' | ContentAdditionType]: HTMLElement} = {} as any;\n protected buttons: {[k in 'download' | 'close' | 'prev' | 'next' | 'mobile-close' | 'zoom' | ButtonsAdditionType]: HTMLElement} = {} as any;\n protected topbar: HTMLElement;\n protected moversContainer: HTMLElement;\n \n protected tempId = 0;\n protected preloader: ProgressivePreloader = null;\n protected preloaderStreamable: ProgressivePreloader = null;\n\n //protected targetContainer: HTMLElement = null;\n //protected loadMore: () => void = null;\n\n protected log: ReturnType; \n\n protected isFirstOpen = true;\n\n // protected needLoadMore = true;\n\n protected pageEl = document.getElementById('page-chats') as HTMLDivElement;\n\n protected setMoverPromise: Promise;\n protected setMoverAnimationPromise: Promise;\n\n protected lazyLoadQueue: LazyLoadQueueBase;\n\n protected highlightSwitchersTimeout: number;\n\n protected onDownloadClick: (e: MouseEvent) => void;\n protected onPrevClick: (target: TargetType) => void;\n protected onNextClick: (target: TargetType) => void;\n\n protected videoPlayer: VideoPlayer;\n\n protected zoomElements: {\n container: HTMLElement,\n btnOut: HTMLElement,\n btnIn: HTMLElement,\n rangeSelector: RangeSelector\n } = {} as any;\n // protected zoomValue = ZOOM_INITIAL_VALUE;\n protected zoomSwipeHandler: SwipeHandler;\n protected zoomSwipeStartX = 0;\n protected zoomSwipeStartY = 0;\n protected zoomSwipeX = 0;\n protected zoomSwipeY = 0;\n \n protected ctrlKeyDown: boolean;\n\n get target() {\n return this.listLoader.current;\n }\n\n set target(value) {\n this.listLoader.current = value;\n }\n\n constructor(\n protected listLoader: ListLoader, \n topButtons: Array['buttons']>\n ) {\n super(false);\n\n this.log = logger('AMV');\n this.preloader = new ProgressivePreloader();\n this.preloaderStreamable = new ProgressivePreloader({\n cancelable: false,\n streamable: true\n });\n this.preloader.construct();\n this.preloaderStreamable.construct();\n this.lazyLoadQueue = new LazyLoadQueueBase();\n\n this.wholeDiv = document.createElement('div');\n this.wholeDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-whole');\n\n this.overlaysDiv = document.createElement('div');\n this.overlaysDiv.classList.add('overlays');\n\n const mainDiv = document.createElement('div');\n mainDiv.classList.add(MEDIA_VIEWER_CLASSNAME);\n\n const topbar = this.topbar = document.createElement('div');\n topbar.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar', MEDIA_VIEWER_CLASSNAME + '-appear');\n\n const topbarLeft = document.createElement('div');\n topbarLeft.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar-left');\n\n this.buttons['mobile-close'] = ButtonIcon('close', {onlyMobile: true});\n \n // * author\n this.author.container = document.createElement('div');\n this.author.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-author', 'no-select');\n const authorRight = document.createElement('div');\n \n this.author.avatarEl = new AvatarElement();\n this.author.avatarEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-userpic', 'avatar-44');\n \n this.author.nameEl = document.createElement('div');\n this.author.nameEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-name');\n \n this.author.date = document.createElement('div');\n this.author.date.classList.add(MEDIA_VIEWER_CLASSNAME + '-date');\n \n authorRight.append(this.author.nameEl, this.author.date);\n \n this.author.container.append(this.author.avatarEl, authorRight);\n \n // * buttons\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-buttons');\n \n topButtons.concat(['download', 'zoom', 'close']).forEach(name => {\n const button = ButtonIcon(name, {noRipple: true});\n this.buttons[name] = button;\n buttonsDiv.append(button);\n });\n\n this.buttons.zoom.classList.add('zoom-in');\n\n // * zoom\n this.zoomElements.container = document.createElement('div');\n this.zoomElements.container.classList.add('zoom-container');\n\n this.zoomElements.btnOut = ButtonIcon('zoomout', {noRipple: true});\n this.zoomElements.btnOut.addEventListener('click', () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n this.zoomElements.btnIn.addEventListener('click', () => 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.setNewMover();\n }\n\n protected setListeners() {\n this.buttons.download.addEventListener('click', this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach(el => {\n el.addEventListener('click', this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n \n this.listLoader.go(moveLength);\n });\n });\n\n this.buttons.zoom.addEventListener('click', () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\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.buttons.close.click();\n return true;\n }\n\n return false;\n }, \n verifyTouchTarget: (evt) => {\n // * Fix for seek input\n if((evt.target as HTMLElement).tagName === 'INPUT' || findUpClassName(evt.target, 'media-viewer-caption')) {\n return false;\n }\n\n return true;\n }\n });\n }\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming();\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n if(isVisible === enable) return;\n\n if(enable === undefined) {\n enable = !isVisible;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', enable);\n const zoomValue = enable ? this.zoomElements.rangeSelector.value : 1;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n\n if(enable) {\n if(!this.zoomSwipeHandler) {\n let lastDiffX: number, lastDiffY: number;\n const multiplier = -1;\n this.zoomSwipeHandler = new SwipeHandler({\n element: this.moversContainer,\n onFirstSwipe: () => {\n lastDiffX = lastDiffY = 0;\n this.moversContainer.classList.add('no-transition');\n },\n onSwipe: (xDiff, yDiff) => {\n [xDiff, yDiff] = [xDiff * multiplier, yDiff * multiplier];\n this.zoomSwipeX += xDiff - lastDiffX;\n this.zoomSwipeY += yDiff - lastDiffY;\n [lastDiffX, lastDiffY] = [xDiff, yDiff];\n\n this.setZoomValue();\n },\n onReset: () => {\n this.moversContainer.classList.remove('no-transition');\n },\n cursor: 'move'\n });\n } else {\n this.zoomSwipeHandler.setListeners();\n }\n \n this.zoomElements.rangeSelector.setProgress(zoomValue);\n } else if(!enable) {\n this.zoomSwipeHandler.removeListeners();\n }\n }\n\n protected changeZoom(add: boolean) {\n this.zoomElements.rangeSelector.addProgress(ZOOM_STEP * (add ? 1 : -1));\n this.setZoomValue();\n }\n\n protected setZoomValue = (value = this.zoomElements.rangeSelector.value) => {\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.zoomSwipeX = 0;\n this.zoomSwipeY = 0;\n }\n\n this.moversContainer.style.transform = `matrix(${value}, 0, 0, ${value}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`;\n\n this.zoomElements.btnOut.classList.toggle('inactive', value === ZOOM_MIN_VALUE);\n this.zoomElements.btnIn.classList.toggle('inactive', value === ZOOM_MAX_VALUE);\n\n this.toggleZoom(value !== ZOOM_INITIAL_VALUE);\n };\n\n protected isZooming() {\n return this.zoomElements.container.classList.contains('is-visible');\n }\n\n protected setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({onlyMobile: true}, 'bottom-left', buttons);\n this.topbar.append(btnMenuToggle);\n }\n\n public close(e?: MouseEvent) {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.setMoverAnimationPromise) return Promise.reject();\n\n appNavigationController.removeByType('media');\n\n this.lazyLoadQueue.clear();\n\n const promise = this.setMoverToTarget(this.target?.element, true).then(({onAnimationEnd}) => onAnimationEnd);\n\n this.listLoader.reset();\n (this.listLoader as any).cleanup && (this.listLoader as any).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n (window as any).appMediaViewer = undefined;\n\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n this.zoomSwipeHandler = undefined;\n }\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n promise.then(() => {\n appSidebarRight.forwardTab.closeBtn.click();\n });\n } */\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n\n promise.finally(() => {\n this.wholeDiv.remove();\n rootScope.isOverlayActive = false;\n animationIntersector.checkAnimations(false);\n });\n\n return promise;\n }\n\n onClick = (e: MouseEvent) => {\n if(this.setMoverAnimationPromise) return;\n\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') return;\n cancelEvent(e);\n\n if(IS_TOUCH_SUPPORTED) {\n if(this.highlightSwitchersTimeout) {\n clearTimeout(this.highlightSwitchersTimeout);\n } else {\n this.wholeDiv.classList.add('highlight-switchers');\n }\n\n this.highlightSwitchersTimeout = window.setTimeout(() => {\n this.wholeDiv.classList.remove('highlight-switchers');\n this.highlightSwitchersTimeout = 0;\n }, 3e3);\n \n return;\n }\n\n const isZooming = this.isZooming();\n let mover: HTMLElement = null;\n const classNames = ['ckin__player', 'media-viewer-buttons', 'media-viewer-author', 'media-viewer-caption', 'zoom-container'];\n if(isZooming) {\n classNames.push('media-viewer-movers');\n }\n\n classNames.find(s => {\n try {\n mover = findUpClassName(target, s);\n if(mover) return true;\n } catch(err) {return false;}\n });\n\n if(/* target === this.mediaViewerDiv */!mover || (!isZooming && (target.tagName === 'IMG' || target.tagName === 'image'))) {\n this.buttons.close.click();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n //this.log('onKeyDown', e);\n if(rootScope.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n \n let good = true;\n if(key === 'ArrowRight') {\n this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.changeZoom(key === '=');\n }\n } else {\n good = false;\n }\n\n if(e.ctrlKey || e.metaKey) {\n this.ctrlKeyDown = true;\n }\n\n if(good) {\n cancelEvent(e);\n }\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n if(rootScope.overlaysActive > 1) {\n return;\n }\n\n if(!(e.ctrlKey || e.metaKey)) {\n this.ctrlKeyDown = false;\n\n if(this.isZooming()) {\n this.setZoomValue();\n }\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n if(rootScope.overlaysActive > 1 || (findUpClassName(e.target, 'media-viewer-caption') && !this.ctrlKeyDown)) {\n return;\n }\n\n cancelEvent(e);\n\n if(this.ctrlKeyDown) {\n const scrollingUp = e.deltaY < 0;\n // if(!scrollingUp && !this.isZooming()) return;\n this.changeZoom(!!scrollingUp);\n }\n };\n\n protected async setMoverToTarget(target: HTMLElement, closing = false, fromRight = 0) {\n this.dispatchEvent('setMoverBefore');\n\n const mover = this.content.mover;\n\n if(!closing) {\n mover.innerHTML = '';\n //mover.append(this.buttons.prev, this.buttons.next);\n }\n \n const zoomValue = this.isZooming() && closing /* && false */ ? this.zoomElements.rangeSelector.value : ZOOM_INITIAL_VALUE;\n /* if(!(zoomValue > 1 && closing)) */ this.removeCenterFromMover(mover);\n\n const wasActive = fromRight !== 0;\n\n const delay = rootScope.settings.animationsEnabled ? (wasActive ? 350 : 200) : 0;\n //let delay = wasActive ? 350 : 10000;\n\n /* if(wasActive) {\n this.moveTheMover(mover);\n mover = this.setNewMover();\n } */\n\n /* if(DEBUG) {\n this.log('setMoverToTarget', target, closing, wasActive, fromRight);\n } */\n\n let realParent: HTMLElement;\n\n let rect: DOMRect;\n if(target) {\n if(target instanceof AvatarElement || target.classList.contains('grid-item')/* || target.classList.contains('document-ico') */) {\n realParent = target;\n rect = target.getBoundingClientRect();\n } else if(target instanceof SVGImageElement || target.parentElement instanceof SVGForeignObjectElement) {\n realParent = findUpClassName(target, 'attachment');\n rect = realParent.getBoundingClientRect();\n } else if(target.classList.contains('profile-avatars-avatar')) {\n realParent = findUpClassName(target, 'profile-avatars-container');\n rect = realParent.getBoundingClientRect();\n\n // * if not active avatar\n if(closing && target.getBoundingClientRect().left !== rect.left) {\n target = realParent = rect = undefined;\n }\n }\n }\n\n if(!target) {\n target = this.content.media;\n }\n\n if(!rect) {\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n }\n\n let needOpacity = false;\n if(target !== this.content.media && !target.classList.contains('profile-avatars-avatar')) {\n const overflowElement = findUpClassName(realParent, 'scrollable');\n const visibleRect = getVisibleRect(realParent, overflowElement);\n\n if(closing && (!visibleRect || visibleRect.overflow.vertical === 2 || visibleRect.overflow.horizontal === 2)) {\n target = this.content.media;\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n } else if(visibleRect && (visibleRect.overflow.vertical === 1 || visibleRect.overflow.horizontal === 1)) {\n needOpacity = true;\n }\n }\n\n const containerRect = this.content.media.getBoundingClientRect();\n \n let transform = '';\n let left: number;\n let top: number;\n\n if(wasActive) {\n left = fromRight === 1 ? windowSize.width : -containerRect.width;\n top = containerRect.top;\n } else {\n left = rect.left;\n top = rect.top;\n }\n\n /* if(zoomValue > 1) { // 33\n // const diffX = (rect.width * zoomValue - rect.width) / 4;\n const diffX = (rect.width * zoomValue - rect.width) / 2;\n const diffY = (rect.height * zoomValue - rect.height) / 4;\n // left -= diffX;\n // top += diffY;\n } */\n\n transform += `translate3d(${left}px,${top}px,0) `;\n\n /* if(wasActive) {\n left = fromRight === 1 ? appPhotosManager.windowW / 2 : -(containerRect.width + appPhotosManager.windowW / 2);\n transform += `translate(${left}px,-50%) `;\n } else {\n left = rect.left - (appPhotosManager.windowW / 2);\n top = rect.top - (appPhotosManager.windowH / 2);\n transform += `translate(${left}px,${top}px) `;\n } */\n\n let aspecter: HTMLDivElement;\n if(target instanceof HTMLImageElement || target instanceof HTMLVideoElement || target.tagName === 'DIV') {\n if(mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter')) {\n aspecter = mover.firstElementChild as HTMLDivElement;\n\n const player = aspecter.querySelector('.ckin__player');\n if(player) {\n const video = player.firstElementChild as HTMLVideoElement;\n aspecter.append(video);\n player.remove();\n }\n\n if(!aspecter.style.cssText) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n mover.classList.remove('active');\n this.setFullAspect(aspecter, containerRect, rect);\n void mover.offsetLeft; // reflow\n mover.classList.add('active');\n }\n } else {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-viewer-aspecter'/* , 'disable-hover' */);\n mover.prepend(aspecter);\n }\n \n aspecter.style.cssText = `width: ${rect.width}px; height: ${rect.height}px; transform: scale3d(${containerRect.width / rect.width}, ${containerRect.height / rect.height}, 1);`;\n }\n\n mover.style.width = containerRect.width + 'px';\n mover.style.height = containerRect.height + 'px';\n\n // const scaleX = rect.width / (containerRect.width * zoomValue);\n // const scaleY = rect.height / (containerRect.height * zoomValue);\n const scaleX = rect.width / containerRect.width;\n const scaleY = rect.height / containerRect.height;\n if(!wasActive) {\n transform += `scale3d(${scaleX},${scaleY},1) `;\n }\n\n let borderRadius = window.getComputedStyle(realParent).getPropertyValue('border-radius');\n const brSplitted = fillPropertyValue(borderRadius) as string[];\n borderRadius = brSplitted.map(r => (parseInt(r) / scaleX) + 'px').join(' ');\n if(!wasActive) {\n mover.style.borderRadius = borderRadius;\n }\n //let borderRadius = '0px 0px 0px 0px';\n\n if(closing && zoomValue !== 1) {\n // const width = this.moversContainer.scrollWidth * scaleX;\n // const height = this.moversContainer.scrollHeight * scaleY;\n const willBeLeft = windowSize.width / 2 - rect.width / 2;\n const willBeTop = windowSize.height / 2 - rect.height / 2;\n const left = rect.left - willBeLeft/* + (width - rect.width) / 2 */;\n const top = rect.top - willBeTop/* + (height - rect.height) / 2 */;\n this.moversContainer.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${left}, ${top})`;\n } else {\n mover.style.transform = transform;\n }\n\n needOpacity && (mover.style.opacity = '0'/* !closing ? '0' : '' */);\n\n /* if(wasActive) {\n this.log('setMoverToTarget', mover.style.transform);\n } */\n\n let path: SVGPathElement;\n const isOut = target.classList.contains('is-out');\n\n const deferred = this.setMoverAnimationPromise = deferredPromise();\n const ret = {onAnimationEnd: deferred};\n\n const timeout = setTimeout(() => {\n if(!deferred.isFulfilled && !deferred.isRejected) {\n deferred.resolve();\n }\n }, 1000);\n\n deferred.finally(() => {\n this.dispatchEvent('setMoverAfter');\n\n if(this.setMoverAnimationPromise === deferred) {\n this.setMoverAnimationPromise = null;\n }\n \n clearTimeout(timeout);\n });\n\n if(!closing) {\n let mediaElement: HTMLImageElement | HTMLVideoElement;\n let src: string;\n\n if(target instanceof HTMLVideoElement) {\n const elements = Array.from(target.parentElement.querySelectorAll('img')) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n }\n }\n\n if(target.tagName === 'DIV' || target.tagName === 'AVATAR-ELEMENT') { // useContainerAsTarget\n const images = Array.from(target.querySelectorAll('img')) as HTMLImageElement[];\n const image = images.pop();\n if(image) {\n mediaElement = new Image();\n src = image.src;\n mover.append(mediaElement);\n }\n /* mediaElement = new Image();\n src = target.style.backgroundImage.slice(5, -2); */\n \n } else if(target instanceof HTMLImageElement) {\n mediaElement = new Image();\n src = target.src;\n } else if(target instanceof HTMLVideoElement) {\n mediaElement = document.createElement('video');\n mediaElement.src = target.src;\n } else if(target instanceof SVGSVGElement) {\n const clipId = target.dataset.clipId;\n const newClipId = clipId + '-mv';\n\n const {width, height} = containerRect;\n\n const newSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n newSvg.setAttributeNS(null, 'width', '' + width);\n newSvg.setAttributeNS(null, 'height', '' + height);\n\n // нижние два свойства для масштабирования\n newSvg.setAttributeNS(null, 'viewBox', `0 0 ${width} ${height}`);\n newSvg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet');\n\n newSvg.insertAdjacentHTML('beforeend', target.firstElementChild.outerHTML.replace(clipId, newClipId));\n newSvg.insertAdjacentHTML('beforeend', target.lastElementChild.outerHTML.replace(clipId, newClipId));\n\n // теперь надо выставить новую позицию для хвостика\n const defs = newSvg.firstElementChild;\n const use = defs.firstElementChild.firstElementChild as SVGUseElement;\n if(use instanceof SVGUseElement) {\n let transform = use.getAttributeNS(null, 'transform');\n transform = transform.replace(/translate\\((.+?), (.+?)\\) scale\\((.+?), (.+?)\\)/, (match, x, y, sX, sY) => {\n x = +x;\n if(x !== 2) {\n x = width - (2 / scaleX);\n } else {\n x = 2 / scaleX;\n }\n \n y = height;\n \n return `translate(${x}, ${y}) scale(${+sX / scaleX}, ${+sY / scaleY})`;\n });\n use.setAttributeNS(null, 'transform', transform);\n \n // и новый RECT\n path = defs.firstElementChild.lastElementChild as SVGPathElement;\n\n // код ниже нужен только чтобы скрыть моргание до момента как сработает таймаут\n let d: string;\n const br: [number, number, number, number] = borderRadius.split(' ').map(v => parseInt(v)) as any;\n if(isOut) d = generatePathData(0, 0, width - 9 / scaleX, height, ...br);\n else d = generatePathData(9 / scaleX, 0, width - 9 / scaleX, height, ...br);\n path.setAttributeNS(null, 'd', d);\n }\n\n const foreignObject = newSvg.lastElementChild;\n foreignObject.setAttributeNS(null, 'width', '' + containerRect.width);\n foreignObject.setAttributeNS(null, 'height', '' + containerRect.height);\n \n mover.prepend(newSvg);\n }\n\n if(aspecter) {\n aspecter.style.borderRadius = borderRadius;\n\n if(mediaElement) {\n aspecter.append(mediaElement);\n }\n }\n\n mediaElement = mover.querySelector('video, img');\n if(mediaElement instanceof HTMLImageElement) {\n mediaElement.classList.add('thumbnail');\n if(!aspecter) {\n mediaElement.style.width = containerRect.width + 'px';\n mediaElement.style.height = containerRect.height + 'px';\n }\n\n if(src) {\n await renderImageFromUrlPromise(mediaElement, src);\n }\n }/* else if(mediaElement instanceof HTMLVideoElement && mediaElement.firstElementChild && ((mediaElement.firstElementChild as HTMLSourceElement).src || src)) {\n await new Promise((resolve, reject) => {\n mediaElement.addEventListener('loadeddata', resolve);\n\n if(src) {\n (mediaElement.firstElementChild as HTMLSourceElement).src = src;\n }\n });\n } */\n \n mover.style.display = '';\n\n fastRaf(() => {\n mover.classList.add(wasActive ? 'moving' : 'active');\n });\n } else {\n /* if(mover.classList.contains('center')) {\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n } */\n \n if(target instanceof SVGSVGElement) {\n path = mover.querySelector('path');\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, false, isOut, borderRadius);\n }\n }\n\n if(target.classList.contains('media-viewer-media')) {\n mover.classList.add('hiding');\n }\n\n this.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\n\n //return ret;\n\n setTimeout(() => {\n mover.style.borderRadius = borderRadius;\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = borderRadius;\n }\n }, delay / 2);\n\n setTimeout(() => {\n mover.innerHTML = '';\n mover.classList.remove('moving', 'active', 'hiding');\n mover.style.cssText = 'display: none;';\n\n deferred.resolve();\n }, delay);\n\n mover.classList.remove('opening');\n\n return ret;\n }\n\n mover.classList.add('opening');\n\n //await new Promise((resolve) => setTimeout(resolve, 0));\n //await new Promise((resolve) => window.requestAnimationFrame(resolve));\n // * одного RAF'а недостаточно, иногда анимация с одним не срабатывает (преимущественно на мобильных)\n await doubleRaf();\n\n // чтобы проверить установленную позицию - раскомментировать\n // throw '';\n\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\n\n mover.style.transform = `translate3d(${containerRect.left}px,${containerRect.top}px,0) scale3d(1,1,1)`;\n //mover.style.transform = `translate(-50%,-50%) scale(1,1)`;\n needOpacity && (mover.style.opacity = ''/* closing ? '0' : '' */);\n\n if(aspecter) {\n this.setFullAspect(aspecter, containerRect, rect);\n }\n\n //throw '';\n\n setTimeout(() => {\n mover.style.borderRadius = '';\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = '';\n }\n }, 0/* delay / 2 */);\n\n mover.dataset.timeout = '' + setTimeout(() => {\n mover.classList.remove('moving', 'opening');\n\n if(aspecter) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n if(mover.querySelector('video') || true) {\n mover.classList.remove('active');\n aspecter.style.cssText = '';\n void mover.offsetLeft; // reflow\n }\n \n //aspecter.classList.remove('disable-hover');\n }\n\n // эти строки нужны для установки центральной позиции, в случае ресайза это будет нужно\n mover.classList.add('center', 'no-transition');\n /* mover.style.left = mover.style.top = '50%';\n mover.style.transform = 'translate(-50%, -50%)';\n void mover.offsetLeft; // reflow */\n\n // это уже нужно для будущих анимаций\n mover.classList.add('active');\n delete mover.dataset.timeout;\n\n deferred.resolve();\n }, delay);\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, true, isOut, borderRadius);\n }\n\n return ret;\n }\n\n protected setFullAspect(aspecter: HTMLDivElement, containerRect: DOMRect, rect: DOMRect) {\n /* let media = aspecter.firstElementChild;\n let proportion: number;\n if(media instanceof HTMLImageElement) {\n proportion = media.naturalWidth / media.naturalHeight;\n } else if(media instanceof HTMLVideoElement) {\n proportion = media.videoWidth / media.videoHeight;\n } */\n const proportion = containerRect.width / containerRect.height;\n\n let {width, height} = rect;\n /* if(proportion === 1) {\n aspecter.style.cssText = '';\n } else { */\n if(proportion > 0) {\n width = height * proportion;\n } else {\n height = width * proportion;\n }\n\n //this.log('will set style aspecter:', `width: ${width}px; height: ${height}px; transform: scale(${containerRect.width / width}, ${containerRect.height / height});`);\n\n aspecter.style.cssText = `width: ${width}px; height: ${height}px; transform: scale3d(${containerRect.width / width}, ${containerRect.height / height}, 1);`;\n //}\n }\n\n protected sizeTailPath(path: SVGPathElement, rect: DOMRect, scaleX: number, delay: number, upscale: boolean, isOut: boolean, borderRadius: string) {\n const start = Date.now();\n const {width, height} = rect;\n delay = delay / 2;\n\n const br = borderRadius.split(' ').map(v => parseInt(v));\n\n const step = () => {\n const diff = Date.now() - start;\n\n let progress = delay ? diff / delay : 1;\n if(progress > 1) progress = 1;\n if(upscale) progress = 1 - progress;\n\n const _br: [number, number, number, number] = br.map(v => v * progress) as any;\n\n let d: string;\n if(isOut) d = generatePathData(0, 0, width - (9 / scaleX * progress), height, ..._br);\n else d = generatePathData(9 / scaleX * progress, 0, width/* width - (9 / scaleX * progress) */, height, ..._br);\n path.setAttributeNS(null, 'd', d);\n\n if(diff < delay) fastRaf(step);\n };\n \n //window.requestAnimationFrame(step);\n step();\n }\n\n protected removeCenterFromMover(mover: HTMLElement) {\n if(mover.classList.contains('center')) {\n //const rect = mover.getBoundingClientRect();\n const rect = this.content.media.getBoundingClientRect();\n mover.style.transform = `translate3d(${rect.left}px,${rect.top}px,0)`;\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n mover.classList.remove('no-transition');\n }\n }\n\n protected moveTheMover(mover: HTMLElement, toLeft = true) {\n const windowW = windowSize.width;\n\n this.removeCenterFromMover(mover);\n\n //mover.classList.remove('active');\n mover.classList.add('moving');\n\n if(mover.dataset.timeout) { // и это тоже всё из-за скейла видео, так бы это не нужно было\n clearTimeout(+mover.dataset.timeout);\n }\n\n const rect = mover.getBoundingClientRect();\n\n const newTransform = mover.style.transform.replace(/translate3d\\((.+?),/, (match, p1) => {\n const x = toLeft ? -rect.width : windowW;\n //const x = toLeft ? -(rect.right + (rect.width / 2)) : windowW / 2;\n\n return match.replace(p1, x + 'px');\n });\n\n ////////this.log('set newTransform:', newTransform, mover.style.transform, toLeft);\n mover.style.transform = newTransform;\n\n setTimeout(() => {\n mover.remove();\n }, 350);\n }\n\n protected setNewMover() {\n const newMover = document.createElement('div');\n newMover.classList.add('media-viewer-mover');\n newMover.style.display = 'none';\n\n if(this.content.mover) {\n const oldMover = this.content.mover;\n oldMover.parentElement.append(newMover);\n } else {\n this.moversContainer.append(newMover);\n }\n\n return this.content.mover = newMover;\n }\n\n protected updateMediaSource(target: HTMLElement, url: string, tagName: 'video' | 'img') {\n //if(target instanceof SVGSVGElement) {\n const el = target.tagName.toLowerCase() === tagName ? target : target.querySelector(tagName) as HTMLElement;\n if(el && !findUpClassName(target, 'document')) {\n if(findUpClassName(target, 'attachment')) {\n // two parentElements because element can be contained in aspecter\n const preloader = target.parentElement.parentElement.querySelector('.preloader-container') as HTMLElement;\n if(preloader) {\n if(tagName === 'video') {\n if(preloader.classList.contains('manual')) {\n preloader.click();\n // return;\n }\n \n return;\n }\n \n preloader.remove();\n }\n }\n\n renderImageFromUrl(el, url);\n\n // ! костыль, но он тут даже и не нужен\n if(el.classList.contains('thumbnail') && el.parentElement.classList.contains('media-container-aspecter')) {\n el.classList.remove('thumbnail');\n }\n }\n /* } else {\n\n } */\n }\n\n protected setAuthorInfo(fromId: PeerId | string, timestamp: number) {\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n\n const isPeerId = fromId.isPeerId();\n let title: HTMLElement;\n if(isPeerId) {\n title = new PeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n } else {\n title = document.createElement('span');\n title.innerHTML = RichTextProcessor.wrapEmojiText(fromId);\n title.classList.add('peer-title');\n }\n\n replaceContent(this.author.nameEl, title);\n\n let oldAvatar = this.author.avatarEl;\n this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n if(!isPeerId) {\n this.author.avatarEl.setAttribute('peer-title', '' + fromId);\n } else {\n this.author.avatarEl.removeAttribute('peer-title');\n }\n\n this.author.avatarEl.setAttribute('peer', '' + (fromId || NULL_PEER_ID));\n\n oldAvatar.parentElement.replaceChild(this.author.avatarEl, oldAvatar);\n }\n \n protected async _openMedia(\n media: MyDocument | MyPhoto, \n timestamp: number, \n fromId: PeerId | string, \n fromRight: number, \n target?: HTMLElement, \n reverse = false, \n prevTargets: TargetType[] = [], \n nextTargets: TargetType[] = [], \n message?: MyMessage\n /* , needLoadMore = true */\n ) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n /* if(DEBUG) {\n this.log('openMedia:', media, fromId, prevTargets, nextTargets);\n } */\n\n this.setAuthorInfo(fromId, timestamp);\n \n const isDocument = media._ === 'document';\n const isVideo = isDocument && media.mime_type && ((['video', 'gif'] as MyDocument['type'][]).includes(media.type) || media.mime_type.indexOf('video/') === 0);\n\n if(this.isFirstOpen) {\n //this.targetContainer = targetContainer;\n // this.needLoadMore = needLoadMore;\n this.isFirstOpen = false;\n this.listLoader.setTargets(prevTargets, nextTargets, reverse);\n (window as any).appMediaViewer = this;\n //this.loadMore = loadMore;\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n appSidebarRight.forwardTab.closeBtn.click();\n await new Promise((resolve) => setTimeout(resolve, 200));\n } */\n }\n\n /* if(this.nextTargets.length < 10 && this.loadMore) {\n this.loadMore();\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 window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n if(!IS_TOUCH_SUPPORTED) window.addEventListener('wheel', this.onWheel, {passive: false, capture: true});\n const mainColumns = document.getElementById('main-columns');\n this.pageEl.insertBefore(this.wholeDiv, mainColumns);\n void this.wholeDiv.offsetLeft; // reflow\n this.wholeDiv.classList.add('active');\n rootScope.isOverlayActive = true;\n animationIntersector.checkAnimations(true);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n \n this.close();\n }\n });\n }\n }\n\n ////////this.log('wasActive:', wasActive);\n\n const mover = this.content.mover;\n\n const maxWidth = windowSize.width;\n //const maxWidth = this.pageEl.scrollWidth;\n // TODO: const maxHeight = mediaSizes.isMobile ? appPhotosManager.windowH : appPhotosManager.windowH - 100;\n let padding = 0;\n const windowH = windowSize.height;\n if(windowH < 1000000 && !mediaSizes.isMobile) {\n padding = 120;\n }\n const maxHeight = windowH - 120 - padding;\n let thumbPromise: Promise = Promise.resolve();\n const size = appPhotosManager.setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = appDownloadManager.getCacheContext(media, size.type);\n let img: HTMLImageElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(media, cacheContext, true);\n if(gotThumb) {\n thumbPromise = gotThumb.loadPromise;\n img = gotThumb.image;\n }\n }\n\n if(img) {\n img.classList.add('thumbnail');\n container.append(img);\n }\n }\n\n // need after setAttachmentSize\n /* if(useContainerAsTarget) {\n target = target.querySelector('img, video') || target;\n } */\n\n const supportsStreaming: boolean = !!(isDocument && media.supportsStreaming);\n const preloader = supportsStreaming ? this.preloaderStreamable : this.preloader;\n\n let setMoverPromise: Promise;\n if(isVideo) {\n ////////this.log('will wrap video', media, size);\n\n // потому что для safari нужно создать элемент из event'а\n // const video = document.createElement('video');\n const useController = message && media.type !== 'gif';\n const video = /* useController ? \n appMediaPlaybackController.addMedia(message, false, true) as HTMLVideoElement : \n */document.createElement('video');\n\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n //const video = mover.querySelector('video') || document.createElement('video');\n \n const moverVideo = mover.querySelector('video');\n if(moverVideo) {\n moverVideo.remove();\n }\n \n //video.src = '';\n \n video.setAttribute('playsinline', 'true');\n \n // * fix for playing video if viewer is closed (https://contest.com/javascript-web-bonus/entry1425#issue11629)\n video.addEventListener('timeupdate', () => {\n if(this.tempId !== tempId) {\n video.pause();\n }\n });\n\n video.addEventListener('error', () => {\n if(video.error.code !== 4) {\n this.log.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\n }\n\n if(preloader) {\n preloader.detach();\n }\n }, {once: true});\n\n this.addEventListener('setMoverAfter', () => {\n video.src = '';\n video.load();\n }, {once: true});\n \n if(IS_SAFARI) {\n // test stream\n // video.controls = true;\n video.autoplay = true;\n }\n \n if(media.type === 'gif') {\n video.muted = true;\n video.autoplay = true;\n video.loop = true;\n }\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(video, play, supportsStreaming);\n player.addEventListener('toggleControls', (show) => {\n this.wholeDiv.classList.toggle('has-video-controls', show);\n });\n\n this.addEventListener('setMoverBefore', () => {\n this.wholeDiv.classList.remove('has-video-controls');\n this.videoPlayer.removeListeners();\n this.videoPlayer = undefined;\n }, {once: true});\n\n if(this.isZooming()) {\n this.videoPlayer.lockControls(false);\n }\n /* div.append(video);\n mover.append(player.wrapper); */\n });\n }\n };\n \n if(supportsStreaming) {\n onAnimationEnd.then(() => {\n if(video.readyState < video.HAVE_FUTURE_DATA) {\n preloader.attach(mover, true);\n }\n \n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n \n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n //this.log('video waited and progress loaded');\n preloader.detach();\n video.parentElement.classList.remove('is-buffering');\n }, {once: true});\n };\n \n video.addEventListener('waiting', () => {\n const loading = video.networkState === video.NETWORK_LOADING;\n const isntEnoughData = video.readyState < video.HAVE_FUTURE_DATA;\n \n //this.log('video waiting for progress', loading, isntEnoughData);\n if(loading && isntEnoughData) {\n attachCanPlay();\n \n preloader.attach(mover, true);\n \n // поставлю класс для плеера, чтобы убрать большую иконку пока прелоадер на месте\n video.parentElement.classList.add('is-buffering');\n }\n });\n \n attachCanPlay();\n }\n \n //if(!video.src || media.url !== video.src) {\n const load = () => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const cacheContext = appDownloadManager.getCacheContext(media);\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDocsManager.downloadDoc(media);\n \n if(!supportsStreaming) {\n onAnimationEnd.then(() => {\n if(!cacheContext.url) {\n preloader.attach(mover, true, promise);\n }\n });\n }\n \n Promise.all([promise, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n if(useController) {\n const rollback = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n rollback();\n }, {once: true});\n }\n \n const url = cacheContext.url;\n if(target instanceof SVGSVGElement/* && (video.parentElement || !isSafari) */) { // if video exists\n //if(!video.parentElement) {\n div.firstElementChild.lastElementChild.append(video);\n //}\n } else {\n renderImageFromUrl(video, url);\n }\n\n this.updateMediaSource(target, url, 'video');\n\n createPlayer();\n });\n \n return promise;\n };\n \n this.lazyLoadQueue.unshift({load});\n //} else createPlayer();\n });\n\n setMoverPromise = thumbPromise.then(set);\n } else {\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const load = () => {\n const cacheContext = appDownloadManager.getCacheContext(media, size.type);\n const cancellablePromise = isDocument ? appDocsManager.downloadDoc(media) : appPhotosManager.preloadPhoto(media, size);\n \n onAnimationEnd.then(() => {\n if(!cacheContext.url) {\n this.preloader.attachPromise(cancellablePromise);\n //this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n \n Promise.all([onAnimationEnd, cancellablePromise]).then(() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed photo');\n return;\n }\n \n ///////this.log('indochina', blob);\n \n const url = cacheContext.url;\n if(target instanceof SVGSVGElement) {\n this.updateMediaSource(target, url, 'img');\n this.updateMediaSource(mover, url, 'img');\n \n if(mediaSizes.isMobile) {\n const imgs = mover.querySelectorAll('img');\n if(imgs && imgs.length) {\n imgs.forEach(img => {\n img.classList.remove('thumbnail'); // может здесь это вообще не нужно\n });\n }\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = div.firstElementChild?.tagName === 'IMG' ? div.firstElementChild as HTMLImageElement : null;\n if(!haveImage || haveImage.src !== url) {\n let image = new Image();\n image.classList.add('thumbnail');\n \n //this.log('will renderImageFromUrl:', image, div, target);\n \n renderImageFromUrl(image, url, () => {\n this.updateMediaSource(target, url, 'img');\n \n if(haveImage) {\n fastRaf(() => {\n haveImage.remove();\n });\n }\n \n div.append(image);\n });\n }\n }\n \n //this.preloader.detach();\n }).catch(err => {\n this.log.error(err);\n this.preloader.attach(mover);\n this.preloader.setManual();\n });\n \n return cancellablePromise;\n };\n \n this.lazyLoadQueue.unshift({load});\n });\n\n setMoverPromise = thumbPromise.then(set);\n }\n\n return this.setMoverPromise = setMoverPromise.catch(() => {\n this.setMoverAnimationPromise = null;\n }).finally(() => {\n this.setMoverPromise = null;\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getVisibleRect(element: HTMLElement, overflowElement: HTMLElement) {\r\n const rect = element.getBoundingClientRect();\r\n const overflowRect = overflowElement.getBoundingClientRect();\r\n\r\n let {top: overflowTop, bottom: overflowBottom} = overflowRect;\r\n\r\n // * respect sticky headers\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 if(rect.top >= overflowBottom\r\n || rect.bottom <= overflowTop\r\n || rect.right <= overflowRect.left\r\n || rect.left >= overflowRect.right) {\r\n return null;\r\n }\r\n\r\n const overflow = {\r\n top: false,\r\n right: false,\r\n bottom: false,\r\n left: false,\r\n vertical: 0 as 0 | 1 | 2,\r\n horizontal: 0 as 0 | 1 | 2\r\n };\r\n\r\n // @ts-ignore\r\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\r\n const windowWidth = w.width || w.innerWidth;\r\n const windowHeight = w.height || w.innerHeight;\r\n\r\n return {\r\n rect: {\r\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\r\n right: 0,\r\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\r\n left: 0\r\n },\r\n overflow\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function fillPropertyValue(str: string) {\r\n let splitted = str.split(' ');\r\n if(splitted.length !== 4) {\r\n if(!splitted[0]) splitted[0] = '0px';\r\n for(let i = splitted.length; i < 4; ++i) {\r\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\r\n }\r\n }\r\n\r\n return splitted;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MEDIA_MIME_TYPES_SUPPORTED from \"../environment/mediaMimeTypesSupport\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport SearchListLoader from \"../helpers/searchListLoader\";\nimport { Message } from \"../layer\";\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appMessagesManager, { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport appPhotosManager, { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport { MediaSearchContext } from \"./appMediaPlaybackController\";\nimport AppMediaViewerBase, { MEDIA_VIEWER_CLASSNAME } from \"./appMediaViewerBase\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteMessages from \"./popups/deleteMessages\";\nimport PopupForward from \"./popups/forward\";\nimport Scrollable from \"./scrollable\";\nimport appSidebarRight from \"./sidebarRight\";\nimport AppSharedMediaTab from \"./sidebarRight/tabs/sharedMedia\";\n\ntype AppMediaViewerTargetType = {\n element: HTMLElement,\n mid: number,\n peerId: PeerId\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected btnMenuDelete: HTMLElement;\n protected listLoader: SearchListLoader;\n\n get searchContext() {\n return this.listLoader.searchContext;\n }\n\n constructor() {\n super(new SearchListLoader({\n processItem: (item) => {\n const isForDocument = this.searchContext.inputFilter._ === 'inputMessagesFilterDocument';\n const {mid, peerId} = item;\n const media: MyPhoto | MyDocument = appMessagesManager.getMediaFromMessage(item);\n\n if(!media) return;\n \n if(isForDocument && !AppMediaViewer.isMediaCompatibleForDocumentViewer(media)) {\n return;\n }\n\n return {element: null as HTMLElement, mid, peerId};\n }\n }), ['delete', 'forward']);\n\n this.listLoader.onEmptied = () => {\n this.close();\n };\n\n /* const stub = document.createElement('div');\n stub.classList.add(MEDIA_VIEWER_CLASSNAME + '-stub');\n this.content.main.prepend(stub); */\n\n this.content.caption = document.createElement('div');\n this.content.caption.classList.add(MEDIA_VIEWER_CLASSNAME + '-caption'/* , 'media-viewer-stub' */);\n\n let captionTimeout: number;\n const setCaptionTimeout = () => {\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n }\n\n captionTimeout = window.setTimeout(() => {\n captionTimeout = undefined;\n this.content.caption.classList.remove('is-focused');\n }, 800);\n };\n this.content.caption.addEventListener('touchstart', () => {\n if(!mediaSizes.isMobile) return;\n\n this.content.caption.classList.add('is-focused');\n \n if(captionTimeout) {\n clearTimeout(captionTimeout);\n captionTimeout = undefined;\n }\n \n document.addEventListener('touchend', setCaptionTimeout, {once: true});\n });\n\n const captionScrollable = new Scrollable(this.content.caption);\n captionScrollable.onAdditionalScroll = setCaptionTimeout;\n\n //this.content.main.append(this.content.caption);\n this.wholeDiv.append(this.content.caption);\n\n attachClickEvent(this.buttons.delete, this.onDeleteClick);\n\n const buttons: ButtonMenuItemOptions[] = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick\n }, {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick\n }];\n\n this.setBtnMenuToggle(buttons);\n this.btnMenuDelete = buttons[buttons.length - 1].element;\n\n // * constructing html end\n \n this.setListeners();\n }\n\n protected setListeners() {\n super.setListeners();\n this.buttons.forward.addEventListener('click', this.onForwardClick);\n this.author.container.addEventListener('click', this.onAuthorClick);\n\n const onCaptionClick = (e: MouseEvent) => {\n if(e.target instanceof HTMLAnchorElement) { // close viewer if it's t.me/ redirect\n const onclick = (e.target as HTMLElement).getAttribute('onclick');\n if(!onclick || onclick.includes('showMaskedAlert')) {\n return;\n }\n\n cancelEvent(e);\n\n this.close().then(() => {\n this.content.caption.removeEventListener('click', onCaptionClick, {capture: true});\n (e.target as HTMLAnchorElement).click();\n });\n\n return false;\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 ? appMessagesManager.getScheduledMessageByPeer(peerId, mid) : appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = (target: AppMediaViewerTargetType) => {\n this.openMedia(this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerTargetType) => {\n this.openMedia(this.getMessageByPeer(target.peerId, target.mid), target.element, 1);\n };\n\n onDeleteClick = () => {\n const target = this.target;\n new PopupDeleteMessages(target.peerId, [target.mid], 'chat', () => {\n this.target = {element: this.content.media} as any;\n this.close();\n });\n };\n\n onForwardClick = () => {\n const target = this.target;\n if(target.mid) {\n //appSidebarRight.forwardTab.open([target.mid]);\n new PopupForward({\n [target.peerId]: [target.mid]\n }, () => {\n return this.close();\n });\n }\n };\n\n onAuthorClick = (e: MouseEvent) => {\n const {mid, peerId} = this.target;\n if(mid && mid !== Number.MAX_SAFE_INTEGER) {\n const threadId = this.searchContext.threadId;\n const message = this.getMessageByPeer(peerId, mid);\n this.close(e)\n //.then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(() => {\n if(mediaSizes.isMobile) {\n const tab = appSidebarRight.getTab(AppSharedMediaTab);\n if(tab) {\n tab.close();\n }\n }\n\n appImManager.setInnerPeer(message.peerId, mid, threadId ? 'discussion' : undefined, threadId);\n });\n }\n };\n\n onDownloadClick = () => {\n const {peerId, mid} = this.target;\n const message = this.getMessageByPeer(peerId, mid);\n if(message.media.photo) {\n appPhotosManager.savePhotoFile(message.media.photo, appImManager.chat.bubbles.lazyLoadQueue.queueId);\n } else {\n let document: MyDocument = null;\n\n if(message.media.webpage) document = message.media.webpage.document;\n else document = message.media.document;\n\n if(document) {\n //console.log('will save document:', document);\n appDocsManager.saveDocFile(document, appImManager.chat.bubbles.lazyLoadQueue.queueId);\n }\n }\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html = '';\n if(caption) {\n html = RichTextProcessor.wrapRichText(caption, {\n entities: (message as Message.message).totalEntities\n });\n }\n \n // html = 'Dandelion are a family of flowering plants that grow in many parts of the world.';\n setInnerHTML(this.content.caption.firstElementChild, html);\n this.content.caption.classList.toggle('hide', !caption);\n // this.content.container.classList.toggle('with-caption', !!caption);\n }\n\n public setSearchContext(context: MediaSearchContext) {\n this.listLoader.setSearchContext(context);\n\n return this;\n }\n\n public async openMedia(message: MyMessage, target?: HTMLElement, fromRight = 0, reverse = false, \n prevTargets: AppMediaViewerTargetType[] = [], nextTargets: AppMediaViewerTargetType[] = []/* , needLoadMore = true */) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const mid = message.mid;\n const fromId = (message as Message.message).fwd_from && !message.fromId ? (message as Message.message).fwd_from.from_name : message.fromId;\n const media = appMessagesManager.getMediaFromMessage(message);\n\n this.buttons.forward.classList.toggle('hide', message._ === 'messageService');\n\n const canDeleteMessage = appMessagesManager.canDeleteMessage(message);\n [this.buttons.delete, this.btnMenuDelete].forEach(button => {\n button.classList.toggle('hide', !canDeleteMessage);\n });\n\n this.setCaption(message);\n const promise = super._openMedia(media, message.date, fromId, fromRight, target, reverse, prevTargets, nextTargets, message/* , needLoadMore */);\n this.target.mid = mid;\n this.target.peerId = message.peerId;\n\n return promise;\n }\n\n public static isMediaCompatibleForDocumentViewer(media: MyPhoto | MyDocument) {\n return media._ === 'photo' || MEDIA_MIME_TYPES_SUPPORTED.has(media.mime_type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Photo } from \"../layer\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport ListLoader, { ListLoaderOptions } from \"./listLoader\";\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n if(this.peerId.isAnyChat() || !older) return Promise.resolve({count: 0, items: []}); // ! это значит, что открыло аватар чата, но следующих фотографий нет.\n\n const maxId = anchor?.photoId;\n return appPhotosManager.getUserPhotos(this.peerId, maxId, loadCount).then(value => {\n const items = value.photos.map(photoId => {\n return {element: null as HTMLElement, photoId} as any;\n });\n\n return {count: value.count, items};\n });\n }\n });\n\n this.loadedAllUp = true;\n this.peerId = options.peerId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarListLoader from \"../helpers/avatarListLoader\";\nimport { Photo } from \"../layer\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport AppMediaViewerBase from \"./appMediaViewerBase\";\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id']};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId}), [/* 'delete' */]);\n\n this.peerId = peerId;\n\n this.setBtnMenuToggle([{\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }/* , {\n icon: 'delete danger btn-disabled',\n text: 'Delete',\n onClick: () => {}\n } */]);\n\n // * constructing html end\n \n this.setListeners();\n }\n\n onPrevClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, 1);\n };\n\n onDownloadClick = () => {\n appPhotosManager.savePhotoFile(appPhotosManager.getPhoto(this.target.photoId), appImManager.chat.bubbles.lazyLoadQueue.queueId);\n };\n\n public async openMedia(photoId: Photo.photo['id'], target?: HTMLElement, fromRight = 0, prevTargets?: AppMediaViewerAvatarTargetType[], nextTargets?: AppMediaViewerAvatarTargetType[]) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const photo = appPhotosManager.getPhoto(photoId);\n const ret = super._openMedia(photo, photo.date, this.peerId, fromRight, target, false, prevTargets, nextTargets);\n this.target.photoId = photo.id;\n\n return ret;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { Message, Photo } from \"../layer\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\r\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\r\nimport AppMediaViewer from \"./appMediaViewer\";\r\nimport AppMediaViewerAvatar from \"./appMediaViewerAvatar\";\r\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\r\nimport { isObject } from \"../helpers/object\";\r\n\r\nconst onAvatarUpdate = (peerId: PeerId) => {\r\n appAvatarsManager.removeFromAvatarsCache(peerId);\r\n (Array.from(document.querySelectorAll('avatar-element[peer=\"' + peerId + '\"]')) as AvatarElement[]).forEach(elem => {\r\n //console.log('updating avatar:', elem);\r\n elem.update();\r\n });\r\n};\r\n\r\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n if(!appAvatarsManager.isAvatarCached(peerId)) {\r\n onAvatarUpdate(peerId);\r\n }\r\n});\r\n\r\nexport async function openAvatarViewer(\r\n target: HTMLElement, \r\n peerId: PeerId, \r\n middleware: () => boolean, \r\n message?: any, \r\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[], \r\n nextTargets?: typeof prevTargets\r\n) {\r\n let photo = await appProfileManager.getFullPhoto(peerId);\r\n if(!middleware() || !photo) {\r\n return;\r\n }\r\n\r\n const getTarget = () => {\r\n const good = Array.from(target.querySelectorAll('img')).find(img => !img.classList.contains('emoji'));\r\n return good ? target : null;\r\n };\r\n\r\n if(peerId.isAnyChat()) {\r\n const hadMessage = !!message;\r\n const inputFilter = 'inputMessagesFilterChatPhotos';\r\n if(!message) {\r\n message = await appMessagesManager.getSearch({\r\n peerId, \r\n inputFilter: {_: inputFilter}, \r\n maxId: 0, \r\n limit: 1 \r\n }).then(value => {\r\n //console.log(lol);\r\n // ! by descend\r\n return value.history[0];\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n }\r\n\r\n if(message) {\r\n // ! гений в деле, костылируем (но это гениально)\r\n const messagePhoto = message.action.photo;\r\n if(messagePhoto.id !== photo.id) {\r\n if(!hadMessage) {\r\n message = appMessagesManager.generateFakeAvatarMessage(peerId, photo);\r\n } else {\r\n \r\n }\r\n }\r\n\r\n const f = (arr: typeof prevTargets) => arr.map(el => ({\r\n element: el.element,\r\n mid: (el.item as Message.messageService).mid,\r\n peerId: (el.item as Message.messageService).peerId\r\n }));\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n peerId,\r\n inputFilter: {_: inputFilter},\r\n })\r\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n\r\n return;\r\n }\r\n }\r\n\r\n if(photo) {\r\n if(!isObject(message)) {\r\n photo = appPhotosManager.getPhoto(message);\r\n }\r\n \r\n const f = (arr: typeof prevTargets) => arr.map(el => ({\r\n element: el.element,\r\n photoId: el.item as string\r\n }));\r\n\r\n new AppMediaViewerAvatar(peerId).openMedia(photo.id, getTarget(), undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n }\r\n}\r\n\r\nconst believeMe: Map> = new Map();\r\nconst seen: Set = new Set();\r\n\r\nexport default class AvatarElement extends HTMLElement {\r\n private peerId: PeerId;\r\n private isDialog = false;\r\n private peerTitle: string;\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueueIntersector;\r\n private addedToQueue = false;\r\n\r\n connectedCallback() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n this.isDialog = this.getAttribute('dialog') === '1';\r\n if(this.getAttribute('clickable') === '') {\r\n this.setAttribute('clickable', 'set');\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\r\n disconnectedCallback() {\r\n // браузер вызывает этот метод при удалении элемента из документа\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n const set = believeMe.get(this.peerId);\r\n if(set && set.has(this)) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(this.peerId);\r\n }\r\n }\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n }\r\n\r\n static get observedAttributes(): string[] {\r\n return ['peer', 'dialog', 'peer-title'/* массив имён атрибутов для отслеживания их изменений */];\r\n }\r\n\r\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\r\n //console.log('avatar changed attribute:', name, oldValue, newValue);\r\n // вызывается при изменении одного из перечисленных выше атрибутов\r\n if(name === 'peer') {\r\n const newPeerId = (newValue || '').toPeerId() || NULL_PEER_ID;\r\n if(this.peerId === newPeerId) {\r\n return;\r\n }\r\n \r\n this.peerId = appPeersManager.getPeerMigratedTo(newPeerId) || newPeerId;\r\n\r\n const wasPeerId = (oldValue || '').toPeerId() || NULL_PEER_ID;\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 this.update();\r\n } else if(name === 'peer-title') {\r\n this.peerTitle = newValue;\r\n } else if(name === 'dialog') {\r\n this.isDialog = newValue === '1';\r\n }\r\n }\r\n\r\n private r(onlyThumb = false) {\r\n const res = appAvatarsManager.putPhoto(this, this.peerId, this.isDialog, this.peerTitle, onlyThumb);\r\n const promise = res ? res.loadPromise : Promise.resolve();\r\n if(this.loadPromises) {\r\n if(res && res.cached) {\r\n this.loadPromises.push(promise);\r\n }\r\n\r\n promise.finally(() => {\r\n this.loadPromises = undefined;\r\n });\r\n }\r\n\r\n return res;\r\n }\r\n\r\n public update() {\r\n if(this.lazyLoadQueue) {\r\n if(!seen.has(this.peerId)) {\r\n if(this.addedToQueue) return;\r\n this.addedToQueue = true;\r\n \r\n let set = believeMe.get(this.peerId);\r\n if(!set) {\r\n set = new Set();\r\n believeMe.set(this.peerId, set);\r\n }\r\n \r\n set.add(this);\r\n\r\n this.r(true);\r\n\r\n this.lazyLoadQueue.push({\r\n div: this, \r\n load: () => {\r\n seen.add(this.peerId);\r\n return this.update();\r\n }\r\n });\r\n\r\n return;\r\n } else if(this.addedToQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n } \r\n \r\n seen.add(this.peerId);\r\n \r\n const res = this.r();\r\n const promise = res ? res.loadPromise : Promise.resolve();\r\n\r\n if(this.addedToQueue) {\r\n promise.finally(() => {\r\n this.addedToQueue = false;\r\n });\r\n }\r\n\r\n const set = believeMe.get(this.peerId);\r\n if(set) {\r\n set.delete(this);\r\n const arr = Array.from(set);\r\n believeMe.delete(this.peerId);\r\n \r\n\r\n for(let i = 0, length = arr.length; i < length; ++i) {\r\n arr[i].update();\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n}\r\n\r\ncustomElements.define('avatar-element', AvatarElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, {Dialog} from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport rootScope from \"../lib/rootScope\";\nimport { positionMenu, openBtnMenu } from \"./misc\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteDialog from \"./popups/deleteDialog\";\nimport { i18n } from \"../lib/langPack\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport appNotificationsManager from \"../lib/appManagers/appNotificationsManager\";\nimport PopupPeer from \"./popups/peer\";\nimport AppChatFoldersTab from \"./sidebarLeft/tabs/chatFolders\";\nimport appSidebarLeft from \"./sidebarLeft\";\nimport { toastNew } from \"./toast\";\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n\n private selectedId: PeerId;\n private filterId: number;\n private dialog: Dialog;\n\n private init() {\n this.buttons = [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: () => !appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: () => {\n const isPinned = this.filterId > 1 ? appMessagesManager.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId) : !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: () => {\n const isPinned = this.filterId > 1 ? appMessagesManager.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId) : !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: () => {\n return this.selectedId !== rootScope.myId && !appNotificationsManager.isPeerLocalMuted(this.dialog.peerId); \n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: () => {\n return this.selectedId !== rootScope.myId && appNotificationsManager.isPeerLocalMuted(this.dialog.peerId); \n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.selectedId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.selectedId !== rootScope.myId\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.id = 'dialogs-contextmenu';\n this.element.classList.add('contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onArchiveClick = () => {\n let dialog = appMessagesManager.getDialogOnly(this.selectedId);\n if(dialog) {\n appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private onPinClick = () => {\n appMessagesManager.toggleDialogPin(this.selectedId, this.filterId).catch(err => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH') {\n if(this.filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n new PopupPeer('pinned-dialogs-too-much', {\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'FiltersSetupPinAlert',\n callback: () => {\n new AppChatFoldersTab(appSidebarLeft).open();\n }\n }],\n descriptionLangKey: 'PinToTopLimitReached2',\n descriptionLangArgs: [i18n('Chats', [rootScope.config.pinned_dialogs_count_max])]\n }).show();\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n appMessagesManager.mutePeer(this.selectedId, false);\n };\n \n private onMuteClick = () => {\n appMessagesManager.mutePeer(this.selectedId, true);\n };\n\n private onUnreadClick = () => {\n const dialog = appMessagesManager.getDialogOnly(this.selectedId);\n if(!dialog) return;\n\n if(dialog.unread_count) {\n appMessagesManager.readHistory(this.selectedId, dialog.top_message);\n appMessagesManager.markDialogUnread(this.selectedId, true);\n } else {\n appMessagesManager.markDialogUnread(this.selectedId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.selectedId/* , 'delete' */);\n };\n\n onContextMenu = (e: MouseEvent | Touch) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let li: HTMLElement = null;\n \n try {\n li = findUpTag(e.target, 'LI');\n } catch(e) {}\n \n if(!li) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n this.filterId = appDialogsManager.filterId;\n\n this.selectedId = li.dataset.peerId.toPeerId();\n this.dialog = appMessagesManager.getDialogOnly(this.selectedId);\n\n this.buttons.forEach(button => {\n const good = button.verify();\n\n button.element.classList.toggle('hide', !good);\n });\n\n // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(appPeersManager.getDeleteButtonText(this.selectedId)));\n\n li.classList.add('menu-open');\n positionMenu(e, this.element);\n openBtnMenu(this.element, () => {\n li.classList.remove('menu-open');\n this.selectedId = this.dialog = this.filterId = undefined;\n });\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Message } from \"../layer\";\n/* import findUpClassName from \"../helpers/dom/findUpClassName\";\nimport rootScope from \"../lib/rootScope\";\nimport Transition from \"./transition\"; */\n\nexport enum SENDING_STATUS {\n Error = -1,\n Pending,\n Sent,\n Read\n}\n\nexport function getSendingStatus(message: Message.message | Message.messageService) {\n return message.pFlags.is_outgoing ? \n SENDING_STATUS.Pending : (\n message.pFlags.unread ? \n SENDING_STATUS.Sent : \n SENDING_STATUS.Read\n );\n}\n\nexport function setSendingStatus(\n container: HTMLElement, \n message?: Message.message | Message.messageService, \n disableAnimationIfRippleFound?: boolean\n) {\n let className: 'check' | 'checks' | 'sending';\n if(message?.pFlags.out) {\n if(message.pFlags.is_outgoing) {\n className = 'sending';\n } else if(message.pFlags.unread) {\n className = 'check';\n } else {\n className = 'checks';\n }\n }\n\n if(!className) {\n container.textContent = '';\n return;\n }\n \n const iconClassName = 'tgico-' + className;\n const lastElement = container.lastElementChild as HTMLElement;\n if(lastElement && lastElement.classList.contains(iconClassName)) {\n return;\n }\n \n const element = document.createElement('i');\n element.classList.add('sending-status-icon', /* 'transition-item', */ iconClassName);\n container.append(element);\n\n if(lastElement) {\n lastElement.remove();\n }\n\n /* if(!lastElement) {\n element.classList.add('active');\n return;\n }\n\n const select = Transition(container, undefined, 350, () => {\n lastElement.remove();\n }, false, true, false);\n\n let animate = rootScope.settings.animationsEnabled && className !== 'sending' && !lastElement.classList.contains('tgico-sending');\n if(disableAnimationIfRippleFound && animate) {\n const parent = findUpClassName(container, 'rp');\n if(parent.querySelector('.c-ripple__circle') || parent.matches(':hover')) {\n animate = false;\n }\n }\n\n select(element, animate, lastElement); */\n\n /* SetTransition(lastElement, 'is-visible', false, 350, () => {\n // lastElement.remove();\n }, 2);\n SetTransition(element, 'is-visible', true, 350, undefined, 2); */\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../config/app\";\r\nimport DEBUG from \"../config/debug\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport apiUpdatesManager from \"../lib/appManagers/apiUpdatesManager\";\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\nimport { logger } from \"../lib/logger\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Button from \"./button\";\r\nimport ProgressivePreloader from \"./preloader\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport { ConnectionStatus } from \"../lib/mtproto/connectionStatus\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\n\r\nexport default class ConnectionStatusComponent {\r\n public static CHANGE_STATE_DELAY = 1000;\r\n\r\n private statusContainer: HTMLElement;\r\n private statusEl: HTMLElement;\r\n private statusPreloader: ProgressivePreloader;\r\n\r\n private currentLangPackKey: LangPackKey;\r\n\r\n private hadConnect = false;\r\n private retryAt: number;\r\n private connecting = false;\r\n private timedOut = false;\r\n private updating = false;\r\n\r\n private log: ReturnType;\r\n\r\n private setFirstConnectionTimeout: number;\r\n private setStateTimeout: number;\r\n\r\n constructor(chatsContainer: HTMLElement) {\r\n this.log = logger('CS', undefined, undefined);\r\n \r\n this.statusContainer = document.createElement('div');\r\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\r\n\r\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\r\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\r\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\r\n this.statusContainer.append(this.statusEl);\r\n\r\n chatsContainer.prepend(this.statusContainer);\r\n\r\n rootScope.addEventListener('connection_status_change', (status) => {\r\n console.log(status);\r\n\r\n this.setConnectionStatus();\r\n });\r\n\r\n rootScope.addEventListener('state_synchronizing', (channelId) => {\r\n if(!channelId) {\r\n this.updating = true;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('state_synchronized', (channelId) => {\r\n DEBUG && this.log('state_synchronized', channelId);\r\n if(!channelId) {\r\n this.updating = false;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\r\n\r\n /* let bool = true;\r\n document.addEventListener('dblclick', () => {\r\n rootScope.dispatchEvent('connection_status_change', {\r\n dcId: 2,\r\n isFileDownload: false,\r\n isFileNetworker: false,\r\n isFileUpload: false,\r\n name: \"NET-2\",\r\n status: bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected),\r\n _: \"networkerStatus\"\r\n });\r\n }); */\r\n }\r\n\r\n private setConnectionStatus = () => {\r\n sessionStorage.get('dc').then(baseDcId => {\r\n if(!baseDcId) {\r\n baseDcId = App.baseDcId;\r\n }\r\n \r\n if(this.setFirstConnectionTimeout) {\r\n clearTimeout(this.setFirstConnectionTimeout);\r\n this.setFirstConnectionTimeout = 0;\r\n }\r\n\r\n const status = rootScope.connectionStatus['NET-' + baseDcId];\r\n const online = status && status.status === ConnectionStatus.Connected;\r\n\r\n if(this.connecting && online) {\r\n apiUpdatesManager.forceGetDifference();\r\n }\r\n\r\n if(online && !this.hadConnect) {\r\n this.hadConnect = true;\r\n }\r\n \r\n this.timedOut = status && status.status === ConnectionStatus.TimedOut;\r\n this.connecting = !online;\r\n this.retryAt = status && status.retryAt;\r\n DEBUG && this.log('connecting', this.connecting);\r\n this.setState();\r\n });\r\n };\r\n\r\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\r\n if(this.currentLangPackKey === langPackKey) return;\r\n this.currentLangPackKey = langPackKey;\r\n replaceContent(this.statusEl, i18n(langPackKey, args));\r\n this.statusPreloader.attach(this.statusEl);\r\n };\r\n\r\n private getA(langPackKey: LangPackKey, callback: () => void) {\r\n const a = document.createElement('a');\r\n a.classList.add('force-reconnect');\r\n a.append(i18n(langPackKey));\r\n a.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n callback();\r\n });\r\n\r\n return a;\r\n }\r\n\r\n private setState = () => {\r\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\r\n if(this.connecting) {\r\n if(this.timedOut) {\r\n const a = this.getA('ConnectionStatus.ForceReconnect', () => apiManager.forceReconnect());\r\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\r\n } else if(this.hadConnect) {\r\n if(this.retryAt !== undefined) {\r\n const timerSpan = document.createElement('span');\r\n const retryAt = this.retryAt;\r\n const setTime = () => {\r\n const now = Date.now();\r\n timerSpan.innerText = '' + Math.round((retryAt - now) / 1000);\r\n if(now > retryAt) {\r\n clearInterval(interval);\r\n }\r\n };\r\n const interval = setInterval(setTime, 1e3);\r\n setTime();\r\n \r\n const a = this.getA('ConnectionStatus.Reconnect', () => apiManager.forceReconnectTimeout());\r\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\r\n } else {\r\n this.setStatusText('ConnectionStatus.Reconnecting');\r\n }\r\n } else {\r\n this.setStatusText('ConnectionStatus.Waiting');\r\n }\r\n } else if(this.updating) {\r\n this.setStatusText('Updating');\r\n }\r\n\r\n DEBUG && this.log('setState', this.connecting || this.updating);\r\n window.requestAnimationFrame(() => {\r\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\r\n\r\n const cb = () => {\r\n SetTransition(this.statusContainer, 'is-shown', this.connecting || this.updating, 200);\r\n this.setStateTimeout = 0;\r\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\r\n };\r\n\r\n this.setStateTimeout = window.setTimeout(cb, timeout);\r\n //cb();\r\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\r\n else cb(); */\r\n });\r\n };\r\n}\r\n","export default function roundRect(\n ctx: CanvasRenderingContext2D, \n x: number, \n y: number, \n width: number, \n height: number, \n radius: {[k in 'tl' | 'tr' | 'br' | 'bl']?: number} | number, \n fill?: boolean, \n stroke?: boolean\n) {\n if(typeof(radius) === 'number') {\n radius = {tl: radius, tr: radius, br: radius, bl: radius};\n } else {\n const defaultRadius = {tl: 0, tr: 0, br: 0, bl: 0};\n for(const side in defaultRadius) {\n // @ts-ignore\n radius[side] = radius[side] || defaultRadius[side];\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { animate } from \"../helpers/animation\";\nimport customProperties from \"../helpers/dom/customProperties\";\nimport easeInOutSine from \"../helpers/easing/easeInOutSine\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport roundRect from \"../helpers/roundRect\";\n\nconst DPR = window.devicePixelRatio;\nconst SIZE = 20 * DPR;\nconst MARGIN = 2.5 * DPR;\nconst WIDTH = 2 * DPR;\nconst RADIUS = 1 * DPR;\nconst LENGTH = 3;\n\nconst MIN_HEIGHT = 4;\nconst MAX_HEIGHT = 12;\nconst DURATION = 1000;\n\nexport default function groupCallActiveIcon(isActive = false) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = SIZE;\n const context = canvas.getContext('2d');\n \n const TOTAL_WIDTH = LENGTH * WIDTH + (LENGTH - 1) * MARGIN;\n const START_X = (SIZE - TOTAL_WIDTH) / 2;\n \n const startTime = Date.now();\n let wasMounted = false;\n // let hadRound = false;\n const renderFrame = () => {\n if(!canvas.isConnected) {\n if(wasMounted) {\n return false;\n }\n } else if(!wasMounted) {\n wasMounted = canvas.isConnected;\n }\n \n const time = Date.now();\n // if(((time - startTime) / DURATION) >= 1) {\n // hadRound = true;\n // }\n \n const progress = easeInOutSine((time - startTime) % DURATION, 0, 1, DURATION);\n \n context.clearRect(0, 0, SIZE, SIZE);\n context.fillStyle = isActive && !mediaSizes.isMobile ? customProperties.getProperty('primary-color') : '#fff';\n\n for(let i = 0; i < LENGTH; ++i) {\n const x = START_X + (i * WIDTH) + (i * MARGIN);\n\n let itemProgress: number;\n if(progress >= .5) {\n itemProgress = i % 2 ? 2 - progress * 2 : (progress - .5) * 2;\n } else {\n itemProgress = i % 2 ? progress * 2 : 1 - progress * 2;\n }\n\n let height = MIN_HEIGHT + (itemProgress * (MAX_HEIGHT - MIN_HEIGHT));\n /* if(!hadRound && i === 1) {\n console.log('call status animation', itemProgress, height, progress, progress >= .5);\n } */\n \n height *= DPR;\n const y = (SIZE - height) / 2;\n \n roundRect(context, x, y, WIDTH, height, RADIUS, true);\n }\n\n return true;\n };\n\n return {\n canvas,\n startAnimation: () => {\n animate(renderFrame);\n renderFrame();\n },\n setActive: (active: boolean) => {\n isActive = active;\n renderFrame();\n }\n };\n}\n","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine (t: number, b: number, c: number, d: number) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type DialogsStorage from \"../storages/dialogs\";\nimport type {MyDialogFilter as DialogFilter, MyDialogFilter} from \"../storages/filters\";\nimport type { LazyLoadQueueIntersector } from \"../../components/lazyLoadQueue\";\nimport AvatarElement from \"../../components/avatar\";\nimport DialogsContextMenu from \"../../components/dialogsContextMenu\";\nimport { horizontalMenu } from \"../../components/horizontalMenu\";\nimport { attachContextMenuListener, putPreloader } from \"../../components/misc\";\nimport { ripple } from \"../../components/ripple\";\n//import Scrollable from \"../../components/scrollable\";\nimport Scrollable, { ScrollableX, SliceSides } from \"../../components/scrollable\";\nimport { formatDateAccordingToTodayNew } from \"../../helpers/date\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { logger, LogTypes } from \"../logger\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appPeersManager from './appPeersManager';\nimport appImManager from \"./appImManager\";\nimport appMessagesManager, { Dialog, MyMessage } from \"./appMessagesManager\";\nimport appStateManager, { State } from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport Button from \"../../components/button\";\nimport SetTransition from \"../../components/singleTransition\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport I18n, { FormatterArguments, i18n, LangPackKey, _i18n } from \"../langPack\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport lottieLoader from \"../rlottie/lottieLoader\";\nimport { wrapLocalSticker, wrapPhoto } from \"../../components/wrappers\";\nimport AppEditFolderTab from \"../../components/sidebarLeft/tabs/editFolder\";\nimport appSidebarLeft, { SettingSection } from \"../../components/sidebarLeft\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport ConnectionStatusComponent from \"../../components/connectionStatus\";\nimport appChatsManager from \"./appChatsManager\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport { fastRafConventional, fastRafPromise } from \"../../helpers/schedulers\";\nimport SortedUserList from \"../../components/sortedUserList\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport handleTabSwipe from \"../../helpers/dom/handleTabSwipe\";\nimport windowSize from \"../../helpers/windowSize\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport { MyDocument } from \"./appDocsManager\";\nimport { setSendingStatus } from \"../../components/sendingStatus\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport generateVerifiedIcon from \"../../components/generateVerifiedIcon\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport groupCallActiveIcon from \"../../components/groupCallActiveIcon\";\nimport { Chat } from \"../../layer\";\nimport IS_GROUP_CALL_SUPPORTED from \"../../environment/groupCallSupport\";\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLDivElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLLIElement,\n subtitleEl: HTMLElement\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n loadPromises?: Promise[]\n}\n\nclass SortedDialogList extends SortedList {\n constructor(\n public list: HTMLUListElement, \n public indexKey: ReturnType,\n public onListLengthChange?: () => void\n ) {\n super({\n getIndex: (element) => appMessagesManager.getDialogOnly(element.id)[this.indexKey],\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength) {\n this.onListLengthChange && this.onListLengthChange();\n }\n },\n onElementCreate: (base, batch) => {\n const loadPromises: Promise[] = batch ? [] : undefined;\n\n const {dom} = appDialogsManager.addListDialog({dialog: base.id, loadPromises, isBatch: batch});\n (base as SortedDialog).dom = dom;\n\n if(loadPromises?.length) {\n (base as SortedDialog).loadPromises = loadPromises;\n Promise.all(loadPromises).finally(() => {\n delete (base as SortedDialog).loadPromises;\n });\n }\n\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional\n });\n }\n\n public clear() {\n this.list.innerHTML = '';\n super.clear();\n }\n}\n\n//const testScroll = false;\n//let testTopSlice = 1;\n\nexport class AppDialogsManager {\n private chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n private chatsPreloader: HTMLElement;\n\n private loadDialogsPromise: Promise;\n\n private scroll: Scrollable = null;\n \n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu = new DialogsContextMenu();\n\n public sortedList: SortedDialogList;\n public sortedLists: {[filterId: number]: SortedDialogList} = {};\n public scrollables: {[filterId: number]: Scrollable} = {};\n public filterId: number;\n private folders: {[k in 'menu' | 'container' | 'menuScrollContainer']: HTMLElement} = {\n menu: document.getElementById('folders-tabs'),\n menuScrollContainer: null,\n container: document.getElementById('folders-container')\n };\n private filtersRendered: {\n [filterId: string]: {\n menu: HTMLElement, \n container: HTMLElement,\n unread: HTMLElement,\n title: HTMLElement\n }\n } = {};\n private showFiltersPromise: Promise;\n private allUnreadCount: HTMLElement;\n\n private sliceTimeout: number;\n\n private lastActiveElements: Set = new Set();\n\n private offsets: {top: number, bottom: number} = {top: 0, bottom: 0};\n \n private loadContacts: () => void;\n private processContact: (peerId: PeerId) => void;\n\n private indexKey: ReturnType;\n\n private initedListeners = false;\n\n private onListLengthChange: () => Promise;\n private loadedDialogsAtLeastOnce = false;\n\n constructor() {\n this.chatsPreloader = putPreloader(null, true);\n\n this.allUnreadCount = this.folders.menu.querySelector('.badge');\n \n this.folders.menuScrollContainer = this.folders.menu.parentElement;\n\n this.onListLengthChange = debounce(this._onListLengthChange, 100, false, true);\n\n const bottomPart = document.createElement('div');\n bottomPart.classList.add('connection-status-bottom');\n bottomPart.append(this.folders.container);\n\n /* if(isTouchSupported && isSafari) {\n let allowUp: boolean, allowDown: boolean, slideBeginY: number;\n const container = this.scroll.container;\n container.addEventListener('touchstart', (event) => {\n allowUp = container.scrollTop > 0;\n allowDown = (container.scrollTop < container.scrollHeight - container.clientHeight);\n // @ts-ignore\n slideBeginY = event.pageY;\n });\n \n container.addEventListener('touchmove', (event: any) => {\n var up = (event.pageY > slideBeginY);\n var down = (event.pageY < slideBeginY);\n slideBeginY = event.pageY;\n if((up && allowUp) || (down && allowDown)) {\n event.stopPropagation();\n } else if(up || down) {\n event.preventDefault();\n }\n });\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.folders.container,\n onSwipe: (xDiff) => {\n const prevId = selectTab.prevId();\n selectTab(xDiff > 0 ? prevId + 1 : prevId - 1);\n }\n });\n }\n\n this.setFilterId(0);\n this.addFilter({\n id: this.filterId,\n title: '',\n titleEl: i18n('ChatList.Filter.AllChats'),\n orderIndex: 0\n });\n\n this.sortedList = this.sortedLists[this.filterId];\n this.scroll = this.scrollables[this.filterId];\n\n /* if(testScroll) {\n let i = 0;\n let add = () => {\n let li = document.createElement('li');\n li.dataset.id = '' + i;\n li.id = '' + i;\n li.innerHTML = `

${i}18:33

-_-_-_-: qweasd

`;\n i++;\n this.scroll.append(li);\n };\n for(let i = 0; i < 500; ++i) {\n add();\n }\n (window as any).addElement = add;\n } */\n\n rootScope.addEventListener('state_cleared', () => {\n //setTimeout(() => \n appStateManager.getState().then((state) => {\n this.loadedDialogsAtLeastOnce = false;\n\n appUsersManager.clear();\n appChatsManager.clear();\n \n const filtersStorage = appMessagesManager.filtersStorage;\n const filters = filtersStorage.filters;\n for(const filterId in filters) { // delete filters\n rootScope.dispatchEvent('updateDialogFilter', {\n _: 'updateDialogFilter',\n id: +filterId,\n });\n }\n\n appMessagesManager.clear();\n\n /* const clearPromises: Promise[] = [];\n for(const name in appStateManager.storagesResults) {\n const results = appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n this.sortedList.clear();\n this.onTabChange();\n this.onStateLoaded(state);\n })//, 5000);\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = horizontalMenu(this.folders.menu, this.folders.container, (id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n id = +tabContent.dataset.filterId || 0;\n\n if(this.filterId === id) return;\n\n this.sortedLists[id].clear();\n this.setFilterId(id);\n this.onTabChange();\n }, () => {\n for(const folderId in this.sortedLists) {\n if(+folderId !== this.filterId) {\n this.sortedLists[folderId].clear();\n }\n }\n }, undefined, foldersScrollable);\n\n //selectTab(0);\n (this.folders.menu.firstElementChild as HTMLElement).click();\n appMessagesManager.construct();\n appStateManager.getState().then((state) => {\n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n new ConnectionStatusComponent(this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n }\n\n public get chatList() {\n return this.sortedList.list;\n }\n\n public setFilterId(filterId: number) {\n this.filterId = filterId;\n this.indexKey = appMessagesManager.dialogsStorage ? appMessagesManager.dialogsStorage.getDialogIndexKey(this.filterId) : 'index';\n rootScope.filterId = filterId;\n }\n\n private setOnlineStatus(element: HTMLElement, online: boolean) {\n const className = 'is-online';\n const hasClassName = element.classList.contains(className);\n !hasClassName && online && element.classList.add(className);\n SetTransition(element, 'is-visible', online, 250, online ? undefined : () => {\n element.classList.remove(className);\n }, online && !hasClassName ? 2 : 0);\n }\n\n private initListeners() {\n rootScope.addEventListener('user_update', (userId) => {\n //console.log('updating user:', user, dialog);\n \n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(dom && !appUsersManager.isBot(userId) && peerId !== rootScope.myId) {\n const user = appUsersManager.getUser(userId);\n const online = user.status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n }\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const peerId = chatId.toPeerId(true);\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForCallStatus(dialog);\n }\n });\n\n /* rootScope.$on('dialog_top', (e) => {\n const dialog = e;\n\n this.setLastMessage(dialog);\n this.setDialogPosition(dialog);\n\n this.setFiltersUnreadCount();\n }); */\n\n rootScope.addEventListener('folder_unread', (folder) => {\n this.setFilterUnreadCount(folder.id);\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact && this.processContact(userId.toPeerId());\n });\n\n rootScope.addEventListener('dialog_flush', ({peerId}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.setLastMessage(dialog, undefined, undefined, undefined, undefined, undefined, true);\n this.validateDialogForFilter(dialog);\n this.setFiltersUnreadCount();\n }\n });\n\n rootScope.addEventListener('dialogs_multiupdate', (dialogs) => {\n for(const peerId in dialogs) {\n const dialog = dialogs[peerId];\n this.updateDialog(dialog);\n\n if(this.processContact) {\n this.processContact(peerId.toPeerId());\n }\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_drop', ({peerId}) => {\n this.deleteDialog(peerId);\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('dialog_unread', ({peerId}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.setUnreadMessages(dialog);\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.setUnreadMessages(dialog); // возможно это не нужно, но нужно менять is-muted\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('dialog_draft', ({dialog, drop, peerId}) => {\n if(drop) {\n this.sortedList.delete(peerId);\n } else {\n this.updateDialog(dialog);\n }\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('peer_changed', (peerId) => {\n //const perf = performance.now();\n for(const element of this.lastActiveElements) {\n if(element.dataset.peerId.toPeerId() !== peerId) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] li[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach(element => {\n this.setDialogActive(element, true);\n });\n //this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', (filter) => {\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n } else if(filter.id === this.filterId) { // это нет тут смысла вызывать, так как будет dialogs_multiupdate\n const dialogs = appMessagesManager.dialogsStorage.getCachedDialogs(true);\n this.validateListForFilter();\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n this.updateDialog(dialog);\n }\n }\n\n const elements = this.filtersRendered[filter.id];\n elements.title.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\n });\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const elements = this.filtersRendered[filter.id];\n if(!elements) return;\n\n // set tab\n //(this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click();\n (this.folders.menu.firstElementChild as HTMLElement).click();\n\n elements.container.remove();\n elements.menu.remove();\n \n delete this.sortedLists[filter.id];\n delete this.scrollables[filter.id];\n delete this.filtersRendered[filter.id];\n\n if(Object.keys(this.filtersRendered).length <= 1) {\n this.folders.menuScrollContainer.classList.add('hide');\n }\n });\n\n rootScope.addEventListener('filter_order', (order) => {\n const containerToAppend = this.folders.menu as HTMLElement;\n order.forEach((filterId) => {\n const filter = appMessagesManager.filtersStorage.getFilter(filterId);\n const renderedFilter = this.filtersRendered[filterId];\n\n const sortedList = this.sortedLists[filterId];\n sortedList.indexKey = appMessagesManager.dialogsStorage.getDialogIndexKey(filterId);\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.orderIndex);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.orderIndex);\n });\n\n this.indexKey = appMessagesManager.dialogsStorage.getDialogIndexKey(this.filterId);\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n }\n\n private setDialogActive(listEl: HTMLElement, active: boolean) {\n // @ts-ignore\n const dom = listEl.dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\n if(active) {\n this.lastActiveElements.add(listEl);\n } else {\n this.lastActiveElements.delete(listEl);\n }\n\n if(dom?.callIcon) {\n dom.callIcon.setActive(active);\n }\n }\n\n private async onStateLoaded(state: State) {\n appNotificationsManager.getNotifyPeerTypeSettings();\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n \n const renderFiltersPromise = appMessagesManager.filtersStorage.getDialogFilters().then((filters) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n });\n\n if(state.filters && Object.keys(state.filters).length) {\n await renderFiltersPromise;\n if(this.showFiltersPromise) {\n await this.showFiltersPromise;\n }\n }\n\n if(appStateManager.storagesResults.dialogs.length) {\n appDraftsManager.addMissedDialogs();\n }\n\n return this.onChatsScroll().then(() => {\n appMessagesManager.fillConversations();\n });\n }\n\n /* private getOffset(side: 'top' | 'bottom'): {index: number, pos: number} {\n if(!this.scroll.loadedAll[side]) {\n const element = (side === 'top' ? this.chatList.firstElementChild : this.chatList.lastElementChild) as HTMLElement;\n if(element) {\n const peerId = element.dataset.peerId;\n const dialog = appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n private getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scroll.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n private isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n //return true;\n const topOffset = this.getOffsetIndex('top');\n const bottomOffset = this.getOffsetIndex('bottom');\n \n if(!topOffset.index && !bottomOffset.index) {\n return true;\n }\n \n const index = dialog[this.indexKey];\n return (!topOffset.index || index <= topOffset.index) && (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n private deleteDialog(peerId: PeerId) {\n this.sortedList.delete(peerId);\n }\n\n private updateDialog(dialog: Dialog) {\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(dialog.peerId)) {\n this.sortedList.add(dialog.peerId);\n return;\n }\n } else {\n this.deleteDialog(dialog.peerId);\n return;\n }\n\n const dom = this.getDialogDom(dialog.peerId);\n if(dom) {\n this.setLastMessage(dialog, undefined, dom, undefined, undefined, undefined, true);\n this.sortedList.update(dialog.peerId);\n }\n }\n\n public onTabChange = () => {\n this.scroll = this.scrollables[this.filterId];\n this.scroll.loadedAll.top = true;\n this.scroll.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsPromise = undefined;\n this.sortedList = this.sortedLists[this.filterId];\n this.onChatsScroll();\n };\n\n private setFilterUnreadCount(filterId: number) {\n const unreadSpan = filterId === 0 ? this.allUnreadCount : this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const folder = appMessagesManager.dialogsStorage.getFolder(filterId);\n const foundUnmuted = filterId === 0 || !!folder.dialogs.find(dialog => {\n return (dialog.unread_count || dialog.pFlags.unread_mark) && !appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n });\n \n unreadSpan.classList.toggle('badge-gray', !foundUnmuted);\n \n const sum = folder.unreadDialogsCount;\n unreadSpan.innerText = sum ? '' + sum : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n\n this.setFilterUnreadCount(0);\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n private validateListForFilter() {\n const filter = appMessagesManager.filtersStorage.getFilter(this.filterId) || null;\n this.sortedList.getAll().forEach((element) => {\n const dialog = appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog, filter)) {\n this.deleteDialog(element.id);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n private validateDialogForFilter(dialog: Dialog, filter?: MyDialogFilter) {\n if(!this.getDialogDom(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog, filter)) {\n this.deleteDialog(dialog.peerId);\n }\n }\n\n public testDialogForFilter(dialog: Dialog, filter = appMessagesManager.filtersStorage.getFilter(this.filterId)) {\n if(!dialog || \n (filter && !appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) || \n (!filter && this.filterId !== dialog.folder_id)) {\n return false;\n }\n\n return true;\n }\n\n public generateScrollable(list: HTMLUListElement, filterId: number) {\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n scrollable.container.dataset.filterId = '' + filterId;\n scrollable.onScrolledTop = this.onChatsScrollTop;\n scrollable.onScrolledBottom = this.onChatsScroll;\n scrollable.setVirtualContainer(list);\n\n const sortedDialogList = new SortedDialogList(\n list, \n appMessagesManager.dialogsStorage ? appMessagesManager.dialogsStorage.getDialogIndexKey(filterId) : 'index',\n this.onListLengthChange\n );\n\n this.scrollables[filterId] = scrollable;\n this.sortedLists[filterId] = sortedDialogList;\n\n // list.classList.add('hide');\n // scrollable.container.style.backgroundColor = '#' + (Math.random() * (16 ** 6 - 1) | 0).toString(16);\n\n return scrollable;\n }\n\n private addFilter(filter: Pick & Partial<{titleEl: HTMLElement}>) {\n if(this.filtersRendered[filter.id]) return;\n\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const titleSpan = document.createElement('span');\n titleSpan.classList.add('text-super');\n if(filter.titleEl) titleSpan.append(filter.titleEl);\n else titleSpan.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\n const unreadSpan = document.createElement('div');\n unreadSpan.classList.add('badge', 'badge-20', 'badge-primary');\n const i = document.createElement('i');\n span.append(titleSpan, unreadSpan, i);\n menuTab.append(span);\n ripple(menuTab);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n positionElementByIndex(menuTab, containerToAppend, filter.orderIndex);\n //containerToAppend.append(li);\n\n const ul = this.createChatList();\n const scrollable = this.generateScrollable(ul, filter.id);\n\n scrollable.container.classList.add('tabs-tab', 'chatlist-parts');\n\n /* const parts = document.createElement('div');\n parts.classList.add('chatlist-parts'); */\n \n const top = document.createElement('div');\n top.classList.add('chatlist-top');\n \n const bottom = document.createElement('div');\n bottom.classList.add('chatlist-bottom');\n\n top.append(ul);\n scrollable.container.append(top, bottom);\n /* parts.append(top, bottom);\n scrollable.container.append(parts); */\n \n const div = scrollable.container;\n //this.folders.container.append(div);\n positionElementByIndex(scrollable.container, this.folders.container, filter.orderIndex);\n\n this.setListClickListener(ul, null, true);\n\n this.filtersRendered[filter.id] = {\n menu: menuTab,\n container: div,\n unread: unreadSpan,\n title: titleSpan\n };\n\n if(!this.showFiltersPromise && Object.keys(this.filtersRendered).length > 1) {\n this.showFiltersPromise = new Promise((resolve) => {\n window.setTimeout(() => {\n this.showFiltersPromise = undefined;\n if(Object.keys(this.filtersRendered).length > 1) {\n this.folders.menuScrollContainer.classList.remove('hide');\n this.setFiltersUnreadCount();\n }\n resolve();\n }, 0);\n });\n }\n }\n\n private loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n \n if(this.loadDialogsPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n\n const promise = new Promise(async(resolve) => {\n const {chatList, filterId, indexKey} = this;\n\n //return;\n \n // let loadCount = 30/*this.chatsLoadCount */;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n \n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = appMessagesManager.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex(dialog => dialog[indexKey] <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = storage[needIndex][indexKey] + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n \n //let offset = storage[storage.length - 1]?.index || 0;\n \n try {\n //console.time('getDialogs time');\n \n const getConversationsResult = appMessagesManager.getConversations('', offsetIndex, loadCount, filterId, true);\n if(!getConversationsResult.cached && !chatList.childElementCount) {\n const container = chatList.parentElement;\n container.append(this.chatsPreloader);\n }\n \n const result = await getConversationsResult.promise;\n \n if(this.loadDialogsPromise !== promise) {\n return;\n }\n \n //console.timeEnd('getDialogs time');\n \n // * loaded all\n //if(!result.dialogs.length || chatList.childElementCount === result.count) {\n // !result.dialogs.length не подходит, так как при супердревном диалоге getConversations его не выдаст.\n //if(chatList.childElementCount === result.count) {\n if(side === 'bottom') {\n if(result.isEnd) {\n this.scroll.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scroll.loadedAll[side] = true;\n }\n\n this.loadedDialogsAtLeastOnce = true;\n \n if(result.dialogs.length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n \n const loadPromises: Promise[] = [];\n\n const callbacks: (() => void)[] = [];\n const cccc = (callback: () => void) => {\n callbacks.push(callback);\n };\n\n dialogs.forEach((dialog) => {\n // :(\n const isBuggedDialog = !appMessagesManager.getDialogOnly(dialog.peerId);\n if(isBuggedDialog) {\n return;\n }\n\n const element = this.sortedList.add(dialog.peerId, true, cccc, false);\n if(element.loadPromises) {\n loadPromises.push(...element.loadPromises);\n }\n });\n\n await Promise.all(loadPromises).finally();\n\n callbacks.forEach(callback => callback());\n } else {\n this.onListLengthChange();\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : result.dialogs.length - 1];\n if(offsetDialog) {\n this.offsets[side] = offsetDialog[indexKey];\n }\n\n this.log.debug('getDialogs ' + loadCount + ' dialogs by offset:', offsetIndex, result, chatList.childElementCount);\n \n setTimeout(() => {\n this.scroll.onScroll();\n }, 0);\n } catch(err) {\n this.log.error(err);\n }\n \n if(this.chatsPreloader.parentElement) {\n this.chatsPreloader.remove();\n }\n \n resolve();\n }).finally(() => {\n this.loadDialogsPromise = undefined;\n });\n\n return this.loadDialogsPromise = promise;\n }\n\n private generateEmptyPlaceholder(options: {\n title: LangPackKey,\n subtitle?: LangPackKey,\n subtitleArgs?: FormatterArguments,\n classNameType: string\n }) {\n const BASE_CLASS = 'empty-placeholder';\n const container = document.createElement('div');\n container.classList.add(BASE_CLASS, BASE_CLASS + '-' + options.classNameType);\n \n const header = document.createElement('div');\n header.classList.add(BASE_CLASS + '-header');\n _i18n(header, options.title);\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(BASE_CLASS + '-subtitle');\n if(options.subtitle) {\n _i18n(subtitle, options.subtitle, options.subtitleArgs);\n }\n\n container.append(header, subtitle);\n\n return {container, header, subtitle};\n }\n\n private checkIfPlaceholderNeeded() {\n if(this.filterId === 1) {\n return;\n }\n\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n let placeholderContainer = (Array.from(part.children) as HTMLElement[]).find(el => el.matches('.empty-placeholder'));\n const needPlaceholder = this.scroll.loadedAll.bottom && !chatList.childElementCount/* || true */;\n // chatList.style.display = 'none';\n\n if(needPlaceholder && placeholderContainer) {\n return;\n } else if(!needPlaceholder) {\n if(placeholderContainer) {\n part.classList.remove('with-placeholder');\n placeholderContainer.remove();\n }\n\n return;\n }\n\n let placeholder: ReturnType;\n if(!this.filterId) {\n placeholder = this.generateEmptyPlaceholder({\n title: 'ChatList.Main.EmptyPlaceholder.Title',\n classNameType: 'dialogs'\n });\n \n placeholderContainer = placeholder.container;\n \n const img = document.createElement('img');\n img.classList.add('empty-placeholder-dialogs-icon');\n \n Promise.all([\n appUsersManager.getContacts().then(users => {\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 const subtitleEl = new I18n.IntlElement({\n key,\n args,\n element: placeholder.subtitle\n });\n }),\n renderImageFromUrlPromise(img, 'assets/img/EmptyChats.svg'),\n fastRafPromise()\n ]).then(() => {\n placeholderContainer.classList.add('visible');\n });\n\n placeholderContainer.prepend(img);\n } else {\n placeholder = this.generateEmptyPlaceholder({\n title: 'FilterNoChatsToDisplay',\n subtitle: 'FilterNoChatsToDisplayInfo',\n classNameType: 'folder'\n });\n\n placeholderContainer = placeholder.container;\n\n placeholderContainer.prepend(wrapLocalSticker({\n emoji: '📂',\n width: 128,\n height: 128\n }).container)\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, () => {\n new AppEditFolderTab(appSidebarLeft).open(appMessagesManager.filtersStorage.getFilter(this.filterId));\n });\n\n placeholderContainer.append(button);\n }\n\n part.append(placeholderContainer);\n part.classList.add('with-placeholder');\n }\n\n private removeContactsPlaceholder() {\n const chatList = this.chatList;\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n parts.classList.remove('with-contacts');\n bottom.innerHTML = '';\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId > 0) return;\n\n const chatList = this.chatList;\n const count = chatList.childElementCount;\n\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n const hasContacts = !!bottom.childElementCount;\n if(count >= 10) {\n if(hasContacts) {\n this.removeContactsPlaceholder();\n }\n\n return;\n } else if(hasContacts) return;\n\n parts.classList.add('with-contacts');\n\n const section = new SettingSection({\n name: 'Contacts',\n noDelimiter: true,\n fakeGradientDelimiter: true\n });\n\n section.container.classList.add('hide');\n\n appUsersManager.getContactsPeerIds(undefined, undefined, 'online').then(contacts => {\n let ready = false;\n const onListLengthChange = () => {\n if(ready) {\n section.container.classList.toggle('hide', !sortedUserList.list.childElementCount);\n }\n };\n\n const sortedUserList = new SortedUserList({\n avatarSize: 42, \n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false, \n onListLengthChange\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const arr = contacts.splice(0, pageCount).filter(this.verifyPeerIdForContacts);\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = (peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = this.verifyPeerIdForContacts(peerId);\n const added = sortedUserList.has(peerId);\n if(!added && good) sortedUserList.add(peerId);\n else if(added && !good) sortedUserList.delete(peerId);\n };\n\n const list = sortedUserList.list;\n list.classList.add('chatlist-new');\n this.setListClickListener(list);\n section.content.append(list);\n\n ready = true;\n onListLengthChange();\n });\n\n bottom.append(section.container);\n };\n\n private verifyPeerIdForContacts = (peerId: PeerId) => {\n return peerId.isContact() && !appMessagesManager.getDialogOnly(peerId);\n };\n\n public onChatsRegularScroll = () => {\n // return;\n\n if(this.sliceTimeout) clearTimeout(this.sliceTimeout);\n this.sliceTimeout = window.setTimeout(() => {\n this.sliceTimeout = undefined;\n\n if(!this.chatList.childElementCount || this.processContact) {\n return;\n }\n\n /* const observer = new IntersectionObserver((entries) => {\n const \n });\n\n Array.from(this.chatList.children).forEach(el => {\n observer.observe(el);\n }); */\n\n fastRafConventional(() => {\n\n const perf = performance.now();\n\n const scrollTopWas = this.scroll.scrollTop;\n\n const firstElementChild = this.chatList.firstElementChild;\n const rectContainer = this.scroll.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scroll.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scroll.splitUp.offsetTop;\n if(offsetTop && scrollTopWas < offsetTop) offsetTop -= scrollTopWas;\n // const offsetTop = scrollTopWas < padding ? padding - scrollTopWas : 0;\n const firstY = rectContainer.y + offsetTop;\n const lastY = rectContainer.y/* - 8 */; // 8px - .chatlist padding-bottom\n \n const firstElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.ceil(firstY + 1)), firstElementChild.tagName) as HTMLElement;\n const lastElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.floor(lastY + rectContainer.height - 1)), firstElementChild.tagName) as HTMLElement;\n\n //alert('got element:' + rect.y);\n\n if(!firstElement || !lastElement) {\n return;\n }\n\n //alert('got element:' + !!firstElement);\n\n const firstElementRect = firstElement.getBoundingClientRect();\n const elementOverflow = firstElementRect.y - firstY;\n\n const sliced: HTMLElement[] = [];\n const firstIndex = children.indexOf(firstElement);\n const lastIndex = children.indexOf(lastElement);\n\n const saveLength = 10;\n\n const sliceFromStart = IS_SAFARI ? [] : children.slice(0, Math.max(0, firstIndex - saveLength));\n const sliceFromEnd = children.slice(lastIndex + saveLength);\n\n /* if(sliceFromStart.length !== sliceFromEnd.length) {\n console.log('not equal', sliceFromStart.length, sliceFromEnd.length);\n }\n\n if(sliceFromStart.length > sliceFromEnd.length) {\n const diff = sliceFromStart.length - sliceFromEnd.length;\n sliceFromStart.splice(0, diff);\n } else if(sliceFromEnd.length > sliceFromStart.length) {\n const diff = sliceFromEnd.length - sliceFromStart.length;\n sliceFromEnd.splice(sliceFromEnd.length - diff, diff);\n } */\n\n if(sliceFromStart.length) {\n this.scroll.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scroll.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach(el => {\n const peerId = el.dataset.peerId.toPeerId();\n this.deleteDialog(peerId);\n });\n\n this.setOffsets();\n\n //this.log('[slicer] elements', firstElement, lastElement, rect, sliced, sliceFromStart.length, sliceFromEnd.length);\n\n //this.log('[slicer] reset scrollTop', this.scroll.scrollTop, firstElement.offsetTop, firstElementRect.y, rect.y, elementOverflow);\n\n //alert('left length:' + children.length);\n\n this.scroll.scrollTop = firstElement.offsetTop - elementOverflow;\n\n this.log('slice time', performance.now() - perf);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n //this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n private setOffsets() {\n const chatList = this.chatList;\n const firstDialog = this.getDialogFromElement(chatList.firstElementChild as HTMLElement);\n const lastDialog = this.getDialogFromElement(chatList.lastElementChild as HTMLElement);\n\n const indexKey = this.indexKey;\n this.offsets.top = firstDialog[indexKey];\n this.offsets.bottom = lastDialog[indexKey];\n }\n\n private getDialogFromElement(element: HTMLElement) {\n return appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n\n public onChatsScrollTop = () => {\n this.onChatsScroll('top');\n };\n \n public onChatsScroll = (side: SliceSides = 'bottom') => {\n if(this.scroll.loadedAll[side]) {\n if(this.loadContacts) {\n this.loadContacts();\n }\n\n return;\n } else if(this.loadDialogsPromise) return this.loadDialogsPromise;\n\n this.log('onChatsScroll', side);\n return this.loadDialogs(side);\n };\n\n public setListClickListener(list: HTMLUListElement, onFound?: () => void, withContext = false, autonomous = false, openInner = false) {\n let lastActiveListElement: HTMLElement;\n\n const setPeerFunc = (openInner ? appImManager.setInnerPeer : appImManager.setPeer).bind(appImManager);\n\n list.dataset.autonomous = '' + +autonomous;\n list.addEventListener('mousedown', (e) => {\n if(e.button !== 0) return;\n //cancelEvent(e);\n\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, 'LI');\n\n if(!elem) {\n return;\n }\n\n if(autonomous) {\n const sameElement = lastActiveListElement === elem;\n if(lastActiveListElement && !sameElement) {\n lastActiveListElement.classList.remove('active');\n }\n\n if(elem) {\n elem.classList.add('active');\n lastActiveListElement = elem;\n this.lastActiveElements.add(elem);\n }\n }\n\n if(elem) {\n if(onFound) onFound();\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n setPeerFunc(peerId, lastMsgId);\n } else {\n setPeerFunc(NULL_PEER_ID);\n }\n }, {capture: true});\n\n if(DEBUG) {\n list.addEventListener('dblclick', (e) => {\n const li = findUpTag(e.target, 'LI');\n if(li) {\n const peerId = li.dataset.peerId.toPeerId();\n this.log('debug dialog:', appMessagesManager.getDialogByPeerId(peerId));\n }\n });\n }\n\n if(withContext) {\n attachContextMenuListener(list, this.contextMenu.onContextMenu);\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number\n } = {}) {\n const list = document.createElement('ul');\n list.classList.add('chatlist'/* , \n 'chatlist-avatar-' + (options.avatarSize || 54) *//* , 'chatlist-' + (options.size || 72) */);\n\n if(options.new) {\n list.classList.add('chatlist-new');\n }\n\n if(options.dialogSize) {\n list.classList.add('chatlist-' + options.dialogSize);\n }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessage(\n dialog: Dialog, \n lastMessage?: any, \n dom?: DialogDom, \n highlightWord?: string, \n loadPromises?: Promise[],\n isBatch = false,\n setUnread = false\n ) {\n ///////console.log('setlastMessage:', lastMessage);\n if(!dom) {\n dom = this.getDialogDom(dialog.peerId);\n\n if(!dom) {\n //this.log.error('no dom for dialog:', dialog, lastMessage, dom, highlightWord);\n return;\n }\n }\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(dialog.draft && dialog.draft._ === 'draftMessage') {\n draftMessage = dialog.draft;\n }\n \n lastMessage = appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n\n if(lastMessage._ === 'messageEmpty'/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.innerHTML = '';\n dom.lastTimeSpan.innerHTML = '';\n delete dom.listEl.dataset.mid;\n\n if(setUnread) {\n this.setUnreadMessages(dialog, dom, isBatch);\n }\n\n return;\n }\n\n const peerId = dialog.peerId;\n //let peerId = appMessagesManager.getMessagePeer(lastMessage);\n\n //console.log('setting last message:', lastMessage);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n\n let mediaContainer: HTMLElement;\n if(!lastMessage.deleted && !draftMessage) {\n const media: MyDocument | MyPhoto = appMessagesManager.getMediaFromMessage(lastMessage);\n if(media && (media._ === 'photo' || (['video', 'gif'] as MyDocument['type'][]).includes(media.type))) {\n const size = appPhotosManager.choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n \n wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size,\n loadPromises\n });\n\n if((media as MyDocument).type === 'video') {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n const withoutMediaType = !!mediaContainer && !!lastMessage?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && lastMessage.message) {\n fragment = appMessagesManager.wrapMessageForReply(lastMessage, undefined, undefined, false, highlightWord, withoutMediaType);\n } else if(draftMessage) {\n fragment = appMessagesManager.wrapMessageForReply(draftMessage);\n } else if(!lastMessage.deleted) {\n fragment = appMessagesManager.wrapMessageForReply(lastMessage, undefined, undefined, false, undefined, withoutMediaType);\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(mediaContainer) {\n fragment.prepend(mediaContainer);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n \n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const bold = document.createElement('b');\n bold.classList.add('danger');\n bold.append(i18n('Draft'), ': ');\n dom.lastMessageSpan.prepend(bold);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !lastMessage.action) {\n const sender = appPeersManager.getPeer(lastMessage.fromId);\n if(sender && sender.id) {\n const senderBold = document.createElement('b');\n\n if(sender.id === rootScope.myId) {\n senderBold.append(i18n('FromYou'));\n } else {\n //str = sender.first_name || sender.last_name || sender.username;\n senderBold.append(new PeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true,\n }).element);\n }\n\n senderBold.append(': ');\n //console.log(sender, senderBold.innerText);\n dom.lastMessageSpan.prepend(senderBold);\n } //////// else console.log('no sender', lastMessage, peerId);\n }\n }\n\n if(!lastMessage.deleted || draftMessage/* && lastMessage._ !== 'draftMessage' */) {\n const date = draftMessage ? Math.max(draftMessage.date, lastMessage.date || 0) : lastMessage.date;\n replaceContent(dom.lastTimeSpan, formatDateAccordingToTodayNew(new Date(date * 1000)));\n } else dom.lastTimeSpan.textContent = '';\n\n if(setUnread !== null) {\n if(setUnread) {\n this.setUnreadMessages(dialog, dom, isBatch);\n } else { // means search\n dom.listEl.dataset.mid = lastMessage.mid;\n }\n }\n }\n\n private setUnreadMessages(dialog: Dialog, dom = this.getDialogDom(dialog.peerId), isBatch = false) {\n if(!dom) {\n //this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n if(!isBatch) {\n const isMuted = appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n const wasMuted = dom.listEl.classList.contains('is-muted');\n if(isMuted !== wasMuted) {\n SetTransition(dom.listEl, 'is-muted', isMuted, 200);\n }\n }\n\n let setStatusMessage: MyMessage;\n if(dialog.draft?._ !== 'draftMessage') {\n const lastMessage: MyMessage = appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!lastMessage.deleted && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n }\n\n setSendingStatus(dom.statusSpan, setStatusMessage, true);\n\n const filter = appMessagesManager.filtersStorage.getFilter(this.filterId);\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(dialog.peerId) !== -1;\n } else {\n isPinned = !!dialog.pFlags.pinned;\n }\n\n const isDialogUnread = appMessagesManager.isDialogUnread(dialog);\n const hasUnreadBadge = isPinned || isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n const isUnreadBadgeMounted = isInDOM(dom.unreadBadge);\n if(hasUnreadBadge && !isUnreadBadgeMounted) {\n dom.subtitleEl.append(dom.unreadBadge);\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionBadgeMounted = dom.mentionsBadge && isInDOM(dom.mentionsBadge);\n if(hasMentionsBadge) {\n if(!dom.mentionsBadge) {\n dom.mentionsBadge = document.createElement('div');\n dom.mentionsBadge.className = 'dialog-subtitle-badge badge badge-24 mention mention-badge';\n dom.mentionsBadge.innerText = '@';\n dom.subtitleEl.insertBefore(dom.mentionsBadge, dom.lastMessageSpan.nextSibling);\n }\n }\n\n const transitionDuration = isBatch ? 0 : 200;\n\n SetTransition(dom.unreadBadge, 'is-visible', hasUnreadBadge, transitionDuration, hasUnreadBadge ? undefined : () => {\n dom.unreadBadge.remove();\n }, !isUnreadBadgeMounted ? 2 : 0);\n\n if(dom.mentionsBadge) {\n SetTransition(dom.mentionsBadge, 'is-visible', hasMentionsBadge, transitionDuration, hasMentionsBadge ? undefined : () => {\n dom.mentionsBadge.remove();\n delete dom.mentionsBadge;\n }, !isMentionBadgeMounted ? 2 : 0);\n }\n\n if(!hasUnreadBadge) {\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false;\n if(dialog.unread_mentions_count && dialog.unread_count === 1) {\n dom.unreadBadge.innerText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n //dom.unreadMessagesSpan.innerText = '' + (dialog.unread_count ? formatNumber(dialog.unread_count, 1) : ' ');\n dom.unreadBadge.innerText = '' + (dialog.unread_count || ' ');\n } else {\n dom.unreadBadge.innerText = '';\n isUnread = false;\n }\n\n dom.unreadBadge.classList.toggle('unread', isUnread);\n dom.unreadBadge.classList.toggle('mention', isMention);\n }\n\n private getDialogDom(peerId: PeerId) {\n // return this.doms[peerId];\n const element = this.sortedList.get(peerId);\n return element?.dom;\n }\n\n private getDialog(dialog: Dialog | PeerId): Dialog {\n if(typeof(dialog) !== 'object' && dialog) {\n const originalDialog = appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n return {\n peerId: dialog,\n peer: appPeersManager.getOutputPeer(dialog),\n pFlags: {}\n } as any;\n }\n\n return originalDialog;\n }\n \n return dialog as Dialog;\n }\n\n private setCallStatus(dom: DialogDom, visible: boolean) {\n let {callIcon, listEl} = dom;\n if(!callIcon && visible) {\n const {canvas, startAnimation} = dom.callIcon = callIcon = groupCallActiveIcon(listEl.classList.contains('active'));\n canvas.classList.add('dialog-group-call-icon');\n listEl.append(canvas);\n startAnimation();\n }\n\n if(!callIcon) {\n return;\n }\n\n SetTransition(dom.callIcon.canvas, 'is-visible', visible, 200, visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n }, visible ? 2 : 0);\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n const dialog = this.getDialog(options.dialog);\n\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const {peerId} = dialog;\n const isMuted = appNotificationsManager.isPeerLocalMuted(peerId, true);\n if(isMuted) {\n ret.dom.listEl.classList.add('is-muted');\n }\n\n if(!peerId.isUser()) {\n this.processDialogForCallStatus(dialog, ret.dom);\n }\n\n this.setLastMessage(dialog, undefined, ret.dom, undefined, options.loadPromises, options.isBatch, true);\n }\n\n return ret;\n }\n\n private processDialogForCallStatus(dialog: Dialog, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(dialog.peerId);\n if(!dom) return;\n \n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(dialog.peerId.toChatId());\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n public addDialogNew(options: {\n dialog: Parameters[0],\n container?: Parameters[1],\n drawStatus?: boolean,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n append?: boolean,\n avatarSize?: number,\n autonomous?: boolean,\n lazyLoadQueue?: LazyLoadQueueIntersector,\n loadPromises?: Promise[]\n }) {\n return this.addDialog(options.dialog, options.container, options.drawStatus, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises);\n }\n\n public addDialog(_dialog: Parameters[0], \n container?: HTMLElement | Scrollable | DocumentFragment | false, \n drawStatus = true, \n rippleEnabled = true, \n onlyFirstName = false, \n meAsSaved = true, \n append = true, \n avatarSize = 54, \n autonomous = !!container, \n lazyLoadQueue?: LazyLoadQueueIntersector,\n loadPromises?: Promise[]) {\n const dialog = this.getDialog(_dialog);\n const peerId = dialog.peerId;\n\n const avatarEl = new AvatarElement();\n avatarEl.loadPromises = loadPromises;\n avatarEl.lazyLoadQueue = lazyLoadQueue;\n avatarEl.setAttribute('dialog', meAsSaved ? '1' : '0');\n avatarEl.setAttribute('peer', '' + peerId);\n avatarEl.classList.add('dialog-avatar', 'avatar-' + avatarSize);\n\n if(drawStatus && peerId !== rootScope.myId && peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n if(user.status?._ === 'userStatusOnline') {\n this.setOnlineStatus(avatarEl, true);\n }\n }\n\n const captionDiv = document.createElement('div');\n captionDiv.classList.add('user-caption');\n\n const titleSpanContainer = document.createElement('span');\n titleSpanContainer.classList.add('user-title');\n\n const peerTitle = new PeerTitle({\n peerId,\n dialog: meAsSaved,\n onlyFirstName,\n plainText: false\n });\n\n titleSpanContainer.append(peerTitle.element);\n //p.classList.add('')\n\n // в других случаях иконка верификации не нужна (а первый - это главные чатлисты)\n //if(!container) {\n \n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n \n const peer = appPeersManager.getPeer(peerId);\n if(peer?.pFlags?.verified) {\n titleSpanContainer.append(generateVerifiedIcon());\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('li');\n li.classList.add('chatlist-chat');\n if(rippleEnabled) {\n ripple(li);\n }\n\n li.append(avatarEl, captionDiv);\n li.dataset.peerId = '' + peerId;\n\n const statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status', 'sending-status'/* , 'transition', 'reveal' */);\n\n const lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n\n const unreadBadge = document.createElement('div');\n unreadBadge.className = 'dialog-subtitle-badge badge badge-24';\n\n const titleP = document.createElement('p');\n titleP.classList.add('dialog-title');\n\n const rightSpan = document.createElement('span');\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n titleP.append(titleSpanContainer, rightSpan);\n\n const subtitleEl = document.createElement('p');\n subtitleEl.classList.add('dialog-subtitle');\n subtitleEl.append(span);\n\n captionDiv.append(titleP, subtitleEl);\n\n const dom: DialogDom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n unreadBadge,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl\n };\n\n /* let good = false;\n for(const folderId in this.chatLists) {\n if(this.chatLists[folderId] === container) {\n good = true;\n }\n } */\n if(container) {\n const method = append ? 'append' : 'prepend';\n container[method](li);\n }\n\n if(!autonomous) {\n // @ts-ignore\n li.dialogDom = dom;\n\n if(appImManager.chat?.peerId === peerId) {\n this.setDialogActive(li, true);\n }\n } \n \n return {dom, dialog};\n }\n\n public setTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n let typingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n if(typingElement) {\n appImManager.getPeerTyping(dialog.peerId, typingElement);\n } else {\n typingElement = appImManager.getPeerTyping(dialog.peerId);\n replaceContent(dom.lastMessageSpan, typingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n dom.lastMessageSpan.classList.remove('user-typing');\n this.setLastMessage(dialog, null, dom, undefined, undefined, undefined, null);\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");e||(e={}),this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case\"ready\":t();break;case\"page\":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case\"done\":this.encoder.removeEventListener(\"message\",i),this.finish()}};this.encoder.addEventListener(\"message\",i),this.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if(\"recording\"===this.state){if(this.state=\"paused\",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{\"flushed\"===o.data.message&&(t.removeEventListener(\"message\",i),this.onpause(),e())};t.addEventListener(\"message\",i),t.postMessage({command:\"flush\"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if(\"inactive\"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state=\"recording\",this.onstart(),this.encoder.postMessage({command:\"getHeaderPages\"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if(\"inactive\"!==this.state){this.state=\"inactive\",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{\"done\"===i.data.message&&(e.removeEventListener(\"message\",o),t())};e.addEventListener(\"message\",o),e.postMessage({command:\"done\"}),this.config.reuseWorker||e.postMessage({command:\"close\"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){\"inactive\"===this.state&&this.encoder&&(this.encoder.postMessage({command:\"close\"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.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 elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.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(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nconst Button = (className: string, options: 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 const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\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' | 'global-search' | 'voice',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n 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","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } 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 promise = isInDOM(element) ? this.mutate() : Promise.resolve();\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 private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n /* input.readOnly = true;\r\n\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true}); */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/14.97bef6a6862c0bc097eb.chunk.js b/public/14.97bef6a6862c0bc097eb.chunk.js deleted file mode 100644 index fb66fd0a1..000000000 --- a/public/14.97bef6a6862c0bc097eb.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[14],{101:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(51);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=i.b.loadAnimationFromURL({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"assets/img/TwoFactorSetupMonkeyPeek.tgs").then(e=>(this.animation=e,this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},i.b.waitForFirstFrame(e)))}remove(){this.animation&&this.animation.remove()}}},109:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(51);class n{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const s=e.input;s.addEventListener("blur",()=>{this.playAnimation(0)}),s.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const s=this.needFrame>t?-1:1;this.animation.setDirection(s),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.b.loadAnimationFromURL({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"assets/img/TwoFactorSetupMonkeyIdle.tgs").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.b.waitForFirstFrame(e))),i.b.loadAnimationFromURL({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"assets/img/TwoFactorSetupMonkeyTracking.tgs").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.b.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},110:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(38);class n extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let s=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===s)return;s=n})}}},142:function(e,t,s){"use strict";s.r(t),s.d(t,"AppDialogsManager",(function(){return No}));var i=s(39),n=s(70),a=s(15),o=s(42),r=s(50),l=s(30),c=s(5),d=s(114),h=s(141),u=s(145);const p=[...h.a].concat([...u.a]);var m=new Set(p);function g(e,t){e.setAttribute("dir","auto"),e.innerHTML=t}var b=s(37),v=s(102),f=s(44);function y(e){Object(f.d)(e.history,(t,s,i)=>{t.action.photo||(i.splice(s,1),void 0!==e.count&&--e.count)})}var w=s(34);class S{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,Object(w.g)(this,e)}setTargets(e,t,s){this.previous=e,this.next=t,this.reverse=s}get index(){return void 0!==this.count?this.previous.length:-1}reset(e=!1){this.current=void 0,this.previous=[],this.next=[],this.loadedAllUp=this.loadedAllDown=e,this.loadPromiseUp=this.loadPromiseDown=null}go(e,t=!0){let s,i;if(e>0){if(s=this.next.splice(0,e),i=s.pop(),!i)return;this.previous.push(this.current,...s)}else{if(s=this.previous.splice(this.previous.length+e,-e),i=s.shift(),!i)return;this.next.unshift(...s,this.current)}return this.next.length0),this.current}load(e){if(e&&this.loadedAllDown)return Promise.resolve();if(!e&&this.loadedAllUp)return Promise.resolve();if(e&&this.loadPromiseDown)return this.loadPromiseDown;if(!e&&this.loadPromiseUp)return this.loadPromiseUp;let t;t=e?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0];const s=this.loadMore(t,e,this.loadCount).then(t=>{if(e&&this.loadPromiseDown!==s||!e&&this.loadPromiseUp!==s)return;t.items.length{const s=this.processItem?this.processItem(t):t;s&&(e?this.reverse?this.previous.unshift(s):this.next.push(s):this.reverse?this.next.push(s):this.previous.unshift(s))}),this.onLoadedMore&&this.onLoadedMore()},()=>{}).then(()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null});return e?this.loadPromiseDown=s:this.loadPromiseUp=s,s}}class L extends S{constructor(e={}){super(Object.assign(Object.assign({},e),{loadMore:(e,t,s)=>{var n;const a=t?0:s;let o=null===(n=this.current)||void 0===n?void 0:n.mid;return e&&(o=e.mid),t||(o=v.a.incrementMessageId(o,1)),i.a.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:o,limit:a?0:s,backLimit:a})).then(e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&y(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history}))},processItem:t=>{if(this.filterMids([t.mid]).length)return e.processItem(t)}})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const s=s=>s.peerId===e&&t.has(s.mid),i=(e,t,i)=>{s(e)&&i.splice(t,1)};Object(f.d)(this.previous,i),Object(f.d)(this.next,i),this.current&&s(this.current)&&this.onEmptied&&this.onEmptied()},this.onHistoryMultiappend=e=>{if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;const t=e[this.searchContext.peerId];if(!t)return;const s=Array.from(t).sort((e,t)=>e-t),i=this.filterMids(s).map(e=>this.processItem(e)).filter(Boolean);i.length&&this.next.push(...i)},this.onMessageSent=({message:e})=>{this.onHistoryMultiappend({[e.peerId]:new Set([e.mid])})},a.default.addEventListener("history_delete",this.onHistoryDelete),a.default.addEventListener("history_multiappend",this.onHistoryMultiappend),a.default.addEventListener("message_sent",this.onMessageSent)}filterMids(e){const t=this.searchContext.isScheduled?i.a.getScheduledMessagesStorage(this.searchContext.peerId):i.a.getMessagesStorage(this.searchContext.peerId);return i.a.filterMessagesByInputFilter(this.searchContext.inputFilter._,e,t,e.length)}setSearchContext(e){this.searchContext=e,void 0!==this.searchContext.folderId&&(this.loadedAllUp=!0,void 0===this.searchContext.nextRate&&(this.loadedAllDown=!0)),"inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(this.loadedAllUp=!0),this.searchContext.useSearch||(this.loadedAllDown=this.loadedAllUp=!0)}reset(){super.reset(),this.searchContext=void 0}cleanup(){this.reset(),a.default.removeEventListener("history_delete",this.onHistoryDelete),a.default.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.default.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0}}var E=s(64),I=s(72),M=s(63),C=s(17),k=s(40),P=s(49),T=s(36),x=s(16);class A{constructor(e,t,s=!0,i,n=!0,a=!0,o){this.name=e,this.type=t,this.clearable=s,this.autonomous=a,this.onFound=o,this.list=Vo.createChatList(),this.container=document.createElement("div"),i&&(this.container.className=i),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append(Object(x.i18n)(e)),this.container.append(this.nameEl)),this.container.classList.add("search-group","search-group-"+t),this.container.append(this.list),this.container.style.display="none",n&&Vo.setListClickListener(this.list,o,void 0,a)}clear(){this.container.style.display="none",this.clearable&&(this.list.innerHTML="")}setActive(){this.container.style.display=""}toggle(){this.list.childElementCount?this.setActive():this.clear()}}class O{constructor(e,t,s,i){this.container=e,this.searchInput=t,this.searchGroups=s,this.onSearch=i,this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1,this.searchPromise=null,this.searchTimeout=0,this.query="",this.listsContainer=null,this.threadId=0,this.scrollable=new P.b(this.container),this.listsContainer=this.scrollable.container;for(let e in this.searchGroups)this.listsContainer.append(this.searchGroups[e].container);this.searchGroups.messages&&this.scrollable.setVirtualContainer(this.searchGroups.messages.list),this.searchInput.onChange=e=>{this.query=e,this.reset(!1),this.searchMore()},this.scrollable.onScrolledBottom=()=>{this.query.trim()&&(this.searchTimeout||(this.searchTimeout=window.setTimeout(()=>{this.searchMore(),this.searchTimeout=0},0)))}}reset(e=!0){e&&(this.searchInput.value="",this.query="",this.peerId=void 0,this.threadId=0),this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1;for(let e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,s=""){this.peerId=e,this.threadId=t,this.query!==s&&(this.searchInput.inputField.value=s),this.searchInput.input.focus()}searchMore(){if(this.searchPromise)return this.searchPromise;const e=this.query;if(!e.trim())return void(this.onSearch&&this.onSearch(0));if(-1!==this.foundCount&&this.loadedCount>=this.foundCount)return Promise.resolve();const t=this.minMsgId||0;return this.searchPromise=i.a.getSearch({peerId:this.peerId,query:e,inputFilter:{_:"inputMessagesFilterEmpty"},maxId:t,limit:20,threadId:this.threadId}).then(t=>{if(this.searchPromise=null,this.searchInput.value!==e)return;const{count:s,history:i}=t;i.length&&i[0].mid===this.minMsgId&&i.shift();const n=this.searchGroups.messages;i.forEach(t=>{const s=this.peerId?t.fromId:t.peerId,{dialog:i,dom:n}=Vo.addDialogNew({dialog:s,container:this.scrollable,drawStatus:!1,avatarSize:54,meAsSaved:!1});t.peerId!==s&&(n.listEl.dataset.peerId=""+t.peerId),Vo.setLastMessage(i,t,n,e)}),n.toggle(),this.minMsgId=i.length&&i[i.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=i.length,-1===this.foundCount&&(this.foundCount=s,n.nameEl&&Object(T.a)(n.nameEl,Object(x.i18n)(s?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[s])),this.onSearch&&this.onSearch(this.foundCount))}).catch(e=>{console.error("search error",e),this.searchPromise=null})}}var F=s(38);class _{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;let e=this.value;e!==this.prevValue&&(this.prevValue=e,clearTimeout(this.timeout),this.timeout=window.setTimeout(()=>{this.onChange(e)},200))},this.onClearClick=()=>{this.value="",this.onChange&&this.onChange(""),this.onClear&&this.onClear()},this.inputField=new F.b({placeholder:e,plainText:!0}),this.container=this.inputField.container,this.container.classList.remove("input-field"),this.container.classList.add("input-search"),this.onChange=t,this.input=this.inputField.input,this.input.classList.add("input-search-input");const s=document.createElement("i");s.classList.add("tgico","tgico-search"),this.clearBtn=document.createElement("i"),this.clearBtn.classList.add("tgico","btn-icon","tgico-close"),this.input.addEventListener("input",this.onInput),this.clearBtn.addEventListener("click",this.onClearClick),this.container.append(s,this.clearBtn)}get value(){return this.inputField.value}set value(e){this.prevValue=e,clearTimeout(this.timeout),this.inputField.value=e}remove(){clearTimeout(this.timeout),this.input.removeEventListener("input",this.onInput),this.clearBtn.removeEventListener("click",this.onClearClick)}}var j=s(120),D=s(48),B=s(56),R=s(90),U=s(33);var H=(e,t={})=>Object(U.a)("btn-icon",Object.assign({icon:e||void 0},t)),N=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class z{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=H("left sidebar-close-button",{noRipple:!0}),this.title=document.createElement("div"),this.title.classList.add("sidebar-header__title"),this.header.append(this.closeBtn,this.title),this.content=document.createElement("div"),this.content.classList.add("sidebar-content"),this.scrollable=new P.b(this.content,void 0,void 0,!0),this.container.append(this.header,this.content),this.slider.addTab(this),this.listenerSetter=new R.a}close(){return this.slider.closeTab(this)}open(...e){return N(this,void 0,void 0,(function*(){if(this.init)try{const e=this.init();this.init=null,e instanceof Promise&&(yield e)}catch(e){console.error("open tab error",e)}return this.slider.selectTab(this)}))}init(){}onCloseAfterTimeout(){this.destroyable&&(this.slider.tabs.delete(this),this.container.remove()),this.listenerSetter&&this.listenerSetter.removeAll()}setTitle(e){this.title.innerHTML="",this.title.append(Object(x.i18n)(e))}}class V extends z{constructor(e){super(e),this.eventListener=new B.a}onCloseAfterTimeout(){return this.eventListener.dispatchEvent("destroy"),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}class W{constructor(e){this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{D.a.findItemByType(this.navigationType)?D.a.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,s)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return!1;const i=this.historyTabIds.pop();this.onCloseTab(i,t,s);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof z?n.container:n:this.canHideFirst?-1:0,t),!0},Object(w.g)(this,e),this.tabs||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=Object(j.a)(this.tabsContainer,"navigation",250),this.canHideFirst||this._selectTab(0),Array.from(this.sidebarEl.querySelectorAll(".sidebar-close-button")).forEach(e=>{Object(l.b)(e,this.onCloseBtnClick)})}selectTab(e){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const t=e instanceof z?e:this.tabs.get(e);return t&&(t.onOpen&&t.onOpen(),t.onOpenAfterTimeout&&setTimeout(()=>{t.onOpenAfterTimeout()},250)),D.a.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof z?e.container:e),!0}removeTabFromHistory(e){Object(f.e)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let s=this.historyTabIds.length-1;s>=0;--s){const i=this.historyTabIds[s];if(i!==t){if(i instanceof e)break;this.removeTabFromHistory(i)}}}getTab(e){return this.historyTabIds.find(t=>t instanceof e)}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,s){s||D.a.removeByType(this.navigationType,!0);const i=e instanceof z?e:this.tabs.get(e);i&&(i.onClose&&i.onClose(),i.onCloseAfterTimeout&&setTimeout(()=>{i.onCloseAfterTimeout()},250))}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}}var K=s(47),G=s(134);class q{constructor(e){this.container=document.createElement("div"),this.container.classList.add("avatar-edit"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("avatar-edit-canvas"),this.icon=document.createElement("span"),this.icon.classList.add("tgico","tgico-cameraadd"),this.container.append(this.canvas,this.icon),this.container.addEventListener("click",()=>{(new G.a).open(this.canvas,e)})}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}var Q=(e={})=>Object(U.a)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e);class $ extends z{constructor(){super(...arguments),this.searchGroup=new A(!0,"contacts",!0,"new-group-members disable-hover",!1),this.uploadAvatar=null}init(){this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new q(e=>{this.uploadAvatar=e});const e=document.createElement("div");e.classList.add("input-wrapper"),this.groupNameInputField=new F.b({label:"CreateGroup.NameHolder",maxLength:128}),e.append(this.groupNameInputField.container),this.groupNameInputField.input.addEventListener("input",()=>{const e=this.groupNameInputField.value;this.nextBtn.classList.toggle("is-visible",!!e.length&&!this.groupNameInputField.input.classList.contains("error"))}),this.nextBtn=Q({icon:"arrow_next"}),this.nextBtn.addEventListener("click",()=>{const e=this.groupNameInputField.value;this.nextBtn.disabled=!0,K.a.createChat(e,this.peerIds.map(e=>e.toUserId())).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{K.a.editPhoto(e,t)}),un.removeTabFromHistory(this),un.selectTab(0)})});const t=document.createElement("div");t.classList.add("chatlist-container"),t.append(this.searchGroup.container),this.content.append(this.nextBtn),this.scrollable.append(this.avatarEdit.container,e,t)}onCloseAfterTimeout(){this.searchGroup.clear(),this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.nextBtn.disabled=!1}open(e){const t=super.open();return t.then(()=>{this.peerIds=e,this.peerIds.forEach(e=>{let{dom:t}=Vo.addDialogNew({dialog:e,container:this.searchGroup.list,drawStatus:!1,rippleEnabled:!1,avatarSize:48});t.lastMessageSpan.append(k.a.getUserStatusString(e))}),this.searchGroup.nameEl.textContent="",this.searchGroup.nameEl.append(Object(x.i18n)("Members",[this.peerIds.length])),this.searchGroup.setActive()}),t}}var Y=s(77),X=s(43),J=s(31),Z=s(119),ee=s(74),te=s(35),se=s(18),ie=s(91),ne=s(86),ae=s(45),oe=s(55),re=s(0),le=s(51),ce=s(143),de=s(29),he=s(73),ue=s(52),pe=s(1),me=s(104),ge=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const be=(()=>{try{return re.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})();const ve=new class{constructor(){if(this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this._volume=1,this._muted=!1,this._playbackRate=1,this.seekBackward=e=>{const t=this.playingMedia;t&&(t.currentTime=Math.max(0,t.currentTime-(e.seekOffset||10)))},this.seekForward=e=>{const t=this.playingMedia;t&&(t.currentTime=Math.min(t.duration,t.currentTime+(e.seekOffset||10)))},this.seekTo=e=>{const t=this.playingMedia;t&&(t.currentTime=e.seekTime)},this.onMediaDocumentLoad=e=>{const t=this.mediaDetails.get(e),s=E.a.getDoc(t.docId);"audio"===s.type&&s.supportsStreaming&&be&&this.handleSafariStreamable(e);const i=he.a.getCacheContext(s);e.src=i.url;const n=this.waitingDocumentsForLoad[s.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[s.id])},this.onPlay=e=>{const t=e.target,s=this.mediaDetails.get(t),{peerId:n,mid:o}=s,r=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop();const e=e=>e.mid===o&&e.peerId===n;if(!this.listLoader.current||!e(this.listLoader.current)){let t,s=this.listLoader.previous.findIndex(e);-1!==s?t=-(this.listLoader.previous.length-s):(s=this.listLoader.next.findIndex(e),-1!==s&&(t=s+1)),-1!==s?t&&this.listLoader.go(t,!1):this.setTargets({peerId:n,mid:o})}this.setMedia(t,r)}setTimeout(()=>{a.default.dispatchEvent("media_play",{doc:i.a.getMediaFromMessage(r),message:r,media:t})},0)},this.onPause=e=>{a.default.dispatchEvent("media_pause")},this.onEnded=e=>{e.isTrusted&&(this.onPause(e),this.next()||(this.stop(),a.default.dispatchEvent("media_stop")))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=()=>{const e=this.playingMedia;if(!e)return!1;e.paused||e.pause(),e.currentTime=0,Object(ue.a)(e,"ended");const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const s=t.peerId,i=t.isScheduled?this.scheduled:this.media,n=i.get(s);n&&(n.delete(t.mid),n.size||i.delete(s)),e.remove(),this.mediaDetails.delete(e)}return this.playingMedia=void 0,!0},this.playItem=e=>{const{peerId:t,mid:s}=e,i=this.searchContext.isScheduled;this.getMedia(t,s,i).play(),setTimeout(()=>{this.resolveWaitingForLoadMedia(t,s,i)},0)},this.next=()=>!this.lockedSwitchers&&this.listLoader.go(1),this.previous=()=>{const e=this.playingMedia;return e&&(e.currentTime>5||!this.listLoader.previous.length)?(e.currentTime=0,void this.toggle(!0)):!this.lockedSwitchers&&this.listLoader.go(-1)},this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const e={play:this.play,pause:this.pause,stop:this.stop,seekbackward:this.seekBackward,seekforward:this.seekForward,seekto:this.seekTo,previoustrack:this.previous,nexttrack:this.next};for(const t in e)try{navigator.mediaSession.setActionHandler(t,e[t])}catch(e){console.warn("MediaSession action is not supported:",t)}}a.default.addEventListener("document_downloaded",e=>{const t=this.waitingDocumentsForLoad[e.id];if(t)for(const e of t)this.onMediaDocumentLoad(e)});const e={};["volume","muted","playbackRate"].forEach(t=>{const s="_"+t;e[t]={get:()=>this[s],set:e=>{this[s]!==e&&(this[s]=e,this.playingMedia&&(this.playingMedia[t]=e),this.dispatchPlaybackParams())}}}),Object.defineProperties(this,e)}dispatchPlaybackParams(){const{volume:e,muted:t,playbackRate:s}=this;a.default.dispatchEvent("media_playback_params",{volume:e,muted:t,playbackRate:s})}addMedia(e,t,s){const{peerId:n,mid:o}=e,r=!!e.pFlags.is_scheduled?this.scheduled:this.media;let l=r.get(e.peerId);l||r.set(e.peerId,l=new Map);let c=l.get(o);if(c)return c;const d=i.a.getMediaFromMessage(e);l.set(o,c=document.createElement("round"===d.type||"video"===d.type?"video":"audio")),"round"===d.type&&c.setAttribute("playsinline","true");const h={peerId:n,mid:o,docId:d.id,clean:s,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(c,h),c.volume=1,this.container.append(c),c.addEventListener("play",this.onPlay),c.addEventListener("pause",this.onPause),c.addEventListener("ended",this.onEnded),"audio"!==d.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==a.default.myId&&c.addEventListener("timeupdate",()=>{i.a.readMessages(n,[o])},{once:!0});const u=Object(ae.a)();if(t)u.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let s=t.get(n);s||t.set(n,s=new Map),s.set(o,u)}return u.then(()=>{const e=he.a.getCacheContext(d);if(d.supportsStreaming||e.url)this.onMediaDocumentLoad(c);else{let e=this.waitingDocumentsForLoad[d.id];e||(e=this.waitingDocumentsForLoad[d.id]=new Set),e.add(c),E.a.downloadDoc(d)}}),c}getMedia(e,t,s){const i=(s?this.scheduled:this.media).get(e);return null==i?void 0:i.get(t)}handleSafariStreamable(e){e.addEventListener("play",()=>{const t=e.currentTime;e.addEventListener("progress",()=>{e.currentTime=e.duration-1,e.addEventListener("progress",()=>{e.currentTime=t,e.paused||e.play()},{once:!0})},{once:!0})})}resolveWaitingForLoadMedia(e,t,s){const i=s?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=i.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||i.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var s;return ge(this,void 0,void 0,(function*(){yield Object(me.e)(t,void 0,!1);const n=i.a.getMediaFromMessage(e),a=[],l="voice"===n.type||"round"===n.type;let c="",h="";if(null===(s=n.thumbs)||void 0===s?void 0:s.length){const s=n.thumbs[n.thumbs.length-1];if(!s.bytes){const i=he.a.getCacheContext(n,s.type);if(i.url)a.push({src:i.url,sizes:`${s.w}x${s.h}`,type:"image/jpeg"});else{r.a.preloadPhoto(n,s).then(()=>{this.playingMedia===t&&i.url&&this.setNewMediadata(e)})}}}else if(l){const s=e.fromId||e.peerId,i=o.a.getPeerPhoto(s);if(i){const n=d.a.loadAvatar(s,i,"photo_small");if(n.cached){const e=yield n.loadPromise;a.push({src:e,sizes:"160x160",type:"image/jpeg"})}else n.loadPromise.then(s=>{this.playingMedia===t&&s&&this.setNewMediadata(e)})}c=o.a.getPeerTitle(s,!0,!1),h=x.default.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!l){const e=n.attributes.find(e=>"documentAttributeAudio"===e._);c=e&&e.title||n.file_name,h=e&&e.performer}a.length||(re.IS_APPLE?pe.IS_TOUCH_SUPPORTED?a.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):a.push({src:"assets/img/apple-touch-icon.png",sizes:"180x180",type:"image/png"}):[72,96,144,192,256,384,512].forEach(e=>{const t=`${e}x${e}`;a.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})}));const u=new MediaMetadata({title:c,artist:h,artwork:a});navigator.mediaSession.metadata=u}))}getMessageByMedia(e){const t=this.mediaDetails.get(e),{peerId:s,mid:n}=t;return t.isScheduled?i.a.getScheduledMessageByPeer(s,n):i.a.getMessageByPeer(s,n)}toggle(e){return!!this.playingMedia&&(void 0===e&&(e=this.playingMedia.paused),this.playingMedia.paused===e&&(e?this.playingMedia.play():this.playingMedia.pause(),!0))}willBePlayed(e){this.willBePlayedMedia=e}setSearchContext(e){return!Object(w.b)(this.searchContext,e)&&(this.searchContext=Object(w.a)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,s){this.listLoader?this.listLoader.reset():this.listLoader=new L({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{a.default.dispatchEvent("media_stop"),this.stop()}});const i=void 0===this.searchContext.folderId;t?this.listLoader.setTargets(t,s,i):this.listLoader.reverse=i,this.listLoader.setSearchContext(this.searchContext),this.listLoader.current=e,this.listLoader.load(!0),this.listLoader.load(!1)}setMedia(e,t){this.playingMedia=e,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const s=this.playingMedia,i=this.pause();return this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),()=>{this.toggleSwitchers(!0),s&&(this.mediaDetails.get(s)?this.setMedia(s,this.getMessageByMedia(s)):this.next()||this.previous()),e&&this.playingMedia===e&&this.stop(),i&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}};de.a.appMediaPlaybackController=ve;var fe=ve,ye=s(103);function we(e,t,s,i){const n=e=>{s({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),i&&i({x:t.pageX,y:t.pageY,event:t})},o=s=>{0===s.button?(t({x:s.pageX,y:s.pageY,event:s}),n(s),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a,{once:!0})):e.addEventListener("mousedown",o,{once:!0})};e.addEventListener("mousedown",o,{once:!0});const r=e=>{e.preventDefault(),s({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},l=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",c,{passive:!1,once:!0}),i&&i({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},c=e=>{t({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e}),r(e),document.addEventListener("touchmove",r,{passive:!1}),document.addEventListener("touchend",l,{passive:!1,once:!0})};return e.addEventListener("touchstart",c,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",c),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",l)}}class Se{constructor(e,t=0){this.mousedown=!1,this.events={},this.withTransition=!1,this.useTransform=!1,this.vertical=!1,this.onMouseMove=e=>{this.scrub(e)},this.onMouseDown=e=>{var t;this.rect=this.container.getBoundingClientRect(),this.mousedown=!0,this.scrub(e),this.container.classList.add("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseDown)&&this.events.onMouseDown(e)},this.onMouseUp=e=>{var t;this.mousedown=!1,this.container.classList.remove("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseUp)&&this.events.onMouseUp(e)},this.onInput=()=>{var e;const t=+this.seek.value;this.setFilled(t),(null===(e=this.events)||void 0===e?void 0:e.onScrub)&&this.events.onScrub(t)},Object(w.g)(this,e),this.container=document.createElement("div"),this.container.classList.add("progress-line"),this.useTransform?this.container.classList.add("use-transform"):this.withTransition&&this.container.classList.add("with-transition"),this.filled=document.createElement("div"),this.filled.classList.add("progress-line__filled");const s=this.seek=document.createElement("input");s.classList.add("progress-line__seek"),s.type="range",s.step=""+this.step,s.min=""+this.min,s.max=""+this.max,s.value=""+t,t&&this.setProgress(t);const i=""+this.step,n=i.indexOf(".");this.decimals=-1===n?0:i.length-n-1,this.container.append(this.filled,s)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=we(this.container,this.onMouseDown,this.onMouseMove,this.onMouseUp)}setProgress(e){this.seek.value=""+e,this.setFilled(+this.seek.value)}addProgress(e){this.seek.value=""+(+this.seek.value+e),this.setFilled(+this.seek.value)}setFilled(e){let t=(e-this.min)/(this.max-this.min);t=Object(M.a)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const s=this.vertical?this.rect.height:this.rect.width,i=Object(M.a)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,s);let n=this.min+i/s*(this.max-this.min);return n-this.min<(this.max-this.min)/2&&(n-=this.step/10),n=+n.toFixed(this.decimals),n=Object(M.a)(n,this.min,this.max),this.setProgress(n),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(n),n}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}const Le=e=>{if(e.element)return e.element;const{icon:t,text:s,onClick:i,checkboxField:n,noCheckboxClickListener:a}=e,o=document.createElement("div");o.className="btn-menu-item"+(t?" tgico-"+t:""),Object(se.ripple)(o);let r=e.textElement;r||(r=e.textElement=s?Object(x.i18n)(s):document.createElement("span"),e.regularText&&(r.innerHTML=e.regularText)),r.classList.add("btn-menu-item-text"),o.append(r);const d=!!n||!!e.keepOpen;return Object(l.b)(o,e=>{Object(c.a)(e);!1!==i(e)&&(d||Object(te.c)(),n&&!a&&(n.checked="radio"===n.input.type||!n.checked))},e.options),n&&o.append(n.label),e.element=o};var Ee=(e,t)=>{const s=document.createElement("div");s.classList.add("btn-menu"),t&&e.forEach(e=>{e.options?e.options.listenerSetter=t:e.options={listenerSetter:t}});const i=e.map(Le);return s.append(...i),s};const Ie=(e,t,s)=>{((null==s?void 0:s.listenerSetter)?s.listenerSetter.add(e):e.addEventListener.bind(e))(l.a,s=>{if(!e.classList.contains("btn-menu-toggle"))return!1;const i=e.querySelector(".btn-menu");Object(c.a)(s),e.classList.contains("menu-open")?Object(te.c)():(t&&t(s),Object(te.d)(i))})};var Me=(e={},t,s,i)=>{e.asDiv=!0;const n=H("more btn-menu-toggle",e),a=Ee(s,e.listenerSetter);return a.classList.add(t),Ie(n,i,e),n.append(a),n},Ce=s(6);class ke extends Se{constructor(e,t,s,i){super({step:1e3/60/1e3,min:0,max:1,withTransition:s,useTransform:i},0),this.progressRAF=0,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{let e=()=>{this.setProgress(),this.progressRAF=this.media.paused?0:window.requestAnimationFrame(e)};this.progressRAF&&window.cancelAnimationFrame(this.progressRAF),this.streamable&&this.setLoadProgress(),this.progressRAF=window.requestAnimationFrame(e)},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e&&this.setMedia(e,t)}setMedia(e,t=!1){this.media&&this.removeListeners(),t&&!this.filledLoad?(this.filledLoad=document.createElement("div"),this.filledLoad.classList.add("progress-line__filled","progress-line__loaded"),this.container.prepend(this.filledLoad)):this.filledLoad&&this.filledLoad.classList.toggle("hide",!t),this.media=e,this.streamable=t,(!e.paused||e.currentTime>0)&&this.onPlay();let s=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{s=!this.media.paused,s&&this.media.pause()},onMouseUp:e=>{s&&this.media.play()}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(fe.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,s=this.media.currentTime;let i=0,n=0;for(let a=0;a=t&&t>=i&&(i=t,n=e.end(a))}const a=this.media.duration?n/this.media.duration:0;this.filledLoad.style.width=100*a+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(fe.isSafariBuffering(this.media))return;const e=this.media.currentTime;super.setProgress(e)}setListeners(){super.setListeners(),this.media.addEventListener("ended",this.onEnded),this.media.addEventListener("play",this.onPlay),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=0)}}class Pe extends Se{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&Object(c.a)(e),fe.muted=!fe.muted},this.setVolume=()=>{const{volume:e,muted:t}=fe;let s;s=!e||t?"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z":e>.5?"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z":e>0&&e<.25?"M7 9v6h4l5 5V4l-5 5H7z":"M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z";try{this.volumeSvg.innerHTML=``}catch(e){}this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);fe.muted=!1,fe.volume=t}}),this.btn=document.createElement("div"),this.btn.classList.add("player-volume"),this.btn.innerHTML='\n \n ',this.btn.classList.add("btn-icon"),this.volumeSvg=this.btn.firstElementChild,this.btn.append(this.container),Object(l.b)(this.volumeSvg,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("media_playback_params",this.setVolume),this.setVolume()}}class Te extends B.a{constructor(e,t=!1,s=!1,i){if(super(!1),this.video=e,this.showControlsTimeout=0,this.hideControls=()=>{clearTimeout(this.showControlsTimeout),this.showControlsTimeout=0;const e=this.wrapper.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.video.paused||!e||this.controlsLocked)return}else if(!e)return;this.dispatchEvent("toggleControls",!1),this.wrapper.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.showControlsTimeout?(clearTimeout(this.showControlsTimeout),this.showControlsTimeout=0):this.wrapper.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.wrapper.classList.add("show-controls")),e&&!this.controlsLocked&&(this.showControlsTimeout=window.setTimeout(this.hideControls,3e3))},this.toggleControls=e=>{const t=this.wrapper.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.onFullScreen=()=>{null!==document.webkitFullscreenElement||this.wrapper.classList.remove("ckin__fullscreen")},this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.listenerSetter=new R.a,e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(i),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new ke(e,s),t.prepend(this.progress.container)}if(t){e.play().catch(t=>{"NotAllowedError"===t.name&&(e.muted=!0,e.autoplay=!0,e.play())}).finally(()=>{this.wrapper.classList.toggle("is-playing",!this.video.paused)})}}stylePlayer(e){const{wrapper:t,video:s,skin:i}=this;t.classList.add(i);const n=this.buildControls();let o;if(t.insertAdjacentHTML("beforeend",n),"default"===i){const e=t.querySelectorAll(".toggle"),i=t.querySelector(".fullscreen"),n=t.querySelector("#time-elapsed");o=t.querySelector("#time-duration"),o.innerHTML=String(0|s.duration).toHHMMSS();const r=new Pe(this.listenerSetter),l=t.querySelector(".left-controls");r.btn.classList.remove("btn-icon"),l.insertBefore(r.btn,n.parentElement),Array.from(e).forEach(e=>{this.listenerSetter.add(e)("click",()=>{this.togglePlay()})}),this.listenerSetter.add(s)("click",()=>{pe.IS_TOUCH_SUPPORTED||this.togglePlay()}),pe.IS_TOUCH_SUPPORTED?this.listenerSetter.add(t)("click",()=>{this.toggleControls()}):(this.listenerSetter.add(this.wrapper)("mousemove",()=>{this.showControls()}),this.listenerSetter.add(this.wrapper)("mouseenter",()=>{this.showControls(!1)}),this.listenerSetter.add(this.wrapper)("mouseleave",e=>{Object(Ce.a)(e.relatedTarget,"media-viewer-caption")?this.showControls(!1):this.hideControls()}),this.listenerSetter.add(document)("keydown",e=>{if(a.default.overlaysActive>1)return;const{key:t,code:s}=e;let n=!0;return"KeyF"===s?this.toggleFullScreen(i):"KeyM"===s?fe.muted=!fe.muted:"Space"===s?this.togglePlay():e.altKey&&"Equal"===s?fe.playbackRate+=.25:e.altKey&&"Minus"===s?fe.playbackRate-=.25:!this.wrapper.classList.contains("ckin__fullscreen")||"ArrowLeft"!==t&&"ArrowRight"!==t?n=!1:"ArrowLeft"===t?fe.seekBackward({action:"seekbackward"}):fe.seekForward({action:"seekforward"}),n?(Object(c.a)(e),!1):void 0})),this.listenerSetter.add(s)("dblclick",()=>{pe.IS_TOUCH_SUPPORTED||this.toggleFullScreen(i)}),this.listenerSetter.add(i)("click",e=>{this.toggleFullScreen(i)}),"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach(e=>{this.listenerSetter.add(t)(e,this.onFullScreen,!1)}),this.listenerSetter.add(s)("timeupdate",()=>{n.innerHTML=String(0|s.currentTime).toHHMMSS()}),this.listenerSetter.add(s)("play",()=>{this.wrapper.classList.add("played")},{once:!0}),this.listenerSetter.add(s)("pause",()=>{this.showControls(!1)})}this.listenerSetter.add(s)("play",()=>{this.wrapper.classList.add("is-playing")}),this.listenerSetter.add(s)("pause",()=>{this.wrapper.classList.remove("is-playing")}),s.duration||e?o.innerHTML=String(Math.round(s.duration||e)).toHHMMSS():Object(me.e)(s).then(()=>{o.innerHTML=String(Math.round(s.duration)).toHHMMSS()})}lockControls(e){this.controlsLocked=e,this.wrapper.classList.toggle("disable-hover",!1===e),this.toggleControls(e)}togglePlay(){this.video[this.video.paused?"play":"pause"]()}buildControls(){const e=this.skin;if("default"===e)return`\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n \n
\n
\n
`}setBtnMenuToggle(){const e=[.25,.5,1,1.25,1.5,2].map(e=>({regularText:1===e?"Normal":""+e,onClick:()=>{this.video.playbackRate=e}})),t=Ee(e),s=this.wrapper.querySelector(".settings");t.classList.add("top-left"),Ie(s),s.append(t)}static isFullScreen(){return!!(document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement)}toggleFullScreen(e){const t=this.wrapper;if(re.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}Te.isFullScreen()?(t.classList.remove("ckin__fullscreen"),document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen(),e.classList.remove("tgico-smallscreen"),e.classList.add("tgico-fullscreen"),e.setAttribute("title","Full Screen")):(t.classList.add("ckin__fullscreen"),t.requestFullscreen?t.requestFullscreen():t.mozRequestFullScreen?t.mozRequestFullScreen():t.webkitRequestFullscreen?t.webkitRequestFullscreen():t.msRequestFullscreen&&t.msRequestFullscreen(),e.classList.remove("tgico-fullscreen"),e.classList.add("tgico-smallscreen"),e.setAttribute("title","Exit Full Screen"))}removeListeners(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners()}}var xe=s(112),Ae=s(99),Oe=s(94),Fe=s(41);function _e(e){return function(e,t){let s,i=!1;return(...n)=>{s=n,i||(i=!0,e(()=>{i=!1,t(...s)}))}}(Fe.b,e)}var je=s(46);function De(e){e.classList.add("is-voice");const t=e.message,s=i.a.getMediaFromMessage(t);t.pFlags.out&&e.classList.add("is-out");const n=b.b.isMobile?16:23,a=b.b.isMobile?152:190,o=b.b.isMobile?190:256,r=s.duration,d=Object(M.a)(r/60*o,a,o),h=document.createElementNS("http://www.w3.org/2000/svg","svg");h.classList.add("audio-waveform"),h.setAttributeNS(null,"width",""+d),h.setAttributeNS(null,"height",""+n),h.setAttributeNS(null,"viewBox",`0 0 ${d} ${n}`);const u=document.createElement("div");u.classList.add("audio-time"),e.append(h,u);let p=s.attributes.find(e=>"documentAttributeAudio"===e._).waveform||new Uint8Array([]);p=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let s;try{const i=new DataView(e.buffer);s=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){s=new Uint8Array([])}return s}(p.slice(0,63));const m=Math.max(...p),g=p.length?p.length:100,v=Math.min(d/4|0,g);let f=0;const y=n-4;let w="";for(let e=0,t=0,s=0;e=g){s=s+v-g,s<(v+1)/2&&f\n `,t+=4,f=s<(v+1)/2?0:i}else f{let t=e.audio;const s=()=>{const e=t.currentTime===t.duration?0:Math.ceil(t.currentTime/t.duration*v);S.forEach((t,s)=>t.classList.toggle("active",s0&&t.currentTime!==t.duration)&&s();const i=_e(s);return e.addAudioListener("timeupdate",i),e.addAudioListener("ended",i),e.readyPromise.then(()=>{let e=!1,s=!1;function i(e){let s;if(e instanceof MouseEvent)s=e.offsetX;else{const t=e.target.getBoundingClientRect();s=e.targetTouches[0].pageX-t.left}const i=s/d*t.duration;t.currentTime=i}L.addEventListener("mouseleave",i=>{e&&(t.play(),e=!1),s=!1}),L.addEventListener("mousemove",t=>{s=!0,e&&i(t)}),L.addEventListener("mousedown",s=>{s.preventDefault(),0===s.button&&(t.paused||t.pause(),i(s),e=!0)}),L.addEventListener("mouseup",i=>{s&&e&&(t.play(),e=!1)}),Object(l.b)(L,e=>{Object(c.a)(e),t.paused||i(e)})},Ae.a),()=>{L.remove(),L=null,t=null}}}function Be(e=!0){const t=new ye.a({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}a.default.addEventListener("messages_media_read",({mids:e,peerId:t})=>{e.forEach(e=>{const s=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${s}, .media-round.is-unread${s}`)).forEach(e=>{e.classList.remove("is-unread")})})});const Re=e=>{let t,s;const i=!e.classList.contains("search-super-item"),n=Object(Ce.a)(e,i?"bubbles-inner":"tabs-tab");if(n){const a=':not([data-is-outgoing="1"])',o=".audio:not(.is-voice)"+a;let r;if(r=e.matches(o)?[o]:[".audio.is-voice"+a,".media-round"+a],i){const e=".bubble:not(.webpage) ";r=r.map(t=>e+t)}const l=r.join(", "),c=Array.from(n.querySelectorAll(l)),d=c.indexOf(e),h=c.map(e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid}));t=h.slice(0,d),s=h.slice(d+1)}return[t,s]};class Ue extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new R.a}render(){var e,t;this.classList.add("audio"),this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=i.a.getMediaFromMessage(this.message),n="voice"===s.type,a=!this.voiceAsMusic&&n,o=this.message.pFlags.is_outgoing,r=o&&this.preloader,d=String(0|s.duration).toHHMMSS();this.innerHTML='\n
\n
\n
\n
\n
\n
';const h=this.firstElementChild,u=document.createElement("div");u.classList.add("audio-download");"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),r&&(this.classList.add("is-outgoing"),this.append(u));const p=a?De(this):function(e){const t=e.withTime,s=e.message,n=i.a.getMediaFromMessage(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");if(o.classList.add("audio-description"),!a){const a=[];n.audioPerformer&&a.push(Object(Oe.a)(n.audioPerformer)),t?a.push(Object(oe.d)(s.date)):a.length||a.push(Object(M.b)(n.size)),e.showSender&&a.push(i.a.wrapSenderToPeer(s)),o.append(...Object(x.joinElementsWith)(a," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const r=e.querySelector(".audio-title"),l=new xe.a;l.dataset.fontWeight=e.dataset.fontWeight,a?l.append(i.a.wrapSenderToPeer(s)):l.innerHTML=n.audioTitle||n.fileName,r.append(l),e.showSender&&r.append(i.a.wrapSentTime(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,s=new ke(e.audio,n.supportsStreaming);e.addAudioListener("ended",()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1});const i=()=>{t||(e.classList.add("audio-show-progress"),t=!0,s&&c.lastChild.replaceWith(s.container))};return e.addAudioListener("play",i),(!e.audio.paused||e.audio.currentTime>0)&&i(),()=>{s.removeListeners(),s.container.remove(),s=null}}}(this),m=this.querySelector(".audio-time");m.innerHTML=d;const g=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=fe.addMedia(this.message,e),s=this.readyPromise=Object(ae.a)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?s.resolve():this.addAudioListener("canplay",()=>s.resolve(),{once:!0}),this.onTypeDisconnect=p();const i=()=>String(0|t.currentTime).toHHMMSS()+(a?" / "+d:""),n=()=>{m.innerText=i(),h.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&n();const o=(e,s=t.paused)=>{if(e&&Object(c.a)(e),s){const e=!!this.searchContext;if(fe.setSearchContext(this.searchContext||{peerId:je.b,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,s]=e?Re(this):[];fe.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,s)}t.play().catch(()=>{})}else t.pause()};return Object(l.b)(h,e=>o(e),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",()=>{h.classList.remove("playing"),m.innerText=d}),this.addAudioListener("timeupdate",()=>{!t.currentTime&&t.paused||fe.isSafariBuffering(t)||(m.innerText=i())}),this.addAudioListener("pause",()=>{h.classList.remove("playing")}),this.addAudioListener("play",n),o};if(null===(e=s.thumbs)||void 0===e?void 0:e.length){const e=[],t=ws({photo:s,message:null,container:h,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});h.style.width=h.style.height="",t.images.thumb&&e.push(t.images.thumb),t.images.full&&e.push(t.images.full),this.classList.add("audio-with-thumb"),e.forEach(e=>e.classList.add("audio-thumb"))}if(o)r&&(this.dataset.isOutgoing="1",this.preloader.attach(u,!1));else{let e=this.preloader;g("audio"!==s.type&&!this.noAutoDownload);const i=t=>{if(this.audio.src)return;fe.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(fe.willBePlayed(this.audio),re.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=Be(!1),s=Object(ae.a)();s.notifyAll({done:75,total:100}),s.catch(()=>{this.audio.pause(),fe.willBePlayed(void 0)}),s.cancel=()=>{s.cancel=Ae.a;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(u,!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=Be(),t||(this.readyPromise=Object(ae.a)());const n=()=>{i();const n=E.a.downloadDoc(s);return t||n.then(()=>{this.readyPromise.resolve()}),e.attach(u,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.append(u),this.classList.add("downloading"),this.readyPromise.then(()=>{this.classList.remove("downloading"),u.classList.add("downloaded"),setTimeout(()=>{u.remove()},200),fe.willBePlayedMedia===this.audio&&(this.audio.play(),fe.willBePlayed(void 0))})};(null===(t=this.audio)||void 0===t?void 0:t.src)||("audio"===s.type||this.noAutoDownload?Object(l.b)(h,()=>{i(!0)},{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}):i(!1))}}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter.removeAll(),this.listenerSetter=null,this.preloader=null)}}customElements.define("audio-element",Ue);class He{constructor(e,t){this.className=e,this.fill=t,this.container=document.createElement("div"),this.container.className=e,this.border=document.createElement("div"),this.border.classList.add(e+"-border"),this.content=document.createElement("div"),this.content.classList.add(e+"-content"),this.title=document.createElement("div"),this.title.classList.add(e+"-title"),this.title.setAttribute("dir","auto"),this.subtitle=document.createElement("div"),this.subtitle.classList.add(e+"-subtitle"),this.subtitle.setAttribute("dir","auto"),this.content.append(this.title,this.subtitle),this.container.append(this.border,this.content)}}function Ne(e){var t,s;let{title:n,titleEl:a,subtitle:o,subtitleEl:l,mediaEl:c,message:d,loadPromises:h}=e;void 0!==n&&("string"==typeof n&&(n=Object(Y.f)(n,140),n=J.a.wrapEmojiText(n)),Object(T.a)(a,n)),h||(h=[]);let u=d&&d.media,p=!1,m=!1;const g=c?Array.from(c.children).slice():[];let b;if(u&&c){if(l.textContent="",l.append(i.a.wrapMessageForReply(d,void 0,void 0,void 0,void 0,!0)),u.webpage&&(u=u.webpage),u.photo||u.document&&(null===(t=u.document.thumbs)||void 0===t?void 0:t.length)){b=So.chat.bubbles.getMiddleware();const e=So.chat.bubbles.lazyLoadQueue;if("sticker"===(null===(s=u.document)||void 0===s?void 0:s.type))p=!0,Ls({doc:u.document,div:c,lazyLoadQueue:e,group:fo,width:32,height:32,middleware:b,loadPromises:h});else{const t=u.photo||u.document;m="round"===t.type;try{ws({photo:t,container:c,boxWidth:32,boxHeight:32,size:r.a.choosePhotoSize(t,32,32),middleware:b,lazyLoadQueue:e,noBlur:!0,withoutPreloader:!0,loadPromises:h}),p=!0}catch(e){}}}}else d?(l.textContent="",l.append(i.a.wrapMessageForReply(d,d.message&&Object(Y.f)(d.message,140)))):("string"==typeof o&&(o=Object(Y.f)(o,140),o=J.a.wrapEmojiText(o)),Object(T.a)(l,o||""));return Promise.all(h).then(()=>{b&&!b()||(g.forEach(e=>e.remove()),c&&c.classList.toggle("is-round",m))}),p}class ze extends He{constructor(e){super(e,(e,t="",s)=>{this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const i=Ne({title:e,titleEl:this.title,subtitle:t,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s});this.container.classList.toggle("is-media",i),i?this.content.prepend(this.mediaEl):this.mediaEl.remove()}),this.className=e}}const Ve=0,We=1,Ke=2,Ge=4,qe=8;class Qe{constructor(e,t,s,i,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=s,this.spacing=i,this.maxHeight=n,this.count=e.length,this.ratios=Qe.countRatios(e),this.proportions=Qe.countProportions(this.ratios),this.averageRatio=Object(f.a)(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find(e=>e>2)?new $e(this.ratios,this.averageRatio,this.maxWidth,this.minWidth,this.spacing).layout():2===this.count?this.layoutTwo():3===this.count?this.layoutThree():this.layoutFour():[]}layoutTwo(){return"ww"===this.proportions&&this.averageRatio>1.4*this.maxSizeRatio&&this.ratios[1]-this.ratios[0]<.2?this.layoutTwoTopBottom():"ww"===this.proportions||"qq"===this.proportions?this.layoutTwoLeftRightEqual():this.layoutTwoLeftRight()}layoutThree(){return"n"===this.proportions[0]?this.layoutThreeLeftAndOther():this.layoutThreeTopAndOther()}layoutFour(){return"w"===this.proportions[0]?this.layoutFourTopAndOther():this.layoutFourLeftAndOther()}layoutTwoTopBottom(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],(this.maxHeight-this.spacing)/2)));return[{geometry:{x:0,y:0,width:e,height:t},sides:qe|We|Ke},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:qe|Ge|Ke}]}layoutTwoLeftRightEqual(){const e=(this.maxWidth-this.spacing)/2,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],1*this.maxHeight)));return[{geometry:{x:0,y:0,width:e,height:t},sides:We|qe|Ge},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:We|Ke|Ge}]}layoutTwoLeftRight(){const e=Math.round(1.5*this.minWidth),t=Math.min(Math.round(Math.max(.4*(this.maxWidth-this.spacing),(this.maxWidth-this.spacing)/this.ratios[0]/(1/this.ratios[0]+1/this.ratios[1]))),this.maxWidth-this.spacing-e),s=this.maxWidth-t-this.spacing,i=Math.min(this.maxHeight,Math.round(Math.min(s/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:s,height:i},sides:We|qe|Ge},{geometry:{x:s+this.spacing,y:0,width:t,height:i},sides:We|Ke|Ge}]}layoutThreeLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min((this.maxHeight-this.spacing)/2,this.ratios[1]*(this.maxWidth-this.spacing)/(this.ratios[2]+this.ratios[1]))),s=e-t-this.spacing,i=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],s*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-i);return[{geometry:{x:0,y:0,width:n,height:e},sides:We|qe|Ge},{geometry:{x:n+this.spacing,y:0,width:i,height:s},sides:We|Ke},{geometry:{x:n+this.spacing,y:s+this.spacing,width:i,height:t},sides:Ge|Ke}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),s=(this.maxWidth-this.spacing)/2,i=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(s/this.ratios[1],s/this.ratios[2]))),n=e-s-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:qe|We|Ke},{geometry:{x:0,y:t+this.spacing,width:s,height:i},sides:Ge|qe},{geometry:{x:s+this.spacing,y:t+this.spacing,width:n,height:i},sides:Ge|Ke}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),s=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),i=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),s*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),s*this.ratios[3])),a=e-i-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,s);return[{geometry:{x:0,y:0,width:e,height:t},sides:qe|We|Ke},{geometry:{x:0,y:t+this.spacing,width:i,height:o},sides:Ge|qe},{geometry:{x:i+this.spacing,y:t+this.spacing,width:a,height:o},sides:Ge},{geometry:{x:i+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:Ke|Ge}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),s=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),i=Math.round(s/this.ratios[1]),n=Math.round(s/this.ratios[2]),a=e-i-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,s));return[{geometry:{x:0,y:0,width:t,height:e},sides:We|qe|Ge},{geometry:{x:t+this.spacing,y:0,width:o,height:i},sides:We|Ke},{geometry:{x:t+this.spacing,y:i+this.spacing,width:o,height:n},sides:Ke},{geometry:{x:t+this.spacing,y:i+n+2*this.spacing,width:o,height:a},sides:Ge|Ke}]}static countRatios(e){return e.map(e=>e.w/e.h)}static countProportions(e){return e.map(e=>e>1.2?"w":e<.8?"n":"q").join("")}}class $e{constructor(e,t,s,i,n,a=4*s/3){this.averageRatio=t,this.maxWidth=s,this.minWidth=i,this.spacing=n,this.maxHeight=a,this.ratios=$e.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map(e=>t>1.1?Object(M.a)(e,1,2.75):Object(M.a)(e,.6667,1))}layout(){let e=new Array(this.count),t=[];const s=(e,t)=>{const s=this.ratios.slice(e,e+t),i=Object(f.a)(s,0);return(this.maxWidth-(t-1)*this.spacing)/i},i=e=>{let i=[],n=0;for(let t of e)i.push(s(n,t)),n+=t;t.push({lineCounts:e,heights:i})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||i([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const s=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||s>3||i([e,t,s])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let s=1;s!==this.count-e-t;++s){const n=this.count-e-t-s;e>3||t>3||s>3||n>3||i([e,t,s,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:s}=e,i=s.length,o=Object(f.a)(t,0)+this.spacing*(i-1),r=Math.min(...t),l=(Math.max(...t),r{for(let e=1;e!==i;++e)if(s[e-1]>s[e])return 1.5;return 1})(),d=Math.abs(o-this.maxHeight)*l*c;(!n||d{if(this.uploadAvatar)return!0;let e=0,t=0,s=0;return this.inputFields.forEach(i=>{i.isValid()&&(i.isChanged()&&++e,i.required&&++s),i.required&&++t}),t===s&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},Object(w.g)(this,e),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=Q({icon:"check"}),e.withoutAvatar||(this.avatarElem=document.createElement("avatar-element"),this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.setAttribute("peer",""+this.peerId),e.doNotEditAvatar||(this.avatarEdit=new q(e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()}),this.avatarEdit.container.append(this.avatarElem))),this.inputFields.forEach(e=>{this.listenerSetter.add(e.input)("input",this.handleChange)}),this.handleChange()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this.inputFields.forEach(t=>t.input.toggleAttribute("disabled",e)),this.handleChange()}lockWithPromise(e,t=!1){this.disabled=!0,e.then(()=>{t&&(this.disabled=!1)},()=>{this.disabled=!1})}}function Ze(e,t){const s=document.createElement("form");return e.forEach(e=>{const{container:i,input:n}=e;s.append(i),n.addEventListener("change",e=>{n.checked&&t(n.value,e)})}),s}class et{constructor(e={}){this.freezed=!1,this.container=document.createElement(e.radioField||e.checkboxField?"label":"div"),this.container.classList.add("row"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("row-subtitle"),this.subtitle.setAttribute("dir","auto"),e.subtitle?"string"==typeof e.subtitle?g(this.subtitle,e.subtitle):this.subtitle.append(e.subtitle):e.subtitleLangKey&&this.subtitle.append(Object(x.i18n)(e.subtitleLangKey,e.subtitleLangArgs)),this.container.append(this.subtitle);let t=!!e.havePadding;if(e.radioField||e.checkboxField){if(t=!0,e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label)),e.checkboxField){this.checkboxField=e.checkboxField;const t=e.checkboxField.label.classList.contains("checkbox-field-toggle");t?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):this.container.append(this.checkboxField.label),e.noCheckboxSubtitle||t||this.checkboxField.input.addEventListener("change",()=>{Object(T.a)(this.subtitle,Object(x.i18n)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))})}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;if(e.titleRight?(t=document.createElement("div"),t.classList.add("row-title-row"),this.container.append(t)):t=this.container,this.title=document.createElement("div"),this.title.classList.add("row-title"),this.title.setAttribute("dir","auto"),e.title?this.title.innerHTML=e.title:this.title.append(Object(x.i18n)(e.titleLangKey)),t.append(this.title),e.titleRight){const s=document.createElement("div");s.classList.add("row-title","row-title-right"),"string"==typeof e.titleRight?s.innerHTML=e.titleRight:s.append(e.titleRight),t.append(s)}}e.icon&&(t=!0,this.title.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),t&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&this.container.addEventListener("click",t=>{this.freezed||e.clickable(t)}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||Object(se.ripple)(this.container,void 0,void 0,!0))}}const tt=(e,t)=>Ze(e.map(e=>({container:e.container,input:e.radioField.input})),t);function st(e){navigator.clipboard?navigator.clipboard.writeText(e):function(e){var t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{document.execCommand("copy")}catch(e){}document.body.removeChild(t)}(e)}var it=s(66);class nt{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field");const s=this.input=document.createElement("input");s.type="radio",s.name="input-radio-"+e.name,e.value&&(s.value=e.value,e.stateKey&&(C.default.getState().then(t=>{s.checked=Object(w.d)(t,e.stateKey)===e.value}),s.addEventListener("change",()=>{C.default.setByKey(e.stateKey,e.value)})));const i=this.main=document.createElement("div");i.classList.add("radio-field-main"),e.text?i.innerHTML=e.text:e.langKey&&Object(x._i18n)(i,e.langKey),t.append(s,i)}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}}const at=document.createElement("div");function ot(e){Object(T.a)(at,e),document.body.append(at),at.dataset.timeout&&clearTimeout(+at.dataset.timeout),at.dataset.timeout=""+setTimeout(()=>{at.remove(),delete at.dataset.timeout},3e3)}function rt(e){ot(Object(x.i18n)(e.langPackKey))}function lt(e,t,s=!0,i=!0){let n,a,o,r,l=!1;return(...c)=>(a||(a=new Promise((e,t)=>(o=e,r=t))),n?(clearTimeout(n),l=!0,r(),a=new Promise((e,t)=>(o=e,r=t))):s&&(o(e(...c)),l=!1),n=setTimeout(()=>{!i||s&&!l||o(e(...c)),n=a=o=r=void 0,l=!1},t),a.catch(()=>{}),a)}at.classList.add("toast");var ct=s(32);class dt extends F.b{constructor(e){super(e),this.checkUsernameDebounced=lt(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",()=>{const e=this.getValue();if(e===this.originalValue||!e.length)return this.setState(F.a.Neutral,this.options.label),void(this.options.onChange&&this.options.onChange());J.b.isUsernameValid(e)?this.setState(F.a.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?this.options.onChange&&this.options.onChange():this.checkUsernameDebounced(e)})}getValue(){let e=this.value;return this.options.head&&(e=e.slice(this.options.head.length),this.setValueSilently(this.options.head+e)),e}checkUsername(e){this.checkUsernamePromise||(this.options.peerId?this.checkUsernamePromise=ct.a.invokeApi("channels.checkUsername",{channel:K.a.getChannelInput(this.options.peerId.toChatId()),username:e}):this.checkUsernamePromise=ct.a.invokeApi("account.checkUsername",{username:e}),this.checkUsernamePromise.then(t=>{this.getValue()===e&&(t?this.setState(F.a.Valid,this.options.availableText):this.setError(this.options.takenText))},t=>{if(this.getValue()===e)switch(t.type){case"USERNAME_INVALID":this.setError(this.options.invalidText)}}).then(()=>{this.checkUsernamePromise=void 0,this.options.onChange&&this.options.onChange();const t=this.getValue();t!==e&&this.isValidToChange()&&J.b.isUsernameValid(t)&&this.checkUsername(t)}))}}var ht=s(69),ut=s(53);class pt extends ht.b{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),t.buttons&&Object(ht.a)(t.buttons),Object.assign({overlayClosable:!0},t)),this.className=e,t.peerId){let e=new _o;e.setAttribute("dialog","1"),e.setAttribute("peer",""+t.peerId),e.classList.add("avatar-32"),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append(Object(x.i18n)(t.titleLangKey||"AppName",t.titleLangArgs)):this.title.innerText=t.title||"");const s=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append(Object(x.i18n)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(e.innerHTML=t.description),s.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach(e=>{e.withRipple=!1;const t=new ut.a(e);e.checkboxField=t,s.append(t.label)}),t.buttons.forEach(e=>{if(e.callback){const s=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach(t=>{t.checkboxField.checked&&e.add(t.text)}),s(e)}}})),this.container.insertBefore(s,this.header.nextElementSibling)}}var mt=s(59);class gt extends V{init(){this.container.classList.add("edit-peer-container","group-type-container");const e=K.a.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new ln({name:e?"ChannelType":"GroupType"}),s=Object(it.b)(),i=new et({radioField:new nt({langKey:e?"ChannelPrivate":"MegaPrivate",name:s,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),a=new et({radioField:new nt({langKey:e?"ChannelPublic":"MegaPublic",name:s,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),o=tt([i,a],e=>{const t=[c,u];"public"===e&&t.reverse(),t[0].container.classList.remove("hide"),t[1].container.classList.add("hide"),m()}),r=K.a.getChat(this.chatId);t.content.append(o);const c=new ln({}),d=new et({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{st(this.chatFull.exported_invite.link),ot(x.default.format("LinkCopied",!0))}}),h=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});Object(l.b)(h,()=>{new pt("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=Object(mt.a)([h],!0);n.default.getChatInviteLink(this.chatId,!0).then(t=>{e(),d.title.innerHTML=t})}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()},{listenerSetter:this.listenerSetter}),c.content.append(d.container,h);const u=new ln({caption:e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup",noDelimiter:!0}),p=document.createElement("div");p.classList.add("input-wrapper");const m=()=>{const e=i.radioField.checked&&"t.me/"!==b||g.isValidToChange()&&g.input.classList.contains("valid");v.classList.toggle("is-visible",e)},g=new dt({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:m,peerId:this.chatId.toPeerId(!0),head:"t.me/"}),b="t.me/"+(r.username||"");p.append(g.container),u.content.append(p);const v=Q({icon:"check",className:"is-visible"});this.content.append(v),Object(l.b)(v,()=>{Object(te.g)(v);const e=a.radioField.checked?g.getValue():"";K.a.migrateChat(this.chatId).then(t=>K.a.updateUsername(t,e)).then(()=>{this.close()})},{listenerSetter:this.listenerSetter}),("t.me/"!==b?a:i).radioField.checked=!0,g.setOriginalValue(b),this.scrollable.append(t.container,c.container,u.container)}}var bt=s(61);class vt{constructor(e){this.loading=!1,this.loaded=!1,Object(w.g)(this,e),e.scrollable.onScrolledBottom=()=>{this.load()}}load(){return this.loaded?Promise.resolve():this.loading?this.promise:(this.loading=!0,void(this.promise=this.getPromise().then(e=>{this.loading=!1,this.promise=void 0,e?(this.loaded=!0,this.scrollable.onScrolledBottom=null):this.scrollable.checkForTriggers()},()=>{this.promise=void 0,this.loading=!1})))}}var ft=s(87),yt=s(84),wt=s(54),St=s(97),Lt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Et{constructor(e){this.container=document.createElement("div"),this.list=Vo.createChatList(),this.chatsContainer=document.createElement("div"),this.selected=new Set,this.freezed=!1,this.folderId=0,this.offsetIndex=0,this.query="",this.loadedWhat={},this.renderedPeerIds=new Set,this.peerType=["dialogs"],this.multiSelect=!0,this.rippleEnabled=!0,this.avatarSize=48,this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=null),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(let e in this.tempIds)++this.tempIds[e];this.list=Vo.createChatList(),this.promise=null,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},Object(w.g)(this,e),this.container.classList.add("selector");const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>(this.needSwitchList&&(this.scrollable.splitUp.replaceWith(this.list),this.scrollable.setVirtualContainer(this.list),this.needSwitchList=!1),e=e.filter(e=>{const t=!this.renderedPeerIds.has(e);return t&&this.renderedPeerIds.add(e),t}),this.filterPeerTypeBy&&(e=e.filter(e=>{if(e.isPeerId()){if(!o.a.getPeer(e).deleted)return this.filterPeerTypeBy.find(t=>o.a[t](e))}return!0})),t(e)),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?Object(x._i18n)(this.input,this.placeholder,void 0,"placeholder"):Object(x._i18n)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){let e=document.createElement("div");e.classList.add("selector-search-container"),this.selectedContainer=document.createElement("div"),this.selectedContainer.classList.add("selector-search"),this.selectedContainer.append(this.input),e.append(this.selectedContainer),this.selectedScrollable=new P.b(e);let t=document.createElement("hr");this.selectedContainer.addEventListener("click",e=>{if(this.freezed)return;let t=e.target;if(t=Object(Ce.a)(t,"selector-user"),!t)return;const s=t.dataset.key,i=this.chatsContainer.querySelector('[data-peer-id="'+s+'"]');i?i.click():this.remove(s.toPeerId())}),this.container.append(e,t)}this.chatsContainer.classList.add("chatlist-container"),this.chatsContainer.append(this.list),this.scrollable=new P.b(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),this.chatsContainer.addEventListener("click",e=>{const t=Object(yt.a)(e.target,"data-peer-id");if(Object(c.a)(e),!t)return;if(this.freezed)return;let s=t.dataset.peerId;if(s=s.isPeerId()?s.toPeerId():s,!this.multiSelect)return void this.add(s);this.selected.has(s)?this.remove(s):this.add(s);const i=t.querySelector("input");i.checked=!i.checked});const s=lt(this.onInput,200,!1,!0);this.input.addEventListener("input",s),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout(()=>{let t=this.getMoreResults();e.onFirstRender&&t.then(()=>{e.onFirstRender()})},0)}renderSaved(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!k.a.testSelfSearch(this.query)||this.renderResultsFunc([a.default.myId])}getTempId(e){return void 0===this.tempIds[e]&&(this.tempIds[e]=0),++this.tempIds[e]}getMoreDialogs(){return Lt(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=St.a.windowH/72*1.25|0,t=this.getTempId("dialogs"),s=i.a.getConversations(this.query,this.offsetIndex,e,this.folderId,!0).promise;this.promise=s;const n=yield s;if(this.tempIds.dialogs!==t)return;this.promise=null;let o=n.dialogs;if(o.length){const e=o[o.length-1].index||0;o=o.slice(),o.findAndSplice(e=>e.peerId===a.default.myId),this.chatRightsAction&&(o=o.filter(e=>this.filterByRights(e.peerId))),this.renderSaved(),this.offsetIndex=e}if(this.renderResultsFunc(o.map(e=>e.peerId)),n.isEnd){if(!this.loadedWhat.dialogs)return this.renderSaved(),this.loadedWhat.dialogs=!0,this.offsetIndex=0,this.folderId=1,this.getMoreDialogs();if(this.loadedWhat.archived=!0,!this.loadedWhat.contacts)return this.getMoreContacts()}}))}filterByRights(e){return e.isUser()&&("send_messages"!==this.chatRightsAction||k.a.canSendToUser(e))||K.a.hasRights(e.toChatId(),this.chatRightsAction)}getMoreContacts(){return Lt(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const t=this.getTempId("contacts"),s=Promise.all([e?k.a.getContactsPeerIds(this.query):[],this.query?k.a.searchContacts(this.query):void 0]);this.promise=s;let[i,n]=yield s;if(this.tempIds.contacts!==t)return;if(n){let t=e?n.my_results.concat(n.results):n.my_results;this.chatRightsAction&&(t=t.filter(e=>this.filterByRights(e))),this.peerType.includes("dialogs")||(t=t.filter(e=>e.isUser())),this.cachedContacts=Object(f.b)(i.concat(t))}else this.cachedContacts=i.slice();Object(f.e)(this.cachedContacts,a.default.myId),this.promise=null}const t=St.a.windowH/72*1.25|0,s=this.cachedContacts.splice(0,t);this.renderResultsFunc(s),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return Lt(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.channelParticipants)return;const e=this.getTempId("channelParticipants"),t=n.default.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount),s=yield t;if(this.tempIds.channelParticipants!==e)return;const i=s.participants.map(e=>K.a.getParticipantPeerId(e));Object(f.e)(i,a.default.myId),this.renderResultsFunc(i),(this.list.childElementCount>=s.count||s.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){const e=(()=>{const e=[];return!this.peerType.includes("dialogs")||this.loadedWhat.archived||(e.push(this.getMoreDialogs()),this.loadedWhat.archived)?(!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts||e.push(this.getMoreContacts()),this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants&&e.push(this.getMoreChannelParticipants()),e):e})(),t=Promise.all(e);return e.length&&t.then(this.checkForTriggers),t}renderResults(e){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=e.filter(e=>k.a.isNonContactUser(e))),e.forEach(e=>{const{dom:t}=Vo.addDialogNew({dialog:e,container:this.scrollable,drawStatus:!1,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const s=this.selected.has(e),i=new ut.a;s&&(i.input.checked=!0),t.containerEl.prepend(i.label)}let s;s=e.isAnyChat()?n.default.getChatMembersString(e.toChatId()):e===a.default.myId?Object(x.i18n)(this.selfPresence):k.a.getUserStatusString(e),t.lastMessageSpan.append(s)})}add(e,t,s=!0){if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const i=document.createElement("div");i.classList.add("selector-user","scale-in");const n=document.createElement("avatar-element");return n.classList.add("selector-user-avatar","tgico"),n.setAttribute("dialog","1"),n.classList.add("avatar-32"),i.dataset.key=""+e,e.isPeerId()&&(void 0===t&&(t=new wt.a({peerId:e.toPeerId(),dialog:!0}).element),n.setAttribute("peer",""+e)),t&&("string"==typeof t?i.innerHTML=t:(Object(T.a)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",n),this.selectedContainer.insertBefore(i,this.input),this.onChange&&this.onChange(this.selected.size),s&&this.selectedScrollable.scrollIntoViewNew(this.input,"center"),i}remove(e){if(!this.multiSelect)return;const t=this.selectedContainer.querySelector(`[data-key="${e}"]`);t.classList.remove("scale-in"),t.offsetWidth,t.classList.add("scale-out");const s=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};a.default.settings.animationsEnabled?t.addEventListener("animationend",s,{once:!0}):s()}getSelected(){return[...this.selected]}addInitial(e){e.forEach(e=>{this.add(e,void 0,!1)}),window.requestAnimationFrame(()=>{this.selectedScrollable.scrollIntoViewNew(this.input,"center",void 0,void 0,ft.a.Static)})}}var It=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Mt extends ht.b{constructor(e){super("popup-forward",null,{closable:!0,overlayClosable:!0,body:!0}),this.selector=new Et({appendTo:this.body,onChange:()=>It(this,void 0,void 0,(function*(){const t=this.selector.getSelected(),s=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(s);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()})),peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),pe.IS_TOUCH_SUPPORTED||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:46,peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence}),this.title.append(this.selector.input)}}class Ct extends V{init(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new ln({name:"UserRestrictionsCanDo"}),s=document.createElement("div");s.classList.add("chatlist-container"),t.content.insertBefore(s,t.title);const i=Vo.createChatList({new:!0});s.append(i);const{dom:n}=Vo.addDialogNew({dialog:this.userId.toPeerId(!1),container:i,drawStatus:!1,rippleEnabled:!0,avatarSize:48});n.lastMessageSpan.append(k.a.getUserStatusString(this.userId));const a=new Pt({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0});e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&Object(w.b)(this.participant.banned_rights.pFlags,e.pFlags)||K.a.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new ln({});if("channelParticipantBanned"===this.participant._){const s=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});Object(l.b)(s,()=>{const t=Object(mt.a)([s],!0);K.a.clearChannelParticipantBannedRights(this.chatId,this.participant).then(()=>{this.eventListener.removeEventListener("destroy",e),this.close()},()=>{t()})},{listenerSetter:this.listenerSetter}),t.content.append(s)}const s=Object(U.a)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});Object(l.b)(s,()=>{Object(mt.a)([s],!0);K.a.kickFromChannel(this.chatId,this.participant).then(()=>{this.eventListener.removeEventListener("destroy",e),this.close()})},{listenerSetter:this.listenerSetter}),t.content.append(s),this.scrollable.append(t.container)}}}var kt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Pt{constructor(e){this.v=[{flags:["send_messages"],text:"UserRestrictionsSend",exceptionText:"UserRestrictionsNoSend"},{flags:["send_media"],text:"UserRestrictionsSendMedia",exceptionText:"UserRestrictionsNoSendMedia"},{flags:["send_stickers","send_gifs"],text:"UserRestrictionsSendStickers",exceptionText:"UserRestrictionsNoSendStickers"},{flags:["send_polls"],text:"UserRestrictionsSendPolls",exceptionText:"UserRestrictionsNoSendPolls"},{flags:["embed_links"],text:"UserRestrictionsEmbedLinks",exceptionText:"UserRestrictionsNoEmbedLinks"},{flags:["invite_users"],text:"UserRestrictionsInviteUsers",exceptionText:"UserRestrictionsNoInviteUsers"},{flags:["pin_messages"],text:"UserRestrictionsPinMessages",exceptionText:"UserRestrictionsNoPinMessages"},{flags:["change_info"],text:"UserRestrictionsChangeInfo",exceptionText:"UserRestrictionsNoChangeInfo"}],this.toggleWith={send_messages:["send_media","send_stickers","send_polls","embed_links"]};const t=K.a.getChat(e.chatId).default_banned_rights,s=e.participant?K.a.combineParticipantBannedRights(e.chatId,e.participant.banned_rights):t;for(const i of this.v){const n=i.flags[0];i.checkboxField=new ut.a({text:i.text,checked:K.a.hasRights(e.chatId,n,s),restriction:!0,withRipple:!0}),e.participant&&t.pFlags[n]&&(i.checkboxField.input.disabled=!0,Object(l.b)(i.checkboxField.label,e=>{ot(x.default.format("UserRestrictionsDisabled",!0))},{listenerSetter:e.listenerSetter})),this.toggleWith[n]&&e.listenerSetter.add(i.checkboxField.input)("change",()=>{if(!i.checkboxField.checked){this.v.filter(e=>this.toggleWith[n].includes(e.flags[0])).forEach(e=>{e.checkboxField.checked=!1})}}),e.appendTo.append(i.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 Tt extends V{init(){return kt(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new ln({name:"ChannelPermissionsHeader"});e=new Pt({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content}),this.eventListener.addEventListener("destroy",()=>{K.a.editChatDefaultBannedRights(this.chatId,e.takeOut())},{once:!0}),this.scrollable.append(t.container)}{const t=new ln({name:"PrivacyExceptions"}),s=new et({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new Mt({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout(()=>{i(e)},0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})}}),i=e=>kt(this,void 0,void 0,(function*(){let t;try{t=yield n.default.getChannelParticipant(this.chatId,e)}catch(e){return void ot("User is no longer participant")}const s=new Ct(this.slider);s.participant=t,s.chatId=this.chatId,s.userId=e,s.open()}));t.content.append(s.container);const r=t.generateContentElement();r.classList.add("chatlist-container");const c=Vo.createChatList({new:!0});r.append(c),Object(l.b)(c,e=>{const t=Object(bt.a)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();i(s)},{listenerSetter:this.listenerSetter});const d=(t,s)=>{const i=s.banned_rights,n=K.a.getChat(this.chatId).default_banned_rights,a=[];e.v.forEach(e=>{const t=e.flags[0];i.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)});const o=t.querySelector(".user-last-message");a.length&&(o.innerHTML="",o.append(...Object(x.join)(a.map(e=>Object(x.i18n)(e)),!1))),o.classList.toggle("hide",!a.length)},h=(e,t)=>{const{dom:s}=Vo.addDialogNew({dialog:o.a.getPeerId(e.peer),container:c,drawStatus:!1,rippleEnabled:!0,avatarSize:48,append:t});d(s.listEl,e)};this.listenerSetter.add(a.default)("updateChannelParticipant",e=>{var t,s,i;const n="channelParticipantBanned"===(null===(t=e.new_participant)||void 0===t?void 0:t._)&&!e.new_participant.banned_rights.pFlags.view_messages,a=c.querySelector(`[data-peer-id="${e.user_id}"]`);n?(a?d(a,e.new_participant):h(e.new_participant,!1),"channelParticipantBanned"!==(null===(s=e.prev_participant)||void 0===s?void 0:s._)&&++m):(a&&a.remove(),"channelParticipantBanned"===(null===(i=e.prev_participant)||void 0===i?void 0:i._)&&--m),u()});const u=()=>{Object(T.a)(s.subtitle,Object(x.i18n)(m?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[m]))};let p,m=0;const g=()=>(p=new vt({scrollable:this.scrollable,getPromise:()=>n.default.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,c.childElementCount).then(e=>{for(const t of e.participants)h(t,!0);return m=e.count,u(),e.participants.length<50||e.count===c.childElementCount})}),p.load());this.scrollable.append(t.container),K.a.isChannel(this.chatId)?yield g():(u(),this.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,g())}))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}class xt{constructor(e,t=o.a.getDialogType(e),s){const n=new wt.a({peerId:e}).element,a=(t,n=u&&!!t.size)=>{let a=K.a.leave(e.toChatId());n&&(a=a.finally(()=>i.a.flushHistory(e))),s&&s(a)},r=t=>{let n;if(e.isUser())n=i.a.flushHistory(e,!1,u?!!t.size:void 0);else{if(!t.size)return a(t);n=K.a.delete(e.toChatId())}s&&s(n)};let l,c,d,h,u;switch(t){case"channel":K.a.hasRights(e.toChatId(),"delete_chat")?(K.a.deleteChannel,l="ChannelDeleteMenu",c="AreYouSureDeleteAndExitChannel",h=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:r}],u=[{text:"DeleteChannelForAll"}]):(l="LeaveChannelMenu",c="ChannelLeaveAlertWithName",d=[n],h=[{langKey:"LeaveChannel",isDanger:!0,callback:a}]);break;case"chat":l="DeleteChatUser",c="AreYouSureDeleteThisChatWithUser",d=[n],h=[{langKey:"DeleteChatUser",isDanger:!0,callback:r}],u=[{text:"DeleteMessagesOptionAlso",textArgs:[new wt.a({peerId:e}).element]}];break;case"saved":l="DeleteChatUser",c="AreYouSureDeleteThisChatSavedMessages",h=[{langKey:"DeleteChatUser",isDanger:!0,callback:r}];break;case"megagroup":case"group":K.a.hasRights(e.toChatId(),"delete_chat")?(l="DeleteMegaMenu",c="AreYouSureDeleteAndExit",h=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:r}],u=[{text:"DeleteChat.DeleteGroupForAll"}]):(l="LeaveMegaMenu",c="AreYouSureDeleteAndExitName",d=[n],h=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>a(e,!0)}])}new pt("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:u}).show()}}var At=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ot extends z{_init(){return At(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.innerHTML="",this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");const e=yield n.default.getChatFull(this.chatId,!0),t=K.a.getChat(this.chatId),s=K.a.isBroadcast(this.chatId),i=K.a.isChannel(this.chatId),o=[],r=e=>{o.push(e)};this.listenerSetter.add(a.default)("chat_update",e=>{this.chatId===e&&o.forEach(e=>e())});const c=this.chatId.toPeerId(!0);{const i=new ln({noDelimiter:!0}),n=[],o=document.createElement("div");if(o.classList.add("input-wrapper"),this.chatNameInputField=new F.b({label:s?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new F.b({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(t.title),this.descriptionInputField.setOriginalValue(e.about),o.append(this.chatNameInputField.container,this.descriptionInputField.container),n.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new Je({peerId:c,inputFields:n,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),i.content.append(this.editPeer.avatarEdit.container,o),K.a.hasRights(this.chatId,"change_type")){const n=new et({titleLangKey:s?"ChannelType":"GroupType",clickable:()=>{const t=new gt(this.slider);t.chatId=this.chatId,t.chatFull=e,t.open(),this.listenerSetter.add(t.eventListener)("destroy",a)},icon:"lock"}),a=()=>{let e;n.subtitle.textContent="",e=s?t.username?"TypePublic":"TypePrivate":t.username?"TypePublicGroup":"TypePrivateGroup",n.subtitle.append(Object(x.i18n)(e))};a(),i.content.append(n.container)}if(K.a.hasRights(this.chatId,"change_permissions")&&!s){const e=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],s=new et({titleLangKey:"ChannelPermissions",clickable:()=>{const e=new Tt(this.slider);e.chatId=this.chatId,e.open()},icon:"permissions"}),n=()=>{s.subtitle.innerHTML=e.reduce((e,s)=>e+ +K.a.hasRights(this.chatId,s,t.default_banned_rights),0)+"/"+e.length};n(),i.content.append(s.container),this.listenerSetter.add(a.default)("chat_update",e=>{this.chatId===e&&n()})}if(this.scrollable.append(i.container),Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0;let e=[];const t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(K.a.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(K.a.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then(e=>K.a.editPhoto(t,e))),Promise.race(e).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()})},{listenerSetter:this.listenerSetter}),s&&K.a.hasRights(this.chatId,"change_info")){const e=new ut.a({text:"PeerInfo.SignMessages",checked:!!t.pFlags.signatures,withRipple:!0});this.listenerSetter.add(e.input)("change",()=>{const t=e.toggleDisability(!0);K.a.toggleSignatures(this.chatId,e.checked).then(()=>{t()})}),r(()=>{e.setValueSilently(!!t.pFlags.signatures)}),i.content.append(e.label)}}if(!s){const t=new ln({});if(!s&&K.a.hasRights(this.chatId,"change_permissions")){const s=new ut.a({text:"ChatHistory",withRipple:!0});this.listenerSetter.add(s.input)("change",()=>{const e=s.toggleDisability(!0);K.a.togglePreHistoryHidden(this.chatId,!s.checked).then(()=>{e()})});const n=()=>{s.setValueSilently(i&&!e.pFlags.hidden_prehistory)};n(),r(n),t.content.append(s.label)}this.scrollable.append(t.container)}if(K.a.hasRights(this.chatId,"delete_chat")){const e=new ln({}),t=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:s?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});Object(l.b)(t,()=>{new xt(c,void 0,e=>{const s=Object(mt.a)([t],!0);e.then(()=>{this.close()},()=>{s()})})},{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}i||this.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{c===e&&(this.chatId=t.toChatId(),this._init())})}))}init(){return this._init()}}var Ft=s(95);class _t extends z{init(){this.container.classList.add("edit-peer-container","edit-contact-container");const e=!k.a.isContact(this.peerId.toUserId());this.setTitle(e?"AddContactTitle":"Edit");{const t=new ln({noDelimiter:!0}),s=[],n=document.createElement("div");if(n.classList.add("input-wrapper"),this.nameInputField=new F.b({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new F.b({label:"LastName",name:"contact-lastname",maxLength:70}),this.peerId){const t=k.a.getUser(this.peerId);e?(this.nameInputField.setDraftValue(t.first_name),this.lastNameInputField.setDraftValue(t.last_name)):(this.nameInputField.setOriginalValue(t.first_name),this.lastNameInputField.setOriginalValue(t.last_name))}if(n.append(this.nameInputField.container,this.lastNameInputField.container),s.push(this.nameInputField,this.lastNameInputField),this.editPeer=new Je({peerId:this.peerId,inputFields:s,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),this.peerId){const s=document.createElement("div");s.classList.add("avatar-edit"),s.append(this.editPeer.avatarElem);const r=new ut.a({text:"Notifications"});r.input.addEventListener("change",e=>{e.isTrusted&&i.a.mutePeer(this.peerId)}),this.listenerSetter.add(a.default)("notify_settings",e=>{if("notifyPeer"!==e.peer._)return;const t=o.a.getPeerId(e.peer.peer);if(this.peerId===t){const t=!Ft.a.isMuted(e.notify_settings);t!==r.checked&&(r.checked=t)}});const l=document.createElement("div");l.classList.add("profile-name"),l.append(new wt.a({peerId:this.peerId}).element);const c=document.createElement("div");if(c.classList.add("profile-subtitle"),c.append(Object(x.i18n)("EditContact.OriginalName")),t.content.append(s,l,c,n),e){const e=k.a.getUser(this.peerId),s=new et({icon:"phone",titleLangKey:e.phone?void 0:"MobileHidden",title:e.phone?k.a.formatUserPhone(e.phone):void 0,subtitleLangKey:e.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:e.phone?void 0:[new wt.a({peerId:this.peerId}).element]});t.content.append(s.container)}else{const e=new et({checkboxField:r}),s=!Ft.a.isPeerLocalMuted(this.peerId,!1);r.checked=s,t.content.append(e.container)}}else t.content.append(n);this.scrollable.append(t.container),Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0,k.a.addContact(this.peerId,this.nameInputField.value,this.lastNameInputField.value,k.a.getUser(this.peerId).phone).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()})},{listenerSetter:this.listenerSetter})}if(!e){const e=new ln({}),t=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});Object(l.b)(t,()=>{new pt("popup-delete-contact",{peerId:this.peerId,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:Object(ht.a)([{langKey:"Delete",callback:()=>{const e=Object(mt.a)([t],!0);k.a.deleteContacts([this.peerId]).then(()=>{this.close()},()=>{e()})},isDanger:!0}])}).show()},{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}}}class jt extends z{init(){this.nextBtn=Q({icon:"arrow_next"}),this.content.append(this.nextBtn),this.scrollable.container.remove(),this.nextBtn.addEventListener("click",()=>{const e=this.selector.getSelected().map(e=>e.toPeerId());if(this.skippable)this.takeOut(e),this.close();else{const t=this.takeOut(e);t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()}})}attachToPromise(e){const t=Object(te.g)(this.nextBtn,"arrow_next");e.then(()=>{this.close()},()=>{t()})}open(e){const t=super.open();this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const s="privacy"===this.peerType;return this.selector=new Et({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[s?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:s,filterPeerTypeBy:s?["isAnyGroup","isUser"]:void 0}),e.selectedPeerIds&&this.selector.addInitial(e.selectedPeerIds),this.nextBtn.classList.add("tgico-arrow_next"),this.nextBtn.innerHTML="",this.nextBtn.disabled=!1,this.nextBtn.classList.toggle("is-visible",this.skippable),t}}var Dt=!re.IS_FIREFOX&&!1;function Bt(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 24 24"),e.setAttributeNS(null,"width","24"),e.setAttributeNS(null,"height","24"),e.classList.add("verified-icon");const t=document.createElementNS("http://www.w3.org/2000/svg","use");t.setAttributeNS(null,"href","#verified-background"),t.classList.add("verified-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-check"),s.classList.add("verified-check"),e.append(t,s),e}const Rt=e=>e.touches?e.touches[0]:e,Ut=window;let Ht=!1;a.default.addEventListener("context_menu_toggle",e=>{Ht=e});class Nt{constructor(e){this.cursor="grabbing",this.cancelEvent=!0,this.listenerOptions=!1,this.hadMove=!1,this.xDown=null,this.yDown=null,this.reset=e=>{pe.IS_TOUCH_SUPPORTED?Ut.removeEventListener("touchmove",this.handleMove,{capture:!0}):(Ut.removeEventListener("mousemove",this.handleMove),this.element.style.cursor=""),this.onReset&&this.hadMove&&this.onReset(),this.xDown=this.yDown=null,this.hadMove=!1},this.handleStart=e=>{const t=Rt(e);if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return this.reset();this.xDown=t.clientX,this.yDown=t.clientY,pe.IS_TOUCH_SUPPORTED?Ut.addEventListener("touchmove",this.handleMove,{passive:!1,capture:!0}):Ut.addEventListener("mousemove",this.handleMove,!1)},this.handleMove=e=>{if(null===this.xDown||null===this.yDown||Ht)return void this.reset();this.cancelEvent&&Object(c.a)(e);const t=Rt(e),s=t.clientX,i=t.clientY,n=this.xDown-s,a=this.yDown-i;if(!this.hadMove){if(!n&&!a)return;this.hadMove=!0,pe.IS_TOUCH_SUPPORTED||this.element.style.setProperty("cursor",this.cursor,"important"),this.onFirstSwipe&&this.onFirstSwipe()}const o=this.onSwipe(n,a,e);void 0!==o&&o&&this.reset()},Object(w.g)(this,e),this.setListeners()}setListeners(){pe.IS_TOUCH_SUPPORTED?(this.element.addEventListener("touchstart",this.handleStart,this.listenerOptions),Ut.addEventListener("touchend",this.reset)):(this.element.addEventListener("mousedown",this.handleStart,this.listenerOptions),Ut.addEventListener("mouseup",this.reset))}removeListeners(){pe.IS_TOUCH_SUPPORTED?(this.element.removeEventListener("touchstart",this.handleStart,this.listenerOptions),Ut.removeEventListener("touchend",this.reset)):(this.element.removeEventListener("mousedown",this.handleStart,this.listenerOptions),Ut.removeEventListener("mouseup",this.reset))}}var zt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Vt{constructor(e){this.scrollable=e,this.loadCallbacks=new Map,this.processItem=e=>{const t=document.createElement("div");let s;t.classList.add(Vt.BASE_CLASS+"-avatar","media-container"),e&&(s="object"!=typeof e?r.a.getPhoto(e):e.action.photo);const i=new Image;i.classList.add("avatar-photo"),i.draggable=!1;const n=()=>{if(s){const e=ws({container:t,photo:s,size:r.a.choosePhotoSize(s,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach(e=>{e.classList.add("avatar-photo")})}else{const e=o.a.getPeerPhoto(this.peerId);d.a.putAvatar(t,this.peerId,e,"photo_big",i)}};return this.avatars.childElementCount<=3?n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.avatars.append(t),this.addTab(),e},this.container=document.createElement("div"),this.container.classList.add(Vt.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(Vt.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(Vt.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(Vt.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(Vt.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(Vt.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(Vt.BASE_CLASS+"-arrow",Vt.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext);const t=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew(this.scrollable.container.firstElementChild,"start"),!1);let s=!1,i=!1;Object(l.b)(this.container,e=>zt(this,void 0,void 0,(function*(){if(i)return void Object(c.a)(e);if(s)return void(s=!1);if(!t())return;const n=this.container.getBoundingClientRect(),a=e.pageX,o=a-n.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||o>n.width*(1/3)&&o{t.push({element:this.avatars.children[s],item:e})});const s=t.slice(0,this.listLoader.previous.length),n=t.slice(this.listLoader.previous.length+1),a=this.avatars.children[this.listLoader.previous.length];i=!0,Ao(a,e,()=>e===this.peerId,this.listLoader.current,s,n),i=!1}else{const e=a>n.right-n.width/2;let t;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,t=0!==this.listLoader.index||e?this.listLoader.index===this.listLoader.count-1&&e?-(this.listLoader.count-1):e?1:-1:this.listLoader.count-1,this.listLoader.go(t),Object(Fe.b)(()=>{this.avatars.classList.remove("no-transition")})}})));const n=()=>{s=!0,document.body.addEventListener(pe.IS_TOUCH_SUPPORTED?"touchend":"click",e=>{s=!1},{once:!0})};let a=0,h=0,u=0,p=0;new Nt({element:this.avatars,onSwipe:(e,t)=>{u=e;let s=h+e*-Vt.SCALE;return s>0?s=0:st()?!this.container.classList.contains("is-single")&&!i:(n(),Object(c.a)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();a=e.width,p=-a*(this.tabs.childElementCount-1),h=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=Vt.TRANSLATE_TEMPLATE.replace("{x}",h+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(u)/(a/Vt.SCALE))*(u>=0?1:-1);n(),this.avatars.classList.remove("no-transition"),Object(Fe.b)(()=>{this.listLoader.go(e),this.container.classList.remove("is-swiping")})}});this.intersectionObserver=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&this.loadNearestToTarget(e.target)})})}setPeer(e){this.peerId=e;const t=o.a.getPeerPhoto(e);if(!t)return;const s=this.listLoader=new S({loadCount:50,loadMore:(t,a,o)=>{if(!a)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t||s.current;return r.a.getUserPhotos(e,i,o).then(e=>({count:e.count,items:e.photos}))}{const t=[];return s.current||t.push(n.default.getChatFull(e.toChatId())),t.push(i.a.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:o,backLimit:0})),Promise.all(t).then(e=>{const t=e.pop();if(y(t),!s.current){const n=e[0],a=t.history.findAndSplice(e=>e.action.photo.id===n.chat_photo.id);s.current=a||i.a.generateFakeAvatarMessage(this.peerId,n.chat_photo)}return{count:t.count,items:t.history}})}},processItem:this.processItem,onJump:(e,t)=>{const s=this.listLoader.index,i=100*Vt.SCALE*s;this.avatars.style.transform=Vt.TRANSLATE_TEMPLATE.replace("{x}",`-${i}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active");this.tabs.children[s].classList.add("active"),this.loadNearestToTarget(this.avatars.children[s])}});"userProfilePhoto"===t._&&(s.current=t.photo_id),this.processItem(s.current),s.load(!0)}addTab(){const e=document.createElement("div");e.classList.add(Vt.BASE_CLASS+"-tab"),this.tabs.append(e),1===this.tabs.childElementCount&&e.classList.add("active"),this.container.classList.toggle("is-single",this.tabs.childElementCount<=1)}loadNearestToTarget(e){const t=Array.from(e.parentElement.children),s=t.indexOf(e);t.slice(Math.max(0,s-3),Math.min(t.length,s+3)).forEach(e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))})}}Vt.BASE_CLASS="profile-avatars",Vt.SCALE=Dt?2:1,Vt.TRANSLATE_TEMPLATE=Dt?`translate3d({x}, 0, -1px) scale(${Vt.SCALE})`:"translate({x}, 0)";let Wt=(e,t)=>{t.title.innerHTML=e,t.container.style.display=""};class Kt{constructor(e){this.scrollable=e,this.setPeerStatus=(e=!1)=>{if(!this.peerId)return;const t=this.peerId;So.setPeerStatus(this.peerId,this.subtitle,e,!0,()=>t===this.peerId)},Dt||this.scrollable.container.classList.add("no-parallax")}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new ln({noDelimiter:!0}),this.avatar=new _o,this.avatar.classList.add("profile-avatar","avatar-120"),this.avatar.setAttribute("dialog","1"),this.avatar.setAttribute("clickable",""),this.name=document.createElement("div"),this.name.classList.add("profile-name"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("profile-subtitle"),this.bio=new et({title:" ",subtitleLangKey:"UserBio",icon:"info",clickable:e=>{"A"!==e.target.tagName&&n.default.getProfileByPeerId(this.peerId).then(e=>{st(e.about),ot(x.default.format("BioCopied",!0))})}}),this.bio.title.classList.add("pre-wrap"),this.username=new et({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{st("@"+o.a.getPeer(this.peerId).username),ot(x.default.format("UsernameCopied",!0))}}),this.phone=new et({title:" ",subtitleLangKey:"Phone",icon:"phone",clickable:()=>{st("+"+k.a.getUser(this.peerId).phone),ot(x.default.format("PhoneCopied",!0))}}),this.notifications=new et({checkboxField:new ut.a({toggle:!0}),titleLangKey:"Notifications",icon:"unmute"}),this.section.content.append(this.phone.container,this.username.container,this.bio.container,this.notifications.container),this.element.append(this.section.container,dn()),this.notifications.checkboxField.input.addEventListener("change",e=>{e.isTrusted&&i.a.mutePeer(this.peerId)}),a.default.addEventListener("dialog_notify_settings",e=>{if(this.peerId===e.peerId){const e=Ft.a.isPeerLocalMuted(this.peerId,!1);this.notifications.checkboxField.checked=!e}}),a.default.addEventListener("peer_typings",({peerId:e})=>{this.peerId===e&&this.setPeerStatus()}),a.default.addEventListener("peer_bio_edit",e=>{e===this.peerId&&this.setBio(!0)}),a.default.addEventListener("user_update",e=>{this.peerId===e&&this.setPeerStatus()}),a.default.addEventListener("contacts_update",e=>{if(this.peerId===e){const t=k.a.getUser(e);t.pFlags.self||(t.phone?Wt(k.a.formatUserPhone(t.phone),this.phone):this.phone.container.style.display="none")}}),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4)}cleanupHTML(){this.bio.container.style.display="none",this.phone.container.style.display="none",this.username.container.style.display="none",this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0,this.setBioTimeout&&(window.clearTimeout(this.setBioTimeout),this.setBioTimeout=0)}setAvatar(){if(this.peerId!==a.default.myId){if(o.a.getPeerPhoto(this.peerId)){const e=this.avatars;return this.avatars=new Vt(this.scrollable),this.avatars.setPeer(this.peerId),this.avatars.info.append(this.name,this.subtitle),this.avatar.remove(),e?e.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),void(Dt&&this.scrollable.container.classList.add("parallax"))}}Dt&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars=void 0),this.avatar.setAttribute("peer",""+this.peerId),this.section.content.prepend(this.avatar,this.name,this.subtitle)}fillProfileElements(){var e;if(!this.cleaned)return;this.cleaned=!1;const t=this.peerId;if(this.cleanupHTML(),this.setAvatar(),t!==a.default.myId){o.a.getPeerUsername(t)&&Wt(o.a.getPeerUsername(t),this.username);const e=Ft.a.isPeerLocalMuted(t,!1);this.notifications.checkboxField.checked=!e}else Object(Fe.b)(()=>{this.notifications.container.style.display="none"});if(t.isUser()){let e=k.a.getUser(t);e.phone&&t!==a.default.myId&&Wt(k.a.formatUserPhone(e.phone),this.phone)}this.setBio(),Object(T.a)(this.name,new wt.a({peerId:t,dialog:!0}).element);const s=o.a.getPeer(t);(null===(e=null==s?void 0:s.pFlags)||void 0===e?void 0:e.verified)&&this.name.append(Bt()),this.setPeerStatus(!0)}setBio(e){this.setBioTimeout&&(window.clearTimeout(this.setBioTimeout),this.setBioTimeout=0);const t=this.peerId,s=this.threadId;if(!t)return;let i;i=t.isUser()?n.default.getProfile(t,e).then(e=>this.peerId===t&&this.threadId===s&&(e.rAbout&&t!==a.default.myId&&Wt(e.rAbout,this.bio),!0)):n.default.getChatFull(t.toChatId(),e).then(e=>this.peerId===t&&this.threadId===s&&(e.about&&Wt(J.b.wrapRichText(e.about),this.bio),!0)),i.then(e=>{e&&(this.setBioTimeout=window.setTimeout(()=>this.setBio(!0),6e4))})}setPeer(e,t=0){this.peerId===e&&this.threadId===t||(this.init&&this.init(),this.peerId=e,this.threadId=t,this.cleaned=!0)}}class Gt extends z{constructor(e){super(e,!1),this.threadId=0,this.historiesStorage={}}init(){this.container.classList.add("shared-media-container","profile-container");const e=Object(U.a)("btn-icon sidebar-close-button",{noRipple:!0});this.closeBtn.replaceWith(e),this.closeBtn=e;const t=document.createElement("div");t.classList.add("animated-close-icon"),e.append(t);const s=document.createElement("div");s.className="transition slide-fade";const i=document.createElement("div");i.classList.add("transition-item"),this.title.append(Object(x.i18n)("Profile")),this.editBtn=H("edit"),i.append(this.title,this.editBtn);const n=document.createElement("div");n.classList.add("transition-item");const o=this.title.cloneNode();o.append(Object(x.i18n)("PeerInfo.SharedMedia")),n.append(o),s.append(i,n),this.header.append(s),this.profile=new Kt(this.scrollable),this.profile.init(),this.scrollable.append(this.profile.element);this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const s=e.top-1<=56;t.classList.toggle("state-back",s),this.searchSuper.container.classList.toggle("is-full-viewport",s),r(+s),s||this.searchSuper.cleanScrollPositions()};const r=Object(j.a)(s,"slide-fade",400,null,!1);r(0),Object(l.b)(this.closeBtn,e=>{this.closeBtn.firstElementChild.classList.contains("state-back")?(this.scrollable.scrollIntoViewNew(this.scrollable.container.firstElementChild,"start"),r(0),t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),Object(l.b)(this.editBtn,e=>{let t;t=this.peerId.isAnyChat()?new Ot(this.slider):new _t(this.slider),t&&(t instanceof Ot?t.chatId=this.peerId.toChatId():t.peerId=this.peerId,t.open())}),a.default.addEventListener("contacts_update",e=>{this.peerId===e&&this.toggleEditBtn()}),a.default.addEventListener("chat_update",e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()}),a.default.addEventListener("history_multiappend",e=>{for(const t in e)this.renderNewMessages(t.toPeerId(),Array.from(e[t]))}),a.default.addEventListener("history_delete",({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))}),a.default.addEventListener("message_sent",({message:e})=>{this.renderNewMessages(e.peerId,[e.mid])}),this.searchSuper=new Js({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"PeerMedia.Members",type:"members"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:this.scrollable,onChangeTab:e=>{let t="members"===e.type&&a.default.settings.animationsEnabled?250:0;setTimeout(()=>{c.classList.toggle("is-hidden","members"!==e.type)},t)}}),this.profile.element.append(this.searchSuper.container);const c=Q({icon:"addmember_filled"});this.content.append(c),c.addEventListener("click",()=>{const e=this.peerId,t=this.peerId.toChatId(),s=K.a.isChannel(t),i=(t,i)=>{let n,a,o,r,l;if(t.length>1)n="AddMembersAlertTitle",a=[Object(x.i18n)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map(e=>{const t=document.createElement("b");return t.append(new wt.a({peerId:e}).element),t}),s||(l=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new wt.a({peerId:t[0]}).element),r=[e],s||(l=[{text:"AddOneMemberForwardMessages",textArgs:[new wt.a({peerId:t[0]}).element],checked:!0}])}r.push(new wt.a({peerId:e}).element),new pt("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:i}],checkboxes:l}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&rt({langPackKey:"InviteToGroupError"})};if(s){const e=new jt(this.slider);e.open({type:"channel",skippable:!1,takeOut:s=>(i(s,()=>{const i=K.a.inviteToChannel(t,s);i.catch(n),e.attachToPromise(i)}),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new Mt({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout(()=>{i([e],s=>{K.a.addChatUser(t,e,s.size?void 0:0).catch(n)})},0)}})})}renderNewMessages(e,t){if(!this.init&&this.historiesStorage[e]){t=t.slice().reverse();for(const s of this.searchSuper.mediaTabs){const n=s.inputFilter,a=this.searchSuper.filterMessagesByType(t.map(t=>i.a.getMessageByPeer(e,t)),n);if(a.length){const t=this.historiesStorage[e][n];t&&t.unshift(...a.map(e=>({mid:e.mid,peerId:e.peerId}))),this.peerId===e&&-1!==this.searchSuper.usedFromHistory[n]&&(this.searchSuper.usedFromHistory[n]+=a.length,this.searchSuper.performSearchResult(a,s,!1))}}}}deleteDeletedMessages(e,t){if(!this.init&&this.historiesStorage[e]){for(const s of t)for(const t of this.searchSuper.mediaTabs){const i=t.inputFilter,n=this.historiesStorage[e][i];if(!n)continue;const a=n.findIndex(e=>e.mid===s);if(-1!==a){if(n.splice(a,1),this.peerId===e){const t=this.searchSuper.tabs[i].querySelector(`div[data-mid="${s}"][data-peer-id="${e}"]`);t&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(t),t.remove()),this.searchSuper.usedFromHistory[i]>=a+1&&this.searchSuper.usedFromHistory[i]--}break}}this.scrollable.onScroll()}}cleanupHTML(){this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",this.searchSuper.canViewMembers()&&K.a.hasRights(this.peerId.toChatId(),"invite_users"))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t=0){var s;return(this.peerId!==e||this.threadId!==t)&&(this.peerId=e,this.threadId=t,this.peerChanged=!0,this.init&&(this.init(),this.init=null),this.searchSuper.setQuery({peerId:e,historyStorage:null!==(s=this.historiesStorage[e])&&void 0!==s?s:this.historiesStorage[e]={}}),this.profile.setPeer(e,t),!0)}fillProfileElements(){this.peerChanged&&(this.peerChanged=!1,this.cleanupHTML(),this.profile.fillProfileElements(),this.toggleEditBtn())}toggleEditBtn(){let e;e=this.peerId.isUser()?this.peerId!==a.default.myId&&k.a.isContact(this.peerId.toUserId()):K.a.hasRights(this.peerId.toChatId(),"change_info"),this.editBtn.classList.toggle("hide",!e)}loadSidebarMedia(e,t=!1){this.searchSuper.load(e,t)}onOpenAfterTimeout(){this.scrollable.onScroll()}}const qt=new class extends W{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1,b.b.addEventListener("changeScreen",(e,t)=>{t===b.a.medium&&e!==b.a.mobile&&this.toggleSidebar(!1)}),b.b.addEventListener("resize",()=>{this.setColumnProportion()}),this.sharedMediaTab=new Gt(this)}onCloseTab(e,t,s){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,s)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const s=document.body.classList.contains("is-right-column-shown");let i;if(void 0!==e?e?s||(i=!0):s&&(i=!0):i=!0,!i)return Promise.resolve();s||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const n=So.selectTab(s?1:2,t);return document.body.classList.toggle("is-right-column-shown",e),n}};de.a.appSidebarRight=qt;var Qt=qt;class $t extends z{init(){this.container.id="poll-results-container",this.container.classList.add("chatlist-container"),this.resultsDiv=document.createElement("div"),this.resultsDiv.classList.add("poll-results"),this.scrollable.append(this.resultsDiv)}open(e){const t=super.open(),s=Ye.a.getPoll(e.media.poll.id);this.setTitle(s.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");i.innerHTML=s.poll.rQuestion;const n=s.results.results.map(e=>e.voters/s.results.total_voters*100);Jt(n);const a=document.createDocumentFragment();return s.results.results.forEach((t,i)=>{if(!t.voters)return;const o=document.createElement("hr"),r=s.poll.answers[i],l=document.createElement("div");l.classList.add("poll-results-answer");const c=document.createElement("div");c.innerHTML=J.a.wrapEmojiText(r.text);const d=document.createElement("div");d.innerText=Math.round(n[i])+"%",l.append(c,d);const h=Vo.createChatList();h.classList.add("poll-results-voters"),Vo.setListClickListener(h,()=>{Qt.onCloseBtnClick()},void 0,!0),h.style.minHeight=50*Math.min(t.voters,4)+"px",a.append(o,l,h);let u,p=4,m=!1,g=t.voters-4;const b=()=>{m||(m=!0,Ye.a.getVotes(e,r.option,u,p).then(e=>{e.votes.forEach(e=>{const{dom:t}=Vo.addDialogNew({dialog:e.user_id.toPeerId(!1),container:h,drawStatus:!1,rippleEnabled:!1,meAsSaved:!1,avatarSize:32});t.lastMessageSpan.parentElement.remove()}),u&&(g-=e.votes.length,v.lastElementChild.replaceWith(Object(x.i18n)("PollResults.LoadMore",[Math.min(20,g)]))),u=e.next_offset,p=20,g&&e.votes.length||v.remove()}).finally(()=>{m=!1}))};if(b(),g<=0)return;const v=document.createElement("div");v.classList.add("poll-results-more","show-more","rp-overflow"),v.addEventListener("click",b),Object(se.ripple)(v);const f=document.createElement("div");f.classList.add("tgico-down"),v.append(f,Object(x.i18n)("PollResults.LoadMore",[Math.min(20,g)])),a.append(v)}),this.resultsDiv.append(i,a),Qt.toggleSidebar(!0).then(()=>{}),t}}var Yt=s(57);let Xt=0;const Jt=e=>{const t=e.reduce((e,t)=>e+Math.round(t),0);if(t>100){const s=t-100,i=e.length;for(let t=0;t=.5&&is&&(s=i,t=n)}if(-1===t)return;e[t]+=1-s}}};a.default.addEventListener("poll_update",({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach(s=>{s.isClosed=!!e.pFlags.closed,s.performResults(t,e.chosenIndexes)})}),a.default.addEventListener("peer_changed",()=>{es&&Zt(es,ts,ss)}),b.b.addEventListener("resize",()=>{is.setMaxLength(),is.resizePolls()}),b.b.addEventListener("changeScreen",()=>{is.setMaxLength()});const Zt=(e,t,s)=>{e.classList.remove("active"),clearTimeout(s),setTimeout(()=>{t(),e.remove(),es===e&&ts===t&&ss===s&&(es=ts=null,ss=0)},200)};let es,ts,ss;class is extends HTMLElement{constructor(){super(),this.isClosed=!1,this.isQuiz=!1,this.isRetracted=!1,this.isPublic=!1,this.isMultiple=!1,this.chosenIndexes=[],this.chosingIndexes=[],this.sentVote=!1}static setMaxLength(){const e=St.a.windowW<=360?St.a.windowW-120:b.b.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){if(!this.MAX_LENGTH)return;Array.from(document.querySelectorAll("poll-element.is-voted")).forEach(e=>{e.svgLines.forEach((t,s)=>{e.setLineProgress(s,1)})})}render(){Xt||(Xt=document.getElementById("poll-line").getTotalLength(),is.setMaxLength());const e=this.message.media.poll.id,{poll:t,results:s}=Ye.a.getPoll(e);let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),t.pFlags&&(this.isPublic=!!t.pFlags.public_voters,this.isQuiz=!!t.pFlags.quiz,this.isClosed=!!t.pFlags.closed,this.isMultiple=!!t.pFlags.multiple_choice,this.isClosed?(i="Chat.Poll.Type.Closed",this.classList.add("is-closed")):i=this.isQuiz?this.isPublic?"Chat.Poll.Type.Quiz":"Chat.Poll.Type.AnonymousQuiz":this.isPublic?"Chat.Poll.Type.Public":"Chat.Poll.Type.Anonymous"),this.classList.toggle("is-multiple",this.isMultiple);const n=this.isMultiple?'':"",a=t.answers.map((e,t)=>`\n
\n
\n
\n \n \n \n ${n}\n
\n
\n
${J.a.wrapEmojiText(e.text)}
\n \n \n
\n `).join("");if(this.innerHTML=`\n
${t.rQuestion}
\n
\n
\n
\n
\n ${a}`,this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append(Object(x.i18n)(i)),this.isQuiz&&(this.classList.add("is-quiz"),t.close_period&&t.close_date)){const e=document.createElement("div");e.classList.add("poll-time"),this.descDiv.append(e);const s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("poll-quiz-timer"),this.quizTimer=s;const i=2,n=7,a=2*Math.PI*n,o=document.createElementNS("http://www.w3.org/2000/svg","circle");o.classList.add("poll-quiz-timer-circle"),o.setAttributeNS(null,"cx","16"),o.setAttributeNS(null,"cy","16"),o.setAttributeNS(null,"r",""+n),o.setAttributeNS(null,"stroke-width",""+i),s.append(o),this.descDiv.append(s);const r=1e3*t.close_period,l=1e3*(t.close_date-Xe.a.serverTimeOffset);this.quizInterval=window.setInterval(()=>{const t=Date.now(),s=(l-t)/r,i=(l-t)/1e3+1|0;e.innerHTML=String(i).toHHMMSS(),i<=5&&(e.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+s*a,o.style.strokeDasharray=`${a} ${a}`,t>=l&&(clearInterval(this.quizInterval),e.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout(()=>{Ye.a.getResults(this.message)},3e3))},1e3)}this.answerDivs=Array.from(this.querySelectorAll(".poll-answer")),this.svgLines=Array.from(this.querySelectorAll(".poll-line")),this.numberDivs=Array.from(this.querySelectorAll(".poll-answer-percents"));const o=document.createElement("div");o.classList.add("poll-footer"),this.viewResults=document.createElement("div"),this.viewResults.className="poll-footer-button poll-view-results hide",this.viewResults.append(Object(x.i18n)("Chat.Poll.ViewResults")),this.votersCountDiv=document.createElement("div"),this.votersCountDiv.className="poll-votes-count",o.append(this.viewResults,this.votersCountDiv),this.append(o),this.viewResults.addEventListener("click",e=>{Object(c.a)(e),Qt.isTabExists($t)||new $t(Qt).open(this.message)}),Object(se.ripple)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append(Object(x.i18n)("Chat.Poll.SubmitVote")),Object(se.ripple)(this.sendVoteBtn),t.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),Object(l.b)(this.sendVoteBtn,e=>{Object(c.a)(e),this.chosingIndexes.length&&this.sendVotes(this.chosingIndexes).then(()=>{this.chosingIndexes.length=0,this.answerDivs.forEach(e=>{e.classList.remove("is-chosing")})})}),o.append(this.sendVoteBtn));const r=!(t.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(s,t.chosenIndexes,!1),r&&(this.setVotersCount(s),Object(l.b)(this,this.clickHandler))}initQuizHint(e){if(e.solution&&e.solution_entities){const t=document.createElement("div");if(t.classList.add("tgico-tip","poll-hint"),this.descDiv.append(t),Object(l.b)(t,s=>{Object(c.a)(s),t.classList.add("active"),((e,t,s)=>{es&&Zt(es,ts,ss);const i=document.createElement("div");i.classList.add("quiz-hint");const n=document.createElement("div");n.classList.add("container","tgico");const a=document.createElement("div");a.classList.add("text"),n.append(a),i.append(n),a.innerHTML=J.a.wrapRichText(e,{entities:t}),So.chat.bubbles.bubblesContainer.append(i),i.offsetLeft,i.classList.add("active"),es=i,ts=s,ss=window.setTimeout(()=>{Zt(i,s,ss)},pe.IS_TOUCH_SUPPORTED?5e3:7e3)})(e.solution,e.solution_entities,()=>{t.classList.remove("active")})}),this.sentVote){const s=e.results.find(e=>e.pFlags.correct);s&&!s.pFlags.chosen&&t.click()}}}clickHandler(e){const t=Object(Ce.a)(e.target,"poll-answer");if(!t)return;Object(c.a)(e);const s=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(s);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(s)}else this.sendVotes([s])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter((t,s)=>e.includes(s));return t.forEach(e=>{e.classList.add("is-voting")}),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=Ye.a.sendVote(this.message,e).then(()=>{t.forEach(e=>{e.classList.remove("is-voting")}),this.classList.remove("disable-hover")}).catch(()=>{this.sentVote=!1}).finally(()=>{this.sendVotePromise=null})}performResults(e,t,s=!0){var i,n;if(a.default.settings.animationsEnabled||(s=!1),this.isQuiz&&((null===(i=e.results)||void 0===i?void 0:i.length)||this.isClosed)){this.answerDivs.forEach((t,s)=>{t.classList.toggle("is-correct",!!e.results[s].pFlags.correct)}),this.initQuizHint&&(this.initQuizHint(e),this.initQuizHint=null),this.quizInterval&&(clearInterval(this.quizInterval),this.quizInterval=0),(null===(n=this.quizTimer)||void 0===n?void 0:n.parentElement)&&this.quizTimer.remove();const t=this.descDiv.querySelector(".poll-time");t&&t.remove()}if(this.isClosed&&(this.classList.add("is-closed"),Object(T.a)(this.typeDiv,Object(x.i18n)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?Object(l.b)(this,this.clickHandler):Object(l.c)(this,this.clickHandler)),this.chosenIndexes.length||this.isRetracted||this.isClosed){const t=e.results.map(t=>e.total_voters?t.voters/e.total_voters*100:0);this.classList.toggle("no-transition",!s),s&&Object(Yt.a)(this,"",!this.isRetracted,340),Object(Fe.b)(()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,s),this.percents=t,this.isRetracted=!1})}if(this.setVotersCount(e),this.isPublic){this.isMultiple||(this.viewResults.classList.toggle("hide",!e.total_voters||!this.chosenIndexes.length),this.votersCountDiv.classList.toggle("hide",!!this.chosenIndexes.length));let t="";e.recent_voters.forEach((e,s)=>{t+=``}),this.avatarsDiv.innerHTML=t}if(this.isMultiple){const t=!!this.chosenIndexes.length,s=this.isClosed||t,i=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",s),this.viewResults.classList.toggle("hide",i),this.votersCountDiv.classList.toggle("hide",!s||!i)}}setResults(e,t,s){this.svgLines.forEach(e=>e.style.display=""),this.answerDivs.forEach((e,s)=>{e.classList.toggle("is-chosen",t.includes(s))});const i=Math.max(...e);if(this.maxPercents=e.map(e=>e/i),this.isRetracted)this.svgLines.forEach((e,t)=>{this.setLineProgress(t,-1)});else{const e=()=>{this.svgLines.forEach((e,t)=>{this.setLineProgress(t,1)})};s?Object(Fe.b)(e):e()}let n;e=e.slice(),Jt(e);const a=t=>{e.forEach((e,s)=>{const i=n(e,t);this.numberDivs[s].innerText=i+"%"})};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),s)for(let e=9,t=0;e>=0;--e,++t)setTimeout(()=>{a(e)},34*t);else a(0);else if(n=(e,t)=>Math.round(e/10*(t+1)),s)for(let e=0;e<10;++e)setTimeout(()=>{a(e)},34*e);else a(9);if(this.isRetracted){s&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach(e=>e.style.display="none")};s?setTimeout(()=>{this.classList.remove("is-retracting"),e()},340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let s,i=[t];s=this.isClosed?this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesResultEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesResultEmpty":this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesEmpty",Object(T.a)(this.votersCountDiv,Object(x.i18n)(s,i))}setLineProgress(e,t){const s=this.svgLines[e];-1===t?(s.style.strokeDasharray="",s.style.strokeDashoffset=""):(s.style.strokeDasharray=t*this.maxPercents[e]*is.MAX_LENGTH+", 485.9",s.style.strokeDashoffset=""+t*is.MAX_OFFSET)}}is.MAX_OFFSET=-46.5,is.MAX_LENGTH=0,customElements.define("poll-element",is);var ns=s(130),as=s(96),os=s(58),rs=s(98),ls=s(116),cs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const ds=new class{constructor(){this.storage=new rs.a(ls.a,"stickerSets"),this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.getAnimatedEmojiStickerSet(),a.default.addMultipleEventsListeners({updateNewStickerSet:e=>{this.saveStickerSet(e.stickerset,e.stickerset.set.id),a.default.dispatchEvent("stickers_installed",e.stickerset.set)}}),this.getGreetingStickersTimeout=window.setTimeout(()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)},5e3)}getGreetingSticker(e=!1){return this.getGreetingStickersTimeout&&(clearTimeout(this.getGreetingStickersTimeout),this.getGreetingStickersTimeout=void 0),this.getGreetingStickersPromise||(this.getGreetingStickersPromise=this.getStickersByEmoticon("👋⭐️",!1).then(e=>{if(!e.length)throw"NO_STICKERS";this.greetingStickers=e.slice(),this.greetingStickers.sort((e,t)=>Math.random()-Math.random())})),this.getGreetingStickersPromise.then(()=>{let t;return e||(t=this.greetingStickers.shift(),this.greetingStickers.push(t)),E.a.downloadDoc(this.greetingStickers[0]),t})}saveStickers(e){Object(f.d)(e,(t,s)=>{(t=E.a.saveDoc(t))?e[s]=t:e.splice(s,1)})}getStickerSet(e,t={}){return cs(this,void 0,void 0,(function*(){const s=e.id;return this.getStickerSetPromises[s]?this.getStickerSetPromises[s]:this.getStickerSetPromises[s]=new Promise(i=>cs(this,void 0,void 0,(function*(){var n;if(!t.overwrite){const e=yield this.storage.get(s);if(e&&(null===(n=e.documents)||void 0===n?void 0:n.length)&&(Date.now()-e.refreshTime<36e5||t.useCache))return this.saveStickers(e.documents),i(e),void delete this.getStickerSetPromises[s]}try{const n=yield ct.a.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e)}),a=t.saveById?s:n.set.id;this.saveStickerSet(n,a),i(n)}catch(e){i(null)}delete this.getStickerSetPromises[s]})))}))}getAnimatedEmojiStickerSet(){return this.getStickerSet({id:"emoji"},{saveById:!0})}getRecentStickers(){return cs(this,void 0,void 0,(function*(){const e=yield ct.a.invokeApiHashable("messages.getRecentStickers");return this.saveStickers(e.stickers),e}))}getAnimatedEmojiSticker(e){const t=this.storage.getFromCache("emoji");if(!t||!t.documents)return;e=e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"");const s=t.packs.find(t=>t.emoticon===e);return s?E.a.getDoc(s.documents[0]):void 0}preloadAnimatedEmojiSticker(e,t,s){return this.getAnimatedEmojiStickerSet().then(()=>{const i=this.getAnimatedEmojiSticker(e);if(i)return E.a.downloadDoc(i).then(ne.c).then(n=>cs(this,void 0,void 0,(function*(){const a=b.b.active.emojiSticker,o=Object(ie.d)(e),r=yield le.b.loadAnimationWorker({container:void 0,animationData:n,width:null!=t?t:a.width,height:null!=s?s:a.height},"none",o);r.addEventListener("firstFrame",()=>{E.a.saveLottiePreview(i,r.canvas,o),r.remove()},{once:!0})})))})}saveStickerSet(e,t){const s={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents};let i=this.storage.getFromCache(t);i?Object.assign(i,s):i=this.storage.setToCache(t,s),this.saveStickers(e.documents);const n=i.set.installed_date||"emoji"===t;i.refreshTime=Date.now(),this.storage.set({[t]:i},!n)}getStickerSetThumbDownloadOptions(e){var t;const s=e.thumbs.find(e=>"photoSize"===e._),i=e.thumb_dc_id,n=null===(t=e.pFlags)||void 0===t?void 0:t.animated;return{dcId:i,location:{_:"inputStickerSetThumb",stickerset:this.getStickerSetInput(e),thumb_version:e.thumb_version},size:s.size,mimeType:n?"application/x-tgsticker":"image/webp"}}getStickerSetInput(e){return"emoji"===e.id?{_:"inputStickerSetAnimatedEmoji"}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return cs(this,void 0,void 0,(function*(){const e=yield ct.a.invokeApiHashable("messages.getFeaturedStickers");return e.sets.forEach(e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)}),e.sets}))}toggleStickerSet(e){return cs(this,void 0,void 0,(function*(){if(e.installed_date){if(yield ct.a.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,a.default.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else{if(yield ct.a.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,a.default.dispatchEvent("stickers_installed",e),!0}return!1}))}searchStickerSets(e,t=!0){return cs(this,void 0,void 0,(function*(){const s=t?1:0,i=yield ct.a.invokeApiHashable("messages.searchStickerSets",{flags:s,exclude_featured:t||void 0,q:e});i.sets.forEach(e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)});const n=[],a=this.storage.getCache();for(let t in a){const{set:s}=a[t];s.title.toLowerCase().includes(e.toLowerCase())&&!i.sets.find(e=>e.set.id===s.id)&&n.push({_:"stickerSetCovered",set:s,cover:null})}return i.sets.concat(n)}))}getAllStickers(){return ct.a.invokeApiHashable("messages.getAllStickers")}preloadStickerSets(){return this.getAllStickers().then(e=>Promise.all(e.sets.map(e=>this.getStickerSet(e,{useCache:!0}))))}getStickersByEmoticon(e,t=!0){return e=J.b.fixEmoji(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([ct.a.invokeApiHashable("messages.getStickers",{emoticon:e}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then(([t,s,i])=>{const n=t.stickers.map(e=>E.a.saveDoc(e)),a=[],o=[],r=t=>{for(const s of t){if(J.b.fixEmoji(s.emoticon).includes(e))for(const e of s.documents){const t=E.a.getDoc(e);(t.animated?a:o).push(t)}}};if(i){r(i.packs);const e=i.stickers;[a,o].forEach(t=>{t.sort((t,s)=>e.indexOf(t)-e.indexOf(s))})}for(const e of s)r(e.packs);return[...new Set(a.concat(o,n))]})}pushRecentSticker(e){const t=J.b.fixEmoji(e.stickerEmojiRaw);for(const s in this.getStickersByEmoticonsPromises){this.getStickersByEmoticonsPromises[s].then(i=>{const n=i.findAndSplice(t=>t.id===e.id);n?i.unshift(n):s.includes(t)&&i.unshift(e)})}}};de.a.appStickersManager=ds;var hs=ds,us=s(60),ps=s(123),ms=s(126),gs=s(117),bs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};let vs=0;function fs({doc:e,container:t,message:s,boxWidth:i,boxHeight:n,withTail:o,isOut:r,middleware:d,lazyLoadQueue:h,noInfo:u,group:p,onlyPreview:m,withoutPreloader:g,loadPromises:v,noPlayButton:f,noAutoDownload:y,size:w,searchContext:S}){var L,M;const C=!(i&&n),k=("video"!==e.type||e.size<=52428800&&!C)&&("gif"===e.type?a.default.settings.autoPlay.gifs:a.default.settings.autoPlay.videos);let P,T;if(!u){P=document.createElement("span"),P.classList.add("video-time"),t.append(P);let s=!1;"gif"!==e.type?(P.innerText=(e.duration+"").toHHMMSS(!1),f||"round"===e.type||(k&&!y?P.classList.add("tgico","can-autoplay"):s=!0)):(P.innerText="GIF",k||f||(s=!0,y=void 0)),s&&(T=document.createElement("span"),T.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(T))}let x,A={};if("image/gif"===e.mime_type){const a=ws({photo:e,message:s,container:t,boxWidth:i,boxHeight:n,withTail:o,isOut:r,lazyLoadQueue:h,middleware:d,withoutPreloader:g,loadPromises:v,noAutoDownload:y,size:w});return A.thumb=a,A.loadPromise=a.loadPromises.full,A}const O=document.createElement("video");if(O.classList.add("media-video"),O.setAttribute("playsinline","true"),O.muted=!0,"round"===e.type){const i=document.createElement("div");i.classList.add("media-round","z-depth-1"),i.dataset.mid=""+s.mid,i.dataset.peerId=""+s.peerId,i.message=s;const n=b.b.active.round,a=n.width/2,o=3.5,r=a-2*o;i.innerHTML=`\n \n `;const d=i.firstElementChild.firstElementChild;vs||(vs=2*Math.PI*r),d.style.strokeDasharray=vs+" "+vs,d.style.strokeDashoffset=""+vs,P.classList.add("tgico");s.pFlags.media_unread&&i.classList.add("is-unread");const h=document.createElement("canvas");h.width=h.height=e.w,i.prepend(h,P),i.append(O),t.append(i);const u=h.getContext("2d"),p=()=>{const e=i.message,t=fe.addMedia(e,!y),s=()=>{(So.chat.setPeerPromise||Promise.resolve()).finally(()=>{Object(us.a)(t)||(t.removeEventListener("play",r),t.removeEventListener("timeupdate",o),t.removeEventListener("pause",p),t.removeEventListener("ended",m))})},n=()=>{u.drawImage(t,0,0);const e=vs-t.currentTime/t.duration*vs;return d.style.strokeDashoffset=""+e,!t.paused},a=()=>{t.duration&&(Object(us.a)(t)?(t.paused&&n(),P.innerText=(t.duration-t.currentTime+"").toHHMMSS(!1)):s())},o=_e(a),r=()=>{O.classList.add("hide"),i.classList.remove("is-paused"),Object(ns.a)(n,h),x&&x.preloader&&x.preloader.classList.contains("manual")&&x.onClick()},p=()=>{Object(us.a)(t)?i.classList.add("is-paused"):s()},m=()=>{O.classList.remove("hide"),i.classList.add("is-paused"),O.currentTime=0,P.innerText=(""+t.duration).toHHMMSS(!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",r),t.addEventListener("timeupdate",o),t.addEventListener("pause",p),t.addEventListener("ended",m),Object(l.b)(h,s=>{if(Object(c.a)(s),x&&!x.detached&&x.onClick(),t.paused){const s=!!S;if(fe.setSearchContext(S||{peerId:je.b,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=s?Re(i):[];fe.setTargets({peerId:e.peerId,mid:e.mid},t,n)}t.play()}else t.pause()}),t.paused?t.duration&&t.currentTime!==t.duration&&t.currentTime>0?(n(),a(),O.classList.add("hide")):p():r()};s.pFlags.is_outgoing?(i.onLoad=p,i.dataset.isOutgoing="1"):p()}else O.autoplay=!0;let F;if(s){if(F=ws({photo:e,message:s,container:t,boxWidth:i,boxHeight:n,withTail:o,isOut:r,lazyLoadQueue:h,middleware:d,withoutPreloader:!0,loadPromises:v,noAutoDownload:y,size:w}),A.thumb=F,!k&&"gif"!==e.type||m)return A.loadPromise=F.loadPromises.full,A;if(o){const e=(F.images.thumb||F.images.full).parentElement;O.width=+e.getAttributeNS(null,"width"),O.height=+e.getAttributeNS(null,"height"),e.append(O)}}else{const t=E.a.getThumb(e,!1);t&&t.promise.then(()=>{O.poster=t.cacheContext.url})}!O.parentElement&&t&&((null==F?void 0:F.aspecter)||t).append(O);const _=he.a.getCacheContext(e),j=!!(null===(L=null==s?void 0:s.media)||void 0===L?void 0:L.preloader);j?(x=s.media.preloader,x.attach(t,!1),y=void 0):_.downloaded||e.supportsStreaming?e.supportsStreaming&&(x=new ye.a({cancelable:!1,attachMethod:"prepend"})):x=new ye.a({attachMethod:"prepend"});const D=Object(ae.a)();O.addEventListener("error",e=>{4!==O.error.code&&console.error("Error "+O.error.code+"; details: "+O.error.message),x&&!j&&x.detach(),D.isFulfilled||D.resolve()},{once:!0}),Object(me.e)(O).then(()=>{p&&I.a.addAnimation(O,p),x&&!j&&x.detach(),D.resolve()}),"video"===e.type&&O.addEventListener("timeupdate",()=>{P.innerText=(O.duration-O.currentTime+"").toHHMMSS(!1)}),O.muted=!0,O.loop=!0,O.autoplay=!0;let B=y&&(null===(M=null==F?void 0:F.preloader)||void 0===M?void 0:M.loadFunc);const R=()=>{x&&y&&!g&&(x.construct(),x.setManual());let i=Promise.resolve();if(x&&!j)if(_.downloaded||e.supportsStreaming)e.supportsStreaming&&(y?i=Promise.reject():_.downloaded||(x.attach(t,!1,null),O.addEventListener(re.IS_SAFARI?"timeupdate":"canplay",()=>{x.detach()},{once:!0})));else{const s=i=E.a.downloadDoc(e,null==h?void 0:h.queueId,y);x.attach(t,!1,s)}return!y&&B&&(B(),B=null),y=void 0,i.then(()=>{!d||d()?("round"===e.type&&fe.resolveWaitingForLoadMedia(s.peerId,s.mid,s.pFlags.is_scheduled),Object(as.a)(O,_.url)):D.resolve()},()=>{}),{download:i,render:D}};return x&&!j&&x.setDownloadFunction(R),"gif"!==e.type||k?A.loadPromise=h?(h.push({div:t,load:()=>R().render}),Promise.resolve()):R().render:Object(l.b)(t,e=>{Object(c.a)(e),T.remove(),R()},{capture:!0,once:!0}),A}function ys({message:e,withTime:t,fontWeight:s,voiceAsMusic:n,showSender:o,searchContext:c,loadPromises:d,noAutoDownload:h,lazyLoadQueue:u}){var p,g;s||(s=500);const b=e.media.document||e.media.webpage.document,v=e.pFlags.is_outgoing&&(null===(p=e.media)||void 0===p?void 0:p.preloader);if("audio"===b.type||"voice"===b.type||"round"===b.type){const i=new Ue;return i.withTime=t,i.message=e,i.noAutoDownload=h,i.lazyLoadQueue=u,i.loadPromises=d,n&&(i.voiceAsMusic=n),c&&(i.searchContext=c),o&&(i.showSender=o),v&&(i.preloader=e.media.preloader),i.dataset.fontWeight=""+s,i.render(),i}let f=b.file_name?b.file_name.split("."):"",y="";y=f.length>1&&Array.isArray(f)?Object(ps.a)(f.pop().split(" ",1)[0].toLowerCase()):"file";let w=document.createElement("div");w.classList.add("document","ext-"+y),w.dataset.docId=""+b.id;const S=document.createElement("div");S.classList.add("document-ico");const L=he.a.getCacheContext(b);if((null===(g=b.thumbs)||void 0===g?void 0:g.length)||e.pFlags.is_outgoing&&L.url&&"photo"===b.type){w.classList.add("document-with-thumb");let t=[];if(e.pFlags.is_outgoing)S.innerHTML=``,t.push(S.firstElementChild);else{const e=ws({photo:b,message:null,container:S,boxWidth:54,boxHeight:54,loadPromises:d,withoutPreloader:!0,lazyLoadQueue:u,size:r.a.choosePhotoSize(b,54,54,!0)});S.style.width=S.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 S.innerText=y;let I=b.fileName||"Unknown.file";document.createElement("div").classList.add("document-description");const C=[Object(M.b)(b.size)];t&&C.push(Object(oe.d)(e.date)),o&&C.push(i.a.wrapSenderToPeer(e)),w.innerHTML=`\n ${L.downloaded&&!v?"":'
'}\n
\n
\n `;const k=w.querySelector(".document-name"),P=new xe.a;P.dataset.fontWeight=""+s,P.innerHTML=I,k.append(P),o&&k.append(i.a.wrapSentTime(e));if(w.querySelector(".document-size").append(...Object(x.joinElementsWith)(C," · ")),w.prepend(S),!v&&e.pFlags.is_outgoing)return w;let T,A=null;const O=()=>{if(T){T.classList.add("downloaded");const e=T;setTimeout(()=>{e.remove()},200),T=null}A&&(A=null)},F=e=>{var t;const s=!e||e.isTrusted,i=E.a.getDoc(w.dataset.docId);let n;const o=So.chat.bubbles?So.chat.bubbles.lazyLoadQueue.queueId:void 0;return s?"pdf"===i.type?(n=E.a.downloadDoc(i,o),n.then(()=>{setTimeout(()=>{const e=he.a.getCacheContext(i).url;window.open(e)},a.default.settings.animationsEnabled?250:0)})):n=m.has(i.mime_type)&&(null===(t=i.thumbs)||void 0===t?void 0:t.length)?E.a.downloadDoc(i,o):E.a.saveDocFile(i,o):n=E.a.downloadDoc(i,o),T&&(n.then(O),A.attach(T,!0,n)),{download:n}};return E.a.downloading.has(b.id)?(T=w.querySelector(".document-download"),A=new ye.a,A.attach(T,!1,E.a.downloading.get(b.id))):L.downloaded&&!v||(T=w.querySelector(".document-download"),A=e.media.preloader,A?(A.attach(T),e.media.promise.then(O)):(A=new ye.a,A.construct(),A.setManual(),A.attach(T),A.setDownloadFunction(F))),Object(l.b)(w,e=>{A?A.onClick(e):F(e)}),w}function ws({photo:e,message:t,container:s,boxWidth:i,boxHeight:n,withTail:o,isOut:l,lazyLoadQueue:c,middleware:d,size:h,withoutPreloader:u,loadPromises:p,noAutoDownload:m,noBlur:g,noThumb:v,noFadeIn:f,blurAfter:y}){var w;if(!e.sizes&&!e.thumbs)return i&&n&&!h&&"document"===e._&&r.a.setAttachmentSize(e,s,i,n,void 0,t),{loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null};h||(void 0===i&&(i=b.b.active.regular.width),void 0===n&&(n=b.b.active.regular.height)),s.classList.add("media-container");let S,L,I,M=s,C=!0,k=Promise.resolve();const P="document"===e._&&"image/gif"===e.mime_type&&!h;if(L=new Image,i&&n&&!h){const a=r.a.setAttachmentSize(e,s,i,n,void 0,t,void 0,P?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:"full"}:void 0);if(h=a.photoSize,C=a.isFit,I=he.a.getCacheContext(e,h.type),!C){M=document.createElement("div"),M.classList.add("media-container-aspecter"),M.style.width=a.size.width+"px",M.style.height=a.size.height+"px";const i=r.a.getStrippedThumbIfNeeded(e,I,!g,!0);if(i){k=i.loadPromise;const e=i.image;e.classList.add("media-photo"),s.append(e)}else{ws({container:s,message:t,photo:e,boxWidth:0,boxHeight:0,size:h,lazyLoadQueue:c,isOut:l,loadPromises:p,middleware:d,withoutPreloader:u,withTail:o,noAutoDownload:m,noBlur:g,noThumb:!0,blurAfter:!0}).images.full.classList.add("media-photo","thumbnail")}s.classList.add("media-container-fitted"),s.append(M)}}else h||(h=r.a.choosePhotoSize(e,i,n,!0)),I=he.a.getCacheContext(e,null==h?void 0:h.type);if(!v){const t=r.a.getStrippedThumbIfNeeded(e,I,!g);t&&(k=Promise.all([k,t.loadPromise]),S=t.image,S.classList.add("media-photo"),M.append(S))}L.classList.add("media-photo");const T=(S||!I.downloaded)&&a.default.settings.animationsEnabled&&!f;let x;(null===(w=null==t?void 0:t.media)||void 0===w?void 0:w.preloader)&&!u?(x=t.media.preloader,x.attach(s),m=void 0):I.downloaded||(x=new ye.a({attachMethod:"prepend"}));const A=e=>Ss(s,L,e,T,M,S),O=()=>d&&!d()?Promise.resolve():y?Object(ms.a)(I.url,12).then(e=>A(e)):A(I.url);let F;const _=h.w>=150&&h.h>=150||m,j=()=>{m&&!u&&x&&(x.construct(),x.setManual());const t=P&&!h?E.a.downloadDoc(e,null==c?void 0:c.queueId):r.a.preloadPhoto(e,h,null==c?void 0:c.queueId,m);x&&!I.downloaded&&!u&&_&&x.attach(s,!1,t),m=void 0;const i=t.then(O);return i.catch(()=>{}),{download:t,render:i}};return x&&x.setDownloadFunction(j),I.downloaded?k=F=j().render:c?c.push({div:s,load:()=>j().download}):F=j().render,p&&k&&p.push(k),{loadPromises:{thumb:k,full:F||Promise.resolve()},images:{thumb:S,full:L},preloader:x,aspecter:M}}function Ss(e,t,s,i,n=e,a){return i&&t.classList.add("fade-in"),new Promise(o=>{Object(as.a)(t,s,()=>{os.a.mutateElement(e,()=>{n.append(t),Object(Fe.b)(()=>{o()}),i&&t.addEventListener("animationend",()=>{os.a.mutate(()=>{t.classList.remove("fade-in"),a&&a.remove()})},{once:!0})})})})}function Ls({doc:e,div:t,middleware:s,lazyLoadQueue:i,group:n,play:o,onlyThumb:d,emoji:h,width:u,height:p,withThumb:m,loop:g,loadPromises:b,needFadeIn:v}){var f;const y=e.sticker;if(u||(u=h?void 0:200),p||(p=h?void 0:200),2!==y||le.b.loaded||le.b.loadLottieWorkers(),!y)throw console.error("wrong doc for wrapSticker!",e),new Error("wrong doc for wrapSticker!");t.dataset.docId=""+e.id,t.classList.add("media-sticker-wrapper");const w=he.a.getCacheContext(e),S=h?Object(ie.d)(h):-1,L=w.downloaded&&!v;let I=Object(ae.a)(),M=!1;if(((null===(f=e.thumbs)||void 0===f?void 0:f.length)||e.stickerCachedThumbs)&&!t.firstElementChild&&(!L||2===y||d)){let n,a=e.stickerCachedThumbs&&e.stickerCachedThumbs[S]||e.thumbs[0];const o=()=>{t.childElementCount||(n.classList.add("media-sticker","thumbnail"),os.a.mutateElement(t,()=>{t.append(n),I.resolve()}))};if("url"in a)n=new Image,Object(as.a)(n,a.url,o),M=!0;else if("bytes"in a){if("photoPathSize"===a._)if(a.bytes.length){const s=r.a.getPathFromPhotoPathSize(a);t.innerHTML=`\n \n `}else a=e.thumbs.find(e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length})||a;a&&"photoPathSize"!==a._&&S<=0&&(n=new Image,gs.a||e.pFlags.stickerThumbConverted||w.url?(Object(as.a)(n,r.a.getPreviewURLFromThumb(e,a,!0),o),M=!0):ce.a.convert(""+e.id,a.bytes).then(i=>{a.bytes=i,e.pFlags.stickerThumbConverted=!0,s&&!s()||t.childElementCount||Object(as.a)(n,r.a.getPreviewURLFromThumb(e,a,!0),o)}).catch(()=>{}))}else if(2===y&&(m||d)&&S<=0){n=new Image;const r=()=>{if(t.childElementCount||s&&!s())return;const i=()=>{t.childElementCount||s&&!s()||Object(as.a)(n,w.url,o)};return w.url?(i(),Promise.resolve()):E.a.getThumbURL(e,a).promise.then(i)};if(i&&d)return i.push({div:t,load:r}),Promise.resolve();r(),a.url&&(M=!0)}}if(b&&M&&b.push(I),d)return Promise.resolve();const C=()=>bs(this,void 0,void 0,(function*(){if(!s||s())if(2===y)yield E.a.downloadDoc(e,null==i?void 0:i.queueId).then(ne.c).then(i=>bs(this,void 0,void 0,(function*(){if(s&&!s())return;let r=yield le.b.loadAnimationWorker({container:t,loop:g&&!h,autoplay:o,animationData:i,width:u,height:p},n,S);r.addEventListener("firstFrame",()=>{const s=t.firstElementChild;v=(v||!s||"svg"===s.tagName)&&a.default.settings.animationsEnabled;const i=()=>{s&&s!==r.canvas&&s.remove()};v?os.a.mutate(()=>{r.canvas.classList.add("fade-in"),s&&s.classList.add("fade-out"),r.canvas.addEventListener("animationend",()=>{os.a.mutate(()=>{r.canvas.classList.remove("fade-in"),i()})},{once:!0})}):s&&os.a.mutate(i),E.a.saveLottiePreview(e,r.canvas,S)},{once:!0}),h&&Object(l.b)(t,e=>{Object(c.a)(e);let s=le.b.getAnimation(t);s.paused&&(s.autoplay=!0,s.restart())})})));else if(1===y){const n=new Image,o=t.firstElementChild!==n&&t.firstElementChild;return v=(v||!L||o)&&a.default.settings.animationsEnabled,n.classList.add("media-sticker"),v&&n.classList.add("fade-in"),new Promise((a,r)=>{const l=()=>{if(s&&!s())return a();Object(as.a)(n,w.url,()=>{os.a.mutateElement(t,()=>{t.append(n),o&&o.classList.add("fade-out"),a(),v&&n.addEventListener("animationend",()=>{n.classList.remove("fade-in"),o&&o.remove()},{once:!0})})})};w.url?l():E.a.downloadDoc(e,null==i?void 0:i.queueId).then(l,a)})}})),k=!i||L&&2!==y?C():(i.push({div:t,load:C}),Promise.resolve());return L&&1===y&&(I=k,b&&b.push(I)),k}function Es({set:e,lazyLoadQueue:t,container:s,group:i,autoplay:n,width:a,height:o}){var r;return bs(this,void 0,void 0,(function*(){if(null===(r=e.thumbs)||void 0===r?void 0:r.length)return s.classList.add("media-sticker-wrapper"),void t.push({div:s,load:()=>{const t=hs.getStickerSetThumbDownloadOptions(e),r=he.a.download(t);if(e.pFlags.animated)return r.then(ne.c).then(e=>{le.b.loadAnimationWorker({container:s,loop:!0,autoplay:n,animationData:e,width:a,height:o,needUpscale:!0},i)});{const e=new Image;return e.classList.add("media-sticker"),r.then(t=>{Object(as.a)(e,URL.createObjectURL(t),()=>{s.append(e)})})}}});const l=hs.getStickerSet(e),c=yield l;"documentEmpty"!==c.documents[0]._&&Ls({doc:c.documents[0],div:s,group:i,lazyLoadQueue:t})}))}function Is(e,t,s){const i=new ze("reply");return i.fill(e,t,s),i.container}function Ms(e){const t=new Qe(e.items,e.maxWidth,e.minWidth,e.spacing,e.maxHeight).layout(),s=t.find(e=>e.sides&Ke),i=s.geometry.width+s.geometry.x,n=t.find(e=>e.sides&Ge),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=i+"px",o.style.height=a+"px";const r=o.children;t.forEach(({geometry:t,sides:s},n)=>{let l;if(l=r[n],l||(l=document.createElement("div"),o.append(l)),l.classList.add("album-item","grouped-item"),l.style.width=t.width/i*100+"%",l.style.height=t.height/a*100+"%",l.style.top=t.y/a*100+"%",l.style.left=t.x/i*100+"%",s&qe&&s&We&&(l.style.borderTopLeftRadius="inherit"),s&qe&&s&Ge&&(l.style.borderBottomLeftRadius="inherit"),s&Ke&&s&We&&(l.style.borderTopRightRadius="inherit"),s&Ke&&s&Ge&&(l.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),l.append(e)}})}function Cs({groupId:e,attachmentDiv:t,middleware:s,uploading:n,lazyLoadQueue:a,isOut:o,chat:l,loadPromises:c,noAutoDownload:d}){const h=[],u=i.a.getMidsByAlbum(e);for(const e of u){const t=l.getMessage(e),s=t.media.photo||t.media.document,i="photo"===s._?r.a.choosePhotoSize(s,480,480):{w:s.w,h:s.h};h.push({size:i,media:s,message:t})}Ms({container:t,items:h.map(e=>({w:e.size.w,h:e.size.h})),maxWidth:b.b.active.album.width,minWidth:100,spacing:2,forMedia:!0}),h.forEach((e,i)=>{const{size:n,media:r,message:l}=e,h=t.children[i];h.dataset.mid=""+l.mid,h.dataset.peerId=""+l.peerId;const u=h.firstElementChild;"photo"===r._?ws({photo:r,message:l,container:u,boxWidth:0,boxHeight:0,isOut:o,lazyLoadQueue:a,middleware:s,size:n,loadPromises:c,noAutoDownload:d}):fs({doc:l.media.document,container:u,message:l,boxWidth:0,boxHeight:0,withTail:!1,isOut:o,lazyLoadQueue:a,middleware:s,loadPromises:c,noAutoDownload:d})})}b.b.addEventListener("changeScreen",(e,t)=>{if(t===b.a.mobile||e===b.a.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=b.b.active.round.width,s=t/2,i=s-7;vs=2*Math.PI*i,e.forEach(e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+s),n.setAttributeNS(null,"cy",""+s),n.setAttributeNS(null,"r",""+i),n.style.strokeDasharray=vs+" "+vs,n.style.strokeDashoffset=""+vs})}}),a.default.addEventListener("download_start",e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach(e=>{e.querySelector(".preloader-container.manual")&&Object(l.d)(e)})});var ks=s(82),Ps=s(108),Ts=s(83);function xs(e,t,s,i){return void 0===i&&(i=e.parentElement===t?Object(Ts.a)(e):-1),i!==s&&(-1!==i&&is?t.insertBefore(e,t.children[s]):t.append(e):t.prepend(e),!0)}class As{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),this.middleware=Object(Ps.a)(),Object(w.g)(this,e),this.elements=new Map,this.sorted=[]}clear(){this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach(e=>{this.update(e.id,!0)}),this.onSort&&this.sorted.forEach((e,t)=>{this.onSort(e,t)})}updateList(e){const t=this.middleware.get();this.updateListWith(s=>{if(!t()||void 0!==s&&!s)return e(!1);this._updateList(),e(!0)})}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e,t=!1,s,i=t){let n=this.get(e);if(n)return n;const a={id:e,index:0};return n=this.onElementCreate(a,t),this.elements.set(e,n),this.update(e,i,n,s),n}delete(e,t){const s=this.elements.get(e);if(!s)return!1;this.elements.delete(e);const i=this.sorted.indexOf(s);if(-1!==i&&this.sorted.splice(i,1),this.onDelete)if(t)this.onDelete(s);else{const e=this.middleware.get();this.updateElementWith(()=>{e()&&this.onDelete(s)})}return!0}update(e,t=!1,s=this.get(e),i){if(!s)return;s.index=this.getIndex(e),this.onUpdate&&this.onUpdate(s);const n=Object(f.f)(this.sorted,s,"index");if(!t&&this.onSort){const e=this.middleware.get();(i||this.updateElementWith)(()=>{e()&&this.onSort(s,n)})}}}var Os=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Fs extends As{constructor(e={}){let t;super({getIndex:e=>k.a.getUserStatusForSort(e),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e=>{const t=k.a.getUserStatusString(e.id);Object(T.a)(e.dom.lastMessageSpan,t)},onSort:(e,t)=>{const s=e.dom.listEl.parentElement!==this.list;xs(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=Vo.addDialogNew({dialog:e.id,container:!1,drawStatus:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});return e.dom=t,e},updateElementWith:Fe.b,updateListWith:e=>Os(this,void 0,void 0,(function*(){return Object(us.a)(this.list)?(yield Object(ks.c)(),Object(us.a)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize=48,this.rippleEnabled=!0,this.autonomous=!0,Object(w.g)(this,e),this.list=Vo.createChatList({new:e.new});const s=()=>{t=window.setTimeout(()=>{this.updateList(e=>{e&&s()})},Fs.SORT_INTERVAL)};s()}}Fs.SORT_INTERVAL=3e4;var _s=s(71);function js(e){let t=!1;return new Nt(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!Object(Ce.a)(t.target,"progress-line")&&!Object(_s.a)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(s,i,n)=>{if(!t&&Math.abs(i)>20)return!0;if(Math.abs(s)>Math.abs(i))Object(c.a)(n),t=!0;else if(!t&&Math.abs(i)>Math.abs(s))return!0;return e.onSwipe(s,i,n)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}function Ds(e){return js(Object.assign(Object.assign({},e),{onSwipe:(t,s,i)=>{if(Math.abs(t)>50)return e.onSwipe(t,s,i),Object(te.b)(),!0}}))}var Bs=s(106),Rs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Us extends Mt{constructor(e,t,s=!1){super({peerTypes:["dialogs","contacts"],onSelect:s?t:s=>Rs(this,void 0,void 0,(function*(){if(t){const e=t(s);e instanceof Promise&&(yield e)}So.setInnerPeer(s),So.chat.input.initMessagesForward(e)})),placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}class Hs{constructor(e,t,s,n){const r=new wt.a({peerId:e}).element;t=t.slice();const l=(a,o)=>{n&&n(),"scheduled"===s?i.a.deleteScheduledMessages(e,t):i.a.deleteMessages(e,t,!!a.size||o)};let c,d,h,u,p,m=[];if(1===t.length?c="DeleteSingleMessagesTitle":(c="DeleteMessagesTitle",d=[Object(x.i18n)("messages",[t.length])]),h=o.a.isMegagroup(e)?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",p=[{langKey:"Delete",isDanger:!0,callback:l}],e===a.default.myId||"scheduled"===s);else if(e.isUser())m.push({text:"DeleteMessagesOptionAlso",textArgs:[r]});else{const s=K.a.getChat(e.toChatId()),n=K.a.hasRights(e.toChatId(),"delete_messages");if("chat"===s._){const s=n?t.slice():t.filter(t=>i.a.getMessageByPeer(e,t).fromId===a.default.myId);s.length&&(s.length===t.length?m.push({text:"DeleteForAll"}):(m.push({text:"DeleteMessagesOption"}),h="DeleteMessagesTextGroup",u=[Object(x.i18n)("messages",[s.length])]))}else p[0].callback=e=>l(e,!0)}Object(ht.a)(p);new pt("popup-delete-chat",{peerId:e,titleLangKey:c,titleLangArgs:d,descriptionLangKey:h,descriptionLangArgs:u,buttons:p,checkboxes:m}).show()}}var Ns=s(133);class zs{constructor(e,t,s){let n,a,o=[];n=`Send Message${t.length>1?"s":""} Now`,a=t.length>1?"Send "+t.length+" messages now?":"Send message now?";o.push({langKey:"Send",callback:()=>{s&&s(),i.a.sendScheduledMessages(e,t)}});new pt("popup-delete-chat",{peerId:e,title:n,description:a,buttons:o}).show()}}var Vs=s(7);function Ws(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}var Ks=s(105);const Gs=e=>[...e.values()].reduce((e,t)=>e+t.size,0);class qs{constructor(e){if(this.selectedMids=new Map,this.isSelecting=!1,this.cancelSelection=()=>{this.onCancelSelection&&this.onCancelSelection(),this.selectedMids.clear(),this.toggleSelection(),Ws()},Object(w.g)(this,e),this.navigationType="multiselect-"+Object(it.b)(),pe.IS_TOUCH_SUPPORTED)return this.listenerSetter.add(this.listenElement)("touchend",()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")}),void Object(te.a)(this.listenElement,e=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),this.listenElement.addEventListener("touchend",e=>{Object(c.a)(e),document.body.classList.remove("no-select")},{once:!0,capture:!0}),Ws();const t=this.getElementFromTarget(e.target);t&&this.toggleByElement(t)},this.listenerSetter);const t=(e,t)=>{if(e===t)return[];const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),n=(s.top-i.top||s.left-i.left)<0,a=Object(Ce.a)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),l=o.indexOf(t);n||([l,r]=[r,l]);return o.slice(r+1,l)};this.listenerSetter.add(this.listenElement)("mousedown",e=>{const s=Object(Ce.a)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,s))return;const i=new Map;let n,a=s;const o=(e,s=!0)=>{const r=+e.dataset.mid;if(!r||!e.dataset.peerId)return;const l=e.dataset.peerId.toPeerId();Object(us.a)(a)||(a=e);let c=i.get(l);if(c||i.set(l,c=new Set),!c.has(r)){const d=this.isMidSelected(l,r);if(void 0===n&&(n=!d),c.add(r),n&&!d||!n&&d){const n=Gs(i);if(this.toggleByElement&&s){n<2&&Object(Ks.a)(e,a)&&(a=e);const s=t(a,e);s.length&&s.forEach(e=>{o(e,!1)})}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===n&&this.toggleByMid)for(const[e,t]of i)for(const s of t)this.toggleByMid(e,s)}}};let r=!1;const d=e=>{r||(Ws(),r=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,n)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",d),void this.listenerSetter.removeManual(document,"mouseup",h,u)):void o(t)},h=e=>{i.size&&Object(l.b)(window,c.a,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",d),Ws()},u={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",d),this.listenerSetter.add(document)("mouseup",h,u)})}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const s=!!this.getCheckboxInputFromElement(e);if(t){if(s)return!1;const t=new ut.a({name:e.dataset.mid,round:!0});this.isSelecting&&this.isElementShouldBeSelected(e)&&(t.input.checked=!0,e.classList.add("is-selected")),this.appendCheckbox(e,t)}else s&&this.getCheckboxInputFromElement(e).parentElement.remove();return!0}getCheckboxInputFromElement(e){var t;return"LABEL"===(null===(t=e.firstElementChild)||void 0===t?void 0:t.tagName)&&e.firstElementChild.firstElementChild}updateContainer(e=!1){const t=this.selectedMids.size;if(!t&&!e)return;let s=!t,i=!t,n=!t;for(const[e,t]of this.selectedMids){const n=this.isScheduled?this.appMessagesManager.getScheduledMessagesStorage(e):this.appMessagesManager.getMessagesStorage(e);for(const e of t){const t=this.appMessagesManager.getMessageFromStorage(n,e);if(s||t.action&&(s=!0),!i){this.appMessagesManager.canDeleteMessage(t)||(i=!0)}if(s&&i)break}if(s&&i)break}this.onUpdateContainer&&this.onUpdateContainer(s,i,n)}toggleSelection(e=!0,t=!1){const s=this.isSelecting,i=this.selectedMids.size;if(this.isSelecting=!!i||t,s===this.isSelecting)return!1;pe.IS_TOUCH_SUPPORTED||(this.listenElement.classList.toggle("no-select",this.isSelecting),s&&Ws()),Object(Vs.a)();const n=!!i||t;return this.onToggleSelection&&this.onToggleSelection(n),re.IS_MOBILE_SAFARI||(n?D.a.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):D.a.removeByType(this.navigationType)),t&&this.updateContainer(t),!0}cleanup(){this.selectedMids.clear(),this.toggleSelection(!1)}updateElementSelection(e,t){this.toggleElementCheckbox(e,!0);this.getCheckboxInputFromElement(e).checked=t,this.toggleSelection(),this.updateContainer(),Object(Yt.a)(e,"is-selected",t,200)}isMidSelected(e,t){const s=this.selectedMids.get(e);return null==s?void 0:s.has(t)}length(){return Gs(this.selectedMids)}toggleMid(e,t,s){let i=this.selectedMids.get(e);if(s||void 0===s&&(null==i?void 0:i.has(t)))i&&(i.delete(t),i.size||this.selectedMids.delete(e));else{if(a.default.config.forwarded_count_max-this.length()-1<0)return ot(x.default.format("Chat.Selection.LimitToast",!0)),!1;i||(i=new Set,this.selectedMids.set(e,i)),i.add(t)}return!0}deleteSelectedMids(e,t){const s=this.selectedMids.get(e);s&&(t.forEach(e=>{s.delete(e)}),s.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class Qs extends qs{constructor(e,t){super({appMessagesManager:t,listenElement:e.container,listenerSetter:new R.a,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>Object(Ce.a)(e,"search-super-item"),targetLookupClassName:"search-super-item",lookupBetweenParentClassName:"tabs-tab",lookupBetweenElementsQuery:".search-super-item"}),this.searchSuper=e,this.toggleByElement=e=>{const t=+e.dataset.mid,s=e.dataset.peerId.toPeerId();this.toggleMid(s,t)&&this.updateElementSelection(e,this.isMidSelected(s,t))},this.toggleByMid=(e,t)=>{const s=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(s)},this.onUpdateContainer=(e,t,s)=>{const i=this.length();Object(T.a)(this.selectionCountEl,Object(x.i18n)("messages",[i])),this.selectionGotoBtn.classList.toggle("hide",1!==i),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=e=>{if(Object(Yt.a)(this.searchSuper.navScrollableContainer,"is-selecting",e,200,()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)}),Object(Yt.a)(this.searchSuper.container,"is-selecting",e,200),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=H(`close ${e}-cancel`,{noRipple:!0});this.listenerSetter.add(t)("click",this.cancelSelection,{once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=H(`message ${e}-goto`);const s={listenerSetter:this.listenerSetter};Object(l.b)(this.selectionGotoBtn,()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),a.default.dispatchEvent("history_focus",{peerId:e,mid:t})},s),this.selectionForwardBtn=H(`forward ${e}-forward`),Object(l.b)(this.selectionForwardBtn,()=>{const e={};for(const[t,s]of this.selectedMids)e[t]=Array.from(s).sort((e,t)=>e-t);new Us(e,()=>{this.cancelSelection()})},s),this.isPrivate&&(this.selectionDeleteBtn=H(`delete danger ${e}-delete`),Object(l.b)(this.selectionDeleteBtn,()=>{const e=[...this.selectedMids.keys()][0];new Hs(e,[...this.selectedMids.get(e)],"chat",()=>{this.cancelSelection()})},s)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const i=this.selectionContainer;i.style.opacity="0",this.searchSuper.navScrollableContainer.append(i),i.offsetLeft,i.style.opacity=""}},this.isPrivate=!e.showSender}toggleSelection(e=!0,t=!1){const s=super.toggleSelection(e,t);if(s&&e){Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach(e=>{this.toggleElementCheckbox(e,this.isSelecting)})}return s}}class $s extends qs{constructor(e,t,s,i){super({appMessagesManager:i,listenElement:t.bubblesContainer,listenerSetter:t.listenerSetter,getElementFromTarget:e=>Object(Ce.a)(e,"grouped-item")||Object(Ce.a)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,s)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===s&&!this.selectedMids.size),verifyTouchLongPress:()=>!this.chat.input.recording,targetLookupClassName:"bubble",lookupBetweenParentClassName:"bubbles-inner",lookupBetweenElementsQuery:".bubble:not(.is-multiple-documents), .grouped-item",isScheduled:"scheduled"===e.type}),this.chat=e,this.bubbles=t,this.input=s,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const e=this.selectedMids.get(this.bubbles.peerId);if(e){this.chat.getMidsByMid(t).forEach(t=>e.delete(t))}}return void this.bubbles.getBubbleGroupedItems(e).forEach(this.toggleByElement)}if(!this.toggleMid(this.bubbles.peerId,t))return;if(e.classList.contains("grouped-item")){const s=Object(Ce.a)(e,"bubble"),i=this.isGroupedBubbleSelected(s),n=this.isGroupedMidsSelected(t);(n||i)&&this.updateElementSelection(s,n)}this.updateElementSelection(e,this.isMidSelected(this.bubbles.peerId,t))},this.toggleByMid=(e,t)=>{const s=this.bubbles.getMountedBubble(t);s&&this.toggleByElement(s.bubble)},this.onToggleSelection=e=>{let t="",s="";if(e){const e=this.input.rowsWrapper.parentElement,i=e.querySelector(".fake-selection-wrapper"),n=e.querySelector(".fake-rows-wrapper"),a=i.getBoundingClientRect(),o=n.getBoundingClientRect(),r=o.width,l=a.width;if(r!==l){const e=l/r,i=(r-l)/2;if(t=`translateX(${a.left-o.left-i}px) scaleX(${e})`,e<1){const t=12;s=t+t*(1-e)+"px"}}}if(Object(Yt.a)(this.input.rowsWrapper,"is-centering",e,200),this.input.rowsWrapper.style.transform=t,this.input.rowsWrapper.style.borderRadius=s,Object(Yt.a)(this.listenElement,"is-selecting",e,200,()=>{this.isSelecting||(this.selectionInputWrapper.remove(),this.selectionInputWrapper=this.selectionContainer=this.selectionSendNowBtn=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0),Object(Fe.b)(()=>{this.bubbles.onScroll()})}),this.isSelecting&&!this.selectionContainer){this.selectionInputWrapper=document.createElement("div"),this.selectionInputWrapper.classList.add("chat-input-wrapper","selection-wrapper"),this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add("selection-container");const e={listenerSetter:this.listenerSetter},t=H("close",{noRipple:!0});Object(l.b)(t,this.cancelSelection,{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=Object(U.a)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append(Object(x.i18n)("MessageScheduleSend")),Object(l.b)(this.selectionSendNowBtn,()=>{new zs(this.bubbles.peerId,[...this.selectedMids.get(this.bubbles.peerId)],()=>{this.cancelSelection()})},e)):(this.selectionForwardBtn=Object(U.a)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append(Object(x.i18n)("Forward")),Object(l.b)(this.selectionForwardBtn,()=>{const e={};for(const[t,s]of this.selectedMids)e[t]=Array.from(s).sort((e,t)=>e-t);new Us(e,()=>{this.cancelSelection()})},e)),this.selectionDeleteBtn=Object(U.a)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append(Object(x.i18n)("Delete")),Object(l.b)(this.selectionDeleteBtn,()=>{new Hs(this.bubbles.peerId,[...this.selectedMids.get(this.bubbles.peerId)],this.chat.type,()=>{this.cancelSelection()})},e),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.rowsWrapper.parentElement.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity=""}},this.onUpdateContainer=(e,t,s)=>{Object(T.a)(this.selectionCountEl,Object(x.i18n)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",s),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>{for(const[e,t]of this.selectedMids)for(const e of t){const t=this.bubbles.getMountedBubble(e);t&&this.toggleByElement(t.bubble)}}}appendCheckbox(e,t){t.label.classList.add("bubble-select-checkbox"),e.classList.contains("document-container")?e.querySelector(".document, audio-element").append(t.label):super.appendCheckbox(e,t)}toggleSelection(e=!0,t=!1){const s=super.toggleSelection(e,t);if(s&&e)for(const e in this.bubbles.bubbles){const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return s}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const s=super.toggleElementCheckbox(e,t);if(s){e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach(e=>this.toggleElementCheckbox(e,t))}return s}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(+e.dataset.mid))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}isGroupedMidsSelected(e){const t=this.chat.getMidsByMid(e),s=t.filter(e=>this.isMidSelected(this.bubbles.peerId,e));return t.length===s.length}getCheckboxInputFromElement(e){return e.classList.contains("document-container")?e.querySelector("label input"):super.getCheckboxInputFromElement(e)}canSelectBubble(e){return!e.classList.contains("service")&&!e.classList.contains("is-sending")&&!e.classList.contains("bubble-first")}}var Ys=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Xs{constructor(e,t){this.attachTo=e,this.searchSuper=t,this.onGotoClick=()=>{a.default.dispatchEvent("history_focus",{peerId:this.peerId,mid:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?Object(l.d)(this.searchSuper.selection.selectionForwardBtn):new Us({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?Object(l.d)(this.searchSuper.selection.selectionDeleteBtn):new Hs(this.peerId,[this.mid],"chat")};const s=e=>{let s;this.init&&(this.init(),this.init=null);try{s=Object(Ce.a)(e.target,"search-super-item")}catch(e){}if(s){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),this.target=s,this.peerId=s.dataset.peerId.toPeerId(),this.mid=+s.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),this.buttons.forEach(e=>{let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||e.verify()),e.element.classList.toggle("hide",!t)}),s.classList.add("menu-open"),Object(te.e)(e,this.element),Object(te.d)(this.element,()=>{s.classList.remove("menu-open")})}};pe.IS_TOUCH_SUPPORTED||Object(te.a)(e,s)}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionForwardBtn.classList.contains("hide"),withSelection:!0},{icon:"message",text:"Message.Context.Goto",onClick:this.onGotoClick,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>i.a.canDeleteMessage(i.a.getMessageByPeer(this.peerId,this.mid))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionDeleteBtn.classList.contains("hide"),withSelection:!0}],this.element=Ee(this.buttons),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class Js{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new ee.d,this.middleware=Object(Ps.a)(),this.historyStorage={},this.usedFromHistory={},this.urlsToRevoke=[],this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=Object(X.b)("SEARCH-SUPER"),this.monthContainers={},this.mediaTabsMap=new Map,this.asChatList=!1,this.groupByMonth=!0,this.hideEmptyTabs=!0,this.showSender=!1,this.onTransitionStart=()=>{this.container.classList.add("sliding")},this.onTransitionEnd=()=>{this.container.classList.remove("sliding")},Object(w.g)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.searchContextMenu=new Xs(this.container,this),this.selection=new Qs(this,i.a);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const s=this.navScrollable=new P.a(t);s.container.classList.add("search-super-nav-scrollable");const n=this.nav=document.createElement("nav");n.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=n,s.container.append(n);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const s=document.createElement("span"),i=document.createElement("i");s.append(Object(x.i18n)(e.name)),s.append(i),t.append(s),Object(se.ripple)(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"),pe.IS_TOUCH_SUPPORTED&&Ds({element:this.tabsContainer,onSwipe:(e,t,s)=>{const i=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=i+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{Object(c.a)(e)};let s=2;const i=()=>{--s||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",i,{once:!0}),i}(this.tabsContainer),this.selectTab(o))}});for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const s=document.createElement("div");s.classList.add("search-super-content-"+e.type),t.append(s),this.tabsContainer.append(t),this.tabs[e.inputFilter]=s,e.contentTab=s}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new A(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.mediaTab.contentTab.childElementCount&&this.load(!0)},this.selectTab=Object(Z.a)(this.tabsMenu,this.tabsContainer,(e,t,s)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew(this.container,"start");const i=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(i);const n=this.mediaTab;if(this.mediaTab=i,-1!==this.prevTabId&&s&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(i.scroll={scrollTop:n,scrollHeight:0})}if(i.scroll){const e=n.scroll.scrollTop-i.scroll.scrollTop;e&&(i.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||i.contentTab.childElementCount||this.load(!0),this.prevTabId=e},()=>{this.scrollable.onScroll(),void 0!==this.mediaTab.scroll&&(this.mediaTab.contentTab.style.transform="",this.scrollable.scrollTop=this.mediaTab.scroll.scrollTop),a&&(a(),a=void 0),this.onTransitionEnd()},void 0,s),Object(l.b)(this.tabsContainer,e=>{this.selection.isSelecting&&(Object(c.a)(e),this.selection.toggleByElement(Object(Ce.a)(e.target,"search-super-item")))},{capture:!0,passive:!1});const o=(e,t,s,n)=>{const a=Object(Ce.a)(n.target,e);if(!a)return;const o=+a.dataset.mid;if(!o)return void this.log.warn("no messageId by click on target:",a);const r=a.dataset.peerId.toPeerId(),l=Array.from(this.tabs[s].querySelectorAll("."+t)).map(t=>{const s=Object(Ce.a)(t,e);return{element:t,mid:+s.dataset.mid,peerId:s.dataset.peerId.toPeerId()}}),c=l.findIndex(e=>e.mid===o&&e.peerId===r),d=i.a.getMessageByPeer(r,o);(new Mo).setSearchContext(this.copySearchContext(s)).openMedia(d,l[c].element,0,!1,l.slice(0,c),l.slice(c+1))};Object(l.b)(this.tabs.inputMessagesFilterPhotoVideo,o.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo")),Object(l.b)(this.tabs.inputMessagesFilterDocument,o.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument")),this.mediaTab=this.mediaTabs[0],Object(ks.a)(()=>{this.lazyLoadQueue.lock()},()=>{this.lazyLoadQueue.unlockAndRefresh()})}filterMessagesByType(e,t){if("inputMessagesFilterEmpty"===t)return e;"inputMessagesFilterUrl"!==t&&(e=e.filter(e=>!!e.media));let s=[];switch(t){case"inputMessagesFilterPhotoVideo":for(let t of e){let e=t.media.photo||t.media.document||t.media.webpage&&t.media.webpage.document;e&&("document"===e._&&"video"!==e.type||s.push(t))}break;case"inputMessagesFilterDocument":for(let t of e)t.media.document&&!["voice","audio","gif","sticker","round"].includes(t.media.document.type)&&s.push(t);break;case"inputMessagesFilterUrl":for(let t of e)s.push(t);break;case"inputMessagesFilterMusic":for(let t of e)t.media.document&&"audio"===t.media.document.type&&s.push(t);break;case"inputMessagesFilterVoice":for(let t of e)t.media.document&&"voice"===t.media.document.type&&s.push(t);break;case"inputMessagesFilterRoundVoice":for(let t of e)t.media.document&&["voice","round"].includes(t.media.document.type)&&s.push(t)}return s}performSearchResult(e,t,s=!0){var n;return Ys(this,void 0,void 0,(function*(){const a=[],o=t.contentTab,l=[],c=this.middleware.get();let d,h=t.inputFilter;switch(yield Object(ks.c)(),"inputMessagesFilterPhotoVideo"===h&&this.searchContext.query.trim()?(h="inputMessagesFilterEmpty",d=this.searchGroupMedia,o.append(d.container)):"inputMessagesFilterEmpty"===h&&(d=this.searchGroups.messages),h){case"inputMessagesFilterEmpty":for(const t of e){const{dialog:e,dom:s}=Vo.addDialogNew({dialog:t.peerId,container:d.list,drawStatus:!1,avatarSize:54});Vo.setLastMessage(e,t,s,this.searchContext.query)}d.list.childElementCount&&d.setActive();break;case"inputMessagesFilterPhotoVideo":for(const t of e){const e=t.media.photo||t.media.document||t.media.webpage&&t.media.webpage.document,s=document.createElement("div");let i;s.classList.add("grid-item");const n=r.a.choosePhotoSize(e,200,200);i="photo"!==e._?fs({doc:e,message:t,container:s,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:c,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,size:n}).thumb:ws({photo:e,message:t,container:s,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:c,withoutPreloader:!0,noBlur:!0,size:n}),[i.images.thumb,i.images.full].filter(Boolean).forEach(e=>{e.classList.add("grid-item-media")}),l.push(i.loadPromises.thumb),a.push({element:s,message:t})}break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":for(const t of e){const e=this.showSender||["voice","round"].includes(t.media.document.type),s=ys({message:t,withTime:!e,fontWeight:400,voiceAsMusic:!0,showSender:e,searchContext:this.copySearchContext(h),lazyLoadQueue:this.lazyLoadQueue,noAutoDownload:!0});["audio","voice","round"].includes(t.media.document.type)&&s.classList.add("audio-48"),a.push({element:s,message:t})}break;case"inputMessagesFilterUrl":for(let t of e){let e;if((null===(n=t.media)||void 0===n?void 0:n.webpage)&&"webPageEmpty"!==t.media.webpage._)e=t.media.webpage;else{const s=t.totalEntities?t.totalEntities.find(e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._):null;let i,n,a;if(s)a=t.message.slice(s.offset,s.offset+s.length);else{const e=J.b.matchUrl(t.message);if(!e)continue;i=e[0]}i="messageEntityTextUrl"===(null==s?void 0:s._)?s.url:i||a,n=i;const o=t.message===i;i.match(/^(ftp|http|https):\/\//)||(n="https://"+i,i=i.includes("@")?i:"https://"+i),n=new URL(n).hostname,e={url:i,display_url:n},o||(e.description=t.message,e.rDescription=J.b.wrapRichText(Object(Y.f)(t.message,150,180)))}document.createElement("div");let s=document.createElement("div");if(s.classList.add("preview","row-media"),e.photo){ws({container:s,message:null,photo:e.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:c,size:r.a.choosePhotoSize(e.photo,60,60,!1),loadPromises:l,noBlur:!0})}else s.classList.add("empty"),s.innerHTML=J.b.getAbbreviation(e.title||e.display_url||e.description||e.url,!0);let o=e.rTitle||"",d=e.rDescription||"";const h=Object(Ns.a)(d),u=Object(Ns.a)(J.b.wrapRichText(e.url||"")).firstElementChild;u instanceof HTMLAnchorElement&&(u.innerText=decodeURIComponent(u.href)),h.firstChild&&h.append("\n"),h.append(u),this.showSender&&h.append("\n",i.a.wrapSenderToPeer(t)),o||(o=J.b.wrapPlainText(e.display_url.split("/",1)[0]));const p=new et({title:o,titleRight:i.a.wrapSentTime(t),subtitle:h,havePadding:!0,clickable:!0,noRipple:!0});p.container.append(s),p.container.innerText.trim().length&&a.push({element:p.container,message:t})}}if(this.loadMutex&&l.push(this.loadMutex),!l.length||(yield Promise.all(l),c())){if(a.length){const e=s?"append":"prepend";a.forEach(t=>{const{element:s,message:i}=t,n=this.getMonthContainerByTimestamp(this.groupByMonth?i.date:0,h);s.classList.add("search-super-item"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,n.items[e](s),this.selection.isSelecting&&this.selection.toggleElementCheckbox(s,!0)})}this.afterPerforming("inputMessagesFilterEmpty"===h?1:e.length,o)}}))}afterPerforming(e,t){if(t){const s=t.parentElement;if(Array.from(s.children).slice(1).forEach(e=>{e.remove()}),!e&&!t.childElementCount){const e=document.createElement("div");e.innerText="Nothing interesting here yet...",e.classList.add("position-center","text-center","content-empty","no-select"),s.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(let e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const s=this.searchContext.query;if(s){const r=(t,i,r=!1)=>{t.forEach(t=>{if(e.has(t))return;e.add(t);const l=o.a.getPeer(t),{dom:c}=Vo.addDialogNew({dialog:t,container:i.list,drawStatus:!1,avatarSize:48,autonomous:i.autonomous});if(r&&(l.participants_count||l.participants)){const e=new RegExp(`(${Object(Y.e)(s)}|${Object(Y.e)(Object(ps.b)(s))})`,"gi");c.titleSpan.innerHTML=c.titleSpan.innerHTML.replace(e,"$1"),c.lastMessageSpan.append(n.default.getChatMembersString(t.toChatId()))}else if(t===a.default.myId)c.lastMessageSpan.append(Object(x.i18n)("Presence.YourChat"));else{let e=o.a.getPeerUsername(t);if(e)e="@"+e;else{const s=k.a.getUser(t);s&&s.phone&&(e="+"+Object(Bs.a)(s.phone).formatted)}c.lastMessageSpan.innerHTML=""+e+""}}),i.toggle()},l=e=>{if(t())return e};return Promise.all([k.a.getContactsPeerIds(s,!0).then(l).then(e=>{e&&r(e,this.searchGroups.contacts,!0)}),k.a.searchContacts(s,20).then(l).then(e=>{if(e&&(r(e.my_results,this.searchGroups.contacts,!0),r(e.results,this.searchGroups.globalContacts),this.searchGroups.globalContacts.nameEl.lastElementChild&&this.searchGroups.globalContacts.nameEl.lastElementChild.remove(),this.searchGroups.globalContacts.container.classList.add("is-short"),this.searchGroups.globalContacts.list.childElementCount>3)){const e=document.createElement("div");e.classList.add("search-group__show-more"),e.innerText="Show more",this.searchGroups.globalContacts.nameEl.append(e),e.addEventListener("click",()=>{const t=this.searchGroups.globalContacts.container.classList.toggle("is-short");e.innerText=t?"Show more":"Show less"})}}),i.a.getConversations(s,0,20,0).promise.then(l).then(e=>{e&&r(e.dialogs.map(e=>e.peerId),this.searchGroups.contacts,!0)})])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>C.default.getState().then(s=>{t()&&(this.searchGroups.recent.list.innerHTML="",s.recentSearch.slice(0,20).forEach(e=>{let{dialog:t,dom:s}=Vo.addDialogNew({dialog:e,container:this.searchGroups.recent.list,drawStatus:!1,meAsSaved:!0,avatarSize:48,autonomous:!0});s.lastMessageSpan.append(e.isUser()?k.a.getUserStatusString(e):n.default.getChatMembersString(e.toChatId()))}),s.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())});return Promise.all([k.a.getTopPeers("correspondents").then(e=>{if(!t())return;const s=e.findIndex(e=>e.id===a.default.myId);-1!==s&&(e=e.slice()).splice(s,1),e.length&&e.forEach(e=>{Vo.addDialogNew({dialog:e.id,container:this.searchGroups.people.list,drawStatus:!1,onlyFirstName:!0,avatarSize:54,autonomous:!1})}),this.searchGroups.people.setActive()}),e()])}}loadMembers(e){const t=this.searchContext.peerId.toChatId(),s=this.middleware.get();let i;const a=t=>Ys(this,void 0,void 0,(function*(){this.loadMutex&&(yield this.loadMutex,!s())||(this.membersList||(this.membersList=new Fs({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1}),this.membersList.list.addEventListener("click",e=>{const t=Object(bt.a)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();let i=Promise.resolve();b.b.isMobile&&(i=Qt.toggleSidebar(!1)),i.then(()=>{So.setInnerPeer(s)})}),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab)),t.forEach(e=>{const t=K.a.getParticipantPeerId(e);if(t.isAnyChat())return;k.a.getUser(t).pFlags.deleted||this.membersList.add(t)}))}));if(K.a.isChannel(t)){const o=this.membersList?200:50;i=n.default.getChannelParticipants(t,void 0,o,this.nextRates[e.inputFilter]).then(t=>{if(!s())return;let i=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(i?i.childElementCount:0)+t.participants.length,t.participants.length{if(!s())return;this.loaded[e.inputFilter]=!0;const i=t.participants;return"chatParticipantsForbidden"!==i._?a(i.participants):void 0});return this.loadPromises[e.inputFilter]=i.finally(()=>{s()&&(this.loadPromises[e.inputFilter]=null)})}loadType(e,t,s,n){var a,o;const r=e.inputFilter;if(this.loadPromises[r])return this.loadPromises[r];if("members"===e.type)return this.loadMembers(e);const l=null!==(a=this.historyStorage[r])&&void 0!==a?a:this.historyStorage[r]=[];if(!("inputMessagesFilterEmpty"!==r||l.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[r]=!0,Promise.resolve();const c="load ["+r+"]: ";if(l.length&&this.usedFromHistory[r]i.a.getMessageByPeer(e.peerId,e.mid)),r))}while(a{setTimeout(()=>{this.scrollable.checkForTriggers()},0)})}let d=l.length?l[l.length-1].mid:0;return this.loadPromises[r]=i.a.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:r},maxId:d,limit:s,nextRate:null!==(o=this.nextRates[r])&&void 0!==o?o:this.nextRates[r]=0})).then(i=>{if(l.push(...i.history.map(e=>({mid:e.mid,peerId:e.peerId}))),this.log(c+"search house of glass",r,i),n())return(i.history.length{setTimeout(()=>{if(n()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then(()=>{n()&&setTimeout(()=>{this.scrollable.checkForTriggers()},0)})}},0)}),this.performSearchResult(this.filterMessagesByType(i.history,r),e))}).catch(e=>{this.log.error("load error:",e)}).finally(()=>{this.loadPromises[r]=null})}load(e=!1,t=!1){return Ys(this,void 0,void 0,(function*(){const s=this.searchContext.peerId;this.log("load",e,s,this.loadPromises);const n=this.middleware.get();if(this.firstLoad){if(this.hideEmptyTabs){const e=this.mediaTabs.filter(e=>"inputMessagesFilterEmpty"!==e.inputFilter),t=e.map(e=>({_:e.inputFilter})),a=yield i.a.getSearchCounters(s,t);if(!n())return;if(this.loadMutex&&(yield this.loadMutex,!n()))return;let o,r=0;e.forEach(e=>{const t=a.find(t=>t.filter._===e.inputFilter);e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&void 0===o&&(o=e),t.count&&++r});const l=this.mediaTabsMap.get("members"),c=this.canViewMembers();l.menuTab.classList.toggle("hide",!c),c&&(o=l),this.container.classList.toggle("hide",!o),this.container.parentElement.classList.toggle("search-empty",!o),o&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(o),!1),o.menuTab.classList.add("active"),this.navScrollableContainer.classList.toggle("hide",r<=1))}this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter(e=>e!==this.mediaTab);if(a=a.filter(e=>{const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"members"===e.type),!a.length)return;const o=t?50:Math.round(3*(St.a.windowH/130|0)*1.25),r=a.map(e=>this.loadType(e,t,o,n));return Promise.all(r).catch(e=>{this.log.error("Load error all promises:",e)})}))}getMonthContainerByTimestamp(e,t){var s;const i=new Date(1e3*e);i.setHours(0,0,0),i.setDate(1);const n=i.getTime(),a=null!==(s=this.monthContainers[t])&&void 0!==s?s:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const s=document.createElement("div");s.classList.add("search-super-month-name");const o={month:"long"};i.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new x.default.IntlDateElement({date:i,options:o}).element;s.append(r),e.append(s);const l=document.createElement("div");l.classList.add("search-super-month-items"),e.append(s,l);const c=Object(w.e)(a,"desc");let d=0;for(;dc[d])break}a[n]={container:e,items:l},xs(e,this.tabs[t],d)}return a[n]}canViewMembers(){return this.searchContext.peerId.isAnyChat()&&!K.a.isBroadcast(this.searchContext.peerId.toChatId())&&K.a.hasRights(this.searchContext.peerId.toChatId(),"view_participants")}cleanup(){this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.lazyLoadQueue.clear(),this.mediaTabs.forEach(e=>{this.usedFromHistory[e.inputFilter]=-1}),this.selection.isSelecting&&this.selection.cancelSelection(),this.middleware.clean(),this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach(e=>{e.scroll=void 0})}cleanupHTML(e=!1){this.urlsToRevoke.length&&(this.urlsToRevoke.forEach(e=>{URL.revokeObjectURL(e)}),this.urlsToRevoke.length=0),this.mediaTabs.forEach(e=>{if(e.contentTab.innerHTML="",this.hideEmptyTabs&&(this.container.classList.add("hide"),this.container.parentElement.classList.add("search-empty")),"chats"!==e.type&&!this.historyStorage[e.inputFilter]){const t=e.contentTab.parentElement;t.querySelector(".preloader")||Object(te.f)(t,!0);const s=t.querySelector(".content-empty");s&&s.remove()}}),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=Object(w.a)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:s,historyStorage:i,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:s,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=i?i:{},this.cleanup()}}var Zs,ei=s(79);!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(Zs||(Zs={}));const ti=new class{constructor(){this.privacy={},a.default.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,a.default.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return ct.a.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then(s=>(k.a.saveApiUsers(s.users),K.a.saveApiChats(s.chats),ei.a.processLocalUpdate({_:"updatePrivacy",key:{_:Object(Y.b)(e)},rules:t.map(e=>{const t={};return Object.assign(t,e),t._=Object(Y.b)(t._),t})}),s.rules))}getPrivacy(e){const t=Object(Y.b)(e),s=this.privacy[t];return s?Promise.resolve(s):this.privacy[t]=ct.a.invokeApi("account.getPrivacy",{key:{_:e}}).then(e=>(k.a.saveApiUsers(e.users),K.a.saveApiChats(e.chats),this.privacy[t]=e.rules))}getPrivacyRulesDetails(e){const t=[];let s={users:[],chats:[]},i={users:[],chats:[]};return e.forEach(e=>{switch(e._){case"privacyValueAllowAll":t.push(2);break;case"privacyValueDisallowAll":t.push(0);break;case"privacyValueAllowContacts":t.push(1);break;case"privacyValueAllowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueAllowUsers":s.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":i.chats.push(...e.chats);break;case"privacyValueDisallowUsers":i.users.push(...e.users)}}),{type:t[0],disallowPeers:i,allowPeers:s}}};de.a.appPrivacyManager=ti;var si=ti;class ii{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],s=this.radioSection.caption;t?Object(x._i18n)(s,t):s.innerHTML="",s.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===Zs.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===Zs.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse(),this.radioSection=new ln({name:e.title,caption:!0}),this.radioRows=new Map;let t=[{type:Zs.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:Zs.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:Zs.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(t=t.filter(t=>!e.skipTypes.includes(t.type)));const s=Object(it.b)();t.forEach(({type:e,langKey:t})=>{const i=new et({radioField:new nt({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)});const i=tt([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(i),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=cn(e.appendTo,"PrivacyExceptions","PrivacySettingsController.PeerInfo");this.exceptions=new Map([["disallow",{titleLangKey:e.exceptionTexts[0],key:"disallow",row:null,icon:"deleteuser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}],["allow",{titleLangKey:e.exceptionTexts[1],key:"allow",row:null,icon:"adduser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}]]),this.exceptions.forEach(s=>{s.row=new et(s),s.row.container.addEventListener("click",()=>{n.then(()=>{const t=this.peerIds[s.key];new jt(e.tab.slider).open({type:"privacy",skippable:!0,title:s.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),s.row.subtitle.innerHTML="",s.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})})}),t.append(s.row.container)})}const n=si.getPrivacy(e.inputKey).then(t=>{const s=si.getPrivacyRulesDetails(t);this.setRadio(s.type),this.exceptions&&(this.peerIds={},["allow","disallow"].forEach(e=>{const t=[],i="allow"===e?s.allowPeers:s.disallowPeers;t.push(...i.users.map(e=>e.toPeerId())),t.push(...i.chats.map(e=>e.toPeerId(!0))),this.peerIds[e]=t;const n=this.exceptions.get(e).row.subtitle;n.innerHTML="",n.append(...this.generateStr(i))})),e.tab.eventListener.addEventListener("destroy",()=>{const t=[];switch(this.type){case Zs.Everybody:t.push({_:"inputPrivacyValueAllowAll"});break;case Zs.Contacts:t.push({_:"inputPrivacyValueAllowContacts"});break;case Zs.Nobody:t.push({_:"inputPrivacyValueDisallowAll"})}this.exceptions&&[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]].forEach(([e,s,i],n)=>{if(this.exceptions.get(e).row.container.classList.contains("hide"))return;const a=this.peerIds[e];if(a){const e=this.splitPeersByType(a);e.chats.length&&t.push({_:s,chats:e.chats}),e.users.length&&t.push({_:i,users:e.users.map(e=>k.a.getUserInput(e))})}}),si.setPrivacy(e.inputKey,t)},{once:!0})})}setRadio(e){const t=this.radioRows.get(e);this.onRadioChange(e),t.radioField.input.checked=!0}splitPeersByType(e){const t={users:[],chats:[]};return e.forEach(e=>{t[e.isAnyChat()?"chats":"users"].push(e.isAnyChat()?e.toChatId():e)}),t}generateStr(e){return e.users.length||e.chats.length?Object(x.join)([e.users.length?Object(x.i18n)("Users",[e.users.length]):null,e.chats.length?Object(x.i18n)("Chats",[e.chats.length]):null].filter(Boolean),!1):[Object(x.i18n)("PrivacySettingsController.AddUsers")]}}class ni extends V{init(){this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e=new ii({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:["PrivacyPhoneInfo","PrivacyPhoneInfo",""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{t.setRadio(Zs.Everybody),t.radioSection.container.classList.toggle("hide",e!==Zs.Nobody)}}),t=new ii({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:["PrivacyPhoneInfo3","PrivacyPhoneInfo3",""],noExceptions:!0,skipTypes:[Zs.Nobody]});this.scrollable.container.insertBefore(t.radioSection.container,e.radioSection.container.nextSibling)}}var ai=s(78);class oi extends z{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new ln({caption:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=hs.getAnimatedEmojiSticker("🥳"),s=document.createElement("div");t?Ls({doc:t,div:s,loop:!0,play:!0,width:160,height:160}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=Object(U.a)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});Object(l.b)(a,e=>{this.close()}),this.slider.sliceTabsUntilTab(Zi,this),n.append(a),i.append(n),this.scrollable.container.append(e.container)}}var ri=s(110);function li(e){return!re.IS_MOBILE_SAFARI||!e}class ci extends z{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 ln({caption:!0,noDelimiter:!0});Object(x._i18n)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=hs.getAnimatedEmojiSticker("📬"),s=document.createElement("div");t?Ls({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"📬"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=this.codeInputField=new ri.a({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),ai.a.confirmPasswordEmail(""+e).then(e=>{c()}).catch(e=>{switch(e.type){case"CODE_INVALID":a.input.classList.add("error"),Object(T.a)(a.label,Object(x.i18n)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":a.input.classList.add("error"),Object(T.a)(a.label,Object(x.i18n)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}d(!1)})}}),o=Object(U.a)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),r=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),c=()=>{new oi(this.slider).open()},d=e=>{Object(mt.a)([a.input,o,r],e)};Object(l.b)(o,e=>{d(!0),ai.a.cancelPasswordEmail().then(e=>{this.slider.sliceTabsUntilTab(di,this),this.close()},()=>{d(!1)})}),Object(l.b)(r,e=>{d(!0);const t=Object(te.f)(r);ai.a.resendPasswordEmail().then(e=>{t.remove(),d(!1)})}),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){li(this.isFirst)&&this.codeInputField.input.focus()}}class di extends z{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new ln({caption:!0,noDelimiter:!0}),t=hs.getAnimatedEmojiSticker("💌"),s=document.createElement("div");t?Ls({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"💌"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=this.inputField=new F.b({name:"recovery-email",label:"RecoveryEmail",plainText:!0});a.input.addEventListener("keypress",e=>{if("Enter"===e.key)return Object(c.a)(e),h()}),a.input.addEventListener("input",e=>{a.input.classList.remove("error")});const o=Object(U.a)("btn-primary btn-color-primary",{text:"Continue"}),r=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),d=()=>{new oi(this.slider).open()},h=()=>{const e=a.value.trim(),t=J.b.matchEmail(e);if(!t||t[0].length!==e.length)return void a.input.classList.add("error");u(!0);const s=Object(te.f)(o);ai.a.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then(e=>{d()},t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const s=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],i=new ci(this.slider);i.state=this.state,i.email=e,i.length=s,i.open()}else console.log("password set error",t);u(!1),s.remove()})};Object(l.b)(o,h);const u=e=>{e?(o.setAttribute("disabled","true"),r.setAttribute("disabled","true")):(o.removeAttribute("disabled"),r.removeAttribute("disabled"))};Object(l.b)(r,e=>{new pt("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{u(!0),Object(te.f)(r),ai.a.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then(()=>{d()},e=>{u(!1)})},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()}),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){li(this.isFirst)&&this.inputField.input.focus()}}var hi=s(101),ui=s(93),pi=s(109);class mi extends z{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new ln({noDelimiter:!0}),t=hs.getAnimatedEmojiSticker("💡"),s=document.createElement("div");t?Ls({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"💡"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=document.createElement("div");i.classList.add("input-wrapper");const n=this.inputField=new F.b({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});n.input.addEventListener("keypress",e=>{if("Enter"===e.key)return Object(c.a)(e),n.value?d():h()});const a=(e,t)=>{e&&Object(c.a)(e);const s=t?n.value:void 0;if(s&&this.newPassword===s)return void ot(x.default.format("PasswordAsHintError",!0));const i=new di(this.slider);i.state=this.state,i.plainPassword=this.plainPassword,i.newPassword=this.newPassword,i.hint=s,i.open()},o=Object(U.a)("btn-primary btn-color-primary",{text:"Continue"}),r=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),d=e=>a(e,!0),h=e=>a(e,!1);Object(l.b)(o,d),Object(l.b)(r,h),i.append(n.container,o,r),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class gi extends z{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 ln({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const s=this.passwordInputField=new ui.a({name:"re-enter-password",label:"PleaseReEnterPassword"}),i=new pi.a(s,157),n=Object(U.a)("btn-primary btn-color-primary",{text:"Continue"});t.append(s.container,n),e.content.append(i.container,t),this.scrollable.container.append(e.container),s.input.addEventListener("keypress",e=>{if(s.input.classList.contains("error")&&s.setState(F.a.Neutral),"Enter"===e.key)return o()});const a=()=>this.newPassword===s.value||(s.setError(),!1),o=e=>{if(e&&Object(c.a)(e),!a())return;const t=new mi(this.slider);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return Object(l.b)(n,o),i.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class bi extends z{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 ln({noDelimiter:!0}),s=document.createElement("div");s.classList.add("input-wrapper");const i=this.passwordInputField=new ui.a({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?J.b.wrapEmojiText(this.state.hint):void 0}),n=new hi.a(i,157),a=Object(U.a)("btn-primary btn-color-primary"),o=new x.default.IntlElement({key:"Continue"});a.append(o.element),s.append(i.container,a),t.content.append(n.container,s),this.scrollable.container.append(t.container),i.input.addEventListener("keypress",e=>{if(i.input.classList.contains("error")&&(i.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return d()});const r=()=>!!i.value.length||(i.input.classList.add("error"),!1);let d;if(e)d=e=>{if(e&&Object(c.a)(e),!r())return;const t=new gi(this.slider);t.state=this.state,t.newPassword=i.value,t.plainPassword=this.plainPassword,t.open()};else{let e,t=()=>(e||(e=window.setInterval(t,1e4)),ai.a.getState().then(e=>{this.state=e,this.state.hint?i.label.innerHTML=J.b.wrapEmojiText(this.state.hint):Object(T.a)(i.label,Object(x.i18n)("LoginPassword"))}));d=s=>{if(!r())return void Object(c.a)(s);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const l=Object(te.f)(a),d=i.value;ai.a.check(i.value,this.state).then(t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=new vi(this.slider);t.state=this.state,t.plainPassword=d,t.open(),this.slider.removeTabFromHistory(this)}},e=>{a.removeAttribute("disabled"),i.input.classList.add("error"),e.type,o.key="TwoStepAuth.InvalidPassword",o.update(),l.remove(),i.select(),t()})},t()}return Object(l.b)(a,d),n.load()}onOpenAfterTimeout(){li(this.isFirst)&&this.passwordInputField.input.focus()}}class vi extends z{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new ln({caption:!0,noDelimiter:!0}),t=hs.getAnimatedEmojiSticker("🔐"),s=document.createElement("div");t?Ls({doc:t,div:s,loop:!1,play:!0,width:168,height:168,emoji:"🔐"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement();if(this.state.pFlags.has_password){Object(x._i18n)(e.caption,"TwoStepAuth.GenericHelp");const t=Object(U.a)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=Object(U.a)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=Object(U.a)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});Object(l.b)(t,()=>{const e=new bi(this.slider);e.state=this.state,e.plainPassword=this.plainPassword,e.open()}),Object(l.b)(s,()=>{new pt("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{ai.a.updateSettings({currentPassword:this.plainPassword}).then(()=>{this.slider.sliceTabsUntilTab(Zi,this),this.close()})},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()}),Object(l.b)(n,()=>{const e=new di(this.slider);e.state=this.state,e.hint=this.state.hint,e.plainPassword=this.plainPassword,e.newPassword=this.plainPassword,e.isFirst=!0,e.open()}),i.append(t,s,n)}else{Object(x._i18n)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=Object(U.a)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),Object(l.b)(s,e=>{const t=new bi(this.slider);t.state=this.state,t.open()})}this.scrollable.container.append(e.container)}}class fi extends V{init(){this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new ii({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable})}}class yi extends V{init(){this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new ii({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[Zs.Nobody]})}}class wi extends V{init(){this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new ii({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}class Si extends V{init(){this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new ii({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[Zs.Nobody]})}}class Li extends V{init(){this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new ii({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable});{const e="PrivacySettingsController.P2p.Desc";new ii({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}}class Ei extends z{init(){this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new et({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:Object(oe.c)(new Date(1e3*Math.max(e.date_active,e.date_created)))});t.container.dataset.hash=""+e.hash;const s=document.createElement("div");return s.classList.add("row-midtitle"),s.innerHTML=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t.subtitle.parentElement.insertBefore(s,t.subtitle),t},t=this.authorizations.slice();{const n=new ln({name:"CurrentSession"}),a=t.findAndSplice(e=>e.pFlags.current),o=e(a);if(n.content.append(o.container),t.length){const e=Object(U.a)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});Object(l.b)(e,t=>{new pt("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=Object(mt.a)([e],!0);ct.a.invokeApi("auth.resetAuthorizations").then(t=>{e.remove(),s.container.remove(),this.privacyTab.updateActiveSessions()},i).finally(()=>{t()})}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()}),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const s=new ln({name:"OtherSessions"});t.forEach(t=>{s.content.append(e(t).container)}),this.scrollable.append(s.container);const i=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&&ot(x.default.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new pt("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{ct.a.invokeApi("account.resetAuthorization",{hash:e}).then(e=>{e&&(n.remove(),this.privacyTab.updateActiveSessions())},i)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=Ee([{icon:"stop",text:"Terminate",onClick:a}]);o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),Object(te.a)(this.scrollable.container,e=>{n=Object(Ce.a)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),Object(te.e)(e,o),Object(te.d)(o))}),Object(l.b)(this.scrollable.container,e=>{n=Object(Ce.a)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()})}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}class Ii extends z{init(){this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");{const e=new ln({caption:"BlockedUsersInfo"});this.scrollable.append(e.container)}const e=Q({icon:"add",className:"is-visible"});this.content.append(e),Object(l.b)(e,e=>{new Mt({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{k.a.toggleBlock(e,!0)}})},{listenerSetter:this.listenerSetter});const t=Vo.createChatList();this.scrollable.container.classList.add("chatlist-container"),this.scrollable.append(t);const s=(e,s)=>{const{dom:i}=Vo.addDialogNew({dialog:e,container:t,drawStatus:!1,rippleEnabled:!0,avatarSize:48,append:s}),n=k.a.getUser(e);n.pFlags.bot?i.lastMessageSpan.append("@"+n.username):n.phone?i.lastMessageSpan.innerHTML=k.a.formatUserPhone(n.phone):i.lastMessageSpan.append(n.username?"@"+n.username:k.a.getUserStatusString(e))};for(const e of this.peerIds)s(e,!0);let i;const n=this.menuElement=Ee([{icon:"lockoff",text:"Unblock",onClick:()=>{const e=i.dataset.peerId.toPeerId();k.a.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]);n.id="blocked-users-contextmenu",n.classList.add("contextmenu"),document.getElementById("page-chats").append(n),Object(te.a)(this.scrollable.container,e=>{i=Object(bt.a)(e.target,"LI"),i&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),Object(te.e)(e,n),Object(te.d)(n))},this.listenerSetter),this.listenerSetter.add(a.default)("peer_block",e=>{const{peerId:i,blocked:n}=e,a=t.querySelector(`[data-peer-id="${i}"]`);n?a||s(i,!1):a&&a.remove()});let o=!1;this.scrollable.onScrolledBottom=()=>{o||(o=!0,k.a.getBlocked(t.childElementCount,50).then(e=>{for(const t of e.peerIds)s(t,!0);(e.peerIds.length<50||t.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()}).finally(()=>{o=!1}))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var Mi=s(113);class Ci extends V{init(){this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");{const e=new ln({noDelimiter:!0});let t;const s=new et({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:"Loading",clickable:()=>{const e=new Ii(this.slider);e.peerIds=t,e.open()}});let i;s.freezed=!0;const n=new et({icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:"Loading",clickable:e=>{let t;i.pFlags.has_password?t=new bi(this.slider):i.email_unconfirmed_pattern?(t=new ci(this.slider),t.email=i.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,ai.a.resendPasswordEmail()):t=new vi(this.slider),t.state=i,t.open()}});n.freezed=!0;const o=this.activeSessionsRow=new et({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:"Loading",clickable:()=>{const e=new Ei(this.slider);e.privacyTab=this,e.authorizations=this.authorizations,e.open()}});o.freezed=!0,e.content.append(s.container,n.container,o.container),this.scrollable.append(e.container);const r=e=>{e?Object(T.a)(s.subtitle,Object(x.i18n)("PrivacySettingsController.UserCount",[e])):Object(T.a)(s.subtitle,Object(x.i18n)("BlockedEmpty",[e]))};this.listenerSetter.add(a.default)("peer_block",()=>{l()});const l=()=>{k.a.getBlocked().then(e=>{s.freezed=!1,r(e.count),t=e.peerIds})};l(),ai.a.getState().then(e=>{i=e,Object(T.a)(n.subtitle,Object(x.i18n)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),n.freezed=!1}),this.updateActiveSessions()}{const e=new ln({name:"PrivacyTitle"});e.content.classList.add("privacy-navigation-container");const t={},s=t.inputPrivacyKeyPhoneNumber=new et({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:"Loading",clickable:()=>{new ni(this.slider).open()}}),i=t.inputPrivacyKeyStatusTimestamp=new et({titleLangKey:"LastSeenTitle",subtitleLangKey:"Loading",clickable:()=>{new fi(this.slider).open()}}),n=t.inputPrivacyKeyProfilePhoto=new et({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:"Loading",clickable:()=>{new yi(this.slider).open()}}),o=t.inputPrivacyKeyPhoneCall=new et({titleLangKey:"WhoCanCallMe",subtitleLangKey:"Loading",clickable:()=>{new Li(this.slider).open()}}),r=t.inputPrivacyKeyForwards=new et({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:"Loading",clickable:()=>{new wi(this.slider).open()}}),l=t.inputPrivacyKeyChatInvite=new et({titleLangKey:"WhoCanAddMe",subtitleLangKey:"Loading",clickable:()=>{new Si(this.slider).open()}}),c=e=>{const s=t[e];s&&si.getPrivacy(e).then(e=>{const t=si.getPrivacyRulesDetails(e),i=t.type===Zs.Everybody?"PrivacySettingsController.Everbody":t.type===Zs.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=t.disallowPeers.users.length+t.disallowPeers.chats.length,a=t.allowPeers.users.length+t.allowPeers.chats.length;s.subtitle.innerHTML="";const o=Object(x.i18n)(i);s.subtitle.append(o),(n||a)&&s.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)})};e.content.append(s.container,i.container,n.container,o.container,r.container,l.container),this.scrollable.append(e.container);for(const e in t)c(e);a.default.addEventListener("privacy_update",e=>{c(Object(Y.c)(e.key._))})}const e=[];{const t=new ln({name:"Privacy.SensitiveContent"});t.container.classList.add("hide"),e.push(ct.a.invokeApi("account.getContentSettings").then(e=>{if(!e.pFlags.sensitive_can_change)return;const s=e.pFlags.sensitive_enabled,i=new et({checkboxField:new ut.a({text:"PrivacyAndSecurity.SensitiveText",checked:s}),subtitleLangKey:"PrivacyAndSecurity.SensitiveDesc",noCheckboxSubtitle:!0});t.content.append(i.container),t.container.classList.remove("hide"),this.eventListener.addEventListener("destroy",()=>{const e=i.checkboxField.checked;e!==s&&ct.a.invokeApi("account.setContentSettings",{sensitive_enabled:e})},{once:!0})})),this.scrollable.append(t.container)}{const e=new ln({name:"FilterChats"}),t=()=>{new pt("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=Object(mt.a)([s],!0);Mi.a.clearAllDrafts().then(()=>{e()})},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},s=Object(U.a)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(s)("click",t),e.content.append(s),this.scrollable.append(e.container)}return Promise.all(e)}updateActiveSessions(){ct.a.invokeApi("account.getAuthorizations").then(e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,Object(x._i18n)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])})}}function ki(e,t,s,i=1){e/=255,t/=255,s/=255;const n=Math.max(e,t,s),a=Math.min(e,t,s);let o,r,l=(n+a)/2;if(n===a)o=r=0;else{let i=n-a;switch(r=l>.5?i/(2-n-a):i/(n+a),n){case e:o=(t-s)/i+(t1&&(s-=1),s<1/6?e+6*(t-e)*s:s<.5?t:s<2/3?e+(t-e)*(2/3-s)*6:e},r=s<.5?s*(1+t):s+t-s*t,l=2*s-r;n=i(l,r,e+1/3),a=i(l,r,e),o=i(l,r,e-1/3)}return[Math.round(255*n),Math.round(255*a),Math.round(255*o),Math.round(255*i)]}function Ti(e){const t=[];if(4===e.length)for(let s=1;s("0"+e.toString(16)).slice(-2)).join("")}function Ai(e){return xi(function(e){const t=e.slice(5,-1).split(", "),s=+t.pop(),i=t.map(e=>e.endsWith("%")?+e.slice(0,-1):+e);return Pi(i[0],i[1],i[2],s)}(e))}function Oi(e){let{h:t,s:s,l:i}=ki(e[0],e[1],e[2]);s>0&&(s=Math.min(100,s+5+.1*(100-s))),i=Math.max(0,.65*i);return`hsla(${t}, ${s}%, ${i}%, .4)`}var Fi=s(127);class _i{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(_i.BASE_CLASS);const e=`\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `;this.container.innerHTML=e,this.elements.box=this.container.firstElementChild,this.elements.boxDragger=this.elements.box.lastElementChild,this.elements.saturation=this.elements.box.firstElementChild.firstElementChild,this.elements.sliders=this.elements.box.nextElementSibling,this.elements.hue=this.elements.sliders.firstElementChild,this.elements.hueDragger=this.elements.hue.lastElementChild,this.hexInputField=new F.b({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new F.b({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=_i.BASE_CLASS+"-inputs",t.append(this.hexInputField.container,this.rgbInputField.container),this.container.append(t),this.hexInputField.input.addEventListener("input",()=>{let e=this.hexInputField.value.replace(/#/g,"").slice(0,6);const t=e.match(/([a-fA-F\d]+)/),s=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(s?F.a.Neutral:F.a.Error),e="#"+e,this.hexInputField.setValueSilently(e),s&&this.setColor(e,!1,!0)});const s=/^(?:rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(?:\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(?:([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$/;this.rgbInputField.input.addEventListener("input",()=>{const e=this.rgbInputField.value.match(s);this.rgbInputField.setState(e?F.a.Neutral:F.a.Error),e&&this.setColor(ki(+e[1],+e[2],+e[3]),!0,!1)}),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){we(this.elements.box,()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()},e=>{this.saturationHandler(e.x,e.y)},()=>{this.onGrabEnd()})}attachHueListeners(){we(this.elements.hue,()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()},e=>{this.hueHandler(e.x)},()=>{this.onGrabEnd()})}setColor(e,t=!0,s=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=function(e){const t=Ti(e);return ki(t[0],t[1],t[2],t[3])}(e);else{const t=e.match(/[.?\d]+/g);e=ki(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const i=this.boxRect.width/100*e.s,n=100-e.l/(100-e.s/2)*100,a=this.boxRect.height/100*n;this.saturationHandler(this.boxRect.left+i,this.boxRect.top+a,!1),this.hueRect=this.elements.hue.getBoundingClientRect();const o=e.h/360,r=this.hueRect.left+this.hueRect.width*o;this.hueHandler(r,!1),this.hue=e.h,this.saturation=e.s,this.lightness=e.l,this.alpha=e.a,this.updatePicker(t,s)}getCurrentColor(){const e=Pi(this.hue,this.saturation,this.lightness,this.alpha),t=xi(e),s=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:s,hsla:`hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,rgba:`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`,hexa:t,rgbaArray:e}}updatePicker(e=!0,t=!0){const s=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",s.hex),e&&(this.hexInputField.setValueSilently(s.hex),this.hexInputField.setState(F.a.Neutral)),t&&(this.rgbInputField.setValueSilently(s.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(F.a.Neutral)),this.onChange&&this.onChange(s)}hueHandler(e,t=!0){const s=Object(M.a)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*s);const i=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*s+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",i),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",i),t&&this.updatePicker()}saturationHandler(e,t,s=!0){const i=this.boxRect.width,n=this.boxRect.height,a=Object(M.a)(e-this.boxRect.left,0,i)/i*100,o=Object(M.a)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const l=Object(M.a)(a,0,100),c=100-l/2,d=100-Object(M.a)(o,0,100),h=Object(M.a)(d/100*c,0,100);this.saturation=l,this.lightness=h,s&&this.updatePicker()}}_i.BASE_CLASS="color-picker";class ji extends z{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=Ti(e),s=this.theme.background,i=Oi(t);s.color=e.toLowerCase(),s.type="color",s.highlightningColor=i,C.default.pushToState("settings",a.default.settings),So.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=a.default.getTheme();const e=new ln({});this.colorPicker=new _i,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=this.grid=document.createElement("div");t.classList.add("grid");["#E6EBEE","#B2CEE1","#008DD0","#C6E7CB","#C4E1A6","#60B16E","#CCD0AF","#A6A997","#7A7072","#FDD7AF","#FDB76E","#DD8851"].forEach(e=>{const s=document.createElement("div");s.classList.add("grid-item"),s.dataset.color=e.toLowerCase();const i=document.createElement("div");i.classList.add("grid-item-media"),i.style.backgroundColor=e,s.append(i),t.append(s)}),Object(l.b)(t,e=>{const t=Object(Ce.a)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const s=t.dataset.color;s&&this.applyColor(s)},{listenerSetter:this.listenerSetter}),this.scrollable.append(t),this.applyColor=Object(Fi.a)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.background,s="color"===t.type?this.grid.querySelector(`.grid-item[data-color="${t.color}"]`):null;e!==s&&(e&&e.classList.remove("active"),s&&s.classList.add("active"))}onOpen(){setTimeout(()=>{const e=this.theme.background;"color"===e.type&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(e.color||"#cccccc"),"color"!==e.type&&(this.colorPicker.onChange=this.onColorChange)},0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}let Di=0;class Bi extends z{constructor(){super(...arguments),this.tempId=0,this.clicked=new Set,this.onUploadClick=()=>{Object(me.f)("image/x-png,image/png,image/jpeg").then(e=>{const t="wallpaper-upload-"+ ++Di,s={_:"photoSize",h:0,w:0,location:{},size:e.size,type:"full"};let i={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[s],file_name:e.name};i=E.a.saveDoc(i);const n=he.a.getCacheContext(i);n.downloaded=e.size,n.url=URL.createObjectURL(e);let a={_:"wallPaper",access_hash:"",document:i,id:t,slug:t,pFlags:{}};const o=he.a.upload(e,e.name),r=Object(ae.a)();r.addNotifyListener=o.addNotifyListener,r.cancel=o.cancel,o.then(t=>{ct.a.invokeApi("account.uploadWallPaper",{file:t,mime_type:e.type,settings:{_:"wallPaperSettings"}}).then(e=>{const t=e.document,s=he.a.getCacheContext(t);Object.assign(s,n),a=e,a.document=E.a.saveDoc(a.document),c.dataset.docId=""+a.document.id,c.dataset.slug=a.slug,this.setBackgroundDocument(a.slug,a.document).then(r.resolve,r.reject)},r.reject)},r.reject),r.then(()=>{this.clicked.delete(a.document.id)},e=>{c.remove()});const l=new ye.a({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),c=this.addWallPaper(a,!1);this.clicked.add(a.document.id),l.attach(c,!1,r)})},this.onResetClick=()=>{const e=C.STATE_INIT.settings.themes.find(e=>e.name===this.theme.name);e&&(++this.tempId,this.theme.background=Object(w.a)(e.background),C.default.pushToState("settings",a.default.settings),So.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=Object(Ce.a)(e.target,"grid-item");if(!t)return;const{docId:s,slug:i}=t.dataset;if(this.clicked.has(s))return;this.clicked.add(s);const n=new ye.a({cancelable:!0,tryAgainOnFail:!1}),a=E.a.getDoc(s),o=()=>{const e=this.setBackgroundDocument(i,a);he.a.getCacheContext(a).url&&!this.theme.background.blur||n.attach(t,!0,e)};n.construct(),Object(l.b)(t,e=>{n.preloader.parentElement?(n.onClick(e),n.detach()):o()},{listenerSetter:this.listenerSetter}),o()},this.saveToCache=(e,t)=>{fetch(t).then(t=>{he.a.cacheStorage.save("backgrounds/"+e,t)})},this.setBackgroundDocument=(e,t)=>{let s=++this.tempId;const i=()=>s===this.tempId,n=E.a.downloadDoc(t,So.chat.bubbles?So.chat.bubbles.lazyLoadQueue.queueId:0),o=Object(ae.a)();return o.addNotifyListener=n.addNotifyListener,o.cancel=n.cancel,n.then(()=>{if(!i())return void o.resolve();const s=this.theme.background,n=t=>{(e=>{const t=document.createElement("img");return new Promise(s=>{Object(as.a)(t,e,()=>{const e=document.createElement("canvas"),i=t.naturalWidth/t.naturalHeight;1===i?(e.width=50,e.height=e.width/i):i>1?(e.height=50,e.width=e.height/i):e.width=e.height=50;const n=e.getContext("2d");n.drawImage(t,0,0,t.naturalWidth,t.naturalHeight,0,0,e.width,e.height);const a=new Array(4).fill(0),o=n.getImageData(0,0,e.width,e.height).data;for(let e=0;e{if(!i())return void o.resolve();const r=Oi(Array.from(n));s.slug=e,s.type="image",s.highlightningColor=r,C.default.pushToState("settings",a.default.settings),this.saveToCache(e,t),So.applyCurrentTheme(e,t).then(o.resolve)})},r=he.a.getCacheContext(t);s.blur?setTimeout(()=>{Object(ms.a)(r.url,12,4).then(e=>{i()?n(e):o.resolve()})},200):n(r.url)}),o},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.theme.background,s="image"===t.type?this.grid.querySelector(`.grid-item[data-slug="${t.slug}"]`):null;e!==s&&(e&&e.classList.remove("active"),s&&s.classList.add("active"))}}init(){this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground"),this.theme=a.default.getTheme();{const t=cn(this.scrollable),s=Object(U.a)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),i=Object(U.a)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),n=Object(U.a)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});Object(l.b)(s,this.onUploadClick,{listenerSetter:this.listenerSetter}),Object(l.b)(i,()=>{new ji(this.slider).open()},{listenerSetter:this.listenerSetter}),Object(l.b)(n,this.onResetClick,{listenerSetter:this.listenerSetter});const o=this.blurCheckboxField=new ut.a({text:"ChatBackground.Blur",name:"blur",checked:this.theme.background.blur,withRipple:!0});this.listenerSetter.add(o.input)("change",()=>{this.theme.background.blur=o.input.checked,C.default.pushToState("settings",a.default.settings);const t=e.querySelector(".active");t&&setTimeout(()=>{this.setBackgroundDocument(t.dataset.slug,E.a.getDoc(t.dataset.docId))},100)}),t.append(s,i,n,o.label)}a.default.addEventListener("background_change",this.setActive),ct.a.invokeApiHashable("account.getWallPapers").then(e=>{e.wallpapers.forEach(e=>{this.addWallPaper(e)})});const e=this.grid=document.createElement("div");e.classList.add("grid"),Object(l.b)(e,this.onGridClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(e)}addWallPaper(e,t=!0){if(e.pFlags.pattern||!e.document||0===e.document.mime_type.indexOf("application/"))return;e.document=E.a.saveDoc(e.document);const s=document.createElement("div");s.classList.add("grid-item");const i=document.createElement("div");i.classList.add("grid-item-media");const n=ws({photo:e.document,message:null,container:i,withoutPreloader:!0,size:r.a.choosePhotoSize(e.document,200,200)});return s.dataset.docId=""+e.document.id,s.dataset.slug=e.slug,"image"===this.theme.background.type&&this.theme.background.slug===e.slug&&s.classList.add("active"),(n.loadPromises.thumb||n.loadPromises.full).then(()=>{os.a.mutate(()=>{s.append(i)})}),this.grid[t?"append":"prepend"](s),s}}var Ri=s(107);class Ui extends ht.b{constructor(e){super("popup-stickers",null,{closable:!0,overlayClosable:!0,body:!0}),this.stickerSetInput=e,this.onStickersClick=e=>{const t=Object(Ce.a)(e.target,"sticker-set-sticker");if(!t)return;const s=t.dataset.docId;So.chat.input.sendMessageWithDocument(s)?this.hide():console.warn("got no doc by id:",s)},this.h6=document.createElement("h6"),this.h6.append(Object(x.i18n)("Loading")),this.header.append(this.h6),this.addEventListener("close",()=>{I.a.setOnlyOnePlayableGroup("")});const t=document.createElement("div");t.classList.add("sticker-set"),this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("sticker-set-stickers","is-loading"),Object(l.b)(this.stickersDiv,this.onStickersClick,{listenerSetter:this.listenerSetter}),Object(te.f)(this.stickersDiv,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer"),t.append(this.stickersDiv);const s=Object(U.a)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(s),this.body.append(t);new P.b(this.body);this.body.append(this.stickersFooter),this.loadStickerSet()}loadStickerSet(){return hs.getStickerSet(this.stickerSetInput).then(e=>{let t;this.set=e.set,I.a.setOnlyOnePlayableGroup("STICKERS-POPUP"),this.h6.innerHTML=J.a.wrapEmojiText(e.set.title),this.stickersFooter.classList.toggle("add",!e.set.installed_date),e.set.installed_date?(t=Object(U.a)("btn-primary btn-primary-transparent danger",{noRipple:!0}),t.append(Object(x.i18n)("RemoveStickersCount",[Object(x.i18n)("Stickers",[e.set.count])]))):(t=Object(U.a)("btn-primary btn-color-primary",{noRipple:!0}),t.append(Object(x.i18n)("AddStickersCount",[Object(x.i18n)("Stickers",[e.set.count])]))),this.stickersFooter.textContent="",this.stickersFooter.append(t),Object(l.b)(t,()=>{const e=Object(mt.a)([t],!0);hs.toggleStickerSet(this.set).then(()=>{this.hide()}).catch(()=>{e()})});const s=new ee.d;this.stickersDiv.classList.remove("is-loading"),this.stickersDiv.innerHTML="";for(let t of e.documents){if("documentEmpty"===t._)continue;const e=document.createElement("div");e.classList.add("sticker-set-sticker");const i=b.b.active.esgSticker.width;Ls({doc:t,div:e,lazyLoadQueue:s,group:"STICKERS-POPUP",play:!0,loop:!0,width:i,height:i}),this.stickersDiv.append(e)}})}}var Hi=s(2);class Ni{constructor(e,t,s,i,n){const a="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(a);const o=document.createElement("div");o.classList.add(a+"-details");const r=document.createElement("div");r.classList.add(a+"-name"),Object(x._i18n)(r,e);const l=document.createElement("div");l.classList.add(a+"-value"),l.innerHTML=""+s,o.append(r,l),this.range=new Se({step:t,min:i,max:n},s),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),l.innerText=""+e}}),this.container.append(o,this.range.container)}}class zi extends V{init(){this.container.classList.add("general-settings-container"),this.setTitle("General");const e=cn.bind(null,this.scrollable);{const t=e("Settings"),s=new Ni("TextSize",1,a.default.settings.messagesTextSize,12,20);s.onChange=e=>{C.default.setByKey("settings.messagesTextSize",e)};const i=Object(U.a)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"});Object(l.b)(i,()=>{new Bi(this.slider).open()});const n=new ut.a({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",withRipple:!0});t.append(s.container,i,n.label)}{const t=e("General.Keyboard"),s=document.createElement("form"),i="send-shortcut",n="settings.sendShortcut",a=new et({radioField:new nt({langKey:"General.SendShortcut.Enter",name:i,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new et({radioField:new nt({name:i,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});Object(x._i18n)(o.radioField.main,"General.SendShortcut.CtrlEnter",[re.IS_APPLE?"⌘":"Ctrl"]),s.append(a.container,o.container),t.append(s)}{const t=e("General.TimeFormat"),s=document.createElement("form"),i="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map(([e,t])=>new et({radioField:new nt({langKey:t,name:i,value:e,stateKey:n})})),r=function(e,t=!0){const s=e;let i;return t||(e=Ae.a),function t(){e(),i=Hi.a.setTimeout(t,1e3*(60-(new Date).getSeconds()))}(),e=s,()=>{clearTimeout(i)}}(()=>{const e=new Date;a.forEach(([t],s)=>{const i=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[s].subtitle.textContent=i})});this.eventListener.addEventListener("destroy",r),s.append(...o.map(e=>e.container)),t.append(s)}{const t=e("AutoDownloadMedia"),s=new ut.a({text:"AutodownloadContacts",name:"contacts",stateKey:"settings.autoDownload.contacts",withRipple:!0}),i=new ut.a({text:"AutodownloadPrivateChats",name:"private",stateKey:"settings.autoDownload.private",withRipple:!0}),n=new ut.a({text:"AutodownloadGroupChats",name:"groups",stateKey:"settings.autoDownload.groups",withRipple:!0}),a=new ut.a({text:"AutodownloadChannels",name:"channels",stateKey:"settings.autoDownload.channels",withRipple:!0});t.append(s.label,i.label,n.label,a.label)}{const t=e("General.AutoplayMedia"),s=new ut.a({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",withRipple:!0}),i=new ut.a({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",withRipple:!0});t.append(s.label,i.label)}{const t=e("Emoji"),s=new ut.a({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",withRipple:!0}),i=new ut.a({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",withRipple:!0});t.append(s.label,i.label)}{const t=e("Telegram.InstalledStickerPacksController"),s=new ut.a({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",withRipple:!0}),i=new ut.a({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",withRipple:!0}),n={},o=new ee.d,r=(e,s="append")=>{const i=new et({title:J.b.wrapEmojiText(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new Ui({id:e.id,access_hash:e.access_hash}).show()}});n[e.id]=i;const a=document.createElement("div");a.classList.add("row-media"),Es({set:e,container:a,group:"GENERAL-SETTINGS",lazyLoadQueue:o,width:48,height:48,autoplay:!0}),i.container.append(a),t[s](i.container)};hs.getAllStickers().then(e=>{Object(Ri.a)(e);for(const t of e.sets)r(t)}),this.listenerSetter.add(a.default)("stickers_installed",e=>{const t=e;n[t.id]||r(t,"prepend")}),this.listenerSetter.add(a.default)("stickers_deleted",e=>{const t=e;n[t.id]&&(n[t.id].container.remove(),delete n[t.id])}),t.append(s.label,i.label)}}onOpen(){this.init&&(this.init(),this.init=null)}}var Vi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Wi extends z{init(){return Vi(this,void 0,void 0,(function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const e=[];{const t=document.createElement("div");t.classList.add("input-wrapper"),this.firstNameInputField=new F.b({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new F.b({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new F.b({label:"EditProfile.BioLabel",name:"bio",maxLength:70}),t.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const s=document.createElement("div");s.classList.add("caption"),Object(x.i18n_)({element:s,key:"Bio.Description"}),e.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.scrollable.append(t,s)}this.scrollable.append(document.createElement("hr")),this.editPeer=new Je({peerId:a.default.myId,inputFields:e,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),this.scrollable.prepend(this.editPeer.avatarEdit.container);{const t=document.createElement("div");t.classList.add("sidebar-left-h2"),Object(x.i18n_)({element:t,key:"EditAccount.Username"});const s=document.createElement("div");s.classList.add("input-wrapper"),this.usernameInputField=new dt({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange(),this.setProfileUrl()},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"}),s.append(this.usernameInputField.container);const i=document.createElement("div");i.classList.add("caption"),i.append(Object(x.i18n)("UsernameSettings.ChangeDescription")),i.append(document.createElement("br"),document.createElement("br"));const n=this.profileUrlContainer=document.createElement("div");n.classList.add("profile-url-container");const a=this.profileUrlAnchor=document.createElement("a");a.classList.add("profile-url"),a.href="#",a.target="_blank",n.append(Object(x.i18n)("UsernameHelpLink",[a])),i.append(n),e.push(this.usernameInputField),this.scrollable.append(t,s,i)}Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0;let e=[];e.push(n.default.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value).then(()=>{this.close()},e=>{console.error("updateProfile error:",e)})),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then(e=>n.default.uploadProfilePhoto(e))),this.usernameInputField.isValidToChange()&&e.push(k.a.updateUsername(this.usernameInputField.value)),Promise.race(e).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled")})},{listenerSetter:this.listenerSetter});const t=k.a.getSelf(),s=yield n.default.getProfile(t.id,!0);this.firstNameInputField.setOriginalValue(t.first_name,!0),this.lastNameInputField.setOriginalValue(t.last_name,!0),this.bioInputField.setOriginalValue(s.about,!0),this.usernameInputField.setOriginalValue(t.username,!0),this.setProfileUrl(),this.editPeer.handleChange()}))}setProfileUrl(){if(this.usernameInputField.input.classList.contains("error")||!this.usernameInputField.value.length)this.profileUrlContainer.style.display="none";else{this.profileUrlContainer.style.display="";let e="https://t.me/"+this.usernameInputField.value;this.profileUrlAnchor.innerText=e,this.profileUrlAnchor.href=e}}}var Ki=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Gi extends z{constructor(){super(...arguments),this.renderResults=e=>Ki(this,void 0,void 0,(function*(){yield k.a.getContacts(),e.forEach(e=>{const{dom:t}=Vo.addDialogNew({dialog:e,container:this.selector.scrollable,drawStatus:!1,rippleEnabled:!0,avatarSize:46}),s=this.selector.selected.has(e);t.containerEl.append(this.checkbox(s));const i=[];this.dialogsByFilters.forEach((t,s)=>{if(t.has(e)){const e=document.createElement("span");e.innerHTML=J.b.wrapEmojiText(s.title),i.push(e)}});Object(x.join)(i,!1).forEach(e=>{t.lastMessageSpan.append(e)})})})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(){return this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=H("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),this.confirmBtn.addEventListener("click",()=>{const e=this.selector.getSelected();if("included"===this.type)for(const e in this.filter.pFlags)0!==e.indexOf("exclude_")&&delete this.filter.pFlags[e];else for(const e in this.filter.pFlags)0===e.indexOf("exclude_")&&delete this.filter.pFlags[e];const t=[];for(const s of e)s.isPeerId()?t.push(s.toPeerId()):this.filter.pFlags[s]=!0;let s;s="included"===this.type?e=>t.includes(e):e=>!t.includes(e),Object(f.d)(this.filter.pinnedPeerIds,(e,t)=>{s(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))});const i="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";Object(f.d)(this.filter[i],(e,s)=>{t.includes(e)&&(this.filter[i].splice(s,1),this.filter[n].splice(s,1))}),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=t.map(e=>o.a.getInputPeerById(e)),this.editFolderTab.setFilter(this.filter,!1),this.close()}),this.dialogsByFilters=new Map,i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.dialogsByFilters.set(t,new Set(i.a.dialogsStorage.getFolderDialogs(t.id).map(e=>e.peerId)))})}checkbox(e){const t=new ut.a({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.init&&(this.init(),this.init=null),this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=document.createDocumentFragment(),s=new ln({noDelimiter:!0,name:"FilterChatTypes"});let i;s.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 n=document.createDocumentFragment();for(const e in i){const t=Object(U.a)("btn-primary btn-transparent folder-category-button",{icon:i[e].ico,text:i[e].text});t.dataset.peerId=e,t.append(this.checkbox()),n.append(t)}s.content.append(n);const a=new ln({name:"FilterChats"});t.append(s.container,a.container);const o=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new Et({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search"}),this.selector.selected=new Set(o);let r=!1;const l=this.selector.add.bind(this.selector);this.selector.add=(e,t,s)=>{if(this.selector.selected.size>=100&&r&&!i[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);t&&setTimeout(()=>{t.checked=!1},0);return void ot(x.default.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0))}const n=l(e,i[e]?Object(x.i18n)(i[e].text):void 0,s);return i[e]&&n.querySelector("avatar-element").classList.add("tgico-"+i[e].ico),n};const c=this.selector.list.parentElement;a.content.append(this.selector.list),c.append(t),this.selector.addInitial(o),r=!0;for(const t in e.pFlags)i.hasOwnProperty(t)&&e.pFlags[t]&&s.content.querySelector(`[data-peer-id="${t}"]`).click()}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}open(e,t,s){return this.originalFilter=e,this.filter=Object(w.a)(this.originalFilter),this.type=t,this.editFolderTab=s,super.open()}}class qi extends z{constructor(){super(...arguments),this.flags={}}init(){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append(Object(x.i18n)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=H("check btn-confirm hide blue");const e={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new pt("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{e.element.setAttribute("disabled","true"),i.a.filtersStorage.updateDialogFilter(this.filter,!0).then(e=>{e&&this.close()}).finally(()=>{e.element.removeAttribute("disabled")})},isDanger:!0}]}).show()}};this.menuBtn=Me({},"bottom-left",[e]),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const t=document.createElement("div");t.classList.add("input-wrapper"),this.nameInputField=new F.b({label:"FilterNameInputLabel",maxLength:12}),t.append(this.nameInputField.container);const s=(e,t,s,i)=>{const n=new ln({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),s.forEach(e=>{const t=Object(U.a)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(i[e.name]=t),a.append(t)}),n};this.includePeerIds=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,this.includePeerIds.container,this.excludePeerIds.container);const n=this.includePeerIds.container.querySelector(".folder-categories"),a=this.excludePeerIds.container.querySelector(".folder-categories");return n.querySelector(".btn").addEventListener("click",()=>{new Gi(this.slider).open(this.filter,"included",this)}),a.querySelector(".btn").addEventListener("click",()=>{new Gi(this.slider).open(this.filter,"excluded",this)}),this.confirmBtn.addEventListener("click",()=>{if(this.nameInputField.input.classList.contains("error"))return;if(!this.nameInputField.value.trim())return void this.nameInputField.input.classList.add("error");let e,t=Array.from(n.children).slice(1).reduce((e,t)=>e+ +!t.style.display,0);t+=this.filter.include_peers.length,t?(this.confirmBtn.setAttribute("disabled","true"),e=this.filter.id?i.a.filtersStorage.updateDialogFilter(this.filter):i.a.filtersStorage.createDialogFilter(this.filter),e.then(e=>{e&&this.close()}).catch(e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?ot("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)}).finally(()=>{this.confirmBtn.removeAttribute("disabled")})):ot("Please choose at least one chat for this folder.")}),this.nameInputField.input.addEventListener("input",()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()}),this.loadAnimationPromise=le.b.loadAnimationFromURL({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"assets/img/Folders_2.tgs").then(e=>(this.animation=e,le.b.waitForFirstFrame(e)))}onOpenAfterTimeout(){this.loadAnimationPromise.then(()=>{this.animation.autoplay=!0,this.animation.play()})}onCreateOpen(){this.caption.style.display="",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.caption.style.display="none",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=J.b.wrapDraftText(e.title);for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach(t=>{const s=this[t],i=Vo.createChatList(),n=e[t].slice(),a=e=>{for(let t=0,s=Math.min(n.length,e);ta(20)),o.append(Object(x.i18n)("FilterShowMoreChats",[n.length])),e.append(o)}a(4)})}editCheckForChange(){if("edit"===this.type){const e=!Object(w.b)(this.originalFilter,this.filter);this.confirmBtn.classList.toggle("hide",!e),this.menuBtn.classList.toggle("hide",e)}}setFilter(e,t){Array.from(this.container.querySelectorAll("ul, .load-more")).forEach(e=>e.remove()),t?(this.originalFilter=e,this.filter=Object(w.a)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}open(e){const t=super.open();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.onCreateOpen()):(this.setFilter(e,!0),this.type="edit",this.onEditOpen()),t}}var Qi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class $i extends z{constructor(){super(...arguments),this.filtersRendered={}}renderFolder(e,t,s){let n,a,r="",c=[];if("dialogFilterSuggested"===e._)n=e.filter,r=e.description;else{if(n=e,1===Object.keys(n.pFlags).length){const e=n.pFlags;let t;e.contacts?t="FilterAllContacts":e.non_contacts?t="FilterAllNonContacts":e.groups?t="FilterAllGroups":e.broadcasts?t="FilterAllChannels":e.bots&&(t="FilterAllBots"),t&&c.push(Object(x.i18n)(t))}if(!c.length){const e=i.a.dialogsStorage.getFolderDialogs(n.id);let t=0,s=0,a=0;for(const i of e)o.a.isAnyGroup(i.peerId)?a++:o.a.isBroadcast(i.peerId)?s++:t++;t&&c.push(Object(x.i18n)("Chats",[t])),s&&c.push(Object(x.i18n)("Channels",[s])),a&&c.push(Object(x.i18n)("Groups",[a]))}}if(s)s.subtitle.textContent="",Object(x.join)(c).forEach(e=>{s.subtitle.append(e)});else if(s=new et({title:J.a.wrapEmojiText(n.title),subtitle:r,clickable:!0}),c.length&&Object(x.join)(c).forEach(e=>{s.subtitle.append(e)}),"dialogFilter"===e._){const e=n.id;this.filtersRendered.hasOwnProperty(n.id)||Object(l.b)(s.container,()=>{new qi(this.slider).open(i.a.filtersStorage.getFilter(e))},{listenerSetter:this.listenerSetter}),this.filtersRendered[n.id]=s}return a=s.container,n.hasOwnProperty("orderIndex")?xs(a,a.parentElement||t,n.orderIndex):t&&t.append(a),a}init(){return Qi(this,void 0,void 0,(function*(){this.container.classList.add("chat-folders-container"),this.setTitle("ChatList.Filter.List.Title"),this.scrollable.container.classList.add("chat-folders"),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container");const e=document.createElement("div");e.classList.add("caption"),Object(x.i18n_)({element:e,key:"ChatList.Filter.Header"}),this.createFolderBtn=Object(U.a)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new ln({name:"Filters"}),this.foldersSection.container.style.display="none",this.suggestedSection=new ln({name:"FilterRecommended"}),this.suggestedSection.container.style.display="none",this.scrollable.append(this.stickerContainer,e,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),Object(l.b)(this.createFolderBtn,()=>{Object.keys(this.filtersRendered).length>=10?ot("Sorry, you can't create more folders."):new qi(this.slider).open()},{listenerSetter:this.listenerSetter});const t=()=>{this.foldersSection.container.style.display=Object.keys(this.filtersRendered).length?"":"none"};return i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.renderFolder(t,this.foldersSection.content);t()}),this.listenerSetter.add(a.default)("filter_update",e=>{this.filtersRendered.hasOwnProperty(e.id)?this.renderFolder(e,null,this.filtersRendered[e.id]):this.renderFolder(e,this.foldersSection.content),t(),this.getSuggestedFilters()}),this.listenerSetter.add(a.default)("filter_delete",e=>{this.filtersRendered.hasOwnProperty(e.id)&&(this.getSuggestedFilters(),this.filtersRendered[e.id].container.remove(),delete this.filtersRendered[e.id]),t()}),this.listenerSetter.add(a.default)("filter_order",e=>{e.forEach((e,t)=>{const s=this.filtersRendered[e].container;xs(s,s.parentElement,t+1)})}),this.loadAnimationPromise=le.b.loadAnimationFromURL({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"assets/img/Folders_1.tgs").then(e=>(this.animation=e,le.b.waitForFirstFrame(e))),this.getSuggestedFilters(),this.loadAnimationPromise}))}onOpenAfterTimeout(){this.loadAnimationPromise.then(()=>{this.animation.autoplay=!0,this.animation.play()})}getSuggestedFilters(){return ct.a.invokeApi("messages.getSuggestedDialogFilters").then(e=>{this.suggestedSection.container.style.display=e.length?"":"none",Array.from(this.suggestedSection.content.children).slice(1).forEach(e=>e.remove()),e.forEach(e=>{const t=this.renderFolder(e),s=Object(U.a)("btn-primary btn-color-primary",{text:"Add"});t.append(s),this.suggestedSection.content.append(t),Object(l.b)(s,n=>{if(Object(c.a)(n),Object.keys(this.filtersRendered).length>=10)return void ot("Sorry, you can't create more folders.");s.setAttribute("disabled","true");const a=e.filter;a.includePeerIds=[],a.excludePeerIds=[],a.pinnedPeerIds=[],i.a.filtersStorage.createDialogFilter(a,!0).then(e=>{e&&t.remove()}).finally(()=>{s.removeAttribute("disabled")})},{listenerSetter:this.listenerSetter})})})}}class Yi extends V{init(){this.container.classList.add("notifications-container"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new ln({name:e.name}),s=new et({checkboxField:new ut.a({text:e.typeText,checked:!0}),subtitleLangKey:"Loading"}),i=new et({checkboxField:new ut.a({text:"Notifications.MessagePreview",checked:!0}),subtitleLangKey:"Loading"});t.content.append(s.container,i.container),this.scrollable.append(t.container);const n={_:e.inputKey},o=Ft.a.getNotifySettings(n);(o instanceof Promise?o:Promise.resolve(o)).then(t=>{const o=()=>{const e=Ft.a.isMuted(t);return s.checkboxField.checked=!e,i.checkboxField.checked=t.show_previews,e};o(),this.eventListener.addEventListener("destroy",()=>{const e=!s.checkboxField.checked,a=i.checkboxField.checked;if(e===Ft.a.isMuted(t)&&a===t.show_previews)return;const o=Object(w.a)(t);o._="inputPeerNotifySettings",o.mute_until=e?2147483647:0,o.show_previews=a,Ft.a.updateNotifySettings(n,o)},{once:!0}),this.listenerSetter.add(a.default)("notify_settings",s=>{const i=Object(Y.c)(s.peer._);e.inputKey===i&&(t=s.notify_settings,o())})})};e({name:"NotificationsPrivateChats",typeText:"NotificationsForPrivateChats",inputKey:"inputNotifyUsers"}),e({name:"NotificationsGroups",typeText:"NotificationsForGroups",inputKey:"inputNotifyChats"}),e({name:"NotificationsChannels",typeText:"NotificationsForChannels",inputKey:"inputNotifyBroadcasts"});{const e=new ln({name:"NotificationsOther"}),t=new et({checkboxField:new ut.a({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading"}),s=new et({checkboxField:new ut.a({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound"}),subtitleLangKey:"Loading"});C.default.getState().then(e=>{s.checkboxField.checked=e.settings.notifications.sound}),e.content.append(t.container,s.container),this.scrollable.append(e.container),Ft.a.getContactSignUpNotification().then(e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",()=>{const s=t.checkboxField.checked;e!==s&&Ft.a.setContactSignUpNotification(!s)},{once:!0})})}}}var Xi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ji extends z{init(){return Xi(this,void 0,void 0,(function*(){this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const e=new ln({}),t=new Map,s=ct.a.invokeApiCacheable("langpack.getLanguages",{lang_pack:"macos"}).then(s=>{const i=Object(it.b)();s.forEach(e=>{const s=new et({radioField:new nt({text:e.name,name:i,value:e.lang_code}),subtitle:e.native_name});t.set(e.lang_code,s)});const n=tt([...t.values()],e=>{x.default.getLangPack(e)});x.default.getCacheLangPack().then(e=>{const s=t.get(e.lang_code);s?s.radioField.setValueSilently(!0):console.error("no row",s,e)}),e.content.append(n)});return this.scrollable.append(e.container),s}))}}class Zi extends z{constructor(){super(...arguments),this.buttons={}}init(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=Me({},"bottom-left",[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new pt("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{ct.a.logOut()},isDanger:!0}]}).show()}}]);this.header.append(e),this.avatarElem=new _o,this.avatarElem.setAttribute("clickable",""),this.avatarElem.classList.add("profile-avatar","avatar-120"),this.nameDiv=document.createElement("div"),this.nameDiv.classList.add("profile-name"),this.phoneDiv=document.createElement("div"),this.phoneDiv.classList.add("profile-subtitle");const t=document.createElement("div");t.classList.add("profile-buttons");const s="profile-button btn-primary btn-transparent";t.append(this.buttons.edit=Object(U.a)(s,{icon:"edit",text:"EditAccount.Title"})),t.append(this.buttons.folders=Object(U.a)(s,{icon:"folder",text:"AccountSettings.Filters"})),t.append(this.buttons.general=Object(U.a)(s,{icon:"settings",text:"Telegram.GeneralSettingsViewController"})),t.append(this.buttons.notifications=Object(U.a)(s,{icon:"unmute",text:"AccountSettings.Notifications"})),t.append(this.buttons.privacy=Object(U.a)(s,{icon:"lock",text:"AccountSettings.PrivacyAndSecurity"})),t.append(this.buttons.language=Object(U.a)(s,{icon:"language",text:"AccountSettings.Language"})),this.scrollable.append(this.avatarElem,this.nameDiv,this.phoneDiv,t),this.scrollable.container.classList.add("profile-content-wrapper"),this.buttons.edit.addEventListener("click",()=>{new Wi(this.slider).open()}),this.buttons.folders.addEventListener("click",()=>{new $i(this.slider).open()}),this.buttons.general.addEventListener("click",()=>{new zi(this.slider).open()}),this.buttons.notifications.addEventListener("click",()=>{new Yi(this.slider).open()}),this.buttons.privacy.addEventListener("click",()=>{new Ci(this.slider).open()}),this.buttons.language.addEventListener("click",()=>{new Ji(this.slider).open()}),le.b.loadLottieWorkers(),this.fillElements()}fillElements(){const e=k.a.getSelf(),t=e.id.toPeerId(!1);this.avatarElem.setAttribute("peer",""+t),this.nameDiv.append(new wt.a({peerId:t}).element),this.phoneDiv.innerHTML=e.phone?k.a.formatUserPhone(e.phone):""}}class en extends z{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new q(e=>{this.uploadAvatar=e});const e=document.createElement("div");e.classList.add("input-wrapper"),this.channelNameInputField=new F.b({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new F.b({label:"DescriptionOptionalPlaceholder",maxLength:255}),e.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const t=()=>{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",t),this.channelDescriptionInputField.input.addEventListener("input",t);const s=document.createElement("div");s.classList.add("caption"),Object(x._i18n)(s,"Channel.DescriptionHolderDescrpiton"),this.nextBtn=Q({icon:"arrow_next"}),this.nextBtn.addEventListener("click",()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,K.a.createChannel(e,t).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{K.a.editPhoto(e,t)}),un.removeTabFromHistory(this),new jt(this.slider).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>K.a.inviteToChannel(e,t)})})}),this.content.append(this.nextBtn),this.scrollable.append(this.avatarEdit.container,e,s)}onCloseAfterTimeout(){return this.avatarEdit.clear(),this.uploadAvatar=null,this.channelNameInputField.value="",this.channelDescriptionInputField.value="",this.nextBtn.disabled=!1,super.onCloseAfterTimeout()}}var tn=s(121);class sn extends ht.b{constructor(){super("popup-create-contact popup-send-photo popup-new-media",null,{closable:!0,withConfirm:"Add"}),Object(x._i18n)(this.title,"AddContactTitle"),Object(l.b)(this.btnConfirm,()=>{const e=k.a.importContact(s.value,i.value,n.value);e.then(()=>{this.hide()},e=>{"NO_USER"===e.type&&(rt({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),c.disabled=!1)}),c.lockWithPromise(e)},{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const s=new F.b({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),i=new F.b({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new tn.a({required:!0});e.push(s,i,n);const a=()=>{const e=s.value+" "+i.value;c.avatarElem.setAttribute("peer-title",e),c.avatarElem.update()};this.listenerSetter.add(s.input)("input",a),this.listenerSetter.add(i.input)("input",a);const o=k.a.getSelf(),r=Object(Bs.a)(o.phone);r&&(n.validate=()=>!!n.value.match(/\d/),n.value="+"+r.code.country_code);const c=new Je({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(s.container,i.container,c.avatarElem),this.container.append(t,n.container),this.show()}}class nn extends z{init(){this.container.id="contacts-container";const e=Q({icon:"add",className:"is-visible"});this.content.append(e),Object(l.b)(e,()=>{new sn},{listenerSetter:this.listenerSetter}),this.inputSearch=new _("Search",e=>{this.openContacts(e)}),this.listenerSetter.add(a.default)("contacts_update",e=>{const t=k.a.isContact(e),s=e.toPeerId();t?this.sortedUserList.add(s):this.sortedUserList.delete(s)}),this.title.replaceWith(this.inputSearch.container),this.middleware=Object(Ps.a)()}createList(){const e=new Fs,t=e.list;return t.id="contacts",t.classList.add("contacts-container"),Vo.setListClickListener(t,()=>{this.close()},void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!re.IS_MOBILE&&li(!0)&&this.inputSearch.input.focus()}openContacts(e){this.init&&(this.init(),this.init=null),this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",k.a.getContactsPeerIds(e,void 0,"online").then(e=>{if(!t())return;const s=this.sortedUserList=this.createList();let i=()=>{const t=St.a.windowH/72*1.25|0;e.splice(0,t).forEach(e=>{s.add(e)}),e.length||(i=void 0,this.scrollable.onScrolledBottom=null)};i(),this.scrollable.onScrolledBottom=()=>{i?i():this.scrollable.onScrolledBottom=null},Object(T.a)(this.scrollable.container,s.list)})}open(){return this.openContacts(),super.open()}}class an extends z{init(){if(this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),!Vo.sortedLists[an.filterId]){const e=Vo.createChatList();Vo.generateScrollable(e,an.filterId).container.append(e),Vo.setListClickListener(e,null,!0)}const e=Vo.scrollables[an.filterId];this.scrollable.container.replaceWith(e.container),this.scrollable=e}onOpen(){this.init&&(this.init(),this.init=null),this.wasFilterId=Vo.filterId,Vo.setFilterId(an.filterId),Vo.onTabChange()}onOpenAfterTimeout(){Vo.sortedLists[this.wasFilterId].clear()}onClose(){Vo.setFilterId(this.wasFilterId),Vo.onTabChange()}onCloseAfterTimeout(){return Vo.sortedLists[an.filterId].clear(),super.onCloseAfterTimeout()}}an.filterId=1;var on=s(8),rn=s(65);class ln{constructor(e){if(this.container=document.createElement("div"),this.container.classList.add("sidebar-left-section"),e.fakeGradientDelimiter)this.container.append(dn()),this.container.classList.add("with-fake-delimiter");else if(e.noDelimiter)this.container.classList.add("no-delimiter");else{const e=document.createElement("hr");this.container.append(e)}this.content=this.generateContentElement(),e.name&&(this.title=document.createElement("div"),this.title.classList.add("sidebar-left-h2","sidebar-left-section-name"),Object(x.i18n_)({element:this.title,key:e.name}),this.content.append(this.title)),e.caption&&(this.caption=this.generateContentElement(),this.caption.classList.add("sidebar-left-section-caption"),!0!==e.caption&&Object(x.i18n_)({element:this.caption,key:e.caption}))}generateContentElement(){const e=document.createElement("div");return e.classList.add("sidebar-left-section-content"),this.container.append(e),e}}const cn=(e,t,s)=>{const i=new ln({name:t,caption:s});return e.append(i.container),i.content},dn=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e},hn=new class extends W{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={},this.inputSearch=new _("Search");const e=this.sidebarEl.querySelector(".item-main .sidebar-header");e.append(this.inputSearch.container);const t=()=>{new nn(this).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const s={icon:"archive",text:"ArchivedChats",onClick:()=>{new an(this).open()},verify:()=>!!i.a.dialogsStorage.getFolderDialogs(1,!1).length||!i.a.dialogsStorage.isDialogsLoaded(1)},n=new ut.a({toggle:!0,checked:"night"===a.default.getTheme().name});n.input.addEventListener("change",()=>{a.default.settings.theme=n.input.checked?"night":"day",C.default.pushToState("settings",a.default.settings),So.applyCurrentTheme()}),a.default.addEventListener("theme_change",()=>{n.setValueSilently("night"===a.default.getTheme().name)});const o=[{icon:"saved",text:"SavedMessages",onClick:()=>{setTimeout(()=>{So.setPeer(So.myId)},0)}},s,{icon:"user",text:"Contacts",onClick:t},{icon:"settings",text:"Settings",onClick:()=>{new Zi(this).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:n},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new ut.a({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{So.openUsername("TelegramTips")}},{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([rn.a.set({kz_version:"Z"}),rn.a.delete("tgme_sync")]).then(()=>{location.href="https://web.telegram.org/z/"})},verify:()=>on.a.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{rn.a.delete("tgme_sync").then(()=>{location.href="https://web.telegram.org/?legacy=1"})},verify:()=>on.a.isMainDomain}];this.toolsBtn=Me({},"bottom-right",o,e=>{o.forEach(e=>{e.verify&&e.element.classList.toggle("hide",!e.verify())})}),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn);const r=this.toolsBtn.querySelector(".btn-menu"),c=document.createElement("a");c.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",c.target="_blank",c.rel="noopener noreferrer",c.classList.add("btn-menu-footer"),c.addEventListener(l.a,e=>{e.stopPropagation(),Object(te.c)()});const d=document.createElement("span");d.classList.add("btn-menu-footer-text"),d.innerHTML="Telegram Web"+on.a.suffix+" alpha "+on.a.versionFull,c.append(d),r.classList.add("has-footer"),r.append(c),this.newBtnMenu=Me({},"top-left",[{icon:"newchannel",text:"NewChannel",onClick:()=>{new en(this).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{new jt(this).open({type:"chat",skippable:!1,takeOut:e=>{new $(this).open(e)},title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:t}]),this.newBtnMenu.className="btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon",this.newBtnMenu.insertAdjacentHTML("afterbegin",'\n \n \n '),this.newBtnMenu.id="new-menu",e.nextElementSibling.append(this.newBtnMenu),this.inputSearch.input.addEventListener("focus",()=>this.initSearch(),{once:!0}),this.archivedCount=document.createElement("span"),this.archivedCount.className="archived-count badge badge-24 badge-gray",s.element.append(this.archivedCount),a.default.addEventListener("folder_unread",e=>{if(1===e.id){const t=e.unreadDialogsCount;this.archivedCount.innerText=""+Object(M.c)(t,1),this.archivedCount.classList.toggle("hide",!t)}}),k.a.getTopPeers("correspondents"),C.default.getState().then(e=>{const t=e.recentSearch||[];for(let e=0,s=t.length;e{this.backBtn.click()};this.searchGroups={contacts:new A("Search.Chats","contacts",void 0,void 0,void 0,void 0,s),globalContacts:new A("Search.Global","contacts",void 0,void 0,void 0,void 0,s),messages:new A("Search.Messages","messages"),people:new A(!1,"contacts",!0,"search-group-people",!0,!1,s),recent:new A("Recent","contacts",!0,"search-group-recent",!0,!0,s)};const n=this.searchSuper=new Js({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"FilterChats",type:"chats"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:t,searchGroups:this.searchGroups,asChatList:!0,hideEmptyTabs:!1,showSender:!0});e.prepend(n.nav.parentElement.parentElement),t.container.append(n.container);n.setQuery({peerId:"".toPeerId(),folderId:0}),n.selectTab(0),n.load(!0);let a=[],o="".toPeerId(),r=0,l=0;const c=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===a.length),this.inputSearch.container.classList.toggle("is-picked",!!a.length),a.length?this.inputSearch.input.style.setProperty("--paddingLeft",a[a.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},d=document.createElement("div");d.classList.add("search-helper"),d.addEventListener("click",e=>{const t=Object(Ce.a)(e.target,"selector-user");if(!t)return;const s=t.dataset.key;if(0===s.indexOf("date_")){const[e,t,i]=s.split("_");r=+t,l=+i}else o=s.toPeerId();t.addEventListener("click",()=>{u(t)}),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),a.push(t),c()}),n.nav.parentElement.append(d);const h=(e,t)=>{const s=document.createElement("div");s.classList.add("selector-user");const i=document.createElement("avatar-element");return i.classList.add("selector-user-avatar","tgico"),i.setAttribute("dialog","1"),i.classList.add("avatar-30"),s.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new wt.a({peerId:e.toPeerId()}).element),i.setAttribute("peer",""+e)):i.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?s.innerHTML=t:(Object(T.a)(s,t),s.append(t))),s.insertAdjacentElement("afterbegin",i),s},u=e=>{0===e.dataset.key.indexOf("date_")?r=l=0:o="".toPeerId(),e.remove(),Object(f.e)(a,e),setTimeout(()=>{c(),this.inputSearch.onChange(this.inputSearch.value)},0)};this.inputSearch.onClear=()=>{a.forEach(e=>{u(e)})},this.inputSearch.onChange=e=>{if(n.cleanupHTML(),n.setQuery({peerId:o,folderId:o?void 0:0,query:e,minDate:r,maxDate:l}),n.load(!0),d.innerHTML="",n.nav.classList.remove("hide"),!o&&e.trim()){const t=n.middleware.get();Promise.all([i.a.getConversations(e).promise.then(({dialogs:e})=>e.map(e=>e.peerId)),k.a.getContactsPeerIds(e,!0)]).then(e=>{if(!t())return;new Set(e[0].concat(e[1])).forEach(e=>{d.append(h(e))}),n.nav.classList.toggle("hide",!!d.innerHTML)})}if(!r&&e.trim()){const t=[];Object(oe.b)(e,t),t.forEach(e=>{d.append(h("date_"+e.minDate+"_"+e.maxDate,e.title))}),n.nav.classList.toggle("hide",!!d.innerHTML)}},n.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",e=>{const t=Object(bt.a)(e.target,"LI");if(!t)return;const s=Object(Ce.a)(t,"search-group");if(!s||s.classList.contains("search-group-recent")||s.classList.contains("search-group-people"))return;const i=t.getAttribute("data-peer-id").toPeerId();C.default.getState().then(e=>{const t=e.recentSearch||[];if(t[0]!==i){Object(f.e)(t,i),t.unshift(i),t.length>20&&(t.length=20),C.default.pushToState("recentSearch",t);for(const e of t)C.default.requestPeer(e,"recentSearch")}})},{capture:!0});let p=document.createElement("div");p.classList.add("search-group-scrollable"),p.append(this.searchGroups.people.list),this.searchGroups.people.container.append(p);new P.a(p);let m,g=!0;const b=Object(j.a)(e.parentElement,"zoom-fade",150,e=>{m&&clearTimeout(m),0!==e||g||(n.selectTab(0,!1),this.inputSearch.onClearClick(),m=window.setTimeout(()=>{m=0,this.newBtnMenu.classList.remove("is-hidden")},150)),g=!1});b(0);const v=()=>{this.toolsBtn.classList.remove("is-visible"),this.backBtn.classList.add("is-visible"),this.newBtnMenu.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0),re.IS_MOBILE_SAFARI||D.a.findItemByType("global-search")||D.a.pushItem({onPop:()=>{s()},type:"global-search"}),b(1)};this.inputSearch.input.addEventListener("focus",v),v(),this.backBtn.addEventListener("click",e=>{this.toolsBtn.classList.add("is-visible"),this.backBtn.classList.remove("is-visible"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),D.a.removeByType("global-search"),b(0)});const y=document.createElement("button");y.classList.add("btn-icon","tgico-close"),this.searchGroups.recent.nameEl.append(y),y.addEventListener("click",()=>{this.searchGroups.recent.clear(),C.default.pushToState("recentSearch",[])})}};de.a.appSidebarLeft=hn;var un=hn;class pn{constructor(e){this.chat=e,this.bubbles=[],this.detailsMap=new Map,this.groups=[],this.newGroupDiff=121}removeBubble(e){const t=this.detailsMap.get(e);t&&(t.group.length&&(t.group.findAndSplice(t=>t.bubble===e),t.group.length?this.updateGroup(t.group):Object(f.e)(this.groups,t.group)),this.detailsMap.delete(e))}changeBubbleMid(e,t){const s=this.detailsMap.get(e);s&&(s.mid=t)}addBubble(e,t,s){const i=t.date,n=t.mid;let o,r=t.viaBotId||t.fromId;r===a.default.myId&&t.peerId===a.default.myId&&t.fwdFromId===r&&(r=r.toPeerId(!0)),this.removeBubble(e);const l={bubble:e,mid:n,timestamp:i};if(this.bubbles.length){let e,t=-1;for(let e=0;es.mid)break}if(-1!==t&&(e=this.bubbles[t]),e){o=e.group;let t=0,s=0;for(;tt.mid===e);t&&this.updateGroup(t.group)}cleanup(){this.bubbles=[],this.groups=[],this.detailsMap.clear()}}class mn extends ht.b{constructor(e,t,s={}){if(super("popup-date-picker",s.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],Object.assign({body:!0,overlayClosable:!0},s)),this.onPick=t,this.options=s,this.onPrevClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()-1),this.setMonth(),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.nextBtn.removeAttribute("disabled")},this.onNextClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()+1),this.setMonth(),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),this.prevBtn.removeAttribute("disabled")},this.onDateClick=e=>{const t=e.target;if(!t.dataset.timestamp)return;if(this.selectedEl){if(this.selectedEl===t)return;this.selectedEl.classList.remove("active")}this.selectedEl=t,t.classList.add("active");const s=+t.dataset.timestamp;this.selectedDate=new Date(s),this.setTitle(),this.setTimeTitle()},this.minDate=s.minDate||new Date("2013-08-01T00:00:00"),e{const n=""+e;this.listenerSetter.add(t.input)("input",a=>{let o=t.value.replace(/\D/g,"");o.length>2?o=o.slice(0,2):(1===o.length&&+o[0]>+n[0]||2===o.length&&+o>e)&&(2===o.length&&i&&i(+o[1]),o="0"+o[0]),t.setValueSilently(o),s(o.length)})};this.hoursInputField=new F.b({plainText:!0}),this.minutesInputField=new F.b({plainText:!0}),s(23,this.hoursInputField,e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()},e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)}),s(59,this.minutesInputField,e=>{e||this.hoursInputField.input.focus(),this.setTimeTitle()}),this.selectedDate=e,e.setMinutes(e.getMinutes()+10),this.hoursInputField.setValueSilently(("0"+e.getHours()).slice(-2)),this.minutesInputField.setValueSilently(("0"+e.getMinutes()).slice(-2)),e.setHours(0,0,0,0),this.timeDiv.append(this.hoursInputField.container,t,this.minutesInputField.container),Object(l.b)(this.btnConfirm,()=>{this.onPick&&(this.selectedDate.setHours(+this.hoursInputField.value||0,+this.minutesInputField.value||0,0,0),this.onPick(this.selectedDate.getTime()/1e3|0)),this.hide()},{listenerSetter:this.listenerSetter}),this.body.append(this.timeDiv),this.prevBtn.classList.add("primary"),this.nextBtn.classList.add("primary")}const i=document.createElement("div");i.classList.add("popup-centerer"),i.append(this.container),this.element.append(i),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=s.maxDate||new Date,this.maxDate.setHours(0,0,0,0),this.selectedMonth=new Date(this.selectedDate),this.selectedMonth.setDate(1),this.maxMonth=new Date(this.maxDate),this.maxMonth.setDate(1),this.minMonth=new Date(this.minDate),this.minMonth.setHours(0,0,0,0),this.minMonth.setDate(1),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),s.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e,t=[];const s=new Date;s.setHours(0,0,0,0);const i={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===s.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const i={month:"short",day:"numeric"};n.getFullYear()!==s.getFullYear()&&(i.year="numeric"),t.push(new x.default.IntlDateElement({date:n,options:i}).element)}t.push(new x.default.IntlDateElement({date:n,options:i}).element),this.btnConfirm.firstChild.replaceWith(Object(x.i18n)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new x.default.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const s=document.createElement("button");return s.classList.add("btn-icon","date-picker-month-date"),e&&s.setAttribute("disabled","true"),t&&s.append(t),s}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&b.b.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new x.default.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const s=new Date,i=s.getDay();1!==i&&s.setHours(-24*(i-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new x.default.IntlDateElement({date:s,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),s.setDate(s.getDate()+1)}let n=e.getDay()-1;-1===n&&(n=6);const a=new Date(e.getTime());a.setDate(a.getDate()-n-1);for(let e=0;ethis.maxDate||e{for(const t of e){const e=t.boundingClientRect,s=t.target.parentElement,i=t.rootBounds;e.bottom=i.top&&e.bottom{let t=e.filter(e=>e.boundingClientRect.top<0).sort((e,t)=>e.boundingClientRect.top-t.boundingClientRect.top)[0];if(!t)return;let s=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,s)},{root:this.container})}addSentinel(e,t){const s=document.createElement("div");return s.classList.add("sticky_sentinel",t),e.appendChild(s)}observeStickyHeaderChanges(e){const t=this.addSentinel(e,"sticky_sentinel--top");this.headersObserver.observe(t),this.elementsObserver.observe(e)}disconnect(){this.headersObserver.disconnect(),this.elementsObserver.disconnect()}unobserve(e,t){this.elementsObserver.unobserve(e),this.headersObserver.unobserve(t)}}a.default.addEventListener("replies_updated",e=>{const t=e;Array.from(document.querySelectorAll(`replies-element[data-post-key="${t.peerId}_${t.mid}"]`)).forEach(e=>{e.message=t,e.render()})});class bn extends HTMLElement{constructor(){super(),this.updated=!1}init(){this.render(),this.dataset.postKey=this.message.peerId+"_"+this.message.mid,this.classList.add("replies","replies-"+this.type)}render(){const e=this.message.replies;if("footer"===this.type){let t,s;if(this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),t||(t=document.createElement("div"),t.classList.add("replies-footer-avatars")),e.recent_repliers.slice().reverse().forEach((e,s)=>{let i=t.children[s];i||(i=new _o,i.setAttribute("dialog","0"),i.classList.add("avatar-30"),i.lazyLoadQueue=this.lazyLoadQueue,this.loadPromises&&(i.loadPromises=this.loadPromises)),i.setAttribute("peer",""+o.a.getPeerId(e)),i.parentNode||t.append(i)}),Array.from(t.children).slice(e.recent_repliers.length).forEach(e=>e.remove())):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.append(t),s=e?e.replies?Object(x.i18n)("Comments",[e.replies]):Object(x.i18n)("LeaveAComment"):Object(x.i18n)("ViewInChat"),e){const t=i.a.getHistoryStorage(e.channel_id.toPeerId(!0));let s=!1;e.replies&&(s=void 0!==e.read_max_id&&void 0!==e.max_id?e.read_max_id${(null==e?void 0:e.replies)?Object(M.c)(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(i.a.subscribeRepliesThread(this.message.peerId,this.message.mid),i.a.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define("replies-element",bn);const vn=()=>{const e=document.createElement("i");return e.classList.add("edited"),Object(x._i18n)(e,"EditedMessage"),e};var fn,yn;(yn=fn||(fn={})).setTime=(e,t,s,i,n)=>{var a;const o=new Date(1e3*t.date),r=[];let l,c=Object(oe.e)(o);if(t.views){const e=t.post_author||(null===(a=t.fwd_from)||void 0===a?void 0:a.post_author);s.classList.add("channel-post");const i=document.createElement("span");i.classList.add("post-views"),i.innerHTML=Object(M.c)(t.views,1);const n=document.createElement("i");if(n.classList.add("tgico-channelviews","time-icon"),r.push(i,n),e){const t=document.createElement("span");t.innerHTML=J.b.wrapEmojiText(e)+", ",r.push(t)}}if(t.edit_date&&"scheduled"!==e.type&&!t.pFlags.edit_hide&&(s.classList.add("is-edited"),r.unshift(l=vn())),"pinned"!==e.type&&t.pFlags.pinned){s.classList.add("is-pinned");const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),r.unshift(e)}r.push(c);const d=Object(oe.f)(o)+(t.edit_date?"\nEdited: "+Object(oe.f)(new Date(1e3*t.edit_date)):"")+(t.fwd_from?"\nOriginal: "+Object(oe.f)(new Date(1e3*t.fwd_from.date)):""),h=document.createElement("span");h.classList.add("time","tgico"),h.title=d,h.append(...r);const u=document.createElement("div");u.classList.add("inner","tgico"),u.title=d;let p=r;return l&&(p[p.indexOf(l)]=vn()),p=p.map(e=>e instanceof HTMLElement&&!e.classList.contains("i18n")?e.cloneNode(!0):e),p[p.length-1]=Object(oe.e)(o),u.append(...p),h.append(u),n.append(h),h},yn.renderReplies=({bubble:e,bubbleContainer:t,message:s,messageDiv:i,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new bn;return r.message=s,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},yn.setReply=({chat:e,bubble:t,bubbleContainer:s,message:i})=>{const n=!s;n&&(s=t.querySelector(".bubble-content"));const a=n?s.querySelector(".reply"):null;if(!i.reply_to_mid)return a&&a.remove(),void t.classList.remove("is-reply");const o=i.reply_to.reply_to_peer_id?e.appPeersManager.getPeerId(i.reply_to.reply_to_peer_id):e.peerId;let r,l=e.appMessagesManager.getMessageByPeer(o,i.reply_to_mid);"messageEmpty"===l._?(e.appMessagesManager.wrapSingleMessage(o,i.reply_to_mid),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:i.reply_to_mid,mid:i.mid}),r=Object(x.i18n)("Loading")):r=new wt.a({peerId:l.fromId||l.fwdFromId,dialog:!1,onlyFirstName:!1,plainText:!1}).element;const c=Is(r,void 0,l);a?a.replaceWith(c):s.append(c),t.classList.add("is-reply")};var wn=s(124);function Sn(e,t,s){const i=e.getBoundingClientRect(),n="center"===s?Math.ceil(i.left+(i.right-i.left)/2+1):Math.ceil(i.left+1),a="bottom"===t?Math.floor(i.top+i.height-1):Math.ceil(i.top+1);return document.elementFromPoint(n,a)}function Ln(e){e.style.display="none",e.offsetLeft,e.style.display=""}de.a.getElementByPoint=Sn;var En=s(81),In=s(144),Mn=s(111),Cn=s(80);const kn={keywords:{},version:0,langCode:on.a.langPackCode};class Pn{constructor(){this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={}}getEmojiKeywords(e=on.a.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const s="emojiKeywords_"+e;return this.getKeywordsPromises[e]=Cn.a.get(s).then(t=>(Object(In.a)(t)||(t={}),Object(w.k)(kn,t),t.langCode=e,this.keywordLangPacks[e]=t,ct.a.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then(e=>{t.version=e.version;const i=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return x.default.lastRequestedLangCode!==on.a.langPackCode&&e.push(this.getEmojiKeywords(x.default.lastRequestedLangCode)),this.recent||e.push(this.getRecentEmojis()),Promise.all(e)}indexEmojis(){this.index||(this.index=new Mn.a(void 0,2));for(const e in this.keywordLangPacks){if(this.indexedLangPacks[e])continue;const t=this.keywordLangPacks[e].keywords;for(const e in t){const s=t[e];this.index.indexObject(s,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const s=this.index.search(e);t=Array.from(s).reduce((e,t)=>e.concat(t),[])}else t=this.recent.concat(Pn.POPULAR_EMOJI).slice(0,36);return t=Array.from(new Set(t)),t}getRecentEmojis(){return this.getRecentEmojisPromise?this.getRecentEmojisPromise:this.getRecentEmojisPromise=C.default.getState().then(e=>this.recent=Array.isArray(e.recentEmoji)?e.recentEmoji:[])}pushRecentEmoji(e){e=J.b.fixEmoji(e),this.getRecentEmojis().then(t=>{Object(f.e)(t,e),t.unshift(e),t.length>36&&(t.length=36),C.default.pushToState("recentEmoji",t),a.default.dispatchEvent("emoji_recent",e)})}}Pn.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];const Tn=new Pn;de.a&&(de.a.appEmojiManager=Tn);var xn=Tn,An=s(129),On=s(10);const Fn=new Set;function _n(e,t,s=!1,i=!1){const n=document.createElement("span");let o;if(n.classList.add("super-emoji"),i&&!On.a?o=J.a.wrapSingleEmoji(e):(e=J.a.fixEmoji(e),o=J.a.wrapEmojiText(e)),n.innerHTML=o,n.children.length>1){const e=n.firstElementChild;n.innerHTML="",n.append(e)}if(n.firstElementChild&&!On.a){const e=n.firstElementChild,t=e.src;if(!Fn.has(t)){e.setAttribute("loading","lazy");const s=document.createElement("span");s.classList.add("emoji-placeholder"),a.default.settings.animationsEnabled&&(e.style.opacity="0",s.style.opacity="1"),e.addEventListener("load",()=>{Object(Fe.b)(()=>{a.default.settings.animationsEnabled&&(e.style.opacity="",s.style.opacity=""),n.classList.remove("empty"),Fn.add(t)})},{once:!0}),n.append(s)}}s?t.prepend(n):t.appendChild(n)}function jn(e){return Object(Ce.a)(e,"super-emoji")?3===e.nodeType?e.nodeValue:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),e.getAttribute("alt")||e.innerText):""}class Dn{constructor(){this.closeScrollTop=0,this.onContentClick=e=>{Object(c.a)(e);const t=jn(e.target);t&&(So.chat.input.onEmojiSelected(t,!1),pe.IS_TOUCH_SUPPORTED&&Object(Vs.a)())}}init(){this.content=document.getElementById("content-emoji");const e=["Emoji.SmilesAndPeople","Emoji.AnimalsAndNature","Emoji.FoodAndDrink","Emoji.TravelAndPlaces","Emoji.ActivityAndSport","Emoji.Objects","Emoji.Flags","Skin Tones"],t={},s=new Map([["Emoji.Recent",[]]]);for(const t in An.a.Emoji){const i=""+An.a.Emoji[t],n=e[+i[0]-1];if(!n)continue;let a=s.get(n);a||(a=[],s.set(n,a)),a[+i.slice(1)||0]=t}s.delete(e.pop()),s.forEach((e,s)=>{const i=document.createElement("div");i.classList.add("emoji-category");const n=document.createElement("div");n.classList.add("category-title"),n.append(Object(x.i18n)(s));const a=document.createElement("div");a.classList.add("super-emojis"),i.append(n,a),e.forEach(e=>{_n(Object(ie.a)(e),a,!1)}),t[s]=i});const i=this.menu=this.content.previousElementSibling,n=this.scroll=new P.b(this.content,"EMOJI"),o=Object(te.f)(this.content,!0);Promise.all([Object(En.a)(200),xn.getRecentEmojis().then(e=>{const t=!!e.length,s=t?0:1;this.menu.children[0].classList.toggle("hide",!t),this.menu.children[s].classList.add("active");const a=ea.menuOnClick(i,n,void 0,s);return this.stickyIntersector=a.stickyIntersector,this.setMenuActive=a.setActive,e})]).then(([s,i])=>{o.remove(),this.recentItemsDiv=t["Emoji.Recent"].querySelector(".super-emojis");for(const e of i)_n(e,this.recentItemsDiv);this.recentItemsDiv.parentElement.classList.toggle("hide",!this.recentItemsDiv.childElementCount),e.unshift("Emoji.Recent"),e.map(e=>{const s=t[e];return s||console.error("no div by category:",e),n.container.append(s),this.stickyIntersector.observeStickyHeaderChanges(s),s})}),this.content.addEventListener("click",this.onContentClick),this.init=null,a.default.addEventListener("emoji_recent",e=>{const t=Array.from(this.recentItemsDiv.children);for(let s=0,i=t.length;s{this.closeScrollTop=this.scroll.scrollTop})}onClose(){}}var Bn=s(118),Rn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Un{constructor(e,t,s,i=!0){this.element=e,this.group=t,this.scrollable=s,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=Object(ae.a)(),this.timeout=window.setTimeout(()=>{this.timeout=0,this.scrollPromise.resolve()},150)},this.processInvisibleDiv=e=>this.scrollPromise.then(()=>Rn(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),s=e.querySelector("img");if(s&&(s&&s.classList.remove("hide"),yield Object(Fe.a)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t){t.remove(),t.src="",t.load();I.a.getAnimations(t).forEach(e=>{I.a.checkAnimation(e,!0,!0)})}}))),this.lazyLoadQueue=new ee.c(void 0,(e,t)=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)}),i&&this.attach()}attach(){this.scrollable.container.addEventListener("scroll",this.onScroll)}detach(){this.clear(),this.scrollable.container.removeEventListener("scroll",this.onScroll)}clear(){this.lazyLoadQueue.clear()}processVisibleDiv(e){if(e.querySelector("video"))return;this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId,s=E.a.getDoc(t);return this.scrollPromise.then(()=>{const t=fs({doc:s,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0}).loadPromise;return t.finally(()=>{const t=e.querySelector("video");e.style.opacity="";const s=e.querySelector("img");s&&s.classList.add("hide"),t&&!t.parentElement&&setTimeout(()=>{t.src="",t.load();I.a.getAnimations(t).forEach(e=>{I.a.checkAnimation(e,!0,!0)})},0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)}),t})}})}add(e,t=this.element){var s;let i=e.w,n=e.h;n<100&&(i*=100/n,n=100);const a=Math.min(300,400,i),o=Object(Bn.a)(i,n,a,100),r=document.createElement("div");r.classList.add("gif","fade-in-transition"),r.style.width=o.width+"px",r.style.opacity="0",r.dataset.docId=""+e.id,t.append(r),this.lazyLoadQueue.observe(r);const l=E.a.getThumb(e,!1);let c;!!l&&(c=new Image,c.classList.add("media-poster"),l.cacheContext.url||l.promise.then(()=>{c.src=l.cacheContext.url}));const d=()=>{c&&(r.append(c),r.style.opacity="")};(null===(s=null==l?void 0:l.cacheContext)||void 0===s?void 0:s.url)?Object(as.a)(c,l.cacheContext.url,d):d()}}class Hn{init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;e.addEventListener("click",ea.onMediaClick);const t=new P.b(this.content,"GIFS"),s=new Un(e,Zn,t),i=Object(te.f)(this.content,!0);ct.a.invokeApi("messages.getSavedGifs",{hash:"0"}).then(e=>{"messages.savedGifs"===e._&&e.gifs.forEach((t,i)=>{e.gifs[i]=t=E.a.saveDoc(t),s.add(t)}),i.remove()}),sa.addLazyLoadQueueRepeat(s.lazyLoadQueue,s.processInvisibleDiv),this.init=null}onClose(){}}var Nn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class zn{constructor(e,t){this.regularLazyLoadQueue=e,this.group=t,this.animatedDivs=new Set,this.checkAnimationContainer=(e,t)=>{I.a.getAnimations(e).forEach(e=>{t?I.a.checkAnimation(e,!1):I.a.checkAnimation(e,!0,!0)})},this.processVisibleDiv=e=>{const t=e.dataset.docId,s=E.a.getDoc(t),i=b.b.active.esgSticker.width,n=Ls({doc:s,div:e,width:i,height:i,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0});return n.then(()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))}),n},this.processInvisibleDiv=e=>{const t=e.dataset.docId,s=E.a.getDoc(t);this.checkAnimationContainer(e,!1),e.innerHTML="",this.renderSticker(s,e)},this.lazyLoadQueue=new ee.b(void 0,(e,t)=>{t||this.processInvisibleDiv(e)})}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,s){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),2===e.sticker&&this.observeAnimatedDiv(t)),Ls({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:2===e.sticker,loadPromises:s}),t}observeAnimatedDiv(e){this.animatedDivs.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisibleDiv})}}class Vn{constructor(){this.stickerSets={},this.recentStickers=[],this.mounted=!1,this.queueCategoryPush=[]}categoryPush(e,t="",s,i){const n=document.createElement("div");n.classList.add("category-items","super-stickers");const a=document.createElement("div");return a.classList.add("category-title"),t&&(a.innerHTML=t),e.append(a,n),this.stickyIntersector.observeStickyHeaderChanges(e),this.queueCategoryPush.push({element:e,prepend:i}),s.then(e=>{e.forEach(e=>{n.append(this.superStickerRenderer.renderSticker(e))}),this.queueCategoryPush.length&&(this.queueCategoryPush.forEach(({element:e,prepend:t})=>{t?this.recentDiv.parentElement?(this.stickersDiv.prepend(e),this.stickersDiv.prepend(this.recentDiv)):this.stickersDiv.prepend(e):this.stickersDiv.append(e)}),this.queueCategoryPush.length=0)}),{titleDiv:a}}renderStickerSet(e,t=!1){return Nn(this,void 0,void 0,(function*(){const s=document.createElement("div");s.classList.add("sticker-category"),s.dataset.id=""+e.id,s.dataset.access_hash=""+e.access_hash;const i=document.createElement("button");i.classList.add("btn-icon","menu-horizontal-div-item"),this.stickerSets[e.id]={stickers:s,tab:i},t?this.menu.insertBefore(i,this.menu.firstElementChild.nextSibling):this.menu.append(i);const n=hs.getStickerSet(e);this.categoryPush(s,J.a.wrapEmojiText(e.title),n.then(e=>e.documents),t);yield n;Es({set:e,container:i,group:Zn,lazyLoadQueue:ea.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){this.content=document.getElementById("content-stickers"),this.recentDiv=document.createElement("div"),this.recentDiv.classList.add("sticker-category","stickers-recent");let e=this.content.previousElementSibling;this.menu=e.firstElementChild;let t=new P.a(e);this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("stickers-categories"),this.content.append(this.stickersDiv),a.default.addEventListener("stickers_installed",e=>{const t=e;!this.stickerSets[t.id]&&this.mounted&&this.renderStickerSet(t,!0)}),a.default.addEventListener("stickers_deleted",e=>{const t=e;if(this.stickerSets[t.id]&&this.mounted){const e=this.stickerSets[t.id];e.stickers.remove(),e.tab.remove(),delete this.stickerSets[t.id]}}),this.stickersDiv.addEventListener("click",e=>{const t=e.target;if(Object(Ce.a)(t,"category-title")){const e=Object(yt.a)(t,"data-id");new Ui({id:e.dataset.id,access_hash:e.dataset.access_hash}).show()}else ea.onMediaClick(e)});const s=(e=!1)=>{a.default.dispatchEvent("choosing_sticker",!e)};this.scroll=new P.b(this.content,"STICKERS"),this.scroll.setVirtualContainer(this.stickersDiv),this.scroll.onAdditionalScroll=()=>{s()},sa.addEventListener("closed",()=>{s(!0)}),sa.addEventListener("opened",()=>{s()}),this.stickyIntersector=ea.menuOnClick(this.menu,this.scroll,t).stickyIntersector;const i=Object(te.f)(this.content,!0);Promise.all([hs.getRecentStickers().then(e=>{this.recentStickers=e.stickers.slice(0,20),this.stickerSets.recent={stickers:this.recentDiv,tab:this.menu.firstElementChild},i.remove();const{titleDiv:t}=this.categoryPush(this.recentDiv,"",Promise.resolve(this.recentStickers),!0);t.append(Object(x.i18n)("Stickers.Recent"))}),hs.getAllStickers().then(e=>{i.remove();for(let t of e.sets)this.renderStickerSet(t)})]).finally(()=>{this.mounted=!0,s()}),this.superStickerRenderer=new zn(ea.lazyLoadQueue,Zn),sa.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue,this.superStickerRenderer.processInvisibleDiv),this.init=null}pushRecentSticker(e){var t;if(hs.pushRecentSticker(e),!(null===(t=this.recentDiv)||void 0===t?void 0:t.parentElement))return;let s=this.recentDiv.querySelector(`[data-doc-id="${e.id}"]`);s||(s=this.superStickerRenderer.renderSticker(e));const i=this.recentDiv.querySelector(".category-items");i.prepend(s),i.childElementCount>20&&Array.from(i.children).slice(20).forEach(e=>e.remove())}onClose(){}}var Wn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Kn=new class{constructor(){this.inlineResults={},this.setHash={}}getGeoInput(e){return"geoPoint"===e._?{_:"inputGeoPoint",lat:e.lat,long:e.long,accuracy_radius:e.accuracy_radius}:{_:"inputGeoPointEmpty"}}getInlineResults(e,t,s="",i="",n){return ct.a.invokeApi("messages.getInlineBotResults",{bot:k.a.getUserInput(t),peer:o.a.getInputPeerById(e),query:s,geo_point:n?this.getGeoInput(n):void 0,offset:i},{stopTime:-1,noErrorBox:!0}).then(e=>{const t=e.query_id;return e.results.forEach(e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=E.a.saveDoc(e.document)),e.photo&&(e.photo=r.a.savePhoto(e.photo))),this.inlineResults[this.generateQId(t,e.id)]=e}),e})}generateQId(e,t){return e+"_"+t}pushPopularBot(e){k.a.getTopPeers("bots_inline").then(t=>{const s=e.toPeerId(),i=t.findIndex(e=>e.id===s);let n;n=-1!==i?t[i]:{id:s,rating:0},++n.rating,Object(f.f)(t,n,"rating"),C.default.setKeyValueToStorage("topPeersCache")})}switchToPM(e,t,s){return this.setHash[t]={peerId:e,time:Date.now()},a.default.dispatchEvent("history_focus",{peerId:t.toPeerId()}),i.a.startBot(t,void 0,s)}checkSwitchReturn(e){return Wn(this,void 0,void 0,(function*(){const t=k.a.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const s=this.setHash[e];return s&&(delete this.setHash[e],Date.now()-s.time<36e5)?s.peerId:void 0}))}switchInlineQuery(e,t,s,i){a.default.dispatchEvent("history_focus",{peerId:e,threadId:t}),Mi.a.setDraft(e,t,"@"+k.a.getUser(s).username+" "+i)}callbackButtonClick(e,t,s){return ct.a.invokeApi("messages.getBotCallbackAnswer",{peer:o.a.getInputPeerById(e),msg_id:v.a.getServerMessageId(t),data:s.data},{stopTime:-1,noErrorBox:!0}).then(e=>{"string"==typeof e.message&&e.message.length&&ot(J.a.wrapRichText(e.message,{noLinks:!0,noLinebreaks:!0}))})}sendInlineResult(e,t,s,n={}){var a;const o=this.inlineResults[s];if(!o)return;this.pushPopularBot(t);const l=s.split("_"),c=l.shift(),d=l.join("_");if(n.viaBotId=t,n.queryId=c,n.resultId=d,o.send_message.reply_markup&&(n.replyMarkup=o.send_message.reply_markup),"botInlineMessageText"===o.send_message._)n.entities=o.send_message.entities,i.a.sendText(e,o.send_message.message,n);else{let t,s="";const l=o.send_message;switch(l._){case"botInlineMessageMediaAuto":if(s=l.message,"botInlineMediaResult"===o._){const{document:e,photo:s}=o;t=e?E.a.getMediaInput(e):r.a.getMediaInput(s)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(l.geo)},n.geoPoint=l.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(l.geo),title:l.title,address:l.address,provider:l.provider,venue_id:l.venue_id,venue_type:l.venue_type},n.geoPoint=l.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:l.phone_number,first_name:l.first_name,last_name:l.last_name,vcard:l.vcard}}t||(t={_:"messageMediaPending",type:o.type,file_name:o.title||(null===(a=o.content)||void 0===a?void 0:a.url)||o.url,size:0,progress:{percent:30,total:0}}),i.a.sendOther(e,t,n)}}};de.a&&(de.a.appInlineBotsManager=Kn);var Gn=Kn,qn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Qn extends z{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>{const t=Object(Ce.a)(e.target,"gif");if(!t)return;const s=t.dataset.docId;So.chat.input.sendMessageWithDocument(s)?b.b.isMobile&&Qt.onCloseBtnClick():console.warn("got no doc by id:",s)}}init(){this.container.id="search-gifs-container",this.inputSearch=new _("SearchGifsTitle",e=>{this.reset(),this.search(e)}),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),Object(l.b)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new Un(this.gifsDiv,"GIFS-SEARCH",this.scrollable)}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",I.a.checkAnimations(void 0,"GIFS-SEARCH"),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}open(){const e=super.open();return Qt.toggleSidebar(!0).then(()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}),e}search(e,t=!0){return qn(this,void 0,void 0,(function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield k.a.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=Gn.getInlineResults(je.b,this.gifBotPeerId,e,this.nextOffset);const{results:s,next_offset:i}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=i,t&&(this.gifsDiv.innerHTML=""),s.length?s.forEach(e=>{"botInlineMediaResult"===e._&&e.document&&this.masonry.add(e.document)}):this.loadedAll=!0,this.scrollable.onScroll()}catch(e){throw this.searchPromise=null,console.error("gifs loading error:",e),e}}}))}}class $n extends z{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new ee.d,this.inputSearch=new _("StickersTab.SearchPlaceholder",e=>{this.search(e)}),this.title.replaceWith(this.inputSearch.container),this.setsDiv=document.createElement("div"),this.setsDiv.classList.add("sticker-sets"),this.scrollable.append(this.setsDiv),Object(l.b)(this.setsDiv,e=>{const t=Object(Ce.a)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void So.chat.input.sendMessageWithDocument(e)}const s=Object(Ce.a)(e.target,"sticker-set");if(!s)return;const i=s.dataset.stickerSet,n=s.dataset.access_hash,a=Object(Ce.a)(e.target,"sticker-set-button");a?(e.preventDefault(),e.cancelBubble=!0,a.setAttribute("disabled","true"),hs.getStickerSet({id:i,access_hash:n}).then(e=>{hs.toggleStickerSet(e.set).then(t=>{t&&(a.textContent="",a.append(Object(x.i18n)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),a.classList.toggle("gray",!!e.set.installed_date))}).finally(()=>{a.removeAttribute("disabled")})})):hs.getStickerSet({id:i,access_hash:n}).then(e=>{new Ui(e.set).show()})},{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",I.a.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const s=document.createElement("div");s.classList.add("sticker-set-header");const i=document.createElement("div");i.classList.add("sticker-set-details"),i.innerHTML=`\n
${J.a.wrapEmojiText(e.title)}
\n `;const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append(Object(x.i18n)("Stickers",[e.count])),i.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append(Object(x.i18n)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),s.append(i,a);const o=document.createElement("div");o.classList.add("sticker-set-stickers");const r=Math.min(5,e.count);for(let e=0;e{for(let t=0;t{this.renderFeatured()}),e}renderFeatured(){return hs.getFeaturedStickers().then(e=>{this.inputSearch.value||(e=this.filterRendered("",e)).forEach(e=>{this.renderSet(e.set)})})}filterRendered(e,t){t=t.slice();const s=Array.from(this.setsDiv.children);return Object(f.d)(s,s=>{const i=s.dataset.stickerSet,n=t.findIndex(e=>e.set.id===i);-1!==n?t.splice(n,1):e&&s.dataset.title.toLowerCase().includes(e.toLowerCase())||s.remove()}),I.a.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?hs.searchStickerSets(e,!1).then(t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach(e=>{this.renderSet(e.set)})}):this.renderFeatured()}}var Yn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Xn extends B.a{constructor(e){super(!1),this.forceClose=!1,this.inited=!1,this.onMouseOut=e=>{if(clearTimeout(this.displayTimeout),!this.isActive())return;const t=e.toElement;t&&Object(Ks.a)(t,this.element)||(this.displayTimeout=window.setTimeout(()=>{this.toggle(!1)},200))},this.toggle=e=>Yn(this,void 0,void 0,(function*(){const t=!!this.element.style.display&&void 0===e||e;if(this.init){if(!t)return;this.init(),this.init=null}if(t!==this.isActive())if(this.element.style.display&&void 0===e||e){const e=this.dispatchEvent("open");yield Promise.all(e),this.element.style.display="",this.element.offsetLeft,this.element.classList.add("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.forceClose=!1,this.dispatchEvent("opened")},pe.IS_TOUCH_SUPPORTED?0:200)}else this.dispatchEvent("close"),this.element.classList.remove("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")},pe.IS_TOUCH_SUPPORTED?0:200)})),Object(w.g)(this,e)}attachButtonListener(e,t){let s=!0;pe.IS_TOUCH_SUPPORTED?Object(l.b)(e,()=>{s?(s=!1,this.toggle(!0)):this.toggle()},{listenerSetter:t}):t.add(e)("mouseover",i=>{s&&(t.add(e)("mouseout",this.onMouseOut),s=!1),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.toggle(!0)},200)})}init(){pe.IS_TOUCH_SUPPORTED||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||clearTimeout(this.displayTimeout)})}isActive(){return this.element.classList.contains("active")}}var Jn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Zn="emoticons-dropdown";class ea extends Xn{constructor(){super({element:document.getElementById("emoji-dropdown")}),this.tabId=-1,this.onSelectTabClick=e=>{this.tabId!==e&&(I.a.checkAnimations(!0,Zn),this.tabId=e,this.searchButton.classList.toggle("hide",0===this.tabId),this.deleteBtn.classList.toggle("hide",0!==this.tabId))},this.checkRights=()=>{const{peerId:e,threadId:t}=So.chat,s=this.tabsEl.children,n=Array.from(s),a=i.a.canSendToPeer(e,t,"send_stickers");n[2].toggleAttribute("disabled",!a);const o=i.a.canSendToPeer(e,t,"send_gifs");n[3].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||1===Object(Ts.a)(r)||a&&o||this.selectTab(0,!1)},this.addEventListener("open",()=>Jn(this,void 0,void 0,(function*(){pe.IS_TOUCH_SUPPORTED&&Object(Vs.a)()&&(yield Object(En.a)(100)),this.element.parentElement!==So.chat.input.chatInput&&So.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),ea.lazyLoadQueue.lock(),I.a.lockIntersectionGroup(Zn)}))),this.addEventListener("opened",()=>{I.a.unlockIntersectionGroup(Zn),ea.lazyLoadQueue.unlock(),ea.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover")}),this.addEventListener("close",()=>{ea.lazyLoadQueue.lock(),I.a.lockIntersectionGroup(Zn),I.a.checkAnimations(!0,Zn)}),this.addEventListener("closed",()=>{I.a.unlockIntersectionGroup(Zn),ea.lazyLoadQueue.unlock(),ea.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover"),this.savedRange=void 0})}init(){this.emojiTab=new Dn,this.stickersTab=new Vn,this.gifsTab=new Hn,this.tabs={0:this.emojiTab,1:this.stickersTab,2:this.gifsTab},this.container=this.element.querySelector(".emoji-container .tabs-container"),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=Object(Z.a)(this.tabsEl,this.container,this.onSelectTabClick,()=>{const e=this.tabs[this.tabId];e.init&&e.init(),e.onCloseAfterTimeout&&e.onCloseAfterTimeout(),I.a.checkAnimations(!1,Zn)}),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",()=>{1===this.tabId?Qt.isTabExists($n)||new $n(Qt).open():Qt.isTabExists(Qn)||new Qn(Qt).open()}),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),this.deleteBtn.addEventListener("click",e=>{var t;const s=So.chat.input.messageInput;(null===(t=s.lastChild)||void 0===t?void 0:t.tagName)?s.lastElementChild.remove():s.lastChild&&(s.lastChild.textContent.length?s.lastChild.textContent=s.lastChild.textContent.slice(0,-1):s.lastChild.remove());const i=new Event("input",{bubbles:!0,cancelable:!0});So.chat.input.messageInput.dispatchEvent(i),Object(c.a)(e)});const e=re.IS_APPLE_MOBILE,t=e?1:0;return e&&this.tabsEl.children[1].classList.add("hide"),this.tabsEl.children[t+1].click(),this.tabs[t].init&&this.tabs[t].init(),a.default.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",()=>{e.lock()}),this.addEventListener("closed",()=>{const s=e.intersector.getVisible();for(const e of s)t(e);e.intersector.clearVisible()}),this.addEventListener("opened",()=>{e.unlockAndRefresh()})}getSavedRange(){return this.getGoodRange()||this.savedRange}getGoodRange(){const e=document.getSelection();if(e.rangeCount&&document.activeElement===So.chat.input.messageInput)return e.getRangeAt(0)}}ea.lazyLoadQueue=new ee.d,ea.menuOnClick=(e,t,s,i=0)=>{let n=-1;const a=t=>t!==i&&(e.children[i].classList.remove("active"),e.children[t].classList.add("active"),i=t,!0),o=new gn(t.container,(i,o)=>{if(Math.abs(n-t.container.scrollTop)<=1)return;n=-1;const r=Object(Ts.a)(o);!i&&r||(a(r),s&&(r{let s=e.target;if(s=Object(Ce.a)(s,"menu-horizontal-div-item"),!s)return;const i=Object(Ts.a)(s);if(!a(i))return;const o=(t.splitUp||t.container).children[i].offsetTop+1;t.container.scrollTop=n=o}),{stickyIntersector:o,setActive:a}},ea.onMediaClick=(e,t=!1)=>{let s=e.target;if(s=Object(bt.a)(s,"DIV"),!s)return!1;const i=s.dataset.docId;return!!i&&(So.chat.input.sendMessageWithDocument(i,void 0,t)?(ta.container&&(ta.forceClose=!0,ta.container.classList.add("disable-hover"),ta.toggle(!1)),!0):(console.warn("got no doc by id:",i),!1))};const ta=new ea;de.a.emoticonsDropdown=ta;var sa=ta;var ia=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const na=new Set(["messageActionHistoryClear","messageActionChatCreate"]);let aa=void 0,oa=0;class ra{constructor(e,t,s,i,n,o,r,l,d,h){if(this.chat=e,this.appMessagesManager=t,this.appStickersManager=s,this.appUsersManager=i,this.appInlineBotsManager=n,this.appPhotosManager=o,this.appPeersManager=r,this.appProfileManager=l,this.appDraftsManager=d,this.appMessagesIdsManager=h,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.loadedTopTimes=0,this.loadedBottomTimes=0,this.messagesQueuePromise=null,this.messagesQueue=[],this.messagesQueueOnRender=null,this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middleware=Object(Ps.a)(),this.replyFollowHistory=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.onBubblesClick=e=>{var t;let s=e.target,i=null;try{i=Object(Ce.a)(s,"bubble")}catch(e){}if(!i)return;if(i.classList.contains("is-date")&&Object(Ce.a)(s,"bubble-content")){if(i.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages){if(this.dateMessages[e].div===i){new mn(new Date(+e),this.onDatePick).show();break}}return}if(!pe.IS_TOUCH_SUPPORTED&&Object(Ce.a)(s,"time"))return void this.chat.selection.toggleByElement(i);if(this.chat.selection.isSelecting&&e.isTrusted){if(i.classList.contains("service")&&void 0===i.dataset.mid)return;return Object(c.a)(e),pe.IS_TOUCH_SUPPORTED&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement(Object(Ce.a)(s,"grouped-item")||i)}const n=Object(Ce.a)(s,"contact");if(n)return void this.chat.appImManager.setInnerPeer(n.dataset.peerId.toPeerId());if(Object(Ce.a)(s,"replies")){const e=+i.dataset.mid;if(this.peerId===je.c){const t=this.chat.getMessage(e),s=this.appPeersManager.getPeerId(t.reply_to.reply_to_peer_id),i=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread(s,n,i)}else{const t=this.appMessagesManager.filterMessages(this.chat.getMessage(e),e=>!!e.replies)[0],s=t.replies;s&&this.appMessagesManager.getDiscussionMessage(this.peerId,t.mid).then(e=>{this.chat.appImManager.setInnerPeer(s.channel_id.toPeerId(!0),void 0,"discussion",e.mid)})}return}const a=Object(Ce.a)(s,"is-via");if(a){const t=a.querySelector(".peer-title");if(s===t||Object(Ks.a)(s,t)){const s=t.innerText+" ";return this.appDraftsManager.setDraft(this.peerId,this.chat.threadId,s),void Object(c.a)(e)}}const o=Object(Ce.a)(s,"peer-title")||Object(bt.a)(s,"AVATAR-ELEMENT")||Object(yt.a)(s,"data-saved-from");if(o&&o!==i){s=o||s;const e=s.dataset.peerId||s.getAttribute("peer"),t=s.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,s]=t.split("_");this.chat.appImManager.setInnerPeer(e.toPeerId(),+s)}else{const t=e.toPeerId();t!==je.b?this.chat.appImManager.setInnerPeer(t):ot(x.default.format("HidAccount",!0))}return}if(i.classList.contains("sticker")&&s.parentElement.classList.contains("attachment")){const e=+i.dataset.mid,s=null===(t=this.chat.getMessage(e).media)||void 0===t?void 0:t.document;return void((null==s?void 0:s.stickerSetInput)&&new Ui(s.stickerSetInput).show())}const r=Object(Ce.a)(s,"document-with-thumb");if("IMG"===s.tagName&&!s.classList.contains("emoji")&&!s.classList.contains("document-thumb")||s.classList.contains("album-item")||"VIDEO"===s.tagName&&!i.classList.contains("round")||r&&!r.querySelector(".preloader-container")){const t=+(Object(Ce.a)(s,"album-item")||Object(Ce.a)(s,"document-container")||i).dataset.mid,n=this.chat.getMessage(t);if(!n)return void this.log.warn("no message by messageId:",t);const a="webpage",o=i.classList.contains(a),l=r?e=>Mo.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),d=[],h=o?[t]:Object.keys(this.bubbles).map(e=>+e).filter(e=>{const t=this.chat.getMessage(e),s=this.appMessagesManager.getMediaFromMessage(t);return s&&l(s)}).sort((e,t)=>e-t);h.forEach(e=>{let t;if(r)t=".document-container";else{t=".album-item video, .album-item img, .preview video, .preview img, ",t+=this.bubbles[e].classList.contains("with-media-tail")?".bubble__media-container":".attachment video, .attachment img"}const s=Array.from(this.bubbles[e].querySelectorAll(t)),i=new Set;if(r)s.forEach(e=>{d.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})});else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");s.forEach(s=>{if(t&&!Object(Ce.a)(s,"media-container-aspecter"))return;let n=Object(Ce.a)(s,"album-item");const a=n||s.parentElement;i.has(a)||(i.add(a),d.push({element:s,mid:n?+n.dataset.mid:e,peerId:this.peerId}))})}}),d.sort((e,t)=>e.mid-t.mid);let u=d.findIndex(e=>e.mid===t);return de.b&&this.log("open mediaViewer single with ids:",h,u,d),d[u]?((new Mo).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:r?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!o,isScheduled:"scheduled"===this.chat.type}).openMedia(n,d[u].element,0,!0,d.slice(0,u),d.slice(u+1)),void Object(c.a)(e)):void this.log("no target for media viewer!",s)}if(-1===["IMG","DIV","SPAN"].indexOf(s.tagName)&&(s=Object(bt.a)(s,"DIV")),-1!==["DIV","SPAN"].indexOf(s.tagName)){if(s.classList.contains("goto-original")){const e=i.dataset.savedFrom,[t,s]=e.split("_");return void this.chat.appImManager.setInnerPeer(t.toPeerId(),+s)}if(s.classList.contains("forward")){const e=+i.dataset.mid,t=this.appMessagesManager.getMessageByPeer(this.peerId,e);return void new Us({[this.peerId]:this.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!Object(Ce.a)(e.target,"reply")}catch(e){}if(t&&i.classList.contains("is-reply")){const e=+i.dataset.mid;this.replyFollowHistory.push(e);const t=this.chat.getMessage(e),s=t.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer(s,n,this.chat.type,this.chat.threadId)}}},this.onScroll=()=>{this.isHeavyAnimationInProgress&&this.scrolledDown||(pe.IS_TOUCH_SUPPORTED||(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)),this.scrollable.getDistanceToEnd()<300&&this.scrollable.loadedAll.bottom?(this.bubblesContainer.classList.add("scrolled-down"),this.scrolledDown=!0):this.bubblesContainer.classList.contains("scrolled-down")&&(this.bubblesContainer.classList.remove("scrolled-down"),this.scrolledDown=!1),this.chat.topbar.pinnedMessage&&this.chat.topbar.pinnedMessage.setCorrectIndex(this.scrollable.lastScrollDirection))},this.onDatePick=e=>{const t=this.peerId;this.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then(e=>{var s;(null===(s=null==e?void 0:e.messages)||void 0===s?void 0:s.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")})},this.listenerSetter=new R.a,this.bubblesContainer=document.createElement("div"),this.bubblesContainer.classList.add("bubbles","scrolled-down"),this.chatInner=document.createElement("div"),this.chatInner.classList.add("bubbles-inner"),this.setScroll(),this.bubblesContainer.append(this.scrollable.container),this.log=this.chat.log,this.bubbleGroups=new pn(this.chat),this.preloader=new ye.a({cancelable:!1}),this.lazyLoadQueue=new ee.d,this.lazyLoadQueue.queueId=++oa,this.listenerSetter.add(a.default)("history_update",({storage:e,peerId:t,mid:s})=>{if(this.chat.getMessagesStorage()===e){const e=this.bubbles[s];if(!e)return;const t=this.chat.getMessage(s);if(+e.dataset.timestamp>=t.date+Xe.a.serverTimeOffset-1)return void this.bubbleGroups.changeBubbleMid(e,s);this.setBubblePosition(e,t,!1),this.scrollingToBubble&&this.scrollToBubbleEnd()}}),this.listenerSetter.add(a.default)("dialog_flush",({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map(e=>+e))}),this.listenerSetter.add(a.default)("message_sent",e=>{var t,s,i,n,o,r,l,c;const{storage:d,tempId:h,tempMessage:u,mid:p}=e;if(this.chat.getMessagesStorage()!==d)return;const m=this.getMountedBubble(h,u)||this.getMountedBubble(p);if(m){const e=this.chat.getMessage(p),a=m.bubble;if(e.replies){const t=a.querySelector("replies-element");t&&(t.message=e,t.init())}if(null===(t=e.media)||void 0===t?void 0:t.document){const t=a.querySelector(`.document-container[data-mid="${h}"] .document`);if(t){const a=Object(Ce.a)(t,"document-container");!(null===(n=null===(i=null===(s=u.media)||void 0===s?void 0:s.document)||void 0===i?void 0:i.thumbs)||void 0===n?void 0:n.length)&&(null===(o=e.media.document.thumbs)||void 0===o?void 0:o.length)&&t.replaceWith(ys({message:e})),a&&(a.dataset.mid=""+p)}}if(e.grouped_id){const e=a.querySelector(`.grouped-item[data-mid="${h}"]`)||a;e&&(e.dataset.mid=""+p)}if(null===(r=e.media)||void 0===r?void 0:r.poll){const t=a.querySelector("poll-element");if(t){const s=e.media.poll;t.message=e,t.setAttribute("poll-id",s.id),t.setAttribute("message-id",""+p)}}if(null===(l=e.media)||void 0===l?void 0:l.document){const t=a.querySelector(`audio-element[data-mid="${h}"], .document[data-doc-id="${h}"], .media-round[data-mid="${h}"]`);t&&(t instanceof Ue||t.classList.contains("media-round")?(t.dataset.mid=""+e.mid,delete t.dataset.isOutgoing,t.message=e,t.onLoad(!0)):t.dataset.docId=e.media.document.id)}(null===(c=e.media)||void 0===c?void 0:c.webpage)&&!a.querySelector(".web")&&Object(ks.c)().then(()=>{this.safeRenderMessage(e,!0,!1,a,!1),this.scrollToBubbleIfLast(a)})}else this.log.warn("message_sent there is no bubble",e);const g=this.bubbles;if(g[h]){const e=g[h];g[p]=e,delete g[h],Object(Fe.b)(()=>{e.classList.contains("is-sending")&&(e.classList.remove("is-sending"),e.classList.add(this.peerId===a.default.myId&&"scheduled"!==this.chat.type?"is-read":"is-sent"))}),e.dataset.mid=""+p}if(this.unreadOut.has(h)&&(this.unreadOut.delete(h),this.unreadOut.add(p)),"scheduled"===this.chat.type){(Date.now()/1e3|0)>=u.date-10&&this.deleteMessagesByIds([p])}}),this.listenerSetter.add(a.default)("message_edit",({storage:e,peerId:t,mid:s})=>{if(e!==this.chat.getMessagesStorage())return;const i=this.chat.getMessage(s),n=i.grouped_id?this.getGroupedBubble(i.grouped_id):this.getMountedBubble(s);if(!n)return;const a="scheduled"===this.chat.type,o=this.scrolledDown;this.safeRenderMessage(n.message,!0,!1,n.bubble,a),o&&this.scrollToBubbleIfLast(n.bubble),a&&(this.messagesQueuePromise||Promise.resolve()).then(()=>{this.deleteEmptyDateGroups()})}),this.listenerSetter.add(a.default)("album_edit",({peerId:e,groupId:t,deletedMids:s})=>{if(e!==this.peerId)return;const i=this.appMessagesManager.getMidsByAlbum(t).concat(s).find(e=>this.bubbles[e]);if(!i)return;const n=Object(w.e)(this.appMessagesManager.groupedMessagesStorage[t],"asc").pop();this.safeRenderMessage(this.chat.getMessage(n),!0,!1,this.bubbles[i],!1)}),this.listenerSetter.add(a.default)("messages_downloaded",({peerId:e,mids:t})=>{const s=this.getMiddleware();Object(ks.c)().then(()=>{s()&&t.forEach(t=>{Object(f.d)(this.needUpdate,(s,i)=>{if(s.replyMid===t&&s.replyToPeerId===e){const{mid:e,replyMid:t}=this.needUpdate.splice(i,1)[0],n=this.bubbles[e];if(!n)return;const a=this.chat.getMessage(e);this.appMessagesManager.getMessageByPeer(s.replyToPeerId,t).deleted&&delete a.reply_to_mid,fn.setReply({chat:this.chat,bubble:n,message:a})}})})})}),this.listenerSetter.add(this.bubblesContainer)("click",this.onBubblesClick),pe.IS_TOUCH_SUPPORTED){const e="is-gesturing-reply",t=64,s=.75*t;let i,n,a=!1;js({element:this.bubblesContainer,verifyTouchTarget:t=>!(this.chat.selection.isSelecting||!this.appMessagesManager.canSendToPeer(this.peerId,this.chat.threadId))&&(i=Object(Ce.a)(t.target,"bubble"),i&&(Object(Yt.a)(i,e,!0,250),i.offsetLeft,n?(n.classList.remove("is-visible"),n.style.opacity=""):(n=document.createElement("span"),n.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),i.append(n)),!!i),onSwipe:(e,o)=>{a=e>=s,a&&!n.classList.contains("is-visible")&&n.classList.add("is-visible"),n.style.opacity=""+Math.min(1,e/s);const r=-Math.max(0,Math.min(t,e));i.style.transform=`translateX(${r}px)`,Object(te.b)()},onReset:()=>{const t=i;Object(Yt.a)(t,e,!1,250,()=>{n.parentElement===t&&(n.classList.remove("is-visible"),n.remove())}),Object(Fe.b)(()=>{if(t.style.transform="",a){const{mid:e}=t.dataset;this.chat.input.initMessageReply(+e),a=!1}})},listenerOptions:{capture:!0}})}let u;de.b&&this.listenerSetter.add(this.bubblesContainer)("dblclick",e=>{const t=Object(Ce.a)(e.target,"grouped-item")||Object(Ce.a)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",this.chat.getMessage(e)),this.highlightBubble(t)}}),re.IS_MOBILE||this.listenerSetter.add(this.bubblesContainer)("dblclick",e=>{if(this.chat.selection.isSelecting||!this.appMessagesManager.canSendToPeer(this.peerId,this.chat.threadId))return;const t=e.target,s=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(s&&!s.classList.contains("bubble-first")){const e=+s.dataset.mid;if(this.chat.getMessage(e).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}}),this.stickyIntersector=new gn(this.scrollable.container,(e,t)=>{for(const s in this.dateMessages){const i=this.dateMessages[s];if(i.container===t){i.div.classList.toggle("is-sticky",e);break}}}),Object(ks.a)(()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),u=this.getMiddleware()},()=>{this.isHeavyAnimationInProgress=!1,u&&u()&&(this.lazyLoadQueue.unlock(),this.lazyLoadQueue.refresh()),u=null},this.listenerSetter)}constructPeerHelpers(){if(this.listenerSetter.add(a.default)("history_append",({storage:e,mid:t})=>{e===this.chat.getMessagesStorage()&&(this.scrollable.loadedAll.bottom?this.renderNewMessagesByIds([t],!0):this.chat.setMessageId())}),this.listenerSetter.add(a.default)("history_multiappend",e=>{if(!(this.peerId in e))return;const t=Array.from(e[this.peerId]).slice().sort((e,t)=>t-e);this.renderNewMessagesByIds(t)}),this.listenerSetter.add(a.default)("history_delete",({peerId:e,msgs:t})=>{e===this.peerId&&this.deleteMessagesByIds(Array.from(t))}),this.listenerSetter.add(a.default)("dialog_unread",({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),this.updateUnreadByDialog())}),this.listenerSetter.add(a.default)("dialogs_multiupdate",e=>{e[this.peerId]&&this.chat.input.setUnreadCount()}),this.listenerSetter.add(a.default)("dialog_notify_settings",e=>{this.peerId===e.peerId&&this.chat.input.setUnreadCount()}),this.listenerSetter.add(a.default)("chat_update",e=>{if(this.peerId===e.toPeerId(!0)){this.chatInner.classList.contains("has-rights")!==this.appMessagesManager.canSendToPeer(this.peerId,this.chat.threadId)&&(this.finishPeerChange(),this.chat.input.updateMessageInput())}}),this.listenerSetter.add(a.default)("settings_updated",e=>{if("settings.emoji.big"===e.key){const e=this.scrollable.isScrolledDown;e||this.setMessagesQueuePromise();Object(w.e)(this.bubbles,"desc").forEach(e=>{const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji")){const s=this.chat.getMessage(e);this.safeRenderMessage(s,void 0,!1,t)}}),e?this.scrollable.scrollTop=99999:this.performHistoryResult([],!0,!1,void 0)}}),this.listenerSetter.add(a.default)("message_views",({peerId:e,views:t,mid:s})=>{this.peerId===e&&Object(Fe.b)(()=>{const e=this.bubbles[s];if(!e)return;const i=Array.from(e.querySelectorAll(".post-views"));if(i.length){const e=Object(M.c)(t,1);let s=!1;i.forEach(t=>{(s||t.innerHTML!==e)&&(s=!0,t.innerHTML=e)})}})}),this.unreadedObserver=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const t=e.target,s=this.unreaded.get(t);this.onUnreadedInViewport(t,s)}})}),this.viewsObserver=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&(this.viewsMids.add(+e.target.dataset.mid),this.viewsObserver.unobserve(e.target),this.sendViewCountersDebounced())})}),this.sendViewCountersDebounced=lt(()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.appMessagesManager.incrementMessageViews(this.peerId,e)},1e3,!1,!0),"ResizeObserver"in window){let e=this.scrollable.container.offsetHeight,t=!1,s=!1,i=0,n=0,a=0;const o=()=>{const o=this.scrollable.container.offsetHeight,r=this.scrollable.isScrolledDown;o===e||s&&r||(n+=e-o),n&&(this.scrollable.scrollTop+=Math.round(n)),e=o,i=0,a=0,n=0,t=!1,s=!1},r=e=>{a&&window.cancelAnimationFrame(a),a=window.requestAnimationFrame(e?o:()=>{a=window.requestAnimationFrame(o)})};new ResizeObserver(a=>{if(s)return void r(!1);const o=a[0].contentRect.height;if(!e)return void(e=o);const l=e-o;let c=l+n;const d=c%1;if(c-=d,!t&&(t=!0,l<0&&this.scrollable.isScrolledDown))return n=-l,s=!0,void r(!1);if(i+=c,c){const e=this.scrollable.scrollTop+c;this.scrollable.scrollTop=e}r(!1),n=d,e=o}).observe(this.bubblesContainer)}}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.unreadedObserver.unobserve(e),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=a.default.idle.focusPromise.then(()=>{if(!e())return;let t=Math.max(...Array.from(this.unreadedSeen));if(this.scrollable.loadedAll.bottom){const e=Math.max(...Object.keys(this.bubbles).map(e=>+e));t>=e&&(t=Math.max(this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId).maxId||0,t))}this.unreaded.forEach((e,s)=>{e<=t&&this.onUnreadedInViewport(s,e)});const s=[];for(const e of this.unreadedSeen){const t=this.chat.getMessage(e);this.appMessagesManager.isMentionUnread(t)&&s.push(e)}return this.appMessagesManager.readMessages(this.peerId,s),this.unreadedSeen.clear(),de.b&&this.log("will readHistory by maxId:",t),this.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch(e=>{this.log.error("readHistory err:",e),this.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)}).finally(()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())})})}constructPinnedHelpers(){this.listenerSetter.add(a.default)("peer_pinned_messages",e=>{const{peerId:t,mids:s,pinned:i}=e;t===this.peerId&&s&&(i||this.deleteMessagesByIds(s))})}constructScheduledHelpers(){const e=()=>{this.chat.topbar.setTitle(this.appMessagesManager.getScheduledMessagesStorage(this.peerId).size)};this.listenerSetter.add(a.default)("scheduled_new",({peerId:t,mid:s})=>{t===this.peerId&&(this.renderNewMessagesByIds([s]),e())}),this.listenerSetter.add(a.default)("scheduled_delete",({peerId:t,mids:s})=>{t===this.peerId&&(this.deleteMessagesByIds(s),e())})}onGoDownClick(){if(this.replyFollowHistory.length){Object(f.d)(this.replyFollowHistory,(e,t)=>{const s=this.bubbles[e];let i=!0;if(s){const e=s.getBoundingClientRect();i=St.a.windowH/2>e.top}else{this.chat.getMessage(e).deleted||(i=!1)}i&&this.replyFollowHistory.splice(t,1)}),this.replyFollowHistory.sort((e,t)=>t-e);const e=this.replyFollowHistory.pop();this.chat.setMessageId(e)}else this.chat.setMessageId()}getBubbleByPoint(e){let t=Sn(this.scrollable.container,e,"center");return t&&(t=Object(Ce.a)(t,"bubble")),t}getGroupedBubble(e){const t=this.appMessagesManager.groupedMessagesStorage[e];for(const[e]of t)if(this.bubbles[e]){const s=Math.max(...t.keys());return{bubble:this.bubbles[e],mid:+e,message:this.chat.getMessage(s)}}return null}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t=this.chat.getMessage(e)){if(t.grouped_id&&this.appMessagesManager.getMidsByAlbum(t.grouped_id).length>1){const s=this.getGroupedBubble(t.grouped_id);if(s)return s.bubble=s.bubble.querySelector(`.document-container[data-mid="${e}"]`)||s.bubble,s}const s=this.bubbles[e];if(s)return{bubble:s,mid:e,message:t}}findNextMountedBubbleByMsgId(e){return this.bubbles[Object(w.e)(this.bubbles).find(t=>{var s;return!(t+e).sort((e,t)=>e-t);if(s.length)if(e)de.b&&this.log("Will load more (up) history by id:",s[0],"maxId:",s[s.length-1],t),this.getHistory(s[0],!0,void 0,void 0,t);else{const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);if(-1!==s.indexOf(e.maxId))return void this.setLoaded("bottom",!0);de.b&&this.log("Will load more (down) history by id:",s[s.length-1],t),this.getHistory(s[s.length-1],!1,!0,void 0,t)}}setScroll(){this.scrollable=new P.b(null,"IM",300),this.setLoaded("top",!1),this.setLoaded("bottom",!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),pe.IS_TOUCH_SUPPORTED&&(this.scrollable.container.addEventListener("touchmove",()=>{this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling")},{passive:!0}),this.scrollable.container.addEventListener("touchend",()=>{this.chatInner.classList.contains("is-scrolling")&&(this.isScrollingTimeout&&clearTimeout(this.isScrollingTimeout),this.isScrollingTimeout=window.setTimeout(()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0},1350))},{passive:!0}))}updateUnreadByDialog(){const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId),t=this.peerId===a.default.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(t.classList.contains("is-sending"))continue;t.classList.remove("is-sent","is-sending"),t.classList.add("is-read")}this.unreadOut.delete(e)}}deleteMessagesByIds(e,t=!0){e.forEach(e=>{if(!(e in this.bubbles))return;const t=this.bubbles[e];delete this.bubbles[e],this.skippedMids.delete(e),this.firstUnreadBubble===t&&(this.firstUnreadBubble=null),this.bubbleGroups.removeBubble(t),this.unreadedObserver&&(this.unreadedObserver.unobserve(t),this.unreaded.delete(t)),this.viewsObserver&&(this.viewsObserver.unobserve(t),this.viewsMids.delete(e)),t.remove(),this.emptyPlaceholderMid===e&&(this.emptyPlaceholderMid=void 0)}),t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),I.a.checkAnimations(!1,fo),this.deleteEmptyDateGroups()}renderNewMessagesByIds(e,t){if(!this.scrollable.loadedAll.bottom)return;this.chat.threadId&&(e=e.filter(e=>{const t=this.chat.getMessage(e).reply_to;return t&&(t.reply_to_top_id||t.reply_to_msg_id)===this.chat.threadId})),e=e.filter(e=>!this.bubbles[e]),t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()));const s=this.getMiddleware();let i,n=!1;if(!this.isTopPaddingSet){const{clientHeight:e,scrollHeight:t}=this.scrollable.container;n=e===t,n&&(i=this.chatInner,i.style.paddingTop=e+"px",this.scrollable.scrollTop=t,this.isTopPaddingSet=!0)}const a=this.performHistoryResult(e,!1,!0);t&&a.then(()=>{if(!s())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[Math.max(...e)]);const a=this.scrollToBubbleEnd(t)||Promise.resolve();n&&a.then(()=>{s()&&n&&(i.style.paddingTop="",this.isTopPaddingSet=!1)})})}getLastBubble(){const e=this.getLastDateGroup();if(e)return e.lastElementChild}scrollToBubble(e,t,s,i){const n=Object(Ce.a)(e,"bubble");if("center"===t&&Object(Ts.a)(n)===(this.stickyIntersector?2:1)){const s=n.parentElement;0===Object(Ts.a)(s)&&(e=s,t="start")}const a=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper");return this.scrollable.scrollIntoViewNew(e,t,4,void 0,s,i,"y",a?({rect:e})=>{let t=St.a.windowH;return t-=this.bubblesContainer.offsetTop,t-=b.b.isMobile||St.a.windowH<570?58:78,t}:void 0)}scrollToBubbleEnd(e=this.getLastBubble()){if(e){this.scrollingToBubble=e;const t=this.getMiddleware();return this.scrollToBubble(e,"end",void 0,void 0).then(()=>{t()&&(this.scrollingToBubble=void 0)})}}getLastDateGroup(){let e,t=0;for(const s in this.dateMessages){const i=this.dateMessages[s];i.firstTimestamp>t&&(e=i.container,t=i.firstTimestamp)}return e}scrollToBubbleIfLast(e){e.parentElement.lastElementChild===e&&this.getLastDateGroup().parentElement.lastElementChild===e.parentElement&&this.scrollToBubbleEnd(e)}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)}getDateContainerByMessage(e,t){const s=new Date(1e3*e.date);s.setHours(0,0,0);const i=s.getTime();if(!this.dateMessages[i]){let t;const n=new Date;n.setHours(0,0,0,0);const a="scheduled"===this.chat.type;if(n.getTime()===s.getTime())t=Object(x.i18n)(a?"Chat.Date.ScheduledForToday":"Date.Today");else if(a&&2147483646===e.date)t=Object(x.i18n)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};s.getFullYear()!==n.getFullYear()&&(e.year="numeric"),t=new x.default.IntlDateElement({date:s,options:e}).element,a&&(t=Object(x.i18n)("Chat.Date.ScheduledFor",[t]))}const o=document.createElement("div");o.className="bubble service is-date";const r=document.createElement("div");r.classList.add("bubble-content");const l=document.createElement("div");l.classList.add("service-msg"),l.append(t),r.append(l),o.append(r);const c=document.createElement("div");c.className="bubbles-date-group",c.append(o),this.dateMessages[i]={div:o,container:c,firstTimestamp:s.getTime()};const d=Object(w.e)(this.dateMessages,"asc");let h,u=0,p=d.length;for(;u+e)))}else this.isFirstLoad=!0;const p=this.chatInner;this.cleanup();const m=this.chatInner=document.createElement("div");let g;i?(m.className=p.className,m.classList.remove("disable-hover","is-scrolling")):m.classList.add("bubbles-inner"),this.lazyLoadQueue.lock(),g=r?{promise:Object(ks.c)().then(()=>this.performHistoryResult(r.mids,!0,!1,void 0)),cached:!0}:this.getHistory(t,!0,c,h);const{promise:b,cached:v}=g;v||i||(d.container.textContent="",this.chat.finishPeerChange(o,c,t),this.preloader.attach(this.bubblesContainer)),I.a.lockGroup(fo);const f=b.then(()=>{if(v?i||this.chat.finishPeerChange(o,c,t):this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),d.lastScrollDirection=0,d.lastScrollTop=0,Object(T.a)(d.container,m),I.a.unlockGroup(fo),I.a.checkAnimations(!1,fo),this.lazyLoadQueue.unlock(),r)d.scrollTop=r.top;else if(a&&c||o){const e=u>0&&(u{d.checkForTriggers()}),this.chat.dispatchEvent("setPeer",t,!c);const p=this.appMessagesManager.isFetchIntervalNeeded(e);if(r||p?h.then(()=>{if(s()&&(d.checkForTriggers(),p)){const t=()=>{this.fetchNewPromise=new Promise(i=>{s()&&this.appMessagesManager.isFetchIntervalNeeded(e)?this.appMessagesManager.getNewHistory(e,this.chat.threadId).then(e=>{if(!s()||!e)return void i();const n=e.history.slice.isEnd(wn.a.Bottom);d.loadedAll.bottom&&d.loadedAll.bottom!==n&&(this.setLoaded("bottom",n),this.onScroll()),setTimeout(t,3e4),i()}):i()}).finally(()=>{this.fetchNewPromise=void 0})};i?setTimeout(t,3e4):t()}}):t&&!this.bubbles[a]&&t!==a||this.setLoaded("bottom",!0),this.log("scrolledAllDown:",d.loadedAll.bottom),d.loadedAll.bottom&&a&&!this.unreaded.size&&this.onScrolledAllDown(),"chat"===n){const t=this.appMessagesManager.getDialogOnly(e);(null==t?void 0:t.pFlags.unread_mark)&&this.appMessagesManager.markDialogUnread(e,!0)}}).catch(e=>{throw this.log.error("getHistory promise error:",e),this.preloader.detach(),e});return{cached:v,promise:f}}onScrolledAllDown(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);this.appMessagesManager.readHistory(this.peerId,e.maxId,this.chat.threadId,!0)}}finishPeerChange(){const e=this.peerId,t=this.appPeersManager.isChannel(e),s=this.appMessagesManager.canSendToPeer(e,this.chat.threadId);this.chatInner.classList.toggle("has-rights",s),this.bubblesContainer.classList.toggle("is-chat-input-hidden",!s),this.chatInner.classList.toggle("is-chat",this.chat.isAnyGroup()),this.chatInner.classList.toggle("is-channel",t)}renderMessagesQueue(e,t,s,i){this.messagesQueue.push({message:e,bubble:t,reverse:s,promises:i}),this.setMessagesQueuePromise()}setMessagesQueuePromise(){!this.messagesQueuePromise&&this.messagesQueue.length&&(this.messagesQueuePromise=new Promise((e,t)=>{setTimeout(()=>{const s=this.messagesQueue.slice();this.messagesQueue.length=0;const i=s.reduce((e,{promises:t})=>e.concat(t),[]);this.log("promises to call",i,s,this.isHeavyAnimationInProgress);const n=this.getMiddleware();Promise.all(i).then(()=>{if(!n())throw"setMessagesQueuePromise: peer changed!";this.messagesQueueOnRender&&this.messagesQueueOnRender(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional(),s.forEach(({message:e,bubble:t,reverse:s})=>{this.setBubblePosition(t,e,s)}),e(),this.messagesQueuePromise=null,this.messagesQueue.length&&this.setMessagesQueuePromise(),this.setUnreadDelimiter()}).catch(t)},0)}))}setBubblePosition(e,t,s){if(t.id<0)return void this.chatInner.prepend(e);const i=this.getDateContainerByMessage(t,s);if("scheduled"===this.chat.type||"pinned"===this.chat.type){const s=this.stickyIntersector?2:1;let n=Array.from(i.container.children).slice(s),a=0,o=0;for(;as.includes(e)));i.className=n.join(" "),v=i.lastElementChild,v.classList.contains("bubble-content-wrapper")||(v=i.querySelector(".bubble-content-wrapper")),m=v.firstElementChild,m.innerHTML="",m.style.cssText="",v.innerHTML="",v.appendChild(m);const a=v.style.transitionDelay;v.style.cssText="",v.style.transitionDelay=a,i===this.firstUnreadBubble&&i.classList.add("is-first-unread");const o=+i.dataset.mid;+e.mid===o||(delete this.bubbles[o],this.skippedMids.delete(o))}else if(v=document.createElement("div"),v.classList.add("bubble-content-wrapper"),m=document.createElement("div"),m.classList.add("bubble-content"),(i=document.createElement("div")).classList.add("bubble"),v.appendChild(m),i.appendChild(v),!u&&!e.pFlags.out&&this.unreadedObserver){(e.pFlags.unread||this.appMessagesManager.isMentionUnread(e)||void 0!==this.historyStorage.readMaxId&&this.historyStorage.readMaxId"messageEntityEmoji"===e._),t=y.length;if(e.reduce((e,t)=>e+t.length,0)===t&&e.length<=3){if(a.default.settings.emoji.big){let t=this.appStickersManager.getAnimatedEmojiSticker(y);if(1===e.length&&!S&&t)S={_:"messageMediaDocument",document:t};else{let t=document.createElement("div");t.classList.add("attachment"),t.innerHTML=L,i.classList.add("emoji-"+e.length+"x"),m.append(t)}i.classList.add("is-message-empty","emoji-big"),I=!0,E=!1,M=!1}i.classList.add("can-have-big-emoji")}}M&&g(p,L);const C=fn.setTime(this.chat,e,i,m,p);if(m.prepend(p),e.views&&!(null===(r=e.fwd_from)||void 0===r?void 0:r.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),m.prepend(e),i.classList.add("with-beside-button")}if(e.views&&!e.pFlags.is_outgoing&&this.viewsObserver&&this.viewsObserver.observe(i),e.reply_markup&&"replyInlineMarkup"===e.reply_markup._&&e.reply_markup.rows&&e.reply_markup.rows.length){const t=e.reply_markup.rows,s=document.createElement("div");s.classList.add("reply-markup"),t.forEach(t=>{const i=t.buttons;if(!i||!i.length)return;const n=document.createElement("div");n.classList.add("reply-markup-row"),i.forEach(t=>{const s=J.b.wrapRichText(t.text,{noLinks:!0,noLinebreaks:!0});let i;switch(t._){case"keyboardButtonUrl":{const e=J.b.wrapRichText(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=Object(Ns.a)(e).firstElementChild,i.classList.add("is-link","tgico");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline","tgico"),Object(l.b)(i,s=>{Object(c.a)(s);const i=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.appInlineBotsManager.checkSwitchReturn(i).then(e=>e||new Promise((e,t)=>{new Us({[this.peerId]:[]},t=>{e(t)},!0).addEventListener("close",()=>{t()})})),n.then(e=>{const s=this.peerId===e?this.chat.threadId:void 0;this.appInlineBotsManager.switchInlineQuery(e,s,i,t.query)})});break;default:i=document.createElement("button")}i.classList.add("reply-markup-button","rp"),i.insertAdjacentHTML("beforeend",s),Object(se.ripple)(i),n.append(i)}),s.append(n)}),Object(l.b)(s,s=>{let i=s.target;if(i.classList.contains("reply-markup-button")||(i=Object(Ce.a)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline"))return;Object(c.a)(s);const n=Object(Ts.a)(i),a=t[Object(Ts.a)(i.parentElement)];if(!a.buttons||!a.buttons[n])return void this.log.warn("no such button",a,n,e);const o=a.buttons[n];this.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,o)}),E=!1,i.classList.add("with-reply-markup"),v.append(s)}const k=e.pFlags.is_outgoing;if(u){(e.pFlags.unread||k)&&this.unreadOut.add(e.mid);let t="";t=k?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}const P=this.appMessagesManager.getMessageWithReplies(e),T=!!P&&e.mid>0;T&&i.classList.add("with-replies");const A=u&&(!e.fwd_from||this.peerId!==a.default.myId);let O=m;if(S){let t=document.createElement("div");t.classList.add("attachment"),y||i.classList.add("is-message-empty");let s=!1;switch(S._){case"messageMediaPhoto":{const s=S.photo;y||(E=!1),e.viaBotId||i.classList.add("hide-name"),i.classList.add("photo");const n=this.appMessagesManager.groupedMessagesStorage[e.grouped_id];if(e.grouped_id&&1!==n.size&&d){i.classList.add("is-album","is-grouped"),Cs({groupId:e.grouped_id,attachmentDiv:t,middleware:this.getMiddleware(),isOut:u,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:f,noAutoDownload:this.chat.noAutoDownloadMedia});break}const a=!re.IS_ANDROID&&E&&!T&&!1;a&&i.classList.add("with-media-tail"),ws({photo:s,message:e,container:t,withTail:a,isOut:A,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:f,noAutoDownload:this.chat.noAutoDownloadMedia});break}case"messageMediaWebPage":{s=!0;let t=S.webpage;if("webPage"!==t._)break;i.classList.add("webpage");let n=document.createElement("div");n.classList.add("web");let a,o,r=document.createElement("div");r.classList.add("quote");const l=t.photo;(l||t.document)&&(a=document.createElement("div"),a.classList.add("preview-resizer"),o=document.createElement("div"),o.classList.add("preview"),a.append(o));const c=t.document;if(c)if("gif"===c.type||"video"===c.type||"round"===c.type){const t="round"===c.type?b.b.active.round:b.b.active.webpage;"round"===c.type?(i.classList.add("round"),o.classList.add("is-round")):i.classList.add("video"),fs({doc:c,container:o,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:A,group:fo,loadPromises:f,noAutoDownload:this.chat.noAutoDownloadMedia})}else{const t=ys({message:e,noAutoDownload:this.chat.noAutoDownloadMedia,lazyLoadQueue:this.lazyLoadQueue,loadPromises:f});o.append(t),o.classList.add("preview-with-document")}let d,h=document.createElement("div");if(h.classList.add("quote-text"),a&&h.append(a),t.site_name){const e=J.b.wrapRichText(t.url),s=Object(Ns.a)(e).firstElementChild;s.classList.add("webpage-name"),g(s,J.b.wrapEmojiText(t.site_name)),h.append(s),d=s}if(t.rTitle){let e=document.createElement("div");e.classList.add("title"),g(e,t.rTitle),h.append(e),d=e}if(t.rDescription){let e=document.createElement("div");e.classList.add("text"),g(e,t.rDescription),h.append(e),d=e}if(r.append(h),l&&!c){i.classList.add("photo");const t=l.sizes[l.sizes.length-1];let s=!1;t.w===t.h&&d?(i.classList.add("is-square-photo"),s=!0,this.appPhotosManager.setAttachmentSize(l,o,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),ws({photo:l,message:e,container:o,boxWidth:s?0:b.b.active.webpage.width,boxHeight:s?0:b.b.active.webpage.height,isOut:A,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:f,withoutPreloader:s,noAutoDownload:this.chat.noAutoDownloadMedia})}n.append(r),p.insertBefore(n,C);break}case"messageMediaDocument":{const n=S.document;if(n.sticker){i.classList.add("sticker"),E=!1,I=!0,n.animated&&i.classList.add("sticker-animated");const e=b.b.active,s=i.classList.contains("emoji-big")?e.emojiSticker:n.animated?e.animatedSticker:e.staticSticker;this.appPhotosManager.setAttachmentSize(n,t,s.width,s.height),m.style.height=t.style.height,m.style.width=t.style.width,Ls({doc:n,div:t,middleware:this.getMiddleware(),lazyLoadQueue:this.lazyLoadQueue,group:fo,play:!0,loop:!0,emoji:i.classList.contains("emoji-big")?y:void 0,withThumb:!0,loadPromises:f})}else if("video"===n.type||"gif"===n.type||"round"===n.type){const s="round"===n.type;s&&(I=!0),!s&&y||(E=!1),e.viaBotId||i.classList.add("hide-name"),i.classList.add(s?"round":"video");const a=this.appMessagesManager.groupedMessagesStorage[e.grouped_id];if(e.grouped_id&&1!==a.size&&d)i.classList.add("is-album","is-grouped"),Cs({groupId:e.grouped_id,attachmentDiv:t,middleware:this.getMiddleware(),isOut:u,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:f,noAutoDownload:this.chat.noAutoDownloadMedia});else{const a=!re.IS_ANDROID&&!re.IS_APPLE&&!s&&E&&!T&&!1;a&&i.classList.add("with-media-tail"),fs({doc:n,container:t,message:e,boxWidth:b.b.active.regular.width,boxHeight:b.b.active.regular.height,withTail:a,isOut:A,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),group:fo,loadPromises:f,noAutoDownload:this.chat.noAutoDownloadMedia,searchContext:s?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0})}}else{const t=function({albumMustBeRenderedFull:e,message:t,bubble:s,messageDiv:i,chat:n,loadPromises:a,noAutoDownload:o,lazyLoadQueue:r,searchContext:l,useSearch:c}){let d;const h=e?n.getMidsByMid(t.mid):[t.mid];return h.forEach((e,t)=>{const s=n.getMessage(e),c=ys({message:s,loadPromises:a,noAutoDownload:o,lazyLoadQueue:r,searchContext:l}),u=document.createElement("div");u.classList.add("document-container"),u.dataset.mid=""+e,u.dataset.peerId=""+s.peerId;const p=document.createElement("div");if(p.classList.add("document-wrapper"),s.message){const e=document.createElement("div");e.classList.add("document-message");const t=J.b.wrapRichText(s.message,{entities:s.totalEntities});e.innerHTML=t,p.append(e)}if(h.length>1){const e=document.createElement("div");e.classList.add("document-selection"),u.append(e),u.classList.add("grouped-item"),0===t&&(d=p)}p.append(c),u.append(p),i.append(u)}),h.length>1&&s.classList.add("is-multiple-documents","is-grouped"),d}({albumMustBeRenderedFull:d,message:e,bubble:i,messageDiv:p,chat:this.chat,loadPromises:f,noAutoDownload:this.chat.noAutoDownloadMedia,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});t&&(O=t);const a=p.lastElementChild.querySelector(".document-message, .document-size, .audio");a&&a.append(C.cloneNode(!0)),i.classList.remove("is-message-empty"),p.classList.add((["photo","pdf"].includes(n.type)?"document":n.type||"document")+"-message"),s=!0}break}case"messageMediaContact":{const t=document.createElement("div");t.classList.add("contact"),t.dataset.peerId=""+S.user_id,p.classList.add("contact-message"),s=!0;const n=[];e.media.first_name&&n.push(J.b.wrapEmojiText(e.media.first_name)),e.media.last_name&&n.push(J.b.wrapEmojiText(e.media.last_name)),t.innerHTML=`\n
\n
${n.join(" ")}
\n
${e.media.phone_number?"+"+Object(Bs.a)(e.media.phone_number).formatted:"Unknown phone number"}
\n
`;const a=new _o;a.lazyLoadQueue=this.lazyLoadQueue,a.setAttribute("peer",""+e.media.user_id),a.classList.add("contact-avatar","avatar-54"),t.prepend(a),i.classList.remove("is-message-empty"),p.classList.add("contact-message"),p.append(t);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e){const t=new is;return t.message=e,t.setAttribute("peer-id",""+e.peerId),t.setAttribute("poll-id",e.media.poll.id),t.setAttribute("message-id",""+e.mid),t.render(),t}(e);p.prepend(t),p.classList.add("poll-message");break}default:i.classList.remove("is-message-empty"),p.innerHTML='This message is currently not supported on Telegram Web. Try desktop.telegram.org',p.append(C),this.log.warn("unrecognized media type:",e.media._,e)}s||m.append(t)}I&&i.classList.add("just-media"),this.chat.selection.isSelecting&&this.chat.selection.toggleElementCheckbox(i,!0);let F="";const _=e.fromId!==a.default.myId&&this.appPeersManager.isAnyChat(h)&&!this.appPeersManager.isBroadcast(h)||e.viaBotId;if(_||e.fwd_from||e.reply_to_mid){let t,s;const n=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===e.fwdFromId;let o,r=e.fwd_from&&!e.fwd_from.from_id&&!e.fwd_from.channel_id;if(e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+this.appUsersManager.getUser(e.viaBotId).username,s.classList.add("peer-title"),i.classList.add("must-have-name")),r?(t=document.createElement("span"),t.innerHTML=J.b.wrapEmojiText(e.fwd_from.from_name),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new wt.a({peerId:e.fwdFromId||e.fromId}).element,e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&fn.setReply({chat:this.chat,bubble:i,bubbleContainer:m,message:e}),e.fwdFromId||e.fwd_from)if(this.peerId===a.default.myId||n||i.classList.add("forwarded"),e.savedFrom&&(F=e.savedFrom,t.dataset.savedFrom=F),o=document.createElement("div"),t.dataset.peerId=e.fwdFromId,this.peerId!==a.default.myId&&this.peerId!==je.c&&!n||I){const e=[t];I&&e.unshift(document.createElement("br")),o.append(Object(x.i18n)("ForwardedFrom",[e]))}else o.style.color=this.appPeersManager.getPeerColorById(e.fwdFromId,!1),o.append(t);else e.viaBotId||(!I&&_?(o=document.createElement("div"),o.append(t),u||(o.style.color=this.appPeersManager.getPeerColorById(e.fromId,!1)),o.dataset.peerId=e.fromId):i.classList.add("hide-name"));if(e.viaBotId){o?o.append(" "):o=document.createElement("div");const e=document.createElement("span");e.append(Object(x.i18n)("ViaBot")," ",s),e.classList.add("is-via"),o.append(e)}o&&(o.classList.add("name"),O.append(o));if(this.chat.isAnyGroup()&&!A){let t=new _o;t.lazyLoadQueue=this.lazyLoadQueue,t.classList.add("user-avatar","avatar-40"),t.loadPromises=f,!e.fwdFromId&&e.fwd_from&&e.fwd_from.from_name&&t.setAttribute("peer-title",e.fwd_from.from_name),t.setAttribute("peer",""+((e.fwd_from&&(this.peerId===a.default.myId||this.peerId===je.c)||n?e.fwdFromId:e.fromId)||je.b)),v.append(t)}}else i.classList.add("hide-name");"pinned"===this.chat.type&&(F=`${this.chat.peerId}_${e.mid}`);if(P&&P.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),F&&("pinned"===this.chat.type||e.fwd_from.saved_from_msg_id)&&this.peerId!==je.c){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),m.append(e),i.dataset.savedFrom=F,i.classList.add("with-beside-button")}if(i.classList.add(A?"is-out":"is-in"),n&&this.renderMessagesQueue(e,i,t,f),T){fn.renderReplies({bubble:i,bubbleContainer:m,message:P,messageDiv:p,loadPromises:f,lazyLoadQueue:this.lazyLoadQueue})&&(E=!0)}return E&&(i.classList.add("can-have-tail"),m.append(la())),i}safeRenderMessage(e,t,s,i,n){try{return this.renderMessage(e,t,s,i,n)}catch(e){this.log.error("renderMessage error:",e)}}performHistoryResult(e,t,s,i){return ia(this,void 0,void 0,(function*(){let s;e=e.slice(),i&&e.unshift(i),this.messagesQueueOnRender=()=>{const{scrollTop:e,scrollHeight:i}=this.scrollable;s=t?i-e:e,this.messagesQueueOnRender=void 0},this.needReflowScroll&&(Ln(this.scrollable.container),this.needReflowScroll=!1);const n=e=>{const s=this.chat.getMessage(e);s.id>0?this.safeRenderMessage(s,t,!0):this.processLocalMessageRender(s)},a=e.length;if(t)for(let t=0;t=0;--t)n(e[t]);if("scheduled"!==this.chat.type){const t=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId),s=t.history.first,i=t.history.last;!s.isEnd(wn.a.Bottom)||s.length&&!e.includes(s[0])||this.setLoaded("bottom",!0,!1),!i.isEnd(wn.a.Top)||i.length&&!e.includes(i[i.length-1])||this.setLoaded("top",!0,!1)}else this.setLoaded("top",!0),this.setLoaded("bottom",!0);if(yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional()),void 0!==s){const e=t?this.scrollable.scrollHeight-s:s;this.scrollable.scrollTop=e,re.IS_SAFARI&&Ln(this.scrollable.container)}return!0}))}requestHistory(e,t,s){if("chat"===this.chat.type||"discussion"===this.chat.type)return this.appMessagesManager.getHistory(this.peerId,e,t,s,this.chat.threadId);if("pinned"===this.chat.type){return this.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:s}).then(e=>({history:e.history.map(e=>e.mid)}))}return"scheduled"===this.chat.type?this.appMessagesManager.getScheduledMessages(this.peerId).then(e=>({history:e.slice().reverse()})):void 0}animateAsLadder(e,t,s,i,n){return ia(this,void 0,void 0,(function*(){if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,s,i,n));if(!Object.keys(this.bubbles).length)return;let a,o=Object(w.e)(this.bubbles,"desc");s&&t.length&&(o=o.filter(e=>!t.includes(e))),a=i?n||Math.max(...o):e||Math.max(...o);const r=o.slice(o.findIndex(e=>a>e)),l=s?[]:[a],c=s?[]:o.slice(0,o.findIndex(e=>a>=e)).reverse();de.b&&this.log("getHistory: targeting mid:",a,n,e,r.map(e=>this.appMessagesIdsManager.getServerMessageId(e)),c.map(e=>this.appMessagesIdsManager.getServerMessageId(e)));const d=[];this.chatInner.classList.add("zoom-fading");const h=s?10:40,u=s?0:1,p=(e,t=0)=>{const s=Object(ae.a)();let i=0;return e.forEach((n,a)=>{if(!this.bubbles[n]||this.skippedMids.has(n))return void this.log.warn("animateAsLadder: no bubble by mid:",n);const o=this.bubbles[n].lastElementChild;if(i=(a+t||.1)*h,o.classList.add("zoom-fade"),o.style.transitionDelay=i+"ms",a===e.length-1){const e=t=>{t.target===o&&(s.resolve(),o.removeEventListener("transitionend",e))};o.addEventListener("transitionend",e)}d.push(o)}),e.length||s.resolve(),{lastMsDelay:i,animationPromise:s}},m=p(r,u),g=p(l),b=p(c,u),v=[m.animationPromise,g.animationPromise,b.animationPromise],f=[m.lastMsDelay,g.lastMsDelay,b.lastMsDelay];let y;return this.onAnimateLadder&&(yield this.onAnimateLadder()),Object(Fe.b)(()=>{d.forEach(e=>{e.classList.remove("zoom-fade")})}),(r.length||l.length||c.length)&&(y=Promise.all(v),Object(ks.b)(y,Math.max(...f)+200).then(()=>{Object(Fe.b)(()=>{d.forEach(e=>{e.style.transitionDelay=""}),this.chatInner.classList.remove("zoom-fading")}),re.IS_SAFARI||(this.needReflowScroll=!0)})),y}))}renderEmptyPlaceholder(e,t,s,i){const n="empty-bubble-placeholder";let a,o;if(t.classList.add(n,n+"-"+e),"group"===e?a=Object(x.i18n)("GroupEmptyTitle1"):"saved"===e?a=Object(x.i18n)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?a=Object(x.i18n)("NoMessages"):"noScheduledMessages"===e&&(a=Object(x.i18n)("NoScheduledMessages")),a.classList.add("center",n+"-title"),i.push(a),"group"===e)i.push(Object(x.i18n)("GroupEmptyTitle2")),o=[Object(x.i18n)("GroupDescription1"),Object(x.i18n)("GroupDescription2"),Object(x.i18n)("GroupDescription3"),Object(x.i18n)("GroupDescription4")];else if("saved"===e)o=[Object(x.i18n)("ChatYourSelfDescription1"),Object(x.i18n)("ChatYourSelfDescription2"),Object(x.i18n)("ChatYourSelfDescription3"),Object(x.i18n)("ChatYourSelfDescription4")];else if("greeting"===e){const e=Object(x.i18n)("NoMessagesGreetingsDescription");e.classList.add("center",n+"-subtitle"),this.messagesQueue.findAndSplice(e=>e.bubble===t);const a=document.createElement("div");a.classList.add(n+"-sticker");const o=this.getMiddleware(),r=this.appStickersManager.getGreetingSticker().then(e=>{if(!o())return;const t=[];return Ls({doc:e,div:a,middleware:o,lazyLoadQueue:this.lazyLoadQueue,group:fo,play:!0,loop:!0,withThumb:!0,loadPromises:t}),Object(l.b)(a,e=>{Object(c.a)(e),ea.onMediaClick({target:e.target})}),Promise.all(t)});this.renderMessagesQueue(s,t,!1,[r]),i.push(e,a)}o&&(i.push(...o.map(e=>{const t=document.createElement("span");return t.classList.add(n+"-list-item"),t.append(e),t})),"group"===e?o.forEach(e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)}):"saved"===e&&o.forEach(e=>{const t=document.createElement("span");t.classList.add(n+"-list-bullet"),t.innerText="•",e.prepend(t)})),i.length>1&&t.classList.add("has-description"),i.forEach(e=>e.classList.add(n+"-line"))}processLocalMessageRender(e){const t=this.safeRenderMessage(e,void 0,void 0,void 0,!1);t.classList.add("bubble-first","is-group-last","is-group-first"),t.classList.remove("can-have-tail","is-in");const s=t.querySelector(".message, .service-msg"),i=[],n=this.appPeersManager.isBot(this.peerId);if(n&&"message"===e._){const e=document.createElement("b");e.append(Object(x.i18n)("BotInfoTitle")),i.push(e,"\n\n")}else this.appPeersManager.isAnyGroup(this.peerId)&&this.appPeersManager.getPeer(this.peerId).pFlags.creator?this.renderEmptyPlaceholder("group",t,e,i):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",t,e,i):a.default.myId===this.peerId?this.renderEmptyPlaceholder("saved",t,e,i):this.appPeersManager.isUser(this.peerId)&&!n&&this.appMessagesManager.canSendToPeer(this.peerId)&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",t,e,i):this.renderEmptyPlaceholder("noMessages",t,e,i);s.prepend(...i),this.messagesQueueOnRenderAdditional?this.onAnimateLadder=()=>{if(this.chatInner.prepend(t),this.onAnimateLadder=void 0,!this.messagesQueuePromise)return Object(Fe.d)()}:this.chatInner.prepend(t),this.emptyPlaceholderMid=e.mid}generateLocalFirstMessage(e,t){const s=this.appMessagesIdsManager.generateMessageId("scheduled"===this.chat.type?-1:0),i={_:e?"messageService":"message",date:0,id:-(+this.peerId+s),peer_id:this.appPeersManager.getOutputPeer(this.peerId),pFlags:{}};return e||(i.message=""),Object(Ri.a)(i),t&&t(i),this.appMessagesManager.saveMessages([i]),i}setLoaded(e,t,s=!0){if(this.scrollable.loadedAll[e]!==t){if(this.scrollable.loadedAll[e]=t,"top"===e&&t&&this.appPeersManager.isBot(this.peerId)){this.log("inject bot description");const e=this.getMiddleware();return this.appProfileManager.getProfile(this.peerId.toUserId()).then(t=>{var s;if(!e())return;if(!(null===(s=t.bot_info)||void 0===s?void 0:s.description))return void this.checkIfEmptyPlaceholderNeeded();const i=this.generateLocalFirstMessage(!1,e=>{e.message=t.bot_info.description});this.processLocalMessageRender(i)})}this.checkIfEmptyPlaceholderNeeded()}}checkIfEmptyPlaceholderNeeded(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderMid&&(!this.appMessagesManager.getHistoryStorage(this.peerId).count||Object.keys(this.bubbles).length&&!this.getRenderedLength()||"scheduled"===this.chat.type&&!Object.keys(this.bubbles).length)){this.log("inject empty peer placeholder");const e=this.generateLocalFirstMessage(!0);return this.processLocalMessageRender(e),!0}return!1}getHistory(e=0,t=!1,s=!1,i=0,n=!1){const o=this.peerId,r=Math.min(30,St.a.windowH/38|0),l=Object.keys(this.bubbles).length>0?Math.max(40,r):r;let c=l;if(void 0!==aa){if(!aa)return{cached:!1,promise:Promise.resolve(!0)};Object.keys(this.bubbles).length>0&&--aa}let d,h=0;if(s&&(h=c,t||(c=0)),i&&!s)if("pinned"===this.chat.type)d=[i];else{const t=this.appMessagesManager.getHistoryStorage(o,this.chat.threadId).history.slice;if(t.length=0;--e){if(!this.chat.getMessage(d[e]).grouped_id)break;d.splice(e,1)}e=d[d.length-1]||e}}let u,p=this.requestHistory(e,c,h);const m=(null==d?void 0:d.length)&&p instanceof Promise,g=this.isFirstLoad&&h&&p instanceof Promise||m;m&&(u=p,p={history:d}),this.isFirstLoad=!1;const b=e=>ia(this,void 0,void 0,(function*(){if("offsetIdOffset"in e&&e.history.isEnd(wn.a.Top)){if("discussion"===this.chat.type){const t=this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId+"_"+this.chat.threadId];t&&e.history.push(t),e.history.push(...this.chat.getMidsByMid(this.chat.threadId).reverse())}yield this.setLoaded("top",!0)}})),v=e=>Object(ks.c)().then(()=>b(e)).then(()=>this.performHistoryResult(e.history||[],t,s,!m&&i)),f=e=>{const s=e.then(e=>(t?this.getHistoryTopPromise!==s:this.getHistoryBottomPromise!==s)?(this.log.warn("getHistory: peer changed"),Promise.reject()):n?(this.scrollable.onScroll(),!0):v(e),e=>{throw this.log.error("getHistory error:",e),e});return s};let y,S;if(p instanceof Promise)S=!1,y=f(p);else{if(n)return null;S=!0,y=v(p)}const L=m?f(u):y;if(g&&a.default.settings.animationsEnabled){let s=m?2:1;this.messagesQueueOnRenderAdditional=()=>{if(this.log("ship went past rocks of magnets"),--s)return;this.messagesQueueOnRenderAdditional=void 0;(this.animateAsLadder(i,d,m,h,e)||Promise.resolve()).then(()=>{setTimeout(()=>{this.loadMoreHistory(t,!0)},0)})}}else this.messagesQueueOnRenderAdditional=void 0;return t?this.getHistoryTopPromise=L:this.getHistoryBottomPromise=L,L.then(()=>{t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0}),n?null:(!g&&y.then(()=>{let e;t?(this.loadedTopTimes++,this.loadedBottomTimes=Math.max(0,--this.loadedBottomTimes)):(this.loadedBottomTimes++,this.loadedTopTimes=Math.max(0,--this.loadedTopTimes)),(t&&this.loadedTopTimes>2||!t&&this.loadedBottomTimes>2)&&(e=Object(w.e)(this.bubbles));const s=2*l;e&&e.length>s&&(t?(e=e.slice(s),this.setLoaded("bottom",!1)):(e=e.slice(0,e.length-s),this.setLoaded("top",!1)),this.deleteMessagesByIds(e,!1))}),y.then(()=>{"chat"===this.chat.type&&setTimeout(()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)},0)}),{cached:S,promise:y})}setUnreadDelimiter(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);let t=this.appMessagesManager.getReadMaxIdIfUnread(this.peerId,this.chat.threadId);if(t&&(t=Object.keys(this.bubbles).filter(e=>!this.bubbles[e].classList.contains("is-out")).map(e=>+e).sort((e,t)=>e-t).find(e=>e>t),t&&this.bubbles[t])){let s=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==s&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e.maxId&&s.classList.add("is-first-unread"),this.firstUnreadBubble=s,this.attachedUnreadBubble=!0}}deleteEmptyDateGroups(){const e=+!!this.stickyIntersector+1;for(const t in this.dateMessages){const s=this.dateMessages[t];s.container.childElementCount===e&&(s.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(s.container,s.div),delete this.dateMessages[t])}this.checkIfEmptyPlaceholderNeeded()}}function la(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 11 20"),e.setAttributeNS(null,"width","11"),e.setAttributeNS(null,"height","20"),e.classList.add("bubble-tail");const t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS(null,"href","#message-tail-filled"),e.append(t),e}class ca{constructor(e,t,s,n){var r;let l,c,d,h=[],u=[];const p=o.a.canPinMessage(e),m=(a,o,r)=>{setTimeout(()=>{let a;a=s&&!t?p?i.a.unpinAllMessages(e):i.a.hidePinnedMessages(e):i.a.updatePinnedMessage(e,t,s,r,o),n&&a.then(n)},300)};if(s){let s="UnpinMessage";t?(l="UnpinMessageAlertTitle",c="Chat.Confirm.Unpin"):p?(l="Popup.Unpin.AllTitle",c="Chat.UnpinAllMessagesConfirmation",d=[""+((null===(r=i.a.pinnedMessages[e])||void 0===r?void 0:r.count)||1)]):(l="Popup.Unpin.HideTitle",c="Popup.Unpin.HideDescription",s="Popup.Unpin.Hide"),h.push({langKey:s,isDanger:!0,callback:m})}else{l="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(h.push({langKey:t,callback:e=>m(0,!1,!e.size)}),K.a.isBroadcast(e.toChatId())?c="PinMessageAlertChannel":(c="PinMessageAlert",u.push({text:"PinNotify",checked:!0}))):(c="PinMessageAlertChat",e===a.default.myId?h.push({langKey:t,callback:m}):(h.push({langKey:t,callback:e=>m(0,!e.size)}),u.push({text:"PinAlsoFor",textArgs:[new wt.a({peerId:e}).element],checked:!0})))}Object(ht.a)(h);new pt("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:u}).show()}}function da(e=window.getSelection()){if(!e||!e.rangeCount)return!0;const t=e.getRangeAt(0);return!t.toString()||!t.START_TO_END}class ha extends pt{constructor(e,t,s,n){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{o.isValid()&&(n&&n(),i.a.reportMessages(e,t,s,o.value).then(e=>{e&&rt({langPackKey:"ReportSentInfo"})}))}}],body:!0});const a=document.createElement("div");Ls({doc:hs.getAnimatedEmojiSticker(ha.STICKER_EMOJI),div:a,emoji:ha.STICKER_EMOJI,width:100,height:100,loop:!1,play:!0}).finally(()=>{this.show()}),this.header.append(a);const o=new F.b({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});o.input.addEventListener("input",()=>{this.buttons[0].element.toggleAttribute("disabled",!o.isValid())}),this.body.append(o.container)}}ha.STICKER_EMOJI="👮‍♀️";class ua extends pt{constructor(e,t,s){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const i=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"]];i.forEach(e=>{const t=Object(U.a)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)});const n=hs.preloadAnimatedEmojiSticker(ha.STICKER_EMOJI);Object(l.b)(this.body,a=>{const o=Object(Ce.a)(a.target,"btn-primary"),r=i[Object(Ts.a)(o)][1];n.then(()=>{this.hide(),new ha(e,t,r,s)})},{listenerSetter:this.listenerSetter}),this.body.style.margin="0 -1rem",this.buttonsEl.style.marginTop=".5rem",this.show()}}class pa{constructor(e,t,s,i,n,a,o){this.attachTo=e,this.chat=t,this.appMessagesManager=s,this.appPeersManager=i,this.appPollsManager=n,this.appDocsManager=a,this.appMessagesIdsManager=o,this.onSendScheduledClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionSendNowBtn):new zs(this.peerId,this.chat.getMidsByMid(this.mid))},this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>{if(da()){st((this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort((e,t)=>e-t):[this.mid]).reduce((e,t)=>{const s=this.chat.getMessage(t);return e+((null==s?void 0:s.message)?s.message+"\n":"")},"").trim())}else document.execCommand("copy")},this.onCopyAnchorLinkClick=()=>{st(this.target.href)},this.onCopyLinkClick=()=>{let e;"discussion"===this.chat.type&&(e=this.appMessagesManager.getMessageByPeer(this.peerId,this.chat.threadId));const t=this.appPeersManager.getPeerUsername(e?e.fromId:this.peerId),s=this.appMessagesIdsManager.getServerMessageId(this.mid);let i,n="https://t.me/";t?(n+=t+"/"+(e?this.appMessagesIdsManager.getServerMessageId(e.fwd_from.channel_post):s),e&&(n+="?comment="+s),i="LinkCopied"):(n+="c/"+this.peerId.toChatId()+"/"+s,e&&(n+="?thread="+this.appMessagesIdsManager.getServerMessageId(e.mid)),i="LinkCopiedPrivateInfo"),ot(x.default.format(i,!0)),st(n)},this.onPinClick=()=>{new ca(this.peerId,this.mid)},this.onUnpinClick=()=>{new ca(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>{if(this.chat.selection.isSelecting)Object(l.d)(this.chat.selection.selectionForwardBtn);else{const e=this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid);new Us({[this.peerId]:e})}},this.onSelectClick=()=>{this.chat.selection.toggleByElement(Object(Ce.a)(this.target,"grouped-item")||Object(Ce.a)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionDeleteBtn):new Hs(this.peerId,this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid),this.chat.type)};const r=e=>{let s,i;this.init&&(this.init(),this.init=null);try{i=Object(Ce.a)(e.target,"bubble-content-wrapper"),s=i?i.parentElement:Object(Ce.a)(e.target,"bubble")}catch(e){}if(!s||s.classList.contains("bubble-first"))return;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),this.element.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+s.dataset.mid;if(!n)return;if(this.isSelectable=this.chat.selection.canSelectBubble(s),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!da(),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"),t.selection.isSelecting&&!i){const e=this.chat.getMidsByMid(n);if(e.length>1){const t=this.chat.selection.isMidSelected(this.peerId,n)?n:e.find(e=>this.chat.selection.isMidSelected(this.peerId,e));t&&(n=t)}}const a=Object(Ce.a)(this.target,"grouped-item");this.isTargetAGroupedItem=!!a,this.mid=a?+a.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=this.chat.getMessage(this.mid),this.buttons.forEach(e=>{let s;t.selection.isSelecting&&!e.withSelection?s=!1:(i||pe.IS_TOUCH_SUPPORTED,s=e.verify()),e.element.classList.toggle("hide",!s)});const o=s.classList.contains("is-in")?"left":"right";Object(te.e)(e.touches?e.touches[0]:e,this.element,o),Object(te.d)(this.element,()=>{this.mid=0,this.peerId=void 0,this.target=null})};pe.IS_TOUCH_SUPPORTED?Object(l.b)(e,e=>{if(t.selection.isSelecting)return;const s=e.target.className;if(!s||!s.includes)return;t.log("touchend",e);["bubble","bubble-content-wrapper","bubble-content","message","time","inner"].find(e=>s.match(new RegExp(e+"($|\\s)")))&&(Object(c.a)(e),r(e))},{listenerSetter:this.chat.bubbles.listenerSetter}):Object(te.a)(e,r,this.chat.bubbles.listenerSetter)}init(){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(()=>{this.appMessagesManager.editMessage(this.message,this.message.message,{scheduleDate:this.chat.input.scheduleDate,entities:this.message.entities}),this.chat.input.onMessageSent(!1,!1)},new Date(1e3*this.message.date))},verify:()=>"scheduled"===this.chat.type},{icon:"reply",text:"Reply",onClick:this.onReplyClick,verify:()=>this.appMessagesManager.canSendToPeer(this.peerId,this.chat.threadId)&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>this.appMessagesManager.canEditMessage(this.message,"text")&&!!this.chat.input.messageInput},{icon:"copy",text:"Copy",onClick:this.onCopyClick,verify:()=>!(!this.message.message||this.isTextSelected||this.isAnchorTarget&&this.message.message===this.target.innerText)},{icon:"copy",text:"Chat.CopySelectedText",onClick:this.onCopyClick,verify:()=>!!this.message.message&&this.isTextSelected},{icon:"copy",text:"Message.Context.Selection.Copy",onClick:this.onCopyClick,verify:()=>{if(!this.isSelected)return!1;for(const[e,t]of this.chat.selection.selectedMids)for(const s of t)if(this.appMessagesManager.getMessageByPeer(e,s).message)return!0;return!1},notDirect:()=>!0,withSelection:!0},{icon:"copy",text:"CopyLink",onClick:this.onCopyAnchorLinkClick,verify:()=>this.isAnchorTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Username",onClick:()=>{st(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{st(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>this.appPeersManager.isChannel(this.peerId)&&!this.message.pFlags.is_outgoing},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&this.appPeersManager.canPinMessage(this.peerId)&&"scheduled"!==this.chat.type},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>this.message.pFlags.pinned&&this.appPeersManager.canPinMessage(this.peerId)},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{this.appDocsManager.saveDocFile(this.message.media.document)},verify:()=>{var e;if(this.message.pFlags.is_outgoing)return!1;const t=null===(e=this.message.media)||void 0===e?void 0:e.document;if(!t)return!1;let s=!!pe.IS_TOUCH_SUPPORTED;const i=!t.type||!["gif","video","sticker"].includes(t.type);return i&&(s=s||!!Object(Ce.a)(this.target,"document")||!!Object(Ce.a)(this.target,"audio")),i&&s}},{icon:"checkretract",text:"Chat.Poll.Unvote",onClick:this.onRetractVote,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return t&&t.chosenIndexes.length&&!t.pFlags.closed&&!t.pFlags.quiz}},{icon:"stop",text:"Chat.Poll.Stop",onClick:this.onStopPoll,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return this.appMessagesManager.canEditMessage(this.message,"poll")&&t&&!t.pFlags.closed&&!this.message.pFlags.is_outgoing}},{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>"scheduled"!==this.chat.type&&!this.message.pFlags.is_outgoing&&"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 ua(this.peerId,[this.mid])},verify:()=>!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&this.appPeersManager.isChannel(this.peerId),notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick,verify:()=>!this.message.action&&!this.isSelected&&this.isSelectable,notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,notDirect:()=>!0,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>this.appMessagesManager.canDeleteMessage(this.message)},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.chat.selection.selectionDeleteBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0}],this.element=Ee(this.buttons,this.chat.bubbles.listenerSetter),this.element.id="bubble-contextmenu",this.element.classList.add("contextmenu"),this.chat.container.append(this.element)}}var ma=s(148),ga=s.n(ma),ba=s(139);class va{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=Ee(this.sendMenuButtons,e.listenerSetter),this.sendMenu.classList.add("menu-send",e.openSide),Object(te.a)(e.onContextElement,t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach(e=>{e.element.classList.toggle("hide",!e.verify())}),Object(c.a)(t),Object(te.d)(this.sendMenu))},e.listenerSetter)}setPeerId(e){this.type=e===a.default.myId?"reminder":"schedule"}}var fa=s(67),ya=s(88);class wa extends ht.b{constructor(e){if(super("popup-create-poll popup-new-media",null,{closable:!0,withConfirm:"Create",body:!0}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,s=Object(bt.a)(t,"LABEL"),i=Object(ya.a)(t);i||(t.parentElement.classList.add("is-filled"),s.classList.remove("hidden-widget"),s.firstElementChild.removeAttribute("disabled"));!s.nextElementSibling&&!i&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,s=Object(bt.a)(t,"LABEL"),i=Object(Ts.a)(s);this.correctAnswers&&this.correctAnswers[0][0]===i&&(this.correctAnswers=void 0),s.remove(),this.optionInputFields.splice(i,1),this.optionInputFields.forEach((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1);x.default.weakMap.get(e.label.firstElementChild).update()}),this.handleChange()},Object(x._i18n)(this.title,"NewPoll"),this.questionInputField=new F.b({placeholder:"AskAQuestion",label:"AskAQuestion",name:"question",maxLength:255}),this.listenerSetter.add(this.questionInputField.input)("input",()=>{this.handleChange()}),this.optionInputFields=[],"scheduled"!==this.chat.type){const e=new va({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending(()=>{this.send()})},openSide:"bottom-left",onContextElement:this.btnConfirm});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.header.append(this.questionInputField.container);const t=document.createElement("hr"),s=document.createElement("div");s.classList.add("caption"),Object(x._i18n)(s,"PollOptions"),this.questions=document.createElement("form"),this.questions.classList.add("poll-create-questions");const i=document.createElement("div");i.classList.add("poll-create-settings");const n=document.createElement("div");n.classList.add("caption"),Object(x._i18n)(n,"Settings"),this.chat.appPeersManager.isBroadcast(this.chat.peerId)||(this.anonymousCheckboxField=new ut.a({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new ut.a({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new ut.a({text:"NewPoll.Quiz",name:"quiz"}),this.listenerSetter.add(this.multipleCheckboxField.input)("change",()=>{const e=this.multipleCheckboxField.input.checked;this.quizCheckboxField.input.toggleAttribute("disabled",e)}),this.listenerSetter.add(this.quizCheckboxField.input)("change",()=>{const e=this.quizCheckboxField.input.checked;Array.from(this.questions.children).map(t=>{t.classList.toggle("radio-field",e)}),e||(this.correctAnswers=void 0,this.quizSolutionField.setValueSilently("")),a.forEach(t=>t.classList.toggle("hide",!e)),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()}),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const a=[],o=document.createElement("div");o.classList.add("caption"),Object(x._i18n)(o,"AccDescrQuizExplanation");const r=document.createElement("hr"),c=document.createElement("div");c.classList.add("poll-create-questions"),this.quizSolutionField=new F.b({placeholder:"NewPoll.Explanation.Placeholder",label:"NewPoll.Explanation.Placeholder",name:"solution",maxLength:200}),this.listenerSetter.add(this.questionInputField.input)("input",()=>{this.handleChange()});const d=document.createElement("div");d.classList.add("subtitle"),Object(x._i18n)(d,"AddAnExplanationInfo"),c.append(this.quizSolutionField.container,d),a.push(r,o,c),a.forEach(e=>e.classList.add("hide")),this.body.parentElement.insertBefore(t,this.body),this.body.append(s,this.questions,document.createElement("hr"),n,i,...a),Object(l.b)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new P.b(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}getFilledAnswers(){return Array.from(this.questions.children).map((e,t)=>{const s=e.querySelector(".input-field-input");return s instanceof HTMLInputElement?s.value:Object(fa.a)(s,!1).value}).filter(e=>!!e.trim())}validate(){var e;const t=this.questionInputField.value;if(!t)return!1;if(t.length>255)return!1;if(this.quizCheckboxField.input.checked&&!(null===(e=this.correctAnswers)||void 0===e?void 0:e.length))return!1;const s=this.getFilledAnswers();if(s.length<2)return!1;if(s.find(e=>e.length>100))return!1;const{value:i}=Object(fa.a)(this.quizSolutionField.input,!1);return!(i.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){const t=this.questionInputField.value,s=this.getFilledAnswers(),{value:i,entities:n}=Object(fa.a)(this.quizSolutionField.input);if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending(()=>{this.send(!0)});this.hide();const a={};this.anonymousCheckboxField&&!this.anonymousCheckboxField.input.checked&&(a.public_voters=!0),this.multipleCheckboxField.input.checked&&(a.multiple_choice=!0),this.quizCheckboxField.input.checked&&(a.quiz=!0);const o={_:"poll",pFlags:a,question:t,answers:s.map((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])})),id:void 0},r=this.chat.appPollsManager.getInputMediaPoll(o,this.correctAnswers,i,n);this.chat.appMessagesManager.sendOther(this.chat.peerId,r,{threadId:this.chat.threadId,replyToMsgId:this.chat.input.replyToMsgId,scheduleDate:this.chat.input.scheduleDate,silent:this.chat.input.sendSilent}),"reply"===this.chat.input.helperType&&this.chat.input.clearHelper(),this.chat.input.onMessageSent(!1,!1)}appendMoreField(){const e=this.tempId++,t=this.questions.childElementCount+1,s=new F.b({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(s.input)("input",this.onInput);const i=new nt({text:"",name:"question"});i.main.append(s.container),Object(l.b)(s.input,c.a,{listenerSetter:this.listenerSetter}),i.label.classList.add("hidden-widget"),i.input.disabled=!0,this.quizCheckboxField.input.checked||i.label.classList.remove("radio-field"),this.listenerSetter.add(i.input)("change",()=>{if(i.input.checked){const e=Object(Ts.a)(i.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}});const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),s.container.append(n),Object(l.b)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(i.label),this.scrollable.scrollIntoViewNew(this.questions.lastElementChild,"center"),this.optionInputFields.push(s)}}var Sa=s(100);function La(e){const t=e.src;return fetch(t).then(e=>e.arrayBuffer()).then(e=>{const t=new Uint8Array(e);let s=0;for(let e=0,i=t.length;e{const t=e.target;if(t!==this.input){if("INPUT"===t.tagName||t.hasAttribute("contenteditable"))return;this.input.focus(),Object(Sa.a)(this.input)}},this.attachFile=e=>{const t=this.willAttach,s=this.shouldCompress(e.type),i={};i.file=e;const n=document.createElement("div");n.classList.add("popup-item"),i.itemDiv=n;const a=s?this.attachMedia(e,i,n):this.attachDocument(e,i,n);return t.sendFileDetails.push(i),a},this.willAttach={type:s,sendFileDetails:[],group:!1},Object(l.b)(this.btnConfirm,()=>this.send(),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new va({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending(()=>{this.send()})},openSide:"bottom-left",onContextElement:this.btnConfirm,listenerSetter:this.listenerSetter});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo");const i=new P.b(null);i.container.append(this.mediaContainer),this.inputField=new F.b({placeholder:"PreviewSender.CaptionPlaceholder",label:"Caption",name:"photo-caption",maxLength:a.default.config.caption_length_max}),this.input=this.inputField.input,this.inputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value="",this.body.append(i.container),this.container.append(this.inputField.container),this.attachFiles(),this.addEventListener("close",()=>{this.files=[],Ea=void 0}),Ea=this}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}appendGroupCheckboxField(){var e;const t=this.files.length>1;t&&!this.groupCheckboxField?(this.groupCheckboxField=new ut.a({text:"PreviewSender.GroupItems",name:"group-items"}),this.container.append(...[this.groupCheckboxField.label,null===(e=this.mediaCheckboxField)||void 0===e?void 0:e.label,this.inputField.container].filter(Boolean)),this.willAttach.group=!0,this.groupCheckboxField.setValueSilently(this.willAttach.group),this.listenerSetter.add(this.groupCheckboxField.input)("change",()=>{const e=this.groupCheckboxField.checked;this.willAttach.group=e,this.attachFiles()})):this.groupCheckboxField&&this.groupCheckboxField.label.classList.toggle("hide",!t)}appendMediaCheckboxField(){var e;const t=!!this.files.find(e=>m.has(e.type));t&&!this.mediaCheckboxField?(this.mediaCheckboxField=new ut.a({text:"PreviewSender.CompressFile",name:"compress-items"}),this.container.append(...[null===(e=this.groupCheckboxField)||void 0===e?void 0:e.label,this.mediaCheckboxField.label,this.inputField.container].filter(Boolean)),this.mediaCheckboxField.setValueSilently("media"===this.willAttach.type),this.listenerSetter.add(this.mediaCheckboxField.input)("change",()=>{const e=this.mediaCheckboxField.checked;this.willAttach.type=e?"media":"document",this.attachFiles()})):this.mediaCheckboxField&&this.mediaCheckboxField.label.classList.toggle("hide",!t)}addFiles(e){const t=e.filter(e=>!this.files.find(t=>t.lastModified===e.lastModified&&t.name===e.name&&t.size===e.size));t.length&&(this.files.push(...t),this.attachFiles())}send(e=!1){if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending(()=>{this.send(!0)});let t=this.inputField.value;if(t.length>a.default.config.caption_length_max)return void ot(x.default.format("Error.PreviewSender.CaptionTooLong",!0));this.hide();const s=this.willAttach;s.isMedia="media"===s.type||void 0;const{sendFileDetails:i,isMedia:n}=s,{peerId:o,input:r}=this.chat,{sendSilent:l,scheduleDate:c}=r;i.forEach(e=>{e.itemDiv=void 0});const{length:d}=i,h=r.replyToMsgId;this.iterate(e=>{t&&e.length!==d&&(this.chat.appMessagesManager.sendText(o,t,{replyToMsgId:h,threadId:this.chat.threadId,silent:l,scheduleDate:c,clearDraft:!0}),t=void 0);const i=Object.assign(Object.assign({},s),{sendFileDetails:e});this.chat.appMessagesManager.sendAlbum(o,i.sendFileDetails.map(e=>e.file),Object.assign({caption:t,replyToMsgId:h,threadId:this.chat.threadId,isMedia:n,silent:l,scheduleDate:c,clearDraft:!0},i)),t=void 0}),r.replyToMsgId=this.chat.threadId,r.onMessageSent()}attachMedia(e,t,s){s.classList.add("popup-item-media");let i;if(e.type.startsWith("video/")){const n=document.createElement("video"),a=document.createElement("source");a.src=t.objectURL=URL.createObjectURL(e),n.autoplay=!0,n.controls=!1,n.muted=!0,n.setAttribute("playsinline","true"),n.addEventListener("timeupdate",()=>{n.pause()},{once:!0}),i=Object(me.e)(n).then(()=>{t.width=n.videoWidth,t.height=n.videoHeight,t.duration=Math.floor(n.duration);const e=n.webkitAudioDecodedByteCount;return void 0!==e&&(t.noSound=!e),s.append(n),Object(me.c)(n).then(e=>{t.thumb=Object.assign({url:URL.createObjectURL(e.blob)},e)})}),n.append(a)}else{const n=new Image;i=new Promise(i=>{n.onload=()=>{t.width=n.naturalWidth,t.height=n.naturalHeight,s.append(n),"image/gif"===e.type?(t.noSound=!0,Promise.all([La(n).then(e=>{t.duration=Math.ceil(e)}),Object(me.b)(n).then(e=>{t.thumb=Object.assign({url:URL.createObjectURL(e.blob)},e)})]).then(()=>{i()})):i()}}),n.src=t.objectURL=URL.createObjectURL(e)}return i}attachDocument(e,t,s){s.classList.add("popup-item-document");const i=e.type.startsWith("image/"),n=e.type.startsWith("audio/");(i||n)&&(t.objectURL=URL.createObjectURL(e));const a={_:"document",file:e,file_name:e.name||"",fileName:e.name?J.b.wrapEmojiText(e.name):"",size:e.size,type:i?"photo":"doc"},o=he.a.getCacheContext(a);o.url=t.objectURL,o.downloaded=e.size;const r=ys({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:a}}});return new Promise(e=>{const n=()=>{s.append(r),e()};if(i){const e=new Image;e.src=t.objectURL,e.onload=()=>{t.width=e.naturalWidth,t.height=e.naturalHeight,n()},e.onerror=n}else n()})}shouldCompress(e){return"media"===this.willAttach.type&&m.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),this.addEventListener("close",()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)}),this.show())}setTitle(){const{willAttach:e,title:t,files:s}=this;let i;const n=[];if("document"===e.type)i="PreviewSender.SendFile",n.push(s.length);else{let e=0,t=0,a=0;s.forEach(s=>{s.type.startsWith("image/")?++e:s.type.startsWith("video/")?++t:++a}),[e,t,a].filter(e=>e>0).length>1?(i="PreviewSender.SendFile",n.push(s.length)):e?(i="PreviewSender.SendPhoto",n.push(e)):t&&(i="PreviewSender.SendVideo",n.push(t))}Object(T.a)(t,Object(x.i18n)(i,n))}appendMediaToContainer(e,t){if(this.shouldCompress(t.file.type)){const s=Object(Bn.a)(t.width,t.height,380,320);e.style.width=s.width+"px",e.style.height=s.height+"px"}this.mediaContainer.append(e)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach(t=>e([t]));const s=t.length;for(let i=0;i{s.innerHTML="",e.length&&(this.setTitle(),this.iterate(e=>{if(this.shouldCompress(e[0].file.type)&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map(e=>e.itemDiv)),Ms({container:t,items:e.map(e=>({w:e.width,h:e.height})),maxWidth:380,minWidth:100,spacing:4}),s.append(t)}else e.forEach(e=>{this.appendMediaToContainer(e.itemDiv,e)})}))}).then(()=>{this.onRender()})}}const Ca=["ArrowUp","ArrowDown"],ka=["ArrowLeft","ArrowRight"];function Pa({list:e,type:t,onSelect:s,once:i,waitForKey:n}){const a=new Set("xy"===t?Ca.concat(ka):"x"===t?ka:Ca);let o;const r=()=>o||e.querySelector(".active")||e.firstElementChild,d=(e,s)=>{if(o===e)return;let i=!1;o&&(i=!0,o.classList.remove("active")),o=e,o&&(o.classList.add("active"),i&&m&&s&&Object(ft.b)(m,o,"center",void 0,void 0,void 0,100,"x"===t?"x":"y"))},h=(t,s)=>{let i;return i=s?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,i};let u;u="xy"===t?(t,s)=>"ArrowUp"===s||"ArrowDown"===s?((t,s)=>{const i=s?"nextElementSibling":"previousElementSibling",n=s?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[i]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[i]||e[n]}return o})(t,"ArrowDown"===s):h(t,"ArrowRight"===s):(e,t)=>h(e,"ArrowRight"===t||"ArrowDown"===t);let p=s=>{const i=s.key;if(a.has(i)){if(Object(c.a)(s),e.childElementCount>1){let e=r();e=u(e,i),d(e,!0)}}else("Enter"===i||"xy"!==t&&"Tab"===i)&&(Object(c.a)(s),v(r()))};const m=Object(Ce.a)(e,"scrollable");e.classList.add("navigable-list");const g=t=>{const s=Object(Ks.a)(t.target,e);s&&d(s,!1)},b=t=>{Object(c.a)(t);const s=Object(Ks.a)(t.target,e);s&&(d(s,!1),v(r()))},v=e=>{const t=s(e);(void 0!==t?!t:i)&&f()},f=()=>{document.removeEventListener("keydown",p,{capture:!0}),e.removeEventListener("mousemove",g),Object(l.c)(e,b)},y=()=>{n||d(e.firstElementChild,!1)};if(n){const e=p;p=t=>{t.key===n&&(Object(c.a)(t),document.removeEventListener("keydown",p,{capture:!0}),p=e,document.addEventListener("keydown",p,{capture:!0,passive:!1}),n=void 0,y())}}else y();return document.addEventListener("keydown",p,{capture:!0,passive:!1}),e.addEventListener("mousemove",g,{passive:!0}),Object(l.b)(e,b),{detach:f,resetTarget:y}}class Ta extends B.a{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{detach:t,resetTarget:s}=Pa({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.detach=t,this.resetTarget=s,re.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},D.a.pushItem(this.navigationItem)),this.addEventListener("hidden",()=>{this.resetTarget=void 0,this.detach=void 0,e.innerHTML="",t(),this.navigationItem&&(D.a.removeItem(this.navigationItem),this.navigationItem=void 0)},{once:!0})},Object(w.g)(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.addHelper(this)}attachNavigation(){this.addEventListener("visible",this.onVisible)}toggle(e,t=!1){this.init||(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden!==e?(this.hidden=e,e?(this.navigationItem&&(D.a.removeItem(this.navigationItem),this.navigationItem=void 0),t||this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller.hideOtherHelpers(this),this.dispatchEvent("visible")),Object(Yt.a)(this.container,"is-visible",!e,a.default.settings.animationsEnabled?200:0,()=>{this.hidden&&this.dispatchEvent("hidden")})):e||this.dispatchEvent("visible"))}}class xa extends Ta{constructor(e,t){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>!ea.onMediaClick({target:e},!0),waitForKey:"ArrowUp"}),this.container.classList.add("stickers-helper"),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0),a.default.dispatchEvent("choosing_sticker",!0)}),this.addEventListener("hidden",()=>{this.onChangeScreen&&(b.b.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0),a.default.dispatchEvent("choosing_sticker",!1)})}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),hs.preloadAnimatedEmojiSticker(e),hs.getStickersByEmoticon(e).then(e=>{if(!t())return;this.init&&(this.init(),this.init=null);const s=this.list.cloneNode();let i;this.lazyLoadQueue.clear(),i=e.length?new Promise(t=>{const i=[];e.forEach(e=>{s.append(this.superStickerRenderer.renderSticker(e,void 0,i))}),Promise.all(i).finally(t)}):Promise.resolve(),i.then(()=>{this.list.replaceWith(s),this.list=s,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*b.b.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},b.b.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!e.length),this.scrollable.scrollTop=0})})}init(){this.list=document.createElement("div"),this.list.classList.add("stickers-helper-stickers","super-stickers"),this.container.append(this.list),this.scrollable=new P.b(this.container),this.lazyLoadQueue=new ee.d,this.superStickerRenderer=new zn(this.lazyLoadQueue,fo)}}const Aa=()=>{const e=new Date;return e.setHours(0,0,0,0),e},Oa=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class Fa extends mn{constructor(e,t,s){var i;if(super((i=e).getTime()>Oa().getTime()?new Date:i,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Aa(),maxDate:Oa(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),s){const e=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),Object(l.b)(e,()=>{t(2147483646),this.hide()})}}}var _a=s(136),ja=s(85);function Da(e,t=!0){const s=[],i=[],n=window.getSelection();let a,o;if(n&&n.rangeCount){const t=n.getRangeAt(0),s=t.startOffset;if(t.startContainer&&t.startContainer==t.endContainer&&s==t.endOffset){const i=s-1,n=e.childNodes;if(t.startContainer===e&&n[i]){a=n[i],o=0;for(let e=0;e{s.onEmojiSelected(jn(e),!0)}}),this.appEmojiManager=i,this.container.classList.add("emoji-helper")}init(){this.list=document.createElement("div"),this.list.classList.add("emoji-helper-emojis","super-emojis"),this.container.append(this.list),this.scrollable=new P.a(this.container),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollLeft=0},0)})}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}(e=e.slice(0,80)).length&&(this.list.innerHTML="",e.forEach(e=>{_n(e,this.list,!1,!0)})),this.waitForKey=t?"ArrowUp":void 0,this.toggle(!e.length)}checkQuery(e,t){const s=this.controller.getMiddleware();this.appEmojiManager.getBothEmojiKeywords().then(()=>{if(!s())return;const i=e.replace(/^:/,""),n=this.appEmojiManager.searchEmojis(i);this.render(n,":"!==t)})}}class Ra extends Ta{constructor(e,t,s,i){super({appendTo:e,controller:t,listType:"y",onSelect:i}),this.className=s,this.container.classList.add(Ra.BASE_CLASS,s)}init(){this.list=document.createElement("div"),this.list.classList.add(Ra.BASE_CLASS+"-list"),this.container.append(this.list),this.scrollable=new P.b(this.container),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0)})}render(e){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach(e=>{const t=Ra.listElement({className:this.className,peerId:e.peerId,name:e.name,description:e.description});this.list.append(t)})),this.toggle(!e.length)}static listElement(e){const t=Ra.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const s=document.createElement("div");s.classList.add(t,e.className),s.dataset.peerId=""+e.peerId;const i=new _o;i.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),i.setAttribute("dialog","0"),i.setAttribute("peer",""+e.peerId);const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?n.innerHTML=J.b.wrapEmojiText(e.name):n.append(new wt.a({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),s.append(i,n),e.description){const i=document.createElement("div");i.classList.add(t+"-description",e.className+"-description"),i.innerHTML=J.b.wrapEmojiText(e.description),s.append(i)}return s}}Ra.BASE_CLASS="autocomplete-peer-helper",Ra.BASE_CLASS_LIST_ELEMENT=Ra.BASE_CLASS+"-list-element";class Ua extends Ra{constructor(e,t,s,i,n){super(e,t,"commands-helper",e=>{const t=e.querySelector(`.${Ra.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return s.getReadyToSend(()=>{s.messageInput.innerHTML=t,s.sendMessage(!0)})}),this.appProfileManager=i,this.appUsersManager=n}checkQuery(e,t){if(!this.appUsersManager.isBot(t))return!1;const s=this.controller.getMiddleware();return this.appProfileManager.getProfileByPeerId(t).then(t=>{if(!s())return;const i=[].concat(t.bot_info),n=new Mn.a({ignoreCase:!0}),a=new Map;i.forEach(e=>{e.commands.forEach(t=>{const s="/"+t.command;a.set(t.command,{peerId:e.user_id.toPeerId(!1),name:s,description:t.description}),n.indexObject(t.command,s)})});const o=n.search(e),r=Array.from(o).map(e=>a.get(e));this.render(r)}),!0}}class Ha{constructor(){this.helpers=new Set,this.middleware=Object(Ps.a)()}getMiddleware(){return this.middleware.clean(),this.middleware.get()}addHelper(e){this.helpers.add(e)}hideOtherHelpers(e){this.helpers.forEach(t=>{t!==e&&t.toggle(!0,!0)}),e||this.middleware.clean()}}class Na extends Ra{constructor(e,t,s,i,n){super(e,t,"mentions-helper",e=>{const t=n.getUser(e.dataset.peerId.toUserId());let i,a="";t.username?a="@"+t.username:(a=t.first_name||t.last_name,i={_:"messageEntityMentionName",length:a.length,offset:0,user_id:t.id}),a+=" ",s.insertAtCaret(a,i)}),this.appProfileManager=i,this.appUsersManager=n}checkQuery(e,t,s){const i=e.trim();if(e.length!==i.length)return!1;const n=this.controller.getMiddleware();return this.appProfileManager.getMentions(t&&t.toChatId(),i,s).then(e=>{if(!n())return;const t=i.slice(1).toLowerCase();this.render(e.map(e=>{const s=this.appUsersManager.getUser(e);if(!s.username||s.username.toLowerCase()!==t)return{peerId:e,description:s.username?"@"+s.username:void 0}}).filter(Boolean))}),!0}}var za=s(4);class Va extends Xn{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;Object(Ks.a)(t,this.element)||t===this.btnHover||(Object(c.a)(e),this.toggle(!1))},Object(w.g)(this,e),this.element.classList.add(Va.BASE_CLASS),this.element.style.display="none",this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(a.default)("history_reply_markup",({peerId:e})=>{this.peerId===e&&(this.checkAvailability()&&this.isActive()&&this.render(),Object(ks.c)().then(()=>{this.checkForceReply()}))})}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",()=>{this.render(),pe.IS_TOUCH_SUPPORTED&&(this.touchListener=this.listenerSetter.add(document.body)("touchstart",this.onBodyTouchStart,{passive:!1,capture:!0}),this.listenerSetter.add(this)("close",()=>{this.listenerSetter.remove(this.touchListener)},{once:!0}))}),this.listenerSetter.add(this.element)("click",e=>{const t=Object(Ce.a)(e.target,"btn");t&&(this.appMessagesManager.sendText(this.peerId,t.dataset.text),this.toggle(!1))}),super.init()}checkForceReply(){const e=this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}getReplyMarkup(){var e;return null!==(e=this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide"}}render(e=this.getReplyMarkup()){this.element.innerHTML="";for(const t of e.rows){const e=document.createElement("div");e.classList.add(Va.BASE_CLASS+"-row");for(const s of t.buttons){const t=document.createElement("button");t.classList.add(Va.BASE_CLASS+"-button","btn"),t.innerHTML=J.b.wrapEmojiText(s.text),t.dataset.text=s.text,e.append(t)}this.element.append(e)}}checkAvailability(e=this.getReplyMarkup()){var t;const s="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",s),s&&this.toggle(!1),!s}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}Va.BASE_CLASS="reply-keyboard";var Wa=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ka extends Ta{constructor(e,t,s,i,n){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>{const{peerId:t,botId:s,queryId:i}=this.list.dataset;return this.chat.input.getReadyToSend(()=>{const n=this.appInlineBotsManager.generateQId(i,e.dataset.resultId);this.appInlineBotsManager.sendInlineResult(t.toPeerId(),s,n,{clearDraft:!0,scheduleDate:this.chat.input.scheduleDate,silent:this.chat.input.sendSilent,replyToMsgId:this.chat.input.replyToMsgId}),this.chat.input.onMessageSent(!0,!0)})}}),this.chat=s,this.appUsersManager=i,this.appInlineBotsManager=n,this._checkQuery=(e,t,s)=>Wa(this,void 0,void 0,(function*(){const i=this.controller.getMiddleware(),n=yield this.appUsersManager.resolveUsername(t);if(!i())throw"PEER_CHANGED";if("user"!==n._)throw"NOT_A_BOT";const a=this.appInlineBotsManager.getInlineResults(e,n.id,s).then(t=>{var s;if(!i())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const a=this.list.cloneNode();a.dataset.peerId=""+e,a.dataset.botId=""+n.id,a.dataset.queryId=""+t.query_id;const o=new Un(null,"INLINE-HELPER",this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],c=!!t.pFlags.gallery;for(const e of t.results){const t=document.createElement("div");t.classList.add("inline-helper-result"),t.dataset.resultId=e.id;const n=c?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),a.append(t),c)t.classList.add("grid-item");else{n.classList.add("empty"),n.innerHTML=J.b.wrapEmojiText([...e.title.trim()][0]);const s=document.createElement("div");s.classList.add("inline-helper-result-title"),s.innerHTML=J.b.wrapEmojiText(e.title);const i=document.createElement("div");i.classList.add("inline-helper-result-description"),i.innerHTML=J.b.wrapRichText(e.description,{noCommands:!0,noLinks:!0}),t.append(s,i);const o=document.createElement("div");o.classList.add("inline-helper-separator"),a.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let s;n?(s=document.createElement("div"),n.append(s)):s=t,s.classList.add("media-container"),c&&s.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>he.a.download({dcId:4,location:{_:"inputWebFileLocation",access_hash:e.thumb.access_hash,url:e.thumb.url},size:e.thumb.size,mimeType:e.thumb.mime_type}).then(e=>{const t=new Image;t.classList.add("media-photo"),Object(ne.b)(e).then(e=>{Ss(s,t,e,!0)})})})}}else{const a=e.document||e.photo;if(["sticker","gif"].includes(null===(s=a)||void 0===s?void 0:s.type)&&c)Object(Ri.a)(a),"gif"===a.type?o.add(a,t):"sticker"===a.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(a,t,r),2===a.sticker&&this.superStickerRenderer.observeAnimatedDiv(t));else if(a){const e=c?48:void 0;c&&t.classList.add("no-border-radius"),ws({photo:a,container:c?t:n,boxWidth:e,boxHeight:e,middleware:i,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then(()=>{if(!i())return void o.clear();a.classList.toggle("is-gallery",c),a.classList.toggle("super-stickers",c),this.container.classList.toggle("is-gallery",c);const s=this.list.parentElement;if(s.textContent="",t.switch_pm){const i=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary");i.insertAdjacentHTML("beforeend",J.b.wrapEmojiText(t.switch_pm.text)),Object(l.b)(i,s=>{this.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)}),s.append(i)}s.append(this.list=a),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=o,o.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*b.b.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},b.b.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0})});return{user:n,renderPromise:a}})),this.container.classList.add("inline-helper"),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0)}),this.checkQuery=lt(this._checkQuery,200,!0,!0),this.addEventListener("hidden",()=>{this.onChangeScreen&&(b.b.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0)})}init(){this.list=document.createElement("div"),this.list.classList.add("inline-helper-results"),this.container.append(this.list),this.scrollable=new P.b(this.container),this.lazyLoadQueue=new ee.d,this.superStickerRenderer=new zn(this.lazyLoadQueue,"INLINE-HELPER")}}var Ga=s(3);class qa{constructor(e,t,s,i,n,o,r,d,h,u,p,m,g,b){this.chat=e,this.appMessagesManager=t,this.appMessagesIdsManager=s,this.appDocsManager=i,this.appChatsManager=n,this.appPeersManager=o,this.appWebPagesManager=r,this.appImManager=d,this.appDraftsManager=h,this.serverTimeManager=u,this.appNotificationsManager=p,this.appEmojiManager=m,this.appUsersManager=g,this.appInlineBotsManager=b,this.lastUrl="",this.lastTimeType=0,this.replyElements={},this.willSendWebPage=null,this.recording=!1,this.recordCanceled=!1,this.recordStartTime=0,this.lockRedo=!1,this.canRedoFromHTML="",this.undoHistory=[],this.executedHistory=[],this.canUndoFromHTML="",this.onCancelRecordClick=e=>{e&&Object(c.a)(e),this.recordCanceled=!0,this.recorder.stop(),ba.a.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=pe.IS_TOUCH_SUPPORTED?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=pe.IS_TOUCH_SUPPORTED?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>{const{peerId:s}=this.chat,i=this.chat.bubbles.getMiddleware(),n=a.default.myId!==s&&s.isUser()&&this.appUsersManager.isUserOnlineVisible(s);new Fa(t,t=>{if(!i())return;t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout(()=>{i()&&this.appImManager.openScheduled(s)},0)},n).show()},this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,s)=>{Object(c.a)(e);let i=this.messageInput.innerHTML;if(i&&i!==s){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const s=this.messageInput.innerHTML;if(i===s){if(++e>2)break}else e=0;i=s}while(i!==s);this.lockRedo=!1}},this.handleMarkdownShortcut=e=>{const t={KeyB:"bold",KeyI:"italic",KeyU:"underline",KeyS:"strikethrough",KeyM:"monospace"};this.appImManager.markupTooltip&&(t.KeyK="link");const s=e.code,i=t[s];if(document.getSelection().toString().trim().length&&i&&("KeyK"===s?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(i),Object(c.a)(e)),"KeyZ"===s){let t=this.messageInput.innerHTML;e.shiftKey?this.undoHistory.length&&(this.executedHistory.push(t),t=this.undoHistory.pop(),this.undoRedo(e,"redo",t),t=this.messageInput.innerHTML,this.canRedoFromHTML=this.undoHistory.length?t:"",this.canUndoFromHTML=t):!this.executedHistory.length||this.canUndoFromHTML&&t!==this.canUndoFromHTML||(this.undoHistory.push(t),t=this.executedHistory.pop(),this.undoRedo(e,"undo",t),this.canUndoFromHTML=this.canRedoFromHTML=this.messageInput.innerHTML)}},this.onMessageInput=e=>{var t;const{value:s,entities:i,caretPos:n}=Da(this.messageInputField.input),a=J.b.parseMarkdown(s,i,!0),o=J.b.mergeEntities(i,J.b.parseEntities(a));this.canRedoFromHTML&&!this.lockRedo&&this.messageInput.innerHTML!==this.canRedoFromHTML&&(this.canRedoFromHTML="",this.undoHistory.length=0);const r=!(null===(t=this.editMessage)||void 0===t?void 0:t.media)&&o.filter(e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._);if(r.length)for(const e of r){let t;if("messageEntityTextUrl"===e._)t=e.url;else if(t=s.slice(e.offset,e.offset+e.length),!t.includes("http://")&&!t.includes("https://"))continue;if(this.lastUrl!==t){this.lastUrl=t;const e=this.getWebPagePromise=ct.a.invokeApiHashable("messages.getWebPage",{url:t}).then(s=>{s=this.appWebPagesManager.saveWebPage(s),this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===s._?(this.setTopInfo("webpage",()=>{},s.site_name||s.title||"Webpage",s.description||s.url||""),delete this.noWebPage,this.willSendWebPage=s):this.willSendWebPage&&this.onHelperCancel())})}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(s.trim()){const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"}))}else this.lastTimeType&&this.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"}),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide();this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(s,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{this.insertAtCaret(e,J.b.getEmojiEntityFromEmoji(e),t)},this.onBtnSendClick=e=>{if(Object(c.a)(e),!this.recorder||this.recording||!this.isInputEmpty()||this.forwarding||this.editMsgId)this.recording?Date.now()-this.recordStartTime<500?this.onCancelRecordClick():this.recorder.stop():this.sendMessage();else{if(this.chat.peerId.isAnyChat()&&!this.appMessagesManager.canSendToPeer(this.chat.peerId,this.chat.threadId,"send_media"))return void ot("Posting media content isn't allowed in this group.");this.chatInput.classList.add("is-locked"),Object(Vs.a)(),this.recorder.start().then(()=>{this.releaseMediaPlayback=fe.setSingleMedia(),this.recordCanceled=!1,this.chatInput.classList.add("is-recording"),this.recording=!0,this.updateSendBtn(),ba.a.setKeepAlive(!0);const e=()=>{new pt("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{Object(l.d)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",t=>{Object(Ce.a)(t.target,"chat-input")||Object(Ce.a)(t.target,"popup-cancel-record")||(Object(c.a)(t),e())},{capture:!0,passive:!1}),D.a.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout(()=>{e()},0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,s=t.context.createAnalyser();t.connect(s),s.fftSize=32;const i=new Uint8Array(s.frequencyBinCount),n=255*i.length;let a=()=>{if(!this.recording)return;s.getByteFrequencyData(i);let e=0;i.forEach(t=>{e+=t});let t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;let o=Date.now()-this.recordStartTime,r=o%1e3,l=(""+o/1e3).toHHMMSS()+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=l,Object(Fe.b)(a)};a()}).catch(e=>{switch(e.name){case"NotAllowedError":ot("Please allow access to your microphone");break;case"NotReadableError":ot(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),ot(e.message)}this.chatInput.classList.remove("is-recording","is-locked")})}},this.onHelperCancel=(e,t)=>{if(e&&Object(c.a)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(this.helperFunc(),t=!0),this.lastUrl=e,this.noWebPage=!0,this.willSendWebPage=null,t)return}if("edit"===this.helperType&&!t){const e=this.editMessage,t=J.b.parseMarkdown(this.messageInputField.value,[]);if(e.message!==t)return void new pt("discard-editing",{buttons:[{langKey:"Alert.Confirm.Discard",callback:()=>{this.onHelperCancel(void 0,!0)}}],descriptionLangKey:"Chat.Edit.Cancel.Text"}).show()}this.clearHelper(),this.updateSendBtn()},this.onHelperClick=e=>{if(Object(c.a)(e),Object(Ce.a)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&pe.IS_TOUCH_SUPPORTED&&!e.container.classList.contains("active")&&Object(te.d)(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new R.a}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input"),this.chatInput.style.display="none",this.inputContainer=document.createElement("div"),this.inputContainer.classList.add("chat-input-container"),this.rowsWrapper=document.createElement("div"),this.rowsWrapper.classList.add("rows-wrapper","chat-input-wrapper");const e=la();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const s=document.createElement("div");s.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapper,t,s),this.chatInput.append(this.inputContainer),this.goDownBtn=Q({icon:"arrow_down",className:"bubbles-corner-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),Object(l.b)(this.goDownBtn,e=>{Object(c.a)(e),this.chat.bubbles.onGoDownClick()},{listenerSetter:this.listenerSetter})}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=H(""),this.replyElements.cancelBtn=H("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>(i=!0,this.canToggleHideAuthor()),t=()=>{i=!1},s=this.forwardElements={};let i=!1;const n=[s.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkboxField:new ut.a({checked:!0})},s.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new ut.a({checked:!1})},s.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new ut.a({checked:!0})},s.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new ut.a({checked:!1})},s.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],o=s.container=Ee(n,this.listenerSetter),r=Array.from(o.children);if([{elements:r.slice(0,2),onChange:(e,t)=>{const n=!!+e;i&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=x.default.weakMap.get(e),i=s.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=i,t.update()}}},{elements:r.slice(2,4),onChange:e=>{const t=!!+e;let i;i=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?s.hideSender:s.showSender:t?s.showSender:s.hideSender,i.checkboxField.checked=!0}}].forEach(e=>{const t=Ze(e.elements.map(e=>({container:e,input:e.querySelector("input")})),e.onChange),s=document.createElement("hr");t.append(s),o.append(t)}),o.append(s.changePeer.element),!pe.IS_TOUCH_SUPPORTED){this.forwardHover=new Xn({element:o})}s.modifyArgs=n.slice(0,-1),this.replyElements.container.append(o),s.modifyArgs.forEach((e,t)=>{const{input:s}=e.checkboxField;s.type="radio",s.name=t<2?"author":"caption",s.value=""+ +!(t%2)}),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.btnToggleEmoticons=H("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),"chat"===this.chat.type&&(this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=Q({icon:"mention",className:"bubbles-corner-button bubbles-go-mention"}),this.goMentionUnreadBadge=document.createElement("span"),this.goMentionUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goMentionBtn.append(this.goMentionUnreadBadge),this.inputContainer.append(this.goMentionBtn),Object(l.b)(this.goMentionBtn,e=>{Object(c.a)(e),this.appMessagesManager.goToNextMention(this.chat.peerId)},{listenerSetter:this.listenerSetter}),this.btnScheduled=H("scheduled btn-scheduled float hide",{noRipple:!0}),Object(l.b)(this.btnScheduled,e=>{this.appImManager.openScheduled(this.chat.peerId)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("scheduled_new",({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")}),this.listenerSetter.add(a.default)("scheduled_delete",({peerId:e})=>{this.chat.peerId===e&&this.appMessagesManager.getScheduledMessages(this.chat.peerId).then(e=>{this.btnScheduled.classList.toggle("hide",!e.length)})}),this.btnToggleReplyMarkup=H("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new Va({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,appMessagesManager:this.appMessagesManager,btnHover:this.btnToggleReplyMarkup,chatInput:this}),this.listenerSetter.add(this.replyKeyboard)("open",()=>this.btnToggleReplyMarkup.classList.add("active")),this.listenerSetter.add(this.replyKeyboard)("close",()=>this.btnToggleReplyMarkup.classList.remove("active"))),this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...m].join(", ");this.fileInput.setAttribute("accept",e),this.willAttachType="media",this.fileInput.click()},verify:(e,t)=>this.appMessagesManager.canSendToPeer(e,t,"send_media")},{icon:"document",text:"Chat.Input.Attach.Document",onClick:()=>{this.fileInput.value="",this.fileInput.removeAttribute("accept"),this.willAttachType="document",this.fileInput.click()},verify:(e,t)=>this.appMessagesManager.canSendToPeer(e,t,"send_media")},{icon:"poll",text:"Poll",onClick:()=>{new wa(this.chat).show()},verify:(e,t)=>e.isAnyChat()&&this.appMessagesManager.canSendToPeer(e,t,"send_polls")}],this.attachMenu=Me({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.btnToggleEmoticons,this.inputMessageContainer,this.btnScheduled,this.btnToggleReplyMarkup,this.attachMenu,this.recordTimeEl,this.fileInput].filter(Boolean)),this.rowsWrapper.append(this.replyElements.container),this.autocompleteHelperController=new Ha,this.stickersHelper=new xa(this.rowsWrapper,this.autocompleteHelperController),this.emojiHelper=new Ba(this.rowsWrapper,this.autocompleteHelperController,this,this.appEmojiManager),this.commandsHelper=new Ua(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.mentionsHelper=new Na(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.inlineHelper=new Ka(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.appUsersManager,this.appInlineBotsManager),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=H("delete danger btn-circle z-depth-1 btn-record-cancel"),this.btnSendContainer=document.createElement("div"),this.btnSendContainer.classList.add("btn-send-container"),this.recordRippleEl=document.createElement("div"),this.recordRippleEl.classList.add("record-ripple"),this.btnSend=H("none btn-circle z-depth-1 btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),"scheduled"!==this.chat.type&&(this.sendMenu=new va({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),sa.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(sa)("open",this.onEmoticonsOpen),this.listenerSetter.add(sa)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(a.default)("settings_updated",()=>{(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),this.messageInputField&&this.messageInputField.onFakeInput()}),this.listenerSetter.add(a.default)("draft_updated",({peerId:e,threadId:t,draft:s,force:i})=>{this.chat.threadId===t&&this.chat.peerId===e&&this.setDraft(s,!0,i)}),this.listenerSetter.add(a.default)("peer_changing",e=>{this.chat===e&&this.saveDraft()}),"scheduled"===this.chat.type?this.listenerSetter.add(a.default)("scheduled_delete",({peerId:e,mids:t})=>{this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()}):this.listenerSetter.add(a.default)("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"))});try{this.recorder=new ga.a({encoderSampleRate:48e3,monitorGain:0,numberOfChannels:1,recordingGain:1,reuseWorker:!0})}catch(e){console.error("Recorder constructor error:",e)}this.updateSendBtn(),this.listenerSetter.add(this.fileInput)("change",e=>{let t=e.target.files;t.length&&(new Ma(this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")},!1),Object(l.b)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&(Object(l.b)(this.btnCancelRecord,this.onCancelRecordClick,{listenerSetter:this.listenerSetter}),this.recorder.onstop=()=>{this.recording=!1,this.chatInput.classList.remove("is-recording","is-locked"),this.updateSendBtn(),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&&(D.a.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:s}=this.chat,i=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});ba.a.decode(e,!0).then(e=>{ba.a.setKeepAlive(!1),this.appMessagesManager.sendFile(t,a,{isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:i,threadId:s,clearDraft:!0}),this.onMessageSent(!1,!0)})}),Object(l.b)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),Object(l.b)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=lt(()=>this.saveDraft(),2500,!1,!0)}constructPinnedHelpers(){const e=document.createElement("div");e.classList.add("pinned-container"),this.pinnedControlBtn=Object(U.a)("btn-primary btn-transparent text-bold pinned-container-button",{icon:"unpin"}),e.append(this.pinnedControlBtn);const t=e.cloneNode(!0);this.fakePinnedControlBtn=t.firstChild,this.fakeRowsWrapper.append(t),this.listenerSetter.add(this.pinnedControlBtn)("click",()=>{const e=this.chat.peerId;new ca(e,0,!0,()=>{this.chat.appImManager.setPeer(je.b);const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)})}),this.rowsWrapper.append(e),this.chatInput.classList.add("type-pinned"),this.rowsWrapper.classList.add("is-centered")}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){const e=this.appMessagesManager.getDialogOnly(this.chat.peerId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",this.appNotificationsManager.isPeerLocalMuted(this.chat.peerId,!0)),this.goMentionUnreadBadge&&"chat"===this.chat.type){const t=!!(null==e?void 0:e.unread_mentions_count);this.goMentionUnreadBadge.innerText=t?""+e.unread_mentions_count:"",this.goMentionBtn.classList.toggle("is-visible",t)}}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const{value:e,entities:t}=Object(fa.a)(this.messageInputField.input);let s;(e.length||this.replyToMsgId)&&(s={_:"draftMessage",date:Object(oe.g)(!0)+this.serverTimeManager.serverTimeOffset,message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),this.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,s)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.style.display="none",this.goDownBtn.classList.add("hide")),Ws(),this.lastTimeType=0,this.messageInput&&(this.clearInput(),e&&this.clearHelper())}setDraft(e,t=!0,s=!1){return!(!s&&!Object(ya.a)(this.messageInput)||"scheduled"===this.chat.type)&&(e||(e=this.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId))?(this.messageInputField.value!==e.rMessage||this.replyToMsgId!==e.reply_to_msg_id)&&(t&&this.clearHelper(),this.noWebPage=e.pFlags.no_webpage,e.reply_to_msg_id&&this.initMessageReply(e.reply_to_msg_id),this.setInputValue(e.rMessage,t,t),!0):(s&&(this.chat.container.classList.contains("is-helper-active")&&this.t(),this.messageInputField.inputFake.textContent="",this.messageInputField.onFakeInput(!1),(this.chat.bubbles.messagesQueuePromise||Promise.resolve()).then(()=>{Object(Fe.b)(()=>{this.onMessageSent()})})),!1))}finishPeerChange(){const e=this.chat.peerId,{forwardElements:t,btnScheduled:s,replyKeyboard:i,sendMenu:n,goDownBtn:a,chatInput:o}=this;o.style.display="";const r=this.appPeersManager.isBroadcast(e);if(a.classList.toggle("is-broadcast",r),a.classList.remove("hide"),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&o.classList.toggle("can-pin",this.appPeersManager.canPinMessage(e)),t&&(this.forwardWasDroppingAuthor=!1,t.showCaption.checkboxField.setValueSilently(!0),t.showSender.checkboxField.setValueSilently(!0)),s){s.classList.add("hide");const t=this.chat.bubbles.getMiddleware();this.appMessagesManager.getScheduledMessages(e).then(e=>{t()&&s.classList.toggle("hide",!e.length)})}i&&i.setPeer(e),n&&n.setPeerId(e),this.messageInput?this.updateMessageInput():this.pinnedControlBtn&&(this.appPeersManager.canPinMessage(this.chat.peerId)?(this.pinnedControlBtn.append(Object(x.i18n)("Chat.Input.UnpinAll")),this.fakePinnedControlBtn.append(Object(x.i18n)("Chat.Input.UnpinAll"))):(this.pinnedControlBtn.append(Object(x.i18n)("Chat.Pinned.DontShow")),this.fakePinnedControlBtn.append(Object(x.i18n)("Chat.Pinned.DontShow"))))}updateMessageInput(){const{chatInput:e,attachMenu:t,messageInput:s}=this,{peerId:i,threadId:n}=this.chat,a=this.appMessagesManager.canSendToPeer(i,n);e.classList.add("no-transition"),e.classList.toggle("is-hidden",!a),e.offsetLeft,e.classList.remove("no-transition");const o=x.default.weakMap.get(s);if(o){let e;e=n?"Comment":this.appPeersManager.isBroadcast(i)?"ChannelBroadcast":this.appMessagesManager.isAnonymousSending(i)?"SendAnonymously":"Message",o.key!==e&&(o.key=e,o.update())}const r=this.attachMenuButtons.filter(e=>{const t=e.verify(i,n);return e.element.classList.toggle("hide",!t),t});a?(s.setAttribute("contenteditable","true"),this.setDraft(void 0,!1),s.innerHTML||this.messageInputField.onFakeInput()):s.removeAttribute("contenteditable"),t.toggleAttribute("disabled",!r.length),t.classList.toggle("btn-disabled",!r.length),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new F.b({placeholder:"Message",name:"message",animate:!0}),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),this.messageInput=this.messageInputField.input,this.messageInput.classList.add("no-scrollbar"),this.attachMessageInputListeners(),Ga.a&&Object(Ga.b)(this.messageInput),e?(e.input.replaceWith(this.messageInputField.input),e.inputFake.replaceWith(this.messageInputField.inputFake)):this.inputMessageContainer.append(this.messageInputField.input,this.messageInputField.inputFake)}attachMessageInputListeners(){this.listenerSetter.add(this.messageInput)("keydown",e=>{const t=e.key;if(Object(_a.a)(e))Object(c.a)(e),this.sendMessage();else if(e.ctrlKey||e.metaKey)this.handleMarkdownShortcut(e);else if(("PageUp"===t||"PageDown"===t)&&!e.shiftKey)if(e.preventDefault(),"PageUp"===t){const e=document.createRange(),t=window.getSelection();e.setStart(this.messageInput.childNodes[0]||this.messageInput,0),e.collapse(!0),t.removeAllRanges(),t.addRange(e)}else Object(Sa.a)(this.messageInput)}),pe.IS_TOUCH_SUPPORTED&&Object(l.b)(this.messageInput,e=>{this.appImManager.selectTab(1),sa.toggle(!1)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",()=>{this.checkAutocomplete()}),"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.listenerSetter.add(this.messageInput)("focusin",()=>{this.chat.bubbles.scrollable.loadedAll.bottom&&this.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)})}applyMarkdown(e,t){const s={bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",monospace:()=>document.execCommand("fontName",!1,"monospace"),link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null)};if(!s[e])return!1;const i=s[e],n=this.prepareDocumentExecute(),a=[];if(a.push(document.execCommand("styleWithCSS",!1,"true")),"monospace"===e){let t=!1;const s=window.getSelection();if(!s.isCollapsed){const i=s.getRangeAt(0),n=ja.b[e],a=i.commonAncestorContainer;(a.parentNode.matches(n.match)||a instanceof HTMLElement&&a.matches(n.match))&&(t=!0)}t?a.push(document.execCommand("fontName",!1,"Roboto")):a.push("function"==typeof i?i():document.execCommand(i,!1,null))}else a.push("function"==typeof i?i():document.execCommand(i,!1,null));return a.push(document.execCommand("styleWithCSS",!1,"false")),n(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),!0}insertAtCaret(e,t,s=!0){const{value:i,caretPos:n,entities:a}=Da(this.messageInput),o=n>=0?n:i.length,r=i.substr(0,o),l=i.substr(o),c=s?r.match(qa.AUTO_COMPLETE_REG_EXP):null,d=c?c.index+(c[0].length-c[2].length):r.length,h=r.slice(0,d)+e+l,u=J.b.parseEntities(i);J.b.mergeEntities(a,u);const p=t?Math.max(t.length,e.length):e.length,m=[];t&&(m.push(t),t.offset=d);const g=c?p-c[2].length:p;a.forEach(e=>{e.offset>=d&&(e.offset+=g)}),J.b.mergeEntities(a,m);{const e={_:"messageEntityCaret",offset:d+p,length:0};let t=0;for(let s=a.length;te.offset)break}a.splice(t,0,e)}const b=J.b.wrapDraftText(h,{entities:a});this.messageInputField.setValueSilently(b,!0);const v=this.messageInput.querySelector(".composer-sel");v&&(!function(e){const t=e;if(1===(e=e.previousSibling).nodeType){const s=document.createTextNode("");e.parentNode.insertBefore(s,t.nextSibling&&t.nextSibling.nodeType!==e.nodeType?t.nextSibling:t),e=s}if(window.getSelection&&document.createRange){const t=document.createRange();e&&(t.setStartAfter(e),t.insertNode(e),t.setStart(e,e.nodeValue.length)),t.collapse(!0);const s=window.getSelection();s.removeAllRanges(),s.addRange(t)}}(v),v.remove()),this.onMessageInput()}checkAutocomplete(e,t,s){if(void 0===e){const i=Da(this.messageInputField.input,!0);e=i.value,t=i.caretPos,s=i.entities}if(-1===t&&(t=e.length),void 0===s){const t=J.b.parseMarkdown(e,s,!0);s=J.b.mergeEntities(s,J.b.parseEntities(t))}if(e=e.substr(0,t),this.previousQuery===e)return;this.previousQuery=e;const i=e.match(qa.AUTO_COMPLETE_REG_EXP);let n;if(i){const t=s[0];let o=i[2];const r=o[0];if(this.stickersHelper&&a.default.settings.stickers.suggest&&this.appMessagesManager.canSendToPeer(this.chat.peerId,this.chat.threadId,"send_stickers")&&"messageEntityEmoji"===(null==t?void 0:t._)&&t.length===e.length&&!t.offset)n=this.stickersHelper,this.stickersHelper.checkEmoticon(e);else if("@"===r){const e=this.chat.threadId?this.appMessagesIdsManager.getServerMessageId(this.chat.threadId):void 0;this.mentionsHelper.checkQuery(o,this.chat.peerId.isUser()?je.b:this.chat.peerId,e)&&(n=this.mentionsHelper)}else i[1]||"/"!==r?a.default.settings.emoji.suggest&&(o=o.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!o||(n=this.emojiHelper,this.emojiHelper.checkQuery(o,r))):this.commandsHelper.checkQuery(o,this.chat.peerId)&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}checkInlineAutocomplete(e,t){let s=!1;if(!t){const i=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(i){const n=i[1],a=e.slice(i[0].length);s=i[0].length===e.length,t=this.inlineHelper,this.btnPreloader?Object(Yt.a)(this.btnPreloader,"show",!0,400):(this.btnPreloader=H("none btn-preloader float show disable-hover",{noRipple:!0}),Object(te.f)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,n,a).then(({user:e,renderPromise:t})=>{s&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then(()=>{Object(Yt.a)(this.btnPreloader,"show",!1,400)})}).catch(Ae.a)}}return s||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&this.btnPreloader&&Object(Yt.a)(this.btnPreloader,"show",!1,400),t}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=this.helperFunc;this.clearHelper(),this.updateSendBtn();let t=!1;new Us(Object(w.a)(this.forwarding),()=>{t=!0}).addEventListener("close",()=>{this.helperWaitingForward=!1,t||e()})}clearInput(e=!0,t=!0,s=""){if(document.activeElement===this.messageInput&&re.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),Object(za.a)(e),this.messageInputField.setValueSilently(s),Object(za.a)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(s);pe.IS_TOUCH_SUPPORTED||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let i=!1;e&&(i=this.setDraft(void 0,!1)),!i&&t&&this.onMessageInput()}isInputEmpty(){return Object(ya.a)(this.messageInput)}updateSendBtn(){let e;const t=this.isInputEmpty();e=this.editMsgId?"edit":!this.recorder||this.recording||!t||this.forwarding?"scheduled"===this.chat.type?"schedule":"send":"record",["send","record","edit","schedule"].forEach(t=>{this.btnSend.classList.toggle(t,e===t)}),this.btnScheduled&&this.btnScheduled.classList.toggle("show",t),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t)}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const s=this.messageInputField.value;J.b.parseEntities(s).filter(e=>"messageEntityEmoji"===e._).forEach(e=>{const t=Object(ie.a)(e.unicode);this.appEmojiManager.pushRecentEmoji(t)}),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.clearInput()),(t||e)&&this.clearHelper(),this.updateSendBtn()}sendMessage(e=!1){const{editMsgId:t,chat:s}=this;if("scheduled"===s.type&&!e&&!t)return void this.scheduleSending();const{threadId:i,peerId:n}=s,{replyToMsgId:a,noWebPage:o,sendSilent:r,scheduleDate:l}=this,{value:c,entities:d}=Object(fa.a)(this.messageInputField.input);if(t){const e=this.editMessage;if(!c.trim()&&!e.media)return void new Hs(n,[t],s.type);this.appMessagesManager.editMessage(e,c,{entities:d,noWebPage:o}),this.onMessageSent()}else c.trim()&&(this.appMessagesManager.sendText(n,c,{entities:d,replyToMsgId:a,threadId:i,noWebPage:o,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,scheduleDate:l,silent:r,clearDraft:!0}),this.onMessageSent(!1,!1));if(this.forwarding){const e=Object(w.a)(this.forwarding);setTimeout(()=>{for(const t in e)this.appMessagesManager.forwardMessages(n,t.toPeerId(),e[t],{silent:r,scheduleDate:l,dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()});c||this.onMessageSent()},0)}}sendMessageWithDocument(e,t=!1,s=!1){var i;const n="sticker"===(e=this.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!this.appMessagesManager.canSendToPeer(this.chat.peerId,this.chat.threadId,n)?(ot("Posting media content isn't allowed in this group."),!1):"scheduled"!==this.chat.type||t?!!e&&(this.appMessagesManager.sendFile(this.chat.peerId,e,{isMedia:!0,replyToMsgId:this.replyToMsgId,threadId:this.chat.threadId,silent:this.sendSilent,scheduleDate:this.scheduleDate,clearDraft:s||void 0}),this.onMessageSent(s,!0),"sticker"===e.type&&(null===(i=sa.stickersTab)||void 0===i||i.pushRecentSticker(e)),!0):(this.scheduleSending(()=>this.sendMessageWithDocument(e,!0,s)),!1)}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||Object(bt.a)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){const t=this.chat.getMessage(e);let s=J.b.wrapDraftText(t.message,{entities:t.totalEntities});const i=()=>{const n=this.appMessagesManager.wrapMessageForReply(t,void 0,[t.mid]);this.setTopInfo("edit",i,Object(x.i18n)("AccDescrEditing"),n,s,t),this.editMsgId=e,this.editMessage=t,s=void 0};i()}initMessagesForward(e){const t=()=>{const s=Object.keys(e).map(e=>e.toPeerId()),i=new Set;let n=0,o=0;s.forEach(t=>{const s=e[t];s.forEach(e=>{var s;const n=this.appMessagesManager.getMessageByPeer(t,e);!(null===(s=n.fwd_from)||void 0===s?void 0:s.from_name)||n.fromId||n.fwdFromId?i.add("P"+n.fromId):i.add("N"+n.fwd_from.from_name),n.media&&n.message&&++o}),n+=s.length});const r=i.size>2,l=[...i].map(e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===a.default.myId?Object(x.i18n)("Chat.Accessory.Forward.You"):new wt.a({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e}),{forwardElements:c}=this;Object(bt.a)(c.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!o);const d=c.hideCaption.checkboxField.checked;o&&d?c.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?c.hideSender:c.showSender).checkboxField.setValueSilently(!0);const h=c.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",u=Object(x.i18n)(h,[n]),p=document.createDocumentFragment();let m,g;if(l.length<3?p.append(...Object(x.join)(l,!1)):p.append(l[0],Object(x.i18n)("AndOther",[l.length-1])),1===s.length){const t=s[0],i=e[t];if(m=this.appMessagesManager.getMessageByPeer(t,i[0]),g=!!m.grouped_id,g){const e=this.appMessagesManager.getMidsByMessage(m);(e.length!==n||e.find(e=>!i.includes(e)))&&(g=!1)}}const b=document.createDocumentFragment();if(g||1===n){const t=e[s[0]],i=this.appMessagesManager.wrapMessageForReply(m,void 0,t);b.append(p,": ",i)}else b.append(Object(x.i18n)("Chat.Accessory.Forward.From"),": ",p);let v=this.setTopInfo("forward",t,u,b);c.modifyArgs.forEach((e,t)=>{const i=e.textElement,n=x.default.weakMap.get(i);n.args=[t<2?s.length:o],n.update()}),this.forwardHover&&this.forwardHover.attachButtonListener(v,this.listenerSetter),this.forwarding=e};t()}initMessageReply(e){if(this.replyToMsgId===e)return;let t=this.chat.getMessage(e);const s=()=>{let i;"messageEmpty"===t._?(i=Object(x.i18n)("Loading"),this.chat.appMessagesManager.wrapSingleMessage(this.chat.peerId,e).then(i=>{this.replyToMsgId===e&&(t=i,"messageEmpty"===t._?this.clearHelper("reply"):s())})):i=new wt.a({peerId:t.fromId,dialog:!1}).element,this.setTopInfo("reply",s,i,t&&t.message,void 0,t),this.replyToMsgId=e};s()}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.replyToMsgId=void 0,this.forwarding=void 0),this.editMsgId=this.editMessage=void 0,this.helperType=this.helperFunc=void 0,this.chat.container.classList.contains("is-helper-active")&&(D.a.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){Object(Yt.a)(this.chat.container,"is-toggling-helper",!0,150,()=>{this.chat.container.classList.remove("is-toggling-helper")})}setInputValue(e,t=!0,s=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),Object(Fe.b)(()=>{s&&Object(Sa.a)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight})}setTopInfo(e,t,s="",i="",n,a){if(this.willSendWebPage&&"reply"===e)return;"webpage"!==e&&(this.clearHelper(e),this.helperType=e,this.helperFunc=t);const o=this.replyElements.container,r=o.lastElementChild.previousElementSibling,l=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=H(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const c=Is(s,i,a);return l?r.replaceWith(c):o.insertBefore(c,o.lastElementChild),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),re.IS_MOBILE||D.a.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout(()=>{this.updateSendBtn()},0),c}}qa.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;class Qa{constructor(e){this.floating=!1,Object(w.g)(this,e);const{divAndCaption:t,className:s}=this;t.container.classList.add("pinned-container","hide"),t.title.classList.add("pinned-container-title"),t.subtitle.classList.add("pinned-container-subtitle"),t.content.classList.add("pinned-container-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add("pinned-container-close",`pinned-${s}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("pinned-container-wrapper"),Object(se.ripple)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add("pinned-container-wrapper-utils"),this.wrapperUtils.append(this.btnClose),this.wrapper.append(...Array.from(t.container.children),this.wrapperUtils),t.container.append(this.wrapper),this.attachOnCloseEvent(this.btnClose)}attachOnCloseEvent(e){Object(l.b)(e,e=>{Object(c.a)(e),((this.onClose?this.onClose():null)||Promise.resolve(!0)).then(e=>{e&&this.toggle(!0)})},{listenerSetter:this.listenerSetter})}toggle(e){const t=this.divAndCaption.container.classList.contains("hide");if(void 0===e)e=!t;else if(e===t)return;const s=(this.floating||b.b.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",s),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",s),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}fill(e,t,s){this.divAndCaption.container.dataset.peerId=""+s.peerId,this.divAndCaption.container.dataset.mid=""+s.mid,this.divAndCaption.fill(e,t,s),this.topbar.setUtilsWidth()}}class $a extends Qa{constructor(e,t,s){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new He("pinned-audio",(e,t)=>{Object(T.a)(this.divAndCaption.title,e),Object(T.a)(this.divAndCaption.subtitle,t)}),onClose:()=>{fe.stop()},floating:!0}),this.topbar=e,this.chat=t,this.appMessagesManager=s,this.divAndCaption.border.remove();const i=H("pprevious active",{noRipple:!0}),n=H("nnext active",{noRipple:!0});i.innerHTML='',n.innerHTML='';const o=(e,t)=>{Object(l.b)(e,e=>{Object(c.a)(e),t()},{listenerSetter:this.topbar.listenerSetter})};o(i,()=>{fe.previous()}),o(n,()=>{fe.next()}),this.toggleEl=H("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),o(this.toggleEl,()=>{fe.toggle()}),this.wrapper.prepend(this.wrapper.firstElementChild,i,this.toggleEl,n),this.volumeSelector=new Pe(this.listenerSetter,!0);const r=document.createElement("div");r.classList.add("progress-line-container"),r.append(this.volumeSelector.container);const d=document.createElement("div");d.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(d),this.volumeSelector.btn.append(r),this.wrapperUtils.prepend(this.volumeSelector.btn);const h=document.createElement("div");h.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new ke(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),h.append(this.progressLine.container),this.wrapper.insertBefore(h,this.wrapperUtils),this.topbar.listenerSetter.add(a.default)("media_play",({doc:e,message:t,media:s})=>{let i,n;"voice"===e.type||"round"===e.type?(i=new wt.a({peerId:t.fromId}).element,n=Object(oe.d)(t.date)):(i=e.audioTitle||e.fileName,n=e.audioPerformer||Object(x.i18n)("AudioUnknownArtist")),this.progressLine.setMedia(s),this.fill(i,n,t),this.toggleEl.classList.add("flip-icon"),this.toggle(!1)}),this.topbar.listenerSetter.add(a.default)("media_pause",()=>{this.toggleEl.classList.remove("flip-icon")}),this.topbar.listenerSetter.add(a.default)("media_stop",()=>{this.toggle(!0)})}}var Ya;!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"}(Ya||(Ya={}));class Xa{constructor(){this.drawRect=(e,t,s,i,n)=>`M${e},${t+n}a${n},${n},0,0,1,${s},0v${i-2*n}a${n},${n},0,0,1,${-s},0Z`,this.getClipPath=(e,t,s)=>{let i="";if(2===s)i=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let s;return e<=1?s=Ya.ONE:2===e?s=Ya.TWO:3===e?s=Ya.THREE:4===e?s=Ya.FOUR:e>3&&(s=Ya.MORE),s},this.getMarkHeight=(e,t)=>{let s;return e<=1?s=Ya.ONE:2===e?s=Ya.TWO:3===e?s=Ya.THREE:4===e?s=Ya.FOUR:e>3&&(s=Ya.MORE),s},this.getMarkTranslateY=(e,t,s)=>1===s?0:2===s?e?t+1:0:3===s?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,s,i)=>t<=4||e<=1?0:e>=t-2?i-Ya.ONE-s:(e-2)*s+1*e,this.getTrackHeight=(e,t)=>e<=3?Ya.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add("pinned-message-border"),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className="pinned-message-border-wrapper-1",this.border.classList.remove("pinned-message-border-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const s=this.getBarHeight(e,t),i=this.getMarkHeight(e,t),n=this.getTrackHeight(e,s),a="clipPath_"+e,o=this.getClipPath(a,s,e),r=this.getMarkTranslateY(t,s,e),l=this.getTrackTranslateY(t,e,s,n);return this.border.classList.toggle("pinned-message-border-mask",e>4),t<=1?(this.border.classList.add("mask-bottom"),this.border.classList.remove("mask-top")):t>=e-2?(this.border.classList.add("mask-top"),this.border.classList.remove("mask-bottom")):this.border.classList.add("mask-top","mask-bottom"),this.wrapper.className="pinned-message-border-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${l}px);`,this.svg||(this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.setAttributeNS(null,"height","0"),this.svg.setAttributeNS(null,"width","0"),this.defs=document.createElementNS("http://www.w3.org/2000/svg","defs"),this.defs.append(o),this.svg.append(this.defs),this.mark=document.createElement("div"),this.mark.classList.add("pinned-message-border-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${i}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var Ja=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Za{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=Za.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const s=document.createElement("div"),i=!Object.keys(this.rows).length&&!t;return s.className=Za.BASE_CLASS+"-row"+(i?"":" is-hiding hide"),this.rows[e]={element:s,new:!0},this.container.append(s),s}clearRow(e){this.rows[e]&&(this.rows[e].element.remove(),delete this.rows[e])}clearRows(e){this.clearTimeout&&clearTimeout(this.clearTimeout),this.clearTimeout=window.setTimeout(()=>{for(const t in this.rows)+t!==e&&this.clearRow(+t)},Za.DURATION)}setNewRow(e,t=!1){const s=this.rows[e];s.new&&(t?(s.element.classList.remove("hide"),s.element.offsetLeft):s.element.classList.remove("is-hiding","hide"),delete s.new),this.clearRows(e)}animate(e,t,s=e>t,i=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!i)return this.setNewRow(e);const o=["from-top","from-bottom"];s||o.reverse(),n.element.classList.add(o[0]),n.element.classList.remove(o[1]),a&&(a.element.classList.add(o[1]),a.element.classList.remove(o[0])),n.new&&this.setNewRow(e,!0),n.element.classList.toggle("is-hiding",!1),a&&a.element.classList.toggle("is-hiding",!0),this.clearRows(e)}}Za.DURATION=200,Za.BASE_CLASS="animated-super";class eo{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=eo.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=eo.BASE_CLASS+"-decimal";const s=document.createElement("div");s.className=eo.BASE_CLASS+"-decimal-placeholder";const i=new Za;return i.container.className=eo.BASE_CLASS+"-decimal-wrapper",t.append(s,i.container),this.container.append(t),this.decimals[e]={container:t,placeholder:s,animatedSuper:i}}clear(e){this.clearTimeout&&clearTimeout(this.clearTimeout);const t=(""+e).length;t>=this.decimals.length||(this.clearTimeout=window.setTimeout(()=>{this.decimals.splice(t,this.decimals.length-t).forEach(e=>{e.container.remove()})},Za.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach(t=>{const s=+t.placeholder.innerText||0;t.animatedSuper.getRow(eo.EMPTY_INDEX,!0);t.animatedSuper.animate(eo.EMPTY_INDEX,s,this.reverse?ethis.previousNumber,!0)}),this.clear(e)}setCount(e){const t=Array.from(""+this.previousNumber).map(e=>+e);Array.from(""+e).map(e=>+e).forEach((s,i)=>{var n;const a=this.getDecimal(i),o=a.animatedSuper.getRow(s,!0),r=null!==(n=t[i])&&void 0!==n?n:eo.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+s,a.animatedSuper.animate(s,r,this.reverse?ethis.previousNumber,!0)}),this.hideLeft(e),this.previousNumber=e}}eo.EMPTY_INDEX=-1,eo.BASE_CLASS="animated-counter";class to{constructor(e,t,s,i){this.topbar=e,this.chat=t,this.appMessagesManager=s,this.appPeersManager=i,this.pinnedMaxMid=0,this.pinnedMid=0,this.pinnedIndex=-1,this.wasPinnedIndex=0,this.wasPinnedMediaIndex=0,this.locked=!1,this.waitForScrollBottom=!1,this.count=0,this.mids=[],this.offsetIndex=0,this.loading=!1,this.loadedBottom=!1,this.loadedTop=!1,this.scrollDownListenerSetter=null,this.hidden=!1,this.getCurrentIndexPromise=null,this.isStatic=!1,this.debug=!1,this.listenerSetter=new R.a;const n=new ze("pinned-message");this.pinnedMessageContainer=new Qa({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:n,onClose:()=>Ja(this,void 0,void 0,(function*(){return i.canPinMessage(this.topbar.peerId)?new ca(this.topbar.peerId,this.pinnedMid,!0):new ca(this.topbar.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new Xa,n.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new Za,n.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new Za,this.animatedMedia.container.classList.add("pinned-message-media-container"),n.content.prepend(this.animatedMedia.container),this.animatedCounter=new eo(!0),n.title.append(Object(x.i18n)("PinnedMessage")," ",this.animatedCounter.container);const o=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(o),n.container.prepend(o),this.btnOpen=H("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),Object(l.b)(this.btnOpen,e=>{Object(c.a)(e),this.topbar.openPinned(!0)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("peer_pinned_messages",({peerId:e})=>{e===this.topbar.peerId&&(this.hidden&&this.pinnedMessageContainer.toggle(this.hidden=!1),this.loadedTop=this.loadedBottom=!1,this.pinnedIndex=-1,this.pinnedMid=0,this.count=0,this.mids=[],this.offsetIndex=0,this.pinnedMaxMid=0,this.setCorrectIndex(0))}),this.listenerSetter.add(a.default)("peer_pinned_hidden",({peerId:e})=>{e===this.topbar.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)}),this.setPinnedMessage=lt(()=>this._setPinnedMessage(),100,!0,!0),this.isStatic="discussion"===this.chat.type}destroy(){this.pinnedMessageContainer.divAndCaption.container.remove(),this.pinnedMessageContainer.toggle(!0),this.listenerSetter.removeAll(),this.unsetScrollDownListener(!1)}setCorrectIndex(e){if(this.isStatic)return;if(this.locked||this.hidden)return;if((this.loadedBottom||this.loadedTop)&&!this.count)return;let t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const s=t.dataset.mid;t&&void 0!==s&&this.testMid(+s,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let s=this.mids.findIndex(t=>t<=e);if(-1===s||this.isNeededMore(s)){if(!(this.loadedTop&&es))return;this.pinnedIndex=s,this.pinnedMid=this.mids.find(t=>t<=e)||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>to.LOAD_COUNT&&(!this.loadedBottom&&e<=to.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=to.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return Ja(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{let s=!1;const i=[this.appMessagesManager.getSearch({peerId:this.topbar.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:to.LOAD_COUNT,backLimit:to.LOAD_COUNT}).then(e=>(s=!0,e))];if(!this.pinnedMaxMid){const e=this.appMessagesManager.getPinnedMessage(this.topbar.peerId).then(e=>{e.maxId&&(this.pinnedMaxMid=e.maxId,!s&&t&&(this.mids=[this.pinnedMaxMid],this.count=e.count,this.pinnedIndex=0,this.pinnedMid=this.mids[0],this.setPinnedMessage()))});i.push(e)}const n=(yield Promise.all(i))[0];let a=n.history.findIndex(t=>t.mid<=e);-1===a&&(a=n.history.length),this.offsetIndex=n.offset_id_offset?n.offset_id_offset-a:0,this.mids=n.history.map(e=>e.mid).slice(),this.count=n.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,this.debug&&this.chat.log("[PM]: getCurrentIndex result:",e,n,a,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.chat.log.error("[PM]: getCurrentIndex error",e)}this.loading=!1,this.locked?this.testMid(e):t&&this.setCorrectIndex(0),this.getCurrentIndexPromise=null}}))}setScrollDownListener(){this.waitForScrollBottom=!0,this.scrollDownListenerSetter||(this.scrollDownListenerSetter=new R.a,function(e,t,s,i){if(pe.IS_TOUCH_SUPPORTED){let n;const a={passive:!0};i.add(e)("touchstart",t=>{t.touches.length>1?r():(n=t.touches[0].clientY,i.add(e)("touchmove",o,a),i.add(e)("touchend",r,a))},a);const o=e=>{const i=e.touches[0].clientY,a=i{i.removeManual(e,"touchmove",o,a),i.removeManual(e,"touchend",r,a)}}else i.add(e)("wheel",e=>{const i=e.deltaY>0;"bottom"===t&&i?s():"top"!==t||i||s()},{passive:!0})}(this.chat.bubbles.scrollable.container,"bottom",()=>{this.unsetScrollDownListener()},this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return Ja(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.chat.log("[PM]: handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield Object(ks.c)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.chat.log("[PM]: handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.chat.log.error("[PM]: handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return Ja(this,void 0,void 0,(function*(){const t=this.chat.getMessage(e);t&&!t.deleted&&(this.chat.setMessageId(e),(this.chat.setPeerPromise||Promise.resolve()).then(()=>{this.handleFollowingPinnedMessage(),this.testMid(this.pinnedIndex>=this.count-1?this.pinnedMaxMid:e-1)}))}))}_setPinnedMessage(){return Ja(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,s=this.chat.getMessage(this.pinnedMid),i=0===t;this.animatedCounter.container.classList.toggle("is-last",i),i||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.chat.log("[PM]: setPinnedMessage: fromTop",n,t,this.wasPinnedIndex);const a=this.animatedSubtitle.getRow(t),o=this.animatedMedia.getRow(t);o.classList.add("pinned-message-media");const r=[],l=Ne({title:void 0,titleEl:null,subtitle:s.message,subtitleEl:a,message:s,mediaEl:o,loadPromises:r});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",l),this.animatedSubtitle.animate(t,this.wasPinnedIndex),l?(this.animatedMedia.animate(t,this.wasPinnedMediaIndex),this.wasPinnedMediaIndex=t):this.animatedMedia.clearRows(),this.pinnedMessageBorder.render(e,e-t-1),this.wasPinnedIndex=t,this.pinnedMessageContainer.divAndCaption.container.dataset.mid=""+s.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}to.LOAD_COUNT=50,to.LOAD_OFFSET=5;class so{constructor(e,t,s,i,n,a,o,r){this.chat=e,this.appSidebarRight=t,this.appMessagesManager=s,this.appPeersManager=i,this.appChatsManager=n,this.appNotificationsManager=a,this.appProfileManager=o,this.appUsersManager=r,this.menuButtons=[],this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",b.b.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===b.a.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),re.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame(()=>{re.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 s=t.divAndCaption.container.classList.contains("is-floating");return this.container.classList.toggle(`is-pinned-${t.className}-floating`,s),e+ +s},0);this.container.dataset.floating=""+e},this.setPeerStatus=(e=!1)=>{if(!this.subtitle)return;const t=this.peerId;this.chat.appImManager.setPeerStatus(this.peerId,this.subtitle,e,!1,()=>t===this.peerId)},this.listenerSetter=new R.a}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar"),this.container.dataset.floating="0",this.btnBack=H("left sidebar-close-button",{noRipple:!0}),this.chatInfo=document.createElement("div"),this.chatInfo.classList.add("chat-info");const e=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const s=document.createElement("div");s.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),s.append(this.title);const i=document.createElement("div");i.classList.add("bottom"),this.subtitle&&i.append(this.subtitle),t.append(s,i),this.avatarElement&&e.append(this.avatarElement),e.append(t),this.chatInfo.append(e),this.chatUtils=document.createElement("div"),this.chatUtils.classList.add("chat-utils"),this.chatAudio=new $a(this,this.chat,this.appMessagesManager),this.menuButtons.length&&(this.btnMore=Me({listenerSetter:this.listenerSetter},"bottom-left",this.menuButtons,e=>{Object(c.a)(e),this.menuButtons.forEach(e=>{e.element.classList.toggle("hide",!e.verify())}),this.menuButtons[this.menuButtons.length-1].element.lastChild.replaceWith(Object(x.i18n)(this.appPeersManager.getDeleteButtonText(this.peerId)))})),this.chatUtils.append(...[this.pinnedMessage?this.pinnedMessage.pinnedMessageContainer.divAndCaption.container:null,this.btnJoin,this.btnPinned,this.btnMute,this.btnSearch,this.btnMore].filter(Boolean)),this.container.append(this.btnBack,this.chatInfo,this.chatUtils),this.chatAudio&&this.container.append(this.chatAudio.divAndCaption.container),this.listenerSetter.add(window)("resize",this.onResize),this.listenerSetter.add(b.b)("changeScreen",this.onChangeScreen),Object(l.b)(this.container,e=>{const t=Object(Ce.a)(e.target,"pinned-container");if(Object(Vs.a)(),t){if(Object(c.a)(e),Object(Ce.a)(e.target,"progress-line"))return;const s=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(s);else{const e=t.dataset.peerId.toPeerId(),i=fe.getSearchContext();this.chat.appImManager.setInnerPeer(e,s,i.isScheduled?"scheduled":i.threadId?"discussion":void 0,i.threadId)}}else b.b.activeScreen===b.a.medium&&document.body.classList.contains("is-left-column-shown")?n():Object(bt.a)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains("is-right-column-shown")):this.appSidebarRight.toggleSidebar(!0)},{listenerSetter:this.listenerSetter});const n=e=>{if(e&&Object(c.a)(e),b.b.activeScreen===b.a.medium&&document.body.classList.contains("is-left-column-shown"))this.chat.appImManager.setPeer(this.peerId);else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);D.a.back(e?"im":"chat")}};Object(l.b)(this.btnBack,n,{listenerSetter:this.listenerSetter})}constructUtils(){this.menuButtons=[{icon:"search",text:"Search",onClick:()=>{this.chat.initSearch()},verify:()=>b.b.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:()=>{this.appMessagesManager.mutePeer(this.peerId)},verify:()=>"chat"===this.chat.type&&a.default.myId!==this.peerId&&!this.appNotificationsManager.isPeerLocalMuted(this.peerId,!1)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.appMessagesManager.mutePeer(this.peerId)},verify:()=>"chat"===this.chat.type&&a.default.myId!==this.peerId&&this.appNotificationsManager.isPeerLocalMuted(this.peerId,!1)},{icon:"comments",text:"ViewDiscussion",onClick:()=>{this.appProfileManager.getChannelFull(this.peerId.toChatId()).then(e=>{e.linked_chat_id&&this.chat.appImManager.setInnerPeer(e.linked_chat_id.toPeerId(!0))})},verify:()=>{var e;const t=this.appProfileManager.chatsFull[this.peerId.toChatId()];return"chat"===this.chat.type&&this.appPeersManager.isBroadcast(this.peerId)&&!!(null===(e=t)||void 0===e?void 0:e.linked_chat_id)}},{icon:"select",text:"Chat.Menu.SelectMessages",onClick:()=>{const e=this.chat.selection;e.toggleSelection(!0,!0),C.default.getState().then(t=>{if(t.chatContextMenuHintWasShown)return;const s=e.toggleByElement.bind(e);e.toggleByElement=t=>{C.default.pushToState("chatContextMenuHintWasShown",!0),ot(Object(x.i18n)("Chat.Menu.Hint")),e.toggleByElement=s,e.toggleByElement(t)}})},verify:()=>!this.chat.selection.isSelecting&&!!Object.keys(this.chat.bubbles.bubbles).length},{icon:"select",text:"Chat.Menu.ClearSelection",onClick:()=>{this.chat.selection.cancelSelection()},verify:()=>this.chat.selection.isSelecting},{icon:"adduser",text:"AddContact",onClick:()=>{if(!this.appSidebarRight.isTabExists(_t)){const e=new _t(this.appSidebarRight);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>this.peerId.isUser()&&!this.appPeersManager.isContact(this.peerId)},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new Mt({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise((s,i)=>{new pt("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new wt.a({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{s(),this.appMessagesManager.sendOther(t,this.appUsersManager.getContactMediaInput(e)),this.chat.appImManager.setInnerPeer(t)}},{langKey:"Cancel",callback:()=>{i()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()}),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>a.default.myId!==this.peerId&&this.peerId.isUser()&&this.appPeersManager.isContact(this.peerId)},{icon:"lock",text:"BlockUser",onClick:()=>{new pt("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new wt.a({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.appUsersManager.toggleBlock(this.peerId,!0).then(e=>{e&&rt({langPackKey:"UserBlocked"})})}}]}).show()},verify:()=>{var e;const t=this.peerId.toUserId(),s=this.appProfileManager.usersFull[t];return this.appPeersManager.isUser(this.peerId)&&this.peerId!==a.default.myId&&s&&!(null===(e=s.pFlags)||void 0===e?void 0:e.blocked)}},{icon:"lockoff",text:"Unblock",onClick:()=>{this.appUsersManager.toggleBlock(this.peerId,!1).then(e=>{e&&rt({langPackKey:"UserUnblocked"})})},verify:()=>{var e;const t=this.appProfileManager.usersFull[this.peerId.toUserId()];return this.appPeersManager.isUser(this.peerId)&&!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.blocked)}},{icon:"delete danger",text:"Delete",onClick:()=>{new xt(this.peerId)},verify:()=>"chat"===this.chat.type&&!!this.appMessagesManager.getDialogOnly(this.peerId)}],this.btnSearch=H("search"),Object(l.b)(this.btnSearch,e=>{Object(c.a)(e),this.chat.initSearch()},{listenerSetter:this.listenerSetter})}constructPeerHelpers(){return this.avatarElement=new _o,this.avatarElement.setAttribute("dialog","1"),this.avatarElement.classList.add("avatar-42","person-avatar"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new to(this,this.chat,this.appMessagesManager,this.appPeersManager),this.btnJoin=Object(U.a)("btn-primary btn-color-primary chat-join hide"),this.btnPinned=H("pinlist"),this.btnMute=H("mute"),Object(l.b)(this.btnPinned,e=>{Object(c.a)(e),Object(Vs.a)(),this.openPinned(!0)},{listenerSetter:this.listenerSetter}),Object(l.b)(this.btnMute,e=>{Object(c.a)(e),Object(Vs.a)(),this.appMessagesManager.mutePeer(this.peerId)},{listenerSetter:this.listenerSetter}),Object(l.b)(this.btnJoin,e=>{Object(c.a)(e),Object(Vs.a)();const t=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const s=this.peerId.toChatId();let i;i=this.appChatsManager.isChannel(s)?this.appChatsManager.joinChannel(s):this.appChatsManager.addChatUser(s,a.default.myId),i.finally(()=>{t()&&this.btnJoin.removeAttribute("disabled")})},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("chat_update",e=>{var t,s;if(this.peerId===e.toPeerId(!0)){const i=this.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(s=null===(t=i)||void 0===t?void 0:t.pFlags)||void 0===s?void 0:s.left)),this.setUtilsWidth()}}),this.listenerSetter.add(a.default)("dialog_notify_settings",e=>{e.peerId===this.peerId&&this.setMutedState()}),this.listenerSetter.add(a.default)("peer_typings",({peerId:e})=>{this.peerId===e&&this.setPeerStatus()}),this.listenerSetter.add(a.default)("user_update",e=>{this.peerId===e&&this.setPeerStatus()}),this.pinnedMessage&&this.chat.addEventListener("setPeer",(e,t)=>{const s=this.chat.bubbles.getMiddleware();C.default.getState().then(i=>{s()&&(this.pinnedMessage.hidden=!!i.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))})}),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}constructPinnedHelpers(){this.listenerSetter.add(a.default)("peer_pinned_messages",e=>{const{peerId:t,mids:s,pinned:i}=e;t===this.peerId&&s&&this.setTitle()})}constructDiscussionHelpers(){this.pinnedMessage=new to(this,this.chat,this.appMessagesManager,this.appPeersManager)}openPinned(e){this.chat.appImManager.setInnerPeer(this.peerId,e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,"pinned")}destroy(){this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),this.pinnedMessage&&this.pinnedMessage.destroy(),delete this.chatAudio,delete this.pinnedMessage}setPeer(e){this.wasPeerId=this.peerId,this.peerId=e,this.container.style.display=e?"":"none"}finishPeerChange(e,t,s){var i,n;const a=this.peerId;this.avatarElement&&(this.avatarElement.setAttribute("peer",""+a),this.avatarElement.update());const o=this.appPeersManager.isBroadcast(a);if(this.btnMute&&this.btnMute.classList.toggle("hide",!o),this.appPeersManager.isAnyChat(a)&&this.btnJoin){const e=a.toChatId();Object(T.a)(this.btnJoin,Object(x.i18n)(this.appChatsManager.isChannel(e)?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(n=null===(i=this.appChatsManager.getChat(e))||void 0===i?void 0:i.pFlags)||void 0===n?void 0:n.left))}this.setUtilsWidth();const r=this.chat.bubbles.getMiddleware();if(this.pinnedMessage)if("chat"===this.chat.type){if(void 0!==this.wasPeerId){const e=new to(this,this.chat,this.appMessagesManager,this.appPeersManager);this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy(),this.pinnedMessage=e}C.default.getState().then(t=>{r()&&(this.pinnedMessage.hidden=!!t.hiddenPinnedMessages[a],e||this.pinnedMessage.setCorrectIndex(0))})}else"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage());Object(Fe.b)(()=>{this.setTitle(),this.setPeerStatus(!0),this.setMutedState()})}setTitle(e){var t;let s;if("pinned"===this.chat.type?(s=void 0===e?Object(x.i18n)("Loading"):Object(x.i18n)("PinnedMessagesCount",[e]),void 0===e&&this.appMessagesManager.getSearchCounters(this.peerId,[{_:"inputMessagesFilterPinned"}],!1).then(e=>{const t=e[0].count;if(this.setTitle(t),!t){this.chat.appImManager.setPeer(je.b);const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}})):"scheduled"===this.chat.type?(s=this.peerId===a.default.myId?Object(x.i18n)("Reminders"):Object(x.i18n)("ScheduledMessages"),void 0===e&&this.appMessagesManager.getScheduledMessages(this.peerId).then(e=>{this.setTitle(e.length)})):"discussion"===this.chat.type?(s=void 0===e?Object(x.i18n)("Loading"):Object(x.i18n)("Chat.Title.Comments",[e]),void 0===e&&Promise.all([this.appMessagesManager.getHistory(this.peerId,0,1,0,this.chat.threadId),Promise.resolve()]).then(()=>{const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId).count;null===e?setTimeout(()=>{this.setTitle()},30):this.setTitle(e)})):"chat"===this.chat.type&&(s=new wt.a({peerId:this.peerId,dialog:!0}).element),Object(T.a)(this.title,s),"chat"===this.chat.type){const e=this.appPeersManager.getPeer(this.peerId);(null===(t=null==e?void 0:e.pFlags)||void 0===t?void 0:t.verified)&&this.title.append(Bt())}}setMutedState(){if(!this.btnMute)return;const e=this.peerId;let t=this.appNotificationsManager.isPeerLocalMuted(e,!1);this.appPeersManager.isBroadcast(e)?(this.btnMute.classList.remove("tgico-mute","tgico-unmute"),this.btnMute.classList.add(t?"tgico-unmute":"tgico-mute"),this.btnMute.style.display=""):this.btnMute.style.display="none"}}class io extends z{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new _("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=H("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const e=document.createElement("div");e.classList.add("chatlist-container"),this.scrollable.container.replaceWith(e),this.appSearch=new O(e,this.inputSearch,{messages:new A("Chat.Search.PrivateSearch","messages")})}open(e,t,s,i){const n=super.open();return this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,i):(this.query=i,this.peerId=e,this.threadId=t,this.onDatePick=s,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&Object(l.b)(this.btnPickDate,()=>{new mn(new Date,this.onDatePick).show()}),i&&this.appSearch.searchInput.inputField.setValueSilently(i),Qt.toggleSidebar(!0)),n}}class no{constructor(e,t,s){this.topbar=e,this.chat=t,this.query=s,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{Object(c.a)(e),new mn(new Date,this.chat.bubbles.onDatePick).show()},this.selectResult=e=>{if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),s=+e.dataset.mid||void 0,i=Object(Ts.a)(e);i===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),i?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active");const n=this.chat.setPeer(t,s);this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then(()=>{this.selectedIndex=i,Object(T.a)(this.foundCountEl,Object(x.i18n)("Of",[i+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()}).finally(()=>{this.setPeerPromise=null})},this.onResultsClick=e=>{const t=Object(bt.a)(e.target,"LI");t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.bubblesContainer.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{Object(c.a)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{Object(c.a)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex-1])},this.element=document.createElement("div"),this.element.classList.add("sidebar-header","chat-search","chatlist-container"),this.backBtn=document.createElement("button"),this.backBtn.classList.add("btn-icon","tgico-left","sidebar-close-button"),Object(se.ripple)(this.backBtn),this.backBtn.addEventListener("click",()=>{this.topbar.container.classList.remove("hide-pinned"),this.element.remove(),this.inputSearch.remove(),this.results.remove(),this.footer.remove(),this.footer.removeEventListener("click",this.onFooterClick),this.dateBtn.removeEventListener("click",this.onDateClick),this.upBtn.removeEventListener("click",this.onUpClick),this.downBtn.removeEventListener("click",this.onDownClick),this.searchGroup.list.removeEventListener("click",this.onResultsClick),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active")},{once:!0}),this.inputSearch=new _("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new A(!1,"messages",void 0,"",!1),this.searchGroup.list.addEventListener("click",this.onResultsClick),this.appSearch=new O(this.results,this.inputSearch,{messages:this.searchGroup},e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):(this.foundCountEl.replaceWith(this.inputSearch.value?Object(x.i18n)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"))}),this.appSearch.beginSearch(this.chat.peerId,this.chat.threadId),this.chat.bubbles.bubblesContainer.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),this.footer.addEventListener("click",this.onFooterClick),Object(se.ripple)(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"),this.dateBtn.addEventListener("click",this.onDateClick),this.upBtn.addEventListener("click",this.onUpClick),this.downBtn.addEventListener("click",this.onDownClick),this.controls.append(this.upBtn,this.downBtn),this.footer.append(this.foundCountEl,this.dateBtn,this.controls),this.topbar.container.parentElement.insertBefore(this.footer,t.input.chatInput),this.element.append(this.backBtn,this.inputSearch.container),this.topbar.container.classList.add("hide-pinned"),this.topbar.container.parentElement.append(this.element),this.inputSearch.input.focus(),s&&(this.inputSearch.inputField.value=s)}}class ao extends B.a{constructor(e,t,s,i,n,a,o,r,l,c,d,h,u,p,m,g,b,v,f){super(),this.appImManager=e,this.appChatsManager=t,this.appDocsManager=s,this.appInlineBotsManager=i,this.appMessagesManager=n,this.appPeersManager=a,this.appPhotosManager=o,this.appProfileManager=r,this.appStickersManager=l,this.appUsersManager=c,this.appWebPagesManager=d,this.appPollsManager=h,this.apiManager=u,this.appDraftsManager=p,this.serverTimeManager=m,this.storage=g,this.appNotificationsManager=b,this.appEmojiManager=v,this.appMessagesIdsManager=f,this.wasAlreadyUsed=!1,this.type="chat",this.inited=!1,this.container=document.createElement("div"),this.container.classList.add("chat","tabs-tab"),this.backgroundEl=document.createElement("div"),this.backgroundEl.classList.add("chat-background"),this.log=Object(X.b)("CHAT",X.a.Log|X.a.Warn|X.a.Debug|X.a.Error),this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container)}setBackground(e){const t=a.default.getTheme();let s;if("color"===t.background.type&&"grabbing"===document.documentElement.style.cursor){const e=this.backgroundEl.lastElementChild;e&&e.dataset.type===t.background.type&&(s=e)}return s||(s=document.createElement("div"),s.classList.add("chat-background-item"),s.dataset.type=t.background.type),"color"===t.background.type&&(s.style.backgroundColor=t.background.color,s.style.backgroundImage="none"),new Promise(t=>{const i=()=>{const e=this.backgroundEl.lastElementChild;e!==s?(this.backgroundEl.append(s),Object(Fe.b)(()=>{Object(Fe.b)(()=>{Object(Yt.a)(s,"is-visible",!0,200,e?()=>{e.remove()}:null)})}),t()):t()};e?Object(as.a)(s,e,i):i()})}setType(e){this.type=e,"scheduled"===this.type&&(this.getMessagesStorage=()=>this.appMessagesManager.getScheduledMessagesStorage(this.peerId))}init(){this.topbar=new so(this,Qt,this.appMessagesManager,this.appPeersManager,this.appChatsManager,this.appNotificationsManager,this.appProfileManager,this.appUsersManager),this.bubbles=new ra(this,this.appMessagesManager,this.appStickersManager,this.appUsersManager,this.appInlineBotsManager,this.appPhotosManager,this.appPeersManager,this.appProfileManager,this.appDraftsManager,this.appMessagesIdsManager),this.input=new qa(this,this.appMessagesManager,this.appMessagesIdsManager,this.appDocsManager,this.appChatsManager,this.appPeersManager,this.appWebPagesManager,this.appImManager,this.appDraftsManager,this.serverTimeManager,this.appNotificationsManager,this.appEmojiManager,this.appUsersManager,this.appInlineBotsManager),this.selection=new $s(this,this.bubbles,this.input,this.appMessagesManager),this.contextMenu=new pa(this.bubbles.bubblesContainer,this,this.appMessagesManager,this.appPeersManager,this.appPollsManager,this.appDocsManager,this.appMessagesIdsManager),"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()),this.container.classList.add("type-"+this.type),this.container.append(this.topbar.container,this.bubbles.bubblesContainer,this.input.chatInput),this.bubbles.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer(t)}),this.bubbles.listenerSetter.add(a.default)("dialog_drop",e=>{e.peerId===this.peerId&&this.appImManager.setPeer(je.b)})}beforeDestroy(){this.bubbles.cleanup()}destroy(){this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),delete this.topbar,delete this.bubbles,delete this.input,delete this.selection,delete this.contextMenu,this.container.remove()}cleanup(e=!0){this.input.cleanup(e),this.selection.cleanup()}setPeer(e,t){e?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=!1;const s=this.peerId===e;if(s){if(this.setPeerPromise)return}else a.default.dispatchEvent("peer_changing",this),this.peerId=e;if(!e)return Qt.toggleSidebar(!1),this.cleanup(!0),this.topbar.setPeer(e),this.bubbles.setPeer(e),void a.default.dispatchEvent("peer_changed",e);if(!s){const t=Qt.getTab(io);t&&t.close(),Qt.sharedMediaTab.setPeer(e,this.threadId),this.input.clearHelper(),this.selection.cleanup(),this.setAutoDownloadMedia()}this.peerChanged=s;const i=this.bubbles.setPeer(e,t);if(!i)return;const{promise:n}=i,o=this.setPeerPromise=n.finally(()=>{this.setPeerPromise===o&&(this.setPeerPromise=null)});return s||(Qt.sharedMediaTab.setLoadMutex(this.setPeerPromise),Qt.sharedMediaTab.loadSidebarMedia(!0)),i}setAutoDownloadMedia(){const e=this.peerId;if(!e)return;let t;t=e.isUser()?e.isContact()?"contacts":"private":e.isBroadcast()?"channels":"groups",this.noAutoDownloadMedia=!a.default.settings.autoDownload[t]}setMessageId(e){return this.setPeer(this.peerId,e)}finishPeerChange(e,t,s){if(this.peerChanged)return;let i=this.peerId;this.peerChanged=!0,this.cleanup(!1),this.topbar.setPeer(i),this.topbar.finishPeerChange(e,t,s),this.bubbles.finishPeerChange(),this.input.finishPeerChange(),Qt.sharedMediaTab.fillProfileElements(),this.log.setPrefix("CHAT-"+i+"-"+this.type),a.default.dispatchEvent("peer_changed",i),this.wasAlreadyUsed=!0}getMessagesStorage(){return this.appMessagesManager.getMessagesStorage(this.peerId)}getMessage(e){return this.appMessagesManager.getMessageFromStorage(this.getMessagesStorage(),e)}getMidsByMid(e){return this.appMessagesManager.getMidsByMessage(this.getMessage(e))}isAnyGroup(){return this.peerId===a.default.myId||this.peerId===je.c||this.appPeersManager.isAnyGroup(this.peerId)}initSearch(e){if(this.peerId)if(b.b.isMobile)new no(this.topbar,this,e);else{let t=Qt.getTab(io);t||(t=new io(Qt)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}}var oo=s(140);class ro{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,pe.IS_TOUCH_SUPPORTED){if(Object(c.a)(e),0!=this.mouseUpCounter++)return void this.hide();this.resetSelection(this.savedRange)}this.show()}}init(){this.container=document.createElement("div"),this.container.classList.add("markup-tooltip","z-depth-1","hide"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("markup-tooltip-wrapper");const e=document.createElement("div"),t=document.createElement("div");e.classList.add("markup-tooltip-tools"),t.classList.add("markup-tooltip-tools");["bold","italic","underline","strikethrough","monospace","link"].forEach(t=>{const s=H(t,{noRipple:!0});e.append(this.buttons[t]=s),"link"!==t?s.addEventListener("mousedown",e=>{Object(c.a)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()}):Object(l.b)(s,e=>{Object(c.a)(e),this.showLinkEditor(),this.cancelClosening()})}),this.linkBackButton=H("left",{noRipple:!0}),this.linkInput=document.createElement("input"),Object(x._i18n)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",e=>{const t=!this.linkInput.value.length||!!J.b.matchUrl(this.linkInput.value);"Enter"===e.key&&(t?this.applyLink(e):(this.linkInput.classList.contains("error")&&(this.linkInput.classList.remove("error"),this.linkInput.offsetLeft),this.linkInput.classList.add("error")))}),this.linkInput.addEventListener("input",e=>{const t=this.isLinkValid();this.linkInput.classList.toggle("is-valid",t),this.linkInput.classList.remove("error")}),this.linkBackButton.addEventListener("mousedown",e=>{Object(c.a)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()}),this.linkApplyButton=H("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",e=>{this.applyLink(e)});const s=document.createElement("div");s.classList.add("markup-tooltip-link-apply-container");const i=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");i.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(i,this.buttons.link),s.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,s),this.wrapper.append(e,t),this.container.append(this.wrapper),document.body.append(this.container),window.addEventListener("resize",()=>{this.hide()})}showLinkEditor(){this.container&&this.container.classList.contains("is-visible")||this.show();const e=this.buttons.link;this.container.classList.add("is-link");const t=document.getSelection();if(this.savedRange=t.getRangeAt(0),e.classList.contains("active")){const e=this.savedRange.startContainer.parentElement;this.linkInput.value=e.href}else this.linkInput.value="";this.setTooltipPosition(!0),setTimeout(()=>{this.linkInput.focus()},200),this.linkInput.classList.toggle("is-valid",this.isLinkValid())}applyLink(e){Object(c.a)(e),this.resetSelection();let t=this.linkInput.value;t&&!J.b.matchUrlProtocol(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout(()=>{this.hide()},0)}isLinkValid(){return!this.linkInput.value.length||!!J.b.matchUrl(this.linkInput.value)}resetSelection(e=this.savedRange){const t=window.getSelection();t.removeAllRanges(),t.addRange(e),this.appImManager.chat.input.messageInput.focus()}hide(){this.init||(this.container.classList.remove("is-visible"),document.removeEventListener("mouseup",this.onMouseUpSingle),this.waitingForMouseUp=!1,D.a.removeByType("markup"),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=window.setTimeout(()=>{this.hideTimeout=void 0,this.container.classList.add("hide"),this.container.classList.remove("is-link")},200))}getActiveMarkupButton(){const e=function(){const e=[],t=window.getSelection();for(let s=0;s!!e)}(),t=[...new Set(e.map(e=>e.parentNode))],s=new Set;return t.forEach(e=>{for(const t in ja.b){const i=ja.b[t];e.closest(i.match+", [contenteditable]")!==this.appImManager.chat.input.messageInput&&s.add(this.buttons[t])}}),[...s]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const s=this.buttons[t];s.classList.toggle("active",e.includes(s))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),s=document.body.getBoundingClientRect(),i=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=i.top+-1*s.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,l=n.left,c=n.left+n.width-Math.min(n.width,o.width);let d;if(e){const e=this.container.getBoundingClientRect();d=Object(M.a)(e.left,l,c)}else{const e=i.left+(i.width-o.width)/2;d=Object(M.a)(e,l,c)}this.container.style.transform=`translate3d(${d}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),da())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"),re.IS_MOBILE||D.a.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){pe.IS_TOUCH_SUPPORTED&&!re.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",e=>{Object(c.a)(e),this.mouseUpCounter=1,this.waitingForMouseUp=!1,this.setMouseUpEvent()},{once:!0}))}handleSelection(){this.addedListener||(this.addedListener=!0,document.addEventListener("selectionchange",e=>{if(document.activeElement===this.linkInput)return;if(document.activeElement!==this.appImManager.chat.input.messageInput)return void this.hide();const t=document.getSelection();if(da(t))this.hide();else if(pe.IS_TOUCH_SUPPORTED)if(re.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=t.getRangeAt(0),this.setMouseUpEvent()}else this.setMouseUpEvent()}))}}function lo(e,t,s,i,n,a,o){return[e,",",t," ",s," ",i,",",n," ",a,",",o].join("")}function co(e,t,s,i,n,a,o,r){const l=[];return l.push("M"+(e+s/2)+","+t),l.push("H"+(e+s-a)),a>0&&l.push("A"+lo(a,a,0,0,1,e+s,t+a)),l.push("V"+(t+i-o)),o>0&&l.push("A"+lo(o,o,0,0,1,e+s-o,t+i)),l.push("H"+(e+r)),r>0&&l.push("A"+lo(r,r,0,0,1,e+0,t+i-r)),l.push("V"+(t+n)),n>0&&l.push("A"+lo(n,n,0,0,1,e+n,t+0)),l.push("Z"),l.join(" ")}de.a.generatePathData=co;class ho{constructor(e,t){let s;this.options=t,this.onDragOver=e=>{this.container.classList.add("is-dragover")},this.onDragLeave=e=>{this.container.classList.remove("is-dragover")},this.onDrop=e=>{this.options.onDrop(e)},this.container=document.createElement("div"),this.container.classList.add("drop","z-depth-1"),this.outlineWrapper=document.createElement("div"),this.outlineWrapper.classList.add("drop-outline-wrapper"),this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("drop-outline"),this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.classList.add("drop-outline-path"),t.icon&&(s=document.createElement("div"),s.classList.add("drop-icon","tgico-"+t.icon));const i=document.createElement("div");let n;i.classList.add("drop-header"),i.append(Object(x.i18n)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append(Object(x.i18n)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,s,i,n].filter(Boolean)),e.append(this.container),this.container.addEventListener("dragover",this.onDragOver),this.container.addEventListener("dragleave",this.onDragLeave),this.container.addEventListener("drop",this.onDrop)}destroy(){delete this.options,this.container.remove(),this.container.removeEventListener("dragover",this.onDragOver),this.container.removeEventListener("dragleave",this.onDragLeave),this.container.removeEventListener("drop",this.onDrop)}setPath(){const e=this.outlineWrapper.getBoundingClientRect();this.svg.setAttributeNS(null,"preserveAspectRatio","none"),this.svg.setAttributeNS(null,"viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttributeNS(null,"width",""+e.width),this.svg.setAttributeNS(null,"height",""+e.height);const t=co(5,5,e.width-10,e.height-10,10,10,10,10);this.path.setAttributeNS(null,"d",t)}}function uo(e){e.forEach(e=>e.classList.add("no-transition")),Object(Fe.a)().then(()=>{e.forEach(e=>e.classList.remove("no-transition"))})}var po,mo=s(135);class go extends ht.b{constructor(e,t){super("popup-join-chat-invite",Object(ht.a)([{langKey:t.pFlags.broadcast?"JoinByPeekChannelTitle":"JoinByPeekGroupTitle",callback:()=>{ct.a.invokeApi("messages.importChatInvite",{hash:e}).then(e=>{ei.a.processUpdateMessage(e);const t=e.chats[0].id.toPeerId(!0);a.default.dispatchEvent("history_focus",{peerId:t})})}}]),{closable:!0,overlayClosable:!0,body:!0}),this.header.remove();const s=new _o;s.setAttribute("dialog","0"),s.classList.add("avatar-100"),"photo"===t.photo._?(t.photo=r.a.savePhoto(t.photo),ws({container:s,message:null,photo:t.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):d.a.putPhoto(s,je.b,!1,t.title);const i=document.createElement("div");i.classList.add("chat-title"),i.innerHTML=J.b.wrapEmojiText(t.title);const n=t.pFlags.broadcast,o=Object(x.i18n)(n?"Subscribers":"Members",[t.participants_count]);o.classList.add("chat-participants-count"),this.body.append(s,i,o)}}!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"}(po||(po={}));var bo=s(24),vo=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const fo="chat",yo=pe.IS_TOUCH_SUPPORTED?"touchstart":"mousemove";const wo=new class{constructor(){this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.tabId=-1,this.chats=[],this.backgroundPromises={},this.onHashChange=()=>{const e=location.hash,t=e.split("?"),s=this.parseUriParams(e,t);if(this.log("hashchange",e,t[0],s),s.tgaddr){D.a.replaceState();const{onclick:e}=J.b.wrapUrl(s.tgaddr);if(e){const t=document.createElement("a");t.href=s.tgaddr,window[e](t)}}else switch(t[0]){case"#/im":{const e=s.p;let t=void 0!==s.post?v.a.generateMessageId(+s.post):void 0;switch(e[0]){case"@":this.openUsername(e,t);break;default:this.setInnerPeer(t?e.toPeerId(!0):e.toPeerId(),t)}}}},this.setSettings=()=>{document.documentElement.style.setProperty("--messages-text-size",a.default.settings.messagesTextSize+"px"),document.body.classList.toggle("animation-level-0",!a.default.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",a.default.settings.animationsEnabled),this.chatsSelectTabDebounced=lt(()=>{const e=this.chat.topbar;e.pinnedMessage&&e.pinnedMessage.setCorrectIndex(0),ct.a.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)},a.default.settings.animationsEnabled?250:0,!1,!0),le.b.setLoop(a.default.settings.stickers.loop),I.a.checkAnimations(!1);for(const e of this.chats)e.setAutoDownloadMedia();x.default.setTimeFormat(a.default.settings.timeFormat)},this.onDocumentPaste=(e,t)=>{const s=Ia();if(this.canDrag()||s){if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&Object(c.a)(e)}Object(me.d)(e).then(e=>{if(e.length){if(s)return void s.addFiles(e);const i=this.chat.input;i.willAttachType=t||(m.has(e[0].type)?"media":"document"),new Ma(this.chat,e,i.willAttachType)}})}},ei.a.attach(),Ft.a.start(),this.log=Object(X.b)("IM",X.a.Log|X.a.Warn|X.a.Debug|X.a.Error),this.selectTab(0),window.addEventListener("blur",()=>{I.a.checkAnimations(!0),this.offline=a.default.idle.isIDLE=!0,this.updateStatus(),clearInterval(this.updateStatusInterval),a.default.dispatchEvent("idle",a.default.idle.isIDLE),window.addEventListener("focus",()=>{this.offline=a.default.idle.isIDLE=!1,this.updateStatus(),this.updateStatusInterval=window.setInterval(()=>this.updateStatus(),5e4),I.a.checkAnimations(!1),a.default.dispatchEvent("idle",a.default.idle.isIDLE)},{once:!0})}),window.addEventListener(yo,()=>{this.updateStatusInterval=window.setInterval(()=>this.updateStatus(),5e4),this.updateStatus(),this.offline=a.default.idle.isIDLE=!1,a.default.dispatchEvent("idle",a.default.idle.isIDLE)},{once:!0,passive:!0}),this.chatsContainer=document.createElement("div"),this.chatsContainer.classList.add("chats-container","tabs-container"),this.chatsContainer.dataset.animation="navigation",this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),D.a.onHashChange=this.onHashChange,this.setSettings(),a.default.addEventListener("settings_updated",this.setSettings),Object(ks.a)(()=>{I.a.setOnlyOnePlayableGroup("lock"),I.a.checkAnimations(!0)},()=>{I.a.setOnlyOnePlayableGroup(""),I.a.checkAnimations(!1)}),this.applyCurrentTheme(),b.b.addEventListener("changeScreen",(e,t)=>{document.body.classList.contains("is-left-column-shown")&&document.body.classList.contains("is-right-column-shown")&&Qt.toggleSidebar(!1)}),a.default.addEventListener("history_focus",e=>{let{peerId:t,threadId:s,mid:i}=e;s&&(s=v.a.generateMessageId(s)),i&&(i=v.a.generateMessageId(i)),this.setInnerPeer(t,i,s?"discussion":void 0,s)}),a.default.addEventListener("peer_changing",e=>{this.saveChatPosition(e)}),a.default.addEventListener("theme_change",()=>{this.applyCurrentTheme()}),a.default.addEventListener("choosing_sticker",e=>{this.setChoosingStickerTyping(!e)}),a.default.addEventListener("instance_deactivated",()=>{const e=new ht.b("popup-instance-deactivated",void 0,{overlayClosable:!0}),t=document.createElement("div");t.classList.add("instance-deactivated-container"),e.container.replaceWith(t);const s=document.createElement("div");s.classList.add("header"),s.append(Object(x.i18n)("Deactivated.Title"));const i=document.createElement("div");i.classList.add("subtitle"),i.append(Object(x.i18n)("Deactivated.Subtitle")),t.append(s,i),document.body.classList.add("deactivated"),e.onClose=()=>{document.body.classList.add("deactivated-backwards"),mo.a.activateInstance(),setTimeout(()=>{document.body.classList.remove("deactivated","deactivated-backwards")},333)},e.show()}),Cn.a.get("chatPositions").then(e=>{Cn.a.setToCache("chatPositions",e||{})}),mo.a.activateInstance();const e=()=>{bo.default.setAuthorized(!0)};setInterval(e,oe.a),e(),this.addAnchorListener({name:"showMaskedAlert",callback:(e,t)=>{const s=t.href,i=t.cloneNode(!0);i.className="anchor-url",i.innerText=s,i.removeAttribute("onclick"),new pt("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[i],buttons:[{langKey:"Open",callback:()=>{i.click()}}]}).show()}}),this.addAnchorListener({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:s}=e;i.a.sendText(this.chat.peerId,"/"+t+(s?"@"+s:""))}}),this.addAnchorListener({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),this.addAnchorListener({name:"addstickers",callback:({pathnameParams:e})=>{const t={_:po.STICKER_SET,set:e[1]};this.processInternalLink(t)}}),this.addAnchorListener({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:po.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),this.addAnchorListener({name:"im",callback:({pathnameParams:e,uriParams:t})=>vo(this,void 0,void 0,(function*(){let s;s="c"===e[0]?{_:po.PRIVATE_POST,channel:e[1],post:e[2],thread:"thread"in t?t.thread:void 0,comment:t.comment}:{_:po.MESSAGE,domain:e[0],post:e[1],comment:t.comment},this.processInternalLink(s)}))}),this.addAnchorListener({name:"resolve",protocol:"tg",callback:({uriParams:e})=>{let t;"telegrampassport"===e.domain||(t=this.makeLink(po.MESSAGE,e)),this.processInternalLink(t)}}),this.addAnchorListener({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(po.PRIVATE_POST,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"addstickers",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(po.STICKER_SET,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"joinchat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(po.JOIN_CHAT,e);this.processInternalLink(t)}}),this.onHashChange(),this.attachKeydownListener()}get myId(){return a.default.myId}get chat(){return this.chats[this.chats.length-1]}attachKeydownListener(){const e=new Set(["PageUp","PageDown","Meta","Control"]);document.body.addEventListener("keydown",t=>{var s;const n=t.key;if(a.default.isOverlayActive||e.has(n))return;const o=t.target,r=this.chat;if("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===o.tagName){if(!t.altKey||"ArrowUp"!==n&&"ArrowDown"!==n){if("ArrowUp"===n){if(r.input.editMsgId||!r.input.isInputEmpty())return;{const e=i.a.getHistoryStorage(r.peerId,r.threadId).history.slice;if(e.isEnd(wn.a.Bottom)&&e.length){let s;for(const t of e){const e=r.getMessage(t);if((this.myId===r.peerId?e.fromId===this.myId:e.pFlags.out)&&i.a.canEditMessage(r.getMessage(t),"text")){s=t;break}}s&&(r.input.initMessageEditing(s),Object(c.a)(t))}}}else if("ArrowDown"===n)return}else{const e=i.a.dialogsStorage.getFolderDialogs(a.default.filterId,!0);let t;if(a.default.peerId){const s=e.findIndex(e=>e.peerId===a.default.peerId);if(-1!==s){t=e["ArrowUp"===n?s-1:s+1]}}else"ArrowDown"===n&&(t=e[0]);t&&this.setPeer(t.peerId)}if((null===(s=null==r?void 0:r.input)||void 0===s?void 0:s.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==o.tagName&&!o.hasAttribute("contenteditable")&&!pe.IS_TOUCH_SUPPORTED&&(!b.b.isMobile||1===this.tabId)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),Object(Sa.a)(r.input.messageInput);const e=new KeyboardEvent(t.type,t);r.input.messageInput.dispatchEvent(e)}}})}makeLink(e,t){return Object.assign({_:e},t)}processInternalLink(e){return vo(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case po.MESSAGE:{const t=e.post?v.a.generateMessageId(+e.post):void 0,s=e.comment?v.a.generateMessageId(+e.comment):void 0;this.openUsername(e.domain,t,void 0,s);break}case po.PRIVATE_POST:{const t=e.channel.toChatId(),s=t.toPeerId(!0);if(K.a.getChat(t).deleted)try{yield K.a.resolveChannel(t)}catch(e){throw rt({langPackKey:"LinkNotFound"}),e}const i=v.a.generateMessageId(+e.post),n=e.thread?v.a.generateMessageId(+e.thread):void 0;n?this.openThread(s,i,n):this.setInnerPeer(s,i);break}case po.STICKER_SET:new Ui({id:e.set}).show();break;case po.JOIN_CHAT:ct.a.invokeApi("messages.checkChatInvite",{hash:e.invite}).then(t=>{t.chat&&K.a.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new go(e.invite,t).show():this.setInnerPeer(t.chat.id.toPeerId(!0))},e=>{"INVITE_HASH_EXPIRED"===e.type&&ot(Object(x.i18n)("InviteExpired"))});break;default:this.log.warn("Not supported internal link:",e)}}))}addAnchorListener(e){window[(e.protocol?e.protocol+"_":"")+e.name]=t=>{Object(c.a)(null);const s=t.href;let i,n;e.noPathnameParams||(i=new URL(t.href).pathname.split("/").slice(1)),e.noUriParams||(n=this.parseUriParams(s));const a=e.callback({pathnameParams:i,uriParams:n},t);return void 0===a&&a}}parseUriParams(e,t=e.split("?")){const s={};return t[1]?(t[1].split("&").forEach(e=>{s[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])}),s):s}openUsername(e,t,s,i){return k.a.resolveUsername(e).then(e=>{const n="user"===e._?e.id.toPeerId():e.id.toPeerId(!0);return s?this.openThread(n,t,s):i?this.openComment(n,t,i):this.setInnerPeer(n,t)},e=>{"USERNAME_NOT_OCCUPIED"===e.type?rt({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&rt({langPackKey:"Alert.UserDoesntExists"})})}openThread(e,t,s){return i.a.wrapSingleMessage(e,s).then(()=>{const n=i.a.getMessageByPeer(e,s);return i.a.generateThreadServiceStartMessage(n),this.setInnerPeer(e,t,"discussion",s)})}openComment(e,t,s){return i.a.getDiscussionMessage(e,t).then(e=>this.openThread(e.peerId,s,e.mid))}setCurrentBackground(e=!1){const t=a.default.getTheme();if("image"===t.background.type||"default"===t.background.type&&t.background.slug){const s=C.AppStateManager.STATE_INIT.settings.themes.find(e=>e.name===t.name);if(!(t.background.blur===s.background.blur&&t.background.slug===s.background.slug))return this.getBackground(t.background.slug).then(t=>this.setBackground(t,e),()=>(t.background=Object(w.a)(s.background),this.setBackground("",!0)))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=he.a.cacheStorage.getFile("backgrounds/"+e).then(e=>URL.createObjectURL(e))}setBackground(e,t=!0){const s=this.chats.map(t=>t.setBackground(e));return s[s.length-1].then(()=>{t&&a.default.dispatchEvent("background_change")})}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,s=t.scrollable.scrollTop,i=e.peerId+(e.threadId?"_"+e.threadId:""),n=Cn.a.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!Object.keys(t.bubbles).length)delete n[i],this.log("deleted chat position");else{const e={mids:Object(w.e)(t.bubbles,"desc"),top:s};n[i]=e,this.log("saved chat position:",e)}Cn.a.set({chatPositions:n},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),s=Cn.a.getFromCache("chatPositions");return s&&s[t]}applyHighlightningColor(){let e;const t=a.default.getTheme();t.background.highlightningColor?(e=t.background.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",e)):document.documentElement.style.removeProperty("--message-highlightning-color"),!pe.IS_TOUCH_SUPPORTED&&e&&(a.default.themeColor=function(e){return Ai(e).slice(0,-2)}(e))}applyCurrentTheme(e,t,s){return this.applyHighlightningColor(),a.default.setTheme(),t&&(this.backgroundPromises[e]=Promise.resolve(t)),this.setCurrentBackground(void 0===s?!!e:s)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&uo([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),a.default.settings.animationsEnabled&&!1!==t&&Object(ks.b)(Object(En.a)(400),400);const s=Object(Ts.a)(this.prevTab);Object(Ts.a)(e)>s&&D.a.pushItem({type:"chat",onPop:e=>{this.setPeer(je.b,void 0,e),Object(Vs.a)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),pe.IS_TOUCH_SUPPORTED||this.attachDragAndDropListeners(),this.markupTooltip=new ro(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let s=!1;const i=(r,l)=>vo(this,void 0,void 0,(function*(){if(l===s)return;const c=r.dataTransfer.types,d=c.contains?c.contains("Files"):c.indexOf("Files")>=0,h=Ia();if(!d||!this.canDrag()&&!h)return void(n=0);const u=h?o:a,p=h?t:e;if(l&&!p.length){const e=yield Object(me.d)(r,!0),t=d&&!e.length,s=e.filter(e=>m.has(e)).length;this.log("drag files",e),h?(h.appendDrops(u),(e.length||t)&&p.push(new ho(u,{header:"Preview.Dragging.AddItems",headerArgs:[e.length],onDrop:e=>{i(e,!1),wo.log("drop",e),wo.onDocumentPaste(e,"document")}}))):((e.length||t)&&p.push(new ho(u,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{i(e,!1),wo.log("drop",e),wo.onDocumentPaste(e,"document")}})),(s||t)&&p.push(new ho(u,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{i(e,!1),wo.log("drop",e),wo.onDocumentPaste(e,"media")}})),this.chat.container.append(u))}Object(Yt.a)(u,"is-visible",l,200,()=>{l||(p.forEach(e=>{e.destroy()}),p.length=0)}),l?p.forEach(e=>{e.setPath()}):n=0,document.body.classList.toggle("is-dragging",l),s=l}));let n=0;document.body.addEventListener("dragenter",e=>{n++}),document.body.addEventListener("dragover",e=>{i(e,!0),Object(c.a)(e)}),document.body.addEventListener("dragleave",e=>{n--,0===n&&i(e,!1)});const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){var e;const t=null===(e=this.chat)||void 0===e?void 0:e.peerId;return!(!t||a.default.isOverlayActive||!i.a.canSendToPeer(t,this.chat.threadId,"send_media"))}selectTab(e,t){!1===t&&uo([un.sidebarEl,this.columnEl,Qt.sidebarEl]),document.body.classList.toggle("is-left-column-shown",0===e);const s=this.tabId;this.log("selectTab",e,s);let i=a.default.settings.animationsEnabled?Object(Fe.a)():Promise.resolve();if(-1!==s&&s!==e&&a.default.settings.animationsEnabled&&!1!==t){const e=100+(b.b.isMobile?250:200);i=Object(En.a)(e),Object(ks.b)(i,e)}return this.tabId=e,Object(Vs.a)(),b.b.isMobile&&2===s&&e<2&&document.body.classList.remove("is-right-column-shown"),-1!==s&&e>s&&(e<2||!D.a.findItemByType("im"))&&D.a.pushItem({type:"im",onPop:e=>{this.setPeer(je.b,void 0,e)}}),a.default.dispatchEvent("im_tab_change",e),i}updateStatus(){return this.myId?(k.a.setUserStatus(this.myId,this.offline),ct.a.invokeApiSingle("account.updateStatus",{offline:this.offline})):Promise.resolve()}createNewChat(){const e=new ao(this,K.a,E.a,Gn,i.a,o.a,r.a,n.default,hs,k.a,oo.a,Ye.a,ct.a,Mi.a,Xe.a,Cn.a,Ft.a,xn,v.a);this.chats.length&&e.backgroundEl.append(this.chat.backgroundEl.lastElementChild.cloneNode(!0)),this.chats.push(e)}spliceChats(e,t=!0,s,i){if(!(e>=this.chats.length)){this.chats.length>1&&t&&a.default.dispatchEvent("peer_changing",this.chat),i||(i=this.chats.splice(e,this.chats.length-e));for(let e=0;e1&&i.slice(0,-1).forEach(e=>{e.container.remove()}),this.chatsSelectTab(this.chat.container,s),t){a.default.dispatchEvent("peer_changed",this.chat.peerId);const e=Qt.getTab(io);e&&e.close();Qt.sharedMediaTab.setPeer(this.chat.peerId,this.chat.threadId)&&(Qt.sharedMediaTab.loadSidebarMedia(!0),Qt.sharedMediaTab.fillProfileElements())}i.forEach(e=>{e.beforeDestroy()}),setTimeout(()=>{i.forEach(e=>{e.destroy()})},350)}}setPeer(e,t,s){this.init&&(this.init(),this.init=null);const i=this.chat,n=this.chats.indexOf(i);if(e){if(n>0&&i.peerId&&i.peerId!==e){const s=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===e)return void this.spliceChats(0,!0,!0,s);{const i=this.setPeer(e,t);return this.spliceChats(0,!1,!1,s),i}}}else{if(n>0)return void this.spliceChats(n,void 0,s);if(b.b.activeScreen===b.a.medium)return void this.selectTab(+!this.tabId,s)}if(e===i.peerId&&b.b.activeScreen<=b.a.medium&&document.body.classList.contains("is-left-column-shown"))return this.selectTab(1,s),!1;if(e||b.b.activeScreen!==b.a.mobile){const n=i.setPeer(e,t),a=(null==n?void 0:n.cached)?n.promise:Promise.resolve();e&&a.then(()=>{setTimeout(()=>{setTimeout(()=>{this.chatsSelectTab(this.chat.container)},0),this.selectTab(1,s)},0)})}return e?void 0:(this.selectTab(0,s),!1)}setInnerPeer(e,t,s="chat",i){if(e===je.b||!e)return;const n=this.chats.findIndex(t=>t.peerId===e&&t.type===s);if(-1!==n)return this.spliceChats(n+1),this.setPeer(e,t);return this.chat.inited&&this.createNewChat(),s&&(this.chat.setType(s),i&&(this.chat.threadId=i)),this.setPeer(e,t)}openScheduled(e){this.setInnerPeer(e,void 0,"scheduled")}getTypingElement(e){const t=document.createElement("span");let s="peer-typing";switch(t.classList.add(s),t.dataset.action=e._,e._){case"sendMessageTypingAction":s+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=s+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":s+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":s+="-record";break;case"sendMessageChooseStickerAction":s+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=s+"-eye",t.append(e)}}return t.classList.add(s),t}getPeerTyping(e,t){if(!k.a.isBot(e)){const s=n.default.getPeerTypings(e);if(!s||!s.length)return;const i=s[0],a={private:{sendMessageTypingAction:"Peer.Activity.User.TypingText",sendMessageUploadAudioAction:"Peer.Activity.User.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.User.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.User.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.User.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.User.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.User.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.User.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.User.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.User.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.User.ChoosingSticker"},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"},multi:{sendMessageTypingAction:"Peer.Activity.Chat.Multi.TypingText1",sendMessageUploadAudioAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadDocumentAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadPhotoAction:"Peer.Activity.Chat.Multi.SendingPhoto1",sendMessageUploadVideoAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageUploadRoundAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageRecordVideoAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageRecordAudioAction:"Peer.Activity.Chat.Multi.RecordingAudio1",sendMessageRecordRoundAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageGamePlayAction:"Peer.Activity.Chat.Multi.PlayingGame1",sendMessageChooseStickerAction:"Peer.Activity.Chat.Multi.ChoosingSticker1"}},o=e.isUser()?a.private:s.length>1?a.multi:a.chat;let r=i.action;if(s.length>1){const e={};s.forEach(t=>{const s=t.action._;void 0===e[s]&&(e[s]=0),++e[s]}),Object.keys(e).length>1&&(r={_:"sendMessageTypingAction"})}const l=o[r._];if(!l)return;t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),"sendMessageChooseStickerAction"===r._&&t.classList.add("peer-typing-flex");let c,d=t.firstElementChild;d?d.dataset.action!==r._&&d.replaceWith(this.getTypingElement(r)):(d=this.getTypingElement(r),t.prepend(d)),e.isAnyChat()&&(c=[new wt.a({peerId:i.userId.toPeerId(!1),onlyFirstName:!0}).element,s.length-1]);const h=Object(x.i18n)(l,c);return h.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(h):t.append(h),t}}getPeerStatus(e){var t;return vo(this,void 0,void 0,(function*(){let s;if(e){if(e.isAnyChat()){let t=this.getPeerTyping(e);if(t)return t;const i=e.toChatId(),a=yield n.default.getChatFull(i);this.chat.log("chatInfo res:",a);const o=a.participants_count||a.participants&&a.participants.participants&&a.participants.participants.length||1;if(s=n.default.getChatMembersString(i),o<2)return s;const r=yield n.default.getOnlines(i);if(r>1){const e=document.createElement("span");e.append(...Object(x.join)([s,Object(x.i18n)("OnlineCount",[Object(M.d)(r)])],!1)),s=e}return s}{const i=k.a.getUser(e);if(a.default.myId===e)return;if(i){if(s=k.a.getUserStatusString(i.id),!k.a.isBot(e)){let n=this.getPeerTyping(e);if(n||"userStatusOnline"!==(null===(t=i.status)||void 0===t?void 0:t._)||(n=document.createElement("span"),n.classList.add("online"),n.append(s)),n)return n}return s}}}}))}setPeerStatus(e,t,s,i,n){s&&(t.innerHTML=i?"‎":"");const a=t.querySelector(".peer-typing-container");a&&this.getPeerTyping(e,a)||this.getPeerStatus(e).then(e=>{n()&&Object(T.a)(t,e||(i?"‎":""))})}setChoosingStickerTyping(e){i.a.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"})}};de.a&&(de.a.appImManager=wo);var So=wo;var Lo=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Eo extends B.a{constructor(e,t){super(!1),this.listLoader=e,this.author={},this.content={},this.buttons={},this.tempId=0,this.preloader=null,this.preloaderStreamable=null,this.isFirstOpen=!0,this.pageEl=document.getElementById("page-chats"),this.zoomElements={},this.zoomSwipeStartX=0,this.zoomSwipeStartY=0,this.zoomSwipeX=0,this.zoomSwipeY=0,this.setZoomValue=(e=this.zoomElements.rangeSelector.value)=>{1===e&&(this.zoomSwipeX=0,this.zoomSwipeY=0),this.moversContainer.style.transform=`matrix(${e}, 0, 0, ${e}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`,this.zoomElements.btnOut.classList.toggle("inactive",.5===e),this.zoomElements.btnIn.classList.toggle("inactive",4===e),this.toggleZoom(1!==e)},this.onClick=e=>{if(this.setMoverAnimationPromise)return;const t=e.target;if("A"===t.tagName)return;if(Object(c.a)(e),pe.IS_TOUCH_SUPPORTED)return this.highlightSwitchersTimeout?clearTimeout(this.highlightSwitchersTimeout):this.wholeDiv.classList.add("highlight-switchers"),void(this.highlightSwitchersTimeout=window.setTimeout(()=>{this.wholeDiv.classList.remove("highlight-switchers"),this.highlightSwitchersTimeout=0},3e3));const s=this.isZooming();let i=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];s&&n.push("media-viewer-movers"),n.find(e=>{try{if(i=Object(Ce.a)(t,e),i)return!0}catch(e){return!1}}),i&&(s||"IMG"!==t.tagName&&"image"!==t.tagName)||this.buttons.close.click()},this.onKeyDown=e=>{if(a.default.overlaysActive>1)return;const t=e.key;let s=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):s=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),s&&Object(c.a)(e)},this.onKeyUp=e=>{a.default.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(a.default.overlaysActive>1||Object(Ce.a)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&(Object(c.a)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.log=Object(X.b)("AMV"),this.preloader=new ye.a,this.preloaderStreamable=new ye.a({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new ee.a,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add("media-viewer-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const s=document.createElement("div");s.classList.add("media-viewer");const i=this.topbar=document.createElement("div");i.classList.add("media-viewer-topbar","media-viewer-appear");const n=document.createElement("div");n.classList.add("media-viewer-topbar-left"),this.buttons["mobile-close"]=H("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add("media-viewer-author","no-select");const o=document.createElement("div");this.author.avatarEl=new _o,this.author.avatarEl.classList.add("media-viewer-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add("media-viewer-name"),this.author.date=document.createElement("div"),this.author.date.classList.add("media-viewer-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const r=document.createElement("div");r.classList.add("media-viewer-buttons"),t.concat(["download","zoom","close"]).forEach(e=>{const t=H(e,{noRipple:!0});this.buttons[e]=t,r.append(t)}),this.buttons.zoom.classList.add("zoom-in"),this.zoomElements.container=document.createElement("div"),this.zoomElements.container.classList.add("zoom-container"),this.zoomElements.btnOut=H("zoomout",{noRipple:!0}),this.zoomElements.btnOut.addEventListener("click",()=>this.changeZoom(!1)),this.zoomElements.btnIn=H("zoomin",{noRipple:!0}),this.zoomElements.btnIn.addEventListener("click",()=>this.changeZoom(!0)),this.zoomElements.rangeSelector=new Se({step:.5,min:.5,max:4,withTransition:!0},1),this.zoomElements.rangeSelector.setListeners(),this.zoomElements.rangeSelector.setHandlers({onScrub:this.setZoomValue,onMouseUp:()=>this.setZoomValue()}),this.zoomElements.container.append(this.zoomElements.btnOut,this.zoomElements.rangeSelector.container,this.zoomElements.btnIn),this.wholeDiv.append(this.zoomElements.container),this.content.main=document.createElement("div"),this.content.main.classList.add("media-viewer-content"),this.content.container=document.createElement("div"),this.content.container.classList.add("media-viewer-container"),this.content.media=document.createElement("div"),this.content.media.classList.add("media-viewer-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),s.append(this.content.main),this.overlaysDiv.append(s),n.append(this.buttons["mobile-close"],this.author.container),i.append(n,r),this.buttons.prev=document.createElement("div"),this.buttons.prev.className="media-viewer-switcher media-viewer-switcher-left",this.buttons.prev.innerHTML='',this.buttons.next=document.createElement("div"),this.buttons.next.className="media-viewer-switcher media-viewer-switcher-right",this.buttons.next.innerHTML='',this.moversContainer=document.createElement("div"),this.moversContainer.classList.add("media-viewer-movers"),this.wholeDiv.append(this.overlaysDiv,this.buttons.prev,this.buttons.next,this.topbar,this.moversContainer),this.setNewMover()}get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}setListeners(){if(this.buttons.download.addEventListener("click",this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach(e=>{e.addEventListener("click",this.close.bind(this))}),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach(([e,t])=>{t.addEventListener("click",t=>{Object(c.a)(t),this.setMoverPromise||this.listLoader.go(e)})}),this.buttons.zoom.addEventListener("click",()=>{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)},pe.IS_TOUCH_SUPPORTED){new Nt({element:this.wholeDiv,onSwipe:(e,t)=>{if(Te.isFullScreen())return;if(Math.abs(e)/St.a.windowW>.2||e>125)return e<0?this.buttons.prev.click():this.buttons.next.click(),!0;return(Math.abs(t)/St.a.windowH>.2||t>125)&&(this.buttons.close.click(),!0)},verifyTouchTarget:e=>"INPUT"!==e.target.tagName&&!Object(Ce.a)(e.target,"media-viewer-caption")})}}toggleZoom(e){const t=this.isZooming();if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),t===e)return;void 0===e&&(e=!t),this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",e);const s=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(s),this.zoomElements.rangeSelector.setProgress(s),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const s=-1;this.zoomSwipeHandler=new Nt({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(i,n)=>{[i,n]=[i*s,n*s],this.zoomSwipeX+=i-e,this.zoomSwipeY+=n-t,[e,t]=[i,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(s)}else e||this.zoomSwipeHandler.removeListeners()}changeZoom(e){this.zoomElements.rangeSelector.addProgress(.5*(e?1:-1)),this.setZoomValue()}isZooming(){return this.zoomElements.container.classList.contains("is-visible")}setBtnMenuToggle(e){const t=Me({onlyMobile:!0},"bottom-left",e);this.topbar.append(t)}close(e){var t;if(e&&Object(c.a)(e),this.setMoverAnimationPromise)return Promise.reject();D.a.removeByType("media"),this.lazyLoadQueue.clear();const s=this.setMoverToTarget(null===(t=this.target)||void 0===t?void 0:t.element,!0).then(({onAnimationEnd:e})=>e);return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer=void 0,this.zoomSwipeHandler&&(this.zoomSwipeHandler.removeListeners(),this.zoomSwipeHandler=void 0),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),window.removeEventListener("wheel",this.onWheel,{capture:!0}),s.finally(()=>{this.wholeDiv.remove(),a.default.isOverlayActive=!1,I.a.checkAnimations(!1)}),s}setMoverToTarget(e,t=!1,s=0){return Lo(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const i=this.content.mover;t||(i.innerHTML="");const n=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(i);const o=0!==s,r=a.default.settings.animationsEnabled?o?350:200:0;let l,c;e&&(e instanceof _o||e.classList.contains("grid-item")?(l=e,c=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(l=Object(Ce.a)(e,"attachment"),c=l.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(l=Object(Ce.a)(e,"profile-avatars-container"),c=l.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==c.left&&(e=l=c=void 0))),e||(e=this.content.media),c||(l=e.parentElement,c=e.getBoundingClientRect());let d=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const s=function(e,t){const s=e.getBoundingClientRect(),i=t.getBoundingClientRect();let{top:n,bottom:a}=i;const o=t.querySelector(".sticky");if(o){n=o.getBoundingClientRect().bottom}if(s.top>=a||s.bottom<=n||s.right<=i.left||s.left>=i.right)return null;const r={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},l="visualViewport"in window?window.visualViewport:window,c=(l.width||l.innerWidth,l.height||l.innerHeight);return{rect:{top:s.topa&&a!==c?(r.bottom=!0,++r.vertical,a):s.bottom,left:0},overflow:r}}(l,Object(Ce.a)(l,"scrollable"));!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(d=!0):(l=(e=this.content.media).parentElement,c=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let u,p,m,g="";if(o?(u=1===s?St.a.windowW:-h.width,p=h.top):(u=c.left,p=c.top),g+=`translate3d(${u}px,${p}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(i.firstElementChild&&i.firstElementChild.classList.contains("media-viewer-aspecter")){m=i.firstElementChild;const e=m.querySelector(".ckin__player");if(e){const t=e.firstElementChild;m.append(t),e.remove()}m.style.cssText||(i.classList.remove("active"),this.setFullAspect(m,h,c),i.offsetLeft,i.classList.add("active"))}else m=document.createElement("div"),m.classList.add("media-viewer-aspecter"),i.prepend(m);m.style.cssText=`width: ${c.width}px; height: ${c.height}px; transform: scale3d(${h.width/c.width}, ${h.height/c.height}, 1);`}i.style.width=h.width+"px",i.style.height=h.height+"px";const b=c.width/h.width,v=c.height/h.height;o||(g+=`scale3d(${b},${v},1) `);let f=window.getComputedStyle(l).getPropertyValue("border-radius");const y=function(e){let t=e.split(" ");if(4!==t.length){t[0]||(t[0]="0px");for(let e=t.length;e<4;++e)t[e]=t[e%2]||t[0]||"0px"}return t}(f);if(f=y.map(e=>parseInt(e)/b+"px").join(" "),o||(i.style.borderRadius=f),t&&1!==n){const e=St.a.windowW/2-c.width/2,t=St.a.windowH/2-c.height/2,s=c.left-e,i=c.top-t;this.moversContainer.style.transform=`matrix(${b}, 0, 0, ${v}, ${s}, ${i})`}else i.style.transform=g;let w;d&&(i.style.opacity="0");const S=e.classList.contains("is-out"),L=this.setMoverAnimationPromise=Object(ae.a)(),E={onAnimationEnd:L},I=setTimeout(()=>{L.isFulfilled||L.isRejected||L.resolve()},1e3);if(L.finally(()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===L&&(this.setMoverAnimationPromise=null),clearTimeout(I)}),t)return e instanceof SVGSVGElement&&(w=i.querySelector("path"),w&&this.sizeTailPath(w,h,b,r,!1,S,f)),e.classList.contains("media-viewer-media")&&i.classList.add("hiding"),this.wholeDiv.classList.add("backwards"),setTimeout(()=>{this.wholeDiv.classList.remove("active")},0),setTimeout(()=>{i.style.borderRadius=f,i.firstElementChild&&(i.firstElementChild.style.borderRadius=f)},r/2),setTimeout(()=>{i.innerHTML="",i.classList.remove("moving","active","hiding"),i.style.cssText="display: none;",L.resolve()},r),i.classList.remove("opening"),E;{let t,s;if(e instanceof HTMLVideoElement){const t=Array.from(e.parentElement.querySelectorAll("img"));t.length&&(e=t.pop())}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const n=Array.from(e.querySelectorAll("img")).pop();n&&(t=new Image,s=n.src,i.append(t))}else if(e instanceof HTMLImageElement)t=new Image,s=e.src;else if(e instanceof HTMLVideoElement)t=document.createElement("video"),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,s=t+"-mv",{width:n,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+n),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${n} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,s)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,s));const r=o.firstElementChild,l=r.firstElementChild.firstElementChild;if(l instanceof SVGUseElement){let e,t=l.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,(e,t,s,i,o)=>`translate(${t=2!==(t=+t)?n-2/b:2/b}, ${a}) scale(${+i/b}, ${+o/v})`),l.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const s=f.split(" ").map(e=>parseInt(e));e=S?co(0,0,n-9/b,a,...s):co(9/b,0,n-9/b,a,...s),w.setAttributeNS(null,"d",e)}const c=o.lastElementChild;c.setAttributeNS(null,"width",""+h.width),c.setAttributeNS(null,"height",""+h.height),i.prepend(o)}m&&(m.style.borderRadius=f,t&&m.append(t)),t=i.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),m||(t.style.width=h.width+"px",t.style.height=h.height+"px"),s&&(yield Object(as.b)(t,s))),i.style.display="",Object(Fe.b)(()=>{i.classList.add(o?"moving":"active")})}return i.classList.add("opening"),yield Object(Fe.a)(),i.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,d&&(i.style.opacity=""),m&&this.setFullAspect(m,h,c),setTimeout(()=>{i.style.borderRadius="",i.firstElementChild&&(i.firstElementChild.style.borderRadius="")},0),i.dataset.timeout=""+setTimeout(()=>{i.classList.remove("moving","opening"),m&&(i.querySelector("video"),i.classList.remove("active"),m.style.cssText="",i.offsetLeft),i.classList.add("center","no-transition"),i.classList.add("active"),delete i.dataset.timeout,L.resolve()},r),w&&this.sizeTailPath(w,h,b,r,!0,S,f),E}))}setFullAspect(e,t,s){const i=t.width/t.height;let{width:n,height:a}=s;i>0?n=a*i:a=n*i,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,s,i,n,a,o){const r=Date.now(),{width:l,height:c}=t;i/=2;const d=o.split(" ").map(e=>parseInt(e)),h=()=>{const t=Date.now()-r;let o=i?t/i:1;o>1&&(o=1),n&&(o=1-o);const u=d.map(e=>e*o);let p;p=a?co(0,0,l-9/s*o,c,...u):co(9/s*o,0,l,c,...u),e.setAttributeNS(null,"d",p),t{const a=t?-i.width:s;return e.replace(n,a+"px")});e.style.transform=n,setTimeout(()=>{e.remove()},350)}setNewMover(){const e=document.createElement("div");if(e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover){this.content.mover.parentElement.append(e)}else this.moversContainer.append(e);return this.content.mover=e}updateMediaSource(e,t,s){const i=e.tagName.toLowerCase()===s?e:e.querySelector(s);if(i&&!Object(Ce.a)(e,"document")){if(Object(Ce.a)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===s)return void(t.classList.contains("manual")&&t.click());t.remove()}}Object(as.a)(i,t),i.classList.contains("thumbnail")&&i.parentElement.classList.contains("media-container-aspecter")&&i.classList.remove("thumbnail")}}setAuthorInfo(e,t){Object(T.a)(this.author.date,Object(oe.d)(t));const s=e.isPeerId();let i;s?i=new wt.a({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1}).element:(i=document.createElement("span"),i.innerHTML=J.b.wrapEmojiText(e),i.classList.add("peer-title")),Object(T.a)(this.author.nameEl,i);let n=this.author.avatarEl;this.author.avatarEl=n.cloneNode(),s?this.author.avatarEl.removeAttribute("peer-title"):this.author.avatarEl.setAttribute("peer-title",""+e),this.author.avatarEl.setAttribute("peer",""+(e||je.b)),n.parentElement.replaceChild(this.author.avatarEl,n)}_openMedia(e,t,s,i,n,o=!1,l=[],c=[],d){return Lo(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;this.setAuthorInfo(s,t);const h="document"===e._,u=h&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(l,c,o),window.appMediaViewer=this),this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length);const p=this.content.media,m=!n||n===p;m&&(n=p),this.target={element:n};const g=++this.tempId;p.firstElementChild&&(p.innerHTML="");if(0!==i)this.moveTheMover(this.content.mover,1===i),this.setNewMover();else{window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),pe.IS_TOUCH_SUPPORTED||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0});const e=document.getElementById("main-columns");this.pageEl.insertBefore(this.wholeDiv,e),this.wholeDiv.offsetLeft,this.wholeDiv.classList.add("active"),a.default.isOverlayActive=!0,I.a.checkAnimations(!0),re.IS_MOBILE_SAFARI||D.a.pushItem({type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}})}const v=this.content.mover,f=St.a.windowW;let y=0;const w=St.a.windowH;w<1e6&&!b.b.isMobile&&(y=120);const S=w-120-y;let L=Promise.resolve();const M=r.a.setAttachmentSize(e,p,f,S,!b.b.isMobile,void 0,!!(h&&e.w&&e.h)).photoSize;if(m){const t=he.a.getCacheContext(e,M.type);let s;if(t.downloaded)s=new Image,s.src=t.url;else{const i=r.a.getStrippedThumbIfNeeded(e,t,!0);i&&(L=i.loadPromise,s=i.image)}s&&(s.classList.add("thumbnail"),p.append(s))}const C=!(!h||!e.supportsStreaming),k=C?this.preloaderStreamable:this.preloader;let P;if(u){const t=d&&"gif"!==e.type,s=document.createElement("video"),a=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:i})=>{const a=v.firstElementChild&&v.firstElementChild.classList.contains("media-viewer-aspecter")?v.firstElementChild:v,o=v.querySelector("video");o&&o.remove(),s.setAttribute("playsinline","true"),s.addEventListener("timeupdate",()=>{this.tempId!==g&&s.pause()}),s.addEventListener("error",()=>{4!==s.error.code&&this.log.error("Error "+s.error.code+"; details: "+s.error.message),k&&k.detach()},{once:!0}),this.addEventListener("setMoverAfter",()=>{s.src="",s.load()},{once:!0}),re.IS_SAFARI&&(s.autoplay=!0),"gif"===e.type&&(s.muted=!0,s.autoplay=!0,s.loop=!0),a.append(s);const r=new Promise(e=>{s.addEventListener("canplay",e,{once:!0})}),l=()=>{"gif"!==e.type&&(s.dataset.ckin="default",s.dataset.overlay="1",Promise.all([r,i]).then(()=>{if(this.tempId!==g)return;(this.videoPlayer=new Te(s,!0,C)).addEventListener("toggleControls",e=>{this.wholeDiv.classList.toggle("has-video-controls",e)}),this.addEventListener("setMoverBefore",()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.removeListeners(),this.videoPlayer=void 0},{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1)}))};if(C){i.then(()=>{s.readyState{s.addEventListener("canplay",()=>{k.detach(),s.parentElement.classList.remove("is-buffering")},{once:!0})};s.addEventListener("waiting",()=>{const t=s.networkState===s.NETWORK_LOADING,i=s.readyState{const o=he.a.getCacheContext(e),r=C?Promise.resolve():E.a.downloadDoc(e);return C||i.then(()=>{o.url||k.attach(v,!0,r)}),Promise.all([r,i]).then(()=>{if(this.tempId!==g)return void this.log.warn("media viewer changed video");if(t){const e=fe.setSingleMedia(s,d);this.addEventListener("setMoverBefore",()=>{e()},{once:!0})}const e=o.url;n instanceof SVGSVGElement?a.firstElementChild.lastElementChild.append(s):Object(as.a)(s,e),this.updateMediaSource(n,e,"video"),l()}),r}})});P=L.then(a)}else{const t=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>{const s=he.a.getCacheContext(e,M.type),i=h?E.a.downloadDoc(e):r.a.preloadPhoto(e,M);return t.then(()=>{s.url||this.preloader.attachPromise(i)}),Promise.all([t,i]).then(()=>{var e;if(this.tempId!==g)return void this.log.warn("media viewer changed photo");const t=s.url;if(n instanceof SVGSVGElement){if(this.updateMediaSource(n,t,"img"),this.updateMediaSource(v,t,"img"),b.b.isMobile){const e=v.querySelectorAll("img");e&&e.length&&e.forEach(e=>{e.classList.remove("thumbnail")})}}else{const s=v.firstElementChild&&v.firstElementChild.classList.contains("media-viewer-aspecter")?v.firstElementChild:v,i="IMG"===(null===(e=s.firstElementChild)||void 0===e?void 0:e.tagName)?s.firstElementChild:null;if(!i||i.src!==t){let e=new Image;e.classList.add("thumbnail"),Object(as.a)(e,t,()=>{this.updateMediaSource(n,t,"img"),i&&Object(Fe.b)(()=>{i.remove()}),s.append(e)})}}}).catch(e=>{this.log.error(e),this.preloader.attach(v),this.preloader.setManual()}),i}})});P=L.then(t)}return this.setMoverPromise=P.catch(()=>{this.setMoverAnimationPromise=null}).finally(()=>{this.setMoverPromise=null})}))}}var Io=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Mo extends Eo{constructor(){let e;super(new L({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:s,peerId:n}=e,a=i.a.getMediaFromMessage(e);if(a&&(!t||Mo.isMediaCompatibleForDocumentViewer(a)))return{element:null,mid:s,peerId:n}}}),["delete","forward"]),this.onPrevClick=e=>{this.openMedia(this.getMessageByPeer(e.peerId,e.mid),e.element,-1)},this.onNextClick=e=>{this.openMedia(this.getMessageByPeer(e.peerId,e.mid),e.element,1)},this.onDeleteClick=()=>{const e=this.target;new Hs(e.peerId,[e.mid],"chat",()=>{this.target={element:this.content.media},this.close()})},this.onForwardClick=()=>{const e=this.target;e.mid&&new Us({[e.peerId]:[e.mid]},()=>this.close())},this.onAuthorClick=e=>{const{mid:t,peerId:s}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const i=this.searchContext.threadId,n=this.getMessageByPeer(s,t);this.close(e).then(()=>{if(b.b.isMobile){const e=Qt.getTab(Gt);e&&e.close()}So.setInnerPeer(n.peerId,t,i?"discussion":void 0,i)})}},this.onDownloadClick=()=>{const{peerId:e,mid:t}=this.target,s=this.getMessageByPeer(e,t);if(s.media.photo)r.a.savePhotoFile(s.media.photo,So.chat.bubbles.lazyLoadQueue.queueId);else{let e=null;e=s.media.webpage?s.media.webpage.document:s.media.document,e&&E.a.saveDocFile(e,So.chat.bubbles.lazyLoadQueue.queueId)}},this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add("media-viewer-caption");const t=()=>{e&&clearTimeout(e),e=window.setTimeout(()=>{e=void 0,this.content.caption.classList.remove("is-focused")},800)};this.content.caption.addEventListener("touchstart",()=>{b.b.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))});new P.b(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),Object(l.b)(this.buttons.delete,this.onDeleteClick);const s=[{icon:"forward",text:"Forward",onClick:this.onForwardClick},{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick}];this.setBtnMenuToggle(s),this.btnMenuDelete=s[s.length-1].element,this.setListeners()}get searchContext(){return this.listLoader.searchContext}setListeners(){super.setListeners(),this.buttons.forward.addEventListener("click",this.onForwardClick),this.author.container.addEventListener("click",this.onAuthorClick);const e=t=>{if(t.target instanceof HTMLAnchorElement){const s=t.target.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return Object(c.a)(t),this.close().then(()=>{this.content.caption.removeEventListener("click",e,{capture:!0}),t.target.click()}),!1}};this.content.caption.addEventListener("click",e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?i.a.getScheduledMessageByPeer(e,t):i.a.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let s="";t&&(s=J.b.wrapRichText(t,{entities:e.totalEntities})),g(this.content.caption.firstElementChild,s),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,s=0,n=!1,a=[],o=[]){const r=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return Io(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const l=e.mid,c=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,d=i.a.getMediaFromMessage(e);this.buttons.forward.classList.toggle("hide","messageService"===e._);const h=i.a.canDeleteMessage(e);[this.buttons.delete,this.btnMenuDelete].forEach(e=>{e.classList.toggle("hide",!h)}),this.setCaption(e);const u=r._openMedia.call(this,d,e.date,c,s,t,n,a,o,e);return this.target.mid=l,this.target.peerId=e.peerId,u}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||m.has(e.mime_type)}}class Co extends S{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,s)=>{if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const i=null==e?void 0:e.photoId;return r.a.getUserPhotos(this.peerId,i,s).then(e=>{const t=e.photos.map(e=>({element:null,photoId:e}));return{count:e.count,items:t}})}})),this.loadedAllUp=!0,this.peerId=e.peerId}}var ko=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Po extends Eo{constructor(e){super(new Co({peerId:e}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>{r.a.savePhotoFile(r.a.getPhoto(this.target.photoId),So.chat.bubbles.lazyLoadQueue.queueId)},this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,s=0,i,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return ko(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=r.a.getPhoto(e),l=a._openMedia.call(this,o,o.date,this.peerId,s,t,!1,i,n);return this.target.photoId=o.id,l}))}}var To=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const xo=e=>{d.a.removeFromAvatarsCache(e),Array.from(document.querySelectorAll('avatar-element[peer="'+e+'"]')).forEach(e=>{e.update()})};function Ao(e,t,s,a,o,l){return To(this,void 0,void 0,(function*(){let c=yield n.default.getFullPhoto(t);if(!s()||!c)return;const d=()=>Array.from(e.querySelectorAll("img")).find(e=>!e.classList.contains("emoji"))?e:null;if(t.isAnyChat()){const e=!!a,n="inputMessagesFilterChatPhotos";if(!a&&(a=yield i.a.getSearch({peerId:t,inputFilter:{_:n},maxId:0,limit:1}).then(e=>e.history[0]),!s()))return;if(a){a.action.photo.id!==c.id&&(e||(a=i.a.generateFakeAvatarMessage(t,c)));const s=e=>e.map(e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId}));return void(new Mo).setSearchContext({peerId:t,inputFilter:{_:n}}).openMedia(a,d(),void 0,void 0,o?s(o):void 0,l?s(l):void 0)}}if(c){Object(w.f)(a)||(c=r.a.getPhoto(a));const e=e=>e.map(e=>({element:e.element,photoId:e.item}));new Po(t).openMedia(c.id,d(),void 0,o?e(o):void 0,l?e(l):void 0)}}))}a.default.addEventListener("avatar_update",xo),a.default.addEventListener("peer_title_edit",e=>{d.a.isAvatarCached(e)||xo(e)});const Oo=new Map,Fo=new Set;class _o extends HTMLElement{constructor(){super(...arguments),this.isDialog=!1,this.addedToQueue=!1}connectedCallback(){if(this.isDialog="1"===this.getAttribute("dialog"),""===this.getAttribute("clickable")){this.setAttribute("clickable","set");let e=!1;Object(l.b)(this,t=>To(this,void 0,void 0,(function*(){if(Object(c.a)(t),e)return;const s=this.peerId;e=!0,yield Ao(this,this.peerId,()=>this.peerId===s),e=!1})))}}disconnectedCallback(){const e=Oo.get(this.peerId);e&&e.has(this)&&(e.delete(this),e.size||Oo.delete(this.peerId)),this.lazyLoadQueue&&this.lazyLoadQueue.unobserve(this)}static get observedAttributes(){return["peer","dialog","peer-title"]}attributeChangedCallback(e,t,s){if("peer"===e){const e=(s||"").toPeerId()||je.b;if(this.peerId===e)return;this.peerId=o.a.getPeerMigratedTo(e)||e;const i=(t||"").toPeerId()||je.b;if(i){const e=Oo.get(i);e&&(e.delete(this),e.size||Oo.delete(i))}this.update()}else"peer-title"===e?this.peerTitle=s:"dialog"===e&&(this.isDialog="1"===s)}r(e=!1){const t=d.a.putPhoto(this,this.peerId,this.isDialog,this.peerTitle,e),s=t?t.loadPromise:Promise.resolve();return this.loadPromises&&(t&&t.cached&&this.loadPromises.push(s),s.finally(()=>{this.loadPromises=void 0})),t}update(){if(this.lazyLoadQueue){if(!Fo.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;let e=Oo.get(this.peerId);return e||(e=new Set,Oo.set(this.peerId,e)),e.add(this),this.r(!0),void this.lazyLoadQueue.push({div:this,load:()=>(Fo.add(this.peerId),this.update())})}this.addedToQueue&&this.lazyLoadQueue.unobserve(this)}Fo.add(this.peerId);const e=this.r(),t=e?e.loadPromise:Promise.resolve();this.addedToQueue&&t.finally(()=>{this.addedToQueue=!1});const s=Oo.get(this.peerId);if(s){s.delete(this);const e=Array.from(s);Oo.delete(this.peerId);for(let t=0,s=e.length;t{let e=i.a.getDialogOnly(this.selectedId);e&&i.a.editPeerFolders([e.peerId],+!e.folder_id)},this.onPinClick=()=>{i.a.toggleDialogPin(this.selectedId,this.filterId).catch(e=>{"PINNED_DIALOGS_TOO_MUCH"===e.type&&(this.filterId>=1?rt({langPackKey:"PinFolderLimitReached"}):new pt("pinned-dialogs-too-much",{buttons:[{langKey:"OK",isCancel:!0},{langKey:"FiltersSetupPinAlert",callback:()=>{new $i(un).open()}}],descriptionLangKey:"PinToTopLimitReached2",descriptionLangArgs:[Object(x.i18n)("Chats",[a.default.config.pinned_dialogs_count_max])]}).show())})},this.onUnmuteClick=()=>{i.a.mutePeer(this.selectedId,!1)},this.onMuteClick=()=>{i.a.mutePeer(this.selectedId,!0)},this.onUnreadClick=()=>{const e=i.a.getDialogOnly(this.selectedId);e&&(e.unread_count?(i.a.readHistory(this.selectedId,e.top_message),i.a.markDialogUnread(this.selectedId,!0)):i.a.markDialogUnread(this.selectedId))},this.onDeleteClick=()=>{new xt(this.selectedId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=Object(bt.a)(e.target,"LI")}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),this.filterId=Vo.filterId,this.selectedId=t.dataset.peerId.toPeerId(),this.dialog=i.a.getDialogOnly(this.selectedId),this.buttons.forEach(e=>{const t=e.verify();e.element.classList.toggle("hide",!t)}),this.buttons[this.buttons.length-1].element.lastChild.replaceWith(Object(x.i18n)(o.a.getDeleteButtonText(this.selectedId))),t.classList.add("menu-open"),Object(te.e)(e,this.element),Object(te.d)(this.element,()=>{t.classList.remove("menu-open"),this.selectedId=this.dialog=this.filterId=void 0})}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>!i.a.isDialogUnread(this.dialog)},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>i.a.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>{var e;return!(this.filterId>1?i.a.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned))}},{icon:"unpin",text:"ChatList.Context.Unpin",onClick:this.onPinClick,verify:()=>{var e;return this.filterId>1?i.a.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>this.selectedId!==a.default.myId&&!Ft.a.isPeerLocalMuted(this.dialog.peerId)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>this.selectedId!==a.default.myId&&Ft.a.isPeerLocalMuted(this.dialog.peerId)},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.selectedId!==a.default.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.selectedId!==a.default.myId},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>!0}],this.element=Ee(this.buttons),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var Do,Bo;!function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(Do||(Do={}));class Ro{constructor(e){this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=()=>{rn.a.get("dc").then(e=>{e||(e=on.a.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const t=a.default.connectionStatus["NET-"+e],s=t&&t.status===Do.Connected;this.connecting&&s&&ei.a.forceGetDifference(),s&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=t&&t.status===Do.TimedOut,this.connecting=!s,this.retryAt=t&&t.retryAt,de.b&&this.log("connecting",this.connecting),this.setState()})},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,Object(T.a)(this.statusEl,Object(x.i18n)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{const e=Ro.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",()=>ct.a.forceReconnect());this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,s=()=>{const s=Date.now();e.innerText=""+Math.round((t-s)/1e3),s>t&&clearInterval(i)},i=setInterval(s,1e3);s();const n=this.getA("ConnectionStatus.Reconnect",()=>ct.a.forceReconnectTimeout());this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");de.b&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame(()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout);this.setStateTimeout=window.setTimeout(()=>{Object(Yt.a)(this.statusContainer,"is-shown",this.connecting||this.updating,200),this.setStateTimeout=0,de.b&&this.log("setState: isShown:",this.connecting||this.updating)},e)})},this.log=Object(X.b)("CS"),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=Object(U.a)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new ye.a({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),e.prepend(this.statusContainer),a.default.addEventListener("connection_status_change",e=>{const t=e;console.log(t),this.setConnectionStatus()}),a.default.addEventListener("state_synchronizing",e=>{e||(this.updating=!0,de.b&&this.log("updating",this.updating),this.setState())}),a.default.addEventListener("state_synchronized",e=>{const t=e;de.b&&this.log("state_synchronized",t),t||(this.updating=!1,de.b&&this.log("updating",this.updating),this.setState())}),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,Ro.CHANGE_STATE_DELAY+1e3)}getA(e,t){const s=document.createElement("a");return s.classList.add("force-reconnect"),s.append(Object(x.i18n)(e)),s.addEventListener("click",e=>{Object(c.a)(e),t()}),s}}Ro.CHANGE_STATE_DELAY=1e3,function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(Bo||(Bo={}));var Uo=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ho extends As{constructor(e,t,s){super({getIndex:e=>i.a.getDialogOnly(e)[this.indexKey],onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onSort:(e,t)=>{const s=e.dom.listEl.parentElement!==this.list;xs(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:(e,t)=>{const s=t?[]:void 0,{dom:i}=zo.addListDialog({dialog:e.id,loadPromises:s,isBatch:t});return e.dom=i,(null==s?void 0:s.length)&&(e.loadPromises=s,Promise.all(s).finally(()=>{delete e.loadPromises})),e},updateElementWith:Fe.c}),this.list=e,this.indexKey=t,this.onListLengthChange=s}clear(){this.list.innerHTML="",super.clear()}}class No{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.scroll=null,this.log=Object(X.b)("DIALOGS",X.a.Log|X.a.Error|X.a.Warn|X.a.Debug),this.contextMenu=new jo,this.sortedLists={},this.scrollables={},this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.offsets={top:0,bottom:0},this.initedListeners=!1,this.loadedDialogsAtLeastOnce=!1,this.onTabChange=()=>{this.scroll=this.scrollables[this.filterId],this.scroll.loadedAll.top=!0,this.scroll.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsPromise=void 0,this.sortedList=this.sortedLists[this.filterId],this.onChatsScroll()},this._onListLengthChange=()=>{if(!this.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId>0)return;const e=this.chatList,t=e.childElementCount,s=e.parentElement.parentElement,i=e.parentElement.nextElementSibling,n=!!i.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;s.classList.add("with-contacts");const a=new ln({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),k.a.getContactsPeerIds(void 0,void 0,"online").then(e=>{let t=!1;const s=()=>{t&&a.container.classList.toggle("hide",!i.list.childElementCount)},i=new Fs({avatarSize:42,new:!0,autonomous:!1,onListLengthChange:s});this.loadContacts=()=>{const t=St.a.windowH/60|0;e.splice(0,t).filter(this.verifyPeerIdForContacts).forEach(e=>{i.add(e)}),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>{if(e.isAnyChat())return;const t=this.verifyPeerIdForContacts(e),s=i.has(e);!s&&t?i.add(e):s&&!t&&i.delete(e)};const n=i.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,s()}),i.append(a.container)},this.verifyPeerIdForContacts=e=>e.isContact()&&!i.a.getDialogOnly(e),this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout(()=>{this.sliceTimeout=void 0,this.chatList.childElementCount&&!this.processContact&&Object(Fe.c)(()=>{const e=performance.now(),t=this.scroll.scrollTop,s=this.chatList.firstElementChild,i=this.scroll.container.getBoundingClientRect(),n=s.getBoundingClientRect(),a=Array.from(this.scroll.splitUp.children);let o=this.scroll.splitUp.offsetTop;o&&t{const t=e.dataset.peerId.toPeerId();this.deleteDialog(t)}),this.setOffsets(),this.scroll.scrollTop=c.offsetTop-h,this.log("slice time",performance.now()-e)})},200)},this.onChatsScrollTop=()=>{this.onChatsScroll("top")},this.onChatsScroll=(e="bottom")=>{if(!this.scroll.loadedAll[e])return this.loadDialogsPromise?this.loadDialogsPromise:(this.log("onChatsScroll",e),this.loadDialogs(e));this.loadContacts&&this.loadContacts()},this.chatsPreloader=Object(te.f)(null,!0),this.allUnreadCount=this.folders.menu.querySelector(".badge"),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=lt(this._onListLengthChange,100,!1,!0);const e=document.createElement("div");e.classList.add("connection-status-bottom"),e.append(this.folders.container),pe.IS_TOUCH_SUPPORTED&&Ds({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e>0?t+1:t-1)}}),this.setFilterId(0),this.addFilter({id:this.filterId,title:"",titleEl:Object(x.i18n)("ChatList.Filter.AllChats"),orderIndex:0}),this.sortedList=this.sortedLists[this.filterId],this.scroll=this.scrollables[this.filterId],a.default.addEventListener("state_cleared",()=>{C.default.getState().then(e=>{this.loadedDialogsAtLeastOnce=!1,k.a.clear(),K.a.clear();const t=i.a.filtersStorage.filters;for(const e in t)a.default.dispatchEvent("updateDialogFilter",{_:"updateDialogFilter",id:+e});i.a.clear(),this.sortedList.clear(),this.onTabChange(),this.onStateLoaded(e)})});const t=new P.a(this.folders.menuScrollContainer);e.prepend(this.folders.menuScrollContainer);const s=Object(Z.a)(this.folders.menu,this.folders.container,(e,t)=>{e=+t.dataset.filterId||0,this.filterId!==e&&(this.sortedLists[e].clear(),this.setFilterId(e),this.onTabChange())},()=>{for(const e in this.sortedLists)+e!==this.filterId&&this.sortedLists[e].clear()},void 0,t);this.folders.menu.firstElementChild.click(),i.a.construct(),C.default.getState().then(e=>this.onStateLoaded(e)),new Ro(this.chatsContainer),this.chatsContainer.append(e),setTimeout(()=>{le.b.loadLottieWorkers()},200)}get chatList(){return this.sortedList.list}setFilterId(e){this.filterId=e,this.indexKey=i.a.dialogsStorage?i.a.dialogsStorage.getDialogIndexKey(this.filterId):"index",a.default.filterId=e}initListeners(){a.default.addEventListener("user_update",e=>{var t;const s=e.toPeerId(),i=this.getDialogDom(s);if(i&&!k.a.isBot(e)&&s!==a.default.myId){const s="userStatusOnline"===(null===(t=k.a.getUser(e).status)||void 0===t?void 0:t._);i.avatarEl.classList.toggle("is-online",s)}}),a.default.addEventListener("folder_unread",e=>{this.setFilterUnreadCount(e.id)}),a.default.addEventListener("contacts_update",e=>{this.processContact&&this.processContact(e.toPeerId())}),a.default.addEventListener("dialog_flush",({peerId:e})=>{const t=i.a.getDialogOnly(e);t&&(this.setLastMessage(t,void 0,void 0,void 0,void 0,void 0,!0),this.validateDialogForFilter(t),this.setFiltersUnreadCount())}),a.default.addEventListener("dialogs_multiupdate",e=>{for(const t in e){const s=e[t];this.updateDialog(s),this.processContact&&this.processContact(t.toPeerId()),this.validateDialogForFilter(s)}}),a.default.addEventListener("dialog_drop",({peerId:e})=>{this.deleteDialog(e),this.processContact&&this.processContact(e)}),a.default.addEventListener("dialog_unread",({peerId:e})=>{const t=i.a.getDialogOnly(e);t&&(this.setUnreadMessages(t),this.validateDialogForFilter(t))}),a.default.addEventListener("dialog_notify_settings",e=>{this.setUnreadMessages(e),this.setFiltersUnreadCount()}),a.default.addEventListener("dialog_draft",({dialog:e,drop:t,peerId:s})=>{t?this.sortedList.delete(s):this.updateDialog(e),this.processContact&&this.processContact(s)}),a.default.addEventListener("peer_changed",e=>{for(const t of this.lastActiveElements)t.dataset.peerId.toPeerId()!==e&&(t.classList.remove("active"),this.lastActiveElements.delete(t));Array.from(document.querySelectorAll(`[data-autonomous="0"] li[data-peer-id="${e}"]`)).forEach(e=>{e.classList.add("active"),this.lastActiveElements.add(e)})}),a.default.addEventListener("filter_update",e=>{if(!this.filtersRendered[e.id])return void this.addFilter(e);if(e.id===this.filterId){const e=i.a.dialogsStorage.getCachedDialogs(!0);this.validateListForFilter();for(let t=0,s=e.length;t{const t=this.filtersRendered[e.id];t&&(this.folders.menu.firstElementChild.click(),t.container.remove(),t.menu.remove(),delete this.sortedLists[e.id],delete this.scrollables[e.id],delete this.filtersRendered[e.id],Object.keys(this.filtersRendered).length<=1&&this.folders.menuScrollContainer.classList.add("hide"))}),a.default.addEventListener("filter_order",e=>{const t=this.folders.menu;e.forEach(e=>{const s=i.a.filtersStorage.getFilter(e),n=this.filtersRendered[e];this.sortedLists[e].indexKey=i.a.dialogsStorage.getDialogIndexKey(e),xs(n.menu,t,s.orderIndex),xs(n.container,this.folders.container,s.orderIndex)}),this.indexKey=i.a.dialogsStorage.getDialogIndexKey(this.filterId)}),a.default.addEventListener("peer_typings",({peerId:e,typings:t})=>{const s=i.a.getDialogOnly(e);s&&(t.length?this.setTyping(s):this.unsetTyping(s))})}onStateLoaded(e){return Uo(this,void 0,void 0,(function*(){Ft.a.getNotifyPeerTypeSettings(),this.initedListeners||(this.initListeners(),this.initedListeners=!0);const t=i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.addFilter(t)});return e.filters&&Object.keys(e.filters).length&&(yield t,this.showFiltersPromise&&(yield this.showFiltersPromise)),C.default.storagesResults.dialogs.length&&Mi.a.addMissedDialogs(),this.onChatsScroll().then(()=>{i.a.fillConversations()})}))}getOffsetIndex(e){return{index:this.scroll.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){if(void 0!==e.migratedTo||!this.testDialogForFilter(e))return!1;const t=this.getOffsetIndex("top"),s=this.getOffsetIndex("bottom");if(!t.index&&!s.index)return!0;const i=e[this.indexKey];return(!t.index||i<=t.index)&&(!s.index||i>=s.index)}deleteDialog(e){this.sortedList.delete(e)}updateDialog(e){if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e.peerId);if(!this.sortedList.has(e.peerId))return void this.sortedList.add(e.peerId);const t=this.getDialogDom(e.peerId);t&&(this.setLastMessage(e,void 0,t,void 0,void 0,void 0,!0),this.sortedList.update(e.peerId))}setFilterUnreadCount(e){var t;const s=0===e?this.allUnreadCount:null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!s)return;const n=i.a.dialogsStorage.getFolder(e),a=0===e||!!n.dialogs.find(e=>(e.unread_count||e.pFlags.unread_mark)&&!Ft.a.isPeerLocalMuted(e.peerId,!0));s.classList.toggle("badge-gray",!a);const o=n.unreadDialogsCount;s.innerText=o?""+o:""}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e);this.setFilterUnreadCount(0)}validateListForFilter(){const e=i.a.filtersStorage.getFilter(this.filterId)||null;this.sortedList.getAll().forEach(t=>{const s=i.a.getDialogOnly(t.id);this.testDialogForFilter(s,e)||this.deleteDialog(t.id)})}validateDialogForFilter(e,t){this.getDialogDom(e.peerId)&&(this.testDialogForFilter(e,t)||this.deleteDialog(e.peerId))}testDialogForFilter(e,t=i.a.filtersStorage.getFilter(this.filterId)){return!(!e||t&&!i.a.filtersStorage.testDialogForFilter(e,t)||!t&&this.filterId!==e.folder_id)}generateScrollable(e,t){const s=new P.b(null,"CL",500);s.container.addEventListener("scroll",this.onChatsRegularScroll),s.container.dataset.filterId=""+t,s.onScrolledTop=this.onChatsScrollTop,s.onScrolledBottom=this.onChatsScroll,s.setVirtualContainer(e);const n=new Ho(e,i.a.dialogsStorage?i.a.dialogsStorage.getDialogIndexKey(t):"index",this.onListLengthChange);return this.scrollables[t]=s,this.sortedLists[t]=n,s}addFilter(e){if(this.filtersRendered[e.id])return;const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const s=document.createElement("span"),i=document.createElement("span");i.classList.add("text-super"),e.titleEl?i.append(e.titleEl):i.innerHTML=J.a.wrapEmojiText(e.title);const n=document.createElement("div");n.classList.add("badge","badge-20","badge-primary");const a=document.createElement("i");s.append(i,n,a),t.append(s),Object(se.ripple)(t);xs(t,this.folders.menu,e.orderIndex);const o=this.createChatList(),r=this.generateScrollable(o,e.id);r.container.classList.add("tabs-tab","chatlist-parts");const l=document.createElement("div");l.classList.add("chatlist-top");const c=document.createElement("div");c.classList.add("chatlist-bottom"),l.append(o),r.container.append(l,c);const d=r.container;xs(r.container,this.folders.container,e.orderIndex),this.setListClickListener(o,null,!0),this.filtersRendered[e.id]={menu:t,container:d,unread:n,title:i},!this.showFiltersPromise&&Object.keys(this.filtersRendered).length>1&&(this.showFiltersPromise=new Promise(e=>{window.setTimeout(()=>{this.showFiltersPromise=void 0,Object.keys(this.filtersRendered).length>1&&(this.folders.menuScrollContainer.classList.remove("hide"),this.setFiltersUnreadCount()),e()},0)}))}loadDialogs(e){if(this.loadDialogsPromise)return this.loadDialogsPromise;const t=new Promise(s=>Uo(this,void 0,void 0,(function*(){const{chatList:n,filterId:a,indexKey:o}=this;let r=St.a.windowH/72*1.25|0,l=0;const{index:c}=this.getOffsetIndex(e);if(c)if("top"===e){const e=i.a.dialogsStorage.getFolderDialogs(a,!0),t=e.findIndex(e=>e[o]<=c),s=Math.max(0,t-r);r=t-s,l=e[s][o]+1}else l=c;try{const s=i.a.getConversations("",l,r,a,!0);if(!s.cached&&!n.childElementCount){n.parentElement.append(this.chatsPreloader)}const c=yield s.promise;if(this.loadDialogsPromise!==t)return;if("bottom"===e?c.isEnd&&(this.scroll.loadedAll[e]=!0):c.isTopEnd&&(this.scroll.loadedAll[e]=!0),this.loadedDialogsAtLeastOnce=!0,c.dialogs.length){const t="top"===e?c.dialogs.slice().reverse():c.dialogs,s=[],n=[],a=e=>{n.push(e)};t.forEach(e=>{if(!i.a.getDialogOnly(e.peerId))return;const t=this.sortedList.add(e.peerId,!0,a,!1);t.loadPromises&&s.push(...t.loadPromises)}),yield Promise.all(s).finally(),n.forEach(e=>e())}else this.onListLengthChange();const d=c.dialogs["top"===e?0:c.dialogs.length-1];d&&(this.offsets[e]=d[o]),this.log.debug("getDialogs "+r+" dialogs by offset:",l,c,n.childElementCount),setTimeout(()=>{this.scroll.onScroll()},0)}catch(e){this.log.error(e)}this.chatsPreloader.parentElement&&this.chatsPreloader.remove(),s()}))).finally(()=>{this.loadDialogsPromise=void 0});return this.loadDialogsPromise=t}generateEmptyPlaceholder(e){const t="empty-placeholder",s=document.createElement("div");s.classList.add(t,t+"-"+e.classNameType);const i=document.createElement("div");i.classList.add(t+"-header"),Object(x._i18n)(i,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&Object(x._i18n)(n,e.subtitle,e.subtitleArgs),s.append(i,n),{container:s,header:i,subtitle:n}}checkIfPlaceholderNeeded(){if(1===this.filterId)return;const e=this.chatList,t=e.parentElement;let s=Array.from(t.children).find(e=>e.matches(".empty-placeholder"));const n=this.scroll.loadedAll.bottom&&!e.childElementCount;if(n&&s)return;if(!n)return void(s&&(t.classList.remove("with-placeholder"),s.remove()));let a;if(this.filterId){a=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:"folder"}),s=a.container,s.prepend(function({emoji:e,width:t,height:s}){const i=document.createElement("div"),n=hs.getAnimatedEmojiSticker(e);return n?Ls({doc:n,div:i,loop:!1,play:!0,width:t,height:s,emoji:e}).then(()=>{}):i.classList.add("media-sticker-wrapper"),{container:i}}({emoji:"📂",width:128,height:128}).container);const e=Object(U.a)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});Object(l.b)(e,()=>{new qi(un).open(i.a.filtersStorage.getFilter(this.filterId))}),s.append(e)}else{a=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:"dialogs"}),s=a.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),Promise.all([k.a.getContacts().then(e=>{let t,s;e.length?(t="ChatList.Main.EmptyPlaceholder.Subtitle",s=[Object(x.i18n)("Contacts.Count",[e.length])]):(t="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",s=[]);new x.default.IntlElement({key:t,args:s,element:a.subtitle})}),Object(as.b)(e,"assets/img/EmptyChats.svg"),Object(Fe.d)()]).then(()=>{s.classList.add("visible")}),s.prepend(e)}t.append(s),t.classList.add("with-placeholder")}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,s=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),s.innerHTML="",this.loadContacts=void 0,this.processContact=void 0}setOffsets(){const e=this.chatList,t=this.getDialogFromElement(e.firstElementChild),s=this.getDialogFromElement(e.lastElementChild),i=this.indexKey;this.offsets.top=t[i],this.offsets.bottom=s[i]}getDialogFromElement(e){return i.a.getDialogOnly(e.dataset.peerId.toPeerId())}setListClickListener(e,t,s=!1,n=!1,a=!1){let o;const r=(a?So.setInnerPeer:So.setPeer).bind(So);e.dataset.autonomous=""+ +n,e.addEventListener("mousedown",e=>{if(0!==e.button)return;this.log("dialogs click list");const s=e.target,i=Object(bt.a)(s,"LI");if(i){if(n){const e=o===i;o&&!e&&o.classList.remove("active"),i&&(i.classList.add("active"),o=i,this.lastActiveElements.add(i))}if(i){t&&t();const e=i.dataset.peerId.toPeerId(),s=+i.dataset.mid||void 0;r(e,s)}else r(je.b)}},{capture:!0}),de.b&&e.addEventListener("dblclick",e=>{const t=Object(bt.a)(e.target,"LI");if(t){const e=t.dataset.peerId.toPeerId();this.log("debug dialog:",i.a.getDialogByPeerId(e))}}),s&&Object(te.a)(e,this.contextMenu.onContextMenu)}createChatList(e={}){const t=document.createElement("ul");return t.classList.add("chatlist"),e.new&&t.classList.add("chatlist-new"),t}setLastMessage(e,t,s,n,l,c=!1,d=!1){if(!s&&!(s=this.getDialogDom(e.peerId)))return;let h;if(t||(e.draft&&"draftMessage"===e.draft._&&(h=e.draft),t=i.a.getMessageByPeer(e.peerId,e.top_message)),"messageEmpty"===t._)return s.lastMessageSpan.innerHTML="",s.lastTimeSpan.innerHTML="",delete s.listEl.dataset.mid,void(d&&this.setUnreadMessages(e,s,c));const u=e.peerId;{let e;if(!t.deleted&&!h){const s=i.a.getMediaFromMessage(t);if(s&&("photo"===s._||["video","gif"].includes(s.type))){const i=r.a.choosePhotoSize(s,20,20);if("photoSizeEmpty"!==i._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),ws({photo:s,message:t,container:e,withoutPreloader:!0,size:i,loadPromises:l}),"video"===s.type)){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}const c=!!e&&!!(null==t?void 0:t.message);let d;if(d=n&&t.message?i.a.wrapMessageForReply(t,void 0,void 0,!1,n,c):h?i.a.wrapMessageForReply(h):t.deleted?document.createDocumentFragment():i.a.wrapMessageForReply(t,void 0,void 0,!1,void 0,c),e&&d.prepend(e),Object(T.a)(s.lastMessageSpan,d),h){const e=document.createElement("b");e.classList.add("danger"),e.append(Object(x.i18n)("Draft"),": "),s.lastMessageSpan.prepend(e)}else if(u.isAnyChat()&&u!==t.fromId&&!t.action){const e=o.a.getPeer(t.fromId);if(e&&e.id){const i=document.createElement("b");e.id===a.default.myId?i.append(Object(x.i18n)("FromYou")):i.append(new wt.a({peerId:t.fromId,onlyFirstName:!0}).element),i.append(": "),s.lastMessageSpan.prepend(i)}}}if(!t.deleted||h){const e=h?Math.max(h.date,t.date||0):t.date;Object(T.a)(s.lastTimeSpan,Object(oe.c)(new Date(1e3*e)))}else s.lastTimeSpan.textContent="";null!==d&&(d?this.setUnreadMessages(e,s,c):s.listEl.dataset.mid=t.mid)}setUnreadMessages(e,t=this.getDialogDom(e.peerId),s=!1){var n;if(!t)return;if(!s){const s=Ft.a.isPeerLocalMuted(e.peerId,!0);s!==t.listEl.classList.contains("is-muted")&&Object(Yt.a)(t.listEl,"is-muted",s,200)}let o;if("draftMessage"!==(null===(n=e.draft)||void 0===n?void 0:n._)){const t=i.a.getMessageByPeer(e.peerId,e.top_message);!t.deleted&&t.pFlags.out&&t.peerId!==a.default.myId&&(o=t)}!function(e,t,s){let i;if((null==t?void 0:t.pFlags.out)&&(i=t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!i)return void(e.textContent="");const n="tgico-"+i,a=e.lastElementChild;if(a&&a.classList.contains(n))return;const o=document.createElement("i");o.classList.add("sending-status-icon",n),e.append(o),a&&a.remove()}(t.statusSpan,o);const r=i.a.filtersStorage.getFilter(this.filterId);let l;l=r?-1!==r.pinnedPeerIds.indexOf(e.peerId):!!e.pFlags.pinned;const c=i.a.isDialogUnread(e),d=l||c,h=Object(us.a)(t.unreadBadge);d&&!h&&t.subtitleEl.append(t.unreadBadge);const u=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),p=t.mentionsBadge&&Object(us.a)(t.mentionsBadge);u&&(t.mentionsBadge||(t.mentionsBadge=document.createElement("div"),t.mentionsBadge.className="dialog-subtitle-badge badge badge-24 mention mention-badge",t.mentionsBadge.innerText="@",t.subtitleEl.insertBefore(t.mentionsBadge,t.lastMessageSpan.nextSibling)));const m=s?0:200;if(Object(Yt.a)(t.unreadBadge,"is-visible",d,m,d?void 0:()=>{t.unreadBadge.remove()},h?0:2),t.mentionsBadge&&Object(Yt.a)(t.mentionsBadge,"is-visible",u,m,u?void 0:()=>{t.mentionsBadge.remove(),delete t.mentionsBadge},p?0:2),!d)return;l?t.unreadBadge.classList.add("tgico-chatspinned","tgico"):t.unreadBadge.classList.remove("tgico-chatspinned","tgico");let g=!0,b=!1;e.unread_mentions_count&&1===e.unread_count?(t.unreadBadge.innerText="@",b=!0):c?t.unreadBadge.innerText=""+(e.unread_count||" "):(t.unreadBadge.innerText="",g=!1),t.unreadBadge.classList.toggle("unread",g),t.unreadBadge.classList.toggle("mention",b)}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialog(e){if("object"!=typeof e&&e){const t=i.a.getDialogOnly(e);return t||{peerId:e,peer:o.a.getOutputPeer(e),pFlags:{}}}return e}addListDialog(e){const t=this.getDialog(e.dialog);e.autonomous=!1;const s=this.addDialogNew(e);if(s){Ft.a.isPeerLocalMuted(t.peerId,!0)&&s.dom.listEl.classList.add("is-muted"),this.setLastMessage(t,void 0,s.dom,void 0,e.loadPromises,e.isBatch,!0)}return s}addDialogNew(e){return this.addDialog(e.dialog,e.container,e.drawStatus,e.rippleEnabled,e.onlyFirstName,e.meAsSaved,e.append,e.avatarSize,e.autonomous,e.lazyLoadQueue,e.loadPromises)}addDialog(e,t,s=!0,i=!0,n=!1,r=!0,l=!0,c=54,d=!!t,h,u){var p,m;const g=this.getDialog(e),b=g.peerId,v=new _o;if(v.loadPromises=u,v.lazyLoadQueue=h,v.setAttribute("dialog",r?"1":"0"),v.setAttribute("peer",""+b),v.classList.add("dialog-avatar","avatar-"+c),s&&b!==a.default.myId&&b.isUser()){const e=k.a.getUser(b);e.status&&"userStatusOnline"===e.status._&&v.classList.add("is-online")}const f=document.createElement("div");f.classList.add("user-caption");const y=document.createElement("span");y.classList.add("user-title");const w=new wt.a({peerId:b,dialog:r,onlyFirstName:n,plainText:!1});y.append(w.element),y.classList.add("tgico");const S=o.a.getPeer(b);(null===(p=null==S?void 0:S.pFlags)||void 0===p?void 0:p.verified)&&y.append(Bt());const L=document.createElement("span");L.classList.add("user-last-message"),L.setAttribute("dir","auto");const E=document.createElement("li");i&&Object(se.ripple)(E),E.append(v,f),E.dataset.peerId=""+b;const I=document.createElement("span");I.classList.add("message-status","sending-status");const M=document.createElement("span");M.classList.add("message-time");const C=document.createElement("div");C.className="dialog-subtitle-badge badge badge-24";const P=document.createElement("p");P.classList.add("dialog-title");const T=document.createElement("span");T.classList.add("dialog-title-details"),T.append(I,M),P.append(y,T);const x=document.createElement("p");x.classList.add("dialog-subtitle"),x.append(L),f.append(P,x);const A={avatarEl:v,captionDiv:f,titleSpan:w.element,titleSpanContainer:y,statusSpan:I,lastTimeSpan:M,unreadBadge:C,lastMessageSpan:L,containerEl:E,listEl:E,subtitleEl:x};if(t){t[l?"append":"prepend"](E)}return d||(null===(m=So.chat)||void 0===m?void 0:m.peerId)!==b||(E.classList.add("active"),this.lastActiveElements.add(E)),{dom:A,dialog:g}}setTyping(e){const t=this.getDialogDom(e.peerId);if(!t)return;let s=t.lastMessageSpan.querySelector(".peer-typing-container");s?So.getPeerTyping(e.peerId,s):(s=So.getPeerTyping(e.peerId),Object(T.a)(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.setLastMessage(e,null,t,void 0,void 0,void 0,null))}}const zo=new No;de.a.appDialogsManager=zo;var Vo=t.default=zo},148:function(e,t,s){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function s(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,s),n.l=!0,n.exports}return s.m=e,s.c=t,s.d=function(e,t,i){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(s.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)s.d(i,n,function(t){return e[t]}.bind(null,n));return i},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="",s(s.s=0)}([function(e,t,s){"use strict";(function(t){var s=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return s&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],s=0;s{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,s)=>{var i=s=>{switch(s.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=s.data.samplePosition,e(s.data.page);break;case"done":this.encoder.removeEventListener("message",i),this.finish()}};this.encoder.addEventListener("message",i),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,s)=>{var i=s=>{"flushed"===s.data.message&&(t.removeEventListener("message",i),this.onpause(),e())};t.addEventListener("message",i),t.postMessage({command:"flush"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var s=i=>{"done"===i.data.message&&(e.removeEventListener("message",s),t())};e.addEventListener("message",s),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,s){return e.set(s,t),t+s.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,s(1))},function(e,t){var s;s=function(){return this}();try{s=s||new Function("return this")()}catch(e){"object"==typeof window&&(s=window)}e.exports=s}])},18:function(e,t,s){"use strict";s.r(t),s.d(t,"ripple",(function(){return l}));var i=s(6),n=s(58),a=s(1),o=s(15);let r=0;function l(e,t=(()=>Promise.resolve()),s=null,l=!1){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let c=document.createElement("div");c.classList.add("c-ripple");let d;e.classList.contains("rp-square")&&c.classList.add("is-square"),e[l?"prepend":"append"](c);const h=(e,i)=>{const o=Date.now(),l=document.createElement("div"),h=r++,u=1e3*+window.getComputedStyle(c).getPropertyValue("--ripple-duration").replace("s","");d=()=>{let e=Date.now()-o;const t=()=>{n.a.mutate(()=>{l.remove()}),s&&s(h)};if(el.classList.add("hiding"),Math.max(s-u/2,0)),setTimeout(t,s)}else l.classList.add("hiding"),setTimeout(t,u/2);a.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",d),d=null,p=!1},t&&t(h),window.requestAnimationFrame(()=>{const t=c.getBoundingClientRect();l.classList.add("c-ripple__circle");const s=e-t.left,n=i-t.top,a=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(s-t.width/2)+t.width/2,2)),o=s-a/2,r=n-a/2;l.style.width=l.style.height=a+"px",l.style.left=o+"px",l.style.top=r+"px",c.append(l)})},u=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==c);let p=!1;if(a.IS_TOUCH_SUPPORTED){let t=()=>{d&&d()};e.addEventListener("touchstart",s=>{if(!o.default.settings.animationsEnabled)return;if(s.touches.length>1||p||u(s))return;p=!0;let{clientX:i,clientY:n}=s.touches[0];h(i,n),e.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",s=>{s.cancelBubble=!0,s.stopPropagation(),t(),e.removeEventListener("touchend",t)},{once:!0})},{passive:!0})}else e.addEventListener("mousedown",t=>{if(![0,2].includes(t.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===e.dataset.ripple||u(t))return;if(p)return void(p=!1);let{clientX:s,clientY:i}=t;h(s,i),window.addEventListener("mouseup",d,{once:!0,passive:!0}),window.addEventListener("contextmenu",d,{once:!0,passive:!0})},{passive:!0})}},30:function(e,t,s){"use strict";s.d(t,"a",(function(){return a})),s.d(t,"b",(function(){return o})),s.d(t,"c",(function(){return r})),s.d(t,"d",(function(){return l}));var i=s(1),n=s(52);const a=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function o(e,t,s={}){const i=s.listenerSetter?s.listenerSetter.add(e):e.addEventListener.bind(e);s.touchMouseDown=!0,i(a,t,s)}function r(e,t,s){e.removeEventListener(a,t,s)}function l(e){Object(n.a)(e,a)}},33:function(e,t,s){"use strict";var i=s(16),n=s(18);t.a=(e,t={})=>{const s=document.createElement(t.asDiv?"div":"button");return s.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&s.classList.add("rp-square"),Object(n.ripple)(s)),t.onlyMobile&&s.classList.add("only-handhelds"),t.disabled&&s.setAttribute("disabled","true"),t.text&&s.append(Object(i.i18n)(t.text)),s}},35:function(e,t,s){"use strict";s.d(t,"f",(function(){return h})),s.d(t,"g",(function(){return u})),s.d(t,"c",(function(){return g})),s.d(t,"d",(function(){return y})),s.d(t,"e",(function(){return w})),s.d(t,"b",(function(){return E})),s.d(t,"a",(function(){return I}));var i=s(29),n=s(5),a=s(30),o=s(37),r=s(1),l=s(0),c=s(15),d=s(48);function h(e,t=!1){const s='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=s,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",s),e.lastElementChild}function u(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,h(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=h;let p=e=>{let t=b.getBoundingClientRect(),{clientX:s,clientY:i}=e,n=s>=t.right?s-t.right:t.left-s,a=i>=t.bottom?i-t.bottom:t.top-i;(n>=100||a>=100)&&g()};const m=e=>{g()},g=()=>{b&&(b.classList.remove("active"),b.parentElement.classList.remove("menu-open"),f&&f.remove(),b=null,c.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(a.a,m),l.IS_MOBILE_SAFARI||d.a.removeByType("menu")};window.addEventListener("resize",()=>{b&&g()});let b=null,v=null,f=null;function y(e,t){g(),l.IS_MOBILE_SAFARI||d.a.pushItem({type:"menu",onPop:e=>{g()}}),b=e,b.classList.add("active"),b.parentElement.classList.add("menu-open"),f||(f=document.createElement("div"),f.classList.add("btn-menu-overlay"),f.addEventListener(a.a,e=>{Object(n.a)(e),m()})),b.parentElement.insertBefore(f,b),v=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(a.a,m),c.default.dispatchEvent("context_menu_toggle",!0)}function w({pageX:e,pageY:t},s,i){let{scrollWidth:n,scrollHeight:a}=s;const r=document.body.getBoundingClientRect(),l=r.width,c=r.height;i=o.b.isMobile?"right":"left";let d="top";const h={x:{left:e,right:e-n},intermediateX:"right"===i?8:l-n-8,y:{top:t,bottom:t-a},intermediateY:t=8},p={top:h.y.top+a+8<=c,bottom:h.y.bottom-8>=8};{let e;e=u[i]?h.x[i]:(i="center",h.intermediateX),s.style.left=e+"px"}{let e;e=p[d]?h.y[d]:(d="center",h.intermediateY),s.style.top=e+"px"}s.className=s.className.replace(/(top|center|bottom)-(left|center|right)/g,""),s.classList.add(("center"===d?d:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let S=!1,L=0;function E(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,S=!1},400),S=!0}function I(e,t,s){const i=s?s.add(e):e.addEventListener.bind(e),a=s?s.removeManual.bind(s,e):e.removeEventListener.bind(e);if(l.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let s;const o={capture:!0},r=()=>{clearTimeout(s),a("touchmove",r,o),a("touchend",r,o),a("touchcancel",r,o)};i("touchstart",a=>{a.touches.length>1?r():(i("touchmove",r,o),i("touchend",r,o),i("touchcancel",r,o),s=window.setTimeout(()=>{S?r():(t(a.touches[0]),r(),b&&e.addEventListener("touchend",n.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?s=>{t(s),b&&e.addEventListener("touchend",n.a,{once:!0})}:t)}},48:function(e,t,s){"use strict";var i=s(29),n=s(0),a=s(43),o=s(7),r=s(5),l=s(44),c=s(71);const d=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(a.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const s=this.navigations.pop();s?(this.manual=!e,this.handleItem(s)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),n.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(c.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",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||Object(o.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const s=this.navigations[t];if(s.type===e)return{item:s,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return this.manual=!0,this.navigations.splice(t.index,1),void this.handleItem(t.item)}history.back()}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){Object(l.e)(this.navigations,e)}removeByType(e,t=!1){for(let s=this.navigations.length-1;s>=0;--s){if(this.navigations[s].type===e&&(this.navigations.splice(s,1),t))break}}};i.a.appNavigationController=d,t.a=d},52:function(e,t,s){"use strict";function i(e,t){const s=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(s)}s.d(t,"a",(function(){return i}))},58:function(e,t,s){"use strict";var i=s(41),n=s(45),a=s(29),o=s(60);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let s=this.promises[e];return s||(this.scheduleFlush(),s=this.promises[e]=Object(n.a)()),void 0!==t&&s.then(()=>t()),s}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const s=Object(o.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&s.then(()=>t()),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};a.a&&(a.a.sequentialDom=r),t.a=r},71:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(0);function n(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},78:function(e,t,s){"use strict";var i=s(29),n=s(32);const a=new class{getState(){return n.a.invokeApi("account.getPassword").then(e=>e)}updateSettings(e={}){return this.getState().then(t=>{let s,i;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};s=e.currentPassword?n.a.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=t.new_algo,r=new Uint8Array(o.salt1.length+32);return r.randomize(),r.set(o.salt1,0),o.salt1=r,i=e.newPassword?n.a.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([s,i]).then(e=>(a.password=e[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=e[1],n.a.invokeApi("account.updatePasswordSettings",a)))})}check(e,t,s={}){return n.a.invokeCrypto("computeSRP",e,t,!1).then(e=>n.a.invokeApi("auth.checkPassword",{password:e},s).then(e=>("auth.authorization"===e._&&n.a.setUser(e.user),e)))}confirmPasswordEmail(e){return n.a.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return n.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return n.a.invokeApi("account.cancelPasswordEmail")}};i.a.passwordManager=a,t.a=a},93:function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(5),n=s(38);class a extends n.b{constructor(e={}){super(Object.assign({plainText:!0},e)),this.passwordVisible=!1,this.onVisibilityClick=e=>{Object(i.a)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const t=this.input;t.type="password",t.setAttribute("required",""),t.autocomplete="off";const s=document.createElement("input");s.classList.add("stealthy"),s.tabIndex=-1,s.type="password",t.parentElement.prepend(s),t.parentElement.insertBefore(s.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}}}]); -//# sourceMappingURL=14.97bef6a6862c0bc097eb.chunk.js.map \ No newline at end of file diff --git a/public/14.97bef6a6862c0bc097eb.chunk.js.map b/public/14.97bef6a6862c0bc097eb.chunk.js.map deleted file mode 100644 index 9a38f0789..000000000 --- a/public/14.97bef6a6862c0bc097eb.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/monkeys/password.ts","webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/environment/mediaMimeTypesSupport.ts","webpack:///./src/helpers/dom/setInnerHTML.ts","webpack:///./src/helpers/filterChatPhotosMessages.ts","webpack:///./src/helpers/listLoader.ts","webpack:///./src/helpers/searchListLoader.ts","webpack:///./src/components/appSearch.ts","webpack:///./src/components/inputSearch.ts","webpack:///./src/components/buttonIcon.ts","webpack:///./src/components/sliderTab.ts","webpack:///./src/components/slider.ts","webpack:///./src/components/avatarEdit.ts","webpack:///./src/components/buttonCorner.ts","webpack:///./src/components/sidebarLeft/tabs/newGroup.ts","webpack:///./src/components/appMediaPlaybackController.ts","webpack:///./src/helpers/dom/attachGrabListeners.ts","webpack:///./src/components/rangeSelector.ts","webpack:///./src/components/buttonMenu.ts","webpack:///./src/components/buttonMenuToggle.ts","webpack:///./src/lib/mediaPlayer.ts","webpack:///./src/helpers/schedulers/throttleWithRaf.ts","webpack:///./src/helpers/schedulers/throttleWith.ts","webpack:///./src/components/audio.ts","webpack:///./src/components/divAndCaption.ts","webpack:///./src/components/chat/replyContainer.ts","webpack:///./src/components/groupedLayout.ts","webpack:///./src/components/editPeer.ts","webpack:///./src/components/radioForm.ts","webpack:///./src/components/row.ts","webpack:///./src/helpers/clipboard.ts","webpack:///./src/components/radioField.ts","webpack:///./src/components/toast.ts","webpack:///./src/helpers/schedulers/debounce.ts","webpack:///./src/components/usernameInputField.ts","webpack:///./src/components/popups/peer.ts","webpack:///./src/components/sidebarRight/tabs/chatType.ts","webpack:///./src/helpers/scrollableLoader.ts","webpack:///./src/components/appSelectPeers.ts","webpack:///./src/components/popups/pickUser.ts","webpack:///./src/components/sidebarRight/tabs/userPermissions.ts","webpack:///./src/components/sidebarRight/tabs/groupPermissions.ts","webpack:///./src/components/popups/deleteDialog.ts","webpack:///./src/components/sidebarRight/tabs/editChat.ts","webpack:///./src/components/sidebarRight/tabs/editContact.ts","webpack:///./src/components/sidebarLeft/tabs/addMembers.ts","webpack:///./src/environment/parallaxSupport.ts","webpack:///./src/components/generateVerifiedIcon.ts","webpack:///./src/components/swipeHandler.ts","webpack:///./src/components/peerProfileAvatars.ts","webpack:///./src/components/peerProfile.ts","webpack:///./src/components/sidebarRight/tabs/sharedMedia.ts","webpack:///./src/components/sidebarRight/index.ts","webpack:///./src/components/sidebarRight/tabs/pollResults.ts","webpack:///./src/components/poll.ts","webpack:///./src/lib/appManagers/appStickersManager.ts","webpack:///./src/components/wrappers.ts","webpack:///./src/helpers/dom/positionElementByIndex.ts","webpack:///./src/helpers/sortedList.ts","webpack:///./src/components/sortedUserList.ts","webpack:///./src/helpers/dom/handleHorizontalSwipe.ts","webpack:///./src/helpers/dom/handleTabSwipe.ts","webpack:///./src/components/popups/forward.ts","webpack:///./src/components/popups/deleteMessages.ts","webpack:///./src/components/popups/sendNow.ts","webpack:///./src/helpers/dom/cancelSelection.ts","webpack:///./src/components/chat/selection.ts","webpack:///./src/helpers/dom/getSelectedText.ts","webpack:///./src/components/appSearchSuper..ts","webpack:///./src/helpers/dom/lockTouchScroll.ts","webpack:///./src/lib/appManagers/appPrivacyManager.ts","webpack:///./src/components/privacySection.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack:///./src/helpers/dom/canFocus.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/email.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/index.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack:///./src/components/sidebarLeft/tabs/activeSessions.ts","webpack:///./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack:///./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack:///./src/helpers/color.ts","webpack:///./src/helpers/highlightningColor.ts","webpack:///./src/components/colorPicker.ts","webpack:///./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack:///./src/components/sidebarLeft/tabs/background.ts","webpack:///./src/helpers/averageColor.ts","webpack:///./src/components/popups/stickers.ts","webpack:///./src/components/sidebarLeft/tabs/generalSettings.ts","webpack:///./src/helpers/eachMinute.ts","webpack:///./src/components/sidebarLeft/tabs/editProfile.ts","webpack:///./src/components/sidebarLeft/tabs/includedChats.ts","webpack:///./src/components/sidebarLeft/tabs/editFolder.ts","webpack:///./src/components/sidebarLeft/tabs/chatFolders.ts","webpack:///./src/components/sidebarLeft/tabs/notifications.ts","webpack:///./src/components/sidebarLeft/tabs/language.ts","webpack:///./src/components/sidebarLeft/tabs/settings.ts","webpack:///./src/components/sidebarLeft/tabs/newChannel.ts","webpack:///./src/components/popups/createContact.ts","webpack:///./src/components/sidebarLeft/tabs/contacts.ts","webpack:///./src/components/sidebarLeft/tabs/archivedTab.ts","webpack:///./src/components/sidebarLeft/index.ts","webpack:///./src/components/chat/bubbleGroups.ts","webpack:///./src/components/popups/datePicker.ts","webpack:///./src/components/stickyIntersector.ts","webpack:///./src/components/chat/replies.ts","webpack:///./src/components/chat/messageRender.ts","webpack:///./src/helpers/dom/getElementByPoint.ts","webpack:///./src/helpers/dom/reflowScrollableElement.ts","webpack:///./src/lib/appManagers/appEmojiManager.ts","webpack:///./src/components/emoticonsDropdown/tabs/emoji.ts","webpack:///./src/components/gifsMasonry.ts","webpack:///./src/components/emoticonsDropdown/tabs/gifs.ts","webpack:///./src/components/emoticonsDropdown/tabs/stickers.ts","webpack:///./src/lib/appManagers/appInlineBotsManager.ts","webpack:///./src/components/sidebarRight/tabs/gifs.ts","webpack:///./src/components/sidebarRight/tabs/stickers.ts","webpack:///./src/helpers/dropdownHover.ts","webpack:///./src/components/emoticonsDropdown/index.ts","webpack:///./src/components/chat/bubbles.ts","webpack:///./src/lib/mtproto/constants.ts","webpack:///./src/components/popups/unpinMessage.ts","webpack:///./src/helpers/dom/isSelectionEmpty.ts","webpack:///./src/components/popups/reportMessagesConfirm.ts","webpack:///./src/components/popups/reportMessages.ts","webpack:///./src/components/chat/contextMenu.ts","webpack:///./src/components/chat/sendContextMenu.ts","webpack:///./src/components/popups/createPoll.ts","webpack:///./src/helpers/getGifDuration.ts","webpack:///./src/components/popups/newMedia.ts","webpack:///./src/helpers/dom/attachListNavigation.ts","webpack:///./src/components/chat/autocompleteHelper.ts","webpack:///./src/components/chat/stickersHelper.ts","webpack:///./src/components/popups/schedule.ts","webpack:///./src/helpers/dom/getRichValueWithCaret.ts","webpack:///./src/components/chat/emojiHelper.ts","webpack:///./src/components/chat/autocompletePeerHelper.ts","webpack:///./src/components/chat/commandsHelper.ts","webpack:///./src/components/chat/autocompleteHelperController.ts","webpack:///./src/components/chat/mentionsHelper.ts","webpack:///./src/components/chat/replyKeyboard.ts","webpack:///./src/components/chat/inlineHelper.ts","webpack:///./src/components/chat/input.ts","webpack:///./src/helpers/dom/setCaretAt.ts","webpack:///./src/components/chat/pinnedContainer.ts","webpack:///./src/components/chat/audio.ts","webpack:///./src/components/chat/pinnedMessageBorder.ts","webpack:///./src/components/chat/pinnedMessage.ts","webpack:///./src/helpers/dom/handleScrollSideEvent.ts","webpack:///./src/components/chat/topbar.ts","webpack:///./src/components/sidebarRight/tabs/search.ts","webpack:///./src/components/chat/search.ts","webpack:///./src/components/chat/chat.ts","webpack:///./src/components/chat/markupTooltip.ts","webpack:///./src/helpers/dom/getSelectedNodes.ts","webpack:///./src/helpers/generatePathData.ts","webpack:///./src/components/chat/dragAndDrop.ts","webpack:///./src/helpers/dom/disableTransition.ts","webpack:///./src/lib/appManagers/internalLink.ts","webpack:///./src/components/popups/joinChatInvite.ts","webpack:///./src/lib/appManagers/appImManager.ts","webpack:///./src/components/appMediaViewerBase.ts","webpack:///./src/helpers/dom/getVisibleRect.ts","webpack:///./src/helpers/fillPropertyValue.ts","webpack:///./src/components/appMediaViewer.ts","webpack:///./src/helpers/avatarListLoader.ts","webpack:///./src/components/appMediaViewerAvatar.ts","webpack:///./src/components/avatar.ts","webpack:///./src/components/dialogsContextMenu.ts","webpack:///./src/lib/mtproto/connectionStatus.ts","webpack:///./src/components/sendingStatus.ts","webpack:///./src/components/connectionStatus.ts","webpack:///./src/lib/appManagers/appDialogsManager.ts","webpack:///./public/recorder.min.js","webpack:///./src/components/ripple.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/components/passwordInputField.ts"],"names":["PasswordMonkey","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","loadPromise","loadAnimationFromURL","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","waitForFirstFrame","remove","TrackingMonkey","inputField","max","input","playAnimation","e","value","length","frame","Math","min","round","idleAnimation","stop","canvas","style","display","Promise","all","CodeInputField","options","super","plainText","type","setAttribute","autocomplete","lastLength","setLabel","replace","slice","setValueSilently","onFill","concat","Set","setInnerHTML","elem","html","innerHTML","filterChatPhotosMessages","history","message","idx","arr","action","photo","splice","undefined","count","previous","next","reverse","loadCount","loadWhenLeft","loadedAllUp","loadedAllDown","loadedAll","current","loadPromiseUp","loadPromiseDown","dispatchJump","items","item","pop","push","shift","unshift","load","onJump","older","resolve","anchor","promise","loadMore","result","forEach","bind","processed","processItem","onLoadedMore","backLimit","maxId","mid","incrementMessageId","getSearch","searchContext","peerId","limit","inputFilter","_","next_rate","nextRate","filterMids","onHistoryDelete","msgs","shouldBeDeleted","has","filter","onEmptied","onHistoryMultiappend","obj","folderId","mids","sorted","Array","from","sort","a","b","targets","map","Boolean","onMessageSent","rootScope","storage","isScheduled","getScheduledMessagesStorage","getMessagesStorage","filterMessagesByInputFilter","context","useSearch","reset","removeEventListener","name","clearable","className","clickable","autonomous","onFound","list","createChatList","nameEl","append","setListClickListener","childElementCount","setActive","clear","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","threadId","scrollable","i","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","window","setTimeout","focus","res","searchGroup","fromId","dialog","dom","addDialogNew","drawStatus","avatarSize","meAsSaved","listEl","dataset","setLastMessage","toggle","replaceContent","catch","err","console","error","placeholder","prevValue","timeout","onInput","clearTimeout","onClearClick","onClear","searchIcon","clearBtn","icon","slider","destroyable","_constructor","header","closeBtn","noRipple","title","content","addTab","listenerSetter","closeTab","args","init","selectTab","tabs","delete","removeAll","key","eventListener","dispatchEvent","cleanup","onCloseAfterTimeout","historyTabIds","canHideFirst","onCloseBtnClick","appNavigationController","findItemByType","navigationType","back","id","animate","isNavigation","closingId","onCloseTab","tab","_selectTab","Map","tabsContainer","sidebarEl","querySelector","querySelectorAll","el","get","onOpen","onOpenAfterTimeout","pushItem","onPop","canAnimate","tabConstructor","preserveTab","removeTabFromHistory","find","t","getTab","removeByType","onClose","parentElement","open","getContext","clearRect","uploadAvatar","setTitle","avatarEdit","_upload","inputWrapper","groupNameInputField","label","maxLength","nextBtn","contains","disabled","createChat","peerIds","toUserId","chatId","inputFile","editPhoto","chatsContainer","userId","rippleEnabled","lastMessageSpan","getUserStatusString","textContent","SHOULD_USE_SAFARI_FIX","navigator","userAgent","match","appMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","_volume","_muted","_playbackRate","seekBackward","details","playingMedia","currentTime","seekOffset","seekForward","duration","seekTo","seekTime","onMediaDocumentLoad","doc","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","appDownloadManager","getCacheContext","src","url","set","onPlay","target","getMessageByMedia","verify","element","listLoader","jumpLength","findIndex","go","setTargets","setMedia","getMediaFromMessage","onPause","onEnded","isTrusted","paused","clean","s","playItem","getMedia","resolveWaitingForLoadMedia","lockedSwitchers","cssText","body","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","setActionHandler","warn","properties","_key","dispatchPlaybackParams","Object","defineProperties","volume","muted","playbackRate","autoload","pFlags","is_scheduled","media_unread","myId","readMessages","once","deferred","w","waitingStorage","downloadDoc","safariBuffering","artwork","isVoice","artist","thumbs","bytes","sizes","h","preloadPhoto","setNewMediadata","peerPhoto","getPeerPhoto","appAvatarsManager","loadAvatar","cached","getPeerTitle","format","attribute","attributes","file_name","performer","metadata","MediaMetadata","getScheduledMessageByPeer","getMessageByPeer","willBePlayedMedia","prev","addMedia","setSearchContext","wasPlaying","willBePlayed","toggleSwitchers","enabled","attachGrabListeners","onStart","onMove","onEnd","onMouseMove","event","x","pageX","y","pageY","onMouseUp","onMouseDown","button","onTouchMove","preventDefault","touches","clientX","clientY","isTouch","onTouchEnd","onTouchStart","passive","mousedown","events","withTransition","useTransform","vertical","scrub","rect","getBoundingClientRect","seek","setFilled","onScrub","filled","step","setProgress","stepStr","index","indexOf","decimals","_removeListeners","percents","transform","rectMax","offsetAxisValue","bottom","left","toFixed","ButtonMenuItem","text","onClick","checkboxField","noCheckboxClickListener","ripple","textElement","regularText","keepOpen","cancelEvent","checked","buttons","ButtonMenuToggleHandler","openedMenu","asDiv","btnMenu","streamable","progressRAF","onLoadedData","r","requestAnimationFrame","cancelAnimationFrame","setLoadProgress","onTimeUpdate","onProgress","removeListeners","filledLoad","prepend","setSeekMax","setListeners","setHandlers","scrubTime","isSafariBuffering","buf","buffered","numRanges","nearestStart","end","start","onMuteClick","setVolume","d","volumeSvg","btn","firstElementChild","video","showControlsTimeout","hideControls","isShown","wrapper","controlsLocked","showControls","setHideTimeout","toggleControls","show","onFullScreen","webkitFullscreenElement","parentNode","insertBefore","appendChild","skin","stylePlayer","controls","progress","finally","initDuration","player","buildControls","timeDuration","insertAdjacentHTML","fullScreenButton","timeElapsed","String","toHHMMSS","volumeSelector","leftControls","togglePlay","findUpClassName","relatedTarget","overlaysActive","code","good","toggleFullScreen","altKey","split","eventName","visible","rate","settingsButton","fullscreenElement","mozFullScreenElement","msFullscreenElement","webkitEnterFullscreen","enterFullscreen","isFullScreen","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","throttleWithRaf","fn","schedulerFn","waiting","_args","throttleWith","wrapVoiceMessage","audioEl","out","barHeightMax","mediaSizes","isMobile","minW","maxW","availW","svg","createElementNS","setAttributeNS","timeDiv","waveform","Uint8Array","valueCount","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","rects","children","audio","lastIndex","ceil","node","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","offsetX","MouseEvent","targetTouches","noop","constructDownloadPreloader","tryAgainOnFail","preloader","cancelable","construct","circle","totalLength","attr","findMediaTargets","isBubbles","justAudioSelector","selectors","matches","prefix","selector","join","elements","mediaItems","toPeerId","HTMLElement","withTime","voiceAsMusic","showSender","isRealVoice","isOutgoing","is_outgoing","uploading","durationStr","downloadDiv","onTypeLoad","descriptionEl","parts","audioPerformer","htmlToSpan","date","wrapSenderToPeer","titleEl","middleEllipsisEl","fontWeight","audioTitle","fileName","wrapSentTime","subtitleDiv","launched","progressLine","lastChild","replaceWith","wrapAudio","audioTimeDiv","onLoad","readyState","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","innerText","hadSearchContext","imgs","wrapped","wrapPhoto","boxWidth","boxHeight","loadPromises","withoutPreloader","lazyLoadQueue","images","thumb","full","img","attach","noAutoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","reject","playListener","download","setDownloadFunction","capture","isConnected","customElements","define","DivAndCaption","fill","border","subtitle","wrapReplyDivAndCaption","subtitleEl","mediaEl","wrapEmojiText","isRound","mediaChildren","middleware","wrapMessageForReply","webpage","chat","bubbles","getMiddleware","wrapSticker","div","group","CHAT_ANIMATION_GROUP","choosePhotoSize","noBlur","child","isMediaSet","RectPart","maxWidth","minWidth","spacing","maxHeight","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","sides","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","ratio","cropRatios","attempts","multiHeight","offset","sum","pushAttempt","lineCounts","heights","first","second","third","fourth","optimalAttempt","optimalDiff","attempt","counts","lineCount","totalHeight","minLineHeight","bad1","bad2","line","diff","abs","optimalCounts","optimalHeights","rowCount","row","colCount","lineHeight","col","_disabled","isChanged","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","toggleAttribute","withoutAvatar","avatarElem","doNotEditAvatar","unlockOnSuccess","RadioForm","radios","form","freezed","radioField","subtitleLangKey","subtitleLangArgs","havePadding","isToggle","titleRight","noCheckboxSubtitle","titleLangKey","c","navigationTab","RadioFormFromRows","rows","copyTextToClipboard","clipboard","writeText","textArea","top","position","select","execCommand","removeChild","fallbackCopyTextToClipboard","stateKey","appStateManager","getState","state","setByKey","main","langKey","Event","toastEl","toast","toastNew","langPackKey","debounce","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","_resolve","_reject","checkUsernameDebounced","checkUsername","getValue","originalValue","setState","Neutral","isUsernameValid","setError","invalidText","head","username","checkUsernamePromise","invokeApi","channel","getChannelInput","toChatId","available","Valid","availableText","takenText","isValidToChange","overlayClosable","avatarEl","noTitle","titleLangArgs","fragment","createDocumentFragment","descriptionLangKey","description","p","descriptionLangArgs","checkboxes","o","withRipple","callback","original","nextElementSibling","isBroadcast","section","random","privateRow","publicRow","privateSection","publicSection","getChat","linkRow","chatFull","exported_invite","link","btnRevoke","toggleDisability","getChatInviteLink","caption","noDelimiter","changed","linkInputField","applyBtn","migrateChat","channelId","updateUsername","close","setOriginalValue","loading","loaded","getPromise","checkForTriggers","selected","offsetIndex","loadedWhat","renderedPeerIds","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","includes","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","splitUp","notRendered","filterPeerTypeBy","isPeerId","getPeer","deleted","method","topContainer","selectedContainer","selectedScrollable","delimiter","li","click","findUpAttribute","checkbox","debouncedInput","appendTo","getResultsPromise","onFirstRender","testSelfSearch","dialogs","archived","pageCount","windowSize","windowH","tempId","getTempId","getConversations","newOffsetIndex","findAndSplice","chatRightsAction","filterByRights","renderSaved","isEnd","getMoreDialogs","contacts","getMoreContacts","isUser","canSendToUser","hasRights","isGlobalSearch","getContactsPeerIds","searchContacts","searchResult","resultPeerIds","my_results","results","channelParticipants","getChannelParticipants","q","participants","participant","getParticipantPeerId","promises","getMoreChannelParticipants","isNonContactUser","containerEl","isAnyChat","getChatMembersString","scroll","insertAdjacentElement","scrollIntoViewNew","offsetWidth","onAnimationEnd","settings","animationsEnabled","values","Static","closable","getSelected","onSelect","hide","peerTypes","destroyListener","new","rights","takeOut","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","btnDelete","kickFromChannel","v","flags","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","combineParticipantBannedRights","info","mainFlag","restriction","until_date","flag","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","generateContentElement","findUpTag","setSubtitle","bannedRights","cantWhat","getPeerId","peer","update","needAdd","new_participant","view_messages","user_id","prev_participant","exceptionsCount","setLength","loader","setLoader","isChannel","migrateFrom","migrateTo","onScroll","getDialogType","peerTitleElement","callbackLeave","flush","leave","flushHistory","callbackDelete","descriptionArgs","deleteChannel","isDanger","textArgs","getChatFull","chatUpdateListeners","addChatUpdateListener","chatNameInputField","descriptionInputField","about","editPeer","chatTypeRow","setChatTypeSubtitle","permissionsRow","setPermissionsLength","reduce","acc","editTitle","editAbout","race","removeAttribute","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","onChatUpdate","hidden_prehistory","_init","isNew","isContact","nameInputField","lastNameInputField","user","getUser","setDraftValue","first_name","last_name","notificationsCheckboxField","mutePeer","isMuted","notify_settings","profileNameDiv","profileSubtitleDiv","phoneRow","phone","formatUserPhone","notificationsRow","isPeerLocalMuted","addContact","deleteContacts","sel","skippable","attachToPromise","removeLoader","ret","isPrivacy","selectedPeerIds","addInitial","generateVerifiedIcon","use","use2","getEvent","attachGlobalListenerTo","RESET_GLOBAL","cursor","listenerOptions","hadMove","xDown","yDown","handleMove","onReset","handleStart","_e","verifyTouchTarget","xUp","yUp","xDiff","yDiff","setProperty","onFirstSwipe","onSwipeResult","onSwipe","loadCallbacks","photoId","avatar","BASE_CLASS","getPhoto","Image","draggable","loadCallback","putAvatar","avatars","intersectionObserver","observe","gradient","arrowPrevious","arrowNext","checkScrollTop","scrollTop","freeze","clickX","prevTargets","nextTargets","openAvatarViewer","toRight","right","distance","offsetLeft","cancelNextClick","lastDiffX","minX","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","IntersectionObserver","entries","entry","isIntersecting","loadNearestToTarget","getUserPhotos","photos","Number","MAX_SAFE_INTEGER","m","chat_photo","generateFakeAvatarMessage","activeTab","photo_id","unobserve","setText","setPeerStatus","needClear","bio","tagName","getProfileByPeerId","notifications","generateDelimiter","setBio","self","setPeerStatusInterval","setInterval","setBioTimeout","oldAvatars","setPeer","cleaned","cleanupHTML","setAvatar","getPeerUsername","verified","override","getProfile","userFull","rAbout","wrapRichText","canSetNext","historiesStorage","newCloseBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","editBtn","transitionLastItem","secondTitle","cloneNode","profile","onAdditionalScroll","searchSuper","nav","isSharedMedia","transition","cleanScrollPositions","isHeavyAnimationInProgress","toggleEditBtn","msgIdsByPeer","renderNewMessages","deleteDeletedMessages","mediaTabs","onChangeTab","mediaTab","btnAddMembers","showConfirmation","onError","inviteToChannel","addChatUser","filtered","filterMessagesByType","usedFromHistory","performSearchResult","selection","isSelecting","toggleByElement","canViewMembers","loadMutex","peerChanged","setQuery","historyStorage","fillProfileElements","single","justLoad","getElementById","isColumnProportionSet","to","medium","mobile","toggleSidebar","setColumnProportion","sharedMediaTab","proportion","scrollWidth","previousElementSibling","documentElement","enable","active","willChange","animationPromise","appSidebarRight","resultsDiv","poll","getPoll","quiz","rQuestion","voters","total_voters","roundPercents","hr","answer","answers","answerEl","answerTitle","answerPercents","minHeight","getVotes","option","votesList","votes","vote","showMore","lastElementChild","next_offset","down","lineTotalLength","minIndex","minRemainder","k","remainder","maxRemainder","pollElement","isClosed","closed","performResults","chosenIndexes","prevQuizHint","hideQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","setMaxLength","resizePolls","onHide","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","windowW","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","getTotalLength","pollId","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","strokeWidth","radius","circumference","PI","period","closeTime","serverTimeOffset","quizInterval","time","Date","now","timeLeft","color","stroke","strokeDashoffset","strokeDasharray","clearInterval","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","isTabExists","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","solution","solution_entities","toggleHint","textEl","entities","bubblesContainer","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","initQuizHint","timeEl","setResults","recent_voters","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","cb","getPercentValue","iterate","fullTime","times","votersCount","multiplier","getStickerSetPromises","getStickersByEmoticonsPromises","getAnimatedEmojiStickerSet","addMultipleEventsListeners","updateNewStickerSet","saveStickerSet","stickerset","getGreetingStickersTimeout","getGreetingSticker","justPreload","getGreetingStickersPromise","getStickersByEmoticon","docs","greetingStickers","saveDoc","params","overwrite","cachedSet","documents","refreshTime","useCache","saveStickers","stickerSet","getStickerSetInput","saveById","getStickerSet","invokeApiHashable","stickers","emoji","getFromCache","pack","packs","emoticon","getAnimatedEmojiSticker","json","mediaSize","emojiSticker","toneIndex","lottieLoader","loadAnimationWorker","animationData","saveLottiePreview","newSet","assign","setToCache","needSave","installed_date","dcId","thumb_dc_id","isAnimated","animated","location","thumb_version","mimeType","access_hash","short_name","sets","covered","excludeFeatured","exclude_featured","foundSaved","cache","getCache","toLowerCase","cover","getAllStickers","allStickers","includeOurStickers","fixEmoji","preloadStickerSets","getRecentStickers","messagesStickers","installedSets","recentStickers","foundStickers","sticker","cachedStickersAnimated","cachedStickersStatic","iteratePacks","docEmoticon","stickerEmojiRaw","_doc","appStickersManager","roundVideoCircumference","wrapVideo","withTail","isOut","noInfo","onlyPreview","noPlayButton","isAlbumItem","canAutoplay","autoPlay","gifs","videos","spanTime","spanPlay","needPlayButton","mime_type","photoRes","divRound","halfSize","ctx","globalVideo","setPeerPromise","isInDOM","onPaused","onFrame","drawImage","detached","foreignObject","getAttributeNS","gotThumb","getThumb","poster","aspecter","isUpload","downloaded","attachMethod","renderDeferred","detach","isFulfilled","animationIntersector","addAnimation","loadPhotoThumbFunc","loadFunc","setManual","queueId","renderImageFromUrl","render","wrapDocument","audioElement","extSplitted","ext","isArray","docDiv","icoDiv","descriptionParts","nameDiv","_downloadDiv","save","saveDocFile","downloading","noThumb","noFadeIn","blurAfter","setAttachmentSize","regular","thumbImage","image","isFit","loadThumbPromise","isGif","photoSize","getStrippedThumbIfNeeded","needFadeIn","renderOnLoad","renderImageWithFadeIn","canAttachPreloader","renderPromise","sequentialDom","mutateElement","mutate","onlyThumb","withThumb","stickerType","loadLottieWorkers","haveThumbCached","stickerCachedThumbs","afterRender","getPathFromPhotoPathSize","stickerThumbConverted","getPreviewURLFromThumb","webpWorkerController","convert","getThumbURL","getAnimation","restart","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","needUpscale","blob","URL","createObjectURL","wrapReply","replyContainer","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","wrapAlbum","groupId","attachmentDiv","getMidsByAlbum","getMessage","album","positionElementByIndex","pos","prevPos","whichChild","updateElementWith","updateListWith","onSort","canUpdate","_updateList","batch","updateBatch","base","onElementCreate","noScheduler","onDelete","getIndex","onUpdate","getUserStatusForSort","onListLengthChange","status","willChangeLength","doTimeout","updateList","SORT_INTERVAL","handleHorizontalSwipe","cancelY","isSwipingBackSafari","handleTabSwipe","peerIdMids","overrideOnSelect","setInnerPeer","initMessagesForward","onConfirm","revoke","deleteScheduledMessages","deleteMessages","titleArgs","isMegagroup","canRevoke","sendScheduledMessages","cancelSelection","getSelection","empty","removeAllRanges","accumulateMapSet","selectedMids","onCancelSelection","toggleSelection","listenElement","selectedText","toString","createRange","verifyTouchLongPress","getElementFromTarget","getElementsBetween","last","firstRect","lastRect","isHigher","parent","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","targetLookupClassName","verifyTarget","seen","selecting","firstTarget","processElement","checkBetween","seenSet","isSelected","isMidSelected","seenLength","findUpAsChild","elementsBetween","toggleByMid","canceledSelection","verifyMouseMoveTarget","removeManual","documentListenerOptions","hasCheckbox","getCheckboxInputFromElement","isElementShouldBeSelected","appendCheckbox","forceSelection","cantForward","cantDelete","cantSend","appMessagesManager","getMessageFromStorage","canDeleteMessage","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","forwards","onToggleSelection","updateContainer","toggleElementCheckbox","unselect","config","forwarded_count_max","toggleMid","updateElementSelection","contentTab","selectionCountEl","selectionGotoBtn","selectionForwardBtn","selectionDeleteBtn","navScrollableContainer","selectionContainer","btnCancel","attachClickOptions","keys","fromPeerId","isPrivate","transitionElement","opacity","recording","bubble","canSelectBubble","isGroupedBubbleSelected","getMidsByMid","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","borderRadius","rowsWrapper","fakeSelectionWrapper","fakeRowsWrapper","fakeSelectionRect","fakeRowsRect","widthFrom","widthTo","scale","initTranslateX","br","selectionInputWrapper","selectionSendNowBtn","isGrouped","groupedCheckboxInput","attachTo","onGotoClick","onForwardClick","onSelectClick","onClearSelectionClick","onDeleteClick","onContextMenu","cancelBubble","withSelection","prevTabId","urlsToRevoke","nextRates","loadedChats","firstLoad","log","logger","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","onTransitionStart","onTransitionEnd","searchContextMenu","navScrollable","tabsMenu","menuTab","span","unlockScroll","prevId","lockers","lockTouchScroll","searchGroupMedia","horizontalMenu","tabContent","skipScroll","newMediaTab","fromMediaTab","offsetTop","scrollHeight","rect2","onMediaClick","targetClassName","copySearchContext","openMedia","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","lock","unlockAndRefresh","elemsToAppend","sharedMediaDiv","entity","totalEntities","display_url","sliced","matchUrl","same","hostname","rDescription","previewDiv","getAbbreviation","rTitle","subtitleFragment","htmlToDocumentFragment","HTMLAnchorElement","decodeURIComponent","href","firstChild","wrapPlainText","monthContainer","getMonthContainerByTimestamp","afterPerforming","inputMessagesFilterEmpty","showMembersCount","participants_count","regExp","RegExp","cleanSearchText","titleSpan","formatPhoneNumber","formatted","arg","globalContacts","isShort","minDate","renderRecentSearch","recent","recentSearch","getTopPeers","peers","people","onlyFirstName","renderParticipants","membersList","LOAD_COUNT","loadMembers","loadChats","logStr","used","slicedLength","ids","filters","counters","getSearchCounters","firstMediaTab","counter","membersTab","toLoad","loadType","timestamp","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","IntlDateElement","haveTimestamps","goFirst","revokeObjectURL","newInputFilter","maxDate","PrivacyType","appPrivacyManager","privacy","updatePrivacy","rules","inputKey","privacyRules","saveApiUsers","users","saveApiChats","chats","apiUpdatesManager","processLocalUpdate","inputRule","rule","privacyKey","types","allowPeers","disallowPeers","onRadioChange","captions","captionElement","radioSection","exceptions","Everybody","Nobody","radioRows","Contacts","skipTypes","noExceptions","generateSection","exceptionTexts","exception","_peerIds","newPeerIds","generateStr","splitPeersByType","getPrivacy","getPrivacyRulesDetails","setRadio","chatKey","usersKey","splitted","getUserInput","setPrivacy","phoneSection","nextSibling","stickerContainer","inputContent","btnReturn","sliceTabsUntilTab","canFocus","isFirstInput","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","disable","cancelPasswordEmail","resendPasswordEmail","onContinueClick","btnContinue","btnSkip","matchEmail","toggleButtons","updateSettings","hint","currentPassword","plainPassword","newPassword","symbols","isCancel","onSkipClick","saveHint","monkey","verifyInput","has_password","labelText","IntlElement","getStateInterval","_state","check","auth","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","Session","app_name","app_version","ip","country","date_active","date_created","hash","midtitle","device_model","system_version","platform","authorizations","session","btnTerminate","otherSection","privacyTab","updateActiveSessions","onTerminateClick","menuElement","btnAdd","toggleBlock","bot","blocked","getBlocked","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRow","email_unconfirmed_pattern","activeSessionsRow","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","updatePrivacyRow","disallowLength","allowLength","sensitive_can_change","sensitive_enabled","sensitiveRow","_enabled","deleteButton","clearAllDrafts","auths","rgbaToHsla","g","l","hslaToRgba","hue2rgb","hexaToRgba","hexa","parseInt","rgbaToHexa","rgba","hslaStringToHexa","hsla","alpha","val","endsWith","hslaStringToRgba","highlightningColor","hue","saturation","lightness","onGrabStart","boxDragger","onGrabEnd","box","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","hexaToHsla","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","rgbaArray","hex","hsl","getCurrentColor","maxX","maxY","posX","posY","lightnessX","lightnessY","_applyColor","updateColorPicker","colorPicker","background","theme","pushToState","applyCurrentTheme","onColorChange","applyColor","getTheme","grid","backgroundColor","throttle","uploadTempId","clicked","onUploadClick","file","dc_id","file_reference","wallpaper","slug","upload","addNotifyListener","_wallpaper","newDoc","newCacheContext","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","themes","blurCheckboxField","blur","onGridClick","saveToCache","fetch","response","cacheStorage","_tempId","onReady","imageUrl","naturalWidth","naturalHeight","pixel","pixels","getImageData","data","pixelsLength","outPixel","Uint8ClampedArray","averageColor","uploadButton","colorButton","resetButton","accountWallpapers","wallpapers","pattern","stickerSetInput","onStickersClick","fileId","sendMessageWithDocument","h6","setOnlyOnePlayableGroup","stickersDiv","stickersFooter","loadStickerSet","toggleStickerSet","esgSticker","initialValue","minValue","valueDiv","range","messagesTextSize","chatBackgroundButton","animationsCheckboxField","enterRow","ctrlEnterRow","formats","runFirst","_callback","run","getSeconds","eachMinute","str","toLocaleTimeString","hour","minute","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","gifsCheckboxField","videosCheckboxField","suggestCheckboxField","bigCheckboxField","loopCheckboxField","stickerSets","renderStickerSet","assumeType","firstNameInputField","bioInputField","usernameInputField","setProfileUrl","profileUrlContainer","profileUrlAnchor","updateProfile","uploadProfilePhoto","getSelf","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","cmp","pinnedPeerIds","pinned_peers","other","otherLegacy","getInputPeerById","editFolderTab","setFilter","filtersStorage","getDialogFilters","dialogsStorage","getFolderDialogs","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","non_contacts","groups","broadcasts","bots","chatsSection","selectedPeers","includePeerIds","excludePeerIds","addedInitial","_add","hasOwnProperty","originalFilter","deleteFolderButton","updateDialogFilter","bool","menuBtn","generateList","h2Text","categories","includedFlagsContainer","excludedFlagsContainer","include","include_peers","createDialogFilter","editCheckForChange","loadAnimationPromise","wrapDraftText","ul","renderMore","_length","firstTime","onEditOpen","exclude_peers","onCreateOpen","filtersRendered","dialogFilter","folder","channels","isAnyGroup","filterId","getFilter","orderIndex","createFolderBtn","foldersSection","suggestedSection","onFiltersContainerUpdate","renderFolder","getSuggestedFilters","order","suggestedFilters","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","show_previews","mute","showPreviews","inputSettings","mute_until","updateNotifySettings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","invokeApiCacheable","lang_pack","languages","language","lang_code","native_name","getLangPack","getCacheLangPack","langPack","logOut","phoneDiv","buttonsDiv","edit","folders","general","fillElements","channelNameInputField","channelDescriptionInputField","onLengthChange","createChannel","withConfirm","btnConfirm","importContact","telInputField","lockWithPromise","validate","country_code","inputSearch","openContacts","sortedUserList","createList","renderPage","sortedLists","chatList","generateScrollable","scrollables","wasFilterId","setFilterId","onTabChange","fakeGradientDelimiter","appSidebarLeft","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","menuButtons","openUsername","sessionStorage","kz_version","isMainDomain","toolsBtn","btnMenuFooter","rel","stopPropagation","suffix","versionFull","newBtnMenu","initSearch","archivedCount","unreadDialogsCount","requestPeer","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","getAttribute","peopleContainer","hideNewBtnMenuTimeout","onFocus","clearRecentSearchBtn","detailsMap","newGroupDiff","updateGroup","viaBotId","fwdFromId","removeBubble","insertObject","foundBubble","foundAtIndex","foundMidOnSameTimestamp","_timestamp","_mid","bubbleGroup","insertIndex","initDate","onPick","noButtons","selectedDate","onPrevClick","selectedMonth","setMonth","getMonth","minMonth","prevBtn","onNextClick","maxMonth","onDateClick","selectedEl","setTimeTitle","setFullYear","getDate","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","number","setMinutes","getMinutes","getHours","popupCenterer","timeOptions","sendDate","dateOptions","day","weekday","firstDate","weekStartDate","getDay","renderElement","dayIndex","clonedDate","showOverflowMonths","lines","StickyIntersector","handler","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","root","elementsObserver","sentinel","headerSentinel","addSentinel","disconnect","updated","postKey","replies","leftPart","recent_repliers","getHistoryStorage","channel_id","isUnread","read_max_id","max_id","readMaxId","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","MessageRender","setTime","bubbleContainer","messageDiv","editedSpan","views","postAuthor","post_author","fwd_from","postViewsSpan","channelViews","edit_date","edit_hide","pinned","timeSpan","inner","clonedArgs","renderReplies","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","reply_to_mid","replyToPeerId","reply_to","reply_to_peer_id","appPeersManager","originalPeerTitle","originalMessage","wrapSingleMessage","needUpdate","replyMid","getElementByPoint","verticalSide","horizontalSide","floor","elementFromPoint","reflowScrollableElement","EMOJI_LANG_PACK","keywords","version","langCode","langPackCode","keywordLangPacks","indexedLangPacks","getKeywordsPromises","storageKey","stateStorage","from_version","keywordsDifference","packKeywords","keyword","emoticons","getEmojiKeywords","lastRequestedLangCode","getRecentEmojis","indexObject","emojis","indexEmojis","search","POPULAR_EMOJI","getRecentEmojisPromise","recentEmoji","appEmojiManager","loadedURLs","appendEmoji","unify","spanEmoji","kek","wrapSingleEmoji","getEmojiFromElement","nodeType","nodeValue","closeScrollTop","onContentClick","onEmojiSelected","divs","Emoji","category","titleDiv","itemsDiv","unified","menu","emojiScroll","hasRecent","activeId","menuOnClick","stickyIntersector","setMenuActive","recentItemsDiv","observeStickyHeaderChanges","scrollPromise","processInvisibleDiv","intersector","isVisible","getAnimations","checkAnimation","processVisibleDiv","gifWidth","gifHeight","willUseWidth","calcImageInBox","gifsContainer","masonry","EMOTICONSSTICKERGROUP","addLazyLoadQueueRepeat","regularLazyLoadQueue","animatedDivs","checkAnimationContainer","renderSticker","observeAnimatedDiv","queueCategoryPush","categoryDiv","categoryTitle","superStickerRenderer","recentDiv","categoryPush","menuWrapper","menuScroll","setTyping","pushRecentSticker","inlineResults","setHash","geo","lat","long","accuracy_radius","botId","geo_point","getGeoInput","stopTime","noErrorBox","botResults","queryId","query_id","savePhoto","generateQId","resultId","topPeers","botPeerId","topPeer","rating","setKeyValueToStorage","startParam","startBot","bot_inline_placeholder","peerData","setDraft","msg_id","getServerMessageId","callbackAnswer","noLinks","noLinebreaks","queryAndResultIds","inlineResult","pushPopularBot","queryID","resultID","send_message","reply_markup","replyMarkup","sendText","inputMedia","sendMessage","getMediaInput","geoPoint","address","provider","venue_id","venue_type","phone_number","vcard","percent","sendOther","appInlineBotsManager","nextOffset","onGifsClick","gifsDiv","checkAnimations","newSearch","gifBotPeerId","resolveUsername","getInlineResults","setsDiv","countDiv","stickerDiv","renderFeatured","getFeaturedStickers","coveredSets","filterRendered","renderSet","searchStickerSets","forceClose","inited","onMouseOut","displayTimeout","isActive","toElement","willBeActive","onmouseout","onmouseover","tabId","onSelectTabClick","searchButton","deleteBtn","checkRights","tabsEl","tabsElements","canSendStickers","canSendToPeer","canSendGifs","chatInput","savedRange","getGoodRange","lockIntersectionGroup","unlockIntersectionGroup","unlock","refresh","emojiTab","stickersTab","gifsTab","0","1","2","messageInput","HIDE_EMOJI_TAB","INIT_TAB_ID","getVisible","clearVisible","rangeCount","activeElement","getRangeAt","jumpedTo","stuck","which","scrollLeft","clearDraft","emoticonsDropdown","IGNORE_ACTIONS","TEST_SCROLL","appUsersManager","appPhotosManager","appProfileManager","appDraftsManager","appMessagesIdsManager","unreadOut","skippedMids","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","loadedTopTimes","loadedBottomTimes","messagesQueuePromise","messagesQueue","messagesQueueOnRender","messagesQueueOnRenderAdditional","firstUnreadBubble","replyFollowHistory","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","onBubblesClick","chatInner","onDatePick","contactDiv","appImManager","bubbleMid","reply_to_top_id","lastMsgId","saved_from_msg_id","openThread","filterMessages","getDiscussionMessage","via","peerIdStr","savedFrom","messageId","documentDiv","SINGLE_MEDIA_CLASSNAME","isSingleMedia","isMediaCompatibleForDocumentViewer","parents","hasAspecter","albumItem","getMidsByMessage","isReplyClick","replyToMid","reply_to_msg_id","getDistanceToEnd","topbar","pinnedMessage","setCorrectIndex","lastScrollDirection","requestHistory","setMessageId","setScroll","bubbleGroups","changeBubbleMid","setBubblePosition","scrollingToBubble","scrollToBubbleEnd","deleteMessagesByIds","tempMessage","repliesElement","grouped_id","newPoll","safeRenderMessage","scrollToBubbleIfLast","getGroupedBubble","updatePosition","deleteEmptyDateGroups","deletedMids","renderedId","renderMaxId","groupedMessagesStorage","MAX","replyAfter","shouldReply","_target","initMessageReply","highlightBubble","dateMessage","renderNewMessagesByIds","msgIds","setUnreadCount","updateUnreadByDialog","finishPeerChange","updateMessageInput","isScrolledDown","setMessagesQueuePromise","performHistoryResult","postViewsElements","different","postViews","unreadedObserver","onUnreadedInViewport","viewsObserver","sendViewCountersDebounced","incrementMessageViews","wasHeight","offsetHeight","resizing","skip","scrolled","part","rAF","onResizeEnd","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","readUnreaded","readPromise","idle","focusPromise","bubblesMaxId","readContents","isMentionUnread","readHistory","bad","getHistoryTopPromise","getHistoryBottomPromise","getHistory","setLoaded","onScrolledTop","loadMoreHistory","readOutboxMaxId","msgId","permanent","emptyPlaceholderMid","deleteSelectedMids","replyTo","getLastBubble","setPaddingTo","isPaddingNeeded","clientHeight","paddingTop","lastDateGroup","getLastDateGroup","forceDirection","forceDuration","dateGroup","isChangingHeight","scrollToBubble","lastElem","lastTime","firstTimestamp","datasetKey","today","bubbleContent","serviceMsg","bubblesToo","attachedUnreadBubble","fetchNewPromise","onAnimateLadder","resolveLadderAnimation","samePeer","chatType","topMessage","pinnedMessages","isTarget","savedPosition","getChatSavedPosition","getReadMaxIdIfUnread","isJump","apiManager","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","getBubbleByPoint","oldChatInner","lockGroup","lastScrollTop","unlockGroup","fromUp","followingUnread","mountedByLastMsgId","findNextMountedBubbleByMsgId","afterSetPromise","needFetchInterval","isFetchIntervalNeeded","getNewHistory","isBottomEnd","Bottom","onScrolledAllDown","getDialogOnly","unread_mark","markDialogUnread","canWrite","queue","setUnreadDelimiter","getDateContainerByMessage","addBubble","multipleRender","albumMustBeRenderedFull","our","contentWrapper","wasClassNames","classNames","transitionDelay","originalMid","unread","chat_id","wrapMessageActionTextNew","renderMessagesQueue","is_single","messageMessage","messageMedia","getAlbumText","richText","canHaveTail","isStandaloneMedia","needToSetHTML","emojiEntities","strLength","curr","big","forward","containerDiv","rowDiv","buttonEl","same_peer","checkSwitchReturn","switchInlineQuery","column","callbackButtonClick","messageWithReplies","getMessageWithReplies","withReplies","nameContainer","processingWebPage","noAutoDownloadMedia","previewResizer","preview","quote","quoteTextDiv","site_name","textDiv","isSquare","animatedSticker","staticSticker","newNameContainer","wrapGroupedDocuments","lastContainer","texts","wrapPoll","needName","titleVia","isForwardFromChannel","from_id","isHidden","from_name","getPeerColorById","goto","generateTail","renderMessage","isBackLimit","previousScrollHeightMinusTop","needReflowScroll","processLocalMessageRender","firstSlice","lastSlice","Top","newScrollTop","getScheduledMessages","additionMsgIds","isAdditionRender","animateAsLadder","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","delay","lastMsDelay","topRes","middleRes","bottomRes","delays","listElements","creator","renderEmptyPlaceholder","service","generateMessageId","peer_id","getOutputPeer","saveMessages","side","checkPlaceholders","bot_info","checkIfEmptyPlaceholderNeeded","generateLocalFirstMessage","getRenderedLength","realLoadCount","Both","resultPromise","isFirstMessageRender","processResult","historyResult","serviceStartMessageId","threadsServiceMessagesIdsStorage","sup","processPromise","waitPromise","safeCount","mustBeCount","unpin","canUnpin","canPinMessage","oneSide","silent","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","reason","reportMessages","STICKER_EMOJI","preloadStickerPromise","preloadAnimatedEmojiSticker","margin","buttonsEl","marginTop","appPollsManager","appDocsManager","onSendScheduledClick","onReplyClick","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","threadMessage","channel_post","onPinClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","isTargetAGroupedItem","isSelectable","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","groupedItem","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","hasTarget","isGoodType","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","onSubmitClick","send","radioLabel","isEmpty","isInputEmpty","questions","appendMoreField","correctAnswers","optionInputFields","labelOptions","weakMap","questionInputField","sendSilent","setPeerId","dd","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","onEscape","getFilledAnswers","HTMLInputElement","getRichValue","question","quizSolution","force","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","replyToMsgId","helperType","clearHelper","questionField","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","files","willAttachType","confirmShortcutIsSendShortcut","onKeyDown","placeCaretAtEnd","attachFile","willAttach","shouldCompress","itemDiv","attachMedia","attachDocument","sendFileDetails","mediaContainer","caption_length_max","wasInputValue","messageInputField","attachFiles","groupCheckboxField","mediaCheckboxField","toPush","_file","lastModified","isMedia","sendAlbum","startsWith","source","objectURL","videoWidth","videoHeight","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onload","isPhoto","isAudio","finish","onerror","foundPhotos","foundVideos","foundFiles","n","firstType","appendGroupCheckboxField","appendMediaCheckboxField","albumContainer","appendMediaToContainer","onRender","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","keyNames","getCurrentTarget","setCurrentTarget","scrollTo","hadTarget","fastSmoothScroll","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","property","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","resetTarget","_onKeyDown","hidden","onVisible","listType","navigationItem","noBlurOnPop","removeItem","attachNavigation","controller","addHelper","fromController","hideOtherHelpers","onChangeScreen","ready","getMinDate","getMaxDate","canSendWhenOnline","btnSendWhenOnline","getRichValueWithCaret","field","withEntities","selNode","selOffset","startOffset","startContainer","endContainer","endOffset","possibleChildrenFocusOffset","childNodes","alt","getRichElementValue","caretPos","substr","combineSameEntities","firstChar","getBothEmojiKeywords","searchEmojis","listElement","BASE","BASE_CLASS_LIST_ELEMENT","getReadyToSend","botInfos","ignoreCase","commands","botInfo","botCommand","command","found","helpers","preserveHelper","insertAtCaret","topMsgId","trimmed","getMentions","onBodyTouchStart","btnHover","attachButtonListener","checkAvailability","checkForceReply","touchListener","getReplyMarkup","sendInlineResult","_checkQuery","gifsMasonry","isGallery","gallery","noCommands","separator","dataURL","switch_pm","btnSwitchToPM","switchToPM","start_param","checkQuery","appChatsManager","appWebPagesManager","serverTimeManager","appNotificationsManager","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","setKeepAlive","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","shiftKey","onMessageInput","richValue","markdownEntities","parseMarkdown","mergeEntities","parseEntities","urlEntities","getWebPagePromise","saveWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","getEmojiEntityFromEmoji","onBtnSendClick","forwarding","releaseMediaPlayback","setSingleMedia","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","recordTimeEl","needReturn","onHelperClick","forwardElements","inputContainer","tail","goDownBtn","onGoDownClick","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","attachMenuButtons","fileInput","accept","attachMenu","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","onFakeInput","draft","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","touchMouseDown","onstop","ondataavailable","typedArray","dataBlob","Blob","decode","sendFile","isVoiceMessage","pinnedControlBtn","fakeContainer","fakePinnedControlBtn","originalChat","pinnedMessageContainer","unread_count","hasMentions","unread_mentions_count","no_webpage","syncDraft","helperToo","clearInput","fromUpdate","getDraft","rMessage","setInputValue","inputFake","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","isSendShortcutPressed","ctrlKey","metaKey","setStart","collapse","addRange","readAllHistory","commandsMap","bold","italic","underline","strikethrough","monospace","saveExecuted","executed","haveThisType","isCollapsed","tag","commonAncestorContainer","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","AUTO_COMPLETE_REG_EXP","matchIndex","newValue","hadEntities","insertLength","addEntities","caretEntity","insertCaretAtIndex","caret","originalNode","previousSibling","newNode","createTextNode","setStartAfter","insertNode","setCaretAt","_value","foundHelper","suggest","checkEmoticon","checkInlineAutocomplete","needPlaceholder","inlineMatch","btnPreloader","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","clearReply","unicode","pushRecentEmoji","webPage","forwardMessages","dropAuthor","dropCaptions","isDroppingCaptions","hideCaptionCheckboxField","replyFragment","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","usingFullAlbum","albumMids","newReply","intl","peerTitleEl","_message","callerFunc","replyParent","oldReply","haveReply","floating","divAndCaption","CLASSNAME_BASE","btnClose","wrapperUtils","attachOnCloseEvent","needClose","isFloating","setFloating","setUtilsWidth","prevEl","nextEl","attachClick","toggleEl","volumeProgressLineContainer","tunnel","progressWrapper","BAR_HEIGHTS","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","path","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","defs","mark","AnimatedSuper","animateFirst","currentIndex","clearRow","DURATION","reflow","clearRows","previousIndex","fromTop","ignorePrevious","setNewRow","previousRow","AnimatedCounter","previousNumber","animatedSuper","decimal","previousDecimalNumber","getRow","EMPTY_INDEX","previousByDecimal","decimalNumber","getDecimal","hideLeft","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","locked","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","debug","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","lastY","isDown","deltaY","handleScrollSideEvent","refreshPosition","setScrollDownListener","handleFollowingPinnedMessage","isLast","setCount","writeTo","writeMediaTo","onResize","resize","setUtilsRAF","chatUtils","chatAudio","btnBack","chatInfo","person","avatarElement","btnMore","getDeleteButtonText","btnJoin","btnPinned","btnMute","btnSearch","followPinnedMessage","getSearchContext","activeScreen","onBtnBackClick","isFirstChat","getChannelFull","channelFull","linked_chat_id","chatsFull","chatContextMenuHintWasShown","contactPeerId","getContactMediaInput","usersFull","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","byCurrent","destroy","wasPeerId","newPinnedMessage","appSearch","beginSearch","btnPickDate","selectedIndex","selectResult","upBtn","downBtn","foundCountEl","renderedCount","onResultsClick","onFooterClick","onUpClick","onDownClick","footer","dateBtn","wasAlreadyUsed","backgroundEl","Log","Warn","Debug","_item","backgroundImage","contextMenu","constructUtils","constructPeerHelpers","constructPinnedHelpers","constructDiscussionHelpers","constructScheduledHelpers","searchTab","setAutoDownloadMedia","setLoadMutex","loadSidebarMedia","autoDownload","setPrefix","addedListener","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","hideTimeout","nodes","getSelectedNodes","currentMarkups","closest","activeButtons","getActiveMarkupButton","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","containerRect","isFirstShow","setMouseUpEvent","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","generatePathData","tl","tr","bl","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","disableTransition","INTERNAL_LINK_TYPE","chatInvite","broadcast","updates","processUpdateMessage","putPhoto","peopleCount","FOCUS_EVENT_NAME","columnEl","offline","updateStatusInterval","backgroundPromises","onHashChange","parseUriParams","tgaddr","replaceState","onclick","wrapUrl","postId","post","setSettings","chatsSelectTabDebounced","setLoop","setTimeFormat","timeFormat","onDocumentPaste","attachType","newMediaPopup","canDrag","DragEvent","_types","dataTransfer","addFiles","isIDLE","updateStatus","createNewChat","chatsSelectTab","saveChatPosition","choosing","setChoosingStickerTyping","popup","singleInstance","activateInstance","setAuthorized","telegramMeWebManager","addAnchorListener","uriParams","hashtag","pathnameParams","STICKER_SET","processInternalLink","JOIN_CHAT","invite","PRIVATE_POST","thread","comment","MESSAGE","domain","protocol","makeLink","attachKeydownListener","IGNORE_KEYS","isOverlayActive","goodMid","nextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","saveApiChat","noPathnameParams","pathname","noUriParams","uri","openComment","generateThreadServiceStartMessage","broadcastEvent","STATE_INIT","getBackground","setBackground","getFile","chatBubbles","chatPositions","themeColor","hslaStringToHex","backgroundUrl","applyHighlightningColor","setTheme","setCurrentBackground","prevTab","prevIdx","attachDragAndDropListeners","handleSelection","drops","mediaDrops","mount","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","foundMedia","appendDrops","drop","setPath","transitionTime","setUserStatus","invokeApiSingle","fromIndex","justReturn","spliced","beforeDestroy","chatIndex","spliceChats","existingIndex","setType","dot","eye","typings","getPeerTypings","typing","langPackKeys","private","multi","mapa","typingElement","getTypingElement","descriptionElement","getPeerTyping","onlines","getOnlines","useWhitespace","typingContainer","getPeerStatus","topButtons","author","preloaderStreamable","isFirstOpen","pageEl","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","highlightSwitchersTimeout","wholeDiv","isZooming","mover","ctrlKeyDown","changeZoom","onKeyUp","onWheel","scrollingUp","MEDIA_VIEWER_CLASSNAME","overlaysDiv","mainDiv","topbarLeft","onlyMobile","authorRight","zoom","setNewMover","onDownloadClick","moveLength","setMoverPromise","evt","zoomValue","videoPlayer","lockControls","zoomSwipeHandler","lastDiffY","addProgress","btnMenuToggle","setMoverToTarget","appMediaViewer","closing","fromRight","removeCenterFromMover","wasActive","realParent","SVGImageElement","SVGForeignObjectElement","needOpacity","visibleRect","overflowElement","overflowRect","overflowTop","overflowBottom","sticky","overflow","horizontal","visualViewport","windowHeight","innerWidth","innerHeight","getVisibleRect","HTMLImageElement","HTMLVideoElement","setFullAspect","scaleX","scaleY","getComputedStyle","getPropertyValue","brSplitted","fillPropertyValue","willBeLeft","willBeTop","isRejected","SVGSVGElement","sizeTailPath","mediaElement","clipId","newClipId","newSvg","outerHTML","SVGUseElement","sX","sY","upscale","_br","toLeft","newTransform","p1","newMover","oldAvatar","replaceChild","setAuthorInfo","isDocument","isVideo","useContainerAsTarget","moveTheMover","mainColumns","padding","thumbPromise","useController","moverVideo","canPlayThrough","createPlayer","ckin","overlay","HAVE_FUTURE_DATA","attachCanPlay","networkState","NETWORK_LOADING","isntEnoughData","rollback","updateMediaSource","cancellablePromise","attachPromise","haveImage","captionTimeout","isForDocument","onAuthorClick","savePhotoFile","setCaptionTimeout","setBtnMenuToggle","btnMenuDelete","onCaptionClick","setCaption","_openMedia","onAvatarUpdate","removeFromAvatarsCache","getFullPhoto","getTarget","hadMessage","isAvatarCached","believeMe","isDialog","addedToQueue","oldValue","newPeerId","getPeerMigratedTo","peerTitle","onArchiveClick","selectedId","editPeerFolders","folder_id","toggleDialogPin","pinned_dialogs_count_max","onUnmuteClick","onUnreadClick","top_message","isDialogUnread","ConnectionStatus","SENDING_STATUS","hadConnect","connecting","timedOut","updating","setConnectionStatus","baseDcId","setFirstConnectionTimeout","connectionStatus","online","Connected","forceGetDifference","TimedOut","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","CHANGE_STATE_DELAY","getA","forceReconnect","timerSpan","interval","forceReconnectTimeout","setStateTimeout","statusContainer","constructContainer","indexKey","appDialogsManager","addListDialog","isBatch","menuScrollContainer","lastActiveElements","offsets","initedListeners","loadedDialogsAtLeastOnce","loadDialogsPromise","sortedList","onChatsScroll","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","loadContacts","verifyPeerIdForContacts","processContact","added","onChatsRegularScroll","sliceTimeout","perf","performance","scrollTopWas","rectContainer","rectTarget","firstY","firstElement","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialog","setOffsets","onChatsScrollTop","loadDialogs","chatsPreloader","allUnreadCount","bottomPart","addFilter","onStateLoaded","foldersScrollable","getDialogIndexKey","getDialogDom","setFilterUnreadCount","validateDialogForFilter","setFiltersUnreadCount","updateDialog","setUnreadMessages","getCachedDialogs","validateListForFilter","containerToAppend","renderedFilter","unsetTyping","getNotifyPeerTypeSettings","initListeners","renderFiltersPromise","showFiltersPromise","storagesResults","addMissedDialogs","fillConversations","migratedTo","testDialogForFilter","topOffset","getOffsetIndex","bottomOffset","isDialogMustBeInViewport","unreadSpan","getFolder","foundUnmuted","getAll","sortedDialogList","currentOffsetIndex","needIndex","getConversationsResult","isTopEnd","callbacks","cccc","offsetDialog","classNameType","subtitleArgs","placeholderContainer","generateEmptyPlaceholder","wrapLocalSticker","firstDialog","getDialogFromElement","lastDialog","withContext","openInner","lastActiveListElement","setPeerFunc","sameElement","getDialogByPeerId","lastMessage","highlightWord","setUnread","draftMessage","lastTimeSpan","playIcon","withoutMediaType","sender","senderBold","setStatusMessage","disableAnimationIfRippleFound","iconClassName","setSendingStatus","statusSpan","isPinned","hasUnreadBadge","isUnreadBadgeMounted","unreadBadge","hasMentionsBadge","isMentionBadgeMounted","mentionsBadge","transitionDuration","isMention","originalDialog","getDialog","addDialog","_dialog","captionDiv","titleSpanContainer","titleP","rightSpan","module","exports","call","defineProperty","enumerable","Symbol","toStringTag","__esModule","create","default","prototype","AudioContext","webkitAudioContext","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","mediaDevices","getUserMedia","WebAssembly","clearStream","stream","getTracks","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","postMessage","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","createGain","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","createMediaStreamSource","loadWorker","Worker","initWorker","streamPage","storePage","recordedPages","samplePosition","page","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","gain","setTargetAtTime","onstart","destroyWorker","Function","rippleClickId","drawRipple","startTime","clickId","elapsedTime","touchStartFired","clickY","sqrt","isRippleUnneeded","touchEnd","CLICK_EVENT_NAME","attachClickEvent","detachClickEvent","simulateClickEvent","rippleSquare","putPreloader","returnDiv","setButtonLoader","diffX","diffY","closeBtnMenu","menuOverlay","openedMenuOnClose","openBtnMenu","positionMenu","menuWidth","menuHeight","windowWidth","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","onCancel","navigations","manual","currentHash","isPossibleSwipe","pushState","handleItem","scrollRestoration","noHistory","origin","simulateEvent","raf","kind","scheduleFlush","do","read","write","TouchEvent","currentHashPromise","newHashPromise","password","new_settings","invokeCrypto","newAlgo","new_algo","salt1","randomize","hashes","new_password_hash","inputCheckPassword","setUser","PasswordInputField","onVisibilityClick","toggleVisible","stealthy","tabIndex"],"mappings":"uFAAA,8CASe,MAAMA,EAMnB,YAAsBC,EAAkDC,GAAlD,KAAAD,qBAAkD,KAAAC,OAHjE,KAAAC,UAAY,EAIjBC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,yBAGxB,OACL,OAAGL,KAAKM,YAAoBN,KAAKM,YAC1BN,KAAKM,YAAc,IAAaC,qBAAqB,CAC1DN,UAAWD,KAAKC,UAChBO,MAAM,EACNC,UAAU,EACVC,MAAOV,KAAKF,KACZa,OAAQX,KAAKF,KACbc,SAAS,GAER,2CAA2CC,KAAKC,IAEjDd,KAAKe,UAAYD,EACjBd,KAAKe,UAAUC,iBAAiB,aAAcC,KAGX,IAA7BjB,KAAKe,UAAUG,WAAmBD,GAAgBjB,KAAKD,YAC1B,IAA9BC,KAAKe,UAAUG,WAAoBD,GAAgBjB,KAAKD,aACvDC,KAAKe,UAAUI,SAAS,GACxBnB,KAAKe,UAAUK,WAIrBpB,KAAKH,mBAAmBwB,4BAA8B,KACjDrB,KAAKH,mBAAmByB,iBACzBtB,KAAKe,UAAUQ,aAAa,GAC5BvB,KAAKe,UAAUS,SAAW,EAC1BxB,KAAKD,UAAY,GACjBC,KAAKe,UAAUU,SAEfzB,KAAKe,UAAUQ,cAAc,GAC7BvB,KAAKe,UAAUS,SAAW,GAC1BxB,KAAKD,UAAY,EACjBC,KAAKe,UAAUU,SAIZ,IAAaC,kBAAkBZ,KAInC,SACFd,KAAKe,WACNf,KAAKe,UAAUY,Y,iCC/DrB,8CASe,MAAMC,EAWnB,YAAsBC,EAAkC/B,GAAlC,KAAA+B,aAAkC,KAAA/B,OAR9C,KAAAgC,IAAM,GACN,KAAA/B,UAAY,EAQpBC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,yBAE7B,MAAM0B,EAAQF,EAAWE,MAEzBA,EAAMf,iBAAiB,OAAQ,KAC7BhB,KAAKgC,cAAc,KAGrBD,EAAMf,iBAAiB,QAAUiB,IAC/BjC,KAAKgC,cAAcH,EAAWK,MAAMC,UAUjC,cAAcA,GACnB,IAAInC,KAAKe,UAAW,OAGpB,IAAIqB,GADJD,EAASE,KAAKC,IAAIH,EAAQ,MAGxBC,EAAQC,KAAKE,MAAMF,KAAKC,IAAItC,KAAK8B,IAAKK,IAAW,IAAMnC,KAAK8B,KAAO,OAEhE9B,KAAKwC,gBACNxC,KAAKwC,cAAcC,MAAK,GACxBzC,KAAKwC,cAAcE,OAAOC,MAAMC,QAAU,QAG5C5C,KAAKe,UAAU2B,OAAOC,MAAMC,QAAU,IAYtCR,EAAQ,EAIV,MAAMlB,EAAYlB,KAAKD,UAAYqC,GAAS,EAAI,EAGhDpC,KAAKe,UAAUQ,aAAaL,GACN,IAAnBlB,KAAKD,WAA6B,IAAVqC,GACzBpC,KAAKe,UAAUI,SAAS,GAI1BnB,KAAKD,UAAYqC,EAEjBpC,KAAKe,UAAUU,OAMV,OACL,OAAGzB,KAAKM,YAAoBN,KAAKM,YAC1BN,KAAKM,YAAcuC,QAAQC,IAAI,CACpC,IAAavC,qBAAqB,CAChCN,UAAWD,KAAKC,UAChBO,MAAM,EACNC,UAAU,EACVC,MAAOV,KAAKF,KACZa,OAAQX,KAAKF,MACZ,2CAA2Ce,KAAKE,IACjDf,KAAKwC,cAAgBzB,EAGjBf,KAAK6B,WAAWK,MAAMC,QACxBpB,EAAUU,OAGL,IAAaC,kBAAkBX,KAGxC,IAAaR,qBAAqB,CAChCN,UAAWD,KAAKC,UAChBO,MAAM,EACNC,UAAU,EACVC,MAAOV,KAAKF,KACZa,OAAQX,KAAKF,MACZ,+CAA+Ce,KAAKC,IACrDd,KAAKe,UAAYD,EAEbd,KAAK6B,WAAWK,MAAMC,SACxBnC,KAAKe,UAAU2B,OAAOC,MAAMC,QAAU,QAGxC5C,KAAKe,UAAUC,iBAAiB,aAAcC,KAIX,IAA7BjB,KAAKe,UAAUG,WAAmBD,GAAgBjB,KAAKD,YAC1B,IAA9BC,KAAKe,UAAUG,WAAoBD,GAAgBjB,KAAKD,aACzDC,KAAKe,UAAUI,SAAS,GACxBnB,KAAKe,UAAUK,SAGG,IAAjBH,GAAyC,IAAnBjB,KAAKD,WAGzBC,KAAKwC,gBACNxC,KAAKwC,cAAcE,OAAOC,MAAMC,QAAU,GAC1C5C,KAAKwC,cAAcf,OACnBzB,KAAKe,UAAU2B,OAAOC,MAAMC,QAAU,UAMrC,IAAalB,kBAAkBZ,OAKrC,SACFd,KAAKe,WAAWf,KAAKe,UAAUY,SAC/B3B,KAAKwC,eAAexC,KAAKwC,cAAcb,Y,iCCrJ9C,8CAQe,MAAMoB,UAAuB,IAC1C,YAAYC,GAIVC,MAAM,OAAD,QACHC,WAAW,GACRF,IAGL,MAAMjB,EAAQ/B,KAAK+B,MACnBA,EAAMoB,KAAO,MACbpB,EAAMqB,aAAa,WAAY,IAC/BrB,EAAMsB,aAAe,MAErB,IAAIC,EAAa,EACjBtD,KAAK+B,MAAMf,iBAAiB,QAAUiB,IACpCjC,KAAK+B,MAAM3B,UAAUuB,OAAO,SAC5B3B,KAAKuD,WAEL,MAAMrB,EAAQlC,KAAKkC,MAAMsB,QAAQ,MAAO,IAAIC,MAAM,EAAGT,EAAQb,QAC7DnC,KAAK0D,iBAAiBxB,GAEtB,MAAMC,EAASnC,KAAKkC,MAAMC,OAC1B,GAAGA,IAAWa,EAAQb,OACpBa,EAAQW,OAAO3D,KAAKkC,YACf,GAAGC,IAAWmB,EACnB,OAGFA,EAAanB,O,iLCnCnB,MAAM,EAAM,IAAI,KAA4ByB,OAAO,IAAI,MAIxC,MAFoB,IAAIC,IAAI,GCC5B,SAASC,EAAaC,EAAeC,GAClDD,EAAKX,aAAa,MAAO,QACzBW,EAAKE,UAAYD,E,6BCEJ,SAASE,EAAyBhC,GAM/C,YAAeA,EAAMiC,QAAS,CAACC,EAASC,EAAKC,KACrCF,EAAmCG,OAAoDC,QAC3FF,EAAIG,OAAOJ,EAAK,QACGK,IAAhBxC,EAAMyC,SACLzC,EAAMyC,S,YCDD,MAAM,EAoBnB,YAAY3B,GAlBL,KAAA4B,SAAgB,GAChB,KAAAC,KAAY,GAEZ,KAAAC,SAAU,EAIP,KAAAC,UAAY,GACZ,KAAAC,aAAe,GAKf,KAAAC,aAAc,EACd,KAAAC,eAAgB,EAKxB,YAAWlF,KAAMgD,GAGZ,WAAW4B,EAAeC,EAAWC,GAC1C9E,KAAK4E,SAAWA,EAChB5E,KAAK6E,KAAOA,EACZ7E,KAAK8E,QAAUA,EAGjB,YACE,YAAsBJ,IAAf1E,KAAK2E,MAAsB3E,KAAK4E,SAASzC,QAAU,EAGrD,MAAMgD,GAAY,GACvBnF,KAAKoF,aAAUV,EACf1E,KAAK4E,SAAW,GAChB5E,KAAK6E,KAAO,GACZ7E,KAAKiF,YAAcjF,KAAKkF,cAAgBC,EACxCnF,KAAKqF,cAAgBrF,KAAKsF,gBAAkB,KAGvC,GAAGnD,EAAgBoD,GAAe,GACvC,IAAIC,EAAYC,EAChB,GAAGtD,EAAS,EAAG,CAGb,GAFAqD,EAAQxF,KAAK6E,KAAKJ,OAAO,EAAGtC,GAC5BsD,EAAOD,EAAME,OACTD,EACF,OAGFzF,KAAK4E,SAASe,KAAK3F,KAAKoF,WAAYI,OAC/B,CAGL,GAFAA,EAAQxF,KAAK4E,SAASH,OAAOzE,KAAK4E,SAASzC,OAASA,GAASA,GAC7DsD,EAAOD,EAAMI,SACTH,EACF,OAGFzF,KAAK6E,KAAKgB,WAAWL,EAAOxF,KAAKoF,SAanC,OAVGpF,KAAK6E,KAAK1C,OAASnC,KAAKgF,cACzBhF,KAAK8F,MAAM9F,KAAK8E,SAGf9E,KAAK4E,SAASzC,OAASnC,KAAKgF,cAC7BhF,KAAK8F,KAAK9F,KAAK8E,SAGjB9E,KAAKoF,QAAUK,EACfF,GAAgBvF,KAAK+F,QAAU/F,KAAK+F,OAAON,EAAMtD,EAAS,GACnDnC,KAAKoF,QAIP,KAAKY,GACV,GAAGA,GAAShG,KAAKkF,cAAe,OAAOrC,QAAQoD,UAC1C,IAAID,GAAShG,KAAKiF,YAAa,OAAOpC,QAAQoD,UAEnD,GAAGD,GAAShG,KAAKsF,gBAAiB,OAAOtF,KAAKsF,gBACzC,IAAIU,GAAShG,KAAKqF,cAAe,OAAOrF,KAAKqF,cAElD,IAAIa,EAEFA,EADCF,EACQhG,KAAK8E,QAAU9E,KAAK4E,SAAS,GAAK5E,KAAK6E,KAAK7E,KAAK6E,KAAK1C,OAAS,GAE/DnC,KAAK8E,QAAU9E,KAAK6E,KAAK7E,KAAK6E,KAAK1C,OAAS,GAAKnC,KAAK4E,SAAS,GAG1E,MAAMuB,EAAUnG,KAAKoG,SAASF,EAAQF,EAAOhG,KAAK+E,WAAWlE,KAAKwF,IAChE,GAAIL,GAAShG,KAAKsF,kBAAoBa,IAAcH,GAAShG,KAAKqF,gBAAkBc,EAClF,OAGCE,EAAOb,MAAMrD,OAASnC,KAAK+E,YACzBiB,EAAOhG,KAAKkF,eAAgB,EAC1BlF,KAAKiF,aAAc,QAGRP,IAAf1E,KAAK2E,QACN3E,KAAK2E,MAAQ0B,EAAO1B,OAAS0B,EAAOb,MAAMrD,SAG7B6D,EAAQK,EAAOb,MAAMc,QAAQC,KAAKF,EAAOb,OAAS,IAAee,KAAK,KAAMF,EAAOb,QAC1FC,IACN,MAAMe,EAAYxG,KAAKyG,YAAczG,KAAKyG,YAAYhB,GAAQA,EAE1De,IAEDR,EACEhG,KAAK8E,QAAS9E,KAAK4E,SAASiB,QAAQW,GAClCxG,KAAK6E,KAAKc,KAAKa,GAEjBxG,KAAK8E,QAAS9E,KAAK6E,KAAKc,KAAKa,GAC3BxG,KAAK4E,SAASiB,QAAQW,MAI/BxG,KAAK0G,cAAgB1G,KAAK0G,gBACzB,QAAU7F,KAAK,KACbmF,EAAOhG,KAAKsF,gBAAkB,KAC5BtF,KAAKqF,cAAgB,OAM5B,OAHGW,EAAOhG,KAAKsF,gBAAkBa,EAC5BnG,KAAKqF,cAAgBc,EAEnBA,GCnII,MAAM,UAAqE,EAIxF,YAAYnD,EAAiG,IAC3GC,MAAM,OAAD,wBACAD,GAAO,CACVoD,SAAU,CAACF,EAAQF,EAAOjB,K,MACxB,MAAM4B,EAAYX,EAAQ,EAAIjB,EAC9B,IAAI6B,EAAoB,QAAZ,EAAA5G,KAAKoF,eAAO,eAAEyB,IAK1B,OAHGX,IAAQU,EAAQV,EAAOW,KACtBb,IAAOY,EAAQ,IAAsBE,mBAAmBF,EAAO,IAE5D,IAAmBG,UAAU,OAAD,wBAC9B/G,KAAKgH,eAAa,CACrBC,OAAQjH,KAAKgH,cAAcC,SAAUf,aAAM,EAANA,EAAQe,QAC7CL,QACAM,MAAOP,EAAY,EAAI5B,EACvB4B,eACC9F,KAAKqB,IAKkC,kCAArClC,KAAKgH,cAAcG,YAAYC,GAChClD,EAAyBhC,GAGxBA,EAAMmF,YACPrH,KAAKgH,cAAcM,SAAWpF,EAAMmF,WAG/B,CAAC1C,MAAOzC,EAAMyC,MAAOa,MAAOtD,EAAMiC,YAG7CsC,YAAcrC,IAEZ,GADiBpE,KAAKuH,WAAW,CAACnD,EAAQyC,MAC7B1E,OAIb,OAAOa,EAAQyD,YAAYrC,OAiBvB,KAAAoD,gBAAkB,EAAEP,SAAQQ,WACpC,MAAMC,EAAmBjC,GAAeA,EAAKwB,SAAWA,GAAUQ,EAAKE,IAAIlC,EAAKoB,KAC1Ee,EAAS,CAACnC,EAAYpB,EAAaC,KACpCoD,EAAgBjC,IACjBnB,EAAIG,OAAOJ,EAAK,IAIpB,YAAerE,KAAK4E,SAAUgD,GAC9B,YAAe5H,KAAK6E,KAAM+C,GAEvB5H,KAAKoF,SAAWsC,EAAgB1H,KAAKoF,UAKzBpF,KAAK6H,WAChB7H,KAAK6H,aAKD,KAAAC,qBAAwBC,IAGhC,QAAmCrD,IAAhC1E,KAAKgH,cAAcgB,SACpB,OAIF,IAAIhI,KAAKiF,aAAejF,KAAKqF,cAC3B,OAGF,MAAM4C,EAAOF,EAAI/H,KAAKgH,cAAcC,QACpC,IAAIgB,EACF,OAGF,MAAMC,EAASC,MAAMC,KAAKH,GAAMI,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAE7CC,EADWxI,KAAKuH,WAAWW,GACRO,IAAIrE,GAAWpE,KAAKyG,YAAYrC,IAAUwD,OAAOc,SACvEF,EAAQrG,QACTnC,KAAK6E,KAAKc,QAAQ6C,IAIZ,KAAAG,cAAgB,EAAEvE,cAC1BpE,KAAK8H,qBAAqB,CACxB,CAAC1D,EAAQ6C,QAAS,IAAIpD,IAAI,CAACO,EAAQyC,SA9DrC+B,EAAA,QAAU5H,iBAAiB,iBAAkBhB,KAAKwH,iBAClDoB,EAAA,QAAU5H,iBAAiB,sBAAuBhB,KAAK8H,sBACvDc,EAAA,QAAU5H,iBAAiB,eAAgBhB,KAAK2I,eAGxC,WAAWV,GACnB,MAAMY,EAAU7I,KAAKgH,cAAc8B,YACjC,IAAmBC,4BAA4B/I,KAAKgH,cAAcC,QAClE,IAAmB+B,mBAAmBhJ,KAAKgH,cAAcC,QAE1D,OADiB,IAAmBgC,4BAA4BjJ,KAAKgH,cAAcG,YAAYC,EAAGa,EAAMY,EAASZ,EAAK9F,QAyDlH,iBAAiB+G,GACtBlJ,KAAKgH,cAAgBkC,OAEcxE,IAAhC1E,KAAKgH,cAAcgB,WACpBhI,KAAKiF,aAAc,OAEgBP,IAAhC1E,KAAKgH,cAAcM,WACpBtH,KAAKkF,eAAgB,IAIe,kCAArClF,KAAKgH,cAAcG,YAAYC,IAChCpH,KAAKiF,aAAc,GAGjBjF,KAAKgH,cAAcmC,YACrBnJ,KAAKkF,cAAgBlF,KAAKiF,aAAc,GAIrC,QACLhC,MAAMmG,QACNpJ,KAAKgH,mBAAgBtC,EAGhB,UACL1E,KAAKoJ,QACLR,EAAA,QAAUS,oBAAoB,iBAAkBrJ,KAAKwH,iBACrDoB,EAAA,QAAUS,oBAAoB,sBAAuBrJ,KAAK8H,sBAC1Dc,EAAA,QAAUS,oBAAoB,eAAgBrJ,KAAK2I,eACnD3I,KAAK6H,eAAYnD,G,oECjJd,MAAM,EAKX,YAAmB4E,EAAoCnG,EAAsBoG,GAAY,EAAMC,EAAoBC,GAAY,EAAaC,GAAa,EAAaC,GAAnJ,KAAAL,OAAoC,KAAAnG,OAAsB,KAAAoG,YAA+D,KAAAG,aAA0B,KAAAC,UACpK3J,KAAK4J,KAAO,GAAkBC,iBAC9B7J,KAAKC,UAAYC,SAASC,cAAc,OACrCqJ,IAAWxJ,KAAKC,UAAUuJ,UAAYA,GAEtCF,IACDtJ,KAAK8J,OAAS5J,SAASC,cAAc,OACrCH,KAAK8J,OAAO1J,UAAUC,IAAI,sBACN,iBAAX,GACPL,KAAK8J,OAAOC,OAAO,eAAKT,IAE1BtJ,KAAKC,UAAU8J,OAAO/J,KAAK8J,SAG7B9J,KAAKC,UAAUG,UAAUC,IAAI,eAAgB,gBAAkB8C,GAC/DnD,KAAKC,UAAU8J,OAAO/J,KAAK4J,MAC3B5J,KAAKC,UAAU0C,MAAMC,QAAU,OAE5B6G,GACD,GAAkBO,qBAAqBhK,KAAK4J,KAAMD,OAASjF,EAAWgF,GAI1E,QACE1J,KAAKC,UAAU0C,MAAMC,QAAU,OAE5B5C,KAAKuJ,YACNvJ,KAAK4J,KAAK3F,UAAY,IAI1B,YACEjE,KAAKC,UAAU0C,MAAMC,QAAU,GAGjC,SACK5C,KAAK4J,KAAKK,kBACXjK,KAAKkK,YAELlK,KAAKmK,SAOI,MAAM,EAiBnB,YAAmBlK,EAA+BmK,EAAiCC,EAAgEC,GAAhI,KAAArK,YAA+B,KAAAmK,cAAiC,KAAAC,eAAgE,KAAAC,WAhB3I,KAAAC,SAAW,EACX,KAAAC,aAAe,EACf,KAAAC,YAAc,EAEd,KAAAC,cAA+B,KAC/B,KAAAC,cAAwB,EAExB,KAAAC,MAAQ,GAER,KAAAC,eAAiC,KAGjC,KAAAC,SAAW,EAKjB9K,KAAK+K,WAAa,IAAI,IAAW/K,KAAKC,WACtCD,KAAK6K,eAAiB7K,KAAK+K,WAAW9K,UACtC,IAAI,IAAI+K,KAAKhL,KAAKqK,aAChBrK,KAAK6K,eAAed,OAAO/J,KAAKqK,aAAaW,GAAsB/K,WAGlED,KAAKqK,aAAaY,UACnBjL,KAAK+K,WAAWG,oBAAoBlL,KAAKqK,aAAaY,SAASrB,MAGjE5J,KAAKoK,YAAYe,SAAYjJ,IAM3BlC,KAAK4K,MAAQ1I,EACblC,KAAKoJ,OAAM,GACXpJ,KAAKoL,cAGPpL,KAAK+K,WAAWM,iBAAmB,KAC7BrL,KAAK4K,MAAMU,SAEXtL,KAAK2K,gBACP3K,KAAK2K,cAAgBY,OAAOC,WAAW,KACrCxL,KAAKoL,aACLpL,KAAK2K,cAAgB,GACpB,MAKF,MAAM7H,GAAM,GACdA,IACD9C,KAAKoK,YAAYlI,MAAQ,GACzBlC,KAAK4K,MAAQ,GACb5K,KAAKiH,YAASvC,EACd1E,KAAK8K,SAAW,GAGlB9K,KAAKuK,SAAW,EAChBvK,KAAKwK,aAAe,EACpBxK,KAAKyK,YAAc,EAEnB,IAAI,IAAIO,KAAKhL,KAAKqK,aAChBrK,KAAKqK,aAAaW,GAAsBb,QAG1CnK,KAAK0K,cAAgB,KAGhB,YAAYzD,EAAiB6D,EAAW,EAAGF,EAAQ,IACxD5K,KAAKiH,OAASA,EACdjH,KAAK8K,SAAWA,EAEb9K,KAAK4K,QAAUA,IAChB5K,KAAKoK,YAAYvI,WAAWK,MAAQ0I,GAGtC5K,KAAKoK,YAAYrI,MAAM0J,QAGlB,aACL,GAAGzL,KAAK0K,cAAe,OAAO1K,KAAK0K,cAEnC,MAAME,EAAQ5K,KAAK4K,MAEnB,IAAIA,EAAMU,OAER,YADAtL,KAAKsK,UAAYtK,KAAKsK,SAAS,IAIjC,IAAwB,IAArBtK,KAAKyK,YAAqBzK,KAAKwK,aAAexK,KAAKyK,WACpD,OAAO5H,QAAQoD,UAGjB,MAAMW,EAAQ5G,KAAKuK,UAAY,EAE/B,OAAOvK,KAAK0K,cAAgB,IAAmB3D,UAAU,CACvDE,OAAQjH,KAAKiH,OACb2D,QACAzD,YAAa,CAACC,EAAG,4BACjBR,QACAM,MAAO,GACP4D,SAAU9K,KAAK8K,WACdjK,KAAK6K,IAGN,GAFA1L,KAAK0K,cAAgB,KAElB1K,KAAKoK,YAAYlI,QAAU0I,EAC5B,OAKF,MAAM,MAACjG,EAAK,QAAER,GAAWuH,EAEtBvH,EAAQhC,QAAUgC,EAAQ,GAAG0C,MAAQ7G,KAAKuK,UAC3CpG,EAAQyB,QAGV,MAAM+F,EAAc3L,KAAKqK,aAAaY,SAEtC9G,EAAQmC,QAASlC,IACf,MAAM6C,EAASjH,KAAKiH,OAAS7C,EAAQwH,OAASxH,EAAQ6C,QAChD,OAAC4E,EAAM,IAAEC,GAAO,GAAkBC,aAAa,CACnDF,OAAQ5E,EACRhH,UAAWD,KAAK+K,WAChBiB,YAAY,EACZC,WAAY,GACZC,WAAW,IAGV9H,EAAQ6C,SAAWA,IACpB6E,EAAIK,OAAOC,QAAQnF,OAAS,GAAK7C,EAAQ6C,QAG3C,GAAkBoF,eAAeR,EAAQzH,EAAS0H,EAAKlB,KAGzDe,EAAYW,SAEZtM,KAAKuK,SAAWpG,EAAQhC,QAAUgC,EAAQA,EAAQhC,OAAS,GAAG0E,KAErC,IAAtB7G,KAAKwK,cACNxK,KAAKwK,YAAc,GAErBxK,KAAKwK,aAAerG,EAAQhC,QAEJ,IAArBnC,KAAKyK,aACNzK,KAAKyK,WAAa9F,EAEfgH,EAAY7B,QACb,OAAAyC,EAAA,GAAeZ,EAAY7B,OAAQ,eAAKnF,EAAQ,4BAA8B,8BAA+B,CAACA,KAGhH3E,KAAKsK,UAAYtK,KAAKsK,SAAStK,KAAKyK,eAErC+B,MAAMC,IACPC,QAAQC,MAAM,eAAgBF,GAC9BzM,KAAK0K,cAAgB,Q,YCpNZ,MAAM,EAWnB,YAAYkC,EAA0BzB,GAL/B,KAAA0B,UAAY,GACZ,KAAAC,QAAU,EA+BjB,KAAAC,QAAU,KACR,IAAI/M,KAAKmL,SAAU,OAEnB,IAAIjJ,EAAQlC,KAAKkC,MAIdA,IAAUlC,KAAK6M,YAChB7M,KAAK6M,UAAY3K,EACjB8K,aAAahN,KAAK8M,SAClB9M,KAAK8M,QAAUvB,OAAOC,WAAW,KAC/BxL,KAAKmL,SAASjJ,IACb,OAIP,KAAA+K,aAAe,KACbjN,KAAKkC,MAAQ,GACblC,KAAKmL,UAAYnL,KAAKmL,SAAS,IAC/BnL,KAAKkN,SAAWlN,KAAKkN,WA7CrBlN,KAAK6B,WAAa,IAAI,IAAW,CAC/B+K,cACA1J,WAAW,IAGblD,KAAKC,UAAYD,KAAK6B,WAAW5B,UACjCD,KAAKC,UAAUG,UAAUuB,OAAO,eAChC3B,KAAKC,UAAUG,UAAUC,IAAI,gBAE7BL,KAAKmL,SAAWA,EAEhBnL,KAAK+B,MAAQ/B,KAAK6B,WAAWE,MAC7B/B,KAAK+B,MAAM3B,UAAUC,IAAI,sBAEzB,MAAM8M,EAAajN,SAASC,cAAc,KAC1CgN,EAAW/M,UAAUC,IAAI,QAAS,gBAElCL,KAAKoN,SAAWlN,SAASC,cAAc,KACvCH,KAAKoN,SAAShN,UAAUC,IAAI,QAAS,WAAY,eAEjDL,KAAK+B,MAAMf,iBAAiB,QAAShB,KAAK+M,SAC1C/M,KAAKoN,SAASpM,iBAAiB,QAAShB,KAAKiN,cAE7CjN,KAAKC,UAAU8J,OAAOoD,EAAYnN,KAAKoN,UAyBzC,YACE,OAAOpN,KAAK6B,WAAWK,MAGzB,UAAUA,GACRlC,KAAK6M,UAAY3K,EACjB8K,aAAahN,KAAK8M,SAClB9M,KAAK6B,WAAWK,MAAQA,EAGnB,SACL8K,aAAahN,KAAK8M,SAClB9M,KAAK+B,MAAMsH,oBAAoB,QAASrJ,KAAK+M,SAC7C/M,KAAKoN,SAAS/D,oBAAoB,QAASrJ,KAAKiN,e,6CClErC,MATI,CAACzD,EAAoBxG,EAAuE,KAC9F,YAAO,WAAY,OAAF,QAC9BqK,KAAM7D,QAAa9E,GAChB1B,I,sSCaQ,MAAM,EAcnB,YAAYsK,EAAuBC,GACjCvN,KAAKwN,aAAaF,EAAQC,GAGrB,aAAaD,EAAuBC,GAAc,GACvDvN,KAAKsN,OAASA,EACdtN,KAAKuN,YAAcA,EAEnBvN,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,WAAY,uBAGzCL,KAAKyN,OAASvN,SAASC,cAAc,OACrCH,KAAKyN,OAAOrN,UAAUC,IAAI,kBAE1BL,KAAK0N,SAAW,EAAW,4BAA6B,CAACC,UAAU,IACnE3N,KAAK4N,MAAQ1N,SAASC,cAAc,OACpCH,KAAK4N,MAAMxN,UAAUC,IAAI,yBACzBL,KAAKyN,OAAO1D,OAAO/J,KAAK0N,SAAU1N,KAAK4N,OAGvC5N,KAAK6N,QAAU3N,SAASC,cAAc,OACtCH,KAAK6N,QAAQzN,UAAUC,IAAI,mBAE3BL,KAAK+K,WAAa,IAAI,IAAW/K,KAAK6N,aAASnJ,OAAWA,GAAW,GAErE1E,KAAKC,UAAU8J,OAAO/J,KAAKyN,OAAQzN,KAAK6N,SAExC7N,KAAKsN,OAAOQ,OAAO9N,MAEnBA,KAAK+N,eAAiB,IAAI,IAGrB,QACL,OAAO/N,KAAKsN,OAAOU,SAAShO,MAGjB,QAAQiO,G,yCACnB,GAAGjO,KAAKkO,KACN,IACE,MAAM7H,EAASrG,KAAKkO,OACpBlO,KAAKkO,KAAO,KAET7H,aAAkBxD,gBACbwD,GAER,MAAMoG,GACNC,QAAQC,MAAM,iBAAkBF,GAIpC,OAAOzM,KAAKsN,OAAOa,UAAUnO,SAGrB,QAIH,sBACFA,KAAKuN,cACNvN,KAAKsN,OAAOc,KAAKC,OAAOrO,MACxBA,KAAKC,UAAU0B,UAGd3B,KAAK+N,gBACN/N,KAAK+N,eAAeO,YAId,SAASC,GACjBvO,KAAK4N,MAAM3J,UAAY,GACvBjE,KAAK4N,MAAM7D,OAAO,eAAKwE,KAIpB,MAAM,UAAgC,EAK3C,YAAYjB,GACVrK,MAAMqK,GACNtN,KAAKwO,cAAgB,IAAI,IAG3B,sBAGE,OAFAxO,KAAKwO,cAAcC,cAAc,WACjCzO,KAAKwO,cAAcE,UACZzL,MAAM0L,uBC3GF,MAAM,EASnB,YAAY3L,GAPL,KAAA4L,cAA6C,GAI5C,KAAAC,cAAe,EA0BhB,KAAAC,gBAAkB,KACVC,EAAA,EAAwBC,eAAehP,KAAKiP,gBAEvDF,EAAA,EAAwBG,KAAKlP,KAAKiP,gBAC1BjP,KAAK4O,cAAczM,QAC3BnC,KAAKgO,SAAShO,KAAK4O,cAAc5O,KAAK4O,cAAczM,OAAS,KAK1D,KAAA6L,SAAW,CAACmB,EAA8BC,EAAmBC,KAClE,QAAU3K,IAAPyK,GAAoBnP,KAAK4O,cAAc5O,KAAK4O,cAAczM,OAAS,KAAOgN,EAC3E,OAAO,EAIT,MAAMG,EAAYtP,KAAK4O,cAAclJ,MACrC1F,KAAKuP,WAAWD,EAAWF,EAASC,GAEpC,MAAMG,EAAMxP,KAAK4O,cAAc5O,KAAK4O,cAAczM,OAAS,GAE3D,OADAnC,KAAKyP,gBAAmB/K,IAAR8K,EAAqBA,aAAe,EAAiBA,EAAIvP,UAAYuP,EAAQxP,KAAK6O,cAAgB,EAAI,EAAIO,IACnH,GAtCP,YAAWpP,KAAMgD,GAEbhD,KAAKoO,OACPpO,KAAKoO,KAAO,IAAIsB,KAGlB1P,KAAK2P,cAAgB3P,KAAK4P,UAAUC,cAAc,mBAClD7P,KAAKyP,WAAa,YAAiBzP,KAAK2P,cAAe,aA3BnC,KA4BhB3P,KAAK6O,cACP7O,KAAKyP,WAAW,GAGlBtH,MAAMC,KAAKpI,KAAK4P,UAAUE,iBAAiB,0BAAkDxJ,QAAQyJ,IACnG,YAAiBA,EAAI/P,KAAK8O,mBA4BvB,UAAUK,GAKf,GAAGnP,KAAK4O,cAAc5O,KAAK4O,cAAczM,OAAS,KAAOgN,EACvD,OAAO,EAGT,MAAMK,EAAiBL,aAAc,EAAiBA,EAAKnP,KAAKoO,KAAK4B,IAAIb,GAyBzE,OAxBGK,IACEA,EAAIS,QACLT,EAAIS,SAGHT,EAAIU,oBACL1E,WAAW,KACTgE,EAAIU,sBA9EU,MAoFlBnB,EAAA,EAAwBoB,SAAS,CAC/BhN,KAAMnD,KAAKiP,eACXmB,MAAQC,IACNrQ,KAAKgO,cAAStJ,EAAW2L,GAAY,IAC9B,KAKbrQ,KAAK4O,cAAcjJ,KAAKwJ,GACxBnP,KAAKyP,WAAWN,aAAc,EAAiBA,EAAGlP,UAAYkP,IACvD,EAGF,qBAAqBA,GAC1B,YAAiBnP,KAAK4O,cAAeO,GACrCnP,KAAKuP,WAAWJ,OAAIzK,GAGf,kBAAkB4L,EAA6CC,GACpE,IAAI,IAAIvF,EAAIhL,KAAK4O,cAAczM,OAAS,EAAG6I,GAAK,IAAKA,EAAG,CACtD,MAAMwE,EAAMxP,KAAK4O,cAAc5D,GAC/B,GAAGwE,IAAQe,EAAX,CACK,GAAGf,aAAec,EACrB,MAGFtQ,KAAKwQ,qBAAqBhB,KAKvB,OAAOc,GACZ,OAAOtQ,KAAK4O,cAAc6B,KAAKC,GAAKA,aAAaJ,GAG5C,YAAYA,GACjB,QAAStQ,KAAK2Q,OAAOL,GAGb,WAAWnB,EAA6BC,EAAkBC,GAC9DA,GACFN,EAAA,EAAwB6B,aAAa5Q,KAAKiP,gBAAgB,GAG5D,MAAMO,EAAiBL,aAAc,EAAiBA,EAAKnP,KAAKoO,KAAK4B,IAAIb,GACtEK,IACEA,EAAIqB,SACLrB,EAAIqB,UAGHrB,EAAIb,qBACLnD,WAAW,KACTgE,EAAIb,uBAzIU,MA+If,OAAOa,GACRA,EAAIvP,UAAU6Q,gBAChB9Q,KAAK2P,cAAc5F,OAAOyF,EAAIvP,WAE3BuP,EAAI9B,UACL8B,EAAI9B,SAAS1M,iBAAiB,QAAShB,KAAK8O,mB,qBCxJrC,MAAM,EAKnB,YAAY3D,GACVnL,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,eAE7BL,KAAK0C,OAASxC,SAASC,cAAc,UACrCH,KAAK0C,OAAOtC,UAAUC,IAAI,sBAE1BL,KAAKqN,KAAOnN,SAASC,cAAc,QACnCH,KAAKqN,KAAKjN,UAAUC,IAAI,QAAS,mBAEjCL,KAAKC,UAAU8J,OAAO/J,KAAK0C,OAAQ1C,KAAKqN,MAExCrN,KAAKC,UAAUe,iBAAiB,QAAS,MACvC,IAAI,KAAc+P,KAAK/Q,KAAK0C,OAAQyI,KAIjC,QACOnL,KAAK0C,OAAOsO,WAAW,MAC/BC,UAAU,EAAG,EAAGjR,KAAK0C,OAAOhC,MAAOV,KAAK0C,OAAO/B,SCrBxC,MALM,CAACqC,EAAwG,KAC7G,YAAO,mCAAqCA,EAAQwG,UAAY,IAAMxG,EAAQwG,UAAY,IAAKxG,GCSjG,MAAM,UAAuB,EAA5C,c,oBACU,KAAA2I,YAAc,IAAI,GAAY,EAAM,YAAY,EAAM,mCAAmC,GAEzF,KAAAuF,aAAyC,KAKvC,OACRlR,KAAKC,UAAUG,UAAUC,IAAI,uBAC7BL,KAAKmR,SAAS,YAEdnR,KAAKoR,WAAa,IAAI,EAAYC,IAChCrR,KAAKkR,aAAeG,IAGtB,MAAMC,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3BL,KAAKuR,oBAAsB,IAAI,IAAW,CACxCC,MAAO,yBACPC,UAAW,MAGbH,EAAavH,OAAO/J,KAAKuR,oBAAoBtR,WAE7CD,KAAKuR,oBAAoBxP,MAAMf,iBAAiB,QAAS,KACvD,MAAMkB,EAAQlC,KAAKuR,oBAAoBrP,MACvClC,KAAK0R,QAAQtR,UAAUkM,OAAO,eAAgBpK,EAAMC,SAAWnC,KAAKuR,oBAAoBxP,MAAM3B,UAAUuR,SAAS,YAGnH3R,KAAK0R,QAAU,EAAa,CAACrE,KAAM,eAEnCrN,KAAK0R,QAAQ1Q,iBAAiB,QAAS,KACrC,MAAM4M,EAAQ5N,KAAKuR,oBAAoBrP,MAEvClC,KAAK0R,QAAQE,UAAW,EACxB,IAAgBC,WAAWjE,EAAO5N,KAAK8R,QAAQrJ,IAAIxB,GAAUA,EAAO8K,aAAalR,KAAMmR,IAClFhS,KAAKkR,cACNlR,KAAKkR,eAAerQ,KAAMoR,IACxB,IAAgBC,UAAUF,EAAQC,KAItC,GAAezB,qBAAqBxQ,MACpC,GAAemO,UAAU,OAI7B,MAAMgE,EAAiBjS,SAASC,cAAc,OAC9CgS,EAAe/R,UAAUC,IAAI,sBAC7B8R,EAAepI,OAAO/J,KAAK2L,YAAY1L,WAEvCD,KAAK6N,QAAQ9D,OAAO/J,KAAK0R,SACzB1R,KAAK+K,WAAWhB,OAAO/J,KAAKoR,WAAWnR,UAAWqR,EAAca,GAG3D,sBACLnS,KAAK2L,YAAYxB,QACjBnK,KAAKoR,WAAWjH,QAChBnK,KAAKkR,aAAe,KACpBlR,KAAKuR,oBAAoBrP,MAAQ,GACjClC,KAAK0R,QAAQE,UAAW,EAGnB,KAAKE,GACV,MAAMzL,EAASpD,MAAM8N,OAqBrB,OApBA1K,EAAOxF,KAAK,KACVb,KAAK8R,QAAUA,EAEf9R,KAAK8R,QAAQxL,QAAQ8L,IACnB,IAAI,IAACtG,GAAO,GAAkBC,aAAa,CACzCF,OAAQuG,EACRnS,UAAWD,KAAK2L,YAAY/B,KAC5BoC,YAAY,EACZqG,eAAe,EACfpG,WAAY,KAGdH,EAAIwG,gBAAgBvI,OAAO,IAAgBwI,oBAAoBH,MAGjEpS,KAAK2L,YAAY7B,OAAO0I,YAAc,GACtCxS,KAAK2L,YAAY7B,OAAOC,OAAO,eAAK,UAAW,CAAC/J,KAAK8R,QAAQ3P,UAC7DnC,KAAK2L,YAAYzB,cAGZ7D,G,mdCxEX,MAAMoM,GAAwB,MAC5B,IACE,OAAO,eAAcC,UAAUC,UAAUC,MAAM,mBAAmB,GAAK,GACvE,MAAMnG,GACN,OAAO,IAJmB,GA6rB9B,MAAMoG,GAA6B,IArqBnC,MAwBE,cAME,GA5BM,KAAAC,MAAoD,IAAIpD,IACxD,KAAAqD,UAAiD,IAAIrD,IACrD,KAAAsD,aAAoD,IAAItD,IAGxD,KAAAuD,oBAA0E,IAAIvD,IAC9E,KAAAwD,6BAAkF,IAAIxD,IACtF,KAAAyD,wBAAoE,GAUpE,KAAAC,QAAU,EACV,KAAAC,QAAS,EACT,KAAAC,cAAgB,EA2EjB,KAAAC,aAAgBC,IACrB,MAAMV,EAAQ9S,KAAKyT,aAChBX,IACDA,EAAMY,YAAcrR,KAAKP,IAAI,EAAGgR,EAAMY,aAAeF,EAAQG,YAnH/C,OAuHX,KAAAC,YAAeJ,IACpB,MAAMV,EAAQ9S,KAAKyT,aAChBX,IACDA,EAAMY,YAAcrR,KAAKC,IAAIwQ,EAAMe,SAAUf,EAAMY,aAAeF,EAAQG,YA1H5D,OA8HX,KAAAG,OAAUN,IACf,MAAMV,EAAQ9S,KAAKyT,aAChBX,IACDA,EAAMY,YAAcF,EAAQO,WA4GxB,KAAAC,oBAAuBlB,IAC7B,MAAMU,EAAUxT,KAAKgT,aAAahD,IAAI8C,GAChCmB,EAAM,IAAeC,OAAOV,EAAQW,OAC1B,UAAbF,EAAI9Q,MAAoB8Q,EAAIG,mBAAqB3B,IAClDzS,KAAKqU,uBAAuBvB,GAI9B,MAAMwB,EAAeC,GAAA,EAAmBC,gBAAgBP,GACxDnB,EAAM2B,IAAMH,EAAaI,IAGzB,MAAMC,EAAM3U,KAAKmT,wBAAwBc,EAAI9E,IAC1CwF,IACDA,EAAItG,OAAOyE,GAEP6B,EAAI7U,aACCE,KAAKmT,wBAAwBc,EAAI9E,MA4KtC,KAAAyF,OAAU3S,IAChB,MAAM6Q,EAAQ7Q,EAAE4S,OACVrB,EAAUxT,KAAKgT,aAAahD,IAAI8C,IAChC,OAAC7L,EAAM,IAAEJ,GAAO2M,EAIhBpP,EAAUpE,KAAK8U,kBAAkBhC,GAGvC,GADsB9S,KAAKyT,eACNX,EAAO,CAC1B9S,KAAKyC,OAEL,MAAMsS,EAAUC,GAAuBA,EAAQnO,MAAQA,GAAOmO,EAAQ/N,SAAWA,EACjF,IAAIjH,KAAKiV,WAAW7P,UAAY2P,EAAO/U,KAAKiV,WAAW7P,SAAU,CAC/D,IACI8P,EADA7Q,EAAMrE,KAAKiV,WAAWrQ,SAASuQ,UAAUJ,IAEjC,IAAT1Q,EACD6Q,IAAelV,KAAKiV,WAAWrQ,SAASzC,OAASkC,IAEjDA,EAAMrE,KAAKiV,WAAWpQ,KAAKsQ,UAAUJ,IACzB,IAAT1Q,IACD6Q,EAAa7Q,EAAM,KAIX,IAATA,EACE6Q,GACDlV,KAAKiV,WAAWG,GAAGF,GAAY,GAGjClV,KAAKqV,WAAW,CAACpO,SAAQJ,QAI7B7G,KAAKsV,SAASxC,EAAO1O,GAIvBoH,WAAW,KACT5C,EAAA,QAAU6F,cAAc,aAAc,CAACwF,IAAK,IAAmBsB,oBAAoBnR,GAAUA,UAAS0O,WACrG,IAGG,KAAA0C,QAAWvT,IAQjB2G,EAAA,QAAU6F,cAAc,gBAGlB,KAAAgH,QAAWxT,IACbA,EAAEyT,YAIN1V,KAAKwV,QAAQvT,GAITjC,KAAK6E,SACP7E,KAAKyC,OACLmG,EAAA,QAAU6F,cAAc,iBA0BrB,KAAAhN,KAAO,IACLzB,KAAKsM,QAAO,GAGd,KAAAlL,MAAQ,IACNpB,KAAKsM,QAAO,GAGd,KAAA7J,KAAO,KACZ,MAAMqQ,EAAQ9S,KAAKyT,aACnB,IAAIX,EACF,OAAO,EAGLA,EAAM6C,QACR7C,EAAM1R,QAGR0R,EAAMY,YAAc,EACpB,aAAcZ,EAAO,SAErB,MAAMU,EAAUxT,KAAKgT,aAAahD,IAAI8C,GACtC,GAAGU,aAAO,EAAPA,EAASoC,MAAO,CACjB9C,EAAM2B,IAAM,GACZ,MAAMxN,EAASuM,EAAQvM,OACjB4O,EAAIrC,EAAQ1K,YAAc9I,KAAK+S,UAAY/S,KAAK8S,MAChDjK,EAAUgN,EAAE7F,IAAI/I,GACnB4B,IACDA,EAAQwF,OAAOmF,EAAQ3M,KAEnBgC,EAAQ/I,MACV+V,EAAExH,OAAOpH,IAIb6L,EAAMnR,SAEN3B,KAAKgT,aAAa3E,OAAOyE,GAK3B,OAFA9S,KAAKyT,kBAAe/O,GAEb,GAGF,KAAAoR,SAAYrQ,IACjB,MAAM,OAACwB,EAAM,IAAEJ,GAAOpB,EAChBqD,EAAc9I,KAAKgH,cAAc8B,YACzB9I,KAAK+V,SAAS9O,EAAQJ,EAAKiC,GAMnCrH,OAEN+J,WAAW,KACTxL,KAAKgW,2BAA2B/O,EAAQJ,EAAKiC,IAC5C,IAGE,KAAAjE,KAAO,KACJ7E,KAAKiW,iBAAmBjW,KAAKiV,WAAWG,GAAG,GAG9C,KAAAxQ,SAAW,KAChB,MAAMkO,EAAQ9S,KAAKyT,aACnB,OAAGX,IAAUA,EAAMY,YAAc,IAAM1T,KAAKiV,WAAWrQ,SAASzC,SAC9D2Q,EAAMY,YAAc,OACpB1T,KAAKsM,QAAO,KAINtM,KAAKiW,iBAAmBjW,KAAKiV,WAAWG,IAAI,IAtiBpDpV,KAAKC,UAAYC,SAASC,cAAc,OAExCH,KAAKC,UAAU0C,MAAMuT,QAAU,iBAC/BhW,SAASiW,KAAKpM,OAAO/J,KAAKC,WAEvByS,UAAU0D,aAAc,CACzB,MAAMC,EAAwE,CAC5E5U,KAAMzB,KAAKyB,KACXL,MAAOpB,KAAKoB,MACZqB,KAAMzC,KAAKyC,KACX6T,aAActW,KAAKuT,aACnBgD,YAAavW,KAAK4T,YAClB4C,OAAQxW,KAAK8T,OACb2C,cAAezW,KAAK4E,SACpB8R,UAAW1W,KAAK6E,MAGlB,IAAI,MAAMN,KAAU8R,EAClB,IACE3D,UAAU0D,aAAaO,iBAAiBpS,EAA8B8R,EAAQ9R,IAC9E,MAAMkI,GACNC,QAAQkK,KAAK,wCAAyCrS,IAK5DqE,EAAA,QAAU5H,iBAAiB,sBAAwBiT,IACjD,MAAMU,EAAM3U,KAAKmT,wBAAwBc,EAAI9E,IAC7C,GAAGwF,EACD,IAAI,MAAM7B,KAAS6B,EACjB3U,KAAKgU,oBAAoBlB,KAK/B,MAAM+D,EAAuD,GAChD,CACX,SACA,QACA,gBAEGvQ,QAAQiI,IACX,MAAMuI,EAAQ,IAAMvI,EACpBsI,EAAWtI,GAAO,CAChByB,IAAK,IAAMhQ,KAAK8W,GAChBnC,IAAMzS,IACDlC,KAAK8W,KAAU5U,IAKlBlC,KAAK8W,GAAQ5U,EACVlC,KAAKyT,eAENzT,KAAKyT,aAAalF,GAAOrM,GAG3BlC,KAAK+W,8BAIXC,OAAOC,iBAAiBjX,KAAM6W,GAGxB,yBACN,MAAM,OAACK,EAAM,MAAEC,EAAK,aAAEC,GAAgBpX,KACtC4I,EAAA,QAAU6F,cAAc,wBAAyB,CAC/CyI,SAAQC,QAAOC,iBAyBZ,SAAShT,EAA0BiT,EAAmBzB,GAC3D,MAAM,OAAC3O,EAAM,IAAEJ,GAAOzC,EAGhByR,IADgBzR,EAAQkT,OAAOC,aACbvX,KAAK+S,UAAY/S,KAAK8S,MAC9C,IAAIjK,EAAUgN,EAAE7F,IAAI5L,EAAQ6C,QACxB4B,GACFgN,EAAElB,IAAIvQ,EAAQ6C,OAAQ4B,EAAU,IAAI6G,KAGtC,IAAIoD,EAAQjK,EAAQmH,IAAInJ,GACxB,GAAGiM,EACD,OAAOA,EAGT,MAAMmB,EAAkB,IAAmBsB,oBAAoBnR,GAC/DyE,EAAQ8L,IAAI9N,EAAKiM,EAAQ5S,SAASC,cAA2B,UAAb8T,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,KAAmB,QAAU,UAIzF,UAAb8Q,EAAI9Q,MACL2P,EAAM1P,aAAa,cAAe,QAIpC,MAAMoQ,EAAwB,CAC5BvM,SACAJ,MACAsN,MAAOF,EAAI9E,GACXyG,QACA9M,YAAa1E,EAAQkT,OAAOC,cAG9BvX,KAAKgT,aAAa2B,IAAI7B,EAAOU,GAG7BV,EAAMoE,OAAS,EAGflX,KAAKC,UAAU8J,OAAO+I,GAEtBA,EAAM9R,iBAAiB,OAAQhB,KAAK4U,QACpC9B,EAAM9R,iBAAiB,QAAShB,KAAKwV,SACrC1C,EAAM9R,iBAAiB,QAAShB,KAAKyV,SAErB,UAAbxB,EAAI9Q,OAAoBiB,aAAO,EAAPA,EAASkT,OAAOE,eAAgBpT,EAAQwH,SAAWhD,EAAA,QAAU6O,MACtF3E,EAAM9R,iBAAiB,aAAc,KACnC,IAAmB0W,aAAazQ,EAAQ,CAACJ,KACxC,CAAC8Q,MAAM,IAiBZ,MAAMC,EAAW,eACjB,GAAGP,EACDO,EAAS3R,cACJ,CACL,MAAM4R,EAAIzT,EAAQkT,OAAOC,aAAevX,KAAKkT,6BAA+BlT,KAAKiT,oBACjF,IAAI6E,EAAiBD,EAAE7H,IAAI/I,GACvB6Q,GACFD,EAAElD,IAAI1N,EAAQ6Q,EAAiB,IAAIpI,KAGrCoI,EAAenD,IAAI9N,EAAK+Q,GAqB1B,OAlBAA,EAAS/W,KAAK,KAIZ,MAAMyT,EAAeC,GAAA,EAAmBC,gBAAgBP,GACxD,GAAGA,EAAIG,mBAAqBE,EAAaI,IACvC1U,KAAKgU,oBAAoBlB,OACpB,CACL,IAAI6B,EAAM3U,KAAKmT,wBAAwBc,EAAI9E,IACvCwF,IACFA,EAAM3U,KAAKmT,wBAAwBc,EAAI9E,IAAM,IAAItL,KAGnD8Q,EAAItU,IAAIyS,GACR,IAAeiF,YAAY9D,MAIxBnB,EAGF,SAAS7L,EAAgBJ,EAAaiC,GAC3C,MAAM+M,GAAK/M,EAAc9I,KAAK+S,UAAY/S,KAAK8S,OAAO9C,IAAI/I,GAC1D,OAAO4O,aAAC,EAADA,EAAG7F,IAAInJ,GA2BR,uBAAuBiM,GAC7BA,EAAM9R,iBAAiB,OAAQ,KAM7B,MAAM0S,EAAcZ,EAAMY,YAG1BZ,EAAM9R,iBAAiB,WAAY,KACjC8R,EAAMY,YAAcZ,EAAMe,SAAW,EAErCf,EAAM9R,iBAAiB,WAAY,KACjC8R,EAAMY,YAAcA,EAIhBZ,EAAM6C,QACR7C,EAAMrR,QAEP,CAACkW,MAAM,KACT,CAACA,MAAM,MAIP,2BAA2B1Q,EAAgBJ,EAAaiC,GAC7D,MAAM+O,EAAI/O,EAAc9I,KAAKkT,6BAA+BlT,KAAKiT,oBAC3DpK,EAAUgP,EAAE7H,IAAI/I,GACtB,IAAI4B,EACF,OAGF,MAAM1C,EAAU0C,EAAQmH,IAAInJ,GACzBV,IACDA,EAAQF,UACR4C,EAAQwF,OAAOxH,GAEXgC,EAAQ/I,MACV+X,EAAExJ,OAAOpH,IAQR,kBAAkB6L,GAEvB,QAASA,EAAMkF,gBAGT,mBAAmBlF,EAAyB5Q,GAElD4Q,EAAMkF,gBAAkB9V,EAGZ,gBAAgBkC,EAA0BqP,EAAezT,KAAKyT,c,sDACpE,aAAYA,OAAc/O,GAAW,GAE3C,MAAMuP,EAAM,IAAmBsB,oBAAoBnR,GAE7C6T,EAAwB,GAExBC,EAAuB,UAAbjE,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,KAC5C,IAAIyK,EAAQ,GAAIuK,EAAS,GAEzB,GAAa,QAAV,EAAAlE,EAAImE,cAAM,eAAEjW,OAAQ,CACrB,MAAMrC,EAAOmU,EAAImE,OAAOnE,EAAImE,OAAOjW,OAAS,GAC5C,IAAKrC,EAAqCuY,MAAO,CAC/C,MAAM/D,EAAeC,GAAA,EAAmBC,gBAAgBP,EAAKnU,EAAKqD,MAElE,GAAGmR,EAAaI,IACduD,EAAQtS,KAAK,CACX8O,IAAKH,EAAaI,IAClB4D,MAAO,GAAIxY,EAA6B+X,KAAM/X,EAA6ByY,IAC3EpV,KAAM,mBAEH,CACY,IAAiBqV,aAAavE,EAAKnU,GAC3Ce,KAAK,KACTb,KAAKyT,eAAiBA,GAAiBa,EAAaI,KAIvD1U,KAAKyY,gBAAgBrU,YAItB,GAAG8T,EAAS,CACjB,MAAMjR,EAAS7C,EAAQwH,QAAUxH,EAAQ6C,OACnCyR,EAAY,IAAgBC,aAAa1R,GAC/C,GAAGyR,EAAW,CACZ,MAAMrS,EAASuS,EAAA,EAAkBC,WAAW5R,EAAQyR,EAAW,eAC/D,GAAGrS,EAAOyS,OAAQ,CAChB,MAAMpE,QAAYrO,EAAO/F,YACzB2X,EAAQtS,KAAK,CACX8O,IAAKC,EACL4D,MAAO,UACPnV,KAAM,oBAGRkD,EAAO/F,YAAYO,KAAM6T,IACpB1U,KAAKyT,eAAiBA,GAAiBiB,GAI1C1U,KAAKyY,gBAAgBrU,KAK3BwJ,EAAQ,IAAgBmL,aAAa9R,GAAQ,GAAM,GACnDkR,EAAS,UAAKa,OAAoB,UAAb/E,EAAI9Q,KAAmB,cAAgB,eAAe,GAG7E,IAAI+U,EAAS,CACX,MAAMe,EAAYhF,EAAIiF,WAAWzI,KAAKwI,GAA6B,2BAAhBA,EAAU7R,GAC7DwG,EAAQqL,GAAaA,EAAUrL,OAASqG,EAAIkF,UAC5ChB,EAASc,GAAaA,EAAUG,UAG9BnB,EAAQ9V,SACP,YACE,sBACD8V,EAAQtS,KAAK,CACX8O,IAAK,8CACL6D,MAAO,UACPnV,KAAM,cAGR8U,EAAQtS,KAAK,CACX8O,IAAK,kCACL6D,MAAO,UACPnV,KAAM,cAIV,CAAC,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,KAAKmD,QAAQxG,IACxC,MAAMwY,EAAQ,GAAGxY,KAAQA,IACzBmY,EAAQtS,KAAK,CACX8O,IAAK,6BAA6B6D,QAClCA,QACAnV,KAAM,iBAMd,MAAMkW,EAAW,IAAIC,cAAc,CACjC1L,QACAuK,SACAF,YAGFvF,UAAU0D,aAAaiD,SAAWA,KAG5B,kBAAkBvG,GACxB,MAAMU,EAAUxT,KAAKgT,aAAahD,IAAI8C,IAChC,OAAC7L,EAAM,IAAEJ,GAAO2M,EAEtB,OADgBA,EAAQ1K,YAAc,IAAmByQ,0BAA0BtS,EAAQJ,GAAO,IAAmB2S,iBAAiBvS,EAAQJ,GA0EzI,OAAOpF,GACZ,QAAIzB,KAAKyT,oBAIG/O,IAATjD,IACDA,EAAOzB,KAAKyT,aAAakC,QAGxB3V,KAAKyT,aAAakC,SAAWlU,IAI7BA,EACDzB,KAAKyT,aAAahS,OAElBzB,KAAKyT,aAAarS,SAGb,IA+EF,aAAa0R,GAClB9S,KAAKyZ,kBAAoB3G,EAGpB,iBAAiB5J,GACtB,OAAG,YAAUlJ,KAAKgH,cAAekC,KAIjClJ,KAAKgH,cAAgB,YAAKkC,IACnB,GAGF,mBACL,OAAOlJ,KAAKgH,cAGP,WAAW5B,EAAoBsU,EAAoB7U,GACpD7E,KAAKiV,WAiBPjV,KAAKiV,WAAW7L,QAhBhBpJ,KAAKiV,WAAa,IAAI,EAAiB,CACrClQ,UAAW,GACXC,aAAc,EACdyB,YAAcrC,IACZpE,KAAK2Z,SAASvV,GAAS,GAChB,CAAC6C,OAAQ7C,EAAQ6C,OAAQJ,IAAKzC,EAAQyC,MAE/Cd,OAAQ,CAACN,EAAMO,KACbhG,KAAK8V,SAASrQ,IAEhBoC,UAAW,KACTe,EAAA,QAAU6F,cAAc,cACxBzO,KAAKyC,UAOX,MAAMqC,OAA0CJ,IAAhC1E,KAAKgH,cAAcgB,SAChC0R,EACD1Z,KAAKiV,WAAWI,WAAWqE,EAAM7U,EAAMC,GAEvC9E,KAAKiV,WAAWnQ,QAAUA,EAG5B9E,KAAKiV,WAAW2E,iBAAiB5Z,KAAKgH,eACtChH,KAAKiV,WAAW7P,QAAUA,EAE1BpF,KAAKiV,WAAWnP,MAAK,GACrB9F,KAAKiV,WAAWnP,MAAK,GAGhB,SAASgN,EAAyB1O,GACvCpE,KAAKyT,aAAeX,EACpB9S,KAAKyT,aAAayD,OAASlX,KAAKkX,OAChClX,KAAKyT,aAAa0D,MAAQnX,KAAKmX,MAC/BnX,KAAKyT,aAAa2D,aAAepX,KAAKoX,aAEnC,iBAAkB1E,WACnB1S,KAAKyY,gBAAgBrU,GAIlB,eAAe0O,EAA0B1O,GAC9C,MAAMqP,EAAezT,KAAKyT,aAEpBoG,EAAa7Z,KAAKoB,QAOxB,OALApB,KAAK8Z,kBAAapV,GACfoO,EAAO9S,KAAKsV,SAASxC,EAAO1O,GAC1BpE,KAAKyT,kBAAe/O,EACzB1E,KAAK+Z,iBAAgB,GAEd,KACL/Z,KAAK+Z,iBAAgB,GAElBtG,IACEzT,KAAKgT,aAAahD,IAAIyD,GACvBzT,KAAKsV,SAAS7B,EAAczT,KAAK8U,kBAAkBrB,IAEnDzT,KAAK6E,QAAU7E,KAAK4E,YAIrBkO,GAAS9S,KAAKyT,eAAiBX,GAChC9S,KAAKyC,OAGJoX,GACD7Z,KAAKyB,QAKJ,gBAAgBuY,GACrBha,KAAKiW,iBAAmB+D,IAK5B,KAAenH,2BAA6BA,GAC7B,U,UCxtBA,SAASoH,GAAoBjF,EAC1CkF,EACAC,EACAC,GAEA,MAAMC,EAAeC,IACnBH,EAAO,CAACI,EAAGD,EAAME,MAAOC,EAAGH,EAAMI,MAAOJ,WAGpCK,EAAaL,IACjBpa,SAASmJ,oBAAoB,YAAagR,GAC1CrF,EAAQhU,iBAAiB,YAAa4Z,EAAa,CAACjD,MAAM,IAC1DyC,GAASA,EAAM,CAACG,EAAGD,EAAME,MAAOC,EAAGH,EAAMI,MAAOJ,WAG5CM,EAAeN,IACC,IAAjBA,EAAMO,QAKTX,EAAQ,CAACK,EAAGD,EAAME,MAAOC,EAAGH,EAAMI,MAAOJ,UACzCD,EAAYC,GAEZpa,SAASc,iBAAiB,YAAaqZ,GACvCna,SAASc,iBAAiB,UAAW2Z,EAAW,CAAChD,MAAM,KARrD3C,EAAQhU,iBAAiB,YAAa4Z,EAAa,CAACjD,MAAM,KAW9D3C,EAAQhU,iBAAiB,YAAa4Z,EAAa,CAACjD,MAAM,IAG1D,MAAMmD,EAAeR,IACnBA,EAAMS,iBACNZ,EAAO,CAACI,EAAGD,EAAMU,QAAQ,GAAGC,QAASR,EAAGH,EAAMU,QAAQ,GAAGE,QAASC,SAAS,EAAMb,WAG7Ec,EAAcd,IAClBpa,SAASmJ,oBAAoB,YAAayR,GAC1C9F,EAAQhU,iBAAiB,aAAcqa,EAAc,CAACC,SAAS,EAAO3D,MAAM,IAC5EyC,GAASA,EAAM,CAACG,EAAGD,EAAMU,QAAQ,GAAGC,QAASR,EAAGH,EAAMU,QAAQ,GAAGE,QAASC,SAAS,EAAMb,WAGrFe,EAAgBf,IACpBJ,EAAQ,CAACK,EAAGD,EAAMU,QAAQ,GAAGC,QAASR,EAAGH,EAAMU,QAAQ,GAAGE,QAASC,SAAS,EAAMb,UAClFQ,EAAYR,GAEZpa,SAASc,iBAAiB,YAAa8Z,EAAa,CAACQ,SAAS,IAC9Dpb,SAASc,iBAAiB,WAAYoa,EAAY,CAACE,SAAS,EAAO3D,MAAM,KAK3E,OAFA3C,EAAQhU,iBAAiB,aAAcqa,EAAc,CAACC,SAAS,EAAO3D,MAAM,IAErE,KACL3C,EAAQ3L,oBAAoB,YAAauR,GACzC1a,SAASmJ,oBAAoB,YAAagR,GAC1Cna,SAASmJ,oBAAoB,UAAWsR,GAExC3F,EAAQ3L,oBAAoB,aAAcgS,GAC1Cnb,SAASmJ,oBAAoB,YAAayR,GAC1C5a,SAASmJ,oBAAoB,WAAY+R,ICzD9B,MAAM,GAyBnB,YACEpY,EAQAd,EAAQ,GA7BH,KAAAqZ,WAAY,EAIX,KAAAC,OAKH,GAOK,KAAAC,gBAAiB,EACjB,KAAAC,cAAe,EACf,KAAAC,UAAW,EA0DX,KAAAtB,YAAeC,IACvBta,KAAK4b,MAAMtB,IAGH,KAAAM,YAAeN,I,MACvBta,KAAK6b,KAAO7b,KAAKC,UAAU6b,wBAC3B9b,KAAKub,WAAY,EACjBvb,KAAK4b,MAAMtB,GACXta,KAAKC,UAAUG,UAAUC,IAAI,eAClB,QAAX,EAAAL,KAAKwb,cAAM,eAAEZ,cAAe5a,KAAKwb,OAAOZ,YAAYN,IAG5C,KAAAK,UAAaL,I,MACrBta,KAAKub,WAAY,EACjBvb,KAAKC,UAAUG,UAAUuB,OAAO,eACrB,QAAX,EAAA3B,KAAKwb,cAAM,eAAEb,YAAa3a,KAAKwb,OAAOb,UAAUL,IAQ3C,KAAAvN,QAAU,K,MACf,MAAM7K,GAASlC,KAAK+b,KAAK7Z,MACzBlC,KAAKgc,UAAU9Z,IACJ,QAAX,EAAAlC,KAAKwb,cAAM,eAAES,UAAWjc,KAAKwb,OAAOS,QAAQ/Z,IAvE5C,YAAWlC,KAAMgD,GAEjBhD,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,iBAG1BL,KAAK0b,aACN1b,KAAKC,UAAUG,UAAUC,IAAI,iBACrBL,KAAKyb,gBACbzb,KAAKC,UAAUG,UAAUC,IAAI,mBAG/BL,KAAKkc,OAAShc,SAASC,cAAc,OACrCH,KAAKkc,OAAO9b,UAAUC,IAAI,yBAE1B,MAAM0b,EAAO/b,KAAK+b,KAAO7b,SAASC,cAAc,SAChD4b,EAAK3b,UAAUC,IAAI,uBAEnB0b,EAAK5Y,KAAO,QACZ4Y,EAAKI,KAAO,GAAKnc,KAAKmc,KACtBJ,EAAKzZ,IAAM,GAAKtC,KAAKsC,IACrByZ,EAAKja,IAAM,GAAK9B,KAAK8B,IACrBia,EAAK7Z,MAAQ,GAAKA,EAEfA,GACDlC,KAAKoc,YAAYla,GAGnB,MAAMma,EAAU,GAAKrc,KAAKmc,KACpBG,EAAQD,EAAQE,QAAQ,KAC9Bvc,KAAKwc,UAAsB,IAAXF,EAAe,EAAID,EAAQla,OAASma,EAAQ,EAI5Dtc,KAAKC,UAAU8J,OAAO/J,KAAKkc,OAAQH,GAGrC,YACE,OAAQ/b,KAAK+b,KAAK7Z,MAGb,YAAYsZ,GACjBxb,KAAKwb,OAASA,EAqBT,eACLxb,KAAK+b,KAAK/a,iBAAiB,QAAShB,KAAK+M,SACzC/M,KAAKyc,iBAAmBxC,GAAoBja,KAAKC,UAAWD,KAAK4a,YAAa5a,KAAKqa,YAAara,KAAK2a,WAShG,YAAYzY,GACjBlC,KAAK+b,KAAK7Z,MAAQ,GAAKA,EACvBlC,KAAKgc,WAAWhc,KAAK+b,KAAK7Z,OAGrB,YAAYA,GACjBlC,KAAK+b,KAAK7Z,MAAQ,KAAOlC,KAAK+b,KAAK7Z,MAAQA,GAC3ClC,KAAKgc,WAAWhc,KAAK+b,KAAK7Z,OAGrB,UAAUA,GACf,IAAIwa,GAAYxa,EAAQlC,KAAKsC,MAAQtC,KAAK8B,IAAM9B,KAAKsC,KACrDoa,EAAW,YAAMA,EAAU,EAAG,GAG3B1c,KAAK0b,aACN1b,KAAKkc,OAAOvZ,MAAMga,UAAY,UAAUD,KAExC1c,KAAKkc,OAAOvZ,MAAMjC,MAAoB,IAAXgc,EAAkB,IAIvC,MAAMpC,G,MACd,MAAMsC,EAAU5c,KAAK2b,SAAW3b,KAAK6b,KAAKlb,OAASX,KAAK6b,KAAKnb,MACvDmc,EAAkB,YAAM7c,KAAK2b,WAAarB,EAAMG,EAAIza,KAAK6b,KAAKiB,QAAUxC,EAAMC,EAAIva,KAAK6b,KAAKkB,KAAM,EAAGH,GAE3G,IAAI1a,EAAQlC,KAAKsC,IAAOua,EAAkBD,GAAW5c,KAAK8B,IAAM9B,KAAKsC,KAerE,OAbIJ,EAAQlC,KAAKsC,KAAStC,KAAK8B,IAAM9B,KAAKsC,KAAO,IAC/CJ,GAASlC,KAAKmc,KAAO,IAGvBja,GAASA,EAAM8a,QAAQhd,KAAKwc,UAC5Bta,EAAQ,YAAMA,EAAOlC,KAAKsC,IAAKtC,KAAK8B,KAKpC9B,KAAKoc,YAAYla,IACN,QAAX,EAAAlC,KAAKwb,cAAM,eAAES,UAAWjc,KAAKwb,OAAOS,QAAQ/Z,GAErCA,EAGF,kBACFlC,KAAKyc,mBACNzc,KAAKyc,mBACLzc,KAAKyc,iBAAmB,MAG1Bzc,KAAK+b,KAAK1S,oBAAoB,QAASrJ,KAAK+M,SAE5C/M,KAAKwb,OAAS,IChJlB,MAAMyB,GAAkBja,IACtB,GAAGA,EAAQgS,QAAS,OAAOhS,EAAQgS,QAEnC,MAAM,KAAC3H,EAAI,KAAE6P,EAAI,QAAEC,EAAO,cAAEC,EAAa,wBAAEC,GAA2Bra,EAChE+M,EAAK7P,SAASC,cAAc,OAClC4P,EAAGvG,UAAY,iBAAmB6D,EAAO,UAAYA,EAAO,IAC5D,OAAAiQ,GAAA,QAAOvN,GAEP,IAAIwN,EAAcva,EAAQua,YACtBA,IACFA,EAAcva,EAAQua,YAAcL,EAAO,eAAKA,GAAQhd,SAASC,cAAc,QAC5E6C,EAAQwa,cAAaD,EAAYtZ,UAAYjB,EAAQwa,cAG1DD,EAAYnd,UAAUC,IAAI,sBAC1B0P,EAAGhG,OAAOwT,GAEV,MAAME,IAAaL,KAAmBpa,EAAQya,SAwB9C,OArBA,YAAiB1N,EAAsD9N,IACrE,OAAAyb,EAAA,GAAYzb,IAGE,IAFCkb,EAAQlb,KAMnBwb,GACF,eAGCL,IAAkBC,IACnBD,EAAcO,QAAuC,UAA7BP,EAAcrb,MAAMoB,OAA2Bia,EAAcO,WAEtE3a,EAAQA,SAExBoa,GACDrN,EAAGhG,OAAOqT,EAAc5L,OAGnBxO,EAAQgS,QAAUjF,GAwBZ,OArBI,CAAC6N,EAAkC7P,KACpD,MAAMgC,EAAK7P,SAASC,cAAc,OAClC4P,EAAG3P,UAAUC,IAAI,YAEd0N,GACD6P,EAAQtX,QAAQiC,IACXA,EAAEvF,QACHuF,EAAEvF,QAAQ+K,eAAiBA,EAE3BxF,EAAEvF,QAAU,CAAC+K,oBAKnB,MAAMvI,EAAQoY,EAAQnV,IAAIwU,IAI1B,OAFAlN,EAAGhG,UAAUvE,GAENuK,GC7ET,MAYM8N,GAA0B,CAAC9N,EAAiBE,EAA6BjN,OACjEA,aAAO,EAAPA,EAAS+K,gBAAiB/K,EAAQ+K,eAAe1N,IAAI0P,GAAMA,EAAG/O,iBAAiBuF,KAAKwJ,IAG5F,IAAmB9N,IAErB,IAAI8N,EAAG3P,UAAUuR,SAAS,mBAAoB,OAAO,EAGrD,MAAMmM,EAAa/N,EAAGF,cAAc,aACpC,OAAA6N,EAAA,GAAYzb,GAET8N,EAAG3P,UAAUuR,SAAS,aACvB,gBAEA1B,GAAUA,EAAOhO,GACjB,aAAY6b,OAMH,OAlCU,CAAC9a,EAAuG,GAAI9B,EAAsE0c,EAAkC3N,KAC3OjN,EAAQ+a,OAAQ,EAChB,MAAMlD,EAAS,EAAW,uBAAwB7X,GAE5Cgb,EAAU,GAAWJ,EAAS5a,EAAQ+K,gBAI5C,OAHAiQ,EAAQ5d,UAAUC,IAAIa,GACtB2c,GAAwBhD,EAAQ5K,EAAQjN,GACxC6X,EAAO9Q,OAAOiU,GACPnD,G,QCAF,MAAM,WAA0B,GAQrC,YAAY/H,EAA6CmL,EAAsBxC,EAA0BC,GACvGzY,MAAM,CACJkZ,KAAM,IAAO,GAAK,IAClB7Z,IAAK,EACLR,IAAK,EACL2Z,iBACAC,gBACC,GAZK,KAAAwC,YAAc,EAuDd,KAAAC,aAAe,KACvBne,KAAK8B,IAAM9B,KAAK8S,MAAMe,SACtB7T,KAAK+b,KAAK3Y,aAAa,MAAO,GAAKpD,KAAK8B,MAGhC,KAAA2T,QAAU,KAClBzV,KAAKoc,eAGG,KAAAxH,OAAS,KACjB,IAAIwJ,EAAI,KACNpe,KAAKoc,cAELpc,KAAKke,YAAcle,KAAK8S,MAAM6C,OAAS,EAAIpK,OAAO8S,sBAAsBD,IAGvEpe,KAAKke,aACN3S,OAAO+S,qBAAqBte,KAAKke,aAGhCle,KAAKie,YACNje,KAAKue,kBAGPve,KAAKke,YAAc3S,OAAO8S,sBAAsBD,IAGxC,KAAAI,aAAe,KACpBxe,KAAK8S,MAAM6C,SACZ3V,KAAKoc,cAEFpc,KAAKie,YACNje,KAAKue,oBAKD,KAAAE,WAAcxc,IACtBjC,KAAKue,mBA/EFzL,GACD9S,KAAKsV,SAASxC,EAAOmL,GAIlB,SAASnL,EAAyBmL,GAAa,GACjDje,KAAK8S,OACN9S,KAAK0e,kBAGJT,IAAeje,KAAK2e,YACrB3e,KAAK2e,WAAaze,SAASC,cAAc,OACzCH,KAAK2e,WAAWve,UAAUC,IAAI,wBAAyB,yBACvDL,KAAKC,UAAU2e,QAAQ5e,KAAK2e,aAEpB3e,KAAK2e,YACb3e,KAAK2e,WAAWve,UAAUkM,OAAO,QAAS2R,GAG5Cje,KAAK8S,MAAQA,EACb9S,KAAKie,WAAaA,IACdnL,EAAM6C,QAAU7C,EAAMY,YAAc,IACtC1T,KAAK4U,SAGP,IAAIiF,GAAa,EACjB7Z,KAAK6e,aACL7e,KAAK8e,eACL9e,KAAK+e,YAAY,CACfnE,YAAa,KACXf,GAAc7Z,KAAK8S,MAAM6C,OACzBkE,GAAc7Z,KAAK8S,MAAM1R,SAG3BuZ,UAAY1Y,IAEV4X,GAAc7Z,KAAK8S,MAAMrR,UA8CrB,MAAMQ,GACd,MAAM+c,EAAY/b,MAAM2Y,MAAM3Z,GAE9B,OADAjC,KAAK8S,MAAMY,YAAcsL,EAClBA,EAGC,kBACR,GAAG,GAA2BC,kBAAkBjf,KAAK8S,OAAQ,OAC7D,MAAMoM,EAAMlf,KAAK8S,MAAMqM,SACjBC,EAAYF,EAAI/c,OAEhBuR,EAAc1T,KAAK8S,MAAMY,YAC/B,IAAI2L,EAAe,EAAGC,EAAM,EAC5B,IAAI,IAAItU,EAAI,EAAGA,EAAIoU,IAAapU,EAAG,CACjC,MAAMuU,EAAQL,EAAIK,MAAMvU,GACrB0I,GAAe6L,GAASA,GAASF,IAClCA,EAAeE,EACfD,EAAMJ,EAAII,IAAItU,IAQlB,MAAM0R,EAAW1c,KAAK8S,MAAMe,SAAWyL,EAAMtf,KAAK8S,MAAMe,SAAW,EACnE7T,KAAK2e,WAAWhc,MAAMjC,MAAoB,IAAXgc,EAAkB,IAIzC,aACR1c,KAAK8B,IAAM9B,KAAK8S,MAAMe,UAAY,EAC/B7T,KAAK8B,IAAM,EACZ9B,KAAKme,eAELne,KAAK8S,MAAM9R,iBAAiB,aAAchB,KAAKme,cAI5C,cACL,GAAG,GAA2Bc,kBAAkBjf,KAAK8S,OAAQ,OAC7D,MAAMY,EAAc1T,KAAK8S,MAAMY,YAE/BzQ,MAAMmZ,YAAY1I,GAGb,eACLzQ,MAAM6b,eACN9e,KAAK8S,MAAM9R,iBAAiB,QAAShB,KAAKyV,SAC1CzV,KAAK8S,MAAM9R,iBAAiB,OAAQhB,KAAK4U,QACzC5U,KAAK8S,MAAM9R,iBAAiB,aAAchB,KAAKwe,cAC/Cxe,KAAKie,YAAcje,KAAK8S,MAAM9R,iBAAiB,WAAYhB,KAAKye,YAG3D,kBACLxb,MAAMyb,kBAEN1e,KAAK8S,MAAMzJ,oBAAoB,aAAcrJ,KAAKme,cAClDne,KAAK8S,MAAMzJ,oBAAoB,QAASrJ,KAAKyV,SAC7CzV,KAAK8S,MAAMzJ,oBAAoB,OAAQrJ,KAAK4U,QAC5C5U,KAAK8S,MAAMzJ,oBAAoB,aAAcrJ,KAAKwe,cAClDxe,KAAKie,YAAcje,KAAK8S,MAAMzJ,oBAAoB,WAAYrJ,KAAKye,YAEhEze,KAAKke,cACN3S,OAAO+S,qBAAqBte,KAAKke,aACjCle,KAAKke,YAAc,IAKlB,MAAM,WAAuB,GAIlC,YAAsBnQ,EAA0C4N,GAAW,GACzE1Y,MAAM,CACJkZ,KAAM,IACN7Z,IAAK,EACLR,IAAK,EACL6Z,YACC,GANiB,KAAA5N,iBAA0C,KAAA4N,WAyCxD,KAAA6D,YAAevd,IACrBA,GAAK,OAAAyb,EAAA,GAAYzb,GACjB,GAA2BkV,OAAS,GAA2BA,OAGzD,KAAAsI,UAAY,KAElB,MAAM,OAACvI,EAAM,MAAEC,GAAS,GACxB,IAAIuI,EAEFA,GADExI,GAAUC,EACR,kWACID,EAAS,GACb,8LACIA,EAAS,GAAKA,EAAS,IAC3B,yBAEA,2FAGN,IACElX,KAAK2f,UAAU1b,UAAY,YAAYyb,aACvC,MAAMjT,IAEJzM,KAAKub,WACPvb,KAAKoc,YAAYjF,EAAQ,EAAID,IAzD/BlX,KAAK8e,eACL9e,KAAK+e,YAAY,CACf9C,QAASvI,IACP,MAAMxR,EAAQG,KAAKP,IAAIO,KAAKC,IAAIoR,EAAa,GAAI,GAIjD,GAA2ByD,OAAQ,EACnC,GAA2BD,OAAShV,KAQxClC,KAAK4f,IAAM1f,SAASC,cAAc,OAClCH,KAAK4f,IAAIxf,UAAUC,IAAI,iBAEvBL,KAAK4f,IAAI3b,UAAY,+GAGrBjE,KAAK4f,IAAIxf,UAAUC,IAAI,YACvBL,KAAK2f,UAAY3f,KAAK4f,IAAIC,kBAE1B7f,KAAK4f,IAAI7V,OAAO/J,KAAKC,WAErB,YAAiBD,KAAK2f,UAAW3f,KAAKwf,YAAa,CAACzR,eAAgB/N,KAAK+N,iBACzE/N,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,wBAAyBA,KAAKyf,WAEjEzf,KAAKyf,aAgCM,MAAM,WAAoB,IAgBvC,YAAoBK,EAAyBre,GAAO,EAAOwc,GAAa,EAAOpK,GAgB7E,GAfA5Q,OAAM,GADY,KAAA6c,QAPZ,KAAAC,oBAAsB,EAqMvB,KAAAC,aAAe,KACpBhT,aAAahN,KAAK+f,qBAClB/f,KAAK+f,oBAAsB,EAE3B,MAAME,EAAUjgB,KAAKkgB,QAAQ9f,UAAUuR,SAAS,iBAChD,IAA2B,IAAxB3R,KAAKmgB,gBACN,GAAGngB,KAAK8f,MAAMnK,SAAWsK,GAAWjgB,KAAKmgB,eACvC,YAEG,IAAIF,EACT,OAGFjgB,KAAKyO,cAAc,kBAAkB,GACrCzO,KAAKkgB,QAAQ9f,UAAUuB,OAAO,kBAGzB,KAAAye,aAAe,CAACC,GAAiB,KACnCrgB,KAAK+f,qBACN/S,aAAahN,KAAK+f,qBAClB/f,KAAK+f,oBAAsB,GAClB/f,KAAKkgB,QAAQ9f,UAAUuR,SAAS,mBAA4C,IAAxB3R,KAAKmgB,iBAClEngB,KAAKyO,cAAc,kBAAkB,GACrCzO,KAAKkgB,QAAQ9f,UAAUC,IAAI,kBAGzBggB,IAAkBrgB,KAAKmgB,iBAI3BngB,KAAK+f,oBAAsBxU,OAAOC,WAAWxL,KAAKggB,aAAc,OAG3D,KAAAM,eAAkBC,IACvB,MAAMN,EAAUjgB,KAAKkgB,QAAQ9f,UAAUuR,SAAS,iBAEhD,QAAYjN,IAAT6b,EACEN,EAASjgB,KAAKggB,eACZhgB,KAAKogB,mBACL,IAAGG,IAASN,EAAS,QACX,IAATM,EAAgBvgB,KAAKggB,eACxBhgB,KAAKogB,iBA+IF,KAAAI,aAAe,KAEsC,OAArCtgB,SAASugB,yBAE/BzgB,KAAKkgB,QAAQ9f,UAAUuB,OAAO,qBAvXhC3B,KAAKkgB,QAAUhgB,SAASC,cAAc,OACtCH,KAAKkgB,QAAQ9f,UAAUC,IAAI,gBAE3BL,KAAK+N,eAAiB,IAAI,IAE1B+R,EAAMY,WAAWC,aAAa3gB,KAAKkgB,QAASJ,GAC5C9f,KAAKkgB,QAAQU,YAAYd,GAEzB9f,KAAK6gB,KAAO,UAEZ7gB,KAAK8gB,YAAYjN,GAGA,YAAd7T,KAAK6gB,KAAoB,CAC1B,MAAME,EAAW/gB,KAAKkgB,QAAQrQ,cAAc,qCAC5C7P,KAAKghB,SAAW,IAAI,GAAkBlB,EAAO7B,GAC7C8C,EAASnC,QAAQ5e,KAAKghB,SAAS/gB,WAGjC,GAAGwB,EAA4B,CACbqe,EAAMre,OACd+K,MAAOC,IACG,oBAAbA,EAAInD,OACLwW,EAAM3I,OAAQ,EACd2I,EAAMrf,UAAW,EACjBqf,EAAMre,UAEPwf,QAAQ,KACTjhB,KAAKkgB,QAAQ9f,UAAUkM,OAAO,cAAetM,KAAK8f,MAAMnK,WAMtD,YAAYuL,GAClB,MAAOhB,QAASiB,EAAM,MAAErB,EAAK,KAAEe,GAAQ7gB,KAEvCmhB,EAAO/gB,UAAUC,IAAIwgB,GAErB,MAAM7c,EAAOhE,KAAKohB,gBAElB,IAAIC,EAEJ,GAHAF,EAAOG,mBAAmB,YAAatd,GAG3B,YAAT6c,EAAoB,CACrB,MAAMvU,EAAS6U,EAAOrR,iBAAiB,WACjCyR,EAAmBJ,EAAOtR,cAAc,eACxC2R,EAAcL,EAAOtR,cAAc,iBACzCwR,EAAeF,EAAOtR,cAAc,kBACpCwR,EAAapd,UAAYwd,OAAwB,EAAjB3B,EAAMjM,UAAc6N,WAEpD,MAAMC,EAAiB,IAAI,GAAe3hB,KAAK+N,gBAEzC6T,EAAeT,EAAOtR,cAAc,kBAC1C8R,EAAe/B,IAAIxf,UAAUuB,OAAO,YACpCigB,EAAajB,aAAagB,EAAe/B,IAAK4B,EAAY1Q,eAE1D3I,MAAMC,KAAKkE,GAAQhG,QAASuU,IAC1B7a,KAAK+N,eAAe1N,IAAIwa,EAAxB7a,CAAgC,QAAS,KACvCA,KAAK6hB,iBAIT7hB,KAAK+N,eAAe1N,IAAIyf,EAAxB9f,CAA+B,QAAS,KAClC,uBACFA,KAAK6hB,eAIN,sBACD7hB,KAAK+N,eAAe1N,IAAI8gB,EAAxBnhB,CAAgC,QAAS,KACvCA,KAAKsgB,oBAaPtgB,KAAK+N,eAAe1N,IAAIL,KAAKkgB,QAA7BlgB,CAAsC,YAAa,KACjDA,KAAKogB,iBAGPpgB,KAAK+N,eAAe1N,IAAIL,KAAKkgB,QAA7BlgB,CAAsC,aAAc,KAClDA,KAAKogB,cAAa,KAGpBpgB,KAAK+N,eAAe1N,IAAIL,KAAKkgB,QAA7BlgB,CAAsC,aAAeiC,IAChD,OAAA6f,GAAA,GAAgB7f,EAAE8f,cAAe,wBAClC/hB,KAAKogB,cAAa,GAIpBpgB,KAAKggB,iBAGPhgB,KAAK+N,eAAe1N,IAAIH,SAAxBF,CAAkC,UAAYiC,IAC5C,GAAG2G,EAAA,QAAUoZ,eAAiB,EAC5B,OAGF,MAAM,IAACzT,EAAG,KAAE0T,GAAQhgB,EAEpB,IAAIigB,GAAO,EAkBX,MAjBY,SAATD,EACDjiB,KAAKmiB,iBAAiBZ,GACL,SAATU,EACR,GAA2B9K,OAAS,GAA2BA,MAC9C,UAAT8K,EACRjiB,KAAK6hB,aACG5f,EAAEmgB,QAAmB,UAATH,EACpB,GAA2B7K,cAAgB,IACnCnV,EAAEmgB,QAAmB,UAATH,EACpB,GAA2B7K,cAAgB,KACnCpX,KAAKkgB,QAAQ9f,UAAUuR,SAAS,qBAAgC,cAARpD,GAA+B,eAARA,EAIvF2T,GAAO,EAHI,cAAR3T,EAAqB,GAA2BgF,aAAa,CAAChP,OAAQ,iBACpE,GAA2BqP,YAAY,CAACrP,OAAQ,gBAKpD2d,GACD,OAAAxE,EAAA,GAAYzb,IACL,QAFT,KAkBJjC,KAAK+N,eAAe1N,IAAIyf,EAAxB9f,CAA+B,WAAY,KACrC,uBACFA,KAAKmiB,iBAAiBZ,KAI1BvhB,KAAK+N,eAAe1N,IAAIkhB,EAAxBvhB,CAA0C,QAAUiC,IAClDjC,KAAKmiB,iBAAiBZ,KAGxB,iFAAiFc,MAAM,KAAK/b,QAAQgc,IAClGtiB,KAAK+N,eAAe1N,IAAI8gB,EAAxBnhB,CAAgCsiB,EAAWtiB,KAAKwgB,cAAc,KAGhExgB,KAAK+N,eAAe1N,IAAIyf,EAAxB9f,CAA+B,aAAc,KAC3CwhB,EAAYvd,UAAYwd,OAA2B,EAApB3B,EAAMpM,aAAiBgO,aAGxD1hB,KAAK+N,eAAe1N,IAAIyf,EAAxB9f,CAA+B,OAAQ,KACrCA,KAAKkgB,QAAQ9f,UAAUC,IAAI,WAC1B,CAACsX,MAAM,IAEV3X,KAAK+N,eAAe1N,IAAIyf,EAAxB9f,CAA+B,QAAS,KACtCA,KAAKogB,cAAa,KAItBpgB,KAAK+N,eAAe1N,IAAIyf,EAAxB9f,CAA+B,OAAQ,KACrCA,KAAKkgB,QAAQ9f,UAAUC,IAAI,gBAG7BL,KAAK+N,eAAe1N,IAAIyf,EAAxB9f,CAA+B,QAAS,KACtCA,KAAKkgB,QAAQ9f,UAAUuB,OAAO,gBAG7Bme,EAAMjM,UAAYqN,EACnBG,EAAapd,UAAYwd,OAAOpf,KAAKE,MAAMud,EAAMjM,UAAYqN,IAAeQ,WAE5E,aAAY5B,GAAOjf,KAAK,KACtBwgB,EAAapd,UAAYwd,OAAOpf,KAAKE,MAAMud,EAAMjM,WAAW6N,aAiD3D,aAAaa,GAClBviB,KAAKmgB,eAAiBoC,EAEtBviB,KAAKkgB,QAAQ9f,UAAUkM,OAAO,iBAA6B,IAAZiW,GAC/CviB,KAAKsgB,eAAeiC,GAGZ,aACRviB,KAAK8f,MAAM9f,KAAK8f,MAAMnK,OAAS,OAAS,WAGlC,gBACN,MAAMkL,EAAO7gB,KAAK6gB,KAClB,GAAY,YAATA,EACD,MAAO,0BACUA,iFACHA,gEACAA,mJAGkBA,oVAQAA,gIACAA,uHAO1B,mBACR,MAAMjD,EAA4C,CAAC,IAAM,GAAK,EAAG,KAAM,IAAK,GAAGnV,IAAK+Z,IAC3E,CACLhF,YAAsB,IAATgF,EAAa,SAAW,GAAKA,EAC1CrF,QAAS,KACPnd,KAAK8f,MAAM1I,aAAeoL,MAI1BxE,EAAU,GAAWJ,GACrB6E,EAAiBziB,KAAKkgB,QAAQrQ,cAAc,aAClDmO,EAAQ5d,UAAUC,IAAI,YACtBwd,GAAwB4E,GACxBA,EAAe1Y,OAAOiU,GAGjB,sBAEL,SAAU9d,SAASwiB,mBAAqBxiB,SAASyiB,sBAAwBziB,SAASugB,yBAA2BvgB,SAAS0iB,qBAG9G,iBAAiBrB,GAEzB,MAAMJ,EAASnhB,KAAKkgB,QAGpB,GAAG,mBAAiB,CAClB,MAAMJ,EAAQ9f,KAAK8f,MAGnB,OAFAA,EAAM+C,6BACN/C,EAAMgD,kBAIJ,GAAYC,gBAiCd5B,EAAO/gB,UAAUuB,OAAO,oBAerBzB,SAAS8iB,iBAEV9iB,SAAS8iB,mBAED9iB,SAAS+iB,oBAEjB/iB,SAAS+iB,sBAED/iB,SAASgjB,uBAEjBhjB,SAASgjB,yBAEDhjB,SAASijB,kBAEjBjjB,SAASijB,mBAGX5B,EAAiBnhB,UAAUuB,OAAO,qBAClC4f,EAAiBnhB,UAAUC,IAAI,oBAC/BkhB,EAAiBne,aAAa,QAAS,iBAlEvC+d,EAAO/gB,UAAUC,IAAI,oBAYlB8gB,EAAOiC,kBACRjC,EAAOiC,oBAECjC,EAAOkC,qBAEflC,EAAOkC,uBAEClC,EAAOmC,wBAEfnC,EAAOmC,0BAECnC,EAAOoC,qBAEfpC,EAAOoC,sBAGThC,EAAiBnhB,UAAUuB,OAAO,oBAClC4f,EAAiBnhB,UAAUC,IAAI,qBAC/BkhB,EAAiBne,aAAa,QAAS,qBAgDpC,kBACLH,MAAMyL,UACN1O,KAAK+N,eAAeO,YACpBtO,KAAKghB,SAAStC,mB,yCCnpBH,SAAS8E,GAA6CC,GACnE,OCHa,SAAmDC,EAAgCD,GAChG,IACIxV,EADA0V,GAAU,EAGd,MAAO,IAAIC,KACT3V,EAAO2V,EAEFD,IACHA,GAAU,EAEVD,EAAY,KACVC,GAAU,EAEVF,KAAMxV,ODVL4V,CAAa,KAASJ,G,aEwE/B,SAASK,GAAiBC,GACxBA,EAAQ3jB,UAAUC,IAAI,YAEtB,MAAM+D,EAAU2f,EAAQ3f,QAClB6P,EAAM,IAAmBsB,oBAAoBnR,GAEhDA,EAAQkT,OAAO0M,KAChBD,EAAQ3jB,UAAUC,IAAI,UAGxB,MAGM4jB,EAAeC,EAAA,EAAWC,SAAW,GAAK,GAG1CC,EAAOF,EAAA,EAAWC,SAAW,IAAM,IACnCE,EAAOH,EAAA,EAAWC,SAAW,IAAM,IACnCtQ,EAAWI,EAAIJ,SACfyQ,EAAS,YAAMzQ,EAAW,GAAKwQ,EAAMD,EAAMC,GAE3CE,EAAMrkB,SAASskB,gBAAgB,6BAA8B,OACnED,EAAInkB,UAAUC,IAAI,kBAClBkkB,EAAIE,eAAe,KAAM,QAAS,GAAKH,GACvCC,EAAIE,eAAe,KAAM,SAAU,GAAKR,GACxCM,EAAIE,eAAe,KAAM,UAAW,OAAOH,KAAUL,KAErD,MAAMS,EAAUxkB,SAASC,cAAc,OACvCukB,EAAQtkB,UAAUC,IAAI,cACtB0jB,EAAQha,OAAOwa,EAAKG,GAEpB,IAAIC,EAAY1Q,EAAIiF,WAAWzI,KAAKwI,GAA6B,2BAAhBA,EAAU7R,GAA6Eud,UAAY,IAAIC,WAAW,IACnKD,EArEK,SAAwBA,GACxBA,aAAoBC,aACvBD,EAAW,IAAIC,WAAWD,IAG5B,MACME,EAD6B,EAAlBF,EAASxiB,OACI,EAAI,EAClC,IAAI0iB,EACF,OAAO,IAAID,WAAW,IAGxB,IAAIve,EACJ,IACE,MAAMye,EAAW,IAAIC,SAASJ,EAASK,QACvC3e,EAAS,IAAIue,WAAWC,GACxB,IAAI,IAAI7Z,EAAI,EAAGA,EAAI6Z,EAAY7Z,IAAK,CAClC,MAAMia,EAAgB,EAAJja,EAAQ,EAAI,EACxBka,EAAe,EAAJla,EAAQ,EACnB9I,EAAQ4iB,EAASK,UAAUF,GAAW,GAC5C5e,EAAO2E,GAAM9I,GAASgjB,EAAY,IAEpC,MAAMzY,GACNpG,EAAS,IAAIue,WAAW,IAY1B,OAAOve,EAmCI+e,CAAeT,EAASlhB,MAAM,EAAG,KAI5C,MAAM4hB,EAAYhjB,KAAKP,OAAO6iB,GACxBW,EAASX,EAASxiB,OAASwiB,EAASxiB,OAAS,IAC7CojB,EAAWljB,KAAKC,IAAKgiB,EAAS,EAA0B,EAAGgB,GAEjE,IAAIE,EAAW,EACf,MAAMC,EAAWxB,EA7BI,EA+BrB,IAAIjgB,EAAO,GACX,IAAI,IAAIgH,EAAI,EAAG0a,EAAO,EAAGC,EAAO,EAAG3a,EAAIsa,IAAUta,EAAG,CAClD,MAAM9I,EAAQyiB,EAAS3Z,IAAM,EAC7B,GAAI2a,EAAOJ,GAAaD,EAAQ,CAC9BK,EAAOA,EAAOJ,EAAWD,EACzBK,GAAQJ,EAAW,GAAK,GACvBC,EAAWtjB,IAAOsjB,EAAWtjB,GAG9B,MAAM0jB,EAAYvjB,KAAKP,KAAM0jB,EAAWC,GAAcJ,EAAY,GAAK,IAAOA,EAAY,GAxCzE,GA6CjBrhB,GAHU,oBACC0hB,SAAYzB,EAAe2B,wBAA0CA,mCAIhFF,GAAQG,EAGNL,EADCG,GAAQJ,EAAW,GAAK,EACd,EAEArjB,OAGVsjB,EAAWtjB,IAAOsjB,EAAWtjB,GAEhCyjB,GAAQJ,EAIZhB,EAAIjD,mBAAmB,YAAatd,GACpC,MAAM8hB,EAAQ3d,MAAMC,KAAKmc,EAAIwB,UAE7B,IAAI/E,EAAW+C,EAAQlU,cAAc,mBA+ErC,MA7Ee,KACb,IAAImW,EAAQjC,EAAQiC,MAEpB,MAAMxH,EAAe,KACnB,MAAMyH,EAAYD,EAAMtS,cAAgBsS,EAAMnS,SAAW,EAAIxR,KAAK6jB,KAAKF,EAAMtS,YAAcsS,EAAMnS,SAAW0R,GAI5GO,EAAMxf,QAAQ,CAAC6f,EAAM9hB,IAAQ8hB,EAAK/lB,UAAUkM,OAAO,SAAUjI,EAAM4hB,OAMjED,EAAMrQ,QAAWqQ,EAAMtS,YAAc,GAAKsS,EAAMtS,cAAgBsS,EAAMnS,WACxE2K,IAGF,MAAM4H,EAAsB5C,GAAgBhF,GAoD5C,OAnDAuF,EAAQsC,iBAAiB,aAAcD,GACvCrC,EAAQsC,iBAAiB,QAASD,GAElCrC,EAAQuC,aAAazlB,KAAK,KACxB,IAAI0a,GAAY,EAAOgL,GAAY,EAiCnC,SAAS3K,EAAM3Z,GACb,IAAIukB,EACJ,GAAGvkB,aAAawkB,WACdD,EAAUvkB,EAAEukB,YACP,CACL,MAAM3K,EAAQ5Z,EAAE4S,OAAuBiH,wBACvC0K,EAAUvkB,EAAEykB,cAAc,GAAGlM,MAAQqB,EAAKkB,KAG5C,MAAMiC,EAAYwH,EAAUlC,EAAqB0B,EAAMnS,SACvDmS,EAAMtS,YAAcsL,EA1CtBgC,EAAShgB,iBAAiB,aAAeiB,IACpCsZ,IACDyK,EAAMvkB,OACN8Z,GAAY,GAEdgL,GAAY,IAEdvF,EAAShgB,iBAAiB,YAAciB,IACtCskB,GAAY,EACThL,GAAWK,EAAM3Z,KAEtB+e,EAAShgB,iBAAiB,YAAciB,IACtCA,EAAE8Y,iBACc,IAAb9Y,EAAE4Y,SACDmL,EAAMrQ,QACRqQ,EAAM5kB,QAGRwa,EAAM3Z,GACNsZ,GAAY,KAEdyF,EAAShgB,iBAAiB,UAAYiB,IACjCskB,GAAahL,IACdyK,EAAMvkB,OACN8Z,GAAY,KAGhB,YAAiByF,EAAW/e,IAC1B,OAAAyb,EAAA,GAAYzb,GACR+jB,EAAMrQ,QAAQiG,EAAM3Z,MAezB0kB,GAAA,GAEI,KACL3F,EAASrf,SACTqf,EAAW,KACXgF,EAAQ,OAqGd,SAASY,GAA2BC,GAAiB,GACnD,MAAMC,EAAY,IAAI,KAAqB,CAACC,YAAY,EAAMF,mBAQ9D,OAPAC,EAAUE,YAENH,IACFC,EAAUG,OAAOxC,eAAe,KAAM,IAAK,MAC3CqC,EAAUI,YAAc,cAGnBJ,EApTTle,EAAA,QAAU5H,iBAAiB,sBAAuB,EAAEiH,OAAMhB,aACxDgB,EAAK3B,QAAQO,IACX,MAAMsgB,EAAO,cAActgB,qBAAuBI,MACjDkB,MAAMC,KAAKlI,SAAS4P,iBAAiB,0BAA0BqX,4BAA+BA,MAA4B7gB,QAAQvC,IACjIA,EAAK3D,UAAUuB,OAAO,mBAmTrB,MAAMylB,GAAoBlhB,IAC/B,IAAIwT,EAAmB7U,EAErB,MAAMwiB,GAAanhB,EAAO9F,UAAUuR,SAAS,qBACvC1R,EAAY,OAAA6hB,GAAA,GAAgB5b,EAASmhB,EAAyB,gBAAb,YACvD,GAAGpnB,EAAW,CACZ,MAAMknB,EAAO,+BACPG,EAAoB,wBAAwBH,EAClD,IAAII,EAOJ,GAHEA,EAHErhB,EAAOshB,QAAQF,GAGL,CAACA,GAFD,CAAC,kBAAkBH,EAAQ,eAAeA,GAKrDE,EAAW,CACZ,MAAMI,EAAS,yBACfF,EAAYA,EAAU9e,IAAIoN,GAAK4R,EAAS5R,GAG1C,MAAM6R,EAAWH,EAAUI,KAAK,MAE1BC,EAAWzf,MAAMC,KAAKnI,EAAU6P,iBAAiB4X,IACjDrjB,EAAMujB,EAASrL,QAAQrW,GAEvB2hB,EAA0BD,EAASnf,IAAIuM,IAAW,CAAE/N,OAAQ+N,EAAQ5I,QAAQnF,OAAO6gB,WAAYjhB,KAAMmO,EAAQ5I,QAAQvF,OAE3H6S,EAAOmO,EAAWpkB,MAAM,EAAGY,GAC3BQ,EAAOgjB,EAAWpkB,MAAMY,EAAM,GAIlC,MAAO,CAACqV,EAAM7U,IAGD,MAAM,WAAqBkjB,YAA1C,c,oBAIS,KAAAC,UAAW,EACX,KAAAC,cAAe,EAEf,KAAAC,YAAa,EAKZ,KAAAna,eAAiB,IAAI,IAKtB,S,QACL/N,KAAKI,UAAUC,IAAI,SAEnBL,KAAKoM,QAAQvF,IAAM,GAAK7G,KAAKoE,QAAQyC,IACrC7G,KAAKoM,QAAQnF,OAAS,GAAKjH,KAAKoE,QAAQ6C,OAExC,MAAMgN,EAAkB,IAAmBsB,oBAAoBvV,KAAKoE,SAC9D+jB,EAA2B,UAAblU,EAAI9Q,KAClB+U,GAAWlY,KAAKioB,cAAgBE,EAChCC,EAAapoB,KAAKoE,QAAQkT,OAAO+Q,YACjCC,EAAYF,GAAcpoB,KAAK8mB,UAE/ByB,EAAc9G,OAAsB,EAAfxN,EAAIJ,UAAc6N,WAE7C1hB,KAAKiE,UAAY,wOAQjB,MAAMqI,EAAStM,KAAK6f,kBAEd2I,EAActoB,SAASC,cAAc,OAC3CqoB,EAAYpoB,UAAUC,IAAI,kBAEI,UAAb4T,EAAI9Q,MAAoBnD,KAAKoE,SAAWpE,KAAKoE,QAAQkT,OAAOE,cAE3ExX,KAAKI,UAAUC,IAAI,aAGlBioB,IACDtoB,KAAKI,UAAUC,IAAI,eACnBL,KAAK+J,OAAOye,IAGd,MAAMC,EAAavQ,EAAU4L,GAAiB9jB,MAnMlD,SAAmB+jB,GACjB,MAAMiE,EAAWjE,EAAQiE,SAEnB5jB,EAAU2f,EAAQ3f,QAClB6P,EAAkB,IAAmBsB,oBAAoBnR,GAEzD8T,EAAuB,UAAbjE,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,KACtCulB,EAAgBxoB,SAASC,cAAc,OAG7C,GAFAuoB,EAActoB,UAAUC,IAAI,sBAExB6X,EAAS,CACX,MAAMyQ,EAA2B,GAC9B1U,EAAI2U,gBACLD,EAAMhjB,KAAK,OAAAkjB,GAAA,GAAW5U,EAAI2U,iBAGzBZ,EACDW,EAAMhjB,KAAK,aAAmBvB,EAAQ0kB,OAC7BH,EAAMxmB,QACfwmB,EAAMhjB,KAAK,YAAYsO,EAAInU,OAG1BikB,EAAQmE,YACTS,EAAMhjB,KAAK,IAAmBojB,iBAAiB3kB,IAGjDskB,EAAc3e,UAAU,2BAAiB4e,EAAO,QAQlD5E,EAAQzC,mBAAmB,YALd,wJAOb,MAAM0H,EAAUjF,EAAQlU,cAAc,gBAEhCoZ,EAAmB,IAAI,KAC7BA,EAAiB7c,QAAQ8c,WAAanF,EAAQ3X,QAAQ8c,WACnDhR,EACD+Q,EAAiBlf,OAAO,IAAmBgf,iBAAiB3kB,IAE5D6kB,EAAiBhlB,UAAYgQ,EAAIkV,YAAclV,EAAImV,SAGrDJ,EAAQjf,OAAOkf,GAEZlF,EAAQmE,YACTc,EAAQjf,OAAO,IAAmBsf,aAAajlB,IAGjD,MAAMklB,EAAcvF,EAAQlU,cAAc,mBAuC1C,OAtCAyZ,EAAYvf,OAAO2e,GAEJ,KACb,IAAIa,GAAW,EAEXC,EAAe,IAAI,GAAkBzF,EAAQiC,MAAO/R,EAAIG,mBAE5D2P,EAAQsC,iBAAiB,QAAS,KAChCtC,EAAQ3jB,UAAUuB,OAAO,uBAEzB2nB,EAAYG,UAAUC,YAAYhB,GAClCa,GAAW,IAGb,MAAM3U,EAAS,KACT2U,IACFxF,EAAQ3jB,UAAUC,IAAI,uBACtBkpB,GAAW,EAERC,GACDF,EAAYG,UAAUC,YAAYF,EAAavpB,aAWrD,OANA8jB,EAAQsC,iBAAiB,OAAQzR,KAE7BmP,EAAQiC,MAAMrQ,QAAUoO,EAAQiC,MAAMtS,YAAc,IACtDkB,IAGK,KACL4U,EAAa9K,kBACb8K,EAAavpB,UAAU0B,SACvB6nB,EAAe,OA4GqCG,CAAU3pB,MAE1D4pB,EAAe5pB,KAAK6P,cAAc,eACxC+Z,EAAa3lB,UAAYskB,EAEzB,MAAMsB,EAAS7pB,KAAK6pB,OAAUxS,IAC5BrX,KAAK6pB,YAASnlB,EAEd,MAAMshB,EAAQhmB,KAAKgmB,MAAQ,GAA2BrM,SAAS3Z,KAAKoE,QAASiT,GAEvEiP,EAAetmB,KAAKsmB,aAAe,eACtCtmB,KAAKgmB,MAAM8D,YAAc9pB,KAAKgmB,MAAM+D,kBAAmBzD,EAAargB,UAErEjG,KAAKqmB,iBAAiB,UAAW,IAAMC,EAAargB,UAAW,CAAC0R,MAAM,IAGxE3X,KAAKgqB,iBAAmBvB,IAExB,MAAMwB,EAAa,IAAMxI,OAA2B,EAApBuE,EAAMtS,aAAiBgO,YAAcxJ,EAAW,MAAQqQ,EAAe,IAEjG3T,EAAS,KACbgV,EAAaM,UAAYD,IACzB3d,EAAOlM,UAAUkM,OAAO,WAAY0Z,EAAMrQ,WAGxCqQ,EAAMrQ,QAAWqQ,EAAMtS,YAAc,GAAKsS,EAAMtS,cAAgBsS,EAAMnS,WACxEe,IAGF,MAAMiN,EAAa,CAAC5f,EAAW0T,EAASqQ,EAAMrQ,UAG5C,GAFA1T,GAAK,OAAAyb,EAAA,GAAYzb,GAEd0T,EAAQ,CACT,MAAMwU,IAAqBnqB,KAAKgH,cAChC,GAAG,GAA2B4S,iBAAiB5Z,KAAKgH,eAAiB,CACnEC,OAAQ,KACRE,YAAa,CAACC,EAAG,4BACjB+B,WAAW,IACT,CACF,MAAOuQ,EAAM7U,GAASslB,EAAwB/C,GAAiBpnB,MAAtB,GACzC,GAA2BqV,WAAW,CAACpO,OAAQjH,KAAKoE,QAAQ6C,OAAQJ,IAAK7G,KAAKoE,QAAQyC,KAAM6S,EAAM7U,GAGpGmhB,EAAMvkB,OAAO+K,MAAM,aAEnBwZ,EAAM5kB,SAsBV,OAlBA,YAAiBkL,EAASrK,GAAM4f,EAAW5f,GAAI,CAAC8L,eAAgB/N,KAAK+N,iBAErE/N,KAAKqmB,iBAAiB,QAAS,KAC7B/Z,EAAOlM,UAAUuB,OAAO,WACxBioB,EAAaM,UAAY3B,IAG3BvoB,KAAKqmB,iBAAiB,aAAc,MAC7BL,EAAMtS,aAAesS,EAAMrQ,QAAW,GAA2BsJ,kBAAkB+G,KACxF4D,EAAaM,UAAYD,OAG3BjqB,KAAKqmB,iBAAiB,QAAS,KAC7B/Z,EAAOlM,UAAUuB,OAAO,aAG1B3B,KAAKqmB,iBAAiB,OAAQzR,GAEvBiN,GAGT,GAAa,QAAV,EAAA5N,EAAImE,cAAM,eAAEjW,OAAQ,CACrB,MAAMioB,EAA2B,GAC3BC,EAAUC,GAAU,CACxB9lB,MAAOyP,EACP7P,QAAS,KACTnE,UAAWqM,EACXie,SAAU,GACVC,UAAW,GACXC,aAAczqB,KAAKyqB,aACnBC,kBAAkB,EAClBC,cAAe3qB,KAAK2qB,gBAEtBre,EAAO3J,MAAMjC,MAAQ4L,EAAO3J,MAAMhC,OAAS,GACxC0pB,EAAQO,OAAOC,OAAOT,EAAKzkB,KAAK0kB,EAAQO,OAAOC,OAC/CR,EAAQO,OAAOE,MAAMV,EAAKzkB,KAAK0kB,EAAQO,OAAOE,MAEjD9qB,KAAKI,UAAUC,IAAI,oBACnB+pB,EAAK9jB,QAAQykB,GAAOA,EAAI3qB,UAAUC,IAAI,gBAGxC,GAAI+nB,EAsHME,IACRtoB,KAAKoM,QAAQgc,WAAa,IAC1BpoB,KAAK8mB,UAAUkE,OAAOxC,GAAa,QAxHrB,CACd,IAAI1B,EAAkC9mB,KAAK8mB,UAE3C+C,EAAoB,UAAb5V,EAAI9Q,OAAqBnD,KAAKirB,gBAErC,MAAM7M,EAAK8M,IACT,GAAGlrB,KAAKgmB,MAAMvR,IACZ,OAGF,GAA2BuB,2BAA2BhW,KAAKoE,QAAQ6C,OAAQjH,KAAKoE,QAAQyC,IAAK7G,KAAKoE,QAAQkT,OAAOC,cAEjH,MAAM4T,EAAiB,KAClBD,IACD,GAA2BpR,aAAa9Z,KAAKgmB,OAE1C,eAAchmB,KAAKgmB,MAAMvlB,WAC1BT,KAAKgmB,MAAMvlB,UAAW,KAO5B,GAFA0qB,KAEIrE,EACF,GAAG7S,EAAIG,kBAAmB,CAGxB,IAAIgX,EAFJprB,KAAKI,UAAUC,IAAI,mBAGnB,MAAMuU,EAAS,KACb,MAAMkS,EAAYF,IAA2B,GACvChP,EAAW,eACjBA,EAASyT,UAAU,CAACC,KAAM,GAAIC,MAAO,MACrC3T,EAASpL,MAAM,KACbxM,KAAKgmB,MAAM5kB,QACX,GAA2B0Y,kBAAapV,KAE1CkT,EAAS4T,OAAS,KAChB5T,EAAS4T,OAAS7E,GAAA,EAClB,MAAMla,EAAM,IAAIgf,MACfhf,EAAYtJ,KAAO,WACpByU,EAAS8T,OAAOjf,IAElBqa,EAAUkE,OAAOxC,GAAa,EAAO5Q,GAErCwT,EAAgBprB,KAAKqmB,iBAAiB,QAAS,KAC7CzO,EAAS4T,UACR,CAAC7T,MAAM,IAEVwT,KAOIQ,EAAoB3rB,KAAKqmB,iBAAiB,OAAQzR,GACxD5U,KAAKsmB,aAAazlB,KAAK,KACrBb,KAAK+N,eAAepM,OAAOgqB,GAC3B3rB,KAAK+N,eAAepM,OAAOypB,SAExB,CACLtE,EAAYF,KAERsE,IACFlrB,KAAKsmB,aAAe,gBAGtB,MAAMxgB,EAAO,KACXqlB,IAEA,MAAMS,EAAW,IAAe7T,YAAY9D,GAS5C,OAPIiX,GACFU,EAAS/qB,KAAK,KACZb,KAAKsmB,aAAargB,YAItB6gB,EAAUkE,OAAOxC,GAAa,EAAOoD,GAC9B,CAACA,aAGV9E,EAAU+E,oBAAoB/lB,GAC9BA,IAIJ9F,KAAK+J,OAAOye,GAEZxoB,KAAKI,UAAUC,IAAI,eAEnBL,KAAKsmB,aAAazlB,KAAK,KACrBb,KAAKI,UAAUuB,OAAO,eACtB6mB,EAAYpoB,UAAUC,IAAI,cAC1BmL,WAAW,KACTgd,EAAY7mB,UACX,KAIE,GAA2B8X,oBAAsBzZ,KAAKgmB,QACvDhmB,KAAKgmB,MAAMvkB,OACX,GAA2BqY,kBAAapV,QAMlC,QAAV,EAAA1E,KAAKgmB,aAAK,eAAEvR,OACE,UAAbR,EAAI9Q,MAAqBnD,KAAKirB,eAG/B,YAAiB3e,EAAQ,KACvB8R,GAAE,IACD,CAACzG,MAAM,EAAMmU,SAAS,EAAMxQ,SAAS,EAAOvN,eAAgB/N,KAAK+N,iBAJpEqQ,GAAE,KAcV,uBACE,OAAOpe,KAAK+N,eAAe1N,IAAIL,KAAKgmB,OAGtC,uBACKhmB,KAAK+rB,cAIL/rB,KAAKgqB,mBACNhqB,KAAKgqB,mBACLhqB,KAAKgqB,iBAAmB,MAGvBhqB,KAAKsmB,cACNtmB,KAAKsmB,aAAaoF,SAGpB1rB,KAAK+N,eAAeO,YACpBtO,KAAK+N,eAAiB,KAEtB/N,KAAK8mB,UAAY,OAIrBkF,eAAeC,OAAO,gBAAiB,IC1pBxB,MAAMC,GAOnB,YAAsB1iB,EAA0B2iB,GAA1B,KAAA3iB,YAA0B,KAAA2iB,OAC9CnsB,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUuJ,UAAYA,EAE3BxJ,KAAKosB,OAASlsB,SAASC,cAAc,OACrCH,KAAKosB,OAAOhsB,UAAUC,IAAImJ,EAAY,WAEtCxJ,KAAK6N,QAAU3N,SAASC,cAAc,OACtCH,KAAK6N,QAAQzN,UAAUC,IAAImJ,EAAY,YAEvCxJ,KAAK4N,MAAQ1N,SAASC,cAAc,OACpCH,KAAK4N,MAAMxN,UAAUC,IAAImJ,EAAY,UACrCxJ,KAAK4N,MAAMxK,aAAa,MAAO,QAE/BpD,KAAKqsB,SAAWnsB,SAASC,cAAc,OACvCH,KAAKqsB,SAASjsB,UAAUC,IAAImJ,EAAY,aACxCxJ,KAAKqsB,SAASjpB,aAAa,MAAO,QAElCpD,KAAK6N,QAAQ9D,OAAO/J,KAAK4N,MAAO5N,KAAKqsB,UACrCrsB,KAAKC,UAAU8J,OAAO/J,KAAKosB,OAAQpsB,KAAK6N,UCfrC,SAASye,GAAuBtpB,G,QASrC,IAAI,MAAC4K,EAAK,QAAEob,EAAO,SAAEqD,EAAQ,WAAEE,EAAU,QAAEC,EAAO,QAAEpoB,EAAO,aAAEqmB,GAAgBznB,OAChE0B,IAAVkJ,IACoB,iBAAZ,IACPA,EAAQ,YAAaA,EAAO,KAC5BA,EAAQ,IAAkB6e,cAAc7e,IAG1C,OAAArB,EAAA,GAAeyc,EAASpb,IAGtB6c,IACFA,EAAe,IAGjB,IAAI3X,EAAQ1O,GAAWA,EAAQ0O,MAC3BwC,GAAW,EAAOoX,GAAU,EAChC,MAAMC,EAAgBH,EAAUrkB,MAAMC,KAAKokB,EAAQzG,UAAUtiB,QAAU,GACvE,IAAImpB,EACJ,GAAG9Z,GAAS0Z,GAUV,GATAD,EAAW/Z,YAAc,GACzB+Z,EAAWxiB,OAAO,IAAmB8iB,oBAAoBzoB,OAASM,OAAWA,OAAWA,OAAWA,GAAW,IAI3GoO,EAAMga,UACPha,EAAQA,EAAMga,SAGbha,EAAMtO,OAAUsO,EAAM5S,WAAiC,QAArB,EAAA4S,EAAM5S,SAASkY,cAAM,eAAEjW,QAA0G,CACpKyqB,EAAa,GAAaG,KAAKC,QAAQC,gBACvC,MAAMtC,EAAgB,GAAaoC,KAAKC,QAAQrC,cAEhD,GAA4B,aAAX,QAAd,EAAA7X,EAAM5S,gBAAQ,eAAEiD,MACjBmS,GAAW,EACX4X,GAAY,CACVjZ,IAAKnB,EAAM5S,SACXitB,IAAKX,EACL7B,gBACAyC,MAAOC,GAEP3sB,MAnDS,GAoDTC,OApDS,GAqDTisB,aACAnC,qBAEG,CACL,MAAMjmB,EAAQsO,EAAMtO,OAASsO,EAAM5S,SAEnCwsB,EAAyB,UAAfloB,EAAMrB,KAEhB,IACEmnB,GAAU,CACR9lB,QACAvE,UAAWusB,EACXjC,SAjEO,GAkEPC,UAlEO,GAmEP1qB,KAAM,IAAiBwtB,gBAAgB9oB,EAnEhC,OAoEPooB,aACAjC,gBACA4C,QAAQ,EACR7C,kBAAkB,EAClBD,iBAEFnV,GAAW,EACX,MAAM7I,YAMTrI,GACDmoB,EAAW/Z,YAAc,GACzB+Z,EAAWxiB,OAAO,IAAmB8iB,oBAAoBzoB,EAASA,EAAQA,SAAW,YAAaA,EAAQA,QAAS,SAE3F,iBAAf,IACPioB,EAAW,YAAaA,EAAU,KAClCA,EAAW,IAAkBI,cAAcJ,IAG7C,OAAA9f,EAAA,GAAeggB,EAAYF,GAAY,KAa3C,OATAxpB,QAAQC,IAAI2nB,GAAc5pB,KAAK,KAC1B+rB,IAAeA,MAClBD,EAAcrmB,QAAQknB,GAASA,EAAM7rB,UAElC6qB,GACDA,EAAQpsB,UAAUkM,OAAO,WAAYogB,MAIlCpX,EAGM,MAAM,WAAuB4W,GAG1C,YAAsB1iB,GACpBvG,MAAMuG,EAAW,CAACoE,EAAOye,EAAW,GAAIjoB,KAClCpE,KAAKwsB,UACPxsB,KAAKwsB,QAAUtsB,SAASC,cAAc,OACtCH,KAAKwsB,QAAQpsB,UAAUC,IAAIL,KAAKwJ,UAAY,WAG9C,MAAMikB,EAAanB,GAAuB,CACxC1e,QACAob,QAAShpB,KAAK4N,MACdye,WACAE,WAAYvsB,KAAKqsB,SACjBG,QAASxsB,KAAKwsB,QACdpoB,YAGFpE,KAAKC,UAAUG,UAAUkM,OAAO,WAAYmhB,GACzCA,EACDztB,KAAK6N,QAAQ+Q,QAAQ5e,KAAKwsB,SAE1BxsB,KAAKwsB,QAAQ7qB,WApBG,KAAA6H,aCpGjB,MAAMkkB,GACL,EADKA,GAEN,EAFMA,GAGJ,EAHIA,GAIH,EAJGA,GAKL,EAID,MAAM,GAOX,YAAoBpV,EAAuBqV,EAA0BC,EAA0BC,EAAyBC,EAAYH,GAAhH,KAAArV,QAAuB,KAAAqV,WAA0B,KAAAC,WAA0B,KAAAC,UAAyB,KAAAC,YACtH9tB,KAAK2E,MAAQ2T,EAAMnW,OACnBnC,KAAK+tB,OAAS,GAASC,YAAY1V,GACnCtY,KAAKiuB,YAAc,GAASC,iBAAiBluB,KAAK+tB,QAClD/tB,KAAKmuB,aAAe,YAAWnuB,KAAK+tB,OAAQ,GAAK/tB,KAAK2E,MACtD3E,KAAKouB,aAAeT,EAAW3tB,KAAK8tB,UAG/B,SACL,OAAI9tB,KAAK2E,MAGN3E,KAAK2E,OAAS,GAAK3E,KAAK+tB,OAAOtd,KAAK2N,GAAKA,EAAI,GACvC,IAAI,GAAgBpe,KAAK+tB,OAAQ/tB,KAAKmuB,aAAcnuB,KAAK2tB,SAAU3tB,KAAK4tB,SAAU5tB,KAAK6tB,SAASQ,SAGvF,IAAfruB,KAAK2E,MAAoB3E,KAAKsuB,YACV,IAAftuB,KAAK2E,MAAoB3E,KAAKuuB,cAC/BvuB,KAAKwuB,aATW,GAYjB,YACN,MAAyB,OAArBxuB,KAAKiuB,aACHjuB,KAAKmuB,aAAe,IAAMnuB,KAAKouB,cAC/BpuB,KAAK+tB,OAAO,GAAK/tB,KAAK+tB,OAAO,GAAK,GAC/B/tB,KAAKyuB,qBACiB,OAArBzuB,KAAKiuB,aAA6C,OAArBjuB,KAAKiuB,YACnCjuB,KAAK0uB,0BAEP1uB,KAAK2uB,qBAGN,cAEN,MAA2B,MAAxB3uB,KAAKiuB,YAAY,GACXjuB,KAAK4uB,0BAEP5uB,KAAK6uB,yBAGN,aACN,MAA2B,MAAxB7uB,KAAKiuB,YAAY,GACXjuB,KAAK8uB,wBAEP9uB,KAAK+uB,yBAGN,qBACN,MAAMruB,EAAQV,KAAK2tB,SACbhtB,EAAS0B,KAAKE,MAAMF,KAAKC,IAC7B5B,EAAQV,KAAK+tB,OAAO,GACpB1rB,KAAKC,IACH5B,EAAQV,KAAK+tB,OAAO,IACnB/tB,KAAK8tB,UAAY9tB,KAAK6tB,SAAW,KAEtC,MAAO,CACL,CACEmB,SAAU,CAACzU,EAAG,EAAGE,EAAG,EAAG/Z,QAAOC,UAC9BsuB,MAAOvB,GAAgBA,GAAeA,IAExC,CACEsB,SAAU,CAACzU,EAAG,EAAGE,EAAG9Z,EAASX,KAAK6tB,QAASntB,QAAOC,UAClDsuB,MAAOvB,GAAgBA,GAAkBA,KAKvC,0BACN,MAAMhtB,GAASV,KAAK2tB,SAAW3tB,KAAK6tB,SAAW,EACzCltB,EAAS0B,KAAKE,MAAMF,KAAKC,IAC7B5B,EAAQV,KAAK+tB,OAAO,GACpB1rB,KAAKC,IAAI5B,EAAQV,KAAK+tB,OAAO,GAAqB,EAAjB/tB,KAAK8tB,aAExC,MAAO,CACL,CACEkB,SAAU,CAACzU,EAAG,EAAGE,EAAG,EAAG/Z,QAAOC,UAC9BsuB,MAAOvB,GAAeA,GAAgBA,IAExC,CACEsB,SAAU,CAACzU,EAAG7Z,EAAQV,KAAK6tB,QAASpT,EAAG,EAAG/Z,QAAOC,UACjDsuB,MAAOvB,GAAeA,GAAiBA,KAKrC,qBACN,MAAMwB,EAAe7sB,KAAKE,MAAsB,IAAhBvC,KAAK4tB,UAC/BuB,EAAc9sB,KAAKC,IACvBD,KAAKE,MAAMF,KAAKP,IACd,IAAO9B,KAAK2tB,SAAW3tB,KAAK6tB,UAC3B7tB,KAAK2tB,SAAW3tB,KAAK6tB,SAAW7tB,KAAK+tB,OAAO,IACxC,EAAI/tB,KAAK+tB,OAAO,GAAK,EAAI/tB,KAAK+tB,OAAO,MAC5C/tB,KAAK2tB,SAAW3tB,KAAK6tB,QAAUqB,GAC3BE,EAAapvB,KAAK2tB,SACpBwB,EACAnvB,KAAK6tB,QACHltB,EAAS0B,KAAKC,IAClBtC,KAAK8tB,UACLzrB,KAAKE,MAAMF,KAAKC,IACd8sB,EAAapvB,KAAK+tB,OAAO,GACzBoB,EAAcnvB,KAAK+tB,OAAO,MAE9B,MAAO,CACL,CACEiB,SAAU,CAACzU,EAAG,EAAGE,EAAG,EAAG/Z,MAAO0uB,EAAYzuB,UAC1CsuB,MAAOvB,GAAeA,GAAgBA,IAExC,CACEsB,SAAU,CAACzU,EAAG6U,EAAapvB,KAAK6tB,QAASpT,EAAG,EAAG/Z,MAAOyuB,EAAaxuB,UACnEsuB,MAAOvB,GAAeA,GAAiBA,KAKrC,0BACN,MAAM2B,EAAcrvB,KAAK8tB,UACnBwB,EAAcjtB,KAAKE,MAAMF,KAAKC,KACjCtC,KAAK8tB,UAAY9tB,KAAK6tB,SAAW,EACjC7tB,KAAK+tB,OAAO,IAAM/tB,KAAK2tB,SAAW3tB,KAAK6tB,UACnC7tB,KAAK+tB,OAAO,GAAK/tB,KAAK+tB,OAAO,MAC9BwB,EAAeF,EACjBC,EACAtvB,KAAK6tB,QACH2B,EAAantB,KAAKP,IACtB9B,KAAK4tB,SACLvrB,KAAKE,MAAMF,KAAKC,KACbtC,KAAK2tB,SAAW3tB,KAAK6tB,SAAW,EACjCxrB,KAAKC,IACHgtB,EAActvB,KAAK+tB,OAAO,GAC1BwB,EAAevvB,KAAK+tB,OAAO,OAC3B0B,EAAYptB,KAAKC,IACrBD,KAAKE,MAAM8sB,EAAcrvB,KAAK+tB,OAAO,IACrC/tB,KAAK2tB,SAAW3tB,KAAK6tB,QAAU2B,GAEjC,MAAO,CACL,CACER,SAAU,CAACzU,EAAG,EAAGE,EAAG,EAAG/Z,MAAO+uB,EAAW9uB,OAAQ0uB,GACjDJ,MAAOvB,GAAeA,GAAgBA,IAExC,CACEsB,SAAU,CAACzU,EAAGkV,EAAYzvB,KAAK6tB,QAASpT,EAAG,EAAG/Z,MAAO8uB,EAAY7uB,OAAQ4uB,GACzEN,MAAOvB,GAAeA,IAExB,CACEsB,SAAU,CAACzU,EAAGkV,EAAYzvB,KAAK6tB,QAASpT,EAAG8U,EAAevvB,KAAK6tB,QAASntB,MAAO8uB,EAAY7uB,OAAQ2uB,GACnGL,MAAOvB,GAAkBA,KAKvB,yBACN,MAAM0B,EAAapvB,KAAK2tB,SAClB0B,EAAchtB,KAAKE,MAAMF,KAAKC,IAClC8sB,EAAapvB,KAAK+tB,OAAO,GACS,KAAjC/tB,KAAK8tB,UAAY9tB,KAAK6tB,WACnBsB,GAAenvB,KAAK2tB,SAAW3tB,KAAK6tB,SAAW,EAC/C0B,EAAeltB,KAAKC,IACxBtC,KAAK8tB,UAAYuB,EAAcrvB,KAAK6tB,QACpCxrB,KAAKE,MAAMF,KAAKC,IACd6sB,EAAcnvB,KAAK+tB,OAAO,GAC1BoB,EAAcnvB,KAAK+tB,OAAO,MACxB2B,EAAaN,EAAaD,EAAcnvB,KAAK6tB,QAEnD,MAAO,CACL,CACEmB,SAAU,CAACzU,EAAG,EAAGE,EAAG,EAAG/Z,MAAO0uB,EAAYzuB,OAAQ0uB,GAClDJ,MAAOvB,GAAgBA,GAAeA,IAExC,CACEsB,SAAU,CAACzU,EAAG,EAAGE,EAAG4U,EAAcrvB,KAAK6tB,QAASntB,MAAOyuB,EAAaxuB,OAAQ4uB,GAC5EN,MAAOvB,GAAkBA,IAE3B,CACEsB,SAAU,CAACzU,EAAG4U,EAAcnvB,KAAK6tB,QAASpT,EAAG4U,EAAcrvB,KAAK6tB,QAASntB,MAAOgvB,EAAY/uB,OAAQ4uB,GACpGN,MAAOvB,GAAkBA,KAKvB,wBACN,MAAM7V,EAAI7X,KAAK2tB,SACTgC,EAAKttB,KAAKE,MAAMF,KAAKC,IACzBuV,EAAI7X,KAAK+tB,OAAO,GACkB,KAAjC/tB,KAAK8tB,UAAY9tB,KAAK6tB,WACnBtV,EAAIlW,KAAKE,OACZvC,KAAK2tB,SAAW,EAAI3tB,KAAK6tB,UACrB7tB,KAAK+tB,OAAO,GAAK/tB,KAAK+tB,OAAO,GAAK/tB,KAAK+tB,OAAO,KAC/C6B,EAAKvtB,KAAKP,IACd9B,KAAK4tB,SACLvrB,KAAKE,MAAMF,KAAKC,IACuB,IAApCtC,KAAK2tB,SAAW,EAAI3tB,KAAK6tB,SAC1BtV,EAAIvY,KAAK+tB,OAAO,MACd8B,EAAKxtB,KAAKE,MAAMF,KAAKP,IACzBO,KAAKP,IACa,EAAhB9B,KAAK4tB,SACgC,KAApC5tB,KAAK2tB,SAAW,EAAI3tB,KAAK6tB,UAC5BtV,EAAIvY,KAAK+tB,OAAO,KACZ+B,EAAKjY,EAAI+X,EAAKC,EAAK,EAAI7vB,KAAK6tB,QAC5BkC,EAAK1tB,KAAKC,IACdtC,KAAK8tB,UAAY6B,EAAK3vB,KAAK6tB,QAC3BtV,GAEF,MAAO,CACL,CACEyW,SAAU,CAACzU,EAAG,EAAGE,EAAG,EAAG/Z,MAAOmX,EAAGlX,OAAQgvB,GACzCV,MAAOvB,GAAgBA,GAAeA,IAExC,CACEsB,SAAU,CAACzU,EAAG,EAAGE,EAAGkV,EAAK3vB,KAAK6tB,QAASntB,MAAOkvB,EAAIjvB,OAAQovB,GAC1Dd,MAAOvB,GAAkBA,IAE3B,CACEsB,SAAU,CAACzU,EAAGqV,EAAK5vB,KAAK6tB,QAASpT,EAAGkV,EAAK3vB,KAAK6tB,QAASntB,MAAOovB,EAAInvB,OAAQovB,GAC1Ed,MAAOvB,IAET,CACEsB,SAAU,CAACzU,EAAGqV,EAAK5vB,KAAK6tB,QAAUiC,EAAK9vB,KAAK6tB,QAASpT,EAAGkV,EAAK3vB,KAAK6tB,QAASntB,MAAOmvB,EAAIlvB,OAAQovB,GAC9Fd,MAAOvB,GAAiBA,KAKtB,yBACN,MAAMnV,EAAIvY,KAAK8tB,UACT8B,EAAKvtB,KAAKE,MAAMF,KAAKC,IACzBiW,EAAIvY,KAAK+tB,OAAO,GACiB,IAAhC/tB,KAAK2tB,SAAW3tB,KAAK6tB,WAElBhW,EAAIxV,KAAKE,OACZvC,KAAK8tB,UAAY,EAAI9tB,KAAK6tB,UACtB,EAAK7tB,KAAK+tB,OAAO,GAAK,EAAK/tB,KAAK+tB,OAAO,GAAK,EAAK/tB,KAAK+tB,OAAO,KAE9D4B,EAAKttB,KAAKE,MAAMsV,EAAI7X,KAAK+tB,OAAO,IAChCgC,EAAK1tB,KAAKE,MAAMsV,EAAI7X,KAAK+tB,OAAO,IAChCiC,EAAKzX,EAAIoX,EAAKI,EAAK,EAAI/vB,KAAK6tB,QAC5BiC,EAAKztB,KAAKP,IACd9B,KAAK4tB,SACLvrB,KAAKC,IAAItC,KAAK2tB,SAAWiC,EAAK5vB,KAAK6tB,QAAShW,IAE9C,MAAO,CACL,CACEmX,SAAU,CAACzU,EAAG,EAAGE,EAAG,EAAG/Z,MAAOkvB,EAAIjvB,OAAQ4X,GAC1C0W,MAAOvB,GAAeA,GAAgBA,IAExC,CACEsB,SAAU,CAACzU,EAAGqV,EAAK5vB,KAAK6tB,QAASpT,EAAG,EAAG/Z,MAAOovB,EAAInvB,OAAQgvB,GAC1DV,MAAOvB,GAAeA,IAExB,CACEsB,SAAU,CAACzU,EAAGqV,EAAK5vB,KAAK6tB,QAASpT,EAAGkV,EAAK3vB,KAAK6tB,QAASntB,MAAOovB,EAAInvB,OAAQovB,GAC1Ed,MAAOvB,IAET,CACEsB,SAAU,CAACzU,EAAGqV,EAAK5vB,KAAK6tB,QAASpT,EAAGkV,EAAKI,EAAK,EAAI/vB,KAAK6tB,QAASntB,MAAOovB,EAAInvB,OAAQqvB,GACnFf,MAAOvB,GAAkBA,KAKvB,mBAAmBpV,GACzB,OAAOA,EAAM7P,IAAI3I,GAAQA,EAAK+X,EAAI/X,EAAKyY,GAGjC,wBAAwBwV,GAC9B,OAAOA,EAAOtlB,IAAIwnB,GAAUA,EAAQ,IAAO,IAAOA,EAAQ,GAAO,IAAM,KAAKtI,KAAK,KAIrF,MAAM,GAIJ,YAAYoG,EAA0BI,EAA8BR,EAA0BC,EAA0BC,EAAyBC,EAAuB,EAAXH,EAAe,GAAtI,KAAAQ,eAA8B,KAAAR,WAA0B,KAAAC,WAA0B,KAAAC,UAAyB,KAAAC,YAC/I9tB,KAAK+tB,OAAS,GAAgBmC,WAAWnC,EAAQI,GACjDnuB,KAAK2E,MAAQopB,EAAO5rB,OAGd,kBAAkB4rB,EAAkBI,GAG1C,OAAOJ,EAAOtlB,IAAIwnB,GACT9B,EAAe,IACrB,YAAM8B,EAAO,EAJE,MAKf,YAAMA,EAJS,MAIS,IAItB,SACL,IAAI5pB,EAAS,IAAI8B,MAAwBnI,KAAK2E,OAE1CwrB,EAAsB,GAC1B,MAAMC,EAAc,CAACC,EAAgB1rB,KACnC,MAAMopB,EAAS/tB,KAAK+tB,OAAOtqB,MAAM4sB,EAAQA,EAAS1rB,GAC5C2rB,EAAM,YAAWvC,EAAQ,GAC/B,OAAQ/tB,KAAK2tB,UAAYhpB,EAAQ,GAAK3E,KAAK6tB,SAAWyC,GAElDC,EAAeC,IACnB,IAAIC,EAAoB,GACpBJ,EAAS,EACb,IAAI,IAAI1rB,KAAS6rB,EACfC,EAAQ9qB,KAAKyqB,EAAYC,EAAQ1rB,IACjC0rB,GAAU1rB,EAEZwrB,EAASxqB,KAAK,CAAC6qB,aAAYC,aAG7B,IAAI,IAAIC,EAAQ,EAAGA,IAAU1wB,KAAK2E,QAAS+rB,EAAO,CAChD,MAAMC,EAAS3wB,KAAK2E,MAAQ+rB,EACzBA,EAAQ,GAAKC,EAAS,GAGzBJ,EAAY,CAACG,EAAOC,IAEtB,IAAI,IAAID,EAAQ,EAAGA,IAAU1wB,KAAK2E,MAAQ,IAAK+rB,EAC7C,IAAI,IAAIC,EAAS,EAAGA,IAAW3wB,KAAK2E,MAAQ+rB,IAASC,EAAQ,CAC3D,MAAMC,EAAQ5wB,KAAK2E,MAAQ+rB,EAAQC,EAC/BD,EAAQ,GACNC,GAAW3wB,KAAKmuB,aAAe,IAAQ,EAAI,IAC3CyC,EAAQ,GAGdL,EAAY,CAACG,EAAOC,EAAQC,IAGhC,IAAI,IAAIF,EAAQ,EAAGA,IAAU1wB,KAAK2E,MAAQ,IAAK+rB,EAC7C,IAAI,IAAIC,EAAS,EAAGA,IAAW3wB,KAAK2E,MAAQ+rB,IAASC,EACnD,IAAI,IAAIC,EAAQ,EAAGA,IAAU5wB,KAAK2E,MAAQ+rB,EAAQC,IAAUC,EAAO,CACjE,MAAMC,EAAS7wB,KAAK2E,MAAQ+rB,EAAQC,EAASC,EAC1CF,EAAQ,GAAKC,EAAS,GAAKC,EAAQ,GAAKC,EAAS,GAGpDN,EAAY,CAACG,EAAOC,EAAQC,EAAOC,IAKzC,IAAIC,EAA0B,KAC1BC,EAAc,EAClB,IAAI,MAAMC,KAAWb,EAAU,CAC7B,MAAM,QAACM,EAASD,WAAYS,GAAUD,EAChCE,EAAYD,EAAO9uB,OACnBgvB,EAAc,YAAWV,EAAS,GACpCzwB,KAAK6tB,SAAWqD,EAAY,GAC1BE,EAAgB/uB,KAAKC,OAAOmuB,GAE5BY,GADgBhvB,KAAKP,OAAO2uB,GACpBW,EAAgBpxB,KAAK4tB,SAAY,IAAM,GAC/C0D,EAAO,MACX,IAAI,IAAIC,EAAO,EAAGA,IAASL,IAAaK,EACtC,GAAGN,EAAOM,EAAO,GAAKN,EAAOM,GAC3B,OAAO,IAGX,OAAO,GANI,GAQPC,EAAOnvB,KAAKovB,IAAIN,EAAcnxB,KAAK8tB,WAAauD,EAAOC,IACzDR,GAAkBU,EAAOT,KAC3BD,EAAiBE,EACjBD,EAAcS,GAIlB,MAAME,EAAgBZ,EAAeN,WAChCmB,EAAiBb,EAAeL,QAC/BmB,EAAWF,EAAcvvB,OAE/B,IAAIma,EAAQ,EACR7B,EAAI,EACR,IAAI,IAAIoX,EAAM,EAAGA,IAAQD,IAAYC,EAAK,CACxC,MAAMC,EAAWJ,EAAcG,GACzBE,EAAaJ,EAAeE,GAC5BlxB,EAAS0B,KAAKE,MAAMwvB,GAE1B,IAAIxX,EAAI,EACR,IAAI,IAAIyX,EAAM,EAAGA,IAAQF,IAAYE,EAAK,CACxC,MAAM/C,EAAQvB,IACD,IAARmE,EAAYnE,GAAeA,KAC3BmE,IAAQD,EAAW,EAAIlE,GAAkBA,KACjC,IAARsE,EAAYtE,GAAgBA,KAC5BsE,IAAQF,EAAW,EAAIpE,GAAiBA,IAEvCuC,EAAQjwB,KAAK+tB,OAAOzR,GACpB5b,EAASsxB,IAAQF,EAAW,EAC7B9xB,KAAK2tB,SAAWpT,EACjBlY,KAAKE,MAAM0tB,EAAQ8B,GACvB1rB,EAAOiW,GAAS,CACd0S,SAAU,CAACzU,IAAGE,IAAG/Z,QAAOC,UACxBsuB,SAGF1U,GAAK7Z,EAAQV,KAAK6tB,UAChBvR,EAEJ7B,GAAK9Z,EAASX,KAAK6tB,QAGrB,OAAOxnB,G,uBCraI,MAAM,GAenB,YAAYrD,GAHJ,KAAAivB,WAAY,EACZ,KAAAhmB,WAAa,IAiEd,KAAAimB,UAAY,KACjB,GAAGlyB,KAAKkR,aACN,OAAO,EAGT,IAAIihB,EAAgB,EAAGC,EAAiB,EAAGC,EAAsB,EAiBjE,OAhBAryB,KAAKsyB,YAAYhsB,QAAQzE,IACpBA,EAAW0wB,YACT1wB,EAAWqwB,eACVC,EAGDtwB,EAAW2wB,YACVH,GAIHxwB,EAAW2wB,YACVJ,IAICA,IAAmBC,GAAuBF,EAAgB,GAG5D,KAAAM,aAAe,KACpBzyB,KAAK0R,QAAQtR,UAAUkM,OAAO,aAActM,KAAKkyB,cAhFjD,YAAWlyB,KAAMgD,GAEbhD,KAAK0R,QAEE1R,KAAK0R,QAAQtR,UAAUuR,SAAS,gBACzC3R,KAAKyyB,aAAe,KAClBzyB,KAAK0R,QAAQghB,gBAAgB,YAAa1yB,KAAKkyB,aAAelyB,KAAK4R,YAHrE5R,KAAK0R,QAAU,EAAa,CAACrE,KAAM,UAOjCrK,EAAQ2vB,gBACV3yB,KAAK4yB,WAAa1yB,SAASC,cAAc,kBACzCH,KAAK4yB,WAAWxyB,UAAUC,IAAI,qBAAsB,UAAYL,KAAKiM,YACrEjM,KAAK4yB,WAAWxvB,aAAa,OAAQ,GAAKpD,KAAKiH,QAE3CjE,EAAQ6vB,kBACV7yB,KAAKoR,WAAa,IAAI,EAAYC,IAChCrR,KAAKkR,aAAeG,EACpBrR,KAAKyyB,eACLzyB,KAAK4yB,WAAWjxB,WAGlB3B,KAAKoR,WAAWnR,UAAU8J,OAAO/J,KAAK4yB,cAI1C5yB,KAAKsyB,YAAYhsB,QAAQzE,IACvB7B,KAAK+N,eAAe1N,IAAIwB,EAAWE,MAAnC/B,CAA0C,QAASA,KAAKyyB,gBAG1DzyB,KAAKyyB,eAGP,eACE,OAAOzyB,KAAKiyB,UAGd,aAAoB/vB,GAClBlC,KAAKiyB,UAAY/vB,EACjBlC,KAAKsyB,YAAYhsB,QAAQzE,GAAcA,EAAWE,MAAM2wB,gBAAgB,WAAYxwB,IACpFlC,KAAKyyB,eAGA,gBAAgBtsB,EAAuB2sB,GAAkB,GAC9D9yB,KAAK4R,UAAW,EAChBzL,EAAQtF,KAAK,KACRiyB,IACD9yB,KAAK4R,UAAW,IAEjB,KACD5R,KAAK4R,UAAW,KClFP,SAASmhB,GAAUC,EAA6D7nB,GAC7F,MAAM8nB,EAAO/yB,SAASC,cAAc,QAYpC,OAVA6yB,EAAO1sB,QAAQ8X,IACb,MAAM,UAACne,EAAS,MAAE8B,GAASqc,EAC3B6U,EAAKlpB,OAAO9J,GACZ8B,EAAMf,iBAAiB,SAAWiB,IAC7BF,EAAM4b,SACPxS,EAASpJ,EAAMG,MAAOD,OAKrBgxB,ECJM,MAAM,GAUnB,YAAYjwB,EAeP,IAjBE,KAAAkwB,SAAU,EAkBflzB,KAAKC,UAAYC,SAASC,cAAc6C,EAAQmwB,YAAcnwB,EAAQoa,cAAgB,QAAU,OAChGpd,KAAKC,UAAUG,UAAUC,IAAI,OAE7BL,KAAKqsB,SAAWnsB,SAASC,cAAc,OACvCH,KAAKqsB,SAASjsB,UAAUC,IAAI,gBAC5BL,KAAKqsB,SAASjpB,aAAa,MAAO,QAC/BJ,EAAQqpB,SACuB,iBAAtBrpB,EAAgB,SACxBc,EAAa9D,KAAKqsB,SAAUrpB,EAAQqpB,UAEpCrsB,KAAKqsB,SAAStiB,OAAO/G,EAAQqpB,UAEvBrpB,EAAQowB,iBAChBpzB,KAAKqsB,SAAStiB,OAAO,eAAK/G,EAAQowB,gBAAiBpwB,EAAQqwB,mBAE7DrzB,KAAKC,UAAU8J,OAAO/J,KAAKqsB,UAE3B,IAAIiH,IAAgBtwB,EAAQswB,YAC5B,GAAGtwB,EAAQmwB,YAAcnwB,EAAQoa,cAAe,CAO9C,GANAkW,GAAc,EACXtwB,EAAQmwB,aACTnzB,KAAKmzB,WAAanwB,EAAQmwB,WAC1BnzB,KAAKC,UAAU8J,OAAO/J,KAAKmzB,WAAW3hB,QAGrCxO,EAAQoa,cAAe,CACxBpd,KAAKod,cAAgBpa,EAAQoa,cAE7B,MAAMmW,EAAWvwB,EAAQoa,cAAc5L,MAAMpR,UAAUuR,SAAS,yBAC7D4hB,GACDvzB,KAAKC,UAAUG,UAAUC,IAAI,mBAC7B2C,EAAQwwB,WAAaxzB,KAAKod,cAAc5L,OAExCxR,KAAKC,UAAU8J,OAAO/J,KAAKod,cAAc5L,OAGvCxO,EAAQywB,oBAAuBF,GACjCvzB,KAAKod,cAAcrb,MAAMf,iBAAiB,SAAU,KAClD,OAAAuL,EAAA,GAAevM,KAAKqsB,SAAU,eAAKrsB,KAAKod,cAAcrb,MAAM4b,QAAU,mBAAqB,yBAKvF3a,EAAQmwB,YAAcnwB,EAAQoa,eACtC5L,MAAMpR,UAAUC,IAAI,iBAGxB,GAAG2C,EAAQ4K,OAAS5K,EAAQ0wB,aAAc,CACxC,IAAIC,EAmBJ,GAlBG3wB,EAAQwwB,YACTG,EAAIzzB,SAASC,cAAc,OAC3BwzB,EAAEvzB,UAAUC,IAAI,iBAChBL,KAAKC,UAAU8J,OAAO4pB,IAEtBA,EAAI3zB,KAAKC,UAGXD,KAAK4N,MAAQ1N,SAASC,cAAc,OACpCH,KAAK4N,MAAMxN,UAAUC,IAAI,aACzBL,KAAK4N,MAAMxK,aAAa,MAAO,QAC5BJ,EAAQ4K,MACT5N,KAAK4N,MAAM3J,UAAYjB,EAAQ4K,MAE/B5N,KAAK4N,MAAM7D,OAAO,eAAK/G,EAAQ0wB,eAEjCC,EAAE5pB,OAAO/J,KAAK4N,OAEX5K,EAAQwwB,WAAY,CACrB,MAAMA,EAAatzB,SAASC,cAAc,OAC1CqzB,EAAWpzB,UAAUC,IAAI,YAAa,mBAEJ,iBAAxB2C,EAAkB,WAC1BwwB,EAAWvvB,UAAYjB,EAAQwwB,WAE/BA,EAAWzpB,OAAO/G,EAAQwwB,YAG5BG,EAAE5pB,OAAOypB,IAIVxwB,EAAQqK,OACTimB,GAAc,EACdtzB,KAAK4N,MAAMxN,UAAUC,IAAI,QAAS,SAAW2C,EAAQqK,MACrDrN,KAAKC,UAAUG,UAAUC,IAAI,kBAG5BizB,GACDtzB,KAAKC,UAAUG,UAAUC,IAAI,oBAG5B2C,EAAQ4wB,gBACT5wB,EAAQyG,UAAY,IAAMzG,EAAQ4wB,cAAc7iB,SAG/C/N,EAAQyG,WAAazG,EAAQmwB,YAAcnwB,EAAQoa,iBACnB,mBAAvBpa,EAAiB,WACzBhD,KAAKC,UAAUe,iBAAiB,QAAUiB,IACrCjC,KAAKkzB,SACPlwB,EAAQyG,UAAkBxH,KAI/BjC,KAAKC,UAAUG,UAAUC,IAAI,gBAAiB,gBAE1C2C,EAAQ2K,UACV,OAAA2P,GAAA,QAAOtd,KAAKC,eAAWyE,OAAWA,GAAW,KAY9C,MAAMmvB,GAAoB,CAACC,EAAa3oB,IACtC4nB,GAAUe,EAAKrrB,IAAI2V,IAAK,CAAEne,UAAWme,EAAEne,UAAW8B,MAAOqc,EAAE+U,WAAWpxB,SAAUoJ,GChIlF,SAAS4oB,GAAoB7W,GAC9BxK,UAAUshB,UAKdthB,UAAUshB,UAAUC,UAAU/W,GA/BhC,SAAqCA,GACnC,IAAIgX,EAAWh0B,SAASC,cAAc,YACtC+zB,EAAShyB,MAAQgb,EAGjBgX,EAASvxB,MAAMwxB,IAAM,IACrBD,EAASvxB,MAAMoa,KAAO,IACtBmX,EAASvxB,MAAMyxB,SAAW,QAE1Bl0B,SAASiW,KAAKyK,YAAYsT,GAC1BA,EAASzoB,QACTyoB,EAASG,SAET,IACEn0B,SAASo0B,YAAY,QAIrB,MAAM7nB,IAIRvM,SAASiW,KAAKoe,YAAYL,GAKxBM,CAA4BtX,G,aCxBjB,MAAM,GAKnB,YAAYla,GAOV,MAAMwO,EAAQxR,KAAKwR,MAAQtR,SAASC,cAAc,SAClDqR,EAAMpR,UAAUC,IAAI,eAEpB,MAAM0B,EAAQ/B,KAAK+B,MAAQ7B,SAASC,cAAc,SAClD4B,EAAMoB,KAAO,QACIpB,EAAMuH,KAAO,eAAiBtG,EAAQsG,KAEpDtG,EAAQd,QACTH,EAAMG,MAAQc,EAAQd,MAEnBc,EAAQyxB,WACTC,EAAA,QAAgBC,WAAW9zB,KAAK+zB,IAC9B7yB,EAAM4b,QAAU,YAAgBiX,EAAO5xB,EAAQyxB,YAAczxB,EAAQd,QAGvEH,EAAMf,iBAAiB,SAAU,KAC/B0zB,EAAA,QAAgBG,SAAS7xB,EAAQyxB,SAAUzxB,EAAQd,WAKzD,MAAM4yB,EAAO90B,KAAK80B,KAAO50B,SAASC,cAAc,OAChD20B,EAAK10B,UAAUC,IAAI,oBAEhB2C,EAAQka,KACT4X,EAAK7wB,UAAYjB,EAAQka,KAWjBla,EAAQ+xB,SAChB,gBAAMD,EAAM9xB,EAAQ+xB,SAGtBvjB,EAAMzH,OAAOhI,EAAO+yB,GAGtB,cACE,OAAO90B,KAAK+B,MAAM4b,QAGpB,YAAYA,GACV3d,KAAK0D,iBAAiBia,GAEtB,MAAMrD,EAAQ,IAAI0a,MAAM,SAAU,CAAChI,SAAS,EAAMjG,YAAY,IAC9D/mB,KAAK+B,MAAM0M,cAAc6L,GAGpB,iBAAiBqD,GACtB3d,KAAK+B,MAAM4b,QAAUA,GCpEzB,MAAMsX,GAAU/0B,SAASC,cAAc,OAEhC,SAAS+0B,GAAMrnB,GACpB,OAAAtB,EAAA,GAAe0oB,GAASpnB,GACxB3N,SAASiW,KAAKpM,OAAOkrB,IAElBA,GAAQ7oB,QAAQU,SAASE,cAAcioB,GAAQ7oB,QAAQU,SAC1DmoB,GAAQ7oB,QAAQU,QAAU,GAAKtB,WAAW,KACxCypB,GAAQtzB,gBACDszB,GAAQ7oB,QAAQU,SACtB,KAGE,SAASqoB,GAASnyB,GAGvBkyB,GAAM,eAAKlyB,EAAQoyB,cCrBN,SAASC,GACtB5R,EACA6R,EACAC,GAAiB,EACjBC,GAAgB,GAEhB,IAAIC,EACAC,EAAiDzvB,EAAgCylB,EACjFiK,GAAa,EAEjB,MAAO,IAAI1nB,KACLynB,IAAgBA,EAAiB,IAAI7yB,QAAQ,CAAC+yB,EAAUC,KAAa5vB,EAAU2vB,EAAUlK,EAASmK,KAEnGJ,GACDzoB,aAAayoB,GACbE,GAAa,EACbjK,IACAgK,EAAiB,IAAI7yB,QAAQ,CAAC+yB,EAAUC,KAAa5vB,EAAU2vB,EAAUlK,EAASmK,KAC1EN,IAERtvB,EAAQwd,KAAMxV,IACd0nB,GAAa,GAGfF,EAAiBjqB,WAAW,MAEvBgqB,GAAmBD,IAAkBI,GAEtC1vB,EAAQwd,KAAMxV,IAGhBwnB,EAAiBC,EAAiBzvB,EAAUylB,OAAShnB,EACrDixB,GAAa,GACZL,GAEHI,EAAelpB,MAAM,QACdkpB,GD9BXT,GAAQ70B,UAAUC,IAAI,S,aEIf,MAAM,WAA2B,IAatC,YAAY2C,GACVC,MAAMD,GAENhD,KAAK81B,uBAAyBT,GAASr1B,KAAK+1B,cAAcxvB,KAAKvG,MAAO,KAAK,GAAO,GAElFgD,EAAQ+K,eAAe1N,IAAIL,KAAK+B,MAAhCiB,CAAuC,QAAS,KAC9C,MAAMd,EAAQlC,KAAKg2B,WAGnB,GAAG9zB,IAAUlC,KAAKi2B,gBAAkB/zB,EAAMC,OAGxC,OAFAnC,KAAKk2B,SAAS,IAAWC,QAASn2B,KAAKgD,QAAQwO,YAC/CxR,KAAKgD,QAAQmI,UAAYnL,KAAKgD,QAAQmI,YAE7B,IAAkBirB,gBAAgBl0B,GAG3ClC,KAAKk2B,SAAS,IAAWC,SAFzBn2B,KAAKq2B,SAASr2B,KAAKgD,QAAQszB,aAK1Bt2B,KAAK+B,MAAM3B,UAAUuR,SAAS,SAC/B3R,KAAKgD,QAAQmI,UAAYnL,KAAKgD,QAAQmI,WAIxCnL,KAAK81B,uBAAuB5zB,KAIzB,WACL,IAAIA,EAAQlC,KAAKkC,MAMjB,OALGlC,KAAKgD,QAAQuzB,OACdr0B,EAAQA,EAAMuB,MAAMzD,KAAKgD,QAAQuzB,KAAKp0B,QACtCnC,KAAK0D,iBAAiB1D,KAAKgD,QAAQuzB,KAAOr0B,IAGrCA,EAGD,cAAcs0B,GACjBx2B,KAAKy2B,uBAELz2B,KAAKgD,QAAQiE,OACdjH,KAAKy2B,qBAAuB,KAAWC,UAAU,yBAA0B,CACzEC,QAAS,IAAgBC,gBAAgB52B,KAAKgD,QAAQiE,OAAO4vB,YAC7DL,aAGFx2B,KAAKy2B,qBAAuB,KAAWC,UAAU,wBAAyB,CAACF,aAG7Ex2B,KAAKy2B,qBAAqB51B,KAAKi2B,IAC1B92B,KAAKg2B,aAAeQ,IAEpBM,EACD92B,KAAKk2B,SAAS,IAAWa,MAAO/2B,KAAKgD,QAAQg0B,eAE7Ch3B,KAAKq2B,SAASr2B,KAAKgD,QAAQi0B,aAE3BxqB,IACF,GAAGzM,KAAKg2B,aAAeQ,EAEvB,OAAO/pB,EAAItJ,MACT,IAAK,mBACHnD,KAAKq2B,SAASr2B,KAAKgD,QAAQszB,gBAI9Bz1B,KAAK,KACNb,KAAKy2B,0BAAuB/xB,EAC5B1E,KAAKgD,QAAQmI,UAAYnL,KAAKgD,QAAQmI,WAEtC,MAAMjJ,EAAQlC,KAAKg2B,WAChB9zB,IAAUs0B,GAAYx2B,KAAKk3B,mBAAqB,IAAkBd,gBAAgBl0B,IACnFlC,KAAK+1B,cAAc7zB,O,sBCxEZ,MAAM,WAAkB,KACrC,YAAoBsH,EAAmBxG,EAA4B,IAGjE,GAFAC,MAAM,cAAgBuG,EAAY,IAAMA,EAAY,IAAKxG,EAAQ4a,SAAW,aAAgB5a,EAAQ4a,SAAU,OAAF,QAAGuZ,iBAAiB,GAASn0B,IADvH,KAAAwG,YAGfxG,EAAQiE,OAAQ,CACjB,IAAImwB,EAAW,IAAI,GACnBA,EAASh0B,aAAa,SAAU,KAChCg0B,EAASh0B,aAAa,OAAQ,GAAKJ,EAAQiE,QAC3CmwB,EAASh3B,UAAUC,IAAI,aACvBL,KAAKyN,OAAOmR,QAAQwY,GAGlBp0B,EAAQq0B,UACPr0B,EAAQ0wB,eAAiB1wB,EAAQ4K,MAAO5N,KAAK4N,MAAM7D,OAAO,eAAK/G,EAAQ0wB,cAAgB,UAAW1wB,EAAQs0B,gBACxGt3B,KAAK4N,MAAMsc,UAAYlnB,EAAQ4K,OAAS,IAG/C,MAAM2pB,EAAWr3B,SAASs3B,yBAE1B,GAAGx0B,EAAQy0B,oBAAsBz0B,EAAQ00B,YAAa,CACpD,MAAMC,EAAIz3B,SAASC,cAAc,KACjCw3B,EAAEv3B,UAAUC,IAAI,qBACb2C,EAAQy0B,mBAAoBE,EAAE5tB,OAAO,eAAK/G,EAAQy0B,mBAAoBz0B,EAAQ40B,sBACzE50B,EAAQ00B,cAAaC,EAAE1zB,UAAYjB,EAAQ00B,aAEnDH,EAASxtB,OAAO4tB,GAGf30B,EAAQ60B,aACT73B,KAAKC,UAAUG,UAAUC,IAAI,iBAE7B2C,EAAQ60B,WAAWvxB,QAAQwxB,IACzBA,EAAEC,YAAa,EACf,MAAM3a,EAAgB,IAAI,KAAc0a,GACxCA,EAAE1a,cAAgBA,EAClBma,EAASxtB,OAAOqT,EAAc5L,SAGhCxO,EAAQ4a,QAAQtX,QAAQuU,IACtB,GAAGA,EAAOmd,SAAU,CAClB,MAAMC,EAAWpd,EAAOmd,SACxBnd,EAAOmd,SAAW,KAChB,MAAMrE,EAAsB,IAAI9vB,IAChCb,EAAQ60B,WAAWvxB,QAAQwxB,IACtBA,EAAE1a,cAAcO,SACjBgW,EAAEtzB,IAAIy3B,EAAE5a,QAGZ+a,EAAStE,QAMjB3zB,KAAKC,UAAU0gB,aAAa4W,EAAUv3B,KAAKyN,OAAOyqB,qB,aCzDvC,MAAM,WAAuB,EAIhC,OACRl4B,KAAKC,UAAUG,UAAUC,IAAI,sBAAuB,wBAEpD,MAAM83B,EAAc,IAAgBA,YAAYn4B,KAAKgS,QAErDhS,KAAKmR,SAASgnB,EAAc,cAAgB,aAE5C,MAAMC,EAAU,IAAI,GAAe,CACjC9uB,KAAM6uB,EAAc,cAAgB,cAGhCE,EAAS,eACTC,EAAa,IAAI,GAAI,CACzBnF,WAAY,IAAI,GAAW,CACzB4B,QAASoD,EAAc,iBAAmB,cAC1C7uB,KAAM+uB,EACNn2B,MAAO,YAETkxB,gBAAiB+E,EAAc,qBAAuB,oBAElDI,EAAY,IAAI,GAAI,CACxBpF,WAAY,IAAI,GAAW,CACzB4B,QAASoD,EAAc,gBAAkB,aACzC7uB,KAAM+uB,EACNn2B,MAAO,WAETkxB,gBAAiB+E,EAAc,oBAAsB,mBAEjDlF,EAAOY,GAAkB,CAACyE,EAAYC,GAAar2B,IACvD,MAAMoG,EAAI,CAACkwB,EAAgBC,GACd,WAAVv2B,GAAoBoG,EAAExD,UAEzBwD,EAAE,GAAGrI,UAAUG,UAAUuB,OAAO,QAChC2G,EAAE,GAAGrI,UAAUG,UAAUC,IAAI,QAE7B8K,MAGI4hB,EAAa,IAAgB2L,QAAQ14B,KAAKgS,QAEhDomB,EAAQvqB,QAAQ9D,OAAOkpB,GAEvB,MAAMuF,EAAiB,IAAI,GAAe,IAGpCG,EAAU,IAAI,GAAI,CACtB/qB,MAAQ5N,KAAK44B,SAASC,gBAA0DC,KAChF1F,gBAAiB+E,EAAc,yBAA2B,sBAC1D1uB,UAAW,KACTsqB,GAAqB/zB,KAAK44B,SAASC,gBAA0DC,MAC7F5D,GAAM,UAAKlc,OAAO,cAAc,OAI9B+f,EAAY,YAAO,qCAAsC,CAAC1rB,KAAM,SAAU6P,KAAM,eAEtF,YAAiB6b,EAAW,KAC1B,IAAI,GAAU,cAAe,CAC3Bnb,QAAS,CAAC,CACRmX,QAAS,eACTiD,SAAU,KACR,MAAM1rB,EAAS,OAAA0sB,GAAA,GAAiB,CAACD,IAAY,GAE7C,UAAkBE,kBAAkBj5B,KAAKgS,QAAQ,GAAMnR,KAAKi4B,IAC1DxsB,IACAqsB,EAAQ/qB,MAAM3J,UAAY60B,OAMhCpF,aAAc,aACd+D,mBAAoB,gBACnBlX,QACF,CAACxS,eAAgB/N,KAAK+N,iBAEzByqB,EAAe3qB,QAAQ9D,OAAO4uB,EAAQ14B,UAAW84B,GAEjD,MAAMN,EAAgB,IAAI,GAAe,CACvCS,QAASf,EAAc,+BAAiC,6BACxDgB,aAAa,IAGT7nB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAEM8K,EAAW,KACf,MAAMiuB,EAAWd,EAAWnF,WAAWxV,SAHrB,UAGiCsY,GAC7CoD,EAAenC,mBAAqBmC,EAAet3B,MAAM3B,UAAUuR,SAAS,SAClF2nB,EAASl5B,UAAUkM,OAAO,aAAc8sB,IAGpCC,EAAiB,IAAI,GAAmB,CAC5C7nB,MAAO,oBACPlI,KAAM,oBACNpG,WAAW,EACX6K,eAAgB/N,KAAK+N,eACrBipB,cAAe,iBACfV,YAAa,eACbW,UAAW,aACX9rB,SAAUA,EACVlE,OAAQjH,KAAKgS,OAAO8V,UAAS,GAC7ByO,KAlBkB,UAqBdN,EArBc,SAqBkBlJ,EAAsByJ,UAAY,IAExEllB,EAAavH,OAAOsvB,EAAep5B,WACnCw4B,EAAc5qB,QAAQ9D,OAAOuH,GAE7B,MAAMgoB,EAAW,EAAa,CAACjsB,KAAM,QAAS7D,UAAW,eACzDxJ,KAAK6N,QAAQ9D,OAAOuvB,GAEpB,YAAiBA,EAAU,KACC,aAAgBA,GAC1C,MAAM9C,EAAW+B,EAAUpF,WAAWxV,QAAU0b,EAAerD,WAAa,GAC5E,IAAgBuD,YAAYv5B,KAAKgS,QAAQnR,KAAK24B,GACrC,IAAgBC,eAAeD,EAAWhD,IAChD31B,KAAK,KAENb,KAAK05B,WAEN,CAAC3rB,eAAgB/N,KAAK+N,kBAtCL,UAwCnBkoB,EAAgCsC,EAAYD,GAAYnF,WAAWxV,SAAU,EAC9E0b,EAAeM,iBAAiB1D,GAEhCj2B,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,UAAWu4B,EAAev4B,UAAWw4B,EAAcx4B,Y,aCrJvE,MAAM,GAOnB,YAAY+C,GANL,KAAA42B,SAAU,EAIT,KAAAC,QAAS,EAMf,YAAW75B,KAAMgD,GAEjBA,EAAQ+H,WAAWM,iBAAmB,KACpCrL,KAAK8F,QAIF,OACL,OAAG9F,KAAK65B,OACCh3B,QAAQoD,UAGdjG,KAAK45B,QACC55B,KAAKmG,SAGdnG,KAAK45B,SAAU,OACf55B,KAAKmG,QAAUnG,KAAK85B,aAAaj5B,KAAKyqB,IACpCtrB,KAAK45B,SAAU,EACf55B,KAAKmG,aAAUzB,EAEZ4mB,GACDtrB,KAAK65B,QAAS,EACd75B,KAAK+K,WAAWM,iBAAmB,MAEnCrL,KAAK+K,WAAWgvB,oBAEjB,KACD/5B,KAAKmG,aAAUzB,EACf1E,KAAK45B,SAAU,O,+UClBN,MAAM,GAiDnB,YAAY52B,GAhDL,KAAA/C,UAAYC,SAASC,cAAc,OACnC,KAAAyJ,KAAO,GAAkBC,iBAIzB,KAAAsI,eAAiBjS,SAASC,cAAc,OAQxC,KAAA65B,SAAW,IAAIn2B,IAEf,KAAAqvB,SAAU,EAET,KAAAlrB,SAAW,EACX,KAAAiyB,YAAc,EAGd,KAAArvB,MAAQ,GAGR,KAAAsvB,WAAkG,GAElG,KAAAC,gBAA+B,IAAIt2B,IAInC,KAAAu2B,SAAmC,CAAC,WAGpC,KAAAC,aAAc,EACd,KAAAhoB,eAAgB,EAChB,KAAApG,WAAa,GACb,KAAAquB,YAAa,EAGb,KAAAC,QAA+D,GAK/D,KAAAC,aAA4B,oBAE5B,KAAAC,gBAAiB,EAkJjB,KAAA1tB,QAAU,KAChB,MAAM7K,EAAQlC,KAAK+B,MAAMG,MACzB,GAAGlC,KAAK4K,QAAU1I,EAAO,EACpBlC,KAAKo6B,SAASM,SAAS,aAAe16B,KAAKo6B,SAASM,SAAS,cAC9D16B,KAAK26B,eAAiB,MAGrB36B,KAAKo6B,SAASM,SAAS,aACxB16B,KAAKgI,SAAW,EAChBhI,KAAKi6B,YAAc,GAGrB,IAAI,IAAIjvB,KAAKhL,KAAKu6B,UAEdv6B,KAAKu6B,QAAQvvB,GAGjBhL,KAAK4J,KAAO,GAAkBC,iBAE9B7J,KAAKmG,QAAU,KACfnG,KAAKk6B,WAAa,GAClBl6B,KAAK4K,MAAQ1I,EACblC,KAAKm6B,gBAAgBhwB,QACrBnK,KAAKy6B,gBAAiB,EAGtBz6B,KAAK46B,mBAiLT,KAAAb,iBAAmB,KACjB/5B,KAAK+K,WAAWgvB,oBA5UhB,YAAW/5B,KAAMgD,GAEjBhD,KAAKC,UAAUG,UAAUC,IAAI,YAE7B,MAAMw6B,GAAK76B,KAAK86B,mBAAqB96B,KAAK+6B,eAAex0B,KAAKvG,MAwC9D,GAvCAA,KAAK86B,kBAAqBhpB,IACrB9R,KAAKy6B,iBACNz6B,KAAK+K,WAAWiwB,QAAQtR,YAAY1pB,KAAK4J,MACzC5J,KAAK+K,WAAWG,oBAAoBlL,KAAK4J,MACzC5J,KAAKy6B,gBAAiB,GAGxB3oB,EAAUA,EAAQlK,OAAOX,IACvB,MAAMg0B,GAAej7B,KAAKm6B,gBAAgBxyB,IAAIV,GAE9C,OADGg0B,GAAaj7B,KAAKm6B,gBAAgB95B,IAAI4G,GAClCg0B,IAGNj7B,KAAKk7B,mBACNppB,EAAUA,EAAQlK,OAAOX,IACvB,GAAGA,EAAOk0B,WAAY,CAEpB,IADa,IAAgBC,QAAQn0B,GAC5Bo0B,QACP,OAAOr7B,KAAKk7B,iBAAiBzqB,KAAK6qB,GAAU,IAAgBA,GAAQr0B,IAIxE,OAAO,KAIJ4zB,EAAE/oB,IAGX9R,KAAK+B,MAAQ7B,SAASC,cAAc,SACpCH,KAAK+B,MAAM3B,UAAUC,IAAI,yBACtBL,KAAK4M,YACN,gBAAM5M,KAAK+B,MAAO/B,KAAK4M,iBAAalI,EAAW,eAE/C,gBAAM1E,KAAK+B,MAAO,qBAAiB2C,EAAW,eAGhD1E,KAAK+B,MAAMoB,KAAO,OAEfnD,KAAKq6B,YAAa,CACnB,IAAIkB,EAAer7B,SAASC,cAAc,OAC1Co7B,EAAan7B,UAAUC,IAAI,6BAE3BL,KAAKw7B,kBAAoBt7B,SAASC,cAAc,OAChDH,KAAKw7B,kBAAkBp7B,UAAUC,IAAI,mBAErCL,KAAKw7B,kBAAkBzxB,OAAO/J,KAAK+B,OACnCw5B,EAAaxxB,OAAO/J,KAAKw7B,mBACzBx7B,KAAKy7B,mBAAqB,IAAI,IAAWF,GAEzC,IAAIG,EAAYx7B,SAASC,cAAc,MAEvCH,KAAKw7B,kBAAkBx6B,iBAAiB,QAAUiB,IAChD,GAAGjC,KAAKkzB,QAAS,OACjB,IAAIre,EAAS5S,EAAE4S,OAGf,GAFAA,EAAS,OAAAiN,GAAA,GAAgBjN,EAAQ,kBAE7BA,EAAQ,OAEZ,MAAM5N,EAAS4N,EAAOzI,QAAQmC,IACxBotB,EAAK37B,KAAKmS,eAAetC,cAAc,kBAAoB5I,EAAS,MACtE00B,EAGFA,EAAGC,QAFH57B,KAAK2B,OAAOsF,EAAO6gB,cAMvB9nB,KAAKC,UAAU8J,OAAOwxB,EAAcG,GAGtC17B,KAAKmS,eAAe/R,UAAUC,IAAI,sBAClCL,KAAKmS,eAAepI,OAAO/J,KAAK4J,MAChC5J,KAAK+K,WAAa,IAAI,IAAW/K,KAAKmS,gBACtCnS,KAAK+K,WAAWG,oBAAoBlL,KAAK4J,MAEzC5J,KAAKmS,eAAenR,iBAAiB,QAAUiB,IAC7C,MAAM4S,EAAS,OAAAgnB,GAAA,GAAgB55B,EAAE4S,OAAQ,gBAGzC,GAFA,OAAA6I,EAAA,GAAYzb,IAER4S,EAAQ,OACZ,GAAG7U,KAAKkzB,QAAS,OAEjB,IAAI3kB,EAAuBsG,EAAOzI,QAAQnF,OAG1C,GAFAsH,EAAMA,EAAI4sB,WAAa5sB,EAAIuZ,WAAavZ,GAEpCvO,KAAKq6B,YAEP,YADAr6B,KAAKK,IAAIkO,GAKRvO,KAAKg6B,SAASryB,IAAI4G,GACnBvO,KAAK2B,OAAO4M,GAEZvO,KAAKK,IAAIkO,GAGX,MAAMutB,EAAWjnB,EAAOhF,cAAc,SACtCisB,EAASne,SAAWme,EAASne,UAG/B,MAAMoe,EAAiB1G,GAASr1B,KAAK+M,QAAS,KAAK,GAAO,GAC1D/M,KAAK+B,MAAMf,iBAAiB,QAAS+6B,GAErC/7B,KAAK+K,WAAWM,iBAAmB,KACjCrL,KAAK46B,kBAGP56B,KAAKC,UAAU8J,OAAO/J,KAAKmS,gBAC3BnS,KAAKg8B,SAASjyB,OAAO/J,KAAKC,WAG1BuL,WAAW,KACT,IAAIywB,EAAoBj8B,KAAK46B,iBAC1B53B,EAAQk5B,eACTD,EAAkBp7B,KAAK,KACrBmC,EAAQk5B,mBAGX,GAiCG,cACFl8B,KAAKs6B,YACNt6B,KAAKi6B,aACY,IAAlBj6B,KAAKgI,WACLhI,KAAKo6B,SAASM,SAAS,YACrB16B,KAAK4K,QAAS,IAAgBuxB,eAAen8B,KAAK4K,QACpD5K,KAAK86B,kBAAkB,CAAClyB,EAAA,QAAU6O,OAI9B,UAAUtU,GAKhB,YAJ0BuB,IAAvB1E,KAAKu6B,QAAQp3B,KACdnD,KAAKu6B,QAAQp3B,GAAQ,KAGdnD,KAAKu6B,QAAQp3B,GAGV,iB,0CACZ,GAAGnD,KAAKmG,QAAS,OAAOnG,KAAKmG,QAE7B,GAAGnG,KAAKk6B,WAAWkC,SAAWp8B,KAAKk6B,WAAWmC,SAC5C,OAIF,MAAMC,EAAYC,GAAA,EAAWC,QAAU,GAAK,KAAO,EAE7CC,EAASz8B,KAAK08B,UAAU,WACxBv2B,EAAU,IAAmBw2B,iBAAiB38B,KAAK4K,MAAO5K,KAAKi6B,YAAaqC,EAAWt8B,KAAKgI,UAAU,GAAM7B,QAClHnG,KAAKmG,QAAUA,EACf,MAAMjE,QAAciE,EACpB,GAAGnG,KAAKu6B,QAAQ6B,UAAYK,EAC1B,OAGFz8B,KAAKmG,QAAU,KAEf,IAAIi2B,EAAUl6B,EAAMk6B,QACpB,GAAGA,EAAQj6B,OAAQ,CACjB,MAAMy6B,EAAiBR,EAAQA,EAAQj6B,OAAS,GAAGma,OAAS,EAE5D8f,EAAUA,EAAQ34B,QAClB24B,EAAQS,cAAcnd,GAAKA,EAAEzY,SAAW2B,EAAA,QAAU6O,MAE/CzX,KAAK88B,mBACNV,EAAUA,EAAQx0B,OAAO8X,GAAK1f,KAAK+8B,eAAerd,EAAEzY,UAGtDjH,KAAKg9B,cAELh9B,KAAKi6B,YAAc2C,EAKrB,GAFA58B,KAAK86B,kBAAkBsB,EAAQ3zB,IAAIoD,GAAUA,EAAO5E,SAEjD/E,EAAM+6B,MAAO,CACd,IAAIj9B,KAAKk6B,WAAWkC,QAOlB,OANAp8B,KAAKg9B,cAELh9B,KAAKk6B,WAAWkC,SAAU,EAC1Bp8B,KAAKi6B,YAAc,EACnBj6B,KAAKgI,SAAW,EAEThI,KAAKk9B,iBAIZ,GAFAl9B,KAAKk6B,WAAWmC,UAAW,GAEvBr8B,KAAKk6B,WAAWiD,SAClB,OAAOn9B,KAAKo9B,sBAMZ,eAAen2B,GACrB,OACEA,EAAOo2B,WACoB,kBAA1Br9B,KAAK88B,kBAAwC,IAAgBQ,cAAcr2B,KACzE,IAAgBs2B,UAAUt2B,EAAO4vB,WAAY72B,KAAK88B,kBAG3C,kB,0CACZ,GAAG98B,KAAKmG,QAAS,OAAOnG,KAAKmG,QAE7B,GAAGnG,KAAKk6B,WAAWiD,SACjB,OAGF,MAAMK,EAAiBx9B,KAAKo6B,SAASM,SAAS,YAE9C,IAAI16B,KAAK26B,eAAgB,CAQvB,MAAM8B,EAASz8B,KAAK08B,UAAU,YACxBv2B,EAAUtD,QAAQC,IAAI,CAC1B06B,EAAiB,IAAgBC,mBAAmBz9B,KAAK4K,OAAS,GAClE5K,KAAK4K,MAAQ,IAAgB8yB,eAAe19B,KAAK4K,YAASlG,IAG5D1E,KAAKmG,QAAUA,EACf,IAAKw0B,EAAgBgD,SAAsBx3B,EAC3C,GAAGnG,KAAKu6B,QAAQ4C,WAAaV,EAC3B,OAGF,GAAGkB,EAAc,CAEf,IAAIC,EAAgBJ,EAAiBG,EAAaE,WAAWj6B,OAAO+5B,EAAaG,SAAWH,EAAaE,WAEtG79B,KAAK88B,mBACNc,EAAgBA,EAAch2B,OAAOX,GAAUjH,KAAK+8B,eAAe91B,KAGjEjH,KAAKo6B,SAASM,SAAS,aACzBkD,EAAgBA,EAAch2B,OAAOX,GAAUA,EAAOo2B,WAGxDr9B,KAAK26B,eAAiB,YAAaA,EAAe/2B,OAAOg6B,SACpD59B,KAAK26B,eAAiBA,EAAel3B,QAE5C,YAAiBzD,KAAK26B,eAAgB/xB,EAAA,QAAU6O,MAChDzX,KAAKmG,QAAU,KAIf,MAAMm2B,EAAYC,GAAA,EAAWC,QAAU,GAAK,KAAO,EAC7Cl4B,EAAMtE,KAAK26B,eAAel2B,OAAO,EAAG63B,GAC1Ct8B,KAAK86B,kBAAkBx2B,GAGrBtE,KAAK26B,eAAex4B,SACtBnC,KAAKk6B,WAAWiD,UAAW,MASjB,6B,0CACZ,GAAGn9B,KAAKmG,QAAS,OAAOnG,KAAKmG,QAE7B,GAAGnG,KAAKk6B,WAAW6D,oBACjB,OAGF,MAEMtB,EAASz8B,KAAK08B,UAAU,uBACxBv2B,EAAU,UAAkB63B,uBAAuBh+B,KAAKiH,OAAO4vB,WAAY,CAACzvB,EAAG,4BAA6B62B,EAAGj+B,KAAK4K,OAHxG,GAG2H5K,KAAK4J,KAAKK,mBACjJi0B,QAAqB/3B,EAC3B,GAAGnG,KAAKu6B,QAAQwD,sBAAwBtB,EACtC,OAGF,MAAM3qB,EAAUosB,EAAaA,aAAaz1B,IAAI01B,GACrC,IAAgBC,qBAAqBD,IAE9C,YAAiBrsB,EAASlJ,EAAA,QAAU6O,MACpCzX,KAAK86B,kBAAkBhpB,IAEpB9R,KAAK4J,KAAKK,mBAAqBi0B,EAAav5B,OAASu5B,EAAaA,aAAa/7B,OAfhE,MAgBhBnC,KAAKk6B,WAAW6D,qBAAsB,MAQlC,iBACN,MAmCMM,EAnCM,MACV,MAAMA,EAA2B,GAejC,OAAIr+B,KAAKo6B,SAASM,SAAS,YAAkD16B,KAAKk6B,WAAWmC,WAC3FgC,EAAS14B,KAAK3F,KAAKk9B,kBAEfl9B,KAAKk6B,WAAWmC,YAKlBr8B,KAAKo6B,SAASM,SAAS,cAAe16B,KAAKo6B,SAASM,SAAS,YAAgB16B,KAAKk6B,WAAWiD,UAC/FkB,EAAS14B,KAAK3F,KAAKo9B,mBAGlBp9B,KAAKo6B,SAASM,SAAS,yBAA2B16B,KAAKk6B,WAAW6D,qBACnEM,EAAS14B,KAAK3F,KAAKs+B,8BAGdD,GAZIA,GAeIruB,GACX7J,EAAUtD,QAAQC,IAAIu7B,GAK5B,OAJGA,EAASl8B,QACVgE,EAAQtF,KAAKb,KAAK+5B,kBAGb5zB,EAGD,cAAc2L,IAIhB9R,KAAKo6B,SAASM,SAAS,YAAc16B,KAAKk6B,WAAWiD,WACvDrrB,EAAUA,EAAQlK,OAAOX,GAChB,IAAgBs3B,iBAAiBt3B,KAI5C6K,EAAQxL,QAAQW,IACd,MAAM,IAAC6E,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ5E,EACRhH,UAAWD,KAAK+K,WAChBiB,YAAY,EACZqG,cAAerS,KAAKqS,cACpBpG,WAAYjM,KAAKiM,aAGnB,GAAGjM,KAAKq6B,YAAa,CACnB,MAAML,EAAWh6B,KAAKg6B,SAASryB,IAAIV,GAC7BmW,EAAgB,IAAI,KAEvB4c,IAED5c,EAAcrb,MAAM4b,SAAU,GAGhC7R,EAAI0yB,YAAY5f,QAAQxB,EAAc5L,OAGxC,IAAI+a,EAEFA,EADCtlB,EAAOw3B,YACK,UAAkBC,qBAAqBz3B,EAAO4vB,YACnD5vB,IAAW2B,EAAA,QAAU6O,KAChB,eAAKzX,KAAKw6B,cAEV,IAAgBjoB,oBAAoBtL,GAGnD6E,EAAIwG,gBAAgBvI,OAAOwiB,KAIxB,IAAIhe,EAAsBX,EAA8B+wB,GAAS,GAItE,GAFA3+B,KAAKg6B,SAAS35B,IAAIkO,IAEdvO,KAAKq6B,YAEP,YADAr6B,KAAKmL,SAASnL,KAAKg6B,SAASl6B,MAI3BE,KAAK4K,MAAMU,SACZtL,KAAK+B,MAAMG,MAAQ,GACnBlC,KAAK+M,WAGP,MAAMogB,EAAMjtB,SAASC,cAAc,OACnCgtB,EAAI/sB,UAAUC,IAAI,gBAAiB,YAEnC,MAAM+2B,EAAWl3B,SAASC,cAAc,kBAiCxC,OAhCAi3B,EAASh3B,UAAUC,IAAI,uBAAwB,SAC/C+2B,EAASh0B,aAAa,SAAU,KAChCg0B,EAASh3B,UAAUC,IAAI,aAEvB8sB,EAAI/gB,QAAQmC,IAAM,GAAKA,EACpBA,EAAI4sB,kBACQz2B,IAAVkJ,IACDA,EAAQ,IAAI,KAAU,CAAC3G,OAAQsH,EAAIuZ,WAAYjc,QAAQ,IAAOmJ,SAGhEoiB,EAASh0B,aAAa,OAAQ,GAAKmL,IAGlCX,IACoB,iBAAZ,EACPuf,EAAIlpB,UAAY2J,GAEhB,OAAArB,EAAA,GAAe4gB,EAAKvf,GACpBuf,EAAIpjB,OAAO6D,KAIfuf,EAAIyR,sBAAsB,aAAcxH,GAExCp3B,KAAKw7B,kBAAkB7a,aAAawM,EAAKntB,KAAK+B,OAE9C/B,KAAKmL,UAAYnL,KAAKmL,SAASnL,KAAKg6B,SAASl6B,MAE1C6+B,GACD3+B,KAAKy7B,mBAAmBoD,kBAAkB7+B,KAAK+B,MAAO,UAGjDorB,EAGF,OAAO5e,GACZ,IAAIvO,KAAKq6B,YAAa,OAEtB,MAAMlN,EAAMntB,KAAKw7B,kBAAkB3rB,cAAc,cAActB,OAC/D4e,EAAI/sB,UAAUuB,OAAO,YAChBwrB,EAAI2R,YACT3R,EAAI/sB,UAAUC,IAAI,aAElB,MAAM0+B,EAAiB,KACrB/+B,KAAKg6B,SAAS3rB,OAAOE,GACrB4e,EAAIxrB,SACJ3B,KAAKmL,UAAYnL,KAAKmL,SAASnL,KAAKg6B,SAASl6B,OAG5C8I,EAAA,QAAUo2B,SAASC,kBACpB9R,EAAInsB,iBAAiB,eAAgB+9B,EAAgB,CAACpnB,MAAM,IAE5DonB,IAIG,cACL,MAAO,IAAI/+B,KAAKg6B,UAGX,WAAWkF,GAChBA,EAAO54B,QAAQpE,IACblC,KAAKK,IAAI6B,OAAOwC,GAAW,KAG7B6G,OAAO8S,sBAAsB,KAC3Bre,KAAKy7B,mBAAmBoD,kBAAkB7+B,KAAK+B,MAAO,cAAU2C,OAAWA,EAAW,KAAey6B,W,2SCjlB5F,MAAM,WAAsB,KAGzC,YAAYn8B,GAQVC,MAAM,gBAAiB,KAAM,CAACm8B,UAAU,EAAMjI,iBAAiB,EAAMhhB,MAAM,IAE3EnW,KAAK0nB,SAAW,IAAI,GAAe,CACjCsU,SAAUh8B,KAAKmW,KACfhL,SAAU,IAAW,mCACnB,MAAM6uB,EAAWh6B,KAAK0nB,SAAS2X,cACzBp4B,EAAS+yB,EAASA,EAAS73B,OAAS,GAAG2lB,WAE7C,GAAG9kB,EAAQs8B,SAAU,CACnB,MAAM5zB,EAAM1I,EAAQs8B,SAASr4B,GAC7B,GAAGyE,aAAe7I,QAChB,UACQ6I,EACN,MAAMe,GACN,QAKNzM,KAAK0nB,SAAW,KAChB1nB,KAAKu/B,UAEPnF,SAAUp3B,EAAQw8B,UAClBtD,cAAe,KACbl8B,KAAKugB,OACLvgB,KAAK0nB,SAASqS,mBAEV,uBACF/5B,KAAK0nB,SAAS3lB,MAAM0J,SAGxBqxB,iBAAkB95B,EAAQ85B,iBAC1BzC,aAAa,EACbhoB,eAAe,EACfpG,WAAY,GACZhF,OAAQjE,EAAQiE,OAChB2F,YAAa5J,EAAQ4J,YACrB4tB,aAAcx3B,EAAQw3B,eAKxBx6B,KAAK4N,MAAM7D,OAAO/J,KAAK0nB,SAAS3lB,QC9CrB,MAAM,WAA8B,EAKvC,OAIR,IAAI09B,EAHJz/B,KAAKC,UAAUG,UAAUC,IAAI,sBAAuB,8BACpDL,KAAKmR,SAAS,oBAId,CACE,MAAMinB,EAAU,IAAI,GAAe,CACjC9uB,KAAM,0BAGF6jB,EAAMjtB,SAASC,cAAc,OACnCgtB,EAAI/sB,UAAUC,IAAI,sBAClB+3B,EAAQvqB,QAAQ8S,aAAawM,EAAKiL,EAAQxqB,OAE1C,MAAMhE,EAAO,GAAkBC,eAAe,CAAC61B,KAAK,IACpDvS,EAAIpjB,OAAOH,GAEX,MAAM,IAACkC,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ7L,KAAKoS,OAAO0V,UAAS,GAC7B7nB,UAAW2J,EACXoC,YAAY,EACZqG,eAAe,EACfpG,WAAY,KAGdH,EAAIwG,gBAAgBvI,OAAO,IAAgBwI,oBAAoBvS,KAAKoS,SAEpE,MAAMulB,EAAI,IAAI,GAAgB,CAC5B3lB,OAAQhS,KAAKgS,OACbjE,eAAgB/N,KAAK+N,eACrBiuB,SAAU5D,EAAQvqB,QAClBswB,YAAoC,6BAAvBn+B,KAAKm+B,YAAY/2B,EAAmCpH,KAAKm+B,iBAAcz5B,IAGtF+6B,EAAkB,KAEhB,MAAME,EAAShI,EAAEiI,UACS,6BAAvB5/B,KAAKm+B,YAAY/2B,GAAoC,YAAUpH,KAAKm+B,YAAY0B,cAAcvoB,OAAQqoB,EAAOroB,SAIhH,IAAgBwoB,WAAW9/B,KAAKgS,OAAQhS,KAAKm+B,YAAawB,IAG5D3/B,KAAKwO,cAAcxN,iBAAiB,UAAWy+B,EAAiB,CAAC9nB,MAAM,IAEvE3X,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAGjC,CACE,MAAMm4B,EAAU,IAAI,GAAe,IAEnC,GAA0B,6BAAvBp4B,KAAKm+B,YAAY/2B,EAAkC,CACpD,MAAM24B,EAAqB,YAAO,qCAAsC,CAAC1yB,KAAM,SAAU6P,KAAM,2BAE/F,YAAiB6iB,EAAoB,KACnC,MAAMzzB,EAAS,OAAA0sB,GAAA,GAAiB,CAAC+G,IAAqB,GACtD,IAAgBC,oCAAoChgC,KAAKgS,OAAQhS,KAAKm+B,aAAat9B,KAAK,KACtFb,KAAKwO,cAAcnF,oBAAoB,UAAWo2B,GAClDz/B,KAAK05B,SACJ,KACDptB,OAED,CAACyB,eAAgB/N,KAAK+N,iBAEzBqqB,EAAQvqB,QAAQ9D,OAAOg2B,GAGzB,MAAME,EAAY,YAAO,qCAAsC,CAAC5yB,KAAM,aAAc6P,KAAM,0BAE1F,YAAiB+iB,EAAW,KACX,OAAAjH,GAAA,GAAiB,CAACiH,IAAY,GAC7C,IAAgBC,gBAAgBlgC,KAAKgS,OAAQhS,KAAKm+B,aAAat9B,KAAK,KAClEb,KAAKwO,cAAcnF,oBAAoB,UAAWo2B,GAClDz/B,KAAK05B,WAqBN,CAAC3rB,eAAgB/N,KAAK+N,iBAEzBqqB,EAAQvqB,QAAQ9D,OAAOk2B,GAEvBjgC,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,a,2SCjG9B,MAAM,GASX,YAAY+C,GAMVhD,KAAKmgC,EAAI,CACP,CAACC,MAAO,CAAC,iBAAkBljB,KAAM,uBAAwBmjB,cAAe,0BACxE,CAACD,MAAO,CAAC,cAAeljB,KAAM,4BAA6BmjB,cAAe,+BAC1E,CAACD,MAAO,CAAC,gBAAiB,aAAcljB,KAAM,+BAAgCmjB,cAAe,kCAC7F,CAACD,MAAO,CAAC,cAAeljB,KAAM,4BAA6BmjB,cAAe,+BAC1E,CAACD,MAAO,CAAC,eAAgBljB,KAAM,6BAA8BmjB,cAAe,gCAC5E,CAACD,MAAO,CAAC,gBAAiBljB,KAAM,8BAA+BmjB,cAAe,iCAC9E,CAACD,MAAO,CAAC,gBAAiBljB,KAAM,8BAA+BmjB,cAAe,iCAC9E,CAACD,MAAO,CAAC,eAAgBljB,KAAM,6BAA8BmjB,cAAe,iCAG9ErgC,KAAKsgC,WAAa,CAChB,cAAiB,CAAC,aAAc,gBAAiB,aAAc,gBAGjE,MACMC,EADkB,IAAgB7H,QAAQ11B,EAAQgP,QACvBwuB,sBAC3Bb,EAAS38B,EAAQm7B,YAAc,IAAgBsC,+BAA+Bz9B,EAAQgP,OAAQhP,EAAQm7B,YAAY0B,eAAiBU,EAEzI,IAAI,MAAMG,KAAQ1gC,KAAKmgC,EAAG,CACxB,MAAMQ,EAAWD,EAAKN,MAAM,GAC5BM,EAAKtjB,cAAgB,IAAI,KAAc,CACrCF,KAAMwjB,EAAKxjB,KACXS,QAAS,IAAgB4f,UAAUv6B,EAAQgP,OAAQ2uB,EAAUhB,GAC7DiB,aAAa,EACb7I,YAAY,IAIX/0B,EAAQm7B,aAAeoC,EAAoBjpB,OAAOqpB,KACnDD,EAAKtjB,cAAcrb,MAAM6P,UAAW,EAYpC,YAAiB8uB,EAAKtjB,cAAc5L,MAAQvP,IAC1CizB,GAAM,UAAKlc,OAAO,4BAA4B,KAC7C,CAACjL,eAAgB/K,EAAQ+K,kBAG3B/N,KAAKsgC,WAAWK,IACjB39B,EAAQ+K,eAAe1N,IAAIqgC,EAAKtjB,cAAcrb,MAA9CiB,CAAqD,SAAU,KAC7D,IAAI09B,EAAKtjB,cAAcO,QAAS,CAChB3d,KAAKmgC,EAAEv4B,OAAOoD,GAAKhL,KAAKsgC,WAAWK,GAAUjG,SAAS1vB,EAAEo1B,MAAM,KACtE95B,QAAQo6B,IACZA,EAAKtjB,cAAcO,SAAU,OAMrC3a,EAAQg5B,SAASjyB,OAAO22B,EAAKtjB,cAAc5L,QAIxC,UACL,MAAMmuB,EAA2B,CAC/Bv4B,EAAG,mBACHy5B,WAAY,WACZvpB,OAAQ,IAGV,IAAI,MAAMopB,KAAQ1gC,KAAKmgC,EAAG,EACRO,EAAKtjB,cAAcO,SAEjC+iB,EAAKN,MAAM95B,QAAQw6B,IAEjBnB,EAAOroB,OAAOwpB,IAAQ,IAK5B,OAAOnB,GAII,MAAM,WAA+B,EAGlC,O,0CAId,IAAIoB,EAHJ/gC,KAAKC,UAAUG,UAAUC,IAAI,sBAAuB,+BACpDL,KAAKmR,SAAS,sBAGd,CACE,MAAMinB,EAAU,IAAI,GAAe,CACjC9uB,KAAM,6BAGRy3B,EAAkB,IAAI,GAAgB,CACpC/uB,OAAQhS,KAAKgS,OACbjE,eAAgB/N,KAAK+N,eACrBiuB,SAAU5D,EAAQvqB,UAGpB7N,KAAKwO,cAAcxN,iBAAiB,UAAW,KAC7C,IAAgBggC,4BAA4BhhC,KAAKgS,OAAQ+uB,EAAgBnB,YACxE,CAACjoB,MAAM,IAEV3X,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAGjC,CACE,MAAMm4B,EAAU,IAAI,GAAe,CACjC9uB,KAAM,sBAGF23B,EAAkB,IAAI,GAAI,CAC9BvN,aAAc,sBACdN,gBAAiB,UACjB/lB,KAAM,UACN5D,UAAW,KACT,IAAI,GAAc,CAChB+1B,UAAW,CAAC,uBACZF,SAAWr4B,IACTuE,WAAW,KACT01B,EAAgBj6B,IACf,IAEL2F,YAAa,oCACb3F,QAASjH,KAAKgS,YAKdkvB,EAAwBj6B,GAAmB,mCAC/C,IAAIk3B,EACJ,IACEA,QAAoB,UAAkBgD,sBAAsBnhC,KAAKgS,OAAQ/K,GACzE,MAAMwF,GAEN,YADAyoB,GAAM,iCAIR,MAAM1lB,EAAM,IAAI,GAAsBxP,KAAKsN,QAC3CkC,EAAI2uB,YAAcA,EAClB3uB,EAAIwC,OAAShS,KAAKgS,OAClBxC,EAAI4C,OAASnL,EACbuI,EAAIuB,UAGNqnB,EAAQvqB,QAAQ9D,OAAOk3B,EAAgBhhC,WAWvC,MAAM0zB,EAAIyE,EAAQgJ,yBAClBzN,EAAEvzB,UAAUC,IAAI,sBAEhB,MAAMuJ,EAAO,GAAkBC,eAAe,CAAC61B,KAAK,IACpD/L,EAAE5pB,OAAOH,GAET,YAAiBA,EAAO3H,IACtB,MAAM4S,EAAS,OAAAwsB,GAAA,GAAUp/B,EAAE4S,OAAQ,MACnC,IAAIA,EAAQ,OAEZ,MAAM5N,EAAS4N,EAAOzI,QAAQnF,OAAO6gB,WACrCoZ,EAAgBj6B,IACf,CAAC8G,eAAgB/N,KAAK+N,iBAEzB,MAAMuzB,EAAc,CAAC3F,EAAawC,KAChC,MAAMoD,EAAepD,EAAY0B,cAC3BU,EAAuB,IAAgB7H,QAAQ14B,KAAKgS,QAAyBwuB,sBAG7EgB,EAA0B,GAChCT,EAAgBZ,EAAE75B,QAAQo6B,IACxB,MAAMC,EAAWD,EAAKN,MAAM,GAEzBmB,EAAajqB,OAAOqpB,KAAcJ,EAAoBjpB,OAAOqpB,IAC9Da,EAAS77B,KAAK+6B,EAAKL,iBAOvB,MAAMtwB,EAAK4rB,EAAG9rB,cAAc,sBAEzB2xB,EAASr/B,SACV4N,EAAG9L,UAAY,GACf8L,EAAGhG,UAAU,eAAKy3B,EAAS/4B,IAAIiI,GAAK,eAAKA,KAAK,KAKhDX,EAAG3P,UAAUkM,OAAO,QAASk1B,EAASr/B,SAGlC9B,EAAM,CAAC89B,EAA0Dp0B,KACrE,MAAM,IAAC+B,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ,IAAgB41B,UAAUtD,EAAYuD,MAC9CzhC,UAAW2J,EACXoC,YAAY,EACZqG,eAAe,EACfpG,WAAY,GACZlC,WAGFu3B,EAAYx1B,EAAIK,OAAQgyB,IAM1Bn+B,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,2BAA6B2hC,I,UAC9D,MAAMC,EAAwC,8BAAR,QAAtB,EAAAD,EAAOE,uBAAe,eAAEz6B,KAAqCu6B,EAAOE,gBAAgBhC,cAAcvoB,OAAOwqB,cACnHnG,EAAK/xB,EAAKiG,cAAc,kBAAkB8xB,EAAOI,aACpDH,GACGjG,EAGF2F,EAAY3F,EAAIgG,EAAOE,iBAFvBxhC,EAAIshC,EAAOE,iBAAgE,GAK3C,8BAAR,QAAvB,EAAAF,EAAOK,wBAAgB,eAAE56B,MACxB66B,IAGDtG,GACDA,EAAGh6B,SAG6B,8BAAR,QAAvB,EAAAggC,EAAOK,wBAAgB,eAAE56B,MACxB66B,GAINC,MAGF,MAAMA,EAAY,KAChB,OAAA31B,EAAA,GAAe00B,EAAgB5U,SAAU,eAAK4V,EAAkB,8BAAgC,2BAA4B,CAACA,MAG/H,IACIE,EADAF,EAAkB,EAEtB,MAAMG,EAAY,KAEhBD,EAAS,IAAI,GAAiB,CAC5Bp3B,WAAY/K,KAAK+K,WACjB+uB,WAAY,IACH,UAAkBkE,uBAAuBh+B,KAAKgS,OAAQ,CAAC5K,EAAG,4BAA6B62B,EAAG,IAJlF,GAImGr0B,EAAKK,mBAAmBpJ,KAAK6K,IAC7I,IAAI,MAAMyyB,KAAezyB,EAAIwyB,aAC3B79B,EAAI89B,GAA4D,GAMlE,OAHA8D,EAAkBv2B,EAAI/G,MACtBu9B,IAEOx2B,EAAIwyB,aAAa/7B,OAZX,IAYkCuJ,EAAI/G,QAAUiF,EAAKK,sBAKjEk4B,EAAOr8B,QAGhB9F,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAE5B,IAAgBoiC,UAAUriC,KAAKgS,cAC1BowB,KAENF,IAEAliC,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,iBAAkB,EAAEsiC,cAAaC,gBAC/DviC,KAAKgS,SAAWswB,IACjBtiC,KAAKgS,OAASuwB,EACdH,YAOV,qBACEpiC,KAAK+K,WAAWy3B,YC7TL,MAAM,GACnB,YACEv7B,EAEAmzB,EAAqB,IAAgBqI,cAAcx7B,GACnDq4B,GAEA,MAAMoD,EAAmB,IAAI,KAAU,CAACz7B,WAAS+N,QAO3C2tB,EAAgB,CAAChlB,EAA4CilB,EAAQ/K,KAAgBla,EAAQ7d,QACjG,IAAIqG,EAAU,IAAgB08B,MAAM57B,EAAO4vB,YAExC+L,IACDz8B,EAAUA,EAAQ8a,QAAQ,IACjB,IAAmB6hB,aAAa77B,KAI3Cq4B,GAAYA,EAASn5B,IAGjB48B,EAAkBplB,IACtB,IAAIxX,EAEJ,GAAGc,EAAOo2B,SACRl3B,EAAU,IAAmB28B,aAAa77B,GAAQ,EAAO4wB,IAAela,EAAQ7d,UAAO4E,OAClF,CACL,IAAGiZ,EAAQ7d,KAGT,OAAO6iC,EAAchlB,GAFrBxX,EAAU,IAAgBkI,OAAOpH,EAAO4vB,YAM5CyI,GAAYA,EAASn5B,IAGvB,IAAIyH,EAAoB8pB,EAA0BsL,EAAwBplB,EAAsCia,EAChH,OAAOuC,GACL,IAAK,UACiC,IAAgBmD,UAAUt2B,EAAO4vB,WAAY,gBAC/E,IAAgBoM,cAChBr1B,EAAQ,oBACR8pB,EAAc,iCACd9Z,EAAU,CAAC,CACTmX,QAAS,oBACTmO,UAAU,EACVlL,SAAU+K,IAGZlL,EAAa,CAAC,CACZ3a,KAAM,0BAGRtP,EAAQ,mBACR8pB,EAAc,4BACdsL,EAAkB,CAACN,GACnB9kB,EAAU,CAAC,CACTmX,QAAS,eACTmO,UAAU,EACVlL,SAAU2K,KAId,MAeF,IAAK,OACH/0B,EAAQ,iBACR8pB,EAAc,mCACdsL,EAAkB,CAACN,GAEnB9kB,EAAU,CAAC,CACTmX,QAAS,iBACTmO,UAAU,EACVlL,SAAU+K,IAGZlL,EAAa,CAAC,CACZ3a,KAAM,2BACNimB,SAAU,CACR,IAAI,KAAU,CAACl8B,WAAS+N,WAI5B,MAGF,IAAK,QACHpH,EAAQ,iBACR8pB,EAAc,wCACd9Z,EAAU,CAAC,CACTmX,QAAS,iBACTmO,UAAU,EACVlL,SAAU+K,IAGZ,MAGF,IAAK,YACL,IAAK,QACiC,IAAgBxF,UAAUt2B,EAAO4vB,WAAY,gBAC/EjpB,EAAQ,iBACR8pB,EAAc,0BACd9Z,EAAU,CAAC,CACTmX,QAAS,iBACTmO,UAAU,EACVlL,SAAU+K,IAGZlL,EAAa,CAAC,CACZ3a,KAAM,mCAGRtP,EAAQ,gBACR8pB,EAAc,8BACdsL,EAAkB,CAACN,GACnB9kB,EAAU,CAAC,CACTmX,QAAS,iBACTmO,UAAU,EACVlL,SAAWH,GAAe8K,EAAc9K,GAAY,MAQ5D,IAAI,GAAU,oBAAqB,CACjC5wB,SACAysB,aAAc9lB,EACd6pB,mBAAoBC,EACpBE,oBAAqBoL,EACrBplB,UACAia,eACCtX,Q,2SC9IQ,MAAM,WAAuB,EAM1B,Q,0CAEdvgB,KAAK+N,eAAeO,YACpBtO,KAAK+K,WAAW9K,UAAUgE,UAAY,GAEtCjE,KAAKC,UAAUG,UAAUC,IAAI,sBAAuB,wBACpDL,KAAKmR,SAAS,QAEd,MAAMynB,QAAiB,UAAkBwK,YAAYpjC,KAAKgS,QAAQ,GAE5D+a,EAAiC,IAAgB2L,QAAQ14B,KAAKgS,QAC9DmmB,EAAc,IAAgBA,YAAYn4B,KAAKgS,QAC/CqwB,EAAY,IAAgBA,UAAUriC,KAAKgS,QAE3CqxB,EAAsC,GACtCC,EAAyBtL,IAC7BqL,EAAoB19B,KAAKqyB,IAG3Bh4B,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,cAAgBgS,IAC9ChS,KAAKgS,SAAWA,GACjBqxB,EAAoB/8B,QAAQ0xB,GAAYA,OAI5C,MAAM/wB,EAASjH,KAAKgS,OAAO8V,UAAS,GAEpC,CACE,MAAMsQ,EAAU,IAAI,GAAe,CAACe,aAAa,IAC3C7G,EAA4B,GAE5BhhB,EAAepR,SAASC,cAAc,OA+B5C,GA9BAmR,EAAalR,UAAUC,IAAI,iBAE3BL,KAAKujC,mBAAqB,IAAI,IAAW,CACvC/xB,MAAO2mB,EAAc,mBAAqB,yBAC1C7uB,KAAM,YACNmI,UAAW,IACX+gB,UAAU,IAEZxyB,KAAKwjC,sBAAwB,IAAI,IAAW,CAC1ChyB,MAAO,yBACPlI,KAAM,mBACNmI,UAAW,MAGbzR,KAAKujC,mBAAmB5J,iBAAiB5M,EAAKnf,OAC9C5N,KAAKwjC,sBAAsB7J,iBAAiBf,EAAS6K,OAErDnyB,EAAavH,OAAO/J,KAAKujC,mBAAmBtjC,UAAWD,KAAKwjC,sBAAsBvjC,WAElFqyB,EAAY3sB,KAAK3F,KAAKujC,mBAAoBvjC,KAAKwjC,uBAE/CxjC,KAAK0jC,SAAW,IAAI,GAAS,CAC3Bz8B,SACAqrB,cACAvkB,eAAgB/N,KAAK+N,iBAEvB/N,KAAK6N,QAAQ9D,OAAO/J,KAAK0jC,SAAShyB,SAElC0mB,EAAQvqB,QAAQ9D,OAAO/J,KAAK0jC,SAAStyB,WAAWnR,UAAWqR,GAExD,IAAgBisB,UAAUv9B,KAAKgS,OAAQ,eAAgB,CACxD,MAAM2xB,EAAc,IAAI,GAAI,CAC1BjQ,aAAcyE,EAAc,cAAgB,YAC5C1uB,UAAW,KACT,MAAM+F,EAAM,IAAI,GAAexP,KAAKsN,QACpCkC,EAAIwC,OAAShS,KAAKgS,OAClBxC,EAAIopB,SAAWA,EACfppB,EAAIuB,OAEJ/Q,KAAK+N,eAAe1N,IAAImP,EAAIhB,cAA5BxO,CAA2C,UAAW4jC,IAExDv2B,KAAM,SAGFu2B,EAAsB,KAG1B,IAAIr1B,EAFJo1B,EAAYtX,SAAS7Z,YAAc,GAIjCjE,EADC4pB,EACMpL,EAAsByJ,SAAW,aAAe,cAEhDzJ,EAAsByJ,SAAW,kBAAoB,mBAG9DmN,EAAYtX,SAAStiB,OAAO,eAAKwE,KAGnCq1B,IACAxL,EAAQvqB,QAAQ9D,OAAO45B,EAAY1jC,WAGrC,GAAG,IAAgBs9B,UAAUv9B,KAAKgS,OAAQ,wBAA0BmmB,EAAa,CAC/E,MAAMiI,EAAQ,CACZ,gBACA,aACA,gBACA,aACA,cACA,eACA,eACA,eAGIyD,EAAiB,IAAI,GAAI,CAC7BnQ,aAAc,qBACdjqB,UAAW,KACT,MAAM+F,EAAM,IAAI,GAAuBxP,KAAKsN,QAC5CkC,EAAIwC,OAAShS,KAAKgS,OAClBxC,EAAIuB,QAEN1D,KAAM,gBAGFy2B,EAAuB,KAC3BD,EAAexX,SAASpoB,UAAYm8B,EAAM2D,OAAO,CAACC,EAAKnJ,IAAMmJ,IAAO,IAAgBzG,UAAUv9B,KAAKgS,OAAQ6oB,EAAG9N,EAAKyT,uBAAwB,GAAK,IAAMJ,EAAMj+B,QAG9J2hC,IACA1L,EAAQvqB,QAAQ9D,OAAO85B,EAAe5jC,WAEtCD,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,cAAgBgS,IAC9ChS,KAAKgS,SAAWA,GACjB8xB,MA+DN,GAjDA9jC,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAE/B,YAAiBD,KAAK0jC,SAAShyB,QAAS,KACtC1R,KAAK0jC,SAAShyB,QAAQE,UAAW,EAEjC,IAAIysB,EAA2B,GAE/B,MAAMlvB,EAAKnP,KAAKgS,OACbhS,KAAKujC,mBAAmBrM,mBACzBmH,EAAS14B,KAAK,IAAgBs+B,UAAU90B,EAAInP,KAAKujC,mBAAmBrhC,QAGnElC,KAAKwjC,sBAAsBtM,mBAC5BmH,EAAS14B,KAAK,IAAgBu+B,UAAU/0B,EAAInP,KAAKwjC,sBAAsBthC,QAGtElC,KAAK0jC,SAASxyB,cACfmtB,EAAS14B,KAAK3F,KAAK0jC,SAASxyB,eAAerQ,KAAKoR,GACvC,IAAgBC,UAAU/C,EAAI8C,KAIzCpP,QAAQshC,KAAK9F,GAAUpd,QAAQ,KAC7BjhB,KAAK0jC,SAAShyB,QAAQ0yB,gBAAgB,YACtCpkC,KAAK05B,WAEN,CAAC3rB,eAAgB/N,KAAK+N,iBAuBtBoqB,GAAe,IAAgBoF,UAAUv9B,KAAKgS,OAAQ,eAAgB,CACvE,MAAMqyB,EAA4B,IAAI,KAAc,CAClDnnB,KAAM,wBACNS,UAAYoP,EAAsBzV,OAAOgtB,WACzCvM,YAAY,IAGd/3B,KAAK+N,eAAe1N,IAAIgkC,EAA0BtiC,MAAlD/B,CAAyD,SAAU,KACjE,MAAMsM,EAAS+3B,EAA0BrL,kBAAiB,GAC1D,IAAgBuL,iBAAiBvkC,KAAKgS,OAAQqyB,EAA0B1mB,SAAS9c,KAAK,KACpFyL,QAIJg3B,EAAsB,KACpBe,EAA0B3gC,mBAAoBqpB,EAAsBzV,OAAOgtB,cAG7ElM,EAAQvqB,QAAQ9D,OAAOs6B,EAA0B7yB,QAIrD,IAAI2mB,EAAa,CACf,MAAMC,EAAU,IAAI,GAAe,IAcnC,IAAID,GAAe,IAAgBoF,UAAUv9B,KAAKgS,OAAQ,sBAAuB,CAC/E,MAAMwyB,EAA+B,IAAI,KAAc,CACrDtnB,KAAM,cACN6a,YAAY,IAGd/3B,KAAK+N,eAAe1N,IAAImkC,EAA6BziC,MAArD/B,CAA4D,SAAU,KACpE,MAAMsM,EAASk4B,EAA6BxL,kBAAiB,GAC7D,IAAgByL,uBAAuBzkC,KAAKgS,QAASwyB,EAA6B7mB,SAAS9c,KAAK,KAC9FyL,QAIJ,MAAMo4B,EAAe,KACnBF,EAA6B9gC,iBAAiB2+B,IAAezJ,EAAkCthB,OAAOqtB,oBAGxGD,IACApB,EAAsBoB,GAEtBtM,EAAQvqB,QAAQ9D,OAAOy6B,EAA6BhzB,OAGtDxR,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAGjC,GAAG,IAAgBs9B,UAAUv9B,KAAKgS,OAAQ,eAAgB,CACxD,MAAMomB,EAAU,IAAI,GAAe,IAE7B6H,EAAY,YAAO,qCAAsC,CAAC5yB,KAAM,SAAU6P,KAAMib,EAAc,yBAA2B,wBAE/H,YAAiB8H,EAAW,KAC1B,IAAI,GAAkBh5B,OAAwBvC,EAAYyB,IACxD,MAAMmG,EAAS,OAAA0sB,GAAA,GAAiB,CAACiH,IAAY,GAC7C95B,EAAQtF,KAAK,KACXb,KAAK05B,SACJ,KACDptB,SAGH,CAACyB,eAAgB/N,KAAK+N,iBAEzBqqB,EAAQvqB,QAAQ9D,OAAOk2B,GAEvBjgC,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAG7BoiC,GAEFriC,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,iBAAkB,EAAEsiC,cAAaC,gBAC/Dt7B,IAAWq7B,IACZtiC,KAAKgS,OAASuwB,EAAU1L,WACxB72B,KAAK4kC,cAMH,OACR,OAAO5kC,KAAK4kC,S,aChSD,MAAM,WAA0B,EAMnC,OACR5kC,KAAKC,UAAUG,UAAUC,IAAI,sBAAuB,0BACpD,MAAMwkC,GAAS,IAAgBC,UAAU9kC,KAAKiH,OAAO8K,YACrD/R,KAAKmR,SAAS0zB,EAAQ,kBAAoB,QAE1C,CACE,MAAMzM,EAAU,IAAI,GAAe,CAACe,aAAa,IAC3C7G,EAA4B,GAE5BhhB,EAAepR,SAASC,cAAc,OAe5C,GAdAmR,EAAalR,UAAUC,IAAI,iBAE3BL,KAAK+kC,eAAiB,IAAI,IAAW,CACnCvzB,MAAO,YACPlI,KAAM,eACNmI,UAAW,GACX+gB,UAAU,IAEZxyB,KAAKglC,mBAAqB,IAAI,IAAW,CACvCxzB,MAAO,WACPlI,KAAM,mBACNmI,UAAW,KAGVzR,KAAKiH,OAAQ,CACd,MAAMg+B,EAAO,IAAgBC,QAAQllC,KAAKiH,QAEvC49B,GACD7kC,KAAK+kC,eAAeI,cAAcF,EAAKG,YACvCplC,KAAKglC,mBAAmBG,cAAcF,EAAKI,aAE3CrlC,KAAK+kC,eAAepL,iBAAiBsL,EAAKG,YAC1CplC,KAAKglC,mBAAmBrL,iBAAiBsL,EAAKI,YAelD,GAXA/zB,EAAavH,OAAO/J,KAAK+kC,eAAe9kC,UAAWD,KAAKglC,mBAAmB/kC,WAC3EqyB,EAAY3sB,KAAK3F,KAAK+kC,eAAgB/kC,KAAKglC,oBAE3ChlC,KAAK0jC,SAAW,IAAI,GAAS,CAC3Bz8B,OAAQjH,KAAKiH,OACbqrB,cACAvkB,eAAgB/N,KAAK+N,eACrB8kB,iBAAiB,IAEnB7yB,KAAK6N,QAAQ9D,OAAO/J,KAAK0jC,SAAShyB,SAE/B1R,KAAKiH,OAAQ,CACd,MAAMkmB,EAAMjtB,SAASC,cAAc,OACnCgtB,EAAI/sB,UAAUC,IAAI,eAClB8sB,EAAIpjB,OAAO/J,KAAK0jC,SAAS9Q,YAEzB,MAAM0S,EAA6B,IAAI,KAAc,CACnDpoB,KAAM,kBAGRooB,EAA2BvjC,MAAMf,iBAAiB,SAAWiB,IACvDA,EAAEyT,WAIN,IAAmB6vB,SAASvlC,KAAKiH,UAGnCjH,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,kBAAoB2hC,IACrD,GAAqB,eAAlBA,EAAOD,KAAKt6B,EAAoB,OACnC,MAAMH,EAAS,IAAgBw6B,UAAUE,EAAOD,KAAKA,MACrD,GAAG1hC,KAAKiH,SAAWA,EAAQ,CACzB,MAAM+S,GAAW,KAAwBwrB,QAAQ7D,EAAO8D,iBACrDzrB,IAAYsrB,EAA2B3nB,UACxC2nB,EAA2B3nB,QAAU3D,MAK3C,MAAM0rB,EAAiBxlC,SAASC,cAAc,OAC9CulC,EAAetlC,UAAUC,IAAI,gBAC7BqlC,EAAe37B,OAAO,IAAI,KAAU,CAClC9C,OAAQjH,KAAKiH,SACZ+N,SAGH,MAAM2wB,EAAqBzlC,SAASC,cAAc,OAMlD,GALAwlC,EAAmBvlC,UAAUC,IAAI,oBACjCslC,EAAmB57B,OAAO,eAAK,6BAE/BquB,EAAQvqB,QAAQ9D,OAAOojB,EAAKuY,EAAgBC,EAAoBr0B,GAE5DuzB,EASG,CACL,MAAMI,EAAO,IAAgBC,QAAQllC,KAAKiH,QAEpC2+B,EAAW,IAAI,GAAI,CACvBv4B,KAAM,QACNqmB,aAAcuR,EAAKY,WAAQnhC,EAAY,eACvCkJ,MAAOq3B,EAAKY,MAAQ,IAAgBC,gBAAgBb,EAAKY,YAASnhC,EAClE0uB,gBAAiB6R,EAAKY,MAAQ,QAAU,4BACxCxS,iBAAkB4R,EAAKY,WAAQnhC,EAAY,CAAC,IAAI,KAAU,CAACuC,OAAQjH,KAAKiH,SAAS+N,WAGnFojB,EAAQvqB,QAAQ9D,OAAO67B,EAAS3lC,eApBvB,CACT,MAAM8lC,EAAmB,IAAI,GAAI,CAC/B3oB,cAAekoB,IAGXtrB,GAAW,KAAwBgsB,iBAAiBhmC,KAAKiH,QAAQ,GACvEq+B,EAA2B3nB,QAAU3D,EAErCoe,EAAQvqB,QAAQ9D,OAAOg8B,EAAiB9lC,iBAe1Cm4B,EAAQvqB,QAAQ9D,OAAOuH,GAGzBtR,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAE/B,YAAiBD,KAAK0jC,SAAShyB,QAAS,KACtC1R,KAAK0jC,SAAShyB,QAAQE,UAAW,EAEjC,IAAgBq0B,WAAWjmC,KAAKiH,OAAQjH,KAAK+kC,eAAe7iC,MAAOlC,KAAKglC,mBAAmB9iC,MAAO,IAAgBgjC,QAAQllC,KAAKiH,QAAQ4+B,OACtI5kB,QAAQ,KACPjhB,KAAK0jC,SAAShyB,QAAQ0yB,gBAAgB,YACtCpkC,KAAK05B,WAEN,CAAC3rB,eAAgB/N,KAAK+N,iBAG3B,IAAI82B,EAAO,CACT,MAAMzM,EAAU,IAAI,GAAe,IAI7B6H,EAAY,YAAO,qCAAsC,CAAC5yB,KAAM,SAAU6P,KAAM,2BAEtF,YAAiB+iB,EAAW,KAC1B,IAAI,GAAU,uBAAwB,CACpCh5B,OAAQjH,KAAKiH,OACbysB,aAAc,gBACd+D,mBAAoB,0BACpB7Z,QAAS,aAAgB,CAAC,CACxBmX,QAAS,SACTiD,SAAU,KACR,MAAM1rB,EAAS,OAAA0sB,GAAA,GAAiB,CAACiH,IAAY,GAE7C,IAAgBiG,eAAe,CAAClmC,KAAKiH,SAASpG,KAAK,KACjDb,KAAK05B,SACJ,KACDptB,OAGJ42B,UAAU,OAEX3iB,QACF,CAACxS,eAAgB/N,KAAK+N,iBAEzBqqB,EAAQvqB,QAAQ9D,OAAOk2B,GAEvBjgC,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,aChLtB,MAAM,WAAyB,EAOlC,OACRD,KAAK0R,QAAU,EAAa,CAACrE,KAAM,eACnCrN,KAAK6N,QAAQ9D,OAAO/J,KAAK0R,SACzB1R,KAAK+K,WAAW9K,UAAU0B,SAE1B3B,KAAK0R,QAAQ1Q,iBAAiB,QAAS,KACrC,MAAM8Q,EAAU9R,KAAK0nB,SAAS2X,cAAc52B,IAAI09B,GAAOA,EAAIre,YAE3D,GAAG9nB,KAAKomC,UACNpmC,KAAK4/B,QAAQ9tB,GACb9R,KAAK05B,YACA,CACL,MAAMvzB,EAAUnG,KAAK4/B,QAAQ9tB,GAE1B3L,aAAmBtD,QACpB7C,KAAKqmC,gBAAgBlgC,QACDzB,IAAZyB,GACRnG,KAAK05B,WAMN,gBAAgBvzB,GACrB,MAAMmgC,EAAe,aAAgBtmC,KAAK0R,QAAS,cAEnDvL,EAAQtF,KAAK,KACXb,KAAK05B,SACJ,KACD4M,MAIG,KAAKtjC,GAQV,MAAMujC,EAAMtjC,MAAM8N,OAElB/Q,KAAKmR,SAASnO,EAAQ4K,OACtB5N,KAAKo6B,SAAWp3B,EAAQG,KACxBnD,KAAK4/B,QAAU58B,EAAQ48B,QACvB5/B,KAAKomC,UAAYpjC,EAAQojC,UAEzB,MAAMI,EAA8B,YAAlBxmC,KAAKo6B,SAqBvB,OApBAp6B,KAAK0nB,SAAW,IAAI,GAAe,CACjCsU,SAAUh8B,KAAK6N,QACf1C,SAAUnL,KAAKomC,UAAY,KAAQjkC,IACjCnC,KAAK0R,QAAQtR,UAAUkM,OAAO,eAAgBnK,IAEhDi4B,SAAU,CAACoM,EAAY,UAAY,YACnC55B,YAAa5J,EAAQ4J,YACrB0tB,WAAYkM,EACZtL,iBAAkBsL,EAAY,CAAC,aAAc,eAAY9hC,IAGxD1B,EAAQyjC,iBACTzmC,KAAK0nB,SAASgf,WAAW1jC,EAAQyjC,iBAGnCzmC,KAAK0R,QAAQtR,UAAUC,IAAI,oBAC3BL,KAAK0R,QAAQzN,UAAY,GACzBjE,KAAK0R,QAAQE,UAAW,EACxB5R,KAAK0R,QAAQtR,UAAUkM,OAAO,aAActM,KAAKomC,WAE1CG,GCpFI,QAFa,gBAAc,ECF3B,SAASI,KACtB,MAAMpiB,EAAMrkB,SAASskB,gBAAgB,6BAA8B,OACnED,EAAIE,eAAe,KAAM,UAAW,aACpCF,EAAIE,eAAe,KAAM,QAAS,MAClCF,EAAIE,eAAe,KAAM,SAAU,MACnCF,EAAInkB,UAAUC,IAAI,iBAElB,MAAMumC,EAAM1mC,SAASskB,gBAAgB,6BAA8B,OACnEoiB,EAAIniB,eAAe,KAAM,OAAQ,wBACjCmiB,EAAIxmC,UAAUC,IAAI,uBAElB,MAAMwmC,EAAO3mC,SAASskB,gBAAgB,6BAA8B,OAMpE,OALAqiB,EAAKpiB,eAAe,KAAM,OAAQ,mBAClCoiB,EAAKzmC,UAAUC,IAAI,kBAEnBkkB,EAAIxa,OAAO68B,EAAKC,GAETtiB,ECNT,MAAMuiB,GAAY7kC,GACRA,EAAiB+Y,QAAW/Y,EAAiB+Y,QAAQ,GAAK/Y,EAG9D8kC,GAAyBx7B,OAE/B,IAAIy7B,IAAe,EACnBp+B,EAAA,QAAU5H,iBAAiB,sBAAwBuhB,IACjDykB,GAAezkB,IAcF,MAAM,GAcnB,YAAYvf,GARJ,KAAAikC,OAA8B,WAC9B,KAAAvpB,aAAc,EACd,KAAAwpB,iBAAqD,EAErD,KAAAC,SAAU,EACV,KAAAC,MAAgB,KAChB,KAAAC,MAAgB,KA4BxB,KAAAj+B,MAASnH,IAKJ,sBACD8kC,GAAuB19B,oBAAoB,YAAarJ,KAAKsnC,WAAY,CAACxb,SAAS,KAEnFib,GAAuB19B,oBAAoB,YAAarJ,KAAKsnC,YAC7DtnC,KAAKgV,QAAQrS,MAAMskC,OAAS,IAG3BjnC,KAAKunC,SAAWvnC,KAAKmnC,SACtBnnC,KAAKunC,UAGPvnC,KAAKonC,MAAQpnC,KAAKqnC,MAAQ,KAC1BrnC,KAAKmnC,SAAU,GAGjB,KAAAK,YAAeC,IACb,MAAMxlC,EAAI6kC,GAASW,GACnB,GAAGznC,KAAK0nC,oBAAsB1nC,KAAK0nC,kBAAkBD,GACnD,OAAOznC,KAAKoJ,QAGdpJ,KAAKonC,MAAQnlC,EAAEgZ,QACfjb,KAAKqnC,MAAQplC,EAAEiZ,QAEZ,sBACD6rB,GAAuB/lC,iBAAiB,YAAahB,KAAKsnC,WAAY,CAAChsB,SAAS,EAAOwQ,SAAS,IAEhGib,GAAuB/lC,iBAAiB,YAAahB,KAAKsnC,YAAY,IAI1E,KAAAA,WAAcG,IACZ,GAAkB,OAAfznC,KAAKonC,OAAiC,OAAfpnC,KAAKqnC,OAAkBL,GAE/C,YADAhnC,KAAKoJ,QAIJpJ,KAAK0d,aACN,OAAAA,EAAA,GAAY+pB,GAGd,MAAMxlC,EAAI6kC,GAASW,GACbE,EAAM1lC,EAAEgZ,QACR2sB,EAAM3lC,EAAEiZ,QAER2sB,EAAQ7nC,KAAKonC,MAAQO,EACrBG,EAAQ9nC,KAAKqnC,MAAQO,EAE3B,IAAI5nC,KAAKmnC,QAAS,CAChB,IAAIU,IAAUC,EACZ,OAGF9nC,KAAKmnC,SAAU,EAEX,uBACFnnC,KAAKgV,QAAQrS,MAAMolC,YAAY,SAAU/nC,KAAKinC,OAAQ,aAGrDjnC,KAAKgoC,cACNhoC,KAAKgoC,eAmBT,MAAMC,EAAgBjoC,KAAKkoC,QAAQL,EAAOC,EAAOL,QAC5B/iC,IAAlBujC,GAA+BA,GAChCjoC,KAAKoJ,SA/GP,YAAWpJ,KAAMgD,GAEjBhD,KAAK8e,eAGA,eACD,uBAIF9e,KAAKgV,QAAQhU,iBAAiB,aAAchB,KAAKwnC,YAAaxnC,KAAKknC,iBACnEH,GAAuB/lC,iBAAiB,WAAYhB,KAAKoJ,SAJzDpJ,KAAKgV,QAAQhU,iBAAiB,YAAahB,KAAKwnC,YAAaxnC,KAAKknC,iBAClEH,GAAuB/lC,iBAAiB,UAAWhB,KAAKoJ,QAOrD,kBACD,uBAIFpJ,KAAKgV,QAAQ3L,oBAAoB,aAAcrJ,KAAKwnC,YAAaxnC,KAAKknC,iBACtEH,GAAuB19B,oBAAoB,WAAYrJ,KAAKoJ,SAJ5DpJ,KAAKgV,QAAQ3L,oBAAoB,YAAarJ,KAAKwnC,YAAaxnC,KAAKknC,iBACrEH,GAAuB19B,oBAAoB,UAAWrJ,KAAKoJ,S,2SCxClD,MAAM,GAgBnB,YAAmB2B,GAAA,KAAAA,aAFX,KAAAo9B,cAA0C,IAAIz4B,IAsR/C,KAAAjJ,YAAe2hC,IACpB,MAAMC,EAASnoC,SAASC,cAAc,OAGtC,IAAIqE,EAFJ6jC,EAAOjoC,UAAUC,IAAI,GAAmBioC,WAAa,UAAW,mBAG7DF,IACD5jC,EAA4B,iBAAd,EACZ,IAAiB+jC,SAASH,GACzBA,EAAQ7jC,OAAuDC,OAGpE,MAAMumB,EAAM,IAAIyd,MAChBzd,EAAI3qB,UAAUC,IAAI,gBAClB0qB,EAAI0d,WAAY,EAEhB,MAAMC,EAAe,KACnB,GAAGlkC,EAAO,CACR,MAAMkH,EAAM4e,GAAU,CACpBrqB,UAAWooC,EACX7jC,QACA1E,KAAM,IAAiBwtB,gBAAgB9oB,EAAO,IAAK,KAAK,GACxDkmB,kBAAkB,IAGpB,CAAChf,EAAIkf,OAAOC,MAAOnf,EAAIkf,OAAOE,MAAMljB,OAAOc,SAASpC,QAAQykB,IAC1DA,EAAI3qB,UAAUC,IAAI,sBAEf,CACL,MAAMmE,EAAQ,IAAgBmU,aAAa3Y,KAAKiH,QAChD2R,EAAA,EAAkB+vB,UAAUN,EAAQroC,KAAKiH,OAAQzC,EAAO,YAAaumB,KAezE,OAXG/qB,KAAK4oC,QAAQ3+B,mBAvUC,EAwUfy+B,KAEA1oC,KAAK6oC,qBAAqBC,QAAQT,GAClCroC,KAAKmoC,cAAcxzB,IAAI0zB,EAAQK,IAGjC1oC,KAAK4oC,QAAQ7+B,OAAOs+B,GAEpBroC,KAAK8N,SAEEs6B,GA/TPpoC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,GAAmBioC,WAAa,cAE7DtoC,KAAK4oC,QAAU1oC,SAASC,cAAc,OACtCH,KAAK4oC,QAAQxoC,UAAUC,IAAI,GAAmBioC,WAAa,YAE3DtoC,KAAK+oC,SAAW7oC,SAASC,cAAc,OACvCH,KAAK+oC,SAAS3oC,UAAUC,IAAI,GAAmBioC,WAAa,aAE5DtoC,KAAK0gC,KAAOxgC,SAASC,cAAc,OACnCH,KAAK0gC,KAAKtgC,UAAUC,IAAI,GAAmBioC,WAAa,SAExDtoC,KAAKoO,KAAOlO,SAASC,cAAc,OACnCH,KAAKoO,KAAKhO,UAAUC,IAAI,GAAmBioC,WAAa,SAExDtoC,KAAKgpC,cAAgB9oC,SAASC,cAAc,OAC5CH,KAAKgpC,cAAc5oC,UAAUC,IAAI,GAAmBioC,WAAa,SAAU,wBAM3EtoC,KAAKipC,UAAY/oC,SAASC,cAAc,OACxCH,KAAKipC,UAAU7oC,UAAUC,IAAI,GAAmBioC,WAAa,SAAU,GAAmBA,WAAa,cAAe,oBAMtHtoC,KAAKC,UAAU8J,OAAO/J,KAAK4oC,QAAS5oC,KAAK+oC,SAAU/oC,KAAK0gC,KAAM1gC,KAAKoO,KAAMpO,KAAKgpC,cAAehpC,KAAKipC,WAElG,MAAMC,EAAiB,IACY,IAA9BlpC,KAAK+K,WAAWo+B,YACjBnpC,KAAK+K,WAAW8zB,kBAAkB7+B,KAAK+K,WAAW9K,UAAU4f,kBAAkC,UACvF,GAOX,IAAI2L,GAAS,EACT4d,GAAS,EACb,YAAiBppC,KAAKC,UAAiBwnC,GAAO,mCAC5C,GAAG2B,EAED,YADA,OAAA1rB,EAAA,GAAY+pB,GAId,GAAGjc,EAED,YADAA,GAAS,GAIX,IAAI0d,IACF,OAGF,MAAMrtB,EAAO7b,KAAKC,UAAU6b,wBAItBvB,EADIktB,EACEjtB,MAEN6uB,EAAS9uB,EAAIsB,EAAKkB,KACxB,IAAK/c,KAAKiV,WAAWrQ,SAASzC,SAAWnC,KAAKiV,WAAWpQ,KAAK1C,QACxDknC,EAAUxtB,EAAKnb,OA1BH,EAAI,IA0BuB2oC,EAAUxtB,EAAKnb,MAAQmb,EAAKnb,OA1BvD,EAAI,GA0B0E,CAC9F,MAAMuG,EAASjH,KAAKiH,OAEduB,EAAsF,GAC5FxI,KAAKiV,WAAWrQ,SAAShB,OAAO5D,KAAKiV,WAAW7P,QAASpF,KAAKiV,WAAWpQ,MAAMyB,QAAQ,CAACb,EAAMpB,KAC5FmE,EAAQ7C,KAAK,CACXqP,QAAmBhV,KAAK4oC,QAAQ7iB,SAAS1hB,GACzCoB,WAIJ,MAAM6jC,EAAc9gC,EAAQ/E,MAAM,EAAGzD,KAAKiV,WAAWrQ,SAASzC,QACxDonC,EAAc/gC,EAAQ/E,MAAMzD,KAAKiV,WAAWrQ,SAASzC,OAAS,GAE9D0S,EAAS7U,KAAK4oC,QAAQ7iB,SAAS/lB,KAAKiV,WAAWrQ,SAASzC,QAC9DinC,GAAS,EACTI,GAAiB30B,EAAQ5N,EAAQ,IAAMA,IAAWjH,KAAKiH,OAAQjH,KAAKiV,WAAW7P,QAASkkC,EAAaC,GACrGH,GAAS,MACJ,CACL,MACMK,EAAUlvB,EADAsB,EAAK6tB,MAAS7tB,EAAKnb,MAAQ,EAQzC,IAAIipC,EAHJ3pC,KAAK4oC,QAAQxoC,UAAUC,IAAI,iBACtBL,KAAK4oC,QAAQgB,WAIwDD,EAD7C,IAA1B3pC,KAAKiV,WAAWqH,OAAgBmtB,EAC3BzpC,KAAKiV,WAAWqH,QAAWtc,KAAKiV,WAAWtQ,MAAQ,GAAM8kC,IAAsBzpC,KAAKiV,WAAWtQ,MAAQ,GAC/F8kC,EAAU,GAAK,EAFwBzpC,KAAKiV,WAAWtQ,MAAQ,EAG/E3E,KAAKiV,WAAWG,GAAGu0B,GAEnB,aAAQ,KACN3pC,KAAK4oC,QAAQxoC,UAAUuB,OAAO,wBAMtC,MAAMkoC,EAAkB,KACtBre,GAAS,EACTtrB,SAASiW,KAAKnV,iBAAiB,sBAAqB,WAAa,QAAUiB,IACzEupB,GAAS,GACR,CAAC7T,MAAM,KAGZ,IAAIjX,EAAQ,EAAG6Z,EAAI,EAAGuvB,EAAY,EAAkBC,EAAO,EACtC,IAAI,GAAa,CACpC/0B,QAAShV,KAAK4oC,QACdV,QAAS,CAACL,EAAOC,KACfgC,EAAYjC,EACZ,IAAImC,EAAQzvB,EAAIstB,GAAS,GAAmBoC,MAM5C,OALGD,EAAQ,EAAGA,EAAQ,EACdA,EAAQD,IAAMC,EAAQD,GAE9B/pC,KAAK4oC,QAAQjmC,MAAMga,UAAY,GAAmButB,mBAAmB1mC,QAAQ,MAAOwmC,EAAQ,OAErF,GAETtC,kBAAoBzlC,GACdinC,KAIMlpC,KAAKC,UAAUG,UAAUuR,SAAS,eAAgBy3B,GAH1DS,IACA,OAAAnsB,EAAA,GAAYzb,IACL,GAOX+lC,aAAc,KACZ,MAAMnsB,EAAO7b,KAAK4oC,QAAQ9sB,wBAC1Bpb,EAAQmb,EAAKnb,MACbqpC,GAAQrpC,GAASV,KAAKoO,KAAKnE,kBAAoB,GAI/CsQ,EAAIsB,EAAKkB,KAAO/c,KAAKC,UAAU6b,wBAAwBiB,KAEvD/c,KAAK4oC,QAAQjmC,MAAMga,UAAY,GAAmButB,mBAAmB1mC,QAAQ,MAAO+W,EAAI,MAExFva,KAAKC,UAAUG,UAAUC,IAAI,cAC7BL,KAAK4oC,QAAQxoC,UAAUC,IAAI,iBACtBL,KAAK4oC,QAAQgB,YAEpBrC,QAAS,KACP,MAAM4C,EAAW9nC,KAAK6jB,KAAK7jB,KAAKovB,IAAIqY,IAAcppC,EAAQ,GAAmBupC,SAAWH,GAAa,EAAI,GAAK,GAC9GD,IAIA7pC,KAAK4oC,QAAQxoC,UAAUuB,OAAO,iBAC9B,aAAQ,KACN3B,KAAKiV,WAAWG,GAAG+0B,GACnBnqC,KAAKC,UAAUG,UAAUuB,OAAO,mBAKtC3B,KAAK6oC,qBAAuB,IAAIuB,qBAAqBC,IACnDA,EAAQ/jC,QAAQgkC,IACVA,EAAMC,gBAIVvqC,KAAKwqC,oBAAoBF,EAAMz1B,YAK9B,QAAQ5N,GACbjH,KAAKiH,OAASA,EAEd,MAAMzC,EAAQ,IAAgBmU,aAAa1R,GAC3C,IAAIzC,EACF,OAGF,MAAMyQ,EAA+CjV,KAAKiV,WAAa,IAAI,EAAW,CACpFlQ,UAAW,GACXqB,SAAU,CAACF,EAAQF,EAAOjB,KACxB,IAAIiB,EAAO,OAAOnD,QAAQoD,QAAQ,CAACtB,WAAOD,EAAWc,MAAO,KAE5D,GAAGyB,EAAOo2B,SAAU,CAClB,MAAMz2B,EAA4BV,GAAU+O,EAAW7P,QACvD,OAAO,IAAiBqlC,cAAcxjC,EAAQL,EAAO7B,GAAWlE,KAAKqB,IAC5D,CACLyC,MAAOzC,EAAMyC,MACba,MAAOtD,EAAMwoC,UAGZ,CACL,MAAMrM,EAA6E,GAenF,OAdIppB,EAAW7P,SACbi5B,EAAS14B,KAAK,UAAkBy9B,YAAYn8B,EAAO4vB,aAGrDwH,EAAS14B,KAAK,IAAmBoB,UAAU,CACzCE,SACAL,MAAO+jC,OAAOC,iBACdzjC,YAAa,CACXC,EAAG,iCAELF,MAAOnC,EACP4B,UAAW,KAGN9D,QAAQC,IAAIu7B,GAAUx9B,KAAMwF,IACjC,MAAMnE,EAAQmE,EAAOX,MAIrB,GAFAxB,EAAyBhC,IAErB+S,EAAW7P,QAAS,CACtB,MAAMwzB,EAAWvyB,EAAO,GAClBjC,EAAUlC,EAAMiC,QAAQ04B,cAAcgO,GACjCA,EAA6BtmC,OAAuDC,MAAM2K,KAAOypB,EAASkS,WAAW37B,IAGhI8F,EAAW7P,QAAUhB,GAAW,IAAmB2mC,0BAA0B/qC,KAAKiH,OAAQ2xB,EAASkS,YAIrG,MAAO,CACLnmC,MAAOzC,EAAMyC,MACba,MAAOtD,EAAMiC,aAKrBsC,YAAazG,KAAKyG,YAClBV,OAAQ,CAACN,EAAMO,KACb,MAAMmJ,EAAKnP,KAAKiV,WAAWqH,MAErB/B,EAAI,IAAM,GAAmB0vB,MAAQ96B,EAC3CnP,KAAK4oC,QAAQjmC,MAAMga,UAAY,GAAmButB,mBAAmB1mC,QAAQ,MAAO,IAAI+W,MAExF,MAAMywB,EAAYhrC,KAAKoO,KAAKyB,cAAc,WACvCm7B,GAAWA,EAAU5qC,UAAUuB,OAAO,UAE7B3B,KAAKoO,KAAK2X,SAAS5W,GAC3B/O,UAAUC,IAAI,UAElBL,KAAKwqC,oBAAoBxqC,KAAK4oC,QAAQ7iB,SAAS5W,OAIpC,qBAAZ3K,EAAM4C,IACP6N,EAAW7P,QAAUZ,EAAMymC,UAG7BjrC,KAAKyG,YAAYwO,EAAW7P,SAG5B6P,EAAWnP,MAAK,GAGX,SACL,MAAM0J,EAAMtP,SAASC,cAAc,OACnCqP,EAAIpP,UAAUC,IAAI,GAAmBioC,WAAa,QAClDtoC,KAAKoO,KAAKrE,OAAOyF,GAEkB,IAAhCxP,KAAKoO,KAAKnE,mBACXuF,EAAIpP,UAAUC,IAAI,UAGpBL,KAAKC,UAAUG,UAAUkM,OAAO,YAAatM,KAAKoO,KAAKnE,mBAAqB,GAkDtE,oBAAoB4K,GAC1B,MAAMkR,EAAW5d,MAAMC,KAAKyM,EAAO/D,cAAciV,UAC3C1hB,EAAM0hB,EAASxJ,QAAQ1H,GACfkR,EAAStiB,MAAMpB,KAAKP,IAAI,EAAGuC,EAxVxB,GAwV6ChC,KAAKC,IAAIyjB,EAAS5jB,OAAQkC,EAxVvE,IA0VXiC,QAAQuO,IACZ,MAAMmjB,EAAWh4B,KAAKmoC,cAAcn4B,IAAI6E,GACrCmjB,IACDA,IACAh4B,KAAKmoC,cAAc95B,OAAOwG,GAC1B7U,KAAK6oC,qBAAqBqC,UAAUr2B,OA5V3B,GAAAyzB,WAAa,kBACb,GAAA2B,MAAQ,GAAqB,EAAI,EACjC,GAAAC,mBAAqB,GAAqB,mCAAmC,GAAmBD,SAAW,oBCE5H,IAAIkB,GAAU,CAACjuB,EAAc2U,KAEzBA,EAAIjkB,MAAM3J,UAAYiZ,EACtB2U,EAAI5xB,UAAU0C,MAAMC,QAAU,IAInB,MAAM,GAmBnB,YAAmBmI,GAAA,KAAAA,aA+HZ,KAAAqgC,cAAgB,CAACC,GAAY,KAClC,IAAIrrC,KAAKiH,OAAQ,OAEjB,MAAMA,EAASjH,KAAKiH,OACpB,GAAamkC,cAAcprC,KAAKiH,OAAQjH,KAAKqsB,SAAUgf,GAAW,EAAM,IAAMpkC,IAAWjH,KAAKiH,SAlI1F,IACFjH,KAAK+K,WAAW9K,UAAUG,UAAUC,IAAI,eAIrC,OACLL,KAAKkO,KAAO,KAEZlO,KAAKgV,QAAU9U,SAASC,cAAc,OACtCH,KAAKgV,QAAQ5U,UAAUC,IAAI,mBAE3BL,KAAKo4B,QAAU,IAAI,GAAe,CAChCe,aAAa,IAGfn5B,KAAKqoC,OAAS,IAAI,GAClBroC,KAAKqoC,OAAOjoC,UAAUC,IAAI,iBAAkB,cAC5CL,KAAKqoC,OAAOjlC,aAAa,SAAU,KACnCpD,KAAKqoC,OAAOjlC,aAAa,YAAa,IAEtCpD,KAAKsJ,KAAOpJ,SAASC,cAAc,OACnCH,KAAKsJ,KAAKlJ,UAAUC,IAAI,gBAExBL,KAAKqsB,SAAWnsB,SAASC,cAAc,OACvCH,KAAKqsB,SAASjsB,UAAUC,IAAI,oBAE5BL,KAAKsrC,IAAM,IAAI,GAAI,CACjB19B,MAAO,IACPwlB,gBAAiB,UACjB/lB,KAAM,OACN5D,UAAYxH,IAC+B,MAArCA,EAAE4S,OAAuB02B,SAI7B,UAAkBC,mBAAmBxrC,KAAKiH,QAAQpG,KAAKiqB,IACrDiJ,GAAoBjJ,EAAK2Y,OACzBvO,GAAM,UAAKlc,OAAO,aAAa,SAKrChZ,KAAKsrC,IAAI19B,MAAMxN,UAAUC,IAAI,YAE7BL,KAAKw2B,SAAW,IAAI,GAAI,CACtB5oB,MAAO,IACPwlB,gBAAiB,WACjB/lB,KAAM,WACN5D,UAAW,KAETsqB,GAAoB,IADc,IAAgBqH,QAAQp7B,KAAKiH,QAChCuvB,UAC/BtB,GAAM,UAAKlc,OAAO,kBAAkB,OAIxChZ,KAAK6lC,MAAQ,IAAI,GAAI,CACnBj4B,MAAO,IACPwlB,gBAAiB,QACjB/lB,KAAM,QACN5D,UAAW,KAETsqB,GAAoB,IADD,IAAgBmR,QAAQllC,KAAKiH,QACjB4+B,OAC/B3Q,GAAM,UAAKlc,OAAO,eAAe,OAIrChZ,KAAKyrC,cAAgB,IAAI,GAAI,CAC3BruB,cAAe,IAAI,KAAc,CAAC9Q,QAAQ,IAC1ConB,aAAc,gBACdrmB,KAAM,WAGRrN,KAAKo4B,QAAQvqB,QAAQ9D,OAAO/J,KAAK6lC,MAAM5lC,UAAWD,KAAKw2B,SAASv2B,UAAWD,KAAKsrC,IAAIrrC,UAAWD,KAAKyrC,cAAcxrC,WAElHD,KAAKgV,QAAQjL,OAAO/J,KAAKo4B,QAAQn4B,UAAWyrC,MAE5C1rC,KAAKyrC,cAAcruB,cAAcrb,MAAMf,iBAAiB,SAAWiB,IAC7DA,EAAEyT,WAKN,IAAmB6vB,SAASvlC,KAAKiH,UAGnC2B,EAAA,QAAU5H,iBAAiB,yBAA2B6K,IACpD,GAAG7L,KAAKiH,SAAW4E,EAAO5E,OAAQ,CAChC,MAAMkQ,EAAQ,KAAwB6uB,iBAAiBhmC,KAAKiH,QAAQ,GACpEjH,KAAKyrC,cAAcruB,cAAcO,SAAWxG,KAIhDvO,EAAA,QAAU5H,iBAAiB,eAAgB,EAAEiG,aACxCjH,KAAKiH,SAAWA,GACjBjH,KAAKorC,kBAITxiC,EAAA,QAAU5H,iBAAiB,gBAAkBiG,IACxCA,IAAWjH,KAAKiH,QACjBjH,KAAK2rC,QAAO,KAIhB/iC,EAAA,QAAU5H,iBAAiB,cAAgBoR,IACtCpS,KAAKiH,SAAWmL,GACjBpS,KAAKorC,kBAITxiC,EAAA,QAAU5H,iBAAiB,kBAAoBoR,IAC7C,GAAGpS,KAAKiH,SAAWmL,EAAQ,CACzB,MAAM6yB,EAAO,IAAgBC,QAAQ9yB,GACjC6yB,EAAK3tB,OAAOs0B,OACX3G,EAAKY,MACNsF,GAAQ,IAAgBrF,gBAAgBb,EAAKY,OAAQ7lC,KAAK6lC,OAE1D7lC,KAAK6lC,MAAM5lC,UAAU0C,MAAMC,QAAU,WAM7C5C,KAAK6rC,sBAAwBtgC,OAAOugC,YAAY9rC,KAAKorC,cAAe,KAU/D,cACLprC,KAAKsrC,IAAIrrC,UAAU0C,MAAMC,QAAU,OACnC5C,KAAK6lC,MAAM5lC,UAAU0C,MAAMC,QAAU,OACrC5C,KAAKw2B,SAASv2B,UAAU0C,MAAMC,QAAU,OACxC5C,KAAKyrC,cAAcxrC,UAAU0C,MAAMC,QAAU,GAC7C5C,KAAKyrC,cAAcruB,cAAcO,SAAU,EACxC3d,KAAK+rC,gBACNxgC,OAAOyB,aAAahN,KAAK+rC,eACzB/rC,KAAK+rC,cAAgB,GAIlB,YACL,GAAG/rC,KAAKiH,SAAW2B,EAAA,QAAU6O,KAAM,CAGjC,GAFc,IAAgBkB,aAAa3Y,KAAKiH,QAEtC,CACR,MAAM+kC,EAAahsC,KAAK4oC,QAcxB,OAbA5oC,KAAK4oC,QAAU,IAAI,GAAmB5oC,KAAK+K,YAC3C/K,KAAK4oC,QAAQqD,QAAQjsC,KAAKiH,QAC1BjH,KAAK4oC,QAAQlI,KAAK32B,OAAO/J,KAAKsJ,KAAMtJ,KAAKqsB,UAEzCrsB,KAAKqoC,OAAO1mC,SAETqqC,EAAYA,EAAW/rC,UAAUypB,YAAY1pB,KAAK4oC,QAAQ3oC,WACxDD,KAAKgV,QAAQ4J,QAAQ5e,KAAK4oC,QAAQ3oC,gBAEpC,IACDD,KAAK+K,WAAW9K,UAAUG,UAAUC,IAAI,cAO3C,IACDL,KAAK+K,WAAW9K,UAAUG,UAAUuB,OAAO,YAG1C3B,KAAK4oC,UACN5oC,KAAK4oC,QAAQ3oC,UAAU0B,SACvB3B,KAAK4oC,aAAUlkC,GAGjB1E,KAAKqoC,OAAOjlC,aAAa,OAAQ,GAAKpD,KAAKiH,QAE3CjH,KAAKo4B,QAAQvqB,QAAQ+Q,QAAQ5e,KAAKqoC,OAAQroC,KAAKsJ,KAAMtJ,KAAKqsB,UAGrD,sB,MACL,IAAIrsB,KAAKksC,QAAS,OAClBlsC,KAAKksC,SAAU,EAEf,MAAMjlC,EAASjH,KAAKiH,OAOpB,GALAjH,KAAKmsC,cAELnsC,KAAKosC,YAGFnlC,IAAW2B,EAAA,QAAU6O,KAAM,CACb,IAAgB40B,gBAAgBplC,IAE7CkkC,GAAQ,IAAgBkB,gBAAgBplC,GAASjH,KAAKw2B,UAGxD,MAAMrf,EAAQ,KAAwB6uB,iBAAiB/+B,GAAQ,GAC/DjH,KAAKyrC,cAAcruB,cAAcO,SAAWxG,OAE5C,aAAQ,KACNnX,KAAKyrC,cAAcxrC,UAAU0C,MAAMC,QAAU,SAKjD,GAAGqE,EAAOo2B,SAAU,CAGlB,IAAI4H,EAAO,IAAgBC,QAAQj+B,GAChCg+B,EAAKY,OAAS5+B,IAAW2B,EAAA,QAAU6O,MACpC0zB,GAAQ,IAAgBrF,gBAAgBb,EAAKY,OAAQ7lC,KAAK6lC,OAM9D7lC,KAAK2rC,SAEL,OAAAp/B,EAAA,GAAevM,KAAKsJ,KAAM,IAAI,KAAU,CACtCrC,SACA4E,QAAQ,IACPmJ,SAEH,MAAM0sB,EAAO,IAAgBtG,QAAQn0B,IACtB,QAAZ,EAAAy6B,aAAI,EAAJA,EAAMpqB,cAAM,eAAEg1B,WACftsC,KAAKsJ,KAAKS,OAAO48B,MAGnB3mC,KAAKorC,eAAc,GAGd,OAAOmB,GACTvsC,KAAK+rC,gBACNxgC,OAAOyB,aAAahN,KAAK+rC,eACzB/rC,KAAK+rC,cAAgB,GAGvB,MAAM9kC,EAASjH,KAAKiH,OACd6D,EAAW9K,KAAK8K,SAEtB,IAAI7D,EACF,OAGF,IAAId,EAEFA,EADCc,EAAOo2B,SACE,UAAkBmP,WAAWvlC,EAAQslC,GAAU1rC,KAAK4rC,GACzDzsC,KAAKiH,SAAWA,GAAUjH,KAAK8K,WAAaA,IAK5C2hC,EAASC,QAAUzlC,IAAW2B,EAAA,QAAU6O,MACzC0zB,GAAQsB,EAASC,OAAQ1sC,KAAKsrC,MAIzB,IAGC,UAAkBlI,YAAYn8B,EAAO4vB,WAAY0V,GAAU1rC,KAAM+3B,GACtE54B,KAAKiH,SAAWA,GAAUjH,KAAK8K,WAAaA,IAO5C8tB,EAAS6K,OACV0H,GAAQ,IAAkBwB,aAAa/T,EAAS6K,OAAQzjC,KAAKsrC,MAGxD,IAIXnlC,EAAQtF,KAAM+rC,IACTA,IACD5sC,KAAK+rC,cAAgBxgC,OAAOC,WAAW,IAAMxL,KAAK2rC,QAAO,GAAO,QAK/D,QAAQ1kC,EAAgB6D,EAAW,GACrC9K,KAAKiH,SAAWA,GAAUjH,KAAK8K,WAAaA,IAE5C9K,KAAKkO,MACNlO,KAAKkO,OAGPlO,KAAKiH,OAASA,EACdjH,KAAK8K,SAAWA,EAEhB9K,KAAKksC,SAAU,ICtUJ,MAAM,WAA0B,EAiB7C,YAAY5+B,GACVrK,MAAMqK,GAAQ,GAdR,KAAAxC,SAAW,EAEX,KAAA+hC,iBAIJ,GAWG,OAGL7sC,KAAKC,UAAUG,UAAUC,IAAI,yBAA0B,qBAGvD,MAAMysC,EAAc,YAAO,gCAAiC,CAACn/B,UAAU,IACvE3N,KAAK0N,SAASgc,YAAYojB,GAC1B9sC,KAAK0N,SAAWo/B,EAEhB,MAAMC,EAAoB7sC,SAASC,cAAc,OACjD4sC,EAAkB3sC,UAAUC,IAAI,uBAChCysC,EAAY/iC,OAAOgjC,GAEnB,MAAMC,EAAsB9sC,SAASC,cAAc,OACnD6sC,EAAoBxjC,UAAY,wBAEhC,MAAMyjC,EAAsB/sC,SAASC,cAAc,OACnD8sC,EAAoB7sC,UAAUC,IAAI,mBAElCL,KAAK4N,MAAM7D,OAAO,eAAK,YACvB/J,KAAKktC,QAAU,EAAW,QAG1BD,EAAoBljC,OAAO/J,KAAK4N,MAAO5N,KAAKktC,SAE5C,MAAMC,EAAqBjtC,SAASC,cAAc,OAClDgtC,EAAmB/sC,UAAUC,IAAI,mBAEjC,MAAM+sC,EAA2BptC,KAAK4N,MAAMy/B,YAC5CD,EAAYrjC,OAAO,eAAK,yBAExBojC,EAAmBpjC,OAAOqjC,GAE1BJ,EAAoBjjC,OAAOkjC,EAAqBE,GAEhDntC,KAAKyN,OAAO1D,OAAOijC,GAInBhtC,KAAKstC,QAAU,IAAI,GAAYttC,KAAK+K,YACpC/K,KAAKstC,QAAQp/B,OAEblO,KAAK+K,WAAWhB,OAAO/J,KAAKstC,QAAQt4B,SAGpChV,KAAK+K,WAAWwiC,mBAAqB,KACnC,MAAM1xB,EAAO7b,KAAKwtC,YAAYC,IAAI3xB,wBAClC,IAAID,EAAKnb,MAAO,OAEhB,MACMgtC,EADM7xB,EAAKsY,IAAM,GALH,GAOpB4Y,EAAkB3sC,UAAUkM,OAAO,aAAcohC,GACjD1tC,KAAKwtC,YAAYvtC,UAAUG,UAAUkM,OAAO,mBAAoBohC,GAChEC,GAAYD,GAERA,GACF1tC,KAAKwtC,YAAYI,wBAIrB,MAAMD,EAAa,YAAiBX,EAAqB,aAAc,IAAK,MAAM,GAElFW,EAAW,GAEX,YAAiB3tC,KAAK0N,SAAWzL,IAC5BjC,KAAK0N,SAASmS,kBAAkBzf,UAAUuR,SAAS,eACpD3R,KAAK+K,WAAW8zB,kBAAkB7+B,KAAK+K,WAAW9K,UAAU4f,kBAAkC,SAC9F8tB,EAAW,GACXZ,EAAkB3sC,UAAUuB,OAAO,eAC1B3B,KAAK+K,WAAW8iC,4BACzB7tC,KAAKsN,OAAOwB,oBAIhB,YAAiB9O,KAAKktC,QAAUjrC,IAC9B,IAAIuN,EAEFA,EADCxP,KAAKiH,OAAOw3B,YACP,IAAI,GAAez+B,KAAKsN,QAExB,IAAI,GAAkBtN,KAAKsN,QAGhCkC,IACEA,aAAe,GAChBA,EAAIwC,OAAShS,KAAKiH,OAAO4vB,WAEzBrnB,EAAIvI,OAASjH,KAAKiH,OAGpBuI,EAAIuB,UAIRnI,EAAA,QAAU5H,iBAAiB,kBAAoBoR,IAC1CpS,KAAKiH,SAAWmL,GACjBpS,KAAK8tC,kBAITllC,EAAA,QAAU5H,iBAAiB,cAAgBgR,IACtChS,KAAKiH,SAAW+K,EAAO8V,UAAS,IACjC9nB,KAAK8tC,kBAITllC,EAAA,QAAU5H,iBAAiB,sBAAwB+sC,IACjD,IAAI,MAAM9mC,KAAU8mC,EAClB/tC,KAAKguC,kBAAkB/mC,EAAO6gB,WAAY3f,MAAMC,KAAK2lC,EAAa9mC,OAItE2B,EAAA,QAAU5H,iBAAiB,iBAAkB,EAAEiG,SAAQQ,WACrDzH,KAAKiuC,sBAAsBhnC,EAAQkB,MAAMC,KAAKX,MAIhDmB,EAAA,QAAU5H,iBAAiB,eAAgB,EAAEoD,cAC3CpE,KAAKguC,kBAAkB5pC,EAAQ6C,OAAQ,CAAC7C,EAAQyC,QAKlD7G,KAAKwtC,YAAc,IAAI,GAAe,CACpCU,UAAW,CAAC,CACV/mC,YAAa,2BACbmC,KAAM,oBACNnG,KAAM,WACL,CACDgE,YAAa,gCACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,8BACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,yBACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,2BACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,gCACbmC,KAAM,kBACNnG,KAAM,UAER4H,WAAY/K,KAAK+K,WACjBojC,YAAcC,IACZ,IAAIthC,EAA4B,YAAlBshC,EAASjrC,MAAsByF,EAAA,QAAUo2B,SAASC,kBAAoB,IAAM,EAC1FzzB,WAAW,KACT6iC,EAAcjuC,UAAUkM,OAAO,YAA+B,YAAlB8hC,EAASjrC,OACpD2J,MAIP9M,KAAKstC,QAAQt4B,QAAQjL,OAAO/J,KAAKwtC,YAAYvtC,WAE7C,MAAMouC,EAAgB,EAAa,CAAChhC,KAAM,qBAC1CrN,KAAK6N,QAAQ9D,OAAOskC,GAEpBA,EAAcrtC,iBAAiB,QAAS,KACtC,MAAMiG,EAASjH,KAAKiH,OACdkI,EAAKnP,KAAKiH,OAAO4vB,WACjBwL,EAAY,IAAgBA,UAAUlzB,GAEtCm/B,EAAmB,CAACx8B,EAAmBkmB,KAC3C,IAAItE,EAA2B4D,EAC7BG,EAAiCG,EACjCC,EAEF,GAAG/lB,EAAQ3P,OAAS,EAClBuxB,EAAe,uBACf4D,EAAgB,CAAC,eAAK,UAAW,CAACxlB,EAAQ3P,UAC1Cs1B,EAAqB,2BACrBG,EAAsB9lB,EAAQrJ,IAAIxB,IAChC,MAAMsB,EAAIrI,SAASC,cAAc,KAEjC,OADAoI,EAAEwB,OAAO,IAAI,KAAU,CAAC9C,WAAS+N,SAC1BzM,IAGL85B,IACFxK,EAAa,CAAC,CACZ3a,KAAM,4BACNS,SAAS,SAGR,CACL+V,EAAe,yBACf+D,EAAqB,2BACrB,MAAMlvB,EAAIrI,SAASC,cAAc,KACjCoI,EAAEwB,OAAO,IAAI,KAAU,CACrB9C,OAAQ6K,EAAQ,KACfkD,SACH4iB,EAAsB,CAACrvB,GAEnB85B,IACFxK,EAAa,CAAC,CACZ3a,KAAM,8BACNimB,SAAU,CAAC,IAAI,KAAU,CAACl8B,OAAQ6K,EAAQ,KAAKkD,SAC/C2I,SAAS,KAKfia,EAAoBjyB,KAAK,IAAI,KAAU,CACrCsB,WACC+N,SAEH,IAAI,GAAU,oBAAqB,CACjC/N,SACAysB,eACA+D,qBACAG,sBACAha,QAAS,CAAC,CACRmX,QAAS,MACTiD,aAEFH,eACCtX,QAGCguB,EAAW9hC,IACC,4BAAbA,EAAItJ,MACLgyB,GAAS,CAACC,YAAa,wBAI3B,GAAGiN,EAAW,CACZ,MAAM7yB,EAAM,IAAI,GAAiBxP,KAAKsN,QACtCkC,EAAIuB,KAAK,CACP5N,KAAM,UACNijC,WAAW,EACXxG,QAAU9tB,IACRw8B,EAAiBx8B,EAAS,KACxB,MAAM3L,EAAU,IAAgBqoC,gBAAgBr/B,EAAI2C,GACpD3L,EAAQqG,MAAM+hC,GACd/+B,EAAI62B,gBAAgBlgC,MAGf,GAETyH,MAAO,kBACPhB,YAAa,uBAGf,IAAI,GAAc,CAChB4yB,UAAW,CAAC,YACZ5yB,YAAa,SACb0yB,SAAWr4B,IACTuE,WAAW,KACT8iC,EAAiB,CAACrnC,GAAU0W,IAC1B,IAAgB8wB,YAAYt/B,EAAIlI,EAAQ0W,EAAQ7d,UAAO4E,EAAY,GAClE8H,MAAM+hC,MAER,QASN,kBAAkBtnC,EAAgBgB,GACvC,IAAGjI,KAAKkO,MAEJlO,KAAK6sC,iBAAiB5lC,GAA1B,CAEAgB,EAAOA,EAAKxE,QAAQqB,UACpB,IAAI,MAAMspC,KAAYpuC,KAAKwtC,YAAYU,UAAW,CAChD,MAAM/mC,EAAcinC,EAASjnC,YACvBunC,EAAW1uC,KAAKwtC,YAAYmB,qBAAqB1mC,EAAKQ,IAAI5B,GAAO,IAAmB2S,iBAAiBvS,EAAQJ,IAAOM,GAC1H,GAAGunC,EAASvsC,OAAQ,CAClB,MAAMgC,EAAUnE,KAAK6sC,iBAAiB5lC,GAAQE,GAC3ChD,GACDA,EAAQ0B,WAAW6oC,EAASjmC,IAAIrE,IAAW,CAAEyC,IAAKzC,EAAQyC,IAAKI,OAAQ7C,EAAQ6C,WAG9EjH,KAAKiH,SAAWA,IAA6D,IAAnDjH,KAAKwtC,YAAYoB,gBAAgBznC,KAC5DnH,KAAKwtC,YAAYoB,gBAAgBznC,IAAgBunC,EAASvsC,OAC1DnC,KAAKwtC,YAAYqB,oBAAoBH,EAAUN,GAAU,OAM1D,sBAAsBnnC,EAAgBgB,GAC3C,IAAGjI,KAAKkO,MAEJlO,KAAK6sC,iBAAiB5lC,GAA1B,CAEA,IAAI,MAAMJ,KAAOoB,EACf,IAAI,MAAM9E,KAAQnD,KAAKwtC,YAAYU,UAAW,CAC5C,MAAM/mC,EAAchE,EAAKgE,YAEnBhD,EAAUnE,KAAK6sC,iBAAiB5lC,GAAQE,GAC9C,IAAIhD,EAAS,SAEb,MAAME,EAAMF,EAAQgR,UAAU01B,GAAKA,EAAEhkC,MAAQA,GAC7C,IAAY,IAATxC,EAAY,CAGb,GAFAF,EAAQM,OAAOJ,EAAK,GAEjBrE,KAAKiH,SAAWA,EAAQ,CACzB,MACMkmB,EADYntB,KAAKwtC,YAAYp/B,KAAKjH,GAClB0I,cAAc,iBAAiBhJ,qBAAuBI,OACzEkmB,IACEntB,KAAKwtC,YAAYsB,UAAUC,aAC5B/uC,KAAKwtC,YAAYsB,UAAUE,gBAAgB7hB,GAG7CA,EAAIxrB,UAGH3B,KAAKwtC,YAAYoB,gBAAgBznC,IAAiB9C,EAAM,GACzDrE,KAAKwtC,YAAYoB,gBAAgBznC,KAIrC,OAKNnH,KAAK+K,WAAWy3B,YAGX,cAELxiC,KAAKstC,QAAQnB,cAEbnsC,KAAKktC,QAAQ9sC,UAAUC,IAAI,QAE3BL,KAAKwtC,YAAYrB,aAAY,GAE7BnsC,KAAKC,UAAUG,UAAUkM,OAAO,kBAAmBtM,KAAKwtC,YAAYyB,kBAAoB,IAAgB1R,UAAUv9B,KAAKiH,OAAO4vB,WAAY,iBAKrI,aAAa1wB,GAClBnG,KAAKwtC,YAAY0B,UAAY/oC,EAGxB,QAAQc,EAAgB6D,EAAW,G,MACxC,OAAG9K,KAAKiH,SAAWA,GAAUjH,KAAK8K,WAAaA,KAE/C9K,KAAKiH,OAASA,EACdjH,KAAK8K,SAAWA,EAChB9K,KAAKmvC,aAAc,EAEhBnvC,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGdlO,KAAKwtC,YAAY4B,SAAS,CACxBnoC,SAEAooC,eAA6C,QAA7B,EAAArvC,KAAK6sC,iBAAiB5lC,UAAO,QAAKjH,KAAK6sC,iBAAiB5lC,GAAU,KAGpFjH,KAAKstC,QAAQrB,QAAQhlC,EAAQ6D,IAEtB,GAGF,sBACD9K,KAAKmvC,cAITnvC,KAAKmvC,aAAc,EAEnBnvC,KAAKmsC,cAELnsC,KAAKstC,QAAQgC,sBAEbtvC,KAAK8tC,iBAGC,gBACN,IAAIvtB,EAEFA,EADCvgB,KAAKiH,OAAOo2B,SACNr9B,KAAKiH,SAAW2B,EAAA,QAAU6O,MAAQ,IAAgBqtB,UAAU9kC,KAAKiH,OAAO8K,YAExE,IAAgBwrB,UAAUv9B,KAAKiH,OAAO4vB,WAAY,eAG3D72B,KAAKktC,QAAQ9sC,UAAUkM,OAAO,QAASiU,GAGlC,iBAAiBgvB,EAAiBC,GAAW,GAClDxvC,KAAKwtC,YAAY1nC,KAAKypC,EAAQC,GAGhC,qBACExvC,KAAK+K,WAAWy3B,YCrTpB,MAAM,GAAkB,IA7HjB,cAA8B,EAInC,cACEv/B,MAAM,CACJ2M,UAAW1P,SAASuvC,eAAe,gBACnC5gC,cAAc,EACdI,eAAgB,UANZ,KAAAygC,uBAAwB,EAS9BxrB,EAAA,EAAWljB,iBAAiB,eAAgB,CAACoH,EAAMunC,KAC9CA,IAAO,IAAWC,QAAUxnC,IAAS,IAAWynC,QACjD7vC,KAAK8vC,eAAc,KAIvB5rB,EAAA,EAAWljB,iBAAiB,SAAU,KACpChB,KAAK+vC,wBAGP/vC,KAAKgwC,eAAiB,IAAI,GAAkBhwC,MAGvC,WAAWmP,EAAYC,EAAkBC,GAC1CrP,KAAK4O,cAAczM,QACrBnC,KAAK8vC,eAAc,EAAO1gC,GAG5BnM,MAAMsM,WAAWJ,EAAIC,EAASC,GAaxB,sBACN,MAAM4gC,EAAajwC,KAAK4P,UAAUsgC,YAAclwC,KAAK4P,UAAUugC,uBAAuBD,YACtFhwC,SAASkwC,gBAAgBztC,MAAMolC,YAAY,4BAA6B,GAAKkI,GAGxE,cAAcI,EAAkBjhC,GAGrC,MAAMkhC,EAASpwC,SAASiW,KAAK/V,UAAUuR,SApDE,yBAqDzC,IAAI4+B,EAaJ,QAZc7rC,IAAX2rC,EACEA,EACGC,IACFC,GAAa,GAEPD,IACRC,GAAa,GAGfA,GAAa,GAGXA,EAAY,OAAO1tC,QAAQoD,UAE3BqqC,GAAWtwC,KAAK4O,cAAczM,QAChCnC,KAAKgwC,eAAej/B,OAIlB/Q,KAAK0vC,wBACP1vC,KAAK+vC,sBACL/vC,KAAK0vC,uBAAwB,GAG/B,MAAMc,EAAmB,GAAariC,UAAUmiC,EAAS,EAAI,EAAGlhC,GAEhE,OADAlP,SAASiW,KAAK/V,UAAUkM,OA/EiB,wBA+EqB+jC,GACvDG,IAgDX,KAAeC,gBAAkB,GAClB,UC9HA,MAAM,WAA0B,EAGnC,OACRzwC,KAAKC,UAAUkP,GAAK,yBACpBnP,KAAKC,UAAUG,UAAUC,IAAI,sBAE7BL,KAAK0wC,WAAaxwC,SAASC,cAAc,OACzCH,KAAK0wC,WAAWtwC,UAAUC,IAAI,gBAC9BL,KAAK+K,WAAWhB,OAAO/J,KAAK0wC,YAGvB,KAAKtsC,GACV,MAAMmiC,EAAMtjC,MAAM8N,OACZ4/B,EAAO,KAAgBC,QAAQxsC,EAAQ0O,MAAM69B,KAAKxhC,IAExDnP,KAAKmR,SAASw/B,EAAKA,KAAKr5B,OAAOu5B,KAAO,yBAA2B,0BAEjE,MAAMjjC,EAAQ1N,SAASC,cAAc,MACrCyN,EAAM3J,UAAY0sC,EAAKA,KAAKG,UAE5B,MAAMp0B,EAAWi0B,EAAK7S,QAAQA,QAAQr1B,IAAI03B,GAAKA,EAAE4Q,OAASJ,EAAK7S,QAAQkT,aAAe,KACtFC,GAAcv0B,GAEd,MAAM6a,EAAWr3B,SAASs3B,yBAyF1B,OAxFAmZ,EAAK7S,QAAQA,QAAQx3B,QAAQ,CAACD,EAAQhC,KACpC,IAAIgC,EAAO0qC,OAAQ,OAEnB,MAAMG,EAAKhxC,SAASC,cAAc,MAE5BgxC,EAASR,EAAKA,KAAKS,QAAQ/sC,GAG3BgtC,EAAWnxC,SAASC,cAAc,OACxCkxC,EAASjxC,UAAUC,IAAI,uBAEvB,MAAMixC,EAAcpxC,SAASC,cAAc,OAC3CmxC,EAAYrtC,UAAY,IAAkBwoB,cAAc0kB,EAAOj0B,MAE/D,MAAMq0B,EAAiBrxC,SAASC,cAAc,OAC9CoxC,EAAernB,UAAY7nB,KAAKE,MAAMma,EAASrY,IAAQ,IAEvDgtC,EAAStnC,OAAOunC,EAAaC,GAG7B,MAAM3nC,EAAO,GAAkBC,iBAC/BD,EAAKxJ,UAAUC,IAAI,uBAEnB,GAAkB2J,qBAAqBJ,EAAM,KAC3C,GAAgBkF,wBACfpK,GAAW,GAEdkF,EAAKjH,MAAM6uC,UAAyC,GAA7BnvC,KAAKC,IAAI+D,EAAO0qC,OAAQ,GAAU,KAEzDxZ,EAASxtB,OAAOmnC,EAAIG,EAAUznC,GAE9B,IAAIymB,EAAgBnpB,EAAQ,EAAG0yB,GAAU,EAAO7c,EAAO1W,EAAO0qC,OAAS,EACvE,MAAMjrC,EAAO,KACR8zB,IACHA,GAAU,EAEV,KAAgB6X,SAASrtC,EAAS+sC,EAAOO,OAAQrhB,EAAQnpB,GAAOrG,KAAK8wC,IACnEA,EAAUC,MAAMtrC,QAAQurC,IACtB,MAAM,IAAC/lC,GAAO,GAAkBC,aAAa,CAC3CF,OAAQgmC,EAAK9P,QAAQja,UAAS,GAC9B7nB,UAAW2J,EACXoC,YAAY,EACZqG,eAAe,EACfnG,WAAW,EACXD,WAAY,KAEdH,EAAIwG,gBAAgBxB,cAAcnP,WAGjC0uB,IACDtT,GAAQ40B,EAAUC,MAAMzvC,OACvB2vC,EAASC,iBAAiCroB,YAAY,eAAK,uBAAwB,CAACrnB,KAAKC,IAAI,GAAIya,OAGpGsT,EAASshB,EAAUK,YACnB9qC,EAAQ,GAEJ6V,GAAS40B,EAAUC,MAAMzvC,QAC3B2vC,EAASnwC,WAEVsf,QAAQ,KACT2Y,GAAU,MAMd,GAFA9zB,IAEGiX,GAAQ,EAAG,OAEd,MAAM+0B,EAAW5xC,SAASC,cAAc,OACxC2xC,EAAS1xC,UAAUC,IAAI,oBAAqB,YAAa,eACzDyxC,EAAS9wC,iBAAiB,QAAS8E,GACnC,OAAAwX,GAAA,QAAOw0B,GACP,MAAMG,EAAO/xC,SAASC,cAAc,OACpC8xC,EAAK7xC,UAAUC,IAAI,cACnByxC,EAAS/nC,OAAOkoC,EAAM,eAAK,uBAAwB,CAAC5vC,KAAKC,IAAI,GAAIya,MAEjEwa,EAASxtB,OAAO+nC,KAGlB9xC,KAAK0wC,WAAW3mC,OAAO6D,EAAO2pB,GAE9B,GAAgBuY,eAAc,GAAMjvC,KAAK,QAMlC0lC,G,aCtGX,IAAI2L,GAAkB,EACtB,MAKajB,GAAiBv0B,IAG5B,MAAM4T,EAAM5T,EAASqnB,OAAO,CAACC,EAAKrM,IAAMqM,EAAM3hC,KAAKE,MAAMo1B,GAAI,GAC7D,GAAGrH,EAAM,IAAK,CACZ,MAAMkB,EAAOlB,EAAM,IACbnuB,EAASua,EAASva,OACxB,IAAI,IAAI6I,EAAI,EAAGA,EAAIwmB,IAAQxmB,EAAG,CAC5B,IAAImnC,GAAY,EAAGC,EAAe,EAClC,IAAI,IAAIC,EAAI,EAAGA,EAAIlwC,IAAUkwC,EAAG,CAC9B,IAAIC,EAAY51B,EAAS21B,GAAK,EAC3BC,GAAa,IAAOA,EAAYF,IACjCA,EAAeE,EACfH,EAAWE,GAIf,IAAiB,IAAdF,EAED,OAGFz1B,EAASy1B,IAAaC,QAEnB,GAAG9hB,EAAM,IAAK,CACnB,MAAMkB,EAAO,IAAMlB,EACbnuB,EAASua,EAASva,OACxB,IAAI,IAAI6I,EAAI,EAAGA,EAAIwmB,IAAQxmB,EAAG,CAC5B,IAAImnC,GAAY,EAAGI,EAAe,EAClC,IAAI,IAAIF,EAAI,EAAGA,EAAIlwC,IAAUkwC,EAAG,CAC9B,IAAIC,EAAY51B,EAAS21B,GAAK,EAC3BC,EAAY,IAAOA,EAAYC,IAChCA,EAAeD,EACfH,EAAWE,GAIf,IAAiB,IAAdF,EAED,OAGFz1B,EAASy1B,IAAa,EAAII,KAqBhC3pC,EAAA,QAAU5H,iBAAiB,cAAe,EAAE2vC,OAAM7S,cAC3B31B,MAAMC,KAAKlI,SAAS4P,iBAAiB,yBAAyB6gC,EAAKxhC,SAC3E7I,QAAQksC,IAEnBA,EAAYC,WAAa9B,EAAKr5B,OAAOo7B,OACrCF,EAAYG,eAAe7U,EAAS6S,EAAKiC,mBAI7ChqC,EAAA,QAAU5H,iBAAiB,eAAgB,KACtC6xC,IACDC,GAAaD,GAAcE,GAAoBC,MAInD9uB,EAAA,EAAWljB,iBAAiB,SAAU,KACpC,GAAYiyC,eACZ,GAAYC,gBAGdhvB,EAAA,EAAWljB,iBAAiB,eAAgB,KAC1C,GAAYiyC,iBAGd,MAAMH,GAAe,CAAC99B,EAAsBm+B,EAAoBrmC,KAC9DkI,EAAQ5U,UAAUuB,OAAO,UAEzBqL,aAAaF,GACbtB,WAAW,KACT2nC,IACAn+B,EAAQrT,SAELkxC,KAAiB79B,GAAW+9B,KAAuBI,GAAUH,KAAwBlmC,IACtF+lC,GAAeE,GAAqB,KACpCC,GAAsB,IAEvB,MAGL,IAAIH,GAA2BE,GAAgCC,GA+BhD,MAAM,WAAoBjrB,YAmCvC,cACE9kB,QApBK,KAAAwvC,UAAW,EACV,KAAAW,QAAS,EACT,KAAAC,aAAc,EACd,KAAAC,UAAW,EACX,KAAAC,YAAa,EACb,KAAAX,cAA0B,GAS1B,KAAAY,eAA2B,GAG3B,KAAAC,UAAW,EAOZ,sBACL,MAAM/yC,EAAQ67B,GAAA,EAAWmX,SAAW,IAAMnX,GAAA,EAAWmX,QAAU,IAAMxvB,EAAA,EAAWosB,OAAOK,KAAKjwC,MAC5FV,KAAK2zC,WAAajzC,EApLH,EAoLwBV,KAAK4zC,YAAc,KAGrD,qBACL,IAAI5zC,KAAK2zC,WAAY,OACAxrC,MAAMC,KAAKlI,SAAS4P,iBAAiB,0BAC7CxJ,QAAQksC,IACnBA,EAAYqB,SAASvtC,QAAQ,CAACie,EAAKlgB,KAEjCmuC,EAAYsB,gBAAgBzvC,EAAK,OAKhC,SAID6tC,KACFA,GAAmBhyC,SAASuvC,eAAe,aAAuCsE,iBAElF,GAAYd,gBAGd,MAAMe,EAASh0C,KAAKoE,QAAQ0O,MAAM69B,KAAKxhC,IACjC,KAACwhC,EAAI,QAAE7S,GAAW,KAAgB8S,QAAQoD,GAUhD,IAAIC,EANDj0C,KAAKoE,QAAQkT,OAAOC,cACrBvX,KAAKI,UAAUC,IAAI,iBAMlBswC,EAAKr5B,SACNtX,KAAKszC,WAAa3C,EAAKr5B,OAAO48B,cAC9Bl0C,KAAKozC,SAAWzC,EAAKr5B,OAAOu5B,KAC5B7wC,KAAKyyC,WAAa9B,EAAKr5B,OAAOo7B,OAC9B1yC,KAAKuzC,aAAe5C,EAAKr5B,OAAO68B,gBAE7Bn0C,KAAKyyC,UACNwB,EAAU,wBACVj0C,KAAKI,UAAUC,IAAI,cAEnB4zC,EADQj0C,KAAKozC,OACHpzC,KAAKszC,SAAW,sBAAwB,+BAExCtzC,KAAKszC,SAAW,wBAA0B,4BAIxDtzC,KAAKI,UAAUkM,OAAO,cAAetM,KAAKuzC,YAE1C,MAAMa,EAAiBp0C,KAAKuzC,WAAa,yDAA2D,GAC9F3B,EAAQjB,EAAKS,QAAQ3oC,IAAI,CAAC0oC,EAAQ9sC,IAC/B,kDACkCA,4PAMjC+vC,oHAG4B,IAAkB3nB,cAAc0kB,EAAOj0B,kWAO1EyK,KAAK,IAkBR,GAhBA3nB,KAAKiE,UAAY,mCACW0sC,EAAKG,wJAK7Bc,IAEJ5xC,KAAKq0C,QAAUr0C,KAAK6f,kBAAkBqY,mBACtCl4B,KAAKs0C,QAAUt0C,KAAKq0C,QAAQx0B,kBAC5B7f,KAAKu0C,WAAav0C,KAAKq0C,QAAQtC,iBAE5BkC,GACDj0C,KAAKs0C,QAAQvqC,OAAO,eAAKkqC,IAGxBj0C,KAAKozC,SACNpzC,KAAKI,UAAUC,IAAI,WAEhBswC,EAAK6D,cAAgB7D,EAAK8D,YAAY,CACvC,MAAMC,EAAcx0C,SAASC,cAAc,OAC3Cu0C,EAAYt0C,UAAUC,IAAI,aAC1BL,KAAKq0C,QAAQtqC,OAAO2qC,GAEpB,MAAMnwB,EAAMrkB,SAASskB,gBAAgB,6BAA8B,OAEnED,EAAInkB,UAAUC,IAAI,mBAElBL,KAAK20C,UAAYpwB,EAEjB,MAAMqwB,EAAc,EACdC,EAAS,EACTC,EAAgB,EAAIzyC,KAAK0yC,GAAKF,EAE9B5tB,EAAS/mB,SAASskB,gBAAgB,6BAA8B,UACtEyC,EAAO7mB,UAAUC,IAAI,0BACrB4mB,EAAOxC,eAAe,KAAM,KAAM,MAClCwC,EAAOxC,eAAe,KAAM,KAAM,MAClCwC,EAAOxC,eAAe,KAAM,IAAK,GAAKowB,GACtC5tB,EAAOxC,eAAe,KAAM,eAAgB,GAAKmwB,GAEjDrwB,EAAIxa,OAAOkd,GACXjnB,KAAKq0C,QAAQtqC,OAAOwa,GAEpB,MAAMywB,EAA6B,IAApBrE,EAAK6D,aACdS,EAAqE,KAAxDtE,EAAK8D,WAAa,KAAkBS,kBAavDl1C,KAAKm1C,aAAe5pC,OAAOugC,YAAY,KACrC,MAAMsJ,EAAOC,KAAKC,MACZ54B,GAAYu4B,EAAYG,GAAQJ,EAChCO,GAAYN,EAAYG,GAAQ,IAAO,EAAI,EACjDV,EAAYzwC,UAAYwd,OAAO8zB,GAAU7zB,WAErC6zB,GAAY,IACdb,EAAY/xC,MAAM6yC,MAAQ,UAC1BvuB,EAAOtkB,MAAM8yC,OAAS,WAKxBxuB,EAAOtkB,MAAM+yC,iBAAmBZ,EAAgBp4B,EAAWo4B,EAC3D7tB,EAAOtkB,MAAMgzC,gBAAkB,GAAGb,KAAiBA,IAEhDM,GAAQH,IACTW,cAAc51C,KAAKm1C,cACnBT,EAAYzwC,UAAY,GAExBgjB,EAAOtkB,MAAM+yC,iBAAmBZ,EAChC90C,KAAKm1C,aAAe,EAEpB3pC,WAAW,KAET,KAAgBqqC,WAAW71C,KAAKoE,UAC/B,OAEJ,KAIPpE,KAAK81C,WAAa3tC,MAAMC,KAAKpI,KAAK8P,iBAAiB,iBACnD9P,KAAK6zC,SAAW1rC,MAAMC,KAAKpI,KAAK8P,iBAAiB,eACjD9P,KAAK+1C,WAAa5tC,MAAMC,KAAKpI,KAAK8P,iBAAiB,0BAEnD,MAAMkmC,EAAY91C,SAASC,cAAc,OACzC61C,EAAU51C,UAAUC,IAAI,eAExBL,KAAKi2C,YAAc/1C,SAASC,cAAc,OAC1CH,KAAKi2C,YAAYzsC,UAAY,4CAC7BxJ,KAAKi2C,YAAYlsC,OAAO,eAAK,0BAE7B/J,KAAKk2C,eAAiBh2C,SAASC,cAAc,OAC7CH,KAAKk2C,eAAe1sC,UAAY,mBAEhCwsC,EAAUjsC,OAAO/J,KAAKi2C,YAAaj2C,KAAKk2C,gBACxCl2C,KAAK+J,OAAOisC,GAEZh2C,KAAKi2C,YAAYj1C,iBAAiB,QAAUiB,IAC1C,OAAAyb,EAAA,GAAYzb,GAER,GAAgBk0C,YAAY,KAC9B,IAAI,GAAkB,IAAiBplC,KAAK/Q,KAAKoE,WAGrD,OAAAkZ,GAAA,QAAOtd,KAAKi2C,aAETj2C,KAAKuzC,aACNvzC,KAAKo2C,YAAcl2C,SAASC,cAAc,OAC1CH,KAAKo2C,YAAYh2C,UAAUC,IAAI,qBAAsB,kBACrDL,KAAKo2C,YAAYrsC,OAAO,eAAK,yBAC7B,OAAAuT,GAAA,QAAOtd,KAAKo2C,aAERzF,EAAKiC,cAAczwC,QACrBnC,KAAKk2C,eAAe91C,UAAUC,IAAI,QAGpC,YAAiBL,KAAKo2C,YAAcn0C,IAClC,OAAAyb,EAAA,GAAYzb,GAKTjC,KAAKwzC,eAAerxC,QACrBnC,KAAKq2C,UAAUr2C,KAAKwzC,gBAAgB3yC,KAAK,KACvCb,KAAKwzC,eAAerxC,OAAS,EAC7BnC,KAAK81C,WAAWxvC,QAAQyJ,IACtBA,EAAG3P,UAAUuB,OAAO,oBAM5Bq0C,EAAUjsC,OAAO/J,KAAKo2C,cAOxB,MAAME,IAAY3F,EAAKiC,cAAczwC,QAAUnC,KAAKyyC,UAChD6D,IAAWt2C,KAAKszC,UAClBtzC,KAAK2yC,eAAe7U,EAAS6S,EAAKiC,eAAe,GAGhD0D,IACDt2C,KAAKu2C,eAAezY,GACpB,YAAiB99B,KAAMA,KAAKw2C,eAIhC,aAAa1Y,GACX,GAAGA,EAAQ2Y,UAAY3Y,EAAQ4Y,kBAAmB,CAChD,MAAMC,EAAaz2C,SAASC,cAAc,OAgB1C,GAfAw2C,EAAWv2C,UAAUC,IAAI,YAAa,aACtCL,KAAKq0C,QAAQtqC,OAAO4sC,GAGpB,YAAiBA,EAAa10C,IAC5B,OAAAyb,EAAA,GAAYzb,GAGZ00C,EAAWv2C,UAAUC,IAAI,UA9Tb,EAACo2C,EAAkBC,EAA0BvD,KAC5DN,IACDC,GAAaD,GAAcE,GAAoBC,IAGjD,MAAMh+B,EAAU9U,SAASC,cAAc,OACvC6U,EAAQ5U,UAAUC,IAAI,aAEtB,MAAMJ,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAUC,IAAI,YAAa,SAErC,MAAMu2C,EAAS12C,SAASC,cAAc,OACtCy2C,EAAOx2C,UAAUC,IAAI,QAErBJ,EAAU8J,OAAO6sC,GACjB5hC,EAAQjL,OAAO9J,GAEf22C,EAAO3yC,UAAY,IAAkB0oC,aAAa8J,EAAU,CAACI,SAAUH,IACvE,GAAa3pB,KAAKC,QAAQ8pB,iBAAiB/sC,OAAOiL,GAE7CA,EAAQ40B,WACb50B,EAAQ5U,UAAUC,IAAI,UAEtBwyC,GAAe79B,EACf+9B,GAAqBI,EACrBH,GAAsBznC,OAAOC,WAAW,KACtCsnC,GAAa99B,EAASm+B,EAAQH,KAC7B,sBAAqB,IAAO,MAoSzB+D,CAAYjZ,EAAQ2Y,SAAU3Y,EAAQ4Y,kBAAmB,KAEvDC,EAAWv2C,UAAUuB,OAAO,cAI7B3B,KAAKyzC,SAAU,CAChB,MAAMuD,EAAgBlZ,EAAQA,QAAQrtB,KAAK2N,GAAKA,EAAE9G,OAAO2/B,SACtDD,IAAkBA,EAAc1/B,OAAO4/B,QACxCP,EAAW/a,UAMnB,aAAa35B,GACX,MAAM4S,EAAS,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAAQ,eACzC,IAAIA,EACF,OAGF,OAAA6I,EAAA,GAAYzb,GACZ,MAAMk1C,GAAetiC,EAAOzI,QAAQkQ,MACpC,GAAGtc,KAAKuzC,WAAY,CAClB1+B,EAAOzU,UAAUkM,OAAO,cAExB,MAAM8qC,EAAap3C,KAAKwzC,eAAej3B,QAAQ46B,IAC5B,IAAhBC,EACDp3C,KAAKwzC,eAAe/uC,OAAO2yC,EAAY,GAEvCp3C,KAAKwzC,eAAe7tC,KAAKwxC,QAG3Bn3C,KAAKq2C,UAAU,CAACc,IAUpB,UAAUE,GACR,GAAGr3C,KAAKs3C,gBAAiB,OAAOt3C,KAAKs3C,gBAErC,MAAM9uC,EAAUxI,KAAK81C,WAAWluC,OAAO,CAACR,EAAG/C,IAAQgzC,EAAQ3c,SAASr2B,IAOpE,OANAmE,EAAQlC,QAAQuO,IACdA,EAAOzU,UAAUC,IAAI,eAGvBL,KAAKI,UAAUC,IAAI,iBACnBL,KAAKyzC,UAAW,EACTzzC,KAAKs3C,gBAAkB,KAAgBC,SAASv3C,KAAKoE,QAASizC,GAASx2C,KAAK,KACjF2H,EAAQlC,QAAQuO,IACdA,EAAOzU,UAAUuB,OAAO,eAG1B3B,KAAKI,UAAUuB,OAAO,mBACrB6K,MAAM,KACPxM,KAAKyzC,UAAW,IACfxyB,QAAQ,KACTjhB,KAAKs3C,gBAAkB,OAI3B,eAAexZ,EAAsB8U,EAAyBxjC,GAAU,G,QAKtE,GAJIxG,EAAA,QAAUo2B,SAASC,oBACrB7vB,GAAU,GAGTpP,KAAKozC,UAA0B,QAAf,EAAAtV,EAAQA,eAAO,eAAE37B,SAAUnC,KAAKyyC,UAAW,CAC5DzyC,KAAK81C,WAAWxvC,QAAQ,CAACyJ,EAAI1L,KAC3B0L,EAAG3P,UAAUkM,OAAO,eAAgBwxB,EAAQA,QAAQz5B,GAAKiT,OAAO2/B,WAG/Dj3C,KAAKw3C,eACNx3C,KAAKw3C,aAAa1Z,GAClB99B,KAAKw3C,aAAe,MAGnBx3C,KAAKm1C,eACNS,cAAc51C,KAAKm1C,cACnBn1C,KAAKm1C,aAAe,IAGL,QAAd,EAAAn1C,KAAK20C,iBAAS,eAAE7jC,gBACjB9Q,KAAK20C,UAAUhzC,SAGjB,MAAM81C,EAASz3C,KAAKq0C,QAAQxkC,cAAc,cACvC4nC,GACDA,EAAO91C,SAsBX,GAlBG3B,KAAKyyC,WACNzyC,KAAKI,UAAUC,IAAI,aACnB,OAAAkM,EAAA,GAAevM,KAAKs0C,QAAS,eAAK,4BAIjCt0C,KAAK4yC,cAAczwC,SAAWywC,EAAczwC,QAAUnC,KAAKyyC,YAC5DzyC,KAAKqzC,YAAcrzC,KAAK4yC,cAAczwC,SAAWywC,EAAczwC,OAC/DnC,KAAK4yC,cAAgBA,EAAcnvC,QAEhCzD,KAAKqzC,YACN,YAAiBrzC,KAAMA,KAAKw2C,cAE5B,YAAiBx2C,KAAMA,KAAKw2C,eAK7Bx2C,KAAK4yC,cAAczwC,QAAUnC,KAAKqzC,aAAerzC,KAAKyyC,SAAU,CACjE,MAAM/1B,EAAWohB,EAAQA,QAAQr1B,IAAI03B,GAAKrC,EAAQkT,aAAe7Q,EAAE4Q,OAASjT,EAAQkT,aAAe,IAAM,GAEzGhxC,KAAKI,UAAUkM,OAAO,iBAAkB8C,GACrCA,GACD,aAAcpP,KAAM,IAAKA,KAAKqzC,YAAa,KAG7C,aAAQ,KACNrzC,KAAK03C,WAAW13C,KAAKqzC,YAAcrzC,KAAK0c,SAAWA,EAAU1c,KAAK4yC,cAAexjC,GACjFpP,KAAK0c,SAAWA,EAChB1c,KAAKqzC,aAAc,IAMvB,GAFArzC,KAAKu2C,eAAezY,GAEjB99B,KAAKszC,SAAU,CACZtzC,KAAKuzC,aACPvzC,KAAKi2C,YAAY71C,UAAUkM,OAAO,QAASwxB,EAAQkT,eAAiBhxC,KAAK4yC,cAAczwC,QACvFnC,KAAKk2C,eAAe91C,UAAUkM,OAAO,SAAUtM,KAAK4yC,cAAczwC,SAGpE,IAAI6B,EAAO,GAMX85B,EAAQ6Z,cAAsCrxC,QAAQ,CAAC8L,EAAQ/N,KAE7DL,GAAQ,kEAAkEoO,MADpD,IAAR/N,EAAY,GAAK,iCAAuC,EAANA,+BAGlErE,KAAKu0C,WAAWtwC,UAAYD,EAG9B,GAAGhE,KAAKuzC,WAAY,CAClB,MAAMqE,IAAY53C,KAAK4yC,cAAczwC,OAE/B01C,EAAkB73C,KAAKyyC,UAAYmF,EACnCE,GAAsB93C,KAAKszC,WAAaxV,EAAQkT,eAAkB4G,IAAY53C,KAAKyyC,SACzFzyC,KAAKo2C,YAAYh2C,UAAUkM,OAAO,OAAQurC,GAC1C73C,KAAKi2C,YAAY71C,UAAUkM,OAAO,OAAQwrC,GAC1C93C,KAAKk2C,eAAe91C,UAAUkM,OAAO,QAASurC,IAAoBC,IAItE,WAAWp7B,EAAoBk2B,EAAyBxjC,GACtDpP,KAAK6zC,SAASvtC,QAAQie,GAAOA,EAAI5hB,MAAMC,QAAU,IAEjD5C,KAAK81C,WAAWxvC,QAAQ,CAACyJ,EAAI1L,KAC3B0L,EAAG3P,UAAUkM,OAAO,YAAasmC,EAAclY,SAASr2B,MAG1D,MAAMmhB,EAAWnjB,KAAKP,OAAO4a,GAK7B,GAHA1c,KAAK+3C,YAAcr7B,EAASjU,IAAIkvB,GAAKA,EAAInS,GAGtCxlB,KAAKqzC,YACNrzC,KAAK6zC,SAASvtC,QAAQ,CAACie,EAAKlgB,KAC1BrE,KAAK8zC,gBAAgBzvC,GAAM,SAExB,CACL,MAAM2zC,EAAK,KACTh4C,KAAK6zC,SAASvtC,QAAQ,CAACie,EAAKlgB,KAE1BrE,KAAK8zC,gBAAgBzvC,EAAK,MAI9B+K,EAAU,aAAQ4oC,GAAMA,IAK1B,IAAIC,EAFJv7B,EAAWA,EAASjZ,QACpBwtC,GAAcv0B,GAEd,MAAMw7B,EAAWltC,IACf0R,EAASpW,QAAQ,CAACoW,EAAUrY,KAC1B,MAAMnC,EAAQ+1C,EAAgBv7B,EAAU1R,GACxChL,KAAK+1C,WAAW1xC,GAAK6lB,UAAYhoB,EAAQ,OAI7C,GAAGlC,KAAKqzC,YAGN,GAFA4E,EAAkB,CAACv7B,EAAUJ,IAAUja,KAAKE,MAAMma,EAjnB1C,GAinB6DJ,GAElElN,EACD,IAAI,IAAIpE,EAAI,EAAaqnC,EAAI,EAAGrnC,GAAK,IAAKA,IAAKqnC,EAC7C7mC,WAAW,KACT0sC,EAAQltC,IApnBJmtC,GAqnBO9F,QAGf6F,EAAQ,QAKV,GAFAD,EAAkB,CAACv7B,EAAUJ,IAAUja,KAAKE,MAAMma,EA7nB1C,IA6nB8DJ,EAAQ,IAE3ElN,EACD,IAAI,IAAIpE,EAAI,EAAGA,EAhoBT,KAgoBsBA,EAC1BQ,WAAW,KACT0sC,EAAQltC,IAhoBJmtC,GAioBOntC,QAGfktC,EAAQE,GAIZ,GAAGp4C,KAAKqzC,YAAa,CAChBjkC,GACDpP,KAAKI,UAAUC,IAAI,iBAGrBL,KAAKI,UAAUuB,OAAO,YACtB,MAAMq2C,EAAK,KACTh4C,KAAK6zC,SAASvtC,QAAQie,GAAOA,EAAI5hB,MAAMC,QAAU,SAGhDwM,EACD5D,WAAW,KACTxL,KAAKI,UAAUuB,OAAO,iBACtBq2C,KAtpBO,KAypBTA,SAGFh4C,KAAKI,UAAUC,IAAI,YAIvB,eAAey9B,GACb,MAAMua,EAAcva,EAAQkT,cAAgB,EAC5C,IAAIziC,EAAkBN,EAAO,CAACoqC,GAEZ9pC,EADfvO,KAAKyyC,SACHzyC,KAAKozC,OAAciF,EAAc,uBAAyB,kCAClDA,EAAc,wBAA0B,kCAEhDr4C,KAAKozC,OAAciF,EAAc,uBAAyB,4BAClDA,EAAc,wBAA0B,4BAGrD,OAAA9rC,EAAA,GAAevM,KAAKk2C,eAAgB,eAAK3nC,EAAKN,IAGhD,gBAAgBqO,EAAeg8B,GAC7B,MAAM/zB,EAAMvkB,KAAK6zC,SAASv3B,IAEP,IAAhBg8B,GACD/zB,EAAI5hB,MAAMgzC,gBAAkB,GAC5BpxB,EAAI5hB,MAAM+yC,iBAAmB,KAG7BnxB,EAAI5hB,MAAMgzC,gBAAmB2C,EAAat4C,KAAK+3C,YAAYz7B,GAAS,GAAYq3B,WAAc,UAE9FpvB,EAAI5hB,MAAM+yC,iBAAmB,GAAK4C,EAAa,GAAY1E,aA/iBjD,GAAAA,YAAc,KACd,GAAAD,WAAa,EAqjB7B3nB,eAAeC,OAAO,eAAgB,I,0VC1UtC,MAAM,GAAqB,IAtXpB,MAUL,cATQ,KAAApjB,QAAU,IAAI,KAAoE,KAAgB,eAElG,KAAA0vC,sBAAsE,GACtE,KAAAC,+BAA4E,GAOlFx4C,KAAKy4C,6BAEL7vC,EAAA,QAAU8vC,2BAA2B,CACnCC,oBAAsBhX,IACpB3hC,KAAK44C,eAAejX,EAAOkX,WAAYlX,EAAOkX,WAAWlkC,IAAIxF,IAC7DvG,EAAA,QAAU6F,cAAc,qBAAsBkzB,EAAOkX,WAAWlkC,QAIpE3U,KAAK84C,2BAA6BvtC,OAAOC,WAAW,KAClDxL,KAAK84C,gCAA6Bp0C,EAClC1E,KAAK+4C,oBAAmB,IACvB,KAGE,mBAAmBC,GAAc,GActC,OAbGh5C,KAAK84C,6BACN9rC,aAAahN,KAAK84C,4BAClB94C,KAAK84C,gCAA6Bp0C,GAGhC1E,KAAKi5C,6BACPj5C,KAAKi5C,2BAA6Bj5C,KAAKk5C,sBAAsB,QAAQ,GAAOr4C,KAAKs4C,IAC/E,IAAIA,EAAKh3C,OAAQ,KAAM,cACvBnC,KAAKo5C,iBAAmBD,EAAK11C,QAC7BzD,KAAKo5C,iBAAiB/wC,KAAK,CAACC,EAAGC,IAAMlG,KAAKg2B,SAAWh2B,KAAKg2B,aAIvDr4B,KAAKi5C,2BAA2Bp4C,KAAK,KAC1C,IAAIoT,EAQJ,OAPI+kC,IACF/kC,EAAMjU,KAAKo5C,iBAAiBxzC,QAC5B5F,KAAKo5C,iBAAiBzzC,KAAKsO,IAG7B,IAAe8D,YAAY/X,KAAKo5C,iBAAiB,IAE1CnlC,IAIJ,aAAaklC,GAClB,YAAeA,EAAM,CAACllC,EAAK5P,MACzB4P,EAAM,IAAeolC,QAAQplC,IAGxBklC,EAAK90C,GAAO4P,EADRklC,EAAK10C,OAAOJ,EAAK,KAKjB,cAAcsQ,EAAwB2kC,EAI9C,I,0CACH,MAAMnqC,EAAKwF,EAAIxF,GACf,OAAGnP,KAAKu4C,sBAAsBppC,GACrBnP,KAAKu4C,sBAAsBppC,GAG7BnP,KAAKu4C,sBAAsBppC,GAAM,IAAItM,QAAcoD,GAAY,mC,MACpE,IAAIqzC,EAAOC,UAAW,CACpB,MAAMC,QAAkBx5C,KAAK6I,QAAQmH,IAAIb,GACzC,GAAGqqC,IAAgC,QAAnB,EAAAA,EAAUC,iBAAS,eAAEt3C,UAAYkzC,KAAKC,MAAQkE,EAAUE,YAlF7D,MAkF0FJ,EAAOK,UAI1G,OAHA35C,KAAK45C,aAAaJ,EAAUC,WAC5BxzC,EAAQuzC,eACDx5C,KAAKu4C,sBAAsBppC,GAKtC,IACE,MAAM0qC,QAAmB,KAAWnjB,UAAU,yBAA0B,CACtEmiB,WAAY74C,KAAK85C,mBAAmBnlC,KAGhColC,EAAWT,EAAOS,SAAW5qC,EAAK0qC,EAAWllC,IAAIxF,GACvDnP,KAAK44C,eAAeiB,EAAYE,GAEhC9zC,EAAQ4zC,GACR,MAAMptC,GACNxG,EAAQ,aAGHjG,KAAKu4C,sBAAsBppC,UAI/B,6BACL,OAAOnP,KAAKg6C,cAAc,CAAC7qC,GAAI,SAAU,CAAC4qC,UAAU,IAGzC,oB,0CAGX,MAAMruC,QAAY,KAAWuuC,kBAAkB,8BAI/C,OAFAj6C,KAAK45C,aAAaluC,EAAIwuC,UAEfxuC,KAGF,wBAAwByuC,GAC7B,MAAMN,EAAa75C,KAAK6I,QAAQuxC,aAAa,SAC7C,IAAIP,IAAeA,EAAWJ,UAAW,OAEzCU,EAAQA,EAAM32C,QAAQ,UAAW,IAAIA,QAAQ,kBAAmB,IAChE,MAAM62C,EAAOR,EAAWS,MAAM7pC,KAAKknB,GAAKA,EAAE4iB,WAAaJ,GACvD,OAAOE,EAAO,IAAenmC,OAAOmmC,EAAKZ,UAAU,SAAM/0C,EAGpD,4BAA4By1C,EAAez5C,EAAgBC,GAChE,OAAOX,KAAKy4C,6BAA6B53C,KAAK,KAC5C,MAAMoT,EAAMjU,KAAKw6C,wBAAwBL,GACzC,GAAGlmC,EACD,OAAO,IAAe8D,YAAY9D,GACjCpT,KAAK,MACLA,KAAW45C,GAAS,mCACnB,MAAMC,EAAYx2B,EAAA,EAAWosB,OAAOqK,aAC9BC,EAAY,aAAkBT,GAC9Bp5C,QAAkB85C,GAAA,EAAaC,oBAAoB,CACvD76C,eAAWyE,EACXq2C,cAAeN,EACf/5C,MAAOA,UAASg6C,EAAUh6C,MAC1BC,OAAQA,UAAU+5C,EAAU/5C,QAC3B,OAAQi6C,GAEX75C,EAAUC,iBAAiB,aAAc,KACvC,IAAeg6C,kBAAkB/mC,EAAKlT,EAAU2B,OAAQk4C,GACxD75C,EAAUY,UACT,CAACgW,MAAM,UAMX,eAAejM,EAAuDyD,GAG3E,MAAM8rC,EAA6B,CACjC7zC,EAAG,sBACHuN,IAAKjJ,EAAIiJ,IACT2lC,MAAO5uC,EAAI4uC,MACXb,UAAW/tC,EAAI+tC,WAGjB,IAAII,EAAa75C,KAAK6I,QAAQuxC,aAAajrC,GACxC0qC,EACD7iC,OAAOkkC,OAAOrB,EAAYoB,GAE1BpB,EAAa75C,KAAK6I,QAAQsyC,WAAWhsC,EAAI8rC,GAG3Cj7C,KAAK45C,aAAaluC,EAAI+tC,WAGtB,MAAM2B,EAAWvB,EAAWllC,IAAI0mC,gBAAyB,UAAPlsC,EAClD0qC,EAAWH,YAAcrE,KAAKC,MAC9Bt1C,KAAK6I,QAAQ8L,IAAI,CAAC,CAACxF,GAAK0qC,IAAcuB,GAGjC,kCAAkCvB,G,MACvC,MAAMhvB,EAAQgvB,EAAWzhC,OAAO3H,KAAKoa,GAAqB,cAAZA,EAAMzjB,GAC9Ck0C,EAAOzB,EAAW0B,YAElBC,EAA8B,QAAjB,EAAA3B,EAAWviC,cAAM,eAAEmkC,SAQtC,MAAO,CAACH,OAAMI,SANwC,CACpDt0C,EAAG,uBACHyxC,WAAY74C,KAAK85C,mBAAmBD,GACpC8B,cAAe9B,EAAW8B,eAGG77C,KAAM+qB,EAAM/qB,KAAM87C,SAAUJ,EAAa,0BAA4B,cAsB/F,mBAAmB7mC,GACxB,MAAc,UAAXA,EAAIxF,GACE,CACL/H,EAAG,gCAEIuN,EAAIknC,YAMN,CACLz0C,EAAG,oBACH+H,GAAIwF,EAAIxF,GACR0sC,YAAalnC,EAAIknC,aARZ,CACLz0C,EAAG,2BACH00C,WAAY,GAAKnnC,EAAIxF,IAWd,sB,0CACX,MAAMzD,QAAY,KAAWuuC,kBAAkB,gCAM/C,OAJAvuC,EAAIqwC,KAAKz1C,QAAQ01C,IACfh8C,KAAK44C,eAAe,CAACjkC,IAAKqnC,EAAQrnC,IAAK8kC,UAAW,GAAIa,MAAO,IAAK0B,EAAQrnC,IAAIxF,MAGzEzD,EAAIqwC,QAGA,iBAAiBpnC,G,0CAC5B,GAAGA,EAAI0mC,eAAgB,CAKrB,SAJkB,KAAW3kB,UAAU,+BAAgC,CACrEmiB,WAAY74C,KAAK85C,mBAAmBnlC,KAOpC,cAHOA,EAAI0mC,eACXzyC,EAAA,QAAU6F,cAAc,mBAAoBkG,GAC5C3U,KAAK6I,QAAQwF,OAAOsG,EAAIxF,IAAI,IACrB,MAEJ,CAML,SALkB,KAAWunB,UAAU,6BAA8B,CACnEmiB,WAAY74C,KAAK85C,mBAAmBnlC,GACpC0nB,UAAU,IAMV,OAFA1nB,EAAI0mC,eAAiBhG,KAAKC,MAAQ,IAAO,EACzC1sC,EAAA,QAAU6F,cAAc,qBAAsBkG,IACvC,EAIX,OAAO,KAGI,kBAAkB/J,EAAeqxC,GAAkB,G,0CAC9D,MAAM7b,EAAQ6b,EAAkB,EAAI,EAC9BvwC,QAAY,KAAWuuC,kBAAkB,6BAA8B,CAC3E7Z,QACA8b,iBAAkBD,QAAmBv3C,EACrCu5B,EAAGrzB,IAGLc,EAAIqwC,KAAKz1C,QAAQ01C,IACfh8C,KAAK44C,eAAe,CAACjkC,IAAKqnC,EAAQrnC,IAAK8kC,UAAW,GAAIa,MAAO,IAAK0B,EAAQrnC,IAAIxF,MAGhF,MAAMgtC,EAAkC,GAClCC,EAAQp8C,KAAK6I,QAAQwzC,WAC3B,IAAI,IAAIltC,KAAMitC,EAAO,CACnB,MAAM,IAACznC,GAAOynC,EAAMjtC,GAEjBwF,EAAI/G,MAAM0uC,cAAc5hB,SAAS9vB,EAAM0xC,iBAAmB5wC,EAAIqwC,KAAKtrC,KAAKkjB,GAAKA,EAAEhf,IAAIxF,KAAOwF,EAAIxF,KAC/FgtC,EAAWx2C,KAAK,CAACyB,EAAG,oBAAqBuN,MAAK4nC,MAAO,OAIzD,OAAO7wC,EAAIqwC,KAAKn4C,OAAOu4C,MAGlB,iBACL,OAAO,KAAWlC,kBAAkB,2BAG/B,qBACL,OAAOj6C,KAAKw8C,iBAAiB37C,KAAK47C,GACzB55C,QAAQC,IAAK25C,EAAwDV,KAAKtzC,IAAIkM,GAAO3U,KAAKg6C,cAAcrlC,EAAK,CAACglC,UAAU,OAK5H,sBAAsBY,EAAkBmC,GAAqB,GAElE,OADAnC,EAAW,IAAkBoC,SAASpC,GACnCv6C,KAAKw4C,+BAA+B+B,GAAkBv6C,KAAKw4C,+BAA+B+B,GAEtFv6C,KAAKw4C,+BAA+B+B,GAAY13C,QAAQC,IAAI,CACjE,KAAWm3C,kBAAkB,uBAAwB,CACnDM,aAEFmC,EAAqB18C,KAAK48C,qBAAuB,GACjDF,EAAqB18C,KAAK68C,yBAAsBn4C,IAC/C7D,KAAK,EAAEi8C,EAAkBC,EAAeC,MACzC,MAAMC,EAAiBH,EAAuD5C,SAASzxC,IAAIy0C,GAAW,IAAe7D,QAAQ6D,IACvHC,EAA8C,GAAIC,EAA4C,GAI9FC,EAAgB/C,IACpB,IAAI,MAAMD,KAAQC,EAAO,CAEvB,GADqB,IAAkBqC,SAAStC,EAAKE,UACrC7f,SAAS6f,GACvB,IAAI,MAAMpmC,KAASkmC,EAAKZ,UAAW,CACjC,MAAMxlC,EAAM,IAAeC,OAAOC,IACjCF,EAAIwnC,SAAW0B,EAAyBC,GAAsBz3C,KAAKsO,MAM5E,GAAG+oC,EAAgB,CACjBK,EAAaL,EAAe1C,OAC5B,MAAMJ,EAAW8C,EAAe9C,SAChC,CAACiD,EAAwBC,GAAsB92C,QAAQuP,IACrDA,EAAExN,KAAK,CAACC,EAAGC,IAAM2xC,EAAS39B,QAAQjU,GAAK4xC,EAAS39B,QAAQhU,MAI5D,IAAI,MAAMoM,KAAOooC,EACfM,EAAa1oC,EAAI2lC,OAiBnB,MAFiB,IAAI,IAAIz2C,IAAIs5C,EAAuBv5C,OAAOw5C,EAAsBH,OAM9E,kBAAkBhpC,GACvB,MAAMqpC,EAAc,IAAkBX,SAAS1oC,EAAIspC,iBACnD,IAAI,MAAMhD,KAAYv6C,KAAKw4C,+BAAgC,CACzCx4C,KAAKw4C,+BAA+B+B,GAC5C15C,KAAKq5C,IACX,MAAMsD,EAAOtD,EAASrd,cAAc2gB,GAAQA,EAAKruC,KAAO8E,EAAI9E,IACzDquC,EACDtD,EAASr0C,QAAQ23C,GACTjD,EAAS7f,SAAS4iB,IAC1BpD,EAASr0C,QAAQoO,QAQ3B,KAAewpC,mBAAqB,GACrB,U,8UC9Vf,IAAIC,GAA0B,EAuBvB,SAASC,IAAU,IAAC1pC,EAAG,UAAEhU,EAAS,QAAEmE,EAAO,SAAEmmB,EAAQ,UAAEC,EAAS,SAAEozB,EAAQ,MAAEC,EAAK,WAAEjxB,EAAU,cAAEjC,EAAa,OAAEmzB,EAAM,MAAE1wB,EAAK,YAAE2wB,EAAW,iBAAErzB,EAAgB,aAAED,EAAY,aAAEuzB,EAAY,eAAE/yB,EAAc,KAAEnrB,EAAI,cAAEkH,I,QAoBnN,MAAMi3C,IAAgB1zB,GAAYC,GAC5B0zB,GAA4B,UAAbjqC,EAAI9Q,MAAqB8Q,EAAInU,MA9CpB,WA8CwDm+C,KACnE,QAAbhqC,EAAI9Q,KAAiByF,EAAA,QAAUo2B,SAASmf,SAASC,KAAOx1C,EAAA,QAAUo2B,SAASmf,SAASE,QAC1F,IAAIC,EAAuBC,EAE3B,IAAIT,EAAQ,CACVQ,EAAWp+C,SAASC,cAAc,QAClCm+C,EAASl+C,UAAUC,IAAI,cACvBJ,EAAU8J,OAAOu0C,GAEjB,IAAIE,GAAiB,EACL,QAAbvqC,EAAI9Q,MACLm7C,EAASp0B,WAAajW,EAAIJ,SAAW,IAAI6N,UAAS,GAE9Cs8B,GAA6B,UAAb/pC,EAAI9Q,OACnB+6C,IAAgBjzB,EACjBqzB,EAASl+C,UAAUC,IAAI,QAAS,gBAEhCm+C,GAAiB,KAIrBF,EAASp0B,UAAY,MAEjBg0B,GAAgBF,IAClBQ,GAAiB,EACjBvzB,OAAiBvmB,IAIlB85C,IACDD,EAAWr+C,SAASC,cAAc,QAClCo+C,EAASn+C,UAAUC,IAAI,aAAc,kBAAmB,aAAc,mBACtEJ,EAAU8J,OAAOw0C,IAIrB,IAgCIz3B,EAhCApb,EAGA,GAEJ,GAAqB,cAAlBuI,EAAIwqC,UAA2B,CAChC,MAAMC,EAAWp0B,GAAU,CACzB9lB,MAAOyP,EACP7P,UACAnE,YACAsqB,WACAC,YACAozB,WACAC,QACAlzB,gBACAiC,aACAlC,mBACAD,eACAQ,iBACAnrB,SAKF,OAFA4L,EAAImf,MAAQ6zB,EACZhzC,EAAIpL,YAAco+C,EAASj0B,aAAaK,KACjCpf,EAUT,MAAMoU,EAAQ5f,SAASC,cAAc,SAIrC,GAHA2f,EAAM1f,UAAUC,IAAI,eACpByf,EAAM1c,aAAa,cAAe,QAClC0c,EAAM3I,OAAQ,EACE,UAAblD,EAAI9Q,KAAkB,CACvB,MAAMw7C,EAAWz+C,SAASC,cAAc,OACxCw+C,EAASv+C,UAAUC,IAAI,cAAe,aACtCs+C,EAASvyC,QAAQvF,IAAM,GAAKzC,EAAQyC,IACpC83C,EAASvyC,QAAQnF,OAAS,GAAK7C,EAAQ6C,OACtC03C,EAAiBv6C,QAAUA,EAE5B,MAAMtE,EAAOokB,EAAA,EAAWosB,OAAO/tC,MACzBq8C,EAAW9+C,EAAKY,MAAQ,EACxBk0C,EAAc,IACdC,EAAS+J,EAA0B,EAAdhK,EAC3B+J,EAAS16C,UAAY,qCAAqCnE,EAAKY,kBAAkBZ,EAAKY,6IACMk0C,UAAoBgK,UAAiBA,SAAgB/J,sCAGjJ,MAAM5tB,EAAS03B,EAAS9+B,kBAAkBA,kBACtC69B,KACFA,GAA0B,EAAIr7C,KAAK0yC,GAAKF,GAE1C5tB,EAAOtkB,MAAMgzC,gBAAkB+H,GAA0B,IAAMA,GAC/Dz2B,EAAOtkB,MAAM+yC,iBAAmB,GAAKgI,GAErCY,EAASl+C,UAAUC,IAAI,SAEN+D,EAAQkT,OAAOE,cAE9BmnC,EAASv+C,UAAUC,IAAI,aAGzB,MAAMqC,EAASxC,SAASC,cAAc,UACtCuC,EAAOhC,MAAQgC,EAAO/B,OAASsT,EAAI4D,EAEnC8mC,EAAS//B,QAAQlc,EAAQ47C,GACzBK,EAAS50C,OAAO+V,GAChB7f,EAAU8J,OAAO40C,GAEjB,MAAME,EAAMn8C,EAAOsO,WAAW,MAKxB6Y,EAAS,KACb,MAAMzlB,EAA4Bu6C,EAAiBv6C,QAC7C06C,EAAc,GAA2BnlC,SAASvV,GAAU6mB,GAC5D9gB,EAAQ,MACX,GAAa4iB,KAAKgyB,gBAAkBl8C,QAAQoD,WAAWgb,QAAQ,KAC3D,OAAA+9B,GAAA,GAAQF,KAIXA,EAAYz1C,oBAAoB,OAAQuL,GACxCkqC,EAAYz1C,oBAAoB,aAAc+c,GAC9C04B,EAAYz1C,oBAAoB,QAAS41C,GACzCH,EAAYz1C,oBAAoB,QAASoM,OAIvCypC,EAAU,KACdL,EAAIM,UAAUL,EAAa,EAAG,GAE9B,MAAMzuB,EAASqtB,GAA0BoB,EAAYprC,YAAcorC,EAAYjrC,SAAW6pC,GAG1F,OAFAz2B,EAAOtkB,MAAM+yC,iBAAmB,GAAKrlB,GAE7ByuB,EAAYnpC,QAGhB6I,EAAe,KACfsgC,EAAYjrC,WAIZ,OAAAmrC,GAAA,GAAQF,IAKTA,EAAYnpC,QACbupC,IAGFZ,EAASp0B,WAAa40B,EAAYjrC,SAAWirC,EAAYprC,YAAc,IAAIgO,UAAS,IARlFvX,MAWEic,EAAsB5C,GAAgBhF,GAEtC5J,EAAS,KACbkL,EAAM1f,UAAUC,IAAI,QACpBs+C,EAASv+C,UAAUuB,OAAO,aAC1B,aAAcu9C,EAASx8C,GAEpBokB,GAAaA,EAAUA,WAAaA,EAAUA,UAAU1mB,UAAUuR,SAAS,WAC5EmV,EAAU3J,WAIR8hC,EAAW,KACX,OAAAD,GAAA,GAAQF,GAKZH,EAASv+C,UAAUC,IAAI,aAJrB8J,KAOEsL,EAAU,KACdqK,EAAM1f,UAAUuB,OAAO,QACvBg9C,EAASv+C,UAAUC,IAAI,aAEvByf,EAAMpM,YAAc,EACpB4qC,EAASp0B,WAAa,GAAK40B,EAAYjrC,UAAU6N,UAAS,GAEvDo9B,EAAYprC,cACborC,EAAYprC,YAAc,IAI9BorC,EAAY99C,iBAAiB,OAAQ4T,GACrCkqC,EAAY99C,iBAAiB,aAAcolB,GAC3C04B,EAAY99C,iBAAiB,QAASi+C,GACtCH,EAAY99C,iBAAiB,QAASyU,GAEtC,YAAiB/S,EAAST,IAaxB,GAZA,OAAAyb,EAAA,GAAYzb,GAGT6kB,IAAcA,EAAUs4B,UACzBt4B,EAAU3J,UAQT2hC,EAAYnpC,OAAQ,CACrB,MAAMwU,IAAqBnjB,EAC3B,GAAG,GAA2B4S,iBAAiB5S,GAAiB,CAC9DC,OAAQ,KACRE,YAAa,CAACC,EAAG,4BACjB+B,WAAW,IACT,CACF,MAAOuQ,EAAM7U,GAASslB,EAAwB/C,GAAiBu3B,GAAtB,GACzC,GAA2BtpC,WAAW,CAACpO,OAAQ7C,EAAQ6C,OAAQJ,IAAKzC,EAAQyC,KAAM6S,EAAM7U,GAG1Fi6C,EAAYr9C,YAEZq9C,EAAY19C,UAIb09C,EAAYnpC,OACVmpC,EAAYjrC,UAAYirC,EAAYprC,cAAgBorC,EAAYjrC,UAAYirC,EAAYprC,YAAc,GACvGwrC,IACA1gC,IACAsB,EAAM1f,UAAUC,IAAI,SAEpB4+C,IAGFrqC,KAIDxQ,EAAQkT,OAAO+Q,aACfs2B,EAAiB90B,OAASA,EAC3B80B,EAASvyC,QAAQgc,WAAa,KAE9ByB,SAGF/J,EAAMrf,UAAW,EAGnB,IAAIi+C,EACJ,GAAGt6C,EAAS,CAmBV,GAlBAs6C,EAAWp0B,GAAU,CACnB9lB,MAAOyP,EACP7P,UACAnE,YACAsqB,WACAC,YACAozB,WACAC,QACAlzB,gBACAiC,aACAlC,kBAAkB,EAClBD,eACAQ,iBACAnrB,SAGF4L,EAAImf,MAAQ6zB,GAEPR,GAA4B,QAAbjqC,EAAI9Q,MAAmB46C,EAEzC,OADAryC,EAAIpL,YAAco+C,EAASj0B,aAAaK,KACjCpf,EAGT,GAAGkyC,EAAU,CACX,MAAMyB,GAAiBX,EAAS9zB,OAAOC,OAAS6zB,EAAS9zB,OAAOE,MAAMha,cACtEgP,EAAMpf,OAAS2+C,EAAcC,eAAe,KAAM,SAClDx/B,EAAMnf,QAAU0+C,EAAcC,eAAe,KAAM,UACnDD,EAAct1C,OAAO+V,QAElB,CACL,MAAMy/B,EAAW,IAAeC,SAASvrC,GAAK,GAC3CsrC,GACDA,EAASp5C,QAAQtF,KAAK,KACpBif,EAAM2/B,OAASF,EAASjrC,aAAaI,OAKvCoL,EAAMhP,eAAiB7Q,KACxBy+C,aAAQ,EAARA,EAAUgB,WAAYz/C,GAAW8J,OAAO+V,GAG3C,MAAMxL,EAAeC,GAAA,EAAmBC,gBAAgBP,GAElD0rC,KAAoC,QAAvB,EAACv7C,aAAO,EAAPA,EAAS0O,aAAa,eAAEgU,WACzC64B,GACD74B,EAAa1iB,EAAQ0O,MAAcgU,UACnCA,EAAUkE,OAAO/qB,GAAW,GAC5BgrB,OAAiBvmB,GACR4P,EAAasrC,YAAe3rC,EAAIG,kBAIjCH,EAAIG,oBACZ0S,EAAY,IAAI,KAAqB,CACnCC,YAAY,EACZ84B,aAAc,aANhB/4B,EAAY,IAAI,KAAqB,CACnC+4B,aAAc,YASlB,MAAMC,EAAiB,eACvBhgC,EAAM9e,iBAAiB,QAAUiB,IACP,IAArB6d,EAAMnT,MAAMsV,MACbvV,QAAQC,MAAM,SAAWmT,EAAMnT,MAAMsV,KAAO,cAAgBnC,EAAMnT,MAAMvI,SAGvE0iB,IAAc64B,GACf74B,EAAUi5B,SAGRD,EAAeE,aACjBF,EAAe75C,WAEhB,CAAC0R,MAAM,IAEV,aAAYmI,GAAOjf,KAAK,KACnBusB,GACD6yB,EAAA,EAAqBC,aAAapgC,EAAOsN,GAGxCtG,IAAc64B,GACf74B,EAAUi5B,SAGZD,EAAe75C,YAGD,UAAbgO,EAAI9Q,MACL2c,EAAM9e,iBAAiB,aAAc,KACnCs9C,EAASp0B,WAAapK,EAAMjM,SAAWiM,EAAMpM,YAAc,IAAIgO,UAAS,KAI5E5B,EAAM3I,OAAQ,EACd2I,EAAMtf,MAAO,EAEbsf,EAAMrf,UAAW,EAEjB,IAAI0/C,EAAqBl1B,IAAqC,QAAnB,EAAAyzB,aAAQ,EAARA,EAAU53B,iBAAS,eAAEs5B,UAChE,MAAMt6C,EAAO,KACRghB,GAAamE,IAAmBP,IACjC5D,EAAUE,YACVF,EAAUu5B,aAGZ,IAAI//C,EAA4BuC,QAAQoD,UACxC,GAAG6gB,IAAc64B,EACf,GAAIrrC,EAAasrC,YAAe3rC,EAAIG,kBAG1BH,EAAIG,oBACT6W,EACD3qB,EAAcuC,QAAQ6oB,SACbpX,EAAasrC,aACtB94B,EAAUkE,OAAO/qB,GAAW,EAAO,MACnC6f,EAAM9e,iBAAiB,aAAY,aAAe,UAAW,KAC3D8lB,EAAUi5B,UACT,CAACpoC,MAAM,UAVyC,CACrD,MAAMxR,EAAU7F,EAAc,IAAeyX,YAAY9D,EAAK0W,aAAa,EAAbA,EAAe21B,QAASr1B,GACtFnE,EAAUkE,OAAO/qB,GAAW,EAAOkG,GAiCvC,OApBI8kB,GAAkBk1B,IACpBA,IACAA,EAAqB,MAGvBl1B,OAAiBvmB,EAEjBpE,EAAYO,KAAK,MACZ+rB,GAAeA,KAKF,UAAb3Y,EAAI9Q,MACL,GAA2B6S,2BAA2B5R,EAAQ6C,OAAQ7C,EAAQyC,IAAKzC,EAAQkT,OAAOC,cAGpG,OAAAgpC,GAAA,GAAmBzgC,EAAOxL,EAAaI,MARrCorC,EAAe75C,WAShB,QAEI,CAAC2lB,SAAUtrB,EAAakgD,OAAQV,IAmCzC,OAhCGh5B,IAAc64B,GACf74B,EAAU+E,oBAAoB/lB,GAqBhB,QAAbmO,EAAI9Q,MAAmB+6C,EAOxBxyC,EAAIpL,YAAeqqB,GAAiCA,EAAchlB,KAAK,CAACwnB,IAAKltB,EAAW6F,KAAM,IAAMA,IAAO06C,SAAU39C,QAAQoD,WAA1FH,IAAO06C,OAN1C,YAAiBvgD,EAAYgC,IAC3B,OAAAyb,EAAA,GAAYzb,GACZs8C,EAAS58C,SACTmE,KACC,CAACgmB,SAAS,EAAMnU,MAAM,IAKpBjM,EAYF,SAAS+0C,IAAa,QAACr8C,EAAO,SAAE4jB,EAAQ,WAAEkB,EAAU,aAAEjB,EAAY,WAAEC,EAAU,cAAElhB,EAAa,aAAEyjB,EAAY,eAAEQ,EAAc,cAAEN,I,QAW9HzB,IAAYA,EAAa,KAE7B,MAAMjV,EAAO7P,EAAQ0O,MAAM5S,UAAYkE,EAAQ0O,MAAMga,QAAQ5sB,SACvDooB,EAAYlkB,EAAQkT,OAAO+Q,cAA4B,QAAb,EAAAjkB,EAAQ0O,aAAK,eAAEgU,WAC/D,GAAgB,UAAb7S,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,KAAkB,CACvE,MAAMu9C,EAAe,IAAI,GAczB,OAbAA,EAAa14B,SAAWA,EACxB04B,EAAat8C,QAAUA,EACvBs8C,EAAaz1B,eAAiBA,EAC9By1B,EAAa/1B,cAAgBA,EAC7B+1B,EAAaj2B,aAAeA,EAEzBxC,IAAcy4B,EAAaz4B,aAAeA,GAC1CjhB,IAAe05C,EAAa15C,cAAgBA,GAC5CkhB,IAAYw4B,EAAax4B,WAAaA,GACtCI,IAAWo4B,EAAa55B,UAAY1iB,EAAQ0O,MAAMgU,WAErD45B,EAAat0C,QAAQ8c,WAAa,GAAKA,EACvCw3B,EAAaF,SACNE,EAGT,IAAIC,EAAc1sC,EAAIkF,UAAYlF,EAAIkF,UAAUkJ,MAAM,KAAO,GACzDu+B,EAAM,GACVA,EAAMD,EAAYx+C,OAAS,GAAKgG,MAAM04C,QAAQF,GAC5C,aAAqBA,EAAYj7C,MAAM2c,MAAM,IAAK,GAAG,GAAGi6B,eACxD,OAEF,IAAIwE,EAAS5gD,SAASC,cAAc,OACpC2gD,EAAO1gD,UAAUC,IAAI,WAAY,OAAOugD,GACxCE,EAAO10C,QAAQ+H,MAAQ,GAAKF,EAAI9E,GAEhC,MAAM4xC,EAAS7gD,SAASC,cAAc,OACtC4gD,EAAO3gD,UAAUC,IAAI,gBAErB,MAAMiU,EAAeC,GAAA,EAAmBC,gBAAgBP,GACxD,IAAc,QAAV,EAAAA,EAAImE,cAAM,eAAEjW,SAAWiC,EAAQkT,OAAO+Q,aAAe/T,EAAaI,KAAoB,UAAbT,EAAI9Q,KAA2D,CAC1I29C,EAAO1gD,UAAUC,IAAI,uBAErB,IAAI+pB,EAA2B,GAC/B,GAAGhmB,EAAQkT,OAAO+Q,YAChB04B,EAAO98C,UAAY,aAAaqQ,EAAaI,QAC7C0V,EAAKzkB,KAAKo7C,EAAOlhC,uBACZ,CACL,MAAMwK,EAAUC,GAAU,CACxB9lB,MAAOyP,EACP7P,QAAS,KACTnE,UAAW8gD,EACXx2B,SAAU,GACVC,UAAW,GACXC,eACAC,kBAAkB,EAClBC,gBACA7qB,KAAM,IAAiBwtB,gBAAgBrZ,EAAK,GAAI,IAAI,KAEtD8sC,EAAOp+C,MAAMjC,MAAQqgD,EAAOp+C,MAAMhC,OAAS,GACxC0pB,EAAQO,OAAOC,OAAOT,EAAKzkB,KAAK0kB,EAAQO,OAAOC,OAC/CR,EAAQO,OAAOE,MAAMV,EAAKzkB,KAAK0kB,EAAQO,OAAOE,MAGnDV,EAAK9jB,QAAQykB,GAAOA,EAAI3qB,UAAUC,IAAI,wBAEtC0gD,EAAO72B,UAAY02B,EAIrB,IAAIx3B,EAAWnV,EAAImV,UAAY,eACTlpB,SAASC,cAAc,OAC/BC,UAAUC,IAAI,wBAC5B,MAAM2gD,EAAgE,CAAC,YAAY/sC,EAAInU,OAEpFkoB,GACDg5B,EAAiBr7C,KAAK,aAAmBvB,EAAQ0kB,OAGhDZ,GACD84B,EAAiBr7C,KAAK,IAAmBojB,iBAAiB3kB,IAG5D08C,EAAO78C,UAAY,OACjBqQ,EAAasrC,aAAet3B,EAAY,GAAK,wHAK/C,MAAM24B,EAAUH,EAAOjxC,cAAc,kBAC/BoZ,EAAmB,IAAI,KAC7BA,EAAiB7c,QAAQ8c,WAAa,GAAKA,EAC3CD,EAAiBhlB,UAAYmlB,EAE7B63B,EAAQl3C,OAAOkf,GAEZf,GACD+4B,EAAQl3C,OAAO,IAAmBsf,aAAajlB,IAQjD,GALgB08C,EAAOjxC,cAAc,kBAC7B9F,UAAU,2BAAiBi3C,EAAkB,QAErDF,EAAOliC,QAAQmiC,IAEXz4B,GAAalkB,EAAQkT,OAAO+Q,YAC9B,OAAOy4B,EAGT,IAAIt4B,EAA0B1B,EAAkC,KAChE,MAAM+C,EAAS,KACb,GAAGrB,EAAa,CACdA,EAAYpoB,UAAUC,IAAI,cAC1B,MAAM6gD,EAAe14B,EACrBhd,WAAW,KACT01C,EAAav/C,UACZ,KACH6mB,EAAc,KAGb1B,IACDA,EAAY,OAIVhhB,EAAQ7D,I,MACZ,MAAMk/C,GAAQl/C,GAAKA,EAAEyT,UACfzB,EAAM,IAAeC,OAAO4sC,EAAO10C,QAAQ+H,OACjD,IAAIyX,EACJ,MAAM00B,EAAU,GAAavzB,KAAKC,QAAU,GAAaD,KAAKC,QAAQrC,cAAc21B,aAAU57C,EAsB9F,OArBIy8C,EAEmB,QAAbltC,EAAI9Q,MACZyoB,EAAW,IAAe7T,YAAY9D,EAAKqsC,GAC3C10B,EAAS/qB,KAAK,KACZ2K,WAAW,KACT,MAAMkJ,EAAMH,GAAA,EAAmBC,gBAAgBP,GAAKS,IACpDnJ,OAAOwF,KAAK2D,IACX9L,EAAA,QAAUo2B,SAASC,kBAAoB,IAAM,MAGlDrT,EADQ,EAA2BjkB,IAAIsM,EAAIwqC,aAAwB,QAAV,EAAAxqC,EAAImE,cAAM,eAAEjW,QAC1D,IAAe4V,YAAY9D,EAAKqsC,GAEhC,IAAec,YAAYntC,EAAKqsC,GAZ3C10B,EAAW,IAAe7T,YAAY9D,EAAKqsC,GAe1C93B,IACDoD,EAAS/qB,KAAKgpB,GACd/C,EAAUkE,OAAOxC,GAAa,EAAMoD,IAG/B,CAACA,aAgCV,OA7BG,IAAey1B,YAAY15C,IAAIsM,EAAI9E,KACpCqZ,EAAcs4B,EAAOjxC,cAAc,sBACnCiX,EAAY,IAAI,KAChBA,EAAUkE,OAAOxC,GAAa,EAAO,IAAe64B,YAAYrxC,IAAIiE,EAAI9E,MAC/DmF,EAAasrC,aAAct3B,IACpCE,EAAcs4B,EAAOjxC,cAAc,sBACnCiX,EAAY1iB,EAAQ0O,MAAMgU,UAEtBA,GAQFA,EAAUkE,OAAOxC,GACjBpkB,EAAQ0O,MAAM3M,QAAQtF,KAAKgpB,KAR3B/C,EAAY,IAAI,KAEhBA,EAAUE,YACVF,EAAUu5B,YACVv5B,EAAUkE,OAAOxC,GACjB1B,EAAU+E,oBAAoB/lB,KAOlC,YAAiBg7C,EAAS7+C,IACrB6kB,EACDA,EAAU3J,QAAQlb,GAElB6D,EAAK7D,KAIF6+C,EA8DF,SAASx2B,IAAU,MAAC9lB,EAAK,QAAEJ,EAAO,UAAEnE,EAAS,SAAEsqB,EAAQ,UAAEC,EAAS,SAAEozB,EAAQ,MAAEC,EAAK,cAAElzB,EAAa,WAAEiC,EAAU,KAAE9sB,EAAI,iBAAE4qB,EAAgB,aAAED,EAAY,eAAEQ,EAAc,OAAEsC,EAAM,QAAE+zB,EAAO,SAAEC,EAAQ,UAAEC,I,MAmBtM,IAAMh9C,EAAkB8T,QAAU9T,EAAqB4T,OAKrD,OAJGmS,GAAYC,IAAc1qB,GAAoB,aAAZ0E,EAAM4C,GACzC,IAAiBq6C,kBAAkBj9C,EAAOvE,EAAWsqB,EAAUC,OAAW9lB,EAAWN,GAGhF,CACLqmB,aAAc,CACZI,MAAOhoB,QAAQoD,UACf6kB,KAAMjoB,QAAQoD,WAEhB2kB,OAAQ,CACNC,MAAO,KACPC,KAAM,MAERhE,UAAW,KACX44B,SAAU,MAIV5/C,SACc4E,IAAb6lB,IAAwBA,EAAWrG,EAAA,EAAWosB,OAAOoR,QAAQhhD,YAC/CgE,IAAd8lB,IAAyBA,EAAYtG,EAAA,EAAWosB,OAAOoR,QAAQ/gD,SAGpEV,EAAUG,UAAUC,IAAI,mBACxB,IAIIshD,EACAC,EACAttC,EANAorC,EAAWz/C,EAEX4hD,GAAQ,EACRC,EAAiCj/C,QAAQoD,UAI7C,MAAM87C,EAAoB,aAAZv9C,EAAM4C,GAAwC,cAApB5C,EAAMi6C,YAA8B3+C,EAM1E,GAFA8hD,EAAQ,IAAIpZ,MAETje,GAAYC,IAAc1qB,EAAM,CACjC,MAAM6U,EAAM,IAAiB8sC,kBAAkBj9C,EAAOvE,EAAWsqB,EAAUC,OAAW9lB,EAAWN,OAASM,EAAWq9C,EAAQ,CAC3H36C,EAAG,YACHyQ,EAAGrT,EAAMqT,EACTU,EAAG/T,EAAM+T,EACTzY,KAAM0E,EAAM1E,KACZqD,KAAM,aACJuB,GAKJ,GAJA5E,EAAO6U,EAAIqtC,UACXH,EAAQltC,EAAIktC,MACZvtC,EAAeC,GAAA,EAAmBC,gBAAgBhQ,EAAO1E,EAAKqD,OAE1D0+C,EAAO,CACTnC,EAAWx/C,SAASC,cAAc,OAClCu/C,EAASt/C,UAAUC,IAAI,4BACvBq/C,EAAS/8C,MAAMjC,MAAQiU,EAAI7U,KAAKY,MAAQ,KACxCg/C,EAAS/8C,MAAMhC,OAASgU,EAAI7U,KAAKa,OAAS,KAE1C,MAAM4+C,EAAW,IAAiB0C,yBAAyBz9C,EAAO8P,GAAeiZ,GAAQ,GACzF,GAAGgyB,EAAU,CACXuC,EAAmBvC,EAASj/C,YAC5B,MAAMqhD,EAAapC,EAASqC,MAC5BD,EAAWvhD,UAAUC,IAAI,eACzBJ,EAAU8J,OAAO43C,OACZ,CACOr3B,GAAU,CACpBrqB,YACAmE,UACAI,QACA+lB,SAAU,EACVC,UAAW,EACX1qB,OACA6qB,gBACAkzB,QACApzB,eACAmC,aACAlC,mBACAkzB,WACA3yB,iBACAsC,SACA+zB,SAAS,EACTE,WAAW,IAGU52B,OAAOE,KACnB1qB,UAAUC,IAAI,cAAe,aAI1CJ,EAAUG,UAAUC,IAAI,0BACxBJ,EAAU8J,OAAO21C,SAGf5/C,IACFA,EAAO,IAAiBwtB,gBAAgB9oB,EAAO+lB,EAAUC,GAAW,IAGtElW,EAAeC,GAAA,EAAmBC,gBAAgBhQ,EAAO1E,aAAI,EAAJA,EAAMqD,MAGjE,IAAIm+C,EAAS,CACX,MAAM/B,EAAW,IAAiB0C,yBAAyBz9C,EAAO8P,GAAeiZ,GAC9EgyB,IACDuC,EAAmBj/C,QAAQC,IAAI,CAACg/C,EAAkBvC,EAASj/C,cAC3DqhD,EAAapC,EAASqC,MACtBD,EAAWvhD,UAAUC,IAAI,eACzBq/C,EAAS31C,OAAO43C,IAKtBC,EAAMxhD,UAAUC,IAAI,eAIpB,MAAM6hD,GAAcP,IAAertC,EAAasrC,aAAeh3C,EAAA,QAAUo2B,SAASC,oBAAsBsiB,EAExG,IAAIz6B,GACa,QAAd,EAAA1iB,aAAO,EAAPA,EAAS0O,aAAK,eAAEgU,aAAc4D,GAC/B5D,EAAY1iB,EAAQ0O,MAAMgU,UAC1BA,EAAUkE,OAAO/qB,GACjBgrB,OAAiBvmB,GACR4P,EAAasrC,aACtB94B,EAAY,IAAI,KAAqB,CACnC+4B,aAAc,aAIlB,MAQMsC,EAAgBztC,GACb0tC,GAAsBniD,EAAW2hD,EAAOltC,EAAKwtC,EAAYxC,EAAUiC,GAGtE93B,EAAS,IACV+C,IAAeA,IAAqB/pB,QAAQoD,UAE5Cu7C,EACM,aAAKltC,EAAaI,IAAK,IAAI7T,KAAK6T,GAC9BytC,EAAaztC,IAIjBytC,EAAa7tC,EAAaI,KAGnC,IAAIpU,EACJ,MAAM+hD,EACHviD,EAA6B+X,GAAK,KAClC/X,EAA6ByY,GAAK,KAC9B0S,EACDnlB,EAAO,KACRmlB,IAAmBP,GAAoB5D,IACxCA,EAAUE,YACVF,EAAUu5B,aAGZ,MAAMl6C,EAlCU47C,IAAUjiD,EACxB,IAAeiY,YAAYvT,EAAwBmmB,aAAa,EAAbA,EAAe21B,SAClE,IAAiB9nC,aAAahU,EAAO1E,EAAM6qB,aAAa,EAAbA,EAAe21B,QAASr1B,GAkClEnE,IACAxS,EAAasrC,aACbl1B,GACD23B,GAEAv7B,EAAUkE,OAAO/qB,GAAW,EAAOkG,GAGrC8kB,OAAiBvmB,EAEjB,MAAM49C,EAAgBn8C,EAAQtF,KAAKgpB,GAEnC,OADAy4B,EAAc91C,MAAM,QACb,CAACof,SAAUzlB,EAASq6C,OAAQ8B,IAsBrC,OAnBGx7B,GACDA,EAAU+E,oBAAoB/lB,GAG7BwO,EAAasrC,WACdkC,EAAmBxhD,EAAcwF,IAAO06C,OAEpC71B,EAKMA,EAAchlB,KAAK,CAACwnB,IAAKltB,EAAW6F,KAAM,IAAMA,IAAO8lB,WAL9CtrB,EAAcwF,IAAO06C,OAQvC/1B,GAAgBq3B,GACjBr3B,EAAa9kB,KAAKm8C,GAGb,CACLr3B,aAAc,CACZI,MAAOi3B,EACPh3B,KAAMxqB,GAAeuC,QAAQoD,WAE/B2kB,OAAQ,CACNC,MAAO82B,EACP72B,KAAM82B,GAER96B,YACA44B,YAIG,SAAS0C,GAAsBniD,EACpC2hD,EACAltC,EACAwtC,EACAxC,EAAWz/C,EACX0hD,GAMA,OAJGO,GACDN,EAAMxhD,UAAUC,IAAI,WAGf,IAAIwC,QAAeoD,IAMxB,OAAAs6C,GAAA,GAAmBqB,EAAOltC,EAAK,KAC7B6tC,GAAA,EAAcC,cAAcviD,EAAW,KACrCy/C,EAAS31C,OAAO63C,GAEhB,aAAQ,KACN37C,MAGCi8C,GACDN,EAAM5gD,iBAAiB,eAAgB,KACrCuhD,GAAA,EAAcE,OAAO,KACnBb,EAAMxhD,UAAUuB,OAAO,WAEpBggD,GACDA,EAAWhgD,YAGd,CAACgW,MAAM,UA4Db,SAASuV,IAAY,IAACjZ,EAAG,IAAEkZ,EAAG,WAAEP,EAAU,cAAEjC,EAAa,MAAEyC,EAAK,KAAE3rB,EAAI,UAAEihD,EAAS,MAAEvI,EAAK,MAAEz5C,EAAK,OAAEC,EAAM,UAAEgiD,EAAS,KAAEniD,EAAI,aAAEiqB,EAAY,WAAEy3B,I,MAgB7I,MAAMU,EAAc3uC,EAAIipC,QAexB,GAbIx8C,IACFA,EAASy5C,OAAcz1C,EAAN,KAGf/D,IACFA,EAAUw5C,OAAcz1C,EAAN,KAGD,IAAhBk+C,GAAsB,KAAa/oB,QAEpC,KAAagpB,qBAGXD,EAEF,MADAl2C,QAAQC,MAAM,6BAA8BsH,GACtC,IAAIwX,MAAM,8BAGlB0B,EAAI/gB,QAAQ+H,MAAQ,GAAKF,EAAI9E,GAC7Bge,EAAI/sB,UAAUC,IAAI,yBAIlB,MAAMiU,EAAeC,GAAA,EAAmBC,gBAAgBP,GAElD2mC,EAAYT,EAAQ,aAAkBA,IAAU,EAChDyF,EAAatrC,EAAasrC,aAAesC,EAE/C,IAAIJ,EAAmB,eACnBgB,GAAkB,EACtB,KAAc,QAAV,EAAA7uC,EAAImE,cAAM,eAAEjW,SAAU8R,EAAI8uC,uBAAyB51B,EAAItN,qBAAuB+/B,GAA8B,IAAhBgD,GAAqBF,GAA0D,CAC7K,IAIIf,EAJA92B,EAAQ5W,EAAI8uC,qBAAuB9uC,EAAI8uC,oBAAoBnI,IAAc3mC,EAAImE,OAAO,GAKxF,MAAM4qC,EAAc,KACd71B,EAAIljB,oBACN03C,EAAWvhD,UAAUC,IAAI,gBAAiB,aAE1CkiD,GAAA,EAAcC,cAAcr1B,EAAK,KAC/BA,EAAIpjB,OAAO43C,GACXG,EAAiB77C,cAKvB,GAAG,QAAS4kB,EACV82B,EAAa,IAAInZ,MACjB,OAAA+X,GAAA,GAAmBoB,EAAY92B,EAAMnW,IAAKsuC,GAC1CF,GAAkB,OACb,GAAG,UAAWj4B,EAAO,CAC1B,GAAe,kBAAZA,EAAMzjB,EACP,GAAGyjB,EAAMxS,MAAMlW,OAAQ,CACrB,MAAMud,EAAI,IAAiBujC,yBAAyBp4B,GACpDsC,EAAIlpB,UAAY,gKAAgKgQ,EAAI4D,GAAK,OAAO5D,EAAIsE,GAAK,oDAC5LmH,8BAGbmL,EAAQ5W,EAAImE,OAAO3H,KAAKC,IAAI,MAAC,OAAwC,QAAxC,EAACA,EAAkC2H,aAAK,eAAElW,UAAW0oB,EAInFA,GAAqB,kBAAZA,EAAMzjB,GAAyBwzC,GAAa,IACtD+G,EAAa,IAAInZ,MAEb,MAAqBv0B,EAAIqD,OAAO4rC,uBAAyB5uC,EAAaI,KACxE,OAAA6rC,GAAA,GAAmBoB,EAAY,IAAiBwB,uBAAuBlvC,EAAK4W,GAAsC,GAAOm4B,GACzHF,GAAkB,GAElBM,GAAA,EAAqBC,QAAQ,GAAKpvC,EAAI9E,GAAK0b,EAAsCxS,OAAqBxX,KAAKwX,IACxGwS,EAAsCxS,MAAQA,EAC/CpE,EAAIqD,OAAO4rC,uBAAwB,EAEhCt2B,IAAeA,KAEdO,EAAIljB,mBACN,OAAAs2C,GAAA,GAAmBoB,EAAY,IAAiBwB,uBAAuBlvC,EAAK4W,GAAsC,GAAOm4B,KAE1Hx2C,MAAM,cAGR,GAAmB,IAAhBo2C,IAAsBD,GAAaD,IAAc9H,GAAa,EAAG,CACzE+G,EAAa,IAAInZ,MAEjB,MAAM1iC,EAAO,KACX,GAAGqnB,EAAIljB,mBAAsB2iB,IAAeA,IAAe,OAE3D,MAAMxO,EAAI,KACL+O,EAAIljB,mBAAsB2iB,IAAeA,KAC5C,OAAA2zB,GAAA,GAAmBoB,EAAYrtC,EAAaI,IAAKsuC,IAGnD,OAAG1uC,EAAaI,KACd0J,IACOvb,QAAQoD,WAER,IAAeq9C,YAAYrvC,EAAK4W,GAAsC1kB,QAAQtF,KAAKud,IAI9F,GAAGuM,GAAiB+3B,EAElB,OADA/3B,EAAchlB,KAAK,CAACwnB,MAAKrnB,SAClBjD,QAAQoD,UAEfH,IAEI+kB,EAAcnW,MAChBouC,GAAkB,IAU1B,GAJGr4B,GAAgBq4B,GACjBr4B,EAAa9kB,KAAKm8C,GAGjBY,EACD,OAAO7/C,QAAQoD,UAGjB,MAAMH,EAAO,IAAW,mCACtB,IAAG8mB,GAAeA,IAElB,GAAmB,IAAhBg2B,QAYkB,IAAe7qC,YAAY9D,EAAsB0W,aAAa,EAAbA,EAAe21B,SAClFz/C,KAAK,MAELA,KAAW45C,GAAS,mCAGnB,GAAG7tB,IAAeA,IAAc,OAEhC,IAAI7rB,QAAkB,KAAa+5C,oBAAoB,CACrD76C,UAAWktB,EACX3sB,KAAMA,IAAS25C,EACf15C,SAAUgB,EACVs5C,cAAeN,EACf/5C,QACAC,UACCysB,EAAOwtB,GAIV75C,EAAUC,iBAAiB,aAAc,KACvC,MAAMgU,EAAUmY,EAAItN,kBACpBqiC,GAAcA,IAAeltC,GAA+B,QAApBA,EAAQu2B,UAAsB3iC,EAAA,QAAUo2B,SAASC,kBAEzF,MAAM+Y,EAAK,KACNhjC,GAAWA,IAAYjU,EAAU2B,QAClCsS,EAAQrT,UAIRugD,EAKFK,GAAA,EAAcE,OAAO,KACnB1hD,EAAU2B,OAAOtC,UAAUC,IAAI,WAC5B2U,GACDA,EAAQ5U,UAAUC,IAAI,YAGxBU,EAAU2B,OAAO1B,iBAAiB,eAAgB,KAChDuhD,GAAA,EAAcE,OAAO,KACnB1hD,EAAU2B,OAAOtC,UAAUuB,OAAO,WAClCq2C,OAED,CAACrgC,MAAM,MAfT3C,GACDutC,GAAA,EAAcE,OAAOzK,GAkBzB,IAAegD,kBAAkB/mC,EAAKlT,EAAU2B,OAAQk4C,IAGvD,CAACjjC,MAAM,IAEPwiC,GACD,YAAiBhtB,EAAMlrB,IACrB,OAAAyb,EAAA,GAAYzb,GACZ,IAAIlB,EAAY,KAAawiD,aAAap2B,GAEvCpsB,EAAU4U,SACX5U,EAAUN,UAAW,EACrBM,EAAUyiD,sBAUb,GAAmB,IAAhBZ,EAAmB,CAC3B,MAAMhB,EAAQ,IAAIpZ,MACZmZ,EAAax0B,EAAItN,oBAAsB+hC,GAASz0B,EAAItN,kBAS1D,OARAqiC,GAAcA,IAAetC,GAAc+B,IAAe/4C,EAAA,QAAUo2B,SAASC,kBAE7E2iB,EAAMxhD,UAAUC,IAAI,iBAEjB6hD,GACDN,EAAMxhD,UAAUC,IAAI,WAGf,IAAIwC,QAAc,CAACoD,EAASylB,KACjC,MAAMtN,EAAI,KACR,GAAGwO,IAAeA,IAAc,OAAO3mB,IAEvC,OAAAs6C,GAAA,GAAmBqB,EAAOttC,EAAaI,IAAK,KAC1C6tC,GAAA,EAAcC,cAAcr1B,EAAK,KAC/BA,EAAIpjB,OAAO63C,GACRD,GACDA,EAAWvhD,UAAUC,IAAI,YAG3B4F,IAEGi8C,GACDN,EAAM5gD,iBAAiB,eAAgB,KACrC4gD,EAAMxhD,UAAUuB,OAAO,WACpBggD,GACDA,EAAWhgD,UAEZ,CAACgW,MAAM,SAMfrD,EAAaI,IAAK0J,IAEnB,IAAerG,YAAY9D,EAAsB0W,aAAa,EAAbA,EAAe21B,SAASz/C,KAAKud,EAAGnY,SAMnF3F,GAA4BqqB,GAAmBi1B,GAA8B,IAAhBgD,EAEjE98C,KADC6kB,EAAchlB,KAAK,CAACwnB,MAAKrnB,SAAQjD,QAAQoD,WAU5C,OAPG25C,GAA8B,IAAhBgD,IACfd,EAAmBxhD,EAChBmqB,GACDA,EAAa9kB,KAAKm8C,IAIfxhD,EAGF,SAAemjD,IAAoB,IAAC9uC,EAAG,cAAEgW,EAAa,UAAE1qB,EAAS,MAAEmtB,EAAK,SAAE3sB,EAAQ,MAAEC,EAAK,OAAEC,I,gDAShG,GAAa,QAAV,EAAAgU,EAAIyD,cAAM,eAAEjW,OAoCb,OAnCAlC,EAAUG,UAAUC,IAAI,8BACxBsqB,EAAchlB,KAAK,CACjBwnB,IAAKltB,EACL6F,KAAM,KACJ,MAAM49C,EAAkB,GAAmBC,kCAAkChvC,GACvExO,EAAUoO,GAAA,EAAmBqX,SAAS83B,GAE5C,GAAG/uC,EAAI2C,OAAOmkC,SACZ,OAAOt1C,EACNtF,KAAK,MAELA,KAAK45C,IACJI,GAAA,EAAaC,oBAAoB,CAC/B76C,YACAO,MAAM,EACNC,WACAs6C,cAAeN,EACf/5C,QACAC,SACAijD,aAAa,GACZx2B,KAEA,CACL,MAAMw0B,EAAQ,IAAIpZ,MAGlB,OAFAoZ,EAAMxhD,UAAUC,IAAI,iBAEb8F,EAAQtF,KAAKgjD,IAClB,OAAAtD,GAAA,GAAmBqB,EAAOkC,IAAIC,gBAAgBF,GAAO,KACnD5jD,EAAU8J,OAAO63C,WAU7B,MAAMz7C,EAAU,GAAmB6zC,cAAcrlC,GAC3CklC,QAAmB1zC,EACQ,kBAA9B0zC,EAAWJ,UAAU,GAAGryC,GACzB8lB,GAAY,CACVjZ,IAAK4lC,EAAWJ,UAAU,GAC1BtsB,IAAKltB,EACLmtB,MAAOA,EACPzC,qBAkCC,SAASq5B,GAAUp2C,EAA8Cye,EAAiDjoB,GACvH,MAAM6/C,EAAiB,IAAI,GAAe,SAG1C,OAFAA,EAAe93B,KAAKve,EAAOye,EAAUjoB,GAE9B6/C,EAAehkD,UAGjB,SAASikD,GAAalhD,GAS3B,MACMqrB,EADW,IAAI,GAASrrB,EAAQwC,MAAOxC,EAAQ2qB,SAAU3qB,EAAQ4qB,SAAU5qB,EAAQ6qB,QAAS7qB,EAAQ8qB,WAClFO,SAElB81B,EAAY91B,EAAO5d,KAAKhL,GAAQA,EAAKwpB,MAAQvB,IAC7ChtB,EAAQyjD,EAAUn1B,SAAStuB,MAAQyjD,EAAUn1B,SAASzU,EAEtD6pC,EAAa/1B,EAAO5d,KAAKhL,GAAQA,EAAKwpB,MAAQvB,IAC9C/sB,EAASyjD,EAAWp1B,SAASruB,OAASyjD,EAAWp1B,SAASvU,EAE1Dxa,EAAY+C,EAAQ/C,UAC1BA,EAAU0C,MAAMjC,MAAQA,EAAQ,KAChCT,EAAU0C,MAAMhC,OAASA,EAAS,KAClC,MAAMolB,EAAW9lB,EAAU8lB,SAE3BsI,EAAO/nB,QAAQ,EAAE0oB,WAAUC,SAAQ5qB,KACjC,IAAI8oB,EA8BJ,GA7BAA,EAAMpH,EAAS1hB,GACX8oB,IACFA,EAAMjtB,SAASC,cAAc,OAC7BF,EAAU8J,OAAOojB,IAGnBA,EAAI/sB,UAAUC,IAAI,aAAc,gBAEhC8sB,EAAIxqB,MAAMjC,MAASsuB,EAAStuB,MAAQA,EAAQ,IAAO,IACnDysB,EAAIxqB,MAAMhC,OAAUquB,EAASruB,OAASA,EAAS,IAAO,IACtDwsB,EAAIxqB,MAAMwxB,IAAOnF,EAASvU,EAAI9Z,EAAS,IAAO,IAC9CwsB,EAAIxqB,MAAMoa,KAAQiS,EAASzU,EAAI7Z,EAAQ,IAAO,IAE3CuuB,EAAQvB,IAAiBuB,EAAQvB,KAClCP,EAAIxqB,MAAM0hD,oBAAsB,WAG/Bp1B,EAAQvB,IAAiBuB,EAAQvB,KAClCP,EAAIxqB,MAAM2hD,uBAAyB,WAGlCr1B,EAAQvB,IAAkBuB,EAAQvB,KACnCP,EAAIxqB,MAAM4hD,qBAAuB,WAGhCt1B,EAAQvB,IAAkBuB,EAAQvB,KACnCP,EAAIxqB,MAAM6hD,wBAA0B,WAGnCxhD,EAAQyhD,SAAU,CACnB,MAAMC,EAAWxkD,SAASC,cAAc,OACxCukD,EAAStkD,UAAUC,IAAI,oBAEvB8sB,EAAIpjB,OAAO26C,MAiBV,SAASC,IAAU,QAACC,EAAO,cAAEC,EAAa,WAAEj4B,EAAU,UAAEtE,EAAS,cAAEqC,EAAa,MAAEkzB,EAAK,KAAE9wB,EAAI,aAAEtC,EAAY,eAAEQ,IAWlH,MAAMzlB,EAAiE,GAGjEqD,EAAU,IAAmBi8C,eAAeF,GAClD,IAAI,MAAM/9C,KAAOgC,EAAS,CACxB,MAAMgiC,EAAI9d,EAAKg4B,WAAWl+C,GACpBiM,EAAQ+3B,EAAE/3B,MAAMtO,OAASqmC,EAAE/3B,MAAM5S,SAEjCJ,EAAwB,UAAZgT,EAAM1L,EAAgB,IAAiBkmB,gBAAgBxa,EAAO,IAAK,KAAO,CAAC+E,EAAG/E,EAAM+E,EAAGU,EAAGzF,EAAMyF,GAClH/S,EAAMG,KAAK,CAAC7F,OAAMgT,QAAO1O,QAASymC,IAQpCqZ,GAAa,CACXjkD,UAAW4kD,EACXr/C,MAAOA,EAAMiD,IAAIuC,IAAK,CAAE6M,EAAG7M,EAAElL,KAAK+X,EAAGU,EAAGvN,EAAElL,KAAKyY,KAC/CoV,SAAUzJ,EAAA,EAAWosB,OAAO0U,MAAMtkD,MAClCktB,SAAU,IACVC,QAAS,EACT42B,UAAU,IAGZj/C,EAAMc,QAAQ,CAACb,EAAMpB,KACnB,MAAM,KAACvE,EAAI,MAAEgT,EAAK,QAAE1O,GAAWqB,EAEzB0nB,EAAM03B,EAAc9+B,SAAS1hB,GACnC8oB,EAAI/gB,QAAQvF,IAAM,GAAKzC,EAAQyC,IAC/BsmB,EAAI/gB,QAAQnF,OAAS,GAAK7C,EAAQ6C,OAClC,MAAMy9C,EAAWv3B,EAAItN,kBACN,UAAZ/M,EAAM1L,EACPkjB,GAAU,CACR9lB,MAAOsO,EACP1O,UACAnE,UAAWykD,EACXn6B,SAAU,EACVC,UAAW,EACXqzB,QACAlzB,gBACAiC,aACA9sB,OACA2qB,eACAQ,mBAGF0yB,GAAU,CACR1pC,IAAK7P,EAAQ0O,MAAM5S,SACnBD,UAAWykD,EACXtgD,UACAmmB,SAAU,EACVC,UAAW,EACXozB,UAAU,EACVC,QACAlzB,gBACAiC,aACAnC,eACAQ,qBA/iDR/G,EAAA,EAAWljB,iBAAiB,eAAgB,CAACoH,EAAMunC,KACjD,GAAGA,IAAO,IAAWE,QAAUznC,IAAS,IAAWynC,OAAQ,CACzD,MAAMjoB,EAAWzf,MAAMC,KAAKlI,SAAS4P,iBAAiB,gCAChDpP,EAAQwjB,EAAA,EAAWosB,OAAO/tC,MAAM7B,MAChCk+C,EAAWl+C,EAAQ,EACnBm0C,EAAS+J,EAAW,EAC1BlB,GAA0B,EAAIr7C,KAAK0yC,GAAKF,EACxCjtB,EAASthB,QAAQ0O,IACfA,EAAQyP,eAAe,KAAM,QAAS,GAAK/jB,GAC3CsU,EAAQyP,eAAe,KAAM,SAAU,GAAK/jB,GAE5C,MAAMumB,EAASjS,EAAQ6K,kBACvBoH,EAAOxC,eAAe,KAAM,KAAM,GAAKm6B,GACvC33B,EAAOxC,eAAe,KAAM,KAAM,GAAKm6B,GACvC33B,EAAOxC,eAAe,KAAM,IAAK,GAAKowB,GAEtC5tB,EAAOtkB,MAAMgzC,gBAAkB+H,GAA0B,IAAMA,GAC/Dz2B,EAAOtkB,MAAM+yC,iBAAmB,GAAKgI,QAwc3C90C,EAAA,QAAU5H,iBAAiB,iBAAmBmT,IAC3BhM,MAAMC,KAAKlI,SAAS4P,iBAAiB,0BAA0BqE,QACvE7N,QAAQ0O,IACZA,EAAQnF,cAAc,gCACvB,YAAmBmF,O,gCC5gBV,SAASiwC,GAAuBjwC,EAAsB/U,EAAwBilD,EAAaC,GAKxG,YAJezgD,IAAZygD,IACDA,EAAUnwC,EAAQlE,gBAAkB7Q,EAAY,OAAAmlD,GAAA,GAAWpwC,IAAY,GAGtEmwC,IAAYD,KAEQ,IAAbC,GAAkBA,EAAUD,IACpCA,GAAO,GAGLA,EAEMjlD,EAAUgK,kBAAoBi7C,EACtCjlD,EAAU0gB,aAAa3L,EAAS/U,EAAU8lB,SAASm/B,IAEnDjlD,EAAU8J,OAAOiL,GAJjB/U,EAAU2e,QAAQ5J,IAOb,GCXM,MAAM,GAenB,YAAYhS,GALF,KAAAqiD,kBAAqBrtB,GAAyBA,IAC9C,KAAAstB,eAAkBttB,GAAuDA,GAAS,GAElF,KAAApL,WAAa,eAYrB,YAAW5sB,KAAMgD,GAEjBhD,KAAK4nB,SAAW,IAAIlY,IACpB1P,KAAKkI,OAAS,GAGT,QACLlI,KAAK4sB,WAAWhX,QAChB5V,KAAK4nB,SAASzd,QACdnK,KAAKkI,OAAO/F,OAAS,EAGb,cACRnC,KAAK4nB,SAASthB,QAAQ0O,IACpBhV,KAAK2hC,OAAO3sB,EAAQ7F,IAAI,KAGvBnP,KAAKulD,QACNvlD,KAAKkI,OAAO5B,QAAQ,CAAC0O,EAAS3Q,KAC5BrE,KAAKulD,OAAOvwC,EAAS3Q,KAKpB,WAAW2zB,GAChB,MAAMpL,EAAa5sB,KAAK4sB,WAAW5c,MACnChQ,KAAKslD,eAAgBE,IACnB,IAAI54B,UAA+BloB,IAAd8gD,IAA4BA,EAC/C,OAAOxtB,GAAS,GAGlBh4B,KAAKylD,cAELztB,GAAS,KAIN,IAAI7oB,GACT,OAAOnP,KAAK4nB,SAASjgB,IAAIwH,GAGpB,IAAIA,GACT,OAAOnP,KAAK4nB,SAAS5X,IAAIb,GAGpB,SACL,OAAOnP,KAAK4nB,SAGP,IAAIzY,EAAqBu2C,GAAQ,EAAOL,EAAoEM,EAAcD,GAC/H,IAAI1wC,EAAUhV,KAAKgQ,IAAIb,GACvB,GAAG6F,EACD,OAAOA,EAGT,MAAM4wC,EAA0B,CAC9Bz2C,KACAmN,MAAO,GAOT,OAJAtH,EAAUhV,KAAK6lD,gBAAgBD,EAAMF,GACrC1lD,KAAK4nB,SAASjT,IAAIxF,EAAI6F,GACtBhV,KAAK2hC,OAAOxyB,EAAIw2C,EAAa3wC,EAASqwC,GAE/BrwC,EAGF,OAAO7F,EAAqB22C,GACjC,MAAM9wC,EAAUhV,KAAK4nB,SAAS5X,IAAIb,GAClC,IAAI6F,EACF,OAAO,EAGThV,KAAK4nB,SAASvZ,OAAOc,GAErB,MAAM9K,EAAMrE,KAAKkI,OAAOqU,QAAQvH,GAKhC,IAJY,IAAT3Q,GACDrE,KAAKkI,OAAOzD,OAAOJ,EAAK,GAGvBrE,KAAK+lD,SACN,GAAGD,EACD9lD,KAAK+lD,SAAS/wC,OACT,CACL,MAAM4X,EAAa5sB,KAAK4sB,WAAW5c,MACnChQ,KAAKqlD,kBAAkB,KACjBz4B,KAIJ5sB,KAAK+lD,SAAS/wC,KAKpB,OAAO,EAGF,OAAO7F,EAAqBu2C,GAAQ,EAAO1wC,EAAUhV,KAAKgQ,IAAIb,GAAKk2C,GACxE,IAAIrwC,EACF,OAGFA,EAAQsH,MAAQtc,KAAKgmD,SAAS72C,GAC9BnP,KAAKimD,UAAYjmD,KAAKimD,SAASjxC,GAE/B,MAAM3Q,EAAM,YAA2BrE,KAAKkI,OAAQ8M,EAAS,SAC7D,IAAI0wC,GAAS1lD,KAAKulD,OAAQ,CACxB,MAAM34B,EAAa5sB,KAAK4sB,WAAW5c,OAClCq1C,GAAqBrlD,KAAKqlD,mBAAmB,KACxCz4B,KAKJ5sB,KAAKulD,OAAOvwC,EAAS3Q,O,2SCvId,MAAM,WAAuB,GAW1C,YAAYrB,EAOP,IAsDH,IAAI8J,EArDJ7J,MAAM,CACJ+iD,SAAW72C,GAAO,IAAgB+2C,qBAAqB/2C,GACvD42C,SAAW/wC,IACTA,EAAQlJ,IAAIK,OAAOxK,SACnB3B,KAAKmmD,oBAAsBnmD,KAAKmmD,sBAElCF,SAAWjxC,IACT,MAAMoxC,EAAS,IAAgB7zC,oBAAoByC,EAAQ7F,IAC3D,OAAA5C,EAAA,GAAeyI,EAAQlJ,IAAIwG,gBAAiB8zC,IAE9Cb,OAAQ,CAACvwC,EAAS3Q,KAChB,MAAMgiD,EAAmBrxC,EAAQlJ,IAAIK,OAAO2E,gBAAkB9Q,KAAK4J,KACnEq7C,GAAuBjwC,EAAQlJ,IAAIK,OAAQnM,KAAK4J,KAAMvF,GAEnDgiD,GAAoBrmD,KAAKmmD,oBAC1BnmD,KAAKmmD,sBAGTN,gBAAkBD,IAChB,MAAM,IAAC95C,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ+5C,EAAKz2C,GACblP,WAAW,EACX+L,YAAY,EACZC,WAAYjM,KAAKiM,WACjBvC,WAAY1J,KAAK0J,WACjBwC,WAAW,EACXmG,cAAerS,KAAKqS,cACpBsY,cAAe3qB,KAAK2qB,gBAItB,OADCi7B,EAAoB95C,IAAMA,EACpB85C,GAETP,kBAAmB,KACnBC,eAAsBttB,GAAa,mCACjC,OAAI,OAAAgnB,GAAA,GAAQh/C,KAAK4J,aAIX,eAEF,OAAAo1C,GAAA,GAAQh/C,KAAK4J,WAIjBouB,GAAS,GAHAA,GAAS,IANTA,GAAS,QAlDd,KAAA/rB,WAAa,GACb,KAAAoG,eAAgB,EAChB,KAAA3I,YAAa,EA6DrB,YAAW1J,KAAMgD,GAEjBhD,KAAK4J,KAAO,GAAkBC,eAAe,CAAC61B,IAAK18B,EAAQ08B,MAG3D,MAAM4mB,EAAY,KAChBx5C,EAAUvB,OAAOC,WAAW,KAC1BxL,KAAKumD,WAAYrkC,IACZA,GACDokC,OAGH,GAAeE,gBAGpBF,KAlFe,GAAAE,cAAgB,I,aCPpB,SAASC,GAAsBzjD,GAC5C,IAAI0jD,GAAU,EACd,OAAO,IAAI,GAAa,OAAD,wBAClB1jD,GAAO,CACV0kC,kBAAoBzlC,IACV,OAAA6f,GAAA,GAAgB7f,EAAE4S,OAAQ,mBAC/B,OAAA8xC,GAAA,GAAoB1kD,MACpBe,EAAQ0kC,mBAAoB1kC,EAAQ0kC,kBAAkBzlC,IAE3DimC,QAAS,CAACL,EAAOC,EAAO7lC,KACtB,IAAIykD,GAAWrkD,KAAKovB,IAAIqW,GAAS,GAC/B,OAAO,EAGT,GAAGzlC,KAAKovB,IAAIoW,GAASxlC,KAAKovB,IAAIqW,GAC5B,OAAApqB,EAAA,GAAYzb,GACZykD,GAAU,OACL,IAAIA,GAAWrkD,KAAKovB,IAAIqW,GAASzlC,KAAKovB,IAAIoW,GAC/C,OAAO,EAOT,OAAO7kC,EAAQklC,QAAQL,EAAOC,EAAO7lC,IAEvCslC,QAAS,KACPmf,GAAU,EACV1jD,EAAQukC,SAAWvkC,EAAQukC,WAE7B7pB,aAAa,KCrCF,SAASkpC,GAAe5jD,GACrC,OAAOyjD,GAAsB,OAAD,wBACvBzjD,GAAO,CACVklC,QAAS,CAACL,EAAOC,EAAO7lC,KACtB,GAAGI,KAAKovB,IAAIoW,GAAS,GAInB,OAHA7kC,EAAQklC,QAAQL,EAAOC,EAAO7lC,GAC9B,gBAEO,M,qTCRA,MAAM,WAAqB,GACxC,YACE4kD,EACAvnB,EACAwnB,GAAmB,GAEnB7jD,MAAM,CACJu8B,UAAW,CAAC,UAAW,YACvBF,SAAUwnB,EAAmBxnB,EAAiBr4B,GAAW,mCACvD,GAAGq4B,EAAU,CACX,MAAM5zB,EAAM4zB,EAASr4B,GAClByE,aAAe7I,gBACV6I,GAIV,GAAaq7C,aAAa9/C,GAC1B,GAAa8lB,KAAKhrB,MAAMilD,oBAAoBH,MAE9Cj6C,YAAa,uCACbkwB,iBAAkB,gBAClBtC,aAAc,kBCdL,MAAM,GACnB,YAAYvzB,EAAgBgB,EAAgB9E,EAAgB8jD,GAC1D,MAAMvkB,EAAmB,IAAI,KAAU,CAACz7B,WAAS+N,QAEjD/M,EAAOA,EAAKxE,QACZ,MAAMu0B,EAAW,CAACra,EAA4CupC,KAC5DD,GAAaA,IACD,cAAT9jD,EACD,IAAmBgkD,wBAAwBlgD,EAAQgB,GAEnD,IAAmBm/C,eAAengD,EAAQgB,IAAQ0V,EAAQ7d,MAAQonD,IAItE,IAAIt5C,EAAoBy5C,EAAkB3vB,EAA0BsL,EAAwBplB,EAAsCia,EAA6C,GAoB/K,GAnBmB,IAAhB5vB,EAAK9F,OACNyL,EAAQ,6BAERA,EAAQ,sBACRy5C,EAAY,CAAC,eAAK,WAAY,CAACp/C,EAAK9F,WAIpCu1B,EADC,IAAgB4vB,YAAYrgD,GACC,IAAhBgB,EAAK9F,OAAe,oCAAsC,kCAE1C,IAAhB8F,EAAK9F,OAAe,gCAAkC,8BAGtEyb,EAAU,CAAC,CACTmX,QAAS,SACTmO,UAAU,EACVlL,aAGC/wB,IAAW2B,EAAA,QAAU6O,MAAiB,cAATtU,QAG9B,GAAG8D,EAAOo2B,SACRxF,EAAWlyB,KAAK,CACduX,KAAM,2BACNimB,SAAU,CAACT,SAER,CACL,MAAM3V,EAAO,IAAgB2L,QAAQzxB,EAAO4vB,YAEtC0G,EAAY,IAAgBA,UAAUt2B,EAAO4vB,WAAY,mBAC/D,GAAc,SAAX9J,EAAK3lB,EAAc,CACpB,MAAMmgD,EAAYhqB,EAAYt1B,EAAKxE,QAAUwE,EAAKL,OAAOf,GACvC,IAAmB2S,iBAAiBvS,EAAQJ,GAC7C+E,SAAWhD,EAAA,QAAU6O,MAGnC8vC,EAAUplD,SACRolD,EAAUplD,SAAW8F,EAAK9F,OAC3B01B,EAAWlyB,KAAK,CACduX,KAAM,kBAGR2a,EAAWlyB,KAAK,CACduX,KAAM,yBAGRwa,EAAc,0BACdsL,EAAkB,CAAC,eAAK,WAAY,CAACukB,EAAUplD,iBAKnDyb,EAAQ,GAAGoa,SAAYra,GAAYqa,EAASra,GAAS,GAK3D,aAAgBC,GAEF,IAAI,GAAU,oBAAqB,CAC/C3W,SACAysB,aAAc9lB,EACd0pB,cAAe+vB,EACf5vB,mBAAoBC,EACpBE,oBAAqBoL,EACrBplB,UACAia,eAGItX,Q,cC3FK,MAAM,GACnB,YAAYtZ,EAAgBgB,EAAgBg/C,GAC1C,IAAIr5C,EAAe8pB,EAAqB9Z,EAAyB,GAEjEhQ,EAAQ,eAAe3F,EAAK9F,OAAS,EAAI,IAAM,SAC/Cu1B,EAAczvB,EAAK9F,OAAS,EAAI,QAAU8F,EAAK9F,OAAS,iBAAmB,oBAO3Eyb,EAAQjY,KAAK,CACXovB,QAAS,OACTiD,SAPe,KACfivB,GAAaA,IACb,IAAmBO,sBAAsBvgD,EAAQgB,MAQrC,IAAI,GAAU,oBAAqB,CAC/ChB,SACA2G,QACA8pB,cACA9Z,YAGI2C,Q,YC5BK,SAASknC,KACnBl8C,OAAOm8C,aACLn8C,OAAOm8C,eAAeC,MACvBp8C,OAAOm8C,eAAeC,QACdp8C,OAAOm8C,eAAeE,iBAC9Br8C,OAAOm8C,eAAeE,kBAGhB1nD,SAAS4uC,WAEjB5uC,SAAS4uC,UAAU6Y,Q,cCuBvB,MAAME,GAAoBp/C,GACjB,IAAIA,EAAIy2B,UAAU6E,OAAO,CAACC,EAAK7D,IAAM6D,EAAM7D,EAAErgC,KAAM,GAK5D,MAAM,GA2BJ,YAAYkD,GAiBV,GA3CK,KAAA8kD,aAAyC,IAAIp4C,IAC7C,KAAAq/B,aAAc,EAgXd,KAAA0Y,gBAAkB,KACvBznD,KAAK+nD,mBAAqB/nD,KAAK+nD,oBAC/B/nD,KAAK8nD,aAAa39C,QAClBnK,KAAKgoD,kBACLP,MA9UA,YAAWznD,KAAMgD,GAEjBhD,KAAKiP,eAAiB,eAAiB,eAEpC,sBA0BD,OAzBAjP,KAAK+N,eAAe1N,IAAIL,KAAKioD,cAA7BjoD,CAA4C,WAAY,KAClDA,KAAK+uC,cACT/uC,KAAKkoD,aCrFR38C,OAAOm8C,aACDn8C,OAAOm8C,eAAeS,WAErBjoD,SAAS4uC,UAEV5uC,SAAS4uC,UAAUsZ,cAAclrC,KAGnC,WDgFH,aAA0Bld,KAAKioD,cAAgBhmD,IAC7C,GAAGjC,KAAK+uC,aAAgB/uC,KAAKqoD,uBAAyBroD,KAAKqoD,uBAAyB,OAGpFnoD,SAASiW,KAAK/V,UAAUC,IAAI,aAC5BL,KAAKioD,cAAcjnD,iBAAiB,WAAaiB,IAC/C,OAAAyb,EAAA,GAAYzb,GACZ/B,SAASiW,KAAK/V,UAAUuB,OAAO,cAG9B,CAACgW,MAAM,EAAMmU,SAAS,IAEzB27B,KAEA,MAAMzyC,EAAUhV,KAAKsoD,qBAAqBrmD,EAAE4S,QACzCG,GACDhV,KAAKgvC,gBAAgBh6B,IAEtBhV,KAAK+N,gBAKV,MAAMw6C,EAAqB,CAAC73B,EAAoB83B,KAC9C,GAAG93B,IAAU83B,EACX,MAAO,GAGT,MAAMC,EAAY/3B,EAAM5U,wBAClB4sC,EAAWF,EAAK1sC,wBAEhB6sC,GADcF,EAAUt0B,IAAMu0B,EAASv0B,KAASs0B,EAAU1rC,KAAO2rC,EAAS3rC,MAClD,EAExB6rC,EAAS,OAAA9mC,GAAA,GAAgB4O,EAAO1wB,KAAK6oD,8BAC3C,IAAID,EACF,MAAO,GAGT,MAAMhhC,EAAWzf,MAAMC,KAAKwgD,EAAO94C,iBAAiB9P,KAAK8oD,6BACzD,IAAIC,EAAanhC,EAASrL,QAAQmU,GAC9BzK,EAAY2B,EAASrL,QAAQisC,GAE7BG,KACD1iC,EAAW8iC,GAAc,CAACA,EAAY9iC,IAOzC,OAJc2B,EAASnkB,MAAMslD,EAAa,EAAG9iC,IAO/CjmB,KAAK+N,eAAe1N,IAAIL,KAAKioD,cAA7BjoD,CAA4C,YAAciC,IAExD,MAAM+S,EAAU,OAAA8M,GAAA,GAAgB7f,EAAE4S,OAAQ7U,KAAKgpD,uBAC/C,GAAgB,IAAb/mD,EAAE4Y,OACH,OAGF,GAAG7a,KAAKipD,eAAiBjpD,KAAKipD,aAAahnD,EAAG+S,GAC5C,OAGF,MAAMk0C,EAAqC,IAAIx5C,IAC/C,IAAIy5C,EAaAC,EAAcp0C,EAElB,MAAMq0C,EAAiB,CAACr0C,EAAsBs0C,GAAe,KAC3D,MAAMziD,GAAOmO,EAAQ5I,QAAQvF,IAC7B,IAAIA,IAAQmO,EAAQ5I,QAAQnF,OAAQ,OACpC,MAAMA,EAAS+N,EAAQ5I,QAAQnF,OAAO6gB,WAElC,OAAAk3B,GAAA,GAAQoK,KACVA,EAAcp0C,GAGhB,IAAIu0C,EAAUL,EAAKl5C,IAAI/I,GAKvB,GAJIsiD,GACFL,EAAKv0C,IAAI1N,EAAQsiD,EAAU,IAAI1lD,MAG7B0lD,EAAQ5hD,IAAId,GAAM,CACpB,MAAM2iD,EAAaxpD,KAAKypD,cAAcxiD,EAAQJ,GAQ9C,QAPiBnC,IAAdykD,IAEDA,GAAaK,GAGfD,EAAQlpD,IAAIwG,GAERsiD,IAAcK,IAAiBL,GAAaK,EAAa,CAC3D,MAAME,EAAa7B,GAAiBqB,GACpC,GAAGlpD,KAAKgvC,iBAAmBsa,EAAc,CACpCI,EAAa,GACX,OAAAC,GAAA,GAAc30C,EAASo0C,KACxBA,EAAcp0C,GAIlB,MAAM40C,EAAkBrB,EAAmBa,EAAap0C,GAErD40C,EAAgBznD,QACjBynD,EAAgBtjD,QAAQ0O,IACtBq0C,EAAer0C,GAAS,KAK9B,GAAIhV,KAAK8nD,aAAahoD,KAQZE,KAAKgvC,iBACbhvC,KAAKgvC,gBAAgBh6B,QARrB,GAAkB,IAAf00C,GAAoB1pD,KAAK6pD,YAC1B,IAAI,MAAO5iD,EAAQgB,KAASihD,EAC1B,IAAI,MAAMriD,KAAOoB,EACfjI,KAAK6pD,YAAY5iD,EAAQJ,MAYvC,IAAIijD,GAAoB,EACxB,MAAMzvC,EAAepY,IACf6nD,IACFrC,KACAqC,GAAoB,GAYtB,MAAM90C,EAAUhV,KAAKsoD,qBAAqBrmD,EAAE4S,QAC5C,GAAIG,EAKJ,OAAGhV,KAAK+pD,wBAA0B/pD,KAAK+pD,sBAAsB9nD,EAAG+S,EAASm0C,IACvEnpD,KAAK+N,eAAei8C,aAAahqD,KAAKioD,cAAe,YAAa5tC,QAClEra,KAAK+N,eAAei8C,aAAa9pD,SAAU,UAAWya,EAAWsvC,SAInEZ,EAAer0C,IAGX2F,EAAa1Y,IACdinD,EAAKppD,MACN,YAAiByL,OAAQmS,EAAA,EAAa,CAACoO,SAAS,EAAMnU,MAAM,EAAM2D,SAAS,IAG7Etb,KAAK+N,eAAei8C,aAAahqD,KAAKioD,cAAe,YAAa5tC,GAIlEotC,MAGIwC,EAA0B,CAACtyC,MAAM,GACvC3X,KAAK+N,eAAe1N,IAAIL,KAAKioD,cAA7BjoD,CAA4C,YAAaqa,GACzDra,KAAK+N,eAAe1N,IAAIH,SAAxBF,CAAkC,UAAW2a,EAAWsvC,KAIlD,0BAA0Bj1C,GAClC,OAAOhV,KAAKypD,cAAcz0C,EAAQ5I,QAAQnF,OAAO6gB,YAAa9S,EAAQ5I,QAAQvF,KAGtE,eAAemO,EAAsBoI,GAC7CpI,EAAQ4J,QAAQxB,EAAc5L,OAGzB,sBAAsBwD,EAAsBuL,GACjD,MAAM2pC,IAAgBlqD,KAAKmqD,4BAA4Bn1C,GACvD,GAAGuL,EAAM,CACP,GAAG2pC,EACD,OAAO,EAGT,MAAM9sC,EAAgB,IAAI,KAAc,CACtC9T,KAAM0L,EAAQ5I,QAAQvF,IACtBtE,OAAO,IAINvC,KAAK+uC,aACH/uC,KAAKoqD,0BAA0Bp1C,KAChCoI,EAAcrb,MAAM4b,SAAU,EAC9B3I,EAAQ5U,UAAUC,IAAI,gBAI1BL,KAAKqqD,eAAer1C,EAASoI,QACrB8sC,GACRlqD,KAAKmqD,4BAA4Bn1C,GAASlE,cAAcnP,SAG1D,OAAO,EAGC,4BAA4BqT,G,MACpC,MAA8C,WAAd,QAAzB,EAAAA,EAAQ6K,yBAAiB,eAAE0rB,UAChCv2B,EAAQ6K,kBAAkBA,kBAGpB,gBAAgByqC,GAAiB,GACzC,MAAMxqD,EAAOE,KAAK8nD,aAAahoD,KAC/B,IAAIA,IAASwqD,EAAgB,OAE7B,IAAIC,GAAezqD,EACjB0qD,GAAc1qD,EACd2qD,GAAY3qD,EACd,IAAI,MAAOmH,EAAQgB,KAASjI,KAAK8nD,aAAc,CAC7C,MAAMj/C,EAAU7I,KAAK8I,YAAc9I,KAAK0qD,mBAAmB3hD,4BAA4B9B,GAAUjH,KAAK0qD,mBAAmB1hD,mBAAmB/B,GAC5I,IAAI,MAAMJ,KAAOoB,EAAM,CACrB,MAAM7D,EAAUpE,KAAK0qD,mBAAmBC,sBAAsB9hD,EAAShC,GAOvE,GANI0jD,GACCnmD,EAAQG,SACTgmD,GAAc,IAIdC,EAAY,CACIxqD,KAAK0qD,mBAAmBE,iBAAiBxmD,KAEzDomD,GAAa,GAIjB,GAAGD,GAAeC,EAAY,MAGhC,GAAGD,GAAeC,EAAY,MAGhCxqD,KAAK6qD,mBAAqB7qD,KAAK6qD,kBAAkBN,EAAaC,EAAYC,GAGrE,gBAAgBK,GAAmB,EAAMR,GAAiB,GAC/D,MAAMS,EAAe/qD,KAAK+uC,YACpBjvC,EAAOE,KAAK8nD,aAAahoD,KAG/B,GAFAE,KAAK+uC,cAAgBjvC,GAAQwqD,EAE1BS,IAAiB/qD,KAAK+uC,YAAa,OAAO,EAYzC,wBACF/uC,KAAKioD,cAAc7nD,UAAUkM,OAAO,YAAatM,KAAK+uC,aAEnDgc,GAEDtD,MAaJ,OAAAuD,GAAA,KAEA,MAAMC,IAAanrD,GAAQwqD,EAoB3B,OAnBAtqD,KAAKkrD,mBAAqBlrD,KAAKkrD,kBAAkBD,GAE7C,sBACCA,EACDl8C,EAAA,EAAwBoB,SAAS,CAC/BhN,KAAMnD,KAAKiP,eACXmB,MAAO,KACLpQ,KAAKynD,qBAIT14C,EAAA,EAAwB6B,aAAa5Q,KAAKiP,iBAI3Cq7C,GACDtqD,KAAKmrD,gBAAgBb,IAGhB,EAUF,UACLtqD,KAAK8nD,aAAa39C,QAClBnK,KAAKgoD,iBAAgB,GAGb,uBAAuBhzC,EAAsBw0C,GACrDxpD,KAAKorD,sBAAsBp2C,GAAS,GACtBhV,KAAKmqD,4BAA4Bn1C,GACzC2I,QAAU6rC,EAEhBxpD,KAAKgoD,kBACLhoD,KAAKmrD,kBACL,aAAcn2C,EAAS,cAAew0C,EAAY,KAG7C,cAAcviD,EAAgBJ,GACnC,MAAM8N,EAAM3U,KAAK8nD,aAAa93C,IAAI/I,GAClC,OAAO0N,aAAG,EAAHA,EAAKhN,IAAId,GAGX,SACL,OAAOghD,GAAiB7nD,KAAK8nD,cAGrB,UAAU7gD,EAAgBJ,EAAawkD,GAC/C,IAAI12C,EAAM3U,KAAK8nD,aAAa93C,IAAI/I,GAChC,GAAGokD,QAA0B3mD,IAAb2mD,IAA0B12C,aAAG,EAAHA,EAAKhN,IAAId,IAC9C8N,IACDA,EAAItG,OAAOxH,GAEP8N,EAAI7U,MACNE,KAAK8nD,aAAaz5C,OAAOpH,QAGxB,CAEL,GADa2B,EAAA,QAAU0iD,OAAOC,oBAAsBvrD,KAAKmC,SAAW,EAC1D,EAER,OADA+yB,GAAM,UAAKlc,OAAO,6BAA6B,KACxC,EAgBLrE,IACFA,EAAM,IAAI9Q,IACV7D,KAAK8nD,aAAanzC,IAAI1N,EAAQ0N,IAGhCA,EAAItU,IAAIwG,GAGV,OAAO,EAMF,mBAAmBI,EAAgBgB,GACxC,MAAM0M,EAAM3U,KAAK8nD,aAAa93C,IAAI/I,GAC9B0N,IAIJ1M,EAAK3B,QAAQO,IACX8N,EAAItG,OAAOxH,KAGT8N,EAAI7U,MACNE,KAAK8nD,aAAaz5C,OAAOpH,GAG3BjH,KAAKmrD,kBACLnrD,KAAKgoD,oBAIF,MAAM,WAAwB,GASnC,YAAoBxa,EAA6Bkd,GAC/CznD,MAAM,CACJynD,qBACAzC,cAAeza,EAAYvtC,UAC3B8N,eAAgB,IAAI,IACpBk7C,aAAc,CAAChnD,EAAG4S,MAAaA,GAAU7U,KAAK+uC,YAC9CuZ,qBAAuBzzC,GAAW,OAAAiN,GAAA,GAAgBjN,EAAQ,qBAC1Dm0C,sBAAuB,oBACvBH,6BAA8B,WAC9BC,2BAA4B,uBATZ,KAAAtb,cAsCb,KAAAwB,gBAAmBh6B,IACxB,MAAMnO,GAAOmO,EAAQ5I,QAAQvF,IACvBI,EAAS+N,EAAQ5I,QAAQnF,OAAO6gB,WAElC9nB,KAAKwrD,UAAUvkD,EAAQJ,IAI3B7G,KAAKyrD,uBAAuBz2C,EAAShV,KAAKypD,cAAcxiD,EAAQJ,KAG3D,KAAAgjD,YAAc,CAAC5iD,EAAgBJ,KACpC,MAAMmO,EAAUhV,KAAKwtC,YAAYY,SAASsd,WAAW77C,cAAc,oCAAoC5I,iBAAsBJ,OAC7H7G,KAAKgvC,gBAAgBh6B,IAGb,KAAA61C,kBAAoB,CAACN,EAAsBC,EAAqBC,KACxE,MAAMtoD,EAASnC,KAAKmC,SACpB,OAAAoK,EAAA,GAAevM,KAAK2rD,iBAAkB,eAAK,WAAY,CAACxpD,KACxDnC,KAAK4rD,iBAAiBxrD,UAAUkM,OAAO,OAAmB,IAAXnK,GAC/CnC,KAAK6rD,oBAAoBzrD,UAAUkM,OAAO,OAAQi+C,GAClDvqD,KAAK8rD,oBAAsB9rD,KAAK8rD,mBAAmB1rD,UAAUkM,OAAO,OAAQk+C,IAGpE,KAAAU,kBAAqBD,IAc7B,GAbA,aAAcjrD,KAAKwtC,YAAYue,uBAAwB,eAAgBd,EAAU,IAAK,KAChFjrD,KAAK+uC,cACP/uC,KAAKgsD,mBAAmBrqD,SACxB3B,KAAKgsD,mBACHhsD,KAAK6rD,oBACL7rD,KAAK8rD,mBACL,KACF9rD,KAAKkoD,kBAAexjD,KAIxB,aAAc1E,KAAKwtC,YAAYvtC,UAAW,eAAgBgrD,EAAU,KAEjEjrD,KAAK+uC,cACF/uC,KAAKgsD,mBAAoB,CAC3B,MAAM1jB,EAAa,yBACnBtoC,KAAKgsD,mBAAqB9rD,SAASC,cAAc,OACjDH,KAAKgsD,mBAAmB5rD,UAAUC,IAAIioC,EAAa,cAEnD,MAAM2jB,EAAY,EAAW,SAAS3jB,WAAqB,CAAC36B,UAAU,IACtE3N,KAAK+N,eAAe1N,IAAI4rD,EAAxBjsD,CAAmC,QAASA,KAAKynD,gBAAiB,CAAC9vC,MAAM,IAEzE3X,KAAK2rD,iBAAmBzrD,SAASC,cAAc,OAC/CH,KAAK2rD,iBAAiBvrD,UAAUC,IAAIioC,EAAa,UAEjDtoC,KAAK4rD,iBAAmB,EAAW,WAAWtjB,UAE9C,MAAM4jB,EAAyC,CAACn+C,eAAgB/N,KAAK+N,gBACrE,YAAiB/N,KAAK4rD,iBAAkB,KACtC,MAAM3kD,EAAS,IAAIjH,KAAK8nD,aAAaqE,QAAQ,GACvCtlD,EAAM,IAAI7G,KAAK8nD,aAAa93C,IAAI/I,IAAS,GAC/CjH,KAAKynD,kBAEL7+C,EAAA,QAAU6F,cAAc,gBAAiB,CACvCxH,SACAJ,SAEDqlD,GAEHlsD,KAAK6rD,oBAAsB,EAAW,WAAWvjB,aACjD,YAAiBtoC,KAAK6rD,oBAAqB,KACzC,MAAM9jD,EAAwC,GAC9C,IAAI,MAAOqkD,EAAYnkD,KAASjI,KAAK8nD,aACnC//C,EAAIqkD,GAAcjkD,MAAMC,KAAKH,GAAMI,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAGxD,IAAI,GAAaR,EAAK,KACpB/H,KAAKynD,qBAENyE,GAEAlsD,KAAKqsD,YACNrsD,KAAK8rD,mBAAqB,EAAW,iBAAiBxjB,YACtD,YAAiBtoC,KAAK8rD,mBAAoB,KACxC,MAAM7kD,EAAS,IAAIjH,KAAK8nD,aAAaqE,QAAQ,GAC7C,IAAI,GAAoBllD,EAAQ,IAAIjH,KAAK8nD,aAAa93C,IAAI/I,IAAU,OAAQ,KAC1EjH,KAAKynD,qBAENyE,IAGLlsD,KAAKgsD,mBAAmBjiD,UAAU,CAChCkiD,EACAjsD,KAAK2rD,iBACL3rD,KAAK4rD,iBACL5rD,KAAK6rD,oBACL7rD,KAAK8rD,oBACLlkD,OAAOc,UAET,MAAM4jD,EAAoBtsD,KAAKgsD,mBAC/BM,EAAkB3pD,MAAM4pD,QAAU,IAClCvsD,KAAKwtC,YAAYue,uBAAuBhiD,OAAOuiD,GAE1CA,EAAkB1iB,WACvB0iB,EAAkB3pD,MAAM4pD,QAAU,KA7HtCvsD,KAAKqsD,WAAa7e,EAAYtlB,WAazB,gBAAgB4iC,GAAmB,EAAMR,GAAiB,GAC/D,MAAM/jB,EAAMtjC,MAAM+kD,gBAAgB8C,EAAkBR,GAEpD,GAAG/jB,GAAOukB,EAAkB,CACT3iD,MAAMC,KAAKpI,KAAKwtC,YAAY79B,cAAcG,iBAAiB,uBACnExJ,QAAQ0O,IACfhV,KAAKorD,sBAAsBp2C,EAAShV,KAAK+uC,eAI7C,OAAOxI,GA4GI,MAAM,WAAsB,GAQzC,YAAoBxZ,EAAoBC,EAA8BjrB,EAAkB2oD,GACtFznD,MAAM,CACJynD,qBACAzC,cAAej7B,EAAQ8pB,iBACvB/oC,eAAgBif,EAAQjf,eACxBu6C,qBAAuBzzC,GAAW,OAAAiN,GAAA,GAAgBjN,EAAQ,iBAAmB,OAAAiN,GAAA,GAAgBjN,EAAQ,UACrGo0C,aAAc,CAAChnD,EAAG4S,OAGH7U,KAAK8nD,aAAahoD,OACxBmC,EAAE4S,OAAuBzU,UAAUuR,SAAS,YAC5C1P,EAAE4S,OAAuBzU,UAAUuR,SAAS,uBAC9CkD,GAIPk1C,sBAAuB,CAAC9nD,EAAG+S,EAASm0C,MACtBlnD,EAAE4S,SAAWG,IACrB/S,EAAE4S,OAAuBzU,UAAUuR,SAAS,4BAChCjN,IAAdykD,IACCnpD,KAAK8nD,aAAahoD,MAGvBuoD,qBAAsB,KAAOroD,KAAK+sB,KAAKhrB,MAAMyqD,UAC7CxD,sBAAuB,SACvBH,6BAA8B,gBAC9BC,2BAA4B,qDAC5BhgD,YAA2B,cAAdikB,EAAK5pB,OA3BF,KAAA4pB,OAAoB,KAAAC,UAA8B,KAAAjrB,QAoE/D,KAAAitC,gBAAmByd,IACxB,IAAIzsD,KAAK0sD,gBAAgBD,GAAS,OAElC,MAAM5lD,GAAO4lD,EAAOrgD,QAAQvF,IAG5B,GADkB4lD,EAAOrsD,UAAUuR,SAAS,cAC9B,CACZ,IAAI3R,KAAK2sD,wBAAwBF,GAAS,CACxC,MAAM93C,EAAM3U,KAAK8nD,aAAa93C,IAAIhQ,KAAKgtB,QAAQ/lB,QAC/C,GAAG0N,EAAK,CACO3U,KAAK+sB,KAAK6/B,aAAa/lD,GAC/BP,QAAQO,GAAO8N,EAAItG,OAAOxH,KAKnC,YADA7G,KAAKgtB,QAAQ6/B,sBAAsBJ,GAAQnmD,QAAQtG,KAAKgvC,iBAI1D,IAAIhvC,KAAKwrD,UAAUxrD,KAAKgtB,QAAQ/lB,OAAQJ,GACtC,OAIF,GADsB4lD,EAAOrsD,UAAUuR,SAAS,gBAC9B,CAChB,MAAMm7C,EAAiB,OAAAhrC,GAAA,GAAgB2qC,EAAQ,UACzCM,EAAoB/sD,KAAK2sD,wBAAwBG,GACjDE,EAAwBhtD,KAAKgtD,sBAAsBnmD,IAEtCmmD,GAAyBD,IAE1C/sD,KAAKyrD,uBAAuBqB,EAAgBE,GAIhDhtD,KAAKyrD,uBAAuBgB,EAAQzsD,KAAKypD,cAAczpD,KAAKgtB,QAAQ/lB,OAAQJ,KAGpE,KAAAgjD,YAAc,CAAC5iD,EAAgBJ,KACvC,MAAMomD,EAAUjtD,KAAKgtB,QAAQkgC,iBAAiBrmD,GAC3ComD,GACDjtD,KAAKgvC,gBAAgBie,EAAQR,SA6CvB,KAAAvB,kBAAqBD,IAC7B,IAAItuC,EAAY,GAAIwwC,EAAe,GACnC,GAAGlC,EAAU,CACX,MAAMtzB,EAAI33B,KAAK+B,MAAMqrD,YAAYt8C,cAC3Bu8C,EAAuB11B,EAAE9nB,cAAc,2BACvCy9C,EAAkB31B,EAAE9nB,cAAc,sBAClC09C,EAAoBF,EAAqBvxC,wBACzC0xC,EAAeF,EAAgBxxC,wBAC/B2xC,EAAYD,EAAa9sD,MACzBgtD,EAAUH,EAAkB7sD,MAElC,GAAG+sD,IAAcC,EAAS,CACxB,MAAMC,EAAQ,EAAsBF,EAC9BG,GAAkBH,EAAYC,GAAW,EAI/C,GAFA/wC,EAAY,cADW4wC,EAAkBxwC,KAAOywC,EAAazwC,KAAO6wC,eACdD,KAEnDA,EAAQ,EAAG,CACZ,MAAME,EAAK,GACXV,EAAqBU,EAAKA,GAAM,EAAIF,GAAU,OA4BpD,GAtBA,aAAc3tD,KAAK+B,MAAMqrD,YAAa,eAAgBnC,EAAU,KAChEjrD,KAAK+B,MAAMqrD,YAAYzqD,MAAMga,UAAYA,EACzC3c,KAAK+B,MAAMqrD,YAAYzqD,MAAMwqD,aAAeA,EAC5C,aAAcntD,KAAKioD,cAAe,eAAgBgD,EAAU,IAAK,KAC3DjrD,KAAK+uC,cACP/uC,KAAK8tD,sBAAsBnsD,SAC3B3B,KAAK8tD,sBACH9tD,KAAKgsD,mBACLhsD,KAAK+tD,oBACL/tD,KAAK6rD,oBACL7rD,KAAK8rD,mBACL,KACF9rD,KAAKkoD,kBAAexjD,GAGtB,aAAQ,KACN1E,KAAKgtB,QAAQwV,eAMdxiC,KAAK+uC,cACF/uC,KAAKgsD,mBAAoB,CAC3BhsD,KAAK8tD,sBAAwB5tD,SAASC,cAAc,OACpDH,KAAK8tD,sBAAsB1tD,UAAUC,IAAI,qBAAsB,qBAE/DL,KAAKgsD,mBAAqB9rD,SAASC,cAAc,OACjDH,KAAKgsD,mBAAmB5rD,UAAUC,IAAI,uBAEtC,MAAM6rD,EAAyC,CAACn+C,eAAgB/N,KAAK+N,gBAC/Dk+C,EAAY,EAAW,QAAS,CAACt+C,UAAU,IACjD,YAAiBs+C,EAAWjsD,KAAKynD,gBAAiB,CAAC9vC,MAAM,EAAM5J,eAAgB/N,KAAK+N,iBAEpF/N,KAAK2rD,iBAAmBzrD,SAASC,cAAc,OAC/CH,KAAK2rD,iBAAiBvrD,UAAUC,IAAI,6BAEd,cAAnBL,KAAK+sB,KAAK5pB,MACXnD,KAAK+tD,oBAAsB,YAAO,2EAA4E,CAAC1gD,KAAM,UACrHrN,KAAK+tD,oBAAoBhkD,OAAO,eAAK,wBACrC,YAAiB/J,KAAK+tD,oBAAqB,KACzC,IAAI,GAAa/tD,KAAKgtB,QAAQ/lB,OAAQ,IAAIjH,KAAK8nD,aAAa93C,IAAIhQ,KAAKgtB,QAAQ/lB,SAAU,KACrFjH,KAAKynD,qBAENyE,KAEHlsD,KAAK6rD,oBAAsB,YAAO,oEAAqE,CAACx+C,KAAM,YAC9GrN,KAAK6rD,oBAAoB9hD,OAAO,eAAK,YACrC,YAAiB/J,KAAK6rD,oBAAqB,KACzC,MAAM9jD,EAAwC,GAC9C,IAAI,MAAOqkD,EAAYnkD,KAASjI,KAAK8nD,aACnC//C,EAAIqkD,GAAcjkD,MAAMC,KAAKH,GAAMI,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAGxD,IAAI,GAAaR,EAAK,KACpB/H,KAAKynD,qBAENyE,IAGLlsD,KAAK8rD,mBAAqB,YAAO,0EAA2E,CAACz+C,KAAM,WACnHrN,KAAK8rD,mBAAmB/hD,OAAO,eAAK,WACpC,YAAiB/J,KAAK8rD,mBAAoB,KACxC,IAAI,GAAoB9rD,KAAKgtB,QAAQ/lB,OAAQ,IAAIjH,KAAK8nD,aAAa93C,IAAIhQ,KAAKgtB,QAAQ/lB,SAAUjH,KAAK+sB,KAAK5pB,KAAM,KAC5GnD,KAAKynD,qBAENyE,GAEHlsD,KAAKgsD,mBAAmBjiD,UAAU,CAChCkiD,EACAjsD,KAAK2rD,iBACL3rD,KAAK+tD,oBACL/tD,KAAK6rD,oBACL7rD,KAAK8rD,oBACLlkD,OAAOc,UAET1I,KAAK8tD,sBAAsBnrD,MAAM4pD,QAAU,IAC3CvsD,KAAK8tD,sBAAsB/jD,OAAO/J,KAAKgsD,oBACvChsD,KAAK+B,MAAMqrD,YAAYt8C,cAAc/G,OAAO/J,KAAK8tD,uBAE5C9tD,KAAK8tD,sBAAsBlkB,WAChC5pC,KAAK8tD,sBAAsBnrD,MAAM4pD,QAAU,KAKvC,KAAA1B,kBAAoB,CAACN,EAAsBC,EAAqBC,KACxE,OAAAl+C,EAAA,GAAevM,KAAK2rD,iBAAkB,eAAK,WAAY,CAAC3rD,KAAKmC,YAC7DnC,KAAK+tD,qBAAuB/tD,KAAK+tD,oBAAoBr7B,gBAAgB,WAAY+3B,GACjFzqD,KAAK6rD,qBAAuB7rD,KAAK6rD,oBAAoBn5B,gBAAgB,WAAY63B,GACjFvqD,KAAK8rD,mBAAmBp5B,gBAAgB,WAAY83B,IAG5C,KAAAzC,kBAAoB,KAC5B,IAAI,MAAO9gD,EAAQgB,KAASjI,KAAK8nD,aAC/B,IAAI,MAAMjhD,KAAOoB,EAAM,CACrB,MAAMglD,EAAUjtD,KAAKgtB,QAAQkgC,iBAAiBrmD,GAC3ComD,GAEDjtD,KAAKgvC,gBAAgBie,EAAQR,UAvP9B,eAAeA,EAAqBrvC,GACzCA,EAAc5L,MAAMpR,UAAUC,IAAI,0BAE/BosD,EAAOrsD,UAAUuR,SAAS,sBAC3B86C,EAAO58C,cAAc,4BAA4B9F,OAAOqT,EAAc5L,OAEtEvO,MAAMonD,eAAeoC,EAAQrvC,GAI1B,gBAAgB0tC,GAAmB,EAAMR,GAAiB,GAC/D,MAAM/jB,EAAMtjC,MAAM+kD,gBAAgB8C,EAAkBR,GAEpD,GAAG/jB,GAAOukB,EACR,IAAI,MAAMjkD,KAAO7G,KAAKgtB,QAAQA,QAAS,CACrC,MAAMy/B,EAASzsD,KAAKgtB,QAAQA,QAAQnmB,GACpC7G,KAAKorD,sBAAsBqB,EAAQzsD,KAAK+uC,aAI5C,OAAOxI,EAGF,sBAAsBkmB,EAAqBlsC,GAChD,IAAIvgB,KAAK0sD,gBAAgBD,GAAS,OAElC,MAAMlmB,EAAMtjC,MAAMmoD,sBAAsBqB,EAAQlsC,GAChD,GAAGgmB,EAAK,CACYkmB,EAAOrsD,UAAUuR,SAAS,eAE1C3R,KAAKgtB,QAAQ6/B,sBAAsBJ,GAAQnmD,QAAQb,GAAQzF,KAAKorD,sBAAsB3lD,EAAM8a,IAIhG,OAAOgmB,EAgDF,0BAA0BvxB,GAC/B,MAAMg5C,EAAYh5C,EAAQ5U,UAAUuR,SAAS,cAC7C,OAAO1O,MAAMmnD,0BAA0Bp1C,MAAcg5C,GAAahuD,KAAKgtD,uBAAuBh4C,EAAQ5I,QAAQvF,MAGtG,wBAAwB4lD,GAChC,MAAMwB,EAAuBjuD,KAAKmqD,4BAA4BsC,GAC9D,OAAOwB,aAAoB,EAApBA,EAAsBtwC,QAGrB,sBAAsB9W,GAC9B,MAAMoB,EAAOjI,KAAK+sB,KAAK6/B,aAAa/lD,GAC9BihD,EAAe7/C,EAAKL,OAAOf,GAAO7G,KAAKypD,cAAczpD,KAAKgtB,QAAQ/lB,OAAQJ,IAChF,OAAOoB,EAAK9F,SAAW2lD,EAAa3lD,OAG5B,4BAA4BsqD,GAgBpC,OAAOA,EAAOrsD,UAAUuR,SAAS,sBAC/B86C,EAAO58C,cAAc,eACrB5M,MAAMknD,4BAA4BsC,GAG/B,gBAAgBA,GACrB,OAAQA,EAAOrsD,UAAUuR,SAAS,aAAe86C,EAAOrsD,UAAUuR,SAAS,gBAAkB86C,EAAOrsD,UAAUuR,SAAS,iB,2SEpuB3H,MAAM,GAQJ,YACUu8C,EACA1gB,GADA,KAAA0gB,WACA,KAAA1gB,cAkGF,KAAA2gB,YAAc,KACpBvlD,EAAA,QAAU6F,cAAc,gBAAiB,CACvCxH,OAAQjH,KAAKiH,OACbJ,IAAK7G,KAAK6G,IACViE,SAAU9K,KAAKwtC,YAAYxmC,cAAc8D,YAIrC,KAAAsjD,eAAiB,KACpBpuD,KAAKwtC,YAAYsB,UAAUC,YAC5B,YAAmB/uC,KAAKwtC,YAAYsB,UAAU+c,qBAE9C,IAAI,GAAa,CACf,CAAC7rD,KAAKiH,QAAS,CAACjH,KAAK6G,QAKnB,KAAAwnD,cAAgB,KACtBruD,KAAKwtC,YAAYsB,UAAUE,gBAAgBhvC,KAAK6U,SAG1C,KAAAy5C,sBAAwB,KAC9BtuD,KAAKwtC,YAAYsB,UAAU2Y,mBAGrB,KAAA8G,cAAgB,KACnBvuD,KAAKwtC,YAAYsB,UAAUC,YAC5B,YAAmB/uC,KAAKwtC,YAAYsB,UAAUgd,oBAE9C,IAAI,GAAoB9rD,KAAKiH,OAAQ,CAACjH,KAAK6G,KAAM,SA9HnD,MAAM2nD,EAAiBvsD,IAMrB,IAAIwD,EALDzF,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAId,IACEzI,EAAO,OAAAqc,GAAA,GAAgB7f,EAAE4S,OAAQ,qBACjC,MAAM5S,IAER,GAAIwD,EAAJ,CAGA,GADGxD,aAAawkB,YAAYxkB,EAAE8Y,iBAC3B/a,KAAKgV,QAAQ5U,UAAUuR,SAAS,UACjC,OAAO,EAEN1P,aAAawkB,aAAYxkB,EAAEwsD,cAAe,GAE7CzuD,KAAK6U,OAASpP,EACdzF,KAAKiH,OAASxB,EAAK2G,QAAQnF,OAAO6gB,WAClC9nB,KAAK6G,KAAOpB,EAAK2G,QAAQvF,IACzB7G,KAAKwpD,WAAahc,EAAYsB,UAAU2a,cAAczpD,KAAKiH,OAAQjH,KAAK6G,KAExE7G,KAAK4d,QAAQtX,QAAQuU,IACnB,IAAIqH,EAGFA,IADCliB,KAAKwpD,aAAe3uC,EAAO6zC,kBAGrB7zC,EAAO9F,QAAS8F,EAAO9F,UAGhC8F,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAAS4V,KAG3Czc,EAAKrF,UAAUC,IAAI,aAEnB,aAAa4B,EAAGjC,KAAKgV,SACrB,aAAYhV,KAAKgV,QAAS,KACxBvP,EAAKrF,UAAUuB,OAAO,iBAIvB,uBAGD,aAA0BusD,EAAUM,GAIhC,OACNxuD,KAAK4d,QAAU,CAAC,CACdvQ,KAAM,UACN6P,KAAM,UACNC,QAASnd,KAAKouD,gBACb,CACD/gD,KAAM,UACN6P,KAAM,oCACNC,QAASnd,KAAKouD,eACdr5C,OAAQ,IAAM/U,KAAKwpD,aAChBxpD,KAAKwtC,YAAYsB,UAAU+c,oBAAoBzrD,UAAUuR,SAAS,QACrE+8C,eAAe,GACd,CACDrhD,KAAM,UACN6P,KAAM,uBACNC,QAASnd,KAAKmuD,YACdO,eAAe,GACd,CACDrhD,KAAM,SACN6P,KAAM,yBACNC,QAASnd,KAAKquD,eACb,CACDhhD,KAAM,SACN6P,KAAM,kCACNC,QAASnd,KAAKsuD,sBACdv5C,OAAQ,IAAM/U,KAAKwpD,WACnBkF,eAAe,GACd,CACDrhD,KAAM,gBACN6P,KAAM,SACNC,QAASnd,KAAKuuD,cACdx5C,OAAQ,IAAM,IAAmB61C,iBAAiB,IAAmBpxC,iBAAiBxZ,KAAKiH,OAAQjH,KAAK6G,OACvG,CACDwG,KAAM,gBACN6P,KAAM,mCACNC,QAASnd,KAAKuuD,cACdx5C,OAAQ,IAAM/U,KAAKwpD,aAAexpD,KAAKwtC,YAAYsB,UAAUgd,mBAAmB1rD,UAAUuR,SAAS,QACnG+8C,eAAe,IAGjB1uD,KAAKgV,QAAU,GAAWhV,KAAK4d,SAC/B5d,KAAKgV,QAAQ5U,UAAUC,IAAI,qBAAsB,eACjDH,SAASuvC,eAAe,cAAc1lC,OAAO/J,KAAKgV,UAsCvC,MAAM,GA8DnB,YAAYhS,GA7DL,KAAAoL,KAAiD,GAUhD,KAAAugD,WAAa,EAEb,KAAAhkC,cAAgB,IAAI,KACrB,KAAAiC,WAAa,eAEb,KAAAyiB,eAAwF,GACxF,KAAAT,gBAAgE,GAChE,KAAAggB,aAAyB,GAGzB,KAAA1f,UAA0BrsC,QAAQoD,UAEjC,KAAA4oD,UAA0D,GAC1D,KAAApkC,aAAoE,GACpE,KAAAoP,OAAwD,GACxD,KAAAi1B,aAAc,EACd,KAAAC,WAAY,EAEZ,KAAAC,IAAM,OAAAC,EAAA,GAAO,gBAGb,KAAAC,gBAOH,GAIE,KAAAC,aAA+D,IAAIz/C,IAUnE,KAAA0/C,YAAc,EACd,KAAAC,cAAgB,EAChB,KAAAC,eAAiB,EAEjB,KAAApnC,YAAc,EAkQb,KAAAqnC,kBAAoB,KAC1BvvD,KAAKC,UAAUG,UAAUC,IAAI,YAGvB,KAAAmvD,gBAAkB,KACxBxvD,KAAKC,UAAUG,UAAUuB,OAAO,YAjQhC,YAAW3B,KAAMgD,GAEjBhD,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,gBAE7BL,KAAKyvD,kBAAoB,IAAI,GAAkBzvD,KAAKC,UAAWD,MAC/DA,KAAK8uC,UAAY,IAAI,GAAgB9uC,KAAM,KAE3C,MAAM+rD,EAAyB/rD,KAAK+rD,uBAAyB7rD,SAASC,cAAc,OACpF4rD,EAAuB3rD,UAAUC,IAAI,+BAAgC,6BAA8B,UAEnG,MAAMqvD,EAAgB1vD,KAAK0vD,cAAgB,IAAI,IAAY3D,GAC3D2D,EAAczvD,UAAUG,UAAUC,IAAI,+BAEtC,MAAMotC,EAAMztC,KAAKytC,IAAMvtC,SAASC,cAAc,OAC9CstC,EAAIrtC,UAAUC,IAAI,oBAAqB,uBACvCL,KAAK2vD,SAAWliB,EAEhBiiB,EAAczvD,UAAU8J,OAAO0jC,GAE/B,IAAI,MAAMW,KAAYpuC,KAAKkuC,UAAW,CACpC,MAAM0hB,EAAU1vD,SAASC,cAAc,OACvCyvD,EAAQxvD,UAAUC,IAAI,4BACtB,MAAMwvD,EAAO3vD,SAASC,cAAc,QAC9B6K,EAAI9K,SAASC,cAAc,KAEjC0vD,EAAK9lD,OAAO,eAAKqkC,EAAS9kC,OAC1BumD,EAAK9lD,OAAOiB,GAEZ4kD,EAAQ7lD,OAAO8lD,GAEf,OAAAvyC,GAAA,QAAOsyC,GAEP5vD,KAAK2vD,SAAS5lD,OAAO6lD,GAErB5vD,KAAKmvD,aAAax6C,IAAIy5B,EAASjrC,KAAMirC,GAErCA,EAASwhB,QAAUA,EAMrB,IAAIE,EAHJ9vD,KAAK2P,cAAgBzP,SAASC,cAAc,OAC5CH,KAAK2P,cAAcvP,UAAUC,IAAI,8BAA+B,kBAG7D,uBACDumD,GAAe,CACb5xC,QAAShV,KAAK2P,cACdu4B,QAAS,CAACL,EAAOC,EAAO7lC,KACtB,MAAM8tD,EAAS/vD,KAAKmO,UAAU4hD,SACxBhqC,EAAW5d,MAAMC,KAAKpI,KAAK2vD,SAAS5pC,UAC1C,IAAI1hB,EACJ,GAAGwjC,EAAQ,GACT,IAAI,IAAI78B,EAAI+kD,EAAS,EAAG/kD,EAAI+a,EAAS5jB,SAAU6I,EAC7C,IAAI+a,EAAS/a,GAAG5K,UAAUuR,SAAS,QAAS,CAC1CtN,EAAM2G,EACN,YAIJ,IAAI,IAAIA,EAAI+kD,EAAS,EAAG/kD,GAAK,IAAKA,EAChC,IAAI+a,EAAS/a,GAAG5K,UAAUuR,SAAS,QAAS,CAC1CtN,EAAM2G,EACN,WAKKtG,IAARL,IACDyrD,EC1VG,SAAyB7vD,GACtC,MAAM6a,EAAe7Y,IACnB,OAAAyb,EAAA,GAAYzb,IAGd,IAAI+tD,EAAU,EACd,MAAMhY,EAAK,OACHgY,GACJ/vD,EAAUoJ,oBAAoB,YAAayR,EAAa,CAACgR,SAAS,KAOtE,OAHA7rB,EAAUe,iBAAiB,YAAa8Z,EAAa,CAACgR,SAAS,EAAMxQ,SAAS,IAC9Erb,EAAUe,iBAAiB,WAAYg3C,EAAI,CAACrgC,MAAM,IAE3CqgC,ED2UkBiY,CAAgBjwD,KAAK2P,eACpC3P,KAAKmO,UAAU9J,OAMvB,IAAI,MAAM+pC,KAAYpuC,KAAKkuC,UAAW,CACpC,MAAMjuC,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAUC,IAAI,0BAA4B+tC,EAASjrC,KAAM,YAEnE,MAAM0K,EAAU3N,SAASC,cAAc,OACvC0N,EAAQzN,UAAUC,IAAI,wBAA0B+tC,EAASjrC,MAEzDlD,EAAU8J,OAAO8D,GAEjB7N,KAAK2P,cAAc5F,OAAO9J,GAE1BD,KAAKoO,KAAKggC,EAASjnC,aAAe0G,EAElCugC,EAASsd,WAAa79C,EAGxB7N,KAAKC,UAAU8J,OAAOgiD,EAAwB/rD,KAAK2P,eAInD3P,KAAKkwD,iBAAmB,IAAI,GAAY,EAAO,YAAY,GAE3DlwD,KAAK+K,WAAWM,iBAAmB,KAC9BrL,KAAKouC,SAASsd,YAAc1rD,KAAKouC,SAASsd,WAAWzhD,mBAEtDjK,KAAK8F,MAAK,IAKd9F,KAAKmO,UAAY,OAAAgiD,EAAA,GAAenwD,KAAK2vD,SAAU3vD,KAAK2P,cAAe,CAACR,EAAIihD,EAAYhhD,KAClF,GAAGpP,KAAK2uD,YAAcx/C,IAAOnP,KAAKqwD,WAEhC,YADArwD,KAAK+K,WAAW8zB,kBAAkB7+B,KAAKC,UAAW,SAIpD,MAAMqwD,EAActwD,KAAKkuC,UAAU/+B,GAChCnP,KAAKmuC,aACNnuC,KAAKmuC,YAAYmiB,GAGnB,MAAMC,EAAevwD,KAAKouC,SAO1B,GANApuC,KAAKouC,SAAWkiB,GAEO,IAApBtwD,KAAK2uD,WAAoBv/C,GAC1BpP,KAAKuvD,oBAGJvvD,KAAKqwD,WACNrwD,KAAKqwD,YAAa,MACb,CACL,MAAMG,EAAYxwD,KAAKC,UAAUuwD,UACjC,IAAIrnB,EAAYnpC,KAAK+K,WAAWo+B,UAQhC,GAPGA,EAAYqnB,IACbxwD,KAAK+K,WAAW8zB,kBAAkB7+B,KAAKC,UAAW,SAClDkpC,EAAYqnB,GAGdD,EAAa5xB,OAAS,CAACwK,UAAWA,EAAWsnB,aAAczwD,KAAK+K,WAAW0lD,mBAEjD/rD,IAAvB4rD,EAAY3xB,OAAsB,CACnC,MAAM9iB,EAAO7b,KAAKC,UAAU6b,wBACtB40C,EAAQ1wD,KAAKC,UAAU6Q,cAAcgL,wBACrC0V,EAAO3V,EAAKpB,EAAIi2C,EAAMj2C,EAEzB0uB,EAAY3X,IACb8+B,EAAY3xB,OAAS,CAACwK,UAAW3X,EAAMi/B,aAAc,IAIzD,GAAGH,EAAY3xB,OAAQ,CACrB,MAAMnN,EAAO++B,EAAa5xB,OAAOwK,UAAYmnB,EAAY3xB,OAAOwK,UAI7D3X,IAKC8+B,EAAY5E,WAAW/oD,MAAMga,UAAY,cAAc6U,UAaxC,IAApBxxB,KAAK2uD,WAAqB2B,EAAY5E,WAAWzhD,mBAElDjK,KAAK8F,MAAK,GAGZ9F,KAAK2uD,UAAYx/C,GAChB,KACDnP,KAAK+K,WAAWy3B,gBAGY99B,IAAzB1E,KAAKouC,SAASzP,SACf3+B,KAAKouC,SAASsd,WAAW/oD,MAAMga,UAAY,GAC3C3c,KAAK+K,WAAWo+B,UAAYnpC,KAAKouC,SAASzP,OAAOwK,WAGhD2mB,IACDA,IACAA,OAAeprD,GAGjB1E,KAAKwvD,wBACJ9qD,EAAWgrD,GAEd,YAAiB1vD,KAAK2P,cAAgB1N,IACjCjC,KAAK8uC,UAAUC,cAChB,OAAArxB,EAAA,GAAYzb,GACZjC,KAAK8uC,UAAUE,gBAAgB,OAAAltB,GAAA,GAAgB7f,EAAE4S,OAAQ,wBAE1D,CAACiX,SAAS,EAAMxQ,SAAS,IAE5B,MAAMq1C,EAAe,CAACnnD,EAAmBonD,EAAyBzpD,EAAoClF,KACpG,MAAM4S,EAAS,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAA0BrL,GAC3D,IAAIqL,EAAQ,OAEZ,MAAMhO,GAAOgO,EAAOzI,QAAQvF,IAC5B,IAAIA,EAEF,YADA7G,KAAKgvD,IAAIp4C,KAAK,mCAAoC/B,GAIpD,MAAM5N,EAAS4N,EAAOzI,QAAQnF,OAAO6gB,WAE/Btf,EAAWL,MAAMC,KAAKpI,KAAKoO,KAAKjH,GAAa2I,iBAAiB,IAAM8gD,IAAoCnoD,IAAIsH,IAChH,MAAMyuB,EAAc,OAAA1c,GAAA,GAAgB/R,EAAIvG,GACxC,MAAO,CACLwL,QAASjF,EACTlJ,KAAM23B,EAAYpyB,QAAQvF,IAC1BI,OAAQu3B,EAAYpyB,QAAQnF,OAAO6gB,cAKjCzjB,EAAMmE,EAAQ2M,UAAU1P,GAAQA,EAAKoB,MAAQA,GAAOpB,EAAKwB,SAAWA,GAEpE7C,EAAU,IAAmBoV,iBAAiBvS,EAAQJ,IAC5D,IAAI,IACH+S,iBAAiB5Z,KAAK6wD,kBAAkB1pD,IACxC2pD,UAAU1sD,EAASoE,EAAQnE,GAAK2Q,QAAS,GAAG,EAAOxM,EAAQ/E,MAAM,EAAGY,GAAMmE,EAAQ/E,MAAMY,EAAM,KAGjG,YAAiBrE,KAAKoO,KAAK2iD,8BAA+BJ,EAAapqD,KAAK,KAAM,YAAa,YAAa,kCAC5G,YAAiBvG,KAAKoO,KAAK4iD,4BAA6BL,EAAapqD,KAAK,KAAM,sBAAuB,kBAAmB,gCAc1HvG,KAAKouC,SAAWpuC,KAAKkuC,UAAU,GAE/B,OAAA+iB,GAAA,GAAuB,KACrBjxD,KAAK2qB,cAAcumC,QAClB,KACDlxD,KAAK2qB,cAAcwmC,qBAYhB,qBAAqBlmD,EAAiB9H,GAC3C,GAAY,6BAATA,EAAqC,OAAO8H,EAEnC,2BAAT9H,IACD8H,EAAWA,EAASrD,OAAOxD,KAAaA,EAAQ0O,QAclD,IAAI47B,EAAkB,GAEtB,OAAOvrC,GACL,IAAK,gCACH,IAAI,IAAIiB,KAAW6G,EAAU,CAC3B,IAAI6H,EAAQ1O,EAAQ0O,MAAMtO,OAASJ,EAAQ0O,MAAM5S,UAAakE,EAAQ0O,MAAMga,SAAW1oB,EAAQ0O,MAAMga,QAAQ5sB,SACzG4S,IAKW,aAAZA,EAAM1L,GAAmC,UAAf0L,EAAM3P,MAKnCurC,EAAS/oC,KAAKvB,IAGhB,MAGF,IAAK,8BACH,IAAI,IAAIA,KAAW6G,EACb7G,EAAQ0O,MAAM5S,WAAY,CAAC,QAAS,QAAS,MAAO,UAAW,SAASw6B,SAASt2B,EAAQ0O,MAAM5S,SAASiD,OAI5GurC,EAAS/oC,KAAKvB,GAEhB,MAGF,IAAK,yBAEH,IAAI,IAAIA,KAAW6G,EAEfyjC,EAAS/oC,KAAKvB,GAIlB,MAGF,IAAK,2BACH,IAAI,IAAIA,KAAW6G,EACb7G,EAAQ0O,MAAM5S,UAA4C,UAAhCkE,EAAQ0O,MAAM5S,SAASiD,MAIrDurC,EAAS/oC,KAAKvB,GAGhB,MAGF,IAAK,2BACH,IAAI,IAAIA,KAAW6G,EACb7G,EAAQ0O,MAAM5S,UAA4C,UAAhCkE,EAAQ0O,MAAM5S,SAASiD,MAIrDurC,EAAS/oC,KAAKvB,GAGhB,MAGF,IAAK,gCACH,IAAI,IAAIA,KAAW6G,EACb7G,EAAQ0O,MAAM5S,UAAc,CAAC,QAAS,SAAkCw6B,SAASt2B,EAAQ0O,MAAM5S,SAASiD,OAI5GurC,EAAS/oC,KAAKvB,GAUpB,OAAOsqC,EAGI,oBAAoBzjC,EAAiBmjC,EAA+BrkC,GAAS,G,gDACxF,MAAMqnD,EAAwD,GACxDC,EAA8BjjB,EAASsd,WACvCrtB,EAA2B,GAC3BzR,EAAa5sB,KAAK4sB,WAAW5c,MACnC,IAIIrE,EAJAxE,EAAcinC,EAASjnC,YAc3B,aAZM,eAGa,kCAAhBA,GAAqDnH,KAAKgH,cAAc4D,MAAMU,QAC/EnE,EAAc,2BACdwE,EAAc3L,KAAKkwD,iBACnBmB,EAAetnD,OAAO4B,EAAY1L,YACV,6BAAhBkH,IACRwE,EAAc3L,KAAKqK,aAAaY,UAI3B9D,GACL,IAAK,2BACH,IAAI,MAAM/C,KAAW6G,EAAU,CAC7B,MAAM,OAACY,EAAM,IAAEC,GAAO,GAAkBC,aAAa,CACnDF,OAAQzH,EAAQ6C,OAChBhH,UAAW0L,EAAY/B,KACvBoC,YAAY,EACZC,WAAY,KAEd,GAAkBI,eAAeR,EAAQzH,EAAS0H,EAAK9L,KAAKgH,cAAc4D,OAGzEe,EAAY/B,KAAKK,mBAClB0B,EAAYzB,YAEd,MAGF,IAAK,gCACH,IAAI,MAAM9F,KAAW6G,EAAU,CAC7B,MAAM6H,EAAQ1O,EAAQ0O,MAAMtO,OAASJ,EAAQ0O,MAAM5S,UAAakE,EAAQ0O,MAAMga,SAAW1oB,EAAQ0O,MAAMga,QAAQ5sB,SAEzGitB,EAAMjtB,SAASC,cAAc,OAInC,IAAIkqB,EAHJ8C,EAAI/sB,UAAUC,IAAI,aAIlB,MAAMP,EAAO,IAAiBwtB,gBAAgBxa,EAAO,IAAK,KAExDuX,EADa,UAAZvX,EAAM1L,EACGu2C,GAAU,CAClB1pC,IAAKnB,EACL1O,UACAnE,UAAWktB,EACX5C,SAAU,EACVC,UAAW,EACXG,cAAe3qB,KAAK2qB,cACpBiC,aACAmxB,aAAa,EACbrzB,kBAAkB,EAClBszB,cAAc,EACdl+C,SACC+qB,MAEOP,GAAU,CAClB9lB,MAAOsO,EACP1O,UACAnE,UAAWktB,EACX5C,SAAU,EACVC,UAAW,EACXG,cAAe3qB,KAAK2qB,cACpBiC,aACAlC,kBAAkB,EAClB6C,QAAQ,EACRztB,SAIJ,CAACuqB,EAAQO,OAAOC,MAAOR,EAAQO,OAAOE,MAAMljB,OAAOc,SAASpC,QAAQs7C,IAClEA,EAAMxhD,UAAUC,IAAI,qBAGtBg+B,EAAS14B,KAAK0kB,EAAQI,aAAaI,OAEnCumC,EAAczrD,KAAK,CAACqP,QAASmY,EAAK/oB,YAGpC,MAGF,IAAK,2BACL,IAAK,gCACL,IAAK,2BACL,IAAK,8BACH,IAAI,MAAMA,KAAW6G,EAAU,CAC7B,MAAMid,EAAaloB,KAAKkoB,YAAe,CAAC,QAAS,SAAkCwS,SAASt2B,EAAQ0O,MAAM5S,SAASiD,MAC7GgqB,EAAMszB,GAAa,CACvBr8C,UACA4jB,UAAWE,EACXgB,WAAY,IACZjB,cAAc,EACdC,aACAlhB,cAAehH,KAAK6wD,kBAAkB1pD,GACtCwjB,cAAe3qB,KAAK2qB,cACpBM,gBAAgB,IAGd,CAAC,QAAS,QAAS,SAAkCyP,SAASt2B,EAAQ0O,MAAM5S,SAASiD,OACvFgqB,EAAI/sB,UAAUC,IAAI,YAGpB+wD,EAAczrD,KAAK,CAACqP,QAASmY,EAAK/oB,YAEpC,MAGF,IAAK,yBACH,IAAI,IAAIA,KAAW6G,EAAU,CAC3B,IAAI6hB,EAEJ,IAAgB,QAAb,EAAA1oB,EAAQ0O,aAAK,eAAEga,UAAuC,iBAA5B1oB,EAAQ0O,MAAMga,QAAQ1lB,EACjD0lB,EAAU1oB,EAAQ0O,MAAMga,YACnB,CACL,MAAMwkC,EAASltD,EAAQmtD,cAAgBntD,EAAQmtD,cAAc9gD,KAAMxO,GAAmB,qBAARA,EAAEmF,GAAoC,yBAARnF,EAAEmF,GAAgC,KAC9I,IAAIsN,EAAa88C,EAAqBC,EAEtC,GAAIH,EAUFG,EAASrtD,EAAQA,QAAQX,MAAM6tD,EAAOjhC,OAAQihC,EAAOjhC,OAASihC,EAAOnvD,YAV3D,CAEV,MAAMyQ,EAAQ,IAAkB8+C,SAASttD,EAAQA,SACjD,IAAIwO,EAEF,SAGF8B,EAAM9B,EAAM,GAMZ8B,EADe,0BAAd48C,aAAM,EAANA,EAAQlqD,GACHkqD,EAAO58C,IAGPA,GAAO+8C,EAGfD,EAAc98C,EAEd,MAAMi9C,EAAOvtD,EAAQA,UAAYsQ,EAC7BA,EAAI9B,MAAM,4BACZ4+C,EAAc,WAAa98C,EAC3BA,EAAMA,EAAIgmB,SAAS,KAAOhmB,EAAM,WAAaA,GAG/C88C,EAAc,IAAI1N,IAAI0N,GAAaI,SAEnC9kC,EAAU,CACRpY,MACA88C,eAGEG,IACF7kC,EAAQ4K,YAActzB,EAAQA,QAC9B0oB,EAAQ+kC,aAAe,IAAkBllB,aAAa,YAAavoC,EAAQA,QAAS,IAAK,OAInFlE,SAASC,cAAc,OAAjC,IAEI2xD,EAAa5xD,SAASC,cAAc,OAKxC,GAJA2xD,EAAW1xD,UAAUC,IAAI,UAAW,aAIjCysB,EAAQtoB,MAAO,CACJ8lB,GAAU,CACpBrqB,UAAW6xD,EACX1tD,QAAS,KACTI,MAAOsoB,EAAQtoB,MACf+lB,SAAU,EACVC,UAAW,EACXE,kBAAkB,EAClBC,cAAe3qB,KAAK2qB,cACpBiC,aACA9sB,KAAM,IAAiBwtB,gBAAgBR,EAAQtoB,MAAO,GAAI,IAAI,GAC9DimB,aAAc4T,EACd9Q,QAAQ,SAGVukC,EAAW1xD,UAAUC,IAAI,SACzByxD,EAAW7tD,UAAY,IAAkB8tD,gBAAgBjlC,EAAQlf,OAASkf,EAAQ0kC,aAAe1kC,EAAQ4K,aAAe5K,EAAQpY,KAAK,GAGvI,IAAI9G,EAAQkf,EAAQklC,QAAU,GAC1B3lC,EAAWS,EAAQ+kC,cAAgB,GAEvC,MAAMI,EAAmB,OAAAC,GAAA,GAAuB7lC,GAE1C/jB,EADY,OAAA4pD,GAAA,GAAuB,IAAkBvlB,aAAa7f,EAAQpY,KAAO,KACnEmL,kBACjBvX,aAAa6pD,oBACd7pD,EAAE4hB,UAAYkoC,mBAAmB9pD,EAAE+pD,OAGlCJ,EAAiBK,YAClBL,EAAiBloD,OAAO,MAG1BkoD,EAAiBloD,OAAOzB,GAErBtI,KAAKkoB,YACN+pC,EAAiBloD,OAAO,KAAM,IAAmBgf,iBAAiB3kB,IAGhEwJ,IAEFA,EAAQ,IAAkB2kD,cAAczlC,EAAQ0kC,YAAYnvC,MAAM,IAAK,GAAG,KAG5E,MAAMwP,EAAM,IAAI,GAAI,CAClBjkB,QACA4lB,WAAY,IAAmBnK,aAAajlB,GAC5CioB,SAAU4lC,EACV3+B,aAAa,EACb7pB,WAAW,EACXkE,UAAU,IAMZkkB,EAAI5xB,UAAU8J,OAAO+nD,GAWlBjgC,EAAI5xB,UAAUiqB,UAAU5e,OAAOnJ,QAChCivD,EAAczrD,KAAK,CAACqP,QAAS6c,EAAI5xB,UAAWmE,aAgBpD,GAJGpE,KAAKkvC,WACN7Q,EAAS14B,KAAK3F,KAAKkvC,YAGlB7Q,EAASl8B,eACJU,QAAQC,IAAIu7B,GACdzR,KAFN,CAQA,GAAGwkC,EAAcjvD,OAAQ,CACvB,MAAMm5B,EAASvxB,EAAS,SAAW,UACnCqnD,EAAc9qD,QAAQkN,IACpB,MAAM,QAACwB,EAAO,QAAE5Q,GAAWoP,EACrBg/C,EAAiBxyD,KAAKyyD,6BAA6BzyD,KAAKqvD,aAAejrD,EAAQ0kB,KAAO,EAAG3hB,GAC/F6N,EAAQ5U,UAAUC,IAAI,qBACtB2U,EAAQ5I,QAAQvF,IAAM,GAAKzC,EAAQyC,IACnCmO,EAAQ5I,QAAQnF,OAAS,GAAK7C,EAAQ6C,OACtCurD,EAAehtD,MAAM81B,GAAQtmB,GAE1BhV,KAAK8uC,UAAUC,aAChB/uC,KAAK8uC,UAAUsc,sBAAsBp2C,GAAS,KAMlDhV,KAAK0yD,gBAAgC,6BAAhBvrD,EAA6C,EAAI8D,EAAS9I,OAAQkvD,OAInF,gBAAgBlvD,EAAgBupD,GACtC,GAAGA,EAAY,CACb,MAAM9C,EAAS8C,EAAW56C,cAO1B,GANA3I,MAAMC,KAAKwgD,EAAO7iC,UAAUtiB,MAAM,GAAG6C,QAAQknB,IAC3CA,EAAM7rB,YAKJQ,IAAWupD,EAAWzhD,kBAAmB,CAC3C,MAAMkjB,EAAMjtB,SAASC,cAAc,OACnCgtB,EAAIjD,UAAY,kCAChBiD,EAAI/sB,UAAUC,IAAI,kBAAmB,cAAe,gBAAiB,aAErEuoD,EAAO7+C,OAAOojB,KAKZ,YACN,MAAMgN,EAA+B,IAAIt2B,IACnC+oB,EAAa5sB,KAAK4sB,WAAW5c,MAEnC,IAAI,IAAIhF,KAAKhL,KAAKqK,aAAc,CAC9B,MAAM+iB,EAAQptB,KAAKqK,aAAaW,GAChChL,KAAKoO,KAAKukD,yBAAyB5oD,OAAOqjB,EAAMntB,WAChDmtB,EAAMjjB,QAGR,MAAMS,EAAQ5K,KAAKgH,cAAc4D,MACjC,GAAGA,EAAO,CACR,MAAM8sC,EAAa,CAAC5Z,EAAmB1Q,EAAoBwlC,GAAmB,KAC5E90B,EAAQx3B,QAASW,IACf,GAAGkzB,EAAgBxyB,IAAIV,GACrB,OAGFkzB,EAAgB95B,IAAI4G,GAEpB,MAAMy6B,EAAO,IAAgBtG,QAAQn0B,IAI/B,IAAC6E,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ5E,EACRhH,UAAWmtB,EAAMxjB,KACjBoC,YAAY,EACZC,WAAY,GACZvC,WAAY0jB,EAAM1jB,aAGpB,GAAGkpD,IAAqBlxB,EAAKmxB,oBAAsBnxB,EAAKxD,cAAe,CACrE,MAAM40B,EAAS,IAAIC,OAAO,IAAI,YAAanoD,MAAU,YAAa,OAAAooD,GAAA,GAAgBpoD,OAAY,MAC9FkB,EAAImnD,UAAUhvD,UAAY6H,EAAImnD,UAAUhvD,UAAUT,QAAQsvD,EAAQ,aAClEhnD,EAAIwG,gBAAgBvI,OAAO,UAAkB20B,qBAAqBz3B,EAAO4vB,kBACpE,GAAG5vB,IAAW2B,EAAA,QAAU6O,KAC7B3L,EAAIwG,gBAAgBvI,OAAO,eAAK,0BAC3B,CACL,IAAIysB,EAAW,IAAgB6V,gBAAgBplC,GAC/C,GAAIuvB,EAMFA,EAAW,IAAMA,MANL,CACZ,MAAMyO,EAAO,IAAgBC,QAAQj+B,GAClCg+B,GAAQA,EAAKY,QACdrP,EAAW,IAAM,OAAA08B,GAAA,GAAkBjuB,EAAKY,OAAOstB,WAMnDrnD,EAAIwG,gBAAgBrO,UAAY,MAAQuyB,EAAW,UAIvDpJ,EAAM9gB,UAGFud,EAAaupC,IACjB,GAAIxmC,IAMJ,OAAOwmC,GAGT,OAAOvwD,QAAQC,IAAI,CACjB,IAAgB26B,mBAAmB7yB,GAAO,GACzC/J,KAAKgpB,GACLhpB,KAAMs8B,IACFA,GACDua,EAAWva,EAAUn9B,KAAKqK,aAAa8yB,UAAU,KAIrD,IAAgBO,eAAe9yB,EAAO,IACrC/J,KAAKgpB,GACLhpB,KAAMs8B,IACL,GAAGA,IACDua,EAAWva,EAASU,WAAY79B,KAAKqK,aAAa8yB,UAAU,GAC5Dua,EAAWva,EAASW,QAA4E99B,KAAKqK,aAAagpD,gBAE/GrzD,KAAKqK,aAAagpD,eAAevpD,OAAOioC,kBACzC/xC,KAAKqK,aAAagpD,eAAevpD,OAAOioC,iBAAiBpwC,SAG3D3B,KAAKqK,aAAagpD,eAAepzD,UAAUG,UAAUC,IAAI,YAEtDL,KAAKqK,aAAagpD,eAAezpD,KAAKK,kBAAoB,GAAG,CAC9D,MAAM6nC,EAAW5xC,SAASC,cAAc,OACxC2xC,EAAS1xC,UAAUC,IAAI,2BACvByxC,EAAS5nB,UAAY,YACrBlqB,KAAKqK,aAAagpD,eAAevpD,OAAOC,OAAO+nC,GAC/CA,EAAS9wC,iBAAiB,QAAS,KACjC,MAAMsyD,EAAUtzD,KAAKqK,aAAagpD,eAAepzD,UAAUG,UAAUkM,OAAO,YAC5EwlC,EAAS5nB,UAAYopC,EAAU,YAAc,iBAMrD,IAAmB32B,iBAAiB/xB,EAAO,EAAG,GAAI,GAAGzE,QACpDtF,KAAKgpB,GACLhpB,KAAKqB,IACDA,GACDw1C,EAAWx1C,EAAMk6B,QAAQ3zB,IAAIiX,GAAKA,EAAEzY,QAASjH,KAAKqK,aAAa8yB,UAAU,OAI1E,GAAIn9B,KAAKgH,cAAcC,QAAWjH,KAAKgH,cAAcusD,QA0DrD,OAAO1wD,QAAQoD,UA1D+C,CACnE,MAAMutD,EAAqB,CAACtpD,GAAY,IAC/BwqB,EAAA,QAAgBC,WAAW9zB,KAAK+zB,IACjChI,MAIJ5sB,KAAKqK,aAAaopD,OAAO7pD,KAAK3F,UAAY,GAE1C2wB,EAAM8+B,aAAajwD,MAAM,EAAG,IAAI6C,QAAQW,IACtC,IAAI,OAAC4E,EAAM,IAAEC,GAAO,GAAkBC,aAAa,CACjDF,OAAQ5E,EACRhH,UAAWD,KAAKqK,aAAaopD,OAAO7pD,KACpCoC,YAAY,EACZE,WAAW,EACXD,WAAY,GACZvC,YAAY,IAGdoC,EAAIwG,gBAAgBvI,OAAO9C,EAAOo2B,SAAW,IAAgB9qB,oBAAoBtL,GAAU,UAAkBy3B,qBAAqBz3B,EAAO4vB,eAGvIjC,EAAM8+B,aAAavxD,OAEb+H,GACRlK,KAAKqK,aAAaopD,OAAOvpD,YAFzBlK,KAAKqK,aAAaopD,OAAOtpD,WAO/B,OAAOtH,QAAQC,IAAI,CACjB,IAAgB6wD,YAAY,kBAAkB9yD,KAAK+yD,IACjD,IAAIhnC,IAAc,OAElB,MAAMvoB,EAAMuvD,EAAMz+C,UAAUusB,GAAQA,EAAKvyB,KAAOvG,EAAA,QAAU6O,OAC9C,IAATpT,IACDuvD,EAAQA,EAAMnwD,SACRgB,OAAOJ,EAAK,GAGjBuvD,EAAMzxD,QACPyxD,EAAMttD,QAASo7B,IACb,GAAkB31B,aAAa,CAC7BF,OAAQ61B,EAAKvyB,GACblP,UAAWD,KAAKqK,aAAawpD,OAAOjqD,KACpCoC,YAAY,EACZ8nD,eAAe,EACf7nD,WAAY,GACZvC,YAAY,MAKlB1J,KAAKqK,aAAawpD,OAAO3pD,cAG3BspD,OAKE,YAAYplB,GAClB,MAAMj/B,EAAKnP,KAAKgH,cAAcC,OAAO4vB,WAC/BjK,EAAa5sB,KAAK4sB,WAAW5c,MACnC,IAAI7J,EAEJ,MAAM4tD,EAA2B71B,GAA2D,mCACvFl+B,KAAKkvC,kBACAlvC,KAAKkvC,WAEPtiB,OAKF5sB,KAAKg0D,cACPh0D,KAAKg0D,YAAc,IAAI,GAAe,CAACrpC,cAAe3qB,KAAK2qB,cAAetY,eAAe,IACzFrS,KAAKg0D,YAAYpqD,KAAK5I,iBAAiB,QAAUiB,IAC/C,MAAM05B,EAAK,OAAA0F,GAAA,GAAUp/B,EAAE4S,OAAQ,MAC/B,IAAI8mB,EACF,OAGF,MAAM10B,EAAS00B,EAAGvvB,QAAQnF,OAAO6gB,WACjC,IAAI3hB,EAAwBtD,QAAQoD,UACjCie,EAAA,EAAWC,WACZhe,EAAU,GAAgB2pC,eAAc,IAG1C3pC,EAAQtF,KAAK,KACX,GAAakmD,aAAa9/C,OAG9BmnC,EAASsd,WAAW3hD,OAAO/J,KAAKg0D,YAAYpqD,MAC5C5J,KAAK0yD,gBAAgB,EAAGtkB,EAASsd,aAGnCxtB,EAAa53B,QAAQ63B,IACnB,MAAMl3B,EAAS,IAAgBm3B,qBAAqBD,GACpD,GAAGl3B,EAAOw3B,YACR,OAGW,IAAgByG,QAAQj+B,GAC7BqQ,OAAO+jB,SAIfr7B,KAAKg0D,YAAY3zD,IAAI4G,SAIzB,GAAG,IAAgBo7B,UAAUlzB,GAAK,CAChC,MAAM8kD,EAAcj0D,KAAKg0D,YAAmB,IAAL,GACvC7tD,EAAU,UAAkB63B,uBAAuB7uB,OAAIzK,EAAWuvD,EAAYj0D,KAAK6uD,UAAUzgB,EAASjnC,cAActG,KAAKq9B,IACvH,IAAItR,IACF,OAGF,IAAIhjB,EAAOwkC,EAASsd,WAAW7rC,kBAO/B,OANA7f,KAAK6uD,UAAUzgB,EAASjnC,cAAgByC,EAAOA,EAAKK,kBAAoB,GAAKi0B,EAAaA,aAAa/7B,OAEpG+7B,EAAaA,aAAa/7B,OAAS8xD,IACpCj0D,KAAK65B,OAAOuU,EAASjnC,cAAe,GAG/B4sD,EAAmB71B,EAAaA,qBAGzC/3B,EAAW,UAAkBi9B,YAAYj0B,GAAmCtO,KAAK+3B,IAC/E,IAAIhM,IACF,OAIF5sB,KAAK65B,OAAOuU,EAASjnC,cAAe,EACpC,MAAM+2B,EAAetF,EAASsF,aAC9B,MAAsB,8BAAnBA,EAAa92B,EAIT2sD,EAAmB71B,EAAaA,mBAJvC,IAQJ,OAAOl+B,KAAKyqB,aAAa2jB,EAASjnC,aAAehB,EAAQ8a,QAAQ,KAC3D2L,MAIJ5sB,KAAKyqB,aAAa2jB,EAASjnC,aAAe,QAItC,SAASinC,EAA+BoB,EAAmBzqC,EAAmB6nB,G,QACpF,MAAMzpB,EAAOirC,EAASjnC,YAEtB,GAAGnH,KAAKyqB,aAAatnB,GACnB,OAAOnD,KAAKyqB,aAAatnB,GAG3B,GAAqB,YAAlBirC,EAASjrC,KACV,OAAOnD,KAAKk0D,YAAY9lB,GAG1B,MAAMjqC,EAAmC,QAAzB,EAAAnE,KAAKqvC,eAAelsC,UAAK,QAAKnD,KAAKqvC,eAAelsC,GAAQ,GAE1E,KAAY,6BAATA,GAAwCgB,EAAQhC,SAC7CnC,KAAK8uD,cACP9uD,KAAKm0D,YACLn0D,KAAK8uD,aAAc,GAGjB9uD,KAAKgH,cAAc4D,MAAMU,QAAWtL,KAAKgH,cAAcC,QAAWjH,KAAKgH,cAAcusD,UAEvF,OADAvzD,KAAK65B,OAAO12B,IAAQ,EACbN,QAAQoD,UAInB,MAAMmuD,EAAS,SAAWjxD,EAAO,MAGjC,GAAGgB,EAAQhC,QAAUnC,KAAK4uC,gBAAgBzrC,GAAQgB,EAAQhC,SAAWqtC,EAAU,CAC7E,IAAIvkC,EAAkB,GAClBopD,EAAOhyD,KAAKP,IAAI,EAAG9B,KAAK4uC,gBAAgBzrC,IACxCmxD,EAAe,EAEnB,EAAG,CACD,IAAIC,EAAMpwD,EAAQV,MAAM4wD,EAAMA,EAAOtvD,GAErCsvD,GAAQE,EAAIpyD,OACZmyD,GAAgBC,EAAIpyD,OAEpB8I,EAAStF,QAAQ3F,KAAK2uC,qBAAqB4lB,EAAI9rD,IAAIoiC,GAAK,IAAmBrxB,iBAAiBqxB,EAAE5jC,OAAQ4jC,EAAEhkC,MAAO1D,UACzGmxD,EAAevvD,GAAasvD,EAAOlwD,EAAQhC,QAWjD,OAFFnC,KAAK4uC,gBAAgBzrC,GAAQkxD,EAEpBr0D,KAAK6uC,oBAAoB5jC,EAAUmjC,GAAUntB,QAAQ,KAC1DzV,WAAW,KACTxL,KAAK+K,WAAWgvB,oBACf,KAOT,IAAInzB,EAAQzC,EAAQhC,OAASgC,EAAQA,EAAQhC,OAAS,GAAG0E,IAAM,EAK/D,OAAO7G,KAAKyqB,aAAatnB,GAAQ,IAAmB4D,UAAU,OAAD,wBACxD/G,KAAKgH,eAAa,CACrBG,YAAa,CAACC,EAAGjE,GACjByD,QACAM,MAAOnC,EACPuC,SAA8B,QAApB,EAAAtH,KAAK6uD,UAAU1rD,UAAK,QAAKnD,KAAK6uD,UAAU1rD,GAAQ,KACzDtC,KAAKqB,IAKN,GAJAiC,EAAQwB,QAAQzD,EAAMiC,QAAQsE,IAAIoiC,IAAK,CAAEhkC,IAAKgkC,EAAEhkC,IAAKI,OAAQ4jC,EAAE5jC,WAE/DjH,KAAKgvD,IAAIoF,EAAS,wBAAyBjxD,EAAMjB,GAE7C0qB,IAcJ,OARG1qB,EAAMiC,QAAQhC,OAAS4C,QAA8CL,IAAhC1E,KAAKgH,cAAcgB,WAA2B9F,EAAMmF,WAAcnF,EAAMiC,QAAQhC,SAAWD,EAAMyC,SAGvI3E,KAAK65B,OAAO12B,IAAQ,GAGtBnD,KAAK6uD,UAAU1rD,GAAQjB,EAAMmF,UAE1BmoC,EACM3sC,QAAQoD,WAGjBjG,KAAK4uC,gBAAgBzrC,GAAQgB,EAAQhC,OAEjCnC,KAAK65B,OAAO12B,KACbnD,KAAKyqB,aAAatnB,IAASN,QAAQoD,WAAWpF,KAAK,KAClD2K,WAAW,KACT,GAAIohB,KAED5sB,KAAKouC,WAAaA,EAAU,CAC7B,MAAMjoC,EAAUnG,KAAK8F,MAAK,GAAM,GAC7BK,GACDA,EAAQtF,KAAK,KACP+rB,KAEJphB,WAAW,KACTxL,KAAK+K,WAAWgvB,oBACf,OAIR,KAKE/5B,KAAK6uC,oBAAoB7uC,KAAK2uC,qBAAqBzsC,EAAMiC,QAAShB,GAAOirC,MAEjF5hC,MAAMC,IACPzM,KAAKgvD,IAAIriD,MAAM,cAAeF,KAC7BwU,QAAQ,KACTjhB,KAAKyqB,aAAatnB,GAAQ,OAIjB,KAAKosC,GAAS,EAAOC,GAAW,G,0CAO3C,MAAMvoC,EAASjH,KAAKgH,cAAcC,OAClCjH,KAAKgvD,IAAI,OAAQzf,EAAQtoC,EAAQjH,KAAKyqB,cACtC,MAAMmC,EAAa5sB,KAAK4sB,WAAW5c,MAEnC,GAAGhQ,KAAK+uD,UAAW,CACjB,GAAG/uD,KAAKsvD,cAAe,CACrB,MAAMphB,EAAYluC,KAAKkuC,UAAUtmC,OAAOwmC,GAAqC,6BAAzBA,EAASjnC,aACvDqtD,EAAUtmB,EAAUzlC,IAAI2lC,IAAY,CAAEhnC,EAAGgnC,EAASjnC,eAElDstD,QAAiB,IAAmBC,kBAAkBztD,EAAQutD,GACpE,IAAI5nC,IACF,OAGF,GAAG5sB,KAAKkvC,kBACAlvC,KAAKkvC,WAEPtiB,KACF,OAIJ,IAAI+nC,EACAhwD,EAAQ,EACZupC,EAAU5nC,QAAQ8nC,IAChB,MAAMwmB,EAAUH,EAAShkD,KAAKkjB,GAAKA,EAAE/rB,OAAOR,IAAMgnC,EAASjnC,aAE3DinC,EAASwhB,QAAQxvD,UAAUkM,OAAO,QAASsoD,EAAQjwD,OACnDypC,EAASwhB,QAAQxvD,UAAUuB,OAAO,UAG/BizD,EAAQjwD,YAA2BD,IAAlBiwD,IAClBA,EAAgBvmB,GAGfwmB,EAAQjwD,SAASA,IAGtB,MAAMkwD,EAAa70D,KAAKmvD,aAAan/C,IAAI,WACnCi/B,EAAiBjvC,KAAKivC,iBAC5B4lB,EAAWjF,QAAQxvD,UAAUkM,OAAO,QAAS2iC,GAE1CA,IACD0lB,EAAgBE,GAGlB70D,KAAKC,UAAUG,UAAUkM,OAAO,QAASqoD,GACzC30D,KAAKC,UAAU6Q,cAAc1Q,UAAUkM,OAAO,gBAAiBqoD,GAC5DA,IACD30D,KAAKqwD,YAAa,EAClBrwD,KAAKmO,UAAUnO,KAAKkuC,UAAU3xB,QAAQo4C,IAAgB,GACtDA,EAAc/E,QAAQxvD,UAAUC,IAAI,UAEpCL,KAAK+rD,uBAAuB3rD,UAAUkM,OAAO,OAAQ3H,GAAS,IAIlE3E,KAAK+uD,WAAY,EAGnB,IAAI+F,EAASvlB,EAAS,CAACvvC,KAAKouC,UAAYpuC,KAAKkuC,UAAUtmC,OAAO8I,GAAKA,IAAM1Q,KAAKouC,UAU9E,GATA0mB,EAASA,EAAOltD,OAAOwmC,IACrB,MAAMjnC,EAAcinC,EAASjnC,YAC7B,OAAQnH,KAAK65B,OAAO1yB,IAAiBnH,KAAKqvC,eAAeloC,IAAgBnH,KAAK4uC,gBAAgBznC,GAAenH,KAAKqvC,eAAeloC,GAAahF,SAG7I8E,EAAOo2B,UACRy3B,EAAOj4B,cAAcuR,GAA8B,YAAlBA,EAASjrC,OAGxC2xD,EAAO3yD,OACT,OAGF,MAAM4C,EAAYyqC,EAAW,GAAKntC,KAAKE,MAAuC,GAAhCg6B,GAAA,EAAWC,QAAU,IAAM,GAAS,MAE5E6B,EAA2By2B,EAAOrsD,IAAI2lC,GACnCpuC,KAAK+0D,SAAS3mB,EAAUoB,EAAUzqC,EAAW6nB,IAGtD,OAAO/pB,QAAQC,IAAIu7B,GAAU7xB,MAAMC,IACjCzM,KAAKgvD,IAAIriD,MAAM,2BAA4BF,QAIxC,6BAA6BuoD,EAAmB7xD,G,MACrD,MAAM2lB,EAAO,IAAIusB,KAAiB,IAAZ2f,GACtBlsC,EAAKmsC,SAAS,EAAG,EAAG,GACpBnsC,EAAKosC,QAAQ,GACb,MAAMC,EAAgBrsC,EAAKssC,UACrBC,EAAuC,QAA1B,EAAAr1D,KAAKkvD,gBAAgB/rD,UAAK,QAAKnD,KAAKkvD,gBAAgB/rD,GAAQ,GAC/E,KAAKgyD,KAAiBE,GAAa,CACjC,MAAMp1D,EAAYC,SAASC,cAAc,OACzCF,EAAUuJ,UAAY,qBAEtB,MAAMF,EAAOpJ,SAASC,cAAc,OACpCmJ,EAAKlJ,UAAUC,IAAI,2BAEnB,MAAM2C,EAAsC,CAC1CsyD,MAAO,QAGNxsC,EAAKysC,iBAAkB,IAAIlgB,MAAOkgB,gBACnCvyD,EAAQwyD,KAAO,WAGjB,MAAMC,EAAc,IAAI,UAAKC,gBAAgB,CAC3C5sC,OACA9lB,YACCgS,QACH1L,EAAKS,OAAO0rD,GAEZx1D,EAAU8J,OAAOT,GAEjB,MAAM9D,EAAQtF,SAASC,cAAc,OACrCqF,EAAMpF,UAAUC,IAAI,4BAEpBJ,EAAU8J,OAAOT,EAAM9D,GAEvB,MAAMmwD,EAAiB,YAAqBN,EAAY,QACxD,IAAIrqD,EAAI,EACR,KAAMA,EAAI2qD,EAAexzD,SAAU6I,EAAG,CAEpC,GAAGmqD,EADOQ,EAAe3qD,GAEvB,MAIJqqD,EAAWF,GAAiB,CAACl1D,YAAWuF,SACxCy/C,GAAuBhlD,EAAWD,KAAKoO,KAAKjL,GAAO6H,GAGrD,OAAOqqD,EAAWF,GAGb,iBACL,OAAOn1D,KAAKgH,cAAcC,OAAOw3B,cAAgB,IAAgBtG,YAAYn4B,KAAKgH,cAAcC,OAAO4vB,aAAe,IAAgB0G,UAAUv9B,KAAKgH,cAAcC,OAAO4vB,WAAY,qBAGjL,UACL72B,KAAKyqB,aAAe,GACpBzqB,KAAK65B,OAAS,GACd75B,KAAK8uD,aAAc,EACnB9uD,KAAK6uD,UAAY,GACjB7uD,KAAK+uD,WAAY,EAEjB/uD,KAAK2qB,cAAcxgB,QAEnBnK,KAAKkuC,UAAU5nC,QAAQ8nC,IACrBpuC,KAAK4uC,gBAAgBR,EAASjnC,cAAgB,IAG7CnH,KAAK8uC,UAAUC,aAChB/uC,KAAK8uC,UAAU2Y,kBAUjBznD,KAAK4sB,WAAWhX,QAChB5V,KAAK4tC,uBACL5tC,KAAKg0D,iBAActvD,EAGd,uBACL1E,KAAKkuC,UAAU5nC,QAAQ8nC,IACrBA,EAASzP,YAASj6B,IAIf,YAAYkxD,GAAU,GACxB51D,KAAK4uD,aAAazsD,SACnBnC,KAAK4uD,aAAatoD,QAAQoO,IACxBovC,IAAI+R,gBAAgBnhD,KAEtB1U,KAAK4uD,aAAazsD,OAAS,GAG7BnC,KAAKkuC,UAAU5nC,QAASkJ,IAStB,GARAA,EAAIk8C,WAAWznD,UAAY,GAExBjE,KAAKsvD,gBAENtvD,KAAKC,UAAUG,UAAUC,IAAI,QAC7BL,KAAKC,UAAU6Q,cAAc1Q,UAAUC,IAAI,iBAG7B,UAAbmP,EAAIrM,OAIHnD,KAAKqvC,eAAe7/B,EAAIrI,aAAc,CACxC,MAAMyhD,EAASp5C,EAAIk8C,WAAW56C,cAExB83C,EAAO/4C,cAAc,eACvB,aAAa+4C,GAAQ,GAIzB,MAAMjB,EAAQiB,EAAO/4C,cAAc,kBAChC83C,GACDA,EAAMhmD,YAiBZ3B,KAAKkvD,gBAAkB,GACvBlvD,KAAKkwD,iBAAiB/lD,QACtBnK,KAAK+K,WAAWo+B,UAAY,EActB,kBAAkB2sB,GACxB,MAAM5sD,EAAU,YAAKlJ,KAAKgH,eAG1B,OAFAkC,EAAQ/B,YAAc,CAACC,EAAG0uD,GAC1B5sD,EAAQ5B,SAAWtH,KAAK6uD,UAAUiH,GAC3B5sD,EAGF,UAAS,OAACjC,EAAM,MAAE2D,EAAK,SAAEE,EAAQ,eAAEukC,EAAc,SAAErnC,EAAQ,QAAEurD,EAAO,QAAEwC,IAS3E/1D,KAAKgH,cAAgB,CACnBC,SACA2D,MAAOA,GAAS,GAChBzD,YAAa,CAACC,EAAGpH,KAAKouC,SAASjnC,aAC/B2D,WACA9C,WACAurD,UACAwC,WAGF/1D,KAAKqvC,eAAiBA,UAAkB,GAExCrvC,KAAK0O,W,IEpkDGsnD,G,UAAZ,SAAYA,GACV,6BACA,2BACA,uBAHF,CAAYA,QAAW,KA6GvB,MAAMC,GAAoB,IAvGnB,MAKL,cAJQ,KAAAC,QAEH,GAGHttD,EAAA,QAAU8vC,2BAA2B,CACnCyd,cAAgBx0B,IACd,MAAMpzB,EAAMozB,EAAOpzB,IAAInH,EACvBpH,KAAKk2D,QAAQ3nD,GAAOozB,EAAOy0B,MAC3BxtD,EAAA,QAAU6F,cAAc,iBAAkBkzB,MAKzC,WAAW00B,EAAgCD,GAChD,OAAO,KAAW1/B,UAAU,qBAAsB,CAChDnoB,IAAK,CACHnH,EAAGivD,GAELD,UACCv1D,KAAKy1D,IACN,IAAgBC,aAAaD,EAAaE,OAC1C,IAAgBC,aAAaH,EAAaI,OAE1CC,GAAA,EAAkBC,mBAAmB,CACnCxvD,EAAG,gBACHmH,IAAK,CACHnH,EAAG,YAAqBivD,IAE1BD,MAAOA,EAAM3tD,IAAIouD,IACf,MAAMC,EAAoB,GAG1B,OAFA9/C,OAAOkkC,OAAO4b,EAAMD,GACpBC,EAAK1vD,EAAI,YAAqB0vD,EAAK1vD,GAC5B0vD,MAMJR,EAAaF,QAIjB,WAAWC,GAChB,MAAMU,EAA8B,YAAqBV,GACnDD,EAAQp2D,KAAKk2D,QAAQa,GAC3B,OAAGX,EACMvzD,QAAQoD,QAAQmwD,GAGlBp2D,KAAKk2D,QAAQa,GAAc,KAAWrgC,UAAU,qBAAsB,CAC3EnoB,IAAK,CACHnH,EAAGivD,KAEJx1D,KAAKy1D,IACN,IAAgBC,aAAaD,EAAaE,OAC1C,IAAgBC,aAAaH,EAAaI,OAInC12D,KAAKk2D,QAAQa,GAAcT,EAAaF,QAI5C,uBAAuBA,GAC5B,MAAMY,EAAuB,GAG7B,IAAIC,EAAoB,CAACT,MAAO,GAAIE,MAAO,IAAKQ,EAAuB,CAACV,MAAO,GAAIE,MAAO,IA8B1F,OA7BAN,EAAM9vD,QAAQwwD,IACZ,OAAOA,EAAK1vD,GACV,IAAK,uBACH4vD,EAAMrxD,KAAK,GACX,MACF,IAAK,0BACHqxD,EAAMrxD,KAAK,GACX,MACF,IAAK,4BACHqxD,EAAMrxD,KAAK,GACX,MAIF,IAAK,oCACHsxD,EAAWP,MAAM/wD,QAAQmxD,EAAKJ,OAC9B,MACF,IAAK,yBACHO,EAAWT,MAAM7wD,QAAQmxD,EAAKN,OAC9B,MACF,IAAK,uCACHU,EAAcR,MAAM/wD,QAAQmxD,EAAKJ,OACjC,MACF,IAAK,4BACHQ,EAAcV,MAAM7wD,QAAQmxD,EAAKN,UAKhC,CAACrzD,KAAM6zD,EAAM,GAAIE,gBAAeD,gBAK3C,KAAehB,kBAAoBA,GACpB,UC3GA,MAAM,GAiBnB,YAAmBjzD,GAAA,KAAAA,UA8KX,KAAAm0D,cAAiBj1D,IACvBA,GAASA,EACTlC,KAAKmD,KAAOjB,EAEZ,MAAMg3B,EAAUl5B,KAAKgD,QAAQo0D,SAASp3D,KAAKmD,MACrCk0D,EAAiBr3D,KAAKs3D,aAAap+B,QACrCA,EAGF,gBAAMm+B,EAAgBn+B,GAFtBm+B,EAAepzD,UAAY,GAI7BozD,EAAej3D,UAAUkM,OAAO,QAAS4sB,GAEtCl5B,KAAKu3D,aACNv3D,KAAKu3D,WAAWvnD,IAAI,SAAS6hB,IAAI5xB,UAAUG,UAAUkM,OAAO,OAAQtM,KAAKmD,OAAS6yD,GAAYwB,WAC9Fx3D,KAAKu3D,WAAWvnD,IAAI,YAAY6hB,IAAI5xB,UAAUG,UAAUkM,OAAO,OAAQtM,KAAKmD,OAAS6yD,GAAYyB,SAGnGz3D,KAAKgD,QAAQm0D,eAAiBn3D,KAAKgD,QAAQm0D,cAAcj1D,IArLtDc,EAAQo0D,UACTp0D,EAAQo0D,SAAStyD,UAGnB9E,KAAKs3D,aAAe,IAAI,GAAe,CAAChuD,KAAMtG,EAAQ4K,MAAOsrB,SAAS,IAEtEl5B,KAAK03D,UAAY,IAAIhoD,IAErB,IAAI0O,EAAsD,CAAC,CACzDjb,KAAM6yD,GAAYwB,UAClBziC,QAAS,sCACR,CACD5xB,KAAM6yD,GAAY2B,SAClB5iC,QAAS,wCACR,CACD5xB,KAAM6yD,GAAYyB,OAClB1iC,QAAS,qCAGR/xB,EAAQ40D,YACTx5C,EAAIA,EAAExW,OAAOwW,IAAMpb,EAAQ40D,UAAUl9B,SAAStc,EAAEjb,QAGlD,MAAMk1B,EAAS,eACfja,EAAE9X,QAAQ,EAAEnD,OAAM4xB,cAChB,MAAMlD,EAAM,IAAI,GAAI,CAClBsB,WAAY,IAAI,GAAW,CACzB4B,UACAzrB,KAAM+uB,EACNn2B,MAAO,GAAKiB,MAIhBnD,KAAK03D,UAAU/iD,IAAIxR,EAAM0uB,KAG3B,MAAMoB,EAAOY,GAAkB,IAAI7zB,KAAK03D,UAAUx4B,UAAWl/B,KAAKm3D,eAOlE,GALAn3D,KAAKs3D,aAAazpD,QAAQ9D,OAAOkpB,GAC9BjwB,EAAQg5B,UACTh5B,EAAQg5B,SAASjyB,OAAO/J,KAAKs3D,aAAar3D,YAGxC+C,EAAQ60D,aAAc,CACxB,MAAM53D,EAAY63D,GAAgB90D,EAAQg5B,SAAU,oBAAqB,sCAEzEh8B,KAAKu3D,WAAa,IAAI7nD,IAAI,CAAC,CACzB,WACA,CACEgkB,aAAc1wB,EAAQ+0D,eAAe,GACrCxpD,IAAK,WACLsjB,IAAK,KACLxkB,KAAM,aACN+lB,gBAAiB,qCACjB3pB,WAAW,IAEZ,CACD,QACA,CACEiqB,aAAc1wB,EAAQ+0D,eAAe,GACrCxpD,IAAK,QACLsjB,IAAK,KACLxkB,KAAM,UACN+lB,gBAAiB,qCACjB3pB,WAAW,MAIfzJ,KAAKu3D,WAAWjxD,QAAS0xD,IACvBA,EAAUnmC,IAAM,IAAI,GAAImmC,GAExBA,EAAUnmC,IAAI5xB,UAAUe,iBAAiB,QAAS,KAChDmF,EAAQtF,KAAK,KACX,MAAMo3D,EAAWj4D,KAAK8R,QAAQkmD,EAAUzpD,KACxC,IAAI,GAAiBvL,EAAQwM,IAAIlC,QAAQyD,KAAK,CAC5C5N,KAAM,UACNijC,WAAW,EACXx4B,MAAOoqD,EAAUtkC,aACjB9mB,YAAa,kCACbgzB,QAAUs4B,IACRD,EAAS91D,OAAS,EAClB81D,EAAStyD,QAAQuyD,GACjBF,EAAUnmC,IAAIxF,SAASpoB,UAAY,GACnC+zD,EAAUnmC,IAAIxF,SAAStiB,UAAU/J,KAAKm4D,YAAYn4D,KAAKo4D,iBAAiBF,MAE1EzxB,gBAAiBwxB,QAKvBh4D,EAAU8J,OAAOiuD,EAAUnmC,IAAI5xB,aAQnC,MAAMkG,EAAU,GAAkBkyD,WAAWr1D,EAAQqzD,UAAUx1D,KAAKu1D,IAClE,MAAM5iD,EAAU,GAAkB8kD,uBAAuBlC,GACzDp2D,KAAKu4D,SAAS/kD,EAAQrQ,MAEnBnD,KAAKu3D,aACNv3D,KAAK8R,QAAU,GACf,CAAC,QAAkB,YAAqBxL,QAAQ+rC,IAC9C,MAAM/tC,EAAM,GACN8D,EAAa,UAANiqC,EAAgB7+B,EAAQyjD,WAAazjD,EAAQ0jD,cAC1D5yD,EAAIqB,QAAQyC,EAAKouD,MAAM/tD,IAAI0G,GAAMA,EAAG2Y,aACpCxjB,EAAIqB,QAAQyC,EAAKsuD,MAAMjuD,IAAI0G,GAAMA,EAAG2Y,UAAS,KAC7C9nB,KAAK8R,QAAQugC,GAAK/tC,EAClB,MAAMuR,EAAI7V,KAAKu3D,WAAWvnD,IAAIqiC,GAAGxgB,IAAIxF,SACrCxW,EAAE5R,UAAY,GACd4R,EAAE9L,UAAU/J,KAAKm4D,YAAY/vD,OAIjCpF,EAAQwM,IAAIhB,cAAcxN,iBAAiB,UAAW,KACpD,MAAMo1D,EAA4B,GAElC,OAAOp2D,KAAKmD,MACV,KAAK6yD,GAAYwB,UACfpB,EAAMzwD,KAAK,CAACyB,EAAG,8BACf,MACF,KAAK4uD,GAAY2B,SACfvB,EAAMzwD,KAAK,CAACyB,EAAG,mCACf,MACF,KAAK4uD,GAAYyB,OACfrB,EAAMzwD,KAAK,CAACyB,EAAG,iCAIhBpH,KAAKu3D,YACL,CACC,CAAC,QAAa,yCAA8C,+BAC5D,CAAC,WAAa,4CAA8C,mCAK1DjxD,QAAQ,EAAE+rC,EAAGmmB,EAASC,GAAWp0D,KACnC,GAAGrE,KAAKu3D,WAAWvnD,IAAIqiC,GAAGxgB,IAAI5xB,UAAUG,UAAUuR,SAAS,QACzD,OAGF,MAAMsmD,EAAWj4D,KAAK8R,QAAQugC,GAC9B,GAAG4lB,EAAU,CACX,MAAMS,EAAW14D,KAAKo4D,iBAAiBH,GACpCS,EAAShC,MAAMv0D,QAChBi0D,EAAMzwD,KAAK,CAACyB,EAAGoxD,EAAS9B,MAAOgC,EAAShC,QAGvCgC,EAASlC,MAAMr0D,QAChBi0D,EAAMzwD,KAAK,CAACyB,EAAGqxD,EAAUjC,MAAOkC,EAASlC,MAAM/tD,IAAI0G,GAAM,IAAgBwpD,aAAaxpD,SAM9F,GAAkBypD,WAAW51D,EAAQqzD,SAAUD,IAC9C,CAACz+C,MAAM,MAyBP,SAASxU,GACd,MAAM0uB,EAAM7xB,KAAK03D,UAAU1nD,IAAI7M,GAC/BnD,KAAKm3D,cAAch0D,GACnB0uB,EAAIsB,WAAWpxB,MAAM4b,SAAU,EAGzB,iBAAiB7L,GACvB,MAAM8hD,EAAQ,CAAC4C,MAAO,GAAgBE,MAAO,IAK7C,OAJA5kD,EAAQxL,QAAQW,IACd2sD,EAAM3sD,EAAOw3B,YAAc,QAAU,SAAS94B,KAAKsB,EAAOw3B,YAAcx3B,EAAO4vB,WAAa5vB,KAGvF2sD,EAGD,YAAYA,GAClB,OAAIA,EAAM4C,MAAMr0D,QAAWyxD,EAAM8C,MAAMv0D,OAIhC,eAAK,CACVyxD,EAAM4C,MAAMr0D,OAAS,eAAK,QAAS,CAACyxD,EAAM4C,MAAMr0D,SAAW,KAC3DyxD,EAAM8C,MAAMv0D,OAAS,eAAK,QAAS,CAACyxD,EAAM8C,MAAMv0D,SAAW,MAC3DyF,OAAOc,UAAU,GANV,CAAC,eAAK,wCC7OJ,MAAM,WAAiC,EAC1C,OACR1I,KAAKC,UAAUG,UAAUC,IAAI,cAAe,wBAC5CL,KAAKmR,SAAS,gBAEd,MACM0nD,EAAe,IAAI,GAAe,CACtCrpD,IAAKxP,KACL4N,MAAO,oBACPyoD,SAAU,6BACVe,SAAU,CALsB,sCAKO,IACvCW,eAAgB,CAAC,uCAAwC,yCACzD/7B,SAAUh8B,KAAK+K,WACfosD,cAAgBh0D,IACd0S,EAAE0iD,SAASvC,GAAYwB,WACvB3hD,EAAEyhD,aAAar3D,UAAUG,UAAUkM,OAAO,OAAQnJ,IAAS6yD,GAAYyB,WAKrE5hD,EAAI,IAAI,GAAe,CAC3BrG,IAAKxP,KACL4N,MAAO,qBACPyoD,SAAU,8BACVe,SAAU,CALkB,wCAKG,IAC/BS,cAAc,EACdD,UAAW,CAAC5B,GAAYyB,UAG1Bz3D,KAAK+K,WAAW9K,UAAU0gB,aAAa9K,EAAEyhD,aAAar3D,UAAW44D,EAAavB,aAAar3D,UAAU64D,c,aC1B1F,MAAM,WAAqC,EAC9C,OACR94D,KAAKC,UAAUG,UAAUC,IAAI,wBAAyB,6BACtDL,KAAKmR,SAAS,kCAEd,MAAMinB,EAAU,IAAI,GAAe,CACjCc,QAAS,qCACTC,aAAa,IAITllB,EAAM,GAAmBumC,wBADjB,MAERue,EAAmB74D,SAASC,cAAc,OAE7C8T,EACDiZ,GAAY,CACVjZ,MACAkZ,IAAK4rC,EACLv4D,MAAM,EACNiB,MAAM,EACNf,MAAO,IACPC,OAAQ,MACPE,KAAK,QAIRk4D,EAAiB34D,UAAUC,IAAI,yBAGjC+3B,EAAQvqB,QAAQ9D,OAAOgvD,GAEvB,MAAMC,EAAe5gC,EAAQgJ,yBAEvB9vB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAAM44D,EAAY,YAAO,gCAAiC,CAAC/7C,KAAM,8CAEjE,YAAiB+7C,EAAYh3D,IAC3BjC,KAAK05B,UAGP15B,KAAKsN,OAAO4rD,kBAAkB,GAAgBl5D,MAE9CsR,EAAavH,OAAOkvD,GAEpBD,EAAajvD,OAAOuH,GAEpBtR,KAAK+K,WAAW9K,UAAU8J,OAAOquB,EAAQn4B,Y,cCtDtC,SAASk5D,GAASC,GACvB,OAAQ,sBAAqBA,ECchB,MAAM,WAAmD,EAAxE,c,oBAKS,KAAAC,SAAU,EAEP,OACRr5D,KAAKC,UAAUG,UAAUC,IAAI,wBAAyB,4CACtDL,KAAKmR,SAAS,6BAEd,MAAMinB,EAAU,IAAI,GAAe,CACjCc,SAAS,EACTC,aAAa,IAGf,gBAAMf,EAAQc,QAAS,mCAAoC,CAACl5B,KAAKs5D,QAEjE,MACMrlD,EAAM,GAAmBumC,wBADjB,MAERue,EAAmB74D,SAASC,cAAc,OAE7C8T,EACDiZ,GAAY,CACVjZ,MACAkZ,IAAK4rC,EACLv4D,MAAM,EACNiB,MAAM,EACNf,MAAO,IACPC,OAAQ,IACRw5C,MAZU,OAaTt5C,KAAK,QAIRk4D,EAAiB34D,UAAUC,IAAI,yBAGjC+3B,EAAQvqB,QAAQ9D,OAAOgvD,GAEvB,MAAMC,EAAe5gC,EAAQgJ,yBAEvB9vB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAAMwB,EAAa7B,KAAKu5D,eAAiB,IAAI,KAAe,CAC1DjwD,KAAM,sBACNkI,MAAO,2BACPrP,OAAQnC,KAAKmC,OACbwB,OAASse,IACPmnB,GAAO,GAEPowB,GAAA,EAAgBC,qBAAqB,GAAKx3C,GACzCphB,KAAKqB,IAKJw3D,MAEDltD,MAAMC,IACL,OAAOA,EAAItJ,MACT,IAAK,eACHtB,EAAWE,MAAM3B,UAAUC,IAAI,SAC/B,OAAAkM,EAAA,GAAe1K,EAAW2P,MAAO,eAAK,oCACtC,MAEF,IAAK,qBACH3P,EAAWE,MAAM3B,UAAUC,IAAI,SAC/B,OAAAkM,EAAA,GAAe1K,EAAW2P,MAAO,eAAK,oCACtC,MAEF,QACE9E,QAAQC,MAAM,gBAAiBF,GAInC28B,GAAO,QAKPuwB,EAAY,YAAO,8CAA+C,CAACz8C,KAAM,qCACzE08C,EAAY,YAAO,4DAA6D,CAAC18C,KAAM,eAEvFw8C,EAAS,KACb,IAAI,GAA6B15D,KAAKsN,QAAQyD,QAG1Cq4B,EAAUywB,IACd,OAAA7gC,GAAA,GAAiB,CAACn3B,EAAWE,MAAO43D,EAAWC,GAAYC,IAG7D,YAAiBF,EAAY13D,IAC3BmnC,GAAO,GACPowB,GAAA,EAAgBM,sBAAsBj5D,KAAKqB,IACzClC,KAAKsN,OAAO4rD,kBAAkB,GAAgCl5D,MAC9DA,KAAK05B,SACJ,KACD0P,GAAO,OAIX,YAAiBwwB,EAAY33D,IAC3BmnC,GAAO,GACP,MAAM1pB,EAAI,aAAak6C,GACvBJ,GAAA,EAAgBO,sBAAsBl5D,KAAKqB,IACzCwd,EAAE/d,SACFynC,GAAO,OAIX93B,EAAavH,OAAOlI,EAAW5B,UAAW05D,EAAWC,GAErDZ,EAAajvD,OAAOuH,GAEpBtR,KAAK+K,WAAW9K,UAAU8J,OAAOquB,EAAQn4B,WAG3C,qBACMk5D,GAASn5D,KAAKq5D,UAClBr5D,KAAKu5D,eAAex3D,MAAM0J,SCzHf,MAAM,WAAuC,EAA5D,c,oBAMS,KAAA4tD,SAAU,EAEP,OACRr5D,KAAKC,UAAUG,UAAUC,IAAI,wBAAyB,+BACtDL,KAAKmR,SAAS,sBAEd,MAAMinB,EAAU,IAAI,GAAe,CACjCc,SAAS,EACTC,aAAa,IAITllB,EAAM,GAAmBumC,wBADjB,MAERue,EAAmB74D,SAASC,cAAc,OAE7C8T,EACDiZ,GAAY,CACVjZ,MACAkZ,IAAK4rC,EACLv4D,MAAM,EACNiB,MAAM,EACNf,MAAO,IACPC,OAAQ,IACRw5C,MAZU,OAaTt5C,KAAK,QAIRk4D,EAAiB34D,UAAUC,IAAI,yBAGjC+3B,EAAQvqB,QAAQ9D,OAAOgvD,GAEvB,MAAMC,EAAe5gC,EAAQgJ,yBAEvB9vB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAAMwB,EAAa7B,KAAK6B,WAAa,IAAI,IAAW,CAClDyH,KAAM,iBACNkI,MAAO,gBACPtO,WAAW,IAGbrB,EAAWE,MAAMf,iBAAiB,WAAaiB,IAC7C,GAAa,UAAVA,EAAEsM,IAEH,OADA,OAAAmP,EAAA,GAAYzb,GACL+3D,MAIXn4D,EAAWE,MAAMf,iBAAiB,QAAUiB,IAC1CJ,EAAWE,MAAM3B,UAAUuB,OAAO,WAGpC,MAAMs4D,EAAc,YAAO,gCAAiC,CAAC/8C,KAAM,aAC7Dg9C,EAAU,YAAO,4DAA6D,CAACh9C,KAAM,kBAErFw8C,EAAS,KACb,IAAI,GAA6B15D,KAAKsN,QAAQyD,QAG1CipD,EAAkB,KACtB,MAAMV,EAAQz3D,EAAWK,MAAMoJ,OACzBsH,EAAQ,IAAkBunD,WAAWb,GAC3C,IAAI1mD,GAASA,EAAM,GAAGzQ,SAAWm3D,EAAMn3D,OAErC,YADAN,EAAWE,MAAM3B,UAAUC,IAAI,SAIjC+5D,GAAc,GACd,MAAM16C,EAAI,aAAau6C,GAEvBT,GAAA,EAAgBa,eAAe,CAC7BC,KAAMt6D,KAAKs6D,KACXC,gBAAiBv6D,KAAKw6D,cACtBC,YAAaz6D,KAAKy6D,YAClBnB,UACCz4D,KAAMqB,IACPw3D,KACEjtD,IACF,GAAGA,EAAItJ,KAAKu3B,SAAS,qBAAsB,CACzC,MAAMggC,GAAWjuD,EAAItJ,KAAKyP,MAAM,4BAA4B,GAEtDpD,EAAM,IAAI,GAA2CxP,KAAKsN,QAChEkC,EAAIolB,MAAQ50B,KAAK40B,MACjBplB,EAAI8pD,MAAQA,EACZ9pD,EAAIrN,OAASu4D,EACblrD,EAAIuB,YAEJrE,QAAQsiD,IAAI,qBAAsBviD,GAGpC2tD,GAAc,GACd16C,EAAE/d,YAGN,YAAiBs4D,EAAaD,GAE9B,MAAMI,EAAiBhxB,IAClBA,GACD6wB,EAAY72D,aAAa,WAAY,QACrC82D,EAAQ92D,aAAa,WAAY,UAEjC62D,EAAY71B,gBAAgB,YAC5B81B,EAAQ91B,gBAAgB,cAI5B,YAAiB81B,EAAUj4D,IACX,IAAI,GAAU,mBAAoB,CAC9C2b,QAAS,CAAC,CACRmX,QAAS,SACT4lC,UAAU,GACT,CACD5lC,QAAS,gBACTiD,SAAU,KAERoiC,GAAc,GACd,aAAaF,GACbV,GAAA,EAAgBa,eAAe,CAC7BC,KAAMt6D,KAAKs6D,KACXC,gBAAiBv6D,KAAKw6D,cACtBC,YAAaz6D,KAAKy6D,YAClBnB,MAAO,KACNz4D,KAAK,KACN64D,KACEjtD,IACF2tD,GAAc,MAGlBl3B,UAAU,IAEZxP,aAAc,uBACd+D,mBAAoB,6BAGhBlX,SAGRjP,EAAavH,OAAOlI,EAAW5B,UAAWg6D,EAAaC,GAEvDlB,EAAajvD,OAAOuH,GAEpBtR,KAAK+K,WAAW9K,UAAU8J,OAAOquB,EAAQn4B,WAG3C,qBACMk5D,GAASn5D,KAAKq5D,UAClBr5D,KAAK6B,WAAWE,MAAM0J,S,iCC/JX,MAAM,WAAsC,EAM/C,OACRzL,KAAKC,UAAUG,UAAUC,IAAI,wBAAyB,8BACtDL,KAAKmR,SAAS,8BAEd,MAAMinB,EAAU,IAAI,GAAe,CACjCe,aAAa,IAITllB,EAAM,GAAmBumC,wBADjB,MAERue,EAAmB74D,SAASC,cAAc,OAE7C8T,EACDiZ,GAAY,CACVjZ,MACAkZ,IAAK4rC,EACLv4D,MAAM,EACNiB,MAAM,EACNf,MAAO,IACPC,OAAQ,IACRw5C,MAZU,OAaTt5C,KAAK,QAIRk4D,EAAiB34D,UAAUC,IAAI,yBAGjC+3B,EAAQvqB,QAAQ9D,OAAOgvD,GAEvB,MAAMznD,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAAMwB,EAAa7B,KAAK6B,WAAa,IAAI,IAAW,CAClDyH,KAAM,OACNkI,MAAO,qCAGT3P,EAAWE,MAAMf,iBAAiB,WAAaiB,IAC7C,GAAa,UAAVA,EAAEsM,IAEH,OADA,OAAAmP,EAAA,GAAYzb,GACLJ,EAAWK,MAAQ83D,IAAoBY,MAIlD,MAAMlB,EAAS,CAACz3D,EAAW44D,KACtB54D,GACD,OAAAyb,EAAA,GAAYzb,GAGd,MAAMq4D,EAAOO,EAAWh5D,EAAWK,WAAQwC,EAC3C,GAAG41D,GAAQt6D,KAAKy6D,cAAgBH,EAE9B,YADAplC,GAAM,UAAKlc,OAAO,uBAAuB,IAI3C,MAAMxJ,EAAM,IAAI,GAA+BxP,KAAKsN,QACpDkC,EAAIolB,MAAQ50B,KAAK40B,MACjBplB,EAAIgrD,cAAgBx6D,KAAKw6D,cACzBhrD,EAAIirD,YAAcz6D,KAAKy6D,YACvBjrD,EAAI8qD,KAAOA,EAEX9qD,EAAIuB,QAGAkpD,EAAc,YAAO,gCAAiC,CAAC/8C,KAAM,aAC7Dg9C,EAAU,YAAO,4DAA6D,CAACh9C,KAAM,kBAErF88C,EAAmB/3D,GAAcy3D,EAAOz3D,GAAG,GAC3C24D,EAAe34D,GAAcy3D,EAAOz3D,GAAG,GAC7C,YAAiBg4D,EAAaD,GAC9B,YAAiBE,EAASU,GAE1BtpD,EAAavH,OAAOlI,EAAW5B,UAAWg6D,EAAaC,GAEvD9hC,EAAQvqB,QAAQ9D,OAAOuH,GAEvBtR,KAAK+K,WAAW9K,UAAU8J,OAAOquB,EAAQn4B,WAG3C,qBACED,KAAK6B,WAAWE,MAAM0J,SCzFX,MAAM,WAAiD,EAM1D,OACRzL,KAAKC,UAAUG,UAAUC,IAAI,wBAAyB,uCAAwC,2CAC9FL,KAAKmR,SAAS,yBAEd,MAAMinB,EAAU,IAAI,GAAe,CACjCe,aAAa,IAGT7nB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAAMR,EAAqBG,KAAKH,mBAAqB,IAAI,KAAmB,CAC1EyJ,KAAM,oBACNkI,MAAO,0BAGHspD,EAAS,IAAI,KAAej7D,EAAoB,KAEhDo6D,EAAc,YAAO,gCAAiC,CAAC/8C,KAAM,aAEnE5L,EAAavH,OAAOlK,EAAmBI,UAAWg6D,GAClD7hC,EAAQvqB,QAAQ9D,OAAO+wD,EAAO76D,UAAWqR,GAEzCtR,KAAK+K,WAAW9K,UAAU8J,OAAOquB,EAAQn4B,WAEzCJ,EAAmBkC,MAAMf,iBAAiB,WAAaiB,IAKrD,GAJGpC,EAAmBkC,MAAM3B,UAAUuR,SAAS,UAC7C9R,EAAmBq2B,SAAS,IAAWC,SAG5B,UAAVl0B,EAAEsM,IACH,OAAOyrD,MAIX,MAAMe,EAAc,IACf/6D,KAAKy6D,cAAgB56D,EAAmBqC,QACzCrC,EAAmBw2B,YACZ,GAML2jC,EAAmB/3D,IAKvB,GAJGA,GACD,OAAAyb,EAAA,GAAYzb,IAGV84D,IAAe,OAEnB,MAAMvrD,EAAM,IAAI,GAA8BxP,KAAKsN,QACnDkC,EAAIolB,MAAQ50B,KAAK40B,MACjBplB,EAAIgrD,cAAgBx6D,KAAKw6D,cACzBhrD,EAAIirD,YAAcz6D,KAAKy6D,YACvBjrD,EAAIuB,QAIN,OAFA,YAAiBkpD,EAAaD,GAEvBc,EAAOh1D,OAGhB,qBACE9F,KAAKH,mBAAmBkC,MAAM0J,SC/DnB,MAAM,WAA+C,EAApE,c,oBAIS,KAAA4tD,SAAU,EAEP,OACR,MAAMx0B,GAAS7kC,KAAK40B,MAAMtd,OAAO0jD,cAAgBh7D,KAAKw6D,cACtDx6D,KAAKC,UAAUG,UAAUC,IAAI,wBAAyB,wCACtDL,KAAKmR,SAAS0zB,EAAQ,2BAA6B,8BAEnD,MAAMzM,EAAU,IAAI,GAAe,CACjCe,aAAa,IAGT7nB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAAMR,EAAqBG,KAAKH,mBAAqB,IAAI,KAAmB,CAC1EyJ,KAAM,iBACNkI,MAAOqzB,EAAQ,2BAA8B7kC,KAAK40B,MAAM0lC,UAAO51D,EAAY,gBAC3Eu2D,WAAYp2B,GAAS7kC,KAAK40B,MAAM0lC,KAAO,IAAkB7tC,cAAczsB,KAAK40B,MAAM0lC,WAAQ51D,IAGtFo2D,EAAS,IAAI,KAAej7D,EAAoB,KAEhDo6D,EAAc,YAAO,iCACrBrjB,EAAS,IAAI,UAAKskB,YAAY,CAAC3sD,IAAK,aAE1C0rD,EAAYlwD,OAAO6sC,EAAO5hC,SAE1B1D,EAAavH,OAAOlK,EAAmBI,UAAWg6D,GAClD7hC,EAAQvqB,QAAQ9D,OAAO+wD,EAAO76D,UAAWqR,GAEzCtR,KAAK+K,WAAW9K,UAAU8J,OAAOquB,EAAQn4B,WAEzCJ,EAAmBkC,MAAMf,iBAAiB,WAAaiB,IAOrD,GANGpC,EAAmBkC,MAAM3B,UAAUuR,SAAS,WAC7C9R,EAAmBkC,MAAM3B,UAAUuB,OAAO,SAC1Ci1C,EAAOroC,IAAM,WACbqoC,EAAOjV,UAGI,UAAV1/B,EAAEsM,IACH,OAAOyrD,MAIX,MAAMe,EAAc,MACdl7D,EAAmBqC,MAAMC,SAC3BtC,EAAmBkC,MAAM3B,UAAUC,IAAI,UAChC,GAMX,IAAI25D,EACJ,GAAIn1B,EAkEFm1B,EAAmB/3D,IAKjB,GAJGA,GACD,OAAAyb,EAAA,GAAYzb,IAGV84D,IAAe,OAEnB,MAAMvrD,EAAM,IAAI,GAAyCxP,KAAKsN,QAC9DkC,EAAIolB,MAAQ50B,KAAK40B,MACjBplB,EAAIirD,YAAc56D,EAAmBqC,MACrCsN,EAAIgrD,cAAgBx6D,KAAKw6D,cACzBhrD,EAAIuB,YA7EG,CACT,IAAIoqD,EAEAxmC,EAAW,KAETwmC,IACFA,EAAmB5vD,OAAOugC,YAAYnX,EAAU,MAG3C6kC,GAAA,EAAgB7kC,WAAW9zB,KAAKu6D,IACrCp7D,KAAK40B,MAAQwmC,EAEVp7D,KAAK40B,MAAM0lC,KACZz6D,EAAmB2R,MAAMvN,UAAY,IAAkBwoB,cAAczsB,KAAK40B,MAAM0lC,MAEhF,OAAA/tD,EAAA,GAAe1M,EAAmB2R,MAAO,eAAK,qBA+CpDwoD,EA1CgB/3D,IACd,IAAI84D,IAEF,YADA,OAAAr9C,EAAA,GAAYzb,GAIdg4D,EAAY72D,aAAa,WAAY,QACrCwzC,EAAOroC,IAAM,aACbqoC,EAAOjV,SACP,MAAM7a,EAAY,aAAamzC,GAEzBO,EAAgB36D,EAAmBqC,MACzCs3D,GAAA,EAAgB6B,MAAMx7D,EAAmBqC,MAAOlC,KAAK40B,OAAO/zB,KAAKy6D,IAG/D,GAFA5uD,QAAQsiD,IAAIsM,GAEE,uBAAXA,EAAKl0D,EAA4B,CAClCwuC,cAAculB,GACXL,GAAQA,EAAOn5D,SAClB,MAAM6N,EAAM,IAAI,GAA0BxP,KAAKsN,QAC/CkC,EAAIolB,MAAQ50B,KAAK40B,MACjBplB,EAAIgrD,cAAgBA,EACpBhrD,EAAIuB,OACJ/Q,KAAKsN,OAAOkD,qBAAqBxQ,QAEjCyM,IACFwtD,EAAY71B,gBAAgB,YAC5BvkC,EAAmBkC,MAAM3B,UAAUC,IAAI,SAEhCoM,EAAItJ,KAGPyzC,EAAOroC,IAAM,8BACbqoC,EAAOjV,SACP7a,EAAUnlB,SACV9B,EAAmBw0B,SAIvBM,OAMJA,IAmBF,OAFA,YAAiBslC,EAAaD,GAEvBc,EAAOh1D,OAGhB,qBACMqzD,GAASn5D,KAAKq5D,UAClBr5D,KAAKH,mBAAmBkC,MAAM0J,SCrJnB,MAAM,WAAkC,EAI3C,OACRzL,KAAKC,UAAUG,UAAUC,IAAI,wBAAyB,8BACtDL,KAAKmR,SAAS,4BAEd,MAAMinB,EAAU,IAAI,GAAe,CACjCc,SAAS,EACTC,aAAa,IAITllB,EAAM,GAAmBumC,wBADjB,MAERue,EAAmB74D,SAASC,cAAc,OAE7C8T,EACDiZ,GAAY,CACVjZ,MACAkZ,IAAK4rC,EACLv4D,MAAM,EACNiB,MAAM,EACNf,MAAO,IACPC,OAAQ,IACRw5C,MAZU,OAaTt5C,KAAK,QAIRk4D,EAAiB34D,UAAUC,IAAI,yBAGjC+3B,EAAQvqB,QAAQ9D,OAAOgvD,GAEvB,MAAMplC,EAAIyE,EAAQgJ,yBAClB,GAAGphC,KAAK40B,MAAMtd,OAAO0jD,aAAc,CACjC,gBAAM5iC,EAAQc,QAAS,2BAEvB,MAAMqiC,EAAoB,YAAO,8BAA+B,CAACluD,KAAM,OAAQ6P,KAAM,+BAC/Es+C,EAAqB,YAAO,8BAA+B,CAACnuD,KAAM,cAAe6P,KAAM,+BACvFu+C,EAAsB,YAAO,8BAA+B,CAACpuD,KAAM,QAAS6P,KAAMld,KAAK40B,MAAMtd,OAAOokD,aAAe,0BAA4B,2BAErJ,YAAiBH,EAAmB,KAClC,MAAM/rD,EAAM,IAAI,GAAuCxP,KAAKsN,QAC5DkC,EAAIolB,MAAQ50B,KAAK40B,MACjBplB,EAAIgrD,cAAgBx6D,KAAKw6D,cACzBhrD,EAAIuB,SAGN,YAAiByqD,EAAoB,KACrB,IAAI,GAAU,yBAA0B,CACpD59C,QAAS,CAAC,CACRmX,QAAS,UACTiD,SAAU,KACRwhC,GAAA,EAAgBa,eAAe,CAACE,gBAAiBv6D,KAAKw6D,gBAAgB35D,KAAK,KACzEb,KAAKsN,OAAO4rD,kBAAkB,GAAgBl5D,MAC9CA,KAAK05B,WAGTwJ,UAAU,IAEZxP,aAAc,+BACd+D,mBAAoB,4BAGhBlX,SAGR,YAAiBk7C,EAAqB,KACpC,MAAMjsD,EAAM,IAAI,GAA+BxP,KAAKsN,QACpDkC,EAAIolB,MAAQ50B,KAAK40B,MACjBplB,EAAI8qD,KAAOt6D,KAAK40B,MAAM0lC,KACtB9qD,EAAIgrD,cAAgBx6D,KAAKw6D,cACzBhrD,EAAIirD,YAAcz6D,KAAKw6D,cACvBhrD,EAAI6pD,SAAU,EACd7pD,EAAIuB,SAGN4iB,EAAE5pB,OAAOwxD,EAAmBC,EAAoBC,OAC3C,CACL,gBAAMrjC,EAAQc,QAAS,+BAEvB,MAAM5nB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3B,MAAMs7D,EAAiB,YAAO,gCAAiC,CAACz+C,KAAM,mCAEtE5L,EAAavH,OAAO4xD,GACpBhoC,EAAE5pB,OAAOuH,GAET,YAAiBqqD,EAAiB15D,IAChC,MAAMuN,EAAM,IAAI,GAAuCxP,KAAKsN,QAC5DkC,EAAIolB,MAAQ50B,KAAK40B,MACjBplB,EAAIuB,SAIR/Q,KAAK+K,WAAW9K,UAAU8J,OAAOquB,EAAQn4B,YC5G9B,MAAM,WAA8B,EACvC,OACRD,KAAKC,UAAUG,UAAUC,IAAI,cAAe,qBAC5CL,KAAKmR,SAAS,mBAEd,MAAM+nB,EAAuB,gDAC7B,IAAI,GAAe,CACjB1pB,IAAKxP,KACL4N,MAAO,gBACPyoD,SAAU,iCACVe,SAAU,CAACl+B,EAASA,EAASA,GAC7B6+B,eAAgB,CAAC,uCAAwC,yCACzD/7B,SAAUh8B,KAAK+K,cCXN,MAAM,WAAkC,EAC3C,OACR/K,KAAKC,UAAUG,UAAUC,IAAI,cAAe,yBAC5CL,KAAKmR,SAAS,uBAEd,MAAM+nB,EAAuB,oDAC7B,IAAI,GAAe,CACjB1pB,IAAKxP,KACL4N,MAAO,2BACPyoD,SAAU,8BACVe,SAAU,CAACl+B,EAASA,EAASA,GAC7B6+B,eAAgB,CAAC,uCAAwC,yCACzD/7B,SAAUh8B,KAAK+K,WACf6sD,UAAW,CAAC5B,GAAYyB,WCdf,MAAM,WAAqC,EAC9C,OACRz3D,KAAKC,UAAUG,UAAUC,IAAI,cAAe,4BAC5CL,KAAKmR,SAAS,4BAEd,MAAM+nB,EAAuB,gDAC7B,IAAI,GAAe,CACjB1pB,IAAKxP,KACL4N,MAAO,uBACPyoD,SAAU,0BACVe,SAAU,CAACl+B,EAASA,EAASA,GAC7B6+B,eAAgB,CAAC,uCAAwC,yCACzD/7B,SAAUh8B,KAAK+K,cCXN,MAAM,WAAiC,EAC1C,OACR/K,KAAKC,UAAUG,UAAUC,IAAI,cAAe,yBAC5CL,KAAKmR,SAAS,0BAEd,MAAM+nB,EAAuB,6CAC7B,IAAI,GAAe,CACjB1pB,IAAKxP,KACL4N,MAAO,cACPyoD,SAAU,4BACVe,SAAU,CAACl+B,EAASA,EAASA,GAC7B6+B,eAAgB,CAAC,uCAAwC,yCACzD/7B,SAAUh8B,KAAK+K,WACf6sD,UAAW,CAAC5B,GAAYyB,WCdf,MAAM,WAA2B,EACpC,OACRz3D,KAAKC,UAAUG,UAAUC,IAAI,cAAe,iBAC5CL,KAAKmR,SAAS,8BAEd,MAAM+nB,EAAuB,iDAC7B,IAAI,GAAe,CACjB1pB,IAAKxP,KACL4N,MAAO,eACPyoD,SAAU,2BACVe,SAAU,CAACl+B,EAASA,EAASA,GAC7B6+B,eAAgB,CAAC,uCAAwC,yCACzD/7B,SAAUh8B,KAAK+K,aAGjB,CACE,MAAMmuB,EAAuB,qCAC7B,IAAI,GAAe,CACjB1pB,IAAKxP,KACL4N,MAAO,mBACPyoD,SAAU,0BACVe,SAAU,CAACl+B,EAASA,EAASA,GAC7B6+B,eAAgB,CAAC,uCAAwC,yCACzD/7B,SAAUh8B,KAAK+K,eCVR,MAAM,WAA6B,EAKtC,OACR/K,KAAKC,UAAUG,UAAUC,IAAI,6BAC7BL,KAAKmR,SAAS,iBAEd,MAAMyqD,EAAWN,IACf,MAAMzpC,EAAM,IAAI,GAAI,CAClBjkB,MAAO,CAAC0tD,EAAKO,SAAUP,EAAKQ,aAAan0C,KAAK,KAC9C0E,SAAU,CAACivC,EAAKS,GAAIT,EAAKU,SAASr0C,KAAK,OACvCle,WAAW,EACX+pB,WAAY8nC,EAAKhkD,OAAOlS,aAAUV,EAAY,aAA8B,IAAI2wC,KAAqD,IAAhDhzC,KAAKP,IAAIw5D,EAAKW,YAAaX,EAAKY,kBAGvHrqC,EAAI5xB,UAAUmM,QAAQ+vD,KAAO,GAAKb,EAAKa,KAEvC,MAAMC,EAAWl8D,SAASC,cAAc,OAMxC,OALAi8D,EAASh8D,UAAUC,IAAI,gBACvB+7D,EAASn4D,UAAY,CAACq3D,EAAKe,aAAcf,EAAKgB,gBAAkBhB,EAAKiB,UAAU30D,OAAOc,SAASif,KAAK,MAEpGkK,EAAIxF,SAASvb,cAAc6P,aAAay7C,EAAUvqC,EAAIxF,UAE/CwF,GAGH2qC,EAAiBx8D,KAAKw8D,eAAe/4D,QAE3C,CACE,MAAM20B,EAAU,IAAI,GAAe,CACjC9uB,KAAM,mBAGFgyD,EAAOkB,EAAe3/B,cAAcy+B,GAAQA,EAAKhkD,OAAOlS,SACxDq3D,EAAUb,EAAQN,GAIxB,GAFAljC,EAAQvqB,QAAQ9D,OAAO0yD,EAAQx8D,WAE5Bu8D,EAAer6D,OAAQ,CACxB,MAAMu6D,EAAe,YAAO,qCAAsC,CAACrvD,KAAM,OAAQ6P,KAAM,yBACvF,YAAiBw/C,EAAez6D,IAC9B,IAAI,GAAU,iBAAkB,CAC9B2b,QAAS,CAAC,CACRmX,QAAS,YACTmO,UAAU,EACVlL,SAAU,KACR,MAAM1rB,EAAS,OAAA0sB,GAAA,GAAiB,CAAC0jC,IAAe,GAChD,KAAWhmC,UAAU,4BAA4B71B,KAAKqB,IAEpDw6D,EAAa/6D,SACbg7D,EAAa18D,UAAU0B,SACvB3B,KAAK48D,WAAWC,wBACftuB,GAASttB,QAAQ,KAClB3U,SAINonB,aAAc,0BACd+D,mBAAoB,uBACnBlX,SAGL6X,EAAQvqB,QAAQ9D,OAAO2yD,GAGzB18D,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAGjC,IAAIu8D,EAAer6D,OACjB,OAGF,MAAMw6D,EAAe,IAAI,GAAe,CACtCrzD,KAAM,kBAGRkzD,EAAel2D,QAAQg1D,IACrBqB,EAAa9uD,QAAQ9D,OAAO6xD,EAAQN,GAAMr7D,aAG5CD,KAAK+K,WAAWhB,OAAO4yD,EAAa18D,WAEpC,MAAMsuC,EAAW9hC,IACC,wCAAbA,EAAItJ,MACL+xB,GAAM,UAAKlc,OAAO,mCAAmC,KAIzD,IAAInE,EACJ,MAAMioD,EAAmB,KACvB,MAAMX,EAAOtnD,EAAOzI,QAAQ+vD,KAE5B,IAAI,GAAU,iBAAkB,CAC9Bv+C,QAAS,CAAC,CACRmX,QAAS,YACTmO,UAAU,EACVlL,SAAU,KACR,KAAWtB,UAAU,6BAA8B,CAACylC,SACnDt7D,KAAKqB,IACDA,IACD2S,EAAOlT,SACP3B,KAAK48D,WAAWC,yBAEjBtuB,MAGP7a,aAAc,yBACd+D,mBAAoB,yBACnBlX,QAGCvL,EAAUhV,KAAK+8D,YAAc,GAAW,CAAC,CAC7C1vD,KAAM,OACN6P,KAAM,YACNC,QAAS2/C,KAEX9nD,EAAQ7F,GAAK,8BACb6F,EAAQ5U,UAAUC,IAAI,eAEtBH,SAASuvC,eAAe,cAAc1lC,OAAOiL,GAE7C,aAA0BhV,KAAK+K,WAAW9K,UAAYgC,IACpD4S,EAAS,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAAQ,OAC/BA,GAAkC,MAAxBA,EAAOzI,QAAQ+vD,OAI1Bl6D,aAAawkB,YAAYxkB,EAAE8Y,iBAE3B9Y,aAAawkB,aAAYxkB,EAAEwsD,cAAe,GAE7C,aAAaxsD,EAAG+S,GAChB,aAAYA,MAGd,YAAiBhV,KAAK+K,WAAW9K,UAAYgC,IAC3C4S,EAAS,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAAQ,OAC/BA,GAAkC,MAAxBA,EAAOzI,QAAQ+vD,MAI7BW,MAIJ,sBAKE,OAJG98D,KAAK+8D,aACN/8D,KAAK+8D,YAAYp7D,SAGZsB,MAAM0L,uBC7JF,MAAM,WAA2B,EAIpC,OACR3O,KAAKC,UAAUG,UAAUC,IAAI,2BAC7BL,KAAKmR,SAAS,gBAEd,CACE,MAAMinB,EAAU,IAAI,GAAe,CACjCc,QAAS,qBAGXl5B,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAGjC,MAAM+8D,EAAS,EAAa,CAAC3vD,KAAM,MAAO7D,UAAW,eACrDxJ,KAAK6N,QAAQ9D,OAAOizD,GAEpB,YAAiBA,EAAS/6D,IACxB,IAAI,GAAc,CAChBu9B,UAAW,CAAC,YACZ5yB,YAAa,gCACb0yB,SAAWr4B,IAET,IAAgBg2D,YAAYh2D,GAAQ,OAGvC,CAAC8G,eAAgB/N,KAAK+N,iBAEzB,MAAMnE,EAAO,GAAkBC,iBAC/B7J,KAAK+K,WAAW9K,UAAUG,UAAUC,IAAI,sBACxCL,KAAK+K,WAAWhB,OAAOH,GAEvB,MAAMvJ,EAAM,CAAC4G,EAAgB8C,KAC3B,MAAM,IAAC+B,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ5E,EACRhH,UAAW2J,EACXoC,YAAY,EACZqG,eAAe,EACfpG,WAAY,GACZlC,WAGIk7B,EAAO,IAAgBC,QAAQj+B,GAClCg+B,EAAK3tB,OAAO4lD,IACbpxD,EAAIwG,gBAAgBvI,OAAO,IAAMk7B,EAAKzO,UAEnCyO,EAAKY,MAAO/5B,EAAIwG,gBAAgBrO,UAAY,IAAgB6hC,gBAAgBb,EAAKY,OAC/E/5B,EAAIwG,gBAAgBvI,OAAOk7B,EAAKzO,SAAW,IAAMyO,EAAKzO,SAAW,IAAgBjkB,oBAAoBtL,KAO9G,IAAI,MAAMA,KAAUjH,KAAK8R,QACvBzR,EAAI4G,GAAQ,GAGd,IAAI4N,EACJ,MAKMG,EAAUhV,KAAK+8D,YAAc,GAAW,CAAC,CAC7C1vD,KAAM,UACN6P,KAAM,UACNC,QARgB,KAChB,MAAMlW,EAAS4N,EAAOzI,QAAQnF,OAAO6gB,WACrC,IAAgBm1C,YAAYh2D,GAAQ,IAOpCjE,QAAS,CAAC+K,eAAgB/N,KAAK+N,mBAEjCiH,EAAQ7F,GAAK,4BACb6F,EAAQ5U,UAAUC,IAAI,eAEtBH,SAASuvC,eAAe,cAAc1lC,OAAOiL,GAE7C,aAA0BhV,KAAK+K,WAAW9K,UAAYgC,IACpD4S,EAAS,OAAAwsB,GAAA,GAAUp/B,EAAE4S,OAAQ,MACzBA,IAID5S,aAAawkB,YAAYxkB,EAAE8Y,iBAE3B9Y,aAAawkB,aAAYxkB,EAAEwsD,cAAe,GAE7C,aAAaxsD,EAAG+S,GAChB,aAAYA,KACXhV,KAAK+N,gBAER/N,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,aAAe2hC,IAChD,MAAM,OAAC16B,EAAM,QAAEk2D,GAAWx7B,EACpBhG,EAAK/xB,EAAKiG,cAAc,kBAAkB5I,OAC7Ck2D,EACGxhC,GACFt7B,EAAI4G,GAAQ,GAGX00B,GACDA,EAAGh6B,WAMT,IAAIi4B,GAAU,EACd55B,KAAK+K,WAAWM,iBAAmB,KAC9BuuB,IAIHA,GAAU,EACV,IAAgBwjC,WAAWxzD,EAAKK,kBARf,IAQ8CpJ,KAAK6K,IAClE,IAAI,MAAMzE,KAAUyE,EAAIoG,QACtBzR,EAAI4G,GAAQ,IAGXyE,EAAIoG,QAAQ3P,OAbA,IAauByH,EAAKK,oBAAsByB,EAAI/G,SACnE3E,KAAK+K,WAAWM,iBAAmB,MAGrCrL,KAAK+K,WAAWgvB,qBACf9Y,QAAQ,KACT2Y,GAAU,MAKhB,qBACE55B,KAAK+K,WAAWy3B,WAGlB,sBAKE,OAJGxiC,KAAK+8D,aACN/8D,KAAK+8D,YAAYp7D,SAGZsB,MAAM0L,uB,cCzHF,MAAM,WAAiC,EAI1C,OACR3O,KAAKC,UAAUG,UAAUC,IAAI,wBAC7BL,KAAKmR,SAAS,mBAId,CACE,MAAMinB,EAAU,IAAI,GAAe,CAACe,aAAa,IAEjD,IAAIkkC,EACJ,MAAMC,EAAkB,IAAI,GAAI,CAC9BjwD,KAAM,aACNqmB,aAAc,eACdN,gBAT0B,UAU1B3pB,UAAW,KACT,MAAM+F,EAAM,IAAI,GAAmBxP,KAAKsN,QACxCkC,EAAIsC,QAAUurD,EACd7tD,EAAIuB,UAKR,IAAIwsD,EAFJD,EAAgBpqC,SAAU,EAG1B,MAuBMsqC,EAAe,IAAI,GAvBG,CAC1BnwD,KAAM,OACNqmB,aAAc,sBACdN,gBAtB0B,UAuB1B3pB,UAAYxH,IACV,IAAIuN,EACD+tD,EAAcjmD,OAAO0jD,aACtBxrD,EAAM,IAAI,GAAuCxP,KAAKsN,QAC9CiwD,EAAcE,2BACtBjuD,EAAM,IAAI,GAA2CxP,KAAKsN,QAC1DkC,EAAI8pD,MAAQiE,EAAcE,0BAC1BjuD,EAAIrN,OAAS,EACbqN,EAAI6pD,SAAU,EACdG,GAAA,EAAgBO,uBAEhBvqD,EAAM,IAAI,GAA0BxP,KAAKsN,QAG3CkC,EAAIolB,MAAQ2oC,EACZ/tD,EAAIuB,UAKRysD,EAAatqC,SAAU,EAEvB,MAAMwqC,EAAoB19D,KAAK09D,kBAAoB,IAAI,GAAI,CACzDrwD,KAAM,iBACNqmB,aAAc,gBACdN,gBAhD0B,UAiD1B3pB,UAAW,KACT,MAAM+F,EAAM,IAAI,GAAqBxP,KAAKsN,QAC1CkC,EAAIotD,WAAa58D,KACjBwP,EAAIgtD,eAAiBx8D,KAAKw8D,eAC1BhtD,EAAIuB,UAGR2sD,EAAkBxqC,SAAU,EAE5BkF,EAAQvqB,QAAQ9D,OAAOuzD,EAAgBr9D,UAAWu9D,EAAav9D,UAAWy9D,EAAkBz9D,WAC5FD,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAE/B,MAAM09D,EAAmBh5D,IACpBA,EACD,OAAA4H,EAAA,GAAe+wD,EAAgBjxC,SAAU,eAAK,sCAAuC,CAAC1nB,KAEtF,OAAA4H,EAAA,GAAe+wD,EAAgBjxC,SAAU,eAAK,eAAgB,CAAC1nB,MAInE3E,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,aAAc,KAM/C49D,MAGF,MAAMA,EAAgB,KACpB,IAAgBR,aAAav8D,KAAK6K,IAChC4xD,EAAgBpqC,SAAU,EAC1ByqC,EAAgBjyD,EAAI/G,OACpB04D,EAAiB3xD,EAAIoG,WAIzB8rD,IAEApE,GAAA,EAAgB7kC,WAAW9zB,KAAK+zB,IAC9B2oC,EAAgB3oC,EAChB,OAAAroB,EAAA,GAAeixD,EAAanxC,SAAU,eAAKuI,EAAMtd,OAAO0jD,aAAe,6BAA+B,gCACtGwC,EAAatqC,SAAU,IAKzBlzB,KAAK68D,uBAGP,CACE,MAAMzkC,EAAU,IAAI,GAAe,CAAC9uB,KAAM,iBAE1C8uB,EAAQvqB,QAAQzN,UAAUC,IAAI,gCAE9B,MAAMw9D,EAED,GAECC,EAAsBD,EAAuC,2BAAI,IAAI,GAAI,CAC7EnqC,aAAc,oBACdN,gBA9G0B,UA+G1B3pB,UAAW,KACT,IAAI,GAAyBzJ,KAAKsN,QAAQyD,UAIxCgtD,EAAkBF,EAA2C,+BAAI,IAAI,GAAI,CAC7EnqC,aAAc,gBACdN,gBAtH0B,UAuH1B3pB,UAAW,KACT,IAAI,GAAsBzJ,KAAKsN,QAAQyD,UAIrCitD,EAAqBH,EAAwC,4BAAI,IAAI,GAAI,CAC7EnqC,aAAc,2BACdN,gBA9H0B,UA+H1B3pB,UAAW,KACT,IAAI,GAA0BzJ,KAAKsN,QAAQyD,UAIzCktD,EAAUJ,EAAqC,yBAAI,IAAI,GAAI,CAC/DnqC,aAAc,eACdN,gBAtI0B,UAuI1B3pB,UAAW,KACT,IAAI,GAAmBzJ,KAAKsN,QAAQyD,UAIlCmtD,EAAiBL,EAAoC,wBAAI,IAAI,GAAI,CACrEnqC,aAAc,uBACdN,gBA9I0B,UA+I1B3pB,UAAW,KACT,IAAI,GAA6BzJ,KAAKsN,QAAQyD,UAI5CotD,EAAmBN,EAAsC,0BAAI,IAAI,GAAI,CACzEnqC,aAAc,cACdN,gBAtJ0B,UAuJ1B3pB,UAAW,KACT,IAAI,GAAyBzJ,KAAKsN,QAAQyD,UAIxCqtD,EAAoB7vD,IACxB,MAAMsjB,EAAMgsC,EAAWtvD,GACnBsjB,GAIJ,GAAkBwmC,WAAW9pD,GAAK1N,KAAKu1D,IACrC,MAAM5iD,EAAU,GAAkB8kD,uBAAuBlC,GACnDrhC,EAAUvhB,EAAQrQ,OAAS6yD,GAAYwB,UAAY,qCAAwChkD,EAAQrQ,OAAS6yD,GAAY2B,SAAW,uCAAyC,mCAC5K0G,EAAiB7qD,EAAQ0jD,cAAcV,MAAMr0D,OAASqR,EAAQ0jD,cAAcR,MAAMv0D,OAClFm8D,EAAc9qD,EAAQyjD,WAAWT,MAAMr0D,OAASqR,EAAQyjD,WAAWP,MAAMv0D,OAE/E0vB,EAAIxF,SAASpoB,UAAY,GACzB,MAAM4R,EAAI,eAAKkf,GACflD,EAAIxF,SAAStiB,OAAO8L,IACjBwoD,GAAkBC,IACnBzsC,EAAIxF,SAAStiB,OAAO,KAAK,EAAEs0D,EAAgBC,EAAc,IAAMA,EAAc,GAAG12D,OAAOc,SAASif,KAAK,aAK3GyQ,EAAQvqB,QAAQ9D,OAAO+zD,EAAoB79D,UAAW89D,EAAgB99D,UAAW+9D,EAAmB/9D,UAAWg+D,EAAQh+D,UAAWi+D,EAAej+D,UAAWk+D,EAAiBl+D,WAC7KD,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAE/B,IAAI,MAAMsO,KAAOsvD,EACfO,EAAiB7vD,GAGnB3F,EAAA,QAAU5H,iBAAiB,iBAAmB2gC,IAC5Cy8B,EAAiB,YAAqBz8B,EAAOpzB,IAAInH,MAIrD,MAAMi3B,EAA2B,GACjC,CACE,MAAMjG,EAAU,IAAI,GAAe,CAAC9uB,KAAM,6BAC1C8uB,EAAQn4B,UAAUG,UAAUC,IAAI,QAEhCg+B,EAAS14B,KAAK,KAAW+wB,UAAU,8BAA8B71B,KAAKm+B,IACpE,IAAIA,EAAS1nB,OAAOinD,qBAClB,OAGF,MAAMvkD,EAAUglB,EAAS1nB,OAAOknD,kBAE1BC,EAAe,IAAI,GAAI,CAC3BrhD,cAAe,IAAI,KAAc,CAACF,KAAM,mCAAoCS,QAAS3D,IACrFoZ,gBAAiB,mCACjBK,oBAAoB,IAGtB2E,EAAQvqB,QAAQ9D,OAAO00D,EAAax+D,WACpCm4B,EAAQn4B,UAAUG,UAAUuB,OAAO,QAEnC3B,KAAKwO,cAAcxN,iBAAiB,UAAW,KAC7C,MAAM09D,EAAWD,EAAarhD,cAAcO,QAC1B+gD,IAAa1kD,GAK/B,KAAW0c,UAAU,6BAA8B,CACjD8nC,kBAAmBE,KAEpB,CAAC/mD,MAAM,OAGZ3X,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAGjC,CACE,MAAMm4B,EAAU,IAAI,GAAe,CAAC9uB,KAAM,gBAEpCilD,EAAgB,KACN,IAAI,GAAU,sBAAuB,CACjD3wC,QAAS,CAAC,CACRmX,QAAS,SACTiD,SAAU,KACR,MAAM1rB,EAAS,OAAA0sB,GAAA,GAAiB,CAAC2lC,IAAe,GAChD,KAAiBC,iBAAiB/9D,KAAK,KACrCyL,OAGJ42B,UAAU,IAEZxP,aAAc,6BACd+D,mBAAoB,0BAGhBlX,QAGFo+C,EAAe,YAAO,8BAA+B,CAACtxD,KAAM,SAAU6P,KAAM,6BAClFld,KAAK+N,eAAe1N,IAAIs+D,EAAxB3+D,CAAsC,QAASuuD,GAC/Cn2B,EAAQvqB,QAAQ9D,OAAO40D,GAcvB3+D,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAGjC,OAAO4C,QAAQC,IAAIu7B,GAGd,uBACL,KAAW3H,UAAU,6BAA6B71B,KAAKg+D,IACrD7+D,KAAK09D,kBAAkBxqC,SAAU,EACjClzB,KAAKw8D,eAAiBqC,EAAMrC,eAC5B,gBAAMx8D,KAAK09D,kBAAkBrxC,SAAU,kBAAmB,CAACrsB,KAAKw8D,eAAer6D,YC3S9E,SAAS28D,GAAW1gD,EAAW2gD,EAAWx2D,EAAWD,EAAY,GACtE8V,GAAK,IAAK2gD,GAAK,IAAKx2D,GAAK,IACzB,MAAMzG,EAAMO,KAAKP,IAAIsc,EAAG2gD,EAAGx2D,GACrBjG,EAAMD,KAAKC,IAAI8b,EAAG2gD,EAAGx2D,GAC3B,IAAIgQ,EAAG1C,EAAGmpD,GAAKl9D,EAAMQ,GAAO,EAE5B,GAAGR,IAAQQ,EACTiW,EAAI1C,EAAI,MACH,CACL,IAAI6J,EAAI5d,EAAMQ,EAEd,OADAuT,EAAImpD,EAAI,GAAMt/C,GAAK,EAAI5d,EAAMQ,GAAOod,GAAK5d,EAAMQ,GACvCR,GACN,KAAKsc,EACH7F,GAAKwmD,EAAIx2D,GAAKmX,GAAKq/C,EAAIx2D,EAAI,EAAI,GAC/B,MACF,KAAKw2D,EACHxmD,GAAKhQ,EAAI6V,GAAKsB,EAAI,EAClB,MACF,KAAKnX,EACHgQ,GAAK6F,EAAI2gD,GAAKr/C,EAAI,EAGtBnH,GAAK,EAGP,MAAO,CACLA,EAAO,IAAJA,EACH1C,EAAO,IAAJA,EACHmpD,EAAO,IAAJA,EACH12D,KAgBG,SAAS22D,GAAW1mD,EAAW1C,EAAWmpD,EAAW12D,GAE1D,IAAI8V,EAAW2gD,EAAWx2D,EAE1B,GAHAgQ,GAAK,IAAeymD,GAAK,IAGhB,KAHCnpD,GAAK,KAIbuI,EAAI2gD,EAAIx2D,EAAIy2D,MACP,CACL,MAAME,EAAU,SAAiBvnC,EAAWsG,EAAWvtB,GAGrD,OAFGA,EAAI,IAAGA,GAAK,GACZA,EAAI,IAAGA,GAAK,GACZA,EAAI,EAAE,EAAUinB,EAAc,GAATsG,EAAItG,GAASjnB,EAClCA,EAAI,GAAYutB,EAChBvtB,EAAI,EAAE,EAAUinB,GAAKsG,EAAItG,IAAM,EAAE,EAAIjnB,GAAK,EACtCinB,GAGHsG,EAAI+gC,EAAI,GAAMA,GAAK,EAAInpD,GAAKmpD,EAAInpD,EAAImpD,EAAInpD,EACxC8hB,EAAI,EAAIqnC,EAAI/gC,EAClB7f,EAAI8gD,EAAQvnC,EAAGsG,EAAG1lB,EAAI,EAAE,GACxBwmD,EAAIG,EAAQvnC,EAAGsG,EAAG1lB,GAClBhQ,EAAI22D,EAAQvnC,EAAGsG,EAAG1lB,EAAI,EAAE,GAG1B,MAAO,CAAClW,KAAKE,MAAU,IAAJ6b,GAAU/b,KAAKE,MAAU,IAAJw8D,GAAU18D,KAAKE,MAAU,IAAJgG,GAAUlG,KAAKE,MAAU,IAAJ+F,IAiB7E,SAAS62D,GAAWC,GACzB,MAAM96D,EAAiB,GAEvB,GAAmB,IAAhB86D,EAAKj9D,OACN,IAAI,IAAI6I,EAFK,EAEOA,EAAIo0D,EAAKj9D,SAAU6I,EACrC1G,EAAIqB,KAAK05D,SAASD,EAAKp0D,GAAKo0D,EAAKp0D,GAAI,UAElC,GAAmB,IAAhBo0D,EAAKj9D,OAAyB,CACtC,IAAI,IAAI6I,EANK,EAMOA,EAAKo0D,EAAKj9D,OAAS,IAAM6I,EAC3C1G,EAAIqB,KAAK05D,SAASD,EAAKp0D,GAAKo0D,EAAKp0D,GAAI,KAGvC1G,EAAIqB,KAAK05D,SAASD,EAAKA,EAAKj9D,OAAS,GAAI,UAEzC,IAAI,IAAI6I,EAZK,EAYOA,EAAIo0D,EAAKj9D,OAAQ6I,GAAK,EACxC1G,EAAIqB,KAAK05D,SAASD,EAAK37D,MAAMuH,EAAGA,EAAI,GAAI,KAI5C,OAAO1G,EAQF,SAASg7D,GAAWC,GACzB,MAAO,IAAMA,EAAK92D,IAAI03B,IAAM,IAAMA,EAAEgoB,SAAS,KAAK1kD,OAAO,IAAIkkB,KAAK,IAG7D,SAAS63C,GAAiBC,GAC/B,OAAOH,GA9CF,SAA0BG,GAC/B,MAAM/G,EAAW+G,EAAKh8D,MAAM,GAAI,GAAG4e,MAAM,MACnCq9C,GAAShH,EAAShzD,MAClBpB,EAAMo0D,EAASjwD,IAAKk3D,GACrBA,EAAIC,SAAS,MACND,EAAIl8D,MAAM,GAAI,IAGhBk8D,GAGV,OAAOV,GAAW36D,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAIo7D,GAmCxBG,CAAiBJ,ICpItB,SAASK,GAAmBP,GACzC,IAAI,EAAChnD,EAAC,EAAE1C,EAAC,EAAEmpD,GAAKF,GAAWS,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAC/C1pD,EAAI,IACLA,EAAIxT,KAAKC,IAAI,IAAKuT,EAAI,EAAI,IAAO,IAAMA,KAEzCmpD,EAAI38D,KAAKP,IAAI,EAAO,IAAJk9D,GAGhB,MADa,QAAQzmD,MAAM1C,OAAOmpD,U,cCKrB,MAAM,GAyBnB,cAhBO,KAAAe,IAAM,EACN,KAAAC,WAAa,IACb,KAAAC,UAAY,GACZ,KAAAP,MAAQ,EACP,KAAA93C,SAOJ,GAoGI,KAAAs4C,YAAc,KACpBhgE,SAASkwC,gBAAgBztC,MAAMskC,OAASjnC,KAAK4nB,SAASu4C,WAAWx9D,MAAMskC,OAAS,YAG1E,KAAAm5B,UAAY,KAClBlgE,SAASkwC,gBAAgBztC,MAAMskC,OAASjnC,KAAK4nB,SAASu4C,WAAWx9D,MAAMskC,OAAS,IAnGhFjnC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,GAAYioC,YAEzC,MAAMtkC,EAAO,uBACG,GAAYskC,WAAa,g+BAgBvB,GAAYA,WAAa,cAAc,GAAYA,WAAa,mKAIlE,GAAYA,WAAa,qCACvB,GAAYA,WAAa,6tBAavB,GAAYA,WAAa,cAAc,GAAYA,WAAa,mLAOpFtoC,KAAKC,UAAUgE,UAAYD,EAE3BhE,KAAK4nB,SAASy4C,IAAMrgE,KAAKC,UAAU4f,kBACnC7f,KAAK4nB,SAASu4C,WAAangE,KAAK4nB,SAASy4C,IAAItuB,iBAC7C/xC,KAAK4nB,SAASo4C,WAAahgE,KAAK4nB,SAASy4C,IAAIxgD,kBAAkBA,kBAE/D7f,KAAK4nB,SAAS04C,QAAUtgE,KAAK4nB,SAASy4C,IAAInoC,mBAE1Cl4B,KAAK4nB,SAASm4C,IAAM//D,KAAK4nB,SAAS04C,QAAQzgD,kBAC1C7f,KAAK4nB,SAAS24C,WAAavgE,KAAK4nB,SAASm4C,IAAIhuB,iBAE7C/xC,KAAKwgE,cAAgB,IAAI,IAAW,CAACt9D,WAAW,EAAMsO,MAAO,yBAC7DxR,KAAKygE,cAAgB,IAAI,IAAW,CAACv9D,WAAW,EAAMsO,MAAO,yBAE7D,MAAMkvD,EAASxgE,SAASC,cAAc,OACtCugE,EAAOl3D,UAAY,GAAY8+B,WAAa,UAC5Co4B,EAAO32D,OAAO/J,KAAKwgE,cAAcvgE,UAAWD,KAAKygE,cAAcxgE,WAC/DD,KAAKC,UAAU8J,OAAO22D,GAEtB1gE,KAAKwgE,cAAcz+D,MAAMf,iBAAiB,QAAS,KACjD,IAAIkB,EAAQlC,KAAKwgE,cAAct+D,MAAMsB,QAAQ,KAAM,IAAIC,MAAM,EAAG,GAEhE,MAAMmP,EAAQ1Q,EAAM0Q,MAAM,iBACpB+tD,EAAQ/tD,GAASA,EAAM,GAAGzQ,SAAWD,EAAMC,QAAU,CAAa,GAAGu4B,SAASx4B,EAAMC,QAC1FnC,KAAKwgE,cAActqC,SAASyqC,EAAQ,IAAWxqC,QAAU,IAAW1K,OAEpEvpB,EAAQ,IAAMA,EACdlC,KAAKwgE,cAAc98D,iBAAiBxB,GAEjCy+D,GACD3gE,KAAK4gE,SAAS1+D,GAAO,GAAO,KAKhC,MAAM2+D,EAAY,wHAClB7gE,KAAKygE,cAAc1+D,MAAMf,iBAAiB,QAAS,KACjD,MAAM4R,EAAQ5S,KAAKygE,cAAcv+D,MAAM0Q,MAAMiuD,GAC7C7gE,KAAKygE,cAAcvqC,SAAStjB,EAAQ,IAAWujB,QAAU,IAAW1K,OAEjE7Y,GACD5S,KAAK4gE,SAAS9B,IAAYlsD,EAAM,IAAKA,EAAM,IAAKA,EAAM,KAAK,GAAM,KAIrE5S,KAAK8gE,qBACL9gE,KAAK+gE,qBAWC,qBACN9mD,GAAoBja,KAAK4nB,SAASy4C,IAAY,KAC5CrgE,KAAKkgE,cACLlgE,KAAKghE,QAAUhhE,KAAK4nB,SAASy4C,IAAIvkD,yBAE/BopC,IACFllD,KAAKihE,kBAAkB/b,EAAI3qC,EAAG2qC,EAAIzqC,IACjC,KACDza,KAAKogE,cAID,qBACNnmD,GAAoBja,KAAK4nB,SAASm4C,IAAY,KAC5C//D,KAAKkgE,cACLlgE,KAAKkhE,QAAUlhE,KAAK4nB,SAASm4C,IAAIjkD,yBAE/BopC,IACFllD,KAAKmhE,WAAWjc,EAAI3qC,IACnB,KACDva,KAAKogE,cAIF,SAAS5qB,EAA2B4rB,GAAiB,EAAMC,GAAiB,GACjF,QAAa38D,IAAV8wC,EACDA,EAAQ,CACNj9B,EAAG,EACH1C,EAAG,IACHmpD,EAAG,GACH12D,EAAG,QAEA,GAAqB,iBAAZ,EACd,GAAgB,MAAbktC,EAAM,GACPA,EFpDD,SAAoB4pB,GACzB,MAAMG,EAAOJ,GAAWC,GACxB,OAAON,GAAWS,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IEkDpC+B,CAAW9rB,OACd,CACL,MAAM+rB,EAAM/rB,EAAM5iC,MAAM,YACxB4iC,EAAQspB,IAAYyC,EAAI,IAAKA,EAAI,IAAKA,EAAI,QAAe78D,IAAX68D,EAAI,GAAmB,GAAKA,EAAI,IAKlFvhE,KAAKghE,QAAUhhE,KAAK4nB,SAASy4C,IAAIvkD,wBAEjC,MAAM0lD,EAAOxhE,KAAKghE,QAAQtgE,MAAQ,IAAM80C,EAAM3/B,EACxC4rD,EAAW,IAAOjsB,EAAMwpB,GAAK,IAAMxpB,EAAM3/B,EAAI,GAAM,IACnD6rD,EAAO1hE,KAAKghE,QAAQrgE,OAAS,IAAM8gE,EAEzCzhE,KAAKihE,kBAAkBjhE,KAAKghE,QAAQjkD,KAAOykD,EAAMxhE,KAAKghE,QAAQ7sC,IAAMutC,GAAM,GAG1E1hE,KAAKkhE,QAAUlhE,KAAK4nB,SAASm4C,IAAIjkD,wBAEjC,MAAM6lD,EAAansB,EAAMj9B,EAAI,IACvBqpD,EAAO5hE,KAAKkhE,QAAQnkD,KAAO/c,KAAKkhE,QAAQxgE,MAAQihE,EAEtD3hE,KAAKmhE,WAAWS,GAAM,GAGtB5hE,KAAK+/D,IAAMvqB,EAAMj9B,EACjBvY,KAAKggE,WAAaxqB,EAAM3/B,EACxB7V,KAAKigE,UAAYzqB,EAAMwpB,EACvBh/D,KAAK0/D,MAAQlqB,EAAMltC,EAEnBtI,KAAK6hE,aAAaT,EAAgBC,GAG7B,kBACL,MAAMS,EAAY7C,GAAWj/D,KAAK+/D,IAAK//D,KAAKggE,WAAYhgE,KAAKigE,UAAWjgE,KAAK0/D,OACvEN,EAAOE,GAAWwC,GAClBC,EAAM3C,EAAK37D,MAAM,GAAI,GAE3B,MAAO,CACLu+D,IAAK,OAAOhiE,KAAK+/D,QAAQ//D,KAAKggE,gBAAgBhgE,KAAKigE,cACnDsB,IAAK,OAAOO,EAAU,OAAOA,EAAU,OAAOA,EAAU,MACxDC,IAAKA,EACLtC,KAAM,QAAQz/D,KAAK+/D,QAAQ//D,KAAKggE,gBAAgBhgE,KAAKigE,eAAejgE,KAAK0/D,SACzEH,KAAM,QAAQuC,EAAU,OAAOA,EAAU,OAAOA,EAAU,OAAOA,EAAU,MAC3E1C,KAAMA,EACN0C,UAAWA,GAIR,aAAaV,GAAiB,EAAMC,GAAiB,GAC1D,MAAM7rB,EAAQx1C,KAAKiiE,kBACnBjiE,KAAK4nB,SAASu4C,WAAW17C,eAAe,KAAM,OAAQ+wB,EAAMusB,KAEzDX,IACDphE,KAAKwgE,cAAc98D,iBAAiB8xC,EAAMusB,KAC1C/hE,KAAKwgE,cAActqC,SAAS,IAAWC,UAGtCkrC,IACDrhE,KAAKygE,cAAc/8D,iBAAiB8xC,EAAMssB,UAAUr+D,MAAM,GAAI,GAAGkkB,KAAK,OACtE3nB,KAAKygE,cAAcvqC,SAAS,IAAWC,UAGtCn2B,KAAKmL,UACNnL,KAAKmL,SAASqqC,GAIV,WAAWh7B,EAAemnB,GAAS,GACzC,MAEMjlB,EAFS,YAAMlC,EAAQxa,KAAKkhE,QAAQnkD,KAAM,EAAG/c,KAAKkhE,QAAQxgE,OAEtCV,KAAKkhE,QAAQxgE,MACvCV,KAAK+/D,IAAM19D,KAAKE,MAAM,IAAMma,GAE5B,MAAM+iD,EAAO,QAAQz/D,KAAK+/D,mBAAmB//D,KAAK0/D,SAElD1/D,KAAK4nB,SAAS24C,WAAW97C,eAAe,KAAM,IAAiB,IAAX/H,EAAkB,KACtE1c,KAAK4nB,SAAS24C,WAAW97C,eAAe,KAAM,OAAQg7C,GAEtDz/D,KAAK4nB,SAASo4C,WAAWjuB,iBAAiBttB,eAAe,KAAM,aAAcg7C,GAE1E99B,GACD3hC,KAAK6hE,eAID,kBAAkBrnD,EAAeE,EAAeinB,GAAS,GAC/D,MAAMugC,EAAOliE,KAAKghE,QAAQtgE,MACpByhE,EAAOniE,KAAKghE,QAAQrgE,OAKpByhE,EAHS,YAAM5nD,EAAQxa,KAAKghE,QAAQjkD,KAAM,EAAGmlD,GAG7BA,EAAO,IACvBG,EAHS,YAAM3nD,EAAQ1a,KAAKghE,QAAQ7sC,IAAK,EAAGguC,GAG5BA,EAAO,IAEvBhC,EAAangE,KAAK4nB,SAASu4C,WACjCA,EAAW17C,eAAe,KAAM,IAAK29C,EAAO,KAC5CjC,EAAW17C,eAAe,KAAM,IAAK49C,EAAO,KAE5C,MAAMrC,EAAa,YAAMoC,EAAM,EAAG,KAE5BE,EAAa,IAAMtC,EAAa,EAChCuC,EAAa,IAAM,YAAMF,EAAM,EAAG,KAElCpC,EAAY,YAAMsC,EAAa,IAAMD,EAAY,EAAG,KAE1DtiE,KAAKggE,WAAaA,EAClBhgE,KAAKigE,UAAYA,EAEdt+B,GACD3hC,KAAK6hE,gBAhRM,GAAAv5B,WAAa,eCEf,MAAM,WAA8B,EAAnD,c,oBAuFU,KAAAk6B,YAAc,CAACT,EAAaU,GAAoB,KACtD,GAAGA,EACDziE,KAAK0iE,YAAY9B,SAASmB,OACrB,CACL,MAAMxC,EAAOJ,GAAW4C,GAClBY,EAAa3iE,KAAK4iE,MAAMD,WACxBlD,EAAOK,GAAmBP,GAEhCoD,EAAWntB,MAAQusB,EAAIzlB,cACvBqmB,EAAWx/D,KAAO,QAClBw/D,EAAW7C,mBAAqBL,EAChC/qC,EAAA,QAAgBmuC,YAAY,WAAYj6D,EAAA,QAAUo2B,UAElD,GAAa8jC,uBAAkBp+D,OAAWA,GAAW,GACrD1E,KAAKkK,cAID,KAAA64D,cAAiBvtB,IACvBx1C,KAAKgjE,WAAWxtB,EAAMusB,KAAK,IApG7B,OACE/hE,KAAKC,UAAUG,UAAUC,IAAI,uBAAwB,8BACrDL,KAAKmR,SAAS,YAEdnR,KAAK4iE,MAAQh6D,EAAA,QAAUq6D,WAEvB,MAAM7qC,EAAU,IAAI,GAAe,IACnCp4B,KAAK0iE,YAAc,IAAI,GAEvBtqC,EAAQvqB,QAAQ9D,OAAO/J,KAAK0iE,YAAYziE,WAExCD,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAE/B,MAAMijE,EAAOljE,KAAKkjE,KAAOhjE,SAASC,cAAc,OAChD+iE,EAAK9iE,UAAUC,IAAI,QAEJ,CACb,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGKiG,QAAQkvC,IACb,MAAM/vC,EAAOvF,SAASC,cAAc,OACpCsF,EAAKrF,UAAUC,IAAI,aACnBoF,EAAK2G,QAAQopC,MAAQA,EAAM8G,cAG3B,MAAMxpC,EAAQ5S,SAASC,cAAc,OACrC2S,EAAM1S,UAAUC,IAAI,mBACpByS,EAAMnQ,MAAMwgE,gBAAkB3tB,EAE9B/vC,EAAKsE,OAAO+I,GACZowD,EAAKn5D,OAAOtE,KAGd,YAAiBy9D,EAAOjhE,IACtB,MAAM4S,EAAS,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAAQ,aACzC,IAAIA,GAAUA,EAAOzU,UAAUuR,SAAS,UACtC,OAGF,MAAM6jC,EAAQ3gC,EAAOzI,QAAQopC,MACzBA,GAIJx1C,KAAKgjE,WAAWxtB,IACf,CAACznC,eAAgB/N,KAAK+N,iBAEzB/N,KAAK+K,WAAWhB,OAAOm5D,GAEvBljE,KAAKgjE,WAAa,OAAAI,GAAA,GAASpjE,KAAKwiE,YAAa,IAAI,GAG3C,YACN,MAAMlyB,EAAStwC,KAAKkjE,KAAKrzD,cAAc,WACjC8yD,EAAa3iE,KAAK4iE,MAAMD,WACxB9tD,EAA6B,UAApB8tD,EAAWx/D,KAAmBnD,KAAKkjE,KAAKrzD,cAAc,0BAA0B8yD,EAAWntB,WAAa,KACpHlF,IAAWz7B,IAIXy7B,GACDA,EAAOlwC,UAAUuB,OAAO,UAGvBkT,GACDA,EAAOzU,UAAUC,IAAI,WA0BzB,SACEmL,WAAW,KACT,MAAMm3D,EAAa3iE,KAAK4iE,MAAMD,WAGP,UAApBA,EAAWx/D,OACZnD,KAAK0iE,YAAYv3D,SAAWnL,KAAK+iE,eAGnC/iE,KAAK0iE,YAAY9B,SAAS+B,EAAWntB,OAAS,WAEvB,UAApBmtB,EAAWx/D,OACZnD,KAAK0iE,YAAYv3D,SAAWnL,KAAK+iE,gBAElC,GAGL,sBAIE,OAHA/iE,KAAK0iE,YAAYv3D,cAAWzG,EAC5B1E,KAAK0iE,iBAAch+D,EAEZzB,MAAM0L,uBCrHjB,IAAI00D,GAAe,EAEJ,MAAM,WAAyB,EAA9C,c,oBAEU,KAAA5mC,OAAS,EAET,KAAA6mC,QAAsB,IAAIz/D,IAgE1B,KAAA0/D,cAAgB,KACtB,aAAY,oCAAoC1iE,KAAK2iE,IACnD,MAAMr0D,EAAK,uBAAwBk0D,GAE7Bx4C,EAAQ,CACZzjB,EAAG,YACHmR,EAAG,EACHV,EAAG,EACH6jC,SAAU,GACV57C,KAAM0jE,EAAK1jE,KACXqD,KAAM,QAER,IAAIjD,EAAuB,CACzBkH,EAAG,WACHy0C,YAAa,GACb3iC,WAAY,GACZuqD,MAAO,EACPC,eAAgB,GAChBv0D,KACAsvC,UAAW+kB,EAAKrgE,KAChBrD,KAAM0jE,EAAK1jE,KACXgpB,KAAMusB,KAAKC,MAAQ,IACnBh+B,OAAQ,GACRc,OAAQ,CAACyS,GACT1R,UAAWqqD,EAAKl6D,MAGlBpJ,EAAW,IAAem5C,QAAQn5C,GAElC,MAAMoU,EAAeC,GAAA,EAAmBC,gBAAgBtU,GACxDoU,EAAasrC,WAAa4jB,EAAK1jE,KAC/BwU,EAAaI,IAAMovC,IAAIC,gBAAgByf,GAEvC,IAAIG,EAAiC,CACnCv8D,EAAG,YACHy0C,YAAa,GACb37C,SAAUA,EACViP,KACAy0D,KAAMz0D,EACNmI,OAAQ,IAGV,MAAMusD,EAAStvD,GAAA,EAAmBsvD,OAAOL,EAAMA,EAAKl6D,MAE9CsO,EAAW,eACjBA,EAASksD,kBAAoBD,EAAOC,kBACpClsD,EAAS4T,OAASq4C,EAAOr4C,OAEzBq4C,EAAOhjE,KAAKoR,IACV,KAAWykB,UAAU,0BAA2B,CAC9C8sC,KAAMvxD,EACNwsC,UAAW+kB,EAAKrgE,KAChB67B,SAAU,CACR53B,EAAG,uBAEJvG,KAAKkjE,IACN,MAAMC,EAAUD,EAAmC7jE,SAC7C+jE,EAAkB1vD,GAAA,EAAmBC,gBAAgBwvD,GAC3DhtD,OAAOkkC,OAAO+oB,EAAiB3vD,GAE/BqvD,EAAYI,EACZJ,EAAUzjE,SAAW,IAAem5C,QAAQsqB,EAAUzjE,UAEtDD,EAAUmM,QAAQ+H,MAAQ,GAAKwvD,EAAUzjE,SAASiP,GAClDlP,EAAUmM,QAAQw3D,KAAOD,EAAUC,KAEnC5jE,KAAKkkE,sBAAsBP,EAAUC,KAAMD,EAAUzjE,UAAUW,KAAK+W,EAAS3R,QAAS2R,EAAS8T,SAC9F9T,EAAS8T,SACX9T,EAAS8T,QAEZ9T,EAAS/W,KAAK,KACZb,KAAKsjE,QAAQj1D,OAAOs1D,EAAUzjE,SAASiP,KACrC1C,IACFxM,EAAU0B,WAIZ,MAAMmlB,EAAY,IAAI,KAAqB,CACzC64B,UAAU,EACV54B,YAAY,EACZF,gBAAgB,IAGZ5mB,EAAYD,KAAKmkE,aAAaR,GAAW,GAC/C3jE,KAAKsjE,QAAQjjE,IAAIsjE,EAAUzjE,SAASiP,IAEpC2X,EAAUkE,OAAO/qB,GAAW,EAAO2X,MAI/B,KAAAwsD,aAAe,KACrB,MAAMC,EAAe,aAAWrlC,SAASslC,OAAO7zD,KAAKC,GAAKA,EAAEpH,OAAStJ,KAAK4iE,MAAMt5D,MAC7E+6D,MACCrkE,KAAKy8B,OACPz8B,KAAK4iE,MAAMD,WAAa,YAAK0B,EAAa1B,YAC1CjuC,EAAA,QAAgBmuC,YAAY,WAAYj6D,EAAA,QAAUo2B,UAClD,GAAa8jC,uBAAkBp+D,OAAWA,GAAW,GACrD1E,KAAKukE,kBAAkB7gE,iBAAiB1D,KAAK4iE,MAAMD,WAAW6B,QA6C1D,KAAAC,YAAexiE,IACrB,MAAM4S,EAAS,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAAQ,aACzC,IAAIA,EAAQ,OAEZ,MAAM,MAACV,EAAK,KAAEyvD,GAAQ/uD,EAAOzI,QAC7B,GAAGpM,KAAKsjE,QAAQ37D,IAAIwM,GAAQ,OAC5BnU,KAAKsjE,QAAQjjE,IAAI8T,GAEjB,MAAM2S,EAAY,IAAI,KAAqB,CACzCC,YAAY,EACZF,gBAAgB,IAGZ5S,EAAM,IAAeC,OAAOC,GAE5BrO,EAAO,KACX,MAAMK,EAAUnG,KAAKkkE,sBAAsBN,EAAM3vD,GAC5BM,GAAA,EAAmBC,gBAAgBP,GACvCS,MAAO1U,KAAK4iE,MAAMD,WAAW6B,MAC5C19C,EAAUkE,OAAOnW,GAAQ,EAAM1O,IAInC2gB,EAAUE,YAEV,YAAiBnS,EAAS5S,IACrB6kB,EAAUA,UAAUhW,eACrBgW,EAAU3J,QAAQlb,GAClB6kB,EAAUi5B,UAEVj6C,KAED,CAACiI,eAAgB/N,KAAK+N,iBAEzBjI,KAKM,KAAA4+D,YAAc,CAACd,EAAclvD,KACnCiwD,MAAMjwD,GAAK7T,KAAK+jE,IACdrwD,GAAA,EAAmBswD,aAAa1jB,KAAK,eAAiByiB,EAAMgB,MAIxD,KAAAV,sBAAwB,CAACN,EAAc3vD,KAC7C,IAAI6wD,IAAY9kE,KAAKy8B,OACrB,MAAM7P,EAAa,IAAMk4C,IAAY9kE,KAAKy8B,OAEpC7Q,EAAW,IAAe7T,YAAY9D,EAAK,GAAa8Y,KAAKC,QAAU,GAAaD,KAAKC,QAAQrC,cAAc21B,QAAU,GAEzH1oC,EAAW,eAkDjB,OAjDAA,EAASksD,kBAAoBl4C,EAASk4C,kBACtClsD,EAAS4T,OAASI,EAASJ,OAE3BI,EAAS/qB,KAAK,KACZ,IAAI+rB,IAEF,YADAhV,EAAS3R,UAIX,MAAM08D,EAAa3iE,KAAK4iE,MAAMD,WACxBoC,EAAWrwD,ICzSK,CAACswD,IAC3B,MAAMj6C,EAAM7qB,SAASC,cAAc,OACnC,OAAO,IAAI0C,QAA4BoD,IACrC,OAAAs6C,GAAA,GAAmBx1B,EAAKi6C,EAAU,KAChC,MAAMtiE,EAASxC,SAASC,cAAc,UAChC8vB,EAAQlF,EAAIk6C,aAAel6C,EAAIm6C,cAExB,IAAVj1C,GACDvtB,EAAOhC,MAFU,GAGjBgC,EAAO/B,OAAS+B,EAAOhC,MAAQuvB,GACvBA,EAAQ,GAChBvtB,EAAO/B,OALU,GAMjB+B,EAAOhC,MAAQgC,EAAO/B,OAASsvB,GAE/BvtB,EAAOhC,MAAQgC,EAAO/B,OARL,GAWnB,MAAMuI,EAAUxG,EAAOsO,WAAW,MAClC9H,EAAQi2C,UAAUp0B,EAAK,EAAG,EAAGA,EAAIk6C,aAAcl6C,EAAIm6C,cAAe,EAAG,EAAGxiE,EAAOhC,MAAOgC,EAAO/B,QAE7F,MAAMwkE,EAAQ,IAAIh9D,MAAM,GAAGgkB,KAAK,GAC1Bi5C,EAASl8D,EAAQm8D,aAAa,EAAG,EAAG3iE,EAAOhC,MAAOgC,EAAO/B,QAAQ2kE,KACvE,IAAI,IAAIt6D,EAAI,EAAGA,EAAIo6D,EAAOjjE,OAAQ6I,GAAK,EACrCm6D,EAAM,IAAMC,EAAOp6D,GACnBm6D,EAAM,IAAMC,EAAOp6D,EAAI,GACvBm6D,EAAM,IAAMC,EAAOp6D,EAAI,GACvBm6D,EAAM,IAAMC,EAAOp6D,EAAI,GAGzB,MAAMu6D,EAAeH,EAAOjjE,OAAS,EAC/BqjE,EAAW,IAAIC,kBAAkB,GACvCD,EAAS,GAAKL,EAAM,GAAKI,EACzBC,EAAS,GAAKL,EAAM,GAAKI,EACzBC,EAAS,GAAKL,EAAM,GAAKI,EACzBC,EAAS,GAAKL,EAAM,GAAKI,EACzBt/D,EAAQu/D,QDwQNE,CAAahxD,GAAK7T,KAAKskE,IACrB,IAAIv4C,IAEF,YADAhV,EAAS3R,UAIX,MAAMw5D,EAAOK,GAAmB33D,MAAMC,KAAK+8D,IAG3CxC,EAAWiB,KAAOA,EAClBjB,EAAWx/D,KAAO,QAClBw/D,EAAW7C,mBAAqBL,EAChC/qC,EAAA,QAAgBmuC,YAAY,WAAYj6D,EAAA,QAAUo2B,UAElDh/B,KAAK0kE,YAAYd,EAAMlvD,GACvB,GAAaouD,kBAAkBc,EAAMlvD,GAAK7T,KAAK+W,EAAS3R,YAItDqO,EAAeC,GAAA,EAAmBC,gBAAgBP,GACrD0uD,EAAW6B,KACZh5D,WAAW,KACT,aAAK8I,EAAaI,IAAK,GAAI,GAC1B7T,KAAK6T,IACAkY,IAKJm4C,EAAQrwD,GAJNkD,EAAS3R,aAMZ,KAEH8+D,EAAQzwD,EAAaI,OAIlBkD,GAGD,KAAA1N,UAAY,KAClB,MAAMomC,EAAStwC,KAAKkjE,KAAKrzD,cAAc,WACjC8yD,EAAa3iE,KAAK4iE,MAAMD,WACxB9tD,EAA6B,UAApB8tD,EAAWx/D,KAAmBnD,KAAKkjE,KAAKrzD,cAAc,yBAAyB8yD,EAAWiB,UAAY,KAClHtzB,IAAWz7B,IAIXy7B,GACDA,EAAOlwC,UAAUuB,OAAO,UAGvBkT,GACDA,EAAOzU,UAAUC,IAAI,YAhUzB,OACEL,KAAKC,UAAUG,UAAUC,IAAI,uBAAwB,8BACrDL,KAAKmR,SAAS,kBAEdnR,KAAK4iE,MAAQh6D,EAAA,QAAUq6D,WAEvB,CACE,MAAMhjE,EAAY63D,GAAgB93D,KAAK+K,YAEjC46D,EAAe,YAAO,8BAA+B,CAACt4D,KAAM,YAAa6P,KAAM,mCAC/E0oD,EAAc,YAAO,8BAA+B,CAACv4D,KAAM,WAAY6P,KAAM,aAC7E2oD,EAAc,YAAO,8BAA+B,CAACx4D,KAAM,aAAc6P,KAAM,qBAErF,YAAiByoD,EAAc3lE,KAAKujE,cAAe,CAACx1D,eAAgB/N,KAAK+N,iBAEzE,YAAiB63D,EAAa,KAC5B,IAAI,GAAsB5lE,KAAKsN,QAAQyD,QACtC,CAAChD,eAAgB/N,KAAK+N,iBAEzB,YAAiB83D,EAAa7lE,KAAKokE,aAAc,CAACr2D,eAAgB/N,KAAK+N,iBAEvE,MAAMw2D,EAAoBvkE,KAAKukE,kBAAoB,IAAI,KAAc,CACnErnD,KAAM,sBACN5T,KAAM,OACNqU,QAAS3d,KAAK4iE,MAAMD,WAAW6B,KAC/BzsC,YAAY,IAGd/3B,KAAK+N,eAAe1N,IAAIkkE,EAAkBxiE,MAA1C/B,CAAiD,SAAU,KACzDA,KAAK4iE,MAAMD,WAAW6B,KAAOD,EAAkBxiE,MAAM4b,QACrD+W,EAAA,QAAgBmuC,YAAY,WAAYj6D,EAAA,QAAUo2B,UAElD,MAAMsR,EAAS4yB,EAAKrzD,cAAc,WAC9BygC,GAGJ9kC,WAAW,KACTxL,KAAKkkE,sBAAsB5zB,EAAOlkC,QAAQw3D,KAAM,IAAe1vD,OAAOo8B,EAAOlkC,QAAQ+H,SACpF,OAGLlU,EAAU8J,OAAO47D,EAAcC,EAAaC,EAAatB,EAAkB/yD,OAG7E5I,EAAA,QAAU5H,iBAAiB,oBAAqBhB,KAAKkK,WAErD,KAAW+vC,kBAAkB,yBAAyBp5C,KAAMilE,IACtCA,EAA0DC,WACnEz/D,QAASq9D,IAClB3jE,KAAKmkE,aAAaR,OAMtB,MAAMT,EAAOljE,KAAKkjE,KAAOhjE,SAASC,cAAc,OAChD+iE,EAAK9iE,UAAUC,IAAI,QACnB,YAAiB6iE,EAAMljE,KAAKykE,YAAa,CAAC12D,eAAgB/N,KAAK+N,iBAC/D/N,KAAK+K,WAAWhB,OAAOm5D,GAwGjB,aAAaS,EAAgC55D,GAAS,GAC5D,GAAG45D,EAAUrsD,OAAO0uD,UACjBrC,EAAUzjE,UAC8D,IAAxEyjE,EAAUzjE,SAAwBu+C,UAAUliC,QAAQ,gBACrD,OAGFonD,EAAUzjE,SAAW,IAAem5C,QAAQsqB,EAAUzjE,UAEtD,MAAMD,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAUC,IAAI,aAExB,MAAMyS,EAAQ5S,SAASC,cAAc,OACrC2S,EAAM1S,UAAUC,IAAI,mBAEpB,MAAMgqB,EAAUC,GAAU,CACxB9lB,MAAOm/D,EAAUzjE,SACjBkE,QAAS,KACTnE,UAAW6S,EACX4X,kBAAkB,EAClB5qB,KAAM,IAAiBwtB,gBAAgBq2C,EAAUzjE,SAAU,IAAK,OAkBlE,OAfAD,EAAUmM,QAAQ+H,MAAQ,GAAKwvD,EAAUzjE,SAASiP,GAClDlP,EAAUmM,QAAQw3D,KAAOD,EAAUC,KAED,UAA/B5jE,KAAK4iE,MAAMD,WAAWx/D,MAAoBnD,KAAK4iE,MAAMD,WAAWiB,OAASD,EAAUC,MACpF3jE,EAAUG,UAAUC,IAAI,WAGzBgqB,EAAQI,aAAaI,OAASR,EAAQI,aAAaK,MAAMjqB,KAAK,KAC7D0hD,GAAA,EAAcE,OAAO,KACnBxiD,EAAU8J,OAAO+I,OAIrB9S,KAAKkjE,KAAKn5D,EAAS,SAAW,WAAW9J,GAElCA,G,cEvNI,MAAM,WAAsB,KAOzC,YAAoBgmE,GAClBhjE,MAAM,iBAAkB,KAAM,CAACm8B,UAAU,EAAMjI,iBAAiB,EAAMhhB,MAAM,IAD1D,KAAA8vD,kBA0CZ,KAAAC,gBAAmBjkE,IACzB,MAAM4S,EAAS,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAAQ,uBACzC,IAAIA,EAAQ,OAEZ,MAAMsxD,EAAStxD,EAAOzI,QAAQ+H,MAC3B,GAAa4Y,KAAKhrB,MAAMqkE,wBAAwBD,GACjDnmE,KAAKu/B,OAEL7yB,QAAQkK,KAAK,oBAAqBuvD,IA/CpCnmE,KAAKqmE,GAAKnmE,SAASC,cAAc,MACjCH,KAAKqmE,GAAGt8D,OAAO,eAAK,YAEpB/J,KAAKyN,OAAO1D,OAAO/J,KAAKqmE,IAExBrmE,KAAKgB,iBAAiB,QAAS,KAC7Bi/C,EAAA,EAAqBqmB,wBAAwB,MAG/C,MAAMn5C,EAAMjtB,SAASC,cAAc,OACnCgtB,EAAI/sB,UAAUC,IAAI,eAElBL,KAAKumE,YAAcrmE,SAASC,cAAc,OAC1CH,KAAKumE,YAAYnmE,UAAUC,IAAI,uBAAwB,cAEvD,YAAiBL,KAAKumE,YAAavmE,KAAKkmE,gBAAiB,CAACn4D,eAAgB/N,KAAK+N,iBAE/E,aAAa/N,KAAKumE,aAAa,GAE/BvmE,KAAKwmE,eAAiBtmE,SAASC,cAAc,OAC7CH,KAAKwmE,eAAepmE,UAAUC,IAAI,sBAElC8sB,EAAIpjB,OAAO/J,KAAKumE,aAEhB,MAAM3mD,EAAM,YAAO,oDAAqD,CAACjS,UAAU,EAAMuP,KAAM,YAC/Fld,KAAKwmE,eAAez8D,OAAO6V,GAE3B5f,KAAKmW,KAAKpM,OAAOojB,GACE,IAAI,IAAWntB,KAAKmW,MACvCnW,KAAKmW,KAAKpM,OAAO/J,KAAKwmE,gBAOtBxmE,KAAKymE,iBAeC,iBACN,OAAO,GAAmBzsB,cAAch6C,KAAKimE,iBAAiBplE,KAAK8T,IAUjE,IAAIkG,EAPJ7a,KAAK2U,IAAMA,EAAIA,IAEfsrC,EAAA,EAAqBqmB,wBArEH,kBAuElBtmE,KAAKqmE,GAAGpiE,UAAY,IAAkBwoB,cAAc9X,EAAIA,IAAI/G,OAC5D5N,KAAKwmE,eAAepmE,UAAUkM,OAAO,OAAQqI,EAAIA,IAAI0mC,gBAGlD1mC,EAAIA,IAAI0mC,gBACTxgC,EAAS,YAAO,6CAA8C,CAAClN,UAAU,IACzEkN,EAAO9Q,OAAO,eAAK,sBAAuB,CAAC,eAAK,WAAY,CAAC4K,EAAIA,IAAIhQ,aAErEkW,EAAS,YAAO,gCAAiC,CAAClN,UAAU,IAC5DkN,EAAO9Q,OAAO,eAAK,mBAAoB,CAAC,eAAK,WAAY,CAAC4K,EAAIA,IAAIhQ,YAGpE3E,KAAKwmE,eAAeh0D,YAAc,GAClCxS,KAAKwmE,eAAez8D,OAAO8Q,GAE3B,YAAiBA,EAAQ,KACvB,MAAMvO,EAAS,OAAA0sB,GAAA,GAAiB,CAACne,IAAS,GAE1C,GAAmB6rD,iBAAiB1mE,KAAK2U,KAAK9T,KAAK,KACjDb,KAAKu/B,SACJ/yB,MAAM,KACPF,QAIJ,MAAMqe,EAAgB,IAAI,KAE1B3qB,KAAKumE,YAAYnmE,UAAUuB,OAAO,cAClC3B,KAAKumE,YAAYtiE,UAAY,GAC7B,IAAI,IAAIgQ,KAAOU,EAAI8kC,UAAW,CAC5B,GAAa,kBAAVxlC,EAAI7M,EACL,SAGF,MAAM+lB,EAAMjtB,SAASC,cAAc,OACnCgtB,EAAI/sB,UAAUC,IAAI,uBAElB,MAAMP,EAAOokB,EAAA,EAAWosB,OAAOq2B,WAAWjmE,MAE1CwsB,GAAY,CACVjZ,MACAkZ,MACAxC,gBACAyC,MAlHc,iBAmHd3rB,MAAM,EACNjB,MAAM,EACNE,MAAOZ,EACPa,OAAQb,IAGVE,KAAKumE,YAAYx8D,OAAOojB,O,YCpHzB,MAAM,GAMX,YAAY7jB,EAAmB6S,EAAcyqD,EAAsBC,EAAkBrhD,GACnF,MAAM8iB,EAAa,yBACnBtoC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAIioC,GAE7B,MAAM90B,EAAUtT,SAASC,cAAc,OACvCqT,EAAQpT,UAAUC,IAAIioC,EAAa,YAEnC,MAAM2Y,EAAU/gD,SAASC,cAAc,OACvC8gD,EAAQ7gD,UAAUC,IAAIioC,EAAa,SACnC,gBAAM2Y,EAAS33C,GAEf,MAAMw9D,EAAW5mE,SAASC,cAAc,OACxC2mE,EAAS1mE,UAAUC,IAAIioC,EAAa,UACpCw+B,EAAS7iE,UAAY,GAAK2iE,EAE1BpzD,EAAQzJ,OAAOk3C,EAAS6lB,GAExB9mE,KAAK+mE,MAAQ,IAAI,GAAc,CAC7B5qD,OACA7Z,IAAKukE,EACL/kE,IAAK0jB,GACJohD,GACH5mE,KAAK+mE,MAAMjoD,eACX9e,KAAK+mE,MAAMhoD,YAAY,CACrB9C,QAAS/Z,IACJlC,KAAKmL,UACNnL,KAAKmL,SAASjJ,GAIhB4kE,EAAS58C,UAAY,GAAKhoB,KAI9BlC,KAAKC,UAAU8J,OAAOyJ,EAASxT,KAAK+mE,MAAM9mE,YAI/B,MAAM,WAA8B,EACjD,OACED,KAAKC,UAAUG,UAAUC,IAAI,8BAC7BL,KAAKmR,SAAS,WAEd,MAAMinB,EAAU0/B,GAAgBvxD,KAAK,KAAMvG,KAAK+K,YAEhD,CACE,MAAM9K,EAAYm4B,EAAQ,YAEpB2uC,EAAQ,IAAI,GAAqB,WAAY,EAAGn+D,EAAA,QAAUo2B,SAASgoC,iBAAkB,GAAI,IAC/FD,EAAM57D,SAAYjJ,IAChBwyB,EAAA,QAAgBG,SAAS,4BAA6B3yB,IAGxD,MAAM+kE,EAAuB,YAAO,8BAA+B,CAAC55D,KAAM,QAAS6P,KAAM,mBAEzF,YAAiB+pD,EAAsB,KACrC,IAAI,GAAiBjnE,KAAKsN,QAAQyD,SAGpC,MAAMm2D,EAA0B,IAAI,KAAc,CAChDhqD,KAAM,mBACN5T,KAAM,aACNmrB,SAAU,6BACVsD,YAAY,IAGd93B,EAAU8J,OAAOg9D,EAAM9mE,UAAWgnE,EAAsBC,EAAwB11D,OAGlF,CACE,MAAMvR,EAAYm4B,EAAQ,oBAEpBnF,EAAO/yB,SAASC,cAAc,QAE9BmJ,EAAO,gBACPmrB,EAAW,wBAEX0yC,EAAW,IAAI,GAAI,CACvBh0C,WAAY,IAAI,GAAW,CACzB4B,QAAS,6BACTzrB,OACApH,MAAO,QACPuyB,aAEFrB,gBAAiB,4CAGbg0C,EAAe,IAAI,GAAI,CAC3Bj0C,WAAY,IAAI,GAAW,CACzB7pB,OACApH,MAAO,YACPuyB,aAEFrB,gBAAiB,uCAEnB,gBAAMg0C,EAAaj0C,WAAW2B,KAAM,iCAAkC,CAAC,YAAW,IAAM,SAExF7B,EAAKlpB,OAAOo9D,EAASlnE,UAAWmnE,EAAannE,WAC7CA,EAAU8J,OAAOkpB,GAGnB,CACE,MAAMhzB,EAAYm4B,EAAQ,sBAEpBnF,EAAO/yB,SAASC,cAAc,QAE9BmJ,EAAO,cACPmrB,EAAW,sBAEX4yC,EAA4D,CAChE,CAAC,MAAO,0BACR,CAAC,MAAO,2BAGJvzC,EAAOuzC,EAAQ5+D,IAAI,EAAEuQ,EAAQoc,KACrB,IAAI,GAAI,CAClBjC,WAAY,IAAI,GAAW,CACzB4B,QAASK,EACT9rB,OACApH,MAAO8W,EACPyb,gBAOAjJ,ECxJG,SAAoBwM,EAAqBsvC,GAAW,GACjE,MAKMC,EAAYvvC,EAKlB,IAAIlrB,EAQJ,OAZIw6D,IACFtvC,EAAWrR,GAAA,GAIb,SAAU6gD,IACRxvC,IACAlrB,EAAU,KAAItB,WAAWg8D,EAAsC,KAAhC,IAAK,IAAInyB,MAAOoyB,eAFjD,GAKAzvC,EAAWuvC,EAhBI,KACbv6D,aAAaF,IDsJI46D,CAAW,KACxB,MAAM5+C,EAAO,IAAIusB,KAEjBgyB,EAAQ/gE,QAAQ,EAAE0S,GAAS3U,KACzB,MAAMsjE,EAAM7+C,EAAK8+C,mBAAmB,cAAgB5uD,EAAQ,CAC1D6uD,KAAM,UACNC,OAAQ,YAGVh0C,EAAKzvB,GAAKgoB,SAAS7Z,YAAcm1D,MAIrC3nE,KAAKwO,cAAcxN,iBAAiB,UAAWwqB,GAE/CyH,EAAKlpB,UAAU+pB,EAAKrrB,IAAIopB,GAAOA,EAAI5xB,YACnCA,EAAU8J,OAAOkpB,GAGnB,CACE,MAAMhzB,EAAYm4B,EAAQ,qBAGpB2vC,EAAwB,IAAI,KAAc,CAC9C7qD,KAAM,uBACN5T,KAAM,WACNmrB,SAAU,iCACVsD,YAAY,IAERiwC,EAAuB,IAAI,KAAc,CAC7C9qD,KAAM,2BACN5T,KAAM,UACNmrB,SAAU,gCACVsD,YAAY,IAERkwC,EAAsB,IAAI,KAAc,CAC5C/qD,KAAM,yBACN5T,KAAM,SACNmrB,SAAU,+BACVsD,YAAY,IAERmwC,EAAwB,IAAI,KAAc,CAC9ChrD,KAAM,uBACN5T,KAAM,WACNmrB,SAAU,iCACVsD,YAAY,IAGd93B,EAAU8J,OAAOg+D,EAAsBv2D,MAAOw2D,EAAqBx2D,MAAOy2D,EAAoBz2D,MAAO02D,EAAsB12D,OAG7H,CACE,MAAMvR,EAAYm4B,EAAQ,yBAGpB+vC,EAAoB,IAAI,KAAc,CAC1CjrD,KAAM,cACN5T,KAAM,OACNmrB,SAAU,yBACVsD,YAAY,IAERqwC,EAAsB,IAAI,KAAc,CAC5ClrD,KAAM,gBACN5T,KAAM,SACNmrB,SAAU,2BACVsD,YAAY,IAGd93B,EAAU8J,OAAOo+D,EAAkB32D,MAAO42D,EAAoB52D,OAGhE,CACE,MAAMvR,EAAYm4B,EAAQ,SAEpBiwC,EAAuB,IAAI,KAAc,CAC7CnrD,KAAM,kCACN5T,KAAM,gBACNmrB,SAAU,yBACVsD,YAAY,IAERuwC,EAAmB,IAAI,KAAc,CACzCprD,KAAM,2BACN5T,KAAM,YACNmrB,SAAU,qBACVsD,YAAY,IAGd93B,EAAU8J,OAAOs+D,EAAqB72D,MAAO82D,EAAiB92D,OAGhE,CACE,MAAMvR,EAAYm4B,EAAQ,4CAEpBiwC,EAAuB,IAAI,KAAc,CAC7CnrD,KAAM,2BACN5T,KAAM,UACNmrB,SAAU,4BACVsD,YAAY,IAERwwC,EAAoB,IAAI,KAAc,CAC1CrrD,KAAM,iCACN5T,KAAM,OACNmrB,SAAU,yBACVsD,YAAY,IAGRywC,EAAmC,GAEnC79C,EAAgB,IAAI,KACpB89C,EAAmB,CAAC5uB,EAAmCve,EAA+B,YAC1F,MAAMzJ,EAAM,IAAI,GAAI,CAClBjkB,MAAO,IAAkB6e,cAAcotB,EAAWjsC,OAClDwlB,gBAAiB,WACjBC,iBAAkB,CAACwmB,EAAWl1C,OAC9B2uB,aAAa,EACb7pB,UAAW,KACT,IAAI,GAAc,CAAC0F,GAAI0qC,EAAW1qC,GAAI0sC,YAAahC,EAAWgC,cAAct7B,UAIhFioD,EAAY3uB,EAAW1qC,IAAM0iB,EAE7B,MAAM1E,EAAMjtB,SAASC,cAAc,OACnCgtB,EAAI/sB,UAAUC,IAAI,aAElBojD,GAAoB,CAClB9uC,IAAKklC,EACL55C,UAAWktB,EACXC,MAAO,mBACPzC,gBACAjqB,MAAO,GACPC,OAAQ,GACRF,UAAU,IAGZoxB,EAAI5xB,UAAU8J,OAAOojB,GAErBltB,EAAUq7B,GAAQzJ,EAAI5xB,YAGxB,GAAmBu8C,iBAAiB37C,KAAK47C,IACvC,OAAAisB,GAAA,GAAoDjsB,GACpD,IAAI,MAAM5C,KAAc4C,EAAYV,KAClC0sB,EAAiB5uB,KAIrB75C,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,qBAAuBiC,IACxD,MAAM0S,EAA6B1S,EAE/BumE,EAAY7zD,EAAIxF,KAClBs5D,EAAiB9zD,EAAK,aAI1B3U,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,mBAAqBiC,IACtD,MAAM0S,EAA6B1S,EAEhCumE,EAAY7zD,EAAIxF,MACjBq5D,EAAY7zD,EAAIxF,IAAIlP,UAAU0B,gBACvB6mE,EAAY7zD,EAAIxF,OAI3BlP,EAAU8J,OAAOs+D,EAAqB72D,MAAO+2D,EAAkB/2D,QAInE,SACKxR,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,O,2SE3TH,MAAM,WAA0B,EAW7B,O,0CACdlO,KAAKC,UAAUG,UAAUC,IAAI,0BAC7BL,KAAKmR,SAAS,qBAEd,MAAMmhB,EAA4B,GAElC,CACE,MAAMhhB,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3BL,KAAK2oE,oBAAsB,IAAI,IAAW,CACxCn3D,MAAO,6BACPlI,KAAM,aACNmI,UAAW,KAEbzR,KAAKglC,mBAAqB,IAAI,IAAW,CACvCxzB,MAAO,sCACPlI,KAAM,YACNmI,UAAW,KAEbzR,KAAK4oE,cAAgB,IAAI,IAAW,CAClCp3D,MAAO,uBACPlI,KAAM,MACNmI,UAAW,KAGbH,EAAavH,OAAO/J,KAAK2oE,oBAAoB1oE,UAAWD,KAAKglC,mBAAmB/kC,UAAWD,KAAK4oE,cAAc3oE,WAE9G,MAAMi5B,EAAUh5B,SAASC,cAAc,OACvC+4B,EAAQ94B,UAAUC,IAAI,WACtB,gBAAM,CAAC2U,QAASkkB,EAAS3qB,IAAK,oBAE9B+jB,EAAY3sB,KAAK3F,KAAK2oE,oBAAqB3oE,KAAKglC,mBAAoBhlC,KAAK4oE,eACzE5oE,KAAK+K,WAAWhB,OAAOuH,EAAc4nB,GAGvCl5B,KAAK+K,WAAWhB,OAAO7J,SAASC,cAAc,OAE9CH,KAAK0jC,SAAW,IAAI,GAAS,CAC3Bz8B,OAAQ2B,EAAA,QAAU6O,KAClB6a,cACAvkB,eAAgB/N,KAAK+N,iBAEvB/N,KAAK6N,QAAQ9D,OAAO/J,KAAK0jC,SAAShyB,SAClC1R,KAAK+K,WAAW6T,QAAQ5e,KAAK0jC,SAAStyB,WAAWnR,WAEjD,CACE,MAAM+vB,EAAK9vB,SAASC,cAAc,OAClC6vB,EAAG5vB,UAAUC,IAAI,mBACjB,gBAAM,CAAC2U,QAASgb,EAAIzhB,IAAK,yBAEzB,MAAM+C,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3BL,KAAK6oE,mBAAqB,IAAI,GAAmB,CAC/Cr3D,MAAO,6BACPlI,KAAM,WACNpG,WAAW,EACX6K,eAAgB/N,KAAK+N,eACrB5C,SAAU,KACRnL,KAAK0jC,SAASjR,eACdzyB,KAAK8oE,iBAEP9xC,cAAe,iCACfC,UAAW,6BACXX,YAAa,iCAGfhlB,EAAavH,OAAO/J,KAAK6oE,mBAAmB5oE,WAE5C,MAAMi5B,EAAUh5B,SAASC,cAAc,OACvC+4B,EAAQ94B,UAAUC,IAAI,WACtB64B,EAAQnvB,OAAO,eAAK,uCACpBmvB,EAAQnvB,OAAO7J,SAASC,cAAc,MAAOD,SAASC,cAAc,OAEpE,MAAM4oE,EAAsB/oE,KAAK+oE,oBAAsB7oE,SAASC,cAAc,OAC9E4oE,EAAoB3oE,UAAUC,IAAI,yBAElC,MAAM2oE,EAAmBhpE,KAAKgpE,iBAAmB9oE,SAASC,cAAc,KACxE6oE,EAAiB5oE,UAAUC,IAAI,eAC/B2oE,EAAiB3W,KAAO,IACxB2W,EAAiBn0D,OAAS,SAE1Bk0D,EAAoBh/D,OAAO,eAAK,mBAAoB,CAACi/D,KAErD9vC,EAAQnvB,OAAOg/D,GAEfz2C,EAAY3sB,KAAK3F,KAAK6oE,oBACtB7oE,KAAK+K,WAAWhB,OAAOimB,EAAI1e,EAAc4nB,GAG3C,YAAiBl5B,KAAK0jC,SAAShyB,QAAS,KACtC1R,KAAK0jC,SAAShyB,QAAQE,UAAW,EAEjC,IAAIysB,EAA2B,GAE/BA,EAAS14B,KAAK,UAAkBsjE,cAAcjpE,KAAK2oE,oBAAoBzmE,MAAOlC,KAAKglC,mBAAmB9iC,MAAOlC,KAAK4oE,cAAc1mE,OAAOrB,KAAK,KAC1Ib,KAAK05B,SACHjtB,IACFC,QAAQC,MAAM,uBAAwBF,MAGrCzM,KAAK0jC,SAASxyB,cACfmtB,EAAS14B,KAAK3F,KAAK0jC,SAASxyB,eAAerQ,KAAKoR,GACvC,UAAkBi3D,mBAAmBj3D,KAI7CjS,KAAK6oE,mBAAmB3xC,mBACzBmH,EAAS14B,KAAK,IAAgB8zB,eAAez5B,KAAK6oE,mBAAmB3mE,QAGvEW,QAAQshC,KAAK9F,GAAUpd,QAAQ,KAC7BjhB,KAAK0jC,SAAShyB,QAAQ0yB,gBAAgB,eAEvC,CAACr2B,eAAgB/N,KAAK+N,iBAEzB,MAAMk3B,EAAO,IAAgBkkC,UAEvB18B,QAAiB,UAAkBD,WAAWvH,EAAK91B,IAAI,GAE7DnP,KAAK2oE,oBAAoBhvC,iBAAiBsL,EAAKG,YAAY,GAC3DplC,KAAKglC,mBAAmBrL,iBAAiBsL,EAAKI,WAAW,GACzDrlC,KAAK4oE,cAAcjvC,iBAAiB8S,EAAShJ,OAAO,GACpDzjC,KAAK6oE,mBAAmBlvC,iBAAiBsL,EAAKzO,UAAU,GAExDx2B,KAAK8oE,gBACL9oE,KAAK0jC,SAASjR,kBAGR,gBACN,GAAGzyB,KAAK6oE,mBAAmB9mE,MAAM3B,UAAUuR,SAAS,WAAa3R,KAAK6oE,mBAAmB3mE,MAAMC,OAC7FnC,KAAK+oE,oBAAoBpmE,MAAMC,QAAU,WACpC,CACL5C,KAAK+oE,oBAAoBpmE,MAAMC,QAAU,GACzC,IAAI8R,EAAM,gBAAkB1U,KAAK6oE,mBAAmB3mE,MACpDlC,KAAKgpE,iBAAiB9+C,UAAYxV,EAClC1U,KAAKgpE,iBAAiB3W,KAAO39C,I,2SC9IpB,MAAM,WAA4B,EAAjD,c,oBAwGE,KAAAqmB,cAAsBjpB,GAAsB,yCAGpC,IAAgBs3D,cACtBt3D,EAAQxL,QAAQW,IAGd,MAAM,IAAC6E,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ5E,EACRhH,UAAWD,KAAK0nB,SAAS3c,WACzBiB,YAAY,EACZqG,eAAe,EACfpG,WAAY,KAGR+tB,EAAWh6B,KAAK0nB,SAASsS,SAASryB,IAAIV,GAC5C6E,EAAI0yB,YAAYz0B,OAAO/J,KAAK87B,SAAS9B,IAGrC,MAAMqvC,EAAgC,GACtCrpE,KAAKspE,iBAAiBhjE,QAAQ,CAAC81B,EAASx0B,KACtC,GAAGw0B,EAAQz0B,IAAIV,GAAS,CACtB,MAAM4oD,EAAO3vD,SAASC,cAAc,QACpC0vD,EAAK5rD,UAAY,IAAkBwoB,cAAc7kB,EAAOgG,OACxDy7D,EAAe1jE,KAAKkqD,MAIT,eAAKwZ,GAAgB,GAC7B/iE,QAAQyJ,IACbjE,EAAIwG,gBAAgBvI,OAAOgG,UA4GjC,KAAAw5D,eAAkBpnE,IAEC,aAAdnC,KAAKmD,OACNnD,KAAKwpE,WAAW7mE,MAAMC,QAAUT,EAAS,GAAK,SA1OxC,OA2ER,OA1EAnC,KAAK6N,QAAQlM,SACb3B,KAAKC,UAAUG,UAAUC,IAAI,+BAC7BL,KAAKwpE,WAAa,EAAW,yBAA0B,CAAC77D,UAAU,IAClE3N,KAAKwpE,WAAW7mE,MAAMC,QAAU,OAEhC5C,KAAKyN,OAAO1D,OAAO/J,KAAKwpE,YAExBxpE,KAAKwpE,WAAWxoE,iBAAiB,QAAS,KACxC,MAAMg5B,EAAWh6B,KAAK0nB,SAAS2X,cAI/B,GAAiB,aAAdr/B,KAAKmD,KACN,IAAI,MAAMoL,KAAOvO,KAAK4H,OAAO0P,OACI,IAA5B/I,EAAIgO,QAAQ,oBAKRvc,KAAK4H,OAAO0P,OAAO/I,QAG5B,IAAI,MAAMA,KAAOvO,KAAK4H,OAAO0P,OACI,IAA5B/I,EAAIgO,QAAQ,oBAKRvc,KAAK4H,OAAO0P,OAAO/I,GAI9B,MAAMuD,EAAoB,GAC1B,IAAI,MAAMvD,KAAOyrB,EACZzrB,EAAI4sB,WACLrpB,EAAQnM,KAAK4I,EAAIuZ,YAGjB9nB,KAAK4H,OAAO0P,OAAO/I,IAAO,EAI9B,IAAIk7D,EAEFA,EADe,aAAdzpE,KAAKmD,KACC8D,GAAW6K,EAAQ4oB,SAASzzB,GAE5BA,IAAY6K,EAAQ4oB,SAASzzB,GAGtC,YAAejH,KAAK4H,OAAO8hE,cAAe,CAACziE,EAAQ5C,KAC7ColE,EAAIxiE,KACNjH,KAAK4H,OAAO8hE,cAAcjlE,OAAOJ,EAAK,GACtCrE,KAAK4H,OAAO+hE,aAAallE,OAAOJ,EAAK,MAIzC,MAAMulE,EAAsB,aAAd5pE,KAAKmD,KAAsB,iBAAmB,iBACtD0mE,EAA4B,aAAd7pE,KAAKmD,KAAsB,gBAAkB,gBACjE,YAAenD,KAAK4H,OAAOgiE,GAAQ,CAAC3iE,EAAQ5C,KACvCyN,EAAQ4oB,SAASzzB,KAClBjH,KAAK4H,OAAOgiE,GAAOnlE,OAAOJ,EAAK,GAC/BrE,KAAK4H,OAAOiiE,GAAaplE,OAAOJ,EAAK,MAIzCrE,KAAK4H,OAAqB,aAAd5H,KAAKmD,KAAsB,iBAAmB,kBAAoB2O,EAC9E9R,KAAK4H,OAAqB,aAAd5H,KAAKmD,KAAsB,gBAAkB,iBAAmB2O,EAAQrJ,IAAIxB,GAAU,IAAgB6iE,iBAAiB7iE,IAGnIjH,KAAK+pE,cAAcC,UAAUhqE,KAAK4H,QAAQ,GAC1C5H,KAAK05B,UAGP15B,KAAKspE,iBAAmB,IAAI55D,IACrB,IAAmBu6D,eAAeC,mBAAmBrpE,KAAK2zD,IAC/D,IAAI,MAAM5sD,KAAU4sD,EAClBx0D,KAAKspE,iBAAiB30D,IAAI/M,EAAQ,IAAI/D,IAAI,IAAmBsmE,eAAeC,iBAAiBxiE,EAAOuH,IAAI1G,IAAIiX,GAAKA,EAAEzY,YAKzH,SAAS+yB,GACP,MAAM5c,EAAgB,IAAI,KAAc,CACtC7a,OAAO,IAMT,OAJGy3B,IACD5c,EAAcrb,MAAM4b,QAAUqc,GAGzB5c,EAAc5L,MAsCvB,SACKxR,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGdlO,KAAKwpE,WAAW7mE,MAAMC,QAAwB,aAAd5C,KAAKmD,KAAsB,GAAK,OAChEnD,KAAKmR,SAAuB,aAAdnR,KAAKmD,KAAsB,mBAAqB,mBAE9D,MAAMyE,EAAS5H,KAAK4H,OAEd2vB,EAAWr3B,SAASs3B,yBAEpB6yC,EAAoB,IAAI,GAAe,CAC3ClxC,aAAa,EACb7vB,KAAM,oBAKR,IAAIkK,EAFJ62D,EAAkBpqE,UAAUG,UAAUC,IAAI,qBAIxCmT,EADe,aAAdxT,KAAKmD,KACI,CACRmnE,cAAe,CAACC,IAAK,OAAQrtD,KAAM,8BACnCstD,iBAAkB,CAACD,IAAK,UAAWrtD,KAAM,2BACzCutD,aAAc,CAACF,IAAK,YAAartD,KAAM,8BAG/B,CACRigB,SAAU,CAACotC,IAAK,aAAcrtD,KAAM,4BACpCwtD,aAAc,CAACH,IAAK,cAAertD,KAAM,+BACzCytD,OAAQ,CAACJ,IAAK,QAASrtD,KAAM,0BAC7B0tD,WAAY,CAACL,IAAK,aAAcrtD,KAAM,4BACtC2tD,KAAM,CAACN,IAAK,OAAQrtD,KAAM,yBAI9B,MAAM2d,EAAI36B,SAASs3B,yBACnB,IAAI,MAAMjpB,KAAOiF,EAAS,CACxB,MAAMqH,EAAS,YAAO,qDAAsD,CAACxN,KAAMmG,EAAQjF,GAAKg8D,IAAKrtD,KAAM1J,EAAQjF,GAAK2O,OACxHrC,EAAOzO,QAAQnF,OAASsH,EACxBsM,EAAO9Q,OAAO/J,KAAK87B,YACnBjB,EAAE9wB,OAAO8Q,GAEXwvD,EAAkBx8D,QAAQ9D,OAAO8wB,GAEjC,MAAMiwC,EAAe,IAAI,GAAe,CACtCxhE,KAAM,gBAGRiuB,EAASxtB,OAAOsgE,EAAkBpqE,UAAW6qE,EAAa7qE,WAI1D,MAAM8qE,GAA+B,aAAd/qE,KAAKmD,KAAsByE,EAAOojE,eAAiBpjE,EAAOqjE,gBAAgBxnE,QAEjGzD,KAAK0nB,SAAW,IAAI,GAAe,CACjCsU,SAAUh8B,KAAKC,UACfkL,SAAUnL,KAAKupE,eACfnvC,SAAU,CAAC,WACXU,kBAAmB96B,KAAK+6B,cACxBnuB,YAAa,WAEf5M,KAAK0nB,SAASsS,SAAW,IAAIn2B,IAAIknE,GAEjC,IAAIG,GAAe,EACnB,MAAMC,EAAOnrE,KAAK0nB,SAASrnB,IAAIkG,KAAKvG,KAAK0nB,UACzC1nB,KAAK0nB,SAASrnB,IAAM,CAAC4G,EAAQ2G,EAAO+wB,KAClC,GAAG3+B,KAAK0nB,SAASsS,SAASl6B,MAAQ,KAAOorE,IAAiB13D,EAAQvM,GAAS,CACzE,MAAM8I,EAAuB/P,KAAK0nB,SAAS9d,KAAKiG,cAAc,kBAAkB5I,yBAC7E8I,GACDvE,WAAW,KACTuE,EAAG4N,SAAU,GACZ,GAKL,YADAuX,GADY,UAAKlc,OAAqB,aAAdhZ,KAAKmD,KAAsB,uCAAwC,wCAAwC,IAKrI,MAAMgqB,EAAMg+C,EAAKlkE,EAAQuM,EAAQvM,GAAU,eAAKuM,EAAQvM,GAAQiW,WAAQxY,EAAWi6B,GAInF,OAHGnrB,EAAQvM,IACTkmB,EAAItd,cAAc,kBAAkBzP,UAAUC,IAAI,SAAWmT,EAAQvM,GAAQsjE,KAExEp9C,GAGT,MAAMy7B,EAAS5oD,KAAK0nB,SAAS9d,KAAKkH,cAClCg6D,EAAaj9D,QAAQ9D,OAAO/J,KAAK0nB,SAAS9d,MAC1Cg/C,EAAO7+C,OAAOwtB,GAEdv3B,KAAK0nB,SAASgf,WAAWqkC,GACzBG,GAAe,EAEf,IAAI,MAAMpqC,KAAQl5B,EAAO0P,OAEpB9D,EAAQ43D,eAAetqC,IAAWl5B,EAAO0P,OAAOwpB,IAChDupC,EAAkBx8D,QAAQgC,cAAc,kBAAkBixB,OAA0BlF,QAY3F,sBAME,OALG57B,KAAK0nB,WACN1nB,KAAK0nB,SAASznB,UAAU0B,SACxB3B,KAAK0nB,SAAW,MAGXzkB,MAAM0L,sBAMR,KAAK/G,EAAuBzE,EAAgC4mE,GAMjE,OALA/pE,KAAKqrE,eAAiBzjE,EACtB5H,KAAK4H,OAAS,YAAK5H,KAAKqrE,gBACxBrrE,KAAKmD,KAAOA,EACZnD,KAAK+pE,cAAgBA,EAEd9mE,MAAM8N,QCzQF,MAAM,WAAyB,EAA9C,c,oBAUU,KAAAqvB,MAAsJ,GASpJ,OACRpgC,KAAKC,UAAUG,UAAUC,IAAI,yBAC7BL,KAAKk5B,QAAUh5B,SAASC,cAAc,OACtCH,KAAKk5B,QAAQ94B,UAAUC,IAAI,WAC3BL,KAAKk5B,QAAQnvB,OAAO,eAAK,6BACzB/J,KAAK+4D,iBAAmB74D,SAASC,cAAc,OAC/CH,KAAK+4D,iBAAiB34D,UAAUC,IAAI,qBAEpCL,KAAKwpE,WAAa,EAAW,+BAC7B,MAAM8B,EAA4C,CAChDj+D,KAAM,gBACN6P,KAAM,mBACNC,QAAS,KACP,IAAI,GAAU,gBAAiB,CAC7BuW,aAAc,wCACd+D,mBAAoB,sCACpB7Z,QAAS,CAAC,CACRmX,QAAS,SACTiD,SAAU,KACRszC,EAAmBt2D,QAAQ5R,aAAa,WAAY,QACpD,IAAmB6mE,eAAesB,mBAAmBvrE,KAAK4H,QAAQ,GAAM/G,KAAK2qE,IACxEA,GACDxrE,KAAK05B,UAENzY,QAAQ,KACTqqD,EAAmBt2D,QAAQovB,gBAAgB,eAG/ClB,UAAU,MAEX3iB,SAGPvgB,KAAKyrE,QAAU,GAAiB,GAAI,cAAe,CAACH,IACpDtrE,KAAKyrE,QAAQrrE,UAAUC,IAAI,QAE3BL,KAAKyN,OAAO1D,OAAO/J,KAAKwpE,WAAYxpE,KAAKyrE,SAEzC,MAAMn6D,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3BL,KAAK+kC,eAAiB,IAAI,IAAW,CACnCvzB,MAAO,uBACPC,UAhEyB,KAmE3BH,EAAavH,OAAO/J,KAAK+kC,eAAe9kC,WAExC,MAAMyrE,EAAe,CAACliE,EAAmBmiE,EAAqB/tD,EAAgF+xB,KAC5I,MAAMvX,EAAU,IAAI,GAAe,CACjC9uB,KAAMqiE,EACNxyC,aAAa,IAGff,EAAQn4B,UAAUG,UAAUC,IAAI,cAAemJ,GAE/C,MAAMoiE,EAAaxzC,EAAQgJ,yBAiB3B,OAhBAwqC,EAAWxrE,UAAUC,IAAI,qBAEzBud,EAAQtX,QAAQwxB,IACd,MAAMjd,EAAS,YAAO,yDAA0D,CAC9ExN,KAAMyqB,EAAEzqB,KACR6P,KAAM4a,EAAE5a,KACRvP,UAAUmqB,EAAEC,iBAAarzB,IAGxBozB,EAAExuB,OACHqmC,EAAG7X,EAAExuB,MAAQuR,GAGf+wD,EAAW7hE,OAAO8Q,KAGbud,GAGTp4B,KAAKgrE,eAAiBU,EAAa,uBAAwB,gBAAiB,CAAC,CAC3Er+D,KAAM,cACN6P,KAAM,kCACN6a,YAAY,GACX,CACD7a,KAAM,2BACN7P,KAAM,aACN/D,KAAM,YACL,CACD4T,KAAM,8BACN7P,KAAM,cACN/D,KAAM,gBACL,CACD4T,KAAM,yBACN7P,KAAM,QACN/D,KAAM,UACL,CACD4T,KAAM,2BACN7P,KAAM,UACN/D,KAAM,cACL,CACD4T,KAAM,uBACN7P,KAAM,OACN/D,KAAM,SACJtJ,KAAKogC,OAETpgC,KAAKirE,eAAiBS,EAAa,uBAAwB,gBAAiB,CAAC,CAC3Er+D,KAAM,gBACN6P,KAAM,kCACN6a,YAAY,GACX,CACD7a,KAAM,6BACN7P,KAAM,OACN/D,KAAM,iBACL,CACD4T,KAAM,0BACN7P,KAAM,UACN/D,KAAM,oBACL,CACD4T,KAAM,4BACN7P,KAAM,YACN/D,KAAM,iBACJtJ,KAAKogC,OAETpgC,KAAK+K,WAAWhB,OAAO/J,KAAK+4D,iBAAkB/4D,KAAKk5B,QAAS5nB,EAActR,KAAKgrE,eAAe/qE,UAAWD,KAAKirE,eAAehrE,WAE7H,MAAM4rE,EAAyB7rE,KAAKgrE,eAAe/qE,UAAU4P,cAAc,sBACrEi8D,EAAyB9rE,KAAKirE,eAAehrE,UAAU4P,cAAc,sBAyD3E,OAvDAg8D,EAAuBh8D,cAAc,QAAQ7O,iBAAiB,QAAS,KACrE,IAAI,GAAoBhB,KAAKsN,QAAQyD,KAAK/Q,KAAK4H,OAAQ,WAAY5H,QAGrE8rE,EAAuBj8D,cAAc,QAAQ7O,iBAAiB,QAAS,KACrE,IAAI,GAAoBhB,KAAKsN,QAAQyD,KAAK/Q,KAAK4H,OAAQ,WAAY5H,QAGrEA,KAAKwpE,WAAWxoE,iBAAiB,QAAS,KACxC,GAAGhB,KAAK+kC,eAAehjC,MAAM3B,UAAUuR,SAAS,SAC9C,OAGF,IAAI3R,KAAK+kC,eAAe7iC,MAAMoJ,OAE5B,YADAtL,KAAK+kC,eAAehjC,MAAM3B,UAAUC,IAAI,SAI1C,IAUI8F,EAVA4lE,EAAW5jE,MAAMC,KAAKyjE,EAAuB9lD,UAA4BtiB,MAAM,GAAGsgC,OAAO,CAACC,EAAKj0B,IAAOi0B,KAAQj0B,EAAGpN,MAAMC,QAAS,GACpImpE,GAAW/rE,KAAK4H,OAAOokE,cAAc7pE,OAEjC4pE,GAKJ/rE,KAAKwpE,WAAWpmE,aAAa,WAAY,QAMvC+C,EAHEnG,KAAK4H,OAAOuH,GAGJ,IAAmB86D,eAAesB,mBAAmBvrE,KAAK4H,QAF1D,IAAmBqiE,eAAegC,mBAAmBjsE,KAAK4H,QAKtEzB,EAAQtF,KAAK2qE,IACRA,GACDxrE,KAAK05B,UAENltB,MAAMC,IACS,4BAAbA,EAAItJ,KACL+xB,GAAM,yCAENxoB,QAAQC,MAAM,4BAA6BF,KAE5CwU,QAAQ,KACTjhB,KAAKwpE,WAAWplC,gBAAgB,eAxBhClP,GAAM,sDA4BVl1B,KAAK+kC,eAAehjC,MAAMf,iBAAiB,QAAS,KAClDhB,KAAK4H,OAAOgG,MAAQ5N,KAAK+kC,eAAe7iC,MACxClC,KAAKksE,uBAGAlsE,KAAKmsE,qBAAuBtxB,GAAA,EAAat6C,qBAAqB,CACnEN,UAAWD,KAAK+4D,iBAChBv4D,MAAM,EACNC,UAAU,EACVC,MAAO,GACPC,OAAQ,IACP,4BAA4BE,KAAKsgB,IAClCnhB,KAAKe,UAAYogB,EAEV05B,GAAA,EAAan5C,kBAAkByf,KAI1C,qBACEnhB,KAAKmsE,qBAAqBtrE,KAAK,KAC7Bb,KAAKe,UAAUN,UAAW,EAC1BT,KAAKe,UAAUU,SAIX,eACNzB,KAAKk5B,QAAQv2B,MAAMC,QAAU,GAC7B5C,KAAKmR,SAAS,aACdnR,KAAKyrE,QAAQrrE,UAAUC,IAAI,QAC3BL,KAAKwpE,WAAWppE,UAAUuB,OAAO,QACjC3B,KAAK+kC,eAAe7iC,MAAQ,GAE5B,IAAI,MAAM4+B,KAAQ9gC,KAAKogC,MAErBpgC,KAAKogC,MAAMU,GAAMn+B,MAAMC,QAAU,OAI7B,aACN5C,KAAKk5B,QAAQv2B,MAAMC,QAAU,OAC7B5C,KAAKmR,SAAuB,WAAdnR,KAAKmD,KAAoB,YAAc,oBAEpC,SAAdnD,KAAKmD,OACNnD,KAAKyrE,QAAQrrE,UAAUuB,OAAO,QAC9B3B,KAAKwpE,WAAWppE,UAAUC,IAAI,SAGhC,MAAMuH,EAAS5H,KAAK4H,OACpB5H,KAAK+kC,eAAe7iC,MAAQ,IAAkBkqE,cAAcxkE,EAAOgG,OAEnE,IAAI,MAAMkzB,KAAQ9gC,KAAKogC,MACrBpgC,KAAKogC,MAAMU,GAAyCn+B,MAAMC,QAAYgF,EAAO0P,OAAOwpB,GAA2C,GAAK,OAGtI,CAAE,iBAA2B,kBAA4Bx6B,QAAQiI,IAC/D,MAAM6pB,EAAUp4B,KAAKuO,GACf89D,EAAK,GAAkBxiE,iBAEvB+pD,EAAQhsD,EAAO2G,GAAK9K,QAEpB6oE,EAAcC,IAClB,IAAI,IAAIvhE,EAAI,EAAG7I,EAASE,KAAKC,IAAIsxD,EAAMzxD,OAAQoqE,GAAUvhE,EAAI7I,IAAU6I,EAAG,CACxE,MAAM/D,EAAS2sD,EAAMhuD,SAEf,IAACkG,GAAO,GAAkBC,aAAa,CAC3CF,OAAQ5E,EACRhH,UAAWosE,EACXrgE,YAAY,EACZqG,eAAe,EACfnG,WAAW,EACXD,WAAY,KAEdH,EAAIwG,gBAAgBxB,cAAcnP,SAGjCiyD,EAAMzxD,OACP2vC,EAASC,iBAAiBroB,YAAY,eAAK,sBAAuB,CAACkqC,EAAMzxD,UACjE2vC,GACRA,EAASnwC,UAMb,IAAImwC,EACJ,GAHA1Z,EAAQgJ,yBAAyBr3B,OAAOsiE,GAGrCzY,EAAMzxD,OAAQ,CACf,MAAM0L,EAAUuqB,EAAQgJ,yBACxB0Q,EAAW,YAAO,yDAA0D,CAACzkC,KAAM,SACnFykC,EAAS1xC,UAAUC,IAAI,YAAa,eACpCyxC,EAAS9wC,iBAAiB,QAAS,IAAMsrE,EAAW,KACpDx6B,EAAS/nC,OAAO,eAAK,sBAAuB,CAAC6pD,EAAMzxD,UAEnD0L,EAAQ9D,OAAO+nC,GAGjBw6B,EAAW,KAIf,qBACE,GAAiB,SAAdtsE,KAAKmD,KAAiB,CACvB,MAAMi2B,GAAW,YAAUp5B,KAAKqrE,eAAgBrrE,KAAK4H,QACrD5H,KAAKwpE,WAAWppE,UAAUkM,OAAO,QAAS8sB,GAC1Cp5B,KAAKyrE,QAAQrrE,UAAUkM,OAAO,OAAQ8sB,IAI1C,UAAUxxB,EAAsB4kE,GAE9BrkE,MAAMC,KAAKpI,KAAKC,UAAU6P,iBAAiB,mBAAmBxJ,QAAQyJ,GAAMA,EAAGpO,UAE5E6qE,GACDxsE,KAAKqrE,eAAiBzjE,EACtB5H,KAAK4H,OAAS,YAAKA,KAEnB5H,KAAK4H,OAASA,EACd5H,KAAKysE,aACLzsE,KAAKksE,sBAIF,KAAKtkE,GACV,MAAM2+B,EAAMtjC,MAAM8N,OAuBlB,YArBcrM,IAAXkD,GACD5H,KAAKgqE,UAAU,CACb5iE,EAAG,eACH+H,GAAI,EACJvB,MAAO,GACP0J,OAAQ,GACRqyD,aAAc,GACdqC,cAAe,GACfU,cAAe,GACfhD,cAAe,GACfsB,eAAgB,GAChBC,eAAgB,KACf,GACHjrE,KAAKmD,KAAO,SACZnD,KAAK2sE,iBAEL3sE,KAAKgqE,UAAUpiE,GAAQ,GACvB5H,KAAKmD,KAAO,OACZnD,KAAKysE,cAGAlmC,G,2SCnVI,MAAM,WAA0B,EAA/C,c,oBAOU,KAAAqmC,gBAA6C,GAG7C,aAAaC,EAAqE5sE,EAAyB4xB,GACjH,IAAIjqB,EA2CAulB,EA1CAuK,EAAc,GACdhY,EAAmB,GACvB,GAAsB,0BAAnBmtD,EAAazlE,EACdQ,EAASilE,EAAajlE,OACtB8vB,EAAcm1C,EAAan1C,gBACtB,CAQL,GAPA9vB,EAASilE,EAOa,IALD71D,OAAOm1C,KAAKvkD,EAAO0P,QAAQnV,OAKvB,CACvB,MAAMmV,EAAS1P,EAAO0P,OACtB,IAAI+6B,EACD/6B,EAAO6lB,SAAUkV,EAAI,oBAChB/6B,EAAOozD,aAAcr4B,EAAI,uBACzB/6B,EAAOqzD,OAAQt4B,EAAI,kBACnB/6B,EAAOszD,WAAYv4B,EAAI,oBACvB/6B,EAAOuzD,OAAMx4B,EAAI,iBAEtBA,GACD3yB,EAAE/Z,KAAK,eAAK0sC,IAIhB,IAAI3yB,EAAEvd,OAAQ,CACZ,MAAM2qE,EAAS,IAAmB3C,eAAeC,iBAAiBxiE,EAAOuH,IACzE,IAAIunD,EAAQ,EAAGqW,EAAW,EAAGpC,EAAS,EACtC,IAAI,MAAM9+D,KAAUihE,EACf,IAAgBE,WAAWnhE,EAAO5E,QAAS0jE,IACtC,IAAgBxyC,YAAYtsB,EAAO5E,QAAS8lE,IAC/CrW,IAGJA,GAAOh3C,EAAE/Z,KAAK,eAAK,QAAS,CAAC+wD,KAC7BqW,GAAUrtD,EAAE/Z,KAAK,eAAK,WAAY,CAAConE,KACnCpC,GAAQjrD,EAAE/Z,KAAK,eAAK,SAAU,CAACglE,MAKtC,GAAI94C,EAwBFA,EAAIxF,SAAS7Z,YAAc,GAC3B,eAAKkN,GAAGpZ,QAAQyJ,IACd8hB,EAAIxF,SAAStiB,OAAOgG,UAbtB,GAZA8hB,EAAM,IAAI,GAAI,CACZjkB,MAAO,IAAkB6e,cAAc7kB,EAAOgG,OAC9Cye,SAAUqL,EACVjuB,WAAW,IAGViW,EAAEvd,QACH,eAAKud,GAAGpZ,QAAQyJ,IACd8hB,EAAIxF,SAAStiB,OAAOgG,KAIF,iBAAnB88D,EAAazlE,EAAsB,CACpC,MAAM6lE,EAAWrlE,EAAOuH,GACpBnP,KAAK4sE,gBAAgBxB,eAAexjE,EAAOuH,KAC7C,YAAiB0iB,EAAI5xB,UAAW,KAC9B,IAAI,GAAiBD,KAAKsN,QAAQyD,KAAK,IAAmBk5D,eAAeiD,UAAUD,KAClF,CAACl/D,eAAgB/N,KAAK+N,iBAG3B/N,KAAK4sE,gBAAgBhlE,EAAOuH,IAAM0iB,EAgBtC,OAPA1E,EAAM0E,EAAI5xB,UAEN2H,EAA0BwjE,eAAe,cAE3CnmB,GAAuB93B,EAAKA,EAAIrc,eAAiB7Q,EAAY2H,EAA0BulE,YAC/EltE,GAAWA,EAAU8J,OAAOojB,GAE/BA,EAGO,O,0CACdntB,KAAKC,UAAUG,UAAUC,IAAI,0BAC7BL,KAAKmR,SAAS,8BAEdnR,KAAK+K,WAAW9K,UAAUG,UAAUC,IAAI,gBAExCL,KAAK+4D,iBAAmB74D,SAASC,cAAc,OAC/CH,KAAK+4D,iBAAiB34D,UAAUC,IAAI,qBAEpC,MAAM64B,EAAUh5B,SAASC,cAAc,OACvC+4B,EAAQ94B,UAAUC,IAAI,WACtB,gBAAM,CAAC2U,QAASkkB,EAAS3qB,IAAK,2BAE9BvO,KAAKotE,gBAAkB,YAAO,kDAAmD,CAC/ElwD,KAAM,2BACN7P,KAAM,QAGRrN,KAAKqtE,eAAiB,IAAI,GAAe,CACvC/jE,KAAM,YAERtJ,KAAKqtE,eAAeptE,UAAU0C,MAAMC,QAAU,OAE9C5C,KAAKstE,iBAAmB,IAAI,GAAe,CACzChkE,KAAM,sBAERtJ,KAAKstE,iBAAiBrtE,UAAU0C,MAAMC,QAAU,OAEhD5C,KAAK+K,WAAWhB,OAAO/J,KAAK+4D,iBAAkB7/B,EAASl5B,KAAKotE,gBAAiBptE,KAAKqtE,eAAeptE,UAAWD,KAAKstE,iBAAiBrtE,WAElI,YAAiBD,KAAKotE,gBAAiB,KAClCp2D,OAAOm1C,KAAKnsD,KAAK4sE,iBAAiBzqE,QAAU,GAC7C+yB,GAAM,yCAEN,IAAI,GAAiBl1B,KAAKsN,QAAQyD,QAEnC,CAAChD,eAAgB/N,KAAK+N,iBAEzB,MAAMw/D,EAA2B,KAC/BvtE,KAAKqtE,eAAeptE,UAAU0C,MAAMC,QAAUoU,OAAOm1C,KAAKnsD,KAAK4sE,iBAAiBzqE,OAAS,GAAK,QA+DhG,OA5DA,IAAmB8nE,eAAeC,mBAAmBrpE,KAAK2zD,IACxD,IAAI,MAAM5sD,KAAU4sD,EAClBx0D,KAAKwtE,aAAa5lE,EAAQ5H,KAAKqtE,eAAex/D,SAGhD0/D,MAGFvtE,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAkB4H,IAChD5H,KAAK4sE,gBAAgBxB,eAAexjE,EAAOuH,IAC5CnP,KAAKwtE,aAAa5lE,EAAQ,KAAM5H,KAAK4sE,gBAAgBhlE,EAAOuH,KAE5DnP,KAAKwtE,aAAa5lE,EAAQ5H,KAAKqtE,eAAex/D,SAGhD0/D,IAEAvtE,KAAKytE,wBAGPztE,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAkB4H,IAChD5H,KAAK4sE,gBAAgBxB,eAAexjE,EAAOuH,MAM5CnP,KAAKytE,sBAELztE,KAAK4sE,gBAAgBhlE,EAAOuH,IAAIlP,UAAU0B,gBACnC3B,KAAK4sE,gBAAgBhlE,EAAOuH,KAGrCo+D,MAGFvtE,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,eAAiB0tE,IAClDA,EAAMpnE,QAAQ,CAAC2mE,EAAU5oE,KACvB,MAAMpE,EAAYD,KAAK4sE,gBAAgBK,GAAUhtE,UACjDglD,GAAuBhlD,EAAWA,EAAU6Q,cAAezM,EAAM,OAIrErE,KAAKmsE,qBAAuBtxB,GAAA,EAAat6C,qBAAqB,CAC5DN,UAAWD,KAAK+4D,iBAChBv4D,MAAM,EACNC,UAAU,EACVC,MAAO,GACPC,OAAQ,IACP,4BAA4BE,KAAKsgB,IAClCnhB,KAAKe,UAAYogB,EAEV05B,GAAA,EAAan5C,kBAAkByf,KAGxCnhB,KAAKytE,sBAKEztE,KAAKmsE,wBAGd,qBACEnsE,KAAKmsE,qBAAqBtrE,KAAK,KAC7Bb,KAAKe,UAAUN,UAAW,EAC1BT,KAAKe,UAAUU,SAIX,sBACN,OAAO,KAAWi1B,UAAU,sCAAsC71B,KAAK8sE,IACrE3tE,KAAKstE,iBAAiBrtE,UAAU0C,MAAMC,QAAU+qE,EAAiBxrE,OAAS,GAAK,OAC/EgG,MAAMC,KAAKpI,KAAKstE,iBAAiBz/D,QAAQkY,UAAUtiB,MAAM,GAAG6C,QAAQyJ,GAAMA,EAAGpO,UAE7EgsE,EAAiBrnE,QAAQsB,IACvB,MAAMulB,EAAMntB,KAAKwtE,aAAa5lE,GACxBiT,EAAS,YAAO,gCAAiC,CAACqC,KAAM,QAC9DiQ,EAAIpjB,OAAO8Q,GACX7a,KAAKstE,iBAAiBz/D,QAAQ9D,OAAOojB,GAErC,YAAiBtS,EAAS5Y,IAGxB,GAFA,OAAAyb,EAAA,GAAYzb,GAET+U,OAAOm1C,KAAKnsD,KAAK4sE,iBAAiBzqE,QAAU,GAE7C,YADA+yB,GAAM,yCAIRra,EAAOzX,aAAa,WAAY,QAEhC,MAAMy3B,EAAIjzB,EAAOA,OACjBizB,EAAEmwC,eAAiB,GACnBnwC,EAAEowC,eAAiB,GACnBpwC,EAAE6uC,cAAgB,GAElB,IAAmBO,eAAegC,mBAAmBpxC,GAAG,GAAMh6B,KAAK2qE,IAC9DA,GACDr+C,EAAIxrB,WAELsf,QAAQ,KACTpG,EAAOupB,gBAAgB,eAExB,CAACr2B,eAAgB/N,KAAK+N,sBCtPlB,MAAM,WAA4B,EACrC,OACR/N,KAAKC,UAAUG,UAAUC,IAAI,2BAC7BL,KAAKmR,SAAS,+CAEd,MAAMy8D,EAAiB5qE,IAKrB,MAAMo1B,EAAU,IAAI,GAAe,CACjC9uB,KAAMtG,EAAQsG,OAGVukE,EAAa,IAAI,GAAI,CACzBzwD,cAAe,IAAI,KAAc,CAACF,KAAMla,EAAQ8qE,SAAUnwD,SAAS,IACnEyV,gBAAiB,YAGb26C,EAAoB,IAAI,GAAI,CAChC3wD,cAAe,IAAI,KAAc,CAACF,KAAM,+BAAgCS,SAAS,IACjFyV,gBAAiB,YAGnBgF,EAAQvqB,QAAQ9D,OAAO8jE,EAAW5tE,UAAW8tE,EAAkB9tE,WAE/DD,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAE/B,MAAM+tE,EAAkB,CAAC5mE,EAAGpE,EAAQqzD,UAC9B9vB,EAAM,KAAwB0nC,kBAAkBD,IACrDznC,aAAe1jC,QAAU0jC,EAAM1jC,QAAQoD,QAAQsgC,IAAM1lC,KAAMqtE,IAC1D,MAAMC,EAAgB,KACpB,MAAMh3D,EAAQ,KAAwBquB,QAAQ0oC,GAI9C,OAHAL,EAAWzwD,cAAcO,SAAWxG,EACpC42D,EAAkB3wD,cAAcO,QAAUuwD,EAAeE,cAElDj3D,GAGTg3D,IAEAnuE,KAAKwO,cAAcxN,iBAAiB,UAAW,KAC7C,MAAMqtE,GAAQR,EAAWzwD,cAAcO,QACjC2wD,EAAeP,EAAkB3wD,cAAcO,QAErD,GAAG0wD,IAAS,KAAwB7oC,QAAQ0oC,IAAmBI,IAAiBJ,EAAeE,cAC7F,OAGF,MAAMG,EAAqB,YAAKL,GAChCK,EAAcnnE,EAAI,0BAClBmnE,EAAcC,WAAaH,EAAO,WAAa,EAC/CE,EAAcH,cAAgBE,EAE9B,KAAwBG,qBAAqBT,EAAiBO,IAC7D,CAAC52D,MAAM,IAEV3X,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,kBAAoB2hC,IACrD,MAAM00B,EAAW,YAAqB10B,EAAOD,KAAKt6B,GAC/CpE,EAAQqzD,WAAaA,IACtB6X,EAAiBvsC,EAAO8D,gBACxB0oC,UAMRP,EAAc,CACZtkE,KAAM,4BACNwkE,SAAU,+BACVzX,SAAU,qBAGZuX,EAAc,CACZtkE,KAAM,sBACNwkE,SAAU,yBACVzX,SAAU,qBAGZuX,EAAc,CACZtkE,KAAM,wBACNwkE,SAAU,2BACVzX,SAAU,0BAGZ,CACE,MAAMj+B,EAAU,IAAI,GAAe,CACjC9uB,KAAM,uBAGFolE,EAAoB,IAAI,GAAI,CAChCtxD,cAAe,IAAI,KAAc,CAACF,KAAM,gBAAiBS,SAAS,IAClEyV,gBAAiB,YAGbu7C,EAAW,IAAI,GAAI,CACvBvxD,cAAe,IAAI,KAAc,CAACF,KAAM,sBAAuBS,SAAS,EAAM8W,SAAU,iCACxFrB,gBAAiB,YAGnBsB,EAAA,QAAgBC,WAAW9zB,KAAK+zB,IAC9B+5C,EAASvxD,cAAcO,QAAUiX,EAAMoK,SAASyM,cAAcmjC,QAGhEx2C,EAAQvqB,QAAQ9D,OAAO2kE,EAAkBzuE,UAAW0uE,EAAS1uE,WAE7DD,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAE/B,KAAwB4uE,+BAA+BhuE,KAAKmZ,IAC1D00D,EAAkBtxD,cAAcO,QAAU3D,EAE1Cha,KAAKwO,cAAcxN,iBAAiB,UAAW,KAC7C,MAAM09D,EAAWgQ,EAAkBtxD,cAAcO,QAC9C3D,IAAY0kD,GACb,KAAwBoQ,8BAA8BpQ,IAEvD,CAAC/mD,MAAM,Q,2SC1HH,MAAM,WAAuB,EAC1B,O,0CACd3X,KAAKC,UAAUG,UAAUC,IAAI,sBAC7BL,KAAKmR,SAAS,mCAEd,MAAMinB,EAAU,IAAI,GAAe,IAE7Bs/B,EAA8B,IAAIhoD,IAElCvJ,EAAU,KAAW4oE,mBAAmB,wBAAyB,CACrEC,UAAW,UACVnuE,KAAMouE,IACP,MAAM52C,EAAS,eACf42C,EAAU3oE,QAAS4oE,IACjB,MAAMr9C,EAAM,IAAI,GAAI,CAClBsB,WAAY,IAAI,GAAW,CACzBjW,KAAMgyD,EAAS5lE,KACfA,KAAM+uB,EACNn2B,MAAOgtE,EAASC,YAElB9iD,SAAU6iD,EAASE,cAGrB1X,EAAU/iD,IAAIu6D,EAASC,UAAWt9C,KAGpC,MAAMoB,EAAOY,GAAkB,IAAI6jC,EAAUx4B,UAAYh9B,IACvD,UAAKmtE,YAAYntE,KAGnB,UAAKotE,mBAAmBzuE,KAAK0uE,IAC3B,MAAM19C,EAAM6lC,EAAU1nD,IAAIu/D,EAASJ,WAC/Bt9C,EAKJA,EAAIsB,WAAWzvB,kBAAiB,GAJ9BgJ,QAAQC,MAAM,SAAUklB,EAAK09C,KAOjCn3C,EAAQvqB,QAAQ9D,OAAOkpB,KAKzB,OAFAjzB,KAAK+K,WAAWhB,OAAOquB,EAAQn4B,WAExBkG,MCpCI,MAAM,WAAuB,EAA5C,c,oBAKU,KAAAyX,QAOJ,GAEM,OACR5d,KAAKC,UAAUG,UAAUC,IAAI,sBAC7BL,KAAKmR,SAAS,YAEd,MAAM6M,EAAU,GAAiB,GAAI,cAAe,CAAC,CACnD3Q,KAAM,SACN6P,KAAM,qBACNC,QAAS,KACP,IAAI,GAAU,SAAU,CACtBuW,aAAc,SACd+D,mBAAoB,qBACpB7Z,QAAS,CAAC,CACRmX,QAAS,SACTiD,SAAU,KACR,KAAWw3C,UAEbtsC,UAAU,MAEX3iB,WAIPvgB,KAAKyN,OAAO1D,OAAOiU,GAEnBhe,KAAK4yB,WAAa,IAAI,GACtB5yB,KAAK4yB,WAAWxvB,aAAa,YAAa,IAC1CpD,KAAK4yB,WAAWxyB,UAAUC,IAAI,iBAAkB,cA4ChDL,KAAKihD,QAAU/gD,SAASC,cAAc,OACtCH,KAAKihD,QAAQ7gD,UAAUC,IAAI,gBAE3BL,KAAKyvE,SAAWvvE,SAASC,cAAc,OACvCH,KAAKyvE,SAASrvE,UAAUC,IAAI,oBAE5B,MAAMqvE,EAAaxvE,SAASC,cAAc,OAC1CuvE,EAAWtvE,UAAUC,IAAI,mBAEzB,MAAMmJ,EAAY,6CAClBkmE,EAAW3lE,OAAO/J,KAAK4d,QAAQ+xD,KAAO,YAAOnmE,EAAW,CAAC6D,KAAM,OAAQ6P,KAAM,uBAC7EwyD,EAAW3lE,OAAO/J,KAAK4d,QAAQgyD,QAAU,YAAOpmE,EAAW,CAAC6D,KAAM,SAAU6P,KAAM,6BAClFwyD,EAAW3lE,OAAO/J,KAAK4d,QAAQiyD,QAAU,YAAOrmE,EAAW,CAAC6D,KAAM,WAAY6P,KAAM,4CACpFwyD,EAAW3lE,OAAO/J,KAAK4d,QAAQ6tB,cAAgB,YAAOjiC,EAAW,CAAC6D,KAAM,SAAU6P,KAAM,mCACxFwyD,EAAW3lE,OAAO/J,KAAK4d,QAAQs4C,QAAU,YAAO1sD,EAAW,CAAC6D,KAAM,OAAQ6P,KAAM,wCAChFwyD,EAAW3lE,OAAO/J,KAAK4d,QAAQsxD,SAAW,YAAO1lE,EAAW,CAAC6D,KAAM,WAAY6P,KAAM,8BAErFld,KAAK+K,WAAWhB,OAAO/J,KAAK4yB,WAAY5yB,KAAKihD,QAASjhD,KAAKyvE,SAAUC,GACrE1vE,KAAK+K,WAAW9K,UAAUG,UAAUC,IAAI,2BAMxCL,KAAK4d,QAAQ+xD,KAAK3uE,iBAAiB,QAAS,KAC9B,IAAI,GAAkBhB,KAAKsN,QACnCyD,SAGN/Q,KAAK4d,QAAQgyD,QAAQ5uE,iBAAiB,QAAS,KAC7C,IAAI,GAAkBhB,KAAKsN,QAAQyD,SAGrC/Q,KAAK4d,QAAQiyD,QAAQ7uE,iBAAiB,QAAS,KAC7C,IAAI,GAAsBhB,KAAKsN,QAAQyD,SAGzC/Q,KAAK4d,QAAQ6tB,cAAczqC,iBAAiB,QAAS,KACnD,IAAI,GAAoBhB,KAAKsN,QAAQyD,SAGvC/Q,KAAK4d,QAAQs4C,QAAQl1D,iBAAiB,QAAS,KAC7C,IAAI,GAAyBhB,KAAKsN,QAAQyD,SAG5C/Q,KAAK4d,QAAQsxD,SAASluE,iBAAiB,QAAS,KAC9C,IAAI,GAAehB,KAAKsN,QAAQyD,SAGlC8pC,GAAA,EAAagI,oBAEb7iD,KAAK8vE,eAGA,eACL,MAAM7qC,EAAO,IAAgBkkC,UACvBliE,EAASg+B,EAAK91B,GAAG2Y,UAAS,GAChC9nB,KAAK4yB,WAAWxvB,aAAa,OAAQ,GAAK6D,GAE1CjH,KAAKihD,QAAQl3C,OAAO,IAAI,KAAU,CAAC9C,OAAQA,IAAS+N,SACpDhV,KAAKyvE,SAASxrE,UAAYghC,EAAKY,MAAQ,IAAgBC,gBAAgBb,EAAKY,OAAS,ICtJ1E,MAAM,WAAyB,EAA9C,c,oBACU,KAAA30B,aAAyC,KAOvC,OACRlR,KAAKC,UAAUG,UAAUC,IAAI,yBAC7BL,KAAKmR,SAAS,cAEdnR,KAAKoR,WAAa,IAAI,EAAYC,IAChCrR,KAAKkR,aAAeG,IAGtB,MAAMC,EAAepR,SAASC,cAAc,OAC5CmR,EAAalR,UAAUC,IAAI,iBAE3BL,KAAK+vE,sBAAwB,IAAI,IAAW,CAC1Cv+D,MAAO,mBACPC,UAAW,MAGbzR,KAAKgwE,6BAA+B,IAAI,IAAW,CACjDx+D,MAAO,iCACPC,UAAW,MAGbH,EAAavH,OAAO/J,KAAK+vE,sBAAsB9vE,UAAWD,KAAKgwE,6BAA6B/vE,WAE5F,MAAMgwE,EAAiB,KACrBjwE,KAAK0R,QAAQtR,UAAUkM,OAAO,eAAgBtM,KAAK+vE,sBAAsB7tE,MAAMC,SAC5EnC,KAAK+vE,sBAAsBhuE,MAAM3B,UAAUuR,SAAS,WACpD3R,KAAKgwE,6BAA6BjuE,MAAM3B,UAAUuR,SAAS,WAGhE3R,KAAK+vE,sBAAsBhuE,MAAMf,iBAAiB,QAASivE,GAC3DjwE,KAAKgwE,6BAA6BjuE,MAAMf,iBAAiB,QAASivE,GAElE,MAAM/2C,EAAUh5B,SAASC,cAAc,OACvC+4B,EAAQ94B,UAAUC,IAAI,WACtB,gBAAM64B,EAAS,uCAEfl5B,KAAK0R,QAAU,EAAa,CAACrE,KAAM,eAEnCrN,KAAK0R,QAAQ1Q,iBAAiB,QAAS,KACrC,MAAM4M,EAAQ5N,KAAK+vE,sBAAsB7tE,MACnCuhC,EAAQzjC,KAAKgwE,6BAA6B9tE,MAEhDlC,KAAK0R,QAAQE,UAAW,EACxB,IAAgBs+D,cAActiE,EAAO61B,GAAO5iC,KAAM24B,IAC7Cx5B,KAAKkR,cACNlR,KAAKkR,eAAerQ,KAAMoR,IACxB,IAAgBC,UAAUsnB,EAAWvnB,KAIzC,GAAezB,qBAAqBxQ,MACpC,IAAI,GAAiBA,KAAKsN,QAAQyD,KAAK,CACrC5N,KAAM,UACNijC,WAAW,EACXx4B,MAAO,kBACPhB,YAAa,gBACbgzB,QAAU9tB,GACD,IAAgB08B,gBAAgBhV,EAAW1nB,SAM1D9R,KAAK6N,QAAQ9D,OAAO/J,KAAK0R,SACzB1R,KAAK+K,WAAWhB,OAAO/J,KAAKoR,WAAWnR,UAAWqR,EAAc4nB,GAG3D,sBAML,OALAl5B,KAAKoR,WAAWjH,QAChBnK,KAAKkR,aAAe,KACpBlR,KAAK+vE,sBAAsB7tE,MAAQ,GACnClC,KAAKgwE,6BAA6B9tE,MAAQ,GAC1ClC,KAAK0R,QAAQE,UAAW,EACjB3O,MAAM0L,uB,cClFF,MAAM,WAA2B,KAC9C,cACE1L,MAAM,wDAAyD,KAAM,CAACm8B,UAAU,EAAM+wC,YAAa,QAEnG,gBAAMnwE,KAAK4N,MAAO,mBAElB,YAAiB5N,KAAKowE,WAAY,KAChC,MAAMjqE,EAAU,IAAgBkqE,cAActrC,EAAe7iC,MAAO8iC,EAAmB9iC,MAAOouE,EAAcpuE,OAE5GiE,EAAQtF,KAAK,KACXb,KAAKu/B,QACH9yB,IACc,YAAbA,EAAItJ,OACLgyB,GAAS,CAACC,YAAa,sCACvBsO,EAAS9xB,UAAW,KAIxB8xB,EAAS6sC,gBAAgBpqE,IACxB,CAAC4H,eAAgB/N,KAAK+N,iBAEzB,MAAMukB,EAA4B,GAC5BnF,EAAMjtB,SAASC,cAAc,OACnCgtB,EAAI/sB,UAAUC,IAAI,eAClB,MAAM0kC,EAAiB,IAAI,IAAW,CACpCvzB,MAAO,YACPlI,KAAM,sBACNmI,UAAW,GACX+gB,UAAU,IAENwS,EAAqB,IAAI,IAAW,CACxCxzB,MAAO,WACPlI,KAAM,0BACNmI,UAAW,KAEP6+D,EAAgB,IAAI,KAAc,CAAC99C,UAAU,IACnDF,EAAY3sB,KAAKo/B,EAAgBC,EAAoBsrC,GAErD,MAAMvjE,EAAU,KACd,MAAMzD,EAAOy7B,EAAe7iC,MAAQ,IAAM8iC,EAAmB9iC,MAE7DwhC,EAAS9Q,WAAWxvB,aAAa,aAAckG,GAC/Co6B,EAAS9Q,WAAW+O,UAGtB3hC,KAAK+N,eAAe1N,IAAI0kC,EAAehjC,MAAvC/B,CAA8C,QAAS+M,GACvD/M,KAAK+N,eAAe1N,IAAI2kC,EAAmBjjC,MAA3C/B,CAAkD,QAAS+M,GAE3D,MAAMk4B,EAAO,IAAgBkkC,UACvBhW,EAAY,OAAAD,GAAA,GAAkBjuB,EAAKY,OACtCstB,IACDmd,EAAcE,SAAW,MACdF,EAAcpuE,MAAM0Q,MAAM,MAGrC09D,EAAcpuE,MAAQ,IAAMixD,EAAUlxC,KAAKwuD,cAG7C,MAAM/sC,EAAW,IAAI,GAAS,CAC5BpR,cACAvkB,eAAgB/N,KAAK+N,eACrB8kB,iBAAiB,EACjBnhB,QAAS1R,KAAKowE,WACdnkE,WAAY,MAGdkhB,EAAIpjB,OAAOg7B,EAAe9kC,UAAW+kC,EAAmB/kC,UAAWyjC,EAAS9Q,YAC5E5yB,KAAKC,UAAU8J,OAAOojB,EAAKmjD,EAAcrwE,WAEzCD,KAAKugB,QC9DM,MAAM,WAAuB,EAKhC,OACRvgB,KAAKC,UAAUkP,GAAK,qBAIpB,MAAM6tD,EAAS,EAAa,CAAC3vD,KAAM,MAAO7D,UAAW,eACrDxJ,KAAK6N,QAAQ9D,OAAOizD,GAEpB,YAAiBA,EAAQ,KACvB,IAAI,IACH,CAACjvD,eAAgB/N,KAAK+N,iBAEzB/N,KAAK0wE,YAAc,IAAI,EAAY,SAAWxuE,IAC5ClC,KAAK2wE,aAAazuE,KAGpBlC,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,kBAAoBoS,IACrD,MAAM0yB,EAAY,IAAgBA,UAAU1yB,GACtCnL,EAASmL,EAAO0V,WACnBgd,EAAW9kC,KAAK4wE,eAAevwE,IAAI4G,GACjCjH,KAAK4wE,eAAeviE,OAAOpH,KAGlCjH,KAAK4N,MAAM8b,YAAY1pB,KAAK0wE,YAAYzwE,WAExCD,KAAK4sB,WAAa,eAMV,aACR,MAAMgkD,EAAiB,IAAI,GACrBhnE,EAAOgnE,EAAehnE,KAM5B,OALAA,EAAKuF,GAAK,WACVvF,EAAKxJ,UAAUC,IAAI,sBACnB,GAAkB2J,qBAAqBJ,EAAM,KAC3C5J,KAAK05B,cACJh1B,GAAW,GACPksE,EAGC,UACR5wE,KAAK4sB,WAAWhX,QAMR,sBACL,cAAcujD,IAAS,IAC1Bn5D,KAAK0wE,YAAY3uE,MAAM0J,QAGlB,aAAab,GACf5K,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGdlO,KAAK4sB,WAAWhX,QAChB,MAAMgX,EAAa5sB,KAAK4sB,WAAW5c,MACnChQ,KAAK+K,WAAWM,iBAAmB,KACnCrL,KAAK+K,WAAW9K,UAAUuS,YAAc,GAExC,IAAgBirB,mBAAmB7yB,OAAOlG,EAAW,UAAU7D,KAAKs8B,IAClE,IAAIvQ,IACF,OAGF,MAAMgkD,EAAiB5wE,KAAK4wE,eAAiB5wE,KAAK6wE,aAElD,IAAIC,EAAa,KACf,MAAMx0C,EAAYC,GAAA,EAAWC,QAAU,GAAK,KAAO,EACvCW,EAAS14B,OAAO,EAAG63B,GAE3Bh2B,QAASW,IACX2pE,EAAevwE,IAAI4G,KAGjBk2B,EAASh7B,SACX2uE,OAAapsE,EACb1E,KAAK+K,WAAWM,iBAAmB,OAIvCylE,IACA9wE,KAAK+K,WAAWM,iBAAmB,KAC9BylE,EACDA,IAEA9wE,KAAK+K,WAAWM,iBAAmB,MAIvC,OAAAkB,EAAA,GAAevM,KAAK+K,WAAW9K,UAAW2wE,EAAehnE,QAItD,OAEL,OADA5J,KAAK2wE,eACE1tE,MAAM8N,QCxHF,MAAM,WAAuB,EAI1C,OAIE,GAHA/Q,KAAKC,UAAUkP,GAAK,2BACpBnP,KAAKmR,SAAS,kBAEV,GAAkB4/D,YAAY,GAAe9D,UAAW,CAC1D,MAAM+D,EAAW,GAAkBnnE,iBACnC,GAAkBonE,mBAAmBD,EAAU,GAAe/D,UAAUhtE,UAAU8J,OAAOinE,GACzF,GAAkBhnE,qBAAqBgnE,EAAU,MAAM,GAIzD,MAAMjmE,EAAa,GAAkBmmE,YAAY,GAAejE,UAChEjtE,KAAK+K,WAAW9K,UAAUypB,YAAY3e,EAAW9K,WACjDD,KAAK+K,WAAaA,EAGpB,SACK/K,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGdlO,KAAKmxE,YAAc,GAAkBlE,SACrC,GAAkBmE,YAAY,GAAenE,UAC7C,GAAkBoE,cAIpB,qBACE,GAAkBN,YAAY/wE,KAAKmxE,aAAahnE,QAGlD,UACE,GAAkBinE,YAAYpxE,KAAKmxE,aACnC,GAAkBE,cAGpB,sBAEE,OADA,GAAkBN,YAAY,GAAe9D,UAAU9iE,QAChDlH,MAAM0L,uBA1CA,GAAAs+D,SAAW,E,qBCikBrB,MAAM,GAMX,YAAYjqE,GASV,GAHAhD,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,wBAE1B2C,EAAQsuE,sBACTtxE,KAAKC,UAAU8J,OAAO2hC,MACtB1rC,KAAKC,UAAUG,UAAUC,IAAI,4BACxB,GAAI2C,EAAQm2B,YAIjBn5B,KAAKC,UAAUG,UAAUC,IAAI,oBAJC,CAC9B,MAAM6wC,EAAKhxC,SAASC,cAAc,MAClCH,KAAKC,UAAU8J,OAAOmnC,GAKxBlxC,KAAK6N,QAAU7N,KAAKohC,yBAEjBp+B,EAAQsG,OACTtJ,KAAK4N,MAAQ1N,SAASC,cAAc,OACpCH,KAAK4N,MAAMxN,UAAUC,IAAI,kBAAmB,6BAC5C,gBAAM,CAAC2U,QAAShV,KAAK4N,MAAOW,IAAKvL,EAAQsG,OACzCtJ,KAAK6N,QAAQ9D,OAAO/J,KAAK4N,QAGxB5K,EAAQk2B,UACTl5B,KAAKk5B,QAAUl5B,KAAKohC,yBACpBphC,KAAKk5B,QAAQ94B,UAAUC,IAAI,iCAEJ,IAApB2C,EAAQk2B,SACT,gBAAM,CAAClkB,QAAShV,KAAKk5B,QAAS3qB,IAAKvL,EAAQk2B,WAK1C,yBACL,MAAMrrB,EAAU3N,SAASC,cAAc,OAGvC,OAFA0N,EAAQzN,UAAUC,IAAI,gCACtBL,KAAKC,UAAU8J,OAAO8D,GACfA,GAIJ,MAAMiqD,GAAkB,CAAC97B,EAAsB1yB,EAAoB4vB,KACxE,MAAMd,EAAU,IAAI,GAAe,CAAC9uB,OAAM4vB,YAE1C,OADA8C,EAASjyB,OAAOquB,EAAQn4B,WACjBm4B,EAAQvqB,SAGJ69B,GAAoB,KAC/B,MAAMhQ,EAAYx7B,SAASC,cAAc,OAEzC,OADAu7B,EAAUt7B,UAAUC,IAAI,sBACjBq7B,GAGH61C,GAAiB,IA9lBhB,cAA6B,EAelC,cACEtuE,MAAM,CACJ2M,UAAW1P,SAASuvC,eAAe,eACnCxgC,eAAgB,SANZ,KAAA5E,aAAuG,GAW7GrK,KAAK0wE,YAAc,IAAI,EAAY,UACnC,MAAMc,EAAgBxxE,KAAK4P,UAAUC,cAAc,8BACnD2hE,EAAcznE,OAAO/J,KAAK0wE,YAAYzwE,WAEtC,MAYMwxE,EAAkB,KACtB,IAAI,GAAezxE,MAAM+Q,QAI3B/Q,KAAK0xE,QAAU1xE,KAAK4P,UAAUC,cAAc,wBAE5C,MAAM8hE,EAA+D,CACnEtkE,KAAM,UACN6P,KAAM,gBACNC,QAAS,KACP,IAAI,GAAend,MAAM+Q,QAE3BgE,OAAQ,MACS,IAAmBo1D,eAAeC,iBAAiB,GAAG,GACrDjoE,SAAW,IAAmBgoE,eAAeyH,gBAAgB,IAI3EC,EAAqB,IAAI,KAAc,CAC3CvlE,QAAQ,EACRqR,QAAuC,UAA9B/U,EAAA,QAAUq6D,WAAW35D,OAEhCuoE,EAAmB9vE,MAAMf,iBAAiB,SAAU,KAClD4H,EAAA,QAAUo2B,SAAS4jC,MAAQiP,EAAmB9vE,MAAM4b,QAAU,QAAU,MACxE+W,EAAA,QAAgBmuC,YAAY,WAAYj6D,EAAA,QAAUo2B,UAClD,GAAa8jC,sBAGfl6D,EAAA,QAAU5H,iBAAiB,eAAgB,KACzC6wE,EAAmBnuE,iBAA+C,UAA9BkF,EAAA,QAAUq6D,WAAW35D,QAG3D,MAAMwoE,EAAoE,CAAC,CACzEzkE,KAAM,QACN6P,KAAM,gBACNC,QAAS,KACP3R,WAAW,KACT,GAAaygC,QAAQ,GAAax0B,OACjC,KAEJk6D,EAAY,CACbtkE,KAAM,OACN6P,KAAM,WACNC,QAASs0D,GACR,CACDpkE,KAAM,WACN6P,KAAM,WACNC,QAAS,KACP,IAAI,GAAend,MAAM+Q,SAE1B,CACD1D,KAAM,WACN6P,KAAM,WACNC,QAAS,OAGTC,cAAey0D,GACd,CACDxkE,KAAM,aACN6P,KAAM,aACNC,QAAS,OAGTC,cAAe,IAAI,KAAc,CAC/B9Q,QAAQ,EACRqR,SAAS,EACT8W,SAAU,gCAEX,CACDpnB,KAAM,OACN6P,KAAM,mBACNC,QAAS,KACP,GAAa40D,aAAa,kBAE3B,CACD1kE,KAAM,MACN6P,KAAM,YACNC,QAAS,KACP,MAAM7U,EAAIpI,SAASC,cAAc,KACjCmI,EAAEuM,OAAS,SACXvM,EAAE+pD,KAAO,kDACTnyD,SAASiW,KAAKpM,OAAOzB,GACrBA,EAAEszB,QACFpwB,WAAW,KACTlD,EAAE3G,UACD,KAEJ,CACD0L,KAAM,SACN6P,KAAM,2BACNC,QAAS,KACPta,QAAQC,IAAI,CACVkvE,GAAA,EAAer9D,IAAI,CAACs9D,WAAY,MAChCD,GAAA,EAAe3jE,OAAO,eACrBxN,KAAK,KACN66C,SAAS2W,KAAO,iCAGpBt9C,OAAQ,IAAM,KAAIm9D,cACjB,CACD7kE,KAAM,SACN6P,KAAM,kCACNC,QAAS,KACP60D,GAAA,EAAe3jE,OAAO,aAAaxN,KAAK,KACtC66C,SAAS2W,KAAO,wCAGpBt9C,OAAQ,IAAM,KAAIm9D,eAGpBlyE,KAAKmyE,SAAW,GAAiB,GAAI,eAAgBL,EAAc7vE,IACjE6vE,EAAYxrE,QAAQuU,IACfA,EAAO9F,QACR8F,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAASuO,EAAO9F,cAItD/U,KAAKmyE,SAAS/xE,UAAUuB,OAAO,cAC/B3B,KAAKmyE,SAAS/xE,UAAUC,IAAI,uBAAwB,cAEpDL,KAAK0xE,QAAQ5gE,cAAc6P,aAAa3gB,KAAKmyE,SAAUnyE,KAAK0xE,SAE5D,MAAM1zD,EAAUhe,KAAKmyE,SAAStiE,cAAc,aAEtCuiE,EAAgBlyE,SAASC,cAAc,KAC7CiyE,EAAc/f,KAAO,iEACrB+f,EAAcv9D,OAAS,SACvBu9D,EAAcC,IAAM,sBACpBD,EAAchyE,UAAUC,IAAI,mBAC5B+xE,EAAcpxE,iBAAiB,IAAmBiB,IAChDA,EAAEqwE,kBACF,iBAEF,MAAM5hE,EAAIxQ,SAASC,cAAc,QACjCuQ,EAAEtQ,UAAUC,IAAI,wBAChBqQ,EAAEzM,UAAY,eAAiB,KAAIsuE,OAAS,UAAY,KAAIC,YAC5DJ,EAAcroE,OAAO2G,GACrBsN,EAAQ5d,UAAUC,IAAI,cACtB2d,EAAQjU,OAAOqoE,GAEfpyE,KAAKyyE,WAAa,GAAiB,GAAI,WAAY,CAAC,CAClDplE,KAAM,aACN6P,KAAM,aACNC,QAAS,KACP,IAAI,GAAiBnd,MAAM+Q,SAE5B,CACD1D,KAAM,WACN6P,KAAM,WACNC,QAlKsB,KACtB,IAAI,GAAiBnd,MAAM+Q,KAAK,CAC9B5N,KAAM,OACNijC,WAAW,EACXxG,QAAU9tB,IACR,IAAI,EAAe9R,MAAM+Q,KAAKe,IAEhClE,MAAO,kBACPhB,YAAa,oBA2Jd,CACDS,KAAM,aACN6P,KAAM,iBACNC,QAASs0D,KAEXzxE,KAAKyyE,WAAWjpE,UAAY,0EAC5BxJ,KAAKyyE,WAAWnxD,mBAAmB,aAAc,6GAIjDthB,KAAKyyE,WAAWtjE,GAAK,WACrBqiE,EAAct5C,mBAAmBnuB,OAAO/J,KAAKyyE,YAE7CzyE,KAAK0wE,YAAY3uE,MAAMf,iBAAiB,QAAS,IAAMhB,KAAK0yE,aAAc,CAAC/6D,MAAM,IAIjF3X,KAAK2yE,cAAgBzyE,SAASC,cAAc,QAC5CH,KAAK2yE,cAAcnpE,UAAY,2CAE/BmoE,EAAW38D,QAAQjL,OAAO/J,KAAK2yE,eAE/B/pE,EAAA,QAAU5H,iBAAiB,gBAAkB8rE,IAC3C,GAAiB,IAAdA,EAAO39D,GAAU,CAElB,MAAMxK,EAAQmoE,EAAO8F,mBACrB5yE,KAAK2yE,cAAczoD,UAAY,GAAK,YAAavlB,EAAO,GACxD3E,KAAK2yE,cAAcvyE,UAAUkM,OAAO,QAAS3H,MAIjD,IAAgBgvD,YAAY,kBAE5Bj/B,EAAA,QAAgBC,WAAW9zB,KAAK+zB,IAC9B,MAAM8+B,EAAe9+B,EAAM8+B,cAAgB,GAC3C,IAAI,IAAI1oD,EAAI,EAAG7I,EAASuxD,EAAavxD,OAAQ6I,EAAI7I,IAAU6I,EACzD0pB,EAAA,QAAgBm+C,YAAYnf,EAAa1oD,GAAI,kBAK3C,aACN,MAAM8nE,EAAkB9yE,KAAK4P,UAAUC,cAAc,qBAE/C9E,EAAa,IAAI,IAAW+nE,GAE5Bp5C,EAAQ,KAEV15B,KAAK0xE,QAAQ91C,SAIjB57B,KAAKqK,aAAe,CAClB8yB,SAAU,IAAI,EAAY,eAAgB,gBAAYz4B,OAAWA,OAAWA,OAAWA,EAAWg1B,GAClG25B,eAAgB,IAAI,EAAY,gBAAiB,gBAAY3uD,OAAWA,OAAWA,OAAWA,EAAWg1B,GACzGzuB,SAAU,IAAI,EAAY,kBAAmB,YAC7C4oD,OAAQ,IAAI,GAAY,EAAO,YAAY,EAAM,uBAAuB,GAAM,EAAOn6B,GACrF+5B,OAAQ,IAAI,EAAY,SAAU,YAAY,EAAM,uBAAuB,GAAM,EAAM/5B,IAGzF,MAAM8T,EAAcxtC,KAAKwtC,YAAc,IAAI,GAAe,CACxDU,UAAW,CAAC,CACV/mC,YAAa,2BACbmC,KAAM,cACNnG,KAAM,SACL,CACDgE,YAAa,gCACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,yBACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,8BACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,2BACbmC,KAAM,kBACNnG,KAAM,SACL,CACDgE,YAAa,gCACbmC,KAAM,kBACNnG,KAAM,UAER4H,aACAV,aAAcrK,KAAKqK,aACnB+kD,YAAY,EACZE,eAAe,EACfpnC,YAAY,IAGd4qD,EAAgBl0D,QAAQ4uB,EAAYC,IAAI38B,cAAcA,eACtD/F,EAAW9K,UAAU8J,OAAOyjC,EAAYvtC,WAGtCutC,EAAY4B,SAAS,CACnBnoC,OAAQ,GAAG6gB,WACX9f,SAAU,IAEZwlC,EAAYr/B,UAAU,GACtBq/B,EAAY1nC,MAAK,GAKnB,IAAIitE,EAAgC,GAChCC,EAAyB,GAAGlrD,WAC5BmrD,EAAkB,EAClBC,EAAkB,EACtB,MAAMC,EAAe,KAEnBnzE,KAAK0wE,YAAYzwE,UAAUG,UAAUkM,OAAO,kBAA6C,IAA1BymE,EAAe5wE,QAC9EnC,KAAK0wE,YAAYzwE,UAAUG,UAAUkM,OAAO,cAAeymE,EAAe5wE,QAEvE4wE,EAAe5wE,OAChBnC,KAAK0wE,YAAY3uE,MAAMY,MAAMolC,YAAY,gBAAkBgrC,EAAeA,EAAe5wE,OAAS,GAAG2Z,wBAAwB4tB,MAAQ1pC,KAAK0wE,YAAY3uE,MAAM+Z,wBAAwBiB,KAAQ,MAE5L/c,KAAK0wE,YAAY3uE,MAAMY,MAAMywE,eAAe,kBAI1CC,EAASnzE,SAASC,cAAc,OACtCkzE,EAAOjzE,UAAUC,IAAI,iBACrBgzE,EAAOryE,iBAAiB,QAAUiB,IAChC,MAAM4S,EAAS,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAAQ,iBACzC,IAAIA,EACF,OAGF,MAAMtG,EAAMsG,EAAOzI,QAAQmC,IAC3B,GAA4B,IAAzBA,EAAIgO,QAAQ,SAAgB,CAC7B,MAAOnV,EAAGmsD,EAASwC,GAAWxnD,EAAI8T,MAAM,KACxC4wD,GAAmB1f,EACnB2f,GAAmBnd,OAEnBid,EAAiBzkE,EAAIuZ,WAGvBjT,EAAO7T,iBAAiB,QAAS,KAC/BsyE,EAAez+D,KAGjB7U,KAAK0wE,YAAYzwE,UAAU8J,OAAO8K,GAClC7U,KAAK0wE,YAAYvlE,SAASnL,KAAK0wE,YAAYxuE,MAAQ,IACnD6wE,EAAeptE,KAAKkP,GACpBs+D,MAGF3lC,EAAYC,IAAI38B,cAAc/G,OAAOspE,GAErC,MAAME,EAAe,CAAChlE,EAAsBX,KAC1C,MAAMuf,EAAMjtB,SAASC,cAAc,OACnCgtB,EAAI/sB,UAAUC,IAAI,iBAElB,MAAM+2B,EAAWl3B,SAASC,cAAc,kBA2BxC,OA1BAi3B,EAASh3B,UAAUC,IAAI,uBAAwB,SAC/C+2B,EAASh0B,aAAa,SAAU,KAChCg0B,EAASh3B,UAAUC,IAAI,aAEvB8sB,EAAI/gB,QAAQmC,IAAM,GAAKA,EACpBA,EAAI4sB,iBACQz2B,IAAVkJ,IACDA,EAAQ,IAAI,KAAU,CAAC3G,OAAQsH,EAAIuZ,aAAa9S,SAGlDoiB,EAASh0B,aAAa,OAAQ,GAAKmL,IAEnC6oB,EAASh3B,UAAUC,IAAI,wBAGtBuN,IACoB,iBAAZ,EACPuf,EAAIlpB,UAAY2J,GAEhB,OAAArB,EAAA,GAAe4gB,EAAKvf,GACpBuf,EAAIpjB,OAAO6D,KAIfuf,EAAIyR,sBAAsB,aAAcxH,GAEjCjK,GAGHmmD,EAAkBz+D,IAEM,IADhBA,EAAOzI,QAAQmC,IACpBgO,QAAQ,SACb02D,EAAkBC,EAAkB,EAEpCF,EAAiB,GAAGlrD,WAGtBjT,EAAOlT,SACP,YAAiBoxE,EAAgBl+D,GAEjCrJ,WAAW,KACT2nE,IACAnzE,KAAK0wE,YAAYvlE,SAASnL,KAAK0wE,YAAYxuE,QAC1C,IAGLlC,KAAK0wE,YAAYxjE,QAAU,KACzB6lE,EAAezsE,QAAQyJ,IACrBujE,EAAevjE,MAInB/P,KAAK0wE,YAAYvlE,SAAYjJ,IAgB3B,GAfAsrC,EAAYrB,cACZqB,EAAY4B,SAAS,CACnBnoC,OAAQ+rE,EACRhrE,SAAUgrE,OAAiBtuE,EAAY,EACvCkG,MAAO1I,EACPqxD,QAAS0f,EACTld,QAASmd,IAEX1lC,EAAY1nC,MAAK,GAEjButE,EAAOpvE,UAAY,GACnBupC,EAAYC,IAAIrtC,UAAUuB,OAAO,SAI7BqxE,GAAkB9wE,EAAMoJ,OAAQ,CAClC,MAAMshB,EAAa4gB,EAAY5gB,WAAW5c,MAC1CnN,QAAQC,IAAI,CAEV,IAAmB65B,iBAAiBz6B,GAAOiE,QAAQtF,KAAK,EAAEu7B,aAAaA,EAAQ3zB,IAAIiX,GAAKA,EAAEzY,SAC1F,IAAgBw2B,mBAAmBv7B,GAAO,KACzCrB,KAAKi9B,IACN,IAAIlR,IAAc,OACF,IAAI/oB,IAAIi6B,EAAQ,GAAGl6B,OAAOk6B,EAAQ,KAE1Cx3B,QAAQW,IACdosE,EAAOtpE,OAAOwpE,EAAatsE,MAG7BumC,EAAYC,IAAIrtC,UAAUkM,OAAO,SAAU+mE,EAAOpvE,aAKtD,IAAIgvE,GAAmB/wE,EAAMoJ,OAAQ,CACnC,MAAMkoE,EAAoB,GAC1B,aAAatxE,EAAOsxE,GACpBA,EAAMltE,QAAQmtE,IACZJ,EAAOtpE,OAAOwpE,EAAa,QAAUE,EAASlgB,QAAU,IAAMkgB,EAAS1d,QAAS0d,EAAS7lE,UAG3F4/B,EAAYC,IAAIrtC,UAAUkM,OAAO,SAAU+mE,EAAOpvE,aAItDupC,EAAYp/B,KAAKukD,yBAAyB3xD,iBAAiB,YAAciB,IACvE,MAAM4S,EAAS,OAAAwsB,GAAA,GAAUp/B,EAAE4S,OAAQ,MACnC,IAAIA,EACF,OAGF,MAAMlJ,EAAc,OAAAmW,GAAA,GAAgBjN,EAAQ,gBAC5C,IAAIlJ,GAAeA,EAAYvL,UAAUuR,SAAS,wBAA0BhG,EAAYvL,UAAUuR,SAAS,uBACzG,OAGF,MAAM1K,EAAS4N,EAAO6+D,aAAa,gBAAgB5rD,WACnD4M,EAAA,QAAgBC,WAAW9zB,KAAK+zB,IAC9B,MAAM8+B,EAAe9+B,EAAM8+B,cAAgB,GAC3C,GAAGA,EAAa,KAAOzsD,EAAQ,CAC7B,YAAiBysD,EAAczsD,GAC/BysD,EAAa7tD,QAAQoB,GAClBysD,EAAavxD,OAAS,KACvBuxD,EAAavxD,OAAS,IAGxBuyB,EAAA,QAAgBmuC,YAAY,eAAgBnP,GAC5C,IAAI,MAAMzsD,KAAUysD,EAClBh/B,EAAA,QAAgBm+C,YAAY5rE,EAAQ,oBAIzC,CAAC6kB,SAAS,IAEb,IAAI6nD,EAAkBzzE,SAASC,cAAc,OAC7CwzE,EAAgBvzE,UAAUC,IAAI,2BAC9BszE,EAAgB5pE,OAAO/J,KAAKqK,aAAawpD,OAAOjqD,MAChD5J,KAAKqK,aAAawpD,OAAO5zD,UAAU8J,OAAO4pE,GACnB,IAAI,IAAYA,GAAvC,IAGIC,EADAljD,GAAQ,EAGZ,MAAMid,EAAa,YAAiBmlC,EAAgBhiE,cAAe,YAAa,IAAM3B,IACjFykE,GAAuB5mE,aAAa4mE,GAE7B,IAAPzkE,GAAauhB,IACd8c,EAAYr/B,UAAU,GAAG,GACzBnO,KAAK0wE,YAAYzjE,eACjB2mE,EAAwBroE,OAAOC,WAAW,KACxCooE,EAAwB,EACxB5zE,KAAKyyE,WAAWryE,UAAUuB,OAAO,cAChC,MAGL+uB,GAAQ,IAGVid,EAAW,GAEX,MACMkmC,EAAU,KACd7zE,KAAKmyE,SAAS/xE,UAAUuB,OAFF,cAGtB3B,KAAK0xE,QAAQtxE,UAAUC,IAHD,cAItBL,KAAKyyE,WAAWryE,UAAUC,IAAI,aAC9BL,KAAKmyE,SAASrhE,cAAc+O,kBAAkBzf,UAAUkM,OAAO,cAAc,GAEzE,qBAAqByC,EAAA,EAAwBC,eAAe,kBAC9DD,EAAA,EAAwBoB,SAAS,CAC/BC,MAAO,KACLspB,KAEFv2B,KAAM,kBAIVwqC,EAAW,IAGb3tC,KAAK0wE,YAAY3uE,MAAMf,iBAAiB,QAAS6yE,GACjDA,IAEA7zE,KAAK0xE,QAAQ1wE,iBAAiB,QAAUiB,IACtCjC,KAAKmyE,SAAS/xE,UAAUC,IAvBF,cAwBtBL,KAAK0xE,QAAQtxE,UAAUuB,OAxBD,cAyBtB3B,KAAKmyE,SAASrhE,cAAc+O,kBAAkBzf,UAAUkM,OAAO,cAAc,GAE7EyC,EAAA,EAAwB6B,aAAa,iBAErC+8B,EAAW,KAGb,MAAMmmC,EAAuB5zE,SAASC,cAAc,UACpD2zE,EAAqB1zE,UAAUC,IAAI,WAAY,eAC/CL,KAAKqK,aAAaopD,OAAO3pD,OAAOC,OAAO+pE,GACvCA,EAAqB9yE,iBAAiB,QAAS,KAC7ChB,KAAKqK,aAAaopD,OAAOtpD,QACzBuqB,EAAA,QAAgBmuC,YAAY,eAAgB,QAsElD,KAAe0O,eAAiBA,GACjB,UC/nBA,MAAM,GAOnB,YAAoBxkD,GAAA,KAAAA,OANZ,KAAAC,QAA8B,GAC9B,KAAA+mD,WAA4C,IAAIrkE,IAChD,KAAAi7D,OAAuB,GAEvB,KAAAqJ,aAAe,IAMvB,aAAavnB,GACX,MAAMj5C,EAAUxT,KAAK+zE,WAAW/jE,IAAIy8C,GACjCj5C,IACEA,EAAQ4Z,MAAMjrB,SACfqR,EAAQ4Z,MAAMyP,cAAcnd,GAAKA,EAAE+sC,SAAWA,GAC1Cj5C,EAAQ4Z,MAAMjrB,OAGhBnC,KAAKi0E,YAAYzgE,EAAQ4Z,OAFzB,YAAiBptB,KAAK2qE,OAAQn3D,EAAQ4Z,QAM1CptB,KAAK+zE,WAAW1lE,OAAOo+C,IAI3B,gBAAgBA,EAAqB5lD,GACnC,MAAM2M,EAAUxT,KAAK+zE,WAAW/jE,IAAIy8C,GACjCj5C,IACDA,EAAQ3M,IAAMA,GAIlB,UAAU4lD,EAAqBroD,EAAoBU,GAGjD,MAAMkwD,EAAY5wD,EAAQ0kB,KACpBjiB,EAAMzC,EAAQyC,IACpB,IACIumB,EADAxhB,EAASxH,EAAQ8vE,UAAY9vE,EAAQwH,OAItCA,IAAWhD,EAAA,QAAU6O,MAAQrT,EAAQ6C,SAAW2B,EAAA,QAAU6O,MAASrT,EAAgB+vE,YAAcvoE,IAClGA,EAASA,EAAOkc,UAAS,IAI3B9nB,KAAKo0E,aAAa3nB,GAElB,MAAM4nB,EAAe,CAAC5nB,SAAQ5lD,MAAKmuD,aACnC,GAAGh1D,KAAKgtB,QAAQ7qB,OAAQ,CACtB,IAAImyE,EACAC,GAAgB,EACpB,IAAI,IAAIvpE,EAAI,EAAGA,EAAIhL,KAAKgtB,QAAQ7qB,SAAU6I,EAAG,CAC3C,MAAMyhD,EAASzsD,KAAKgtB,QAAQhiB,GACtBwmB,EAAOnvB,KAAKovB,IAAIg7B,EAAOuI,UAAYA,GAGzC,GAFavI,EAAO7gD,SAAWA,GAAU4lB,GAAQxxB,KAAKg0E,cAKpD,GAFAO,EAAevpE,EAEO,cAAnBhL,KAAK+sB,KAAK5pB,KACX,WAGFoxE,GAAgB,EAGlB,GAAsB,cAAnBv0E,KAAK+sB,KAAK5pB,MACR0D,EAAM4lD,EAAO5lD,IACd,MAaN,IARqB,IAAlB0tE,IACDD,EAAct0E,KAAKgtB,QAAQunD,IAOzBD,EACC,CACHlnD,EAAQknD,EAAYlnD,MAEpB,IAAIpiB,EAAI,EAAGwpE,EAA0B,EACrC,KAAMxpE,EAAIoiB,EAAMjrB,SAAU6I,EAAG,CAC3B,MAAMypE,EAAarnD,EAAMpiB,GAAGgqD,UACtB0f,EAAOtnD,EAAMpiB,GAAGnE,IAEtB,GAAGmuD,EAAYyf,EACb,MAKF,GAJUzf,IAAcyf,IACtBD,EAA0BE,GAGzBF,GAA2B3tE,EAAM2tE,EAClC,MAIJpnD,EAAM3oB,OAAOuG,EAAG,EAAGqpE,QApBJr0E,KAAK2qE,OAAOhlE,KAAKynB,EAAQ,CAACinD,SAuB3Cr0E,KAAK2qE,OAAOhlE,KAAKynB,EAAQ,CAACinD,IAK5B,MAAMM,EAAc,CAAC3f,YAAWppD,SAAQ/E,IAAKzC,EAAQyC,IAAKumB,SAC1D,IAAIwnD,EAAc,EAClB,KAAMA,EAAc50E,KAAKgtB,QAAQ7qB,UAC5BnC,KAAKgtB,QAAQ4nD,GAAa/tE,IAAMA,KADM+tE,GAM3C50E,KAAKgtB,QAAQvoB,OAAOmwE,EAAa,EAAG,CAAC5f,YAAWppD,SAAQ/E,IAAKzC,EAAQyC,IAAKumB,UAC1EptB,KAAKi0E,YAAY7mD,GAEjBptB,KAAK+zE,WAAWp/D,IAAI83C,EAAQkoB,GAqD9B,YAAYvnD,GASR,IAAIA,EAAMjrB,OACR,OAGF,MAAMuuB,EAAQtD,EAAM,GAAGq/B,OAIvB,GAAoB,IAAjBr/B,EAAMjrB,OAGP,YAFAuuB,EAAMtwB,UAAUC,IAAI,iBAAkB,iBAItCqwB,EAAMtwB,UAAUuB,OAAO,iBACvB+uB,EAAMtwB,UAAUC,IAAI,kBAItB,MAAM8B,EAASirB,EAAMjrB,OAAS,EAC9B,IAAI,IAAI6I,EAAI,EAAGA,EAAI7I,IAAU6I,EAAG,CACfoiB,EAAMpiB,GAAGyhD,OACjBrsD,UAAUuB,OAAO,gBAAiB,kBAI3C,MAAM6mD,EAAOp7B,EAAMA,EAAMjrB,OAAS,GAAGsqD,OACrCjE,EAAKpoD,UAAUuB,OAAO,kBACtB6mD,EAAKpoD,UAAUC,IAAI,iBAKvB,uBAAuBwG,GACrB,MAAM2M,EAAUxT,KAAKgtB,QAAQvc,KAAKsuD,GAAKA,EAAEl4D,MAAQA,GAC9C2M,GACDxT,KAAKi0E,YAAYzgE,EAAQ4Z,OAI7B,UACEptB,KAAKgtB,QAAU,GACfhtB,KAAK2qE,OAAS,GACd3qE,KAAK+zE,WAAW5pE,SCrOL,MAAM,WAAwB,KAqB3C,YAAY0qE,EAAuBC,EAA+C9xE,EAO9D,IA4ClB,GA3CAC,MAAM,oBAAqBD,EAAQ+xE,UAAY,GAAK,CAAC,CACnDhgD,QAAS,aACTiD,SAAU,KACLh4B,KAAK80E,QACN90E,KAAK80E,OAAO90E,KAAKg1E,aAAa5f,UAAY,IAAO,KAGpD,CACDrgC,QAAS,SACT4lC,UAAU,IACR,OAAF,QAAGxkD,MAAM,EAAMghB,iBAAiB,GAASn0B,IAlBV,KAAA8xE,SAA+C,KAAA9xE,UAsKlF,KAAAiyE,YAAehzE,IACbjC,KAAKk1E,cAAcC,SAASn1E,KAAKk1E,cAAcE,WAAa,GAC5Dp1E,KAAKm1E,WAEFn1E,KAAKk1E,cAAc9f,YAAcp1D,KAAKq1E,SAASjgB,WAChDp1D,KAAKs1E,QAAQlyE,aAAa,WAAY,QAGxCpD,KAAK0R,QAAQ0yB,gBAAgB,aAG/B,KAAAmxC,YAAetzE,IACbjC,KAAKk1E,cAAcC,SAASn1E,KAAKk1E,cAAcE,WAAa,GAC5Dp1E,KAAKm1E,WAEFn1E,KAAKk1E,cAAc9f,YAAcp1D,KAAKw1E,SAASpgB,WAChDp1D,KAAK0R,QAAQtO,aAAa,WAAY,QAGxCpD,KAAKs1E,QAAQlxC,gBAAgB,aAG/B,KAAAqxC,YAAexzE,IAEb,MAAM4S,EAAS5S,EAAE4S,OAEjB,IAAIA,EAAOzI,QAAQ4oD,UAAW,OAE9B,GAAGh1D,KAAK01E,WAAY,CAClB,GAAG11E,KAAK01E,aAAe7gE,EAAQ,OAC/B7U,KAAK01E,WAAWt1E,UAAUuB,OAAO,UAGnC3B,KAAK01E,WAAa7gE,EAElBA,EAAOzU,UAAUC,IAAI,UACrB,MAAM20D,GAAangD,EAAOzI,QAAQ4oD,UAElCh1D,KAAKg1E,aAAe,IAAI3/B,KAAK2f,GAE7Bh1D,KAAKmR,WACLnR,KAAK21E,gBA3LL31E,KAAKuzD,QAAUvwD,EAAQuwD,SAAW,IAAIle,KAAK,uBAExCw/B,EAAW70E,KAAKuzD,SACjBshB,EAASe,YAAY51E,KAAKuzD,QAAQgC,cAAev1D,KAAKuzD,QAAQ6hB,WAAYp1E,KAAKuzD,QAAQsiB,WAIzF71E,KAAK81E,YAAc51E,SAASC,cAAc,OAC1CH,KAAK81E,YAAY11E,UAAUC,IAAI,wBAE/BL,KAAKs1E,QAAUp1E,SAASC,cAAc,UACtCH,KAAKs1E,QAAQl1E,UAAUC,IAAI,WAAY,aAAc,oBACrD,YAAiBL,KAAKs1E,QAASt1E,KAAKi1E,YAAa,CAAClnE,eAAgB/N,KAAK+N,iBAEvE/N,KAAK0R,QAAUxR,SAASC,cAAc,UACtCH,KAAK0R,QAAQtR,UAAUC,IAAI,WAAY,aAAc,oBACrD,YAAiBL,KAAK0R,QAAS1R,KAAKu1E,YAAa,CAACxnE,eAAgB/N,KAAK+N,iBAEvE/N,KAAK+1E,WAAa71E,SAASC,cAAc,OACzCH,KAAK+1E,WAAW31E,UAAUC,IAAI,2BAE9BL,KAAK81E,YAAY/rE,OAAO/J,KAAKs1E,QAASt1E,KAAK+1E,WAAY/1E,KAAK0R,SAG5D1R,KAAKg2E,gBAAkB91E,SAASC,cAAc,OAC9CH,KAAKg2E,gBAAgB51E,UAAUC,IAAI,sBACnC,YAAiBL,KAAKg2E,gBAAiBh2E,KAAKy1E,YAAa,CAAC1nE,eAAgB/N,KAAK+N,iBAE/E/N,KAAKmW,KAAKpM,OAAO/J,KAAK81E,YAAa91E,KAAKg2E,iBAGrChzE,EAAQglB,SAAU,CACnBhoB,KAAK0kB,QAAUxkB,SAASC,cAAc,OACtCH,KAAK0kB,QAAQtkB,UAAUC,IAAI,oBAE3B,MAAMq7B,EAAYx7B,SAASC,cAAc,OACzCu7B,EAAUt7B,UAAUC,IAAI,8BACxBq7B,EAAU3xB,OAAO,KAEjB,MAAMksE,EAAkB,CAACn0E,EAAaD,EAAwBkL,EAAmCmpE,KAC/F,MAAMC,EAAY,GAAKr0E,EACvB9B,KAAK+N,eAAe1N,IAAIwB,EAAWE,MAAnC/B,CAA0C,QAAUiC,IAClD,IAAIC,EAAQL,EAAWK,MAAMsB,QAAQ,MAAO,IACzCtB,EAAMC,OAAS,EAChBD,EAAQA,EAAMuB,MAAM,EAAG,IAEF,IAAjBvB,EAAMC,SAAiBD,EAAM,IAAMi0E,EAAU,IAAyB,IAAjBj0E,EAAMC,SAAiBD,EAAQJ,KAClE,IAAjBI,EAAMC,QAAgB+zE,GACvBA,GAAYh0E,EAAM,IAGpBA,EAAQ,IAAMA,EAAM,IAIxBL,EAAW6B,iBAAiBxB,GAC5B6K,EAAQ7K,EAAMC,WAIlBnC,KAAKo2E,gBAAkB,IAAI,IAAW,CAAClzE,WAAW,IAClDlD,KAAKq2E,kBAAoB,IAAI,IAAW,CAACnzE,WAAW,IAEpD+yE,EAAgB,GAAIj2E,KAAKo2E,gBAAkBj0E,IAC3B,IAAXA,GACDnC,KAAKq2E,kBAAkBt0E,MAAM0J,QAG/BzL,KAAK21E,gBACHW,IACFt2E,KAAKq2E,kBAAkBn0E,OAASo0E,EAASt2E,KAAKq2E,kBAAkBn0E,OAAOuB,MAAM,EAAG,KAElFwyE,EAAgB,GAAIj2E,KAAKq2E,kBAAoBl0E,IACvCA,GACFnC,KAAKo2E,gBAAgBr0E,MAAM0J,QAG7BzL,KAAK21E,iBAGP31E,KAAKg1E,aAAeH,EAEpBA,EAAS0B,WAAW1B,EAAS2B,aAAe,IAE5Cx2E,KAAKo2E,gBAAgB1yE,kBAAkB,IAAMmxE,EAAS4B,YAAYhzE,OAAO,IACzEzD,KAAKq2E,kBAAkB3yE,kBAAkB,IAAMmxE,EAAS2B,cAAc/yE,OAAO,IAE7EoxE,EAAS5f,SAAS,EAAG,EAAG,EAAG,GAE3Bj1D,KAAK0kB,QAAQ3a,OAAO/J,KAAKo2E,gBAAgBn2E,UAAWy7B,EAAW17B,KAAKq2E,kBAAkBp2E,WAEtF,YAAiBD,KAAKowE,WAAY,KAC7BpwE,KAAK80E,SACN90E,KAAKg1E,aAAa/f,UAAUj1D,KAAKo2E,gBAAgBl0E,OAAS,GAAIlC,KAAKq2E,kBAAkBn0E,OAAS,EAAG,EAAG,GACpGlC,KAAK80E,OAAO90E,KAAKg1E,aAAa5f,UAAY,IAAO,IAGnDp1D,KAAKu/B,QACJ,CAACxxB,eAAgB/N,KAAK+N,iBAEzB/N,KAAKmW,KAAKpM,OAAO/J,KAAK0kB,SAEtB1kB,KAAKs1E,QAAQl1E,UAAUC,IAAI,WAC3BL,KAAK0R,QAAQtR,UAAUC,IAAI,WAG7B,MAAMq2E,EAAgBx2E,SAASC,cAAc,OAC7Cu2E,EAAct2E,UAAUC,IAAI,kBAC5Bq2E,EAAc3sE,OAAO/J,KAAKC,WAC1BD,KAAKgV,QAAQjL,OAAO2sE,GAIpB7B,EAAS5f,SAAS,EAAG,EAAG,EAAG,GAC3Bj1D,KAAKg1E,aAAeH,EAEpB70E,KAAK+1D,QAAU/yD,EAAQ+yD,SAAW,IAAI1gB,KACtCr1C,KAAK+1D,QAAQd,SAAS,EAAG,EAAG,EAAG,GAE/Bj1D,KAAKk1E,cAAgB,IAAI7/B,KAAKr1C,KAAKg1E,cACnCh1E,KAAKk1E,cAAchgB,QAAQ,GAE3Bl1D,KAAKw1E,SAAW,IAAIngC,KAAKr1C,KAAK+1D,SAC9B/1D,KAAKw1E,SAAStgB,QAAQ,GAEtBl1D,KAAKq1E,SAAW,IAAIhgC,KAAKr1C,KAAKuzD,SAC9BvzD,KAAKq1E,SAASpgB,SAAS,EAAG,EAAG,EAAG,GAChCj1D,KAAKq1E,SAASngB,QAAQ,GAEnBl1D,KAAKk1E,cAAc9f,YAAcp1D,KAAKq1E,SAASjgB,WAChDp1D,KAAKs1E,QAAQlyE,aAAa,WAAY,QAGrCpD,KAAKk1E,cAAc9f,YAAcp1D,KAAKw1E,SAASpgB,WAChDp1D,KAAK0R,QAAQtO,aAAa,WAAY,QAGrCJ,EAAQq0B,UACTr3B,KAAKmR,SAAW,QAGlBnR,KAAK21E,eACL31E,KAAKmR,WACLnR,KAAKm1E,WA+CA,eACL,GAAGn1E,KAAKowE,YAAcpwE,KAAKg1E,aAAc,CACvC,IAAIzmE,EAAkBN,EAAc,GACpC,MAAM6a,EAAO,IAAIusB,KACjBvsB,EAAKmsC,SAAS,EAAG,EAAG,EAAG,GAEvB,MAAM0hB,EAA0C,CAC9C7O,OAAQ,UACRD,KAAM,WAGF+O,EAAW,IAAIvhC,KAAKr1C,KAAKg1E,aAAa5f,WAG5C,GAFAwhB,EAAS3hB,UAAUj1D,KAAKo2E,gBAAgBl0E,OAAQlC,KAAKq2E,kBAAkBn0E,OAEpElC,KAAKg1E,aAAa5f,YAActsC,EAAKssC,UACtC7mD,EAAM,yBAGE,CACRA,EAAM,oBAEN,MAAMsoE,EAA0C,CAC9CvhB,MAAO,QACPwhB,IAAK,WAGJF,EAASrhB,gBAAkBzsC,EAAKysC,gBACjCshB,EAAYrhB,KAAO,WAGrBvnD,EAAKtI,KAAK,IAAI,UAAK+vD,gBAAgB,CACjC5sC,KAAM8tD,EACN5zE,QAAS6zE,IACR7hE,SAGL/G,EAAKtI,KAAK,IAAI,UAAK+vD,gBAAgB,CACjC5sC,KAAM8tD,EACN5zE,QAAS2zE,IACR3hE,SAEHhV,KAAKowE,WAAW9d,WAAW5oC,YAAY,eAAKnb,EAAKN,KAI9C,WAGLjO,KAAK4N,MAAM4E,YAAc,GACzBxS,KAAK4N,MAAM7D,OAAO,IAAI,UAAK2rD,gBAAgB,CACzC5sC,KAAM9oB,KAAKg1E,aACXhyE,QAAS,CACP8zE,IAAK,UACLxhB,MAAO,OACPyhB,QAAS,WAEV/hE,SAGG,cAAcpD,EAAmBsY,EAAkC,IACzE,MAAMna,EAAK7P,SAASC,cAAc,UAWlC,OAVA4P,EAAG3P,UAAUC,IAAI,WAAY,0BAE1BuR,GACD7B,EAAG3M,aAAa,WAAY,QAG3B8mB,GACDna,EAAGhG,OAAOmgB,GAGLna,EAGF,WACL,MAAMinE,EAAY,IAAI3hC,KAAKr1C,KAAKk1E,eAE1BlyE,EAAsC,CAC1CwyD,KAAM,UACNF,MAAOt1D,KAAK0kB,SAAWR,EAAA,EAAWC,SAAW,QAAU,QAGzDnkB,KAAK+1E,WAAWvjE,YAAc,GAC9BxS,KAAK+1E,WAAWhsE,OAAO,IAAI,UAAK2rD,gBAAgB,CAAC5sC,KAAMkuD,EAAWh0E,YAAUgS,SAGzEhV,KAAKs1D,OACNt1D,KAAKs1D,MAAM3zD,SAGb3B,KAAKs1D,MAAQp1D,SAASC,cAAc,OACpCH,KAAKs1D,MAAMl1D,UAAUC,IAAI,qBAEzB,MAAM42E,EAAgB,IAAI5hC,KACpByhC,EAAMG,EAAcC,SACf,IAARJ,GACDG,EAAchiB,UAAU,IAAM6hB,EAAM,IAGtC,IAAI,IAAI9rE,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAM+E,EAAK/P,KAAKm3E,eAAc,EAAM,IAAI,UAAKzhB,gBAAgB,CAAC5sC,KAAMmuD,EAAej0E,QAAS,CAAC+zE,QAAS,YAAY/hE,SAClHjF,EAAG3P,UAAUuB,OAAO,0BACpBoO,EAAG3P,UAAUC,IAAI,yBACjBL,KAAKs1D,MAAMvrD,OAAOgG,GAClBknE,EAAc/hB,QAAQ+hB,EAAcpB,UAAY,GAIlD,IAAIuB,EAAWJ,EAAUE,SAAW,GACnB,IAAdE,IAAiBA,EAAW,GAE/B,MAAMC,EAAa,IAAIhiC,KAAK2hC,EAAU5hB,WACtCiiB,EAAWniB,QAAQmiB,EAAWxB,UAAYuB,EAAW,GAGrD,IAAI,IAAIpsE,EAAI,EAAGA,EAAIosE,IAAYpsE,EAC1BhL,KAAKgD,QAAQs0E,oBACdD,EAAWniB,QAAQmiB,EAAWxB,UAAY,GAC1C71E,KAAKs1D,MAAMvrD,OAAO/J,KAAKm3E,eAAc,EAAM,GAAKE,EAAWxB,aAE3D71E,KAAKs1D,MAAMvrD,OAAO/J,KAAKm3E,eAAc,IAIzC,EAAG,CACD,MAAMruD,EAAOkuD,EAAUnB,UACjB9lE,EAAK/P,KAAKm3E,cAAcH,EAAYh3E,KAAK+1D,SAAWihB,EAAYh3E,KAAKuzD,QAAS,GAAKzqC,GACzF/Y,EAAG3D,QAAQ4oD,UAAY,GAAKgiB,EAAU5hB,UAEnC4hB,EAAU5hB,YAAcp1D,KAAKg1E,aAAa5f,YAC3Cp1D,KAAK01E,WAAa3lE,EAClBA,EAAG3P,UAAUC,IAAI,WAGnBL,KAAKs1D,MAAMvrD,OAAOgG,GAElBinE,EAAU9hB,QAAQpsC,EAAO,SACK,IAAxBkuD,EAAUnB,WAElB,MAAMvjC,EAAYtyC,KAAKs1D,MAAMrrD,kBAAoB,EACjD,GAAGjK,KAAKgD,QAAQs0E,oBAAsBhlC,EACpC,IAAI,IAAItnC,EAAIsnC,EAAWtnC,EAAI,IAAKA,EAC9BhL,KAAKs1D,MAAMvrD,OAAO/J,KAAKm3E,eAAc,EAAM,GAAKH,EAAUnB,YAC1DmB,EAAU9hB,QAAQ8hB,EAAUnB,UAAY,GAI5C,MAAM0B,EAAQl1E,KAAK6jB,KAAKlmB,KAAKs1D,MAAMrrD,kBAAoB,GACvDjK,KAAKC,UAAUmM,QAAQmrE,MAAQ,GAAKA,EAEpCv3E,KAAKg2E,gBAAgBjsE,OAAO/J,KAAKs1D,QCnYtB,MAAMkiB,GAInB,YAAoBv3E,EAAgCw3E,GAAhC,KAAAx3E,YAAgC,KAAAw3E,UAClDz3E,KAAK03E,iBACL13E,KAAK23E,kBAQC,iBACN33E,KAAK43E,gBAAkB,IAAIxtC,qBAAsBC,IAC/C,IAAI,MAAMC,KAASD,EAAS,CAC1B,MAAMwtC,EAAavtC,EAAMwtC,mBACnBC,EAAeztC,EAAMz1B,OAAO/D,cAC5BknE,EAAiB1tC,EAAM2tC,WAG1BJ,EAAW/6D,OAASk7D,EAAe7jD,KACpCn0B,KAAKy3E,SAAQ,EAAMM,GAIlBF,EAAW/6D,QAAUk7D,EAAe7jD,KACnC0jD,EAAW/6D,OAASk7D,EAAel7D,QACrC9c,KAAKy3E,SAAQ,EAAOM,KAGvB,CAACG,UAAW,EAAGC,KAAMn4E,KAAKC,YAGvB,kBACND,KAAKo4E,iBAAmB,IAAIhuC,qBAAsBC,IAChD,IAAIC,EAAQD,EAAQziC,OAAO0iC,GAASA,EAAMwtC,mBAAmB3jD,IAAM,GAAG9rB,KAAK,CAACC,EAAGC,IAAMD,EAAEwvE,mBAAmB3jD,IAAM5rB,EAAEuvE,mBAAmB3jD,KAAK,GAC1I,IAAImW,EAAO,OACX,IAAIrqC,EAAYqqC,EAAMC,eAAiBD,EAAMz1B,OAASy1B,EAAMz1B,OAAOqjB,mBACnEl4B,KAAKy3E,SAAQ,EAAMx3E,IAClB,CAACk4E,KAAMn4E,KAAKC,YAOT,YAAYA,EAAwBuJ,GAC1C,MAAM6uE,EAAWn4E,SAASC,cAAc,OAExC,OADAk4E,EAASj4E,UAAUC,IAAI,kBAAmBmJ,GACnCvJ,EAAU2gB,YAAYy3D,GAQxB,2BAA2BrjE,GAChC,MAAMsjE,EAAiBt4E,KAAKu4E,YAAYvjE,EAAS,wBACjDhV,KAAK43E,gBAAgB9uC,QAAQwvC,GAE7Bt4E,KAAKo4E,iBAAiBtvC,QAAQ9zB,GAGzB,aACLhV,KAAK43E,gBAAgBY,aACrBx4E,KAAKo4E,iBAAiBI,aAGjB,UAAUxjE,EAAsBsjE,GACrCt4E,KAAKo4E,iBAAiBltC,UAAUl2B,GAChChV,KAAK43E,gBAAgB1sC,UAAUotC,IC3DnC1vE,EAAA,QAAU5H,iBAAiB,kBAAoBiB,IAC7C,MAAMmC,EAAUnC,EACfkG,MAAMC,KAAKlI,SAAS4P,iBAA4B,kCAAmB1L,EAAQ6C,UAAU7C,EAAQyC,UAA+BP,QAAQ0O,IACnIA,EAAQ5Q,QAAUA,EAClB4Q,EAAQwrC,aAIG,MAAM,WAAuBz4B,YAQ1C,cACE9kB,QAHM,KAAAw1E,SAAU,EAMX,OACLz4E,KAAKwgD,SACLxgD,KAAKoM,QAAQssE,QAAU14E,KAAKoE,QAAQ6C,OAAS,IAAMjH,KAAKoE,QAAQyC,IAChE7G,KAAKI,UAAUC,IAAI,UAAW,WAAaL,KAAKmD,MAG3C,SACL,MAAMw1E,EAAU34E,KAAKoE,QAAQu0E,QAM7B,GAAiB,WAAd34E,KAAKmD,KAAmB,CACzB,IAAIy1E,EAsDA17D,EAWJ,GAhEGld,KAAK6f,oBACN+4D,EAAW54E,KAAK6f,oBAGf84D,aAAO,EAAPA,EAASE,kBACPD,IAAaA,EAASx4E,UAAUuR,SAAS,4BAC1C3R,KAAKiE,UAAY,GACjB20E,EAAW,MAGTA,IACFA,EAAW14E,SAASC,cAAc,OAClCy4E,EAASx4E,UAAUC,IAAI,2BAGzBs4E,EAAQE,gBAAgBp1E,QAAQqB,UAAUwB,QAAQ,CAACo7B,EAAMr9B,KACvD,IAAIuuB,EAAagmD,EAAS7yD,SAAS1hB,GAC/BuuB,IACFA,EAAa,IAAI,GACjBA,EAAWxvB,aAAa,SAAU,KAClCwvB,EAAWxyB,UAAUC,IAAI,aACzBuyB,EAAWjI,cAAgB3qB,KAAK2qB,cAE7B3qB,KAAKyqB,eACNmI,EAAWnI,aAAezqB,KAAKyqB,eAInCmI,EAAWxvB,aAAa,OAAQ,GAAK,IAAgBq+B,UAAUC,IAE3D9O,EAAWlS,YACbk4D,EAAS7uE,OAAO6oB,KAKnBzqB,MAAMC,KAAKwwE,EAAS7yD,UAA4BtiB,MAAMk1E,EAAQE,gBAAgB12E,QAAQmE,QAAQyJ,GAAMA,EAAGpO,YAErGi3E,IAAaA,EAASx4E,UAAUuR,SAAS,oBAC1CinE,EAASj3E,SACTi3E,EAAW,MAGTA,IACFA,EAAW14E,SAASC,cAAc,QAClCy4E,EAASx4E,UAAUC,IAAI,oBAIvBu4E,EAAS9nE,eACX9Q,KAAK+J,OAAO6uE,GAMV17D,EAFDy7D,EACEA,EAAQA,QACF,eAAK,WAAY,CAACA,EAAQA,UAE1B,eAAK,iBAGP,eAAK,cAGXA,EAAS,CACV,MAAMtpC,EAAiB,IAAmBypC,kBAAkBH,EAAQI,WAAWjxD,UAAS,IACxF,IAAIkxD,GAAW,EACZL,EAAQA,UAEPK,OADyBt0E,IAAxBi0E,EAAQM,kBAAgDv0E,IAAnBi0E,EAAQO,OACnCP,EAAQM,YAAcN,EAAQO,QAE7B7pC,EAAe8pC,WAAa9pC,EAAe8pC,WAAaR,EAAQO,QAAU,IAG1Fl5E,KAAKI,UAAUkM,OAAO,YAAa0sE,GAGrC,IAAII,EAAWp5E,KAAK+lB,SAAS,GAC7B,IAAIqzD,EAAU,CACZA,EAAWl5E,SAASC,cAAc,QAClCi5E,EAASh5E,UAAUC,IAAI,uBAEvB,MAAMg5E,EAAWn5E,SAASC,cAAc,QACxCk5E,EAASj5E,UAAUC,IAAI,cAEvB,MAAMi5E,EAAkBp5E,SAASC,cAAc,OAC/C,OAAAmd,GAAA,QAAOg8D,GAEPt5E,KAAK+J,OAAOqvE,EAAUC,EAAUC,GAGlC,OAAA/sE,EAAA,GAAe6sE,EAAUl8D,QAEzBld,KAAKI,UAAUC,IAAI,wBACnBL,KAAKiE,UAAY,iFAAgF00E,aAAO,EAAPA,EAASA,SAAU,YAAaA,EAAQA,QAAS,GAAK,aAGtJA,GAAY34E,KAAKy4E,SAAYz4E,KAAKoE,QAAQkT,OAAO+Q,cAClD,IAAmBkxD,uBAAuBv5E,KAAKoE,QAAQ6C,OAAQjH,KAAKoE,QAAQyC,KAC5E,IAAmB2yE,cAAcx5E,KAAKoE,QAAQ6C,OAAQjH,KAAKoE,QAAQyC,IAAK,mBACxE7G,KAAKy4E,SAAU,GAGdz4E,KAAKyqB,eACNzqB,KAAKyqB,kBAAe/lB,IAK1BsnB,eAAeC,OAlJE,kBAkJe,ICnJhC,MAEMwtD,GAAa,KACjB,MAAMC,EAASx5E,SAASC,cAAc,KAGtC,OAFAu5E,EAAOt5E,UAAUC,IAAI,UACrB,gBAAMq5E,EAAQ,iBACPA,GAGF,IAAU,GAAAC,OAAA,QAAa,KAKfC,QAAU,CAAC7sD,EAAY3oB,EAA0BqoD,EAAqBotB,EAA8BC,K,MAC/G,MAAMhxD,EAAO,IAAIusB,KAAoB,IAAfjxC,EAAQ0kB,MACxB7a,EAAiC,GACvC,IAsBI8rE,EAtBA3kC,EAAO,aAAWtsB,GAEtB,GAAG1kB,EAAQ41E,MAAO,CAChB,MAAMC,EAAa71E,EAAQ81E,cAA+B,QAAhB,EAAA91E,EAAQ+1E,gBAAQ,eAAED,aAE5DztB,EAAOrsD,UAAUC,IAAI,gBAErB,MAAM+5E,EAAgBl6E,SAASC,cAAc,QAC7Ci6E,EAAch6E,UAAUC,IAAI,cAC5B+5E,EAAcn2E,UAAY,YAAaG,EAAQ41E,MAAO,GAEtD,MAAMK,EAAen6E,SAASC,cAAc,KAI5C,GAHAk6E,EAAaj6E,UAAUC,IAAI,qBAAsB,aAEjD4N,EAAKtI,KAAKy0E,EAAeC,GACtBJ,EAAY,CACb,MAAMpqB,EAAO3vD,SAASC,cAAc,QACpC0vD,EAAK5rD,UAAY,IAAkBwoB,cAAcwtD,GAAhC,UACjBhsE,EAAKtI,KAAKkqD,IAWd,GANGzrD,EAAQk2E,WAA2B,cAAdvtD,EAAK5pB,OAAyBiB,EAAQkT,OAAOijE,YACnE9tB,EAAOrsD,UAAUC,IAAI,aAErB4N,EAAKpI,QAAQk0E,EAAaN,OAGX,WAAd1sD,EAAK5pB,MAAqBiB,EAAQkT,OAAOkjE,OAAQ,CAClD/tB,EAAOrsD,UAAUC,IAAI,aAErB,MAAM2K,EAAI9K,SAASC,cAAc,KACjC6K,EAAE5K,UAAUC,IAAI,mBAAoB,aACpC4N,EAAKpI,QAAQmF,GAGfiD,EAAKtI,KAAKyvC,GAEV,MAAMxnC,EAAQ,aAAYkb,IACrB1kB,EAAQk2E,UAAY,aAAa,aAAY,IAAIjlC,KAAyB,IAApBjxC,EAAQk2E,YAAuB,KACrFl2E,EAAQ+1E,SAAW,eAAe,aAAY,IAAI9kC,KAA6B,IAAxBjxC,EAAQ+1E,SAASrxD,OAAkB,IAEzF2xD,EAAWv6E,SAASC,cAAc,QACxCs6E,EAASr6E,UAAUC,IAAI,OAAQ,SAC/Bo6E,EAAS7sE,MAAQA,EACjB6sE,EAAS1wE,UAAUkE,GAEnB,MAAMysE,EAAQx6E,SAASC,cAAc,OACrCu6E,EAAMt6E,UAAUC,IAAI,QAAS,SAC7Bq6E,EAAM9sE,MAAQA,EAEd,IAAI+sE,EAAa1sE,EAYjB,OAXG8rE,IACDY,EAAWA,EAAWp+D,QAAQw9D,IAAeN,MAE/CkB,EAAaA,EAAWlyE,IAAIH,GAAKA,aAAayf,cAAgBzf,EAAElI,UAAUuR,SAAS,QAAUrJ,EAAE+kC,WAAU,GAAuB/kC,GAChIqyE,EAAWA,EAAWx4E,OAAS,GAAK,aAAW2mB,GAC/C4xD,EAAM3wE,UAAU4wE,GAEhBF,EAAS1wE,OAAO2wE,GAEhBZ,EAAW/vE,OAAO0wE,GAEXA,GAGI,GAAAG,cAAgB,EAAEnuB,SAAQotB,kBAAiBz1E,UAAS01E,aAAYrvD,eAAcE,oBAQzF,MAAMkwD,GAAYpuB,EAAOrsD,UAAUuR,SAAS,aAAe86C,EAAOrsD,UAAUuR,SAAS,eAAiB86C,EAAOrsD,UAAUuR,SAAS,SAC1HmpE,EAAgB,IAAI,GAO1B,OANAA,EAAc12E,QAAUA,EACxB02E,EAAc33E,KAAO03E,EAAW,SAAW,SAC3CC,EAAcrwD,aAAeA,EAC7BqwD,EAAcnwD,cAAgBA,EAC9BmwD,EAAc5sE,OACd2rE,EAAgBj7D,QAAQk8D,GACjBD,GAGI,GAAAE,SAAW,EAAEhuD,OAAM0/B,SAAQotB,kBAAiBz1E,cAMvD,MAAM42E,GAAenB,EAClBmB,IACDnB,EAAkBptB,EAAO58C,cAAc,oBAGzC,MAAMorE,EAAkBD,EAAcnB,EAAgBhqE,cAAc,UAAY,KAChF,IAAIzL,EAAQ82E,aAMV,OALGD,GACDA,EAAgBt5E,cAGlB8qD,EAAOrsD,UAAUuB,OAAO,YAK1B,MAAMw5E,EAAgB/2E,EAAQg3E,SAASC,iBAAmBtuD,EAAKuuD,gBAAgB75C,UAAUr9B,EAAQg3E,SAASC,kBAAoBtuD,EAAK9lB,OAEnI,IACIs0E,EADAC,EAAkBzuD,EAAK29B,mBAAmBlxC,iBAAiB2hE,EAAe/2E,EAAQ82E,cAM7D,iBAAtBM,EAAgBp0E,GAEjB2lB,EAAK29B,mBAAmB+wB,kBAAkBN,EAAe/2E,EAAQ82E,cACjEnuD,EAAKC,QAAQ0uD,WAAW/1E,KAAK,CAACw1E,gBAAeQ,SAAUv3E,EAAQ82E,aAAcr0E,IAAKzC,EAAQyC,MAE1F00E,EAAoB,eAAK,YAEzBA,EAAoB,IAAI,KAAU,CAChCt0E,OAAQu0E,EAAgB5vE,QAAU4vE,EAAgBrH,UAClDtoE,QAAQ,EACRioD,eAAe,EACf5wD,WAAW,IACV8R,QAGL,MAAMqV,EAAU25B,GAAUu3B,OAAmB72E,EAAW82E,GACrDP,EACDA,EAAgBvxD,YAAYW,GAE5BwvD,EAAgB9vE,OAAOsgB,GAGzBoiC,EAAOrsD,UAAUC,IAAI,a,cCpKlB,SAASu7E,GAAkB37E,EAAwB47E,EAAgCC,GAExF,MAAMjgE,EAAO5b,EAAU6b,wBACjBvB,EAAuB,WAAnBuhE,EAA8Bz5E,KAAK6jB,KAAKrK,EAAKkB,MAASlB,EAAK6tB,MAAQ7tB,EAAKkB,MAAQ,EAAK,GAAK1a,KAAK6jB,KAAKrK,EAAKkB,KAAO,GACpHtC,EAAqB,WAAjBohE,EAA4Bx5E,KAAK05E,MAAMlgE,EAAKsY,IAAMtY,EAAKlb,OAAS,GAAK0B,KAAK6jB,KAAKrK,EAAKsY,IAAM,GACpG,OAAOj0B,SAAS87E,iBAAiBzhE,EAAGE,GCPvB,SAASwhE,GAAwBjnE,GAC9CA,EAAQrS,MAAMC,QAAU,OACnBoS,EAAQ40B,WACb50B,EAAQrS,MAAMC,QAAU,GDO1B,KAAeg5E,kBAAoBA,G,0CEWnC,MAAMM,GAAiC,CACrCC,SAAU,GACVC,QAAS,EACTC,SAAU,KAAIC,cAKT,MAAM,GAAb,cAEU,KAAAC,iBAEJ,GAGI,KAAAC,iBAAkD,GAElD,KAAAC,oBAAoE,GAiErE,iBAAiBJ,EAAmB,KAAIC,cAC7C,MAAMn2E,EAAUnG,KAAKy8E,oBAAoBJ,GACzC,GAAGl2E,EACD,OAAOA,EAGT,MAAMu2E,EAAkB,iBAAmBL,EAC3C,OAAOr8E,KAAKy8E,oBAAoBJ,GAAYM,GAAA,EAAa3sE,IAAI0sE,GAAY77E,KAAMw5C,IACzE,aAASA,KACXA,EAAO,IAGT,YAAmB6hC,GAAiB7hC,GAGpCA,EAAKgiC,SAAWA,EAChBr8E,KAAKu8E,iBAAiBF,GAAYhiC,EAE3B,KAAW3jB,UAAU,sCAAuC,CACjEy4C,UAAW90B,EAAKgiC,SAChBO,aAAcviC,EAAK+hC,UAClBv7E,KAAMg8E,IACPxiC,EAAK+hC,QAAUS,EAAmBT,QAElC,MAAMU,EAAeziC,EAAK8hC,SACpBA,EAAWU,EAAmBV,SACpC,IAAI,IAAInxE,EAAI,EAAG7I,EAASg6E,EAASh6E,OAAQ6I,EAAI7I,IAAU6I,EAAG,CACxD,MAAM,QAAC+xE,EAAO,UAAEC,GAAab,EAASnxE,GACtC8xE,EAAaC,GAAWC,EAO1B,OAJAL,GAAA,EAAahoE,IAAI,CACf,CAAC+nE,GAAariC,IAGTA,GACN,IACMA,KAKN,uBACL,MAAMhc,EAA2B,CAC/Br+B,KAAKi9E,oBAWP,OARG,UAAKC,wBAA0B,KAAIZ,cACpCj+C,EAAS14B,KAAK3F,KAAKi9E,iBAAiB,UAAKC,wBAGvCl9E,KAAKyzD,QACPp1B,EAAS14B,KAAK3F,KAAKm9E,mBAGdt6E,QAAQC,IAAIu7B,GAGd,cACDr+B,KAAKsc,QACPtc,KAAKsc,MAAQ,IAAI,UAAY5X,EAAW,IAG1C,IAAI,MAAM23E,KAAYr8E,KAAKu8E,iBAAkB,CAC3C,GAAGv8E,KAAKw8E,iBAAiBH,GACvB,SAGF,MACMF,EADOn8E,KAAKu8E,iBAAiBF,GACbF,SAEtB,IAAI,MAAMY,KAAWZ,EAAU,CAC7B,MAAMa,EAAYb,EAASY,GAC3B/8E,KAAKsc,MAAM8gE,YAAYJ,EAAWD,GAGpC/8E,KAAKw8E,iBAAiBH,IAAY,GAI/B,aAAap+C,GAMlB,IAAIo/C,EACJ,GANAr9E,KAAKs9E,eAELr/C,EAAIA,EAAEqe,cAAc94C,QAAQ,KAAM,MAI7B8H,OAAQ,CACX,MAAMqJ,EAAM3U,KAAKsc,MAAMihE,OAAOt/C,GAC9Bo/C,EAASl1E,MAAMC,KAAKuM,GAAKovB,OAAO,CAACC,EAAK7D,IAAM6D,EAAIpgC,OAAOu8B,GAAI,SAE3Dk9C,EAASr9E,KAAKyzD,OAAO7vD,OAAO,GAAgB45E,eAAe/5E,MAAM,EAvK7C,IAmLtB,OATA45E,EAASl1E,MAAMC,KAAK,IAAIvE,IAAIw5E,IASrBA,EAGF,kBACL,OAAGr9E,KAAKy9E,uBAA+Bz9E,KAAKy9E,uBACrCz9E,KAAKy9E,uBAAyB/oD,EAAA,QAAgBC,WAAW9zB,KAAK+zB,GAC5D50B,KAAKyzD,OAAStrD,MAAM04C,QAAQjsB,EAAM8oD,aAAe9oD,EAAM8oD,YAAc,IAIzE,gBAAgBvjC,GACrBA,EAAQ,IAAkBwC,SAASxC,GACnCn6C,KAAKm9E,kBAAkBt8E,KAAK4yD,IAC1B,YAAiBA,EAAQtZ,GACzBsZ,EAAO5tD,QAAQs0C,GACZsZ,EAAOtxD,OAlMU,KAmMlBsxD,EAAOtxD,OAnMW,IAsMpBuyB,EAAA,QAAgBmuC,YAAY,cAAepP,GAC3C7qD,EAAA,QAAU6F,cAAc,eAAgB0rC,MApM7B,GAAAqjC,cAAgB,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAyMxO,MAAM,GAAkB,IAAI,GAC5B,OAAmB,KAAeG,gBAAkB,IACrC,U,mBCtNf,MAAMC,GAA0B,IAAI/5E,IAC7B,SAASg6E,GAAY1jC,EAAel6C,EAAwB2e,GAAU,EAAOk/D,GAAQ,GAK1F,MAAMC,EAAY79E,SAASC,cAAc,QAGzC,IAAI69E,EAiBJ,GAnBAD,EAAU39E,UAAUC,IAAI,eAGrBy9E,IAAU,KACXE,EAAM,IAAkBC,gBAAgB9jC,IAExCA,EAAQ,IAAkBwC,SAASxC,GACnC6jC,EAAM,IAAkBvxD,cAAc0tB,IAUxC4jC,EAAU95E,UAAY+5E,EAEnBD,EAAUh4D,SAAS5jB,OAAS,EAAG,CAChC,MAAMuuB,EAAQqtD,EAAUl+D,kBACxBk+D,EAAU95E,UAAY,GACtB85E,EAAUh0E,OAAO2mB,GAGnB,GAAGqtD,EAAUl+D,oBAAsB,KAAoB,CACrD,MAAM+hC,EAAQm8B,EAAUl+D,kBAElBnL,EAAMktC,EAAMntC,IAClB,IAAImpE,GAAWj2E,IAAI+M,GAAM,CACvBktC,EAAMx+C,aAAa,UAAW,QAC9B,MAAMwJ,EAAc1M,SAASC,cAAc,QAC3CyM,EAAYxM,UAAUC,IAAI,qBAEvBuI,EAAA,QAAUo2B,SAASC,oBACpB2iB,EAAMj/C,MAAM4pD,QAAU,IACtB3/C,EAAYjK,MAAM4pD,QAAU,KAG9B3K,EAAM5gD,iBAAiB,OAAQ,KAC7B,aAAQ,KACH4H,EAAA,QAAUo2B,SAASC,oBACpB2iB,EAAMj/C,MAAM4pD,QAAU,GACtB3/C,EAAYjK,MAAM4pD,QAAU,IAG9BwxB,EAAU39E,UAAUuB,OAAO,SAE3Bi8E,GAAWv9E,IAAIqU,MAEhB,CAACiD,MAAM,IAEVomE,EAAUh0E,OAAO6C,IAMlBgS,EAAS3e,EAAU2e,QAAQm/D,GACzB99E,EAAU2gB,YAAYm9D,GAGtB,SAASG,GAAoBlpE,GAClC,OAAI,OAAA8M,GAAA,GAAgB9M,EAAS,eAEL,IAArBA,EAAQmpE,SAAuBnpE,EAAQopE,WACnB,SAApBppE,EAAQu2B,UAAuBv2B,EAAQ5U,UAAUuR,SAAS,UAAYqD,EAAQ6K,oBAC/E7K,EAAUA,EAAQ6K,mBAGb7K,EAAQ0+D,aAAa,QAAU1+D,EAAQkV,WAPM,GAUvC,MAAM,GAArB,cASU,KAAAm0D,eAAiB,EA2KzB,KAAAC,eAAkBr8E,IAChB,OAAAyb,EAAA,GAAYzb,GAEZ,MAAMk4C,EAAQ+jC,GAAoBj8E,EAAE4S,QAChCslC,IAIJ,GAAaptB,KAAKhrB,MAAMw8E,gBAAgBpkC,GAAO,GAC5C,uBACD,OAAA6Q,GAAA,OAlLJ,OACEhrD,KAAK6N,QAAU3N,SAASuvC,eAAe,iBAEvC,MAAMm8B,EAA4B,CAChC,wBACA,yBACA,qBACA,wBACA,yBACA,gBAEA,cACA,cAEI4S,EAEF,GAEEt2E,EAAqC,IAAIwH,IAAI,CACjD,CACE,eACA,MAIJ,IAAI,MAAMyqC,KAAS,KAAOskC,MAAO,CAC/B,MACMzzE,EAAI,GADM,KAAOyzE,MAAMtkC,GAEvBukC,EAAW9S,GAAY5gE,EAAE,GAAK,GACpC,IAAI0zE,EAAU,SAEd,IAAI7oE,EAAI3N,EAAO8H,IAAI0uE,GACf7oE,IACFA,EAAI,GACJ3N,EAAOyM,IAAI+pE,EAAU7oE,IAGvBA,GAAG7K,EAAEvH,MAAM,IAAM,GAAK02C,EAOxBjyC,EAAOmG,OAAOu9D,EAAWlmE,OAGzBwC,EAAO5B,QAAQ,CAAC+2E,EAAQqB,KACtB,MAAMvxD,EAAMjtB,SAASC,cAAc,OACnCgtB,EAAI/sB,UAAUC,IAAI,kBAElB,MAAMs+E,EAAWz+E,SAASC,cAAc,OACxCw+E,EAASv+E,UAAUC,IAAI,kBACvBs+E,EAAS50E,OAAO,eAAK20E,IAErB,MAAME,EAAW1+E,SAASC,cAAc,OACxCy+E,EAASx+E,UAAUC,IAAI,gBAEvB8sB,EAAIpjB,OAAO40E,EAAUC,GAErBvB,EAAO/2E,QAAQu4E,IAsBbhB,GAjBY,aAAoBgB,GAiBoCD,GAAU,KAOhFJ,EAAKE,GAAYvxD,IAKnB,MAAM2xD,EAAO9+E,KAAK8+E,KAAO9+E,KAAK6N,QAAQsiC,uBAChC4uC,EAAc/+E,KAAK2+B,OAAS,IAAI,IAAW3+B,KAAK6N,QAAS,SAIzDiZ,EAAY,aAAa9mB,KAAK6N,SAAS,GAE7ChL,QAAQC,IAAI,CACV,OAAA1B,GAAA,GAAM,KACN,GAAgB+7E,kBAAkBt8E,KAAK4yD,IACrC,MAAMurB,IAAcvrB,EAAOtxD,OACrB88E,EAAWD,EAAY,EAAI,EACjCh/E,KAAK8+E,KAAK/4D,SAAS,GAAG3lB,UAAUkM,OAAO,QAAS0yE,GAChDh/E,KAAK8+E,KAAK/4D,SAASk5D,GAAU7+E,UAAUC,IAAI,UAC3C,MAAMwqC,EAAI,GAAkBq0C,YAAYJ,EAAMC,OAAar6E,EAAWu6E,GAGtE,OAFAj/E,KAAKm/E,kBAAoBt0C,EAAEs0C,kBAC3Bn/E,KAAKo/E,cAAgBv0C,EAAE3gC,UAChBupD,MAER5yD,KAAK,EAAEuG,EAAGqsD,MACX3sC,EAAUnlB,SAEV3B,KAAKq/E,eAAiBb,EAAK,gBAAgB3uE,cAAc,iBACzD,IAAI,MAAMsqC,KAASsZ,EACjBoqB,GAAY1jC,EAAOn6C,KAAKq/E,gBAG1Br/E,KAAKq/E,eAAevuE,cAAc1Q,UAAUkM,OAAO,QAAStM,KAAKq/E,eAAep1E,mBAEhF2hE,EAAW/lE,QAAQ,gBACnB+lE,EAAWnjE,IAAIi2E,IACb,MAAMvxD,EAAMqxD,EAAKE,GAQjB,OANIvxD,GACFzgB,QAAQC,MAAM,sBAAuB+xE,GAGvCK,EAAY9+E,UAAU8J,OAAOojB,GAC7BntB,KAAKm/E,kBAAkBG,2BAA2BnyD,GAC3CA,MAIXntB,KAAK6N,QAAQ7M,iBAAiB,QAAShB,KAAKs+E,gBAC5Ct+E,KAAKkO,KAAO,KAEZtF,EAAA,QAAU5H,iBAAiB,eAAiBm5C,IAC1C,MAAMp0B,EAAW5d,MAAMC,KAAKpI,KAAKq/E,eAAet5D,UAChD,IAAI,IAAI/a,EAAI,EAAG7I,EAAS4jB,EAAS5jB,OAAQ6I,EAAI7I,IAAU6I,EAAG,CACxD,MAAM+E,EAAKgW,EAAS/a,GAEpB,GAAGmvC,IADY,IAAkBwC,SAASuhC,GAAoBnuE,IACzC,CACnB,GAAS,IAAN/E,EACD,OAGF+E,EAAGpO,UAIPk8E,GAAY1jC,EAAOn6C,KAAKq/E,gBAAgB,GACxCr/E,KAAKq/E,eAAevuE,cAAc1Q,UAAUuB,OAAO,QACnD3B,KAAK8+E,KAAK/4D,SAAS,GAAG3lB,UAAUuB,OAAO,QAEnC3B,KAAKq+E,gBACPr+E,KAAKo/E,cAAc,KAIvB,GAAkBp+E,iBAAiB,QAAS,KAC1ChB,KAAKq+E,eAAiBr+E,KAAK2+B,OAAOwK,YAkBtC,Y,qTCvRa,MAAM,GAKnB,YAAoBn0B,EAA8BoY,EAAuBriB,EAAwBigB,GAAS,GAAtF,KAAAhW,UAA8B,KAAAoY,QAAuB,KAAAriB,aAHjE,KAAAw0E,cAA0C18E,QAAQoD,UAClD,KAAA6G,QAAkB,EAyBlB,KAAA01B,SAAW,KACdxiC,KAAK8M,QACNE,aAAahN,KAAK8M,SAElB9M,KAAKu/E,cAAgB,eAIvBv/E,KAAK8M,QAAUvB,OAAOC,WAAW,KAC/BxL,KAAK8M,QAAU,EACf9M,KAAKu/E,cAAct5E,WAElB,MA8EE,KAAAu5E,oBAAuBryD,GACrBntB,KAAKu/E,cAAc1+E,KAAK,IAAW,mCAGxC,GAAGb,KAAK2qB,cAAc80D,YAAYC,UAAUvyD,GAC1C,OAGF,MAAMrN,EAAQqN,EAAItd,cAAc,SAC1Bkb,EAAMoC,EAAItd,cAAc,OAQ9B,GANGkb,IACDA,GAAOA,EAAI3qB,UAAUuB,OAAO,cAEtB,iBAGL3B,KAAK2qB,cAAc80D,YAAYC,UAAUvyD,IAIzCrN,EAAO,CACRA,EAAMne,SACNme,EAAMrL,IAAM,GACZqL,EAAMha,OACam6C,EAAA,EAAqB0/B,cAAc7/D,GAC3CxZ,QAAQb,IACjBw6C,EAAA,EAAqB2/B,eAAen6E,GAAM,GAAM,UA3ItDzF,KAAK2qB,cAAgB,IAAI,UAAqBjmB,EAAW,CAACmQ,EAAQ0N,KAC7DA,EACDviB,KAAK6/E,kBAAkBhrE,GAEvB7U,KAAKw/E,oBAAoB3qE,KAa1BmW,GACDhrB,KAAKgrB,SAmBF,SACLhrB,KAAK+K,WAAW9K,UAAUe,iBAAiB,SAAUhB,KAAKwiC,UAGrD,SACLxiC,KAAKmK,QACLnK,KAAK+K,WAAW9K,UAAUoJ,oBAAoB,SAAUrJ,KAAKwiC,UAGxD,QACLxiC,KAAK2qB,cAAcxgB,QAGb,kBAAkBgjB,GAExB,GADcA,EAAItd,cAAc,SAE9B,OAwDF7P,KAAK2qB,cAAchlB,KAAK,CAACwnB,MAAKrnB,KAnDjB,KACX,MAAMqO,EAAQgZ,EAAI/gB,QAAQ+H,MACpBF,EAAM,IAAeC,OAAOC,GA4ClC,OA1CgBnU,KAAKu/E,cAAc1+E,KAAK,KACtC,MASMsF,EATMw3C,GAAU,CACpB1pC,MACAhU,UAAWktB,EACXxC,cAAe,KAEfyC,MAAOptB,KAAKotB,MACZ0wB,QAAQ,IAGUx9C,YAyBpB,OAxBA6F,EAAQ8a,QAAQ,KACd,MAAMnB,EAAQqN,EAAItd,cAAc,SAEhCsd,EAAIxqB,MAAM4pD,QAAU,GACpB,MAAMxhC,EAAMoC,EAAItd,cAAc,OAC9Bkb,GAAOA,EAAI3qB,UAAUC,IAAI,QAEtByf,IAAUA,EAAMhP,eACjBtF,WAAW,KACTsU,EAAMrL,IAAM,GACZqL,EAAMha,OACam6C,EAAA,EAAqB0/B,cAAc7/D,GAC3CxZ,QAAQb,IACjBw6C,EAAA,EAAqB2/B,eAAen6E,GAAM,GAAM,MAEjD,GAIDzF,KAAK2qB,cAAc80D,YAAYC,UAAUvyD,IAC3CntB,KAAKw/E,oBAAoBryD,KAItBhnB,OAgDN,IAAI8N,EAAiB+nB,EAAWh8B,KAAKgV,S,MAC1C,IAAI8qE,EAAW7rE,EAAI4D,EACfkoE,EAAY9rE,EAAIsE,EACjBwnE,EA5JQ,MA6JTD,GA7JS,IA6JWC,EACpBA,EA9JS,KAiKX,MAAMC,EAAe39E,KAAKC,IAlKP,IADT,IAmK2Cw9E,GAC/ChgF,EAAO,OAAAmgF,GAAA,GAAeH,EAAUC,EAAWC,EAlKtC,KAiLL7yD,EAAMjtB,SAASC,cAAc,OACnCgtB,EAAI/sB,UAAUC,IAAI,MAAO,sBACzB8sB,EAAIxqB,MAAMjC,MAAQZ,EAAKY,MAAQ,KAC/BysB,EAAIxqB,MAAM4pD,QAAU,IAEpBp/B,EAAI/gB,QAAQ+H,MAAQ,GAAKF,EAAI9E,GAE7B6sB,EAASjyB,OAAOojB,GAGhBntB,KAAK2qB,cAAcme,QAAQ3b,GAI3B,MAAMoyB,EAAW,IAAeC,SAASvrC,GAAK,GAG9C,IAAI8W,IADoBw0B,IAGtBx0B,EAAM,IAAIyd,MACVzd,EAAI3qB,UAAUC,IAAI,gBAEdk/C,EAASjrC,aAAaI,KACxB6qC,EAASp5C,QAAQtF,KAAK,KACpBkqB,EAAItW,IAAM8qC,EAASjrC,aAAaI,OAKtC,MAAMsuC,EAAc,KACfj4B,IACDoC,EAAIpjB,OAAOghB,GACXoC,EAAIxqB,MAAM4pD,QAAU,MAID,QAAtB,EAAAhN,aAAQ,EAARA,EAAUjrC,oBAAY,eAAEI,KAAM,OAAA6rC,GAAA,GAAmBx1B,EAAKw0B,EAASjrC,aAAaI,IAAKsuC,GAAeA,KC1NtF,MAAM,GAGnB,OACEhjD,KAAK6N,QAAU3N,SAASuvC,eAAe,gBACvC,MAAMywC,EAAgBlgF,KAAK6N,QAAQgS,kBACnCqgE,EAAcl/E,iBAAiB,QAAS,GAAkB2vD,cAE1D,MAAMhyB,EAAS,IAAI,IAAW3+B,KAAK6N,QAAS,QACtCsyE,EAAU,IAAI,GAAYD,EAAeE,GAAuBzhD,GAChE7X,EAAY,aAAa9mB,KAAK6N,SAAS,GAE7C,KAAW6oB,UAAU,wBAAyB,CAACylC,KAAM,MAAMt7D,KAAM6K,IAGlD,uBAAVA,EAAItE,GACLsE,EAAI0yC,KAAK93C,QAAQ,CAAC2N,EAAK5P,KACrBqH,EAAI0yC,KAAK/5C,GAAO4P,EAAM,IAAeolC,QAAQplC,GAE7CksE,EAAQ9/E,IAAI4T,KAIhB6S,EAAUnlB,WAGZ,GAAkB0+E,uBAAuBF,EAAQx1D,cAAew1D,EAAQX,qBAExEx/E,KAAKkO,KAAO,KAGd,Y,2SCpBK,MAAM,GAIX,YAAoBoyE,EAA6ClzD,GAA7C,KAAAkzD,uBAA6C,KAAAlzD,QAFzD,KAAAmzD,aAAoC,IAAI18E,IA8CxC,KAAA28E,wBAA0B,CAACrzD,EAAkB5K,KAEnC09B,EAAA,EAAqB0/B,cAAcxyD,GAC3C7mB,QAAQ6a,IACVoB,EAGF09B,EAAA,EAAqB2/B,eAAez+D,GAAQ,GAF5C8+B,EAAA,EAAqB2/B,eAAez+D,GAAQ,GAAM,MAOhD,KAAA0+D,kBAAqB1yD,IAC3B,MAAMhZ,EAAQgZ,EAAI/gB,QAAQ+H,MACpBF,EAAM,IAAeC,OAAOC,GAE5BrU,EAAOokB,EAAA,EAAWosB,OAAOq2B,WAAWjmE,MAIpCyF,EAAU+mB,GAAY,CAC1BjZ,MACAkZ,IAAKA,EACLzsB,MAAOZ,EACPa,OAAQb,EACR6qB,cAAe,KACfyC,MAAOptB,KAAKotB,MACZs1B,WAAW,EACXjhD,MAAM,EACNjB,MAAM,IAYR,OATA2F,EAAQtF,KAAK,KAEXb,KAAKwgF,wBAAwBrzD,EAAKntB,KAAK2qB,cAAc80D,YAAYC,UAAUvyD,MAOtEhnB,GAGF,KAAAq5E,oBAAuBryD,IAC5B,MAAMhZ,EAAQgZ,EAAI/gB,QAAQ+H,MACpBF,EAAM,IAAeC,OAAOC,GAIlCnU,KAAKwgF,wBAAwBrzD,GAAK,GAElCA,EAAIlpB,UAAY,GAChBjE,KAAKygF,cAAcxsE,EAAKkZ,IAhGxBntB,KAAK2qB,cAAgB,IAAI,UAAoBjmB,EAAW,CAACmQ,EAAQ0N,KAC3DA,GACFviB,KAAKw/E,oBAAoB3qE,KAKxB,QACL7U,KAAK2qB,cAAcxgB,QAGd,cAAc8J,EAAiBkZ,EAAsB1C,GAoB1D,OAnBI0C,KACFA,EAAMjtB,SAASC,cAAc,QACzBC,UAAUC,IAAI,YAAa,iBAEZ,IAAhB4T,EAAIipC,SACLl9C,KAAK0gF,mBAAmBvzD,IAK5BD,GAAY,CACVjZ,MACAkZ,MACAxC,cAAe3qB,KAAKsgF,qBACpBlzD,MAAOptB,KAAKotB,MACZs1B,UAA2B,IAAhBzuC,EAAIipC,QACfzyB,iBAGK0C,EAGF,mBAAmBA,GACxBntB,KAAKugF,aAAalgF,IAAI8sB,GAEtBntB,KAAK2qB,cAAcme,QAAQ,CACzB3b,MACArnB,KAAM9F,KAAK6/E,qBA6DF,MAAM,GAArB,cAIU,KAAArX,YAGH,GAGG,KAAAxrB,eAA+B,GAM/B,KAAAiQ,SAAU,EAEV,KAAA0zB,kBAAgE,GAMxE,aAAaC,EAA0BC,EAAwB,GAAI16E,EAAgCyY,GAGjG,MAAMggE,EAAW1+E,SAASC,cAAc,OACxCy+E,EAASx+E,UAAUC,IAAI,iBAAkB,kBAEzC,MAAMs+E,EAAWz+E,SAASC,cAAc,OAmCxC,OAlCAw+E,EAASv+E,UAAUC,IAAI,kBAEpBwgF,IACDlC,EAAS16E,UAAY48E,GAGvBD,EAAY72E,OAAO40E,EAAUC,GAE7B5+E,KAAKm/E,kBAAkBG,2BAA2BsB,GAElD5gF,KAAK2gF,kBAAkBh7E,KAAK,CAACqP,QAAS4rE,EAAahiE,YAEnDzY,EAAQtF,KAAK44C,IACXA,EAAUnzC,QAAQ2N,IAEhB2qE,EAAS70E,OAAO/J,KAAK8gF,qBAAqBL,cAAcxsE,MAGvDjU,KAAK2gF,kBAAkBx+E,SACxBnC,KAAK2gF,kBAAkBr6E,QAAQ,EAAE0O,UAAS4J,cACrCA,EACE5e,KAAK+gF,UAAUjwE,eAChB9Q,KAAKumE,YAAY3nD,QAAQ5J,GACzBhV,KAAKumE,YAAY3nD,QAAQ5e,KAAK+gF,YAE9B/gF,KAAKumE,YAAY3nD,QAAQ5J,GAEtBhV,KAAKumE,YAAYx8D,OAAOiL,KAGjChV,KAAK2gF,kBAAkBx+E,OAAS,KAI7B,CAACw8E,YAGJ,iBAAiBhqE,EAA4BiK,GAAU,G,0CAC3D,MAAMgiE,EAAc1gF,SAASC,cAAc,OAC3CygF,EAAYxgF,UAAUC,IAAI,oBAC1BugF,EAAYx0E,QAAQ+C,GAAK,GAAKwF,EAAIxF,GAClCyxE,EAAYx0E,QAAQyvC,YAAc,GAAKlnC,EAAIknC,YAE3C,MAAMhhC,EAAS3a,SAASC,cAAc,UACtC0a,EAAOza,UAAUC,IAAI,WAAY,4BAEjCL,KAAKwoE,YAAY7zD,EAAIxF,IAAM,CACzB+qC,SAAU0mC,EACVpxE,IAAKqL,GAGJ+D,EACD5e,KAAK8+E,KAAKn+D,aAAa9F,EAAQ7a,KAAK8+E,KAAKj/D,kBAAkBi5C,aAE3D94D,KAAK8+E,KAAK/0E,OAAO8Q,GAKnB,MAAM1U,EAAU,GAAmB6zC,cAAcrlC,GACjD3U,KAAKghF,aAAaJ,EAAa,IAAkBn0D,cAAc9X,EAAI/G,OAAQzH,EAAQtF,KAAKg5C,GAAcA,EAAWJ,WAA4B76B,SACpHzY,EAIzBs9C,GAAoB,CAClB9uC,MACA1U,UAAW4a,EACXuS,MAAOgzD,GACPz1D,cAAe,GAAkBA,cACjCjqB,MAAO,GACPC,OAAQ,GACRF,UAAU,OAId,OACET,KAAK6N,QAAU3N,SAASuvC,eAAe,oBAGvCzvC,KAAK+gF,UAAY7gF,SAASC,cAAc,OACxCH,KAAK+gF,UAAU3gF,UAAUC,IAAI,mBAAoB,mBAEjD,IAAI4gF,EAAcjhF,KAAK6N,QAAQsiC,uBAC/BnwC,KAAK8+E,KAAOmC,EAAYphE,kBAExB,IAAIqhE,EAAa,IAAI,IAAYD,GAEjCjhF,KAAKumE,YAAcrmE,SAASC,cAAc,OAC1CH,KAAKumE,YAAYnmE,UAAUC,IAAI,uBAC/BL,KAAK6N,QAAQ9D,OAAO/J,KAAKumE,aAmBzB39D,EAAA,QAAU5H,iBAAiB,qBAAuBiB,IAChD,MAAM0S,EAA6B1S,GAE/BjC,KAAKwoE,YAAY7zD,EAAIxF,KAAOnP,KAAKitD,SACnCjtD,KAAKyoE,iBAAiB9zD,GAAK,KAI/B/L,EAAA,QAAU5H,iBAAiB,mBAAqBiB,IAC9C,MAAM0S,EAA6B1S,EAEnC,GAAGjC,KAAKwoE,YAAY7zD,EAAIxF,KAAOnP,KAAKitD,QAAS,CAC3C,MAAMrlC,EAAW5nB,KAAKwoE,YAAY7zD,EAAIxF,IACtCyY,EAASsyB,SAASv4C,SAClBimB,EAASpY,IAAI7N,gBACN3B,KAAKwoE,YAAY7zD,EAAIxF,OAIhCnP,KAAKumE,YAAYvlE,iBAAiB,QAAUiB,IAC1C,MAAM4S,EAAS5S,EAAE4S,OACjB,GAAG,OAAAiN,GAAA,GAAgBjN,EAAQ,kBAA3B,CACE,MAAM9E,EAAK,OAAA8rB,GAAA,GAAgBhnB,EAAQ,WACnC,IAAI,GAAc,CAAC1F,GAAIY,EAAG3D,QAAQ+C,GAAI0sC,YAAa9rC,EAAG3D,QAAQyvC,cAAct7B,YAI9E,GAAkBowC,aAAa1uD,KAGjC,MAAMk/E,EAAY,CAAC31D,GAAS,KAC1B5iB,EAAA,QAAU6F,cAAc,oBAAqB+c,IAG/CxrB,KAAK2+B,OAAS,IAAI,IAAW3+B,KAAK6N,QAAS,YAC3C7N,KAAK2+B,OAAOzzB,oBAAoBlL,KAAKumE,aACrCvmE,KAAK2+B,OAAO4O,mBAAqB,KAC/B4zC,KAGF,GAAkBngF,iBAAiB,SAAU,KAC3CmgF,GAAU,KAGZ,GAAkBngF,iBAAiB,SAAU,KAC3CmgF,MAGFnhF,KAAKm/E,kBAAoB,GAAkBD,YAAYl/E,KAAK8+E,KAAM9+E,KAAK2+B,OAAQuiD,GAAY/B,kBAE3F,MAAMr4D,EAAY,aAAa9mB,KAAK6N,SAAS,GAE7ChL,QAAQC,IAAI,CACV,GAAmB+5C,oBAAoBh8C,KAAKq5C,IAC1Cl6C,KAAKg9C,eAAiB9C,EAASA,SAASz2C,MAAM,EAAG,IAIjDzD,KAAKwoE,YAAoB,OAAI,CAC3BtuB,SAAUl6C,KAAK+gF,UACfvxE,IAAKxP,KAAK8+E,KAAKj/D,mBAGjBiH,EAAUnlB,SACV,MAAM,SAACg9E,GAAY3+E,KAAKghF,aAAahhF,KAAK+gF,UAAW,GAAIl+E,QAAQoD,QAAQjG,KAAKg9C,iBAAiB,GAC/F2hC,EAAS50E,OAAO,eAAK,sBAGvB,GAAmByyC,iBAAiB37C,KAAM6K,IACxCob,EAAUnlB,SAEV,IAAI,IAAIgT,KAAQjJ,EAAgDqwC,KAC9D/7C,KAAKyoE,iBAAiB9zD,OAGzBsM,QAAQ,KACTjhB,KAAKitD,SAAU,EACfk0B,MAGFnhF,KAAK8gF,qBAAuB,IAAI,GAAqB,GAAkBn2D,cAAey1D,IAEtF,GAAkBC,uBAAuBrgF,KAAK8gF,qBAAqBn2D,cAAe3qB,KAAK8gF,qBAAqBtB,qBAU5Gx/E,KAAKkO,KAAO,KAGd,kBAAkB+F,G,MAGhB,GAFA,GAAmBmtE,kBAAkBntE,KAEnB,QAAd,EAAAjU,KAAK+gF,iBAAS,eAAEjwE,eAClB,OAGF,IAAIqc,EAAMntB,KAAK+gF,UAAUlxE,cAAc,iBAAiBoE,EAAI9E,QACxDge,IACFA,EAAMntB,KAAK8gF,qBAAqBL,cAAcxsE,IAGhD,MAAMzO,EAAQxF,KAAK+gF,UAAUlxE,cAAc,mBAC3CrK,EAAMoZ,QAAQuO,GAEX3nB,EAAMyE,kBAAoB,IAC1B9B,MAAMC,KAAK5C,EAAMugB,UAA4BtiB,MAAM,IAAI6C,QAAQyJ,GAAMA,EAAGpO,UAI7E,Y,2SCiBF,MAAM,GAAuB,IAtXtB,MAAP,cACU,KAAA0/E,cAAgE,GAChE,KAAAC,QAKJ,GAEG,YAAYC,GACjB,MAAiB,aAAVA,EAAIn6E,EAAmB,CAC5BA,EAAG,gBACHo6E,IAAKD,EAAIC,IACTC,KAAMF,EAAIE,KACVC,gBAAiBH,EAAIG,iBACnB,CACFt6E,EAAG,sBAIA,iBAAiBH,EAAgB06E,EAAc/2E,EAAQ,GAAIylB,EAAS,GAAIkxD,GAC7E,OAAO,KAAgB7qD,UAAU,+BAAgC,CAC/DwmC,IAAK,IAAgBvE,aAAagpB,GAClCjgD,KAAM,IAAgBooC,iBAAiB7iE,GACvC2D,QACAg3E,UAAWL,EAAMvhF,KAAK6hF,YAAYN,QAAO78E,EACzC2rB,UACC,CAAmByxD,UAAW,EAAGC,YAAY,IAAOlhF,KAAKmhF,IAC1D,MAAMC,EAAUD,EAAWE,SAoB3B,OAdAF,EAAWlkD,QAAQx3B,QAAQD,IACT,yBAAbA,EAAOe,IACLf,EAAOnG,WACRmG,EAAOnG,SAAW,IAAem5C,QAAQhzC,EAAOnG,WAG/CmG,EAAO7B,QACR6B,EAAO7B,MAAQ,IAAiB29E,UAAU97E,EAAO7B,SAIrDxE,KAAKqhF,cAAcrhF,KAAKoiF,YAAYH,EAAS57E,EAAO8I,KAAO9I,IAGtD27E,IAIJ,YAAYC,EAA4DI,GAC7E,OAAOJ,EAAU,IAAMI,EAGjB,eAAeV,GACrB,IAAgBhuB,YAAY,eAAe9yD,KAAMyhF,IAC/C,MAAMC,EAAYZ,EAAM75D,WAClBxL,EAAQgmE,EAASntE,UAAUqtE,GAAWA,EAAQrzE,KAAOozE,GAC3D,IAAIC,EAEFA,GADY,IAAXlmE,EACSgmE,EAAShmE,GAET,CACRnN,GAAIozE,EACJE,OAAQ,KAIVD,EAAQC,OACV,YAA2BH,EAAUE,EAAS,UAE9C9tD,EAAA,QAAgBguD,qBAAqB,mBAMlC,WAAWt2B,EAAoBu1B,EAAcgB,GAGlD,OAFA3iF,KAAKshF,QAAQK,GAAS,CAAC16E,OAAQmlD,EAAYhX,KAAMC,KAAKC,OACtD1sC,EAAA,QAAU6F,cAAc,gBAAiB,CAACxH,OAAQ06E,EAAM75D,aACjD,IAAmB86D,SAASjB,OAAOj9E,EAAWi+E,GA8G1C,kBAAkBhB,G,0CAC7B,MAAMzkB,EAAM,IAAgBh4B,QAAQy8C,GACpC,IAAIzkB,IAAQA,EAAI5lD,OAAO4lD,MAAQA,EAAI2lB,uBACjC,OAGF,MAAMC,EAAW9iF,KAAKshF,QAAQK,GAC9B,OAAGmB,WACM9iF,KAAKshF,QAAQK,GAChBtsC,KAAKC,MAAQwtC,EAAS1tC,KAAQ,MACzB0tC,EAAS77E,YAHpB,KAQK,kBAAkBA,EAAgB6D,EAAkB62E,EAAc/2E,GACvEhC,EAAA,QAAU6F,cAAc,gBAAiB,CAACxH,SAAQ6D,aAClD,KAAiBi4E,SAAS97E,EAAQ6D,EAAU,IAAM,IAAgBo6B,QAAQy8C,GAAOnrD,SAAW,IAAM5rB,GAG7F,oBAAoB3D,EAAgBJ,EAAagU,GACtD,OAAO,KAAgB6b,UAAU,gCAAiC,CAChEgL,KAAM,IAAgBooC,iBAAiB7iE,GACvC+7E,OAAQ,IAAsBC,mBAAmBp8E,GACjDy+D,KAAMzqD,EAAOyqD,MACZ,CAAmBwc,UAAW,EAAGC,YAAY,IAAOlhF,KAAMqiF,IACtB,iBAA3BA,EAAe9+E,SAAwB8+E,EAAe9+E,QAAQjC,QACtE+yB,GAAM,IAAkByX,aAAau2C,EAAe9+E,QAAS,CAAC++E,SAAS,EAAMC,cAAc,OAyB1F,iBAAiBn8E,EAAgB06E,EAAc0B,EAA2BrgF,EAW5E,I,MACH,MAAMsgF,EAAetjF,KAAKqhF,cAAcgC,GACxC,IAAIC,EACF,OAGFtjF,KAAKujF,eAAe5B,GACpB,MAAMjpB,EAAW2qB,EAAkBhhE,MAAM,KACnCmhE,EAAU9qB,EAAS9yD,QACnB69E,EAAW/qB,EAAS/wC,KAAK,KAQ/B,GAPA3kB,EAAQkxE,SAAWyN,EACnB3+E,EAAQi/E,QAAUuB,EAClBxgF,EAAQq/E,SAAWoB,EAChBH,EAAaI,aAAaC,eAC3B3gF,EAAQ4gF,YAAcN,EAAaI,aAAaC,cAGf,yBAAhCL,EAAaI,aAAat8E,EAC3BpE,EAAQ6zC,SAAWysC,EAAaI,aAAa7sC,SAC7C,IAAmBgtC,SAAS58E,EAAQq8E,EAAaI,aAAat/E,QAASpB,OAClE,CACL,IACI8gF,EADA5qD,EAAU,GAEd,MAAM6qD,EAAcT,EAAaI,aACjC,OAAOK,EAAY38E,GACjB,IAAK,4BAGH,GAFA8xB,EAAU6qD,EAAY3/E,QAEA,yBAAnBk/E,EAAal8E,EAA8B,CAC5C,MAAM,SAAClH,EAAQ,MAAEsE,GAAS8+E,EAExBQ,EADC5jF,EACY,IAAe8jF,cAAc9jF,GAE7B,IAAiB8jF,cAAcx/E,GAIhD,MAGF,IAAK,2BACHs/E,EAAa,CACX18E,EAAG,qBACHw6E,UAAW5hF,KAAK6hF,YAAYkC,EAAYxC,MAG1Cv+E,EAAQihF,SAAWF,EAAYxC,IAE/B,MAGF,IAAK,6BACHuC,EAAa,CACX18E,EAAG,kBACHw6E,UAAW5hF,KAAK6hF,YAAYkC,EAAYxC,KACxC3zE,MAAOm2E,EAAYn2E,MACnBs2E,QAASH,EAAYG,QACrBC,SAAUJ,EAAYI,SACtBC,SAAUL,EAAYK,SACtBC,WAAYN,EAAYM,YAG1BrhF,EAAQihF,SAAWF,EAAYxC,IAE/B,MAGF,IAAK,+BACHuC,EAAa,CACX18E,EAAG,oBACHk9E,aAAcP,EAAYO,aAC1Bl/C,WAAY2+C,EAAY3+C,WACxBC,UAAW0+C,EAAY1+C,UACvBk/C,MAAOR,EAAYQ,OAOrBT,IACFA,EAAa,CACX18E,EAAG,sBACHjE,KAAMmgF,EAAangF,KACnBgW,UAAWmqE,EAAa11E,QACmC,QAAxD,EAAA01E,EAAiDz1E,eAAO,eAAE6G,MAC1D4uE,EAAiD5uE,IACpD5U,KAAM,EACNkhB,SAAU,CAACwjE,QAAS,GAAIj5D,MAAO,KAInC,IAAmBk5D,UAAUx9E,EAAQ68E,EAAY9gF,MA4BvD,OAAmB,KAAe0hF,qBAAuB,IAC1C,U,uSC7XA,MAAM,WAAmB,EAAxC,c,oBAIU,KAAAC,WAAa,GACb,KAAAx/E,WAAY,EA2BZ,KAAAy/E,YAAe3iF,IACrB,MAAM4S,EAAS,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAAQ,OACzC,IAAIA,EAAQ,OAEZ,MAAMsxD,EAAStxD,EAAOzI,QAAQ+H,MAC3B,GAAa4Y,KAAKhrB,MAAMqkE,wBAAwBD,GAC9CjiD,EAAA,EAAWC,UACZ,GAAgBrV,kBAGlBpC,QAAQkK,KAAK,oBAAqBuvD,IA9B5B,OACRnmE,KAAKC,UAAUkP,GAAK,wBAEpBnP,KAAK0wE,YAAc,IAAI,EAAY,kBAAoBxuE,IACrDlC,KAAKoJ,QACLpJ,KAAKu9E,OAAOr7E,KAGdlC,KAAK4N,MAAM8b,YAAY1pB,KAAK0wE,YAAYzwE,WAExCD,KAAK6kF,QAAU3kF,SAASC,cAAc,OACtCH,KAAK6kF,QAAQzkF,UAAUC,IAAI,gBAC3B,YAAiBL,KAAK6kF,QAAS7kF,KAAK4kF,YAAa,CAAC72E,eAAgB/N,KAAK+N,iBAEvE/N,KAAK+K,WAAWhB,OAAO/J,KAAK6kF,SAE5B7kF,KAAKmgF,QAAU,IAAI,GAAYngF,KAAK6kF,QA9BjB,cA8B0C7kF,KAAK+K,YAkB7D,UACL/K,KAAK+K,WAAWM,iBAAmB,OAG9B,sBAKL,OAJArL,KAAKoJ,QACLpJ,KAAK6kF,QAAQ5gF,UAAY,GACzBg8C,EAAA,EAAqB6kC,qBAAgBpgF,EAvDlB,eAwDnB1E,KAAK0wE,YAAY/uE,SACVsB,MAAM0L,sBAGP,QACN3O,KAAK0K,cAAgB,KACrB1K,KAAK2kF,WAAa,GAClB3kF,KAAKmF,WAAY,EACjBnF,KAAKmgF,QAAQh2E,QAGR,OACL,MAAMo8B,EAAMtjC,MAAM8N,OAQlB,OAPA,GAAgB++B,eAAc,GAAMjvC,KAAK,KACvCb,KAAKu9E,OAAO,IAAI,GAEhBv9E,KAAK+K,WAAWM,iBAAmB,KACjCrL,KAAKu9E,OAAOv9E,KAAK0wE,YAAYxuE,OAAO,MAGjCqkC,EAGI,OAAO37B,EAAem6E,GAAY,G,0CAC7C,IAAG/kF,KAAK0K,gBAAiB1K,KAAKmF,UAA9B,CAEInF,KAAKglF,eACPhlF,KAAKglF,oBAAsB,IAAgBC,gBAAgB,QAAQ91E,GAAG2Y,UAAS,IAGjF,IACE9nB,KAAK0K,cAAgB,GAAqBw6E,iBAAiB,KAAcllF,KAAKglF,aAAcp6E,EAAO5K,KAAK2kF,YACxG,MAAM,QAAE7mD,EAAO,YAAEkU,SAAsBhyC,KAAK0K,cAE5C,GAAG1K,KAAK0wE,YAAYxuE,QAAU0I,EAC5B,OAGF5K,KAAK0K,cAAgB,KACrB1K,KAAK2kF,WAAa3yC,EACf+yC,IACD/kF,KAAK6kF,QAAQ5gF,UAAY,IAGxB65B,EAAQ37B,OACT27B,EAAQx3B,QAASD,IACC,yBAAbA,EAAOe,GAAgCf,EAAOnG,UAC/CF,KAAKmgF,QAAQ9/E,IAAIgG,EAAOnG,YAI5BF,KAAKmF,WAAY,EAGnBnF,KAAK+K,WAAWy3B,WAChB,MAAM/1B,GAGN,MAFAzM,KAAK0K,cAAgB,KACrBgC,QAAQC,MAAM,sBAAuBF,GAC/BA,QChHG,MAAM,WAAuB,EAKhC,OACRzM,KAAKC,UAAUkP,GAAK,qBACpBnP,KAAKC,UAAUG,UAAUC,IAAI,sBAE7BL,KAAK2qB,cAAgB,IAAI,KAEzB3qB,KAAK0wE,YAAc,IAAI,EAAY,gCAAkCxuE,IACnElC,KAAKu9E,OAAOr7E,KAGdlC,KAAK4N,MAAM8b,YAAY1pB,KAAK0wE,YAAYzwE,WAExCD,KAAKmlF,QAAUjlF,SAASC,cAAc,OACtCH,KAAKmlF,QAAQ/kF,UAAUC,IAAI,gBAC3BL,KAAK+K,WAAWhB,OAAO/J,KAAKmlF,SAE5B,YAAiBnlF,KAAKmlF,QAAUljF,IAC9B,MAAMi7C,EAAU,OAAAp7B,GAAA,GAAgB7f,EAAE4S,OAAQ,uBAC1C,GAAGqoC,EAAS,CACV,MAAM/oC,EAAQ+oC,EAAQ9wC,QAAQ+H,MAE9B,YADA,GAAa4Y,KAAKhrB,MAAMqkE,wBAAwBjyD,GAIlD,MAAMU,EAAS,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAAQ,eACzC,IAAIA,EAAQ,OAEZ,MAAM1F,EAAK0F,EAAOzI,QAAQytC,WACpBgC,EAAchnC,EAAOzI,QAAQyvC,YAE7BhhC,EAAS,OAAAiH,GAAA,GAAgB7f,EAAE4S,OAAQ,sBACtCgG,GACD5Y,EAAE8Y,iBACF9Y,EAAEwsD,cAAe,EAEjB5zC,EAAOzX,aAAa,WAAY,QAEhC,GAAmB42C,cAAc,CAAC7qC,KAAI0sC,gBAAch7C,KAAKiqB,IACvD,GAAmB47C,iBAAiB57C,EAAKnW,KAAK9T,KAAKu4B,IAC9CA,IACDve,EAAOrI,YAAc,GACrBqI,EAAO9Q,OAAO,eAAK+gB,EAAKnW,IAAI0mC,eAAiB,uBAAyB,uBACtExgC,EAAOza,UAAUkM,OAAO,SAAUwe,EAAKnW,IAAI0mC,mBAE5Cp6B,QAAQ,KAETpG,EAAOupB,gBAAgB,iBAI3B,GAAmB4V,cAAc,CAAC7qC,KAAI0sC,gBAAch7C,KAAKiqB,IACvD,IAAI,GAAcA,EAAKnW,KAAK4L,UAG/B,CAACxS,eAAgB/N,KAAK+N,iBAGpB,sBAGL,OAFA/N,KAAKmlF,QAAQlhF,UAAY,GACzBg8C,EAAA,EAAqB6kC,qBAAgBpgF,EAAW,mBACzCzB,MAAM0L,sBAGR,UAAUgG,GAEf,MAAMwY,EAAMjtB,SAASC,cAAc,OACnCgtB,EAAI/sB,UAAUC,IAAI,eAElB,MAAMoN,EAASvN,SAASC,cAAc,OACtCsN,EAAOrN,UAAUC,IAAI,sBAErB,MAAMmT,EAAUtT,SAASC,cAAc,OACvCqT,EAAQpT,UAAUC,IAAI,uBACtBmT,EAAQvP,UAAY,yCACc,IAAkBwoB,cAAc9X,EAAI/G,qBAGtE,MAAMw3E,EAAWllF,SAASC,cAAc,OACxCilF,EAAShlF,UAAUC,IAAI,qBACvB+kF,EAASr7E,OAAO,eAAK,WAAY,CAAC4K,EAAIhQ,SACtC6O,EAAQzJ,OAAOq7E,GAEf,MAAMvqE,EAAS3a,SAASC,cAAc,UACtC0a,EAAOza,UAAUC,IAAI,cAAe,oBAAqB,sBACzDwa,EAAO9Q,OAAO,eAAK4K,EAAI0mC,eAAiB,uBAAyB,uBAG9D1mC,EAAI0mC,gBACLxgC,EAAOza,UAAUC,IAAI,QAKvBoN,EAAO1D,OAAOyJ,EAASqH,GAEvB,MAAM0rD,EAAcrmE,SAASC,cAAc,OAC3ComE,EAAYnmE,UAAUC,IAAI,wBAE1B,MAAMsE,EAAQtC,KAAKC,IAAI,EAAGqS,EAAIhQ,OAC9B,IAAI,IAAIqG,EAAI,EAAGA,EAAIrG,IAASqG,EAAG,CAC7B,MAAMq6E,EAAanlF,SAASC,cAAc,OAC1CklF,EAAWjlF,UAAUC,IAAI,uBAEzBkmE,EAAYx8D,OAAOs7E,GAGrB,GAAmBrrC,cAAcrlC,GAAK9T,KAAK8T,IAGzC,IAAI,IAAI3J,EAAI,EAAGA,EAAIrG,IAASqG,EAAG,CAC7B,MAAMmiB,EAAMo5C,EAAYxgD,SAAS/a,GAC3BiJ,EAAMU,EAAI8kC,UAAUzuC,GACb,kBAAViJ,EAAI7M,GAIP8lB,GAAY,CACVjZ,MACAkZ,MACAxC,cAAe3qB,KAAK2qB,cACpByC,MAAO,kBAGP3rB,MAAM,EACNjB,MAAM,EACNE,MAAO,GACPC,OAAQ,QA8BdwsB,EAAI/gB,QAAQytC,WAAa,GAAKllC,EAAIxF,GAClCge,EAAI/gB,QAAQyvC,YAAc,GAAKlnC,EAAIknC,YACnC1uB,EAAI/gB,QAAQwB,MAAQ+G,EAAI/G,MAExBuf,EAAIpjB,OAAO0D,EAAQ84D,GAEnBvmE,KAAKmlF,QAAQp7E,OAAOojB,GAGf,OACL,MAAMoZ,EAAMtjC,MAAM8N,OAKlB,OAJA,GAAgB++B,eAAc,GAAMjvC,KAAK,KACvCb,KAAKslF,mBAGA/+C,EAGF,iBACL,OAAO,GAAmBg/C,sBAAsB1kF,KAAK2kF,IAChDxlF,KAAK0wE,YAAYxuE,QAIpBsjF,EAAcxlF,KAAKylF,eAAe,GAAID,IAC1Bl/E,QAAQqO,IAClB3U,KAAK0lF,UAAU/wE,EAAIA,SAKjB,eAAe/J,EAAe46E,GACpCA,EAAcA,EAAY/hF,QAE1B,MAAMsiB,EAAW5d,MAAMC,KAAKpI,KAAKmlF,QAAQp/D,UAczC,OAbA,YAAeA,EAAUhW,IACvB,MAAMZ,EAAKY,EAAG3D,QAAQytC,WAChBv9B,EAAQkpE,EAAYrwE,UAAU6mC,GAAWA,EAAQrnC,IAAIxF,KAAOA,IAEpD,IAAXmN,EACDkpE,EAAY/gF,OAAO6X,EAAO,GACjB1R,GAAUmF,EAAG3D,QAAQwB,MAAM0uC,cAAc5hB,SAAS9vB,EAAM0xC,gBACjEvsC,EAAGpO,WAIPs+C,EAAA,EAAqB6kC,qBAAgBpgF,EAAW,mBAEzC8gF,EAGF,OAAO56E,GACZ,OAAIA,EAIG,GAAmB+6E,kBAAkB/6E,GAAO,GAAO/J,KAAK2kF,IAC1DxlF,KAAK0wE,YAAYxuE,QAAU0I,IAM9B46E,EAAcxlF,KAAKylF,eAAe76E,EAAO46E,IAC7Bl/E,QAAQqO,IAClB3U,KAAK0lF,UAAU/wE,EAAIA,SAZd3U,KAAKslF,kB,2SC3NH,MAAM,WAAsB,IAWzC,YAAYtiF,GAGVC,OAAM,GANE,KAAA2iF,YAAa,EACb,KAAAC,QAAS,EAoCX,KAAAC,WAAc7jF,IAGpB,GADA+K,aAAahN,KAAK+lF,iBACd/lF,KAAKgmF,WAAY,OAErB,MAAMC,EAAahkF,EAAUgkF,UAC1BA,GAAa,OAAAt8B,GAAA,GAAcs8B,EAAWjmF,KAAKgV,WAI9ChV,KAAK+lF,eAAiBx6E,OAAOC,WAAW,KACtCxL,KAAKsM,QAAO,IA3DK,OA6Ed,KAAAA,OAAe+jC,GAAqB,mCAEzC,MAAM61C,IAAkBlmF,KAAKgV,QAAQrS,MAAMC,cAAsB8B,IAAX2rC,GAAyBA,EAC/E,GAAGrwC,KAAKkO,KAAM,CACZ,IAAGg4E,EAID,OAHAlmF,KAAKkO,OACLlO,KAAKkO,KAAO,KAMhB,GAAGg4E,IAAiBlmF,KAAKgmF,WAIzB,GAAIhmF,KAAKgV,QAAQrS,MAAMC,cAAsB8B,IAAX2rC,GAAyBA,EAAQ,CACjE,MAAM3kC,EAAM1L,KAAKyO,cAAc,cACzB5L,QAAQC,IAAI4I,GAElB1L,KAAKgV,QAAQrS,MAAMC,QAAU,GACxB5C,KAAKgV,QAAQ40B,WAClB5pC,KAAKgV,QAAQ5U,UAAUC,IAAI,UAE3B2M,aAAahN,KAAK+lF,gBAClB/lF,KAAK+lF,eAAiBx6E,OAAOC,WAAW,KACtCxL,KAAK4lF,YAAa,EAClB5lF,KAAKyO,cAAc,WAClB,sBAAqB,EAxGH,UAqHrBzO,KAAKyO,cAAc,SAEnBzO,KAAKgV,QAAQ5U,UAAUuB,OAAO,UAE9BqL,aAAahN,KAAK+lF,gBAClB/lF,KAAK+lF,eAAiBx6E,OAAOC,WAAW,KACtCxL,KAAKgV,QAAQrS,MAAMC,QAAU,OAC7B5C,KAAK4lF,YAAa,EAClB5lF,KAAKyO,cAAc,WAClB,sBAAqB,EA9HH,QAiBvB,YAAWzO,KAAMgD,GAGZ,qBAAqB6X,EAAqB9M,GAC/C,IAAIy+D,GAAY,EACb,sBACD,YAAiB3xD,EAAQ,KACpB2xD,GACDA,GAAY,EACZxsE,KAAKsM,QAAO,IAEZtM,KAAKsM,UAEN,CAACyB,mBAEJA,EAAe1N,IAAIwa,EAAnB9M,CAA2B,YAAc9L,IAEpCuqE,IACDz+D,EAAe1N,IAAIwa,EAAnB9M,CAA2B,WAAY/N,KAAK8lF,YAC5CtZ,GAAY,GAGdx/D,aAAahN,KAAK+lF,gBAClB/lF,KAAK+lF,eAAiBx6E,OAAOC,WAAW,KACtCxL,KAAKsM,QAAO,IA1CC,OA+DX,OACJ,wBACFtM,KAAKgV,QAAQmxE,WAAanmF,KAAK8lF,WAC/B9lF,KAAKgV,QAAQoxE,YAAenkF,IACvBjC,KAAK4lF,YAKR54E,aAAahN,KAAK+lF,kBAyEjB,WACL,OAAO/lF,KAAKgV,QAAQ5U,UAAUuR,SAAS,W,2SCjIpC,MAAMyuE,GAAwB,qBAO9B,MAAM,WAA0B,GAoBrC,cACEn9E,MAAM,CACJ+R,QAAS9U,SAASuvC,eAAe,oBAb7B,KAAA42C,OAAS,EA2IT,KAAAC,iBAAoBn3E,IACvBnP,KAAKqmF,QAAUl3E,IAIlB8wC,EAAA,EAAqB6kC,iBAAgB,EAAM1E,IAE3CpgF,KAAKqmF,MAAQl3E,EACbnP,KAAKumF,aAAanmF,UAAUkM,OAAO,OAAuB,IAAftM,KAAKqmF,OAChDrmF,KAAKwmF,UAAUpmF,UAAUkM,OAAO,OAAuB,IAAftM,KAAKqmF,SAGvC,KAAAI,YAAc,KACpB,MAAM,OAACx/E,EAAM,SAAE6D,GAAY,GAAaiiB,KAClChH,EAAW/lB,KAAK0mF,OAAO3gE,SACvB4gE,EAAex+E,MAAMC,KAAK2d,GAE1B6gE,EAAkB,IAAmBC,cAAc5/E,EAAQ6D,EAAU,iBAC3E67E,EAAa,GAAGj0D,gBAAgB,YAAak0D,GAE7C,MAAME,EAAc,IAAmBD,cAAc5/E,EAAQ6D,EAAU,aACvE67E,EAAa,GAAGj0D,gBAAgB,YAAao0D,GAE7C,MAAMx2C,EAAStwC,KAAK0mF,OAAO72E,cAAc,YACtCygC,GAAiC,IAAvB,OAAA8U,GAAA,GAAW9U,IAAmBs2C,GAAoBE,GAC7D9mF,KAAKmO,UAAU,GAAG,IApJpBnO,KAAKgB,iBAAiB,OAAQ,IAAW,mCACpC,uBAEE,OAAAgqD,GAAA,aACK,OAAA5pD,GAAA,GAAM,MAIbpB,KAAKgV,QAAQlE,gBAAkB,GAAaic,KAAKhrB,MAAMglF,WACxD,GAAah6D,KAAKhrB,MAAMglF,UAAUh9E,OAAO/J,KAAKgV,SAGhDhV,KAAKgnF,WAAahnF,KAAKinF,eAEvB,GAAkBt8D,cAAcumC,OAEhCjR,EAAA,EAAqBinC,sBAAsB9G,QAG7CpgF,KAAKgB,iBAAiB,SAAU,KAC9Bi/C,EAAA,EAAqBknC,wBAAwB/G,IAC7C,GAAkBz1D,cAAcy8D,SAChC,GAAkBz8D,cAAc08D,UAEhCrnF,KAAKC,UAAUG,UAAUuB,OAAO,mBAGlC3B,KAAKgB,iBAAiB,QAAS,KAC7B,GAAkB2pB,cAAcumC,OAIhCjR,EAAA,EAAqBinC,sBAAsB9G,IAC3CngC,EAAA,EAAqB6kC,iBAAgB,EAAM1E,MAG7CpgF,KAAKgB,iBAAiB,SAAU,KAE9Bi/C,EAAA,EAAqBknC,wBAAwB/G,IAC7C,GAAkBz1D,cAAcy8D,SAChC,GAAkBz8D,cAAc08D,UAEhCrnF,KAAKC,UAAUG,UAAUuB,OAAO,iBAEhC3B,KAAKgnF,gBAAatiF,IAIZ,OACR1E,KAAKsnF,SAAW,IAAI,GACpBtnF,KAAKunF,YAAc,IAAI,GACvBvnF,KAAKwnF,QAAU,IAAI,GAEnBxnF,KAAKoO,KAAO,CACVq5E,EAAGznF,KAAKsnF,SACRI,EAAG1nF,KAAKunF,YACRI,EAAG3nF,KAAKwnF,SAGVxnF,KAAKC,UAAYD,KAAKgV,QAAQnF,cAAc,oCAC5C7P,KAAK0mF,OAAS1mF,KAAKgV,QAAQnF,cAAc,eACzC7P,KAAKmO,UAAY,OAAAgiD,EAAA,GAAenwD,KAAK0mF,OAAQ1mF,KAAKC,UAAWD,KAAKsmF,iBAAkB,KAClF,MAAM92E,EAAMxP,KAAKoO,KAAKpO,KAAKqmF,OACxB72E,EAAItB,MACLsB,EAAItB,OAGNsB,EAAIb,qBAAuBa,EAAIb,sBAC/BsxC,EAAA,EAAqB6kC,iBAAgB,EAAO1E,MAG9CpgF,KAAKumF,aAAevmF,KAAKgV,QAAQnF,cAAc,sBAC/C7P,KAAKumF,aAAavlF,iBAAiB,QAAS,KACxB,IAAfhB,KAAKqmF,MACF,GAAgBlwC,YAAY,KAC9B,IAAI,GAAe,IAAiBplC,OAGlC,GAAgBolC,YAAY,KAC9B,IAAI,GAAW,IAAiBplC,SAKtC/Q,KAAKwmF,UAAYxmF,KAAKgV,QAAQnF,cAAc,sBAC5C7P,KAAKwmF,UAAUxlF,iBAAiB,QAAUiB,I,MACxC,MAAMF,EAAQ,GAAagrB,KAAKhrB,MAAM6lF,cACX,QAAvB,EAAA7lF,EAAM0nB,iBAAiB,eAAE8hB,SAC3BxpC,EAAMgwC,iBAAiBpwC,SACfI,EAAM0nB,YACV1nB,EAAM0nB,UAAUjX,YAAYrQ,OAG9BJ,EAAM0nB,UAAUjX,YAAczQ,EAAM0nB,UAAUjX,YAAY/O,MAAM,GAAI,GAFpE1B,EAAM0nB,UAAU9nB,UAMpB,MAAM2Y,EAAQ,IAAI0a,MAAM,QAAS,CAAChI,SAAS,EAAMjG,YAAY,IAC7D,GAAagG,KAAKhrB,MAAM6lF,aAAan5E,cAAc6L,GAGnD,OAAAoD,EAAA,GAAYzb,KAGd,MAAM4lF,EAAiB,mBAEjBC,EAAcD,EAAiB,EAAI,EAczC,OAZGA,GACA7nF,KAAK0mF,OAAO3gE,SAAS,GAAmB3lB,UAAUC,IAAI,QAGxDL,KAAK0mF,OAAO3gE,SAAS+hE,EAAc,GAAqBlsD,QACtD57B,KAAKoO,KAAK05E,GAAa55E,MACxBlO,KAAKoO,KAAK05E,GAAa55E,OAGzBtF,EAAA,QAAU5H,iBAAiB,eAAgBhB,KAAKymF,aAChDzmF,KAAKymF,cAEExjF,MAAMiL,OA8HR,uBAAuByc,EAAyC60D,GACrEx/E,KAAKgB,iBAAiB,QAAS,KAC7B2pB,EAAcumC,SAGhBlxD,KAAKgB,iBAAiB,SAAU,KAC9B,MAAMw9E,EAAO7zD,EAAc80D,YAAYsI,aAEvC,IAAI,MAAM56D,KAAOqxD,EACfgB,EAAoBryD,GAGtBxC,EAAc80D,YAAYuI,iBAG5BhoF,KAAKgB,iBAAiB,SAAU,KAC9B2pB,EAAcwmC,qBAIX,gBACL,OAAOnxD,KAAKinF,gBAAkBjnF,KAAKgnF,WAG7B,eACN,MAAM7gD,EAAMjmC,SAASwnD,eACrB,GAAGvhB,EAAI8hD,YAAc/nF,SAASgoF,gBAAkB,GAAan7D,KAAKhrB,MAAM6lF,aACtE,OAAOzhD,EAAIgiD,WAAW,IAzSZ,GAAAx9D,cAAgB,IAAI,KAgLpB,GAAAu0D,YAAc,CAACJ,EAAmBngD,EAAoBuiD,EAA0BnxB,EAAS,KACrG,IAAIq4B,GAAY,EAEhB,MAAMl+E,EAAaiF,GACdA,IAAO4gD,IAIV+uB,EAAK/4D,SAASgqC,GAAQ3vD,UAAUuB,OAAO,UACvCm9E,EAAK/4D,SAAS5W,GAAI/O,UAAUC,IAAI,UAChC0vD,EAAS5gD,GAEF,GAGHgwE,EAAoB,IAAI3H,GAAkB74C,EAAO1+B,UAAW,CAACooF,EAAOxzE,KAGxE,GAAGxS,KAAKovB,IAAI22D,EAAWzpD,EAAO1+B,UAAUkpC,YAAc,EACpD,OAEAi/C,GAAY,EAGd,MAAME,EAAQ,OAAAljC,GAAA,GAAWvwC,IACrBwzE,GAASC,IAIbp+E,EAAUo+E,GAEPpH,IACEoH,EAAQxJ,EAAK70E,kBAAoB,EAClCi3E,EAAWjhF,UAAUsoF,WAA2B,IAAbD,EAAQ,GAE3CpH,EAAWjhF,UAAUsoF,WAAqB,GAARD,MA+BxC,OA1BAxJ,EAAK99E,iBAAiB,QAAUiB,IAC9B,IAAI4S,EAAS5S,EAAE4S,OAGf,GAFAA,EAAS,OAAAiN,GAAA,GAAgBjN,EAAQ,6BAE7BA,EACF,OAGF,MAAMyzE,EAAQ,OAAAljC,GAAA,GAAWvwC,GAMzB,IAAI3K,EAAUo+E,GACZ,OAGF,MACM93B,GADW7xB,EAAO3D,SAAW2D,EAAO1+B,WAAW8lB,SAASuiE,GACpC93B,UAAY,EAEtC7xB,EAAO1+B,UAAUkpC,UAAYi/C,EAAW53B,IAKnC,CAAC2uB,oBAAmBj1E,cAGf,GAAAymD,aAAe,CAAC1uD,EAAoCumF,GAAa,KAC7E,IAAI3zE,EAAS5S,EAAE4S,OAGf,GAFAA,EAAS,OAAAwsB,GAAA,GAAUxsB,EAAQ,QAEvBA,EAAQ,OAAO,EAEnB,MAAMsxD,EAAStxD,EAAOzI,QAAQ+H,MAC9B,QAAIgyD,IAED,GAAap5C,KAAKhrB,MAAMqkE,wBAAwBD,OAAQzhE,EAAW8jF,IAGjEC,GAAkBxoF,YACnBwoF,GAAkB7C,YAAa,EAC/B6C,GAAkBxoF,UAAUG,UAAUC,IAAI,iBAC1CooF,GAAkBn8E,QAAO,KAGpB,IAEPI,QAAQkK,KAAK,oBAAqBuvD,IAC3B,KAoCb,MAAMsiB,GAAoB,IAAI,GAC9B,KAAeA,kBAAoBA,GACpB,U,2SCpQf,MACMC,GAA6D,IAAI7kF,IAAI,CACzE,4BACA,4BAKF,IAAI8kF,QAD8BjkF,EAG9B,GAAU,EAIC,MAAM,GAkFnB,YACUqoB,EACA29B,EACAjN,EACAmrC,EACAlE,EACAmE,EACAvN,EACAwN,EACAC,EACAC,GAuQR,GAhRQ,KAAAj8D,OACA,KAAA29B,qBACA,KAAAjN,qBACA,KAAAmrC,kBACA,KAAAlE,uBACA,KAAAmE,mBACA,KAAAvN,kBACA,KAAAwN,oBACA,KAAAC,mBACA,KAAAC,wBAjFF,KAAAC,UAAY,IAAIplF,IACjB,KAAA63E,WAAuE,GAEvE,KAAA1uD,QAA2C,GAC3C,KAAAk8D,YAA2B,IAAIrlF,IAC9B,KAAAslF,aAKH,GAEG,KAAAC,cAAe,EACf,KAAAC,mBAAqB,EAKrB,KAAAC,SAAqC,IAAI55E,IACzC,KAAA65E,aAA4B,IAAI1lF,IAKhC,KAAAijB,UAAkC,KAElC,KAAA0iE,eAAiB,EACjB,KAAAC,kBAAoB,EAErB,KAAAC,qBAAsC,KACrC,KAAAC,cAAoG,GACpG,KAAAC,sBAAoC,KACpC,KAAAC,gCAA8C,KAE9C,KAAAC,kBAAoC,KAKpC,KAAAl9D,WAAa,eAMb,KAAAm9D,mBAA+B,GAE/B,KAAAl8C,4BAA6B,EAG7B,KAAAm8C,aAAc,EAMd,KAAAC,aAEH,GAQG,KAAAC,UAAyB,IAAIrmF,IAG7B,KAAAsmF,iBAAkB,EA0tBnB,KAAAC,eAAkBnoF,I,MACvB,IAAI4S,EAAS5S,EAAE4S,OACX43C,EAAsB,KAC1B,IACEA,EAAS,OAAA3qC,GAAA,GAAgBjN,EAAQ,UACjC,MAAMpI,IAER,IAAIggD,EAAQ,OAEZ,GAAGA,EAAOrsD,UAAUuR,SAAS,YAAc,OAAAmQ,GAAA,GAAgBjN,EAAQ,kBAAmB,CACpF,GAAG43C,EAAOrsD,UAAUuR,SAAS,eAAiB3R,KAAKqqF,UAAUjqF,UAAUuR,SAAS,gBAC9E,OAGF,IAAI,MAAMqjD,KAAah1D,KAAKmpF,aAAc,CAExC,GADUnpF,KAAKmpF,aAAan0B,GACvB7nC,MAAQs/B,EAAQ,CACnB,IAAI,GAAgB,IAAIpX,MAAM2f,GAAYh1D,KAAKsqF,YAAY/pE,OAC3D,OAIJ,OAGF,IAAI,uBAAsB,OAAAuB,GAAA,GAAgBjN,EAAQ,QAEhD,YADA7U,KAAK+sB,KAAK+hB,UAAUE,gBAAgByd,GAKtC,GAAGzsD,KAAK+sB,KAAK+hB,UAAUC,aAAe9sC,EAAEyT,UAAW,CACjD,GAAG+2C,EAAOrsD,UAAUuR,SAAS,iBAAqCjN,IAAvB+nD,EAAOrgD,QAAQvF,IACxD,OAMF,OAHA,OAAA6W,EAAA,GAAYzb,GAGT,uBAAsBjC,KAAK+sB,KAAK+hB,UAAUoZ,kBAC3CloD,KAAK+sB,KAAK+hB,UAAUoZ,kBAAexjD,QAKrC1E,KAAK+sB,KAAK+hB,UAAUE,gBAAgB,OAAAltB,GAAA,GAAgBjN,EAAQ,iBAAmB43C,GAIjF,MAAM89B,EAA0B,OAAAzoE,GAAA,GAAgBjN,EAAQ,WACxD,GAAG01E,EAED,YADAvqF,KAAK+sB,KAAKy9D,aAAazjC,aAAawjC,EAAWn+E,QAAQnF,OAAO6gB,YAKhE,GADiC,OAAAhG,GAAA,GAAgBjN,EAAQ,WACzC,CACd,MAAM41E,GAAah+B,EAAOrgD,QAAQvF,IAClC,GAAG7G,KAAKiH,SAAW,KAAiB,CAClC,MAAM7C,EAAUpE,KAAK+sB,KAAKg4B,WAAW0lC,GAC/BxjF,EAASjH,KAAKs7E,gBAAgB75C,UAAUr9B,EAAQg3E,SAASC,kBACzDvwE,EAAW1G,EAAQg3E,SAASsP,gBAC5BC,EAAYvmF,EAAQ+1E,SAASyQ,kBACnC5qF,KAAK+sB,KAAKy9D,aAAaK,WAAW5jF,EAAQ0jF,EAAW7/E,OAChD,CACL,MAAM1G,EAAUpE,KAAK0qD,mBAAmBogC,eAAe9qF,KAAK+sB,KAAKg4B,WAAW0lC,GAAYrmF,KAAcA,EAA4Bu0E,SAAS,GACrIA,EAAUv0E,EAAQu0E,QACrBA,GACD34E,KAAK0qD,mBAAmBqgC,qBAAqB/qF,KAAKiH,OAAQ7C,EAAQyC,KAAKhG,KAAKuD,IAC1EpE,KAAK+sB,KAAKy9D,aAAazjC,aAAa4xB,EAAQI,WAAWjxD,UAAS,QAAOpjB,EAAW,aAAeN,EAAsByC,OAK7H,OAGF,MAAMmkF,EAAM,OAAAlpE,GAAA,GAAgBjN,EAAQ,UACpC,GAAGm2E,EAAK,CACN,MAAMj7E,EAAKi7E,EAAIn7E,cAAc,eAC7B,GAAGgF,IAAW9E,GAAM,OAAA45C,GAAA,GAAc90C,EAAQ9E,GAAK,CAC7C,MAAM3L,EAAU2L,EAAGma,UAAY,IAI/B,OAHAlqB,KAAK+oF,iBAAiBhG,SAAS/iF,KAAKiH,OAAQjH,KAAK+sB,KAAKjiB,SAAU1G,QAChE,OAAAsZ,EAAA,GAAYzb,IAMhB,MAAMg/C,EAAU,OAAAn/B,GAAA,GAAgBjN,EAAQ,eAAiB,OAAAwsB,GAAA,GAAUxsB,EAAQ,mBAAqB,OAAAgnB,GAAA,GAAgBhnB,EAAQ,mBACxH,GAAGosC,GAAWA,IAAYwL,EAAQ,CAChC53C,EAASosC,GAAWpsC,EACpB,MAAMo2E,EAAYp2E,EAAOzI,QAAQnF,QAAU4N,EAAO6+D,aAAa,QACzDwX,EAAYr2E,EAAOzI,QAAQ8+E,UACjC,GAAyB,iBAAhB,GAA4BA,EACnC,GAAGA,EAAW,CACZ,MAAOjkF,EAAQJ,GAAOqkF,EAAU7oE,MAAM,KAEtCriB,KAAK+sB,KAAKy9D,aAAazjC,aAAa9/C,EAAO6gB,YAAajhB,OACnD,CACL,MAAMI,EAASgkF,EAAUnjE,WACtB7gB,IAAW,KACZjH,KAAK+sB,KAAKy9D,aAAazjC,aAAa9/C,GAEpCiuB,GAAM,UAAKlc,OAAO,cAAc,IAKtC,OAaF,GAAGyzC,EAAOrsD,UAAUuR,SAAS,YAAckD,EAAO/D,cAAc1Q,UAAUuR,SAAS,cAAe,CAChG,MAAMw5E,GAAa1+B,EAAOrgD,QAAQvF,IAG5BoN,EAAmB,QAAb,EAFIjU,KAAK+sB,KAAKg4B,WAAWomC,GAEjBr4E,aAAK,eAAE5S,SAM3B,aAJG+T,aAAG,EAAHA,EAAKgyD,kBACN,IAAI,GAAchyD,EAAIgyD,iBAAiB1lD,QAM3C,MAAM6qE,EAAc,OAAAtpE,GAAA,GAAgBjN,EAAQ,uBAC5C,GAAuB,QAAnBA,EAAO02B,UAAsB12B,EAAOzU,UAAUuR,SAAS,WAAakD,EAAOzU,UAAUuR,SAAS,mBAC7FkD,EAAOzU,UAAUuR,SAAS,eAEN,UAAnBkD,EAAO02B,UAAwBkhB,EAAOrsD,UAAUuR,SAAS,UACzDy5E,IAAgBA,EAAYv7E,cAAc,wBAA0B,CACxE,MACMs7E,IADc,OAAArpE,GAAA,GAAgBjN,EAAQ,eAAiB,OAAAiN,GAAA,GAAgBjN,EAAQ,uBAClD43C,GAAQrgD,QAAQvF,IAC7CzC,EAAUpE,KAAK+sB,KAAKg4B,WAAWomC,GACrC,IAAI/mF,EAEF,YADApE,KAAKgvD,IAAIp4C,KAAK,2BAA4Bu0E,GAI5C,MAAME,EAAyB,UACzBC,EAAgB7+B,EAAOrsD,UAAUuR,SAAS05E,GAE1CxwD,EAAIuwD,EAAet4E,GAChB,GAAey4E,mCAAmCz4E,GACtDA,GACgB,UAAZA,EAAM1L,GAAiB,CAAC,QAAS,OAAOszB,SAAS5nB,EAAM3P,MAG1DqF,EAAiE,GACjE+rD,EAAM+2B,EAAgB,CAACH,GAAan0E,OAAOm1C,KAAKnsD,KAAKgtB,SAASvkB,IAAI4pC,IAAMA,GAAGzqC,OAAOuH,IAMtF,MAAM/K,EAAUpE,KAAK+sB,KAAKg4B,WAAW51C,GAC/B2D,EAAQ9S,KAAK0qD,mBAAmBn1C,oBAAoBnR,GAE1D,OAAO0O,GAAS+nB,EAAE/nB,KACjBzK,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAEtBgsD,EAAIjuD,QAAQ6I,IACV,IAAIuY,EACJ,GAAG0jE,EACD1jE,EAAW,0BACN,CAELA,EAAW,qEAETA,GAHe1nB,KAAKgtB,QAAQ7d,GAAI/O,UAAUuR,SAAS,mBAGvC,2BAEA,qCAIhB,MAAMiW,EAAWzf,MAAMC,KAAKpI,KAAKgtB,QAAQ7d,GAAIW,iBAAiB4X,IACxD8jE,EAA4B,IAAI3nF,IACtC,GAAGunF,EACDxjE,EAASthB,QAAS0O,IAChBxM,EAAQ7C,KAAK,CACXqP,QAASA,EAAQnF,cAAc,iBAC/BhJ,KAAMmO,EAAQ5I,QAAQvF,IACtBI,OAAQjH,KAAKiH,eAGZ,CACL,MAAMwkF,IAAgBzrF,KAAKgtB,QAAQ7d,GAAIU,cAAc,6BACrD+X,EAASthB,QAAS0O,IAChB,GAAGy2E,IAAgB,OAAA3pE,GAAA,GAAgB9M,EAAS,4BAA6B,OACzE,IAAI02E,EAAY,OAAA5pE,GAAA,GAAgB9M,EAAS,cACzC,MAAM4zC,EAAS8iC,GAAa12E,EAAQlE,cACjC06E,EAAQ7jF,IAAIihD,KACf4iC,EAAQnrF,IAAIuoD,GACZpgD,EAAQ7C,KAAK,CACXqP,UACAnO,IAAK6kF,GAAaA,EAAUt/E,QAAQvF,IAAMsI,EAC1ClI,OAAQjH,KAAKiH,eAMrBuB,EAAQH,KAAK,CAACC,EAAGC,IAAMD,EAAEzB,IAAM0B,EAAE1B,KAEjC,IAAIxC,EAAMmE,EAAQ2M,UAAUzE,GAAKA,EAAE7J,MAAQskF,GAM3C,OAJG,MACDnrF,KAAKgvD,IAAI,oCAAqCuF,EAAKlwD,EAAKmE,GAGtDA,EAAQnE,KAKZ,IAAI,IACHuV,iBAAiB,CAChB9O,SAAU9K,KAAK+sB,KAAKjiB,SACpB7D,OAAQjH,KAAKiH,OACbE,YAAa,CAACC,EAAGgkF,EAAc,8BAAgC,iCAC/DjiF,UAA8B,cAAnBnJ,KAAK+sB,KAAK5pB,OAAyBmoF,EAC9CxiF,YAAgC,cAAnB9I,KAAK+sB,KAAK5pB,OAExB2tD,UAAU1sD,EAASoE,EAAQnE,GAAK2Q,QAAS,GAAG,EAAMxM,EAAQ/E,MAAM,EAAGY,GAAMmE,EAAQ/E,MAAMY,EAAM,SAE9F,OAAAqZ,EAAA,GAAYzb,SAdVjC,KAAKgvD,IAAI,8BAA+Bn6C,GAqB5C,IAFkE,IAA/D,CAAC,MAAO,MAAO,QAAmB0H,QAAQ1H,EAAO02B,WAAiB12B,EAAS,OAAAwsB,GAAA,GAAUxsB,EAAQ,SAEhD,IAA7C,CAAC,MAAO,QAAQ0H,QAAQ1H,EAAO02B,SAAiD,CACjF,GAAG12B,EAAOzU,UAAUuR,SAAS,iBAAkB,CAC7C,MAAMu5E,EAAYz+B,EAAOrgD,QAAQ8+E,WAC1BjkF,EAAQJ,GAAOqkF,EAAU7oE,MAAM,KAGtC,YADAriB,KAAK+sB,KAAKy9D,aAAazjC,aAAa9/C,EAAO6gB,YAAajhB,GAEnD,GAAGgO,EAAOzU,UAAUuR,SAAS,WAAY,CAC9C,MAAM9K,GAAO4lD,EAAOrgD,QAAQvF,IACtBzC,EAAUpE,KAAK0qD,mBAAmBlxC,iBAAiBxZ,KAAKiH,OAAQJ,GAKtE,YAJA,IAAI,GAAa,CACf,CAAC7G,KAAKiH,QAASjH,KAAK0qD,mBAAmBihC,iBAAiBvnF,KAM5D,IAAIwnF,GAAe,EAEnB,IACEA,IAAiB,OAAA9pE,GAAA,GAAgB7f,EAAE4S,OAAQ,SAC3C,MAAMpI,IAER,GAAGm/E,GAAgBn/B,EAAOrsD,UAAUuR,SAAS,YAA6D,CACxG,MAAM84E,GAAah+B,EAAOrgD,QAAQvF,IAClC7G,KAAK+pF,mBAAmBpkF,KAAK8kF,GAE7B,MAAMrmF,EAAUpE,KAAK+sB,KAAKg4B,WAAW0lC,GAE/BtP,EAAgB/2E,EAAQg3E,SAASC,iBAAmBr7E,KAAKs7E,gBAAgB75C,UAAUr9B,EAAQg3E,SAASC,kBAAoBr7E,KAAKiH,OAC7H4kF,EAAaznF,EAAQg3E,SAAS0Q,gBAEpC9rF,KAAK+sB,KAAKy9D,aAAazjC,aAAao0B,EAAe0Q,EAAY7rF,KAAK+sB,KAAK5pB,KAAMnD,KAAK+sB,KAAKjiB,aA+JxF,KAAA03B,SAAW,KAIbxiC,KAAK6tC,4BAA8B7tC,KAAKopF,eAGvC,wBACCppF,KAAKqpF,mBACNr8E,aAAahN,KAAKqpF,oBACTrpF,KAAKqqF,UAAUjqF,UAAUuR,SAAS,iBAC3C3R,KAAKqqF,UAAUjqF,UAAUC,IAAI,gBAG/BL,KAAKqpF,mBAAqB99E,OAAOC,WAAW,KAC1CxL,KAAKqqF,UAAUjqF,UAAUuB,OAAO,gBAChC3B,KAAKqpF,mBAAqB,GACzB,OAGFrpF,KAAK+K,WAAWghF,mBAAqB,KAAO/rF,KAAK+K,WAAW5F,UAAU2X,QACvE9c,KAAK82C,iBAAiB12C,UAAUC,IAAI,iBACpCL,KAAKopF,cAAe,GACZppF,KAAK82C,iBAAiB12C,UAAUuR,SAAS,mBACjD3R,KAAK82C,iBAAiB12C,UAAUuB,OAAO,iBACvC3B,KAAKopF,cAAe,GAGnBppF,KAAK+sB,KAAKi/D,OAAOC,eAClBjsF,KAAK+sB,KAAKi/D,OAAOC,cAAcC,gBAAgBlsF,KAAK+K,WAAWohF,uBA+9DnE,KAAA7B,WAAct1B,IACZ,MAAM/tD,EAASjH,KAAKiH,OACpBjH,KAAK0qD,mBAAmB0hC,eAAenlF,EAAQ,EAAG,GAAI,EAAG+tD,EAAWh1D,KAAK+sB,KAAKjiB,UAAUjK,KAAKsD,I,OACtE,QAAjB,EAAAA,aAAO,EAAPA,EAAS8G,gBAAQ,eAAE9I,QAGbnC,KAAKiH,SAAWA,GAI1BjH,KAAK+sB,KAAKs/D,aAAcloF,EAAQ8G,SAAS,GAAiBpE,KANxD7G,KAAKgvD,IAAIriD,MAAM,kBA3nGnB3M,KAAK+N,eAAiB,IAAI,IAE1B/N,KAAK82C,iBAAmB52C,SAASC,cAAc,OAC/CH,KAAK82C,iBAAiB12C,UAAUC,IAAI,UAAW,iBAE/CL,KAAKqqF,UAAYnqF,SAASC,cAAc,OACxCH,KAAKqqF,UAAUjqF,UAAUC,IAAI,iBAE7BL,KAAKssF,YAELtsF,KAAK82C,iBAAiB/sC,OAAO/J,KAAK+K,WAAW9K,WAI7CD,KAAKgvD,IAAMhvD,KAAK+sB,KAAKiiC,IACrBhvD,KAAKusF,aAAe,IAAI,GAAavsF,KAAK+sB,MAC1C/sB,KAAK8mB,UAAY,IAAI,KAAqB,CACxCC,YAAY,IAEd/mB,KAAK2qB,cAAgB,IAAI,KACzB3qB,KAAK2qB,cAAc21B,UAAY,GAK/BtgD,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,iBAAkB,EAAE6I,UAAS5B,SAAQJ,UACtE,GAAG7G,KAAK+sB,KAAK/jB,uBAAyBH,EAAS,CAC7C,MAAM4jD,EAASzsD,KAAKgtB,QAAQnmB,GAC5B,IAAI4lD,EAAQ,OAEZ,MAAMroD,EAAUpE,KAAK+sB,KAAKg4B,WAAWl+C,GAErC,IAAI4lD,EAAOrgD,QAAQ4oD,WAAc5wD,EAAQ0kB,KAAO,KAAkBosB,iBAAmB,EAEnF,YADAl1C,KAAKusF,aAAaC,gBAAgB//B,EAAQ5lD,GAI5C7G,KAAKysF,kBAAkBhgC,EAAQroD,GAAS,GAGrCpE,KAAK0sF,mBACN1sF,KAAK2sF,uBASX3sF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,eAAgB,EAAEiH,aAChDjH,KAAKiH,SAAWA,GACjBjH,KAAK4sF,oBAAoB51E,OAAOm1C,KAAKnsD,KAAKgtB,SAASvkB,IAAIoiC,IAAMA,MAKjE7qC,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,eAAiBiC,I,oBAClD,MAAM,QAAC4G,EAAO,OAAE4zB,EAAM,YAAEowD,EAAW,IAAEhmF,GAAO5E,EAG5C,GAAGjC,KAAK+sB,KAAK/jB,uBAAyBH,EACpC,OAKF,MAAMokD,EAAUjtD,KAAKktD,iBAAiBzwB,EAAQowD,IAAgB7sF,KAAKktD,iBAAiBrmD,GACpF,GAAGomD,EAAS,CACV,MAAM7oD,EAAUpE,KAAK+sB,KAAKg4B,WAAWl+C,GAC/B4lD,EAASQ,EAAQR,OAKvB,GAAGroD,EAAQu0E,QAAS,CAClB,MAAMmU,EAAiBrgC,EAAO58C,cAAc,mBACzCi9E,IACDA,EAAe1oF,QAAUA,EACzB0oF,EAAe5+E,QAInB,GAAgB,QAAb,EAAA9J,EAAQ0O,aAAK,eAAE5S,SAAU,CAC1B,MAAMitB,EAAMs/B,EAAO58C,cAAc,iCAAiC4sB,iBAClE,GAAGtP,EAAK,CACN,MAAMltB,EAAY,OAAA6hB,GAAA,GAAgBqL,EAAK,wBAEA,QAAnC,EAA2B,QAA3B,EAAiB,QAAjB,EAAA0/D,EAAY/5E,aAAK,eAAE5S,gBAAQ,eAAEkY,cAAM,eAAEjW,UAAuC,QAA7B,EAAAiC,EAAQ0O,MAAM5S,SAASkY,cAAM,eAAEjW,SAChFgrB,EAAIzD,YAAY+2B,GAAa,CAACr8C,aAG7BnE,IACDA,EAAUmM,QAAQvF,IAAM,GAAKA,IAMnC,GAAGzC,EAAQ2oF,WAAY,CACrB,MAAMtnF,EAAQgnD,EAAO58C,cAAc,2BAA2B4sB,QAA+BgwB,EAC1FhnD,IACDA,EAAK2G,QAAQvF,IAAM,GAAKA,GAI5B,GAAgB,QAAb,EAAAzC,EAAQ0O,aAAK,eAAE69B,KAAM,CACtB,MAAM6B,EAAcia,EAAO58C,cAAc,gBACzC,GAAG2iC,EAAa,CACd,MAAMw6C,EAAU5oF,EAAQ0O,MAAM69B,KAC9B6B,EAAYpuC,QAAUA,EACtBouC,EAAYpvC,aAAa,UAAW4pF,EAAQ79E,IAC5CqjC,EAAYpvC,aAAa,aAAc,GAAKyD,IAIhD,GAAgB,QAAb,EAAAzC,EAAQ0O,aAAK,eAAE5S,SAAU,CAC1B,MAAM8U,EAAUy3C,EAAO58C,cAAc,2BAA2B4sB,+BAAoCA,+BAAoCA,OACrIznB,IACEA,aAAmB,IAAgBA,EAAQ5U,UAAUuR,SAAS,gBAC/DqD,EAAQ5I,QAAQvF,IAAM,GAAKzC,EAAQyC,WAC5BmO,EAAQ5I,QAAQgc,WACtBpT,EAAgB5Q,QAAUA,EAC1B4Q,EAAgB6U,QAAO,IAExB7U,EAAQ5I,QAAQ+H,MAAQ/P,EAAQ0O,MAAM5S,SAASiP,KAWrC,QAAb,EAAA/K,EAAQ0O,aAAK,eAAEga,WAAY2/B,EAAO58C,cAAc,SACjD,eAA2BhP,KAAK,KAC9Bb,KAAKitF,kBAAkB7oF,GAAS,GAAM,EAAOqoD,GAAQ,GACrDzsD,KAAKktF,qBAAqBzgC,UAS9BzsD,KAAKgvD,IAAIp4C,KAAK,kCAAmC3U,GAGnD,MAAM+qB,EAAUhtB,KAAKgtB,QACrB,GAAGA,EAAQyP,GAAS,CAClB,MAAMgwB,EAASz/B,EAAQyP,GACvBzP,EAAQnmB,GAAO4lD,SACRz/B,EAAQyP,GAGb,aAAQ,KACHgwB,EAAOrsD,UAAUuR,SAAS,gBAC3B86C,EAAOrsD,UAAUuB,OAAO,cACxB8qD,EAAOrsD,UAAUC,IAAIL,KAAKiH,SAAW2B,EAAA,QAAU6O,MAA2B,cAAnBzX,KAAK+sB,KAAK5pB,KAAuB,UAAY,cAK1GspD,EAAOrgD,QAAQvF,IAAM,GAAKA,EAS5B,GANG7G,KAAKipF,UAAUthF,IAAI80B,KACpBz8B,KAAKipF,UAAU56E,OAAOouB,GACtBz8B,KAAKipF,UAAU5oF,IAAIwG,IAIC,cAAnB7G,KAAK+sB,KAAK5pB,KAAsB,EACfkyC,KAAKC,MAAQ,IAAO,IACjBu3C,EAAY/jE,KAAO,IAGtC9oB,KAAK4sF,oBAAoB,CAAC/lF,OAKhC7G,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,eAAgB,EAAE6I,UAAS5B,SAAQJ,UAElE,GAAGgC,IAAY7I,KAAK+sB,KAAK/jB,qBAAsB,OAC/C,MAAM5E,EAAUpE,KAAK+sB,KAAKg4B,WAAWl+C,GAC/BomD,EAAU7oD,EAAQ2oF,WAAa/sF,KAAKmtF,iBAAiB/oF,EAAQ2oF,YAAc/sF,KAAKktD,iBAAiBrmD,GACvG,IAAIomD,EAAS,OAEb,MAAMmgC,EAAoC,cAAnBptF,KAAK+sB,KAAK5pB,KAC3BimF,EAAeppF,KAAKopF,aAC1BppF,KAAKitF,kBAAkBhgC,EAAQ7oD,SAAS,GAAM,EAAO6oD,EAAQR,OAAQ2gC,GAClEhE,GACDppF,KAAKktF,qBAAqBjgC,EAAQR,QAGjC2gC,IACAptF,KAAK0pF,sBAAwB7mF,QAAQoD,WAAWpF,KAAK,KACpDb,KAAKqtF,4BAMbrtF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,aAAc,EAAEiH,SAAQ29C,UAAS0oC,kBAEhE,GAAGrmF,IAAWjH,KAAKiH,OAAQ,OAC3B,MACMsmF,EADOvtF,KAAK0qD,mBAAmB5F,eAAeF,GAC5BhhD,OAAO0pF,GAAa78E,KAAK5J,GAAO7G,KAAKgtB,QAAQnmB,IACrE,IAAI0mF,EAAY,OAEhB,MAAMC,EAAc,YAAqBxtF,KAAK0qD,mBAAmB+iC,uBAAuB7oC,GAAU,OAAOl/C,MAEzG1F,KAAKitF,kBAAkBjtF,KAAK+sB,KAAKg4B,WAAWyoC,IAAc,GAAM,EAAOxtF,KAAKgtB,QAAQugE,IAAa,KAIrGvtF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,sBAAuB,EAAEiH,SAAQgB,WAClE,MAAM2kB,EAAa5sB,KAAKitB,gBACxB,eAA2BpsB,KAAK,KAC1B+rB,KAEH3kB,EAAkB3B,QAAQO,IAKzB,YAAe7G,KAAK07E,WAAY,CAAC3zE,EAAK1D,KACpC,GAAG0D,EAAI4zE,WAAa90E,GAAOkB,EAAIozE,gBAAkBl0E,EAAQ,CACvD,MAAM,IAACJ,EAAG,SAAE80E,GAAY37E,KAAK07E,WAAWj3E,OAAOJ,EAAK,GAAG,GAGjDooD,EAASzsD,KAAKgtB,QAAQnmB,GAC5B,IAAI4lD,EAAQ,OAEZ,MAAMroD,EAAUpE,KAAK+sB,KAAKg4B,WAAWl+C,GAEd7G,KAAK0qD,mBAAmBlxC,iBAAiBzR,EAAIozE,cAAeQ,GACjEtgD,gBACTj3B,EAAQ82E,aAGjB,GAAcH,SAAS,CACrBhuD,KAAM/sB,KAAK+sB,KACX0/B,SACAroD,qBASZpE,KAAK+N,eAAe1N,IAAIL,KAAK82C,iBAA7B92C,CAA+C,QAASA,KAAKoqF,gBAE1D,sBAAoB,CACrB,MAAM5gF,EAAY,qBACZkkF,EAAM,GACNC,EAAmB,IAAND,EACnB,IACI74E,EACAxH,EAFAugF,GAAc,EAGlBnnC,GAAsB,CACpBzxC,QAAShV,KAAK82C,iBACdpP,kBAAoBzlC,KACfjC,KAAK+sB,KAAK+hB,UAAUC,cAAgB/uC,KAAK0qD,mBAAmBm8B,cAAc7mF,KAAKiH,OAAQjH,KAAK+sB,KAAKjiB,aAKpG+J,EAAS,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAAQ,UAChCA,IACD,aAAcA,EAAQrL,GAAW,EAAM,KAClCqL,EAAO+0B,WAERv8B,GAIFA,EAAKjN,UAAUuB,OAAO,cACtB0L,EAAK1K,MAAM4pD,QAAU,KAJrBl/C,EAAOnN,SAASC,cAAc,QAC9BkN,EAAKjN,UAAUC,IAAI,qBAAsB,8BAM3CwU,EAA8C9K,OAAOsD,MAG9CwH,GAEXqzB,QAAS,CAACL,EAAOC,KACf8lD,EAAc/lD,GAAS8lD,EAEpBC,IAAgBvgF,EAAKjN,UAAUuR,SAAS,eACzCtE,EAAKjN,UAAUC,IAAI,cAErBgN,EAAK1K,MAAM4pD,QAAU,GAAKlqD,KAAKC,IAAI,EAAGulC,EAAQ8lD,GAE9C,MAAMpzE,GAAKlY,KAAKP,IAAI,EAAGO,KAAKC,IAAIorF,EAAK7lD,IACrChzB,EAAOlS,MAAMga,UAAY,cAAcpC,OACvC,gBAEFgtB,QAAS,KACP,MAAMsmD,EAAUh5E,EAChB,aAAcg5E,EAASrkF,GAAW,EAAO,IAAK,KACzC6D,EAAKyD,gBAAkB+8E,IACxBxgF,EAAKjN,UAAUuB,OAAO,cACtB0L,EAAK1L,YAIT,aAAQ,KAGN,GAFAksF,EAAQlrF,MAAMga,UAAY,GAEvBixE,EAAa,CACd,MAAM,IAAC/mF,GAAOgnF,EAAQzhF,QACtBpM,KAAK+sB,KAAKhrB,MAAM+rF,kBAAkBjnF,GAClC+mF,GAAc,MAIpB1mD,gBAAiB,CAACpb,SAAS,KAiD/B,IAAIc,EA7CD,MACD5sB,KAAK+N,eAAe1N,IAAIL,KAAK82C,iBAA7B92C,CAA+C,WAAaiC,IAC1D,MAAMwqD,EAAS,OAAA3qC,GAAA,GAAgB7f,EAAE4S,OAAQ,iBAAmB,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAAQ,UACtF,GAAG43C,EAAQ,CACT,MAAM5lD,GAAO4lD,EAAOrgD,QAAQvF,IAC5B7G,KAAKgvD,IAAI,iBAAkBhvD,KAAK+sB,KAAKg4B,WAAWl+C,IAChD7G,KAAK+tF,gBAAgBthC,MAKvB,cACFzsD,KAAK+N,eAAe1N,IAAIL,KAAK82C,iBAA7B92C,CAA+C,WAAaiC,IAC1D,GAAGjC,KAAK+sB,KAAK+hB,UAAUC,cACpB/uC,KAAK0qD,mBAAmBm8B,cAAc7mF,KAAKiH,OAAQjH,KAAK+sB,KAAKjiB,UAC9D,OAGF,MAAM+J,EAAS5S,EAAE4S,OACX43C,EAAS53C,EAAOzU,UAAUuR,SAAS,UACvCkD,EACCA,EAAOzU,UAAUuR,SAAS,sBAAwBkD,EAAO/D,cAAgB,KAC5E,GAAG27C,IAAWA,EAAOrsD,UAAUuR,SAAS,gBAAiB,CACvD,MAAM9K,GAAO4lD,EAAOrgD,QAAQvF,IAE5B,GADgB7G,KAAK+sB,KAAKg4B,WAAWl+C,GAC1ByQ,OAAO+Q,YAChB,OAGFroB,KAAK+sB,KAAKhrB,MAAM+rF,iBAAiBjnF,MAKvB7G,KAAKm/E,kBAAoB,IAAI3H,GAAkBx3E,KAAK+K,WAAW9K,UAAW,CAACooF,EAAOxzE,KAChG,IAAI,MAAMmgD,KAAah1D,KAAKmpF,aAAc,CACxC,MAAM6E,EAAchuF,KAAKmpF,aAAan0B,GACtC,GAAGg5B,EAAY/tF,YAAc4U,EAAQ,CACnCm5E,EAAY7gE,IAAI/sB,UAAUkM,OAAO,YAAa+7E,GAC9C,UAON,OAAAp3B,GAAA,GAAuB,KACrBjxD,KAAK6tC,4BAA6B,EAClC7tC,KAAK2qB,cAAcumC,OACnBtkC,EAAa5sB,KAAKitB,iBACjB,KACDjtB,KAAK6tC,4BAA6B,EAE/BjhB,GAAcA,MACf5sB,KAAK2qB,cAAcy8D,SACnBpnF,KAAK2qB,cAAc08D,WAGrBz6D,EAAa,MACZ5sB,KAAK+N,gBAGH,uBAgIL,GA9HA/N,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,iBAAkB,EAAE6I,UAAShC,UAC3DgC,IAAY7I,KAAK+sB,KAAK/jB,uBAErBhJ,KAAK+K,WAAW5F,UAAU2X,OAG5B9c,KAAKiuF,uBAAuB,CAACpnF,IAAM,GAFnC7G,KAAK+sB,KAAKs/D,kBAMdrsF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,sBAAwB+tC,IACzD,KAAK/tC,KAAKiH,UAAU8mC,GAAe,OACnC,MAAMmgD,EAAS/lF,MAAMC,KAAK2lC,EAAa/tC,KAAKiH,SAASxD,QAAQ4E,KAAK,CAACC,EAAGC,IAAMA,EAAID,GAChFtI,KAAKiuF,uBAAuBC,KAG9BluF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,iBAAkB,EAAEiH,SAAQQ,WAC1DR,IAAWjH,KAAKiH,QACjBjH,KAAK4sF,oBAAoBzkF,MAAMC,KAAKX,MAIxCzH,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAiB,EAAEiH,aACjDA,IAAWjH,KAAKiH,SACjBjH,KAAK+sB,KAAKhrB,MAAMosF,iBAChBnuF,KAAKouF,0BAITpuF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,sBAAwBo8B,IACtDA,EAAQp8B,KAAKiH,SACdjH,KAAK+sB,KAAKhrB,MAAMosF,mBAIpBnuF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,yBAA2B6L,IACzD7L,KAAKiH,SAAW4E,EAAO5E,QACxBjH,KAAK+sB,KAAKhrB,MAAMosF,mBAIpBnuF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,cAAgBgS,IACjD,GAAGhS,KAAKiH,SAAW+K,EAAO8V,UAAS,GAAO,CACtB9nB,KAAKqqF,UAAUjqF,UAAUuR,SAAS,gBAClC3R,KAAK0qD,mBAAmBm8B,cAAc7mF,KAAKiH,OAAQjH,KAAK+sB,KAAKjiB,YAG7E9K,KAAKquF,mBACLruF,KAAK+sB,KAAKhrB,MAAMusF,yBAKtBtuF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,mBAAqBiC,IACtD,GAAa,uBAAVA,EAAEsM,IAA8B,CACjC,MAAMggF,EAAiBvuF,KAAK+K,WAAWwjF,eACnCA,GACFvuF,KAAKwuF,0BAGM,YAAqBxuF,KAAKgtB,QAAS,QAC3C1mB,QAAQO,IACX,MAAM4lD,EAASzsD,KAAKgtB,QAAQnmB,GAC5B,GAAG4lD,EAAOrsD,UAAUuR,SAAS,sBAAuB,CAClD,MAAMvN,EAAUpE,KAAK+sB,KAAKg4B,WAAWl+C,GACrC7G,KAAKitF,kBAAkB7oF,OAASM,GAAW,EAAO+nD,MAKnD8hC,EACDvuF,KAAK+K,WAAWo+B,UAAY,MAE5BnpC,KAAKyuF,qBAAqB,IAAI,GAAM,OAAO/pF,MAKjD1E,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAiB,EAAEiH,SAAQ+yE,QAAOnzE,UAChE7G,KAAKiH,SAAWA,GAEnB,aAAQ,KACN,MAAMwlD,EAASzsD,KAAKgtB,QAAQnmB,GAC5B,IAAI4lD,EAAQ,OAEZ,MAAMiiC,EAAoBvmF,MAAMC,KAAKqkD,EAAO38C,iBAAiB,gBAC7D,GAAG4+E,EAAkBvsF,OAAQ,CAC3B,MAAMwlE,EAAM,YAAaqS,EAAO,GAChC,IAAI2U,GAAY,EAChBD,EAAkBpoF,QAAQsoF,KACrBD,GAAaC,EAAU3qF,YAAc0jE,KACtCgnB,GAAY,EACZC,EAAU3qF,UAAY0jE,UAOhC3nE,KAAK6uF,iBAAmB,IAAIzkD,qBAAsBC,IAChDA,EAAQ/jC,QAAQgkC,IACd,GAAGA,EAAMC,eAAgB,CACvB,MAAM11B,EAASy1B,EAAMz1B,OACfhO,EAAM7G,KAAKspF,SAASt5E,IAAI6E,GAC9B7U,KAAK8uF,qBAAqBj6E,EAAQhO,QAKxC7G,KAAK+uF,cAAgB,IAAI3kD,qBAAsBC,IAC7CA,EAAQ/jC,QAAQgkC,IACXA,EAAMC,iBACPvqC,KAAKkqF,UAAU7pF,KAAMiqC,EAAMz1B,OAAuBzI,QAAQvF,KAC1D7G,KAAK+uF,cAAc7jD,UAAUZ,EAAMz1B,QACnC7U,KAAKgvF,iCAKXhvF,KAAKgvF,0BAA4B35D,GAAS,KACxC,MAAMptB,EAAO,IAAIjI,KAAKkqF,WACtBlqF,KAAKkqF,UAAU//E,QAEfnK,KAAK0qD,mBAAmBukC,sBAAsBjvF,KAAKiH,OAAQgB,IAC1D,KAAM,GAAO,GAEb,mBAAoBsD,OAAQ,CAC7B,IAAI2jF,EAAYlvF,KAAK+K,WAAW9K,UAAUkvF,aACtCC,GAAW,EACXC,GAAO,EACPC,EAAW,EACXC,EAAO,EACPC,EAAM,EAEV,MAAMC,EAAc,KAClB,MAAM9uF,EAASX,KAAK+K,WAAW9K,UAAUkvF,aACnCZ,EAAiBvuF,KAAK+K,WAAWwjF,eACpC5tF,IAAWuuF,GAAeG,GAASd,IACpCgB,GAAQL,EAAYvuF,GAOnB4uF,IACDvvF,KAAK+K,WAAWo+B,WAAa9mC,KAAKE,MAAMgtF,IAG1CL,EAAYvuF,EACZ2uF,EAAW,EACXE,EAAM,EACND,EAAO,EACPH,GAAW,EACXC,GAAO,GAGHK,EAAangD,IACdigD,GAAKjkF,OAAO+S,qBAAqBkxE,GACpCA,EAAMjkF,OAAO8S,sBAAsBkxB,EAASkgD,EAAc,KACxDD,EAAMjkF,OAAO8S,sBAAsBoxE,MA4DhB,IAAIE,eAvDHtlD,IACtB,GAAGglD,EAED,YADAK,GAAU,GAIZ,MACM/uF,EADQ0pC,EAAQ,GACDulD,YAAYjvF,OAEjC,IAAIuuF,EAEF,YADAA,EAAYvuF,GAId,MAAMkvF,EAAWX,EAAYvuF,EAC7B,IAAI6wB,EAAOq+D,EAAWN,EACtB,MAAMO,EAAQt+D,EAAO,EAGrB,GAFAA,GAAQs+D,GAEJV,IACFA,GAAW,EAMRS,EAAW,GAAK7vF,KAAK+K,WAAWwjF,gBAOjC,OALEgB,GAAQM,EAGVR,GAAO,OACPK,GAAU,GAWd,GANAJ,GAAY99D,EAMTA,EAAM,CACP,MAAMu+D,EAAgB/vF,KAAK+K,WAAWo+B,UAAY3X,EAClDxxB,KAAK+K,WAAWo+B,UAAY4mD,EAG9BL,GAAU,GAEVH,EAAOO,EACPZ,EAAYvuF,IAKCmoC,QAAQ9oC,KAAK82C,mBAIzB,oBACL,OAAO9/B,OAAOm1C,KAAKnsD,KAAKgtB,SAAS7qB,OAASnC,KAAKkpF,YAAYppF,KAGrD,qBAAqB+U,EAAqBhO,GAChD7G,KAAKupF,aAAalpF,IAAIwG,GACtB7G,KAAK6uF,iBAAiB3jD,UAAUr2B,GAChC7U,KAAKspF,SAASj7E,OAAOwG,GACrB7U,KAAKgwF,eAGC,eACN,GAAGhwF,KAAKiwF,YAAa,OAErB,MAAMrjE,EAAa5sB,KAAKitB,gBACxBjtB,KAAKiwF,YAAcrnF,EAAA,QAAUsnF,KAAKC,aAAatvF,KAAK,KAClD,IAAI+rB,IAAc,OAClB,IAAIhmB,EAAQvE,KAAKP,OAAOqG,MAAMC,KAAKpI,KAAKupF,eAGxC,GAAGvpF,KAAK+K,WAAW5F,UAAU2X,OAAQ,CACnC,MAAMszE,EAAe/tF,KAAKP,OAAOkV,OAAOm1C,KAAKnsD,KAAKgtB,SAASvkB,IAAIuC,IAAMA,IAClEpE,GAASwpF,IACVxpF,EAAQvE,KAAKP,IAAI9B,KAAK0qD,mBAAmBouB,kBAAkB94E,KAAKiH,OAAQjH,KAAK+sB,KAAKjiB,UAAUlE,OAAS,EAAGA,IAI5G5G,KAAKspF,SAAShjF,QAAQ,CAACO,EAAKgO,KACvBhO,GAAOD,GACR5G,KAAK8uF,qBAAqBj6E,EAAQhO,KAItC,MAAMwpF,EAAyB,GAC/B,IAAI,MAAMxpF,KAAO7G,KAAKupF,aAAc,CAClC,MAAMnlF,EAAqBpE,KAAK+sB,KAAKg4B,WAAWl+C,GAC7C7G,KAAK0qD,mBAAmB4lC,gBAAgBlsF,IACzCisF,EAAa1qF,KAAKkB,GActB,OAVA7G,KAAK0qD,mBAAmBhzC,aAAa1X,KAAKiH,OAAQopF,GAElDrwF,KAAKupF,aAAap/E,QAEf,MACDnK,KAAKgvD,IAAI,6BAA8BpoD,GAKlC5G,KAAK0qD,mBAAmB6lC,YAAYvwF,KAAKiH,OAAQL,EAAO5G,KAAK+sB,KAAKjiB,UAAU0B,MAAOC,IACxFzM,KAAKgvD,IAAIriD,MAAM,mBAAoBF,GACnCzM,KAAK0qD,mBAAmB6lC,YAAYvwF,KAAKiH,OAAQL,EAAO5G,KAAK+sB,KAAKjiB,YACjEmW,QAAQ,KACL2L,MACJ5sB,KAAKiwF,iBAAcvrF,EAEhB1E,KAAKupF,aAAazpF,MACnBE,KAAKgwF,oBAMN,yBACLhwF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,uBAAyBiC,IAC1D,MAAM,OAACgF,EAAM,KAAEgB,EAAI,OAAEuyE,GAAUv4E,EAC5BgF,IAAWjH,KAAKiH,QAEhBgB,IACGuyE,GACFx6E,KAAK4sF,oBAAoB3kF,MAM1B,4BACL,MAAMg+C,EAAW,KACfjmD,KAAK+sB,KAAKi/D,OAAO76E,SAASnR,KAAK0qD,mBAAmB3hD,4BAA4B/I,KAAKiH,QAAQnH,OAG7FE,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAiB,EAAEiH,SAAQJ,UACzDI,IAAWjH,KAAKiH,SAEnBjH,KAAKiuF,uBAAuB,CAACpnF,IAC7Bo/C,OAGFjmD,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,mBAAoB,EAAEiH,SAAQgB,WAC5DhB,IAAWjH,KAAKiH,SAEnBjH,KAAK4sF,oBAAoB3kF,GACzBg+C,OAoSG,gBACL,GAAGjmD,KAAK+pF,mBAAmB5nF,OAAQ,CACjC,YAAenC,KAAK+pF,mBAAoB,CAACljF,EAAKxC,KAC5C,MAAMooD,EAASzsD,KAAKgtB,QAAQnmB,GAC5B,IAAI2pF,GAAM,EACV,GAAG/jC,EAAQ,CACT,MAAM5wC,EAAO4wC,EAAO3wC,wBACpB00E,EAAOj0D,GAAA,EAAWC,QAAU,EAAK3gB,EAAKsY,QACjC,CACWn0B,KAAK+sB,KAAKg4B,WAAWl+C,GACzBw0B,UACVm1D,GAAM,GAIPA,GACDxwF,KAAK+pF,mBAAmBtlF,OAAOJ,EAAK,KAIxCrE,KAAK+pF,mBAAmB1hF,KAAK,CAACC,EAAGC,IAAMA,EAAID,GAE3C,MAAMzB,EAAM7G,KAAK+pF,mBAAmBrkF,MACpC1F,KAAK+sB,KAAKs/D,aAAaxlF,QAEvB7G,KAAK+sB,KAAKs/D,eAYP,iBAAiBxQ,GACtB,IAAI7mE,EAAU4mE,GAAkB57E,KAAK+K,WAAW9K,UAAW47E,EAAc,UAkBzE,OAFG7mE,IAASA,EAAU,OAAA8M,GAAA,GAAgB9M,EAAS,WAExCA,EAGF,iBAAiB4vC,GACtB,MAAMx3B,EAAQptB,KAAK0qD,mBAAmB+iC,uBAAuB7oC,GAC7D,IAAI,MAAO/9C,KAAQumB,EACjB,GAAGptB,KAAKgtB,QAAQnmB,GAAM,CACpB,MAAMD,EAAQvE,KAAKP,OAAOsrB,EAAM++B,QAChC,MAAO,CACLM,OAAQzsD,KAAKgtB,QAAQnmB,GACrBA,KAAMA,EACNzC,QAASpE,KAAK+sB,KAAKg4B,WAAWn+C,IAKpC,OAAO,KAGF,sBAAsB6lD,GAC3B,OAAOtkD,MAAMC,KAAKqkD,EAAO38C,iBAAiB,kBAGrC,iBAAiBjJ,EAAazC,EAAUpE,KAAK+sB,KAAKg4B,WAAWl+C,IAClE,GAAGzC,EAAQ2oF,YAAc/sF,KAAK0qD,mBAAmB5F,eAAe1gD,EAAQ2oF,YAAY5qF,OAAS,EAAG,CAC9F,MAAMmG,EAAItI,KAAKmtF,iBAAiB/oF,EAAQ2oF,YACxC,GAAGzkF,EAED,OADAA,EAAEmkD,OAASnkD,EAAEmkD,OAAO58C,cAAc,iCAAiChJ,QAAYyB,EAAEmkD,OAC1EnkD,EAIX,MAAMmkD,EAASzsD,KAAKgtB,QAAQnmB,GAC5B,GAAI4lD,EAEJ,MAAO,CAACA,SAAQ5lD,MAAKzC,WAGf,6BAA6ByC,GACnC,OAAO7G,KAAKgtB,QAAQ,YAAqBhtB,KAAKgtB,SAASvc,KAAKtB,I,MAC1D,QAAGA,EAAKtI,OACiB,QAAhB,EAAA7G,KAAKgtB,QAAQ7d,UAAG,eAAE2B,kBAIxB,gBAAgBqjB,EAAcqb,GAAW,GAE9C,IAAIxvC,KAAKiH,QAEPjH,KAAK+sB,KAAKgyB,gBACV/+C,KAAK6tC,4BACJ1Z,IAAQn0B,KAAKywF,sBAAwBzwF,KAAK+K,WAAW5F,UAAUgvB,OAC9DA,IAAQn0B,KAAK0wF,yBAA2B1wF,KAAK+K,WAAW5F,UAAU2X,QAEpE,OAIF,MAAM3Y,EAAU6S,OAAOm1C,KAAKnsD,KAAKgtB,SAASvkB,IAAI0G,IAAOA,GAAI9G,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAC5E,GAAIpE,EAAQhC,OAEZ,GAAGgyB,EACE,MACDn0B,KAAKgvD,IAAI,qCAAsC7qD,EAAQ,GAAI,SAAUA,EAAQA,EAAQhC,OAAS,GAAIqtC,GAOrFxvC,KAAK2wF,WAAWxsF,EAAQ,IAAI,OAAMO,OAAWA,EAAW8qC,OAClE,CAEL,MAAMH,EAAiBrvC,KAAK0qD,mBAAmBouB,kBAAkB94E,KAAKiH,OAAQjH,KAAK+sB,KAAKjiB,UAGxF,IAA8C,IAA3C3G,EAAQoY,QAAQ8yB,EAAezoC,OAEhC,YADA5G,KAAK4wF,UAAU,UAAU,GAIxB,MACD5wF,KAAKgvD,IAAI,uCAAwC7qD,EAAQA,EAAQhC,OAAS,GAAIqtC,GAGjExvC,KAAK2wF,WAAWxsF,EAAQA,EAAQhC,OAAS,IAAI,GAAO,OAAMuC,EAAW8qC,IAqCjF,YACLxvC,KAAK+K,WAAa,IAAI,IAAW,KAAM,KAAiB,KACxD/K,KAAK4wF,UAAU,OAAO,GACtB5wF,KAAK4wF,UAAU,UAAU,GAEzB5wF,KAAK+K,WAAW9K,UAAU8J,OAAO/J,KAAKqqF,WAatCrqF,KAAK+K,WAAWwiC,mBAAqBvtC,KAAKwiC,SAC1CxiC,KAAK+K,WAAW8lF,cAAgB,IAAM7wF,KAAK8wF,iBAAgB,GAC3D9wF,KAAK+K,WAAWM,iBAAmB,IAAMrL,KAAK8wF,iBAAgB,GAG3D,wBACD9wF,KAAK+K,WAAW9K,UAAUe,iBAAiB,YAAa,KACnDhB,KAAKqpF,mBACNr8E,aAAahN,KAAKqpF,oBACTrpF,KAAKqqF,UAAUjqF,UAAUuR,SAAS,iBAC3C3R,KAAKqqF,UAAUjqF,UAAUC,IAAI,iBAE9B,CAACib,SAAS,IAEbtb,KAAK+K,WAAW9K,UAAUe,iBAAiB,WAAY,KACjDhB,KAAKqqF,UAAUjqF,UAAUuR,SAAS,kBAInC3R,KAAKqpF,oBACNr8E,aAAahN,KAAKqpF,oBAGpBrpF,KAAKqpF,mBAAqB99E,OAAOC,WAAW,KAC1CxL,KAAKqqF,UAAUjqF,UAAUuB,OAAO,gBAChC3B,KAAKqpF,mBAAqB,GACzB,QACF,CAAC/tE,SAAS,KAIV,uBACL,MAAM+zB,EAAiBrvC,KAAK0qD,mBAAmBouB,kBAAkB94E,KAAKiH,OAAQjH,KAAK+sB,KAAKjiB,UAClFlE,EAAQ5G,KAAKiH,SAAW2B,EAAA,QAAU6O,KAAO43B,EAAe8pC,UAAY9pC,EAAe0hD,gBAIzF,IAAI,MAAMC,KAAShxF,KAAKipF,UACtB,GAAG+H,EAAQ,GAAKA,GAASpqF,EAAO,CAC9B,MAAM6lD,EAASzsD,KAAKgtB,QAAQgkE,GAC5B,GAAGvkC,EAAQ,CACT,GAAGA,EAAOrsD,UAAUuR,SAAS,cAC3B,SAGF86C,EAAOrsD,UAAUuB,OAAO,UAAW,cACnC8qD,EAAOrsD,UAAUC,IAAI,WAGvBL,KAAKipF,UAAU56E,OAAO2iF,IAKrB,oBAAoB/oF,EAAgBgpF,GAAY,GACrDhpF,EAAK3B,QAAQO,IACX,KAAKA,KAAO7G,KAAKgtB,SAAU,OAK3B,MAAMy/B,EAASzsD,KAAKgtB,QAAQnmB,UACrB7G,KAAKgtB,QAAQnmB,GACpB7G,KAAKkpF,YAAY76E,OAAOxH,GAErB7G,KAAK8pF,oBAAsBr9B,IAC5BzsD,KAAK8pF,kBAAoB,MAG3B9pF,KAAKusF,aAAanY,aAAa3nB,GAC5BzsD,KAAK6uF,mBACN7uF,KAAK6uF,iBAAiB3jD,UAAUuhB,GAChCzsD,KAAKspF,SAASj7E,OAAOo+C,IAEpBzsD,KAAK+uF,gBACN/uF,KAAK+uF,cAAc7jD,UAAUuhB,GAC7BzsD,KAAKkqF,UAAU77E,OAAOxH,IAGxB4lD,EAAO9qD,SAGJ3B,KAAKkxF,sBAAwBrqF,IAC9B7G,KAAKkxF,yBAAsBxsF,KAI5BusF,GAAajxF,KAAK+sB,KAAK+hB,UAAUC,aAClC/uC,KAAK+sB,KAAK+hB,UAAUqiD,mBAAmBnxF,KAAKiH,OAAQgB,GAGtDg4C,EAAA,EAAqB6kC,iBAAgB,EAAOz3D,IAC5CrtB,KAAKqtF,wBAGA,uBAAuBplF,EAAgBmhF,GAC5C,IAAIppF,KAAK+K,WAAW5F,UAAU2X,OAE5B,OAGC9c,KAAK+sB,KAAKjiB,WACX7C,EAAOA,EAAKL,OAAOf,IACjB,MACMuqF,EADUpxF,KAAK+sB,KAAKg4B,WAAWl+C,GACbu0E,SACxB,OAAOgW,IAAYA,EAAQ1G,iBAAmB0G,EAAQtF,mBAAqB9rF,KAAK+sB,KAAKjiB,YAIzF7C,EAAOA,EAAKL,OAAOf,IAAQ7G,KAAKgtB,QAAQnmB,IAMpCuiF,IACFA,EAAeppF,KAAKopF,gBAAkBppF,KAAK0sF,mBAAqB1sF,KAAK0sF,oBAAsB1sF,KAAKqxF,kBAGlG,MAAMzkE,EAAa5sB,KAAKitB,gBACxB,IACIqkE,EADAC,GAAkB,EAEtB,IAAIvxF,KAAKmqF,gBAAiB,CACxB,MAAM,aAACqH,EAAY,aAAE/gC,GAAgBzwD,KAAK+K,WAAW9K,UACrDsxF,EAAkBC,IAAiB/gC,EAShC8gC,IAIDD,EAAetxF,KAAKqqF,UACpBiH,EAAa3uF,MAAM8uF,WAAaD,EAAe,KAC/CxxF,KAAK+K,WAAWo+B,UAAYsnB,EAC5BzwD,KAAKmqF,iBAAkB,GAI3B,MAAMhkF,EAAUnG,KAAKyuF,qBAAqBxmF,GAAM,GAAO,GACpDmhF,GACDjjF,EAAQtF,KAAK,KACX,IAAI+rB,IAAc,OAKlB,IAAI6/B,EACkB,cAAnBzsD,KAAK+sB,KAAK5pB,OACXspD,EAASzsD,KAAKgtB,QAAQ3qB,KAAKP,OAAOmG,KAGpC,MAAM9B,EAAUnG,KAAK2sF,kBAAkBlgC,IAAW5pD,QAAQoD,UACvDsrF,GACDprF,EAAQtF,KAAK,KACR+rB,KAAgB2kE,IACjBD,EAAa3uF,MAAM8uF,WAAa,GAChCzxF,KAAKmqF,iBAAkB,OAc5B,gBACL,MAAMuH,EAAgB1xF,KAAK2xF,mBAC3B,GAAGD,EACD,OAAOA,EAAc3/C,iBAIlB,eACL/8B,EACAof,EACAw9D,EACAC,GAGA,MAAMplC,EAAS,OAAA3qC,GAAA,GAAgB9M,EAAS,UAGxC,GAAgB,WAAbof,GAAyB,OAAAgxB,GAAA,GAAWqH,MAAazsD,KAAKm/E,kBAAoB,EAAI,GAAI,CACnF,MAAM2S,EAAYrlC,EAAO37C,cACI,IAA1B,OAAAs0C,GAAA,GAAW0sC,KACZ98E,EAAU88E,EACV19D,EAAW,SAIf,MAAM29D,EAAoB/xF,KAAK+sB,KAAKhrB,MAAM6lF,cAAgB5nF,KAAK+sB,KAAKhrB,MAAM6lF,aAAaxnF,UAAUuR,SAAS,uBAA0B3R,KAAK+sB,KAAK9sB,UAAUG,UAAUuR,SAAS,sBAC3K,OAAO3R,KAAK+K,WAAW8zB,kBACrB7pB,EACAof,EACA,OACA1vB,EACAktF,EACAC,EACA,IACAE,EAAmB,EAAEl2E,WAGnB,IAAIlb,EAAS47B,GAAA,EAAWC,QAIxB,OAFA77B,GAAUX,KAAK82C,iBAAiB0Z,UAChC7vD,GAAUujB,EAAA,EAAWC,UAAYoY,GAAA,EAAWC,QAAU,IAAM,GAAK,GAC1D77B,QAKL+D,GAID,kBAAkB+nD,EAASzsD,KAAKqxF,iBAKrC,GAAG5kC,EAAQ,CACTzsD,KAAK0sF,kBAAoBjgC,EACzB,MAAM7/B,EAAa5sB,KAAKitB,gBACxB,OAAOjtB,KAAKgyF,eAAevlC,EAAQ,WAAO/nD,OAAWA,GAAW7D,KAAK,KAC/D+rB,MACJ5sB,KAAK0sF,uBAAoBhoF,MAMvB,mBACN,IAAkButF,EAAdC,EAAW,EACf,IAAI,MAAMlnF,KAAKhL,KAAKmpF,aAAc,CAChC,MAAM6E,EAAchuF,KAAKmpF,aAAan+E,GACnCgjF,EAAYmE,eAAiBD,IAC9BD,EAAWjE,EAAY/tF,UACvBiyF,EAAWlE,EAAYmE,gBAI3B,OAAOF,EAGF,qBAAqBxlC,GACvBA,EAAO37C,cAAcihC,mBAAqB0a,GAC3CzsD,KAAK2xF,mBAAmB7gF,cAAcihC,mBAAqB0a,EAAO37C,eAClE9Q,KAAK2sF,kBAAkBlgC,GAIpB,gBAAgBz3C,GACrB,MAAMo9E,EAAa,mBAChBp9E,EAAQ5I,QAAQgmF,KACjBplF,cAAcgI,EAAQ5I,QAAQgmF,IAC9Bp9E,EAAQ5U,UAAUuB,OAAO,kBACpBqT,EAAQ8pB,aAGf9pB,EAAQ5U,UAAUC,IAAI,kBACtB2U,EAAQ5I,QAAQgmF,GAAc,GAAK5mF,WAAW,KAC5CwJ,EAAQ5U,UAAUuB,OAAO,yBAClBqT,EAAQ5I,QAAQgmF,IACtB,KAGE,0BAA0BhuF,EAAcU,GAC7C,MAAMgkB,EAAO,IAAIusB,KAAoB,IAAfjxC,EAAQ0kB,MAC9BA,EAAKmsC,SAAS,EAAG,EAAG,GACpB,MAAME,EAAgBrsC,EAAKssC,UAC3B,IAAIp1D,KAAKmpF,aAAah0B,GAAgB,CACpC,IAAIM,EAEJ,MAAM48B,EAAQ,IAAIh9C,KAClBg9C,EAAMp9B,SAAS,EAAG,EAAG,EAAG,GAExB,MAAMnsD,EAAiC,cAAnB9I,KAAK+sB,KAAK5pB,KAE9B,GAAGkvF,EAAMj9B,YAActsC,EAAKssC,UAC1BK,EAAc,eAAK3sD,EAAc,8BAAgC,mBAC5D,GAAGA,GClpD0B,aDkpDX1E,EAAQ0kB,KAC/B2sC,EAAc,eAAK,mCACd,CACL,MAAMzyD,EAAsC,CAC1C8zE,IAAK,UACLxhB,MAAO,QAGNxsC,EAAKysC,gBAAkB88B,EAAM98B,gBAC9BvyD,EAAQwyD,KAAO,WAGjBC,EAAc,IAAI,UAAKC,gBAAgB,CACrC5sC,OACA9lB,YACCgS,QAEAlM,IACD2sD,EAAc,eAAK,yBAA0B,CAACA,KAIlD,MAAMhJ,EAASvsD,SAASC,cAAc,OACtCssD,EAAOjjD,UAAY,yBACnB,MAAM8oF,EAAgBpyF,SAASC,cAAc,OAC7CmyF,EAAclyF,UAAUC,IAAI,kBAC5B,MAAMkyF,EAAaryF,SAASC,cAAc,OAC1CoyF,EAAWnyF,UAAUC,IAAI,eAEzBkyF,EAAWxoF,OAAO0rD,GAElB68B,EAAcvoF,OAAOwoF,GACrB9lC,EAAO1iD,OAAOuoF,GAGd,MAAMryF,EAAYC,SAASC,cAAc,OACzCF,EAAUuJ,UAAY,qBACtBvJ,EAAU8J,OAAO0iD,GAEjBzsD,KAAKmpF,aAAah0B,GAAiB,CACjChoC,IAAKs/B,EACLxsD,YACAkyF,eAAgBrpE,EAAKssC,WAGvB,MAAMO,EAAiB,YAAqB31D,KAAKmpF,aAAc,OAC/D,IAA2CxoE,EAAvC3V,EAAI,EAAG7I,EAASwzD,EAAexzD,OACnC,KAAM6I,EAAI2qD,EAAexzD,SAAU6I,EAAG,CACpC,MAAM0F,EAAIilD,EAAe3qD,GAEzB,GADA2V,EAAe3gB,KAAKmpF,aAAaz4E,GAAGzQ,UACjCk1D,EAAgBzkD,EACjB,MAID1F,IAAM7I,GAAUwe,IACjBA,EAAeA,EAAauX,oBAG1BvX,EAGF3gB,KAAKqqF,UAAU1pE,aAAa1gB,EAAW0gB,GAFvC3gB,KAAKqqF,UAAUtgF,OAAO9J,GAKrBD,KAAKm/E,mBACNn/E,KAAKm/E,kBAAkBG,2BAA2Br/E,GAItD,OAAOD,KAAKmpF,aAAah0B,GAGpB,UAGLn1D,KAAK+K,WAAW8lF,cAAgB7wF,KAAK+K,WAAWM,iBAAmBrL,KAAK+K,WAAWwiC,mBAAqB,KAExGvtC,KAAK+N,eAAeO,YAEpBtO,KAAK2qB,cAAcxgB,QACnBnK,KAAK6uF,kBAAoB7uF,KAAK6uF,iBAAiBrW,aAC/Cx4E,KAAK+uF,eAAiB/uF,KAAK+uF,cAAcvW,aACzCx4E,KAAKm/E,mBAAqBn/E,KAAKm/E,kBAAkB3G,oBAE1Cx4E,KAAK2qB,cACZ3qB,KAAK6uF,yBAA2B7uF,KAAK6uF,iBACrC7uF,KAAK+uF,sBAAwB/uF,KAAK+uF,cAClC/uF,KAAKm/E,0BAA4Bn/E,KAAKm/E,kBAGjC,QAAQqT,GAAa,GAE1BxyF,KAAK4wF,UAAU,OAAO,GACtB5wF,KAAK4wF,UAAU,UAAU,GAGzB,aAAqB5wF,KAAK+K,WAAW9K,WAGrC,oBAEmByE,IAAhBikF,KACDA,QA/pD4BjkF,GAkqD9B1E,KAAKgtB,QAAU,GACfhtB,KAAKkpF,YAAY/+E,QACjBnK,KAAKmpF,aAAe,GACpBnpF,KAAKusF,aAAa79E,UAClB1O,KAAKipF,UAAU9+E,QACfnK,KAAK07E,WAAWv5E,OAAS,EACzBnC,KAAK2qB,cAAcxgB,QAGhBqoF,IACDxyF,KAAK+K,WAAW9K,UAAUuS,YAAc,IAG1CxS,KAAK8pF,kBAAoB,KACzB9pF,KAAKyyF,sBAAuB,EAE5BzyF,KAAK2pF,cAAcxnF,OAAS,EAC5BnC,KAAK0pF,qBAAuB,KAE5B1pF,KAAKywF,qBAAuBzwF,KAAK0wF,6BAA0BhsF,EAC3D1E,KAAK0yF,qBAAkBhuF,EAEpB1E,KAAKm/E,mBACNn/E,KAAKm/E,kBAAkB3G,aAGtBx4E,KAAK6uF,mBACN7uF,KAAK6uF,iBAAiBrW,aACtBx4E,KAAKspF,SAASn/E,QACdnK,KAAKupF,aAAap/E,QAClBnK,KAAKiwF,iBAAcvrF,GAGlB1E,KAAK+uF,gBACN/uF,KAAK+uF,cAAcvW,aACnBx4E,KAAKkqF,UAAU//E,SAGjBnK,KAAKwpF,eAAiBxpF,KAAKypF,kBAAoB,EAE/CzpF,KAAK4sB,WAAWhX,QAEhB5V,KAAK2yF,qBAAkBjuF,EACvB1E,KAAK4yF,4BAAyBluF,EAC9B1E,KAAKkxF,yBAAsBxsF,EAE3B1E,KAAK0sF,uBAAoBhoF,EAGzB1E,KAAKmqF,iBAAkB,EAGlB,QAAQljF,EAAgB0jF,G,MAI7B,IAAI1jF,EAGF,OAFAjH,KAAK0O,SAAQ,GACb1O,KAAKiH,OAASA,EACP,KAGT,MAAM4rF,EAAW7yF,KAAKiH,SAAWA,EAM3B6rF,EAAW9yF,KAAK+sB,KAAK5pB,KAEX,cAAb2vF,IACDnI,EAAY,GAGd3qF,KAAKqvC,eAAiBrvC,KAAK0qD,mBAAmBouB,kBAAkB7xE,EAAQjH,KAAK+sB,KAAKjiB,UAClF,IAAIioF,EAA0B,WAAbD,EAAwB9yF,KAAK0qD,mBAAmBsoC,eAAe/rF,GAAQL,MAAiC,QAAzB,EAAA5G,KAAKqvC,eAAezoC,aAAK,QAAI,EAC7H,MAAMqsF,OAAyBvuF,IAAdimF,EAOjB,IAAmBuI,EAAf/Z,EAAY,EACZ8Z,IACEJ,IACFK,EAAgBlzF,KAAK+sB,KAAKy9D,aAAa2I,qBAAqBnzF,KAAK+sB,OAGhEmmE,GAEOH,IACR5Z,EAAYn5E,KAAK0qD,mBAAmB0oC,qBAAqBnsF,EAAQjH,KAAK+sB,KAAKjiB,UAEzE6/E,EAD0BxR,IAAc0Z,EAC5B1Z,EAEA4Z,IAMlB,MAAMM,EAAS1I,IAAcoI,GAEvB,WAAChoF,GAAc/K,KAErB,GAAG6yF,EAAU,CACX,MAAM5lC,EAAUjtD,KAAKktD,iBAAiBy9B,GACtC,GAAG19B,EAWD,OAVGgmC,GACDjzF,KAAKgyF,eAAe/kC,EAAQR,OAAQ,UACpCzsD,KAAK+tF,gBAAgB9gC,EAAQR,QAC7BzsD,KAAK+sB,KAAKte,cAAc,UAAWk8E,GAAW,IACtCoI,IAAeM,IAEvBtoF,EAAWo+B,UAAYp+B,EAAW0lD,aAClCzwD,KAAK+sB,KAAKte,cAAc,UAAWk8E,GAAW,IAGzC,UAGN3qF,KAAKiH,SACNjH,KAAK2qB,cAAc21B,UAAY,GAC/BtgD,KAAK+sB,KAAKumE,WAAWC,WAAWvzF,KAAK+sB,KAAKC,QAAQrC,cAAc21B,UAGlEtgD,KAAKiH,OAASA,EACdjH,KAAK+pF,mBAAmB5nF,OAAS,EAEjCnC,KAAKiqF,aAAe,CAClBuJ,wBAAyBxzF,KAAKs7E,gBAAgBtO,WAAW/lE,IAAWjH,KAAK4oF,gBAAgB6K,MAAMxsF,IAIhG,MACDjH,KAAKgvD,IAAI,kBAAmB/nD,EAAQjH,KAAKqvC,eAAgBs7C,EAAWoI,GAItE,MAAMW,EAAgBL,GAAuB,cAAbP,EAA2B,EAAIC,EAQ/D,IAAIY,EAAc,EAClB,GAAGd,EAAU,CACX,IAAI9iF,EAAK/P,KAAK4zF,iBAAiB,UAE5B7jF,IACD4jF,GAAe5jF,EAAG3D,QAAQvF,KAGzB8sF,GAAe,IAChBA,EAActxF,KAAKP,OAAOkV,OAAOm1C,KAAKnsD,KAAKgtB,SAASvkB,IAAI5B,IAAQA,UAGlE7G,KAAKgqF,aAAc,EAGrB,MAAM6J,EAAe7zF,KAAKqqF,UAC1BrqF,KAAK0O,UACL,MAAM27E,EAAYrqF,KAAKqqF,UAAYnqF,SAASC,cAAc,OAU1D,IAAIkG,EATDwsF,GACDxI,EAAU7gF,UAAYqqF,EAAarqF,UACnC6gF,EAAUjqF,UAAUuB,OAAO,gBAAiB,iBAE5C0oF,EAAUjqF,UAAUC,IAAI,iBAG1BL,KAAK2qB,cAAcumC,OAMjB7qD,EAHE6sF,EAGO,CACP/sF,QAAS,eAA2BtF,KAAK,IAChCb,KAAKyuF,qBAAqByE,EAAcjrF,MAAM,GAAM,OAAOvD,IAEpEoU,QAAQ,GAND9Y,KAAK2wF,WAAWhG,GAAW,EAAM0I,EAAQK,GAUpD,MAAM,QAACvtF,EAAO,OAAE2S,GAAUzS,EAGtByS,GACE+5E,IACF9nF,EAAW9K,UAAUuS,YAAc,GAEnCxS,KAAK+sB,KAAKshE,iBAAiB4E,EAAUI,EAAQ1I,GAC7C3qF,KAAK8mB,UAAUkE,OAAOhrB,KAAK82C,mBAQ/BmJ,EAAA,EAAqB6zC,UAAUzmE,IAC/B,MAAM0xB,EAAiB54C,EAAQtF,KAAK,KA8BlC,GA3BGiY,EACG+5E,GACF7yF,KAAK+sB,KAAKshE,iBAAiB4E,EAAUI,EAAQ1I,GAG/C3qF,KAAK8mB,UAAUi5B,SAGd//C,KAAK4yF,yBACN5yF,KAAK4yF,yBACL5yF,KAAK4yF,4BAAyBluF,GAKhCqG,EAAWohF,oBAAsB,EACjCphF,EAAWgpF,cAAgB,EAC3B,OAAAxnF,EAAA,GAAexB,EAAW9K,UAAWoqF,GAErCpqC,EAAA,EAAqB+zC,YAAY3mE,IACjC4yB,EAAA,EAAqB6kC,iBAAgB,EAAOz3D,IAG1CrtB,KAAK2qB,cAAcy8D,SAIlB8L,EACDnoF,EAAWo+B,UAAY+pD,EAAc/+D,SAYhC,GAAI4+D,GAAcM,GAAWJ,EAAU,CAC5C,MAAMgB,EAASN,EAAc,IAAMA,EAAchJ,GAAaA,EAAY,GACpEuJ,EAAkB/a,IAAcwR,IAAcsI,GAChDgB,GAAUpB,EACZ9nF,EAAWo+B,UAAY,MACf8qD,IACRlpF,EAAWo+B,UAAY,GAGzB,MAAMgrD,EAAqBn0F,KAAKktD,iBAAiBy9B,GACjD,IAAIl+B,EAAuBynC,GAAmBl0F,KAAK8pF,oBAAsBqK,aAAkB,EAAlBA,EAAoB1nC,SACzFA,aAAM,EAANA,EAAQ37C,iBACV27C,EAASzsD,KAAKo0F,6BAA6BzJ,IAI1Cl+B,IACDzsD,KAAKgyF,eAAevlC,EAAQynC,EAAkB,QAAU,SAAWrB,OAAmCnuF,EAAxB,KAAey6B,QACzF+0D,GACFl0F,KAAK+tF,gBAAgBthC,SAIzB1hD,EAAWo+B,UAAY,MAGzBnpC,KAAKwiC,WAEL,MAAM5V,EAAa5sB,KAAKitB,gBAClBonE,EAAkBxxF,QAAQC,IAAI,CAACi8C,EAAgB,iBACrDs1C,EAAgBxzF,KAAK,KACnBkK,EAAWgvB,qBAGb/5B,KAAK+sB,KAAKte,cAAc,UAAWk8E,GAAY0I,GAE/C,MAAMiB,EAAoBt0F,KAAK0qD,mBAAmB6pC,sBAAsBttF,GA4DxE,GA3DqBisF,GAAiBoB,EAOpCD,EAAgBxzF,KAAK,KACnB,GAAI+rB,MAIJ7hB,EAAWgvB,mBAERu6D,GAAmB,CACpB,MAAMz5D,EAAI,KACR76B,KAAK0yF,gBAAkB,IAAI7vF,QAAeoD,IACpC2mB,KAAiB5sB,KAAK0qD,mBAAmB6pC,sBAAsBttF,GAKnEjH,KAAK0qD,mBAAmB8pC,cAAcvtF,EAAQjH,KAAK+sB,KAAKjiB,UAAUjK,KAAMwuC,IACtE,IAAIziB,MAAiByiB,EAEnB,YADAppC,IAIF,MACMwuF,EADQplD,EAAelrC,QAAQV,MACXw5B,MAAM,KAASy3D,QACtC3pF,EAAW5F,UAAU2X,QAAU/R,EAAW5F,UAAU2X,SAAW23E,IAChEz0F,KAAK4wF,UAAU,SAAU6D,GACzBz0F,KAAKwiC,YAGPh3B,WAAWqvB,EAAG,KACd50B,MAlBAA,MAoBDgb,QAAQ,KACTjhB,KAAK0yF,qBAAkBhuF,KAIxBmuF,EACDrnF,WAAWqvB,EAAG,KAEdA,OA3CF8vD,IAAa3qF,KAAKgtB,QAAQ+lE,IAAepI,IAAcoI,GACzD/yF,KAAK4wF,UAAU,UAAU,GAgD7B5wF,KAAKgvD,IAAI,mBAAoBjkD,EAAW5F,UAAU2X,QAG/C/R,EAAW5F,UAAU2X,QAAUi2E,IAAe/yF,KAAKspF,SAASxpF,MAC7DE,KAAK20F,oBAGS,SAAb7B,EAAqB,CACtB,MAAMjnF,EAAS7L,KAAK0qD,mBAAmBkqC,cAAc3tF,IAClD4E,aAAM,EAANA,EAAQyL,OAAOu9E,cAChB70F,KAAK0qD,mBAAmBoqC,iBAAiB7tF,GAAQ,MAUpDuF,MAAMC,IAGP,MAFAzM,KAAKgvD,IAAIriD,MAAM,4BAA6BF,GAC5CzM,KAAK8mB,UAAUi5B,SACTtzC,IAGR,MAAO,CAACqM,SAAQ3S,QAAS44C,GAGpB,oBACL,GAAsB,SAAnB/+C,KAAK+sB,KAAK5pB,MAAsC,eAAnBnD,KAAK+sB,KAAK5pB,KAAuB,CAC/D,MAAM0F,EAAU7I,KAAK0qD,mBAAmBouB,kBAAkB94E,KAAKiH,OAAQjH,KAAK+sB,KAAKjiB,UACjF9K,KAAK0qD,mBAAmB6lC,YAAYvwF,KAAKiH,OAAQ4B,EAAQjC,MAAO5G,KAAK+sB,KAAKjiB,UAAU,IAIjF,mBACL,MAAM7D,EAASjH,KAAKiH,OACdo7B,EAAYriC,KAAKs7E,gBAAgBj5C,UAAUp7B,GAC3C8tF,EAAW/0F,KAAK0qD,mBAAmBm8B,cAAc5/E,EAAQjH,KAAK+sB,KAAKjiB,UAEzE9K,KAAKqqF,UAAUjqF,UAAUkM,OAAO,aAAcyoF,GAC9C/0F,KAAK82C,iBAAiB12C,UAAUkM,OAAO,wBAAyByoF,GAEhE/0F,KAAKqqF,UAAUjqF,UAAUkM,OAAO,UAAWtM,KAAK+sB,KAAKigD,cACrDhtE,KAAKqqF,UAAUjqF,UAAUkM,OAAO,aAAc+1B,GAGzC,oBAAoBj+B,EAAcqoD,EAAqB3nD,EAAkBu5B,GAU9Er+B,KAAK2pF,cAAchkF,KAAK,CAACvB,UAASqoD,SAAQ3nD,UAASu5B,aAEnDr+B,KAAKwuF,0BAGA,2BACFxuF,KAAK0pF,sBAAyB1pF,KAAK2pF,cAAcxnF,SAEpDnC,KAAK0pF,qBAAuB,IAAI7mF,QAAQ,CAACoD,EAASylB,KAChDlgB,WAAW,KACT,MAAMwpF,EAAQh1F,KAAK2pF,cAAclmF,QACjCzD,KAAK2pF,cAAcxnF,OAAS,EAE5B,MAAMk8B,EAAW22D,EAAMjxD,OAAO,CAACC,GAAM3F,cAAc2F,EAAIpgC,OAAOy6B,GAAW,IAMzEr+B,KAAKgvD,IAAI,mBAAoB3wB,EAAU22D,EAAOh1F,KAAK6tC,4BACnD,MAAMjhB,EAAa5sB,KAAKitB,gBACxBpqB,QAAQC,IAAIu7B,GAAUx9B,KAAK,KACzB,IAAI+rB,IACF,KAAM,yCAGL5sB,KAAK4pF,uBACN5pF,KAAK4pF,wBAGJ5pF,KAAK6pF,iCACN7pF,KAAK6pF,kCAGPmL,EAAM1uF,QAAQ,EAAElC,UAASqoD,SAAQ3nD,cAC/B9E,KAAKysF,kBAAkBhgC,EAAQroD,EAASU,KAIxCmB,IAEFjG,KAAK0pF,qBAAuB,KAEzB1pF,KAAK2pF,cAAcxnF,QACpBnC,KAAKwuF,0BAGPxuF,KAAKi1F,uBACJzoF,MAAMkf,IACR,MAMA,kBAAkB+gC,EAAqBroD,EAAcU,GAC1D,GAAGV,EAAQ+K,GAAK,EAEd,YADAnP,KAAKqqF,UAAUzrE,QAAQ6tC,GAIzB,MAAMuhC,EAAchuF,KAAKk1F,0BAA0B9wF,EAASU,GAC5D,GAAsB,cAAnB9E,KAAK+sB,KAAK5pB,MAA2C,WAAnBnD,KAAK+sB,KAAK5pB,KAAiC,CAC9E,MAAMktB,EAASrwB,KAAKm/E,kBAAoB,EAAI,EAC5C,IAAIp5D,EAAW5d,MAAMC,KAAK4lF,EAAY/tF,UAAU8lB,UAAUtiB,MAAM4sB,GAC5DrlB,EAAI,EAAGwpE,EAA0B,EACrC,KAAMxpE,EAAI+a,EAAS5jB,SAAU6I,EAAG,CAC9B,MAAM0F,EAAIqV,EAAS/a,GACbgqD,GAAatkD,EAAEtE,QAAQ4oD,UAC7B,GAAG5wD,EAAQ0kB,KAAOksC,EAChB,MAKF,GAJU5wD,EAAQ0kB,OAASksC,IACzBwf,GAA2B9jE,EAAEtE,QAAQvF,KAGpC2tE,GAA2BpwE,EAAQyC,IAAM2tE,EAC1C,MAKJ,IAAIl4D,EAAQ+T,EAASrlB,EAQrBi6C,GAAuBwH,EAAQuhC,EAAY/tF,UAAWqc,QAEnDxX,EACDkpF,EAAY/tF,UAAU0gB,aAAa8rC,EAAQuhC,EAAY/tF,UAAU8lB,SAAS/lB,KAAKm/E,kBAAoB,EAAI,GAAGrmB,aAE1Gk1B,EAAY/tF,UAAU8J,OAAO0iD,GAIhB,YAAdroD,EAAQgD,EACTpH,KAAKusF,aAAa4I,UAAU1oC,EAAQroD,EAASU,GAE7C2nD,EAAOrsD,UAAUC,IAAI,iBAAkB,iBAIpC,gBACL,OAAOL,KAAK4sB,WAAW5c,MAIjB,cAAc5L,EAAcU,GAAU,EAAOswF,GAAiB,EAAO3oC,EAAyB,KAAM2gC,GAAiB,G,QAI3H,IAAI3gC,GAAUzsD,KAAKgtB,QAAQ5oB,EAAQyC,KACjC,OAIF,MAAMwuF,EAA6C,WAAnBr1F,KAAK+sB,KAAK5pB,KAC1C,GAAGiB,EAAQi3B,QAAS,OACf,GAAGj3B,EAAQ2oF,YAAcsI,EAAyB,CACrD,MAAMxsF,EAAU7I,KAAK0qD,mBAAmB+iC,uBAAuBrpF,EAAQ2oF,YACjEnmF,EAAQvE,KAAKP,OAAO+G,EAAQsjD,QAClC,GAAG/nD,EAAQyC,IAAMD,EACf,OAIJ,MAAMK,EAASjH,KAAKiH,OAEdquF,EAAMlxF,EAAQwH,SAAWhD,EAAA,QAAU6O,MAASrT,EAAQkT,OAAO0M,KAAOhkB,KAAKs7E,gBAAgBh0B,YAAYtnD,KAAKiH,QAExG6yE,EAAa55E,SAASC,cAAc,OAK1C,IAAI05E,EACA0b,EAGJ,GARAzb,EAAW15E,UAAUC,IAAI,WAQrBosD,EAsBG,CACL,MAAMtL,EAAO,CAAC,iBAAkB,iBAAkB,iBAC5Cq0C,EAAgB/oC,EAAOjjD,UAAU6Y,MAAM,KACvCozE,EAAa,CAAC,UAAU7xF,OAAOu9C,EAAKv5C,OAAO+rB,GAAK6hE,EAAc96D,SAAS/G,KAC7E84B,EAAOjjD,UAAYisF,EAAW9tE,KAAK,KAEnC4tE,EAAiB9oC,EAAO1a,iBACpBwjD,EAAen1F,UAAUuR,SAAS,4BACpC4jF,EAAiB9oC,EAAO58C,cAAc,4BAGxCgqE,EAAkB0b,EAAe11E,kBACjCg6D,EAAgB51E,UAAY,GAC5B41E,EAAgBl3E,MAAMuT,QAAU,GAChCq/E,EAAetxF,UAAY,GAC3BsxF,EAAe30E,YAAYi5D,GAE3B,MAAM6b,EAAkBH,EAAe5yF,MAAM+yF,gBAC7CH,EAAe5yF,MAAMuT,QAAU,GAC/Bq/E,EAAe5yF,MAAM+yF,gBAAkBA,EAEpCjpC,IAAWzsD,KAAK8pF,mBACjBr9B,EAAOrsD,UAAUC,IAAI,mBAIvB,MAAMs1F,GAAelpC,EAAOrgD,QAAQvF,KACnBzC,EAAQyC,MAAQ8uF,WAMxB31F,KAAKgtB,QAAQ2oE,GACpB31F,KAAKkpF,YAAY76E,OAAOsnF,SA5C1B,GAXAJ,EAAiBr1F,SAASC,cAAc,OACxCo1F,EAAen1F,UAAUC,IAAI,0BAE7Bw5E,EAAkB35E,SAASC,cAAc,OACzC05E,EAAgBz5E,UAAUC,IAAI,mBAE9BosD,EAASvsD,SAASC,cAAc,QACzBC,UAAUC,IAAI,UACrBk1F,EAAe30E,YAAYi5D,GAC3BptB,EAAO7rC,YAAY20E,IAEfD,IAAQlxF,EAAQkT,OAAO0M,KAAOhkB,KAAK6uF,iBAAkB,EAEtCzqF,EAAQkT,OAAOs+E,QAC9B51F,KAAK0qD,mBAAmB4lC,gBAAgBlsF,SACLM,IAAlC1E,KAAKqvC,eAAe8pC,WAA2Bn5E,KAAKqvC,eAAe8pC,UAAY/0E,EAAQyC,OAExF7G,KAAK6uF,iBAAiB/lD,QAAQ2jB,GAC9BzsD,KAAKspF,SAAS30E,IAAI83C,EAAQroD,EAAQyC,MA4CxC7G,KAAKgtB,SAAS5oB,EAAQyC,KAAO4lD,EAC7BA,EAAOrgD,QAAQvF,IAAMzC,EAAQyC,IAC7B4lD,EAAOrgD,QAAQnF,OAAS,GAAK7C,EAAQ6C,OACrCwlD,EAAOrgD,QAAQ4oD,UAAY5wD,EAAQ0kB,KAEnC,MAAM2B,EAA+B,GAErC,GAAiB,mBAAdrmB,EAAQgD,EAAwB,CACjC,OAAAshE,GAAA,GAAmCtkE,GAEnC,MAAMG,EAASH,EAAQG,OACvB,GAAGA,EAAQ,CACT,MAAM6C,EAAI7C,EAAO6C,EACjB,GAAGshF,GAAe/gF,IAAIP,IAAOmoE,EAAA,SAASnE,eAAehkE,KAAOmoE,EAAA,SAASnoE,GAEnE,OADApH,KAAKkpF,YAAY7oF,KAAK+D,EAAQyC,KACvB4lD,EAIXA,EAAOjjD,UAAY,iBAEnBqwE,EAAgB51E,UAAY,GAC5B,MAAM4R,EAAI3V,SAASC,cAAc,OAqBjC,OApBA0V,EAAEzV,UAAUC,IAAI,eACbkE,IACe,oCAAbA,EAAO6C,EACRyO,EAAE9L,OAAO,eAAK,qBAAsB,CAAC,IAAI,KAAU,CAAC9C,OAAQ1C,EAAOsxF,QAAQ/tE,UAAS,KAAQ9S,WACvE,+BAAbzQ,EAAO6C,EACfyO,EAAE9L,OAAO,eAAK,mBAAoB,CAAC,IAAI,KAAU,CAAC9C,OAAQ1C,EAAOw0E,WAAWjxD,UAAS,KAAQ9S,WAE7Fa,EAAE9L,OAAO/J,KAAK0qD,mBAAmBorC,yBAAyB1xF,KAG9Dy1E,EAAgB9vE,OAAO8L,GAEpBu3E,IACDptF,KAAK+1F,oBAAoB3xF,EAASqoD,EAAQ3nD,EAAS2lB,GAEhDrmB,EAAQkT,OAAO0+E,WAChBvpC,EAAOrsD,UAAUC,IAAI,kBAIlBosD,EAGT,IAEIwpC,EAAwB1kC,EAFxB2kC,EAAe9xF,EAAQ0O,MAG3B,IAAGojF,aAAY,EAAZA,EAAch2F,YAAa,CAAC,QAAS,OAAOw6B,SAASw7D,EAAah2F,SAASiD,YAEvE,GAAGiB,EAAQ2oF,YAAcsI,EAAyB,CACvD,MAAM3kF,EAAI1Q,KAAK0qD,mBAAmByrC,aAAa/xF,EAAQ2oF,YACvDkJ,EAAiBvlF,EAAEtM,QAEnBmtD,EAAgB7gD,EAAE6gD,kBACuB,aAAX,QAAtB,EAAA2kC,aAAY,EAAZA,EAAch2F,gBAAQ,eAAEiD,QAChC8yF,EAAiB7xF,EAAQA,QAEzBmtD,EAAgBntD,EAAQmtD,eAM1B,IAAI6kC,EAAW,IAAkBzpD,aAAaspD,EAAgB,CAC5Dp/C,SAAU0a,EACV04B,aAAcjqF,KAAKiqF,eAGjBoM,GAAc,EACdC,GAAoB,EACpBC,GAAgB,EACpB,GAAGhlC,IAAkB2kC,EAAc,CACjC,IAAIM,EAAgBjlC,EAAc3pD,OAAQ3F,GAAc,uBAARA,EAAEmF,GAC9CqvF,EAAYR,EAAe9zF,OAG/B,GAFqBq0F,EAAczyD,OAAO,CAACC,EAAa0yD,IAAc1yD,EAAM0yD,EAAKv0F,OAAQ,KAEnEs0F,GAAaD,EAAcr0F,QAAU,EAAG,CAC5D,GAAGyG,EAAA,QAAUo2B,SAASmb,MAAMw8C,IAAK,CAC/B,IAAIz5C,EAAUl9C,KAAKy9C,mBAAmBjD,wBAAwBy7C,GAC9D,GAA4B,IAAzBO,EAAcr0F,SAAiB+zF,GAAgBh5C,EAChDg5C,EAAe,CACb9uF,EAAG,uBACHlH,SAAUg9C,OAEP,CACL,IAAI2H,EAAgB3kD,SAASC,cAAc,OAC3C0kD,EAAczkD,UAAUC,IAAI,cAE5BwkD,EAAc5gD,UAAYmyF,EAE1B3pC,EAAOrsD,UAAUC,IAAI,SAAWm2F,EAAcr0F,OAAS,KAEvD03E,EAAgB9vE,OAAO86C,GAGzB4H,EAAOrsD,UAAUC,IAAI,mBAAoB,aACzCi2F,GAAoB,EACpBD,GAAc,EACdE,GAAgB,EAGlB9pC,EAAOrsD,UAAUC,IAAI,uBAStBk2F,GACDzyF,EAAag2E,EAAYsc,GAG3B,MAAM3b,EAAW,GAAcb,QAAQ55E,KAAK+sB,KAAM3oB,EAASqoD,EAAQotB,EAAiBC,GAIpF,GAHAD,EAAgBj7D,QAAQk7D,GAGrB11E,EAAQ41E,SAA0B,QAAhB,EAAA51E,EAAQ+1E,gBAAQ,eAAEyQ,oBAAwC,WAAnB5qF,KAAK+sB,KAAK5pB,KAAmB,CACvF,MAAMyzF,EAAU12F,SAASC,cAAc,OACvCy2F,EAAQx2F,UAAUC,IAAI,uBAAwB,UAAW,wBACzDw5E,EAAgBj7D,QAAQg4E,GACxBnqC,EAAOrsD,UAAUC,IAAI,sBAOvB,GAJG+D,EAAQ41E,QAAU51E,EAAQkT,OAAO+Q,aAAeroB,KAAK+uF,eACtD/uF,KAAK+uF,cAAcjmD,QAAQ2jB,GAG1BroD,EAAQu/E,cAA2C,sBAA3Bv/E,EAAQu/E,aAAav8E,GAA6BhD,EAAQu/E,aAAa7vD,MAAQ1vB,EAAQu/E,aAAa7vD,KAAK3xB,OAAQ,CAC1I,MAAM2xB,EAAQ1vB,EAAQu/E,aAAiD7vD,KAEjE+iE,EAAe32F,SAASC,cAAc,OAC5C02F,EAAaz2F,UAAUC,IAAI,gBAC3ByzB,EAAKxtB,QAASurB,IACZ,MAAMjU,EAAUiU,EAAIjU,QACpB,IAAIA,IAAYA,EAAQzb,OAAQ,OAEhC,MAAM20F,EAAS52F,SAASC,cAAc,OACtC22F,EAAO12F,UAAUC,IAAI,oBAErBud,EAAQtX,QAASuU,IACf,MAAMqC,EAAO,IAAkByvB,aAAa9xB,EAAOqC,KAAM,CAACimE,SAAS,EAAMC,cAAc,IAEvF,IAAI2T,EAEJ,OAAOl8E,EAAOzT,GACZ,IAAK,oBAAqB,CACxB,MAAMgX,EAAI,IAAkBuuB,aAAa,IAAK,CAC5CkK,SAAU,CAAC,CACTzvC,EAAG,uBACHjF,OAAQ,EACRkuB,OAAQ,EACR3b,IAAKmG,EAAOnG,QAIhBqiF,EAAW,OAAA7kC,GAAA,GAAuB9zC,GAAGyB,kBACrCk3E,EAAS32F,UAAUC,IAAI,UAAW,SAElC,MAGF,IAAK,6BACH02F,EAAW72F,SAASC,cAAc,UAClC42F,EAAS32F,UAAUC,IAAI,mBAAoB,SAC3C,YAAiB02F,EAAW90F,IAC1B,OAAAyb,EAAA,GAAYzb,GAEZ,MAAM0/E,EAAQv9E,EAAQ8vE,UAAY9vE,EAAQwH,OAC1C,IAAIzF,EACwBA,EAAzB0U,EAAOvD,OAAO0/E,UAAqBn0F,QAAQoD,QAAQjG,KAAKiH,QAC5CjH,KAAK0kF,qBAAqBuS,kBAAkBtV,GAAO9gF,KAAKoG,GAClEA,GAII,IAAIpE,QAAgB,CAACoD,EAASylB,KACrB,IAAI,GAAa,CAC7B,CAAC1rB,KAAKiH,QAAS,IACbA,IACFhB,EAAQgB,KACP,GAEGjG,iBAAiB,QAAS,KAC9B0qB,SAKNvlB,EAAQtF,KAAKoG,IACX,MAAM6D,EAAW9K,KAAKiH,SAAWA,EAASjH,KAAK+sB,KAAKjiB,cAAWpG,EAC/D1E,KAAK0kF,qBAAqBwS,kBAAkBjwF,EAAQ6D,EAAU62E,EAAO9mE,EAAOjQ,WAGhF,MAGF,QACEmsF,EAAW72F,SAASC,cAAc,UAKtC42F,EAAS32F,UAAUC,IAAI,sBAAuB,MAC9C02F,EAASz1E,mBAAmB,YAAapE,GAEzC,OAAAI,GAAA,QAAOy5E,GAEPD,EAAO/sF,OAAOgtF,KAGhBF,EAAa9sF,OAAO+sF,KAGtB,YAAiBD,EAAe50F,IAC9B,IAAI4S,EAAS5S,EAAE4S,OAGf,GADIA,EAAOzU,UAAUuR,SAAS,yBAAwBkD,EAAS,OAAAiN,GAAA,GAAgBjN,EAAQ,yBACnFA,GAAUA,EAAOzU,UAAUuR,SAAS,YAAckD,EAAOzU,UAAUuR,SAAS,oBAAqB,OAErG,OAAA+L,EAAA,GAAYzb,GAEZ,MAAMk1F,EAAS,OAAA/xC,GAAA,GAAWvwC,GACpBgd,EAAMiC,EAAK,OAAAsxB,GAAA,GAAWvwC,EAAO/D,gBAEnC,IAAI+gB,EAAIjU,UAAYiU,EAAIjU,QAAQu5E,GAE9B,YADAn3F,KAAKgvD,IAAIp4C,KAAK,iBAAkBib,EAAKslE,EAAQ/yF,GAI/C,MAAMyW,EAASgX,EAAIjU,QAAQu5E,GAC3Bn3F,KAAK0kF,qBAAqB0S,oBAAoBp3F,KAAKiH,OAAQ7C,EAAQyC,IAAKgU,KAG1Ew7E,GAAc,EACd5pC,EAAOrsD,UAAUC,IAAI,qBACrBk1F,EAAexrF,OAAO8sF,GAGxB,MAAMzuE,EAAahkB,EAAQkT,OAAO+Q,YAClC,GAAGitE,EAAK,EACHlxF,EAAQkT,OAAOs+E,QAAUxtE,IAAYpoB,KAAKipF,UAAU5oF,IAAI+D,EAAQyC,KACnE,IAAIu/C,EAAS,GACEA,EAAZh+B,EAAqB,aACVhkB,EAAQkT,OAAOs+E,QAAUxxF,EAAQkT,OAAOC,aAAe,UAAY,UACjFk1C,EAAOrsD,UAAUC,IAAI+lD,GAGvB,MAAMixC,EAAqBr3F,KAAK0qD,mBAAmB4sC,sBAAsBlzF,GACnEmzF,IAAgBF,GAAsBjzF,EAAQyC,IAAM,EAEvD0wF,GACD9qC,EAAOrsD,UAAUC,IAAI,gBAGvB,MAAMw9C,EAAQy3C,KAASlxF,EAAQ+1E,UAAYn6E,KAAKiH,SAAW2B,EAAA,QAAU6O,MACrE,IAAI+/E,EAA6B3d,EAGjC,GAAGqc,EAA8D,CAC/D,IAAIrxC,EAAgB3kD,SAASC,cAAc,OAC3C0kD,EAAczkD,UAAUC,IAAI,cAExB41F,GACFxpC,EAAOrsD,UAAUC,IAAI,oBAGvB,IAAIo3F,GAAoB,EAExB,OAAOvB,EAAa9uF,GAClB,IAAK,oBAAqB,CACxB,MAAM5C,EAAQ0xF,EAAa1xF,MAGvByxF,IACFI,GAAc,GAGZjyF,EAAQ8vE,UACVznB,EAAOrsD,UAAUC,IAAI,aAGvBosD,EAAOrsD,UAAUC,IAAI,SAErB,MAAMwI,EAAU7I,KAAK0qD,mBAAmB+iC,uBAAuBrpF,EAAQ2oF,YACvE,GAAG3oF,EAAQ2oF,YAA+B,IAAjBlkF,EAAQ/I,MAAcu1F,EAAyB,CACtE5oC,EAAOrsD,UAAUC,IAAI,WAAY,cACjCskD,GAAU,CACRC,QAASxgD,EAAQ2oF,WACjBloC,gBACAj4B,WAAY5sB,KAAKitB,gBACjB4wB,MAAOy3C,EACP3qE,cAAe3qB,KAAK2qB,cACpBoC,KAAM/sB,KAAK+sB,KACXtC,eACAQ,eAAgBjrB,KAAK+sB,KAAK2qE,sBAG5B,MAGF,MAAM95C,GAAY,eAAcy4C,IAAgBkB,IAhjFlC,EAijFX35C,GAAU6O,EAAOrsD,UAAUC,IAAI,mBAClCiqB,GAAU,CACR9lB,QACAJ,UACAnE,UAAW4kD,EACXjH,WACAC,QACAlzB,cAAe3qB,KAAK2qB,cACpBiC,WAAY5sB,KAAKitB,gBACjBxC,eACAQ,eAAgBjrB,KAAK+sB,KAAK2qE,sBAG5B,MAGF,IAAK,sBAAuB,CAC1BD,GAAoB,EAEpB,IAAI3qE,EAAmBopE,EAAappE,QAEpC,GAAiB,YAAdA,EAAQ1lB,EACT,MAGFqlD,EAAOrsD,UAAUC,IAAI,WAErB,IAAIggE,EAAMngE,SAASC,cAAc,OACjCkgE,EAAIjgE,UAAUC,IAAI,OAElB,IAGIs3F,EAAgCC,EAHhCC,EAAQ33F,SAASC,cAAc,OACnC03F,EAAMz3F,UAAUC,IAAI,SAGpB,MAAMmE,EAAqBsoB,EAAQtoB,OAChCA,GAASsoB,EAAQ5sB,YAClBy3F,EAAiBz3F,SAASC,cAAc,OACxCw3F,EAAev3F,UAAUC,IAAI,mBAC7Bu3F,EAAU13F,SAASC,cAAc,OACjCy3F,EAAQx3F,UAAUC,IAAI,WACtBs3F,EAAe5tF,OAAO6tF,IAGxB,MAAM3jF,EAAM6Y,EAAQ5sB,SACpB,GAAG+T,EACD,GAAgB,QAAbA,EAAI9Q,MAA+B,UAAb8Q,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,KAAkB,CAErE,MAAMu3C,EAAyB,UAAbzmC,EAAI9Q,KAAmB+gB,EAAA,EAAWosB,OAAO/tC,MAAQ2hB,EAAA,EAAWosB,OAAOxjB,QACrE,UAAb7Y,EAAI9Q,MACLspD,EAAOrsD,UAAUC,IAAI,SACrBu3F,EAAQx3F,UAAUC,IAAI,aAEtBosD,EAAOrsD,UAAUC,IAAI,SAEvBs9C,GAAU,CACR1pC,MACAhU,UAAW23F,EACXxzF,UACAmmB,SAAUmwB,EAAUh6C,MACpB8pB,UAAWkwB,EAAU/5C,OACrBgqB,cAAe3qB,KAAK2qB,cACpBiC,WAAY5sB,KAAKitB,gBACjB4wB,QACAzwB,MAAOC,GACP5C,eACAQ,eAAgBjrB,KAAK+sB,KAAK2qE,0BAGvB,CACL,MAAM52C,EAASL,GAAa,CAC1Br8C,UACA6mB,eAAgBjrB,KAAK+sB,KAAK2qE,oBAC1B/sE,cAAe3qB,KAAK2qB,cACpBF,iBAEFmtE,EAAQ7tF,OAAO+2C,GACf82C,EAAQx3F,UAAUC,IAAI,yBAM1B,IAOIqQ,EAPAonF,EAAe53F,SAASC,cAAc,OAQ1C,GAPA23F,EAAa13F,UAAUC,IAAI,cAExBs3F,GACDG,EAAa/tF,OAAO4tF,GAInB7qE,EAAQirE,UAAW,CACpB,MAAM/zF,EAAO,IAAkB2oC,aAAa7f,EAAQpY,KAC9CpM,EAAuB,OAAA4pD,GAAA,GAAuBluD,GAAM6b,kBAC1DvX,EAAElI,UAAUC,IAAI,gBAChByD,EAAawE,EAAG,IAAkBmkB,cAAcK,EAAQirE,YACxDD,EAAa/tF,OAAOzB,GACpBoI,EAAIpI,EAGN,GAAGwkB,EAAQklC,OAAQ,CACjB,IAAI2sB,EAAWz+E,SAASC,cAAc,OACtCw+E,EAASv+E,UAAUC,IAAI,SACvByD,EAAa66E,EAAU7xD,EAAQklC,QAC/B8lC,EAAa/tF,OAAO40E,GACpBjuE,EAAIiuE,EAGN,GAAG7xD,EAAQ+kC,aAAc,CACvB,IAAImmC,EAAU93F,SAASC,cAAc,OACrC63F,EAAQ53F,UAAUC,IAAI,QACtByD,EAAak0F,EAASlrE,EAAQ+kC,cAC9BimC,EAAa/tF,OAAOiuF,GACpBtnF,EAAIsnF,EAWN,GAFAH,EAAM9tF,OAAO+tF,GAEVtzF,IAAUyP,EAAK,CAChBw4C,EAAOrsD,UAAUC,IAAI,SAErB,MAAMP,EAA4B0E,EAAM8T,MAAM9T,EAAM8T,MAAMnW,OAAS,GACnE,IAAI81F,GAAW,EACZn4F,EAAK+X,IAAM/X,EAAKyY,GAAK7H,GACtB+7C,EAAOrsD,UAAUC,IAAI,mBACrB43F,GAAW,EACXj4F,KAAK6oF,iBAAiBpnC,kBAAkBj9C,EAAOozF,EAAS,GAAI,IAAI,IAKxD93F,EAAKyY,EAAIzY,EAAK+X,GACtB40C,EAAOrsD,UAAUC,IAAI,qBAGvBiqB,GAAU,CACR9lB,QACAJ,UACAnE,UAAW23F,EACXrtE,SAAU0tE,EAAW,EAAI/zE,EAAA,EAAWosB,OAAOxjB,QAAQpsB,MACnD8pB,UAAWytE,EAAW,EAAI/zE,EAAA,EAAWosB,OAAOxjB,QAAQnsB,OACpDk9C,QACAlzB,cAAe3qB,KAAK2qB,cACpBiC,WAAY5sB,KAAKitB,gBACjBxC,eACAC,iBAAkButE,EAClBhtE,eAAgBjrB,KAAK+sB,KAAK2qE,sBAI9Br3B,EAAIt2D,OAAO8tF,GAIT/d,EAAWn5D,aAAa0/C,EAAKoa,GAO/B,MAGF,IAAK,uBAAwB,CAC3B,MAAMxmE,EAAMiiF,EAAah2F,SAIzB,GAAG+T,EAAIipC,QAAkC,CACvCuP,EAAOrsD,UAAUC,IAAI,WACrBg2F,GAAc,EACdC,GAAoB,EAEjBriF,EAAIwnC,UACLgR,EAAOrsD,UAAUC,IAAI,oBAGvB,MAAMiY,EAAQ4L,EAAA,EAAWosB,OACnBxwC,EAAO2sD,EAAOrsD,UAAUuR,SAAS,aAAe2G,EAAMqiC,aAAgB1mC,EAAIwnC,SAAWnjC,EAAM4/E,gBAAkB5/E,EAAM6/E,cACzHn4F,KAAK6oF,iBAAiBpnC,kBAAkBxtC,EAAK4wC,EAAe/kD,EAAKY,MAAOZ,EAAKa,QAE7Ek5E,EAAgBl3E,MAAMhC,OAASkkD,EAAcliD,MAAMhC,OACnDk5E,EAAgBl3E,MAAMjC,MAAQmkD,EAAcliD,MAAMjC,MAElDwsB,GAAY,CACVjZ,MACAkZ,IAAK03B,EACLj4B,WAAY5sB,KAAKitB,gBACjBtC,cAAe3qB,KAAK2qB,cACpByC,MAAOC,GAEP5rB,MAAM,EACNjB,MAAM,EACN25C,MAAOsS,EAAOrsD,UAAUuR,SAAS,aAAeskF,OAAiBvxF,EACjEi+C,WAAW,EACXl4B,sBAEG,GAAgB,UAAbxW,EAAI9Q,MAAiC,QAAb8Q,EAAI9Q,MAA+B,UAAb8Q,EAAI9Q,KAA4C,CAGtG,MAAMupB,EAAuB,UAAbzY,EAAI9Q,KACjBupB,IACD4pE,GAAoB,IAGnB5pE,GAAYupE,IACbI,GAAc,GAGZjyF,EAAQ8vE,UACVznB,EAAOrsD,UAAUC,IAAI,aAGvBosD,EAAOrsD,UAAUC,IAAIqsB,EAAU,QAAU,SACzC,MAAM7jB,EAAU7I,KAAK0qD,mBAAmB+iC,uBAAuBrpF,EAAQ2oF,YACvE,GAAG3oF,EAAQ2oF,YAA+B,IAAjBlkF,EAAQ/I,MAAcu1F,EAC7C5oC,EAAOrsD,UAAUC,IAAI,WAAY,cAEjCskD,GAAU,CACRC,QAASxgD,EAAQ2oF,WACjBloC,gBACAj4B,WAAY5sB,KAAKitB,gBACjB4wB,MAAOy3C,EACP3qE,cAAe3qB,KAAK2qB,cACpBoC,KAAM/sB,KAAK+sB,KACXtC,eACAQ,eAAgBjrB,KAAK+sB,KAAK2qE,0BAEvB,CACL,MAAM95C,GAAY,gBAAe,cAAalxB,GAAW2pE,IAAgBkB,IA5xF/D,EA6xFP35C,GAAU6O,EAAOrsD,UAAUC,IAAI,mBAClCs9C,GAAU,CACR1pC,MACAhU,UAAW4kD,EACXzgD,UACAmmB,SAAUrG,EAAA,EAAWosB,OAAOoR,QAAQhhD,MACpC8pB,UAAWtG,EAAA,EAAWosB,OAAOoR,QAAQ/gD,OACrCi9C,WACAC,QACAlzB,cAAe3qB,KAAK2qB,cACpBiC,WAAY5sB,KAAKitB,gBACjBG,MAAOC,GACP5C,eACAQ,eAAgBjrB,KAAK+sB,KAAK2qE,oBAC1B1wF,cAAe0lB,EAAU,CACvBzlB,OAAQjH,KAAKiH,OACbE,YAAa,CAACC,EAAG,iCACjB0D,SAAU9K,KAAK+sB,KAAKjiB,SACpB3B,WAAY/E,EAAQkT,OAAOC,aAC3BzO,YAAa1E,EAAQkT,OAAOC,mBAC1B7S,SAGH,CACL,MAAM0zF,EvE5xCX,UAA8B,wBAAC/C,EAAuB,QAAEjxF,EAAO,OAAEqoD,EAAM,WAAEqtB,EAAU,KAAE/sD,EAAI,aAAEtC,EAAY,eAAEQ,EAAc,cAAEN,EAAa,cAAE3jB,EAAa,UAAEmC,IAa5J,IAAIquF,EACJ,MAAMvvF,EAAOotF,EAA0BtoE,EAAK6/B,aAAaxoD,EAAQyC,KAAO,CAACzC,EAAQyC,KAwDjF,OAnDAoB,EAAK3B,QAAQ,CAACO,EAAKxC,KACjB,MAAMD,EAAU2oB,EAAKg4B,WAAWl+C,GAC1BsmB,EAAMszB,GAAa,CACvBr8C,UACAqmB,eACAQ,iBACAN,gBACA3jB,kBAGI/G,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAUC,IAAI,sBACxBJ,EAAUmM,QAAQvF,IAAM,GAAKA,EAC7B5G,EAAUmM,QAAQnF,OAAS,GAAK7C,EAAQ6C,OAExC,MAAMiZ,EAAUhgB,SAASC,cAAc,OAGvC,GAFA+f,EAAQ9f,UAAUC,IAAI,oBAEnB+D,EAAQA,QAAS,CAClB,MAAM01E,EAAa55E,SAASC,cAAc,OAC1C25E,EAAW15E,UAAUC,IAAI,oBAEzB,MAAM+1F,EAAW,IAAkBzpD,aAAavoC,EAAQA,QAAS,CAC/DyyC,SAAUzyC,EAAQmtD,gBAGpBuoB,EAAW71E,UAAYmyF,EACvBl2E,EAAQnW,OAAO+vE,GAGjB,GAAG7xE,EAAK9F,OAAS,EAAG,CAClB,MAAM2sC,EAAY5uC,SAASC,cAAc,OACzC2uC,EAAU1uC,UAAUC,IAAI,sBACxBJ,EAAU8J,OAAO+kC,GAEjB7uC,EAAUG,UAAUC,IAAI,gBAEb,IAARgE,IACDmzF,EAAgBt3E,GAIpBA,EAAQnW,OAAOojB,GACfltB,EAAU8J,OAAOmW,GACjB45D,EAAW/vE,OAAO9J,KAGjBgI,EAAK9F,OAAS,GACfsqD,EAAOrsD,UAAUC,IAAI,wBAAyB,cAGzCm3F,EuEstC4Ba,CAAqB,CAC5ChD,0BACAjxF,UACAqoD,SACAqtB,aACA/sD,KAAM/sB,KAAK+sB,KACXtC,eACAQ,eAAgBjrB,KAAK+sB,KAAK2qE,oBAC1B/sE,cAAe3qB,KAAK2qB,cACpB3jB,cAA4B,UAAbiN,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,KAAmB,CAC5D8D,OAAQjH,KAAKiH,OACbE,YAAa,CAACC,EAAgB,UAAb6M,EAAI9Q,KAAmB,gCAAkC,4BAC1E2H,SAAU9K,KAAK+sB,KAAKjiB,SACpB3B,WAAY/E,EAAQkT,OAAOC,aAC3BzO,YAAa1E,EAAQkT,OAAOC,mBAC1B7S,IAGH0zF,IACDZ,EAAgBY,GAGlB,MAAME,EAAgBxe,EAAW/nC,iBAAiBliC,cAAc,6CAChEyoF,GAAiBA,EAAcvuF,OAAO0wE,EAASptC,WAAU,IAEzDof,EAAOrsD,UAAUuB,OAAO,oBACxBm4E,EAAW15E,UAAUC,KAAO,CAAC,QAAS,OAAgCq6B,SAASzmB,EAAI9Q,MAAiC,WAAzB8Q,EAAI9Q,MAAQ,YAA2B,YAClIs0F,GAAoB,EAGtB,MAGF,IAAK,sBAAuB,CAG1B,MAAMlN,EAAarqF,SAASC,cAAc,OAC1CoqF,EAAWnqF,UAAUC,IAAI,WACzBkqF,EAAWn+E,QAAQnF,OAAS,GAAKivF,EAAan0D,QAE9C+3C,EAAW15E,UAAUC,IAAI,mBACzBo3F,GAAoB,EAEpB,MAAMc,EAAQ,GACXn0F,EAAQ0O,MAAMsyB,YAAYmzD,EAAM5yF,KAAK,IAAkB8mB,cAAcroB,EAAQ0O,MAAMsyB,aACnFhhC,EAAQ0O,MAAMuyB,WAAWkzD,EAAM5yF,KAAK,IAAkB8mB,cAAcroB,EAAQ0O,MAAMuyB,YAErFklD,EAAWtmF,UAAY,wFAESs0F,EAAM5wE,KAAK,yDACTvjB,EAAQ0O,MAAMwxE,aAAe,IAAM,OAAApxB,GAAA,GAAkB9uD,EAAQ0O,MAAMwxE,cAAcnxB,UAAY,mDAG/H,MAAMvgC,EAAa,IAAI,GACvBA,EAAWjI,cAAgB3qB,KAAK2qB,cAChCiI,EAAWxvB,aAAa,OAAQ,GAAKgB,EAAQ0O,MAAMivB,SACnDnP,EAAWxyB,UAAUC,IAAI,iBAAkB,aAE3CkqF,EAAW3rE,QAAQgU,GAEnB65B,EAAOrsD,UAAUuB,OAAO,oBACxBm4E,EAAW15E,UAAUC,IAAI,mBACzBy5E,EAAW/vE,OAAOwgF,GAElB,MAGF,IAAK,mBAAoB,CACvB99B,EAAOrsD,UAAUuB,OAAO,oBAExB,MAAM6wC,EvEzxCT,SAAkBpuC,GACvB,MAAML,EAAO,IAAI,GAMjB,OALAA,EAAKK,QAAUA,EACfL,EAAKX,aAAa,UAAW,GAAKgB,EAAQ6C,QAC1ClD,EAAKX,aAAa,UAAWgB,EAAQ0O,MAAM69B,KAAKxhC,IAChDpL,EAAKX,aAAa,aAAc,GAAKgB,EAAQyC,KAC7C9C,EAAKy8C,SACEz8C,EuEkxCqBy0F,CAASp0F,GAC7B01E,EAAWl7D,QAAQ4zB,GACnBsnC,EAAW15E,UAAUC,IAAI,gBAEzB,MAGF,QACEosD,EAAOrsD,UAAUuB,OAAO,oBACxBm4E,EAAW71E,UAAY,mLACvB61E,EAAW/vE,OAAO0wE,GAClBz6E,KAAKgvD,IAAIp4C,KAAK,2BAA4BxS,EAAQ0O,MAAM1L,EAAGhD,GAI3DqzF,GACF5d,EAAgB9vE,OAAO86C,GAYxByxC,GACD7pC,EAAOrsD,UAAUC,IAAI,cAGpBL,KAAK+sB,KAAK+hB,UAAUC,aACrB/uC,KAAK+sB,KAAK+hB,UAAUsc,sBAAsBqB,GAAQ,GAGpD,IAAIy+B,EAAY,GAGhB,MAAMuN,EAAYr0F,EAAQwH,SAAWhD,EAAA,QAAU6O,MAAQzX,KAAKs7E,gBAAgB78C,UAAUx3B,KAAYjH,KAAKs7E,gBAAgBnjD,YAAYlxB,IAAY7C,EAAQ8vE,SACvJ,GAAGukB,GAAYr0F,EAAQ+1E,UAAY/1E,EAAQ82E,aAAc,CACvD,IAAIttE,EACA8qF,EAEJ,MAAMC,EAAuBv0F,EAAQw0F,SAAiC,gBAAtBx0F,EAAQw0F,QAAQxxF,GAAuBhD,EAAQwH,SAAWxH,EAAQ+vE,UAElH,IA8BIlzB,EA9BA43C,EAAWz0F,EAAQ+1E,WAAa/1E,EAAQ+1E,SAASye,UAAYx0F,EAAQ+1E,SAASpB,WA+BlF,GA9BG30E,EAAQ8vE,WACTwkB,EAAWx4F,SAASC,cAAc,QAClCu4F,EAASxuE,UAAY,IAAMlqB,KAAK4oF,gBAAgB1jD,QAAQ9gC,EAAQ8vE,UAAU19C,SAC1EkiE,EAASt4F,UAAUC,IAAI,cACvBosD,EAAOrsD,UAAUC,IAAI,mBAGpBw4F,GAEDjrF,EAAQ1N,SAASC,cAAc,QAC/ByN,EAAM3J,UAAY,IAAkBwoB,cAAcroB,EAAQ+1E,SAAS2e,WACnElrF,EAAMxN,UAAUC,IAAI,cAEpBosD,EAAOrsD,UAAUC,IAAI,mBAErBuN,EAAQ,IAAI,KAAU,CAAC3G,OAAQ7C,EAAQ+vE,WAAa/vE,EAAQwH,SAASoJ,QAGpE5Q,EAAQ82E,cAAgB92E,EAAQ82E,eAAiBl7E,KAAK+sB,KAAKjiB,UAC5D,GAAciwE,SAAS,CACrBhuD,KAAM/sB,KAAK+sB,KACX0/B,SACAotB,kBACAz1E,YAOAA,EAAQ+vE,WAAa/vE,EAAQ+1E,SAa/B,GAZGn6E,KAAKiH,SAAW2B,EAAA,QAAU6O,MAASkhF,GACpClsC,EAAOrsD,UAAUC,IAAI,aAGpB+D,EAAQ8mF,YACTA,EAAY9mF,EAAQ8mF,UACpBt9E,EAAMxB,QAAQ8+E,UAAYA,GAG5BjqC,EAAU/gD,SAASC,cAAc,OACjCyN,EAAMxB,QAAQnF,OAAS7C,EAAQ+vE,UAE3Bn0E,KAAKiH,SAAW2B,EAAA,QAAU6O,MAAQzX,KAAKiH,SAAW,OAAmB0xF,GAA0BrC,EAG5F,CAGL,MAAMroF,EAA2B,CAACL,GAC/B0oF,GACDroF,EAAKpI,QAAQ3F,SAASC,cAAc,OAEtC8gD,EAAQl3C,OAAO,eAAK,gBAAiB,CAACkE,UATtCgzC,EAAQt+C,MAAM6yC,MAAQx1C,KAAKs7E,gBAAgByd,iBAAiB30F,EAAQ+vE,WAAW,GAC/ElzB,EAAQl3C,OAAO6D,QAURxJ,EAAQ8vE,YACboiB,GAAqBmC,GACvBx3C,EAAU/gD,SAASC,cAAc,OACjC8gD,EAAQl3C,OAAO6D,GAEX0nF,IACFr0C,EAAQt+C,MAAM6yC,MAAQx1C,KAAKs7E,gBAAgByd,iBAAiB30F,EAAQwH,QAAQ,IAG9Eq1C,EAAQ70C,QAAQnF,OAAS7C,EAAQwH,QAEjC6gD,EAAOrsD,UAAUC,IAAI,cAIzB,GAAG+D,EAAQ8vE,SAAU,CACfjzB,EAGFA,EAAQl3C,OAAO,KAFfk3C,EAAU/gD,SAASC,cAAc,OAKnC,MAAM0vD,EAAO3vD,SAASC,cAAc,QACpC0vD,EAAK9lD,OAAO,eAAK,UAAW,IAAK2uF,GACjC7oC,EAAKzvD,UAAUC,IAAI,UAEnB4gD,EAAQl3C,OAAO8lD,GAGd5O,IACDA,EAAQ7gD,UAAUC,IAAI,QACtBm3F,EAAcztF,OAAOk3C,IAIvB,GADmBjhD,KAAK+sB,KAAKigD,eAAiBnvB,EAC/B,CACb,IAAIjrB,EAAa,IAAI,GACrBA,EAAWjI,cAAgB3qB,KAAK2qB,cAChCiI,EAAWxyB,UAAUC,IAAI,cAAe,aACxCuyB,EAAWnI,aAAeA,GAEtBrmB,EAAQ+vE,WAAa/vE,EAAQ+1E,UAAY/1E,EAAQ+1E,SAAS2e,WAC5DlmE,EAAWxvB,aAAa,aAA8BgB,EAAQ+1E,SAAS2e,WAGzElmE,EAAWxvB,aAAa,OAAQ,KAAQgB,EAAQ+1E,WAAan6E,KAAKiH,SAAW2B,EAAA,QAAU6O,MAAQzX,KAAKiH,SAAW,OAAqB0xF,EAAuBv0F,EAAQ+vE,UAAY/vE,EAAQwH,SAAW,OAKlM2pF,EAAexrF,OAAO6oB,SAGxB65B,EAAOrsD,UAAUC,IAAI,aAGD,WAAnBL,KAAK+sB,KAAK5pB,OACX+nF,EAAY,GAAGlrF,KAAK+sB,KAAK9lB,UAAU7C,EAAQyC,OAQ7C,GALwBwwF,GAAsBA,EAAmBxwF,MAAQ7G,KAAK+sB,KAAKjiB,UAEjF2hD,EAAOrsD,UAAUC,IAAI,oBAAqB,iBAGzC6qF,IAAiC,WAAnBlrF,KAAK+sB,KAAK5pB,MAAqBiB,EAAQ+1E,SAASyQ,oBAAsB5qF,KAAKiH,SAAW,KAAiB,CACtH,MAAM+xF,EAAO94F,SAASC,cAAc,OACpC64F,EAAK54F,UAAUC,IAAI,uBAAwB,gBAAiB,oBAC5Dw5E,EAAgB9vE,OAAOivF,GACvBvsC,EAAOrgD,QAAQ8+E,UAAYA,EAC3Bz+B,EAAOrsD,UAAUC,IAAI,sBAQvB,GALAosD,EAAOrsD,UAAUC,IAAIw9C,EAAQ,SAAW,SACrCuvC,GACDptF,KAAK+1F,oBAAoB3xF,EAASqoD,EAAQ3nD,EAAS2lB,GAGlD8sE,EAAa,CACG,GAAc3c,cAAc,CAC3CnuB,SACAotB,kBACAz1E,QAASizF,EACTvd,aACArvD,eACAE,cAAe3qB,KAAK2qB,kBAIpB0rE,GAAc,GAUlB,OANGA,IACD5pC,EAAOrsD,UAAUC,IAAI,iBAErBw5E,EAAgB9vE,OAAOkvF,OAGlBxsC,EAGD,kBAAkBroD,EAAcU,EAAmBswF,EAA0B3oC,EAAyB2gC,GAC5G,IACE,OAAOptF,KAAKk5F,cAAc90F,EAASU,EAASswF,EAAgB3oC,EAAQ2gC,GACpE,MAAM3gF,GACNzM,KAAKgvD,IAAIriD,MAAM,uBAAwBF,IAI9B,qBAAqBtI,EAAmBW,EAAkBq0F,EAAsBzF,G,0CAyC3F,IAAI0F,EAzBJj1F,EAAUA,EAAQV,QAEfiwF,GACDvvF,EAAQ0B,QAAQ6tF,GAyBhB1zF,KAAK4pF,sBAAwB,KAC3B,MAAM,UAACzgD,EAAS,aAAEsnB,GAAgBzwD,KAAK+K,WAIvCquF,EAA+Bt0F,EAAU2rD,EAAetnB,EAAYA,EAYpEnpC,KAAK4pF,2BAAwBllF,GAK9B1E,KAAKq5F,mBACNpd,GAAwBj8E,KAAK+K,WAAW9K,WACxCD,KAAKq5F,kBAAmB,GAG1B,MAAMrhD,EAAMnxC,IACV,MAAMzC,EAAUpE,KAAK+sB,KAAKg4B,WAAWl+C,GAClCzC,EAAQ+K,GAAK,EACdnP,KAAKitF,kBAAkB7oF,EAASU,GAAS,GAEzC9E,KAAKs5F,0BAA0Bl1F,IAI7BjC,EAASgC,EAAQhC,OACvB,GAAG2C,EAAS,IAAI,IAAIkG,EAAI,EAAGA,EAAI7I,IAAU6I,EAAGgtC,EAAG7zC,EAAQ6G,SAClD,IAAI,IAAIA,EAAI7I,EAAS,EAAG6I,GAAK,IAAKA,EAAGgtC,EAAG7zC,EAAQ6G,IAErD,GAAsB,cAAnBhL,KAAK+sB,KAAK5pB,KAAsB,CACjC,MAAMksC,EAAiBrvC,KAAK0qD,mBAAmBouB,kBAAkB94E,KAAKiH,OAAQjH,KAAK+sB,KAAKjiB,UAClFyuF,EAAalqD,EAAelrC,QAAQusB,MACpC8oE,EAAYnqD,EAAelrC,QAAQqkD,MACtC+wC,EAAWt8D,MAAM,KAASy3D,SAAa6E,EAAWp3F,SAAUgC,EAAQu2B,SAAS6+D,EAAW,KACzFv5F,KAAK4wF,UAAU,UAAU,GAAM,IAG9B4I,EAAUv8D,MAAM,KAASw8D,MAAUD,EAAUr3F,SAAUgC,EAAQu2B,SAAS8+D,EAAUA,EAAUr3F,OAAS,KACtGnC,KAAK4wF,UAAU,OAAO,GAAM,QAG9B5wF,KAAK4wF,UAAU,OAAO,GACtB5wF,KAAK4wF,UAAU,UAAU,GAa3B,SAVM5wF,KAAK0pF,qBAER1pF,KAAK+K,WAAW5F,UAAUgvB,KAAOn0B,KAAK6pF,kCACvC7pF,KAAK6pF,kCAEF7pF,KAAK6pF,iCACN7pF,KAAK6pF,wCAI2BnlF,IAAjC00F,EAA4C,CAgB7C,MAAMM,EAAe50F,EAAU9E,KAAK+K,WAAW0lD,aAAe2oC,EAA+BA,EAQ7Fp5F,KAAK+K,WAAWo+B,UAAYuwD,EAIzB,cACDzd,GAAwBj8E,KAAK+K,WAAW9K,WAQ5C,OAAO,KAkBF,eAAe2G,EAAe7B,EAAmB4B,GAEtD,GAAsB,SAAnB3G,KAAK+sB,KAAK5pB,MAAsC,eAAnBnD,KAAK+sB,KAAK5pB,KACxC,OAAOnD,KAAK0qD,mBAAmBimC,WAAW3wF,KAAKiH,OAAQL,EAAO7B,EAAW4B,EAAW3G,KAAK+sB,KAAKjiB,UACzF,GAAsB,WAAnB9K,KAAK+sB,KAAK5pB,KAAmB,CAUrC,OATgBnD,KAAK0qD,mBAAmB3jD,UAAU,CAChDE,OAAQjH,KAAKiH,OACbE,YAAa,CAACC,EAAG,6BACjBR,QACAM,MAAOnC,EACP4B,cAED9F,KAAKqB,IAAS,CAAEiC,QAASjC,EAAMiC,QAAQsE,IAAIoiC,GAAKA,EAAEhkC,QAG9C,MAAsB,cAAnB7G,KAAK+sB,KAAK5pB,KACXnD,KAAK0qD,mBAAmBivC,qBAAqB35F,KAAKiH,QAAQpG,KAAKoH,IAG7D,CAAC9D,QAAS8D,EAAKxE,QAAQqB,kBAJ3B,EASK,gBAAgB4uF,EAAuBkG,EAA0BC,EAA2BlzF,EAAmBC,G,0CAI3H,GAAG5G,KAAK+sB,KAAKgyB,iBAAmB/+C,KAAK4yF,uBAGnC,YADA5yF,KAAK4yF,uBAAyB5yF,KAAK85F,gBAAgBvzF,KAAKvG,KAAM0zF,EAAekG,EAAgBC,EAAkBlzF,EAAWC,IAQ5H,IAAIoQ,OAAOm1C,KAAKnsD,KAAKgtB,SAAS7qB,OAC5B,OAGF,IAMI43F,EANAC,EAAa,YAAqBh6F,KAAKgtB,QAAS,QAEjD6sE,GAAoBD,EAAez3F,SACpC63F,EAAaA,EAAWpyF,OAAOf,IAAQ+yF,EAAel/D,SAAS7zB,KAK/DkzF,EADCpzF,EACWC,GAASvE,KAAKP,OAAOk4F,GAE9BtG,GAGWrxF,KAAKP,OAAOk4F,GAI5B,MAAMC,EAASD,EAAWv2F,MAAMu2F,EAAW7kF,UAAUtO,GAAOkzF,EAAYlzF,IAClEqzF,EAAYL,EAAmB,GAAK,CAACE,GACrCI,EAAYN,EAAmB,GAAKG,EAAWv2F,MAAM,EAAGu2F,EAAW7kF,UAAUtO,GAAOkzF,GAAalzF,IAAM/B,UAE1G,MACD9E,KAAKgvD,IAAI,6BAA8B+qC,EAAWnzF,EAAO8sF,EACvDuG,EAAOxxF,IAAIoiC,GAAK7qC,KAAKgpF,sBAAsB/F,mBAAmBp4C,IAC9DsvD,EAAU1xF,IAAIoiC,GAAK7qC,KAAKgpF,sBAAsB/F,mBAAmBp4C,KAGrE,MAAMuvD,EAA4B,GAElCp6F,KAAKqqF,UAAUjqF,UAAUC,IAAI,eAC7B,MAAMg6F,EAAQR,EAAmB,GAAK,GAChC5/D,EAAc4/D,EAAmB,EAAI,EACrCC,EAAkB,CAAC7xF,EAAgBgyB,EAAc,KACrD,MAAMuW,EAAmB,eACzB,IAAI8pD,EAAc,EAsClB,OArCAryF,EAAK3B,QAAQ,CAACO,EAAKxC,KACjB,IAAIrE,KAAKgtB,QAAQnmB,IAAQ7G,KAAKkpF,YAAYvhF,IAAId,GAE5C,YADA7G,KAAKgvD,IAAIp4C,KAAK,qCAAsC/P,GAItD,MAAM0uF,EAAiBv1F,KAAKgtB,QAAQnmB,GAAKkrC,iBASzC,GAPAuoD,GAAgBj2F,EAAM41B,GAAgB,IAAOogE,EAI7C9E,EAAen1F,UAAUC,IAAI,aAC7Bk1F,EAAe5yF,MAAM+yF,gBAAkB4E,EAAc,KAElDj2F,IAAS4D,EAAK9F,OAAS,EAAI,CAC5B,MAAMqtD,EAAmBvtD,IACpBA,EAAE4S,SAAW0gF,IAIhB/kD,EAAiBvqC,UACjBsvF,EAAelsF,oBAAoB,gBAAiBmmD,KAGtD+lC,EAAev0F,iBAAiB,gBAAiBwuD,GAKnD4qC,EAAWz0F,KAAK4vF,KAGdttF,EAAK9F,QACPquC,EAAiBvqC,UAGZ,CAACq0F,cAAa9pD,qBAGjB+pD,EAAST,EAAgBG,EAAQhgE,GACjCugE,EAAYV,EAAgBI,GAC5BO,EAAYX,EAAgBK,EAAWlgE,GACvCoE,EAAW,CAACk8D,EAAO/pD,iBAAkBgqD,EAAUhqD,iBAAkBiqD,EAAUjqD,kBAC3EkqD,EAAmB,CAACH,EAAOD,YAAaE,EAAUF,YAAaG,EAAUH,aAc/E,IAAIn0F,EAsBJ,OAlCGnG,KAAK2yF,wBACA3yF,KAAK2yF,mBAIb,aAAQ,KACNyH,EAAW9zF,QAAQivF,IACjBA,EAAen1F,UAAUuB,OAAO,kBAMjCs4F,EAAO93F,QAAU+3F,EAAU/3F,QAAUg4F,EAAUh4F,UAChDgE,EAAUtD,QAAQC,IAAIu7B,GAEtB,aAA4Bl4B,EAAS9D,KAAKP,OAAO44F,GAAU,KAC1D75F,KAAK,KACJ,aAAQ,KACNu5F,EAAW9zF,QAAQivF,IACjBA,EAAe5yF,MAAM+yF,gBAAkB,KAGzC11F,KAAKqqF,UAAUjqF,UAAUuB,OAAO,iBAK9B,eACF3B,KAAKq5F,kBAAmB,MAKvBlzF,KAGD,uBAAuBhD,EAA6EspD,EAAqBroD,EAAcwjB,GAC7I,MAAM0gB,EAAa,2BAGnB,IAAI16B,EASA+sF,EACJ,GAZAluC,EAAOrsD,UAAUC,IAAIioC,EAAYA,EAAa,IAAMnlC,GAGxC,UAATA,EAAkByK,EAAQ,eAAK,oBACjB,UAATzK,EAAkByK,EAAQ,eAAK,qBACtB,eAATzK,GAAkC,aAATA,EAAqByK,EAAQ,eAAK,cAClD,wBAATzK,IAAgCyK,EAAQ,eAAK,wBACrDA,EAAMxN,UAAUC,IAAI,SAAUioC,EAAa,UAE3C1gB,EAASjiB,KAAKiI,GAGF,UAATzK,EACDykB,EAASjiB,KAAK,eAAK,qBACnBg1F,EAAe,CACb,eAAK,qBACL,eAAK,qBACL,eAAK,qBACL,eAAK,2BAEF,GAAY,UAATx3F,EACRw3F,EAAe,CACb,eAAK,4BACL,eAAK,4BACL,eAAK,4BACL,eAAK,kCAEF,GAAY,aAATx3F,EAAqB,CAC7B,MAAMkpB,EAAW,eAAK,kCACtBA,EAASjsB,UAAUC,IAAI,SAAUioC,EAAa,aAE9CtoC,KAAK2pF,cAAc9sD,cAAcoB,GAAKA,EAAEwuB,SAAWA,GAEnD,MAAM44B,EAAanlF,SAASC,cAAc,OAC1CklF,EAAWjlF,UAAUC,IAAIioC,EAAa,YAEtC,MAAM1b,EAAa5sB,KAAKitB,gBAElB3sB,EAAcN,KAAKy9C,mBAAmB1E,qBAAqBl4C,KAAKoT,IACpE,IAAI2Y,IAAc,OAElB,MAAMnC,EAA+B,GAoBrC,OAnBAyC,GAAY,CACVjZ,MAEAkZ,IAAKk4D,EACLz4D,aACAjC,cAAe3qB,KAAK2qB,cACpByC,MAAOC,GAEP5rB,MAAM,EACNjB,MAAM,EACNmiD,WAAW,EACXl4B,iBAGF,YAAiB46D,EAAapjF,IAC5B,OAAAyb,EAAA,GAAYzb,GACZ,GAAkB0uD,aAAa,CAAC97C,OAAQ5S,EAAE4S,WAGrChS,QAAQC,IAAI2nB,KAGrBzqB,KAAK+1F,oBAAoB3xF,EAASqoD,GAAQ,EAAO,CAACnsD,IAElDsnB,EAASjiB,KAAK0mB,EAAUg5D,GAGvBsV,IACD/yE,EAASjiB,QACJg1F,EAAalyF,IAAI1E,IAClB,MAAM8rD,EAAO3vD,SAASC,cAAc,QAGpC,OAFA0vD,EAAKzvD,UAAUC,IAAIioC,EAAa,cAChCunB,EAAK9lD,OAAOhG,GACL8rD,KAIC,UAAT1sD,EACDw3F,EAAar0F,QAAQvC,IACnB,MAAMiH,EAAI9K,SAASC,cAAc,QACjC6K,EAAE5K,UAAUC,IAAI,eAChB0D,EAAK6a,QAAQ5T,KAEE,UAAT7H,GACRw3F,EAAar0F,QAAQvC,IACnB,MAAMiH,EAAI9K,SAASC,cAAc,QACjC6K,EAAE5K,UAAUC,IAAIioC,EAAa,gBAC7Bt9B,EAAEkf,UAAY,IACdnmB,EAAK6a,QAAQ5T,MAKhB4c,EAASzlB,OAAS,GACnBsqD,EAAOrsD,UAAUC,IAAI,mBAGvBunB,EAASthB,QAAS0O,GAAiBA,EAAQ5U,UAAUC,IAAIioC,EAAa,UAGhE,0BAA0BlkC,GAChC,MAAMqoD,EAASzsD,KAAKitF,kBAAkB7oF,OAASM,OAAWA,OAAWA,GAAW,GAChF+nD,EAAOrsD,UAAUC,IAAI,eAAgB,gBAAiB,kBACtDosD,EAAOrsD,UAAUuB,OAAO,gBAAiB,SAEzC,MAAMm4E,EAAartB,EAAO58C,cAAc,0BAClC+X,EAA8B,GAC9B6rE,EAAQzzF,KAAKs7E,gBAAgBmY,MAAMzzF,KAAKiH,QAC9C,GAAGwsF,GAAuB,YAAdrvF,EAAQgD,EAAiB,CACnC,MAAMmB,EAAIrI,SAASC,cAAc,KACjCoI,EAAEwB,OAAO,eAAK,iBACd6d,EAASjiB,KAAK4C,EAAG,aACTvI,KAAKs7E,gBAAgBtO,WAAWhtE,KAAKiH,SAAWjH,KAAKs7E,gBAAgBlgD,QAAQp7B,KAAKiH,QAAQqQ,OAAOsjF,QACzG56F,KAAK66F,uBAAuB,QAASpuC,EAAQroD,EAASwjB,GAC3B,cAAnB5nB,KAAK+sB,KAAK5pB,KAClBnD,KAAK66F,uBAAuB,sBAAuBpuC,EAAQroD,EAASwjB,GAC5Dhf,EAAA,QAAU6O,OAASzX,KAAKiH,OAChCjH,KAAK66F,uBAAuB,QAASpuC,EAAQroD,EAASwjB,GAC9C5nB,KAAKs7E,gBAAgBj+C,OAAOr9B,KAAKiH,UAAYwsF,GAASzzF,KAAK0qD,mBAAmBm8B,cAAc7mF,KAAKiH,SAA8B,SAAnBjH,KAAK+sB,KAAK5pB,KAC9HnD,KAAK66F,uBAAuB,WAAYpuC,EAAQroD,EAASwjB,GAEzD5nB,KAAK66F,uBAAuB,aAAcpuC,EAAQroD,EAASwjB,GAO7DkyD,EAAWl7D,WAAWgJ,GAEnB5nB,KAAK6pF,gCACN7pF,KAAK2yF,gBAAkB,KAKrB,GAJA3yF,KAAKqqF,UAAUzrE,QAAQ6tC,GACvBzsD,KAAK2yF,qBAAkBjuF,GAGnB1E,KAAK0pF,qBACP,OAAO,gBAIX1pF,KAAKqqF,UAAUzrE,QAAQ6tC,GAGzBzsD,KAAKkxF,oBAAsB9sF,EAAQyC,IAG7B,0BAA6Ci0F,EAAa3uE,GAChE,MAAMkE,EAASrwB,KAAKgpF,sBAAsB+R,kBAAqC,cAAnB/6F,KAAK+sB,KAAK5pB,MAAwB,EAAI,GAE5FiB,EAA0F,CAC9FgD,EAAG0zF,EAAU,iBAAmB,UAChChyE,KAAM,EACN3Z,MAAOnP,KAAKiH,OAASopB,GACrB2qE,QAASh7F,KAAKs7E,gBAAgB2f,cAAcj7F,KAAKiH,QACjDqQ,OAAQ,IAYV,OATIwjF,IACF12F,EAAQA,QAAU,IAGpB,OAAAskE,GAAA,GAAwCtkE,GAExC+nB,GAAQA,EAAK/nB,GAEbpE,KAAK0qD,mBAAmBwwC,aAAa,CAAC92F,IAC/BA,EAGD,UAAU+2F,EAAkBj5F,EAAgBk5F,GAAoB,GAEtE,GADmBp7F,KAAK+K,WAAW5F,UAAUg2F,KAAUj5F,EACvD,CAUA,GANAlC,KAAK+K,WAAW5F,UAAUg2F,GAAQj5F,EAMtB,QAATi5F,GAAkBj5F,GAASlC,KAAKs7E,gBAAgBmY,MAAMzzF,KAAKiH,QAAS,CACrEjH,KAAKgvD,IAAI,0BAET,MAAMpiC,EAAa5sB,KAAKitB,gBACxB,OAAOjtB,KAAK8oF,kBAAkBt8C,WAAWxsC,KAAKiH,OAAO8K,YAAYlR,KAAK4rC,I,MACpE,IAAI7f,IACF,OAGF,KAAqB,QAAjB,EAAA6f,EAAS4uD,gBAAQ,eAAE3jE,aAErB,YADA13B,KAAKs7F,gCAIP,MAAMl3F,EAAUpE,KAAKu7F,2BAA0B,EAAOn3F,IACpDA,EAAQA,QAAUqoC,EAAS4uD,SAAS3jE,cAGtC13B,KAAKs5F,0BAA0Bl1F,KAInCpE,KAAKs7F,iCAGA,gCACL,GAAGt7F,KAAK+K,WAAW5F,UAAUgvB,KAC3Bn0B,KAAK+K,WAAW5F,UAAU2X,aACGpY,IAA7B1E,KAAKkxF,uBAEFlxF,KAAK0qD,mBAAmBouB,kBAAkB94E,KAAKiH,QAAQtC,OAEtDqS,OAAOm1C,KAAKnsD,KAAKgtB,SAAS7qB,SACzBnC,KAAKw7F,qBAEY,cAAnBx7F,KAAK+sB,KAAK5pB,OAAyB6T,OAAOm1C,KAAKnsD,KAAKgtB,SAAS7qB,QAEhE,CACAnC,KAAKgvD,IAAI,iCAET,MAAM5qD,EAAUpE,KAAKu7F,2BAA0B,GAG/C,OAFAv7F,KAAKs5F,0BAA0Bl1F,IAExB,EAGT,OAAO,EAWF,WAAWwC,EAAQ,EAAG9B,GAAU,EAAOq0F,GAAc,EAAOzF,EAAgB,EAAGlkD,GAAW,GAC/F,MAAMvoC,EAASjH,KAAKiH,OAGdq1B,EAAYj6B,KAAKC,IAAI,GAAIi6B,GAAA,EAAWC,QAAU,GAAkB,GAEhEi/D,EAAgBzkF,OAAOm1C,KAAKnsD,KAAKgtB,SAAS7qB,OAAS,EAA2BE,KAAKP,IAAI,GAAIw6B,GAAaA,EAE9G,IAAIv3B,EAAY02F,EAOhB,QAAmB/2F,IAAhBikF,GAA2B,CAC5B,IAAGA,GAKD,MAAO,CAAC7vE,QAAQ,EAAO3S,QAAStD,QAAQoD,SAAQ,IAJ7C+Q,OAAOm1C,KAAKnsD,KAAKgtB,SAAS7qB,OAAS,KAClCwmF,GASR,IAUIiR,EAVAjzF,EAAY,EAWhB,GAVGwyF,IACDxyF,EAAY5B,EAERD,IACFC,EAAY,IAMb2uF,IAAkByF,EACnB,GAAsB,WAAnBn5F,KAAK+sB,KAAK5pB,KACXy2F,EAAiB,CAAClG,OACb,CACL,MACMjwF,EADiBzD,KAAK0qD,mBAAmBouB,kBAAkB7xE,EAAQjH,KAAK+sB,KAAKjiB,UACtD3G,QAAQV,MACrC,GAAGA,EAAMtB,OAAS4C,IAActB,EAAMw5B,MAAM,KAASy+D,MAAO,CAC1D9B,EAAiBn2F,EAAMA,QAGvB,IAAI,IAAIuH,EAAI4uF,EAAez3F,OAAS,EAAG6I,GAAK,IAAKA,EAAG,CAElD,IADgBhL,KAAK+sB,KAAKg4B,WAAW60C,EAAe5uF,IACzC+hF,WACN,MADkB6M,EAAen1F,OAAOuG,EAAG,GAIlDpE,EAAQgzF,EAAeA,EAAez3F,OAAS,IAAMyE,GAQ3D,IACI+0F,EADAt1F,EAA6ErG,KAAKosF,eAAexlF,EAAO7B,EAAW4B,GAIvH,MAAMkzF,GAAmBD,aAAc,EAAdA,EAAgBz3F,SAAUkE,aAAkBxD,QAC/D+4F,EAAwB57F,KAAKgqF,aAAerjF,GAAaN,aAAkBxD,SAAYg3F,EAC1FA,IACD8B,EAAgBt1F,EAChBA,EAAS,CAAClC,QAASy1F,IAIrB55F,KAAKgqF,aAAc,EAEnB,MAAM6R,EAAsBC,GAAiC,mCAC3D,GAAG,mBAAoBA,GAAiBA,EAAc33F,QAAQ84B,MAAM,KAASw8D,KAAM,CACjF,GAAsB,eAAnBz5F,KAAK+sB,KAAK5pB,KAAuB,CAElC,MAAM44F,EAAwB/7F,KAAK0qD,mBAAmBsxC,iCAAiCh8F,KAAKiH,OAAS,IAAMjH,KAAK+sB,KAAKjiB,UAClHixF,GAAuBD,EAAc33F,QAAQwB,KAAKo2F,GACrDD,EAAc33F,QAAQwB,QAAQ3F,KAAK+sB,KAAK6/B,aAAa5sD,KAAK+sB,KAAKjiB,UAAUhG,iBAGrE9E,KAAK4wF,UAAU,OAAO,OAI1BqL,EAAO51F,GASJ,eAA2BxF,KAAK,IAC9Bg7F,EAAcx1F,IACpBxF,KAAK,IACCb,KAAKyuF,qBAAqBpoF,EAAOlC,SAAW,GAAIW,EAASq0F,GAAcU,GAAoBnG,IAIhGwI,EAAkB71F,IACtB,MAAMF,EAAUE,EAAOxF,KAAMwF,IAGxBvB,EAAU9E,KAAKywF,uBAAyBtqF,EAAUnG,KAAK0wF,0BAA4BvqF,IACpFnG,KAAKgvD,IAAIp4C,KAAK,4BAEP/T,QAAQ6oB,UAGd8jB,GACDxvC,KAAK+K,WAAWy3B,YACT,GAIFy5D,EAAI51F,GACToG,IAEF,MADAzM,KAAKgvD,IAAIriD,MAAM,oBAAqBF,GAC9BA,IAGR,OAAOtG,GAGT,IAAIA,EAA2B2S,EAC/B,GAAGzS,aAAkBxD,QACnBiW,GAAS,EACT3S,EAAU+1F,EAAe71F,OACpB,IAAGmpC,EACR,OAAO,KAEP12B,GAAS,EAET3S,EAAU81F,EAAI51F,GAKhB,MAAM81F,EAActC,EAAmBqC,EAAeP,GAAiBx1F,EAEvE,GAAGy1F,GAAwBhzF,EAAA,QAAUo2B,SAASC,kBAAkC,CAC9E,IAAImZ,EAAQyhD,EAAmB,EAAI,EACnC75F,KAAK6pF,gCAAkC,KAGrC,GAFA7pF,KAAKgvD,IAAI,qCAEJ5W,EAAO,OAEZp4C,KAAK6pF,qCAAkCnlF,GAEvB1E,KAAK85F,gBAAgBpG,EAAekG,EAAgBC,EAAkBlzF,EAAWC,IACrF/D,QAAQoD,WAAWpF,KAAK,KAClC2K,WAAW,KACTxL,KAAK8wF,gBAAgBhsF,GAAS,IAC7B,WAIP9E,KAAK6pF,qCAAkCnlF,EAQzC,OALCI,EAAU9E,KAAKywF,qBAAuB0L,EAAcn8F,KAAK0wF,wBAA0ByL,EACpFA,EAAYt7F,KAAK,KACdiE,EAAU9E,KAAKywF,0BAAuB/rF,EAAY1E,KAAK0wF,6BAA0BhsF,IAGjF8qC,EACM,OAGOosD,GAAwBz1F,EAAQtF,KAAK,KASnD,IAAI0zD,EARDzvD,GACD9E,KAAKwpF,iBACLxpF,KAAKypF,kBAAoBpnF,KAAKP,IAAI,IAAK9B,KAAKypF,qBAE5CzpF,KAAKypF,oBACLzpF,KAAKwpF,eAAiBnnF,KAAKP,IAAI,IAAK9B,KAAKwpF,kBAIvC1kF,GAAW9E,KAAKwpF,eAAiB,IAAQ1kF,GAAW9E,KAAKypF,kBAAoB,KAC/El1B,EAAM,YAAqBv0D,KAAKgtB,UAIlC,MAAMovE,EAA4B,EAAhBX,EAEflnC,GAAOA,EAAIpyD,OAASi6F,IAClBt3F,GAGDyvD,EAAMA,EAAI9wD,MAAM24F,GAChBp8F,KAAK4wF,UAAU,UAAU,KAOzBr8B,EAAMA,EAAI9wD,MAAM,EAAG8wD,EAAIpyD,OAASi6F,GAChCp8F,KAAK4wF,UAAU,OAAO,IAQxB5wF,KAAK4sF,oBAAoBr4B,GAAK,MAIlCpuD,EAAQtF,KAAK,KAGW,SAAnBb,KAAK+sB,KAAK5pB,MAITqI,WAAW,KACN1G,EACD9E,KAAK8wF,iBAAgB,GAAM,GAE3B9wF,KAAK8wF,iBAAgB,GAAO,IAE7B,KAMF,CAACh4E,SAAQ3S,YAGX,qBACL,GAAwB,SAAnBnG,KAAK+sB,KAAK5pB,MAAsC,eAAnBnD,KAAK+sB,KAAK5pB,KAC1C,OAGF,GAAGnD,KAAKyyF,qBACN,OAGF,MAAMpjD,EAAiBrvC,KAAK0qD,mBAAmBouB,kBAAkB94E,KAAKiH,OAAQjH,KAAK+sB,KAAKjiB,UACxF,IAAIquE,EAAYn5E,KAAK0qD,mBAAmB0oC,qBAAqBpzF,KAAKiH,OAAQjH,KAAK+sB,KAAKjiB,UACpF,GAAIquE,IAEJA,EAAYniE,OAAOm1C,KAAKnsD,KAAKgtB,SAC5BplB,OAAOf,IAAQ7G,KAAKgtB,QAAQnmB,GAAKzG,UAAUuR,SAAS,WACpDlJ,IAAIuC,IAAMA,GACV3C,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GACnBkI,KAAKzF,GAAKA,EAAImuE,GAEZA,GAAan5E,KAAKgtB,QAAQmsD,IAAY,CACvC,IAAI1sB,EAASzsD,KAAKgtB,QAAQmsD,GACvBn5E,KAAK8pF,mBAAqB9pF,KAAK8pF,oBAAsBr9B,IACtDzsD,KAAK8pF,kBAAkB1pF,UAAUuB,OAAO,mBACxC3B,KAAK8pF,kBAAoB,MAGxB3Q,IAAc9pC,EAAezoC,OAC9B6lD,EAAOrsD,UAAUC,IAAI,mBAGvBL,KAAK8pF,kBAAoBr9B,EACzBzsD,KAAKyyF,sBAAuB,GAIzB,wBACL,MAAM4J,KAAqBr8F,KAAKm/E,kBAAZ,EACpB,IAAI,MAAMn0E,KAAKhL,KAAKmpF,aAAc,CAChC,MAAM6E,EAAchuF,KAAKmpF,aAAan+E,GAEnCgjF,EAAY/tF,UAAUgK,oBAAsBoyF,IAC7CrO,EAAY/tF,UAAU0B,SACnB3B,KAAKm/E,mBACNn/E,KAAKm/E,kBAAkBj0C,UAAU8iD,EAAY/tF,UAAW+tF,EAAY7gE,YAE/DntB,KAAKmpF,aAAan+E,IAI7BhL,KAAKs7F,iCAIF,SAASrC,KACd,MAAM10E,EAAMrkB,SAASskB,gBAAgB,6BAA8B,OACnED,EAAIE,eAAe,KAAM,UAAW,aACpCF,EAAIE,eAAe,KAAM,QAAS,MAClCF,EAAIE,eAAe,KAAM,SAAU,MACnCF,EAAInkB,UAAUC,IAAI,eAElB,MAAMumC,EAAM1mC,SAASskB,gBAAgB,6BAA8B,OAKnE,OAJAoiB,EAAIniB,eAAe,KAAM,OAAQ,wBAEjCF,EAAIxa,OAAO68B,GAEJriB,EE3/HM,MAAM,GACnB,YAAYtd,EAAgBJ,EAAay1F,EAAcr1C,G,MACrD,IAAIr5C,EAAoB8pB,EAA0BsL,EAChDplB,EAAuC,GAAIia,EAA6C,GAE1F,MAAM0kE,EAAW,IAAgBC,cAAcv1F,GAEzC+wB,EAAW,CAACra,EAA4C8+E,EAAmBC,KAC/ElxF,WAAW,KACT,IAAIrF,EAGAA,EAFDm2F,IAAUz1F,EACR01F,EACS,IAAmBI,iBAAiB11F,GAEpC,IAAmB21F,mBAAmB31F,GAGxC,IAAmB41F,oBAAoB51F,EAAQJ,EAAKy1F,EAAOI,EAAQD,GAG5Ex1C,GACD9gD,EAAQtF,KAAKomD,IAEd,MAGL,GAAGq1C,EAAO,CACR,IAAIQ,EAA0B,eAC1Bj2F,GAWF+G,EAAQ,yBACR8pB,EAAc,sBAXX6kE,GACD3uF,EAAQ,uBACR8pB,EAAc,oCACdsL,EAAkB,CAAC,KAA+C,QAAzC,MAAmBgwD,eAAe/rF,UAAO,eAAEtC,QAAS,MAE7EiJ,EAAQ,wBACR8pB,EAAc,8BACdolE,EAAa,oBAOjBl/E,EAAQjY,KAAK,CACXovB,QAAS+nE,EACT55D,UAAU,EACVlL,iBAEG,CACLpqB,EAAQ,uBACR,MAAMmvF,EAA6B,aAEhC91F,EAAOw3B,aACR7gB,EAAQjY,KAAK,CACXovB,QAASgoE,EACT/kE,SAAWra,GAAYqa,EAASra,GAAS,GAAQA,EAAQ7d,QAGxD,IAAgBq4B,YAAYlxB,EAAO4vB,YACpCa,EAAc,0BAEdA,EAAc,kBAEdG,EAAWlyB,KAAK,CACduX,KAAM,YACNS,SAAS,OAIb+Z,EAAc,sBAEXzwB,IAAW2B,EAAA,QAAU6O,KACtBmG,EAAQjY,KAAK,CACXovB,QAASgoE,EACT/kE,cAGFpa,EAAQjY,KAAK,CACXovB,QAASgoE,EACT/kE,SAAWra,GAAYqa,EAASra,GAAUA,EAAQ7d,QAGpD+3B,EAAWlyB,KAAK,CACduX,KAAM,aACNimB,SAAU,CAAC,IAAI,KAAU,CAACl8B,WAAS+N,SACnC2I,SAAS,MAMjB,aAAgBC,GAEF,IAAI,GAAU,oBAAqB,CAC/C3W,SACAysB,aAAc9lB,EACd6pB,mBAAoBC,EACpBE,oBAAqBoL,EACrBplB,UACAia,eAGItX,QC/GK,SAASy8E,GAAiBluD,EAAYvjC,OAAOm8C,gBAC1D,IAAI5Y,IAAcA,EAAUm5C,WAC1B,OAAO,EAGT,MAAMgV,EAAiBnuD,EAAUq5C,WAAW,GAC5C,OAAI8U,EAAe90C,aAAe80C,EAAeC,aCEpC,MAAM,WAAmC,GAEtD,YAAYj2F,EAAgBgB,EAAgBk1F,EAA2Bl2C,GACrEhkD,MAAM,gCAAiC,CACrCo0B,SAAS,EACTI,mBAAoB,aACpB7Z,QAAS,CAAC,CACRmX,QAAS,aACTiD,SAAU,KACJn2B,EAAW0wB,YAIf00B,GAAaA,IACb,IAAmBm2C,eAAen2F,EAAQgB,EAAMk1F,EAAQt7F,EAAWK,OAAOrB,KAAK2qE,IACzEA,GAEJr2C,GAAS,CACPC,YAAa,yBAKrBjf,MAAM,IAGR,MAAMgX,EAAMjtB,SAASC,cAAc,OAGnC+sB,GAAY,CACVjZ,IAHU,GAAmBumC,wBAAwB,GAA2B6iD,eAIhFlwE,MACAgtB,MAAO,GAA2BkjD,cAClC38F,MALW,IAMXC,OANW,IAOXH,MAAM,EACNiB,MAAM,IACLwf,QAAQ,KACTjhB,KAAKugB,SAGPvgB,KAAKyN,OAAO1D,OAAOojB,GAEnB,MAAMtrB,EAAa,IAAI,IAAW,CAChC2P,MAAO,aACPC,UAAW,IACX7E,YAAa,0BAGf/K,EAAWE,MAAMf,iBAAiB,QAAS,KACzChB,KAAK4d,QAAQ,GAAG5I,QAAQ0d,gBAAgB,YAAa7wB,EAAW0wB,aAGlEvyB,KAAKmW,KAAKpM,OAAOlI,EAAW5B,YApDhB,GAAAo9F,cAAgB,QCCjB,MAAM,WAA4B,GAC/C,YAAYp2F,EAAgBgB,EAAgBg/C,GAC1ChkD,MAAM,wBAAyB,CAACywB,aAAc,2BAA4B9V,QAAS,GAAIzH,MAAM,IAE7FlO,EAAOA,EAAKxE,QAEZ,MAAMma,EAA8C,CAClD,CAAC,iBAAkB,yBACnB,CAAC,qBAAsB,6BACvB,CAAC,kBAAmB,+BACpB,CAAC,wBAAyB,gCAC1B,CAAC,kBAAmB,2BAItBA,EAAQtX,QAAQiC,IACd,MAAMsS,EAAS,YAFC,8BAEiB,CAAqBqC,KAAM3U,EAAE,KAC9DvI,KAAKmW,KAAKpM,OAAO8Q,KAGnB,MAAMyiF,EAAwB,GAAmBC,4BAA4B,GAA2BF,eAExG,YAAiBr9F,KAAKmW,KAAOlU,IAC3B,MAAM4S,EAAS,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAAQ,eACnCsoF,EAASv/E,EAAQ,OAAAwnC,GAAA,GAAWvwC,IAAS,GAE3CyoF,EAAsBz8F,KAAK,KACzBb,KAAKu/B,OAEL,IAAI,GAA2Bt4B,EAAQgB,EAAMk1F,EAAQl2C,MAEtD,CAACl5C,eAAgB/N,KAAK+N,iBAEzB/N,KAAKmW,KAAKxT,MAAM66F,OAAS,UACzBx9F,KAAKy9F,UAAU96F,MAAM+6F,UAAY,QAEjC19F,KAAKugB,QCvBM,MAAM,GAenB,YAAoB2tC,EACVnhC,EACA29B,EACA4wB,EACAqiB,EACAC,EACA5U,GANU,KAAA96B,WACV,KAAAnhC,OACA,KAAA29B,qBACA,KAAA4wB,kBACA,KAAAqiB,kBACA,KAAAC,iBACA,KAAA5U,wBA6TF,KAAA6U,qBAAuB,KAC1B79F,KAAK+sB,KAAK+hB,UAAUC,YACrB,YAAmB/uC,KAAK+sB,KAAK+hB,UAAUif,qBAEvC,IAAI,GAAa/tD,KAAKiH,OAAQjH,KAAK+sB,KAAK6/B,aAAa5sD,KAAK6G,OAItD,KAAAi3F,aAAe,KACrB99F,KAAK+sB,KAAKhrB,MAAM+rF,iBAAiB9tF,KAAK6G,MAGhC,KAAAk3F,YAAc,KACpB/9F,KAAK+sB,KAAKhrB,MAAMi8F,mBAAmBh+F,KAAK6G,MAGlC,KAAAo3F,YAAc,KACpB,GAAGjB,KAAoB,CAUrBjpE,IATa/zB,KAAK+sB,KAAK+hB,UAAUC,YAC/B,IAAI/uC,KAAK+sB,KAAK+hB,UAAUgZ,aAAa93C,IAAIhQ,KAAKiH,SAASoB,KAAK,CAACC,EAAGC,IAAMD,EAAIC,GAC1E,CAACvI,KAAK6G,MAESk9B,OAAO,CAACC,EAAKn9B,KAC5B,MAAMzC,EAAUpE,KAAK+sB,KAAKg4B,WAAWl+C,GACrC,OAAOm9B,IAAO5/B,aAAO,EAAPA,EAASA,SAAUA,EAAQA,QAAU,KAAO,KACzD,IAAIkH,aAIPpL,SAASo0B,YAAY,SAKjB,KAAA4pE,sBAAwB,KAC9BnqE,GAAqB/zB,KAAK6U,OAA6Bw9C,OAGjD,KAAA8rC,gBAAkB,KACxB,IAAIC,EACkB,eAAnBp+F,KAAK+sB,KAAK5pB,OACXi7F,EAAgBp+F,KAAK0qD,mBAAmBlxC,iBAAiBxZ,KAAKiH,OAAQjH,KAAK+sB,KAAKjiB,WAGlF,MAAM0rB,EAAWx2B,KAAKs7E,gBAAgBjvC,gBAAgB+xD,EAAgBA,EAAcxyF,OAAS5L,KAAKiH,QAC5F+pF,EAAQhxF,KAAKgpF,sBAAsB/F,mBAAmBjjF,KAAK6G,KACjE,IACI0H,EADAmG,EAAM,gBAEP8hB,GACD9hB,GAAO8hB,EAAW,KAAO4nE,EAAgBp+F,KAAKgpF,sBAAsB/F,mBAAmBmb,EAAcjkB,SAASkkB,cAAgBrN,GAC3HoN,IAAe1pF,GAAO,YAAcs8E,GACvCziF,EAAM,eAENmG,GAAO,KAAO1U,KAAKiH,OAAO4vB,WAAa,IAAMm6D,EAC1CoN,IAAe1pF,GAAO,WAAa1U,KAAKgpF,sBAAsB/F,mBAAmBmb,EAAcv3F,MAClG0H,EAAM,yBAGR2mB,GAAM,UAAKlc,OAAOzK,GAAK,IAEvBwlB,GAAoBrf,IAGd,KAAA4pF,WAAa,KACnB,IAAI,GAAgBt+F,KAAKiH,OAAQjH,KAAK6G,MAGhC,KAAA03F,aAAe,KACrB,IAAI,GAAgBv+F,KAAKiH,OAAQjH,KAAK6G,KAAK,IAGrC,KAAA23F,cAAgB,KACtBx+F,KAAK29F,gBAAgBpmD,SAASv3C,KAAKoE,QAAS,KAGtC,KAAAq6F,WAAa,KACnBz+F,KAAK29F,gBAAgBe,SAAS1+F,KAAKoE,UAG7B,KAAAgqD,eAAiB,KACvB,GAAGpuD,KAAK+sB,KAAK+hB,UAAUC,YACrB,YAAmB/uC,KAAK+sB,KAAK+hB,UAAU+c,yBAClC,CACL,MAAM5jD,EAAOjI,KAAK2+F,qBAAuB,CAAC3+F,KAAK6G,KAAO7G,KAAK+sB,KAAK6/B,aAAa5sD,KAAK6G,KAClF,IAAI,GAAa,CACf,CAAC7G,KAAKiH,QAASgB,MAKb,KAAAomD,cAAgB,KACtBruD,KAAK+sB,KAAK+hB,UAAUE,gBAAgB,OAAAltB,GAAA,GAAgB9hB,KAAK6U,OAAQ,iBAAmB,OAAAiN,GAAA,GAAgB9hB,KAAK6U,OAAQ,YAG3G,KAAAy5C,sBAAwB,KAC9BtuD,KAAK+sB,KAAK+hB,UAAU2Y,mBAGd,KAAA8G,cAAgB,KACnBvuD,KAAK+sB,KAAK+hB,UAAUC,YACrB,YAAmB/uC,KAAK+sB,KAAK+hB,UAAUgd,oBAEvC,IAAI,GAAoB9rD,KAAKiH,OAAQjH,KAAK2+F,qBAAuB,CAAC3+F,KAAK6G,KAAO7G,KAAK+sB,KAAK6/B,aAAa5sD,KAAK6G,KAAM7G,KAAK+sB,KAAK5pB,OAja5H,MAAMqrD,EAAiBvsD,IAMrB,IAAIwqD,EAAqB8oC,EALtBv1F,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAKd,IACEqnF,EAAiB,OAAAzzE,GAAA,GAAgB7f,EAAE4S,OAAQ,0BAC3C43C,EAAS8oC,EAAiBA,EAAezkF,cAAgB,OAAAgR,GAAA,GAAgB7f,EAAE4S,OAAQ,UACnF,MAAM5S,IAGR,IAAIwqD,GAAUA,EAAOrsD,UAAUuR,SAAS,gBAAiB,OAGzD,IADG1P,aAAawkB,YAAcxkB,EAAEmpE,eAAe,oBAAoBnpE,EAAU8Y,iBAC1E/a,KAAKgV,QAAQ5U,UAAUuR,SAAS,UACjC,OAAO,GAEN1P,aAAawkB,YAAcxkB,EAAEmpE,eAAe,mBAAkBnpE,EAAUwsD,cAAe,GAE1F,IAAI5nD,GAAO4lD,EAAOrgD,QAAQvF,IAC1B,IAAIA,EAAK,OAcT,GAZA7G,KAAK4+F,aAAe5+F,KAAK+sB,KAAK+hB,UAAU4d,gBAAgBD,GACxDzsD,KAAKiH,OAASjH,KAAK+sB,KAAK9lB,OAExBjH,KAAK6U,OAAS5S,EAAE4S,OAChB7U,KAAK6+F,gBAAkB7B,KACvBh9F,KAAK8+F,eAAyC,MAAxB9+F,KAAK6U,OAAO02B,UACc,WAA7CvrC,KAAK6U,OAA6BA,QACnC7U,KAAK6U,OAAOzU,UAAUuR,SAAS,eAEjC3R,KAAK++F,iBAA2C,MAAxB/+F,KAAK6U,OAAO02B,SAAmBvrC,KAAK6U,OAAOzU,UAAUuR,SAAS,WAGnFob,EAAK+hB,UAAUC,cAAgBwmD,EAAgB,CAChD,MAAMttF,EAAOjI,KAAK+sB,KAAK6/B,aAAa/lD,GACpC,GAAGoB,EAAK9F,OAAS,EAAG,CAClB,MAAM68F,EAAch/F,KAAK+sB,KAAK+hB,UAAU2a,cAAczpD,KAAKiH,OAAQJ,GACjEA,EACAoB,EAAKwI,KAAK5J,GAAO7G,KAAK+sB,KAAK+hB,UAAU2a,cAAczpD,KAAKiH,OAAQJ,IAC/Dm4F,IACDn4F,EAAMm4F,IAKZ,MAAMC,EAAc,OAAAn9E,GAAA,GAAgB9hB,KAAK6U,OAAQ,gBACjD7U,KAAK2+F,uBAAyBM,EAE5Bj/F,KAAK6G,IADJo4F,GACWA,EAAY7yF,QAAQvF,IAErBA,EAGb7G,KAAKwpD,WAAaxpD,KAAK+sB,KAAK+hB,UAAU2a,cAAczpD,KAAKiH,OAAQjH,KAAK6G,KACtE7G,KAAKoE,QAAUpE,KAAK+sB,KAAKg4B,WAAW/kD,KAAK6G,KAEzC7G,KAAK4d,QAAQtX,QAAQuU,IACnB,IAAIqH,EAGD6K,EAAK+hB,UAAUC,cAAgBl0B,EAAO6zC,cACvCxsC,GAAO,GAEAqzE,GAAkB,sBAAzBrzE,EACErH,EAAO9F,UAIX8F,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAAS4V,KAG3C,MAAMi5E,EAAyB1uC,EAAOrsD,UAAUuR,SAAS,SAAW,OAAS,QAG7E,aAAc1P,EAAiB+Y,QAAW/Y,EAAiB+Y,QAAQ,GAAK/Y,EAAiBjC,KAAKgV,QAASmmF,GACvG,aAAYn7F,KAAKgV,QAAS,KACxBhV,KAAK6G,IAAM,EACX7G,KAAKiH,YAASvC,EACd1E,KAAK6U,OAAS,QAIf,sBACD,YAAiBq5C,EAAWjsD,IAC1B,GAAG8qB,EAAK+hB,UAAUC,YAChB,OAGF,MAAMvlC,EAAavH,EAAE4S,OAAuBrL,UAC5C,IAAIA,IAAcA,EAAUkxB,SAAU,OAEtC3N,EAAKiiC,IAAI,WAAY/sD,GAER,CAAC,SAAU,yBAA0B,iBAAkB,UAAW,OAAQ,SAASwO,KAAKkjB,GAAKnqB,EAAUoJ,MAAM,IAAImgD,OAAOp/B,EAAI,eAEvI,OAAAjW,EAAA,GAAYzb,GAGZusD,EAAcvsD,KAEf,CAAC8L,eAAgB/N,KAAK+sB,KAAKC,QAAQjf,iBACjC,aAA0BmgD,EAAUM,EAAexuD,KAAK+sB,KAAKC,QAAQjf,gBAGtE,OACN/N,KAAK4d,QAAU,CAAC,CACdvQ,KAAM,QACN6P,KAAM,sBACNC,QAASnd,KAAK69F,qBACd9oF,OAAQ,IAAyB,cAAnB/U,KAAK+sB,KAAK5pB,OAAyBnD,KAAKoE,QAAQkT,OAAO+Q,aACpE,CACDhb,KAAM,QACN6P,KAAM,oCACNC,QAASnd,KAAK69F,qBACd9oF,OAAQ,IAAyB,cAAnB/U,KAAK+sB,KAAK5pB,MAAwBnD,KAAKwpD,aAAexpD,KAAK+sB,KAAK+hB,UAAUif,oBAAoBmxC,aAAa,YACzHC,UAAW,KAAM,EACjBzwC,eAAe,GACd,CACDrhD,KAAM,WACN6P,KAAM,0BACNC,QAAS,KACPnd,KAAK+sB,KAAKhrB,MAAMq9F,gBAAgB,KAC9Bp/F,KAAK0qD,mBAAmB20C,YAAYr/F,KAAKoE,QAASpE,KAAKoE,QAAQA,QAAS,CACtEk7F,aAAct/F,KAAK+sB,KAAKhrB,MAAMu9F,aAC9BzoD,SAAU72C,KAAKoE,QAAQyyC,WAGzB72C,KAAK+sB,KAAKhrB,MAAM4G,eAAc,GAAO,IACpC,IAAI0sC,KAAyB,IAApBr1C,KAAKoE,QAAQ0kB,QAE3B/T,OAAQ,IAAyB,cAAnB/U,KAAK+sB,KAAK5pB,MACvB,CACDkK,KAAM,QACN6P,KAAM,QACNC,QAASnd,KAAK89F,aACd/oF,OAAQ,IAAM/U,KAAK0qD,mBAAmBm8B,cAAc7mF,KAAKiH,OAAQjH,KAAK+sB,KAAKjiB,YACxE9K,KAAKoE,QAAQkT,OAAO+Q,eACnBroB,KAAK+sB,KAAKhrB,MAAM6lF,cACC,cAAnB5nF,KAAK+sB,KAAK5pB,MAEX,CACDkK,KAAM,OACN6P,KAAM,OACNC,QAASnd,KAAK+9F,YACdhpF,OAAQ,IAAM/U,KAAK0qD,mBAAmB60C,eAAev/F,KAAKoE,QAAS,WAAapE,KAAK+sB,KAAKhrB,MAAM6lF,cAC/F,CACDv6E,KAAM,OACN6P,KAAM,OACNC,QAASnd,KAAKi+F,YACdlpF,OAAQ,OAAQ/U,KAAKoE,QAAQA,SAAYpE,KAAK6+F,gBAAoB7+F,KAAK8+F,gBAAkB9+F,KAAKoE,QAAQA,UAAYpE,KAAK6U,OAAOqV,YAC7H,CACD7c,KAAM,OACN6P,KAAM,wBACNC,QAASnd,KAAKi+F,YACdlpF,OAAQ,MAAQ/U,KAAKoE,QAAQA,SAAWpE,KAAK6+F,gBAC5C,CACDxxF,KAAM,OACN6P,KAAM,iCACNC,QAASnd,KAAKi+F,YACdlpF,OAAQ,KACN,IAAI/U,KAAKwpD,WACP,OAAO,EAGT,IAAI,MAAOviD,EAAQgB,KAASjI,KAAK+sB,KAAK+hB,UAAUgZ,aAC9C,IAAI,MAAMjhD,KAAOoB,EACf,GAAKjI,KAAK0qD,mBAAmBlxC,iBAAiBvS,EAAQJ,GAAKzC,QACzD,OAAO,EAKb,OAAO,GAET+6F,UAAW,KAAM,EACjBzwC,eAAe,GACd,CACDrhD,KAAM,OACN6P,KAAM,WACNC,QAASnd,KAAKk+F,sBACdnpF,OAAQ,IAAM/U,KAAK8+F,eACnBpwC,eAAe,GACd,CACDrhD,KAAM,OACN6P,KAAM,6BACNC,QAAS,KACP4W,GAAoB/zB,KAAK6U,OAAO5Q,YAElC8Q,OAAQ,IAAM/U,KAAK++F,iBACnBrwC,eAAe,GACd,CACDrhD,KAAM,OACN6P,KAAM,4BACNC,QAAS,KACP4W,GAAoB/zB,KAAK6U,OAAO5Q,YAElC8Q,OAAQ,IAAM/U,KAAK6U,OAAOzU,UAAUuR,SAAS,kBAC7C+8C,eAAe,GACd,CACDrhD,KAAM,OACN6P,KAAM,kCACNC,QAASnd,KAAKm+F,gBACdppF,OAAQ,IAAM/U,KAAKs7E,gBAAgBj5C,UAAUriC,KAAKiH,UAAYjH,KAAKoE,QAAQkT,OAAO+Q,aACjF,CACDhb,KAAM,MACN6P,KAAM,sBACNC,QAASnd,KAAKs+F,WACdvpF,OAAQ,KAAO/U,KAAKoE,QAAQkT,OAAO+Q,aACd,mBAAnBroB,KAAKoE,QAAQgD,IACZpH,KAAKoE,QAAQkT,OAAOkjE,QACrBx6E,KAAKs7E,gBAAgBkhB,cAAcx8F,KAAKiH,SACrB,cAAnBjH,KAAK+sB,KAAK5pB,MACX,CACDkK,KAAM,QACN6P,KAAM,wBACNC,QAASnd,KAAKu+F,aACdxpF,OAAQ,IAAM/U,KAAKoE,QAAQkT,OAAOkjE,QAAUx6E,KAAKs7E,gBAAgBkhB,cAAcx8F,KAAKiH,SACnF,CACDoG,KAAM,WACN6P,KAAM,+BACNC,QAAS,KACPnd,KAAK49F,eAAex8C,YAAYphD,KAAKoE,QAAQ0O,MAAM5S,WAErD6U,OAAQ,K,MACN,GAAG/U,KAAKoE,QAAQkT,OAAO+Q,YACrB,OAAO,EAGT,MAAMpU,EAAoC,QAAlB,EAAAjU,KAAKoE,QAAQ0O,aAAK,eAAE5S,SAC5C,IAAI+T,EAAK,OAAO,EAEhB,IAAIurF,IAAc,sBAClB,MAAMC,GAAcxrF,EAAI9Q,OAAU,CAAC,MAAO,QAAS,WAAoCu3B,SAASzmB,EAAI9Q,MAEpG,OADGs8F,IAAYD,EAAYA,KAAe,OAAA19E,GAAA,GAAgB9hB,KAAK6U,OAAQ,eAAiB,OAAAiN,GAAA,GAAgB9hB,KAAK6U,OAAQ,UAC9G4qF,GAAcD,IAEtB,CACDnyF,KAAM,eACN6P,KAAM,mBACNC,QAASnd,KAAKw+F,cACdzpF,OAAQ,K,MACN,MAAM47B,EAAyB,QAAlB,EAAA3wC,KAAKoE,QAAQ0O,aAAK,eAAE69B,KACjC,OAAOA,GAAQA,EAAKiC,cAAczwC,SAAWwuC,EAAKr5B,OAAOo7B,SAAW/B,EAAKr5B,OAAOu5B,OAGjF,CACDxjC,KAAM,OACN6P,KAAM,iBACNC,QAASnd,KAAKy+F,WACd1pF,OAAQ,K,MACN,MAAM47B,EAAyB,QAAlB,EAAA3wC,KAAKoE,QAAQ0O,aAAK,eAAE69B,KACjC,OAAO3wC,KAAK0qD,mBAAmB60C,eAAev/F,KAAKoE,QAAS,SAAWusC,IAASA,EAAKr5B,OAAOo7B,SAAW1yC,KAAKoE,QAAQkT,OAAO+Q,cAG5H,CACDhb,KAAM,UACN6P,KAAM,UACNC,QAASnd,KAAKouD,eACdr5C,OAAQ,IAAyB,cAAnB/U,KAAK+sB,KAAK5pB,OAAyBnD,KAAKoE,QAAQkT,OAAO+Q,aAAkC,mBAAnBroB,KAAKoE,QAAQgD,GAChG,CACDiG,KAAM,UACN6P,KAAM,oCACNC,QAASnd,KAAKouD,eACdr5C,OAAQ,IAAM/U,KAAK+sB,KAAK+hB,UAAU+c,qBAChC7rD,KAAKwpD,aACJxpD,KAAK+sB,KAAK+hB,UAAU+c,oBAAoBqzC,aAAa,YACxDC,UAAW,KAAM,EACjBzwC,eAAe,GACd,CACDrhD,KAAM,OACN6P,KAAM,aACNC,QAAS,KACP,IAAI,GAAoBnd,KAAKiH,OAAQ,CAACjH,KAAK6G,OAE7CkO,OAAQ,KAAO/U,KAAKoE,QAAQkT,OAAO0M,KAA0B,YAAnBhkB,KAAKoE,QAAQgD,IAAoBpH,KAAKoE,QAAQkT,OAAO+Q,aAAeroB,KAAKs7E,gBAAgBj5C,UAAUriC,KAAKiH,QAClJk4F,UAAW,KAAM,EACjBzwC,eAAe,GACd,CACDrhD,KAAM,SACN6P,KAAM,yBACNC,QAASnd,KAAKquD,cACdt5C,OAAQ,KAAO/U,KAAKoE,QAAQG,SAAWvE,KAAKwpD,YAAcxpD,KAAK4+F,aAC/DO,UAAW,KAAM,EACjBzwC,eAAe,GACd,CACDrhD,KAAM,SACN6P,KAAM,kCACNC,QAASnd,KAAKsuD,sBACdv5C,OAAQ,IAAM/U,KAAKwpD,WACnB21C,UAAW,KAAM,EACjBzwC,eAAe,GACd,CACDrhD,KAAM,gBACN6P,KAAM,SACNC,QAASnd,KAAKuuD,cACdx5C,OAAQ,IAAM/U,KAAK0qD,mBAAmBE,iBAAiB5qD,KAAKoE,UAC3D,CACDiJ,KAAM,gBACN6P,KAAM,mCACNC,QAASnd,KAAKuuD,cACdx5C,OAAQ,IAAM/U,KAAKwpD,aAAexpD,KAAK+sB,KAAK+hB,UAAUgd,mBAAmBozC,aAAa,YACtFC,UAAW,KAAM,EACjBzwC,eAAe,IAGjB1uD,KAAKgV,QAAU,GAAWhV,KAAK4d,QAAS5d,KAAK+sB,KAAKC,QAAQjf,gBAC1D/N,KAAKgV,QAAQ7F,GAAK,qBAClBnP,KAAKgV,QAAQ5U,UAAUC,IAAI,eAC3BL,KAAK+sB,KAAK9sB,UAAU8J,OAAO/J,KAAKgV,U,mCChWrB,MAAM,GAKnB,YAAYhS,GAQVhD,KAAK0/F,gBAAkB,CAAC,CACtBryF,KAAM,OACN6P,KAAM,yBACNC,QAASna,EAAQ28F,cACjB5qF,OAAQ,IAAoB,aAAd/U,KAAKmD,MAClB,CACDkK,KAAM,WACN6P,KAAM,6BACNC,QAASna,EAAQ48F,gBACjB7qF,OAAQ,IAAoB,aAAd/U,KAAKmD,MAClB,CACDkK,KAAM,WACN6P,KAAM,wBACNC,QAASna,EAAQ48F,gBACjB7qF,OAAQ,IAAoB,aAAd/U,KAAKmD,OAGrBnD,KAAK6/F,SAAW,GAAW7/F,KAAK0/F,gBAAiB18F,EAAQ+K,gBACzD/N,KAAK6/F,SAASz/F,UAAUC,IAAI,YAAa2C,EAAQ88F,UAEjD,aAA0B98F,EAAQ+8F,iBAAmB99F,IAChDe,EAAQiN,SAAWjN,EAAQiN,WAI9BjQ,KAAK0/F,gBAAgBp5F,QAAQuU,IAC3BA,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAASuO,EAAO9F,YAGlD,OAAA2I,EAAA,GAAYzb,GACZ,aAAYjC,KAAK6/F,YAChB78F,EAAQ+K,gBAGN,UAAU9G,GACfjH,KAAKmD,KAAO8D,IAAW2B,EAAA,QAAU6O,KAAO,WAAa,Y,sBClC1C,MAAM,WAAwB,KAc3C,YAAoBsV,GAkBlB,GAjBA9pB,MAAM,oCAAqC,KAAM,CAACm8B,UAAU,EAAM+wC,YAAa,SAAUh6D,MAAM,IAD7E,KAAA4W,OAVZ,KAAA0P,OAAS,EAmKT,KAAAujE,cAAgB,KACtBhgG,KAAKigG,QA2GP,KAAAlzF,QAAW9K,IACT,MAAM4S,EAAS5S,EAAE4S,OAEXqrF,EAAa,OAAA7+D,GAAA,GAAUxsB,EAAQ,SAC/BsrF,EAAU,OAAAC,GAAA,GAAavrF,GACzBsrF,IACFtrF,EAAO/D,cAAc1Q,UAAUC,IAAI,aACnC6/F,EAAW9/F,UAAUuB,OAAO,iBAC5Bu+F,EAAWrgF,kBAAkBukB,gBAAgB,cAG/B87D,EAAWhoE,qBACbioE,GAAWngG,KAAKqgG,UAAUp2F,kBAAoB,IAC1DjK,KAAKsgG,kBAGPtgG,KAAKyyB,gBAGP,KAAA87B,cAAiBtsD,IACf,MAAM4S,EAAS5S,EAAE4S,OACXrD,EAAQ,OAAA6vB,GAAA,GAAUxsB,EAAQ,SAC1BxQ,EAAM,OAAA+gD,GAAA,GAAW5zC,GAEpBxR,KAAKugG,gBAAkBvgG,KAAKugG,eAAe,GAAG,KAAOl8F,IACtDrE,KAAKugG,oBAAiB77F,GAGxB8M,EAAM7P,SACN3B,KAAKwgG,kBAAkB/7F,OAAOJ,EAAK,GAEnCrE,KAAKwgG,kBAAkBl6F,QAAQ,CAACzE,EAAYwC,KAC1CxC,EAAWmB,QAAQy9F,aAAat+F,OAAS,EACzCN,EAAWmB,QAAQy9F,aAAa96F,KAAKtB,EAAM,GACvB,UAAKq8F,QAAQ1wF,IAAInO,EAAW2P,MAAMqO,mBAC1C8hB,WAGd3hC,KAAKyyB,gBAxSL,gBAAMzyB,KAAK4N,MAAO,WAElB5N,KAAK2gG,mBAAqB,IAAI,IAAW,CACvC/zF,YAAa,eACb4E,MAAO,eACPlI,KAAM,WACNmI,UA3BsB,MA8BxBzR,KAAK+N,eAAe1N,IAAIL,KAAK2gG,mBAAmB5+F,MAAhD/B,CAAuD,QAAS,KAC9DA,KAAKyyB,iBAGPzyB,KAAKwgG,kBAAoB,GAEH,cAAnBxgG,KAAK+sB,KAAK5pB,KAAsB,CACjC,MAAM08F,EAAW,IAAI,GAAgB,CACnCF,cAAe,KACb3/F,KAAK+sB,KAAKhrB,MAAM6+F,YAAa,EAC7B5gG,KAAKigG,QAEPL,gBAAiB,KACf5/F,KAAK+sB,KAAKhrB,MAAMq9F,gBAAgB,KAC9Bp/F,KAAKigG,UAGTH,SAAU,cACVC,iBAAkB//F,KAAKowE,aAGzByvB,EAASgB,UAAU7gG,KAAK+sB,KAAK9lB,QAE7BjH,KAAKyN,OAAO1D,OAAO81F,EAASA,UAG9B7/F,KAAKyN,OAAO1D,OAAO/J,KAAK2gG,mBAAmB1gG,WAE3C,MAAMixC,EAAKhxC,SAASC,cAAc,MAC5Buf,EAAIxf,SAASC,cAAc,OACjCuf,EAAEtf,UAAUC,IAAI,WAChB,gBAAMqf,EAAG,eAET1f,KAAKqgG,UAAYngG,SAASC,cAAc,QACxCH,KAAKqgG,UAAUjgG,UAAUC,IAAI,yBAE7B,MAAMygG,EAAK5gG,SAASC,cAAc,OAClC2gG,EAAG1gG,UAAUC,IAAI,wBAEjB,MAAM0gG,EAAkB7gG,SAASC,cAAc,OAC/C4gG,EAAgB3gG,UAAUC,IAAI,WAC9B,gBAAM0gG,EAAiB,YAEnB/gG,KAAK+sB,KAAKuuD,gBAAgBnjD,YAAYn4B,KAAK+sB,KAAK9lB,UAClDjH,KAAKghG,uBAAyB,IAAI,KAAc,CAC9C9jF,KAAM,oBACN5T,KAAM,cAERtJ,KAAKghG,uBAAuBj/F,MAAM4b,SAAU,EAC5CmjF,EAAG/2F,OAAO/J,KAAKghG,uBAAuBxvF,QAGxCxR,KAAKihG,sBAAwB,IAAI,KAAc,CAC7C/jF,KAAM,yBACN5T,KAAM,aAERtJ,KAAKkhG,kBAAoB,IAAI,KAAc,CACzChkF,KAAM,eACN5T,KAAM,SAGRtJ,KAAK+N,eAAe1N,IAAIL,KAAKihG,sBAAsBl/F,MAAnD/B,CAA0D,SAAU,KAClE,MAAM2d,EAAU3d,KAAKihG,sBAAsBl/F,MAAM4b,QACjD3d,KAAKkhG,kBAAkBn/F,MAAM2wB,gBAAgB,WAAY/U,KAG3D3d,KAAK+N,eAAe1N,IAAIL,KAAKkhG,kBAAkBn/F,MAA/C/B,CAAsD,SAAU,KAC9D,MAAM2d,EAAU3d,KAAKkhG,kBAAkBn/F,MAAM4b,QAE5CxV,MAAMC,KAAKpI,KAAKqgG,UAAUt6E,UAA4Btd,IAAIsH,IACzDA,EAAG3P,UAAUkM,OAAO,cAAeqR,KAGjCA,IACF3d,KAAKugG,oBAAiB77F,EACtB1E,KAAKmhG,kBAAkBz9F,iBAAiB,KAG1C09F,EAAa96F,QAAQyJ,GAAMA,EAAG3P,UAAUkM,OAAO,QAASqR,IAExD3d,KAAKihG,sBAAsBl/F,MAAM2wB,gBAAgB,WAAY/U,GAC7D3d,KAAKyyB,iBAGPquE,EAAG/2F,OAAO/J,KAAKihG,sBAAsBzvF,MAAOxR,KAAKkhG,kBAAkB1vF,OAEnE,MAAM4vF,EAA8B,GAE9BC,EAAsBnhG,SAASC,cAAc,OACnDkhG,EAAoBjhG,UAAUC,IAAI,WAClC,gBAAMghG,EAAqB,2BAE3B,MAAMC,EAASphG,SAASC,cAAc,MAEhCohG,EAAwBrhG,SAASC,cAAc,OACrDohG,EAAsBnhG,UAAUC,IAAI,yBAEpCL,KAAKmhG,kBAAoB,IAAI,IAAW,CACtCv0F,YAAa,kCACb4E,MAAO,kCACPlI,KAAM,WACNmI,UAjIsB,MAoIxBzR,KAAK+N,eAAe1N,IAAIL,KAAK2gG,mBAAmB5+F,MAAhD/B,CAAuD,QAAS,KAC9DA,KAAKyyB,iBAGP,MAAM+uE,EAAuBthG,SAASC,cAAc,OACpDqhG,EAAqBphG,UAAUC,IAAI,YACnC,gBAAMmhG,EAAsB,wBAE5BD,EAAsBx3F,OAAO/J,KAAKmhG,kBAAkBlhG,UAAWuhG,GAE/DJ,EAAaz7F,KAAK27F,EAAQD,EAAqBE,GAC/CH,EAAa96F,QAAQyJ,GAAMA,EAAG3P,UAAUC,IAAI,SAE5CL,KAAKmW,KAAKrF,cAAc6P,aAAauwB,EAAIlxC,KAAKmW,MAC9CnW,KAAKmW,KAAKpM,OAAO2V,EAAG1f,KAAKqgG,UAAWngG,SAASC,cAAc,MAAO4gG,EAAiBD,KAAOM,GAE1F,YAAiBphG,KAAKowE,WAAYpwE,KAAKggG,cAAe,CAACjyF,eAAgB/N,KAAK+N,iBAE5E/N,KAAK+K,WAAa,IAAI,IAAW/K,KAAKmW,MACtCnW,KAAKsgG,kBAELtgG,KAAKyhG,SAAW,KACNzhG,KAAK0hG,mBAAmBv/F,OAGlCnC,KAAKyyB,eAGC,mBAMN,OALgBtqB,MAAMC,KAAKpI,KAAKqgG,UAAUt6E,UAAUtd,IAAI,CAACsH,EAAI1L,KAC3D,MAAMtC,EAAQgO,EAAGF,cAAc,sBAC/B,OAAO9N,aAAiB4/F,iBAAmB5/F,EAAMG,MAAQ,OAAA0/F,GAAA,GAAa7/F,GAAO,GAAOG,QACnF0F,OAAOu4B,KAAOA,EAAE70B,QASb,W,MACN,MAAMu2F,EAAW7hG,KAAK2gG,mBAAmBz+F,MACzC,IAAI2/F,EACF,OAAO,EAGT,GAAGA,EAAS1/F,OArLY,IAsLtB,OAAO,EAGT,GAAGnC,KAAKkhG,kBAAkBn/F,MAAM4b,WAA+B,QAAnB,EAAA3d,KAAKugG,sBAAc,eAAEp+F,QAC/D,OAAO,EAGT,MAAMivC,EAAUpxC,KAAK0hG,mBACrB,GAAGtwD,EAAQjvC,OAAS,EAClB,OAAO,EAIT,GADsBivC,EAAQ3gC,KAAKnI,GAAKA,EAAEnG,OAjMpB,KAmMpB,OAAO,EAGT,MAAOD,MAAO4/F,GAAgB,OAAAF,GAAA,GAAa5hG,KAAKmhG,kBAAkBp/F,OAAO,GACzE,QAAG+/F,EAAa3/F,OAtMQ,KA6MlB,eACN,MAAMw+D,EAAQ3gE,KAAKwwE,WACnBxwE,KAAKowE,WAAW19C,gBAAgB,YAAaiuC,GAGxC,KAAKohC,GAAQ,GAClB,MAAMF,EAAW7hG,KAAK2gG,mBAAmBz+F,MAEnCkvC,EAAUpxC,KAAK0hG,oBAEdx/F,MAAO4/F,EAAcjrD,SAAUmrD,GAAwB,OAAAJ,GAAA,GAAa5hG,KAAKmhG,kBAAkBp/F,OAElG,GAAsB,cAAnB/B,KAAK+sB,KAAK5pB,OAAyB4+F,EAKpC,YAJA/hG,KAAK+sB,KAAKhrB,MAAMq9F,gBAAgB,KAC9Bp/F,KAAKigG,MAAK,KAMdjgG,KAAKu/B,OAKL,MAAMjoB,EAAyB,GAE5BtX,KAAKghG,yBAA2BhhG,KAAKghG,uBAAuBj/F,MAAM4b,UACnErG,EAAO48B,eAAgB,GAGtBl0C,KAAKihG,sBAAsBl/F,MAAM4b,UAClCrG,EAAO68B,iBAAkB,GAGxBn0C,KAAKkhG,kBAAkBn/F,MAAM4b,UAC9BrG,EAAOu5B,MAAO,GAGhB,MAAMF,EAAa,CACjBvpC,EAAG,OACHkQ,SACAuqF,WACAzwD,QAASA,EAAQ3oC,IAAI,CAACvG,EAAOmC,KACpB,CACL+C,EAAG,aACH8V,KAAMhb,EACNwvC,OAAQ,IAAI9sB,WAAW,CAACvgB,OAG5B8K,QAAIzK,GAIAu9F,EAAiBjiG,KAAK+sB,KAAK4wE,gBAAgBuE,kBAAkBvxD,EAAM3wC,KAAKugG,eAAgBuB,EAAcE,GAI5GhiG,KAAK+sB,KAAK29B,mBAAmB+5B,UAAUzkF,KAAK+sB,KAAK9lB,OAAQg7F,EAAgB,CACvEn3F,SAAU9K,KAAK+sB,KAAKjiB,SACpBq3F,aAAcniG,KAAK+sB,KAAKhrB,MAAMogG,aAC9B7C,aAAct/F,KAAK+sB,KAAKhrB,MAAMu9F,aAC9B5C,OAAQ18F,KAAK+sB,KAAKhrB,MAAM6+F,aAGQ,UAA/B5gG,KAAK+sB,KAAKhrB,MAAMqgG,YACjBpiG,KAAK+sB,KAAKhrB,MAAMsgG,cAGlBriG,KAAK+sB,KAAKhrB,MAAM4G,eAAc,GAAO,GA4C/B,kBACN,MAAM8zB,EAASz8B,KAAKy8B,SACdp4B,EAAMrE,KAAKqgG,UAAUp2F,kBAAoB,EACzCq4F,EAAgB,IAAI,IAAW,CACnC11F,YAAa,2BACb4E,MAAO,sBACPivF,aAAc,CAACp8F,GACfiF,KAAM,YAAcmzB,EACpBhrB,UAvUoB,MAyUtBzR,KAAK+N,eAAe1N,IAAIiiG,EAAcvgG,MAAtC/B,CAA6C,QAASA,KAAK+M,SAE3D,MAAMomB,EAAa,IAAI,GAAW,CAChCjW,KAAM,GACN5T,KAAM,aAER6pB,EAAW2B,KAAK/qB,OAAOu4F,EAAcriG,WACrC,YAAiBqiG,EAAcvgG,MAAO2b,EAAA,EAAa,CAAC3P,eAAgB/N,KAAK+N,iBACzEolB,EAAW3hB,MAAMpR,UAAUC,IAAI,iBAC/B8yB,EAAWpxB,MAAM6P,UAAW,EACxB5R,KAAKkhG,kBAAkBn/F,MAAM4b,SAC/BwV,EAAW3hB,MAAMpR,UAAUuB,OAAO,eAEpC3B,KAAK+N,eAAe1N,IAAI8yB,EAAWpxB,MAAnC/B,CAA0C,SAAU,KAElD,GADgBmzB,EAAWpxB,MAAM4b,QACrB,CACV,MAAMtZ,EAAM,OAAA+gD,GAAA,GAAWjyB,EAAW3hB,OAClCxR,KAAKugG,eAAiB,CAAC,IAAI37E,WAAW,CAACvgB,KACvCrE,KAAKyyB,kBAIT,MAAM+zD,EAAYtmF,SAASC,cAAc,QACzCqmF,EAAUpmF,UAAUC,IAAI,WAAY,eACpCiiG,EAAcriG,UAAU8J,OAAOy8E,GAE/B,YAAiBA,EAAWxmF,KAAKuuD,cAAe,CAACxgD,eAAgB/N,KAAK+N,eAAgB4J,MAAM,IAE5F3X,KAAKqgG,UAAUt2F,OAAOopB,EAAW3hB,OAEjCxR,KAAK+K,WAAW8zB,kBAAkB7+B,KAAKqgG,UAAUtuD,iBAAiC,UAGlF/xC,KAAKwgG,kBAAkB76F,KAAK28F,I,cC9XjB,SAASC,GAAe3gD,GACrC,MAAMntC,EAAMmtC,EAAMntC,IAElB,OAAOkwD,MAAMlwD,GACZ5T,KAAK+jE,GAAYA,EAAS49B,eAC1B3hG,KAAK2hG,IACJ,MAAM9iF,EAAI,IAAIkF,WAAW49E,GAGzB,IAAI3uF,EAAW,EACf,IAAI,IAAI7I,EAAI,EAAG7I,EAASud,EAAEvd,OAAQ6I,EAAI7I,IAAU6I,EAE9C,GAAW,IAAR0U,EAAE1U,IACW,KAAZ0U,EAAE1U,EAAI,IACM,GAAZ0U,EAAE1U,EAAI,IACM,GAAZ0U,EAAE1U,EAAI,GAAY,CAEpB,MAAMqvF,EAAS36E,EAAE1U,EAAI,IAAM,EAAiB,IAAX0U,EAAE1U,EAAI,GAIvC6I,GAAYwmF,EAAQ,EAAI,GAAKA,EAIjC,OAAOxmF,EAAW,MCetB,IAAI4uF,GAEG,SAASC,KACd,OAAOD,GAGM,MAAM,WAAsB,KAezC,YAAoB11E,EAAoB41E,EAAeC,GAWrD,GAVA3/F,MAAM,mCAAoC,KAAM,CAACm8B,UAAU,EAAM+wC,YAAa,aAAc0yB,+BAA+B,EAAM1sF,MAAM,IADrH,KAAA4W,OAAoB,KAAA41E,QAuIhC,KAAAG,UAAa7gG,IACnB,MAAM4S,EAAS5S,EAAE4S,OACjB,GAAGA,IAAW7U,KAAK+B,MAAO,CACxB,GAAsB,UAAnB8S,EAAO02B,SAAuB12B,EAAOqqF,aAAa,mBACnD,OAGFl/F,KAAK+B,MAAM0J,QACX,OAAAs3F,GAAA,GAAgB/iG,KAAK+B,SAiNjB,KAAAihG,WAAcx/B,IACpB,MAAMy/B,EAAajjG,KAAKijG,WAClBC,EAAiBljG,KAAKkjG,eAAe1/B,EAAKrgE,MAE1Cm2C,EAAyB,GAC/BA,EAAOkqB,KAAOA,EAEd,MAAM2/B,EAAUjjG,SAASC,cAAc,OACvCgjG,EAAQ/iG,UAAUC,IAAI,cAEtBi5C,EAAO6pD,QAAUA,EAEjB,MAAMh9F,EAAU+8F,EAAiBljG,KAAKojG,YAAY5/B,EAAMlqB,EAAQ6pD,GAAWnjG,KAAKqjG,eAAe7/B,EAAMlqB,EAAQ6pD,GAE7G,OADAF,EAAWK,gBAAgB39F,KAAK2zC,GACzBnzC,GA3WPnG,KAAKijG,WAAa,CAChB9/F,KAAMy/F,EACNU,gBAAiB,GACjBl2E,OAAO,GAGT,YAAiBptB,KAAKowE,WAAY,IAAMpwE,KAAKigG,OAAQ,CAAClyF,eAAgB/N,KAAK+N,iBAErD,cAAnB/N,KAAK+sB,KAAK5pB,KAAsB,CACjC,MAAM08F,EAAW,IAAI,GAAgB,CACnCF,cAAe,KACb3/F,KAAK+sB,KAAKhrB,MAAM6+F,YAAa,EAC7B5gG,KAAKigG,QAEPL,gBAAiB,KACf5/F,KAAK+sB,KAAKhrB,MAAMq9F,gBAAgB,KAC9Bp/F,KAAKigG,UAGTH,SAAU,cACVC,iBAAkB//F,KAAKowE,WACvBriE,eAAgB/N,KAAK+N,iBAGvB8xF,EAASgB,UAAU7gG,KAAK+sB,KAAK9lB,QAE7BjH,KAAKyN,OAAO1D,OAAO81F,EAASA,UAG9B7/F,KAAKujG,eAAiBrjG,SAASC,cAAc,OAC7CH,KAAKujG,eAAenjG,UAAUC,IAAI,eAClC,MAAM0K,EAAa,IAAI,IAAW,MAClCA,EAAW9K,UAAU8J,OAAO/J,KAAKujG,gBAEjCvjG,KAAK6B,WAAa,IAAI,IAAW,CAC/B+K,YAAa,mCACb4E,MAAO,UACPlI,KAAM,gBACNmI,UAAW7I,EAAA,QAAU0iD,OAAOk4C,qBAE9BxjG,KAAK+B,MAAQ/B,KAAK6B,WAAWE,MAE7B/B,KAAK6B,WAAWK,MAAQlC,KAAKyjG,cAAgBzjG,KAAK+sB,KAAKhrB,MAAM2hG,kBAAkB3hG,MAAMkC,UACrFjE,KAAK+sB,KAAKhrB,MAAM2hG,kBAAkBxhG,MAAQ,GAE1ClC,KAAKmW,KAAKpM,OAAOgB,EAAW9K,WAC5BD,KAAKC,UAAU8J,OAAO/J,KAAK6B,WAAW5B,WAEtCD,KAAK2jG,cAEL3jG,KAAKgB,iBAAiB,QAAS,KAC7BhB,KAAK2iG,MAAQ,GACbF,QAAe/9F,IAGjB+9F,GAAeziG,KAGV,YAAYgV,GACjBhV,KAAKmW,KAAKpM,OAAOiL,GAGnB,WACE,OAAOhV,KAAKijG,WAAW9/F,KAGzB,SAASA,GACPnD,KAAKijG,WAAW9/F,KAAOA,EAGjB,2B,MACN,MAAM+e,EAAOliB,KAAK2iG,MAAMxgG,OAAS,EAC9B+f,IAASliB,KAAK4jG,oBACf5jG,KAAK4jG,mBAAqB,IAAI,KAAc,CAC1C1mF,KAAM,2BACN5T,KAAM,gBAERtJ,KAAKC,UAAU8J,UAAU,CAAC/J,KAAK4jG,mBAAmBpyF,MAA8B,QAAvB,EAAAxR,KAAK6jG,0BAAkB,eAAEryF,MAAOxR,KAAK6B,WAAW5B,WAAW2H,OAAOc,UAE3H1I,KAAKijG,WAAW71E,OAAQ,EACxBptB,KAAK4jG,mBAAmBlgG,iBAAiB1D,KAAKijG,WAAW71E,OAEzDptB,KAAK+N,eAAe1N,IAAIL,KAAK4jG,mBAAmB7hG,MAAhD/B,CAAuD,SAAU,KAC/D,MAAM2d,EAAU3d,KAAK4jG,mBAAmBjmF,QAExC3d,KAAKijG,WAAW71E,MAAQzP,EAExB3d,KAAK2jG,iBAEC3jG,KAAK4jG,oBACb5jG,KAAK4jG,mBAAmBpyF,MAAMpR,UAAUkM,OAAO,QAAS4V,GAIpD,2B,MACN,MAAMA,IAASliB,KAAK2iG,MAAMlyF,KAAK+yD,GAAQ,EAA2B77D,IAAI67D,EAAKrgE,OACxE+e,IAASliB,KAAK6jG,oBACf7jG,KAAK6jG,mBAAqB,IAAI,KAAc,CAC1C3mF,KAAM,6BACN5T,KAAM,mBAERtJ,KAAKC,UAAU8J,UAAU,CAAwB,QAAvB,EAAA/J,KAAK4jG,0BAAkB,eAAEpyF,MAAOxR,KAAK6jG,mBAAmBryF,MAAOxR,KAAK6B,WAAW5B,WAAW2H,OAAOc,UAE3H1I,KAAK6jG,mBAAmBngG,iBAA0C,UAAzB1D,KAAKijG,WAAW9/F,MAEzDnD,KAAK+N,eAAe1N,IAAIL,KAAK6jG,mBAAmB9hG,MAAhD/B,CAAuD,SAAU,KAC/D,MAAM2d,EAAU3d,KAAK6jG,mBAAmBlmF,QAExC3d,KAAKijG,WAAW9/F,KAAOwa,EAAU,QAAU,WAE3C3d,KAAK2jG,iBAEC3jG,KAAK6jG,oBACb7jG,KAAK6jG,mBAAmBryF,MAAMpR,UAAUkM,OAAO,QAAS4V,GAIrD,SAASygF,GACd,MAAMmB,EAASnB,EAAM/6F,OAAO47D,IACZxjE,KAAK2iG,MAAMlyF,KAAKszF,GACrBA,EAAMC,eAAiBxgC,EAAKwgC,cAAgBD,EAAMz6F,OAASk6D,EAAKl6D,MAAQy6F,EAAMjkG,OAAS0jE,EAAK1jE,OAMpGgkG,EAAO3hG,SACRnC,KAAK2iG,MAAMh9F,QAAQm+F,GACnB9jG,KAAK2jG,eAgBD,KAAK5B,GAAQ,GACnB,GAAsB,cAAnB/hG,KAAK+sB,KAAK5pB,OAAyB4+F,EAKpC,YAJA/hG,KAAK+sB,KAAKhrB,MAAMq9F,gBAAgB,KAC9Bp/F,KAAKigG,MAAK,KAMd,IAAI/mE,EAAUl5B,KAAK6B,WAAWK,MAC9B,GAAGg3B,EAAQ/2B,OAASyG,EAAA,QAAU0iD,OAAOk4C,mBAEnC,YADAtuE,GAAM,UAAKlc,OAAO,sCAAsC,IAI1DhZ,KAAKu/B,OACL,MAAM0jE,EAAajjG,KAAKijG,WACxBA,EAAWgB,QAA8B,UAApBhB,EAAW9/F,WAA0BuB,EAC1D,MAAM,gBAAC4+F,EAAe,QAAEW,GAAWhB,GAI7B,OAACh8F,EAAM,MAAElF,GAAS/B,KAAK+sB,MACvB,WAAC6zE,EAAU,aAAEtB,GAAgBv9F,EAEnCuhG,EAAgBh9F,QAAQoZ,IACtBA,EAAEyjF,aAAUz+F,IAGd,MAAM,OAACvC,GAAUmhG,EACXnB,EAAepgG,EAAMogG,aAC3BniG,KAAKk4C,QAASorD,IACTpqE,GAAWoqE,EAAgBnhG,SAAWA,IACvCnC,KAAK+sB,KAAK29B,mBAAmBm5B,SAAS58E,EAAQiyB,EAAS,CACrDipE,eACAr3F,SAAU9K,KAAK+sB,KAAKjiB,SACpB4xF,OAAQkE,EACRtB,eACA9W,YAAY,IAGdtvD,OAAUx0B,GAGZ,MAAMmT,EAAI,OAAH,wBACForF,GAAU,CACbK,oBAGFtjG,KAAK+sB,KAAK29B,mBAAmBw5C,UAAUj9F,EAAQ4Q,EAAEyrF,gBAAgB76F,IAAIiX,GAAKA,EAAE8jD,MAAOxsD,OAAOkkC,OAAO,CAC/FhiB,UACAipE,eACAr3F,SAAU9K,KAAK+sB,KAAKjiB,SACpBm5F,QAASA,EACTvH,OAAQkE,EACRtB,eACA9W,YAAY,GACX3wE,IAEHqhB,OAAUx0B,IAGZ3C,EAAMogG,aAAeniG,KAAK+sB,KAAKjiB,SAC/B/I,EAAM4G,gBAGA,YAAY66D,EAAYlqB,EAAwB6pD,GACtDA,EAAQ/iG,UAAUC,IAAI,oBAItB,IAAI8F,EACJ,GAHgBq9D,EAAKrgE,KAAKghG,WAAW,UAGzB,CACV,MAAMrkF,EAAQ5f,SAASC,cAAc,SAC/BikG,EAASlkG,SAASC,cAAc,UACtCikG,EAAO3vF,IAAM6kC,EAAO+qD,UAAYvgD,IAAIC,gBAAgByf,GACpD1jD,EAAMrf,UAAW,EACjBqf,EAAMiB,UAAW,EACjBjB,EAAM3I,OAAQ,EACd2I,EAAM1c,aAAa,cAAe,QAElC0c,EAAM9e,iBAAiB,aAAc,KACnC8e,EAAM1e,SACL,CAACuW,MAAM,IAEVxR,EAAU,aAAY2Z,GAAOjf,KAAK,KAChCy4C,EAAO54C,MAAQof,EAAMwkF,WACrBhrD,EAAO34C,OAASmf,EAAMykF,YACtBjrD,EAAOzlC,SAAWxR,KAAK05E,MAAMj8D,EAAMjM,UAEnC,MAAM2wF,EAAyB1kF,EAAc2kF,4BAM7C,YAL6B//F,IAA1B8/F,IACDlrD,EAAOorD,SAAWF,GAGpBrB,EAAQp5F,OAAO+V,GACR,aAAsBA,GAAOjf,KAAKgqB,IACvCyuB,EAAOzuB,MAAQ,OAAH,QACVnW,IAAKovC,IAAIC,gBAAgBl5B,EAAMg5B,OAC5Bh5B,OAKT/K,EAAM/V,OAAOq6F,OACR,CACL,MAAMr5E,EAAM,IAAIyd,MAChBriC,EAAU,IAAItD,QAAeoD,IAC3B8kB,EAAI45E,OAAS,KACXrrD,EAAO54C,MAAQqqB,EAAIk6C,aACnB3rB,EAAO34C,OAASoqB,EAAIm6C,cAEpBi+B,EAAQp5F,OAAOghB,GAEE,cAAdy4C,EAAKrgE,MACNm2C,EAAOorD,SAAU,EAEjB7hG,QAAQC,IAAI,CACVy/F,GAAex3E,GAAKlqB,KAAKgT,IACvBylC,EAAOzlC,SAAWxR,KAAK6jB,KAAKrS,KAG9B,aAAsBkX,GAAKlqB,KAAKgqB,IAC9ByuB,EAAOzuB,MAAQ,OAAH,QACVnW,IAAKovC,IAAIC,gBAAgBl5B,EAAMg5B,OAC5Bh5B,OAGNhqB,KAAK,KACNoF,OAGFA,OAKN8kB,EAAItW,IAAM6kC,EAAO+qD,UAAYvgD,IAAIC,gBAAgByf,GAGnD,OAAOr9D,EAGD,eAAeq9D,EAAYlqB,EAAwB6pD,GACzDA,EAAQ/iG,UAAUC,IAAI,uBAEtB,MAAMukG,EAAUphC,EAAKrgE,KAAKghG,WAAW,UAC/BU,EAAUrhC,EAAKrgE,KAAKghG,WAAW,WAClCS,GAAWC,KACZvrD,EAAO+qD,UAAYvgD,IAAIC,gBAAgByf,IAGzC,MAAMvvD,EAAM,CACV7M,EAAG,WACHo8D,KAAMA,EACNrqD,UAAWqqD,EAAKl6D,MAAQ,GACxB8f,SAAUo6C,EAAKl6D,KAAO,IAAkBmjB,cAAc+2C,EAAKl6D,MAAQ,GACnExJ,KAAM0jE,EAAK1jE,KACXqD,KAAMyhG,EAAU,QAAU,OAGtBtwF,EAAeC,GAAA,EAAmBC,gBAAgBP,GACxDK,EAAaI,IAAM4kC,EAAO+qD,UAC1B/vF,EAAasrC,WAAa4jB,EAAK1jE,KAE/B,MAAMghD,EAASL,GAAa,CAC1Br8C,QAAS,CACPgD,EAAG,UACHkQ,OAAQ,CACN+Q,aAAa,GAEfxhB,IAAK,EACLI,OAAQ,EACR6L,MAAO,CACL1L,EAAG,uBACHlH,SAAU+T,MA2BhB,OAtBgB,IAAIpR,QAAeoD,IACjC,MAAM6+F,EAAS,KACb3B,EAAQp5F,OAAO+2C,GACf76C,KAGF,GAAG2+F,EAAS,CACV,MAAM75E,EAAM,IAAIyd,MAChBzd,EAAItW,IAAM6kC,EAAO+qD,UACjBt5E,EAAI45E,OAAS,KACXrrD,EAAO54C,MAAQqqB,EAAIk6C,aACnB3rB,EAAO34C,OAASoqB,EAAIm6C,cAEpB4/B,KAGF/5E,EAAIg6E,QAAUD,OAEdA,MAwBE,eAAelpD,GACrB,MAAgC,UAAzB57C,KAAKijG,WAAW9/F,MAAoB,EAA2BwE,IAAIi0C,GAGpE,WAEF57C,KAAKgV,QAAQ5U,UAAUuR,SAAS,YAClC3R,KAAK+N,eAAe1N,IAAIH,SAASiW,KAAjCnW,CAAuC,UAAWA,KAAK8iG,WACvD9iG,KAAKgB,iBAAiB,QAAS,KAC1BhB,KAAKyjG,gBACNzjG,KAAK+sB,KAAKhrB,MAAM2hG,kBAAkBxhG,MAAQlC,KAAKyjG,iBAGnDzjG,KAAKugB,QAID,WACN,MAAM,WAAC0iF,EAAU,MAAEr1F,EAAK,MAAE+0F,GAAS3iG,KACnC,IAAIuO,EACJ,MAAMN,EAA2B,GACjC,GAAuB,aAApBg1F,EAAW9/F,KACZoL,EAAM,yBACNN,EAAKtI,KAAKg9F,EAAMxgG,YACX,CACL,IAAI6iG,EAAc,EAAGC,EAAc,EAAGC,EAAa,EACnDvC,EAAMr8F,QAAQk9D,IACTA,EAAKrgE,KAAKghG,WAAW,YAAaa,EAC7BxhC,EAAKrgE,KAAKghG,WAAW,YAAac,IACnCC,IAGN,CAACF,EAAaC,EAAaC,GAAYt9F,OAAOu9F,GAAKA,EAAI,GAAGhjG,OAAS,GACpEoM,EAAM,yBACNN,EAAKtI,KAAKg9F,EAAMxgG,SAQL6iG,GACXz2F,EAAM,0BACNN,EAAKtI,KAAKq/F,IACFC,IACR12F,EAAM,0BACNN,EAAKtI,KAAKs/F,IAId,OAAA14F,EAAA,GAAeqB,EAAO,eAAKW,EAAKN,IAG1B,uBAAuBkf,EAAkBmsB,GAC/C,GAAGt5C,KAAKkjG,eAAe5pD,EAAOkqB,KAAKrgE,MAAO,CACxC,MAAMrD,EAAO,OAAAmgF,GAAA,GAAe3mC,EAAO54C,MAAO44C,EAAO34C,OAAQ,IAAK,KAC9DwsB,EAAIxqB,MAAMjC,MAAQZ,EAAKY,MAAQ,KAC/BysB,EAAIxqB,MAAMhC,OAASb,EAAKa,OAAS,KAGnCX,KAAKujG,eAAex5F,OAAOojB,GAGrB,QAAQ6qB,GACd,MAAM,gBAACsrD,GAAmBtjG,KAAKijG,WAC/B,IAAIjjG,KAAKijG,WAAW71E,MAElB,YADAk2E,EAAgBh9F,QAAQqxB,GAAKqgB,EAAG,CAACrgB,KAInC,MAAMx1B,EAASmhG,EAAgBnhG,OAC/B,IAAI,IAAI6I,EAAI,EAAGA,EAAI7I,GAAS,CAC1B,MAAMijG,EAAY9B,EAAgBt4F,GAAGw4D,KAAKrgE,KAC1C,IAAIkvC,EAAI,EACR,KAAMA,EAAI,IAAMrnC,EAAI7I,IAAU6I,IAAKqnC,EAAG,CACpC,MAAMlvC,EAAOmgG,EAAgBt4F,GAAGw4D,KAAKrgE,KACrC,GAAGnD,KAAKkjG,eAAekC,KAAeplG,KAAKkjG,eAAe//F,GACxD,MAIJ60C,EAAGsrD,EAAgB7/F,MAAMuH,EAAIqnC,EAAGrnC,KAI5B,cACN,MAAM,MAAC23F,EAAK,WAAEM,EAAU,eAAEM,GAAkBvjG,KAC5CijG,EAAWK,gBAAgBnhG,OAAS,EAEpCnC,KAAKqlG,2BACLrlG,KAAKslG,2BAELziG,QAAQC,IAAI6/F,EAAMl6F,IAAIzI,KAAKgjG,aAAaniG,KAAK,KAC3C0iG,EAAet/F,UAAY,GAEvB0+F,EAAMxgG,SAIVnC,KAAKmR,WAELnR,KAAKk4C,QAASorD,IACZ,GAAGtjG,KAAKkjG,eAAeI,EAAgB,GAAG9/B,KAAKrgE,OAASmgG,EAAgBnhG,OAAS,EAAG,CAClF,MAAMojG,EAAiBrlG,SAASC,cAAc,OAC9ColG,EAAenlG,UAAUC,IAAI,mBAAoB,cACjDklG,EAAex7F,UAAUu5F,EAAgB76F,IAAIoN,GAAKA,EAAEstF,UAEpDj/C,GAAa,CACXjkD,UAAWslG,EACX//F,MAAO89F,EAAgB76F,IAAIqvB,IAAK,CAAEjgB,EAAGigB,EAAEp3B,MAAO6X,EAAGuf,EAAEn3B,UACnDgtB,SAAU,IACVC,SAAU,IACVC,QAAS,IAGX01E,EAAex5F,OAAOw7F,QAEtBjC,EAAgBh9F,QAASgzC,IACvBt5C,KAAKwlG,uBAAuBlsD,EAAO6pD,QAAS7pD,UAIjDz4C,KAAK,KACNb,KAAKylG,cChiBX,MAGMC,GAA0B,CAAC,UAAW,aACtCC,GAA0B,CAAC,YAAa,cAE/B,SAASC,IAAqB,KAACh8F,EAAI,KAAEzG,EAAI,SAAEm8B,EAAQ,KAAE3nB,EAAI,WAAEkuF,IAOxE,MAAMC,EAAW,IAAIjiG,IAAa,OAATV,EAAgBuiG,GAAY9hG,OAAO+hG,IAAyB,MAATxiG,EAAewiG,GAAcD,IAEzG,IAAI7wF,EACJ,MAAMkxF,EAAmB,IAChBlxF,GAAUjL,EAAKiG,cAAc,YAA4BjG,EAAKiW,kBAGjEmmF,EAAmB,CAACnY,EAAkBoY,KAC1C,GAAGpxF,IAAWg5E,EACZ,OAGF,IAAIqY,GAAY,EACbrxF,IACDqxF,GAAY,EACZrxF,EAAOzU,UAAUuB,OA3BG,WA8BtBkT,EAASg5E,EACLh5E,IACJA,EAAOzU,UAAUC,IAhCK,UAkCnB6lG,GAAan7F,GAAck7F,GAC5B,OAAAE,GAAA,GAAiBp7F,EAAY8J,EAAuB,cAAUnQ,OAAWA,OAAWA,EAAW,IAAc,MAATvB,EAAe,IAAM,OAIvHijG,EAAiB,CAACC,EAAwBC,KAC9C,IAAIC,EAIJ,OAHWA,EAARD,EAAqBD,EAAcnuE,oBAAsBtuB,EAAKiW,kBAC/CwmF,EAAcl2D,wBAA0BvmC,EAAKmoC,iBAExDw0D,GAqBT,IAAIC,EAEFA,EADU,OAATrjG,EACgB,CAACkjG,EAAe93F,IACpB,YAARA,GAA6B,cAARA,EArBL,EAAC83F,EAAwBC,KAC9C,MAAMG,EAAWH,EAAS,qBAAuB,yBAC3CI,EAAcJ,EAAS,oBAAsB,mBAC7CK,EAAcN,EAAcvqF,wBAElC,IAAIyqF,EAAaF,EAAcI,IAAa78F,EAAK88F,GACjD,KAAMH,IAAeF,GAAe,CAClC,MAAMO,EAAaL,EAAWzqF,wBAC9B,GAAG8qF,EAAWrsF,IAAMosF,EAAYpsF,GAAKqsF,EAAWnsF,IAAMksF,EAAYlsF,EAChE,MAGF8rF,EAAaA,EAAWE,IAAa78F,EAAK88F,GAG5C,OAAOH,GAM+CM,CAAeR,EAAuB,cAAR93F,GACtE63F,EAAeC,EAAuB,eAAR93F,GAG3B,CAAC83F,EAAe93F,IAAQ63F,EAAeC,EAAuB,eAAR93F,GAAgC,cAARA,GAGjG,IAAIu0F,EAAa7gG,IACf,MAAMsM,EAAMtM,EAAEsM,IACd,GAAIu3F,EAASn+F,IAAI4G,IAWjB,GAFA,OAAAmP,EAAA,GAAYzb,GAET2H,EAAKK,kBAAoB,EAAG,CAC7B,IAAIo8F,EAAgBN,IACpBM,EAAgBG,EAAeH,EAAe93F,GAC9Cy3F,EAAiBK,GAAe,SAbrB,UAAR93F,GAA6B,OAATpL,GAAyB,QAARoL,KACtC,OAAAmP,EAAA,GAAYzb,GACZ6kG,EAAWf,OAejB,MAAMh7F,EAAa,OAAA+W,GAAA,GAAgBlY,EAAM,cACzCA,EAAKxJ,UAAUC,IAAI,kBAEnB,MAAMga,EAAepY,IACnB,MAAM4S,EAAS,OAAA80C,GAAA,GAAc1nD,EAAE4S,OAAQjL,GACnCiL,GAIJmxF,EAAiBnxF,GAAQ,IAGrBsI,EAAWlb,IACf,OAAAyb,EAAA,GAAYzb,GAEZ,MAAM4S,EAAS,OAAA80C,GAAA,GAAc1nD,EAAE4S,OAAQjL,GACnCiL,IAIJmxF,EAAiBnxF,GAAQ,GACzBiyF,EAAWf,OAGPe,EAAcjyF,IAClB,MAAMkyF,EAAcznE,EAASzqB,SACVnQ,IAAhBqiG,GAA6BA,EAAcpvF,IAC5CooC,KAIEA,EAAS,KAEb7/C,SAASmJ,oBAjIQ,UAiI0By5F,EAAW,CAACh3E,SAAS,IAChEliB,EAAKP,oBAAoB,YAAagR,GACtC,YAAiBzQ,EAAMuT,IAGnB6pF,EAAc,KACfnB,GACHG,EAAiBp8F,EAAKiW,mBAAmB,IAG3C,GAAGgmF,EAAY,CACb,MAAMoB,EAAanE,EACnBA,EAAa7gG,IACRA,EAAEsM,MAAQs3F,IACX,OAAAnoF,EAAA,GAAYzb,GAEZ/B,SAASmJ,oBAjJI,UAiJ8By5F,EAAW,CAACh3E,SAAS,IAChEg3E,EAAYmE,EACZ/mG,SAASc,iBAnJI,UAmJ2B8hG,EAAW,CAACh3E,SAAS,EAAMxQ,SAAS,IAE5EuqF,OAAanhG,EACbsiG,WAIJA,IASF,OAJA9mG,SAASc,iBA/JU,UA+JqB8hG,EAAW,CAACh3E,SAAS,EAAMxQ,SAAS,IAC5E1R,EAAK5I,iBAAiB,YAAaqZ,EAAa,CAACiB,SAAS,IAC1D,YAAiB1R,EAAMuT,GAEhB,CACL4iC,SACAinD,eCnKW,MAAM,WAA2B,IAkB9C,YAAYhkG,GAOVC,OAAM,GArBE,KAAAikG,QAAS,EAmCT,KAAAC,UAAY,KACjBnnG,KAAK+/C,QACN//C,KAAK+/C,SAGP,MAAMn2C,EAAO5J,KAAK4J,MACZ,OAACm2C,EAAM,YAAEinD,GAAepB,GAAqB,CACjDh8F,OACAzG,KAAMnD,KAAKonG,SACX9nE,SAAUt/B,KAAKs/B,SACf3nB,MAAM,EACNkuF,WAAY7lG,KAAK6lG,aAGnB7lG,KAAK+/C,OAASA,EACd//C,KAAKgnG,YAAcA,EACf,cAAchnG,KAAKqnG,iBACrBrnG,KAAKqnG,eAAiB,CACpBlkG,KAAM,sBACNiN,MAAO,KACLpQ,KAAKqnG,oBAAiB3iG,EACtB1E,KAAKsM,QAAO,IAEdg7F,aAAa,GAGfv4F,EAAA,EAAwBoB,SAASnQ,KAAKqnG,iBAGxCrnG,KAAKgB,iBAAiB,SAAU,KAC9BhB,KAAKgnG,iBAActiG,EACnB1E,KAAK+/C,YAASr7C,EAEdkF,EAAK3F,UAAY,GACjB87C,IAEG//C,KAAKqnG,iBACNt4F,EAAA,EAAwBw4F,WAAWvnG,KAAKqnG,gBACxCrnG,KAAKqnG,oBAAiB3iG,IAEvB,CAACiT,MAAM,KApDV,YAAW3X,KAAMgD,GAEjBhD,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,sBAAuB,aAEpD2C,EAAQg5B,SAASjyB,OAAO/J,KAAKC,WAE7BD,KAAKwnG,mBAELxnG,KAAKynG,WAAWC,UAAU1nG,MA8ClB,mBACRA,KAAKgB,iBAAiB,UAAWhB,KAAKmnG,WAGjC,OAAO5nE,EAAgBooE,GAAiB,GAC1C3nG,KAAKkO,YAIIxJ,IAAT66B,IACDA,EAAOv/B,KAAKC,UAAUG,UAAUuR,SAAS,gBAAkB3R,KAAKC,UAAUG,UAAUuR,SAAS,cAG5F3R,KAAKknG,SAAW3nE,GAQnBv/B,KAAKknG,OAAS3nE,EAEVA,GAICv/B,KAAKqnG,iBACNt4F,EAAA,EAAwBw4F,WAAWvnG,KAAKqnG,gBACxCrnG,KAAKqnG,oBAAiB3iG,GAGpBijG,GACF3nG,KAAKynG,WAAWG,mBAGf5nG,KAAK+/C,QACN//C,KAAK+/C,WAbP//C,KAAKynG,WAAWG,iBAAiB5nG,MACjCA,KAAKyO,cAAc,YAgBrB,aAAczO,KAAKC,UAAW,cAAes/B,EAAM32B,EAAA,QAAUo2B,SAASC,kBAAoB,IAAM,EAAG,KACjGj/B,KAAKknG,QAAUlnG,KAAKyO,cAAc,aA5B9B8wB,GACFv/B,KAAKyO,cAAc,aC9FZ,MAAM,WAAuB,GAM1C,YAAYutB,EAAuByrE,GACjCxkG,MAAM,CACJ+4B,WACAyrE,aACAL,SAAU,KACV9nE,SAAWzqB,IACD,GAAkB87C,aAAa,CAAC97C,WAAS,GAEnDgxF,WAAY,YAGd7lG,KAAKC,UAAUG,UAAUC,IAAI,mBAE7BL,KAAKgB,iBAAiB,UAAW,KAC/BwK,WAAW,KACTxL,KAAK+K,WAAW9K,UAAUkpC,UAAY,GACrC,GAEHvgC,EAAA,QAAU6F,cAAc,oBAAoB,KAG9CzO,KAAKgB,iBAAiB,SAAU,KAC3BhB,KAAK6nG,iBACN3jF,EAAA,EAAW7a,oBAAoB,eAAgBrJ,KAAK6nG,gBACpD7nG,KAAK6nG,oBAAiBnjG,GAGxBkE,EAAA,QAAU6F,cAAc,oBAAoB,KAIzC,cAAc8rC,GACnB,MAAM3tB,EAAa5sB,KAAKynG,WAAWx6E,gBAEhCjtB,KAAK2qB,eACN3qB,KAAK2qB,cAAcxgB,QAGrB,GAAmBozF,4BAA4BhjD,GAC/C,GAAmBrB,sBAAsBqB,GACxC15C,KAAMq5C,IACL,IAAIttB,IACF,OAGC5sB,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGd,MAAMjO,EAAYD,KAAK4J,KAAKyjC,YAE5B,IAAIy6D,EAEJ9nG,KAAK2qB,cAAcxgB,QAEjB29F,EADC5tD,EAAS/3C,OACF,IAAIU,QAAeoD,IACzB,MAAMo4B,EAA2B,GACjC6b,EAAS5zC,QAAQ42C,IACfj9C,EAAU8J,OAAO/J,KAAK8gF,qBAAqBL,cAAcvjC,OAAuBx4C,EAAW25B,MAG5Fx7B,QAAQC,IAAIu7B,GAA2Bpd,QAAQhb,KAG1CpD,QAAQoD,UAGlB6hG,EAAMjnG,KAAK,KACTb,KAAK4J,KAAK8f,YAAYzpB,GACtBD,KAAK4J,KAAO3J,EAERD,KAAK6nG,iBACP7nG,KAAK6nG,eAAiB,KACpB,MAAMnnG,EAASV,KAAK4J,KAAKK,kBAAoBia,EAAA,EAAWosB,OAAOq2B,WAAWjmE,OAAUV,KAAK4J,KAAKK,kBAAoB,GAClHjK,KAAK4J,KAAKjH,MAAMjC,MAAQA,EAAQ,MAElCwjB,EAAA,EAAWljB,iBAAiB,eAAgBhB,KAAK6nG,iBAGnD7nG,KAAK6nG,iBAEL7nG,KAAKsM,QAAQ4tC,EAAS/3C,QACtBnC,KAAK+K,WAAWo+B,UAAY,MAKxB,OACRnpC,KAAK4J,KAAO1J,SAASC,cAAc,OACnCH,KAAK4J,KAAKxJ,UAAUC,IAAI,2BAA4B,kBAEpDL,KAAKC,UAAU8J,OAAO/J,KAAK4J,MAE3B5J,KAAK+K,WAAa,IAAI,IAAW/K,KAAKC,WACtCD,KAAK2qB,cAAgB,IAAI,KACzB3qB,KAAK8gF,qBAAuB,IAAI,GAAqB9gF,KAAK2qB,cAAe0C,KC7G7E,MAAM06E,GAAa,KACjB,MAAMj/E,EAAO,IAAIusB,KAGjB,OADAvsB,EAAKmsC,SAAS,EAAG,EAAG,EAAG,GAChBnsC,GAGHk/E,GAAa,KACjB,MAAMl/E,EAAO,IAAIusB,KAGjB,OAFAvsB,EAAK8sD,YAAY9sD,EAAKysC,cAAgB,GACtCzsC,EAAKosC,QAAQpsC,EAAK+sD,UAAY,GACvB/sD,GAOM,MAAM,WAAsB,GACzC,YAAY+rD,EAAgBC,EAAqCmzB,GALjD,IAACn/E,EAuBf,GAjBA7lB,OANe6lB,EAMC+rD,GALNzf,UAAY4yC,KAAa5yC,UAAY,IAAI/f,KAASvsB,EAKjCgsD,EAAQ,CACjCC,WAAW,EACX19C,SAAS,EACT+H,UAAU,EACV+wC,aAAa,EACb5c,QAASw0C,KACThyC,QAASiyC,KACThgF,UAAU,EACVsvD,oBAAoB,EACpBurB,+BAA+B,IAGjC7iG,KAAKgV,QAAQ5U,UAAUC,IAAI,kBAC3BL,KAAKyN,OAAO1D,OAAO/J,KAAK81E,aACxB91E,KAAK4N,MAAM8b,YAAY1pB,KAAK+1E,YAC5B/1E,KAAKmW,KAAKpM,OAAO/J,KAAKowE,YAEnB63B,EAAmB,CACpB,MAAMC,EAAoB,YAAO,4DAA6D,CAAChrF,KAAM,4BACrGld,KAAKmW,KAAKpM,OAAOm+F,GAEjB,YAAiBA,EAAmB,KAClCpzB,EbrDkC,YasDlC90E,KAAKu/B,W,uBCvCE,SAAS4oE,GAAsBC,EAAoBC,GAAe,GAC/E,MAAM9wB,EAAkB,GAClBhmD,EAAiB,GAEjB4U,EAAM56B,OAAOm8C,eACnB,IAAI4gD,EACAC,EACJ,GAAGpiE,GAAOA,EAAI8hD,WAAY,CACxB,MAAMlhB,EAAQ5gC,EAAIgiD,WAAW,GACvBqgB,EAAczhC,EAAMyhC,YAC1B,GACEzhC,EAAM0hC,gBACN1hC,EAAM0hC,gBAAkB1hC,EAAM2hC,cAC9BF,GAAezhC,EAAM4hC,UACrB,CAEA,MAAMC,EAA8BJ,EAAc,EAC5CK,EAAaT,EAAMS,WACzB,GAAG9hC,EAAM0hC,iBAAmBL,GAASS,EAAWD,GAA8B,CAC5EN,EAAUO,EAAWD,GACrBL,EAAY,EAEZ,IAAI,IAAIv9F,EAAI,EAAGA,EAAI+7D,EAAM4hC,YAAa39F,EAAG,CACvC,MAAMmb,EAAO0iF,EAAW79F,GAClB9I,EAAQikB,EAAKi4D,WAAcj4D,EAA0B2iF,IAExD5mG,IACDqmG,GAAarmG,EAAMC,cAIvBmmG,EAAUvhC,EAAM0hC,eAChBF,EAAYC,GAKlB,MAAM3xD,EAA4BwxD,EAAe,QAAK3jG,EACtD,OAAAqkG,GAAA,GAAoBX,EAAO7wB,EAAOhmD,EAAM+2E,EAASC,EAAW1xD,GAEzDtlB,EAAKpvB,QACNo1E,EAAM5xE,KAAK4rB,EAAK5J,KAAK,KAGvB,IAAIzlB,EAAQq1E,EAAM5vD,KAAK,MACvB,MAAMqhF,EAAW9mG,EAAMqa,QAAQ,KAU/B,OATgB,GAAbysF,IACD9mG,EAAQA,EAAM+mG,OAAO,EAAGD,GAAY9mG,EAAM+mG,OAAOD,EAAW,IAE9D9mG,EAAQA,EAAMsB,QAAQ,UAAW,KAE9BqzC,GACD,IAAkBqyD,oBAAoBryD,GAGjC,CAAC30C,QAAO20C,WAAUmyD,YCzDZ,MAAM,WAAoB,GAGvC,YAAYhtE,EACVyrE,EACA1gB,EACQpJ,GACR16E,MAAM,CACJ+4B,WACAyrE,aACAL,SAAU,IACV9nE,SAAWzqB,IACTkyE,EAAUxI,gBAAgBL,GAAoBrpE,IAAgB,MAN1D,KAAA8oE,kBAUR39E,KAAKC,UAAUG,UAAUC,IAAI,gBAGrB,OACRL,KAAK4J,KAAO1J,SAASC,cAAc,OACnCH,KAAK4J,KAAKxJ,UAAUC,IAAI,sBAAuB,gBAE/CL,KAAKC,UAAU8J,OAAO/J,KAAK4J,MAE3B5J,KAAK+K,WAAa,IAAI,IAAY/K,KAAKC,WAEvCD,KAAKgB,iBAAiB,UAAW,KAC/BwK,WAAW,KACTxL,KAAK+K,WAAW9K,UAAUsoF,WAAa,GACtC,KAIA,OAAOlL,EAAkBwoB,GAC9B,GAAG7lG,KAAKkO,KAAM,CACZ,IAAImvE,EAAOl7E,OACT,OAGFnC,KAAKkO,OACLlO,KAAKkO,KAAO,MAGdmvE,EAASA,EAAO55E,MAAM,EAAG,KAEftB,SACRnC,KAAK4J,KAAK3F,UAAY,GACtBo5E,EAAO/2E,QAAQ6zC,IACb0jC,GAAY1jC,EAAOn6C,KAAK4J,MAAM,GAAO,MAIzC5J,KAAK6lG,WAAaA,EAAa,eAAYnhG,EAC3C1E,KAAKsM,QAAQ+wE,EAAOl7E,QAOf,WAAWyI,EAAeu+F,GAC/B,MAAMv8E,EAAa5sB,KAAKynG,WAAWx6E,gBACnCjtB,KAAK29E,gBAAgByrB,uBAAuBvoG,KAAK,KAC/C,IAAI+rB,IACF,OAGF,MAAMqR,EAAIrzB,EAAMpH,QAAQ,KAAM,IACxB65E,EAASr9E,KAAK29E,gBAAgB0rB,aAAaprE,GACjDj+B,KAAKwgD,OAAO68B,EAAsB,MAAd8rB,MCtEX,MAAM,WAA+B,GAKlD,YAAYntE,EAAuByrE,EAAoDj+F,EAAmB81B,GACxGr8B,MAAM,CACJ+4B,WACAyrE,aACAL,SAAU,IACV9nE,aALmF,KAAA91B,YAQrFxJ,KAAKC,UAAUG,UAAUC,IAAI,GAAuBioC,WAAY9+B,GAGxD,OACRxJ,KAAK4J,KAAO1J,SAASC,cAAc,OACnCH,KAAK4J,KAAKxJ,UAAUC,IAAI,GAAuBioC,WAAa,SAE5DtoC,KAAKC,UAAU8J,OAAO/J,KAAK4J,MAE3B5J,KAAK+K,WAAa,IAAI,IAAW/K,KAAKC,WAEtCD,KAAKgB,iBAAiB,UAAW,KAC/BwK,WAAW,KACTxL,KAAK+K,WAAW9K,UAAUkpC,UAAY,GACrC,KAIA,OAAOm8B,GACZ,GAAGtlE,KAAKkO,KAAM,CACZ,IAAIo3D,EAAKnjE,OACP,OAGFnC,KAAKkO,OACLlO,KAAKkO,KAAO,KAGXo3D,EAAKnjE,SACNnC,KAAK4J,KAAK3F,UAAY,GACtBqhE,EAAKh/D,QAAQoZ,IACX,MAAMyN,EAAM,GAAuBm8E,YAAY,CAC7C9/F,UAAWxJ,KAAKwJ,UAChBvC,OAAQyY,EAAEzY,OACVqC,KAAMoW,EAAEpW,KACRouB,YAAahY,EAAEgY,cAGjB13B,KAAK4J,KAAKG,OAAOojB,MAIrBntB,KAAKsM,QAAQg5D,EAAKnjE,QAGb,mBAAmBa,GAMxB,MAAMumG,EAAO,GAAuBC,wBACpCxmG,EAAQwG,WAAa,gBAErB,MAAM2jB,EAAMjtB,SAASC,cAAc,OACnCgtB,EAAI/sB,UAAUC,IAAIkpG,EAAMvmG,EAAQwG,WAChC2jB,EAAI/gB,QAAQnF,OAAS,GAAKjE,EAAQiE,OAElC,MAAMohC,EAAS,IAAI,GACnBA,EAAOjoC,UAAUC,IAAI,YAAakpG,EAAO,UAAWvmG,EAAQwG,UAAY,WACxE6+B,EAAOjlC,aAAa,SAAU,KAC9BilC,EAAOjlC,aAAa,OAAQ,GAAKJ,EAAQiE,QAEzC,MAAMqC,EAAOpJ,SAASC,cAAc,OAepC,GAdAmJ,EAAKlJ,UAAUC,IAAIkpG,EAAO,QAASvmG,EAAQwG,UAAY,SACnDxG,EAAQsG,KAQVA,EAAKrF,UAAY,IAAkBwoB,cAAczpB,EAAQsG,MAPzDA,EAAKS,OAAO,IAAI,KAAU,CACxB9C,OAAQjE,EAAQiE,OAChB4E,QAAQ,EACRioD,eAAe,EACf5wD,WAAW,IACV8R,SAKLmY,EAAIpjB,OAAOs+B,EAAQ/+B,GAEhBtG,EAAQ00B,YAAa,CACtB,MAAMA,EAAcx3B,SAASC,cAAc,OAC3Cu3B,EAAYt3B,UAAUC,IAAIkpG,EAAO,eAAgBvmG,EAAQwG,UAAY,gBACrEkuB,EAAYzzB,UAAY,IAAkBwoB,cAAczpB,EAAQ00B,aAChEvK,EAAIpjB,OAAO2tB,GAGb,OAAOvK,GAjGQ,GAAAmb,WAAa,2BACb,GAAAkhE,wBAA0B,GAAuBlhE,WAAa,gBCDlE,MAAM,WAAuB,GAC1C,YAAYtM,EACVyrE,EACA1gB,EACQ+B,EACAF,GACR3lF,MAAM+4B,EACJyrE,EACA,kBACC5yF,IACC,MAAM5Q,EAAY4Q,EAAOhF,cAAc,IAAI,GAAuB25F,gCAAgCvlG,UAClG,OAAO8iF,EAAU0iB,eAAe,KAC9B1iB,EAAUa,aAAa3jF,UAAYA,EACnC8iF,EAAUhD,aAAY,OATpB,KAAA+E,oBACA,KAAAF,kBAcH,WAAWh+E,EAAe3D,GAC/B,IAAIjH,KAAK4oF,gBAAgB6K,MAAMxsF,GAC7B,OAAO,EAGT,MAAM2lB,EAAa5sB,KAAKynG,WAAWx6E,gBA+BnC,OA9BAjtB,KAAK8oF,kBAAkBt9C,mBAAmBvkC,GAAQpG,KAAKiqB,IACrD,IAAI8B,IACF,OAGF,MAAM88E,EAA8B,GAAG9lG,OAAOknB,EAAKuwE,UAC7C/+E,EAAQ,IAAI,KAAoB,CACpCqtF,YAAY,IAGRC,EAA6E,IAAIl6F,IACvFg6F,EAASpjG,QAAQujG,IACfA,EAAQD,SAAStjG,QAAQwjG,IACvB,MAAMn2E,EAAI,IAAMm2E,EAAWC,QAC3BH,EAASj1F,IAAIm1F,EAAWC,QAAS,CAC/B9iG,OAAQ4iG,EAAQ9nE,QAAQja,UAAS,GACjCxe,KAAMqqB,EACN+D,YAAaoyE,EAAWpyE,cAG1Bpb,EAAM8gE,YAAY0sB,EAAWC,QAASp2E,OAI1C,MAAMq2E,EAAQ1tF,EAAMihE,OAAO3yE,GACrB8jC,EAAWvmC,MAAMC,KAAK4hG,GAAOvhG,IAAIshG,GAAWH,EAAS55F,IAAI+5F,IAC/D/pG,KAAKwgD,OAAO9R,MAIP,GC5DI,MAAM,GAArB,cACU,KAAAu7D,QAAmC,IAAIpmG,IACvC,KAAA+oB,WAAa,eAWd,gBAEL,OADA5sB,KAAK4sB,WAAWhX,QACT5V,KAAK4sB,WAAW5c,MAGlB,UAAUqjE,GACfrzE,KAAKiqG,QAAQ5pG,IAAIgzE,GAGZ,iBAAiB62B,GACtBlqG,KAAKiqG,QAAQ3jG,QAAQ+sE,IAChBA,IAAW62B,GACZ72B,EAAO/mE,QAAO,GAAM,KAIpB49F,GACFlqG,KAAK4sB,WAAWhX,SC1BP,MAAM,WAAuB,GAC1C,YAAYomB,EACVyrE,EACA1gB,EACQ+B,EACAF,GACR3lF,MAAM+4B,EACJyrE,EACA,kBACC5yF,IACC,MAAMowB,EAAO2jD,EAAgB1jD,QAASrwB,EAAuBzI,QAAQnF,OAAO8K,YAC5E,IAAcu/C,EAAVqW,EAAM,GACP1iC,EAAKzO,SACNmxC,EAAM,IAAM1iC,EAAKzO,UAEjBmxC,EAAM1iC,EAAKG,YAAcH,EAAKI,UAC9BisB,EAAS,CACPlqD,EAAG,2BACHjF,OAAQwlE,EAAIxlE,OACZkuB,OAAQ,EACR0R,QAASkD,EAAK91B,KAIlBw4D,GAAO,IACPof,EAAUojB,cAAcxiC,EAAKrW,KArBzB,KAAAw3B,oBACA,KAAAF,kBAyBH,WAAWh+E,EAAe3D,EAAgBmjG,GAC/C,MAAMC,EAAUz/F,EAAMU,OACtB,GAAGV,EAAMzI,SAAWkoG,EAAQloG,OAAQ,OAAO,EAE3C,MAAMyqB,EAAa5sB,KAAKynG,WAAWx6E,gBAkBnC,OAjBAjtB,KAAK8oF,kBAAkBwhB,YAAYrjG,GAAUA,EAAO4vB,WAAYwzE,EAASD,GAAUvpG,KAAKiR,IACtF,IAAI8a,IAAc,OAElB,MAAM4J,EAAW6zE,EAAQ5mG,MAAM,GAAG64C,cAClCt8C,KAAKwgD,OAAO1uC,EAAQrJ,IAAIxB,IACtB,MAAMg+B,EAAOjlC,KAAK4oF,gBAAgB1jD,QAAQj+B,GAC1C,IAAGg+B,EAAKzO,UAAYyO,EAAKzO,SAAS8lB,gBAAkB9lB,EAIpD,MAAO,CACLvvB,SACAywB,YAAauN,EAAKzO,SAAW,IAAMyO,EAAKzO,cAAW9xB,KAEpDkD,OAAOc,aAGL,G,YC7CI,MAAM,WAAsB,GAUzC,YAAY1F,GAOVC,MAAM,CACJ+R,QAAS9U,SAASC,cAAc,SAiD5B,KAAAoqG,iBAAoBtoG,IAC1B,MAAM4S,EAAS5S,EAAE+Y,QAAQ,GAAGnG,OACxB,OAAA80C,GAAA,GAAc90C,EAAQ7U,KAAKgV,UAAYH,IAAW7U,KAAKwqG,WACzD,OAAA9sF,EAAA,GAAYzb,GACZjC,KAAKsM,QAAO,KAlDd,YAAWtM,KAAMgD,GAEjBhD,KAAKgV,QAAQ5U,UAAUC,IAAI,GAAcioC,YACzCtoC,KAAKgV,QAAQrS,MAAMC,QAAU,OAE7B5C,KAAKyqG,qBAAqBzqG,KAAKwqG,SAAUxqG,KAAK+N,gBAC9C/N,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,uBAAwB,EAAEiH,aACxDjH,KAAKiH,SAAWA,IACdjH,KAAK0qG,qBAAuB1qG,KAAKgmF,YAClChmF,KAAKwgD,SAGP,eAA2B3/C,KAAK,KAC9Bb,KAAK2qG,uBAMH,OAwBR,OAvBA3qG,KAAKg8B,SAASjyB,OAAO/J,KAAKgV,SAE1BhV,KAAK+N,eAAe1N,IAAIL,KAAxBA,CAA8B,OAAQ,KACpCA,KAAKwgD,SAEF,wBACDxgD,KAAK4qG,cAAgB5qG,KAAK+N,eAAe1N,IAAIH,SAASiW,KAAjCnW,CAAuC,aAAcA,KAAKuqG,iBAAkB,CAACjvF,SAAS,EAAOwQ,SAAS,IAC3H9rB,KAAK+N,eAAe1N,IAAIL,KAAxBA,CAA8B,QAAS,KACrCA,KAAK+N,eAAepM,OAAO3B,KAAK4qG,gBAC/B,CAACjzF,MAAM,OAId3X,KAAK+N,eAAe1N,IAAIL,KAAKgV,QAA7BhV,CAAsC,QAAUiC,IAC9C,MAAM4S,EAAS,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAAQ,OACrCA,IAIJ7U,KAAK0qD,mBAAmBm5B,SAAS7jF,KAAKiH,OAAQ4N,EAAOzI,QAAQ8Q,MAC7Dld,KAAKsM,QAAO,MAGPrJ,MAAMiL,OAWR,kBACL,MAAM01E,EAAc5jF,KAAK6qG,iBACJ,4BAAlBjnB,EAAYx8E,GACZw8E,EAAYtsE,OAAO4vF,QACnBtjB,EAAYtsE,OAAO+8C,OACpBuvB,EAAYtsE,OAAO+8C,MAAO,EAC1Br0D,KAAK+mF,UAAU+G,iBAAiBlK,EAAY/8E,MAIxC,iB,MACN,OAAyE,QAAlE,EAAA7G,KAAK0qD,mBAAmBouB,kBAAkB94E,KAAKiH,QAAQ28E,mBAAW,QAAI,CAC3Ex8E,EAAG,qBAIA,OAAOw8E,EAA+C5jF,KAAK6qG,kBAChE7qG,KAAKgV,QAAQ/Q,UAAY,GAEzB,IAAI,MAAM4tB,KAAO+xD,EAAY9vD,KAAM,CACjC,MAAM3G,EAAMjtB,SAASC,cAAc,OACnCgtB,EAAI/sB,UAAUC,IAAI,GAAcioC,WAAa,QAE7C,IAAI,MAAMztB,KAAUgX,EAAIjU,QAAS,CAC/B,MAAMgC,EAAM1f,SAASC,cAAc,UACnCyf,EAAIxf,UAAUC,IAAI,GAAcioC,WAAa,UAAW,OACxD1oB,EAAI3b,UAAY,IAAkBwoB,cAAc5R,EAAOqC,MACvD0C,EAAIxT,QAAQ8Q,KAAOrC,EAAOqC,KAC1BiQ,EAAIpjB,OAAO6V,GAGb5f,KAAKgV,QAAQjL,OAAOojB,IAIjB,kBAAkBy2D,EAA2B5jF,KAAK6qG,kB,MACvD,MAAMtrE,EAAyB,sBAAlBqkD,EAAYx8E,KAAiF,QAAnD,EAACw8E,EAA8C9vD,YAAI,eAAE3xB,QAO5G,OANAnC,KAAKwqG,SAASpqG,UAAUkM,OAAO,OAAQizB,GAEpCA,GACDv/B,KAAKsM,QAAO,IAGNizB,EAGH,QAAQt4B,GACbjH,KAAKiH,OAASA,EAEdjH,KAAK0qG,oBACL1qG,KAAK2qG,mBA5HQ,GAAAriE,WAAa,iB,2SCUf,MAAM,WAAqB,GAQxC,YAAYtM,EACVyrE,EACQ16E,EACA67D,EACAlE,GACRzhF,MAAM,CACJ+4B,WACAyrE,aACAL,SAAU,KACV9nE,SAAWzqB,IACT,MAAM,OAAC5N,EAAM,MAAE06E,EAAK,QAAEM,GAAWjiF,KAAK4J,KAAKwC,QAC3C,OAAOpM,KAAK+sB,KAAKhrB,MAAM0nG,eAAe,KACpC,MAAMpmB,EAAoBrjF,KAAK0kF,qBAAqBtC,YAAYH,EAAUptE,EAAuBzI,QAAQi2E,UACzGriF,KAAK0kF,qBAAqBomB,iBAAiB7jG,EAAO6gB,WAAY65D,EAAO0B,EAAmB,CACtFmF,YAAY,EACZ8W,aAAct/F,KAAK+sB,KAAKhrB,MAAMu9F,aAC9B5C,OAAQ18F,KAAK+sB,KAAKhrB,MAAM6+F,WACxBuB,aAAcniG,KAAK+sB,KAAKhrB,MAAMogG,eAGhCniG,KAAK+sB,KAAKhrB,MAAM4G,eAAc,GAAM,QAlBlC,KAAAokB,OACA,KAAA67D,kBACA,KAAAlE,uBAuCH,KAAAqmB,YAAc,CAAM9jG,EAAgBuvB,EAAkB5rB,IAAkB,mCAC7E,MAAMgiB,EAAa5sB,KAAKynG,WAAWx6E,gBAE7ByU,QAAa1hC,KAAK4oF,gBAAgB3D,gBAAgBzuD,GACxD,IAAI5J,IACF,KAAM,eAGR,GAAc,SAAX8U,EAAKt6B,EACN,KAAM,YAGR,MAAMk7C,EAAgBtiD,KAAK0kF,qBAAqBQ,iBAAiBj+E,EAAQy6B,EAAKvyB,GAAIvE,GAAO/J,KAAKmhF,I,MAC5F,IAAIp1D,IACF,KAAM,eAGL5sB,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGd,MAAMtE,EAAO5J,KAAK4J,KAAKyjC,YACvBzjC,EAAKwC,QAAQnF,OAAS,GAAKA,EAC3B2C,EAAKwC,QAAQu1E,MAAQ,GAAKjgD,EAAKvyB,GAC/BvF,EAAKwC,QAAQ61E,QAAU,GAAKD,EAAWE,SAEvC,MAAM8oB,EAAc,IAAI,GAAY,KAjFlB,gBAiFyChrG,KAAK+K,YAAY,GAE5E/K,KAAK2qB,cAAcxgB,QACnBnK,KAAK8gF,qBAAqB32E,QAE1B,MAAMsgB,EAA+B,GAC/BwgF,IAAcjpB,EAAW1qE,OAAO4zF,QAEtC,IAAI,MAAMzlG,KAAQu8E,EAAWlkD,QAAS,CACpC,MAAM79B,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAUC,IAAI,wBACxBJ,EAAUmM,QAAQi2E,SAAW58E,EAAK0J,GAElC,MAAMyoF,EAAUqT,OAAYvmG,EAAYxE,SAASC,cAAc,OAS/D,GARGy3F,IACDA,EAAQx3F,UAAUC,IAAI,gCAEtBJ,EAAU8J,OAAO6tF,IAGnBhuF,EAAKG,OAAO9J,GAERgrG,EAsBFhrG,EAAUG,UAAUC,IAAI,iBAtBX,CACbu3F,EAAQx3F,UAAUC,IAAI,SACtBu3F,EAAQ3zF,UAAY,IAAkBwoB,cAAc,IAAIhnB,EAAKmI,MAAMtC,QAAQ,IAE3E,MAAMsC,EAAQ1N,SAASC,cAAc,OACrCyN,EAAMxN,UAAUC,IAAI,8BACpBuN,EAAM3J,UAAY,IAAkBwoB,cAAchnB,EAAKmI,OAEvD,MAAM8pB,EAAcx3B,SAASC,cAAc,OAC3Cu3B,EAAYt3B,UAAUC,IAAI,oCAC1Bq3B,EAAYzzB,UAAY,IAAkB0oC,aAAalnC,EAAKiyB,YAAa,CACvEyzE,YAAY,EACZhoB,SAAS,IAGXljF,EAAU8J,OAAO6D,EAAO8pB,GAExB,MAAM0zE,EAAYlrG,SAASC,cAAc,OACzCirG,EAAUhrG,UAAUC,IAAI,2BAExBuJ,EAAKG,OAAOqhG,GAKd,GAAc,oBAAX3lG,EAAK2B,GACN,GAAG3B,EAAKolB,OAAoD,IAA3CplB,EAAKolB,MAAM4zB,UAAUliC,QAAQ,UAAiB,CAC7D,IAAIgnF,EACD3L,GACD2L,EAAiBrjG,SAASC,cAAc,OACxCy3F,EAAQ7tF,OAAOw5F,IAEfA,EAAiBtjG,EAGnBsjG,EAAenjG,UAAUC,IAAI,mBAC7B4qG,GAAa1H,EAAenjG,UAAUC,IAAI,oBAE1CL,KAAK2qB,cAAchlB,KAAK,CACtBwnB,IAAKltB,EACL6F,KAAM,IACGyO,GAAA,EAAmBqX,SAAS,CACjC0vB,KAAM,EACNI,SAAU,CACRt0C,EAAG,uBACHy0C,YAAcp2C,EAAKolB,MAAkCgxB,YACrDnnC,IAAKjP,EAAKolB,MAAMnW,KAElB5U,KAAM2F,EAAKolB,MAAM/qB,KACjB87C,SAAUn2C,EAAKolB,MAAM4zB,YACpB59C,KAAKgjD,IACN,MAAMjC,EAAQ,IAAIpZ,MAClBoZ,EAAMxhD,UAAUC,IAAI,eACpB,aAAkBwjD,GAAMhjD,KAAKwqG,IAC3BjpD,GAAsBmhD,EAAgB3hD,EAAOypD,GAAS,cAM3D,CACL,MAAMv4F,EAAQrN,EAAKvF,UAA0BuF,EAAKjB,MAClD,GAAI,CAAC,UAAW,OAAgCk2B,SAA8B,QAApB,EAAA5nB,SAAoB,eAAE3P,OAAS8nG,EACvF,OAAAviC,GAAA,GAAuB51D,GAEL,QAAfA,EAAM3P,KACP6nG,EAAY3qG,IAAIyS,EAAO7S,GACA,YAAf6S,EAAM3P,OACdlD,EAAUG,UAAUC,IAAI,iBACxBL,KAAK8gF,qBAAqBL,cAAc3tE,EAAO7S,EAAWwqB,GACrC,IAAlB3X,EAAMoqC,SACPl9C,KAAK8gF,qBAAqBJ,mBAAmBzgF,SAG5C,GAAG6S,EAAO,CACf,MAAMhT,EAAOmrG,EAAY,QAAKvmG,EAC9BumG,GAAahrG,EAAUG,UAAUC,IAAI,oBACrCiqB,GAAU,CACR9lB,MAAOsO,EACP7S,UAAWgrG,EAAYhrG,EAAY23F,EACnCrtE,SAAUzqB,EACV0qB,UAAW1qB,EACX8sB,aACAjC,cAAe3qB,KAAK2qB,cACpBF,mBAMR,OAAO5nB,QAAQC,IAAI2nB,GAAc5pB,KAAK,KACpC,IAAI+rB,IAEF,YADAo+E,EAAY7gG,QAIdP,EAAKxJ,UAAUkM,OAAO,aAAc2+F,GACpCrhG,EAAKxJ,UAAUkM,OAAO,iBAAkB2+F,GACxCjrG,KAAKC,UAAUG,UAAUkM,OAAO,aAAc2+F,GAQ9C,MAAMriD,EAAS5oD,KAAK4J,KAAKkH,cAEzB,GADA83C,EAAOp2C,YAAc,GAClBwvE,EAAWspB,UAAW,CACvB,MAAMC,EAAgB,YAAO,6DAC7BA,EAAcjqF,mBAAmB,YAAa,IAAkBmL,cAAcu1D,EAAWspB,UAAUpuF,OACnG,YAAiBquF,EAAgBtpG,IAC/BjC,KAAK0kF,qBAAqB8mB,WAAWvkG,EAAQy6B,EAAKvyB,GAAI6yE,EAAWspB,UAAUG,eAE7E7iD,EAAO7+C,OAAOwhG,GAEhB3iD,EAAO7+C,OAAO/J,KAAK4J,KAAOA,GAEvB5J,KAAKgrG,aACNhrG,KAAKgrG,YAAYjrD,SAEnB//C,KAAKgrG,YAAcA,EACnBA,EAAYhgF,SAERhrB,KAAK6nG,iBACP7nG,KAAK6nG,eAAiB,KACpB,GAAG7nG,KAAK4J,KAAKxJ,UAAUuR,SAAS,cAAe,CAC7C,MAAMjR,EAASV,KAAK4J,KAAKK,kBAAoBia,EAAA,EAAWosB,OAAOq2B,WAAWjmE,OAAUV,KAAK4J,KAAKK,kBAAoB,GAClHjK,KAAK4J,KAAKjH,MAAMjC,MAAQA,EAAQ,UAEhCV,KAAK4J,KAAKjH,MAAMjC,MAAQ,IAG5BwjB,EAAA,EAAWljB,iBAAiB,eAAgBhB,KAAK6nG,iBAGnD7nG,KAAK6nG,iBAEL7nG,KAAKsM,QAAQ01E,EAAWlkD,QAAQ37B,SAAW6/E,EAAWspB,WACtDtrG,KAAK+K,WAAWo+B,UAAY,MAIhC,MAAO,CAAClE,KAAMvD,EAAM4gB,oBAlNpBtiD,KAAKC,UAAUG,UAAUC,IAAI,iBAE7BL,KAAKgB,iBAAiB,UAAW,KAC/BwK,WAAW,KACTxL,KAAK+K,WAAW9K,UAAUkpC,UAAY,GACrC,KAGLnpC,KAAK0rG,WAAar2E,GAASr1B,KAAK+qG,YAAa,KAAK,GAAM,GAExD/qG,KAAKgB,iBAAiB,SAAU,KAC3BhB,KAAK6nG,iBACN3jF,EAAA,EAAW7a,oBAAoB,eAAgBrJ,KAAK6nG,gBACpD7nG,KAAK6nG,oBAAiBnjG,KAwMlB,OACR1E,KAAK4J,KAAO1J,SAASC,cAAc,OACnCH,KAAK4J,KAAKxJ,UAAUC,IAAI,yBAExBL,KAAKC,UAAU8J,OAAO/J,KAAK4J,MAE3B5J,KAAK+K,WAAa,IAAI,IAAW/K,KAAKC,WACtCD,KAAK2qB,cAAgB,IAAI,KACzB3qB,KAAK8gF,qBAAuB,IAAI,GAAqB9gF,KAAK2qB,cAjQtC,kB,YCkET,MAAM,GA2GnB,YAAoBoC,EACV29B,EACAs+B,EACA4U,EACA+N,EACArwB,EACAswB,EACAphB,EACAzB,EACA8iB,EACAC,EACAnuB,EACAiL,EACAlE,GAbU,KAAA33D,OACV,KAAA29B,qBACA,KAAAs+B,wBACA,KAAA4U,iBACA,KAAA+N,kBACA,KAAArwB,kBACA,KAAAswB,qBACA,KAAAphB,eACA,KAAAzB,mBACA,KAAA8iB,oBACA,KAAAC,0BACA,KAAAnuB,kBACA,KAAAiL,kBACA,KAAAlE,uBA/GF,KAAAqnB,QAAU,GACV,KAAAC,aAAe,EAiBf,KAAAC,cAIJ,GAeI,KAAAC,gBAA2B,KAU5B,KAAA1/C,WAAY,EACX,KAAA2/C,gBAAiB,EAGjB,KAAAC,gBAAkB,EAclB,KAAAC,UAAW,EACX,KAAAC,gBAAkB,GACT,KAAAC,YAAwB,GACxB,KAAAC,gBAA4B,GACrC,KAAAC,gBAAkB,GAonBlB,KAAAC,oBAAuBzqG,IAC1BA,GACD,OAAAyb,EAAA,GAAYzb,GAGdjC,KAAKmsG,gBAAiB,EACtBnsG,KAAK2sG,SAASlqG,OACdmqG,GAAA,EAAqBC,cAAa,IAG5B,KAAAC,gBAAkB,KACxB,MAAMC,EAAc,sBAAqB,YAAc,SACvD/sG,KAAKgtG,mBAAmB5sG,UAAUkM,OAAOygG,GAAa,IAGhD,KAAAE,iBAAmB,KACzB,MAAMF,EAAc,sBAAqB,YAAc,SACvD/sG,KAAKgtG,mBAAmB5sG,UAAUkM,OAAOygG,GAAa,IAOjD,KAAA3N,gBAAkB,CAACpnE,EAAuBh4B,KAAK+jF,YAAYx9E,KAAKvG,MAAM,GAAO60E,EAAW,IAAIx/B,QACjG,MAAM,OAACpuC,GAAUjH,KAAK+sB,KAChBH,EAAa5sB,KAAK+sB,KAAKC,QAAQC,gBAC/Bg7E,EAAoBr/F,EAAA,QAAU6O,OAASxQ,GAAUA,EAAOo2B,UAAYr9B,KAAK4oF,gBAAgBskB,oBAAoBjmG,GAEnH,IAAI,GAAc4tE,EAAW7f,IAC3B,IAAIpoC,IACF,OAICooC,GAD4C,IAAzB3f,KAAKC,MAAQ,IAAO,KAExC0f,OAAYtwD,GAGd1E,KAAKs/F,aAAetqC,EACpBh9B,IAEsB,cAAnBh4B,KAAK+sB,KAAK5pB,MAAwB6xD,GACnCxpD,WAAW,KACLohB,KAIJ5sB,KAAKwqF,aAAa2iB,cAAclmG,IAC/B,IAEJghG,GAAmB1nF,QAsThB,KAAA6sF,uBAAyB,KAC/BptG,KAAKwsG,gBAAgB7mG,KAAK3F,KAAK4nF,aAAa3jF,WACrC,IAAMjE,KAAKysG,gBAAkBzsG,KAAK4nF,aAAa3jF,WAGhD,KAAAopG,SAAW,CAACprG,EAAUkB,EAAuBmqG,KACnD,OAAA5vF,EAAA,GAAYzb,GAEZ,IAAI+B,EAAOhE,KAAK4nF,aAAa3jF,UAC7B,GAAGD,GAAQA,IAASspG,EAAU,CAC5BttG,KAAKqsG,UAAW,EAEhB,IAAIkB,EAAgB,EACpB,EAAG,CACDrtG,SAASo0B,YAAYnxB,GAAM,EAAO,MAClC,MAAMqqG,EAAcxtG,KAAK4nF,aAAa3jF,UACtC,GAAGD,IAASwpG,GACV,KAAKD,EAAgB,EACnB,WAGFA,EAAgB,EAGlBvpG,EAAOwpG,QACDxpG,IAASspG,GAEjBttG,KAAKqsG,UAAW,IAmGZ,KAAAoB,uBAA0BxrG,IAEhC,MAAMyrG,EAA4C,CAChD,KAAQ,OACR,KAAQ,SACR,KAAQ,YACR,KAAQ,gBACR,KAAQ,aAGP1tG,KAAKwqF,aAAamjB,gBACnBD,EAAiB,KAAI,QAGvB,MAAMzrF,EAAOhgB,EAAEggB,KACT2rF,EAAgBF,EAAWzrF,GAejC,GAbkB/hB,SAASwnD,eACdS,WAAW78C,OAAOnJ,QAAUyrG,IAE3B,SAAT3rF,EACDjiB,KAAKwqF,aAAamjB,cAAcE,iBAEhC7tG,KAAK4tG,cAAcA,GAGrB,OAAAlwF,EAAA,GAAYzb,IAIF,SAATggB,EAAiB,CAClB,IAAIje,EAAOhE,KAAK4nF,aAAa3jF,UAE1BhC,EAAE6rG,SACA9tG,KAAKusG,YAAYpqG,SAClBnC,KAAKwsG,gBAAgB7mG,KAAK3B,GAC1BA,EAAOhE,KAAKusG,YAAY7mG,MACxB1F,KAAKqtG,SAASprG,EAAG,OAAQ+B,GACzBA,EAAOhE,KAAK4nF,aAAa3jF,UACzBjE,KAAKssG,gBAAkBtsG,KAAKusG,YAAYpqG,OAAS6B,EAAO,GACxDhE,KAAKysG,gBAAkBzoG,IAItBhE,KAAKwsG,gBAAgBrqG,QAAYnC,KAAKysG,iBAAmBzoG,IAAShE,KAAKysG,kBACxEzsG,KAAKusG,YAAY5mG,KAAK3B,GACtBA,EAAOhE,KAAKwsG,gBAAgB9mG,MAC5B1F,KAAKqtG,SAASprG,EAAG,OAAQ+B,GAGzBhE,KAAKysG,gBAAkBzsG,KAAKssG,gBAAkBtsG,KAAK4nF,aAAa3jF,aAMhE,KAAA8pG,eAAkB9rG,I,MAexB,MAAOC,MAAO8rG,EAAWn3D,SAAUo3D,EAAgB,SAAEjF,GAAYb,GAAsBnoG,KAAK0jG,kBAAkB3hG,OAGxGG,EAAQ,IAAkBgsG,cAAcF,EAAWC,GAAkB,GACrEp3D,EAAW,IAAkBs3D,cAAcF,EAAkB,IAAkBG,cAAclsG,IAIhGlC,KAAKssG,kBAAoBtsG,KAAKqsG,UAAYrsG,KAAK4nF,aAAa3jF,YAAcjE,KAAKssG,kBAChFtsG,KAAKssG,gBAAkB,GACvBtsG,KAAKusG,YAAYpqG,OAAS,GAG5B,MAAMksG,IAA2G,QAAhB,EAAAruG,KAAKq/F,mBAAW,eAAEvsF,QAAS+jC,EAASjvC,OAAO3F,GAAa,qBAARA,EAAEmF,GAAoC,yBAARnF,EAAEmF,GACjL,GAAGinG,EAAYlsG,OACb,IAAI,MAAMmvD,KAAU+8C,EAAa,CAC/B,IAAI35F,EACJ,GAAgB,yBAAb48C,EAAOlqD,EACRsN,EAAM48C,EAAO58C,SAIb,GAFAA,EAAMs5F,EAAUvqG,MAAM6tD,EAAOjhC,OAAQihC,EAAOjhC,OAASihC,EAAOnvD,SAEvDuS,EAAIgmB,SAAS,aAAchmB,EAAIgmB,SAAS,YAC3C,SAMJ,GAAG16B,KAAK+rG,UAAYr3F,EAAK,CACvB1U,KAAK+rG,QAAUr3F,EAEf,MAAMvO,EAAUnG,KAAKsuG,kBAAoB,KAAWr0D,kBAAkB,sBAAuB,CAC3FvlC,QACC7T,KAAMisB,IACPA,EAAU9sB,KAAK4rG,mBAAmB2C,YAAYzhF,GAC3C9sB,KAAKsuG,oBAAsBnoG,IAASnG,KAAKsuG,uBAAoB5pG,GAC7D1E,KAAK+rG,UAAYr3F,IACF,YAAfoY,EAAQ1lB,GAGTpH,KAAKwuG,WAAW,UAAW,OAAU1hF,EAAQirE,WAAajrE,EAAQlf,OAAS,UAAWkf,EAAQ4K,aAAe5K,EAAQpY,KAAO,WACrH1U,KAAKyuG,UACZzuG,KAAKksG,gBAAkBp/E,GACf9sB,KAAKksG,iBACblsG,KAAK0uG,oBAKX,WAEM1uG,KAAK+rG,UACb/rG,KAAK+rG,QAAU,UACR/rG,KAAKyuG,UACZzuG,KAAKksG,gBAAkB,KAEpBlsG,KAAKoiG,WACNpiG,KAAK2uG,aAEL3uG,KAAKqiG,eAIT,GAAI2L,EAAU1iG,OAQP,CACL,MAAM8pC,EAAOC,KAAKC,MACfF,EAAOp1C,KAAKgsG,cAAgB,MAC7BhsG,KAAKgsG,aAAe52D,EACpBp1C,KAAK0qD,mBAAmBy2B,UAAUnhF,KAAK+sB,KAAK9lB,OAAQ,CAACG,EAAG,kCAXvDpH,KAAKgsG,cACNhsG,KAAK0qD,mBAAmBy2B,UAAUnhF,KAAK+sB,KAAK9lB,OAAQ,CAACG,EAAG,4BAGvDpH,KAAKwqF,aAAamjB,eACnB3tG,KAAKwqF,aAAamjB,cAAcpuE,OAUhCv/B,KAAK4uG,WACP5uG,KAAK6uG,qBAGP7uG,KAAK8uG,kBAAkBd,EAAWhF,EAAUnyD,GAE5C72C,KAAK+uG,iBA0EA,KAAAxwB,gBAAkB,CAACpkC,EAAe92C,KACvCrD,KAAKmqG,cAAchwD,EAAO,IAAkB60D,wBAAwB70D,GAAQ92C,IAgHtE,KAAA4rG,eAAkBhtG,IAGxB,GAFA,OAAAyb,EAAA,GAAYzb,IAERjC,KAAK2sG,UAAY3sG,KAAKwsD,YAAcxsD,KAAKogG,gBAAkBpgG,KAAKkvG,YAAclvG,KAAK4uG,UAClF5uG,KAAKwsD,UACFnX,KAAKC,MAAQt1C,KAAKosG,gBA3gDN,IA4gDdpsG,KAAK0sG,sBAEL1sG,KAAK2sG,SAASlqG,OAGhBzC,KAAK+jF,kBAEF,CACL,GAAG/jF,KAAK+sB,KAAK9lB,OAAOw3B,cAAgBz+B,KAAK0qD,mBAAmBm8B,cAAc7mF,KAAK+sB,KAAK9lB,OAAQjH,KAAK+sB,KAAKjiB,SAAU,cAE9G,YADAoqB,GAphD0B,sDAwhD5Bl1B,KAAK+mF,UAAU3mF,UAAUC,IAAI,aAC7B,OAAA2qD,GAAA,KAEAhrD,KAAK2sG,SAASptF,QAAQ1e,KAAK,KACzBb,KAAKmvG,qBAAuB,GAA2BC,iBACvDpvG,KAAKmsG,gBAAiB,EAEtBnsG,KAAK+mF,UAAU3mF,UAAUC,IAAI,gBAC7BL,KAAKwsD,WAAY,EACjBxsD,KAAK+uG,gBACLnC,GAAA,EAAqBC,cAAa,GAElC,MAAMwC,EAAmB,KACvB,IAAI,GAAU,sBAAuB,CACnC37E,aAAc,2BACd+D,mBAAoB,iCACpB7Z,QAAS,CAAC,CACRmX,QAAS,4BACTiD,SAAU,KACR,YAAmBh4B,KAAKsvG,mBAEzB,CACDv6E,QAAS,WACT4lC,UAAU,MAEXp6C,QAGLvgB,KAAKuvG,yBAA2BvvG,KAAK+N,eAAe1N,IAAIH,SAASiW,KAAjCnW,CAAuC,YAAciC,IAC/E,OAAA6f,GAAA,GAAgB7f,EAAE4S,OAAQ,eAAkB,OAAAiN,GAAA,GAAgB7f,EAAE4S,OAAQ,yBACxE,OAAA6I,EAAA,GAAYzb,GACZotG,MAED,CAACvjF,SAAS,EAAMxQ,SAAS,IAE5BvM,EAAA,EAAwBoB,SAASnQ,KAAKwvG,wBAA0B,CAC9DrsG,KAAM,QACNiN,MAAO,KACL5E,WAAW,KACT6jG,KACC,IAEI,KAIXrvG,KAAKosG,gBAAkB/2D,KAAKC,MAE5B,MAAMm6D,EAAyCzvG,KAAK2sG,SAAS8C,WAGvDC,EAFUD,EAAWvmG,QAEFymG,iBACzBF,EAAWG,QAAQF,GAEnBA,EAASG,QAAU,GAEnB,MAAMC,EAAgB,IAAIlrF,WAAW8qF,EAASK,mBACxCjuG,EAA6B,IAAvBguG,EAAc3tG,OAE1B,IAAIic,EAAI,KACN,IAAIpe,KAAKwsD,UAAW,OAEpBkjD,EAASM,qBAAqBF,GAE9B,IAAIx/E,EAAM,EACVw/E,EAAcxpG,QAAQpE,IACpBouB,GAAOpuB,IAGT,IAAIwa,EAAWra,KAAKC,IAAI,EAAIguB,EAAMxuB,EAXxB,KAcV9B,KAAKiwG,eAAettG,MAAMga,UAAY,SAASD,KAE/C,IAAI8U,EAAO6jB,KAAKC,MAAQt1C,KAAKosG,gBACzB92E,EAAK9D,EAAO,IAEZ2hC,GAAa,GAAM3hC,EAAO,KAAO9P,WAAa,KAAO,KAAOrf,KAAKE,MAAM+yB,EAAK,KAAK7xB,OAAO,GAE5FzD,KAAKkwG,aAAahmF,UAAYipC,EAE9B,aAAQ/0C,IAGVA,MACC5R,MAAOvK,IACR,OAAOA,EAAEqH,MACP,IAAK,kBACH4rB,GAAM,0CACN,MAGF,IAAK,mBACHA,GAAMjzB,EAAEmC,SACR,MAGF,QACEsI,QAAQC,MAAM,wBAAyB1K,EAAGA,EAAEqH,KAAMrH,EAAEmC,SACpD8wB,GAAMjzB,EAAEmC,SAIZpE,KAAK+mF,UAAU3mF,UAAUuB,OAAO,eAAgB,iBAK9C,KAAA+sG,eAAiB,CAACzsG,EAAW8/F,KAKnC,GAJG9/F,GACD,OAAAyb,EAAA,GAAYzb,GAGXjC,KAAKksG,gBAAiB,CACvB,MAAMH,EAAU/rG,KAAK+rG,QACrB,IAAIoE,GAAa,EAcjB,GAbGnwG,KAAKoiG,aAEJpiG,KAAK2uG,aAGPwB,GAAa,GAIfnwG,KAAK+rG,QAAUA,EACf/rG,KAAKyuG,WAAY,EACjBzuG,KAAKksG,gBAAkB,KAEpBiE,EAAY,OAGjB,GAAuB,SAApBnwG,KAAKoiG,aAA0BL,EAAO,CACvC,MAAM39F,EAAUpE,KAAKq/F,YACfn9F,EAAQ,IAAkBgsG,cAAcluG,KAAK0jG,kBAAkBxhG,MAAO,IAC5E,GAAGkC,EAAQA,UAAYlC,EAWrB,YAVA,IAAI,GAAU,kBAAmB,CAC/B0b,QAAS,CAAC,CACRmX,QAAS,wBACTiD,SAAU,KACRh4B,KAAK0uG,oBAAehqG,GAAW,MAGnC+yB,mBAAoB,0BACnBlX,OAMPvgB,KAAKqiG,cACLriG,KAAK+uG,iBAGC,KAAAqB,cAAiBnuG,IAGvB,GAFA,OAAAyb,EAAA,GAAYzb,GAER,OAAA6f,GAAA,GAAgB7f,EAAE4S,OAAQ,SAC9B,GAAuB,YAApB7U,KAAKoiG,WAA0B,CAChC,MAAM,gBAACiO,GAAmBrwG,KACvBqwG,GAAmB,wBAAuBA,EAAgBpwG,UAAUG,UAAUuR,SAAS,WACxF,aAAY0+F,EAAgBpwG,eAEF,UAApBD,KAAKoiG,WACbpiG,KAAK+sB,KAAKs/D,aAAarsF,KAAKmiG,cACA,SAApBniG,KAAKoiG,YACbpiG,KAAK+sB,KAAKs/D,aAAarsF,KAAK4uG,YAhkD9B5uG,KAAK+N,eAAiB,IAAI,IAGrB,YACL/N,KAAK+mF,UAAY7mF,SAASC,cAAc,OACxCH,KAAK+mF,UAAU3mF,UAAUC,IAAI,cAC7BL,KAAK+mF,UAAUpkF,MAAMC,QAAU,OAE/B5C,KAAKswG,eAAiBpwG,SAASC,cAAc,OAC7CH,KAAKswG,eAAelwG,UAAUC,IAAI,wBAElCL,KAAKotD,YAAcltD,SAASC,cAAc,OAC1CH,KAAKotD,YAAYhtD,UAAUC,IAAI,eAAgB,sBAE/C,MAAMkwG,EAAOtX,KACbj5F,KAAKotD,YAAYrjD,OAAOwmG,GAExB,MAAMjjD,EAAkBttD,KAAKstD,gBAAkBptD,SAASC,cAAc,OACtEmtD,EAAgBltD,UAAUC,IAAI,eAAgB,qBAE9C,MAAMgtD,EAAuBntD,SAASC,cAAc,OACpDktD,EAAqBjtD,UAAUC,IAAI,eAAgB,0BAEnDL,KAAKswG,eAAevmG,OAAO/J,KAAKotD,YAAaE,EAAiBD,GAC9DrtD,KAAK+mF,UAAUh9E,OAAO/J,KAAKswG,gBAE3BtwG,KAAKwwG,UAAY,EAAa,CAACnjG,KAAM,aAAc7D,UAAW,+CAC9DxJ,KAAKswG,eAAevmG,OAAO/J,KAAKwwG,WAEhC,YAAiBxwG,KAAKwwG,UAAYvuG,IAChC,OAAAyb,EAAA,GAAYzb,GACZjC,KAAK+sB,KAAKC,QAAQyjF,iBACjB,CAAC1iG,eAAgB/N,KAAK+N,iBAsEpB,uBACL/N,KAAKisG,cAAchsG,UAAYC,SAASC,cAAc,OACtDH,KAAKisG,cAAchsG,UAAUG,UAAUC,IAAI,iBAE3CL,KAAKisG,cAAcyE,QAAU,EAAW,IACxC1wG,KAAKisG,cAAc0E,UAAY,EAAW,qBAAsB,CAAChjG,UAAU,IAE3E3N,KAAKisG,cAAchsG,UAAU8J,OAAO/J,KAAKisG,cAAcyE,QAAS1wG,KAAKisG,cAAc0E,WAInF,MAAMC,EAAoB,KACxBC,GAAmB,EACZ7wG,KAAK8wG,uBAGRC,EAAqB,KACzBF,GAAmB,GAGfR,EAAgDrwG,KAAKqwG,gBAAkB,GAC7E,IAAIQ,GAAmB,EACvB,MAAMG,EAA0C,CAC9CX,EAAgBnoF,WAAa,CAC3BhL,KAAM,kCACNC,QAASyzF,EACTxzF,cAAe,IAAI,KAAc,CAACO,SAAS,KAE7C0yF,EAAgBY,WAAa,CAC3B/zF,KAAM,kCACNC,QAASyzF,EACTxzF,cAAe,IAAI,KAAc,CAACO,SAAS,KAE7C0yF,EAAgBa,YAAc,CAC5Bh0F,KAAM,wCACNC,QAAS4zF,EACT3zF,cAAe,IAAI,KAAc,CAACO,SAAS,KAE7C0yF,EAAgBc,YAAc,CAC5Bj0F,KAAM,wCACNC,QAAS4zF,EACT3zF,cAAe,IAAI,KAAc,CAACO,SAAS,KAE7C0yF,EAAgBe,WAAa,CAC3Bl0F,KAAM,oCACNC,QAAS,KACPnd,KAAKqxG,0BAEPhkG,KAAM,YAGJikG,EAAiBjB,EAAgBpwG,UAAY,GAAW+wG,EAAgBhxG,KAAK+N,gBAG7EgY,EAAW5d,MAAMC,KAAKkpG,EAAevrF,UAkD3C,GA9CM,CAAC,CACL6B,SAAU7B,EAAStiB,MAAM,EAAG,GAC5B0H,SAAU,CAACjJ,EAAOD,KAChB,MAAM0b,KAAazb,EAChB2uG,IACD7wG,KAAKuxG,0BAA4B5zF,GAGnC,MAAM6zF,EAAaxxG,KAAKisG,cAAchsG,UAAU4P,cAAc,gBAC9D,GAAG2hG,EAAY,CACb,MAAMzhG,EAAKyhG,EAAW3xF,kBAChB7U,EAAI,UAAK01F,QAAQ1wF,IAAID,GACrBqlB,EAA2Bi7E,EAAgBnoF,WAAW9K,cAAcO,QAAU,yBAA2B,wBAC/G3S,EAAEuD,IAAM6mB,EACRpqB,EAAE22B,YAGL,CACD/Z,SAAU7B,EAAStiB,MAAM,EAAG,GAC5B0H,SAAWjJ,IACT,MAAMyb,KAAazb,EACnB,IAAIqG,EAEFA,EADCoV,QAA6CjZ,IAAlC1E,KAAKuxG,yBACbvxG,KAAKuxG,yBAA2BlB,EAAgBY,WAAaZ,EAAgBnoF,WAE7EvK,EAAU0yF,EAAgBnoF,WAAamoF,EAAgBY,WAG7D1oG,EAAE6U,cAAcO,SAAU,KAGvBrX,QAAQ8mB,IACb,MAAMntB,EAAY8yB,GAAU3F,EAAMxF,SAASnf,IAAIxG,IACtC,CACLhC,UAAWgC,EACXF,MAAOE,EAAE4N,cAAc,YAEvBud,EAAMjiB,UAEJ+lC,EAAKhxC,SAASC,cAAc,MAClCF,EAAU8J,OAAOmnC,GACjBogE,EAAevnG,OAAO9J,KAGxBqxG,EAAevnG,OAAOsmG,EAAgBe,WAAWp8F,UAE7C,sBAAoB,CACDhV,KAAKyxG,aAAe,IAAI,GAAc,CACzDz8F,QAASs8F,IAIbjB,EAAgBqB,WAAaV,EAAevtG,MAAM,GAAI,GACtDzD,KAAKisG,cAAchsG,UAAU8J,OAAOunG,GAEpCjB,EAAgBqB,WAAWprG,QAAQ,CAACiC,EAAGlE,KACrC,MAAM,MAACtC,GAASwG,EAAE6U,cAClBrb,EAAMoB,KAAO,QACbpB,EAAMuH,KAAOjF,EAAM,EAAI,SAAW,UAClCtC,EAAMG,MAAQ,OAAQmC,EAAM,KAK9BrE,KAAK2xG,kBAAoBzxG,SAASC,cAAc,OAChDH,KAAK2xG,kBAAkBvxG,UAAUC,IAAI,uBAErCL,KAAKgtG,mBAAqB,EAAW,wBAAyB,CAACr/F,UAAU,IAEzE3N,KAAK4xG,sBAAwB1xG,SAASC,cAAc,OACpDH,KAAK4xG,sBAAsBxxG,UAAUC,IAAI,2BAEnB,SAAnBL,KAAK+sB,KAAK5pB,OACXnD,KAAK6xG,kBAAoB3xG,SAASC,cAAc,QAChDH,KAAK6xG,kBAAkBzxG,UAAUC,IAAI,QAAS,WAAY,iBAC1DL,KAAKwwG,UAAUzmG,OAAO/J,KAAK6xG,mBAE3B7xG,KAAK8xG,aAAe,EAAa,CAACzkG,KAAM,UAAW7D,UAAW,6CAC9DxJ,KAAK+xG,qBAAuB7xG,SAASC,cAAc,QACnDH,KAAK+xG,qBAAqB3xG,UAAUC,IAAI,QAAS,WAAY,iBAC7DL,KAAK8xG,aAAa/nG,OAAO/J,KAAK+xG,sBAC9B/xG,KAAKswG,eAAevmG,OAAO/J,KAAK8xG,cAEhC,YAAiB9xG,KAAK8xG,aAAe7vG,IACnC,OAAAyb,EAAA,GAAYzb,GACZjC,KAAK0qD,mBAAmBsnD,gBAAgBhyG,KAAK+sB,KAAK9lB,SACjD,CAAC8G,eAAgB/N,KAAK+N,iBAEzB/N,KAAKiyG,aAAe,EAAW,qCAAsC,CAACtkG,UAAU,IAEhF,YAAiB3N,KAAKiyG,aAAehwG,IACnCjC,KAAKwqF,aAAa2iB,cAAcntG,KAAK+sB,KAAK9lB,SACzC,CAAC8G,eAAgB/N,KAAK+N,iBAEzB/N,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAiB,EAAEiH,aACjDjH,KAAK+sB,KAAK9lB,SAAWA,GAIxBjH,KAAKiyG,aAAa7xG,UAAUuB,OAAO,UAGrC3B,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,mBAAoB,EAAEiH,aACpDjH,KAAK+sB,KAAK9lB,SAAWA,GAIxBjH,KAAK0qD,mBAAmBivC,qBAAqB35F,KAAK+sB,KAAK9lB,QAAQpG,KAAKqB,IAClElC,KAAKiyG,aAAa7xG,UAAUkM,OAAO,QAASpK,EAAMC,YAItDnC,KAAKkyG,qBAAuB,EAAW,wCAAyC,CAACvkG,UAAU,IAC3F3N,KAAKmyG,cAAgB,IAAI,GAAc,CACrCn2E,SAAUh8B,KAAKotD,YACfr/C,eAAgB/N,KAAK+N,eACrB28C,mBAAoB1qD,KAAK0qD,mBACzB8/C,SAAUxqG,KAAKkyG,qBACfnrB,UAAW/mF,OAEbA,KAAK+N,eAAe1N,IAAIL,KAAKmyG,cAA7BnyG,CAA4C,OAAQ,IAAMA,KAAKkyG,qBAAqB9xG,UAAUC,IAAI,WAClGL,KAAK+N,eAAe1N,IAAIL,KAAKmyG,cAA7BnyG,CAA4C,QAAS,IAAMA,KAAKkyG,qBAAqB9xG,UAAUuB,OAAO,YAGxG3B,KAAKoyG,kBAAoB,CAAC,CACxB/kG,KAAM,QACN6P,KAAM,iCACNC,QAAS,KACPnd,KAAKqyG,UAAUnwG,MAAQ,GACvB,MAAMowG,EAAS,IAAI,GAA4B3qF,KAAK,MACpD3nB,KAAKqyG,UAAUjvG,aAAa,SAAUkvG,GACtCtyG,KAAK4iG,eAAiB,QACtB5iG,KAAKqyG,UAAUz2E,SAEjB7mB,OAAQ,CAAC9N,EAAQ6D,IAAa9K,KAAK0qD,mBAAmBm8B,cAAc5/E,EAAQ6D,EAAU,eACrF,CACDuC,KAAM,WACN6P,KAAM,6BACNC,QAAS,KACPnd,KAAKqyG,UAAUnwG,MAAQ,GACvBlC,KAAKqyG,UAAUjuE,gBAAgB,UAC/BpkC,KAAK4iG,eAAiB,WACtB5iG,KAAKqyG,UAAUz2E,SAEjB7mB,OAAQ,CAAC9N,EAAQ6D,IAAa9K,KAAK0qD,mBAAmBm8B,cAAc5/E,EAAQ6D,EAAU,eACrF,CACDuC,KAAM,OACN6P,KAAM,OACNC,QAAS,KACP,IAAI,GAAgBnd,KAAK+sB,MAAMxM,QAEjCxL,OAAQ,CAAC9N,EAAQ6D,IAAa7D,EAAOw3B,aAAez+B,KAAK0qD,mBAAmBm8B,cAAc5/E,EAAQ6D,EAAU,gBAG9G9K,KAAKuyG,WAAa,GAAiB,CAAC5kG,UAAU,EAAMI,eAAgB/N,KAAK+N,gBAAiB,WAAY/N,KAAKoyG,mBAC3GpyG,KAAKuyG,WAAWnyG,UAAUC,IAAI,cAAe,gBAC7CL,KAAKuyG,WAAWnyG,UAAUuB,OAAO,cAIjC3B,KAAKkwG,aAAehwG,SAASC,cAAc,OAC3CH,KAAKkwG,aAAa9vG,UAAUC,IAAI,eAEhCL,KAAKqyG,UAAYnyG,SAASC,cAAc,SACxCH,KAAKqyG,UAAUlvG,KAAO,OACtBnD,KAAKqyG,UAAUG,UAAW,EAC1BxyG,KAAKqyG,UAAU1vG,MAAMC,QAAU,OAE/B5C,KAAK2xG,kBAAkB5nG,UAAU,CAAC/J,KAAKgtG,mBAAoBhtG,KAAK4xG,sBAAuB5xG,KAAKiyG,aAAcjyG,KAAKkyG,qBAAsBlyG,KAAKuyG,WAAYvyG,KAAKkwG,aAAclwG,KAAKqyG,WAAWzqG,OAAOc,UAEhM1I,KAAKotD,YAAYrjD,OAAO/J,KAAKisG,cAAchsG,WAC3CD,KAAKyyG,6BAA+B,IAAI,GACxCzyG,KAAK0yG,eAAiB,IAAI,GAAe1yG,KAAKotD,YAAaptD,KAAKyyG,8BAChEzyG,KAAK2yG,YAAc,IAAI,GAAY3yG,KAAKotD,YAAaptD,KAAKyyG,6BAA8BzyG,KAAMA,KAAK29E,iBACnG39E,KAAK4yG,eAAiB,IAAI,GAAe5yG,KAAKotD,YAAaptD,KAAKyyG,6BAA8BzyG,KAAMA,KAAK+sB,KAAK+7D,kBAAmB9oF,KAAK+sB,KAAK67D,iBAC3I5oF,KAAK6yG,eAAiB,IAAI,GAAe7yG,KAAKotD,YAAaptD,KAAKyyG,6BAA8BzyG,KAAMA,KAAK+sB,KAAK+7D,kBAAmB9oF,KAAK+sB,KAAK67D,iBAC3I5oF,KAAK8yG,aAAe,IAAI,GAAa9yG,KAAKotD,YAAaptD,KAAKyyG,6BAA8BzyG,KAAK+sB,KAAM/sB,KAAK4oF,gBAAiB5oF,KAAK0kF,sBAChI1kF,KAAKotD,YAAYrjD,OAAO/J,KAAK2xG,mBAE7B3xG,KAAKsvG,gBAAkB,EAAW,wDAElCtvG,KAAK+yG,iBAAmB7yG,SAASC,cAAc,OAC/CH,KAAK+yG,iBAAiB3yG,UAAUC,IAAI,sBAEpCL,KAAKiwG,eAAiB/vG,SAASC,cAAc,OAC7CH,KAAKiwG,eAAe7vG,UAAUC,IAAI,iBAElCL,KAAKgzG,QAAU,EAAW,2DAC1BhzG,KAAKgzG,QAAQ1xF,mBAAmB,aAAc,qMAO9CthB,KAAK+yG,iBAAiBhpG,OAAO/J,KAAKiwG,eAAgBjwG,KAAKgzG,SAEjC,cAAnBhzG,KAAK+sB,KAAK5pB,OACXnD,KAAK6/F,SAAW,IAAI,GAAS,CAC3BF,cAAe,KACb3/F,KAAK4gG,YAAa,EAClB5gG,KAAK+jF,eAEP6b,gBAAiB,KACf5/F,KAAKo/F,qBAAgB16F,IAEvBqJ,eAAgB/N,KAAK+N,eACrB+xF,SAAU,WACVC,iBAAkB//F,KAAKgzG,QACvB/iG,OAAQ,KACEjQ,KAAKogG,kBAAoBppF,OAAOm1C,KAAKnsD,KAAKkvG,YAAY/sG,SAIlEnC,KAAK+yG,iBAAiBhpG,OAAO/J,KAAK6/F,SAASA,WAG7C7/F,KAAKswG,eAAevmG,OAAO/J,KAAKsvG,gBAAiBtvG,KAAK+yG,kBAEtD,GAAkBtI,qBAAqBzqG,KAAKgtG,mBAAoBhtG,KAAK+N,gBACrE/N,KAAK+N,eAAe1N,IAAI,GAAxBL,CAA2C,OAAQA,KAAK8sG,iBACxD9sG,KAAK+N,eAAe1N,IAAI,GAAxBL,CAA2C,QAASA,KAAKitG,kBAEzDjtG,KAAKizG,0BAWLjzG,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,mBAAoB,MAClDA,KAAK0yG,gBAAkB1yG,KAAK2yG,eAE7B3yG,KAAKkzG,cAAgB,GACrBlzG,KAAK8uG,qBAQJ9uG,KAAK0jG,mBACN1jG,KAAK0jG,kBAAkByP,gBAI3BnzG,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAiB,EAAEiH,SAAQ6D,WAAUsoG,QAAOrR,YAC1E/hG,KAAK+sB,KAAKjiB,WAAaA,GAAY9K,KAAK+sB,KAAK9lB,SAAWA,GAC3DjH,KAAK+iF,SAASqwB,GAAO,EAAMrR,KAG7B/hG,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,gBAAkB+sB,IAChD/sB,KAAK+sB,OAASA,GACf/sB,KAAKqzG,cAIa,cAAnBrzG,KAAK+sB,KAAK5pB,KACXnD,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,mBAAoB,EAAEiH,SAAQgB,WAC5DjI,KAAK+sB,KAAK9lB,SAAWA,GAAUgB,EAAKyyB,SAAS16B,KAAK4uG,YACnD5uG,KAAK2I,kBAIT3I,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,iBAAkB,EAAEiH,SAAQQ,WAC1DzH,KAAK+sB,KAAK9lB,SAAWA,IACnBQ,EAAKE,IAAI3H,KAAK4uG,YACf5uG,KAAK2I,gBAGJ3I,KAAKmiG,cAAgB16F,EAAKE,IAAI3H,KAAKmiG,eACpCniG,KAAKqiG,YAAY,YAMzB,IACEriG,KAAK2sG,SAAW,IAAI,KAAS,CAG3B2G,kBAAmB,KACnBC,YAAa,EACbC,iBAAkB,EAClBC,cAAe,EACfC,aAAa,IAEf,MAAMjnG,GACNC,QAAQC,MAAM,8BAA+BF,GAG/CzM,KAAK+uG,gBAEL/uG,KAAK+N,eAAe1N,IAAIL,KAAKqyG,UAA7BryG,CAAwC,SAAWiC,IACjD,IAAI0gG,EAAS1gG,EAAE4S,OAA0C8tF,MACrDA,EAAMxgG,SAIV,IAAI,GAAcnC,KAAK+sB,KAAM5kB,MAAMC,KAAKu6F,GAAOl/F,QAASzD,KAAK4iG,gBAC7D5iG,KAAKqyG,UAAUnwG,MAAQ,MACtB,GAkBH,YAAiBlC,KAAKgzG,QAAShzG,KAAKivG,eAAgB,CAAClhG,eAAgB/N,KAAK+N,eAAgB4lG,gBAAgB,IAEvG3zG,KAAK2sG,WACN,YAAiB3sG,KAAKsvG,gBAAiBtvG,KAAK0sG,oBAAqB,CAAC3+F,eAAgB/N,KAAK+N,iBAEvF/N,KAAK2sG,SAASiH,OAAS,KACrB5zG,KAAKwsD,WAAY,EACjBxsD,KAAK+mF,UAAU3mF,UAAUuB,OAAO,eAAgB,aAChD3B,KAAK+uG,gBACL/uG,KAAKiwG,eAAettG,MAAMga,UAAY,IAGxC3c,KAAK2sG,SAASkH,gBAAmBC,IAgB/B,GAfG9zG,KAAKmvG,uBACNnvG,KAAKmvG,uBACLnvG,KAAKmvG,0BAAuBzqG,GAG3B1E,KAAKuvG,2BACNvvG,KAAK+N,eAAepM,OAAO3B,KAAKuvG,0BAChCvvG,KAAKuvG,8BAA2B7qG,GAG/B1E,KAAKwvG,0BACNzgG,EAAA,EAAwBw4F,WAAWvnG,KAAKwvG,yBACxCxvG,KAAKwvG,6BAA0B9qG,GAG9B1E,KAAKmsG,eACN,OAGF,MAAM,OAACllG,EAAM,SAAE6D,GAAY9K,KAAK+sB,KAC1Bo1E,EAAeniG,KAAKmiG,aAEpBtuF,GAAYwhC,KAAKC,MAAQt1C,KAAKosG,iBAAmB,IAAO,EACxD2H,EAAW,IAAIC,KAAK,CAACF,GAAa,CAAC3wG,KAAM,cAK/CypG,GAAA,EAAqBqH,OAAOH,GAAY,GAAMjzG,KAAKwF,IAGjDumG,GAAA,EAAqBC,cAAa,GAGlC7sG,KAAK0qD,mBAAmBwpD,SAASjtG,EAAQ8sG,EAAU,CACjDI,gBAAgB,EAChBlQ,SAAS,EACTpwF,WACA8Q,SAAUte,EAAOse,SACjB0/E,UAAWh+F,EAAOqO,IAClBytF,eACAr3F,WACA09E,YAAY,IAGdxoF,KAAK2I,eAAc,GAAO,OAKhC,YAAiB3I,KAAKisG,cAAc0E,UAAW3wG,KAAK0uG,eAAgB,CAAC3gG,eAAgB/N,KAAK+N,iBAC1F,YAAiB/N,KAAKisG,cAAchsG,UAAWD,KAAKowG,cAAe,CAACriG,eAAgB/N,KAAK+N,iBAEzF/N,KAAK6uG,mBAAqBx5E,GAAS,IAAMr1B,KAAKqzG,YAAa,MAAM,GAAO,GAGnE,yBACL,MAAMpzG,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAUC,IAAI,oBAExBL,KAAKo0G,iBAAmB,YAAO,gEAAiE,CAAC/mG,KAAM,UACvGpN,EAAU8J,OAAO/J,KAAKo0G,kBAEtB,MAAMC,EAAgBp0G,EAAUotC,WAAU,GAC1CrtC,KAAKs0G,qBAAuBD,EAAc/hD,WAC1CtyD,KAAKstD,gBAAgBvjD,OAAOsqG,GAE5Br0G,KAAK+N,eAAe1N,IAAIL,KAAKo0G,iBAA7Bp0G,CAA+C,QAAS,KACtD,MAAMiH,EAASjH,KAAK+sB,KAAK9lB,OAEzB,IAAI,GAAgBA,EAAQ,GAAG,EAAM,KACnCjH,KAAK+sB,KAAKy9D,aAAav+C,QAAQ,MAG/B,MAAMsoE,EAAev0G,KAAK+sB,KAAKy9D,aAAaz9D,KACzCwnF,EAAavoB,OAAOC,eACrBsoB,EAAavoB,OAAOC,cAAcuoB,uBAAuBloG,QAAO,OAKtEtM,KAAKotD,YAAYrjD,OAAO9J,GAExBD,KAAK+mF,UAAU3mF,UAAUC,IAAI,eAC7BL,KAAKotD,YAAYhtD,UAAUC,IAAI,eAuB1B,eAAe23B,GACpB,MAA0B,cAAnBh4B,KAAK+sB,KAAK5pB,MAAwBnD,KAAKo/F,gBAAgBpnE,IAAW,IAASA,KAAY,GAiCzF,iBACL,MAAMnsB,EAAS7L,KAAK0qD,mBAAmBkqC,cAAc50F,KAAK+sB,KAAK9lB,QACzDtC,EAAQkH,aAAM,EAANA,EAAQ4oG,aAItB,GAHAz0G,KAAK6xG,kBAAkB3nF,UAAY,IAAMvlB,GAAS,IAClD3E,KAAK6xG,kBAAkBzxG,UAAUkM,OAAO,aAActM,KAAK8rG,wBAAwB9lE,iBAAiBhmC,KAAK+sB,KAAK9lB,QAAQ,IAEnHjH,KAAK+xG,sBAA2C,SAAnB/xG,KAAK+sB,KAAK5pB,KAAiB,CACzD,MAAMuxG,KAAgB7oG,aAAM,EAANA,EAAQ8oG,uBAC9B30G,KAAK+xG,qBAAqB7nF,UAAYwqF,EAAc,GAAM7oG,EAA4B,sBAAI,GAC1F7L,KAAK8xG,aAAa1xG,UAAUkM,OAAO,aAAcooG,IAI9C,YACL,IAAI10G,KAAK+sB,KAAK9lB,QAAUjH,KAAK4uG,WAAgC,cAAnB5uG,KAAK+sB,KAAK5pB,KAAsB,OAE1E,MAAM,MAACjB,EAAK,SAAE20C,GAAY,OAAA+qD,GAAA,GAAa5hG,KAAK0jG,kBAAkB3hG,OAE9D,IAAIqxG,GACDlxG,EAAMC,QAAUnC,KAAKmiG,gBACtBiR,EAAQ,CACNhsG,EAAG,eACH0hB,KAAM,cAAM,GAAQ9oB,KAAK6rG,kBAAkB32D,iBAC3C9wC,QAASlC,EACT20C,SAAUA,EAAS10C,OAAS00C,OAAWnyC,EACvC4S,OAAQ,CACNs9F,WAAY50G,KAAKyuG,WAEnB3iB,gBAAiB9rF,KAAKmiG,eAI1BniG,KAAK+oF,iBAAiB8rB,UAAU70G,KAAK+sB,KAAK9lB,OAAQjH,KAAK+sB,KAAKjiB,SAAUsoG,GAGjE,UAGLpzG,KAAK+N,eAAeO,YAGf,QAAQwmG,GAAY,GACrB90G,KAAK+sB,KAAK9lB,SACZjH,KAAK+mF,UAAUpkF,MAAMC,QAAU,OAC/B5C,KAAKwwG,UAAUpwG,UAAUC,IAAI,SAG/BonD,KAEAznD,KAAKgsG,aAAe,EAEjBhsG,KAAK4nF,eACN5nF,KAAK+0G,aACLD,GAAa90G,KAAKqiG,eAIf,SAAS+Q,EAAwB4B,GAAa,EAAMjT,GAAQ,GACjE,SAAKA,IAAU,OAAA3B,GAAA,GAAapgG,KAAK4nF,eAAqC,cAAnB5nF,KAAK+sB,KAAK5pB,QAEzDiwG,IACFA,EAAQpzG,KAAK+oF,iBAAiBksB,SAASj1G,KAAK+sB,KAAK9lB,OAAQjH,KAAK+sB,KAAKjiB,YAyBlE9K,KAAK0jG,kBAAkBxhG,QAAUkxG,EAAM8B,UAAYl1G,KAAKmiG,eAAiBiR,EAAMtnB,mBAE/EkpB,GACDh1G,KAAKqiG,cAGPriG,KAAKyuG,UAAY2E,EAAM97F,OAAOs9F,WAC3BxB,EAAMtnB,iBACP9rF,KAAK8tF,iBAAiBslB,EAAMtnB,iBAG9B9rF,KAAKm1G,cAAc/B,EAAM8B,SAAUF,EAAYA,IACxC,IAlCAjT,IAIE/hG,KAAK+sB,KAAK9sB,UAAUG,UAAUuR,SAAS,qBACxC3R,KAAK0Q,IAGP1Q,KAAK0jG,kBAAkB0R,UAAU5iG,YAAc,GAC/CxS,KAAK0jG,kBAAkByP,aAAY,IAEjCnzG,KAAK+sB,KAAKC,QAAQ08D,sBAAwB7mF,QAAQoD,WAA4BpF,KAAK,KACnF,aAAQ,KACNb,KAAK2I,sBAKJ,IAmBN,mBACL,MAAM1B,EAASjH,KAAK+sB,KAAK9lB,QAEnB,gBAACopG,EAAe,aAAE4B,EAAY,cAAEE,EAAa,SAAEtS,EAAQ,UAAE2Q,EAAS,UAAEzpB,GAAa/mF,KACvF+mF,EAAUpkF,MAAMC,QAAU,GAE1B,MAAMu1B,EAAcn4B,KAAKs7E,gBAAgBnjD,YAAYlxB,GAmBrD,GAlBAupG,EAAUpwG,UAAUkM,OAAO,eAAgB6rB,GAC3Cq4E,EAAUpwG,UAAUuB,OAAO,QAExB3B,KAAK6xG,mBACN7xG,KAAKmuF,iBAGe,WAAnBnuF,KAAK+sB,KAAK5pB,MACX4jF,EAAU3mF,UAAUkM,OAAO,UAAWtM,KAAKs7E,gBAAgBkhB,cAAcv1F,IAIxEopG,IACDrwG,KAAKuxG,0BAA2B,EAChClB,EAAgBa,YAAY9zF,cAAc1Z,kBAAiB,GAC3D2sG,EAAgBnoF,WAAW9K,cAAc1Z,kBAAiB,IAGzDuuG,EAAc,CACfA,EAAa7xG,UAAUC,IAAI,QAC3B,MAAMusB,EAAa5sB,KAAK+sB,KAAKC,QAAQC,gBACrCjtB,KAAK0qD,mBAAmBivC,qBAAqB1yF,GAAQpG,KAAKoH,IACpD2kB,KACJqlF,EAAa7xG,UAAUkM,OAAO,QAASrE,EAAK9F,UAI7CgwG,GACDA,EAAclmE,QAAQhlC,GAGrB44F,GACDA,EAASgB,UAAU55F,GAGlBjH,KAAK4nF,aACN5nF,KAAKsuF,qBACGtuF,KAAKo0G,mBACVp0G,KAAKs7E,gBAAgBkhB,cAAcx8F,KAAK+sB,KAAK9lB,SAC9CjH,KAAKo0G,iBAAiBrqG,OAAO,eAAK,wBAClC/J,KAAKs0G,qBAAqBvqG,OAAO,eAAK,0BAEtC/J,KAAKo0G,iBAAiBrqG,OAAO,eAAK,yBAClC/J,KAAKs0G,qBAAqBvqG,OAAO,eAAK,2BAKrC,qBACL,MAAM,UAACg9E,EAAS,WAAEwrB,EAAU,aAAE3qB,GAAgB5nF,MACxC,OAACiH,EAAM,SAAE6D,GAAY9K,KAAK+sB,KAC1BgoE,EAAW/0F,KAAK0qD,mBAAmBm8B,cAAc5/E,EAAQ6D,GAC/Di8E,EAAU3mF,UAAUC,IAAI,iBACxB0mF,EAAU3mF,UAAUkM,OAAO,aAAcyoF,GACpChO,EAAUn9C,WACfm9C,EAAU3mF,UAAUuB,OAAO,iBAE3B,MAAMqJ,EAAI,UAAK01F,QAAQ1wF,IAAI43E,GAC3B,GAAG58E,EAAG,CACJ,IAAIuD,EAEFA,EADCzD,EACK,UACE9K,KAAKs7E,gBAAgBnjD,YAAYlxB,GACnC,mBACEjH,KAAK0qD,mBAAmB2qD,mBAAmBpuG,GAC7C,kBAEA,UAGL+D,EAAEuD,MAAQA,IACXvD,EAAEuD,IAAMA,EACRvD,EAAE22B,UAIN,MAAMpf,EAAUviB,KAAKoyG,kBAAkBxqG,OAAOiT,IAC5C,MAAMqH,EAAOrH,EAAO9F,OAAO9N,EAAQ6D,GAEnC,OADA+P,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAAS4V,GAClCA,IAGL6yE,GAGFnN,EAAaxkF,aAAa,kBAAmB,QAC7CpD,KAAK+iF,cAASr+E,GAAW,GAErBkjF,EAAa3jF,WACfjE,KAAK0jG,kBAAkByP,eANzBvrB,EAAaxjD,gBAAgB,mBAU/BmuE,EAAW7/E,gBAAgB,YAAanQ,EAAQpgB,QAChDowG,EAAWnyG,UAAUkM,OAAO,gBAAiBiW,EAAQpgB,QACrDnC,KAAK+uG,gBAGC,0BACN,MAAMuG,EAAgBt1G,KAAK0jG,kBAC3B1jG,KAAK0jG,kBAAoB,IAAI,IAAW,CACtC92F,YAAa,UACbtD,KAAM,UACN8F,SAAS,IAGXpP,KAAK0jG,kBAAkB3hG,MAAM3B,UAAUoD,QAAQ,oBAAqB,uBACpExD,KAAK0jG,kBAAkB0R,UAAUh1G,UAAUoD,QAAQ,oBAAqB,uBACxExD,KAAK4nF,aAAe5nF,KAAK0jG,kBAAkB3hG,MAC3C/B,KAAK4nF,aAAaxnF,UAAUC,IAAI,gBAChCL,KAAKu1G,8BAEF,MACD,OAAAC,GAAA,GAA6Bx1G,KAAK4nF,cAGjC0tB,GACDA,EAAcvzG,MAAM2nB,YAAY1pB,KAAK0jG,kBAAkB3hG,OACvDuzG,EAAcF,UAAU1rF,YAAY1pB,KAAK0jG,kBAAkB0R,YAE3Dp1G,KAAK4xG,sBAAsB7nG,OAAO/J,KAAK0jG,kBAAkB3hG,MAAO/B,KAAK0jG,kBAAkB0R,WAInF,8BACNp1G,KAAK+N,eAAe1N,IAAIL,KAAK4nF,aAA7B5nF,CAA2C,UAAYiC,IACrD,MAAMsM,EAAMtM,EAAEsM,IACd,GAAG,OAAAknG,GAAA,GAAsBxzG,GACvB,OAAAyb,EAAA,GAAYzb,GACZjC,KAAK+jF,mBACA,GAAG9hF,EAAEyzG,SAAWzzG,EAAE0zG,QACvB31G,KAAKytG,uBAAuBxrG,QACvB,IAAY,WAARsM,GAA4B,aAARA,KAAwBtM,EAAE6rG,SAGvD,GAFA7rG,EAAE8Y,iBAES,WAARxM,EAAkB,CACnB,MAAMw4D,EAAQ7mE,SAASkoD,cACjBjiB,EAAM56B,OAAOm8C,eAEnBqf,EAAM6uC,SAAS51G,KAAK4nF,aAAaihB,WAAW,IAAM7oG,KAAK4nF,aAAc,GACrE7gB,EAAM8uC,UAAS,GAEf1vE,EAAIyhB,kBACJzhB,EAAI2vE,SAAS/uC,QAEb,OAAAg8B,GAAA,GAAgB/iG,KAAK4nF,gBAKxB,uBACD,YAAiB5nF,KAAK4nF,aAAe3lF,IACnCjC,KAAKwqF,aAAar8E,UAAU,GAE5B,GAAkB7B,QAAO,IACxB,CAACyB,eAAgB/N,KAAK+N,iBA8B3B/N,KAAK+N,eAAe1N,IAAIL,KAAK4nF,aAA7B5nF,CAA2C,QAASA,KAAK+tG,gBACzD/tG,KAAK+N,eAAe1N,IAAIL,KAAK4nF,aAA7B5nF,CAA2C,QAAS,KAClDA,KAAK8uG,sBAGe,SAAnB9uG,KAAK+sB,KAAK5pB,MAAsC,eAAnBnD,KAAK+sB,KAAK5pB,MACxCnD,KAAK+N,eAAe1N,IAAIL,KAAK4nF,aAA7B5nF,CAA2C,UAAW,KACjDA,KAAK+sB,KAAKC,QAAQjiB,WAAW5F,UAAU2X,QACxC9c,KAAK0qD,mBAAmBqrD,eAAe/1G,KAAK+sB,KAAK9lB,OAAQjH,KAAK+sB,KAAKjiB,YAqCpE,cAAc3H,EAAoBkvD,GACvC,MAAM2jD,EAAsE,CAC1EC,KAAM,OACNC,OAAQ,SACRC,UAAW,YACXC,cAAe,gBACfC,UAAW,IAAMn2G,SAASo0B,YAAY,YAAY,EAAO,aACzDwE,KAAMu5B,EAAO,IAAMnyD,SAASo0B,YAAY,cAAc,EAAO+9B,GAAQ,IAAMnyD,SAASo0B,YAAY,UAAU,EAAO,OAGnH,IAAI0hF,EAAY7yG,GACd,OAAO,EAGT,MAAM4mG,EAAUiM,EAAY7yG,GAItBmzG,EAAet2G,KAAKotG,yBACpBmJ,EAAkB,GAuCxB,GAFAA,EAAS5wG,KAAKzF,SAASo0B,YAAY,gBAAgB,EAAO,SAE9C,cAATnxB,EAAsB,CACvB,IAAIqzG,GAAe,EAGnB,MAAM1nE,EAAYvjC,OAAOm8C,eACzB,IAAI5Y,EAAU2nE,YAAa,CACzB,MAAM1vC,EAAQj4B,EAAUq5C,WAAW,GAC7BuuB,EAAM,KAAavzG,GAEnBgjB,EAAO4gD,EAAM4vC,yBACfxwF,EAAKzF,WAA2B8G,QAAQkvF,EAAI9jG,QAAWuT,aAAgB4B,aAAe5B,EAAKqB,QAAQkvF,EAAI9jG,UACzG4jG,GAAe,GAMhBA,EACDD,EAAS5wG,KAAKzF,SAASo0B,YAAY,YAAY,EAAO,WAEtDiiF,EAAS5wG,KAAyB,mBAAd,EAA2BokG,IAAY7pG,SAASo0B,YAAYy1E,GAAS,EAAO,YAGlGwM,EAAS5wG,KAAyB,mBAAd,EAA2BokG,IAAY7pG,SAASo0B,YAAYy1E,GAAS,EAAO,OAWlG,OARAwM,EAAS5wG,KAAKzF,SAASo0B,YAAY,gBAAgB,EAAO,UAG1DgiF,IACGt2G,KAAKwqF,aAAamjB,eACnB3tG,KAAKwqF,aAAamjB,cAAciJ,yBAG3B,EAmKF,cAAcC,EAAoBC,EAA8BC,GAAW,GAChF,MAAO70G,MAAO80G,EAAS,SAAEhO,EAAQ,SAAEnyD,GAAYsxD,GAAsBnoG,KAAK4nF,cACpE1iC,EAAM8jD,GAAY,EAAIA,EAAWgO,EAAU70G,OAC3CslB,EAASuvF,EAAU/N,OAAO,EAAG/jD,GAC7BqtB,EAASykC,EAAU/N,OAAO/jD,GAE1B19B,EAAUuvF,EAAWtvF,EAAO7U,MAAM,GAAUqkG,uBAAyB,KAErEC,EAAa1vF,EAAUA,EAAQlL,OAASkL,EAAQ,GAAGrlB,OAASqlB,EAAQ,GAAGrlB,QAAUslB,EAAOtlB,OAExFg1G,EADY1vF,EAAOhkB,MAAM,EAAGyzG,GACLL,EAAatkC,EAGpC6kC,EAAc,IAAkBhJ,cAAc4I,GACpD,IAAkB7I,cAAct3D,EAAUugE,GAG1C,MAAMC,EAAeP,EAAez0G,KAAKP,IAAIg1G,EAAa30G,OAAQ00G,EAAW10G,QAAU00G,EAAW10G,OAC5Fm1G,EAA+B,GAClCR,IACDQ,EAAY3xG,KAAKmxG,GACjBA,EAAazmF,OAAS6mF,GAIxB,MAAM1lF,EAAOhK,EAAU6vF,EAAe7vF,EAAQ,GAAGrlB,OAASk1G,EAC1DxgE,EAASvwC,QAAQgrD,IACZA,EAAOjhC,QAAU6mF,IAClB5lD,EAAOjhC,QAAUmB,KAIrB,IAAkB28E,cAAct3D,EAAUygE,GAEqB,CAC7D,MAAMC,EAAgD,CACpDnwG,EAAG,qBACHipB,OAAQ6mF,EAAaG,EACrBl1G,OAAQ,GAGV,IAAIq1G,EAAqB,EACzB,IAAI,IAAIr1G,EAAS00C,EAAS10C,OAAQq1G,EAAqBr1G,IAAUq1G,EAAoB,CAEnF,GADe3gE,EAAS2gE,GACdnnF,OAASknF,EAAYlnF,OAC7B,MAIJwmB,EAASpyC,OAAO+yG,EAAoB,EAAGD,GAKzC,MAAMr1G,EAAQ,IAAkBkqE,cAAc+qC,EAAU,CAACtgE,aACzD72C,KAAK0jG,kBAAkBhgG,iBAAiBxB,GAAO,GAE/C,MAAMu1G,EAAQz3G,KAAK4nF,aAAa/3E,cAAc,iBAC3C4nG,KC39CQ,SAAoBtxF,GAGjC,MAAMuxF,EAAevxF,EAGrB,GAAqB,KAFrBA,EAAOA,EAAKwxF,iBAEJx5B,SAAgB,CACtB,MAAMy5B,EAAU13G,SAAS23G,eAAe,IACxC1xF,EAAKzF,WAAWC,aAAai3F,EAAUF,EAAa5+C,aAAe4+C,EAAa5+C,YAAYqlB,WAAah4D,EAAKg4D,SAA0Bu5B,EAAa5+C,YAA5B4+C,GACzHvxF,EAAOyxF,EAGT,GAAGrsG,OAAOm8C,cAAgBxnD,SAASkoD,YAAa,CAC9C,MAAM2e,EAAQ7mE,SAASkoD,cACpBjiC,IACD4gD,EAAM+wC,cAAc3xF,GACpB4gD,EAAMgxC,WAAW5xF,GACjB4gD,EAAM6uC,SAASzvF,EAAMA,EAAKi4D,UAAUj8E,SAGtC4kE,EAAM8uC,UAAS,GAEf,MAAM1vE,EAAM56B,OAAOm8C,eACnBvhB,EAAIyhB,kBACJzhB,EAAI2vE,SAAS/uC,IDo8CXixC,CAAWP,GACXA,EAAM91G,UAIR3B,KAAK+tG,iBAWC,kBAAkB7rG,EAAgB8mG,EAAmBnyD,GAG3D,QAAanyC,IAAVxC,EAAqB,CACtB,MAAMkc,EAAI+pF,GAAsBnoG,KAAK0jG,kBAAkB3hG,OAAO,GAC9DG,EAAQkc,EAAElc,MACV8mG,EAAW5qF,EAAE4qF,SACbnyD,EAAWz4B,EAAEy4B,SAOf,IAJiB,IAAdmyD,IACDA,EAAW9mG,EAAMC,aAGHuC,IAAbmyC,EAAwB,CACzB,MAAMohE,EAAS,IAAkB/J,cAAchsG,EAAO20C,GAAU,GAChEA,EAAW,IAAkBs3D,cAAct3D,EAAU,IAAkBu3D,cAAc6J,IAKvF,GAFA/1G,EAAQA,EAAM+mG,OAAO,EAAGD,GAErBhpG,KAAKkzG,gBAAkBhxG,EACxB,OAGFlC,KAAKkzG,cAAgBhxG,EAErB,MAAMslB,EAAUtlB,EAAM0Q,MAAM,GAAUqkG,uBACtC,IAAIiB,EACJ,GAAG1wF,EAAS,CACV,MAAM8pC,EAASza,EAAS,GAExB,IAAIjsC,EAAQ4c,EAAQ,GACpB,MAAM2hF,EAAYv+F,EAAM,GAExB,GAAG5K,KAAK0yG,gBACN9pG,EAAA,QAAUo2B,SAASkb,SAASi+D,SAC5Bn4G,KAAK0qD,mBAAmBm8B,cAAc7mF,KAAK+sB,KAAK9lB,OAAQjH,KAAK+sB,KAAKjiB,SAAU,kBAC9D,wBAAdwmD,aAAM,EAANA,EAAQlqD,IAA8BkqD,EAAOnvD,SAAWD,EAAMC,SAAWmvD,EAAOjhC,OAChF6nF,EAAcl4G,KAAK0yG,eACnB1yG,KAAK0yG,eAAe0F,cAAcl2G,QAC7B,GAAiB,MAAdinG,EAAmB,CAC3B,MAAMiB,EAAWpqG,KAAK+sB,KAAKjiB,SAAW9K,KAAKgpF,sBAAsB/F,mBAAmBjjF,KAAK+sB,KAAKjiB,eAAYpG,EACvG1E,KAAK6yG,eAAenH,WAAW9gG,EAAO5K,KAAK+sB,KAAK9lB,OAAOo2B,SAAW,KAAer9B,KAAK+sB,KAAK9lB,OAAQmjG,KACpG8N,EAAcl4G,KAAK6yG,qBAEZrrF,EAAQ,IAAoB,MAAd2hF,EAIfvgG,EAAA,QAAUo2B,SAASmb,MAAMg+D,UACjCvtG,EAAQA,EAAMpH,QAAQ,OAAQ,IAC1BtB,EAAM0Q,MAAM,mBAAsB1Q,EAAM0Q,MAAM,uBAAwBhI,IACxEstG,EAAcl4G,KAAK2yG,YACnB3yG,KAAK2yG,YAAYjH,WAAW9gG,EAAOu+F,KAPlCnpG,KAAK4yG,eAAelH,WAAW9gG,EAAO5K,KAAK+sB,KAAK9lB,UACjDixG,EAAcl4G,KAAK4yG,gBAWzBsF,EAAcl4G,KAAKq4G,wBAAwBn2G,EAAOg2G,GAElDl4G,KAAKyyG,6BAA6B7K,iBAAiBsQ,GAG7C,wBAAwBh2G,EAAeg2G,GAC7C,IAAII,GAAkB,EAEtB,IAAIJ,EAAa,CACf,MAAMK,EAAcr2G,EAAM0Q,MAAM,4BAChC,GAAG2lG,EAAa,CACd,MAAM/hF,EAAW+hF,EAAY,GACvB3tG,EAAQ1I,EAAMuB,MAAM80G,EAAY,GAAGp2G,QACzCm2G,EAAkBC,EAAY,GAAGp2G,SAAWD,EAAMC,OAElD+1G,EAAcl4G,KAAK8yG,aAEf9yG,KAAKw4G,aAKP,aAAcx4G,KAAKw4G,aAAc,QAAQ,EAAM,MAJ/Cx4G,KAAKw4G,aAAe,EAAW,8CAA+C,CAAC7qG,UAAU,IACzF,aAAa3N,KAAKw4G,cAAc,GAChCx4G,KAAK4xG,sBAAsB9gG,cAAc6P,aAAa3gB,KAAKw4G,aAAcx4G,KAAK4xG,sBAAsB94C,cAKtG94D,KAAK8yG,aAAapH,WAAW1rG,KAAK+sB,KAAK9lB,OAAQuvB,EAAU5rB,GAAO/J,KAAK,EAAEokC,OAAMqd,oBACxEg2D,GAAmBrzE,EAAK49C,yBACzB7iF,KAAK4nF,aAAax7E,QAAQqsG,kBAAoBxzE,EAAK49C,wBAGrDvgC,EAAczhD,KAAK,KACjB,aAAcb,KAAKw4G,aAAc,QAAQ,EAAO,SAEjDhsG,MAAMma,GAAA,IAcb,OAVI2xF,UACKt4G,KAAK4nF,aAAax7E,QAAQqsG,kBAGhCP,IAAgBl4G,KAAK8yG,cACnB9yG,KAAKw4G,cACN,aAAcx4G,KAAKw4G,aAAc,QAAQ,EAAO,KAI7CN,EAgMD,yBACN,GAAGl4G,KAAK04G,qBAAsB,OAC9B14G,KAAK04G,sBAAuB,EAE5B,MAAM/J,EAAa3uG,KAAK2uG,WACxB3uG,KAAKqiG,cACLriG,KAAK+uG,gBACL,IAAI/0E,GAAW,EACD,IAAI,GAAa,YAAKh6B,KAAKkvG,YAAa,KACpDl1E,GAAW,IAGPh5B,iBAAiB,QAAS,KAC9BhB,KAAK04G,sBAAuB,EAExB1+E,GACF20E,MAKC,WAAWgK,GAAc,EAAMC,GAAY,EAAMC,EAAa,IACnE,GAAG34G,SAASgoF,gBAAkBloF,KAAK4nF,cAAgB,oBAAkB,CACnE,MAAM58E,EAAI9K,SAASC,cAAc,SACjCD,SAASiW,KAAKpM,OAAOiB,GACrB,OAAA8tG,GAAA,GAAqB9tG,GACrBhL,KAAK0jG,kBAAkBhgG,iBAAiBm1G,GACxC,OAAAC,GAAA,GAAqB94G,KAAK4nF,cAC1B58E,EAAErJ,cAEF3B,KAAK0jG,kBAAkBhgG,iBAAiBm1G,GAGvC,wBAOD74G,KAAKssG,gBAAkB,GACvBtsG,KAAKusG,YAAYpqG,OAAS,EAC1BnC,KAAKwsG,gBAAgBrqG,OAAS,EAC9BnC,KAAKysG,gBAAkB,IAGzB,IAAI93F,GAAM,EACPgkG,IACDhkG,EAAM3U,KAAK+iF,cAASr+E,GAAW,KAG7BiQ,GAAOikG,GACT54G,KAAK+tG,iBAIF,eACL,OAAO,OAAA3N,GAAA,GAAapgG,KAAK4nF,cAGpB,gBACL,IAAIv6E,EAEJ,MAAM+yF,EAAepgG,KAAKogG,eAEP/yF,EAAhBrN,KAAK4uG,UAAkB,QACjB5uG,KAAK2sG,UAAY3sG,KAAKwsD,YAAc4zC,GAAgBpgG,KAAKkvG,WAAsC,cAAnBlvG,KAAK+sB,KAAK5pB,KAAuB,WAAa,OACvH,SAEZ,CAAC,OAAQ,SAAU,OAAQ,YAAYmD,QAAQ0E,IAC7ChL,KAAKgzG,QAAQ5yG,UAAUkM,OAAOtB,EAAGqC,IAASrC,KAGzChL,KAAKiyG,cACNjyG,KAAKiyG,aAAa7xG,UAAUkM,OAAO,OAAQ8zF,GAG1CpgG,KAAKkyG,sBACNlyG,KAAKkyG,qBAAqB9xG,UAAUkM,OAAO,OAAQ8zF,GAIhD,cAAc2U,GAAa,EAAMgE,GAChB,cAAnB/4G,KAAK+sB,KAAK5pB,MACXnD,KAAK0qD,mBAAmBqrD,eAAe/1G,KAAK+sB,KAAK9lB,OAAQjH,KAAK+sB,KAAKjiB,UAAU,GAG/E9K,KAAKs/F,kBAAe56F,EACpB1E,KAAK4gG,gBAAal8F,EAElB,MAAMxC,EAAQlC,KAAK0jG,kBAAkBxhG,MACpB,IAAkBksG,cAAclsG,GACkB0F,OAAO0pD,GAAuB,uBAAbA,EAAOlqD,GAC7Ed,QAAQgrD,IACpB,MAAMnX,EAAQ,aAAoBmX,EAAO0nD,SACzCh5G,KAAK29E,gBAAgBs7B,gBAAgB9+D,KAGpC46D,IACD/0G,KAAK+rG,QAAU,UACR/rG,KAAKyuG,UACZzuG,KAAKksG,gBAAkB,KACvBlsG,KAAK+0G,eAGJgE,GAAchE,IACf/0G,KAAKqiG,cAGPriG,KAAK+uG,gBAGA,YAAYhN,GAAQ,GACzB,MAAM,UAAC6M,EAAS,KAAE7hF,GAAQ/sB,KAC1B,GAAiB,cAAd+sB,EAAK5pB,OAAyB4+F,IAAU6M,EAEzC,YADA5uG,KAAKo/F,kBAIP,MAAM,SAACt0F,EAAQ,OAAE7D,GAAU8lB,GACrB,aAACo1E,EAAY,UAAEsM,EAAS,WAAE7N,EAAU,aAAEtB,GAAgBt/F,MAEtD,MAACkC,EAAK,SAAE20C,GAAY,OAAA+qD,GAAA,GAAa5hG,KAAK0jG,kBAAkB3hG,OAG9D,GAAG6sG,EAAW,CACZ,MAAMxqG,EAAUpE,KAAKq/F,YACrB,IAAGn9F,EAAMoJ,SAAUlH,EAAQ0O,MAUzB,YAFA,IAAI,GAAoB7L,EAAQ,CAAC2nG,GAAY7hF,EAAK5pB,MAPlDnD,KAAK0qD,mBAAmB20C,YAAYj7F,EAASlC,EAAO,CAClD20C,WACA43D,UAAWA,IAGbzuG,KAAK2I,qBAMCzG,EAAMoJ,SACdtL,KAAK0qD,mBAAmBm5B,SAAS58E,EAAQ/E,EAAO,CAC9C20C,WACAsrD,aAAcA,EACdr3F,SAAUA,EACV2jG,UAAWA,EACXyK,QAASl5G,KAAKsuG,uBAAoB5pG,EAAY1E,KAAKksG,gBACnD5M,aAAcA,EACd5C,OAAQkE,EACRpY,YAAY,IAGdxoF,KAAK2I,eAAc,GAAO,IAK5B,GAAG3I,KAAKkvG,WAAY,CAClB,MAAMA,EAAa,YAAKlvG,KAAKkvG,YAC7B1jG,WAAW,KACT,IAAI,MAAM4gD,KAAc8iD,EACtBlvG,KAAK0qD,mBAAmByuD,gBAAgBlyG,EAAQmlD,EAAWtkC,WAAYonF,EAAW9iD,GAAa,CAC7FswC,OAAQkE,EACRtB,aAAcA,EACd8Z,WAAYp5G,KAAKqwG,iBAAmBrwG,KAAKqwG,gBAAgBY,WAAW7zF,cAAcO,QAClF07F,aAAcr5G,KAAKs5G,uBAInBp3G,GACFlC,KAAK2I,iBAEN,IAMA,wBAAwBzI,EAA+B6hG,GAAQ,EAAOvZ,GAAa,G,MAGxF,MAAM1nD,EAAyB,aAF/B5gC,EAAWF,KAAK49F,eAAe1pF,OAAOhU,IAEhBiD,KAAqB,gBAAqC,QAAlBjD,EAASiD,KAAiB,YAAc,aACtG,OAAGnD,KAAK+sB,KAAK9lB,OAAOw3B,cAAgBz+B,KAAK0qD,mBAAmBm8B,cAAc7mF,KAAK+sB,KAAK9lB,OAAQjH,KAAK+sB,KAAKjiB,SAAUg2B,IAC9G5L,GAx3D4B,uDAy3DrB,GAGa,cAAnBl1B,KAAK+sB,KAAK5pB,MAAyB4+F,IAKnC7hG,IACDF,KAAK0qD,mBAAmBwpD,SAASl0G,KAAK+sB,KAAK9lB,OAAQ/G,EAAU,CAC3D+jG,SAAS,EACT9B,aAAcniG,KAAKmiG,aACnBr3F,SAAU9K,KAAK+sB,KAAKjiB,SACpB4xF,OAAQ18F,KAAK4gG,WACbtB,aAAct/F,KAAKs/F,aACnB9W,WAAYA,QAAc9jF,IAE5B1E,KAAK2I,cAAc6/E,GAAY,GAEV,YAAlBtoF,EAASiD,OACmB,QAA7B,KAAkBokF,mBAAW,SAAEnG,kBAAkBlhF,KAG5C,IAnBPF,KAAKo/F,gBAAgB,IAAMp/F,KAAKomE,wBAAwBlmE,GAAU,EAAMsoF,KACjE,GAwBH,sBACN,MAAM,gBAAC6nB,GAAmBrwG,KAC1B,IAAIqwG,EAAiB,OAAO,EAC5B,MAAMkJ,EAA2BlJ,EAAgBc,YAAY/zF,cAC7D,OAAQm8F,EAAyB57F,SAC/B,OAAA0jB,GAAA,GAAUk4E,EAAyB/nG,MAAO,QAAQpR,UAAUuR,SAAS,QAGjE,qBACN,OAAQ3R,KAAK8wG,sBAeR,mBAAmBjqG,GACxB,MAAMzC,EAA2BpE,KAAK+sB,KAAKg4B,WAAWl+C,GAEtD,IAAI9E,EAAQ,IAAkBqqE,cAAchoE,EAAQA,QAAS,CAACyyC,SAAUzyC,EAAQmtD,gBAChF,MAAM12B,EAAI,KACR,MAAM2+E,EAAgBx5G,KAAK0qD,mBAAmB79B,oBAAoBzoB,OAASM,EAAW,CAACN,EAAQyC,MAC/F7G,KAAKwuG,WAAW,OAAQ3zE,EAAG,eAAK,mBAAoB2+E,EAAez3G,EAAOqC,GAE1EpE,KAAK4uG,UAAY/nG,EACjB7G,KAAKq/F,YAAcj7F,EACnBrC,OAAQ2C,GAEVm2B,IAGK,oBAAoB4+E,GACzB,MAAM5+E,EAAI,KAER,MAAM6+E,EAAc1iG,OAAOm1C,KAAKstD,GAAiBhxG,IAAI2jD,GAAcA,EAAWtkC,YACxE6xF,EAAoB,IAAI91G,IAC9B,IAAI1B,EAAS,EAAGy3G,EAA6B,EAE7CF,EAAYpzG,QAAQ8lD,IAClB,MAAMnkD,EAAOwxG,EAAgBrtD,GAC7BnkD,EAAK3B,QAAQO,I,MACX,MAAMzC,EAA2BpE,KAAK0qD,mBAAmBlxC,iBAAiB4yC,EAAYvlD,KACnE,QAAhB,EAAAzC,EAAQ+1E,gBAAQ,eAAE2e,YAAc10F,EAAQwH,QAAWxH,EAAQ+vE,UAG5DwlC,EAAKt5G,IAAI,IAAM+D,EAAQwH,QAFvB+tG,EAAKt5G,IAAI,IAAM+D,EAAQ+1E,SAAS2e,WAK/B10F,EAAQ0O,OAAS1O,EAAQA,WACxBw1G,IAINz3G,GAAU8F,EAAK9F,SAGjB,MAAM2xD,EAAgB6lD,EAAK75G,KAAO,EAC5B+5G,EAAa,IAAIF,GAAMlxG,IAAIkxG,IAC/B,MAAMx2G,EAAOw2G,EAAK,GAElB,GADAA,EAAOA,EAAKl2G,MAAM,GACN,MAATN,EAAc,CACf,MAAM8D,EAAS0yG,EAAK7xF,WACpB,OAAO7gB,IAAW2B,EAAA,QAAU6O,KAAO,eAAK,8BAAgC,IAAI,KAAU,CAACxQ,SAAQ4E,QAAQ,EAAOioD,kBAAgB9+C,QAE9H,OAAO8+C,EAAgB6lD,EAAKt3F,MAAM,KAAK,GAAKs3F,KAI1C,gBAACtJ,GAAmBrwG,KACb,OAAAqhC,GAAA,GAAUgvE,EAAgBa,YAAY9zF,cAAc5L,MAAO,QACnEpR,UAAUkM,OAAO,QAASstG,GAC/B,MAAMzI,EAAcd,EAAgBc,YAAY/zF,cAAcO,QAC3Di8F,GAA8BzI,EAC/Bd,EAAgBY,WAAW7zF,cAAc1Z,kBAAiB,QAChBgB,IAAlC1E,KAAKuxG,2BACZvxG,KAAKuxG,yBAA2BlB,EAAgBY,WAAaZ,EAAgBnoF,YAAY9K,cAAc1Z,kBAAiB,GAG3H,MAAMo2G,EAAwBzJ,EAAgBnoF,WAAW9K,cAAcO,QAAU,yBAA2B,wBACtG/P,EAAQ,eAAKksG,EAAU,CAAC33G,IAExB43G,EAAe75G,SAASs3B,yBAO9B,IAAIwiF,EAA+BC,EACnC,GAPGJ,EAAW13G,OAAS,EACrB43G,EAAahwG,UAAU,eAAK8vG,GAAY,IAExCE,EAAahwG,OAAO8vG,EAAW,GAAI,eAAK,WAAY,CAACA,EAAW13G,OAAS,KAIjD,IAAvBu3G,EAAYv3G,OAAc,CAC3B,MAAMiqD,EAAastD,EAAY,GACzBzxG,EAAOwxG,EAAgBrtD,GAI7B,GAHA4tD,EAAeh6G,KAAK0qD,mBAAmBlxC,iBAAiB4yC,EAAYnkD,EAAK,IAEzEgyG,IAAmBD,EAAajtB,WAC7BktB,EAAgB,CACjB,MAAMC,EAAYl6G,KAAK0qD,mBAAmBihC,iBAAiBquB,IACxDE,EAAU/3G,SAAWA,GAAU+3G,EAAUzpG,KAAK5J,IAAQoB,EAAKyyB,SAAS7zB,OACrEozG,GAAiB,IAKvB,MAAMhoD,EAAmB/xD,SAASs3B,yBAElC,GAAGyiF,GAA6B,IAAX93G,EAAc,CACjC,MAAM8F,EAAOwxG,EAAgBC,EAAY,IACnCF,EAAgBx5G,KAAK0qD,mBAAmB79B,oBAAoBmtF,OAAct1G,EAAWuD,GAC3FgqD,EAAiBloD,OACfgwG,EALc,KAOdP,QAGFvnD,EAAiBloD,OACf,eAAK,+BAXS,KAadgwG,GAIJ,IAAII,EAAWn6G,KAAKwuG,WAAW,UAAW3zE,EAAGjtB,EAAOqkD,GAEpDo+C,EAAgBqB,WAAWprG,QAAQ,CAACiC,EAAGlE,KACrC,MAAM6Y,EAAO3U,EAAEgV,YACT68F,EAAyB,UAAK1Z,QAAQ1wF,IAAIkN,GAChDk9F,EAAKnsG,KAAO,CAAC5J,EAAM,EAAIq1G,EAAYv3G,OAASy3G,GAC5CQ,EAAKz4E,WAGJ3hC,KAAKyxG,cACNzxG,KAAKyxG,aAAahH,qBAAqB0P,EAAUn6G,KAAK+N,gBAGxD/N,KAAKkvG,WAAauK,GAGpB5+E,IAGK,iBAAiBh0B,GACtB,GAAG7G,KAAKmiG,eAAiBt7F,EACvB,OAGF,IAAIzC,EAAmBpE,KAAK+sB,KAAKg4B,WAAWl+C,GAC5C,MAAMg0B,EAAI,KACR,IAAIw/E,EACa,iBAAdj2G,EAAQgD,GACTizG,EAAc,eAAK,WAEnBr6G,KAAK+sB,KAAK29B,mBAAmB+wB,kBAAkBz7E,KAAK+sB,KAAK9lB,OAAQJ,GAAKhG,KAAMy5G,IACvEt6G,KAAKmiG,eAAiBt7F,IAIzBzC,EAAUk2G,EACO,iBAAdl2G,EAAQgD,EACTpH,KAAKqiG,YAAY,SAEjBxnE,QAIJw/E,EAAc,IAAI,KAAU,CAC1BpzG,OAAQ7C,EAAQwH,OAChBC,QAAQ,IACPmJ,QAGLhV,KAAKwuG,WAAW,QAAS3zE,EAAGw/E,EAAaj2G,GAAYA,EAA4BA,aAASM,EAAWN,GACrGpE,KAAKmiG,aAAet7F,GAEtBg0B,IAGK,YAAY13B,GACM,SAApBnD,KAAKoiG,YAAkC,SAATj/F,GAC/BnD,KAAK+0G,aAGJ5xG,IACDnD,KAAK+rG,QAAU,UACR/rG,KAAKyuG,UACZzuG,KAAKksG,gBAAkB,MAGb,UAAT/oG,IACDnD,KAAKmiG,kBAAez9F,EACpB1E,KAAKkvG,gBAAaxqG,GAGpB1E,KAAK4uG,UAAY5uG,KAAKq/F,iBAAc36F,EACpC1E,KAAKoiG,WAAapiG,KAAK2uG,gBAAajqG,EAEjC1E,KAAK+sB,KAAK9sB,UAAUG,UAAUuR,SAAS,sBACxC5C,EAAA,EAAwB6B,aAAa,gBACrC5Q,KAAK+sB,KAAK9sB,UAAUG,UAAUuB,OAAO,oBACrC3B,KAAK0Q,KAID,IAEN,aAAc1Q,KAAK+sB,KAAK9sB,UADN,sBAC4B,EAAM,IAAK,KACvDD,KAAK+sB,KAAK9sB,UAAUG,UAAUuB,OAFd,wBAMb,cAAcO,EAAeiI,GAAQ,EAAMsB,GAAQ,GACpDvJ,IAAOA,EAAQ,IAEhBiI,EAAOnK,KAAK+0G,YAAW,GAAO,EAAO7yG,GACnClC,KAAK0jG,kBAAkBhgG,iBAAiBxB,GAE7C,aAAQ,KACNuJ,GAAS,OAAAs3F,GAAA,GAAgB/iG,KAAK4nF,cAC9B5nF,KAAK+tG,iBACL/tG,KAAK4nF,aAAaz+C,UAAYnpC,KAAK4nF,aAAan3B,eAI7C,WACLttD,EACAo3G,EACA3sG,EAAyC,GACzCye,EAA4C,GAC5CtqB,EACAqC,GAEA,GAAGpE,KAAKksG,iBAA4B,UAAT/oG,EACzB,OAGU,YAATA,IACDnD,KAAKqiG,YAAYl/F,GACjBnD,KAAKoiG,WAAaj/F,EAClBnD,KAAK2uG,WAAa4L,GAGpB,MAAMC,EAAcx6G,KAAKisG,cAAchsG,UACjCw6G,EAAWD,EAAYzoE,iBAAiB5B,uBACxCuqE,EAAYD,EAASr6G,UAAUuR,SAAS,SAE9C3R,KAAKisG,cAAcyE,QAAQhnF,YAAY1pB,KAAKisG,cAAcyE,QAAU,GAAqB,YAATvtG,EAAqB,OAASA,GAAQ,qBAAsB,CAACwK,UAAU,KACvJ,MAAMwsG,EAAWn2D,GAAUp2C,EAAOye,EAAUjoB,GAkC5C,OAjCGs2G,EACDD,EAAS/wF,YAAYywF,GAErBK,EAAY75F,aAAaw5F,EAAUK,EAAYzoE,kBAG7C/xC,KAAK+sB,KAAK9sB,UAAUG,UAAUuR,SAAS,sBACzC3R,KAAK+sB,KAAK9sB,UAAUG,UAAUC,IAAI,oBAClCL,KAAK0Q,KAQH,cACF3B,EAAA,EAAwBoB,SAAS,CAC/BhN,KAAM,eACNiN,MAAO,KACLpQ,KAAK0uG,yBAKEhqG,IAAV3C,GACD/B,KAAKm1G,cAAcpzG,GAGrByJ,WAAW,KACTxL,KAAK+uG,iBACJ,GAEIoL,GA/qEM,GAAAlD,sBAAwB,yDE3E1B,MAAM,GAenB,YAAYj0G,GAJF,KAAA23G,UAAW,EAanB,YAAW36G,KAAMgD,GAEjB,MAAM,cAAC43G,EAAa,UAAEpxG,GAAaxJ,KACnC46G,EAAc36G,UAAUG,UAAUC,IA9Bf,mBA8BmC,QACtDu6G,EAAchtG,MAAMxN,UAAUC,IAAIw6G,0BAClCD,EAAcvuF,SAASjsB,UAAUC,IAAIw6G,6BACrCD,EAAc/sG,QAAQzN,UAAUC,IAAIw6G,4BAEpC76G,KAAK86G,SAAW56G,SAASC,cAAc,UACvCH,KAAK86G,SAAS16G,UAAUC,IAAIw6G,yBAA2B,UAAUrxG,UAAmB,WAAY,eAEhGxJ,KAAKkgB,QAAUhgB,SAASC,cAAc,OACtCH,KAAKkgB,QAAQ9f,UAAUC,IAAIw6G,4BAC3B,OAAAv9F,GAAA,QAAOtd,KAAKkgB,SAEZlgB,KAAK+6G,aAAe76G,SAASC,cAAc,OAC3CH,KAAK+6G,aAAa36G,UAAUC,IAAIw6G,kCAChC76G,KAAK+6G,aAAahxG,OAAO/J,KAAK86G,UAE9B96G,KAAKkgB,QAAQnW,UAAU5B,MAAMC,KAAKwyG,EAAc36G,UAAU8lB,UAAW/lB,KAAK+6G,cAE1EH,EAAc36G,UAAU8J,OAAO/J,KAAKkgB,SAEpClgB,KAAKg7G,mBAAmBh7G,KAAK86G,UAGxB,mBAAmB/2G,GACxB,YAAiBA,EAAO9B,IACtB,OAAAyb,EAAA,GAAYzb,KAEVjC,KAAK6Q,QAAU7Q,KAAK6Q,UAAY,OAAShO,QAAQoD,SAAQ,IAAOpF,KAAKo6G,IAClEA,GACDj7G,KAAKsM,QAAO,MAGf,CAACyB,eAAgB/N,KAAK+N,iBAGpB,OAAOwxB,GACZ,MAAMs5D,EAAW74F,KAAK46G,cAAc36G,UAAUG,UAAUuR,SAAS,QACjE,QAAYjN,IAAT66B,EACDA,GAAQs5D,OACH,GAAGt5D,IAASs5D,EACjB,OAKF,MAAMqiB,GAAcl7G,KAAK26G,UAAYz2F,EAAA,EAAWC,YAAcob,EAG9Dv/B,KAAK46G,cAAc36G,UAAUG,UAAUkM,OAAO,cAAe4uG,GAC7Dl7G,KAAK46G,cAAc36G,UAAUG,UAAUkM,OAAO,OAAQizB,GAEtDv/B,KAAKgsF,OAAO/rF,UAAUG,UAAUkM,OAAO,qBAAsB4uG,GAC7Dl7G,KAAKgsF,OAAO/rF,UAAUG,UAAUkM,OAAO,aAAatM,KAAKwJ,mBAAoB+1B,GAU7Ev/B,KAAKgsF,OAAOmvB,cACZn7G,KAAKgsF,OAAOovB,gBAGP,KAAKxtG,EAAgDye,EAAmDjoB,GAC7GpE,KAAK46G,cAAc36G,UAAUmM,QAAQnF,OAAS,GAAK7C,EAAQ6C,OAC3DjH,KAAK46G,cAAc36G,UAAUmM,QAAQvF,IAAM,GAAKzC,EAAQyC,IACxD7G,KAAK46G,cAAczuF,KAAKve,EAAOye,EAAUjoB,GACzCpE,KAAKgsF,OAAOovB,iBChGD,MAAM,WAAkB,GAKrC,YAAsBpvB,EAA8Bj/D,EAAsB29B,GACxEznD,MAAM,CACJ+oF,SACAj/D,OACAhf,eAAgBi+E,EAAOj+E,eACvBvE,UAAW,QACXoxG,cAAe,IAAI1uF,GACjB,eACA,CAACte,EAAgDye,KAC/C,OAAA9f,EAAA,GAAevM,KAAK46G,cAAchtG,MAAOA,GACzC,OAAArB,EAAA,GAAevM,KAAK46G,cAAcvuF,SAAUA,KAGhDxb,QAAS,KACP,GAA2BpO,QAE7Bk4G,UAAU,IAhBQ,KAAA3uB,SAA8B,KAAAj/D,OAAsB,KAAA29B,qBAmBxE1qD,KAAK46G,cAAcxuF,OAAOzqB,SAE1B,MAAM05G,EAAS,EAAW,mBAAoB,CAAC1tG,UAAU,IACnD2tG,EAAS,EAAW,eAAgB,CAAC3tG,UAAU,IAErD0tG,EAAOp3G,UAAY,yKACnBq3G,EAAOr3G,UAAY,iLAEnB,MAAMs3G,EAAc,CAACx3G,EAAmBi0B,KACtC,YAAiBj0B,EAAO9B,IACtB,OAAAyb,EAAA,GAAYzb,GACZ+1B,KACC,CAACjqB,eAAgB/N,KAAKgsF,OAAOj+E,kBAGlCwtG,EAAYF,EAAQ,KAClB,GAA2Bz2G,aAG7B22G,EAAYD,EAAQ,KAClB,GAA2Bz2G,SAG7B7E,KAAKw7G,SAAW,EAAW,GAAI,CAAC7tG,UAAU,IAC1C3N,KAAKw7G,SAASp7G,UAAUC,IAAI,SAAU,mBAAoB,SAC1Dk7G,EAAYv7G,KAAKw7G,SAAU,KACzB,GAA2BlvG,WAE7BtM,KAAKkgB,QAAQtB,QAAQ5e,KAAKkgB,QAAQL,kBAAmBw7F,EAAQr7G,KAAKw7G,SAAUF,GAE5Et7G,KAAK2hB,eAAiB,IAAI,GAAe3hB,KAAK+N,gBAAgB,GAC9D,MAAM0tG,EAA8Bv7G,SAASC,cAAc,OAC3Ds7G,EAA4Br7G,UAAUC,IAAI,2BAC1Co7G,EAA4B1xG,OAAO/J,KAAK2hB,eAAe1hB,WACvD,MAAMy7G,EAASx7G,SAASC,cAAc,OACtCu7G,EAAOt7G,UAAUC,IAAI,8BACrBL,KAAK2hB,eAAe/B,IAAIxf,UAAUC,IAAI,sBAAuB,UAC7DL,KAAK2hB,eAAe/B,IAAIhB,QAAQ88F,GAChC17G,KAAK2hB,eAAe/B,IAAI7V,OAAO0xG,GAC/Bz7G,KAAK+6G,aAAan8F,QAAQ5e,KAAK2hB,eAAe/B,KAE9C,MAAM+7F,EAAkBz7G,SAASC,cAAc,OAC/Cw7G,EAAgBv7G,UAAUC,IAAI,iCAE9BL,KAAKwpB,aAAe,IAAI,QAAkB9kB,OAAWA,GAAW,GAAM,GACtE1E,KAAKwpB,aAAavpB,UAAUG,UAAUC,IAAI,yBAC1Cs7G,EAAgB5xG,OAAO/J,KAAKwpB,aAAavpB,WACzCD,KAAKkgB,QAAQS,aAAag7F,EAAiB37G,KAAK+6G,cAEhD/6G,KAAKgsF,OAAOj+E,eAAe1N,IAAIuI,EAAA,QAA/B5I,CAA0C,aAAc,EAAEiU,MAAK7P,UAAS0O,YACtE,IAAIlF,EAA6Bye,EACjB,UAAbpY,EAAI9Q,MAAiC,UAAb8Q,EAAI9Q,MAC7ByK,EAAQ,IAAI,KAAU,CAAC3G,OAAQ7C,EAAQwH,SAASoJ,QAGhDqX,EAAW,aAAmBjoB,EAAQ0kB,QAEtClb,EAAQqG,EAAIkV,YAAclV,EAAImV,SAC9BiD,EAAWpY,EAAI2U,gBAAkB,eAAK,uBAGxC5oB,KAAKwpB,aAAalU,SAASxC,GAE3B9S,KAAKmsB,KAAKve,EAAOye,EAAUjoB,GAC3BpE,KAAKw7G,SAASp7G,UAAUC,IAAI,aAC5BL,KAAKsM,QAAO,KAGdtM,KAAKgsF,OAAOj+E,eAAe1N,IAAIuI,EAAA,QAA/B5I,CAA0C,cAAe,KACvDA,KAAKw7G,SAASp7G,UAAUuB,OAAO,eAGjC3B,KAAKgsF,OAAOj+E,eAAe1N,IAAIuI,EAAA,QAA/B5I,CAA0C,aAAc,KACtDA,KAAKsM,QAAO,MCrHlB,IAAKsvG,IAAL,SAAKA,GACH,kBACA,kBACA,sBACA,mBACA,mBALF,CAAKA,QAAW,KAYD,MAAMC,GAArB,cAYU,KAAAC,SAAW,CAACvhG,EAAWE,EAAW/Z,EAAeC,EAAgBk0C,IAChE,IAAIt6B,KAAKE,EAAIo6B,KAAUA,KAAUA,WAAgBn0C,OAAWC,EAAS,EAAIk0C,KAAUA,KAAUA,YAAiBn0C,OAG/G,KAAAq7G,YAAc,CAAC5sG,EAAY6sG,EAAmBr3G,KAGpD,IAAI+a,EAAI,GAKJ,GAAa,IAAV/a,EACL+a,EAAI1f,KAAK87G,SAAS,EAAG,EA5Bb,EA4BuBE,EARlB,GAQuCh8G,KAAK87G,SAAS,EAAGE,EAAYC,EA5BzE,EA4ByFD,EARpF,QAUb,IAAI,IAAIhxG,EAAI,EAAGA,EAAIrG,IAASqG,EAC1B0U,GAAK1f,KAAK87G,SAAS,GAAIE,EAhCnB,GAgCsChxG,EA/BpC,EA+B8CgxG,EAXzC,GAyBf,OAVIh8G,KAAKk8G,WACPl8G,KAAKk8G,SAAWh8G,SAASskB,gBAAgB,6BAA8B,YACvExkB,KAAKm8G,KAAOj8G,SAASskB,gBAAgB,6BAA8B,QAEnExkB,KAAKk8G,SAASnyG,OAAO/J,KAAKm8G,OAG5Bn8G,KAAKk8G,SAAS/sG,GAAKA,EACnBnP,KAAKm8G,KAAK13F,eAAe,KAAM,IAAK/E,GAE7B1f,KAAKk8G,UAGN,KAAAE,aAAe,CAACz3G,EAAe2X,KACrC,IAAI0/F,EAaJ,OAZGr3G,GAAS,EACVq3G,EAAYJ,GAAYS,IACN,IAAV13G,EACRq3G,EAAYJ,GAAYU,IACN,IAAV33G,EACRq3G,EAAYJ,GAAYW,MACN,IAAV53G,EACRq3G,EAAYJ,GAAYY,KAChB73G,EAAQ,IAChBq3G,EAAYJ,GAAYa,MAGnBT,GAGD,KAAAU,cAAgB,CAAC/3G,EAAe2X,KACtC,IAAIqgG,EAaJ,OAZGh4G,GAAS,EACVg4G,EAAaf,GAAYS,IACP,IAAV13G,EACRg4G,EAAaf,GAAYU,IACP,IAAV33G,EACRg4G,EAAaf,GAAYW,MACP,IAAV53G,EACRg4G,EAAaf,GAAYY,KACjB73G,EAAQ,IAChBg4G,EAAaf,GAAYa,MAGpBE,GAGD,KAAAC,kBAAoB,CAACtgG,EAAe0/F,EAAmBr3G,IAChD,IAAVA,EACM,EACW,IAAVA,EACA2X,EAAY0/F,EAvFd,EAuFU,EAGL,IAAVr3G,EACG2X,EAEgB,IAAVA,EACD0/F,EA9FH,EAiGa,EAAZA,EAAgBC,EAAU,EALxB,GAODD,EAnGF,GAmGqB1/F,EAIvB,KAAAugG,mBAAqB,CAACvgG,EAAe3X,EAAeq3G,EAAmBc,IAC1En4G,GAAS,GAIT2X,GAAS,EAHH,EAKCA,GAAU3X,EAAQ,EACnBm4G,EAAclB,GAAYS,IAAML,GAIjC1/F,EAAQ,GAAK0/F,EAnHb,EAmHyB1/F,EAI3B,KAAAygG,eAAiB,CAACp4G,EAAeq3G,IAChCr3G,GAAS,EAAIi3G,GAAYS,IAAML,EAAYr3G,EAxH1C,GAwHyDA,EAAQ,GAGpE,OAAOA,EAAe2X,GAS3B,GARItc,KAAKosB,SACPpsB,KAAKosB,OAASlsB,SAASC,cAAc,OACrCH,KAAKosB,OAAOhsB,UAAUC,IA5HT,yBA8HbL,KAAKkgB,QAAUhgB,SAASC,cAAc,OACtCH,KAAKosB,OAAOriB,OAAO/J,KAAKkgB,UAGb,IAAVvb,EAOD,OANG3E,KAAK2E,QAAUA,IAChB3E,KAAKkgB,QAAQ1W,UAAY,kCACzBxJ,KAAKosB,OAAOhsB,UAAUuB,OAAO,8BAC7B3B,KAAKkgB,QAAQjc,UAAYjE,KAAKkgB,QAAQvd,MAAMuT,QAAU,IAGjDlW,KAAKosB,OAGd,MAAM4vF,EAAYh8G,KAAKo8G,aAAaz3G,EAAO2X,GACrCqgG,EAAa38G,KAAK08G,cAAc/3G,EAAO2X,GACvCwgG,EAAc98G,KAAK+8G,eAAep4G,EAAOq3G,GAEzCgB,EAAa,YAAYr4G,EACzBu3G,EAAWl8G,KAAK+7G,YAAYiB,EAAYhB,EAAWr3G,GAEnDs4G,EAAiBj9G,KAAK48G,kBAAkBtgG,EAAO0/F,EAAWr3G,GAC1Du4G,EAAkBl9G,KAAK68G,mBAAmBvgG,EAAO3X,EAAOq3G,EAAWc,GAwCzE,OAtCA98G,KAAKosB,OAAOhsB,UAAUkM,OAAO,6BAAsB3H,EAAQ,GAExD2X,GAAS,GACVtc,KAAKosB,OAAOhsB,UAAUC,IAAI,eAC1BL,KAAKosB,OAAOhsB,UAAUuB,OAAO,aACrB2a,GAAU3X,EAAQ,GAC1B3E,KAAKosB,OAAOhsB,UAAUC,IAAI,YAC1BL,KAAKosB,OAAOhsB,UAAUuB,OAAO,gBAE7B3B,KAAKosB,OAAOhsB,UAAUC,IAAI,WAAY,eAGxCL,KAAKkgB,QAAQ1W,UAAY,gCACzBxJ,KAAKkgB,QAAQvd,MAAMuT,QAAU,mBAAmB8mG,2BAAoCF,+BAAyCI,QAEzHl9G,KAAKukB,MACPvkB,KAAKukB,IAAMrkB,SAASskB,gBAAgB,6BAA8B,OAClExkB,KAAKukB,IAAIE,eAAe,KAAM,SAAU,KACxCzkB,KAAKukB,IAAIE,eAAe,KAAM,QAAS,KAEvCzkB,KAAKm9G,KAAOj9G,SAASskB,gBAAgB,6BAA8B,QACnExkB,KAAKm9G,KAAKpzG,OAAOmyG,GAEjBl8G,KAAKukB,IAAIxa,OAAO/J,KAAKm9G,MAErBn9G,KAAKo9G,KAAOl9G,SAASC,cAAc,OACnCH,KAAKo9G,KAAKh9G,UAAUC,IAAI,+BAGtBL,KAAKukB,IAAIzT,eACX9Q,KAAKkgB,QAAQnW,OAAO/J,KAAKukB,IAAKvkB,KAAKo9G,MAGrCp9G,KAAKo9G,KAAKz6G,MAAMuT,QAAU,WAAWymG,8BAAuCM,QAE5Ej9G,KAAK2E,MAAQA,EACb3E,KAAKsc,MAAQA,EAENtc,KAAKosB,Q,2SChLhB,MAAMixF,GAOJ,cAHA,KAAAvpF,KAAgF,GAI9E9zB,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUuJ,UAAY6zG,GAAc/0E,WAGpC,OAAOhsB,EAAeghG,GAAe,GAC1C,GAAGt9G,KAAK8zB,KAAKxX,GAAQ,OAAOtc,KAAK8zB,KAAKxX,GAAOtH,QAC7C,MAAM6c,EAAM3xB,SAASC,cAAc,OAC7Bk5D,GAAWriD,OAAOm1C,KAAKnsD,KAAK8zB,MAAM3xB,SAAWm7G,EAInD,OAHAzrF,EAAIroB,UAAY6zG,GAAc/0E,WAAa,QAAU+wB,EAAU,GAAK,mBACpEr5D,KAAK8zB,KAAKxX,GAAS,CAACtH,QAAS6c,EAAK6N,KAAK,GACvC1/B,KAAKC,UAAU8J,OAAO8nB,GACfA,EAGF,SAASvV,GACVtc,KAAK8zB,KAAKxX,KACdtc,KAAK8zB,KAAKxX,GAAOtH,QAAQrT,gBAClB3B,KAAK8zB,KAAKxX,IAGZ,UAAUihG,GACZv9G,KAAKgN,cAAcA,aAAahN,KAAKgN,cACxChN,KAAKgN,aAAezB,OAAOC,WAAW,KACpC,IAAI,MAAMR,KAAKhL,KAAK8zB,MACd9oB,IAAMuyG,GACVv9G,KAAKw9G,UAAUxyG,IAEhBqyG,GAAcI,UAGZ,UAAUnhG,EAAeohG,GAAS,GACvC,MAAM7rF,EAAM7xB,KAAK8zB,KAAKxX,GACnBuV,EAAI6N,MACFg+E,GACD7rF,EAAI7c,QAAQ5U,UAAUuB,OAAO,QACxBkwB,EAAI7c,QAAQ40B,YAEjB/X,EAAI7c,QAAQ5U,UAAUuB,OAAO,YAAa,eAGrCkwB,EAAI6N,KAGb1/B,KAAK29G,UAAUrhG,GAGV,QAAQA,EAAeshG,EAAuBC,EAAUvhG,EAAQshG,EAAeE,GAAiB,GACrG,GAAGxhG,IAAUshG,EACX,OAAO59G,KAAK+9G,UAAUzhG,GAGxB,MAAMuV,EAAM7xB,KAAK8zB,KAAKxX,GAChB0hG,EAAch+G,KAAK8zB,KAAK8pF,GAC9B,IAAII,IAAgBF,EAClB,OAAO99G,KAAK+9G,UAAUzhG,GAGxB,MAAM2S,EAAQ,CAAC,WAAY,eACvB4uF,GAAS5uF,EAAMnqB,UAEnB+sB,EAAI7c,QAAQ5U,UAAUC,IAAI4uB,EAAM,IAChC4C,EAAI7c,QAAQ5U,UAAUuB,OAAOstB,EAAM,IAChC+uF,IACDA,EAAYhpG,QAAQ5U,UAAUC,IAAI4uB,EAAM,IACxC+uF,EAAYhpG,QAAQ5U,UAAUuB,OAAOstB,EAAM,KAG1C4C,EAAI6N,KACL1/B,KAAK+9G,UAAUzhG,GAAO,GAGxBuV,EAAI7c,QAAQ5U,UAAUkM,OAAO,aAAa,GAC1C0xG,GAAeA,EAAYhpG,QAAQ5U,UAAUkM,OAAO,aAAa,GAajEtM,KAAK29G,UAAUrhG,IA5FV,GAAAmhG,SAAW,IACX,GAAAn1E,WAAa,iBA+FtB,MAAM21E,GAYJ,YAAoBn5G,GAAU,GAAV,KAAAA,UARpB,KAAA0X,SAIM,GACN,KAAA0hG,eAAiB,EAIfl+G,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUuJ,UAAYy0G,GAAgB31E,WAG7C,WAAWhsB,GACT,GAAGtc,KAAKwc,SAASF,GAAQ,OAAOtc,KAAKwc,SAASF,GAC9C,MAAM7W,EAAOvF,SAASC,cAAc,OACpCsF,EAAK+D,UAAYy0G,GAAgB31E,WAAa,WAE9C,MAAM17B,EAAc1M,SAASC,cAAc,OAC3CyM,EAAYpD,UAAYy0G,GAAgB31E,WAAa,uBAErD,MAAM61E,EAAgB,IAAId,GAO1B,OANAc,EAAcl+G,UAAUuJ,UAAYy0G,GAAgB31E,WAAa,mBAEjE7iC,EAAKsE,OAAO6C,EAAauxG,EAAcl+G,WAEvCD,KAAKC,UAAU8J,OAAOtE,GAEfzF,KAAKwc,SAASF,GAAS,CAACrc,UAAWwF,EAAMmH,cAAauxG,iBAG/D,MAAM7nC,GACDt2E,KAAKgN,cAAcA,aAAahN,KAAKgN,cAExC,MAAMwP,GAAY,GAAK85D,GAAQn0E,OAC5Bqa,GAAYxc,KAAKwc,SAASra,SAI7BnC,KAAKgN,aAAezB,OAAOC,WAAW,KAClBxL,KAAKwc,SAAS/X,OAAO+X,EAAUxc,KAAKwc,SAASra,OAASqa,GAC9DlW,QAAS83G,IACjBA,EAAQn+G,UAAU0B,YAEnB07G,GAAcI,WAYnB,SAASnnC,GACP,MAAM95D,GAAY,GAAK85D,GAAQn0E,OACbnC,KAAKwc,SAAS/Y,MAAM+Y,GAC5BlW,QAAS83G,IACjB,MAAMC,GAAyBD,EAAQxxG,YAAYsd,WAAa,EACpDk0F,EAAQD,cAAcG,OAAOL,GAAgBM,aAAa,GACtEH,EAAQD,cAAc/uG,QAAQ6uG,GAAgBM,YAAaF,EAAuBr+G,KAAK8E,QAAUwxE,EAASt2E,KAAKk+G,eAAiB5nC,EAASt2E,KAAKk+G,gBAAgB,KAGhKl+G,KAAKmK,MAAMmsE,GAGb,SAASA,GAGP,MAAMkoC,EAAoBr2G,MAAMC,KAAK,GAAKpI,KAAKk+G,gBAAgBz1G,IAAI08F,IAAMA,GACvDh9F,MAAMC,KAAK,GAAKkuE,GAAQ7tE,IAAI08F,IAAMA,GAC1C7+F,QAAQ,CAACm4G,EAAep6G,K,MAChC,MAAM+5G,EAAUp+G,KAAK0+G,WAAWr6G,GAE1BwtB,EAAMusF,EAAQD,cAAcG,OAAOG,GAAe,GAClDJ,EAA8C,QAAtB,EAAAG,EAAkBn6G,UAAI,QAAI45G,GAAgBM,YACxE1sF,EAAI3H,UAAYk0F,EAAQxxG,YAAYsd,UAAY,GAAKu0F,EAErDL,EAAQD,cAAc/uG,QAAQqvG,EAAeJ,EAAuBr+G,KAAK8E,QAAUwxE,EAASt2E,KAAKk+G,eAAiB5nC,EAASt2E,KAAKk+G,gBAAgB,KAGlJl+G,KAAK2+G,SAASroC,GAEdt2E,KAAKk+G,eAAiB5nC,GAxFjB,GAAAioC,aAAe,EACf,GAAAj2E,WAAa,mBA2FP,MAAM,GA0CnB,YAAoB0jD,EAA4Bj/D,EAAoB29B,EAAgD4wB,GAAhG,KAAA0Q,SAA4B,KAAAj/D,OAAoB,KAAA29B,qBAAgD,KAAA4wB,kBAnC7G,KAAAsjC,aAAe,EACf,KAAAC,UAAY,EACZ,KAAAC,aAAe,EACf,KAAAC,eAAiB,EACjB,KAAAC,oBAAsB,EAEtB,KAAAC,QAAS,EACT,KAAAC,qBAAsB,EAEtB,KAAAv6G,MAAQ,EACR,KAAAsD,KAAiB,GACjB,KAAAgyB,YAAc,EAEd,KAAAL,SAAU,EACV,KAAAulF,cAAe,EACf,KAAAC,WAAY,EAOZ,KAAAC,yBAA2C,KAE3C,KAAAnY,QAAS,EAET,KAAAoY,uBAAuC,KAKtC,KAAAC,UAAW,EAEX,KAAAC,OAAQ,EAGdx/G,KAAK+N,eAAiB,IAAI,IAE1B,MAAM0xG,EAAM,IAAI,GAAe,kBAC/Bz/G,KAAKw0G,uBAAyB,IAAI,GAAgB,CAChDxoB,SACAj/D,OACAhf,eAAgB/N,KAAK+N,eACrBvE,UAAW,UACXoxG,cAAe6E,EACf5uG,QAAS,IAAW,mCAOlB,OANGyqE,EAAgBkhB,cAAcx8F,KAAKgsF,OAAO/kF,QAC3C,IAAI,GAAgBjH,KAAKgsF,OAAO/kF,OAAQjH,KAAK6+G,WAAW,GAExD,IAAI,GAAgB7+G,KAAKgsF,OAAO/kF,OAAQ,GAAG,IAGtC,OAIXjH,KAAK0/G,oBAAsB,IAAI7D,GAC/B4D,EAAIrzF,OAAO1C,YAAY1pB,KAAK0/G,oBAAoBl/D,OAAO,EAAG,IAE1DxgD,KAAK2/G,iBAAmB,IAAItC,GAC5BoC,EAAIpzF,SAAStiB,OAAO/J,KAAK2/G,iBAAiB1/G,WAE1CD,KAAK4/G,cAAgB,IAAIvC,GACzBr9G,KAAK4/G,cAAc3/G,UAAUG,UAAUC,IAAI,kCAC3Co/G,EAAI5xG,QAAQ+Q,QAAQ5e,KAAK4/G,cAAc3/G,WAEvCD,KAAK6/G,gBAAkB,IAAI5B,IAAgB,GAC3CwB,EAAI7xG,MAAM7D,OAAO,eAAK,iBAAkB,IAAK/J,KAAK6/G,gBAAgB5/G,WAElE,MAAM66G,EAAW96G,KAAKw0G,uBAAuBsG,SAASztE,WAAU,GAChErtC,KAAKw0G,uBAAuBwG,mBAAmBF,GAC/C2E,EAAIx/G,UAAU2e,QAAQk8F,GAEtB96G,KAAK8/G,QAAU,EAAW,wDAAyD,CAACnyG,UAAU,IAE9F3N,KAAKw0G,uBAAuBuG,aAAan8F,QAAQ5e,KAAK8/G,SAEtD,YAAiB9/G,KAAK8/G,QAAU79G,IAC9B,OAAAyb,EAAA,GAAYzb,GACZjC,KAAKgsF,OAAO+zB,YAAW,IACtB,CAAChyG,eAAgB/N,KAAK+N,iBAEzB/N,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,uBAAwB,EAAEiH,aACxDA,IAAWjH,KAAKgsF,OAAO/kF,SAGnBjH,KAAKknG,QACNlnG,KAAKw0G,uBAAuBloG,OAAOtM,KAAKknG,QAAS,GAGnDlnG,KAAKo/G,UAAYp/G,KAAKm/G,cAAe,EACrCn/G,KAAK8+G,aAAe,EACpB9+G,KAAK6+G,UAAY,EACjB7+G,KAAK2E,MAAQ,EACb3E,KAAKiI,KAAO,GACZjI,KAAKi6B,YAAc,EACnBj6B,KAAK4+G,aAAe,EACpB5+G,KAAKksF,gBAAgB,MAK3BlsF,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,qBAAsB,EAAEiH,aACtDA,IAAWjH,KAAKgsF,OAAO/kF,QACxBjH,KAAKw0G,uBAAuBloG,OAAOtM,KAAKknG,QAAS,KAMrDlnG,KAAKggH,iBAAmB3qF,GAAS,IAAMr1B,KAAKigH,oBAAqB,KAAK,GAAM,GAE5EjgH,KAAKu/G,SAA8B,eAAnBv/G,KAAK+sB,KAAK5pB,KAGrB,UACLnD,KAAKw0G,uBAAuBoG,cAAc36G,UAAU0B,SACpD3B,KAAKw0G,uBAAuBloG,QAAO,GACnCtM,KAAK+N,eAAeO,YACpBtO,KAAKkgH,yBAAwB,GAGxB,gBAAgB/zB,GACrB,GAAGnsF,KAAKu/G,SAAU,OAGlB,GAAGv/G,KAAKi/G,QAAUj/G,KAAKknG,OACrB,OAGF,IAAIlnG,KAAKm/G,cAAgBn/G,KAAKo/G,aAAep/G,KAAK2E,MAChD,OAIF,IAAIoL,EAAK/P,KAAK+sB,KAAKC,QAAQ4mE,iBAAiB,UAE5C,IAAI7jF,EAAI,OAIR,MAAMlJ,EAAMkJ,EAAG3D,QAAQvF,IACpBkJ,QAAcrL,IAARmC,GAEP7G,KAAKmgH,SAASt5G,EAAKslF,GAIhB,QAAQtlF,EAAaslF,GAC1B,GAAGnsF,KAAKu/G,SAAU,OAGlB,GAAGv/G,KAAKknG,OAAQ,OAIhB,IAAIqW,EAAuBv9G,KAAKiI,KAAKkN,UAAUu/D,GAAQA,GAAQ7tE,GAC/D,IAAqB,IAAlB02G,GAAwBv9G,KAAKogH,aAAa7C,GAEtC,MAAGv9G,KAAKo/G,WAAav4G,EAAM7G,KAAKiI,KAAKjI,KAAKiI,KAAK9F,OAAS,IAQ7D,YAJInC,KAAKs/G,yBACPt/G,KAAKs/G,uBAAyBt/G,KAAKqgH,gBAAgBx5G,OAA6BnC,IAAxBynF,KAH1DoxB,EAAev9G,KAAKiI,KAAK9F,OAAS,EAAInC,KAAKi6B,iBAH3CsjF,GAAgBv9G,KAAKi6B,YAqBvB,GADgBj6B,KAAK8+G,cAAgBvB,EACzB,CACV,GAAGv9G,KAAKk/G,0BAA+Cx6G,IAAxBynF,IACL,IAArBnsF,KAAK8+G,aAAqB9+G,KAAK8+G,YAAcvB,GAC9C,OAIJv9G,KAAK8+G,YAAcvB,EACnBv9G,KAAK6+G,UAAY7+G,KAAKiI,KAAKwI,KAAKikE,GAAQA,GAAQ7tE,IAAQ7G,KAAKiI,KAAKjI,KAAKiI,KAAK9F,OAAS,GACrFnC,KAAKggH,oBAID,aAAazC,GACnB,OAAQv9G,KAAK2E,MAAQ,GAAkBsvD,cAEjCj0D,KAAKm/G,cAAgB5B,GAAgB,GAAkB+C,cACvDtgH,KAAKo/G,WAAcp/G,KAAK2E,MAAQ,EAAI44G,GAAiB,GAAkB+C,aAKjE,gBAAgBz5G,EAAa05G,GAAe,G,0CACxD,IAAGvgH,KAAK45B,QAAR,CACA55B,KAAK45B,SAAU,EAEf,IACE,IAAI4mF,GAAU,EACd,MAAMniF,EAAW,CACfr+B,KAAK0qD,mBAAmB3jD,UAAU,CAChCE,OAAQjH,KAAKgsF,OAAO/kF,OACpBE,YAAa,CAACC,EAAG,6BACjBR,MAAOC,EACPK,MAAO,GAAkB+sD,WACzBttD,UAAW,GAAkBstD,aAE9BpzD,KAAKud,IACJoiG,GAAU,EACHpiG,KAIX,IAAIpe,KAAK4+G,aAAc,CACrB,MAAMz4G,EAAUnG,KAAK0qD,mBAAmB+1D,iBAAiBzgH,KAAKgsF,OAAO/kF,QAAQpG,KAAK82B,IAC5EA,EAAE/wB,QACN5G,KAAK4+G,aAAejnF,EAAE/wB,OAElB45G,GAAWD,IACbvgH,KAAKiI,KAAO,CAACjI,KAAK4+G,cAClB5+G,KAAK2E,MAAQgzB,EAAEhzB,MACf3E,KAAK8+G,YAAc,EACnB9+G,KAAK6+G,UAAY7+G,KAAKiI,KAAK,GAC3BjI,KAAKggH,uBAKT3hF,EAAS14B,KAAKQ,GAGhB,MAAME,SAAgBxD,QAAQC,IAAIu7B,IAAW,GAE7C,IAAIqiF,EAAcr6G,EAAOlC,QAAQgR,UAAU/Q,GAAWA,EAAQyC,KAAOA,IACjD,IAAjB65G,IACDA,EAAcr6G,EAAOlC,QAAQhC,QAK/BnC,KAAKi6B,YAAc5zB,EAAOs6G,iBAAmBt6G,EAAOs6G,iBAAmBD,EAAc,EACrF1gH,KAAKiI,KAAO5B,EAAOlC,QAAQsE,IAAIrE,GAAWA,EAAQyC,KAAKpD,QACvDzD,KAAK2E,MAAQ0B,EAAO1B,MAEhB3E,KAAK2E,OACP3E,KAAKw0G,uBAAuBloG,QAAO,GAGrCtM,KAAKo/G,UAAap/G,KAAKi6B,YAAcj6B,KAAKiI,KAAK9F,SAAYnC,KAAK2E,MAChE3E,KAAKm/G,cAAgBn/G,KAAKi6B,YAE1Bj6B,KAAKw/G,OAASx/G,KAAK+sB,KAAKiiC,IAAI,gCAAiCnoD,EAAKR,EAAQq6G,EAAa1gH,KAAKi6B,YAAaj6B,KAAKo/G,UAAWp/G,KAAKm/G,cAC9H,MAAM1yG,GACNzM,KAAK+sB,KAAKiiC,IAAIriD,MAAM,8BAA+BF,GAGrDzM,KAAK45B,SAAU,EAEZ55B,KAAKi/G,OACNj/G,KAAKmgH,QAAQt5G,GACL05G,GACRvgH,KAAKksF,gBAAgB,GAGvBlsF,KAAKs/G,uBAAyB,SAIzB,wBACLt/G,KAAKk/G,qBAAsB,EAEvBl/G,KAAKq/G,2BACPr/G,KAAKq/G,yBAA2B,IAAI,IC5e3B,SAA+Bt7G,EAAmBo3F,EAAwBnjE,EAAsBjqB,GAC7G,GAAG,sBAAoB,CACrB,IAAI6yG,EACJ,MAAM59G,EAAU,CAACsY,SAAS,GAC1BvN,EAAe1N,IAAI0D,EAAnBgK,CAAyB,aAAe9L,IACnCA,EAAE+Y,QAAQ7Y,OAAS,EACpBiZ,KAIFwlG,EAAQ3+G,EAAE+Y,QAAQ,GAAGE,QAErBnN,EAAe1N,IAAI0D,EAAnBgK,CAAyB,YAAa+M,EAAa9X,GACnD+K,EAAe1N,IAAI0D,EAAnBgK,CAAyB,WAAYqN,EAAYpY,KAChDA,GAEH,MAAM8X,EAAe7Y,IACnB,MAAMiZ,EAAUjZ,EAAE+Y,QAAQ,GAAGE,QAEvB2lG,EAAS3lG,EAAU0lG,EACb,WAATzlB,GAAqB0lB,EAAQ7oF,IACf,QAATmjE,GAAmB0lB,GAAQ7oF,IACnC4oF,EAAQ1lG,GAIJE,EAAa,KACjBrN,EAAei8C,aAAajmD,EAAM,YAAa+W,EAAa9X,GAC5D+K,EAAei8C,aAAajmD,EAAM,WAAYqX,EAAYpY,SAG5D+K,EAAe1N,IAAI0D,EAAnBgK,CAAyB,QAAU9L,IACjC,MAAM4+G,EAAS5+G,EAAE6+G,OAAS,EAEd,WAAT3lB,GAAqB0lB,EAAQ7oF,IACf,QAATmjE,GAAmB0lB,GAAQ7oF,KAClC,CAAC1c,SAAS,IDycXylG,CAAsB/gH,KAAK+sB,KAAKC,QAAQjiB,WAAW9K,UAAW,SAAU,KACtED,KAAKkgH,2BACJlgH,KAAKq/G,2BAIL,wBAAwB2B,GAAkB,GAC/ChhH,KAAKk/G,qBAAsB,EAExBl/G,KAAKq/G,2BACNr/G,KAAKq/G,yBAAyB/wG,YAC9BtO,KAAKq/G,yBAA2B,MAG/B2B,GACDhhH,KAAKksF,gBAAgB,GAIZ,+B,0CACXlsF,KAAKi/G,QAAS,EAEdj/G,KAAKw/G,OAASx/G,KAAK+sB,KAAKiiC,IAAI,sCAC5B,IACEhvD,KAAKihH,wBAEL,MAAMliE,EAAiB/+C,KAAK+sB,KAAKgyB,eAC9BA,aAA0Bl8C,gBACrBk8C,SAIF,eAEH/+C,KAAKs/G,+BACAt/G,KAAKs/G,wBAGbt/G,KAAKw/G,OAASx/G,KAAK+sB,KAAKiiC,IAAI,8CAC5BhvD,KAAKi/G,QAAS,EAOd,MAAMxyG,GACNzM,KAAK+sB,KAAKiiC,IAAIriD,MAAM,4CAA6CF,GAEjEzM,KAAKi/G,QAAS,EACdj/G,KAAKk/G,qBAAsB,EAC3Bl/G,KAAKksF,gBAAgB,OAIZ,oBAAoBrlF,G,0CAC/B,MAAMzC,EAAUpE,KAAK+sB,KAAKg4B,WAAWl+C,GAClCzC,IAAYA,EAAQi3B,UACrBr7B,KAAK+sB,KAAKs/D,aAAaxlF,IACtB7G,KAAK+sB,KAAKgyB,gBAAkBl8C,QAAQoD,WAAWpF,KAAK,KACnDb,KAAKkhH,+BACLlhH,KAAKmgH,QAAQngH,KAAK8+G,aAAgB9+G,KAAK2E,MAAQ,EAAK3E,KAAK4+G,aAAe/3G,EAAM,SAKvE,oB,0CAQT,MAAMlC,EAAQ3E,KAAK2E,MACnB,GAAGA,EAAO,CACR,MAAMm6G,EAAc9+G,KAAK8+G,YACnB16G,EAAUpE,KAAK+sB,KAAKg4B,WAAW/kD,KAAK6+G,WAKlCsC,EAAyB,IAAhBrC,EACf9+G,KAAK6/G,gBAAgB5/G,UAAUG,UAAUkM,OAAO,UAAW60G,GAEvDA,GACFnhH,KAAK6/G,gBAAgBuB,SAASz8G,EAAQm6G,GAK1C9+G,KAAKw0G,uBAAuBloG,QAAO,GAEnC,MAAMuxG,EAAUiB,EAAc9+G,KAAK++G,eAEnC/+G,KAAKw/G,OAASx/G,KAAK+sB,KAAKiiC,IAAI,kCAAmC6uD,EAASiB,EAAa9+G,KAAK++G,gBAE1F,MAAMsC,EAAUrhH,KAAK2/G,iBAAiBrB,OAAOQ,GACvCwC,EAAethH,KAAK4/G,cAActB,OAAOQ,GAC/CwC,EAAalhH,UAAUC,IAAI,wBAE3B,MAAMoqB,EAA+B,GAC/BgD,EAAanB,GAAuB,CACxC1e,WAAOlJ,EACPskB,QAAS,KACTqD,SAAUjoB,EAAQA,QAClBmoB,WAAY80F,EACZj9G,UACAooB,QAAS80F,EACT72F,uBAGI5nB,QAAQC,IAAI2nB,GAElBzqB,KAAKw0G,uBAAuBoG,cAAc36G,UAAUG,UAAUkM,OAAO,WAAYmhB,GAG/EztB,KAAK2/G,iBAAiBvwG,QAAQ0vG,EAAa9+G,KAAK++G,gBAC7CtxF,GACDztB,KAAK4/G,cAAcxwG,QAAQ0vG,EAAa9+G,KAAKg/G,qBAC7Ch/G,KAAKg/G,oBAAsBF,GAE3B9+G,KAAK4/G,cAAcjC,YAIvB39G,KAAK0/G,oBAAoBl/D,OAAO77C,EAAOA,EAAQm6G,EAAc,GAC7D9+G,KAAK++G,eAAiBD,EACtB9+G,KAAKw0G,uBAAuBoG,cAAc36G,UAAUmM,QAAQvF,IAAM,GAAKzC,EAAQyC,SAE/E7G,KAAKw0G,uBAAuBloG,QAAO,GACnCtM,KAAK++G,eAAiB,EAGxB/+G,KAAKw0G,uBAAuBoG,cAAc36G,UAAUG,UAAUkM,OAAO,UAAWtM,KAAK2E,MAAQ,OAranF,GAAAsvD,WAAa,GACb,GAAAqsD,YAAc,EExKf,MAAM,GA0BnB,YAAoBvzF,EACV0jB,EACAia,EACA4wB,EACAqwB,EACAG,EACAhjB,EACAF,GAPU,KAAA77D,OACV,KAAA0jB,kBACA,KAAAia,qBACA,KAAA4wB,kBACA,KAAAqwB,kBACA,KAAAG,0BACA,KAAAhjB,oBACA,KAAAF,kBATF,KAAA9W,YAAmE,GA6cnE,KAAAyvC,SAAW,KACjBvhH,KAAKo7G,eAAc,GACnBp7G,KAAKm7G,eAGC,KAAAtT,eAAiB,CAACz/F,EAAkBunC,KAC1C3vC,KAAKC,UAAUG,UAAUkM,OAAO,qBAAsB4X,EAAA,EAAWC,UAEjEnkB,KAAKisF,eAAiBjsF,KAAKisF,cAAcuoB,uBAAuBoG,cAAc36G,UAAUG,UAAUkM,OAAO,cAAeqjC,IAAO,IAAWE,QAC1I7vC,KAAKuhH,YAuKA,KAAAnG,cAAgB,CAACoG,GAAS,KAE5BxhH,KAAKyhH,aAAal2G,OAAO+S,qBAAqBte,KAAKyhH,aAEnD,cAAaD,GACdxhH,KAAK0hH,UAAUthH,UAAUC,IAAI,QAI/BL,KAAKyhH,YAAcl2G,OAAO8S,sBAAsB,KAKvC,cAAamjG,GACdxhH,KAAK0hH,UAAUthH,UAAUuB,OAAO,QAIlC,MAAMjB,EAAmCV,KAAK0hH,UAAU5lG,wBAAwBpb,MAChFV,KAAK+sB,KAAKiiC,IAAI,eAAgBtuD,GAC9BV,KAAKC,UAAU0C,MAAMolC,YAAY,gBAAiBrnC,EAAQ,MAI5DV,KAAKyhH,YAAc,KAOlB,KAAAtG,YAAc,KACnB,MACMx2G,EADa,CAAC3E,KAAK2hH,UAAW3hH,KAAKisF,eAAiBjsF,KAAKisF,cAAcuoB,wBAAwB5sG,OAAOc,SACnFq7B,OAAO,CAACC,EAAK/jC,KACpC,MAAMi7G,EAAaj7G,EAAU26G,cAAc36G,UAAUG,UAAUuR,SAAS,eAExE,OADA3R,KAAKC,UAAUG,UAAUkM,OAAO,aAAarM,EAAUuJ,qBAAsB0xG,GACtEl3E,IAAOk3E,GACb,GACHl7G,KAAKC,UAAUmM,QAAQuuG,SAAW,GAAKh2G,GAGlC,KAAAymC,cAAgB,CAACC,GAAY,KAClC,IAAIrrC,KAAKqsB,SAAU,OAEnB,MAAMplB,EAASjH,KAAKiH,OACpBjH,KAAK+sB,KAAKy9D,aAAap/C,cAAcprC,KAAKiH,OAAQjH,KAAKqsB,SAAUgf,GAAW,EAAO,IAAMpkC,IAAWjH,KAAKiH,SAhqBzGjH,KAAK+N,eAAiB,IAAI,IAGrB,YAGL/N,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,iBAAkB,UAC/CL,KAAKC,UAAUmM,QAAQuuG,SAAW,IAElC36G,KAAK4hH,QAAU,EAAW,4BAA6B,CAACj0G,UAAU,IAGlE3N,KAAK6hH,SAAW3hH,SAASC,cAAc,OACvCH,KAAK6hH,SAASzhH,UAAUC,IAAI,aAE5B,MAAMyhH,EAAS5hH,SAASC,cAAc,OACtC2hH,EAAO1hH,UAAUC,IAAI,UAErB,MAAMwN,EAAU3N,SAASC,cAAc,OACvC0N,EAAQzN,UAAUC,IAAI,WAEtB,MAAM8zB,EAAMj0B,SAASC,cAAc,OACnCg0B,EAAI/zB,UAAUC,IAAI,OAElBL,KAAK4N,MAAQ1N,SAASC,cAAc,OACpCH,KAAK4N,MAAMxN,UAAUC,IAAI,cAEzB8zB,EAAIpqB,OAAO/J,KAAK4N,OAEhB,MAAMkP,EAAS5c,SAASC,cAAc,OACtC2c,EAAO1c,UAAUC,IAAI,UAElBL,KAAKqsB,UACNvP,EAAO/S,OAAO/J,KAAKqsB,UAGrBxe,EAAQ9D,OAAOoqB,EAAKrX,GACjB9c,KAAK+hH,eACND,EAAO/3G,OAAO/J,KAAK+hH,eAGrBD,EAAO/3G,OAAO8D,GACd7N,KAAK6hH,SAAS93G,OAAO+3G,GAGrB9hH,KAAK0hH,UAAYxhH,SAASC,cAAc,OACxCH,KAAK0hH,UAAUthH,UAAUC,IAAI,cAE7BL,KAAK2hH,UAAY,IAAI,GAAU3hH,KAAMA,KAAK+sB,KAAM/sB,KAAK0qD,oBAElD1qD,KAAK8xE,YAAY3vE,SAClBnC,KAAKgiH,QAAU,GAAiB,CAACj0G,eAAgB/N,KAAK+N,gBAAiB,cAAe/N,KAAK8xE,YAAc7vE,IACvG,OAAAyb,EAAA,GAAYzb,GACZjC,KAAK8xE,YAAYxrE,QAAQuU,IACvBA,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAASuO,EAAO9F,YAIlD/U,KAAK8xE,YAAY9xE,KAAK8xE,YAAY3vE,OAAS,GAAG6S,QAAQyU,UAAUC,YAAY,eAAK1pB,KAAKs7E,gBAAgB2mC,oBAAoBjiH,KAAKiH,aAInIjH,KAAK0hH,UAAU33G,UAAU,CAEvB/J,KAAKisF,cAAgBjsF,KAAKisF,cAAcuoB,uBAAuBoG,cAAc36G,UAAY,KACzFD,KAAKkiH,QACLliH,KAAKmiH,UACLniH,KAAKoiH,QACLpiH,KAAKqiH,UACLriH,KAAKgiH,SACLp6G,OAAOc,UAET1I,KAAKC,UAAU8J,OAAO/J,KAAK4hH,QAAS5hH,KAAK6hH,SAAU7hH,KAAK0hH,WAErD1hH,KAAK2hH,WAEN3hH,KAAKC,UAAU8J,OAAO/J,KAAK2hH,UAAU/G,cAAc36G,WAOrDD,KAAK+N,eAAe1N,IAAIkL,OAAxBvL,CAAgC,SAAUA,KAAKuhH,UAC/CvhH,KAAK+N,eAAe1N,IAAI6jB,EAAA,EAAxBlkB,CAAoC,eAAgBA,KAAK6nG,gBAEzD,YAAiB7nG,KAAKC,UAAYgC,IAChC,MAAMhC,EAAyB,OAAA6hB,GAAA,GAAgB7f,EAAE4S,OAAQ,oBAEzD,GADA,OAAAm2C,GAAA,KACG/qD,EAAW,CAGZ,GAFA,OAAAyd,EAAA,GAAYzb,GAET,OAAA6f,GAAA,GAAgB7f,EAAE4S,OAAQ,iBAC3B,OAGF,MAAMhO,GAAO5G,EAAUmM,QAAQvF,IAC/B,GAAG5G,EAAUG,UAAUuR,SAAS,kBAE5B3R,KAAKisF,cAAcq2B,oBAAoBz7G,OAEpC,CACL,MAAMI,EAAShH,EAAUmM,QAAQnF,OAAO6gB,WAClC9gB,EAAgB,GAA2Bu7G,mBACjDviH,KAAK+sB,KAAKy9D,aAAazjC,aACrB9/C,EACAJ,EACAG,EAAc8B,YAAc,YAAe9B,EAAc8D,SAAW,kBAAepG,EACnFsC,EAAc8D,gBAIfoZ,EAAA,EAAWs+F,eAAiB,IAAW5yE,QAAU1vC,SAASiW,KAAK/V,UAAUuR,ShDzJxC,wBgD0JlC8wG,IACQ,OAAAphF,GAAA,GAAUp/B,EAAE4S,OAAQ,kBAC5B7U,KAAKywC,gBAAgBX,eAAe5vC,SAASiW,KAAK/V,UAAUuR,SzG3LzB,0ByG6LnC3R,KAAKywC,gBAAgBX,eAAc,IAGtC,CAAC/hC,eAAgB/N,KAAK+N,iBAEzB,MAAM00G,EAAkBxgH,IAOtB,GANGA,GACD,OAAAyb,EAAA,GAAYzb,GAKXiiB,EAAA,EAAWs+F,eAAiB,IAAW5yE,QAAU1vC,SAASiW,KAAK/V,UAAUuR,ShD1KtC,wBgD2KpC3R,KAAK+sB,KAAKy9D,aAAav+C,QAAQjsC,KAAKiH,YAC/B,CACL,MAAMy7G,EAAkE,IAApD1iH,KAAK+sB,KAAKy9D,aAAa9zB,MAAMn6C,QAAQvc,KAAK+sB,MAC9Dhe,EAAA,EAAwBG,KAAKwzG,EAAc,KAAO,UAYtD,YAAiB1iH,KAAK4hH,QAASa,EAAgB,CAAC10G,eAAgB/N,KAAK+N,iBAGhE,iBACL/N,KAAK8xE,YAAc,CAAC,CAClBzkE,KAAM,SACN6P,KAAM,SACNC,QAAS,KACPnd,KAAK+sB,KAAK2lD,cAEZ39D,OAAQ,IAAMmP,EAAA,EAAWC,UAMtB,CACH9W,KAAM,OACN6P,KAAM,wBACNC,QAAS,KACPnd,KAAK0qD,mBAAmBnlB,SAASvlC,KAAKiH,SAExC8N,OAAQ,IAAyB,SAAnB/U,KAAK+sB,KAAK5pB,MAAmByF,EAAA,QAAU6O,OAASzX,KAAKiH,SAAWjH,KAAK8rG,wBAAwB9lE,iBAAiBhmC,KAAKiH,QAAQ,IACxI,CACDoG,KAAM,SACN6P,KAAM,0BACNC,QAAS,KACPnd,KAAK0qD,mBAAmBnlB,SAASvlC,KAAKiH,SAExC8N,OAAQ,IAAyB,SAAnB/U,KAAK+sB,KAAK5pB,MAAmByF,EAAA,QAAU6O,OAASzX,KAAKiH,QAAUjH,KAAK8rG,wBAAwB9lE,iBAAiBhmC,KAAKiH,QAAQ,IACvI,CACDoG,KAAM,WACN6P,KAAM,iBACNC,QAAS,KACPnd,KAAK8oF,kBAAkB65B,eAAe3iH,KAAKiH,OAAO4vB,YAAYh2B,KAAK+hH,IAC9DA,EAAYC,gBACb7iH,KAAK+sB,KAAKy9D,aAAazjC,aAAa67D,EAAYC,eAAe/6F,UAAS,OAI9E/S,OAAQ,K,MACN,MAAM6jB,EAAW54B,KAAK8oF,kBAAkBg6B,UAAU9iH,KAAKiH,OAAO4vB,YAC9D,MAA0B,SAAnB72B,KAAK+sB,KAAK5pB,MAAmBnD,KAAKs7E,gBAAgBnjD,YAAYn4B,KAAKiH,YAA+C,QAAlC,EAAC2xB,SAAiC,eAAEiqF,kBAE5H,CACDx1G,KAAM,SACN6P,KAAM,2BACNC,QAAS,KACP,MAAM2xB,EAAY9uC,KAAK+sB,KAAK+hB,UAC5BA,EAAUkZ,iBAAgB,GAAM,GAChCtzB,EAAA,QAAgBC,WAAW9zB,KAAK+zB,IAC9B,GAAGA,EAAMmuF,4BACP,OAGF,MAAM9qF,EAAW6W,EAAUE,gBAAgBzoC,KAAKuoC,GAChDA,EAAUE,gBAAmByd,IAC3B/3B,EAAA,QAAgBmuC,YAAY,+BAA+B,GAC3D3tC,GAAM,eAAK,mBAEX4Z,EAAUE,gBAAkB/W,EAC5B6W,EAAUE,gBAAgByd,OAIhC13C,OAAQ,KAAO/U,KAAK+sB,KAAK+hB,UAAUC,eAAiB/3B,OAAOm1C,KAAKnsD,KAAK+sB,KAAKC,QAAQA,SAAS7qB,QAC1F,CACDkL,KAAM,SACN6P,KAAM,2BACNC,QAAS,KACPnd,KAAK+sB,KAAK+hB,UAAU2Y,mBAEtB1yC,OAAQ,IAAM/U,KAAK+sB,KAAK+hB,UAAUC,aACjC,CACD1hC,KAAM,UACN6P,KAAM,aACNC,QAAS,KACP,IAAInd,KAAKywC,gBAAgB0F,YAAY,IAAoB,CACvD,MAAM3mC,EAAM,IAAI,GAAkBxP,KAAKywC,iBACvCjhC,EAAIvI,OAASjH,KAAKiH,OAClBuI,EAAIuB,OAEJ/Q,KAAKywC,gBAAgBX,eAAc,KAGvC/6B,OAAQ,IAAM/U,KAAKiH,OAAOo2B,WAAar9B,KAAKs7E,gBAAgBx2C,UAAU9kC,KAAKiH,SAC1E,CACDoG,KAAM,UACN6P,KAAM,eACNC,QAAS,KACP,MAAM6lG,EAAgBhjH,KAAKiH,OAC3B,IAAI,GAAc,CAChBu4B,UAAW,CAAC,UAAW,YACvBF,SAAWr4B,GACF,IAAIpE,QAAQ,CAACoD,EAASylB,KAC3B,IAAI,GAAU,GAAI,CAChBgI,aAAc,mBACd+D,mBAAoB,yBACpBG,oBAAqB,CAAC,IAAI,KAAU,CAAC3wB,SAAQ4E,QAAQ,IAAOmJ,SAC5D4I,QAAS,CAAC,CACRmX,QAAS,OACTiD,SAAU,KACR/xB,IAEAjG,KAAK0qD,mBAAmB+5B,UAAUx9E,EAAQjH,KAAK4oF,gBAAgBq6B,qBAAqBD,IACpFhjH,KAAK+sB,KAAKy9D,aAAazjC,aAAa9/C,KAErC,CACD8tB,QAAS,SACTiD,SAAU,KACRtM,KAEFivC,UAAU,IAEZ1zD,SACAkwB,iBAAiB,IAChB5W,SAGP3T,YAAa,gCACbkwB,iBAAkB,gBAClBtC,aAAc,kBAGlBzlB,OAAQ,IAAMnM,EAAA,QAAU6O,OAASzX,KAAKiH,QAAUjH,KAAKiH,OAAOo2B,UAAYr9B,KAAKs7E,gBAAgBx2C,UAAU9kC,KAAKiH,SAC3G,CACDoG,KAAM,OACN6P,KAAM,YACNC,QAAS,KACP,IAAI,GAAU,GAAI,CAChBlW,OAAQjH,KAAKiH,OACbysB,aAAc,YACd+D,mBAAoB,0BACpBG,oBAAqB,CAAC,IAAI,KAAU,CAAC3wB,OAAQjH,KAAKiH,SAAS+N,SAC3D4I,QAAS,CAAC,CACRmX,QAAS,YACTmO,UAAU,EACVlL,SAAU,KACRh4B,KAAK4oF,gBAAgB3rB,YAAYj9D,KAAKiH,QAAQ,GAAMpG,KAAKqB,IACpDA,GACDizB,GAAS,CAACC,YAAa,uBAK9B7U,QAELxL,OAAQ,K,MACN,MAAM3C,EAASpS,KAAKiH,OAAO8K,WACrB06B,EAAWzsC,KAAK8oF,kBAAkBo6B,UAAU9wG,GAClD,OAAOpS,KAAKs7E,gBAAgBj+C,OAAOr9B,KAAKiH,SAAWjH,KAAKiH,SAAW2B,EAAA,QAAU6O,MAAQg1B,KAA4B,QAAf,EAAAA,EAASn1B,cAAM,eAAE6lD,WAEpH,CACD9vD,KAAM,UACN6P,KAAM,UACNC,QAAS,KACPnd,KAAK4oF,gBAAgB3rB,YAAYj9D,KAAKiH,QAAQ,GAAOpG,KAAKqB,IACrDA,GACDizB,GAAS,CAACC,YAAa,qBAI7BrgB,OAAQ,K,MACN,MAAM03B,EAAWzsC,KAAK8oF,kBAAkBo6B,UAAUljH,KAAKiH,OAAO8K,YAC9D,OAAO/R,KAAKs7E,gBAAgBj+C,OAAOr9B,KAAKiH,YAA6B,QAAhB,EAAAwlC,aAAQ,EAARA,EAAUn1B,cAAM,eAAE6lD,WAExE,CACD9vD,KAAM,gBACN6P,KAAM,SACNC,QAAS,KACP,IAAI,GAAkBnd,KAAKiH,SAE7B8N,OAAQ,IAAyB,SAAnB/U,KAAK+sB,KAAK5pB,QAAqBnD,KAAK0qD,mBAAmBkqC,cAAc50F,KAAKiH,UAG1FjH,KAAKqiH,UAAY,EAAW,UAC5B,YAAiBriH,KAAKqiH,UAAYpgH,IAChC,OAAAyb,EAAA,GAAYzb,GACZjC,KAAK+sB,KAAK2lD,cACT,CAAC3kE,eAAgB/N,KAAK+N,iBAGpB,uBAmGL,OAlGA/N,KAAK+hH,cAAgB,IAAI,GACzB/hH,KAAK+hH,cAAc3+G,aAAa,SAAU,KAE1CpD,KAAK+hH,cAAc3hH,UAAUC,IAAI,YAAa,iBAE9CL,KAAKqsB,SAAWnsB,SAASC,cAAc,OACvCH,KAAKqsB,SAASjsB,UAAUC,IAAI,QAE5BL,KAAKisF,cAAgB,IAAI,GAAkBjsF,KAAMA,KAAK+sB,KAAM/sB,KAAK0qD,mBAAoB1qD,KAAKs7E,iBAE1Ft7E,KAAKkiH,QAAU,YAAO,gDACtBliH,KAAKmiH,UAAY,EAAW,WAC5BniH,KAAKoiH,QAAU,EAAW,QAE1B,YAAiBpiH,KAAKmiH,UAAYlgH,IAChC,OAAAyb,EAAA,GAAYzb,GACZ,OAAA+oD,GAAA,KACAhrD,KAAK+/G,YAAW,IACf,CAAChyG,eAAgB/N,KAAK+N,iBAEzB,YAAiB/N,KAAKoiH,QAAUngH,IAC9B,OAAAyb,EAAA,GAAYzb,GACZ,OAAA+oD,GAAA,KACAhrD,KAAK0qD,mBAAmBnlB,SAASvlC,KAAKiH,SACrC,CAAC8G,eAAgB/N,KAAK+N,iBAEzB,YAAiB/N,KAAKkiH,QAAUjgH,IAC9B,OAAAyb,EAAA,GAAYzb,GAEZ,OAAA+oD,GAAA,KACA,MAAMp+B,EAAa5sB,KAAK+sB,KAAKC,QAAQC,gBACrCjtB,KAAKkiH,QAAQ9+G,aAAa,WAAY,QAEtC,MAAM4O,EAAShS,KAAKiH,OAAO4vB,WAC3B,IAAI1wB,EAEFA,EADCnG,KAAK2rG,gBAAgBtpE,UAAUrwB,GACtBhS,KAAK2rG,gBAAgBwX,YAAYnxG,GAEjChS,KAAK2rG,gBAAgBl9D,YAAYz8B,EAAQpJ,EAAA,QAAU6O,MAG/DtR,EAAQ8a,QAAQ,KACV2L,KAIJ5sB,KAAKkiH,QAAQ99E,gBAAgB,eAE9B,CAACr2B,eAAgB/N,KAAK+N,iBAEzB/N,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,cAAgBgS,I,QACjD,GAAGhS,KAAKiH,SAAW+K,EAAO8V,UAAS,GAAO,CACxC,MAAMiF,EAAO/sB,KAAK2rG,gBAAgBjzE,QAAQ1mB,GAE1ChS,KAAKkiH,QAAQ9hH,UAAUkM,OAAO,SAAkC,QAAzB,EAAiB,QAAjB,EAACygB,SAAgB,eAAEzV,cAAM,eAAEyF,OAClE/c,KAAKo7G,mBAITp7G,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,yBAA2B6L,IACzDA,EAAO5E,SAAWjH,KAAKiH,QACxBjH,KAAKojH,kBAITpjH,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,eAAgB,EAAEiH,aAChDjH,KAAKiH,SAAWA,GACjBjH,KAAKorC,kBAITprC,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,cAAgBoS,IAC9CpS,KAAKiH,SAAWmL,GACjBpS,KAAKorC,kBAINprC,KAAKisF,eACNjsF,KAAK+sB,KAAK/rB,iBAAiB,UAAW,CAAC6F,EAAKw8G,KAC1C,MAAMz2F,EAAa5sB,KAAK+sB,KAAKC,QAAQC,gBACrCyH,EAAA,QAAgBC,WAAW9zB,KAAM+zB,IAC3BhI,MAEJ5sB,KAAKisF,cAAcib,SAAWtyE,EAAM0uF,qBAAqBtjH,KAAK+sB,KAAK9lB,QAEhEo8G,GACDrjH,KAAKisF,cAAci0B,0BACnBlgH,KAAKisF,cAAck0B,QAAQt5G,EAAK,IACvB7G,KAAKisF,cAAcgzB,SAC5Bj/G,KAAKisF,cAAci1B,+BACnBlhH,KAAKisF,cAAck0B,QAAQt5G,SAMnC7G,KAAK6rC,sBAAwBtgC,OAAOugC,YAAY9rC,KAAKorC,cAAe,KAE7DprC,KAGF,yBACLA,KAAK+N,eAAe1N,IAAIuI,EAAA,QAAxB5I,CAAmC,uBAAyBiC,IAC1D,MAAM,OAACgF,EAAM,KAAEgB,EAAI,OAAEuyE,GAAUv4E,EAE5BgF,IAAWjH,KAAKiH,QAEhBgB,GACDjI,KAAKmR,aAKJ,6BACLnR,KAAKisF,cAAgB,IAAI,GAAkBjsF,KAAMA,KAAK+sB,KAAM/sB,KAAK0qD,mBAAoB1qD,KAAKs7E,iBAGrF,WAAWioC,GAChBvjH,KAAK+sB,KAAKy9D,aAAazjC,aAAa/mD,KAAKiH,OAAQs8G,GAAavjH,KAAKisF,cAAcuoB,uBAAuBoG,cAAc36G,UAAUmM,QAAQvF,IAAM,EAAG,UAe5I,UAGL7G,KAAK+N,eAAeO,YACpB/C,OAAOqqC,cAAc51C,KAAK6rC,uBAEvB7rC,KAAKisF,eACNjsF,KAAKisF,cAAcu3B,iBAGdxjH,KAAK2hH,iBACL3hH,KAAKisF,cAGP,QAAQhlF,GACbjH,KAAKyjH,UAAYzjH,KAAKiH,OACtBjH,KAAKiH,OAASA,EAEdjH,KAAKC,UAAU0C,MAAMC,QAAUqE,EAAS,GAAK,OAGxC,iBAAiBgsF,EAAmBI,EAAiB1I,G,QAC1D,MAAM1jF,EAASjH,KAAKiH,OAEjBjH,KAAK+hH,gBACN/hH,KAAK+hH,cAAc3+G,aAAa,OAAQ,GAAK6D,GAC7CjH,KAAK+hH,cAAcpgF,UAGrB,MAAMxJ,EAAcn4B,KAAKs7E,gBAAgBnjD,YAAYlxB,GAErD,GADAjH,KAAKoiH,SAAWpiH,KAAKoiH,QAAQhiH,UAAUkM,OAAO,QAAS6rB,GACpDn4B,KAAKs7E,gBAAgB78C,UAAUx3B,IAC7BjH,KAAKkiH,QAAS,CACf,MAAMlwG,EAAS/K,EAAO4vB,WACtB,OAAAtqB,EAAA,GAAevM,KAAKkiH,QAAS,eAAKliH,KAAK2rG,gBAAgBtpE,UAAUrwB,GAAU,iBAAmB,gBAC9FhS,KAAKkiH,QAAQ9hH,UAAUkM,OAAO,SAAqD,QAA5C,EAAoC,QAApC,EAAAtM,KAAK2rG,gBAAgBjzE,QAAQ1mB,UAAO,eAAEsF,cAAM,eAAEyF,OAIzF/c,KAAKo7G,gBAEL,MAAMxuF,EAAa5sB,KAAK+sB,KAAKC,QAAQC,gBACrC,GAAGjtB,KAAKisF,cACN,GAAsB,SAAnBjsF,KAAK+sB,KAAK5pB,KAAiB,CAC5B,QAAsBuB,IAAnB1E,KAAKyjH,UAAyB,CAC/B,MAAMC,EAAmB,IAAI,GAAkB1jH,KAAMA,KAAK+sB,KAAM/sB,KAAK0qD,mBAAoB1qD,KAAKs7E,iBAC9Ft7E,KAAKisF,cAAcuoB,uBAAuBoG,cAAc36G,UAAUypB,YAAYg6F,EAAiBlP,uBAAuBoG,cAAc36G,WACpID,KAAKisF,cAAcu3B,UAEnBxjH,KAAKisF,cAAgBy3B,EAGvBhvF,EAAA,QAAgBC,WAAW9zB,KAAM+zB,IAC3BhI,MAEJ5sB,KAAKisF,cAAcib,SAAWtyE,EAAM0uF,qBAAqBr8G,GAErDgsF,GACFjzF,KAAKisF,cAAcC,gBAAgB,UAGZ,eAAnBlsF,KAAK+sB,KAAK5pB,OAClBnD,KAAKisF,cAAc4yB,UAAY7+G,KAAK+sB,KAAKjiB,SACzC9K,KAAKisF,cAActnF,MAAQ,EAC3B3E,KAAKisF,cAAc6yB,YAAc,EACjC9+G,KAAKisF,cAAcg0B,qBAIvB,aAAQ,KACNjgH,KAAKmR,WACLnR,KAAKorC,eAAc,GACnBprC,KAAKojH,kBAIF,SAASz+G,G,MACd,IAAIqkB,EAgEJ,GA/DsB,WAAnBhpB,KAAK+sB,KAAK5pB,MACa6lB,OAAXtkB,IAAVC,EAA+B,eAAK,WACxB,eAAK,sBAAuB,CAACA,SAE/BD,IAAVC,GACD3E,KAAK0qD,mBAAmBgK,kBAAkB10D,KAAKiH,OAAQ,CAAC,CAACG,EAAG,+BAA+B,GAAOvG,KAAKwF,IACrG,MAAM1B,EAAQ0B,EAAO,GAAG1B,MAIxB,GAHA3E,KAAKmR,SAASxM,IAGVA,EAAO,CACT3E,KAAK+sB,KAAKy9D,aAAav+C,QAAQ,MAG/B,MAAMsoE,EAAev0G,KAAK+sB,KAAKy9D,aAAaz9D,KACzCwnF,EAAavoB,OAAOC,eACrBsoB,EAAavoB,OAAOC,cAAcuoB,uBAAuBloG,QAAO,OAK7C,cAAnBtM,KAAK+sB,KAAK5pB,MAGhB6lB,EAFChpB,KAAKiH,SAAW2B,EAAA,QAAU6O,KAEjB,eAAK,aAEL,eAAK,0BAIJ/S,IAAVC,GACD3E,KAAK0qD,mBAAmBivC,qBAAqB35F,KAAKiH,QAAQpG,KAAKoH,IAC7DjI,KAAKmR,SAASlJ,EAAK9F,WAGI,eAAnBnC,KAAK+sB,KAAK5pB,MACM6lB,OAAXtkB,IAAVC,EAA+B,eAAK,WACxB,eAAK,sBAAuB,CAACA,SAE/BD,IAAVC,GACD9B,QAAQC,IAAI,CACV9C,KAAK0qD,mBAAmBimC,WAAW3wF,KAAKiH,OAAQ,EAAG,EAAG,EAAGjH,KAAK+sB,KAAKjiB,UACnEjI,QAAQoD,YACPpF,KAAK,KACN,MAAM8D,EAAQ3E,KAAK0qD,mBAAmBouB,kBAAkB94E,KAAKiH,OAAQjH,KAAK+sB,KAAKjiB,UAAUnG,MAC5E,OAAVA,EACD6G,WAAW,KACTxL,KAAKmR,YACJ,IAEHnR,KAAKmR,SAASxM,MAIO,SAAnB3E,KAAK+sB,KAAK5pB,OAClB6lB,EAAU,IAAI,KAAU,CACtB/hB,OAAQjH,KAAKiH,OACb4E,QAAQ,IACPmJ,SAGL,OAAAzI,EAAA,GAAevM,KAAK4N,MAAOob,GAEL,SAAnBhpB,KAAK+sB,KAAK5pB,KAAiB,CAC5B,MAAMu+B,EAAO1hC,KAAKs7E,gBAAgBlgD,QAAQp7B,KAAKiH,SAChC,QAAZ,EAAAy6B,aAAI,EAAJA,EAAMpqB,cAAM,eAAEg1B,WACftsC,KAAK4N,MAAM7D,OAAO48B,OAKjB,gBACL,IAAI3mC,KAAKoiH,QAAS,OAElB,MAAMn7G,EAASjH,KAAKiH,OACpB,IAAIkQ,EAAQnX,KAAK8rG,wBAAwB9lE,iBAAiB/+B,GAAQ,GAC/DjH,KAAKs7E,gBAAgBnjD,YAAYlxB,IAClCjH,KAAKoiH,QAAQhiH,UAAUuB,OAAO,aAAc,gBAC5C3B,KAAKoiH,QAAQhiH,UAAUC,IAAI8W,EAAQ,eAAiB,cACpDnX,KAAKoiH,QAAQz/G,MAAMC,QAAU,IAE7B5C,KAAKoiH,QAAQz/G,MAAMC,QAAU,QClrBpB,MAAM,WAA4B,EAAjD,c,oBAMU,KAAAkI,SAAW,EACX,KAAAF,MAAQ,GAGhB,qBACE5K,KAAK2jH,UAAUC,YAAY5jH,KAAKiH,OAAQjH,KAAK8K,SAAU9K,KAAK4K,OAGpD,OACR5K,KAAKC,UAAUkP,GAAK,2BACpBnP,KAAKC,UAAUG,UAAUC,IAAI,sBAC7BL,KAAK0wE,YAAc,IAAI,EAAY,UACnC1wE,KAAK4N,MAAM8b,YAAY1pB,KAAK0wE,YAAYzwE,WAExCD,KAAK6jH,YAAc,EAAW,iCAC9B7jH,KAAKyN,OAAO1D,OAAO/J,KAAK6jH,aAExB,MAAMlwF,EAAIzzB,SAASC,cAAc,OACjCwzB,EAAEvzB,UAAUC,IAAI,sBAChBL,KAAK+K,WAAW9K,UAAUypB,YAAYiK,GACtC3zB,KAAK2jH,UAAY,IAAI,EAAUhwF,EAAG3zB,KAAK0wE,YAAa,CAClDzlE,SAAU,IAAI,EAAY,4BAA6B,cAI3D,KAAKhE,EAAgB6D,EAAmBw/E,EAAgD1/E,GACtF,MAAM27B,EAAMtjC,MAAM8N,OAsBlB,OApBI/Q,KAAKiH,OAiBPjH,KAAK2jH,UAAUC,YAAY5jH,KAAKiH,OAAQjH,KAAK8K,SAAUF,IAhBvD5K,KAAK4K,MAAQA,EACb5K,KAAKiH,OAASA,EACdjH,KAAK8K,SAAWA,EAChB9K,KAAKsqF,WAAaA,EAElBtqF,KAAK6jH,YAAYzjH,UAAUkM,OAAO,QAAStM,KAAKsqF,YAC7CtqF,KAAKsqF,YACN,YAAiBtqF,KAAK6jH,YAAa,KACjC,IAAI,GAAgB,IAAIxuE,KAAQr1C,KAAKsqF,YAAY/pE,SAIrD3V,GAAS5K,KAAK2jH,UAAUv5G,YAAYvI,WAAW6B,iBAAiBkH,GAEhE,GAAgBklC,eAAc,IAKzBvJ,GClDI,MAAM,GAqBnB,YAAoBylD,EAA4Bj/D,EAAoBniB,GAAhD,KAAAohF,SAA4B,KAAAj/D,OAAoB,KAAAniB,QAJ5D,KAAAH,WAAa,EACb,KAAAq5G,cAAgB,EAkGxB,KAAAruC,YAAexzE,IACb,OAAAyb,EAAA,GAAYzb,GACZ,IAAI,GAAgB,IAAIozC,KAAQr1C,KAAK+sB,KAAKC,QAAQs9D,YAAY/pE,QAGhE,KAAAwjG,aAAgBhgH,IACd,GAAG/D,KAAK++C,eAAgB,OAAO/+C,KAAK++C,eAEpC,MAAM93C,EAASlD,EAAKqI,QAAQnF,OAAO6gB,WAC7B6iE,GAAa5mF,EAAKqI,QAAQvF,UAAOnC,EAEjC4X,EAAQ,OAAA8oC,GAAA,GAAWrhD,GAEtBuY,IAAWtc,KAAKyK,WAAa,EAC9BzK,KAAKgkH,MAAM5gH,aAAa,WAAY,QAEpCpD,KAAKgkH,MAAM5/E,gBAAgB,YAGzB9nB,EAGFtc,KAAKikH,QAAQ7/E,gBAAgB,YAF7BpkC,KAAKikH,QAAQ7gH,aAAa,WAAY,QAKxCpD,KAAK89B,QAAQ19B,UAAUuB,OAAO,UAC9B3B,KAAK+sB,KAAKC,QAAQ8pB,iBAAiB12C,UAAUuB,OAAO,yBAEpD,MAAM+J,EAAM1L,KAAK+sB,KAAKkf,QAAQhlC,EAAQ0jF,GACtC3qF,KAAK++C,gBAAmBrzC,aAAe7I,QAAU6I,EAAM7I,QAAQoD,QAAQyF,IAAuB7K,KAAK,KACjGb,KAAK8jH,cAAgBxnG,EACrB,OAAA/P,EAAA,GAAevM,KAAKkkH,aAAc,eAAK,KAAM,CAAC5nG,EAAQ,EAAGtc,KAAKyK,cAE9D,MAAM05G,EAAgBnkH,KAAK2L,YAAY/B,KAAKK,kBACzCjK,KAAK8jH,eAAkBK,EAAgB,GACxCnkH,KAAK2jH,UAAUv4G,eAEhB6V,QAAQ,KACTjhB,KAAK++C,eAAiB,QAI1B,KAAAqlE,eAAkBniH,IAChB,MAAM4S,EAAS,OAAAwsB,GAAA,GAAUp/B,EAAE4S,OAAQ,MAChCA,GACD7U,KAAK+jH,aAAalvG,IAItB,KAAAwvG,cAAiBpiH,IACZjC,KAAKyK,aACNzK,KAAK+sB,KAAKC,QAAQ8pB,iBAAiB12C,UAAUkM,OAAO,yBACpDtM,KAAK89B,QAAQ19B,UAAUkM,OAAO,YAIlC,KAAAg4G,UAAariH,IACX,OAAAyb,EAAA,GAAYzb,GACZjC,KAAK+jH,aAAa/jH,KAAK2L,YAAY/B,KAAKmc,SAAS/lB,KAAK8jH,cAAgB,KAGxE,KAAAS,YAAetiH,IACb,OAAAyb,EAAA,GAAYzb,GACZjC,KAAK+jH,aAAa/jH,KAAK2L,YAAY/B,KAAKmc,SAAS/lB,KAAK8jH,cAAgB,KA7JtE9jH,KAAKgV,QAAU9U,SAASC,cAAc,OACtCH,KAAKgV,QAAQ5U,UAAUC,IAAI,iBAAkB,cAAe,sBAE5DL,KAAK0xE,QAAUxxE,SAASC,cAAc,UACtCH,KAAK0xE,QAAQtxE,UAAUC,IAAI,WAAY,aAAc,wBACrD,OAAAid,GAAA,QAAOtd,KAAK0xE,SAEZ1xE,KAAK0xE,QAAQ1wE,iBAAiB,QAAS,KACrChB,KAAKgsF,OAAO/rF,UAAUG,UAAUuB,OAAO,eACvC3B,KAAKgV,QAAQrT,SACb3B,KAAK0wE,YAAY/uE,SACjB3B,KAAK89B,QAAQn8B,SACb3B,KAAKwkH,OAAO7iH,SACZ3B,KAAKwkH,OAAOn7G,oBAAoB,QAASrJ,KAAKqkH,eAC9CrkH,KAAKykH,QAAQp7G,oBAAoB,QAASrJ,KAAKy1E,aAC/Cz1E,KAAKgkH,MAAM36G,oBAAoB,QAASrJ,KAAKskH,WAC7CtkH,KAAKikH,QAAQ56G,oBAAoB,QAASrJ,KAAKukH,aAC/CvkH,KAAK2L,YAAY/B,KAAKP,oBAAoB,QAASrJ,KAAKokH,gBACxDpkH,KAAK+sB,KAAKC,QAAQ8pB,iBAAiB12C,UAAUuB,OAAO,0BACnD,CAACgW,MAAM,IAEV3X,KAAK0wE,YAAc,IAAI,EAAY,UAGnC1wE,KAAK89B,QAAU59B,SAASC,cAAc,OACtCH,KAAK89B,QAAQ19B,UAAUC,IAAI,sBAAuB,sBAElDL,KAAK2L,YAAc,IAAI,GAAY,EAAO,gBAAYjH,EAAW,IAAI,GACrE1E,KAAK2L,YAAY/B,KAAK5I,iBAAiB,QAAShB,KAAKokH,gBAErDpkH,KAAK2jH,UAAY,IAAI,EAAU3jH,KAAK89B,QAAS99B,KAAK0wE,YAAa,CAC7DzlE,SAAUjL,KAAK2L,aACbhH,IACF3E,KAAKyK,WAAa9F,EAEd3E,KAAKyK,WAOPzK,KAAK+jH,aAAa/jH,KAAK2L,YAAY/B,KAAKmc,SAAS,KANjD/lB,KAAKkkH,aAAax6F,YAAY1pB,KAAK0wE,YAAYxuE,MAAQ,eAAK,YAAc,IAC1ElC,KAAK89B,QAAQ19B,UAAUuB,OAAO,UAC9B3B,KAAK+sB,KAAKC,QAAQ8pB,iBAAiB12C,UAAUuB,OAAO,yBACpD3B,KAAKgkH,MAAM5gH,aAAa,WAAY,QACpCpD,KAAKikH,QAAQ7gH,aAAa,WAAY,WAK1CpD,KAAK2jH,UAAUC,YAAY5jH,KAAK+sB,KAAK9lB,OAAQjH,KAAK+sB,KAAKjiB,UAGvD9K,KAAK+sB,KAAKC,QAAQ8pB,iBAAiB/sC,OAAO/J,KAAK89B,SAG/C99B,KAAKwkH,OAAStkH,SAASC,cAAc,OACrCH,KAAKwkH,OAAOpkH,UAAUC,IAAI,sBAE1BL,KAAKwkH,OAAOxjH,iBAAiB,QAAShB,KAAKqkH,eAC3C,OAAA/mG,GAAA,QAAOtd,KAAKwkH,QAEZxkH,KAAKkkH,aAAehkH,SAASC,cAAc,QAC3CH,KAAKkkH,aAAa9jH,UAAUC,IAAI,qBAEhCL,KAAKykH,QAAUvkH,SAASC,cAAc,UACtCH,KAAKykH,QAAQrkH,UAAUC,IAAI,WAAY,kBAEvCL,KAAK+gB,SAAW7gB,SAASC,cAAc,OACvCH,KAAK+gB,SAAS3gB,UAAUC,IAAI,wBAE5BL,KAAKgkH,MAAQ9jH,SAASC,cAAc,UACpCH,KAAKgkH,MAAM5jH,UAAUC,IAAI,WAAY,YACrCL,KAAKikH,QAAU/jH,SAASC,cAAc,UACtCH,KAAKikH,QAAQ7jH,UAAUC,IAAI,WAAY,cAEvCL,KAAKgkH,MAAM5gH,aAAa,WAAY,QACpCpD,KAAKikH,QAAQ7gH,aAAa,WAAY,QAEtCpD,KAAKykH,QAAQzjH,iBAAiB,QAAShB,KAAKy1E,aAC5Cz1E,KAAKgkH,MAAMhjH,iBAAiB,QAAShB,KAAKskH,WAC1CtkH,KAAKikH,QAAQjjH,iBAAiB,QAAShB,KAAKukH,aAC5CvkH,KAAK+gB,SAAShX,OAAO/J,KAAKgkH,MAAOhkH,KAAKikH,SAEtCjkH,KAAKwkH,OAAOz6G,OAAO/J,KAAKkkH,aAAclkH,KAAKykH,QAASzkH,KAAK+gB,UAEzD/gB,KAAKgsF,OAAO/rF,UAAU6Q,cAAc6P,aAAa3gB,KAAKwkH,OAAQz3F,EAAKhrB,MAAMglF,WAGzE/mF,KAAKgV,QAAQjL,OAAO/J,KAAK0xE,QAAS1xE,KAAK0wE,YAAYzwE,WAEnDD,KAAKgsF,OAAO/rF,UAAUG,UAAUC,IAAI,eACpCL,KAAKgsF,OAAO/rF,UAAU6Q,cAAc/G,OAAO/J,KAAKgV,SAEhDhV,KAAK0wE,YAAY3uE,MAAM0J,QAEvBb,IAAU5K,KAAK0wE,YAAY7uE,WAAWK,MAAQ0I,ICtFnC,MAAM,WAAa,IA2BhC,YAAmB4/E,EACVmhB,EACA/N,EACAlZ,EACAh6B,EACA4wB,EACAuN,EACAC,EACArrC,EACAmrC,EACAgjB,EACAjO,EACArK,EACAvK,EACA8iB,EACAhjG,EACAijG,EACAnuB,EACAqL,GAEP/lF,QApBiB,KAAAunF,eACV,KAAAmhB,kBACA,KAAA/N,iBACA,KAAAlZ,uBACA,KAAAh6B,qBACA,KAAA4wB,kBACA,KAAAuN,mBACA,KAAAC,oBACA,KAAArrC,qBACA,KAAAmrC,kBACA,KAAAgjB,qBACA,KAAAjO,kBACA,KAAArK,aACA,KAAAvK,mBACA,KAAA8iB,oBACA,KAAAhjG,UACA,KAAAijG,0BACA,KAAAnuB,kBACA,KAAAqL,wBAjCF,KAAA07B,gBAAiB,EASjB,KAAAvhH,KAAiB,OAIjB,KAAA0iF,QAAS,EAwBd7lF,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,OAAQ,YAErCL,KAAK2kH,aAAezkH,SAASC,cAAc,OAC3CH,KAAK2kH,aAAavkH,UAAUC,IAAI,mBAIhCL,KAAKgvD,IAAM,OAAAC,EAAA,GAAO,OAAQ,IAAS21D,IAAM,IAASC,KAAO,IAASC,MAAQ,IAASr5F,OAGnFzrB,KAAKC,UAAU8J,OAAO/J,KAAK2kH,cAC3B3kH,KAAKwqF,aAAar4E,eAAepI,OAAO/J,KAAKC,WAGxC,cAAcyU,GACnB,MAAMkuD,EAAQh6D,EAAA,QAAUq6D,WAExB,IAAIx9D,EACJ,GAA6B,UAA1Bm9D,EAAMD,WAAWx/D,MAA8D,aAA1CjD,SAASkwC,gBAAgBztC,MAAMskC,OAAuB,CAC5F,MAAM89E,EAAQ/kH,KAAK2kH,aAAa5yE,iBAC7BgzE,GAASA,EAAM34G,QAAQjJ,OAASy/D,EAAMD,WAAWx/D,OAClDsC,EAAOs/G,GAeX,OAXIt/G,IACFA,EAAOvF,SAASC,cAAc,OAC9BsF,EAAKrF,UAAUC,IAAI,wBACnBoF,EAAK2G,QAAQjJ,KAAOy/D,EAAMD,WAAWx/D,MAGV,UAA1By/D,EAAMD,WAAWx/D,OAClBsC,EAAK9C,MAAMwgE,gBAAkBP,EAAMD,WAAWntB,MAC9C/vC,EAAK9C,MAAMqiH,gBAAkB,QAGxB,IAAIniH,QAAeoD,IACxB,MAAM+xC,EAAK,KACT,MAAMt+B,EAAO1Z,KAAK2kH,aAAa5yE,iBAE5Br4B,IAASjU,GAKZzF,KAAK2kH,aAAa56G,OAAOtE,GAIzB,aAAQ,KACN,aAAQ,KACN,aAAcA,EAAM,cAAc,EAAM,IAAKiU,EAAO,KAClDA,EAAK/X,UACH,UAIRsE,KAhBEA,KAmBDyO,EACD,OAAA6rC,GAAA,GAAmB96C,EAAMiP,EAAKsjC,GAE9BA,MAKC,QAAQ70C,GACbnD,KAAKmD,KAAOA,EAEK,cAAdnD,KAAKmD,OACNnD,KAAKgJ,mBAAqB,IAAMhJ,KAAK0qD,mBAAmB3hD,4BAA4B/I,KAAKiH,SAKtF,OAGLjH,KAAKgsF,OAAS,IAAI,GAAWhsF,KAAM,GAAiBA,KAAK0qD,mBAAoB1qD,KAAKs7E,gBAAiBt7E,KAAK2rG,gBAAiB3rG,KAAK8rG,wBAAyB9rG,KAAK8oF,kBAAmB9oF,KAAK4oF,iBACpL5oF,KAAKgtB,QAAU,IAAI,GAAYhtB,KAAMA,KAAK0qD,mBAAoB1qD,KAAKy9C,mBAAoBz9C,KAAK4oF,gBAAiB5oF,KAAK0kF,qBAAsB1kF,KAAK6oF,iBAAkB7oF,KAAKs7E,gBAAiBt7E,KAAK8oF,kBAAmB9oF,KAAK+oF,iBAAkB/oF,KAAKgpF,uBACzOhpF,KAAK+B,MAAQ,IAAI,GAAU/B,KAAMA,KAAK0qD,mBAAoB1qD,KAAKgpF,sBAAuBhpF,KAAK49F,eAAgB59F,KAAK2rG,gBAAiB3rG,KAAKs7E,gBAAiBt7E,KAAK4rG,mBAAoB5rG,KAAKwqF,aAAcxqF,KAAK+oF,iBAAkB/oF,KAAK6rG,kBAAmB7rG,KAAK8rG,wBAAyB9rG,KAAK29E,gBAAiB39E,KAAK4oF,gBAAiB5oF,KAAK0kF,sBACjU1kF,KAAK8uC,UAAY,IAAI,GAAc9uC,KAAMA,KAAKgtB,QAAShtB,KAAK+B,MAAO/B,KAAK0qD,oBACxE1qD,KAAKilH,YAAc,IAAI,GAAgBjlH,KAAKgtB,QAAQ8pB,iBAAkB92C,KAAMA,KAAK0qD,mBAAoB1qD,KAAKs7E,gBAAiBt7E,KAAK29F,gBAAiB39F,KAAK49F,eAAgB59F,KAAKgpF,uBAE1J,SAAdhpF,KAAKmD,MACNnD,KAAKgsF,OAAOk5B,iBACZllH,KAAKgsF,OAAOm5B,wBACU,WAAdnlH,KAAKmD,KACbnD,KAAKgsF,OAAOo5B,yBACU,eAAdplH,KAAKmD,OACbnD,KAAKgsF,OAAOk5B,iBACZllH,KAAKgsF,OAAOq5B,8BAGdrlH,KAAKgsF,OAAOhlE,YACZhnB,KAAK+B,MAAMilB,YAEM,SAAdhnB,KAAKmD,MACNnD,KAAKgtB,QAAQm4F,uBACbnlH,KAAK+B,MAAMojH,wBACW,WAAdnlH,KAAKmD,MACbnD,KAAKgtB,QAAQo4F,yBACbplH,KAAK+B,MAAMqjH,0BACW,cAAdplH,KAAKmD,MACbnD,KAAKgtB,QAAQs4F,4BACbtlH,KAAK+B,MAAMojH,wBACW,eAAdnlH,KAAKmD,OACbnD,KAAKgtB,QAAQm4F,uBACbnlH,KAAK+B,MAAMojH,wBAGbnlH,KAAKC,UAAUG,UAAUC,IAAI,QAAUL,KAAKmD,MAC5CnD,KAAKC,UAAU8J,OAAO/J,KAAKgsF,OAAO/rF,UAAWD,KAAKgtB,QAAQ8pB,iBAAkB92C,KAAK+B,MAAMglF,WAEvF/mF,KAAKgtB,QAAQjf,eAAe1N,IAAIuI,EAAA,QAAhC5I,CAA2C,iBAAkB,EAAEsiC,cAAaC,gBACvEviC,KAAKiH,SAAWq7B,GACjBtiC,KAAKisC,QAAQ1J,KAIjBviC,KAAKgtB,QAAQjf,eAAe1N,IAAIuI,EAAA,QAAhC5I,CAA2C,cAAgBiC,IACtDA,EAAEgF,SAAWjH,KAAKiH,QACnBjH,KAAKwqF,aAAav+C,QAAQ,QAKzB,gBACLjsC,KAAKgtB,QAAQte,UAGR,UAGL1O,KAAKgsF,OAAOw3B,UACZxjH,KAAKgtB,QAAQw2F,UACbxjH,KAAK+B,MAAMyhH,iBAEJxjH,KAAKgsF,cACLhsF,KAAKgtB,eACLhtB,KAAK+B,aACL/B,KAAK8uC,iBACL9uC,KAAKilH,YAEZjlH,KAAKC,UAAU0B,SAKV,QAAQmzG,GAAY,GACzB90G,KAAK+B,MAAM2M,QAAQomG,GACnB90G,KAAK8uC,UAAUpgC,UAGV,QAAQzH,EAAgB0jF,GACzB1jF,EAEOjH,KAAK6lF,SACX7lF,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGdlO,KAAK6lF,QAAS,GAPd7lF,KAAK6lF,QAAS,EAUhB,MAAMgN,EAAW7yF,KAAKiH,SAAWA,EACjC,GAAI4rF,GAGG,GAAG7yF,KAAK++C,eACb,YAHAn2C,EAAA,QAAU6F,cAAc,gBAAiBzO,MACzCA,KAAKiH,OAASA,EAQhB,IAAIA,EAOF,OANA,GAAgB6oC,eAAc,GAC9B9vC,KAAK0O,SAAQ,GACb1O,KAAKgsF,OAAO//C,QAAQhlC,GACpBjH,KAAKgtB,QAAQif,QAAQhlC,QACrB2B,EAAA,QAAU6F,cAAc,eAAgBxH,GAM1C,IAAI4rF,EAAU,CACZ,MAAM0yB,EAAY,GAAgB50G,OAAO,IACtC40G,GACDA,EAAU7rF,QAGZ,GAAgBsW,eAAe/D,QAAQhlC,EAAQjH,KAAK8K,UACpD9K,KAAK+B,MAAMsgG,cACXriG,KAAK8uC,UAAUpgC,UACf1O,KAAKwlH,uBAGPxlH,KAAKmvC,YAAc0jD,EAEnB,MAAMxsF,EAASrG,KAAKgtB,QAAQif,QAAQhlC,EAAQ0jF,GAC5C,IAAItkF,EACF,OAGF,MAAM,QAACF,GAAWE,EAIZ04C,EAAiB/+C,KAAK++C,eAAiB54C,EAAQ8a,QAAQ,KACxDjhB,KAAK++C,iBAAmBA,IACzB/+C,KAAK++C,eAAiB,QAY1B,OARI8zC,IACF,GAAgB7iD,eAAey1E,aAAazlH,KAAK++C,gBACjD,GAAgB/O,eAAe01E,kBAAiB,IAM3Cr/G,EAGF,uBACL,MAAMY,EAASjH,KAAKiH,OACpB,IAAIA,EACF,OAGF,IAAI9D,EAUAA,EARA8D,EAAOo2B,SAONp2B,EAAO69B,YACD,WAEA,UATN79B,EAAOkxB,cACD,WAEA,SAUXn4B,KAAK03F,qBAAuB9uF,EAAA,QAAUo2B,SAAS2mF,aAAaxiH,GAGvD,aAAagoF,GAClB,OAAOnrF,KAAKisC,QAAQjsC,KAAKiH,OAAQkkF,GAG5B,iBAAiB8H,EAAmBI,EAAiB1I,GAC1D,GAAG3qF,KAAKmvC,YAAa,OAErB,IAAIloC,EAASjH,KAAKiH,OAClBjH,KAAKmvC,aAAc,EAEnBnvC,KAAK0O,SAAQ,GAEb1O,KAAKgsF,OAAO//C,QAAQhlC,GACpBjH,KAAKgsF,OAAOqC,iBAAiB4E,EAAUI,EAAQ1I,GAC/C3qF,KAAKgtB,QAAQqhE,mBACbruF,KAAK+B,MAAMssF,mBAEX,GAAgBr+C,eAAeV,sBAE/BtvC,KAAKgvD,IAAI42D,UAAU,QAAU3+G,EAAS,IAAMjH,KAAKmD,MAEjDyF,EAAA,QAAU6F,cAAc,eAAgBxH,GACxCjH,KAAK0kH,gBAAiB,EAGjB,qBACL,OAAO1kH,KAAK0qD,mBAAmB1hD,mBAAmBhJ,KAAKiH,QAGlD,WAAWJ,GAChB,OAAO7G,KAAK0qD,mBAAmBC,sBAAsB3qD,KAAKgJ,qBAAsBnC,GAI3E,aAAaA,GAClB,OAAO7G,KAAK0qD,mBAAmBihC,iBAAiB3rF,KAAK+kD,WAAWl+C,IAG3D,aACL,OAAO7G,KAAKiH,SAAW2B,EAAA,QAAU6O,MAAQzX,KAAKiH,SAAW,MAAmBjH,KAAKs7E,gBAAgBtO,WAAWhtE,KAAKiH,QAG5G,WAAW2D,GAChB,GAAI5K,KAAKiH,OAET,GAAGid,EAAA,EAAWC,SACZ,IAAI,GAAWnkB,KAAKgsF,OAAQhsF,KAAM4K,OAC7B,CACL,IAAI4E,EAAM,GAAgBmB,OAAO,IAC7BnB,IACFA,EAAM,IAAI,GAAoB,KAGhCA,EAAIuB,KAAK/Q,KAAKiH,OAAQjH,KAAK8K,SAAU9K,KAAKgtB,QAAQs9D,WAAY1/E,K,cC9XrD,MAAM,GAcnB,YAAoB4/E,GAAA,KAAAA,eAXZ,KAAA5sE,QAAiD,GAIjD,KAAAioG,eAAgB,EAChB,KAAAC,mBAAoB,EAGpB,KAAAC,eAAyB,EA+SzB,KAAAC,gBAAmB/jH,IAIzB,GAFAjC,KAAK8lH,mBAAoB,EAEtB,sBAAoB,CAErB,GADA,OAAApoG,EAAA,GAAYzb,GACiB,GAA1BjC,KAAK+lH,iBAIN,YADA/lH,KAAKu/B,OAFLv/B,KAAKimH,eAAejmH,KAAKgnF,YAO7BhnF,KAAKugB,QAtTC,OACNvgB,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,iBAAkB,YAAa,QAE5DL,KAAKkgB,QAAUhgB,SAASC,cAAc,OACtCH,KAAKkgB,QAAQ9f,UAAUC,IAAI,0BAE3B,MAAM6lH,EAAShmH,SAASC,cAAc,OAChCgmH,EAASjmH,SAASC,cAAc,OACtC+lH,EAAO9lH,UAAUC,IAAI,wBACrB8lH,EAAO/lH,UAAUC,IAAI,wBAET,CAAC,OAAQ,SAAU,YAAa,gBAAiB,YAAa,QACtEiG,QAAQqtB,IACV,MAAM9Y,EAAS,EAAW8Y,EAAG,CAAChmB,UAAU,IACxCu4G,EAAOn8G,OAAO/J,KAAK4d,QAAQ+V,GAAK9Y,GAEvB,SAAN8Y,EACD9Y,EAAO7Z,iBAAiB,YAAciB,IACpC,OAAAyb,EAAA,GAAYzb,GACZjC,KAAKwqF,aAAaz9D,KAAKhrB,MAAM6rG,cAAcj6E,GAC3C3zB,KAAKomH,oBAOP,YAAiBvrG,EAAS5Y,IACxB,OAAAyb,EAAA,GAAYzb,GACZjC,KAAK6tG,iBACL7tG,KAAKomH,sBAKXpmH,KAAKqmH,eAAiB,EAAW,OAAQ,CAAC14G,UAAU,IACpD3N,KAAKsmH,UAAYpmH,SAASC,cAAc,SACxC,gBAAMH,KAAKsmH,UAAW,qCAAiC5hH,EAAW,eAClE1E,KAAKsmH,UAAUlmH,UAAUC,IAAI,eAC7BL,KAAKsmH,UAAUtlH,iBAAiB,UAAYiB,IAC1C,MAAM0+D,GAAS3gE,KAAKsmH,UAAUpkH,MAAMC,UAAY,IAAkBuvD,SAAS1xD,KAAKsmH,UAAUpkH,OAE7E,UAAVD,EAAEsM,MACCoyD,EAQF3gE,KAAKumH,UAAUtkH,IAPZjC,KAAKsmH,UAAUlmH,UAAUuR,SAAS,WACnC3R,KAAKsmH,UAAUlmH,UAAUuB,OAAO,SAC3B3B,KAAKsmH,UAAU18E,YAGtB5pC,KAAKsmH,UAAUlmH,UAAUC,IAAI,aAOnCL,KAAKsmH,UAAUtlH,iBAAiB,QAAUiB,IACxC,MAAM0+D,EAAQ3gE,KAAKwmH,cAEnBxmH,KAAKsmH,UAAUlmH,UAAUkM,OAAO,WAAYq0D,GAC5C3gE,KAAKsmH,UAAUlmH,UAAUuB,OAAO,WAGlC3B,KAAKqmH,eAAerlH,iBAAiB,YAAciB,IAEjD,OAAAyb,EAAA,GAAYzb,GACZjC,KAAKC,UAAUG,UAAUuB,OAAO,WAEhC3B,KAAKimH,iBACLjmH,KAAKymH,qBACLzmH,KAAKomH,oBAGPpmH,KAAK0mH,gBAAkB,EAAW,kCAAmC,CAAC/4G,UAAU,IAChF3N,KAAK0mH,gBAAgB1lH,iBAAiB,YAAciB,IAElDjC,KAAKumH,UAAUtkH,KAGjB,MAAM0kH,EAAWzmH,SAASC,cAAc,OACxCwmH,EAASvmH,UAAUC,IAAI,uCAEvB,MAAMumH,EAAa1mH,SAASC,cAAc,QACpC0mH,EAAa3mH,SAASC,cAAc,QACpC2mH,EAAa5mH,SAASC,cAAc,QAC1CymH,EAAWxmH,UAAUC,IAAI,4BACzBwmH,EAAWzmH,UAAUC,IAAI,4BACzBymH,EAAW1mH,UAAUC,IAAI,4BACzB6lH,EAAOvlG,aAAaimG,EAAY5mH,KAAK4d,QAAQkb,MAC7C6tF,EAAS58G,OAAO+8G,EAAY9mH,KAAK0mH,iBACjCP,EAAOp8G,OAAO/J,KAAKqmH,eAAgBQ,EAAY7mH,KAAKsmH,UAAWK,GAG/D3mH,KAAKkgB,QAAQnW,OAAOm8G,EAAQC,GAC5BnmH,KAAKC,UAAU8J,OAAO/J,KAAKkgB,SAC3BhgB,SAASiW,KAAKpM,OAAO/J,KAAKC,WAE1BsL,OAAOvK,iBAAiB,SAAU,KAChChB,KAAKu/B,SAIF,iBACDv/B,KAAKC,WAAcD,KAAKC,UAAUG,UAAUuR,SAAS,eACvD3R,KAAKugB,OAGP,MAAM1F,EAAS7a,KAAK4d,QAAQkb,KAC5B94B,KAAKC,UAAUG,UAAUC,IAAI,WAE7B,MAAMyuC,EAAY5uC,SAASwnD,eAG3B,GAFA1nD,KAAKgnF,WAAal4C,EAAUq5C,WAAW,GAEpCttE,EAAOza,UAAUuR,SAAS,UAAW,CACtC,MACMzL,EADiBlG,KAAKgnF,WAAWyhB,eACT33F,cAC9B9Q,KAAKsmH,UAAUpkH,MAAQgE,EAAOmsD,UAE9BryD,KAAKsmH,UAAUpkH,MAAQ,GAGzBlC,KAAKymH,oBAAmB,GAExBj7G,WAAW,KACTxL,KAAKsmH,UAAU76G,SACd,KACHzL,KAAKsmH,UAAUlmH,UAAUkM,OAAO,WAAYtM,KAAKwmH,eAG3C,UAAUvkH,GAChB,OAAAyb,EAAA,GAAYzb,GACZjC,KAAKimH,iBACL,IAAIvxG,EAAM1U,KAAKsmH,UAAUpkH,MACtBwS,IAAQ,IAAkBqyG,iBAAiBryG,KAC5CA,EAAM,WAAaA,GAErB1U,KAAKwqF,aAAaz9D,KAAKhrB,MAAM6rG,cAAc,OAAQl5F,GACnDlJ,WAAW,KACTxL,KAAKu/B,QACJ,GAGG,cACN,OAAQv/B,KAAKsmH,UAAUpkH,MAAMC,UAAY,IAAkBuvD,SAAS1xD,KAAKsmH,UAAUpkH,OAG7E,eAAe6kE,EAAe/mE,KAAKgnF,YACzC,MAAMl4C,EAAYvjC,OAAOm8C,eACzB5Y,EAAU8Y,kBACV9Y,EAAUgnE,SAAS/uC,GACnB/mE,KAAKwqF,aAAaz9D,KAAKhrB,MAAM6lF,aAAan8E,QAGrC,OAGFzL,KAAKkO,OAERlO,KAAKC,UAAUG,UAAUuB,OAAO,cAEhCzB,SAASmJ,oBAAoB,UAAWrJ,KAAKgmH,iBAC7ChmH,KAAK8lH,mBAAoB,EAEzB/2G,EAAA,EAAwB6B,aAAa,UAElC5Q,KAAKgnH,aAAah6G,aAAahN,KAAKgnH,aACvChnH,KAAKgnH,YAAcz7G,OAAOC,WAAW,KACnCxL,KAAKgnH,iBAActiH,EACnB1E,KAAKC,UAAUG,UAAUC,IAAI,QAC7BL,KAAKC,UAAUG,UAAUuB,OAAO,YAC/B,MAGE,wBACL,MAAMslH,EChNK,WACb,MAAMA,EAAgB,GAChBn4E,EAAYvjC,OAAOm8C,eACzB,IAAI,IAAI18C,EAAI,EAAGA,EAAI8jC,EAAUm5C,aAAcj9E,EAAG,CAC5C,MAAM+7D,EAAQj4B,EAAUq5C,WAAWn9E,GACnC,IAAI,eAACy9F,EAAc,aAAEC,GAAgB3hC,EAGrC,IAF6B,IAA1B2hC,EAAavqB,WAAgBuqB,EAAeA,EAAap2C,YAEtDm2C,GAAkBA,IAAmBC,GACzCue,EAAMthH,KAAiC,IAA5B8iG,EAAetqB,SAAiBsqB,EAAiBA,EAAen2C,YAC3Em2C,EAAiBA,EAAe3vC,YAG/BmuD,EAAMA,EAAM9kH,OAAS,KAAOumG,GAC7Bue,EAAMthH,KAAK+iG,GAKf,OAAOue,EAAMr/G,OAAOue,KAAUA,GD6Ld+gG,GACR17B,EAAU,IAAI,IAAI3nF,IAAIojH,EAAMx+G,IAAI0d,GAAQA,EAAKzF,cAG7CymG,EAAmC,IAAItjH,IAY7C,OAXC2nF,EAA0BllF,QAAQ6f,IACjC,IAAI,MAAMhjB,KAAQ,KAAc,CAC9B,MAAMuzG,EAAM,KAAavzG,GACTgjB,EAAKihG,QAAQ1Q,EAAI9jG,MAAQ,yBAC1B5S,KAAKwqF,aAAaz9D,KAAKhrB,MAAM6lF,cAC1Cu/B,EAAe9mH,IAAIL,KAAK4d,QAAQza,OAM/B,IAAIgkH,GAGN,wBACL,MAAME,EAAgBrnH,KAAKsnH,wBAE3B,IAAI,MAAMt8G,KAAKhL,KAAK4d,QAAS,CAE3B,MAAM/C,EAAS7a,KAAK4d,QAAQ5S,GAC5B6P,EAAOza,UAAUkM,OAAO,SAAU+6G,EAAc3sF,SAAS7f,KAIrD,mBAAmB0sG,GAAe,GACxC,MACMxgD,EADY7mE,SAASwnD,eACHygC,WAAW,GAE7Bq/B,EAAWtnH,SAASiW,KAAK2F,wBACzB2rG,EAAgB1gD,EAAMjrD,wBACtB4rG,EAAY1nH,KAAKwqF,aAAaz9D,KAAKhrB,MAAMqrD,YAAYtxC,wBAE3D9b,KAAKC,UAAU0C,MAAMgrB,SAAW+5F,EAAUhnH,MAAQ,KAElD,MAAMinH,EAAeF,EAActzF,KAAuB,EAAhBqzF,EAASrzF,IAI7CyzF,GAFe5nH,KAAKC,UAAUG,UAAUuR,SAAS,WAAa3R,KAAKkgB,QAAQ6xB,iBAAmB/xC,KAAKkgB,QAAQL,mBAElF/D,wBACzBqY,EAAMwzF,EAAeC,EAAUjnH,OAAS,EAExCopC,EAAO29E,EAAU3qG,KACjBmlD,EAAQwlD,EAAU3qG,KAAO2qG,EAAUhnH,MAAS2B,KAAKC,IAAIolH,EAAUhnH,MAAOknH,EAAUlnH,OACtF,IAAIqc,EACJ,GAAGwqG,EAAc,CACf,MAAMM,EAAgB7nH,KAAKC,UAAU6b,wBACrCiB,EAAO,YAAM8qG,EAAc9qG,KAAMgtB,EAAMm4B,OAClC,CACL,MAAM3nD,EAAIktG,EAAc1qG,MAAQ0qG,EAAc/mH,MAAQknH,EAAUlnH,OAAS,EACzEqc,EAAO,YAAMxC,EAAGwvB,EAAMm4B,GAOxBliE,KAAKC,UAAU0C,MAAMga,UAAY,eAAeI,QAAWoX,UAGtD,OAML,GALGn0B,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGX8uF,KAED,YADAh9F,KAAKu/B,OAQP,QAJwB76B,IAArB1E,KAAKgnH,aACNh6G,aAAahN,KAAKgnH,aAGjBhnH,KAAKC,UAAUG,UAAUuR,SAAS,cACnC,OAGF3R,KAAK42G,wBAEL52G,KAAKC,UAAUG,UAAUuB,OAAO,WAChC,MAAMmmH,EAAc9nH,KAAKC,UAAUG,UAAUuR,SAAS,QACnDm2G,IACD9nH,KAAKC,UAAUG,UAAUuB,OAAO,QAChC3B,KAAKC,UAAUG,UAAUC,IAAI,kBAG/BL,KAAKymH,qBAEFqB,IACI9nH,KAAKC,UAAU2pC,WACpB5pC,KAAKC,UAAUG,UAAUuB,OAAO,kBAGlC3B,KAAKC,UAAUG,UAAUC,IAAI,cAEzB,cACF0O,EAAA,EAAwBoB,SAAS,CAC/BhN,KAAM,SACNiN,MAAO,KACLpQ,KAAKu/B,UAmCN,kBACFv/B,KAAK8lH,oBACR9lH,KAAK8lH,mBAAoB,EAIzB5lH,SAASc,iBAAiB,UAAWhB,KAAKgmH,gBAAiB,CAACruG,MAAM,KAG7D,kBACF,wBAAuB,cACxBzX,SAASmJ,oBAAoB,UAAWrJ,KAAKgmH,iBAC7C9lH,SAASc,iBAAiB,UAAYiB,IACpC,OAAAyb,EAAA,GAAYzb,GACZjC,KAAK+lH,eAAiB,EACtB/lH,KAAK8lH,mBAAoB,EACzB9lH,KAAK+nH,mBACJ,CAACpwG,MAAM,KAIP,kBACF3X,KAAK6lH,gBACR7lH,KAAK6lH,eAAgB,EACrB3lH,SAASc,iBAAiB,kBAAoBiB,IAG5C,GAAG/B,SAASgoF,gBAAkBloF,KAAKsmH,UACjC,OAGF,GAAGpmH,SAASgoF,gBAAkBloF,KAAKwqF,aAAaz9D,KAAKhrB,MAAM6lF,aAEzD,YADA5nF,KAAKu/B,OAIP,MAAMuP,EAAY5uC,SAASwnD,eAC3B,GAAGs1C,GAAiBluD,GAClB9uC,KAAKu/B,YAIP,GAAG,sBACD,GAAG,YACDv/B,KAAKugB,OACLvgB,KAAKymH,yBACA,CACL,GAA2B,IAAxBzmH,KAAK+lH,eAEN,YADA/lH,KAAK+lH,eAAiB,GAIxB/lH,KAAKgnF,WAAal4C,EAAUq5C,WAAW,GACvCnoF,KAAK+nH,uBAQP/nH,KAAK+nH,sBEpZb,SAASC,GAAaC,EAAYC,EAAYC,EAAuBC,EAAsBC,EAAmB9tG,EAAWE,GACvH,MAAO,CAACwtG,EAAI,IAAKC,EAAI,IACbC,EAAe,IACfC,EAAc,IACdC,EAAW,IACX9tG,EAAG,IAAKE,GAAIkN,KAAK,IAGZ,SAAS2gG,GAAiB/tG,EAAWE,EAAW/Z,EAAeC,EAAgB4nH,EAAYC,EAAY36D,EAAY46D,GAChI,MAAMnjD,EAAiB,GAwCvB,OArCAA,EAAK3/D,KAAK,KAAO4U,EAAI7Z,EAAQ,GAAK,IAAM+Z,GAGxC6qD,EAAK3/D,KAAK,KAAO4U,EAAI7Z,EAAQ8nH,IAE1BA,EAAK,GAENljD,EAAK3/D,KAAK,IAAMqiH,GAAaQ,EAAIA,EAAI,EAAG,EAAG,EAAIjuG,EAAI7Z,EAAS+Z,EAAI+tG,IAIlEljD,EAAK3/D,KAAK,KAAO8U,EAAI9Z,EAASktD,IAE3BA,EAAK,GAENyX,EAAK3/D,KAAK,IAAMqiH,GAAan6D,EAAIA,EAAI,EAAG,EAAG,EAAItzC,EAAI7Z,EAAQmtD,EAAMpzC,EAAI9Z,IAIvE2kE,EAAK3/D,KAAK,KAAO4U,EAAIkuG,IAElBA,EAAK,GAENnjD,EAAK3/D,KAAK,IAAMqiH,GAAaS,EAAIA,EAAI,EAAG,EAAG,EAAIluG,EAAI,EAAKE,EAAI9Z,EAAS8nH,IAIvEnjD,EAAK3/D,KAAK,KAAO8U,EAAI8tG,IAElBA,EAAK,GAENjjD,EAAK3/D,KAAK,IAAMqiH,GAAaO,EAAIA,EAAI,EAAG,EAAG,EAAIhuG,EAAIguG,EAAM9tG,EAAI,IAI/D6qD,EAAK3/D,KAAK,KAEH2/D,EAAK39C,KAAK,KAGnB,KAAe2gG,iBAAmBA,GCtDnB,MAAM,GAMnB,YAAYtsF,EAA+Bh5B,GAmBzC,IAAI0lH,EAnBqC,KAAA1lH,UA+C3C,KAAA2lH,WAAc1mH,IACZjC,KAAKC,UAAUG,UAAUC,IAAI,gBAI/B,KAAAuoH,YAAe3mH,IACbjC,KAAKC,UAAUG,UAAUuB,OAAO,gBAIlC,KAAAknH,OAAU5mH,IACRjC,KAAKgD,QAAQ6lH,OAAO5mH,IAnDpBjC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,OAAQ,aAErCL,KAAK8oH,eAAiB5oH,SAASC,cAAc,OAC7CH,KAAK8oH,eAAe1oH,UAAUC,IAAI,wBAElCL,KAAKukB,IAAMrkB,SAASskB,gBAAgB,6BAA8B,OAClExkB,KAAKukB,IAAInkB,UAAUC,IAAI,gBAEvBL,KAAKm8G,KAAOj8G,SAASskB,gBAAgB,6BAA8B,QACnExkB,KAAKm8G,KAAK/7G,UAAUC,IAAI,qBAGrB2C,EAAQqK,OACTq7G,EAAWxoH,SAASC,cAAc,OAClCuoH,EAAStoH,UAAUC,IAAI,YAAa,SAAW2C,EAAQqK,OAGzD,MAAM07G,EAAa7oH,SAASC,cAAc,OAI1C,IAAI6oH,EAHJD,EAAW3oH,UAAUC,IAAI,eACzB0oH,EAAWh/G,OAAO,eAAK/G,EAAQyK,OAAQzK,EAAQimH,aAG5CjmH,EAAQqpB,WACT28F,EAAe9oH,SAASC,cAAc,OACtC6oH,EAAa5oH,UAAUC,IAAI,iBAC3B2oH,EAAaj/G,OAAO,eAAK/G,EAAQqpB,YAGnCrsB,KAAKukB,IAAIxa,OAAO/J,KAAKm8G,MACrBn8G,KAAK8oH,eAAe/+G,OAAO/J,KAAKukB,KAEhCvkB,KAAKC,UAAU8J,UAAU,CAAC/J,KAAK8oH,eAAgBJ,EAAUK,EAAYC,GAAcphH,OAAOc,UAC1FszB,EAASjyB,OAAO/J,KAAKC,WAErBD,KAAKC,UAAUe,iBAAiB,WAAYhB,KAAK2oH,YACjD3oH,KAAKC,UAAUe,iBAAiB,YAAahB,KAAK4oH,aAClD5oH,KAAKC,UAAUe,iBAAiB,OAAQhB,KAAK6oH,QAiB/C,iBACS7oH,KAAKgD,QACZhD,KAAKC,UAAU0B,SACf3B,KAAKC,UAAUoJ,oBAAoB,WAAYrJ,KAAK2oH,YACpD3oH,KAAKC,UAAUoJ,oBAAoB,YAAarJ,KAAK4oH,aACrD5oH,KAAKC,UAAUoJ,oBAAoB,OAAQrJ,KAAK6oH,QAGlD,UACE,MAAMhtG,EAAO7b,KAAK8oH,eAAehtG,wBACjC9b,KAAKukB,IAAIE,eAAe,KAAM,sBAAuB,QACrDzkB,KAAKukB,IAAIE,eAAe,KAAM,UAAW,OAAO5I,EAAKnb,SAASmb,EAAKlb,UACnEX,KAAKukB,IAAIE,eAAe,KAAM,QAAS,GAAG5I,EAAKnb,OAC/CV,KAAKukB,IAAIE,eAAe,KAAM,SAAU,GAAG5I,EAAKlb,QAEhD,MAKM+e,EAAI4oG,GADEzzE,IAFEh5B,EAAKnb,MAFJ,GAGDmb,EAAKlb,OAHJ,gBAMfX,KAAKm8G,KAAK13F,eAAe,KAAM,IAAK/E,ICzFzB,SAASwpG,GAAkBthG,GACxCA,EAASthB,QAAQyJ,GAAMA,EAAG3P,UAAUC,IAAI,kBAExC,eAAYQ,KAAK,KACf+mB,EAASthB,QAAQyJ,GAAMA,EAAG3P,UAAUuB,OAAO,oB,ICNnCwnH,G,UCgBG,MAAM,WAA4B,KAC/C,YAAYhtD,EAAcitD,GACxBnmH,MAAM,yBAA0B,aAAgB,CAAC,CAC/C8xB,QAASq0F,EAAW9xG,OAAO+xG,UAAY,yBAA2B,uBAClErxF,SAAU,KACR,KAAWtB,UAAU,4BAA6B,CAACylC,SAClDt7D,KAAMyoH,IACL3yD,GAAA,EAAkB4yD,qBAAqBD,GACvC,MACMriH,EADQqiH,EAA4B5yD,MAAM,GAC5BvnD,GAAG2Y,UAAS,GAChClf,EAAA,QAAU6F,cAAc,gBAAiB,CAACxH,iBAG3C,CAACm4B,UAAU,EAAMjI,iBAAiB,EAAMhhB,MAAM,IAEnDnW,KAAKyN,OAAO9L,SAeZ,MAAMixB,EAAa,IAAI,GACvBA,EAAWxvB,aAAa,SAAU,KAClCwvB,EAAWxyB,UAAUC,IAAI,cACC,UAAvB+oH,EAAW5kH,MAAM4C,GAClBgiH,EAAW5kH,MAAQ,IAAiB29E,UAAUinC,EAAW5kH,OACzD8lB,GAAU,CACRrqB,UAAW2yB,EACXxuB,QAAS,KACTI,MAAO4kH,EAAW5kH,MAClBgmB,UAAW,IACXD,SAAU,IACVG,kBAAkB,IAEpBkI,EAAWjwB,MAAMjC,MAAQkyB,EAAWjwB,MAAMhC,OAAS,IAEnDiY,EAAA,EAAkB4wG,SAAS52F,EAAY,MAAc,EAAOw2F,EAAWx7G,OAGzE,MAAMA,EAAQ1N,SAASC,cAAc,OACrCyN,EAAMxN,UAAUC,IAAI,cACpBuN,EAAM3J,UAAY,IAAkBwoB,cAAc28F,EAAWx7G,OAG7D,MAAMuqB,EAAcixF,EAAW9xG,OAAO+xG,UAChCI,EAAc,eAAKtxF,EAAc,cAAgB,UAAW,CAACixF,EAAWv2D,qBAC9E42D,EAAYrpH,UAAUC,IAAI,2BAE1BL,KAAKmW,KAAKpM,OAAO6oB,EAAYhlB,EAAO67G,KDzExC,SAAYN,GACV,yBACA,mCACA,iCACA,6BAJF,CAAYA,QAAkB,K,oTEyEvB,MAAM97F,GAAuB,OAC9Bq8F,GAAmB,sBAAqB,aAAe,YAy8C7D,MAAM,GAAe,IAl8Cd,MA4BL,cA3BO,KAAAC,SAAWzpH,SAASuvC,eAAe,iBAGnC,KAAAm6E,SAAU,EACV,KAAAC,qBAAuB,EAIvB,KAAA9qE,eAAgC,KAEhC,KAAAsnC,OAAS,EAET,KAAA3vB,MAAgB,GAKf,KAAAozD,mBAAwD,GAwhBxD,KAAAC,aAAe,KACrB,MAAM5tD,EAAOzgB,SAASygB,KAChBzD,EAAWyD,EAAK95C,MAAM,KAEtBi3B,EAASt5C,KAAKgqH,eAAe7tD,EAAMzD,GAIzC,GAFA14D,KAAKgvD,IAAI,aAAcmN,EAAMzD,EAAS,GAAIpf,GAEvCA,EAAO2wE,OAAV,CACEl7G,EAAA,EAAwBm7G,eACxB,MAAM,QAACC,GAAW,IAAkBC,QAAQ9wE,EAAO2wE,QACnD,GAAGE,EAAS,CACV,MAAM7hH,EAAIpI,SAASC,cAAc,KACjCmI,EAAE+pD,KAAO/Y,EAAO2wE,OACf1+G,OAAe4+G,GAAS7hH,SAK7B,OAAOowD,EAAS,IACd,IAAK,OAAQ,CACX,MAAM/gC,EAAY2hB,EAAO3hB,EACzB,IAAI0yF,OAAyB3lH,IAAhB40C,EAAOgxE,KAAqB,IAAsBvvB,mBAAmBzhD,EAAOgxE,WAAQ5lH,EAEjG,OAAOizB,EAAE,IACP,IAAK,IACH33B,KAAK+xE,aAAap6C,EAAG0yF,GACrB,MAGF,QACErqH,KAAK+mD,aAAasjE,EAAS1yF,EAAE7P,UAAS,GAAQ6P,EAAE7P,WAAYuiG,OA4J9D,KAAAE,YAAc,KACpBrqH,SAASkwC,gBAAgBztC,MAAMolC,YAAY,uBAAwBn/B,EAAA,QAAUo2B,SAASgoC,iBAAmB,MAEzG9mE,SAASiW,KAAK/V,UAAUkM,OAAO,qBAAsB1D,EAAA,QAAUo2B,SAASC,mBACxE/+B,SAASiW,KAAK/V,UAAUkM,OAAO,qBAAqB,GACpDpM,SAASiW,KAAK/V,UAAUkM,OAAO,oBAAqB1D,EAAA,QAAUo2B,SAASC,mBAEvEj/B,KAAKwqH,wBAA0Bn1F,GAAS,KACtC,MAAM22D,EAAShsF,KAAK+sB,KAAKi/D,OACtBA,EAAOC,eACRD,EAAOC,cAAcC,gBAAgB,GAGvC,KAAWqH,WAAWvzF,KAAK+sB,KAAKC,QAAQrC,cAAc21B,UACrD13C,EAAA,QAAUo2B,SAASC,kBAAoB,IAAM,GAAG,GAAO,GAE1D4b,GAAA,EAAa4vE,QAAQ7hH,EAAA,QAAUo2B,SAASkb,SAAS15C,MACjDy/C,EAAA,EAAqB6kC,iBAAgB,GAErC,IAAI,MAAM/3D,KAAQ/sB,KAAK02D,MACrB3pC,EAAKy4F,uBAGP,UAAKkF,cAAc9hH,EAAA,QAAUo2B,SAAS2rF,aA4LhC,KAAAC,gBAAkB,CAAC3oH,EAA+B4oH,KACxD,MAAMC,EAAgBpoB,KACtB,GAAI1iG,KAAK+qH,WAAcD,EAAvB,CAKA,GAAG7oH,aAAa+oH,UAAW,CACzB,MAAMC,EAAShpH,EAAEipH,aAAal0D,OAEdi0D,EAAOt5G,SAAWs5G,EAAOt5G,SAAS,SAAWs5G,EAAO1uG,QAAQ,UAAY,IAEtF,OAAAmB,EAAA,GAAYzb,GAIhB,aAAkBA,GAAGpB,KAAM8hG,IACzB,GAAGA,EAAMxgG,OAAQ,CACf,GAAG2oH,EAED,YADAA,EAAcK,SAASxoB,GAIzB,MAAM5b,EAAY/mF,KAAK+sB,KAAKhrB,MAC5BglF,EAAU6b,eAAiBioB,IAAe,EAA2BljH,IAAIg7F,EAAM,GAAGx/F,MAAQ,QAAU,YACpG,IAAI,GAAcnD,KAAK+sB,KAAM41E,EAAO5b,EAAU6b,qBAp7BlDjsC,GAAA,EAAkB3rC,SAClB,KAAwBzL,QAExBvf,KAAKgvD,IAAM,OAAAC,EAAA,GAAO,KAAM,IAAS21D,IAAM,IAASC,KAAO,IAASC,MAAQ,IAASr5F,OAEjFzrB,KAAKmO,UAAU,GAEf5C,OAAOvK,iBAAiB,OAAQ,KAC9Bi/C,EAAA,EAAqB6kC,iBAAgB,GAErC9kF,KAAK4pH,QAAUhhH,EAAA,QAAUsnF,KAAKk7B,QAAS,EACvCprH,KAAKqrH,eACLz1E,cAAc51C,KAAK6pH,sBACnBjhH,EAAA,QAAU6F,cAAc,OAAQ7F,EAAA,QAAUsnF,KAAKk7B,QAE/C7/G,OAAOvK,iBAAiB,QAAS,KAC/BhB,KAAK4pH,QAAUhhH,EAAA,QAAUsnF,KAAKk7B,QAAS,EACvCprH,KAAKqrH,eACLrrH,KAAK6pH,qBAAuBt+G,OAAOugC,YAAY,IAAM9rC,KAAKqrH,eAAgB,KAG1EprE,EAAA,EAAqB6kC,iBAAgB,GAErCl8E,EAAA,QAAU6F,cAAc,OAAQ7F,EAAA,QAAUsnF,KAAKk7B,SAC9C,CAACzzG,MAAM,MAIZpM,OAAOvK,iBAAiB0oH,GAAkB,KACxC1pH,KAAK6pH,qBAAuBt+G,OAAOugC,YAAY,IAAM9rC,KAAKqrH,eAAgB,KAC1ErrH,KAAKqrH,eAELrrH,KAAK4pH,QAAUhhH,EAAA,QAAUsnF,KAAKk7B,QAAS,EACvCxiH,EAAA,QAAU6F,cAAc,OAAQ7F,EAAA,QAAUsnF,KAAKk7B,SAC9C,CAACzzG,MAAM,EAAM2D,SAAS,IAEzBtb,KAAKmS,eAAiBjS,SAASC,cAAc,OAC7CH,KAAKmS,eAAe/R,UAAUC,IAAI,kBAAmB,kBACrDL,KAAKmS,eAAe/F,QAAQrL,UAAY,aAExCf,KAAK2pH,SAAS5/G,OAAO/J,KAAKmS,gBAE1BnS,KAAKsrH,gBACLtrH,KAAKurH,eAAevrH,KAAK+sB,KAAK9sB,WAE9B8O,EAAA,EAAwBg7G,aAAe/pH,KAAK+pH,aAG5C/pH,KAAKuqH,cACL3hH,EAAA,QAAU5H,iBAAiB,mBAAoBhB,KAAKuqH,aAEpD,OAAAt5D,GAAA,GAAuB,KACrBhR,EAAA,EAAqBqmB,wBAAwB,QAC7CrmB,EAAA,EAAqB6kC,iBAAgB,IACpC,KACD7kC,EAAA,EAAqBqmB,wBAAwB,IAC7CrmB,EAAA,EAAqB6kC,iBAAgB,KAGvC9kF,KAAK8iE,oBAGL5+C,EAAA,EAAWljB,iBAAiB,eAAgB,CAACoH,EAAMunC,KAC9CzvC,SAASiW,KAAK/V,UAAUuR,S3DxIW,yB2DyIjCzR,SAASiW,KAAK/V,UAAUuR,SpHxKU,0BoHyKrC,GAAgBm+B,eAAc,KAIlClnC,EAAA,QAAU5H,iBAAiB,gBAAkBiB,IAC3C,IAAI,OAACgF,EAAM,SAAE6D,EAAQ,IAAEjE,GAAO5E,EAC3B6I,IAAUA,EAAW,IAAsBiwF,kBAAkBjwF,IAC7DjE,IAAKA,EAAM,IAAsBk0F,kBAAkBl0F,IAEtD7G,KAAK+mD,aAAa9/C,EAAQJ,EAAKiE,EAAW,kBAAepG,EAAWoG,KAGtElC,EAAA,QAAU5H,iBAAiB,gBAAkB+rB,IAC3C/sB,KAAKwrH,iBAAiBz+F,KAGxBnkB,EAAA,QAAU5H,iBAAiB,eAAgB,KACzChB,KAAK8iE,sBAGPl6D,EAAA,QAAU5H,iBAAiB,mBAAqByqH,IAC9CzrH,KAAK0rH,0BAA0BD,KAGjC7iH,EAAA,QAAU5H,iBAAiB,uBAAwB,KACjD,MAAM2qH,EAAQ,IAAI,KAAa,kCAA8BjnH,EAAW,CAACyyB,iBAAiB,IACpFxD,EAAIzzB,SAASC,cAAc,OACjCwzB,EAAEvzB,UAAUC,IAAI,kCACfsrH,EAAc1rH,UAAUypB,YAAYiK,GAErC,MAAMlmB,EAASvN,SAASC,cAAc,OACtCsN,EAAOrN,UAAUC,IAAI,UACrBoN,EAAO1D,OAAO,eAAK,sBAEnB,MAAMsiB,EAAWnsB,SAASC,cAAc,OACxCksB,EAASjsB,UAAUC,IAAI,YACvBgsB,EAAStiB,OAAO,eAAK,yBAErB4pB,EAAE5pB,OAAO0D,EAAQ4e,GAEjBnsB,SAASiW,KAAK/V,UAAUC,IAAI,eAE3BsrH,EAAc96G,QAAU,KACvB3Q,SAASiW,KAAK/V,UAAUC,IAAI,yBAE5BurH,GAAA,EAAeC,mBAEfrgH,WAAW,KACTtL,SAASiW,KAAK/V,UAAUuB,OAAO,cAAe,0BAC7C,MAGLgqH,EAAMprG,SAGRo8D,GAAA,EAAa3sE,IAAI,iBAAiBnP,KAAM8yB,IACtCgpD,GAAA,EAAaxhC,WAAW,gBAAiBxnB,GAAK,MAKhDi4F,GAAA,EAAeC,mBAEf,MAAMC,EAAgB,KACpBC,GAAA,QAAqBD,eAAc,IAGrChgF,YAAYggF,EAAe,MAC3BA,IAEA9rH,KAAKgsH,kBAAsB,CACzB1iH,KAAM,kBACN0uB,SAAU,CAACshB,EAAQtkC,KACjB,MAAMq9C,EAAOr9C,EAAQq9C,KAEf/pD,EAAI0M,EAAQq4B,WAAU,GAC5B/kC,EAAEkB,UAAY,aACdlB,EAAE4hB,UAAYmoC,EACd/pD,EAAE87B,gBAAgB,WAElB,IAAI,GAAU,mBAAoB,CAChC1Q,aAAc,eACd+D,mBAAoB,gBACpBG,oBAAqB,CAACtvB,GACtBsV,QAAS,CAAC,CACRmX,QAAS,OACTiD,SAAU,KACR1vB,EAAEszB,aAGLrb,UAIPvgB,KAAKgsH,kBAA+D,CAClE1iH,KAAM,iBACN0uB,SAAU,EAAEi0F,gBACV,MAAM,QAACliB,EAAO,IAAE7sC,GAAO+uD,EAOvB,IAAmBpoC,SAAS7jF,KAAK+sB,KAAK9lB,OAAQ,IAAM8iG,GAAW7sC,EAAM,IAAMA,EAAM,QAMrFl9D,KAAKgsH,kBAAkD,CACrD1iH,KAAM,kBACN0uB,SAAU,EAAEi0F,gBACV,MAAM,QAACC,GAAWD,EACdC,GAIJlsH,KAAK+sB,KAAK2lD,WAAW,IAAMw5C,EAAU,QAIzClsH,KAAKgsH,kBAA6D,CAChE1iH,KAAM,cACN0uB,SAAU,EAAEm0F,qBACV,MAAMrzF,EAAqB,CACzB1xB,EAAG+hH,GAAmBiD,YACtBz3G,IAAKw3G,EAAe,IAGtBnsH,KAAKqsH,oBAAoBvzF,MAK7B94B,KAAKgsH,kBAA0D,CAC7D1iH,KAAM,WACN0uB,SAAU,EAAEm0F,qBACV,MAAMrzF,EAAqB,CACzB1xB,EAAG+hH,GAAmBmD,UACtBC,OAAQJ,EAAe,IAAM/5D,mBAAmB+5D,EAAe,IAAI1oH,MAAM,IAG3EzD,KAAKqsH,oBAAoBvzF,MAI7B94B,KAAKgsH,kBAQF,CACD1iH,KAAM,KACN0uB,SAAU,EAAOm0F,iBAAgBF,eAAe,mCAC9C,IAAInzF,EAEFA,EADuB,MAAtBqzF,EAAe,GACT,CACL/kH,EAAG+hH,GAAmBqD,aACtB71F,QAASw1F,EAAe,GACxB7B,KAAM6B,EAAe,GACrBM,OAAQ,WAAYR,EAAYA,EAAUQ,YAAS/nH,EACnDgoH,QAAST,EAAUS,SAGd,CACLtlH,EAAG+hH,GAAmBwD,QACtBC,OAAQT,EAAe,GACvB7B,KAAM6B,EAAe,GACrBO,QAAST,EAAUS,SAIvB1sH,KAAKqsH,oBAAoBvzF,QAI7B94B,KAAKgsH,kBAqBF,CACD1iH,KAAM,UACNujH,SAAU,KACV70F,SAAU,EAAEi0F,gBACV,IAAInzF,EACoB,qBAArBmzF,EAAUW,SAGX9zF,EAAO94B,KAAK8sH,SAAS3D,GAAmBwD,QAASV,IAGnDjsH,KAAKqsH,oBAAoBvzF,MAI7B94B,KAAKgsH,kBAOF,CACD1iH,KAAM,cACNujH,SAAU,KACV70F,SAAU,EAAEi0F,gBACV,MAAMnzF,EAAO94B,KAAK8sH,SAAS3D,GAAmBqD,aAAcP,GAC5DjsH,KAAKqsH,oBAAoBvzF,MAI7B94B,KAAKgsH,kBAIF,CACD1iH,KAAM,cACNujH,SAAU,KACV70F,SAAU,EAAEi0F,gBACV,MAAMnzF,EAAO94B,KAAK8sH,SAAS3D,GAAmBiD,YAAaH,GAC3DjsH,KAAKqsH,oBAAoBvzF,MAI7B94B,KAAKgsH,kBAIF,CACD1iH,KAAM,WACNujH,SAAU,KACV70F,SAAU,EAAEi0F,gBACV,MAAMnzF,EAAO94B,KAAK8sH,SAAS3D,GAAmBmD,UAAWL,GACzDjsH,KAAKqsH,oBAAoBvzF,MAI7B94B,KAAK+pH,eACL/pH,KAAK+sH,wBA7UP,WACE,OAAOnkH,EAAA,QAAU6O,KAGnB,WACE,OAAOzX,KAAK02D,MAAM12D,KAAK02D,MAAMv0D,OAAS,GA2UhC,wBACN,MAAM6qH,EAAc,IAAInpH,IAAI,CAAC,SAAU,WAAY,OAAQ,YAqF3D3D,SAASiW,KAAKnV,iBAAiB,UApFZiB,I,MACjB,MAAMsM,EAAMtM,EAAEsM,IACd,GAAG3F,EAAA,QAAUqkH,iBAAmBD,EAAYrlH,IAAI4G,GAAM,OAEtD,MAAMsG,EAAS5S,EAAE4S,OAMXkY,EAAO/sB,KAAK+sB,KAElB,GAAc,SAAX9qB,EAAEggB,OAAoBhgB,EAAEyzG,UAAWzzG,EAAE0zG,SAA+B,UAAnB9gG,EAAO02B,QAA3D,CAEO,IAAGtpC,EAAEmgB,QAAmB,YAAR7T,GAA6B,cAARA,GAkBrC,GAAW,YAARA,EAAmB,CAC3B,GAAIwe,EAAKhrB,MAAM6sG,YAAa7hF,EAAKhrB,MAAMq+F,eA0BrC,OA1BqD,CACrD,MACM38F,EADiB,IAAmBq1E,kBAAkB/rD,EAAK9lB,OAAQ8lB,EAAKjiB,UACjD3G,QAAQV,MACrC,GAAGA,EAAMw5B,MAAM,KAASy3D,SAAWjxF,EAAMtB,OAAQ,CAC/C,IAAI+qH,EACJ,IAAI,MAAMrmH,KAAOpD,EAAO,CACtB,MAAMW,EAAU2oB,EAAKg4B,WAAWl+C,GAGhC,IAFa7G,KAAKyX,OAASsV,EAAK9lB,OAAS7C,EAAQwH,SAAW5L,KAAKyX,KAAOrT,EAAQkT,OAAO0M,MAGlF,IAAmBu7E,eAAexyE,EAAKg4B,WAAWl+C,GAAM,QAAS,CAClEqmH,EAAUrmH,EACV,OAQHqmH,IACDngG,EAAKhrB,MAAMi8F,mBAAmBkvB,GAC9B,OAAAxvG,EAAA,GAAYzb,WAMb,GAAW,cAARsM,EACR,WAhDgE,CAChE,MAAMu+D,EAAS,IAAmB3C,eAAeC,iBAAiBxhE,EAAA,QAAUqkE,UAAU,GACtF,IAAIkgD,EACJ,GAAIvkH,EAAA,QAAU3B,OAIP,CACL,MAAM5C,EAAMyoE,EAAO33D,UAAUtJ,GAAUA,EAAO5E,SAAW2B,EAAA,QAAU3B,QACnE,IAAY,IAAT5C,EAAY,CAEb8oH,EAAargD,EADa,YAARv+D,EAAoBlK,EAAM,EAAIA,EAAM,QAN7C,cAARkK,IACD4+G,EAAargD,EAAO,IAUrBqgD,GACDntH,KAAKisC,QAAQkhF,EAAWlmH,QAmC5B,IACa,QAAX,EAAA8lB,aAAI,EAAJA,EAAMhrB,aAAK,eAAE6lF,eACb3lF,EAAE4S,SAAWkY,EAAKhrB,MAAM6lF,cACL,UAAnB/yE,EAAO02B,UACN12B,EAAOqqF,aAAa,qBACpB,yBACCh7E,EAAA,EAAWC,UAA2B,IAAfnkB,KAAKqmF,SAC7Bt5D,EAAK+hB,UAAUC,cACfhiB,EAAKhrB,MAAMyqD,UACZ,CACAz/B,EAAKhrB,MAAM6lF,aAAan8E,QACxB,OAAAs3F,GAAA,GAAgBh2E,EAAKhrB,MAAM6lF,cAG3B,MAAMwlC,EAAW,IAAIC,cAAcprH,EAAEkB,KAAMlB,GAC3C8qB,EAAKhrB,MAAM6lF,aAAan5E,cAAc2+G,OAOpC,SAAuCjqH,EAAS8oH,GACtD,OAAO,eACL7kH,EAAGjE,GACA8oH,GAIM,oBAAoBnzF,G,0CAC/B,OAAOA,aAAI,EAAJA,EAAM1xB,GACX,KAAK+hH,GAAmBwD,QAAS,CAC/B,MAAMtC,EAASvxF,EAAKwxF,KAAO,IAAsBvvB,mBAAmBjiE,EAAKwxF,WAAQ5lH,EAC3E4oH,EAAYx0F,EAAK4zF,QAAU,IAAsB3xB,mBAAmBjiE,EAAK4zF,cAAWhoH,EAE1F1E,KAAK+xE,aAAaj5C,EAAK8zF,OAAQvC,OAAQ3lH,EAAW4oH,GAClD,MAGF,KAAKnE,GAAmBqD,aAAc,CACpC,MAAMx6G,EAAS8mB,EAAKnC,QAAQE,WACtB5vB,EAAS+K,EAAO8V,UAAS,GAG/B,GADa,IAAgB4Q,QAAQ1mB,GAC7BqpB,QACN,UACQ,IAAgBkyF,eAAev7G,GACrC,MAAMvF,GAEN,MADA0oB,GAAS,CAACC,YAAa,iBACjB3oB,EAIV,MAAM49G,EAAS,IAAsBtvB,mBAAmBjiE,EAAKwxF,MACvDx/G,EAAWguB,EAAK2zF,OAAS,IAAsB1xB,mBAAmBjiE,EAAK2zF,aAAU/nH,EAEpFoG,EAAU9K,KAAK6qF,WAAW5jF,EAAQojH,EAAQv/G,GACxC9K,KAAK+mD,aAAa9/C,EAAQojH,GAC/B,MAGF,KAAKlB,GAAmBiD,YACtB,IAAI,GAAc,CAACj9G,GAAI2pB,EAAKnkB,MAAM4L,OAClC,MAGF,KAAK4oG,GAAmBmD,UACtB,KAAW51F,UAAU,2BAA4B,CAC/CylC,KAAMrjC,EAAKyzF,SACV1rH,KAAKuoH,IACFA,EAAyCr8F,MAC3C,IAAgBygG,YAAapE,EAAyCr8F,MAAM,GAK1D,sBAAjBq8F,EAAWhiH,GACK,mBAAjBgiH,EAAWhiH,EAKb,IAAI,GAAoB0xB,EAAKyzF,OAAQnD,GAAY7oG,OAJ/CvgB,KAAK+mD,aAAaqiE,EAAWr8F,KAAK5d,GAAG2Y,UAAS,KAK9Crb,IACc,wBAAbA,EAAItJ,MACL+xB,GAAM,eAAK,oBAGf,MAGF,QACEl1B,KAAKgvD,IAAIp4C,KAAK,+BAAgCkiB,OAM5C,kBAA0E91B,GAQ/EuI,QAAgBvI,EAAQ6pH,SAAW7pH,EAAQ6pH,SAAW,IAAM,IAAM7pH,EAAQsG,MAAS0L,IAClF,OAAA0I,EAAA,GAAY,MAEZ,MAAM20C,EAAOr9C,EAAQq9C,KACrB,IAAI85D,EACAF,EAEAjpH,EAAQyqH,mBAAkBtB,EAAiB,IAAIroE,IAAI9uC,EAAQq9C,MAAMq7D,SAASrrG,MAAM,KAAK5e,MAAM,IAC3FT,EAAQ2qH,cAAa1B,EAAYjsH,KAAKgqH,eAAe33D,IAEzD,MAAM3mD,EAAM1I,EAAQg1B,SAAS,CAACm0F,iBAAgBF,aAAsBj3G,GACpE,YAAetQ,IAARgH,GAAoBA,GAIvB,eAAekiH,EAAal1D,EAAWk1D,EAAIvrG,MAAM,MACvD,MAAMi3B,EAAc,GACpB,OAAIof,EAAS,IACbA,EAAS,GAAGr2C,MAAM,KAAK/b,QAAQb,IAC7B6zC,EAAO7zC,EAAK4c,MAAM,KAAK,IAAM+vC,mBAAmB3sD,EAAK4c,MAAM,KAAK,MAG3Di3B,GALiBA,EAkDnB,aAAa9iB,EAAkBw6D,EAAgBlmF,EAAmBwiH,GACvE,OAAO,IAAgBroC,gBAAgBzuD,GAAU31B,KAAK6gC,IACpD,MACMz6B,EADoB,SAAXy6B,EAAKt6B,EACIs6B,EAAKvyB,GAAG2Y,WAAa4Z,EAAKvyB,GAAG2Y,UAAS,GAE9D,OAAGhd,EAAiB9K,KAAK6qF,WAAW5jF,EAAQ+pF,EAAOlmF,GAC3CwiH,EAAkBttH,KAAK6tH,YAAY5mH,EAAQ+pF,EAAOs8B,GAC9CttH,KAAK+mD,aAAa9/C,EAAQ+pF,IACpCvkF,IACc,0BAAbA,EAAItJ,KACLgyB,GAAS,CAACC,YAAa,oBACF,qBAAb3oB,EAAItJ,MACZgyB,GAAS,CAACC,YAAa,6BAQtB,WAAWnuB,EAAgB0jF,EAAmB7/E,GACnD,OAAO,IAAmB2wE,kBAAkBx0E,EAAQ6D,GAAUjK,KAAK,KACjE,MAAMuD,EAAU,IAAmBoV,iBAAiBvS,EAAQ6D,GAG5D,OAFA,IAAmBgjH,kCAAkC1pH,GAE9CpE,KAAK+mD,aAAa9/C,EAAQ0jF,EAAW,aAAc7/E,KAOvD,YAAY7D,EAAgB+pF,EAAes8B,GAChD,OAAO,IAAmBviC,qBAAqB9jF,EAAQ+pF,GAAOnwF,KAAKuD,GAC1DpE,KAAK6qF,WAAWzmF,EAAQ6C,OAAQqmH,EAAWlpH,EAAQyC,MAIvD,qBAAqBknH,GAAiB,GAC3C,MAAMnrD,EAAQh6D,EAAA,QAAUq6D,WAExB,GAA6B,UAA1BL,EAAMD,WAAWx/D,MAA+C,YAA1By/D,EAAMD,WAAWx/D,MAAsBy/D,EAAMD,WAAWiB,KAAO,CACtG,MAAMS,EAAe,kBAAgB2pD,WAAWhvF,SAASslC,OAAO7zD,KAAKC,GAAKA,EAAEpH,OAASs5D,EAAMt5D,MAI3F,KAH4Bs5D,EAAMD,WAAW6B,OAASH,EAAa1B,WAAW6B,MAC5E5B,EAAMD,WAAWiB,OAASS,EAAa1B,WAAWiB,MAGlD,OAAO5jE,KAAKiuH,cAAcrrD,EAAMD,WAAWiB,MAAM/iE,KAAM6T,GAC9C1U,KAAKkuH,cAAcx5G,EAAKq5G,GAC9B,KACDnrD,EAAMD,WAAa,YAAK0B,EAAa1B,YAC9B3iE,KAAKkuH,cAAc,IAAI,KAKpC,OAAOluH,KAAKkuH,cAAc,GAAIH,GAGxB,cAAcnqD,GACpB,OAAG5jE,KAAK8pH,mBAAmBlmD,GAAc5jE,KAAK8pH,mBAAmBlmD,GAC1D5jE,KAAK8pH,mBAAmBlmD,GAAQrvD,GAAA,EAAmBswD,aAAaspD,QAAQ,eAAiBvqD,GAAM/iE,KAAKgjD,GAClGC,IAAIC,gBAAgBF,IAIxB,cAAcnvC,EAAaq5G,GAAiB,GACjD,MAAM1vF,EAAWr+B,KAAK02D,MAAMjuD,IAAIskB,GAAQA,EAAKmhG,cAAcx5G,IAC3D,OAAO2pB,EAASA,EAASl8B,OAAS,GAAGtB,KAAK,KACrCktH,GACDnlH,EAAA,QAAU6F,cAAc,uBAKvB,iBAAiBse,GACtB,IAAK,CAAC,OAAQ,cAA6B2N,SAAS3N,EAAK5pB,QAAU4pB,EAAK9lB,OACtE,OAMA,MAAMmnH,EAAcrhG,EAAKC,QACnBmH,EAAMi6F,EAAYrjH,WAAWo+B,UAE7B56B,EAAMwe,EAAK9lB,QAAU8lB,EAAKjiB,SAAW,IAAMiiB,EAAKjiB,SAAW,IAE3DujH,EAAgB1xC,GAAA,EAAaviC,aAAa,iBAChD,GAAKg0E,EAAYrjH,WAAWghF,oBAAsB,IAAMqiC,EAAYrjH,WAAW5F,UAAU2X,SAAW9F,OAAOm1C,KAAKiiE,EAAYphG,SAAS7qB,cAU5HksH,EAAc9/G,GAErBvO,KAAKgvD,IAAI,6BAZkI,CAC3I,MAAM56B,EAAW,CACfnsB,KAAM,YAAqBmmH,EAAYphG,QAAS,QAChDmH,OAGFk6F,EAAc9/G,GAAO6lB,EAErBp0B,KAAKgvD,IAAI,uBAAwB56B,GAOnCuoD,GAAA,EAAahoE,IAAI,CAAC05G,kBAAgB,GAI/B,qBAAqBthG,GAC1B,IAAK,CAAC,OAAQ,cAA6B2N,SAAS3N,EAAK5pB,QAAU4pB,EAAK9lB,OACtE,OAGF,MAAMsH,EAAMwe,EAAK9lB,QAAU8lB,EAAKjiB,SAAW,IAAMiiB,EAAKjiB,SAAW,IAC3DsxC,EAAQugC,GAAA,EAAaviC,aAAa,iBACxC,OAAOgC,GAASA,EAAM7tC,GAGjB,0BACL,IAAIkxD,EACJ,MAAMmD,EAAQh6D,EAAA,QAAUq6D,WACrBL,EAAMD,WAAW7C,oBAClBL,EAAOmD,EAAMD,WAAW7C,mBACxB5/D,SAASkwC,gBAAgBztC,MAAMolC,YAAY,gCAAiC03B,IAE5Ev/D,SAASkwC,gBAAgBztC,MAAMywE,eAAe,kCAG5C,uBAAsB3T,IACxB72D,EAAA,QAAU0lH,W/ElqBT,SAAyB7uD,GAC9B,OAAOD,GAAiBC,GAAMh8D,MAAM,GAAI,G+EiqBb8qH,CAAgB9uD,IAIpC,kBAAkBmE,EAAe4qD,EAAwBT,GAS9D,OARA/tH,KAAKyuH,0BAEL7lH,EAAA,QAAU8lH,WAEPF,IACDxuH,KAAK8pH,mBAAmBlmD,GAAQ/gE,QAAQoD,QAAQuoH,IAG3CxuH,KAAK2uH,0BAAwCjqH,IAAnBqpH,IAAiCnqD,EAAOmqD,GA+BnE,eAAev+G,EAAkBJ,GACvC,GAAGpP,KAAK4uH,UAAYp/G,EAApB,CAQA,IAJe,IAAZJ,GAAqBpP,KAAK4uH,SAC3B1F,GAAkB,CAAC15G,EAAKxP,KAAK4uH,SAAShnH,OAAOc,UAG5C1I,KAAK4uH,QAAS,CACf5uH,KAAK4uH,QAAQxuH,UAAUuB,OAAO,UAC9B3B,KAAKwqH,0BAGF5hH,EAAA,QAAUo2B,SAASC,oBAAiC,IAAZ7vB,GACzC,aAA4B,OAAAhO,GAAA,GAAM,KAAY,KAGhD,MAAMytH,EAAU,OAAAzpE,GAAA,GAAWplD,KAAK4uH,SACpB,OAAAxpE,GAAA,GAAW51C,GACdq/G,GACP9/G,EAAA,EAAwBoB,SAAS,CAC/BhN,KAAM,OACNiN,MAAQC,IACNrQ,KAAKisC,QAAQ,UAAcvnC,EAAW2L,GACtC,OAAA26C,GAAA,QAMRx7C,EAAIpP,UAAUC,IAAI,UAClBL,KAAK4uH,QAAUp/G,GAGT,OACNtP,SAASc,iBAAiB,QAAShB,KAAK4qH,iBAAiB,GAErD,uBACF5qH,KAAK8uH,6BAIL9uH,KAAK2tG,cAAgB,IAAI,GAAc3tG,MACvCA,KAAK2tG,cAAcohB,kBAIf,6BACN,MAAMC,EAA2B,GAC3BC,EAAgC,GACtC,IAAIhiE,GAAU,EACd,MAAM3gD,EAAS,CAAMrK,EAAcitH,IAAmB,mCACpD,GAAGA,IAAUjiE,EAAS,OAEtB,MAAMg+D,EAAShpH,EAAEipH,aAAal0D,MAExBm4D,EAAUlE,EAAOt5G,SAAWs5G,EAAOt5G,SAAS,SAAWs5G,EAAO1uG,QAAQ,UAAY,EAElFuuG,EAAgBpoB,KACtB,IAAIysB,IAAanvH,KAAK+qH,YAAcD,EAElC,YADAl2D,EAAU,GAIZ,MAAMw6D,EAAkBtE,EAAgBuE,EAAsBC,EACxDC,EAASzE,EAAgBmE,EAAaD,EAE5C,GAAGE,IAAUK,EAAOptH,OAAQ,CAC1B,MAAM60D,QAAwB,aAAkB/0D,GAAG,GAC7C8/F,EAAQotB,IAAYn4D,EAAM70D,OAE1BqtH,EAAax4D,EAAMpvD,OAAO8I,GAAK,EAA2B/I,IAAI+I,IAAIvO,OAGxEnC,KAAKgvD,IAAI,aAAcgI,GAEpB8zD,GACDA,EAAc2E,YAAYL,IAEvBp4D,EAAM70D,QAAU4/F,IACjBwtB,EAAO5pH,KAAK,IAAI,GAAgBypH,EAAiB,CAC/C3hH,OAAQ,4BACRw7G,WAAY,CAACjyD,EAAM70D,QACnB0mH,OAAS5mH,IACPqK,EAAOrK,GAAG,GACV,GAAa+sD,IAAI,OAAQ/sD,GACzB,GAAa2oH,gBAAgB3oH,EAAG,mBAKnC+0D,EAAM70D,QAAU4/F,IACjBwtB,EAAO5pH,KAAK,IAAI,GAAgBypH,EAAiB,CAC/C/hH,KAAM,YACNI,OAAQ,iBACR4e,SAAU,uBACVw8F,OAAS5mH,IACPqK,EAAOrK,GAAG,GACV,GAAa+sD,IAAI,OAAQ/sD,GACzB,GAAa2oH,gBAAgB3oH,EAAG,iBAMnCutH,GAAcztB,IACfwtB,EAAO5pH,KAAK,IAAI,GAAgBypH,EAAiB,CAC/C/hH,KAAM,YACNI,OAAQ,iBACR4e,SAAU,qBACVw8F,OAAS5mH,IACPqK,EAAOrK,GAAG,GACV,GAAa+sD,IAAI,OAAQ/sD,GACzB,GAAa2oH,gBAAgB3oH,EAAG,aAKtCjC,KAAK+sB,KAAK9sB,UAAU8J,OAAOqlH,IAM/B,aAAcA,EAAiB,aAAcF,EAAO,IAAK,KACnDA,IACFK,EAAOjpH,QAAQopH,IACbA,EAAKlM,YAGP+L,EAAOptH,OAAS,KAIjB+sH,EACDK,EAAOjpH,QAAQopH,IACbA,EAAKC,YAGP/6D,EAAU,EAGZ10D,SAASiW,KAAK/V,UAAUkM,OAAO,cAAe4iH,GAC9CjiE,EAAUiiE,KAOZ,IAAIt6D,EAAU,EACd10D,SAASiW,KAAKnV,iBAAiB,YAAciB,IAC3C2yD,MAGF10D,SAASiW,KAAKnV,iBAAiB,WAAaiB,IAE1CqK,EAAOrK,GAAG,GACV,OAAAyb,EAAA,GAAYzb,KAGd/B,SAASiW,KAAKnV,iBAAiB,YAAciB,IAG3C2yD,IACe,IAAZA,GAEDtoD,EAAOrK,GAAG,KAId,MAAMqtH,EAAiBpvH,SAASC,cAAc,OAC9CmvH,EAAelvH,UAAUC,IAAI,mBAE7B,MAAMgvH,EAAsBC,EAAejiF,WAAU,GAG/C,U,MACN,MAAMpmC,EAAkB,QAAT,EAAAjH,KAAK+sB,YAAI,eAAE9lB,OAC1B,SAAUA,GAAU2B,EAAA,QAAUqkH,kBAAoB,IAAmBpmC,cAAc5/E,EAAQjH,KAAK+sB,KAAKjiB,SAAU,eAiC1G,UAAUqE,EAAYC,IACZ,IAAZA,GACD85G,GAAkB,CAAC,GAAet5G,UAAW5P,KAAK2pH,SAAU,GAAgB/5G,YAG9E1P,SAASiW,KAAK/V,UAAUkM,O3DvgCgB,uB2DugC4B,IAAP6C,GAE7D,MAAMw/C,EAAY3uD,KAAKqmF,MAEvBrmF,KAAKgvD,IAAI,YAAa7/C,EAAIw/C,GAE1B,IAAIne,EAAiC5nC,EAAA,QAAUo2B,SAASC,kBAAoB,eAAcp8B,QAAQoD,UAClG,IAAkB,IAAf0oD,GAAoBA,IAAcx/C,GAAMvG,EAAA,QAAUo2B,SAASC,oBAAiC,IAAZ7vB,EAAmB,CACpG,MAAMwgH,EAAqD,KAAnC1rG,EAAA,EAAWC,SAAW,IAAM,KACpDqsB,EAAmB,OAAApvC,GAAA,GAAMwuH,GACzB,aAA4Bp/E,EAAkBo/E,GAgChD,OAvBA5vH,KAAKqmF,MAAQl3E,EACb,OAAA67C,GAAA,KACG9mC,EAAA,EAAWC,UAA0B,IAAdwqC,GAAmBx/C,EAAK,GAChDjP,SAASiW,KAAK/V,UAAUuB,OpH5jCe,0BoH+jCvB,IAAfgtD,GAAoBx/C,EAAKw/C,IACvBx/C,EAAK,IAAMJ,EAAA,EAAwBC,eAAe,QACnDD,EAAA,EAAwBoB,SAAS,CAC/BhN,KAAM,KACNiN,MAAQC,IAENrQ,KAAKisC,QAAQ,UAAcvnC,EAAW2L,MAM9CzH,EAAA,QAAU6F,cAAc,gBAAiBU,GAKlCqhC,EAGF,eACL,OAAIxwC,KAAKyX,MAET,IAAgBo4G,cAAc7vH,KAAKyX,KAAMzX,KAAK4pH,SACvC,KAAWkG,gBAAgB,uBAAwB,CAAClG,QAAS5pH,KAAK4pH,WAHnD/mH,QAAQoD,UAMxB,gBACN,MAAM8mB,EAAO,IAAI,GAAK/sB,KACpB,IACA,IACA,GACA,IACA,IACA,IACA,UACA,GACA,IACA,KACA,KACA,KACA,KACA,KACA28E,GAAA,EACA,KACA,GACA,KAGC38E,KAAK02D,MAAMv0D,QACZ4qB,EAAK43F,aAAa56G,OAAO/J,KAAK+sB,KAAK43F,aAAa5yE,iBAAiB1E,WAAU,IAG7ErtC,KAAK02D,MAAM/wD,KAAKonB,GAGV,YAAYgjG,EAAmBC,GAAa,EAAM5gH,EAAmB6gH,GAC3E,KAAGF,GAAa/vH,KAAK02D,MAAMv0D,QAA3B,CAEGnC,KAAK02D,MAAMv0D,OAAS,GAAK6tH,GAC1BpnH,EAAA,QAAU6F,cAAc,gBAAiBzO,KAAK+sB,MAG5CkjG,IACFA,EAAUjwH,KAAK02D,MAAMjyD,OAAOsrH,EAAW/vH,KAAK02D,MAAMv0D,OAAS4tH,IAI7D,IAAI,IAAI/kH,EAAI,EAAGA,EAAIilH,EAAQ9tH,OAAS,IAAK6I,EACvC+D,EAAA,EAAwB6B,aAAa,QAAQ,GAY/C,GARGq/G,EAAQ9tH,OAAS,GAClB8tH,EAAQxsH,MAAM,GAAI,GAAG6C,QAAQymB,IAC3BA,EAAK9sB,UAAU0B,WAInB3B,KAAKurH,eAAevrH,KAAK+sB,KAAK9sB,UAAWmP,GAEtC4gH,EAAY,CACbpnH,EAAA,QAAU6F,cAAc,eAAgBzO,KAAK+sB,KAAK9lB,QAElD,MAAMs+G,EAAY,GAAgB50G,OAAO,IACtC40G,GACDA,EAAU7rF,QAGE,GAAgBsW,eAAe/D,QAAQjsC,KAAK+sB,KAAK9lB,OAAQjH,KAAK+sB,KAAKjiB,YAE/E,GAAgBklC,eAAe01E,kBAAiB,GAChD,GAAgB11E,eAAeV,uBAQnC2gF,EAAQ3pH,QAAQymB,IACdA,EAAKmjG,kBAGP1kH,WAAW,KAETykH,EAAQ3pH,QAAQymB,IACdA,EAAKy2F,aAEN,MAGE,QAAQv8G,EAAgB0jF,EAAoBv7E,GAC9CpP,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGd,MAAM6e,EAAO/sB,KAAK+sB,KACZojG,EAAYnwH,KAAK02D,MAAMn6C,QAAQwQ,GAErC,GAAI9lB,GAQG,GAAGkpH,EAAY,GAAKpjG,EAAK9lB,QAAU8lB,EAAK9lB,SAAWA,EAAQ,CAO9D,MAAMgpH,EAAUjwH,KAAK02D,MAAMjyD,OAAO,EAAGzE,KAAK02D,MAAMv0D,OAAS,GACzD,GAAGnC,KAAK+sB,KAAK9lB,SAAWA,EAEtB,YADAjH,KAAKowH,YAAY,GAAG,GAAM,EAAMH,GAE3B,CACL,MAAM1pF,EAAMvmC,KAAKisC,QAAQhlC,EAAQ0jF,GAEjC,OADA3qF,KAAKowH,YAAY,GAAG,GAAO,EAAOH,GAC3B1pF,QAtBD,CACV,GAAG4pF,EAAY,EAEb,YADAnwH,KAAKowH,YAAYD,OAAWzrH,EAAW0K,GAElC,GAAG8U,EAAA,EAAWs+F,eAAiB,IAAW5yE,OAE/C,YADA5vC,KAAKmO,YAAYnO,KAAKqmF,MAAOj3E,GA2BjC,GAAGnI,IAAW8lB,EAAK9lB,QAAUid,EAAA,EAAWs+F,cAAgB,IAAW5yE,QAAU1vC,SAASiW,KAAK/V,UAAUuR,S3DzrC7D,wB2D2rCtC,OADA3R,KAAKmO,UAAU,EAAGiB,IACX,EAGT,GAAGnI,GAAUid,EAAA,EAAWs+F,eAAiB,IAAW3yE,OAAQ,CAC1D,MAAMxpC,EAAS0mB,EAAKkf,QAAQhlC,EAAQ0jF,GAG9BxkF,GAAUE,aAAM,EAANA,EAAQyS,QAASzS,EAAOF,QAAUtD,QAAQoD,UACvDgB,GACDd,EAAQtF,KAAK,KAEX2K,WAAW,KACTA,WAAW,KACTxL,KAAKurH,eAAevrH,KAAK+sB,KAAK9sB,YAC7B,GACHD,KAAKmO,UAAU,EAAGiB,IACjB,KAKT,OAAInI,OAAJ,GACEjH,KAAKmO,UAAU,EAAGiB,IACX,GAIJ,aAAanI,EAAgB0jF,EAAoBxnF,EAAiB,OAAQ2H,GAC/E,GAAG7D,IAAW,OAAiBA,EAC7B,OAIF,MAAMopH,EAAgBrwH,KAAK02D,MAAMvhD,UAAU4X,GAAQA,EAAK9lB,SAAWA,GAAU8lB,EAAK5pB,OAASA,GAC3F,IAAsB,IAAnBktH,EAED,OADArwH,KAAKowH,YAAYC,EAAgB,GAC1BrwH,KAAKisC,QAAQhlC,EAAQ0jF,GAkB9B,OAfa3qF,KAAK+sB,KACV84D,QACN7lF,KAAKsrH,gBAGJnoH,IACDnD,KAAK+sB,KAAKujG,QAAQntH,GAEf2H,IACD9K,KAAK+sB,KAAKjiB,SAAWA,IAMlB9K,KAAKisC,QAAQhlC,EAAQ0jF,GAGvB,cAAc1jF,GACnBjH,KAAK+mD,aAAa9/C,OAAQvC,EAAW,aAG/B,iBAAiBH,GACvB,MAAMwL,EAAK7P,SAASC,cAAc,QAClC,IAAIwzB,EAAI,cAGR,OAFA5jB,EAAG3P,UAAUC,IAAIszB,GACjB5jB,EAAG3D,QAAQ7H,OAASA,EAAO6C,EACpB7C,EAAO6C,GACZ,IAAK,0BAEHusB,GAAK,QACL,IAAI,IAAI3oB,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAMulH,EAAMrwH,SAASC,cAAc,QACnCowH,EAAI/mH,UAAYmqB,EAAI,OACpB5jB,EAAGhG,OAAOwmH,GAEZ,MAGF,IAAK,+BACL,IAAK,kCACL,IAAK,+BACL,IAAK,+BACL,IAAK,+BACH58F,GAAK,UAIL,MAGF,IAAK,+BACL,IAAK,+BACL,IAAK,+BACHA,GAAK,UACL,MAGF,IAAK,iCACHA,GAAK,oBACL,IAAI,IAAI3oB,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAMwlH,EAAMtwH,SAASC,cAAc,OACnCqwH,EAAIhnH,UAAYmqB,EAAI,OACpB5jB,EAAGhG,OAAOymH,IAQhB,OAFAzgH,EAAG3P,UAAUC,IAAIszB,GAEV5jB,EAGF,cAAc9I,EAAgBhH,GACnC,IAAI,IAAgBwzF,MAAMxsF,GAAS,CACjC,MAAMwpH,EAAU,UAAkBC,eAAezpH,GACjD,IAAIwpH,IAAYA,EAAQtuH,OACtB,OAGF,MAAMwuH,EAASF,EAAQ,GAEjBG,EAEF,CACFC,QAAS,CACP,wBAA2B,gCAC3B,6BAAgC,iCAChC,gCAAmC,iCACnC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,0BAA6B,iCAC7B,+BAAkC,sCAEpC9jG,KAAM,CACJ,wBAA2B,gCAC3B,6BAAgC,iCAChC,gCAAmC,iCACnC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,kCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,6BAAgC,oCAChC,0BAA6B,iCAC7B,+BAAkC,sCAEpC+jG,MAAO,CACL,wBAA2B,uCAC3B,6BAAgC,wCAChC,gCAAmC,wCACnC,6BAAgC,yCAChC,6BAAgC,yCAChC,6BAAgC,yCAChC,6BAAgC,2CAChC,6BAAgC,2CAChC,6BAAgC,2CAChC,0BAA6B,wCAC7B,+BAAkC,8CAIhCC,EAAO9pH,EAAOo2B,SAAWuzF,EAAaC,QAAWJ,EAAQtuH,OAAS,EAAIyuH,EAAaE,MAAQF,EAAa7jG,KAC9G,IAAIxoB,EAASosH,EAAOpsH,OAEpB,GAAGksH,EAAQtuH,OAAS,EAAG,CACrB,MAAM0T,EAAS,GACf46G,EAAQnqH,QAAQqqH,IACd,MAAMxtH,EAAOwtH,EAAOpsH,OAAO6C,OACZ1C,IAAZmR,EAAE1S,KAAqB0S,EAAE1S,GAAQ,KAClC0S,EAAE1S,KAGH6T,OAAOm1C,KAAKt2C,GAAG1T,OAAS,IACzBoC,EAAS,CACP6C,EAAG,4BAKT,MAAMguB,EAAc27F,EAAKxsH,EAAO6C,GAChC,IAAIguB,EACF,OAGEn1B,IACFA,EAAYC,SAASC,cAAc,SACzBC,UAAUC,IAAI,SAAU,yBAGpB,mCAAbkE,EAAO6C,GACRnH,EAAUG,UAAUC,IAAI,oBAG1B,IAUI4N,EAVA+iH,EAAgB/wH,EAAU4f,kBAC1BmxG,EAICA,EAAc5kH,QAAQ7H,SAAWA,EAAO6C,GACzC4pH,EAActnG,YAAY1pB,KAAKixH,iBAAiB1sH,KAJlDysH,EAAgBhxH,KAAKixH,iBAAiB1sH,GACtCtE,EAAU2e,QAAQoyG,IAQjB/pH,EAAOw3B,cACRxwB,EAAO,CACL,IAAI,KAAU,CAAChH,OAAQ0pH,EAAOv+G,OAAO0V,UAAS,GAAQgsC,eAAe,IAAO9+C,QAC5Ey7G,EAAQtuH,OAAS,IAGrB,MAAM+uH,EAAqB,eAAK97F,EAAannB,GAK7C,OAJAijH,EAAmB9wH,UAAUC,IAAI,2BAE9BJ,EAAUgK,kBAAoB,EAAGhK,EAAU8xC,iBAAiBroB,YAAYwnG,GACtEjxH,EAAU8J,OAAOmnH,GACfjxH,GAIE,cAAcgH,G,gDACzB,IAAIolB,EACJ,GAAIplB,EAAJ,CAEA,GAAGA,EAAOw3B,YAAa,CACrB,IAAIoxB,EAAO7vD,KAAKmxH,cAAclqH,GAC9B,GAAG4oD,EACD,OAAOA,EAGT,MAAM79C,EAAS/K,EAAO4vB,WAChBgrF,QAAiB,UAAkBz+E,YAAYpxB,GACrDhS,KAAK+sB,KAAKiiC,IAAI,gBAAiB6yD,GAE/B,MAAMhvD,EAAqBgvD,EAAShvD,oBAAuBgvD,EAAS3jF,cAAgB2jF,EAAS3jF,aAAaA,cAAgB2jF,EAAS3jF,aAAaA,aAAa/7B,QAAW,EAItK,GAFAkqB,EAAW,UAAkBqS,qBAAqB1sB,GAE/C6gD,EAAqB,EACtB,OAAOxmC,EAGT,MAAM+kG,QAAgB,UAAkBC,WAAWr/G,GACnD,GAAGo/G,EAAU,EAAG,CACd,MAAMvhE,EAAO3vD,SAASC,cAAc,QAEpC0vD,EAAK9lD,UAAU,eAAK,CAACsiB,EAAU,eAAK,cAAe,CAAC,OAAAiqD,EAAA,GAAuB86C,OAAa,IACxF/kG,EAAWwjC,EAGb,OAAOxjC,EAEJ,CACL,MAAM4Y,EAAO,IAAgBC,QAAQj+B,GAErC,GAAG2B,EAAA,QAAU6O,OAASxQ,EACpB,OACK,GAAGg+B,EAAM,CAGd,GAFA5Y,EAAW,IAAgB9Z,oBAAoB0yB,EAAK91B,KAEhD,IAAgBskF,MAAMxsF,GAAS,CACjC,IAAI4oD,EAAO7vD,KAAKmxH,cAAclqH,GAO9B,GANI4oD,GAA2B,sBAAR,QAAX,EAAA5qB,EAAKmhB,cAAM,eAAEh/C,KACvByoD,EAAO3vD,SAASC,cAAc,QAC9B0vD,EAAKzvD,UAAUC,IAAI,UACnBwvD,EAAK9lD,OAAOsiB,IAGXwjC,EACD,OAAOA,EAIX,OAAOxjC,QAKN,cAAcplB,EAAgB+N,EAAsBq2B,EAAoBimF,EAAwB1kG,GAClGye,IACDr2B,EAAQ/Q,UAAYqtH,EAAgB,IAAM,IAI5C,MAAMC,EAAkBv8G,EAAQnF,cAAc,0BAC3C0hH,GAAmBvxH,KAAKmxH,cAAclqH,EAAQsqH,IAIjDvxH,KAAKwxH,cAAcvqH,GAAQpG,KAAMwrB,IAC3BO,KAIJ,OAAArgB,EAAA,GAAeyI,EAASqX,IAAailG,EAAgB,IAAM,OAIxD,yBAAyB9lG,GAC9B,IAAmB21D,UAAUnhF,KAAK+sB,KAAK9lB,OAAQ,CAACG,EAAGokB,EAAS,0BAA4B,qCAK5F,OAAmB,KAAeg/D,aAAe,IAClC,U,2SCn+CA,MAAM,WAIV,IA+DT,YACYv1E,EACVw8G,GAEAxuH,OAAM,GAHI,KAAAgS,aA1DF,KAAAy8G,OAA6E,GAC7E,KAAA7jH,QAAgG,GAChG,KAAA+P,QAAwH,GAIxH,KAAA6e,OAAS,EACT,KAAA3V,UAAkC,KAClC,KAAA6qG,oBAA4C,KAO5C,KAAAC,aAAc,EAId,KAAAC,OAAS3xH,SAASuvC,eAAe,cAejC,KAAAqiF,aAKN,GAGM,KAAAC,gBAAkB,EAClB,KAAAC,gBAAkB,EAClB,KAAAC,WAAa,EACb,KAAAC,WAAa,EA6Qb,KAAAC,aAAe,CAACjwH,EAAQlC,KAAK8xH,aAAaM,cAAclwH,SA9UzC,IAgVpBA,IACDlC,KAAKiyH,WAAa,EAClBjyH,KAAKkyH,WAAa,GAGpBlyH,KAAKqyH,gBAAgB1vH,MAAMga,UAAY,UAAUza,YAAgBA,MAAUlC,KAAKiyH,eAAejyH,KAAKkyH,cAEpGlyH,KAAK8xH,aAAaQ,OAAOlyH,UAAUkM,OAAO,WAtVvB,KAsVmCpK,GACtDlC,KAAK8xH,aAAaS,MAAMnyH,UAAUkM,OAAO,WAtVtB,IAsVkCpK,GAErDlC,KAAKwyH,WA1VkB,IA0VPtwH,IAuDlB,KAAAib,QAAWlb,IACT,GAAGjC,KAAKyyH,yBAA0B,OAElC,MAAM59G,EAAS5S,EAAE4S,OACjB,GAAsB,MAAnBA,EAAO02B,QAAiB,OAG3B,GAFA,OAAA7tB,EAAA,GAAYzb,GAET,sBAYD,OAXGjC,KAAK0yH,0BACN1lH,aAAahN,KAAK0yH,2BAElB1yH,KAAK2yH,SAASvyH,UAAUC,IAAI,4BAG9BL,KAAK0yH,0BAA4BnnH,OAAOC,WAAW,KACjDxL,KAAK2yH,SAASvyH,UAAUuB,OAAO,uBAC/B3B,KAAK0yH,0BAA4B,GAChC,MAKL,MAAME,EAAY5yH,KAAK4yH,YACvB,IAAIC,EAAqB,KACzB,MAAMp9B,EAAa,CAAC,eAAgB,uBAAwB,sBAAuB,uBAAwB,kBACxGm9B,GACDn9B,EAAW9vF,KAAK,uBAGlB8vF,EAAWhlF,KAAKoF,IACd,IAEE,GADAg9G,EAAQ,OAAA/wG,GAAA,GAAgBjN,EAAQgB,GAC7Bg9G,EAAO,OAAO,EACjB,MAAMpmH,GAAM,OAAO,KAGiBomH,IAAWD,GAAiC,QAAnB/9G,EAAO02B,SAAwC,UAAnB12B,EAAO02B,UAClGvrC,KAAK4d,QAAQ8b,MAAMkC,SAIf,KAAAknE,UAAa7gG,IAEnB,GAAG2G,EAAA,QAAUoZ,eAAiB,EAC5B,OAGF,MAAMzT,EAAMtM,EAAEsM,IAEd,IAAI2T,GAAO,EACA,eAAR3T,EACDvO,KAAK4d,QAAQ/Y,KAAK+2B,QACF,cAARrtB,EACRvO,KAAK4d,QAAQlE,KAAKkiB,QACF,MAARrtB,GAAuB,MAARA,EACpBvO,KAAK8yH,aACN9yH,KAAK+yH,WAAmB,MAARxkH,GAGlB2T,GAAO,GAGNjgB,EAAEyzG,SAAWzzG,EAAE0zG,WAChB31G,KAAK8yH,aAAc,GAGlB5wG,GACD,OAAAxE,EAAA,GAAYzb,IAIR,KAAA+wH,QAAW/wH,IACd2G,EAAA,QAAUoZ,eAAiB,GAIzB/f,EAAEyzG,SAAWzzG,EAAE0zG,UAClB31G,KAAK8yH,aAAc,EAEhB9yH,KAAK4yH,aACN5yH,KAAKmyH,iBAKH,KAAAc,QAAWhxH,IACjB,KAAG2G,EAAA,QAAUoZ,eAAiB,GAAM,OAAAF,GAAA,GAAgB7f,EAAE4S,OAAQ,0BAA4B7U,KAAK8yH,eAI/F,OAAAp1G,EAAA,GAAYzb,GAETjC,KAAK8yH,aAAa,CACnB,MAAMI,EAAcjxH,EAAE6+G,OAAS,EAE/B9gH,KAAK+yH,aAAaG,KA7ZpBlzH,KAAKgvD,IAAM,OAAAC,EAAA,GAAO,OAClBjvD,KAAK8mB,UAAY,IAAI,KACrB9mB,KAAK2xH,oBAAsB,IAAI,KAAqB,CAClD5qG,YAAY,EACZ9I,YAAY,IAEdje,KAAK8mB,UAAUE,YACfhnB,KAAK2xH,oBAAoB3qG,YACzBhnB,KAAK2qB,cAAgB,IAAI,KAEzB3qB,KAAK2yH,SAAWzyH,SAASC,cAAc,OACvCH,KAAK2yH,SAASvyH,UAAUC,IAAI8yH,sBAE5BnzH,KAAKozH,YAAclzH,SAASC,cAAc,OAC1CH,KAAKozH,YAAYhzH,UAAUC,IAAI,YAE/B,MAAMgzH,EAAUnzH,SAASC,cAAc,OACvCkzH,EAAQjzH,UAAUC,IA5FgB,gBA8FlC,MAAM2rF,EAAShsF,KAAKgsF,OAAS9rF,SAASC,cAAc,OACpD6rF,EAAO5rF,UAAUC,IAAI8yH,sBAAoCA,uBAEzD,MAAMG,EAAapzH,SAASC,cAAc,OAC1CmzH,EAAWlzH,UAAUC,IAAI8yH,4BAEzBnzH,KAAK4d,QAAQ,gBAAkB,EAAW,QAAS,CAAC21G,YAAY,IAGhEvzH,KAAK0xH,OAAOzxH,UAAYC,SAASC,cAAc,OAC/CH,KAAK0xH,OAAOzxH,UAAUG,UAAUC,IAAI8yH,sBAAoC,aACxE,MAAMK,EAActzH,SAASC,cAAc,OAE3CH,KAAK0xH,OAAOt6F,SAAW,IAAI,GAC3Bp3B,KAAK0xH,OAAOt6F,SAASh3B,UAAUC,IAAI8yH,uBAAqC,aAExEnzH,KAAK0xH,OAAO5nH,OAAS5J,SAASC,cAAc,OAC5CH,KAAK0xH,OAAO5nH,OAAO1J,UAAUC,IAAI8yH,qBAEjCnzH,KAAK0xH,OAAO5oG,KAAO5oB,SAASC,cAAc,OAC1CH,KAAK0xH,OAAO5oG,KAAK1oB,UAAUC,IAAI8yH,qBAE/BK,EAAYzpH,OAAO/J,KAAK0xH,OAAO5nH,OAAQ9J,KAAK0xH,OAAO5oG,MAEnD9oB,KAAK0xH,OAAOzxH,UAAU8J,OAAO/J,KAAK0xH,OAAOt6F,SAAUo8F,GAGnD,MAAM9jD,EAAaxvE,SAASC,cAAc,OAC1CuvE,EAAWtvE,UAAUC,IAAI8yH,wBAEzB1B,EAAW7tH,OAAO,CAAC,WAAY,OAAQ,UAAU0C,QAAQgD,IACvD,MAAMuR,EAAS,EAAWvR,EAAM,CAACqE,UAAU,IAC3C3N,KAAK4d,QAAQtU,GAAQuR,EACrB60D,EAAW3lE,OAAO8Q,KAGpB7a,KAAK4d,QAAQ61G,KAAKrzH,UAAUC,IAAI,WAGhCL,KAAK8xH,aAAa7xH,UAAYC,SAASC,cAAc,OACrDH,KAAK8xH,aAAa7xH,UAAUG,UAAUC,IAAI,kBAE1CL,KAAK8xH,aAAaQ,OAAS,EAAW,UAAW,CAAC3kH,UAAU,IAC5D3N,KAAK8xH,aAAaQ,OAAOtxH,iBAAiB,QAAS,IAAMhB,KAAK+yH,YAAW,IACzE/yH,KAAK8xH,aAAaS,MAAQ,EAAW,SAAU,CAAC5kH,UAAU,IAC1D3N,KAAK8xH,aAAaS,MAAMvxH,iBAAiB,QAAS,IAAMhB,KAAK+yH,YAAW,IAExE/yH,KAAK8xH,aAAaM,cAAgB,IAAI,GAAc,CAClDj2G,KAvJY,GAwJZ7Z,IAtJiB,GAuJjBR,IAtJiB,EAuJjB2Z,gBAAgB,GAzJK,GA2JvBzb,KAAK8xH,aAAaM,cAActzG,eAChC9e,KAAK8xH,aAAaM,cAAcrzG,YAAY,CAC1C9C,QAASjc,KAAKmyH,aACdx3G,UAAW,IAAM3a,KAAKmyH,iBAGxBnyH,KAAK8xH,aAAa7xH,UAAU8J,OAAO/J,KAAK8xH,aAAaQ,OAAQtyH,KAAK8xH,aAAaM,cAAcnyH,UAAWD,KAAK8xH,aAAaS,OAE1HvyH,KAAK2yH,SAAS5oH,OAAO/J,KAAK8xH,aAAa7xH,WAGvCD,KAAK6N,QAAQinB,KAAO50B,SAASC,cAAc,OAC3CH,KAAK6N,QAAQinB,KAAK10B,UAAUC,IAAI8yH,wBAEhCnzH,KAAK6N,QAAQ5N,UAAYC,SAASC,cAAc,OAChDH,KAAK6N,QAAQ5N,UAAUG,UAAUC,IAAI8yH,0BAErCnzH,KAAK6N,QAAQiF,MAAQ5S,SAASC,cAAc,OAC5CH,KAAK6N,QAAQiF,MAAM1S,UAAUC,IAAI8yH,sBAEjCnzH,KAAK6N,QAAQ5N,UAAU8J,OAAO/J,KAAK6N,QAAQiF,OAE3C9S,KAAK6N,QAAQinB,KAAK/qB,OAAO/J,KAAK6N,QAAQ5N,WACtCozH,EAAQtpH,OAAO/J,KAAK6N,QAAQinB,MAC5B90B,KAAKozH,YAAYrpH,OAAOspH,GAGxBC,EAAWvpH,OAAO/J,KAAK4d,QAAQ,gBAAiB5d,KAAK0xH,OAAOzxH,WAC5D+rF,EAAOjiF,OAAOupH,EAAY5jD,GAE1B1vE,KAAK4d,QAAQlE,KAAOxZ,SAASC,cAAc,OAC3CH,KAAK4d,QAAQlE,KAAKlQ,UAAY,mDAC9BxJ,KAAK4d,QAAQlE,KAAKzV,UAAY,4DAE9BjE,KAAK4d,QAAQ/Y,KAAO3E,SAASC,cAAc,OAC3CH,KAAK4d,QAAQ/Y,KAAK2E,UAAY,oDAC9BxJ,KAAK4d,QAAQ/Y,KAAKZ,UAAY,4DAE9BjE,KAAKqyH,gBAAkBnyH,SAASC,cAAc,OAC9CH,KAAKqyH,gBAAgBjyH,UAAUC,IAAI8yH,uBAEnCnzH,KAAK2yH,SAAS5oH,OAAO/J,KAAKozH,YAAapzH,KAAK4d,QAAQlE,KAAM1Z,KAAK4d,QAAQ/Y,KAAM7E,KAAKgsF,OAAQhsF,KAAKqyH,iBAI/FryH,KAAK0zH,cAnIP,aACE,OAAO1zH,KAAKiV,WAAW7P,QAGzB,WAAWlD,GACTlC,KAAKiV,WAAW7P,QAAUlD,EAiIlB,eA6BR,GA5BAlC,KAAK4d,QAAQgO,SAAS5qB,iBAAiB,QAAShB,KAAK2zH,iBACrD,CAAC3zH,KAAK4d,QAAQ8b,MAAO15B,KAAK4d,QAAQ,gBAAiB5d,KAAK2xH,oBAAoB7qG,WAAWxgB,QAAQyJ,IAC7FA,EAAG/O,iBAAiB,QAAShB,KAAK05B,MAAMnzB,KAAKvG,SAG9C,CAAC,EAAE,EAAGA,KAAK4d,QAAQlE,MAAO,CAAC,EAAG1Z,KAAK4d,QAAQ/Y,OAAmCyB,QAAQ,EAAEstH,EAAY/4G,MACnGA,EAAO7Z,iBAAiB,QAAUiB,IAChC,OAAAyb,EAAA,GAAYzb,GACTjC,KAAK6zH,iBAER7zH,KAAKiV,WAAWG,GAAGw+G,OAIvB5zH,KAAK4d,QAAQ61G,KAAKzyH,iBAAiB,QAAS,KACvChB,KAAK4yH,YAAa5yH,KAAKwyH,YAAW,GAEnCxyH,KAAK+yH,YAAW,KAIpB/yH,KAAK2yH,SAAS3xH,iBAAiB,QAAShB,KAAKmd,SAE7Cnd,KAAKiV,WAAWlP,OAAS,CAACN,EAAMO,KAC3BA,EAAOhG,KAAKu1E,YAAY9vE,GACtBzF,KAAKi1E,YAAYxvE,IAGrB,sBAAoB,CACA,IAAI,GAAa,CACpCuP,QAAShV,KAAK2yH,SACdzqF,QAAS,CAACL,EAAOC,KACf,GAAG,GAAY/kB,eACb,OAKF,GADiB1gB,KAAKovB,IAAIoW,GAAStL,GAAA,EAAWmX,QAChC,IAAM7L,EAAQ,IAS1B,OANGA,EAAQ,EACT7nC,KAAK4d,QAAQlE,KAAKkiB,QAElB57B,KAAK4d,QAAQ/Y,KAAK+2B,SAGb,EAIT,OADkBv5B,KAAKovB,IAAIqW,GAASvL,GAAA,EAAWC,QAChC,IAAMsL,EAAQ,OAC3B9nC,KAAK4d,QAAQ8b,MAAMkC,SACZ,IAKX8L,kBAAoBosF,GAEyB,UAAvCA,EAAIj/G,OAAuB02B,UAAuB,OAAAzpB,GAAA,GAAgBgyG,EAAIj/G,OAAQ,2BAUhF,WAAWw7B,GACnB,MAAMqvC,EAAY1/E,KAAK4yH,YAKvB,IAJG5yH,KAAK8xH,aAAaM,cAAc72G,WAAavb,KAAK8yH,eACnDziF,GAAS,GAGRqvC,IAAcrvC,EAAQ,YAEX3rC,IAAX2rC,IACDA,GAAUqvC,GAGZ1/E,KAAK4d,QAAQ61G,KAAKrzH,UAAUkM,OAAO,WAAY+jC,GAC/CrwC,KAAK8xH,aAAa7xH,UAAUG,UAAUkM,OAAO,aAAc+jC,GAC3D,MAAM0jF,EAAY1jF,EAASrwC,KAAK8xH,aAAaM,cAAclwH,MAAQ,EAQnE,GAPAlC,KAAKmyH,aAAa4B,GAClB/zH,KAAK8xH,aAAaM,cAAch2G,YAAY23G,GAEzC/zH,KAAKg0H,aACNh0H,KAAKg0H,YAAYC,cAAa5jF,QAAiB3rC,GAG9C2rC,EAAQ,CACT,GAAIrwC,KAAKk0H,iBAuBPl0H,KAAKk0H,iBAAiBp1G,mBAvBG,CACzB,IAAIgrB,EAAmBqqF,EACvB,MAAM77E,GAAc,EACpBt4C,KAAKk0H,iBAAmB,IAAI,GAAa,CACvCl/G,QAAShV,KAAKqyH,gBACdrqF,aAAc,KACZ8B,EAAYqqF,EAAY,EACxBn0H,KAAKqyH,gBAAgBjyH,UAAUC,IAAI,kBAErC6nC,QAAS,CAACL,EAAOC,MACdD,EAAOC,GAAS,CAACD,EAAQyQ,EAAYxQ,EAAQwQ,GAC9Ct4C,KAAKiyH,YAAcpqF,EAAQiC,EAC3B9pC,KAAKkyH,YAAcpqF,EAAQqsF,GAC1BrqF,EAAWqqF,GAAa,CAACtsF,EAAOC,GAEjC9nC,KAAKmyH,gBAEP5qF,QAAS,KACPvnC,KAAKqyH,gBAAgBjyH,UAAUuB,OAAO,kBAExCslC,OAAQ,SAMZjnC,KAAK8xH,aAAaM,cAAch2G,YAAY23G,QACnC1jF,GACTrwC,KAAKk0H,iBAAiBx1G,kBAIhB,WAAWre,GACnBL,KAAK8xH,aAAaM,cAAcgC,YA3UlB,IA2U2C/zH,EAAM,GAAK,IACpEL,KAAKmyH,eAkBG,YACR,OAAOnyH,KAAK8xH,aAAa7xH,UAAUG,UAAUuR,SAAS,cAG9C,iBAAiBiM,GACzB,MAAMy2G,EAAgB,GAAiB,CAACd,YAAY,GAAO,cAAe31G,GAC1E5d,KAAKgsF,OAAOjiF,OAAOsqH,GAGd,MAAMpyH,G,MAKX,GAJGA,GACD,OAAAyb,EAAA,GAAYzb,GAGXjC,KAAKyyH,yBAA0B,OAAO5vH,QAAQ6oB,SAEjD3c,EAAA,EAAwB6B,aAAa,SAErC5Q,KAAK2qB,cAAcxgB,QAEnB,MAAMhE,EAAUnG,KAAKs0H,iBAA4B,QAAX,EAAAt0H,KAAK6U,cAAM,eAAEG,SAAS,GAAMnU,KAAK,EAAEk+B,oBAAoBA,GA6B7F,OA3BA/+B,KAAKiV,WAAW7L,QACfpJ,KAAKiV,WAAmBvG,SAAY1O,KAAKiV,WAAmBvG,UAC7D1O,KAAK6zH,gBAAkB,KACvB7zH,KAAKy8B,QAAU,EACdlxB,OAAegpH,oBAAiB7vH,EAE9B1E,KAAKk0H,mBACNl0H,KAAKk0H,iBAAiBx1G,kBACtB1e,KAAKk0H,sBAAmBxvH,GAS1B6G,OAAOlC,oBAAoB,UAAWrJ,KAAK8iG,WAC3Cv3F,OAAOlC,oBAAoB,QAASrJ,KAAKgzH,SACzCznH,OAAOlC,oBAAoB,QAASrJ,KAAKizH,QAAS,CAACnnG,SAAS,IAE5D3lB,EAAQ8a,QAAQ,KACdjhB,KAAK2yH,SAAShxH,SACdiH,EAAA,QAAUqkH,iBAAkB,EAC5BhtE,EAAA,EAAqB6kC,iBAAgB,KAGhC3+E,EAsGO,iBAAiB0O,EAAqB2/G,GAAU,EAAOC,EAAY,G,0CACjFz0H,KAAKyO,cAAc,kBAEnB,MAAMokH,EAAQ7yH,KAAK6N,QAAQglH,MAEvB2B,IACF3B,EAAM5uH,UAAY,IAIpB,MAAM8vH,EAAY/zH,KAAK4yH,aAAe4B,EAAyBx0H,KAAK8xH,aAAaM,cAAclwH,MA9fxE,EA+felC,KAAK00H,sBAAsB7B,GAEjE,MAAM8B,EAA0B,IAAdF,EAEZp6B,EAAQzxF,EAAA,QAAUo2B,SAASC,kBAAqB01F,EAAY,IAAM,IAAO,EAY/E,IAAIC,EAEA/4G,EACDhH,IACEA,aAAkB,IAAiBA,EAAOzU,UAAUuR,SAAS,cAC9DijH,EAAa//G,EACbgH,EAAOhH,EAAOiH,yBACNjH,aAAkBggH,iBAAmBhgH,EAAO/D,yBAAyBgkH,yBAC7EF,EAAa,OAAA9yG,GAAA,GAAgBjN,EAAQ,cACrCgH,EAAO+4G,EAAW94G,yBACVjH,EAAOzU,UAAUuR,SAAS,4BAClCijH,EAAa,OAAA9yG,GAAA,GAAgBjN,EAAQ,6BACrCgH,EAAO+4G,EAAW94G,wBAGf04G,GAAW3/G,EAAOiH,wBAAwBiB,OAASlB,EAAKkB,OACzDlI,EAAS+/G,EAAa/4G,OAAOnX,KAK/BmQ,IACFA,EAAS7U,KAAK6N,QAAQiF,OAGpB+I,IACF+4G,EAAa//G,EAAO/D,cACpB+K,EAAOhH,EAAOiH,yBAGhB,IAAIi5G,GAAc,EAClB,GAAGlgH,IAAW7U,KAAK6N,QAAQiF,QAAU+B,EAAOzU,UAAUuR,SAAS,0BAA2B,CACxF,MACMqjH,ECxlBG,SAAwBhgH,EAAsBigH,GAC3D,MAAMp5G,EAAO7G,EAAQ8G,wBACfo5G,EAAeD,EAAgBn5G,wBAErC,IAAKqY,IAAKghG,EAAar4G,OAAQs4G,GAAkBF,EAGjD,MAAMG,EAASJ,EAAgBplH,cAAc,WAC7C,GAAGwlH,EAAQ,CAETF,EADmBE,EAAOv5G,wBACDgB,OAG3B,GAAGjB,EAAKsY,KAAOihG,GACVv5G,EAAKiB,QAAUq4G,GACft5G,EAAK6tB,OAASwrF,EAAan4G,MAC3BlB,EAAKkB,MAAQm4G,EAAaxrF,MAC7B,OAAO,KAGT,MAAM4rF,EAAW,CACfnhG,KAAK,EACLuV,OAAO,EACP5sB,QAAQ,EACRC,MAAM,EACNpB,SAAU,EACV45G,WAAY,GAIR19G,EAAS,mBAAoBtM,OAASA,OAAOiqH,eAAiBjqH,OAE9DkqH,GADc59G,EAAEnX,OAASmX,EAAE69G,WACZ79G,EAAElX,QAAUkX,EAAE89G,aAEnC,MAAO,CACL95G,KAAM,CACJsY,IAAKtY,EAAKsY,IAAMghG,GAA+B,IAAhBA,GAAqBG,EAASnhG,KAAM,IAAQmhG,EAAS35G,SAAUw5G,GAAet5G,EAAKsY,IAClHuV,MAAO,EACP5sB,OAAQjB,EAAKiB,OAASs4G,GAAkBA,IAAmBK,GAAgBH,EAASx4G,QAAS,IAAQw4G,EAAS35G,SAAUy5G,GAAkBv5G,EAAKiB,OAC/IC,KAAM,GAERu4G,YD+iBsBM,CAAehB,EADX,OAAA9yG,GAAA,GAAgB8yG,EAAY,gBAGjDJ,GAAaQ,GAAiD,IAAlCA,EAAYM,SAAS35G,UAAsD,IAApCq5G,EAAYM,SAASC,YAIjFP,GAAkD,IAAlCA,EAAYM,SAAS35G,UAAsD,IAApCq5G,EAAYM,SAASC,aACpFR,GAAc,IAHdH,GADA//G,EAAS7U,KAAK6N,QAAQiF,OACFhC,cACpB+K,EAAOhH,EAAOiH,yBAMlB,MAAM+rG,EAAgB7nH,KAAK6N,QAAQiF,MAAMgJ,wBAEzC,IACIiB,EACAoX,EA6BAurB,EA/BA/iC,EAAY,GAgChB,GA5BGg4G,GACD53G,EAAqB,IAAd03G,EAAkBl4F,GAAA,EAAWmX,SAAWm0E,EAAcnnH,MAC7DyzB,EAAM0zF,EAAc1zF,MAEpBpX,EAAOlB,EAAKkB,KACZoX,EAAMtY,EAAKsY,KAWbxX,GAAa,eAAeI,OAAUoX,UAYnCtf,aAAkBghH,kBAAoBhhH,aAAkBihH,kBAAuC,QAAnBjhH,EAAO02B,QAAmB,CACvG,GAAGsnF,EAAMhzG,mBAAqBgzG,EAAMhzG,kBAAkBzf,UAAUuR,SAAS,yBAA0B,CACjG+tC,EAAWmzE,EAAMhzG,kBAEjB,MAAMsB,EAASu+B,EAAS7vC,cAAc,iBACtC,GAAGsR,EAAQ,CACT,MAAMrB,EAAQqB,EAAOtB,kBACrB6/B,EAAS31C,OAAO+V,GAChBqB,EAAOxf,SAGL+9C,EAAS/8C,MAAMuT,UACjB28G,EAAMzyH,UAAUuB,OAAO,UACvB3B,KAAK+1H,cAAcr2E,EAAUmoE,EAAehsG,GACvCg3G,EAAMjpF,WACXipF,EAAMzyH,UAAUC,IAAI,gBAGtBq/C,EAAWx/C,SAASC,cAAc,OAClCu/C,EAASt/C,UAAUC,IAAI,yBACvBwyH,EAAMj0G,QAAQ8gC,GAGhBA,EAAS/8C,MAAMuT,QAAU,UAAU2F,EAAKnb,oBAAoBmb,EAAKlb,gCAAgCknH,EAAcnnH,MAAQmb,EAAKnb,UAAUmnH,EAAclnH,OAASkb,EAAKlb,cAGpKkyH,EAAMlwH,MAAMjC,MAAQmnH,EAAcnnH,MAAQ,KAC1CmyH,EAAMlwH,MAAMhC,OAASknH,EAAclnH,OAAS,KAI5C,MAAMq1H,EAASn6G,EAAKnb,MAAQmnH,EAAcnnH,MACpCu1H,EAASp6G,EAAKlb,OAASknH,EAAclnH,OACvCg0H,IACFh4G,GAAa,WAAWq5G,KAAUC,SAGpC,IAAI9oE,EAAe5hD,OAAO2qH,iBAAiBtB,GAAYuB,iBAAiB,iBACxE,MAAMC,EE3qBK,SAA2BzuD,GACxC,IAAIjP,EAAWiP,EAAItlD,MAAM,KACzB,GAAuB,IAApBq2C,EAASv2D,OAAc,CACpBu2D,EAAS,KAAIA,EAAS,GAAK,OAC/B,IAAI,IAAI1tD,EAAI0tD,EAASv2D,OAAQ6I,EAAI,IAAKA,EACpC0tD,EAAS1tD,GAAK0tD,EAAS1tD,EAAI,IAAM0tD,EAAS,IAAM,MAIpD,OAAOA,EFkqBc29D,CAAkBlpE,GAOrC,GANAA,EAAeipE,EAAW3tH,IAAI2V,GAAMihD,SAASjhD,GAAK43G,EAAU,MAAMruG,KAAK,KACnEgtG,IACF9B,EAAMlwH,MAAMwqD,aAAeA,GAI1BqnE,GAAyB,IAAdT,EAAiB,CAG7B,MAAMuC,EAAa/5F,GAAA,EAAWmX,QAAU,EAAI73B,EAAKnb,MAAQ,EACnD61H,EAAYh6F,GAAA,EAAWC,QAAU,EAAI3gB,EAAKlb,OAAS,EACnDoc,EAAOlB,EAAKkB,KAAOu5G,EACnBniG,EAAMtY,EAAKsY,IAAMoiG,EACvBv2H,KAAKqyH,gBAAgB1vH,MAAMga,UAAY,UAAUq5G,YAAiBC,MAAWl5G,MAASoX,UAEtF0+F,EAAMlwH,MAAMga,UAAYA,EAS1B,IAAIw/F,EANJ4Y,IAAgBlC,EAAMlwH,MAAM4pD,QAAU,KAOtC,MAAM1O,EAAQhpC,EAAOzU,UAAUuR,SAAS,UAElCiG,EAAW5X,KAAKyyH,yBAA2B,eAC3ClsF,EAAM,CAACxH,eAAgBnnB,GAEvB9K,EAAUtB,WAAW,KACrBoM,EAASooC,aAAgBpoC,EAAS4+G,YACpC5+G,EAAS3R,WAEV,KAYH,GAVA2R,EAASqJ,QAAQ,KACfjhB,KAAKyO,cAAc,iBAEhBzO,KAAKyyH,2BAA6B76G,IACnC5X,KAAKyyH,yBAA2B,MAGlCzlH,aAAaF,KAGX0nH,EA+JF,OArCG3/G,aAAkB4hH,gBACnBta,EAAO0W,EAAMhjH,cAAc,QAExBssG,GACDn8G,KAAK02H,aAAava,EAAM0L,EAAemO,EAAQ37B,GAAO,EAAOx8C,EAAOsP,IAIrEt4C,EAAOzU,UAAUuR,SAAS,uBAC3BkhH,EAAMzyH,UAAUC,IAAI,UAGtBL,KAAK2yH,SAASvyH,UAAUC,IAAI,aAC5BmL,WAAW,KACTxL,KAAK2yH,SAASvyH,UAAUuB,OAAO,WAC9B,GAIH6J,WAAW,KACTqnH,EAAMlwH,MAAMwqD,aAAeA,EAExB0lE,EAAMhzG,oBACNgzG,EAAMhzG,kBAAkCld,MAAMwqD,aAAeA,IAE/DktC,EAAQ,GAEX7uF,WAAW,KACTqnH,EAAM5uH,UAAY,GAClB4uH,EAAMzyH,UAAUuB,OAAO,SAAU,SAAU,UAC3CkxH,EAAMlwH,MAAMuT,QAAU,iBAEtB0B,EAAS3R,WACRo0F,GAEHw4B,EAAMzyH,UAAUuB,OAAO,WAEhB4kC,EA/JI,CACX,IAAIowF,EACAliH,EAEJ,GAAGI,aAAkBihH,iBAAkB,CACrC,MAAMluG,EAAWzf,MAAMC,KAAKyM,EAAO/D,cAAchB,iBAAiB,QAC/D8X,EAASzlB,SACV0S,EAAS+S,EAASliB,OAItB,GAAsB,QAAnBmP,EAAO02B,SAAwC,mBAAnB12B,EAAO02B,QAA8B,CAClE,MACMqW,EADSz5C,MAAMC,KAAKyM,EAAO/E,iBAAiB,QAC7BpK,MAClBk8C,IACD+0E,EAAe,IAAInuF,MACnB/zB,EAAMmtC,EAAMntC,IACZo+G,EAAM9oH,OAAO4sH,SAKV,GAAG9hH,aAAkBghH,iBAC1Bc,EAAe,IAAInuF,MACnB/zB,EAAMI,EAAOJ,SACR,GAAGI,aAAkBihH,iBAC1Ba,EAAez2H,SAASC,cAAc,SACtCw2H,EAAaliH,IAAMI,EAAOJ,SACrB,GAAGI,aAAkB4hH,cAAe,CACzC,MAAMG,EAAS/hH,EAAOzI,QAAQwqH,OACxBC,EAAYD,EAAS,OAErB,MAACl2H,EAAK,OAAEC,GAAUknH,EAElBiP,EAAS52H,SAASskB,gBAAgB,6BAA8B,OACtEsyG,EAAOryG,eAAe,KAAM,QAAS,GAAK/jB,GAC1Co2H,EAAOryG,eAAe,KAAM,SAAU,GAAK9jB,GAG3Cm2H,EAAOryG,eAAe,KAAM,UAAW,OAAO/jB,KAASC,KACvDm2H,EAAOryG,eAAe,KAAM,sBAAuB,iBAEnDqyG,EAAOx1G,mBAAmB,YAAazM,EAAOgL,kBAAkBk3G,UAAUvzH,QAAQozH,EAAQC,IAC1FC,EAAOx1G,mBAAmB,YAAazM,EAAOk9B,iBAAiBglF,UAAUvzH,QAAQozH,EAAQC,IAGzF,MAAM1Z,EAAO2Z,EAAOj3G,kBACd+mB,EAAMu2E,EAAKt9F,kBAAkBA,kBACnC,GAAG+mB,aAAeowF,cAAe,CAC/B,IAmBIt3G,EAnBA/C,EAAYiqB,EAAI0Y,eAAe,KAAM,aACzC3iC,EAAYA,EAAUnZ,QAAQ,kDAAmD,CAACoP,EAAO2H,EAAGE,EAAGw8G,EAAIC,IAU1F,aAPL38G,EADO,KADTA,GAAKA,GAEC7Z,EAAS,EAAIs1H,EAEb,EAAIA,MAGNr1H,aAEmCs2H,EAAKjB,OAAYkB,EAAKjB,MAE/DrvF,EAAIniB,eAAe,KAAM,YAAa9H,GAGtCw/F,EAAOgB,EAAKt9F,kBAAkBkyB,iBAI9B,MAAM8b,EAAuCV,EAAa9qC,MAAM,KAAK5Z,IAAI03B,GAAKk/B,SAASl/B,IAC7EzgB,EAAPm+B,EAAWyqE,GAAiB,EAAG,EAAG5nH,EAAQ,EAAIs1H,EAAQr1H,KAAWktD,GAC3Dy6D,GAAiB,EAAI0N,EAAQ,EAAGt1H,EAAQ,EAAIs1H,EAAQr1H,KAAWktD,GACxEsuD,EAAK13F,eAAe,KAAM,IAAK/E,GAGjC,MAAM2/B,EAAgBy3E,EAAO/kF,iBAC7BsN,EAAc56B,eAAe,KAAM,QAAS,GAAKojG,EAAcnnH,OAC/D2+C,EAAc56B,eAAe,KAAM,SAAU,GAAKojG,EAAclnH,QAEhEkyH,EAAMj0G,QAAQk4G,GAGbp3E,IACDA,EAAS/8C,MAAMwqD,aAAeA,EAE3BwpE,GACDj3E,EAAS31C,OAAO4sH,IAIpBA,EAAe9D,EAAMhjH,cAAc,cAChC8mH,aAAwBd,mBACzBc,EAAav2H,UAAUC,IAAI,aACvBq/C,IACFi3E,EAAah0H,MAAMjC,MAAQmnH,EAAcnnH,MAAQ,KACjDi2H,EAAah0H,MAAMhC,OAASknH,EAAclnH,OAAS,MAGlD8T,UACK,OAAA8rC,GAAA,GAA0Bo2E,EAAcliH,KAYlDo+G,EAAMlwH,MAAMC,QAAU,GAEtB,aAAQ,KACNiwH,EAAMzyH,UAAUC,IAAIs0H,EAAY,SAAW,YA4G/C,OA5DA9B,EAAMzyH,UAAUC,IAAI,iBAKd,eAONwyH,EAAMlwH,MAAMga,UAAY,eAAekrG,EAAc9qG,UAAU8qG,EAAc1zF,0BAE7E4gG,IAAgBlC,EAAMlwH,MAAM4pD,QAAU,IAEnC7M,GACD1/C,KAAK+1H,cAAcr2E,EAAUmoE,EAAehsG,GAK9CrQ,WAAW,KACTqnH,EAAMlwH,MAAMwqD,aAAe,GAExB0lE,EAAMhzG,oBACNgzG,EAAMhzG,kBAAkCld,MAAMwqD,aAAe,KAE/D,GAEH0lE,EAAMzmH,QAAQU,QAAU,GAAKtB,WAAW,KACtCqnH,EAAMzyH,UAAUuB,OAAO,SAAU,WAE9B+9C,IACEmzE,EAAMhjH,cAAc,SACrBgjH,EAAMzyH,UAAUuB,OAAO,UACvB+9C,EAAS/8C,MAAMuT,QAAU,GACpB28G,EAAMjpF,YAOfipF,EAAMzyH,UAAUC,IAAI,SAAU,iBAM9BwyH,EAAMzyH,UAAUC,IAAI,iBACbwyH,EAAMzmH,QAAQU,QAErB8K,EAAS3R,WACRo0F,GAEA8hB,GACDn8G,KAAK02H,aAAava,EAAM0L,EAAemO,EAAQ37B,GAAO,EAAMx8C,EAAOsP,GAG9D5mB,KAGC,cAAcmZ,EAA0BmoE,EAAwBhsG,GAQxE,MAAMo0B,EAAa43E,EAAcnnH,MAAQmnH,EAAclnH,OAEvD,IAAI,MAACD,EAAK,OAAEC,GAAUkb,EAIjBo0B,EAAa,EACdvvC,EAAQC,EAASsvC,EAEjBtvC,EAASD,EAAQuvC,EAKnByP,EAAS/8C,MAAMuT,QAAU,UAAUxV,gBAAoBC,2BAAgCknH,EAAcnnH,MAAQA,MAAUmnH,EAAclnH,OAASA,SAIxI,aAAaw7G,EAAsBtgG,EAAem6G,EAAgB37B,EAAe88B,EAAkBt5E,EAAgBsP,GAC3H,MAAM5tC,EAAQ81B,KAAKC,OACb,MAAC50C,EAAK,OAAEC,GAAUkb,EACxBw+E,GAAgB,EAEhB,MAAMxsC,EAAKV,EAAa9qC,MAAM,KAAK5Z,IAAI03B,GAAKk/B,SAASl/B,IAE/ChkB,EAAO,KACX,MAAMqV,EAAO6jB,KAAKC,MAAQ/1B,EAE1B,IAAIyB,EAAWq5E,EAAQ7oE,EAAO6oE,EAAQ,EACnCr5E,EAAW,IAAGA,EAAW,GACzBm2G,IAASn2G,EAAW,EAAIA,GAE3B,MAAMo2G,EAAwCvpE,EAAGplD,IAAI03B,GAAKA,EAAInf,GAE9D,IAAItB,EACMA,EAAPm+B,EAAWyqE,GAAiB,EAAG,EAAG5nH,EAAS,EAAIs1H,EAASh1G,EAAWrgB,KAAWy2H,GACxE9O,GAAiB,EAAI0N,EAASh1G,EAAU,EAAGtgB,EAA4CC,KAAWy2H,GAC3Gjb,EAAK13F,eAAe,KAAM,IAAK/E,GAE5B8R,EAAO6oE,GAAO,aAAQl+E,IAI3BA,IAGQ,sBAAsB02G,GAC9B,GAAGA,EAAMzyH,UAAUuR,SAAS,UAAW,CAErC,MAAMkK,EAAO7b,KAAK6N,QAAQiF,MAAMgJ,wBAChC+2G,EAAMlwH,MAAMga,UAAY,eAAed,EAAKkB,UAAUlB,EAAKsY,WAC3D0+F,EAAMzyH,UAAUuB,OAAO,UAClBkxH,EAAMjpF,WACXipF,EAAMzyH,UAAUuB,OAAO,kBAIjB,aAAakxH,EAAoBwE,GAAS,GAClD,MAAM3jF,EAAUnX,GAAA,EAAWmX,QAE3B1zC,KAAK00H,sBAAsB7B,GAG3BA,EAAMzyH,UAAUC,IAAI,UAEjBwyH,EAAMzmH,QAAQU,SACfE,cAAc6lH,EAAMzmH,QAAQU,SAG9B,MAAM+O,EAAOg3G,EAAM/2G,wBAEbw7G,EAAezE,EAAMlwH,MAAMga,UAAUnZ,QAAQ,sBAAuB,CAACoP,EAAO2kH,KAChF,MAAMh9G,EAAI88G,GAAUx7G,EAAKnb,MAAQgzC,EAGjC,OAAO9gC,EAAMpP,QAAQ+zH,EAAIh9G,EAAI,QAI/Bs4G,EAAMlwH,MAAMga,UAAY26G,EAExB9rH,WAAW,KACTqnH,EAAMlxH,UACL,KAGK,cACR,MAAM61H,EAAWt3H,SAASC,cAAc,OAIxC,GAHAq3H,EAASp3H,UAAUC,IAAI,sBACvBm3H,EAAS70H,MAAMC,QAAU,OAEtB5C,KAAK6N,QAAQglH,MAAO,CACJ7yH,KAAK6N,QAAQglH,MACrB/hH,cAAc/G,OAAOytH,QAE9Bx3H,KAAKqyH,gBAAgBtoH,OAAOytH,GAG9B,OAAOx3H,KAAK6N,QAAQglH,MAAQ2E,EAGpB,kBAAkB3iH,EAAqBH,EAAa62B,GAE1D,MAAMx7B,EAAK8E,EAAO02B,QAAQ+Q,gBAAkB/Q,EAAU12B,EAASA,EAAOhF,cAAc07B,GACpF,GAAGx7B,IAAO,OAAA+R,GAAA,GAAgBjN,EAAQ,YAAa,CAC7C,GAAG,OAAAiN,GAAA,GAAgBjN,EAAQ,cAAe,CAExC,MAAMiS,EAAYjS,EAAO/D,cAAcA,cAAcjB,cAAc,wBACnE,GAAGiX,EAAW,CACZ,GAAe,UAAZykB,EAMD,YALGzkB,EAAU1mB,UAAUuR,SAAS,WAC9BmV,EAAU8U,SAOd9U,EAAUnlB,UAId,OAAA4+C,GAAA,GAAmBxwC,EAAI2E,GAGpB3E,EAAG3P,UAAUuR,SAAS,cAAgB5B,EAAGe,cAAc1Q,UAAUuR,SAAS,6BAC3E5B,EAAG3P,UAAUuB,OAAO,cAQlB,cAAciK,EAAyBopD,GAC/C,OAAAzoD,EAAA,GAAevM,KAAK0xH,OAAO5oG,KAAM,aAAmBksC,IAEpD,MAAM75B,EAAWvvB,EAAOuvB,WACxB,IAAIvtB,EACDutB,EACDvtB,EAAQ,IAAI,KAAU,CACpB3G,OAAQ2E,EACRC,QAAQ,EACRioD,eAAe,EACf5wD,WAAW,IACV8R,SAEHpH,EAAQ1N,SAASC,cAAc,QAC/ByN,EAAM3J,UAAY,IAAkBwoB,cAAc7gB,GAClDgC,EAAMxN,UAAUC,IAAI,eAGtB,OAAAkM,EAAA,GAAevM,KAAK0xH,OAAO5nH,OAAQ8D,GAEnC,IAAI6pH,EAAYz3H,KAAK0xH,OAAOt6F,SAC5Bp3B,KAAK0xH,OAAOt6F,SAAYqgG,EAAUpqF,YAE9BlS,EAGFn7B,KAAK0xH,OAAOt6F,SAASgN,gBAAgB,cAFrCpkC,KAAK0xH,OAAOt6F,SAASh0B,aAAa,aAAc,GAAKwI,GAKvD5L,KAAK0xH,OAAOt6F,SAASh0B,aAAa,OAAQ,IAAMwI,GAAU,OAE1D6rH,EAAU3mH,cAAc4mH,aAAa13H,KAAK0xH,OAAOt6F,SAAUqgG,GAG7C,WACd3kH,EACAkiD,EACAppD,EACA6oH,EACA5/G,EACA/P,GAAU,EACVwkC,EAA4B,GAC5BC,EAA4B,GAC5BnlC,G,0CAGA,GAAGpE,KAAK6zH,gBAAiB,OAAO7zH,KAAK6zH,gBAMrC7zH,KAAK23H,cAAc/rH,EAAQopD,GAE3B,MAAM4iE,EAAyB,aAAZ9kH,EAAM1L,EACnBywH,EAAUD,GAAc9kH,EAAM2rC,YAAe,CAAC,QAAS,OAAgC/jB,SAAS5nB,EAAM3P,OAA+C,IAAtC2P,EAAM2rC,UAAUliC,QAAQ,WAE1Ivc,KAAK4xH,cAGN5xH,KAAK4xH,aAAc,EACnB5xH,KAAKiV,WAAWI,WAAWi0B,EAAaC,EAAazkC,GACpDyG,OAAegpH,eAAiBv0H,MAgBnCA,KAAK4d,QAAQlE,KAAKtZ,UAAUkM,OAAO,QAAStM,KAAKiV,WAAWrQ,SAASzC,QACrEnC,KAAK4d,QAAQ/Y,KAAKzE,UAAUkM,OAAO,QAAStM,KAAKiV,WAAWpQ,KAAK1C,QAEjE,MAAMlC,EAAYD,KAAK6N,QAAQiF,MACzBglH,GAAwBjjH,GAAUA,IAAW5U,EAChD63H,IAAsBjjH,EAAS5U,GAElCD,KAAK6U,OAAS,CAACG,QAASH,GACxB,MAAM4nB,IAAWz8B,KAAKy8B,OAEnBx8B,EAAU4f,oBACX5f,EAAUgE,UAAY,IAMxB,GADgC,IAAdwwH,EAEhBz0H,KAAK+3H,aAAa/3H,KAAK6N,QAAQglH,MAAqB,IAAd4B,GACtCz0H,KAAK0zH,kBACA,CACLnoH,OAAOvK,iBAAiB,UAAWhB,KAAK8iG,WACxCv3F,OAAOvK,iBAAiB,QAAShB,KAAKgzH,SAClC,uBAAoBznH,OAAOvK,iBAAiB,QAAShB,KAAKizH,QAAS,CAAC33G,SAAS,EAAOwQ,SAAS,IACjG,MAAMksG,EAAc93H,SAASuvC,eAAe,gBAC5CzvC,KAAK6xH,OAAOlxG,aAAa3gB,KAAK2yH,SAAUqF,GACnCh4H,KAAK2yH,SAAS/oF,WACnB5pC,KAAK2yH,SAASvyH,UAAUC,IAAI,UAC5BuI,EAAA,QAAUqkH,iBAAkB,EAC5BhtE,EAAA,EAAqB6kC,iBAAgB,GAEjC,qBACF/1E,EAAA,EAAwBoB,SAAS,CAC/BhN,KAAM,QACNiN,MAAQC,IACN,GAAGrQ,KAAKyyH,yBACN,OAAO,EAGTzyH,KAAK05B,WAQb,MAAMm5F,EAAQ7yH,KAAK6N,QAAQglH,MAErBllG,EAAW4O,GAAA,EAAWmX,QAG5B,IAAIukF,EAAU,EACd,MAAMz7F,EAAUD,GAAA,EAAWC,QACxBA,EAAU,MAAYtY,EAAA,EAAWC,WAClC8zG,EAAU,KAEZ,MAAMnqG,EAAY0O,EAAU,IAAMy7F,EAClC,IAAIC,EAA6Br1H,QAAQoD,UACzC,MAAMnG,EAAO,IAAiB2hD,kBAAkB3uC,EAAO7S,EAAW0tB,EAAUG,GAAW5J,EAAA,EAAWC,cAAyBzf,KAAckzH,GAAc9kH,EAAM+E,GAAK/E,EAAMyF,IAAIypC,UAC5K,GAAG81E,EAAsB,CACvB,MAAMxjH,EAAeC,GAAA,EAAmBC,gBAAgB1B,EAAOhT,EAAKqD,MACpE,IAAI4nB,EACJ,GAAGzW,EAAasrC,WACd70B,EAAM,IAAIyd,MACVzd,EAAItW,IAAMH,EAAaI,QAClB,CACL,MAAM6qC,EAAW,IAAiB0C,yBAAyBnvC,EAAOwB,GAAc,GAC7EirC,IACD24E,EAAe34E,EAASj/C,YACxByqB,EAAMw0B,EAASqC,OAIhB72B,IACDA,EAAI3qB,UAAUC,IAAI,aAClBJ,EAAU8J,OAAOghB,IASrB,MAAM3W,KAAgCwjH,IAAc9kH,EAAMsB,mBACpD0S,EAAY1S,EAAoBpU,KAAK2xH,oBAAsB3xH,KAAK8mB,UAEtE,IAAI+sG,EACJ,GAAGgE,EAAS,CAKV,MAAMM,EAAgB/zH,GAA0B,QAAf0O,EAAM3P,KACjC2c,EAED5f,SAASC,cAAc,SAEtBwU,EAAM,IAAM3U,KAAKs0H,iBAAiBz/G,GAAQ,EAAO4/G,GAAW5zH,KAAK,EAAEk+B,qBAKvE,MAAM5R,EAAM0lG,EAAMhzG,mBAAqBgzG,EAAMhzG,kBAAkBzf,UAAUuR,SAAS,yBAA2BkhH,EAAMhzG,kBAAoBgzG,EAGjIuF,EAAavF,EAAMhjH,cAAc,SACpCuoH,GACDA,EAAWz2H,SAKbme,EAAM1c,aAAa,cAAe,QAGlC0c,EAAM9e,iBAAiB,aAAc,KAChChB,KAAKy8B,SAAWA,GACjB3c,EAAM1e,UAIV0e,EAAM9e,iBAAiB,QAAS,KACN,IAArB8e,EAAMnT,MAAMsV,MACbjiB,KAAKgvD,IAAIriD,MAAM,SAAWmT,EAAMnT,MAAMsV,KAAO,cAAgBnC,EAAMnT,MAAMvI,SAGxE0iB,GACDA,EAAUi5B,UAEX,CAACpoC,MAAM,IAEV3X,KAAKgB,iBAAiB,gBAAiB,KACrC8e,EAAMrL,IAAM,GACZqL,EAAMha,QACL,CAAC6R,MAAM,IAEP,eAGDmI,EAAMrf,UAAW,GAGD,QAAfqS,EAAM3P,OACP2c,EAAM3I,OAAQ,EACd2I,EAAMrf,UAAW,EACjBqf,EAAMtf,MAAO,GAIb2sB,EAAIpjB,OAAO+V,GAGb,MAAMu4G,EAAiB,IAAIx1H,QAASoD,IAClC6Z,EAAM9e,iBAAiB,UAAWiF,EAAS,CAAC0R,MAAM,MAG9C2gH,EAAe,KACD,QAAfxlH,EAAM3P,OACP2c,EAAM1T,QAAQmsH,KAAO,UACrBz4G,EAAM1T,QAAQosH,QAAU,IAExB31H,QAAQC,IAAI,CAACu1H,EAAgBt5F,IAAiBl+B,KAAK,KACjD,GAAGb,KAAKy8B,SAAWA,EACjB,QAKaz8B,KAAKg0H,YAAc,IAAI,GAAYl0G,GADrC,EACkD1L,IACxDpT,iBAAiB,iBAAmBuf,IACzCvgB,KAAK2yH,SAASvyH,UAAUkM,OAAO,qBAAsBiU,KAGvDvgB,KAAKgB,iBAAiB,iBAAkB,KACtChB,KAAK2yH,SAASvyH,UAAUuB,OAAO,sBAC/B3B,KAAKg0H,YAAYt1G,kBACjB1e,KAAKg0H,iBAActvH,GAClB,CAACiT,MAAM,IAEP3X,KAAK4yH,aACN5yH,KAAKg0H,YAAYC,cAAa,OAQtC,GAAG7/G,EAAmB,CACpB2qB,EAAel+B,KAAK,KACfif,EAAMgK,WAAahK,EAAM24G,kBAC1B3xG,EAAUkE,OAAO6nG,GAAO,KAQ5B,MAAM6F,EAAgB,KACpB54G,EAAM9e,iBAAiB,UAAW,KAEhC8lB,EAAUi5B,SACVjgC,EAAMhP,cAAc1Q,UAAUuB,OAAO,iBACpC,CAACgW,MAAM,KAGZmI,EAAM9e,iBAAiB,UAAW,KAChC,MAAM44B,EAAU9Z,EAAM64G,eAAiB74G,EAAM84G,gBACvCC,EAAiB/4G,EAAMgK,WAAahK,EAAM24G,iBAG7C7+F,GAAWi/F,IACZH,IAEA5xG,EAAUkE,OAAO6nG,GAAO,GAGxB/yG,EAAMhP,cAAc1Q,UAAUC,IAAI,mBAItCq4H,IAmDA14H,KAAK2qB,cAAc9kB,QAAQ,CAACC,KA/Cf,KAKX,MAAMwO,EAAeC,GAAA,EAAmBC,gBAAgB1B,GAClD3M,EAAwBiO,EAAoBvR,QAAQoD,UAAY,IAAe8R,YAAYjF,GAsCjG,OApCIsB,GACF2qB,EAAel+B,KAAK,KACdyT,EAAaI,KACfoS,EAAUkE,OAAO6nG,GAAO,EAAM1sH,KAKpCtD,QAAQC,IAAI,CAACqD,EAAS44B,IAAiBl+B,KAAK,KAC1C,GAAGb,KAAKy8B,SAAWA,EAEjB,YADAz8B,KAAKgvD,IAAIp4C,KAAK,8BAIhB,GAAGuhH,EAAe,CAChB,MAAMW,EAAW,GAA2B1pB,eAAetvF,EAAO1b,GAElEpE,KAAKgB,iBAAiB,iBAAkB,KACtC83H,KACC,CAACnhH,MAAM,IAGZ,MAAMjD,EAAMJ,EAAaI,IACtBG,aAAkB4hH,cAEjBtpG,EAAItN,kBAAkBkyB,iBAAiBhoC,OAAO+V,GAGhD,OAAAygC,GAAA,GAAmBzgC,EAAOpL,GAG5B1U,KAAK+4H,kBAAkBlkH,EAAQH,EAAK,SAEpC4jH,MAGKnyH,OAOb0tH,EAAkBqE,EAAar3H,KAAK8T,OAC/B,CACL,MAAMA,EAAM,IAAM3U,KAAKs0H,iBAAiBz/G,GAAQ,EAAO4/G,GAAW5zH,KAAK,EAAEk+B,qBAsEvE/+B,KAAK2qB,cAAc9kB,QAAQ,CAACC,KAjEf,KACX,MAAMwO,EAAeC,GAAA,EAAmBC,gBAAgB1B,EAAOhT,EAAKqD,MAC9D61H,EAAqBpB,EAAa,IAAe7/G,YAAYjF,GAAS,IAAiB0F,aAAa1F,EAAOhT,GA4DjH,OA1DAi/B,EAAel+B,KAAK,KACdyT,EAAaI,KACf1U,KAAK8mB,UAAUmyG,cAAcD,KAKjCn2H,QAAQC,IAAI,CAACi8B,EAAgBi6F,IAAqBn4H,KAAK,K,MACrD,GAAGb,KAAKy8B,SAAWA,EAEjB,YADAz8B,KAAKgvD,IAAIp4C,KAAK,8BAMhB,MAAMlC,EAAMJ,EAAaI,IACzB,GAAGG,aAAkB4hH,eAInB,GAHAz2H,KAAK+4H,kBAAkBlkH,EAAQH,EAAK,OACpC1U,KAAK+4H,kBAAkBlG,EAAOn+G,EAAK,OAEhCwP,EAAA,EAAWC,SAAU,CACtB,MAAMiG,EAAOyoG,EAAM/iH,iBAAiB,OACjCsa,GAAQA,EAAKjoB,QACdioB,EAAK9jB,QAAQykB,IACXA,EAAI3qB,UAAUuB,OAAO,oBAItB,CACL,MAAMwrB,EAAM0lG,EAAMhzG,mBAAqBgzG,EAAMhzG,kBAAkBzf,UAAUuR,SAAS,yBAA2BkhH,EAAMhzG,kBAAoBgzG,EACjIqG,EAA+C,SAAd,QAArB,EAAA/rG,EAAItN,yBAAiB,eAAE0rB,SAAoBpe,EAAItN,kBAAwC,KACzG,IAAIq5G,GAAaA,EAAUzkH,MAAQC,EAAM,CACvC,IAAIktC,EAAQ,IAAIpZ,MAChBoZ,EAAMxhD,UAAUC,IAAI,aAIpB,OAAAkgD,GAAA,GAAmBqB,EAAOltC,EAAK,KAC7B1U,KAAK+4H,kBAAkBlkH,EAAQH,EAAK,OAEjCwkH,GACD,aAAQ,KACNA,EAAUv3H,WAIdwrB,EAAIpjB,OAAO63C,SAMhBp1C,MAAMC,IACPzM,KAAKgvD,IAAIriD,MAAMF,GACfzM,KAAK8mB,UAAUkE,OAAO6nG,GACtB7yH,KAAK8mB,UAAUu5B,cAGV24E,OAMXnF,EAAkBqE,EAAar3H,KAAK8T,GAGtC,OAAO3U,KAAK6zH,gBAAkBA,EAAgBrnH,MAAM,KAClDxM,KAAKyyH,yBAA2B,OAC/BxxG,QAAQ,KACTjhB,KAAK6zH,gBAAkB,W,2SGr+Cd,MAAM,WAAuB,GAQ1C,cA4BE,IAAIsF,EA3BJl2H,MAAM,IAAI,EAAiB,CACzBwD,YAAchB,IACZ,MAAM2zH,EAAqD,gCAArCp5H,KAAKgH,cAAcG,YAAYC,GAC/C,IAACP,EAAG,OAAEI,GAAUxB,EAChBqN,EAA8B,IAAmByC,oBAAoB9P,GAE3E,GAAIqN,KAEDsmH,GAAkB,GAAe7tC,mCAAmCz4E,IAIvE,MAAO,CAACkC,QAAS,KAAqBnO,MAAKI,aAE3C,CAAC,SAAU,YA4GjB,KAAAguE,YAAepgE,IACb7U,KAAK8wD,UAAU9wD,KAAKwZ,iBAAiB3E,EAAO5N,OAAQ4N,EAAOhO,KAAMgO,EAAOG,SAAU,IAGpF,KAAAugE,YAAe1gE,IACb7U,KAAK8wD,UAAU9wD,KAAKwZ,iBAAiB3E,EAAO5N,OAAQ4N,EAAOhO,KAAMgO,EAAOG,QAAS,IAGnF,KAAAu5C,cAAgB,KACd,MAAM15C,EAAS7U,KAAK6U,OACpB,IAAI,GAAoBA,EAAO5N,OAAQ,CAAC4N,EAAOhO,KAAM,OAAQ,KAC3D7G,KAAK6U,OAAS,CAACG,QAAShV,KAAK6N,QAAQiF,OACrC9S,KAAK05B,WAIT,KAAA00B,eAAiB,KACf,MAAMv5C,EAAS7U,KAAK6U,OACjBA,EAAOhO,KAER,IAAI,GAAa,CACf,CAACgO,EAAO5N,QAAS,CAAC4N,EAAOhO,MACxB,IACM7G,KAAK05B,UAKlB,KAAA2/F,cAAiBp3H,IACf,MAAM,IAAC4E,EAAG,OAAEI,GAAUjH,KAAK6U,OAC3B,GAAGhO,GAAOA,IAAQ8jC,OAAOC,iBAAkB,CACzC,MAAM9/B,EAAW9K,KAAKgH,cAAc8D,SAC9B1G,EAAUpE,KAAKwZ,iBAAiBvS,EAAQJ,GAC9C7G,KAAK05B,MAAMz3B,GAEVpB,KAAK,KACJ,GAAGqjB,EAAA,EAAWC,SAAU,CACtB,MAAM3U,EAAM,GAAgBmB,OAAO,IAChCnB,GACDA,EAAIkqB,QAIR,GAAaqtB,aAAa3iD,EAAQ6C,OAAQJ,EAAKiE,EAAW,kBAAepG,EAAWoG,OAK1F,KAAA6oH,gBAAkB,KAChB,MAAM,OAAC1sH,EAAM,IAAEJ,GAAO7G,KAAK6U,OACrBzQ,EAAUpE,KAAKwZ,iBAAiBvS,EAAQJ,GAC9C,GAAGzC,EAAQ0O,MAAMtO,MACf,IAAiB80H,cAAcl1H,EAAQ0O,MAAMtO,MAAO,GAAauoB,KAAKC,QAAQrC,cAAc21B,aACvF,CACL,IAAIpgD,EAAuB,KAEDA,EAAvBkE,EAAQ0O,MAAMga,QAAoB1oB,EAAQ0O,MAAMga,QAAQ5sB,SAC3CkE,EAAQ0O,MAAM5S,SAE3BA,GAED,IAAekhD,YAAYlhD,EAAU,GAAa6sB,KAAKC,QAAQrC,cAAc21B,WAvKjFtgD,KAAKiV,WAAWpN,UAAY,KAC1B7H,KAAK05B,SAOP15B,KAAK6N,QAAQqrB,QAAUh5B,SAASC,cAAc,OAC9CH,KAAK6N,QAAQqrB,QAAQ94B,UAAUC,IAAI8yH,wBAGnC,MAAMoG,EAAoB,KACrBJ,GACDnsH,aAAamsH,GAGfA,EAAiB5tH,OAAOC,WAAW,KACjC2tH,OAAiBz0H,EACjB1E,KAAK6N,QAAQqrB,QAAQ94B,UAAUuB,OAAO,eACrC,MAEL3B,KAAK6N,QAAQqrB,QAAQl4B,iBAAiB,aAAc,KAC9CkjB,EAAA,EAAWC,WAEfnkB,KAAK6N,QAAQqrB,QAAQ94B,UAAUC,IAAI,cAEhC84H,IACDnsH,aAAamsH,GACbA,OAAiBz0H,GAGnBxE,SAASc,iBAAiB,WAAYu4H,EAAmB,CAAC5hH,MAAM,OAGxC,IAAI,IAAW3X,KAAK6N,QAAQqrB,SACpCqU,mBAAqBgsF,EAGvCv5H,KAAK2yH,SAAS5oH,OAAO/J,KAAK6N,QAAQqrB,SAElC,YAAiBl5B,KAAK4d,QAAQvP,OAAQrO,KAAKuuD,eAE3C,MAAM3wC,EAAmC,CAAC,CACxCvQ,KAAM,UACN6P,KAAM,UACNC,QAASnd,KAAKouD,gBACb,CACD/gD,KAAM,WACN6P,KAAM,+BACNC,QAASnd,KAAK2zH,iBACb,CACDtmH,KAAM,gBACN6P,KAAM,SACNC,QAASnd,KAAKuuD,gBAGhBvuD,KAAKw5H,iBAAiB57G,GACtB5d,KAAKy5H,cAAgB77G,EAAQA,EAAQzb,OAAS,GAAG6S,QAIjDhV,KAAK8e,eAnFP,oBACE,OAAO9e,KAAKiV,WAAWjO,cAqFf,eACR/D,MAAM6b,eACN9e,KAAK4d,QAAQg5E,QAAQ51F,iBAAiB,QAAShB,KAAKouD,gBACpDpuD,KAAK0xH,OAAOzxH,UAAUe,iBAAiB,QAAShB,KAAKq5H,eAErD,MAAMK,EAAkBz3H,IACtB,GAAGA,EAAE4S,kBAAkBs9C,kBAAmB,CACxC,MAAMg4D,EAAWloH,EAAE4S,OAAuB6+D,aAAa,WACvD,IAAIy2C,GAAWA,EAAQzvF,SAAS,mBAC9B,OAUF,OAPA,OAAAhd,EAAA,GAAYzb,GAEZjC,KAAK05B,QAAQ74B,KAAK,KAChBb,KAAK6N,QAAQqrB,QAAQ7vB,oBAAoB,QAASqwH,EAAgB,CAAC5tG,SAAS,IAC3E7pB,EAAE4S,OAA6B+mB,WAG3B,IAGX57B,KAAK6N,QAAQqrB,QAAQl4B,iBAAiB,QAAS04H,EAAgB,CAAC5tG,SAAS,IAejE,iBAAiB7kB,EAAgBJ,GACzC,OAAO7G,KAAKgH,cAAc8B,YAAc,IAAmByQ,0BAA0BtS,EAAQJ,GAAO,IAAmB2S,iBAAiBvS,EAAQJ,GAqE1I,WAAWzC,GACjB,MAAM80B,EAAW90B,EAA4BA,QAC7C,IAAIJ,EAAO,GACRk1B,IACDl1B,EAAO,IAAkB2oC,aAAazT,EAAS,CAC7C2d,SAAWzyC,EAA4BmtD,iBAK3CztD,EAAa9D,KAAK6N,QAAQqrB,QAAQrZ,kBAAmB7b,GACrDhE,KAAK6N,QAAQqrB,QAAQ94B,UAAUkM,OAAO,QAAS4sB,GAI1C,iBAAiBhwB,GAGtB,OAFAlJ,KAAKiV,WAAW2E,iBAAiB1Q,GAE1BlJ,KAGI,UAAUoE,EAAoByQ,EAAsB4/G,EAAY,EAAG3vH,GAAU,EACxFwkC,EAA0C,GAAIC,EAA0C,I,8GACxF,GAAGvpC,KAAK6zH,gBAAiB,OAAO7zH,KAAK6zH,gBAErC,MAAMhtH,EAAMzC,EAAQyC,IACd+E,EAAUxH,EAA4B+1E,WAAa/1E,EAAQwH,OAAUxH,EAA4B+1E,SAAS2e,UAAY10F,EAAQwH,OAC9HkH,EAAQ,IAAmByC,oBAAoBnR,GAErDpE,KAAK4d,QAAQg5E,QAAQx2F,UAAUkM,OAAO,OAAsB,mBAAdlI,EAAQgD,GAEtD,MAAMwjD,EAAmB,IAAmBA,iBAAiBxmD,GAC7D,CAACpE,KAAK4d,QAAQvP,OAAQrO,KAAKy5H,eAAenzH,QAAQuU,IAChDA,EAAOza,UAAUkM,OAAO,QAASs+C,KAGnC5qD,KAAK25H,WAAWv1H,GAChB,MAAM+B,EAAU,EAAMyzH,WAAU,UAAC9mH,EAAO1O,EAAQ0kB,KAAMld,EAAQ6oH,EAAW5/G,EAAQ/P,EAASwkC,EAAaC,EAAanlC,GAIpH,OAHApE,KAAK6U,OAAOhO,IAAMA,EAClB7G,KAAK6U,OAAO5N,OAAS7C,EAAQ6C,OAEtBd,KAGF,0CAA0C2M,GAC/C,MAAmB,UAAZA,EAAM1L,GAAiB,EAA2BO,IAAImL,EAAM2rC,YCxQxD,MAAM,WAAoE,EAGvF,YAAYz7C,GACVC,MAAM,OAAD,wBACAD,GAAO,CACVoD,SAAU,CAACF,EAAQF,EAAOjB,KACxB,GAAG/E,KAAKiH,OAAOw3B,cAAgBz4B,EAAO,OAAOnD,QAAQoD,QAAQ,CAACtB,MAAO,EAAGa,MAAO,KAE/E,MAAMoB,EAAQV,aAAM,EAANA,EAAQkiC,QACtB,OAAO,IAAiBqC,cAAczqC,KAAKiH,OAAQL,EAAO7B,GAAWlE,KAAKqB,IACxE,MAAMsD,EAAQtD,EAAMwoC,OAAOjiC,IAAI2/B,IACtB,CAACpzB,QAAS,KAAqBozB,aAGxC,MAAO,CAACzjC,MAAOzC,EAAMyC,MAAOa,eAKlCxF,KAAKiF,aAAc,EACnBjF,KAAKiH,OAASjE,EAAQiE,Q,2SClBX,MAAM,WAA6B,GAGhD,YAAYA,GACVhE,MAAM,IAAI,GAAiB,CAACgE,WAAU,IAmBxC,KAAAguE,YAAepgE,IACb7U,KAAK8wD,UAAUj8C,EAAOuzB,QAASvzB,EAAOG,SAAU,IAGlD,KAAAugE,YAAe1gE,IACb7U,KAAK8wD,UAAUj8C,EAAOuzB,QAASvzB,EAAOG,QAAS,IAGjD,KAAA2+G,gBAAkB,KAChB,IAAiB2F,cAAc,IAAiB/wF,SAASvoC,KAAK6U,OAAOuzB,SAAU,GAAarb,KAAKC,QAAQrC,cAAc21B,UA1BvHtgD,KAAKiH,OAASA,EAEdjH,KAAKw5H,iBAAiB,CAAC,CACrBnsH,KAAM,WACN6P,KAAM,+BACNC,QAASnd,KAAK2zH,mBAShB3zH,KAAK8e,eAeM,UAAUspB,EAA4BvzB,EAAsB4/G,EAAY,EAAGnrF,EAAgDC,G,8GACtI,GAAGvpC,KAAK6zH,gBAAiB,OAAO7zH,KAAK6zH,gBAErC,MAAMrvH,EAAQ,IAAiB+jC,SAASH,GAClC7B,EAAM,EAAMqzF,WAAU,UAACp1H,EAAOA,EAAMskB,KAAM9oB,KAAKiH,OAAQwtH,EAAW5/G,GAAQ,EAAOy0B,EAAaC,GAGpG,OAFAvpC,KAAK6U,OAAOuzB,QAAU5jC,EAAM2K,GAErBo3B,M,2SClCX,MAAMszF,GAAkB5yH,IACtB2R,EAAA,EAAkBkhH,uBAAuB7yH,GACxCkB,MAAMC,KAAKlI,SAAS4P,iBAAiB,wBAA0B7I,EAAS,OAA2BX,QAAQvC,IAE1GA,EAAK49B,YAWF,SAAe6H,GACpB30B,EACA5N,EACA2lB,EACAxoB,EACAklC,EACAC,G,0CAEA,IAAI/kC,QAAc,UAAkBu1H,aAAa9yH,GACjD,IAAI2lB,MAAiBpoB,EACnB,OAGF,MAAMw1H,EAAY,IACH7xH,MAAMC,KAAKyM,EAAO/E,iBAAiB,QAAQW,KAAKsa,IAAQA,EAAI3qB,UAAUuR,SAAS,UAC9EkD,EAAS,KAGzB,GAAG5N,EAAOw3B,YAAa,CACrB,MAAMw7F,IAAe71H,EACf+C,EAAc,gCACpB,IAAI/C,IACFA,QAAgB,IAAmB2C,UAAU,CAC3CE,SACAE,YAAa,CAACC,EAAGD,GACjBP,MAAO,EACPM,MAAO,IACNrG,KAAKqB,GAGCA,EAAMiC,QAAQ,KAGnByoB,KACF,OAIJ,GAAGxoB,EAAS,CAEWA,EAAQG,OAAOC,MACpB2K,KAAO3K,EAAM2K,KACvB8qH,IACF71H,EAAU,IAAmB2mC,0BAA0B9jC,EAAQzC,KAMnE,MAAMq2B,EAAKv2B,GAA4BA,EAAImE,IAAIsH,IAAM,CACnDiF,QAASjF,EAAGiF,QACZnO,IAAMkJ,EAAGtK,KAAgCoB,IACzCI,OAAS8I,EAAGtK,KAAgCwB,UAU9C,YAPA,IAAI,IACH2S,iBAAiB,CAChB3S,SACAE,YAAa,CAACC,EAAGD,KAElB2pD,UAAU1sD,EAAS41H,SAAat1H,OAAWA,EAAW4kC,EAAczO,EAAEyO,QAAe5kC,EAAW6kC,EAAc1O,EAAE0O,QAAe7kC,IAMpI,GAAGF,EAAO,CACJ,YAASJ,KACXI,EAAQ,IAAiB+jC,SAASnkC,IAGpC,MAAMy2B,EAAKv2B,GAA4BA,EAAImE,IAAIsH,IAAM,CACnDiF,QAASjF,EAAGiF,QACZozB,QAASr4B,EAAGtK,QAGd,IAAI,GAAqBwB,GAAQ6pD,UAAUtsD,EAAM2K,GAAI6qH,SAAat1H,EAAW4kC,EAAczO,EAAEyO,QAAe5kC,EAAW6kC,EAAc1O,EAAE0O,QAAe7kC,OAnF1JkE,EAAA,QAAU5H,iBAAiB,gBAAiB64H,IAC5CjxH,EAAA,QAAU5H,iBAAiB,kBAAoBiG,IACzC2R,EAAA,EAAkBshH,eAAejzH,IACnC4yH,GAAe5yH,KAoFnB,MAAMkzH,GAA6C,IAAIzqH,IACjD,GAAoB,IAAI7L,IAEf,MAAM,WAAsBkkB,YAA3C,c,oBAEU,KAAAqyG,UAAW,EAIX,KAAAC,cAAe,EAEvB,oBAKE,GADAr6H,KAAKo6H,SAA2C,MAAhCp6H,KAAK0zE,aAAa,UACI,KAAnC1zE,KAAK0zE,aAAa,aAAqB,CACxC1zE,KAAKoD,aAAa,YAAa,OAC/B,IAAIw2B,GAAU,EACd,YAAiB55B,KAAYiC,GAAM,mCAEjC,GADA,OAAAyb,EAAA,GAAYzb,GACT23B,EAAS,OAEZ,MAAM3yB,EAASjH,KAAKiH,OACpB2yB,GAAU,QACJ4P,GAAiBxpC,KAAMA,KAAKiH,OAAQ,IAAMjH,KAAKiH,SAAWA,GAChE2yB,GAAU,OAKhB,uBAGE,MAAMjlB,EAAMwlH,GAAUnqH,IAAIhQ,KAAKiH,QAC5B0N,GAAOA,EAAIhN,IAAI3H,QAChB2U,EAAItG,OAAOrO,MACP2U,EAAI7U,MACNq6H,GAAU9rH,OAAOrO,KAAKiH,SAIvBjH,KAAK2qB,eACN3qB,KAAK2qB,cAAcugB,UAAUlrC,MAIjC,gCACE,MAAO,CAAC,OAAQ,SAAU,cAG5B,yBAAyBsJ,EAAcgxH,EAAkBnjB,GAGvD,GAAY,SAAT7tG,EAAiB,CAClB,MAAMixH,GAAapjB,GAAY,IAAIrvF,YAAc,KACjD,GAAG9nB,KAAKiH,SAAWszH,EACjB,OAGFv6H,KAAKiH,OAAS,IAAgBuzH,kBAAkBD,IAAcA,EAE9D,MAAM9W,GAAa6W,GAAY,IAAIxyG,YAAc,KACjD,GAAG27F,EAAW,CACZ,MAAM9uG,EAAMwlH,GAAUnqH,IAAIyzG,GACvB9uG,IACDA,EAAItG,OAAOrO,MACP2U,EAAI7U,MACNq6H,GAAU9rH,OAAOo1G,IAKvBzjH,KAAK2hC,aACY,eAATr4B,EACRtJ,KAAKy6H,UAAYtjB,EACA,WAAT7tG,IACRtJ,KAAKo6H,SAAwB,MAAbjjB,GAIZ,EAAEz0D,GAAY,GACpB,MAAMh3C,EAAMkN,EAAA,EAAkB4wG,SAASxpH,KAAMA,KAAKiH,OAAQjH,KAAKo6H,SAAUp6H,KAAKy6H,UAAW/3E,GACnFv8C,EAAUuF,EAAMA,EAAIpL,YAAcuC,QAAQoD,UAWhD,OAVGjG,KAAKyqB,eACH/e,GAAOA,EAAIoN,QACZ9Y,KAAKyqB,aAAa9kB,KAAKQ,GAGzBA,EAAQ8a,QAAQ,KACdjhB,KAAKyqB,kBAAe/lB,KAIjBgH,EAGF,SACL,GAAG1L,KAAK2qB,cAAe,CACrB,IAAI,GAAKhjB,IAAI3H,KAAKiH,QAAS,CACzB,GAAGjH,KAAKq6H,aAAc,OACtBr6H,KAAKq6H,cAAe,EAEpB,IAAI1lH,EAAMwlH,GAAUnqH,IAAIhQ,KAAKiH,QAkB7B,OAjBI0N,IACFA,EAAM,IAAI9Q,IACVs2H,GAAUxlH,IAAI3U,KAAKiH,OAAQ0N,IAG7BA,EAAItU,IAAIL,MAERA,KAAKoe,GAAE,QAEPpe,KAAK2qB,cAAchlB,KAAK,CACtBwnB,IAAKntB,KACL8F,KAAM,KACJ,GAAKzF,IAAIL,KAAKiH,QACPjH,KAAK2hC,YAKR3hC,KAAKq6H,cACbr6H,KAAK2qB,cAAcugB,UAAUlrC,MAIjC,GAAKK,IAAIL,KAAKiH,QAEd,MAAMyE,EAAM1L,KAAKoe,IACXjY,EAAUuF,EAAMA,EAAIpL,YAAcuC,QAAQoD,UAE7CjG,KAAKq6H,cACNl0H,EAAQ8a,QAAQ,KACdjhB,KAAKq6H,cAAe,IAIxB,MAAM1lH,EAAMwlH,GAAUnqH,IAAIhQ,KAAKiH,QAC/B,GAAG0N,EAAK,CACNA,EAAItG,OAAOrO,MACX,MAAMsE,EAAM6D,MAAMC,KAAKuM,GACvBwlH,GAAU9rH,OAAOrO,KAAKiH,QAGtB,IAAI,IAAI+D,EAAI,EAAG7I,EAASmC,EAAInC,OAAQ6I,EAAI7I,IAAU6I,EAChD1G,EAAI0G,GAAG22B,SAIX,OAAOx7B,GAIX6lB,eAAeC,OAAO,iBAAkB,ICzPzB,MAAM,GAArB,cAwEU,KAAAyuG,eAAiB,KACvB,IAAI7uH,EAAS,IAAmB+oF,cAAc50F,KAAK26H,YAChD9uH,GACD,IAAmB+uH,gBAAgB,CAAC/uH,EAAO5E,UAAW4E,EAAOgvH,YAIzD,KAAAv8B,WAAa,KACnB,IAAmBw8B,gBAAgB96H,KAAK26H,WAAY36H,KAAKitE,UAAUzgE,MAAMC,IACvD,4BAAbA,EAAItJ,OACFnD,KAAKitE,UAAY,EAClB93C,GAAS,CAACC,YAAa,0BAEvB,IAAI,GAAU,0BAA2B,CACvCxX,QAAS,CAAC,CACRmX,QAAS,KACT4lC,UAAU,GACT,CACD5lC,QAAS,uBACTiD,SAAU,KACR,IAAI,GAAkB,IAAgBjnB,UAG1C0mB,mBAAoB,wBACpBG,oBAAqB,CAAC,eAAK,QAAS,CAAChvB,EAAA,QAAU0iD,OAAOyvE,8BACrDx6G,WAMH,KAAAy6G,cAAgB,KACtB,IAAmBz1F,SAASvlC,KAAK26H,YAAY,IAGvC,KAAAn7G,YAAc,KACpB,IAAmB+lB,SAASvlC,KAAK26H,YAAY,IAGvC,KAAAM,cAAgB,KACtB,MAAMpvH,EAAS,IAAmB+oF,cAAc50F,KAAK26H,YACjD9uH,IAEDA,EAAO4oG,cACR,IAAmBlkB,YAAYvwF,KAAK26H,WAAY9uH,EAAOqvH,aACvD,IAAmBpmC,iBAAiB90F,KAAK26H,YAAY,IAErD,IAAmB7lC,iBAAiB90F,KAAK26H,cAIrC,KAAApsE,cAAgB,KACtB,IAAI,GAAkBvuD,KAAK26H,aAG7B,KAAAnsE,cAAiBvsD,IACZjC,KAAKkO,OACNlO,KAAKkO,OACLlO,KAAKkO,KAAO,MAGd,IAAIytB,EAAkB,KAEtB,IACEA,EAAK,OAAA0F,GAAA,GAAUp/B,EAAE4S,OAAQ,MACzB,MAAM5S,IAER,GAAI05B,EAAJ,CAGA,GADG15B,aAAawkB,YAAYxkB,EAAE8Y,iBAC3B/a,KAAKgV,QAAQ5U,UAAUuR,SAAS,UACjC,OAAO,EAEN1P,aAAawkB,aAAYxkB,EAAEwsD,cAAe,GAE7CzuD,KAAKitE,SAAW,GAAkBA,SAElCjtE,KAAK26H,WAAah/F,EAAGvvB,QAAQnF,OAAO6gB,WACpC9nB,KAAK6L,OAAS,IAAmB+oF,cAAc50F,KAAK26H,YAEpD36H,KAAK4d,QAAQtX,QAAQuU,IACnB,MAAMqH,EAAOrH,EAAO9F,SAEpB8F,EAAO7F,QAAQ5U,UAAUkM,OAAO,QAAS4V,KAI3CliB,KAAK4d,QAAQ5d,KAAK4d,QAAQzb,OAAS,GAAG6S,QAAQyU,UAAUC,YAAY,eAAK,IAAgBu4F,oBAAoBjiH,KAAK26H,cAElHh/F,EAAGv7B,UAAUC,IAAI,aACjB,aAAa4B,EAAGjC,KAAKgV,SACrB,aAAYhV,KAAKgV,QAAS,KACxB2mB,EAAGv7B,UAAUuB,OAAO,aACpB3B,KAAK26H,WAAa36H,KAAK6L,OAAS7L,KAAKitE,cAAWvoE,MA7J5C,OACN1E,KAAK4d,QAAU,CAAC,CACdvQ,KAAM,SACN6P,KAAM,eACNC,QAASnd,KAAKi7H,cACdlmH,OAAQ,KAAO,IAAmBomH,eAAen7H,KAAK6L,SACrD,CACDwB,KAAM,YACN6P,KAAM,aACNC,QAASnd,KAAKi7H,cACdlmH,OAAQ,IAAM,IAAmBomH,eAAen7H,KAAK6L,SACpD,CACDwB,KAAM,MACN6P,KAAM,uBACNC,QAASnd,KAAKs+F,WACdvpF,OAAQ,K,MAEN,QADiB/U,KAAKitE,SAAW,EAAI,IAAmBhD,eAAeiD,UAAUltE,KAAKitE,UAAUvD,cAAchvC,SAAS16B,KAAK6L,OAAO5E,WAA8B,QAAlB,EAAAjH,KAAK6L,OAAOyL,cAAM,eAAEkjE,WAGpK,CACDntE,KAAM,QACN6P,KAAM,yBACNC,QAASnd,KAAKs+F,WACdvpF,OAAQ,K,MAEN,OADiB/U,KAAKitE,SAAW,EAAI,IAAmBhD,eAAeiD,UAAUltE,KAAKitE,UAAUvD,cAAchvC,SAAS16B,KAAK6L,OAAO5E,WAA8B,QAAlB,EAAAjH,KAAK6L,OAAOyL,cAAM,eAAEkjE,UAGpK,CACDntE,KAAM,OACN6P,KAAM,wBACNC,QAASnd,KAAKwf,YACdzK,OAAQ,IACC/U,KAAK26H,aAAe/xH,EAAA,QAAU6O,OAAS,KAAwBuuB,iBAAiBhmC,KAAK6L,OAAO5E,SAEpG,CACDoG,KAAM,SACN6P,KAAM,0BACNC,QAASnd,KAAKg7H,cACdjmH,OAAQ,IACC/U,KAAK26H,aAAe/xH,EAAA,QAAU6O,MAAQ,KAAwBuuB,iBAAiBhmC,KAAK6L,OAAO5E,SAEnG,CACDoG,KAAM,UACN6P,KAAM,UACNC,QAASnd,KAAK06H,eACd3lH,OAAQ,IAAwB,IAAlB/U,KAAKitE,UAAkBjtE,KAAK26H,aAAe/xH,EAAA,QAAU6O,MAClE,CACDpK,KAAM,YACN6P,KAAM,YACNC,QAASnd,KAAK06H,eACd3lH,OAAQ,IAAwB,IAAlB/U,KAAKitE,UAAkBjtE,KAAK26H,aAAe/xH,EAAA,QAAU6O,MAClE,CACDpK,KAAM,gBACN6P,KAAM,SACNC,QAASnd,KAAKuuD,cACdx5C,OAAQ,KAAM,IAGhB/U,KAAKgV,QAAU,GAAWhV,KAAK4d,SAC/B5d,KAAKgV,QAAQ7F,GAAK,sBAClBnP,KAAKgV,QAAQ5U,UAAUC,IAAI,eAC3BH,SAASuvC,eAAe,cAAc1lC,OAAO/J,KAAKgV,UCpFtD,IAAYomH,GCKAC,IDLZ,SAAYD,GACV,6BACA,+BACA,uBACA,2BAJF,CAAYA,QAAgB,KEeb,MAAM,GAoBnB,YAAYjpH,GAXJ,KAAAmpH,YAAa,EAEb,KAAAC,YAAa,EACb,KAAAC,UAAW,EACX,KAAAC,UAAW,EA8DX,KAAAC,oBAAsB,KAC5B1pD,GAAA,EAAehiE,IAAI,MAAMnP,KAAK86H,IACxBA,IACFA,EAAW,KAAIA,UAGd37H,KAAK47H,4BACN5uH,aAAahN,KAAK47H,2BAClB57H,KAAK47H,0BAA4B,GAGnC,MAAMx1E,EAASx9C,EAAA,QAAUizH,iBAAiB,OAASF,GAC7CG,EAAS11E,GAAUA,EAAOA,SAAWg1E,GAAiBW,UAEzD/7H,KAAKu7H,YAAcO,GACpBnlE,GAAA,EAAkBqlE,qBAGjBF,IAAW97H,KAAKs7H,aACjBt7H,KAAKs7H,YAAa,GAGpBt7H,KAAKw7H,SAAWp1E,GAAUA,EAAOA,SAAWg1E,GAAiBa,SAC7Dj8H,KAAKu7H,YAAcO,EACnB97H,KAAKk8H,QAAU91E,GAAUA,EAAO81E,QAChC,MAASl8H,KAAKgvD,IAAI,aAAchvD,KAAKu7H,YACrCv7H,KAAKk2B,cAID,KAAAimG,cAAgB,CAAC/mG,EAA0BnnB,KAC9CjO,KAAKo8H,qBAAuBhnG,IAC/Bp1B,KAAKo8H,mBAAqBhnG,EAC1B,OAAA7oB,EAAA,GAAevM,KAAKq8H,SAAU,eAAKjnG,EAAannB,IAChDjO,KAAKs8H,gBAAgBtxG,OAAOhrB,KAAKq8H,YAe3B,KAAAnmG,SAAW,KACjB,MAAMppB,EAAU,GAA0ByvH,mBAC1C,GAAGv8H,KAAKu7H,WACN,GAAGv7H,KAAKw7H,SAAU,CAChB,MAAMlzH,EAAItI,KAAKw8H,KAAK,kCAAmC,IAAM,KAAWC,kBACxEz8H,KAAKm8H,cAAc,4BAA6B,CAAC7zH,SAC5C,GAAGtI,KAAKs7H,WACb,QAAoB52H,IAAjB1E,KAAKk8H,QAAuB,CAC7B,MAAMQ,EAAYx8H,SAASC,cAAc,QACnC+7H,EAAUl8H,KAAKk8H,QACftiD,EAAU,KACd,MAAMtkC,EAAMD,KAAKC,MACjBonF,EAAUxyG,UAAY,GAAK7nB,KAAKE,OAAO25H,EAAU5mF,GAAO,KACrDA,EAAM4mF,GACPtmF,cAAc+mF,IAGZA,EAAW7wF,YAAY8tC,EAAS,KACtCA,IAEA,MAAMtxE,EAAItI,KAAKw8H,KAAK,6BAA8B,IAAM,KAAWI,yBACnE58H,KAAKm8H,cAAc,+BAAgC,CAACO,EAAWp0H,SAE/DtI,KAAKm8H,cAAc,sCAGrBn8H,KAAKm8H,cAAc,iCAEbn8H,KAAKy7H,UACbz7H,KAAKm8H,cAAc,YAGrB,MAASn8H,KAAKgvD,IAAI,WAAYhvD,KAAKu7H,YAAcv7H,KAAKy7H,UACtDlwH,OAAO8S,sBAAsB,KACxBre,KAAK68H,iBAAiB7vH,aAAahN,KAAK68H,iBAQ3C78H,KAAK68H,gBAAkBtxH,OAAOC,WANnB,KACT,aAAcxL,KAAK88H,gBAAiB,WAAY98H,KAAKu7H,YAAcv7H,KAAKy7H,SAAU,KAClFz7H,KAAK68H,gBAAkB,EACvB,MAAS78H,KAAKgvD,IAAI,qBAAsBhvD,KAAKu7H,YAAcv7H,KAAKy7H,WAGrB3uH,MAjJ/C9M,KAAKgvD,IAAM,OAAAC,EAAA,GAAO,MAElBjvD,KAAK88H,gBAAkB58H,SAASC,cAAc,OAC9CH,KAAK88H,gBAAgB18H,UAAUC,IAAI,qBAEnCL,KAAKq8H,SAAW,YAAO,kDAAmD,CAAC1uH,UAAU,IACrF3N,KAAKs8H,gBAAkB,IAAI,KAAqB,CAACv1G,YAAY,IAC7D/mB,KAAKs8H,gBAAgBS,mBAAmB,CAACvnF,MAAO,cAAeygE,MAAM,IACrEj2G,KAAK88H,gBAAgB/yH,OAAO/J,KAAKq8H,UAEjClqH,EAAeyM,QAAQ5e,KAAK88H,iBAE5Bl0H,EAAA,QAAU5H,iBAAiB,2BAA6BiB,IACtD,MAAMmkD,EAASnkD,EACfyK,QAAQsiD,IAAI5I,GAEZpmD,KAAK07H,wBAGP9yH,EAAA,QAAU5H,iBAAiB,sBAAwBiB,IAC/BA,IAEhBjC,KAAKy7H,UAAW,EAChB,MAASz7H,KAAKgvD,IAAI,WAAYhvD,KAAKy7H,UACnCz7H,KAAKk2B,cAITttB,EAAA,QAAU5H,iBAAiB,qBAAuBiB,IAChD,MAAMu3B,EAAYv3B,EAClB,MAASjC,KAAKgvD,IAAI,qBAAsBx1B,GACpCA,IACFx5B,KAAKy7H,UAAW,EAChB,MAASz7H,KAAKgvD,IAAI,WAAYhvD,KAAKy7H,UACnCz7H,KAAKk2B,cAITl2B,KAAK47H,0BAA4BrwH,OAAOC,WAAWxL,KAAK07H,oBAAqB,GAA0Ba,mBAAqB,KAqDtH,KAAKnnG,EAA0B4C,GACrC,MAAM1vB,EAAIpI,SAASC,cAAc,KAQjC,OAPAmI,EAAElI,UAAUC,IAAI,mBAChBiI,EAAEyB,OAAO,eAAKqrB,IACd9sB,EAAEtH,iBAAiB,QAAUiB,IAC3B,OAAAyb,EAAA,GAAYzb,GACZ+1B,MAGK1vB,GAxHK,GAAAi0H,mBAAqB,IDXrC,SAAYlB,GACV,sBACA,yBACA,mBACA,mBAJF,CAAYA,QAAc,K,2SEmE1B,MAAM,WAAyB,GAC7B,YACSzxH,EACAozH,EACA72E,GAEPljD,MAAM,CACJ+iD,SAAW72C,GAAO,IAAmBylF,cAAczlF,GAAInP,KAAKg9H,UAC5Dj3E,SAAW/wC,IACTA,EAAQlJ,IAAIK,OAAOxK,SACnB3B,KAAKmmD,oBAAsBnmD,KAAKmmD,sBAElCZ,OAAQ,CAACvwC,EAAS3Q,KAChB,MAAMgiD,EAAmBrxC,EAAQlJ,IAAIK,OAAO2E,gBAAkB9Q,KAAK4J,KACnEq7C,GAAuBjwC,EAAQlJ,IAAIK,OAAQnM,KAAK4J,KAAMvF,GAEnDgiD,GACDrmD,KAAKmmD,oBAAsBnmD,KAAKmmD,sBAGpCN,gBAAiB,CAACD,EAAMF,KACtB,MAAMj7B,EAA+Bi7B,EAAQ,QAAKhhD,GAE5C,IAACoH,GAAOmxH,GAAkBC,cAAc,CAACrxH,OAAQ+5C,EAAKz2C,GAAIsb,eAAc0yG,QAASz3E,IAUvF,OATCE,EAAsB95C,IAAMA,GAE1B2e,aAAY,EAAZA,EAActoB,UACdyjD,EAAsBn7B,aAAeA,EACtC5nB,QAAQC,IAAI2nB,GAAcxJ,QAAQ,YACxB2kC,EAAsBn7B,gBAI3Bm7B,GAETP,kBAAmB,OAjCd,KAAAz7C,OACA,KAAAozH,WACA,KAAA72E,qBAmCF,QACLnmD,KAAK4J,KAAK3F,UAAY,GACtBhB,MAAMkH,SAOH,MAAM,GAgDX,cA/CQ,KAAAgI,eAAiBjS,SAASuvC,eAAe,sBAKzC,KAAA9Q,OAAqB,KAErB,KAAAqwB,IAAM,OAAAC,EAAA,GAAO,UAAW,IAAS21D,IAAM,IAASn5F,MAAQ,IAASo5F,KAAO,IAASC,OAEjF,KAAAG,YAAc,IAAI,GAGnB,KAAAl0C,YAAsD,GACtD,KAAAG,YAAgD,GAE/C,KAAAtB,QAA8E,CACpFkP,KAAM5+E,SAASuvC,eAAe,gBAC9B2tF,oBAAqB,KACrBn9H,UAAWC,SAASuvC,eAAe,sBAE7B,KAAAm9B,gBAOJ,GAMI,KAAAywD,mBAAuC,IAAIx5H,IAE3C,KAAAy5H,QAAyC,CAACnpG,IAAK,EAAGrX,OAAQ,GAO1D,KAAAygH,iBAAkB,EAGlB,KAAAC,0BAA2B,EAua5B,KAAAnsD,YAAc,KACnBrxE,KAAK2+B,OAAS3+B,KAAKkxE,YAAYlxE,KAAKitE,UACpCjtE,KAAK2+B,OAAOx5B,UAAUgvB,KAAM,EAC5Bn0B,KAAK2+B,OAAOx5B,UAAU2X,QAAS,EAC/B9c,KAAKs9H,QAAQnpG,IAAMn0B,KAAKs9H,QAAQxgH,OAAS,EACzC9c,KAAKy9H,wBAAqB/4H,EAC1B1E,KAAK09H,WAAa19H,KAAK+wE,YAAY/wE,KAAKitE,UACxCjtE,KAAK29H,iBA6YC,KAAAC,oBAAsB,KAC5B,IAAI59H,KAAKw9H,yBACP,OAKF,GAFAx9H,KAAK69H,2BAEF79H,KAAKitE,SAAW,EAAG,OAEtB,MAAM+D,EAAWhxE,KAAKgxE,SAChBrsE,EAAQqsE,EAAS/mE,kBAEjB0e,EAAQqoD,EAASlgE,cAAcA,cAC/BgM,EAASk0D,EAASlgE,cAAconB,mBAChC4lG,IAAgBhhH,EAAO7S,kBAC7B,GAAGtF,GAAS,GAKV,YAJGm5H,GACD99H,KAAK+9H,6BAIF,GAAGD,EAAa,OAEvBn1G,EAAMvoB,UAAUC,IAAI,iBAEpB,MAAM+3B,EAAU,IAAI,GAAe,CACjC9uB,KAAM,WACN6vB,aAAa,EACbm4C,uBAAuB,IAGzBl5C,EAAQn4B,UAAUG,UAAUC,IAAI,QAEhC,IAAgBo9B,wBAAmB/4B,OAAWA,EAAW,UAAU7D,KAAKs8B,IACtE,IAAI2qE,GAAQ,EACZ,MAAM3hD,EAAqB,KACtB2hD,GACD1vE,EAAQn4B,UAAUG,UAAUkM,OAAO,QAASskE,EAAehnE,KAAKK,oBAI9D2mE,EAAiB,IAAI,GAAe,CACxC3kE,WAAY,GACZyzB,KAAK,EACLh2B,YAAY,EACZy8C,uBAGFnmD,KAAKg+H,aAAe,KAClB,MAAM1hG,EAAYC,GAAA,EAAWC,QAAU,GAAK,EAChCW,EAAS14B,OAAO,EAAG63B,GAAW10B,OAAO5H,KAAKi+H,yBAElD33H,QAASW,IACX2pE,EAAevwE,IAAI4G,KAGjBk2B,EAASh7B,SACXnC,KAAKg+H,kBAAet5H,IAIxB1E,KAAKg+H,eAELh+H,KAAKk+H,eAAkBj3H,IACrB,GAAGA,EAAOw3B,YACR,OAGF,MAAMvc,EAAOliB,KAAKi+H,wBAAwBh3H,GACpCk3H,EAAQvtD,EAAejpE,IAAIV,IAC7Bk3H,GAASj8G,EAAM0uD,EAAevwE,IAAI4G,GAC9Bk3H,IAAUj8G,GAAM0uD,EAAeviE,OAAOpH,IAGhD,MAAM2C,EAAOgnE,EAAehnE,KAC5BA,EAAKxJ,UAAUC,IAAI,gBACnBL,KAAKgK,qBAAqBJ,GAC1BwuB,EAAQvqB,QAAQ9D,OAAOH,GAEvBk+F,GAAQ,EACR3hD,MAGFrpC,EAAO/S,OAAOquB,EAAQn4B,YAGhB,KAAAg+H,wBAA2Bh3H,GAC1BA,EAAO69B,cAAgB,IAAmB8vD,cAAc3tF,GAG1D,KAAAm3H,qBAAuB,KAGzBp+H,KAAKq+H,cAAcrxH,aAAahN,KAAKq+H,cACxCr+H,KAAKq+H,aAAe9yH,OAAOC,WAAW,KACpCxL,KAAKq+H,kBAAe35H,EAEhB1E,KAAKgxE,SAAS/mE,oBAAqBjK,KAAKk+H,gBAY5C,aAAoB,KAEpB,MAAMI,EAAOC,YAAYjpF,MAEnBkpF,EAAex+H,KAAK2+B,OAAOwK,UAE3BtpB,EAAoB7f,KAAKgxE,SAASnxD,kBAClC4+G,EAAgBz+H,KAAK2+B,OAAO1+B,UAAU6b,wBACtC4iH,EAAa7+G,EAAkB/D,wBAC/BiK,EAAW5d,MAAMC,KAAKpI,KAAK2+B,OAAO3D,QAAQjV,UAIhD,IAAIyqC,EAAYxwD,KAAK2+B,OAAO3D,QAAQw1B,UACjCA,GAAaguE,EAAehuE,IAAWA,GAAaguE,GAEvD,MAAMG,EAASF,EAAchkH,EAAI+1C,EAC3BowD,EAAQ6d,EAAchkH,EAEtBmkH,EAAe,OAAAv9F,GAAA,GAAUnhC,SAAS87E,iBAAiB35E,KAAK6jB,KAAKw4G,EAAWnkH,GAAIlY,KAAK6jB,KAAKy4G,EAAS,IAAK9+G,EAAkB0rB,SACtHszF,EAAc,OAAAx9F,GAAA,GAAUnhC,SAAS87E,iBAAiB35E,KAAK6jB,KAAKw4G,EAAWnkH,GAAIlY,KAAK05E,MAAM6kC,EAAQ6d,EAAc99H,OAAS,IAAKkf,EAAkB0rB,SAIlJ,IAAIqzF,IAAiBC,EACnB,OAKF,MACMC,EADmBF,EAAa9iH,wBACGrB,EAAIkkH,EAEvCltE,EAAwB,GACxB1I,EAAahjC,EAASxJ,QAAQqiH,GAC9B34G,EAAYF,EAASxJ,QAAQsiH,GAI7BE,EAAiB,aAAY,GAAKh5G,EAAStiB,MAAM,EAAGpB,KAAKP,IAAI,EAAGinD,EAFnD,KAGbi2E,EAAej5G,EAAStiB,MAAMwiB,EAHjB,IAiBhB84G,EAAe58H,SAChBnC,KAAK2+B,OAAOx5B,UAAUgvB,KAAM,GAG3B6qG,EAAa78H,SACdnC,KAAK2+B,OAAOx5B,UAAU2X,QAAS,GAGjC20C,EAAO9rD,QAAQo5H,GACfttE,EAAO9rD,QAAQq5H,GAEfvtE,EAAOnrD,QAAQyJ,IACb,MAAM9I,EAAS8I,EAAG3D,QAAQnF,OAAO6gB,WACjC9nB,KAAKi/H,aAAah4H,KAGpBjH,KAAKk/H,aAQLl/H,KAAK2+B,OAAOwK,UAAYy1F,EAAapuE,UAAYsuE,EAEjD9+H,KAAKgvD,IAAI,aAAcuvE,YAAYjpF,MAAQgpF,MAM1C,MAiBE,KAAAa,iBAAmB,KACxBn/H,KAAK29H,cAAc,QAGd,KAAAA,cAAgB,CAACxiC,EAAmB,YACzC,IAAGn7F,KAAK2+B,OAAOx5B,UAAUg2F,GAMlB,OAAGn7F,KAAKy9H,mBAA2Bz9H,KAAKy9H,oBAE/Cz9H,KAAKgvD,IAAI,gBAAiBmsC,GACnBn7F,KAAKo/H,YAAYjkC,IARnBn7F,KAAKg+H,cACNh+H,KAAKg+H,gBAnhCTh+H,KAAKq/H,eAAiB,aAAa,MAAM,GAEzCr/H,KAAKs/H,eAAiBt/H,KAAK4vE,QAAQkP,KAAKjvE,cAAc,UAEtD7P,KAAK4vE,QAAQwtD,oBAAsBp9H,KAAK4vE,QAAQkP,KAAKhuE,cAErD9Q,KAAKmmD,mBAAqB9wB,GAASr1B,KAAK49H,oBAAqB,KAAK,GAAO,GAEzE,MAAM2B,EAAar/H,SAASC,cAAc,OAC1Co/H,EAAWn/H,UAAUC,IAAI,4BACzBk/H,EAAWx1H,OAAO/J,KAAK4vE,QAAQ3vE,WAwB5B,uBACD2mD,GAAe,CACb5xC,QAAShV,KAAK4vE,QAAQ3vE,UACtBioC,QAAUL,IACR,MAAMkoB,EAAS5hD,EAAU4hD,SACzB5hD,EAAU05B,EAAQ,EAAIkoB,EAAS,EAAIA,EAAS,MAKlD/vD,KAAKoxE,YAAY,GACjBpxE,KAAKw/H,UAAU,CACbrwH,GAAInP,KAAKitE,SACTr/D,MAAO,GACPob,QAAS,eAAK,4BACdmkD,WAAY,IAGdntE,KAAK09H,WAAa19H,KAAK+wE,YAAY/wE,KAAKitE,UACxCjtE,KAAK2+B,OAAS3+B,KAAKkxE,YAAYlxE,KAAKitE,UAkBpCrkE,EAAA,QAAU5H,iBAAiB,gBAAiB,KAE1C0zB,EAAA,QAAgBC,WAAW9zB,KAAM+zB,IAC/B50B,KAAKw9H,0BAA2B,EAEhC,IAAgBrzH,QAChB,IAAgBA,QAEhB,MACMqqD,EADiB,IAAmByV,eACXzV,QAC/B,IAAI,MAAMyY,KAAYzY,EACpB5rD,EAAA,QAAU6F,cAAc,qBAAsB,CAC5CrH,EAAG,qBACH+H,IAAK89D,IAIT,IAAmB9iE,QAUnBnK,KAAK09H,WAAWvzH,QAChBnK,KAAKqxE,cACLrxE,KAAKy/H,cAAc7qG,OAIvB,MAAM8qG,EAAoB,IAAI,IAAY1/H,KAAK4vE,QAAQwtD,qBACvDmC,EAAW3gH,QAAQ5e,KAAK4vE,QAAQwtD,qBAChC,MAAMjvH,EAAY,OAAAgiD,EAAA,GAAenwD,KAAK4vE,QAAQkP,KAAM9+E,KAAK4vE,QAAQ3vE,UAAW,CAACkP,EAAIihD,KAK/EjhD,GAAMihD,EAAWhkD,QAAQ6gE,UAAY,EAElCjtE,KAAKitE,WAAa99D,IAErBnP,KAAK+wE,YAAY5hE,GAAIhF,QACrBnK,KAAKoxE,YAAYjiE,GACjBnP,KAAKqxE,gBACJ,KACD,IAAI,MAAMrpE,KAAYhI,KAAK+wE,aACrB/oE,IAAahI,KAAKitE,UACpBjtE,KAAK+wE,YAAY/oE,GAAUmC,cAG9BzF,EAAWg7H,GAGb1/H,KAAK4vE,QAAQkP,KAAKj/D,kBAAkC+b,QACrD,IAAmB5U,YACnB0N,EAAA,QAAgBC,WAAW9zB,KAAM+zB,GACxB50B,KAAKy/H,cAAc7qG,IAkB5B,IAAI,GAA0B50B,KAAKmS,gBACnCnS,KAAKmS,eAAepI,OAAOw1H,GAE3B/zH,WAAW,KACTqvC,GAAA,EAAagI,qBACZ,KAGL,eACE,OAAO7iD,KAAK09H,WAAW9zH,KAGlB,YAAYqjE,GACjBjtE,KAAKitE,SAAWA,EAChBjtE,KAAKg9H,SAAW,IAAmB7yD,eAAiB,IAAmBA,eAAew1D,kBAAkB3/H,KAAKitE,UAAY,QACzHrkE,EAAA,QAAUqkE,SAAWA,EAGf,gBACNrkE,EAAA,QAAU5H,iBAAiB,cAAgBoR,I,MAGzC,MAAMnL,EAASmL,EAAO0V,WAChBhc,EAAM9L,KAAK4/H,aAAa34H,GAC9B,GAAG6E,IAAQ,IAAgB2nF,MAAMrhF,IAAWnL,IAAW2B,EAAA,QAAU6O,KAAM,CACrE,MACMqkH,EAA4B,sBAAR,QAAX,EADF,IAAgB52F,QAAQ9yB,GACjBg0C,cAAM,eAAEh/C,GAC5B0E,EAAIsrB,SAASh3B,UAAUkM,OAAO,YAAawvH,MAa/ClzH,EAAA,QAAU5H,iBAAiB,gBAAkB8rE,IAC3C9sE,KAAK6/H,qBAAqB/yD,EAAO39D,MAGnCvG,EAAA,QAAU5H,iBAAiB,kBAAoBoR,IAC7CpS,KAAKk+H,gBAAkBl+H,KAAKk+H,eAAe9rH,EAAO0V,cAGpDlf,EAAA,QAAU5H,iBAAiB,eAAgB,EAAEiG,aAC3C,MAAM4E,EAAS,IAAmB+oF,cAAc3tF,GAC7C4E,IACD7L,KAAKqM,eAAeR,OAAQnH,OAAWA,OAAWA,OAAWA,OAAWA,GAAW,GACnF1E,KAAK8/H,wBAAwBj0H,GAC7B7L,KAAK+/H,2BAITn3H,EAAA,QAAU5H,iBAAiB,sBAAwBo7B,IACjD,IAAI,MAAMn1B,KAAUm1B,EAAS,CAC3B,MAAMvwB,EAASuwB,EAAQn1B,GACvBjH,KAAKggI,aAAan0H,GAEf7L,KAAKk+H,gBACNl+H,KAAKk+H,eAAej3H,EAAO6gB,YAG7B9nB,KAAK8/H,wBAAwBj0H,MAIjCjD,EAAA,QAAU5H,iBAAiB,cAAe,EAAEiG,aAC1CjH,KAAKi/H,aAAah4H,GAEfjH,KAAKk+H,gBACNl+H,KAAKk+H,eAAej3H,KAIxB2B,EAAA,QAAU5H,iBAAiB,gBAAiB,EAAEiG,aAC5C,MAAM4E,EAAS,IAAmB+oF,cAAc3tF,GAC7C4E,IACD7L,KAAKigI,kBAAkBp0H,GACvB7L,KAAK8/H,wBAAwBj0H,MAIjCjD,EAAA,QAAU5H,iBAAiB,yBAA2B6K,IACpD7L,KAAKigI,kBAAkBp0H,GACvB7L,KAAK+/H,0BAGPn3H,EAAA,QAAU5H,iBAAiB,eAAgB,EAAE6K,SAAQ6jH,OAAMzoH,aACtDyoH,EACD1vH,KAAK09H,WAAWrvH,OAAOpH,GAEvBjH,KAAKggI,aAAan0H,GAGjB7L,KAAKk+H,gBACNl+H,KAAKk+H,eAAej3H,KAIxB2B,EAAA,QAAU5H,iBAAiB,eAAiBiG,IAE1C,IAAI,MAAM+N,KAAWhV,KAAKq9H,mBACrBroH,EAAQ5I,QAAQnF,OAAO6gB,aAAe7gB,IACvC+N,EAAQ5U,UAAUuB,OAAO,UACzB3B,KAAKq9H,mBAAmBhvH,OAAO2G,IAIlB7M,MAAMC,KAAKlI,SAAS4P,iBAAiB,0CAA0C7I,QACvFX,QAAQ0O,IACfA,EAAQ5U,UAAUC,IAAI,UACtBL,KAAKq9H,mBAAmBh9H,IAAI2U,OAKhCpM,EAAA,QAAU5H,iBAAiB,gBAAkB4G,IAC3C,IAAI5H,KAAK4sE,gBAAgBhlE,EAAOuH,IAE9B,YADAnP,KAAKw/H,UAAU53H,GAEV,GAAGA,EAAOuH,KAAOnP,KAAKitE,SAAU,CACrC,MAAM7wC,EAAU,IAAmB+tC,eAAe+1D,kBAAiB,GACnElgI,KAAKmgI,wBACL,IAAI,IAAIn1H,EAAI,EAAG7I,EAASi6B,EAAQj6B,OAAQ6I,EAAI7I,IAAU6I,EAAG,CACvD,MAAMa,EAASuwB,EAAQpxB,GACvBhL,KAAKggI,aAAan0H,IAIL7L,KAAK4sE,gBAAgBhlE,EAAOuH,IACpCvB,MAAM3J,UAAY,IAAkBwoB,cAAc7kB,EAAOgG,SAGpEhF,EAAA,QAAU5H,iBAAiB,gBAAkB4G,IAC3C,MAAMggB,EAAW5nB,KAAK4sE,gBAAgBhlE,EAAOuH,IACzCyY,IAIH5nB,KAAK4vE,QAAQkP,KAAKj/D,kBAAkC+b,QAErDhU,EAAS3nB,UAAU0B,SACnBimB,EAASk3D,KAAKn9E,gBAEP3B,KAAK+wE,YAAYnpE,EAAOuH,WACxBnP,KAAKkxE,YAAYtpE,EAAOuH,WACxBnP,KAAK4sE,gBAAgBhlE,EAAOuH,IAEhC6H,OAAOm1C,KAAKnsD,KAAK4sE,iBAAiBzqE,QAAU,GAC7CnC,KAAK4vE,QAAQwtD,oBAAoBh9H,UAAUC,IAAI,WAInDuI,EAAA,QAAU5H,iBAAiB,eAAiB0sE,IAC1C,MAAM0yD,EAAoBpgI,KAAK4vE,QAAQkP,KACvCpR,EAAMpnE,QAAS2mE,IACb,MAAMrlE,EAAS,IAAmBqiE,eAAeiD,UAAUD,GACrDozD,EAAiBrgI,KAAK4sE,gBAAgBK,GAEzBjtE,KAAK+wE,YAAY9D,GACzB+vD,SAAW,IAAmB7yD,eAAew1D,kBAAkB1yD,GAE1EhoB,GAAuBo7E,EAAevhD,KAAMshD,EAAmBx4H,EAAOulE,YACtEloB,GAAuBo7E,EAAepgI,UAAWD,KAAK4vE,QAAQ3vE,UAAW2H,EAAOulE,cAGlFntE,KAAKg9H,SAAW,IAAmB7yD,eAAew1D,kBAAkB3/H,KAAKitE,YAQ3ErkE,EAAA,QAAU5H,iBAAiB,eAAgB,EAAEiG,SAAQwpH,cACnD,MAAM5kH,EAAS,IAAmB+oF,cAAc3tF,GAC5C4E,IAED4kH,EAAQtuH,OACTnC,KAAKmhF,UAAUt1E,GAEf7L,KAAKsgI,YAAYz0H,MAKT,cAAc+oB,G,0CAC1B,KAAwB2rG,4BAEpBvgI,KAAKu9H,kBACPv9H,KAAKwgI,gBACLxgI,KAAKu9H,iBAAkB,GAGzB,MAAMkD,EAAuB,IAAmBx2D,eAAeC,mBAAmBrpE,KAAM2zD,IACtF,IAAI,MAAM5sD,KAAU4sD,EAClBx0D,KAAKw/H,UAAU53H,KAenB,OAXGgtB,EAAM4/B,SAAWx9C,OAAOm1C,KAAKv3B,EAAM4/B,SAASryD,eACvCs+H,EACHzgI,KAAK0gI,2BACA1gI,KAAK0gI,qBAIZhsG,EAAA,QAAgBisG,gBAAgBvkG,QAAQj6B,QACzC,KAAiBy+H,mBAGZ5gI,KAAK29H,gBAAgB98H,KAAK,KAC/B,IAAmBggI,yBAgBf,eAAe1lC,GACrB,MAAO,CAAC7+E,MAAOtc,KAAK2+B,OAAOx5B,UAAUg2F,GAAQ,EAAIn7F,KAAKs9H,QAAQniC,IAGxD,yBAAyBtvF,GAC/B,QAAyBnH,IAAtBmH,EAAOi1H,aAA6B9gI,KAAK+gI,oBAAoBl1H,GAAS,OAAO,EAEhF,MAAMm1H,EAAYhhI,KAAKihI,eAAe,OAChCC,EAAelhI,KAAKihI,eAAe,UAEzC,IAAID,EAAU1kH,QAAU4kH,EAAa5kH,MACnC,OAAO,EAGT,MAAMA,EAAQzQ,EAAO7L,KAAKg9H,UAC1B,QAASgE,EAAU1kH,OAASA,GAAS0kH,EAAU1kH,UAAY4kH,EAAa5kH,OAASA,GAAS4kH,EAAa5kH,OAGjG,aAAarV,GACnBjH,KAAK09H,WAAWrvH,OAAOpH,GAGjB,aAAa4E,GACnB,IAAG7L,KAAKmhI,yBAAyBt1H,GAO/B,YADA7L,KAAKi/H,aAAapzH,EAAO5E,QALzB,IAAIjH,KAAK09H,WAAW/1H,IAAIkE,EAAO5E,QAE7B,YADAjH,KAAK09H,WAAWr9H,IAAIwL,EAAO5E,QAQ/B,MAAM6E,EAAM9L,KAAK4/H,aAAa/zH,EAAO5E,QAClC6E,IACD9L,KAAKqM,eAAeR,OAAQnH,EAAWoH,OAAKpH,OAAWA,OAAWA,GAAW,GAC7E1E,KAAK09H,WAAW/7F,OAAO91B,EAAO5E,SAc1B,qBAAqBgmE,G,MAC3B,MAAMm0D,EAA0B,IAAbn0D,EAAiBjtE,KAAKs/H,eAA+C,QAA9B,EAAAt/H,KAAK4sE,gBAAgBK,UAAS,eAAE2oB,OAC1F,IAAIwrC,EACF,OAGF,MAAMt0D,EAAS,IAAmB3C,eAAek3D,UAAUp0D,GACrDq0D,EAA4B,IAAbr0D,KAAoBH,EAAO1wC,QAAQ3rB,KAAK5E,IACnDA,EAAO4oG,cAAgB5oG,EAAOyL,OAAOu9E,eAAiB,KAAwB7uD,iBAAiBn6B,EAAO5E,QAAQ,IAGxHm6H,EAAWhhI,UAAUkM,OAAO,cAAeg1H,GAE3C,MAAMhxG,EAAMw8C,EAAO8F,mBACnBwuD,EAAWl3G,UAAYoG,EAAM,GAAKA,EAAM,GAGlC,wBACN,IAAI,MAAM28C,KAAYjtE,KAAK4sE,gBACzB5sE,KAAK6/H,sBAAsB5yD,GAG7BjtE,KAAK6/H,qBAAqB,GAMpB,wBACN,MAAMj4H,EAAS,IAAmBqiE,eAAeiD,UAAUltE,KAAKitE,WAAa,KAC7EjtE,KAAK09H,WAAW6D,SAASj7H,QAAS0O,IAChC,MAAMnJ,EAAS,IAAmB+oF,cAAc5/E,EAAQ7F,IACpDnP,KAAK+gI,oBAAoBl1H,EAAQjE,IACnC5H,KAAKi/H,aAAajqH,EAAQ7F,MAQxB,wBAAwBtD,EAAgBjE,GAC1C5H,KAAK4/H,aAAa/zH,EAAO5E,UAIzBjH,KAAK+gI,oBAAoBl1H,EAAQjE,IACnC5H,KAAKi/H,aAAapzH,EAAO5E,SAItB,oBAAoB4E,EAAgBjE,EAAS,IAAmBqiE,eAAeiD,UAAUltE,KAAKitE,WACnG,SAAIphE,GACDjE,IAAW,IAAmBqiE,eAAe82D,oBAAoBl1H,EAAQjE,KACxEA,GAAU5H,KAAKitE,WAAaphE,EAAOgvH,WAOlC,mBAAmBjxH,EAAwBqjE,GAChD,MAAMliE,EAAa,IAAI,IAAW,KAAM,KAAM,KAC9CA,EAAW9K,UAAUe,iBAAiB,SAAUhB,KAAKo+H,sBACrDrzH,EAAW9K,UAAUmM,QAAQ6gE,SAAW,GAAKA,EAC7CliE,EAAW8lF,cAAgB7wF,KAAKm/H,iBAChCp0H,EAAWM,iBAAmBrL,KAAK29H,cACnC5yH,EAAWG,oBAAoBtB,GAE/B,MAAM43H,EAAmB,IAAI,GAC3B53H,EACA,IAAmBugE,eAAiB,IAAmBA,eAAew1D,kBAAkB1yD,GAAY,QACpGjtE,KAAKmmD,oBASP,OANAnmD,KAAKkxE,YAAYjE,GAAYliE,EAC7B/K,KAAK+wE,YAAY9D,GAAYu0D,EAKtBz2H,EAGD,UAAUnD,GAChB,GAAG5H,KAAK4sE,gBAAgBhlE,EAAOuH,IAAK,OAEpC,MAAMygD,EAAU1vD,SAASC,cAAc,OACvCyvD,EAAQxvD,UAAUC,IAAI,4BACtB,MAAMwvD,EAAO3vD,SAASC,cAAc,QAC9B8yD,EAAY/yD,SAASC,cAAc,QACzC8yD,EAAU7yD,UAAUC,IAAI,cACrBuH,EAAOohB,QAASiqC,EAAUlpD,OAAOnC,EAAOohB,SACtCiqC,EAAUhvD,UAAY,IAAkBwoB,cAAc7kB,EAAOgG,OAClE,MAAMwzH,EAAalhI,SAASC,cAAc,OAC1CihI,EAAWhhI,UAAUC,IAAI,QAAS,WAAY,iBAC9C,MAAM2K,EAAI9K,SAASC,cAAc,KACjC0vD,EAAK9lD,OAAOkpD,EAAWmuE,EAAYp2H,GACnC4kD,EAAQ7lD,OAAO8lD,GACf,OAAAvyC,GAAA,QAAOsyC,GAGP3K,GAAuB2K,EADG5vD,KAAK4vE,QAAQkP,KACYl3E,EAAOulE,YAG1D,MAAMd,EAAKrsE,KAAK6J,iBACVkB,EAAa/K,KAAKixE,mBAAmB5E,EAAIzkE,EAAOuH,IAEtDpE,EAAW9K,UAAUG,UAAUC,IAAI,WAAY,kBAK/C,MAAM8zB,EAAMj0B,SAASC,cAAc,OACnCg0B,EAAI/zB,UAAUC,IAAI,gBAElB,MAAMyc,EAAS5c,SAASC,cAAc,OACtC2c,EAAO1c,UAAUC,IAAI,mBAErB8zB,EAAIpqB,OAAOsiE,GACXthE,EAAW9K,UAAU8J,OAAOoqB,EAAKrX,GAIjC,MAAMqQ,EAAMpiB,EAAW9K,UAEvBglD,GAAuBl6C,EAAW9K,UAAWD,KAAK4vE,QAAQ3vE,UAAW2H,EAAOulE,YAE5EntE,KAAKgK,qBAAqBqiE,EAAI,MAAM,GAEpCrsE,KAAK4sE,gBAAgBhlE,EAAOuH,IAAM,CAChC2vE,KAAMlvB,EACN3vD,UAAWktB,EACXyoE,OAAQwrC,EACRxzH,MAAOqlD,IAGLjzD,KAAK0gI,oBAAsB1pH,OAAOm1C,KAAKnsD,KAAK4sE,iBAAiBzqE,OAAS,IACxEnC,KAAK0gI,mBAAqB,IAAI79H,QAAeoD,IAC3CsF,OAAOC,WAAW,KAChBxL,KAAK0gI,wBAAqBh8H,EACvBsS,OAAOm1C,KAAKnsD,KAAK4sE,iBAAiBzqE,OAAS,IAC5CnC,KAAK4vE,QAAQwtD,oBAAoBh9H,UAAUuB,OAAO,QAClD3B,KAAK+/H,yBAEP95H,KACC,MAKD,YAAYk1F,GAKlB,GAAGn7F,KAAKy9H,mBAAqC,OAAOz9H,KAAKy9H,mBAEzD,MAAMt3H,EAAU,IAAItD,QAAoBoD,GAAY,mCAClD,MAAM,SAAC+qE,EAAQ,SAAE/D,EAAQ,SAAE+vD,GAAYh9H,KAKvC,IAAI+E,EAAYw3B,GAAA,EAAWC,QAAU,GAAK,KAAO,EAC7CvC,EAAc,EAElB,MAAO3d,MAAOmlH,GAAsBzhI,KAAKihI,eAAe9lC,GACxD,GAAGsmC,EACD,GAAY,QAATtmC,EAAgB,CACjB,MAAMtyF,EAAU,IAAmBshE,eAAeC,iBAAiB6C,GAAU,GACvE3wD,EAAQzT,EAAQsM,UAAUtJ,GAAUA,EAAOmxH,IAAayE,GACxDC,EAAYr/H,KAAKP,IAAI,EAAGwa,EAAQvX,GACtCA,EAAYuX,EAAQolH,EACpBznG,EAAcpxB,EAAQ64H,GAAW1E,GAAY,OAE7C/iG,EAAcwnG,EAMlB,IAGE,MAAME,EAAyB,IAAmBhlG,iBAAiB,GAAI1C,EAAal1B,EAAWkoE,GAAU,GACzG,IAAI00D,EAAuB7oH,SAAWk4D,EAAS/mE,kBAAmB,CAC9C+mE,EAASlgE,cACjB/G,OAAO/J,KAAKq/H,gBAGxB,MAAMh5H,QAAes7H,EAAuBx7H,QAE5C,GAAGnG,KAAKy9H,qBAAuBt3H,EAC7B,OAmBF,GAVY,WAATg1F,EACE90F,EAAO42B,QACRj9B,KAAK2+B,OAAOx5B,UAAUg2F,IAAQ,GAExB90F,EAAOu7H,WACf5hI,KAAK2+B,OAAOx5B,UAAUg2F,IAAQ,GAGhCn7F,KAAKw9H,0BAA2B,EAE7Bn3H,EAAO+1B,QAAQj6B,OAAQ,CACxB,MAAMi6B,EAAmB,QAAT++D,EAAiB90F,EAAO+1B,QAAQ34B,QAAQqB,UAAYuB,EAAO+1B,QAErE3R,EAA+B,GAE/Bo3G,EAA4B,GAC5BC,EAAQ9pG,IACZ6pG,EAAUl8H,KAAKqyB,IAGjBoE,EAAQ91B,QAASuF,IAGf,IADwB,IAAmB+oF,cAAc/oF,EAAO5E,QAE9D,OAGF,MAAM+N,EAAUhV,KAAK09H,WAAWr9H,IAAIwL,EAAO5E,QAAQ,EAAM66H,GAAM,GAC5D9sH,EAAQyV,cACTA,EAAa9kB,QAAQqP,EAAQyV,sBAI3B5nB,QAAQC,IAAI2nB,GAAcxJ,UAEhC4gH,EAAUv7H,QAAQ0xB,GAAYA,UAE9Bh4B,KAAKmmD,qBAGP,MAAM47E,EAAe17H,EAAO+1B,QAAiB,QAAT++D,EAAiB,EAAI90F,EAAO+1B,QAAQj6B,OAAS,GAC9E4/H,IACD/hI,KAAKs9H,QAAQniC,GAAQ4mC,EAAa/E,IAGpCh9H,KAAKgvD,IAAIwwD,MAAM,cAAgBz6G,EAAY,sBAAuBk1B,EAAa5zB,EAAQ2qE,EAAS/mE,mBAEhGuB,WAAW,KACTxL,KAAK2+B,OAAO6D,YACX,GACH,MAAM/1B,GACNzM,KAAKgvD,IAAIriD,MAAMF,GAGdzM,KAAKq/H,eAAevuH,eACrB9Q,KAAKq/H,eAAe19H,SAGtBsE,QACCgb,QAAQ,KACTjhB,KAAKy9H,wBAAqB/4H,IAG5B,OAAO1E,KAAKy9H,mBAAqBt3H,EAG3B,yBAAyBnD,GAM/B,MAAMslC,EAAa,oBACbroC,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAUC,IAAIioC,EAAYA,EAAa,IAAMtlC,EAAQg/H,eAE/D,MAAMv0H,EAASvN,SAASC,cAAc,OACtCsN,EAAOrN,UAAUC,IAAIioC,EAAa,WAClC,gBAAM76B,EAAQzK,EAAQ4K,OAEtB,MAAMye,EAAWnsB,SAASC,cAAc,OAQxC,OAPAksB,EAASjsB,UAAUC,IAAIioC,EAAa,aACjCtlC,EAAQqpB,UACT,gBAAMA,EAAUrpB,EAAQqpB,SAAUrpB,EAAQi/H,cAG5ChiI,EAAU8J,OAAO0D,EAAQ4e,GAElB,CAACpsB,YAAWwN,SAAQ4e,YAGrB,2BACN,GAAqB,IAAlBrsB,KAAKitE,SACN,OAGF,MAAM+D,EAAWhxE,KAAKgxE,SAChBue,EAAOve,EAASlgE,cACtB,IAAIoxH,EAAwB/5H,MAAMC,KAAKmnF,EAAKxpE,UAA4BtV,KAAKV,GAAMA,EAAGyX,QAAQ,uBAC9F,MAAM8wF,EAAkBt4G,KAAK2+B,OAAOx5B,UAAU2X,SAAWk0D,EAAS/mE,kBAGlE,GAAGquG,GAAmB4pB,EACpB,OACK,IAAI5pB,EAMT,YALG4pB,IACD3yC,EAAKnvF,UAAUuB,OAAO,oBACtBugI,EAAqBvgI,WAMzB,IAAIiL,EACJ,GAAI5M,KAAKitE,SAoCF,CACLrgE,EAAc5M,KAAKmiI,yBAAyB,CAC1Cv0H,MAAO,yBACPye,SAAU,6BACV21G,cAAe,WAGjBE,EAAuBt1H,EAAY3M,UAEnCiiI,EAAqBtjH,Q5H0epB,UAA0B,MAACu7B,EAAK,MAAEz5C,EAAK,OAAEC,IAO9C,MAAMV,EAAYC,SAASC,cAAc,OAEnC8T,EAAM,GAAmBumC,wBAAwBL,GAiBvD,OAhBGlmC,EACDiZ,GAAY,CACVjZ,MACAkZ,IAAKltB,EACLO,MAAM,EACNiB,MAAM,EACNf,QACAC,SACAw5C,UACCt5C,KAAK,QAIRZ,EAAUG,UAAUC,IAAI,yBAGnB,CAACJ,a4HpgByBmiI,CAAiB,CAC5CjoF,MAAO,KACPz5C,MAAO,IACPC,OAAQ,MACPV,WAEH,MAAM4a,EAAS,YAAO,kDAAmD,CACvEqC,KAAM,mBACN7P,KAAM,aAGR,YAAiBwN,EAAQ,KACvB,IAAI,GAAiB,IAAgB9J,KAAK,IAAmBk5D,eAAeiD,UAAUltE,KAAKitE,aAG7Fi1D,EAAqBn4H,OAAO8Q,OA5DX,CACjBjO,EAAc5M,KAAKmiI,yBAAyB,CAC1Cv0H,MAAO,uCACPo0H,cAAe,YAGjBE,EAAuBt1H,EAAY3M,UAEnC,MAAM8qB,EAAM7qB,SAASC,cAAc,OACnC4qB,EAAI3qB,UAAUC,IAAI,kCAElBwC,QAAQC,IAAI,CACV,IAAgBsmE,cAAcvoE,KAAK21D,IACjC,IAAIjoD,EAAkBN,EAEnBuoD,EAAMr0D,QACPoM,EAAM,0CACNN,EAAO,CAAC,eAAK,iBAAkB,CAACuoD,EAAMr0D,YAEtCoM,EAAM,oDACNN,EAAO,IAGU,IAAI,UAAKitD,YAAY,CACtC3sD,MACAN,OACA+G,QAASpI,EAAYyf,aAGzB,OAAAk0B,GAAA,GAA0Bx1B,EAAK,6BAC/B,iBACClqB,KAAK,KACNqhI,EAAqB9hI,UAAUC,IAAI,aAGrC6hI,EAAqBtjH,QAAQmM,GA4B/BwkE,EAAKxlF,OAAOm4H,GACZ3yC,EAAKnvF,UAAUC,IAAI,oBAGb,4BACN,MAAM2wE,EAAWhxE,KAAKgxE,SAChBroD,EAAQqoD,EAASlgE,cAAcA,cAC/BgM,EAASk0D,EAASlgE,cAAconB,mBACtCvP,EAAMvoB,UAAUuB,OAAO,iBACvBmb,EAAO7Y,UAAY,GACnBjE,KAAKg+H,kBAAet5H,EACpB1E,KAAKk+H,oBAAiBx5H,EAyMhB,aACN,MAAMssE,EAAWhxE,KAAKgxE,SAChBqxD,EAAcriI,KAAKsiI,qBAAqBtxD,EAASnxD,mBACjD0iH,EAAaviI,KAAKsiI,qBAAqBtxD,EAASj/B,kBAEhDirF,EAAWh9H,KAAKg9H,SACtBh9H,KAAKs9H,QAAQnpG,IAAMkuG,EAAYrF,GAC/Bh9H,KAAKs9H,QAAQxgH,OAASylH,EAAWvF,GAG3B,qBAAqBhoH,GAC3B,OAAO,IAAmB4/E,cAAc5/E,EAAQ5I,QAAQnF,OAAO6gB,YAoB1D,qBAAqBle,EAAwBD,EAAsB64H,GAAc,EAAO94H,GAAa,EAAO+4H,GAAY,GAC7H,IAAIC,EAEJ,MAAMC,GAAeF,EAAY,GAAa17E,aAAe,GAAa9a,SAAS1lC,KAAK,IAExFqD,EAAKwC,QAAQ1C,WAAa,KAAMA,EAChCE,EAAK5I,iBAAiB,YAAciB,IAClC,GAAgB,IAAbA,EAAE4Y,OAAc,OAGnB7a,KAAKgvD,IAAI,sBACT,MAAMn6C,EAAS5S,EAAE4S,OACX9Q,EAAO,OAAAs9B,GAAA,GAAUxsB,EAAQ,MAE/B,GAAI9Q,EAAJ,CAIA,GAAG2F,EAAY,CACb,MAAMk5H,EAAcF,IAA0B3+H,EAC3C2+H,IAA0BE,GAC3BF,EAAsBtiI,UAAUuB,OAAO,UAGtCoC,IACDA,EAAK3D,UAAUC,IAAI,UACnBqiI,EAAwB3+H,EACxB/D,KAAKq9H,mBAAmBh9H,IAAI0D,IAIhC,GAAGA,EAAM,CACJ4F,GAASA,IAEZ,MAAM1C,EAASlD,EAAKqI,QAAQnF,OAAO6gB,WAC7B6iE,GAAa5mF,EAAKqI,QAAQvF,UAAOnC,EAEvCi+H,EAAY17H,EAAQ0jF,QAEpBg4C,EAAY,QAEb,CAAC72G,SAAS,IAEV,MACDliB,EAAK5I,iBAAiB,WAAaiB,IACjC,MAAM05B,EAAK,OAAA0F,GAAA,GAAUp/B,EAAE4S,OAAQ,MAC/B,GAAG8mB,EAAI,CACL,MAAM10B,EAAS00B,EAAGvvB,QAAQnF,OAAO6gB,WACjC9nB,KAAKgvD,IAAI,gBAAiB,IAAmB6zE,kBAAkB57H,OAKlEu7H,GACD,aAA0B54H,EAAM5J,KAAKilH,YAAYz2D,eAI9C,eAAexrD,EAKlB,IACF,MAAM4G,EAAO1J,SAASC,cAAc,MAYpC,OAXAyJ,EAAKxJ,UAAUC,IAAI,YAGhB2C,EAAQ08B,KACT91B,EAAKxJ,UAAUC,IAAI,gBAOduJ,EAGF,eACLiC,EACAi3H,EACAh3H,EACAi3H,EACAt4G,EACA0yG,GAAU,EACV6F,GAAY,GAGZ,IAAIl3H,KACFA,EAAM9L,KAAK4/H,aAAa/zH,EAAO5E,SAI7B,OAIJ,IAAIg8H,EASJ,GARIH,IACCj3H,EAAOunG,OAA4B,iBAAnBvnG,EAAOunG,MAAMhsG,IAC9B67H,EAAep3H,EAAOunG,OAGxB0vB,EAAc,IAAmBtpH,iBAAiB3N,EAAO5E,OAAQ4E,EAAOqvH,cAGrD,iBAAlB4H,EAAY17H,EASb,OARA0E,EAAIwG,gBAAgBrO,UAAY,GAChC6H,EAAIo3H,aAAaj/H,UAAY,UACtB6H,EAAIK,OAAOC,QAAQvF,SAEvBm8H,GACDhjI,KAAKigI,kBAAkBp0H,EAAQC,EAAKqxH,IAMxC,MAAMl2H,EAAS4E,EAAO5E,OAK2C,CAE/D,IAAIs8F,EACJ,IAAIu/B,EAAYznG,UAAY4nG,EAAc,CACxC,MAAMnwH,EAA8B,IAAmByC,oBAAoButH,GAC3E,GAAGhwH,IAAsB,UAAZA,EAAM1L,GAAkB,CAAC,QAAS,OAAgCszB,SAAS5nB,EAAM3P,OAAQ,CACpG,MAAMrD,EAAO,IAAiBwtB,gBAAgBxa,EAAO,GAAI,IAEzD,GAAc,mBAAXhT,EAAKsH,IACNm8F,EAAiBrjG,SAASC,cAAc,OACxCojG,EAAenjG,UAAUC,IAAI,yBAE7BiqB,GAAU,CACR9lB,MAAOsO,EACP1O,QAAS0+H,EACT7iI,UAAWsjG,EACX74E,kBAAkB,EAClB5qB,OACA2qB,iBAGgC,UAA9B3X,EAAqB3P,MAAkB,CACzC,MAAMggI,EAAWjjI,SAASC,cAAc,QACxCgjI,EAAS/iI,UAAUC,IAAI,cAEvBkjG,EAAex5F,OAAOo5H,KAM9B,MAAMC,IAAqB7/B,MAAoBu/B,aAAW,EAAXA,EAAa1+H,SAE5D,IAAImzB,EAkBJ,GAhBEA,EADCwrG,GAAiBD,EAAY1+H,QACnB,IAAmByoB,oBAAoBi2G,OAAap+H,OAAWA,GAAW,EAAOq+H,EAAeK,GACnGH,EACG,IAAmBp2G,oBAAoBo2G,GACzCH,EAAYznG,QAGVn7B,SAASs3B,yBAFT,IAAmB3K,oBAAoBi2G,OAAap+H,OAAWA,GAAW,OAAOA,EAAW0+H,GAKtG7/B,GACDhsE,EAAS3Y,QAAQ2kF,GAGnB,OAAAh3F,EAAA,GAAeT,EAAIwG,gBAAiBilB,GAGjC0rG,EAAc,CACf,MAAMhtB,EAAO/1G,SAASC,cAAc,KACpC81G,EAAK71G,UAAUC,IAAI,UACnB41G,EAAKlsG,OAAO,eAAK,SAAU,MAC3B+B,EAAIwG,gBAAgBsM,QAAQq3F,QACvB,GAAGhvG,EAAOw3B,aAAex3B,IAAW67H,EAAYl3H,SAAWk3H,EAAYv+H,OAAQ,CACpF,MAAM8+H,EAAS,IAAgBjoG,QAAQ0nG,EAAYl3H,QACnD,GAAGy3H,GAAUA,EAAOl0H,GAAI,CACtB,MAAMm0H,EAAapjI,SAASC,cAAc,KAEvCkjI,EAAOl0H,KAAOvG,EAAA,QAAU6O,KACzB6rH,EAAWv5H,OAAO,eAAK,YAGvBu5H,EAAWv5H,OAAO,IAAI,KAAU,CAC9B9C,OAAQ67H,EAAYl3H,OACpBkoD,eAAe,IACd9+C,SAGLsuH,EAAWv5H,OAAO,MAElB+B,EAAIwG,gBAAgBsM,QAAQ0kH,KAKlC,IAAIR,EAAYznG,SAAW4nG,EAAwD,CACjF,MAAMn6G,EAAOm6G,EAAe5gI,KAAKP,IAAImhI,EAAan6G,KAAMg6G,EAAYh6G,MAAQ,GAAKg6G,EAAYh6G,KAC7F,OAAAvc,EAAA,GAAeT,EAAIo3H,aAAc,aAA8B,IAAI7tF,KAAY,IAAPvsB,UACnEhd,EAAIo3H,aAAa1wH,YAAc,GAErB,OAAdwwH,IACEA,EACDhjI,KAAKigI,kBAAkBp0H,EAAQC,EAAKqxH,GAEpCrxH,EAAIK,OAAOC,QAAQvF,IAAMi8H,EAAYj8H,KAKnC,kBAAkBgF,EAAgBC,EAAM9L,KAAK4/H,aAAa/zH,EAAO5E,QAASk2H,GAAU,G,MAC1F,IAAIrxH,EAEF,OAGF,IAAIqxH,EAAS,CACX,MAAM33F,EAAU,KAAwBQ,iBAAiBn6B,EAAO5E,QAAQ,GAErEu+B,IADc15B,EAAIK,OAAO/L,UAAUuR,SAAS,aAE7C,aAAc7F,EAAIK,OAAQ,WAAYq5B,EAAS,KAInD,IAAI+9F,EACJ,GAAuB,kBAAR,QAAZ,EAAA13H,EAAOunG,aAAK,eAAEhsG,GAAsB,CACrC,MAAM07H,EAAyB,IAAmBtpH,iBAAiB3N,EAAO5E,OAAQ4E,EAAOqvH,cACrF4H,EAAYznG,SAAWynG,EAAYxrH,OAAO0M,KAAO8+G,EAAY77H,SAAW2B,EAAA,QAAU6O,OACpF8rH,EAAmBT,IF35CpB,SACL7iI,EACAmE,EACAo/H,GAEA,IAAIh6H,EAWJ,IAVGpF,aAAO,EAAPA,EAASkT,OAAO0M,OAEfxa,EADCpF,EAAQkT,OAAO+Q,YACJ,UACJjkB,EAAQkT,OAAOs+E,OACX,QAEA,WAIZpsF,EAEF,YADAvJ,EAAUuS,YAAc,IAI1B,MAAMixH,EAAgB,SAAWj6H,EAC3Bq1H,EAAc5+H,EAAU8xC,iBAC9B,GAAG8sF,GAAeA,EAAYz+H,UAAUuR,SAAS8xH,GAC/C,OAGF,MAAMzuH,EAAU9U,SAASC,cAAc,KACvC6U,EAAQ5U,UAAUC,IAAI,sBAAgDojI,GACtExjI,EAAU8J,OAAOiL,GAEd6pH,GACDA,EAAYl9H,SE+3CZ+hI,CAAiB53H,EAAI63H,WAAYJ,GAEjC,MAAM37H,EAAS,IAAmBqiE,eAAeiD,UAAUltE,KAAKitE,UAChE,IAAI22D,EAEFA,EADCh8H,GAC2D,IAAjDA,EAAO8hE,cAAcntD,QAAQ1Q,EAAO5E,UAElC4E,EAAOyL,OAAOkjE,OAG7B,MAAM2gD,EAAiB,IAAmBA,eAAetvH,GACnDg4H,EAAiBD,GAAYzI,EAG7B2I,EAAuB,OAAA9kF,GAAA,GAAQlzC,EAAIi4H,aACtCF,IAAmBC,GACpBh4H,EAAIygB,WAAWxiB,OAAO+B,EAAIi4H,aAG5B,MAAMC,EAAmBn4H,EAAO8oG,wBAA0B9oG,EAAO8oG,sBAAwB,GAAK9oG,EAAO4oG,aAAe,GAC9GwvB,EAAwBn4H,EAAIo4H,eAAiB,OAAAllF,GAAA,GAAQlzC,EAAIo4H,eAC5DF,IACGl4H,EAAIo4H,gBACNp4H,EAAIo4H,cAAgBhkI,SAASC,cAAc,OAC3C2L,EAAIo4H,cAAc16H,UAAY,6DAC9BsC,EAAIo4H,cAAch6G,UAAY,IAC9Bpe,EAAIygB,WAAW5L,aAAa7U,EAAIo4H,cAAep4H,EAAIwG,gBAAgBwmD,eAIvE,MAAMqrE,EAAqBhH,EAAU,EAAI,IAazC,GAXA,aAAcrxH,EAAIi4H,YAAa,aAAcF,EAAgBM,EAAoBN,OAAiBn/H,EAAY,KAC5GoH,EAAIi4H,YAAYpiI,UACdmiI,EAA2B,EAAJ,GAExBh4H,EAAIo4H,eACL,aAAcp4H,EAAIo4H,cAAe,aAAcF,EAAkBG,EAAoBH,OAAmBt/H,EAAY,KAClHoH,EAAIo4H,cAAcviI,gBACXmK,EAAIo4H,eACTD,EAA4B,EAAJ,IAG1BJ,EACF,OAGCD,EACD93H,EAAIi4H,YAAY3jI,UAAUC,IAAI,oBAAqB,SAEnDyL,EAAIi4H,YAAY3jI,UAAUuB,OAAO,oBAAqB,SAGxD,IAAIq3E,GAAW,EAAMorD,GAAY,EAC9Bv4H,EAAO8oG,uBAAiD,IAAxB9oG,EAAO4oG,cACxC3oG,EAAIi4H,YAAY75G,UAAY,IAC5Bk6G,GAAY,GAEJjJ,EAERrvH,EAAIi4H,YAAY75G,UAAY,IAAMre,EAAO4oG,cAAgB,MAEzD3oG,EAAIi4H,YAAY75G,UAAY,GAC5B8uD,GAAW,GAGbltE,EAAIi4H,YAAY3jI,UAAUkM,OAAO,SAAU0sE,GAC3CltE,EAAIi4H,YAAY3jI,UAAUkM,OAAO,UAAW83H,GAGtC,aAAan9H,GAEnB,MAAM+N,EAAUhV,KAAK09H,WAAW1tH,IAAI/I,GACpC,OAAO+N,aAAO,EAAPA,EAASlJ,IAGV,UAAUD,GAChB,GAAsB,iBAAb,GAAyBA,EAAQ,CACxC,MAAMw4H,EAAiB,IAAmBzvC,cAAc/oF,GACxD,OAAIw4H,GACK,CACLp9H,OAAQ4E,EACR61B,KAAM,IAAgBu5D,cAAcpvF,GACpCyL,OAAQ,IAOd,OAAOzL,EAGF,cAAc7I,GACnB,MAAM6I,EAAS7L,KAAKskI,UAAUthI,EAAQ6I,QAEtC7I,EAAQ0G,YAAa,EAErB,MAAM68B,EAAMvmC,KAAK+L,aAAa/I,GAE9B,GAAGujC,EAAK,CACU,KAAwBP,iBAAiBn6B,EAAO5E,QAAQ,IAEtEs/B,EAAIz6B,IAAIK,OAAO/L,UAAUC,IAAI,YAG/BL,KAAKqM,eAAeR,OAAQnH,EAAW6hC,EAAIz6B,SAAKpH,EAAW1B,EAAQynB,aAAcznB,EAAQm6H,SAAS,GAGpG,OAAO52F,EAGF,aAAavjC,GAalB,OAAOhD,KAAKukI,UAAUvhI,EAAQ6I,OAAQ7I,EAAQ/C,UAAW+C,EAAQgJ,WAAYhJ,EAAQqP,cAAerP,EAAQ8wD,cAAe9wD,EAAQkJ,UAAWlJ,EAAQ+G,OAAQ/G,EAAQiJ,WAAYjJ,EAAQ0G,WAAY1G,EAAQ2nB,cAAe3nB,EAAQynB,cAGhO,UAAU+5G,EACfvkI,EACA+L,GAAa,EACbqG,GAAgB,EAChByhD,GAAgB,EAChB5nD,GAAY,EACZnC,GAAS,EACTkC,EAAa,GACbvC,IAAezJ,EACf0qB,EACAF,G,QACA,MAAM5e,EAAS7L,KAAKskI,UAAUE,GACxBv9H,EAAS4E,EAAO5E,OAEhBmwB,EAAW,IAAI,GAOrB,GANAA,EAAS3M,aAAeA,EACxB2M,EAASzM,cAAgBA,EACzByM,EAASh0B,aAAa,SAAU8I,EAAY,IAAM,KAClDkrB,EAASh0B,aAAa,OAAQ,GAAK6D,GACnCmwB,EAASh3B,UAAUC,IAAI,gBAAiB,UAAY4L,GAEjDD,GAAc/E,IAAW2B,EAAA,QAAU6O,MACjCxQ,EAAOo2B,SAAU,CAClB,MAAM4H,EAAO,IAAgBC,QAAQj+B,GAGlCg+B,EAAKmhB,QAA4B,qBAAlBnhB,EAAKmhB,OAAOh/C,GAC5BgwB,EAASh3B,UAAUC,IAAI,aAK7B,MAAMokI,EAAavkI,SAASC,cAAc,OAC1CskI,EAAWrkI,UAAUC,IAAI,gBAEzB,MAAMqkI,EAAqBxkI,SAASC,cAAc,QAClDukI,EAAmBtkI,UAAUC,IAAI,cAEjC,MAAMo6H,EAAY,IAAI,KAAU,CAC9BxzH,SACA4E,OAAQK,EACR4nD,gBACA5wD,WAAW,IAGbwhI,EAAmB36H,OAAO0wH,EAAUzlH,SAOlC0vH,EAAmBtkI,UAAUC,IAAI,SAEjC,MAAMqhC,EAAO,IAAgBtG,QAAQn0B,IACtB,QAAZ,EAAAy6B,aAAI,EAAJA,EAAMpqB,cAAM,eAAEg1B,WACfo4F,EAAmB36H,OAAO48B,MAI9B,MAAMkpB,EAAO3vD,SAASC,cAAc,QACpC0vD,EAAKzvD,UAAUC,IAAI,qBACnBwvD,EAAKzsD,aAAa,MAAO,QAKzB,MAAMu4B,EAAKz7B,SAASC,cAAc,MAC/BkS,GACD,OAAAiL,GAAA,QAAOqe,GAGTA,EAAG5xB,OAAOqtB,EAAUqtG,GACpB9oG,EAAGvvB,QAAQnF,OAAS,GAAKA,EAEzB,MAAM08H,EAAazjI,SAASC,cAAc,QAC1CwjI,EAAWvjI,UAAUC,IAAI,iBAAkB,kBAE3C,MAAM6iI,EAAehjI,SAASC,cAAc,QAC5C+iI,EAAa9iI,UAAUC,IAAI,gBAE3B,MAAM0jI,EAAc7jI,SAASC,cAAc,OAC3C4jI,EAAYv6H,UAAY,uCAExB,MAAMm7H,EAASzkI,SAASC,cAAc,KACtCwkI,EAAOvkI,UAAUC,IAAI,gBAErB,MAAMukI,EAAY1kI,SAASC,cAAc,QACzCykI,EAAUxkI,UAAUC,IAAI,wBACxBukI,EAAU76H,OAAO45H,EAAYT,GAC7ByB,EAAO56H,OAAO26H,EAAoBE,GAElC,MAAMr4G,EAAarsB,SAASC,cAAc,KAC1CosB,EAAWnsB,UAAUC,IAAI,mBACzBksB,EAAWxiB,OAAO8lD,GAElB40E,EAAW16H,OAAO46H,EAAQp4G,GAE1B,MAAMzgB,EAAiB,CACrBsrB,WACAqtG,aACAxxE,UAAWwnE,EAAUzlH,QACrB0vH,qBACAf,aACAT,eACAa,cACAzxH,gBAAiBu9C,EACjBrxB,YAAa7C,EACbxvB,OAAQwvB,EACRpP,cASF,GAAGtsB,EAAW,CAEZA,EADe8J,EAAS,SAAW,WACjB4xB,GAQpB,OALIjyB,IAA+B,QAAjB,KAAaqjB,YAAI,eAAE9lB,UAAWA,IAC9C00B,EAAGv7B,UAAUC,IAAI,UACjBL,KAAKq9H,mBAAmBh9H,IAAIs7B,IAGvB,CAAC7vB,MAAKD,UAGR,UAAUA,GACf,MAAMC,EAAM9L,KAAK4/H,aAAa/zH,EAAO5E,QACrC,IAAI6E,EACF,OAGF,IAAIklH,EAAgBllH,EAAIwG,gBAAgBzC,cAAc,0BACnDmhH,EACD,GAAaG,cAActlH,EAAO5E,OAAQ+pH,IAE1CA,EAAgB,GAAaG,cAActlH,EAAO5E,QAClD,OAAAsF,EAAA,GAAeT,EAAIwG,gBAAiB0+G,GACpCllH,EAAIwG,gBAAgBlS,UAAUC,IAAI,gBAI/B,YAAYwL,GACjB,MAAMC,EAAM9L,KAAK4/H,aAAa/zH,EAAO5E,QACjC6E,IAIJA,EAAIwG,gBAAgBlS,UAAUuB,OAAO,eACrC3B,KAAKqM,eAAeR,EAAQ,KAAMC,OAAKpH,OAAWA,OAAWA,EAAW,QAI5E,MAAMu4H,GAAoB,IAAI,GAC9B,KAAeA,kBAAoBA,GACpB,qB,oBC1tDsL,oBAAoBrxF,MAAKA,KAA7Ji5F,EAAOC,QAAmL,SAAS7iI,GAAG,IAAIyO,EAAE,GAAG,SAASonB,EAAE9sB,GAAG,GAAG0F,EAAE1F,GAAG,OAAO0F,EAAE1F,GAAG85H,QAAQ,IAAI3/B,EAAEz0F,EAAE1F,GAAG,CAACA,EAAEA,EAAEg0D,GAAE,EAAG8lE,QAAQ,IAAI,OAAO7iI,EAAE+I,GAAG+5H,KAAK5/B,EAAE2/B,QAAQ3/B,EAAEA,EAAE2/B,QAAQhtG,GAAGqtE,EAAEnmC,GAAE,EAAGmmC,EAAE2/B,QAAQ,OAAOhtG,EAAE+S,EAAE5oC,EAAE61B,EAAEnE,EAAEjjB,EAAEonB,EAAEpY,EAAE,SAASzd,EAAEyO,EAAE1F,GAAG8sB,EAAEA,EAAE71B,EAAEyO,IAAIsG,OAAOguH,eAAe/iI,EAAEyO,EAAE,CAACu0H,YAAW,EAAGj1H,IAAIhF,KAAK8sB,EAAE1Z,EAAE,SAASnc,GAAG,oBAAoBijI,QAAQA,OAAOC,aAAanuH,OAAOguH,eAAe/iI,EAAEijI,OAAOC,YAAY,CAACjjI,MAAM,WAAW8U,OAAOguH,eAAe/iI,EAAE,aAAa,CAACC,OAAM,KAAM41B,EAAEpnB,EAAE,SAASzO,EAAEyO,GAAG,GAAG,EAAEA,IAAIzO,EAAE61B,EAAE71B,IAAI,EAAEyO,EAAE,OAAOzO,EAAE,GAAG,EAAEyO,GAAG,iBAAiBzO,GAAGA,GAAGA,EAAEmjI,WAAW,OAAOnjI,EAAE,IAAI+I,EAAEgM,OAAOquH,OAAO,MAAM,GAAGvtG,EAAE1Z,EAAEpT,GAAGgM,OAAOguH,eAAeh6H,EAAE,UAAU,CAACi6H,YAAW,EAAG/iI,MAAMD,IAAI,EAAEyO,GAAG,iBAAiBzO,EAAE,IAAI,IAAIkjG,KAAKljG,EAAE61B,EAAEpY,EAAE1U,EAAEm6F,EAAE,SAASz0F,GAAG,OAAOzO,EAAEyO,IAAInK,KAAK,KAAK4+F,IAAI,OAAOn6F,GAAG8sB,EAAEqtE,EAAE,SAASljG,GAAG,IAAIyO,EAAEzO,GAAGA,EAAEmjI,WAAW,WAAW,OAAOnjI,EAAEqjI,SAAS,WAAW,OAAOrjI,GAAG,OAAO61B,EAAEpY,EAAEhP,EAAE,IAAIA,GAAGA,GAAGonB,EAAEA,EAAE,SAAS71B,EAAEyO,GAAG,OAAOsG,OAAOuuH,UAAUn6D,eAAe25D,KAAK9iI,EAAEyO,IAAIonB,EAAEH,EAAE,GAAGG,EAAEA,EAAEjiB,EAAE,GAAj5B,CAAq5B,CAAC,SAAS5T,EAAEyO,EAAEonB,GAAG,cAAa,SAAUpnB,GAAG,IAAIonB,EAAEpnB,EAAE80H,cAAc90H,EAAE+0H,mBAAmBz6H,EAAE,SAAS/I,GAAG,IAAI+I,EAAE06H,uBAAuB,MAAM,IAAIj6G,MAAM,8CAA8CxpB,IAAIA,EAAE,IAAIjC,KAAK40B,MAAM,WAAW50B,KAAKsrD,OAAOt0C,OAAOkkC,OAAO,CAACyqF,aAAa,KAAKC,mBAAmB,KAAKC,iBAAiB,GAAGC,YAAY,uBAAuBxyB,kBAAkB,KAAKyyB,iBAAiB,GAAGC,uBAAsB,EAAGzyB,YAAY,EAAEC,iBAAiB,EAAEC,cAAc,EAAEwyB,gBAAgB,EAAEC,aAAY,EAAGxyB,aAAY,EAAGyyB,YAAY,IAAIlkI,GAAGjC,KAAKomI,sBAAsB,GAAGp7H,EAAE06H,qBAAqB,WAAW,OAAO5tG,GAAGpnB,EAAEgC,WAAWhC,EAAEgC,UAAU2zH,cAAc31H,EAAEgC,UAAU2zH,aAAaC,cAAc51H,EAAE61H,aAAav7H,EAAEu6H,UAAUiB,YAAY,WAAWxmI,KAAKymI,SAASzmI,KAAKymI,OAAOC,UAAU1mI,KAAKymI,OAAOC,YAAYpgI,SAAQ,SAAUrE,GAAGA,EAAEQ,UAAUzC,KAAKymI,OAAOhkI,cAAczC,KAAKymI,QAAQzmI,KAAK2mI,cAAc3mI,KAAK4mI,oBAAoB5mI,KAAK2mI,aAAajtG,eAAe15B,KAAK2mI,eAAe37H,EAAEu6H,UAAUsB,cAAc,SAAS5kI,GAAG,GAAG,cAAcjC,KAAK40B,MAAM,CAAC,IAAI,IAAIlkB,EAAE,GAAGonB,EAAE,EAAEA,EAAE71B,EAAEuxG,iBAAiB17E,IAAIpnB,EAAEonB,GAAG71B,EAAE6kI,eAAehvG,GAAG93B,KAAK+mI,QAAQC,YAAY,CAACj9B,QAAQ,SAASk9B,QAAQv2H,MAAM1F,EAAEu6H,UAAU2B,iBAAiB,SAASjlI,GAAG,OAAOA,GAAGA,EAAEiH,SAASlJ,KAAK2mI,aAAa1kI,EAAEiH,QAAQlJ,KAAK4mI,mBAAkB,IAAK5mI,KAAK2mI,aAAa,IAAI7uG,EAAE93B,KAAK4mI,mBAAkB,GAAI5mI,KAAK2mI,cAAc37H,EAAEu6H,UAAU4B,eAAe,WAAWnnI,KAAK6mI,cAAc,kBAAkB7mI,KAAK6mI,eAAe7mI,KAAKonI,oBAAoBpnI,KAAK2mI,aAAaU,sBAAsBrnI,KAAKsrD,OAAOq6E,aAAa3lI,KAAKsrD,OAAOkoD,iBAAiBxzG,KAAKsrD,OAAOkoD,kBAAkBxzG,KAAKonI,oBAAoBx3B,QAAQ5vG,KAAK2mI,aAAaW,aAAatnI,KAAKonI,oBAAoBG,eAAetlI,IAAIjC,KAAK6mI,cAAc5kI,EAAEulI,cAAcxnI,KAAKynI,gBAAgBznI,KAAK2mI,aAAae,aAAa1nI,KAAK2nI,eAAe3nI,KAAKsrD,OAAOioD,aAAavzG,KAAKynI,gBAAgB73B,QAAQ5vG,KAAK2mI,aAAaW,aAAatnI,KAAK4nI,kBAAkB5nI,KAAK2mI,aAAae,aAAa1nI,KAAK6nI,iBAAiB7nI,KAAKsrD,OAAOmoD,eAAezzG,KAAK4nI,kBAAkBh4B,QAAQ5vG,KAAKonI,sBAAsBp8H,EAAEu6H,UAAUuC,eAAe,SAAS7lI,GAAG,OAAOA,GAAGA,EAAEiH,QAAQwH,EAAE7N,QAAQoD,QAAQhE,GAAGyO,EAAEgC,UAAU2zH,aAAaC,aAAa,CAACtgH,MAAMhmB,KAAKsrD,OAAO06E,wBAAwBnlI,KAAKoB,IAAIjC,KAAKymI,OAAOxkI,EAAEjC,KAAK2mI,aAAaoB,wBAAwB9lI,MAAM+I,EAAEu6H,UAAUyC,WAAW,WAAWhoI,KAAK+mI,UAAU/mI,KAAK+mI,QAAQ,IAAIr2H,EAAEu3H,OAAOjoI,KAAKsrD,OAAOw6E,eAAe96H,EAAEu6H,UAAU2C,WAAW,WAAW,IAAIjmI,GAAGjC,KAAKsrD,OAAO46E,YAAYlmI,KAAKmoI,WAAWnoI,KAAKooI,WAAW7hI,KAAKvG,MAAM,OAAOA,KAAKqoI,cAAc,GAAGroI,KAAKknB,YAAY,EAAElnB,KAAKgoI,aAAa,IAAInlI,QAAQ,CAAC6N,EAAEonB,KAAK,IAAI9sB,EAAE8sB,IAAI,OAAOA,EAAEwtC,KAAKlhE,SAAS,IAAI,QAAQsM,IAAI,MAAM,IAAI,OAAO1Q,KAAKomI,sBAAsBtuG,EAAEwtC,KAAKgjE,eAAermI,EAAE61B,EAAEwtC,KAAKijE,MAAM,MAAM,IAAI,OAAOvoI,KAAK+mI,QAAQ19H,oBAAoB,UAAU2B,GAAGhL,KAAK8kG,WAAW9kG,KAAK+mI,QAAQ/lI,iBAAiB,UAAUgK,GAAGhL,KAAK+mI,QAAQC,YAAYhwH,OAAOkkC,OAAO,CAAC6uD,QAAQ,OAAOy+B,mBAAmBxoI,KAAK2mI,aAAa8B,WAAWC,cAAc1oI,KAAK2mI,aAAa8B,YAAYzoI,KAAKsrD,YAAYtgD,EAAEu6H,UAAUnkI,MAAM,SAASa,GAAG,GAAG,cAAcjC,KAAK40B,MAAM,CAAC,GAAG50B,KAAK40B,MAAM,SAAS3yB,GAAGjC,KAAKsrD,OAAO46E,YAAY,CAAC,IAAIx1H,EAAE1Q,KAAK+mI,QAAQ,OAAO,IAAIlkI,QAAQ,CAACZ,EAAE61B,KAAK,IAAI9sB,EAAE8sB,IAAI,YAAYA,EAAEwtC,KAAKlhE,UAAUsM,EAAErH,oBAAoB,UAAU2B,GAAGhL,KAAK2oI,UAAU1mI,MAAMyO,EAAE1P,iBAAiB,UAAUgK,GAAG0F,EAAEs2H,YAAY,CAACj9B,QAAQ,YAAY,OAAO/pG,KAAK2oI,UAAU9lI,QAAQoD,YAAY+E,EAAEu6H,UAAUqD,OAAO,WAAW,WAAW5oI,KAAK40B,QAAQ50B,KAAK40B,MAAM,YAAY50B,KAAK6oI,aAAa79H,EAAEu6H,UAAUsC,iBAAiB,SAAS5lI,GAAGjC,KAAKsrD,OAAOmoD,cAAcxxG,EAAEjC,KAAK4nI,mBAAmB5nI,KAAK2mI,cAAc3mI,KAAK4nI,kBAAkBkB,KAAKC,gBAAgB9mI,EAAEjC,KAAK2mI,aAAajzH,YAAY,MAAM1I,EAAEu6H,UAAUoC,eAAe,SAAS1lI,GAAGjC,KAAKsrD,OAAOioD,YAAYtxG,EAAEjC,KAAKynI,iBAAiBznI,KAAK2mI,cAAc3mI,KAAKynI,gBAAgBqB,KAAKC,gBAAgB9mI,EAAEjC,KAAK2mI,aAAajzH,YAAY,MAAM1I,EAAEu6H,UAAUhmH,MAAM,SAAStd,GAAG,GAAG,aAAajC,KAAK40B,MAAM,OAAO50B,KAAKknI,iBAAiBjlI,GAAGjC,KAAKmnI,iBAAiBnnI,KAAKomI,sBAAsB,EAAEpmI,KAAKkoI,aAAarnI,KAAK,IAAIb,KAAK8nI,eAAe7lI,IAAIpB,KAAKoB,IAAIjC,KAAKyvG,WAAWxtG,EAAEjC,KAAK40B,MAAM,YAAY50B,KAAKgpI,UAAUhpI,KAAK+mI,QAAQC,YAAY,CAACj9B,QAAQ,mBAAmB/pG,KAAKyvG,WAAWG,QAAQ5vG,KAAKynI,iBAAiBznI,KAAKyvG,WAAWG,QAAQ5vG,KAAK4nI,sBAAsB58H,EAAEu6H,UAAU9iI,KAAK,WAAW,GAAG,aAAazC,KAAK40B,MAAM,CAAC50B,KAAK40B,MAAM,WAAW50B,KAAKynI,gBAAgBjvD,aAAax4E,KAAKonI,oBAAoB5uD,aAAax4E,KAAK4nI,kBAAkBpvD,aAAax4E,KAAKyvG,WAAWj3B,aAAax4E,KAAKwmI,cAAc,IAAIvkI,EAAEjC,KAAK+mI,QAAQ,OAAO,IAAIlkI,QAAQ6N,IAAI,IAAIonB,EAAE9sB,IAAI,SAASA,EAAEs6D,KAAKlhE,UAAUnC,EAAEoH,oBAAoB,UAAUyuB,GAAGpnB,MAAMzO,EAAEjB,iBAAiB,UAAU82B,GAAG71B,EAAE+kI,YAAY,CAACj9B,QAAQ,SAAS/pG,KAAKsrD,OAAOooD,aAAazxG,EAAE+kI,YAAY,CAACj9B,QAAQ,YAAY,OAAOlnG,QAAQoD,WAAW+E,EAAEu6H,UAAU0D,cAAc,WAAW,aAAajpI,KAAK40B,OAAO50B,KAAK+mI,UAAU/mI,KAAK+mI,QAAQC,YAAY,CAACj9B,QAAQ,iBAAiB/pG,KAAK+mI,UAAU/7H,EAAEu6H,UAAU6C,UAAU,SAASnmI,GAAGjC,KAAKqoI,cAAc1iI,KAAK1D,GAAGjC,KAAKknB,aAAajlB,EAAEE,QAAQ6I,EAAEu6H,UAAU4C,WAAW,SAASlmI,GAAGjC,KAAK6zG,gBAAgB5xG,IAAI+I,EAAEu6H,UAAUzgC,OAAO,WAAW,IAAI9kG,KAAKsrD,OAAO46E,YAAY,CAAC,IAAIjkI,EAAE,IAAI2iB,WAAW5kB,KAAKknB,aAAalnB,KAAKqoI,cAActkG,QAAO,SAAUrzB,EAAEonB,GAAG,OAAO71B,EAAE0S,IAAImjB,EAAEpnB,GAAGA,EAAEonB,EAAE31B,SAAS,GAAGnC,KAAK6zG,gBAAgB5xG,GAAGjC,KAAK4zG,SAAS5zG,KAAKsrD,OAAOooD,oBAAoB1zG,KAAK+mI,SAAS/7H,EAAEu6H,UAAU1xB,gBAAgB,aAAa7oG,EAAEu6H,UAAUoD,QAAQ,aAAa39H,EAAEu6H,UAAUsD,SAAS,aAAa79H,EAAEu6H,UAAUyD,QAAQ,aAAah+H,EAAEu6H,UAAU3xB,OAAO,aAAa3xG,EAAE6iI,QAAQ95H,IAAI+5H,KAAK/kI,KAAK83B,EAAE,KAAK,SAAS71B,EAAEyO,GAAG,IAAIonB,EAAEA,EAAE,WAAW,OAAO93B,KAAlB,GAA0B,IAAI83B,EAAEA,GAAG,IAAIoxG,SAAS,cAAb,GAA8B,MAAMjnI,GAAG,iBAAiBsJ,SAASusB,EAAEvsB,QAAQtJ,EAAE6iI,QAAQhtG,M,gCCA7oN,gFAWA,IAAIqxG,EAAgB,EACb,SAAS7rH,EAAOvZ,EAAmBi0B,EAAoD,KAAMn1B,QAAQoD,WAAWmU,EAA8B,KAAMwE,GAAU,GAEnK,GAAG7a,EAAK8L,cAAc,aAAc,OACpC9L,EAAK3D,UAAUC,IAAI,MAEnB,IAAI+d,EAAIle,SAASC,cAAc,OAC/Bie,EAAEhe,UAAUC,IAAI,YAShB,IAAIo3E,EAPa1zE,EAAK3D,UAAUuR,SAAS,cAEvCyM,EAAEhe,UAAUC,IAAI,aAGlB0D,EAAK6a,EAAU,UAAY,UAAUR,GAIrC,MAAMgrH,EAAa,CAACnuH,EAAiBC,KACnC,MAAMmuH,EAAYh0F,KAAKC,MACjBvxC,EAAO7D,SAASC,cAAc,OAE9BmpI,EAAUH,IAIVt1H,EAAgG,KAApFtI,OAAO2qH,iBAAiB93G,GAAG+3G,iBAAiB,qBAAqB3yH,QAAQ,IAAK,IAGhGi0E,EAAU,KAMR,IAAI8xD,EAAcl0F,KAAKC,MAAQ+zF,EAC/B,MAAMrxF,EAAK,KAET,IAAcyK,OAAO,KACnB1+C,EAAKpC,WAGJyY,GAAOA,EAAMkvH,IAElB,GAAGC,EAAc11H,EAAU,CACzB,IAAIwmF,EAAQh4F,KAAKP,IAAI+R,EAAW01H,EAAa11H,EAAW,GACxDrI,WAAW,IAAMzH,EAAK3D,UAAUC,IAAI,UAAWgC,KAAKP,IAAIu4F,EAAQxmF,EAAW,EAAG,IAE9ErI,WAAWwsC,EAAIqiD,QAEft2F,EAAK3D,UAAUC,IAAI,UACnBmL,WAAWwsC,EAAInkC,EAAW,GAGxB,sBACFtI,OAAOlC,oBAAoB,cAAeouE,GAG5CA,EAAU,KACV+xD,GAAkB,GAIpBxxG,GAAYA,EAASsxG,GAenB/9H,OAAO8S,sBAAsB,KAC3B,MAAMxC,EAAOuC,EAAEtC,wBACf/X,EAAK3D,UAAUC,IAAI,oBAEnB,MAAMgpC,EAASpuB,EAAUY,EAAKkB,KACxB0sH,EAASvuH,EAAUW,EAAKsY,IAGxBr0B,EADSuC,KAAKqnI,KAAK,SAACrnI,KAAKovB,IAAIg4G,EAAS5tH,EAAKlb,OAAS,GAAKkb,EAAKlb,OAAS,EAAM,GAAI,SAAC0B,KAAKovB,IAAI4X,EAASxtB,EAAKnb,MAAQ,GAAKmb,EAAKnb,MAAQ,EAAM,IAIzI6Z,EAAI8uB,EAASvpC,EAAO,EACpB2a,EAAIgvH,EAAS3pI,EAAO,EAI1BiE,EAAKpB,MAAMjC,MAAQqD,EAAKpB,MAAMhC,OAASb,EAAO,KAC9CiE,EAAKpB,MAAMoa,KAAOxC,EAAI,KACtBxW,EAAKpB,MAAMwxB,IAAM1Z,EAAI,KAgBrB2D,EAAErU,OAAOhG,MAQT4lI,EAAoB1nI,GAAaA,EAAE4S,SAAW9Q,IAChD,CAAC,SAAU,KAAK22B,SAAUz4B,EAAE4S,OAAuB02B,UAChD,YAAgBtpC,EAAE4S,OAAuB,cAAgBuJ,GAIhE,IAAIorH,GAAkB,EACtB,GAAG,qBAAoB,CACrB,IAAII,EAAW,KACbnyD,GAAWA,KAGb1zE,EAAK/C,iBAAiB,aAAeiB,IACnC,IAAI,UAAU+8B,SAASC,kBACrB,OAIF,GAAGh9B,EAAE+Y,QAAQ7Y,OAAS,GAAKqnI,GAAmBG,EAAiB1nI,GAC7D,OAIFunI,GAAkB,EAElB,IAAI,QAACvuH,EAAO,QAAEC,GAAWjZ,EAAE+Y,QAAQ,GACnCouH,EAAWnuH,EAASC,GACpBnX,EAAK/C,iBAAiB,WAAY4oI,EAAU,CAACjyH,MAAM,IAEnDpM,OAAOvK,iBAAiB,YAAciB,IACpCA,EAAEwsD,cAAe,EACjBxsD,EAAEqwE,kBACFs3D,IACA7lI,EAAKsF,oBAAoB,WAAYugI,IACpC,CAACjyH,MAAM,KACT,CAAC2D,SAAS,SAEbvX,EAAK/C,iBAAiB,YAAciB,IAClC,IAAI,CAAC,EAAG,GAAGy4B,SAASz4B,EAAE4Y,QACpB,OAGF,IAAI,UAAUmkB,SAASC,kBACrB,OAIF,GAA2B,MAAxBl7B,EAAKqI,QAAQkR,QAAkBqsH,EAAiB1nI,GACjD,OACK,GAAGunI,EAER,YADAA,GAAkB,GAIpB,IAAI,QAACvuH,EAAO,QAAEC,GAAWjZ,EACzBmnI,EAAWnuH,EAASC,GACpB3P,OAAOvK,iBAAiB,UAAWy2E,EAAS,CAAC9/D,MAAM,EAAM2D,SAAS,IAClE/P,OAAOvK,iBAAiB,cAAey2E,EAAS,CAAC9/D,MAAM,EAAM2D,SAAS,KACrE,CAACA,SAAS,M,gCC7LjB,2JAUO,MAAMuuH,EAA8D,qBAAqB,YAAc,QAEvG,SAASC,EAAiB/lI,EAA4Bi0B,EAAsDh1B,EAA8B,IAC/I,MAAM3C,EAAM2C,EAAQ+K,eAAiB/K,EAAQ+K,eAAe1N,IAAI0D,GAAQA,EAAK/C,iBAAiBuF,KAAKxC,GAGnGf,EAAQ2wG,gBAAiB,EA4BzBtzG,EAAIwpI,EAAkB7xG,EAAUh1B,GAG3B,SAAS+mI,EAAiBhmI,EAAmBi0B,EAAgDh1B,GAIhGe,EAAKsF,oBAAoBwgI,EAAkB7xG,EAAUh1B,GAIlD,SAASgnI,EAAmBjmI,GACjC,YAAcA,EAAM8lI,K,gCCxDtB,oBA4Ce,IAnCA,CAACrgI,EAAmBxG,EAQ9B,MACH,MAAM6X,EAA4B3a,SAASC,cAAc6C,EAAQ+a,MAAQ,MAAQ,UAuBjF,OAtBAlD,EAAOrR,UAAYA,GAAaxG,EAAQqK,KAAO,UAAYrK,EAAQqK,KAAO,IAEtErK,EAAQ2K,WACP3K,EAAQinI,cACTpvH,EAAOza,UAAUC,IAAI,aAGvB,iBAAOwa,IAGN7X,EAAQuwH,YACT14G,EAAOza,UAAUC,IAAI,kBAGpB2C,EAAQ4O,UACTiJ,EAAOzX,aAAa,WAAY,QAG/BJ,EAAQka,MACTrC,EAAO9Q,OAAO,eAAK/G,EAAQka,OAGtBrC,I,gCCzCT,+SAgBO,SAASqvH,EAAanmI,EAAeomI,GAAY,GACtD,MAAMnmI,EAAO,wMAKb,GAAGmmI,EAAW,CACZ,MAAMh9G,EAAMjtB,SAASC,cAAc,OAQnC,OAPAgtB,EAAI/sB,UAAUC,IAAI,aAClB8sB,EAAIlpB,UAAYD,EAEbD,GACDA,EAAK6c,YAAYuM,GAGZA,EAIT,OADAppB,EAAKud,mBAAmB,YAAatd,GAC9BD,EAAKguC,iBAKP,SAASq4F,EAAgBrmI,EAAyBsJ,EAAO,SAK9D,OAJAtJ,EAAK3D,UAAUuB,OAAO,SAAW0L,GACjCtJ,EAAK6N,UAAW,EAChBs4H,EAAanmI,GAEN,KACLA,EAAKE,UAAY,GACjBF,EAAK3D,UAAUC,IAAI,SAAWgN,GAC9BtJ,EAAKqgC,gBAAgB,aAVzB,IAAe8lG,aAAeA,EAsB9B,IAAI7vH,EAAepY,IACjB,IAAI4Z,EAAOiC,EAAWhC,yBAClB,QAACb,EAAO,QAAEC,GAAWjZ,EAErBooI,EAAQpvH,GAAWY,EAAK6tB,MAAQzuB,EAAUY,EAAK6tB,MAAQ7tB,EAAKkB,KAAO9B,EACnEqvH,EAAQpvH,GAAWW,EAAKiB,OAAS5B,EAAUW,EAAKiB,OAASjB,EAAKsY,IAAMjZ,GAErEmvH,GAAS,KAAOC,GAAS,MAC1BC,KAMJ,MAAMptH,EAAWlb,IAEfsoI,KAWWA,EAAe,KACvBzsH,IACDA,EAAW1d,UAAUuB,OAAO,UAC5Bmc,EAAWhN,cAAc1Q,UAAUuB,OAAO,aAEvC6oI,GAAaA,EAAY7oI,SAC5Bmc,EAAa,KAEb,UAAUrP,cAAc,uBAAuB,IAG9Cg8H,IACDA,IACAA,EAAoB,MAGlB,uBACFl/H,OAAOlC,oBAAoB,YAAagR,GAExC9O,OAAOlC,oBAAoB,cAAe8T,IAG5Cjd,SAASmJ,oBAAoB,IAAkB8T,GAE3C,oBACF,IAAwBvM,aAAa,SAIzCrF,OAAOvK,iBAAiB,SAAU,KAC7B8c,GACDysH,MAWJ,IAAIzsH,EAA0B,KAAM2sH,EAAgC,KAAMD,EAA2B,KAC9F,SAASE,EAAY3tE,EAA0BlsD,GACpD05H,IAEI,oBACF,IAAwBp6H,SAAS,CAC/BhN,KAAM,OACNiN,MAAQC,IACNk6H,OAKNzsH,EAAai/C,EACbj/C,EAAW1d,UAAUC,IAAI,UACzByd,EAAWhN,cAAc1Q,UAAUC,IAAI,aAEnCmqI,IACFA,EAActqI,SAASC,cAAc,OACrCqqI,EAAYpqI,UAAUC,IAAI,oBAG1BmqI,EAAYxpI,iBAAiB,IAAmBiB,IAC9C,YAAYA,GACZkb,OAIJW,EAAWhN,cAAc6P,aAAa6pH,EAAa1sH,GAInD2sH,EAAoB55H,EAEhB,uBACFtF,OAAOvK,iBAAiB,YAAaqZ,GAErC9O,OAAOvK,iBAAiB,cAAemc,EAAS,CAACxF,MAAM,KAUzDzX,SAASc,iBAAiB,IAAkBmc,GAE5C,UAAU1O,cAAc,uBAAuB,GAK1C,SAASk8H,GAAa,MAACnwH,EAAK,MAAEE,GAA4B3W,EAAmBo3F,GAKlF,IAAKjrD,YAAa06F,EAAWn6E,aAAco6E,GAAc9mI,EAEzD,MAAM8X,EAAO3b,SAASiW,KAAK2F,wBACrBgvH,EAAcjvH,EAAKnb,MACnB+0H,EAAe55G,EAAKlb,OAE1Bw6F,EAAO,IAAWh3E,SAAW,QAAU,OACvC,IAAI03D,EAAkD,MAEtD,MAiBM5sD,EAhBG,CACL1U,EAAG,CACDwC,KAAMvC,EACNkvB,MAAOlvB,EAAQowH,GAEjBG,cAAwB,UAAT5vC,EArBA,EAqBkC2vC,EAAcF,EArBhD,EAuBfnwH,EAAG,CACD0Z,IAAKzZ,EACLoC,OAAQpC,EAAQmwH,GAGlBG,cAAetwH,EAAQ+6G,EAAe,EA7BxB,EA6B0CA,EAAeoV,EA7BzD,GAmCZI,EACD,CACDluH,KAAMkS,EAAM1U,EAAEwC,KAAO6tH,EApCN,GAoCkCE,EACjDphG,MAAOza,EAAM1U,EAAEmvB,OArCA,GAkCbuhG,EAKD,CACD92G,IAAKlF,EAAMxU,EAAE0Z,IAAM02G,EAzCL,GAyCiCpV,EAC/C34G,OAAQmS,EAAMxU,EAAEqC,OA1CF,MAoDlB,CAUE,IAAIC,EAQJA,EAAOkuH,EAAgB9vC,GAAQlsE,EAAM1U,EAAE4gF,IAASA,EAAO,SAAUlsE,EAAM87G,eAEvEhnI,EAAKpB,MAAMoa,KAAOA,EAAO,KAY3B,CACE,IAAIoX,EAEJA,EAAM82G,EAAgBpvD,GAAgB5sD,EAAMxU,EAAEohE,IAAiBA,EAAe,SAAU5sD,EAAM+7G,eAE9FjnI,EAAKpB,MAAMwxB,IAAMA,EAAM,KAGzBpwB,EAAKyF,UAAYzF,EAAKyF,UAAUhG,QAAQ,2CAA4C,IACpFO,EAAK3D,UAAUC,KAEK,WAAjBw7E,EAA4BA,EAAe,UAC5C,KACU,WAATsf,EAAoBA,EAAiB,SAATA,EAAkB,QAAU,SAG7D,IAAI+vC,GAA4B,EAAOC,EAAmC,EACnE,SAASC,IACXD,GACDn+H,aAAam+H,GAGfA,EAAmC5/H,OAAOC,WAAW,KACnD2/H,EAAmC,EACnCD,GAA4B,GAC3B,KAEHA,GAA4B,EAGvB,SAASG,EAA0Br2H,EAAsBgjB,EAA2CjqB,GACzG,MAAM1N,EAAM0N,EAAiBA,EAAe1N,IAAI2U,GAAWA,EAAQhU,iBAAiBuF,KAAKyO,GACnFrT,EAASoM,EAAiBA,EAAei8C,aAAazjD,KAAKwH,EAAgBiH,GAAWA,EAAQ3L,oBAAoB9C,KAAKyO,GAE7H,GAAG,YAAY,qBAAoB,CACjC,IAAIlI,EAEJ,MAAM9J,EAAgC,CAAC8oB,SAAS,GAE1Cw/G,EAAW,KACft+H,aAAaF,GAEbnL,EAAO,YAAa2pI,EAAUtoI,GAE9BrB,EAAO,WAAY2pI,EAAUtoI,GAE7BrB,EAAO,cAAe2pI,EAAUtoI,IAGlC3C,EAAI,aAAe4B,IACdA,EAAE+Y,QAAQ7Y,OAAS,EACpBmpI,KAIFjrI,EAAI,YAAairI,EAAUtoI,GAC3B3C,EAAI,WAAYirI,EAAUtoI,GAC1B3C,EAAI,cAAeirI,EAAUtoI,GAE7B8J,EAAUvB,OAAOC,WAAW,KACvB0/H,EACDI,KAIFtzG,EAAS/1B,EAAE+Y,QAAQ,IACnBswH,IAEGxtH,GACD9I,EAAQhU,iBAAiB,WAAY,IAAa,CAAC2W,MAAM,MAE1D,aASLtX,EAAI,cAAe,qBAAsB4B,IACvC+1B,EAAS/1B,GAEN6b,GACD9I,EAAQhU,iBAAiB,WAAY,IAAa,CAAC2W,MAAM,KAEzDqgB,K,gCC/VR,yDA0MA,MAAMjpB,EAA0B,IAlLzB,MASL,cARQ,KAAAw8H,YAAqC,GACrC,KAAAp8H,GAAKkmC,KAAKC,MACV,KAAAk2F,QAAS,EACT,KAAAx8E,IAAM,YAAO,MACb,KAAAwwD,OAAQ,EACR,KAAAisB,YAAclgI,OAAOmwC,SAASygB,KAIpC,IAAIuvE,GAAkB,EAqCtB,GApCAngI,OAAOvK,iBAAiB,WAAaiB,IAGnC,GAFAjC,KAAKw/G,OAASx/G,KAAKgvD,IAAI,WAAY/sD,EAAGypI,GAEnCngI,OAAOmwC,SAASygB,OAASn8D,KAAKyrI,YAG/B,OAFAzrI,KAAK+pH,cAAgB/pH,KAAK+pH,oBAC1B/pH,KAAKkqH,eAGPlqH,KAAKyrI,YAAclgI,OAAOmwC,SAASygB,KAGnC,GADmBl6D,EAAE2yB,QACX50B,KAAKmP,GAEb,YADAnP,KAAK2rI,YAIP,MAAMlmI,EAAOzF,KAAKurI,YAAY7lI,MAC1BD,GAKJzF,KAAKwrI,QAAUE,EACf1rI,KAAK4rI,WAAWnmI,IALdzF,KAAK2rI,cASTpgI,OAAOvK,iBAAiB,UAAYiB,IAClC,MAAMwD,EAAOzF,KAAKurI,YAAYvrI,KAAKurI,YAAYppI,OAAS,GACpDsD,IACS,WAAVxD,EAAEsM,KAAqB9I,EAAKg8F,WAAWh8F,EAAKg8F,aAC7C,YAAYx/F,GACZjC,KAAKkP,KAAKzJ,EAAKtC,SAEhB,CAAC2oB,SAAS,EAAMxQ,SAAS,IAEzB,mBAAkB,CACnB,MAAMtY,EAAU,CAACsY,SAAS,GAC1B/P,OAAOvK,iBAAiB,aAAeiB,IAClCA,EAAE+Y,QAAQ7Y,OAAS,IACtBnC,KAAKw/G,OAASx/G,KAAKgvD,IAAI,cAEpB,YAAoB/sD,KACrBypI,GAAkB,EAElBngI,OAAOvK,iBAAiB,WAAY,KAClCwK,WAAW,KACTkgI,GAAkB,GACjB,MACF,CAACpwH,SAAS,EAAM3D,MAAM,OAoC1B3U,GAGLmB,QAAQ0nI,kBAAoB,SAE5B7rI,KAAK2rI,YAGC,WAAWlmI,GACjB,MAAMyc,EAAOzc,EAAK2K,QAAOpQ,KAAKwrI,aAAiB9mI,GAC/C1E,KAAKw/G,OAASx/G,KAAKgvD,IAAI,wBAAyBvpD,EAAMzF,KAAKurI,cAC/C,IAATrpH,EACDliB,KAAKmQ,SAAS1K,GACLA,EAAK6hG,aACd,cAGFtnG,KAAKwrI,QAAS,EAGT,eAAeroI,GACpB,IAAI,IAAI6H,EAAIhL,KAAKurI,YAAYppI,OAAS,EAAG6I,GAAK,IAAKA,EAAG,CACpD,MAAMvF,EAAOzF,KAAKurI,YAAYvgI,GAC9B,GAAGvF,EAAKtC,OAASA,EACf,MAAO,CAACsC,OAAM6W,MAAOtR,IAKpB,KAAK7H,GACV,GAAGA,EAAM,CACP,MAAMojC,EAAMvmC,KAAKgP,eAAe7L,GAChC,GAAGojC,EAMC,OALFvmC,KAAKwrI,QAAS,EAGZxrI,KAAKurI,YAAY9mI,OAAO8hC,EAAIjqB,MAAO,QACnCtc,KAAK4rI,WAAWrlG,EAAI9gC,MAM1BtB,QAAQ+K,OAGH,SAASzJ,GACdzF,KAAKurI,YAAY5lI,KAAKF,GACtBzF,KAAKw/G,OAASx/G,KAAKgvD,IAAI,YAAavpD,EAAMzF,KAAKurI,aAE3C9lI,EAAKqmI,WACP9rI,KAAK2rI,YAID,YACN3rI,KAAKwrI,QAAS,EACdrnI,QAAQwnI,UAAU3rI,KAAKmP,GAAI,IAGtB,eACLhL,QAAQ+lH,aAAalqH,KAAKmP,GAAI,GAAIusC,SAASqwF,OAASrwF,SAASgyE,UAGxD,WAAWjoH,GAChB,YAAiBzF,KAAKurI,YAAa9lI,GAG9B,aAAatC,EAA8BosC,GAAS,GACzD,IAAI,IAAIvkC,EAAIhL,KAAKurI,YAAYppI,OAAS,EAAG6I,GAAK,IAAKA,EAAG,CAEpD,GADahL,KAAKurI,YAAYvgI,GACtB7H,OAASA,IACfnD,KAAKurI,YAAY9mI,OAAOuG,EAAG,GAExBukC,GACD,SAQV,IAAexgC,wBAA0BA,EAC1B,O,gCC5MA,SAASi9H,EAAcjoI,EAAmBuF,GACvD,MAAMgR,EAAQ,IAAI0a,MAAM1rB,EAAM,CAAC0jB,SAAS,EAAMjG,YAAY,IAC1DhjB,EAAK0K,cAAc6L,GAFrB,mC,gCCAA,oCAuEA,MAAMioC,EAAgB,IA5DtB,oBACU,KAAAlkB,SAGH,GACG,KAAA4tG,IAAM,IAAQ1lI,KAAK,MACnB,KAAAwM,WAAY,EAEZ,GAAGm5H,EAAuCl0G,GAChD,IAAI7xB,EAAUnG,KAAKq+B,SAAS6tG,GAU5B,OATI/lI,IACFnG,KAAKmsI,gBACLhmI,EAAUnG,KAAKq+B,SAAS6tG,GAAQ,oBAGlBxnI,IAAbszB,GACD7xB,EAAQtF,KAAK,IAAMm3B,KAGd7xB,EAGF,QAAQ6xB,GACb,OAAOh4B,KAAKosI,GAAG,OAAQp0G,GAGlB,OAAOA,GACZ,OAAOh4B,KAAKosI,GAAG,QAASp0G,GAQnB,cAAchjB,EAAsBgjB,GACzC,MAAM7xB,EAAU,YAAQ6O,GAAWhV,KAAKyiD,SAAW5/C,QAAQoD,UAM3D,YAJgBvB,IAAbszB,GACD7xB,EAAQtF,KAAK,IAAMm3B,KAGd7xB,EAGD,gBACFnG,KAAK+S,YACP/S,KAAK+S,WAAY,EAEjB/S,KAAKisI,IAAI,KACPjsI,KAAKq+B,SAASguG,MAAQrsI,KAAKq+B,SAASguG,KAAKpmI,UACzCjG,KAAKq+B,SAASiuG,OAAStsI,KAAKq+B,SAASiuG,MAAMrmI,UAE3CjG,KAAK+S,WAAY,EACjB/S,KAAKq+B,SAAW,QAOxB,MAAmB,IAAekkB,cAAgBA,GACnC,O,gCCzEf,6CAQe,SAASoE,EAAoB1kD,GAC1C,OAAO,oBAAoBA,aAAasqI,YAActqI,EAAE+Y,QAAQ,GAAGC,QAAU,K,gCCT/E,oBAgHA,MAAMu+C,EAAkB,IAjGjB,MACE,WACL,OAAO,IAAW9iC,UAAU,uBAAuB71B,KAAMwF,GAChDA,GAIJ,eAAe24B,EAKlB,IAIF,OAAOh/B,KAAK20B,WAAW9zB,KAAK+zB,IAC1B,IAAI43G,EACAC,EACJ,MAAMnzF,EAAwC,CAC5CozF,SAAU,KACVC,aAAc,CACZvlI,EAAG,gCACHkzD,KAAMt7B,EAASs7B,KACfhB,MAAOt6B,EAASs6B,QAKlBkzE,EADCxtG,EAASu7B,gBACW,IAAWqyE,aAAa,aAAc5tG,EAASu7B,gBAAiB3lC,GAAO,GAEvE/xB,QAAQoD,QAAQ,CACnCmB,EAAG,4BAKP,MAAMylI,EAAUj4G,EAAMk4G,SAChBC,EAAQ,IAAInoH,WAAWioH,EAAQE,MAAM5qI,OAAS,IAWpD,OAVA4qI,EAAMC,YACND,EAAMp4H,IAAIk4H,EAAQE,MAAO,GACzBF,EAAQE,MAAQA,EAGdN,EADCztG,EAASy7B,YACO,IAAWmyE,aAAa,aAAc5tG,EAASy7B,YAAa7lC,GAAO,GAEnE/xB,QAAQoD,QAAQ,IAAI2e,YAGhC/hB,QAAQC,IAAI,CAAC0pI,EAAoBC,IAAiB5rI,KAAMosI,IAC7D3zF,EAAOozF,SAAWO,EAAO,GACzB3zF,EAAOqzF,aAAaG,SAAWD,EAC/BvzF,EAAOqzF,aAAaO,kBAAoBD,EAAO,GAExC,IAAWv2G,UAAU,iCAAkC4iB,OAK7D,MAAMozF,EAAkB93G,EAAwB5xB,EAAe,IACpE,OAAO,IAAW4pI,aAAa,aAAcF,EAAU93G,GAAO,GAAO/zB,KAAMssI,GAElE,IAAWz2G,UAAU,qBAAsB,CAChDg2G,SAAUS,GACTnqI,GAASnC,KAAKy6D,IACD,uBAAXA,EAAKl0D,GACN,IAAWgmI,QAAQ9xE,EAAKr2B,MAGnBq2B,KAKN,qBAAqBr5C,GAC1B,OAAO,IAAWyU,UAAU,+BAAgC,CAACzU,SAGxD,sBACL,OAAO,IAAWyU,UAAU,+BAGvB,sBACL,OAAO,IAAWA,UAAU,iCAehC,IAAe8iC,gBAAkBA,EAClB,O,gCClHf,qDASe,MAAM6zE,UAA2B,IAK9C,YAAYrqI,EAA6B,IACvCC,MAAM,OAAD,QACHC,WAAW,GACRF,IAPA,KAAA1B,iBAAkB,EAsClB,KAAAgsI,kBAAqBrrI,IAC1B,YAAYA,GACZjC,KAAKsB,iBAAmBtB,KAAKsB,gBAE7BtB,KAAKutI,cAAcntI,UAAUkM,OAAO,aAActM,KAAKsB,iBACtDtB,KAAK+B,MAA2BoB,KAAOnD,KAAKsB,gBAAkB,OAAS,WACxEtB,KAAKqB,6BAA+BrB,KAAKqB,+BAlCzC,MAAMU,EAAQ/B,KAAK+B,MACnBA,EAAMoB,KAAO,WACbpB,EAAMqB,aAAa,WAAY,IAC/BrB,EAAMsB,aAAe,MAQrB,MAAMmqI,EAAWttI,SAASC,cAAc,SACxCqtI,EAASptI,UAAUC,IAAI,YACvBmtI,EAASC,UAAY,EACrBD,EAASrqI,KAAO,WAChBpB,EAAM+O,cAAc8N,QAAQ4uH,GAC5BzrI,EAAM+O,cAAc6P,aAAa6sH,EAASngG,YAAatrC,EAAM+2D,aAE7D,MAAMy0E,EAAgBvtI,KAAKutI,cAAgBrtI,SAASC,cAAc,QAClEotI,EAAcntI,UAAUC,IAAI,iBAAkB,SAE9CL,KAAKC,UAAUG,UAAUC,IAAI,wBAC7BL,KAAKC,UAAU8J,OAAOwjI,GAEtBA,EAAcvsI,iBAAiB,QAAShB,KAAKstI,mBAC7CC,EAAcvsI,iBAAiB,WAAYhB,KAAKstI","file":"14.97bef6a6862c0bc097eb.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\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: Promise;\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.loadAnimationFromURL({\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 }, 'assets/img/TwoFactorSetupMonkeyPeek.tgs').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationFromURL({\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 }, 'assets/img/TwoFactorSetupMonkeyIdle.tgs').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.loadAnimationFromURL({\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 }, 'assets/img/TwoFactorSetupMonkeyTracking.tgs').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","import IMAGE_MIME_TYPES_SUPPORTED from \"./imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"./videoMimeTypesSupport\";\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function setInnerHTML(elem: Element, html: string) {\r\n elem.setAttribute('dir', 'auto');\r\n elem.innerHTML = html;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, MessageAction } from \"../layer\";\nimport type { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport { forEachReverse } from \"./array\";\n\nexport default function filterChatPhotosMessages(value: {\n count: number;\n next_rate: number;\n offset_id_offset: number;\n history: MyMessage[];\n}) {\n forEachReverse(value.history, (message, idx, arr) => {\n if(!((message as Message.messageService).action as MessageAction.messageActionChatEditPhoto).photo) {\n arr.splice(idx, 1);\n if(value.count !== undefined) {\n --value.count;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { forEachReverse } from \"./array\";\nimport { safeAssign } from \"./object\";\n\nexport type ListLoaderOptions = {\n loadMore: ListLoader['loadMore'],\n loadCount?: ListLoader['loadCount'],\n loadWhenLeft?: ListLoader['loadWhenLeft'],\n processItem?: ListLoader['processItem'],\n onJump?: ListLoader['onJump'],\n onLoadedMore?: ListLoader['onLoadedMore']\n};\n\nexport type ListLoaderResult = {count: number, items: any[]};\nexport default class ListLoader {\n public current: T;\n public previous: T[] = [];\n public next: T[] = [];\n public count: number;\n public reverse = false; // reverse means next = higher msgid\n\n protected loadMore: (anchor: T, older: boolean, loadCount: number) => Promise>;\n protected processItem: (item: P) => T;\n protected loadCount = 50;\n protected loadWhenLeft = 20;\n \n public onJump: (item: T, older: boolean) => void;\n public onLoadedMore: () => void;\n\n protected loadedAllUp = false;\n protected loadedAllDown = false;\n protected loadPromiseUp: Promise;\n protected loadPromiseDown: Promise;\n\n constructor(options: ListLoaderOptions) {\n safeAssign(this, options);\n }\n\n public setTargets(previous: T[], next: T[], reverse: boolean) {\n this.previous = previous;\n this.next = next;\n this.reverse = reverse;\n }\n\n public get index() {\n return this.count !== undefined ? this.previous.length : -1;\n }\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.loadedAllUp = this.loadedAllDown = loadedAll;\n this.loadPromiseUp = this.loadPromiseDown = null;\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 this.previous.push(this.current, ...items);\n } else {\n items = this.previous.splice(this.previous.length + length, -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n this.next.unshift(...items, this.current);\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 // нет смысла делать проверку для reverse и loadMediaPromise\n public load(older: boolean) {\n if(older && this.loadedAllDown) return Promise.resolve();\n else if(!older && this.loadedAllUp) return Promise.resolve();\n\n if(older && this.loadPromiseDown) return this.loadPromiseDown;\n else if(!older && this.loadPromiseUp) return this.loadPromiseUp;\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 const promise = this.loadMore(anchor, older, this.loadCount).then(result => {\n if((older && this.loadPromiseDown !== promise) || (!older && this.loadPromiseUp !== promise)) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n if(older) this.loadedAllDown = true;\n else this.loadedAllUp = true;\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const method = older ? result.items.forEach.bind(result.items) : forEachReverse.bind(null, result.items);\n method((item: any) => {\n const processed = this.processItem ? this.processItem(item) : item;\n\n if(!processed) return;\n\n if(older) {\n if(this.reverse) this.previous.unshift(processed);\n else this.next.push(processed);\n } else {\n if(this.reverse) this.next.push(processed);\n else this.previous.unshift(processed);\n }\n });\n\n this.onLoadedMore && this.onLoadedMore();\n }, () => {}).then(() => {\n if(older) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n });\n\n if(older) this.loadPromiseDown = promise;\n else this.loadPromiseUp = promise;\n\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MediaSearchContext } from \"../components/appMediaPlaybackController\";\nimport type { SearchSuperContext } from \"../components/appSearchSuper.\";\nimport type { Message } from \"../layer\";\nimport appMessagesIdsManager from \"../lib/appManagers/appMessagesIdsManager\";\nimport appMessagesManager, { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport { forEachReverse } from \"./array\";\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 constructor(options: Omit, 'loadMore'> & {onEmptied?: () => void} = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = this.current?.mid;\n\n if(anchor) maxId = anchor.mid;\n if(!older) maxId = appMessagesIdsManager.incrementMessageId(maxId, 1);\n\n return appMessagesManager.getSearch({\n ...this.searchContext,\n peerId: this.searchContext.peerId || anchor?.peerId,\n maxId,\n limit: backLimit ? 0 : loadCount,\n backLimit\n }).then(value => {\n /* if(DEBUG) {\n this.log('loaded more media by maxId:', maxId, value, older, this.reverse);\n } */\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n filterChatPhotosMessages(value);\n }\n\n if(value.next_rate) {\n this.searchContext.nextRate = value.next_rate;\n }\n\n return {count: value.count, items: value.history};\n });\n },\n processItem: (message) => {\n const filtered = this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n }\n\n protected filterMids(mids: number[]) {\n const storage = this.searchContext.isScheduled ? \n appMessagesManager.getScheduledMessagesStorage(this.searchContext.peerId) : \n appMessagesManager.getMessagesStorage(this.searchContext.peerId);\n const filtered = appMessagesManager.filterMessagesByInputFilter(this.searchContext.inputFilter._, mids, storage, mids.length) as Message.message[];\n return filtered;\n }\n\n protected onHistoryDelete = ({peerId, msgs}: {peerId: PeerId, msgs: Set}) => {\n const shouldBeDeleted = (item: Item) => item.peerId === peerId && msgs.has(item.mid);\n const filter = (item: Item, idx: number, arr: Item[]) => {\n if(shouldBeDeleted(item)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n\n if(this.current && shouldBeDeleted(this.current)) {\n /* if(this.go(1)) {\n this.previous.splice(this.previous.length - 1, 1);\n } else if(this.go(-1)) {\n this.next.splice(0, 1);\n } else */if(this.onEmptied) {\n this.onEmptied();\n }\n }\n };\n\n protected onHistoryMultiappend = (obj: {\n [peerId: string]: Set;\n }) => {\n if(this.searchContext.folderId !== undefined) {\n return;\n }\n\n // because it's reversed\n if(!this.loadedAllUp || this.loadPromiseUp) {\n return;\n }\n\n const mids = obj[this.searchContext.peerId];\n if(!mids) {\n return;\n }\n\n const sorted = Array.from(mids).sort((a, b) => a - b);\n const filtered = this.filterMids(sorted);\n const targets = filtered.map(message => this.processItem(message)).filter(Boolean);\n if(targets.length) {\n this.next.push(...targets);\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend({\n [message.peerId]: new Set([message.mid])\n });\n };\n\n public setSearchContext(context: SearchSuperContext) {\n this.searchContext = context;\n\n if(this.searchContext.folderId !== undefined) {\n this.loadedAllUp = true;\n\n if(this.searchContext.nextRate === undefined) {\n this.loadedAllDown = true;\n }\n }\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n this.loadedAllUp = true;\n }\n\n if(!this.searchContext.useSearch) {\n this.loadedAllDown = this.loadedAllUp = true;\n }\n }\n\n public reset() {\n super.reset();\n this.searchContext = undefined;\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}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\r\nimport Scrollable from \"./scrollable\";\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport InputSearch from \"./inputSearch\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nexport class SearchGroup {\r\n container: HTMLDivElement;\r\n nameEl: HTMLDivElement;\r\n list: HTMLUListElement;\r\n\r\n constructor(public name: LangPackKey | boolean, public type: string, private clearable = true, className?: string, clickable = true, public autonomous = true, public onFound?: () => void) {\r\n this.list = appDialogsManager.createChatList();\r\n this.container = document.createElement('div');\r\n if(className) this.container.className = className;\r\n \r\n if(name) {\r\n this.nameEl = document.createElement('div');\r\n this.nameEl.classList.add('search-group__name');\r\n if(typeof(name) === 'string') {\r\n this.nameEl.append(i18n(name));\r\n }\r\n this.container.append(this.nameEl);\r\n }\r\n \r\n this.container.classList.add('search-group', 'search-group-' + type);\r\n this.container.append(this.list);\r\n this.container.style.display = 'none';\r\n\r\n if(clickable) {\r\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\r\n }\r\n }\r\n\r\n clear() {\r\n this.container.style.display = 'none';\r\n\r\n if(this.clearable) {\r\n this.list.innerHTML = '';\r\n }\r\n }\r\n\r\n setActive() {\r\n this.container.style.display = '';\r\n }\r\n\r\n toggle() {\r\n if(this.list.childElementCount) {\r\n this.setActive();\r\n } else {\r\n this.clear();\r\n }\r\n }\r\n}\r\n\r\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\r\n\r\nexport default class AppSearch {\r\n private minMsgId = 0;\r\n private loadedCount = -1;\r\n private foundCount = -1;\r\n\r\n private searchPromise: Promise = null;\r\n private searchTimeout: number = 0;\r\n\r\n private query = '';\r\n\r\n private listsContainer: HTMLDivElement = null;\r\n\r\n private peerId: PeerId; // 0 - means global\r\n private threadId = 0;\r\n\r\n private scrollable: Scrollable;\r\n\r\n constructor(public container: HTMLElement, public searchInput: InputSearch, public searchGroups: {[group in SearchGroupType]: SearchGroup}, public onSearch?: (count: number) => void) {\r\n this.scrollable = new Scrollable(this.container);\r\n this.listsContainer = this.scrollable.container as HTMLDivElement;\r\n for(let i in this.searchGroups) {\r\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\r\n }\r\n\r\n if(this.searchGroups.messages) {\r\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\r\n }\r\n\r\n this.searchInput.onChange = (value) => {\r\n /* if(!value.trim()) {\r\n //this.peerId = 0;\r\n return;\r\n } */\r\n \r\n this.query = value;\r\n this.reset(false);\r\n this.searchMore();\r\n };\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n if(!this.query.trim()) return;\r\n \r\n if(!this.searchTimeout) {\r\n this.searchTimeout = window.setTimeout(() => {\r\n this.searchMore();\r\n this.searchTimeout = 0;\r\n }, 0);\r\n }\r\n };\r\n }\r\n\r\n public reset(all = true) {\r\n if(all) {\r\n this.searchInput.value = '';\r\n this.query = '';\r\n this.peerId = undefined;\r\n this.threadId = 0;\r\n }\r\n\r\n this.minMsgId = 0;\r\n this.loadedCount = -1;\r\n this.foundCount = -1;\r\n\r\n for(let i in this.searchGroups) {\r\n this.searchGroups[i as SearchGroupType].clear();\r\n }\r\n \r\n this.searchPromise = null;\r\n }\r\n\r\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n\r\n if(this.query !== query) {\r\n this.searchInput.inputField.value = query;\r\n }\r\n\r\n this.searchInput.input.focus();\r\n }\r\n\r\n public searchMore() {\r\n if(this.searchPromise) return this.searchPromise;\r\n \r\n const query = this.query;\r\n \r\n if(!query.trim()) {\r\n this.onSearch && this.onSearch(0);\r\n return;\r\n }\r\n \r\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\r\n return Promise.resolve();\r\n }\r\n \r\n const maxId = this.minMsgId || 0;\r\n\r\n return this.searchPromise = appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n query, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n maxId, \r\n limit: 20,\r\n threadId: this.threadId\r\n }).then(res => {\r\n this.searchPromise = null;\r\n \r\n if(this.searchInput.value !== query) {\r\n return;\r\n }\r\n \r\n //console.log('input search result:', this.peerId, query, null, maxId, 20, res);\r\n \r\n const {count, history} = res;\r\n \r\n if(history.length && history[0].mid === this.minMsgId) {\r\n history.shift();\r\n }\r\n \r\n const searchGroup = this.searchGroups.messages;\r\n\r\n history.forEach((message) => {\r\n const peerId = this.peerId ? message.fromId : message.peerId;\r\n const {dialog, dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId, \r\n container: this.scrollable/* searchGroup.list */, \r\n drawStatus: false,\r\n avatarSize: 54,\r\n meAsSaved: false\r\n });\r\n\r\n if(message.peerId !== peerId) {\r\n dom.listEl.dataset.peerId = '' + message.peerId;\r\n }\r\n\r\n appDialogsManager.setLastMessage(dialog, message, dom, query);\r\n });\r\n\r\n searchGroup.toggle();\r\n \r\n this.minMsgId = history.length && history[history.length - 1].mid;\r\n \r\n if(this.loadedCount === -1) {\r\n this.loadedCount = 0;\r\n }\r\n this.loadedCount += history.length;\r\n \r\n if(this.foundCount === -1) {\r\n this.foundCount = count;\r\n\r\n if(searchGroup.nameEl) {\r\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\r\n }\r\n \r\n this.onSearch && this.onSearch(this.foundCount);\r\n }\r\n }).catch(err => {\r\n console.error('search error', err);\r\n this.searchPromise = null;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { getRichValue } from \"../helpers/dom\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport InputField from \"./inputField\";\r\n\r\nexport default class InputSearch {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputField: InputField;\r\n public clearBtn: HTMLElement;\r\n\r\n public prevValue = '';\r\n public timeout = 0;\r\n public onChange: (value: string) => void;\r\n public onClear: () => void;\r\n\r\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\r\n this.inputField = new InputField({\r\n placeholder,\r\n plainText: true\r\n });\r\n\r\n this.container = this.inputField.container;\r\n this.container.classList.remove('input-field');\r\n this.container.classList.add('input-search');\r\n\r\n this.onChange = onChange;\r\n\r\n this.input = this.inputField.input;\r\n this.input.classList.add('input-search-input');\r\n\r\n const searchIcon = document.createElement('i');\r\n searchIcon.classList.add('tgico', 'tgico-search');\r\n\r\n this.clearBtn = document.createElement('i');\r\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\r\n\r\n this.input.addEventListener('input', this.onInput);\r\n this.clearBtn.addEventListener('click', this.onClearClick);\r\n\r\n this.container.append(searchIcon, this.clearBtn);\r\n }\r\n \r\n onInput = () => {\r\n if(!this.onChange) return;\r\n\r\n let value = this.value;\r\n\r\n //this.input.classList.toggle('is-empty', !value.trim());\r\n\r\n if(value !== this.prevValue) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.timeout = window.setTimeout(() => {\r\n this.onChange(value);\r\n }, 200);\r\n }\r\n };\r\n\r\n onClearClick = () => {\r\n this.value = '';\r\n this.onChange && this.onChange('');\r\n this.onClear && this.onClear();\r\n };\r\n\r\n get value() {\r\n return this.inputField.value;\r\n }\r\n\r\n set value(value: string) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.inputField.value = value;\r\n }\r\n\r\n public remove() {\r\n clearTimeout(this.timeout);\r\n this.input.removeEventListener('input', this.onInput);\r\n this.clearBtn.removeEventListener('click', this.onClearClick);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from \"./button\";\r\n\r\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-icon', {\r\n icon: className || undefined, \r\n ...options\r\n });\r\n\r\n return button;\r\n};\r\n\r\nexport default ButtonIcon;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport EventListenerBase from \"../helpers/eventListenerBase\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport Scrollable from \"./scrollable\";\r\nimport SidebarSlider from \"./slider\";\r\n\r\nexport interface SliderTab {\r\n onOpen?: () => void,\r\n onOpenAfterTimeout?: () => void,\r\n onClose?: () => void,\r\n onCloseAfterTimeout?: () => void\r\n}\r\n\r\nexport interface SliderSuperTabConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTab;\r\n}\r\n\r\nexport default class SliderSuperTab implements SliderTab {\r\n public container: HTMLElement;\r\n\r\n public header: HTMLElement;\r\n public closeBtn: HTMLElement;\r\n public title: HTMLElement;\r\n\r\n public content: HTMLElement;\r\n public scrollable: Scrollable;\r\n\r\n public slider: SidebarSlider;\r\n public destroyable: boolean;\r\n public listenerSetter: ListenerSetter;\r\n\r\n constructor(slider: SidebarSlider, destroyable?: boolean) {\r\n this._constructor(slider, destroyable);\r\n }\r\n\r\n public _constructor(slider: SidebarSlider, destroyable = true): any {\r\n this.slider = slider;\r\n this.destroyable = destroyable;\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\r\n\r\n // * Header\r\n this.header = document.createElement('div');\r\n this.header.classList.add('sidebar-header');\r\n\r\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\r\n this.title = document.createElement('div');\r\n this.title.classList.add('sidebar-header__title');\r\n this.header.append(this.closeBtn, this.title);\r\n\r\n // * Content\r\n this.content = document.createElement('div');\r\n this.content.classList.add('sidebar-content');\r\n\r\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\r\n\r\n this.container.append(this.header, this.content);\r\n\r\n this.slider.addTab(this);\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public close() {\r\n return this.slider.closeTab(this);\r\n }\r\n\r\n public async open(...args: any[]) {\r\n if(this.init) {\r\n try {\r\n const result = this.init();\r\n this.init = null;\r\n\r\n if(result instanceof Promise) {\r\n await result;\r\n }\r\n } catch(err) {\r\n console.error('open tab error', err);\r\n }\r\n }\r\n\r\n return this.slider.selectTab(this);\r\n }\r\n\r\n protected init(): Promise | any {\r\n\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\r\n this.slider.tabs.delete(this);\r\n this.container.remove();\r\n }\r\n\r\n if(this.listenerSetter) {\r\n this.listenerSetter.removeAll();\r\n }\r\n }\r\n\r\n protected setTitle(key: LangPackKey) {\r\n this.title.innerHTML = '';\r\n this.title.append(i18n(key));\r\n }\r\n}\r\n\r\nexport class SliderSuperTabEventable extends SliderSuperTab {\r\n public eventListener: EventListenerBase<{\r\n destroy: () => void\r\n }>;\r\n\r\n constructor(slider: SidebarSlider) {\r\n super(slider);\r\n this.eventListener = new EventListenerBase();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.eventListener.dispatchEvent('destroy');\r\n this.eventListener.cleanup();\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n\r\n/* // @ts-ignore\r\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\r\n superConstructor: (...args: any[]) => any;\r\n}\r\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\r\n constructor(slider: SidebarSlider) {\r\n this.superConstructor([slider, true]);\r\n }\r\n}\r\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\r\n\r\n(window as any).lol = SliderSuperEventsTab\r\n\r\nexport {SliderSuperEventsTab}; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { horizontalMenu } from \"./horizontalMenu\";\r\nimport { TransitionSlider } from \"./transition\";\r\nimport appNavigationController, { NavigationItem } from \"./appNavigationController\";\r\nimport SliderSuperTab, { SliderSuperTabConstructable, SliderTab } from \"./sliderTab\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\n\r\nconst TRANSITION_TIME = 250;\r\n\r\nexport type {SliderTab};\r\nexport {SliderSuperTab};\r\n\r\nexport default class SidebarSlider {\r\n protected _selectTab: ReturnType;\r\n public historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\r\n public tabsContainer: HTMLElement;\r\n public sidebarEl: HTMLElement;\r\n public tabs: Map; // * key is any, since right sidebar is ugly now\r\n private canHideFirst = false;\r\n private navigationType: NavigationItem['type']\r\n\r\n constructor(options: {\r\n sidebarEl: SidebarSlider['sidebarEl'],\r\n tabs?: SidebarSlider['tabs'],\r\n canHideFirst?: SidebarSlider['canHideFirst'],\r\n navigationType: SidebarSlider['navigationType']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.tabs) {\r\n this.tabs = new Map();\r\n }\r\n\r\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\r\n this._selectTab = TransitionSlider(this.tabsContainer, 'navigation', TRANSITION_TIME);\r\n if(!this.canHideFirst) {\r\n this._selectTab(0);\r\n }\r\n\r\n Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach(el => {\r\n attachClickEvent(el, this.onCloseBtnClick);\r\n });\r\n }\r\n\r\n public onCloseBtnClick = () => {\r\n const item = appNavigationController.findItemByType(this.navigationType);\r\n if(item) {\r\n appNavigationController.back(this.navigationType);\r\n } else if(this.historyTabIds.length) {\r\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\r\n }\r\n // this.closeTab();\r\n };\r\n\r\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\r\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\r\n return false;\r\n }\r\n\r\n //console.log('sidebar-close-button click:', this.historyTabIDs);\r\n const closingId = this.historyTabIds.pop(); // pop current\r\n this.onCloseTab(closingId, animate, isNavigation);\r\n\r\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\r\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\r\n return true;\r\n };\r\n\r\n public selectTab(id: number | SliderSuperTab): boolean {\r\n /* if(id instanceof SliderSuperTab) {\r\n id = id.id;\r\n } */\r\n\r\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\r\n return false;\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onOpen) {\r\n tab.onOpen();\r\n }\r\n \r\n if(tab.onOpenAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onOpenAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n\r\n //if(!this.canHideFirst || this.historyTabIds.length) {\r\n appNavigationController.pushItem({\r\n type: this.navigationType, \r\n onPop: (canAnimate) => {\r\n this.closeTab(undefined, canAnimate, true);\r\n return true;\r\n }\r\n });\r\n //}\r\n \r\n this.historyTabIds.push(id);\r\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\r\n return true;\r\n }\r\n\r\n public removeTabFromHistory(id: number | SliderSuperTab) {\r\n indexOfAndSplice(this.historyTabIds, id);\r\n this.onCloseTab(id, undefined);\r\n }\r\n\r\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\r\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\r\n const tab = this.historyTabIds[i];\r\n if(tab === preserveTab) continue;\r\n else if(tab instanceof tabConstructor) {\r\n break;\r\n }\r\n\r\n this.removeTabFromHistory(tab);\r\n //appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n }\r\n\r\n public getTab(tabConstructor: SliderSuperTabConstructable) {\r\n return this.historyTabIds.find(t => t instanceof tabConstructor) as SliderSuperTab;\r\n }\r\n\r\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\r\n return !!this.getTab(tabConstructor);\r\n }\r\n\r\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\r\n if(!isNavigation) {\r\n appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onClose) {\r\n tab.onClose();\r\n }\r\n\r\n if(tab.onCloseAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onCloseAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n }\r\n\r\n public addTab(tab: SliderSuperTab) {\r\n if(!tab.container.parentElement) {\r\n this.tabsContainer.append(tab.container);\r\n\r\n if(tab.closeBtn) {\r\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\r\n }\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport type { InputFile } from \"../layer\";\r\nimport PopupAvatar from \"./popups/avatar\";\r\n\r\nexport default class AvatarEdit {\r\n public container: HTMLElement;\r\n private canvas: HTMLCanvasElement;\r\n private icon: HTMLSpanElement;\r\n\r\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('avatar-edit');\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.canvas.classList.add('avatar-edit-canvas');\r\n\r\n this.icon = document.createElement('span');\r\n this.icon.classList.add('tgico', 'tgico-cameraadd');\r\n\r\n this.container.append(this.canvas, this.icon);\r\n\r\n this.container.addEventListener('click', () => {\r\n new PopupAvatar().open(this.canvas, onChange);\r\n });\r\n }\r\n\r\n public clear() {\r\n const ctx = this.canvas.getContext('2d');\r\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from \"./button\";\r\n\r\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\r\n return button;\r\n};\r\n\r\nexport default ButtonCorner;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarLeft from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport { SearchGroup } from \"../../appSearch\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppNewGroupTab extends SliderSuperTab {\r\n private searchGroup = new SearchGroup(true, 'contacts', true, 'new-group-members disable-hover', false);\r\n private avatarEdit: AvatarEdit;\r\n private uploadAvatar: () => Promise = null;\r\n private peerIds: PeerId[];\r\n private nextBtn: HTMLButtonElement;\r\n private groupNameInputField: InputField;\r\n\r\n protected init() {\r\n this.container.classList.add('new-group-container');\r\n this.setTitle('NewGroup');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const 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 inputWrapper.append(this.groupNameInputField.container);\r\n\r\n this.groupNameInputField.input.addEventListener('input', () => {\r\n const value = this.groupNameInputField.value;\r\n this.nextBtn.classList.toggle('is-visible', !!value.length && !this.groupNameInputField.input.classList.contains('error'));\r\n });\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.groupNameInputField.value;\r\n\r\n this.nextBtn.disabled = true;\r\n appChatsManager.createChat(title, this.peerIds.map(peerId => peerId.toUserId())).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n });\r\n });\r\n\r\n const chatsContainer = document.createElement('div');\r\n chatsContainer.classList.add('chatlist-container');\r\n chatsContainer.append(this.searchGroup.container);\r\n\r\n this.content.append(this.nextBtn);\r\n this.scrollable.append(this.avatarEdit.container, inputWrapper, chatsContainer);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.searchGroup.clear();\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.groupNameInputField.value = '';\r\n this.nextBtn.disabled = false;\r\n }\r\n\r\n public open(peerIds: PeerId[]) {\r\n const result = super.open();\r\n result.then(() => {\r\n this.peerIds = peerIds;\r\n\r\n this.peerIds.forEach(userId => {\r\n let {dom} = appDialogsManager.addDialogNew({\r\n dialog: userId,\r\n container: this.searchGroup.list,\r\n drawStatus: false,\r\n rippleEnabled: false,\r\n avatarSize: 48\r\n });\r\n\r\n dom.lastMessageSpan.append(appUsersManager.getUserStatusString(userId));\r\n });\r\n\r\n this.searchGroup.nameEl.textContent = '';\r\n this.searchGroup.nameEl.append(i18n('Members', [this.peerIds.length]));\r\n this.searchGroup.setActive();\r\n });\r\n \r\n return result;\r\n }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { IS_APPLE, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport type { SearchSuperContext } from \"./appSearchSuper.\";\r\nimport { copy, deepEqual } from \"../helpers/object\";\r\nimport { DocumentAttribute, Message, MessageMedia, PhotoSize } from \"../layer\";\r\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport SearchListLoader from \"../helpers/searchListLoader\";\r\nimport { onMediaLoad } from \"../helpers/files\";\r\n\r\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\r\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\r\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\r\n\r\nexport type MediaItem = {mid: number, peerId: PeerId};\r\n\r\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\r\n\r\nconst SHOULD_USE_SAFARI_FIX = (() => {\r\n try {\r\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\r\n } catch(err) {\r\n return false;\r\n }\r\n})();\r\n\r\nconst SEEK_OFFSET = 10;\r\n\r\nexport type MediaSearchContext = SearchSuperContext & Partial<{\r\n isScheduled: boolean,\r\n useSearch: boolean\r\n}>;\r\n\r\ntype MediaDetails = {\r\n peerId: PeerId, \r\n mid: number, \r\n docId: DocId, \r\n clean?: boolean,\r\n isScheduled?: boolean, \r\n isSingle?: boolean\r\n};\r\n\r\nclass AppMediaPlaybackController {\r\n private container: HTMLElement;\r\n private media: Map> = new Map();\r\n private scheduled: AppMediaPlaybackController['media'] = new Map();\r\n private mediaDetails: Map = new Map();\r\n private playingMedia: HTMLMediaElement;\r\n\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 private _volume = 1;\r\n private _muted = false;\r\n private _playbackRate = 1;\r\n private lockedSwitchers: boolean;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n //this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\r\n this.container.style.cssText = 'display: none;';\r\n document.body.append(this.container);\r\n\r\n if(navigator.mediaSession) {\r\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\r\n play: this.play,\r\n pause: this.pause,\r\n stop: this.stop,\r\n seekbackward: this.seekBackward,\r\n seekforward: this.seekForward,\r\n seekto: this.seekTo,\r\n previoustrack: this.previous,\r\n nexttrack: this.next\r\n };\r\n\r\n for(const action in actions) {\r\n try {\r\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\r\n } catch(err) {\r\n console.warn('MediaSession action is not supported:', action);\r\n }\r\n }\r\n }\r\n\r\n rootScope.addEventListener('document_downloaded', (doc) => {\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n for(const media of set) {\r\n this.onMediaDocumentLoad(media);\r\n }\r\n }\r\n });\r\n\r\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\r\n const keys = [\r\n 'volume' as const, \r\n 'muted' as const, \r\n 'playbackRate' as const\r\n ];\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) {\r\n // @ts-ignore\r\n this.playingMedia[key] = value;\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 const {volume, muted, playbackRate} = this;\r\n rootScope.dispatchEvent('media_playback_params', {\r\n volume, muted, playbackRate\r\n });\r\n }\r\n\r\n public seekBackward = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekForward = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekTo = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = details.seekTime;\r\n }\r\n };\r\n\r\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\r\n const {peerId, mid} = message;\r\n\r\n const isScheduled = !!message.pFlags.is_scheduled;\r\n const s = isScheduled ? this.scheduled : this.media;\r\n let storage = s.get(message.peerId);\r\n if(!storage) {\r\n s.set(message.peerId, storage = new Map());\r\n }\r\n\r\n let media = storage.get(mid);\r\n if(media) {\r\n return media;\r\n }\r\n\r\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(message);\r\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\r\n //const source = document.createElement('source');\r\n //source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\r\n\r\n if(doc.type === 'round') {\r\n media.setAttribute('playsinline', 'true');\r\n //media.muted = true;\r\n }\r\n\r\n const details: MediaDetails = {\r\n peerId,\r\n mid,\r\n docId: doc.id,\r\n clean,\r\n isScheduled: message.pFlags.is_scheduled\r\n };\r\n\r\n this.mediaDetails.set(media, details);\r\n\r\n //media.autoplay = true;\r\n media.volume = 1;\r\n //media.append(source);\r\n\r\n this.container.append(media);\r\n\r\n media.addEventListener('play', this.onPlay);\r\n media.addEventListener('pause', this.onPause);\r\n media.addEventListener('ended', this.onEnded);\r\n\r\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\r\n media.addEventListener('timeupdate', () => {\r\n appMessagesManager.readMessages(peerId, [mid]);\r\n }, {once: true});\r\n }\r\n \r\n /* const onError = (e: Event) => {\r\n //console.log('appMediaPlaybackController: video onError', e);\r\n\r\n if(this.nextMid === mid) {\r\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\r\n if(this.nextMid && storage[this.nextMid]) {\r\n storage[this.nextMid].play();\r\n }\r\n });\r\n }\r\n };\r\n\r\n media.addEventListener('error', onError); */\r\n\r\n const deferred = deferredPromise();\r\n if(autoload) {\r\n deferred.resolve();\r\n } else {\r\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n let waitingStorage = w.get(peerId);\r\n if(!waitingStorage) {\r\n w.set(peerId, waitingStorage = new Map());\r\n }\r\n\r\n waitingStorage.set(mid, deferred);\r\n }\r\n\r\n deferred.then(() => {\r\n //media.autoplay = true;\r\n //console.log('will set media url:', media, doc, doc.type, doc.url);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(doc.supportsStreaming || cacheContext.url) {\r\n this.onMediaDocumentLoad(media);\r\n } else {\r\n let set = this.waitingDocumentsForLoad[doc.id];\r\n if(!set) {\r\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\r\n }\r\n\r\n set.add(media);\r\n appDocsManager.downloadDoc(doc);\r\n }\r\n }/* , onError */);\r\n \r\n return media;\r\n }\r\n\r\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\r\n return s?.get(mid);\r\n }\r\n\r\n private onMediaDocumentLoad = (media: HTMLMediaElement) => {\r\n const details = this.mediaDetails.get(media);\r\n const doc = appDocsManager.getDoc(details.docId);\r\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\r\n this.handleSafariStreamable(media);\r\n }\r\n\r\n // setTimeout(() => {\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n media.src = cacheContext.url;\r\n // }, doc.supportsStreaming ? 500e3 : 0);\r\n\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n set.delete(media);\r\n\r\n if(!set.size) {\r\n delete this.waitingDocumentsForLoad[doc.id];\r\n }\r\n }\r\n };\r\n\r\n // safari подгрузит последний чанк и песня включится,\r\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\r\n private handleSafariStreamable(media: HTMLMediaElement) {\r\n media.addEventListener('play', () => {\r\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\r\n return;\r\n } */\r\n\r\n //media.volume = 0;\r\n const currentTime = media.currentTime;\r\n //this.setSafariBuffering(media, true);\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = media.duration - 1;\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = currentTime;\r\n //media.volume = 1;\r\n //this.setSafariBuffering(media, false);\r\n\r\n if(!media.paused) {\r\n media.play()/* .catch(() => {}) */;\r\n }\r\n }, {once: true});\r\n }, {once: true});\r\n }/* , {once: true} */);\r\n }\r\n\r\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n const storage = w.get(peerId);\r\n if(!storage) {\r\n return;\r\n }\r\n\r\n const promise = storage.get(mid);\r\n if(promise) {\r\n promise.resolve();\r\n storage.delete(mid);\r\n\r\n if(!storage.size) {\r\n w.delete(peerId);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Only for audio\r\n */\r\n public isSafariBuffering(media: HTMLMediaElement) {\r\n /// @ts-ignore\r\n return !!media.safariBuffering;\r\n }\r\n\r\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\r\n // @ts-ignore\r\n media.safariBuffering = value;\r\n }\r\n\r\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\r\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\r\n\r\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\r\n \r\n const artwork: MediaImage[] = [];\r\n\r\n const isVoice = doc.type === 'voice' || doc.type === 'round';\r\n let title = '', artist = '';\r\n\r\n if(doc.thumbs?.length) {\r\n const size = doc.thumbs[doc.thumbs.length - 1];\r\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\r\n const cacheContext = appDownloadManager.getCacheContext(doc, size.type);\r\n\r\n if(cacheContext.url) {\r\n artwork.push({\r\n src: cacheContext.url,\r\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n const download = appPhotosManager.preloadPhoto(doc, size);\r\n download.then(() => {\r\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\r\n return;\r\n }\r\n\r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n } else if(isVoice) {\r\n const peerId = message.fromId || message.peerId;\r\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\r\n if(peerPhoto) {\r\n const result = appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\r\n if(result.cached) {\r\n const url = await result.loadPromise;\r\n artwork.push({\r\n src: url,\r\n sizes: '160x160',\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n result.loadPromise.then((url) => {\r\n if(this.playingMedia !== playingMedia || !url) {\r\n return;\r\n }\r\n \r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n\r\n title = appPeersManager.getPeerTitle(peerId, true, false);\r\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\r\n }\r\n\r\n if(!isVoice) {\r\n const attribute = doc.attributes.find(attribute => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\r\n title = attribute && attribute.title || doc.file_name;\r\n artist = attribute && attribute.performer;\r\n }\r\n\r\n if(!artwork.length) {\r\n if(IS_APPLE) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon-precomposed.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n } else {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n }\r\n } else {\r\n [72, 96, 144, 192, 256, 384, 512].forEach(size => {\r\n const sizes = `${size}x${size}`;\r\n artwork.push({\r\n src: `assets/img/android-chrome-${sizes}.png`,\r\n sizes,\r\n type: 'image/png'\r\n });\r\n });\r\n }\r\n }\r\n\r\n const metadata = new MediaMetadata({\r\n title,\r\n artist,\r\n artwork\r\n });\r\n\r\n navigator.mediaSession.metadata = metadata;\r\n }\r\n\r\n private getMessageByMedia(media: HTMLMediaElement) {\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n const message = details.isScheduled ? appMessagesManager.getScheduledMessageByPeer(peerId, mid) : appMessagesManager.getMessageByPeer(peerId, mid);\r\n return message;\r\n }\r\n\r\n private onPlay = (e?: Event) => {\r\n const media = e.target as HTMLMediaElement;\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n\r\n //console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\r\n\r\n const message = this.getMessageByMedia(media);\r\n\r\n const previousMedia = this.playingMedia;\r\n if(previousMedia !== media) {\r\n this.stop();\r\n\r\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\r\n if(!this.listLoader.current || !verify(this.listLoader.current)) {\r\n let idx = this.listLoader.previous.findIndex(verify);\r\n let jumpLength: number;\r\n if(idx !== -1) {\r\n jumpLength = -(this.listLoader.previous.length - idx);\r\n } else {\r\n idx = this.listLoader.next.findIndex(verify);\r\n if(idx !== -1) {\r\n jumpLength = idx + 1;\r\n }\r\n }\r\n \r\n if(idx !== -1) {\r\n if(jumpLength) {\r\n this.listLoader.go(jumpLength, false);\r\n }\r\n } else {\r\n this.setTargets({peerId, mid});\r\n }\r\n }\r\n\r\n this.setMedia(media, message);\r\n }\r\n\r\n // audio_pause не успеет сработать без таймаута\r\n setTimeout(() => {\r\n rootScope.dispatchEvent('media_play', {doc: appMessagesManager.getMediaFromMessage(message), message, media});\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 rootScope.dispatchEvent('media_pause');\r\n };\r\n\r\n private onEnded = (e?: Event) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n\r\n this.onPause(e);\r\n\r\n //console.log('on media end');\r\n\r\n if(!this.next()) {\r\n this.stop();\r\n rootScope.dispatchEvent('media_stop');\r\n }\r\n };\r\n\r\n public toggle(play?: boolean) {\r\n if(!this.playingMedia) {\r\n return false;\r\n }\r\n\r\n if(play === undefined) {\r\n play = this.playingMedia.paused;\r\n }\r\n\r\n if(this.playingMedia.paused !== play) {\r\n return false;\r\n }\r\n\r\n if(play) {\r\n this.playingMedia.play();\r\n } else {\r\n this.playingMedia.pause();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public play = () => {\r\n return this.toggle(true);\r\n };\r\n\r\n public pause = () => {\r\n return this.toggle(false);\r\n };\r\n\r\n public stop = () => {\r\n const media = this.playingMedia;\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(!media.paused) {\r\n media.pause();\r\n }\r\n\r\n media.currentTime = 0;\r\n simulateEvent(media, 'ended');\r\n\r\n const details = this.mediaDetails.get(media);\r\n if(details?.clean) {\r\n media.src = '';\r\n const peerId = details.peerId;\r\n const s = details.isScheduled ? this.scheduled : this.media;\r\n const storage = s.get(peerId);\r\n if(storage) {\r\n storage.delete(details.mid);\r\n \r\n if(!storage.size) {\r\n s.delete(peerId);\r\n }\r\n }\r\n \r\n media.remove();\r\n\r\n this.mediaDetails.delete(media);\r\n }\r\n\r\n this.playingMedia = undefined;\r\n\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 next = () => {\r\n return !this.lockedSwitchers && this.listLoader.go(1);\r\n };\r\n\r\n public previous = () => {\r\n const media = this.playingMedia;\r\n if(media && (media.currentTime > 5 || !this.listLoader.previous.length)) {\r\n media.currentTime = 0;\r\n this.toggle(true);\r\n return;\r\n }\r\n\r\n return !this.lockedSwitchers && this.listLoader.go(-1);\r\n };\r\n\r\n public willBePlayed(media: HTMLMediaElement) {\r\n this.willBePlayedMedia = media;\r\n }\r\n\r\n public setSearchContext(context: MediaSearchContext) {\r\n if(deepEqual(this.searchContext, context)) {\r\n return false;\r\n }\r\n\r\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\r\n return true;\r\n }\r\n\r\n public getSearchContext() {\r\n return this.searchContext;\r\n }\r\n\r\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\r\n if(!this.listLoader) {\r\n this.listLoader = new SearchListLoader({\r\n loadCount: 10,\r\n loadWhenLeft: 5,\r\n processItem: (message: Message.message) => {\r\n this.addMedia(message, false);\r\n return {peerId: message.peerId, mid: message.mid};\r\n },\r\n onJump: (item, older) => {\r\n this.playItem(item);\r\n },\r\n onEmptied: () => {\r\n rootScope.dispatchEvent('media_stop');\r\n this.stop();\r\n }\r\n });\r\n } else {\r\n this.listLoader.reset();\r\n }\r\n\r\n const reverse = this.searchContext.folderId !== undefined ? false : true;\r\n if(prev) {\r\n this.listLoader.setTargets(prev, next, reverse);\r\n } else {\r\n this.listLoader.reverse = reverse;\r\n }\r\n\r\n this.listLoader.setSearchContext(this.searchContext);\r\n this.listLoader.current = current;\r\n\r\n this.listLoader.load(true);\r\n this.listLoader.load(false);\r\n }\r\n\r\n public setMedia(media: HTMLMediaElement, message: Message.message) {\r\n this.playingMedia = media;\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('mediaSession' in navigator) {\r\n this.setNewMediadata(message);\r\n }\r\n }\r\n\r\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\r\n const playingMedia = this.playingMedia;\r\n\r\n const wasPlaying = this.pause();\r\n\r\n this.willBePlayed(undefined);\r\n if(media) this.setMedia(media, message);\r\n else this.playingMedia = undefined;\r\n this.toggleSwitchers(false);\r\n\r\n return () => {\r\n this.toggleSwitchers(true);\r\n\r\n if(playingMedia) {\r\n if(this.mediaDetails.get(playingMedia)) {\r\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\r\n } else {\r\n this.next() || this.previous();\r\n }\r\n }\r\n\r\n if(media && this.playingMedia === media) {\r\n this.stop();\r\n }\r\n\r\n if(wasPlaying) {\r\n this.play();\r\n }\r\n };\r\n }\r\n\r\n public toggleSwitchers(enabled: boolean) {\r\n this.lockedSwitchers = !enabled;\r\n }\r\n}\r\n\r\nconst appMediaPlaybackController = new AppMediaPlaybackController();\r\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\r\nexport default appMediaPlaybackController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\r\n\r\nexport default function attachGrabListeners(element: HTMLElement, \r\n onStart: (position: GrabEvent) => void, \r\n onMove: (position: GrabEvent) => void, \r\n onEnd?: (position: GrabEvent) => void) {\r\n // * Mouse\r\n const onMouseMove = (event: MouseEvent) => {\r\n onMove({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseUp = (event: MouseEvent) => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseDown = (event: MouseEvent) => {\r\n if(event.button !== 0) {\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n return;\r\n }\r\n\r\n onStart({x: event.pageX, y: event.pageY, event});\r\n onMouseMove(event);\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp, {once: true});\r\n };\r\n\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n\r\n // * Touch\r\n const onTouchMove = (event: TouchEvent) => {\r\n event.preventDefault();\r\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchEnd = (event: TouchEvent) => {\r\n document.removeEventListener('touchmove', onTouchMove);\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchStart = (event: TouchEvent) => {\r\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n onTouchMove(event);\r\n\r\n document.addEventListener('touchmove', onTouchMove, {passive: false});\r\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\r\n };\r\n\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n\r\n return () => {\r\n element.removeEventListener('mousedown', onMouseDown);\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n\r\n element.removeEventListener('touchstart', onTouchStart);\r\n document.removeEventListener('touchmove', onTouchMove);\r\n document.removeEventListener('touchend', onTouchEnd);\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { clamp } from \"../helpers/number\";\r\nimport attachGrabListeners, { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\r\nimport { safeAssign } from \"../helpers/object\";\r\n\r\nexport default class RangeSelector {\r\n public container: HTMLDivElement;\r\n protected filled: HTMLDivElement;\r\n protected seek: HTMLInputElement;\r\n\r\n public mousedown = false;\r\n protected rect: DOMRect;\r\n protected _removeListeners: () => void;\r\n\r\n private events: Partial<{\r\n //onMouseMove: ProgressLine['onMouseMove'],\r\n onMouseDown: RangeSelector['onMouseDown'],\r\n onMouseUp: RangeSelector['onMouseUp'],\r\n onScrub: (value: number) => void\r\n }> = {};\r\n\r\n protected decimals: number;\r\n\r\n protected step: number;\r\n protected min: number;\r\n protected max: number;\r\n protected withTransition = false;\r\n protected useTransform = false;\r\n protected vertical = false;\r\n\r\n constructor(\r\n options: {\r\n step: RangeSelector['step'],\r\n min: RangeSelector['min'],\r\n max: RangeSelector['max'],\r\n withTransition?: RangeSelector['withTransition'],\r\n useTransform?: RangeSelector['useTransform'],\r\n vertical?: RangeSelector['vertical']\r\n }, \r\n value = 0\r\n ) {\r\n safeAssign(this, options);\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('progress-line');\r\n\r\n // there is no sense in using transition with transform, because it is updating every frame\r\n if(this.useTransform) {\r\n this.container.classList.add('use-transform');\r\n } else if(this.withTransition) {\r\n this.container.classList.add('with-transition');\r\n }\r\n\r\n this.filled = document.createElement('div');\r\n this.filled.classList.add('progress-line__filled');\r\n\r\n const seek = this.seek = document.createElement('input');\r\n seek.classList.add('progress-line__seek');\r\n //seek.setAttribute('max', '0');\r\n seek.type = 'range';\r\n seek.step = '' + this.step;\r\n seek.min = '' + this.min;\r\n seek.max = '' + this.max;\r\n seek.value = '' + value;\r\n\r\n if(value) {\r\n this.setProgress(value);\r\n }\r\n\r\n const stepStr = '' + this.step;\r\n const index = stepStr.indexOf('.');\r\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\r\n\r\n //this.setListeners();\r\n\r\n this.container.append(this.filled, seek);\r\n }\r\n\r\n get value() {\r\n return +this.seek.value;\r\n }\r\n\r\n public setHandlers(events: RangeSelector['events']) {\r\n this.events = events;\r\n }\r\n\r\n protected onMouseMove = (event: GrabEvent) => {\r\n this.scrub(event);\r\n };\r\n\r\n protected onMouseDown = (event: GrabEvent) => {\r\n this.rect = this.container.getBoundingClientRect();\r\n this.mousedown = true;\r\n this.scrub(event);\r\n this.container.classList.add('is-focused');\r\n this.events?.onMouseDown && this.events.onMouseDown(event);\r\n };\r\n\r\n protected onMouseUp = (event: GrabEvent) => {\r\n this.mousedown = false;\r\n this.container.classList.remove('is-focused');\r\n this.events?.onMouseUp && this.events.onMouseUp(event);\r\n };\r\n\r\n public setListeners() {\r\n this.seek.addEventListener('input', this.onInput);\r\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\r\n }\r\n\r\n public onInput = () => {\r\n const value = +this.seek.value;\r\n this.setFilled(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n };\r\n\r\n public setProgress(value: number) {\r\n this.seek.value = '' + value;\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public addProgress(value: number) {\r\n this.seek.value = '' + (+this.seek.value + value);\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public setFilled(value: number) {\r\n let percents = (value - this.min) / (this.max - this.min);\r\n percents = clamp(percents, 0, 1);\r\n \r\n // using scaleX and width even with vertical because it will be rotated\r\n if(this.useTransform) {\r\n this.filled.style.transform = `scaleX(${percents})`;\r\n } else {\r\n this.filled.style.width = (percents * 100) + '%';\r\n }\r\n }\r\n\r\n protected scrub(event: GrabEvent) {\r\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\r\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\r\n\r\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\r\n\r\n if((value - this.min) < ((this.max - this.min) / 2)) {\r\n value -= this.step / 10;\r\n }\r\n \r\n value = +value.toFixed(this.decimals);\r\n value = clamp(value, this.min, this.max);\r\n\r\n //this.seek.value = '' + value;\r\n //this.onInput();\r\n\r\n this.setProgress(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n\r\n return value;\r\n }\r\n\r\n public removeListeners() {\r\n if(this._removeListeners) {\r\n this._removeListeners();\r\n this._removeListeners = null;\r\n }\r\n\r\n this.seek.removeEventListener('input', this.onInput);\r\n \r\n this.events = {};\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { AttachClickOptions, attachClickEvent, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { i18n, LangPackKey } from \"../lib/langPack\";\nimport CheckboxField from \"./checkboxField\";\nimport { closeBtnMenu } from \"./misc\";\nimport { ripple } from \"./ripple\";\n\nexport type ButtonMenuItemOptions = {\n icon?: string, \n text?: LangPackKey, \n regularText?: string, \n onClick: (e: MouseEvent | TouchEvent) => void | boolean, \n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean\n /* , cancelEvent?: true */\n};\n\nconst ButtonMenuItem = (options: ButtonMenuItemOptions) => {\n if(options.element) return options.element;\n\n const {icon, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item' + (icon ? ' tgico-' + icon : '');\n ripple(el);\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text) : 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 attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ (e) => {\n cancelEvent(e);\n const result = onClick(e);\n\n if(result === false) {\n return;\n }\n\n if(!keepOpen) {\n closeBtnMenu();\n }\n\n if(checkboxField && !noCheckboxClickListener/* && result !== false */) {\n checkboxField.checked = checkboxField.input.type === 'radio' ? true : !checkboxField.checked;\n }\n }/* : onClick */, options.options);\n\n if(checkboxField) {\n el.append(checkboxField.label);\n }\n\n return options.element = el;\n};\n\nconst ButtonMenu = (buttons: ButtonMenuItemOptions[], listenerSetter?: ListenerSetter) => {\n const el = document.createElement('div');\n el.classList.add('btn-menu');\n\n if(listenerSetter) {\n buttons.forEach(b => {\n if(b.options) {\n b.options.listenerSetter = listenerSetter;\n } else {\n b.options = {listenerSetter};\n }\n });\n }\n\n const items = buttons.map(ButtonMenuItem);\n\n el.append(...items);\n\n return el;\n};\n\nexport default ButtonMenu;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { AttachClickOptions, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\r\nimport { closeBtnMenu, openBtnMenu } from \"./misc\";\r\n\r\nconst ButtonMenuToggle = (options: Partial<{noRipple: true, onlyMobile: true, listenerSetter: ListenerSetter, asDiv: boolean}> = {}, direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right', buttons: ButtonMenuItemOptions[], onOpen?: (e: Event) => void) => {\r\n options.asDiv = true;\r\n const button = ButtonIcon('more btn-menu-toggle', options);\r\n\r\n const btnMenu = ButtonMenu(buttons, options.listenerSetter);\r\n btnMenu.classList.add(direction);\r\n ButtonMenuToggleHandler(button, onOpen, options);\r\n button.append(btnMenu);\r\n return button;\r\n};\r\n\r\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\r\nconst ButtonMenuToggleHandler = (el: HTMLElement, onOpen?: (e: Event) => void, options?: AttachClickOptions) => {\r\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\r\n\r\n //console.trace('ButtonMenuToggleHandler attach', el, onOpen, options);\r\n add(CLICK_EVENT_NAME, (e: Event) => {\r\n //console.log('ButtonMenuToggleHandler click', e);\r\n if(!el.classList.contains('btn-menu-toggle')) return false;\r\n\r\n //window.removeEventListener('mousemove', onMouseMove);\r\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\r\n cancelEvent(e);\r\n\r\n if(el.classList.contains('menu-open')) {\r\n closeBtnMenu();\r\n } else {\r\n onOpen && onOpen(e);\r\n openBtnMenu(openedMenu);\r\n }\r\n });\r\n};\r\n\r\nexport { ButtonMenuToggleHandler };\r\nexport default ButtonMenuToggle;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMediaPlaybackController from \"../components/appMediaPlaybackController\";\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport RangeSelector from \"../components/rangeSelector\";\nimport { onMediaLoad } from \"../helpers/files\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport ButtonMenu from \"../components/buttonMenu\";\nimport { ButtonMenuToggleHandler } from \"../components/buttonMenuToggle\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport rootScope from \"./rootScope\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\n\nexport class MediaProgressLine extends RangeSelector {\n protected filledLoad: HTMLDivElement;\n\n protected progressRAF = 0;\n\n protected media: HTMLMediaElement;\n protected streamable: boolean;\n\n constructor(media?: HTMLAudioElement | HTMLVideoElement, streamable?: boolean, withTransition?: boolean, useTransform?: boolean) {\n super({\n step: 1000 / 60 / 1000, \n min: 0, \n max: 1, \n withTransition, \n useTransform\n }, 0);\n\n if(media) {\n this.setMedia(media, streamable);\n }\n }\n\n public setMedia(media: HTMLMediaElement, streamable = false) {\n if(this.media) {\n this.removeListeners();\n }\n\n if(streamable && !this.filledLoad) {\n this.filledLoad = document.createElement('div');\n this.filledLoad.classList.add('progress-line__filled', 'progress-line__loaded');\n this.container.prepend(this.filledLoad);\n //this.setLoadProgress();\n } else if(this.filledLoad) {\n this.filledLoad.classList.toggle('hide', !streamable);\n }\n\n this.media = media;\n this.streamable = streamable;\n if(!media.paused || media.currentTime > 0) {\n this.onPlay();\n }\n\n let wasPlaying = false;\n this.setSeekMax();\n this.setListeners();\n this.setHandlers({\n onMouseDown: () => {\n wasPlaying = !this.media.paused;\n wasPlaying && this.media.pause();\n },\n\n onMouseUp: (e) => {\n // cancelEvent(e.event);\n wasPlaying && this.media.play();\n }\n });\n }\n\n protected onLoadedData = () => {\n this.max = this.media.duration;\n this.seek.setAttribute('max', '' + this.max);\n };\n\n protected onEnded = () => {\n this.setProgress();\n };\n\n protected onPlay = () => {\n let r = () => {\n this.setProgress();\n\n this.progressRAF = this.media.paused ? 0 : window.requestAnimationFrame(r);\n };\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n }\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n\n this.progressRAF = window.requestAnimationFrame(r);\n };\n\n protected onTimeUpdate = () => {\n if(this.media.paused) {\n this.setProgress();\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n }\n };\n\n protected onProgress = (e: Event) => {\n this.setLoadProgress();\n };\n\n protected scrub(e: GrabEvent) {\n const scrubTime = super.scrub(e);\n this.media.currentTime = scrubTime;\n return scrubTime;\n }\n\n protected setLoadProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const buf = this.media.buffered;\n const numRanges = buf.length;\n\n const currentTime = this.media.currentTime;\n let nearestStart = 0, end = 0;\n for(let i = 0; i < numRanges; ++i) {\n const start = buf.start(i);\n if(currentTime >= start && start >= nearestStart) {\n nearestStart = start;\n end = buf.end(i);\n }\n\n //console.log('onProgress range:', i, buf.start(i), buf.end(i), this.media);\n }\n\n //console.log('onProgress correct range:', nearestStart, end, this.media);\n\n const percents = this.media.duration ? end / this.media.duration : 0;\n this.filledLoad.style.width = (percents * 100) + '%';\n //this.filledLoad.style.transform = 'scaleX(' + percents + ')';\n }\n\n protected setSeekMax() {\n this.max = this.media.duration || 0;\n if(this.max > 0) {\n this.onLoadedData();\n } else {\n this.media.addEventListener('loadeddata', this.onLoadedData);\n }\n }\n\n public setProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const currentTime = this.media.currentTime;\n\n super.setProgress(currentTime);\n }\n\n public setListeners() {\n super.setListeners();\n this.media.addEventListener('ended', this.onEnded);\n this.media.addEventListener('play', this.onPlay);\n this.media.addEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.addEventListener('progress', this.onProgress);\n }\n\n public removeListeners() {\n super.removeListeners();\n\n 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 if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = 0;\n }\n }\n}\n\nexport class VolumeSelector extends RangeSelector {\n public btn: HTMLElement;\n protected volumeSvg: HTMLElement;\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 this.btn = document.createElement('div');\n this.btn.classList.add('player-volume');\n\n this.btn.innerHTML = `\n \n `;\n this.btn.classList.add('btn-icon');\n this.volumeSvg = this.btn.firstElementChild as HTMLElement;\n\n this.btn.append(this.container);\n\n attachClickEvent(this.volumeSvg, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(rootScope)('media_playback_params', this.setVolume);\n\n this.setVolume();\n }\n\n private onMuteClick = (e?: Event) => {\n e && cancelEvent(e);\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n };\n\n private setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n if(!volume || muted) {\n d = `M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z`;\n } else if(volume > .5) {\n d = `M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z`;\n } else if(volume > 0 && volume < .25) {\n d = `M7 9v6h4l5 5V4l-5 5H7z`;\n } else {\n d = `M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z`;\n }\n\n try {\n this.volumeSvg.innerHTML = ``;\n } catch(err) {}\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\n }\n };\n}\n\nexport default class VideoPlayer extends EventListenerBase<{\n toggleControls: (show: boolean) => void\n}> {\n private wrapper: HTMLDivElement;\n private progress: MediaProgressLine;\n private skin: 'default';\n\n private listenerSetter: ListenerSetter;\n\n private showControlsTimeout = 0;\n\n private controlsLocked: boolean;\n\n /* private videoParent: HTMLElement;\n private videoWhichChild: number; */\n\n constructor(private video: HTMLVideoElement, play = false, streamable = false, duration?: number) {\n super(false);\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.listenerSetter = new ListenerSetter();\n\n video.parentNode.insertBefore(this.wrapper, video);\n this.wrapper.appendChild(video);\n\n this.skin = 'default';\n\n this.stylePlayer(duration);\n // this.setBtnMenuToggle();\n\n if(this.skin === 'default') {\n const controls = this.wrapper.querySelector('.default__controls.ckin__controls') as HTMLDivElement;\n this.progress = new MediaProgressLine(video, streamable);\n controls.prepend(this.progress.container);\n }\n\n if(play/* && video.paused */) {\n const promise = video.play();\n promise.catch((err: Error) => {\n if(err.name === 'NotAllowedError') {\n video.muted = true;\n video.autoplay = true;\n video.play();\n }\n }).finally(() => { // due to autoplay, play will not call\n this.wrapper.classList.toggle('is-playing', !this.video.paused);\n });\n //(this.wrapper.querySelector('.toggle') as HTMLButtonElement).click();\n }\n }\n\n private stylePlayer(initDuration: number) {\n const {wrapper: player, video, skin} = this;\n\n player.classList.add(skin);\n \n const html = this.buildControls();\n player.insertAdjacentHTML('beforeend', html);\n let timeDuration: HTMLElement;\n \n if(skin === 'default') {\n const toggle = player.querySelectorAll('.toggle') as NodeListOf;\n const fullScreenButton = player.querySelector('.fullscreen') as HTMLElement;\n const timeElapsed = player.querySelector('#time-elapsed');\n timeDuration = player.querySelector('#time-duration') as HTMLElement;\n timeDuration.innerHTML = String(video.duration | 0).toHHMMSS();\n\n const volumeSelector = new VolumeSelector(this.listenerSetter);\n\n const leftControls = player.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 this.listenerSetter.add(button)('click', () => {\n this.togglePlay();\n });\n });\n\n this.listenerSetter.add(video)('click', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.togglePlay();\n }\n });\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.add(player)('click', () => {\n this.toggleControls();\n });\n\n /* this.listenerSetter.add(player)('touchstart', () => {\n showControls(false);\n });\n\n this.listenerSetter.add(player)('touchend', () => {\n if(player.classList.contains('is-playing')) {\n showControls();\n }\n }); */\n } else {\n this.listenerSetter.add(this.wrapper)('mousemove', () => {\n this.showControls();\n });\n\n this.listenerSetter.add(this.wrapper)('mouseenter', () => {\n this.showControls(false);\n });\n\n this.listenerSetter.add(this.wrapper)('mouseleave', (e) => {\n if(findUpClassName(e.relatedTarget, 'media-viewer-caption')) {\n this.showControls(false);\n return;\n }\n \n this.hideControls();\n });\n\n this.listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(rootScope.overlaysActive > 1) { // forward popup is active, etc\n return;\n }\n\n const {key, code} = e;\n\n let good = true;\n if(code === 'KeyF') {\n this.toggleFullScreen(fullScreenButton);\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') {\n appMediaPlaybackController.playbackRate += .25;\n } else if(e.altKey && code === 'Minus') {\n appMediaPlaybackController.playbackRate -= .25;\n } else if(this.wrapper.classList.contains('ckin__fullscreen') && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if(key === 'ArrowLeft') appMediaPlaybackController.seekBackward({action: 'seekbackward'});\n else appMediaPlaybackController.seekForward({action: 'seekforward'});\n } else {\n good = false;\n }\n\n if(good) {\n cancelEvent(e);\n return false;\n }\n });\n }\n \n /* player.addEventListener('click', (e) => {\n if(e.target !== player) {\n return;\n }\n\n this.togglePlay();\n }); */\n \n /* video.addEventListener('play', () => {\n }); */\n\n this.listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen(fullScreenButton);\n }\n });\n\n this.listenerSetter.add(fullScreenButton)('click', (e) => {\n this.toggleFullScreen(fullScreenButton);\n });\n\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach(eventName => {\n this.listenerSetter.add(player)(eventName, this.onFullScreen, false);\n });\n\n this.listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.innerHTML = String(video.currentTime | 0).toHHMMSS();\n });\n\n this.listenerSetter.add(video)('play', () => {\n this.wrapper.classList.add('played');\n }, {once: true});\n\n this.listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n }\n\n this.listenerSetter.add(video)('play', () => {\n this.wrapper.classList.add('is-playing');\n });\n\n this.listenerSetter.add(video)('pause', () => {\n this.wrapper.classList.remove('is-playing');\n });\n \n if(video.duration || initDuration) {\n timeDuration.innerHTML = String(Math.round(video.duration || initDuration)).toHHMMSS();\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.innerHTML = String(Math.round(video.duration)).toHHMMSS();\n });\n }\n }\n\n public hideControls = () => {\n clearTimeout(this.showControlsTimeout);\n this.showControlsTimeout = 0;\n\n const isShown = this.wrapper.classList.contains('show-controls');\n if(this.controlsLocked !== false) {\n if(this.video.paused || !isShown || this.controlsLocked) {\n return;\n }\n } else if(!isShown) {\n return;\n }\n \n this.dispatchEvent('toggleControls', false);\n this.wrapper.classList.remove('show-controls');\n };\n \n public showControls = (setHideTimeout = true) => {\n if(this.showControlsTimeout) {\n clearTimeout(this.showControlsTimeout);\n this.showControlsTimeout = 0;\n } else if(!this.wrapper.classList.contains('show-controls') && this.controlsLocked !== false) {\n this.dispatchEvent('toggleControls', true);\n this.wrapper.classList.add('show-controls');\n }\n\n if(!setHideTimeout || this.controlsLocked) {\n return;\n }\n\n this.showControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n };\n\n public toggleControls = (show?: boolean) => {\n const isShown = this.wrapper.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.wrapper.classList.toggle('disable-hover', visible === false);\n this.toggleControls(visible);\n }\n\n protected togglePlay() {\n this.video[this.video.paused ? 'play' : 'pause']();\n }\n\n private buildControls() {\n const skin = this.skin;\n if(skin === 'default') {\n return `\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0] = [0.25, 0.5, 1, 1.25, 1.5, 2].map((rate) => {\n return { \n regularText: rate === 1 ? 'Normal' : '' + rate, \n onClick: () => {\n this.video.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenu(buttons);\n const settingsButton = this.wrapper.querySelector('.settings') as HTMLElement;\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler(settingsButton);\n settingsButton.append(btnMenu);\n }\n\n public static isFullScreen(): boolean {\n // @ts-ignore\n return !!(document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement);\n }\n \n protected toggleFullScreen(fullScreenButton: HTMLElement) {\n // alternative standard method\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(!VideoPlayer.isFullScreen()) {\n player.classList.add('ckin__fullscreen');\n\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 if(player.requestFullscreen) {\n player.requestFullscreen();\n // @ts-ignore\n } else if(player.mozRequestFullScreen) {\n // @ts-ignore\n player.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(player.webkitRequestFullscreen) {\n // @ts-ignore\n player.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(player.msRequestFullscreen) {\n // @ts-ignore\n player.msRequestFullscreen();\n }\n \n fullScreenButton.classList.remove('tgico-fullscreen');\n fullScreenButton.classList.add('tgico-smallscreen');\n fullScreenButton.setAttribute('title', 'Exit Full Screen');\n } else {\n player.classList.remove('ckin__fullscreen');\n\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 // @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 fullScreenButton.classList.remove('tgico-smallscreen');\n fullScreenButton.classList.add('tgico-fullscreen');\n fullScreenButton.setAttribute('title', 'Full Screen');\n }\n }\n \n protected onFullScreen = () => {\n // @ts-ignore\n const isFullscreenNow = document.webkitFullscreenElement !== null;\n if(!isFullscreenNow) {\n this.wrapper.classList.remove('ckin__fullscreen');\n }\n };\n\n public removeListeners() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n }\n}\n","// * Jolly Cobra's schedulers\n\nimport { AnyToVoidFunction } from \"../../types\";\nimport { fastRaf } from \"../schedulers\";\nimport throttleWith from \"./throttleWith\";\n\nexport default function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n","// * Jolly Cobra's schedulers\n\nimport { AnyToVoidFunction } from \"../../types\";\n\nexport default function throttleWith(schedulerFn: AnyToVoidFunction, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\nimport { wrapPhoto } from \"./wrappers\";\nimport ProgressivePreloader from \"./preloader\";\nimport { MediaProgressLine } from \"../lib/mediaPlayer\";\nimport appMediaPlaybackController, { MediaItem, MediaSearchContext } from \"./appMediaPlaybackController\";\nimport { DocumentAttribute, Message } from \"../layer\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../environment/userAgent\";\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport './middleEllipsis';\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\nimport ListenerSetter, { Listener } from \"../helpers/listenerSetter\";\nimport noop from \"../helpers/noop\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { joinElementsWith } from \"../lib/langPack\";\nimport { MiddleEllipsisElement } from \"./middleEllipsis\";\nimport htmlToSpan from \"../helpers/dom/htmlToSpan\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport { clamp, formatBytes } from \"../helpers/number\";\nimport throttleWithRaf from \"../helpers/schedulers/throttleWithRaf\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\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 wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\n\n 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 duration = doc.duration;\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');\n svg.setAttributeNS(null, 'width', '' + availW);\n svg.setAttributeNS(null, 'height', '' + barHeightMax);\n svg.setAttributeNS(null, 'viewBox', `0 0 ${availW} ${barHeightMax}`);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(svg, timeDiv);\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 //console.log('decoded waveform:', waveform);\n\n const normValue = Math.max(...waveform);\n const wfSize = waveform.length ? waveform.length : 100;\n const barCount = Math.min((availW / (barWidth + barMargin)) | 0, wfSize);\n\n let maxValue = 0;\n const maxDelta = barHeightMax - barHeightMin;\n\n let html = '';\n for(let i = 0, barX = 0, sumI = 0; i < wfSize; ++i) {\n const value = waveform[i] || 0;\n if((sumI + barCount) >= wfSize) { // draw bar\n sumI = sumI + barCount - wfSize;\n\t\t\tif(sumI < (barCount + 1) / 2) {\n\t\t\t\tif(maxValue < value) maxValue = value;\n }\n \n const bar_value = Math.max(((maxValue * maxDelta) + ((normValue + 1) / 2)) / (normValue + 1), barHeightMin);\n \n const h = `\n \n `;\n html += h;\n\n barX += barWidth + barMargin;\n\n if(sumI < (barCount + 1) / 2) {\n maxValue = 0;\n } else {\n maxValue = value;\n }\n } else {\n if(maxValue < value) maxValue = value;\n\n sumI += barCount;\n }\n }\n\n svg.insertAdjacentHTML('beforeend', html);\n const rects = Array.from(svg.children) as HTMLElement[];\n\n let progress = audioEl.querySelector('.audio-waveform') as HTMLDivElement;\n \n const onLoad = () => {\n let audio = audioEl.audio;\n\n const onTimeUpdate = () => {\n const lastIndex = audio.currentTime === audio.duration ? 0 : Math.ceil(audio.currentTime / audio.duration * barCount);\n \n //svg.children[lastIndex].setAttributeNS(null, 'fill', '#000');\n //svg.children[lastIndex].classList.add('active'); #Иногда пропускает полоски..\n rects.forEach((node, idx) => node.classList.toggle('active', idx < lastIndex));\n //++lastIndex;\n //console.log('lastIndex:', lastIndex, audio.currentTime);\n //}, duration * 1000 / svg.childElementCount | 0/* 63 * duration / 10 */);\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\n audioEl.readyPromise.then(() => {\n let mousedown = false, mousemove = false;\n progress.addEventListener('mouseleave', (e) => {\n if(mousedown) {\n audio.play();\n mousedown = false;\n }\n mousemove = false;\n })\n progress.addEventListener('mousemove', (e) => {\n mousemove = true;\n if(mousedown) scrub(e);\n });\n progress.addEventListener('mousedown', (e) => {\n e.preventDefault();\n if(e.button !== 0) return;\n if(!audio.paused) {\n audio.pause();\n }\n \n scrub(e);\n mousedown = true;\n });\n progress.addEventListener('mouseup', (e) => {\n if(mousemove && mousedown) {\n audio.play();\n mousedown = false;\n }\n });\n attachClickEvent(progress, (e) => {\n cancelEvent(e);\n if(!audio.paused) scrub(e);\n });\n \n function scrub(e: MouseEvent | TouchEvent) {\n let offsetX: number;\n if(e instanceof MouseEvent) {\n offsetX = e.offsetX;\n } else { // touch\n const rect = (e.target as HTMLElement).getBoundingClientRect();\n offsetX = e.targetTouches[0].pageX - rect.left;\n }\n \n const scrubTime = offsetX / availW /* width */ * audio.duration;\n audio.currentTime = scrubTime;\n }\n }, noop);\n \n return () => {\n progress.remove();\n progress = null;\n audio = null;\n };\n };\n\n return onLoad;\n}\n\nfunction wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(message);\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n \n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(doc.audioPerformer) {\n parts.push(htmlToSpan(doc.audioPerformer));\n }\n\n if(withTime) {\n parts.push(formatFullSentTime(message.date));\n } else if(!parts.length) {\n parts.push(formatBytes(doc.size));\n }\n\n if(audioEl.showSender) {\n parts.push(appMessagesManager.wrapSenderToPeer(message));\n }\n\n descriptionEl.append(...joinElementsWith(parts, ' • '));\n }\n\n const html = `\n
\n
\n
\n
`;\n audioEl.insertAdjacentHTML('beforeend', html);\n\n const titleEl = audioEl.querySelector('.audio-title') as HTMLElement;\n\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = audioEl.dataset.fontWeight;\n if(isVoice) {\n middleEllipsisEl.append(appMessagesManager.wrapSenderToPeer(message));\n } else {\n middleEllipsisEl.innerHTML = doc.audioTitle || doc.fileName;\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(appMessagesManager.wrapSentTime(message));\n }\n \n const subtitleDiv = audioEl.querySelector('.audio-subtitle') as HTMLDivElement;\n subtitleDiv.append(descriptionEl);\n\n const onLoad = () => {\n let launched = false;\n\n let progressLine = new MediaProgressLine(audioEl.audio, doc.supportsStreaming);\n\n audioEl.addAudioListener('ended', () => {\n audioEl.classList.remove('audio-show-progress');\n // Reset subtitle\n subtitleDiv.lastChild.replaceWith(descriptionEl);\n launched = false;\n });\n\n const onPlay = () => {\n if(!launched) {\n audioEl.classList.add('audio-show-progress');\n launched = true;\n\n if(progressLine) {\n subtitleDiv.lastChild.replaceWith(progressLine.container);\n }\n }\n };\n\n audioEl.addAudioListener('play', onPlay);\n\n if(!audioEl.audio.paused || audioEl.audio.currentTime > 0) {\n onPlay();\n }\n\n return () => {\n progressLine.removeListeners();\n progressLine.container.remove();\n progressLine = null;\n };\n };\n\n return onLoad;\n}\n\nfunction constructDownloadPreloader(tryAgainOnFail = true) {\n const preloader = new ProgressivePreloader({cancelable: true, tryAgainOnFail});\n preloader.construct();\n\n if(!tryAgainOnFail) {\n preloader.circle.setAttributeNS(null, 'r', '23');\n preloader.totalLength = 143.58203125;\n }\n\n return preloader;\n}\n\nexport const findMediaTargets = (anchor: HTMLElement/* , 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 return [prev, next];\n};\n\nexport default class AudioElement extends HTMLElement {\n public audio: HTMLAudioElement;\n public preloader: ProgressivePreloader;\n public message: Message.message;\n public withTime = false;\n public voiceAsMusic = false;\n public searchContext: MediaSearchContext;\n public showSender = false;\n public noAutoDownload: boolean;\n public lazyLoadQueue: LazyLoadQueue;\n public loadPromises: Promise[];\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public render() {\n this.classList.add('audio');\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(this.message);\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploading = isOutgoing && this.preloader;\n\n const durationStr = String(doc.duration | 0).toHHMMSS();\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n
`;\n\n const toggle = this.firstElementChild as HTMLElement;\n\n const downloadDiv = document.createElement('div');\n downloadDiv.classList.add('audio-download');\n\n const isUnread = doc.type !== 'audio' && this.message && this.message.pFlags.media_unread;\n if(isUnread) {\n this.classList.add('is-unread');\n }\n\n if(uploading) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = isVoice ? wrapVoiceMessage(this) : wrapAudio(this);\n \n const audioTimeDiv = this.querySelector('.audio-time') as HTMLDivElement;\n audioTimeDiv.innerHTML = durationStr;\n\n const onLoad = this.onLoad = (autoload: boolean) => {\n this.onLoad = undefined;\n\n const audio = this.audio = appMediaPlaybackController.addMedia(this.message, autoload);\n\n const readyPromise = this.readyPromise = deferredPromise();\n if(this.audio.readyState >= this.audio.HAVE_CURRENT_DATA) readyPromise.resolve();\n else {\n this.addAudioListener('canplay', () => readyPromise.resolve(), {once: true});\n }\n\n this.onTypeDisconnect = onTypeLoad();\n \n const getTimeStr = () => String(audio.currentTime | 0).toHHMMSS() + (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.searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: this.message.peerId, mid: this.message.mid}, prev, next);\n }\n\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n attachClickEvent(toggle, (e) => togglePlay(e), {listenerSetter: this.listenerSetter});\n\n this.addAudioListener('ended', () => {\n toggle.classList.remove('playing');\n audioTimeDiv.innerText = durationStr;\n });\n\n this.addAudioListener('timeupdate', () => {\n if((!audio.currentTime && audio.paused) || appMediaPlaybackController.isSafariBuffering(audio)) return;\n audioTimeDiv.innerText = getTimeStr();\n });\n\n this.addAudioListener('pause', () => {\n toggle.classList.remove('playing');\n });\n\n this.addAudioListener('play', onPlay);\n\n return togglePlay;\n };\n\n if(doc.thumbs?.length) {\n const imgs: HTMLImageElement[] = [];\n const wrapped = wrapPhoto({\n photo: doc, \n message: null, \n container: toggle, \n boxWidth: 48, \n boxHeight: 48,\n loadPromises: this.loadPromises,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue\n });\n toggle.style.width = toggle.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n\n this.classList.add('audio-with-thumb');\n imgs.forEach(img => img.classList.add('audio-thumb'));\n }\n\n if(!isOutgoing) {\n let preloader: ProgressivePreloader = this.preloader;\n\n onLoad(doc.type !== 'audio' && !this.noAutoDownload);\n\n const r = (shouldPlay: boolean) => {\n if(this.audio.src) {\n return;\n }\n\n appMediaPlaybackController.resolveWaitingForLoadMedia(this.message.peerId, this.message.mid, this.message.pFlags.is_scheduled);\n\n const onDownloadInit = () => {\n if(shouldPlay) {\n appMediaPlaybackController.willBePlayed(this.audio); // prepare for loading audio\n \n if(IS_SAFARI && !this.audio.autoplay) {\n this.audio.autoplay = true;\n }\n }\n };\n\n onDownloadInit();\n\n if(!preloader) {\n if(doc.supportsStreaming) {\n this.classList.add('corner-download');\n\n let pauseListener: Listener;\n const onPlay = () => {\n const preloader = constructDownloadPreloader(false);\n const deferred = deferredPromise();\n deferred.notifyAll({done: 75, total: 100});\n deferred.catch(() => {\n this.audio.pause();\n appMediaPlaybackController.willBePlayed(undefined);\n });\n deferred.cancel = () => {\n deferred.cancel = noop;\n const err = new Error();\n (err as any).type = 'CANCELED';\n deferred.reject(err);\n };\n preloader.attach(downloadDiv, false, deferred);\n\n pauseListener = this.addAudioListener('pause', () => {\n deferred.cancel();\n }, {once: true}) as any;\n\n onDownloadInit();\n };\n\n /* if(!this.audio.paused) {\n onPlay();\n } */\n\n const playListener: any = this.addAudioListener('play', onPlay);\n this.readyPromise.then(() => {\n this.listenerSetter.remove(playListener);\n this.listenerSetter.remove(pauseListener);\n });\n } else {\n preloader = constructDownloadPreloader();\n\n if(!shouldPlay) {\n this.readyPromise = deferredPromise();\n }\n\n const load = () => {\n onDownloadInit();\n\n const download = appDocsManager.downloadDoc(doc);\n \n if(!shouldPlay) {\n download.then(() => {\n this.readyPromise.resolve();\n });\n }\n\n preloader.attach(downloadDiv, false, download);\n return {download};\n };\n\n preloader.setDownloadFunction(load);\n load();\n }\n }\n\n this.append(downloadDiv);\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(doc.type !== 'audio' && !this.noAutoDownload) {\n r(false);\n } else {\n attachClickEvent(toggle, () => {\n r(true);\n }, {once: true, capture: true, passive: false, listenerSetter: this.listenerSetter});\n }\n }\n } else if(uploading) {\n this.dataset.isOutgoing = '1';\n this.preloader.attach(downloadDiv, false);\n //onLoad();\n }\n }\n\n get addAudioListener() {\n return this.listenerSetter.add(this.audio);\n }\n\n disconnectedCallback() {\n if(this.isConnected) {\n return;\n }\n \n if(this.onTypeDisconnect) {\n this.onTypeDisconnect();\n this.onTypeDisconnect = null;\n }\n\n if(this.readyPromise) {\n this.readyPromise.reject();\n }\n\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n\n this.preloader = null;\n }\n}\n\ncustomElements.define(\"audio-element\", AudioElement);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class DivAndCaption {\r\n public container: HTMLElement;\r\n public border: HTMLElement;\r\n public content: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLElement;\r\n\r\n constructor(protected className: string, public fill?: T) {\r\n this.container = document.createElement('div');\r\n this.container.className = className;\r\n\r\n this.border = document.createElement('div');\r\n this.border.classList.add(className + '-border');\r\n \r\n this.content = document.createElement('div');\r\n this.content.classList.add(className + '-content');\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add(className + '-title');\r\n this.title.setAttribute('dir', 'auto');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add(className + '-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n\r\n this.content.append(this.title, this.subtitle);\r\n this.container.append(this.border, this.content);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport { limitSymbols } from \"../../helpers/string\";\r\nimport appImManager, { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\r\nimport appPhotosManager from \"../../lib/appManagers/appPhotosManager\";\r\nimport { RichTextProcessor } from \"../../lib/richtextprocessor\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { wrapPhoto, wrapSticker } from \"../wrappers\";\r\n\r\nconst MEDIA_SIZE = 32;\r\n\r\nexport function wrapReplyDivAndCaption(options: {\r\n title: string | HTMLElement | DocumentFragment,\r\n titleEl: HTMLElement,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleEl: HTMLElement,\r\n message: any,\r\n mediaEl: HTMLElement,\r\n loadPromises?: Promise[]\r\n}) {\r\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises} = options;\r\n if(title !== undefined) {\r\n if(typeof(title) === 'string') {\r\n title = limitSymbols(title, 140);\r\n title = RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n replaceContent(titleEl, title);\r\n }\r\n\r\n if(!loadPromises) {\r\n loadPromises = [];\r\n }\r\n\r\n let media = message && message.media;\r\n let setMedia = false, isRound = false;\r\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\r\n let middleware: () => boolean;\r\n if(media && mediaEl) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(appMessagesManager.wrapMessageForReply(message, undefined, undefined, undefined, undefined, true));\r\n\r\n //console.log('wrap reply', media);\r\n\r\n if(media.webpage) {\r\n media = media.webpage;\r\n }\r\n \r\n if(media.photo || (media.document && media.document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(media.document.type) !== -1) */) {\r\n middleware = appImManager.chat.bubbles.getMiddleware();\r\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\r\n\r\n if(media.document?.type === 'sticker') {\r\n setMedia = true;\r\n wrapSticker({\r\n doc: media.document,\r\n div: mediaEl,\r\n lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //onlyThumb: media.document.sticker === 2,\r\n width: MEDIA_SIZE,\r\n height: MEDIA_SIZE,\r\n middleware,\r\n loadPromises\r\n });\r\n } else {\r\n const photo = media.photo || media.document;\r\n\r\n isRound = photo.type === 'round';\r\n\r\n try {\r\n wrapPhoto({\r\n photo,\r\n container: mediaEl,\r\n boxWidth: MEDIA_SIZE,\r\n boxHeight: MEDIA_SIZE,\r\n size: appPhotosManager.choosePhotoSize(photo, MEDIA_SIZE, MEDIA_SIZE),\r\n middleware,\r\n lazyLoadQueue,\r\n noBlur: true,\r\n withoutPreloader: true,\r\n loadPromises\r\n });\r\n setMedia = true;\r\n } catch(err) {\r\n\r\n }\r\n }\r\n }\r\n } else {\r\n if(message) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(appMessagesManager.wrapMessageForReply(message, message.message && limitSymbols(message.message, 140)));\r\n } else {\r\n if(typeof(subtitle) === 'string') {\r\n subtitle = limitSymbols(subtitle, 140);\r\n subtitle = RichTextProcessor.wrapEmojiText(subtitle);\r\n }\r\n\r\n replaceContent(subtitleEl, subtitle || '');\r\n }\r\n }\r\n\r\n Promise.all(loadPromises).then(() => {\r\n if(middleware && !middleware()) return;\r\n mediaChildren.forEach(child => child.remove());\r\n\r\n if(mediaEl) {\r\n mediaEl.classList.toggle('is-round', isRound);\r\n }\r\n });\r\n\r\n return setMedia;\r\n}\r\n\r\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void> {\r\n private mediaEl: HTMLElement;\r\n\r\n constructor(protected className: string) {\r\n super(className, (title, subtitle = '', message?) => {\r\n if(!this.mediaEl) {\r\n this.mediaEl = document.createElement('div');\r\n this.mediaEl.classList.add(this.className + '-media');\r\n }\r\n\r\n const isMediaSet = wrapReplyDivAndCaption({\r\n title,\r\n titleEl: this.title,\r\n subtitle,\r\n subtitleEl: this.subtitle,\r\n mediaEl: this.mediaEl,\r\n message\r\n });\r\n \r\n this.container.classList.toggle('is-media', isMediaSet);\r\n if(isMediaSet) {\r\n this.content.prepend(this.mediaEl);\r\n } else {\r\n this.mediaEl.remove();\r\n }\r\n });\r\n }\r\n}\r\n","/*\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\";\r\nimport { clamp } from \"../helpers/number\";\r\n\r\ntype Size = {w: number, h: number};\r\nexport type GroupMediaLayout = {\r\n geometry: {\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number\r\n },\r\n sides: number\r\n};\r\ntype Attempt = {\r\n lineCounts: number[],\r\n heights: number[]\r\n};\r\nexport const RectPart = {\r\n None: 0,\r\n Top: 1,\r\n Right: 2,\r\n Bottom: 4,\r\n Left: 8\r\n};\r\n\r\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\r\nexport class Layouter {\r\n private count: number;\r\n private ratios: number[];\r\n private proportions: string;\r\n private averageRatio: number;\r\n private maxSizeRatio: number;\r\n\r\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\r\n this.count = sizes.length;\r\n this.ratios = Layouter.countRatios(sizes);\r\n this.proportions = Layouter.countProportions(this.ratios);\r\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\r\n this.maxSizeRatio = maxWidth / this.maxHeight;\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n if(!this.count) return [];\r\n //else if(this.count === 1) return this.layoutOne();\r\n\r\n if(this.count >= 5 || this.ratios.find(r => r > 2)) {\r\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\r\n }\r\n\r\n if(this.count === 2) return this.layoutTwo();\r\n else if(this.count === 3) return this.layoutThree();\r\n return this.layoutFour();\r\n }\r\n\r\n private layoutTwo(): ReturnType {\r\n if((this.proportions === \"ww\")\r\n && (this.averageRatio > 1.4 * this.maxSizeRatio)\r\n && (this.ratios[1] - this.ratios[0] < 0.2)) {\r\n return this.layoutTwoTopBottom();\r\n } else if(this.proportions === \"ww\" || this.proportions === \"qq\") {\r\n return this.layoutTwoLeftRightEqual();\r\n }\r\n return this.layoutTwoLeftRight();\r\n }\r\n\r\n private layoutThree(): ReturnType {\r\n //console.log('layoutThree:', this);\r\n if(this.proportions[0] === 'n') {\r\n return this.layoutThreeLeftAndOther();\r\n }\r\n return this.layoutThreeTopAndOther();\r\n }\r\n\r\n private layoutFour(): ReturnType {\r\n if(this.proportions[0] === 'w') {\r\n return this.layoutFourTopAndOther();\r\n }\r\n return this.layoutFourLeftAndOther();\r\n }\r\n\r\n private layoutTwoTopBottom(): ReturnType {\r\n const width = this.maxWidth;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(\r\n width / this.ratios[1],\r\n (this.maxHeight - this.spacing) / 2)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: height + this.spacing, width, height},\r\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRightEqual(): ReturnType {\r\n const width = (this.maxWidth - this.spacing) / 2;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: width + this.spacing, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRight(): ReturnType {\r\n const minimalWidth = Math.round(this.minWidth * 1.5);\r\n const secondWidth = Math.min(\r\n Math.round(Math.max(\r\n 0.4 * (this.maxWidth - this.spacing),\r\n (this.maxWidth - this.spacing) / this.ratios[0]\r\n / (1 / this.ratios[0] + 1 / this.ratios[1]))),\r\n this.maxWidth - this.spacing - minimalWidth);\r\n const firstWidth = this.maxWidth\r\n - secondWidth\r\n - this.spacing;\r\n const height = Math.min(\r\n this.maxHeight,\r\n Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n secondWidth / this.ratios[1])));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutThreeLeftAndOther(): ReturnType {\r\n const firstHeight = this.maxHeight;\r\n const thirdHeight = Math.round(Math.min(\r\n (this.maxHeight - this.spacing) / 2.,\r\n (this.ratios[1] * (this.maxWidth - this.spacing)\r\n / (this.ratios[2] + this.ratios[1]))));\r\n const secondHeight = firstHeight\r\n - thirdHeight\r\n - this.spacing;\r\n const rightWidth = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - this.spacing) / 2.,\r\n Math.min(\r\n thirdHeight * this.ratios[2],\r\n secondHeight * this.ratios[1]))));\r\n const leftWidth = Math.min(\r\n Math.round(firstHeight * this.ratios[0]),\r\n this.maxWidth - this.spacing - rightWidth);\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n \r\n private layoutThreeTopAndOther(): ReturnType {\r\n const firstWidth = this.maxWidth;\r\n const firstHeight = Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const secondWidth = (this.maxWidth - this.spacing) / 2;\r\n const secondHeight = Math.min(\r\n this.maxHeight - firstHeight - this.spacing,\r\n Math.round(Math.min(\r\n secondWidth / this.ratios[1],\r\n secondWidth / this.ratios[2])));\r\n const thirdWidth = firstWidth - secondWidth - this.spacing;\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourTopAndOther(): ReturnType {\r\n const w = this.maxWidth;\r\n const h0 = Math.round(Math.min(\r\n w / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const h = Math.round(\r\n (this.maxWidth - 2 * this.spacing)\r\n / (this.ratios[1] + this.ratios[2] + this.ratios[3]));\r\n const w0 = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - 2 * this.spacing) * 0.4,\r\n h * this.ratios[1])));\r\n const w2 = Math.round(Math.max(\r\n Math.max(\r\n this.minWidth * 1.,\r\n (this.maxWidth - 2 * this.spacing) * 0.33),\r\n h * this.ratios[3]));\r\n const w1 = w - w0 - w2 - 2 * this.spacing;\r\n const h1 = Math.min(\r\n this.maxHeight - h0 - this.spacing,\r\n h);\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w, height: h0},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Bottom,\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\r\n sides: RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourLeftAndOther(): ReturnType {\r\n const h = this.maxHeight;\r\n const w0 = Math.round(Math.min(\r\n h * this.ratios[0],\r\n (this.maxWidth - this.spacing) * 0.6));\r\n \r\n const w = Math.round(\r\n (this.maxHeight - 2 * this.spacing)\r\n / (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\r\n );\r\n const h0 = Math.round(w / this.ratios[1]);\r\n const h1 = Math.round(w / this.ratios[2]);\r\n const h2 = h - h0 - h1 - 2 * this.spacing;\r\n const w1 = Math.max(\r\n this.minWidth,\r\n Math.min(this.maxWidth - w0 - this.spacing, w));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w0, height: h},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private static countRatios(sizes: Size[]) {\r\n return sizes.map(size => size.w / size.h);\r\n }\r\n\r\n private static countProportions(ratios: number[]) {\r\n return ratios.map(ratio => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\r\n }\r\n}\r\n\r\nclass ComplexLayouter {\r\n private ratios: number[];\r\n private count: number;\r\n\r\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\r\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\r\n this.count = ratios.length;\r\n }\r\n\r\n private static cropRatios(ratios: number[], averageRatio: number) {\r\n const kMaxRatio = 2.75;\r\n const kMinRatio = 0.6667;\r\n return ratios.map(ratio => {\r\n return averageRatio > 1.1\r\n\t\t\t ? clamp(ratio, 1., kMaxRatio)\r\n\t\t\t : clamp(ratio, kMinRatio, 1.);\r\n });\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n let result = new Array(this.count);\r\n\r\n let attempts: Attempt[] = [];\r\n const multiHeight = (offset: number, count: number) => {\r\n const ratios = this.ratios.slice(offset, offset + count); // warn\r\n const sum = accumulate(ratios, 0);\r\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\r\n };\r\n const pushAttempt = (lineCounts: number[]) => {\r\n let heights: number[] = [];\r\n let offset = 0;\r\n for(let count of lineCounts) {\r\n heights.push(multiHeight(offset, count));\r\n offset += count;\r\n }\r\n attempts.push({lineCounts, heights}); // warn\r\n };\r\n\r\n for(let first = 1; first !== this.count; ++first) {\r\n const second = this.count - first;\r\n if(first > 3 || second > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second]);\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n const third = this.count - first - second;\r\n if((first > 3)\r\n || (second > ((this.averageRatio < 0.85) ? 4 : 3))\r\n || (third > 3)) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third]);\r\n }\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n for(let third = 1; third !== this.count - first - second; ++third) {\r\n const fourth = this.count - first - second - third;\r\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third, fourth]);\r\n }\r\n }\r\n }\r\n\r\n let optimalAttempt: Attempt = null;\r\n let optimalDiff = 0;\r\n for(const attempt of attempts) {\r\n const {heights, lineCounts: counts} = attempt;\r\n const lineCount = counts.length;\r\n const totalHeight = accumulate(heights, 0) \r\n + this.spacing * (lineCount - 1);\r\n const minLineHeight = Math.min(...heights);\r\n const maxLineHeight = Math.max(...heights);\r\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\r\n const bad2 = (() => {\r\n for(let line = 1; line !== lineCount; ++line) {\r\n if(counts[line - 1] > counts[line]) {\r\n return 1.5;\r\n }\r\n }\r\n return 1.;\r\n })();\r\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\r\n if(!optimalAttempt || diff < optimalDiff) {\r\n optimalAttempt = attempt;\r\n optimalDiff = diff;\r\n }\r\n }\r\n\r\n const optimalCounts = optimalAttempt.lineCounts;\r\n\t const optimalHeights = optimalAttempt.heights;\r\n const rowCount = optimalCounts.length;\r\n \r\n let index = 0;\r\n let y = 0;\r\n for(let row = 0; row !== rowCount; ++row) {\r\n const colCount = optimalCounts[row];\r\n const lineHeight = optimalHeights[row];\r\n const height = Math.round(lineHeight);\r\n\r\n let x = 0;\r\n for(let col = 0; col !== colCount; ++col) {\r\n const sides = RectPart.None\r\n | (row === 0 ? RectPart.Top : RectPart.None)\r\n | (row === rowCount - 1 ? RectPart.Bottom : RectPart.None)\r\n | (col === 0 ? RectPart.Left : RectPart.None)\r\n | (col === colCount - 1 ? RectPart.Right : RectPart.None);\r\n\r\n const ratio = this.ratios[index];\r\n const width = (col === colCount - 1)\r\n ? (this.maxWidth - x)\r\n : Math.round(ratio * lineHeight);\r\n result[index] = {\r\n geometry: {x, y, width, height},\r\n sides\r\n };\r\n\r\n x += width + this.spacing;\r\n ++index;\r\n }\r\n y += height + this.spacing;\r\n }\r\n\r\n return result;\r\n }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { InputFile } from \"../layer\";\r\nimport AvatarEdit from \"./avatarEdit\";\r\nimport AvatarElement from \"./avatar\";\r\nimport InputField from \"./inputField\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport ButtonCorner from \"./buttonCorner\";\r\n\r\nexport default class EditPeer {\r\n public nextBtn: HTMLButtonElement;\r\n\r\n public uploadAvatar: () => Promise;\r\n public avatarEdit: AvatarEdit;\r\n public avatarElem: AvatarElement;\r\n\r\n private inputFields: InputField[];\r\n private listenerSetter: ListenerSetter;\r\n\r\n private peerId: PeerId;\r\n\r\n private _disabled = false;\r\n private avatarSize = 120;\r\n\r\n constructor(options: {\r\n peerId?: EditPeer['peerId'],\r\n inputFields: EditPeer['inputFields'],\r\n listenerSetter: ListenerSetter,\r\n doNotEditAvatar?: boolean,\r\n withoutAvatar?: boolean,\r\n nextBtn?: HTMLButtonElement,\r\n avatarSize?: number\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.nextBtn) {\r\n this.nextBtn = ButtonCorner({icon: 'check'});\r\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\r\n this.handleChange = () => {\r\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\r\n };\r\n }\r\n\r\n if(!options.withoutAvatar) {\r\n this.avatarElem = document.createElement('avatar-element') as AvatarElement;\r\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\r\n this.avatarElem.setAttribute('peer', '' + this.peerId);\r\n \r\n if(!options.doNotEditAvatar) {\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n this.handleChange();\r\n this.avatarElem.remove();\r\n });\r\n \r\n this.avatarEdit.container.append(this.avatarElem);\r\n }\r\n }\r\n\r\n this.inputFields.forEach(inputField => {\r\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\r\n });\r\n\r\n this.handleChange();\r\n }\r\n\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value) {\r\n this._disabled = value;\r\n this.inputFields.forEach(inputField => inputField.input.toggleAttribute('disabled', value));\r\n this.handleChange();\r\n }\r\n\r\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\r\n this.disabled = true;\r\n promise.then(() => {\r\n if(unlockOnSuccess) {\r\n this.disabled = false;\r\n }\r\n }, () => {\r\n this.disabled = false;\r\n });\r\n }\r\n\r\n public isChanged = () => {\r\n if(this.uploadAvatar) {\r\n return true;\r\n }\r\n\r\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\r\n this.inputFields.forEach(inputField => {\r\n if(inputField.isValid()) {\r\n if(inputField.isChanged()) {\r\n ++changedLength;\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredValidLength;\r\n }\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredLength;\r\n }\r\n });\r\n\r\n return requiredLength === requiredValidLength && changedLength > 0;\r\n };\r\n\r\n public handleChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\r\n const form = document.createElement('form');\r\n\r\n radios.forEach(r => {\r\n const {container, input} = r;\r\n form.append(container);\r\n input.addEventListener('change', (e) => {\r\n if(input.checked) {\r\n onChange(input.value, e);\r\n }\r\n });\r\n });\r\n\r\n return form;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CheckboxField from \"./checkboxField\";\r\nimport RadioField from \"./radioField\";\r\nimport { ripple } from \"./ripple\";\r\nimport { SliderSuperTab } from \"./slider\";\r\nimport RadioForm from \"./radioForm\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\n\r\nexport default class Row {\r\n public container: HTMLElement;\r\n public title: HTMLDivElement;\r\n public subtitle: HTMLElement;\r\n\r\n public checkboxField: CheckboxField;\r\n public radioField: RadioField;\r\n\r\n public freezed = false;\r\n\r\n constructor(options: Partial<{\r\n icon: string,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleLangKey: LangPackKey,\r\n subtitleLangArgs: any[],\r\n radioField: Row['radioField'],\r\n checkboxField: Row['checkboxField'],\r\n noCheckboxSubtitle: boolean,\r\n title: string,\r\n titleLangKey: LangPackKey,\r\n titleRight: string | HTMLElement,\r\n clickable: boolean | ((e: Event) => void),\r\n navigationTab: SliderSuperTab,\r\n havePadding: boolean,\r\n noRipple: boolean\r\n }> = {}) {\r\n this.container = document.createElement(options.radioField || options.checkboxField ? 'label' : 'div');\r\n this.container.classList.add('row');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add('row-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n if(options.subtitle) {\r\n if(typeof(options.subtitle) === 'string') {\r\n setInnerHTML(this.subtitle, options.subtitle);\r\n } else {\r\n this.subtitle.append(options.subtitle);\r\n }\r\n } else if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\r\n }\r\n this.container.append(this.subtitle);\r\n\r\n let havePadding = !!options.havePadding;\r\n if(options.radioField || options.checkboxField) {\r\n havePadding = true;\r\n if(options.radioField) {\r\n this.radioField = options.radioField;\r\n this.container.append(this.radioField.label);\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 this.container.append(this.checkboxField.label);\r\n }\r\n\r\n if(!options.noCheckboxSubtitle && !isToggle) {\r\n this.checkboxField.input.addEventListener('change', () => {\r\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\r\n });\r\n }\r\n }\r\n\r\n const i = options.radioField || options.checkboxField;\r\n i.label.classList.add('disable-hover');\r\n } \r\n \r\n if(options.title || options.titleLangKey) {\r\n let c: HTMLElement;\r\n if(options.titleRight) {\r\n c = document.createElement('div');\r\n c.classList.add('row-title-row');\r\n this.container.append(c);\r\n } else {\r\n c = this.container;\r\n }\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add('row-title');\r\n this.title.setAttribute('dir', 'auto');\r\n if(options.title) {\r\n this.title.innerHTML = options.title;\r\n } else {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n c.append(this.title);\r\n\r\n if(options.titleRight) {\r\n const titleRight = document.createElement('div');\r\n titleRight.classList.add('row-title', 'row-title-right');\r\n\r\n if(typeof(options.titleRight) === 'string') {\r\n titleRight.innerHTML = options.titleRight;\r\n } else {\r\n titleRight.append(options.titleRight);\r\n }\r\n\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 this.container.addEventListener('click', (e) => {\r\n if(this.freezed) return;\r\n (options.clickable as any)(e);\r\n });\r\n }\r\n\r\n this.container.classList.add('row-clickable', 'hover-effect');\r\n\r\n if(!options.noRipple) {\r\n ripple(this.container, undefined, undefined, true);\r\n }\r\n\r\n /* if(options.radioField || options.checkboxField) {\r\n this.container.prepend(this.container.lastElementChild);\r\n } */\r\n }\r\n }\r\n\r\n\r\n}\r\n\r\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\r\n return RadioForm(rows.map(r => ({container: r.container, input: r.radioField.input})), onChange);\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// https://stackoverflow.com/a/30810322\r\nfunction fallbackCopyTextToClipboard(text: string) {\r\n var textArea = document.createElement(\"textarea\");\r\n textArea.value = text;\r\n \r\n // Avoid scrolling to bottom\r\n textArea.style.top = \"0\";\r\n textArea.style.left = \"0\";\r\n textArea.style.position = \"fixed\";\r\n\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n\r\n try {\r\n document.execCommand('copy');\r\n //const successful = document.execCommand('copy');\r\n //const msg = successful ? 'successful' : 'unsuccessful';\r\n //console.log('Fallback: Copying text command was ' + msg);\r\n } catch(err) {\r\n //console.error('Fallback: Oops, unable to copy', err);\r\n }\r\n\r\n document.body.removeChild(textArea);\r\n}\r\n\r\nexport function copyTextToClipboard(text: string) {\r\n if(!navigator.clipboard) {\r\n fallbackCopyTextToClipboard(text);\r\n return;\r\n }\r\n \r\n navigator.clipboard.writeText(text);/* .then(function() {\r\n console.log('Async: Copying to clipboard was successful!');\r\n }, function(err) {\r\n console.error('Async: Could not copy text: ', err);\r\n }); */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { getDeepProperty } from \"../helpers/object\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport default class RadioField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public main: HTMLElement;\r\n\r\n constructor(options: {\r\n text?: string, \r\n langKey?: LangPackKey,\r\n name: string, \r\n value?: string, \r\n stateKey?: string\r\n }) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('radio-field');\r\n \r\n const input = this.input = document.createElement('input');\r\n input.type = 'radio';\r\n /* input.id = */input.name = 'input-radio-' + options.name;\r\n \r\n if(options.value) {\r\n input.value = options.value;\r\n \r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\r\n });\r\n \r\n input.addEventListener('change', () => {\r\n appStateManager.setByKey(options.stateKey, options.value);\r\n });\r\n }\r\n }\r\n \r\n const main = this.main = document.createElement('div');\r\n main.classList.add('radio-field-main');\r\n \r\n if(options.text) {\r\n main.innerHTML = options.text;\r\n /* const caption = document.createElement('div');\r\n caption.classList.add('radio-field-main-caption');\r\n caption.innerHTML = text;\r\n \r\n if(subtitle) {\r\n label.classList.add('radio-field-with-subtitle');\r\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\r\n }\r\n \r\n main.append(caption); */\r\n } else if(options.langKey) {\r\n _i18n(main, options.langKey);\r\n }\r\n \r\n label.append(input, main);\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nconst toastEl = document.createElement('div');\r\ntoastEl.classList.add('toast');\r\nexport function toast(content: string | Node) {\r\n replaceContent(toastEl, content);\r\n document.body.append(toastEl);\r\n\r\n if(toastEl.dataset.timeout) clearTimeout(+toastEl.dataset.timeout);\r\n toastEl.dataset.timeout = '' + setTimeout(() => {\r\n toastEl.remove();\r\n delete toastEl.dataset.timeout;\r\n }, 3000);\r\n}\r\n\r\nexport function toastNew(options: Partial<{\r\n langPackKey: LangPackKey\r\n}>) {\r\n toast(i18n(options.langPackKey));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyFunction, Awaited } from \"../../types\";\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) {\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 return (...args: Parameters): typeof waitingPromise => {\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 // @ts-ignore\r\n resolve(fn(...args));\r\n hadNewCall = false;\r\n }\r\n\r\n waitingTimeout = setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n }\r\n\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }, ms) as any;\r\n\r\n waitingPromise.catch(() => {});\r\n return waitingPromise;\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport debounce from \"../helpers/schedulers/debounce\";\r\nimport appChatsManager from \"../lib/appManagers/appChatsManager\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport InputField, { InputFieldOptions, InputState } from \"./inputField\";\r\n\r\nexport class UsernameInputField extends InputField {\r\n private checkUsernamePromise: Promise;\r\n private checkUsernameDebounced: (username: string) => void;\r\n public options: InputFieldOptions & {\r\n peerId?: PeerId,\r\n listenerSetter: ListenerSetter,\r\n onChange?: () => void,\r\n invalidText: LangPackKey,\r\n takenText: LangPackKey,\r\n availableText: LangPackKey,\r\n head?: string\r\n };\r\n\r\n constructor(options: UsernameInputField['options']) {\r\n super(options);\r\n\r\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\r\n\r\n options.listenerSetter.add(this.input)('input', () => {\r\n const value = this.getValue();\r\n\r\n //console.log('userNameInput:', value);\r\n if(value === this.originalValue || !value.length) {\r\n this.setState(InputState.Neutral, this.options.label);\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n } else if(!RichTextProcessor.isUsernameValid(value)) { // does not check the last underscore\r\n this.setError(this.options.invalidText);\r\n } else {\r\n this.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.input.classList.contains('error')) {\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n }\r\n\r\n this.checkUsernameDebounced(value);\r\n });\r\n }\r\n\r\n public getValue() {\r\n let value = this.value;\r\n if(this.options.head) {\r\n value = value.slice(this.options.head.length);\r\n this.setValueSilently(this.options.head + value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private checkUsername(username: string) {\r\n if(this.checkUsernamePromise) return;\r\n\r\n if(this.options.peerId) {\r\n this.checkUsernamePromise = apiManager.invokeApi('channels.checkUsername', {\r\n channel: appChatsManager.getChannelInput(this.options.peerId.toChatId()),\r\n username\r\n });\r\n } else {\r\n this.checkUsernamePromise = apiManager.invokeApi('account.checkUsername', {username});\r\n }\r\n\r\n this.checkUsernamePromise.then(available => {\r\n if(this.getValue() !== username) return;\r\n\r\n if(available) {\r\n this.setState(InputState.Valid, this.options.availableText);\r\n } else {\r\n this.setError(this.options.takenText);\r\n }\r\n }, (err) => {\r\n if(this.getValue() !== username) return;\r\n\r\n switch(err.type) {\r\n case 'USERNAME_INVALID': {\r\n this.setError(this.options.invalidText);\r\n break;\r\n }\r\n }\r\n }).then(() => {\r\n this.checkUsernamePromise = undefined;\r\n this.options.onChange && this.options.onChange();\r\n\r\n const value = this.getValue();\r\n if(value !== username && this.isValidToChange() && RichTextProcessor.isUsernameValid(value)) {\r\n this.checkUsername(value);\r\n }\r\n });\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from \"../avatar\";\nimport PopupElement, { addCancelButton, PopupButton, PopupOptions } from \".\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport CheckboxField, { CheckboxFieldOptions } from \"../checkboxField\";\n\nexport type PopupPeerButton = Omit & Partial<{callback: PopupPeerButtonCallback}>;\nexport type PopupPeerButtonCallbackCheckboxes = Set;\nexport type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void;\nexport type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField};\n\nexport type PopupPeerOptions = PopupOptions & Partial<{\n peerId: PeerId,\n title: string,\n titleLangKey?: LangPackKey,\n titleLangArgs?: any[],\n noTitle?: boolean,\n description: string,\n descriptionLangKey?: LangPackKey,\n descriptionLangArgs?: any[],\n buttons?: Array,\n checkboxes: Array\n}>;\nexport default class PopupPeer extends PopupElement {\n constructor(private className: string, options: PopupPeerOptions = {}) {\n super('popup-peer' + (className ? ' ' + className : ''), options.buttons && addCancelButton(options.buttons), {overlayClosable: true, ...options});\n\n if(options.peerId) {\n let avatarEl = new AvatarElement();\n avatarEl.setAttribute('dialog', '1');\n avatarEl.setAttribute('peer', '' + options.peerId);\n avatarEl.classList.add('avatar-32');\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 this.title.innerText = options.title || '';\n }\n\n const fragment = document.createDocumentFragment();\n\n if(options.descriptionLangKey || options.description) {\n const p = document.createElement('p');\n p.classList.add('popup-description');\n if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs));\n else if(options.description) p.innerHTML = options.description;\n \n fragment.append(p);\n }\n\n if(options.checkboxes) {\n this.container.classList.add('have-checkbox');\n \n options.checkboxes.forEach(o => {\n o.withRipple = false;\n const checkboxField = new CheckboxField(o);\n o.checkboxField = checkboxField;\n fragment.append(checkboxField.label);\n });\n\n options.buttons.forEach(button => {\n if(button.callback) {\n const original = button.callback;\n button.callback = () => {\n const c: Set = new Set();\n options.checkboxes.forEach(o => {\n if(o.checkboxField.checked) {\n c.add(o.text);\n }\n });\n original(c);\n };\n }\n });\n }\n\n this.container.insertBefore(fragment, this.header.nextElementSibling);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { copyTextToClipboard } from \"../../../helpers/clipboard\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport { Chat, ChatFull, ExportedChatInvite } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport Button from \"../../button\";\r\nimport { setButtonLoader } from \"../../misc\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport { toast } from \"../../toast\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\r\n public chatId: ChatId;\r\n public chatFull: ChatFull;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-peer-container', 'group-type-container');\r\n\r\n const isBroadcast = appChatsManager.isBroadcast(this.chatId);\r\n\r\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\r\n\r\n const section = new SettingSection({\r\n name: isBroadcast ? 'ChannelType' : 'GroupType'\r\n });\r\n\r\n const random = randomLong();\r\n const privateRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate', \r\n name: random, \r\n value: 'private'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\r\n });\r\n const publicRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic', \r\n name: random, \r\n value: 'public'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\r\n });\r\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\r\n const a = [privateSection, publicSection];\r\n if(value === 'public') a.reverse();\r\n\r\n a[0].container.classList.remove('hide');\r\n a[1].container.classList.add('hide');\r\n\r\n onChange();\r\n });\r\n\r\n const chat: Chat = appChatsManager.getChat(this.chatId);\r\n\r\n section.content.append(form);\r\n\r\n const privateSection = new SettingSection({});\r\n\r\n //let revoked = false;\r\n const linkRow = new Row({\r\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\r\n clickable: () => {\r\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\r\n toast(I18n.format('LinkCopied', true));\r\n }\r\n });\r\n\r\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\r\n\r\n attachClickEvent(btnRevoke, () => {\r\n new PopupPeer('revoke-link', {\r\n buttons: [{\r\n langKey: 'RevokeButton',\r\n callback: () => {\r\n const toggle = toggleDisability([btnRevoke], true);\r\n \r\n appProfileManager.getChatInviteLink(this.chatId, true).then(link => {\r\n toggle();\r\n linkRow.title.innerHTML = link;\r\n //revoked = true;\r\n //onChange();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'RevokeLink',\r\n descriptionLangKey: 'RevokeAlert'\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n privateSection.content.append(linkRow.container, btnRevoke);\r\n\r\n const publicSection = new SettingSection({\r\n caption: isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup',\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const placeholder = 't.me/';\r\n\r\n const onChange = () => {\r\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) \r\n || (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\r\n applyBtn.classList.toggle('is-visible', changed);\r\n };\r\n\r\n const linkInputField = new UsernameInputField({\r\n label: 'SetUrlPlaceholder',\r\n name: 'group-public-link',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n availableText: 'Link.Available',\r\n invalidText: 'Link.Invalid',\r\n takenText: 'Link.Taken',\r\n onChange: onChange,\r\n peerId: this.chatId.toPeerId(true),\r\n head: placeholder\r\n });\r\n\r\n const originalValue = placeholder + ((chat as Chat.channel).username || '');\r\n\r\n inputWrapper.append(linkInputField.container)\r\n publicSection.content.append(inputWrapper);\r\n\r\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\r\n this.content.append(applyBtn);\r\n\r\n attachClickEvent(applyBtn, () => {\r\n /* const unsetLoader = */setButtonLoader(applyBtn);\r\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\r\n appChatsManager.migrateChat(this.chatId).then(channelId => {\r\n return appChatsManager.updateUsername(channelId, username);\r\n }).then(() => {\r\n //unsetLoader();\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n (originalValue !== placeholder ? publicRow : privateRow).radioField.checked = true;\r\n linkInputField.setOriginalValue(originalValue);\r\n\r\n this.scrollable.append(section.container, privateSection.container, publicSection.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\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\";\r\n\r\nexport default class ScrollableLoader {\r\n public loading = false;\r\n private scrollable: Scrollable;\r\n private getPromise: () => Promise;\r\n private promise: Promise;\r\n private loaded = false;\r\n\r\n constructor(options: {\r\n scrollable: ScrollableLoader['scrollable'],\r\n getPromise: ScrollableLoader['getPromise']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n options.scrollable.onScrolledBottom = () => {\r\n this.load();\r\n };\r\n }\r\n \r\n public load() {\r\n if(this.loaded) {\r\n return Promise.resolve();\r\n }\r\n \r\n if(this.loading) {\r\n return this.promise;\r\n }\r\n\r\n this.loading = true;\r\n this.promise = this.getPromise().then(done => {\r\n this.loading = false;\r\n this.promise = undefined;\r\n\r\n if(done) {\r\n this.loaded = true;\r\n this.scrollable.onScrolledBottom = null;\r\n } else {\r\n this.scrollable.checkForTriggers();\r\n }\r\n }, () => {\r\n this.promise = undefined;\r\n this.loading = false;\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager, { ChatRights } from \"../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, { Dialog } from \"../lib/appManagers/appMessagesManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport rootScope from \"../lib/rootScope\";\nimport Scrollable from \"./scrollable\";\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\nimport CheckboxField from \"./checkboxField\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { safeAssign } from \"../helpers/object\";\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 { filterUnique, indexOfAndSplice } from \"../helpers/array\";\nimport debounce from \"../helpers/schedulers/debounce\";\nimport windowSize from \"../helpers/windowSize\";\nimport appPeersManager, { IsPeerType } from \"../lib/appManagers/appPeersManager\";\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 public chatsContainer = document.createElement('div');\n public scrollable: Scrollable;\n public selectedScrollable: Scrollable;\n \n public selectedContainer: HTMLElement;\n public input: HTMLInputElement;\n \n //public selected: {[peerId: PeerId]: HTMLElement} = {};\n public selected = new Set();\n\n public freezed = false;\n\n private folderId = 0;\n private offsetIndex = 0;\n private promise: Promise;\n\n private query = '';\n private cachedContacts: PeerId[];\n\n private loadedWhat: Partial<{[k in 'dialogs' | 'archived' | 'contacts' | 'channelParticipants']: true}> = {};\n\n private renderedPeerIds: Set = new Set();\n\n private appendTo: HTMLElement;\n private onChange: (length: number) => void;\n private peerType: SelectSearchPeerType[] = ['dialogs'];\n private renderResultsFunc: (peerIds: PeerId[]) => void;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize = 48;\n private exceptSelf = false;\n private filterPeerTypeBy: IsPeerType[];\n\n private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {};\n private peerId: PeerId;\n\n private placeholder: LangPackKey;\n\n private selfPresence: LangPackKey = 'Presence.YourChat';\n \n private needSwitchList = false;\n \n 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 }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector');\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = (peerIds) => {\n if(this.needSwitchList) {\n this.scrollable.splitUp.replaceWith(this.list);\n this.scrollable.setVirtualContainer(this.list);\n this.needSwitchList = false;\n }\n \n peerIds = peerIds.filter(peerId => {\n const notRendered = !this.renderedPeerIds.has(peerId);\n if(notRendered) this.renderedPeerIds.add(peerId);\n return notRendered;\n });\n\n if(this.filterPeerTypeBy) {\n peerIds = peerIds.filter(peerId => {\n if(peerId.isPeerId()) {\n const peer = appPeersManager.getPeer(peerId);\n if(!peer.deleted) {\n return this.filterPeerTypeBy.find(method => appPeersManager[method](peerId));\n }\n }\n\n return true;\n });\n }\n\n return f(peerIds);\n };\n\n this.input = document.createElement('input');\n this.input.classList.add('selector-search-input');\n if(this.placeholder) {\n _i18n(this.input, this.placeholder, undefined, 'placeholder');\n } else {\n _i18n(this.input, 'SendMessageTo', undefined, 'placeholder');\n }\n\n this.input.type = 'text';\n\n if(this.multiSelect) {\n let topContainer = document.createElement('div');\n topContainer.classList.add('selector-search-container');\n \n this.selectedContainer = document.createElement('div');\n this.selectedContainer.classList.add('selector-search');\n \n this.selectedContainer.append(this.input);\n topContainer.append(this.selectedContainer);\n this.selectedScrollable = new Scrollable(topContainer);\n \n let delimiter = document.createElement('hr');\n\n this.selectedContainer.addEventListener('click', (e) => {\n if(this.freezed) return;\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'selector-user');\n \n if(!target) return;\n \n const peerId = target.dataset.key;\n const li = this.chatsContainer.querySelector('[data-peer-id=\"' + peerId + '\"]') as HTMLElement;\n if(!li) {\n this.remove(peerId.toPeerId());\n } else {\n li.click();\n }\n });\n\n this.container.append(topContainer, delimiter);\n }\n\n this.chatsContainer.classList.add('chatlist-container');\n this.chatsContainer.append(this.list);\n this.scrollable = new Scrollable(this.chatsContainer);\n this.scrollable.setVirtualContainer(this.list);\n\n this.chatsContainer.addEventListener('click', (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.container.append(this.chatsContainer);\n this.appendTo.append(this.container);\n\n // WARNING TIMEOUT\n setTimeout(() => {\n let getResultsPromise = this.getMoreResults() as Promise;\n if(options.onFirstRender) {\n getResultsPromise.then(() => {\n options.onFirstRender();\n });\n }\n }, 0);\n }\n\n private onInput = () => {\n const value = this.input.value;\n if(this.query !== value) {\n if(this.peerType.includes('contacts') || this.peerType.includes('dialogs')) {\n this.cachedContacts = null;\n }\n \n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(let i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = null;\n this.loadedWhat = {};\n this.query = value;\n this.renderedPeerIds.clear();\n this.needSwitchList = true;\n \n //console.log('selectPeers input:', this.query);\n this.getMoreResults();\n }\n };\n\n private renderSaved() {\n if(!this.exceptSelf && \n !this.offsetIndex && \n this.folderId === 0 && \n this.peerType.includes('dialogs') && \n (!this.query || appUsersManager.testSelfSearch(this.query))) {\n this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n if(this.tempIds[type] === undefined) {\n this.tempIds[type] = 0;\n }\n\n return ++this.tempIds[type];\n }\n\n private async getMoreDialogs(): Promise {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n \n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.windowH / 72 * 1.25 | 0;\n\n const tempId = this.getTempId('dialogs');\n const promise = appMessagesManager.getConversations(this.query, this.offsetIndex, pageCount, this.folderId, true).promise;\n this.promise = promise;\n const value = await promise;\n if(this.tempIds.dialogs !== tempId) {\n return;\n }\n\n this.promise = null;\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = dialogs[dialogs.length - 1].index || 0;\n\n dialogs = dialogs.slice();\n dialogs.findAndSplice(d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = dialogs.filter(d => this.filterByRights(d.peerId));\n }\n\n this.renderSaved();\n\n this.offsetIndex = newOffsetIndex;\n }\n\n this.renderResultsFunc(dialogs.map(dialog => dialog.peerId));\n \n if(value.isEnd) {\n if(!this.loadedWhat.dialogs) {\n this.renderSaved();\n\n this.loadedWhat.dialogs = true;\n this.offsetIndex = 0;\n this.folderId = 1;\n\n return this.getMoreDialogs();\n } else {\n this.loadedWhat.archived = true;\n\n if(!this.loadedWhat.contacts/* && this.peerType.includes('contacts') */) {\n return this.getMoreContacts();\n }\n }\n }\n }\n\n private filterByRights(peerId: PeerId) {\n return (\n peerId.isUser() && \n (this.chatRightsAction !== 'send_messages' || appUsersManager.canSendToUser(peerId))\n ) || appChatsManager.hasRights(peerId.toChatId(), this.chatRightsAction);\n }\n\n private async getMoreContacts() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.contacts) {\n return;\n }\n\n const isGlobalSearch = this.peerType.includes('contacts');\n\n if(!this.cachedContacts) {\n /* const promises: Promise[] = [appUsersManager.getContacts(this.query)];\n if(!this.peerType.includes('dialogs')) {\n promises.push(appMessagesManager.getConversationsAll());\n }\n\n this.promise = Promise.all(promises);\n this.cachedContacts = (await this.promise)[0].slice(); */\n const tempId = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n this.promise = promise;\n let [cachedContacts, searchResult] = await promise;\n if(this.tempIds.contacts !== tempId) {\n return;\n }\n\n if(searchResult) {\n // do not add global result if only dialogs needed\n let resultPeerIds = isGlobalSearch ? searchResult.my_results.concat(searchResult.results) : searchResult.my_results;\n\n if(this.chatRightsAction) {\n resultPeerIds = resultPeerIds.filter(peerId => this.filterByRights(peerId));\n }\n\n if(!this.peerType.includes('dialogs')) {\n resultPeerIds = resultPeerIds.filter(peerId => peerId.isUser());\n }\n\n this.cachedContacts = filterUnique(cachedContacts.concat(resultPeerIds));\n } else this.cachedContacts = cachedContacts.slice();\n\n indexOfAndSplice(this.cachedContacts, rootScope.myId); // no my account\n this.promise = null;\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.windowH / 72 * 1.25 | 0;\n const arr = this.cachedContacts.splice(0, pageCount);\n this.renderResultsFunc(arr);\n // }\n \n if(!this.cachedContacts.length) {\n this.loadedWhat.contacts = true;\n\n // need to load non-contacts\n /* if(!this.peerType.includes('dialogs')) {\n return this.getMoreDialogs();\n } */\n }\n }\n\n private async getMoreChannelParticipants() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const tempId = this.getTempId('channelParticipants');\n const promise = appProfileManager.getChannelParticipants(this.peerId.toChatId(), {_: 'channelParticipantsSearch', q: this.query}, pageCount, this.list.childElementCount);\n const participants = await promise;\n if(this.tempIds.channelParticipants !== tempId) {\n return;\n }\n \n const peerIds = participants.participants.map(participant => {\n return appChatsManager.getParticipantPeerId(participant);\n });\n indexOfAndSplice(peerIds, rootScope.myId);\n this.renderResultsFunc(peerIds);\n\n if(this.list.childElementCount >= participants.count || participants.participants.length < pageCount) {\n this.loadedWhat.channelParticipants = true;\n }\n }\n\n checkForTriggers = () => {\n this.scrollable.checkForTriggers();\n };\n\n private getMoreResults() {\n const get = () => {\n const promises: Promise[] = [];\n\n // if(!loadedAllDialogs && (this.peerType.includes('dialogs')/* || this.peerType.includes('contacts') */)) {\n // if(!loadAllDialogsPromise) {\n // loadAllDialogsPromise = appMessagesManager.getConversationsAll()\n // .then(() => {\n // loadedAllDialogs = true;\n // }).finally(() => {\n // loadAllDialogsPromise = null;\n // });\n // }\n\n // promises.push(loadAllDialogsPromise);\n // }\n \n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n promises.push(this.getMoreDialogs());\n \n if(!this.loadedWhat.archived) {\n return promises;\n }\n }\n \n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n promises.push(this.getMoreContacts());\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n promises.push(this.getMoreChannelParticipants());\n }\n \n return promises;\n };\n \n const promises = get();\n const promise = Promise.all(promises);\n if(promises.length) {\n promise.then(this.checkForTriggers);\n }\n\n return promise;\n }\n\n private renderResults(peerIds: PeerId[]) {\n //console.log('will renderResults:', peerIds);\n\n // оставим только неконтакты с диалогов\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = peerIds.filter(peerId => {\n return appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(peerId => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n container: this.scrollable,\n drawStatus: false,\n rippleEnabled: this.rippleEnabled,\n avatarSize: this.avatarSize\n });\n\n if(this.multiSelect) {\n const selected = this.selected.has(peerId);\n const checkboxField = new CheckboxField();\n\n if(selected) {\n //dom.listEl.classList.add('active');\n checkboxField.input.checked = true;\n }\n\n dom.containerEl.prepend(checkboxField.label);\n }\n\n let subtitleEl: HTMLElement;\n if(peerId.isAnyChat()) {\n subtitleEl = appProfileManager.getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = appUsersManager.getUserStatusString(peerId);\n }\n\n dom.lastMessageSpan.append(subtitleEl);\n });\n }\n\n public add(key: PeerId | string, title?: string | HTMLElement, scroll = true) {\n //console.trace('add');\n this.selected.add(key);\n\n if(!this.multiSelect) {\n this.onChange(this.selected.size);\n return;\n }\n\n if(this.query.trim()) {\n this.input.value = '';\n this.onInput();\n }\n\n const div = document.createElement('div');\n div.classList.add('selector-user', 'scale-in');\n\n const avatarEl = document.createElement('avatar-element');\n avatarEl.classList.add('selector-user-avatar', 'tgico');\n avatarEl.setAttribute('dialog', '1');\n avatarEl.classList.add('avatar-32');\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.setAttribute('peer', '' + key);\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n this.selectedContainer.insertBefore(div, this.input);\n //this.selectedScrollable.scrollTop = this.selectedScrollable.scrollHeight;\n this.onChange && this.onChange(this.selected.size);\n \n if(scroll) {\n this.selectedScrollable.scrollIntoViewNew(this.input, 'center');\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(this.input, 'center', undefined, undefined, FocusDirection.Static);\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport AppSelectPeers from \"../appSelectPeers\";\r\nimport PopupElement from \".\";\r\nimport { LangPackKey, _i18n } from \"../../lib/langPack\";\r\n\r\nexport default class PopupPickUser extends PopupElement {\r\n protected selector: AppSelectPeers;\r\n \r\n constructor(options: {\r\n peerTypes: AppSelectPeers['peerType'], \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n placeholder: LangPackKey,\r\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\r\n peerId?: number,\r\n selfPresence?: LangPackKey\r\n }) {\r\n super('popup-forward', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.body, \r\n onChange: async() => {\r\n const selected = this.selector.getSelected();\r\n const peerId = selected[selected.length - 1].toPeerId();\r\n \r\n if(options.onSelect) {\r\n const res = options.onSelect(peerId);\r\n if(res instanceof Promise) {\r\n try {\r\n await res;\r\n } catch(err) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.selector = null;\r\n this.hide();\r\n }, \r\n peerType: options.peerTypes, \r\n onFirstRender: () => {\r\n this.show();\r\n this.selector.checkForTriggers(); // ! due to zero height before mounting\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.selector.input.focus();\r\n }\r\n }, \r\n chatRightsAction: options.chatRightsAction, \r\n multiSelect: false,\r\n rippleEnabled: false,\r\n avatarSize: 46,\r\n peerId: options.peerId,\r\n placeholder: options.placeholder,\r\n selfPresence: options.selfPresence\r\n });\r\n\r\n //this.scrollable = new Scrollable(this.body);\r\n\r\n this.title.append(this.selector.input);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\nimport { deepEqual } from \"../../../helpers/object\";\nimport { ChannelParticipant } from \"../../../layer\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport Button from \"../../button\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { ChatPermissions } from \"./groupPermissions\";\n\nexport default class AppUserPermissionsTab extends SliderSuperTabEventable {\n public participant: ChannelParticipant;\n public chatId: ChatId;\n public userId: UserId;\n\n protected init() {\n this.container.classList.add('edit-peer-container', 'user-permissions-container');\n this.setTitle('UserRestrictions');\n\n let destroyListener: () => void;\n\n {\n const section = new SettingSection({\n name: 'UserRestrictionsCanDo',\n });\n \n const div = document.createElement('div');\n div.classList.add('chatlist-container');\n section.content.insertBefore(div, section.title);\n\n const list = appDialogsManager.createChatList({new: true});\n div.append(list);\n\n const {dom} = appDialogsManager.addDialogNew({\n dialog: this.userId.toPeerId(false),\n container: list,\n drawStatus: false,\n rippleEnabled: true,\n avatarSize: 48\n });\n\n dom.lastMessageSpan.append(appUsersManager.getUserStatusString(this.userId));\n\n const p = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n participant: this.participant._ === 'channelParticipantBanned' ? this.participant : undefined\n });\n\n destroyListener = () => {\n //appChatsManager.editChatDefaultBannedRights(this.chatId, p.takeOut());\n const rights = p.takeOut();\n if(this.participant._ === 'channelParticipantBanned' && deepEqual(this.participant.banned_rights.pFlags, rights.pFlags)) {\n return;\n }\n\n appChatsManager.editBanned(this.chatId, this.participant, rights);\n };\n\n this.eventListener.addEventListener('destroy', destroyListener, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({});\n\n if(this.participant._ === 'channelParticipantBanned') {\n const btnDeleteException = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'GroupPermission.Delete'});\n\n attachClickEvent(btnDeleteException, () => {\n const toggle = toggleDisability([btnDeleteException], true);\n appChatsManager.clearChannelParticipantBannedRights(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n \n section.content.append(btnDeleteException);\n }\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'deleteuser', text: 'UserRestrictionsBlock'});\n\n attachClickEvent(btnDelete, () => {\n const toggle = toggleDisability([btnDelete], true);\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n });\n /* new PopupPeer('popup-group-kick-user', {\n peerId: -this.chatId,\n title: 'Ban User?',\n description: `Are you sure you want to ban ${appPeersManager.getPeerTitle(this.userId)}`,\n buttons: addCancelButton([{\n text: 'BAN',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show(); */\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport ListenerSetter from \"../../../helpers/listenerSetter\";\nimport ScrollableLoader from \"../../../helpers/scrollableLoader\";\nimport { ChannelParticipant, Chat, ChatBannedRights, Update } from \"../../../layer\";\nimport appChatsManager, { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\nimport I18n, { i18n, join, LangPackKey } from \"../../../lib/langPack\";\nimport rootScope from \"../../../lib/rootScope\";\nimport CheckboxField from \"../../checkboxField\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport Row from \"../../row\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { toast } from \"../../toast\";\nimport AppUserPermissionsTab from \"./userPermissions\";\n\nexport class ChatPermissions {\n public v: Array<{\n flags: ChatRights[],\n text: LangPackKey,\n exceptionText: LangPackKey,\n checkboxField?: CheckboxField,\n }>;\n private toggleWith: Partial<{[chatRight in ChatRights]: ChatRights[]}>;\n\n constructor(options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }) {\n this.v = [\n {flags: ['send_messages'], text: 'UserRestrictionsSend', exceptionText: 'UserRestrictionsNoSend'},\n {flags: ['send_media'], text: 'UserRestrictionsSendMedia', exceptionText: 'UserRestrictionsNoSendMedia'},\n {flags: ['send_stickers', 'send_gifs'], text: 'UserRestrictionsSendStickers', exceptionText: 'UserRestrictionsNoSendStickers'},\n {flags: ['send_polls'], text: 'UserRestrictionsSendPolls', exceptionText: 'UserRestrictionsNoSendPolls'},\n {flags: ['embed_links'], text: 'UserRestrictionsEmbedLinks', exceptionText: 'UserRestrictionsNoEmbedLinks'},\n {flags: ['invite_users'], text: 'UserRestrictionsInviteUsers', exceptionText: 'UserRestrictionsNoInviteUsers'},\n {flags: ['pin_messages'], text: 'UserRestrictionsPinMessages', exceptionText: 'UserRestrictionsNoPinMessages'},\n {flags: ['change_info'], text: 'UserRestrictionsChangeInfo', exceptionText: 'UserRestrictionsNoChangeInfo'}\n ];\n\n this.toggleWith = {\n 'send_messages': ['send_media', 'send_stickers', 'send_polls', 'embed_links']\n };\n\n const chat: Chat.chat = appChatsManager.getChat(options.chatId);\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? appChatsManager.combineParticipantBannedRights(options.chatId, options.participant.banned_rights) : defaultBannedRights;\n \n for(const info of this.v) {\n const mainFlag = info.flags[0];\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: appChatsManager.hasRights(options.chatId, mainFlag, rights),\n restriction: true,\n withRipple: true\n });\n\n // @ts-ignore\n if(options.participant && defaultBannedRights.pFlags[mainFlag]) {\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('UserRestrictionsDisabled', true));\n }, {listenerSetter: options.listenerSetter});\n }\n\n if(this.toggleWith[mainFlag]) {\n options.listenerSetter.add(info.checkboxField.input)('change', () => {\n if(!info.checkboxField.checked) {\n const other = this.v.filter(i => this.toggleWith[mainFlag].includes(i.flags[0]));\n other.forEach(info => {\n info.checkboxField.checked = false;\n });\n }\n });\n }\n\n options.appendTo.append(info.checkboxField.label);\n }\n }\n\n public takeOut() {\n const rights: ChatBannedRights = {\n _: 'chatBannedRights',\n until_date: 0x7FFFFFFF,\n pFlags: {}\n };\n\n for(const info of this.v) {\n const banned = !info.checkboxField.checked;\n if(banned) {\n info.flags.forEach(flag => {\n // @ts-ignore\n rights.pFlags[flag] = true;\n });\n }\n }\n\n return rights;\n }\n}\n\nexport default class AppGroupPermissionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n protected async init() {\n this.container.classList.add('edit-peer-container', 'group-permissions-container');\n this.setTitle('ChannelPermissions');\n\n let chatPermissions: ChatPermissions;\n {\n const section = new SettingSection({\n name: 'ChannelPermissionsHeader',\n });\n\n chatPermissions = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n });\n\n this.eventListener.addEventListener('destroy', () => {\n appChatsManager.editChatDefaultBannedRights(this.chatId, chatPermissions.takeOut());\n }, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({\n name: 'PrivacyExceptions'\n });\n\n const addExceptionRow = new Row({\n titleLangKey: 'ChannelAddException',\n subtitleLangKey: 'Loading',\n icon: 'adduser',\n clickable: () => {\n new PopupPickUser({\n peerTypes: ['channelParticipants'],\n onSelect: (peerId) => {\n setTimeout(() => {\n openPermissions(peerId);\n }, 0);\n },\n placeholder: 'ExceptionModal.Search.Placeholder',\n peerId: -this.chatId,\n });\n }\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = new AppUserPermissionsTab(this.slider);\n tab.participant = participant;\n tab.chatId = this.chatId;\n tab.userId = peerId;\n tab.open();\n };\n\n section.content.append(addExceptionRow.container);\n\n /* const removedUsersRow = new Row({\n titleLangKey: 'ChannelBlockedUsers',\n subtitleLangKey: 'NoBlockedUsers',\n icon: 'deleteuser',\n clickable: true\n });\n\n section.content.append(removedUsersRow.container); */\n\n const c = section.generateContentElement();\n c.classList.add('chatlist-container');\n \n const list = appDialogsManager.createChatList({new: true});\n c.append(list);\n\n attachClickEvent(list, (e) => {\n const target = findUpTag(e.target, 'LI');\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = (li: Element, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;//appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = (appChatsManager.getChat(this.chatId) as Chat.channel).default_banned_rights;\n //const combinedRights = appChatsManager.combineParticipantBannedRights(this.chatId, bannedRights);\n\n const cantWhat: LangPackKey[] = []/* , canWhat: LangPackKey[] = [] */;\n chatPermissions.v.forEach(info => {\n const mainFlag = info.flags[0];\n // @ts-ignore\n if(bannedRights.pFlags[mainFlag] && !defaultBannedRights.pFlags[mainFlag]) {\n cantWhat.push(info.exceptionText);\n // @ts-ignore\n }/* else if(!combinedRights.pFlags[mainFlag]) {\n canWhat.push(info.exceptionText);\n } */\n });\n\n const el = li.querySelector('.user-last-message') as HTMLElement;\n\n if(cantWhat.length) {\n el.innerHTML = '';\n el.append(...join(cantWhat.map(t => i18n(t)), false));\n }/* else if(canWhat.length) {\n str = 'Can ' + canWhat.join(canWhat.length === 2 ? ' and ' : ', ');\n } */\n \n el.classList.toggle('hide', !cantWhat.length);\n };\n\n const add = (participant: ChannelParticipant.channelParticipantBanned, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: appPeersManager.getPeerId(participant.peer),\n container: list,\n drawStatus: false,\n rippleEnabled: true,\n avatarSize: 48,\n append\n });\n\n setSubtitle(dom.listEl, participant);\n\n //dom.titleSpan.innerHTML = 'Chinaza Akachi';\n //dom.lastMessageSpan.innerHTML = 'Can Add Users and Pin Messages';\n };\n\n this.listenerSetter.add(rootScope)('updateChannelParticipant', (update: Update.updateChannelParticipant) => {\n const needAdd = update.new_participant?._ === 'channelParticipantBanned' && !update.new_participant.banned_rights.pFlags.view_messages;\n const li = list.querySelector(`[data-peer-id=\"${update.user_id}\"]`);\n if(needAdd) {\n if(!li) {\n add(update.new_participant as ChannelParticipant.channelParticipantBanned, false);\n } else {\n setSubtitle(li, update.new_participant as ChannelParticipant.channelParticipantBanned);\n }\n\n if(update.prev_participant?._ !== 'channelParticipantBanned') {\n ++exceptionsCount;\n }\n } else {\n if(li) {\n li.remove();\n }\n\n if(update.prev_participant?._ === 'channelParticipantBanned') {\n --exceptionsCount;\n }\n }\n\n setLength();\n });\n\n const setLength = () => {\n replaceContent(addExceptionRow.subtitle, i18n(exceptionsCount ? 'Permissions.ExceptionsCount' : 'Permissions.NoExceptions', [exceptionsCount]));\n };\n\n let exceptionsCount = 0;\n let loader: ScrollableLoader;\n const setLoader = () => {\n const LOAD_COUNT = 50;\n loader = new ScrollableLoader({\n scrollable: this.scrollable,\n getPromise: () => {\n return appProfileManager.getChannelParticipants(this.chatId, {_: 'channelParticipantsBanned', q: ''}, LOAD_COUNT, list.childElementCount).then(res => {\n for(const participant of res.participants) {\n add(participant as ChannelParticipant.channelParticipantBanned, true);\n }\n \n exceptionsCount = res.count;\n setLength();\n \n return res.participants.length < LOAD_COUNT || res.count === list.childElementCount;\n });\n }\n });\n\n return loader.load();\n };\n\n this.scrollable.append(section.container);\n\n if(appChatsManager.isChannel(this.chatId)) {\n await setLoader();\n } else {\n setLength();\n \n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.chatId === migrateFrom) {\n this.chatId = migrateTo;\n setLoader();\n }\n });\n }\n }\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport appPeersManager, { PeerType } from \"../../lib/appManagers/appPeersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\n\nexport default class PopupDeleteDialog {\n constructor(\n peerId: PeerId, \n // actionType: 'leave' | 'delete', \n peerType: PeerType = appPeersManager.getDialogType(peerId), \n onSelect?: (promise: Promise) => void\n ) {\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n /* const callbackFlush = (checked: PopupPeerButtonCallbackCheckboxes) => {\n const promise = appMessagesManager.flushHistory(peerId, checkboxes ? !checked[checkboxes[0].text] : undefined);\n onSelect && onSelect(promise);\n }; */\n\n const callbackLeave = (checked: PopupPeerButtonCallbackCheckboxes, flush = checkboxes && !!checked.size) => {\n let promise = appChatsManager.leave(peerId.toChatId());\n \n if(flush) {\n promise = promise.finally(() => {\n return appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n \n onSelect && onSelect(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(peerId.isUser()) {\n promise = appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n \n onSelect && onSelect(promise);\n };\n\n let title: LangPackKey, description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n appChatsManager.deleteChannel\n title = 'ChannelDeleteMenu';\n description = 'AreYouSureDeleteAndExitChannel';\n buttons = [{\n langKey: 'ChannelDeleteMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChannelForAll'\n }];\n } else {\n title = 'LeaveChannelMenu';\n description = 'ChannelLeaveAlertWithName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'LeaveChannel',\n isDanger: true,\n callback: callbackLeave\n }];\n }\n\n break;\n }\n\n /* case 'megagroup': {\n title = 'Leave Group?';\n description = `Are you sure you want to leave this group?`;\n buttons = [{\n text: 'LEAVE ' + peerTitleElement,\n isDanger: true,\n callback: callbackLeave\n }];\n\n break;\n } */\n\n case 'chat': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatWithUser';\n descriptionArgs = [peerTitleElement];\n\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteMessagesOptionAlso',\n textArgs: [\n new PeerTitle({peerId}).element\n ]\n }];\n\n break;\n }\n\n case 'saved': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatSavedMessages';\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n break;\n }\n\n case 'megagroup':\n case 'group': {\n if(/* actionType === 'delete' && */appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'DeleteMegaMenu';\n description = 'AreYouSureDeleteAndExit';\n buttons = [{\n langKey: 'DeleteMegaMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChat.DeleteGroupForAll'\n }];\n } else {\n title = 'LeaveMegaMenu';\n description = 'AreYouSureDeleteAndExitName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: (checkboxes) => callbackLeave(checkboxes, true)\n }];\n }\n\n break;\n }\n }\n\n new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport Button from \"../../button\";\r\nimport appChatsManager, { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport { Chat, ChatFull } from \"../../../layer\";\r\nimport AppChatTypeTab from \"./chatType\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppGroupPermissionsTab from \"./groupPermissions\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport PopupDeleteDialog from \"../../popups/deleteDialog\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\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 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\r\n this.container.classList.add('edit-peer-container', 'edit-group-container');\r\n this.setTitle('Edit');\r\n \r\n const chatFull = await appProfileManager.getChatFull(this.chatId, true);\r\n\r\n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(this.chatId);\r\n const isBroadcast = appChatsManager.isBroadcast(this.chatId);\r\n const isChannel = appChatsManager.isChannel(this.chatId);\r\n\r\n const chatUpdateListeners: (() => void)[] = [];\r\n const addChatUpdateListener = (callback: () => void) => {\r\n chatUpdateListeners.push(callback);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n chatUpdateListeners.forEach(callback => callback());\r\n }\r\n });\r\n\r\n const peerId = this.chatId.toPeerId(true);\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(appChatsManager.hasRights(this.chatId, 'change_type')) {\r\n const chatTypeRow = new Row({\r\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\r\n clickable: () => {\r\n const tab = new AppChatTypeTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.chatFull = chatFull;\r\n tab.open();\r\n\r\n this.listenerSetter.add(tab.eventListener)('destroy', setChatTypeSubtitle);\r\n },\r\n icon: 'lock'\r\n });\r\n\r\n const setChatTypeSubtitle = () => {\r\n chatTypeRow.subtitle.textContent = '';\r\n\r\n let key: LangPackKey;\r\n if(isBroadcast) {\r\n key = (chat as Chat.channel).username ? 'TypePublic' : 'TypePrivate';\r\n } else {\r\n key = (chat as Chat.channel).username ? 'TypePublicGroup' : 'TypePrivateGroup';\r\n }\r\n\r\n chatTypeRow.subtitle.append(i18n(key));\r\n };\r\n\r\n setChatTypeSubtitle();\r\n section.content.append(chatTypeRow.container);\r\n }\r\n\r\n if(appChatsManager.hasRights(this.chatId, 'change_permissions') && !isBroadcast) {\r\n const flags = [\r\n 'send_messages',\r\n 'send_media',\r\n 'send_stickers',\r\n 'send_polls',\r\n 'embed_links',\r\n 'invite_users',\r\n 'pin_messages',\r\n 'change_info'\r\n ] as ChatRights[];\r\n\r\n const permissionsRow = new Row({\r\n titleLangKey: 'ChannelPermissions',\r\n clickable: () => {\r\n const tab = new AppGroupPermissionsTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.open();\r\n },\r\n icon: 'permissions',\r\n });\r\n\r\n const setPermissionsLength = () => {\r\n permissionsRow.subtitle.innerHTML = flags.reduce((acc, f) => acc + +appChatsManager.hasRights(this.chatId, f, chat.default_banned_rights), 0) + '/' + flags.length;\r\n };\r\n\r\n setPermissionsLength(); \r\n section.content.append(permissionsRow.container);\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n setPermissionsLength();\r\n }\r\n });\r\n }\r\n\r\n /* const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n \r\n let promises: Promise[] = [];\r\n\r\n const id = this.chatId;\r\n if(this.chatNameInputField.isValidToChange()) {\r\n promises.push(appChatsManager.editTitle(id, this.chatNameInputField.value));\r\n }\r\n\r\n if(this.descriptionInputField.isValidToChange()) {\r\n promises.push(appChatsManager.editAbout(id, this.descriptionInputField.value));\r\n }\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then(inputFile => {\r\n return appChatsManager.editPhoto(id, inputFile);\r\n }));\r\n }\r\n \r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n \r\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\r\n const discussionRow = new Row({\r\n titleLangKey: 'PeerInfo.Discussion',\r\n subtitleLangKey: 'PeerInfo.Discussion.Add',\r\n clickable: true,\r\n icon: 'message'\r\n });\r\n\r\n section.content.append(discussionRow.container);\r\n }\r\n\r\n const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + chatFull.admins_count,\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n if(isBroadcast && appChatsManager.hasRights(this.chatId, 'change_info')) {\r\n const signMessagesCheckboxField = new CheckboxField({\r\n text: 'PeerInfo.SignMessages',\r\n checked: !!(chat as Chat.channel).pFlags.signatures,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\r\n const toggle = signMessagesCheckboxField.toggleDisability(true);\r\n appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n addChatUpdateListener(() => {\r\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\r\n });\r\n\r\n section.content.append(signMessagesCheckboxField.label);\r\n }\r\n }\r\n\r\n if(!isBroadcast) {\r\n const section = new SettingSection({\r\n\r\n });\r\n\r\n /* const membersRow = new Row({\r\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\r\n icon: 'newgroup',\r\n clickable: true\r\n });\r\n\r\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\r\n\r\n section.content.append(membersRow.container); */\r\n\r\n if(!isBroadcast && appChatsManager.hasRights(this.chatId, 'change_permissions')) {\r\n const showChatHistoryCheckboxField = new CheckboxField({\r\n text: 'ChatHistory',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\r\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\r\n appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const onChatUpdate = () => {\r\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\r\n };\r\n\r\n onChatUpdate();\r\n addChatUpdateListener(onChatUpdate);\r\n \r\n section.content.append(showChatHistoryCheckboxField.label);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(appChatsManager.hasRights(this.chatId, 'delete_chat')) {\r\n const section = new SettingSection({});\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!isChannel) {\r\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\r\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\r\n if(peerId === migrateFrom) {\r\n this.chatId = migrateTo.toChatId();\r\n this._init();\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected init() {\r\n return this._init();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport appNotificationsManager from \"../../../lib/appManagers/appNotificationsManager\";\r\nimport PeerTitle from \"../../peerTitle\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport { addCancelButton } from \"../../popups\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppEditContactTab extends SliderSuperTab {\r\n private nameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private editPeer: EditPeer;\r\n public peerId: PeerId;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\r\n const isNew = !appUsersManager.isContact(this.peerId.toUserId());\r\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FirstName',\r\n name: 'contact-name',\r\n maxLength: 70,\r\n required: true\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'LastName',\r\n name: 'contact-lastname',\r\n maxLength: 70\r\n });\r\n\r\n if(this.peerId) {\r\n const user = appUsersManager.getUser(this.peerId);\r\n\r\n if(isNew) {\r\n this.nameInputField.setDraftValue(user.first_name);\r\n this.lastNameInputField.setDraftValue(user.last_name);\r\n } else {\r\n this.nameInputField.setOriginalValue(user.first_name);\r\n this.lastNameInputField.setOriginalValue(user.last_name);\r\n }\r\n }\r\n \r\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\r\n inputFields.push(this.nameInputField, this.lastNameInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: this.peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter,\r\n doNotEditAvatar: true\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n if(this.peerId) {\r\n const div = document.createElement('div');\r\n div.classList.add('avatar-edit');\r\n div.append(this.editPeer.avatarElem);\r\n \r\n const notificationsCheckboxField = new CheckboxField({\r\n text: 'Notifications'\r\n });\r\n \r\n notificationsCheckboxField.input.addEventListener('change', (e) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n \r\n appMessagesManager.mutePeer(this.peerId);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('notify_settings', (update) => {\r\n if(update.peer._ !== 'notifyPeer') return;\r\n const peerId = appPeersManager.getPeerId(update.peer.peer);\r\n if(this.peerId === peerId) {\r\n const enabled = !appNotificationsManager.isMuted(update.notify_settings);\r\n if(enabled !== notificationsCheckboxField.checked) {\r\n notificationsCheckboxField.checked = enabled;\r\n }\r\n }\r\n });\r\n \r\n const profileNameDiv = document.createElement('div');\r\n profileNameDiv.classList.add('profile-name');\r\n profileNameDiv.append(new PeerTitle({\r\n peerId: this.peerId\r\n }).element);\r\n //profileNameDiv.innerHTML = 'Karen Stanford';\r\n \r\n const profileSubtitleDiv = document.createElement('div');\r\n profileSubtitleDiv.classList.add('profile-subtitle');\r\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\r\n\r\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\r\n\r\n if(!isNew) {\r\n const notificationsRow = new Row({\r\n checkboxField: notificationsCheckboxField\r\n });\r\n \r\n const enabled = !appNotificationsManager.isPeerLocalMuted(this.peerId, false);\r\n notificationsCheckboxField.checked = enabled;\r\n\r\n section.content.append(notificationsRow.container);\r\n } else {\r\n const user = appUsersManager.getUser(this.peerId);\r\n\r\n const phoneRow = new Row({\r\n icon: 'phone',\r\n titleLangKey: user.phone ? undefined : 'MobileHidden',\r\n title: user.phone ? appUsersManager.formatUserPhone(user.phone) : undefined,\r\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\r\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: this.peerId}).element]\r\n });\r\n\r\n section.content.append(phoneRow.container);\r\n }\r\n } else {\r\n section.content.append(inputWrapper);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n appUsersManager.addContact(this.peerId, this.nameInputField.value, this.lastNameInputField.value, appUsersManager.getUser(this.peerId).phone)\r\n .finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(!isNew) {\r\n const section = new SettingSection({\r\n \r\n });\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupPeer('popup-delete-contact', {\r\n peerId: this.peerId,\r\n titleLangKey: 'DeleteContact',\r\n descriptionLangKey: 'AreYouSureDeleteContact',\r\n buttons: addCancelButton([{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n\r\n appUsersManager.deleteContacts([this.peerId]).then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true\r\n }])\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport { putPreloader, setButtonLoader } from \"../../misc\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppAddMembersTab extends SliderSuperTab {\r\n private nextBtn: HTMLButtonElement;\r\n private selector: AppSelectPeers;\r\n private peerType: 'channel' | 'chat' | 'privacy';\r\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\r\n private skippable: boolean;\r\n\r\n protected init() {\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n this.content.append(this.nextBtn);\r\n this.scrollable.container.remove();\r\n \r\n this.nextBtn.addEventListener('click', () => {\r\n const peerIds = this.selector.getSelected().map(sel => sel.toPeerId());\r\n\r\n if(this.skippable) {\r\n this.takeOut(peerIds);\r\n this.close();\r\n } else {\r\n const promise = this.takeOut(peerIds);\r\n\r\n if(promise instanceof Promise) {\r\n this.attachToPromise(promise);\r\n } else if(promise === undefined) {\r\n this.close();\r\n }\r\n }\r\n });\r\n }\r\n\r\n public attachToPromise(promise: Promise) {\r\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\r\n\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n removeLoader();\r\n });\r\n }\r\n\r\n public open(options: {\r\n title: LangPackKey,\r\n placeholder: LangPackKey,\r\n type: AppAddMembersTab['peerType'], \r\n takeOut?: AppAddMembersTab['takeOut'],\r\n skippable: boolean,\r\n selectedPeerIds?: PeerId[]\r\n }) {\r\n const ret = super.open();\r\n\r\n this.setTitle(options.title);\r\n this.peerType = options.type;\r\n this.takeOut = options.takeOut;\r\n this.skippable = options.skippable;\r\n\r\n const isPrivacy = this.peerType === 'privacy';\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.content, \r\n onChange: this.skippable ? null : (length) => {\r\n this.nextBtn.classList.toggle('is-visible', !!length);\r\n }, \r\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\r\n placeholder: options.placeholder,\r\n exceptSelf: isPrivacy,\r\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined\r\n });\r\n\r\n if(options.selectedPeerIds) {\r\n this.selector.addInitial(options.selectedPeerIds);\r\n }\r\n\r\n this.nextBtn.classList.add('tgico-arrow_next');\r\n this.nextBtn.innerHTML = '';\r\n this.nextBtn.disabled = false;\r\n this.nextBtn.classList.toggle('is-visible', this.skippable);\r\n\r\n return ret;\r\n }\r\n}","import { IS_FIREFOX } from \"./userAgent\";\n\nconst PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default PARALLAX_SUPPORTED;","export default function generateVerifiedIcon() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n svg.setAttributeNS(null, 'width', '24');\n svg.setAttributeNS(null, 'height', '24');\n svg.classList.add('verified-icon');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-background');\n use.classList.add('verified-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-check');\n use2.classList.add('verified-check');\n\n svg.append(use, use2);\n\n return svg;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst getEvent = (e: TouchEvent | MouseEvent) => {\r\n return (e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent;\r\n};\r\n\r\nconst attachGlobalListenerTo = window;\r\n\r\nlet RESET_GLOBAL = false;\r\nrootScope.addEventListener('context_menu_toggle', (visible) => {\r\n RESET_GLOBAL = visible;\r\n});\r\n\r\nexport type SwipeHandlerOptions = {\r\n element: SwipeHandler['element'],\r\n onSwipe: SwipeHandler['onSwipe'],\r\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\r\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\r\n onReset?: SwipeHandler['onReset'],\r\n cursor?: SwipeHandler['cursor'],\r\n cancelEvent?: SwipeHandler['cancelEvent'],\r\n listenerOptions?: SwipeHandler['listenerOptions']\r\n};\r\n\r\nexport default class SwipeHandler {\r\n private element: HTMLElement;\r\n private onSwipe: (xDiff: number, yDiff: number, e: TouchEvent | MouseEvent) => boolean | void;\r\n private verifyTouchTarget: (evt: TouchEvent | MouseEvent) => boolean;\r\n private onFirstSwipe: () => void;\r\n private onReset: () => void;\r\n private cursor: 'grabbing' | 'move' = 'grabbing';\r\n private cancelEvent = true;\r\n private listenerOptions: boolean | AddEventListenerOptions = false;\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.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 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.element.style.cursor = '';\r\n }\r\n\r\n if(this.onReset && this.hadMove) {\r\n this.onReset();\r\n }\r\n\r\n this.xDown = this.yDown = null;\r\n this.hadMove = false;\r\n };\r\n\r\n handleStart = (_e: TouchEvent | MouseEvent) => {\r\n const e = getEvent(_e);\r\n if(this.verifyTouchTarget && !this.verifyTouchTarget(_e)) {\r\n return this.reset();\r\n }\r\n\r\n this.xDown = e.clientX;\r\n this.yDown = e.clientY;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.addEventListener('touchmove', this.handleMove, {passive: false, capture: true});\r\n } else {\r\n attachGlobalListenerTo.addEventListener('mousemove', this.handleMove, false);\r\n }\r\n };\r\n\r\n handleMove = (_e: TouchEvent | MouseEvent) => {\r\n if(this.xDown === null || this.yDown === null || RESET_GLOBAL) {\r\n this.reset();\r\n return;\r\n }\r\n\r\n if(this.cancelEvent) {\r\n cancelEvent(_e);\r\n }\r\n\r\n const e = getEvent(_e);\r\n const xUp = e.clientX;\r\n const yUp = e.clientY;\r\n\r\n const xDiff = this.xDown - xUp;\r\n const yDiff = this.yDown - yUp;\r\n\r\n if(!this.hadMove) {\r\n if(!xDiff && !yDiff) {\r\n return;\r\n }\r\n\r\n this.hadMove = true;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.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 PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport filterChatPhotosMessages from \"../helpers/filterChatPhotosMessages\";\nimport ListLoader from \"../helpers/listLoader\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { Message, ChatFull, MessageAction, Photo } from \"../layer\";\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\nimport appMessagesManager, { AppMessagesManager } from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { openAvatarViewer } from \"./avatar\";\nimport Scrollable from \"./scrollable\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { wrapPhoto } from \"./wrappers\";\n\nconst LOAD_NEAREST = 3;\n\nexport default class PeerProfileAvatars {\n private static BASE_CLASS = 'profile-avatars';\n private static SCALE = PARALLAX_SUPPORTED ? 2 : 1;\n private static TRANSLATE_TEMPLATE = 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> = new Map();\n\n constructor(public scrollable: Scrollable) {\n this.container = document.createElement('div');\n this.container.classList.add(PeerProfileAvatars.BASE_CLASS + '-container');\n\n this.avatars = document.createElement('div');\n this.avatars.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatars');\n\n this.gradient = document.createElement('div');\n this.gradient.classList.add(PeerProfileAvatars.BASE_CLASS + '-gradient');\n\n this.info = document.createElement('div');\n this.info.classList.add(PeerProfileAvatars.BASE_CLASS + '-info');\n\n this.tabs = document.createElement('div');\n this.tabs.classList.add(PeerProfileAvatars.BASE_CLASS + '-tabs');\n\n this.arrowPrevious = document.createElement('div');\n this.arrowPrevious.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', 'tgico-avatarprevious');\n\n /* const previousIcon = document.createElement('i');\n previousIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-previous');\n this.arrowBack.append(previousIcon); */\n \n this.arrowNext = document.createElement('div');\n this.arrowNext.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', PeerProfileAvatars.BASE_CLASS + '-arrow-next', 'tgico-avatarnext');\n\n /* const nextIcon = document.createElement('i');\n nextIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-next');\n this.arrowNext.append(nextIcon); */\n\n this.container.append(this.avatars, this.gradient, this.info, this.tabs, this.arrowPrevious, this.arrowNext);\n\n const checkScrollTop = () => {\n if(this.scrollable.scrollTop !== 0) {\n this.scrollable.scrollIntoViewNew(this.scrollable.container.firstElementChild as HTMLElement, 'start');\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 });\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 = 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\n public setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(!photo) {\n return;\n }\n\n const listLoader: PeerProfileAvatars['listLoader'] = this.listLoader = new ListLoader({\n loadCount: 50,\n loadMore: (anchor, older, loadCount) => {\n if(!older) return Promise.resolve({count: undefined, items: []});\n\n if(peerId.isUser()) {\n const maxId: Photo.photo['id'] = (anchor || listLoader.current) as any;\n return appPhotosManager.getUserPhotos(peerId, maxId, loadCount).then(value => {\n return {\n count: value.count,\n items: value.photos\n };\n });\n } else {\n const promises: [Promise, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(appProfileManager.getChatFull(peerId.toChatId()));\n }\n \n promises.push(appMessagesManager.getSearch({\n peerId,\n maxId: Number.MAX_SAFE_INTEGER,\n inputFilter: {\n _: 'inputMessagesFilterChatPhotos'\n },\n limit: loadCount,\n backLimit: 0\n }));\n\n return Promise.all(promises).then((result) => {\n const value = result.pop() as typeof result[1];\n\n filterChatPhotosMessages(value);\n\n if(!listLoader.current) {\n const chatFull = result[0];\n const message = value.history.findAndSplice(m => {\n return ((m as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n \n listLoader.current = message || appMessagesManager.generateFakeAvatarMessage(this.peerId, chatFull.chat_photo);\n }\n\n //console.log('avatars loaded:', value);\n return {\n count: value.count,\n items: value.history\n };\n });\n }\n },\n processItem: this.processItem,\n onJump: (item, older) => {\n const id = this.listLoader.index;\n //const nextId = Math.max(0, id);\n const x = 100 * PeerProfileAvatars.SCALE * id;\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', `-${x}%`);\n\n const activeTab = this.tabs.querySelector('.active');\n if(activeTab) activeTab.classList.remove('active');\n\n const tab = this.tabs.children[id] as HTMLElement;\n tab.classList.add('active');\n\n this.loadNearestToTarget(this.avatars.children[id]);\n }\n });\n\n if(photo._ === 'userProfilePhoto') {\n listLoader.current = photo.photo_id;\n }\n\n this.processItem(listLoader.current);\n\n // listLoader.loaded\n listLoader.load(true);\n }\n\n public addTab() {\n const tab = document.createElement('div');\n tab.classList.add(PeerProfileAvatars.BASE_CLASS + '-tab');\n this.tabs.append(tab);\n\n if(this.tabs.childElementCount === 1) {\n tab.classList.add('active');\n }\n\n this.container.classList.toggle('is-single', this.tabs.childElementCount <= 1);\n }\n\n public processItem = (photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container');\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ? \n appPhotosManager.getPhoto(photoId) : \n (photoId.action as MessageAction.messageActionChannelEditPhoto).photo as Photo.photo;\n }\n\n const img = new Image();\n img.classList.add('avatar-photo');\n img.draggable = false;\n\n const loadCallback = () => {\n if(photo) {\n const res = wrapPhoto({\n container: avatar,\n photo,\n size: appPhotosManager.choosePhotoSize(photo, 420, 420, false),\n withoutPreloader: true\n });\n \n [res.images.thumb, res.images.full].filter(Boolean).forEach(img => {\n img.classList.add('avatar-photo');\n });\n } else {\n const photo = appPeersManager.getPeerPhoto(this.peerId);\n appAvatarsManager.putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\n\n this.avatars.append(avatar);\n\n this.addTab();\n\n return photoId;\n };\n\n private loadNearestToTarget(target: Element) {\n const children = Array.from(target.parentElement.children);\n const idx = children.indexOf(target);\n const slice = children.slice(Math.max(0, idx - LOAD_NEAREST), Math.min(children.length, idx + LOAD_NEAREST));\n\n slice.forEach(target => {\n const callback = this.loadCallbacks.get(target);\n if(callback) {\n callback();\n this.loadCallbacks.delete(target);\n this.intersectionObserver.unobserve(target);\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport { copyTextToClipboard } from \"../helpers/clipboard\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { User } from \"../layer\";\nimport { Channel } from \"../lib/appManagers/appChatsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\nimport appNotificationsManager from \"../lib/appManagers/appNotificationsManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport I18n from \"../lib/langPack\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport rootScope from \"../lib/rootScope\";\nimport AvatarElement from \"./avatar\";\nimport CheckboxField from \"./checkboxField\";\nimport generateVerifiedIcon from \"./generateVerifiedIcon\";\nimport PeerProfileAvatars from \"./peerProfileAvatars\";\nimport PeerTitle from \"./peerTitle\";\nimport Row from \"./row\";\nimport Scrollable from \"./scrollable\";\nimport { SettingSection, generateDelimiter } from \"./sidebarLeft\";\nimport { toast } from \"./toast\";\n\nlet setText = (text: string, row: Row) => {\n //fastRaf(() => {\n row.title.innerHTML = text;\n row.container.style.display = '';\n //});\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n public 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 \n private cleaned: boolean;\n private setBioTimeout: number;\n private setPeerStatusInterval: number;\n\n private peerId: PeerId;\n private threadId: number;\n\n constructor(public scrollable: Scrollable) {\n if(!PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n }\n\n public init() {\n this.init = null;\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.setAttribute('dialog', '1');\n this.avatar.setAttribute('clickable', '');\n\n this.name = document.createElement('div');\n this.name.classList.add('profile-name');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('profile-subtitle');\n\n this.bio = new Row({\n title: ' ',\n subtitleLangKey: 'UserBio',\n icon: 'info',\n clickable: (e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n \n appProfileManager.getProfileByPeerId(this.peerId).then(full => {\n copyTextToClipboard(full.about);\n toast(I18n.format('BioCopied', true));\n });\n }\n });\n\n this.bio.title.classList.add('pre-wrap');\n\n this.username = new Row({\n title: ' ',\n subtitleLangKey: 'Username',\n icon: 'username',\n clickable: () => {\n const peer: Channel | User.user = appPeersManager.getPeer(this.peerId);\n copyTextToClipboard('@' + peer.username);\n toast(I18n.format('UsernameCopied', true));\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitleLangKey: 'Phone',\n icon: 'phone',\n clickable: () => {\n const peer: User = appUsersManager.getUser(this.peerId);\n copyTextToClipboard('+' + peer.phone);\n toast(I18n.format('PhoneCopied', true));\n }\n });\n\n this.notifications = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Notifications',\n icon: 'unmute'\n });\n \n this.section.content.append(this.phone.container, this.username.container, this.bio.container, this.notifications.container);\n\n this.element.append(this.section.container, generateDelimiter());\n\n this.notifications.checkboxField.input.addEventListener('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n //let checked = this.notificationsCheckbox.checked;\n appMessagesManager.mutePeer(this.peerId);\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = appNotificationsManager.isPeerLocalMuted(this.peerId, false);\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n rootScope.addEventListener('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n rootScope.addEventListener('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setBio(true);\n }\n });\n\n rootScope.addEventListener('user_update', (userId) => {\n if(this.peerId === userId) {\n this.setPeerStatus();\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n if(this.peerId === userId) {\n const user = appUsersManager.getUser(userId);\n if(!user.pFlags.self) {\n if(user.phone) {\n setText(appUsersManager.formatUserPhone(user.phone), this.phone);\n } else {\n this.phone.container.style.display = 'none';\n }\n }\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n }\n\n public setPeerStatus = (needClear = false) => {\n if(!this.peerId) return;\n\n const peerId = this.peerId;\n appImManager.setPeerStatus(this.peerId, this.subtitle, needClear, true, () => peerId === this.peerId);\n };\n\n public cleanupHTML() {\n this.bio.container.style.display = 'none';\n this.phone.container.style.display = 'none';\n this.username.container.style.display = 'none';\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n if(this.setBioTimeout) {\n window.clearTimeout(this.setBioTimeout);\n this.setBioTimeout = 0;\n }\n }\n\n public setAvatar() {\n if(this.peerId !== rootScope.myId) {\n const photo = appPeersManager.getPeerPhoto(this.peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable);\n this.avatars.setPeer(this.peerId);\n this.avatars.info.append(this.name, this.subtitle);\n \n this.avatar.remove();\n \n if(oldAvatars) oldAvatars.container.replaceWith(this.avatars.container);\n else this.element.prepend(this.avatars.container);\n\n if(PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('parallax');\n }\n\n return;\n }\n }\n\n if(PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.remove('parallax');\n }\n\n if(this.avatars) {\n this.avatars.container.remove();\n this.avatars = undefined;\n }\n\n this.avatar.setAttribute('peer', '' + this.peerId);\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n }\n\n public fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n \n const peerId = this.peerId;\n\n this.cleanupHTML();\n\n this.setAvatar();\n\n // username\n if(peerId !== rootScope.myId) {\n let username = appPeersManager.getPeerUsername(peerId);\n if(username) {\n setText(appPeersManager.getPeerUsername(peerId), this.username);\n }\n \n const muted = appNotificationsManager.isPeerLocalMuted(peerId, false);\n this.notifications.checkboxField.checked = !muted;\n } else {\n fastRaf(() => {\n this.notifications.container.style.display = 'none';\n });\n }\n \n //let membersLi = this.profileTabs.firstElementChild.children[0] as HTMLLIElement;\n if(peerId.isUser()) {\n //membersLi.style.display = 'none';\n\n let user = appUsersManager.getUser(peerId);\n if(user.phone && peerId !== rootScope.myId) {\n setText(appUsersManager.formatUserPhone(user.phone), this.phone);\n }\n }/* else {\n //membersLi.style.display = appPeersManager.isBroadcast(peerId) ? 'none' : '';\n } */\n\n this.setBio();\n\n replaceContent(this.name, new PeerTitle({\n peerId,\n dialog: true,\n }).element);\n\n const peer = appPeersManager.getPeer(peerId);\n if(peer?.pFlags?.verified) {\n this.name.append(generateVerifiedIcon());\n }\n\n this.setPeerStatus(true);\n }\n\n public setBio(override?: true) {\n if(this.setBioTimeout) {\n window.clearTimeout(this.setBioTimeout);\n this.setBioTimeout = 0;\n }\n\n const peerId = this.peerId;\n const threadId = this.threadId;\n\n if(!peerId) {\n return;\n }\n\n let promise: Promise;\n if(peerId.isUser()) {\n promise = appProfileManager.getProfile(peerId, override).then(userFull => {\n if(this.peerId !== peerId || this.threadId !== threadId) {\n //this.log.warn('peer changed');\n return false;\n }\n \n if(userFull.rAbout && peerId !== rootScope.myId) {\n setText(userFull.rAbout, this.bio);\n }\n \n //this.log('userFull', userFull);\n return true;\n });\n } else {\n promise = appProfileManager.getChatFull(peerId.toChatId(), override).then((chatFull) => {\n if(this.peerId !== peerId || this.threadId !== threadId) {\n //this.log.warn('peer changed');\n return false;\n }\n \n //this.log('chatInfo res 2:', chatFull);\n \n if(chatFull.about) {\n setText(RichTextProcessor.wrapRichText(chatFull.about), this.bio);\n }\n\n return true;\n });\n }\n\n promise.then((canSetNext) => {\n if(canSetNext) {\n this.setBioTimeout = window.setTimeout(() => this.setBio(true), 60e3);\n }\n });\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n if(this.init) {\n this.init();\n }\n\n this.peerId = peerId;\n this.threadId = threadId;\n \n this.cleaned = true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport rootScope from \"../../../lib/rootScope\";\nimport AppSearchSuper, { SearchSuperType } from \"../../appSearchSuper.\";\nimport SidebarSlider, { SliderSuperTab } from \"../../slider\";\nimport { TransitionSlider } from \"../../transition\";\nimport AppEditChatTab from \"./editChat\";\nimport PeerTitle from \"../../peerTitle\";\nimport AppEditContactTab from \"./editContact\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport Button from \"../../button\";\nimport ButtonIcon from \"../../buttonIcon\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { toastNew } from \"../../toast\";\nimport AppAddMembersTab from \"../../sidebarLeft/tabs/addMembers\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerCheckboxOptions } from \"../../popups/peer\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PeerProfile from \"../../peerProfile\";\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n\n private historiesStorage: {\n [peerId: PeerId]: Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n }>\n } = {};\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n constructor(slider: SidebarSlider) {\n super(slider, false);\n }\n\n public init() {\n //const perf = performance.now();\n\n this.container.classList.add('shared-media-container', 'profile-container');\n\n // * header\n const newCloseBtn = Button('btn-icon sidebar-close-button', {noRipple: true});\n this.closeBtn.replaceWith(newCloseBtn);\n this.closeBtn = newCloseBtn;\n\n const animatedCloseIcon = document.createElement('div');\n animatedCloseIcon.classList.add('animated-close-icon');\n newCloseBtn.append(animatedCloseIcon);\n\n const transitionContainer = document.createElement('div');\n transitionContainer.className = 'transition slide-fade';\n \n const transitionFirstItem = document.createElement('div');\n transitionFirstItem.classList.add('transition-item');\n\n this.title.append(i18n('Profile'));\n this.editBtn = ButtonIcon('edit');\n //const moreBtn = ButtonIcon('more');\n\n transitionFirstItem.append(this.title, this.editBtn/* , moreBtn */);\n\n const transitionLastItem = document.createElement('div');\n transitionLastItem.classList.add('transition-item');\n\n const secondTitle: HTMLElement = this.title.cloneNode() as any;\n secondTitle.append(i18n('PeerInfo.SharedMedia'));\n\n transitionLastItem.append(secondTitle);\n\n transitionContainer.append(transitionFirstItem, transitionLastItem);\n\n this.header.append(transitionContainer);\n\n // * body\n\n this.profile = new PeerProfile(this.scrollable);\n this.profile.init();\n \n this.scrollable.append(this.profile.element);\n\n const HEADER_HEIGHT = 56;\n this.scrollable.onAdditionalScroll = () => {\n const rect = this.searchSuper.nav.getBoundingClientRect(); \n if(!rect.width) return;\n\n const top = rect.top - 1;\n const isSharedMedia = top <= HEADER_HEIGHT;\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(this.scrollable.container.firstElementChild as HTMLElement, 'start');\n transition(0);\n animatedCloseIcon.classList.remove('state-back');\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n });\n\n attachClickEvent(this.editBtn, (e) => {\n let tab: AppEditChatTab | AppEditContactTab;\n if(this.peerId.isAnyChat()) {\n tab = new AppEditChatTab(this.slider);\n } else {\n tab = new AppEditContactTab(this.slider);\n }\n\n if(tab) {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = this.peerId.toChatId();\n } else {\n tab.peerId = this.peerId;\n }\n \n tab.open();\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n rootScope.addEventListener('history_multiappend', (msgIdsByPeer) => {\n for(const peerId in msgIdsByPeer) {\n this.renderNewMessages(peerId.toPeerId(), Array.from(msgIdsByPeer[peerId]));\n }\n });\n \n rootScope.addEventListener('history_delete', ({peerId, msgs}) => {\n this.deleteDeletedMessages(peerId, Array.from(msgs));\n });\n\n // Calls when message successfully sent and we have an id\n rootScope.addEventListener('message_sent', ({message}) => {\n this.renderNewMessages(message.peerId, [message.mid]);\n });\n\n //this.container.prepend(this.closeBtn.parentElement);\n\n this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'PeerMedia.Members',\n type: 'members'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable: this.scrollable,\n onChangeTab: (mediaTab) => {\n let timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n }\n });\n\n this.profile.element.append(this.searchSuper.container);\n\n const btnAddMembers = ButtonCorner({icon: 'addmember_filled'});\n this.content.append(btnAddMembers);\n\n btnAddMembers.addEventListener('click', () => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = appChatsManager.isChannel(id);\n\n const showConfirmation = (peerIds: PeerId[], callback: (checked: PopupPeerButtonCallbackCheckboxes) => void) => {\n let titleLangKey: LangPackKey, titleLangArgs: any[],\n descriptionLangKey: LangPackKey, descriptionLangArgs: any[],\n checkboxes: PopupPeerCheckboxOptions[];\n\n if(peerIds.length > 1) {\n titleLangKey = 'AddMembersAlertTitle';\n titleLangArgs = [i18n('Members', [peerIds.length])];\n descriptionLangKey = 'AddMembersAlertCountText';\n descriptionLangArgs = peerIds.map(peerId => {\n const b = document.createElement('b');\n b.append(new PeerTitle({peerId}).element);\n return b;\n });\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddMembersForwardMessages',\n checked: true\n }];\n }\n } else {\n titleLangKey = 'AddOneMemberAlertTitle';\n descriptionLangKey = 'AddMembersAlertNamesText';\n const b = document.createElement('b');\n b.append(new PeerTitle({\n peerId: peerIds[0]\n }).element);\n descriptionLangArgs = [b];\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddOneMemberForwardMessages',\n textArgs: [new PeerTitle({peerId: peerIds[0]}).element],\n checked: true\n }];\n }\n }\n\n descriptionLangArgs.push(new PeerTitle({\n peerId\n }).element);\n\n new PopupPeer('popup-add-members', {\n peerId,\n titleLangKey,\n descriptionLangKey,\n descriptionLangArgs,\n buttons: [{\n langKey: 'Add',\n callback\n }],\n checkboxes\n }).show();\n };\n\n const onError = (err: any) => {\n if(err.type === 'USER_PRIVACY_RESTRICTED') {\n toastNew({langPackKey: 'InviteToGroupError'});\n }\n };\n \n if(isChannel) {\n const tab = new AppAddMembersTab(this.slider);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = appChatsManager.inviteToChannel(id, peerIds);\n promise.catch(onError);\n tab.attachToPromise(promise);\n });\n\n return false;\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n } else {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'Search',\n onSelect: (peerId) => {\n setTimeout(() => {\n showConfirmation([peerId], (checked) => {\n appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n },\n });\n }\n });\n\n //console.log('construct shared media time:', performance.now() - perf);\n }\n\n public renderNewMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!this.historiesStorage[peerId]) return;\n \n mids = mids.slice().reverse(); // ! because it will be ascend sorted array\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const filtered = this.searchSuper.filterMessagesByType(mids.map(mid => appMessagesManager.getMessageByPeer(peerId, mid)), inputFilter);\n if(filtered.length) {\n const history = this.historiesStorage[peerId][inputFilter];\n if(history) {\n history.unshift(...filtered.map(message => ({mid: message.mid, peerId: message.peerId})));\n }\n\n if(this.peerId === peerId && this.searchSuper.usedFromHistory[inputFilter] !== -1) {\n this.searchSuper.usedFromHistory[inputFilter] += filtered.length;\n this.searchSuper.performSearchResult(filtered, mediaTab, false);\n }\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!this.historiesStorage[peerId]) return;\n\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = this.historiesStorage[peerId][inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex(m => m.mid === mid);\n if(idx !== -1) {\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`div[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`) as HTMLElement;\n if(div) {\n if(this.searchSuper.selection.isSelecting) {\n this.searchSuper.selection.toggleByElement(div);\n }\n\n div.remove();\n }\n \n if(this.searchSuper.usedFromHistory[inputFilter] >= (idx + 1)) {\n this.searchSuper.usedFromHistory[inputFilter]--;\n }\n }\n\n break;\n }\n }\n }\n\n this.scrollable.onScroll();\n }\n\n public cleanupHTML() {\n // const perf = performance.now();\n this.profile.cleanupHTML();\n \n this.editBtn.classList.add('hide');\n\n this.searchSuper.cleanupHTML(true);\n\n this.container.classList.toggle('can-add-members', this.searchSuper.canViewMembers() && appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users'));\n\n // console.log('cleanupHTML shared media time:', performance.now() - perf);\n }\n\n public setLoadMutex(promise: Promise) {\n this.searchSuper.loadMutex = promise;\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return false;\n\n this.peerId = peerId;\n this.threadId = threadId;\n this.peerChanged = true;\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.searchSuper.setQuery({\n peerId, \n //threadId, \n historyStorage: this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {})\n });\n\n this.profile.setPeer(peerId, threadId);\n \n return true;\n }\n\n public fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n\n this.cleanupHTML();\n\n this.profile.fillProfileElements();\n\n this.toggleEditBtn();\n }\n\n private toggleEditBtn() {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && appUsersManager.isContact(this.peerId.toUserId());\n } else {\n show = appChatsManager.hasRights(this.peerId.toChatId(), 'change_info');\n }\n\n this.editBtn.classList.toggle('hide', !show);\n }\n\n public loadSidebarMedia(single: boolean, justLoad = false) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppSharedMediaTab = AppSharedMediaTab);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport SidebarSlider from \"../slider\";\r\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\r\nimport AppSharedMediaTab from \"./tabs/sharedMedia\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\r\n\r\nexport class AppSidebarRight extends SidebarSlider {\r\n public sharedMediaTab: AppSharedMediaTab;\r\n private isColumnProportionSet = false;\r\n\r\n constructor() {\r\n super({\r\n sidebarEl: document.getElementById('column-right') as HTMLElement,\r\n canHideFirst: true,\r\n navigationType: 'right'\r\n });\r\n\r\n mediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\r\n this.toggleSidebar(false);\r\n }\r\n });\r\n\r\n mediaSizes.addEventListener('resize', () => {\r\n this.setColumnProportion();\r\n });\r\n\r\n this.sharedMediaTab = new AppSharedMediaTab(this);\r\n }\r\n\r\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\r\n if(!this.historyTabIds.length) {\r\n this.toggleSidebar(false, animate);\r\n }\r\n\r\n super.onCloseTab(id, animate, isNavigation);\r\n }\r\n\r\n /* public selectTab(id: number) {\r\n const res = super.selectTab(id);\r\n\r\n if(id !== -1) {\r\n this.toggleSidebar(true);\r\n }\r\n\r\n return res;\r\n } */\r\n\r\n private setColumnProportion() {\r\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\r\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\r\n }\r\n\r\n public toggleSidebar(enable?: boolean, animate?: boolean) {\r\n /////this.log('sidebarEl', this.sidebarEl, enable, isElementInViewport(this.sidebarEl));\r\n\r\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\r\n let willChange: boolean;\r\n if(enable !== undefined) {\r\n if(enable) {\r\n if(!active) {\r\n willChange = true;\r\n }\r\n } else if(active) {\r\n willChange = true;\r\n }\r\n } else {\r\n willChange = true;\r\n }\r\n\r\n if(!willChange) return Promise.resolve();\r\n\r\n if(!active && !this.historyTabIds.length) {\r\n this.sharedMediaTab.open();\r\n //this.selectTab(this.sharedMediaTab);\r\n }\r\n\r\n if(!this.isColumnProportionSet) {\r\n this.setColumnProportion();\r\n this.isColumnProportionSet = true;\r\n }\r\n\r\n const animationPromise = appImManager.selectTab(active ? 1 : 2, animate);\r\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\r\n return animationPromise;\r\n\r\n /* return new Promise((resolve, reject) => {\r\n const hidden: {element: HTMLDivElement, height: number}[] = [];\r\n const observer = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const bubble = entry.target as HTMLDivElement;\r\n if(!entry.isIntersecting) {\r\n hidden.push({element: bubble, height: bubble.scrollHeight});\r\n }\r\n }\r\n \r\n for(const item of hidden) {\r\n item.element.style.minHeight = item.height + 'px';\r\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\r\n item.element.style.width = '1px';\r\n }\r\n \r\n //console.log('hidden', hidden);\r\n observer.disconnect();\r\n \r\n set();\r\n \r\n setTimeout(() => {\r\n for(const item of hidden) {\r\n item.element.style.minHeight = '';\r\n item.element.style.width = '';\r\n (item.element.firstElementChild as HTMLElement).style.display = '';\r\n }\r\n\r\n resolve();\r\n }, 200);\r\n });\r\n \r\n const length = Object.keys(appImManager.bubbles).length;\r\n if(length) {\r\n for(const i in appImManager.bubbles) {\r\n observer.observe(appImManager.bubbles[i]);\r\n }\r\n } else {\r\n set();\r\n setTimeout(resolve, 200);\r\n }\r\n }); */\r\n }\r\n}\r\n\r\nconst appSidebarRight = new AppSidebarRight();\r\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\r\nexport default appSidebarRight;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport appSidebarRight from \"..\";\r\nimport appPollsManager from \"../../../lib/appManagers/appPollsManager\";\r\nimport { roundPercents } from \"../../poll\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { ripple } from \"../../ripple\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\n\r\nexport default class AppPollResultsTab extends SliderSuperTab {\r\n private resultsDiv: HTMLElement;\r\n\r\n protected init() {\r\n this.container.id = 'poll-results-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.resultsDiv = document.createElement('div');\r\n this.resultsDiv.classList.add('poll-results');\r\n this.scrollable.append(this.resultsDiv);\r\n }\r\n\r\n public open(message: any) {\r\n const ret = super.open();\r\n const poll = appPollsManager.getPoll(message.media.poll.id);\r\n\r\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\r\n\r\n const title = document.createElement('h3');\r\n title.innerHTML = poll.poll.rQuestion;\r\n\r\n const percents = poll.results.results.map(v => v.voters / poll.results.total_voters * 100);\r\n roundPercents(percents);\r\n\r\n const fragment = document.createDocumentFragment();\r\n poll.results.results.forEach((result, idx) => {\r\n if(!result.voters) return;\r\n\r\n const hr = document.createElement('hr');\r\n\r\n const answer = poll.poll.answers[idx];\r\n\r\n // Head\r\n const answerEl = document.createElement('div');\r\n answerEl.classList.add('poll-results-answer');\r\n\r\n const answerTitle = document.createElement('div');\r\n answerTitle.innerHTML = RichTextProcessor.wrapEmojiText(answer.text);\r\n\r\n const answerPercents = document.createElement('div');\r\n answerPercents.innerText = Math.round(percents[idx]) + '%';\r\n\r\n answerEl.append(answerTitle, answerPercents);\r\n\r\n // Humans\r\n const list = appDialogsManager.createChatList();\r\n list.classList.add('poll-results-voters');\r\n\r\n appDialogsManager.setListClickListener(list, () => {\r\n appSidebarRight.onCloseBtnClick();\r\n }, undefined, true);\r\n\r\n list.style.minHeight = Math.min(result.voters, 4) * 50 + 'px';\r\n\r\n fragment.append(hr, answerEl, list);\r\n\r\n let offset: string, limit = 4, loading = false, left = result.voters - 4;\r\n const load = () => {\r\n if(loading) return;\r\n loading = true;\r\n\r\n appPollsManager.getVotes(message, answer.option, offset, limit).then(votesList => {\r\n votesList.votes.forEach(vote => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: vote.user_id.toPeerId(false),\r\n container: list,\r\n drawStatus: false,\r\n rippleEnabled: false, \r\n meAsSaved: false,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n });\r\n\r\n if(offset) {\r\n left -= votesList.votes.length;\r\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n }\r\n \r\n offset = votesList.next_offset;\r\n limit = 20;\r\n\r\n if(!left || !votesList.votes.length) {\r\n showMore.remove();\r\n }\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n\r\n load();\r\n\r\n if(left <= 0) return;\r\n\r\n const showMore = document.createElement('div');\r\n showMore.classList.add('poll-results-more', 'show-more', 'rp-overflow');\r\n showMore.addEventListener('click', load);\r\n ripple(showMore);\r\n const down = document.createElement('div');\r\n down.classList.add('tgico-down');\r\n showMore.append(down, i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n\r\n fragment.append(showMore);\r\n });\r\n\r\n this.resultsDiv.append(title, fragment);\r\n\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n /* appPollsManager.getVotes(mid).then(votes => {\r\n console.log('gOt VotEs', votes);\r\n }); */\r\n });\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport appImManager from \"../lib/appManagers/appImManager\";\r\nimport appPollsManager from \"../lib/appManagers/appPollsManager\";\r\nimport serverTimeManager from \"../lib/mtproto/serverTimeManager\";\r\nimport { RichTextProcessor } from \"../lib/richtextprocessor\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { ripple } from \"./ripple\";\r\nimport appSidebarRight from \"./sidebarRight\";\r\nimport AppPollResultsTab from \"./sidebarRight/tabs/pollResults\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport windowSize from \"../helpers/windowSize\";\r\nimport { Poll, PollResults } from \"../layer\";\r\n\r\nlet lineTotalLength = 0;\r\nconst tailLength = 9;\r\nconst times = 10;\r\nconst fullTime = 340;\r\nconst oneTime = fullTime / times;\r\n\r\nexport const roundPercents = (percents: number[]) => {\r\n //console.log('roundPercents before percents:', percents);\r\n\r\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\r\n if(sum > 100) {\r\n const diff = sum - 100;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, minRemainder = 1;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder >= 0.5 && remainder < minRemainder) {\r\n minRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] -= minRemainder;\r\n }\r\n } else if(sum < 100) {\r\n const diff = 100 - sum;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, maxRemainder = 0;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder < 0.5 && remainder > maxRemainder) {\r\n maxRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] += 1 - maxRemainder;\r\n }\r\n }\r\n\r\n //console.log('roundPercents after percents:', percents);\r\n};\r\n\r\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\r\nrootScope.on('poll_update', (e) => {\r\n const {poll, results} = e as {poll: Poll, results: PollResults};\r\n\r\n //console.log('poll_update', poll, results);\r\n for(const connected of connectedPolls) {\r\n if(connected.id === poll.id) {\r\n const pollElement = connected.element;\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n }\r\n }\r\n}); */\r\n\r\nrootScope.addEventListener('poll_update', ({poll, results}) => {\r\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\r\n pollElements.forEach(pollElement => {\r\n //console.log('poll_update', poll, results);\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n });\r\n});\r\n\r\nrootScope.addEventListener('peer_changed', () => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n});\r\n\r\nmediaSizes.addEventListener('resize', () => {\r\n PollElement.setMaxLength();\r\n PollElement.resizePolls();\r\n});\r\n\r\nmediaSizes.addEventListener('changeScreen', () => {\r\n PollElement.setMaxLength();\r\n});\r\n\r\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\r\n element.classList.remove('active');\r\n\r\n clearTimeout(timeout);\r\n setTimeout(() => {\r\n onHide();\r\n element.remove();\r\n\r\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\r\n prevQuizHint = prevQuizHintOnHide = null;\r\n prevQuizHintTimeout = 0;\r\n }\r\n }, 200);\r\n};\r\n\r\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\r\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n\r\n const element = document.createElement('div');\r\n element.classList.add('quiz-hint');\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('container', 'tgico');\r\n\r\n const textEl = document.createElement('div');\r\n textEl.classList.add('text');\r\n\r\n container.append(textEl);\r\n element.append(container);\r\n\r\n textEl.innerHTML = RichTextProcessor.wrapRichText(solution, {entities: solution_entities});\r\n appImManager.chat.bubbles.bubblesContainer.append(element);\r\n\r\n void element.offsetLeft; // reflow\r\n element.classList.add('active');\r\n\r\n prevQuizHint = element;\r\n prevQuizHintOnHide = onHide;\r\n prevQuizHintTimeout = window.setTimeout(() => {\r\n hideQuizHint(element, onHide, prevQuizHintTimeout);\r\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\r\n};\r\n\r\nexport default class PollElement extends HTMLElement {\r\n public static MAX_OFFSET = -46.5;\r\n public static MAX_LENGTH = 0;\r\n public svgLines: SVGSVGElement[];\r\n private numberDivs: HTMLDivElement[];\r\n private answerDivs: HTMLDivElement[];\r\n private descDiv: HTMLElement;\r\n private typeDiv: HTMLElement;\r\n private avatarsDiv: HTMLElement;\r\n private viewResults: HTMLElement;\r\n private votersCountDiv: HTMLDivElement;\r\n\r\n // private maxLength: number;\r\n // private maxLengths: number[];\r\n private maxPercents: number[];\r\n\r\n public isClosed = false;\r\n private isQuiz = false;\r\n private isRetracted = false;\r\n private isPublic = false;\r\n private isMultiple = false;\r\n private chosenIndexes: number[] = [];\r\n private percents: number[];\r\n\r\n public message: any;\r\n\r\n private quizInterval: number;\r\n private quizTimer: SVGSVGElement;\r\n\r\n private sendVoteBtn: HTMLElement;\r\n private chosingIndexes: number[] = [];\r\n\r\n private sendVotePromise: Promise;\r\n private sentVote = false;\r\n\r\n constructor() {\r\n super();\r\n // элемент создан\r\n }\r\n\r\n public static setMaxLength() {\r\n const width = windowSize.windowW <= 360 ? windowSize.windowW - 120 : mediaSizes.active.poll.width;\r\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\r\n }\r\n\r\n public static resizePolls() {\r\n if(!this.MAX_LENGTH) return;\r\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\r\n pollElements.forEach(pollElement => {\r\n pollElement.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n pollElement.setLineProgress(idx, 1);\r\n });\r\n });\r\n }\r\n\r\n public render() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n if(!lineTotalLength) {\r\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\r\n //console.log('line total length:', lineTotalLength);\r\n PollElement.setMaxLength();\r\n }\r\n\r\n const pollId = this.message.media.poll.id;\r\n const {poll, results} = appPollsManager.getPoll(pollId);\r\n\r\n /* const timestamp = Date.now() / 1000 | 0;\r\n if(timestamp < this.message.date) { */\r\n if(this.message.pFlags.is_scheduled) {\r\n this.classList.add('disable-hover');\r\n }\r\n\r\n //console.log('pollElement poll:', poll, results);\r\n\r\n let descKey: LangPackKey;\r\n if(poll.pFlags) {\r\n this.isPublic = !!poll.pFlags.public_voters;\r\n this.isQuiz = !!poll.pFlags.quiz;\r\n this.isClosed = !!poll.pFlags.closed;\r\n this.isMultiple = !!poll.pFlags.multiple_choice;\r\n\r\n if(this.isClosed) {\r\n descKey = 'Chat.Poll.Type.Closed';\r\n this.classList.add('is-closed');\r\n } else if(this.isQuiz) {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\r\n } else {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\r\n }\r\n }\r\n\r\n this.classList.toggle('is-multiple', this.isMultiple);\r\n\r\n const multipleSelect = this.isMultiple ? '' : '';\r\n const votes = poll.answers.map((answer, idx) => {\r\n return `\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n ${multipleSelect}\r\n
\r\n
\r\n
${RichTextProcessor.wrapEmojiText(answer.text)}
\r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n }).join('');\r\n\r\n this.innerHTML = `\r\n
${poll.rQuestion}
\r\n
\r\n
\r\n
\r\n
\r\n ${votes}`;\r\n\r\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\r\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\r\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\r\n\r\n if(descKey) {\r\n this.typeDiv.append(i18n(descKey));\r\n }\r\n\r\n if(this.isQuiz) {\r\n this.classList.add('is-quiz');\r\n\r\n if(poll.close_period && poll.close_date) {\r\n const timeLeftDiv = document.createElement('div');\r\n timeLeftDiv.classList.add('poll-time');\r\n this.descDiv.append(timeLeftDiv);\r\n\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n //svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\r\n svg.classList.add('poll-quiz-timer');\r\n\r\n this.quizTimer = svg;\r\n\r\n const strokeWidth = 2;\r\n const radius = 7;\r\n const circumference = 2 * Math.PI * radius;\r\n\r\n const circle = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n circle.classList.add('poll-quiz-timer-circle');\r\n circle.setAttributeNS(null, 'cx', '16');\r\n circle.setAttributeNS(null, 'cy', '16');\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\r\n\r\n svg.append(circle);\r\n this.descDiv.append(svg);\r\n \r\n const period = poll.close_period * 1000;\r\n const closeTime = (poll.close_date - serverTimeManager.serverTimeOffset) * 1000;\r\n\r\n //console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\r\n\r\n // let time = Date.now();\r\n // let percents = (closeTime - time) / period;\r\n\r\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\r\n\r\n // // @ts-ignore\r\n // circle.style.strokeDashoffset = circumference + percents * circumference;\r\n // circle.style.strokeDasharray = ${circumference} ${circumference};\r\n\r\n this.quizInterval = window.setInterval(() => {\r\n const time = Date.now();\r\n const percents = (closeTime - time) / period;\r\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\r\n timeLeftDiv.innerHTML = String(timeLeft).toHHMMSS();\r\n \r\n if (timeLeft <= 5) {\r\n timeLeftDiv.style.color = '#ee545c';\r\n circle.style.stroke = '#ee545c';\r\n }\r\n //timeLeftDiv.style.visibility = 'visible';\r\n\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference + percents * circumference;\r\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\r\n\r\n if(time >= closeTime) {\r\n clearInterval(this.quizInterval);\r\n timeLeftDiv.innerHTML = '';\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference;\r\n this.quizInterval = 0;\r\n\r\n setTimeout(() => {\r\n // нужно запросить апдейт чтобы опрос обновился\r\n appPollsManager.getResults(this.message);\r\n }, 3e3);\r\n }\r\n }, 1e3);\r\n }\r\n }\r\n \r\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\r\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\r\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\r\n\r\n const footerDiv = document.createElement('div');\r\n footerDiv.classList.add('poll-footer');\r\n\r\n this.viewResults = document.createElement('div');\r\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\r\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\r\n\r\n this.votersCountDiv = document.createElement('div');\r\n this.votersCountDiv.className = 'poll-votes-count';\r\n\r\n footerDiv.append(this.viewResults, this.votersCountDiv);\r\n this.append(footerDiv);\r\n\r\n this.viewResults.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n\r\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\r\n new AppPollResultsTab(appSidebarRight).open(this.message);\r\n }\r\n });\r\n ripple(this.viewResults);\r\n\r\n if(this.isMultiple) {\r\n this.sendVoteBtn = document.createElement('div');\r\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\r\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\r\n ripple(this.sendVoteBtn);\r\n\r\n if(!poll.chosenIndexes.length) {\r\n this.votersCountDiv.classList.add('hide');\r\n }\r\n\r\n attachClickEvent(this.sendVoteBtn, (e) => {\r\n cancelEvent(e);\r\n /* const indexes = this.answerDivs.filter(el => el.classList.contains('is-chosing')).map(el => +el.dataset.index);\r\n if(indexes.length) {\r\n \r\n } */\r\n if(this.chosingIndexes.length) {\r\n this.sendVotes(this.chosingIndexes).then(() => {\r\n this.chosingIndexes.length = 0;\r\n this.answerDivs.forEach(el => {\r\n el.classList.remove('is-chosing');\r\n });\r\n });\r\n }\r\n });\r\n\r\n footerDiv.append(this.sendVoteBtn);\r\n }\r\n\r\n // const width = this.getBoundingClientRect().width;\r\n // const width = mediaSizes.active.poll.width;\r\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\r\n\r\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\r\n if(!canVote || this.isPublic) {\r\n this.performResults(results, poll.chosenIndexes, false);\r\n }\r\n\r\n if(canVote) {\r\n this.setVotersCount(results);\r\n attachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n\r\n initQuizHint(results: PollResults) {\r\n if(results.solution && results.solution_entities) {\r\n const toggleHint = document.createElement('div');\r\n toggleHint.classList.add('tgico-tip', 'poll-hint');\r\n this.descDiv.append(toggleHint);\r\n\r\n //let active = false;\r\n attachClickEvent(toggleHint, (e) => {\r\n cancelEvent(e);\r\n\r\n //active = true;\r\n toggleHint.classList.add('active');\r\n setQuizHint(results.solution, results.solution_entities, () => {\r\n //active = false;\r\n toggleHint.classList.remove('active');\r\n });\r\n });\r\n\r\n if(this.sentVote) {\r\n const correctResult = results.results.find(r => r.pFlags.correct);\r\n if(correctResult && !correctResult.pFlags.chosen) {\r\n toggleHint.click();\r\n }\r\n }\r\n }\r\n }\r\n\r\n clickHandler(e: Event) {\r\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n \r\n cancelEvent(e);\r\n const answerIndex = +target.dataset.index;\r\n if(this.isMultiple) {\r\n target.classList.toggle('is-chosing');\r\n\r\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\r\n if(foundIndex !== -1) {\r\n this.chosingIndexes.splice(foundIndex, 1);\r\n } else {\r\n this.chosingIndexes.push(answerIndex);\r\n }\r\n } else {\r\n this.sendVotes([answerIndex]);\r\n }\r\n \r\n /* target.classList.add('is-voting');\r\n setTimeout(() => { // simulate\r\n this.setResults([100, 0], answerIndex);\r\n target.classList.remove('is-voting');\r\n }, 1000); */\r\n }\r\n\r\n sendVotes(indexes: number[]) {\r\n if(this.sendVotePromise) return this.sendVotePromise;\r\n\r\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\r\n targets.forEach(target => {\r\n target.classList.add('is-voting');\r\n });\r\n \r\n this.classList.add('disable-hover');\r\n this.sentVote = true;\r\n return this.sendVotePromise = appPollsManager.sendVote(this.message, indexes).then(() => {\r\n targets.forEach(target => {\r\n target.classList.remove('is-voting');\r\n });\r\n\r\n this.classList.remove('disable-hover');\r\n }).catch(() => {\r\n this.sentVote = false;\r\n }).finally(() => {\r\n this.sendVotePromise = null;\r\n });\r\n }\r\n\r\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\r\n });\r\n\r\n if(this.initQuizHint) {\r\n this.initQuizHint(results);\r\n this.initQuizHint = null;\r\n }\r\n\r\n if(this.quizInterval) {\r\n clearInterval(this.quizInterval);\r\n this.quizInterval = 0;\r\n }\r\n\r\n if(this.quizTimer?.parentElement) {\r\n this.quizTimer.remove();\r\n }\r\n\r\n const timeEl = this.descDiv.querySelector('.poll-time');\r\n if(timeEl) {\r\n timeEl.remove();\r\n }\r\n }\r\n\r\n if(this.isClosed) {\r\n this.classList.add('is-closed');\r\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\r\n }\r\n\r\n // set chosen\r\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\r\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\r\n this.chosenIndexes = chosenIndexes.slice();\r\n\r\n if(this.isRetracted) {\r\n attachClickEvent(this, this.clickHandler);\r\n } else {\r\n detachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n \r\n // is need update\r\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\r\n const percents = results.results.map(v => results.total_voters ? v.voters / results.total_voters * 100 : 0);\r\n\r\n this.classList.toggle('no-transition', !animate);\r\n if(animate) {\r\n SetTransition(this, '', !this.isRetracted, 340);\r\n }\r\n\r\n fastRaf(() => {\r\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\r\n this.percents = percents;\r\n this.isRetracted = false;\r\n });\r\n }\r\n \r\n this.setVotersCount(results);\r\n\r\n if(this.isPublic) {\r\n if(!this.isMultiple) {\r\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\r\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\r\n }\r\n\r\n let html = '';\r\n /**\r\n * MACOS, ANDROID - без реверса\r\n * WINDOWS DESKTOP - реверс\r\n * все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!\r\n */\r\n results.recent_voters/* .slice().reverse() */.forEach((userId, idx) => {\r\n const style = idx === 0 ? '' : `style=\"transform: translateX(-${idx * 3}px);\"`;\r\n html += ``;\r\n });\r\n this.avatarsDiv.innerHTML = html;\r\n }\r\n\r\n if(this.isMultiple) {\r\n const isVoted = !!this.chosenIndexes.length;\r\n\r\n const hideSendVoteBtn = this.isClosed || isVoted;\r\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\r\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\r\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\r\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\r\n }\r\n }\r\n\r\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\r\n this.svgLines.forEach(svg => svg.style.display = '');\r\n\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\r\n });\r\n\r\n const maxValue = Math.max(...percents);\r\n // this.maxLengths = percents.map(p => p / maxValue * this.maxLength);\r\n this.maxPercents = percents.map(p => p / maxValue);\r\n\r\n // line\r\n if(this.isRetracted) {\r\n this.svgLines.forEach((svg, idx) => {\r\n this.setLineProgress(idx, -1);\r\n });\r\n } else {\r\n const cb = () => {\r\n this.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n this.setLineProgress(idx, 1);\r\n });\r\n };\r\n \r\n animate ? fastRaf(cb) : cb();\r\n }\r\n\r\n percents = percents.slice();\r\n roundPercents(percents);\r\n let getPercentValue: (percents: number, index: number) => number;\r\n const iterate = (i: number) => {\r\n percents.forEach((percents, idx) => {\r\n const value = getPercentValue(percents, i);\r\n this.numberDivs[idx].innerText = value + '%';\r\n });\r\n };\r\n // numbers\r\n if(this.isRetracted) {\r\n getPercentValue = (percents, index) => Math.round(percents / times * index);\r\n\r\n if(animate) {\r\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * k);\r\n }\r\n } else {\r\n iterate(0);\r\n }\r\n } else {\r\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\r\n\r\n if(animate) {\r\n for(let i = 0; i < times; ++i) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * i);\r\n }\r\n } else {\r\n iterate(times - 1);\r\n }\r\n }\r\n\r\n if(this.isRetracted) {\r\n if(animate) {\r\n this.classList.add('is-retracting');\r\n }\r\n\r\n this.classList.remove('is-voted');\r\n const cb = () => {\r\n this.svgLines.forEach(svg => svg.style.display = 'none');\r\n };\r\n\r\n if(animate) {\r\n setTimeout(() => {\r\n this.classList.remove('is-retracting');\r\n cb();\r\n }, fullTime);\r\n } else {\r\n cb();\r\n }\r\n } else {\r\n this.classList.add('is-voted');\r\n }\r\n }\r\n\r\n setVotersCount(results: PollResults) {\r\n const votersCount = results.total_voters || 0;\r\n let key: LangPackKey, args = [votersCount];\r\n if(this.isClosed) {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\r\n } else {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\r\n }\r\n \r\n replaceContent(this.votersCountDiv, i18n(key, args));\r\n }\r\n\r\n setLineProgress(index: number, multiplier: number) {\r\n const svg = this.svgLines[index];\r\n\r\n if(multiplier === -1) {\r\n svg.style.strokeDasharray = '';\r\n svg.style.strokeDashoffset = '';\r\n } else {\r\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\r\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\r\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\r\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\r\n }\r\n }\r\n\r\n // у элемента могут быть ещё другие методы и свойства\r\n}\r\n\r\ncustomElements.define(\"poll-element\", PollElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered } from '../../layer';\nimport { Modify } from '../../types';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport appDocsManager, { MyDocument } from './appDocsManager';\nimport AppStorage from '../storage';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { forEachReverse } from '../../helpers/array';\nimport DATABASE_STATE from '../../config/databases/state';\nimport { readBlobAsText } from '../../helpers/blob';\nimport lottieLoader from '../lottieLoader';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport { getEmojiToneIndex } from '../../vendor/emoji';\nimport RichTextProcessor from '../richtextprocessor';\n\nconst CACHE_TIME = 3600e3;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport class AppStickersManager {\n private storage = new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise} = {};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise} = {};\n\n private greetingStickers: Document.document[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n \n constructor() {\n this.getAnimatedEmojiStickerSet();\n\n rootScope.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n this.saveStickerSet(update.stickerset, update.stickerset.set.id);\n rootScope.dispatchEvent('stickers_installed', update.stickerset.set);\n }\n });\n\n this.getGreetingStickersTimeout = window.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then(docs => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n \n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n appDocsManager.downloadDoc(this.greetingStickers[0]); // preload next sticker\n\n return doc;\n });\n }\n\n public saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n public async getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise {\n const id = set.id;\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n return this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n const cachedSet = await this.storage.get(id);\n if(cachedSet && cachedSet.documents?.length && ((Date.now() - cachedSet.refreshTime) < CACHE_TIME || params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n delete this.getStickerSetPromises[id];\n return;\n }\n }\n\n try {\n const stickerSet = await apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n \n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n \n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n \n delete this.getStickerSetPromises[id];\n });\n }\n\n public getAnimatedEmojiStickerSet() {\n return this.getStickerSet({id: 'emoji'}, {saveById: true});\n }\n\n public async getRecentStickers(): Promise> {\n const res = await apiManager.invokeApiHashable('messages.getRecentStickers') as MessagesRecentStickers.messagesRecentStickers;\n\n this.saveStickers(res.stickers);\n\n return res;\n }\n\n public getAnimatedEmojiSticker(emoji: string) {\n const stickerSet = this.storage.getFromCache('emoji');\n if(!stickerSet || !stickerSet.documents) return undefined;\n\n emoji = emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n const pack = stickerSet.packs.find(p => p.emoticon === emoji);\n return pack ? appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n const doc = this.getAnimatedEmojiSticker(emoji);\n if(doc) {\n return appDocsManager.downloadDoc(doc)\n .then(readBlobAsText)\n .then(async(json) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: json,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height\n }, 'none', toneIndex);\n\n animation.addEventListener('firstFrame', () => {\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\n animation.remove();\n }, {once: true});\n });\n }\n });\n }\n \n public saveStickerSet(res: Omit, id: DocId) {\n //console.log('stickers save set', res);w\n\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[]\n };\n \n let stickerSet = this.storage.getFromCache(id);\n if(stickerSet) {\n Object.assign(stickerSet, newSet);\n } else {\n stickerSet = this.storage.setToCache(id, newSet);\n }\n\n this.saveStickers(res.documents);\n \n //console.log('stickers wrote', this.stickerSets);\n const needSave = stickerSet.set.installed_date || id === 'emoji';\n stickerSet.refreshTime = Date.now();\n this.storage.set({[id]: stickerSet}, !needSave);\n }\n\n public getStickerSetThumbDownloadOptions(stickerSet: StickerSet.stickerSet) {\n const thumb = stickerSet.thumbs.find(thumb => thumb._ === 'photoSize') as PhotoSize.photoSize;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: InputFileLocation.inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n thumb_version: stickerSet.thumb_version\n };\n\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\n }\n\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\n const thumb = stickerSet.thumb;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n volume_id: thumb.location.volume_id,\n local_id: thumb.location.local_id\n };\n\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\n return url;\n\n //return promise;\n } */\n\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\n if(set.id === 'emoji') {\n return {\n _: 'inputStickerSetAnimatedEmoji'\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await apiManager.invokeApiHashable('messages.getFeaturedStickers') as MessagesFeaturedStickers.messagesFeaturedStickers;\n \n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res.sets;\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n if(set.installed_date) {\n const res = await apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await apiManager.invokeApiHashable('messages.searchStickerSets', {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n }) as MessagesFoundStickerSets.messagesFoundStickerSets;\n\n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(let id in cache) {\n const {set} = cache[id];\n\n if(set.title.toLowerCase().includes(query.toLowerCase()) && !res.sets.find(c => c.set.id === set.id)) {\n foundSaved.push({_: 'stickerSetCovered', set, cover: null});\n }\n }\n\n return res.sets.concat(foundSaved);\n }\n\n public getAllStickers() {\n return apiManager.invokeApiHashable('messages.getAllStickers');\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then(allStickers => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map(set => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = RichTextProcessor.fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n apiManager.invokeApiHashable('messages.getStickers', {\n emoticon\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map(sticker => appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n //console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = RichTextProcessor.fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = RichTextProcessor.parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter(doc => !doc.animated) */;\n\n return stickers;\n });\n }\n\n public pushRecentSticker(doc: MyDocument) {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then(stickers => {\n const _doc = stickers.findAndSplice(_doc => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n}\n\nconst appStickersManager = new AppStickersManager();\nMOUNT_CLASS_TO.appStickersManager = appStickersManager;\nexport default appStickersManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from './chat/chat';\r\nimport { getEmojiToneIndex } from '../vendor/emoji';\r\nimport { readBlobAsText } from '../helpers/blob';\r\nimport { deferredPromise } from '../helpers/cancellablePromise';\r\nimport { formatFullSentTime } from '../helpers/date';\r\nimport mediaSizes, { ScreenSize } from '../helpers/mediaSizes';\r\nimport { formatBytes } from '../helpers/number';\r\nimport { IS_SAFARI } from '../environment/userAgent';\r\nimport { Message, PhotoSize, StickerSet } from '../layer';\r\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\r\nimport appMessagesManager from '../lib/appManagers/appMessagesManager';\r\nimport appPhotosManager, { MyPhoto } from '../lib/appManagers/appPhotosManager';\r\nimport LottieLoader from '../lib/lottieLoader';\r\nimport webpWorkerController from '../lib/webp/webpWorkerController';\r\nimport animationIntersector from './animationIntersector';\r\nimport appMediaPlaybackController, { MediaSearchContext } from './appMediaPlaybackController';\r\nimport AudioElement, { findMediaTargets } from './audio';\r\nimport ReplyContainer from './chat/replyContainer';\r\nimport { Layouter, RectPart } from './groupedLayout';\r\nimport LazyLoadQueue from './lazyLoadQueue';\r\nimport PollElement from './poll';\r\nimport ProgressivePreloader from './preloader';\r\nimport './middleEllipsis';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport appImManager from '../lib/appManagers/appImManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { onMediaLoad } from '../helpers/files';\r\nimport { animateSingle } from '../helpers/animation';\r\nimport renderImageFromUrl from '../helpers/dom/renderImageFromUrl';\r\nimport sequentialDom from '../helpers/sequentialDom';\r\nimport { fastRaf } from '../helpers/schedulers';\r\nimport appDownloadManager, { DownloadBlob, ThumbCache } from '../lib/appManagers/appDownloadManager';\r\nimport appStickersManager from '../lib/appManagers/appStickersManager';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent, simulateClickEvent } from '../helpers/dom/clickEvent';\r\nimport isInDOM from '../helpers/dom/isInDOM';\r\nimport lottieLoader from '../lib/lottieLoader';\r\nimport { clearBadCharsAndTrim } from '../helpers/cleanSearchText';\r\nimport blur from '../helpers/blur';\r\nimport IS_WEBP_SUPPORTED from '../environment/webpSupport';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\r\nimport { MiddleEllipsisElement } from './middleEllipsis';\r\nimport { joinElementsWith } from '../lib/langPack';\r\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\r\nimport { NULL_PEER_ID } from '../lib/mtproto/mtproto_config';\r\n\r\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\r\n\r\nlet roundVideoCircumference = 0;\r\nmediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\r\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\r\n const width = mediaSizes.active.round.width;\r\n const halfSize = width / 2;\r\n const radius = halfSize - 7;\r\n roundVideoCircumference = 2 * Math.PI * radius;\r\n elements.forEach(element => {\r\n element.setAttributeNS(null, 'width', '' + width);\r\n element.setAttributeNS(null, 'height', '' + width);\r\n\r\n const circle = element.firstElementChild as SVGCircleElement;\r\n circle.setAttributeNS(null, 'cx', '' + halfSize);\r\n circle.setAttributeNS(null, 'cy', '' + halfSize);\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n\r\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\r\n });\r\n }\r\n});\r\n\r\nexport function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, withoutPreloader, loadPromises, noPlayButton, noAutoDownload, size, searchContext}: {\r\n doc: MyDocument, \r\n container?: HTMLElement, \r\n message?: Message.message, \r\n boxWidth?: number, \r\n boxHeight?: number, \r\n withTail?: boolean, \r\n isOut?: boolean,\r\n middleware?: () => boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n noInfo?: true,\r\n noPlayButton?: boolean,\r\n group?: string,\r\n onlyPreview?: boolean,\r\n withoutPreloader?: boolean,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n size?: PhotoSize,\r\n searchContext?: MediaSearchContext,\r\n}) {\r\n const isAlbumItem = !(boxWidth && boxHeight);\r\n const canAutoplay = (doc.type !== 'video' || (doc.size <= MAX_VIDEO_AUTOPLAY_SIZE && !isAlbumItem)) \r\n && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos);\r\n let spanTime: HTMLElement, spanPlay: HTMLElement;\r\n\r\n if(!noInfo) {\r\n spanTime = document.createElement('span');\r\n spanTime.classList.add('video-time');\r\n container.append(spanTime);\r\n \r\n let needPlayButton = false;\r\n if(doc.type !== 'gif') {\r\n spanTime.innerText = (doc.duration + '').toHHMMSS(false);\r\n\r\n if(!noPlayButton && doc.type !== 'round') {\r\n if(canAutoplay && !noAutoDownload) {\r\n spanTime.classList.add('tgico', 'can-autoplay');\r\n } else {\r\n needPlayButton = true;\r\n }\r\n }\r\n } else {\r\n spanTime.innerText = 'GIF';\r\n\r\n if(!canAutoplay && !noPlayButton) {\r\n needPlayButton = true;\r\n noAutoDownload = undefined;\r\n }\r\n }\r\n\r\n if(needPlayButton) {\r\n spanPlay = document.createElement('span');\r\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\r\n container.append(spanPlay);\r\n }\r\n }\r\n\r\n let res: {\r\n thumb?: typeof photoRes,\r\n loadPromise: Promise\r\n } = {} as any;\r\n\r\n if(doc.mime_type === 'image/gif') {\r\n const photoRes = wrapPhoto({\r\n photo: doc, \r\n message, \r\n container, \r\n boxWidth, \r\n boxHeight, \r\n withTail, \r\n isOut, \r\n lazyLoadQueue, \r\n middleware,\r\n withoutPreloader,\r\n loadPromises,\r\n noAutoDownload,\r\n size\r\n });\r\n\r\n res.thumb = photoRes;\r\n res.loadPromise = photoRes.loadPromises.full;\r\n return res;\r\n }\r\n\r\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\r\n if(video.parentElement) {\r\n video.remove();\r\n } */\r\n\r\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\r\n\r\n const video = document.createElement('video');\r\n video.classList.add('media-video');\r\n video.setAttribute('playsinline', 'true');\r\n video.muted = true;\r\n if(doc.type === 'round') {\r\n const divRound = document.createElement('div');\r\n divRound.classList.add('media-round', 'z-depth-1');\r\n divRound.dataset.mid = '' + message.mid;\r\n divRound.dataset.peerId = '' + message.peerId;\r\n (divRound as any).message = message;\r\n\r\n const size = mediaSizes.active.round;\r\n const halfSize = size.width / 2;\r\n const strokeWidth = 3.5;\r\n const radius = halfSize - (strokeWidth * 2);\r\n divRound.innerHTML = `\r\n \r\n `;\r\n\r\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\r\n if(!roundVideoCircumference) {\r\n roundVideoCircumference = 2 * Math.PI * radius;\r\n }\r\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\r\n \r\n spanTime.classList.add('tgico');\r\n\r\n const isUnread = message.pFlags.media_unread;\r\n if(isUnread) {\r\n divRound.classList.add('is-unread');\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\r\n\r\n divRound.prepend(canvas, spanTime);\r\n divRound.append(video);\r\n container.append(divRound);\r\n\r\n const ctx = canvas.getContext('2d');\r\n /* ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\r\n ctx.clip(); */\r\n\r\n const onLoad = () => {\r\n const message: Message.message = (divRound as any).message;\r\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\r\n const clear = () => {\r\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\r\n if(isInDOM(globalVideo)) {\r\n return;\r\n }\r\n \r\n globalVideo.removeEventListener('play', onPlay);\r\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\r\n globalVideo.removeEventListener('pause', onPaused);\r\n globalVideo.removeEventListener('ended', onEnded);\r\n });\r\n };\r\n \r\n const onFrame = () => {\r\n ctx.drawImage(globalVideo, 0, 0);\r\n \r\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + offset;\r\n \r\n return !globalVideo.paused;\r\n };\r\n\r\n const onTimeUpdate = () => {\r\n if(!globalVideo.duration) {\r\n return;\r\n }\r\n \r\n if(!isInDOM(globalVideo)) {\r\n clear();\r\n return;\r\n }\r\n\r\n if(globalVideo.paused) {\r\n onFrame();\r\n }\r\n \r\n spanTime.innerText = (globalVideo.duration - globalVideo.currentTime + '').toHHMMSS(false);\r\n };\r\n\r\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\r\n \r\n const onPlay = () => {\r\n video.classList.add('hide');\r\n divRound.classList.remove('is-paused');\r\n animateSingle(onFrame, canvas);\r\n \r\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\r\n preloader.onClick();\r\n }\r\n };\r\n \r\n const onPaused = () => {\r\n if(!isInDOM(globalVideo)) {\r\n clear();\r\n return;\r\n }\r\n \r\n divRound.classList.add('is-paused');\r\n };\r\n \r\n const onEnded = () => {\r\n video.classList.remove('hide');\r\n divRound.classList.add('is-paused');\r\n \r\n video.currentTime = 0;\r\n spanTime.innerText = ('' + globalVideo.duration).toHHMMSS(false);\r\n \r\n if(globalVideo.currentTime) {\r\n globalVideo.currentTime = 0;\r\n }\r\n };\r\n \r\n globalVideo.addEventListener('play', onPlay);\r\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\r\n globalVideo.addEventListener('pause', onPaused);\r\n globalVideo.addEventListener('ended', onEnded);\r\n \r\n attachClickEvent(canvas, (e) => {\r\n cancelEvent(e);\r\n \r\n // ! костыль\r\n if(preloader && !preloader.detached) {\r\n preloader.onClick();\r\n }\r\n \r\n // ! can't use it here. on Safari iOS video won't start.\r\n /* if(globalVideo.readyState < 2) {\r\n return;\r\n } */\r\n \r\n if(globalVideo.paused) {\r\n const hadSearchContext = !!searchContext;\r\n if(appMediaPlaybackController.setSearchContext(searchContext || {\r\n peerId: NULL_PEER_ID, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n useSearch: false\r\n })) {\r\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound/* , searchContext.useSearch */);\r\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\r\n }\r\n \r\n globalVideo.play();\r\n } else {\r\n globalVideo.pause();\r\n }\r\n });\r\n \r\n if(globalVideo.paused) {\r\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\r\n onFrame();\r\n onTimeUpdate();\r\n video.classList.add('hide');\r\n } else {\r\n onPaused();\r\n }\r\n } else {\r\n onPlay();\r\n }\r\n };\r\n\r\n if(message.pFlags.is_outgoing) {\r\n (divRound as any).onLoad = onLoad;\r\n divRound.dataset.isOutgoing = '1';\r\n } else {\r\n onLoad();\r\n }\r\n } else {\r\n video.autoplay = true; // для safari\r\n }\r\n\r\n let photoRes: ReturnType;\r\n if(message) {\r\n photoRes = wrapPhoto({\r\n photo: doc, \r\n message, \r\n container, \r\n boxWidth, \r\n boxHeight, \r\n withTail, \r\n isOut, \r\n lazyLoadQueue, \r\n middleware,\r\n withoutPreloader: true,\r\n loadPromises,\r\n noAutoDownload,\r\n size\r\n });\r\n\r\n res.thumb = photoRes;\r\n\r\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\r\n res.loadPromise = photoRes.loadPromises.full;\r\n return res;\r\n }\r\n\r\n if(withTail) {\r\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\r\n video.width = +foreignObject.getAttributeNS(null, 'width');\r\n video.height = +foreignObject.getAttributeNS(null, 'height');\r\n foreignObject.append(video);\r\n }\r\n } else { // * gifs masonry\r\n const gotThumb = appDocsManager.getThumb(doc, false);\r\n if(gotThumb) {\r\n gotThumb.promise.then(() => {\r\n video.poster = gotThumb.cacheContext.url;\r\n });\r\n }\r\n }\r\n\r\n if(!video.parentElement && container) {\r\n (photoRes?.aspecter || container).append(video);\r\n }\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n\r\n const isUpload = !!(message?.media as any)?.preloader;\r\n if(isUpload) { // means upload\r\n preloader = (message.media as any).preloader as ProgressivePreloader;\r\n preloader.attach(container, false);\r\n noAutoDownload = undefined;\r\n } else if(!cacheContext.downloaded && !doc.supportsStreaming) {\r\n preloader = new ProgressivePreloader({\r\n attachMethod: 'prepend'\r\n });\r\n } else if(doc.supportsStreaming) {\r\n preloader = new ProgressivePreloader({\r\n cancelable: false,\r\n attachMethod: 'prepend'\r\n });\r\n }\r\n\r\n const renderDeferred = deferredPromise();\r\n video.addEventListener('error', (e) => {\r\n if(video.error.code !== 4) {\r\n console.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\r\n }\r\n \r\n if(preloader && !isUpload) {\r\n preloader.detach();\r\n }\r\n\r\n if(!renderDeferred.isFulfilled) {\r\n renderDeferred.resolve();\r\n }\r\n }, {once: true});\r\n\r\n onMediaLoad(video).then(() => {\r\n if(group) {\r\n animationIntersector.addAnimation(video, group);\r\n }\r\n\r\n if(preloader && !isUpload) {\r\n preloader.detach();\r\n }\r\n\r\n renderDeferred.resolve();\r\n });\r\n\r\n if(doc.type === 'video') {\r\n video.addEventListener('timeupdate', () => {\r\n spanTime.innerText = (video.duration - video.currentTime + '').toHHMMSS(false);\r\n });\r\n }\r\n\r\n video.muted = true;\r\n video.loop = true;\r\n //video.play();\r\n video.autoplay = true;\r\n\r\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\r\n const load = () => {\r\n if(preloader && noAutoDownload && !withoutPreloader) {\r\n preloader.construct();\r\n preloader.setManual();\r\n }\r\n\r\n let loadPromise: Promise = Promise.resolve();\r\n if(preloader && !isUpload) {\r\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\r\n const promise = loadPromise = appDocsManager.downloadDoc(doc, lazyLoadQueue?.queueId, noAutoDownload);\r\n preloader.attach(container, false, promise);\r\n } else if(doc.supportsStreaming) {\r\n if(noAutoDownload) {\r\n loadPromise = Promise.reject();\r\n } else if(!cacheContext.downloaded) { // * check for uploading video\r\n preloader.attach(container, false, null);\r\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\r\n preloader.detach();\r\n }, {once: true});\r\n }\r\n }\r\n }\r\n\r\n if(!noAutoDownload && loadPhotoThumbFunc) {\r\n loadPhotoThumbFunc();\r\n loadPhotoThumbFunc = null;\r\n }\r\n\r\n noAutoDownload = undefined;\r\n\r\n loadPromise.then(() => {\r\n if(middleware && !middleware()) {\r\n renderDeferred.resolve();\r\n return;\r\n }\r\n\r\n if(doc.type === 'round') {\r\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\r\n }\r\n\r\n renderImageFromUrl(video, cacheContext.url);\r\n }, () => {});\r\n\r\n return {download: loadPromise, render: renderDeferred};\r\n };\r\n\r\n if(preloader && !isUpload) {\r\n preloader.setDownloadFunction(load);\r\n }\r\n\r\n /* if(doc.size >= 20e6 && !doc.downloaded) {\r\n let downloadDiv = document.createElement('div');\r\n downloadDiv.classList.add('download');\r\n\r\n let span = document.createElement('span');\r\n span.classList.add('btn-circle', 'tgico-download');\r\n downloadDiv.append(span);\r\n\r\n downloadDiv.addEventListener('click', () => {\r\n downloadDiv.remove();\r\n loadVideo();\r\n });\r\n\r\n container.prepend(downloadDiv);\r\n\r\n return;\r\n } */\r\n\r\n if(doc.type === 'gif' && !canAutoplay) {\r\n attachClickEvent(container, (e) => {\r\n cancelEvent(e);\r\n spanPlay.remove();\r\n load();\r\n }, {capture: true, once: true});\r\n } else {\r\n res.loadPromise = !lazyLoadQueue ? load().render : (lazyLoadQueue.push({div: container, load: () => load().render}), Promise.resolve());\r\n }\r\n\r\n return res;\r\n}\r\n\r\nrootScope.addEventListener('download_start', (docId) => {\r\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n if(element.querySelector('.preloader-container.manual')) {\r\n simulateClickEvent(element);\r\n }\r\n });\r\n});\r\n\r\nexport function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, noAutoDownload, lazyLoadQueue}: {\r\n message: any, \r\n withTime?: boolean,\r\n fontWeight?: number,\r\n voiceAsMusic?: boolean,\r\n showSender?: boolean,\r\n searchContext?: MediaSearchContext,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n lazyLoadQueue?: LazyLoadQueue\r\n}): HTMLElement {\r\n if(!fontWeight) fontWeight = 500;\r\n\r\n const doc = (message.media.document || message.media.webpage.document) as MyDocument;\r\n const uploading = message.pFlags.is_outgoing && message.media?.preloader;\r\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\r\n const audioElement = new AudioElement();\r\n audioElement.withTime = withTime;\r\n audioElement.message = message;\r\n audioElement.noAutoDownload = noAutoDownload;\r\n audioElement.lazyLoadQueue = lazyLoadQueue;\r\n audioElement.loadPromises = loadPromises;\r\n \r\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\r\n if(searchContext) audioElement.searchContext = searchContext;\r\n if(showSender) audioElement.showSender = showSender;\r\n if(uploading) audioElement.preloader = message.media.preloader;\r\n\r\n audioElement.dataset.fontWeight = '' + fontWeight;\r\n audioElement.render();\r\n return audioElement;\r\n }\r\n\r\n let extSplitted = doc.file_name ? doc.file_name.split('.') : '';\r\n let ext = '';\r\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ? \r\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) : \r\n 'file';\r\n\r\n let docDiv = document.createElement('div');\r\n docDiv.classList.add('document', `ext-${ext}`);\r\n docDiv.dataset.docId = '' + doc.id;\r\n\r\n const icoDiv = document.createElement('div');\r\n icoDiv.classList.add('document-ico');\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\r\n docDiv.classList.add('document-with-thumb');\r\n\r\n let imgs: HTMLImageElement[] = [];\r\n if(message.pFlags.is_outgoing) {\r\n icoDiv.innerHTML = ``;\r\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\r\n } else {\r\n const wrapped = wrapPhoto({\r\n photo: doc, \r\n message: null, \r\n container: icoDiv, \r\n boxWidth: 54, \r\n boxHeight: 54,\r\n loadPromises,\r\n withoutPreloader: true,\r\n lazyLoadQueue,\r\n size: appPhotosManager.choosePhotoSize(doc, 54, 54, true)\r\n });\r\n icoDiv.style.width = icoDiv.style.height = '';\r\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\r\n if(wrapped.images.full) imgs.push(wrapped.images.full);\r\n }\r\n\r\n imgs.forEach(img => img.classList.add('document-thumb'));\r\n } else {\r\n icoDiv.innerText = ext;\r\n }\r\n\r\n //let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\r\n let fileName = doc.fileName || 'Unknown.file';\r\n const descriptionEl = document.createElement('div');\r\n descriptionEl.classList.add('document-description');\r\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [formatBytes(doc.size)];\r\n \r\n if(withTime) {\r\n descriptionParts.push(formatFullSentTime(message.date));\r\n }\r\n\r\n if(showSender) {\r\n descriptionParts.push(appMessagesManager.wrapSenderToPeer(message));\r\n }\r\n\r\n docDiv.innerHTML = `\r\n ${cacheContext.downloaded && !uploading ? '' : `
`}\r\n
\r\n
\r\n `;\r\n\r\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\r\n const middleEllipsisEl = new MiddleEllipsisElement();\r\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\r\n middleEllipsisEl.innerHTML = fileName;\r\n\r\n nameDiv.append(middleEllipsisEl);\r\n\r\n if(showSender) {\r\n nameDiv.append(appMessagesManager.wrapSentTime(message));\r\n }\r\n\r\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\r\n sizeDiv.append(...joinElementsWith(descriptionParts, ' · '));\r\n\r\n docDiv.prepend(icoDiv);\r\n\r\n if(!uploading && message.pFlags.is_outgoing) {\r\n return docDiv;\r\n }\r\n\r\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\r\n const onLoad = () => {\r\n if(downloadDiv) {\r\n downloadDiv.classList.add('downloaded');\r\n const _downloadDiv = downloadDiv;\r\n setTimeout(() => {\r\n _downloadDiv.remove();\r\n }, 200);\r\n downloadDiv = null;\r\n }\r\n\r\n if(preloader) {\r\n preloader = null;\r\n }\r\n };\r\n\r\n const load = (e: Event) => {\r\n const save = !e || e.isTrusted;\r\n const doc = appDocsManager.getDoc(docDiv.dataset.docId);\r\n let download: DownloadBlob;\r\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\r\n if(!save) {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n } else if(doc.type === 'pdf') {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n download.then(() => {\r\n setTimeout(() => { // wait for preloader animation end\r\n const url = appDownloadManager.getCacheContext(doc).url;\r\n window.open(url);\r\n }, rootScope.settings.animationsEnabled ? 250 : 0);\r\n });\r\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n } else {\r\n download = appDocsManager.saveDocFile(doc, queueId);\r\n }\r\n\r\n if(downloadDiv) {\r\n download.then(onLoad);\r\n preloader.attach(downloadDiv, true, download);\r\n }\r\n\r\n return {download};\r\n };\r\n\r\n if(appDocsManager.downloading.has(doc.id)) {\r\n downloadDiv = docDiv.querySelector('.document-download');\r\n preloader = new ProgressivePreloader();\r\n preloader.attach(downloadDiv, false, appDocsManager.downloading.get(doc.id));\r\n } else if(!cacheContext.downloaded || uploading) {\r\n downloadDiv = docDiv.querySelector('.document-download');\r\n preloader = message.media.preloader as ProgressivePreloader;\r\n\r\n if(!preloader) {\r\n preloader = new ProgressivePreloader();\r\n\r\n preloader.construct();\r\n preloader.setManual();\r\n preloader.attach(downloadDiv);\r\n preloader.setDownloadFunction(load);\r\n } else {\r\n preloader.attach(downloadDiv);\r\n message.media.promise.then(onLoad);\r\n }\r\n }\r\n\r\n attachClickEvent(docDiv, (e) => {\r\n if(preloader) {\r\n preloader.onClick(e);\r\n } else {\r\n load(e);\r\n }\r\n });\r\n \r\n return docDiv;\r\n}\r\n\r\n/* function wrapMediaWithTail(photo: MyPhoto | MyDocument, message: {mid: number, message: string}, container: HTMLElement, boxWidth: number, boxHeight: number, isOut: boolean) {\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n svg.classList.add('bubble__media-container', isOut ? 'is-out' : 'is-in');\r\n \r\n const foreignObject = document.createElementNS(\"http://www.w3.org/2000/svg\", 'foreignObject');\r\n\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, true);\r\n if(gotThumb) {\r\n foreignObject.append(gotThumb.image);\r\n }\r\n appPhotosManager.setAttachmentSize(photo, foreignObject, boxWidth, boxHeight);\r\n \r\n const width = +foreignObject.getAttributeNS(null, 'width');\r\n const height = +foreignObject.getAttributeNS(null, 'height');\r\n\r\n svg.setAttributeNS(null, 'width', '' + width);\r\n svg.setAttributeNS(null, 'height', '' + height);\r\n\r\n svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);\r\n svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n\r\n const clipId = 'clip' + message.mid + '_' + nextRandomInt(9999);\r\n svg.dataset.clipId = clipId;\r\n \r\n const defs = document.createElementNS(\"http://www.w3.org/2000/svg\", 'defs');\r\n let clipPathHTML: string = '';\r\n \r\n if(message.message) {\r\n //clipPathHTML += ``;\r\n } else {\r\n if(isOut) {\r\n clipPathHTML += `\r\n \r\n \r\n `;\r\n } else {\r\n clipPathHTML += `\r\n \r\n \r\n `;\r\n }\r\n }\r\n\r\n defs.innerHTML = `${clipPathHTML}`;\r\n \r\n container.style.width = parseInt(container.style.width) - 9 + 'px';\r\n container.classList.add('with-tail');\r\n\r\n svg.append(defs, foreignObject);\r\n container.append(svg);\r\n\r\n let img = foreignObject.firstElementChild as HTMLImageElement;\r\n if(!img) {\r\n foreignObject.append(img = new Image());\r\n }\r\n\r\n return img;\r\n} */\r\n\r\nexport function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, noAutoDownload, noBlur, noThumb, noFadeIn, blurAfter}: {\r\n photo: MyPhoto | MyDocument, \r\n message?: any, \r\n container: HTMLElement, \r\n boxWidth?: number, \r\n boxHeight?: number, \r\n withTail?: boolean, \r\n isOut?: boolean, \r\n lazyLoadQueue?: LazyLoadQueue, \r\n middleware?: () => boolean, \r\n size?: PhotoSize,\r\n withoutPreloader?: boolean,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n noBlur?: boolean,\r\n noThumb?: boolean,\r\n noFadeIn?: boolean,\r\n blurAfter?: boolean,\r\n}) {\r\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs)) {\r\n if(boxWidth && boxHeight && !size && photo._ === 'document') {\r\n appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\r\n }\r\n\r\n return {\r\n loadPromises: {\r\n thumb: Promise.resolve(),\r\n full: Promise.resolve()\r\n },\r\n images: {\r\n thumb: null,\r\n full: null\r\n },\r\n preloader: null,\r\n aspecter: null\r\n };\r\n }\r\n\r\n if(!size) {\r\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\r\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\r\n }\r\n\r\n container.classList.add('media-container');\r\n let aspecter = container;\r\n\r\n let isFit = true;\r\n let loadThumbPromise: Promise = Promise.resolve();\r\n let thumbImage: HTMLImageElement;\r\n let image: HTMLImageElement;\r\n let cacheContext: ThumbCache;\r\n const isGif = photo._ === 'document' && photo.mime_type === 'image/gif' && !size;\r\n // if(withTail) {\r\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\r\n // } else {\r\n image = new Image();\r\n\r\n if(boxWidth && boxHeight && !size) { // !album\r\n const set = appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isGif ? {\r\n _: 'photoSize',\r\n w: photo.w,\r\n h: photo.h,\r\n size: photo.size,\r\n type: 'full'\r\n } : undefined);\r\n size = set.photoSize;\r\n isFit = set.isFit;\r\n cacheContext = appDownloadManager.getCacheContext(photo, size.type);\r\n\r\n if(!isFit) {\r\n aspecter = document.createElement('div');\r\n aspecter.classList.add('media-container-aspecter');\r\n aspecter.style.width = set.size.width + 'px';\r\n aspecter.style.height = set.size.height + 'px';\r\n\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\r\n if(gotThumb) {\r\n loadThumbPromise = gotThumb.loadPromise;\r\n const thumbImage = gotThumb.image; // local scope\r\n thumbImage.classList.add('media-photo');\r\n container.append(thumbImage);\r\n } else {\r\n const res = wrapPhoto({\r\n container,\r\n message,\r\n photo,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n size,\r\n lazyLoadQueue,\r\n isOut,\r\n loadPromises,\r\n middleware,\r\n withoutPreloader,\r\n withTail,\r\n noAutoDownload,\r\n noBlur,\r\n noThumb: true,\r\n blurAfter: true\r\n //noFadeIn: true\r\n });\r\n const thumbImage = res.images.full;\r\n thumbImage.classList.add('media-photo', 'thumbnail');\r\n //container.append(thumbImage);\r\n }\r\n\r\n container.classList.add('media-container-fitted');\r\n container.append(aspecter);\r\n }\r\n } else {\r\n if(!size) {\r\n size = appPhotosManager.choosePhotoSize(photo, boxWidth, boxHeight, true);\r\n }\r\n \r\n cacheContext = appDownloadManager.getCacheContext(photo, size?.type);\r\n }\r\n\r\n if(!noThumb) {\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\r\n if(gotThumb) {\r\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\r\n thumbImage = gotThumb.image;\r\n thumbImage.classList.add('media-photo');\r\n aspecter.append(thumbImage);\r\n }\r\n }\r\n // }\r\n\r\n image.classList.add('media-photo');\r\n \r\n //console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\r\n\r\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\r\n\r\n let preloader: ProgressivePreloader;\r\n if(message?.media?.preloader && !withoutPreloader) { // means upload\r\n preloader = message.media.preloader;\r\n preloader.attach(container);\r\n noAutoDownload = undefined;\r\n } else if(!cacheContext.downloaded) {\r\n preloader = new ProgressivePreloader({\r\n attachMethod: 'prepend'\r\n });\r\n }\r\n\r\n const getDownloadPromise = () => {\r\n const promise = isGif && !size ? \r\n appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) : \r\n appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\r\n\r\n return promise;\r\n };\r\n\r\n const renderOnLoad = (url: string) => {\r\n return renderImageWithFadeIn(container, image, url, needFadeIn, aspecter, thumbImage);\r\n };\r\n\r\n const onLoad = (): Promise => {\r\n if(middleware && !middleware()) return Promise.resolve();\r\n\r\n if(blurAfter) {\r\n return blur(cacheContext.url, 12).then(url => {\r\n return renderOnLoad(url);\r\n });\r\n }\r\n\r\n return renderOnLoad(cacheContext.url);\r\n };\r\n\r\n let loadPromise: Promise;\r\n const canAttachPreloader = (\r\n (size as PhotoSize.photoSize).w >= 150 && \r\n (size as PhotoSize.photoSize).h >= 150\r\n ) || noAutoDownload;\r\n const load = () => {\r\n if(noAutoDownload && !withoutPreloader && preloader) {\r\n preloader.construct();\r\n preloader.setManual();\r\n }\r\n\r\n const promise = getDownloadPromise();\r\n\r\n if(preloader && \r\n !cacheContext.downloaded && \r\n !withoutPreloader && \r\n canAttachPreloader\r\n ) {\r\n preloader.attach(container, false, promise);\r\n }\r\n\r\n noAutoDownload = undefined;\r\n\r\n const renderPromise = promise.then(onLoad);\r\n renderPromise.catch(() => {});\r\n return {download: promise, render: renderPromise};\r\n };\r\n\r\n if(preloader) {\r\n preloader.setDownloadFunction(load);\r\n }\r\n \r\n if(cacheContext.downloaded) {\r\n loadThumbPromise = loadPromise = load().render;\r\n } else {\r\n if(!lazyLoadQueue) loadPromise = load().render;\r\n /* else if(noAutoDownload) {\r\n preloader.construct();\r\n preloader.setManual();\r\n preloader.attach(container);\r\n } */ else lazyLoadQueue.push({div: container, load: () => load().download});\r\n }\r\n\r\n if(loadPromises && loadThumbPromise) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n\r\n return {\r\n loadPromises: {\r\n thumb: loadThumbPromise,\r\n full: loadPromise || Promise.resolve()\r\n },\r\n images: {\r\n thumb: thumbImage,\r\n full: image\r\n },\r\n preloader,\r\n aspecter\r\n };\r\n}\r\n\r\nexport function renderImageWithFadeIn(container: HTMLElement, \r\n image: HTMLImageElement, \r\n url: string, \r\n needFadeIn: boolean, \r\n aspecter = container,\r\n thumbImage?: HTMLImageElement\r\n) {\r\n if(needFadeIn) {\r\n image.classList.add('fade-in');\r\n }\r\n\r\n return new Promise((resolve) => {\r\n /* if(photo._ === 'document') {\r\n console.error('wrapPhoto: will render document', photo, size, cacheContext);\r\n return resolve();\r\n } */\r\n\r\n renderImageFromUrl(image, url, () => {\r\n sequentialDom.mutateElement(container, () => {\r\n aspecter.append(image);\r\n\r\n fastRaf(() => {\r\n resolve();\r\n });\r\n\r\n if(needFadeIn) {\r\n image.addEventListener('animationend', () => {\r\n sequentialDom.mutate(() => {\r\n image.classList.remove('fade-in');\r\n \r\n if(thumbImage) {\r\n thumbImage.remove();\r\n }\r\n });\r\n }, {once: true});\r\n }\r\n });\r\n });\r\n });\r\n}\r\n\r\n// export function renderImageWithFadeIn(container: HTMLElement, \r\n// image: HTMLImageElement, \r\n// url: string, \r\n// needFadeIn: boolean, \r\n// aspecter = container,\r\n// thumbImage?: HTMLImageElement\r\n// ) {\r\n// if(needFadeIn) {\r\n// // image.classList.add('fade-in-new', 'not-yet');\r\n// image.classList.add('fade-in');\r\n// }\r\n\r\n// return new Promise((resolve) => {\r\n// /* if(photo._ === 'document') {\r\n// console.error('wrapPhoto: will render document', photo, size, cacheContext);\r\n// return resolve();\r\n// } */\r\n\r\n// renderImageFromUrl(image, url, () => {\r\n// sequentialDom.mutateElement(container, () => {\r\n// aspecter.append(image);\r\n// // (needFadeIn ? getHeavyAnimationPromise() : Promise.resolve()).then(() => {\r\n\r\n// // fastRaf(() => {\r\n// resolve();\r\n// // });\r\n\r\n// if(needFadeIn) {\r\n// fastRaf(() => {\r\n// /* if(!image.isConnected) {\r\n// alert('aaaa');\r\n// } */\r\n// // fastRaf(() => {\r\n// image.classList.remove('not-yet');\r\n// // });\r\n// });\r\n\r\n// image.addEventListener('transitionend', () => {\r\n// sequentialDom.mutate(() => {\r\n// image.classList.remove('fade-in-new');\r\n \r\n// if(thumbImage) {\r\n// thumbImage.remove();\r\n// }\r\n// });\r\n// }, {once: true});\r\n// }\r\n// // });\r\n// });\r\n// });\r\n// });\r\n// }\r\n\r\nexport function wrapSticker({doc, div, middleware, lazyLoadQueue, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn}: {\r\n doc: MyDocument, \r\n div: HTMLElement, \r\n middleware?: () => boolean, \r\n lazyLoadQueue?: LazyLoadQueue, \r\n group?: string, \r\n play?: boolean, \r\n onlyThumb?: boolean,\r\n emoji?: string,\r\n width?: number,\r\n height?: number,\r\n withThumb?: boolean,\r\n loop?: boolean,\r\n loadPromises?: Promise[],\r\n needFadeIn?: boolean,\r\n}) {\r\n const stickerType = doc.sticker;\r\n\r\n if(!width) {\r\n width = !emoji ? 200 : undefined;\r\n }\r\n\r\n if(!height) {\r\n height = !emoji ? 200 : undefined;\r\n }\r\n\r\n if(stickerType === 2 && !LottieLoader.loaded) {\r\n //LottieLoader.loadLottie();\r\n LottieLoader.loadLottieWorkers();\r\n }\r\n \r\n if(!stickerType) {\r\n console.error('wrong doc for wrapSticker!', doc);\r\n throw new Error('wrong doc for wrapSticker!');\r\n }\r\n\r\n div.dataset.docId = '' + doc.id;\r\n div.classList.add('media-sticker-wrapper');\r\n \r\n //console.log('wrap sticker', doc, div, onlyThumb);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n\r\n const toneIndex = emoji ? getEmojiToneIndex(emoji) : -1;\r\n const downloaded = cacheContext.downloaded && !needFadeIn;\r\n \r\n let loadThumbPromise = deferredPromise();\r\n let haveThumbCached = false;\r\n if((doc.thumbs?.length || doc.stickerCachedThumbs) && !div.firstElementChild && (!downloaded || stickerType === 2 || onlyThumb)/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */) {\r\n let thumb = doc.stickerCachedThumbs && doc.stickerCachedThumbs[toneIndex] || doc.thumbs[0];\r\n \r\n //console.log('wrap sticker', thumb, div);\r\n\r\n let thumbImage: HTMLImageElement;\r\n const afterRender = () => {\r\n if(!div.childElementCount) {\r\n thumbImage.classList.add('media-sticker', 'thumbnail');\r\n \r\n sequentialDom.mutateElement(div, () => {\r\n div.append(thumbImage);\r\n loadThumbPromise.resolve();\r\n });\r\n }\r\n };\r\n\r\n if('url' in thumb) {\r\n thumbImage = new Image();\r\n renderImageFromUrl(thumbImage, thumb.url, afterRender);\r\n haveThumbCached = true;\r\n } else if('bytes' in thumb) {\r\n if(thumb._ === 'photoPathSize') {\r\n if(thumb.bytes.length) {\r\n const d = appPhotosManager.getPathFromPhotoPathSize(thumb);\r\n div.innerHTML = `\r\n \r\n `;\r\n } else {\r\n thumb = doc.thumbs.find(t => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\r\n }\r\n } \r\n \r\n if(thumb && thumb._ !== 'photoPathSize' && toneIndex <= 0) {\r\n thumbImage = new Image();\r\n\r\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\r\n renderImageFromUrl(thumbImage, appPhotosManager.getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\r\n haveThumbCached = true;\r\n } else {\r\n webpWorkerController.convert('' + doc.id, (thumb as PhotoSize.photoStrippedSize).bytes as Uint8Array).then(bytes => {\r\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\r\n doc.pFlags.stickerThumbConverted = true;\r\n \r\n if(middleware && !middleware()) return;\r\n \r\n if(!div.childElementCount) {\r\n renderImageFromUrl(thumbImage, appPhotosManager.getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\r\n }\r\n }).catch(() => {});\r\n }\r\n }\r\n } else if(stickerType === 2 && (withThumb || onlyThumb) && toneIndex <= 0) {\r\n thumbImage = new Image();\r\n\r\n const load = () => {\r\n if(div.childElementCount || (middleware && !middleware())) return;\r\n\r\n const r = () => {\r\n if(div.childElementCount || (middleware && !middleware())) return;\r\n renderImageFromUrl(thumbImage, cacheContext.url, afterRender);\r\n };\r\n \r\n if(cacheContext.url) {\r\n r();\r\n return Promise.resolve();\r\n } else {\r\n return appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\r\n }\r\n };\r\n \r\n if(lazyLoadQueue && onlyThumb) {\r\n lazyLoadQueue.push({div, load});\r\n return Promise.resolve();\r\n } else {\r\n load();\r\n\r\n if((thumb as any).url) {\r\n haveThumbCached = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if(loadPromises && haveThumbCached) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n\r\n if(onlyThumb) { // for sticker panel\r\n return Promise.resolve();\r\n }\r\n \r\n const load = async() => {\r\n if(middleware && !middleware()) return;\r\n\r\n if(stickerType === 2) {\r\n /* if(doc.id === '1860749763008266301') {\r\n console.log('loaded sticker:', doc, div);\r\n } */\r\n\r\n //await new Promise((resolve) => setTimeout(resolve, 500));\r\n //return;\r\n\r\n //console.time('download sticker' + doc.id);\r\n\r\n //appDocsManager.downloadDocNew(doc.id).promise.then(res => res.json()).then(async(json) => {\r\n //fetch(doc.url).then(res => res.json()).then(async(json) => {\r\n /* return */ await appDocsManager.downloadDoc(doc, /* undefined, */lazyLoadQueue?.queueId)\r\n .then(readBlobAsText)\r\n //.then(JSON.parse)\r\n .then(async(json) => {\r\n //console.timeEnd('download sticker' + doc.id);\r\n //console.log('loaded sticker:', doc, div/* , blob */);\r\n if(middleware && !middleware()) return;\r\n\r\n let animation = await LottieLoader.loadAnimationWorker({\r\n container: div,\r\n loop: loop && !emoji,\r\n autoplay: play,\r\n animationData: json,\r\n width,\r\n height\r\n }, group, toneIndex);\r\n\r\n //const deferred = deferredPromise();\r\n \r\n animation.addEventListener('firstFrame', () => {\r\n const element = div.firstElementChild;\r\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\r\n\r\n const cb = () => {\r\n if(element && element !== animation.canvas) {\r\n element.remove();\r\n }\r\n };\r\n\r\n if(!needFadeIn) {\r\n if(element) {\r\n sequentialDom.mutate(cb);\r\n }\r\n } else {\r\n sequentialDom.mutate(() => {\r\n animation.canvas.classList.add('fade-in');\r\n if(element) {\r\n element.classList.add('fade-out');\r\n }\r\n \r\n animation.canvas.addEventListener('animationend', () => {\r\n sequentialDom.mutate(() => {\r\n animation.canvas.classList.remove('fade-in');\r\n cb();\r\n });\r\n }, {once: true});\r\n });\r\n }\r\n\r\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\r\n\r\n //deferred.resolve();\r\n }, {once: true});\r\n \r\n if(emoji) {\r\n attachClickEvent(div, (e) => {\r\n cancelEvent(e);\r\n let animation = LottieLoader.getAnimation(div);\r\n \r\n if(animation.paused) {\r\n animation.autoplay = true;\r\n animation.restart();\r\n }\r\n });\r\n }\r\n\r\n //return deferred;\r\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\r\n });\r\n\r\n //console.timeEnd('render sticker' + doc.id);\r\n } else if(stickerType === 1) {\r\n const image = new Image();\r\n const thumbImage = div.firstElementChild !== image && div.firstElementChild;\r\n needFadeIn = (needFadeIn || !downloaded || thumbImage) && rootScope.settings.animationsEnabled;\r\n\r\n image.classList.add('media-sticker');\r\n\r\n if(needFadeIn) {\r\n image.classList.add('fade-in');\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const r = () => {\r\n if(middleware && !middleware()) return resolve();\r\n \r\n renderImageFromUrl(image, cacheContext.url, () => {\r\n sequentialDom.mutateElement(div, () => {\r\n div.append(image);\r\n if(thumbImage) {\r\n thumbImage.classList.add('fade-out');\r\n }\r\n\r\n resolve();\r\n\r\n if(needFadeIn) {\r\n image.addEventListener('animationend', () => {\r\n image.classList.remove('fade-in');\r\n if(thumbImage) {\r\n thumbImage.remove();\r\n }\r\n }, {once: true});\r\n }\r\n });\r\n });\r\n };\r\n \r\n if(cacheContext.url) r();\r\n else {\r\n appDocsManager.downloadDoc(doc, /* undefined, */lazyLoadQueue?.queueId).then(r, resolve);\r\n }\r\n });\r\n }\r\n };\r\n\r\n const loadPromise: Promise = lazyLoadQueue && (!downloaded || stickerType === 2) ? \r\n (lazyLoadQueue.push({div, load}), Promise.resolve()) : \r\n load();\r\n\r\n if(downloaded && stickerType === 1) {\r\n loadThumbPromise = loadPromise;\r\n if(loadPromises) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n }\r\n\r\n return loadPromise;\r\n}\r\n\r\nexport async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height}: {\r\n set: StickerSet.stickerSet,\r\n lazyLoadQueue: LazyLoadQueue,\r\n container: HTMLElement,\r\n group: string,\r\n autoplay: boolean,\r\n width: number,\r\n height: number\r\n}) {\r\n if(set.thumbs?.length) {\r\n container.classList.add('media-sticker-wrapper');\r\n lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n const downloadOptions = appStickersManager.getStickerSetThumbDownloadOptions(set);\r\n const promise = appDownloadManager.download(downloadOptions);\r\n\r\n if(set.pFlags.animated) {\r\n return promise\r\n .then(readBlobAsText)\r\n //.then(JSON.parse)\r\n .then(json => {\r\n lottieLoader.loadAnimationWorker({\r\n container,\r\n loop: true,\r\n autoplay,\r\n animationData: json,\r\n width,\r\n height,\r\n needUpscale: true\r\n }, group);\r\n });\r\n } else {\r\n const image = new Image();\r\n image.classList.add('media-sticker');\r\n \r\n return promise.then(blob => {\r\n renderImageFromUrl(image, URL.createObjectURL(blob), () => {\r\n container.append(image);\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n const promise = appStickersManager.getStickerSet(set);\r\n const stickerSet = await promise;\r\n if(stickerSet.documents[0]._ !== 'documentEmpty') { // as thumb will be used first sticker\r\n wrapSticker({\r\n doc: stickerSet.documents[0],\r\n div: container, \r\n group: group,\r\n lazyLoadQueue\r\n }); // kostil\r\n }\r\n}\r\n\r\nexport function wrapLocalSticker({emoji, width, height}: {\r\n doc?: MyDocument,\r\n url?: string,\r\n emoji?: string,\r\n width: number,\r\n height: number,\r\n}) {\r\n const container = document.createElement('div');\r\n\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: container,\r\n loop: false,\r\n play: true,\r\n width,\r\n height,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n return {container};\r\n}\r\n\r\nexport function wrapReply(title: Parameters[0], subtitle: Parameters[1], message?: any) {\r\n const replyContainer = new ReplyContainer('reply');\r\n replyContainer.fill(title, subtitle, message);\r\n /////////console.log('wrapReply', title, subtitle, media);\r\n return replyContainer.container;\r\n}\r\n\r\nexport function prepareAlbum(options: {\r\n container: HTMLElement,\r\n items: {w: number, h: number}[],\r\n maxWidth: number,\r\n minWidth: number,\r\n spacing: number,\r\n maxHeight?: number,\r\n forMedia?: true\r\n}) {\r\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\r\n const layout = layouter.layout();\r\n\r\n const widthItem = layout.find(item => item.sides & RectPart.Right);\r\n const width = widthItem.geometry.width + widthItem.geometry.x;\r\n\r\n const heightItem = layout.find(item => item.sides & RectPart.Bottom);\r\n const height = heightItem.geometry.height + heightItem.geometry.y;\r\n\r\n const container = options.container;\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n const children = container.children;\r\n\r\n layout.forEach(({geometry, sides}, idx) => {\r\n let div: HTMLElement;\r\n div = children[idx] as HTMLElement;\r\n if(!div) {\r\n div = document.createElement('div');\r\n container.append(div);\r\n }\r\n\r\n div.classList.add('album-item', 'grouped-item');\r\n\r\n div.style.width = (geometry.width / width * 100) + '%';\r\n div.style.height = (geometry.height / height * 100) + '%';\r\n div.style.top = (geometry.y / height * 100) + '%';\r\n div.style.left = (geometry.x / width * 100) + '%';\r\n\r\n if(sides & RectPart.Left && sides & RectPart.Top) {\r\n div.style.borderTopLeftRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\r\n div.style.borderBottomLeftRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Right && sides & RectPart.Top) {\r\n div.style.borderTopRightRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\r\n div.style.borderBottomRightRadius = 'inherit';\r\n }\r\n\r\n if(options.forMedia) {\r\n const mediaDiv = document.createElement('div');\r\n mediaDiv.classList.add('album-item-media');\r\n \r\n div.append(mediaDiv);\r\n }\r\n\r\n // @ts-ignore\r\n //div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\r\n });\r\n\r\n /* if(options.forMedia) {\r\n layout.forEach((_, i) => {\r\n const mediaDiv = document.createElement('div');\r\n mediaDiv.classList.add('album-item-media');\r\n \r\n options.container.children[i].append(mediaDiv);\r\n });\r\n } */\r\n}\r\n\r\nexport function wrapAlbum({groupId, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, noAutoDownload}: {\r\n groupId: string, \r\n attachmentDiv: HTMLElement,\r\n middleware?: () => boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n uploading?: boolean,\r\n isOut: boolean,\r\n chat: Chat,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n}) {\r\n const items: {size: PhotoSize.photoSize, media: any, message: any}[] = [];\r\n\r\n // !lowest msgID will be the FIRST in album\r\n const storage = appMessagesManager.getMidsByAlbum(groupId);\r\n for(const mid of storage) {\r\n const m = chat.getMessage(mid);\r\n const media = m.media.photo || m.media.document;\r\n\r\n const size: any = media._ === 'photo' ? appPhotosManager.choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\r\n items.push({size, media, message: m});\r\n }\r\n\r\n /* // * pending\r\n if(storage[0] < 0) {\r\n items.reverse();\r\n } */\r\n\r\n prepareAlbum({\r\n container: attachmentDiv,\r\n items: items.map(i => ({w: i.size.w, h: i.size.h})),\r\n maxWidth: mediaSizes.active.album.width,\r\n minWidth: 100,\r\n spacing: 2,\r\n forMedia: true\r\n });\r\n\r\n items.forEach((item, idx) => {\r\n const {size, media, message} = item;\r\n\r\n const div = attachmentDiv.children[idx] as HTMLElement;\r\n div.dataset.mid = '' + message.mid;\r\n div.dataset.peerId = '' + message.peerId;\r\n const mediaDiv = div.firstElementChild as HTMLElement;\r\n if(media._ === 'photo') {\r\n wrapPhoto({\r\n photo: media,\r\n message,\r\n container: mediaDiv,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n isOut,\r\n lazyLoadQueue,\r\n middleware,\r\n size,\r\n loadPromises,\r\n noAutoDownload\r\n });\r\n } else {\r\n wrapVideo({\r\n doc: message.media.document,\r\n container: mediaDiv,\r\n message,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n withTail: false,\r\n isOut,\r\n lazyLoadQueue,\r\n middleware,\r\n loadPromises,\r\n noAutoDownload\r\n });\r\n }\r\n });\r\n}\r\n\r\nexport function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, noAutoDownload, lazyLoadQueue, searchContext, useSearch}: {\r\n albumMustBeRenderedFull: boolean,\r\n message: any,\r\n messageDiv: HTMLElement,\r\n bubble: HTMLElement,\r\n uploading?: boolean,\r\n chat: Chat,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n searchContext?: MediaSearchContext,\r\n useSearch?: boolean,\r\n}) {\r\n let nameContainer: HTMLElement;\r\n const mids = albumMustBeRenderedFull ? chat.getMidsByMid(message.mid) : [message.mid];\r\n /* if(isPending) {\r\n mids.reverse();\r\n } */\r\n\r\n mids.forEach((mid, idx) => {\r\n const message = chat.getMessage(mid);\r\n const div = wrapDocument({\r\n message,\r\n loadPromises,\r\n noAutoDownload,\r\n lazyLoadQueue,\r\n searchContext\r\n });\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('document-container');\r\n container.dataset.mid = '' + mid;\r\n container.dataset.peerId = '' + message.peerId;\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.classList.add('document-wrapper');\r\n \r\n if(message.message) {\r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('document-message');\r\n\r\n const richText = RichTextProcessor.wrapRichText(message.message, {\r\n entities: message.totalEntities\r\n });\r\n\r\n messageDiv.innerHTML = richText;\r\n wrapper.append(messageDiv);\r\n }\r\n\r\n if(mids.length > 1) {\r\n const selection = document.createElement('div');\r\n selection.classList.add('document-selection');\r\n container.append(selection);\r\n \r\n container.classList.add('grouped-item');\r\n\r\n if(idx === 0) {\r\n nameContainer = wrapper;\r\n }\r\n }\r\n\r\n wrapper.append(div);\r\n container.append(wrapper);\r\n messageDiv.append(container);\r\n });\r\n\r\n if(mids.length > 1) {\r\n bubble.classList.add('is-multiple-documents', 'is-grouped');\r\n }\r\n\r\n return nameContainer;\r\n}\r\n\r\nexport function wrapPoll(message: any) {\r\n const elem = new PollElement();\r\n elem.message = message;\r\n elem.setAttribute('peer-id', '' + message.peerId);\r\n elem.setAttribute('poll-id', message.media.poll.id);\r\n elem.setAttribute('message-id', '' + message.mid);\r\n elem.render();\r\n return elem;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport whichChild from \"./whichChild\";\r\n\r\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\r\n if(prevPos === undefined) {\r\n prevPos = element.parentElement === container ? whichChild(element) : -1;\r\n }\r\n\r\n if(prevPos === pos) {\r\n return false;\r\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\r\n pos += 1;\r\n }\r\n\r\n if(!pos) {\r\n container.prepend(element);\r\n } else if(container.childElementCount > pos) {\r\n container.insertBefore(element, container.children[pos]);\r\n } else {\r\n container.append(element);\r\n }\r\n\r\n return true;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { insertInDescendSortedArray } from \"./array\";\nimport { getMiddleware } from \"./middleware\";\nimport { safeAssign } from \"./object\";\n\nexport type SortedElementId = PeerId;\nexport type SortedElementBase = {\n id: SortedElementId, \n index: number\n};\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (id: SortedElementId) => number;\n protected onDelete: (element: SortedElement) => void;\n protected onUpdate: (element: SortedElement) => void;\n protected onSort: (element: SortedElement, idx: number) => void;\n protected onElementCreate: (base: SortedElementBase, batch: boolean) => SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware = getMiddleware();\n\n constructor(options: {\n getIndex: SortedList['getIndex'],\n onDelete?: SortedList['onDelete'],\n onUpdate?: SortedList['onUpdate'],\n onSort?: SortedList['onSort'],\n onElementCreate: SortedList['onElementCreate'],\n\n updateElementWith?: SortedList['updateElementWith'],\n updateListWith?: SortedList['updateListWith']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n }\n\n public clear() {\n this.middleware.clean();\n this.elements.clear();\n this.sorted.length = 0;\n }\n\n protected _updateList() {\n this.elements.forEach(element => {\n this.update(element.id, true);\n });\n\n if(this.onSort) {\n this.sorted.forEach((element, idx) => {\n this.onSort(element, idx);\n });\n }\n }\n\n public updateList(callback: (updated: boolean) => void) {\n const middleware = this.middleware.get();\n this.updateListWith((canUpdate) => {\n if(!middleware() || (canUpdate !== undefined && !canUpdate)) {\n return callback(false);\n }\n\n this._updateList();\n \n callback(true);\n });\n }\n\n public has(id: SortedElementId) {\n return this.elements.has(id);\n }\n\n public get(id: SortedElementId) {\n return this.elements.get(id);\n }\n\n public getAll() {\n return this.elements;\n }\n\n public add(id: SortedElementId, batch = false, updateElementWith?: SortedList['updateElementWith'], updateBatch = batch) {\n let element = this.get(id);\n if(element) {\n return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n element = this.onElementCreate(base, batch);\n this.elements.set(id, element);\n this.update(id, updateBatch, element, updateElementWith);\n\n return element;\n }\n\n public delete(id: SortedElementId, noScheduler?: boolean) {\n const element = this.elements.get(id);\n if(!element) {\n return false;\n }\n \n this.elements.delete(id);\n \n const idx = this.sorted.indexOf(element);\n if(idx !== -1) {\n this.sorted.splice(idx, 1);\n }\n\n if(this.onDelete) {\n if(noScheduler) {\n this.onDelete(element);\n } else {\n const middleware = this.middleware.get();\n this.updateElementWith(() => {\n if(!middleware()) {\n return;\n }\n\n this.onDelete(element);\n });\n }\n }\n\n return true;\n }\n\n public update(id: SortedElementId, batch = false, element = this.get(id), updateElementWith?: SortedList['updateElementWith']) {\n if(!element) {\n return;\n }\n\n element.index = this.getIndex(id);\n this.onUpdate && this.onUpdate(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n if(!batch && this.onSort) {\n const middleware = this.middleware.get();\n (updateElementWith || this.updateElementWith)(() => {\n if(!middleware()) {\n return;\n }\n\n // * в случае пересортировки этого же элемента во время ожидания вызовется вторая такая же. нужно соблюдать последовательность событий\n this.onSort(element, idx);\n /* if(this.get(id) === element) {\n this.onSort(element, this.sorted.indexOf(element));\n } */\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\nimport appDialogsManager, { DialogDom } from \"../lib/appManagers/appDialogsManager\";\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport isInDOM from \"../helpers/dom/isInDOM\";\nimport positionElementByIndex from \"../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport { safeAssign } from \"../helpers/object\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../helpers/sortedList\";\n\ninterface SortedUser extends SortedElementBase {\n dom: DialogDom\n}\n\nexport default class SortedUserList extends SortedList {\n protected static SORT_INTERVAL = 30e3;\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueueIntersector;\n protected avatarSize = 48;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected new: boolean;\n protected onListLengthChange: () => void;\n\n constructor(options: Partial<{\n lazyLoadQueue: SortedUserList['lazyLoadQueue'],\n avatarSize: SortedUserList['avatarSize'],\n rippleEnabled: SortedUserList['rippleEnabled'],\n new: SortedUserList['new'],\n autonomous: SortedUserList['autonomous'],\n onListLengthChange: SortedUserList['onListLengthChange']\n }> = {}) {\n super({\n getIndex: (id) => appUsersManager.getUserStatusForSort(id),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: (element) => {\n const status = appUsersManager.getUserStatusString(element.id);\n replaceContent(element.dom.lastMessageSpan, status);\n },\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength && this.onListLengthChange) {\n this.onListLengthChange();\n }\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: base.id,\n container: false,\n drawStatus: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n (base as SortedUser).dom = dom;\n return base as SortedUser;\n },\n updateElementWith: fastRaf,\n updateListWith: async(callback) => {\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n \n await getHeavyAnimationPromise();\n \n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n callback(true);\n }\n });\n\n safeAssign(this, options);\n\n this.list = appDialogsManager.createChatList({new: options.new});\n\n let timeout: number;\n const doTimeout = () => {\n timeout = window.setTimeout(() => {\n this.updateList((good) => {\n if(good) {\n doTimeout();\n }\n });\n }, SortedUserList.SORT_INTERVAL);\n };\n\n doTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SwipeHandler, { SwipeHandlerOptions } from \"../../components/swipeHandler\";\nimport { cancelEvent } from \"./cancelEvent\";\nimport findUpClassName from \"./findUpClassName\";\nimport isSwipingBackSafari from \"./isSwipingBackSafari\";\n\nexport type SwipeHandlerHorizontalOptions = SwipeHandlerOptions & {\n // xThreshold?: number\n};\n\nexport default function handleHorizontalSwipe(options: SwipeHandlerHorizontalOptions) {\n let cancelY = false;\n return new SwipeHandler({\n ...options,\n verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'progress-line') && \n !isSwipingBackSafari(e) && \n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e);\n cancelY = true;\n } else if(!cancelY && Math.abs(yDiff) > Math.abs(xDiff)/* || Math.abs(yDiff) > 20 */) {\n return true;\n }\n\n /* if(!cancelY && options.xThreshold !== undefined && xDiff >= options.xThreshold) {\n cancelY = true;\n } */\n\n return options.onSwipe(xDiff, yDiff, e);\n },\n onReset: () => {\n cancelY = false;\n options.onReset && options.onReset();\n },\n cancelEvent: false // cannot use cancelEvent on Safari iOS because scroll will be canceled too\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelContextMenuOpening } from \"../../components/misc\";\nimport handleHorizontalSwipe, { SwipeHandlerHorizontalOptions } from \"./handleHorizontalSwipe\";\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\n }\n }\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport PopupPickUser from \"./pickUser\";\r\n\r\nexport default class PopupForward extends PopupPickUser {\r\n constructor(\r\n peerIdMids: {[fromPeerId: PeerId]: number[]}, \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n overrideOnSelect = false\r\n ) {\r\n super({\r\n peerTypes: ['dialogs', 'contacts'],\r\n onSelect: overrideOnSelect ? onSelect : async(peerId) => {\r\n if(onSelect) {\r\n const res = onSelect(peerId);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n }\r\n\r\n appImManager.setInnerPeer(peerId);\r\n appImManager.chat.input.initMessagesForward(peerIdMids);\r\n },\r\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\r\n chatRightsAction: 'send_messages',\r\n selfPresence: 'ChatYourSelf'\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport { ChatType } from \"../chat/chat\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\n\nexport default class PopupDeleteMessages {\n constructor(peerId: PeerId, mids: number[], type: ChatType, onConfirm?: () => void) {\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'] = [];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n \n if(appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\n }\n\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n\n if(peerId === rootScope.myId || type === 'scheduled') {\n \n } else {\n if(peerId.isUser()) {\n checkboxes.push({\n text: 'DeleteMessagesOptionAlso',\n textArgs: [peerTitleElement]\n });\n } else {\n const chat = appChatsManager.getChat(peerId.toChatId());\n\n const hasRights = appChatsManager.hasRights(peerId.toChatId(), 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = hasRights ? mids.slice() : mids.filter(mid => {\n const message = appMessagesManager.getMessageByPeer(peerId, mid);\n return message.fromId === rootScope.myId;\n });\n\n if(canRevoke.length) {\n if(canRevoke.length === mids.length) {\n checkboxes.push({\n text: 'DeleteForAll'\n });\n } else {\n checkboxes.push({\n text: 'DeleteMessagesOption'\n });\n\n description = 'DeleteMessagesTextGroup';\n descriptionArgs = [i18n('messages', [canRevoke.length])];\n //description = `You can also delete the ${canRevoke.length} message${canRevoke.length > 1 ? 's' : ''} you sent from the inboxes of other group members by pressing \"${buttonText}\".`;\n }\n }\n } else {\n buttons[0].callback = (checked) => callback(checked, true);\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { PopupButton } from \".\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupSendNow {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n let title: string, description: string, buttons: PopupButton[] = [];\n\n title = `Send Message${mids.length > 1 ? 's' : ''} Now`;\n description = mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?';\n\n const callback = () => {\n onConfirm && onConfirm();\n appMessagesManager.sendScheduledMessages(peerId, mids);\n };\n\n buttons.push({\n langKey: 'Send',\n callback\n });\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n title,\n description,\n buttons\n });\n\n popup.show();\n }\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelSelection() {\r\n if(window.getSelection) {\r\n if(window.getSelection().empty) { // Chrome\r\n window.getSelection().empty();\r\n } else if(window.getSelection().removeAllRanges) { // Firefox\r\n window.getSelection().removeAllRanges();\r\n }\r\n // @ts-ignore\r\n } else if(document.selection) { // IE?\r\n // @ts-ignore\r\n document.selection.empty();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppMessagesManager, MessagesStorage } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatBubbles from \"./bubbles\";\nimport type ChatInput from \"./input\";\nimport type Chat from \"./chat\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport CheckboxField from \"../checkboxField\";\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\nimport PopupForward from \"../popups/forward\";\nimport { toast } from \"../toast\";\nimport SetTransition from \"../singleTransition\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport PopupSendNow from \"../popups/sendNow\";\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport I18n, { i18n, _i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport cancelSelection from \"../../helpers/dom/cancelSelection\";\nimport getSelectedText from \"../../helpers/dom/getSelectedText\";\nimport rootScope from \"../../lib/rootScope\";\nimport { safeAssign } from \"../../helpers/object\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport { randomLong } from \"../../helpers/random\";\nimport { attachContextMenuListener } from \"../misc\";\nimport { attachClickEvent, AttachClickOptions } from \"../../helpers/dom/clickEvent\";\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\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 {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected appMessagesManager: AppMessagesManager;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean) => void;\n protected onUpdateContainer: (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => void;\n protected onCancelSelection: () => void;\n protected toggleByMid: (peerId: PeerId, mid: number) => void;\n protected toggleByElement: (bubble: HTMLElement) => void;\n\n protected navigationType: NavigationItem['type'];\n\n protected getElementFromTarget: (target: HTMLElement) => HTMLElement;\n protected verifyTarget: (e: MouseEvent, target: HTMLElement) => boolean;\n protected verifyMouseMoveTarget: (e: MouseEvent, element: HTMLElement, selecting: boolean) => boolean;\n protected verifyTouchLongPress: () => boolean;\n protected targetLookupClassName: string;\n protected lookupBetweenParentClassName: string;\n protected lookupBetweenElementsQuery: string;\n\n constructor(options: {\n appMessagesManager: AppMessagesManager,\n listenElement: HTMLElement,\n listenerSetter: ListenerSetter,\n getElementFromTarget: AppSelection['getElementFromTarget'],\n verifyTarget?: AppSelection['verifyTarget'],\n verifyMouseMoveTarget?: AppSelection['verifyMouseMoveTarget'],\n verifyTouchLongPress?: AppSelection['verifyTouchLongPress'],\n targetLookupClassName: string,\n lookupBetweenParentClassName: string,\n lookupBetweenElementsQuery: string,\n isScheduled?: AppSelection['isScheduled']\n }) {\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.add(this.listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener(this.listenElement, (e) => {\n if(this.isSelecting || (this.verifyTouchLongPress && !this.verifyTouchLongPress())) return;\n\n // * these two lines will fix instant text selection on iOS Safari\n document.body.classList.add('no-select'); // * need no-select on body because chat-input transforms in channels\n this.listenElement.addEventListener('touchend', (e) => {\n cancelEvent(e); // ! this one will fix propagation to document loader button, etc\n document.body.classList.remove('no-select');\n\n //this.chat.bubbles.onBubblesClick(e);\n }, {once: true, capture: true});\n\n cancelSelection();\n //cancelEvent(e as any);\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(element) {\n this.toggleByElement(element);\n }\n }, this.listenerSetter);\n\n return;\n }\n\n const getElementsBetween = (first: HTMLElement, last: HTMLElement) => { \n if(first === last) {\n return [];\n }\n\n const firstRect = first.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n const difference = (firstRect.top - lastRect.top) || (firstRect.left - lastRect.left);\n const isHigher = difference < 0;\n\n const parent = findUpClassName(first, this.lookupBetweenParentClassName);\n if(!parent) {\n return [];\n }\n\n const elements = Array.from(parent.querySelectorAll(this.lookupBetweenElementsQuery)) as HTMLElement[];\n let firstIndex = elements.indexOf(first);\n let lastIndex = elements.indexOf(last);\n\n if(!isHigher) {\n [lastIndex, firstIndex] = [firstIndex, lastIndex];\n }\n\n const slice = elements.slice(firstIndex + 1, lastIndex);\n\n // console.log('getElementsBetween', first, last, slice, firstIndex, lastIndex, isHigher);\n\n return slice;\n };\n\n this.listenerSetter.add(this.listenElement)('mousedown', (e) => {\n //console.log('selection mousedown', e);\n const element = findUpClassName(e.target, this.targetLookupClassName);\n if(e.button !== 0) {\n return;\n }\n\n if(this.verifyTarget && !this.verifyTarget(e, element)) {\n return;\n }\n \n const seen: AppSelection['selectedMids'] = new Map();\n let selecting: boolean;\n\n /* let good = false;\n const {x, y} = e; */\n\n /* const bubbles = appImManager.bubbles;\n for(const mid in bubbles) {\n const bubble = bubbles[mid];\n bubble.addEventListener('mouseover', () => {\n console.log('mouseover');\n }, {once: true});\n } */\n\n let firstTarget = element;\n\n const processElement = (element: HTMLElement, checkBetween = true) => {\n const mid = +element.dataset.mid;\n if(!mid || !element.dataset.peerId) return;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!isInDOM(firstTarget)) {\n firstTarget = element;\n }\n\n let seenSet = seen.get(peerId);\n if(!seenSet) {\n seen.set(peerId, seenSet = new Set());\n }\n\n if(!seenSet.has(mid)) {\n const isSelected = this.isMidSelected(peerId, mid);\n if(selecting === undefined) {\n //bubblesContainer.classList.add('no-select');\n selecting = !isSelected;\n }\n\n seenSet.add(mid);\n\n if((selecting && !isSelected) || (!selecting && isSelected)) {\n const seenLength = accumulateMapSet(seen);\n if(this.toggleByElement && checkBetween) {\n if(seenLength < 2) {\n if(findUpAsChild(element, firstTarget)) {\n firstTarget = element;\n }\n }\n\n const elementsBetween = getElementsBetween(firstTarget, element);\n // console.log(elementsBetween);\n if(elementsBetween.length) {\n elementsBetween.forEach(element => {\n processElement(element, false);\n });\n }\n }\n\n if(!this.selectedMids.size) {\n if(seenLength === 2 && this.toggleByMid) {\n for(const [peerId, mids] of seen) {\n for(const mid of mids) {\n this.toggleByMid(peerId, mid);\n }\n }\n }\n } else if(this.toggleByElement) {\n this.toggleByElement(element);\n }\n }\n }\n };\n\n //const foundTargets: Map = new Map();\n let canceledSelection = false;\n const onMouseMove = (e: MouseEvent) => {\n if(!canceledSelection) {\n cancelSelection();\n canceledSelection = true;\n }\n /* if(!good) {\n if(Math.abs(e.x - x) > MIN_CLICK_MOVE || Math.abs(e.y - y) > MIN_CLICK_MOVE) {\n good = true;\n } else {\n return;\n }\n } */\n\n /* if(foundTargets.has(e.target as HTMLElement)) return;\n foundTargets.set(e.target as HTMLElement, true); */\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(!element) {\n //console.error('found no bubble', e);\n return;\n }\n\n if(this.verifyMouseMoveTarget && !this.verifyMouseMoveTarget(e, element, selecting)) {\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n this.listenerSetter.removeManual(document, 'mouseup', onMouseUp, documentListenerOptions);\n return;\n }\n\n processElement(element);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n if(seen.size) {\n attachClickEvent(window, cancelEvent, {capture: true, once: true, passive: false});\n }\n\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n //bubblesContainer.classList.remove('no-select');\n\n // ! CANCEL USER SELECTION !\n cancelSelection();\n };\n\n const documentListenerOptions = {once: true};\n this.listenerSetter.add(this.listenElement)('mousemove', onMouseMove);\n this.listenerSetter.add(document)('mouseup', onMouseUp, documentListenerOptions);\n });\n }\n\n protected isElementShouldBeSelected(element: HTMLElement) {\n return this.isMidSelected(element.dataset.peerId.toPeerId(), +element.dataset.mid);\n }\n\n protected appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n element.prepend(checkboxField.label);\n }\n\n public toggleElementCheckbox(element: HTMLElement, show: boolean) {\n const hasCheckbox = !!this.getCheckboxInputFromElement(element);\n if(show) {\n if(hasCheckbox) {\n return false;\n }\n \n const checkboxField = new CheckboxField({\n name: element.dataset.mid, \n round: true\n });\n \n // * if it is a render of new message\n if(this.isSelecting) { // ! avoid breaking animation on start\n if(this.isElementShouldBeSelected(element)) {\n checkboxField.input.checked = true;\n element.classList.add('is-selected');\n }\n }\n \n this.appendCheckbox(element, checkboxField);\n } else if(hasCheckbox) {\n this.getCheckboxInputFromElement(element).parentElement.remove();\n }\n\n return true;\n }\n\n protected getCheckboxInputFromElement(element: HTMLElement): HTMLInputElement {\n return element.firstElementChild?.tagName === 'LABEL' && \n element.firstElementChild.firstElementChild as HTMLInputElement;\n }\n\n protected updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n \n let cantForward = !size, \n cantDelete = !size, \n cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storage = this.isScheduled ? this.appMessagesManager.getScheduledMessagesStorage(peerId) : this.appMessagesManager.getMessagesStorage(peerId);\n for(const mid of mids) {\n const message = this.appMessagesManager.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n if(message.action) {\n cantForward = true;\n }\n }\n \n if(!cantDelete) {\n const canDelete = this.appMessagesManager.canDeleteMessage(message);\n if(!canDelete) {\n cantDelete = true;\n }\n }\n\n if(cantForward && cantDelete) break;\n }\n\n if(cantForward && cantDelete) break;\n }\n \n this.onUpdateContainer && this.onUpdateContainer(cantForward, cantDelete, cantSend);\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const wasSelecting = this.isSelecting;\n const size = this.selectedMids.size;\n this.isSelecting = !!size || forceSelection;\n\n if(wasSelecting === this.isSelecting) return false;\n \n // const bubblesContainer = this.bubbles.bubblesContainer;\n //bubblesContainer.classList.toggle('is-selecting', !!size);\n\n /* if(bubblesContainer.classList.contains('is-chat-input-hidden')) {\n const scrollable = this.appImManager.scrollable;\n if(scrollable.isScrolledDown) {\n scrollable.scrollTo(scrollable.scrollHeight, 'top', true, true, 200);\n }\n } */\n\n if(!IS_TOUCH_SUPPORTED) {\n this.listenElement.classList.toggle('no-select', this.isSelecting);\n\n if(wasSelecting) {\n // ! CANCEL USER SELECTION !\n cancelSelection();\n }\n }/* else {\n if(!wasSelecting) {\n bubblesContainer.classList.add('no-select');\n setTimeout(() => {\n cancelSelection();\n bubblesContainer.classList.remove('no-select');\n cancelSelection();\n }, 100);\n }\n } */\n\n blurActiveElement();\n\n const forwards = !!size || forceSelection;\n this.onToggleSelection && this.onToggleSelection(forwards);\n\n if(!IS_MOBILE_SAFARI) {\n if(forwards) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: () => {\n this.cancelSelection();\n }\n });\n } else {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n if(forceSelection) {\n this.updateContainer(forceSelection);\n }\n\n return true;\n }\n\n public cancelSelection = () => {\n this.onCancelSelection && this.onCancelSelection();\n this.selectedMids.clear();\n this.toggleSelection();\n cancelSelection();\n };\n\n public cleanup() {\n this.selectedMids.clear();\n this.toggleSelection(false);\n }\n\n protected updateElementSelection(element: HTMLElement, isSelected: boolean) {\n this.toggleElementCheckbox(element, true);\n const input = this.getCheckboxInputFromElement(element);\n input.checked = isSelected;\n\n this.toggleSelection();\n this.updateContainer();\n SetTransition(element, 'is-selected', isSelected, 200);\n }\n\n public isMidSelected(peerId: PeerId, mid: number) {\n const set = this.selectedMids.get(peerId);\n return set?.has(mid);\n }\n\n public length() {\n return accumulateMapSet(this.selectedMids);\n }\n\n protected toggleMid(peerId: PeerId, mid: number, unselect?: boolean) {\n let set = this.selectedMids.get(peerId);\n if(unselect || (unselect === undefined && set?.has(mid))) {\n if(set) {\n set.delete(mid);\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n }\n } else {\n const diff = rootScope.config.forwarded_count_max - this.length() - 1;\n if(diff < 0) {\n toast(I18n.format('Chat.Selection.LimitToast', true));\n return false;\n /* const it = this.selectedMids.values();\n do {\n const mid = it.next().value;\n const mounted = this.appImManager.getMountedBubble(mid);\n if(mounted) {\n this.toggleByBubble(mounted.bubble);\n } else {\n const mids = this.appMessagesManager.getMidsByMid(mid);\n for(const mid of mids) {\n this.selectedMids.delete(mid);\n }\n }\n } while(this.selectedMids.size > MAX_SELECTION_LENGTH); */\n }\n\n if(!set) {\n set = new Set();\n this.selectedMids.set(peerId, set);\n }\n\n set.add(mid);\n }\n\n return true;\n }\n\n /**\n * ! Call this method only to handle deleted messages\n */\n public deleteSelectedMids(peerId: PeerId, mids: number[]) {\n const set = this.selectedMids.get(peerId);\n if(!set) {\n return;\n }\n\n mids.forEach(mid => {\n set.delete(mid);\n });\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n\n this.updateContainer();\n this.toggleSelection();\n }\n}\n\nexport class SearchSelection extends AppSelection {\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n public selectionGotoBtn: HTMLElement;\n\n private isPrivate: boolean;\n\n constructor(private searchSuper: AppSearchSuper, appMessagesManager: AppMessagesManager) {\n super({\n appMessagesManager,\n listenElement: searchSuper.container,\n listenerSetter: new ListenerSetter(),\n verifyTarget: (e, target) => !!target && this.isSelecting,\n getElementFromTarget: (target) => findUpClassName(target, 'search-super-item'),\n targetLookupClassName: 'search-super-item',\n lookupBetweenParentClassName: 'tabs-tab',\n lookupBetweenElementsQuery: '.search-super-item'\n });\n\n this.isPrivate = !searchSuper.showSender;\n }\n\n /* public appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(element.classList.contains('document') || element.tagName === 'AUDIO-ELEMENT') {\n element.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n } */\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n const elements = Array.from(this.searchSuper.tabsContainer.querySelectorAll('.search-super-item')) as HTMLElement[];\n elements.forEach(element => {\n this.toggleElementCheckbox(element, this.isSelecting);\n });\n }\n\n return ret;\n }\n\n public toggleByElement = (element: HTMLElement) => {\n const mid = +element.dataset.mid;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!this.toggleMid(peerId, mid)) {\n return;\n }\n\n this.updateElementSelection(element, this.isMidSelected(peerId, mid));\n };\n\n public toggleByMid = (peerId: PeerId, mid: number) => {\n const element = this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id=\"${peerId}\"][data-mid=\"${mid}\"]`) as HTMLElement;\n this.toggleByElement(element);\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n const length = this.length();\n replaceContent(this.selectionCountEl, i18n('messages', [length]));\n this.selectionGotoBtn.classList.toggle('hide', length !== 1);\n this.selectionForwardBtn.classList.toggle('hide', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.classList.toggle('hide', cantDelete);\n };\n\n protected onToggleSelection = (forwards: boolean) => {\n SetTransition(this.searchSuper.navScrollableContainer, 'is-selecting', forwards, 200, () => {\n if(!this.isSelecting) {\n this.selectionContainer.remove();\n this.selectionContainer = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \n null;\n this.selectedText = undefined;\n }\n });\n\n SetTransition(this.searchSuper.container, 'is-selecting', forwards, 200);\n\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n const BASE_CLASS = 'search-super-selection';\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add(BASE_CLASS + '-container');\n\n const btnCancel = ButtonIcon(`close ${BASE_CLASS}-cancel`, {noRipple: true});\n this.listenerSetter.add(btnCancel)('click', this.cancelSelection, {once: true});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add(BASE_CLASS + '-count');\n\n this.selectionGotoBtn = ButtonIcon(`message ${BASE_CLASS}-goto`);\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n attachClickEvent(this.selectionGotoBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n const mid = [...this.selectedMids.get(peerId)][0];\n this.cancelSelection();\n\n rootScope.dispatchEvent('history_focus', {\n peerId,\n mid\n });\n }, attachClickOptions);\n\n this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`);\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n if(this.isPrivate) {\n this.selectionDeleteBtn = ButtonIcon(`delete danger ${BASE_CLASS}-delete`);\n attachClickEvent(this.selectionDeleteBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n new PopupDeleteMessages(peerId, [...this.selectedMids.get(peerId)], 'chat', () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionContainer.append(...[\n btnCancel, \n this.selectionCountEl, \n this.selectionGotoBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean));\n\n const transitionElement = this.selectionContainer;\n transitionElement.style.opacity = '0';\n this.searchSuper.navScrollableContainer.append(transitionElement);\n\n void transitionElement.offsetLeft; // reflow\n transitionElement.style.opacity = '';\n }\n }\n };\n}\n\nexport default class ChatSelection extends AppSelection {\n protected selectionInputWrapper: HTMLElement;\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionSendNowBtn: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n\n constructor(private chat: Chat, private bubbles: ChatBubbles, private input: ChatInput, appMessagesManager: AppMessagesManager) {\n super({\n appMessagesManager,\n listenElement: bubbles.bubblesContainer,\n listenerSetter: bubbles.listenerSetter,\n getElementFromTarget: (target) => findUpClassName(target, 'grouped-item') || findUpClassName(target, 'bubble'),\n verifyTarget: (e, target) => {\n // LEFT BUTTON\n // проверка внизу нужна для того, чтобы не активировать селект если target потомок .bubble\n const bad = !this.selectedMids.size \n && !(e.target as HTMLElement).classList.contains('bubble')\n && !(e.target as HTMLElement).classList.contains('document-selection')\n && target;\n\n return !bad;\n },\n verifyMouseMoveTarget: (e, element, selecting) => {\n const bad = e.target !== element && \n !(e.target as HTMLElement).classList.contains('document-selection') && \n selecting === undefined && \n !this.selectedMids.size;\n return !bad;\n },\n verifyTouchLongPress: () => !this.chat.input.recording,\n targetLookupClassName: 'bubble',\n lookupBetweenParentClassName: 'bubbles-inner',\n lookupBetweenElementsQuery: '.bubble:not(.is-multiple-documents), .grouped-item',\n isScheduled: chat.type === 'scheduled'\n });\n }\n\n public appendCheckbox(bubble: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(bubble.classList.contains('document-container')) {\n bubble.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n for(const mid in this.bubbles.bubbles) {\n const bubble = this.bubbles.bubbles[mid];\n this.toggleElementCheckbox(bubble, this.isSelecting);\n }\n }\n\n return ret;\n }\n\n public toggleElementCheckbox(bubble: HTMLElement, show: boolean) {\n if(!this.canSelectBubble(bubble)) return;\n\n const ret = super.toggleElementCheckbox(bubble, show);\n if(ret) {\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n this.bubbles.getBubbleGroupedItems(bubble).forEach(item => this.toggleElementCheckbox(item, show));\n }\n }\n \n return ret;\n }\n\n public toggleByElement = (bubble: HTMLElement) => {\n if(!this.canSelectBubble(bubble)) return;\n\n const mid = +bubble.dataset.mid;\n\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n if(!this.isGroupedBubbleSelected(bubble)) {\n const set = this.selectedMids.get(this.bubbles.peerId);\n if(set) {\n const mids = this.chat.getMidsByMid(mid);\n mids.forEach(mid => set.delete(mid));\n }\n }\n\n this.bubbles.getBubbleGroupedItems(bubble).forEach(this.toggleByElement);\n return;\n }\n\n if(!this.toggleMid(this.bubbles.peerId, mid)) {\n return;\n }\n\n const isGroupedItem = bubble.classList.contains('grouped-item');\n if(isGroupedItem) {\n const groupContainer = findUpClassName(bubble, 'bubble');\n const isGroupedSelected = this.isGroupedBubbleSelected(groupContainer);\n const isGroupedMidsSelected = this.isGroupedMidsSelected(mid);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.bubbles.peerId, mid));\n };\n\n protected toggleByMid = (peerId: PeerId, mid: number) => {\n const mounted = this.bubbles.getMountedBubble(mid);\n if(mounted) {\n this.toggleByElement(mounted.bubble);\n }\n };\n\n public isElementShouldBeSelected(element: HTMLElement) {\n const isGrouped = element.classList.contains('is-grouped');\n return super.isElementShouldBeSelected(element) && (!isGrouped || this.isGroupedMidsSelected(+element.dataset.mid));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected isGroupedMidsSelected(mid: number) {\n const mids = this.chat.getMidsByMid(mid);\n const selectedMids = mids.filter(mid => this.isMidSelected(this.bubbles.peerId, mid));\n return mids.length === selectedMids.length;\n }\n\n protected getCheckboxInputFromElement(bubble: HTMLElement) {\n /* let perf = performance.now();\n let checkbox = bubble.firstElementChild.tagName === 'LABEL' && bubble.firstElementChild.firstElementChild as HTMLInputElement;\n console.log('getCheckboxInputFromBubble firstElementChild time:', performance.now() - perf);\n \n perf = performance.now();\n checkbox = bubble.querySelector('label input');\n console.log('getCheckboxInputFromBubble querySelector time:', performance.now() - perf); */\n /* let perf = performance.now();\n let contains = bubble.classList.contains('document-container');\n console.log('getCheckboxInputFromBubble classList time:', performance.now() - perf);\n \n perf = performance.now();\n contains = bubble.className.includes('document-container');\n console.log('getCheckboxInputFromBubble className time:', performance.now() - perf); */\n \n return bubble.classList.contains('document-container') ? \n bubble.querySelector('label input') as HTMLInputElement : \n super.getCheckboxInputFromElement(bubble);\n }\n\n public canSelectBubble(bubble: HTMLElement) {\n return !bubble.classList.contains('service') && !bubble.classList.contains('is-sending') && !bubble.classList.contains('bubble-first');\n }\n\n protected onToggleSelection = (forwards: boolean) => {\n let transform = '', borderRadius = '';\n if(forwards) {\n const p = this.input.rowsWrapper.parentElement;\n const fakeSelectionWrapper = p.querySelector('.fake-selection-wrapper');\n const fakeRowsWrapper = p.querySelector('.fake-rows-wrapper');\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\n const fakeRowsRect = 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 const needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\n\n if(scale < 1) {\n const br = 12;\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\n }\n //scale = widthTo / widthFrom;\n }\n }\n\n SetTransition(this.input.rowsWrapper, 'is-centering', forwards, 200);\n this.input.rowsWrapper.style.transform = transform;\n this.input.rowsWrapper.style.borderRadius = borderRadius;\n SetTransition(this.listenElement, 'is-selecting', forwards, 200, () => {\n if(!this.isSelecting) {\n this.selectionInputWrapper.remove();\n this.selectionInputWrapper = \n this.selectionContainer = \n this.selectionSendNowBtn = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \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 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 this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add('selection-container');\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n const btnCancel = ButtonIcon('close', {noRipple: true});\n attachClickEvent(btnCancel, this.cancelSelection, {once: true, listenerSetter: this.listenerSetter});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add('selection-container-count');\n\n if(this.chat.type === 'scheduled') {\n this.selectionSendNowBtn = Button('btn-primary btn-transparent btn-short text-bold selection-container-send', {icon: 'send2'});\n this.selectionSendNowBtn.append(i18n('MessageScheduleSend'));\n attachClickEvent(this.selectionSendNowBtn, () => {\n new PopupSendNow(this.bubbles.peerId, [...this.selectedMids.get(this.bubbles.peerId)], () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n } else {\n this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'});\n this.selectionForwardBtn.append(i18n('Forward'));\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionDeleteBtn = Button('btn-primary btn-transparent danger text-bold selection-container-delete', {icon: 'delete'});\n this.selectionDeleteBtn.append(i18n('Delete'));\n attachClickEvent(this.selectionDeleteBtn, () => {\n new PopupDeleteMessages(this.bubbles.peerId, [...this.selectedMids.get(this.bubbles.peerId)], this.chat.type, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n this.selectionContainer.append(...[\n btnCancel, \n this.selectionCountEl, \n this.selectionSendNowBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean));\n\n this.selectionInputWrapper.style.opacity = '0';\n this.selectionInputWrapper.append(this.selectionContainer);\n this.input.rowsWrapper.parentElement.append(this.selectionInputWrapper);\n\n void this.selectionInputWrapper.offsetLeft; // reflow\n this.selectionInputWrapper.style.opacity = '';\n }\n }\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n replaceContent(this.selectionCountEl, i18n('messages', [this.length()]));\n this.selectionSendNowBtn && this.selectionSendNowBtn.toggleAttribute('disabled', cantSend);\n this.selectionForwardBtn && this.selectionForwardBtn.toggleAttribute('disabled', cantForward);\n this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = () => {\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n const mounted = this.bubbles.getMountedBubble(mid);\n if(mounted) {\n //this.toggleByBubble(mounted.message.grouped_id ? mounted.bubble.querySelector(`.grouped-item[data-mid=\"${mid}\"]`) : mounted.bubble);\n this.toggleByElement(mounted.bubble);\n }\n /* const bubble = this.appImManager.bubbles[mid];\n if(bubble) {\n this.toggleByBubble(bubble);\n } */\n }\n }\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedText(): string {\r\n if(window.getSelection) {\r\n return window.getSelection().toString();\r\n // @ts-ignore\r\n } else if(document.selection) {\r\n // @ts-ignore\r\n return document.selection.createRange().text;\r\n }\r\n \r\n return '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { copy, getObjectKeysAndSort, safeAssign } from \"../helpers/object\";\nimport { escapeRegExp, limitSymbols } from \"../helpers/string\";\nimport appChatsManager from \"../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, { MyInputMessagesFilter, MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport appStateManager from \"../lib/appManagers/appStateManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport { logger } from \"../lib/logger\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport rootScope from \"../lib/rootScope\";\nimport { SearchGroup, SearchGroupType } from \"./appSearch\";\nimport { horizontalMenu } from \"./horizontalMenu\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport { attachContextMenuListener, openBtnMenu, positionMenu, putPreloader } from \"./misc\";\nimport { ripple } from \"./ripple\";\nimport Scrollable, { ScrollableX } from \"./scrollable\";\nimport { wrapDocument, wrapPhoto, wrapVideo } from \"./wrappers\";\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport I18n, { LangPackKey, i18n } from \"../lib/langPack\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { getMiddleware } from \"../helpers/middleware\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { ChannelParticipant, ChatFull, ChatParticipant, ChatParticipants } 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\";\n\n//const testScroll = false;\n\nexport type SearchSuperType = MyInputMessagesFilter/* | 'members' */;\nexport type SearchSuperContext = {\n peerId: PeerId,\n inputFilter: {_: MyInputMessagesFilter},\n query?: string,\n maxId?: number,\n folderId?: number,\n threadId?: number,\n date?: number,\n nextRate?: number,\n minDate?: number,\n maxDate?: number\n};\n\nexport type SearchSuperMediaType = 'members' | 'media' | 'files' | 'links' | 'music' | 'chats' | 'voice';\nexport type SearchSuperMediaTab = {\n inputFilter: SearchSuperType,\n name: LangPackKey,\n type: SearchSuperMediaType,\n contentTab?: HTMLElement,\n menuTab?: HTMLElement,\n scroll?: {scrollTop: number, scrollHeight: number}\n};\n\nclass SearchContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify?: () => boolean, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper\n ) {\n const onContextMenu = (e: MouseEvent) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let item: HTMLElement;\n try {\n item = findUpClassName(e.target, 'search-super-item');\n } catch(e) {}\n\n if(!item) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n this.target = item;\n this.peerId = item.dataset.peerId.toPeerId();\n this.mid = +item.dataset.mid;\n this.isSelected = searchSuper.selection.isMidSelected(this.peerId, this.mid);\n\n this.buttons.forEach(button => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? button.verify() : true;\n }\n\n button.element.classList.toggle('hide', !good);\n });\n\n item.classList.add('menu-open');\n\n positionMenu(e, this.element);\n openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener(attachTo, onContextMenu as any);\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.isSelected && \n !this.searchSuper.selection.selectionForwardBtn.classList.contains('hide'),\n withSelection: true\n }, {\n icon: 'message',\n text: 'Message.Context.Goto',\n onClick: this.onGotoClick,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n withSelection: true\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => appMessagesManager.canDeleteMessage(appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.searchSuper.selection.selectionDeleteBtn.classList.contains('hide'),\n withSelection: true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n rootScope.dispatchEvent('history_focus', {\n peerId: this.peerId,\n mid: this.mid,\n threadId: this.searchSuper.searchContext.threadId\n });\n };\n\n private onForwardClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionForwardBtn);\n } else {\n new PopupForward({\n [this.peerId]: [this.mid]\n });\n }\n };\n\n private onSelectClick = () => {\n this.searchSuper.selection.toggleByElement(this.target);\n };\n\n private onClearSelectionClick = () => {\n this.searchSuper.selection.cancelSelection();\n };\n\n private onDeleteClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, [this.mid], 'chat');\n }\n };\n}\n\nexport 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 constructor(options: Pick) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('search-super');\n\n this.searchContextMenu = new SearchContextMenu(this.container, this);\n this.selection = new SearchSelection(this, appMessagesManager);\n\n const navScrollableContainer = this.navScrollableContainer = document.createElement('div');\n navScrollableContainer.classList.add('search-super-tabs-scrollable', 'menu-horizontal-scrollable', 'sticky');\n\n const navScrollable = this.navScrollable = new ScrollableX(navScrollableContainer);\n navScrollable.container.classList.add('search-super-nav-scrollable');\n\n const nav = this.nav = document.createElement('nav');\n nav.classList.add('search-super-tabs', 'menu-horizontal-div');\n this.tabsMenu = nav;\n\n navScrollable.container.append(nav);\n\n for(const mediaTab of this.mediaTabs) {\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const i = document.createElement('i');\n\n span.append(i18n(mediaTab.name));\n span.append(i);\n\n menuTab.append(span);\n\n ripple(menuTab);\n\n this.tabsMenu.append(menuTab);\n\n this.mediaTabsMap.set(mediaTab.type, mediaTab);\n\n mediaTab.menuTab = menuTab;\n }\n\n this.tabsContainer = document.createElement('div');\n this.tabsContainer.classList.add('search-super-tabs-container', 'tabs-container');\n\n let unlockScroll: ReturnType;\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.tabsContainer, \n onSwipe: (xDiff, yDiff, e) => {\n const prevId = this.selectTab.prevId();\n const children = Array.from(this.tabsMenu.children) as HTMLElement[];\n let idx: number;\n if(xDiff > 0) {\n for(let i = prevId + 1; i < children.length; ++i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n } else {\n for(let i = prevId - 1; i >= 0; --i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n }\n\n if(idx !== undefined) {\n unlockScroll = lockTouchScroll(this.tabsContainer);\n this.selectTab(idx);\n }\n }\n });\n }\n\n for(const mediaTab of this.mediaTabs) {\n const container = document.createElement('div');\n container.classList.add('search-super-container-' + mediaTab.type, 'tabs-tab');\n\n const content = document.createElement('div');\n content.classList.add('search-super-content-' + mediaTab.type);\n\n container.append(content);\n\n this.tabsContainer.append(container);\n\n this.tabs[mediaTab.inputFilter] = content;\n\n mediaTab.contentTab = content;\n }\n\n this.container.append(navScrollableContainer, this.tabsContainer);\n\n // * construct end\n\n this.searchGroupMedia = new SearchGroup(false, 'messages', true);\n\n this.scrollable.onScrolledBottom = () => {\n if(this.mediaTab.contentTab && this.mediaTab.contentTab.childElementCount/* && 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(this.container, 'start');\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(this.container, 'start');\n scrollTop = offsetTop;\n }\n \n fromMediaTab.scroll = {scrollTop: scrollTop, scrollHeight: this.scrollable.scrollHeight};\n \n if(newMediaTab.scroll === undefined) {\n const rect = this.container.getBoundingClientRect();\n const rect2 = this.container.parentElement.getBoundingClientRect();\n const diff = rect.y - rect2.y;\n \n if(scrollTop > diff) {\n newMediaTab.scroll = {scrollTop: diff, scrollHeight: 0};\n }\n }\n \n if(newMediaTab.scroll) {\n const diff = fromMediaTab.scroll.scrollTop - newMediaTab.scroll.scrollTop;\n //console.log('what you gonna do', this.goingHard, diff);\n \n //this.scrollable.scrollTop = scrollTop;\n if(diff/* && diff < 0 */) {\n /* if(diff > -(fromMediaTab.contentTab.scrollHeight + this.nav.scrollHeight)) {\n fromMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n this.scrollable.scrollTop = scrollTop - diff;\n } else { */\n newMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n //}\n }\n }\n }\n \n /* if(this.prevTabId !== -1 && nav.offsetTop) {\n this.scrollable.scrollTop -= nav.offsetTop;\n } */\n\n /* this.log('setVirtualContainer', id, this.sharedMediaSelected, this.sharedMediaSelected.childElementCount);\n this.scroll.setVirtualContainer(this.sharedMediaSelected); */\n\n if(this.prevTabId !== -1 && !newMediaTab.contentTab.childElementCount) { // quick brown fix\n //this.contentContainer.classList.remove('loaded');\n this.load(true);\n }\n\n this.prevTabId = id;\n }, () => {\n this.scrollable.onScroll();\n \n //console.log('what y', this.tabSelected.style.transform);\n if(this.mediaTab.scroll !== undefined) {\n this.mediaTab.contentTab.style.transform = '';\n this.scrollable.scrollTop = this.mediaTab.scroll.scrollTop;\n }\n\n if(unlockScroll) {\n unlockScroll();\n unlockScroll = undefined;\n }\n\n this.onTransitionEnd();\n }, undefined, navScrollable);\n\n attachClickEvent(this.tabsContainer, (e) => {\n if(this.selection.isSelecting) {\n cancelEvent(e);\n this.selection.toggleByElement(findUpClassName(e.target, 'search-super-item'));\n }\n }, {capture: true, passive: false});\n \n const onMediaClick = (className: string, targetClassName: string, inputFilter: MyInputMessagesFilter, e: MouseEvent) => {\n const target = findUpClassName(e.target as HTMLDivElement, className);\n if(!target) return;\n \n const mid = +target.dataset.mid;\n if(!mid) {\n this.log.warn('no messageId by click on target:', target);\n return;\n }\n\n const peerId = target.dataset.peerId.toPeerId();\n\n const targets = (Array.from(this.tabs[inputFilter].querySelectorAll('.' + targetClassName)) as HTMLElement[]).map(el => {\n const containerEl = findUpClassName(el, className);\n return {\n element: el, \n mid: +containerEl.dataset.mid, \n peerId: containerEl.dataset.peerId.toPeerId()\n };\n });\n\n //const ids = Object.keys(this.mediaDivsByIds).map(k => +k).sort((a, b) => a - b);\n const idx = targets.findIndex(item => item.mid === mid && item.peerId === peerId);\n \n const message = appMessagesManager.getMessageByPeer(peerId, mid);\n new AppMediaViewer()\n .setSearchContext(this.copySearchContext(inputFilter))\n .openMedia(message, targets[idx].element, 0, false, targets.slice(0, idx), targets.slice(idx + 1));\n };\n\n attachClickEvent(this.tabs.inputMessagesFilterPhotoVideo, onMediaClick.bind(null, 'grid-item', 'grid-item', 'inputMessagesFilterPhotoVideo'));\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'));\n\n /* attachClickEvent(this.tabs.inputMessagesFilterUrl, (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') {\n return;\n }\n\n try {\n const a = findUpClassName(target, 'row').querySelector('.anchor-url:last-child') as HTMLAnchorElement;\n a.click();\n } catch(err) {}\n }); */\n\n this.mediaTab = this.mediaTabs[0];\n\n useHeavyAnimationCheck(() => {\n this.lazyLoadQueue.lock();\n }, () => {\n this.lazyLoadQueue.unlockAndRefresh(); // ! maybe not so efficient\n });\n }\n\n private onTransitionStart = () => {\n this.container.classList.add('sliding');\n };\n\n private onTransitionEnd = () => {\n this.container.classList.remove('sliding');\n };\n\n public filterMessagesByType(messages: any[], type: SearchSuperType): MyMessage[] {\n if(type === 'inputMessagesFilterEmpty') return messages;\n\n if(type !== 'inputMessagesFilterUrl') {\n messages = messages.filter(message => !!message.media);\n }\n\n /* if(!this.peerId) {\n messages = messages.filter(message => {\n if(message.peerId === rootScope.myId) {\n return true;\n }\n\n const dialog = appMessagesManager.getDialogByPeerId(message.fromId)[0];\n return dialog && dialog.folder_id === 0;\n });\n } */\n\n let filtered: any[] = [];\n\n switch(type) {\n case 'inputMessagesFilterPhotoVideo': {\n for(let message of messages) {\n let media = message.media.photo || message.media.document || (message.media.webpage && message.media.webpage.document);\n if(!media) {\n //this.log('no media!', message);\n continue;\n }\n \n if(media._ === 'document' && media.type !== 'video'/* && media.type !== 'gif' */) {\n //this.log('broken video', media);\n continue;\n }\n\n filtered.push(message);\n }\n \n break;\n }\n\n case 'inputMessagesFilterDocument': {\n for(let message of messages) {\n if(!message.media.document || ['voice', 'audio', 'gif', 'sticker', 'round'].includes(message.media.document.type)) {\n continue;\n }\n \n filtered.push(message);\n }\n break;\n }\n\n case 'inputMessagesFilterUrl': {\n //this.log('inputMessagesFilterUrl', messages);\n for(let message of messages) {\n //if((message.media.webpage && message.media.webpage._ !== 'webPageEmpty')) {\n filtered.push(message);\n //}\n }\n \n break;\n }\n\n case 'inputMessagesFilterMusic': {\n for(let message of messages) {\n if(!message.media.document || message.media.document.type !== 'audio') {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n case 'inputMessagesFilterVoice': {\n for(let message of messages) {\n if(!message.media.document || message.media.document.type !== 'voice') {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n case 'inputMessagesFilterRoundVoice': {\n for(let message of messages) {\n if(!message.media.document || !(['voice', 'round'] as MyDocument['type'][]).includes(message.media.document.type)) {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n default:\n break;\n }\n\n return filtered;\n }\n \n 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 // https://core.telegram.org/type/MessagesFilter\n switch(inputFilter) {\n case 'inputMessagesFilterEmpty': {\n for(const message of messages) {\n const {dialog, dom} = appDialogsManager.addDialogNew({\n dialog: message.peerId, \n container: searchGroup.list, \n drawStatus: false,\n avatarSize: 54\n });\n appDialogsManager.setLastMessage(dialog, message, dom, this.searchContext.query);\n }\n\n if(searchGroup.list.childElementCount) {\n searchGroup.setActive();\n }\n break;\n }\n\n case 'inputMessagesFilterPhotoVideo': {\n for(const message of messages) {\n const media = message.media.photo || message.media.document || (message.media.webpage && message.media.webpage.document);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n //this.log(message, photo);\n\n let wrapped: ReturnType;\n const size = appPhotosManager.choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = wrapVideo({\n doc: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n onlyPreview: true,\n withoutPreloader: true,\n noPlayButton: true,\n size\n }).thumb;\n } else {\n wrapped = wrapPhoto({\n photo: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n noBlur: true,\n size\n });\n }\n\n [wrapped.images.thumb, wrapped.images.full].filter(Boolean).forEach(image => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n elemsToAppend.push({element: div, message});\n }\n \n break;\n }\n \n case 'inputMessagesFilterVoice':\n case 'inputMessagesFilterRoundVoice':\n case 'inputMessagesFilterMusic':\n case 'inputMessagesFilterDocument': {\n for(const message of messages) {\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(message.media.document.type);\n const div = wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n noAutoDownload: true\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(message.media.document.type)) {\n div.classList.add('audio-48');\n }\n\n elemsToAppend.push({element: div, message});\n }\n break;\n }\n \n case 'inputMessagesFilterUrl': {\n for(let message of messages) {\n let webpage: any;\n\n if(message.media?.webpage && message.media.webpage._ !== 'webPageEmpty') {\n webpage = message.media.webpage;\n } else {\n const entity = message.totalEntities ? message.totalEntities.find((e: any) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') : null;\n let url: string, display_url: string, sliced: string;\n\n if(!entity) {\n //this.log.error('NO ENTITY:', message);\n const match = RichTextProcessor.matchUrl(message.message);\n if(!match) {\n //this.log.error('NO ENTITY AND NO MATCH:', message);\n continue;\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 url,\n display_url\n };\n\n if(!same) {\n webpage.description = message.message;\n webpage.rDescription = RichTextProcessor.wrapRichText(limitSymbols(message.message, 150, 180));\n }\n }\n\n let div = document.createElement('div');\n \n let previewDiv = document.createElement('div');\n previewDiv.classList.add('preview', 'row-media');\n \n //this.log('wrapping webpage', webpage);\n \n if(webpage.photo) {\n const res = wrapPhoto({\n container: previewDiv,\n message: null,\n photo: webpage.photo,\n boxWidth: 0,\n boxHeight: 0,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n size: appPhotosManager.choosePhotoSize(webpage.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n previewDiv.innerHTML = RichTextProcessor.getAbbreviation(webpage.title || webpage.display_url || webpage.description || webpage.url, true);\n }\n \n let title = webpage.rTitle || '';\n let subtitle = webpage.rDescription || '';\n\n const subtitleFragment = htmlToDocumentFragment(subtitle);\n const aFragment = htmlToDocumentFragment(RichTextProcessor.wrapRichText(webpage.url || ''));\n const a = aFragment.firstElementChild;\n if(a instanceof HTMLAnchorElement) {\n a.innerText = decodeURIComponent(a.href);\n }\n\n if(subtitleFragment.firstChild) {\n subtitleFragment.append('\\n');\n }\n\n subtitleFragment.append(a);\n\n if(this.showSender) {\n subtitleFragment.append('\\n', appMessagesManager.wrapSenderToPeer(message));\n }\n \n if(!title) {\n //title = new URL(webpage.url).hostname;\n title = RichTextProcessor.wrapPlainText(webpage.display_url.split('/', 1)[0]);\n }\n\n const row = new Row({\n title,\n titleRight: appMessagesManager.wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n /* const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('row-media'); */\n\n row.container.append(previewDiv);\n \n /* ripple(div);\n div.append(previewDiv);\n div.insertAdjacentHTML('beforeend', `\n
${title}${titleAdditionHTML}
\n
${subtitle}
\n
${url}
\n ${sender}\n `); */\n \n if(row.container.innerText.trim().length) {\n elemsToAppend.push({element: row.container, message});\n }\n }\n \n break;\n }\n\n default:\n //this.log.warn('death is my friend', messages);\n break;\n }\n\n if(this.loadMutex) {\n promises.push(this.loadMutex);\n }\n\n if(promises.length) {\n await Promise.all(promises);\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n }\n \n if(elemsToAppend.length) {\n const method = append ? 'append' : 'prepend';\n elemsToAppend.forEach(details => {\n const {element, message} = details;\n const monthContainer = this.getMonthContainerByTimestamp(this.groupByMonth ? message.date : 0, inputFilter);\n element.classList.add('search-super-item');\n element.dataset.mid = '' + message.mid;\n element.dataset.peerId = '' + message.peerId;\n monthContainer.items[method](element);\n\n if(this.selection.isSelecting) {\n this.selection.toggleElementCheckbox(element, true);\n }\n });\n }\n \n //if(type !== 'inputMessagesFilterEmpty') {\n this.afterPerforming(inputFilter === 'inputMessagesFilterEmpty' ? 1 : messages.length, sharedMediaDiv);\n //}\n }\n\n private afterPerforming(length: number, contentTab: HTMLElement) {\n if(contentTab) {\n const parent = contentTab.parentElement;\n Array.from(parent.children).slice(1).forEach(child => {\n child.remove();\n });\n\n //this.contentContainer.classList.add('loaded');\n\n if(!length && !contentTab.childElementCount) {\n const div = document.createElement('div');\n div.innerText = 'Nothing interesting here yet...';\n div.classList.add('position-center', 'text-center', 'content-empty', 'no-select');\n\n parent.append(div);\n }\n }\n }\n\n private loadChats() {\n const renderedPeerIds: Set = new Set();\n const middleware = this.middleware.get();\n\n for(let i in this.searchGroups) {\n const group = this.searchGroups[i as SearchGroupType];\n this.tabs.inputMessagesFilterEmpty.append(group.container);\n group.clear();\n }\n\n const query = this.searchContext.query;\n if(query) {\n const setResults = (results: PeerId[], group: SearchGroup, showMembersCount = false) => {\n results.forEach((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n \n renderedPeerIds.add(peerId);\n \n const peer = appPeersManager.getPeer(peerId);\n \n //////////this.log('contacts peer', peer);\n \n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId, \n container: group.list, \n drawStatus: false,\n avatarSize: 48,\n autonomous: group.autonomous\n });\n \n if(showMembersCount && (peer.participants_count || peer.participants)) {\n const regExp = new RegExp(`(${escapeRegExp(query)}|${escapeRegExp(cleanSearchText(query))})`, 'gi');\n dom.titleSpan.innerHTML = dom.titleSpan.innerHTML.replace(regExp, '$1');\n dom.lastMessageSpan.append(appProfileManager.getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.phone) {\n username = '+' + formatPhoneNumber(user.phone).formatted;\n }\n } else {\n username = '@' + username;\n }\n \n dom.lastMessageSpan.innerHTML = '' + username + '';\n }\n });\n \n group.toggle();\n };\n \n const onLoad = (arg: T) => {\n if(!middleware()) {\n return;\n }\n \n //this.loadedContacts = true;\n \n return arg;\n };\n \n return Promise.all([\n appUsersManager.getContactsPeerIds(query, true)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n \n appUsersManager.searchContacts(query, 20)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts.my_results, this.searchGroups.contacts, true);\n setResults(contacts.results/* .concat(contacts.results, contacts.results, contacts.results) */, this.searchGroups.globalContacts);\n\n if(this.searchGroups.globalContacts.nameEl.lastElementChild) {\n this.searchGroups.globalContacts.nameEl.lastElementChild.remove();\n }\n\n this.searchGroups.globalContacts.container.classList.add('is-short');\n \n if(this.searchGroups.globalContacts.list.childElementCount > 3) {\n const showMore = document.createElement('div');\n showMore.classList.add('search-group__show-more');\n showMore.innerText = 'Show more';\n this.searchGroups.globalContacts.nameEl.append(showMore);\n showMore.addEventListener('click', () => {\n const isShort = this.searchGroups.globalContacts.container.classList.toggle('is-short');\n showMore.innerText = isShort ? 'Show more' : 'Show less';\n });\n }\n }\n }),\n \n appMessagesManager.getConversations(query, 0, 20, 0).promise\n .then(onLoad)\n .then(value => {\n if(value) {\n setResults(value.dialogs.map(d => d.peerId), this.searchGroups.contacts, true);\n }\n })\n ]);\n } else if(!this.searchContext.peerId && !this.searchContext.minDate) {\n const renderRecentSearch = (setActive = true) => {\n return appStateManager.getState().then(state => {\n if(!middleware()) {\n return;\n }\n \n this.searchGroups.recent.list.innerHTML = '';\n \n state.recentSearch.slice(0, 20).forEach(peerId => {\n let {dialog, dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n container: this.searchGroups.recent.list,\n drawStatus: false,\n meAsSaved: true,\n avatarSize: 48,\n autonomous: true\n });\n \n dom.lastMessageSpan.append(peerId.isUser() ? appUsersManager.getUserStatusString(peerId) : appProfileManager.getChatMembersString(peerId.toChatId()));\n });\n \n if(!state.recentSearch.length) {\n this.searchGroups.recent.clear();\n } else if(setActive) {\n this.searchGroups.recent.setActive();\n }\n });\n };\n\n return Promise.all([\n appUsersManager.getTopPeers('correspondents').then(peers => {\n if(!middleware()) return;\n\n const idx = peers.findIndex(peer => peer.id === rootScope.myId);\n if(idx !== -1) {\n peers = peers.slice();\n peers.splice(idx, 1);\n }\n //console.log('got top categories:', categories);\n if(peers.length) {\n peers.forEach((peer) => {\n appDialogsManager.addDialogNew({\n dialog: peer.id, \n container: this.searchGroups.people.list, \n drawStatus: false,\n onlyFirstName: true,\n avatarSize: 54,\n autonomous: false\n });\n });\n }\n \n this.searchGroups.people.setActive();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private loadMembers(mediaTab: SearchSuperMediaTab) {\n const id = this.searchContext.peerId.toChatId();\n const middleware = this.middleware.get();\n let promise: Promise;\n\n const renderParticipants = async(participants: (ChatParticipant | ChannelParticipant)[]) => {\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n \n if(!this.membersList) {\n this.membersList = new SortedUserList({lazyLoadQueue: this.lazyLoadQueue, rippleEnabled: false});\n this.membersList.list.addEventListener('click', (e) => {\n const li = findUpTag(e.target, 'LI');\n if(!li) {\n return;\n }\n\n const peerId = li.dataset.peerId.toPeerId();\n let promise: Promise = Promise.resolve();\n if(mediaSizes.isMobile) {\n promise = appSidebarRight.toggleSidebar(false);\n }\n \n promise.then(() => {\n appImManager.setInnerPeer(peerId);\n });\n });\n mediaTab.contentTab.append(this.membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n participants.forEach(participant => {\n const peerId = appChatsManager.getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n return;\n }\n\n const user = appUsersManager.getUser(peerId);\n if(user.pFlags.deleted) {\n return;\n }\n\n this.membersList.add(peerId);\n });\n };\n\n if(appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then(participants => {\n if(!middleware()) {\n return;\n }\n\n let list = mediaTab.contentTab.firstElementChild as HTMLUListElement;\n this.nextRates[mediaTab.inputFilter] = (list ? list.childElementCount : 0) + participants.participants.length;\n\n if(participants.participants.length < LOAD_COUNT) {\n this.loaded[mediaTab.inputFilter] = true;\n }\n\n return renderParticipants(participants.participants);\n });\n } else {\n promise = (appProfileManager.getChatFull(id) as Promise).then(chatFull => {\n if(!middleware()) {\n return;\n }\n\n //console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = chatFull.participants;\n if(participants._ === 'chatParticipantsForbidden') {\n return;\n }\n \n return renderParticipants(participants.participants);\n });\n }\n\n return this.loadPromises[mediaTab.inputFilter] = promise.finally(() => { \n if(!middleware()) {\n return;\n }\n\n this.loadPromises[mediaTab.inputFilter] = null;\n });\n }\n\n private loadType(mediaTab: SearchSuperMediaTab, justLoad: boolean, loadCount: number, middleware: () => boolean) {\n const type = mediaTab.inputFilter;\n\n if(this.loadPromises[type]) {\n return this.loadPromises[type];\n }\n\n if(mediaTab.type === 'members') {\n return this.loadMembers(mediaTab);\n }\n\n const history = this.historyStorage[type] ?? (this.historyStorage[type] = []);\n\n if(type === 'inputMessagesFilterEmpty' && !history.length) {\n if(!this.loadedChats) {\n this.loadChats();\n this.loadedChats = true;\n }\n\n if(!this.searchContext.query.trim() && !this.searchContext.peerId && !this.searchContext.minDate) {\n this.loaded[type] = true;\n return Promise.resolve();\n }\n }\n\n const logStr = 'load [' + type + ']: ';\n\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n let messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n let ids = history.slice(used, used + loadCount);\n //this.log(logStr + 'will render from cache', used, history, ids, loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n messages.push(...this.filterMessagesByType(ids.map(m => appMessagesManager.getMessageByPeer(m.peerId, m.mid)), type));\n } while(slicedLength < loadCount && used < history.length);\n \n // если перебор\n /* if(slicedLength > loadCount) {\n let diff = messages.length - loadCount;\n messages = messages.slice(0, messages.length - diff);\n used -= diff;\n } */\n\n this.usedFromHistory[type] = used;\n //if(messages.length) {\n return this.performSearchResult(messages, mediaTab).finally(() => {\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n //}\n\n return Promise.resolve();\n }\n \n let maxId = history.length ? history[history.length - 1].mid : 0;\n \n //this.log(logStr + 'search house of glass pre', type, maxId);\n \n //let loadCount = history.length ? 50 : 15;\n return this.loadPromises[type] = appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId, \n limit: loadCount,\n nextRate: this.nextRates[type] ?? (this.nextRates[type] = 0)\n }).then(value => {\n history.push(...value.history.map(m => ({mid: m.mid, peerId: m.peerId})));\n \n this.log(logStr + 'search house of glass', type, value);\n\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n\n // ! Фикс случая, когда не загружаются документы при открытой панели разработчиков (происходит из-за того, что не совпадают критерии отбора документов в getSearch)\n if(value.history.length < loadCount || (this.searchContext.folderId !== undefined && !value.next_rate) || value.history.length === value.count) {\n //if((value.count || history.length === value.count) && history.length >= value.count) {\n //this.log(logStr + 'loaded all media', value, loadCount);\n this.loaded[type] = true;\n }\n\n this.nextRates[type] = value.next_rate;\n\n if(justLoad) {\n return Promise.resolve();\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n (this.loadPromises[type] || Promise.resolve()).then(() => {\n setTimeout(() => {\n if(!middleware()) return;\n //this.log('will preload more');\n if(this.mediaTab === mediaTab) {\n const promise = this.load(true, true);\n if(promise) {\n promise.then(() => {\n if(!middleware()) return;\n //this.log('preloaded more');\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n }\n }\n }, 0);\n });\n }\n\n //if(value.history.length) {\n return this.performSearchResult(this.filterMessagesByType(value.history, type), mediaTab);\n //}\n }).catch(err => {\n this.log.error('load error:', err);\n }).finally(() => {\n this.loadPromises[type] = null;\n });\n }\n \n public async load(single = false, justLoad = false) {\n // if(testScroll/* || 1 === 1 */) {\n // return;\n // }\n\n //return;\n \n const peerId = this.searchContext.peerId;\n this.log('load', single, peerId, this.loadPromises);\n const middleware = this.middleware.get();\n\n if(this.firstLoad) {\n if(this.hideEmptyTabs) {\n const mediaTabs = this.mediaTabs.filter(mediaTab => mediaTab.inputFilter !== 'inputMessagesFilterEmpty')\n const filters = mediaTabs.map(mediaTab => ({_: mediaTab.inputFilter}));\n\n const counters = await appMessagesManager.getSearchCounters(peerId, filters);\n if(!middleware()) {\n return;\n }\n\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n let firstMediaTab: SearchSuperMediaTab;\n let count = 0;\n mediaTabs.forEach(mediaTab => {\n const counter = counters.find(c => c.filter._ === mediaTab.inputFilter);\n\n mediaTab.menuTab.classList.toggle('hide', !counter.count);\n mediaTab.menuTab.classList.remove('active');\n //mediaTab.contentTab.classList.toggle('hide', !counter.count);\n\n if(counter.count && firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n if(counter.count) ++count;\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n const canViewMembers = this.canViewMembers();\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n }\n\n this.container.classList.toggle('hide', !firstMediaTab);\n this.container.parentElement.classList.toggle('search-empty', !firstMediaTab);\n if(firstMediaTab) {\n this.skipScroll = true;\n this.selectTab(this.mediaTabs.indexOf(firstMediaTab), false);\n firstMediaTab.menuTab.classList.add('active');\n\n this.navScrollableContainer.classList.toggle('hide', count <= 1);\n }\n }\n\n this.firstLoad = false;\n }\n \n let toLoad = single ? [this.mediaTab] : this.mediaTabs.filter(t => t !== this.mediaTab);\n toLoad = toLoad.filter(mediaTab => {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n });\n\n if(peerId.isUser()) {\n toLoad.findAndSplice(mediaTab => mediaTab.type === 'members');\n }\n\n if(!toLoad.length) {\n return;\n }\n\n const loadCount = justLoad ? 50 : Math.round((windowSize.windowH / 130 | 0) * 3 * 1.25); // that's good for all types\n\n const promises: Promise[] = toLoad.map(mediaTab => {\n return this.loadType(mediaTab, justLoad, loadCount, middleware)\n });\n\n return Promise.all(promises).catch(err => {\n this.log.error('Load error all promises:', err);\n });\n }\n \n public getMonthContainerByTimestamp(timestamp: number, type: SearchSuperType) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n date.setDate(1);\n const dateTimestamp = date.getTime();\n const containers = this.monthContainers[type] ?? (this.monthContainers[type] = {});\n if(!(dateTimestamp in containers)) {\n const container = document.createElement('div');\n container.className = 'search-super-month';\n\n const name = document.createElement('div');\n name.classList.add('search-super-month-name');\n\n const options: Intl.DateTimeFormatOptions = {\n month: 'long'\n };\n\n if(date.getFullYear() !== new Date().getFullYear()) {\n options.year = 'numeric';\n }\n\n const dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n name.append(dateElement);\n\n container.append(name);\n\n const items = document.createElement('div');\n items.classList.add('search-super-month-items');\n\n container.append(name, items);\n\n const haveTimestamps = getObjectKeysAndSort(containers, 'desc');\n let i = 0;\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n if(dateTimestamp > t) {\n break;\n }\n }\n \n containers[dateTimestamp] = {container, items};\n positionElementByIndex(container, this.tabs[type], i);\n }\n\n return containers[dateTimestamp];\n }\n\n public canViewMembers() {\n return this.searchContext.peerId.isAnyChat() && !appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()) && appChatsManager.hasRights(this.searchContext.peerId.toChatId(), 'view_participants');\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n\n this.lazyLoadQueue.clear();\n\n this.mediaTabs.forEach(mediaTab => {\n this.usedFromHistory[mediaTab.inputFilter] = -1;\n });\n\n if(this.selection.isSelecting) {\n this.selection.cancelSelection();\n }\n\n // * must go to first tab (это костыль)\n /* const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n const tab = this.canViewMembers() ? membersTab : this.mediaTabs[this.mediaTabs.indexOf(membersTab) + 1];\n this.mediaTab = tab;\n } */\n\n this.middleware.clean();\n this.cleanScrollPositions();\n this.membersList = undefined;\n }\n\n public cleanScrollPositions() {\n this.mediaTabs.forEach(mediaTab => {\n mediaTab.scroll = undefined;\n });\n }\n\n public cleanupHTML(goFirst = false) {\n if(this.urlsToRevoke.length) {\n this.urlsToRevoke.forEach(url => {\n URL.revokeObjectURL(url);\n });\n this.urlsToRevoke.length = 0;\n }\n\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.innerHTML = '';\n\n if(this.hideEmptyTabs) {\n //tab.menuTab.classList.add('hide');\n this.container.classList.add('hide');\n this.container.parentElement.classList.add('search-empty');\n }\n\n if(tab.type === 'chats') {\n return;\n }\n \n if(!this.historyStorage[tab.inputFilter]) {\n const parent = tab.contentTab.parentElement;\n //if(!testScroll) {\n if(!parent.querySelector('.preloader')) {\n putPreloader(parent, true);\n }\n //}\n\n const empty = parent.querySelector('.content-empty');\n if(empty) {\n empty.remove();\n }\n }\n });\n\n /* if(goFirst) {\n const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n let idx = this.canViewMembers() ? 0 : 1;\n membersTab.menuTab.classList.toggle('hide', idx !== 0);\n\n this.selectTab(idx, false);\n } else {\n this.selectTab(0, false);\n }\n } */\n\n this.monthContainers = {};\n this.searchGroupMedia.clear();\n this.scrollable.scrollTop = 0;\n\n /* if(testScroll) {\n for(let i = 0; i < 1500; ++i) {\n let div = document.createElement('div');\n div.insertAdjacentHTML('beforeend', ``);\n div.classList.add('grid-item');\n div.dataset.id = '' + (i / 3 | 0);\n //div.innerText = '' + (i / 3 | 0);\n this.tabs.inputMessagesFilterPhotoVideo.append(div);\n }\n } */\n }\n\n private copySearchContext(newInputFilter: MyInputMessagesFilter) {\n const context = copy(this.searchContext);\n context.inputFilter = {_: newInputFilter};\n context.nextRate = this.nextRates[newInputFilter];\n return context;\n }\n\n public setQuery({peerId, query, threadId, historyStorage, folderId, minDate, maxDate}: {\n peerId: PeerId, \n query?: string, \n threadId?: number, \n historyStorage?: AppSearchSuper['historyStorage'], \n folderId?: number,\n minDate?: number,\n maxDate?: number\n }) {\n this.searchContext = {\n peerId,\n query: query || '',\n inputFilter: {_: this.mediaTab.inputFilter},\n threadId,\n folderId,\n minDate,\n maxDate\n };\n \n this.historyStorage = historyStorage ?? {};\n\n this.cleanup();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"./cancelEvent\";\n\nexport default function lockTouchScroll(container: HTMLElement) {\n const onTouchMove = (e: TouchEvent) => {\n cancelEvent(e);\n };\n\n let lockers = 2;\n const cb = () => {\n if(!--lockers) {\n container.removeEventListener('touchmove', onTouchMove, {capture: true});\n }\n };\n\n container.addEventListener('touchmove', onTouchMove, {capture: true, passive: false});\n container.addEventListener('touchend', cb, {once: true});\n\n return cb;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { InputPrivacyKey, InputPrivacyRule, PrivacyRule, Update, PrivacyKey } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport { convertInputKeyToKey } from \"../../helpers/string\";\r\n\r\nexport enum PrivacyType {\r\n Everybody = 2,\r\n Contacts = 1,\r\n Nobody = 0\r\n}\r\n\r\nexport class AppPrivacyManager {\r\n private privacy: Partial<{\r\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\r\n }> = {};\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updatePrivacy: (update) => {\r\n const key = update.key._;\r\n this.privacy[key] = update.rules;\r\n rootScope.dispatchEvent('privacy_update', update);\r\n }\r\n });\r\n }\r\n\r\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\r\n return apiManager.invokeApi('account.setPrivacy', {\r\n key: {\r\n _: inputKey\r\n },\r\n rules\r\n }).then(privacyRules => {\r\n appUsersManager.saveApiUsers(privacyRules.users);\r\n appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updatePrivacy',\r\n key: {\r\n _: convertInputKeyToKey(inputKey)\r\n },\r\n rules: rules.map(inputRule => {\r\n const rule: PrivacyRule = {} as any;\r\n Object.assign(rule, inputRule);\r\n rule._ = convertInputKeyToKey(rule._) as any;\r\n return rule;\r\n })\r\n });\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\r\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\r\n const rules = this.privacy[privacyKey];\r\n if(rules) {\r\n return Promise.resolve(rules);\r\n }\r\n \r\n return this.privacy[privacyKey] = apiManager.invokeApi('account.getPrivacy', {\r\n key: {\r\n _: inputKey\r\n }\r\n }).then(privacyRules => {\r\n appUsersManager.saveApiUsers(privacyRules.users);\r\n appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return this.privacy[privacyKey] = privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacyRulesDetails(rules: PrivacyRule[]) {\r\n const types: PrivacyType[] = [];\r\n\r\n type peers = {users: UserId[], chats: ChatId[]};\r\n let allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\r\n rules.forEach(rule => {\r\n switch(rule._) {\r\n case 'privacyValueAllowAll':\r\n types.push(2);\r\n break;\r\n case 'privacyValueDisallowAll':\r\n types.push(0);\r\n break;\r\n case 'privacyValueAllowContacts': \r\n types.push(1);\r\n break;\r\n /* case 'privacyValueDisallowContacts':\r\n types.push('Except My Contacts');\r\n break; */\r\n case 'privacyValueAllowChatParticipants':\r\n allowPeers.chats.push(...rule.chats);\r\n break;\r\n case 'privacyValueAllowUsers':\r\n allowPeers.users.push(...rule.users);\r\n break;\r\n case 'privacyValueDisallowChatParticipants':\r\n disallowPeers.chats.push(...rule.chats);\r\n break;\r\n case 'privacyValueDisallowUsers':\r\n disallowPeers.users.push(...rule.users);\r\n break;\r\n }\r\n });\r\n\r\n return {type: types[0], disallowPeers, allowPeers};\r\n }\r\n}\r\n\r\nconst appPrivacyManager = new AppPrivacyManager();\r\nMOUNT_CLASS_TO.appPrivacyManager = appPrivacyManager;\r\nexport default appPrivacyManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { randomLong } from \"../helpers/random\";\r\nimport { InputPrivacyKey, InputPrivacyRule } from \"../layer\";\r\nimport appPrivacyManager, { PrivacyType } from \"../lib/appManagers/appPrivacyManager\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\nimport { i18n, join, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RadioField from \"./radioField\";\r\nimport Row, { RadioFormFromRows } from \"./row\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { SettingSection, generateSection } from \"./sidebarLeft\";\r\nimport AppAddMembersTab from \"./sidebarLeft/tabs/addMembers\";\r\nimport { SliderSuperTabEventable } from \"./sliderTab\";\r\n\r\ntype PrivacySectionStr = LangPackKey | '';\r\nexport default class PrivacySection {\r\n public radioRows: Map;\r\n public radioSection: SettingSection;\r\n public exceptions: Map;\r\n public peerIds: {\r\n disallow?: PeerId[],\r\n allow?: PeerId[]\r\n };\r\n public type: PrivacyType;\r\n\r\n constructor(public options: {\r\n tab: SliderSuperTabEventable,\r\n title: LangPackKey, \r\n inputKey: InputPrivacyKey['_'], \r\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\r\n appendTo?: Scrollable,\r\n noExceptions?: boolean,\r\n onRadioChange?: (value: number) => any,\r\n skipTypes?: PrivacyType[],\r\n exceptionTexts?: [LangPackKey, LangPackKey]\r\n }) {\r\n if(options.captions) {\r\n options.captions.reverse();\r\n }\r\n\r\n this.radioSection = new SettingSection({name: options.title, caption: true});\r\n\r\n this.radioRows = new Map();\r\n\r\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\r\n type: PrivacyType.Everybody,\r\n langKey: 'PrivacySettingsController.Everbody'\r\n }, {\r\n type: PrivacyType.Contacts,\r\n langKey: 'PrivacySettingsController.MyContacts'\r\n }, {\r\n type: PrivacyType.Nobody,\r\n langKey: 'PrivacySettingsController.Nobody'\r\n }];\r\n\r\n if(options.skipTypes) {\r\n r = r.filter(r => !options.skipTypes.includes(r.type));\r\n }\r\n \r\n const random = randomLong();\r\n r.forEach(({type, langKey}) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey, \r\n name: random, \r\n value: '' + type\r\n })\r\n });\r\n \r\n this.radioRows.set(type, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\r\n\r\n this.radioSection.content.append(form);\r\n if(options.appendTo) {\r\n options.appendTo.append(this.radioSection.container);\r\n }\r\n\r\n if(!options.noExceptions) {\r\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\r\n\r\n this.exceptions = new Map([[\r\n 'disallow', \r\n {\r\n titleLangKey: options.exceptionTexts[0],\r\n key: 'disallow',\r\n row: null,\r\n icon: 'deleteuser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ], [\r\n 'allow', \r\n {\r\n titleLangKey: options.exceptionTexts[1],\r\n key: 'allow',\r\n row: null,\r\n icon: 'adduser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ]]);\r\n\r\n this.exceptions.forEach((exception) => {\r\n exception.row = new Row(exception);\r\n\r\n exception.row.container.addEventListener('click', () => {\r\n promise.then(() => {\r\n const _peerIds = this.peerIds[exception.key];\r\n new AppAddMembersTab(options.tab.slider).open({\r\n type: 'privacy',\r\n skippable: true,\r\n title: exception.titleLangKey,\r\n placeholder: 'PrivacyModal.Search.Placeholder',\r\n takeOut: (newPeerIds) => {\r\n _peerIds.length = 0;\r\n _peerIds.push(...newPeerIds);\r\n exception.row.subtitle.innerHTML = '';\r\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\r\n },\r\n selectedPeerIds: _peerIds\r\n });\r\n });\r\n });\r\n\r\n container.append(exception.row.container);\r\n });\r\n }\r\n\r\n /* setTimeout(() => {\r\n this.setRadio(PrivacyType.Contacts);\r\n }, 0); */\r\n\r\n const promise = appPrivacyManager.getPrivacy(options.inputKey).then(rules => {\r\n const details = appPrivacyManager.getPrivacyRulesDetails(rules);\r\n this.setRadio(details.type);\r\n\r\n if(this.exceptions) {\r\n this.peerIds = {};\r\n ['allow' as const, 'disallow' as const].forEach(k => {\r\n const arr = [];\r\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\r\n arr.push(...from.users.map(id => id.toPeerId()));\r\n arr.push(...from.chats.map(id => id.toPeerId(true)));\r\n this.peerIds[k] = arr;\r\n const s = this.exceptions.get(k).row.subtitle;\r\n s.innerHTML = '';\r\n s.append(...this.generateStr(from));\r\n });\r\n }\r\n\r\n options.tab.eventListener.addEventListener('destroy', () => {\r\n const rules: InputPrivacyRule[] = [];\r\n\r\n switch(this.type) {\r\n case PrivacyType.Everybody:\r\n rules.push({_: 'inputPrivacyValueAllowAll'});\r\n break;\r\n case PrivacyType.Contacts:\r\n rules.push({_: 'inputPrivacyValueAllowContacts'});\r\n break;\r\n case PrivacyType.Nobody:\r\n rules.push({_: 'inputPrivacyValueDisallowAll'});\r\n break;\r\n }\r\n\r\n if(this.exceptions) {\r\n ([\r\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\r\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\r\n ] as Array<[\r\n 'allow' | 'disallow', \r\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants', \r\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\r\n ]>).forEach(([k, chatKey, usersKey], idx) => {\r\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\r\n return;\r\n }\r\n\r\n const _peerIds = this.peerIds[k];\r\n if(_peerIds) {\r\n const splitted = this.splitPeersByType(_peerIds);\r\n if(splitted.chats.length) {\r\n rules.push({_: chatKey, chats: splitted.chats});\r\n }\r\n \r\n if(splitted.users.length) {\r\n rules.push({_: usersKey, users: splitted.users.map(id => appUsersManager.getUserInput(id))});\r\n }\r\n }\r\n });\r\n }\r\n \r\n appPrivacyManager.setPrivacy(options.inputKey, rules);\r\n }, {once: true});\r\n });\r\n }\r\n\r\n private onRadioChange = (value: string | PrivacySection['type']) => {\r\n value = +value as PrivacySection['type'];\r\n this.type = value;\r\n\r\n const caption = this.options.captions[this.type];\r\n const captionElement = this.radioSection.caption;\r\n if(!caption) {\r\n captionElement.innerHTML = '';\r\n } else {\r\n _i18n(captionElement, caption);\r\n }\r\n captionElement.classList.toggle('hide', !caption);\r\n\r\n if(this.exceptions) {\r\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\r\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\r\n }\r\n\r\n this.options.onRadioChange && this.options.onRadioChange(value);\r\n };\r\n\r\n public setRadio(type: PrivacySection['type']) {\r\n const row = this.radioRows.get(type);\r\n this.onRadioChange(type);\r\n row.radioField.input.checked = true;\r\n }\r\n \r\n private splitPeersByType(peerIds: PeerId[]) {\r\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\r\n peerIds.forEach(peerId => {\r\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\r\n });\r\n\r\n return peers;\r\n }\r\n\r\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\r\n if(!peers.users.length && !peers.chats.length) {\r\n return [i18n('PrivacySettingsController.AddUsers')];\r\n }\r\n\r\n return join([\r\n peers.users.length ? i18n('Users', [peers.users.length]) : null, \r\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\r\n ].filter(Boolean), false);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\r\n this.setTitle('PrivacyPhone');\r\n\r\n const phoneCaption: LangPackKey = 'PrivacyPhoneInfo';\r\n const phoneSection = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle',\r\n inputKey: 'inputPrivacyKeyPhoneNumber',\r\n captions: [phoneCaption, phoneCaption, ''],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n onRadioChange: (type) => {\r\n s.setRadio(PrivacyType.Everybody);\r\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\r\n }\r\n });\r\n\r\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\r\n const s = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle2',\r\n inputKey: 'inputPrivacyKeyAddedByPhone',\r\n captions: [sCaption, sCaption, ''],\r\n noExceptions: true,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n\r\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport AppSettingsTab from \"../settings\";\r\n\r\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\r\n this.setTitle('TwoStepVerificationPasswordSet');\r\n\r\n const section = new SettingSection({\r\n caption: 'TwoStepVerificationPasswordSetInfo',\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🥳';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: true,\r\n play: true,\r\n width: 160,\r\n height: 160\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\r\n\r\n attachClickEvent(btnReturn, (e) => {\r\n this.close();\r\n });\r\n\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n\r\n inputWrapper.append(btnReturn);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\n\r\nexport function canFocus(isFirstInput: boolean) {\r\n return !IS_MOBILE_SAFARI || !isFirstInput;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport CodeInputField from \"../../../codeInputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport { i18n, _i18n } from \"../../../../lib/langPack\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\r\n public codeInputField: CodeInputField;\r\n public state: AccountPassword;\r\n public email: string;\r\n public length: number;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\r\n this.setTitle('TwoStepAuth.RecoveryTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\r\n\r\n const emoji = '📬';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.codeInputField = new CodeInputField({\r\n name: 'recovery-email-code',\r\n label: 'TwoStepAuth.RecoveryCode',\r\n length: this.length,\r\n onFill: (code) => {\r\n freeze(true);\r\n \r\n passwordManager.confirmPasswordEmail('' + code)\r\n .then(value => {\r\n if(!value) {\r\n\r\n }\r\n\r\n goNext();\r\n })\r\n .catch(err => {\r\n switch(err.type) {\r\n case 'CODE_INVALID':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\r\n break;\r\n\r\n case 'EMAIL_HASH_EXPIRED':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\r\n break;\r\n \r\n default:\r\n console.error('confirm error', err);\r\n break;\r\n }\r\n\r\n freeze(false);\r\n });\r\n }\r\n });\r\n\r\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\r\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\r\n\r\n const goNext = () => {\r\n new AppTwoStepVerificationSetTab(this.slider).open();\r\n };\r\n\r\n const freeze = (disable: boolean) => {\r\n toggleDisability([inputField.input, btnChange, btnResend], disable);\r\n };\r\n\r\n attachClickEvent(btnChange, (e) => {\r\n freeze(true);\r\n passwordManager.cancelPasswordEmail().then(value => {\r\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\r\n this.close();\r\n }, () => {\r\n freeze(false);\r\n });\r\n });\r\n\r\n attachClickEvent(btnResend, (e) => {\r\n freeze(true);\r\n const d = putPreloader(btnResend);\r\n passwordManager.resendPasswordEmail().then(value => {\r\n d.remove();\r\n freeze(false);\r\n });\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnChange, btnResend);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.codeInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport InputField from \"../../../inputField\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./emailConfirmation\";\r\nimport RichTextProcessor from \"../../../../lib/richtextprocessor\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n public hint: string;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\r\n this.setTitle('RecoveryEmailTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💌';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'recovery-email',\r\n label: 'RecoveryEmail',\r\n plainText: true\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n inputField.input.addEventListener('input', (e) => {\r\n inputField.input.classList.remove('error');\r\n });\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const goNext = () => {\r\n new AppTwoStepVerificationSetTab(this.slider).open();\r\n };\r\n\r\n const onContinueClick = () => {\r\n const email = inputField.value.trim();\r\n const match = RichTextProcessor.matchEmail(email);\r\n if(!match || match[0].length !== email.length) {\r\n inputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n toggleButtons(true);\r\n const d = putPreloader(btnContinue);\r\n\r\n passwordManager.updateSettings({\r\n hint: this.hint,\r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email\r\n }).then((value) => {\r\n goNext();\r\n }, (err) => {\r\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\r\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\r\n\r\n const tab = new AppTwoStepVerificationEmailConfirmationTab(this.slider);\r\n tab.state = this.state;\r\n tab.email = email;\r\n tab.length = symbols;\r\n tab.open();\r\n } else {\r\n console.log('password set error', err);\r\n }\r\n\r\n toggleButtons(false);\r\n d.remove();\r\n });\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n const toggleButtons = (freeze: boolean) => {\r\n if(freeze) {\r\n btnContinue.setAttribute('disabled', 'true');\r\n btnSkip.setAttribute('disabled', 'true');\r\n } else {\r\n btnContinue.removeAttribute('disabled');\r\n btnSkip.removeAttribute('disabled');\r\n }\r\n };\r\n\r\n attachClickEvent(btnSkip, (e) => {\r\n const popup = new PopupPeer('popup-skip-email', {\r\n buttons: [{\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }, {\r\n langKey: 'YourEmailSkip',\r\n callback: () => {\r\n //inputContent.classList.add('sidebar-left-section-disabled');\r\n toggleButtons(true);\r\n putPreloader(btnSkip);\r\n passwordManager.updateSettings({\r\n hint: this.hint, \r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email: ''\r\n }).then(() => {\r\n goNext();\r\n }, (err) => {\r\n toggleButtons(false);\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'YourEmailSkipWarning',\r\n descriptionLangKey: 'YourEmailSkipWarningText'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport InputField from \"../../../inputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { toast } from \"../../../toast\";\r\nimport I18n from \"../../../../lib/langPack\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\r\n this.setTitle('TwoStepAuth.SetupHintTitle');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💡';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'hint',\r\n label: 'TwoStepAuth.SetupHintPlaceholder'\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return inputField.value ? onContinueClick() : onSkipClick();\r\n }\r\n });\r\n\r\n const goNext = (e?: Event, saveHint?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n const hint = saveHint ? inputField.value : undefined;\r\n if(hint && this.newPassword === hint) {\r\n toast(I18n.format('PasswordAsHintError', true));\r\n return;\r\n }\r\n\r\n const tab = new AppTwoStepVerificationEmailTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.hint = hint;\r\n\r\n tab.open();\r\n };\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const onContinueClick = (e?: Event) => goNext(e, true);\r\n const onSkipClick = (e?: Event) => goNext(e, false);\r\n attachClickEvent(btnContinue, onContinueClick);\r\n attachClickEvent(btnSkip, onSkipClick);\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n section.content.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport TrackingMonkey from \"../../../monkeys/tracking\";\r\nimport AppTwoStepVerificationHintTab from \"./hint\";\r\nimport { InputState } from \"../../../inputField\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\r\n this.setTitle('PleaseReEnterPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 're-enter-password',\r\n label: 'PleaseReEnterPassword'\r\n });\r\n\r\n const monkey = new TrackingMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.setState(InputState.Neutral);\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(this.newPassword !== passwordInputField.value) {\r\n passwordInputField.setError();\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const onContinueClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = new AppTwoStepVerificationHintTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.open();\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n \r\n onOpenAfterTimeout() {\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AppTwoStepVerificationTab from \".\";\r\nimport { SettingSection } from \"../..\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport I18n, { i18n } from \"../../../../lib/langPack\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport RichTextProcessor from \"../../../../lib/richtextprocessor\";\r\nimport Button from \"../../../button\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport PasswordMonkey from \"../../../monkeys/password\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport AppTwoStepVerificationReEnterPasswordTab from \"./reEnterPassword\";\r\n\r\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public isFirst = true;\r\n \r\n protected init() {\r\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\r\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 'enter-password',\r\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\r\n labelText: !isNew && this.state.hint ? RichTextProcessor.wrapEmojiText(this.state.hint) : undefined\r\n });\r\n\r\n const monkey = new PasswordMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary');\r\n const textEl = new I18n.IntlElement({key: 'Continue'});\r\n\r\n btnContinue.append(textEl.element);\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.input.classList.remove('error');\r\n textEl.key = 'Continue';\r\n textEl.update();\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(!passwordInputField.value.length) {\r\n passwordInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n let onContinueClick: (e?: Event) => void;\r\n if(!isNew) {\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n \r\n return passwordManager.getState().then(_state => {\r\n this.state = _state;\r\n \r\n if(this.state.hint) {\r\n passwordInputField.label.innerHTML = RichTextProcessor.wrapEmojiText(this.state.hint);\r\n } else {\r\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\r\n }\r\n });\r\n };\r\n \r\n const submit = (e?: Event) => {\r\n if(!verifyInput()) {\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n btnContinue.setAttribute('disabled', 'true');\r\n textEl.key = 'PleaseWait';\r\n textEl.update();\r\n const preloader = putPreloader(btnContinue);\r\n \r\n const plainPassword = passwordInputField.value;\r\n passwordManager.check(passwordInputField.value, this.state).then(auth => {\r\n console.log(auth);\r\n \r\n if(auth._ === 'auth.authorization') {\r\n clearInterval(getStateInterval);\r\n if(monkey) monkey.remove();\r\n const tab = new AppTwoStepVerificationTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = plainPassword;\r\n tab.open();\r\n this.slider.removeTabFromHistory(this);\r\n }\r\n }, (err) => {\r\n btnContinue.removeAttribute('disabled');\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnContinue.innerText = err.type;\r\n textEl.key = 'TwoStepAuth.InvalidPassword';\r\n textEl.update();\r\n preloader.remove();\r\n passwordInputField.select();\r\n break;\r\n }\r\n \r\n getState();\r\n });\r\n };\r\n \r\n onContinueClick = submit;\r\n\r\n getState();\r\n } else {\r\n onContinueClick = (e) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = new AppTwoStepVerificationReEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.newPassword = passwordInputField.value;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n };\r\n }\r\n\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport { _i18n } from \"../../../../lib/langPack\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport Button from \"../../../button\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport AppSettingsTab from \"../settings\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./enterPassword\";\r\n\r\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\r\n this.setTitle('TwoStepVerificationTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🔐';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 168,\r\n height: 168,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const c = section.generateContentElement();\r\n if(this.state.pFlags.has_password) {\r\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\r\n\r\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\r\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\r\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\r\n\r\n attachClickEvent(btnChangePassword, () => {\r\n const tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n });\r\n\r\n attachClickEvent(btnDisablePassword, () => {\r\n const popup = new PopupPeer('popup-disable-password', {\r\n buttons: [{\r\n langKey: 'Disable',\r\n callback: () => {\r\n passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n this.close();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'TurnPasswordOffQuestionTitle',\r\n descriptionLangKey: 'TurnPasswordOffQuestion'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n attachClickEvent(btnSetRecoveryEmail, () => {\r\n const tab = new AppTwoStepVerificationEmailTab(this.slider);\r\n tab.state = this.state;\r\n tab.hint = this.state.hint;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.plainPassword;\r\n tab.isFirst = true;\r\n tab.open();\r\n });\r\n\r\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\r\n } else {\r\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\r\n \r\n inputWrapper.append(btnSetPassword);\r\n c.append(inputWrapper);\r\n\r\n attachClickEvent(btnSetPassword, (e) => {\r\n const tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.open();\r\n });\r\n }\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\r\n this.setTitle('PrivacyLastSeen');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'LastSeenTitle',\r\n inputKey: 'inputPrivacyKeyStatusTimestamp',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\r\n this.setTitle('PrivacyProfilePhoto');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyProfilePhotoTitle',\r\n inputKey: 'inputPrivacyKeyProfilePhoto',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\r\n this.setTitle('PrivacySettings.Forwards');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyForwardsTitle',\r\n inputKey: 'inputPrivacyKeyForwards',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\n\r\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\r\n this.setTitle('PrivacySettings.Groups');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanAddMe',\r\n inputKey: 'inputPrivacyKeyChatInvite',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.container.classList.add('privacy-tab', 'privacy-calls');\r\n this.setTitle('PrivacySettings.VoiceCalls');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanCallMe',\r\n inputKey: 'inputPrivacyKeyPhoneCall',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n\r\n {\r\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyP2PHeader',\r\n inputKey: 'inputPrivacyKeyPhoneP2P',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport Button from \"../../button\";\r\nimport Row from \"../../row\";\r\nimport { Authorization } from \"../../../layer\";\r\nimport { formatDateAccordingToTodayNew } from \"../../../helpers/date\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../../misc\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport { toast } from \"../../toast\";\r\nimport AppPrivacyAndSecurityTab from \"./privacyAndSecurity\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppActiveSessionsTab extends SliderSuperTab {\r\n public privacyTab: AppPrivacyAndSecurityTab;\r\n public authorizations: Authorization.authorization[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\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 });\r\n\r\n const auth = authorizations.findAndSplice(auth => auth.pFlags.current);\r\n const session = Session(auth);\r\n\r\n section.content.append(session.container);\r\n\r\n if(authorizations.length) {\r\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\r\n attachClickEvent(btnTerminate, (e) => {\r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n const toggle = toggleDisability([btnTerminate], true);\r\n apiManager.invokeApi('auth.resetAuthorizations').then(value => {\r\n //toggleDisability([btnTerminate], false);\r\n btnTerminate.remove();\r\n otherSection.container.remove();\r\n this.privacyTab.updateActiveSessions();\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 });\r\n\r\n authorizations.forEach(auth => {\r\n otherSection.content.append(Session(auth).container);\r\n });\r\n\r\n this.scrollable.append(otherSection.container);\r\n\r\n const onError = (err: any) => {\r\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\r\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\r\n }\r\n };\r\n\r\n let target: HTMLElement;\r\n const onTerminateClick = () => {\r\n const hash = target.dataset.hash;\r\n \r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n apiManager.invokeApi('account.resetAuthorization', {hash})\r\n .then(value => {\r\n if(value) {\r\n target.remove();\r\n this.privacyTab.updateActiveSessions();\r\n }\r\n }, onError);\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionTitle',\r\n descriptionLangKey: 'TerminateSessionText'\r\n }).show();\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'stop',\r\n text: 'Terminate',\r\n onClick: onTerminateClick\r\n }]);\r\n element.id = 'active-sessions-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n openBtnMenu(element);\r\n });\r\n\r\n attachClickEvent(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n onTerminateClick();\r\n });\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../../misc\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport PopupPickUser from \"../../popups/pickUser\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppBlockedUsersTab extends SliderSuperTab {\r\n public peerIds: PeerId[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.container.classList.add('blocked-users-container');\r\n this.setTitle('BlockedUsers');\r\n\r\n {\r\n const section = new SettingSection({\r\n caption: 'BlockedUsersInfo'\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\r\n this.content.append(btnAdd);\r\n\r\n attachClickEvent(btnAdd, (e) => {\r\n new PopupPickUser({\r\n peerTypes: ['contacts'],\r\n placeholder: 'BlockModal.Search.Placeholder',\r\n onSelect: (peerId) => {\r\n //console.log('block', peerId);\r\n appUsersManager.toggleBlock(peerId, true);\r\n },\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const list = appDialogsManager.createChatList();\r\n this.scrollable.container.classList.add('chatlist-container');\r\n this.scrollable.append(list);\r\n\r\n const add = (peerId: PeerId, append: boolean) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: list,\r\n drawStatus: false,\r\n rippleEnabled: true,\r\n avatarSize: 48,\r\n append\r\n });\r\n\r\n const user = appUsersManager.getUser(peerId);\r\n if(user.pFlags.bot) {\r\n dom.lastMessageSpan.append('@' + user.username);\r\n } else {\r\n if(user.phone) dom.lastMessageSpan.innerHTML = appUsersManager.formatUserPhone(user.phone);\r\n else dom.lastMessageSpan.append(user.username ? '@' + user.username : appUsersManager.getUserStatusString(peerId));\r\n }\r\n\r\n //dom.titleSpan.innerHTML = 'Raaid El Syed';\r\n //dom.lastMessageSpan.innerHTML = '+1 234 567891';\r\n };\r\n\r\n for(const peerId of this.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n let target: HTMLElement;\r\n const onUnblock = () => {\r\n const peerId = target.dataset.peerId.toPeerId();\r\n appUsersManager.toggleBlock(peerId, false);\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'lockoff',\r\n text: 'Unblock',\r\n onClick: onUnblock,\r\n options: {listenerSetter: this.listenerSetter}\r\n }]);\r\n element.id = 'blocked-users-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpTag(e.target, 'LI');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n openBtnMenu(element);\r\n }, this.listenerSetter);\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\r\n const {peerId, blocked} = update;\r\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\r\n if(blocked) {\r\n if(!li) {\r\n add(peerId, false);\r\n }\r\n } else {\r\n if(li) {\r\n li.remove();\r\n }\r\n }\r\n });\r\n\r\n const LOAD_COUNT = 50;\r\n let loading = false;\r\n this.scrollable.onScrolledBottom = () => {\r\n if(loading) {\r\n return;\r\n }\r\n\r\n loading = true;\r\n appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then(res => {\r\n for(const peerId of res.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\r\n this.scrollable.onScrolledBottom = null;\r\n }\r\n\r\n this.scrollable.checkForTriggers();\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.scrollable.onScroll();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport { AccountPassword, Authorization, InputPrivacyKey, Updates } from \"../../../layer\";\r\nimport appPrivacyManager, { PrivacyType } from \"../../../lib/appManagers/appPrivacyManager\";\r\nimport AppPrivacyPhoneNumberTab from \"./privacy/phoneNumber\";\r\nimport AppTwoStepVerificationTab from \"./2fa\";\r\nimport passwordManager from \"../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./2fa/enterPassword\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./2fa/emailConfirmation\";\r\nimport AppPrivacyLastSeenTab from \"./privacy/lastSeen\";\r\nimport AppPrivacyProfilePhotoTab from \"./privacy/profilePhoto\";\r\nimport AppPrivacyForwardMessagesTab from \"./privacy/forwardMessages\";\r\nimport AppPrivacyAddToGroupsTab from \"./privacy/addToGroups\";\r\nimport AppPrivacyCallsTab from \"./privacy/calls\";\r\nimport AppActiveSessionsTab from \"./activeSessions\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport AppBlockedUsersTab from \"./blockedUsers\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { convertKeyToInputKey } from \"../../../helpers/string\";\r\nimport { i18n, LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport appDraftsManager from \"../../../lib/appManagers/appDraftsManager\";\r\nimport Button from \"../../button\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\r\n private activeSessionsRow: Row;\r\n private authorizations: Authorization.authorization[];\r\n\r\n protected init() {\r\n this.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});\r\n\r\n let blockedPeerIds: PeerId[];\r\n const blockedUsersRow = new Row({\r\n icon: 'deleteuser',\r\n titleLangKey: 'BlockedUsers',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = new AppBlockedUsersTab(this.slider);\r\n tab.peerIds = blockedPeerIds;\r\n tab.open();\r\n }\r\n });\r\n blockedUsersRow.freezed = true;\r\n\r\n let passwordState: AccountPassword;\r\n const twoFactorRowOptions = {\r\n icon: 'lock',\r\n titleLangKey: 'TwoStepVerification' as LangPackKey,\r\n subtitleLangKey: SUBTITLE,\r\n clickable: (e: Event) => {\r\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\r\n if(passwordState.pFlags.has_password) {\r\n tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n } else if(passwordState.email_unconfirmed_pattern) {\r\n tab = new AppTwoStepVerificationEmailConfirmationTab(this.slider);\r\n tab.email = passwordState.email_unconfirmed_pattern;\r\n tab.length = 6;\r\n tab.isFirst = true;\r\n passwordManager.resendPasswordEmail();\r\n } else {\r\n tab = new AppTwoStepVerificationTab(this.slider);\r\n }\r\n \r\n tab.state = passwordState;\r\n tab.open();\r\n }\r\n };\r\n \r\n const twoFactorRow = new Row(twoFactorRowOptions);\r\n twoFactorRow.freezed = true;\r\n\r\n const activeSessionsRow = this.activeSessionsRow = new Row({\r\n icon: 'activesessions',\r\n titleLangKey: 'SessionsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = new AppActiveSessionsTab(this.slider);\r\n tab.privacyTab = this;\r\n tab.authorizations = this.authorizations;\r\n tab.open();\r\n }\r\n });\r\n activeSessionsRow.freezed = true;\r\n\r\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n const setBlockedCount = (count: number) => {\r\n if(count) {\r\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\r\n } else {\r\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\r\n }\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', () => {\r\n /* const {blocked, peerId} = update;\r\n if(!blocked) blockedPeerIds.findAndSplice(p => p === peerId);\r\n else blockedPeerIds.unshift(peerId);\r\n blockedCount += blocked ? 1 : -1;\r\n setBlockedCount(blockedCount); */\r\n updateBlocked();\r\n });\r\n\r\n const updateBlocked = () => {\r\n appUsersManager.getBlocked().then(res => {\r\n blockedUsersRow.freezed = false;\r\n setBlockedCount(res.count);\r\n blockedPeerIds = res.peerIds;\r\n });\r\n };\r\n\r\n updateBlocked();\r\n\r\n passwordManager.getState().then(state => {\r\n passwordState = state;\r\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\r\n twoFactorRow.freezed = false;\r\n \r\n //console.log('password state', state);\r\n });\r\n\r\n this.updateActiveSessions();\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'PrivacyTitle'});\r\n\r\n section.content.classList.add('privacy-navigation-container');\r\n\r\n const rowsByKeys: Partial<{\r\n [key in InputPrivacyKey['_']]: Row\r\n }> = {};\r\n\r\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\r\n titleLangKey: 'PrivacyPhoneTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyPhoneNumberTab(this.slider).open();\r\n }\r\n });\r\n\r\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\r\n titleLangKey: 'LastSeenTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyLastSeenTab(this.slider).open();\r\n }\r\n });\r\n\r\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\r\n titleLangKey: 'PrivacyProfilePhotoTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyProfilePhotoTab(this.slider).open();\r\n }\r\n });\r\n\r\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\r\n titleLangKey: 'WhoCanCallMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyCallsTab(this.slider).open();\r\n }\r\n });\r\n\r\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\r\n titleLangKey: 'PrivacyForwardsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyForwardMessagesTab(this.slider).open();\r\n }\r\n });\r\n\r\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\r\n titleLangKey: 'WhoCanAddMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyAddToGroupsTab(this.slider).open();\r\n }\r\n });\r\n\r\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\r\n const row = rowsByKeys[key];\r\n if(!row) {\r\n return;\r\n }\r\n\r\n appPrivacyManager.getPrivacy(key).then(rules => {\r\n const details = appPrivacyManager.getPrivacyRulesDetails(rules);\r\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\r\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\r\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\r\n\r\n row.subtitle.innerHTML = '';\r\n const s = i18n(langKey);\r\n row.subtitle.append(s);\r\n if(disallowLength || allowLength) {\r\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\r\n }\r\n });\r\n };\r\n\r\n section.content.append(numberVisibilityRow.container, lastSeenTimeRow.container, photoVisibilityRow.container, callRow.container, linkAccountRow.container, groupChatsAddRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n for(const key in rowsByKeys) {\r\n updatePrivacyRow(key as keyof typeof rowsByKeys);\r\n }\r\n\r\n rootScope.addEventListener('privacy_update', (update) => {\r\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\r\n });\r\n }\r\n\r\n const promises: Promise[] = [];\r\n {\r\n const section = new SettingSection({name: 'Privacy.SensitiveContent'});\r\n section.container.classList.add('hide');\r\n\r\n promises.push(apiManager.invokeApi('account.getContentSettings').then(settings => {\r\n if(!settings.pFlags.sensitive_can_change) {\r\n return;\r\n }\r\n \r\n const enabled = settings.pFlags.sensitive_enabled;\r\n\r\n const sensitiveRow = new Row({\r\n checkboxField: new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText', checked: enabled}),\r\n subtitleLangKey: 'PrivacyAndSecurity.SensitiveDesc',\r\n noCheckboxSubtitle: true\r\n });\r\n \r\n section.content.append(sensitiveRow.container);\r\n section.container.classList.remove('hide');\r\n \r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = sensitiveRow.checkboxField.checked;\r\n const isChanged = _enabled !== enabled;\r\n if(!isChanged) {\r\n return;\r\n }\r\n \r\n apiManager.invokeApi('account.setContentSettings', {\r\n sensitive_enabled: _enabled\r\n });\r\n }, {once: true});\r\n }));\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'FilterChats'});\r\n\r\n const onDeleteClick = () => {\r\n const popup = new PopupPeer('popup-delete-drafts', {\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([deleteButton], true);\r\n appDraftsManager.clearAllDrafts().then(() => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'AreYouSureClearDraftsTitle',\r\n descriptionLangKey: 'AreYouSureClearDrafts'\r\n });\r\n \r\n popup.show();\r\n };\r\n\r\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\r\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\r\n section.content.append(deleteButton);\r\n\r\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then(drafts => {\r\n const draftsRow = new Row({\r\n titleLangKey: 'PrivacyDeleteCloudDrafts',\r\n subtitleLangKey: 'Drafts',\r\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\r\n icon: 'delete',\r\n clickable: onDeleteClick\r\n });\r\n \r\n section.content.append(draftsRow.container);\r\n })); */\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public updateActiveSessions() {\r\n apiManager.invokeApi('account.getAuthorizations').then(auths => {\r\n this.activeSessionsRow.freezed = false;\r\n this.authorizations = auths.authorizations;\r\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\r\n //console.log('auths', auths);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\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\n\r\n/**\r\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\r\n */\r\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\r\n r /= 255, g /= 255, b /= 255;\r\n const max = Math.max(r, g, b),\r\n min = Math.min(r, g, b);\r\n let h, s, l = (max + min) / 2;\r\n\r\n if(max === min) {\r\n h = s = 0; // achromatic\r\n } else {\r\n let d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max) {\r\n case r:\r\n h = (g - b) / d + (g < b ? 6 : 0);\r\n break;\r\n case g:\r\n h = (b - r) / d + 2;\r\n break;\r\n case b:\r\n h = (r - g) / d + 4;\r\n break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n return {\r\n h: h * 360,\r\n s: s * 100,\r\n l: l * 100,\r\n a\r\n };\r\n}\r\n\r\n// * https://stackoverflow.com/a/9493060/6758968\r\n/**\r\n * Converts an HSL color value to RGB. Conversion formula\r\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\r\n * Assumes h in [0, 360], s, and l are contained in the set [0, 1], a in [0, 1] and\r\n * returns r, g, and b in the set [0, 255].\r\n *\r\n * @param {number} h The hue\r\n * @param {number} s The saturation\r\n * @param {number} l The lightness\r\n * @return {Array} The RGB representation\r\n */\r\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\r\n h /= 360, s /= 100, l /= 100;\r\n let r: number, g: number, b: number;\r\n\r\n if(s === 0) {\r\n r = g = b = l; // achromatic\r\n } else {\r\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\r\n if(t < 0) t += 1;\r\n if(t > 1) t -= 1;\r\n if(t < 1/6) return p + (q - p) * 6 * t;\r\n if(t < 1/2) return q;\r\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n }\r\n\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1/3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1/3);\r\n }\r\n\r\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), Math.round(a * 255)];\r\n}\r\n\r\nexport function hslaStringToRgba(hsla: string) {\r\n const splitted = hsla.slice(5, -1).split(', ');\r\n const alpha = +splitted.pop();\r\n const arr = splitted.map((val) => {\r\n if(val.endsWith('%')) {\r\n return +val.slice(0, -1);\r\n }\r\n \r\n return +val;\r\n });\r\n\r\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\r\n}\r\n\r\nexport function hexaToRgba(hexa: string) {\r\n const arr: ColorRgba = [] as any;\r\n const offset = 1;\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 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) {\r\n return '#' + rgba.map(v => ('0' + v.toString(16)).slice(-2)).join('');\r\n}\r\n\r\nexport function hslaStringToHexa(hsla: string) {\r\n return rgbaToHexa(hslaStringToRgba(hsla));\r\n}\r\n\r\nexport function hslaStringToHex(hsla: string) {\r\n return hslaStringToHexa(hsla).slice(0, -2);\r\n}\r\n","import { rgbaToHsla } from \"./color\";\r\n\r\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\r\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\r\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\r\n if(s > 0) {\r\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\r\n }\r\n l = Math.max(0, l * .65);\r\n \r\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\r\n return hsla;\r\n}\r\n","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\";\r\nimport InputField, { InputState } from \"./inputField\";\r\n\r\nexport type ColorPickerColor = { \r\n hsl: string; \r\n rgb: string; \r\n hex: string; \r\n hsla: string; \r\n rgba: string; \r\n hexa: string; \r\n rgbaArray: ColorRgba; \r\n};\r\n\r\nexport default class ColorPicker {\r\n private static BASE_CLASS = 'color-picker';\r\n public container: HTMLElement;\r\n\r\n private boxRect: DOMRect;\r\n //private boxDraggerRect: DOMRect;\r\n private hueRect: DOMRect;\r\n //private hueDraggerRect: DOMRect;\r\n\r\n\tprivate hue = 0;\r\n\tprivate saturation = 100;\r\n\tprivate lightness = 50;\r\n\tprivate alpha = 1;\r\n private elements: {\r\n box: SVGSVGElement,\r\n boxDragger: SVGSVGElement,\r\n sliders: HTMLElement,\r\n hue: SVGSVGElement,\r\n hueDragger: SVGSVGElement,\r\n saturation: SVGLinearGradientElement,\r\n } = {} as any;\r\n private hexInputField: InputField;\r\n private rgbInputField: InputField;\r\n public onChange: (color: ReturnType) => void;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add(ColorPicker.BASE_CLASS);\r\n\r\n const html = `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n\r\n this.container.innerHTML = html;\r\n\r\n this.elements.box = this.container.firstElementChild as any;\r\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\r\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\r\n\r\n this.elements.sliders = this.elements.box.nextElementSibling as any;\r\n\r\n this.elements.hue = this.elements.sliders.firstElementChild as any;\r\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\r\n\r\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\r\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\r\n\r\n const inputs = document.createElement('div');\r\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\r\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\r\n this.container.append(inputs);\r\n\r\n this.hexInputField.input.addEventListener('input', () => {\r\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\r\n\r\n const match = value.match(/([a-fA-F\\d]+)/);\r\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\r\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\r\n\r\n value = '#' + value;\r\n this.hexInputField.setValueSilently(value);\r\n \r\n if(valid) {\r\n this.setColor(value, false, true);\r\n }\r\n });\r\n\r\n // patched https://stackoverflow.com/a/34029238/6758968\r\n const rgbRegExp = /^(?:rgb)?\\(?([01]?\\d\\d?|2[0-4]\\d|25[0-5])(?:\\W+)([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\W+(?:([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\)?)$/;\r\n this.rgbInputField.input.addEventListener('input', () => {\r\n const match = this.rgbInputField.value.match(rgbRegExp);\r\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\r\n\r\n if(match) {\r\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\r\n }\r\n });\r\n\r\n this.attachBoxListeners();\r\n this.attachHueListeners();\r\n }\r\n\r\n private onGrabStart = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\r\n };\r\n\r\n private onGrabEnd = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\r\n };\r\n\r\n private attachBoxListeners() {\r\n attachGrabListeners(this.elements.box as any, () => {\r\n this.onGrabStart();\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n //this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.saturationHandler(pos.x, pos.y);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n private attachHueListeners() {\r\n attachGrabListeners(this.elements.hue as any, () => {\r\n this.onGrabStart();\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n //this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.hueHandler(pos.x);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\r\n if(color === undefined) { // * set to red\r\n color = {\r\n h: 0,\r\n s: 100,\r\n l: 50,\r\n a: 1\r\n };\r\n } else if(typeof(color) === 'string') {\r\n if(color[0] === '#') {\r\n color = hexaToHsla(color);\r\n } else {\r\n const rgb = color.match(/[.?\\d]+/g);\r\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\r\n }\r\n }\r\n\r\n // Set box\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n\r\n const boxX = this.boxRect.width / 100 * color.s;\r\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\r\n const boxY = this.boxRect.height / 100 * percentY;\r\n\r\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\r\n\r\n // Set hue\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n\r\n const percentHue = color.h / 360;\r\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\r\n\r\n this.hueHandler(hueX, false);\r\n\r\n // Set values\r\n this.hue = color.h;\r\n this.saturation = color.s;\r\n this.lightness = color.l;\r\n this.alpha = color.a;\r\n\r\n this.updatePicker(updateHexInput, updateRgbInput);\r\n };\r\n\r\n public getCurrentColor(): ColorPickerColor {\r\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\r\n const hexa = rgbaToHexa(rgbaArray);\r\n const hex = hexa.slice(0, -2);\r\n\r\n return {\r\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\r\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\r\n hex: hex,\r\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\r\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\r\n hexa: hexa,\r\n rgbaArray: rgbaArray\r\n };\r\n }\r\n\r\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\r\n const color = this.getCurrentColor();\r\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\r\n\r\n if(updateHexInput) {\r\n this.hexInputField.setValueSilently(color.hex);\r\n this.hexInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(updateRgbInput) {\r\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\r\n this.rgbInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.onChange) {\r\n this.onChange(color);\r\n }\r\n }\r\n\r\n private hueHandler(pageX: number, update = true) {\r\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\r\n\r\n const percents = eventX / this.hueRect.width;\r\n this.hue = Math.round(360 * percents);\r\n \r\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\r\n\r\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\r\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\r\n \r\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n }\r\n\r\n private saturationHandler(pageX: number, pageY: number, update = true) {\r\n const maxX = this.boxRect.width;\r\n const maxY = this.boxRect.height;\r\n\r\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\r\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\r\n\r\n const posX = eventX / maxX * 100;\r\n const posY = eventY / maxY * 100;\r\n \r\n const boxDragger = this.elements.boxDragger;\r\n boxDragger.setAttributeNS(null, 'x', posX + '%');\r\n boxDragger.setAttributeNS(null, 'y', posY + '%');\r\n\r\n const saturation = clamp(posX, 0, 100);\r\n\r\n const lightnessX = 100 - saturation / 2;\r\n const lightnessY = 100 - clamp(posY, 0, 100);\r\n\r\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\r\n\r\n this.saturation = saturation;\r\n this.lightness = lightness;\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport { hexaToRgba } from \"../../../helpers/color\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport throttle from \"../../../helpers/schedulers/throttle\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appStateManager, { Theme } from \"../../../lib/appManagers/appStateManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport ColorPicker, { ColorPickerColor } from \"../../colorPicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppBackgroundColorTab extends SliderSuperTab {\r\n private colorPicker: ColorPicker;\r\n private grid: HTMLElement;\r\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\r\n private theme: Theme;\r\n\r\n init() {\r\n this.container.classList.add('background-container', 'background-color-container');\r\n this.setTitle('SetColor');\r\n\r\n this.theme = rootScope.getTheme();\r\n\r\n const section = new SettingSection({});\r\n this.colorPicker = new ColorPicker();\r\n\r\n section.content.append(this.colorPicker.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const 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 this.scrollable.append(grid);\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.type === '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.color = hex.toLowerCase();\r\n background.type = 'color';\r\n background.highlightningColor = hsla;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n \r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.setActive();\r\n }\r\n };\r\n\r\n private onColorChange = (color: ColorPickerColor) => {\r\n this.applyColor(color.hex, false);\r\n };\r\n\r\n onOpen() {\r\n setTimeout(() => {\r\n const background = this.theme.background;\r\n\r\n // * set active if type is color\r\n if(background.type === 'color') {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n\r\n this.colorPicker.setColor(background.color || '#cccccc');\r\n \r\n if(background.type !== 'color') {\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 } from \"../../../helpers/averageColor\";\r\nimport blur from \"../../../helpers/blur\";\r\nimport { deferredPromise } from \"../../../helpers/cancellablePromise\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { requestFile } from \"../../../helpers/files\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport { copy } from \"../../../helpers/object\";\r\nimport sequentialDom from \"../../../helpers/sequentialDom\";\r\nimport { AccountWallPapers, PhotoSize, WallPaper } from \"../../../layer\";\r\nimport appDocsManager, { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager from \"../../../lib/appManagers/appDownloadManager\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appPhotosManager from \"../../../lib/appManagers/appPhotosManager\";\r\nimport appStateManager, { Theme, STATE_INIT } from \"../../../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport ProgressivePreloader from \"../../preloader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { wrapPhoto } from \"../../wrappers\";\r\nimport AppBackgroundColorTab from \"./backgroundColor\";\r\n\r\nlet uploadTempId = 0;\r\n\r\nexport default class AppBackgroundTab extends SliderSuperTab {\r\n private grid: HTMLElement;\r\n private tempId = 0;\r\n private theme: Theme;\r\n private clicked: Set = new Set();\r\n private blurCheckboxField: CheckboxField;\r\n\r\n init() {\r\n this.container.classList.add('background-container', 'background-image-container');\r\n this.setTitle('ChatBackground');\r\n\r\n this.theme = rootScope.getTheme();\r\n\r\n {\r\n const container = generateSection(this.scrollable);\r\n\r\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\r\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\r\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\r\n\r\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(colorButton, () => {\r\n new AppBackgroundColorTab(this.slider).open();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\r\n\r\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\r\n text: 'ChatBackground.Blur', \r\n name: 'blur', \r\n checked: this.theme.background.blur,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(blurCheckboxField.input)('change', () => {\r\n this.theme.background.blur = blurCheckboxField.input.checked;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n const active = grid.querySelector('.active') as HTMLElement;\r\n if(!active) return;\r\n\r\n // * wait for animation end\r\n setTimeout(() => {\r\n this.setBackgroundDocument(active.dataset.slug, appDocsManager.getDoc(active.dataset.docId));\r\n }, 100);\r\n });\r\n\r\n container.append(uploadButton, colorButton, resetButton, blurCheckboxField.label);\r\n }\r\n\r\n rootScope.addEventListener('background_change', this.setActive);\r\n\r\n apiManager.invokeApiHashable('account.getWallPapers').then((accountWallpapers) => {\r\n const wallpapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers as WallPaper.wallPaper[];\r\n wallpapers.forEach((wallpaper) => {\r\n this.addWallPaper(wallpaper);\r\n });\r\n\r\n //console.log(accountWallpapers);\r\n });\r\n\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\r\n this.scrollable.append(grid);\r\n }\r\n\r\n private onUploadClick = () => {\r\n requestFile('image/x-png,image/png,image/jpeg').then(file => {\r\n const id = 'wallpaper-upload-' + ++uploadTempId;\r\n\r\n const thumb = {\r\n _: 'photoSize',\r\n h: 0,\r\n w: 0,\r\n location: {} as any,\r\n size: file.size,\r\n type: 'full',\r\n } as PhotoSize.photoSize;\r\n let document: MyDocument = {\r\n _: 'document',\r\n access_hash: '',\r\n attributes: [],\r\n dc_id: 0,\r\n file_reference: [],\r\n id,\r\n mime_type: file.type,\r\n size: file.size,\r\n date: Date.now() / 1000,\r\n pFlags: {},\r\n thumbs: [thumb],\r\n file_name: file.name\r\n };\r\n\r\n document = appDocsManager.saveDoc(document);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(document);\r\n cacheContext.downloaded = file.size;\r\n cacheContext.url = URL.createObjectURL(file);\r\n\r\n let wallpaper: WallPaper.wallPaper = {\r\n _: 'wallPaper',\r\n access_hash: '',\r\n document: document,\r\n id,\r\n slug: id,\r\n pFlags: {}\r\n };\r\n\r\n const upload = appDownloadManager.upload(file, file.name);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = upload.addNotifyListener;\r\n deferred.cancel = upload.cancel;\r\n\r\n upload.then(inputFile => {\r\n apiManager.invokeApi('account.uploadWallPaper', {\r\n file: inputFile,\r\n mime_type: file.type,\r\n settings: {\r\n _: 'wallPaperSettings'\r\n }\r\n }).then(_wallpaper => {\r\n const newDoc = (_wallpaper as WallPaper.wallPaper).document as MyDocument;\r\n const newCacheContext = appDownloadManager.getCacheContext(newDoc);\r\n Object.assign(newCacheContext, cacheContext);\r\n\r\n wallpaper = _wallpaper as WallPaper.wallPaper;\r\n wallpaper.document = appDocsManager.saveDoc(wallpaper.document);\r\n\r\n container.dataset.docId = '' + wallpaper.document.id;\r\n container.dataset.slug = wallpaper.slug;\r\n \r\n this.setBackgroundDocument(wallpaper.slug, wallpaper.document).then(deferred.resolve, deferred.reject);\r\n }, deferred.reject);\r\n }, deferred.reject);\r\n\r\n deferred.then(() => {\r\n this.clicked.delete(wallpaper.document.id);\r\n }, (err) => {\r\n container.remove();\r\n //console.error('i saw the body drop', err);\r\n });\r\n\r\n const preloader = new ProgressivePreloader({\r\n isUpload: true,\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const container = this.addWallPaper(wallpaper, false);\r\n this.clicked.add(wallpaper.document.id);\r\n\r\n preloader.attach(container, false, deferred);\r\n });\r\n };\r\n\r\n private onResetClick = () => {\r\n const defaultTheme = STATE_INIT.settings.themes.find(t => t.name === this.theme.name);\r\n if(defaultTheme) {\r\n ++this.tempId;\r\n this.theme.background = copy(defaultTheme.background);\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.blurCheckboxField.setValueSilently(this.theme.background.blur);\r\n }\r\n };\r\n\r\n private addWallPaper(wallpaper: WallPaper.wallPaper, append = true) {\r\n if(wallpaper.pFlags.pattern || \r\n !wallpaper.document || \r\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0) {\r\n return;\r\n }\r\n\r\n wallpaper.document = appDocsManager.saveDoc(wallpaper.document);\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('grid-item');\r\n\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n\r\n const wrapped = wrapPhoto({\r\n photo: wallpaper.document,\r\n message: null,\r\n container: media,\r\n withoutPreloader: true,\r\n size: appPhotosManager.choosePhotoSize(wallpaper.document, 200, 200)\r\n });\r\n\r\n container.dataset.docId = '' + wallpaper.document.id;\r\n container.dataset.slug = wallpaper.slug;\r\n\r\n if(this.theme.background.type === 'image' && this.theme.background.slug === wallpaper.slug) {\r\n container.classList.add('active');\r\n }\r\n\r\n (wrapped.loadPromises.thumb || wrapped.loadPromises.full).then(() => {\r\n sequentialDom.mutate(() => {\r\n container.append(media);\r\n });\r\n });\r\n\r\n 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 {docId, slug} = target.dataset;\r\n if(this.clicked.has(docId)) return;\r\n this.clicked.add(docId);\r\n\r\n const preloader = new ProgressivePreloader({\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n const load = () => {\r\n const promise = this.setBackgroundDocument(slug, doc);\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(!cacheContext.url || this.theme.background.blur) {\r\n preloader.attach(target, true, promise);\r\n }\r\n };\r\n\r\n preloader.construct();\r\n\r\n attachClickEvent(target, (e) => {\r\n if(preloader.preloader.parentElement) {\r\n preloader.onClick(e);\r\n preloader.detach();\r\n } else {\r\n load();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n load();\r\n\r\n //console.log(doc);\r\n };\r\n\r\n private saveToCache = (slug: string, url: string) => {\r\n fetch(url).then(response => {\r\n appDownloadManager.cacheStorage.save('backgrounds/' + slug, response);\r\n });\r\n };\r\n\r\n private setBackgroundDocument = (slug: string, doc: MyDocument) => {\r\n let _tempId = ++this.tempId;\r\n const middleware = () => _tempId === this.tempId;\r\n\r\n const download = appDocsManager.downloadDoc(doc, appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = download.addNotifyListener;\r\n deferred.cancel = download.cancel;\r\n\r\n download.then(() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n const background = this.theme.background;\r\n const onReady = (url: string) => {\r\n //const perf = performance.now();\r\n averageColor(url).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 //console.log(doc, hsla, performance.now() - perf);\r\n\r\n background.slug = slug;\r\n background.type = 'image';\r\n background.highlightningColor = hsla;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n this.saveToCache(slug, url);\r\n appImManager.applyCurrentTheme(slug, url).then(deferred.resolve);\r\n });\r\n };\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(background.blur) {\r\n setTimeout(() => {\r\n blur(cacheContext.url, 12, 4)\r\n .then(url => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n onReady(url);\r\n });\r\n }, 200);\r\n } else {\r\n onReady(cacheContext.url);\r\n }\r\n });\r\n\r\n return deferred;\r\n };\r\n\r\n private setActive = () => {\r\n const active = this.grid.querySelector('.active');\r\n const background = this.theme.background;\r\n const target = background.type === 'image' ? this.grid.querySelector(`.grid-item[data-slug=\"${background.slug}\"]`) : 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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport renderImageFromUrl from \"./dom/renderImageFromUrl\";\r\n\r\nexport const averageColor = (imageUrl: string): Promise => {\r\n const img = document.createElement('img');\r\n return new Promise((resolve) => {\r\n renderImageFromUrl(img, imageUrl, () => {\r\n const canvas = document.createElement('canvas');\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const DIMENSIONS = 50;\r\n if(ratio === 1) {\r\n canvas.width = DIMENSIONS;\r\n canvas.height = canvas.width / ratio;\r\n } else if(ratio > 1) {\r\n canvas.height = DIMENSIONS;\r\n canvas.width = canvas.height / ratio;\r\n } else {\r\n canvas.width = canvas.height = DIMENSIONS;\r\n }\r\n \r\n const context = canvas.getContext('2d');\r\n context.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, 0, 0, canvas.width, canvas.height);\r\n\r\n const pixel = new Array(4).fill(0);\r\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\r\n for(let i = 0; i < pixels.length; i += 4) {\r\n pixel[0] += pixels[i];\r\n pixel[1] += pixels[i + 1];\r\n pixel[2] += pixels[i + 2];\r\n pixel[3] += pixels[i + 3];\r\n }\r\n\r\n const pixelsLength = pixels.length / 4;\r\n const outPixel = new Uint8ClampedArray(4);\r\n outPixel[0] = pixel[0] / pixelsLength;\r\n outPixel[1] = pixel[1] / pixelsLength;\r\n outPixel[2] = pixel[2] / pixelsLength;\r\n outPixel[3] = pixel[3] / pixelsLength;\r\n resolve(outPixel);\r\n });\r\n });\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement from \".\";\r\nimport appStickersManager, { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport { RichTextProcessor } from \"../../lib/richtextprocessor\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { wrapSticker } from \"../wrappers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport { putPreloader } from \"../misc\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport { StickerSet } from \"../../layer\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport Button from \"../button\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport toggleDisability from \"../../helpers/dom/toggleDisability\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\n\r\nconst ANIMATION_GROUP = 'STICKERS-POPUP';\r\n\r\nexport default class PopupStickers extends PopupElement {\r\n private stickersFooter: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n private h6: HTMLElement;\r\n\r\n private set: StickerSet.stickerSet;\r\n\r\n constructor(private stickerSetInput: Parameters[0]) {\r\n super('popup-stickers', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n this.h6.append(i18n('Loading'));\r\n\r\n this.header.append(this.h6);\r\n\r\n this.addEventListener('close', () => {\r\n animationIntersector.setOnlyOnePlayableGroup('');\r\n });\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('sticker-set-stickers', 'is-loading');\r\n\r\n attachClickEvent(this.stickersDiv, this.onStickersClick, {listenerSetter: this.listenerSetter});\r\n\r\n putPreloader(this.stickersDiv, true);\r\n\r\n this.stickersFooter = document.createElement('div');\r\n this.stickersFooter.classList.add('sticker-set-footer');\r\n\r\n div.append(this.stickersDiv);\r\n\r\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\r\n this.stickersFooter.append(btn);\r\n\r\n this.body.append(div);\r\n const scrollable = new Scrollable(this.body);\r\n this.body.append(this.stickersFooter);\r\n \r\n // const editButton = document.createElement('button');\r\n // editButton.classList.add('btn-primary');\r\n\r\n // this.stickersFooter.append(editButton);\r\n\r\n this.loadStickerSet();\r\n }\r\n\r\n private onStickersClick = (e: MouseEvent) => {\r\n const target = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n this.hide();\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n private loadStickerSet() {\r\n return appStickersManager.getStickerSet(this.stickerSetInput).then(set => {\r\n //console.log('PopupStickers loadStickerSet got set:', set);\r\n\r\n this.set = set.set;\r\n\r\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\r\n\r\n this.h6.innerHTML = RichTextProcessor.wrapEmojiText(set.set.title);\r\n this.stickersFooter.classList.toggle('add', !set.set.installed_date);\r\n\r\n let button: HTMLElement;\r\n if(set.set.installed_date) {\r\n button = Button('btn-primary btn-primary-transparent danger', {noRipple: true});\r\n button.append(i18n('RemoveStickersCount', [i18n('Stickers', [set.set.count])]));\r\n } else {\r\n button = Button('btn-primary btn-color-primary', {noRipple: true});\r\n button.append(i18n('AddStickersCount', [i18n('Stickers', [set.set.count])]));\r\n }\r\n\r\n this.stickersFooter.textContent = '';\r\n this.stickersFooter.append(button);\r\n\r\n attachClickEvent(button, () => {\r\n const toggle = toggleDisability([button], true);\r\n\r\n appStickersManager.toggleStickerSet(this.set).then(() => {\r\n this.hide();\r\n }).catch(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n \r\n this.stickersDiv.classList.remove('is-loading');\r\n this.stickersDiv.innerHTML = '';\r\n for(let doc of set.documents) {\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n \r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set-sticker');\r\n\r\n const size = mediaSizes.active.esgSticker.width;\r\n \r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue, \r\n group: ANIMATION_GROUP, \r\n play: true,\r\n loop: true,\r\n width: size,\r\n height: size\r\n });\r\n\r\n this.stickersDiv.append(div);\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 RangeSelector from \"../../rangeSelector\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport RadioField from \"../../radioField\";\r\nimport appStateManager, { State } from \"../../../lib/appManagers/appStateManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { IS_APPLE } from \"../../../environment/userAgent\";\r\nimport Row from \"../../row\";\r\nimport AppBackgroundTab from \"./background\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport assumeType from \"../../../helpers/assumeType\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport { wrapStickerSetThumb } from \"../../wrappers\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport eachMinute from \"../../../helpers/eachMinute\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\n\r\nexport class RangeSettingSelector {\r\n public container: HTMLDivElement;\r\n private range: RangeSelector;\r\n\r\n public onChange: (value: number) => void;\r\n\r\n constructor(name: LangPackKey, step: number, initialValue: number, minValue: number, maxValue: number) {\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 = document.createElement('div');\r\n valueDiv.classList.add(BASE_CLASS + '-value');\r\n valueDiv.innerHTML = '' + initialValue;\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 //console.log('font size scrub:', value);\r\n valueDiv.innerText = '' + value;\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.container.classList.add('general-settings-container');\r\n this.setTitle('General');\r\n\r\n const section = generateSection.bind(null, this.scrollable);\r\n\r\n {\r\n const container = section('Settings');\r\n \r\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\r\n range.onChange = (value) => {\r\n appStateManager.setByKey('settings.messagesTextSize', value);\r\n };\r\n\r\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\r\n\r\n attachClickEvent(chatBackgroundButton, () => {\r\n new AppBackgroundTab(this.slider).open();\r\n });\r\n\r\n const animationsCheckboxField = new CheckboxField({\r\n text: 'EnableAnimations', \r\n name: 'animations', \r\n stateKey: 'settings.animationsEnabled',\r\n withRipple: true\r\n });\r\n \r\n container.append(range.container, chatBackgroundButton, animationsCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('General.Keyboard');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'send-shortcut';\r\n const stateKey = 'settings.sendShortcut';\r\n\r\n const enterRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'General.SendShortcut.Enter', \r\n name, \r\n value: 'enter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\r\n });\r\n\r\n const ctrlEnterRow = new Row({\r\n radioField: new RadioField({\r\n name,\r\n value: 'ctrlEnter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\r\n });\r\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\r\n \r\n form.append(enterRow.container, ctrlEnterRow.container);\r\n container.append(form);\r\n }\r\n\r\n {\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('AutoDownloadMedia');\r\n //container.classList.add('sidebar-left-section-disabled');\r\n\r\n const contactsCheckboxField = new CheckboxField({\r\n text: 'AutodownloadContacts', \r\n name: 'contacts',\r\n stateKey: 'settings.autoDownload.contacts',\r\n withRipple: true\r\n });\r\n const privateCheckboxField = new CheckboxField({\r\n text: 'AutodownloadPrivateChats', \r\n name: 'private',\r\n stateKey: 'settings.autoDownload.private',\r\n withRipple: true\r\n });\r\n const groupsCheckboxField = new CheckboxField({\r\n text: 'AutodownloadGroupChats', \r\n name: 'groups',\r\n stateKey: 'settings.autoDownload.groups',\r\n withRipple: true\r\n });\r\n const channelsCheckboxField = new CheckboxField({\r\n text: 'AutodownloadChannels', \r\n name: 'channels',\r\n stateKey: 'settings.autoDownload.channels',\r\n withRipple: true\r\n });\r\n\r\n container.append(contactsCheckboxField.label, privateCheckboxField.label, groupsCheckboxField.label, channelsCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('General.AutoplayMedia');\r\n //container.classList.add('sidebar-left-section-disabled');\r\n\r\n const gifsCheckboxField = new CheckboxField({\r\n text: 'AutoplayGIF', \r\n name: 'gifs', \r\n stateKey: 'settings.autoPlay.gifs',\r\n withRipple: true\r\n });\r\n const videosCheckboxField = new CheckboxField({\r\n text: 'AutoplayVideo', \r\n name: 'videos', \r\n stateKey: 'settings.autoPlay.videos',\r\n withRipple: true\r\n });\r\n\r\n container.append(gifsCheckboxField.label, videosCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('Emoji');\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.EmojiPrediction', \r\n name: 'suggest-emoji', \r\n stateKey: 'settings.emoji.suggest',\r\n withRipple: true\r\n });\r\n const bigCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.BigEmoji', \r\n name: 'emoji-big', \r\n stateKey: 'settings.emoji.big',\r\n withRipple: true\r\n });\r\n\r\n container.append(suggestCheckboxField.label, bigCheckboxField.label);\r\n }\r\n \r\n {\r\n const container = section('Telegram.InstalledStickerPacksController');\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'Stickers.SuggestStickers', \r\n name: 'suggest', \r\n stateKey: 'settings.stickers.suggest',\r\n withRipple: true\r\n });\r\n const loopCheckboxField = new CheckboxField({\r\n text: 'InstalledStickers.LoopAnimated', \r\n name: 'loop', \r\n stateKey: 'settings.stickers.loop',\r\n withRipple: true\r\n });\r\n\r\n const stickerSets: {[id: string]: Row} = {};\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\r\n const row = new Row({\r\n title: RichTextProcessor.wrapEmojiText(stickerSet.title),\r\n subtitleLangKey: 'Stickers',\r\n subtitleLangArgs: [stickerSet.count],\r\n havePadding: true,\r\n clickable: () => {\r\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\r\n }\r\n });\r\n\r\n stickerSets[stickerSet.id] = row;\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('row-media');\r\n\r\n wrapStickerSetThumb({\r\n set: stickerSet,\r\n container: div,\r\n group: 'GENERAL-SETTINGS',\r\n lazyLoadQueue,\r\n width: 48,\r\n height: 48,\r\n autoplay: true\r\n });\r\n\r\n row.container.append(div);\r\n\r\n container[method](row.container);\r\n };\r\n\r\n appStickersManager.getAllStickers().then(allStickers => {\r\n assumeType(allStickers);\r\n for(const stickerSet of allStickers.sets) {\r\n renderStickerSet(stickerSet);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!stickerSets[set.id]) {\r\n renderStickerSet(set, 'prepend');\r\n }\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(stickerSets[set.id]) {\r\n stickerSets[set.id].container.remove();\r\n delete stickerSets[set.id];\r\n }\r\n });\r\n\r\n container.append(suggestCheckboxField.label, loopCheckboxField.label);\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 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 eachMinute(callback: () => any, 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, (60 - new Date().getSeconds()) * 1000);\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 appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { i18n, i18n_ } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\n\r\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\r\n\r\nexport default class AppEditProfileTab extends SliderSuperTab {\r\n private firstNameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private bioInputField: InputField;\r\n private usernameInputField: InputField;\r\n \r\n private profileUrlContainer: HTMLDivElement;\r\n private profileUrlAnchor: HTMLAnchorElement;\r\n\r\n private editPeer: EditPeer;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-profile-container');\r\n this.setTitle('EditAccount.Title');\r\n\r\n const inputFields: InputField[] = [];\r\n\r\n {\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.firstNameInputField = new InputField({\r\n label: 'EditProfile.FirstNameLabel',\r\n name: 'first-name',\r\n maxLength: 70\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'Login.Register.LastName.Placeholder',\r\n name: 'last-name',\r\n maxLength: 64\r\n });\r\n this.bioInputField = new InputField({\r\n label: 'EditProfile.BioLabel',\r\n name: 'bio',\r\n maxLength: 70\r\n });\r\n \r\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'Bio.Description'});\r\n\r\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\r\n this.scrollable.append(inputWrapper, caption);\r\n }\r\n\r\n this.scrollable.append(document.createElement('hr'));\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 this.content.append(this.editPeer.nextBtn);\r\n this.scrollable.prepend(this.editPeer.avatarEdit.container);\r\n\r\n {\r\n const h2 = document.createElement('div');\r\n h2.classList.add('sidebar-left-h2');\r\n i18n_({element: h2, key: 'EditAccount.Username'});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.usernameInputField = new UsernameInputField({\r\n label: 'EditProfile.Username.Label',\r\n name: 'username',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n onChange: () => {\r\n this.editPeer.handleChange();\r\n this.setProfileUrl();\r\n },\r\n availableText: 'EditProfile.Username.Available',\r\n takenText: 'EditProfile.Username.Taken',\r\n invalidText: 'EditProfile.Username.Invalid'\r\n });\r\n\r\n inputWrapper.append(this.usernameInputField.container);\r\n\r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n caption.append(i18n('UsernameSettings.ChangeDescription'));\r\n caption.append(document.createElement('br'), document.createElement('br'));\r\n\r\n const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\r\n profileUrlContainer.classList.add('profile-url-container');\r\n \r\n const profileUrlAnchor = this.profileUrlAnchor = document.createElement('a');\r\n profileUrlAnchor.classList.add('profile-url');\r\n profileUrlAnchor.href = '#';\r\n profileUrlAnchor.target = '_blank';\r\n\r\n profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\r\n\r\n caption.append(profileUrlContainer);\r\n\r\n inputFields.push(this.usernameInputField);\r\n this.scrollable.append(h2, inputWrapper, caption);\r\n }\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n let promises: Promise[] = [];\r\n \r\n promises.push(appProfileManager.updateProfile(this.firstNameInputField.value, this.lastNameInputField.value, this.bioInputField.value).then(() => {\r\n this.close();\r\n }, (err) => {\r\n console.error('updateProfile error:', err);\r\n }));\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then(inputFile => {\r\n return appProfileManager.uploadProfilePhoto(inputFile);\r\n }));\r\n }\r\n\r\n if(this.usernameInputField.isValidToChange()) {\r\n promises.push(appUsersManager.updateUsername(this.usernameInputField.value));\r\n }\r\n\r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const user = appUsersManager.getSelf();\r\n\r\n const userFull = await appProfileManager.getProfile(user.id, true);\r\n\r\n this.firstNameInputField.setOriginalValue(user.first_name, true);\r\n this.lastNameInputField.setOriginalValue(user.last_name, true);\r\n this.bioInputField.setOriginalValue(userFull.about, true);\r\n this.usernameInputField.setOriginalValue(user.username, true);\r\n\r\n this.setProfileUrl();\r\n this.editPeer.handleChange();\r\n }\r\n\r\n private setProfileUrl() {\r\n if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\r\n this.profileUrlContainer.style.display = 'none';\r\n } else {\r\n this.profileUrlContainer.style.display = '';\r\n let url = 'https://t.me/' + this.usernameInputField.value;\r\n this.profileUrlAnchor.innerText = url;\r\n this.profileUrlAnchor.href = url;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport { copy } from \"../../../helpers/object\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport I18n, { i18n, LangPackKey, _i18n, join } from \"../../../lib/langPack\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport { SettingSection } from \"..\";\r\nimport { toast } from \"../../toast\";\r\nimport { forEachReverse } from \"../../../helpers/array\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\n\r\nexport default class AppIncludedChatsTab extends SliderSuperTab {\r\n private editFolderTab: AppEditFolderTab;\r\n private confirmBtn: HTMLElement;\r\n\r\n private selector: AppSelectPeers;\r\n private type: 'included' | 'excluded';\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private dialogsByFilters: Map>;\r\n\r\n protected init() {\r\n this.content.remove();\r\n this.container.classList.add('included-chatlist-container');\r\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\r\n this.confirmBtn.style.display = 'none';\r\n\r\n this.header.append(this.confirmBtn);\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n const selected = this.selector.getSelected();\r\n\r\n //this.filter.pFlags = {};\r\n\r\n if(this.type === 'included') {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') === 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n } else {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') !== 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n }\r\n\r\n const peerIds: PeerId[] = [];\r\n for(const key of selected) {\r\n if(key.isPeerId()) {\r\n peerIds.push(key.toPeerId());\r\n } else {\r\n // @ts-ignore\r\n this.filter.pFlags[key] = true;\r\n }\r\n }\r\n\r\n let cmp: (peerId: PeerId) => boolean;\r\n if(this.type === 'included') {\r\n cmp = (peerId) => peerIds.includes(peerId);\r\n } else {\r\n cmp = (peerId) => !peerIds.includes(peerId);\r\n }\r\n\r\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\r\n if(!cmp(peerId)) {\r\n this.filter.pinnedPeerIds.splice(idx, 1);\r\n this.filter.pinned_peers.splice(idx, 1);\r\n }\r\n });\r\n\r\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\r\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\r\n forEachReverse(this.filter[other], (peerId, idx) => {\r\n if(peerIds.includes(peerId)) {\r\n this.filter[other].splice(idx, 1);\r\n this.filter[otherLegacy].splice(idx, 1);\r\n }\r\n });\r\n \r\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\r\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = peerIds.map(peerId => appPeersManager.getInputPeerById(peerId));\r\n //this.filter.pinned_peers = this.filter.pinned_peers.filter(peerId => this.filter.include_peers.includes(peerId));\r\n\r\n this.editFolderTab.setFilter(this.filter, false);\r\n this.close();\r\n });\r\n\r\n this.dialogsByFilters = new Map();\r\n return appMessagesManager.filtersStorage.getDialogFilters().then(filters => {\r\n for(const filter of filters) {\r\n this.dialogsByFilters.set(filter, new Set(appMessagesManager.dialogsStorage.getFolderDialogs(filter.id).map(d => d.peerId)));\r\n }\r\n });\r\n }\r\n\r\n checkbox(selected?: boolean) {\r\n const checkboxField = new CheckboxField({\r\n round: true\r\n });\r\n if(selected) {\r\n checkboxField.input.checked = selected;\r\n }\r\n\r\n return checkboxField.label;\r\n }\r\n\r\n renderResults = async(peerIds: PeerId[]) => {\r\n //const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\r\n\r\n await appUsersManager.getContacts();\r\n peerIds.forEach(peerId => {\r\n //if(other.includes(peerId)) return;\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: this.selector.scrollable,\r\n drawStatus: false,\r\n rippleEnabled: true,\r\n avatarSize: 46\r\n });\r\n\r\n const selected = this.selector.selected.has(peerId);\r\n dom.containerEl.append(this.checkbox(selected));\r\n //if(selected) dom.listEl.classList.add('active');\r\n\r\n const foundInFilters: HTMLElement[] = [];\r\n this.dialogsByFilters.forEach((dialogs, filter) => {\r\n if(dialogs.has(peerId)) {\r\n const span = document.createElement('span');\r\n span.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\r\n foundInFilters.push(span);\r\n }\r\n });\r\n\r\n const joined = join(foundInFilters, false);\r\n joined.forEach(el => {\r\n dom.lastMessageSpan.append(el);\r\n });\r\n });\r\n };\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\r\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\r\n\r\n const filter = this.filter;\r\n\r\n const fragment = document.createDocumentFragment();\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 const chatsSection = new SettingSection({\r\n name: 'FilterChats'\r\n });\r\n\r\n fragment.append(categoriesSection.container, chatsSection.container);\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 });\r\n this.selector.selected = new Set(selectedPeers);\r\n\r\n let addedInitial = false;\r\n const _add = this.selector.add.bind(this.selector);\r\n this.selector.add = (peerId, title, scroll) => {\r\n if(this.selector.selected.size >= 100 && addedInitial && !details[peerId]) {\r\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\r\n if(el) {\r\n setTimeout(() => {\r\n el.checked = false;\r\n }, 0);\r\n }\r\n\r\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\r\n toast(str);\r\n return;\r\n }\r\n\r\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\r\n if(details[peerId]) {\r\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\r\n }\r\n return div;\r\n };\r\n\r\n const parent = this.selector.list.parentElement;\r\n chatsSection.content.append(this.selector.list);\r\n parent.append(fragment);\r\n\r\n this.selector.addInitial(selectedPeers);\r\n addedInitial = true;\r\n\r\n for(const flag in filter.pFlags) {\r\n // @ts-ignore\r\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\r\n (categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement).click();\r\n }\r\n }\r\n }\r\n\r\n onSelectChange = (length: number) => {\r\n //const changed = !deepEqual(this.filter, this.originalFilter);\r\n if(this.type === 'included') {\r\n this.confirmBtn.style.display = length ? '' : 'none';\r\n }\r\n };\r\n\r\n onCloseAfterTimeout() {\r\n if(this.selector) {\r\n this.selector.container.remove();\r\n this.selector = null;\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n /**\r\n * Do not ignore arguments!\r\n */\r\n public open(filter?: DialogFilter, type?: 'included' | 'excluded', editFolderTab?: AppIncludedChatsTab['editFolderTab']) {\r\n this.originalFilter = filter;\r\n this.filter = copy(this.originalFilter);\r\n this.type = type;\r\n this.editFolderTab = editFolderTab;\r\n \r\n return super.open();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { deepEqual, copy } from \"../../../helpers/object\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport lottieLoader, { RLottiePlayer } from \"../../../lib/lottieLoader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { toast } from \"../../toast\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport InputField from \"../../inputField\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport Button from \"../../button\";\r\nimport AppIncludedChatsTab from \"./includedChats\";\r\nimport { i18n, i18n_, LangPackKey } from \"../../../lib/langPack\";\r\nimport { SettingSection } from \"..\";\r\nimport PopupPeer from \"../../popups/peer\";\r\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: Promise;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-folder-container');\r\n this.caption = document.createElement('div');\r\n this.caption.classList.add('caption');\r\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n\r\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\r\n const deleteFolderButton: ButtonMenuItemOptions = {\r\n icon: 'delete danger',\r\n text: 'FilterMenuDelete',\r\n onClick: () => {\r\n new PopupPeer('filter-delete', {\r\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\r\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n deleteFolderButton.element.setAttribute('disabled', 'true');\r\n appMessagesManager.filtersStorage.updateDialogFilter(this.filter, true).then(bool => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).finally(() => {\r\n deleteFolderButton.element.removeAttribute('disabled');\r\n });\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n };\r\n this.menuBtn = ButtonMenuToggle({}, 'bottom-left', [deleteFolderButton]);\r\n this.menuBtn.classList.add('hide');\r\n\r\n this.header.append(this.confirmBtn, this.menuBtn);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FilterNameInputLabel',\r\n maxLength: MAX_FOLDER_NAME_LENGTH\r\n });\r\n\r\n inputWrapper.append(this.nameInputField.container);\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, inputWrapper, this.includePeerIds.container, this.excludePeerIds.container);\r\n\r\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\r\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\r\n\r\n includedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n new AppIncludedChatsTab(this.slider).open(this.filter, 'included', this);\r\n });\r\n\r\n excludedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n new AppIncludedChatsTab(this.slider).open(this.filter, 'excluded', this);\r\n });\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n if(this.nameInputField.input.classList.contains('error')) {\r\n return;\r\n }\r\n\r\n if(!this.nameInputField.value.trim()) {\r\n this.nameInputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\r\n include += this.filter.include_peers.length;\r\n \r\n if(!include) {\r\n toast('Please choose at least one chat for this folder.');\r\n return;\r\n }\r\n\r\n this.confirmBtn.setAttribute('disabled', 'true');\r\n\r\n let promise: Promise;\r\n if(!this.filter.id) {\r\n promise = appMessagesManager.filtersStorage.createDialogFilter(this.filter);\r\n } else {\r\n promise = appMessagesManager.filtersStorage.updateDialogFilter(this.filter);\r\n }\r\n\r\n promise.then(bool => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).catch(err => {\r\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n console.error('updateDialogFilter error:', err);\r\n }\r\n }).finally(() => {\r\n this.confirmBtn.removeAttribute('disabled');\r\n });\r\n });\r\n \r\n this.nameInputField.input.addEventListener('input', () => {\r\n this.filter.title = this.nameInputField.value;\r\n this.editCheckForChange();\r\n });\r\n\r\n return this.loadAnimationPromise = lottieLoader.loadAnimationFromURL({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'assets/img/Folders_2.tgs').then(player => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n });\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private onCreateOpen() {\r\n this.caption.style.display = '';\r\n this.setTitle('FilterNew');\r\n this.menuBtn.classList.add('hide');\r\n this.confirmBtn.classList.remove('hide');\r\n this.nameInputField.value = '';\r\n\r\n for(const flag in this.flags) {\r\n // @ts-ignore\r\n this.flags[flag].style.display = 'none';\r\n }\r\n }\r\n\r\n private onEditOpen() {\r\n this.caption.style.display = 'none';\r\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\r\n\r\n if(this.type === 'edit') {\r\n this.menuBtn.classList.remove('hide');\r\n this.confirmBtn.classList.add('hide');\r\n }\r\n \r\n const filter = this.filter;\r\n this.nameInputField.value = RichTextProcessor.wrapDraftText(filter.title);\r\n\r\n for(const flag in this.flags) {\r\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\r\n }\r\n\r\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(key => {\r\n const section = this[key];\r\n const ul = appDialogsManager.createChatList();\r\n\r\n const peers = filter[key].slice();\r\n\r\n const renderMore = (_length: number) => {\r\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\r\n const peerId = peers.shift();\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: ul,\r\n drawStatus: false,\r\n rippleEnabled: false,\r\n meAsSaved: true,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n }\r\n\r\n if(peers.length) {\r\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\r\n } else if(showMore) {\r\n showMore.remove();\r\n }\r\n };\r\n \r\n section.generateContentElement().append(ul);\r\n\r\n let showMore: HTMLElement;\r\n if(peers.length) {\r\n const content = section.generateContentElement();\r\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\r\n showMore.classList.add('load-more', 'rp-overflow');\r\n showMore.addEventListener('click', () => renderMore(20));\r\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\r\n\r\n content.append(showMore);\r\n }\r\n\r\n renderMore(4);\r\n });\r\n }\r\n\r\n editCheckForChange() {\r\n if(this.type === 'edit') {\r\n const changed = !deepEqual(this.originalFilter, this.filter);\r\n this.confirmBtn.classList.toggle('hide', !changed);\r\n this.menuBtn.classList.toggle('hide', changed);\r\n }\r\n };\r\n\r\n setFilter(filter: DialogFilter, firstTime: boolean) {\r\n // cleanup\r\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach(el => el.remove());\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 const ret = super.open();\r\n \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 this.onCreateOpen();\r\n } else {\r\n this.setFilter(filter, true);\r\n this.type = 'edit';\r\n this.onEditOpen();\r\n }\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport lottieLoader, { RLottiePlayer } from \"../../../lib/lottieLoader\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport { toast } from \"../../toast\";\r\nimport type { MyDialogFilter } from \"../../../lib/storages/filters\";\r\nimport type { DialogFilterSuggested, DialogFilter } from \"../../../layer\";\r\nimport type _rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport Row from \"../../row\";\r\nimport { SettingSection } from \"..\";\r\nimport { i18n, i18n_, LangPackKey, join } from \"../../../lib/langPack\";\r\nimport { cancelEvent } from \"../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport positionElementByIndex from \"../../../helpers/dom/positionElementByIndex\";\r\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: Promise;\r\n\r\n private renderFolder(dialogFilter: DialogFilterSuggested | DialogFilter | MyDialogFilter, container?: HTMLElement, row?: Row) {\r\n let filter: DialogFilter | MyDialogFilter;\r\n let description = '';\r\n let d: HTMLElement[] = [];\r\n if(dialogFilter._ === 'dialogFilterSuggested') {\r\n filter = dialogFilter.filter;\r\n description = dialogFilter.description;\r\n } else {\r\n filter = dialogFilter;\r\n\r\n let enabledFilters = Object.keys(filter.pFlags).length;\r\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach(key => {\r\n enabledFilters += +!!filter[key].length;\r\n }); */\r\n \r\n if(enabledFilters === 1) {\r\n const pFlags = filter.pFlags;\r\n let k: LangPackKey;\r\n if(pFlags.contacts) k = 'FilterAllContacts';\r\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\r\n else if(pFlags.groups) k = 'FilterAllGroups';\r\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\r\n else if(pFlags.bots) k = 'FilterAllBots';\r\n\r\n if(k) {\r\n d.push(i18n(k));\r\n }\r\n }\r\n \r\n if(!d.length) {\r\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(filter.id);\r\n let chats = 0, channels = 0, groups = 0;\r\n for(const dialog of folder) {\r\n if(appPeersManager.isAnyGroup(dialog.peerId)) groups++;\r\n else if(appPeersManager.isBroadcast(dialog.peerId)) channels++;\r\n else chats++;\r\n }\r\n\r\n if(chats) d.push(i18n('Chats', [chats]));\r\n if(channels) d.push(i18n('Channels', [channels]));\r\n if(groups) d.push(i18n('Groups', [groups]));\r\n }\r\n }\r\n\r\n let div: HTMLElement;\r\n if(!row) {\r\n row = new Row({\r\n title: RichTextProcessor.wrapEmojiText(filter.title),\r\n subtitle: description,\r\n clickable: true\r\n });\r\n\r\n if(d.length) {\r\n join(d).forEach(el => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n \r\n if(dialogFilter._ === 'dialogFilter') {\r\n const filterId = filter.id;\r\n if(!this.filtersRendered.hasOwnProperty(filter.id)) {\r\n attachClickEvent(row.container, () => {\r\n new AppEditFolderTab(this.slider).open(appMessagesManager.filtersStorage.getFilter(filterId));\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n this.filtersRendered[filter.id] = row;\r\n }\r\n } else {\r\n row.subtitle.textContent = '';\r\n join(d).forEach(el => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n\r\n div = row.container;\r\n\r\n if((filter as MyDialogFilter).hasOwnProperty('orderIndex')) {\r\n // ! header will be at 0 index\r\n positionElementByIndex(div, div.parentElement || container, (filter as MyDialogFilter).orderIndex);\r\n } else if(container) container.append(div);\r\n \r\n return div;\r\n }\r\n\r\n protected async init() {\r\n this.container.classList.add('chat-folders-container');\r\n this.setTitle('ChatList.Filter.List.Title');\r\n\r\n this.scrollable.container.classList.add('chat-folders');\r\n\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\r\n \r\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\r\n text: 'ChatList.Filter.NewTitle',\r\n icon: 'add'\r\n });\r\n\r\n this.foldersSection = new SettingSection({\r\n name: 'Filters'\r\n });\r\n this.foldersSection.container.style.display = 'none';\r\n\r\n this.suggestedSection = new SettingSection({\r\n name: 'FilterRecommended'\r\n });\r\n this.suggestedSection.container.style.display = 'none';\r\n\r\n this.scrollable.append(this.stickerContainer, caption, this.createFolderBtn, this.foldersSection.container, this.suggestedSection.container);\r\n\r\n attachClickEvent(this.createFolderBtn, () => {\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n new AppEditFolderTab(this.slider).open();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const onFiltersContainerUpdate = () => {\r\n this.foldersSection.container.style.display = Object.keys(this.filtersRendered).length ? '' : 'none';\r\n };\r\n\r\n appMessagesManager.filtersStorage.getDialogFilters().then(filters => {\r\n for(const filter of filters) {\r\n this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_update', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n this.renderFolder(filter, null, this.filtersRendered[filter.id]);\r\n } else {\r\n this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n\r\n this.getSuggestedFilters();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n /* for(const suggested of this.suggestedFilters) {\r\n if(deepEqual(suggested.filter, filter)) {\r\n \r\n }\r\n } */\r\n this.getSuggestedFilters();\r\n\r\n this.filtersRendered[filter.id].container.remove();\r\n delete this.filtersRendered[filter.id];\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\r\n order.forEach((filterId, idx) => {\r\n const container = this.filtersRendered[filterId].container;\r\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header \r\n });\r\n });\r\n\r\n this.loadAnimationPromise = lottieLoader.loadAnimationFromURL({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'assets/img/Folders_1.tgs').then(player => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n });\r\n\r\n this.getSuggestedFilters()\r\n\r\n /* return Promise.all([\r\n this.loadAnimationPromise\r\n ]); */\r\n return this.loadAnimationPromise;\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private getSuggestedFilters() {\r\n return apiManager.invokeApi('messages.getSuggestedDialogFilters').then(suggestedFilters => {\r\n this.suggestedSection.container.style.display = suggestedFilters.length ? '' : 'none';\r\n Array.from(this.suggestedSection.content.children).slice(1).forEach(el => el.remove());\r\n\r\n suggestedFilters.forEach(filter => {\r\n const div = this.renderFolder(filter);\r\n const button = Button('btn-primary btn-color-primary', {text: 'Add'});\r\n div.append(button);\r\n this.suggestedSection.content.append(div);\r\n\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n return;\r\n }\r\n\r\n button.setAttribute('disabled', 'true');\r\n\r\n const f = filter.filter as MyDialogFilter;\r\n f.includePeerIds = [];\r\n f.excludePeerIds = [];\r\n f.pinnedPeerIds = [];\r\n\r\n appMessagesManager.filtersStorage.createDialogFilter(f, true).then(bool => {\r\n if(bool) {\r\n div.remove();\r\n }\r\n }).finally(() => {\r\n button.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n });\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport { InputNotifyPeer, Update } from \"../../../layer\";\r\nimport appNotificationsManager from \"../../../lib/appManagers/appNotificationsManager\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport { copy } from \"../../../helpers/object\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { convertKeyToInputKey } from \"../../../helpers/string\";\r\nimport { LangPackKey } from \"../../../lib/langPack\";\r\nimport appStateManager from \"../../../lib/appManagers/appStateManager\";\r\n\r\ntype InputNotifyKey = Exclude;\r\n\r\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.container.classList.add('notifications-container');\r\n this.setTitle('Telegram.NotificationSettingsViewController');\r\n\r\n const NotifySection = (options: {\r\n name: LangPackKey,\r\n typeText: LangPackKey,\r\n inputKey: InputNotifyKey,\r\n }) => {\r\n const section = new SettingSection({\r\n name: options.name\r\n });\r\n\r\n const enabledRow = new Row({\r\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const previewEnabledRow = new Row({\r\n checkboxField: new CheckboxField({text: 'Notifications.MessagePreview', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n section.content.append(enabledRow.container, previewEnabledRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const inputNotifyPeer = {_: options.inputKey};\r\n const ret = appNotificationsManager.getNotifySettings(inputNotifyPeer);\r\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\r\n const applySettings = () => {\r\n const muted = appNotificationsManager.isMuted(notifySettings);\r\n enabledRow.checkboxField.checked = !muted;\r\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\r\n \r\n return muted;\r\n };\r\n \r\n applySettings();\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const mute = !enabledRow.checkboxField.checked;\r\n const showPreviews = previewEnabledRow.checkboxField.checked;\r\n\r\n if(mute === appNotificationsManager.isMuted(notifySettings) && showPreviews === notifySettings.show_previews) {\r\n return;\r\n }\r\n\r\n const inputSettings: any = copy(notifySettings);\r\n inputSettings._ = 'inputPeerNotifySettings';\r\n inputSettings.mute_until = mute ? 0x7FFFFFFF : 0;\r\n inputSettings.show_previews = showPreviews;\r\n\r\n appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\r\n }, {once: true});\r\n\r\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\r\n const inputKey = convertKeyToInputKey(update.peer._) as any;\r\n if(options.inputKey === inputKey) {\r\n notifySettings = update.notify_settings;\r\n applySettings();\r\n }\r\n });\r\n });\r\n };\r\n\r\n NotifySection({\r\n name: 'NotificationsPrivateChats',\r\n typeText: 'NotificationsForPrivateChats',\r\n inputKey: 'inputNotifyUsers'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsGroups',\r\n typeText: 'NotificationsForGroups',\r\n inputKey: 'inputNotifyChats'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsChannels',\r\n typeText: 'NotificationsForChannels',\r\n inputKey: 'inputNotifyBroadcasts'\r\n });\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'NotificationsOther'\r\n });\r\n\r\n const contactsSignUpRow = new Row({\r\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const soundRow = new Row({\r\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound'}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n soundRow.checkboxField.checked = state.settings.notifications.sound;\r\n });\r\n\r\n section.content.append(contactsSignUpRow.container, soundRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n appNotificationsManager.getContactSignUpNotification().then(enabled => {\r\n contactsSignUpRow.checkboxField.checked = enabled;\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = contactsSignUpRow.checkboxField.checked;\r\n if(enabled !== _enabled) {\r\n appNotificationsManager.setContactSignUpNotification(!_enabled);\r\n }\r\n }, {once: true});\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SliderSuperTab } from \"../../slider\"\r\n\r\nexport default class AppLanguageTab extends SliderSuperTab {\r\n protected async init() {\r\n this.container.classList.add('language-container');\r\n this.setTitle('Telegram.LanguageViewController');\r\n\r\n const section = new SettingSection({});\r\n\r\n const radioRows: Map = new Map();\r\n\r\n const promise = apiManager.invokeApiCacheable('langpack.getLanguages', {\r\n lang_pack: 'macos'\r\n }).then((languages) => {\r\n const random = randomLong();\r\n languages.forEach((language) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n text: language.name, \r\n name: random, \r\n value: language.lang_code\r\n }),\r\n subtitle: language.native_name\r\n });\r\n \r\n radioRows.set(language.lang_code, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\r\n I18n.getLangPack(value);\r\n });\r\n \r\n I18n.getCacheLangPack().then(langPack => {\r\n const row = radioRows.get(langPack.lang_code);\r\n if(!row) {\r\n console.error('no row', row, langPack);\r\n return;\r\n }\r\n \r\n row.radioField.setValueSilently(true);\r\n });\r\n \r\n section.content.append(form);\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n\r\n return promise;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 AvatarElement from \"../../avatar\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\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 PeerTitle from \"../../peerTitle\";\r\nimport AppLanguageTab from \"./language\";\r\nimport lottieLoader from \"../../../lib/lottieLoader\";\r\nimport PopupPeer from \"../../popups/peer\";\r\n//import AppMediaViewer from \"../../appMediaViewerNew\";\r\n\r\nexport default class AppSettingsTab extends SliderSuperTab {\r\n private avatarElem: AvatarElement;\r\n private nameDiv: HTMLElement;\r\n private phoneDiv: HTMLElement;\r\n\r\n private buttons: {\r\n edit: HTMLButtonElement,\r\n folders: HTMLButtonElement,\r\n general: HTMLButtonElement,\r\n notifications: HTMLButtonElement,\r\n privacy: HTMLButtonElement,\r\n language: HTMLButtonElement\r\n } = {} as any;\r\n\r\n protected init() {\r\n this.container.classList.add('settings-container');\r\n this.setTitle('Settings');\r\n \r\n const btnMenu = ButtonMenuToggle({}, 'bottom-left', [{\r\n icon: 'logout',\r\n text: 'EditAccount.Logout',\r\n onClick: () => {\r\n new PopupPeer('logout', {\r\n titleLangKey: 'LogOut',\r\n descriptionLangKey: 'LogOut.Description',\r\n buttons: [{\r\n langKey: 'LogOut',\r\n callback: () => {\r\n apiManager.logOut();\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n }]);\r\n\r\n this.header.append(btnMenu);\r\n\r\n this.avatarElem = new AvatarElement();\r\n this.avatarElem.setAttribute('clickable', '');\r\n this.avatarElem.classList.add('profile-avatar', 'avatar-120');\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 this.nameDiv = document.createElement('div');\r\n this.nameDiv.classList.add('profile-name');\r\n\r\n this.phoneDiv = document.createElement('div');\r\n this.phoneDiv.classList.add('profile-subtitle');\r\n\r\n const buttonsDiv = document.createElement('div');\r\n buttonsDiv.classList.add('profile-buttons');\r\n\r\n const className = 'profile-button btn-primary btn-transparent';\r\n buttonsDiv.append(this.buttons.edit = Button(className, {icon: 'edit', text: 'EditAccount.Title'}));\r\n buttonsDiv.append(this.buttons.folders = Button(className, {icon: 'folder', text: 'AccountSettings.Filters'}));\r\n buttonsDiv.append(this.buttons.general = Button(className, {icon: 'settings', text: 'Telegram.GeneralSettingsViewController'}));\r\n buttonsDiv.append(this.buttons.notifications = Button(className, {icon: 'unmute', text: 'AccountSettings.Notifications'}));\r\n buttonsDiv.append(this.buttons.privacy = Button(className, {icon: 'lock', text: 'AccountSettings.PrivacyAndSecurity'}));\r\n buttonsDiv.append(this.buttons.language = Button(className, {icon: 'language', text: 'AccountSettings.Language'}));\r\n \r\n this.scrollable.append(this.avatarElem, this.nameDiv, this.phoneDiv, buttonsDiv);\r\n this.scrollable.container.classList.add('profile-content-wrapper');\r\n\r\n /* rootScope.$on('user_auth', (e) => {\r\n this.fillElements();\r\n }); */\r\n\r\n this.buttons.edit.addEventListener('click', () => {\r\n const tab = new AppEditProfileTab(this.slider);\r\n tab.open();\r\n });\r\n\r\n this.buttons.folders.addEventListener('click', () => {\r\n new AppChatFoldersTab(this.slider).open();\r\n });\r\n\r\n this.buttons.general.addEventListener('click', () => {\r\n new AppGeneralSettingsTab(this.slider).open();\r\n });\r\n\r\n this.buttons.notifications.addEventListener('click', () => {\r\n new AppNotificationsTab(this.slider).open();\r\n });\r\n\r\n this.buttons.privacy.addEventListener('click', () => {\r\n new AppPrivacyAndSecurityTab(this.slider).open();\r\n });\r\n\r\n this.buttons.language.addEventListener('click', () => {\r\n new AppLanguageTab(this.slider).open();\r\n });\r\n\r\n lottieLoader.loadLottieWorkers();\r\n\r\n this.fillElements();\r\n }\r\n\r\n public fillElements() {\r\n const user = appUsersManager.getSelf();\r\n const peerId = user.id.toPeerId(false);\r\n this.avatarElem.setAttribute('peer', '' + peerId);\r\n\r\n this.nameDiv.append(new PeerTitle({peerId: peerId}).element);\r\n this.phoneDiv.innerHTML = user.phone ? appUsersManager.formatUserPhone(user.phone) : '';\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport Button from \"../../button\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport AppAddMembersTab from \"./addMembers\";\r\nimport { _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppNewChannelTab extends SliderSuperTab {\r\n private uploadAvatar: () => Promise = null;\r\n\r\n private channelNameInputField: InputField;\r\n private channelDescriptionInputField: InputField;\r\n private nextBtn: HTMLButtonElement;\r\n private avatarEdit: AvatarEdit;\r\n\r\n protected init() {\r\n this.container.classList.add('new-channel-container');\r\n this.setTitle('NewChannel');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const 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 const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n _i18n(caption, 'Channel.DescriptionHolderDescrpiton');\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.channelNameInputField.value;\r\n const about = this.channelDescriptionInputField.value;\r\n\r\n this.nextBtn.disabled = true;\r\n appChatsManager.createChannel(title, about).then((channelId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(channelId, inputFile);\r\n });\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n new AppAddMembersTab(this.slider).open({\r\n type: 'channel',\r\n skippable: true,\r\n title: 'GroupAddMembers',\r\n placeholder: 'SendMessageTo',\r\n takeOut: (peerIds) => {\r\n return appChatsManager.inviteToChannel(channelId, peerIds);\r\n }\r\n });\r\n });\r\n });\r\n\r\n this.content.append(this.nextBtn);\r\n this.scrollable.append(this.avatarEdit.container, inputWrapper, caption);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.channelNameInputField.value = '';\r\n this.channelDescriptionInputField.value = '';\r\n this.nextBtn.disabled = false;\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport EditPeer from \"../editPeer\";\nimport { _i18n } from \"../../lib/langPack\";\nimport TelInputField from \"../telInputField\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport { toastNew } from \"../toast\";\n\nexport default class PopupCreateContact extends PopupElement {\n constructor() {\n super('popup-create-contact popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Add'});\n\n _i18n(this.title, 'AddContactTitle');\n\n attachClickEvent(this.btnConfirm, () => {\n const promise = appUsersManager.importContact(nameInputField.value, lastNameInputField.value, telInputField.value);\n\n promise.then(() => {\n this.hide();\n }, (err) => {\n if(err.type === 'NO_USER') {\n toastNew({langPackKey: 'Contacts.PhoneNumber.NotRegistred'});\n editPeer.disabled = false;\n }\n });\n\n editPeer.lockWithPromise(promise);\n }, {listenerSetter: this.listenerSetter});\n\n const inputFields: InputField[] = [];\n const div = document.createElement('div');\n div.classList.add('name-fields');\n const nameInputField = new InputField({\n label: 'FirstName',\n name: 'create-contact-name',\n maxLength: 70,\n required: true\n });\n const lastNameInputField = new InputField({\n label: 'LastName',\n name: 'create-contact-lastname',\n maxLength: 70\n });\n const telInputField = new TelInputField({required: true});\n inputFields.push(nameInputField, lastNameInputField, telInputField);\n\n const onInput = () => {\n const name = nameInputField.value + ' ' + lastNameInputField.value;\n // const abbr = RichTextProcessor.getAbbreviation(name);\n editPeer.avatarElem.setAttribute('peer-title', 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 const user = appUsersManager.getSelf();\n const formatted = formatPhoneNumber(user.phone);\n if(formatted) {\n telInputField.validate = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n telInputField.value = '+' + formatted.code.country_code;\n }\n\n const editPeer = new EditPeer({\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true,\n nextBtn: this.btnConfirm,\n avatarSize: 100\n });\n\n div.append(nameInputField.container, lastNameInputField.container, editPeer.avatarElem);\n this.container.append(div, telInputField.container);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SliderSuperTab } from \"../../slider\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport InputSearch from \"../../inputSearch\";\nimport { IS_MOBILE } from \"../../../environment/userAgent\";\nimport { canFocus } from \"../../../helpers/dom/canFocus\";\nimport windowSize from \"../../../helpers/windowSize\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PopupCreateContact from \"../../popups/createContact\";\nimport SortedUserList from \"../../sortedUserList\";\nimport { getMiddleware } from \"../../../helpers/middleware\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport rootScope from \"../../../lib/rootScope\";\n\n// TODO: поиск по людям глобальный, если не нашло в контактах никого\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n \n protected init() {\n this.container.id = 'contacts-container';\n\n // this.list = appDialogsManager.createChatList(/* {avatarSize: 48, handheldsSize: 66} */);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, () => {\n new PopupCreateContact();\n }, {listenerSetter: this.listenerSetter});\n\n this.inputSearch = new InputSearch('Search', (value) => {\n this.openContacts(value);\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n const isContact = appUsersManager.isContact(userId);\n const peerId = userId.toPeerId();\n if(isContact) this.sortedUserList.add(peerId);\n else this.sortedUserList.delete(peerId);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.middleware = getMiddleware();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList();\n const list = sortedUserList.list;\n list.id = 'contacts';\n list.classList.add('contacts-container');\n appDialogsManager.setListClickListener(list, () => {\n this.close();\n }, undefined, true);\n return sortedUserList;\n }\n\n protected onClose() {\n this.middleware.clean();\n /* // need to clear, and left 1 page for smooth slide\n let pageCount = appPhotosManager.windowH / 72 * 1.25 | 0;\n (Array.from(this.list.children) as HTMLElement[]).slice(pageCount).forEach(el => el.remove()); */\n }\n\n protected onOpenAfterTimeout() {\n if(IS_MOBILE || !canFocus(true)) return;\n this.inputSearch.input.focus();\n }\n\n public openContacts(query?: string) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n appUsersManager.getContactsPeerIds(query, undefined, 'online').then(contacts => {\n if(!middleware()) {\n return;\n }\n\n const sortedUserList = this.sortedUserList = this.createList();\n\n let renderPage = () => {\n const pageCount = windowSize.windowH / 72 * 1.25 | 0;\n const arr = contacts.splice(0, pageCount); // надо splice!\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n renderPage = undefined;\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n renderPage();\n this.scrollable.onScrolledBottom = () => {\n if(renderPage) {\n renderPage();\n } else {\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n replaceContent(this.scrollable.container, sortedUserList.list);\n });\n }\n\n public open() {\n this.openContacts();\n return super.open();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport { SliderSuperTab } from \"../../slider\";\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId = 1;\n private wasFilterId: number;\n\n init() {\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n if(!appDialogsManager.sortedLists[AppArchivedTab.filterId]) {\n const chatList = appDialogsManager.createChatList();\n appDialogsManager.generateScrollable(chatList, AppArchivedTab.filterId).container.append(chatList);\n appDialogsManager.setListClickListener(chatList, null, true);\n //appDialogsManager.setListClickListener(archivedChatList, null, true); // * to test peer changing\n }\n\n const scrollable = appDialogsManager.scrollables[AppArchivedTab.filterId];\n this.scrollable.container.replaceWith(scrollable.container);\n this.scrollable = scrollable;\n }\n\n onOpen() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.wasFilterId = appDialogsManager.filterId;\n appDialogsManager.setFilterId(AppArchivedTab.filterId);\n appDialogsManager.onTabChange();\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.sortedLists[this.wasFilterId].clear();\n }\n\n onClose() {\n appDialogsManager.setFilterId(this.wasFilterId);\n appDialogsManager.onTabChange();\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.sortedLists[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { formatNumber } from \"../../helpers/number\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport appStateManager from \"../../lib/appManagers/appStateManager\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { SearchGroup } from \"../appSearch\";\nimport \"../avatar\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport InputSearch from \"../inputSearch\";\nimport SidebarSlider from \"../slider\";\nimport { TransitionSlider } from \"../transition\";\nimport AppNewGroupTab from \"./tabs/newGroup\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport { DateData, fillTipDates } from \"../../helpers/date\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppSettingsTab from \"./tabs/settings\";\nimport AppNewChannelTab from \"./tabs/newChannel\";\nimport AppContactsTab from \"./tabs/contacts\";\nimport AppArchivedTab from \"./tabs/archivedTab\";\nimport AppAddMembersTab from \"./tabs/addMembers\";\nimport { i18n_, LangPackKey } from \"../../lib/langPack\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport CheckboxField from \"../checkboxField\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport appNavigationController from \"../appNavigationController\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport PeerTitle from \"../peerTitle\";\nimport App from \"../../config/app\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sessionStorage from \"../../lib/sessionStorage\";\nimport { CLICK_EVENT_NAME } from \"../../helpers/dom/clickEvent\";\nimport { closeBtnMenu } from \"../misc\";\nimport { indexOfAndSplice } from \"../../helpers/array\";\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLButtonElement;\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 constructor() {\n super({\n sidebarEl: document.getElementById('column-left') as HTMLDivElement,\n navigationType: 'left'\n });\n\n //this._selectTab(0); // make first tab as default\n\n this.inputSearch = new InputSearch('Search');\n const sidebarHeader = this.sidebarEl.querySelector('.item-main .sidebar-header');\n sidebarHeader.append(this.inputSearch.container);\n\n const onNewGroupClick = () => {\n new AppAddMembersTab(this).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => {\n new AppNewGroupTab(this).open(peerIds);\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n new AppContactsTab(this).open();\n };\n\n //this.toolsBtn = this.sidebarEl.querySelector('.sidebar-tools-button') as HTMLButtonElement;\n this.backBtn = this.sidebarEl.querySelector('.sidebar-back-button') as HTMLButtonElement;\n\n const btnArchive: ButtonMenuItemOptions & {verify?: () => boolean} = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n new AppArchivedTab(this).open();\n },\n verify: () => {\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(1, false);\n return !!folder.length || !appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: rootScope.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', () => {\n rootScope.settings.theme = themeCheckboxField.input.checked ? 'night' : 'day';\n appStateManager.pushToState('settings', rootScope.settings);\n appImManager.applyCurrentTheme();\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(rootScope.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[] = [{\n icon: 'saved',\n text: 'SavedMessages',\n onClick: () => {\n setTimeout(() => { // menu doesn't close if no timeout (lol)\n appImManager.setPeer(appImManager.myId);\n }, 0);\n }\n }, btnArchive, {\n icon: 'user',\n text: 'Contacts',\n onClick: onContactsClick\n }, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n new AppSettingsTab(this).open();\n }\n }, {\n icon: 'darkmode',\n text: 'DarkMode',\n onClick: () => {\n \n },\n checkboxField: themeCheckboxField\n }, {\n icon: 'animations',\n text: 'Animations',\n onClick: () => {\n \n },\n checkboxField: new CheckboxField({\n toggle: true, \n checked: true,\n stateKey: 'settings.animationsEnabled',\n })\n }, {\n icon: 'help',\n text: 'TelegramFeatures',\n onClick: () => {\n appImManager.openUsername('TelegramTips');\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 this.toolsBtn = ButtonMenuToggle({}, 'bottom-right', menuButtons, (e) => {\n menuButtons.forEach(button => {\n if(button.verify) {\n button.element.classList.toggle('hide', !button.verify());\n }\n });\n });\n this.toolsBtn.classList.remove('tgico-more');\n this.toolsBtn.classList.add('sidebar-tools-button', 'is-visible');\n\n this.backBtn.parentElement.insertBefore(this.toolsBtn, this.backBtn);\n\n const btnMenu = this.toolsBtn.querySelector('.btn-menu') as HTMLElement;\n\n const btnMenuFooter = document.createElement('a');\n btnMenuFooter.href = 'https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md';\n btnMenuFooter.target = '_blank';\n btnMenuFooter.rel = 'noopener noreferrer';\n btnMenuFooter.classList.add('btn-menu-footer');\n btnMenuFooter.addEventListener(CLICK_EVENT_NAME, (e) => {\n e.stopPropagation();\n closeBtnMenu();\n });\n const t = document.createElement('span');\n t.classList.add('btn-menu-footer-text');\n t.innerHTML = 'Telegram Web' + App.suffix + ' alpha ' + App.versionFull;\n btnMenuFooter.append(t); \n btnMenu.classList.add('has-footer');\n btnMenu.append(btnMenuFooter);\n\n this.newBtnMenu = ButtonMenuToggle({}, 'top-left', [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n new AppNewChannelTab(this).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]);\n this.newBtnMenu.className = 'btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon';\n this.newBtnMenu.insertAdjacentHTML('afterbegin', `\n \n \n `);\n this.newBtnMenu.id = 'new-menu';\n sidebarHeader.nextElementSibling.append(this.newBtnMenu);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n //parseMenuButtonsTo(this.newButtons, this.newBtnMenu.firstElementChild.children);\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n btnArchive.element.append(this.archivedCount);\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 1) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadDialogsCount;\n this.archivedCount.innerText = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n appUsersManager.getTopPeers('correspondents');\n\n appStateManager.getState().then(state => {\n const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n appStateManager.requestPeer(recentSearch[i], 'recentSearch');\n }\n });\n }\n\n private initSearch() {\n const searchContainer = this.sidebarEl.querySelector('#search-container') as HTMLDivElement;\n\n const scrollable = new Scrollable(searchContainer);\n\n const close = () => {\n //setTimeout(() => {\n this.backBtn.click();\n //}, 0);\n };\n\n this.searchGroups = {\n contacts: new SearchGroup('Search.Chats', 'contacts', undefined, undefined, undefined, undefined, close),\n globalContacts: new SearchGroup('Search.Global', 'contacts', undefined, undefined, undefined, undefined, close),\n messages: new SearchGroup('Search.Messages', 'messages'),\n people: new SearchGroup(false, 'contacts', true, 'search-group-people', true, false, close),\n recent: new SearchGroup('Recent', 'contacts', true, 'search-group-recent', true, true, close)\n };\n\n const searchSuper = this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'FilterChats',\n type: 'chats'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable, \n searchGroups: this.searchGroups, \n asChatList: true,\n hideEmptyTabs: false,\n showSender: true\n });\n\n searchContainer.prepend(searchSuper.nav.parentElement.parentElement);\n scrollable.container.append(searchSuper.container);\n\n const resetSearch = () => {\n searchSuper.setQuery({\n peerId: ''.toPeerId(), \n folderId: 0\n });\n searchSuper.selectTab(0);\n searchSuper.load(true); \n };\n\n resetSearch();\n\n let pickedElements: HTMLElement[] = [];\n let selectedPeerId: PeerId = ''.toPeerId();\n let selectedMinDate = 0;\n let selectedMaxDate = 0;\n const updatePicked = () => {\n //(this.inputSearch.input as HTMLInputElement).placeholder = pickedElements.length ? 'Search' : 'Telegram Search';\n this.inputSearch.container.classList.toggle('is-picked-twice', pickedElements.length === 2);\n this.inputSearch.container.classList.toggle('is-picked', !!pickedElements.length);\n\n if(pickedElements.length) {\n this.inputSearch.input.style.setProperty('--paddingLeft', (pickedElements[pickedElements.length - 1].getBoundingClientRect().right - this.inputSearch.input.getBoundingClientRect().left) + 'px');\n } else {\n this.inputSearch.input.style.removeProperty('--paddingLeft');\n }\n };\n\n const helper = document.createElement('div');\n helper.classList.add('search-helper');\n helper.addEventListener('click', (e) => {\n const target = findUpClassName(e.target, 'selector-user');\n if(!target) {\n return;\n }\n\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n const [_, minDate, maxDate] = key.split('_');\n selectedMinDate = +minDate;\n selectedMaxDate = +maxDate;\n } else {\n selectedPeerId = key.toPeerId();\n }\n\n target.addEventListener('click', () => {\n unselectEntity(target);\n });\n\n this.inputSearch.container.append(target);\n this.inputSearch.onChange(this.inputSearch.value = '');\n pickedElements.push(target);\n updatePicked();\n });\n\n searchSuper.nav.parentElement.append(helper);\n\n const renderEntity = (key: PeerId | string, title?: string | HTMLElement) => {\n const div = document.createElement('div');\n div.classList.add('selector-user'/* , 'scale-in' */);\n\n const avatarEl = document.createElement('avatar-element');\n avatarEl.classList.add('selector-user-avatar', 'tgico');\n avatarEl.setAttribute('dialog', '1');\n avatarEl.classList.add('avatar-30');\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.setAttribute('peer', '' + key);\n } else {\n avatarEl.classList.add('tgico-calendarfilter');\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n return div;\n };\n\n const unselectEntity = (target: HTMLElement) => {\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n selectedMinDate = selectedMaxDate = 0;\n } else {\n selectedPeerId = ''.toPeerId();\n }\n \n target.remove();\n indexOfAndSplice(pickedElements, target);\n\n setTimeout(() => {\n updatePicked();\n this.inputSearch.onChange(this.inputSearch.value);\n }, 0);\n };\n\n this.inputSearch.onClear = () => {\n pickedElements.forEach(el => {\n unselectEntity(el);\n });\n };\n\n this.inputSearch.onChange = (value) => {\n searchSuper.cleanupHTML();\n searchSuper.setQuery({\n peerId: selectedPeerId, \n folderId: selectedPeerId ? undefined : 0,\n query: value,\n minDate: selectedMinDate,\n maxDate: selectedMaxDate\n });\n searchSuper.load(true);\n\n helper.innerHTML = '';\n searchSuper.nav.classList.remove('hide');\n if(!value) {\n }\n \n if(!selectedPeerId && value.trim()) {\n const middleware = searchSuper.middleware.get();\n Promise.all([\n // appMessagesManager.getConversationsAll(value).then(dialogs => dialogs.map(d => d.peerId)),\n appMessagesManager.getConversations(value).promise.then(({dialogs}) => dialogs.map(d => d.peerId)),\n appUsersManager.getContactsPeerIds(value, true)\n ]).then(results => {\n if(!middleware()) return;\n const peerIds = new Set(results[0].concat(results[1]));\n \n peerIds.forEach(peerId => {\n helper.append(renderEntity(peerId));\n });\n \n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n //console.log('got peerIds by value:', value, [...peerIds]);\n });\n }\n \n if(!selectedMinDate && value.trim()) {\n const dates: DateData[] = [];\n fillTipDates(value, dates);\n dates.forEach(dateData => {\n helper.append(renderEntity('date_' + dateData.minDate + '_' + dateData.maxDate, dateData.title));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n }\n };\n\n searchSuper.tabs.inputMessagesFilterEmpty.addEventListener('mousedown', (e) => {\n const target = findUpTag(e.target, 'LI') as HTMLElement;\n if(!target) {\n return;\n }\n\n const searchGroup = findUpClassName(target, 'search-group');\n if(!searchGroup || searchGroup.classList.contains('search-group-recent') || searchGroup.classList.contains('search-group-people')) {\n return;\n }\n\n const peerId = target.getAttribute('data-peer-id').toPeerId();\n appStateManager.getState().then(state => {\n const recentSearch = state.recentSearch || [];\n if(recentSearch[0] !== peerId) {\n indexOfAndSplice(recentSearch, peerId);\n recentSearch.unshift(peerId);\n if(recentSearch.length > 20) {\n recentSearch.length = 20;\n }\n \n appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n appStateManager.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }, {capture: true});\n\n let peopleContainer = document.createElement('div');\n peopleContainer.classList.add('search-group-scrollable');\n peopleContainer.append(this.searchGroups.people.list);\n this.searchGroups.people.container.append(peopleContainer);\n let peopleScrollable = new ScrollableX(peopleContainer);\n\n let first = true;\n let hideNewBtnMenuTimeout: number;\n //const transition = Transition.bind(null, searchContainer.parentElement, 150);\n const transition = TransitionSlider(searchContainer.parentElement, 'zoom-fade', 150, (id) => {\n if(hideNewBtnMenuTimeout) clearTimeout(hideNewBtnMenuTimeout);\n\n if(id === 0 && !first) {\n searchSuper.selectTab(0, false);\n this.inputSearch.onClearClick();\n hideNewBtnMenuTimeout = window.setTimeout(() => {\n hideNewBtnMenuTimeout = 0;\n this.newBtnMenu.classList.remove('is-hidden');\n }, 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.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', true);\n\n if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType('global-search')) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: 'global-search'\n });\n }\n\n transition(1);\n };\n\n this.inputSearch.input.addEventListener('focus', onFocus);\n onFocus();\n\n this.backBtn.addEventListener('click', (e) => {\n this.toolsBtn.classList.add(activeClassName);\n this.backBtn.classList.remove(activeClassName);\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', false);\n\n appNavigationController.removeByType('global-search');\n\n transition(0);\n });\n\n const clearRecentSearchBtn = document.createElement('button');\n clearRecentSearchBtn.classList.add('btn-icon', 'tgico-close');\n this.searchGroups.recent.nameEl.append(clearRecentSearchBtn);\n clearRecentSearchBtn.addEventListener('click', () => {\n this.searchGroups.recent.clear();\n appStateManager.pushToState('recentSearch', []);\n });\n }\n}\n\nexport class SettingSection {\n public container: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public caption: HTMLElement;\n\n constructor(options: {\n name?: LangPackKey, \n caption?: LangPackKey | true,\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean\n }) {\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-left-section');\n\n if(options.fakeGradientDelimiter) {\n this.container.append(generateDelimiter());\n this.container.classList.add('with-fake-delimiter');\n } else if(!options.noDelimiter) {\n const hr = document.createElement('hr');\n this.container.append(hr);\n } else {\n this.container.classList.add('no-delimiter');\n }\n\n this.content = this.generateContentElement();\n\n if(options.name) {\n this.title = document.createElement('div');\n this.title.classList.add('sidebar-left-h2', 'sidebar-left-section-name');\n i18n_({element: this.title, key: options.name});\n this.content.append(this.title);\n }\n\n if(options.caption) {\n this.caption = this.generateContentElement();\n this.caption.classList.add('sidebar-left-section-caption');\n\n if(options.caption !== true) {\n i18n_({element: this.caption, key: options.caption});\n }\n }\n }\n\n public generateContentElement() {\n const content = document.createElement('div');\n content.classList.add('sidebar-left-section-content');\n this.container.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\nconst appSidebarLeft = new AppSidebarLeft();\nMOUNT_CLASS_TO.appSidebarLeft = appSidebarLeft;\nexport default appSidebarLeft;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\n//import { generatePathData } from \"../../helpers/dom\";\r\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type Chat from \"./chat\";\r\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\n\r\ntype Group = {bubble: HTMLElement, mid: number, timestamp: number}[];\r\ntype BubbleGroup = {timestamp: number, fromId: PeerId, mid: number, group: Group};\r\nexport default class BubbleGroups {\r\n private bubbles: Array = []; // map to group\r\n private detailsMap: Map = new Map();\r\n private groups: Array = [];\r\n //updateRAFs: Map = new Map();\r\n private newGroupDiff = 121; // * 121 in scheduled messages\r\n\r\n constructor(private chat: Chat) {\r\n\r\n }\r\n\r\n removeBubble(bubble: HTMLElement) {\r\n const details = this.detailsMap.get(bubble);\r\n if(details) {\r\n if(details.group.length) {\r\n details.group.findAndSplice(d => d.bubble === bubble);\r\n if(!details.group.length) {\r\n indexOfAndSplice(this.groups, details.group);\r\n } else {\r\n this.updateGroup(details.group);\r\n }\r\n }\r\n \r\n this.detailsMap.delete(bubble);\r\n }\r\n }\r\n\r\n changeBubbleMid(bubble: HTMLElement, mid: number) {\r\n const details = this.detailsMap.get(bubble);\r\n if(details) {\r\n details.mid = mid;\r\n }\r\n }\r\n \r\n addBubble(bubble: HTMLElement, message: MyMessage, reverse: boolean) {\r\n //return;\r\n\r\n const timestamp = message.date;\r\n const mid = message.mid;\r\n let fromId = message.viaBotId || message.fromId;\r\n let group: Group;\r\n\r\n // fix for saved messages forward to self\r\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as any).fwdFromId === fromId) {\r\n fromId = fromId.toPeerId(true);\r\n }\r\n \r\n // try to find added\r\n this.removeBubble(bubble);\r\n \r\n const insertObject = {bubble, mid, timestamp};\r\n if(this.bubbles.length) {\r\n let foundBubble: BubbleGroup;\r\n let foundAtIndex = -1;\r\n for(let i = 0; i < this.bubbles.length; ++i) {\r\n const bubble = this.bubbles[i];\r\n const diff = Math.abs(bubble.timestamp - timestamp);\r\n const good = bubble.fromId === fromId && diff <= this.newGroupDiff;\r\n\r\n if(good) {\r\n foundAtIndex = i;\r\n\r\n if(this.chat.type === 'scheduled') {\r\n break;\r\n }\r\n } else {\r\n foundAtIndex = -1;\r\n }\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n if(mid > bubble.mid) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if(foundAtIndex !== -1) {\r\n foundBubble = this.bubbles[foundAtIndex];\r\n }\r\n /* const foundBubble = this.bubbles.find(bubble => {\r\n const diff = Math.abs(bubble.timestamp - timestamp);\r\n return bubble.fromId === fromId && diff <= this.newGroupDiff;\r\n }); */\r\n\r\n if(!foundBubble) this.groups.push(group = [insertObject]);\r\n else {\r\n group = foundBubble.group;\r\n \r\n let i = 0, foundMidOnSameTimestamp = 0;\r\n for(; i < group.length; ++i) {\r\n const _timestamp = group[i].timestamp;\r\n const _mid = group[i].mid;\r\n\r\n if(timestamp < _timestamp) {\r\n break;\r\n } else if(timestamp === _timestamp) {\r\n foundMidOnSameTimestamp = _mid;\r\n } \r\n \r\n if(foundMidOnSameTimestamp && mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n\r\n group.splice(i, 0, insertObject);\r\n }\r\n } else {\r\n this.groups.push(group = [insertObject]);\r\n }\r\n\r\n //console.log('[BUBBLE]: addBubble', bubble, message.mid, fromId, reverse, group);\r\n\r\n const bubbleGroup = {timestamp, fromId, mid: message.mid, group};\r\n let insertIndex = 0;\r\n for(; insertIndex < this.bubbles.length; ++insertIndex) {\r\n if(this.bubbles[insertIndex].mid < mid) {\r\n break;\r\n }\r\n }\r\n \r\n this.bubbles.splice(insertIndex, 0, {timestamp, fromId, mid: message.mid, group});\r\n this.updateGroup(group);\r\n\r\n this.detailsMap.set(bubble, bubbleGroup);\r\n }\r\n\r\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\r\n //console.log('setClipIfNeeded', bubble, remove);\r\n const className = bubble.className;\r\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\r\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\r\n //console.log('setClipIfNeeded', bubble, remove, container);\r\n if(!container) return;\r\n\r\n try {\r\n Array.from(container.children).forEach(object => {\r\n if(object instanceof SVGDefsElement) return;\r\n \r\n if(remove) {\r\n object.removeAttributeNS(null, 'clip-path');\r\n } else {\r\n let clipId = container.dataset.clipId;\r\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\r\n let width = +object.getAttributeNS(null, 'width');\r\n let height = +object.getAttributeNS(null, 'height');\r\n let isOut = className.includes('is-out');\r\n let isReply = className.includes('is-reply');\r\n let d = '';\r\n \r\n //console.log('setClipIfNeeded', object, width, height, isOut);\r\n \r\n let tr: number, tl: number;\r\n if(className.includes('forwarded') || isReply) {\r\n tr = tl = 0;\r\n } else if(isOut) {\r\n tr = className.includes('is-group-first') ? 12 : 6;\r\n tl = 12;\r\n } else {\r\n tr = 12;\r\n tl = className.includes('is-group-first') ? 12 : 6;\r\n }\r\n \r\n if(isOut) {\r\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\r\n } else {\r\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\r\n }\r\n \r\n path.setAttributeNS(null, 'd', d);\r\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\r\n }\r\n });\r\n } catch(err) {}\r\n }\r\n } */\r\n \r\n updateGroup(group: Group) {\r\n /* if(this.updateRAFs.has(group)) {\r\n window.cancelAnimationFrame(this.updateRAFs.get(group));\r\n this.updateRAFs.delete(group);\r\n } */\r\n \r\n //this.updateRAFs.set(group, window.requestAnimationFrame(() => {\r\n //this.updateRAFs.delete(group);\r\n \r\n if(!group.length) {\r\n return;\r\n }\r\n \r\n const first = group[0].bubble;\r\n\r\n //console.log('[BUBBLE]: updateGroup', group, first);\r\n \r\n if(group.length === 1) {\r\n first.classList.add('is-group-first', 'is-group-last');\r\n //this.setClipIfNeeded(first);\r\n return;\r\n } else {\r\n first.classList.remove('is-group-last');\r\n first.classList.add('is-group-first');\r\n //this.setClipIfNeeded(first, true);\r\n }\r\n \r\n const length = group.length - 1;\r\n for(let i = 1; i < length; ++i) {\r\n const bubble = group[i].bubble;\r\n bubble.classList.remove('is-group-last', 'is-group-first');\r\n //this.setClipIfNeeded(bubble, true);\r\n }\r\n \r\n const last = group[group.length - 1].bubble;\r\n last.classList.remove('is-group-first');\r\n last.classList.add('is-group-last');\r\n //this.setClipIfNeeded(last);\r\n //}));\r\n }\r\n\r\n updateGroupByMessageId(mid: number) {\r\n const details = this.bubbles.find(g => g.mid === mid);\r\n if(details) {\r\n this.updateGroup(details.group);\r\n }\r\n }\r\n \r\n cleanup() {\r\n this.bubbles = [];\r\n this.groups = [];\r\n this.detailsMap.clear();\r\n /* for(let value of this.updateRAFs.values()) {\r\n window.cancelAnimationFrame(value);\r\n }\r\n this.updateRAFs.clear(); */\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, { PopupOptions } from \".\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport InputField from \"../inputField\";\r\n\r\nexport default class PopupDatePicker extends PopupElement {\r\n protected controlsDiv: HTMLElement;\r\n protected monthTitle: HTMLElement;\r\n protected prevBtn: HTMLElement;\r\n protected nextBtn: HTMLElement;\r\n\r\n protected monthsContainer: HTMLElement;\r\n protected month: HTMLElement;\r\n\r\n protected minMonth: Date;\r\n protected maxMonth: Date;\r\n protected minDate: Date;\r\n protected maxDate: Date;\r\n protected selectedDate: Date;\r\n protected selectedMonth: Date;\r\n protected selectedEl: HTMLElement;\r\n\r\n protected timeDiv: HTMLDivElement;\r\n protected hoursInputField: InputField;\r\n protected minutesInputField: InputField;\r\n\r\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\r\n noButtons: true, \r\n noTitle: true, \r\n minDate: Date,\r\n maxDate: Date\r\n withTime: true,\r\n showOverflowMonths: true\r\n }> & PopupOptions = {}) {\r\n super('popup-date-picker', options.noButtons ? [] : [{\r\n langKey: 'JumpToDate',\r\n callback: () => {\r\n if(this.onPick) {\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n }\r\n }, {\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }], {body: true, overlayClosable: true, ...options});\r\n\r\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\r\n\r\n if(initDate < this.minDate) {\r\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\r\n }\r\n\r\n // Controls\r\n this.controlsDiv = document.createElement('div');\r\n this.controlsDiv.classList.add('date-picker-controls');\r\n\r\n this.prevBtn = document.createElement('button');\r\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\r\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.nextBtn = document.createElement('button');\r\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\r\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.monthTitle = document.createElement('div');\r\n this.monthTitle.classList.add('date-picker-month-title');\r\n\r\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\r\n\r\n // Month\r\n this.monthsContainer = document.createElement('div');\r\n this.monthsContainer.classList.add('date-picker-months');\r\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.controlsDiv, this.monthsContainer);\r\n\r\n // Time inputs\r\n if(options.withTime) {\r\n this.timeDiv = document.createElement('div');\r\n this.timeDiv.classList.add('date-picker-time');\r\n\r\n const delimiter = document.createElement('div');\r\n delimiter.classList.add('date-picker-time-delimiter');\r\n delimiter.append(':');\r\n\r\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\r\n const maxString = '' + max;\r\n this.listenerSetter.add(inputField.input)('input', (e) => {\r\n let value = inputField.value.replace(/\\D/g, '');\r\n if(value.length > 2) {\r\n value = value.slice(0, 2);\r\n } else {\r\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\r\n if(value.length === 2 && onOverflow) {\r\n onOverflow(+value[1]);\r\n }\r\n\r\n value = '0' + value[0];\r\n }\r\n }\r\n\r\n inputField.setValueSilently(value);\r\n onInput(value.length);\r\n });\r\n };\r\n\r\n this.hoursInputField = new InputField({plainText: true});\r\n this.minutesInputField = new InputField({plainText: true});\r\n\r\n handleTimeInput(23, this.hoursInputField, (length) => {\r\n if(length === 2) {\r\n this.minutesInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n }, (number) => {\r\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\r\n });\r\n handleTimeInput(59, this.minutesInputField, (length) => {\r\n if(!length) {\r\n this.hoursInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n });\r\n\r\n this.selectedDate = initDate;\r\n\r\n initDate.setMinutes(initDate.getMinutes() + 10);\r\n \r\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\r\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\r\n\r\n initDate.setHours(0, 0, 0, 0);\r\n \r\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\r\n\r\n attachClickEvent(this.btnConfirm, () => {\r\n if(this.onPick) {\r\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n\r\n this.hide();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.timeDiv);\r\n\r\n this.prevBtn.classList.add('primary');\r\n this.nextBtn.classList.add('primary');\r\n }\r\n\r\n const popupCenterer = document.createElement('div');\r\n popupCenterer.classList.add('popup-centerer');\r\n popupCenterer.append(this.container);\r\n this.element.append(popupCenterer);\r\n\r\n //const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\r\n //this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\r\n initDate.setHours(0, 0, 0, 0);\r\n this.selectedDate = initDate;\r\n\r\n this.maxDate = options.maxDate || new Date();\r\n this.maxDate.setHours(0, 0, 0, 0);\r\n\r\n this.selectedMonth = new Date(this.selectedDate);\r\n this.selectedMonth.setDate(1);\r\n\r\n this.maxMonth = new Date(this.maxDate);\r\n this.maxMonth.setDate(1);\r\n\r\n this.minMonth = new Date(this.minDate);\r\n this.minMonth.setHours(0, 0, 0, 0);\r\n this.minMonth.setDate(1);\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.noTitle) {\r\n this.setTitle = () => {};\r\n }\r\n\r\n this.setTimeTitle();\r\n this.setTitle();\r\n this.setMonth();\r\n }\r\n\r\n onPrevClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n \r\n this.nextBtn.removeAttribute('disabled');\r\n };\r\n\r\n onNextClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n this.prevBtn.removeAttribute('disabled');\r\n };\r\n\r\n onDateClick = (e: MouseEvent) => {\r\n //cancelEvent(e);\r\n const target = e.target as HTMLElement;\r\n\r\n if(!target.dataset.timestamp) return;\r\n\r\n if(this.selectedEl) {\r\n if(this.selectedEl === target) return;\r\n this.selectedEl.classList.remove('active');\r\n }\r\n\r\n this.selectedEl = target;\r\n \r\n target.classList.add('active');\r\n const timestamp = +target.dataset.timestamp;\r\n\r\n this.selectedDate = new Date(timestamp);\r\n\r\n this.setTitle();\r\n this.setTimeTitle();\r\n };\r\n\r\n public setTimeTitle() {\r\n if(this.btnConfirm && this.selectedDate) {\r\n let key: LangPackKey, args: any[] = [];\r\n const date = new Date();\r\n date.setHours(0, 0, 0, 0);\r\n\r\n const timeOptions: Intl.DateTimeFormatOptions = {\r\n minute: '2-digit',\r\n hour: '2-digit'\r\n };\r\n \r\n const sendDate = new Date(this.selectedDate.getTime());\r\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\r\n\r\n if(this.selectedDate.getTime() === date.getTime()) {\r\n key = 'Schedule.SendToday';\r\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\r\n dayStr = 'Tomorrow';\r\n } */ else {\r\n key = 'Schedule.SendDate';\r\n\r\n const dateOptions: Intl.DateTimeFormatOptions = {\r\n month: 'short',\r\n day: 'numeric'\r\n };\r\n\r\n if(sendDate.getFullYear() !== date.getFullYear()) {\r\n dateOptions.year = 'numeric';\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: dateOptions\r\n }).element);\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: timeOptions\r\n }).element);\r\n\r\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\r\n }\r\n }\r\n\r\n public setTitle() {\r\n //const splitted = this.selectedDate.toString().split(' ', 3);\r\n //this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\r\n this.title.textContent = '';\r\n this.title.append(new I18n.IntlDateElement({\r\n date: this.selectedDate,\r\n options: {\r\n day: 'numeric',\r\n month: 'long',\r\n weekday: 'short'\r\n }\r\n }).element);\r\n }\r\n\r\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\r\n const el = document.createElement('button');\r\n el.classList.add('btn-icon', 'date-picker-month-date');\r\n\r\n if(disabled) {\r\n el.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(innerText) {\r\n el.append(innerText);\r\n }\r\n\r\n return el;\r\n }\r\n\r\n public setMonth() {\r\n const firstDate = new Date(this.selectedMonth);\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\r\n };\r\n\r\n this.monthTitle.textContent = '';\r\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\r\n //this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\r\n\r\n if(this.month) {\r\n this.month.remove();\r\n }\r\n\r\n this.month = document.createElement('div');\r\n this.month.classList.add('date-picker-month');\r\n\r\n const weekStartDate = new Date();\r\n const day = weekStartDate.getDay();\r\n if(day !== 1) {\r\n weekStartDate.setHours(-24 * (day - 1)); \r\n }\r\n\r\n for(let i = 0; i < 7; ++i) {\r\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\r\n el.classList.remove('date-picker-month-date');\r\n el.classList.add('date-picker-month-day');\r\n this.month.append(el);\r\n weekStartDate.setDate(weekStartDate.getDate() + 1);\r\n }\r\n\r\n // 0 - sunday\r\n let dayIndex = firstDate.getDay() - 1;\r\n if(dayIndex === -1) dayIndex = 7 - 1;\r\n\r\n const clonedDate = new Date(firstDate.getTime());\r\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\r\n\r\n // Padding first week\r\n for(let i = 0; i < dayIndex; ++i) {\r\n if(this.options.showOverflowMonths) {\r\n clonedDate.setDate(clonedDate.getDate() + 1);\r\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\r\n } else {\r\n this.month.append(this.renderElement(true));\r\n }\r\n }\r\n\r\n do {\r\n const date = firstDate.getDate();\r\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\r\n el.dataset.timestamp = '' + firstDate.getTime();\r\n\r\n if(firstDate.getTime() === this.selectedDate.getTime()) {\r\n this.selectedEl = el;\r\n el.classList.add('active');\r\n }\r\n\r\n this.month.append(el);\r\n\r\n firstDate.setDate(date + 1);\r\n } while(firstDate.getDate() !== 1);\r\n\r\n const remainder = this.month.childElementCount % 7;\r\n if(this.options.showOverflowMonths && remainder) {\r\n for(let i = remainder; i < 7; ++i) {\r\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\r\n firstDate.setDate(firstDate.getDate() + 1);\r\n }\r\n }\r\n\r\n const lines = Math.ceil(this.month.childElementCount / 7);\r\n this.container.dataset.lines = '' + lines;\r\n\r\n this.monthsContainer.append(this.month);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class StickyIntersector {\r\n private headersObserver: IntersectionObserver;\r\n private elementsObserver: IntersectionObserver;\r\n\r\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\r\n this.observeHeaders();\r\n this.observeElements();\r\n }\r\n\r\n /**\r\n * Sets up an intersection observer to notify when elements with the class\r\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\r\n * @param {!Element} container\r\n */\r\n private observeHeaders() {\r\n this.headersObserver = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const targetInfo = entry.boundingClientRect;\r\n const stickyTarget = entry.target.parentElement;\r\n const rootBoundsInfo = entry.rootBounds;\r\n \r\n // Started sticking.\r\n if(targetInfo.bottom < rootBoundsInfo.top) {\r\n this.handler(true, stickyTarget);\r\n }\r\n \r\n // Stopped sticking.\r\n if(targetInfo.bottom >= rootBoundsInfo.top &&\r\n targetInfo.bottom < rootBoundsInfo.bottom) {\r\n this.handler(false, stickyTarget);\r\n }\r\n }\r\n }, {threshold: 0, root: this.container});\r\n }\r\n \r\n private observeElements() {\r\n this.elementsObserver = new IntersectionObserver((entries) => {\r\n let entry = entries.filter(entry => entry.boundingClientRect.top < 0).sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\r\n if(!entry) return;\r\n let 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}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\r\nimport { formatNumber } from \"../../helpers/number\";\r\nimport { Message } from \"../../layer\";\r\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\r\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\r\n\r\nconst TAG_NAME = 'replies-element';\r\n\r\nrootScope.addEventListener('replies_updated', (e) => {\r\n const message = e;\r\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach(element => {\r\n element.message = message;\r\n element.render();\r\n });\r\n});\r\n\r\nexport default class RepliesElement extends HTMLElement {\r\n public message: Message.message;\r\n public type: 'footer' | 'beside';\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueueIntersector;\r\n \r\n private updated = false;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n public init() {\r\n this.render();\r\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\r\n this.classList.add('replies', 'replies-' + this.type);\r\n }\r\n\r\n public render() {\r\n const replies = this.message.replies;\r\n\r\n /* if(this.firstChild) {\r\n this.innerHTML = '';\r\n } */\r\n\r\n if(this.type === 'footer') {\r\n let leftPart: HTMLElement;\r\n if(this.firstElementChild) {\r\n leftPart = this.firstElementChild as HTMLElement;\r\n }\r\n\r\n if(replies?.recent_repliers) {\r\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\r\n this.innerHTML = '';\r\n leftPart = null;\r\n }\r\n\r\n if(!leftPart) {\r\n leftPart = document.createElement('div');\r\n leftPart.classList.add('replies-footer-avatars');\r\n }\r\n\r\n replies.recent_repliers.slice().reverse().forEach((peer, idx) => {\r\n let avatarElem = leftPart.children[idx] as AvatarElement;\r\n if(!avatarElem) {\r\n avatarElem = new AvatarElement();\r\n avatarElem.setAttribute('dialog', '0');\r\n avatarElem.classList.add('avatar-30');\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n \r\n if(this.loadPromises) {\r\n avatarElem.loadPromises = this.loadPromises;\r\n }\r\n }\r\n \r\n avatarElem.setAttribute('peer', '' + appPeersManager.getPeerId(peer));\r\n \r\n if(!avatarElem.parentNode) {\r\n leftPart.append(avatarElem);\r\n }\r\n });\r\n\r\n // if were 3 and became 2\r\n (Array.from(leftPart.children) as HTMLElement[]).slice(replies.recent_repliers.length).forEach(el => el.remove());\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.append(leftPart);\r\n }\r\n \r\n let text: HTMLElement;\r\n if(replies) {\r\n if(replies.replies) {\r\n text = i18n('Comments', [replies.replies]);\r\n } else {\r\n text = i18n('LeaveAComment');\r\n }\r\n } else {\r\n text = i18n('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);\r\n } else {\r\n this.classList.add('bubble-beside-button');\r\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\r\n }\r\n\r\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\r\n appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\r\n appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\r\n this.updated = true;\r\n }\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises = undefined;\r\n }\r\n }\r\n}\r\n\r\ncustomElements.define(TAG_NAME, RepliesElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { formatTime, getFullDate } from \"../../helpers/date\";\nimport { formatNumber } from \"../../helpers/number\";\nimport { Message } from \"../../layer\";\nimport { i18n, _i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport PeerTitle from \"../peerTitle\";\nimport { wrapReply } from \"../wrappers\";\nimport Chat 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\nexport namespace MessageRender {\n /* export const setText = () => {\n\n }; */\n\n export const setTime = (chat: Chat, message: Message.message, bubble: HTMLElement, bubbleContainer: HTMLElement, messageDiv: HTMLElement) => {\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n let time = formatTime(date);\n\n if(message.views) {\n const postAuthor = message.post_author || message.fwd_from?.post_author;\n\n bubble.classList.add('channel-post');\n\n const postViewsSpan = document.createElement('span');\n postViewsSpan.classList.add('post-views');\n postViewsSpan.innerHTML = formatNumber(message.views, 1);\n\n const channelViews = document.createElement('i');\n channelViews.classList.add('tgico-channelviews', 'time-icon');\n\n args.push(postViewsSpan, channelViews);\n if(postAuthor) {\n const span = document.createElement('span');\n span.innerHTML = RichTextProcessor.wrapEmojiText(postAuthor) + ',' + NBSP;\n args.push(span);\n }\n }\n\n let editedSpan: HTMLElement;\n if(message.edit_date && chat.type !== 'scheduled' && !message.pFlags.edit_hide) {\n bubble.classList.add('is-edited');\n\n args.unshift(editedSpan = makeEdited());\n }\n\n if(chat.type !== 'pinned' && message.pFlags.pinned) {\n bubble.classList.add('is-pinned');\n\n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n \n args.push(time);\n\n const title = getFullDate(date) \n + (message.edit_date ? `\\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '')\n + (message.fwd_from ? `\\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('time', 'tgico');\n timeSpan.title = title;\n timeSpan.append(...args);\n\n const inner = document.createElement('div');\n inner.classList.add('inner', 'tgico');\n inner.title = title;\n\n let clonedArgs = args;\n if(editedSpan) {\n clonedArgs[clonedArgs.indexOf(editedSpan)] = makeEdited();\n }\n clonedArgs = clonedArgs.map(a => a instanceof HTMLElement && !a.classList.contains('i18n') ? a.cloneNode(true) as HTMLElement : a);\n clonedArgs[clonedArgs.length - 1] = formatTime(date); // clone time\n inner.append(...clonedArgs);\n\n timeSpan.append(inner);\n\n messageDiv.append(timeSpan);\n\n return timeSpan;\n };\n\n export const renderReplies = ({bubble, bubbleContainer, message, messageDiv, loadPromises, lazyLoadQueue}: {\n bubble: HTMLElement,\n bubbleContainer: HTMLElement,\n message: Message.message,\n messageDiv: HTMLElement,\n loadPromises?: Promise[],\n lazyLoadQueue?: LazyLoadQueueIntersector\n }) => {\n const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big') && !bubble.classList.contains('round');\n const repliesFooter = new RepliesElement();\n repliesFooter.message = message;\n repliesFooter.type = isFooter ? 'footer' : 'beside';\n repliesFooter.loadPromises = loadPromises;\n repliesFooter.lazyLoadQueue = lazyLoadQueue;\n repliesFooter.init();\n bubbleContainer.prepend(repliesFooter);\n return isFooter;\n };\n\n export const setReply = ({chat, bubble, bubbleContainer, message}: {\n chat: Chat,\n bubble: HTMLElement,\n bubbleContainer?: HTMLElement,\n message: Message.message\n }) => {\n const isReplacing = !bubbleContainer;\n if(isReplacing) {\n bubbleContainer = bubble.querySelector('.bubble-content');\n }\n\n const currentReplyDiv = isReplacing ? bubbleContainer.querySelector('.reply') : null;\n if(!message.reply_to_mid) {\n if(currentReplyDiv) {\n currentReplyDiv.remove();\n }\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? chat.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n let originalMessage = chat.appMessagesManager.getMessageByPeer(replyToPeerId, message.reply_to_mid);\n let originalPeerTitle: string | HTMLElement;\n \n /////////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);\n \n // need to download separately\n if(originalMessage._ === 'messageEmpty') {\n //////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n chat.appMessagesManager.wrapSingleMessage(replyToPeerId, message.reply_to_mid);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n \n originalPeerTitle = i18n('Loading');\n } else {\n originalPeerTitle = new PeerTitle({\n peerId: originalMessage.fromId || originalMessage.fwdFromId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const wrapped = wrapReply(originalPeerTitle, undefined, originalMessage);\n if(currentReplyDiv) {\n currentReplyDiv.replaceWith(wrapped);\n } else {\n bubbleContainer.append(wrapped);\n }\n //bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\r\n //return null;\r\n const rect = container.getBoundingClientRect();\r\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\r\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\r\n return document.elementFromPoint(x, y) as any;\r\n};\r\n\r\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function reflowScrollableElement(element: HTMLElement) {\r\n element.style.display = 'none';\r\n void element.offsetLeft; // reflow\r\n element.style.display = '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../config/app\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { indexOfAndSplice } from \"../../helpers/array\";\nimport { validateInitObject } from \"../../helpers/object\";\nimport I18n from \"../langPack\";\nimport { isObject } from \"../mtproto/bin_utils\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport stateStorage from \"../stateStorage\";\nimport appStateManager from \"./appStateManager\";\n\ntype EmojiLangPack = {\n keywords: {\n [keyword: string]: string[],\n },\n version: number,\n langCode: string\n};\n\nconst EMOJI_LANG_PACK: EmojiLangPack = {\n keywords: {},\n version: 0,\n langCode: App.langPackCode\n};\n\nconst RECENT_MAX_LENGTH = 36;\n\nexport class AppEmojiManager {\n private static POPULAR_EMOJI = [\"😂\", \"😘\", \"❤️\", \"😍\", \"😊\", \"😁\", \"👍\", \"☺️\", \"😔\", \"😄\", \"😭\", \"💋\", \"😒\", \"😳\", \"😜\", \"🙈\", \"😉\", \"😃\", \"😢\", \"😝\", \"😱\", \"😡\", \"😏\", \"😞\", \"😅\", \"😚\", \"🙊\", \"😌\", \"😀\", \"😋\", \"😆\", \"👌\", \"😐\", \"😕\"];\n private keywordLangPacks: {\n [langCode: string]: EmojiLangPack\n } = {};\n\n private index: SearchIndex;\n private indexedLangPacks: {[langCode: string]: boolean} = {};\n\n private getKeywordsPromises: {[langCode: string]: Promise} = {};\n\n private recent: string[];\n private getRecentEmojisPromise: Promise;\n\n /* public getPopularEmoji() {\n return stateStorage.get('emojis_popular').then(popEmojis => {\n var result = []\n if (popEmojis && popEmojis.length) {\n for (var i = 0, len = popEmojis.length; i < len; i++) {\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n }\n callback(result)\n return\n }\n\n return stateStorage.get('emojis_recent').then(recentEmojis => {\n recentEmojis = recentEmojis || popular || []\n var shortcut\n var code\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\n shortcut = recentEmojis[i]\n if (Array.isArray(shortcut)) {\n shortcut = shortcut[0]\n }\n if (shortcut && typeof shortcut === 'string') {\n if (shortcut.charAt(0) == ':') {\n shortcut = shortcut.substr(1, shortcut.length - 2)\n }\n if (code = shortcuts[shortcut]) {\n result.push({code: code, rate: 1})\n }\n }\n }\n callback(result)\n });\n });\n }\n\n function pushPopularEmoji (code) {\n getPopularEmoji(function (popularEmoji) {\n var exists = false\n var count = popularEmoji.length\n var result = []\n for (var i = 0; i < count; i++) {\n if (popularEmoji[i].code == code) {\n exists = true\n popularEmoji[i].rate++\n }\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\n }\n if (exists) {\n result.sort(function (a, b) {\n return b[1] - a[1]\n })\n } else {\n if (result.length > 41) {\n result = result.slice(0, 41)\n }\n result.push([code, 1])\n }\n ConfigStorage.set({emojis_popular: result})\n })\n } */\n\n public getEmojiKeywords(langCode: string = App.langPackCode) {\n const promise = this.getKeywordsPromises[langCode];\n if(promise) {\n return promise;\n }\n\n const storageKey: any = 'emojiKeywords_' + langCode;\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\n if(!isObject(pack)) {\n pack = {} as any;\n }\n\n validateInitObject(EMOJI_LANG_PACK, pack);\n\n // important\n pack.langCode = langCode;\n this.keywordLangPacks[langCode] = pack;\n\n return apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\n lang_code: pack.langCode,\n from_version: pack.version\n }).then((keywordsDifference) => {\n pack.version = keywordsDifference.version;\n \n const packKeywords = pack.keywords;\n const keywords = keywordsDifference.keywords;\n for(let i = 0, length = keywords.length; i < length; ++i) {\n const {keyword, emoticons} = keywords[i];\n packKeywords[keyword] = emoticons;\n }\n\n stateStorage.set({\n [storageKey]: pack\n });\n\n return pack;\n }, () => {\n return pack;\n });\n });\n }\n\n public getBothEmojiKeywords() {\n const promises: Promise[] = [\n this.getEmojiKeywords()\n ];\n\n if(I18n.lastRequestedLangCode !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(I18n.lastRequestedLangCode));\n }\n\n if(!this.recent) {\n promises.push(this.getRecentEmojis());\n }\n\n return Promise.all(promises);\n }\n\n public indexEmojis() {\n if(!this.index) {\n this.index = new SearchIndex(undefined, 2);\n }\n\n for(const langCode in this.keywordLangPacks) {\n if(this.indexedLangPacks[langCode]) {\n continue;\n }\n\n const pack = this.keywordLangPacks[langCode];\n const keywords = pack.keywords;\n\n for(const keyword in keywords) {\n const emoticons = keywords[keyword];\n this.index.indexObject(emoticons, keyword);\n }\n\n this.indexedLangPacks[langCode] = true;\n }\n }\n\n public searchEmojis(q: string) {\n this.indexEmojis();\n\n q = q.toLowerCase().replace(/_/g, ' ');\n \n //const perf = performance.now();\n let emojis: Array;\n if(q.trim()) {\n const set = this.index.search(q);\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\n } else {\n emojis = this.recent.concat(AppEmojiManager.POPULAR_EMOJI).slice(0, RECENT_MAX_LENGTH);\n }\n\n emojis = Array.from(new Set(emojis));\n //console.log('searchEmojis', q, 'time', performance.now() - perf);\n\n /* for(let i = 0, length = emojis.length; i < length; ++i) {\n if(emojis[i].includes(zeroWidthJoiner) && !emojis[i].includes('\\ufe0f')) {\n emojis[i] += '\\ufe0f';\n }\n } */\n\n return emojis;\n }\n\n public getRecentEmojis() {\n if(this.getRecentEmojisPromise) return this.getRecentEmojisPromise;\n return this.getRecentEmojisPromise = appStateManager.getState().then(state => {\n return this.recent = Array.isArray(state.recentEmoji) ? state.recentEmoji : [];\n });\n }\n\n public pushRecentEmoji(emoji: string) {\n emoji = RichTextProcessor.fixEmoji(emoji);\n this.getRecentEmojis().then(recent => {\n indexOfAndSplice(recent, emoji);\n recent.unshift(emoji);\n if(recent.length > RECENT_MAX_LENGTH) {\n recent.length = RECENT_MAX_LENGTH;\n }\n\n appStateManager.pushToState('recentEmoji', recent);\n rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n}\n\nconst appEmojiManager = new AppEmojiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appEmojiManager = appEmojiManager);\nexport default appEmojiManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab } from \"..\";\nimport { cancelEvent } from \"../../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\nimport { fastRaf } from \"../../../helpers/schedulers\";\nimport { pause } from \"../../../helpers/schedulers/pause\";\nimport appEmojiManager from \"../../../lib/appManagers/appEmojiManager\";\nimport appImManager from \"../../../lib/appManagers/appImManager\";\nimport Config from \"../../../lib/config\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\nimport rootScope from \"../../../lib/rootScope\";\nimport { emojiFromCodePoints } from \"../../../vendor/emoji\";\nimport { putPreloader } from \"../../misc\";\nimport Scrollable from \"../../scrollable\";\nimport StickyIntersector from \"../../stickyIntersector\";\nimport IS_EMOJI_SUPPORTED from \"../../../environment/emojiSupport\";\nimport { IS_TOUCH_SUPPORTED } from \"../../../environment/touchSupport\";\nimport blurActiveElement from \"../../../helpers/dom/blurActiveElement\";\n\nconst loadedURLs: Set = new Set();\nexport function appendEmoji(emoji: string, container: HTMLElement, prepend = false, unify = false) {\n //const emoji = details.unified;\n //const emoji = (details.unified as string).split('-')\n //.reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n\n let kek: string;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = RichTextProcessor.wrapSingleEmoji(emoji);\n } else {\n emoji = RichTextProcessor.fixEmoji(emoji);\n kek = RichTextProcessor.wrapEmojiText(emoji);\n }\n\n /* if(!kek.includes('emoji')) {\n console.log(emoji, kek, spanEmoji, emoji.length, new TextEncoder().encode(emoji), emojiUnicode(emoji));\n return;\n } */\n\n //console.log(kek);\n\n spanEmoji.innerHTML = kek;\n\n if(spanEmoji.children.length > 1) {\n const first = spanEmoji.firstElementChild;\n spanEmoji.innerHTML = '';\n spanEmoji.append(first);\n }\n\n if(spanEmoji.firstElementChild && !IS_EMOJI_SUPPORTED) {\n const image = spanEmoji.firstElementChild as HTMLImageElement;\n \n const url = image.src;\n if(!loadedURLs.has(url)) {\n image.setAttribute('loading', 'lazy');\n const placeholder = document.createElement('span');\n placeholder.classList.add('emoji-placeholder');\n\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '0';\n placeholder.style.opacity = '1';\n }\n\n image.addEventListener('load', () => {\n fastRaf(() => {\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '';\n placeholder.style.opacity = '';\n }\n\n spanEmoji.classList.remove('empty');\n\n loadedURLs.add(url);\n });\n }, {once: true});\n\n spanEmoji.append(placeholder);\n }\n }\n\n //spanEmoji = spanEmoji.firstElementChild as HTMLSpanElement;\n //spanEmoji.setAttribute('emoji', emoji);\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n}\n\nexport function getEmojiFromElement(element: HTMLElement) {\n if(!findUpClassName(element, 'super-emoji')) return '';\n\n if(element.nodeType === 3) return element.nodeValue;\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n \n return element.getAttribute('alt') || element.innerText;\n}\n\nexport default class EmojiTab implements EmoticonsTab {\n private content: HTMLElement;\n\n private recentItemsDiv: HTMLElement;\n\n private scroll: Scrollable;\n private stickyIntersector: StickyIntersector;\n private menu: HTMLElement;\n\n private closeScrollTop = 0;\n private setMenuActive: (id: number) => boolean;\n\n init() {\n this.content = document.getElementById('content-emoji') as HTMLDivElement;\n\n const categories: LangPackKey[] = [\n 'Emoji.SmilesAndPeople', \n 'Emoji.AnimalsAndNature', \n 'Emoji.FoodAndDrink', \n 'Emoji.TravelAndPlaces', \n 'Emoji.ActivityAndSport', \n 'Emoji.Objects', \n /* 'Emoji.Symbols', */\n 'Emoji.Flags', \n 'Skin Tones' as any\n ];\n const divs: {\n [category in LangPackKey]?: HTMLDivElement\n } = {};\n\n const sorted: Map = new Map([\n [\n 'Emoji.Recent',\n []\n ]\n ]);\n\n for(const emoji in Config.Emoji) {\n const details = Config.Emoji[emoji];\n const i = '' + details;\n const category = categories[+i[0] - 1];\n if(!category) continue; // maybe it's skin tones\n\n let s = sorted.get(category);\n if(!s) {\n s = [];\n sorted.set(category, s);\n }\n \n s[+i.slice(1) || 0] = emoji;\n }\n\n //console.log('emoticons sorted:', sorted);\n\n //Object.keys(sorted).forEach(c => sorted[c].sort((a, b) => a - b));\n\n sorted.delete(categories.pop());\n\n //console.time('emojiParse');\n sorted.forEach((emojis, category) => {\n const div = document.createElement('div');\n div.classList.add('emoji-category');\n\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('category-title');\n titleDiv.append(i18n(category));\n\n const itemsDiv = document.createElement('div');\n itemsDiv.classList.add('super-emojis');\n\n div.append(titleDiv, itemsDiv);\n\n emojis.forEach(unified => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n let emoji = emojiFromCodePoints(unified);\n //if(emoji.includes('🕵')) {\n //console.log('toCodePoints', toCodePoints(emoji));\n //emoji = emoji.replace(/(\\u200d[\\u2640\\u2642\\u2695])(?!\\ufe0f)/, '\\ufe0f$1');\n // const zwjIndex = emoji.indexOf('\\u200d');\n // if(zwjIndex !== -1 && !emoji.includes('\\ufe0f')) {\n // /* if(zwjIndex !== (emoji.length - 1)) {\n // emoji = emoji.replace(/(\\u200d)/g, '\\ufe0f$1');\n // } */\n\n // emoji += '\\ufe0f';\n // //emoji += '\\ufe0f';\n // }\n\n //debugger;\n //}\n\n appendEmoji(emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, itemsDiv, false/* , false */);\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n\n divs[category] = div;\n });\n\n //console.timeEnd('emojiParse');\n\n const menu = this.menu = this.content.previousElementSibling as HTMLElement;\n const emojiScroll = this.scroll = new Scrollable(this.content, 'EMOJI');\n\n //emojiScroll.setVirtualContainer(emojiScroll.container);\n\n const preloader = putPreloader(this.content, true);\n\n Promise.all([\n pause(200),\n appEmojiManager.getRecentEmojis().then(recent => {\n const hasRecent = !!recent.length;\n const activeId = hasRecent ? 0 : 1;\n this.menu.children[0].classList.toggle('hide', !hasRecent);\n this.menu.children[activeId].classList.add('active');\n const m = EmoticonsDropdown.menuOnClick(menu, emojiScroll, undefined, activeId);\n this.stickyIntersector = m.stickyIntersector;\n this.setMenuActive = m.setActive;\n return recent;\n })\n ]).then(([_, recent]) => {\n preloader.remove();\n\n this.recentItemsDiv = divs['Emoji.Recent'].querySelector('.super-emojis');\n for(const emoji of recent) {\n appendEmoji(emoji, this.recentItemsDiv);\n }\n\n this.recentItemsDiv.parentElement.classList.toggle('hide', !this.recentItemsDiv.childElementCount);\n\n categories.unshift('Emoji.Recent');\n categories.map(category => {\n const div = divs[category];\n \n if(!div) {\n console.error('no div by category:', category);\n }\n \n emojiScroll.container.append(div);\n this.stickyIntersector.observeStickyHeaderChanges(div);\n return div;\n });\n });\n\n this.content.addEventListener('click', this.onContentClick);\n this.init = null;\n\n rootScope.addEventListener('emoji_recent', (emoji) => {\n const children = Array.from(this.recentItemsDiv.children) as HTMLElement[];\n for(let i = 0, length = children.length; i < length; ++i) {\n const el = children[i];\n const _emoji = RichTextProcessor.fixEmoji(getEmojiFromElement(el));\n if(emoji === _emoji) {\n if(i === 0) {\n return;\n }\n\n el.remove();\n }\n }\n\n appendEmoji(emoji, this.recentItemsDiv, true);\n this.recentItemsDiv.parentElement.classList.remove('hide');\n this.menu.children[0].classList.remove('hide');\n\n if(!this.closeScrollTop) {\n this.setMenuActive(0);\n }\n });\n\n emoticonsDropdown.addEventListener('close', () => {\n this.closeScrollTop = this.scroll.scrollTop;\n });\n }\n\n onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n \n const emoji = getEmojiFromElement(e.target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n appImManager.chat.input.onEmojiSelected(emoji, false);\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n onClose() {\n\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\r\nimport { wrapVideo } from \"./wrappers\";\r\nimport { LazyLoadQueueRepeat2 } from \"./lazyLoadQueue\";\r\nimport animationIntersector from \"./animationIntersector\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport renderImageFromUrl from \"../helpers/dom/renderImageFromUrl\";\r\nimport calcImageInBox from \"../helpers/calcImageInBox\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\n\r\nconst width = 400;\r\nconst maxSingleWidth = width - 100;\r\nconst height = 100;\r\n\r\nexport default class GifsMasonry {\r\n public lazyLoadQueue: LazyLoadQueueRepeat2;\r\n private scrollPromise: CancellablePromise = Promise.resolve();\r\n private timeout: number = 0;\r\n\r\n constructor(private element: HTMLElement, private group: string, private scrollable: Scrollable, attach = true) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, (target, visible) => {\r\n if(visible) {\r\n this.processVisibleDiv(target);\r\n } else {\r\n this.processInvisibleDiv(target);\r\n }\r\n });\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = animationIntersector.byGroups[group];\r\n\r\n if(players) {\r\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter(p => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\r\n }\r\n }, .25e3); */\r\n\r\n if(attach) {\r\n this.attach();\r\n }\r\n }\r\n \r\n private onScroll = () => {\r\n if(this.timeout) {\r\n clearTimeout(this.timeout);\r\n } else {\r\n this.scrollPromise = deferredPromise();\r\n //animationIntersector.checkAnimations(true, group);\r\n }\r\n\r\n this.timeout = window.setTimeout(() => {\r\n this.timeout = 0;\r\n this.scrollPromise.resolve();\r\n //animationIntersector.checkAnimations(false, group);\r\n }, 150);\r\n };\r\n\r\n public attach() {\r\n this.scrollable.container.addEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public detach() {\r\n this.clear();\r\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n private processVisibleDiv(div: HTMLElement) {\r\n const video = div.querySelector('video');\r\n if(video) {\r\n return;\r\n }\r\n\r\n //console.log('processVisibleDiv');\r\n\r\n const load = () => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n const promise = this.scrollPromise.then(() => {\r\n const res = wrapVideo({\r\n doc,\r\n container: div as HTMLDivElement,\r\n lazyLoadQueue: null,\r\n //lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n group: this.group,\r\n noInfo: true,\r\n });\r\n \r\n const promise = res.loadPromise;\r\n promise.finally(() => {\r\n const video = div.querySelector('video');\r\n\r\n div.style.opacity = '';\r\n const img = div.querySelector('img');\r\n img && img.classList.add('hide');\r\n\r\n if(video && !video.parentElement) {\r\n setTimeout(() => {\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach(item => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }, 0);\r\n }\r\n\r\n //clearTimeout(timeout);\r\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\r\n this.processInvisibleDiv(div);\r\n }\r\n });\r\n\r\n return promise;\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n //return load();\r\n \r\n this.lazyLoadQueue.push({div, load});\r\n }\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n return this.scrollPromise.then(async() => {\r\n //return;\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n\r\n const video = div.querySelector('video');\r\n const img = div.querySelector('img');\r\n \r\n if(img) {\r\n img && img.classList.remove('hide');\r\n \r\n await doubleRaf();\r\n }\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n \r\n if(video) {\r\n video.remove();\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach(item => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }\r\n });\r\n };\r\n\r\n public add(doc: MyDocument, appendTo = this.element) {\r\n let gifWidth = doc.w;\r\n let gifHeight = doc.h;\r\n if(gifHeight < height) {\r\n gifWidth = height / gifHeight * gifWidth;\r\n gifHeight = height;\r\n }\r\n\r\n const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\r\n const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\r\n\r\n /* wastedWidth += w;\r\n\r\n if(wastedWidth === width || h < height) {\r\n wastedWidth = 0;\r\n console.log('completed line', i, line);\r\n line = [];\r\n continue;\r\n }\r\n\r\n line.push(gif); */\r\n\r\n //console.log('gif:', gif, w, h);\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('gif', 'fade-in-transition');\r\n div.style.width = size.width + 'px';\r\n div.style.opacity = '0';\r\n //div.style.height = h + 'px';\r\n div.dataset.docId = '' + doc.id;\r\n\r\n appendTo.append(div);\r\n\r\n //this.lazyLoadQueue.observe({div, load: this.processVisibleDiv});\r\n this.lazyLoadQueue.observe(div);\r\n\r\n //let preloader = new ProgressivePreloader(div);\r\n\r\n const gotThumb = appDocsManager.getThumb(doc, false);\r\n\r\n const willBeAPoster = !!gotThumb;\r\n let img: HTMLImageElement;\r\n if(willBeAPoster) {\r\n img = new Image();\r\n img.classList.add('media-poster');\r\n\r\n if(!gotThumb.cacheContext.url) {\r\n gotThumb.promise.then(() => {\r\n img.src = gotThumb.cacheContext.url;\r\n });\r\n }\r\n }\r\n\r\n const afterRender = () => {\r\n if(img) {\r\n div.append(img);\r\n div.style.opacity = '';\r\n }\r\n };\r\n\r\n (gotThumb?.cacheContext?.url ? renderImageFromUrl(img, gotThumb.cacheContext.url, afterRender) : afterRender());\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP } from \"..\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport Scrollable from \"../../scrollable\";\r\nimport { putPreloader } from \"../../misc\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport appDocsManager, {MyDocument} from \"../../../lib/appManagers/appDocsManager\";\r\n\r\nexport default class GifsTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n\r\n init() {\r\n this.content = document.getElementById('content-gifs');\r\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\r\n gifsContainer.addEventListener('click', EmoticonsDropdown.onMediaClick);\r\n\r\n const scroll = new Scrollable(this.content, 'GIFS');\r\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\r\n const preloader = putPreloader(this.content, true);\r\n\r\n apiManager.invokeApi('messages.getSavedGifs', {hash: '0'}).then((res) => {\r\n //console.log('getSavedGifs res:', res);\r\n\r\n if(res._ === 'messages.savedGifs') {\r\n res.gifs.forEach((doc, idx) => {\r\n res.gifs[idx] = doc = appDocsManager.saveDoc(doc);\r\n //if(doc._ === 'documentEmpty') return;\r\n masonry.add(doc as MyDocument);\r\n });\r\n }\r\n\r\n preloader.remove();\r\n });\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\r\n\r\n this.init = null;\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, { EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab } from \"..\";\r\nimport findUpAttribute from \"../../../helpers/dom/findUpAttribute\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport appDocsManager, { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport LazyLoadQueue, { LazyLoadQueueRepeat } from \"../../lazyLoadQueue\";\r\nimport { putPreloader } from \"../../misc\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport Scrollable, { ScrollableX } from \"../../scrollable\";\r\nimport StickyIntersector from \"../../stickyIntersector\";\r\nimport { wrapSticker, wrapStickerSetThumb } from \"../../wrappers\";\r\n\r\nexport class SuperStickerRenderer {\r\n public lazyLoadQueue: LazyLoadQueueRepeat;\r\n private animatedDivs: Set = new Set();\r\n\r\n constructor(private regularLazyLoadQueue: LazyLoadQueue, private group: string) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, (target, visible) => {\r\n if(!visible) {\r\n this.processInvisibleDiv(target as HTMLDivElement);\r\n }\r\n });\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n public renderSticker(doc: MyDocument, div?: HTMLDivElement, loadPromises?: Promise[]) {\r\n if(!div) {\r\n div = document.createElement('div');\r\n div.classList.add('grid-item', 'super-sticker');\r\n\r\n if(doc.sticker === 2) {\r\n this.observeAnimatedDiv(div);\r\n }\r\n }\r\n\r\n // * This will wrap only a thumb\r\n wrapSticker({\r\n doc, \r\n div,\r\n lazyLoadQueue: this.regularLazyLoadQueue, \r\n group: this.group, \r\n onlyThumb: doc.sticker === 2,\r\n loadPromises\r\n });\r\n\r\n return div;\r\n }\r\n\r\n public observeAnimatedDiv(div: HTMLDivElement) {\r\n this.animatedDivs.add(div);\r\n\r\n this.lazyLoadQueue.observe({\r\n div, \r\n load: this.processVisibleDiv\r\n });\r\n }\r\n\r\n private checkAnimationContainer = (div: HTMLElement, visible: boolean) => {\r\n //console.error('checkAnimationContainer', div, visible);\r\n const players = animationIntersector.getAnimations(div);\r\n players.forEach(player => {\r\n if(!visible) {\r\n animationIntersector.checkAnimation(player, true, true);\r\n } else {\r\n animationIntersector.checkAnimation(player, false);\r\n }\r\n });\r\n };\r\n\r\n private processVisibleDiv = (div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n \r\n const size = mediaSizes.active.esgSticker.width;\r\n\r\n //console.log('processVisibleDiv:', div);\r\n\r\n const promise = wrapSticker({\r\n doc, \r\n div: div as HTMLDivElement,\r\n width: size,\r\n height: size,\r\n lazyLoadQueue: null, \r\n group: this.group, \r\n onlyThumb: false,\r\n play: true,\r\n loop: true\r\n });\r\n\r\n promise.then(() => {\r\n //clearTimeout(timeout);\r\n this.checkAnimationContainer(div, this.lazyLoadQueue.intersector.isVisible(div));\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n //console.log('STICKER INvisible:', /* div, */docId);\r\n\r\n this.checkAnimationContainer(div, false);\r\n\r\n div.innerHTML = '';\r\n this.renderSticker(doc, div as HTMLDivElement);\r\n };\r\n}\r\n\r\nexport default class StickersTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n\r\n private stickerSets: {[id: string]: {\r\n stickers: HTMLElement,\r\n tab: HTMLElement\r\n }} = {};\r\n\r\n private recentDiv: HTMLElement;\r\n private recentStickers: MyDocument[] = [];\r\n\r\n private scroll: Scrollable;\r\n\r\n private menu: HTMLElement;\r\n \r\n private mounted = false;\r\n\r\n private queueCategoryPush: {element: HTMLElement, prepend: boolean}[] = [];\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private superStickerRenderer: SuperStickerRenderer;\r\n\r\n categoryPush(categoryDiv: HTMLElement, categoryTitle: string = '', promise: Promise, prepend?: boolean) {\r\n //if((docs.length % 5) !== 0) categoryDiv.classList.add('not-full');\r\n\r\n const itemsDiv = document.createElement('div');\r\n itemsDiv.classList.add('category-items', 'super-stickers');\r\n\r\n const titleDiv = document.createElement('div');\r\n titleDiv.classList.add('category-title');\r\n\r\n if(categoryTitle) {\r\n titleDiv.innerHTML = categoryTitle;\r\n }\r\n\r\n categoryDiv.append(titleDiv, itemsDiv);\r\n\r\n this.stickyIntersector.observeStickyHeaderChanges(categoryDiv);\r\n\r\n this.queueCategoryPush.push({element: categoryDiv, prepend});\r\n\r\n promise.then(documents => {\r\n documents.forEach(doc => {\r\n //if(doc._ === 'documentEmpty') return;\r\n itemsDiv.append(this.superStickerRenderer.renderSticker(doc));\r\n });\r\n\r\n if(this.queueCategoryPush.length) {\r\n this.queueCategoryPush.forEach(({element, prepend}) => {\r\n if(prepend) {\r\n if(this.recentDiv.parentElement) {\r\n this.stickersDiv.prepend(element);\r\n this.stickersDiv.prepend(this.recentDiv);\r\n } else {\r\n this.stickersDiv.prepend(element);\r\n }\r\n } else this.stickersDiv.append(element);\r\n });\r\n\r\n this.queueCategoryPush.length = 0;\r\n }\r\n });\r\n\r\n return {titleDiv};\r\n }\r\n\r\n async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\r\n const categoryDiv = document.createElement('div');\r\n categoryDiv.classList.add('sticker-category');\r\n categoryDiv.dataset.id = '' + set.id;\r\n categoryDiv.dataset.access_hash = '' + set.access_hash;\r\n\r\n const button = document.createElement('button');\r\n button.classList.add('btn-icon', 'menu-horizontal-div-item');\r\n\r\n this.stickerSets[set.id] = {\r\n stickers: categoryDiv,\r\n tab: button\r\n };\r\n\r\n if(prepend) {\r\n this.menu.insertBefore(button, this.menu.firstElementChild.nextSibling);\r\n } else {\r\n this.menu.append(button);\r\n }\r\n\r\n //stickersScroll.append(categoryDiv);\r\n\r\n const promise = appStickersManager.getStickerSet(set);\r\n this.categoryPush(categoryDiv, RichTextProcessor.wrapEmojiText(set.title), promise.then(stickerSet => stickerSet.documents as MyDocument[]), prepend);\r\n const stickerSet = await promise;\r\n\r\n //console.log('got stickerSet', stickerSet, li);\r\n \r\n wrapStickerSetThumb({\r\n set,\r\n container: button,\r\n group: EMOTICONSSTICKERGROUP,\r\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n width: 32,\r\n height: 32,\r\n autoplay: false\r\n });\r\n }\r\n\r\n init() {\r\n this.content = document.getElementById('content-stickers');\r\n //let stickersDiv = contentStickersDiv.querySelector('.os-content') as HTMLDivElement;\r\n\r\n this.recentDiv = document.createElement('div');\r\n this.recentDiv.classList.add('sticker-category', 'stickers-recent');\r\n\r\n let menuWrapper = this.content.previousElementSibling as HTMLDivElement;\r\n this.menu = menuWrapper.firstElementChild as HTMLUListElement;\r\n\r\n let menuScroll = new ScrollableX(menuWrapper);\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('stickers-categories');\r\n this.content.append(this.stickersDiv);\r\n\r\n /* stickersDiv.addEventListener('mouseover', (e) => {\r\n let target = e.target as HTMLElement;\r\n\r\n if(target.tagName === 'CANVAS') { // turn on sticker\r\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\r\n\r\n if(animation) {\r\n // @ts-ignore\r\n if(animation.currentFrame === animation.totalFrames - 1) {\r\n animation.goToAndPlay(0, true);\r\n } else {\r\n animation.play();\r\n }\r\n }\r\n }\r\n }); */\r\n\r\n rootScope.addEventListener('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!this.stickerSets[set.id] && this.mounted) {\r\n this.renderStickerSet(set, true);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(this.stickerSets[set.id] && this.mounted) {\r\n const elements = this.stickerSets[set.id];\r\n elements.stickers.remove();\r\n elements.tab.remove();\r\n delete this.stickerSets[set.id];\r\n }\r\n });\r\n\r\n this.stickersDiv.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n if(findUpClassName(target, 'category-title')) {\r\n const el = findUpAttribute(target, 'data-id');\r\n new PopupStickers({id: el.dataset.id, access_hash: el.dataset.access_hash}).show();\r\n return;\r\n }\r\n\r\n EmoticonsDropdown.onMediaClick(e);\r\n });\r\n\r\n const setTyping = (cancel = false) => {\r\n rootScope.dispatchEvent('choosing_sticker', !cancel);\r\n };\r\n\r\n this.scroll = new Scrollable(this.content, 'STICKERS');\r\n this.scroll.setVirtualContainer(this.stickersDiv);\r\n this.scroll.onAdditionalScroll = () => {\r\n setTyping();\r\n };\r\n\r\n emoticonsDropdown.addEventListener('closed', () => {\r\n setTyping(true);\r\n });\r\n\r\n emoticonsDropdown.addEventListener('opened', () => {\r\n setTyping();\r\n });\r\n\r\n this.stickyIntersector = EmoticonsDropdown.menuOnClick(this.menu, this.scroll, menuScroll).stickyIntersector;\r\n\r\n const preloader = putPreloader(this.content, true);\r\n\r\n Promise.all([\r\n appStickersManager.getRecentStickers().then(stickers => {\r\n this.recentStickers = stickers.stickers.slice(0, 20) as MyDocument[];\r\n \r\n //stickersScroll.prepend(categoryDiv);\r\n\r\n this.stickerSets['recent'] = {\r\n stickers: this.recentDiv,\r\n tab: this.menu.firstElementChild as HTMLElement\r\n };\r\n\r\n preloader.remove();\r\n const {titleDiv} = this.categoryPush(this.recentDiv, '', Promise.resolve(this.recentStickers), true);\r\n titleDiv.append(i18n('Stickers.Recent'));\r\n }),\r\n\r\n appStickersManager.getAllStickers().then((res) => {\r\n preloader.remove();\r\n\r\n for(let set of (res as MessagesAllStickers.messagesAllStickers).sets) {\r\n this.renderStickerSet(set);\r\n }\r\n })\r\n ]).finally(() => {\r\n this.mounted = true;\r\n setTyping();\r\n });\r\n\r\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP);\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue, this.superStickerRenderer.processInvisibleDiv);\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = Object.values(lottieLoader.players).filter(p => p.width === 80);\r\n \r\n console.log('STICKERS RENDERED IN PANEL:', players.length, players.filter(p => !p.paused).length, this.superStickerRenderer.lazyLoadQueue.intersector.getVisible().length);\r\n }, .25e3); */\r\n \r\n\r\n this.init = null;\r\n }\r\n\r\n pushRecentSticker(doc: MyDocument) {\r\n appStickersManager.pushRecentSticker(doc);\r\n \r\n if(!this.recentDiv?.parentElement) {\r\n return;\r\n }\r\n\r\n let div = this.recentDiv.querySelector(`[data-doc-id=\"${doc.id}\"]`);\r\n if(!div) {\r\n div = this.superStickerRenderer.renderSticker(doc);\r\n }\r\n\r\n const items = this.recentDiv.querySelector('.category-items');\r\n items.prepend(div);\r\n\r\n if(items.childElementCount > 20) {\r\n (Array.from(items.children) as HTMLElement[]).slice(20).forEach(el => el.remove());\r\n }\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { toast } from \"../../components/toast\";\r\nimport { BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessagesBotResults, ReplyMarkup } from \"../../layer\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\r\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\r\nimport appUsersManager, { MyTopPeer } from \"./appUsersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport rootScope from \"../rootScope\";\r\nimport appDraftsManager from \"./appDraftsManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport { insertInDescendSortedArray } from \"../../helpers/array\";\r\nimport appStateManager from \"./appStateManager\";\r\n\r\nexport class AppInlineBotsManager {\r\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\r\n private setHash: {\r\n [botId: UserId]: {\r\n peerId: PeerId, \r\n time: number\r\n }\r\n } = {};\r\n\r\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\r\n return geo._ === 'geoPoint' ? {\r\n _: 'inputGeoPoint',\r\n lat: geo.lat,\r\n long: geo.long,\r\n accuracy_radius: geo.accuracy_radius\r\n } : {\r\n _: 'inputGeoPointEmpty'\r\n };\r\n }\r\n\r\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\r\n return apiManagerProxy.invokeApi('messages.getInlineBotResults', {\r\n bot: appUsersManager.getUserInput(botId),\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n query,\r\n geo_point: geo ? this.getGeoInput(geo) : undefined,\r\n offset\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then(botResults => {\r\n const queryId = botResults.query_id;\r\n\r\n /* if(botResults.switch_pm) {\r\n botResults.switch_pm.rText = RichTextProcessor.wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\r\n } */\r\n \r\n botResults.results.forEach(result => {\r\n if(result._ === 'botInlineMediaResult') {\r\n if(result.document) {\r\n result.document = appDocsManager.saveDoc(result.document);\r\n }\r\n \r\n if(result.photo) {\r\n result.photo = appPhotosManager.savePhoto(result.photo);\r\n }\r\n }\r\n \r\n this.inlineResults[this.generateQId(queryId, result.id)] = result;\r\n });\r\n\r\n return botResults;\r\n });\r\n }\r\n\r\n public generateQId(queryId: MessagesBotResults.messagesBotResults['query_id'], resultId: string) {\r\n return queryId + '_' + resultId;\r\n }\r\n\r\n private pushPopularBot(botId: BotId) {\r\n appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\r\n const botPeerId = botId.toPeerId();\r\n const index = topPeers.findIndex(topPeer => topPeer.id === botPeerId);\r\n let topPeer: MyTopPeer;\r\n if(index !== -1) {\r\n topPeer = topPeers[index];\r\n } else {\r\n topPeer = {\r\n id: botPeerId,\r\n rating: 0\r\n };\r\n }\r\n\r\n ++topPeer.rating;\r\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\r\n\r\n appStateManager.setKeyValueToStorage('topPeersCache');\r\n \r\n // rootScope.$broadcast('inline_bots_popular')\r\n });\r\n }\r\n\r\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\r\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\r\n rootScope.dispatchEvent('history_focus', {peerId: botId.toPeerId()});\r\n return appMessagesManager.startBot(botId, undefined, startParam);\r\n }\r\n \r\n /*\r\n function resolveInlineMention (username) {\r\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\r\n if (peerId.isUser()) {\r\n var bot = AppUsersManager.getUser(peerId)\r\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\r\n var resolvedBot = {\r\n username: username,\r\n id: peerId,\r\n placeholder: bot.bot_inline_placeholder\r\n }\r\n if (bot.pFlags.bot_inline_geo &&\r\n GeoLocationManager.isAvailable()) {\r\n return checkGeoLocationAccess(peerId).then(function () {\r\n return GeoLocationManager.getPosition().then(function (coords) {\r\n resolvedBot.geo = coords\r\n return qSync.when(resolvedBot)\r\n })\r\n })['catch'](function () {\r\n return qSync.when(resolvedBot)\r\n })\r\n }\r\n return qSync.when(resolvedBot)\r\n }\r\n }\r\n return $q.reject()\r\n }, function (error) {\r\n error.handled = true\r\n return $q.reject(error)\r\n })\r\n }\r\n \r\n function regroupWrappedResults (results, rowW, rowH) {\r\n if (!results ||\r\n !results[0] ||\r\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\r\n return\r\n }\r\n var ratios = []\r\n angular.forEach(results, function (result) {\r\n var w\r\n var h, doc\r\n var photo\r\n if (result._ === 'botInlineMediaResult') {\r\n if (doc = result.document) {\r\n w = result.document.w\r\n h = result.document.h\r\n }\r\n else if (photo = result.photo) {\r\n var photoSize = (photo.sizes || [])[0]\r\n w = photoSize && photoSize.w\r\n h = photoSize && photoSize.h\r\n }\r\n }else {\r\n w = result.w\r\n h = result.h\r\n }\r\n if (!w || !h) {\r\n w = h = 1\r\n }\r\n ratios.push(w / h)\r\n })\r\n \r\n var rows = []\r\n var curCnt = 0\r\n var curW = 0\r\n angular.forEach(ratios, function (ratio) {\r\n var w = ratio * rowH\r\n curW += w\r\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\r\n curCnt++\r\n } else {\r\n rows.push(curCnt)\r\n curCnt = 1\r\n curW = w\r\n }\r\n })\r\n if (curCnt) {\r\n rows.push(curCnt)\r\n }\r\n \r\n var i = 0\r\n var thumbs = []\r\n var lastRowI = rows.length - 1\r\n angular.forEach(rows, function (rowCnt, rowI) {\r\n var lastRow = rowI === lastRowI\r\n var curRatios = ratios.slice(i, i + rowCnt)\r\n var sumRatios = 0\r\n angular.forEach(curRatios, function (ratio) {\r\n sumRatios += ratio\r\n })\r\n angular.forEach(curRatios, function (ratio, j) {\r\n var thumbH = rowH\r\n var thumbW = rowW * ratio / sumRatios\r\n var realW = thumbH * ratio\r\n if (lastRow && thumbW > realW) {\r\n thumbW = realW\r\n }\r\n var result = results[i + j]\r\n result.thumbW = Math.floor(thumbW) - 2\r\n result.thumbH = Math.floor(thumbH) - 2\r\n })\r\n \r\n i += rowCnt\r\n })\r\n } */\r\n\r\n public async checkSwitchReturn(botId: BotId) {\r\n const bot = appUsersManager.getUser(botId);\r\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\r\n return;\r\n }\r\n\r\n const peerData = this.setHash[botId];\r\n if(peerData) {\r\n delete this.setHash[botId];\r\n if((Date.now() - peerData.time) < 3600e3) {\r\n return peerData.peerId;\r\n }\r\n }\r\n }\r\n\r\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\r\n rootScope.dispatchEvent('history_focus', {peerId, threadId});\r\n appDraftsManager.setDraft(peerId, threadId, '@' + appUsersManager.getUser(botId).username + ' ' + query);\r\n }\r\n\r\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\r\n return apiManagerProxy.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n msg_id: appMessagesIdsManager.getServerMessageId(mid),\r\n data: button.data\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((callbackAnswer) => {\r\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\r\n toast(RichTextProcessor.wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\r\n }\r\n \r\n //console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\r\n });\r\n }\r\n \r\n /* function gameButtonClick (id) {\r\n var message = AppMessagesManager.getMessage(id)\r\n var peerId = AppMessagesManager.getMessagePeer(message)\r\n \r\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: AppPeersManager.getInputPeerByID(peerId),\r\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\r\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\r\n if (typeof callbackAnswer.message === 'string' &&\r\n callbackAnswer.message.length) {\r\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\r\n }\r\n else if (typeof callbackAnswer.url === 'string') {\r\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\r\n }\r\n })\r\n } */\r\n\r\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: Partial<{\r\n viaBotId: BotId,\r\n queryId: string,\r\n resultId: string,\r\n replyMarkup: ReplyMarkup,\r\n entities: MessageEntity[],\r\n replyToMsgId: number,\r\n clearDraft: true,\r\n scheduleDate: number,\r\n silent: true,\r\n geoPoint: GeoPoint\r\n }> = {}) {\r\n const inlineResult = this.inlineResults[queryAndResultIds];\r\n if(!inlineResult) {\r\n return;\r\n }\r\n\r\n this.pushPopularBot(botId);\r\n const splitted = queryAndResultIds.split('_');\r\n const queryID = splitted.shift();\r\n const resultID = splitted.join('_');\r\n options.viaBotId = botId;\r\n options.queryId = queryID;\r\n options.resultId = resultID;\r\n if(inlineResult.send_message.reply_markup) {\r\n options.replyMarkup = inlineResult.send_message.reply_markup;\r\n }\r\n \r\n if(inlineResult.send_message._ === 'botInlineMessageText') {\r\n options.entities = inlineResult.send_message.entities;\r\n appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\r\n } else {\r\n let caption = '';\r\n let inputMedia: InputMedia;\r\n const sendMessage = inlineResult.send_message;\r\n switch(sendMessage._) {\r\n case 'botInlineMessageMediaAuto': {\r\n caption = sendMessage.message;\r\n\r\n if(inlineResult._ === 'botInlineMediaResult') {\r\n const {document, photo} = inlineResult;\r\n if(document) {\r\n inputMedia = appDocsManager.getMediaInput(document as MyDocument);\r\n } else {\r\n inputMedia = appPhotosManager.getMediaInput(photo as MyPhoto);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaGeo': {\r\n inputMedia = {\r\n _: 'inputMediaGeoPoint',\r\n geo_point: this.getGeoInput(sendMessage.geo)\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n \r\n case 'botInlineMessageMediaVenue': {\r\n inputMedia = {\r\n _: 'inputMediaVenue',\r\n geo_point: this.getGeoInput(sendMessage.geo),\r\n title: sendMessage.title,\r\n address: sendMessage.address,\r\n provider: sendMessage.provider,\r\n venue_id: sendMessage.venue_id,\r\n venue_type: sendMessage.venue_type\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaContact': {\r\n inputMedia = {\r\n _: 'inputMediaContact',\r\n phone_number: sendMessage.phone_number,\r\n first_name: sendMessage.first_name,\r\n last_name: sendMessage.last_name,\r\n vcard: sendMessage.vcard\r\n };\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(!inputMedia) {\r\n inputMedia = {\r\n _: 'messageMediaPending',\r\n type: inlineResult.type,\r\n file_name: inlineResult.title || \r\n (inlineResult as BotInlineResult.botInlineResult).content?.url || \r\n (inlineResult as BotInlineResult.botInlineResult).url,\r\n size: 0,\r\n progress: {percent: 30, total: 0}\r\n } as any;\r\n }\r\n\r\n appMessagesManager.sendOther(peerId, inputMedia, options);\r\n }\r\n }\r\n \r\n /* function checkGeoLocationAccess (botID) {\r\n var key = 'bot_access_geo' + botID\r\n return Storage.get(key).then(function (geoAccess) {\r\n if (geoAccess && geoAccess.granted) {\r\n return true\r\n }\r\n return ErrorService.confirm({\r\n type: 'BOT_ACCESS_GEO_INLINE'\r\n }).then(function () {\r\n var setHash = {}\r\n setHash[key] = {granted: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return true\r\n }, function () {\r\n var setHash = {}\r\n setHash[key] = {denied: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return $q.reject()\r\n })\r\n })\r\n } */\r\n}\r\n\r\nconst appInlineBotsManager = new AppInlineBotsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appInlineBotsManager = appInlineBotsManager);\r\nexport default appInlineBotsManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport appSidebarRight from \"..\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport appInlineBotsManager, { AppInlineBotsManager } from \"../../../lib/appManagers/appInlineBotsManager\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport type { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport { NULL_PEER_ID } from \"../../../lib/mtproto/mtproto_config\";\r\n\r\nconst ANIMATIONGROUP = 'GIFS-SEARCH';\r\n\r\nexport default class AppGifsTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private gifsDiv: HTMLDivElement;\r\n\r\n private nextOffset = '';\r\n private loadedAll = false;\r\n\r\n private gifBotPeerId: PeerId;\r\n private masonry: GifsMasonry;\r\n\r\n private searchPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.id = 'search-gifs-container';\r\n \r\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\r\n this.reset();\r\n this.search(value);\r\n });\r\n \r\n this.title.replaceWith(this.inputSearch.container);\r\n \r\n this.gifsDiv = document.createElement('div');\r\n this.gifsDiv.classList.add('gifs-masonry');\r\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.scrollable.append(this.gifsDiv);\r\n \r\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\r\n //this.backBtn.parentElement.append(this.inputSearch.container);\r\n }\r\n\r\n private onGifsClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'gif');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n if(mediaSizes.isMobile) {\r\n appSidebarRight.onCloseBtnClick();\r\n }\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n public onClose() {\r\n this.scrollable.onScrolledBottom = () => {};\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.reset();\r\n this.gifsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\r\n this.inputSearch.remove();\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n private reset() {\r\n this.searchPromise = null;\r\n this.nextOffset = '';\r\n this.loadedAll = false;\r\n this.masonry.clear();\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.search('', true);\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n this.search(this.inputSearch.value, false);\r\n };\r\n });\r\n return ret;\r\n }\r\n\r\n public async search(query: string, newSearch = true) {\r\n if(this.searchPromise || this.loadedAll) return;\r\n\r\n if(!this.gifBotPeerId) {\r\n this.gifBotPeerId = (await appUsersManager.resolveUsername('gif')).id.toPeerId(false);\r\n }\r\n\r\n try {\r\n this.searchPromise = appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\r\n const { results, next_offset } = await this.searchPromise;\r\n\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n this.searchPromise = null;\r\n this.nextOffset = next_offset;\r\n if(newSearch) {\r\n this.gifsDiv.innerHTML = '';\r\n }\r\n\r\n if(results.length) {\r\n results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult' && result.document) {\r\n this.masonry.add(result.document as MyDocument);\r\n }\r\n });\r\n } else {\r\n this.loadedAll = true;\r\n }\r\n\r\n this.scrollable.onScroll();\r\n } catch(err) {\r\n this.searchPromise = null;\r\n console.error('gifs loading error:', err);\r\n throw err;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport appSidebarRight from \"..\";\r\nimport { StickerSet, StickerSetCovered } from \"../../../layer\";\r\nimport { forEachReverse } from \"../../../helpers/array\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppStickersTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private setsDiv: HTMLDivElement;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n\r\n protected init() {\r\n this.container.id = 'stickers-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n\r\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\r\n this.search(value);\r\n });\r\n\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.setsDiv = document.createElement('div');\r\n this.setsDiv.classList.add('sticker-sets');\r\n this.scrollable.append(this.setsDiv);\r\n\r\n attachClickEvent(this.setsDiv, (e) => {\r\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(sticker) {\r\n const docId = sticker.dataset.docId;\r\n appImManager.chat.input.sendMessageWithDocument(docId);\r\n return;\r\n }\r\n\r\n const target = findUpClassName(e.target, 'sticker-set');\r\n if(!target) return;\r\n\r\n const id = target.dataset.stickerSet as string;\r\n const access_hash = target.dataset.access_hash as string;\r\n\r\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\r\n if(button) {\r\n e.preventDefault();\r\n e.cancelBubble = true;\r\n\r\n button.setAttribute('disabled', 'true');\r\n \r\n appStickersManager.getStickerSet({id, access_hash}).then(full => {\r\n appStickersManager.toggleStickerSet(full.set).then(changed => {\r\n if(changed) {\r\n button.textContent = '';\r\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n button.classList.toggle('gray', !!full.set.installed_date);\r\n }\r\n }).finally(() => {\r\n //button.style.width = set.installed_date ? '68px' : '52px';\r\n button.removeAttribute('disabled');\r\n });\r\n });\r\n } else {\r\n appStickersManager.getStickerSet({id, access_hash}).then(full => {\r\n new PopupStickers(full.set).show();\r\n });\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.setsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n public renderSet(set: StickerSet.stickerSet) {\r\n //console.log('renderSet:', set);\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n const header = document.createElement('div');\r\n header.classList.add('sticker-set-header');\r\n\r\n const details = document.createElement('div');\r\n details.classList.add('sticker-set-details');\r\n details.innerHTML = `\r\n
${RichTextProcessor.wrapEmojiText(set.title)}
\r\n `;\r\n\r\n const countDiv = document.createElement('div');\r\n countDiv.classList.add('sticker-set-count');\r\n countDiv.append(i18n('Stickers', [set.count]));\r\n details.append(countDiv);\r\n \r\n const button = document.createElement('button');\r\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\r\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n // button.style.width = set.installed_date ? '68px' : '52px';\r\n\r\n if(set.installed_date) {\r\n button.classList.add('gray');\r\n }\r\n\r\n //ripple(button);\r\n\r\n header.append(details, button);\r\n\r\n const stickersDiv = document.createElement('div');\r\n stickersDiv.classList.add('sticker-set-stickers');\r\n\r\n const count = Math.min(5, set.count);\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add('sticker-set-sticker');\r\n\r\n stickersDiv.append(stickerDiv);\r\n }\r\n\r\n appStickersManager.getStickerSet(set).then(set => {\r\n //console.log('renderSet got set:', set);\r\n \r\n for(let i = 0; i < count; ++i) {\r\n const div = stickersDiv.children[i] as HTMLDivElement;\r\n const doc = set.documents[i];\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n\r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n group: 'STICKERS-SEARCH', \r\n /* play: false,\r\n loop: false, */\r\n play: true,\r\n loop: true,\r\n width: 68,\r\n height: 68\r\n });\r\n }\r\n });\r\n\r\n /* const onMouseOver = () => {\r\n const animations: AnimationItem['animation'][] = [];\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\r\n const animationItem = animationIntersector.getAnimation(stickerDiv);\r\n if(!animationItem) continue;\r\n\r\n const animation = animationItem.animation;\r\n\r\n animations.push(animation);\r\n animation.loop = true;\r\n animation.play();\r\n }\r\n\r\n div.addEventListener('mouseout', () => {\r\n animations.forEach(animation => {\r\n animation.loop = false;\r\n });\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true});\r\n }, {once: true});\r\n };\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\r\n\r\n div.dataset.stickerSet = '' + set.id;\r\n div.dataset.access_hash = '' + set.access_hash;\r\n div.dataset.title = set.title;\r\n\r\n div.append(header, stickersDiv);\r\n\r\n this.setsDiv.append(div);\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.renderFeatured();\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n public renderFeatured() {\r\n return appStickersManager.getFeaturedStickers().then(coveredSets => {\r\n if(this.inputSearch.value) {\r\n return;\r\n }\r\n\r\n coveredSets = this.filterRendered('', coveredSets);\r\n coveredSets.forEach(set => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n\r\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\r\n coveredSets = coveredSets.slice();\r\n\r\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\r\n forEachReverse(children, el => {\r\n const id = el.dataset.stickerSet;\r\n const index = coveredSets.findIndex(covered => covered.set.id === id);\r\n \r\n if(index !== -1) {\r\n coveredSets.splice(index, 1);\r\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\r\n el.remove();\r\n }\r\n });\r\n\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n\r\n return coveredSets;\r\n }\r\n\r\n public search(query: string) {\r\n if(!query) {\r\n return this.renderFeatured();\r\n }\r\n\r\n return appStickersManager.searchStickerSets(query, false).then(coveredSets => {\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n //console.log('search result:', coveredSets);\r\n\r\n coveredSets = this.filterRendered(query, coveredSets);\r\n coveredSets.forEach(set => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { attachClickEvent } from \"./dom/clickEvent\";\r\nimport findUpAsChild from \"./dom/findUpAsChild\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\nimport ListenerSetter from \"./listenerSetter\";\r\nimport { safeAssign } from \"./object\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\n\r\nconst KEEP_OPEN = false;\r\nconst TOGGLE_TIMEOUT = 200;\r\nconst ANIMATION_DURATION = 200;\r\n\r\nexport default class DropdownHover extends EventListenerBase<{\r\n open: () => Promise | void,\r\n opened: () => any,\r\n close: () => any,\r\n closed: () => any\r\n}> {\r\n protected element: HTMLElement;\r\n protected displayTimeout: number;\r\n protected forceClose = false;\r\n protected inited = false;\r\n\r\n constructor(options: {\r\n element: DropdownHover['element']\r\n }) {\r\n super(false);\r\n safeAssign(this, options);\r\n }\r\n\r\n public attachButtonListener(button: HTMLElement, listenerSetter: ListenerSetter) {\r\n let firstTime = true;\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(button, () => {\r\n if(firstTime) {\r\n firstTime = false;\r\n this.toggle(true);\r\n } else {\r\n this.toggle();\r\n }\r\n }, {listenerSetter});\r\n } else {\r\n listenerSetter.add(button)('mouseover', (e) => {\r\n //console.log('onmouseover button');\r\n if(firstTime) {\r\n listenerSetter.add(button)('mouseout', this.onMouseOut);\r\n firstTime = false;\r\n }\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(true);\r\n }, TOGGLE_TIMEOUT);\r\n });\r\n }\r\n }\r\n\r\n private onMouseOut = (e: MouseEvent) => {\r\n if(KEEP_OPEN) return;\r\n clearTimeout(this.displayTimeout);\r\n if(!this.isActive()) return;\r\n\r\n const toElement = (e as any).toElement as Element;\r\n if(toElement && findUpAsChild(toElement, this.element)) {\r\n return;\r\n }\r\n\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(false);\r\n }, TOGGLE_TIMEOUT);\r\n };\r\n\r\n protected init() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.onmouseout = this.onMouseOut;\r\n this.element.onmouseover = (e) => {\r\n if(this.forceClose) {\r\n return;\r\n }\r\n\r\n //console.log('onmouseover element');\r\n clearTimeout(this.displayTimeout);\r\n };\r\n }\r\n }\r\n\r\n public toggle = async(enable?: boolean) => {\r\n //if(!this.element) return;\r\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\r\n if(this.init) {\r\n if(willBeActive) {\r\n this.init();\r\n this.init = null;\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n if(willBeActive === this.isActive()) {\r\n return;\r\n }\r\n \r\n if((this.element.style.display && enable === undefined) || enable) {\r\n const res = this.dispatchEvent('open');\r\n await Promise.all(res);\r\n\r\n this.element.style.display = '';\r\n void this.element.offsetLeft; // reflow\r\n this.element.classList.add('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.forceClose = false;\r\n this.dispatchEvent('opened');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n // ! can't use together with resizeObserver\r\n /* if(isTouchSupported) {\r\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n console.log('[ESG]: toggle: enable height', height);\r\n appImManager.chat.bubbles.scrollable.scrollTop += height;\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n } else {\r\n this.dispatchEvent('close');\r\n\r\n this.element.classList.remove('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.element.style.display = 'none';\r\n this.forceClose = false;\r\n this.dispatchEvent('closed');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n /* if(isTouchSupported) {\r\n const scrollHeight = this.container.scrollHeight;\r\n if(scrollHeight) {\r\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\r\n }\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n }\r\n\r\n //animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\r\n };\r\n\r\n public isActive() {\r\n return this.element.classList.contains('active');\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport { horizontalMenu } from \"../horizontalMenu\";\nimport LazyLoadQueue, { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport appSidebarRight from \"../sidebarRight\";\nimport StickyIntersector from \"../stickyIntersector\";\nimport EmojiTab from \"./tabs/emoji\";\nimport GifsTab from \"./tabs/gifs\";\nimport StickersTab from \"./tabs/stickers\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppGifsTab from \"../sidebarRight/tabs/gifs\";\nimport AppStickersTab from \"../sidebarRight/tabs/stickers\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport DropdownHover from \"../../helpers/dropdownHover\";\nimport { pause } from \"../../helpers/schedulers/pause\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\n\nexport const EMOTICONSSTICKERGROUP = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n init: () => void,\n onCloseAfterTimeout?: () => void\n}\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue();\n\n private emojiTab: EmojiTab;\n public stickersTab: StickersTab;\n private gifsTab: GifsTab;\n\n private container: HTMLElement;\n private tabsEl: HTMLElement;\n private tabId = -1;\n\n private tabs: {[id: number]: EmoticonsTab};\n\n private searchButton: HTMLElement;\n private deleteBtn: HTMLElement;\n\n private selectTab: ReturnType;\n\n private savedRange: Range;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement\n });\n\n this.addEventListener('open', async() => {\n if(IS_TOUCH_SUPPORTED) {\n //appImManager.chat.input.saveScroll();\n if(blurActiveElement()) {\n await pause(100);\n }\n }\n\n if(this.element.parentElement !== appImManager.chat.input.chatInput) {\n appImManager.chat.input.chatInput.append(this.element);\n }\n\n this.savedRange = this.getGoodRange();\n\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.unlock();\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n });\n\n this.addEventListener('close', () => {\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.lock();\n\n // нужно залочить группу и выключить стикеры\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('closed', () => {\n // теперь можно убрать visible, чтобы они не включились после фокуса\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n\n this.savedRange = undefined;\n });\n }\n\n protected init() {\n this.emojiTab = new EmojiTab();\n this.stickersTab = new StickersTab();\n this.gifsTab = new GifsTab();\n\n this.tabs = {\n 0: this.emojiTab,\n 1: this.stickersTab,\n 2: this.gifsTab\n };\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const tab = this.tabs[this.tabId];\n if(tab.init) {\n tab.init();\n }\n\n tab.onCloseAfterTimeout && tab.onCloseAfterTimeout();\n animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n });\n\n this.searchButton = this.element.querySelector('.emoji-tabs-search');\n this.searchButton.addEventListener('click', () => {\n if(this.tabId === 1) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n new AppStickersTab(appSidebarRight).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n new AppGifsTab(appSidebarRight).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n this.deleteBtn.addEventListener('click', (e) => {\n const input = appImManager.chat.input.messageInput;\n if((input.lastChild as any)?.tagName) {\n input.lastElementChild.remove();\n } else if(input.lastChild) {\n if(!input.lastChild.textContent.length) {\n input.lastChild.remove();\n } else {\n input.lastChild.textContent = input.lastChild.textContent.slice(0, -1);\n }\n }\n\n const event = new Event('input', {bubbles: true, cancelable: true});\n appImManager.chat.input.messageInput.dispatchEvent(event);\n //appSidebarRight.stickersTab.init();\n\n cancelEvent(e);\n });\n \n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? 1 : 0;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n (this.tabsEl.children[INIT_TAB_ID + 1] as HTMLLIElement).click(); // set emoji tab\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\n\n rootScope.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n return;\n }\n \n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === 0);\n this.deleteBtn.classList.toggle('hide', this.tabId !== 0);\n };\n\n private checkRights = () => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const canSendStickers = appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers');\n tabsElements[2].toggleAttribute('disabled', !canSendStickers);\n\n const canSendGifs = appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs');\n tabsElements[3].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== 1 && (!canSendStickers || !canSendGifs)) {\n this.selectTab(0, false);\n }\n };\n\n public static menuOnClick = (menu: HTMLElement, scroll: Scrollable, menuScroll?: ScrollableX, prevId = 0) => {\n let jumpedTo = -1;\n\n const setActive = (id: number) => {\n if(id === prevId) {\n return false;\n }\n\n menu.children[prevId].classList.remove('active');\n menu.children[id].classList.add('active');\n prevId = id;\n\n return true;\n };\n\n const stickyIntersector = new StickyIntersector(scroll.container, (stuck, target) => {\n //console.log('sticky scrollTOp', stuck, target, scroll.container.scrollTop);\n\n if(Math.abs(jumpedTo - scroll.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const which = whichChild(target);\n if(!stuck && which) { // * due to stickyIntersector\n return;\n }\n\n setActive(which);\n\n if(menuScroll) {\n if(which < menu.childElementCount - 4) {\n menuScroll.container.scrollLeft = (which - 3) * 47;\n } else {\n menuScroll.container.scrollLeft = which * 47;\n }\n }\n });\n\n menu.addEventListener('click', (e) => {\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'menu-horizontal-div-item');\n\n if(!target) {\n return;\n }\n\n const which = whichChild(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(!setActive(which)) {\n return;\n }\n\n const element = (scroll.splitUp || scroll.container).children[which] as HTMLElement;\n const offsetTop = element.offsetTop + 1; // * due to stickyIntersector\n\n scroll.container.scrollTop = jumpedTo = offsetTop;\n\n //console.log('set scrollTop:', offsetTop);\n });\n\n return {stickyIntersector, setActive};\n };\n\n public static onMediaClick = (e: {target: EventTarget | Element}, clearDraft = false) => {\n let target = e.target as HTMLElement;\n target = findUpTag(target, 'DIV');\n\n if(!target) return false;\n \n const fileId = target.dataset.docId;\n if(!fileId) return false;\n\n if(appImManager.chat.input.sendMessageWithDocument(fileId, undefined, clearDraft)) {\n /* dropdown.classList.remove('active');\n toggleEl.classList.remove('active'); */\n if(emoticonsDropdown.container) {\n emoticonsDropdown.forceClose = true;\n emoticonsDropdown.container.classList.add('disable-hover');\n emoticonsDropdown.toggle(false);\n }\n\n return true;\n } else {\n console.warn('got no doc by id:', fileId);\n return false;\n }\n };\n\n public addLazyLoadQueueRepeat(lazyLoadQueue: LazyLoadQueueIntersector, processInvisibleDiv: (div: HTMLElement) => void) {\n this.addEventListener('close', () => {\n lazyLoadQueue.lock();\n });\n\n this.addEventListener('closed', () => {\n const divs = lazyLoadQueue.intersector.getVisible();\n\n for(const div of divs) {\n processInvisibleDiv(div);\n }\n\n lazyLoadQueue.intersector.clearVisible();\n });\n\n this.addEventListener('opened', () => {\n lazyLoadQueue.unlockAndRefresh();\n });\n }\n\n public getSavedRange() {\n return this.getGoodRange() || this.savedRange;\n }\n\n private getGoodRange() {\n const sel = document.getSelection();\n if(sel.rangeCount && document.activeElement === appImManager.chat.input.messageInput) {\n return sel.getRangeAt(0);\n }\n }\n}\n\nconst emoticonsDropdown = new EmoticonsDropdown();\nMOUNT_CLASS_TO.emoticonsDropdown = emoticonsDropdown;\nexport default emoticonsDropdown;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport type { AppMessagesManager, HistoryResult, HistoryStorage, MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\r\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\r\nimport type { AppPhotosManager } from \"../../lib/appManagers/appPhotosManager\";\r\nimport type { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\r\nimport type { AppDraftsManager } from \"../../lib/appManagers/appDraftsManager\";\r\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport { getObjectKeysAndSort } from \"../../helpers/object\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport { logger } from \"../../lib/logger\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport BubbleGroups from \"./bubbleGroups\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupStickers from \"../popups/stickers\";\r\nimport ProgressivePreloader from \"../preloader\";\r\nimport Scrollable, { SliceSides } from \"../scrollable\";\r\nimport StickyIntersector from \"../stickyIntersector\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\r\nimport I18n, { FormatterArguments, i18n, langPack } from \"../../lib/langPack\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { ripple } from \"../ripple\";\r\nimport { wrapAlbum, wrapPhoto, wrapVideo, wrapDocument, wrapSticker, wrapPoll, wrapGroupedDocuments } from \"../wrappers\";\r\nimport { MessageRender } from \"./messageRender\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport PollElement from \"../poll\";\r\nimport AudioElement from \"../audio\";\r\nimport { Message, MessageEntity, MessageReplyHeader, Photo, PhotoSize, ReplyMarkup, Update, WebPage } from \"../../layer\";\r\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport { FocusDirection } from \"../../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf, fastRafPromise } from \"../../helpers/schedulers\";\r\nimport { deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport RepliesElement from \"./replies\";\r\nimport DEBUG from \"../../config/debug\";\r\nimport { SliceEnd } from \"../../helpers/slicedArray\";\r\nimport serverTimeManager from \"../../lib/mtproto/serverTimeManager\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport { forEachReverse } from \"../../helpers/array\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { toast } from \"../toast\";\r\nimport { getElementByPoint } from \"../../helpers/dom/getElementByPoint\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\r\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\r\nimport reflowScrollableElement from \"../../helpers/dom/reflowScrollableElement\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { cancelAnimationByKey } from \"../../helpers/animation\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { formatNumber } from \"../../helpers/number\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport windowSize from \"../../helpers/windowSize\";\r\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\r\nimport AppMediaViewer from \"../appMediaViewer\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport handleHorizontalSwipe from \"../../helpers/dom/handleHorizontalSwipe\";\r\nimport { cancelContextMenuOpening } from \"../misc\";\r\nimport findUpAttribute from \"../../helpers/dom/findUpAttribute\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\n\r\nconst USE_MEDIA_TAILS = false;\r\nconst IGNORE_ACTIONS: Set = new Set([\r\n 'messageActionHistoryClear',\r\n 'messageActionChatCreate'/* ,\r\n 'messageActionChannelMigrateFrom' */\r\n]);\r\n\r\nconst 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\nexport default class ChatBubbles {\r\n public bubblesContainer: HTMLDivElement;\r\n private chatInner: HTMLDivElement;\r\n public scrollable: Scrollable;\r\n\r\n private getHistoryTopPromise: Promise;\r\n private getHistoryBottomPromise: Promise;\r\n\r\n public peerId: PeerId;\r\n //public messagesCount: number = -1;\r\n\r\n private unreadOut = new Set();\r\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\r\n\r\n public bubbles: {[mid: string]: HTMLDivElement} = {};\r\n public skippedMids: Set = new Set();\r\n private dateMessages: {[timestamp: number]: { \r\n div: HTMLDivElement, \r\n firstTimestamp: number, \r\n container: HTMLDivElement,\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 unreadedObserver: IntersectionObserver;\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 loadedTopTimes = 0;\r\n private loadedBottomTimes = 0;\r\n\r\n public messagesQueuePromise: Promise = null;\r\n private messagesQueue: {message: any, bubble: HTMLElement, reverse: boolean, promises: Promise[]}[] = [];\r\n private messagesQueueOnRender: () => void = null;\r\n private messagesQueueOnRenderAdditional: () => void = null;\r\n\r\n private firstUnreadBubble: HTMLDivElement = null;\r\n private attachedUnreadBubble: boolean;\r\n\r\n public lazyLoadQueue: LazyLoadQueue;\r\n\r\n private middleware = getMiddleware();\r\n\r\n private log: ReturnType;\r\n\r\n public listenerSetter: ListenerSetter;\r\n\r\n private replyFollowHistory: number[] = [];\r\n\r\n private isHeavyAnimationInProgress = false;\r\n private scrollingToBubble: HTMLElement;\r\n\r\n private isFirstLoad = true;\r\n private needReflowScroll: boolean;\r\n\r\n private fetchNewPromise: Promise;\r\n private historyStorage: HistoryStorage;\r\n\r\n private passEntities: Partial<{\r\n [_ in MessageEntity['_']]: boolean\r\n }> = {};\r\n\r\n private onAnimateLadder: () => Promise | void;\r\n // private ladderDeferred: CancellablePromise;\r\n private resolveLadderAnimation: () => Promise;\r\n private emptyPlaceholderMid: number;\r\n\r\n private viewsObserver: IntersectionObserver;\r\n private viewsMids: Set = new Set();\r\n private sendViewCountersDebounced: () => Promise;\r\n\r\n private isTopPaddingSet = false;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appStickersManager: AppStickersManager, \r\n private appUsersManager: AppUsersManager, \r\n private appInlineBotsManager: AppInlineBotsManager, \r\n private appPhotosManager: AppPhotosManager, \r\n private appPeersManager: AppPeersManager,\r\n private appProfileManager: AppProfileManager,\r\n private appDraftsManager: AppDraftsManager,\r\n private appMessagesIdsManager: AppMessagesIdsManager\r\n ) {\r\n //this.chat.log.error('Bubbles construction');\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.bubblesContainer = document.createElement('div');\r\n this.bubblesContainer.classList.add('bubbles', 'scrolled-down');\r\n\r\n this.chatInner = document.createElement('div');\r\n this.chatInner.classList.add('bubbles-inner');\r\n\r\n this.setScroll();\r\n\r\n this.bubblesContainer.append(this.scrollable.container);\r\n\r\n // * constructor end\r\n\r\n this.log = this.chat.log;\r\n this.bubbleGroups = new BubbleGroups(this.chat);\r\n this.preloader = new ProgressivePreloader({\r\n cancelable: false\r\n });\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n\r\n // * events\r\n\r\n // will call when sent for update pos\r\n this.listenerSetter.add(rootScope)('history_update', ({storage, peerId, mid}) => {\r\n if(this.chat.getMessagesStorage() === storage) {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const message = this.chat.getMessage(mid);\r\n \r\n if(+bubble.dataset.timestamp >= (message.date + serverTimeManager.serverTimeOffset - 1)) {\r\n this.bubbleGroups.changeBubbleMid(bubble, mid);\r\n return;\r\n }\r\n\r\n this.setBubblePosition(bubble, message, false);\r\n //this.log('history_update', this.bubbles[mid], mid, message);\r\n\r\n if(this.scrollingToBubble) {\r\n this.scrollToBubbleEnd();\r\n }\r\n\r\n //this.renderMessage(message, false, false, bubble);\r\n }\r\n });\r\n\r\n //this.listenerSetter.add(rootScope)('')\r\n\r\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n this.deleteMessagesByIds(Object.keys(this.bubbles).map(m => +m));\r\n }\r\n });\r\n\r\n // Calls when message successfully sent and we have an id\r\n this.listenerSetter.add(rootScope)('message_sent', (e) => {\r\n const {storage, tempId, tempMessage, mid} = e;\r\n\r\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\r\n if(this.chat.getMessagesStorage() !== storage) {\r\n return;\r\n }\r\n \r\n //this.log('message_sent', e);\r\n\r\n const mounted = this.getMountedBubble(tempId, tempMessage) || this.getMountedBubble(mid);\r\n if(mounted) {\r\n const message = this.chat.getMessage(mid);\r\n const bubble = mounted.bubble;\r\n //this.bubbles[mid] = bubble;\r\n \r\n /////this.log('message_sent', bubble);\r\n\r\n if(message.replies) {\r\n const repliesElement = bubble.querySelector('replies-element') as RepliesElement;\r\n if(repliesElement) {\r\n repliesElement.message = message;\r\n repliesElement.init();\r\n }\r\n }\r\n\r\n if(message.media?.document) {\r\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\r\n if(div) {\r\n const container = findUpClassName(div, 'document-container');\r\n\r\n if(!tempMessage.media?.document?.thumbs?.length && message.media.document.thumbs?.length) {\r\n div.replaceWith(wrapDocument({message}));\r\n }\r\n\r\n if(container) {\r\n container.dataset.mid = '' + mid;\r\n }\r\n }\r\n }\r\n\r\n // set new mids to album items for mediaViewer\r\n if(message.grouped_id) {\r\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\r\n if(item) {\r\n item.dataset.mid = '' + mid;\r\n }\r\n }\r\n\r\n if(message.media?.poll) {\r\n const pollElement = bubble.querySelector('poll-element') as PollElement;\r\n if(pollElement) {\r\n const newPoll = message.media.poll;\r\n pollElement.message = message;\r\n pollElement.setAttribute('poll-id', newPoll.id);\r\n pollElement.setAttribute('message-id', '' + mid);\r\n }\r\n }\r\n\r\n if(message.media?.document) {\r\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\r\n if(element) {\r\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\r\n element.dataset.mid = '' + message.mid;\r\n delete element.dataset.isOutgoing;\r\n (element as any).message = message;\r\n (element as any).onLoad(true);\r\n } else {\r\n element.dataset.docId = message.media.document.id;\r\n }\r\n }\r\n }\r\n\r\n /* bubble.classList.remove('is-sending');\r\n bubble.classList.add('is-sent');\r\n bubble.dataset.mid = '' + mid;\r\n\r\n this.bubbleGroups.removeBubble(bubble, tempId); */\r\n\r\n if(message.media?.webpage && !bubble.querySelector('.web')) {\r\n getHeavyAnimationPromise().then(() => {\r\n this.safeRenderMessage(message, true, false, bubble, false);\r\n this.scrollToBubbleIfLast(bubble);\r\n });\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return;\r\n this.renderMessage(mounted.message, true, false, mounted.bubble, false); */\r\n }\r\n \r\n //delete this.bubbles[tempId];\r\n } else {\r\n this.log.warn('message_sent there is no bubble', e);\r\n }\r\n\r\n const bubbles = this.bubbles;\r\n if(bubbles[tempId]) {\r\n const bubble = bubbles[tempId];\r\n bubbles[mid] = bubble;\r\n delete bubbles[tempId];\r\n\r\n //getHeavyAnimationPromise().then(() => {\r\n fastRaf(() => {\r\n if(bubble.classList.contains('is-sending')) {\r\n bubble.classList.remove('is-sending');\r\n bubble.classList.add(this.peerId === rootScope.myId && this.chat.type !== 'scheduled' ? 'is-read' : 'is-sent');\r\n }\r\n });\r\n //});\r\n\r\n bubble.dataset.mid = '' + mid;\r\n }\r\n\r\n if(this.unreadOut.has(tempId)) {\r\n this.unreadOut.delete(tempId);\r\n this.unreadOut.add(mid);\r\n }\r\n\r\n // * check timing of scheduled message\r\n if(this.chat.type === 'scheduled') {\r\n const timestamp = Date.now() / 1000 | 0;\r\n const maxTimestamp = tempMessage.date - 10;\r\n //this.log('scheduled timing:', timestamp, maxTimestamp);\r\n if(timestamp >= maxTimestamp) {\r\n this.deleteMessagesByIds([mid]);\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_edit', ({storage, peerId, mid}) => {\r\n // fastRaf(() => {\r\n if(storage !== this.chat.getMessagesStorage()) return;\r\n const message = this.chat.getMessage(mid);\r\n const mounted = message.grouped_id ? this.getGroupedBubble(message.grouped_id) : this.getMountedBubble(mid);\r\n if(!mounted) return;\r\n\r\n const updatePosition = this.chat.type === 'scheduled';\r\n const scrolledDown = this.scrolledDown;\r\n this.safeRenderMessage(mounted.message, true, false, mounted.bubble, updatePosition);\r\n if(scrolledDown) {\r\n this.scrollToBubbleIfLast(mounted.bubble);\r\n }\r\n\r\n if(updatePosition) {\r\n (this.messagesQueuePromise || Promise.resolve()).then(() => {\r\n this.deleteEmptyDateGroups();\r\n });\r\n }\r\n // });\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, groupId, deletedMids}) => {\r\n //fastRaf(() => { // ! can't use delayed smth here, need original bubble to be edited\r\n if(peerId !== this.peerId) return;\r\n const mids = this.appMessagesManager.getMidsByAlbum(groupId);\r\n const renderedId = mids.concat(deletedMids).find(mid => this.bubbles[mid]);\r\n if(!renderedId) return;\r\n\r\n const renderMaxId = getObjectKeysAndSort(this.appMessagesManager.groupedMessagesStorage[groupId], 'asc').pop();\r\n\r\n this.safeRenderMessage(this.chat.getMessage(renderMaxId), true, false, this.bubbles[renderedId], false);\r\n //});\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('messages_downloaded', ({peerId, mids}) => {\r\n const middleware = this.getMiddleware();\r\n getHeavyAnimationPromise().then(() => {\r\n if(!middleware()) return;\r\n\r\n (mids as number[]).forEach(mid => {\r\n /* const promise = (this.scrollable.scrollLocked && this.scrollable.scrollLockedPromise) || Promise.resolve();\r\n promise.then(() => {\r\n \r\n }); */\r\n forEachReverse(this.needUpdate, (obj, idx) => {\r\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\r\n const {mid, replyMid} = this.needUpdate.splice(idx, 1)[0];\r\n \r\n //this.log('messages_downloaded', mid, replyMid, i, this.needUpdate, this.needUpdate.length, mids, this.bubbles[mid]);\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n \r\n const message = this.chat.getMessage(mid);\r\n \r\n const repliedMessage = this.appMessagesManager.getMessageByPeer(obj.replyToPeerId, replyMid);\r\n if(repliedMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\r\n delete message.reply_to_mid; // ! WARNING!\r\n }\r\n \r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n message\r\n });\r\n }\r\n });\r\n });\r\n });\r\n });\r\n\r\n // attachClickEvent(this.bubblesContainer, this.onBubblesClick, {listenerSetter: this.listenerSetter});\r\n this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n const className = 'is-gesturing-reply';\r\n const MAX = 64;\r\n const replyAfter = MAX * .75;\r\n let shouldReply = false;\r\n let target: HTMLElement;\r\n let icon: HTMLElement;\r\n handleHorizontalSwipe({\r\n element: this.bubblesContainer,\r\n verifyTouchTarget: (e) => {\r\n if(this.chat.selection.isSelecting || !this.appMessagesManager.canSendToPeer(this.peerId, this.chat.threadId)) {\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 if(DEBUG) {\r\n this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {\r\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\r\n if(bubble) {\r\n const mid = +bubble.dataset.mid\r\n this.log('debug message:', this.chat.getMessage(mid));\r\n this.highlightBubble(bubble);\r\n }\r\n });\r\n }\r\n\r\n if(!IS_MOBILE) {\r\n this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {\r\n if(this.chat.selection.isSelecting || \r\n !this.appMessagesManager.canSendToPeer(this.peerId, this.chat.threadId)) {\r\n return;\r\n }\r\n \r\n const target = e.target as HTMLElement;\r\n const bubble = target.classList.contains('bubble') ? \r\n target : \r\n (target.classList.contains('document-selection') ? target.parentElement : null);\r\n if(bubble && !bubble.classList.contains('bubble-first')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = this.chat.getMessage(mid);\r\n if(message.pFlags.is_outgoing) {\r\n return;\r\n }\r\n \r\n this.chat.input.initMessageReply(mid);\r\n }\r\n });\r\n }\r\n\r\n /* if(false) */this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\r\n for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n if(dateMessage.container === target) {\r\n dateMessage.div.classList.toggle('is-sticky', stuck);\r\n break;\r\n }\r\n }\r\n });\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 this.isHeavyAnimationInProgress = false;\r\n\r\n if(middleware && middleware()) {\r\n this.lazyLoadQueue.unlock();\r\n this.lazyLoadQueue.refresh();\r\n }\r\n\r\n middleware = null;\r\n }, this.listenerSetter);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n // will call when message is sent (only 1)\r\n this.listenerSetter.add(rootScope)('history_append', ({storage, mid}) => {\r\n if(storage !== this.chat.getMessagesStorage()) return;\r\n\r\n if(!this.scrollable.loadedAll.bottom) {\r\n this.chat.setMessageId();\r\n } else {\r\n this.renderNewMessagesByIds([mid], true);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('history_multiappend', (msgIdsByPeer) => {\r\n if(!(this.peerId in msgIdsByPeer)) return;\r\n const msgIds = Array.from(msgIdsByPeer[this.peerId]).slice().sort((a, b) => b - a);\r\n this.renderNewMessagesByIds(msgIds);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(peerId === this.peerId) {\r\n this.deleteMessagesByIds(Array.from(msgs));\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\r\n if(peerId === this.peerId) {\r\n this.chat.input.setUnreadCount();\r\n this.updateUnreadByDialog();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.peerId]) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\r\n if(this.peerId === dialog.peerId) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.peerId === chatId.toPeerId(true)) {\r\n const hadRights = this.chatInner.classList.contains('has-rights');\r\n const hasRights = this.appMessagesManager.canSendToPeer(this.peerId, this.chat.threadId);\r\n\r\n if(hadRights !== hasRights) {\r\n this.finishPeerChange();\r\n this.chat.input.updateMessageInput();\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', (e) => {\r\n if(e.key === 'settings.emoji.big') {\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(!isScrolledDown) {\r\n this.setMessagesQueuePromise();\r\n }\r\n \r\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n mids.forEach(mid => {\r\n const bubble = this.bubbles[mid];\r\n if(bubble.classList.contains('can-have-big-emoji')) {\r\n const message = this.chat.getMessage(mid);\r\n this.safeRenderMessage(message, undefined, false, bubble);\r\n // this.bubbleGroups.addBubble(bubble, message, false);\r\n }\r\n });\r\n\r\n if(isScrolledDown) {\r\n this.scrollable.scrollTop = 99999;\r\n } else {\r\n this.performHistoryResult([], true, false, undefined);\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_views', ({peerId, views, mid}) => {\r\n if(this.peerId !== peerId) return;\r\n\r\n fastRaf(() => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\r\n if(postViewsElements.length) {\r\n const str = formatNumber(views, 1);\r\n let different = false;\r\n postViewsElements.forEach(postViews => {\r\n if(different || postViews.innerHTML !== str) {\r\n different = true;\r\n postViews.innerHTML = str;\r\n }\r\n });\r\n }\r\n });\r\n });\r\n\r\n this.unreadedObserver = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\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\r\n this.viewsObserver = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if(entry.isIntersecting) {\r\n this.viewsMids.add(+(entry.target as HTMLElement).dataset.mid);\r\n this.viewsObserver.unobserve(entry.target);\r\n this.sendViewCountersDebounced();\r\n }\r\n });\r\n });\r\n\r\n this.sendViewCountersDebounced = debounce(() => {\r\n const mids = [...this.viewsMids];\r\n this.viewsMids.clear();\r\n\r\n this.appMessagesManager.incrementMessageViews(this.peerId, mids);\r\n }, 1000, false, true);\r\n\r\n if('ResizeObserver' in window) {\r\n let wasHeight = this.scrollable.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\r\n const onResizeEnd = () => {\r\n const height = this.scrollable.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.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 = (entries: any) => {\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.scrollTop = 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 // @ts-ignore\r\n const resizeObserver = new ResizeObserver(processEntries);\r\n resizeObserver.observe(this.bubblesContainer);\r\n }\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.unreadedObserver.unobserve(target);\r\n this.unreaded.delete(target);\r\n this.readUnreaded();\r\n }\r\n\r\n private readUnreaded() {\r\n if(this.readPromise) return;\r\n\r\n const middleware = this.getMiddleware();\r\n this.readPromise = rootScope.idle.focusPromise.then(() => {\r\n if(!middleware()) return;\r\n let maxId = Math.max(...Array.from(this.unreadedSeen));\r\n\r\n // ? if message with maxId is not rendered ?\r\n if(this.scrollable.loadedAll.bottom) {\r\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map(i => +i));\r\n if(maxId >= bubblesMaxId) {\r\n maxId = Math.max(this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId).maxId || 0, maxId);\r\n }\r\n }\r\n\r\n this.unreaded.forEach((mid, target) => {\r\n if(mid <= maxId) {\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n\r\n const readContents: number[] = [];\r\n for(const mid of this.unreadedSeen) {\r\n const message: MyMessage = this.chat.getMessage(mid);\r\n if(this.appMessagesManager.isMentionUnread(message)) {\r\n readContents.push(mid);\r\n }\r\n }\r\n\r\n this.appMessagesManager.readMessages(this.peerId, readContents);\r\n\r\n this.unreadedSeen.clear();\r\n\r\n if(DEBUG) {\r\n this.log('will readHistory by maxId:', maxId);\r\n }\r\n\r\n // return;\r\n \r\n return this.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\r\n this.log.error('readHistory err:', err);\r\n this.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\r\n }).finally(() => {\r\n if(!middleware()) return;\r\n this.readPromise = undefined;\r\n\r\n if(this.unreadedSeen.size) {\r\n this.readUnreaded();\r\n }\r\n });\r\n });\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', (e) => {\r\n const {peerId, mids, pinned} = e;\r\n if(peerId !== this.peerId) return;\r\n\r\n if(mids) {\r\n if(!pinned) {\r\n this.deleteMessagesByIds(mids);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public constructScheduledHelpers() {\r\n const onUpdate = () => {\r\n this.chat.topbar.setTitle(this.appMessagesManager.getScheduledMessagesStorage(this.peerId).size);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId, mid}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.renderNewMessagesByIds([mid]);\r\n onUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.deleteMessagesByIds(mids);\r\n onUpdate();\r\n });\r\n }\r\n\r\n public onBubblesClick = (e: Event) => {\r\n let target = e.target as HTMLElement;\r\n let bubble: HTMLElement = null;\r\n try {\r\n bubble = findUpClassName(target, 'bubble');\r\n } catch(err) {}\r\n \r\n if(!bubble) return;\r\n\r\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\r\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n for(const timestamp in this.dateMessages) {\r\n const d = this.dateMessages[timestamp];\r\n if(d.div === bubble) {\r\n new PopupDatePicker(new Date(+timestamp), this.onDatePick).show();\r\n break;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\r\n this.chat.selection.toggleByElement(bubble);\r\n return;\r\n }\r\n\r\n // ! Trusted - due to audio autoclick\r\n if(this.chat.selection.isSelecting && e.isTrusted) {\r\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n //console.log('bubble click', e);\r\n\r\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\r\n this.chat.selection.selectedText = undefined;\r\n return;\r\n }\r\n\r\n //this.chatSelection.toggleByBubble(bubble);\r\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\r\n return;\r\n }\r\n\r\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\r\n if(contactDiv) {\r\n this.chat.appImManager.setInnerPeer(contactDiv.dataset.peerId.toPeerId());\r\n return;\r\n }\r\n\r\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\r\n if(commentsDiv) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n if(this.peerId === REPLIES_PEER_ID) {\r\n const message = this.chat.getMessage(bubbleMid) as Message.message;\r\n const peerId = this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id);\r\n const threadId = message.reply_to.reply_to_top_id;\r\n const lastMsgId = message.fwd_from.saved_from_msg_id;\r\n this.chat.appImManager.openThread(peerId, lastMsgId, threadId);\r\n } else {\r\n const message = this.appMessagesManager.filterMessages(this.chat.getMessage(bubbleMid), message => !!(message as Message.message).replies)[0] as Message.message;\r\n const replies = message.replies;\r\n if(replies) {\r\n this.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then(message => {\r\n this.chat.appImManager.setInnerPeer(replies.channel_id.toPeerId(true), undefined, 'discussion', (message as MyMessage).mid);\r\n });\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n const via = findUpClassName(target, 'is-via');\r\n if(via) {\r\n const el = via.querySelector('.peer-title') as HTMLElement;\r\n if(target === el || findUpAsChild(target, el)) {\r\n const message = el.innerText + ' ';\r\n this.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\r\n cancelEvent(e);\r\n \r\n return;\r\n }\r\n }\r\n\r\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\r\n if(nameDiv && nameDiv !== bubble) {\r\n target = nameDiv || target;\r\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer');\r\n const savedFrom = target.dataset.savedFrom;\r\n if(typeof(peerIdStr) === 'string' || savedFrom) {\r\n if(savedFrom) {\r\n const [peerId, mid] = savedFrom.split('_');\r\n \r\n this.chat.appImManager.setInnerPeer(peerId.toPeerId(), +mid);\r\n } else {\r\n const peerId = peerIdStr.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer(peerId);\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n //this.log('chatInner click:', target);\r\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\r\n /* if(isVideoComponentElement) {\r\n const video = target.parentElement.querySelector('video') as HTMLElement;\r\n if(video) {\r\n video.click(); // hot-fix for time and play button\r\n return;\r\n }\r\n } */\r\n\r\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\r\n const messageId = +bubble.dataset.mid;\r\n const message = this.chat.getMessage(messageId);\r\n\r\n const doc = message.media?.document;\r\n\r\n if(doc?.stickerSetInput) {\r\n new PopupStickers(doc.stickerSetInput).show();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const documentDiv = findUpClassName(target, 'document-with-thumb');\r\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) \r\n || target.classList.contains('album-item')\r\n // || isVideoComponentElement\r\n || (target.tagName === 'VIDEO' && !bubble.classList.contains('round'))\r\n || (documentDiv && !documentDiv.querySelector('.preloader-container'))) {\r\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\r\n const messageId = +(groupedItem || bubble).dataset.mid;\r\n const message = this.chat.getMessage(messageId);\r\n if(!message) {\r\n this.log.warn('no message by messageId:', messageId);\r\n return;\r\n }\r\n\r\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\r\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\r\n\r\n const f = documentDiv ? (media: any) => {\r\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\r\n } : (media: any) => {\r\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\r\n };\r\n\r\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\r\n const ids = isSingleMedia ? [messageId] : Object.keys(this.bubbles).map(k => +k).filter(id => {\r\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\r\n return false;\r\n } */\r\n //if(!this.scrollable.visibleElements.find(e => e.element === this.bubbles[id])) return false;\r\n\r\n const message = this.chat.getMessage(id);\r\n const media = this.appMessagesManager.getMediaFromMessage(message);\r\n \r\n return media && f(media);\r\n }).sort((a, b) => a - b);\r\n\r\n ids.forEach(id => {\r\n let selector: string;\r\n if(documentDiv) {\r\n selector = '.document-container';\r\n } else {\r\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\r\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\r\n if(withTail) {\r\n selector += '.bubble__media-container';\r\n } else {\r\n selector += '.attachment video, .attachment img';\r\n }\r\n }\r\n\r\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\r\n const parents: Set = new Set();\r\n if(documentDiv) {\r\n elements.forEach((element) => {\r\n targets.push({\r\n element: element.querySelector('.document-ico'),\r\n mid: +element.dataset.mid,\r\n peerId: this.peerId\r\n });\r\n });\r\n } else {\r\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\r\n elements.forEach((element) => {\r\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\r\n let albumItem = findUpClassName(element, 'album-item');\r\n const parent = albumItem || element.parentElement;\r\n if(parents.has(parent)) return;\r\n parents.add(parent);\r\n targets.push({\r\n element,\r\n mid: albumItem ? +albumItem.dataset.mid : id,\r\n peerId: this.peerId\r\n });\r\n });\r\n }\r\n });\r\n\r\n targets.sort((a, b) => a.mid - b.mid);\r\n\r\n let idx = targets.findIndex(t => t.mid === messageId);\r\n\r\n if(DEBUG) {\r\n this.log('open mediaViewer single with ids:', ids, idx, targets);\r\n }\r\n\r\n if(!targets[idx]) {\r\n this.log('no target for media viewer!', target);\r\n return;\r\n }\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n threadId: this.chat.threadId,\r\n peerId: this.peerId,\r\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\r\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\r\n isScheduled: this.chat.type === 'scheduled'\r\n })\r\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\r\n \r\n cancelEvent(e);\r\n //appMediaViewer.openMedia(message, target as HTMLImageElement);\r\n return;\r\n }\r\n \r\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\r\n \r\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\r\n if(target.classList.contains('goto-original')) {\r\n const savedFrom = bubble.dataset.savedFrom;\r\n const [peerId, mid] = savedFrom.split('_');\r\n ////this.log('savedFrom', peerId, msgID);\r\n this.chat.appImManager.setInnerPeer(peerId.toPeerId(), +mid);\r\n return;\r\n } else if(target.classList.contains('forward')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = this.appMessagesManager.getMessageByPeer(this.peerId, mid);\r\n new PopupForward({\r\n [this.peerId]: this.appMessagesManager.getMidsByMessage(message)\r\n });\r\n //appSidebarRight.forwardTab.open([mid]);\r\n return;\r\n }\r\n \r\n let isReplyClick = false;\r\n \r\n try {\r\n isReplyClick = !!findUpClassName(e.target, 'reply');\r\n } catch(err) {}\r\n \r\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n this.replyFollowHistory.push(bubbleMid);\r\n\r\n const message = this.chat.getMessage(bubbleMid) as Message.message;\r\n\r\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\r\n const replyToMid = message.reply_to.reply_to_msg_id;\r\n\r\n this.chat.appImManager.setInnerPeer(replyToPeerId, replyToMid, this.chat.type, this.chat.threadId);\r\n\r\n /* if(this.chat.type === 'discussion') {\r\n this.chat.appImManager.setMessageId(, originalMessageId);\r\n } else {\r\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\r\n } */\r\n //this.chat.setMessageId(, originalMessageId);\r\n }\r\n }\r\n \r\n //console.log('chatInner click', e);\r\n };\r\n\r\n public onGoDownClick() {\r\n if(this.replyFollowHistory.length) {\r\n forEachReverse(this.replyFollowHistory, (mid, idx) => {\r\n const bubble = this.bubbles[mid];\r\n let bad = true;\r\n if(bubble) {\r\n const rect = bubble.getBoundingClientRect();\r\n bad = (windowSize.windowH / 2) > rect.top;\r\n } else {\r\n const message = this.chat.getMessage(mid);\r\n if(!message.deleted) {\r\n bad = false;\r\n }\r\n }\r\n \r\n if(bad) {\r\n this.replyFollowHistory.splice(idx, 1);\r\n }\r\n });\r\n\r\n this.replyFollowHistory.sort((a, b) => b - a);\r\n\r\n const mid = this.replyFollowHistory.pop();\r\n this.chat.setMessageId(mid);\r\n } else {\r\n this.chat.setMessageId(/* , dialog.top_message */);\r\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n \r\n // if(dialog) {\r\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\r\n // } else {\r\n // this.log('will scroll down 3');\r\n // this.scroll.scrollTop = this.scroll.scrollHeight;\r\n // }\r\n }\r\n }\r\n\r\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\r\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\r\n /* if(element) {\r\n if(element.classList.contains('bubbles-date-group')) {\r\n const children = Array.from(element.children) as HTMLElement[];\r\n if(verticalSide === 'top') {\r\n element = children[this.stickyIntersector ? 2 : 1];\r\n } else {\r\n element = children[children.length - 1];\r\n }\r\n } else {\r\n element = findUpClassName(element, 'bubble');\r\n if(element && element.classList.contains('is-date')) {\r\n element = element.nextElementSibling as HTMLElement;\r\n }\r\n }\r\n } */\r\n if(element) element = findUpClassName(element, 'bubble');\r\n\r\n return element;\r\n }\r\n\r\n public getGroupedBubble(groupId: string) {\r\n const group = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n for(const [mid] of group) {\r\n if(this.bubbles[mid]) {\r\n const maxId = Math.max(...group.keys()); // * because in scheduled album can be rendered by lowest mid during sending\r\n return {\r\n bubble: this.bubbles[mid], \r\n mid: +mid,\r\n message: this.chat.getMessage(maxId)\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public getBubbleGroupedItems(bubble: HTMLElement) {\r\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\r\n }\r\n\r\n public getMountedBubble(mid: number, message = this.chat.getMessage(mid)) {\r\n if(message.grouped_id && this.appMessagesManager.getMidsByAlbum(message.grouped_id).length > 1) {\r\n const a = this.getGroupedBubble(message.grouped_id);\r\n if(a) {\r\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\r\n return a;\r\n }\r\n }\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n return {bubble, mid, message};\r\n }\r\n\r\n private findNextMountedBubbleByMsgId(mid: number) {\r\n return this.bubbles[getObjectKeysAndSort(this.bubbles).find(id => {\r\n if(id < mid) return false;\r\n return !!this.bubbles[id]?.parentElement;\r\n })];\r\n }\r\n\r\n public loadMoreHistory(top: boolean, justLoad = false) {\r\n //this.log('loadMoreHistory', top);\r\n if(!this.peerId || \r\n /* TEST_SCROLL || */ \r\n this.chat.setPeerPromise || \r\n this.isHeavyAnimationInProgress || \r\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) || \r\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\r\n ) {\r\n return;\r\n }\r\n\r\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\r\n const history = Object.keys(this.bubbles).map(id => +id).sort((a, b) => a - b);\r\n if(!history.length) return;\r\n \r\n if(top) {\r\n if(DEBUG) {\r\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n /* if(history.length === 75) {\r\n this.log('load more', this.scrollable.scrollHeight, this.scrollable.scrollTop, this.scrollable);\r\n return;\r\n } */\r\n /* false && */this.getHistory(history[0], true, undefined, undefined, justLoad);\r\n } else {\r\n //let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n \r\n // if scroll down after search\r\n if(history.indexOf(historyStorage.maxId) !== -1) {\r\n this.setLoaded('bottom', true);\r\n return;\r\n }\r\n\r\n if(DEBUG) {\r\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n /* false && */this.getHistory(history[history.length - 1], false, true, undefined, justLoad);\r\n }\r\n }\r\n\r\n public onScroll = () => {\r\n //return;\r\n \r\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\r\n if(this.isHeavyAnimationInProgress && this.scrolledDown) return;\r\n //lottieLoader.checkAnimations(false, 'chat');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\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);\r\n }\r\n \r\n if(this.scrollable.getDistanceToEnd() < 300 && this.scrollable.loadedAll.bottom) {\r\n this.bubblesContainer.classList.add('scrolled-down');\r\n this.scrolledDown = true;\r\n } else if(this.bubblesContainer.classList.contains('scrolled-down')) {\r\n this.bubblesContainer.classList.remove('scrolled-down');\r\n this.scrolledDown = false;\r\n }\r\n\r\n if(this.chat.topbar.pinnedMessage) {\r\n this.chat.topbar.pinnedMessage.setCorrectIndex(this.scrollable.lastScrollDirection);\r\n }\r\n };\r\n\r\n public setScroll() {\r\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\r\n this.setLoaded('top', false);\r\n this.setLoaded('bottom', false);\r\n\r\n this.scrollable.container.append(this.chatInner);\r\n\r\n /* const getScrollOffset = () => {\r\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\r\n return 300; \r\n };\r\n\r\n window.addEventListener('resize', () => {\r\n this.scrollable.onScrollOffset = getScrollOffset();\r\n });\r\n\r\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\r\n\r\n this.scrollable.onAdditionalScroll = this.onScroll;\r\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\r\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\r\n //this.scrollable.attachSentinels(undefined, 300);\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.scrollable.container.addEventListener('touchmove', () => {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n }, {passive: true});\r\n\r\n this.scrollable.container.addEventListener('touchend', () => {\r\n if(!this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n }\r\n\r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }, {passive: true});\r\n }\r\n }\r\n\r\n public updateUnreadByDialog() {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\r\n \r\n ///////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\r\n \r\n for(const msgId of this.unreadOut) {\r\n if(msgId > 0 && msgId <= maxId) {\r\n const bubble = this.bubbles[msgId];\r\n if(bubble) {\r\n if(bubble.classList.contains('is-sending')) {\r\n continue;\r\n }\r\n \r\n bubble.classList.remove('is-sent', 'is-sending'); // 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 this.unreadOut.delete(msgId);\r\n }\r\n }\r\n }\r\n \r\n public deleteMessagesByIds(mids: number[], permanent = true) {\r\n mids.forEach(mid => {\r\n if(!(mid in this.bubbles)) return;\r\n \r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return; */\r\n\r\n const bubble = this.bubbles[mid];\r\n delete this.bubbles[mid];\r\n this.skippedMids.delete(mid);\r\n\r\n if(this.firstUnreadBubble === bubble) {\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n this.bubbleGroups.removeBubble(bubble);\r\n if(this.unreadedObserver) {\r\n this.unreadedObserver.unobserve(bubble);\r\n this.unreaded.delete(bubble);\r\n }\r\n if(this.viewsObserver) {\r\n this.viewsObserver.unobserve(bubble);\r\n this.viewsMids.delete(mid);\r\n }\r\n //this.unreaded.findAndSplice(mid => mid === id);\r\n bubble.remove();\r\n //bubble.remove();\r\n\r\n if(this.emptyPlaceholderMid === mid) {\r\n this.emptyPlaceholderMid = undefined;\r\n }\r\n });\r\n\r\n if(permanent && this.chat.selection.isSelecting) {\r\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\r\n }\r\n \r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP);\r\n this.deleteEmptyDateGroups();\r\n }\r\n \r\n public renderNewMessagesByIds(mids: number[], scrolledDown?: boolean) {\r\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\r\n //this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\r\n return;\r\n }\r\n\r\n if(this.chat.threadId) {\r\n mids = mids.filter(mid => {\r\n const message = this.chat.getMessage(mid);\r\n const replyTo = message.reply_to as MessageReplyHeader;\r\n return replyTo && (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) === this.chat.threadId;\r\n });\r\n }\r\n\r\n mids = mids.filter(mid => !this.bubbles[mid]);\r\n // ! should scroll even without new messages\r\n /* if(!mids.length) {\r\n return;\r\n } */\r\n\r\n if(!scrolledDown) {\r\n scrolledDown = this.scrolledDown && (!this.scrollingToBubble || this.scrollingToBubble === this.getLastBubble());\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n let isPaddingNeeded = false;\r\n let setPaddingTo: HTMLElement;\r\n if(!this.isTopPaddingSet) {\r\n const {clientHeight, scrollHeight} = this.scrollable.container;\r\n isPaddingNeeded = clientHeight === scrollHeight;\r\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\r\n if(this.chatInner.firstElementChild) {\r\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\r\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\r\n } else {\r\n isPaddingNeeded = true;\r\n } */\r\n\r\n if(isPaddingNeeded) {\r\n /* const add = clientHeight - scrollHeight;\r\n this.chatInner.style.paddingTop = add + 'px';\r\n this.scrollable.scrollTop += add; */\r\n setPaddingTo = this.chatInner;\r\n setPaddingTo.style.paddingTop = clientHeight + 'px';\r\n this.scrollable.scrollTop = scrollHeight;\r\n this.isTopPaddingSet = true;\r\n }\r\n }\r\n\r\n const promise = this.performHistoryResult(mids, false, true);\r\n if(scrolledDown) {\r\n promise.then(() => {\r\n if(!middleware()) return;\r\n //this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\r\n //const bubble = this.bubbles[Math.max(...mids)];\r\n\r\n let bubble: HTMLElement;\r\n if(this.chat.type === 'scheduled') {\r\n bubble = this.bubbles[Math.max(...mids)];\r\n }\r\n\r\n const promise = this.scrollToBubbleEnd(bubble) || Promise.resolve();\r\n if(isPaddingNeeded) {\r\n promise.then(() => { // it will be called only once even if was set multiple times (that won't happen)\r\n if(middleware() && isPaddingNeeded) {\r\n setPaddingTo.style.paddingTop = '';\r\n this.isTopPaddingSet = false;\r\n }\r\n });\r\n }\r\n\r\n //this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\r\n\r\n /* setTimeout(() => {\r\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\r\n }, 10); */\r\n });\r\n }\r\n }\r\n\r\n public getLastBubble() {\r\n const lastDateGroup = this.getLastDateGroup();\r\n if(lastDateGroup) {\r\n return lastDateGroup.lastElementChild as HTMLElement;\r\n }\r\n }\r\n\r\n public scrollToBubble(\r\n element: HTMLElement, \r\n position: ScrollLogicalPosition,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number\r\n ) {\r\n // * 4 = .25rem\r\n const bubble = findUpClassName(element, 'bubble');\r\n\r\n // * if it's a start, then scroll to start of the group\r\n if(position === 'center' && whichChild(bubble) === (this.stickyIntersector ? 2 : 1)) {\r\n const dateGroup = bubble.parentElement;\r\n if(whichChild(dateGroup) === 0) {\r\n element = dateGroup;\r\n position = 'start';\r\n }\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 return this.scrollable.scrollIntoViewNew(\r\n element, \r\n position, \r\n 4, \r\n undefined, \r\n forceDirection, \r\n forceDuration, \r\n 'y', \r\n isChangingHeight ? ({rect}) => {\r\n // return rect.height;\r\n\r\n let height = windowSize.windowH;\r\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\r\n height -= this.bubblesContainer.offsetTop;\r\n height -= mediaSizes.isMobile || windowSize.windowH < 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 );\r\n }\r\n\r\n public scrollToBubbleEnd(bubble = this.getLastBubble()) {\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 return this.scrollToBubble(bubble, 'end', undefined, undefined).then(() => {\r\n if(!middleware()) return;\r\n this.scrollingToBubble = undefined;\r\n });\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 scrollToBubbleIfLast(bubble: HTMLElement) {\r\n if(bubble.parentElement.lastElementChild === bubble && \r\n this.getLastDateGroup().parentElement.lastElementChild === bubble.parentElement) {\r\n this.scrollToBubbleEnd(bubble);\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 public getDateContainerByMessage(message: any, reverse: boolean) {\r\n const date = new Date(message.date * 1000);\r\n date.setHours(0, 0, 0);\r\n const dateTimestamp = date.getTime();\r\n if(!this.dateMessages[dateTimestamp]) {\r\n 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 && message.date === 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 ////////this.log('need to render date message', dateTimestamp, str);\r\n\r\n const container = document.createElement('div');\r\n container.className = 'bubbles-date-group';\r\n container.append(bubble);\r\n\r\n this.dateMessages[dateTimestamp] = {\r\n div: bubble,\r\n container,\r\n firstTimestamp: date.getTime()\r\n };\r\n\r\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\r\n let i = 0, length = haveTimestamps.length, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\r\n for(; i < haveTimestamps.length; ++i) {\r\n const t = haveTimestamps[i];\r\n insertBefore = this.dateMessages[t].container;\r\n if(dateTimestamp < t) {\r\n break;\r\n }\r\n }\r\n\r\n if(i === length && insertBefore) {\r\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\r\n }\r\n\r\n if(!insertBefore) {\r\n this.chatInner.append(container);\r\n } else {\r\n this.chatInner.insertBefore(container, insertBefore);\r\n }\r\n\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.observeStickyHeaderChanges(container);\r\n }\r\n }\r\n\r\n return this.dateMessages[dateTimestamp];\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Bubbles destroying');\r\n\r\n this.scrollable.onScrolledTop = this.scrollable.onScrolledBottom = this.scrollable.onAdditionalScroll = null;\r\n\r\n this.listenerSetter.removeAll();\r\n\r\n this.lazyLoadQueue.clear();\r\n this.unreadedObserver && this.unreadedObserver.disconnect();\r\n this.viewsObserver && this.viewsObserver.disconnect();\r\n this.stickyIntersector && this.stickyIntersector.disconnect();\r\n\r\n delete this.lazyLoadQueue;\r\n this.unreadedObserver && delete this.unreadedObserver;\r\n this.viewsObserver && delete this.viewsObserver;\r\n this.stickyIntersector && delete this.stickyIntersector;\r\n }\r\n\r\n public cleanup(bubblesToo = false) {\r\n ////console.time('appImManager cleanup');\r\n this.setLoaded('top', false);\r\n this.setLoaded('bottom', false);\r\n\r\n // cancel scroll\r\n cancelAnimationByKey(this.scrollable.container);\r\n\r\n // do not wait ending of previous scale animation\r\n interruptHeavyAnimation();\r\n\r\n if(TEST_SCROLL !== undefined) {\r\n TEST_SCROLL = TEST_SCROLL_TIMES;\r\n }\r\n\r\n this.bubbles = {};\r\n this.skippedMids.clear();\r\n this.dateMessages = {};\r\n this.bubbleGroups.cleanup();\r\n this.unreadOut.clear();\r\n this.needUpdate.length = 0;\r\n this.lazyLoadQueue.clear();\r\n \r\n // clear messages\r\n if(bubblesToo) {\r\n this.scrollable.container.textContent = '';\r\n }\r\n \r\n this.firstUnreadBubble = null;\r\n this.attachedUnreadBubble = false;\r\n \r\n this.messagesQueue.length = 0;\r\n this.messagesQueuePromise = null;\r\n \r\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\r\n this.fetchNewPromise = undefined;\r\n \r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.disconnect();\r\n }\r\n \r\n if(this.unreadedObserver) {\r\n this.unreadedObserver.disconnect();\r\n this.unreaded.clear();\r\n this.unreadedSeen.clear();\r\n this.readPromise = undefined;\r\n }\r\n\r\n if(this.viewsObserver) {\r\n this.viewsObserver.disconnect();\r\n this.viewsMids.clear();\r\n }\r\n \r\n this.loadedTopTimes = this.loadedBottomTimes = 0;\r\n \r\n this.middleware.clean();\r\n \r\n this.onAnimateLadder = undefined;\r\n this.resolveLadderAnimation = undefined;\r\n this.emptyPlaceholderMid = undefined;\r\n\r\n this.scrollingToBubble = undefined;\r\n ////console.timeEnd('appImManager cleanup');\r\n\r\n this.isTopPaddingSet = false;\r\n }\r\n\r\n public setPeer(peerId: PeerId, lastMsgId?: number): {cached?: boolean, promise: Chat['setPeerPromise']} {\r\n //console.time('appImManager setPeer');\r\n //console.time('appImManager setPeer pre promise');\r\n ////console.time('appImManager: pre render start');\r\n if(!peerId) {\r\n this.cleanup(true);\r\n this.peerId = peerId;\r\n return null;\r\n }\r\n\r\n const samePeer = this.peerId === peerId;\r\n\r\n /* if(samePeer && this.chat.setPeerPromise) {\r\n return {cached: true, promise: this.chat.setPeerPromise};\r\n } */\r\n\r\n const chatType = this.chat.type;\r\n\r\n if(chatType === 'scheduled') {\r\n lastMsgId = 0;\r\n }\r\n\r\n this.historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n let topMessage = chatType === 'pinned' ? this.appMessagesManager.pinnedMessages[peerId].maxId : this.historyStorage.maxId ?? 0;\r\n const isTarget = lastMsgId !== undefined;\r\n\r\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\r\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\r\n topMessage = 0;\r\n } */\r\n\r\n let readMaxId = 0, savedPosition: ReturnType;\r\n if(!isTarget) {\r\n if(!samePeer) {\r\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\r\n }\r\n\r\n if(savedPosition) {\r\n \r\n } else if(topMessage) {\r\n readMaxId = this.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId);\r\n if(/* dialog.unread_count */readMaxId && !samePeer) {\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;\r\n\r\n const {scrollable} = this;\r\n \r\n if(samePeer) {\r\n const mounted = this.getMountedBubble(lastMsgId);\r\n if(mounted) {\r\n if(isTarget) {\r\n this.scrollToBubble(mounted.bubble, 'center');\r\n this.highlightBubble(mounted.bubble);\r\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\r\n } else if(topMessage && !isJump) {\r\n //this.log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\r\n scrollable.scrollTop = scrollable.scrollHeight;\r\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\r\n }\r\n \r\n return null;\r\n }\r\n } else {\r\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n this.chat.apiManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\r\n }\r\n\r\n this.peerId = peerId;\r\n this.replyFollowHistory.length = 0;\r\n\r\n this.passEntities = {\r\n messageEntityBotCommand: this.appPeersManager.isAnyGroup(peerId) || this.appUsersManager.isBot(peerId)\r\n };\r\n }\r\n\r\n if(DEBUG) {\r\n this.log('setPeer peerId:', peerId, this.historyStorage, lastMsgId, topMessage);\r\n }\r\n\r\n // add last message, bc in getHistory will load < max_id\r\n const additionMsgId = isJump || chatType === 'scheduled' ? 0 : topMessage;\r\n\r\n /* this.setPeerPromise = null;\r\n this.preloader.detach();\r\n return true; */\r\n\r\n //////appSidebarRight.toggleSidebar(true);\r\n\r\n let maxBubbleId = 0;\r\n if(samePeer) {\r\n let el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(el) {\r\n maxBubbleId = +el.dataset.mid;\r\n }\r\n\r\n if(maxBubbleId <= 0) {\r\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map(mid => +mid));\r\n }\r\n } else {\r\n this.isFirstLoad = true;\r\n }\r\n\r\n const oldChatInner = this.chatInner;\r\n this.cleanup();\r\n const chatInner = this.chatInner = document.createElement('div');\r\n if(samePeer) {\r\n chatInner.className = oldChatInner.className;\r\n chatInner.classList.remove('disable-hover', 'is-scrolling');\r\n } else {\r\n chatInner.classList.add('bubbles-inner');\r\n }\r\n\r\n this.lazyLoadQueue.lock();\r\n\r\n let result: ReturnType;\r\n if(!savedPosition) {\r\n result = this.getHistory(lastMsgId, true, isJump, additionMsgId);\r\n } else {\r\n result = {\r\n promise: getHeavyAnimationPromise().then(() => {\r\n return this.performHistoryResult(savedPosition.mids, true, false, undefined);\r\n }) as any,\r\n cached: true\r\n };\r\n }\r\n\r\n const {promise, cached} = result;\r\n\r\n // clear \r\n if(!cached) {\r\n if(!samePeer) {\r\n scrollable.container.textContent = '';\r\n //oldChatInner.remove();\r\n this.chat.finishPeerChange(isTarget, isJump, lastMsgId);\r\n this.preloader.attach(this.bubblesContainer);\r\n }\r\n }\r\n\r\n //console.timeEnd('appImManager setPeer pre promise');\r\n /* this.ladderDeferred && this.ladderDeferred.resolve();\r\n this.ladderDeferred = deferredPromise(); */\r\n \r\n animationIntersector.lockGroup(CHAT_ANIMATION_GROUP);\r\n const setPeerPromise = promise.then(() => {\r\n ////this.log('setPeer removing preloader');\r\n\r\n if(cached) {\r\n if(!samePeer) {\r\n this.chat.finishPeerChange(isTarget, isJump, lastMsgId); // * костыль\r\n }\r\n } else {\r\n this.preloader.detach();\r\n }\r\n\r\n if(this.resolveLadderAnimation) {\r\n this.resolveLadderAnimation();\r\n this.resolveLadderAnimation = undefined;\r\n }\r\n\r\n // this.ladderDeferred.resolve();\r\n\r\n scrollable.lastScrollDirection = 0;\r\n scrollable.lastScrollTop = 0;\r\n replaceContent(scrollable.container, chatInner);\r\n\r\n animationIntersector.unlockGroup(CHAT_ANIMATION_GROUP);\r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP/* , true */);\r\n\r\n //fastRaf(() => {\r\n this.lazyLoadQueue.unlock();\r\n //});\r\n\r\n //if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\r\n if(savedPosition) {\r\n scrollable.scrollTop = 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((topMessage && isJump) || isTarget) {\r\n const fromUp = maxBubbleId > 0 && (maxBubbleId < lastMsgId || lastMsgId < 0);\r\n const followingUnread = readMaxId === lastMsgId && !isTarget;\r\n if(!fromUp && samePeer) {\r\n scrollable.scrollTop = 99999;\r\n } else if(fromUp/* && (samePeer || forwardingUnread) */) {\r\n scrollable.scrollTop = 0;\r\n }\r\n\r\n const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n \r\n // ! sometimes there can be no bubble\r\n if(bubble) {\r\n this.scrollToBubble(bubble, followingUnread ? 'start' : 'center', !samePeer ? FocusDirection.Static : undefined);\r\n if(!followingUnread) {\r\n this.highlightBubble(bubble);\r\n }\r\n }\r\n } else {\r\n scrollable.scrollTop = 99999;\r\n }\r\n\r\n this.onScroll();\r\n\r\n const middleware = this.getMiddleware();\r\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\r\n afterSetPromise.then(() => { // check whether list isn't full\r\n scrollable.checkForTriggers();\r\n });\r\n\r\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\r\n\r\n const needFetchInterval = this.appMessagesManager.isFetchIntervalNeeded(peerId);\r\n const needFetchNew = savedPosition || needFetchInterval;\r\n if(!needFetchNew) {\r\n // warning\r\n if(!lastMsgId || this.bubbles[topMessage] || lastMsgId === topMessage) {\r\n this.setLoaded('bottom', true);\r\n }\r\n } else {\r\n afterSetPromise.then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n scrollable.checkForTriggers();\r\n\r\n if(needFetchInterval) {\r\n const f = () => {\r\n this.fetchNewPromise = new Promise((resolve) => {\r\n if(!middleware() || !this.appMessagesManager.isFetchIntervalNeeded(peerId)) {\r\n resolve();\r\n return;\r\n }\r\n \r\n this.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((historyStorage) => {\r\n if(!middleware() || !historyStorage) {\r\n resolve();\r\n return;\r\n }\r\n \r\n const slice = historyStorage.history.slice;\r\n const isBottomEnd = slice.isEnd(SliceEnd.Bottom);\r\n if(scrollable.loadedAll.bottom && scrollable.loadedAll.bottom !== isBottomEnd) {\r\n this.setLoaded('bottom', isBottomEnd);\r\n this.onScroll();\r\n }\r\n\r\n setTimeout(f, 30e3);\r\n resolve();\r\n });\r\n }).finally(() => {\r\n this.fetchNewPromise = undefined;\r\n });\r\n };\r\n \r\n if(samePeer) {\r\n setTimeout(f, 30e3);\r\n } else {\r\n f();\r\n }\r\n }\r\n });\r\n }\r\n \r\n this.log('scrolledAllDown:', scrollable.loadedAll.bottom);\r\n\r\n //if(!this.unreaded.length && dialog) { // lol\r\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\r\n this.onScrolledAllDown();\r\n }\r\n\r\n if(chatType === 'chat') {\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(dialog?.pFlags.unread_mark) {\r\n this.appMessagesManager.markDialogUnread(peerId, true);\r\n }\r\n }\r\n\r\n //this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\r\n\r\n /* if(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\r\n return new Promise((resolve) => fastRaf(resolve));\r\n } */\r\n //console.timeEnd('appImManager setPeer');\r\n }).catch(err => {\r\n this.log.error('getHistory promise error:', err);\r\n this.preloader.detach();\r\n throw err;\r\n });\r\n\r\n return {cached, promise: setPeerPromise};\r\n }\r\n\r\n public onScrolledAllDown() {\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n const storage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n this.appMessagesManager.readHistory(this.peerId, storage.maxId, this.chat.threadId, true);\r\n }\r\n }\r\n\r\n public finishPeerChange() {\r\n const peerId = this.peerId;\r\n const isChannel = this.appPeersManager.isChannel(peerId);\r\n const canWrite = this.appMessagesManager.canSendToPeer(peerId, this.chat.threadId);\r\n \r\n this.chatInner.classList.toggle('has-rights', canWrite);\r\n this.bubblesContainer.classList.toggle('is-chat-input-hidden', !canWrite);\r\n\r\n this.chatInner.classList.toggle('is-chat', this.chat.isAnyGroup());\r\n this.chatInner.classList.toggle('is-channel', isChannel);\r\n }\r\n\r\n public renderMessagesQueue(message: any, bubble: HTMLElement, reverse: boolean, promises: Promise[]) {\r\n /* let dateMessage = this.getDateContainerByMessage(message, reverse);\r\n if(reverse) dateMessage.container.insertBefore(bubble, dateMessage.div.nextSibling);\r\n else dateMessage.container.append(bubble);\r\n return; */\r\n\r\n /* if(DEBUG && message.mid === 4314759167) {\r\n this.log('renderMessagesQueue', message, bubble, reverse, promises);\r\n } */\r\n\r\n this.messagesQueue.push({message, bubble, reverse, promises});\r\n\r\n this.setMessagesQueuePromise(); \r\n }\r\n\r\n public setMessagesQueuePromise() {\r\n if(this.messagesQueuePromise || !this.messagesQueue.length) return;\r\n\r\n this.messagesQueuePromise = new Promise((resolve, reject) => {\r\n setTimeout(() => {\r\n const queue = this.messagesQueue.slice();\r\n this.messagesQueue.length = 0;\r\n\r\n const promises = queue.reduce((acc, {promises}) => acc.concat(promises), []);\r\n\r\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\r\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\r\n // promises.push(getHeavyAnimationPromise());\r\n\r\n this.log('promises to call', promises, queue, this.isHeavyAnimationInProgress);\r\n const middleware = this.getMiddleware();\r\n Promise.all(promises).then(() => {\r\n if(!middleware()) {\r\n throw 'setMessagesQueuePromise: peer changed!';\r\n }\r\n\r\n if(this.messagesQueueOnRender) {\r\n this.messagesQueueOnRender();\r\n }\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n\r\n queue.forEach(({message, bubble, reverse}) => {\r\n this.setBubblePosition(bubble, message, reverse);\r\n });\r\n\r\n //setTimeout(() => {\r\n resolve();\r\n //}, 500);\r\n this.messagesQueuePromise = null;\r\n\r\n if(this.messagesQueue.length) {\r\n this.setMessagesQueuePromise();\r\n }\r\n\r\n this.setUnreadDelimiter(); // не нашёл места лучше\r\n }).catch(reject);\r\n }, 0);\r\n });\r\n\r\n //this.messagesQueuePromise.catch(() => {});\r\n }\r\n\r\n public setBubblePosition(bubble: HTMLElement, message: any, reverse: boolean) {\r\n if(message.id < 0) {\r\n this.chatInner.prepend(bubble);\r\n return;\r\n }\r\n\r\n const dateMessage = this.getDateContainerByMessage(message, reverse);\r\n if(this.chat.type === 'scheduled' || this.chat.type === 'pinned'/* || true */) { // ! TEMP COMMENTED\r\n const offset = this.stickyIntersector ? 2 : 1;\r\n let children = Array.from(dateMessage.container.children).slice(offset) as HTMLElement[];\r\n let i = 0, foundMidOnSameTimestamp = 0;\r\n for(; i < children.length; ++i) {\r\n const t = children[i];\r\n const timestamp = +t.dataset.timestamp;\r\n if(message.date < timestamp) {\r\n break;\r\n } else if(message.date === timestamp) {\r\n foundMidOnSameTimestamp = +t.dataset.mid;\r\n }\r\n \r\n if(foundMidOnSameTimestamp && message.mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n \r\n // * 1 for date, 1 for date sentinel\r\n let index = offset + i;\r\n /* if(bubble.parentElement) { // * if already mounted\r\n const currentIndex = whichChild(bubble);\r\n if(index > currentIndex) {\r\n index -= 1; // * minus for already mounted\r\n }\r\n } */\r\n \r\n positionElementByIndex(bubble, dateMessage.container, index);\r\n } else {\r\n if(reverse) {\r\n dateMessage.container.insertBefore(bubble, dateMessage.container.children[this.stickyIntersector ? 1 : 0].nextSibling);\r\n } else {\r\n dateMessage.container.append(bubble);\r\n }\r\n }\r\n\r\n if(message._ === 'message') {\r\n this.bubbleGroups.addBubble(bubble, message, reverse);\r\n } else {\r\n bubble.classList.add('is-group-first', 'is-group-last');\r\n }\r\n }\r\n\r\n public getMiddleware() {\r\n return this.middleware.get();\r\n }\r\n \r\n // reverse means top\r\n private renderMessage(message: any, reverse = false, multipleRender = false, bubble: HTMLDivElement = null, updatePosition = true) {\r\n /* if(DEBUG) {\r\n this.log.debug('message to render:', message);\r\n } */\r\n if(!bubble && this.bubbles[message.mid]) {\r\n return;\r\n }\r\n\r\n //return;\r\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\r\n if(message.deleted) return;\r\n else if(message.grouped_id && albumMustBeRenderedFull) { // will render only last album's message\r\n const storage = this.appMessagesManager.groupedMessagesStorage[message.grouped_id];\r\n const maxId = Math.max(...storage.keys());\r\n if(message.mid < maxId) {\r\n return;\r\n }\r\n }\r\n \r\n const peerId = this.peerId;\r\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\r\n const our = message.fromId === rootScope.myId || (message.pFlags.out && this.appPeersManager.isMegagroup(this.peerId));\r\n \r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('message');\r\n \r\n //messageDiv.innerText = message.message;\r\n\r\n let bubbleContainer: HTMLDivElement;\r\n let contentWrapper: HTMLElement;\r\n \r\n // bubble\r\n if(!bubble) {\r\n contentWrapper = document.createElement('div');\r\n contentWrapper.classList.add('bubble-content-wrapper');\r\n \r\n bubbleContainer = document.createElement('div');\r\n bubbleContainer.classList.add('bubble-content');\r\n \r\n bubble = document.createElement('div');\r\n bubble.classList.add('bubble');\r\n contentWrapper.appendChild(bubbleContainer);\r\n bubble.appendChild(contentWrapper);\r\n\r\n if(!our && !message.pFlags.out && this.unreadedObserver) {\r\n //this.log('not our message', message, message.pFlags.unread);\r\n const isUnread = message.pFlags.unread || \r\n this.appMessagesManager.isMentionUnread(message) || \r\n (this.historyStorage.readMaxId !== undefined && this.historyStorage.readMaxId < message.mid);\r\n if(isUnread) {\r\n this.unreadedObserver.observe(bubble); \r\n this.unreaded.set(bubble, message.mid);\r\n }\r\n }\r\n } else {\r\n const save = ['is-highlighted', 'is-group-first', 'is-group-last'];\r\n const wasClassNames = bubble.className.split(' ');\r\n const classNames = ['bubble'].concat(save.filter(c => wasClassNames.includes(c)));\r\n bubble.className = classNames.join(' ');\r\n\r\n contentWrapper = bubble.lastElementChild as HTMLElement;\r\n if(!contentWrapper.classList.contains('bubble-content-wrapper')) {\r\n contentWrapper = bubble.querySelector('.bubble-content-wrapper');\r\n }\r\n \r\n bubbleContainer = contentWrapper.firstElementChild as HTMLDivElement;\r\n bubbleContainer.innerHTML = '';\r\n bubbleContainer.style.cssText = '';\r\n contentWrapper.innerHTML = '';\r\n contentWrapper.appendChild(bubbleContainer);\r\n //bubbleContainer.style.marginBottom = '';\r\n const transitionDelay = contentWrapper.style.transitionDelay;\r\n contentWrapper.style.cssText = '';\r\n contentWrapper.style.transitionDelay = transitionDelay;\r\n\r\n if(bubble === this.firstUnreadBubble) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n // * Нужно очистить прошлую информацию, полезно если удалить последний элемент из альбома в ПОСЛЕДНЕМ БАББЛЕ ГРУППЫ (видно по аватару)\r\n const originalMid = +bubble.dataset.mid;\r\n const sameMid = +message.mid === originalMid;\r\n /* if(updatePosition) {\r\n bubble.remove(); // * for positionElementByIndex\r\n } */\r\n\r\n if(!sameMid) {\r\n delete this.bubbles[originalMid];\r\n this.skippedMids.delete(originalMid);\r\n }\r\n\r\n //bubble.innerHTML = '';\r\n }\r\n\r\n // ! reset due to album edit or delete item\r\n this.bubbles[+message.mid] = bubble;\r\n bubble.dataset.mid = message.mid;\r\n bubble.dataset.peerId = '' + message.peerId;\r\n bubble.dataset.timestamp = message.date;\r\n\r\n const loadPromises: Promise[] = [];\r\n\r\n if(message._ === 'messageService') {\r\n assumeType(message);\r\n\r\n const action = message.action;\r\n if(action) {\r\n const _ = action._;\r\n if(IGNORE_ACTIONS.has(_) || (langPack.hasOwnProperty(_) && !langPack[_])) {\r\n this.skippedMids.add(+message.mid);\r\n return bubble;\r\n }\r\n }\r\n\r\n bubble.className = 'bubble service';\r\n\r\n bubbleContainer.innerHTML = '';\r\n const s = document.createElement('div');\r\n s.classList.add('service-msg');\r\n if(action) {\r\n if(action._ === 'messageActionChannelMigrateFrom') {\r\n s.append(i18n('ChatMigration.From', [new PeerTitle({peerId: action.chat_id.toPeerId(true)}).element]));\r\n } else if(action._ === 'messageActionChatMigrateTo') {\r\n s.append(i18n('ChatMigration.To', [new PeerTitle({peerId: action.channel_id.toPeerId(true)}).element]));\r\n } else {\r\n s.append(this.appMessagesManager.wrapMessageActionTextNew(message));\r\n }\r\n }\r\n bubbleContainer.append(s);\r\n\r\n if(updatePosition) {\r\n this.renderMessagesQueue(message, bubble, reverse, loadPromises);\r\n\r\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\r\n bubble.classList.add('is-group-last');\r\n }\r\n }\r\n\r\n return bubble;\r\n }\r\n\r\n let messageMedia = message.media;\r\n\r\n let messageMessage: string, totalEntities: MessageEntity[];\r\n if(messageMedia?.document && !['video', 'gif'].includes(messageMedia.document.type)) {\r\n // * just filter these cases for documents caption\r\n } else if(message.grouped_id && albumMustBeRenderedFull) {\r\n const t = this.appMessagesManager.getAlbumText(message.grouped_id);\r\n messageMessage = t.message;\r\n //totalEntities = t.entities;\r\n totalEntities = t.totalEntities;\r\n } else if(messageMedia?.document?.type !== 'sticker') {\r\n messageMessage = message.message;\r\n //totalEntities = message.entities;\r\n totalEntities = message.totalEntities;\r\n }\r\n \r\n /* let richText = RichTextProcessor.wrapRichText(messageMessage, {\r\n entities: totalEntities\r\n }); */\r\n let richText = RichTextProcessor.wrapRichText(messageMessage, {\r\n entities: totalEntities,\r\n passEntities: this.passEntities\r\n });\r\n\r\n let canHaveTail = true;\r\n let isStandaloneMedia = false;\r\n let needToSetHTML = true;\r\n if(totalEntities && !messageMedia) {\r\n let emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji');\r\n let strLength = messageMessage.length;\r\n let emojiStrLength = emojiEntities.reduce((acc: number, curr: any) => acc + curr.length, 0);\r\n \r\n if(emojiStrLength === strLength && emojiEntities.length <= 3) {\r\n if(rootScope.settings.emoji.big) {\r\n let sticker = this.appStickersManager.getAnimatedEmojiSticker(messageMessage);\r\n if(emojiEntities.length === 1 && !messageMedia && sticker) {\r\n messageMedia = {\r\n _: 'messageMediaDocument',\r\n document: sticker\r\n };\r\n } else {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n attachmentDiv.innerHTML = richText;\r\n \r\n bubble.classList.add('emoji-' + emojiEntities.length + 'x');\r\n \r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n bubble.classList.add('is-message-empty', 'emoji-big');\r\n isStandaloneMedia = true;\r\n canHaveTail = false;\r\n needToSetHTML = false;\r\n }\r\n \r\n bubble.classList.add('can-have-big-emoji');\r\n }\r\n \r\n /* if(strLength === emojiStrLength) {\r\n messageDiv.classList.add('emoji-only');\r\n messageDiv.classList.add('message-empty');\r\n } */\r\n }\r\n\r\n if(needToSetHTML) {\r\n setInnerHTML(messageDiv, richText);\r\n }\r\n \r\n const timeSpan = MessageRender.setTime(this.chat, message, bubble, bubbleContainer, messageDiv);\r\n bubbleContainer.prepend(messageDiv);\r\n //bubble.prepend(timeSpan, messageDiv); // that's bad\r\n\r\n if(message.views && !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.views && !message.pFlags.is_outgoing && this.viewsObserver) {\r\n this.viewsObserver.observe(bubble);\r\n }\r\n\r\n if(message.reply_markup && message.reply_markup._ === 'replyInlineMarkup' && message.reply_markup.rows && message.reply_markup.rows.length) {\r\n const rows = (message.reply_markup as ReplyMarkup.replyKeyboardMarkup).rows;\r\n\r\n const containerDiv = document.createElement('div');\r\n containerDiv.classList.add('reply-markup');\r\n rows.forEach((row) => {\r\n const buttons = row.buttons;\r\n if(!buttons || !buttons.length) return;\r\n\r\n const rowDiv = document.createElement('div');\r\n rowDiv.classList.add('reply-markup-row');\r\n\r\n buttons.forEach((button) => {\r\n const text = RichTextProcessor.wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\r\n\r\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\r\n \r\n switch(button._) {\r\n case 'keyboardButtonUrl': {\r\n const r = RichTextProcessor.wrapRichText(' ', {\r\n entities: [{\r\n _: 'messageEntityTextUrl',\r\n length: 1,\r\n offset: 0,\r\n url: button.url\r\n }]\r\n });\r\n\r\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\r\n buttonEl.classList.add('is-link', 'tgico');\r\n\r\n break;\r\n }\r\n\r\n case 'keyboardButtonSwitchInline': {\r\n buttonEl = document.createElement('button');\r\n buttonEl.classList.add('is-switch-inline', 'tgico');\r\n attachClickEvent(buttonEl, (e) => {\r\n cancelEvent(e);\r\n\r\n const botId = message.viaBotId || message.fromId;\r\n let promise: Promise;\r\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\r\n else promise = this.appInlineBotsManager.checkSwitchReturn(botId).then(peerId => {\r\n if(peerId) {\r\n return peerId;\r\n }\r\n \r\n return new Promise((resolve, reject) => {\r\n const popup = new PopupForward({\r\n [this.peerId]: []\r\n }, (peerId) => {\r\n resolve(peerId);\r\n }, true);\r\n\r\n popup.addEventListener('close', () => {\r\n reject();\r\n });\r\n });\r\n });\r\n \r\n promise.then(peerId => {\r\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\r\n this.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\r\n });\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n buttonEl = document.createElement('button');\r\n break;\r\n }\r\n }\r\n \r\n buttonEl.classList.add('reply-markup-button', 'rp');\r\n buttonEl.insertAdjacentHTML('beforeend', text);\r\n\r\n ripple(buttonEl);\r\n\r\n rowDiv.append(buttonEl);\r\n });\r\n\r\n containerDiv.append(rowDiv);\r\n });\r\n\r\n attachClickEvent(containerDiv, (e) => {\r\n let target = e.target as HTMLElement;\r\n \r\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\r\n if(!target || target.classList.contains('is-link') || target.classList.contains('is-switch-inline')) return;\r\n\r\n cancelEvent(e);\r\n\r\n const column = whichChild(target);\r\n const row = rows[whichChild(target.parentElement)];\r\n\r\n if(!row.buttons || !row.buttons[column]) {\r\n this.log.warn('no such button', row, column, message);\r\n return;\r\n }\r\n\r\n const button = row.buttons[column];\r\n this.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button);\r\n });\r\n\r\n canHaveTail = false;\r\n bubble.classList.add('with-reply-markup');\r\n contentWrapper.append(containerDiv);\r\n }\r\n \r\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\r\n if(our) {\r\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\r\n let status = '';\r\n if(isOutgoing) status = 'is-sending';\r\n else status = message.pFlags.unread || message.pFlags.is_scheduled ? 'is-sent' : 'is-read';\r\n bubble.classList.add(status);\r\n }\r\n\r\n const messageWithReplies = this.appMessagesManager.getMessageWithReplies(message);\r\n const withReplies = !!messageWithReplies && message.mid > 0;\r\n\r\n if(withReplies) {\r\n bubble.classList.add('with-replies');\r\n }\r\n\r\n const isOut = our && (!message.fwd_from || this.peerId !== rootScope.myId);\r\n let nameContainer: HTMLElement = bubbleContainer;\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 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(!message.viaBotId) {\r\n bubble.classList.add('hide-name'); \r\n }\r\n\r\n bubble.classList.add('photo');\r\n \r\n const storage = this.appMessagesManager.groupedMessagesStorage[message.grouped_id];\r\n if(message.grouped_id && storage.size !== 1 && albumMustBeRenderedFull) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n wrapAlbum({\r\n groupId: message.grouped_id, \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 noAutoDownload: this.chat.noAutoDownloadMedia,\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, \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 noAutoDownload: this.chat.noAutoDownloadMedia,\r\n });\r\n\r\n break;\r\n }\r\n \r\n case 'messageMediaWebPage': {\r\n processingWebPage = true;\r\n \r\n let webpage: WebPage = messageMedia.webpage;\r\n ////////this.log('messageMediaWebPage', webpage);\r\n if(webpage._ !== 'webPage') {\r\n break;\r\n } \r\n \r\n bubble.classList.add('webpage');\r\n \r\n let box = document.createElement('div');\r\n box.classList.add('web');\r\n \r\n let quote = document.createElement('div');\r\n quote.classList.add('quote');\r\n\r\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\r\n const photo: Photo.photo = webpage.photo as any;\r\n if(photo || webpage.document) {\r\n previewResizer = document.createElement('div');\r\n previewResizer.classList.add('preview-resizer');\r\n preview = document.createElement('div');\r\n preview.classList.add('preview');\r\n previewResizer.append(preview);\r\n }\r\n \r\n const doc = webpage.document as MyDocument;\r\n if(doc) {\r\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\r\n //if(doc.size <= 20e6) {\r\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\r\n if(doc.type === 'round') {\r\n bubble.classList.add('round');\r\n preview.classList.add('is-round');\r\n } else {\r\n bubble.classList.add('video');\r\n }\r\n wrapVideo({\r\n doc, \r\n container: preview, \r\n message, \r\n boxWidth: mediaSize.width,\r\n boxHeight: mediaSize.height,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n isOut,\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n });\r\n //}\r\n } else {\r\n const docDiv = wrapDocument({\r\n message,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n preview.append(docDiv);\r\n preview.classList.add('preview-with-document');\r\n //messageDiv.classList.add((webpage.type || 'document') + '-message');\r\n //doc = null;\r\n }\r\n }\r\n \r\n let quoteTextDiv = document.createElement('div');\r\n quoteTextDiv.classList.add('quote-text');\r\n\r\n if(previewResizer) {\r\n quoteTextDiv.append(previewResizer);\r\n }\r\n\r\n let t: HTMLElement;\r\n if(webpage.site_name) {\r\n const html = RichTextProcessor.wrapRichText(webpage.url);\r\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\r\n a.classList.add('webpage-name');\r\n setInnerHTML(a, RichTextProcessor.wrapEmojiText(webpage.site_name));\r\n quoteTextDiv.append(a);\r\n t = a;\r\n }\r\n\r\n if(webpage.rTitle) {\r\n let titleDiv = document.createElement('div');\r\n titleDiv.classList.add('title');\r\n setInnerHTML(titleDiv, webpage.rTitle);\r\n quoteTextDiv.append(titleDiv);\r\n t = titleDiv;\r\n }\r\n\r\n if(webpage.rDescription) {\r\n let textDiv = document.createElement('div');\r\n textDiv.classList.add('text');\r\n setInnerHTML(textDiv, webpage.rDescription);\r\n quoteTextDiv.append(textDiv);\r\n t = textDiv;\r\n }\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } else {\r\n box.classList.add('no-text');\r\n } */\r\n\r\n quote.append(quoteTextDiv);\r\n\r\n if(photo && !doc) {\r\n bubble.classList.add('photo');\r\n\r\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\r\n let isSquare = false;\r\n if(size.w === size.h && t) {\r\n bubble.classList.add('is-square-photo');\r\n isSquare = true;\r\n this.appPhotosManager.setAttachmentSize(photo, preview, 48, 48, false);\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } */\r\n } else if(size.h > size.w) {\r\n bubble.classList.add('is-vertical-photo');\r\n }\r\n\r\n wrapPhoto({\r\n photo, \r\n message, \r\n container: preview, \r\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width, \r\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n withoutPreloader: isSquare,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\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;\r\n\r\n //this.log('messageMediaDocument', doc, bubble);\r\n \r\n if(doc.sticker/* && doc.size <= 1e6 */) {\r\n bubble.classList.add('sticker');\r\n canHaveTail = false;\r\n isStandaloneMedia = true;\r\n \r\n if(doc.animated) {\r\n bubble.classList.add('sticker-animated');\r\n }\r\n \r\n const sizes = mediaSizes.active;\r\n const size = bubble.classList.contains('emoji-big') ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\r\n this.appPhotosManager.setAttachmentSize(doc, attachmentDiv, size.width, size.height);\r\n //let preloader = new ProgressivePreloader(attachmentDiv, false);\r\n bubbleContainer.style.height = attachmentDiv.style.height;\r\n bubbleContainer.style.width = attachmentDiv.style.width;\r\n //appPhotosManager.setAttachmentSize(doc, bubble);\r\n wrapSticker({\r\n doc, \r\n div: attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n emoji: bubble.classList.contains('emoji-big') ? messageMessage : undefined,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\r\n //this.log('never get free 2', doc);\r\n\r\n const isRound = doc.type === 'round';\r\n if(isRound) {\r\n isStandaloneMedia = true;\r\n }\r\n\r\n if(isRound || !messageMessage) {\r\n canHaveTail = false;\r\n }\r\n\r\n if(!message.viaBotId) {\r\n bubble.classList.add('hide-name');\r\n }\r\n \r\n bubble.classList.add(isRound ? 'round' : 'video');\r\n const storage = this.appMessagesManager.groupedMessagesStorage[message.grouped_id];\r\n if(message.grouped_id && storage.size !== 1 && albumMustBeRenderedFull) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n \r\n wrapAlbum({\r\n groupId: message.grouped_id, \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 noAutoDownload: this.chat.noAutoDownloadMedia,\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, \r\n boxWidth: mediaSizes.active.regular.width,\r\n boxHeight: mediaSizes.active.regular.height, \r\n withTail, \r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n searchContext: isRound ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\r\n threadId: this.chat.threadId,\r\n useSearch: !message.pFlags.is_scheduled,\r\n isScheduled: message.pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n }\r\n } else {\r\n const newNameContainer = wrapGroupedDocuments({\r\n albumMustBeRenderedFull,\r\n message,\r\n bubble,\r\n messageDiv,\r\n chat: this.chat,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\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.pFlags.is_scheduled,\r\n isScheduled: message.pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n\r\n if(newNameContainer) {\r\n nameContainer = newNameContainer;\r\n }\r\n\r\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document-size, .audio');\r\n lastContainer && lastContainer.append(timeSpan.cloneNode(true));\r\n\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 'messageMediaContact': {\r\n //this.log('wrapping contact', message);\r\n\r\n const contactDiv = document.createElement('div');\r\n contactDiv.classList.add('contact');\r\n contactDiv.dataset.peerId = '' + messageMedia.user_id;\r\n\r\n messageDiv.classList.add('contact-message');\r\n processingWebPage = true;\r\n\r\n const texts = [];\r\n if(message.media.first_name) texts.push(RichTextProcessor.wrapEmojiText(message.media.first_name));\r\n if(message.media.last_name) texts.push(RichTextProcessor.wrapEmojiText(message.media.last_name));\r\n\r\n contactDiv.innerHTML = `\r\n
\r\n
${texts.join(' ')}
\r\n
${message.media.phone_number ? '+' + formatPhoneNumber(message.media.phone_number).formatted : 'Unknown phone number'}
\r\n
`;\r\n\r\n const avatarElem = new AvatarElement();\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n avatarElem.setAttribute('peer', '' + message.media.user_id);\r\n avatarElem.classList.add('contact-avatar', 'avatar-54');\r\n\r\n contactDiv.prepend(avatarElem);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('contact-message');\r\n messageDiv.append(contactDiv);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaPoll': {\r\n bubble.classList.remove('is-message-empty');\r\n \r\n const pollElement = wrapPoll(message);\r\n messageDiv.prepend(pollElement);\r\n messageDiv.classList.add('poll-message');\r\n\r\n break;\r\n }\r\n \r\n default:\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.innerHTML = 'This message is currently not supported on Telegram Web. Try desktop.telegram.org';\r\n messageDiv.append(timeSpan);\r\n this.log.warn('unrecognized media type:', message.media._, message);\r\n break;\r\n }\r\n \r\n if(!processingWebPage) {\r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\r\n bubble.classList.add('no-tail');\r\n\r\n if(!bubble.classList.contains('with-media-tail')) {\r\n bubble.classList.add('use-border-radius');\r\n }\r\n } */\r\n }\r\n\r\n if(isStandaloneMedia) {\r\n bubble.classList.add('just-media');\r\n }\r\n\r\n if(this.chat.selection.isSelecting) {\r\n this.chat.selection.toggleElementCheckbox(bubble, true);\r\n }\r\n\r\n let savedFrom = '';\r\n \r\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\r\n const needName = (message.fromId !== rootScope.myId && this.appPeersManager.isAnyChat(peerId) && !this.appPeersManager.isBroadcast(peerId)) || message.viaBotId;\r\n if(needName || message.fwd_from || message.reply_to_mid) { // chat\r\n let title: HTMLElement | DocumentFragment;\r\n let titleVia: typeof title;\r\n\r\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === message.fwdFromId;\r\n \r\n let isHidden = message.fwd_from && !message.fwd_from.from_id && !message.fwd_from.channel_id;\r\n if(message.viaBotId) {\r\n titleVia = document.createElement('span');\r\n titleVia.innerText = '@' + this.appUsersManager.getUser(message.viaBotId).username;\r\n titleVia.classList.add('peer-title');\r\n bubble.classList.add('must-have-name');\r\n }\r\n \r\n if(isHidden) {\r\n ///////this.log('message to render hidden', message);\r\n title = document.createElement('span');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(message.fwd_from.from_name);\r\n title.classList.add('peer-title');\r\n //title = message.fwd_from.from_name;\r\n bubble.classList.add('hidden-profile');\r\n } else {\r\n title = new PeerTitle({peerId: message.fwdFromId || message.fromId}).element;\r\n }\r\n\r\n if(message.reply_to_mid && message.reply_to_mid !== this.chat.threadId) {\r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n bubbleContainer,\r\n message\r\n });\r\n }\r\n \r\n //this.log(title);\r\n \r\n let nameDiv: HTMLElement;\r\n if((message.fwdFromId || message.fwd_from)) {\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 = message.fwdFromId;\r\n\r\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\r\n nameDiv.style.color = this.appPeersManager.getPeerColorById(message.fwdFromId, false);\r\n nameDiv.append(title);\r\n } else {\r\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(message.fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\r\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\r\n const args: FormatterArguments = [title];\r\n if(isStandaloneMedia) {\r\n args.unshift(document.createElement('br'));\r\n }\r\n nameDiv.append(i18n('ForwardedFrom', [args]));\r\n }\r\n } else if(!message.viaBotId) {\r\n if(!isStandaloneMedia && needName) {\r\n nameDiv = document.createElement('div');\r\n nameDiv.append(title);\r\n\r\n if(!our) {\r\n nameDiv.style.color = this.appPeersManager.getPeerColorById(message.fromId, false);\r\n }\r\n\r\n nameDiv.dataset.peerId = message.fromId;\r\n } else /* if(!message.reply_to_mid) */ {\r\n bubble.classList.add('hide-name');\r\n }\r\n }\r\n\r\n if(message.viaBotId) {\r\n if(!nameDiv) {\r\n nameDiv = document.createElement('div');\r\n } else {\r\n nameDiv.append(' ');\r\n }\r\n\r\n const span = document.createElement('span');\r\n span.append(i18n('ViaBot'), ' ', titleVia);\r\n span.classList.add('is-via');\r\n\r\n nameDiv.append(span);\r\n }\r\n\r\n if(nameDiv) {\r\n nameDiv.classList.add('name');\r\n nameContainer.append(nameDiv);\r\n }\r\n\r\n const needAvatar = this.chat.isAnyGroup() && !isOut;\r\n if(needAvatar) {\r\n let avatarElem = new AvatarElement();\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n avatarElem.classList.add('user-avatar', 'avatar-40');\r\n avatarElem.loadPromises = loadPromises;\r\n\r\n if(!message.fwdFromId && message.fwd_from && message.fwd_from.from_name) {\r\n avatarElem.setAttribute('peer-title', /* '🔥 FF 🔥' */message.fwd_from.from_name);\r\n }\r\n\r\n avatarElem.setAttribute('peer', '' + (((message.fwd_from && (this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID)) || isForwardFromChannel ? message.fwdFromId : message.fromId) || NULL_PEER_ID));\r\n //avatarElem.update();\r\n \r\n //this.log('exec loadDialogPhoto', message);\r\n\r\n contentWrapper.append(avatarElem);\r\n }\r\n } else {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n savedFrom = `${this.chat.peerId}_${message.mid}`;\r\n }\r\n\r\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\r\n if(isThreadStarter) {\r\n bubble.classList.add('is-thread-starter', 'is-group-last');\r\n }\r\n\r\n if(savedFrom && (this.chat.type === 'pinned' || message.fwd_from.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\r\n const goto = document.createElement('div');\r\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\r\n bubbleContainer.append(goto);\r\n bubble.dataset.savedFrom = savedFrom;\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\r\n if(updatePosition) {\r\n this.renderMessagesQueue(message, bubble, reverse, loadPromises);\r\n }\r\n\r\n if(withReplies) {\r\n const isFooter = MessageRender.renderReplies({\r\n bubble,\r\n bubbleContainer,\r\n message: messageWithReplies,\r\n messageDiv,\r\n loadPromises,\r\n lazyLoadQueue: this.lazyLoadQueue\r\n });\r\n\r\n if(isFooter) {\r\n canHaveTail = true;\r\n }\r\n }\r\n\r\n if(canHaveTail) {\r\n bubble.classList.add('can-have-tail');\r\n\r\n bubbleContainer.append(generateTail());\r\n }\r\n\r\n return bubble;\r\n }\r\n\r\n private safeRenderMessage(message: any, reverse?: boolean, multipleRender?: boolean, bubble?: HTMLDivElement, updatePosition?: boolean) {\r\n try {\r\n return this.renderMessage(message, reverse, multipleRender, bubble, updatePosition);\r\n } catch(err) {\r\n this.log.error('renderMessage error:', err);\r\n }\r\n }\r\n\r\n public async performHistoryResult(history: number[], reverse: boolean, isBackLimit: boolean, additionMsgId?: number) {\r\n // commented bot getProfile in getHistory!\r\n // if(!history/* .filter((id: number) => id > 0) */.length) {\r\n // if(!isBackLimit) {\r\n // this.scrollable.loadedAll.top = true;\r\n\r\n // /* if(this.chat.type === 'discussion') {\r\n // const serviceStartMessageId = this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId + '_' + this.chat.threadId];\r\n // if(serviceStartMessageId) history.push(serviceStartMessageId);\r\n // history.push(this.chat.threadId);\r\n // } */\r\n // } else {\r\n // this.scrollable.loadedAll.bottom = true;\r\n // }\r\n // }\r\n\r\n history = history.slice(); // need\r\n\r\n if(additionMsgId) {\r\n history.unshift(additionMsgId);\r\n }\r\n\r\n /* if(testScroll && additionMsgID) {\r\n for(let i = 0; i < 3; ++i) {\r\n let _history = history.slice();\r\n setTimeout(() => {\r\n this.performHistoryResult(_history, reverse, isBackLimit, 0, resetPromises);\r\n }, 0);\r\n }\r\n } */\r\n\r\n //console.time('appImManager render history');\r\n\r\n //await new Promise((resolve) => setTimeout(resolve, 1e3));\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: will render some messages:', history.length, this.isHeavyAnimationInProgress, this.messagesQueuePromise);\r\n } */\r\n\r\n //const padding = 10000;\r\n //const realLength = this.scrollable.container.childElementCount;\r\n let previousScrollHeightMinusTop: number/* , previousScrollHeight: number */;\r\n //if(realLength > 0/* && (reverse || isSafari) */) { // for safari need set when scrolling bottom too\r\n //if(!this.scrollable.isHeavyScrolling) {\r\n this.messagesQueueOnRender = () => {\r\n const {scrollTop, scrollHeight} = this.scrollable;\r\n\r\n //previousScrollHeight = scrollHeight;\r\n //previousScrollHeight = scrollHeight + padding;\r\n previousScrollHeightMinusTop = reverse ? scrollHeight - scrollTop : scrollTop;\r\n\r\n //this.chatInner.style.paddingTop = padding + 'px';\r\n /* if(reverse) {\r\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\r\n } else {\r\n previousScrollHeightMinusTop = scrollTop;\r\n } */\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: messagesQueueOnRender, scrollTop:', scrollTop, scrollHeight, previousScrollHeightMinusTop);\r\n } */\r\n this.messagesQueueOnRender = undefined;\r\n };\r\n //}\r\n //}\r\n\r\n if(this.needReflowScroll) {\r\n reflowScrollableElement(this.scrollable.container);\r\n this.needReflowScroll = false;\r\n }\r\n\r\n const cb = (mid: number) => {\r\n const message = this.chat.getMessage(mid);\r\n if(message.id > 0) {\r\n this.safeRenderMessage(message, reverse, true);\r\n } else {\r\n this.processLocalMessageRender(message);\r\n }\r\n };\r\n\r\n const length = history.length;\r\n if(reverse) for(let i = 0; i < length; ++i) cb(history[i]);\r\n else for(let i = length - 1; i >= 0; --i) cb(history[i]);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n const firstSlice = historyStorage.history.first;\r\n const lastSlice = historyStorage.history.last;\r\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\r\n this.setLoaded('bottom', true, false);\r\n }\r\n \r\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\r\n this.setLoaded('top', true, false);\r\n }\r\n } else {\r\n this.setLoaded('top', true);\r\n this.setLoaded('bottom', true);\r\n }\r\n\r\n await this.messagesQueuePromise;//.then(() => new Promise(resolve => setTimeout(resolve, 100)))\r\n\r\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n }\r\n\r\n if(previousScrollHeightMinusTop !== undefined) {\r\n /* const scrollHeight = this.scrollable.scrollHeight;\r\n const addedHeight = scrollHeight - previousScrollHeight;\r\n \r\n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\r\n /* const scrollHeight = this.scrollable.scrollHeight;\r\n const addedHeight = scrollHeight - previousScrollHeight;\r\n \r\n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\r\n \r\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n this.log('performHistoryResult: will set scrollTop', \r\n previousScrollHeightMinusTop, this.scrollable.scrollHeight, \r\n newScrollTop, this.scrollable.container.clientHeight); */\r\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n const newScrollTop = reverse ? this.scrollable.scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n \r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\r\n } */\r\n\r\n // touchSupport for safari iOS\r\n //isTouchSupported && isApple && (this.scrollable.container.style.overflow = 'hidden');\r\n this.scrollable.scrollTop = newScrollTop;\r\n //this.scrollable.scrollTop = this.scrollable.scrollHeight;\r\n //isTouchSupported && isApple && (this.scrollable.container.style.overflow = '');\r\n\r\n if(IS_SAFARI/* && !isAppleMobile */) { // * fix blinking and jumping\r\n reflowScrollableElement(this.scrollable.container);\r\n }\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, this.scrollable.scrollTop, this.scrollable.scrollHeight, this.isHeavyAnimationInProgress);\r\n } */\r\n }\r\n\r\n return true;\r\n }\r\n\r\n onDatePick = (timestamp: number) => {\r\n const peerId = this.peerId;\r\n this.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then(history => {\r\n if(!history?.messages?.length) {\r\n this.log.error('no history!');\r\n return;\r\n } else if(this.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\r\n //console.log('got history date:', history);\r\n });\r\n };\r\n\r\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\r\n //const middleware = this.getMiddleware();\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n return this.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\r\n } else if(this.chat.type === 'pinned') {\r\n const promise = this.appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId, \r\n limit: loadCount, \r\n backLimit\r\n })\r\n .then(value => ({history: value.history.map(m => m.mid)}));\r\n\r\n return promise;\r\n } else if(this.chat.type === 'scheduled') {\r\n return this.appMessagesManager.getScheduledMessages(this.peerId).then(mids => {\r\n // this.setLoaded('top', true);\r\n // this.setLoaded('bottom', true);\r\n return {history: mids.slice().reverse()};\r\n });\r\n }\r\n }\r\n\r\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\r\n /* const middleware = this.getMiddleware();\r\n await this.ladderDeferred; */\r\n\r\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\r\n // @ts-ignore\r\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n return;\r\n }\r\n\r\n /* if(!middleware()) {\r\n return;\r\n } */\r\n\r\n if(!Object.keys(this.bubbles).length) {\r\n return;\r\n }\r\n\r\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n\r\n if(isAdditionRender && additionMsgIds.length) {\r\n sortedMids = sortedMids.filter(mid => !additionMsgIds.includes(mid));\r\n }\r\n\r\n let targetMid: number;\r\n if(backLimit) {\r\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\r\n } else {\r\n if(additionMsgId) {\r\n targetMid = additionMsgId;\r\n } else { // * if maxId === 0\r\n targetMid = Math.max(...sortedMids);\r\n }\r\n }\r\n\r\n const topIds = sortedMids.slice(sortedMids.findIndex(mid => targetMid > mid));\r\n const middleIds = isAdditionRender ? [] : [targetMid];\r\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex(mid => targetMid >= mid)).reverse();\r\n \r\n if(DEBUG) {\r\n this.log('getHistory: targeting mid:', targetMid, maxId, additionMsgId, \r\n topIds.map(m => this.appMessagesIdsManager.getServerMessageId(m)), \r\n bottomIds.map(m => this.appMessagesIdsManager.getServerMessageId(m)));\r\n }\r\n\r\n const setBubbles: HTMLElement[] = [];\r\n\r\n this.chatInner.classList.add('zoom-fading');\r\n const delay = isAdditionRender ? 10 : 40;\r\n const offsetIndex = isAdditionRender ? 0 : 1;\r\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\r\n const animationPromise = deferredPromise();\r\n let lastMsDelay = 0;\r\n mids.forEach((mid, idx) => {\r\n if(!this.bubbles[mid] || this.skippedMids.has(mid)) {\r\n this.log.warn('animateAsLadder: no bubble by mid:', mid);\r\n return;\r\n }\r\n\r\n const contentWrapper = this.bubbles[mid].lastElementChild as HTMLElement;\r\n\r\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\r\n //lastMsDelay = (idx + offsetIndex) * delay;\r\n //lastMsDelay = (idx || 0.1) * 1000;\r\n \r\n contentWrapper.classList.add('zoom-fade');\r\n contentWrapper.style.transitionDelay = lastMsDelay + 'ms';\r\n\r\n if(idx === (mids.length - 1)) {\r\n const onTransitionEnd = (e: TransitionEvent) => {\r\n if(e.target !== contentWrapper) {\r\n return;\r\n }\r\n\r\n animationPromise.resolve();\r\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\r\n };\r\n\r\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\r\n }\r\n \r\n //this.log('supa', bubble);\r\n\r\n setBubbles.push(contentWrapper);\r\n });\r\n\r\n if(!mids.length) {\r\n animationPromise.resolve();\r\n }\r\n\r\n return {lastMsDelay, animationPromise};\r\n };\r\n\r\n const topRes = animateAsLadder(topIds, offsetIndex);\r\n const middleRes = animateAsLadder(middleIds);\r\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\r\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\r\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\r\n\r\n if(this.onAnimateLadder) {\r\n await this.onAnimateLadder();\r\n }\r\n\r\n // fastRaf(() => {\r\n fastRaf(() => {\r\n setBubbles.forEach(contentWrapper => {\r\n contentWrapper.classList.remove('zoom-fade');\r\n });\r\n });\r\n // });\r\n\r\n let promise: Promise;\r\n if(topIds.length || middleIds.length || bottomIds.length) {\r\n promise = Promise.all(promises);\r\n\r\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\r\n .then(() => { \r\n fastRaf(() => {\r\n setBubbles.forEach(contentWrapper => {\r\n contentWrapper.style.transitionDelay = '';\r\n });\r\n\r\n this.chatInner.classList.remove('zoom-fading');\r\n });\r\n\r\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх, \r\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\r\n if(!IS_SAFARI) {\r\n this.needReflowScroll = true;\r\n }\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private renderEmptyPlaceholder(type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting', bubble: HTMLElement, message: any, elements: (Node | string)[]) {\r\n const BASE_CLASS = 'empty-bubble-placeholder';\r\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\r\n\r\n let title: HTMLElement; \r\n if(type === 'group') title = i18n('GroupEmptyTitle1');\r\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\r\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\r\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\r\n 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 this.messagesQueue.findAndSplice(q => q.bubble === bubble);\r\n\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\r\n\r\n const middleware = this.getMiddleware();\r\n \r\n const loadPromise = this.appStickersManager.getGreetingSticker().then(doc => {\r\n if(!middleware()) return;\r\n\r\n const loadPromises: Promise[] = [];\r\n wrapSticker({\r\n doc, \r\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\r\n div: stickerDiv,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n\r\n attachClickEvent(stickerDiv, (e) => {\r\n cancelEvent(e);\r\n EmoticonsDropdown.onMediaClick({target: e.target});\r\n });\r\n\r\n return Promise.all(loadPromises);\r\n });\r\n\r\n this.renderMessagesQueue(message, bubble, false, [loadPromise]);\r\n\r\n elements.push(subtitle, stickerDiv);\r\n }\r\n\r\n if(listElements) {\r\n elements.push(\r\n ...listElements.map(elem => {\r\n const span = document.createElement('span');\r\n span.classList.add(BASE_CLASS + '-list-item');\r\n span.append(elem);\r\n return span;\r\n })\r\n );\r\n \r\n if(type === 'group') {\r\n listElements.forEach(elem => {\r\n const i = document.createElement('span');\r\n i.classList.add('tgico-check');\r\n elem.prepend(i);\r\n });\r\n } else if(type === 'saved') {\r\n listElements.forEach(elem => {\r\n const i = document.createElement('span');\r\n i.classList.add(BASE_CLASS + '-list-bullet');\r\n i.innerText = '•';\r\n elem.prepend(i);\r\n });\r\n }\r\n }\r\n\r\n if(elements.length > 1) {\r\n bubble.classList.add('has-description');\r\n }\r\n\r\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\r\n }\r\n\r\n private processLocalMessageRender(message: Message.message | Message.messageService) {\r\n const bubble = this.safeRenderMessage(message, undefined, undefined, undefined, false);\r\n bubble.classList.add('bubble-first', 'is-group-last', 'is-group-first');\r\n bubble.classList.remove('can-have-tail', 'is-in');\r\n\r\n const messageDiv = bubble.querySelector('.message, .service-msg');\r\n const elements: (Node | string)[] = [];\r\n const isBot = this.appPeersManager.isBot(this.peerId);\r\n if(isBot && message._ === 'message') {\r\n const b = document.createElement('b');\r\n b.append(i18n('BotInfoTitle'));\r\n elements.push(b, '\\n\\n');\r\n } else if(this.appPeersManager.isAnyGroup(this.peerId) && this.appPeersManager.getPeer(this.peerId).pFlags.creator) {\r\n this.renderEmptyPlaceholder('group', bubble, message, elements);\r\n } else if(this.chat.type === 'scheduled') {\r\n this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\r\n } else if(rootScope.myId === this.peerId) {\r\n this.renderEmptyPlaceholder('saved', bubble, message, elements);\r\n } else if(this.appPeersManager.isUser(this.peerId) && !isBot && this.appMessagesManager.canSendToPeer(this.peerId) && this.chat.type === 'chat') {\r\n this.renderEmptyPlaceholder('greeting', bubble, message, elements);\r\n } else {\r\n this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\r\n }\r\n\r\n /* for(let i = 1; i < elements.length; i += 2) {\r\n elements.splice(i, 0, '\\n');\r\n } */\r\n\r\n messageDiv.prepend(...elements);\r\n \r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.onAnimateLadder = () => {\r\n this.chatInner.prepend(bubble);\r\n this.onAnimateLadder = undefined;\r\n\r\n // need raf here because animation won't fire if this message is single\r\n if(!this.messagesQueuePromise) {\r\n return fastRafPromise();\r\n }\r\n };\r\n } else {\r\n this.chatInner.prepend(bubble);\r\n }\r\n\r\n this.emptyPlaceholderMid = message.mid;\r\n }\r\n\r\n private generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void): GenerateLocalMessageType {\r\n const offset = this.appMessagesIdsManager.generateMessageId(this.chat.type === 'scheduled' ? -1 : 0);\r\n\r\n const message: Omit & {message?: string} = {\r\n _: service ? 'messageService' : 'message',\r\n date: 0,\r\n id: -(+this.peerId + offset),\r\n peer_id: this.appPeersManager.getOutputPeer(this.peerId),\r\n pFlags: {}\r\n };\r\n\r\n if(!service) {\r\n message.message = '';\r\n }\r\n\r\n assumeType>(message);\r\n\r\n fill && fill(message);\r\n\r\n this.appMessagesManager.saveMessages([message]);\r\n return message;\r\n }\r\n\r\n private setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\r\n const willChange = this.scrollable.loadedAll[side] !== value;\r\n if(!willChange) {\r\n return;\r\n }\r\n\r\n this.scrollable.loadedAll[side] = value;\r\n\r\n /* if(!checkPlaceholders) {\r\n return;\r\n } */\r\n\r\n if(side === 'top' && value && this.appPeersManager.isBot(this.peerId)) {\r\n this.log('inject bot description');\r\n\r\n const middleware = this.getMiddleware();\r\n return this.appProfileManager.getProfile(this.peerId.toUserId()).then(userFull => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!userFull.bot_info?.description) {\r\n this.checkIfEmptyPlaceholderNeeded();\r\n return;\r\n }\r\n\r\n const message = this.generateLocalFirstMessage(false, message => {\r\n message.message = userFull.bot_info.description;\r\n });\r\n\r\n this.processLocalMessageRender(message);\r\n });\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n public checkIfEmptyPlaceholderNeeded() {\r\n if(this.scrollable.loadedAll.top && \r\n this.scrollable.loadedAll.bottom && \r\n this.emptyPlaceholderMid === undefined && \r\n (\r\n !this.appMessagesManager.getHistoryStorage(this.peerId).count || \r\n (\r\n Object.keys(this.bubbles).length && \r\n !this.getRenderedLength()\r\n ) ||\r\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\r\n )\r\n ) {\r\n this.log('inject empty peer placeholder');\r\n\r\n const message = this.generateLocalFirstMessage(true);\r\n this.processLocalMessageRender(message);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Load and render history\r\n * @param maxId max message id\r\n * @param reverse 'true' means up\r\n * @param isBackLimit is search\r\n * @param additionMsgId for the last message\r\n * @param justLoad do not render\r\n */\r\n public getHistory(maxId = 0, reverse = false, isBackLimit = false, additionMsgId = 0, justLoad = false): {cached: boolean, promise: Promise} {\r\n const peerId = this.peerId;\r\n\r\n //console.time('appImManager call getHistory');\r\n const pageCount = Math.min(30, windowSize.windowH / 38/* * 1.25 */ | 0);\r\n //const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\r\n const realLoadCount = Object.keys(this.bubbles).length > 0/* || additionMsgId */ ? Math.max(40, pageCount) : pageCount;//const realLoadCount = 50;\r\n //const realLoadCount = pageCount;//const realLoadCount = 50;\r\n let loadCount = realLoadCount;\r\n \r\n /* if(TEST_SCROLL) {\r\n //loadCount = 1;\r\n if(Object.keys(this.bubbles).length > 0)\r\n return {cached: false, promise: Promise.resolve(true)};\r\n } */\r\n if(TEST_SCROLL !== undefined) {\r\n if(TEST_SCROLL) {\r\n if(Object.keys(this.bubbles).length > 0) {\r\n --TEST_SCROLL;\r\n }\r\n } else {\r\n return {cached: false, promise: Promise.resolve(true)};\r\n }\r\n }\r\n \r\n ////console.time('render history total');\r\n \r\n let backLimit = 0;\r\n if(isBackLimit) {\r\n backLimit = loadCount;\r\n\r\n if(!reverse) { // if not jump\r\n loadCount = 0;\r\n //maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\r\n }\r\n }\r\n\r\n let additionMsgIds: number[];\r\n if(additionMsgId && !isBackLimit) {\r\n if(this.chat.type === 'pinned') {\r\n additionMsgIds = [additionMsgId];\r\n } else {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const slice = historyStorage.history.slice;\r\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\r\n additionMsgIds = slice.slice();\r\n\r\n // * filter last album, because we don't know is it the last item\r\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\r\n const message = this.chat.getMessage(additionMsgIds[i]);\r\n if(message.grouped_id) additionMsgIds.splice(i, 1);\r\n else break;\r\n }\r\n\r\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\r\n }\r\n }\r\n }\r\n\r\n /* const result = additionMsgID ? \r\n {history: [additionMsgID]} : \r\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\r\n let result: ReturnType | {history: number[]} = this.requestHistory(maxId, loadCount, backLimit) as any;\r\n let resultPromise: Promise;\r\n\r\n //const isFirstMessageRender = !!additionMsgID && result instanceof Promise && !appMessagesManager.getMessage(additionMsgID).grouped_id;\r\n const isAdditionRender = additionMsgIds?.length && result instanceof Promise;\r\n const isFirstMessageRender = (this.isFirstLoad && backLimit && result instanceof Promise) || isAdditionRender;\r\n if(isAdditionRender) {\r\n resultPromise = result as Promise;\r\n result = {history: additionMsgIds};\r\n //additionMsgID = 0;\r\n }\r\n\r\n this.isFirstLoad = false;\r\n\r\n const processResult = async(historyResult: typeof result) => {\r\n if('offsetIdOffset' in historyResult && historyResult.history.isEnd(SliceEnd.Top)) {\r\n if(this.chat.type === 'discussion') { // * inject discussion start\r\n //this.log('discussion got history', loadCount, backLimit, historyResult, isTopEnd);\r\n const serviceStartMessageId = this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId + '_' + this.chat.threadId];\r\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\r\n historyResult.history.push(...this.chat.getMidsByMid(this.chat.threadId).reverse());\r\n }\r\n\r\n await this.setLoaded('top', true);\r\n }\r\n };\r\n\r\n const sup = (result: HistoryResult) => {\r\n /* if(maxId && result.history?.length) {\r\n if(this.bubbles[maxId]) {\r\n result.history.findAndSplice(mid => mid === maxId); \r\n }\r\n } */\r\n\r\n ////console.timeEnd('render history total');\r\n \r\n return getHeavyAnimationPromise().then(() => {\r\n return processResult(result);\r\n }).then(() => {\r\n return this.performHistoryResult(result.history || [], reverse, isBackLimit, !isAdditionRender && additionMsgId);\r\n });\r\n };\r\n\r\n const processPromise = (result: Promise) => {\r\n const promise = result.then((result) => {\r\n //this.log('getHistory not cached result by maxId:', maxId, reverse, isBackLimit, result, peerId, justLoad);\r\n\r\n if(reverse ? this.getHistoryTopPromise !== promise : this.getHistoryBottomPromise !== promise) {\r\n this.log.warn('getHistory: peer changed');\r\n ////console.timeEnd('render history total');\r\n return Promise.reject();\r\n }\r\n\r\n if(justLoad) {\r\n this.scrollable.onScroll(); // нужно делать из-за ранней прогрузки\r\n return true;\r\n }\r\n //console.timeEnd('appImManager call getHistory');\r\n\r\n return sup(result);\r\n }, (err) => {\r\n this.log.error('getHistory error:', err);\r\n throw err;\r\n });\r\n \r\n return promise;\r\n };\r\n\r\n let promise: Promise, cached: boolean;\r\n if(result instanceof Promise) {\r\n cached = false;\r\n promise = processPromise(result);\r\n } else if(justLoad) {\r\n return null;\r\n } else {\r\n cached = true;\r\n //this.log('getHistory cached result by maxId:', maxId, reverse, isBackLimit, result, peerId, justLoad);\r\n promise = sup(result as HistoryResult);\r\n //return (reverse ? this.getHistoryTopPromise = promise : this.getHistoryBottomPromise = promise);\r\n //return this.performHistoryResult(result.history || [], reverse, isBackLimit, additionMsgID, true);\r\n }\r\n\r\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\r\n\r\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\r\n let times = isAdditionRender ? 2 : 1;\r\n this.messagesQueueOnRenderAdditional = () => {\r\n this.log('ship went past rocks of magnets');\r\n\r\n if(--times) return;\r\n\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n \r\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n (promise || Promise.resolve()).then(() => {\r\n setTimeout(() => { // preload messages\r\n this.loadMoreHistory(reverse, true);\r\n }, 0);\r\n });\r\n };\r\n } else {\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n }\r\n\r\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\r\n waitPromise.then(() => {\r\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\r\n });\r\n\r\n if(justLoad) {\r\n return null;\r\n }\r\n\r\n /* false && */!isFirstMessageRender && promise.then(() => {\r\n if(reverse) {\r\n this.loadedTopTimes++;\r\n this.loadedBottomTimes = Math.max(0, --this.loadedBottomTimes);\r\n } else {\r\n this.loadedBottomTimes++;\r\n this.loadedTopTimes = Math.max(0, --this.loadedTopTimes);\r\n }\r\n\r\n let ids: number[];\r\n if((reverse && this.loadedTopTimes > 2) || (!reverse && this.loadedBottomTimes > 2)) {\r\n ids = getObjectKeysAndSort(this.bubbles);\r\n }\r\n\r\n //let removeCount = loadCount / 2;\r\n const safeCount = realLoadCount * 2; // cause i've been runningrunningrunning all day\r\n //this.log('getHistory: slice loadedTimes:', reverse, pageCount, this.loadedTopTimes, this.loadedBottomTimes, ids?.length, safeCount);\r\n if(ids && ids.length > safeCount) {\r\n if(reverse) {\r\n //ids = ids.slice(-removeCount);\r\n //ids = ids.slice(removeCount * 2);\r\n ids = ids.slice(safeCount);\r\n this.setLoaded('bottom', false);\r\n\r\n //this.log('getHistory: slice bottom messages:', ids.length, loadCount);\r\n //this.getHistoryBottomPromise = undefined; // !WARNING, это нужно для обратной загрузки истории, если запрос словил флуд\r\n } else {\r\n //ids = ids.slice(0, removeCount);\r\n //ids = ids.slice(0, ids.length - (removeCount * 2));\r\n ids = ids.slice(0, ids.length - safeCount);\r\n this.setLoaded('top', false);\r\n\r\n //this.log('getHistory: slice up messages:', ids.length, loadCount);\r\n //this.getHistoryTopPromise = undefined; // !WARNING, это нужно для обратной загрузки истории, если запрос словил флуд\r\n }\r\n\r\n //this.log('getHistory: will slice ids:', ids, reverse);\r\n\r\n this.deleteMessagesByIds(ids, false);\r\n }\r\n });\r\n\r\n promise.then(() => {\r\n // preload more\r\n //if(!isFirstMessageRender) {\r\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\r\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\r\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\r\n setTimeout(() => {\r\n if(reverse) {\r\n this.loadMoreHistory(true, true);\r\n } else {\r\n this.loadMoreHistory(false, true);\r\n }\r\n }, 0);\r\n //}\r\n }\r\n //}\r\n });\r\n\r\n return {cached, promise};\r\n }\r\n\r\n public setUnreadDelimiter() {\r\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\r\n return;\r\n }\r\n\r\n if(this.attachedUnreadBubble) {\r\n return;\r\n }\r\n\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n let readMaxId = this.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\r\n if(!readMaxId) return;\r\n\r\n readMaxId = Object.keys(this.bubbles)\r\n .filter(mid => !this.bubbles[mid].classList.contains('is-out'))\r\n .map(i => +i)\r\n .sort((a, b) => a - b)\r\n .find(i => i > readMaxId);\r\n\r\n if(readMaxId && this.bubbles[readMaxId]) {\r\n let bubble = this.bubbles[readMaxId];\r\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\r\n this.firstUnreadBubble.classList.remove('is-first-unread');\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n if(readMaxId !== historyStorage.maxId) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n this.firstUnreadBubble = bubble;\r\n this.attachedUnreadBubble = true;\r\n }\r\n }\r\n\r\n public deleteEmptyDateGroups() {\r\n const mustBeCount = 1 + +!!this.stickyIntersector;\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 }\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n}\r\n\r\nexport function generateTail() {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\r\n svg.setAttributeNS(null, 'width', '11');\r\n svg.setAttributeNS(null, 'height', '20');\r\n svg.classList.add('bubble-tail');\r\n\r\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\r\n use.setAttributeNS(null, 'href', '#message-tail-filled');\r\n\r\n svg.append(use);\r\n\r\n return svg;\r\n}\r\n","export const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { FormatterArguments, LangPackKey } from \"../../lib/langPack\";\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class PopupPinMessage {\n constructor(peerId: PeerId, mid: number, unpin?: true, onConfirm?: () => void) {\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments, \n buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const canUnpin = appPeersManager.canPinMessage(peerId);\n\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, oneSide?: boolean, silent?: boolean) => {\n setTimeout(() => { // * костыль, потому что document.elementFromPoint вернёт popup-peer пока он будет закрываться\n let promise: Promise;\n if(unpin && !mid) {\n if(canUnpin) {\n promise = appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = appMessagesManager.updatePinnedMessage(peerId, mid, unpin, silent, oneSide);\n }\n\n if(onConfirm) {\n promise.then(onConfirm);\n }\n }, 300);\n };\n\n if(unpin) {\n let buttonText: LangPackKey = 'UnpinMessage';\n if(!mid) {\n if(canUnpin) {\n title = 'Popup.Unpin.AllTitle';\n description = 'Chat.UnpinAllMessagesConfirmation';\n descriptionArgs = ['' + (appMessagesManager.pinnedMessages[peerId]?.count || 1)];\n } else {\n title = 'Popup.Unpin.HideTitle';\n description = 'Popup.Unpin.HideDescription';\n buttonText = 'Popup.Unpin.Hide';\n }\n } else {\n title = 'UnpinMessageAlertTitle';\n description = 'Chat.Confirm.Unpin';\n }\n \n buttons.push({\n langKey: buttonText,\n isDanger: true,\n callback\n });\n } else {\n title = 'PinMessageAlertTitle';\n const pinButtonText: LangPackKey = 'PinMessage';\n \n if(peerId.isAnyChat()) {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, false, !checked.size)\n });\n\n if(appChatsManager.isBroadcast(peerId.toChatId())) {\n description = 'PinMessageAlertChannel';\n } else {\n description = 'PinMessageAlert';\n \n checkboxes.push({\n text: 'PinNotify',\n checked: true\n });\n }\n } else {\n description = 'PinMessageAlertChat';\n\n if(peerId === rootScope.myId) {\n buttons.push({\n langKey: pinButtonText,\n callback\n });\n } else {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, !checked.size)\n });\n\n checkboxes.push({\n text: 'PinAlsoFor',\n textArgs: [new PeerTitle({peerId}).element],\n checked: true\n });\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function isSelectionEmpty(selection = window.getSelection()) {\r\n if(!selection || !selection.rangeCount) {\r\n return true;\r\n }\r\n\r\n const selectionRange = selection.getRangeAt(0);\r\n if(!selectionRange.toString() || !selectionRange.START_TO_END) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { ReportReason } from \"../../layer\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\nimport InputField from \"../inputField\";\nimport { toastNew } from \"../toast\";\nimport { wrapSticker } from \"../wrappers\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupReportMessagesConfirm extends PopupPeer {\n public static STICKER_EMOJI = '👮‍♀️';\n constructor(peerId: PeerId, mids: number[], reason: ReportReason['_'], onConfirm?: () => void) {\n super('popup-report-messages-confirm', {\n noTitle: true, \n descriptionLangKey: 'ReportInfo', \n buttons: [{\n langKey: 'ReportChat',\n callback: () => {\n if(!inputField.isValid()) {\n return;\n }\n\n onConfirm && onConfirm();\n appMessagesManager.reportMessages(peerId, mids, reason, inputField.value).then(bool => {\n if(!bool) return;\n\n toastNew({\n langPackKey: 'ReportSentInfo'\n });\n });\n }\n }], \n body: true\n });\n\n const div = document.createElement('div');\n const doc = appStickersManager.getAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n const size = 100;\n wrapSticker({\n doc,\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size,\n loop: false,\n play: true\n }).finally(() => {\n this.show();\n });\n\n this.header.append(div);\n\n const inputField = new InputField({\n label: 'ReportHint',\n maxLength: 512,\n placeholder: 'ReportChatDescription'\n });\n\n inputField.input.addEventListener('input', () => {\n this.buttons[0].element.toggleAttribute('disabled', !inputField.isValid());\n });\n\n this.body.append(inputField.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport { ReportReason } from \"../../layer\";\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport Button from \"../button\";\nimport PopupPeer from \"./peer\";\nimport PopupReportMessagesConfirm from \"./reportMessagesConfirm\";\n\nexport default class PopupReportMessages extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-report-messages', {titleLangKey: 'ChatTitle.ReportMessages', buttons: [], body: true});\n\n mids = mids.slice();\n\n const buttons: [LangPackKey, ReportReason['_']][] = [\n ['ReportChatSpam', 'inputReportReasonSpam'],\n ['ReportChatViolence', 'inputReportReasonViolence'],\n ['ReportChatChild', 'inputReportReasonChildAbuse'],\n ['ReportChatPornography', 'inputReportReasonPornography'],\n ['ReportChatOther', 'inputReportReasonOther']\n ];\n\n const className = 'btn-primary btn-transparent';\n buttons.forEach(b => {\n const button = Button(className, {/* icon: 'edit', */text: b[0]});\n this.body.append(button);\n });\n\n const preloadStickerPromise = appStickersManager.preloadAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n\n attachClickEvent(this.body, (e) => {\n const target = findUpClassName(e.target, 'btn-primary');\n const reason = buttons[whichChild(target)][1];\n\n preloadStickerPromise.then(() => {\n this.hide();\n\n new PopupReportMessagesConfirm(peerId, mids, reason, onConfirm);\n });\n }, {listenerSetter: this.listenerSetter});\n \n this.body.style.margin = '0 -1rem';\n this.buttonsEl.style.marginTop = '.5rem';\n\n this.show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type { AppPollsManager } from \"../../lib/appManagers/appPollsManager\";\r\nimport type { AppDocsManager, MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../misc\";\r\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport { copyTextToClipboard } from \"../../helpers/clipboard\";\r\nimport PopupSendNow from \"../popups/sendNow\";\r\nimport { toast } from \"../toast\";\r\nimport I18n, { 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 } from \"../../layer\";\r\nimport PopupReportMessages from \"../popups/reportMessages\";\r\n\r\nexport default class ChatContextMenu {\r\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean, notDirect?: () => boolean, withSelection?: true})[];\r\n private element: HTMLElement;\r\n\r\n private isSelectable: boolean;\r\n private isSelected: boolean;\r\n private target: HTMLElement;\r\n private isTargetAGroupedItem: boolean;\r\n private isTextSelected: boolean;\r\n private isAnchorTarget: boolean;\r\n private isUsernameTarget: boolean;\r\n private peerId: PeerId;\r\n private mid: number;\r\n private message: any;\r\n\r\n constructor(private attachTo: HTMLElement, \r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appPeersManager: AppPeersManager, \r\n private appPollsManager: AppPollsManager,\r\n private appDocsManager: AppDocsManager,\r\n private appMessagesIdsManager: AppMessagesIdsManager\r\n ) {\r\n const onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\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 if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\r\n if(this.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 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(chat.selection.isSelecting && !contentWrapper) {\r\n const mids = this.chat.getMidsByMid(mid);\r\n if(mids.length > 1) {\r\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ? \r\n mid : \r\n mids.find(mid => this.chat.selection.isMidSelected(this.peerId, mid));\r\n if(selectedMid) {\r\n mid = selectedMid;\r\n }\r\n }\r\n }\r\n\r\n const groupedItem = findUpClassName(this.target, 'grouped-item');\r\n this.isTargetAGroupedItem = !!groupedItem;\r\n if(groupedItem) {\r\n this.mid = +groupedItem.dataset.mid;\r\n } else {\r\n this.mid = mid;\r\n }\r\n\r\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\r\n this.message = this.chat.getMessage(this.mid);\r\n\r\n this.buttons.forEach(button => {\r\n let good: boolean;\r\n\r\n //if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\r\n if(chat.selection.isSelecting && !button.withSelection) {\r\n good = false;\r\n } else {\r\n good = contentWrapper || IS_TOUCH_SUPPORTED || true ? \r\n button.verify() : \r\n button.notDirect && button.verify() && button.notDirect();\r\n }\r\n\r\n button.element.classList.toggle('hide', !good);\r\n });\r\n\r\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\r\n //bubble.parentElement.append(this.element);\r\n //appImManager.log('contextmenu', e, bubble, side);\r\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, side);\r\n openBtnMenu(this.element, () => {\r\n this.mid = 0;\r\n this.peerId = undefined;\r\n this.target = null;\r\n });\r\n };\r\n\r\n if(IS_TOUCH_SUPPORTED/* && false */) {\r\n attachClickEvent(attachTo, (e) => {\r\n if(chat.selection.isSelecting) {\r\n return;\r\n }\r\n\r\n const className = (e.target as HTMLElement).className;\r\n if(!className || !className.includes) return;\r\n\r\n chat.log('touchend', e);\r\n\r\n const good = ['bubble', 'bubble-content-wrapper', 'bubble-content', 'message', 'time', 'inner'].find(c => className.match(new RegExp(c + '($|\\\\s)')));\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 onContextMenu(e);\r\n }\r\n }, {listenerSetter: this.chat.bubbles.listenerSetter});\r\n } else attachContextMenuListener(attachTo, onContextMenu, this.chat.bubbles.listenerSetter);\r\n }\r\n\r\n private init() {\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 this.appMessagesManager.editMessage(this.message, this.message.message, {\r\n scheduleDate: this.chat.input.scheduleDate,\r\n entities: this.message.entities\r\n });\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }, new Date(this.message.date * 1000));\r\n },\r\n verify: () => this.chat.type === 'scheduled'\r\n }, {\r\n icon: 'reply',\r\n text: 'Reply',\r\n onClick: this.onReplyClick,\r\n verify: () => this.appMessagesManager.canSendToPeer(this.peerId, this.chat.threadId) && \r\n !this.message.pFlags.is_outgoing && \r\n !!this.chat.input.messageInput && \r\n this.chat.type !== 'scheduled'/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'edit',\r\n text: 'Edit',\r\n onClick: this.onEditClick,\r\n verify: () => this.appMessagesManager.canEditMessage(this.message, 'text') && !!this.chat.input.messageInput\r\n }, {\r\n icon: 'copy',\r\n text: 'Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => !!this.message.message && !this.isTextSelected && (!this.isAnchorTarget || this.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.message.message && this.isTextSelected\r\n }, {\r\n icon: 'copy',\r\n text: 'Message.Context.Selection.Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => {\r\n if(!this.isSelected) {\r\n return false;\r\n }\r\n\r\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\r\n for(const mid of mids) {\r\n if(!!this.appMessagesManager.getMessageByPeer(peerId, mid).message) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'CopyLink',\r\n onClick: this.onCopyAnchorLinkClick,\r\n verify: () => this.isAnchorTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Username',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.isUsernameTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Hashtag',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.target.classList.contains('anchor-hashtag'),\r\n withSelection: true\r\n }, {\r\n icon: 'link',\r\n text: 'MessageContext.CopyMessageLink1',\r\n onClick: this.onCopyLinkClick,\r\n verify: () => this.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'pin',\r\n text: 'Message.Context.Pin',\r\n onClick: this.onPinClick,\r\n verify: () => !this.message.pFlags.is_outgoing && \r\n this.message._ !== 'messageService' && \r\n !this.message.pFlags.pinned && \r\n this.appPeersManager.canPinMessage(this.peerId) && \r\n this.chat.type !== 'scheduled',\r\n }, {\r\n icon: 'unpin',\r\n text: 'Message.Context.Unpin',\r\n onClick: this.onUnpinClick,\r\n verify: () => this.message.pFlags.pinned && this.appPeersManager.canPinMessage(this.peerId),\r\n }, {\r\n icon: 'download',\r\n text: 'MediaViewer.Context.Download',\r\n onClick: () => {\r\n this.appDocsManager.saveDocFile(this.message.media.document);\r\n },\r\n verify: () => {\r\n if(this.message.pFlags.is_outgoing) {\r\n return false;\r\n }\r\n \r\n const doc: MyDocument = this.message.media?.document;\r\n if(!doc) return false;\r\n \r\n let hasTarget = !!IS_TOUCH_SUPPORTED;\r\n const isGoodType = !doc.type || !(['gif', 'video', 'sticker'] as MyDocument['type'][]).includes(doc.type);\r\n if(isGoodType) hasTarget = hasTarget || !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio');\r\n return isGoodType && hasTarget;\r\n }\r\n }, {\r\n icon: 'checkretract',\r\n text: 'Chat.Poll.Unvote',\r\n onClick: this.onRetractVote,\r\n verify: () => {\r\n const poll = this.message.media?.poll as Poll;\r\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'stop',\r\n text: 'Chat.Poll.Stop',\r\n onClick: this.onStopPoll,\r\n verify: () => {\r\n const poll = this.message.media?.poll;\r\n return this.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'forward',\r\n text: 'Forward',\r\n onClick: this.onForwardClick,\r\n verify: () => this.chat.type !== 'scheduled' && !this.message.pFlags.is_outgoing && this.message._ !== 'messageService'\r\n }, {\r\n icon: 'forward',\r\n text: 'Message.Context.Selection.Forward',\r\n onClick: this.onForwardClick,\r\n verify: () => this.chat.selection.selectionForwardBtn && \r\n this.isSelected && \r\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'flag',\r\n text: 'ReportChat',\r\n onClick: () => {\r\n new PopupReportMessages(this.peerId, [this.mid]);\r\n },\r\n verify: () => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && this.appPeersManager.isChannel(this.peerId),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Select',\r\n onClick: this.onSelectClick,\r\n verify: () => !this.message.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 icon: 'delete danger',\r\n text: 'Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.appMessagesManager.canDeleteMessage(this.message)\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Message.Context.Selection.Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }];\r\n\r\n this.element = ButtonMenu(this.buttons, this.chat.bubbles.listenerSetter);\r\n this.element.id = 'bubble-contextmenu';\r\n this.element.classList.add('contextmenu');\r\n this.chat.container.append(this.element);\r\n }\r\n\r\n private onSendScheduledClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\r\n } else {\r\n new PopupSendNow(this.peerId, this.chat.getMidsByMid(this.mid));\r\n }\r\n };\r\n\r\n private onReplyClick = () => {\r\n this.chat.input.initMessageReply(this.mid);\r\n };\r\n\r\n private onEditClick = () => {\r\n this.chat.input.initMessageEditing(this.mid);\r\n };\r\n\r\n private onCopyClick = () => {\r\n if(isSelectionEmpty()) {\r\n const mids = this.chat.selection.isSelecting ? \r\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) : \r\n [this.mid];\r\n\r\n const str = mids.reduce((acc, mid) => {\r\n const message = this.chat.getMessage(mid);\r\n return acc + (message?.message ? message.message + '\\n' : '');\r\n }, '').trim();\r\n\r\n copyTextToClipboard(str);\r\n } else {\r\n document.execCommand('copy');\r\n //cancelSelection();\r\n }\r\n };\r\n\r\n private onCopyAnchorLinkClick = () => {\r\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\r\n };\r\n\r\n private onCopyLinkClick = () => {\r\n let threadMessage: Message.message;\r\n if(this.chat.type === 'discussion') {\r\n threadMessage = this.appMessagesManager.getMessageByPeer(this.peerId, this.chat.threadId);\r\n }\r\n\r\n const username = this.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : this.peerId);\r\n const msgId = this.appMessagesIdsManager.getServerMessageId(this.mid);\r\n let url = 'https://t.me/';\r\n let key: LangPackKey;\r\n if(username) {\r\n url += username + '/' + (threadMessage ? this.appMessagesIdsManager.getServerMessageId(threadMessage.fwd_from.channel_post) : msgId);\r\n if(threadMessage) url += '?comment=' + msgId;\r\n key = 'LinkCopied';\r\n } else {\r\n url += 'c/' + this.peerId.toChatId() + '/' + msgId;\r\n if(threadMessage) url += '?thread=' + this.appMessagesIdsManager.getServerMessageId(threadMessage.mid);\r\n key = 'LinkCopiedPrivateInfo';\r\n }\r\n\r\n toast(I18n.format(key, true));\r\n\r\n copyTextToClipboard(url);\r\n };\r\n\r\n private onPinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid);\r\n };\r\n\r\n private onUnpinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid, true);\r\n };\r\n\r\n private onRetractVote = () => {\r\n this.appPollsManager.sendVote(this.message, []);\r\n };\r\n\r\n private onStopPoll = () => {\r\n this.appPollsManager.stopPoll(this.message);\r\n };\r\n\r\n private onForwardClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\r\n } else {\r\n const mids = this.isTargetAGroupedItem ? [this.mid] : this.chat.getMidsByMid(this.mid);\r\n new PopupForward({\r\n [this.peerId]: mids\r\n });\r\n }\r\n };\r\n\r\n private onSelectClick = () => {\r\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\r\n };\r\n\r\n private onClearSelectionClick = () => {\r\n this.chat.selection.cancelSelection();\r\n };\r\n\r\n private onDeleteClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\r\n } else {\r\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : this.chat.getMidsByMid(this.mid), this.chat.type);\r\n }\r\n };\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport { attachContextMenuListener, openBtnMenu } from \"../misc\";\r\n\r\nexport default class SendMenu {\r\n public sendMenu: HTMLDivElement;\r\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\r\n private type: 'schedule' | 'reminder';\r\n \r\n constructor(options: {\r\n onSilentClick: () => void,\r\n onScheduleClick: () => void,\r\n listenerSetter?: ListenerSetter,\r\n openSide: string,\r\n onContextElement: HTMLElement,\r\n onOpen?: () => boolean\r\n }) {\r\n this.sendMenuButtons = [{\r\n icon: 'mute',\r\n text: 'Chat.Send.WithoutSound',\r\n onClick: options.onSilentClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.ScheduledMessage',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.SetReminder',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'reminder'\r\n }];\r\n \r\n this.sendMenu = ButtonMenu(this.sendMenuButtons, options.listenerSetter);\r\n this.sendMenu.classList.add('menu-send', options.openSide);\r\n\r\n attachContextMenuListener(options.onContextElement, (e: any) => {\r\n if(options.onOpen && !options.onOpen()) {\r\n return;\r\n }\r\n\r\n this.sendMenuButtons.forEach(button => {\r\n button.element.classList.toggle('hide', !button.verify());\r\n });\r\n \r\n cancelEvent(e);\r\n openBtnMenu(this.sendMenu);\r\n }, options.listenerSetter);\r\n }\r\n\r\n public setPeerId(peerId: PeerId) {\r\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"../chat/chat\";\r\nimport PopupElement from \".\";\r\nimport CheckboxField from \"../checkboxField\";\r\nimport InputField from \"../inputField\";\r\nimport RadioField from \"../radioField\";\r\nimport Scrollable from \"../scrollable\";\r\nimport SendContextMenu from \"../chat/sendContextMenu\";\r\nimport I18n, { _i18n } from \"../../lib/langPack\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport getRichValue from \"../../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../../helpers/dom/isInputEmpty\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { Poll } from \"../../layer\";\r\n\r\nconst MAX_LENGTH_QUESTION = 255;\r\nconst MAX_LENGTH_OPTION = 100;\r\nconst MAX_LENGTH_SOLUTION = 200;\r\n\r\nexport default class PopupCreatePoll extends PopupElement {\r\n private questionInputField: InputField;\r\n private questions: HTMLElement;\r\n private scrollable: Scrollable;\r\n private tempId = 0;\r\n\r\n private anonymousCheckboxField: CheckboxField;\r\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n\r\n private correctAnswers: Uint8Array[];\r\n private quizSolutionField: InputField;\r\n private optionInputFields: InputField[];\r\n\r\n constructor(private chat: Chat) {\r\n super('popup-create-poll popup-new-media', null, {closable: true, withConfirm: 'Create', body: true});\r\n\r\n _i18n(this.title, 'NewPoll');\r\n\r\n this.questionInputField = new InputField({\r\n placeholder: 'AskAQuestion',\r\n label: 'AskAQuestion', \r\n name: 'question', \r\n maxLength: MAX_LENGTH_QUESTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n this.optionInputFields = [];\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const sendMenu = new SendContextMenu({\r\n onSilentClick: () => {\r\n this.chat.input.sendSilent = true;\r\n this.send();\r\n },\r\n onScheduleClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n this.send();\r\n });\r\n },\r\n openSide: 'bottom-left',\r\n onContextElement: this.btnConfirm,\r\n });\r\n \r\n sendMenu.setPeerId(this.chat.peerId);\r\n\r\n this.header.append(sendMenu.sendMenu);\r\n }\r\n\r\n this.header.append(this.questionInputField.container);\r\n\r\n const hr = document.createElement('hr');\r\n const d = document.createElement('div');\r\n d.classList.add('caption');\r\n _i18n(d, 'PollOptions');\r\n\r\n this.questions = document.createElement('form');\r\n this.questions.classList.add('poll-create-questions');\r\n\r\n const dd = document.createElement('div');\r\n dd.classList.add('poll-create-settings');\r\n \r\n const settingsCaption = document.createElement('div');\r\n settingsCaption.classList.add('caption');\r\n _i18n(settingsCaption, 'Settings');\r\n\r\n if(!this.chat.appPeersManager.isBroadcast(this.chat.peerId)) {\r\n this.anonymousCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Anonymous', \r\n name: 'anonymous'\r\n });\r\n this.anonymousCheckboxField.input.checked = true;\r\n dd.append(this.anonymousCheckboxField.label);\r\n }\r\n \r\n this.multipleCheckboxField = new CheckboxField({\r\n text: 'NewPoll.MultipleChoice', \r\n name: 'multiple'\r\n });\r\n this.quizCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Quiz', \r\n name: 'quiz'\r\n });\r\n\r\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\r\n const checked = this.multipleCheckboxField.input.checked;\r\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\r\n });\r\n\r\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\r\n const checked = this.quizCheckboxField.input.checked;\r\n\r\n (Array.from(this.questions.children) as HTMLElement[]).map(el => {\r\n el.classList.toggle('radio-field', checked);\r\n });\r\n\r\n if(!checked) {\r\n this.correctAnswers = undefined;\r\n this.quizSolutionField.setValueSilently('');\r\n }\r\n\r\n quizElements.forEach(el => el.classList.toggle('hide', !checked));\r\n\r\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\r\n this.handleChange();\r\n });\r\n\r\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\r\n\r\n const quizElements: HTMLElement[] = [];\r\n\r\n const quizSolutionCaption = document.createElement('div');\r\n quizSolutionCaption.classList.add('caption');\r\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\r\n\r\n const quizHr = document.createElement('hr');\r\n\r\n const quizSolutionContainer = document.createElement('div');\r\n quizSolutionContainer.classList.add('poll-create-questions');\r\n\r\n this.quizSolutionField = new InputField({\r\n placeholder: 'NewPoll.Explanation.Placeholder', \r\n label: 'NewPoll.Explanation.Placeholder',\r\n name: 'solution',\r\n maxLength: MAX_LENGTH_SOLUTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n const quizSolutionSubtitle = document.createElement('div');\r\n quizSolutionSubtitle.classList.add('subtitle');\r\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\r\n\r\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\r\n\r\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\r\n quizElements.forEach(el => el.classList.add('hide'));\r\n\r\n this.body.parentElement.insertBefore(hr, this.body);\r\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\r\n\r\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.scrollable = new Scrollable(this.body);\r\n this.appendMoreField();\r\n\r\n this.onEscape = () => {\r\n return !this.getFilledAnswers().length;\r\n };\r\n\r\n this.handleChange();\r\n }\r\n\r\n private getFilledAnswers() {\r\n const answers = Array.from(this.questions.children).map((el, idx) => {\r\n const input = el.querySelector('.input-field-input') as HTMLElement;\r\n return input instanceof HTMLInputElement ? input.value : getRichValue(input, false).value;\r\n }).filter(v => !!v.trim());\r\n\r\n return answers;\r\n }\r\n\r\n private onSubmitClick = () => {\r\n this.send();\r\n };\r\n\r\n private validate() {\r\n const question = this.questionInputField.value;\r\n if(!question) {\r\n return false;\r\n }\r\n\r\n if(question.length > MAX_LENGTH_QUESTION) {\r\n return false;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\r\n return false;\r\n }\r\n\r\n const answers = this.getFilledAnswers();\r\n if(answers.length < 2) {\r\n return false;\r\n }\r\n \r\n const tooLongOption = answers.find(a => a.length > MAX_LENGTH_OPTION);\r\n if(tooLongOption) {\r\n return false;\r\n }\r\n\r\n const {value: quizSolution} = getRichValue(this.quizSolutionField.input, false);\r\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleChange() {\r\n const valid = this.validate();\r\n this.btnConfirm.toggleAttribute('disabled', !valid);\r\n }\r\n\r\n public send(force = false) {\r\n const question = this.questionInputField.value;\r\n\r\n const answers = this.getFilledAnswers();\r\n\r\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValue(this.quizSolutionField.input);\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.chat.input.scheduleSending(() => {\r\n this.send(true);\r\n });\r\n \r\n return;\r\n }\r\n\r\n this.hide();\r\n\r\n //const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\r\n //const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\r\n\r\n const pFlags: Poll['pFlags'] = {};\r\n\r\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\r\n pFlags.public_voters = true;\r\n }\r\n\r\n if(this.multipleCheckboxField.input.checked) {\r\n pFlags.multiple_choice = true;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked) {\r\n pFlags.quiz = true;\r\n }\r\n\r\n const poll: Poll = {\r\n _: 'poll',\r\n pFlags,\r\n question,\r\n answers: answers.map((value, idx) => {\r\n return {\r\n _: 'pollAnswer',\r\n text: value,\r\n option: new Uint8Array([idx])\r\n };\r\n }),\r\n id: undefined\r\n };\r\n //poll.id = randomIDS;\r\n\r\n const inputMediaPoll = this.chat.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\r\n\r\n //console.log('Will try to create poll:', inputMediaPoll);\r\n\r\n this.chat.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\r\n threadId: this.chat.threadId,\r\n replyToMsgId: this.chat.input.replyToMsgId,\r\n scheduleDate: this.chat.input.scheduleDate,\r\n silent: this.chat.input.sendSilent\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(this.questions.lastElementChild as HTMLElement, 'center');\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\r\n\r\n this.optionInputFields.push(questionField);\r\n }\r\n}\r\n","/**\n * @returns duration in ms\n */\nexport default function getGifDuration(image: HTMLImageElement) {\n const src = image.src;\n\n return fetch(src)\n .then(response => response.arrayBuffer())\n .then(arrayBuffer => {\n const d = new Uint8Array(arrayBuffer);\n // Thanks to http://justinsomnia.org/2006/10/gif-animation-duration-calculation/\n // And http://www.w3.org/Graphics/GIF/spec-gif89a.txt\n let duration = 0;\n for(let i = 0, length = d.length; i < length; ++i) {\n // Find a Graphic Control Extension hex(21F904__ ____ __00)\n if(d[i] == 0x21 \n && d[i + 1] == 0xF9 \n && d[i + 2] == 0x04 \n && d[i + 7] == 0x00) {\n // Swap 5th and 6th bytes to get the delay per frame\n const delay = (d[i + 5] << 8) | (d[i + 4] & 0xFF);\n \n // Should be aware browsers have a minimum frame delay \n // e.g. 6ms for IE, 2ms modern browsers (50fps)\n duration += delay < 2 ? 10 : delay;\n }\n }\n\n return duration / 1000;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from \"../chat/chat\";\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport Scrollable from \"../scrollable\";\nimport { toast } from \"../toast\";\nimport { prepareAlbum, wrapDocument } from \"../wrappers\";\nimport CheckboxField from \"../checkboxField\";\nimport SendContextMenu from \"../chat/sendContextMenu\";\nimport { createPosterFromMedia, createPosterFromVideo, onMediaLoad } from \"../../helpers/files\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport I18n, { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport placeCaretAtEnd from \"../../helpers/dom/placeCaretAtEnd\";\nimport rootScope from \"../../lib/rootScope\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { MediaSize } from \"../../helpers/mediaSizes\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport getGifDuration from \"../../helpers/getGifDuration\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\n\ntype SendFileParams = Partial<{\n file: File,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n width: number,\n height: number,\n duration: number,\n noSound: boolean,\n itemDiv: HTMLElement\n}>;\n\nlet currentPopup: PopupNewMedia;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private input: HTMLElement;\n private mediaContainer: HTMLElement;\n private groupCheckboxField: CheckboxField;\n private mediaCheckboxField: CheckboxField;\n private wasInputValue: string;\n\n private willAttach: Partial<{\n type: 'media' | 'document',\n isMedia: true,\n group: boolean,\n sendFileDetails: SendFileParams[]\n }>;\n private inputField: InputField;\n\n constructor(private chat: Chat, private files: File[], willAttachType: PopupNewMedia['willAttach']['type']) {\n super('popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Modal.Send', confirmShortcutIsSendShortcut: true, body: true});\n\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: false\n };\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n const scrollable = new Scrollable(null);\n scrollable.container.append(this.mediaContainer);\n \n this.inputField = new InputField({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n label: 'Caption',\n name: 'photo-caption',\n maxLength: rootScope.config.caption_length_max\n });\n this.input = this.inputField.input;\n\n this.inputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n\n this.body.append(scrollable.container);\n this.container.append(this.inputField.container);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files = [];\n currentPopup = undefined;\n });\n\n currentPopup = this;\n }\n\n public appendDrops(element: HTMLElement) {\n this.body.append(element);\n }\n\n get type() {\n return this.willAttach.type;\n }\n\n set type(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n }\n\n private appendGroupCheckboxField() {\n const good = this.files.length > 1;\n if(good && !this.groupCheckboxField) {\n this.groupCheckboxField = new CheckboxField({\n text: 'PreviewSender.GroupItems', \n name: 'group-items'\n });\n this.container.append(...[this.groupCheckboxField.label, this.mediaCheckboxField?.label, this.inputField.container].filter(Boolean));\n \n this.willAttach.group = true;\n this.groupCheckboxField.setValueSilently(this.willAttach.group);\n\n this.listenerSetter.add(this.groupCheckboxField.input)('change', () => {\n const checked = this.groupCheckboxField.checked;\n \n this.willAttach.group = checked;\n\n this.attachFiles();\n });\n } else if(this.groupCheckboxField) {\n this.groupCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n private appendMediaCheckboxField() {\n const good = !!this.files.find(file => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n if(good && !this.mediaCheckboxField) {\n this.mediaCheckboxField = new CheckboxField({\n text: 'PreviewSender.CompressFile',\n name: 'compress-items'\n });\n this.container.append(...[this.groupCheckboxField?.label, this.mediaCheckboxField.label, this.inputField.container].filter(Boolean));\n\n this.mediaCheckboxField.setValueSilently(this.willAttach.type === 'media');\n\n this.listenerSetter.add(this.mediaCheckboxField.input)('change', () => {\n const checked = this.mediaCheckboxField.checked;\n \n this.willAttach.type = checked ? 'media' : 'document';\n\n this.attachFiles();\n });\n } else if(this.mediaCheckboxField) {\n this.mediaCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n public addFiles(files: File[]) {\n const toPush = files.filter(file => {\n const found = this.files.find(_file => {\n return _file.lastModified === file.lastModified && _file.name === file.name && _file.size === file.size;\n });\n \n return !found;\n });\n\n if(toPush.length) {\n this.files.push(...toPush);\n this.attachFiles();\n }\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if(target !== this.input) {\n if(target.tagName === 'INPUT' || target.hasAttribute('contenteditable')) {\n return;\n }\n\n this.input.focus();\n placeCaretAtEnd(this.input);\n }\n };\n\n private send(force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n \n return;\n }\n\n let caption = this.inputField.value;\n if(caption.length > rootScope.config.caption_length_max) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n this.hide();\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' ? true : undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n //console.log('will send files with options:', willAttach);\n\n const {peerId, input} = this.chat;\n const {sendSilent, scheduleDate} = input;\n\n sendFileDetails.forEach(d => {\n d.itemDiv = undefined;\n });\n\n const {length} = sendFileDetails;\n const replyToMsgId = input.replyToMsgId;\n this.iterate((sendFileDetails) => {\n if(caption && sendFileDetails.length !== length) {\n this.chat.appMessagesManager.sendText(peerId, caption, {\n replyToMsgId, \n threadId: this.chat.threadId,\n silent: sendSilent, \n scheduleDate,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const w = {\n ...willAttach,\n sendFileDetails\n };\n\n this.chat.appMessagesManager.sendAlbum(peerId, w.sendFileDetails.map(d => d.file), Object.assign({\n caption,\n replyToMsgId,\n threadId: this.chat.threadId,\n isMedia: isMedia,\n silent: sendSilent,\n scheduleDate,\n clearDraft: true as true\n }, w));\n\n caption = undefined;\n });\n \n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n }\n\n private attachMedia(file: File, params: SendFileParams, itemDiv: HTMLElement) {\n itemDiv.classList.add('popup-item-media');\n\n const isVideo = file.type.startsWith('video/');\n\n let promise: Promise;\n if(isVideo) {\n const video = document.createElement('video');\n const source = document.createElement('source');\n source.src = params.objectURL = URL.createObjectURL(file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n video.setAttribute('playsinline', 'true');\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n promise = onMediaLoad(video).then(() => {\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n \n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n itemDiv.append(video);\n return createPosterFromVideo(video).then(thumb => {\n params.thumb = {\n url: URL.createObjectURL(thumb.blob),\n ...thumb\n };\n });\n });\n\n video.append(source);\n } else {\n const img = new Image();\n promise = new Promise((resolve) => {\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n itemDiv.append(img);\n \n if(file.type === 'image/gif') {\n params.noSound = true;\n \n Promise.all([\n getGifDuration(img).then(duration => {\n params.duration = Math.ceil(duration);\n }),\n \n createPosterFromMedia(img).then(thumb => {\n params.thumb = {\n url: URL.createObjectURL(thumb.blob),\n ...thumb\n };\n })\n ]).then(() => {\n resolve();\n });\n } else {\n resolve();\n }\n };\n });\n \n img.src = params.objectURL = URL.createObjectURL(file);\n }\n\n return promise;\n }\n\n private attachDocument(file: File, params: SendFileParams, itemDiv: HTMLElement): ReturnType {\n itemDiv.classList.add('popup-item-document');\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio) {\n params.objectURL = URL.createObjectURL(file);\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n fileName: file.name ? RichTextProcessor.wrapEmojiText(file.name) : '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n const cacheContext = appDownloadManager.getCacheContext(doc);\n cacheContext.url = params.objectURL;\n cacheContext.downloaded = file.size;\n\n const docDiv = wrapDocument({\n message: {\n _: 'message',\n pFlags: {\n is_outgoing: true\n },\n mid: 0,\n peerId: 0,\n media: {\n _: 'messageMediaDocument',\n document: doc\n }\n } as any\n });\n\n const promise = new Promise((resolve) => {\n const finish = () => {\n itemDiv.append(docDiv);\n resolve();\n };\n \n if(isPhoto) {\n const img = new Image();\n img.src = params.objectURL;\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n finish();\n };\n \n img.onerror = finish;\n } else {\n finish();\n }\n });\n\n return promise;\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const params: SendFileParams = {};\n params.file = file;\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(file, params, itemDiv) : this.attachDocument(file, params, itemDiv);\n willAttach.sendFileDetails.push(params);\n return promise;\n };\n \n private shouldCompress(mimeType: string) {\n return this.willAttach.type === 'media' && MEDIA_MIME_TYPES_SUPPORTED.has(mimeType);\n }\n\n private onRender() {\n // show now\n if(!this.element.classList.contains('active')) {\n this.listenerSetter.add(document.body)('keydown', this.onKeyDown);\n this.addEventListener('close', () => {\n if(this.wasInputValue) {\n this.chat.input.messageInputField.value = this.wasInputValue;\n }\n });\n this.show();\n }\n }\n\n private setTitle() {\n const {willAttach, title, files} = this;\n let key: LangPackKey;\n const args: FormatterArguments = [];\n if(willAttach.type === 'document') {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else {\n let foundPhotos = 0, foundVideos = 0, foundFiles = 0;\n files.forEach(file => {\n if(file.type.startsWith('image/')) ++foundPhotos;\n else if(file.type.startsWith('video/')) ++foundVideos;\n else ++foundFiles;\n });\n\n if([foundPhotos, foundVideos, foundFiles].filter(n => n > 0).length > 1) {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else \n \n /* const sum = foundPhotos + foundVideos;\n if(sum > 1 && willAttach.group) {\n key = 'PreviewSender.SendAlbum';\n const albumsLength = Math.ceil(sum / 10);\n args.push(albumsLength);\n } else */if(foundPhotos) {\n key = 'PreviewSender.SendPhoto';\n args.push(foundPhotos);\n } else if(foundVideos) {\n key = 'PreviewSender.SendVideo';\n args.push(foundVideos);\n }\n }\n\n replaceContent(title, i18n(key, args));\n }\n\n private appendMediaToContainer(div: HTMLElement, params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, 380, 320);\n div.style.width = size.width + 'px';\n div.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(div);\n }\n\n private iterate(cb: (sendFileDetails: SendFileParams[]) => void) {\n const {sendFileDetails} = this.willAttach;\n if(!this.willAttach.group) {\n sendFileDetails.forEach(p => cb([p]));\n return;\n }\n\n const length = sendFileDetails.length;\n for(let i = 0; i < length;) {\n const firstType = sendFileDetails[i].file.type;\n let k = 0;\n for(; k < 10 && i < length; ++i, ++k) {\n const type = sendFileDetails[i].file.type;\n if(this.shouldCompress(firstType) !== this.shouldCompress(type)) {\n break;\n }\n }\n\n cb(sendFileDetails.slice(i - k, i));\n }\n }\n\n private attachFiles() {\n const {files, willAttach, mediaContainer} = this;\n willAttach.sendFileDetails.length = 0;\n\n this.appendGroupCheckboxField();\n this.appendMediaCheckboxField();\n\n Promise.all(files.map(this.attachFile)).then(() => {\n mediaContainer.innerHTML = '';\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n if(this.shouldCompress(sendFileDetails[0].file.type) && sendFileDetails.length > 1) {\n const albumContainer = document.createElement('div');\n albumContainer.classList.add('popup-item-album', 'popup-item');\n albumContainer.append(...sendFileDetails.map(s => s.itemDiv));\n\n prepareAlbum({\n container: albumContainer,\n items: sendFileDetails.map(o => ({w: o.width, h: o.height})),\n maxWidth: 380,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params.itemDiv, params);\n });\n }\n });\n }).then(() => {\n this.onRender();\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport fastSmoothScroll from \"../fastSmoothScroll\";\r\nimport { cancelEvent } from \"./cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"./clickEvent\";\r\nimport findUpAsChild from \"./findUpAsChild\";\r\nimport findUpClassName from \"./findUpClassName\";\r\n\r\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\r\nconst HANDLE_EVENT = 'keydown';\r\nconst ACTIVE_CLASS_NAME = 'active';\r\n\r\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\r\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\r\n\r\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: {\r\n list: HTMLElement, \r\n type: 'xy' | 'x' | 'y',\r\n onSelect: (target: Element) => void | boolean,\r\n once: boolean,\r\n waitForKey?: string\r\n}) {\r\n 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(scrollable, target as HTMLElement, 'center', undefined, undefined, undefined, 100, type === 'x' ? 'x' : 'y');\r\n }\r\n };\r\n\r\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\r\n let nextTarget: Element;\r\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\r\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\r\n\r\n return nextTarget;\r\n };\r\n\r\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\r\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\r\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\r\n const currentRect = currentTarget.getBoundingClientRect();\r\n\r\n let nextTarget = currentTarget[property] || list[endProperty];\r\n while(nextTarget !== currentTarget) {\r\n const targetRect = nextTarget.getBoundingClientRect();\r\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\r\n break;\r\n }\r\n\r\n nextTarget = nextTarget[property] || list[endProperty];\r\n }\r\n\r\n return nextTarget;\r\n };\r\n\r\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\r\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\r\n handleArrowKey = (currentTarget, key) => {\r\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\r\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\r\n };\r\n } else { // flex-direction: row | column;\r\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\r\n }\r\n\r\n let onKeyDown = (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(!keyNames.has(key as any)) {\r\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\r\n cancelEvent(e);\r\n fireSelect(getCurrentTarget());\r\n }\r\n\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n\r\n if(list.childElementCount > 1) {\r\n let currentTarget = getCurrentTarget();\r\n currentTarget = handleArrowKey(currentTarget, key as any);\r\n setCurrentTarget(currentTarget, true);\r\n }\r\n };\r\n\r\n const scrollable = findUpClassName(list, 'scrollable');\r\n list.classList.add('navigable-list');\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n };\r\n\r\n const onClick = (e: Event) => {\r\n cancelEvent(e); // cancel keyboard closening\r\n\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n fireSelect(getCurrentTarget());\r\n };\r\n\r\n const fireSelect = (target: Element) => {\r\n const canContinue = onSelect(target);\r\n if(canContinue !== undefined ? !canContinue : once) {\r\n detach();\r\n }\r\n };\r\n\r\n const detach = () => {\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(waitForKey) return;\r\n setCurrentTarget(list.firstElementChild, false);\r\n };\r\n\r\n if(waitForKey) {\r\n const _onKeyDown = onKeyDown;\r\n onKeyDown = (e) => {\r\n if(e.key === waitForKey) {\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 waitForKey = undefined;\r\n resetTarget();\r\n }\r\n };\r\n } else {\r\n resetTarget();\r\n }\r\n\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 return {\r\n detach,\r\n resetTarget\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport attachListNavigation from \"../../helpers/dom/attachListNavigation\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { safeAssign } from \"../../helpers/object\";\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\n\r\nexport default class AutocompleteHelper extends EventListenerBase<{\r\n hidden: () => void,\r\n visible: () => 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 detach: () => void;\r\n protected init?(): void;\r\n\r\n protected controller: AutocompleteHelperController;\r\n protected listType: 'xy' | 'x' | 'y';\r\n protected onSelect: (target: Element) => boolean | void;\r\n protected waitForKey?: string;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n constructor(options: {\r\n appendTo: HTMLElement,\r\n controller: AutocompleteHelper['controller'],\r\n listType: AutocompleteHelper['listType'],\r\n onSelect: AutocompleteHelper['onSelect'],\r\n waitForKey?: AutocompleteHelper['waitForKey']\r\n }) {\r\n super(false);\r\n\r\n safeAssign(this, options);\r\n \r\n this.container = document.createElement('div');\r\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\r\n \r\n options.appendTo.append(this.container);\r\n \r\n this.attachNavigation();\r\n\r\n this.controller.addHelper(this);\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 {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.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.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) {\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.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) {\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 SetTransition(this.container, 'is-visible', !hide, rootScope.settings.animationsEnabled ? 200 : 0, () => {\r\n this.hidden && this.dispatchEvent('hidden');\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class StickersHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private onChangeScreen: () => void;\r\n\r\n constructor(appendTo: HTMLElement, controller: AutocompleteHelperController) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n onSelect: (target) => {\r\n return !EmoticonsDropdown.onMediaClick({target}, true);\r\n }, \r\n waitForKey: 'ArrowUp'\r\n });\r\n\r\n this.container.classList.add('stickers-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n\r\n rootScope.dispatchEvent('choosing_sticker', true);\r\n });\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n\r\n rootScope.dispatchEvent('choosing_sticker', false);\r\n });\r\n }\r\n\r\n public checkEmoticon(emoticon: string) {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n appStickersManager.preloadAnimatedEmojiSticker(emoticon);\r\n appStickersManager.getStickersByEmoticon(emoticon)\r\n .then((stickers) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const container = this.list.cloneNode() as HTMLElement;\r\n\r\n let ready: Promise;\r\n\r\n this.lazyLoadQueue.clear();\r\n if(stickers.length) {\r\n ready = new Promise((resolve) => {\r\n const promises: Promise[] = [];\r\n stickers.forEach(sticker => {\r\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\r\n });\r\n\r\n (Promise.all(promises) as Promise).finally(resolve);\r\n });\r\n } else {\r\n ready = Promise.resolve();\r\n }\r\n\r\n ready.then(() => {\r\n this.list.replaceWith(container);\r\n this.list = container;\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n\r\n this.toggle(!stickers.length);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, CHAT_ANIMATION_GROUP);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport Button from \"../button\";\r\nimport PopupDatePicker from \"./datePicker\";\r\n\r\nconst getMinDate = () => {\r\n const date = new Date();\r\n //date.setDate(date.getDate() - 1);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n};\r\n\r\nconst getMaxDate = () => {\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() + 1);\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n};\r\n\r\nconst checkDate = (date: Date) => {\r\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\r\n};\r\n\r\nexport default class PopupSchedule extends PopupDatePicker {\r\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\r\n super(checkDate(initDate), onPick, {\r\n noButtons: true,\r\n noTitle: true,\r\n closable: true,\r\n withConfirm: true,\r\n minDate: getMinDate(),\r\n maxDate: getMaxDate(),\r\n withTime: true,\r\n showOverflowMonths: true,\r\n confirmShortcutIsSendShortcut: true\r\n });\r\n\r\n this.element.classList.add('popup-schedule');\r\n this.header.append(this.controlsDiv);\r\n this.title.replaceWith(this.monthTitle);\r\n this.body.append(this.btnConfirm);\r\n\r\n if(canSendWhenOnline) {\r\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\r\n this.body.append(btnSendWhenOnline);\r\n\r\n attachClickEvent(btnSendWhenOnline, () => {\r\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\r\n this.hide();\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValueWithCaret(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const sel = window.getSelection();\r\n let selNode: Node;\r\n let selOffset: number;\r\n if(sel && sel.rangeCount) {\r\n const range = sel.getRangeAt(0);\r\n const startOffset = range.startOffset;\r\n if(\r\n range.startContainer &&\r\n range.startContainer == range.endContainer &&\r\n startOffset == range.endOffset\r\n ) {\r\n // * if focused on img, or caret has been set via placeCaretAtEnd\r\n const possibleChildrenFocusOffset = startOffset - 1;\r\n const childNodes = field.childNodes;\r\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\r\n selNode = childNodes[possibleChildrenFocusOffset];\r\n selOffset = 0;\r\n\r\n for(let i = 0; i < range.endOffset; ++i) {\r\n const node = childNodes[i];\r\n const value = node.nodeValue || (node as HTMLImageElement).alt;\r\n\r\n if(value) {\r\n selOffset += value.length;\r\n }\r\n }\r\n } else {\r\n selNode = range.startContainer;\r\n selOffset = startOffset;\r\n }\r\n }\r\n }\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, selNode, selOffset, entities);\r\n\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n const caretPos = value.indexOf('\\x01');\r\n if(caretPos != -1) {\r\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\r\n }\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n return {value, entities, caretPos};\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatInput from \"./input\";\r\nimport type { AppEmojiManager } from \"../../lib/appManagers/appEmojiManager\";\r\nimport { appendEmoji, getEmojiFromElement } from \"../emoticonsDropdown/tabs/emoji\";\r\nimport { ScrollableX } from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class EmojiHelper extends AutocompleteHelper {\r\n private scrollable: ScrollableX;\r\n\r\n constructor(appendTo: HTMLElement, \r\n controller: AutocompleteHelperController, \r\n chatInput: ChatInput, \r\n private appEmojiManager: AppEmojiManager) {\r\n super({\r\n appendTo,\r\n controller, \r\n listType: 'x', \r\n onSelect: (target) => {\r\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\r\n }\r\n });\r\n\r\n this.container.classList.add('emoji-helper');\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new ScrollableX(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollLeft = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(emojis: string[], waitForKey: boolean) {\r\n if(this.init) {\r\n if(!emojis.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n \r\n emojis = emojis.slice(0, 80);\r\n\r\n if(emojis.length) {\r\n this.list.innerHTML = '';\r\n emojis.forEach(emoji => {\r\n appendEmoji(emoji, this.list, false, true);\r\n });\r\n }\r\n\r\n this.waitForKey = waitForKey ? 'ArrowUp' : undefined;\r\n this.toggle(!emojis.length);\r\n\r\n /* window.requestAnimationFrame(() => {\r\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\r\n }); */\r\n }\r\n\r\n public checkQuery(query: string, firstChar: string) {\r\n const middleware = this.controller.getMiddleware();\r\n this.appEmojiManager.getBothEmojiKeywords().then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const q = query.replace(/^:/, '');\r\n const emojis = this.appEmojiManager.searchEmojis(q);\r\n this.render(emojis, firstChar !== ':');\r\n //console.log(emojis);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport AvatarElement from \"../avatar\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\r\n protected static BASE_CLASS = 'autocomplete-peer-helper';\r\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\r\n private scrollable: Scrollable;\r\n\r\n constructor(appendTo: HTMLElement, controller: AutocompleteHelperController, protected className: string, onSelect: (target: Element) => boolean | void) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'y', \r\n onSelect\r\n });\r\n\r\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list');\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}[]) {\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 this.toggle(!data.length);\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.setAttribute('dialog', '0');\r\n avatar.setAttribute('peer', '' + options.peerId);\r\n \r\n const name = document.createElement('div');\r\n name.classList.add(BASE + '-name', options.className + '-name');\r\n if(!options.name) {\r\n name.append(new PeerTitle({\r\n peerId: options.peerId,\r\n dialog: false,\r\n onlyFirstName: false,\r\n plainText: false\r\n }).element);\r\n } else {\r\n name.innerHTML = RichTextProcessor.wrapEmojiText(options.name);\r\n }\r\n \r\n div.append(avatar, name);\r\n\r\n if(options.description) {\r\n const description = document.createElement('div');\r\n description.classList.add(BASE + '-description', options.className + '-description');\r\n description.innerHTML = RichTextProcessor.wrapEmojiText(options.description);\r\n div.append(description);\r\n }\r\n \r\n return div;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from \"./input\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { BotInfo } from \"../../layer\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\nimport SearchIndex from \"../../lib/searchIndex\";\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager) {\n super(appendTo, \n controller,\n 'commands-helper',\n (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n });\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId) {\n if(!this.appUsersManager.isBot(peerId)) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n this.appProfileManager.getProfileByPeerId(peerId).then(full => {\n if(!middleware()) {\n return;\n }\n\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n const index = new SearchIndex({\n ignoreCase: true\n });\n \n const commands: Map = new Map();\n botInfos.forEach(botInfo => {\n botInfo.commands.forEach(botCommand => {\n const c = '/' + botCommand.command;\n commands.set(botCommand.command, {\n peerId: botInfo.user_id.toPeerId(false), \n name: c, \n description: botCommand.description\n });\n\n index.indexObject(botCommand.command, c);\n });\n });\n\n const found = index.search(query);\n const filtered = Array.from(found).map(command => commands.get(command));\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 getMiddleware() {\r\n this.middleware.clean();\r\n return this.middleware.get();\r\n }\r\n\r\n public addHelper(helper: AutocompleteHelper) {\r\n this.helpers.add(helper);\r\n }\r\n\r\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\r\n this.helpers.forEach(helper => {\r\n if(helper !== preserveHelper) {\r\n helper.toggle(true, true);\r\n }\r\n });\r\n\r\n if(!preserveHelper) {\r\n this.middleware.clean();\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from \"./input\";\nimport type { MessageEntity } from \"../../layer\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager) {\n super(appendTo, \n controller,\n 'mentions-helper',\n (target) => {\n const user = appUsersManager.getUser((target as HTMLElement).dataset.peerId.toUserId());\n let str = '', entity: MessageEntity;\n if(user.username) {\n str = '@' + user.username;\n } else {\n str = user.first_name || user.last_name;\n entity = {\n _: 'messageEntityMentionName',\n length: str.length,\n offset: 0,\n user_id: user.id\n };\n }\n\n str += ' ';\n chatInput.insertAtCaret(str, entity);\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId, topMsgId: number) {\n const trimmed = query.trim(); // check that there is no whitespace\n if(query.length !== trimmed.length) return false;\n\n const middleware = this.controller.getMiddleware();\n this.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(peerIds => {\n if(!middleware()) return;\n \n const username = trimmed.slice(1).toLowerCase();\n this.render(peerIds.map(peerId => {\n const user = this.appUsersManager.getUser(peerId);\n if(user.username && user.username.toLowerCase() === username) { // hide full matched suggestion\n return;\n }\n\n return {\n peerId,\n description: user.username ? '@' + user.username : undefined\n };\n }).filter(Boolean));\n });\n\n return true;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type ChatInput from \"./input\";\r\nimport DropdownHover from \"../../helpers/dropdownHover\";\r\nimport { ReplyMarkup } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { safeAssign } from \"../../helpers/object\";\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\n\r\nexport default class ReplyKeyboard extends DropdownHover {\r\n private static BASE_CLASS = 'reply-keyboard';\r\n private appendTo: HTMLElement;\r\n private listenerSetter: ListenerSetter;\r\n private appMessagesManager: AppMessagesManager;\r\n private btnHover: HTMLElement;\r\n private peerId: PeerId;\r\n private touchListener: Listener;\r\n private chatInput: ChatInput;\r\n\r\n constructor(options: {\r\n listenerSetter: ListenerSetter,\r\n appMessagesManager: AppMessagesManager,\r\n appendTo: HTMLElement,\r\n btnHover: HTMLElement,\r\n chatInput: ChatInput\r\n }) {\r\n super({\r\n element: document.createElement('div')\r\n });\r\n\r\n safeAssign(this, options);\r\n\r\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\r\n this.element.style.display = 'none';\r\n\r\n this.attachButtonListener(this.btnHover, this.listenerSetter);\r\n this.listenerSetter.add(rootScope)('history_reply_markup', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n if(this.checkAvailability() && this.isActive()) {\r\n this.render();\r\n }\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.checkForceReply();\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected init() {\r\n this.appendTo.append(this.element);\r\n\r\n this.listenerSetter.add(this)('open', () => {\r\n this.render();\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\r\n this.listenerSetter.add(this)('close', () => {\r\n this.listenerSetter.remove(this.touchListener);\r\n }, {once: true});\r\n }\r\n });\r\n \r\n this.listenerSetter.add(this.element)('click', (e) => {\r\n const target = findUpClassName(e.target, 'btn');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n this.appMessagesManager.sendText(this.peerId, target.dataset.text);\r\n this.toggle(false);\r\n });\r\n\r\n return super.init();\r\n }\r\n\r\n private onBodyTouchStart = (e: TouchEvent) => {\r\n const target = e.touches[0].target as HTMLElement;\r\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\r\n cancelEvent(e);\r\n this.toggle(false);\r\n }\r\n };\r\n\r\n public checkForceReply() {\r\n const replyMarkup = this.getReplyMarkup();\r\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\r\n !replyMarkup.pFlags.hidden && \r\n !replyMarkup.pFlags.used) {\r\n replyMarkup.pFlags.used = true;\r\n this.chatInput.initMessageReply(replyMarkup.mid);\r\n }\r\n }\r\n\r\n private getReplyMarkup(): ReplyMarkup {\r\n return this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup ?? {\r\n _: 'replyKeyboardHide'\r\n };\r\n }\r\n\r\n public render(replyMarkup: ReplyMarkup.replyKeyboardMarkup = this.getReplyMarkup() as any) {\r\n this.element.innerHTML = '';\r\n\r\n for(const row of replyMarkup.rows) {\r\n const div = document.createElement('div');\r\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\r\n\r\n for(const button of row.buttons) {\r\n const btn = document.createElement('button');\r\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\r\n btn.innerHTML = RichTextProcessor.wrapEmojiText(button.text);\r\n btn.dataset.text = button.text;\r\n div.append(btn);\r\n }\r\n\r\n this.element.append(div);\r\n }\r\n }\r\n\r\n public checkAvailability(replyMarkup: ReplyMarkup = this.getReplyMarkup()) {\r\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\r\n this.btnHover.classList.toggle('hide', hide);\r\n\r\n if(hide) {\r\n this.toggle(false);\r\n }\r\n\r\n return !hide;\r\n }\r\n\r\n public setPeer(peerId: PeerId) {\r\n this.peerId = peerId;\r\n\r\n this.checkAvailability();\r\n this.checkForceReply();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\r\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\r\nimport type Chat from \"./chat\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { WebDocument } from \"../../layer\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { renderImageWithFadeIn, wrapPhoto } from \"../wrappers\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport Button from \"../button\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { MyPhoto } from \"../../lib/appManagers/appPhotosManager\";\r\nimport { readBlobAsDataURL } from \"../../helpers/blob\";\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\n\r\nconst ANIMATION_GROUP = 'INLINE-HELPER';\r\n// const GRID_ITEMS = 5;\r\n\r\nexport default class InlineHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private gifsMasonry: GifsMasonry;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private onChangeScreen: () => void;\r\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\r\n\r\n constructor(appendTo: HTMLElement, \r\n controller: AutocompleteHelperController,\r\n private chat: Chat,\r\n private appUsersManager: AppUsersManager,\r\n private appInlineBotsManager: AppInlineBotsManager) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n onSelect: (target) => {\r\n const {peerId, botId, queryId} = this.list.dataset;\r\n return this.chat.input.getReadyToSend(() => {\r\n const queryAndResultIds = this.appInlineBotsManager.generateQId(queryId, (target as HTMLElement).dataset.resultId);\r\n this.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\r\n clearDraft: true,\r\n scheduleDate: this.chat.input.scheduleDate,\r\n silent: this.chat.input.sendSilent,\r\n replyToMsgId: this.chat.input.replyToMsgId\r\n });\r\n\r\n this.chat.input.onMessageSent(true, true);\r\n });\r\n }\r\n });\r\n\r\n this.container.classList.add('inline-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0); \r\n });\r\n\r\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n });\r\n }\r\n\r\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n const peer = await this.appUsersManager.resolveUsername(username);\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(peer._ !== 'user') {\r\n throw 'NOT_A_BOT';\r\n }\r\n\r\n const renderPromise = this.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then(botResults => {\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const list = this.list.cloneNode() as HTMLElement;\r\n list.dataset.peerId = '' + peerId;\r\n list.dataset.botId = '' + peer.id;\r\n list.dataset.queryId = '' + botResults.query_id;\r\n\r\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\r\n\r\n this.lazyLoadQueue.clear();\r\n this.superStickerRenderer.clear();\r\n \r\n const loadPromises: Promise[] = [];\r\n const isGallery = !!botResults.pFlags.gallery;\r\n // botResults.results.length = 3;\r\n for(const item of botResults.results) {\r\n const container = document.createElement('div');\r\n container.classList.add('inline-helper-result');\r\n container.dataset.resultId = item.id;\r\n \r\n const preview = isGallery ? undefined : document.createElement('div');\r\n if(preview) {\r\n preview.classList.add('inline-helper-result-preview');\r\n\r\n container.append(preview);\r\n }\r\n\r\n list.append(container);\r\n\r\n if(!isGallery) {\r\n preview.classList.add('empty');\r\n preview.innerHTML = RichTextProcessor.wrapEmojiText([...item.title.trim()][0]);\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('inline-helper-result-title');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(item.title);\r\n \r\n const description = document.createElement('div');\r\n description.classList.add('inline-helper-result-description');\r\n description.innerHTML = RichTextProcessor.wrapRichText(item.description, {\r\n noCommands: true,\r\n noLinks: true\r\n });\r\n \r\n container.append(title, description);\r\n \r\n const separator = document.createElement('div');\r\n separator.classList.add('inline-helper-separator');\r\n \r\n list.append(separator);\r\n } else {\r\n container.classList.add('grid-item');\r\n }\r\n \r\n if(item._ === 'botInlineResult') {\r\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\r\n let mediaContainer: HTMLElement;\r\n if(preview) {\r\n mediaContainer = document.createElement('div');\r\n preview.append(mediaContainer);\r\n } else {\r\n mediaContainer = container;\r\n }\r\n\r\n mediaContainer.classList.add('media-container'); \r\n isGallery && mediaContainer.classList.add('no-border-radius');\r\n\r\n this.lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n return appDownloadManager.download({\r\n dcId: 4,\r\n location: {\r\n _: 'inputWebFileLocation',\r\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\r\n url: item.thumb.url\r\n },\r\n size: item.thumb.size,\r\n mimeType: item.thumb.mime_type\r\n }).then(blob => {\r\n const image = new Image();\r\n image.classList.add('media-photo');\r\n readBlobAsDataURL(blob).then(dataURL => {\r\n renderImageWithFadeIn(mediaContainer, image, dataURL, true);\r\n });\r\n });\r\n }\r\n });\r\n }\r\n } else {\r\n const media = item.document as MyDocument || item.photo as MyPhoto;\r\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\r\n assumeType(media);\r\n\r\n if(media.type === 'gif') {\r\n gifsMasonry.add(media, container);\r\n } else if(media.type === 'sticker') {\r\n container.classList.add('super-sticker');\r\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\r\n if(media.sticker === 2) {\r\n this.superStickerRenderer.observeAnimatedDiv(container);\r\n }\r\n }\r\n } else if(media) {\r\n const size = isGallery ? 48 : undefined;\r\n isGallery && container.classList.add('no-border-radius');\r\n wrapPhoto({\r\n photo: media,\r\n container: isGallery ? container : preview,\r\n boxWidth: size,\r\n boxHeight: size,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n }\r\n }\r\n }\r\n\r\n return Promise.all(loadPromises).then(() => {\r\n if(!middleware()) {\r\n gifsMasonry.clear();\r\n return;\r\n }\r\n\r\n list.classList.toggle('is-gallery', isGallery);\r\n list.classList.toggle('super-stickers', isGallery);\r\n this.container.classList.toggle('is-gallery', isGallery);\r\n\r\n /* if(isGallery) {\r\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\r\n }\r\n\r\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\r\n\r\n const parent = this.list.parentElement;\r\n parent.textContent = '';\r\n if(botResults.switch_pm) {\r\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\r\n btnSwitchToPM.insertAdjacentHTML('beforeend', RichTextProcessor.wrapEmojiText(botResults.switch_pm.text));\r\n attachClickEvent(btnSwitchToPM, (e) => {\r\n this.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\r\n });\r\n parent.append(btnSwitchToPM);\r\n }\r\n parent.append(this.list = list);\r\n\r\n if(this.gifsMasonry) {\r\n this.gifsMasonry.detach();\r\n }\r\n this.gifsMasonry = gifsMasonry;\r\n gifsMasonry.attach();\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n if(this.list.classList.contains('is-gallery')) {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n } else {\r\n this.list.style.width = '';\r\n }\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n \r\n this.toggle(!botResults.results.length && !botResults.switch_pm);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n\r\n return {user: peer, renderPromise};\r\n };\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('inline-helper-results');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppNotificationsManager } from '../../lib/appManagers/appNotificationsManager';\r\nimport type { AppChatsManager } from '../../lib/appManagers/appChatsManager';\r\nimport type { AppDocsManager, MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from '../../lib/appManagers/appPeersManager';\r\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\r\nimport type { AppImManager } from '../../lib/appManagers/appImManager';\r\nimport type { AppDraftsManager, MyDraftMessage } from '../../lib/appManagers/appDraftsManager';\r\nimport type { AppEmojiManager } from '../../lib/appManagers/appEmojiManager';\r\nimport type { ServerTimeManager } from '../../lib/mtproto/serverTimeManager';\r\nimport type { AppUsersManager } from '../../lib/appManagers/appUsersManager';\r\nimport type { AppInlineBotsManager } from '../../lib/appManagers/appInlineBotsManager';\r\nimport type { AppMessagesIdsManager } from '../../lib/appManagers/appMessagesIdsManager';\r\nimport type Chat from './chat';\r\nimport Recorder from '../../../public/recorder.min';\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport apiManager from \"../../lib/mtproto/mtprotoworker\";\r\n//import Recorder from '../opus-recorder/dist/recorder.min';\r\nimport opusDecodeController from \"../../lib/opusDecodeController\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from '../buttonMenu';\r\nimport emoticonsDropdown from \"../emoticonsDropdown\";\r\nimport PopupCreatePoll from \"../popups/createPoll\";\r\nimport PopupForward from '../popups/forward';\r\nimport PopupNewMedia from '../popups/newMedia';\r\nimport { toast } from \"../toast\";\r\nimport { wrapReply } from \"../wrappers\";\r\nimport InputField from '../inputField';\r\nimport { MessageEntity, DraftMessage, WebPage, Message } from '../../layer';\r\nimport StickersHelper from './stickersHelper';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport ButtonMenuToggle from '../buttonMenuToggle';\r\nimport ListenerSetter, { Listener } from '../../helpers/listenerSetter';\r\nimport Button from '../button';\r\nimport PopupSchedule from '../popups/schedule';\r\nimport SendMenu from './sendContextMenu';\r\nimport rootScope from '../../lib/rootScope';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport { tsNow } from '../../helpers/date';\r\nimport appNavigationController, { NavigationItem } from '../appNavigationController';\r\nimport { IS_MOBILE, IS_MOBILE_SAFARI } from '../../environment/userAgent';\r\nimport I18n, { i18n, join, LangPackKey } from '../../lib/langPack';\r\nimport { generateTail } from './bubbles';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport ButtonCorner from '../buttonCorner';\r\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\r\nimport { cancelEvent } from '../../helpers/dom/cancelEvent';\r\nimport cancelSelection from '../../helpers/dom/cancelSelection';\r\nimport { attachClickEvent, simulateClickEvent } from '../../helpers/dom/clickEvent';\r\nimport getRichValue from '../../helpers/dom/getRichValue';\r\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\r\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\r\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\r\nimport { MarkdownType, markdownTags } from '../../helpers/dom/getRichElementValue';\r\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\r\nimport EmojiHelper from './emojiHelper';\r\nimport CommandsHelper from './commandsHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport MentionsHelper from './mentionsHelper';\r\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\r\nimport { emojiFromCodePoints } from '../../vendor/emoji';\r\nimport ReplyKeyboard from './replyKeyboard';\r\nimport InlineHelper from './inlineHelper';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport noop from '../../helpers/noop';\r\nimport { openBtnMenu, putPreloader } from '../misc';\r\nimport SetTransition from '../singleTransition';\r\nimport PeerTitle from '../peerTitle';\r\nimport { fastRaf } from '../../helpers/schedulers';\r\nimport PopupDeleteMessages from '../popups/deleteMessages';\r\nimport fixSafariStickyInputFocusing, { IS_STICKY_INPUT_BUGGED } from '../../helpers/dom/fixSafariStickyInputFocusing';\r\nimport { copy } from '../../helpers/object';\r\nimport PopupPeer from '../popups/peer';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\r\nimport appMediaPlaybackController from '../appMediaPlaybackController';\r\nimport { 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\n\r\nconst RECORD_MIN_TIME = 500;\r\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\r\n\r\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\r\n\r\nexport default class ChatInput {\r\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\r\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\r\n public messageInput: HTMLElement;\r\n public messageInputField: InputField;\r\n private fileInput: HTMLInputElement;\r\n private inputMessageContainer: HTMLDivElement;\r\n private btnSend: HTMLButtonElement;\r\n private btnCancelRecord: HTMLButtonElement;\r\n private lastUrl = '';\r\n private lastTimeType = 0;\r\n\r\n public chatInput: HTMLElement;\r\n private 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: HTMLButtonElement;\r\n private attachMenuButtons: (ButtonMenuItemOptions & {verify: (peerId: PeerId, threadId: number) => boolean})[];\r\n\r\n private sendMenu: SendMenu;\r\n\r\n private replyElements: {\r\n container: HTMLElement,\r\n cancelBtn: HTMLButtonElement,\r\n iconBtn: HTMLButtonElement\r\n } = {} as any;\r\n\r\n private forwardElements: {\r\n changePeer: ButtonMenuItemOptions,\r\n showSender: ButtonMenuItemOptions,\r\n hideSender: ButtonMenuItemOptions,\r\n showCaption: ButtonMenuItemOptions,\r\n hideCaption: ButtonMenuItemOptions,\r\n container: HTMLElement,\r\n modifyArgs?: ButtonMenuItemOptions[]\r\n }; \r\n private forwardHover: DropdownHover;\r\n private forwardWasDroppingAuthor: boolean;\r\n\r\n private getWebPagePromise: Promise;\r\n private willSendWebPage: WebPage = null;\r\n private forwarding: {[fromPeerId: PeerId]: number[]};\r\n public replyToMsgId: number;\r\n public editMsgId: number;\r\n public editMessage: Message.message;\r\n private noWebPage: true;\r\n public scheduleDate: number;\r\n public sendSilent: true;\r\n\r\n private recorder: any;\r\n public recording = false;\r\n private recordCanceled = false;\r\n private recordTimeEl: HTMLElement;\r\n private recordRippleEl: HTMLElement;\r\n private recordStartTime = 0;\r\n private recordingOverlayListener: Listener;\r\n private recordingNavigationItem: NavigationItem;\r\n\r\n // private scrollTop = 0;\r\n // private scrollOffsetTop = 0;\r\n // private scrollDiff = 0;\r\n\r\n public helperType: Exclude;\r\n private helperFunc: () => void;\r\n private helperWaitingForward: boolean;\r\n\r\n public willAttachType: 'document' | 'media';\r\n\r\n private lockRedo = false;\r\n private canRedoFromHTML = '';\r\n private readonly undoHistory: string[] = [];\r\n private readonly executedHistory: string[] = [];\r\n private canUndoFromHTML = '';\r\n\r\n private autocompleteHelperController: AutocompleteHelperController;\r\n private stickersHelper: StickersHelper;\r\n private emojiHelper: EmojiHelper;\r\n private commandsHelper: CommandsHelper;\r\n private mentionsHelper: MentionsHelper;\r\n private inlineHelper: InlineHelper;\r\n private listenerSetter: ListenerSetter;\r\n\r\n private pinnedControlBtn: HTMLButtonElement;\r\n\r\n private goDownBtn: HTMLButtonElement;\r\n private goDownUnreadBadge: HTMLElement;\r\n private goMentionBtn: HTMLButtonElement;\r\n private goMentionUnreadBadge: HTMLSpanElement;\r\n private btnScheduled: HTMLButtonElement;\r\n\r\n private btnPreloader: HTMLButtonElement;\r\n\r\n private saveDraftDebounced: () => void;\r\n\r\n private fakeRowsWrapper: HTMLDivElement;\r\n private fakePinnedControlBtn: HTMLElement;\r\n\r\n private previousQuery: string;\r\n \r\n private releaseMediaPlayback: () => void;\r\n\r\n constructor(private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appMessagesIdsManager: AppMessagesIdsManager, \r\n private appDocsManager: AppDocsManager, \r\n private appChatsManager: AppChatsManager, \r\n private appPeersManager: AppPeersManager, \r\n private appWebPagesManager: AppWebPagesManager, \r\n private appImManager: AppImManager, \r\n private appDraftsManager: AppDraftsManager, \r\n private serverTimeManager: ServerTimeManager, \r\n private appNotificationsManager: AppNotificationsManager,\r\n private appEmojiManager: AppEmojiManager,\r\n private appUsersManager: AppUsersManager,\r\n private appInlineBotsManager: AppInlineBotsManager\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public construct() {\r\n this.chatInput = document.createElement('div');\r\n this.chatInput.classList.add('chat-input');\r\n this.chatInput.style.display = 'none';\r\n\r\n this.inputContainer = document.createElement('div');\r\n this.inputContainer.classList.add('chat-input-container');\r\n\r\n this.rowsWrapper = document.createElement('div');\r\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\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 = document.createElement('div');\r\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\r\n\r\n this.inputContainer.append(this.rowsWrapper, fakeRowsWrapper, fakeSelectionWrapper);\r\n this.chatInput.append(this.inputContainer);\r\n\r\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button bubbles-go-down hide'});\r\n this.inputContainer.append(this.goDownBtn);\r\n\r\n attachClickEvent(this.goDownBtn, (e) => {\r\n cancelEvent(e);\r\n this.chat.bubbles.onGoDownClick();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n // * constructor end\r\n\r\n /* let setScrollTopTimeout: number;\r\n // @ts-ignore\r\n let height = window.visualViewport.height; */\r\n // @ts-ignore\r\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n // const wasScrolledDown = scrollable.isScrolledDown;\r\n \r\n // /* if(wasScrolledDown) {\r\n // this.saveScroll();\r\n // } */\r\n \r\n // // @ts-ignore\r\n // let newHeight = window.visualViewport.height;\r\n // const diff = height - newHeight;\r\n // const scrollTop = scrollable.scrollTop;\r\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n\r\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n // setScrollTopTimeout = window.setTimeout(() => {\r\n // const diff = height - newHeight;\r\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\r\n // height = newHeight;\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n \r\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n\r\n // /* if(isScrolledDown) {\r\n // scrollable.scrollTop = scrollable.scrollHeight;\r\n // } */\r\n\r\n // //scrollable.scrollTop += diff;\r\n // setScrollTopTimeout = 0;\r\n // }, 0);\r\n // });\r\n\r\n // ! Can't use it with resizeObserver\r\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n const scrollable = this.chat.bubbles.scrollable;\r\n const wasScrolledDown = scrollable.isScrolledDown;\r\n\r\n // @ts-ignore\r\n let newHeight = window.visualViewport.height;\r\n const diff = height - newHeight;\r\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n scrollable.scrollTop = needScrollTop;\r\n height = newHeight;\r\n\r\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\r\n scrollable.scrollTop = needScrollTop;\r\n \r\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n setScrollTopTimeout = 0;\r\n }, 0);\r\n }); */\r\n }\r\n\r\n public constructPeerHelpers() {\r\n this.replyElements.container = document.createElement('div');\r\n this.replyElements.container.classList.add('reply-wrapper');\r\n\r\n this.replyElements.iconBtn = ButtonIcon('');\r\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\r\n\r\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\r\n\r\n //\r\n\r\n const onHideAuthorClick = () => {\r\n isChangingAuthor = true;\r\n return this.canToggleHideAuthor();\r\n };\r\n\r\n const onHideCaptionClick = () => {\r\n isChangingAuthor = false;\r\n };\r\n\r\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\r\n let isChangingAuthor = false;\r\n const forwardButtons: ButtonMenuItemOptions[] = [\r\n forwardElements.showSender = {\r\n text: 'Chat.Alert.Forward.Action.Show1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideSender = {\r\n text: 'Chat.Alert.Forward.Action.Hide1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.showCaption = {\r\n text: 'Chat.Alert.Forward.Action.ShowCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideCaption = {\r\n text: 'Chat.Alert.Forward.Action.HideCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.changePeer = {\r\n text: 'Chat.Alert.Forward.Action.Another',\r\n onClick: () => {\r\n this.changeForwardRecipient();\r\n },\r\n icon: 'replace'\r\n }\r\n ];\r\n const forwardBtnMenu = forwardElements.container = ButtonMenu(forwardButtons, this.listenerSetter);\r\n // forwardBtnMenu.classList.add('top-center');\r\n\r\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\r\n const groups: {\r\n elements: HTMLElement[],\r\n onChange: (value: string, event: Event) => void\r\n }[] = [{\r\n elements: children.slice(0, 2),\r\n onChange: (value, e) => {\r\n const checked = !!+value;\r\n if(isChangingAuthor) {\r\n this.forwardWasDroppingAuthor = !checked;\r\n }\r\n\r\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\r\n if(replyTitle) {\r\n const el = replyTitle.firstElementChild as HTMLElement;\r\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\r\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n i.key = langPackKey;\r\n i.update();\r\n }\r\n }\r\n }, {\r\n elements: children.slice(2, 4),\r\n onChange: (value) => {\r\n const checked = !!+value;\r\n let b: ButtonMenuItemOptions;\r\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\r\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\r\n } else {\r\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\r\n }\r\n\r\n b.checkboxField.checked = true;\r\n }\r\n }];\r\n groups.forEach(group => {\r\n const container = RadioForm(group.elements.map(e => {\r\n return {\r\n container: e, \r\n input: e.querySelector('input')\r\n };\r\n }), group.onChange);\r\n\r\n const hr = document.createElement('hr');\r\n container.append(hr);\r\n forwardBtnMenu.append(container);\r\n });\r\n\r\n forwardBtnMenu.append(forwardElements.changePeer.element);\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const forwardHover = this.forwardHover = new DropdownHover({\r\n element: forwardBtnMenu\r\n });\r\n }\r\n\r\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\r\n this.replyElements.container.append(forwardBtnMenu);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const {input} = b.checkboxField;\r\n input.type = 'radio';\r\n input.name = idx < 2 ? 'author' : 'caption';\r\n input.value = '' + +!(idx % 2);\r\n });\r\n\r\n //\r\n\r\n this.newMessageWrapper = document.createElement('div');\r\n this.newMessageWrapper.classList.add('new-message-wrapper');\r\n\r\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\r\n\r\n this.inputMessageContainer = document.createElement('div');\r\n this.inputMessageContainer.classList.add('input-message-container');\r\n\r\n if(this.chat.type === 'chat') {\r\n this.goDownUnreadBadge = document.createElement('span');\r\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goDownBtn.append(this.goDownUnreadBadge);\r\n\r\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button bubbles-go-mention'});\r\n this.goMentionUnreadBadge = document.createElement('span');\r\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goMentionBtn.append(this.goMentionUnreadBadge);\r\n this.inputContainer.append(this.goMentionBtn);\r\n\r\n attachClickEvent(this.goMentionBtn, (e) => {\r\n cancelEvent(e);\r\n this.appMessagesManager.goToNextMention(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\r\n\r\n attachClickEvent(this.btnScheduled, (e) => {\r\n this.appImManager.openScheduled(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.btnScheduled.classList.remove('hide');\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.appMessagesManager.getScheduledMessages(this.chat.peerId).then(value => {\r\n this.btnScheduled.classList.toggle('hide', !value.length);\r\n });\r\n });\r\n\r\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\r\n this.replyKeyboard = new ReplyKeyboard({\r\n appendTo: this.rowsWrapper,\r\n listenerSetter: this.listenerSetter,\r\n appMessagesManager: this.appMessagesManager,\r\n btnHover: this.btnToggleReplyMarkup,\r\n chatInput: this\r\n });\r\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\r\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\r\n }\r\n\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: (peerId, threadId) => this.appMessagesManager.canSendToPeer(peerId, threadId, '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: (peerId, threadId) => this.appMessagesManager.canSendToPeer(peerId, threadId, 'send_media')\r\n }, {\r\n icon: 'poll',\r\n text: 'Poll',\r\n onClick: () => {\r\n new PopupCreatePoll(this.chat).show();\r\n },\r\n verify: (peerId, threadId) => peerId.isAnyChat() && this.appMessagesManager.canSendToPeer(peerId, threadId, '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.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\r\n\r\n this.rowsWrapper.append(this.replyElements.container);\r\n this.autocompleteHelperController = new AutocompleteHelperController();\r\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController);\r\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.appEmojiManager);\r\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.chat.appProfileManager, this.chat.appUsersManager);\r\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.chat.appProfileManager, this.chat.appUsersManager);\r\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.appUsersManager, this.appInlineBotsManager);\r\n this.rowsWrapper.append(this.newMessageWrapper);\r\n\r\n this.btnCancelRecord = ButtonIcon('delete danger btn-circle z-depth-1 btn-record-cancel');\r\n\r\n this.btnSendContainer = document.createElement('div');\r\n this.btnSendContainer.classList.add('btn-send-container');\r\n\r\n this.recordRippleEl = document.createElement('div');\r\n this.recordRippleEl.classList.add('record-ripple');\r\n\r\n this.btnSend = ButtonIcon('none btn-circle z-depth-1 btn-send animated-button-icon');\r\n this.btnSend.insertAdjacentHTML('afterbegin', `\r\n \r\n \r\n \r\n \r\n `);\r\n\r\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n this.sendMenu = new SendMenu({\r\n onSilentClick: () => {\r\n this.sendSilent = true;\r\n this.sendMessage();\r\n },\r\n onScheduleClick: () => {\r\n this.scheduleSending(undefined);\r\n },\r\n listenerSetter: this.listenerSetter,\r\n openSide: 'top-left',\r\n onContextElement: this.btnSend,\r\n onOpen: () => {\r\n return !this.isInputEmpty() || !!Object.keys(this.forwarding).length;\r\n }\r\n });\r\n \r\n this.btnSendContainer.append(this.sendMenu.sendMenu);\r\n }\r\n\r\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\r\n\r\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\r\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\r\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\r\n\r\n this.attachMessageInputField();\r\n\r\n /* this.attachMenu.addEventListener('mousedown', (e) => {\r\n const hidden = this.attachMenu.querySelectorAll('.hide');\r\n if(hidden.length === this.attachMenuButtons.length) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n cancelEvent(e);\r\n return false;\r\n }\r\n }, {passive: false, capture: true}); */\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', () => {\r\n if(this.stickersHelper || this.emojiHelper) {\r\n // this.previousQuery = undefined;\r\n this.previousQuery = '';\r\n this.checkAutocomplete();\r\n /* if(!rootScope.settings.stickers.suggest) {\r\n this.stickersHelper.checkEmoticon('');\r\n } else {\r\n this.onMessageInput();\r\n } */\r\n }\r\n\r\n if(this.messageInputField) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\r\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId) return;\r\n this.setDraft(draft, true, force);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_changing', (chat) => {\r\n if(this.chat === chat) {\r\n this.saveDraft();\r\n }\r\n });\r\n\r\n 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 });\r\n }\r\n\r\n try {\r\n this.recorder = new Recorder({\r\n //encoderBitRate: 32,\r\n //encoderPath: \"../dist/encoderWorker.min.js\",\r\n encoderSampleRate: 48000,\r\n monitorGain: 0,\r\n numberOfChannels: 1,\r\n recordingGain: 1,\r\n reuseWorker: true\r\n });\r\n } catch(err) {\r\n console.error('Recorder constructor error:', err);\r\n }\r\n\r\n this.updateSendBtn();\r\n\r\n this.listenerSetter.add(this.fileInput)('change', (e) => {\r\n let files = (e.target as HTMLInputElement & EventTarget).files;\r\n if(!files.length) {\r\n return;\r\n }\r\n \r\n new PopupNewMedia(this.chat, Array.from(files).slice(), this.willAttachType);\r\n this.fileInput.value = '';\r\n }, false);\r\n\r\n /* let time = Date.now();\r\n this.btnSend.addEventListener('touchstart', (e) => {\r\n time = Date.now();\r\n });\r\n\r\n let eventName1 = 'touchend';\r\n this.btnSend.addEventListener(eventName1, (e: Event) => {\r\n //cancelEvent(e);\r\n console.log(eventName1 + ', time: ' + (Date.now() - time));\r\n });\r\n\r\n let eventName = 'mousedown';\r\n this.btnSend.addEventListener(eventName, (e: Event) => {\r\n cancelEvent(e);\r\n console.log(eventName + ', time: ' + (Date.now() - time));\r\n }); */\r\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\r\n\r\n if(this.recorder) {\r\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.recorder.onstop = () => {\r\n this.recording = false;\r\n this.chatInput.classList.remove('is-recording', 'is-locked');\r\n this.updateSendBtn();\r\n this.recordRippleEl.style.transform = '';\r\n };\r\n \r\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\r\n if(this.releaseMediaPlayback) {\r\n this.releaseMediaPlayback();\r\n this.releaseMediaPlayback = undefined;\r\n }\r\n\r\n if(this.recordingOverlayListener) {\r\n this.listenerSetter.remove(this.recordingOverlayListener);\r\n this.recordingOverlayListener = undefined;\r\n }\r\n\r\n if(this.recordingNavigationItem) {\r\n appNavigationController.removeItem(this.recordingNavigationItem);\r\n this.recordingNavigationItem = undefined;\r\n }\r\n\r\n if(this.recordCanceled) {\r\n return;\r\n }\r\n\r\n const {peerId, threadId} = this.chat;\r\n const replyToMsgId = this.replyToMsgId;\r\n \r\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\r\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\r\n /* const fileName = new Date().toISOString() + \".opus\";\r\n console.log('Recorder data received', typedArray, dataBlob); */\r\n\r\n //let perf = performance.now();\r\n opusDecodeController.decode(typedArray, true).then(result => {\r\n //console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\r\n \r\n opusDecodeController.setKeepAlive(false);\r\n \r\n // тут objectURL ставится уже с audio/wav\r\n this.appMessagesManager.sendFile(peerId, dataBlob, {\r\n isVoiceMessage: true,\r\n isMedia: true,\r\n duration,\r\n waveform: result.waveform,\r\n objectURL: result.url,\r\n replyToMsgId,\r\n threadId,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, true);\r\n });\r\n };\r\n }\r\n\r\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\r\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n const container = document.createElement('div');\r\n container.classList.add('pinned-container');\r\n\r\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold pinned-container-button', {icon: 'unpin'});\r\n container.append(this.pinnedControlBtn);\r\n\r\n const fakeContainer = container.cloneNode(true);\r\n this.fakePinnedControlBtn = fakeContainer.firstChild as HTMLElement;\r\n this.fakeRowsWrapper.append(fakeContainer);\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(NULL_PEER_ID); // * 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.rowsWrapper.append(container);\r\n\r\n this.chatInput.classList.add('type-pinned');\r\n this.rowsWrapper.classList.add('is-centered');\r\n }\r\n\r\n private onCancelRecordClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n this.recordCanceled = true;\r\n this.recorder.stop();\r\n opusDecodeController.setKeepAlive(false);\r\n };\r\n\r\n private onEmoticonsOpen = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\r\n };\r\n\r\n private onEmoticonsClose = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\r\n };\r\n\r\n public getReadyToSend(callback: () => void) {\r\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\r\n }\r\n\r\n public scheduleSending = (callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\r\n const {peerId} = this.chat;\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && this.appUsersManager.isUserOnlineVisible(peerId);\r\n\r\n new PopupSchedule(initDate, (timestamp) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\r\n if(timestamp <= minTimestamp) {\r\n timestamp = undefined;\r\n }\r\n\r\n this.scheduleDate = timestamp;\r\n callback();\r\n\r\n if(this.chat.type !== 'scheduled' && timestamp) {\r\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.appImManager.openScheduled(peerId);\r\n }, 0);\r\n }\r\n }, canSendWhenOnline).show();\r\n };\r\n\r\n public setUnreadCount() {\r\n const dialog = this.appMessagesManager.getDialogOnly(this.chat.peerId);\r\n const count = dialog?.unread_count;\r\n this.goDownUnreadBadge.innerText = '' + (count || '');\r\n this.goDownUnreadBadge.classList.toggle('badge-gray', this.appNotificationsManager.isPeerLocalMuted(this.chat.peerId, true));\r\n\r\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\r\n const hasMentions = !!dialog?.unread_mentions_count;\r\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\r\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\r\n }\r\n }\r\n\r\n public saveDraft() {\r\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\r\n \r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n let draft: DraftMessage.draftMessage;\r\n if(value.length || this.replyToMsgId) {\r\n draft = {\r\n _: 'draftMessage',\r\n date: tsNow(true) + this.serverTimeManager.serverTimeOffset,\r\n message: value,\r\n entities: entities.length ? entities : undefined,\r\n pFlags: {\r\n no_webpage: this.noWebPage\r\n },\r\n reply_to_msg_id: this.replyToMsgId\r\n };\r\n }\r\n\r\n this.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Input destroying');\r\n\r\n this.listenerSetter.removeAll();\r\n }\r\n\r\n public cleanup(helperToo = true) {\r\n if(!this.chat.peerId) {\r\n this.chatInput.style.display = 'none';\r\n this.goDownBtn.classList.add('hide');\r\n }\r\n\r\n cancelSelection();\r\n\r\n this.lastTimeType = 0;\r\n\r\n if(this.messageInput) {\r\n this.clearInput();\r\n helperToo && this.clearHelper();\r\n }\r\n }\r\n\r\n public setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\r\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\r\n \r\n if(!draft) {\r\n draft = this.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\r\n\r\n if(!draft) {\r\n if(force) { // this situation can only happen when sending message with clearDraft\r\n /* const height = this.chatInput.getBoundingClientRect().height;\r\n const willChangeHeight = 78 - height;\r\n this.willChangeHeight = willChangeHeight; */\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n this.t();\r\n }\r\n\r\n this.messageInputField.inputFake.textContent = '';\r\n this.messageInputField.onFakeInput(false);\r\n\r\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\r\n fastRaf(() => {\r\n this.onMessageSent();\r\n });\r\n });\r\n }\r\n \r\n return false;\r\n }\r\n }\r\n\r\n if(this.messageInputField.value === draft.rMessage && this.replyToMsgId === draft.reply_to_msg_id) return false;\r\n\r\n if(fromUpdate) {\r\n this.clearHelper();\r\n }\r\n\r\n this.noWebPage = draft.pFlags.no_webpage;\r\n if(draft.reply_to_msg_id) {\r\n this.initMessageReply(draft.reply_to_msg_id);\r\n }\r\n\r\n this.setInputValue(draft.rMessage, fromUpdate, fromUpdate);\r\n return true;\r\n }\r\n\r\n public finishPeerChange() {\r\n const peerId = this.chat.peerId;\r\n\r\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput} = this;\r\n chatInput.style.display = '';\r\n \r\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\r\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\r\n goDownBtn.classList.remove('hide');\r\n\r\n if(this.goDownUnreadBadge) {\r\n this.setUnreadCount();\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n chatInput.classList.toggle('can-pin', this.appPeersManager.canPinMessage(peerId));\r\n }/* else if(this.chat.type === 'chat') {\r\n } */\r\n\r\n if(forwardElements) {\r\n this.forwardWasDroppingAuthor = false;\r\n forwardElements.showCaption.checkboxField.setValueSilently(true);\r\n forwardElements.showSender.checkboxField.setValueSilently(true);\r\n }\r\n\r\n if(btnScheduled) {\r\n btnScheduled.classList.add('hide');\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n this.appMessagesManager.getScheduledMessages(peerId).then(mids => {\r\n if(!middleware()) return;\r\n btnScheduled.classList.toggle('hide', !mids.length);\r\n });\r\n }\r\n\r\n if(replyKeyboard) {\r\n replyKeyboard.setPeer(peerId);\r\n }\r\n\r\n if(sendMenu) {\r\n sendMenu.setPeerId(peerId);\r\n }\r\n\r\n if(this.messageInput) {\r\n this.updateMessageInput();\r\n } else if(this.pinnedControlBtn) {\r\n if(this.appPeersManager.canPinMessage(this.chat.peerId)) {\r\n this.pinnedControlBtn.append(i18n('Chat.Input.UnpinAll'));\r\n this.fakePinnedControlBtn.append(i18n('Chat.Input.UnpinAll'));\r\n } else {\r\n this.pinnedControlBtn.append(i18n('Chat.Pinned.DontShow'));\r\n this.fakePinnedControlBtn.append(i18n('Chat.Pinned.DontShow'));\r\n }\r\n }\r\n }\r\n\r\n public updateMessageInput() {\r\n const {chatInput, attachMenu, messageInput} = this;\r\n const {peerId, threadId} = this.chat;\r\n const canWrite = this.appMessagesManager.canSendToPeer(peerId, threadId);\r\n chatInput.classList.add('no-transition');\r\n chatInput.classList.toggle('is-hidden', !canWrite);\r\n void chatInput.offsetLeft; // reflow\r\n chatInput.classList.remove('no-transition');\r\n\r\n const i = I18n.weakMap.get(messageInput) as I18n.IntlElement;\r\n if(i) {\r\n let key: LangPackKey;\r\n if(threadId) {\r\n key = 'Comment';\r\n } else if(this.appPeersManager.isBroadcast(peerId)) {\r\n key = 'ChannelBroadcast';\r\n } else if(this.appMessagesManager.isAnonymousSending(peerId)) {\r\n key = 'SendAnonymously';\r\n } else {\r\n key = 'Message';\r\n }\r\n\r\n if(i.key !== key) {\r\n i.key = key;\r\n i.update();\r\n }\r\n }\r\n\r\n const visible = this.attachMenuButtons.filter(button => {\r\n const good = button.verify(peerId, threadId);\r\n button.element.classList.toggle('hide', !good);\r\n return good;\r\n });\r\n\r\n if(!canWrite) {\r\n messageInput.removeAttribute('contenteditable');\r\n } else {\r\n messageInput.setAttribute('contenteditable', 'true');\r\n this.setDraft(undefined, false);\r\n\r\n if(!messageInput.innerHTML) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n }\r\n \r\n attachMenu.toggleAttribute('disabled', !visible.length);\r\n attachMenu.classList.toggle('btn-disabled', !visible.length);\r\n this.updateSendBtn();\r\n }\r\n\r\n private attachMessageInputField() {\r\n const oldInputField = this.messageInputField;\r\n this.messageInputField = new InputField({\r\n placeholder: 'Message',\r\n name: 'message',\r\n animate: true\r\n });\r\n\r\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInput = this.messageInputField.input;\r\n this.messageInput.classList.add('no-scrollbar');\r\n this.attachMessageInputListeners();\r\n \r\n if(IS_STICKY_INPUT_BUGGED) {\r\n fixSafariStickyInputFocusing(this.messageInput);\r\n }\r\n\r\n if(oldInputField) {\r\n oldInputField.input.replaceWith(this.messageInputField.input);\r\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\r\n } else {\r\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\r\n }\r\n }\r\n\r\n private attachMessageInputListeners() {\r\n this.listenerSetter.add(this.messageInput)('keydown', (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(isSendShortcutPressed(e)) {\r\n cancelEvent(e);\r\n this.sendMessage();\r\n } else if(e.ctrlKey || e.metaKey) {\r\n this.handleMarkdownShortcut(e);\r\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\r\n e.preventDefault();\r\n\r\n if(key === 'PageUp') {\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n \r\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\r\n range.collapse(true);\r\n \r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n } else {\r\n placeCaretAtEnd(this.messageInput);\r\n }\r\n }\r\n });\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(this.messageInput, (e) => {\r\n this.appImManager.selectTab(1); // * set chat tab for album orientation\r\n //this.saveScroll();\r\n emoticonsDropdown.toggle(false);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n /* this.listenerSetter.add(window)('resize', () => {\r\n this.restoreScroll();\r\n }); */\r\n\r\n /* if(isSafari) { \r\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\r\n window.requestAnimationFrame(() => {\r\n window.requestAnimationFrame(() => {\r\n emoticonsDropdown.toggle(false);\r\n });\r\n });\r\n });\r\n } */\r\n }\r\n\r\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n const inputType = (e as InputEvent).inputType;\r\n //console.log('message beforeinput event', e);\r\n\r\n if(inputType.indexOf('format') === 0) {\r\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\r\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\r\n if(this.applyMarkdown(markdownType)) {\r\n cancelEvent(e); // * cancel legacy markdown event\r\n }\r\n }\r\n }); */\r\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\r\n this.listenerSetter.add(this.messageInput)('keyup', () => {\r\n this.checkAutocomplete();\r\n });\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n this.listenerSetter.add(this.messageInput)('focusin', () => {\r\n if(this.chat.bubbles.scrollable.loadedAll.bottom) {\r\n this.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\r\n }\r\n }); \r\n }\r\n }\r\n\r\n private prepareDocumentExecute = () => {\r\n this.executedHistory.push(this.messageInput.innerHTML);\r\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\r\n };\r\n\r\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\r\n cancelEvent(e); // cancel legacy event\r\n\r\n let html = this.messageInput.innerHTML;\r\n if(html && html !== needHTML) {\r\n this.lockRedo = true;\r\n\r\n let sameHTMLTimes = 0;\r\n do {\r\n document.execCommand(type, false, null);\r\n const currentHTML = this.messageInput.innerHTML;\r\n if(html === currentHTML) {\r\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\r\n break;\r\n }\r\n } else {\r\n sameHTMLTimes = 0;\r\n }\r\n\r\n html = currentHTML;\r\n } while(html !== needHTML);\r\n\r\n this.lockRedo = false;\r\n }\r\n };\r\n\r\n public applyMarkdown(type: MarkdownType, href?: string) {\r\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\r\n bold: 'Bold',\r\n italic: 'Italic',\r\n underline: 'Underline',\r\n strikethrough: 'Strikethrough',\r\n monospace: () => document.execCommand('fontName', false, 'monospace'),\r\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null)\r\n };\r\n\r\n if(!commandsMap[type]) {\r\n return false;\r\n }\r\n\r\n const command = commandsMap[type];\r\n\r\n //type = 'monospace';\r\n\r\n const saveExecuted = this.prepareDocumentExecute();\r\n const executed: any[] = [];\r\n /**\r\n * * clear previous formatting, due to Telegram's inability to handle several entities\r\n */\r\n /* const checkForSingle = () => {\r\n const nodes = getSelectedNodes();\r\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\r\n\r\n const parents = [...new Set(nodes.map(node => node.parentNode))];\r\n //const differentParents = !!nodes.find(node => node.parentNode !== firstParent);\r\n const differentParents = parents.length > 1;\r\n\r\n let notSingle = false;\r\n if(differentParents) {\r\n notSingle = true;\r\n } else {\r\n const node = nodes[0];\r\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\r\n notSingle = true;\r\n }\r\n }\r\n\r\n if(notSingle) {\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n //}\r\n\r\n executed.push(document.execCommand('unlink', false, null));\r\n executed.push(document.execCommand('removeFormat', false, null));\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n //}\r\n }\r\n }; */\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n \r\n if(type === 'monospace') {\r\n let haveThisType = false;\r\n //executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const selection = window.getSelection();\r\n if(!selection.isCollapsed) {\r\n const range = selection.getRangeAt(0);\r\n const tag = markdownTags[type];\r\n\r\n const node = range.commonAncestorContainer;\r\n if((node.parentNode as HTMLElement).matches(tag.match) || (node instanceof HTMLElement && node.matches(tag.match))) {\r\n haveThisType = true;\r\n }\r\n }\r\n\r\n //executed.push(document.execCommand('removeFormat', false, null));\r\n\r\n if(haveThisType) {\r\n executed.push(document.execCommand('fontName', false, 'Roboto'));\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n\r\n //checkForSingle();\r\n saveExecuted();\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.setActiveMarkupButton();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\r\n // console.log('handleMarkdownShortcut', e);\r\n const formatKeys: {[key: string]: MarkdownType} = {\r\n 'KeyB': 'bold',\r\n 'KeyI': 'italic',\r\n 'KeyU': 'underline',\r\n 'KeyS': 'strikethrough',\r\n 'KeyM': 'monospace'\r\n };\r\n\r\n if(this.appImManager.markupTooltip) {\r\n formatKeys['KeyK'] = 'link';\r\n }\r\n\r\n const code = e.code;\r\n const applyMarkdown = formatKeys[code];\r\n\r\n const selection = document.getSelection();\r\n if(selection.toString().trim().length && applyMarkdown) {\r\n // * костыльчик\r\n if(code === 'KeyK') {\r\n this.appImManager.markupTooltip.showLinkEditor();\r\n } else {\r\n this.applyMarkdown(applyMarkdown);\r\n }\r\n \r\n cancelEvent(e); // cancel legacy event\r\n }\r\n\r\n //return;\r\n if(code === 'KeyZ') {\r\n let html = this.messageInput.innerHTML;\r\n\r\n if(e.shiftKey) {\r\n if(this.undoHistory.length) {\r\n this.executedHistory.push(html);\r\n html = this.undoHistory.pop();\r\n this.undoRedo(e, 'redo', html);\r\n html = this.messageInput.innerHTML;\r\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\r\n this.canUndoFromHTML = html;\r\n }\r\n } else {\r\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\r\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\r\n this.undoHistory.push(html);\r\n html = this.executedHistory.pop();\r\n this.undoRedo(e, 'undo', html);\r\n\r\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\r\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\r\n }\r\n }\r\n }\r\n };\r\n\r\n private onMessageInput = (e?: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n /* const inputType = (e as InputEvent).inputType;\r\n console.log('message input event', e);\r\n if(inputType === 'formatBold') {\r\n console.log('message input format', this.messageInput.innerHTML);\r\n cancelEvent(e);\r\n }\r\n\r\n if(!isSelectionSingle()) {\r\n alert('not single');\r\n } */\r\n\r\n //console.log('messageInput input', this.messageInput.innerText);\r\n //const value = this.messageInput.innerText;\r\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\r\n \r\n //const entities = RichTextProcessor.parseEntities(value);\r\n const value = RichTextProcessor.parseMarkdown(richValue, markdownEntities, true);\r\n const entities = RichTextProcessor.mergeEntities(markdownEntities, RichTextProcessor.parseEntities(value));\r\n\r\n //this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\r\n\r\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n }\r\n\r\n const urlEntities: Array = !this.editMessage?.media && entities.filter(e => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\r\n if(urlEntities.length) {\r\n for(const entity of urlEntities) {\r\n let url: string;\r\n if(entity._ === 'messageEntityTextUrl') {\r\n url = entity.url;\r\n } else {\r\n url = richValue.slice(entity.offset, entity.offset + entity.length);\r\n\r\n if(!(url.includes('http://') || url.includes('https://'))) {\r\n continue;\r\n }\r\n }\r\n\r\n //console.log('messageInput url:', url);\r\n\r\n if(this.lastUrl !== url) {\r\n this.lastUrl = url;\r\n // this.willSendWebPage = null;\r\n const promise = this.getWebPagePromise = apiManager.invokeApiHashable('messages.getWebPage', {\r\n url,\r\n }).then((webpage) => {\r\n webpage = this.appWebPagesManager.saveWebPage(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 if(!richValue.trim()) {\r\n if(this.lastTimeType) {\r\n this.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'});\r\n }\r\n\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.hide();\r\n }\r\n } else {\r\n const time = Date.now();\r\n if(time - this.lastTimeType >= 6000) {\r\n this.lastTimeType = time;\r\n this.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'});\r\n }\r\n }\r\n\r\n if(!this.editMsgId) {\r\n this.saveDraftDebounced();\r\n }\r\n\r\n this.checkAutocomplete(richValue, caretPos, entities);\r\n\r\n this.updateSendBtn();\r\n };\r\n\r\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\r\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\r\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\r\n const prefix = fullValue.substr(0, pos);\r\n const suffix = fullValue.substr(pos);\r\n\r\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\r\n\r\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\r\n const newPrefix = prefix.slice(0, matchIndex);\r\n const newValue = newPrefix + insertText + suffix;\r\n\r\n // merge emojis\r\n const hadEntities = RichTextProcessor.parseEntities(fullValue);\r\n RichTextProcessor.mergeEntities(entities, hadEntities);\r\n\r\n // max for additional whitespace\r\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\r\n const addEntities: MessageEntity[] = [];\r\n if(insertEntity) {\r\n addEntities.push(insertEntity);\r\n insertEntity.offset = matchIndex;\r\n }\r\n\r\n // add offset to entities next to emoji\r\n const diff = matches ? insertLength - matches[2].length : insertLength;\r\n entities.forEach(entity => {\r\n if(entity.offset >= matchIndex) {\r\n entity.offset += diff;\r\n }\r\n });\r\n\r\n RichTextProcessor.mergeEntities(entities, addEntities);\r\n\r\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\r\n const caretEntity: MessageEntity.messageEntityCaret = {\r\n _: 'messageEntityCaret',\r\n offset: matchIndex + insertLength,\r\n length: 0\r\n };\r\n\r\n let insertCaretAtIndex = 0;\r\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\r\n const entity = entities[insertCaretAtIndex];\r\n if(entity.offset > caretEntity.offset) {\r\n break;\r\n }\r\n }\r\n\r\n entities.splice(insertCaretAtIndex, 0, caretEntity);\r\n }\r\n\r\n //const saveExecuted = this.prepareDocumentExecute();\r\n // can't exec .value here because it will instantly check for autocomplete\r\n const value = RichTextProcessor.wrapDraftText(newValue, {entities});\r\n this.messageInputField.setValueSilently(value, true);\r\n\r\n const caret = this.messageInput.querySelector('.composer-sel');\r\n if(caret) {\r\n setCaretAt(caret);\r\n caret.remove();\r\n }\r\n\r\n // but it's needed to be checked only here\r\n this.onMessageInput();\r\n\r\n //saveExecuted();\r\n\r\n //document.execCommand('insertHTML', true, RichTextProcessor.wrapEmojiText(emoji));\r\n }\r\n\r\n public onEmojiSelected = (emoji: string, autocomplete: boolean) => {\r\n this.insertAtCaret(emoji, RichTextProcessor.getEmojiEntityFromEmoji(emoji), autocomplete);\r\n };\r\n\r\n private checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\r\n //return;\r\n\r\n if(value === undefined) {\r\n const r = getRichValueWithCaret(this.messageInputField.input, true);\r\n value = r.value;\r\n caretPos = r.caretPos;\r\n entities = r.entities;\r\n }\r\n\r\n if(caretPos === -1) {\r\n caretPos = value.length;\r\n }\r\n\r\n if(entities === undefined) {\r\n const _value = RichTextProcessor.parseMarkdown(value, entities, true);\r\n entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(_value));\r\n }\r\n\r\n value = value.substr(0, caretPos);\r\n\r\n if(this.previousQuery === value) {\r\n return;\r\n }\r\n\r\n this.previousQuery = value;\r\n \r\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\r\n let foundHelper: AutocompleteHelper;\r\n if(matches) {\r\n const entity = entities[0];\r\n\r\n let query = matches[2];\r\n const firstChar = query[0];\r\n\r\n if(this.stickersHelper && \r\n rootScope.settings.stickers.suggest && \r\n this.appMessagesManager.canSendToPeer(this.chat.peerId, this.chat.threadId, 'send_stickers') &&\r\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\r\n foundHelper = this.stickersHelper;\r\n this.stickersHelper.checkEmoticon(value);\r\n } else if(firstChar === '@') { // mentions\r\n const topMsgId = this.chat.threadId ? this.appMessagesIdsManager.getServerMessageId(this.chat.threadId) : undefined;\r\n if(this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\r\n foundHelper = this.mentionsHelper;\r\n }\r\n } else if(!matches[1] && firstChar === '/') { // commands\r\n if(this.commandsHelper.checkQuery(query, this.chat.peerId)) {\r\n foundHelper = this.commandsHelper;\r\n }\r\n } else if(rootScope.settings.emoji.suggest) { // emoji\r\n query = query.replace(/^\\s*/, '');\r\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\r\n foundHelper = this.emojiHelper;\r\n this.emojiHelper.checkQuery(query, firstChar);\r\n }\r\n }\r\n }\r\n \r\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\r\n\r\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\r\n }\r\n\r\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\r\n let needPlaceholder = false;\r\n\r\n if(!foundHelper) {\r\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\r\n if(inlineMatch) {\r\n const username = inlineMatch[1];\r\n const query = value.slice(inlineMatch[0].length);\r\n needPlaceholder = inlineMatch[0].length === value.length;\r\n \r\n foundHelper = this.inlineHelper;\r\n\r\n if(!this.btnPreloader) {\r\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\r\n putPreloader(this.btnPreloader, true);\r\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\r\n } else {\r\n SetTransition(this.btnPreloader, 'show', true, 400);\r\n }\r\n \r\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\r\n if(needPlaceholder && user.bot_inline_placeholder) {\r\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\r\n }\r\n\r\n renderPromise.then(() => {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n });\r\n }).catch(noop);\r\n }\r\n }\r\n \r\n if(!needPlaceholder) {\r\n delete this.messageInput.dataset.inlinePlaceholder;\r\n }\r\n\r\n if(foundHelper !== this.inlineHelper) {\r\n if(this.btnPreloader) {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n }\r\n }\r\n\r\n return foundHelper;\r\n }\r\n\r\n private onBtnSendClick = (e: Event) => {\r\n cancelEvent(e);\r\n\r\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\r\n if(this.recording) {\r\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\r\n this.onCancelRecordClick();\r\n } else {\r\n this.recorder.stop();\r\n }\r\n } else {\r\n this.sendMessage();\r\n }\r\n } else {\r\n if(this.chat.peerId.isAnyChat() && !this.appMessagesManager.canSendToPeer(this.chat.peerId, this.chat.threadId, 'send_media')) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return;\r\n }\r\n\r\n this.chatInput.classList.add('is-locked');\r\n blurActiveElement();\r\n\r\n this.recorder.start().then(() => {\r\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\r\n this.recordCanceled = false;\r\n \r\n this.chatInput.classList.add('is-recording');\r\n this.recording = true;\r\n this.updateSendBtn();\r\n opusDecodeController.setKeepAlive(true);\r\n \r\n const showDiscardPopup = () => {\r\n new PopupPeer('popup-cancel-record', {\r\n titleLangKey: 'DiscardVoiceMessageTitle',\r\n descriptionLangKey: 'DiscardVoiceMessageDescription',\r\n buttons: [{\r\n langKey: 'DiscardVoiceMessageAction',\r\n callback: () => {\r\n simulateClickEvent(this.btnCancelRecord);\r\n }\r\n }, {\r\n langKey: 'Continue',\r\n isCancel: true\r\n }]\r\n }).show();\r\n };\r\n\r\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\r\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\r\n cancelEvent(e);\r\n showDiscardPopup();\r\n }\r\n }, {capture: true, passive: false}) as any;\r\n\r\n appNavigationController.pushItem(this.recordingNavigationItem = {\r\n type: 'voice',\r\n onPop: () => {\r\n setTimeout(() => {\r\n showDiscardPopup();\r\n }, 0);\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.recordStartTime = Date.now();\r\n\r\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\r\n const context = sourceNode.context;\r\n\r\n const analyser = context.createAnalyser();\r\n sourceNode.connect(analyser);\r\n //analyser.connect(context.destination);\r\n analyser.fftSize = 32;\r\n\r\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\r\n const max = frequencyData.length * 255;\r\n const min = 54 / 150;\r\n let r = () => {\r\n if(!this.recording) return;\r\n\r\n analyser.getByteFrequencyData(frequencyData);\r\n\r\n let sum = 0;\r\n frequencyData.forEach(value => {\r\n sum += value;\r\n });\r\n \r\n let percents = Math.min(1, (sum / max) + min);\r\n //console.log('frequencyData', frequencyData, percents);\r\n\r\n this.recordRippleEl.style.transform = `scale(${percents})`;\r\n\r\n let diff = Date.now() - this.recordStartTime;\r\n let ms = diff % 1000;\r\n\r\n let formatted = ('' + (diff / 1000)).toHHMMSS() + ',' + ('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.chatInput.classList.remove('is-recording', 'is-locked');\r\n });\r\n }\r\n };\r\n\r\n private onHelperCancel = (e?: Event, force?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.willSendWebPage) {\r\n const lastUrl = this.lastUrl;\r\n let needReturn = false;\r\n if(this.helperType) {\r\n //if(this.helperFunc) {\r\n this.helperFunc();\r\n //}\r\n\r\n needReturn = true;\r\n }\r\n\r\n // * restore values\r\n this.lastUrl = lastUrl;\r\n this.noWebPage = true;\r\n this.willSendWebPage = null;\r\n\r\n if(needReturn) return;\r\n }\r\n\r\n if(this.helperType === 'edit' && !force) {\r\n const message = this.editMessage\r\n const value = RichTextProcessor.parseMarkdown(this.messageInputField.value, []);\r\n if(message.message !== value) {\r\n new PopupPeer('discard-editing', {\r\n buttons: [{\r\n langKey: 'Alert.Confirm.Discard',\r\n callback: () => {\r\n this.onHelperCancel(undefined, true);\r\n }\r\n }],\r\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\r\n }).show();\r\n\r\n return;\r\n }\r\n }\r\n\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n };\r\n\r\n private onHelperClick = (e: Event) => {\r\n cancelEvent(e);\r\n \r\n if(!findUpClassName(e.target, 'reply')) return;\r\n if(this.helperType === 'forward') {\r\n const {forwardElements} = this;\r\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\r\n openBtnMenu(forwardElements.container);\r\n }\r\n } else if(this.helperType === 'reply') {\r\n this.chat.setMessageId(this.replyToMsgId);\r\n } else if(this.helperType === 'edit') {\r\n this.chat.setMessageId(this.editMsgId);\r\n }\r\n };\r\n\r\n private changeForwardRecipient() {\r\n if(this.helperWaitingForward) return;\r\n this.helperWaitingForward = true;\r\n\r\n const helperFunc = this.helperFunc;\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n let selected = false;\r\n const popup = new PopupForward(copy(this.forwarding), () => {\r\n selected = true;\r\n });\r\n\r\n popup.addEventListener('close', () => {\r\n this.helperWaitingForward = false;\r\n\r\n if(!selected) {\r\n helperFunc();\r\n }\r\n });\r\n }\r\n\r\n public clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\r\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\r\n const i = document.createElement('input');\r\n document.body.append(i);\r\n fixSafariStickyInput(i);\r\n this.messageInputField.setValueSilently(clearValue);\r\n fixSafariStickyInput(this.messageInput);\r\n i.remove();\r\n } else {\r\n this.messageInputField.setValueSilently(clearValue);\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n //this.messageInput.innerText = '';\r\n } else {\r\n //this.attachMessageInputField();\r\n //this.messageInput.innerText = '';\r\n\r\n // clear executions\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n this.executedHistory.length = 0;\r\n this.canUndoFromHTML = '';\r\n }\r\n\r\n let set = false;\r\n if(canSetDraft) {\r\n set = this.setDraft(undefined, false);\r\n }\r\n\r\n if(!set && fireEvent) {\r\n this.onMessageInput();\r\n }\r\n }\r\n\r\n public isInputEmpty() {\r\n return isInputEmpty(this.messageInput);\r\n }\r\n\r\n public updateSendBtn() {\r\n let icon: 'send' | 'record' | 'edit' | 'schedule';\r\n\r\n const isInputEmpty = this.isInputEmpty();\r\n\r\n if(this.editMsgId) icon = 'edit';\r\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\r\n else icon = 'record';\r\n\r\n ['send', 'record', 'edit', 'schedule'].forEach(i => {\r\n this.btnSend.classList.toggle(i, icon === i);\r\n });\r\n\r\n if(this.btnScheduled) {\r\n this.btnScheduled.classList.toggle('show', isInputEmpty);\r\n }\r\n\r\n if(this.btnToggleReplyMarkup) {\r\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty);\r\n }\r\n }\r\n\r\n public onMessageSent(clearInput = true, clearReply?: boolean) {\r\n if(this.chat.type !== 'scheduled') {\r\n this.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\r\n }\r\n\r\n this.scheduleDate = undefined;\r\n this.sendSilent = undefined;\r\n\r\n const value = this.messageInputField.value;\r\n const entities = RichTextProcessor.parseEntities(value);\r\n const emojiEntities: MessageEntity.messageEntityEmoji[] = entities.filter(entity => entity._ === 'messageEntityEmoji') as any;\r\n emojiEntities.forEach(entity => {\r\n const emoji = emojiFromCodePoints(entity.unicode);\r\n this.appEmojiManager.pushRecentEmoji(emoji);\r\n });\r\n\r\n if(clearInput) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n this.clearInput();\r\n }\r\n\r\n if(clearReply || clearInput) {\r\n this.clearHelper();\r\n }\r\n\r\n this.updateSendBtn();\r\n }\r\n\r\n public sendMessage(force = false) {\r\n const {editMsgId, chat} = this;\r\n if(chat.type === 'scheduled' && !force && !editMsgId) {\r\n this.scheduleSending();\r\n return;\r\n }\r\n\r\n const {threadId, peerId} = chat;\r\n const {replyToMsgId, noWebPage, sendSilent, scheduleDate} = this;\r\n\r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n //return;\r\n if(editMsgId) {\r\n const message = this.editMessage;\r\n if(value.trim() || message.media) {\r\n this.appMessagesManager.editMessage(message, value, {\r\n entities,\r\n noWebPage: noWebPage\r\n });\r\n\r\n this.onMessageSent();\r\n } else {\r\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\r\n\r\n return;\r\n }\r\n } else if(value.trim()) {\r\n this.appMessagesManager.sendText(peerId, value, {\r\n entities,\r\n replyToMsgId: replyToMsgId,\r\n threadId: threadId,\r\n noWebPage: noWebPage,\r\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\r\n scheduleDate: scheduleDate,\r\n silent: sendSilent,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, false);\r\n // this.onMessageSent();\r\n }\r\n\r\n // * wait for sendText set messageId for invokeAfterMsg\r\n if(this.forwarding) {\r\n const forwarding = copy(this.forwarding);\r\n setTimeout(() => {\r\n for(const fromPeerId in forwarding) {\r\n this.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\r\n silent: sendSilent,\r\n scheduleDate: scheduleDate,\r\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\r\n dropCaptions: this.isDroppingCaptions()\r\n });\r\n }\r\n\r\n if(!value) {\r\n this.onMessageSent();\r\n }\r\n }, 0);\r\n }\r\n\r\n // this.onMessageSent();\r\n }\r\n\r\n public sendMessageWithDocument(document: MyDocument | string, force = false, clearDraft = false) {\r\n document = this.appDocsManager.getDoc(document);\r\n\r\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\r\n if(this.chat.peerId.isAnyChat() && !this.appMessagesManager.canSendToPeer(this.chat.peerId, this.chat.threadId, flag)) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return false;\r\n }\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft));\r\n return false;\r\n }\r\n\r\n if(document) {\r\n this.appMessagesManager.sendFile(this.chat.peerId, document, {\r\n isMedia: true, \r\n replyToMsgId: this.replyToMsgId, \r\n threadId: this.chat.threadId,\r\n silent: this.sendSilent, \r\n scheduleDate: this.scheduleDate,\r\n clearDraft: clearDraft || undefined\r\n });\r\n this.onMessageSent(clearDraft, true);\r\n\r\n if(document.type === 'sticker') {\r\n emoticonsDropdown.stickersTab?.pushRecentSticker(document);\r\n }\r\n\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n private canToggleHideAuthor() {\r\n const {forwardElements} = this;\r\n if(!forwardElements) return false;\r\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\r\n return !hideCaptionCheckboxField.checked ||\r\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\r\n }\r\n\r\n private isDroppingCaptions() {\r\n return !this.canToggleHideAuthor();\r\n }\r\n\r\n /* public sendSomething(callback: () => void, force = false) {\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendSomething(callback, true));\r\n return false;\r\n }\r\n\r\n callback();\r\n this.onMessageSent(false, true);\r\n\r\n return true;\r\n } */\r\n\r\n public initMessageEditing(mid: number) {\r\n const message: Message.message = this.chat.getMessage(mid);\r\n\r\n let input = RichTextProcessor.wrapDraftText(message.message, {entities: message.totalEntities});\r\n const f = () => {\r\n const replyFragment = this.appMessagesManager.wrapMessageForReply(message, undefined, [message.mid]);\r\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\r\n\r\n this.editMsgId = mid;\r\n this.editMessage = message;\r\n input = undefined;\r\n };\r\n f();\r\n }\r\n\r\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\r\n const f = () => {\r\n //const peerTitles: string[]\r\n const fromPeerIds = Object.keys(fromPeerIdsMids).map(fromPeerId => fromPeerId.toPeerId());\r\n const smth: Set = new Set();\r\n let length = 0, messagesWithCaptionsLength = 0;\r\n\r\n fromPeerIds.forEach(fromPeerId => {\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n mids.forEach(mid => {\r\n const message: Message.message = this.appMessagesManager.getMessageByPeer(fromPeerId, mid);\r\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\r\n smth.add('N' + message.fwd_from.from_name);\r\n } else {\r\n smth.add('P' + message.fromId);\r\n }\r\n\r\n if(message.media && message.message) {\r\n ++messagesWithCaptionsLength;\r\n }\r\n });\r\n\r\n length += mids.length;\r\n });\r\n\r\n const onlyFirstName = smth.size > 2;\r\n const peerTitles = [...smth].map(smth => {\r\n const type = smth[0];\r\n smth = smth.slice(1);\r\n if(type === 'P') {\r\n const peerId = smth.toPeerId();\r\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\r\n } else {\r\n return onlyFirstName ? smth.split(' ')[0] : smth;\r\n }\r\n });\r\n\r\n const {forwardElements} = this;\r\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\r\n form.classList.toggle('hide', !messagesWithCaptionsLength);\r\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\r\n if(messagesWithCaptionsLength && hideCaption) {\r\n forwardElements.hideSender.checkboxField.setValueSilently(true);\r\n } else if(this.forwardWasDroppingAuthor !== undefined) {\r\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\r\n }\r\n\r\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n const title = i18n(titleKey, [length]);\r\n\r\n const senderTitles = document.createDocumentFragment();\r\n if(peerTitles.length < 3) {\r\n senderTitles.append(...join(peerTitles, false));\r\n } else {\r\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\r\n }\r\n\r\n let firstMessage: Message.message, usingFullAlbum: boolean;\r\n if(fromPeerIds.length === 1) {\r\n const fromPeerId = fromPeerIds[0];\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n firstMessage = this.appMessagesManager.getMessageByPeer(fromPeerId, mids[0]);\r\n \r\n usingFullAlbum = !!firstMessage.grouped_id;\r\n if(usingFullAlbum) {\r\n const albumMids = this.appMessagesManager.getMidsByMessage(firstMessage);\r\n if(albumMids.length !== length || albumMids.find(mid => !mids.includes(mid))) {\r\n usingFullAlbum = false;\r\n }\r\n }\r\n }\r\n\r\n const subtitleFragment = document.createDocumentFragment();\r\n const delimiter = ': ';\r\n if(usingFullAlbum || length === 1) {\r\n const mids = fromPeerIdsMids[fromPeerIds[0]];\r\n const replyFragment = this.appMessagesManager.wrapMessageForReply(firstMessage, undefined, mids);\r\n subtitleFragment.append(\r\n senderTitles, \r\n delimiter, \r\n replyFragment\r\n );\r\n } else {\r\n subtitleFragment.append(\r\n i18n('Chat.Accessory.Forward.From'), \r\n delimiter, \r\n senderTitles\r\n );\r\n }\r\n \r\n let newReply = this.setTopInfo('forward', f, title, subtitleFragment);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const text = b.textElement;\r\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\r\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\r\n intl.update();\r\n });\r\n\r\n if(this.forwardHover) {\r\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\r\n }\r\n\r\n this.forwarding = fromPeerIdsMids;\r\n };\r\n \r\n f();\r\n }\r\n\r\n public initMessageReply(mid: number) {\r\n if(this.replyToMsgId === mid) {\r\n return;\r\n }\r\n \r\n let message: Message = this.chat.getMessage(mid);\r\n const f = () => {\r\n let peerTitleEl: HTMLElement;\r\n if(message._ === 'messageEmpty') { // load missing replying message\r\n peerTitleEl = i18n('Loading');\r\n\r\n this.chat.appMessagesManager.wrapSingleMessage(this.chat.peerId, mid).then((_message) => {\r\n if(this.replyToMsgId !== mid) {\r\n return;\r\n }\r\n\r\n message = _message;\r\n if(message._ === 'messageEmpty') {\r\n this.clearHelper('reply');\r\n } else {\r\n f();\r\n }\r\n });\r\n } else {\r\n peerTitleEl = new PeerTitle({\r\n peerId: message.fromId,\r\n dialog: false\r\n }).element;\r\n }\r\n\r\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\r\n this.replyToMsgId = mid;\r\n };\r\n f();\r\n }\r\n\r\n public clearHelper(type?: ChatInputHelperType) {\r\n if(this.helperType === 'edit' && type !== 'edit') {\r\n this.clearInput();\r\n }\r\n\r\n if(type) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n }\r\n \r\n if(type !== 'reply') {\r\n this.replyToMsgId = undefined;\r\n this.forwarding = undefined;\r\n }\r\n\r\n this.editMsgId = this.editMessage = undefined;\r\n this.helperType = this.helperFunc = undefined;\r\n\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n appNavigationController.removeByType('input-helper');\r\n this.chat.container.classList.remove('is-helper-active');\r\n this.t();\r\n }\r\n }\r\n\r\n private t() {\r\n const className = 'is-toggling-helper';\r\n SetTransition(this.chat.container, className, true, 150, () => {\r\n this.chat.container.classList.remove(className);\r\n });\r\n }\r\n\r\n public setInputValue(value: string, clear = true, focus = true) {\r\n if(!value) value = '';\r\n\r\n if(clear) this.clearInput(false, false, value);\r\n else this.messageInputField.setValueSilently(value);\r\n\r\n fastRaf(() => {\r\n focus && placeCaretAtEnd(this.messageInput);\r\n this.onMessageInput();\r\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\r\n });\r\n }\r\n\r\n public setTopInfo(\r\n type: ChatInputHelperType, \r\n callerFunc: () => void, \r\n title: Parameters[0] = '', \r\n subtitle: Parameters[1] = '', \r\n input?: string, \r\n message?: any\r\n ) {\r\n if(this.willSendWebPage && type === 'reply') {\r\n return;\r\n }\r\n\r\n if(type !== 'webpage') {\r\n this.clearHelper(type);\r\n this.helperType = type;\r\n this.helperFunc = callerFunc;\r\n }\r\n \r\n const replyParent = this.replyElements.container;\r\n const oldReply = replyParent.lastElementChild.previousElementSibling;\r\n const haveReply = oldReply.classList.contains('reply');\r\n\r\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\r\n const newReply = wrapReply(title, subtitle, message);\r\n if(haveReply) {\r\n oldReply.replaceWith(newReply);\r\n } else {\r\n replyParent.insertBefore(newReply, replyParent.lastElementChild);\r\n }\r\n\r\n if(!this.chat.container.classList.contains('is-helper-active')) {\r\n this.chat.container.classList.add('is-helper-active');\r\n this.t();\r\n }\r\n\r\n /* const scroll = appImManager.scrollable;\r\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\r\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\r\n } */\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'input-helper',\r\n onPop: () => {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n if(input !== undefined) {\r\n this.setInputValue(input);\r\n }\r\n\r\n setTimeout(() => {\r\n this.updateSendBtn();\r\n }, 0);\r\n\r\n return newReply;\r\n }\r\n\r\n // public saveScroll() {\r\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\r\n // this.scrollOffsetTop = this.chatInput.offsetTop;\r\n // }\r\n\r\n // public restoreScroll() {\r\n // if(this.chatInput.style.display) return;\r\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\r\n // let newOffsetTop = this.chatInput.offsetTop;\r\n // let container = this.chat.bubbles.scrollable.container;\r\n // let scrollTop = container.scrollTop;\r\n // let clientHeight = container.clientHeight;\r\n // let maxScrollTop = container.scrollHeight;\r\n\r\n // if(newOffsetTop < this.scrollOffsetTop) {\r\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\r\n // container.scrollTop += this.scrollDiff;\r\n // } else if(scrollTop !== this.scrollTop) {\r\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\r\n // if(endDiff < this.scrollDiff/* && false */) {\r\n // //container.scrollTop -= endDiff;\r\n // } else {\r\n // container.scrollTop -= this.scrollDiff;\r\n // }\r\n // }\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setCaretAt(node: Node) {\n // node.appendChild(document.createTextNode(''));\n\n const originalNode = node;\n node = node.previousSibling;\n\n if(node.nodeType === 1) {\n const newNode = document.createTextNode('');\n node.parentNode.insertBefore(newNode, !originalNode.nextSibling || originalNode.nextSibling.nodeType === node.nodeType ? originalNode : originalNode.nextSibling);\n node = newNode;\n }\n\n if(window.getSelection && document.createRange) {\n const range = document.createRange();\n if(node) {\n range.setStartAfter(node);\n range.insertNode(node);\n range.setStart(node, node.nodeValue.length);\n }\n\n range.collapse(true);\n\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"./chat\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { ripple } from \"../ripple\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { safeAssign } from \"../../helpers/object\";\r\nimport { Message } from \"../../layer\";\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 fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\r\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\r\n this.divAndCaption.container.dataset.mid = '' + message.mid;\r\n this.divAndCaption.fill(title, subtitle, message);\r\n this.topbar.setUtilsWidth();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatTopbar from \"./topbar\";\nimport rootScope from \"../../lib/rootScope\";\nimport appMediaPlaybackController from \"../appMediaPlaybackController\";\nimport DivAndCaption from \"../divAndCaption\";\nimport PinnedContainer from \"./pinnedContainer\";\nimport Chat from \"./chat\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport { formatFullSentTime } from \"../../helpers/date\";\nimport { MediaProgressLine, VolumeSelector } from \"../../lib/mediaPlayer\";\nimport ButtonIcon from \"../buttonIcon\";\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected appMessagesManager: AppMessagesManager) {\n super({\n topbar, \n chat, \n listenerSetter: topbar.listenerSetter, \n className: 'audio', \n divAndCaption: new DivAndCaption(\n 'pinned-audio', \n (title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => {\n replaceContent(this.divAndCaption.title, title);\n replaceContent(this.divAndCaption.subtitle, subtitle);\n }\n ), \n onClose: () => {\n appMediaPlaybackController.stop();\n },\n floating: true\n });\n\n this.divAndCaption.border.remove();\n\n const prevEl = ButtonIcon('pprevious active', {noRipple: true});\n const nextEl = ButtonIcon('nnext active', {noRipple: true});\n\n prevEl.innerHTML = ``;\n nextEl.innerHTML = ``;\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 this.wrapperUtils.prepend(this.volumeSelector.btn);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine(undefined, undefined, true, true);\n this.progressLine.container.classList.add('pinned-audio-progress');\n progressWrapper.append(this.progressLine.container);\n this.wrapper.insertBefore(progressWrapper, this.wrapperUtils);\n\n this.topbar.listenerSetter.add(rootScope)('media_play', ({doc, message, media}) => {\n let title: string | HTMLElement, subtitle: string | HTMLElement | DocumentFragment;\n if(doc.type === 'voice' || doc.type === 'round') {\n title = new PeerTitle({peerId: message.fromId}).element;\n\n //subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n } else {\n title = doc.audioTitle || doc.fileName;\n subtitle = doc.audioPerformer || i18n('AudioUnknownArtist');\n }\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n this.toggleEl.classList.add('flip-icon');\n this.toggle(false);\n });\n\n this.topbar.listenerSetter.add(rootScope)('media_pause', () => {\n this.toggleEl.classList.remove('flip-icon');\n });\n\n this.topbar.listenerSetter.add(rootScope)('media_stop', () => {\n this.toggle(true);\n });\n }\n}\n","// https://github.com/evgeny-nadymov/telegram-react/blob/master/src/Components/ColumnMiddle/PinnedMessageBorder.js\n\nenum BAR_HEIGHTS {\n ONE = 32,\n TWO = 15,\n THREE = 10,\n FOUR = 8,\n MORE = 8\n};\n\nconst GAP = 1;\nconst WIDTH = 2;\nconst BASE_CLASS = 'pinned-message-border';\n\nexport default class PinnedMessageBorder {\n private border: HTMLElement;\n private wrapper: HTMLElement;\n private svg: SVGSVGElement;\n private defs: SVGDefsElement;\n private clipPath: SVGClipPathElement;\n private path: SVGPathElement;\n private mark: HTMLElement;\n\n private count: number;\n private index: number;\n\n private drawRect = (x: number, y: number, width: number, height: number, radius: number) => {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n };\n\n private getClipPath = (id: string, barHeight: number, count: number) => {\n const radius = 1;\n\n let d = '';\n /* if(count === 3) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius)\n + this.drawRect(0, barHeight + GAP, WIDTH, barHeight + 1, radius)\n + this.drawRect(0, barHeight * 2 + GAP * 2 + 1, WIDTH, barHeight, radius);\n } */if(count === 2) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius) + this.drawRect(0, barHeight + GAP * 2, WIDTH, barHeight, radius);\n } else {\n for(let i = 0; i < count; ++i) {\n d += this.drawRect(0, (barHeight + GAP) * i, WIDTH, barHeight, radius);\n }\n }\n\n if(!this.clipPath) {\n this.clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n this.clipPath.append(this.path);\n }\n\n this.clipPath.id = id;\n this.path.setAttributeNS(null, 'd', d);\n\n return this.clipPath;\n };\n\n private getBarHeight = (count: number, index: number) => {\n let barHeight: number;\n if(count <= 1) {\n barHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n barHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n barHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n barHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n barHeight = BAR_HEIGHTS.MORE;\n }\n\n return barHeight;\n };\n\n private getMarkHeight = (count: number, index: number) => {\n let markHeight: number;\n if(count <= 1) {\n markHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n markHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n markHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n markHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n markHeight = BAR_HEIGHTS.MORE;\n }\n\n return markHeight;\n };\n\n private getMarkTranslateY = (index: number, barHeight: number, count: number) => {\n if(count === 1) {\n return 0;\n } else if(count === 2) {\n return !index ? 0 : barHeight + GAP;\n }\n\n if(count === 3) {\n if(!index) {\n return 0;\n } else if(index === 1) {\n return barHeight + GAP;\n }\n\n return barHeight * 2 + GAP * 2 + 1;\n } else {\n return (barHeight + GAP) * index;\n }\n };\n\n private getTrackTranslateY = (index: number, count: number, barHeight: number, trackHeight: number) => {\n if(count <= 4) {\n return 0;\n }\n\n if(index <= 1) {\n return 0;\n } else if(index >= (count - 2)) {\n return trackHeight - BAR_HEIGHTS.ONE - barHeight;\n }\n\n // return (index + 1) * barHeight + index * GAP;\n return (index - 2) * barHeight + index * GAP;\n //return (barHeight + GAP * 2) / 2 + (index - 2) * (barHeight + GAP);\n };\n\n private getTrackHeight = (count: number, barHeight: number) => {\n return count <= 3 ? BAR_HEIGHTS.ONE : barHeight * count + GAP * (count - 1);\n };\n\n public render(count: number, index: number) {\n if(!this.border) {\n this.border = document.createElement('div');\n this.border.classList.add(BASE_CLASS);\n\n this.wrapper = document.createElement('div');\n this.border.append(this.wrapper);\n }\n \n if(count === 1) {\n if(this.count !== count) {\n this.wrapper.className = BASE_CLASS + '-wrapper-1';\n this.border.classList.remove(BASE_CLASS + '-mask');\n this.wrapper.innerHTML = this.wrapper.style.cssText = '';\n }\n\n return this.border;\n }\n\n const barHeight = this.getBarHeight(count, index);\n const markHeight = this.getMarkHeight(count, index);\n const trackHeight = this.getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath_${count}`;\n const clipPath = this.getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = this.getMarkTranslateY(index, barHeight, count);\n const trackTranslateY = this.getTrackTranslateY(index, count, barHeight, trackHeight);\n\n this.border.classList.toggle(BASE_CLASS + '-mask', count > 4);\n\n if(index <= 1) {\n this.border.classList.add('mask-bottom');\n this.border.classList.remove('mask-top');\n } else if(index >= (count - 2)) {\n this.border.classList.add('mask-top');\n this.border.classList.remove('mask-bottom');\n } else {\n this.border.classList.add('mask-top', 'mask-bottom');\n }\n\n this.wrapper.className = BASE_CLASS + '-wrapper';\n this.wrapper.style.cssText = `clip-path: url(#${clipPathId}); width: 2px; height: ${trackHeight}px; transform: translateY(-${trackTranslateY}px);`;\n \n if(!this.svg) {\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.setAttributeNS(null, 'height', '0');\n this.svg.setAttributeNS(null, 'width', '0');\n \n this.defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n this.defs.append(clipPath);\n\n this.svg.append(this.defs);\n\n this.mark = document.createElement('div');\n this.mark.classList.add(BASE_CLASS + '-mark');\n }\n\n if(!this.svg.parentElement) {\n this.wrapper.append(this.svg, this.mark);\n }\n\n this.mark.style.cssText = `height: ${markHeight}px; transform: translateY(${markTranslateY}px);`;\n \n this.count = count;\n this.index = index;\n\n return this.border;\n }\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport PinnedContainer from \"./pinnedContainer\";\r\nimport PinnedMessageBorder from \"./pinnedMessageBorder\";\r\nimport ReplyContainer, { wrapReplyDivAndCaption } from \"./replyContainer\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport Chat from \"./chat\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport handleScrollSideEvent from \"../../helpers/dom/handleScrollSideEvent\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\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 public static LOAD_COUNT = 50;\r\n public static LOAD_OFFSET = 5;\r\n\r\n public pinnedMessageContainer: PinnedContainer;\r\n public pinnedMessageBorder: PinnedMessageBorder;\r\n\r\n public pinnedMaxMid = 0;\r\n public pinnedMid = 0;\r\n public pinnedIndex = -1;\r\n public wasPinnedIndex = 0;\r\n public wasPinnedMediaIndex = 0;\r\n \r\n public locked = false;\r\n public waitForScrollBottom = false;\r\n\r\n public count = 0;\r\n public mids: number[] = [];\r\n public offsetIndex = 0;\r\n\r\n public loading = false;\r\n public loadedBottom = false;\r\n public loadedTop = false;\r\n\r\n public animatedSubtitle: AnimatedSuper;\r\n public animatedMedia: AnimatedSuper;\r\n public animatedCounter: AnimatedCounter;\r\n\r\n public listenerSetter: ListenerSetter;\r\n public scrollDownListenerSetter: ListenerSetter = null;\r\n\r\n public hidden = false;\r\n\r\n public getCurrentIndexPromise: Promise = null;\r\n public btnOpen: HTMLButtonElement;\r\n \r\n public setPinnedMessage: () => void;\r\n\r\n private isStatic = false;\r\n\r\n private debug = false;\r\n \r\n constructor(private topbar: ChatTopbar, private chat: Chat, private appMessagesManager: AppMessagesManager, private appPeersManager: AppPeersManager) {\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n const dAC = new ReplyContainer('pinned-message');\r\n this.pinnedMessageContainer = new PinnedContainer({\r\n topbar, \r\n chat, \r\n listenerSetter: this.listenerSetter, \r\n className: 'message', \r\n divAndCaption: dAC, \r\n onClose: async() => {\r\n if(appPeersManager.canPinMessage(this.topbar.peerId)) {\r\n new PopupPinMessage(this.topbar.peerId, this.pinnedMid, true);\r\n } else {\r\n new PopupPinMessage(this.topbar.peerId, 0, true);\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.pinnedMessageBorder = new PinnedMessageBorder();\r\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\r\n\r\n this.animatedSubtitle = new AnimatedSuper();\r\n dAC.subtitle.append(this.animatedSubtitle.container);\r\n\r\n this.animatedMedia = new AnimatedSuper();\r\n this.animatedMedia.container.classList.add('pinned-message-media-container');\r\n dAC.content.prepend(this.animatedMedia.container);\r\n\r\n this.animatedCounter = new AnimatedCounter(true);\r\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\r\n\r\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\r\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\r\n dAC.container.prepend(btnClose);\r\n\r\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\r\n\r\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\r\n\r\n attachClickEvent(this.btnOpen, (e) => {\r\n cancelEvent(e);\r\n this.topbar.openPinned(true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\r\n if(peerId === this.topbar.peerId) {\r\n //this.wasPinnedIndex = 0;\r\n //setTimeout(() => {\r\n if(this.hidden) {\r\n this.pinnedMessageContainer.toggle(this.hidden = false);\r\n }\r\n\r\n this.loadedTop = this.loadedBottom = false;\r\n this.pinnedIndex = -1;\r\n this.pinnedMid = 0;\r\n this.count = 0;\r\n this.mids = [];\r\n this.offsetIndex = 0;\r\n this.pinnedMaxMid = 0;\r\n this.setCorrectIndex(0);\r\n //}, 300);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\r\n if(peerId === this.topbar.peerId) {\r\n this.pinnedMessageContainer.toggle(this.hidden = true);\r\n }\r\n });\r\n\r\n // * 200 - no lags\r\n // * 100 - need test\r\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\r\n\r\n this.isStatic = this.chat.type === 'discussion';\r\n }\r\n\r\n public destroy() {\r\n this.pinnedMessageContainer.divAndCaption.container.remove();\r\n this.pinnedMessageContainer.toggle(true);\r\n this.listenerSetter.removeAll();\r\n this.unsetScrollDownListener(false);\r\n }\r\n\r\n public setCorrectIndex(lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n //return;\r\n\r\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\r\n return;\r\n }\r\n\r\n if((this.loadedBottom || this.loadedTop) && !this.count) {\r\n return;\r\n }\r\n\r\n //const perf = performance.now();\r\n let el = this.chat.bubbles.getBubbleByPoint('bottom');\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(!el) return;\r\n\r\n //return;\r\n\r\n const mid = el.dataset.mid;\r\n if(el && mid !== undefined) {\r\n //this.chat.log('[PM]: setCorrectIndex will test mid:', mid);\r\n this.testMid(+mid, lastScrollDirection);\r\n }\r\n }\r\n\r\n public testMid(mid: number, lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n \r\n //if(lastScrollDirection !== undefined) return;\r\n if(this.hidden) return;\r\n\r\n //this.chat.log('[PM]: testMid', mid);\r\n\r\n let currentIndex: number = this.mids.findIndex(_mid => _mid <= mid);\r\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\r\n currentIndex += this.offsetIndex;\r\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\r\n //currentIndex = 0;\r\n currentIndex = this.mids.length - 1 + this.offsetIndex;\r\n } else {\r\n if(!this.getCurrentIndexPromise) {\r\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\r\n }\r\n\r\n return;\r\n }\r\n\r\n //const idx = Math.max(0, this.mids.indexOf(mid));\r\n\r\n /* if(currentIndex === this.count) {\r\n currentIndex = 0;\r\n } */\r\n\r\n //this.chat.log('[PM]: testMid: pinned currentIndex', currentIndex, mid);\r\n\r\n const changed = this.pinnedIndex !== currentIndex;\r\n if(changed) {\r\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\r\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\r\n return;\r\n }\r\n }\r\n\r\n this.pinnedIndex = currentIndex;\r\n this.pinnedMid = this.mids.find(_mid => _mid <= mid) || this.mids[this.mids.length - 1];\r\n this.setPinnedMessage();\r\n }\r\n }\r\n\r\n private isNeededMore(currentIndex: number) {\r\n return (this.count > ChatPinnedMessage.LOAD_COUNT && \r\n (\r\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) || \r\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\r\n )\r\n );\r\n }\r\n\r\n private async getCurrentIndex(mid: number, correctAfter = true) {\r\n if(this.loading) return;\r\n this.loading = true;\r\n\r\n try {\r\n let gotRest = false;\r\n const promises = [\r\n this.appMessagesManager.getSearch({\r\n peerId: this.topbar.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId: mid, \r\n limit: ChatPinnedMessage.LOAD_COUNT, \r\n backLimit: ChatPinnedMessage.LOAD_COUNT\r\n })\r\n .then(r => {\r\n gotRest = true;\r\n return r;\r\n })\r\n ];\r\n \r\n if(!this.pinnedMaxMid) {\r\n const promise = this.appMessagesManager.getPinnedMessage(this.topbar.peerId).then(p => {\r\n if(!p.maxId) return;\r\n this.pinnedMaxMid = p.maxId;\r\n\r\n if(!gotRest && correctAfter) {\r\n this.mids = [this.pinnedMaxMid];\r\n this.count = p.count;\r\n this.pinnedIndex = 0;\r\n this.pinnedMid = this.mids[0];\r\n this.setPinnedMessage();\r\n //this.pinnedMessageContainer.toggle(false);\r\n }\r\n });\r\n \r\n promises.push(promise as any);\r\n }\r\n \r\n const result = (await Promise.all(promises))[0];\r\n \r\n let backLimited = result.history.findIndex(message => message.mid <= mid);\r\n if(backLimited === -1) {\r\n backLimited = result.history.length;\r\n }/* else {\r\n backLimited -= 1;\r\n } */\r\n \r\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\r\n this.mids = result.history.map(message => message.mid).slice();\r\n this.count = result.count;\r\n\r\n if(!this.count) {\r\n this.pinnedMessageContainer.toggle(true);\r\n }\r\n \r\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\r\n this.loadedBottom = !this.offsetIndex;\r\n \r\n this.debug && this.chat.log('[PM]: getCurrentIndex result:', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\r\n } catch(err) {\r\n this.chat.log.error('[PM]: getCurrentIndex error', err);\r\n }\r\n \r\n this.loading = false;\r\n\r\n if(this.locked) {\r\n this.testMid(mid);\r\n } else if(correctAfter) {\r\n this.setCorrectIndex(0);\r\n }\r\n\r\n this.getCurrentIndexPromise = null;\r\n //return result.offset_id_offset || 0;\r\n }\r\n\r\n public setScrollDownListener() {\r\n this.waitForScrollBottom = true;\r\n\r\n if(!this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter = new ListenerSetter();\r\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\r\n this.unsetScrollDownListener();\r\n }, this.scrollDownListenerSetter);\r\n }\r\n }\r\n\r\n public unsetScrollDownListener(refreshPosition = true) {\r\n this.waitForScrollBottom = false;\r\n\r\n if(this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter.removeAll();\r\n this.scrollDownListenerSetter = null;\r\n }\r\n\r\n if(refreshPosition) {\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async handleFollowingPinnedMessage() {\r\n this.locked = true;\r\n\r\n this.debug && this.chat.log('[PM]: handleFollowingPinnedMessage');\r\n try {\r\n this.setScrollDownListener();\r\n\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise instanceof Promise) {\r\n await setPeerPromise;\r\n }\r\n \r\n //await this.chat.bubbles.scrollable.scrollLockedPromise;\r\n await getHeavyAnimationPromise();\r\n\r\n if(this.getCurrentIndexPromise) {\r\n await this.getCurrentIndexPromise;\r\n }\r\n\r\n this.debug && this.chat.log('[PM]: handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n\r\n /* // подождём, пока скролл остановится\r\n setTimeout(() => {\r\n this.chat.log('[PM]: handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n }, 50); */\r\n } catch(err) {\r\n this.chat.log.error('[PM]: handleFollowingPinnedMessage error:', err);\r\n\r\n this.locked = false;\r\n this.waitForScrollBottom = false;\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async followPinnedMessage(mid: number) {\r\n const message = this.chat.getMessage(mid);\r\n if(message && !message.deleted) {\r\n this.chat.setMessageId(mid);\r\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\r\n this.handleFollowingPinnedMessage();\r\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\r\n });\r\n }\r\n }\r\n\r\n public async _setPinnedMessage() {\r\n /////this.log('setting pinned message', message);\r\n //return;\r\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\r\n Promise.all([\r\n promise\r\n ]).then(() => { */\r\n //const mids = results[0];\r\n const count = this.count;\r\n if(count) {\r\n const pinnedIndex = this.pinnedIndex;\r\n const message = this.chat.getMessage(this.pinnedMid);\r\n\r\n //this.animatedCounter.prepareNumber(count);\r\n\r\n //setTimeout(() => {\r\n const isLast = pinnedIndex === 0;\r\n this.animatedCounter.container.classList.toggle('is-last', isLast);\r\n //SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\r\n if(!isLast) {\r\n this.animatedCounter.setCount(count - pinnedIndex);\r\n }\r\n //}, 100);\r\n\r\n //this.pinnedMessageContainer.fill(undefined, message.message, message);\r\n this.pinnedMessageContainer.toggle(false);\r\n\r\n const fromTop = pinnedIndex > this.wasPinnedIndex;\r\n\r\n this.debug && this.chat.log('[PM]: setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\r\n\r\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\r\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\r\n writeMediaTo.classList.add('pinned-message-media');\r\n //writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\r\n const loadPromises: Promise[] = [];\r\n const isMediaSet = wrapReplyDivAndCaption({\r\n title: undefined,\r\n titleEl: null,\r\n subtitle: message.message,\r\n subtitleEl: writeTo,\r\n message,\r\n mediaEl: writeMediaTo,\r\n loadPromises\r\n });\r\n\r\n await Promise.all(loadPromises);\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\r\n\r\n //if(this.wasPinnedIndex !== this.pinnedIndex) {\r\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\r\n if(isMediaSet) {\r\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\r\n this.wasPinnedMediaIndex = pinnedIndex;\r\n } else {\r\n this.animatedMedia.clearRows();\r\n }\r\n //}\r\n\r\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\r\n this.wasPinnedIndex = pinnedIndex;\r\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\r\n } else {\r\n this.pinnedMessageContainer.toggle(true);\r\n this.wasPinnedIndex = 0;\r\n }\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\r\n //});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n let lastY: number;\r\n const options = {passive: true};\r\n listenerSetter.add(elem)('touchstart', (e) => {\r\n if(e.touches.length > 1) {\r\n onTouchEnd();\r\n return;\r\n }\r\n\r\n lastY = e.touches[0].clientY;\r\n\r\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\r\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\r\n }, options);\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n const clientY = e.touches[0].clientY;\r\n\r\n const isDown = clientY < lastY;\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n lastY = clientY;\r\n //alert('isDown: ' + !!isDown);\r\n };\r\n \r\n const onTouchEnd = () => {\r\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\r\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\r\n };\r\n } else {\r\n listenerSetter.add(elem)('wheel', (e) => {\r\n const isDown = e.deltaY > 0;\r\n //this.log('wheel', e, isDown);\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppNotificationsManager } from \"../../lib/appManagers/appNotificationsManager\";\nimport type { AppChatsManager, Channel } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport type { AppSidebarRight } from \"../sidebarRight\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type Chat from \"./chat\";\nimport { RIGHT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarRight\";\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport rootScope from \"../../lib/rootScope\";\nimport AvatarElement from \"../avatar\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport ChatAudio from \"./audio\";\nimport ChatPinnedMessage from \"./pinnedMessage\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport appStateManager from \"../../lib/appManagers/appStateManager\";\nimport PopupDeleteDialog from \"../popups/deleteDialog\";\nimport appNavigationController from \"../appNavigationController\";\nimport { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarLeft\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport { toast, toastNew } from \"../toast\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { ChatFull } from \"../../layer\";\nimport PopupPickUser from \"../popups/pickUser\";\nimport PopupPeer from \"../popups/peer\";\nimport generateVerifiedIcon from \"../generateVerifiedIcon\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport AppEditContactTab from \"../sidebarRight/tabs/editContact\";\nimport appMediaPlaybackController from \"../appMediaPlaybackController\";\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\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 btnMute: HTMLButtonElement;\n private btnSearch: HTMLButtonElement;\n private btnMore: HTMLButtonElement;\n \n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n public peerId: PeerId;\n private wasPeerId: PeerId;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[] = [];\n\n constructor(private chat: Chat, \n private appSidebarRight: AppSidebarRight, \n private appMessagesManager: AppMessagesManager, \n private appPeersManager: AppPeersManager, \n private appChatsManager: AppChatsManager, \n private appNotificationsManager: AppNotificationsManager,\n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager\n ) {\n this.listenerSetter = new ListenerSetter();\n }\n\n public construct() {\n //this.chat.log.error('Topbar construction');\n\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-header', 'topbar');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n\n // * chat info section\n this.chatInfo = document.createElement('div');\n this.chatInfo.classList.add('chat-info');\n\n const person = document.createElement('div');\n person.classList.add('person');\n\n const content = document.createElement('div');\n content.classList.add('content');\n\n const top = document.createElement('div');\n top.classList.add('top');\n\n this.title = document.createElement('div');\n this.title.classList.add('user-title');\n\n top.append(this.title);\n\n const bottom = document.createElement('div');\n bottom.classList.add('bottom');\n\n if(this.subtitle) {\n bottom.append(this.subtitle);\n }\n\n content.append(top, bottom);\n if(this.avatarElement) {\n person.append(this.avatarElement);\n }\n\n person.append(content);\n this.chatInfo.append(person);\n\n // * chat utils section\n this.chatUtils = document.createElement('div');\n this.chatUtils.classList.add('chat-utils');\n\n this.chatAudio = new ChatAudio(this, this.chat, this.appMessagesManager);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({listenerSetter: this.listenerSetter}, 'bottom-left', this.menuButtons, (e) => {\n cancelEvent(e);\n this.menuButtons.forEach(button => {\n button.element.classList.toggle('hide', !button.verify());\n });\n\n // delete button\n this.menuButtons[this.menuButtons.length - 1].element.lastChild.replaceWith(i18n(this.appPeersManager.getDeleteButtonText(this.peerId)));\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.btnMute, \n this.btnSearch, \n this.btnMore\n ].filter(Boolean));\n\n this.container.append(this.btnBack, this.chatInfo, this.chatUtils);\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: HTMLElement = 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 mid, \n searchContext.isScheduled ? 'scheduled' : (searchContext.threadId ? 'discussion' : undefined), \n 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(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 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: () => {\n this.appMessagesManager.mutePeer(this.peerId);\n },\n verify: () => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !this.appNotificationsManager.isPeerLocalMuted(this.peerId, false)\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.appMessagesManager.mutePeer(this.peerId);\n },\n verify: () => this.chat.type === 'chat' && rootScope.myId !== this.peerId && this.appNotificationsManager.isPeerLocalMuted(this.peerId, false)\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n this.appProfileManager.getChannelFull(this.peerId.toChatId()).then(channelFull => {\n if(channelFull.linked_chat_id) {\n this.chat.appImManager.setInnerPeer(channelFull.linked_chat_id.toPeerId(true));\n }\n });\n },\n verify: () => {\n const chatFull = this.appProfileManager.chatsFull[this.peerId.toChatId()];\n return this.chat.type === 'chat' && this.appPeersManager.isBroadcast(this.peerId) && !!(chatFull as ChatFull.channelFull)?.linked_chat_id;\n }\n }, {\n icon: 'select',\n text: 'Chat.Menu.SelectMessages',\n onClick: () => {\n const selection = this.chat.selection;\n selection.toggleSelection(true, true);\n appStateManager.getState().then(state => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = (bubble) => {\n appStateManager.pushToState('chatContextMenuHintWasShown', true);\n toast(i18n('Chat.Menu.Hint'));\n\n selection.toggleByElement = original;\n selection.toggleByElement(bubble);\n };\n });\n },\n verify: () => !this.chat.selection.isSelecting && !!Object.keys(this.chat.bubbles.bubbles).length\n }, {\n icon: 'select',\n text: 'Chat.Menu.ClearSelection',\n onClick: () => {\n this.chat.selection.cancelSelection();\n },\n verify: () => this.chat.selection.isSelecting\n }, {\n icon: 'adduser',\n text: 'AddContact',\n onClick: () => {\n if(!this.appSidebarRight.isTabExists(AppEditContactTab)) {\n const tab = new AppEditContactTab(this.appSidebarRight);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: () => this.peerId.isUser() && !this.appPeersManager.isContact(this.peerId)\n }, {\n icon: 'forward',\n text: 'ShareContact',\n onClick: () => {\n const contactPeerId = this.peerId;\n new PopupPickUser({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: (peerId) => {\n return new Promise((resolve, reject) => {\n new PopupPeer('', {\n titleLangKey: 'SendMessageTitle',\n descriptionLangKey: 'SendContactToGroupText',\n descriptionLangArgs: [new PeerTitle({peerId, dialog: true}).element],\n buttons: [{\n langKey: 'Send',\n callback: () => {\n resolve();\n\n this.appMessagesManager.sendOther(peerId, this.appUsersManager.getContactMediaInput(contactPeerId));\n this.chat.appImManager.setInnerPeer(peerId);\n }\n }, {\n langKey: 'Cancel',\n callback: () => {\n reject();\n },\n isCancel: true,\n }],\n peerId,\n overlayClosable: true\n }).show();\n });\n },\n placeholder: 'ShareModal.Search.Placeholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n },\n verify: () => rootScope.myId !== this.peerId && this.peerId.isUser() && this.appPeersManager.isContact(this.peerId)\n }, {\n icon: 'lock',\n text: 'BlockUser',\n onClick: () => {\n new PopupPeer('', {\n peerId: this.peerId,\n titleLangKey: 'BlockUser',\n descriptionLangKey: 'AreYouSureBlockContact2',\n descriptionLangArgs: [new PeerTitle({peerId: this.peerId}).element],\n buttons: [{\n langKey: 'BlockUser',\n isDanger: true,\n callback: () => {\n this.appUsersManager.toggleBlock(this.peerId, true).then(value => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: () => {\n const userId = this.peerId.toUserId();\n const userFull = this.appProfileManager.usersFull[userId];\n return this.appPeersManager.isUser(this.peerId) && this.peerId !== rootScope.myId && userFull && !userFull.pFlags?.blocked;\n }\n }, {\n icon: 'lockoff',\n text: 'Unblock',\n onClick: () => {\n this.appUsersManager.toggleBlock(this.peerId, false).then(value => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: () => {\n const userFull = this.appProfileManager.usersFull[this.peerId.toUserId()];\n return this.appPeersManager.isUser(this.peerId) && !!userFull?.pFlags?.blocked;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: () => {\n new PopupDeleteDialog(this.peerId/* , 'leave' */);\n },\n verify: () => this.chat.type === 'chat' && !!this.appMessagesManager.getDialogOnly(this.peerId)\n }];\n\n this.btnSearch = ButtonIcon('search');\n attachClickEvent(this.btnSearch, (e) => {\n cancelEvent(e);\n this.chat.initSearch();\n }, {listenerSetter: this.listenerSetter});\n }\n\n public constructPeerHelpers() {\n this.avatarElement = new AvatarElement();\n this.avatarElement.setAttribute('dialog', '1');\n //this.avatarElement.setAttribute('clickable', '');\n this.avatarElement.classList.add('avatar-42', 'person-avatar');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n\n this.btnJoin = Button('btn-primary btn-color-primary chat-join hide');\n this.btnPinned = ButtonIcon('pinlist');\n this.btnMute = ButtonIcon('mute');\n\n attachClickEvent(this.btnPinned, (e) => {\n cancelEvent(e);\n blurActiveElement();\n this.openPinned(true);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.btnMute, (e) => {\n cancelEvent(e);\n blurActiveElement();\n this.appMessagesManager.mutePeer(this.peerId);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.btnJoin, (e) => {\n cancelEvent(e);\n\n blurActiveElement();\n const middleware = this.chat.bubbles.getMiddleware();\n this.btnJoin.setAttribute('disabled', 'true');\n\n const chatId = this.peerId.toChatId();\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, rootScope.myId);\n }\n\n promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.btnJoin.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = this.appChatsManager.getChat(chatId) as Channel/* | Chat */;\n \n this.btnJoin.classList.toggle('hide', !(chat as Channel)?.pFlags?.left);\n this.setUtilsWidth();\n }\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) {\n this.setPeerStatus();\n }\n });\n\n if(this.pinnedMessage) {\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n appStateManager.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[this.chat.peerId];\n \n if(isTopMessage) {\n this.pinnedMessage.unsetScrollDownListener();\n this.pinnedMessage.testMid(mid, 0); // * because slider will not let get bubble by document.elementFromPoint\n } else if(!this.pinnedMessage.locked) {\n this.pinnedMessage.handleFollowingPinnedMessage();\n this.pinnedMessage.testMid(mid);\n }\n });\n });\n }\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public constructPinnedHelpers() {\n this.listenerSetter.add(rootScope)('peer_pinned_messages', (e) => {\n const {peerId, mids, pinned} = e;\n\n if(peerId !== this.peerId) return;\n\n if(mids) {\n this.setTitle();\n }\n });\n }\n \n public constructDiscussionHelpers() {\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n }\n\n public openPinned(byCurrent: boolean) {\n this.chat.appImManager.setInnerPeer(this.peerId, byCurrent ? +this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid : 0, 'pinned');\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\n this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n \n if(this.pinnedMessage) {\n this.pinnedMessage.destroy(); // * возможно это можно не делать\n }\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public setPeer(peerId: PeerId) {\n this.wasPeerId = this.peerId;\n this.peerId = peerId;\n\n this.container.style.display = peerId ? '' : 'none';\n }\n\n public finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number) {\n const peerId = this.peerId;\n\n if(this.avatarElement) {\n this.avatarElement.setAttribute('peer', '' + peerId);\n this.avatarElement.update();\n }\n\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast);\n if(this.appPeersManager.isAnyChat(peerId)) {\n if(this.btnJoin) {\n const chatId = peerId.toChatId();\n replaceContent(this.btnJoin, i18n(this.appChatsManager.isChannel(chatId) ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !this.appChatsManager.getChat(chatId)?.pFlags?.left);\n }\n }\n \n this.setUtilsWidth();\n\n const middleware = this.chat.bubbles.getMiddleware();\n if(this.pinnedMessage) { // * replace with new one\n if(this.chat.type === 'chat') {\n if(this.wasPeerId !== undefined) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n //this.pinnedMessage.pinnedMessageContainer.toggle(true);\n this.pinnedMessage = newPinnedMessage;\n }\n \n appStateManager.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\n \n if(!isTarget) {\n this.pinnedMessage.setCorrectIndex(0);\n }\n });\n } else if(this.chat.type === 'discussion') {\n this.pinnedMessage.pinnedMid = this.chat.threadId;\n this.pinnedMessage.count = 1;\n this.pinnedMessage.pinnedIndex = 0;\n this.pinnedMessage._setPinnedMessage();\n }\n }\n\n fastRaf(() => {\n this.setTitle();\n this.setPeerStatus(true);\n this.setMutedState();\n });\n }\n\n public setTitle(count?: number) {\n let titleEl: HTMLElement;\n if(this.chat.type === 'pinned') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('PinnedMessagesCount', [count]);\n\n if(count === undefined) {\n this.appMessagesManager.getSearchCounters(this.peerId, [{_: 'inputMessagesFilterPinned'}], false).then(result => {\n const count = result[0].count;\n this.setTitle(count);\n\n // ! костыль х2, это нужно делать в другом месте\n if(!count) {\n this.chat.appImManager.setPeer(NULL_PEER_ID); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n }\n });\n }\n } else if(this.chat.type === 'scheduled') {\n if(this.peerId === rootScope.myId) {\n //title = [count > 1 ? count : false, 'Reminders'].filter(Boolean).join(' ');\n titleEl = i18n('Reminders');\n } else {\n titleEl = i18n('ScheduledMessages');\n //title = [count > 1 ? count : false, 'Scheduled Messages'].filter(Boolean).join(' ');\n }\n \n if(count === undefined) {\n this.appMessagesManager.getScheduledMessages(this.peerId).then(mids => {\n this.setTitle(mids.length);\n });\n }\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n\n if(count === undefined) {\n Promise.all([\n this.appMessagesManager.getHistory(this.peerId, 0, 1, 0, this.chat.threadId),\n Promise.resolve()\n ]).then(() => {\n const count = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId).count;\n if(count === null) {\n setTimeout(() => {\n this.setTitle();\n }, 30);\n } else {\n this.setTitle(count);\n }\n });\n }\n } else if(this.chat.type === 'chat') {\n titleEl = new PeerTitle({\n peerId: this.peerId,\n dialog: true,\n }).element;\n }\n \n replaceContent(this.title, titleEl);\n\n if(this.chat.type === 'chat') {\n const peer = this.appPeersManager.getPeer(this.peerId);\n if(peer?.pFlags?.verified) {\n this.title.append(generateVerifiedIcon());\n }\n }\n }\n\n public setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n let muted = this.appNotificationsManager.isPeerLocalMuted(peerId, false);\n if(this.appPeersManager.isBroadcast(peerId)) { // not human\n this.btnMute.classList.remove('tgico-mute', 'tgico-unmute');\n this.btnMute.classList.add(muted ? 'tgico-unmute' : 'tgico-mute');\n this.btnMute.style.display = '';\n } else {\n this.btnMute.style.display = 'none';\n }\n }\n\n // ! У МЕНЯ ПРОСТО СГОРЕЛО, САФАРИ КОНЧЕННЫЙ БРАУЗЕР - ЕСЛИ НЕ СКРЫВАТЬ БЛОК, ТО ПРИ ПЕРЕВОРОТЕ ЭКРАНА НА АЙФОНЕ БЛОК БУДЕТ НЕПРАВИЛЬНО ШИРИНЫ, ДАЖЕ БЕЗ ЭТОЙ ФУНКЦИИ!\n public setUtilsWidth = (resize = false) => {\n //return;\n if(this.setUtilsRAF) window.cancelAnimationFrame(this.setUtilsRAF);\n\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.add('hide');\n }\n\n //mutationObserver.disconnect();\n this.setUtilsRAF = window.requestAnimationFrame(() => {\n \n //mutationRAF = window.requestAnimationFrame(() => {\n \n //setTimeout(() => {\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.remove('hide');\n }\n /* this.chatInfo.style.removeProperty('--utils-width');\n void this.chatInfo.offsetLeft; // reflow */\n const width = /* chatUtils.scrollWidth */this.chatUtils.getBoundingClientRect().width;\n this.chat.log('utils width:', width);\n this.container.style.setProperty('--utils-width', width + 'px');\n //this.chatInfo.classList.toggle('have-utils-width', !!width);\n //}, 0);\n \n this.setUtilsRAF = 0;\n\n //mutationObserver.observe(chatUtils, observeOptions);\n //});\n });\n };\n\n public setFloating = () => {\n const containers = [this.chatAudio, this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.divAndCaption.container.classList.contains('is-floating');\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatus = (needClear = false) => {\n if(!this.subtitle) return;\n\n const peerId = this.peerId;\n this.chat.appImManager.setPeerStatus(this.peerId, this.subtitle, needClear, false, () => peerId === this.peerId);\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarRight from \"..\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport AppSearch, { SearchGroup } from \"../../appSearch\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport PopupDatePicker from \"../../popups/datePicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppPrivateSearchTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private appSearch: AppSearch;\r\n private btnPickDate: HTMLElement;\r\n\r\n private peerId: PeerId;\r\n private threadId = 0;\r\n private query = '';\r\n private onDatePick: (timestamp: number) => void;\r\n\r\n onOpenAfterTimeout() {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\r\n }\r\n\r\n protected init() {\r\n this.container.id = 'search-private-container';\r\n this.container.classList.add('chatlist-container');\r\n this.inputSearch = new InputSearch('Search');\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\r\n this.header.append(this.btnPickDate);\r\n\r\n const c = document.createElement('div');\r\n c.classList.add('chatlist-container');\r\n this.scrollable.container.replaceWith(c);\r\n this.appSearch = new AppSearch(c, this.inputSearch, {\r\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\r\n });\r\n }\r\n\r\n open(peerId: PeerId, threadId?: number, onDatePick?: AppPrivateSearchTab['onDatePick'], query?: string) {\r\n const ret = super.open();\r\n\r\n if(!this.peerId) {\r\n this.query = query;\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n this.onDatePick = onDatePick;\r\n \r\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\r\n if(this.onDatePick) {\r\n attachClickEvent(this.btnPickDate, () => {\r\n new PopupDatePicker(new Date(), this.onDatePick).show();\r\n });\r\n }\r\n\r\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\r\n \r\n appSidebarRight.toggleSidebar(true);\r\n } else {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\r\n }\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatTopbar from \"./topbar\";\r\nimport AppSearch, { SearchGroup } from \"../appSearch\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport { ripple } from \"../ripple\";\r\nimport InputSearch from \"../inputSearch\";\r\nimport type Chat from \"./chat\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport { i18n } from \"../../lib/langPack\";\r\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\r\n constructor(private topbar: ChatTopbar, private chat: Chat, private 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 this.backBtn.addEventListener('click', () => {\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.footer.removeEventListener('click', this.onFooterClick);\r\n this.dateBtn.removeEventListener('click', this.onDateClick);\r\n this.upBtn.removeEventListener('click', this.onUpClick);\r\n this.downBtn.removeEventListener('click', this.onDownClick);\r\n this.searchGroup.list.removeEventListener('click', this.onResultsClick);\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n }, {once: true});\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 this.searchGroup.list.addEventListener('click', 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 this.foundCountEl.replaceWith(this.inputSearch.value ? i18n('NoResult') : '');\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\r\n }\r\n });\r\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\r\n\r\n //appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\r\n this.chat.bubbles.bubblesContainer.append(this.results);\r\n\r\n // Footer\r\n this.footer = document.createElement('div');\r\n this.footer.classList.add('chat-search-footer');\r\n\r\n this.footer.addEventListener('click', 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 this.dateBtn.addEventListener('click', this.onDateClick);\r\n this.upBtn.addEventListener('click', this.onUpClick);\r\n this.downBtn.addEventListener('click', 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 query && (this.inputSearch.inputField.value = query);\r\n }\r\n\r\n onDateClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n new PopupDatePicker(new Date(), this.chat.bubbles.onDatePick).show();\r\n };\r\n\r\n selectResult = (elem: HTMLElement) => {\r\n if(this.setPeerPromise) return this.setPeerPromise;\r\n\r\n const peerId = elem.dataset.peerId.toPeerId();\r\n const lastMsgId = +elem.dataset.mid || undefined;\r\n\r\n const index = whichChild(elem);\r\n\r\n if(index === (this.foundCount - 1)) {\r\n this.upBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.upBtn.removeAttribute('disabled');\r\n }\r\n\r\n if(!index) {\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.downBtn.removeAttribute('disabled');\r\n }\r\n\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n\r\n const res = this.chat.setPeer(peerId, lastMsgId);\r\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\r\n this.selectedIndex = index;\r\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\r\n\r\n const renderedCount = this.searchGroup.list.childElementCount;\r\n if(this.selectedIndex >= (renderedCount - 6)) {\r\n this.appSearch.searchMore();\r\n }\r\n }).finally(() => {\r\n this.setPeerPromise = null;\r\n });\r\n };\r\n\r\n onResultsClick = (e: MouseEvent) => {\r\n const target = findUpTag(e.target, 'LI');\r\n if(target) {\r\n this.selectResult(target);\r\n }\r\n };\r\n\r\n onFooterClick = (e: MouseEvent) => {\r\n if(this.foundCount) {\r\n this.chat.bubbles.bubblesContainer.classList.toggle('search-results-active');\r\n this.results.classList.toggle('active');\r\n }\r\n };\r\n\r\n 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 onDownClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\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 { AppNotificationsManager } from \"../../lib/appManagers/appNotificationsManager\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppDocsManager } from \"../../lib/appManagers/appDocsManager\";\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport type { AppPhotosManager } from \"../../lib/appManagers/appPhotosManager\";\nimport type { AppPollsManager } from \"../../lib/appManagers/appPollsManager\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\nimport type { ApiManagerProxy } from \"../../lib/mtproto/mtprotoworker\";\nimport type { AppDraftsManager } from \"../../lib/appManagers/appDraftsManager\";\nimport type { AppEmojiManager } from \"../../lib/appManagers/appEmojiManager\";\nimport type { ServerTimeManager } from \"../../lib/mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\nimport type { State } from \"../../lib/appManagers/appStateManager\";\nimport type stateStorage from '../../lib/stateStorage';\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport { logger, LogTypes } from \"../../lib/logger\";\nimport rootScope from \"../../lib/rootScope\";\nimport appSidebarRight from \"../sidebarRight\";\nimport ChatBubbles from \"./bubbles\";\nimport ChatContextMenu from \"./contextMenu\";\nimport ChatInput from \"./input\";\nimport ChatSelection from \"./selection\";\nimport ChatTopbar from \"./topbar\";\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\nimport SetTransition from \"../singleTransition\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport AppPrivateSearchTab from \"../sidebarRight/tabs/search\";\nimport renderImageFromUrl from \"../../helpers/dom/renderImageFromUrl\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport ChatSearch from \"./search\";\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\n public wasAlreadyUsed = false;\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 = 'chat';\n\n public noAutoDownloadMedia: boolean;\n\n public inited = false;\n \n constructor(public appImManager: AppImManager, \n public appChatsManager: AppChatsManager, \n public appDocsManager: AppDocsManager, \n public appInlineBotsManager: AppInlineBotsManager, \n public appMessagesManager: AppMessagesManager, \n public appPeersManager: AppPeersManager, \n public appPhotosManager: AppPhotosManager, \n public appProfileManager: AppProfileManager, \n public appStickersManager: AppStickersManager, \n public appUsersManager: AppUsersManager, \n public appWebPagesManager: AppWebPagesManager, \n public appPollsManager: AppPollsManager, \n public apiManager: ApiManagerProxy, \n public appDraftsManager: AppDraftsManager, \n public serverTimeManager: ServerTimeManager, \n public storage: typeof stateStorage, \n public appNotificationsManager: AppNotificationsManager,\n public appEmojiManager: AppEmojiManager,\n public appMessagesIdsManager: AppMessagesIdsManager\n ) {\n super();\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.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n }\n\n public setBackground(url: string): Promise {\n const theme = rootScope.getTheme();\n\n let item: HTMLElement;\n if(theme.background.type === 'color' && document.documentElement.style.cursor === 'grabbing') {\n const _item = this.backgroundEl.lastElementChild as HTMLElement;\n if(_item && _item.dataset.type === theme.background.type) {\n item = _item;\n }\n }\n \n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n item.dataset.type = theme.background.type;\n }\n\n if(theme.background.type === 'color') {\n item.style.backgroundColor = theme.background.color;\n item.style.backgroundImage = 'none';\n }\n\n return new Promise((resolve) => {\n const cb = () => {\n const prev = this.backgroundEl.lastElementChild as HTMLElement;\n\n if(prev === item) {\n resolve();\n return;\n }\n\n this.backgroundEl.append(item);\n\n // * одного недостаточно, при обновлении страницы все равно фон появляется неплавно\n // ! с requestAnimationFrame лучше, но все равно иногда моргает, так что использую два фаста.\n fastRaf(() => {\n fastRaf(() => {\n SetTransition(item, 'is-visible', true, 200, prev ? () => {\n prev.remove();\n } : null);\n });\n });\n\n resolve();\n };\n\n if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n }\n\n public setType(type: ChatType) {\n this.type = type;\n\n if(this.type === 'scheduled') {\n this.getMessagesStorage = () => this.appMessagesManager.getScheduledMessagesStorage(this.peerId);\n //this.getMessage = (mid) => this.appMessagesManager.getMessageFromStorage(this.appMessagesManager.getScheduledMessagesStorage(this.peerId), mid);\n }\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.appMessagesManager, this.appPeersManager, this.appChatsManager, this.appNotificationsManager, this.appProfileManager, this.appUsersManager);\n this.bubbles = new ChatBubbles(this, this.appMessagesManager, this.appStickersManager, this.appUsersManager, this.appInlineBotsManager, this.appPhotosManager, this.appPeersManager, this.appProfileManager, this.appDraftsManager, this.appMessagesIdsManager);\n this.input = new ChatInput(this, this.appMessagesManager, this.appMessagesIdsManager, this.appDocsManager, this.appChatsManager, this.appPeersManager, this.appWebPagesManager, this.appImManager, this.appDraftsManager, this.serverTimeManager, this.appNotificationsManager, this.appEmojiManager, this.appUsersManager, this.appInlineBotsManager);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.appMessagesManager);\n this.contextMenu = new ChatContextMenu(this.bubbles.bubblesContainer, this, this.appMessagesManager, this.appPeersManager, this.appPollsManager, this.appDocsManager, this.appMessagesIdsManager);\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 this.container.classList.add('type-' + this.type);\n this.container.append(this.topbar.container, this.bubbles.bubblesContainer, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer(migrateTo);\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (e) => {\n if(e.peerId === this.peerId) {\n this.appImManager.setPeer(NULL_PEER_ID);\n }\n });\n }\n\n public beforeDestroy() {\n this.bubbles.cleanup();\n }\n\n public destroy() {\n //const perf = performance.now();\n\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n\n delete this.topbar;\n delete this.bubbles;\n delete this.input;\n delete this.selection;\n delete this.contextMenu;\n\n this.container.remove();\n\n //this.log.error('Chat destroy time:', performance.now() - perf);\n }\n\n public cleanup(helperToo = true) {\n this.input.cleanup(helperToo);\n this.selection.cleanup();\n }\n\n public setPeer(peerId: PeerId, lastMsgId?: number) {\n if(!peerId) {\n this.inited = false;\n } else if(!this.inited) {\n if(this.init) {\n this.init(/* peerId */);\n this.init = null;\n }\n\n this.inited = true;\n }\n\n const samePeer = this.peerId === peerId;\n if(!samePeer) {\n rootScope.dispatchEvent('peer_changing', this);\n this.peerId = peerId;\n } else if(this.setPeerPromise) {\n return;\n }\n\n //console.time('appImManager setPeer');\n //console.time('appImManager setPeer pre promise');\n ////console.time('appImManager: pre render start');\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.topbar.setPeer(peerId);\n this.bubbles.setPeer(peerId);\n rootScope.dispatchEvent('peer_changed', peerId);\n\n return;\n }\n\n // set new\n if(!samePeer) {\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n\n appSidebarRight.sharedMediaTab.setPeer(peerId, this.threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n this.setAutoDownloadMedia();\n }\n\n this.peerChanged = samePeer;\n\n const result = this.bubbles.setPeer(peerId, lastMsgId);\n if(!result) {\n return;\n }\n\n const {promise} = result;\n\n //console.timeEnd('appImManager setPeer pre promise');\n \n const setPeerPromise = this.setPeerPromise = promise.finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n if(!samePeer) {\n appSidebarRight.sharedMediaTab.setLoadMutex(this.setPeerPromise);\n appSidebarRight.sharedMediaTab.loadSidebarMedia(true);\n }\n /* this.setPeerPromise.then(() => {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(false);\n }); */\n\n return result;\n }\n\n public setAutoDownloadMedia() {\n const peerId = this.peerId;\n if(!peerId) {\n return;\n }\n\n let type: keyof State['settings']['autoDownload'];\n\n if(!peerId.isUser()) {\n if(peerId.isBroadcast()) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n } else {\n if(peerId.isContact()) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n }\n\n this.noAutoDownloadMedia = !rootScope.settings.autoDownload[type];\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer(this.peerId, messageId);\n }\n\n public finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number) {\n if(this.peerChanged) return;\n\n let peerId = this.peerId;\n this.peerChanged = true;\n\n this.cleanup(false);\n\n this.topbar.setPeer(peerId);\n this.topbar.finishPeerChange(isTarget, isJump, lastMsgId);\n this.bubbles.finishPeerChange();\n this.input.finishPeerChange();\n\n appSidebarRight.sharedMediaTab.fillProfileElements();\n\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n rootScope.dispatchEvent('peer_changed', peerId);\n this.wasAlreadyUsed = true;\n }\n\n public getMessagesStorage() {\n return this.appMessagesManager.getMessagesStorage(this.peerId);\n }\n\n public getMessage(mid: number) {\n return this.appMessagesManager.getMessageFromStorage(this.getMessagesStorage(), mid);\n //return this.appMessagesManager.getMessageByPeer(this.peerId, mid);\n }\n\n public getMidsByMid(mid: number) {\n return this.appMessagesManager.getMidsByMessage(this.getMessage(mid));\n }\n\n public isAnyGroup() {\n return this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || this.appPeersManager.isAnyGroup(this.peerId);\n }\n\n public initSearch(query?: string) {\n if(!this.peerId) return;\n\n if(mediaSizes.isMobile) {\n new ChatSearch(this.topbar, this, query);\n } else {\n let tab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(!tab) {\n tab = new AppPrivateSearchTab(appSidebarRight);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { clamp } from \"../../helpers/number\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appNavigationController from \"../appNavigationController\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport getSelectedNodes from \"../../helpers/dom/getSelectedNodes\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { MarkdownType, markdownTags } from \"../../helpers/dom/getRichElementValue\";\r\n//import { logger } from \"../../lib/logger\";\r\n\r\nexport default class MarkupTooltip {\r\n public container: HTMLElement;\r\n private wrapper: HTMLElement;\r\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\r\n private linkBackButton: HTMLElement;\r\n private linkApplyButton: HTMLButtonElement;\r\n private hideTimeout: number;\r\n private addedListener = false;\r\n private waitingForMouseUp = false;\r\n private linkInput: HTMLInputElement;\r\n private savedRange: Range;\r\n private mouseUpCounter: number = 0;\r\n //private log: ReturnType;\r\n\r\n constructor(private appImManager: AppImManager) {\r\n //this.log = logger('MARKUP');\r\n }\r\n\r\n private init() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\r\n\r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add('markup-tooltip-wrapper');\r\n \r\n const tools1 = document.createElement('div');\r\n const tools2 = document.createElement('div');\r\n tools1.classList.add('markup-tooltip-tools');\r\n tools2.classList.add('markup-tooltip-tools');\r\n\r\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'link'] as (keyof MarkupTooltip['buttons'])[];\r\n arr.forEach(c => {\r\n const button = ButtonIcon(c, {noRipple: true});\r\n tools1.append(this.buttons[c] = button);\r\n\r\n if(c !== 'link') {\r\n button.addEventListener('mousedown', (e) => {\r\n cancelEvent(e); \r\n this.appImManager.chat.input.applyMarkdown(c);\r\n this.cancelClosening();\r\n \r\n /* this.mouseUpCounter = 0;\r\n this.setMouseUpEvent(); */\r\n //this.hide();\r\n });\r\n } else {\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n this.showLinkEditor();\r\n this.cancelClosening();\r\n });\r\n }\r\n });\r\n\r\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\r\n this.linkInput = document.createElement('input');\r\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\r\n this.linkInput.classList.add('input-clear');\r\n this.linkInput.addEventListener('keydown', (e) => {\r\n const valid = !this.linkInput.value.length || !!RichTextProcessor.matchUrl(this.linkInput.value);///^(http)|(https):\\/\\//i.test(this.linkInput.value);\r\n\r\n if(e.key === 'Enter') {\r\n if(!valid) {\r\n if(this.linkInput.classList.contains('error')) {\r\n this.linkInput.classList.remove('error');\r\n void this.linkInput.offsetLeft; // reflow\r\n }\r\n\r\n this.linkInput.classList.add('error');\r\n } else {\r\n this.applyLink(e);\r\n }\r\n }\r\n });\r\n\r\n this.linkInput.addEventListener('input', (e) => {\r\n const valid = this.isLinkValid();\r\n\r\n this.linkInput.classList.toggle('is-valid', valid);\r\n this.linkInput.classList.remove('error');\r\n });\r\n\r\n this.linkBackButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkBackButton click');\r\n cancelEvent(e);\r\n this.container.classList.remove('is-link');\r\n //input.value = '';\r\n this.resetSelection();\r\n this.setTooltipPosition();\r\n this.cancelClosening();\r\n });\r\n\r\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\r\n this.linkApplyButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkApplyButton click');\r\n this.applyLink(e);\r\n });\r\n\r\n const applyDiv = document.createElement('div');\r\n applyDiv.classList.add('markup-tooltip-link-apply-container');\r\n \r\n const delimiter1 = document.createElement('span');\r\n const delimiter2 = document.createElement('span');\r\n const delimiter3 = document.createElement('span');\r\n delimiter1.classList.add('markup-tooltip-delimiter');\r\n delimiter2.classList.add('markup-tooltip-delimiter');\r\n delimiter3.classList.add('markup-tooltip-delimiter');\r\n tools1.insertBefore(delimiter1, this.buttons.link);\r\n applyDiv.append(delimiter3, this.linkApplyButton);\r\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\r\n //tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\r\n\r\n this.wrapper.append(tools1, tools2);\r\n this.container.append(this.wrapper);\r\n document.body.append(this.container);\r\n \r\n window.addEventListener('resize', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n public showLinkEditor() {\r\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\r\n this.show();\r\n }\r\n\r\n const button = this.buttons.link;\r\n this.container.classList.add('is-link');\r\n\r\n const selection = document.getSelection();\r\n this.savedRange = selection.getRangeAt(0);\r\n \r\n if(button.classList.contains('active')) {\r\n const startContainer = this.savedRange.startContainer;\r\n const anchor = startContainer.parentElement as HTMLAnchorElement;\r\n this.linkInput.value = anchor.href;\r\n } else {\r\n this.linkInput.value = '';\r\n }\r\n\r\n this.setTooltipPosition(true);\r\n\r\n setTimeout(() => {\r\n this.linkInput.focus(); // !!! instant focus will break animation\r\n }, 200);\r\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\r\n }\r\n\r\n private applyLink(e: Event) {\r\n cancelEvent(e);\r\n this.resetSelection();\r\n let url = this.linkInput.value;\r\n if(url && !RichTextProcessor.matchUrlProtocol(url)) {\r\n url = 'https://' + url;\r\n }\r\n this.appImManager.chat.input.applyMarkdown('link', url);\r\n setTimeout(() => {\r\n this.hide();\r\n }, 0);\r\n }\r\n\r\n private isLinkValid() {\r\n return !this.linkInput.value.length || !!RichTextProcessor.matchUrl(this.linkInput.value);\r\n }\r\n\r\n private resetSelection(range: Range = this.savedRange) {\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n this.appImManager.chat.input.messageInput.focus();\r\n }\r\n\r\n public hide() {\r\n //return;\r\n\r\n if(this.init) return;\r\n\r\n this.container.classList.remove('is-visible');\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n this.waitingForMouseUp = false;\r\n\r\n appNavigationController.removeByType('markup');\r\n\r\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hideTimeout = undefined;\r\n this.container.classList.add('hide');\r\n this.container.classList.remove('is-link');\r\n }, 200);\r\n }\r\n\r\n public getActiveMarkupButton() {\r\n const nodes = getSelectedNodes();\r\n const parents = [...new Set(nodes.map(node => node.parentNode))];\r\n //if(parents.length > 1 && parents) return [];\r\n\r\n const currentMarkups: Set = new Set();\r\n (parents as HTMLElement[]).forEach(node => {\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = node.closest(tag.match + ', [contenteditable]');\r\n if(closest !== this.appImManager.chat.input.messageInput) {\r\n currentMarkups.add(this.buttons[type as MarkdownType]);\r\n }\r\n }\r\n });\r\n \r\n\r\n return [...currentMarkups];\r\n }\r\n\r\n public setActiveMarkupButton() {\r\n const activeButtons = this.getActiveMarkupButton();\r\n\r\n for(const i in this.buttons) {\r\n // @ts-ignore\r\n const button = this.buttons[i];\r\n button.classList.toggle('active', activeButtons.includes(button));\r\n }\r\n }\r\n\r\n private setTooltipPosition(isLinkToggle = false) {\r\n const selection = document.getSelection();\r\n const range = selection.getRangeAt(0);\r\n\r\n const bodyRect = document.body.getBoundingClientRect();\r\n const selectionRect = range.getBoundingClientRect();\r\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\r\n\r\n this.container.style.maxWidth = inputRect.width + 'px';\r\n\r\n const selectionTop = 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 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 if(document.activeElement !== this.appImManager.chat.input.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 {\r\n this.setMouseUpEvent();\r\n }\r\n });\r\n }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedNodes() {\r\n const nodes: Node[] = [];\r\n const selection = window.getSelection();\r\n for(let i = 0; i < selection.rangeCount; ++i) {\r\n const range = selection.getRangeAt(i);\r\n let {startContainer, endContainer} = range;\r\n if(endContainer.nodeType !== 3) endContainer = endContainer.firstChild;\r\n \r\n while(startContainer && startContainer !== endContainer) {\r\n nodes.push(startContainer.nodeType === 3 ? startContainer : startContainer.firstChild);\r\n startContainer = startContainer.nextSibling;\r\n }\r\n \r\n if(nodes[nodes.length - 1] !== endContainer) {\r\n nodes.push(endContainer);\r\n }\r\n }\r\n\r\n // * filter null's due to
\r\n return nodes.filter(node => !!node);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// generate a path's arc data parameter\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\r\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\r\n return [rx, ',', ry, ' ',\r\n xAxisRotation, ' ',\r\n largeArcFlag, ',',\r\n sweepFlag, ' ',\r\n x, ',', y ].join('');\r\n}\r\n\r\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\r\n const data: string[] = [];\r\n\r\n // start point in top-middle of the rectangle\r\n data.push('M' + (x + width / 2) + ',' + y);\r\n\r\n // next we go to the right\r\n data.push('H' + (x + width - tr));\r\n\r\n if(tr > 0) {\r\n // now we draw the arc in the top-right corner\r\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\r\n }\r\n\r\n // next we go down\r\n data.push('V' + (y + height - br));\r\n\r\n if(br > 0) {\r\n // now we draw the arc in the lower-right corner\r\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\r\n }\r\n\r\n // now we go to the left\r\n data.push('H' + (x + bl));\r\n\r\n if(bl > 0) {\r\n // now we draw the arc in the lower-left corner\r\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\r\n }\r\n\r\n // next we go up\r\n data.push('V' + (y + tl));\r\n\r\n if(tl > 0) {\r\n // now we draw the arc in the top-left corner\r\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\r\n }\r\n\r\n // and we close the path\r\n data.push('Z');\r\n\r\n return data.join(' ');\r\n}\r\n\r\nMOUNT_CLASS_TO.generatePathData = generatePathData;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport generatePathData from \"../../helpers/generatePathData\";\r\nimport { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\r\n\r\nexport default class ChatDragAndDrop {\r\n container: HTMLDivElement;\r\n svg: SVGSVGElement;\r\n outlineWrapper: HTMLDivElement;\r\n path: SVGPathElement;\r\n\r\n constructor(appendTo: HTMLElement, private options: {\r\n icon?: string,\r\n header: LangPackKey,\r\n headerArgs?: FormatterArguments,\r\n subtitle?: LangPackKey,\r\n onDrop: (e: DragEvent) => void\r\n }) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('drop', 'z-depth-1');\r\n\r\n this.outlineWrapper = document.createElement('div');\r\n this.outlineWrapper.classList.add('drop-outline-wrapper');\r\n\r\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n this.svg.classList.add('drop-outline');\r\n\r\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n this.path.classList.add('drop-outline-path');\r\n\r\n let dropIcon: HTMLElement;\r\n if(options.icon) {\r\n dropIcon = document.createElement('div');\r\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\r\n }\r\n\r\n const dropHeader = document.createElement('div');\r\n dropHeader.classList.add('drop-header');\r\n dropHeader.append(i18n(options.header, options.headerArgs));\r\n\r\n let dropSubtitle: HTMLElement;\r\n if(options.subtitle) {\r\n dropSubtitle = document.createElement('div');\r\n dropSubtitle.classList.add('drop-subtitle');\r\n dropSubtitle.append(i18n(options.subtitle));\r\n }\r\n\r\n this.svg.append(this.path);\r\n this.outlineWrapper.append(this.svg);\r\n\r\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\r\n appendTo.append(this.container);\r\n\r\n this.container.addEventListener('dragover', this.onDragOver);\r\n this.container.addEventListener('dragleave', this.onDragLeave);\r\n this.container.addEventListener('drop', this.onDrop);\r\n }\r\n\r\n onDragOver = (e: DragEvent) => {\r\n this.container.classList.add('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', true, 500);\r\n };\r\n\r\n onDragLeave = (e: DragEvent) => {\r\n this.container.classList.remove('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', false, 500);\r\n };\r\n\r\n onDrop = (e: DragEvent) => {\r\n this.options.onDrop(e);\r\n };\r\n\r\n destroy() {\r\n delete this.options;\r\n this.container.remove();\r\n this.container.removeEventListener('dragover', this.onDragOver);\r\n this.container.removeEventListener('dragleave', this.onDragLeave);\r\n this.container.removeEventListener('drop', this.onDrop);\r\n }\r\n\r\n setPath() {\r\n const rect = this.outlineWrapper.getBoundingClientRect();\r\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\r\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\r\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\r\n\r\n const radius = 10;\r\n //const strokeWidth = 2;\r\n const sizeX = rect.width - radius;\r\n const sizeY = rect.height - radius;\r\n const pos = radius / 2;\r\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\r\n this.path.setAttributeNS(null, 'd', d);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { doubleRaf } from \"../schedulers\";\r\n\r\nexport default function disableTransition(elements: HTMLElement[]) {\r\n elements.forEach(el => el.classList.add('no-transition'));\r\n\r\n doubleRaf().then(() => {\r\n elements.forEach(el => el.classList.remove('no-transition'));\r\n });\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: 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\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};\n","/*\r\n * https://github.com/morethanwords/tweb\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 { ChatInvite, Updates } from \"../../layer\";\r\nimport apiUpdatesManager from \"../../lib/appManagers/apiUpdatesManager\";\r\nimport appAvatarsManager from \"../../lib/appManagers/appAvatarsManager\";\r\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\r\nimport appPhotosManager from \"../../lib/appManagers/appPhotosManager\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport apiManager from \"../../lib/mtproto/mtprotoworker\";\r\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { wrapPhoto } from \"../wrappers\";\r\n\r\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\r\n\r\nexport default class PopupJoinChatInvite extends PopupElement {\r\n constructor(hash: string, chatInvite: ChatInvite.chatInvite) {\r\n super('popup-join-chat-invite', addCancelButton([{\r\n langKey: chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle',\r\n callback: () => {\r\n apiManager.invokeApi('messages.importChatInvite', {hash})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n const chat = (updates as Updates.updates).chats[0];\r\n const peerId = chat.id.toPeerId(true);\r\n rootScope.dispatchEvent('history_focus', {peerId});\r\n });\r\n }\r\n }]), {closable: true, overlayClosable: true, body: true});\r\n\r\n this.header.remove();\r\n\r\n /* const fakeChat: Chat.channel | Chat.chat = {\r\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\r\n id: FAKE_CHAT_ID,\r\n title: chatInvite.title,\r\n photo: chatInvite.photo as any,\r\n date: Date.now() / 1000 | 0,\r\n version: 0,\r\n participants_count: chatInvite.participants_count,\r\n pFlags: chatInvite.pFlags as any\r\n };\r\n\r\n appChatsManager.saveApiChat(fakeChat); */\r\n \r\n const avatarElem = new AvatarElement();\r\n avatarElem.setAttribute('dialog', '0');\r\n avatarElem.classList.add('avatar-100');\r\n if(chatInvite.photo._ === 'photo') {\r\n chatInvite.photo = appPhotosManager.savePhoto(chatInvite.photo);\r\n wrapPhoto({\r\n container: avatarElem,\r\n message: null,\r\n photo: chatInvite.photo,\r\n boxHeight: 100,\r\n boxWidth: 100,\r\n withoutPreloader: true\r\n });\r\n avatarElem.style.width = avatarElem.style.height = '';\r\n } else {\r\n appAvatarsManager.putPhoto(avatarElem, NULL_PEER_ID, false, chatInvite.title);\r\n }\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('chat-title');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(chatInvite.title);\r\n //avatarElem.setAttribute('peer', '' + -fakeChat.id);\r\n \r\n const isBroadcast = chatInvite.pFlags.broadcast;\r\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [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}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n//import apiManager from '../mtproto/apiManager';\nimport animationIntersector from '../../components/animationIntersector';\nimport appSidebarLeft, { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../../components/sidebarLeft\";\nimport appSidebarRight, { RIGHT_COLUMN_ACTIVE_CLASSNAME } from '../../components/sidebarRight';\nimport mediaSizes, { ScreenSize } from '../../helpers/mediaSizes';\nimport { logger, LogTypes } from \"../logger\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport apiUpdatesManager from './apiUpdatesManager';\nimport appUsersManager from \"./appUsersManager\";\nimport Chat, { ChatType } from '../../components/chat/chat';\nimport appChatsManager from './appChatsManager';\nimport appDocsManager from './appDocsManager';\nimport appInlineBotsManager from './appInlineBotsManager';\nimport appMessagesManager from './appMessagesManager';\nimport appPeersManager from './appPeersManager';\nimport appPhotosManager from './appPhotosManager';\nimport appProfileManager from './appProfileManager';\nimport appStickersManager from './appStickersManager';\nimport appWebPagesManager from './appWebPagesManager';\nimport PopupNewMedia, { getCurrentNewMediaPopup } from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport { IS_TOUCH_SUPPORTED } from '../../environment/touchSupport';\nimport appPollsManager from './appPollsManager';\nimport SetTransition from '../../components/singleTransition';\nimport ChatDragAndDrop from '../../components/chat/dragAndDrop';\nimport { doubleRaf } from '../../helpers/schedulers';\nimport lottieLoader from '../lottieLoader';\nimport useHeavyAnimationCheck, { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport appDraftsManager from './appDraftsManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport stateStorage from '../stateStorage';\nimport appDownloadManager from './appDownloadManager';\nimport { AppStateManager } from './appStateManager';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport appNotificationsManager from './appNotificationsManager';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, { i18n, join, LangPackKey } from '../langPack';\nimport { ChatInvite, Dialog, SendMessageAction } from '../../layer';\nimport { hslaStringToHex } from '../../helpers/color';\nimport { copy, getObjectKeysAndSort } from '../../helpers/object';\nimport { getFilesFromEvent } from '../../helpers/files';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer from '../../components/popups/peer';\nimport { SliceEnd } from '../../helpers/slicedArray';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport { cancelEvent } from '../../helpers/dom/cancelEvent';\nimport disableTransition from '../../helpers/dom/disableTransition';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport appEmojiManager from './appEmojiManager';\nimport PopupElement from '../../components/popups';\nimport singleInstance from '../mtproto/singleInstance';\nimport PopupStickers from '../../components/popups/stickers';\nimport PopupJoinChatInvite from '../../components/popups/joinChatInvite';\nimport { toast, toastNew } from '../../components/toast';\nimport debounce from '../../helpers/schedulers/debounce';\nimport { pause } from '../../helpers/schedulers/pause';\nimport appMessagesIdsManager from './appMessagesIdsManager';\nimport { InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE } from './internalLink';\nimport RichTextProcessor from '../richtextprocessor';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport { NULL_PEER_ID } from '../mtproto/mtproto_config';\nimport telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport { ONE_DAY } from '../../helpers/date';\nimport { numberThousandSplitter } from '../../helpers/number';\n\n//console.log('appImManager included33!');\n\nappSidebarLeft; // just to include\n\nexport const CHAT_ANIMATION_GROUP = 'chat';\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\n\nexport type ChatSavedPosition = {\n mids: number[], \n top: number\n};\n\nexport class AppImManager {\n public columnEl = document.getElementById('column-center') as HTMLDivElement;\n public chatsContainer: HTMLElement;\n\n public offline = false;\n public updateStatusInterval = 0;\n\n public log: ReturnType;\n\n public setPeerPromise: Promise = null;\n\n public tabId = -1;\n \n public chats: Chat[] = [];\n private prevTab: HTMLElement;\n private chatsSelectTabDebounced: () => void;\n \n public markupTooltip: MarkupTooltip;\n private backgroundPromises: {[slug: string]: Promise} = {};\n\n get myId() {\n return rootScope.myId;\n }\n\n get chat(): Chat {\n return this.chats[this.chats.length - 1];\n }\n\n constructor() {\n apiUpdatesManager.attach();\n appNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.selectTab(0);\n \n window.addEventListener('blur', () => {\n animationIntersector.checkAnimations(true);\n \n this.offline = rootScope.idle.isIDLE = true;\n this.updateStatus();\n clearInterval(this.updateStatusInterval);\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n \n window.addEventListener('focus', () => {\n this.offline = rootScope.idle.isIDLE = false;\n this.updateStatus();\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n \n // в обратном порядке\n animationIntersector.checkAnimations(false);\n\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n this.updateStatus();\n\n this.offline = rootScope.idle.isIDLE = false;\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n }, {once: true, passive: true});\n\n this.chatsContainer = document.createElement('div');\n this.chatsContainer.classList.add('chats-container', 'tabs-container');\n this.chatsContainer.dataset.animation = 'navigation';\n\n this.columnEl.append(this.chatsContainer);\n \n this.createNewChat();\n this.chatsSelectTab(this.chat.container);\n\n appNavigationController.onHashChange = this.onHashChange;\n //window.addEventListener('hashchange', this.onHashChange);\n\n this.setSettings();\n rootScope.addEventListener('settings_updated', this.setSettings);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup('');\n animationIntersector.checkAnimations(false);\n });\n\n this.applyCurrentTheme();\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\n rootScope.addEventListener('history_focus', (e) => {\n let {peerId, threadId, mid} = e;\n if(threadId) threadId = appMessagesIdsManager.generateMessageId(threadId);\n if(mid) mid = appMessagesIdsManager.generateMessageId(mid); // because mid can come from notification, i.e. server message id\n \n this.setInnerPeer(peerId, mid, threadId ? 'discussion' : undefined, threadId);\n });\n\n rootScope.addEventListener('peer_changing', (chat) => {\n this.saveChatPosition(chat);\n });\n\n rootScope.addEventListener('theme_change', () => {\n this.applyCurrentTheme();\n });\n\n rootScope.addEventListener('choosing_sticker', (choosing) => {\n this.setChoosingStickerTyping(!choosing);\n });\n\n rootScope.addEventListener('instance_deactivated', () => {\n const popup = new PopupElement('popup-instance-deactivated', undefined, {overlayClosable: true});\n const c = document.createElement('div');\n c.classList.add('instance-deactivated-container');\n (popup as any).container.replaceWith(c);\n\n const header = document.createElement('div');\n header.classList.add('header');\n header.append(i18n('Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n('Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n (popup as any).onClose = () => {\n document.body.classList.add('deactivated-backwards');\n\n singleInstance.activateInstance();\n\n setTimeout(() => {\n document.body.classList.remove('deactivated', 'deactivated-backwards');\n }, 333);\n };\n\n popup.show();\n });\n\n stateStorage.get('chatPositions').then((c) => {\n stateStorage.setToCache('chatPositions', c || {});\n });\n\n // ! do not remove this line \n // ! instance can be deactivated before the UI starts, because it waits in background for RAF that is delayed\n singleInstance.activateInstance();\n\n const setAuthorized = () => {\n telegramMeWebManager.setAuthorized(true);\n };\n\n setInterval(setAuthorized, ONE_DAY);\n setAuthorized();\n\n this.addAnchorListener<{}>({\n name: 'showMaskedAlert', \n callback: (params, element) => {\n const href = element.href;\n\n const a = element.cloneNode(true) as HTMLAnchorElement;\n a.className = 'anchor-url';\n a.innerText = href;\n a.removeAttribute('onclick');\n\n new PopupPeer('popup-masked-url', {\n titleLangKey: 'OpenUrlTitle',\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [a],\n buttons: [{\n langKey: 'Open',\n callback: () => {\n a.click();\n },\n }]\n }).show();\n }\n });\n\n this.addAnchorListener<{uriParams: {command: string, bot: string}}>({\n name: 'execBotCommand', \n callback: ({uriParams}) => {\n const {command, bot} = uriParams;\n\n /* const promise = bot ? this.openUsername(bot).then(() => this.chat.peerId) : Promise.resolve(this.chat.peerId);\n promise.then(peerId => {\n appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n //console.log(command, bot);\n }\n });\n\n this.addAnchorListener<{uriParams: {hashtag: string}}>({\n name: 'searchByHashtag', \n callback: ({uriParams}) => {\n const {hashtag} = uriParams;\n if(!hashtag) {\n return;\n }\n\n this.chat.initSearch('#' + hashtag + ' ');\n }\n });\n\n this.addAnchorListener<{pathnameParams: ['addstickers', string]}>({\n name: 'addstickers', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n this.addAnchorListener<{pathnameParams: ['joinchat', string]}>({\n name: 'joinchat', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: pathnameParams[1] || decodeURIComponent(pathnameParams[0]).slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n // pathnameParams: ['c', string, string],\n // uriParams: {thread?: number}\n // } | {\n // pathnameParams: [string, string?],\n // uriParams: {comment?: number}\n pathnameParams: ['c', string, string] | [string, string?],\n uriParams: {thread?: string, comment?: string} | {comment?: string}\n }>({\n name: 'im',\n callback: async({pathnameParams, uriParams}) => {\n let link: InternalLink;\n 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 : undefined,\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 };\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n domain: string,\n\n // telegrampassport\n scope?: string,\n nonce?: string,\n payload?: string,\n bot_id?: string,\n public_key?: string,\n callback_url?: string,\n\n // regular\n start?: string,\n startgroup?: string,\n game?: string,\n voicechat?: string,\n post?: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'resolve',\n protocol: 'tg',\n callback: ({uriParams}) => {\n let link: InternalLink;\n if(uriParams.domain === 'telegrampassport') {\n\n } else {\n link = this.makeLink(INTERNAL_LINK_TYPE.MESSAGE, uriParams);\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'privatepost',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.PRIVATE_POST, uriParams);\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name: 'addstickers',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.STICKER_SET, uriParams);\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n invite: string\n }\n }>({\n name: 'joinchat',\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 this.onHashChange();\n this.attachKeydownListener();\n }\n\n private attachKeydownListener() {\n const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(rootScope.isOverlayActive || IGNORE_KEYS.has(key)) return;\n \n const target = e.target as HTMLElement;\n \n //if(target.tagName === 'INPUT') return;\n \n //this.log('onkeydown', e, document.activeElement);\n\n const chat = this.chat;\n\n if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(rootScope.filterId, true);\n let nextDialog: Dialog.dialog;\n if(!rootScope.peerId) {\n if(key === 'ArrowDown') {\n nextDialog = folder[0];\n }\n } else {\n const idx = folder.findIndex(dialog => dialog.peerId === rootScope.peerId);\n if(idx !== -1) {\n const nextIndex = key === 'ArrowUp' ? idx - 1 : idx + 1;\n nextDialog = folder[nextIndex];\n }\n }\n \n if(nextDialog) {\n this.setPeer(nextDialog.peerId);\n }\n } else if(key === 'ArrowUp') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n const historyStorage = appMessagesManager.getHistoryStorage(chat.peerId, chat.threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMid: number;\n for(const mid of slice) {\n const message = chat.getMessage(mid);\n const good = this.myId === chat.peerId ? message.fromId === this.myId : message.pFlags.out;\n\n if(good) {\n if(appMessagesManager.canEditMessage(chat.getMessage(mid), 'text')) {\n goodMid = mid;\n break;\n }\n\n // * this check will allow editing only last message\n //break;\n }\n }\n \n if(goodMid) {\n chat.input.initMessageEditing(goodMid);\n cancelEvent(e); // * prevent from scrolling\n }\n }\n } else {\n return;\n }\n } else if(key === 'ArrowDown') {\n return;\n }\n \n if(\n chat?.input?.messageInput && \n e.target !== chat.input.messageInput && \n target.tagName !== 'INPUT' && \n !target.hasAttribute('contenteditable') && \n !IS_TOUCH_SUPPORTED && \n (!mediaSizes.isMobile || this.tabId === 1) && \n !chat.selection.isSelecting && \n !chat.input.recording\n ) {\n chat.input.messageInput.focus();\n placeCaretAtEnd(chat.input.messageInput);\n\n // clone and dispatch same event to new input. it is needed for sending message if input was blurred\n const newEvent = new KeyboardEvent(e.type, e);\n chat.input.messageInput.dispatchEvent(newEvent);\n }\n };\n \n document.body.addEventListener('keydown', onKeyDown);\n }\n\n private makeLink(type: T, uriParams: Omit) {\n return {\n _: type,\n ...uriParams\n } as any as InternalLinkTypeMap[T];\n }\n\n public async processInternalLink(link: InternalLink) {\n switch(link?._) {\n case INTERNAL_LINK_TYPE.MESSAGE: {\n const postId = link.post ? appMessagesIdsManager.generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? appMessagesIdsManager.generateMessageId(+link.comment) : undefined;\n\n this.openUsername(link.domain, postId, undefined, commentId);\n break;\n }\n\n case INTERNAL_LINK_TYPE.PRIVATE_POST: {\n const chatId = link.channel.toChatId();\n const peerId = chatId.toPeerId(true);\n\n const chat = appChatsManager.getChat(chatId);\n if(chat.deleted) {\n try {\n await appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = appMessagesIdsManager.generateMessageId(+link.post);\n const threadId = link.thread ? appMessagesIdsManager.generateMessageId(+link.thread) : undefined;\n\n if(threadId) this.openThread(peerId, postId, threadId);\n else this.setInnerPeer(peerId, postId);\n break;\n }\n\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n apiManager.invokeApi('messages.checkChatInvite', {\n hash: link.invite\n }).then(chatInvite => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n appChatsManager.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n // console.log(chatInvite);\n\n if(chatInvite._ === 'chatInviteAlready' ||\n chatInvite._ === 'chatInvitePeek'/* && chatInvite.expires > tsNow(true) */) {\n this.setInnerPeer(chatInvite.chat.id.toPeerId(true));\n return;\n }\n\n new PopupJoinChatInvite(link.invite, chatInvite).show();\n }, (err) => {\n if(err.type === 'INVITE_HASH_EXPIRED') {\n toast(i18n('InviteExpired'));\n }\n });\n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n private addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'joinchat' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers', \n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any, \n noPathnameParams?: boolean,\n noUriParams?: boolean\n }) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n cancelEvent(null);\n\n const href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n if(!options.noPathnameParams) pathnameParams = new URL(element.href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = this.parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n }\n\n private parseUriParams(uri: string, splitted = uri.split('?')) {\n const params: any = {};\n if(!splitted[1]) return params;\n splitted[1].split('&').forEach(item => {\n params[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);\n });\n\n return params;\n }\n\n private onHashChange = () => {\n const hash = location.hash;\n const splitted = hash.split('?');\n\n const params = this.parseUriParams(hash, splitted);\n\n this.log('hashchange', hash, splitted[0], params);\n\n if(params.tgaddr) {\n appNavigationController.replaceState();\n const {onclick} = RichTextProcessor.wrapUrl(params.tgaddr);\n if(onclick) {\n const a = document.createElement('a');\n a.href = params.tgaddr;\n (window as any)[onclick](a);\n }\n return;\n }\n\n switch(splitted[0]) {\n case '#/im': {\n const p: string = params.p;\n let postId = params.post !== undefined ? appMessagesIdsManager.generateMessageId(+params.post) : undefined;\n\n switch(p[0]) {\n case '@': {\n this.openUsername(p, postId);\n break;\n }\n\n default: { // peerId\n this.setInnerPeer(postId ? p.toPeerId(true) : p.toPeerId(), postId);\n break;\n }\n }\n }\n }\n\n //appNavigationController.replaceState();\n //location.hash = '';\n };\n\n public openUsername(username: string, msgId?: number, threadId?: number, commentId?: number) {\n return appUsersManager.resolveUsername(username).then(peer => {\n const isUser = peer._ === 'user';\n const peerId = isUser ? peer.id.toPeerId() : peer.id.toPeerId(true);\n\n if(threadId) return this.openThread(peerId, msgId, threadId);\n else if(commentId) return this.openComment(peerId, msgId, commentId);\n else return this.setInnerPeer(peerId, msgId);\n }, (err) => {\n if(err.type === 'USERNAME_NOT_OCCUPIED') {\n toastNew({langPackKey: 'NoUsernameFound'});\n } else if(err.type === 'USERNAME_INVALID') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n }\n\n /**\n * Opens thread when peerId of discussion group is known\n */\n public openThread(peerId: PeerId, lastMsgId: number, threadId: number) {\n return appMessagesManager.wrapSingleMessage(peerId, threadId).then(() => {\n const message = appMessagesManager.getMessageByPeer(peerId, threadId);\n appMessagesManager.generateThreadServiceStartMessage(message);\n\n return this.setInnerPeer(peerId, lastMsgId, 'discussion', threadId);\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(peerId: PeerId, msgId: number, commentId: number) {\n return appMessagesManager.getDiscussionMessage(peerId, msgId).then(message => {\n return this.openThread(message.peerId, commentId, message.mid);\n });\n }\n\n public setCurrentBackground(broadcastEvent = false) {\n const theme = rootScope.getTheme();\n\n if(theme.background.type === 'image' || (theme.background.type === 'default' && theme.background.slug)) {\n const defaultTheme = AppStateManager.STATE_INIT.settings.themes.find(t => t.name === theme.name);\n const isDefaultBackground = theme.background.blur === defaultTheme.background.blur && \n theme.background.slug === defaultTheme.background.slug;\n\n if(!isDefaultBackground) {\n return this.getBackground(theme.background.slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.background = copy(defaultTheme.background); // * reset background\n return this.setBackground('', true);\n });\n }\n }\n \n return this.setBackground('', broadcastEvent);\n }\n\n private getBackground(slug: string) {\n if(this.backgroundPromises[slug]) return this.backgroundPromises[slug];\n return this.backgroundPromises[slug] = appDownloadManager.cacheStorage.getFile('backgrounds/' + slug).then(blob => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n 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 top = chatBubbles.scrollable.scrollTop;\n\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && Object.keys(chatBubbles.bubbles).length) {\n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc'),\n top\n };\n\n chatPositions[key] = position;\n\n this.log('saved chat position:', position);\n } else {\n delete chatPositions[key];\n\n this.log('deleted chat position');\n }\n\n stateStorage.set({chatPositions}, true);\n //}\n }\n\n public getChatSavedPosition(chat: Chat): ChatSavedPosition {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n \n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const cache = stateStorage.getFromCache('chatPositions');\n return cache && cache[key];\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = rootScope.getTheme();\n if(theme.background.highlightningColor) {\n hsla = theme.background.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n rootScope.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n this.applyHighlightningColor();\n\n rootScope.setTheme();\n\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n \n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n document.documentElement.style.setProperty('--messages-text-size', rootScope.settings.messagesTextSize + 'px');\n \n document.body.classList.toggle('animation-level-0', !rootScope.settings.animationsEnabled);\n document.body.classList.toggle('animation-level-1', false);\n document.body.classList.toggle('animation-level-2', rootScope.settings.animationsEnabled);\n\n this.chatsSelectTabDebounced = debounce(() => {\n const topbar = this.chat.topbar;\n if(topbar.pinnedMessage) { // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n topbar.pinnedMessage.setCorrectIndex(0);\n }\n\n apiManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n lottieLoader.setLoop(rootScope.settings.stickers.loop);\n animationIntersector.checkAnimations(false);\n \n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n \n I18n.setTimeFormat(rootScope.settings.timeFormat);\n };\n\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(NULL_PEER_ID, undefined, canAnimate);\n blurActiveElement();\n }\n });\n }\n }\n\n tab.classList.add('active');\n this.prevTab = tab;\n }\n\n private init() {\n document.addEventListener('paste', this.onDocumentPaste, true);\n \n if(!IS_TOUCH_SUPPORTED) {\n this.attachDragAndDropListeners();\n }\n\n //if(!isTouchSupported) {\n this.markupTooltip = new MarkupTooltip(this);\n this.markupTooltip.handleSelection();\n //}\n }\n\n private attachDragAndDropListeners() {\n const drops: ChatDragAndDrop[] = [];\n const mediaDrops: ChatDragAndDrop[] = [];\n let mounted = false;\n const toggle = async(e: DragEvent, mount: boolean) => {\n if(mount === mounted) return;\n\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n\n const newMediaPopup = getCurrentNewMediaPopup();\n if(!isFiles || (!this.canDrag() && !newMediaPopup)) { // * skip dragging text case\n counter = 0;\n return;\n }\n\n const _dropsContainer = newMediaPopup ? mediaDropsContainer : dropsContainer;\n const _drops = newMediaPopup ? mediaDrops : drops;\n\n if(mount && !_drops.length) {\n const types: string[] = await getFilesFromEvent(e, true);\n const force = isFiles && !types.length; // * can't get file items not from 'drop' on Safari\n \n const foundMedia = types.filter(t => MEDIA_MIME_TYPES_SUPPORTED.has(t)).length;\n // const foundDocuments = types.length - foundMedia;\n \n this.log('drag files', types);\n\n if(newMediaPopup) {\n newMediaPopup.appendDrops(_dropsContainer);\n\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n header: 'Preview.Dragging.AddItems',\n headerArgs: [types.length],\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'document');\n }\n }));\n }\n } else {\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragfiles',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropAsFilesDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'document');\n }\n }));\n }\n \n // if((foundMedia && !foundDocuments) || force) {\n if(foundMedia || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragmedia',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropQuickDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n //if(!mount) return;\n\n SetTransition(_dropsContainer, 'is-visible', mount, 200, () => {\n if(!mount) {\n _drops.forEach(drop => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\n });\n\n if(mount) {\n _drops.forEach(drop => {\n drop.setPath();\n });\n } else {\n counter = 0;\n }\n\n document.body.classList.toggle('is-dragging', mount);\n mounted = mount;\n };\n\n /* document.body.addEventListener('dragover', (e) => {\n cancelEvent(e);\n }); */\n\n let counter = 0;\n document.body.addEventListener('dragenter', (e) => {\n counter++;\n });\n\n document.body.addEventListener('dragover', (e) => {\n //this.log('dragover', e/* , e.dataTransfer.types[0] */);\n toggle(e, true);\n cancelEvent(e);\n });\n\n document.body.addEventListener('dragleave', (e) => {\n //this.log('dragleave', e, counter);\n //if((e.pageX <= 0 || e.pageX >= appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= appPhotosManager.windowH)) {\n counter--;\n if(counter === 0) { \n //if(!findUpClassName(e.target, 'drops-container')) {\n toggle(e, false);\n }\n });\n\n const dropsContainer = document.createElement('div');\n dropsContainer.classList.add('drops-container');\n\n const mediaDropsContainer = dropsContainer.cloneNode(true) as HTMLElement;\n }\n\n private canDrag() {\n const peerId = this.chat?.peerId;\n return !(!peerId || rootScope.isOverlayActive || !appMessagesManager.canSendToPeer(peerId, this.chat.threadId, 'send_media'));\n }\n\n private onDocumentPaste = (e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\n if(!this.canDrag() && !newMediaPopup) return;\n\n //console.log('document paste');\n //console.log('item', event.clipboardData.getData());\n\n if(e instanceof DragEvent) {\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n if(isFiles) {\n cancelEvent(e);\n }\n }\n \n getFilesFromEvent(e).then((files: File[]) => {\n if(files.length) {\n if(newMediaPopup) {\n newMediaPopup.addFiles(files);\n return;\n }\n \n const chatInput = this.chat.input;\n chatInput.willAttachType = attachType || (MEDIA_MIME_TYPES_SUPPORTED.has(files[0].type) ? 'media' : 'document');\n new PopupNewMedia(this.chat, files, chatInput.willAttachType);\n }\n });\n };\n\n public selectTab(id: number, animate?: boolean) {\n if(animate === false) { // * will be used for Safari iOS history swipe\n disableTransition([appSidebarLeft.sidebarEl, this.columnEl, appSidebarRight.sidebarEl]);\n }\n\n document.body.classList.toggle(LEFT_COLUMN_ACTIVE_CLASSNAME, id === 0);\n\n const prevTabId = this.tabId;\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(prevTabId !== -1 && prevTabId !== id && rootScope.settings.animationsEnabled && animate !== false) {\n const transitionTime = (mediaSizes.isMobile ? 250 : 200) + 100; // * cause transition time could be > 250ms\n animationPromise = pause(transitionTime);\n dispatchHeavyAnimationEvent(animationPromise, transitionTime);\n\n // ! it's very heavy operation. will blink in firefox\n /* this.columnEl.classList.add('disable-hover');\n animationPromise.finally(() => {\n this.columnEl.classList.remove('disable-hover');\n }); */\n }\n\n this.tabId = id;\n blurActiveElement();\n if(mediaSizes.isMobile && prevTabId === 2 && id < 2) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== -1 && id > prevTabId) {\n if(id < 2 || !appNavigationController.findItemByType('im')) {\n appNavigationController.pushItem({\n type: 'im', \n onPop: (canAnimate) => {\n //this.selectTab(prevTabId, !isSafari);\n this.setPeer(NULL_PEER_ID, undefined, canAnimate);\n }\n });\n }\n }\n\n rootScope.dispatchEvent('im_tab_change', id);\n\n //this._selectTab(id, mediaSizes.isMobile);\n //document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id === 2);\n\n return animationPromise;\n }\n \n public updateStatus() {\n if(!this.myId) return Promise.resolve();\n \n appUsersManager.setUserStatus(this.myId, this.offline);\n return apiManager.invokeApiSingle('account.updateStatus', {offline: this.offline});\n }\n\n private createNewChat() {\n const chat = new Chat(this, \n appChatsManager, \n appDocsManager, \n appInlineBotsManager, \n appMessagesManager, \n appPeersManager, \n appPhotosManager, \n appProfileManager, \n appStickersManager, \n appUsersManager, \n appWebPagesManager, \n appPollsManager, \n apiManager, \n appDraftsManager, \n serverTimeManager, \n stateStorage, \n appNotificationsManager, \n appEmojiManager,\n appMessagesIdsManager\n );\n\n if(this.chats.length) {\n chat.backgroundEl.append(this.chat.backgroundEl.lastElementChild.cloneNode(true));\n }\n\n this.chats.push(chat);\n }\n\n private spliceChats(fromIndex: number, justReturn = true, animate?: boolean, spliced?: Chat[]) {\n if(fromIndex >= this.chats.length) return;\n\n if(this.chats.length > 1 && justReturn) {\n rootScope.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n // * -1 because one item is being sliced when closing the chat by calling .removeByType\n for(let i = 0; i < spliced.length - 1; ++i) {\n appNavigationController.removeByType('chat', true);\n }\n\n // * fix middle chat z-index on animation\n if(spliced.length > 1) {\n spliced.slice(0, -1).forEach(chat => {\n chat.container.remove();\n });\n }\n\n this.chatsSelectTab(this.chat.container, animate);\n\n if(justReturn) {\n rootScope.dispatchEvent('peer_changed', this.chat.peerId);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n \n const isSet = appSidebarRight.sharedMediaTab.setPeer(this.chat.peerId, this.chat.threadId);\n if(isSet) {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(true);\n appSidebarRight.sharedMediaTab.fillProfileElements();\n }\n \n /* setTimeout(() => {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(false);\n }); */\n }\n\n spliced.forEach(chat => {\n chat.beforeDestroy();\n });\n \n setTimeout(() => {\n //chat.setPeer(0);\n spliced.forEach(chat => {\n chat.destroy();\n });\n }, 250 + 100);\n }\n\n public setPeer(peerId: PeerId, lastMsgId?: number, animate?: boolean): boolean {\n if(this.init) {\n this.init();\n this.init = null;\n }\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(peerId, lastMsgId);\n this.spliceChats(0, false, false, spliced);\n return ret;\n }\n // } else {\n // this.spliceChats(1, false, animate);\n // }\n\n //return ret;\n }\n\n // * don't reset peer if returning\n if(peerId === chat.peerId && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(1, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = chat.setPeer(peerId, lastMsgId);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n promise.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(peerId: PeerId, lastMsgId?: number, type: ChatType = 'chat', threadId?: number) {\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\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(peerId, lastMsgId);\n }\n\n const chat = this.chat;\n if(chat.inited) { // * use first not inited chat\n this.createNewChat();\n }\n\n if(type) {\n this.chat.setType(type);\n\n if(threadId) {\n this.chat.threadId = threadId;\n }\n }\n\n //this.chatsSelectTab(this.chat.container);\n\n return this.setPeer(peerId, lastMsgId);\n }\n\n public openScheduled(peerId: PeerId) {\n this.setInnerPeer(peerId, undefined, 'scheduled');\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 'sendMessageChooseStickerAction': {\n c += '-choosing-sticker';\n for(let i = 0; i < 2; ++i) {\n const eye = document.createElement('div');\n eye.className = c + '-eye';\n el.append(eye);\n }\n break;\n }\n }\n\n el.classList.add(c);\n\n return el;\n }\n\n public getPeerTyping(peerId: PeerId, container?: HTMLElement) {\n if(!appUsersManager.isBot(peerId)) {\n const typings = appProfileManager.getPeerTypings(peerId);\n if(!typings || !typings.length) {\n return;\n }\n\n const typing = typings[0];\n\n const langPackKeys: {\n [peerType in 'private' | 'chat' | 'multi']?: Partial<{[action in SendMessageAction['_']]: LangPackKey}>\n } = {\n private: {\n 'sendMessageTypingAction': 'Peer.Activity.User.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.User.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.User.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.User.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.User.ChoosingSticker'\n },\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 },\n multi: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.Multi.TypingText1',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.Multi.SendingPhoto1',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.Multi.RecordingAudio1',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.Multi.PlayingGame1',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.Multi.ChoosingSticker1'\n }\n };\n\n const mapa = peerId.isUser() ? langPackKeys.private : (typings.length > 1 ? langPackKeys.multi : langPackKeys.chat);\n let action = typing.action;\n\n if(typings.length > 1) {\n const s: any = {};\n typings.forEach(typing => {\n const type = typing.action._;\n if(s[type] === undefined) s[type] = 0;\n ++s[type];\n });\n\n if(Object.keys(s).length > 1) {\n action = {\n _: 'sendMessageTypingAction'\n };\n }\n }\n\n const langPackKey = mapa[action._];\n if(!langPackKey) {\n return;\n }\n\n if(!container) {\n container = document.createElement('span');\n container.classList.add('online', 'peer-typing-container');\n }\n\n if(action._ === 'sendMessageChooseStickerAction') {\n container.classList.add('peer-typing-flex');\n }\n\n let typingElement = container.firstElementChild as HTMLElement;\n if(!typingElement) {\n typingElement = this.getTypingElement(action);\n container.prepend(typingElement);\n } else {\n if(typingElement.dataset.action !== action._) {\n typingElement.replaceWith(this.getTypingElement(action));\n }\n }\n\n let args: any[];\n if(peerId.isAnyChat()) {\n args = [\n new PeerTitle({peerId: typing.userId.toPeerId(false), onlyFirstName: true}).element,\n typings.length - 1\n ];\n }\n const descriptionElement = i18n(langPackKey, args);\n descriptionElement.classList.add('peer-typing-description');\n\n if(container.childElementCount > 1) container.lastElementChild.replaceWith(descriptionElement);\n else container.append(descriptionElement);\n return container;\n }\n }\n\n public async getPeerStatus(peerId: PeerId) {\n let subtitle: HTMLElement;\n if(!peerId) return;\n\n if(peerId.isAnyChat()) { // not human\n let span = this.getPeerTyping(peerId);\n if(span) {\n return span;\n }\n\n const chatId = peerId.toChatId();\n const chatInfo = await appProfileManager.getChatFull(chatId) as any;\n this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = chatInfo.participants_count || (chatInfo.participants && chatInfo.participants.participants && chatInfo.participants.participants.length) || 1;\n //if(participants_count) {\n subtitle = appProfileManager.getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await appProfileManager.getOnlines(chatId);\n if(onlines > 1) {\n const span = document.createElement('span');\n \n span.append(...join([subtitle, i18n('OnlineCount', [numberThousandSplitter(onlines)])], false));\n subtitle = span;\n }\n \n return subtitle;\n //}\n } else { // user\n const user = appUsersManager.getUser(peerId);\n \n if(rootScope.myId === peerId) {\n return;\n } else if(user) {\n subtitle = appUsersManager.getUserStatusString(user.id);\n\n if(!appUsersManager.isBot(peerId)) {\n let span = this.getPeerTyping(peerId);\n if(!span && user.status?._ === 'userStatusOnline') {\n span = document.createElement('span');\n span.classList.add('online');\n span.append(subtitle);\n }\n\n if(span) {\n return span;\n }\n }\n \n return subtitle;\n }\n }\n }\n\n public setPeerStatus(peerId: PeerId, element: HTMLElement, needClear: boolean, useWhitespace: boolean, middleware: () => boolean) {\n if(needClear) {\n element.innerHTML = useWhitespace ? '‎' : ''; // ! HERE U CAN FIND WHITESPACE\n }\n\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && this.getPeerTyping(peerId, typingContainer)) {\n return;\n }\n\n this.getPeerStatus(peerId).then((subtitle) => {\n if(!middleware()) {\n return;\n }\n\n replaceContent(element, subtitle || (useWhitespace ? '‎' : ''));\n });\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'});\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { deferredPromise } from \"../helpers/cancellablePromise\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appPhotosManager, { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport { logger } from \"../lib/logger\";\nimport VideoPlayer from \"../lib/mediaPlayer\";\nimport rootScope from \"../lib/rootScope\";\nimport animationIntersector from \"./animationIntersector\";\nimport appMediaPlaybackController from \"./appMediaPlaybackController\";\nimport AvatarElement from \"./avatar\";\nimport ButtonIcon from \"./buttonIcon\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport ButtonMenuToggle from \"./buttonMenuToggle\";\nimport { LazyLoadQueueBase } from \"./lazyLoadQueue\";\nimport ProgressivePreloader from \"./preloader\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport appNavigationController from \"./appNavigationController\";\nimport { Message } from \"../layer\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport renderImageFromUrl, { renderImageFromUrlPromise } from \"../helpers/dom/renderImageFromUrl\";\nimport getVisibleRect from \"../helpers/dom/getVisibleRect\";\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport fillPropertyValue from \"../helpers/fillPropertyValue\";\nimport generatePathData from \"../helpers/generatePathData\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport PeerTitle from \"./peerTitle\";\nimport { doubleRaf, fastRaf } from \"../helpers/schedulers\";\nimport RangeSelector from \"./rangeSelector\";\nimport windowSize from \"../helpers/windowSize\";\nimport ListLoader from \"../helpers/listLoader\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\n// TODO: масштабирование картинок (не SVG) при ресайзе, и правильный возврат на исходную позицию\n// TODO: картинки \"обрезаются\" если возвращаются или появляются с места, где есть их перекрытие (топбар, поле ввода)\n// TODO: видео в мобильной вёрстке, если показываются элементы управления: если свайпнуть в сторону, то элементы вернутся на место, т.е. прыгнут - это не ок, надо бы замаскировать\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\nexport default class AppMediaViewerBase<\n ContentAdditionType extends string, \n ButtonsAdditionType extends string, \n TargetType extends {element: HTMLElement\n}> extends EventListenerBase<{\n setMoverBefore: () => void,\n setMoverAfter: () => void\n}> {\n protected wholeDiv: HTMLElement;\n protected overlaysDiv: HTMLElement;\n protected author: {[k in 'container' | 'avatarEl' | 'nameEl' | 'date']: HTMLElement} = {} as any;\n protected content: {[k in 'main' | 'container' | 'media' | 'mover' | ContentAdditionType]: HTMLElement} = {} as any;\n protected buttons: {[k in 'download' | 'close' | 'prev' | 'next' | 'mobile-close' | 'zoom' | ButtonsAdditionType]: HTMLElement} = {} as any;\n protected topbar: HTMLElement;\n protected moversContainer: HTMLElement;\n \n protected tempId = 0;\n protected preloader: ProgressivePreloader = null;\n protected preloaderStreamable: ProgressivePreloader = null;\n\n //protected targetContainer: HTMLElement = null;\n //protected loadMore: () => void = null;\n\n protected log: ReturnType; \n\n protected isFirstOpen = true;\n\n // protected needLoadMore = true;\n\n protected pageEl = document.getElementById('page-chats') as HTMLDivElement;\n\n protected setMoverPromise: Promise;\n protected setMoverAnimationPromise: Promise;\n\n protected lazyLoadQueue: LazyLoadQueueBase;\n\n protected highlightSwitchersTimeout: number;\n\n protected onDownloadClick: (e: MouseEvent) => void;\n protected onPrevClick: (target: TargetType) => void;\n protected onNextClick: (target: TargetType) => void;\n\n protected videoPlayer: VideoPlayer;\n\n protected zoomElements: {\n container: HTMLElement,\n btnOut: HTMLElement,\n btnIn: HTMLElement,\n rangeSelector: RangeSelector\n } = {} as any;\n // protected zoomValue = ZOOM_INITIAL_VALUE;\n protected zoomSwipeHandler: SwipeHandler;\n protected zoomSwipeStartX = 0;\n protected zoomSwipeStartY = 0;\n protected zoomSwipeX = 0;\n protected zoomSwipeY = 0;\n \n protected ctrlKeyDown: boolean;\n\n get target() {\n return this.listLoader.current;\n }\n\n set target(value) {\n this.listLoader.current = value;\n }\n\n constructor(\n protected listLoader: ListLoader, \n topButtons: Array['buttons']>\n ) {\n super(false);\n\n this.log = logger('AMV');\n this.preloader = new ProgressivePreloader();\n this.preloaderStreamable = new ProgressivePreloader({\n cancelable: false,\n streamable: true\n });\n this.preloader.construct();\n this.preloaderStreamable.construct();\n this.lazyLoadQueue = new LazyLoadQueueBase();\n\n this.wholeDiv = document.createElement('div');\n this.wholeDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-whole');\n\n this.overlaysDiv = document.createElement('div');\n this.overlaysDiv.classList.add('overlays');\n\n const mainDiv = document.createElement('div');\n mainDiv.classList.add(MEDIA_VIEWER_CLASSNAME);\n\n const topbar = this.topbar = document.createElement('div');\n topbar.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar', MEDIA_VIEWER_CLASSNAME + '-appear');\n\n const topbarLeft = document.createElement('div');\n topbarLeft.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar-left');\n\n this.buttons['mobile-close'] = ButtonIcon('close', {onlyMobile: true});\n \n // * author\n this.author.container = document.createElement('div');\n this.author.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-author', 'no-select');\n const authorRight = document.createElement('div');\n \n this.author.avatarEl = new AvatarElement();\n this.author.avatarEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-userpic', 'avatar-44');\n \n this.author.nameEl = document.createElement('div');\n this.author.nameEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-name');\n \n this.author.date = document.createElement('div');\n this.author.date.classList.add(MEDIA_VIEWER_CLASSNAME + '-date');\n \n authorRight.append(this.author.nameEl, this.author.date);\n \n this.author.container.append(this.author.avatarEl, authorRight);\n \n // * buttons\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-buttons');\n \n topButtons.concat(['download', 'zoom', 'close']).forEach(name => {\n const button = ButtonIcon(name, {noRipple: true});\n this.buttons[name] = button;\n buttonsDiv.append(button);\n });\n\n this.buttons.zoom.classList.add('zoom-in');\n\n // * zoom\n this.zoomElements.container = document.createElement('div');\n this.zoomElements.container.classList.add('zoom-container');\n\n this.zoomElements.btnOut = ButtonIcon('zoomout', {noRipple: true});\n this.zoomElements.btnOut.addEventListener('click', () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n this.zoomElements.btnIn.addEventListener('click', () => 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.setNewMover();\n }\n\n protected setListeners() {\n this.buttons.download.addEventListener('click', this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach(el => {\n el.addEventListener('click', this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n \n this.listLoader.go(moveLength);\n });\n });\n\n this.buttons.zoom.addEventListener('click', () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\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(VideoPlayer.isFullScreen()) {\n return;\n }\n //console.log(xDiff, yDiff);\n\n const percents = Math.abs(xDiff) / windowSize.windowW;\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.windowH;\n if(percentsY > .2 || yDiff > 125) {\n this.buttons.close.click();\n return true;\n }\n\n return false;\n }, \n verifyTouchTarget: (evt) => {\n // * Fix for seek input\n if((evt.target as HTMLElement).tagName === 'INPUT' || findUpClassName(evt.target, 'media-viewer-caption')) {\n return false;\n }\n\n return true;\n }\n });\n }\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming();\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n if(isVisible === enable) return;\n\n if(enable === undefined) {\n enable = !isVisible;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', enable);\n const zoomValue = enable ? this.zoomElements.rangeSelector.value : 1;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n\n if(enable) {\n if(!this.zoomSwipeHandler) {\n let lastDiffX: number, lastDiffY: number;\n const multiplier = -1;\n this.zoomSwipeHandler = new SwipeHandler({\n element: this.moversContainer,\n onFirstSwipe: () => {\n lastDiffX = lastDiffY = 0;\n this.moversContainer.classList.add('no-transition');\n },\n onSwipe: (xDiff, yDiff) => {\n [xDiff, yDiff] = [xDiff * multiplier, yDiff * multiplier];\n this.zoomSwipeX += xDiff - lastDiffX;\n this.zoomSwipeY += yDiff - lastDiffY;\n [lastDiffX, lastDiffY] = [xDiff, yDiff];\n\n this.setZoomValue();\n },\n onReset: () => {\n this.moversContainer.classList.remove('no-transition');\n },\n cursor: 'move'\n });\n } else {\n this.zoomSwipeHandler.setListeners();\n }\n \n this.zoomElements.rangeSelector.setProgress(zoomValue);\n } else if(!enable) {\n this.zoomSwipeHandler.removeListeners();\n }\n }\n\n protected changeZoom(add: boolean) {\n this.zoomElements.rangeSelector.addProgress(ZOOM_STEP * (add ? 1 : -1));\n this.setZoomValue();\n }\n\n protected setZoomValue = (value = this.zoomElements.rangeSelector.value) => {\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.zoomSwipeX = 0;\n this.zoomSwipeY = 0;\n }\n\n this.moversContainer.style.transform = `matrix(${value}, 0, 0, ${value}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`;\n\n this.zoomElements.btnOut.classList.toggle('inactive', value === ZOOM_MIN_VALUE);\n this.zoomElements.btnIn.classList.toggle('inactive', value === ZOOM_MAX_VALUE);\n\n this.toggleZoom(value !== ZOOM_INITIAL_VALUE);\n };\n\n protected isZooming() {\n return this.zoomElements.container.classList.contains('is-visible');\n }\n\n protected setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({onlyMobile: true}, 'bottom-left', buttons);\n this.topbar.append(btnMenuToggle);\n }\n\n public close(e?: MouseEvent) {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.setMoverAnimationPromise) return Promise.reject();\n\n appNavigationController.removeByType('media');\n\n this.lazyLoadQueue.clear();\n\n const promise = this.setMoverToTarget(this.target?.element, true).then(({onAnimationEnd}) => onAnimationEnd);\n\n this.listLoader.reset();\n (this.listLoader as any).cleanup && (this.listLoader as any).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n (window as any).appMediaViewer = undefined;\n\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n this.zoomSwipeHandler = undefined;\n }\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n promise.then(() => {\n appSidebarRight.forwardTab.closeBtn.click();\n });\n } */\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n\n promise.finally(() => {\n this.wholeDiv.remove();\n rootScope.isOverlayActive = false;\n animationIntersector.checkAnimations(false);\n });\n\n return promise;\n }\n\n onClick = (e: MouseEvent) => {\n if(this.setMoverAnimationPromise) return;\n\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') return;\n cancelEvent(e);\n\n if(IS_TOUCH_SUPPORTED) {\n if(this.highlightSwitchersTimeout) {\n clearTimeout(this.highlightSwitchersTimeout);\n } else {\n this.wholeDiv.classList.add('highlight-switchers');\n }\n\n this.highlightSwitchersTimeout = window.setTimeout(() => {\n this.wholeDiv.classList.remove('highlight-switchers');\n this.highlightSwitchersTimeout = 0;\n }, 3e3);\n \n return;\n }\n\n const isZooming = this.isZooming();\n let mover: HTMLElement = null;\n const classNames = ['ckin__player', 'media-viewer-buttons', 'media-viewer-author', 'media-viewer-caption', 'zoom-container'];\n if(isZooming) {\n classNames.push('media-viewer-movers');\n }\n\n classNames.find(s => {\n try {\n mover = findUpClassName(target, s);\n if(mover) return true;\n } catch(err) {return false;}\n });\n\n if(/* target === this.mediaViewerDiv */!mover || (!isZooming && (target.tagName === 'IMG' || target.tagName === 'image'))) {\n this.buttons.close.click();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n //this.log('onKeyDown', e);\n if(rootScope.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n \n let good = true;\n if(key === 'ArrowRight') {\n this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.changeZoom(key === '=');\n }\n } else {\n good = false;\n }\n\n if(e.ctrlKey || e.metaKey) {\n this.ctrlKeyDown = true;\n }\n\n if(good) {\n cancelEvent(e);\n }\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n if(rootScope.overlaysActive > 1) {\n return;\n }\n\n if(!(e.ctrlKey || e.metaKey)) {\n this.ctrlKeyDown = false;\n\n if(this.isZooming()) {\n this.setZoomValue();\n }\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n if(rootScope.overlaysActive > 1 || (findUpClassName(e.target, 'media-viewer-caption') && !this.ctrlKeyDown)) {\n return;\n }\n\n cancelEvent(e);\n\n if(this.ctrlKeyDown) {\n const scrollingUp = e.deltaY < 0;\n // if(!scrollingUp && !this.isZooming()) return;\n this.changeZoom(!!scrollingUp);\n }\n };\n\n protected async setMoverToTarget(target: HTMLElement, closing = false, fromRight = 0) {\n this.dispatchEvent('setMoverBefore');\n\n const mover = this.content.mover;\n\n if(!closing) {\n mover.innerHTML = '';\n //mover.append(this.buttons.prev, this.buttons.next);\n }\n \n const zoomValue = this.isZooming() && closing /* && false */ ? this.zoomElements.rangeSelector.value : ZOOM_INITIAL_VALUE;\n /* if(!(zoomValue > 1 && closing)) */ this.removeCenterFromMover(mover);\n\n const wasActive = fromRight !== 0;\n\n const delay = rootScope.settings.animationsEnabled ? (wasActive ? 350 : 200) : 0;\n //let delay = wasActive ? 350 : 10000;\n\n /* if(wasActive) {\n this.moveTheMover(mover);\n mover = this.setNewMover();\n } */\n\n /* if(DEBUG) {\n this.log('setMoverToTarget', target, closing, wasActive, fromRight);\n } */\n\n let realParent: HTMLElement;\n\n let rect: DOMRect;\n if(target) {\n if(target instanceof AvatarElement || target.classList.contains('grid-item')/* || target.classList.contains('document-ico') */) {\n realParent = target;\n rect = target.getBoundingClientRect();\n } else if(target instanceof SVGImageElement || target.parentElement instanceof SVGForeignObjectElement) {\n realParent = findUpClassName(target, 'attachment');\n rect = realParent.getBoundingClientRect();\n } else if(target.classList.contains('profile-avatars-avatar')) {\n realParent = findUpClassName(target, 'profile-avatars-container');\n rect = realParent.getBoundingClientRect();\n\n // * if not active avatar\n if(closing && target.getBoundingClientRect().left !== rect.left) {\n target = realParent = rect = undefined;\n }\n }\n }\n\n if(!target) {\n target = this.content.media;\n }\n\n if(!rect) {\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n }\n\n let needOpacity = false;\n if(target !== this.content.media && !target.classList.contains('profile-avatars-avatar')) {\n const overflowElement = findUpClassName(realParent, 'scrollable');\n const visibleRect = getVisibleRect(realParent, overflowElement);\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.windowW : -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.windowW / 2 - rect.width / 2;\n const willBeTop = windowSize.windowH / 2 - rect.height / 2;\n const left = rect.left - willBeLeft/* + (width - rect.width) / 2 */;\n const top = rect.top - willBeTop/* + (height - rect.height) / 2 */;\n this.moversContainer.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${left}, ${top})`;\n } else {\n mover.style.transform = transform;\n }\n\n needOpacity && (mover.style.opacity = '0'/* !closing ? '0' : '' */);\n\n /* if(wasActive) {\n this.log('setMoverToTarget', mover.style.transform);\n } */\n\n let path: SVGPathElement;\n const isOut = target.classList.contains('is-out');\n\n const deferred = this.setMoverAnimationPromise = deferredPromise();\n const ret = {onAnimationEnd: deferred};\n\n const timeout = setTimeout(() => {\n if(!deferred.isFulfilled && !deferred.isRejected) {\n deferred.resolve();\n }\n }, 1000);\n\n deferred.finally(() => {\n this.dispatchEvent('setMoverAfter');\n\n if(this.setMoverAnimationPromise === deferred) {\n this.setMoverAnimationPromise = null;\n }\n \n clearTimeout(timeout);\n });\n\n if(!closing) {\n let mediaElement: HTMLImageElement | HTMLVideoElement;\n let src: string;\n\n if(target instanceof HTMLVideoElement) {\n const elements = Array.from(target.parentElement.querySelectorAll('img')) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n }\n }\n\n if(target.tagName === 'DIV' || target.tagName === 'AVATAR-ELEMENT') { // useContainerAsTarget\n const images = Array.from(target.querySelectorAll('img')) as HTMLImageElement[];\n const image = images.pop();\n if(image) {\n mediaElement = new Image();\n src = image.src;\n mover.append(mediaElement);\n }\n /* mediaElement = new Image();\n src = target.style.backgroundImage.slice(5, -2); */\n \n } else if(target instanceof HTMLImageElement) {\n mediaElement = new Image();\n src = target.src;\n } else if(target instanceof HTMLVideoElement) {\n mediaElement = document.createElement('video');\n mediaElement.src = target.src;\n } else if(target instanceof SVGSVGElement) {\n const clipId = target.dataset.clipId;\n const newClipId = clipId + '-mv';\n\n const {width, height} = containerRect;\n\n const newSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n newSvg.setAttributeNS(null, 'width', '' + width);\n newSvg.setAttributeNS(null, 'height', '' + height);\n\n // нижние два свойства для масштабирования\n newSvg.setAttributeNS(null, 'viewBox', `0 0 ${width} ${height}`);\n newSvg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet');\n\n newSvg.insertAdjacentHTML('beforeend', target.firstElementChild.outerHTML.replace(clipId, newClipId));\n newSvg.insertAdjacentHTML('beforeend', target.lastElementChild.outerHTML.replace(clipId, newClipId));\n\n // теперь надо выставить новую позицию для хвостика\n const defs = newSvg.firstElementChild;\n const use = defs.firstElementChild.firstElementChild as SVGUseElement;\n if(use instanceof SVGUseElement) {\n let transform = use.getAttributeNS(null, 'transform');\n transform = transform.replace(/translate\\((.+?), (.+?)\\) scale\\((.+?), (.+?)\\)/, (match, x, y, sX, sY) => {\n x = +x;\n if(x !== 2) {\n x = width - (2 / scaleX);\n } else {\n x = 2 / scaleX;\n }\n \n y = height;\n \n return `translate(${x}, ${y}) scale(${+sX / scaleX}, ${+sY / scaleY})`;\n });\n use.setAttributeNS(null, 'transform', transform);\n \n // и новый RECT\n path = defs.firstElementChild.lastElementChild as SVGPathElement;\n\n // код ниже нужен только чтобы скрыть моргание до момента как сработает таймаут\n let d: string;\n const br: [number, number, number, number] = borderRadius.split(' ').map(v => parseInt(v)) as any;\n if(isOut) d = generatePathData(0, 0, width - 9 / scaleX, height, ...br);\n else d = generatePathData(9 / scaleX, 0, width - 9 / scaleX, height, ...br);\n path.setAttributeNS(null, 'd', d);\n }\n\n const foreignObject = newSvg.lastElementChild;\n foreignObject.setAttributeNS(null, 'width', '' + containerRect.width);\n foreignObject.setAttributeNS(null, 'height', '' + containerRect.height);\n \n mover.prepend(newSvg);\n }\n\n if(aspecter) {\n aspecter.style.borderRadius = borderRadius;\n\n if(mediaElement) {\n aspecter.append(mediaElement);\n }\n }\n\n mediaElement = mover.querySelector('video, img');\n if(mediaElement instanceof HTMLImageElement) {\n mediaElement.classList.add('thumbnail');\n if(!aspecter) {\n mediaElement.style.width = containerRect.width + 'px';\n mediaElement.style.height = containerRect.height + 'px';\n }\n\n if(src) {\n await renderImageFromUrlPromise(mediaElement, src);\n }\n }/* else if(mediaElement instanceof HTMLVideoElement && mediaElement.firstElementChild && ((mediaElement.firstElementChild as HTMLSourceElement).src || src)) {\n await new Promise((resolve, reject) => {\n mediaElement.addEventListener('loadeddata', resolve);\n\n if(src) {\n (mediaElement.firstElementChild as HTMLSourceElement).src = src;\n }\n });\n } */\n \n mover.style.display = '';\n\n fastRaf(() => {\n mover.classList.add(wasActive ? 'moving' : 'active');\n });\n } else {\n /* if(mover.classList.contains('center')) {\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n } */\n \n if(target instanceof SVGSVGElement) {\n path = mover.querySelector('path');\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, false, isOut, borderRadius);\n }\n }\n\n if(target.classList.contains('media-viewer-media')) {\n mover.classList.add('hiding');\n }\n\n this.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\n\n //return ret;\n\n setTimeout(() => {\n mover.style.borderRadius = borderRadius;\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = borderRadius;\n }\n }, delay / 2);\n\n setTimeout(() => {\n mover.innerHTML = '';\n mover.classList.remove('moving', 'active', 'hiding');\n mover.style.cssText = 'display: none;';\n\n deferred.resolve();\n }, delay);\n\n mover.classList.remove('opening');\n\n return ret;\n }\n\n mover.classList.add('opening');\n\n //await new Promise((resolve) => setTimeout(resolve, 0));\n //await new Promise((resolve) => window.requestAnimationFrame(resolve));\n // * одного RAF'а недостаточно, иногда анимация с одним не срабатывает (преимущественно на мобильных)\n await doubleRaf();\n\n // чтобы проверить установленную позицию - раскомментировать\n // throw '';\n\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\n\n mover.style.transform = `translate3d(${containerRect.left}px,${containerRect.top}px,0) scale3d(1,1,1)`;\n //mover.style.transform = `translate(-50%,-50%) scale(1,1)`;\n needOpacity && (mover.style.opacity = ''/* closing ? '0' : '' */);\n\n if(aspecter) {\n this.setFullAspect(aspecter, containerRect, rect);\n }\n\n //throw '';\n\n setTimeout(() => {\n mover.style.borderRadius = '';\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = '';\n }\n }, 0/* delay / 2 */);\n\n mover.dataset.timeout = '' + setTimeout(() => {\n mover.classList.remove('moving', 'opening');\n\n if(aspecter) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n if(mover.querySelector('video') || true) {\n mover.classList.remove('active');\n aspecter.style.cssText = '';\n void mover.offsetLeft; // reflow\n }\n \n //aspecter.classList.remove('disable-hover');\n }\n\n // эти строки нужны для установки центральной позиции, в случае ресайза это будет нужно\n mover.classList.add('center', 'no-transition');\n /* mover.style.left = mover.style.top = '50%';\n mover.style.transform = 'translate(-50%, -50%)';\n void mover.offsetLeft; // reflow */\n\n // это уже нужно для будущих анимаций\n mover.classList.add('active');\n delete mover.dataset.timeout;\n\n deferred.resolve();\n }, delay);\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, true, isOut, borderRadius);\n }\n\n return ret;\n }\n\n protected setFullAspect(aspecter: HTMLDivElement, containerRect: DOMRect, rect: DOMRect) {\n /* let media = aspecter.firstElementChild;\n let proportion: number;\n if(media instanceof HTMLImageElement) {\n proportion = media.naturalWidth / media.naturalHeight;\n } else if(media instanceof HTMLVideoElement) {\n proportion = media.videoWidth / media.videoHeight;\n } */\n const proportion = containerRect.width / containerRect.height;\n\n let {width, height} = rect;\n /* if(proportion === 1) {\n aspecter.style.cssText = '';\n } else { */\n if(proportion > 0) {\n width = height * proportion;\n } else {\n height = width * proportion;\n }\n\n //this.log('will set style aspecter:', `width: ${width}px; height: ${height}px; transform: scale(${containerRect.width / width}, ${containerRect.height / height});`);\n\n aspecter.style.cssText = `width: ${width}px; height: ${height}px; transform: scale3d(${containerRect.width / width}, ${containerRect.height / height}, 1);`;\n //}\n }\n\n protected sizeTailPath(path: SVGPathElement, rect: DOMRect, scaleX: number, delay: number, upscale: boolean, isOut: boolean, borderRadius: string) {\n const start = Date.now();\n const {width, height} = rect;\n delay = delay / 2;\n\n const br = borderRadius.split(' ').map(v => parseInt(v));\n\n const step = () => {\n const diff = Date.now() - start;\n\n let progress = delay ? diff / delay : 1;\n if(progress > 1) progress = 1;\n if(upscale) progress = 1 - progress;\n\n const _br: [number, number, number, number] = br.map(v => v * progress) as any;\n\n let d: string;\n if(isOut) d = generatePathData(0, 0, width - (9 / scaleX * progress), height, ..._br);\n else d = generatePathData(9 / scaleX * progress, 0, width/* width - (9 / scaleX * progress) */, height, ..._br);\n path.setAttributeNS(null, 'd', d);\n\n if(diff < delay) fastRaf(step);\n };\n \n //window.requestAnimationFrame(step);\n step();\n }\n\n protected removeCenterFromMover(mover: HTMLElement) {\n if(mover.classList.contains('center')) {\n //const rect = mover.getBoundingClientRect();\n const rect = this.content.media.getBoundingClientRect();\n mover.style.transform = `translate3d(${rect.left}px,${rect.top}px,0)`;\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n mover.classList.remove('no-transition');\n }\n }\n\n protected moveTheMover(mover: HTMLElement, toLeft = true) {\n const windowW = windowSize.windowW;\n\n this.removeCenterFromMover(mover);\n\n //mover.classList.remove('active');\n mover.classList.add('moving');\n\n if(mover.dataset.timeout) { // и это тоже всё из-за скейла видео, так бы это не нужно было\n clearTimeout(+mover.dataset.timeout);\n }\n\n const rect = mover.getBoundingClientRect();\n\n const newTransform = mover.style.transform.replace(/translate3d\\((.+?),/, (match, p1) => {\n const x = toLeft ? -rect.width : windowW;\n //const x = toLeft ? -(rect.right + (rect.width / 2)) : windowW / 2;\n\n return match.replace(p1, x + 'px');\n });\n\n ////////this.log('set newTransform:', newTransform, mover.style.transform, toLeft);\n mover.style.transform = newTransform;\n\n setTimeout(() => {\n mover.remove();\n }, 350);\n }\n\n protected setNewMover() {\n const newMover = document.createElement('div');\n newMover.classList.add('media-viewer-mover');\n newMover.style.display = 'none';\n\n if(this.content.mover) {\n const oldMover = this.content.mover;\n oldMover.parentElement.append(newMover);\n } else {\n this.moversContainer.append(newMover);\n }\n\n return this.content.mover = newMover;\n }\n\n protected updateMediaSource(target: HTMLElement, url: string, tagName: 'video' | 'img') {\n //if(target instanceof SVGSVGElement) {\n const el = target.tagName.toLowerCase() === tagName ? target : target.querySelector(tagName) as HTMLElement;\n if(el && !findUpClassName(target, 'document')) {\n if(findUpClassName(target, 'attachment')) {\n // two parentElements because element can be contained in aspecter\n const preloader = target.parentElement.parentElement.querySelector('.preloader-container') as HTMLElement;\n if(preloader) {\n if(tagName === 'video') {\n if(preloader.classList.contains('manual')) {\n preloader.click();\n // return;\n }\n \n return;\n }\n \n preloader.remove();\n }\n }\n\n renderImageFromUrl(el, url);\n\n // ! костыль, но он тут даже и не нужен\n if(el.classList.contains('thumbnail') && el.parentElement.classList.contains('media-container-aspecter')) {\n el.classList.remove('thumbnail');\n }\n }\n /* } else {\n\n } */\n }\n\n protected setAuthorInfo(fromId: PeerId | string, timestamp: number) {\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n\n const isPeerId = fromId.isPeerId();\n let title: HTMLElement;\n if(isPeerId) {\n title = new PeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n } else {\n title = document.createElement('span');\n title.innerHTML = RichTextProcessor.wrapEmojiText(fromId);\n title.classList.add('peer-title');\n }\n\n replaceContent(this.author.nameEl, title);\n\n let oldAvatar = this.author.avatarEl;\n this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n if(!isPeerId) {\n this.author.avatarEl.setAttribute('peer-title', '' + fromId);\n } else {\n this.author.avatarEl.removeAttribute('peer-title');\n }\n\n this.author.avatarEl.setAttribute('peer', '' + (fromId || NULL_PEER_ID));\n\n oldAvatar.parentElement.replaceChild(this.author.avatarEl, oldAvatar);\n }\n \n protected async _openMedia(\n media: MyDocument | MyPhoto, \n timestamp: number, \n fromId: PeerId | string, \n fromRight: number, \n target?: HTMLElement, \n reverse = false, \n prevTargets: TargetType[] = [], \n nextTargets: TargetType[] = [], \n message?: MyMessage\n /* , needLoadMore = true */\n ) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n /* if(DEBUG) {\n this.log('openMedia:', media, fromId, prevTargets, nextTargets);\n } */\n\n this.setAuthorInfo(fromId, timestamp);\n \n const isDocument = media._ === 'document';\n const isVideo = isDocument && media.mime_type && ((['video', 'gif'] as MyDocument['type'][]).includes(media.type) || media.mime_type.indexOf('video/') === 0);\n\n if(this.isFirstOpen) {\n //this.targetContainer = targetContainer;\n // this.needLoadMore = needLoadMore;\n this.isFirstOpen = false;\n this.listLoader.setTargets(prevTargets, nextTargets, reverse);\n (window as any).appMediaViewer = this;\n //this.loadMore = loadMore;\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n appSidebarRight.forwardTab.closeBtn.click();\n await new Promise((resolve) => setTimeout(resolve, 200));\n } */\n }\n\n /* if(this.nextTargets.length < 10 && this.loadMore) {\n this.loadMore();\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 window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n if(!IS_TOUCH_SUPPORTED) window.addEventListener('wheel', this.onWheel, {passive: false, capture: true});\n const mainColumns = document.getElementById('main-columns');\n this.pageEl.insertBefore(this.wholeDiv, mainColumns);\n void this.wholeDiv.offsetLeft; // reflow\n this.wholeDiv.classList.add('active');\n rootScope.isOverlayActive = true;\n animationIntersector.checkAnimations(true);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n \n this.close();\n }\n });\n }\n }\n\n ////////this.log('wasActive:', wasActive);\n\n const mover = this.content.mover;\n\n const maxWidth = windowSize.windowW;\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.windowH;\n if(windowH < 1000000 && !mediaSizes.isMobile) {\n padding = 120;\n }\n const maxHeight = windowH - 120 - padding;\n let thumbPromise: Promise = Promise.resolve();\n const size = appPhotosManager.setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = appDownloadManager.getCacheContext(media, size.type);\n let img: HTMLImageElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(media, cacheContext, true);\n if(gotThumb) {\n thumbPromise = gotThumb.loadPromise;\n img = gotThumb.image;\n }\n }\n\n if(img) {\n img.classList.add('thumbnail');\n container.append(img);\n }\n }\n\n // need after setAttachmentSize\n /* if(useContainerAsTarget) {\n target = target.querySelector('img, video') || target;\n } */\n\n const supportsStreaming: boolean = !!(isDocument && media.supportsStreaming);\n const preloader = supportsStreaming ? this.preloaderStreamable : this.preloader;\n\n let setMoverPromise: Promise;\n if(isVideo) {\n ////////this.log('will wrap video', media, size);\n\n // потому что для safari нужно создать элемент из event'а\n // const video = document.createElement('video');\n const useController = message && media.type !== 'gif';\n const video = /* useController ? \n appMediaPlaybackController.addMedia(message, false, true) as HTMLVideoElement : \n */document.createElement('video');\n\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n //const video = mover.querySelector('video') || document.createElement('video');\n \n const moverVideo = mover.querySelector('video');\n if(moverVideo) {\n moverVideo.remove();\n }\n \n //video.src = '';\n \n video.setAttribute('playsinline', 'true');\n \n // * fix for playing video if viewer is closed (https://contest.com/javascript-web-bonus/entry1425#issue11629)\n video.addEventListener('timeupdate', () => {\n if(this.tempId !== tempId) {\n video.pause();\n }\n });\n\n video.addEventListener('error', () => {\n if(video.error.code !== 4) {\n this.log.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\n }\n\n if(preloader) {\n preloader.detach();\n }\n }, {once: true});\n\n this.addEventListener('setMoverAfter', () => {\n video.src = '';\n video.load();\n }, {once: true});\n \n if(IS_SAFARI) {\n // test stream\n // video.controls = true;\n video.autoplay = true;\n }\n \n if(media.type === 'gif') {\n video.muted = true;\n video.autoplay = true;\n video.loop = true;\n }\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(video, play, supportsStreaming);\n player.addEventListener('toggleControls', (show) => {\n this.wholeDiv.classList.toggle('has-video-controls', show);\n });\n\n this.addEventListener('setMoverBefore', () => {\n this.wholeDiv.classList.remove('has-video-controls');\n this.videoPlayer.removeListeners();\n this.videoPlayer = undefined;\n }, {once: true});\n\n if(this.isZooming()) {\n this.videoPlayer.lockControls(false);\n }\n /* div.append(video);\n mover.append(player.wrapper); */\n });\n }\n };\n \n if(supportsStreaming) {\n onAnimationEnd.then(() => {\n if(video.readyState < video.HAVE_FUTURE_DATA) {\n preloader.attach(mover, true);\n }\n \n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n \n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n //this.log('video waited and progress loaded');\n preloader.detach();\n video.parentElement.classList.remove('is-buffering');\n }, {once: true});\n };\n \n video.addEventListener('waiting', () => {\n const loading = video.networkState === video.NETWORK_LOADING;\n const isntEnoughData = video.readyState < video.HAVE_FUTURE_DATA;\n \n //this.log('video waiting for progress', loading, isntEnoughData);\n if(loading && isntEnoughData) {\n attachCanPlay();\n \n preloader.attach(mover, true);\n \n // поставлю класс для плеера, чтобы убрать большую иконку пока прелоадер на месте\n video.parentElement.classList.add('is-buffering');\n }\n });\n \n attachCanPlay();\n }\n \n //if(!video.src || media.url !== video.src) {\n const load = () => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const cacheContext = appDownloadManager.getCacheContext(media);\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDocsManager.downloadDoc(media);\n \n if(!supportsStreaming) {\n onAnimationEnd.then(() => {\n if(!cacheContext.url) {\n preloader.attach(mover, true, promise);\n }\n });\n }\n \n Promise.all([promise, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n if(useController) {\n const rollback = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n rollback();\n }, {once: true});\n }\n \n const url = cacheContext.url;\n if(target instanceof SVGSVGElement/* && (video.parentElement || !isSafari) */) { // if video exists\n //if(!video.parentElement) {\n div.firstElementChild.lastElementChild.append(video);\n //}\n } else {\n renderImageFromUrl(video, url);\n }\n\n this.updateMediaSource(target, url, 'video');\n\n createPlayer();\n });\n \n return promise;\n };\n \n this.lazyLoadQueue.unshift({load});\n //} else createPlayer();\n });\n\n setMoverPromise = thumbPromise.then(set);\n } else {\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const load = () => {\n const cacheContext = appDownloadManager.getCacheContext(media, size.type);\n const cancellablePromise = isDocument ? appDocsManager.downloadDoc(media) : appPhotosManager.preloadPhoto(media, size);\n \n onAnimationEnd.then(() => {\n if(!cacheContext.url) {\n this.preloader.attachPromise(cancellablePromise);\n //this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n \n Promise.all([onAnimationEnd, cancellablePromise]).then(() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed photo');\n return;\n }\n \n ///////this.log('indochina', blob);\n \n const url = cacheContext.url;\n if(target instanceof SVGSVGElement) {\n this.updateMediaSource(target, url, 'img');\n this.updateMediaSource(mover, url, 'img');\n \n if(mediaSizes.isMobile) {\n const imgs = mover.querySelectorAll('img');\n if(imgs && imgs.length) {\n imgs.forEach(img => {\n img.classList.remove('thumbnail'); // может здесь это вообще не нужно\n });\n }\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = div.firstElementChild?.tagName === 'IMG' ? div.firstElementChild as HTMLImageElement : null;\n if(!haveImage || haveImage.src !== url) {\n let image = new Image();\n image.classList.add('thumbnail');\n \n //this.log('will renderImageFromUrl:', image, div, target);\n \n renderImageFromUrl(image, url, () => {\n this.updateMediaSource(target, url, 'img');\n \n if(haveImage) {\n fastRaf(() => {\n haveImage.remove();\n });\n }\n \n div.append(image);\n });\n }\n }\n \n //this.preloader.detach();\n }).catch(err => {\n this.log.error(err);\n this.preloader.attach(mover);\n this.preloader.setManual();\n });\n \n return cancellablePromise;\n };\n \n this.lazyLoadQueue.unshift({load});\n });\n\n setMoverPromise = thumbPromise.then(set);\n }\n\n return this.setMoverPromise = setMoverPromise.catch(() => {\n this.setMoverAnimationPromise = null;\n }).finally(() => {\n this.setMoverPromise = null;\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getVisibleRect(element: HTMLElement, overflowElement: HTMLElement) {\r\n const rect = element.getBoundingClientRect();\r\n const overflowRect = overflowElement.getBoundingClientRect();\r\n\r\n let {top: overflowTop, bottom: overflowBottom} = overflowRect;\r\n\r\n // * respect sticky headers\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 if(rect.top >= overflowBottom\r\n || rect.bottom <= overflowTop\r\n || rect.right <= overflowRect.left\r\n || rect.left >= overflowRect.right) {\r\n return null;\r\n }\r\n\r\n const overflow = {\r\n top: false,\r\n right: false,\r\n bottom: false,\r\n left: false,\r\n vertical: 0 as 0 | 1 | 2,\r\n horizontal: 0 as 0 | 1 | 2\r\n };\r\n\r\n // @ts-ignore\r\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\r\n const windowWidth = w.width || w.innerWidth;\r\n const windowHeight = w.height || w.innerHeight;\r\n\r\n return {\r\n rect: {\r\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\r\n right: 0,\r\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\r\n left: 0\r\n },\r\n overflow\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function fillPropertyValue(str: string) {\r\n let splitted = str.split(' ');\r\n if(splitted.length !== 4) {\r\n if(!splitted[0]) splitted[0] = '0px';\r\n for(let i = splitted.length; i < 4; ++i) {\r\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\r\n }\r\n }\r\n\r\n return splitted;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MEDIA_MIME_TYPES_SUPPORTED from \"../environment/mediaMimeTypesSupport\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport SearchListLoader from \"../helpers/searchListLoader\";\nimport { Message } from \"../layer\";\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appMessagesManager, { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport appPhotosManager, { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport { MediaSearchContext } from \"./appMediaPlaybackController\";\nimport AppMediaViewerBase, { MEDIA_VIEWER_CLASSNAME } from \"./appMediaViewerBase\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteMessages from \"./popups/deleteMessages\";\nimport PopupForward from \"./popups/forward\";\nimport Scrollable from \"./scrollable\";\nimport appSidebarRight from \"./sidebarRight\";\nimport AppSharedMediaTab from \"./sidebarRight/tabs/sharedMedia\";\n\ntype AppMediaViewerTargetType = {\n element: HTMLElement,\n mid: number,\n peerId: PeerId\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected btnMenuDelete: HTMLElement;\n protected listLoader: SearchListLoader;\n\n get searchContext() {\n return this.listLoader.searchContext;\n }\n\n constructor() {\n super(new SearchListLoader({\n processItem: (item) => {\n const isForDocument = this.searchContext.inputFilter._ === 'inputMessagesFilterDocument';\n const {mid, peerId} = item;\n const media: MyPhoto | MyDocument = appMessagesManager.getMediaFromMessage(item);\n\n if(!media) return;\n \n if(isForDocument && !AppMediaViewer.isMediaCompatibleForDocumentViewer(media)) {\n return;\n }\n\n return {element: null as HTMLElement, mid, peerId};\n }\n }), ['delete', 'forward']);\n\n this.listLoader.onEmptied = () => {\n this.close();\n };\n\n /* const stub = document.createElement('div');\n stub.classList.add(MEDIA_VIEWER_CLASSNAME + '-stub');\n this.content.main.prepend(stub); */\n\n this.content.caption = document.createElement('div');\n this.content.caption.classList.add(MEDIA_VIEWER_CLASSNAME + '-caption'/* , 'media-viewer-stub' */);\n\n let captionTimeout: number;\n const setCaptionTimeout = () => {\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n }\n\n captionTimeout = window.setTimeout(() => {\n captionTimeout = undefined;\n this.content.caption.classList.remove('is-focused');\n }, 800);\n };\n this.content.caption.addEventListener('touchstart', () => {\n if(!mediaSizes.isMobile) return;\n\n this.content.caption.classList.add('is-focused');\n \n if(captionTimeout) {\n clearTimeout(captionTimeout);\n captionTimeout = undefined;\n }\n \n document.addEventListener('touchend', setCaptionTimeout, {once: true});\n });\n\n const captionScrollable = new Scrollable(this.content.caption);\n captionScrollable.onAdditionalScroll = setCaptionTimeout;\n\n //this.content.main.append(this.content.caption);\n this.wholeDiv.append(this.content.caption);\n\n attachClickEvent(this.buttons.delete, this.onDeleteClick);\n\n const buttons: ButtonMenuItemOptions[] = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick\n }, {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick\n }];\n\n this.setBtnMenuToggle(buttons);\n this.btnMenuDelete = buttons[buttons.length - 1].element;\n\n // * constructing html end\n \n this.setListeners();\n }\n\n protected setListeners() {\n super.setListeners();\n this.buttons.forward.addEventListener('click', this.onForwardClick);\n this.author.container.addEventListener('click', this.onAuthorClick);\n\n const onCaptionClick = (e: MouseEvent) => {\n if(e.target instanceof HTMLAnchorElement) { // close viewer if it's t.me/ redirect\n const onclick = (e.target as HTMLElement).getAttribute('onclick');\n if(!onclick || onclick.includes('showMaskedAlert')) {\n return;\n }\n\n cancelEvent(e);\n\n this.close().then(() => {\n this.content.caption.removeEventListener('click', onCaptionClick, {capture: true});\n (e.target as HTMLAnchorElement).click();\n });\n\n return false;\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 ? appMessagesManager.getScheduledMessageByPeer(peerId, mid) : appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = (target: AppMediaViewerTargetType) => {\n this.openMedia(this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerTargetType) => {\n this.openMedia(this.getMessageByPeer(target.peerId, target.mid), target.element, 1);\n };\n\n onDeleteClick = () => {\n const target = this.target;\n new PopupDeleteMessages(target.peerId, [target.mid], 'chat', () => {\n this.target = {element: this.content.media} as any;\n this.close();\n });\n };\n\n onForwardClick = () => {\n const target = this.target;\n if(target.mid) {\n //appSidebarRight.forwardTab.open([target.mid]);\n new PopupForward({\n [target.peerId]: [target.mid]\n }, () => {\n return this.close();\n });\n }\n };\n\n onAuthorClick = (e: MouseEvent) => {\n const {mid, peerId} = this.target;\n if(mid && mid !== Number.MAX_SAFE_INTEGER) {\n const threadId = this.searchContext.threadId;\n const message = this.getMessageByPeer(peerId, mid);\n this.close(e)\n //.then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(() => {\n if(mediaSizes.isMobile) {\n const tab = appSidebarRight.getTab(AppSharedMediaTab);\n if(tab) {\n tab.close();\n }\n }\n\n appImManager.setInnerPeer(message.peerId, mid, threadId ? 'discussion' : undefined, threadId);\n });\n }\n };\n\n onDownloadClick = () => {\n const {peerId, mid} = this.target;\n const message = this.getMessageByPeer(peerId, mid);\n if(message.media.photo) {\n appPhotosManager.savePhotoFile(message.media.photo, appImManager.chat.bubbles.lazyLoadQueue.queueId);\n } else {\n let document: MyDocument = null;\n\n if(message.media.webpage) document = message.media.webpage.document;\n else document = message.media.document;\n\n if(document) {\n //console.log('will save document:', document);\n appDocsManager.saveDocFile(document, appImManager.chat.bubbles.lazyLoadQueue.queueId);\n }\n }\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html = '';\n if(caption) {\n html = RichTextProcessor.wrapRichText(caption, {\n entities: (message as Message.message).totalEntities\n });\n }\n \n // html = 'Dandelion are a family of flowering plants that grow in many parts of the world.';\n setInnerHTML(this.content.caption.firstElementChild, html);\n this.content.caption.classList.toggle('hide', !caption);\n // this.content.container.classList.toggle('with-caption', !!caption);\n }\n\n public setSearchContext(context: MediaSearchContext) {\n this.listLoader.setSearchContext(context);\n\n return this;\n }\n\n public async openMedia(message: MyMessage, target?: HTMLElement, fromRight = 0, reverse = false, \n prevTargets: AppMediaViewerTargetType[] = [], nextTargets: AppMediaViewerTargetType[] = []/* , needLoadMore = true */) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const mid = message.mid;\n const fromId = (message as Message.message).fwd_from && !message.fromId ? (message as Message.message).fwd_from.from_name : message.fromId;\n const media = appMessagesManager.getMediaFromMessage(message);\n\n this.buttons.forward.classList.toggle('hide', message._ === 'messageService');\n\n const canDeleteMessage = appMessagesManager.canDeleteMessage(message);\n [this.buttons.delete, this.btnMenuDelete].forEach(button => {\n button.classList.toggle('hide', !canDeleteMessage);\n });\n\n this.setCaption(message);\n const promise = super._openMedia(media, message.date, fromId, fromRight, target, reverse, prevTargets, nextTargets, message/* , needLoadMore */);\n this.target.mid = mid;\n this.target.peerId = message.peerId;\n\n return promise;\n }\n\n public static isMediaCompatibleForDocumentViewer(media: MyPhoto | MyDocument) {\n return media._ === 'photo' || MEDIA_MIME_TYPES_SUPPORTED.has(media.mime_type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Photo } from \"../layer\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport ListLoader, { ListLoaderOptions } from \"./listLoader\";\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n if(this.peerId.isAnyChat() || !older) return Promise.resolve({count: 0, items: []}); // ! это значит, что открыло аватар чата, но следующих фотографий нет.\n\n const maxId = anchor?.photoId;\n return appPhotosManager.getUserPhotos(this.peerId, maxId, loadCount).then(value => {\n const items = value.photos.map(photoId => {\n return {element: null as HTMLElement, photoId} as any;\n });\n\n return {count: value.count, items};\n });\n }\n });\n\n this.loadedAllUp = true;\n this.peerId = options.peerId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarListLoader from \"../helpers/avatarListLoader\";\nimport { Photo } from \"../layer\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport AppMediaViewerBase from \"./appMediaViewerBase\";\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id']};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId}), [/* 'delete' */]);\n\n this.peerId = peerId;\n\n this.setBtnMenuToggle([{\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }/* , {\n icon: 'delete danger btn-disabled',\n text: 'Delete',\n onClick: () => {}\n } */]);\n\n // * constructing html end\n \n this.setListeners();\n }\n\n onPrevClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, 1);\n };\n\n onDownloadClick = () => {\n appPhotosManager.savePhotoFile(appPhotosManager.getPhoto(this.target.photoId), appImManager.chat.bubbles.lazyLoadQueue.queueId);\n };\n\n public async openMedia(photoId: Photo.photo['id'], target?: HTMLElement, fromRight = 0, prevTargets?: AppMediaViewerAvatarTargetType[], nextTargets?: AppMediaViewerAvatarTargetType[]) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const photo = appPhotosManager.getPhoto(photoId);\n const ret = super._openMedia(photo, photo.date, this.peerId, fromRight, target, false, prevTargets, nextTargets);\n this.target.photoId = photo.id;\n\n return ret;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { Message, Photo } from \"../layer\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\r\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\r\nimport AppMediaViewer from \"./appMediaViewer\";\r\nimport AppMediaViewerAvatar from \"./appMediaViewerAvatar\";\r\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\r\nimport { isObject } from \"../helpers/object\";\r\n\r\nconst onAvatarUpdate = (peerId: PeerId) => {\r\n appAvatarsManager.removeFromAvatarsCache(peerId);\r\n (Array.from(document.querySelectorAll('avatar-element[peer=\"' + peerId + '\"]')) as AvatarElement[]).forEach(elem => {\r\n //console.log('updating avatar:', elem);\r\n elem.update();\r\n });\r\n};\r\n\r\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n if(!appAvatarsManager.isAvatarCached(peerId)) {\r\n onAvatarUpdate(peerId);\r\n }\r\n});\r\n\r\nexport async function openAvatarViewer(\r\n target: HTMLElement, \r\n peerId: PeerId, \r\n middleware: () => boolean, \r\n message?: any, \r\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[], \r\n nextTargets?: typeof prevTargets\r\n) {\r\n let photo = await appProfileManager.getFullPhoto(peerId);\r\n if(!middleware() || !photo) {\r\n return;\r\n }\r\n\r\n const getTarget = () => {\r\n const good = Array.from(target.querySelectorAll('img')).find(img => !img.classList.contains('emoji'));\r\n return good ? target : null;\r\n };\r\n\r\n if(peerId.isAnyChat()) {\r\n const hadMessage = !!message;\r\n const inputFilter = 'inputMessagesFilterChatPhotos';\r\n if(!message) {\r\n message = await appMessagesManager.getSearch({\r\n peerId, \r\n inputFilter: {_: inputFilter}, \r\n maxId: 0, \r\n limit: 1 \r\n }).then(value => {\r\n //console.log(lol);\r\n // ! by descend\r\n return value.history[0];\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n }\r\n\r\n if(message) {\r\n // ! гений в деле, костылируем (но это гениально)\r\n const messagePhoto = message.action.photo;\r\n if(messagePhoto.id !== photo.id) {\r\n if(!hadMessage) {\r\n message = appMessagesManager.generateFakeAvatarMessage(peerId, photo);\r\n } else {\r\n \r\n }\r\n }\r\n\r\n const f = (arr: typeof prevTargets) => arr.map(el => ({\r\n element: el.element,\r\n mid: (el.item as Message.messageService).mid,\r\n peerId: (el.item as Message.messageService).peerId\r\n }));\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n peerId,\r\n inputFilter: {_: inputFilter},\r\n })\r\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n\r\n return;\r\n }\r\n }\r\n\r\n if(photo) {\r\n if(!isObject(message)) {\r\n photo = appPhotosManager.getPhoto(message);\r\n }\r\n \r\n const f = (arr: typeof prevTargets) => arr.map(el => ({\r\n element: el.element,\r\n photoId: el.item as string\r\n }));\r\n\r\n new AppMediaViewerAvatar(peerId).openMedia(photo.id, getTarget(), undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n }\r\n}\r\n\r\nconst believeMe: Map> = new Map();\r\nconst seen: Set = new Set();\r\n\r\nexport default class AvatarElement extends HTMLElement {\r\n private peerId: PeerId;\r\n private isDialog = false;\r\n private peerTitle: string;\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueueIntersector;\r\n private addedToQueue = false;\r\n\r\n connectedCallback() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n this.isDialog = this.getAttribute('dialog') === '1';\r\n if(this.getAttribute('clickable') === '') {\r\n this.setAttribute('clickable', 'set');\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\r\n disconnectedCallback() {\r\n // браузер вызывает этот метод при удалении элемента из документа\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n const set = believeMe.get(this.peerId);\r\n if(set && set.has(this)) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(this.peerId);\r\n }\r\n }\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n }\r\n\r\n static get observedAttributes(): string[] {\r\n return ['peer', 'dialog', 'peer-title'/* массив имён атрибутов для отслеживания их изменений */];\r\n }\r\n\r\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\r\n //console.log('avatar changed attribute:', name, oldValue, newValue);\r\n // вызывается при изменении одного из перечисленных выше атрибутов\r\n if(name === 'peer') {\r\n const newPeerId = (newValue || '').toPeerId() || NULL_PEER_ID;\r\n if(this.peerId === newPeerId) {\r\n return;\r\n }\r\n \r\n this.peerId = appPeersManager.getPeerMigratedTo(newPeerId) || newPeerId;\r\n\r\n const wasPeerId = (oldValue || '').toPeerId() || NULL_PEER_ID;\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 this.update();\r\n } else if(name === 'peer-title') {\r\n this.peerTitle = newValue;\r\n } else if(name === 'dialog') {\r\n this.isDialog = newValue === '1';\r\n }\r\n }\r\n\r\n private r(onlyThumb = false) {\r\n const res = appAvatarsManager.putPhoto(this, this.peerId, this.isDialog, this.peerTitle, onlyThumb);\r\n const promise = res ? res.loadPromise : Promise.resolve();\r\n if(this.loadPromises) {\r\n if(res && res.cached) {\r\n this.loadPromises.push(promise);\r\n }\r\n\r\n promise.finally(() => {\r\n this.loadPromises = undefined;\r\n });\r\n }\r\n\r\n return res;\r\n }\r\n\r\n public update() {\r\n if(this.lazyLoadQueue) {\r\n if(!seen.has(this.peerId)) {\r\n if(this.addedToQueue) return;\r\n this.addedToQueue = true;\r\n \r\n let set = believeMe.get(this.peerId);\r\n if(!set) {\r\n set = new Set();\r\n believeMe.set(this.peerId, set);\r\n }\r\n \r\n set.add(this);\r\n\r\n this.r(true);\r\n\r\n this.lazyLoadQueue.push({\r\n div: this, \r\n load: () => {\r\n seen.add(this.peerId);\r\n return this.update();\r\n }\r\n });\r\n\r\n return;\r\n } else if(this.addedToQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n } \r\n \r\n seen.add(this.peerId);\r\n \r\n const res = this.r();\r\n const promise = res ? res.loadPromise : Promise.resolve();\r\n\r\n if(this.addedToQueue) {\r\n promise.finally(() => {\r\n this.addedToQueue = false;\r\n });\r\n }\r\n\r\n const set = believeMe.get(this.peerId);\r\n if(set) {\r\n set.delete(this);\r\n const arr = Array.from(set);\r\n believeMe.delete(this.peerId);\r\n \r\n\r\n for(let i = 0, length = arr.length; i < length; ++i) {\r\n arr[i].update();\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n}\r\n\r\ncustomElements.define('avatar-element', AvatarElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, {Dialog} from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport rootScope from \"../lib/rootScope\";\nimport { positionMenu, openBtnMenu } from \"./misc\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteDialog from \"./popups/deleteDialog\";\nimport { i18n } from \"../lib/langPack\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport appNotificationsManager from \"../lib/appManagers/appNotificationsManager\";\nimport PopupPeer from \"./popups/peer\";\nimport AppChatFoldersTab from \"./sidebarLeft/tabs/chatFolders\";\nimport appSidebarLeft from \"./sidebarLeft\";\nimport { toastNew } from \"./toast\";\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n\n private selectedId: PeerId;\n private filterId: number;\n private dialog: Dialog;\n\n private init() {\n this.buttons = [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: () => !appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: () => {\n const isPinned = this.filterId > 1 ? appMessagesManager.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId) : !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: () => {\n const isPinned = this.filterId > 1 ? appMessagesManager.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId) : !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: () => {\n return this.selectedId !== rootScope.myId && !appNotificationsManager.isPeerLocalMuted(this.dialog.peerId); \n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: () => {\n return this.selectedId !== rootScope.myId && appNotificationsManager.isPeerLocalMuted(this.dialog.peerId); \n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.selectedId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.selectedId !== rootScope.myId\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.id = 'dialogs-contextmenu';\n this.element.classList.add('contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onArchiveClick = () => {\n let dialog = appMessagesManager.getDialogOnly(this.selectedId);\n if(dialog) {\n appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private onPinClick = () => {\n appMessagesManager.toggleDialogPin(this.selectedId, this.filterId).catch(err => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH') {\n if(this.filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n new PopupPeer('pinned-dialogs-too-much', {\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'FiltersSetupPinAlert',\n callback: () => {\n new AppChatFoldersTab(appSidebarLeft).open();\n }\n }],\n descriptionLangKey: 'PinToTopLimitReached2',\n descriptionLangArgs: [i18n('Chats', [rootScope.config.pinned_dialogs_count_max])]\n }).show();\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n appMessagesManager.mutePeer(this.selectedId, false);\n };\n \n private onMuteClick = () => {\n appMessagesManager.mutePeer(this.selectedId, true);\n };\n\n private onUnreadClick = () => {\n const dialog = appMessagesManager.getDialogOnly(this.selectedId);\n if(!dialog) return;\n\n if(dialog.unread_count) {\n appMessagesManager.readHistory(this.selectedId, dialog.top_message);\n appMessagesManager.markDialogUnread(this.selectedId, true);\n } else {\n appMessagesManager.markDialogUnread(this.selectedId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.selectedId/* , 'delete' */);\n };\n\n onContextMenu = (e: MouseEvent | Touch) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let li: HTMLElement = null;\n \n try {\n li = findUpTag(e.target, 'LI');\n } catch(e) {}\n \n if(!li) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n this.filterId = appDialogsManager.filterId;\n\n this.selectedId = li.dataset.peerId.toPeerId();\n this.dialog = appMessagesManager.getDialogOnly(this.selectedId);\n\n this.buttons.forEach(button => {\n const good = button.verify();\n\n button.element.classList.toggle('hide', !good);\n });\n\n // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(appPeersManager.getDeleteButtonText(this.selectedId)));\n\n li.classList.add('menu-open');\n positionMenu(e, this.element);\n openBtnMenu(this.element, () => {\n li.classList.remove('menu-open');\n this.selectedId = this.dialog = this.filterId = undefined;\n });\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Message } from \"../layer\";\n/* import findUpClassName from \"../helpers/dom/findUpClassName\";\nimport rootScope from \"../lib/rootScope\";\nimport Transition from \"./transition\"; */\n\nexport enum SENDING_STATUS {\n Error = -1,\n Pending,\n Sent,\n Read\n}\n\nexport function getSendingStatus(message: Message.message | Message.messageService) {\n return message.pFlags.is_outgoing ? \n SENDING_STATUS.Pending : (\n message.pFlags.unread ? \n SENDING_STATUS.Sent : \n SENDING_STATUS.Read\n );\n}\n\nexport function setSendingStatus(\n container: HTMLElement, \n message?: Message.message | Message.messageService, \n disableAnimationIfRippleFound?: boolean\n) {\n let className: 'check' | 'checks' | 'sending';\n if(message?.pFlags.out) {\n if(message.pFlags.is_outgoing) {\n className = 'sending';\n } else if(message.pFlags.unread) {\n className = 'check';\n } else {\n className = 'checks';\n }\n }\n\n if(!className) {\n container.textContent = '';\n return;\n }\n \n const iconClassName = 'tgico-' + className;\n const lastElement = container.lastElementChild as HTMLElement;\n if(lastElement && lastElement.classList.contains(iconClassName)) {\n return;\n }\n \n const element = document.createElement('i');\n element.classList.add('sending-status-icon', /* 'transition-item', */ iconClassName);\n container.append(element);\n\n if(lastElement) {\n lastElement.remove();\n }\n\n /* if(!lastElement) {\n element.classList.add('active');\n return;\n }\n\n const select = Transition(container, undefined, 350, () => {\n lastElement.remove();\n }, false, true, false);\n\n let animate = rootScope.settings.animationsEnabled && className !== 'sending' && !lastElement.classList.contains('tgico-sending');\n if(disableAnimationIfRippleFound && animate) {\n const parent = findUpClassName(container, 'rp');\n if(parent.querySelector('.c-ripple__circle') || parent.matches(':hover')) {\n animate = false;\n }\n }\n\n select(element, animate, lastElement); */\n\n /* SetTransition(lastElement, 'is-visible', false, 350, () => {\n // lastElement.remove();\n }, 2);\n SetTransition(element, 'is-visible', true, 350, undefined, 2); */\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../config/app\";\r\nimport DEBUG from \"../config/debug\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport apiUpdatesManager from \"../lib/appManagers/apiUpdatesManager\";\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\nimport { logger } from \"../lib/logger\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Button from \"./button\";\r\nimport ProgressivePreloader from \"./preloader\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport { ConnectionStatus } from \"../lib/mtproto/connectionStatus\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\n\r\nexport default class ConnectionStatusComponent {\r\n public static CHANGE_STATE_DELAY = 1000;\r\n\r\n private statusContainer: HTMLElement;\r\n private statusEl: HTMLElement;\r\n private statusPreloader: ProgressivePreloader;\r\n\r\n private currentLangPackKey: LangPackKey;\r\n\r\n private hadConnect = false;\r\n private retryAt: number;\r\n private connecting = false;\r\n private timedOut = false;\r\n private updating = false;\r\n\r\n private log: ReturnType;\r\n\r\n private setFirstConnectionTimeout: number;\r\n private setStateTimeout: number;\r\n\r\n constructor(chatsContainer: HTMLElement) {\r\n this.log = logger('CS');\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', (e) => {\r\n const status = e;\r\n console.log(status);\r\n\r\n this.setConnectionStatus();\r\n });\r\n\r\n rootScope.addEventListener('state_synchronizing', (e) => {\r\n const channelId = e;\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', (e) => {\r\n const channelId = e;\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 rootScope.dispatchEvent('connection_status_change', {\r\n dcId: 2,\r\n isFileDownload: false,\r\n isFileNetworker: false,\r\n isFileUpload: false,\r\n name: \"NET-2\",\r\n status: bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected),\r\n _: \"networkerStatus\"\r\n });\r\n }); */\r\n }\r\n\r\n private setConnectionStatus = () => {\r\n sessionStorage.get('dc').then(baseDcId => {\r\n if(!baseDcId) {\r\n baseDcId = App.baseDcId;\r\n }\r\n \r\n if(this.setFirstConnectionTimeout) {\r\n clearTimeout(this.setFirstConnectionTimeout);\r\n this.setFirstConnectionTimeout = 0;\r\n }\r\n\r\n const status = rootScope.connectionStatus['NET-' + baseDcId];\r\n const online = status && status.status === ConnectionStatus.Connected;\r\n\r\n if(this.connecting && online) {\r\n apiUpdatesManager.forceGetDifference();\r\n }\r\n\r\n if(online && !this.hadConnect) {\r\n this.hadConnect = true;\r\n }\r\n \r\n this.timedOut = status && status.status === ConnectionStatus.TimedOut;\r\n this.connecting = !online;\r\n this.retryAt = status && status.retryAt;\r\n DEBUG && this.log('connecting', this.connecting);\r\n this.setState();\r\n });\r\n };\r\n\r\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\r\n if(this.currentLangPackKey === langPackKey) return;\r\n this.currentLangPackKey = langPackKey;\r\n replaceContent(this.statusEl, i18n(langPackKey, args));\r\n this.statusPreloader.attach(this.statusEl);\r\n };\r\n\r\n private getA(langPackKey: LangPackKey, callback: () => void) {\r\n const a = document.createElement('a');\r\n a.classList.add('force-reconnect');\r\n a.append(i18n(langPackKey));\r\n a.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n callback();\r\n });\r\n\r\n return a;\r\n }\r\n\r\n private setState = () => {\r\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\r\n if(this.connecting) {\r\n if(this.timedOut) {\r\n const a = this.getA('ConnectionStatus.ForceReconnect', () => apiManager.forceReconnect());\r\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\r\n } else if(this.hadConnect) {\r\n if(this.retryAt !== undefined) {\r\n const timerSpan = document.createElement('span');\r\n const retryAt = this.retryAt;\r\n const setTime = () => {\r\n const now = Date.now();\r\n timerSpan.innerText = '' + Math.round((retryAt - now) / 1000);\r\n if(now > retryAt) {\r\n clearInterval(interval);\r\n }\r\n };\r\n const interval = setInterval(setTime, 1e3);\r\n setTime();\r\n \r\n const a = this.getA('ConnectionStatus.Reconnect', () => apiManager.forceReconnectTimeout());\r\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\r\n } else {\r\n this.setStatusText('ConnectionStatus.Reconnecting');\r\n }\r\n } else {\r\n this.setStatusText('ConnectionStatus.Waiting');\r\n }\r\n } else if(this.updating) {\r\n this.setStatusText('Updating');\r\n }\r\n\r\n DEBUG && this.log('setState', this.connecting || this.updating);\r\n window.requestAnimationFrame(() => {\r\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\r\n\r\n const cb = () => {\r\n SetTransition(this.statusContainer, 'is-shown', this.connecting || this.updating, 200);\r\n this.setStateTimeout = 0;\r\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\r\n };\r\n\r\n this.setStateTimeout = window.setTimeout(cb, timeout);\r\n //cb();\r\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\r\n else cb(); */\r\n });\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type DialogsStorage from \"../storages/dialogs\";\nimport type {MyDialogFilter as DialogFilter, MyDialogFilter} from \"../storages/filters\";\nimport type { LazyLoadQueueIntersector } from \"../../components/lazyLoadQueue\";\nimport AvatarElement from \"../../components/avatar\";\nimport DialogsContextMenu from \"../../components/dialogsContextMenu\";\nimport { horizontalMenu } from \"../../components/horizontalMenu\";\nimport { attachContextMenuListener, putPreloader } from \"../../components/misc\";\nimport { ripple } from \"../../components/ripple\";\n//import Scrollable from \"../../components/scrollable\";\nimport Scrollable, { ScrollableX, SliceSides } from \"../../components/scrollable\";\nimport { formatDateAccordingToTodayNew } from \"../../helpers/date\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { logger, LogTypes } from \"../logger\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appPeersManager from './appPeersManager';\nimport appImManager from \"./appImManager\";\nimport appMessagesManager, { Dialog, MyMessage } from \"./appMessagesManager\";\nimport appStateManager, { State } from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport Button from \"../../components/button\";\nimport SetTransition from \"../../components/singleTransition\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport I18n, { FormatterArguments, i18n, LangPackKey, _i18n } from \"../langPack\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport lottieLoader from \"../lottieLoader\";\nimport { wrapLocalSticker, wrapPhoto } from \"../../components/wrappers\";\nimport AppEditFolderTab from \"../../components/sidebarLeft/tabs/editFolder\";\nimport appSidebarLeft, { SettingSection } from \"../../components/sidebarLeft\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport ConnectionStatusComponent from \"../../components/connectionStatus\";\nimport appChatsManager from \"./appChatsManager\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport { fastRafConventional, fastRafPromise } from \"../../helpers/schedulers\";\nimport SortedUserList from \"../../components/sortedUserList\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport handleTabSwipe from \"../../helpers/dom/handleTabSwipe\";\nimport windowSize from \"../../helpers/windowSize\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport { MyDocument } from \"./appDocsManager\";\nimport { setSendingStatus } from \"../../components/sendingStatus\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport generateVerifiedIcon from \"../../components/generateVerifiedIcon\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLDivElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge: HTMLElement,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLLIElement,\n subtitleEl: HTMLElement\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n loadPromises?: Promise[]\n}\n\nclass SortedDialogList extends SortedList {\n constructor(\n public list: HTMLUListElement, \n public indexKey: ReturnType,\n public onListLengthChange?: () => void\n ) {\n super({\n getIndex: (id) => appMessagesManager.getDialogOnly(id)[this.indexKey],\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength) {\n this.onListLengthChange && this.onListLengthChange();\n }\n },\n onElementCreate: (base, batch) => {\n const loadPromises: Promise[] = batch ? [] : undefined;\n\n const {dom} = appDialogsManager.addListDialog({dialog: base.id, loadPromises, isBatch: batch});\n (base as SortedDialog).dom = dom;\n\n if(loadPromises?.length) {\n (base as SortedDialog).loadPromises = loadPromises;\n Promise.all(loadPromises).finally(() => {\n delete (base as SortedDialog).loadPromises;\n });\n }\n\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional\n });\n }\n\n public clear() {\n this.list.innerHTML = '';\n super.clear();\n }\n}\n\n//const testScroll = false;\n//let testTopSlice = 1;\n\nexport class AppDialogsManager {\n private chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n private chatsPreloader: HTMLElement;\n\n private loadDialogsPromise: Promise;\n\n private scroll: Scrollable = null;\n \n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu = new DialogsContextMenu();\n\n public sortedList: SortedDialogList;\n public sortedLists: {[filterId: number]: SortedDialogList} = {};\n public scrollables: {[filterId: number]: Scrollable} = {};\n public filterId: number;\n private folders: {[k in 'menu' | 'container' | 'menuScrollContainer']: HTMLElement} = {\n menu: document.getElementById('folders-tabs'),\n menuScrollContainer: null,\n container: document.getElementById('folders-container')\n };\n private filtersRendered: {\n [filterId: string]: {\n menu: HTMLElement, \n container: HTMLElement,\n unread: HTMLElement,\n title: HTMLElement\n }\n } = {};\n private showFiltersPromise: Promise;\n private allUnreadCount: HTMLElement;\n\n private sliceTimeout: number;\n\n private lastActiveElements: Set = new Set();\n\n private offsets: {top: number, bottom: number} = {top: 0, bottom: 0};\n \n private loadContacts: () => void;\n private processContact: (peerId: PeerId) => void;\n\n private indexKey: ReturnType;\n\n private initedListeners = false;\n\n private onListLengthChange: () => Promise;\n private loadedDialogsAtLeastOnce = false;\n\n constructor() {\n this.chatsPreloader = putPreloader(null, true);\n\n this.allUnreadCount = this.folders.menu.querySelector('.badge');\n \n this.folders.menuScrollContainer = this.folders.menu.parentElement;\n\n this.onListLengthChange = debounce(this._onListLengthChange, 100, false, true);\n\n const bottomPart = document.createElement('div');\n bottomPart.classList.add('connection-status-bottom');\n bottomPart.append(this.folders.container);\n\n /* if(isTouchSupported && isSafari) {\n let allowUp: boolean, allowDown: boolean, slideBeginY: number;\n const container = this.scroll.container;\n container.addEventListener('touchstart', (event) => {\n allowUp = container.scrollTop > 0;\n allowDown = (container.scrollTop < container.scrollHeight - container.clientHeight);\n // @ts-ignore\n slideBeginY = event.pageY;\n });\n \n container.addEventListener('touchmove', (event: any) => {\n var up = (event.pageY > slideBeginY);\n var down = (event.pageY < slideBeginY);\n slideBeginY = event.pageY;\n if((up && allowUp) || (down && allowDown)) {\n event.stopPropagation();\n } else if(up || down) {\n event.preventDefault();\n }\n });\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.folders.container,\n onSwipe: (xDiff) => {\n const prevId = selectTab.prevId();\n selectTab(xDiff > 0 ? prevId + 1 : prevId - 1);\n }\n });\n }\n\n this.setFilterId(0);\n this.addFilter({\n id: this.filterId,\n title: '',\n titleEl: i18n('ChatList.Filter.AllChats'),\n orderIndex: 0\n });\n\n this.sortedList = this.sortedLists[this.filterId];\n this.scroll = this.scrollables[this.filterId];\n\n /* if(testScroll) {\n let i = 0;\n let add = () => {\n let li = document.createElement('li');\n li.dataset.id = '' + i;\n li.id = '' + i;\n li.innerHTML = `

${i}18:33

-_-_-_-: qweasd

`;\n i++;\n this.scroll.append(li);\n };\n for(let i = 0; i < 500; ++i) {\n add();\n }\n (window as any).addElement = add;\n } */\n\n rootScope.addEventListener('state_cleared', () => {\n //setTimeout(() => \n appStateManager.getState().then((state) => {\n this.loadedDialogsAtLeastOnce = false;\n\n appUsersManager.clear();\n appChatsManager.clear();\n \n const filtersStorage = appMessagesManager.filtersStorage;\n const filters = filtersStorage.filters;\n for(const filterId in filters) { // delete filters\n rootScope.dispatchEvent('updateDialogFilter', {\n _: 'updateDialogFilter',\n id: +filterId,\n });\n }\n\n appMessagesManager.clear();\n\n /* const clearPromises: Promise[] = [];\n for(const name in appStateManager.storagesResults) {\n const results = appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n this.sortedList.clear();\n this.onTabChange();\n this.onStateLoaded(state);\n })//, 5000);\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = horizontalMenu(this.folders.menu, this.folders.container, (id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n id = +tabContent.dataset.filterId || 0;\n\n if(this.filterId === id) return;\n\n this.sortedLists[id].clear();\n this.setFilterId(id);\n this.onTabChange();\n }, () => {\n for(const folderId in this.sortedLists) {\n if(+folderId !== this.filterId) {\n this.sortedLists[folderId].clear();\n }\n }\n }, undefined, foldersScrollable);\n\n //selectTab(0);\n (this.folders.menu.firstElementChild as HTMLElement).click();\n appMessagesManager.construct();\n appStateManager.getState().then((state) => {\n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n new ConnectionStatusComponent(this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n }\n\n public get chatList() {\n return this.sortedList.list;\n }\n\n public setFilterId(filterId: number) {\n this.filterId = filterId;\n this.indexKey = appMessagesManager.dialogsStorage ? appMessagesManager.dialogsStorage.getDialogIndexKey(this.filterId) : 'index';\n rootScope.filterId = filterId;\n }\n\n private initListeners() {\n rootScope.addEventListener('user_update', (userId) => {\n //console.log('updating user:', user, dialog);\n \n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(dom && !appUsersManager.isBot(userId) && peerId !== rootScope.myId) {\n const user = appUsersManager.getUser(userId);\n const online = user.status?._ === 'userStatusOnline';\n dom.avatarEl.classList.toggle('is-online', online);\n }\n });\n\n /* rootScope.$on('dialog_top', (e) => {\n const dialog = e;\n\n this.setLastMessage(dialog);\n this.setDialogPosition(dialog);\n\n this.setFiltersUnreadCount();\n }); */\n\n rootScope.addEventListener('folder_unread', (folder) => {\n this.setFilterUnreadCount(folder.id);\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact && this.processContact(userId.toPeerId());\n });\n\n rootScope.addEventListener('dialog_flush', ({peerId}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.setLastMessage(dialog, undefined, undefined, undefined, undefined, undefined, true);\n this.validateDialogForFilter(dialog);\n this.setFiltersUnreadCount();\n }\n });\n\n rootScope.addEventListener('dialogs_multiupdate', (dialogs) => {\n for(const peerId in dialogs) {\n const dialog = dialogs[peerId];\n this.updateDialog(dialog);\n\n if(this.processContact) {\n this.processContact(peerId.toPeerId());\n }\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_drop', ({peerId}) => {\n this.deleteDialog(peerId);\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('dialog_unread', ({peerId}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.setUnreadMessages(dialog);\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.setUnreadMessages(dialog); // возможно это не нужно, но нужно менять is-muted\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('dialog_draft', ({dialog, drop, peerId}) => {\n if(drop) {\n this.sortedList.delete(peerId);\n } else {\n this.updateDialog(dialog);\n }\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('peer_changed', (peerId) => {\n //const perf = performance.now();\n for(const element of this.lastActiveElements) {\n if(element.dataset.peerId.toPeerId() !== peerId) {\n element.classList.remove('active');\n this.lastActiveElements.delete(element);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] li[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach(element => {\n element.classList.add('active');\n this.lastActiveElements.add(element);\n });\n //this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', (filter) => {\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n } else if(filter.id === this.filterId) { // это нет тут смысла вызывать, так как будет dialogs_multiupdate\n const dialogs = appMessagesManager.dialogsStorage.getCachedDialogs(true);\n this.validateListForFilter();\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n this.updateDialog(dialog);\n }\n }\n\n const elements = this.filtersRendered[filter.id];\n elements.title.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\n });\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const elements = this.filtersRendered[filter.id];\n if(!elements) return;\n\n // set tab\n //(this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click();\n (this.folders.menu.firstElementChild as HTMLElement).click();\n\n elements.container.remove();\n elements.menu.remove();\n \n delete this.sortedLists[filter.id];\n delete this.scrollables[filter.id];\n delete this.filtersRendered[filter.id];\n\n if(Object.keys(this.filtersRendered).length <= 1) {\n this.folders.menuScrollContainer.classList.add('hide');\n }\n });\n\n rootScope.addEventListener('filter_order', (order) => {\n const containerToAppend = this.folders.menu as HTMLElement;\n order.forEach((filterId) => {\n const filter = appMessagesManager.filtersStorage.getFilter(filterId);\n const renderedFilter = this.filtersRendered[filterId];\n\n const sortedList = this.sortedLists[filterId];\n sortedList.indexKey = appMessagesManager.dialogsStorage.getDialogIndexKey(filterId);\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.orderIndex);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.orderIndex);\n });\n\n this.indexKey = appMessagesManager.dialogsStorage.getDialogIndexKey(this.filterId);\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n }\n\n private async onStateLoaded(state: State) {\n appNotificationsManager.getNotifyPeerTypeSettings();\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n \n const renderFiltersPromise = appMessagesManager.filtersStorage.getDialogFilters().then((filters) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n });\n\n if(state.filters && Object.keys(state.filters).length) {\n await renderFiltersPromise;\n if(this.showFiltersPromise) {\n await this.showFiltersPromise;\n }\n }\n\n if(appStateManager.storagesResults.dialogs.length) {\n appDraftsManager.addMissedDialogs();\n }\n\n return this.onChatsScroll().then(() => {\n appMessagesManager.fillConversations();\n });\n }\n\n /* private getOffset(side: 'top' | 'bottom'): {index: number, pos: number} {\n if(!this.scroll.loadedAll[side]) {\n const element = (side === 'top' ? this.chatList.firstElementChild : this.chatList.lastElementChild) as HTMLElement;\n if(element) {\n const peerId = element.dataset.peerId;\n const dialog = appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n private getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scroll.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n private isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n //return true;\n const topOffset = this.getOffsetIndex('top');\n const bottomOffset = this.getOffsetIndex('bottom');\n \n if(!topOffset.index && !bottomOffset.index) {\n return true;\n }\n \n const index = dialog[this.indexKey];\n return (!topOffset.index || index <= topOffset.index) && (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n private deleteDialog(peerId: PeerId) {\n this.sortedList.delete(peerId);\n }\n\n private updateDialog(dialog: Dialog) {\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(dialog.peerId)) {\n this.sortedList.add(dialog.peerId);\n return;\n }\n } else {\n this.deleteDialog(dialog.peerId);\n return;\n }\n\n const dom = this.getDialogDom(dialog.peerId);\n if(dom) {\n this.setLastMessage(dialog, undefined, dom, undefined, undefined, undefined, true);\n this.sortedList.update(dialog.peerId);\n }\n }\n\n public onTabChange = () => {\n this.scroll = this.scrollables[this.filterId];\n this.scroll.loadedAll.top = true;\n this.scroll.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsPromise = undefined;\n this.sortedList = this.sortedLists[this.filterId];\n this.onChatsScroll();\n };\n\n private setFilterUnreadCount(filterId: number) {\n const unreadSpan = filterId === 0 ? this.allUnreadCount : this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const folder = appMessagesManager.dialogsStorage.getFolder(filterId);\n const foundUnmuted = filterId === 0 || !!folder.dialogs.find(dialog => {\n return (dialog.unread_count || dialog.pFlags.unread_mark) && !appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n });\n \n unreadSpan.classList.toggle('badge-gray', !foundUnmuted);\n \n const sum = folder.unreadDialogsCount;\n unreadSpan.innerText = sum ? '' + sum : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n\n this.setFilterUnreadCount(0);\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n private validateListForFilter() {\n const filter = appMessagesManager.filtersStorage.getFilter(this.filterId) || null;\n this.sortedList.getAll().forEach((element) => {\n const dialog = appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog, filter)) {\n this.deleteDialog(element.id);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n private validateDialogForFilter(dialog: Dialog, filter?: MyDialogFilter) {\n if(!this.getDialogDom(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog, filter)) {\n this.deleteDialog(dialog.peerId);\n }\n }\n\n public testDialogForFilter(dialog: Dialog, filter = appMessagesManager.filtersStorage.getFilter(this.filterId)) {\n if(!dialog || \n (filter && !appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) || \n (!filter && this.filterId !== dialog.folder_id)) {\n return false;\n }\n\n return true;\n }\n\n public generateScrollable(list: HTMLUListElement, filterId: number) {\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n scrollable.container.dataset.filterId = '' + filterId;\n scrollable.onScrolledTop = this.onChatsScrollTop;\n scrollable.onScrolledBottom = this.onChatsScroll;\n scrollable.setVirtualContainer(list);\n\n const sortedDialogList = new SortedDialogList(\n list, \n appMessagesManager.dialogsStorage ? appMessagesManager.dialogsStorage.getDialogIndexKey(filterId) : 'index',\n this.onListLengthChange\n );\n\n this.scrollables[filterId] = scrollable;\n this.sortedLists[filterId] = sortedDialogList;\n\n // list.classList.add('hide');\n // scrollable.container.style.backgroundColor = '#' + (Math.random() * (16 ** 6 - 1) | 0).toString(16);\n\n return scrollable;\n }\n\n private addFilter(filter: Pick & Partial<{titleEl: HTMLElement}>) {\n if(this.filtersRendered[filter.id]) return;\n\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const titleSpan = document.createElement('span');\n titleSpan.classList.add('text-super');\n if(filter.titleEl) titleSpan.append(filter.titleEl);\n else titleSpan.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\n const unreadSpan = document.createElement('div');\n unreadSpan.classList.add('badge', 'badge-20', 'badge-primary');\n const i = document.createElement('i');\n span.append(titleSpan, unreadSpan, i);\n menuTab.append(span);\n ripple(menuTab);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n positionElementByIndex(menuTab, containerToAppend, filter.orderIndex);\n //containerToAppend.append(li);\n\n const ul = this.createChatList();\n const scrollable = this.generateScrollable(ul, filter.id);\n\n scrollable.container.classList.add('tabs-tab', 'chatlist-parts');\n\n /* const parts = document.createElement('div');\n parts.classList.add('chatlist-parts'); */\n \n const top = document.createElement('div');\n top.classList.add('chatlist-top');\n \n const bottom = document.createElement('div');\n bottom.classList.add('chatlist-bottom');\n\n top.append(ul);\n scrollable.container.append(top, bottom);\n /* parts.append(top, bottom);\n scrollable.container.append(parts); */\n \n const div = scrollable.container;\n //this.folders.container.append(div);\n positionElementByIndex(scrollable.container, this.folders.container, filter.orderIndex);\n\n this.setListClickListener(ul, null, true);\n\n this.filtersRendered[filter.id] = {\n menu: menuTab,\n container: div,\n unread: unreadSpan,\n title: titleSpan\n };\n\n if(!this.showFiltersPromise && Object.keys(this.filtersRendered).length > 1) {\n this.showFiltersPromise = new Promise((resolve) => {\n window.setTimeout(() => {\n this.showFiltersPromise = undefined;\n if(Object.keys(this.filtersRendered).length > 1) {\n this.folders.menuScrollContainer.classList.remove('hide');\n this.setFiltersUnreadCount();\n }\n resolve();\n }, 0);\n });\n }\n }\n\n private loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n \n if(this.loadDialogsPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n\n const promise = new Promise(async(resolve) => {\n const {chatList, filterId, indexKey} = this;\n\n //return;\n \n // let loadCount = 30/*this.chatsLoadCount */;\n let loadCount = windowSize.windowH / 72 * 1.25 | 0;\n let offsetIndex = 0;\n \n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = appMessagesManager.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex(dialog => dialog[indexKey] <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = storage[needIndex][indexKey] + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n \n //let offset = storage[storage.length - 1]?.index || 0;\n \n try {\n //console.time('getDialogs time');\n \n const getConversationsResult = appMessagesManager.getConversations('', offsetIndex, loadCount, filterId, true);\n if(!getConversationsResult.cached && !chatList.childElementCount) {\n const container = chatList.parentElement;\n container.append(this.chatsPreloader);\n }\n \n const result = await getConversationsResult.promise;\n \n if(this.loadDialogsPromise !== promise) {\n return;\n }\n \n //console.timeEnd('getDialogs time');\n \n // * loaded all\n //if(!result.dialogs.length || chatList.childElementCount === result.count) {\n // !result.dialogs.length не подходит, так как при супердревном диалоге getConversations его не выдаст.\n //if(chatList.childElementCount === result.count) {\n if(side === 'bottom') {\n if(result.isEnd) {\n this.scroll.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scroll.loadedAll[side] = true;\n }\n\n this.loadedDialogsAtLeastOnce = true;\n \n if(result.dialogs.length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n \n const loadPromises: Promise[] = [];\n\n const callbacks: (() => void)[] = [];\n const cccc = (callback: () => void) => {\n callbacks.push(callback);\n };\n\n dialogs.forEach((dialog) => {\n // :(\n const isBuggedDialog = !appMessagesManager.getDialogOnly(dialog.peerId);\n if(isBuggedDialog) {\n return;\n }\n\n const element = this.sortedList.add(dialog.peerId, true, cccc, false);\n if(element.loadPromises) {\n loadPromises.push(...element.loadPromises);\n }\n });\n\n await Promise.all(loadPromises).finally();\n\n callbacks.forEach(callback => callback());\n } else {\n this.onListLengthChange();\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : result.dialogs.length - 1];\n if(offsetDialog) {\n this.offsets[side] = offsetDialog[indexKey];\n }\n\n this.log.debug('getDialogs ' + loadCount + ' dialogs by offset:', offsetIndex, result, chatList.childElementCount);\n \n setTimeout(() => {\n this.scroll.onScroll();\n }, 0);\n } catch(err) {\n this.log.error(err);\n }\n \n if(this.chatsPreloader.parentElement) {\n this.chatsPreloader.remove();\n }\n \n resolve();\n }).finally(() => {\n this.loadDialogsPromise = undefined;\n });\n\n return this.loadDialogsPromise = promise;\n }\n\n private generateEmptyPlaceholder(options: {\n title: LangPackKey,\n subtitle?: LangPackKey,\n subtitleArgs?: FormatterArguments,\n classNameType: string\n }) {\n const BASE_CLASS = 'empty-placeholder';\n const container = document.createElement('div');\n container.classList.add(BASE_CLASS, BASE_CLASS + '-' + options.classNameType);\n \n const header = document.createElement('div');\n header.classList.add(BASE_CLASS + '-header');\n _i18n(header, options.title);\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(BASE_CLASS + '-subtitle');\n if(options.subtitle) {\n _i18n(subtitle, options.subtitle, options.subtitleArgs);\n }\n\n container.append(header, subtitle);\n\n return {container, header, subtitle};\n }\n\n private checkIfPlaceholderNeeded() {\n if(this.filterId === 1) {\n return;\n }\n\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n let placeholderContainer = (Array.from(part.children) as HTMLElement[]).find(el => el.matches('.empty-placeholder'));\n const needPlaceholder = this.scroll.loadedAll.bottom && !chatList.childElementCount/* || true */;\n // chatList.style.display = 'none';\n\n if(needPlaceholder && placeholderContainer) {\n return;\n } else if(!needPlaceholder) {\n if(placeholderContainer) {\n part.classList.remove('with-placeholder');\n placeholderContainer.remove();\n }\n\n return;\n }\n\n let placeholder: ReturnType;\n if(!this.filterId) {\n placeholder = this.generateEmptyPlaceholder({\n title: 'ChatList.Main.EmptyPlaceholder.Title',\n classNameType: 'dialogs'\n });\n \n placeholderContainer = placeholder.container;\n \n const img = document.createElement('img');\n img.classList.add('empty-placeholder-dialogs-icon');\n \n Promise.all([\n appUsersManager.getContacts().then(users => {\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 const subtitleEl = new I18n.IntlElement({\n key,\n args,\n element: placeholder.subtitle\n });\n }),\n renderImageFromUrlPromise(img, 'assets/img/EmptyChats.svg'),\n fastRafPromise()\n ]).then(() => {\n placeholderContainer.classList.add('visible');\n });\n\n placeholderContainer.prepend(img);\n } else {\n placeholder = this.generateEmptyPlaceholder({\n title: 'FilterNoChatsToDisplay',\n subtitle: 'FilterNoChatsToDisplayInfo',\n classNameType: 'folder'\n });\n\n placeholderContainer = placeholder.container;\n\n placeholderContainer.prepend(wrapLocalSticker({\n emoji: '📂',\n width: 128,\n height: 128\n }).container)\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, () => {\n new AppEditFolderTab(appSidebarLeft).open(appMessagesManager.filtersStorage.getFilter(this.filterId));\n });\n\n placeholderContainer.append(button);\n }\n\n part.append(placeholderContainer);\n part.classList.add('with-placeholder');\n }\n\n private removeContactsPlaceholder() {\n const chatList = this.chatList;\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n parts.classList.remove('with-contacts');\n bottom.innerHTML = '';\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId > 0) return;\n\n const chatList = this.chatList;\n const count = chatList.childElementCount;\n\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n const hasContacts = !!bottom.childElementCount;\n if(count >= 10) {\n if(hasContacts) {\n this.removeContactsPlaceholder();\n }\n\n return;\n } else if(hasContacts) return;\n\n parts.classList.add('with-contacts');\n\n const section = new SettingSection({\n name: 'Contacts',\n noDelimiter: true,\n fakeGradientDelimiter: true\n });\n\n section.container.classList.add('hide');\n\n appUsersManager.getContactsPeerIds(undefined, undefined, 'online').then(contacts => {\n let ready = false;\n const onListLengthChange = () => {\n if(ready) {\n section.container.classList.toggle('hide', !sortedUserList.list.childElementCount);\n }\n };\n\n const sortedUserList = new SortedUserList({\n avatarSize: 42, \n new: true, \n autonomous: false, \n onListLengthChange\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.windowH / 60 | 0;\n const arr = contacts.splice(0, pageCount).filter(this.verifyPeerIdForContacts);\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = (peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = this.verifyPeerIdForContacts(peerId);\n const added = sortedUserList.has(peerId);\n if(!added && good) sortedUserList.add(peerId);\n else if(added && !good) sortedUserList.delete(peerId);\n };\n\n const list = sortedUserList.list;\n list.classList.add('chatlist-new');\n this.setListClickListener(list);\n section.content.append(list);\n\n ready = true;\n onListLengthChange();\n });\n\n bottom.append(section.container);\n };\n\n private verifyPeerIdForContacts = (peerId: PeerId) => {\n return peerId.isContact() && !appMessagesManager.getDialogOnly(peerId);\n };\n\n public onChatsRegularScroll = () => {\n // return;\n\n if(this.sliceTimeout) clearTimeout(this.sliceTimeout);\n this.sliceTimeout = window.setTimeout(() => {\n this.sliceTimeout = undefined;\n\n if(!this.chatList.childElementCount || this.processContact) {\n return;\n }\n\n /* const observer = new IntersectionObserver((entries) => {\n const \n });\n\n Array.from(this.chatList.children).forEach(el => {\n observer.observe(el);\n }); */\n\n fastRafConventional(() => {\n\n const perf = performance.now();\n\n const scrollTopWas = this.scroll.scrollTop;\n\n const firstElementChild = this.chatList.firstElementChild;\n const rectContainer = this.scroll.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scroll.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scroll.splitUp.offsetTop;\n if(offsetTop && scrollTopWas < offsetTop) offsetTop -= scrollTopWas;\n // const offsetTop = scrollTopWas < padding ? padding - scrollTopWas : 0;\n const firstY = rectContainer.y + offsetTop;\n const lastY = rectContainer.y/* - 8 */; // 8px - .chatlist padding-bottom\n \n const firstElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.ceil(firstY + 1)), firstElementChild.tagName) as HTMLElement;\n const lastElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.floor(lastY + rectContainer.height - 1)), firstElementChild.tagName) as HTMLElement;\n\n //alert('got element:' + rect.y);\n\n if(!firstElement || !lastElement) {\n return;\n }\n\n //alert('got element:' + !!firstElement);\n\n const firstElementRect = firstElement.getBoundingClientRect();\n const elementOverflow = firstElementRect.y - firstY;\n\n const sliced: HTMLElement[] = [];\n const firstIndex = children.indexOf(firstElement);\n const lastIndex = children.indexOf(lastElement);\n\n const saveLength = 10;\n\n const sliceFromStart = IS_SAFARI ? [] : children.slice(0, Math.max(0, firstIndex - saveLength));\n const sliceFromEnd = children.slice(lastIndex + saveLength);\n\n /* if(sliceFromStart.length !== sliceFromEnd.length) {\n console.log('not equal', sliceFromStart.length, sliceFromEnd.length);\n }\n\n if(sliceFromStart.length > sliceFromEnd.length) {\n const diff = sliceFromStart.length - sliceFromEnd.length;\n sliceFromStart.splice(0, diff);\n } else if(sliceFromEnd.length > sliceFromStart.length) {\n const diff = sliceFromEnd.length - sliceFromStart.length;\n sliceFromEnd.splice(sliceFromEnd.length - diff, diff);\n } */\n\n if(sliceFromStart.length) {\n this.scroll.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scroll.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach(el => {\n const peerId = el.dataset.peerId.toPeerId();\n this.deleteDialog(peerId);\n });\n\n this.setOffsets();\n\n //this.log('[slicer] elements', firstElement, lastElement, rect, sliced, sliceFromStart.length, sliceFromEnd.length);\n\n //this.log('[slicer] reset scrollTop', this.scroll.scrollTop, firstElement.offsetTop, firstElementRect.y, rect.y, elementOverflow);\n\n //alert('left length:' + children.length);\n\n this.scroll.scrollTop = firstElement.offsetTop - elementOverflow;\n\n this.log('slice time', performance.now() - perf);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n //this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n private setOffsets() {\n const chatList = this.chatList;\n const firstDialog = this.getDialogFromElement(chatList.firstElementChild as HTMLElement);\n const lastDialog = this.getDialogFromElement(chatList.lastElementChild as HTMLElement);\n\n const indexKey = this.indexKey;\n this.offsets.top = firstDialog[indexKey];\n this.offsets.bottom = lastDialog[indexKey];\n }\n\n private getDialogFromElement(element: HTMLElement) {\n return appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n\n public onChatsScrollTop = () => {\n this.onChatsScroll('top');\n };\n \n public onChatsScroll = (side: SliceSides = 'bottom') => {\n if(this.scroll.loadedAll[side]) {\n if(this.loadContacts) {\n this.loadContacts();\n }\n\n return;\n } else if(this.loadDialogsPromise) return this.loadDialogsPromise;\n\n this.log('onChatsScroll', side);\n return this.loadDialogs(side);\n };\n\n public setListClickListener(list: HTMLUListElement, onFound?: () => void, withContext = false, autonomous = false, openInner = false) {\n let lastActiveListElement: HTMLElement;\n\n const setPeerFunc = (openInner ? appImManager.setInnerPeer : appImManager.setPeer).bind(appImManager);\n\n list.dataset.autonomous = '' + +autonomous;\n list.addEventListener('mousedown', (e) => {\n if(e.button !== 0) return;\n //cancelEvent(e);\n\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, 'LI');\n\n if(!elem) {\n return;\n }\n\n if(autonomous) {\n const sameElement = lastActiveListElement === elem;\n if(lastActiveListElement && !sameElement) {\n lastActiveListElement.classList.remove('active');\n }\n\n if(elem) {\n elem.classList.add('active');\n lastActiveListElement = elem;\n this.lastActiveElements.add(elem);\n }\n }\n\n if(elem) {\n if(onFound) onFound();\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n setPeerFunc(peerId, lastMsgId);\n } else {\n setPeerFunc(NULL_PEER_ID);\n }\n }, {capture: true});\n\n if(DEBUG) {\n list.addEventListener('dblclick', (e) => {\n const li = findUpTag(e.target, 'LI');\n if(li) {\n const peerId = li.dataset.peerId.toPeerId();\n this.log('debug dialog:', appMessagesManager.getDialogByPeerId(peerId));\n }\n });\n }\n\n if(withContext) {\n attachContextMenuListener(list, this.contextMenu.onContextMenu);\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean\n } = {}) {\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.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessage(\n dialog: Dialog, \n lastMessage?: any, \n dom?: DialogDom, \n highlightWord?: string, \n loadPromises?: Promise[],\n isBatch = false,\n setUnread = false\n ) {\n ///////console.log('setlastMessage:', lastMessage);\n if(!dom) {\n dom = this.getDialogDom(dialog.peerId);\n\n if(!dom) {\n //this.log.error('no dom for dialog:', dialog, lastMessage, dom, highlightWord);\n return;\n }\n }\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(dialog.draft && dialog.draft._ === 'draftMessage') {\n draftMessage = dialog.draft;\n }\n \n lastMessage = appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n\n if(lastMessage._ === 'messageEmpty'/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.innerHTML = '';\n dom.lastTimeSpan.innerHTML = '';\n delete dom.listEl.dataset.mid;\n\n if(setUnread) {\n this.setUnreadMessages(dialog, dom, isBatch);\n }\n\n return;\n }\n\n const peerId = dialog.peerId;\n //let peerId = appMessagesManager.getMessagePeer(lastMessage);\n\n //console.log('setting last message:', lastMessage);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n\n let mediaContainer: HTMLElement;\n if(!lastMessage.deleted && !draftMessage) {\n const media: MyDocument | MyPhoto = appMessagesManager.getMediaFromMessage(lastMessage);\n if(media && (media._ === 'photo' || (['video', 'gif'] as MyDocument['type'][]).includes(media.type))) {\n const size = appPhotosManager.choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n \n wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size,\n loadPromises\n });\n\n if((media as MyDocument).type === 'video') {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n const withoutMediaType = !!mediaContainer && !!lastMessage?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && lastMessage.message) {\n fragment = appMessagesManager.wrapMessageForReply(lastMessage, undefined, undefined, false, highlightWord, withoutMediaType);\n } else if(draftMessage) {\n fragment = appMessagesManager.wrapMessageForReply(draftMessage);\n } else if(!lastMessage.deleted) {\n fragment = appMessagesManager.wrapMessageForReply(lastMessage, undefined, undefined, false, undefined, withoutMediaType);\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(mediaContainer) {\n fragment.prepend(mediaContainer);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n \n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const bold = document.createElement('b');\n bold.classList.add('danger');\n bold.append(i18n('Draft'), ': ');\n dom.lastMessageSpan.prepend(bold);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !lastMessage.action) {\n const sender = appPeersManager.getPeer(lastMessage.fromId);\n if(sender && sender.id) {\n const senderBold = document.createElement('b');\n\n if(sender.id === rootScope.myId) {\n senderBold.append(i18n('FromYou'));\n } else {\n //str = sender.first_name || sender.last_name || sender.username;\n senderBold.append(new PeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true,\n }).element);\n }\n\n senderBold.append(': ');\n //console.log(sender, senderBold.innerText);\n dom.lastMessageSpan.prepend(senderBold);\n } //////// else console.log('no sender', lastMessage, peerId);\n }\n }\n\n if(!lastMessage.deleted || draftMessage/* && lastMessage._ !== 'draftMessage' */) {\n const date = draftMessage ? Math.max(draftMessage.date, lastMessage.date || 0) : lastMessage.date;\n replaceContent(dom.lastTimeSpan, formatDateAccordingToTodayNew(new Date(date * 1000)));\n } else dom.lastTimeSpan.textContent = '';\n\n if(setUnread !== null) {\n if(setUnread) {\n this.setUnreadMessages(dialog, dom, isBatch);\n } else { // means search\n dom.listEl.dataset.mid = lastMessage.mid;\n }\n }\n }\n\n private setUnreadMessages(dialog: Dialog, dom = this.getDialogDom(dialog.peerId), isBatch = false) {\n if(!dom) {\n //this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n if(!isBatch) {\n const isMuted = appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n const wasMuted = dom.listEl.classList.contains('is-muted');\n if(isMuted !== wasMuted) {\n SetTransition(dom.listEl, 'is-muted', isMuted, 200);\n }\n }\n\n let setStatusMessage: MyMessage;\n if(dialog.draft?._ !== 'draftMessage') {\n const lastMessage: MyMessage = appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!lastMessage.deleted && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n }\n\n setSendingStatus(dom.statusSpan, setStatusMessage, true);\n\n const filter = appMessagesManager.filtersStorage.getFilter(this.filterId);\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(dialog.peerId) !== -1;\n } else {\n isPinned = !!dialog.pFlags.pinned;\n }\n\n const isDialogUnread = appMessagesManager.isDialogUnread(dialog);\n const hasUnreadBadge = isPinned || isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n const isUnreadBadgeMounted = isInDOM(dom.unreadBadge);\n if(hasUnreadBadge && !isUnreadBadgeMounted) {\n dom.subtitleEl.append(dom.unreadBadge);\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionBadgeMounted = dom.mentionsBadge && isInDOM(dom.mentionsBadge);\n if(hasMentionsBadge) {\n if(!dom.mentionsBadge) {\n dom.mentionsBadge = document.createElement('div');\n dom.mentionsBadge.className = 'dialog-subtitle-badge badge badge-24 mention mention-badge';\n dom.mentionsBadge.innerText = '@';\n dom.subtitleEl.insertBefore(dom.mentionsBadge, dom.lastMessageSpan.nextSibling);\n }\n }\n\n const transitionDuration = isBatch ? 0 : 200;\n\n SetTransition(dom.unreadBadge, 'is-visible', hasUnreadBadge, transitionDuration, hasUnreadBadge ? undefined : () => {\n dom.unreadBadge.remove();\n }, !isUnreadBadgeMounted ? 2 : 0);\n\n if(dom.mentionsBadge) {\n SetTransition(dom.mentionsBadge, 'is-visible', hasMentionsBadge, transitionDuration, hasMentionsBadge ? undefined : () => {\n dom.mentionsBadge.remove();\n delete dom.mentionsBadge;\n }, !isMentionBadgeMounted ? 2 : 0);\n }\n\n if(!hasUnreadBadge) {\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false;\n if(dialog.unread_mentions_count && dialog.unread_count === 1) {\n dom.unreadBadge.innerText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n //dom.unreadMessagesSpan.innerText = '' + (dialog.unread_count ? formatNumber(dialog.unread_count, 1) : ' ');\n dom.unreadBadge.innerText = '' + (dialog.unread_count || ' ');\n } else {\n dom.unreadBadge.innerText = '';\n isUnread = false;\n }\n\n dom.unreadBadge.classList.toggle('unread', isUnread);\n dom.unreadBadge.classList.toggle('mention', isMention);\n }\n\n private getDialogDom(peerId: PeerId) {\n // return this.doms[peerId];\n const element = this.sortedList.get(peerId);\n return element?.dom;\n }\n\n private getDialog(dialog: Dialog | PeerId): Dialog {\n if(typeof(dialog) !== 'object' && dialog) {\n const originalDialog = appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n return {\n peerId: dialog,\n peer: appPeersManager.getOutputPeer(dialog),\n pFlags: {}\n } as any;\n }\n\n return originalDialog;\n }\n \n return dialog as Dialog;\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n const dialog = this.getDialog(options.dialog);\n\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const isMuted = appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n if(isMuted) {\n ret.dom.listEl.classList.add('is-muted');\n }\n\n this.setLastMessage(dialog, undefined, ret.dom, undefined, options.loadPromises, options.isBatch, true);\n }\n\n return ret;\n }\n\n public addDialogNew(options: {\n dialog: Parameters[0],\n container?: Parameters[1],\n drawStatus?: boolean,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n append?: boolean,\n avatarSize?: number,\n autonomous?: boolean,\n lazyLoadQueue?: LazyLoadQueueIntersector,\n loadPromises?: Promise[]\n }) {\n return this.addDialog(options.dialog, options.container, options.drawStatus, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises);\n }\n\n public addDialog(_dialog: Parameters[0], \n container?: HTMLElement | Scrollable | DocumentFragment | false, \n drawStatus = true, \n rippleEnabled = true, \n onlyFirstName = false, \n meAsSaved = true, \n append = true, \n avatarSize = 54, \n autonomous = !!container, \n lazyLoadQueue?: LazyLoadQueueIntersector,\n loadPromises?: Promise[]) {\n const dialog = this.getDialog(_dialog);\n const peerId = dialog.peerId;\n\n const avatarEl = new AvatarElement();\n avatarEl.loadPromises = loadPromises;\n avatarEl.lazyLoadQueue = lazyLoadQueue;\n avatarEl.setAttribute('dialog', meAsSaved ? '1' : '0');\n avatarEl.setAttribute('peer', '' + peerId);\n avatarEl.classList.add('dialog-avatar', 'avatar-' + avatarSize);\n\n if(drawStatus && peerId !== rootScope.myId) {\n if(peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n //console.log('found user', user);\n\n if(user.status && user.status._ === 'userStatusOnline') {\n avatarEl.classList.add('is-online');\n }\n }\n }\n\n const captionDiv = document.createElement('div');\n captionDiv.classList.add('user-caption');\n\n const titleSpanContainer = document.createElement('span');\n titleSpanContainer.classList.add('user-title');\n\n const peerTitle = new PeerTitle({\n peerId,\n dialog: meAsSaved,\n onlyFirstName,\n plainText: false\n });\n\n titleSpanContainer.append(peerTitle.element);\n //p.classList.add('')\n\n // в других случаях иконка верификации не нужна (а первый - это главные чатлисты)\n //if(!container) {\n \n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n \n const peer = appPeersManager.getPeer(peerId);\n if(peer?.pFlags?.verified) {\n titleSpanContainer.append(generateVerifiedIcon());\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('li');\n if(rippleEnabled) {\n ripple(li);\n }\n\n li.append(avatarEl, captionDiv);\n li.dataset.peerId = '' + peerId;\n\n const statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status', 'sending-status'/* , 'transition', 'reveal' */);\n\n const lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n\n const unreadBadge = document.createElement('div');\n unreadBadge.className = 'dialog-subtitle-badge badge badge-24';\n\n const titleP = document.createElement('p');\n titleP.classList.add('dialog-title');\n\n const rightSpan = document.createElement('span');\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n titleP.append(titleSpanContainer, rightSpan);\n\n const subtitleEl = document.createElement('p');\n subtitleEl.classList.add('dialog-subtitle');\n subtitleEl.append(span);\n\n captionDiv.append(titleP, subtitleEl);\n\n const dom: DialogDom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n unreadBadge,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl\n };\n\n /* let good = false;\n for(const folderId in this.chatLists) {\n if(this.chatLists[folderId] === container) {\n good = true;\n }\n } */\n if(container) {\n const method = append ? 'append' : 'prepend';\n container[method](li);\n }\n\n if(!autonomous && appImManager.chat?.peerId === peerId) {\n li.classList.add('active');\n this.lastActiveElements.add(li);\n } \n \n return {dom, dialog};\n }\n\n public setTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n let typingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n if(typingElement) {\n appImManager.getPeerTyping(dialog.peerId, typingElement);\n } else {\n typingElement = appImManager.getPeerTyping(dialog.peerId);\n replaceContent(dom.lastMessageSpan, typingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n dom.lastMessageSpan.classList.remove('user-typing');\n this.setLastMessage(dialog, null, dom, undefined, undefined, undefined, null);\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");e||(e={}),this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case\"ready\":t();break;case\"page\":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case\"done\":this.encoder.removeEventListener(\"message\",i),this.finish()}};this.encoder.addEventListener(\"message\",i),this.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if(\"recording\"===this.state){if(this.state=\"paused\",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{\"flushed\"===o.data.message&&(t.removeEventListener(\"message\",i),this.onpause(),e())};t.addEventListener(\"message\",i),t.postMessage({command:\"flush\"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if(\"inactive\"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state=\"recording\",this.onstart(),this.encoder.postMessage({command:\"getHeaderPages\"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if(\"inactive\"!==this.state){this.state=\"inactive\",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{\"done\"===i.data.message&&(e.removeEventListener(\"message\",o),t())};e.addEventListener(\"message\",o),e.postMessage({command:\"done\"}),this.config.reuseWorker||e.postMessage({command:\"close\"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){\"inactive\"===this.state&&this.encoder&&(this.encoder.postMessage({command:\"close\"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.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 elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.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(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nconst Button = (className: string, options: 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 const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\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' | 'global-search' | 'voice',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(ret.index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(ret.index, 1);\r\n this.handleItem(ret.item);\r\n return;\r\n //}\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n 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","export default function simulateEvent(elem: HTMLElement, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } 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 promise = isInDOM(element) ? this.mutate() : Promise.resolve();\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 private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n /* input.readOnly = true;\r\n\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true}); */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/15.9bac63e86519380bd679.chunk.js b/public/15.9bac63e86519380bd679.chunk.js new file mode 100644 index 000000000..18314c3c9 --- /dev/null +++ b/public/15.9bac63e86519380bd679.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[15,19],{101:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(51);class s{constructor(t,e){this.passwordInputField=t,this.size=e,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=n.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then(t=>(this.animation=t,this.animation.addEventListener("enterFrame",t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},n.a.waitForFirstFrame(t)))}remove(){this.animation&&this.animation.remove()}}},21:function(t,e,i){"use strict";i.r(e);var n=i(35),s=i(37),a=i(17),r=i(79),o=i(64),l=i(34),c=i(95),u=i(101),d=i(31),h=i(16),p=i(91),m=i(5),g=i(30),b=i(96),f=i(36),v=i(58);let w;const y=new o.a("page-password",!0,()=>{const t=new p.a({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=Object(l.a)("btn-primary btn-color-primary"),a=new h.default.IntlElement({key:"Login.Next"});e.append(a.element);const o=new c.a({label:"LoginPassword",name:"password"});let y;w=o.input,t.inputWrapper.append(o.container,e);let L,E=()=>(y||(y=window.setInterval(E,1e4)),r.a.getState().then(t=>{L=t,L.hint?Object(f.a)(o.label,Object(b.a)(d.b.wrapEmojiText(L.hint))):o.setLabel()}));const k=t=>{if(t&&Object(m.a)(t),!w.value.length)return void w.classList.add("error");const s=Object(v.a)([w,e],!0);let l=w.value;a.update({key:"PleaseWait"});const c=Object(n.f)(e);r.a.check(l,L).then(t=>{switch(t._){case"auth.authorization":clearInterval(y),i.e(4).then(i.bind(null,19)).then(t=>{t.default.mount()}),T&&T.remove();break;default:e.removeAttribute("disabled"),a.update({key:t._}),c.remove()}}).catch(t=>{s(),o.input.classList.add("error"),t.type,a.update({key:"PASSWORD_HASH_INVALID"}),w.select(),c.remove(),E()})};Object(g.b)(e,k),w.addEventListener("keypress",(function(t){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===t.key)return k()}));const N=s.b.isMobile?100:166,T=new u.a(o,N);return t.imageDiv.append(T.container),Promise.all([T.load(),E()])},null,()=>{w.focus(),a.default.pushToState("authState",{_:"authStatePassword"})});e.default=y},36:function(t,e,i){"use strict";function n(t,e){if("string"==typeof e)return void(t.innerHTML=e);const i=t.firstChild;i?t.lastChild===i?i.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}i.d(e,"a",(function(){return n}))},38:function(t,e,i){"use strict";i.d(e,"a",(function(){return d}));var n=i(52),s=i(85),a=i(69),r=i(90);var o=i(16),l=i(31),c=i(57);let u=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;t.preventDefault();let e=(t.originalEvent||t).clipboardData.getData("text/plain"),i=l.b.parseEntities(e);i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),e=l.b.wrapRichText(e,{entities:i,noLinks:!0,wrappingDraft:!0}),window.document.execCommand("insertHTML",!1,e)}),u=null};var d;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(d||(d={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:i,showLengthOn:n,name:s,plainText:l}=t;let c,d,h=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,c=this.container.firstElementChild;else{u&&u(),this.container.innerHTML='\n
\n ',c=this.container.firstElementChild;const e=new MutationObserver(()=>{d&&d()});c.addEventListener("input",()=>{Object(r.a)(c)&&(c.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=c.innerHTML,this.onFakeInput())}),e.observe(c,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(c.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=c.className+" input-field-input-fake")}if(c.setAttribute("dir","auto"),e&&(Object(o._i18n)(c,e,void 0,"placeholder"),this.inputFake&&Object(o._i18n)(this.inputFake,e,void 0,"placeholder")),h||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(h&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const t=this.container.lastElementChild;let e=!1;d=()=>{const s=c.classList.contains("error"),r=l?c.value.length:[...Object(a.a)(c,!1).value].length,o=i-r,u=o<0;c.classList.toggle("error",u),u||o<=n?(this.setLabel(),t.append(` (${i-r})`),e||(e=!0)):(s&&!u||e)&&(this.setLabel(),e=!1)},c.addEventListener("input",d)}this.input=c}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const i=window.getSelection();i.removeAllRanges(),i.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(o.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===e)return;const n=Math.round(50*Math.log(Math.abs(e-i)));this.input.style.transitionDuration=n+"ms",t&&(this.input.style.height=e?e+"px":"");Object(c.a)(this.input,"is-changing-height",!0,n,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(n.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(r.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.b.wrapDraftText(t)),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(o.i18n)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&d.Error)),this.input.classList.toggle("valid",!!(t&d.Valid))}setError(t){this.setState(d.Error,t)}}},57:function(t,e,i){"use strict";var n=i(15);const s=(t,e,i,a,r,o)=>{const{timeout:l,raf:c}=t.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),o||delete t.dataset.raf),o&&n.default.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,i,a,r,o-1)}));i&&e&&t.classList.add(e);const u=()=>{delete t.dataset.timeout,!i&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),r&&r()};if(!n.default.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(u,a)};e.a=s},58:function(t,e,i){"use strict";function n(t,e){return e?t.forEach(t=>t.setAttribute("disabled","true")):t.forEach(t=>t.removeAttribute("disabled")),()=>n(t,!e)}i.d(e,"a",(function(){return n}))},69:function(t,e,i){"use strict";i.d(e,"a",(function(){return r}));var n=i(29),s=i(31),a=i(86);function r(t,e=!0){const i=[],n=[],r=e?[]:void 0;Object(a.a)(t,i,n,void 0,void 0,r),n.length&&i.push(n.join(""));let o=i.join("\n");return o=o.replace(/\u00A0/g," "),r&&s.b.combineSameEntities(r),{value:o,entities:r}}n.a.getRichValue=r},79:function(t,e,i){"use strict";var n=i(29),s=i(33);const a=new class{getState(){return s.a.invokeApi("account.getPassword").then(t=>t)}updateSettings(t={}){return this.getState().then(e=>{let i,n;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:t.hint,email:t.email}};i=t.currentPassword?s.a.invokeCrypto("computeSRP",t.currentPassword,e,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const r=e.new_algo,o=new Uint8Array(r.salt1.length+32);return o.randomize(),o.set(r.salt1,0),r.salt1=o,n=t.newPassword?s.a.invokeCrypto("computeSRP",t.newPassword,e,!0):Promise.resolve(new Uint8Array),Promise.all([i,n]).then(t=>(a.password=t[0],a.new_settings.new_algo=r,a.new_settings.new_password_hash=t[1],s.a.invokeApi("account.updatePasswordSettings",a)))})}check(t,e,i={}){return s.a.invokeCrypto("computeSRP",t,e,!1).then(t=>s.a.invokeApi("auth.checkPassword",{password:t},i).then(t=>("auth.authorization"===t._&&s.a.setUser(t.user),t)))}confirmPasswordEmail(t){return s.a.invokeApi("account.confirmPasswordEmail",{code:t})}resendPasswordEmail(){return s.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return s.a.invokeApi("account.cancelPasswordEmail")}};n.a.passwordManager=a,e.a=a},85:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},86:function(t,e,i){"use strict";i.d(e,"b",(function(){return n})),i.d(e,"a",(function(){return s}));const n={bold:{match:'[style*="font-weight"], b',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"}};function s(t,e,i,a,r,o,l={offset:0}){if(3===t.nodeType){const e=t.nodeValue;if(a===t?i.push(e.substr(0,r)+""+e.substr(r)):i.push(e),o&&e.trim()&&t.parentNode){const i=t.parentElement;for(const t in n){const s=n[t],a=i.closest(s.match+", [contenteditable]");a&&null===a.getAttribute("contenteditable")&&("messageEntityTextUrl"===s.entityName?o.push({_:s.entityName,url:i.href,offset:l.offset,length:e.length}):"messageEntityMentionName"===s.entityName?o.push({_:s.entityName,offset:l.offset,length:e.length,user_id:i.dataset.follow.toUserId()}):o.push({_:s.entityName,offset:l.offset,length:e.length}))}}return void(l.offset+=e.length)}if(1!==t.nodeType)return;const c=a===t,u="DIV"===t.tagName||"P"===t.tagName;if(u&&i.length||"BR"===t.tagName)e.push(i.join("")),i.splice(0,i.length);else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),l.offset+=e.length)}c&&!r&&i.push("");let d=t.firstChild;for(;d;)s(d,e,i,a,r,o,l),d=d.nextSibling;c&&r&&i.push(""),u&&i.length&&(e.push(i.join("")),i.splice(0,i.length))}},90:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(69);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(n.a)(t,!1).value.trim():!t.value.trim()}},91:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(16);class s{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(n.i18n)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(n.i18n)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},95:function(t,e,i){"use strict";i.d(e,"a",(function(){return a}));var n=i(5),s=i(38);class a extends s.b{constructor(t={}){super(Object.assign({plainText:!0},t)),this.passwordVisible=!1,this.onVisibilityClick=t=>{Object(n.a)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const s=this.toggleVisible=document.createElement("span");s.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(s),s.addEventListener("click",this.onVisibilityClick),s.addEventListener("touchend",this.onVisibilityClick)}}},96:function(t,e,i){"use strict";function n(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return n}))}}]); +//# sourceMappingURL=15.9bac63e86519380bd679.chunk.js.map \ No newline at end of file diff --git a/public/15.9bac63e86519380bd679.chunk.js.map b/public/15.9bac63e86519380bd679.chunk.js.map new file mode 100644 index 000000000..346334845 --- /dev/null +++ b/public/15.9bac63e86519380bd679.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/monkeys/password.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["PasswordMonkey","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","waitForFirstFrame","remove","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","append","element","label","name","getStateInterval","input","inputWrapper","state","getState","window","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","e","value","length","toggle","update","preloader","check","response","_","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","type","select","isMobile","imageDiv","Promise","all","load","focus","pushToState","replaceContent","elem","node","innerHTML","firstChild","lastChild","replaceWith","textContent","init","findUpAttribute","target","preventDefault","text","originalEvent","clipboardData","getData","entities","parseEntities","filter","wrapRichText","noLinks","wrappingDraft","execCommand","InputState","options","required","validate","undefined","maxLength","showLengthOn","Math","min","round","placeholder","plainText","processInput","labelText","firstElementChild","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","setAttribute","border","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","getRichValue","diff","isError","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","style","replace","transitionDuration","log","abs","setValueSilently","fireFakeInput","originalValue","isValid","isChanged","silent","wrapDraftText","setDraftValue","Error","Valid","setState","SetTransition","forwards","duration","onTransitionEnd","useRafs","timeout","raf","dataset","clearTimeout","cancelAnimationFrame","settings","animationsEnabled","requestAnimationFrame","afterTimeout","setTimeout","toggleDisability","elements","disable","forEach","field","withEntities","lines","line","push","join","combineSameEntities","passwordManager","invokeApi","result","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","resolve","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","hashes","new_password_hash","inputCheckPassword","auth","setUser","user","code","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","getRichElementValue","selNode","selOffset","offset","nodeType","nodeValue","substr","trim","parentNode","parentElement","tag","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","tagName","splice","HTMLImageElement","alt","curChild","nextSibling","hasAttribute","LoginPage","body","querySelector","title","subtitle","PasswordInputField","super","onVisibilityClick","toggleVisible","autocomplete","stealthy","tabIndex","prepend","insertBefore","cloneNode","htmlToSpan","html","span"],"mappings":"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","file":"15.9bac63e86519380bd679.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n //console.log('document paste');\r\n\r\n //console.log('messageInput paste');\r\n\r\n e.preventDefault();\r\n // @ts-ignore\r\n let text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n\r\n let entities = RichTextProcessor.parseEntities(text);\r\n //console.log('messageInput paste', text, entities);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n //text = RichTextProcessor.wrapEmojiText(text);\r\n text = RichTextProcessor.wrapRichText(text, {entities, noLinks: true, wrappingDraft: true});\r\n\r\n // console.log('messageInput paste after', text);\r\n\r\n // @ts-ignore\r\n //let html = (e.originalEvent || e).clipboardData.getData('text/html');\r\n\r\n // @ts-ignore\r\n //console.log('paste text', text, );\r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: true,\r\n required?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean) {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityPre' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName';\r\n};\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"font-weight\"], b',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike',\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};\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n const nodeValue = node.nodeValue;\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.trim()) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest && closest.getAttribute('contenteditable') === null) {\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (parentElement as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: parentElement.dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = (selNode === node);\r\n const isBlock = node.tagName === 'DIV' || node.tagName === 'P';\r\n if(isBlock && line.length || node.tagName === 'BR') {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n 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(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { 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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n /* input.readOnly = true;\r\n\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true}); */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/15.e91ef68debad566c74d5.chunk.js b/public/15.e91ef68debad566c74d5.chunk.js deleted file mode 100644 index 9f5c54bf7..000000000 --- a/public/15.e91ef68debad566c74d5.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[15,19],{101:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(51);class s{constructor(t,e){this.passwordInputField=t,this.size=e,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=n.b.loadAnimationFromURL({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"assets/img/TwoFactorSetupMonkeyPeek.tgs").then(t=>(this.animation=t,this.animation.addEventListener("enterFrame",t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},n.b.waitForFirstFrame(t)))}remove(){this.animation&&this.animation.remove()}}},21:function(t,e,i){"use strict";i.r(e);var n=i(35),s=i(37),a=i(17),r=i(78),o=i(62),l=i(33),c=i(93),u=i(101),d=i(31),h=i(16),p=i(89),m=i(5),g=i(30),b=i(94),f=i(36),v=i(59);let w;const y=new o.a("page-password",!0,()=>{const t=new p.a({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=Object(l.a)("btn-primary btn-color-primary"),a=new h.default.IntlElement({key:"Login.Next"});e.append(a.element);const o=new c.a({label:"LoginPassword",name:"password"});let y;w=o.input,t.inputWrapper.append(o.container,e);let L,E=()=>(y||(y=window.setInterval(E,1e4)),r.a.getState().then(t=>{L=t,L.hint?Object(f.a)(o.label,Object(b.a)(d.b.wrapEmojiText(L.hint))):o.setLabel()}));const k=t=>{if(t&&Object(m.a)(t),!w.value.length)return void w.classList.add("error");const s=Object(v.a)([w,e],!0);let l=w.value;a.update({key:"PleaseWait"});const c=Object(n.f)(e);r.a.check(l,L).then(t=>{switch(t._){case"auth.authorization":clearInterval(y),i.e(4).then(i.bind(null,19)).then(t=>{t.default.mount()}),T&&T.remove();break;default:e.removeAttribute("disabled"),a.update({key:t._}),c.remove()}}).catch(t=>{s(),o.input.classList.add("error"),t.type,a.update({key:"PASSWORD_HASH_INVALID"}),w.select(),c.remove(),E()})};Object(g.b)(e,k),w.addEventListener("keypress",(function(t){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===t.key)return k()}));const N=s.b.isMobile?100:166,T=new u.a(o,N);return t.imageDiv.append(T.container),Promise.all([T.load(),E()])},null,()=>{w.focus(),a.default.pushToState("authState",{_:"authStatePassword"})});e.default=y},36:function(t,e,i){"use strict";function n(t,e){if("string"==typeof e)return void(t.innerHTML=e);const i=t.firstChild;i?t.lastChild===i?i.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}i.d(e,"a",(function(){return n}))},38:function(t,e,i){"use strict";i.d(e,"a",(function(){return d}));var n=i(52),s=i(84),a=i(67),r=i(88);var o=i(16),l=i(31),c=i(57);let u=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;t.preventDefault();let e=(t.originalEvent||t).clipboardData.getData("text/plain"),i=l.b.parseEntities(e);i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),e=l.b.wrapRichText(e,{entities:i,noLinks:!0,wrappingDraft:!0}),window.document.execCommand("insertHTML",!1,e)}),u=null};var d;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(d||(d={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:i,showLengthOn:n,name:s,plainText:l}=t;let c,d,h=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,c=this.container.firstElementChild;else{u&&u(),this.container.innerHTML='\n
\n ',c=this.container.firstElementChild;const e=new MutationObserver(()=>{d&&d()});c.addEventListener("input",()=>{Object(r.a)(c)&&(c.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=c.innerHTML,this.onFakeInput())}),e.observe(c,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(c.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=c.className+" input-field-input-fake")}if(c.setAttribute("dir","auto"),e&&(Object(o._i18n)(c,e,void 0,"placeholder"),this.inputFake&&Object(o._i18n)(this.inputFake,e,void 0,"placeholder")),h||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(h&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const t=this.container.lastElementChild;let e=!1;d=()=>{const s=c.classList.contains("error"),r=l?c.value.length:[...Object(a.a)(c,!1).value].length,o=i-r,u=o<0;c.classList.toggle("error",u),u||o<=n?(this.setLabel(),t.append(` (${i-r})`),e||(e=!0)):(s&&!u||e)&&(this.setLabel(),e=!1)},c.addEventListener("input",d)}this.input=c}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const i=window.getSelection();i.removeAllRanges(),i.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(o.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===e)return;const n=Math.round(50*Math.log(Math.abs(e-i)));this.input.style.transitionDuration=n+"ms",t&&(this.input.style.height=e?e+"px":"");Object(c.a)(this.input,"is-changing-height",!0,n,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(n.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(r.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.b.wrapDraftText(t)),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(o.i18n)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&d.Error)),this.input.classList.toggle("valid",!!(t&d.Valid))}setError(t){this.setState(d.Error,t)}}},57:function(t,e,i){"use strict";var n=i(15);const s=(t,e,i,a,r,o)=>{const{timeout:l,raf:c}=t.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),o||delete t.dataset.raf),o&&n.default.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,i,a,r,o-1)}));i&&e&&t.classList.add(e);const u=()=>{delete t.dataset.timeout,!i&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),r&&r()};if(!n.default.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(u,a)};e.a=s},59:function(t,e,i){"use strict";function n(t,e){return e?t.forEach(t=>t.setAttribute("disabled","true")):t.forEach(t=>t.removeAttribute("disabled")),()=>n(t,!e)}i.d(e,"a",(function(){return n}))},67:function(t,e,i){"use strict";i.d(e,"a",(function(){return r}));var n=i(29),s=i(31),a=i(85);function r(t,e=!0){const i=[],n=[],r=e?[]:void 0;Object(a.a)(t,i,n,void 0,void 0,r),n.length&&i.push(n.join(""));let o=i.join("\n");return o=o.replace(/\u00A0/g," "),r&&s.b.combineSameEntities(r),{value:o,entities:r}}n.a.getRichValue=r},78:function(t,e,i){"use strict";var n=i(29),s=i(32);const a=new class{getState(){return s.a.invokeApi("account.getPassword").then(t=>t)}updateSettings(t={}){return this.getState().then(e=>{let i,n;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:t.hint,email:t.email}};i=t.currentPassword?s.a.invokeCrypto("computeSRP",t.currentPassword,e,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const r=e.new_algo,o=new Uint8Array(r.salt1.length+32);return o.randomize(),o.set(r.salt1,0),r.salt1=o,n=t.newPassword?s.a.invokeCrypto("computeSRP",t.newPassword,e,!0):Promise.resolve(new Uint8Array),Promise.all([i,n]).then(t=>(a.password=t[0],a.new_settings.new_algo=r,a.new_settings.new_password_hash=t[1],s.a.invokeApi("account.updatePasswordSettings",a)))})}check(t,e,i={}){return s.a.invokeCrypto("computeSRP",t,e,!1).then(t=>s.a.invokeApi("auth.checkPassword",{password:t},i).then(t=>("auth.authorization"===t._&&s.a.setUser(t.user),t)))}confirmPasswordEmail(t){return s.a.invokeApi("account.confirmPasswordEmail",{code:t})}resendPasswordEmail(){return s.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return s.a.invokeApi("account.cancelPasswordEmail")}};n.a.passwordManager=a,e.a=a},84:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},85:function(t,e,i){"use strict";i.d(e,"b",(function(){return n})),i.d(e,"a",(function(){return s}));const n={bold:{match:'[style*="font-weight"], b',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"}};function s(t,e,i,a,r,o,l={offset:0}){if(3===t.nodeType){const e=t.nodeValue;if(a===t?i.push(e.substr(0,r)+""+e.substr(r)):i.push(e),o&&e.trim()&&t.parentNode){const i=t.parentElement;for(const t in n){const s=n[t],a=i.closest(s.match+", [contenteditable]");a&&null===a.getAttribute("contenteditable")&&("messageEntityTextUrl"===s.entityName?o.push({_:s.entityName,url:i.href,offset:l.offset,length:e.length}):"messageEntityMentionName"===s.entityName?o.push({_:s.entityName,offset:l.offset,length:e.length,user_id:i.dataset.follow.toUserId()}):o.push({_:s.entityName,offset:l.offset,length:e.length}))}}return void(l.offset+=e.length)}if(1!==t.nodeType)return;const c=a===t,u="DIV"===t.tagName||"P"===t.tagName;if(u&&i.length||"BR"===t.tagName)e.push(i.join("")),i.splice(0,i.length);else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),l.offset+=e.length)}c&&!r&&i.push("");let d=t.firstChild;for(;d;)s(d,e,i,a,r,o,l),d=d.nextSibling;c&&r&&i.push(""),u&&i.length&&(e.push(i.join("")),i.splice(0,i.length))}},88:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(67);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(n.a)(t,!1).value.trim():!t.value.trim()}},89:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(16);class s{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(n.i18n)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(n.i18n)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},93:function(t,e,i){"use strict";i.d(e,"a",(function(){return a}));var n=i(5),s=i(38);class a extends s.b{constructor(t={}){super(Object.assign({plainText:!0},t)),this.passwordVisible=!1,this.onVisibilityClick=t=>{Object(n.a)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const s=this.toggleVisible=document.createElement("span");s.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(s),s.addEventListener("click",this.onVisibilityClick),s.addEventListener("touchend",this.onVisibilityClick)}}},94:function(t,e,i){"use strict";function n(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return n}))}}]); -//# sourceMappingURL=15.e91ef68debad566c74d5.chunk.js.map \ No newline at end of file diff --git a/public/15.e91ef68debad566c74d5.chunk.js.map b/public/15.e91ef68debad566c74d5.chunk.js.map deleted file mode 100644 index 1835d0115..000000000 --- a/public/15.e91ef68debad566c74d5.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/monkeys/password.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["PasswordMonkey","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","loadPromise","loadAnimationFromURL","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","waitForFirstFrame","remove","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","append","element","label","name","getStateInterval","input","inputWrapper","state","getState","window","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","e","value","length","toggle","update","preloader","check","response","_","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","type","select","isMobile","imageDiv","Promise","all","load","focus","pushToState","replaceContent","elem","node","innerHTML","firstChild","lastChild","replaceWith","textContent","init","findUpAttribute","target","preventDefault","text","originalEvent","clipboardData","getData","entities","parseEntities","filter","wrapRichText","noLinks","wrappingDraft","execCommand","InputState","options","required","validate","undefined","maxLength","showLengthOn","Math","min","round","placeholder","plainText","processInput","labelText","firstElementChild","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","setAttribute","border","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","getRichValue","diff","isError","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","style","replace","transitionDuration","log","abs","setValueSilently","fireFakeInput","originalValue","isValid","isChanged","silent","wrapDraftText","setDraftValue","Error","Valid","setState","SetTransition","forwards","duration","onTransitionEnd","useRafs","timeout","raf","dataset","clearTimeout","cancelAnimationFrame","settings","animationsEnabled","requestAnimationFrame","afterTimeout","setTimeout","toggleDisability","elements","disable","forEach","field","withEntities","lines","line","push","join","combineSameEntities","passwordManager","invokeApi","result","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","resolve","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","hashes","new_password_hash","inputCheckPassword","auth","setUser","user","code","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","getRichElementValue","selNode","selOffset","offset","nodeType","nodeValue","substr","trim","parentNode","parentElement","tag","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","tagName","splice","HTMLImageElement","alt","curChild","nextSibling","hasAttribute","LoginPage","body","querySelector","title","subtitle","PasswordInputField","super","onVisibilityClick","toggleVisible","autocomplete","stealthy","tabIndex","prepend","insertBefore","cloneNode","htmlToSpan","html","span"],"mappings":"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","file":"15.e91ef68debad566c74d5.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\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: Promise;\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.loadAnimationFromURL({\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 }, 'assets/img/TwoFactorSetupMonkeyPeek.tgs').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n //console.log('document paste');\r\n\r\n //console.log('messageInput paste');\r\n\r\n e.preventDefault();\r\n // @ts-ignore\r\n let text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n\r\n let entities = RichTextProcessor.parseEntities(text);\r\n //console.log('messageInput paste', text, entities);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n //text = RichTextProcessor.wrapEmojiText(text);\r\n text = RichTextProcessor.wrapRichText(text, {entities, noLinks: true, wrappingDraft: true});\r\n\r\n // console.log('messageInput paste after', text);\r\n\r\n // @ts-ignore\r\n //let html = (e.originalEvent || e).clipboardData.getData('text/html');\r\n\r\n // @ts-ignore\r\n //console.log('paste text', text, );\r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: true,\r\n required?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean) {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityPre' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName';\r\n};\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"font-weight\"], b',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike',\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};\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n const nodeValue = node.nodeValue;\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.trim()) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest && closest.getAttribute('contenteditable') === null) {\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (parentElement as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: parentElement.dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = (selNode === node);\r\n const isBlock = node.tagName === 'DIV' || node.tagName === 'P';\r\n if(isBlock && line.length || node.tagName === 'BR') {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n 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(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { 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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n /* input.readOnly = true;\r\n\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true}); */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/16.8f20a4414cdceb869a1b.chunk.js.map b/public/16.8f20a4414cdceb869a1b.chunk.js.map deleted file mode 100644 index 52f46583c..000000000 --- a/public/16.8f20a4414cdceb869a1b.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignIn.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/components/languageChangeButton.ts"],"names":["rippleClickId","ripple","elem","callback","Promise","resolve","onEnd","prepend","querySelector","classList","add","r","document","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","remove","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","append","isRippleUnneeded","e","target","includes","tagName","touchEnd","addEventListener","settings","animationsEnabled","touches","length","once","cancelBubble","stopPropagation","passive","button","dataset","btnQr","btnNext","page","setCountries","countries","countriesList","filter","country","pFlags","hidden","sort","a","b","name","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","countryInputField","label","container","countryInput","input","selectWrapper","arrowDown","selectList","appendChild","initSelect","forEach","c","emoji","iso2","liArr","country_codes","countryCode","li","wrapped","wrapEmojiText","spanEmoji","innerHTML","el","defaultName","span","innerText","country_code","push","set","selectCountryByTarget","childNodes","phoneCode","find","_countryCode","telInputField","value","lastValue","hidePicker","telEl","focus","hideTimeout","get","display","clearTimeout","undefined","offsetWidth","select","pageEl","parentElement","mouseDownHandlerAttached","onMouseDown","capture","key","ctrlKey","_value","toLowerCase","matches","good","Boolean","str","indexOf","preventDefault","blur","onInput","formatted","loadLottieWorkers","code","countryName","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","pushToState","toggleStorage","getState","then","state","storage","isAvailable","toggle","phone_number","invokeApi","api_id","id","api_hash","hash","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","h4","subtitle","nearestDcResult","langPack","getFromCache","getLangPack","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","getNetworker","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute","cachedPromise","imageDiv","preloader","btnBack","helpList","stop","QRCodeStyling","all","prevToken","options","ignoreErrors","iterate","isLoop","loginToken","except_ids","dc_id","setBaseDcId","token","authorization","setUser","user","url","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","result","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","_canvas","_image","animation","children","Array","from","slice","timestamp","diff","expires","serverTimeOffset","warn","handled","func","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","className","asDiv","icon","noRipple","rippleSquare","onlyMobile","disabled","setAttribute","putPreloader","returnDiv","html","div","insertAdjacentHTML","lastElementChild","setButtonLoader","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","isMobile","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","element","removeManual","timeout","onCancel","appNavigationController","navigations","manual","log","debug","currentHash","location","isPossibleSwipe","this","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","noBlurOnPop","i","index","ret","findItemByType","splice","noHistory","origin","pathname","single","simulateEvent","event","Event","bubbles","cancelable","sequentialDom","promises","raf","scheduled","kind","scheduleFlush","do","read","write","serverTimeManager","to","addTaskListener","task","payload","isSwipingBackSafari","TouchEvent","bytesToHex","bytes","arr","toString","join","bytesFromHex","hexString","len","Uint8Array","ceil","start","parseInt","charAt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","String","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","bufferConcats","args","reduce","acc","v","byteLength","tmp","lastLength","ArrayBuffer","getLanguageChangeButton","appendTo","getConfig","config","suggested_lang_code","lastRequestedLangCode","getStrings","getCacheLangPack","strings","backup","string","backupString","btnChangeLanguage"],"mappings":"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","file":"16.8f20a4414cdceb869a1b.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.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 elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.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(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/lottieLoader\";\r\nimport { ripple } from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\r\n // const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter(country => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll(page.pageEl.parentElement.parentElement, countryInput, 'start', 4);\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n let good = !![c.name, c.default_name].filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch(err => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then(module => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach(dcId => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n apiManager.getNetworker(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport { bytesCmp, bytesToBase64 } from '../helpers/bytes';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport { pause } from '../helpers/schedulers/pause';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + encoded.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/\\=+$/, \"\");\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nconst Button = (className: string, options: 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 const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\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' | 'global-search' | 'voice',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(ret.index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(ret.index, 1);\r\n this.handleItem(ret.item);\r\n return;\r\n //}\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n 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","export default function simulateEvent(elem: HTMLElement, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } 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 promise = isInDOM(element) ? this.mutate() : Promise.resolve();\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 private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\n * 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\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().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"],"sourceRoot":""} \ No newline at end of file diff --git a/public/16.8f20a4414cdceb869a1b.chunk.js b/public/16.e12ddbc52a3f75e72c89.chunk.js similarity index 71% rename from public/16.8f20a4414cdceb869a1b.chunk.js rename to public/16.e12ddbc52a3f75e72c89.chunk.js index f29912ba6..4b9cb38f1 100644 --- a/public/16.8f20a4414cdceb869a1b.chunk.js +++ b/public/16.e12ddbc52a3f75e72c89.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[16,17,30],{18:function(e,t,n){"use strict";n.r(t),n.d(t,"ripple",(function(){return c}));var i=n(6),a=n(58),o=n(1),s=n(15);let r=0;function c(e,t=(()=>Promise.resolve()),n=null,c=!1){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let d=document.createElement("div");d.classList.add("c-ripple");let l;e.classList.contains("rp-square")&&d.classList.add("is-square"),e[c?"prepend":"append"](d);const u=(e,i)=>{const s=Date.now(),c=document.createElement("div"),u=r++,h=1e3*+window.getComputedStyle(d).getPropertyValue("--ripple-duration").replace("s","");l=()=>{let e=Date.now()-s;const t=()=>{a.a.mutate(()=>{c.remove()}),n&&n(u)};if(ec.classList.add("hiding"),Math.max(n-h/2,0)),setTimeout(t,n)}else c.classList.add("hiding"),setTimeout(t,h/2);o.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",l),l=null,p=!1},t&&t(u),window.requestAnimationFrame(()=>{const t=d.getBoundingClientRect();c.classList.add("c-ripple__circle");const n=e-t.left,a=i-t.top,o=Math.sqrt(Math.pow(Math.abs(a-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),s=n-o/2,r=a-o/2;c.style.width=c.style.height=o+"px",c.style.left=s+"px",c.style.top=r+"px",d.append(c)})},h=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==d);let p=!1;if(o.IS_TOUCH_SUPPORTED){let t=()=>{l&&l()};e.addEventListener("touchstart",n=>{if(!s.default.settings.animationsEnabled)return;if(n.touches.length>1||p||h(n))return;p=!0;let{clientX:i,clientY:a}=n.touches[0];u(i,a),e.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",n=>{n.cancelBubble=!0,n.stopPropagation(),t(),e.removeEventListener("touchend",t)},{once:!0})},{passive:!0})}else e.addEventListener("mousedown",t=>{if(![0,2].includes(t.button))return;if(!s.default.settings.animationsEnabled)return;if("0"===e.dataset.ripple||h(t))return;if(p)return void(p=!1);let{clientX:n,clientY:i}=t;u(n,i),window.addEventListener("mouseup",l,{once:!0,passive:!0}),window.addEventListener("contextmenu",l,{once:!0,passive:!0})},{passive:!0})}},20:function(e,t,n){"use strict";n.r(t);var i=n(35),a=n(49),o=n(17),s=n(32),r=n(31),c=n(62),d=n(38),l=n(53),u=n(33),h=n(87),p=n(1),m=n(8),g=n(16),f=n(51),v=n(18),b=n(61),y=n(6),w=n(66),E=n(98),L=n(115),O=n(22),_=n(92),S=n(5),T=n(30),j=n(36),x=n(59),k=n(65),P=n(100),I=n(91),C=n(52),A=n(80),R=n(15),D=n(121),M=n(10),H=function(e,t,n,i){return new(n||(n=Promise))((function(a,o){function s(e){try{c(i.next(e))}catch(e){o(e)}}function r(e){try{c(i.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,r)}c((i=i.apply(e,t||[])).next())}))};let N,U=null;const B=new c.a("page-sign",!0,()=>{const e=()=>{t=g.default.countriesList.filter(e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)}).sort((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name))};let t;e(),R.default.addEventListener("language_change",()=>{e()});const c=new Map;let v,q;const F=document.createElement("div");F.classList.add("input-wrapper");const Q=new d.b({label:"Login.CountrySelectorLabel",name:Object(w.b)()});Q.container.classList.add("input-select");const X=Q.input,$=document.createElement("div");$.classList.add("select-wrapper","z-depth-3","hide");const V=document.createElement("span");V.classList.add("arrow","arrow-down"),Q.container.append(V);const W=document.createElement("ul");$.appendChild(W);new a.b($);let Y=()=>{Y=null,t.forEach(e=>{const t=Object(I.c)(e.iso2),n=[];e.country_codes.forEach(i=>{const a=document.createElement("li");let o=r.a.wrapEmojiText(t);if(M.a){const e=document.createElement("span");e.innerHTML=o,a.append(e)}else a.innerHTML=o;const s=Object(g.i18n)(e.default_name);s.dataset.defaultName=e.default_name,a.append(s);const c=document.createElement("span");c.classList.add("phone-code"),c.innerText="+"+i.country_code,a.appendChild(c),n.push(a),W.append(a)}),c.set(e.iso2,n)}),W.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(b.a)(e.target,"LI");z(t)}),Q.container.appendChild($)};const z=e=>{const n=e.childNodes[1].dataset.defaultName,i=e.querySelector(".phone-code").innerText,a=i.replace(/\D/g,"");Object(j.a)(X,Object(g.i18n)(n)),Object(C.a)(X,"input"),v=t.find(e=>e.default_name===n),q=v.country_codes.find(e=>e.country_code===a),ee.value=ee.lastValue=i,Z(),setTimeout(()=>{te.focus(),Object(P.a)(te,!0)},0)};let J;Y(),X.addEventListener("focus",(function(e){Y?Y():t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout(J),J=void 0,$.classList.remove("hide"),$.offsetWidth,$.classList.add("active"),Q.select(),Object(h.b)(B.pageEl.parentElement.parentElement,X,"start",4),setTimeout(()=>{K||(document.addEventListener("mousedown",G,{capture:!0}),K=!0)},0)}));let K=!1;const G=e=>{Object(y.a)(e.target,"input-select")||e.target!==X&&(Z(),document.removeEventListener("mousedown",G,{capture:!0}),K=!1)},Z=()=>{void 0===J&&($.classList.remove("active"),J=window.setTimeout(()=>{$.classList.add("hide"),J=void 0},200))};X.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let i=Q.value.toLowerCase(),a=[];t.forEach(e=>{let t=!![e.name,e.default_name].filter(Boolean).find(e=>-1!==e.toLowerCase().indexOf(i));c.get(e.iso2).forEach(e=>e.style.display=t?"":"none"),t&&a.push(e)}),0===a.length?t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}):1===a.length&&"Enter"===n&&z(c.get(a[0].iso2)[0])}),V.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),X.matches(":focus")?X.blur():X.focus()}));const ee=new D.a({onInput:e=>{f.b.loadLottieWorkers();const{country:t,code:n}=e||{};let i=t?t.name||t.default_name:"";i===Q.value||v&&t&&n&&(v===t||q.country_code===n.country_code)||(Object(j.a)(X,t?Object(g.i18n)(t.default_name):i),v=t,q=n),t||ee.value.length-1>1?U.style.visibility="":U.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!U.style.visibility&&"Enter"===e.key)return ie()});const ne=new l.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.checked;o.default.pushToState("keepSigned",e),E.a.toggleStorage(e),L.a.toggleStorage(e),s.a.toggleStorage(e),k.a.toggleStorage(e)}),o.default.getState().then(e=>{o.default.storage.isAvailable()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),U=Object(u.a)("btn-primary btn-color-primary",{text:"Login.Next"}),U.style.visibility="hidden";const ie=e=>{e&&Object(S.a)(e);const t=Object(x.a)([U,N],!0);Object(j.a)(U,Object(g.i18n)("PleaseWait")),Object(i.f)(U);let a=ee.value;s.a.invokeApi("auth.sendCode",{phone_number:a,api_id:m.a.id,api_hash:m.a.hash,settings:{_:"codeSettings"}}).then(e=>{n.e(21).then(n.bind(null,23)).then(t=>t.default.mount(Object.assign(e,{phone_number:a})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(j.a)(ee.label,Object(g.i18n)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(j.a)(U,Object(g.i18n)("Login.Next"));break;default:console.error("auth.sendCode error:",e),U.innerText=e.type}})};Object(T.b)(U,ie),N=Object(u.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});N.addEventListener("click",()=>{O.default.mount()}),F.append(Q.container,ee.container,ne.label,U,N);const ae=document.createElement("h4");ae.classList.add("text-center"),Object(g._i18n)(ae,"Login.Title");const oe=document.createElement("div");oe.classList.add("subtitle","text-center"),Object(g._i18n)(oe,"Login.StartText"),B.pageEl.querySelector(".container").append(ae,oe,F);p.IS_TOUCH_SUPPORTED||setTimeout(()=>{te.focus()},0),Object(_.a)(F),s.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=A.a.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&g.default.getLangPack(n.lang_code).then(()=>{Object(C.a)(te,"input")});const i=new Set([1,2,3,4,5]),a=[e.this_dc];let o;return e.nearest_dc!==e.this_dc&&(o=s.a.getNetworker(e.nearest_dc).then(()=>{a.push(e.nearest_dc)})),(o||Promise.resolve()).then(()=>{a.forEach(e=>{i.delete(e)});const e=[...i],t=()=>H(void 0,void 0,void 0,(function*(){const n=e.shift();if(!n)return;const i=`dc${n}_auth_key`;if(yield k.a.get(i))return t();setTimeout(()=>{s.a.getNetworker(n).finally(t)},3e3)}));t()}),e}).then(e=>{Q.value.length||ee.value.length||z(c.get(e.country)[0])})},()=>{U&&(Object(j.a)(U,Object(g.i18n)("Login.Next")),Object(v.ripple)(U,void 0,void 0,!0),U.removeAttribute("disabled")),N&&N.removeAttribute("disabled"),o.default.pushToState("authState",{_:"authStateSignIn"})});t.default=B},22:function(e,t,n){"use strict";n.r(t);var i=n(32),a=n(62),o=n(68),s=n(75),r=n(8),c=n(33),d=n(16),l=n(17),u=n(15),h=n(35),p=n(92),m=n(81),g=function(e,t,n,i){return new(n||(n=Promise))((function(a,o){function s(e){try{c(i.next(e))}catch(e){o(e)}}function r(e){try{c(i.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,r)}c((i=i.apply(e,t||[])).next())}))};let f;const v=new a.a("page-signQR",!0,()=>f,()=>{f||(f=g(void 0,void 0,void 0,(function*(){const e=v.pageEl.querySelector(".auth-image");let t=Object(h.f)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const l=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(l),Object(p.a)(a);const b=e.parentElement,y=document.createElement("h4");Object(d._i18n)(y,"Login.QR.Title");const w=document.createElement("ol");w.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(d.i18n)(e)),w.append(t)}),b.append(y,w,a),l.addEventListener("click",()=>{Promise.all([n.e(3),n.e(30)]).then(n.bind(null,20)).then(e=>e.default.mount()),L=!0});const E=(yield Promise.all([n.e(10).then(n.t.bind(null,131,7))]))[0].default;let L=!1;u.default.addEventListener("user_auth",()=>{L=!0,f=null},{once:!0});let O,_={ignoreErrors:!0};const S=a=>g(void 0,void 0,void 0,(function*(){try{let c=yield i.a.invokeApi("auth.exportLoginToken",{api_id:r.a.id,api_hash:r.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===c._&&(_.dcId||(_.dcId=c.dc_id,i.a.setBaseDcId(c.dc_id)),c=yield i.a.invokeApi("auth.importLoginToken",{token:c.token},_)),"auth.loginTokenSuccess"===c._){const e=c.authorization;return i.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!O||!Object(s.b)(O,c.token)){O=c.token;let n="tg://login?token="+Object(s.d)(c.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,"");const i=window.getComputedStyle(document.documentElement),a=i.getPropertyValue("--surface-color").trim(),o=i.getPropertyValue("--primary-text-color").trim(),r=i.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${r}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),l=new E({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:a},qrOptions:{errorCorrectionLevel:"L"}});let u;l.append(e),e.lastChild.classList.add("qr-canvas"),u=l._drawingPromise?l._drawingPromise:Promise.race([Object(m.a)(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){let e=Date.now()/1e3,t=c.expires-e-o.a.serverTimeOffset;yield Object(m.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(15).then(n.bind(null,21)).then(e=>e.default.mount()),L=!0,f=null;break;default:console.error("pageSignQR: default error:",e),L=!0}return!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(L=!1;!L&&!(yield S(!0)););}))}))),f.then(e=>{e()}),l.default.pushToState("authState",{_:"authStateSignQr"})});t.default=v},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return s})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}));var i=n(1),a=n(52);const o=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function s(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(o,t,n)}function r(e,t,n){e.removeEventListener(o,t,n)}function c(e){Object(a.a)(e,o)}},33:function(e,t,n){"use strict";var i=n(16),a=n(18);t.a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),Object(a.ripple)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append(Object(i.i18n)(t.text)),n}},35:function(e,t,n){"use strict";n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return g})),n.d(t,"d",(function(){return y})),n.d(t,"e",(function(){return w})),n.d(t,"b",(function(){return O})),n.d(t,"a",(function(){return _}));var i=n(29),a=n(5),o=n(30),s=n(37),r=n(1),c=n(0),d=n(15),l=n(48);function u(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function h(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,u(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=u;let p=e=>{let t=f.getBoundingClientRect(),{clientX:n,clientY:i}=e,a=n>=t.right?n-t.right:t.left-n,o=i>=t.bottom?i-t.bottom:t.top-i;(a>=100||o>=100)&&g()};const m=e=>{g()},g=()=>{f&&(f.classList.remove("active"),f.parentElement.classList.remove("menu-open"),b&&b.remove(),f=null,d.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(o.a,m),c.IS_MOBILE_SAFARI||l.a.removeByType("menu")};window.addEventListener("resize",()=>{f&&g()});let f=null,v=null,b=null;function y(e,t){g(),c.IS_MOBILE_SAFARI||l.a.pushItem({type:"menu",onPop:e=>{g()}}),f=e,f.classList.add("active"),f.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(o.a,e=>{Object(a.a)(e),m()})),f.parentElement.insertBefore(b,f),v=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(o.a,m),d.default.dispatchEvent("context_menu_toggle",!0)}function w({pageX:e,pageY:t},n,i){let{scrollWidth:a,scrollHeight:o}=n;const r=document.body.getBoundingClientRect(),c=r.width,d=r.height;i=s.b.isMobile?"right":"left";let l="top";const u={x:{left:e,right:e-a},intermediateX:"right"===i?8:c-a-8,y:{top:t,bottom:t-o},intermediateY:t=8},p={top:u.y.top+o+8<=d,bottom:u.y.bottom-8>=8};{let e;e=h[i]?u.x[i]:(i="center",u.intermediateX),n.style.left=e+"px"}{let e;e=p[l]?u.y[l]:(l="center",u.intermediateY),n.style.top=e+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===l?l:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let E=!1,L=0;function O(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,E=!1},400),E=!0}function _(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e),o=n?n.removeManual.bind(n,e):e.removeEventListener.bind(e);if(c.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const s={capture:!0},r=()=>{clearTimeout(n),o("touchmove",r,s),o("touchend",r,s),o("touchcancel",r,s)};i("touchstart",o=>{o.touches.length>1?r():(i("touchmove",r,s),i("touchend",r,s),i("touchcancel",r,s),n=window.setTimeout(()=>{E?r():(t(o.touches[0]),r(),f&&e.addEventListener("touchend",a.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{t(n),f&&e.addEventListener("touchend",a.a,{once:!0})}:t)}},48:function(e,t,n){"use strict";var i=n(29),a=n(0),o=n(43),s=n(7),r=n(5),c=n(44),d=n(71);const l=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(o.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!e,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),a.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(d.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",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||Object(s.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return this.manual=!0,this.navigations.splice(t.index,1),void this.handleItem(t.item)}history.back()}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){Object(c.e)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===e&&(this.navigations.splice(n,1),t))break}}};i.a.appNavigationController=l,t.a=l},52:function(e,t,n){"use strict";function i(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)}n.d(t,"a",(function(){return i}))},58:function(e,t,n){"use strict";var i=n(41),a=n(45),o=n(29),s=n(60);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=Object(a.a)()),void 0!==t&&n.then(()=>t()),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=Object(s.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&n.then(()=>t()),n}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};o.a&&(o.a.sequentialDom=r),t.a=r},68:function(e,t,n){"use strict";var i=n(29),a=n(65),o=n(32);const s=new class{constructor(){this.serverTimeOffset=0,a.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),o.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=s),t.a=s},71:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(0);function a(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},75:function(e,t,n){"use strict";function i(e){const t=e.length,n=new Array(t);for(let i=0;i>>t&24),2!==t&&i-o!=1||(n+=String.fromCharCode(s(a>>>18&63),s(a>>>12&63),s(a>>>6&63),s(63&a)),a=0);return n.replace(/A(?=A$|$)/g,"=")}function s(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function r(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ie+(t.byteLength||t.length),0),n=new Uint8Array(t);let i=0;return e.forEach(e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),n}n.d(t,"e",(function(){return i})),n.d(t,"c",(function(){return a})),n.d(t,"d",(function(){return o})),n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return c}))},92:function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var i=n(5),a=n(30),o=n(9),s=n(16),r=n(32),c=n(15),d=n(33),l=n(35);let u,h=!1;function p(e){h||(u||(u=r.a.getConfig().then(e=>e.suggested_lang_code!==s.default.lastRequestedLangCode?Promise.all([e,s.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),s.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const r=[];n.forEach(e=>{const t=s.default.strings.get(e.key);t&&(r.push(t),s.default.strings.set(e.key,e))});const u=Object(d.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(o.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),c.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),r.forEach(e=>{s.default.strings.set(e.key,e)}),Object(a.b)(u,e=>{Object(i.a)(e),h=!0,u.disabled=!0,Object(l.f)(u),s.default.getLangPack(t.suggested_lang_code)})})}}}]); -//# sourceMappingURL=16.8f20a4414cdceb869a1b.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[16,17,30],{18:function(e,t,n){"use strict";n.r(t),n.d(t,"ripple",(function(){return c}));var i=n(6),a=n(60),o=n(1),s=n(15);let r=0;function c(e,t=(()=>Promise.resolve()),n=null,c=!1){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let d=document.createElement("div");d.classList.add("c-ripple");let l;e.classList.contains("rp-square")&&d.classList.add("is-square"),e[c?"prepend":"append"](d);const u=(e,i)=>{const s=Date.now(),c=document.createElement("div"),u=r++,h=1e3*+window.getComputedStyle(d).getPropertyValue("--ripple-duration").replace("s","");l=()=>{let e=Date.now()-s;const t=()=>{a.a.mutate(()=>{c.remove()}),n&&n(u)};if(ec.classList.add("hiding"),Math.max(n-h/2,0)),setTimeout(t,n)}else c.classList.add("hiding"),setTimeout(t,h/2);o.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",l),l=null,p=!1},t&&t(u),window.requestAnimationFrame(()=>{const t=d.getBoundingClientRect();c.classList.add("c-ripple__circle");const n=e-t.left,a=i-t.top,o=Math.sqrt(Math.pow(Math.abs(a-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),s=n-o/2,r=a-o/2;c.style.width=c.style.height=o+"px",c.style.left=s+"px",c.style.top=r+"px",d.append(c)})},h=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==d);let p=!1;if(o.IS_TOUCH_SUPPORTED){let t=()=>{l&&l()};e.addEventListener("touchstart",n=>{if(!s.default.settings.animationsEnabled)return;if(n.touches.length>1||p||h(n))return;p=!0;let{clientX:i,clientY:a}=n.touches[0];u(i,a),e.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",n=>{n.cancelBubble=!0,n.stopPropagation(),t(),e.removeEventListener("touchend",t)},{once:!0})},{passive:!0})}else e.addEventListener("mousedown",t=>{if(![0,2].includes(t.button))return;if(!s.default.settings.animationsEnabled)return;if("0"===e.dataset.ripple||h(t))return;if(p)return void(p=!1);let{clientX:n,clientY:i}=t;u(n,i),window.addEventListener("mouseup",l,{once:!0,passive:!0}),window.addEventListener("contextmenu",l,{once:!0,passive:!0})},{passive:!0})}},20:function(e,t,n){"use strict";n.r(t);var i=n(35),a=n(47),o=n(17),s=n(33),r=n(31),c=n(64),d=n(38),l=n(55),u=n(34),h=n(89),p=n(1),m=n(8),g=n(16),f=n(51),v=n(18),b=n(63),y=n(6),w=n(65),E=n(99),L=n(119),O=n(22),_=n(94),S=n(5),T=n(30),j=n(36),k=n(58),x=n(67),P=n(100),I=n(93),C=n(52),A=n(80),R=n(15),D=n(125),M=n(10),B=function(e,t,n,i){return new(n||(n=Promise))((function(a,o){function s(e){try{c(i.next(e))}catch(e){o(e)}}function r(e){try{c(i.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,r)}c((i=i.apply(e,t||[])).next())}))};let H,N=null;const U=new c.a("page-sign",!0,()=>{const e=()=>{t=g.default.countriesList.filter(e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)}).sort((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name))};let t;e(),R.default.addEventListener("language_change",()=>{e()});const c=new Map;let v,q;const F=document.createElement("div");F.classList.add("input-wrapper");const Q=new d.b({label:"Login.CountrySelectorLabel",name:Object(w.b)()});Q.container.classList.add("input-select");const X=Q.input,$=document.createElement("div");$.classList.add("select-wrapper","z-depth-3","hide");const V=document.createElement("span");V.classList.add("arrow","arrow-down"),Q.container.append(V);const W=document.createElement("ul");$.appendChild(W);new a.b($);let Y=()=>{Y=null,t.forEach(e=>{const t=Object(I.c)(e.iso2),n=[];e.country_codes.forEach(i=>{const a=document.createElement("li");let o=r.a.wrapEmojiText(t);if(M.a){const e=document.createElement("span");e.innerHTML=o,a.append(e)}else a.innerHTML=o;const s=Object(g.i18n)(e.default_name);s.dataset.defaultName=e.default_name,a.append(s);const c=document.createElement("span");c.classList.add("phone-code"),c.innerText="+"+i.country_code,a.appendChild(c),n.push(a),W.append(a)}),c.set(e.iso2,n)}),W.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(b.a)(e.target,"LI");z(t)}),Q.container.appendChild($)};const z=e=>{const n=e.childNodes[1].dataset.defaultName,i=e.querySelector(".phone-code").innerText,a=i.replace(/\D/g,"");Object(j.a)(X,Object(g.i18n)(n)),Object(C.a)(X,"input"),v=t.find(e=>e.default_name===n),q=v.country_codes.find(e=>e.country_code===a),ee.value=ee.lastValue=i,Z(),setTimeout(()=>{te.focus(),Object(P.a)(te,!0)},0)};let J;Y(),X.addEventListener("focus",(function(e){Y?Y():t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout(J),J=void 0,$.classList.remove("hide"),$.offsetWidth,$.classList.add("active"),Q.select(),Object(h.b)(U.pageEl.parentElement.parentElement,X,"start",4),setTimeout(()=>{K||(document.addEventListener("mousedown",G,{capture:!0}),K=!0)},0)}));let K=!1;const G=e=>{Object(y.a)(e.target,"input-select")||e.target!==X&&(Z(),document.removeEventListener("mousedown",G,{capture:!0}),K=!1)},Z=()=>{void 0===J&&($.classList.remove("active"),J=window.setTimeout(()=>{$.classList.add("hide"),J=void 0},200))};X.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let i=Q.value.toLowerCase(),a=[];t.forEach(e=>{let t=!![e.name,e.default_name].filter(Boolean).find(e=>-1!==e.toLowerCase().indexOf(i));c.get(e.iso2).forEach(e=>e.style.display=t?"":"none"),t&&a.push(e)}),0===a.length?t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}):1===a.length&&"Enter"===n&&z(c.get(a[0].iso2)[0])}),V.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),X.matches(":focus")?X.blur():X.focus()}));const ee=new D.a({onInput:e=>{f.a.loadLottieWorkers();const{country:t,code:n}=e||{};let i=t?t.name||t.default_name:"";i===Q.value||v&&t&&n&&(v===t||q.country_code===n.country_code)||(Object(j.a)(X,t?Object(g.i18n)(t.default_name):i),v=t,q=n),t||ee.value.length-1>1?N.style.visibility="":N.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!N.style.visibility&&"Enter"===e.key)return ie()});const ne=new l.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.checked;o.default.pushToState("keepSigned",e),E.a.toggleStorage(e),L.a.toggleStorage(e),s.a.toggleStorage(e),x.a.toggleStorage(e)}),o.default.getState().then(e=>{o.default.storage.isAvailable()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),N=Object(u.a)("btn-primary btn-color-primary",{text:"Login.Next"}),N.style.visibility="hidden";const ie=e=>{e&&Object(S.a)(e);const t=Object(k.a)([N,H],!0);Object(j.a)(N,Object(g.i18n)("PleaseWait")),Object(i.f)(N);let a=ee.value;s.a.invokeApi("auth.sendCode",{phone_number:a,api_id:m.a.id,api_hash:m.a.hash,settings:{_:"codeSettings"}}).then(e=>{n.e(21).then(n.bind(null,23)).then(t=>t.default.mount(Object.assign(e,{phone_number:a})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(j.a)(ee.label,Object(g.i18n)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(j.a)(N,Object(g.i18n)("Login.Next"));break;default:console.error("auth.sendCode error:",e),N.innerText=e.type}})};Object(T.b)(N,ie),H=Object(u.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});H.addEventListener("click",()=>{O.default.mount()}),F.append(Q.container,ee.container,ne.label,N,H);const ae=document.createElement("h4");ae.classList.add("text-center"),Object(g._i18n)(ae,"Login.Title");const oe=document.createElement("div");oe.classList.add("subtitle","text-center"),Object(g._i18n)(oe,"Login.StartText"),U.pageEl.querySelector(".container").append(ae,oe,F);p.IS_TOUCH_SUPPORTED||setTimeout(()=>{te.focus()},0),Object(_.a)(F),s.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=A.a.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&g.default.getLangPack(n.lang_code).then(()=>{Object(C.a)(te,"input")});const i=new Set([1,2,3,4,5]),a=[e.this_dc];let o;return e.nearest_dc!==e.this_dc&&(o=s.a.getNetworker(e.nearest_dc).then(()=>{a.push(e.nearest_dc)})),(o||Promise.resolve()).then(()=>{a.forEach(e=>{i.delete(e)});const e=[...i],t=()=>B(void 0,void 0,void 0,(function*(){const n=e.shift();if(!n)return;const i=`dc${n}_auth_key`;if(yield x.a.get(i))return t();setTimeout(()=>{s.a.getNetworker(n).finally(t)},3e3)}));t()}),e}).then(e=>{Q.value.length||ee.value.length||z(c.get(e.country)[0])})},()=>{N&&(Object(j.a)(N,Object(g.i18n)("Login.Next")),Object(v.ripple)(N,void 0,void 0,!0),N.removeAttribute("disabled")),H&&H.removeAttribute("disabled"),o.default.pushToState("authState",{_:"authStateSignIn"})});t.default=U},22:function(e,t,n){"use strict";n.r(t);var i=n(33),a=n(64),o=n(70),s=n(76),r=n(8),c=n(34),d=n(16),l=n(17),u=n(15),h=n(35),p=n(94),m=n(82),g=function(e,t,n,i){return new(n||(n=Promise))((function(a,o){function s(e){try{c(i.next(e))}catch(e){o(e)}}function r(e){try{c(i.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,r)}c((i=i.apply(e,t||[])).next())}))};let f;const v=new a.a("page-signQR",!0,()=>f,()=>{f||(f=g(void 0,void 0,void 0,(function*(){const e=v.pageEl.querySelector(".auth-image");let t=Object(h.f)(e,!0);const a=document.createElement("div");a.classList.add("input-wrapper");const l=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});a.append(l),Object(p.a)(a);const b=e.parentElement,y=document.createElement("h4");Object(d._i18n)(y,"Login.QR.Title");const w=document.createElement("ol");w.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(d.i18n)(e)),w.append(t)}),b.append(y,w,a),l.addEventListener("click",()=>{Promise.all([n.e(3),n.e(30)]).then(n.bind(null,20)).then(e=>e.default.mount()),L=!0});const E=(yield Promise.all([n.e(10).then(n.t.bind(null,134,7))]))[0].default;let L=!1;u.default.addEventListener("user_auth",()=>{L=!0,f=null},{once:!0});let O,_={ignoreErrors:!0};const S=a=>g(void 0,void 0,void 0,(function*(){try{let c=yield i.a.invokeApi("auth.exportLoginToken",{api_id:r.a.id,api_hash:r.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===c._&&(_.dcId||(_.dcId=c.dc_id,i.a.setBaseDcId(c.dc_id)),c=yield i.a.invokeApi("auth.importLoginToken",{token:c.token},_)),"auth.loginTokenSuccess"===c._){const e=c.authorization;return i.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!O||!Object(s.b)(O,c.token)){O=c.token;let n="tg://login?token="+Object(s.d)(c.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,"");const i=window.getComputedStyle(document.documentElement),a=i.getPropertyValue("--surface-color").trim(),o=i.getPropertyValue("--primary-text-color").trim(),r=i.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${r}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),l=new E({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:a},qrOptions:{errorCorrectionLevel:"L"}});let u;l.append(e),e.lastChild.classList.add("qr-canvas"),u=l._drawingPromise?l._drawingPromise:Promise.race([Object(m.a)(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){let e=Date.now()/1e3,t=c.expires-e-o.a.serverTimeOffset;yield Object(m.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(15).then(n.bind(null,21)).then(e=>e.default.mount()),L=!0,f=null;break;default:console.error("pageSignQR: default error:",e),L=!0}return!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(L=!1;!L&&!(yield S(!0)););}))}))),f.then(e=>{e()}),l.default.pushToState("authState",{_:"authStateSignQr"})});t.default=v},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return s})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}));var i=n(1),a=n(52);const o=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function s(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(o,t,n)}function r(e,t,n){e.removeEventListener(o,t,n)}function c(e){Object(a.a)(e,o)}},34:function(e,t,n){"use strict";var i=n(16),a=n(18);t.a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),Object(a.ripple)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append(Object(i.i18n)(t.text)),n}},35:function(e,t,n){"use strict";n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return g})),n.d(t,"d",(function(){return y})),n.d(t,"e",(function(){return w})),n.d(t,"b",(function(){return O})),n.d(t,"a",(function(){return _}));var i=n(29),a=n(5),o=n(30),s=n(37),r=n(1),c=n(0),d=n(15),l=n(50);function u(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function h(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,u(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=u;let p=e=>{let t=f.getBoundingClientRect(),{clientX:n,clientY:i}=e,a=n>=t.right?n-t.right:t.left-n,o=i>=t.bottom?i-t.bottom:t.top-i;(a>=100||o>=100)&&g()};const m=e=>{g()},g=()=>{f&&(f.classList.remove("active"),f.parentElement.classList.remove("menu-open"),b&&b.remove(),f=null,d.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(o.a,m),c.IS_MOBILE_SAFARI||l.a.removeByType("menu")};window.addEventListener("resize",()=>{f&&g()});let f=null,v=null,b=null;function y(e,t){g(),c.IS_MOBILE_SAFARI||l.a.pushItem({type:"menu",onPop:e=>{g()}}),f=e,f.classList.add("active"),f.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(o.a,e=>{Object(a.a)(e),m()})),f.parentElement.insertBefore(b,f),v=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(o.a,m),d.default.dispatchEvent("context_menu_toggle",!0)}function w({pageX:e,pageY:t},n,i){let{scrollWidth:a,scrollHeight:o}=n;const r=document.body.getBoundingClientRect(),c=r.width,d=r.height;i=s.b.isMobile?"right":"left";let l="top";const u={x:{left:e,right:e-a},intermediateX:"right"===i?8:c-a-8,y:{top:t,bottom:t-o},intermediateY:t=8},p={top:u.y.top+o+8<=d,bottom:u.y.bottom-8>=8};{let e;e=h[i]?u.x[i]:(i="center",u.intermediateX),n.style.left=e+"px"}{let e;e=p[l]?u.y[l]:(l="center",u.intermediateY),n.style.top=e+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===l?l:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let E=!1,L=0;function O(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,E=!1},400),E=!0}function _(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e),o=n?n.removeManual.bind(n,e):e.removeEventListener.bind(e);if(c.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const s={capture:!0},r=()=>{clearTimeout(n),o("touchmove",r,s),o("touchend",r,s),o("touchcancel",r,s)};i("touchstart",o=>{o.touches.length>1?r():(i("touchmove",r,s),i("touchend",r,s),i("touchcancel",r,s),n=window.setTimeout(()=>{E?r():(t(o.touches[0]),r(),f&&e.addEventListener("touchend",a.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{t(n),f&&e.addEventListener("touchend",a.a,{once:!0})}:t)}},50:function(e,t,n){"use strict";var i=n(29),a=n(0),o=n(43),s=n(7),r=n(5),c=n(41),d=n(72);const l=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(o.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!e,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),a.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(d.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",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||Object(s.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){Object(c.e)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===e&&(this.navigations.splice(n,1),t))break}}};i.a.appNavigationController=l,t.a=l},52:function(e,t,n){"use strict";function i(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)}n.d(t,"a",(function(){return i}))},60:function(e,t,n){"use strict";var i=n(42),a=n(46),o=n(29),s=n(61);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=Object(a.a)()),void 0!==t&&n.then(()=>t()),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=Object(s.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&n.then(()=>t()),n}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};o.a&&(o.a.sequentialDom=r),t.a=r},70:function(e,t,n){"use strict";var i=n(29),a=n(67),o=n(33);const s=new class{constructor(){this.serverTimeOffset=0,a.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),o.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=s),t.a=s},72:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(0);function a(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},76:function(e,t,n){"use strict";function i(e){const t=e.length,n=new Array(t);for(let i=0;i>>t&24),2!==t&&i-o!=1||(n+=String.fromCharCode(s(a>>>18&63),s(a>>>12&63),s(a>>>6&63),s(63&a)),a=0);return n.replace(/A(?=A$|$)/g,"=")}function s(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function r(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ie+(t.byteLength||t.length),0),n=new Uint8Array(t);let i=0;return e.forEach(e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),n}n.d(t,"e",(function(){return i})),n.d(t,"c",(function(){return a})),n.d(t,"d",(function(){return o})),n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return c}))},94:function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var i=n(5),a=n(30),o=n(9),s=n(16),r=n(33),c=n(15),d=n(34),l=n(35);let u,h=!1;function p(e){h||(u||(u=r.a.getConfig().then(e=>e.suggested_lang_code!==s.default.lastRequestedLangCode?Promise.all([e,s.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),s.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const r=[];n.forEach(e=>{const t=s.default.strings.get(e.key);t&&(r.push(t),s.default.strings.set(e.key,e))});const u=Object(d.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(o.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),c.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),r.forEach(e=>{s.default.strings.set(e.key,e)}),Object(a.b)(u,e=>{Object(i.a)(e),h=!0,u.disabled=!0,Object(l.f)(u),s.default.getLangPack(t.suggested_lang_code)})})}}}]); +//# sourceMappingURL=16.e12ddbc52a3f75e72c89.chunk.js.map \ No newline at end of file diff --git a/public/16.e12ddbc52a3f75e72c89.chunk.js.map b/public/16.e12ddbc52a3f75e72c89.chunk.js.map new file mode 100644 index 000000000..6ad7821a7 --- /dev/null +++ b/public/16.e12ddbc52a3f75e72c89.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignIn.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/components/languageChangeButton.ts"],"names":["rippleClickId","ripple","elem","callback","Promise","resolve","onEnd","prepend","querySelector","classList","add","r","document","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","remove","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","append","isRippleUnneeded","e","target","includes","tagName","touchEnd","addEventListener","settings","animationsEnabled","touches","length","once","cancelBubble","stopPropagation","passive","button","dataset","btnQr","btnNext","page","setCountries","countries","countriesList","filter","country","pFlags","hidden","sort","a","b","name","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","countryInputField","label","container","countryInput","input","selectWrapper","arrowDown","selectList","appendChild","initSelect","forEach","c","emoji","iso2","liArr","country_codes","countryCode","li","wrapped","wrapEmojiText","spanEmoji","innerHTML","el","defaultName","span","innerText","country_code","push","set","selectCountryByTarget","childNodes","phoneCode","find","_countryCode","telInputField","value","lastValue","hidePicker","telEl","focus","hideTimeout","get","display","clearTimeout","undefined","offsetWidth","select","pageEl","parentElement","mouseDownHandlerAttached","onMouseDown","capture","key","ctrlKey","_value","toLowerCase","matches","good","Boolean","str","indexOf","preventDefault","blur","onInput","formatted","loadLottieWorkers","code","countryName","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","pushToState","toggleStorage","getState","then","state","storage","isAvailable","toggle","phone_number","invokeApi","api_id","id","api_hash","hash","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","h4","subtitle","nearestDcResult","langPack","getFromCache","getLangPack","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","getNetworker","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute","cachedPromise","imageDiv","preloader","btnBack","helpList","stop","QRCodeStyling","all","prevToken","options","ignoreErrors","iterate","isLoop","loginToken","except_ids","dc_id","setBaseDcId","token","authorization","setUser","user","url","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","result","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","_canvas","_image","animation","children","Array","from","slice","timestamp","diff","expires","serverTimeOffset","warn","handled","func","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","className","asDiv","icon","noRipple","rippleSquare","onlyMobile","disabled","setAttribute","putPreloader","returnDiv","html","div","insertAdjacentHTML","lastElementChild","setButtonLoader","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","isMobile","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","element","removeManual","timeout","onCancel","appNavigationController","navigations","manual","log","debug","currentHash","location","isPossibleSwipe","this","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","noBlurOnPop","i","index","ret","findItemByType","backByItem","splice","noHistory","origin","pathname","single","simulateEvent","event","Event","bubbles","cancelable","sequentialDom","promises","raf","scheduled","kind","scheduleFlush","do","read","write","serverTimeManager","to","addTaskListener","task","payload","isSwipingBackSafari","TouchEvent","bytesToHex","bytes","arr","toString","join","bytesFromHex","hexString","len","Uint8Array","ceil","start","parseInt","charAt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","String","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","bufferConcats","args","reduce","acc","v","byteLength","tmp","lastLength","ArrayBuffer","getLanguageChangeButton","appendTo","getConfig","config","suggested_lang_code","lastRequestedLangCode","getStrings","getCacheLangPack","strings","backup","string","backupString","btnChangeLanguage"],"mappings":"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","file":"16.e12ddbc52a3f75e72c89.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.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 elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.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(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { ripple } from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\r\n // const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter(country => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll(page.pageEl.parentElement.parentElement, countryInput, 'start', 4);\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n let good = !![c.name, c.default_name].filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch(err => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then(module => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach(dcId => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n apiManager.getNetworker(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport { bytesCmp, bytesToBase64 } from '../helpers/bytes';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport { pause } from '../helpers/schedulers/pause';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + encoded.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/\\=+$/, \"\");\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nconst Button = (className: string, options: 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 const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\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' | 'global-search' | 'voice',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n 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","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } 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 promise = isInDOM(element) ? this.mutate() : Promise.resolve();\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 private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\n * 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\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().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"],"sourceRoot":""} \ No newline at end of file diff --git a/public/17.e503493b3028be8a4735.chunk.js b/public/17.be8ba8da5cf5a29471fb.chunk.js similarity index 70% rename from public/17.e503493b3028be8a4735.chunk.js rename to public/17.be8ba8da5cf5a29471fb.chunk.js index baea345f8..36cc00d47 100644 --- a/public/17.e503493b3028be8a4735.chunk.js +++ b/public/17.be8ba8da5cf5a29471fb.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[17],{18:function(e,t,n){"use strict";n.r(t),n.d(t,"ripple",(function(){return c}));var i=n(6),s=n(58),o=n(1),a=n(15);let r=0;function c(e,t=(()=>Promise.resolve()),n=null,c=!1){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let d=document.createElement("div");d.classList.add("c-ripple");let l;e.classList.contains("rp-square")&&d.classList.add("is-square"),e[c?"prepend":"append"](d);const u=(e,i)=>{const a=Date.now(),c=document.createElement("div"),u=r++,h=1e3*+window.getComputedStyle(d).getPropertyValue("--ripple-duration").replace("s","");l=()=>{let e=Date.now()-a;const t=()=>{s.a.mutate(()=>{c.remove()}),n&&n(u)};if(ec.classList.add("hiding"),Math.max(n-h/2,0)),setTimeout(t,n)}else c.classList.add("hiding"),setTimeout(t,h/2);o.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",l),l=null,p=!1},t&&t(u),window.requestAnimationFrame(()=>{const t=d.getBoundingClientRect();c.classList.add("c-ripple__circle");const n=e-t.left,s=i-t.top,o=Math.sqrt(Math.pow(Math.abs(s-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),a=n-o/2,r=s-o/2;c.style.width=c.style.height=o+"px",c.style.left=a+"px",c.style.top=r+"px",d.append(c)})},h=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==d);let p=!1;if(o.IS_TOUCH_SUPPORTED){let t=()=>{l&&l()};e.addEventListener("touchstart",n=>{if(!a.default.settings.animationsEnabled)return;if(n.touches.length>1||p||h(n))return;p=!0;let{clientX:i,clientY:s}=n.touches[0];u(i,s),e.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",n=>{n.cancelBubble=!0,n.stopPropagation(),t(),e.removeEventListener("touchend",t)},{once:!0})},{passive:!0})}else e.addEventListener("mousedown",t=>{if(![0,2].includes(t.button))return;if(!a.default.settings.animationsEnabled)return;if("0"===e.dataset.ripple||h(t))return;if(p)return void(p=!1);let{clientX:n,clientY:i}=t;u(n,i),window.addEventListener("mouseup",l,{once:!0,passive:!0}),window.addEventListener("contextmenu",l,{once:!0,passive:!0})},{passive:!0})}},22:function(e,t,n){"use strict";n.r(t);var i=n(32),s=n(62),o=n(68),a=n(75),r=n(8),c=n(33),d=n(16),l=n(17),u=n(15),h=n(35),p=n(92),m=n(81),g=function(e,t,n,i){return new(n||(n=Promise))((function(s,o){function a(e){try{c(i.next(e))}catch(e){o(e)}}function r(e){try{c(i.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}c((i=i.apply(e,t||[])).next())}))};let f;const v=new s.a("page-signQR",!0,()=>f,()=>{f||(f=g(void 0,void 0,void 0,(function*(){const e=v.pageEl.querySelector(".auth-image");let t=Object(h.f)(e,!0);const s=document.createElement("div");s.classList.add("input-wrapper");const l=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});s.append(l),Object(p.a)(s);const w=e.parentElement,b=document.createElement("h4");Object(d._i18n)(b,"Login.QR.Title");const y=document.createElement("ol");y.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(d.i18n)(e)),y.append(t)}),w.append(b,y,s),l.addEventListener("click",()=>{Promise.all([n.e(3),n.e(30)]).then(n.bind(null,20)).then(e=>e.default.mount()),L=!0});const E=(yield Promise.all([n.e(10).then(n.t.bind(null,131,7))]))[0].default;let L=!1;u.default.addEventListener("user_auth",()=>{L=!0,f=null},{once:!0});let O,S={ignoreErrors:!0};const _=s=>g(void 0,void 0,void 0,(function*(){try{let c=yield i.a.invokeApi("auth.exportLoginToken",{api_id:r.a.id,api_hash:r.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===c._&&(S.dcId||(S.dcId=c.dc_id,i.a.setBaseDcId(c.dc_id)),c=yield i.a.invokeApi("auth.importLoginToken",{token:c.token},S)),"auth.loginTokenSuccess"===c._){const e=c.authorization;return i.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!O||!Object(a.b)(O,c.token)){O=c.token;let n="tg://login?token="+Object(a.d)(c.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,"");const i=window.getComputedStyle(document.documentElement),s=i.getPropertyValue("--surface-color").trim(),o=i.getPropertyValue("--primary-text-color").trim(),r=i.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${r}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),l=new E({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:s},qrOptions:{errorCorrectionLevel:"L"}});let u;l.append(e),e.lastChild.classList.add("qr-canvas"),u=l._drawingPromise?l._drawingPromise:Promise.race([Object(m.a)(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(s){let e=Date.now()/1e3,t=c.expires-e-o.a.serverTimeOffset;yield Object(m.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(15).then(n.bind(null,21)).then(e=>e.default.mount()),L=!0,f=null;break;default:console.error("pageSignQR: default error:",e),L=!0}return!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(L=!1;!L&&!(yield _(!0)););}))}))),f.then(e=>{e()}),l.default.pushToState("authState",{_:"authStateSignQr"})});t.default=v},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}));var i=n(1),s=n(52);const o=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function a(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(o,t,n)}function r(e,t,n){e.removeEventListener(o,t,n)}function c(e){Object(s.a)(e,o)}},33:function(e,t,n){"use strict";var i=n(16),s=n(18);t.a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),Object(s.ripple)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append(Object(i.i18n)(t.text)),n}},35:function(e,t,n){"use strict";n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return g})),n.d(t,"d",(function(){return b})),n.d(t,"e",(function(){return y})),n.d(t,"b",(function(){return O})),n.d(t,"a",(function(){return S}));var i=n(29),s=n(5),o=n(30),a=n(37),r=n(1),c=n(0),d=n(15),l=n(48);function u(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function h(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,u(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=u;let p=e=>{let t=f.getBoundingClientRect(),{clientX:n,clientY:i}=e,s=n>=t.right?n-t.right:t.left-n,o=i>=t.bottom?i-t.bottom:t.top-i;(s>=100||o>=100)&&g()};const m=e=>{g()},g=()=>{f&&(f.classList.remove("active"),f.parentElement.classList.remove("menu-open"),w&&w.remove(),f=null,d.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(o.a,m),c.IS_MOBILE_SAFARI||l.a.removeByType("menu")};window.addEventListener("resize",()=>{f&&g()});let f=null,v=null,w=null;function b(e,t){g(),c.IS_MOBILE_SAFARI||l.a.pushItem({type:"menu",onPop:e=>{g()}}),f=e,f.classList.add("active"),f.parentElement.classList.add("menu-open"),w||(w=document.createElement("div"),w.classList.add("btn-menu-overlay"),w.addEventListener(o.a,e=>{Object(s.a)(e),m()})),f.parentElement.insertBefore(w,f),v=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(o.a,m),d.default.dispatchEvent("context_menu_toggle",!0)}function y({pageX:e,pageY:t},n,i){let{scrollWidth:s,scrollHeight:o}=n;const r=document.body.getBoundingClientRect(),c=r.width,d=r.height;i=a.b.isMobile?"right":"left";let l="top";const u={x:{left:e,right:e-s},intermediateX:"right"===i?8:c-s-8,y:{top:t,bottom:t-o},intermediateY:t=8},p={top:u.y.top+o+8<=d,bottom:u.y.bottom-8>=8};{let e;e=h[i]?u.x[i]:(i="center",u.intermediateX),n.style.left=e+"px"}{let e;e=p[l]?u.y[l]:(l="center",u.intermediateY),n.style.top=e+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===l?l:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let E=!1,L=0;function O(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,E=!1},400),E=!0}function S(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e),o=n?n.removeManual.bind(n,e):e.removeEventListener.bind(e);if(c.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const a={capture:!0},r=()=>{clearTimeout(n),o("touchmove",r,a),o("touchend",r,a),o("touchcancel",r,a)};i("touchstart",o=>{o.touches.length>1?r():(i("touchmove",r,a),i("touchend",r,a),i("touchcancel",r,a),n=window.setTimeout(()=>{E?r():(t(o.touches[0]),r(),f&&e.addEventListener("touchend",s.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{t(n),f&&e.addEventListener("touchend",s.a,{once:!0})}:t)}},48:function(e,t,n){"use strict";var i=n(29),s=n(0),o=n(43),a=n(7),r=n(5),c=n(44),d=n(71);const l=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(o.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!e,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(d.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",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||Object(a.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return this.manual=!0,this.navigations.splice(t.index,1),void this.handleItem(t.item)}history.back()}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){Object(c.e)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===e&&(this.navigations.splice(n,1),t))break}}};i.a.appNavigationController=l,t.a=l},52:function(e,t,n){"use strict";function i(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)}n.d(t,"a",(function(){return i}))},58:function(e,t,n){"use strict";var i=n(41),s=n(45),o=n(29),a=n(60);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=Object(s.a)()),void 0!==t&&n.then(()=>t()),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=Object(a.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&n.then(()=>t()),n}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};o.a&&(o.a.sequentialDom=r),t.a=r},68:function(e,t,n){"use strict";var i=n(29),s=n(65),o=n(32);const a=new class{constructor(){this.serverTimeOffset=0,s.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),o.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=a),t.a=a},71:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(0);function s(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},75:function(e,t,n){"use strict";function i(e){const t=e.length,n=new Array(t);for(let i=0;i>>t&24),2!==t&&i-o!=1||(n+=String.fromCharCode(a(s>>>18&63),a(s>>>12&63),a(s>>>6&63),a(63&s)),s=0);return n.replace(/A(?=A$|$)/g,"=")}function a(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function r(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ie+(t.byteLength||t.length),0),n=new Uint8Array(t);let i=0;return e.forEach(e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),n}n.d(t,"e",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"d",(function(){return o})),n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return c}))},92:function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var i=n(5),s=n(30),o=n(9),a=n(16),r=n(32),c=n(15),d=n(33),l=n(35);let u,h=!1;function p(e){h||(u||(u=r.a.getConfig().then(e=>e.suggested_lang_code!==a.default.lastRequestedLangCode?Promise.all([e,a.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),a.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const r=[];n.forEach(e=>{const t=a.default.strings.get(e.key);t&&(r.push(t),a.default.strings.set(e.key,e))});const u=Object(d.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(o.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),c.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),r.forEach(e=>{a.default.strings.set(e.key,e)}),Object(s.b)(u,e=>{Object(i.a)(e),h=!0,u.disabled=!0,Object(l.f)(u),a.default.getLangPack(t.suggested_lang_code)})})}}}]); -//# sourceMappingURL=17.e503493b3028be8a4735.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[17],{18:function(e,t,n){"use strict";n.r(t),n.d(t,"ripple",(function(){return c}));var i=n(6),s=n(60),o=n(1),a=n(15);let r=0;function c(e,t=(()=>Promise.resolve()),n=null,c=!1){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let d=document.createElement("div");d.classList.add("c-ripple");let l;e.classList.contains("rp-square")&&d.classList.add("is-square"),e[c?"prepend":"append"](d);const u=(e,i)=>{const a=Date.now(),c=document.createElement("div"),u=r++,h=1e3*+window.getComputedStyle(d).getPropertyValue("--ripple-duration").replace("s","");l=()=>{let e=Date.now()-a;const t=()=>{s.a.mutate(()=>{c.remove()}),n&&n(u)};if(ec.classList.add("hiding"),Math.max(n-h/2,0)),setTimeout(t,n)}else c.classList.add("hiding"),setTimeout(t,h/2);o.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",l),l=null,p=!1},t&&t(u),window.requestAnimationFrame(()=>{const t=d.getBoundingClientRect();c.classList.add("c-ripple__circle");const n=e-t.left,s=i-t.top,o=Math.sqrt(Math.pow(Math.abs(s-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),a=n-o/2,r=s-o/2;c.style.width=c.style.height=o+"px",c.style.left=a+"px",c.style.top=r+"px",d.append(c)})},h=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==d);let p=!1;if(o.IS_TOUCH_SUPPORTED){let t=()=>{l&&l()};e.addEventListener("touchstart",n=>{if(!a.default.settings.animationsEnabled)return;if(n.touches.length>1||p||h(n))return;p=!0;let{clientX:i,clientY:s}=n.touches[0];u(i,s),e.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",n=>{n.cancelBubble=!0,n.stopPropagation(),t(),e.removeEventListener("touchend",t)},{once:!0})},{passive:!0})}else e.addEventListener("mousedown",t=>{if(![0,2].includes(t.button))return;if(!a.default.settings.animationsEnabled)return;if("0"===e.dataset.ripple||h(t))return;if(p)return void(p=!1);let{clientX:n,clientY:i}=t;u(n,i),window.addEventListener("mouseup",l,{once:!0,passive:!0}),window.addEventListener("contextmenu",l,{once:!0,passive:!0})},{passive:!0})}},22:function(e,t,n){"use strict";n.r(t);var i=n(33),s=n(64),o=n(70),a=n(76),r=n(8),c=n(34),d=n(16),l=n(17),u=n(15),h=n(35),p=n(94),m=n(82),g=function(e,t,n,i){return new(n||(n=Promise))((function(s,o){function a(e){try{c(i.next(e))}catch(e){o(e)}}function r(e){try{c(i.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}c((i=i.apply(e,t||[])).next())}))};let f;const v=new s.a("page-signQR",!0,()=>f,()=>{f||(f=g(void 0,void 0,void 0,(function*(){const e=v.pageEl.querySelector(".auth-image");let t=Object(h.f)(e,!0);const s=document.createElement("div");s.classList.add("input-wrapper");const l=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});s.append(l),Object(p.a)(s);const w=e.parentElement,b=document.createElement("h4");Object(d._i18n)(b,"Login.QR.Title");const y=document.createElement("ol");y.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(d.i18n)(e)),y.append(t)}),w.append(b,y,s),l.addEventListener("click",()=>{Promise.all([n.e(3),n.e(30)]).then(n.bind(null,20)).then(e=>e.default.mount()),L=!0});const E=(yield Promise.all([n.e(10).then(n.t.bind(null,134,7))]))[0].default;let L=!1;u.default.addEventListener("user_auth",()=>{L=!0,f=null},{once:!0});let O,S={ignoreErrors:!0};const _=s=>g(void 0,void 0,void 0,(function*(){try{let c=yield i.a.invokeApi("auth.exportLoginToken",{api_id:r.a.id,api_hash:r.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===c._&&(S.dcId||(S.dcId=c.dc_id,i.a.setBaseDcId(c.dc_id)),c=yield i.a.invokeApi("auth.importLoginToken",{token:c.token},S)),"auth.loginTokenSuccess"===c._){const e=c.authorization;return i.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!O||!Object(a.b)(O,c.token)){O=c.token;let n="tg://login?token="+Object(a.d)(c.token).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,"");const i=window.getComputedStyle(document.documentElement),s=i.getPropertyValue("--surface-color").trim(),o=i.getPropertyValue("--primary-text-color").trim(),r=i.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${r}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),l=new E({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:s},qrOptions:{errorCorrectionLevel:"L"}});let u;l.append(e),e.lastChild.classList.add("qr-canvas"),u=l._drawingPromise?l._drawingPromise:Promise.race([Object(m.a)(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(s){let e=Date.now()/1e3,t=c.expires-e-o.a.serverTimeOffset;yield Object(m.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(15).then(n.bind(null,21)).then(e=>e.default.mount()),L=!0,f=null;break;default:console.error("pageSignQR: default error:",e),L=!0}return!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(L=!1;!L&&!(yield _(!0)););}))}))),f.then(e=>{e()}),l.default.pushToState("authState",{_:"authStateSignQr"})});t.default=v},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}));var i=n(1),s=n(52);const o=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function a(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(o,t,n)}function r(e,t,n){e.removeEventListener(o,t,n)}function c(e){Object(s.a)(e,o)}},34:function(e,t,n){"use strict";var i=n(16),s=n(18);t.a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),Object(s.ripple)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append(Object(i.i18n)(t.text)),n}},35:function(e,t,n){"use strict";n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return g})),n.d(t,"d",(function(){return b})),n.d(t,"e",(function(){return y})),n.d(t,"b",(function(){return O})),n.d(t,"a",(function(){return S}));var i=n(29),s=n(5),o=n(30),a=n(37),r=n(1),c=n(0),d=n(15),l=n(50);function u(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function h(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,u(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=u;let p=e=>{let t=f.getBoundingClientRect(),{clientX:n,clientY:i}=e,s=n>=t.right?n-t.right:t.left-n,o=i>=t.bottom?i-t.bottom:t.top-i;(s>=100||o>=100)&&g()};const m=e=>{g()},g=()=>{f&&(f.classList.remove("active"),f.parentElement.classList.remove("menu-open"),w&&w.remove(),f=null,d.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(o.a,m),c.IS_MOBILE_SAFARI||l.a.removeByType("menu")};window.addEventListener("resize",()=>{f&&g()});let f=null,v=null,w=null;function b(e,t){g(),c.IS_MOBILE_SAFARI||l.a.pushItem({type:"menu",onPop:e=>{g()}}),f=e,f.classList.add("active"),f.parentElement.classList.add("menu-open"),w||(w=document.createElement("div"),w.classList.add("btn-menu-overlay"),w.addEventListener(o.a,e=>{Object(s.a)(e),m()})),f.parentElement.insertBefore(w,f),v=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(o.a,m),d.default.dispatchEvent("context_menu_toggle",!0)}function y({pageX:e,pageY:t},n,i){let{scrollWidth:s,scrollHeight:o}=n;const r=document.body.getBoundingClientRect(),c=r.width,d=r.height;i=a.b.isMobile?"right":"left";let l="top";const u={x:{left:e,right:e-s},intermediateX:"right"===i?8:c-s-8,y:{top:t,bottom:t-o},intermediateY:t=8},p={top:u.y.top+o+8<=d,bottom:u.y.bottom-8>=8};{let e;e=h[i]?u.x[i]:(i="center",u.intermediateX),n.style.left=e+"px"}{let e;e=p[l]?u.y[l]:(l="center",u.intermediateY),n.style.top=e+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===l?l:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let E=!1,L=0;function O(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,E=!1},400),E=!0}function S(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e),o=n?n.removeManual.bind(n,e):e.removeEventListener.bind(e);if(c.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const a={capture:!0},r=()=>{clearTimeout(n),o("touchmove",r,a),o("touchend",r,a),o("touchcancel",r,a)};i("touchstart",o=>{o.touches.length>1?r():(i("touchmove",r,a),i("touchend",r,a),i("touchcancel",r,a),n=window.setTimeout(()=>{E?r():(t(o.touches[0]),r(),f&&e.addEventListener("touchend",s.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{t(n),f&&e.addEventListener("touchend",s.a,{once:!0})}:t)}},50:function(e,t,n){"use strict";var i=n(29),s=n(0),o=n(43),a=n(7),r=n(5),c=n(41),d=n(72);const l=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(o.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!e,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(d.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",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||Object(a.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){Object(c.e)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===e&&(this.navigations.splice(n,1),t))break}}};i.a.appNavigationController=l,t.a=l},52:function(e,t,n){"use strict";function i(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)}n.d(t,"a",(function(){return i}))},60:function(e,t,n){"use strict";var i=n(42),s=n(46),o=n(29),a=n(61);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=Object(s.a)()),void 0!==t&&n.then(()=>t()),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=Object(a.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&n.then(()=>t()),n}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};o.a&&(o.a.sequentialDom=r),t.a=r},70:function(e,t,n){"use strict";var i=n(29),s=n(67),o=n(33);const a=new class{constructor(){this.serverTimeOffset=0,s.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),o.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=a),t.a=a},72:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(0);function s(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},76:function(e,t,n){"use strict";function i(e){const t=e.length,n=new Array(t);for(let i=0;i>>t&24),2!==t&&i-o!=1||(n+=String.fromCharCode(a(s>>>18&63),a(s>>>12&63),a(s>>>6&63),a(63&s)),s=0);return n.replace(/A(?=A$|$)/g,"=")}function a(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function r(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ie+(t.byteLength||t.length),0),n=new Uint8Array(t);let i=0;return e.forEach(e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),n}n.d(t,"e",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"d",(function(){return o})),n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return c}))},94:function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var i=n(5),s=n(30),o=n(9),a=n(16),r=n(33),c=n(15),d=n(34),l=n(35);let u,h=!1;function p(e){h||(u||(u=r.a.getConfig().then(e=>e.suggested_lang_code!==a.default.lastRequestedLangCode?Promise.all([e,a.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),a.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const r=[];n.forEach(e=>{const t=a.default.strings.get(e.key);t&&(r.push(t),a.default.strings.set(e.key,e))});const u=Object(d.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(o.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),c.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),r.forEach(e=>{a.default.strings.set(e.key,e)}),Object(s.b)(u,e=>{Object(i.a)(e),h=!0,u.disabled=!0,Object(l.f)(u),a.default.getLangPack(t.suggested_lang_code)})})}}}]); +//# sourceMappingURL=17.be8ba8da5cf5a29471fb.chunk.js.map \ No newline at end of file diff --git a/public/17.be8ba8da5cf5a29471fb.chunk.js.map b/public/17.be8ba8da5cf5a29471fb.chunk.js.map new file mode 100644 index 000000000..35d5293fe --- /dev/null +++ b/public/17.be8ba8da5cf5a29471fb.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/components/languageChangeButton.ts"],"names":["rippleClickId","ripple","elem","callback","Promise","resolve","onEnd","prepend","querySelector","classList","add","r","document","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","remove","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","append","isRippleUnneeded","e","target","includes","tagName","touchEnd","addEventListener","settings","animationsEnabled","touches","length","once","cancelBubble","stopPropagation","passive","button","dataset","cachedPromise","page","imageDiv","pageEl","preloader","inputWrapper","btnBack","text","container","parentElement","h4","helpList","forEach","key","li","then","m","default","mount","stop","QRCodeStyling","all","prevToken","options","ignoreErrors","iterate","isLoop","loginToken","invokeApi","api_id","id","api_hash","hash","except_ids","_","dcId","dc_id","setBaseDcId","token","authorization","setUser","user","url","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","type","reader","FileReader","onload","result","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","_canvas","_image","animation","c","children","display","undefined","Array","from","slice","el","timestamp","diff","expires","serverTimeOffset","err","console","warn","handled","error","func","pushToState","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","className","asDiv","icon","noRipple","rippleSquare","onlyMobile","disabled","setAttribute","putPreloader","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","removeAttribute","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","isMobile","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","clearTimeout","attachContextMenuListener","element","removeManual","timeout","capture","onCancel","appNavigationController","navigations","manual","log","debug","currentHash","location","isPossibleSwipe","this","onHashChange","replaceState","state","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","good","noBlurOnPop","i","index","ret","findItemByType","backByItem","indexOf","splice","push","noHistory","origin","pathname","single","simulateEvent","name","event","Event","bubbles","cancelable","sequentialDom","promises","raf","scheduled","kind","scheduleFlush","do","read","write","serverTimeManager","get","to","addTaskListener","task","payload","isSwipingBackSafari","TouchEvent","bytesToHex","bytes","arr","toString","join","bytesFromHex","hexString","len","Uint8Array","ceil","start","parseInt","charAt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","String","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","bufferConcats","args","reduce","acc","v","byteLength","tmp","lastLength","b","set","ArrayBuffer","getLanguageChangeButton","appendTo","getConfig","config","suggested_lang_code","lastRequestedLangCode","getStrings","getCacheLangPack","strings","backup","string","backupString","btnChangeLanguage","getLangPack"],"mappings":"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","file":"17.be8ba8da5cf5a29471fb.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.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 elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.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(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport { bytesCmp, bytesToBase64 } from '../helpers/bytes';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport { pause } from '../helpers/schedulers/pause';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + encoded.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/\\=+$/, \"\");\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nconst Button = (className: string, options: 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 const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\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' | 'global-search' | 'voice',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n 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","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } 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 promise = isInDOM(element) ? this.mutate() : Promise.resolve();\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 private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\n * 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\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().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"],"sourceRoot":""} \ No newline at end of file diff --git a/public/17.e503493b3028be8a4735.chunk.js.map b/public/17.e503493b3028be8a4735.chunk.js.map deleted file mode 100644 index cf0dc6019..000000000 --- a/public/17.e503493b3028be8a4735.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/components/languageChangeButton.ts"],"names":["rippleClickId","ripple","elem","callback","Promise","resolve","onEnd","prepend","querySelector","classList","add","r","document","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","remove","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","append","isRippleUnneeded","e","target","includes","tagName","touchEnd","addEventListener","settings","animationsEnabled","touches","length","once","cancelBubble","stopPropagation","passive","button","dataset","cachedPromise","page","imageDiv","pageEl","preloader","inputWrapper","btnBack","text","container","parentElement","h4","helpList","forEach","key","li","then","m","default","mount","stop","QRCodeStyling","all","prevToken","options","ignoreErrors","iterate","isLoop","loginToken","invokeApi","api_id","id","api_hash","hash","except_ids","_","dcId","dc_id","setBaseDcId","token","authorization","setUser","user","url","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","type","reader","FileReader","onload","result","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","_canvas","_image","animation","c","children","display","undefined","Array","from","slice","el","timestamp","diff","expires","serverTimeOffset","err","console","warn","handled","error","func","pushToState","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","className","asDiv","icon","noRipple","rippleSquare","onlyMobile","disabled","setAttribute","putPreloader","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","removeAttribute","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","isMobile","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","clearTimeout","attachContextMenuListener","element","removeManual","timeout","capture","onCancel","appNavigationController","navigations","manual","log","debug","currentHash","location","isPossibleSwipe","this","onHashChange","replaceState","state","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","good","noBlurOnPop","i","index","ret","findItemByType","splice","push","noHistory","origin","pathname","single","simulateEvent","name","event","Event","bubbles","cancelable","sequentialDom","promises","raf","scheduled","kind","scheduleFlush","do","read","write","serverTimeManager","get","to","addTaskListener","task","payload","isSwipingBackSafari","TouchEvent","bytesToHex","bytes","arr","toString","join","bytesFromHex","hexString","len","Uint8Array","ceil","start","parseInt","charAt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","String","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","bufferConcats","args","reduce","acc","v","byteLength","tmp","lastLength","b","set","ArrayBuffer","getLanguageChangeButton","appendTo","getConfig","config","suggested_lang_code","lastRequestedLangCode","getStrings","getCacheLangPack","strings","backup","string","backupString","btnChangeLanguage","getLangPack"],"mappings":"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","file":"17.e503493b3028be8a4735.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.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 elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.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(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport { bytesCmp, bytesToBase64 } from '../helpers/bytes';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport { pause } from '../helpers/schedulers/pause';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + encoded.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/\\=+$/, \"\");\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nconst Button = (className: string, options: 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 const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\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' | 'global-search' | 'voice',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(ret.index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(ret.index, 1);\r\n this.handleItem(ret.item);\r\n return;\r\n //}\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n 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","export default function simulateEvent(elem: HTMLElement, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } 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 promise = isInDOM(element) ? this.mutate() : Promise.resolve();\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 private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\n * 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\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().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"],"sourceRoot":""} \ No newline at end of file diff --git a/public/18.587a0b097be84c2c4267.chunk.js b/public/18.587a0b097be84c2c4267.chunk.js new file mode 100644 index 000000000..2077291ca --- /dev/null +++ b/public/18.587a0b097be84c2c4267.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[18,20],{15:function(e,t,s){"use strict";s.r(t),s.d(t,"RootScope",(function(){return o}));var i=s(45),n=s(54),r=s(29);class o extends n.a{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",e=>{this.peerId=e,document.body.classList.toggle("has-chat",!!e)}),this.addEventListener("user_auth",({id:e})=>{this.myId="number"==typeof i.b?+e:""+e}),this.addEventListener("connection_status_change",e=>{this.connectionStatus[e.name]=e}),this.addEventListener("idle",e=>{e?this.idle.focusPromise=new Promise(e=>{this.idle.focusResolve=e}):this.idle.focusResolve()})}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",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(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()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find(t=>t.name===e)}}const c=new o;r.a.rootScope=c,t.default=c},18:function(e,t,s){"use strict";s.r(t),s.d(t,"ripple",(function(){return l}));var i=s(6),n=s(60),r=s(1),o=s(15);let c=0;function l(e,t=(()=>Promise.resolve()),s=null,l=!1){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let a=document.createElement("div");a.classList.add("c-ripple");let u;e.classList.contains("rp-square")&&a.classList.add("is-square"),e[l?"prepend":"append"](a);const d=(e,i)=>{const o=Date.now(),l=document.createElement("div"),d=c++,h=1e3*+window.getComputedStyle(a).getPropertyValue("--ripple-duration").replace("s","");u=()=>{let e=Date.now()-o;const t=()=>{n.a.mutate(()=>{l.remove()}),s&&s(d)};if(el.classList.add("hiding"),Math.max(s-h/2,0)),setTimeout(t,s)}else l.classList.add("hiding"),setTimeout(t,h/2);r.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",u),u=null,m=!1},t&&t(d),window.requestAnimationFrame(()=>{const t=a.getBoundingClientRect();l.classList.add("c-ripple__circle");const s=e-t.left,n=i-t.top,r=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(s-t.width/2)+t.width/2,2)),o=s-r/2,c=n-r/2;l.style.width=l.style.height=r+"px",l.style.left=o+"px",l.style.top=c+"px",a.append(l)})},h=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==a);let m=!1;if(r.IS_TOUCH_SUPPORTED){let t=()=>{u&&u()};e.addEventListener("touchstart",s=>{if(!o.default.settings.animationsEnabled)return;if(s.touches.length>1||m||h(s))return;m=!0;let{clientX:i,clientY:n}=s.touches[0];d(i,n),e.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",s=>{s.cancelBubble=!0,s.stopPropagation(),t(),e.removeEventListener("touchend",t)},{once:!0})},{passive:!0})}else e.addEventListener("mousedown",t=>{if(![0,2].includes(t.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===e.dataset.ripple||h(t))return;if(m)return void(m=!1);let{clientX:s,clientY:i}=t;d(s,i),window.addEventListener("mouseup",u,{once:!0,passive:!0}),window.addEventListener("contextmenu",u,{once:!0,passive:!0})},{passive:!0})}},29:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));const i=s(77).a.debug,n="undefined"!=typeof window?window:self;t.b=i},42:function(e,t,s){"use strict";let i;function n(e){i?i.push(e):(i=[e],requestAnimationFrame(()=>{const e=i;i=void 0,e.forEach(e=>e())}))}s.d(t,"b",(function(){return n})),s.d(t,"c",(function(){return l})),s.d(t,"d",(function(){return a})),s.d(t,"a",(function(){return u}));let r,o,c=!1;function l(e){r?c?e():r.push(e):(r=[e],requestAnimationFrame(()=>{c=!0;for(let e=0;e{o=void 0}),o)}function u(){return new Promise(e=>{n(()=>{n(e)})})}},45:function(e,t,s){"use strict";s.d(t,"b",(function(){return i})),s.d(t,"c",(function(){return n})),s.d(t,"d",(function(){return r})),s.d(t,"a",(function(){return o}));const i=0,n=1271266957,r=777e3,o=2147483647},46:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(81);function n(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((s,i)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,s(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,i(...e))}});return t.catch(i.a).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}},54:function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));class i{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,s){var i,n;(null!==(i=this.listeners[e])&&void 0!==i?i:this.listeners[e]=[]).push({callback:t,options:s}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(n=s)||void 0===n?void 0:n.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,s){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}dispatchEvent(e,...t){this.reuseResults&&(this.listenerResults[e]=t);const s=[],i=this.listeners[e];if(i){i.slice().forEach(n=>{var r;-1!==i.findIndex(e=>e.callback===n.callback)&&(s.push(n.callback(...t)),(null===(r=n.options)||void 0===r?void 0:r.once)&&this.removeEventListener(e,n.callback))})}return s}cleanup(){this.listeners={},this.listenerResults={}}}},60:function(e,t,s){"use strict";var i=s(42),n=s(46),r=s(29),o=s(61);const c=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let s=this.promises[e];return s||(this.scheduleFlush(),s=this.promises[e]=Object(n.a)()),void 0!==t&&s.then(()=>t()),s}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const s=Object(o.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&s.then(()=>t()),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};r.a&&(r.a.sequentialDom=c),t.a=c},61:function(e,t,s){"use strict";function i(e){return null==e?void 0:e.isConnected}s.d(t,"a",(function(){return i}))},77:function(e,t,s){"use strict";const i={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1};t.a=i},81:function(e,t,s){"use strict";function i(){}s.d(t,"a",(function(){return i}))}}]); +//# sourceMappingURL=18.587a0b097be84c2c4267.chunk.js.map \ No newline at end of file diff --git a/public/18.587a0b097be84c2c4267.chunk.js.map b/public/18.587a0b097be84c2c4267.chunk.js.map new file mode 100644 index 000000000..7de4fefdc --- /dev/null +++ b/public/18.587a0b097be84c2c4267.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/lib/rootScope.ts","webpack:///./src/components/ripple.ts","webpack:///./src/config/debug.ts","webpack:///./src/helpers/schedulers.ts","webpack:///./src/lib/mtproto/mtproto_config.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/isInDOM.ts","webpack:///./src/config/modes.ts","webpack:///./src/helpers/noop.ts"],"names":["RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","Promise","resolve","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","this","addEventListener","peerId","document","body","classList","toggle","id","myId","status","name","undefined","_themeColorElem","head","querySelector","color","themeColor","isNight","themeColorElem","setAttribute","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","err","colorScheme","documentElement","setThemeColor","value","isOverlayActive","getTheme","settings","theme","themes","find","t","rootScope","rippleClickId","ripple","elem","callback","onEnd","prepend","add","r","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","remove","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","append","isRippleUnneeded","e","target","includes","tagName","touchEnd","animationsEnabled","touches","length","once","cancelBubble","stopPropagation","passive","button","dataset","DEBUG","debug","MOUNT_CLASS_TO","self","fastRafCallbacks","fastRaf","push","currentCallbacks","forEach","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","i","fastRafPromise","then","doubleRaf","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","args","lastNotify","listeners","addNotifyListener","deferred","reject","catch","finally","cancel","Object","assign","EventListenerBase","reuseResults","_constructor","listenerResults","options","hasOwnProperty","pop","obj","findAndSplice","l","arr","slice","listener","findIndex","sequentialDom","promises","raf","bind","scheduled","kind","promise","scheduleFlush","do","element","read","write","isInDOM","isConnected","Modes","test","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker","noop"],"mappings":"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","file":"18.587a0b097be84c2c4267.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId, GroupCallInstance, GroupCallOutputSource } from \"./appManagers/appGroupCallsManager\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_views': {peerId: PeerId, mid: number, views: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number},\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_mount': void,\n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_state': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n 'group_call_pinned': {instance: GroupCallInstance, source?: GroupCallOutputSource}\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\n \n}); */\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport 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\n\r\nlet rippleClickId = 0;\r\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n elem.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n elem.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 elem.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n elem.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(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * 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(requestAnimationFrame);\r\n rafPromise.then(() => {\r\n rafPromise = undefined;\r\n });\r\n\r\n return rafPromise;\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}","/*\r\n * https://github.com/morethanwords/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\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\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase> {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = [];\r\n\r\n /* let a = e.wm.get(this)[name];\r\n if(!a) return arr;\r\n const listeners = [...a]; */\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 arr.push(listener.callback(...args));\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n\r\n /* for(let i = 0, length = listeners.length; i < length; ++i) {\r\n const listener = listeners[i];\r\n arr.push(listener.callback(...args));\r\n\r\n if(listener.once) {\r\n listeners.splice(i, 1);\r\n --i;\r\n --length;\r\n }\r\n } */\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } 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 promise = isInDOM(element) ? this.mutate() : Promise.resolve();\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 private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * 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 * 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\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false, //location.search.indexOf('http=1') > 0,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false\r\n};\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","export default function noop() {}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/18.781d3d503cc3c4f5b47e.chunk.js b/public/18.781d3d503cc3c4f5b47e.chunk.js deleted file mode 100644 index f45c91e21..000000000 --- a/public/18.781d3d503cc3c4f5b47e.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[18,20],{15:function(e,t,s){"use strict";s.r(t),s.d(t,"RootScope",(function(){return o}));var i=s(46),n=s(56),r=s(29);class o extends n.a{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",e=>{this.peerId=e}),this.addEventListener("user_auth",({id:e})=>{this.myId="number"==typeof i.b?+e:""+e}),this.addEventListener("connection_status_change",e=>{this.connectionStatus[e.name]=e}),this.addEventListener("idle",e=>{e?this.idle.focusPromise=new Promise(e=>{this.idle.focusResolve=e}):this.idle.focusResolve()})}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",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(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()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find(t=>t.name===e)}}const c=new o;r.a.rootScope=c,t.default=c},18:function(e,t,s){"use strict";s.r(t),s.d(t,"ripple",(function(){return l}));var i=s(6),n=s(58),r=s(1),o=s(15);let c=0;function l(e,t=(()=>Promise.resolve()),s=null,l=!1){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let a=document.createElement("div");a.classList.add("c-ripple");let u;e.classList.contains("rp-square")&&a.classList.add("is-square"),e[l?"prepend":"append"](a);const d=(e,i)=>{const o=Date.now(),l=document.createElement("div"),d=c++,h=1e3*+window.getComputedStyle(a).getPropertyValue("--ripple-duration").replace("s","");u=()=>{let e=Date.now()-o;const t=()=>{n.a.mutate(()=>{l.remove()}),s&&s(d)};if(el.classList.add("hiding"),Math.max(s-h/2,0)),setTimeout(t,s)}else l.classList.add("hiding"),setTimeout(t,h/2);r.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",u),u=null,m=!1},t&&t(d),window.requestAnimationFrame(()=>{const t=a.getBoundingClientRect();l.classList.add("c-ripple__circle");const s=e-t.left,n=i-t.top,r=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(s-t.width/2)+t.width/2,2)),o=s-r/2,c=n-r/2;l.style.width=l.style.height=r+"px",l.style.left=o+"px",l.style.top=c+"px",a.append(l)})},h=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==a);let m=!1;if(r.IS_TOUCH_SUPPORTED){let t=()=>{u&&u()};e.addEventListener("touchstart",s=>{if(!o.default.settings.animationsEnabled)return;if(s.touches.length>1||m||h(s))return;m=!0;let{clientX:i,clientY:n}=s.touches[0];d(i,n),e.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",s=>{s.cancelBubble=!0,s.stopPropagation(),t(),e.removeEventListener("touchend",t)},{once:!0})},{passive:!0})}else e.addEventListener("mousedown",t=>{if(![0,2].includes(t.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===e.dataset.ripple||h(t))return;if(m)return void(m=!1);let{clientX:s,clientY:i}=t;d(s,i),window.addEventListener("mouseup",u,{once:!0,passive:!0}),window.addEventListener("contextmenu",u,{once:!0,passive:!0})},{passive:!0})}},29:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));const i=s(76).a.debug,n="undefined"!=typeof window?window:self;t.b=i},41:function(e,t,s){"use strict";let i;function n(e){i?i.push(e):(i=[e],requestAnimationFrame(()=>{const e=i;i=void 0,e.forEach(e=>e())}))}s.d(t,"b",(function(){return n})),s.d(t,"c",(function(){return l})),s.d(t,"d",(function(){return a})),s.d(t,"a",(function(){return u}));let r,o,c=!1;function l(e){r?c?e():r.push(e):(r=[e],requestAnimationFrame(()=>{c=!0;for(let e=0;e{o=void 0}),o)}function u(){return new Promise(e=>{n(()=>{n(e)})})}},45:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(99);function n(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((s,i)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,s(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,i(...e))}});return t.catch(i.a).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}},46:function(e,t,s){"use strict";s.d(t,"b",(function(){return i})),s.d(t,"c",(function(){return n})),s.d(t,"d",(function(){return r})),s.d(t,"a",(function(){return o}));const i=0,n=1271266957,r=777e3,o=2147483647},56:function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));class i{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,s){var i,n;(null!==(i=this.listeners[e])&&void 0!==i?i:this.listeners[e]=[]).push({callback:t,options:s}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(n=s)||void 0===n?void 0:n.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,s){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}dispatchEvent(e,...t){this.reuseResults&&(this.listenerResults[e]=t);const s=[],i=this.listeners[e];if(i){i.slice().forEach(n=>{var r;-1!==i.findIndex(e=>e.callback===n.callback)&&(s.push(n.callback(...t)),(null===(r=n.options)||void 0===r?void 0:r.once)&&this.removeEventListener(e,n.callback))})}return s}cleanup(){this.listeners={},this.listenerResults={}}}},58:function(e,t,s){"use strict";var i=s(41),n=s(45),r=s(29),o=s(60);const c=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let s=this.promises[e];return s||(this.scheduleFlush(),s=this.promises[e]=Object(n.a)()),void 0!==t&&s.then(()=>t()),s}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const s=Object(o.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&s.then(()=>t()),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};r.a&&(r.a.sequentialDom=c),t.a=c},60:function(e,t,s){"use strict";function i(e){return null==e?void 0:e.isConnected}s.d(t,"a",(function(){return i}))},76:function(e,t,s){"use strict";const i={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1};t.a=i},99:function(e,t,s){"use strict";function i(){}s.d(t,"a",(function(){return i}))}}]); -//# sourceMappingURL=18.781d3d503cc3c4f5b47e.chunk.js.map \ No newline at end of file diff --git a/public/18.781d3d503cc3c4f5b47e.chunk.js.map b/public/18.781d3d503cc3c4f5b47e.chunk.js.map deleted file mode 100644 index 9b0a21c81..000000000 --- a/public/18.781d3d503cc3c4f5b47e.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///18.7e5208c5f212e0e6a5a8.chunk.js"],"names":["this","push","15","module","__webpack_exports__","__webpack_require__","r","d","RootScope","_mtproto_mtproto_config__WEBPACK_IMPORTED_MODULE_0__","_helpers_eventListenerBase__WEBPACK_IMPORTED_MODULE_1__","_config_debug__WEBPACK_IMPORTED_MODULE_2__","[object Object]","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","Promise","resolve","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","addEventListener","peerId","id","myId","status","name","themeColorElem","undefined","_themeColorElem","document","head","querySelector","color","themeColor","isNight","setAttribute","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","err","colorScheme","documentElement","classList","toggle","setThemeColor","isOverlayActive","value","getTheme","settings","theme","themes","find","t","rootScope","18","ripple","_helpers_dom_findUpClassName__WEBPACK_IMPORTED_MODULE_0__","_helpers_sequentialDom__WEBPACK_IMPORTED_MODULE_1__","_environment_touchSupport__WEBPACK_IMPORTED_MODULE_2__","_lib_rootScope__WEBPACK_IMPORTED_MODULE_3__","rippleClickId","elem","callback","onEnd","prepend","add","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","remove","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","pow","abs","height","width","x","y","style","append","isRippleUnneeded","e","target","includes","tagName","Object","touchEnd","animationsEnabled","touches","length","once","cancelBubble","stopPropagation","passive","button","dataset","29","MOUNT_CLASS_TO","DEBUG","debug","self","41","fastRafCallbacks","fastRaf","currentCallbacks","forEach","fastRafConventional","fastRafPromise","doubleRaf","fastRafConventionalCallbacks","rafPromise","processing","i","then","45","deferredPromise","_noop__WEBPACK_IMPORTED_MODULE_0__","deferredHelper","isFulfilled","isRejected","notify","notifyAll","args","lastNotify","listeners","addNotifyListener","deferred","reject","catch","finally","cancel","assign","46","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","56","EventListenerBase","reuseResults","_constructor","listenerResults","options","_a","_b","hasOwnProperty","pop","obj","findAndSplice","l","arr","slice","listener","findIndex","58","_schedulers__WEBPACK_IMPORTED_MODULE_0__","_cancellablePromise__WEBPACK_IMPORTED_MODULE_1__","_dom_isInDOM__WEBPACK_IMPORTED_MODULE_3__","sequentialDom","promises","raf","bind","scheduled","kind","promise","scheduleFlush","do","element","read","write","60","isInDOM","isConnected","76","Modes","test","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker","99","noop"],"mappings":"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","file":"18.781d3d503cc3c4f5b47e.chunk.js","sourceRoot":""} \ No newline at end of file diff --git a/public/19.96f69841477e2045dbd5.chunk.js b/public/19.96f69841477e2045dbd5.chunk.js deleted file mode 100644 index 42b39e31c..000000000 --- a/public/19.96f69841477e2045dbd5.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[19],{101:function(t,e,i){"use strict";i.d(e,"a",(function(){return n}));var s=i(51);class n{constructor(t,e){this.passwordInputField=t,this.size=e,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.b.loadAnimationFromURL({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"assets/img/TwoFactorSetupMonkeyPeek.tgs").then(t=>(this.animation=t,this.animation.addEventListener("enterFrame",t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.b.waitForFirstFrame(t)))}remove(){this.animation&&this.animation.remove()}}},21:function(t,e,i){"use strict";i.r(e);var s=i(35),n=i(37),a=i(17),r=i(78),o=i(62),c=i(33),l=i(93),d=i(101),p=i(31),u=i(16),h=i(89),m=i(5),w=i(30),b=i(94),g=i(36),v=i(59);let y;const k=new o.a("page-password",!0,()=>{const t=new h.a({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=Object(c.a)("btn-primary btn-color-primary"),a=new u.default.IntlElement({key:"Login.Next"});e.append(a.element);const o=new l.a({label:"LoginPassword",name:"password"});let k;y=o.input,t.inputWrapper.append(o.container,e);let P,f=()=>(k||(k=window.setInterval(f,1e4)),r.a.getState().then(t=>{P=t,P.hint?Object(g.a)(o.label,Object(b.a)(p.b.wrapEmojiText(P.hint))):o.setLabel()}));const L=t=>{if(t&&Object(m.a)(t),!y.value.length)return void y.classList.add("error");const n=Object(v.a)([y,e],!0);let c=y.value;a.update({key:"PleaseWait"});const l=Object(s.f)(e);r.a.check(c,P).then(t=>{switch(t._){case"auth.authorization":clearInterval(k),i.e(4).then(i.bind(null,19)).then(t=>{t.default.mount()}),S&&S.remove();break;default:e.removeAttribute("disabled"),a.update({key:t._}),l.remove()}}).catch(t=>{n(),o.input.classList.add("error"),t.type,a.update({key:"PASSWORD_HASH_INVALID"}),y.select(),l.remove(),f()})};Object(w.b)(e,L),y.addEventListener("keypress",(function(t){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===t.key)return L()}));const E=n.b.isMobile?100:166,S=new d.a(o,E);return t.imageDiv.append(S.container),Promise.all([S.load(),f()])},null,()=>{y.focus(),a.default.pushToState("authState",{_:"authStatePassword"})});e.default=k},78:function(t,e,i){"use strict";var s=i(29),n=i(32);const a=new class{getState(){return n.a.invokeApi("account.getPassword").then(t=>t)}updateSettings(t={}){return this.getState().then(e=>{let i,s;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:t.hint,email:t.email}};i=t.currentPassword?n.a.invokeCrypto("computeSRP",t.currentPassword,e,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const r=e.new_algo,o=new Uint8Array(r.salt1.length+32);return o.randomize(),o.set(r.salt1,0),r.salt1=o,s=t.newPassword?n.a.invokeCrypto("computeSRP",t.newPassword,e,!0):Promise.resolve(new Uint8Array),Promise.all([i,s]).then(t=>(a.password=t[0],a.new_settings.new_algo=r,a.new_settings.new_password_hash=t[1],n.a.invokeApi("account.updatePasswordSettings",a)))})}check(t,e,i={}){return n.a.invokeCrypto("computeSRP",t,e,!1).then(t=>n.a.invokeApi("auth.checkPassword",{password:t},i).then(t=>("auth.authorization"===t._&&n.a.setUser(t.user),t)))}confirmPasswordEmail(t){return n.a.invokeApi("account.confirmPasswordEmail",{code:t})}resendPasswordEmail(){return n.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return n.a.invokeApi("account.cancelPasswordEmail")}};s.a.passwordManager=a,e.a=a},89:function(t,e,i){"use strict";i.d(e,"a",(function(){return n}));var s=i(16);class n{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(s.i18n)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(s.i18n)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},93:function(t,e,i){"use strict";i.d(e,"a",(function(){return a}));var s=i(5),n=i(38);class a extends n.b{constructor(t={}){super(Object.assign({plainText:!0},t)),this.passwordVisible=!1,this.onVisibilityClick=t=>{Object(s.a)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},94:function(t,e,i){"use strict";function s(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return s}))}}]); -//# sourceMappingURL=19.96f69841477e2045dbd5.chunk.js.map \ No newline at end of file diff --git a/public/19.96f69841477e2045dbd5.chunk.js.map b/public/19.96f69841477e2045dbd5.chunk.js.map deleted file mode 100644 index b82c686cd..000000000 --- a/public/19.96f69841477e2045dbd5.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/monkeys/password.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["PasswordMonkey","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","loadPromise","loadAnimationFromURL","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","waitForFirstFrame","remove","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","append","element","label","name","getStateInterval","input","inputWrapper","state","getState","window","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","e","value","length","toggle","update","preloader","check","response","_","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","type","select","isMobile","imageDiv","Promise","all","load","focus","pushToState","passwordManager","invokeApi","result","settings","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","resolve","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","hashes","new_password_hash","options","inputCheckPassword","auth","setUser","user","code","LoginPage","body","querySelector","title","subtitle","PasswordInputField","super","plainText","onVisibilityClick","toggleVisible","setAttribute","autocomplete","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","htmlToSpan","html","span","innerHTML"],"mappings":"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","file":"19.96f69841477e2045dbd5.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\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: Promise;\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.loadAnimationFromURL({\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 }, 'assets/img/TwoFactorSetupMonkeyPeek.tgs').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n /* input.readOnly = true;\r\n\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true}); */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/19.f2e6785986f5892e804d.chunk.js b/public/19.f2e6785986f5892e804d.chunk.js new file mode 100644 index 000000000..fef8d6a20 --- /dev/null +++ b/public/19.f2e6785986f5892e804d.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[19],{101:function(t,e,i){"use strict";i.d(e,"a",(function(){return n}));var s=i(51);class n{constructor(t,e){this.passwordInputField=t,this.size=e,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then(t=>(this.animation=t,this.animation.addEventListener("enterFrame",t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.a.waitForFirstFrame(t)))}remove(){this.animation&&this.animation.remove()}}},21:function(t,e,i){"use strict";i.r(e);var s=i(35),n=i(37),a=i(17),r=i(79),o=i(64),c=i(34),l=i(95),d=i(101),p=i(31),u=i(16),h=i(91),m=i(5),w=i(30),b=i(96),g=i(36),v=i(58);let y;const k=new o.a("page-password",!0,()=>{const t=new h.a({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=Object(c.a)("btn-primary btn-color-primary"),a=new u.default.IntlElement({key:"Login.Next"});e.append(a.element);const o=new l.a({label:"LoginPassword",name:"password"});let k;y=o.input,t.inputWrapper.append(o.container,e);let P,f=()=>(k||(k=window.setInterval(f,1e4)),r.a.getState().then(t=>{P=t,P.hint?Object(g.a)(o.label,Object(b.a)(p.b.wrapEmojiText(P.hint))):o.setLabel()}));const L=t=>{if(t&&Object(m.a)(t),!y.value.length)return void y.classList.add("error");const n=Object(v.a)([y,e],!0);let c=y.value;a.update({key:"PleaseWait"});const l=Object(s.f)(e);r.a.check(c,P).then(t=>{switch(t._){case"auth.authorization":clearInterval(k),i.e(4).then(i.bind(null,19)).then(t=>{t.default.mount()}),S&&S.remove();break;default:e.removeAttribute("disabled"),a.update({key:t._}),l.remove()}}).catch(t=>{n(),o.input.classList.add("error"),t.type,a.update({key:"PASSWORD_HASH_INVALID"}),y.select(),l.remove(),f()})};Object(w.b)(e,L),y.addEventListener("keypress",(function(t){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===t.key)return L()}));const E=n.b.isMobile?100:166,S=new d.a(o,E);return t.imageDiv.append(S.container),Promise.all([S.load(),f()])},null,()=>{y.focus(),a.default.pushToState("authState",{_:"authStatePassword"})});e.default=k},79:function(t,e,i){"use strict";var s=i(29),n=i(33);const a=new class{getState(){return n.a.invokeApi("account.getPassword").then(t=>t)}updateSettings(t={}){return this.getState().then(e=>{let i,s;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:t.hint,email:t.email}};i=t.currentPassword?n.a.invokeCrypto("computeSRP",t.currentPassword,e,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const r=e.new_algo,o=new Uint8Array(r.salt1.length+32);return o.randomize(),o.set(r.salt1,0),r.salt1=o,s=t.newPassword?n.a.invokeCrypto("computeSRP",t.newPassword,e,!0):Promise.resolve(new Uint8Array),Promise.all([i,s]).then(t=>(a.password=t[0],a.new_settings.new_algo=r,a.new_settings.new_password_hash=t[1],n.a.invokeApi("account.updatePasswordSettings",a)))})}check(t,e,i={}){return n.a.invokeCrypto("computeSRP",t,e,!1).then(t=>n.a.invokeApi("auth.checkPassword",{password:t},i).then(t=>("auth.authorization"===t._&&n.a.setUser(t.user),t)))}confirmPasswordEmail(t){return n.a.invokeApi("account.confirmPasswordEmail",{code:t})}resendPasswordEmail(){return n.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return n.a.invokeApi("account.cancelPasswordEmail")}};s.a.passwordManager=a,e.a=a},91:function(t,e,i){"use strict";i.d(e,"a",(function(){return n}));var s=i(16);class n{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(s.i18n)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(s.i18n)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},95:function(t,e,i){"use strict";i.d(e,"a",(function(){return a}));var s=i(5),n=i(38);class a extends n.b{constructor(t={}){super(Object.assign({plainText:!0},t)),this.passwordVisible=!1,this.onVisibilityClick=t=>{Object(s.a)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},96:function(t,e,i){"use strict";function s(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return s}))}}]); +//# sourceMappingURL=19.f2e6785986f5892e804d.chunk.js.map \ No newline at end of file diff --git a/public/19.f2e6785986f5892e804d.chunk.js.map b/public/19.f2e6785986f5892e804d.chunk.js.map new file mode 100644 index 000000000..89abfabb1 --- /dev/null +++ b/public/19.f2e6785986f5892e804d.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/monkeys/password.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["PasswordMonkey","passwordInputField","size","needFrame","this","container","document","createElement","classList","add","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","addEventListener","currentFrame","direction","setSpeed","pause","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","play","waitForFirstFrame","remove","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","append","element","label","name","getStateInterval","input","inputWrapper","state","getState","window","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","e","value","length","toggle","update","preloader","check","response","_","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","type","select","isMobile","imageDiv","Promise","all","load","focus","pushToState","passwordManager","invokeApi","result","settings","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","resolve","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","hashes","new_password_hash","options","inputCheckPassword","auth","setUser","user","code","LoginPage","body","querySelector","title","subtitle","PasswordInputField","super","plainText","onVisibilityClick","toggleVisible","setAttribute","autocomplete","stealthy","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","htmlToSpan","html","span","innerHTML"],"mappings":"uFAAA,8CAUe,MAAMA,EAMnB,YAAsBC,EAAkDC,GAAlD,KAAAD,qBAAkD,KAAAC,OAHjE,KAAAC,UAAY,EAIjBC,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAUG,UAAUC,IAAI,yBAGxB,OACL,OAAGL,KAAKM,YAAoBN,KAAKM,YAC1BN,KAAKM,YAAc,IAAaC,qBAAqB,CAC1DN,UAAWD,KAAKC,UAChBO,MAAM,EACNC,UAAU,EACVC,MAAOV,KAAKF,KACZa,OAAQX,KAAKF,KACbc,SAAS,GAER,4BAA4BC,KAAKC,IAElCd,KAAKe,UAAYD,EACjBd,KAAKe,UAAUC,iBAAiB,aAAcC,KAGX,IAA7BjB,KAAKe,UAAUG,WAAmBD,GAAgBjB,KAAKD,YAC1B,IAA9BC,KAAKe,UAAUG,WAAoBD,GAAgBjB,KAAKD,aACvDC,KAAKe,UAAUI,SAAS,GACxBnB,KAAKe,UAAUK,WAIrBpB,KAAKH,mBAAmBwB,4BAA8B,KACjDrB,KAAKH,mBAAmByB,iBACzBtB,KAAKe,UAAUQ,aAAa,GAC5BvB,KAAKe,UAAUS,SAAW,EAC1BxB,KAAKD,UAAY,GACjBC,KAAKe,UAAUU,SAEfzB,KAAKe,UAAUQ,cAAc,GAC7BvB,KAAKe,UAAUS,SAAW,GAC1BxB,KAAKD,UAAY,EACjBC,KAAKe,UAAUU,SAIZ,IAAaC,kBAAkBZ,KAInC,SACFd,KAAKe,WACNf,KAAKe,UAAUY,Y,gCChErB,2IAyBA,IAAIC,EAoHJ,MAAMC,EAAO,IAAI,IAAK,iBAAiB,EAlHpB,KACjB,MAAMA,EAAO,IAAI,IAAU,CACzBC,UAAW,gBACXC,kBAAkB,EAClBC,aAAc,uBACdC,gBAAiB,4BAGbC,EAAU,YAAO,iCACjBC,EAAc,IAAI,UAAKC,YAAY,CAACC,IAAK,eAE/CH,EAAQI,OAAOH,EAAYI,SAE3B,MAAM1C,EAAqB,IAAI,IAAmB,CAChD2C,MAAO,gBACPC,KAAM,aAOR,IAAIC,EAJJd,EAAgB/B,EAAmB8C,MAEnCd,EAAKe,aAAaN,OAAOzC,EAAmBI,UAAWiC,GAIvD,IAiBIW,EAjBAC,EAAW,KAETJ,IACFA,EAAmBK,OAAOC,YAAYF,EAAU,MAGlC,IAAgBA,WAAWjC,KAAKoC,IAC9CJ,EAAQI,EAELJ,EAAMK,KACP,YAAerD,EAAmB2C,MAAO,YAAW,IAAkBW,cAAcN,EAAMK,QAE1FrD,EAAmBuD,cAOzB,MAAMC,EAAYC,IAKhB,GAJGA,GACD,YAAYA,IAGV1B,EAAc2B,MAAMC,OAEtB,YADA5B,EAAcxB,UAAUC,IAAI,SAI9B,MAAMoD,EAAS,YAAiB,CAAC7B,EAAeM,IAAU,GAC1D,IAAIqB,EAAQ3B,EAAc2B,MAE1BpB,EAAYuB,OAAO,CAACrB,IAAK,eACzB,MAAMsB,EAAY,YAAazB,GAE/B,IAAgB0B,MAAML,EAAOV,GAAOhC,KAAMgD,IAGxC,OAAOA,EAASC,GACd,IAAK,qBACHC,cAAcrB,GACd,6BAAmB7B,KAAKmD,IACtBA,EAAEC,QAAQC,UAETC,GAAQA,EAAOxC,SAClB,MACF,QACEO,EAAQkC,gBAAgB,YACxBjC,EAAYuB,OAAO,CAACrB,IAAKwB,EAASC,IAClCH,EAAUhC,YAGb0C,MAAOC,IACRb,IACA5D,EAAmB8C,MAAMvC,UAAUC,IAAI,SAEhCiE,EAAIC,KAGPpC,EAAYuB,OAAO,CAACrB,IAAK,0BACzBT,EAAc4C,SAIlBb,EAAUhC,SAEVmB,OAIJ,YAAiBZ,EAASmB,GAE1BzB,EAAcZ,iBAAiB,YAAY,SAAesC,GAIxD,GAHAtD,KAAKI,UAAUuB,OAAO,SACtBQ,EAAYuB,OAAO,CAACrB,IAAK,eAEZ,UAAViB,EAAEjB,IACH,OAAOgB,OAIX,MAAMvD,EAAO,IAAW2E,SAAW,IAAM,IACnCN,EAAS,IAAI,IAAetE,EAAoBC,GAEtD,OADA+B,EAAK6C,SAASpC,OAAO6B,EAAOlE,WACrB0E,QAAQC,IAAI,CACjBT,EAAOU,OACP/B,OAIuD,KAAM,KAE7DlB,EAAckD,QAGhB,UAAgBC,YAAY,YAAa,CAACjB,EAAG,wBAGhC,a,gCCrJf,oBAgHA,MAAMkB,EAAkB,IAjGjB,MACE,WACL,OAAO,IAAWC,UAAU,uBAAuBpE,KAAMqE,GAChDA,GAIJ,eAAeC,EAKlB,IAIF,OAAOnF,KAAK8C,WAAWjC,KAAKgC,IAC1B,IAAIuC,EACAC,EACJ,MAAMC,EAAwC,CAC5CC,SAAU,KACVC,aAAc,CACZ1B,EAAG,gCACHZ,KAAMiC,EAASjC,KACfuC,MAAON,EAASM,QAKlBL,EADCD,EAASO,gBACW,IAAWC,aAAa,aAAcR,EAASO,gBAAiB7C,GAAO,GAEvE8B,QAAQiB,QAAQ,CACnC9B,EAAG,4BAKP,MAAM+B,EAAUhD,EAAMiD,SAChBC,EAAQ,IAAIC,WAAWH,EAAQE,MAAMvC,OAAS,IAWpD,OAVAuC,EAAME,YACNF,EAAMG,IAAIL,EAAQE,MAAO,GACzBF,EAAQE,MAAQA,EAGdV,EADCF,EAASgB,YACO,IAAWR,aAAa,aAAcR,EAASgB,YAAatD,GAAO,GAEnE8B,QAAQiB,QAAQ,IAAII,YAGhCrB,QAAQC,IAAI,CAACQ,EAAoBC,IAAiBxE,KAAMuF,IAC7Dd,EAAOC,SAAWa,EAAO,GACzBd,EAAOE,aAAaM,SAAWD,EAC/BP,EAAOE,aAAaa,kBAAoBD,EAAO,GAExC,IAAWnB,UAAU,iCAAkCK,OAK7D,MAAMC,EAAkB1C,EAAwByD,EAAe,IACpE,OAAO,IAAWX,aAAa,aAAcJ,EAAU1C,GAAO,GAAOhC,KAAM0F,GAElE,IAAWtB,UAAU,qBAAsB,CAChDM,SAAUgB,GACTD,GAASzF,KAAK2F,IACD,uBAAXA,EAAK1C,GACN,IAAW2C,QAAQD,EAAKE,MAGnBF,KAKN,qBAAqBG,GAC1B,OAAO,IAAW1B,UAAU,+BAAgC,CAAC0B,SAGxD,sBACL,OAAO,IAAW1B,UAAU,+BAGvB,sBACL,OAAO,IAAWA,UAAU,iCAehC,IAAeD,gBAAkBA,EAClB,O,gCClHf,8CAQe,MAAM4B,EAQnB,YAAYN,GAMVtG,KAAKuC,QAAUrC,SAAS2G,KAAKC,cAAc,IAAMR,EAAQxE,WAIzD9B,KAAKC,UAAYC,SAASC,cAAc,OACxCH,KAAKC,UAAU6B,UAAY,yBAE3B9B,KAAK0E,SAAWxE,SAASC,cAAc,OACvCH,KAAK0E,SAAS5C,UAAY,aAE1B9B,KAAK+G,MAAQ7G,SAASC,cAAc,MACjCmG,EAAQtE,cACThC,KAAK+G,MAAMzE,OAAO,eAAKgE,EAAQtE,eAGjChC,KAAKgH,SAAW9G,SAASC,cAAc,KACvCH,KAAKgH,SAASlF,UAAY,WACvBwE,EAAQrE,iBACTjC,KAAKgH,SAAS1E,OAAO,eAAKgE,EAAQrE,kBAGpCjC,KAAKC,UAAUqC,OAAOtC,KAAK0E,SAAU1E,KAAK+G,MAAO/G,KAAKgH,UAEnDV,EAAQvE,mBACT/B,KAAK4C,aAAe1C,SAASC,cAAc,OAC3CH,KAAK4C,aAAad,UAAY,gBAC9B9B,KAAKC,UAAUqC,OAAOtC,KAAK4C,eAG7B5C,KAAKuC,QAAQD,OAAOtC,KAAKC,c,gCCnD7B,qDASe,MAAMgH,UAA2B,IAK9C,YAAYX,EAA6B,IACvCY,MAAM,OAAD,QACHC,WAAW,GACRb,IAPA,KAAAhF,iBAAkB,EAsClB,KAAA8F,kBAAqB9D,IAC1B,YAAYA,GACZtD,KAAKsB,iBAAmBtB,KAAKsB,gBAE7BtB,KAAKqH,cAAcjH,UAAUqD,OAAO,aAAczD,KAAKsB,iBACtDtB,KAAK2C,MAA2B4B,KAAOvE,KAAKsB,gBAAkB,OAAS,WACxEtB,KAAKqB,6BAA+BrB,KAAKqB,+BAlCzC,MAAMsB,EAAQ3C,KAAK2C,MACnBA,EAAM4B,KAAO,WACb5B,EAAM2E,aAAa,WAAY,IAC/B3E,EAAM4E,aAAe,MAQrB,MAAMC,EAAWtH,SAASC,cAAc,SACxCqH,EAASpH,UAAUC,IAAI,YACvBmH,EAASC,UAAY,EACrBD,EAASjD,KAAO,WAChB5B,EAAM+E,cAAcC,QAAQH,GAC5B7E,EAAM+E,cAAcE,aAAaJ,EAASK,YAAalF,EAAMmF,aAE7D,MAAMT,EAAgBrH,KAAKqH,cAAgBnH,SAASC,cAAc,QAClEkH,EAAcjH,UAAUC,IAAI,iBAAkB,SAE9CL,KAAKC,UAAUG,UAAUC,IAAI,wBAC7BL,KAAKC,UAAUqC,OAAO+E,GAEtBA,EAAcrG,iBAAiB,QAAShB,KAAKoH,mBAC7CC,EAAcrG,iBAAiB,WAAYhB,KAAKoH,sB,gCCvCrC,SAASW,EAAWC,GACjC,MAAMC,EAAO/H,SAASC,cAAc,QAEpC,OADA8H,EAAKC,UAAYF,EACVC,EATT","file":"19.f2e6785986f5892e804d.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n /* input.readOnly = true;\r\n\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true}); */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/2.935038cc2873713ebe19.chunk.js b/public/2.935038cc2873713ebe19.chunk.js deleted file mode 100644 index bb5082450..000000000 --- a/public/2.935038cc2873713ebe19.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[2,27],{105:function(t,e,s){"use strict";function i(t,e){if(t.parentElement===e)return t;for(;t.parentElement;)if((t=t.parentElement).parentElement===e)return t;return null}s.d(e,"a",(function(){return i}))},119:function(t,e,s){"use strict";s.d(e,"a",(function(){return c}));var i=s(120),n=s(15),r=s(41),a=s(87),o=s(105),h=s(83);function c(t,e,s,c,l=250,d){const u=Object(i.a)(e,t||"tabs"===e.dataset.animation?"tabs":"navigation",l,c);if(t){const i=new Proxy(u,{apply:(e,s,i)=>{const n=+i[0],r=void 0===i[1]||i[1],a=t.querySelector(`[data-tab="${n}"]`)||t.children[n];c(a,n,r)}}),c=(i,o,h=!0)=>{const c=e.children[o];if(s){const t=s(o,c,h);if(void 0!==t&&!t)return}d&&d.scrollIntoViewNew(i.parentElement.children[o],"center",void 0,void 0,h?void 0:a.a.Static,l,"x"),n.default.settings.animationsEnabled||(h=!1);const m=u.prevId();if(i.classList.contains("active")||o===m)return!1;const g=t.querySelector(p.toLowerCase()+".active");Object(r.b)(()=>{g&&g.classList.remove("active")}),f&&-1!==m&&h&&Object(r.b)(()=>{const t=i.querySelector("i"),e=i.parentElement.children[m].querySelector("i");e.classList.remove("animate"),t.classList.remove("animate");const s=e.parentElement.parentElement.offsetLeft-t.parentElement.parentElement.offsetLeft,n=e.clientWidth/t.clientWidth;t.style.transform=`translate3d(${s}px, 0, 0) scale3d(${n}, 1, 1)`,requestAnimationFrame(()=>{t.classList.add("animate"),t.style.transform="none"})}),Object(r.b)(()=>{i.classList.add("active")}),u(o,h)},f=!t.classList.contains("no-stripe"),p=t.firstElementChild.tagName;return t.addEventListener("click",(function(e){let s,i=e.target;if(i=Object(o.a)(i,t),!i)return!1;if(i.dataset.tab){if(s=+i.dataset.tab,-1===s)return!1}else s=Object(h.a)(i);c(i,s)})),i}return u}},120:function(t,e,s){"use strict";s.d(e,"a",(function(){return l}));var i=s(15),n=s(45),r=s(82),a=s(83),o=s(5);function h(t,e,s){const i=e.getBoundingClientRect().width,n=[t,e];return s&&n.reverse(),n[0].style.filter="brightness(80%)",n[0].style.transform=`translate3d(${.25*-i}px, 0, 0)`,n[1].style.transform=`translate3d(${i}px, 0, 0)`,t.classList.add("active"),t.offsetWidth,t.style.transform="",t.style.filter="",()=>{e.style.transform=e.style.filter=""}}function c(t,e,s){const i=e.getBoundingClientRect().width,n=[t,e];return s&&n.reverse(),n[0].style.transform=`translate3d(${-i}px, 0, 0)`,n[1].style.transform=`translate3d(${i}px, 0, 0)`,t.classList.add("active"),t.offsetWidth,t.style.transform="",()=>{e.style.transform=""}}const l=(t,e,s,i,n=!0)=>{let r=null;switch(e){case"tabs":r=c;break;case"navigation":r=h}return t.dataset.animation=e,d(t,r,s,i,n)},d=(t,e,s,h,c=!0,l=!1,d=!0)=>{const u=new Map;let f,p=null;if(d){const s=e?"transitionend":"animationend",i=e=>{if(Object(o.a)(e),e.target.parentElement!==t)return;const n=u.get(e.target);n&&n(),e.target===p&&(!f&&c||(f&&(f.resolve(),f=void 0),h&&h(m.prevId()),t.classList.remove("animating","backwards","disable-hover"),l&&(t.removeEventListener(s,i),p=f=void 0,u.clear())))};t.addEventListener(s,i)}function m(o,l=!0,g){g&&(p=g),o instanceof HTMLElement&&(o=Object(a.a)(o));const v=m.prevId();if(o===v)return!1;const y=t.children[o];if(i.default.settings.animationsEnabled&&-1!==v||(l=!1),!d){const e=t.dataset.timeout;void 0!==e&&clearTimeout(+e),delete t.dataset.timeout}if(!l){if(p)p.classList.remove("active","to","from");else if(y){const t=u.get(y);t&&t()}return y&&(y.classList.remove("to","from"),y.classList.add("active")),t.classList.remove("animating","backwards","disable-hover"),p=y,void(h&&h(o))}d||(t.dataset.timeout=""+window.setTimeout(()=>{y.classList.remove("to"),p&&p.classList.remove("from"),t.classList.remove("animating","backwards","disable-hover"),delete t.dataset.timeout},s)),p&&(p.classList.remove("to"),p.classList.add("from")),t.classList.add("animating");const b=v{y.classList.remove("to"),u.delete(y)}),p){const t=p,e=()=>{t.classList.remove("active","from"),w&&w(),u.delete(t)};if(y)u.set(t,e);else{const i=window.setTimeout(e,s);u.set(t,()=>{clearTimeout(i),u.delete(t)})}c&&(f||(f=Object(n.a)()),Object(r.b)(f,2*s))}p=y}return m.prevId=()=>p?Object(a.a)(p):-1,m}},130:function(t,e,s){"use strict";s.d(e,"b",(function(){return a})),s.d(e,"a",(function(){return o}));var i=s(41),n=s(45);const r=new Map;function a(t){const e=function(t){return r.get(t)}(t);e&&(e.isCancelled=!0,e.deferred.resolve())}function o(t,e,s){return s||(s=function(t){a(t);const e={isCancelled:!1,deferred:Object(n.a)()};return r.set(t,e),e.deferred.then(()=>{r.delete(t)}),e}(e)),Object(i.b)(()=>{s.isCancelled||(t()?o(t,e,s):s.deferred.resolve())}),s.deferred}},17:function(t,e,s){"use strict";s.r(e),s.d(e,"STATE_INIT",(function(){return b})),s.d(e,"AppStateManager",(function(){return L}));var i=s(46),n=s(56),r=s(15),a=s(80),o=s(43),h=s(34),c=s(8),l=s(29),d=s(98),u=s(0),f=s(116),p=s(65),m=s(66);var g=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};const v=c.a.versionFull,y=c.a.build,b={allDialogsLoaded:{},pinnedOrders:{},contactsList:[],updates:{},filters:{},maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],topPeersCache:{},recentSearch:[],version:v,build:y,authState:{_:u.IS_MOBILE?"authStateSignIn":"authStateSignQr"},hiddenPinnedMessages:{},settings:{messagesTextSize:16,sendShortcut:"enter",animationsEnabled:!0,autoDownload:{contacts:!0,private:!0,groups:!0,channels:!0},autoPlay:{gifs:!0,videos:!0},stickers:{suggest:!0,loop:!0},emoji:{suggest:!0,big:!0},themes:[{name:"day",background:{type:"image",blur:!1,slug:"ByxGo2lrMFAIAAAAmkJxZabh8eM",highlightningColor:"hsla(85.5319, 36.9171%, 40.402%, 0.4)"}},{name:"night",background:{type:"color",blur:!1,color:"#0f0f0f",highlightningColor:"hsla(0, 0%, 3.82353%, 0.4)"}}],theme:"system",notifications:{sound:!1},timeFormat:(new Date).toLocaleString().match(/\s(AM|PM)/)?"h12":"h23"},keepSigned:!0,chatContextMenuHintWasShown:!1,stateId:Object(m.a)(32)},w=Object.keys(b),k=["contactsList","stateCreatedTime","maxSeenMsgId","filters","topPeers"];class L extends n.a{constructor(){super(),this.log=Object(o.b)("STATE"),this.neededPeers=new Map,this.singlePeerMap=new Map,this.storages={users:new d.a(f.a,"users"),chats:new d.a(f.a,"chats"),dialogs:new d.a(f.a,"dialogs")},this.storagesResults={},this.storage=a.a,this.loadSavedState()}loadSavedState(){return this.loaded||(console.time("load state"),this.loaded=new Promise(t=>{const e=Object.keys(this.storages),s=e.map(t=>this.storages[t].getAll()),i=w.map(t=>a.a.get(t)).concat(p.a.get("user_auth"),p.a.get("state_id")).concat(a.a.get("user_auth")).concat(s);Promise.all(i).then(s=>g(this,void 0,void 0,(function*(){let i=this.state={};for(let t=0,e=w.length;ta.a.get(t)));t.push("user_auth"),e.push("number"==typeof n||"string"==typeof n?{dcID:e[0]||c.a.baseDcId,date:Date.now()/1e3|0,id:n.toPeerId(!1)}:n);let s={};t.forEach((t,i)=>{s[t]=e[i]}),yield p.a.set(s)}n&&(i.authState={_:"authStateSignedIn"},r.default.dispatchEvent("user_auth","number"==typeof n||"string"==typeof n?{dcID:0,date:Date.now()/1e3|0,id:n.toPeerId(!1)}:n));for(let t=0,i=e.length;t{t.set(s,Object(h.a)(i[s]))}),i=this.state=Object(h.a)(b),t.forEach((t,e)=>{i[e]=t});for(const t in this.storagesResults)this.storagesResults[t].length=0;this.storage.set(i)}yield p.a.set({state_id:i.stateId})}const u=Date.now();if(i.stateCreatedTime+864e5{t.forEach(t=>{this.pushToState(t,Object(h.a)(b[t]));const e=this.storagesResults[t];e&&e.length&&(e.length=0)})})(k)}if(!i.settings.hasOwnProperty("theme")&&i.settings.hasOwnProperty("nightTheme")&&(i.settings.theme=i.settings.nightTheme?"night":"day",this.pushToState("settings",i.settings)),!i.settings.hasOwnProperty("themes")&&i.settings.background){i.settings.themes=Object(h.a)(b.settings.themes);const t=i.settings.themes.find(t=>t.name===i.settings.theme);t&&(t.background=i.settings.background,this.pushToState("settings",i.settings))}if(Object(h.k)(b,i,t=>{this.pushToState(t,i[t])}),i.version!==v){if(-1===function(t,e){t=t.split(" ",1)[0],e=e.split(" ",1)[0];const s=t.split("."),i=e.split(".");for(let t=0;tn)return 1;if(e{const t=i;i=void 0,t.forEach(t=>t())}))}s.d(e,"b",(function(){return n})),s.d(e,"c",(function(){return h})),s.d(e,"d",(function(){return c})),s.d(e,"a",(function(){return l}));let r,a,o=!1;function h(t){r?o?t():r.push(t):(r=[t],requestAnimationFrame(()=>{o=!0;for(let t=0;t{a=void 0}),a)}function l(){return new Promise(t=>{n(()=>{n(t)})})}},44:function(t,e,s){"use strict";s.d(e,"a",(function(){return i})),s.d(e,"e",(function(){return n})),s.d(e,"c",(function(){return r})),s.d(e,"d",(function(){return a})),s.d(e,"f",(function(){return o})),s.d(e,"b",(function(){return h}));const i=(t,e)=>t.reduce((t,e)=>t+e,e);function n(t,e){const s=t.indexOf(e),i=-1!==s&&t.splice(s,1);return i&&i[0]}function r(t,e){const s=[];let i=-1;for(;-1!==(i=t.findIndex(e));)s.push(t.splice(i,1)[0]);return s}function a(t,e){for(let s=t.length-1;s>=0;--s)e(t[s],s,t)}function o(t,e,s,i){const n=e[s];if(void 0===i&&-1!==(i=t.indexOf(e))){const e=t[i-1],r=t[i+1];if((!e||e[s]>=n)&&(!r||r[s]<=n))return i;t.splice(i,1)}const r=t.length;if(!r||n<=t[r-1][s])return t.push(e)-1;if(n>=t[0][s])return t.unshift(e),0;for(let i=0;it[i][s])return t.splice(i,0,e),i;return console.error("wtf",t,e),t.indexOf(e)}function h(t){return[...new Set(t)]}},51:function(t,e,s){"use strict";function i(){return new Worker(s.p+"rlottie.worker.6777ef401e7048467332.bundle.worker.js")}s.d(e,"a",(function(){return m}));var n=s(72),r=s(29),a=s(56),o=s(37),h=s(63),c=s(81),l=s(0),d=s(43),u=s(32),f=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};let p=t=>Math.round(255*Math.min(Math.max(t,0),1));class m extends a.a{constructor({worker:t,options:e}){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.frames={},this.cachingDelta=0,this.reqId=++m.reqId,this.el=e.container,this.worker=t;for(let t in e)this.hasOwnProperty(t)&&(this[t]=e[t]);let s;this._loop=this.loop,this._autoplay=this.autoplay,void 0!==e.skipRatio?s=e.skipRatio:(l.IS_ANDROID||l.IS_APPLE_MOBILE||l.IS_APPLE&&!l.IS_SAFARI)&&this.width<100&&this.height<100&&(s=.5),this.skipDelta=void 0!==s?1/s|0:1;const i=Object(h.a)(window.devicePixelRatio,1,2);i>1&&(e.needUpscale?(this.width=Math.round(this.width*i),this.height=Math.round(this.height*i)):i>1&&(this.width>100&&this.height>100?l.IS_APPLE||!o.b.isMobile?(this.width=Math.round(this.width*i),this.height=Math.round(this.height*i)):i>2.5&&(this.width=Math.round(this.width*(i-1.5)),this.height=Math.round(this.height*(i-1.5))):(this.width=Math.round(this.width*Math.max(1.5,i-1.5)),this.height=Math.round(this.height*Math.max(1.5,i-1.5))))),e.noCache||(l.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=document.createElement("canvas"),this.canvas.classList.add("rlottie"),this.canvas.width=this.width,this.canvas.height=this.height,this.context=this.canvas.getContext("2d"),this.clamped=new Uint8ClampedArray(this.width*this.height*4),this.imageData=new ImageData(this.width,this.height)}clearCache(){this.frames={}}sendQuery(t,...e){this.worker.sendQuery(t,this.reqId,...e)}loadFromData(t){this.sendQuery("loadFromData",t,this.width,this.height)}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(t=!0){this.paused||(this.paused=!0,t&&clearTimeout(this.rafId))}stop(t=!0){this.pause(),this.curFrame=1===this.direction?0:this.frameCount,t&&this.requestFrame(this.curFrame)}restart(){this.stop(!1),this.play()}setSpeed(t){this.speed=t,this.paused||this.setMainLoop()}setDirection(t){this.direction=t,this.paused||this.setMainLoop()}remove(){y.onDestroy(this.reqId),this.pause(),this.sendQuery("destroy")}renderFrame2(t,e){try{this.imageData.data.set(t),this.context.putImageData(this.imageData,0,0)}catch(t){return console.error("RLottiePlayer renderFrame error:",t,this.width,this.height),this.autoplay=!1,void this.pause()}this.dispatchEvent("enterFrame",e)}renderFrame(t,e){if(this.cachingDelta&&(e%this.cachingDelta||!e)&&!this.frames[e]&&(this.frames[e]=new Uint8ClampedArray(t)),this.frInterval){const s=Date.now()-this.frThen;if(s<0)return this.rafId&&clearTimeout(this.rafId),this.rafId=window.setTimeout(()=>{this.renderFrame2(t,e)},this.frInterval>-s?-s%this.frInterval:this.frInterval)}this.renderFrame2(t,e)}requestFrame(t){this.frames[t]?this.renderFrame(this.frames[t],t):l.IS_SAFARI?this.sendQuery("renderFrame",t):(this.clamped.length||(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery("renderFrame",t,this.clamped))}mainLoopForwards(){const t=this.curFrame+this.skipDelta>=this.frameCount?this.curFrame=0:this.curFrame+=this.skipDelta;return this.requestFrame(t),!(t+this.skipDelta>=this.frameCount&&!this.loop)||(this.pause(!1),!1)}mainLoopBackwards(){const t=this.curFrame-this.skipDelta<0?this.curFrame=this.frameCount-1:this.curFrame-=this.skipDelta;return this.requestFrame(t),!(t-this.skipDelta<0&&!this.loop)||(this.pause(!1),!1)}setMainLoop(){clearTimeout(this.rafId),this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval;const t=(1===this.direction?this.mainLoopForwards:this.mainLoopBackwards).bind(this);this.currentMethod=t,this.frameListener&&this.listenerResults.hasOwnProperty("enterFrame")&&this.frameListener()}onLoad(t,e){return f(this,void 0,void 0,(function*(){if(this.curFrame=1===this.direction?0:t-1,this.frameCount=t,this.fps=e,this.fps<60&&1!==this.skipDelta){const t=60/e;this.skipDelta=this.skipDelta/t|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,this.requestFrame(0),this.dispatchEvent("ready"),this.addEventListener("enterFrame",()=>{this.dispatchEvent("firstFrame"),this.el&&this.el.appendChild(this.canvas),this.frameListener=()=>{if(this.paused)return;const t=Date.now();this.frThen=t+this.frInterval;this.currentMethod()||this.loop||!this.autoplay||(this.autoplay=!1)},this.addEventListener("enterFrame",this.frameListener)},{once:!0})}))}}m.reqId=0;class g extends a.a{constructor(t,e=(()=>{}),s){super(),this.worker=t,this.defaultListener=e,s&&(this.worker.onerror=s),this.worker.onmessage=t=>{t.data instanceof Object&&t.data.hasOwnProperty("queryMethodListener")&&t.data.hasOwnProperty("queryMethodArguments")?this.dispatchEvent(t.data.queryMethodListener,...t.data.queryMethodArguments):this.defaultListener.call(this,t.data)}}postMessage(t){this.worker.postMessage(t)}terminate(){this.worker.terminate()}sendQuery(t,...e){if(l.IS_SAFARI)this.worker.postMessage({queryMethod:t,queryMethodArguments:e});else{const s=[];e.forEach(t=>{t instanceof ArrayBuffer&&s.push(t),t.buffer&&t.buffer instanceof ArrayBuffer&&s.push(t.buffer)}),this.worker.postMessage({queryMethod:t,queryMethodArguments:e},s)}}}class v{constructor(){this.isWebAssemblySupported="undefined"!=typeof WebAssembly,this.loadPromise=this.isWebAssemblySupported?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=4,this.players={},this.workers=[],this.curWorkerNum=0,this.log=Object(d.b)("LOTTIE",d.a.Error),this.onPlayerLoaded=(t,e,s)=>{const i=this.players[t];i?(this.log.debug("onPlayerLoaded"),i.onLoad(e,s)):this.log.warn("onPlayerLoaded on destroyed player:",t,e)},this.onFrame=(t,e,s)=>{const i=this.players[t];i?(i.clamped=s,i.renderFrame(s,e)):this.log.warn("onFrame on destroyed player:",t,e)},this.onPlayerError=(t,e)=>{const s=this.players[t];if(s){n.a.getAnimations(s.el).forEach(t=>{n.a.checkAnimation(t,!0,!0)})}}}getAnimation(t){for(const e in this.players)if(this.players[e].el===t)return this.players[e];return null}setLoop(t){for(const e in this.players){const s=this.players[e];s.loop=t,s.autoplay=s._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise((t,e)=>{let s=this.workersLimit;for(let e=0;e{this.log("worker #"+e+" ready"),n.addEventListener("frame",this.onFrame),n.addEventListener("loaded",this.onPlayerLoaded),n.addEventListener("error",this.onPlayerError),--s,s||(this.log("workers ready"),t(),this.loaded=!0)},{once:!0})}})}applyReplacements(t,e){const s=v.COLORREPLACEMENTS[Math.max(e-1,0)],i=t=>{switch(t.ty){case"st":case"fl":(t=>{const e=t.c.k,i=p(e[2])|p(e[1])<<8|p(e[0])<<16,n=s.find(t=>t[0]===i);n&&(e[0]=(n[1]>>16&255)/255,e[1]=(n[1]>>8&255)/255,e[2]=(255&n[1])/255)})(t)}t.hasOwnProperty("it")&&n(t.it)},n=t=>{for(const e of t)i(e)};try{for(const e of t.layers)if(e.shapes)for(const t of e.shapes)t.it?n(t.it):i(t)}catch(s){this.log.warn("cant apply replacements",s,t,e)}}loadAnimationFromURL(t,e){return this.isWebAssemblySupported?(this.loaded||this.loadLottieWorkers(),fetch(e).then(t=>t.arrayBuffer()).then(t=>u.a.invokeCrypto("gzipUncompress",t,!0)).then(e=>this.loadAnimationWorker(Object.assign(t,{animationData:e,needUpscale:!0})))):this.loadPromise}waitForFirstFrame(t){return Promise.race([new Promise(e=>{t.addEventListener("firstFrame",e,{once:!0})}),Object(c.a)(2500)])}loadAnimationWorker(t,e="",s=-1){return f(this,void 0,void 0,(function*(){if(!this.isWebAssemblySupported)return this.loadPromise;if(s>=1&&s<=5){const e=JSON.parse(t.animationData);this.applyReplacements(e,s),t.animationData=JSON.stringify(e)}if(this.loaded||(yield this.loadLottieWorkers()),t.width&&t.height||!t.container||(t.width=parseInt(t.container.style.width),t.height=parseInt(t.container.style.height)),!t.width||!t.height)throw new Error("No size for sticker!");t.group=e;const i=this.initPlayer(t);return"none"!==e&&n.a.addAnimation(i,e),i}))}onDestroy(t){delete this.players[t]}destroyWorkers(){this.workers.forEach((t,e)=>{t.terminate(),this.log("worker #"+e+" terminated")}),this.log("workers destroyed"),this.workers.length=0}initPlayer(t){const e=new m({worker:this.workers[this.curWorkerNum++],options:t});return this.players[e.reqId]=e,this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),e.loadFromData(t.animationData),e}}v.COLORREPLACEMENTS=[[[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]]];const y=new v;r.a.lottieLoader=y;e.b=y},60:function(t,e,s){"use strict";function i(t){return null==t?void 0:t.isConnected}s.d(e,"a",(function(){return i}))},62:function(t,e,s){"use strict";s.d(e,"a",(function(){return d}));var i=s(51),n=s(119),r=s(29),a=s(87),o=s(83);const h=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=Object(n.a)(null,this.scrollableDiv.querySelector(".tabs-container"),null,()=>{var t;(null===(t=this.page)||void 0===t?void 0:t.onShown)&&this.page.onShown()})}setPage(t){if(t.isAuthPage){this.pagesDiv.style.display="";let e=Object(o.a)(t.pageEl);if(this.pageId===e)return;this.selectTab(e),-1!==this.pageId&&e>1&&i.b.loadLottieWorkers(),this.pageId=e,this.scrollableDiv&&Object(a.b)(this.scrollableDiv,this.scrollableDiv.firstElementChild,"start")}else this.pagesDiv.style.display="none",t.pageEl.style.display="",this.pageId=-1;this.page=t}};r.a.pagesManager=h;var c=h,l=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};class d{constructor(t,e,s,i,n){this.isAuthPage=e,this.onFirstMount=s,this.onMount=i,this.onShown=n,this.installed=!1,this.pageEl=document.body.querySelector("."+t)}mount(...t){return l(this,void 0,void 0,(function*(){if(this.onMount&&this.onMount(...t),!this.installed){if(this.onFirstMount)try{const e=this.onFirstMount(...t);e instanceof Promise&&(yield e)}catch(t){console.error("PAGE MOUNT ERROR:",t)}this.installed=!0}c.setPage(this)}))}}},63:function(t,e,s){"use strict";function i(t,e=" "){const s=t.toString().split(".");return s[0]=s[0].replace(/\B(?=(\d{3})+(?!\d))/g,e),s.join(".")}function n(t,e=2){if(0===t)return"0 Bytes";const s=e<0?0:e,i=Math.floor(Math.log(t)/Math.log(1024));return parseFloat((t/Math.pow(1024,i)).toFixed(s))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][i]}function r(t,e=2){if(0===t)return"0";const s=e<0?0:e,i=Math.floor(Math.log(t)/Math.log(1e3));return parseFloat((t/Math.pow(1e3,i)).toFixed(s))+["","K","M","B","T"][i]}function a(t,e,s){return ts?s:t}s.d(e,"d",(function(){return i})),s.d(e,"b",(function(){return n})),s.d(e,"c",(function(){return r})),s.d(e,"a",(function(){return a}))},72:function(t,e,s){"use strict";var i=s(51),n=s(15),r=s(0),a=s(29),o=s(60),h=s(44);const c=new class{constructor(){this.visible=new Set,this.byGroups={},this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,this.observer=new IntersectionObserver(t=>{if(!n.default.idle.isIDLE)for(const e of t){const t=e.target;for(const s in this.byGroups){if(this.intersectionLockedGroups[s])continue;const n=this.byGroups[s].find(e=>e.el===t);if(n){e.isIntersecting?(this.visible.add(n),this.checkAnimation(n,!1)):(this.visible.delete(n),this.checkAnimation(n,!0),n.animation instanceof i.a&&n.animation.clearCache());break}}}}),n.default.addEventListener("media_play",({doc:t})=>{"round"===t.type&&(this.videosLocked=!0,this.checkAnimations())}),n.default.addEventListener("media_pause",()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations())})}getAnimations(t){const e=[];for(const s in this.byGroups)for(const i of this.byGroups[s])i.el===t&&e.push(i);return e}removeAnimation(t){const{el:e,animation:s}=t;s.remove(),s instanceof HTMLVideoElement&&r.IS_SAFARI&&setTimeout(()=>{s.src="",s.load()},1e3);for(const e in this.byGroups)Object(h.e)(this.byGroups[e],t);this.observer.unobserve(e),this.visible.delete(t)}addAnimation(t,e=""){var s;const r={el:t instanceof i.a?t.el:t,animation:t,group:e};t instanceof i.a&&!n.default.settings.stickers.loop&&t.loop&&(t.loop=n.default.settings.stickers.loop),(null!==(s=this.byGroups[e])&&void 0!==s?s:this.byGroups[e]=[]).push(r),this.observer.observe(r.el)}checkAnimations(t,e,s=!1){if(n.default.idle.isIDLE)return;const i=e?[e]:Object.keys(this.byGroups);if(!e||this.byGroups[e])for(const e of i){this.byGroups[e].forEach(e=>{this.checkAnimation(e,t,s)})}else this.byGroups[e]=[]}checkAnimation(t,e=!1,s=!1){const{el:i,animation:n,group:r}=t;s||!Object(o.a)(i)&&!this.lockedGroups[r]?this.removeAnimation(t):e||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==r||n instanceof HTMLVideoElement&&this.videosLocked?n.paused||n.pause():n.paused&&this.visible.has(t)&&n.autoplay&&(!this.onlyOnePlayableGroup||this.onlyOnePlayableGroup===r)&&n.play()}setOnlyOnePlayableGroup(t){this.onlyOnePlayableGroup=t}lockGroup(t){this.lockedGroups[t]=!0}unlockGroup(t){delete this.lockedGroups[t],this.checkAnimations(void 0,t)}refreshGroup(t){const e=this.byGroups[t];e&&e.length&&(e.forEach(t=>{this.observer.unobserve(t.el)}),window.requestAnimationFrame(()=>{e.forEach(t=>{this.observer.observe(t.el)})}))}lockIntersectionGroup(t){this.intersectionLockedGroups[t]=!0}unlockIntersectionGroup(t){delete this.intersectionLockedGroups[t],this.refreshGroup(t)}};a.a&&(a.a.animationIntersector=c),e.a=c},82:function(t,e,s){"use strict";s.d(e,"b",(function(){return d})),s.d(e,"d",(function(){return f})),s.d(e,"c",(function(){return p}));var i=s(45),n=s(15),r=s(29),a=s(81);let o=!1,h=Object(i.a)(),c=0;h.resolve();const l=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function d(t,e){o||(h=Object(i.a)(),n.default.dispatchEvent("event-heavy-animation-start"),o=!0,r.b&&l("start")),++c,r.b&&l("attach promise, length:",c,e);const s=[void 0!==e?Object(a.a)(e):void 0,t.finally(()=>{})].filter(Boolean),d=performance.now(),f=h;return Promise.race(s).then(()=>{h!==f||h.isFulfilled||(--c,r.b&&l("promise end, length:",c,performance.now()-d),c<=0&&u())}),h}function u(){h.isFulfilled||(o=!1,c=0,n.default.dispatchEvent("event-heavy-animation-end"),h.resolve(),r.b&&l("end"))}function f(){u()}function p(){return h}e.a=function(t,e,s){o&&t();const i=s?s.add(n.default):n.default.addEventListener.bind(n.default),r=s?s.removeManual.bind(s,n.default):n.default.removeEventListener.bind(n.default);return i("event-heavy-animation-start",t),i("event-heavy-animation-end",e),()=>{r("event-heavy-animation-end",e),r("event-heavy-animation-start",t)}}},83:function(t,e,s){"use strict";function i(t){if(!t.parentNode)return-1;let e=0;for(;null!==(t=t.previousElementSibling);)++e;return e}s.d(e,"a",(function(){return i}))},87:function(t,e,s){"use strict";s.d(e,"a",(function(){return h})),s.d(e,"b",(function(){return c}));var i=s(82),n=s(41),r=s(130),a=s(15),o=s(60);var h;function c(t,e,s,r=0,c=1500,d,u,f="y",p){if(a.default.settings.animationsEnabled||(d=h.Static),d===h.Static)return l(t,e,s,r,u=0,f,p);if("y"===f&&e!==t&&Object(o.a)(e)&&t.getBoundingClientRect){const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),n=s.top-i.top;void 0===d?n<-c?t.scrollTop+=n+c:n>c&&(t.scrollTop+=n-c):d===h.Up?t.scrollTop=n+t.scrollTop+c:d===h.Down&&(t.scrollTop=Math.max(0,n+t.scrollTop-c))}const m=new Promise(i=>{Object(n.b)(()=>{l(t,e,s,r,u,f,p).then(i)})});return"y"===f?Object(i.b)(m):m}function l(t,e,s,i=0,n,a="y",h){if(!Object(o.a)(e))return Object(r.b)(t),Promise.resolve();const c="y"===a?"top":"left",l="y"===a?"bottom":"right",f="y"===a?"height":"width",p="y"===a?"scrollHeight":"scrollWidth",m="y"===a?"scrollTop":"scrollLeft",g=e.getBoundingClientRect(),v=t.getBoundingClientRect?t.getBoundingClientRect():document.body.getBoundingClientRect(),y=g[c]-v[c],b=e[p],w=h?h({rect:v}):v[f],k=t[m],L=t[p];let P;switch(s){case"start":P=y-i;break;case"end":P=g[l]+(b-g[f])-v[l];break;case"nearest":case"center":P=b0){const t=L-(k+w);P=Math.min(P,t)}const E=t[m]+P,S=Math.abs(P),M=null!=n?n:250+S/1500*350,I=Date.now(),O=S<500?u:d,A=()=>{const e=M?Math.min((Date.now()-I)/M,1):1,s=P*(1-O(e));return t[m]=Math.round(E-s),e<1};return M&&P?Object(r.a)(A,t):(Object(r.b)(t),A(),Promise.resolve())}function d(t){return 1-Math.pow(1-t,5)}function u(t){return 1-Math.pow(1-t,3.5)}!function(t){t[t.Up=0]="Up",t[t.Down=1]="Down",t[t.Static=2]="Static"}(h||(h={}))}}]); -//# sourceMappingURL=2.935038cc2873713ebe19.chunk.js.map \ No newline at end of file diff --git a/public/2.935038cc2873713ebe19.chunk.js.map b/public/2.935038cc2873713ebe19.chunk.js.map deleted file mode 100644 index 151d8a330..000000000 --- a/public/2.935038cc2873713ebe19.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/dom/findUpAsChild.ts","webpack:///./src/components/horizontalMenu.ts","webpack:///./src/components/transition.ts","webpack:///./src/helpers/animation.ts","webpack:///./src/lib/appManagers/appStateManager.ts","webpack:///./src/helpers/compareVersion.ts","webpack:///./src/helpers/schedulers.ts","webpack:///./src/helpers/array.ts","webpack:///./src/lib/rlottie/rlottie.worker.ts","webpack:///./src/lib/lottieLoader.ts","webpack:///./src/helpers/dom/isInDOM.ts","webpack:///./src/pages/pagesManager.ts","webpack:///./src/pages/page.ts","webpack:///./src/helpers/number.ts","webpack:///./src/components/animationIntersector.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/helpers/dom/whichChild.ts","webpack:///./src/helpers/fastSmoothScroll.ts"],"names":["findUpAsChild","el","parent","parentElement","horizontalMenu","tabs","content","onClick","onTransitionEnd","transitionTime","scrollableX","selectTab","dataset","animation","proxy","Proxy","apply","target","that","args","id","animate","undefined","querySelector","children","selectTarget","tabContent","canChange","scrollIntoViewNew","Static","settings","animationsEnabled","prevId","classList","contains","prev","tagName","toLowerCase","remove","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","style","transform","requestAnimationFrame","add","firstElementChild","addEventListener","e","tab","slideNavigation","prevTabContent","toRight","width","getBoundingClientRect","elements","reverse","filter","offsetWidth","slideTabs","TransitionSlider","type","isHeavy","animationFunction","Transition","once","withAnimationListener","onTransitionEndCallbacks","Map","animationDeferred","from","listenerName","onEndEvent","callback","get","resolve","removeEventListener","clear","overrideFrom","HTMLElement","to","timeout","clearTimeout","window","setTimeout","onTransitionEndCallback","toggle","set","delete","_from","instances","cancelAnimationByKey","key","instance","getAnimationInstance","isCancelled","deferred","animateSingle","tick","then","createAnimationInstance","STATE_VERSION","versionFull","BUILD","build","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsList","updates","filters","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","topPeersCache","recentSearch","version","authState","_","hiddenPinnedMessages","messagesTextSize","sendShortcut","autoDownload","contacts","private","groups","channels","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","name","background","blur","slug","highlightningColor","color","theme","notifications","sound","timeFormat","toLocaleString","match","keepSigned","chatContextMenuHintWasShown","stateId","ALL_KEYS","Object","keys","REFRESH_KEYS","super","log","logger","neededPeers","singlePeerMap","storages","users","chats","dialogs","storagesResults","storage","stateStorage","this","loadSavedState","loaded","console","time","Promise","storagesKeys","storagesPromises","map","getAll","promises","concat","sessionStorage","all","arr","state","i","length","value","pushToState","splice","auth","shift","shiftedWebKAuth","push","values","dcID","baseDcId","date","toPeerId","obj","forEach","idx","rootScope","dispatchEvent","preserve","state_id","s","r","hasOwnProperty","nightTheme","find","t","missingKey","v1","v2","split","s1","s2","compareVersion","result","newVersion","timeEnd","catch","first","direct","setKeyValueToStorage","peerId","limit","has","Set","keepPeerSingle","keepPeerIdSingle","requestPeer","existsPeerId","size","appStateManager","fastRafCallbacks","fastRaf","currentCallbacks","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","accumulate","initialValue","reduce","acc","indexOfAndSplice","array","item","indexOf","spliced","findAndSpliceAll","verify","out","findIndex","forEachReverse","insertInDescendSortedArray","element","property","pos","sortProperty","next","len","unshift","error","filterUnique","Worker_fn","Worker","convert","Math","round","min","max","worker","options","reqId","height","paused","direction","speed","autoplay","group","frames","cachingDelta","container","skipRatio","_loop","_autoplay","skipDelta","pixelRatio","devicePixelRatio","needUpscale","mediaSizes","isMobile","noCache","Infinity","canvas","document","createElement","context","getContext","clamped","Uint8ClampedArray","imageData","ImageData","methodName","sendQuery","jsonString","setMainLoop","clearPendingRAF","rafId","renderFirstFrame","pause","curFrame","frameCount","requestFrame","stop","play","lottieLoader","onDestroy","frame","frameNo","data","putImageData","err","frInterval","delta","frThen","renderFrame2","renderFrame","fps","method","mainLoopForwards","mainLoopBackwards","bind","currentMethod","frameListener","listenerResults","diff","appendChild","defaultListener","onError","onerror","onmessage","event","queryMethodListener","queryMethodArguments","call","message","postMessage","terminate","queryMethod","transfer","arg","ArrayBuffer","buffer","isWebAssemblySupported","loadPromise","reject","workersLimit","players","workers","curWorkerNum","Error","onPlayerLoaded","rlPlayer","debug","onLoad","warn","onFrame","onPlayerError","animationIntersector","getAnimations","checkAnimation","player","remain","object","toneIndex","replacements","COLORREPLACEMENTS","checkSmth","smth","ty","k","c","foundReplacement","p","applyTo","iterateIt","it","layer","layers","shapes","shape","params","url","loadLottieWorkers","fetch","res","arrayBuffer","invokeCrypto","str","loadAnimationWorker","assign","animationData","race","newAnimationData","JSON","parse","applyReplacements","stringify","parseInt","initPlayer","addAnimation","loadFromData","isInDOM","isConnected","pagesManager","pageId","pagesDiv","getElementById","scrollableDiv","page","onShown","isAuthPage","display","whichChild","pageEl","fastSmoothScroll","className","onFirstMount","onMount","installed","body","setPage","numberThousandSplitter","x","joiner","parts","toString","replace","join","formatBytes","bytes","decimals","dm","floor","parseFloat","pow","toFixed","formatNumber","clamp","v","visible","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","observer","IntersectionObserver","entries","idle","isIDLE","entry","isIntersecting","clearCache","doc","checkAnimations","found","HTMLVideoElement","src","load","unobserve","observe","blurred","destroy","removeAnimation","animations","refreshGroup","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","promise","finally","Boolean","perf","performance","_heavyAnimationPromise","isFulfilled","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","listenerSetter","removeManual","elem","parentNode","previousElementSibling","FocusDirection","position","margin","maxDistance","forceDirection","forceDuration","axis","getNormalSize","scrollWithJs","elementRect","containerRect","offsetTop","top","scrollTop","Up","Down","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementPosition","elementSize","containerSize","rect","scrollPosition","scrollSize","path","remainingPath","absPath","abs","duration","startAt","transition","shortTransition","longTransition","currentPath"],"mappings":"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","file":"2.935038cc2873713ebe19.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { TransitionSlider } from \"./transition\";\r\nimport { ScrollableX } from \"./scrollable\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nexport function horizontalMenu(tabs: HTMLElement, content: HTMLElement, onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean, onTransitionEnd?: () => void, transitionTime = 250, scrollableX?: ScrollableX) {\r\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd);\r\n\r\n if(tabs) {\r\n const proxy = new Proxy(selectTab, {\r\n apply: (target, that, args) => {\r\n const id = +args[0];\r\n const animate = args[1] !== undefined ? args[1] : true;\r\n \r\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\r\n selectTarget(el, id, animate);\r\n }\r\n });\r\n\r\n const selectTarget = (target: HTMLElement, id: number, animate = true) => {\r\n const tabContent = content.children[id] as HTMLDivElement;\r\n\r\n if(onClick) {\r\n const canChange = onClick(id, tabContent, animate);\r\n if(canChange !== undefined && !canChange) {\r\n return;\r\n }\r\n }\r\n\r\n if(scrollableX) {\r\n scrollableX.scrollIntoViewNew(target.parentElement.children[id] as HTMLElement, 'center', undefined, undefined, animate ? undefined : FocusDirection.Static, transitionTime, 'x');\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(target.classList.contains('active') || id === prevId) {\r\n return false;\r\n }\r\n \r\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\r\n\r\n fastRaf(() => {\r\n prev && prev.classList.remove('active');\r\n });\r\n \r\n // stripe from ZINCHUK\r\n if(useStripe && prevId !== -1 && animate) {\r\n fastRaf(() => {\r\n const indicator = target.querySelector('i')!;\r\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\r\n \r\n currentIndicator.classList.remove('animate');\r\n indicator.classList.remove('animate');\r\n \r\n // We move and resize our indicator so it repeats the position and size of the previous one.\r\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\r\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\r\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\r\n \r\n //console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\r\n \r\n requestAnimationFrame(() => {\r\n // Now we remove the transform to let it animate to its own position and size.\r\n indicator.classList.add('animate');\r\n indicator.style.transform = 'none';\r\n });\r\n });\r\n }\r\n // stripe END\r\n\r\n fastRaf(() => {\r\n target.classList.add('active');\r\n });\r\n \r\n selectTab(id, animate);\r\n };\r\n\r\n const useStripe = !tabs.classList.contains('no-stripe');\r\n\r\n //const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\r\n const tagName = tabs.firstElementChild.tagName;\r\n tabs.addEventListener('click', function(e) {\r\n let target = e.target as HTMLElement;\r\n \r\n target = findUpAsChild(target, tabs);\r\n \r\n //console.log('tabs click:', target);\r\n \r\n if(!target) return false;\r\n\r\n let id: number;\r\n if(target.dataset.tab) {\r\n id = +target.dataset.tab;\r\n if(id === -1) {\r\n return false;\r\n }\r\n } else {\r\n id = whichChild(target);\r\n }\r\n\r\n selectTarget(target, id);\r\n });\r\n\r\n return proxy;\r\n }\r\n \r\n return selectTab;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n\r\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.filter = `brightness(80%)`;\r\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n tabContent.style.filter = '';\r\n\r\n return () => {\r\n prevTabContent.style.transform = prevTabContent.style.filter = '';\r\n };\r\n}\r\n\r\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\r\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\r\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\r\n // scrollableContainer.style.overflowY = 'hidden';\r\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\r\n // // this.container.classList.add('sliding');\r\n // }\r\n\r\n //window.requestAnimationFrame(() => {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n /* tabContent.style.setProperty('--width', width + 'px');\r\n prevTabContent.style.setProperty('--width', width + 'px');\r\n\r\n tabContent.classList.add('active'); */\r\n //void tabContent.offsetWidth; // reflow\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n \r\n tabContent.style.transform = '';\r\n //});\r\n \r\n return () => {\r\n prevTabContent.style.transform = '';\r\n\r\n // if(scrollableContainer) {\r\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\r\n // scrollableContainer.style.display = 'none';\r\n // }\r\n\r\n // scrollableContainer.style.overflowY = '';\r\n\r\n // if(isSafari) {\r\n // void scrollableContainer.offsetLeft; // reflow\r\n // scrollableContainer.style.display = '';\r\n // }\r\n\r\n // // scrollableContainer.style.paddingRight = '0';\r\n // // this.container.classList.remove('sliding');\r\n // }\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (\r\n content: HTMLElement, \r\n type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true\r\n) => {\r\n let animationFunction: TransitionFunction = null;\r\n\r\n switch(type) {\r\n case 'tabs':\r\n animationFunction = slideTabs;\r\n break;\r\n case 'navigation':\r\n animationFunction = slideNavigation;\r\n break;\r\n /* default:\r\n break; */\r\n }\r\n\r\n content.dataset.animation = type;\r\n \r\n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy);\r\n};\r\n\r\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\r\n\r\nconst Transition = (\r\n content: HTMLElement, \r\n animationFunction: TransitionFunction, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true,\r\n once = false,\r\n withAnimationListener = true\r\n) => {\r\n const onTransitionEndCallbacks: Map = new Map();\r\n let animationDeferred: CancellablePromise;\r\n // let animationStarted = 0;\r\n let from: HTMLElement = null;\r\n\r\n if(withAnimationListener) {\r\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\r\n\r\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\r\n cancelEvent(e);\r\n \r\n if((e.target as HTMLElement).parentElement !== content) {\r\n return;\r\n }\r\n \r\n //console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\r\n \r\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\r\n if(callback) callback();\r\n \r\n if(e.target !== from) {\r\n return;\r\n }\r\n \r\n if(!animationDeferred && isHeavy) return;\r\n \r\n if(animationDeferred) {\r\n animationDeferred.resolve();\r\n animationDeferred = undefined;\r\n }\r\n \r\n if(onTransitionEnd) {\r\n onTransitionEnd(selectTab.prevId());\r\n }\r\n \r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n \r\n if(once) {\r\n content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\r\n from = animationDeferred = undefined;\r\n onTransitionEndCallbacks.clear();\r\n }\r\n };\r\n \r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\r\n }\r\n\r\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\r\n if(overrideFrom) {\r\n from = overrideFrom;\r\n }\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n \r\n const prevId = selectTab.prevId();\r\n if(id === prevId) return false;\r\n\r\n //console.log('selectTab id:', id);\r\n\r\n const to = content.children[id] as HTMLElement;\r\n\r\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\r\n animate = false;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n const timeout = content.dataset.timeout;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n delete content.dataset.timeout;\r\n }\r\n\r\n if(!animate) {\r\n if(from) from.classList.remove('active', 'to', 'from');\r\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\r\n const callback = onTransitionEndCallbacks.get(to);\r\n if(callback) {\r\n callback();\r\n }\r\n }\r\n\r\n if(to) {\r\n to.classList.remove('to', 'from');\r\n to.classList.add('active');\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n from = to;\r\n\r\n if(onTransitionEnd) onTransitionEnd(id);\r\n return;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n content.dataset.timeout = '' + window.setTimeout(() => {\r\n to.classList.remove('to');\r\n from && from.classList.remove('from');\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n delete content.dataset.timeout;\r\n }, transitionTime);\r\n }\r\n\r\n if(from) {\r\n from.classList.remove('to');\r\n from.classList.add('from');\r\n }\r\n\r\n content.classList.add('animating'/* , 'disable-hover' */);\r\n const toRight = prevId < id;\r\n content.classList.toggle('backwards', !toRight);\r\n\r\n let onTransitionEndCallback: ReturnType;\r\n if(!to) {\r\n //prevTabContent.classList.remove('active');\r\n } else {\r\n if(animationFunction) {\r\n onTransitionEndCallback = animationFunction(to, from, toRight);\r\n } else {\r\n to.classList.add('active');\r\n }\r\n\r\n to.classList.remove('from');\r\n to.classList.add('to');\r\n }\r\n \r\n if(to) {\r\n onTransitionEndCallbacks.set(to, () => {\r\n to.classList.remove('to');\r\n onTransitionEndCallbacks.delete(to);\r\n });\r\n }\r\n\r\n if(from/* && false */) {\r\n const _from = from;\r\n const callback = () => {\r\n _from.classList.remove('active', 'from');\r\n\r\n if(onTransitionEndCallback) {\r\n onTransitionEndCallback();\r\n }\r\n\r\n onTransitionEndCallbacks.delete(_from);\r\n };\r\n\r\n if(to) {\r\n onTransitionEndCallbacks.set(_from, callback);\r\n } else {\r\n const timeout = window.setTimeout(callback, transitionTime);\r\n onTransitionEndCallbacks.set(_from, () => {\r\n clearTimeout(timeout);\r\n onTransitionEndCallbacks.delete(_from);\r\n });\r\n }\r\n\r\n if(isHeavy) {\r\n if(!animationDeferred) {\r\n animationDeferred = deferredPromise();\r\n // animationStarted = performance.now();\r\n }\r\n \r\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\r\n }\r\n }\r\n \r\n from = to;\r\n }\r\n\r\n //selectTab.prevId = -1;\r\n selectTab.prevId = () => from ? whichChild(from) : -1;\r\n \r\n return selectTab;\r\n};\r\n\r\nexport default Transition;\r\n","/*\r\n * https://github.com/morethanwords/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 { CancellablePromise, deferredPromise } from './cancellablePromise';\r\n\r\ninterface AnimationInstance {\r\n isCancelled: boolean;\r\n deferred: CancellablePromise\r\n}\r\n\r\ntype AnimationInstanceKey = any;\r\nconst instances: Map = new Map();\r\n\r\nexport function createAnimationInstance(key: AnimationInstanceKey) {\r\n cancelAnimationByKey(key);\r\n\r\n const instance: AnimationInstance = {\r\n isCancelled: false, \r\n deferred: deferredPromise()\r\n };\r\n\r\n instances.set(key, instance);\r\n instance.deferred.then(() => {\r\n instances.delete(key);\r\n });\r\n\r\n return instance;\r\n}\r\n\r\nexport function getAnimationInstance(key: AnimationInstanceKey) {\r\n return instances.get(key);\r\n}\r\n\r\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\r\n const instance = getAnimationInstance(key);\r\n if(instance) {\r\n instance.isCancelled = true;\r\n instance.deferred.resolve();\r\n }\r\n}\r\n\r\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\r\n if(!instance) {\r\n instance = createAnimationInstance(key);\r\n }\r\n\r\n fastRaf(() => {\r\n if(instance.isCancelled) {\r\n return;\r\n }\r\n \r\n if(tick()) {\r\n animateSingle(tick, key, instance);\r\n } else {\r\n instance.deferred.resolve();\r\n }\r\n });\r\n\r\n return instance.deferred;\r\n}\r\n\r\nexport function animate(tick: Function) {\r\n fastRaf(() => {\r\n if(tick()) {\r\n animate(tick);\r\n }\r\n });\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Dialog } from './appMessagesManager';\nimport { NULL_PEER_ID, UserAuth } from '../mtproto/mtproto_config';\nimport type { MyTopPeer, TopPeerType, User } from './appUsersManager';\nimport type { AuthState } from '../../types';\nimport type FiltersStorage from '../storages/filters';\nimport type DialogsStorage from '../storages/dialogs';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport { logger } from '../logger';\nimport { copy, setDeepProperty, validateInitObject } from '../../helpers/object';\nimport App from '../../config/app';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport AppStorage from '../storage';\nimport { Chat } from '../../layer';\nimport { IS_MOBILE } from '../../environment/userAgent';\nimport DATABASE_STATE from '../../config/databases/state';\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport compareVersion from '../../helpers/compareVersion';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n//const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\nconst STATE_VERSION = App.versionFull;\nconst BUILD = App.build;\n\nexport type Background = {\n type: 'color' | 'image' | 'default',\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string,\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n contactsList: UserId[],\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts: boolean\n private: boolean\n groups: boolean\n channels: boolean\n },\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\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: {\n type: 'image',\n blur: false,\n slug: 'ByxGo2lrMFAIAAAAmkJxZabh8eM', // * new blurred camomile,\n highlightningColor: 'hsla(85.5319, 36.9171%, 40.402%, 0.4)'\n }\n }, {\n name: 'night',\n background: {\n type: 'color',\n blur: false,\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)'\n }\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23'\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32)\n};\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS = ['contactsList', 'stateCreatedTime',\n 'maxSeenMsgId', 'filters', 'topPeers'] as any as Array;\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage';\n\n//const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise,\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void\n}> {\n public static STATE_INIT = STATE_INIT;\n private loaded: Promise;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map = new Map();\n\n public storages = {\n users: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'users'),\n chats: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'chats'),\n dialogs: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'dialogs')\n };\n\n public storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n\n public storage = stateStorage;\n\n public newVersion: string;\n\n constructor() {\n super();\n this.loadSavedState();\n }\n\n public loadSavedState(): Promise {\n if(this.loaded) return this.loaded;\n console.time('load state');\n this.loaded = new Promise((resolve) => {\n const storagesKeys = Object.keys(this.storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map(key => this.storages[key].getAll());\n\n const promises/* : Promise[] */ = ALL_KEYS.map(key => stateStorage.get(key))\n .concat(sessionStorage.get('user_auth'), sessionStorage.get('state_id'))\n .concat(stateStorage.get('user_auth')) // support old webk format\n .concat(storagesPromises);\n\n Promise.all(promises).then(async(arr) => {\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n \n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n \n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n let state: State = this.state = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n this.pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map(key => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n let obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n \n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ? \n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} : \n auth); // * support old version\n }\n\n // * Read storages\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n this.storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n \n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n \n state = this.state = copy(STATE_INIT);\n \n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n for(const key in this.storagesResults) {\n this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n this.storage.set(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n this.log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach(key => {\n this.pushToState(key, copy(STATE_INIT[key]));\n \n // @ts-ignore\n const s = this.storagesResults[key];\n if(s && s.length) {\n s.length = 0;\n }\n });\n };\n \n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n \n //state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n this.pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n this.pushToState('settings', state.settings);\n }\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n // @ts-ignore\n this.pushToState(missingKey, state[missingKey]);\n });\n\n if(state.version !== STATE_VERSION/* || true */) {\n // reset filters and dialogs if version is older\n if(compareVersion(state.version, '0.8.7') === -1) {\n this.state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n this.state.filters = copy(STATE_INIT.filters);\n const result = this.storagesResults.dialogs;\n if(result?.length) {\n result.length = 0;\n }\n }\n\n this.pushToState('version', this.newVersion = STATE_VERSION);\n this.pushToState('build', BUILD);\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n console.timeEnd('load state');\n resolve(state);\n }).catch(resolve);\n });\n\n return this.loaded;\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.dispatchEvent('settings_updated', {key, value});\n\n const first = key.split('.')[0];\n // @ts-ignore\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key]) {\n this.storage.set({\n [key]: value\n });\n }\n\n public requestPeer(peerId: PeerId, type: StatePeerType, limit?: number) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(type)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(type);\n\n this.dispatchEvent('peerNeeded', peerId);\n\n if(limit !== undefined) {\n this.keepPeerSingle(peerId, type);\n }\n }\n\n public requestPeerSingle(peerId: PeerId, type: StatePeerType, keepPeerIdSingle: PeerId = peerId) {\n return this.requestPeer(peerId, type + '_' + keepPeerIdSingle as any, 1);\n }\n\n public releaseSinglePeer(peerId: PeerId, type: StatePeerType) {\n return this.keepPeerSingle(NULL_PEER_ID, type + '_' + peerId as any);\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n\n public keepPeerSingle(peerId: PeerId, type: StatePeerType) {\n const existsPeerId = this.singlePeerMap.get(type);\n if(existsPeerId && existsPeerId !== peerId && this.neededPeers.has(existsPeerId)) {\n const set = this.neededPeers.get(existsPeerId);\n set.delete(type);\n\n if(!set.size) {\n this.neededPeers.delete(existsPeerId);\n this.dispatchEvent('peerUnneeded', existsPeerId);\n }\n }\n\n if(peerId) {\n this.singlePeerMap.set(type, peerId);\n } else {\n this.singlePeerMap.delete(type);\n }\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;\n","export default function 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\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(requestAnimationFrame);\r\n rafPromise.then(() => {\r\n rafPromise = undefined;\r\n });\r\n\r\n return rafPromise;\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n/* import { copy } from \"./object\";\r\n\r\nexport function listMergeSorted(list1: any[] = [], list2: any[] = []) {\r\n const result = copy(list1);\r\n\r\n const minId = list1.length ? list1[list1.length - 1] : 0xFFFFFFFF;\r\n for(let i = 0; i < list2.length; i++) {\r\n if(list2[i] < minId) {\r\n result.push(list2[i]);\r\n }\r\n }\r\n\r\n return result;\r\n} */\r\n\r\nexport const accumulate = (arr: number[], initialValue: number) => arr.reduce((acc, value) => acc + value, initialValue);\r\n\r\nexport function indexOfAndSplice(array: Array, item: T) {\r\n const idx = array.indexOf(item);\r\n const spliced = idx !== -1 && array.splice(idx, 1);\r\n return spliced && spliced[0];\r\n}\r\n\r\nexport function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\r\n const out: typeof array = [];\r\n let idx = -1;\r\n while((idx = array.findIndex(verify)) !== -1) {\r\n out.push(array.splice(idx, 1)[0]);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\r\n for(let length = array.length, i = length - 1; i >= 0; --i) {\r\n callback(array[i], i, array);\r\n }\r\n};\r\n\r\nexport function insertInDescendSortedArray(array: Array, element: T, property: K, pos?: number) {\r\n const sortProperty: number = element[property];\r\n\r\n if(pos === undefined) {\r\n pos = array.indexOf(element);\r\n if(pos !== -1) {\r\n const prev = array[pos - 1];\r\n const next = array[pos + 1];\r\n if((!prev || prev[property] >= sortProperty) && (!next || next[property] <= sortProperty)) {\r\n // console.warn('same pos', pos, sortProperty, prev, next);\r\n return pos;\r\n }\r\n \r\n array.splice(pos, 1);\r\n }\r\n }\r\n\r\n const len = array.length;\r\n if(!len || sortProperty <= array[len - 1][property]) {\r\n return array.push(element) - 1;\r\n } else if(sortProperty >= array[0][property]) {\r\n array.unshift(element);\r\n return 0;\r\n } else {\r\n for(let i = 0; i < len; i++) {\r\n if(sortProperty > array[i][property]) {\r\n array.splice(i, 0, element);\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n console.error('wtf', array, element);\r\n return array.indexOf(element);\r\n}\r\n\r\nexport function filterUnique>(arr: T): T {\r\n return [...new Set(arr)] as T;\r\n}\r\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"rlottie.worker.6777ef401e7048467332.bundle.worker.js\");\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport RLottieWorker from 'worker-loader!./rlottie/rlottie.worker';\r\nimport animationIntersector from \"../components/animationIntersector\";\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport EventListenerBase from \"../helpers/eventListenerBase\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { clamp } from '../helpers/number';\r\nimport { pause } from '../helpers/schedulers/pause';\r\nimport { IS_ANDROID, IS_APPLE, IS_APPLE_MOBILE, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { logger, LogTypes } from \"./logger\";\r\nimport apiManager from \"./mtproto/mtprotoworker\";\r\n\r\nlet convert = (value: number) => {\r\n\treturn Math.round(Math.min(Math.max(value, 0), 1) * 255);\r\n};\r\n\r\ntype RLottiePlayerListeners = 'enterFrame' | 'ready' | 'firstFrame' | 'cached';\r\ntype RLottieOptions = {\r\n container?: HTMLElement, \r\n autoplay?: boolean, \r\n animationData: string, \r\n loop?: boolean, \r\n width?: number,\r\n height?: number,\r\n group?: string,\r\n noCache?: true,\r\n needUpscale?: true,\r\n skipRatio?: number\r\n};\r\n\r\nexport class RLottiePlayer extends EventListenerBase<{\r\n enterFrame: (frameNo: number) => void,\r\n ready: () => void,\r\n firstFrame: () => void,\r\n cached: () => void\r\n}> {\r\n public static reqId = 0;\r\n\r\n public reqId = 0;\r\n public curFrame: number;\r\n public frameCount: number;\r\n public fps: number;\r\n public skipDelta: number;\r\n\r\n public worker: QueryableWorker;\r\n \r\n public width = 0;\r\n public height = 0;\r\n\r\n public el: HTMLElement;\r\n public canvas: HTMLCanvasElement;\r\n public context: CanvasRenderingContext2D;\r\n\r\n public paused = true;\r\n //public paused = false;\r\n public direction = 1;\r\n public speed = 1;\r\n public autoplay = true;\r\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\r\n public loop = true;\r\n public _loop: boolean; // ! will be used to store original value for settings.stickers.loop\r\n public group = '';\r\n\r\n private frInterval: number;\r\n private frThen: number;\r\n private rafId: number;\r\n\r\n //private caching = false;\r\n //private removed = false;\r\n\r\n private frames: {[frameNo: string]: Uint8ClampedArray} = {};\r\n public imageData: ImageData;\r\n public clamped: Uint8ClampedArray;\r\n public cachingDelta = 0;\r\n\r\n //private playedTimes = 0;\r\n\r\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\r\n private frameListener: () => void;\r\n\r\n constructor({worker, options}: {\r\n worker: QueryableWorker,\r\n options: RLottieOptions\r\n }) {\r\n super(true);\r\n\r\n this.reqId = ++RLottiePlayer['reqId'];\r\n this.el = options.container;\r\n this.worker = worker;\r\n\r\n for(let i in options) {\r\n if(this.hasOwnProperty(i)) {\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n this._loop = this.loop;\r\n this._autoplay = this.autoplay;\r\n\r\n // * Skip ratio (30fps)\r\n let skipRatio: number;\r\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\r\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI)) && this.width < 100 && this.height < 100) {\r\n skipRatio = 0.5;\r\n }\r\n\r\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\r\n\r\n //options.needUpscale = true;\r\n\r\n // * Pixel ratio\r\n //const pixelRatio = window.devicePixelRatio;\r\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\r\n if(pixelRatio > 1) {\r\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\r\n if(options.needUpscale) {\r\n this.width = Math.round(this.width * pixelRatio);\r\n this.height = Math.round(this.height * pixelRatio);\r\n } else if(pixelRatio > 1) {\r\n if(this.width > 100 && this.height > 100) {\r\n if(IS_APPLE || !mediaSizes.isMobile) {\r\n /* this.width = Math.round(this.width * (pixelRatio - 1));\r\n this.height = Math.round(this.height * (pixelRatio - 1)); */\r\n this.width = Math.round(this.width * pixelRatio);\r\n this.height = Math.round(this.height * pixelRatio);\r\n } else if(pixelRatio > 2.5) {\r\n this.width = Math.round(this.width * (pixelRatio - 1.5));\r\n this.height = Math.round(this.height * (pixelRatio - 1.5));\r\n }\r\n } else {\r\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\r\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\r\n }\r\n }\r\n }\r\n\r\n //options.noCache = true;\r\n \r\n // * Cache frames params\r\n if(!options.noCache/* && false */) {\r\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\r\n if(IS_APPLE && this.width > 100 && this.height > 100) {\r\n this.cachingDelta = 2; //2 // 50%\r\n } else if(this.width < 100 && this.height < 100) {\r\n this.cachingDelta = Infinity; // 100%\r\n } else {\r\n this.cachingDelta = 4; // 75%\r\n }\r\n }\r\n \r\n // this.cachingDelta = Infinity;\r\n // if(isApple) {\r\n // this.cachingDelta = 0; //2 // 50%\r\n // }\r\n\r\n /* this.width *= 0.8;\r\n this.height *= 0.8; */\r\n \r\n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\r\n this.canvas = document.createElement('canvas');\r\n this.canvas.classList.add('rlottie');\r\n this.canvas.width = this.width;\r\n this.canvas.height = this.height;\r\n this.context = this.canvas.getContext('2d');\r\n\r\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\r\n this.imageData = new ImageData(this.width, this.height);\r\n }\r\n\r\n public clearCache() {\r\n this.frames = {};\r\n }\r\n\r\n public sendQuery(methodName: string, ...args: any[]) {\r\n //console.trace('RLottie sendQuery:', methodName);\r\n this.worker.sendQuery(methodName, this.reqId, ...args);\r\n }\r\n\r\n public loadFromData(jsonString: string) {\r\n this.sendQuery('loadFromData', jsonString, this.width, this.height/* , this.canvas.transferControlToOffscreen() */);\r\n }\r\n\r\n public play() {\r\n if(!this.paused) return;\r\n\r\n //return;\r\n\r\n //console.log('RLOTTIE PLAY' + this.reqId);\r\n\r\n this.paused = false;\r\n this.setMainLoop();\r\n }\r\n\r\n public pause(clearPendingRAF = true) {\r\n if(this.paused) return;\r\n\r\n this.paused = true;\r\n if(clearPendingRAF) {\r\n clearTimeout(this.rafId);\r\n }\r\n //window.cancelAnimationFrame(this.rafId);\r\n }\r\n\r\n public stop(renderFirstFrame = true) {\r\n this.pause();\r\n\r\n this.curFrame = this.direction === 1 ? 0 : this.frameCount;\r\n if(renderFirstFrame) {\r\n this.requestFrame(this.curFrame);\r\n //this.sendQuery('renderFrame', this.curFrame);\r\n }\r\n }\r\n\r\n public restart() {\r\n this.stop(false);\r\n this.play();\r\n }\r\n\r\n public setSpeed(speed: number) {\r\n this.speed = speed;\r\n\r\n if(!this.paused) {\r\n this.setMainLoop();\r\n }\r\n }\r\n\r\n public setDirection(direction: number) {\r\n this.direction = direction;\r\n \r\n if(!this.paused) {\r\n this.setMainLoop();\r\n }\r\n }\r\n\r\n public remove() {\r\n //alert('remove');\r\n lottieLoader.onDestroy(this.reqId);\r\n this.pause();\r\n this.sendQuery('destroy');\r\n //this.removed = true;\r\n }\r\n\r\n public renderFrame2(frame: Uint8ClampedArray, frameNo: number) {\r\n /* this.setListenerResult('enterFrame', frameNo);\r\n return; */\r\n\r\n try {\r\n this.imageData.data.set(frame);\r\n \r\n //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\r\n //let perf = performance.now();\r\n this.context.putImageData(this.imageData, 0, 0);\r\n //console.log('renderFrame2 perf:', performance.now() - perf);\r\n } catch(err) {\r\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\r\n this.autoplay = false;\r\n this.pause();\r\n return;\r\n }\r\n \r\n //console.log('set result enterFrame', frameNo);\r\n this.dispatchEvent('enterFrame', frameNo);\r\n }\r\n\r\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\r\n //console.log('renderFrame', frameNo, this);\r\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames[frameNo]) {\r\n this.frames[frameNo] = new Uint8ClampedArray(frame);//frame;\r\n }\r\n\r\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\r\n this.setListenerResult('enterFrame', frameNo);\r\n if(frameNo === (this.frameCount - 1)) {\r\n this.setListenerResult('cached');\r\n }\r\n\r\n return;\r\n } */\r\n\r\n if(this.frInterval) {\r\n const now = Date.now(), delta = now - this.frThen;\r\n //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\r\n\r\n if(delta < 0) {\r\n if(this.rafId) clearTimeout(this.rafId);\r\n return this.rafId = window.setTimeout(() => {\r\n this.renderFrame2(frame, frameNo);\r\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\r\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\r\n }\r\n }\r\n\r\n this.renderFrame2(frame, frameNo);\r\n }\r\n\r\n public requestFrame(frameNo: number) {\r\n if(this.frames[frameNo]) {\r\n this.renderFrame(this.frames[frameNo], frameNo);\r\n } else if(IS_SAFARI) {\r\n this.sendQuery('renderFrame', frameNo);\r\n } else {\r\n if(!this.clamped.length) { // fix detached\r\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\r\n }\r\n \r\n this.sendQuery('renderFrame', frameNo, this.clamped);\r\n }\r\n }\r\n\r\n private mainLoopForwards() {\r\n const frame = (this.curFrame + this.skipDelta) >= this.frameCount ? this.curFrame = 0 : this.curFrame += this.skipDelta;\r\n //console.log('mainLoopForwards', this.curFrame, this.skipDelta, frame);\r\n\r\n this.requestFrame(frame);\r\n if((frame + this.skipDelta) >= this.frameCount) {\r\n //this.playedTimes++;\r\n\r\n if(!this.loop) {\r\n this.pause(false);\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n \r\n private mainLoopBackwards() {\r\n const frame = (this.curFrame - this.skipDelta) < 0 ? this.curFrame = this.frameCount - 1 : this.curFrame -= this.skipDelta;\r\n //console.log('mainLoopBackwards', this.curFrame, this.skipDelta, frame);\r\n\r\n this.requestFrame(frame);\r\n if((frame - this.skipDelta) < 0) {\r\n //this.playedTimes++;\r\n\r\n if(!this.loop) {\r\n this.pause(false);\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public setMainLoop() {\r\n //window.cancelAnimationFrame(this.rafId);\r\n clearTimeout(this.rafId);\r\n\r\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\r\n this.frThen = Date.now() - this.frInterval;\r\n\r\n //console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\r\n\r\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\r\n this.currentMethod = method;\r\n //this.frameListener && this.removeListener('enterFrame', this.frameListener);\r\n\r\n //setTimeout(() => {\r\n //this.addListener('enterFrame', this.frameListener);\r\n //}, 0);\r\n\r\n if(this.frameListener && this.listenerResults.hasOwnProperty('enterFrame')) {\r\n this.frameListener();\r\n }\r\n \r\n //this.mainLoop(method);\r\n //this.r(method);\r\n //method();\r\n }\r\n\r\n public async onLoad(frameCount: number, fps: number) {\r\n this.curFrame = this.direction === 1 ? 0 : frameCount - 1;\r\n this.frameCount = frameCount;\r\n this.fps = fps;\r\n\r\n // * Handle 30fps stickers if 30fps set\r\n if(this.fps < 60 && this.skipDelta !== 1) {\r\n const diff = 60 / fps;\r\n this.skipDelta = this.skipDelta / diff | 0;\r\n }\r\n\r\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\r\n this.frThen = Date.now() - this.frInterval;\r\n //this.sendQuery('renderFrame', 0);\r\n \r\n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс, \r\n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс. \r\n\r\n /* console.time('cache' + this.reqId);\r\n for(let i = 0; i < frameCount; ++i) {\r\n //if(this.removed) return;\r\n \r\n if(i % 4) {\r\n await new Promise((resolve) => {\r\n delete this.listenerResults.enterFrame;\r\n this.addListener('enterFrame', resolve, true);\r\n this.requestFrame(i);\r\n }); \r\n }\r\n }\r\n \r\n console.timeEnd('cache' + this.reqId); */\r\n //console.log('cached');\r\n /* this.el.innerHTML = '';\r\n this.el.append(this.canvas);\r\n return; */\r\n\r\n this.requestFrame(0);\r\n this.dispatchEvent('ready');\r\n this.addEventListener('enterFrame', () => {\r\n this.dispatchEvent('firstFrame');\r\n\r\n this.el && this.el.appendChild(this.canvas);\r\n\r\n //console.log('enterFrame firstFrame');\r\n \r\n //let lastTime = this.frThen;\r\n this.frameListener = () => {\r\n if(this.paused) {\r\n return;\r\n }\r\n\r\n const time = Date.now();\r\n //console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\r\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\r\n return;\r\n } */\r\n\r\n //lastTime = time;\r\n\r\n this.frThen = time + this.frInterval;\r\n const canContinue = this.currentMethod();\r\n if(!canContinue && !this.loop && this.autoplay) {\r\n this.autoplay = false;\r\n }\r\n };\r\n\r\n this.addEventListener('enterFrame', this.frameListener);\r\n }, {once: true});\r\n }\r\n}\r\n\r\nclass QueryableWorker extends EventListenerBase {\r\n constructor(private worker: Worker, private defaultListener: (data: any) => void = () => {}, onError?: (error: any) => void) {\r\n super();\r\n\r\n if(onError) {\r\n this.worker.onerror = onError;\r\n }\r\n\r\n this.worker.onmessage = (event) => {\r\n //return;\r\n //console.log('worker onmessage', event.data);\r\n if(event.data instanceof Object &&\r\n event.data.hasOwnProperty('queryMethodListener') &&\r\n event.data.hasOwnProperty('queryMethodArguments')) {\r\n /* if(event.data.queryMethodListener === 'frame') {\r\n return;\r\n } */\r\n\r\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\r\n } else {\r\n this.defaultListener.call(this, event.data);\r\n }\r\n };\r\n }\r\n\r\n public postMessage(message: any) {\r\n this.worker.postMessage(message);\r\n }\r\n\r\n public terminate() {\r\n this.worker.terminate();\r\n }\r\n\r\n public sendQuery(queryMethod: string, ...args: any[]) {\r\n if(IS_SAFARI) {\r\n this.worker.postMessage({\r\n 'queryMethod': queryMethod,\r\n 'queryMethodArguments': args\r\n });\r\n } else {\r\n //const transfer: (ArrayBuffer | OffscreenCanvas)[] = [];\r\n const transfer: ArrayBuffer[] = [];\r\n args.forEach(arg => {\r\n if(arg instanceof ArrayBuffer) {\r\n transfer.push(arg);\r\n }\r\n \r\n if(arg.buffer && arg.buffer instanceof ArrayBuffer) {\r\n transfer.push(arg.buffer);\r\n }\r\n });\r\n \r\n //console.log('transfer', transfer);\r\n this.worker.postMessage({\r\n 'queryMethod': queryMethod,\r\n 'queryMethodArguments': args\r\n }, transfer as PostMessageOptions);\r\n }\r\n }\r\n}\r\n\r\ntype LottieShape = {\r\n c: {\r\n k: number[]\r\n },\r\n ty: 'st' | 'fl',\r\n it?: LottieShape[]\r\n};\r\nclass LottieLoader {\r\n public isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\r\n public loadPromise: Promise = !this.isWebAssemblySupported ? Promise.reject() : undefined;\r\n public loaded = false;\r\n\r\n // https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\r\n private static COLORREPLACEMENTS = [\r\n [\r\n [0xf77e41, 0xcb7b55],\r\n\t\t\t[0xffb139, 0xf6b689],\r\n\t\t\t[0xffd140, 0xffcda7],\r\n\t\t\t[0xffdf79, 0xffdfc5],\r\n ],\r\n\r\n [\r\n [0xf77e41, 0xa45a38],\r\n\t\t\t[0xffb139, 0xdf986b],\r\n\t\t\t[0xffd140, 0xedb183],\r\n\t\t\t[0xffdf79, 0xf4c3a0],\r\n ],\r\n\r\n [\r\n [0xf77e41, 0x703a17],\r\n\t\t\t[0xffb139, 0xab673d],\r\n\t\t\t[0xffd140, 0xc37f4e],\r\n\t\t\t[0xffdf79, 0xd89667],\r\n ],\r\n\r\n [\r\n [0xf77e41, 0x4a2409],\r\n\t\t\t[0xffb139, 0x7d3e0e],\r\n\t\t\t[0xffd140, 0x965529],\r\n\t\t\t[0xffdf79, 0xa96337],\r\n ],\r\n\r\n [\r\n\t\t\t[0xf77e41, 0x200f0a],\r\n\t\t\t[0xffb139, 0x412924],\r\n\t\t\t[0xffd140, 0x593d37],\r\n\t\t\t[0xffdf79, 0x63453f],\r\n ]\r\n ];\r\n\r\n private workersLimit = 4;\r\n private players: {[reqId: number]: RLottiePlayer} = {};\r\n\r\n private workers: QueryableWorker[] = [];\r\n private curWorkerNum = 0;\r\n\r\n private log = logger('LOTTIE', LogTypes.Error);\r\n\r\n public getAnimation(element: HTMLElement) {\r\n for(const i in this.players) {\r\n if(this.players[i].el === element) {\r\n return this.players[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public setLoop(loop: boolean) {\r\n for(const i in this.players) {\r\n const player = this.players[i];\r\n player.loop = loop;\r\n player.autoplay = player._autoplay;\r\n }\r\n }\r\n\r\n public loadLottieWorkers() {\r\n if(this.loadPromise) {\r\n return this.loadPromise;\r\n }\r\n\r\n return this.loadPromise = new Promise((resolve, reject) => {\r\n let remain = this.workersLimit;\r\n for(let i = 0; i < this.workersLimit; ++i) {\r\n const worker = this.workers[i] = new QueryableWorker(new RLottieWorker());\r\n\r\n worker.addEventListener('ready', () => {\r\n this.log('worker #' + i + ' ready');\r\n\r\n worker.addEventListener('frame', this.onFrame);\r\n worker.addEventListener('loaded', this.onPlayerLoaded);\r\n worker.addEventListener('error', this.onPlayerError);\r\n\r\n --remain;\r\n if(!remain) {\r\n this.log('workers ready');\r\n resolve();\r\n this.loaded = true;\r\n }\r\n }, {once: true});\r\n }\r\n });\r\n }\r\n\r\n private applyReplacements(object: {\r\n layers: Array<{shapes: LottieShape[]}>\r\n }, toneIndex: number) {\r\n const replacements = LottieLoader.COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\r\n\r\n const applyTo = (smth: LottieShape) => {\r\n const k = smth.c.k;\r\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\r\n\r\n const foundReplacement = replacements.find(p => p[0] === color);\r\n if(foundReplacement) {\r\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\r\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\r\n k[2] = (foundReplacement[1] & 255) / 255;\r\n }\r\n\r\n //console.log('foundReplacement!', foundReplacement, color.toString(16), k);\r\n };\r\n\r\n const checkSmth = (smth: LottieShape) => {\r\n switch(smth.ty) {\r\n case 'st':\r\n case 'fl':\r\n applyTo(smth);\r\n break;\r\n }\r\n\r\n if(smth.hasOwnProperty('it')) {\r\n iterateIt(smth.it);\r\n }\r\n };\r\n\r\n const iterateIt = (it: LottieShape['it']) => {\r\n for(const smth of it) {\r\n checkSmth(smth);\r\n }\r\n };\r\n\r\n try {\r\n for(const layer of object.layers) {\r\n if(!layer.shapes) continue;\r\n \r\n for(const shape of layer.shapes) {\r\n if(!shape.it) {\r\n checkSmth(shape);\r\n continue;\r\n }\r\n\r\n iterateIt(shape.it);\r\n }\r\n }\r\n } catch(err) {\r\n this.log.warn('cant apply replacements', err, object, toneIndex);\r\n }\r\n }\r\n\r\n public loadAnimationFromURL(params: Omit, url: string): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n \r\n if(!this.loaded) {\r\n this.loadLottieWorkers();\r\n }\r\n \r\n return fetch(url)\r\n .then(res => res.arrayBuffer())\r\n .then(data => apiManager.invokeCrypto('gzipUncompress', data, true))\r\n /* .then(str => {\r\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n .then(str => {\r\n return this.loadAnimationWorker(Object.assign(params, {animationData: str as string/* JSON.parse(str) */, needUpscale: true}));\r\n });\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer): Promise {\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 ]);\r\n }\r\n\r\n public async loadAnimationWorker(params: RLottieOptions, group = '', toneIndex = -1): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n //params.autoplay = true;\r\n\r\n if(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(params.animationData);\r\n this.applyReplacements(newAnimationData, toneIndex);\r\n params.animationData = JSON.stringify(newAnimationData);\r\n }\r\n\r\n if(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if((!params.width || !params.height) && params.container) {\r\n params.width = parseInt(params.container.style.width);\r\n params.height = parseInt(params.container.style.height);\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n throw new Error('No size for sticker!');\r\n }\r\n\r\n params.group = group;\r\n\r\n const player = this.initPlayer(params);\r\n\r\n if(group !== 'none') {\r\n animationIntersector.addAnimation(player, group);\r\n }\r\n\r\n return player;\r\n }\r\n\r\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\r\n return;\r\n }\r\n\r\n this.log.debug('onPlayerLoaded');\r\n rlPlayer.onLoad(frameCount, fps);\r\n //rlPlayer.addListener('firstFrame', () => {\r\n //animationIntersector.addAnimation(player, group);\r\n //}, true);\r\n };\r\n\r\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\r\n return;\r\n }\r\n\r\n rlPlayer.clamped = frame;\r\n rlPlayer.renderFrame(frame, frameNo);\r\n };\r\n\r\n private onPlayerError = (reqId: number, error: Error) => {\r\n const rlPlayer = this.players[reqId];\r\n if(rlPlayer) {\r\n // ! will need refactoring later, this is not the best way to remove the animation\r\n const animations = animationIntersector.getAnimations(rlPlayer.el);\r\n animations.forEach(animation => {\r\n animationIntersector.checkAnimation(animation, true, true);\r\n });\r\n }\r\n };\r\n\r\n public onDestroy(reqId: number) {\r\n delete this.players[reqId];\r\n }\r\n\r\n public destroyWorkers() {\r\n this.workers.forEach((worker, idx) => {\r\n worker.terminate();\r\n this.log('worker #' + idx + ' terminated');\r\n });\r\n\r\n this.log('workers destroyed');\r\n this.workers.length = 0;\r\n }\r\n\r\n private initPlayer(options: RLottieOptions) {\r\n const rlPlayer = new RLottiePlayer({\r\n worker: this.workers[this.curWorkerNum++],\r\n options\r\n });\r\n\r\n this.players[rlPlayer.reqId] = rlPlayer;\r\n if(this.curWorkerNum >= this.workers.length) {\r\n this.curWorkerNum = 0;\r\n }\r\n\r\n rlPlayer.loadFromData(options.animationData);\r\n\r\n return rlPlayer;\r\n }\r\n}\r\n\r\nconst lottieLoader = new LottieLoader();\r\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\r\nexport default lottieLoader;\r\n","/*\r\n * https://github.com/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\nimport Page from \"./page\";\r\nimport lottieLoader from \"../lib/lottieLoader\";\r\nimport { horizontalMenu } from \"../components/horizontalMenu\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nclass PagesManager {\r\n private pageId = -1;\r\n private page: Page;\r\n\r\n private selectTab: ReturnType;\r\n public pagesDiv: HTMLDivElement;\r\n public scrollableDiv: HTMLElement;\r\n\r\n constructor() {\r\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\r\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\r\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\r\n if(this.page?.onShown) {\r\n this.page.onShown();\r\n }\r\n });\r\n }\r\n\r\n public setPage(page: Page) {\r\n if(page.isAuthPage) {\r\n this.pagesDiv.style.display = '';\r\n\r\n let id = whichChild(page.pageEl);\r\n if(this.pageId === id) return;\r\n\r\n this.selectTab(id);\r\n\r\n if(this.pageId !== -1 && id > 1) {\r\n lottieLoader.loadLottieWorkers();\r\n }\r\n\r\n\r\n\r\n this.pageId = id;\r\n\r\n if(this.scrollableDiv) {\r\n fastSmoothScroll(this.scrollableDiv, this.scrollableDiv.firstElementChild as HTMLElement, 'start');\r\n }\r\n } else {\r\n this.pagesDiv.style.display = 'none';\r\n page.pageEl.style.display = '';\r\n\r\n this.pageId = -1;\r\n }\r\n\r\n this.page = page;\r\n }\r\n}\r\n\r\nconst pagesManager = new PagesManager();\r\nMOUNT_CLASS_TO.pagesManager = pagesManager;\r\nexport default pagesManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pagesManager from \"./pagesManager\";\r\n\r\nexport default class Page {\r\n public pageEl: HTMLDivElement;\r\n private installed = false;\r\n\r\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\r\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\r\n }\r\n\r\n public async mount(...args: any[]) {\r\n //this.pageEl.style.display = '';\r\n\r\n if(this.onMount) {\r\n this.onMount(...args);\r\n }\r\n\r\n if(!this.installed) {\r\n if(this.onFirstMount) {\r\n try {\r\n const res = this.onFirstMount(...args);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n } catch(err) {\r\n console.error('PAGE MOUNT ERROR:', err);\r\n }\r\n }\r\n \r\n this.installed = true;\r\n }\r\n\r\n pagesManager.setPage(this);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport function numberThousandSplitter(x: number, joiner = ' ') {\r\n const parts = x.toString().split(\".\");\r\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\r\n return parts.join(\".\");\r\n}\r\n\r\nexport function formatBytes(bytes: number, decimals = 2) {\r\n if(bytes === 0) return '0 Bytes';\r\n\r\n const k = 1024;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\r\n}\r\n\r\nexport function formatNumber(bytes: number, decimals = 2) {\r\n if(bytes === 0) return '0';\r\n\r\n const k = 1000;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const sizes = ['', 'K', 'M', 'B', 'T'];\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\r\n}\r\n\r\nexport function clamp(v: number, min: number, max: number): number {\r\n return v < min ? min : ((v > max) ? max : v);\r\n}\r\n\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { RLottiePlayer } from \"../lib/lottieLoader\";\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 { indexOfAndSplice } from \"../helpers/array\";\r\n\r\nexport interface AnimationItem {\r\n el: HTMLElement,\r\n group: string,\r\n animation: RLottiePlayer | HTMLVideoElement\r\n};\r\n\r\nexport class AnimationIntersector {\r\n public observer: IntersectionObserver;\r\n private visible: Set = new Set();\r\n\r\n private byGroups: {[group: string]: AnimationItem[]} = {};\r\n private lockedGroups: {[group: string]: true} = {};\r\n private onlyOnePlayableGroup: string = '';\r\n \r\n private intersectionLockedGroups: {[group: string]: true} = {};\r\n private videosLocked = false;\r\n\r\n constructor() {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(rootScope.idle.isIDLE) return;\r\n\r\n for(const entry of entries) {\r\n const target = entry.target;\r\n\r\n for(const group in this.byGroups) {\r\n if(this.intersectionLockedGroups[group]) {\r\n continue;\r\n }\r\n\r\n const player = this.byGroups[group].find(p => p.el === target);\r\n if(player) {\r\n if(entry.isIntersecting) {\r\n this.visible.add(player);\r\n this.checkAnimation(player, false);\r\n } else {\r\n this.visible.delete(player);\r\n this.checkAnimation(player, true);\r\n\r\n if(player.animation instanceof RLottiePlayer/* && player.animation.cachingDelta === 2 */) {\r\n //console.warn('will clear cache', player);\r\n player.animation.clearCache();\r\n }\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_play', ({doc}) => {\r\n if(doc.type === 'round') {\r\n this.videosLocked = true;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_pause', () => {\r\n if(this.videosLocked) {\r\n this.videosLocked = false;\r\n this.checkAnimations();\r\n }\r\n });\r\n }\r\n\r\n public getAnimations(element: HTMLElement) {\r\n const found: AnimationItem[] = [];\r\n for(const group in this.byGroups) {\r\n for(const player of this.byGroups[group]) {\r\n if(player.el === element) {\r\n found.push(player);\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public removeAnimation(player: AnimationItem) {\r\n //console.log('destroy animation');\r\n const {el, animation} = player;\r\n animation.remove();\r\n\r\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n for(const group in this.byGroups) {\r\n indexOfAndSplice(this.byGroups[group], player);\r\n }\r\n \r\n this.observer.unobserve(el);\r\n this.visible.delete(player);\r\n }\r\n\r\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group = '') {\r\n const player = {\r\n el: animation instanceof RLottiePlayer ? animation.el : animation, \r\n animation: animation, \r\n group\r\n };\r\n\r\n if(animation instanceof RLottiePlayer) {\r\n if(!rootScope.settings.stickers.loop && animation.loop) {\r\n animation.loop = rootScope.settings.stickers.loop;\r\n }\r\n }\r\n\r\n (this.byGroups[group] ?? (this.byGroups[group] = [])).push(player);\r\n this.observer.observe(player.el);\r\n }\r\n\r\n public checkAnimations(blurred?: boolean, group?: string, destroy = false) {\r\n if(rootScope.idle.isIDLE) return;\r\n \r\n const groups = group /* && false */ ? [group] : Object.keys(this.byGroups);\r\n\r\n if(group && !this.byGroups[group]) {\r\n //console.warn('no animation group:', group);\r\n this.byGroups[group] = [];\r\n return;\r\n }\r\n\r\n for(const group of groups) {\r\n const animations = this.byGroups[group];\r\n\r\n animations.forEach(player => {\r\n this.checkAnimation(player, blurred, destroy);\r\n });\r\n }\r\n }\r\n\r\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\r\n const {el, animation, group} = player;\r\n //return;\r\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\r\n this.removeAnimation(player);\r\n return;\r\n }\r\n\r\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\r\n if(!animation.paused) {\r\n //console.warn('pause animation:', animation);\r\n animation.pause();\r\n }\r\n } else if(animation.paused && \r\n this.visible.has(player) && \r\n animation.autoplay && \r\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group)\r\n ) {\r\n //console.warn('play animation:', animation);\r\n animation.play();\r\n }\r\n }\r\n\r\n public setOnlyOnePlayableGroup(group: string) {\r\n this.onlyOnePlayableGroup = group;\r\n }\r\n\r\n public lockGroup(group: string) {\r\n this.lockedGroups[group] = true;\r\n }\r\n\r\n public unlockGroup(group: string) {\r\n delete this.lockedGroups[group];\r\n this.checkAnimations(undefined, group);\r\n }\r\n\r\n public refreshGroup(group: string) {\r\n const animations = this.byGroups[group];\r\n if(animations && animations.length) {\r\n animations.forEach(animation => {\r\n this.observer.unobserve(animation.el);\r\n });\r\n\r\n window.requestAnimationFrame(() => {\r\n animations.forEach(animation => {\r\n this.observer.observe(animation.el);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public lockIntersectionGroup(group: string) {\r\n this.intersectionLockedGroups[group] = true;\r\n }\r\n\r\n public unlockIntersectionGroup(group: string) {\r\n delete this.intersectionLockedGroups[group];\r\n this.refreshGroup(group);\r\n }\r\n}\r\n\r\nconst animationIntersector = new AnimationIntersector();\r\nif(MOUNT_CLASS_TO) {\r\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\r\n}\r\nexport default animationIntersector;","/*\r\n * https://github.com/morethanwords/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 { CancellablePromise, deferredPromise } from '../helpers/cancellablePromise';\r\nimport rootScope from '../lib/rootScope';\r\nimport DEBUG from '../config/debug';\r\nimport { pause } from '../helpers/schedulers/pause';\r\n\r\nconst ANIMATION_START_EVENT = 'event-heavy-animation-start';\r\nconst ANIMATION_END_EVENT = 'event-heavy-animation-end';\r\n\r\nlet isAnimating = false;\r\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\r\nlet promisesInQueue = 0;\r\n\r\nheavyAnimationPromise.resolve();\r\n\r\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\r\n\r\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\r\n if(!isAnimating) {\r\n heavyAnimationPromise = deferredPromise();\r\n rootScope.dispatchEvent(ANIMATION_START_EVENT);\r\n isAnimating = true;\r\n DEBUG && log('start');\r\n }\r\n \r\n ++promisesInQueue;\r\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\r\n\r\n const promises = [\r\n timeout !== undefined ? pause(timeout) : undefined,\r\n promise.finally(() => {})\r\n ].filter(Boolean);\r\n\r\n const perf = performance.now();\r\n const _heavyAnimationPromise = heavyAnimationPromise;\r\n Promise.race(promises).then(() => {\r\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\r\n return;\r\n }\r\n\r\n --promisesInQueue;\r\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\r\n if(promisesInQueue <= 0) {\r\n onHeavyAnimationEnd();\r\n }\r\n });\r\n\r\n return heavyAnimationPromise;\r\n}\r\n\r\nfunction onHeavyAnimationEnd() {\r\n if(heavyAnimationPromise.isFulfilled) {\r\n return;\r\n }\r\n\r\n isAnimating = false;\r\n promisesInQueue = 0;\r\n rootScope.dispatchEvent(ANIMATION_END_EVENT);\r\n heavyAnimationPromise.resolve();\r\n\r\n DEBUG && log('end');\r\n}\r\n\r\nexport function interruptHeavyAnimation() {\r\n onHeavyAnimationEnd();\r\n}\r\n\r\nexport function getHeavyAnimationPromise() {\r\n return heavyAnimationPromise;\r\n}\r\n\r\nexport default function(\r\n handleAnimationStart: AnyToVoidFunction,\r\n handleAnimationEnd: AnyToVoidFunction,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n //useEffect(() => {\r\n if(isAnimating) {\r\n handleAnimationStart();\r\n }\r\n\r\n const add = listenerSetter ? listenerSetter.add(rootScope) : rootScope.addEventListener.bind(rootScope);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, rootScope) : rootScope.removeEventListener.bind(rootScope);\r\n add(ANIMATION_START_EVENT, handleAnimationStart);\r\n add(ANIMATION_END_EVENT, handleAnimationEnd);\r\n\r\n return () => {\r\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\r\n remove(ANIMATION_START_EVENT, handleAnimationStart);\r\n };\r\n //}, [handleAnimationEnd, handleAnimationStart]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function whichChild(elem: Node) {\r\n if(!elem.parentNode) {\r\n return -1;\r\n }\r\n \r\n let i = 0;\r\n // @ts-ignore\r\n while((elem = elem.previousElementSibling) !== null) ++i;\r\n return i;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's fastSmoothScroll slightly patched\r\n\r\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\r\nimport { fastRaf } 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\n\r\nexport default function fastSmoothScroll(\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin = 0,\r\n maxDistance = LONG_TRANSITION_MAX_DISTANCE,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis: 'x' | 'y' = 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback\r\n) {\r\n //return;\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(forceDirection === FocusDirection.Static) {\r\n forceDuration = 0;\r\n return scrollWithJs(container, element, position, margin, forceDuration, axis, getNormalSize);\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 if(axis === 'y' && element !== container && isInDOM(element) && container.getBoundingClientRect) {\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect();\r\n \r\n const offsetTop = elementRect.top - containerRect.top;\r\n if(forceDirection === undefined) {\r\n if(offsetTop < -maxDistance) {\r\n container.scrollTop += (offsetTop + maxDistance);\r\n } else if(offsetTop > maxDistance) {\r\n container.scrollTop += (offsetTop - 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 /* const { offsetTop } = element;\r\n\r\n if(forceDirection === undefined) {\r\n const offset = offsetTop - container.scrollTop;\r\n\r\n if(offset < -maxDistance) {\r\n container.scrollTop += (offset + maxDistance);\r\n } else if(offset > maxDistance) {\r\n container.scrollTop += (offset - maxDistance);\r\n }\r\n } else if(forceDirection === FocusDirection.Up) {\r\n container.scrollTop = offsetTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) {\r\n container.scrollTop = Math.max(0, offsetTop - maxDistance);\r\n } */\r\n }\r\n\r\n const promise = new Promise((resolve) => {\r\n fastRaf(() => {\r\n scrollWithJs(container, element, position, margin, forceDuration, axis, getNormalSize)\r\n .then(resolve);\r\n });\r\n });\r\n\r\n return axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(\r\n container: HTMLElement, \r\n element: HTMLElement, \r\n position: ScrollLogicalPosition, \r\n margin = 0, \r\n forceDuration?: number, \r\n axis: 'x' | 'y' = 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback\r\n) {\r\n if(!isInDOM(element)) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n \r\n const rectStartKey = axis === 'y' ? 'top' : 'left';\r\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\r\n const sizeKey = axis === 'y' ? 'height' : 'width';\r\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\r\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\r\n\r\n //const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\r\n\r\n //const transformable = container.firstElementChild as HTMLElement;\r\n\r\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\r\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\r\n\r\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\r\n\r\n const 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];\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) - (containerSize / 2)\r\n : elementPosition - margin;\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 // console.log('scrollWithJs: will scroll path:', path, element);\r\n\r\n /* let existsTransform = 0;\r\n const currentTransform = transformable.style.transform;\r\n if(currentTransform) {\r\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\r\n //path += existsTransform;\r\n } */\r\n\r\n if(path < 0) {\r\n const remainingPath = -scrollPosition;\r\n path = Math.max(path, remainingPath);\r\n } else if(path > 0) {\r\n const remainingPath = scrollSize - (scrollPosition + containerSize);\r\n path = Math.min(path, remainingPath);\r\n }\r\n\r\n const target = container[scrollPositionKey] + path;\r\n const absPath = Math.abs(path);\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\r\n );\r\n const startAt = Date.now();\r\n\r\n /* transformable.classList.add('no-transition');\r\n\r\n const tickTransform = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const currentPath = path * transition(t);\r\n\r\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\r\n container.dataset.translate = '' + -currentPath;\r\n\r\n const willContinue = t < 1;\r\n if(!willContinue) {\r\n fastRaf(() => {\r\n delete container.dataset.transform;\r\n container.dataset.transform = '';\r\n transformable.style.transform = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n container[scrollPositionKey] = Math.round(target);\r\n });\r\n }\r\n\r\n return willContinue;\r\n };\r\n \r\n return animateSingle(tickTransform, container); */\r\n\r\n /* return new Promise((resolve) => {\r\n fastRaf(() => {\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n\r\n setTimeout(resolve, duration);\r\n });\r\n });\r\n\r\n const transformableHeight = transformable.scrollHeight;\r\n //transformable.style.minHeight = `${transformableHeight}px`;\r\n */\r\n\r\n const transition = absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\r\n const tick = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n\r\n const currentPath = path * (1 - transition(t));\r\n container[scrollPositionKey] = Math.round(target - currentPath);\r\n \r\n return t < 1;\r\n };\r\n\r\n if(!duration || !path) {\r\n cancelAnimationByKey(container);\r\n tick();\r\n return Promise.resolve();\r\n }\r\n\r\n /* return new Promise((resolve) => {\r\n setTimeout(resolve, duration);\r\n }).then(() => {\r\n transformable.classList.add('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n fastRaf(() => {\r\n \r\n container[scrollPositionKey] = Math.round(target);\r\n //transformable.style.minHeight = ``;\r\n });\r\n \r\n }); */\r\n\r\n 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"],"sourceRoot":""} \ No newline at end of file diff --git a/public/2.a1197bdcb1dacde64b1b.chunk.js b/public/2.a1197bdcb1dacde64b1b.chunk.js new file mode 100644 index 000000000..389d9948e --- /dev/null +++ b/public/2.a1197bdcb1dacde64b1b.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[2,27],{106:function(t,e,s){"use strict";function i(t,e){if(t.parentElement===e)return t;for(;t.parentElement;)if((t=t.parentElement).parentElement===e)return t;return null}s.d(e,"a",(function(){return i}))},111:function(t,e,s){"use strict";s.d(e,"c",(function(){return a})),s.d(e,"b",(function(){return o})),s.d(e,"a",(function(){return h}));var i=s(42),n=s(46);const r=new Map;function a(t){const e=function(t){return r.get(t)}(t);e&&(e.isCancelled=!0,e.deferred.resolve())}function o(t,e,s){return s||(s=function(t){a(t);const e={isCancelled:!1,deferred:Object(n.a)()};return r.set(t,e),e.deferred.then(()=>{r.delete(t)}),e}(e)),Object(i.b)(()=>{s.isCancelled||(t()?o(t,e,s):s.deferred.resolve())}),s.deferred}function h(t){Object(i.b)(()=>{t()&&h(t)})}},123:function(t,e,s){"use strict";s.d(e,"a",(function(){return c}));var i=s(124),n=s(15),r=s(42),a=s(89),o=s(106),h=s(84);function c(t,e,s,c,l=250,d){const u=Object(i.a)(e,t||"tabs"===e.dataset.animation?"tabs":"navigation",l,c);if(t){const i=new Proxy(u,{apply:(e,s,i)=>{const n=+i[0],r=void 0===i[1]||i[1],a=t.querySelector(`[data-tab="${n}"]`)||t.children[n];c(a,n,r)}}),c=(i,o,h=!0)=>{const c=e.children[o];if(s){const t=s(o,c,h);if(void 0!==t&&!t)return}d&&d.scrollIntoViewNew(i.parentElement.children[o],"center",void 0,void 0,h?void 0:a.a.Static,l,"x"),n.default.settings.animationsEnabled||(h=!1);const m=u.prevId();if(i.classList.contains("active")||o===m)return!1;const g=t.querySelector(p.toLowerCase()+".active");Object(r.b)(()=>{g&&g.classList.remove("active")}),f&&-1!==m&&h&&Object(r.b)(()=>{const t=i.querySelector("i"),e=i.parentElement.children[m].querySelector("i");e.classList.remove("animate"),t.classList.remove("animate");const s=e.parentElement.parentElement.offsetLeft-t.parentElement.parentElement.offsetLeft,n=e.clientWidth/t.clientWidth;t.style.transform=`translate3d(${s}px, 0, 0) scale3d(${n}, 1, 1)`,requestAnimationFrame(()=>{t.classList.add("animate"),t.style.transform="none"})}),Object(r.b)(()=>{i.classList.add("active")}),u(o,h)},f=!t.classList.contains("no-stripe"),p=t.firstElementChild.tagName;return t.addEventListener("click",(function(e){let s,i=e.target;if(i=Object(o.a)(i,t),!i)return!1;if(i.dataset.tab){if(s=+i.dataset.tab,-1===s)return!1}else s=Object(h.a)(i);c(i,s)})),i}return u}},124:function(t,e,s){"use strict";s.d(e,"a",(function(){return l}));var i=s(15),n=s(46),r=s(83),a=s(84),o=s(5);function h(t,e,s){const i=e.getBoundingClientRect().width,n=[t,e];return s&&n.reverse(),n[0].style.filter="brightness(80%)",n[0].style.transform=`translate3d(${.25*-i}px, 0, 0)`,n[1].style.transform=`translate3d(${i}px, 0, 0)`,t.classList.add("active"),t.offsetWidth,t.style.transform="",t.style.filter="",()=>{e.style.transform=e.style.filter=""}}function c(t,e,s){const i=e.getBoundingClientRect().width,n=[t,e];return s&&n.reverse(),n[0].style.transform=`translate3d(${-i}px, 0, 0)`,n[1].style.transform=`translate3d(${i}px, 0, 0)`,t.classList.add("active"),t.offsetWidth,t.style.transform="",()=>{e.style.transform=""}}const l=(t,e,s,i,n=!0)=>{let r=null;switch(e){case"tabs":r=c;break;case"navigation":r=h}return t.dataset.animation=e,d(t,r,s,i,n)},d=(t,e,s,h,c=!0,l=!1,d=!0)=>{const u=new Map;let f,p=null;if(d){const s=e?"transitionend":"animationend",i=e=>{if(Object(o.a)(e),e.target.parentElement!==t)return;const n=u.get(e.target);n&&n(),e.target===p&&(!f&&c||(f&&(f.resolve(),f=void 0),h&&h(m.prevId()),t.classList.remove("animating","backwards","disable-hover"),l&&(t.removeEventListener(s,i),p=f=void 0,u.clear())))};t.addEventListener(s,i)}function m(o,l=!0,g){g&&(p=g),o instanceof HTMLElement&&(o=Object(a.a)(o));const v=m.prevId();if(o===v)return!1;const y=t.children[o];if(i.default.settings.animationsEnabled&&-1!==v||(l=!1),!d){const e=t.dataset.timeout;void 0!==e&&clearTimeout(+e),delete t.dataset.timeout}if(!l){if(p)p.classList.remove("active","to","from");else if(y){const t=u.get(y);t&&t()}return y&&(y.classList.remove("to","from"),y.classList.add("active")),t.classList.remove("animating","backwards","disable-hover"),p=y,void(h&&h(o))}d||(t.dataset.timeout=""+window.setTimeout(()=>{y.classList.remove("to"),p&&p.classList.remove("from"),t.classList.remove("animating","backwards","disable-hover"),delete t.dataset.timeout},s)),p&&(p.classList.remove("to"),p.classList.add("from")),t.classList.add("animating");const b=v{y.classList.remove("to"),u.delete(y)}),p){const t=p,e=()=>{t.classList.remove("active","from"),w&&w(),u.delete(t)};if(y)u.set(t,e);else{const i=window.setTimeout(e,s);u.set(t,()=>{clearTimeout(i),u.delete(t)})}c&&(f||(f=Object(n.a)()),Object(r.b)(f,2*s))}p=y}return m.prevId=()=>p?Object(a.a)(p):-1,m}},141:function(t,e,s){"use strict";s.d(e,"a",(function(){return l}));var i=s(0),n=s(54),r=s(37),a=s(62),o=s(51),h=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};const c=new class{constructor(){this.cache=new Map}getCache(t){let e=this.cache.get(t);return e||this.cache.set(t,e={frames:new Map,counter:0}),++e.counter,e.frames}releaseCache(t){const e=this.cache.get(t);e&&!--e.counter&&this.cache.delete(t)}getCacheCounter(t){const e=this.cache.get(t);return null==e?void 0:e.counter}generateName(t,e,s,i,n){return[t,e,s,i?"colored":"",n||""].filter(Boolean).join("-")}};class l extends n.a{constructor({el:t,worker:e,options:s}){super(!0),this.reqId=0,this.width=0,this.height=0,this.paused=!0,this.direction=1,this.speed=1,this.autoplay=!0,this.loop=!0,this.group="",this.cachingDelta=0,this.reqId=++l.reqId,this.el=t,this.worker=e;for(let t in s)this.hasOwnProperty(t)&&(this[t]=s[t]);let n;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=s.initFrame,this.color=s.color,this.inverseColor=s.inverseColor,this.name=s.name,this.skipFirstFrameRendering=s.skipFirstFrameRendering,this.toneIndex=s.toneIndex,void 0!==s.skipRatio?n=s.skipRatio:(i.IS_ANDROID||i.IS_APPLE_MOBILE||i.IS_APPLE&&!i.IS_SAFARI)&&this.width<100&&this.height<100&&!s.needUpscale&&(n=.5),this.skipDelta=void 0!==n?1/n|0:1;const o=Object(a.a)(window.devicePixelRatio,1,2);o>1&&(s.needUpscale?(this.width=Math.round(this.width*o),this.height=Math.round(this.height*o)):o>1&&(this.width>100&&this.height>100?i.IS_APPLE||!r.b.isMobile?(this.width=Math.round(this.width*o),this.height=Math.round(this.height*o)):o>2.5&&(this.width=Math.round(this.width*(o-1.5)),this.height=Math.round(this.height*(o-1.5))):(this.width=Math.round(this.width*Math.max(1.5,o-1.5)),this.height=Math.round(this.height*Math.max(1.5,o-1.5))))),s.noCache||(i.IS_APPLE&&this.width>100&&this.height>100?this.cachingDelta=2:this.width<100&&this.height<100?this.cachingDelta=1/0:this.cachingDelta=4),this.canvas||(this.canvas=document.createElement("canvas"),this.canvas.classList.add("rlottie"),this.canvas.width=this.width,this.canvas.height=this.height),this.context=this.canvas.getContext("2d"),this.clamped=new Uint8ClampedArray(this.width*this.height*4),this.imageData=new ImageData(this.width,this.height),this.name?(this.cacheName=c.generateName(this.name,this.width,this.height,this.color,this.toneIndex),this.frames=c.getCache(this.cacheName)):this.frames=new Map}clearCache(){this.cacheName&&c.getCacheCounter(this.cacheName)>1||this.frames.clear()}sendQuery(t,...e){this.worker.sendQuery(t,this.reqId,...e)}loadFromData(t){this.sendQuery("loadFromData",t,this.width,this.height)}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(t=!0){if(!this.paused&&(this.paused=!0,t&&clearTimeout(this.rafId),this.onPauseCallback)){this.setSpeed(1),this.onPauseCallback=void 0;const t=this.onPauseCallback;t&&t()}}resetCurrentFrame(){return this.curFrame=this.initFrame||(1===this.direction?this.minFrame:this.maxFrame)}stop(t=!0){this.pause();const e=this.resetCurrentFrame();t&&this.requestFrame(e)}restart(){this.stop(!1),this.play()}setSpeed(t){this.speed!==t&&(this.speed=t,this.paused||this.setMainLoop())}setDirection(t){this.direction!==t&&(this.direction=t,this.paused||this.setMainLoop())}remove(){o.a.onDestroy(this.reqId),this.pause(),this.sendQuery("destroy"),this.cacheName&&c.releaseCache(this.cacheName)}applyColor(t){const[e,s,i]=this.color;for(let n=0,r=t.length;n{this.renderFrame2(t,e)},this.frInterval>-s?-s%this.frInterval:this.frInterval)}this.renderFrame2(t,e)}requestFrame(t){const e=this.frames.get(t);e?this.renderFrame(e,t):i.IS_SAFARI?this.sendQuery("renderFrame",t):(this.clamped.length||(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery("renderFrame",t,this.clamped))}mainLoopForwards(){const{skipDelta:t,maxFrame:e}=this,s=this.curFrame+t>e?this.curFrame=this.minFrame:this.curFrame+=t;return this.requestFrame(s),!(s+t>e&&!this.loop)||(this.pause(!1),!1)}mainLoopBackwards(){const{skipDelta:t,minFrame:e}=this,s=this.curFrame-te?1:-1,callback:i})}playToFrame(t){this.pause();const{frame:e,speed:s,callback:i,direction:n}=t;this.setDirection(void 0===n?this.curFrame>e?-1:1:n),void 0!==s&&this.setSpeed(s);const r=[this.curFrame,e];-1===this.direction&&r.reverse(),this.loop=!1,this.setMinMax(r[0],r[1]),this.onPauseCallback=i,this.play()}setColor(t){this.color=t,this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(t){this.inverseColor=t}setMinMax(t=0,e=this.frameCount-1){this.minFrame=t,this.maxFrame=e}onLoad(t,e){return h(this,void 0,void 0,(function*(){this.frameCount=t,this.fps=e,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=Object(a.a)(this.initFrame,this.minFrame,this.maxFrame));const s=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const t=60/e;this.skipDelta=this.skipDelta/t|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(s),this.dispatchEvent("ready"),this.addEventListener("enterFrame",()=>{this.dispatchEvent("firstFrame"),!this.canvas.parentNode&&this.el&&this.el.appendChild(this.canvas),this.frameListener=()=>{if(this.paused)return;const t=Date.now();this.frThen=t+this.frInterval;this.currentMethod()||this.loop||!this.autoplay||(this.autoplay=!1)},this.addEventListener("enterFrame",this.frameListener)},{once:!0})}))}}l.reqId=0},17:function(t,e,s){"use strict";s.r(e),s.d(e,"STATE_INIT",(function(){return b})),s.d(e,"AppStateManager",(function(){return L}));var i=s(45),n=s(54),r=s(15),a=s(80),o=s(43),h=s(32),c=s(8),l=s(29),d=s(99),u=s(0),f=s(120),p=s(67),m=s(65);var g=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};const v=c.a.versionFull,y=c.a.build,b={allDialogsLoaded:{},pinnedOrders:{},contactsList:[],updates:{},filters:{},maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],topPeersCache:{},recentSearch:[],version:v,build:y,authState:{_:u.IS_MOBILE?"authStateSignIn":"authStateSignQr"},hiddenPinnedMessages:{},settings:{messagesTextSize:16,sendShortcut:"enter",animationsEnabled:!0,autoDownload:{contacts:!0,private:!0,groups:!0,channels:!0},autoPlay:{gifs:!0,videos:!0},stickers:{suggest:!0,loop:!0},emoji:{suggest:!0,big:!0},themes:[{name:"day",background:{type:"image",blur:!1,slug:"ByxGo2lrMFAIAAAAmkJxZabh8eM",highlightningColor:"hsla(85.5319, 36.9171%, 40.402%, 0.4)"}},{name:"night",background:{type:"color",blur:!1,color:"#0f0f0f",highlightningColor:"hsla(0, 0%, 3.82353%, 0.4)"}}],theme:"system",notifications:{sound:!1},timeFormat:(new Date).toLocaleString().match(/\s(AM|PM)/)?"h12":"h23"},keepSigned:!0,chatContextMenuHintWasShown:!1,stateId:Object(m.a)(32)},w=Object.keys(b),k=["contactsList","stateCreatedTime","maxSeenMsgId","filters","topPeers"];class L extends n.a{constructor(){super(),this.log=Object(o.b)("STATE"),this.neededPeers=new Map,this.singlePeerMap=new Map,this.storages={users:new d.a(f.a,"users"),chats:new d.a(f.a,"chats"),dialogs:new d.a(f.a,"dialogs")},this.storagesResults={},this.storage=a.a,this.loadSavedState()}loadSavedState(){return this.loaded||(console.time("load state"),this.loaded=new Promise(t=>{const e=Object.keys(this.storages),s=e.map(t=>this.storages[t].getAll()),i=w.map(t=>a.a.get(t)).concat(p.a.get("user_auth"),p.a.get("state_id")).concat(a.a.get("user_auth")).concat(s);Promise.all(i).then(s=>g(this,void 0,void 0,(function*(){let i=this.state={};for(let t=0,e=w.length;ta.a.get(t)));t.push("user_auth"),e.push("number"==typeof n||"string"==typeof n?{dcID:e[0]||c.a.baseDcId,date:Date.now()/1e3|0,id:n.toPeerId(!1)}:n);let s={};t.forEach((t,i)=>{s[t]=e[i]}),yield p.a.set(s)}n&&(i.authState={_:"authStateSignedIn"},r.default.dispatchEvent("user_auth","number"==typeof n||"string"==typeof n?{dcID:0,date:Date.now()/1e3|0,id:n.toPeerId(!1)}:n));for(let t=0,i=e.length;t{t.set(s,Object(h.a)(i[s]))}),i=this.state=Object(h.a)(b),t.forEach((t,e)=>{i[e]=t});for(const t in this.storagesResults)this.storagesResults[t].length=0;this.storage.set(i)}yield p.a.set({state_id:i.stateId})}const u=Date.now();if(i.stateCreatedTime+864e5{t.forEach(t=>{this.pushToState(t,Object(h.a)(b[t]));const e=this.storagesResults[t];e&&e.length&&(e.length=0)})})(k)}if(!i.settings.hasOwnProperty("theme")&&i.settings.hasOwnProperty("nightTheme")&&(i.settings.theme=i.settings.nightTheme?"night":"day",this.pushToState("settings",i.settings)),!i.settings.hasOwnProperty("themes")&&i.settings.background){i.settings.themes=Object(h.a)(b.settings.themes);const t=i.settings.themes.find(t=>t.name===i.settings.theme);t&&(t.background=i.settings.background,this.pushToState("settings",i.settings))}if(Object(h.k)(b,i,t=>{this.pushToState(t,i[t])}),i.version!==v){if(-1===function(t,e){t=t.split(" ",1)[0],e=e.split(" ",1)[0];const s=t.split("."),i=e.split(".");for(let t=0;tn)return 1;if(et.reduce((t,e)=>t+e,e);function n(t,e){const s=t.indexOf(e),i=-1!==s&&t.splice(s,1);return i&&i[0]}function r(t,e){const s=[];let i=-1;for(;-1!==(i=t.findIndex(e));)s.push(t.splice(i,1)[0]);return s}function a(t,e){for(let s=t.length-1;s>=0;--s)e(t[s],s,t)}function o(t,e,s,i){const n=e[s];if(void 0===i&&-1!==(i=t.indexOf(e))){const e=t[i-1],r=t[i+1];if((!e||e[s]>=n)&&(!r||r[s]<=n))return i;t.splice(i,1)}const r=t.length;if(!r||n<=t[r-1][s])return t.push(e)-1;if(n>=t[0][s])return t.unshift(e),0;for(let i=0;it[i][s])return t.splice(i,0,e),i;return console.error("wtf",t,e),t.indexOf(e)}function h(t){return[...new Set(t)]}},42:function(t,e,s){"use strict";let i;function n(t){i?i.push(t):(i=[t],requestAnimationFrame(()=>{const t=i;i=void 0,t.forEach(t=>t())}))}s.d(e,"b",(function(){return n})),s.d(e,"c",(function(){return h})),s.d(e,"d",(function(){return c})),s.d(e,"a",(function(){return l}));let r,a,o=!1;function h(t){r?o?t():r.push(t):(r=[t],requestAnimationFrame(()=>{o=!0;for(let t=0;t{a=void 0}),a)}function l(){return new Promise(t=>{n(()=>{n(t)})})}},51:function(t,e,s){"use strict";function i(){return new Worker(s.p+"rlottie.worker.077a5af1cfa1feb04249.bundle.worker.js")}var n=s(68),r=s(29),a=s(82),o=s(43),h=s(33),c=s(141),l=s(0),d=s(54);class u extends d.a{constructor(t){super(),this.worker=t,this.worker.onerror=t=>{try{this.dispatchEvent("workerError",t),this.cleanup(),this.terminate()}catch(t){}},this.worker.onmessage=t=>{this.dispatchEvent(t.data.queryMethodListener,...t.data.queryMethodArguments)}}postMessage(t){this.worker.postMessage(t)}terminate(){this.worker.terminate()}sendQuery(t,...e){if(l.IS_SAFARI)this.worker.postMessage({queryMethod:t,queryMethodArguments:e});else{const s=[];e.forEach(t=>{t instanceof ArrayBuffer&&s.push(t),t.buffer&&t.buffer instanceof ArrayBuffer&&s.push(t.buffer)}),this.worker.postMessage({queryMethod:t,queryMethodArguments:e},s)}}}const f=[[[16219713,13335381],[16757049,16168585],[16765248,16764327],[16768889,16768965]],[[16219713,10771e3],[16757049,14653547],[16765248,15577475],[16768889,16040864]],[[16219713,7354903],[16757049,11233085],[16765248,12812110],[16768889,14194279]],[[16219713,4858889],[16757049,8207886],[16765248,9852201],[16768889,11100983]],[[16219713,2101002],[16757049,4270372],[16765248,5848375],[16768889,6505791]]];let p=t=>Math.round(255*Math.min(Math.max(t,0),1));function m(t,e){const s=f[Math.max(e-1,0)],i=t=>{switch(t.ty){case"st":case"fl":(t=>{const e=t.c.k,i=p(e[2])|p(e[1])<<8|p(e[0])<<16,n=s.find(t=>t[0]===i);n&&(e[0]=(n[1]>>16&255)/255,e[1]=(n[1]>>8&255)/255,e[2]=(255&n[1])/255)})(t)}t.hasOwnProperty("it")&&n(t.it)},n=t=>{for(const e of t)i(e)};try{for(const e of t.layers)if(e.shapes)for(const t of e.shapes)t.it?n(t.it):i(t)}catch(s){console.warn("cant apply replacements",s,t,e)}}var g=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};const v=new class{constructor(){this.isWebAssemblySupported="undefined"!=typeof WebAssembly,this.loadPromise=this.isWebAssemblySupported?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=4,this.players={},this.workers=[],this.curWorkerNum=0,this.log=Object(o.b)("LOTTIE",o.a.Error),this.onPlayerLoaded=(t,e,s)=>{const i=this.players[t];i?(this.log.debug("onPlayerLoaded"),i.onLoad(e,s)):this.log.warn("onPlayerLoaded on destroyed player:",t,e)},this.onFrame=(t,e,s)=>{const i=this.players[t];i?(i.clamped=s,i.renderFrame(s,e)):this.log.warn("onFrame on destroyed player:",t,e)},this.onPlayerError=(t,e)=>{const s=this.players[t];if(s){n.a.getAnimations(s.el).forEach(t=>{n.a.checkAnimation(t,!0,!0)})}}}getAnimation(t){for(const e in this.players)if(this.players[e].el===t)return this.players[e];return null}setLoop(t){for(const e in this.players){const s=this.players[e];s.loop=t,s.autoplay=s._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise((t,e)=>{let s=this.workersLimit;for(let n=0;n{this.log("worker #"+n+" ready"),r.addEventListener("frame",this.onFrame),r.addEventListener("loaded",this.onPlayerLoaded),r.addEventListener("error",this.onPlayerError),--s,s||(this.log("workers ready"),t(),this.loaded=!0)},{once:!0}),r.addEventListener("workerError",t=>{e("rlottie load error: "+t.message),this.loaded=!1},{once:!0})}})}loadAnimationAsAsset(t,e){return t.name=e,this.loadAnimationFromURL(t,"assets/tgs/"+e+".json")}loadAnimationFromURL(t,e){return this.isWebAssemblySupported?(this.loaded||this.loadLottieWorkers(),fetch(e).then(t=>t.headers&&"application/octet-stream"!==t.headers.get("content-type")?t.text():t.arrayBuffer().then(t=>h.a.invokeCrypto("gzipUncompress",t,!0))).then(s=>{const i=Object.assign(t,{animationData:s,needUpscale:!0});return i.name||(i.name=e),this.loadAnimationWorker(i)})):this.loadPromise}waitForFirstFrame(t){return Promise.race([new Promise(e=>{t.addEventListener("firstFrame",e,{once:!0})}),Object(a.a)(2500)]).then(()=>t)}loadAnimationWorker(t,e=t.group||"",s=-1){return g(this,void 0,void 0,(function*(){if(!this.isWebAssemblySupported)return this.loadPromise;if(s>=1&&s<=5){t.toneIndex=s;const e=JSON.parse(t.animationData);m(e,s),t.animationData=JSON.stringify(e)}if(this.loaded||(yield this.loadLottieWorkers()),t.width&&t.height||(t.width=parseInt(t.container.style.width),t.height=parseInt(t.container.style.height)),!t.width||!t.height)throw new Error("No size for sticker!");t.group=e;const i=this.initPlayer(t.container,t);return"none"!==e&&n.a.addAnimation(i,e),i}))}onDestroy(t){delete this.players[t]}destroyWorkers(){this.workers.forEach((t,e)=>{t.terminate(),this.log("worker #"+e+" terminated")}),this.log("workers destroyed"),this.workers.length=0}initPlayer(t,e){const s=new c.a({el:t,worker:this.workers[this.curWorkerNum++],options:e});return this.players[s.reqId]=s,this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),s.loadFromData(e.animationData),s}};r.a.lottieLoader=v;e.a=v},61:function(t,e,s){"use strict";function i(t){return null==t?void 0:t.isConnected}s.d(e,"a",(function(){return i}))},62:function(t,e,s){"use strict";function i(t,e=" "){const s=t.toString().split(".");return s[0]=s[0].replace(/\B(?=(\d{3})+(?!\d))/g,e),s.join(".")}function n(t,e=2){if(0===t)return"0 Bytes";const s=e<0?0:e,i=Math.floor(Math.log(t)/Math.log(1024));return parseFloat((t/Math.pow(1024,i)).toFixed(s))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][i]}function r(t,e=2){if(0===t)return"0";const s=e<0?0:e,i=Math.floor(Math.log(t)/Math.log(1e3));return parseFloat((t/Math.pow(1e3,i)).toFixed(s))+["","K","M","B","T"][i]}function a(t,e,s){return ts?s:t}s.d(e,"d",(function(){return i})),s.d(e,"b",(function(){return n})),s.d(e,"c",(function(){return r})),s.d(e,"a",(function(){return a}))},64:function(t,e,s){"use strict";s.d(e,"a",(function(){return d}));var i=s(51),n=s(123),r=s(29),a=s(89),o=s(84);const h=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=Object(n.a)(null,this.scrollableDiv.querySelector(".tabs-container"),null,()=>{var t;(null===(t=this.page)||void 0===t?void 0:t.onShown)&&this.page.onShown()})}setPage(t){if(t.isAuthPage){this.pagesDiv.style.display="";let e=Object(o.a)(t.pageEl);if(this.pageId===e)return;this.selectTab(e),-1!==this.pageId&&e>1&&i.a.loadLottieWorkers(),this.pageId=e,this.scrollableDiv&&Object(a.b)(this.scrollableDiv,this.scrollableDiv.firstElementChild,"start")}else this.pagesDiv.style.display="none",t.pageEl.style.display="",this.pageId=-1;this.page=t}};r.a.pagesManager=h;var c=h,l=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};class d{constructor(t,e,s,i,n){this.isAuthPage=e,this.onFirstMount=s,this.onMount=i,this.onShown=n,this.installed=!1,this.pageEl=document.body.querySelector("."+t)}mount(...t){return l(this,void 0,void 0,(function*(){if(this.onMount&&this.onMount(...t),!this.installed){if(this.onFirstMount)try{const e=this.onFirstMount(...t);e instanceof Promise&&(yield e)}catch(t){console.error("PAGE MOUNT ERROR:",t)}this.installed=!0}c.setPage(this)}))}}},68:function(t,e,s){"use strict";var i=s(15),n=s(0),r=s(29),a=s(61),o=s(41),h=s(141);const c=new class{constructor(){this.visible=new Set,this.byGroups={},this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,this.observer=new IntersectionObserver(t=>{if(!i.default.idle.isIDLE)for(const e of t){const t=e.target;for(const s in this.byGroups){if(this.intersectionLockedGroups[s])continue;const i=this.byGroups[s].find(e=>e.el===t);if(i){e.isIntersecting?(this.visible.add(i),this.checkAnimation(i,!1)):(this.visible.delete(i),this.checkAnimation(i,!0),i.animation instanceof h.a&&i.animation.clearCache());break}}}}),i.default.addEventListener("media_play",({doc:t})=>{"round"===t.type&&(this.videosLocked=!0,this.checkAnimations())}),i.default.addEventListener("media_pause",()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations())})}getAnimations(t){const e=[];for(const s in this.byGroups)for(const i of this.byGroups[s])i.el===t&&e.push(i);return e}removeAnimation(t){const{el:e,animation:s}=t;s.remove(),s instanceof HTMLVideoElement&&n.IS_SAFARI&&setTimeout(()=>{s.src="",s.load()},1e3);for(const e in this.byGroups)Object(o.e)(this.byGroups[e],t);this.observer.unobserve(e),this.visible.delete(t)}addAnimation(t,e=""){var s;const n={el:t instanceof h.a?t.el:t,animation:t,group:e};t instanceof h.a&&!i.default.settings.stickers.loop&&t.loop&&(t.loop=i.default.settings.stickers.loop),(null!==(s=this.byGroups[e])&&void 0!==s?s:this.byGroups[e]=[]).push(n),this.observer.observe(n.el)}checkAnimations(t,e,s=!1){if(i.default.idle.isIDLE)return;const n=e?[e]:Object.keys(this.byGroups);if(!e||this.byGroups[e])for(const e of n){this.byGroups[e].forEach(e=>{this.checkAnimation(e,t,s)})}else this.byGroups[e]=[]}checkAnimation(t,e=!1,s=!1){const{el:i,animation:n,group:r}=t;s||!Object(a.a)(i)&&!this.lockedGroups[r]?this.removeAnimation(t):e||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==r||n instanceof HTMLVideoElement&&this.videosLocked?n.paused||n.pause():n.paused&&this.visible.has(t)&&n.autoplay&&(!this.onlyOnePlayableGroup||this.onlyOnePlayableGroup===r)&&n.play()}setOnlyOnePlayableGroup(t){this.onlyOnePlayableGroup=t}lockGroup(t){this.lockedGroups[t]=!0}unlockGroup(t){delete this.lockedGroups[t],this.checkAnimations(void 0,t)}refreshGroup(t){const e=this.byGroups[t];e&&e.length&&(e.forEach(t=>{this.observer.unobserve(t.el)}),window.requestAnimationFrame(()=>{e.forEach(t=>{this.observer.observe(t.el)})}))}lockIntersectionGroup(t){this.intersectionLockedGroups[t]=!0}unlockIntersectionGroup(t){delete this.intersectionLockedGroups[t],this.refreshGroup(t)}};r.a&&(r.a.animationIntersector=c),e.a=c},83:function(t,e,s){"use strict";s.d(e,"b",(function(){return d})),s.d(e,"d",(function(){return f})),s.d(e,"c",(function(){return p}));var i=s(46),n=s(15),r=s(29),a=s(82);let o=!1,h=Object(i.a)(),c=0;h.resolve();const l=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function d(t,e){o||(h=Object(i.a)(),n.default.dispatchEvent("event-heavy-animation-start"),o=!0,r.b&&l("start")),++c,r.b&&l("attach promise, length:",c,e);const s=[void 0!==e?Object(a.a)(e):void 0,t.finally(()=>{})].filter(Boolean),d=performance.now(),f=h;return Promise.race(s).then(()=>{h!==f||h.isFulfilled||(--c,r.b&&l("promise end, length:",c,performance.now()-d),c<=0&&u())}),h}function u(){h.isFulfilled||(o=!1,c=0,n.default.dispatchEvent("event-heavy-animation-end"),h.resolve(),r.b&&l("end"))}function f(){u()}function p(){return h}e.a=function(t,e,s){o&&t();const i=s?s.add(n.default):n.default.addEventListener.bind(n.default),r=s?s.removeManual.bind(s,n.default):n.default.removeEventListener.bind(n.default);return i("event-heavy-animation-start",t),i("event-heavy-animation-end",e),()=>{r("event-heavy-animation-end",e),r("event-heavy-animation-start",t)}}},84:function(t,e,s){"use strict";function i(t){if(!t.parentNode)return-1;let e=0;for(;null!==(t=t.previousElementSibling);)++e;return e}s.d(e,"a",(function(){return i}))},89:function(t,e,s){"use strict";s.d(e,"a",(function(){return h})),s.d(e,"b",(function(){return c}));var i=s(83),n=s(42),r=s(111),a=s(15),o=s(61);var h;function c(t,e,s,r=0,c=1500,d,u,f="y",p){if(a.default.settings.animationsEnabled||(d=h.Static),d===h.Static)return l(t,e,s,r,u=0,f,p);if("y"===f&&e!==t&&Object(o.a)(e)&&t.getBoundingClientRect){const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),n=s.top-i.top;void 0===d?n<-c?t.scrollTop+=n+c:n>c&&(t.scrollTop+=n-c):d===h.Up?t.scrollTop=n+t.scrollTop+c:d===h.Down&&(t.scrollTop=Math.max(0,n+t.scrollTop-c))}const m=new Promise(i=>{Object(n.b)(()=>{l(t,e,s,r,u,f,p).then(i)})});return"y"===f?Object(i.b)(m):m}function l(t,e,s,i=0,n,a="y",h){if(!Object(o.a)(e))return Object(r.c)(t),Promise.resolve();const c="y"===a?"top":"left",l="y"===a?"bottom":"right",f="y"===a?"height":"width",p="y"===a?"scrollHeight":"scrollWidth",m="y"===a?"scrollTop":"scrollLeft",g=e.getBoundingClientRect(),v=t.getBoundingClientRect?t.getBoundingClientRect():document.body.getBoundingClientRect(),y=g[c]-v[c],b=e[p],w=h?h({rect:v}):v[f],k=t[m],L=t[p];let F;switch(s){case"start":F=y-i;break;case"end":F=g[l]+(b-g[f])-v[l];break;case"nearest":case"center":F=b0){const t=L-(k+w);F=Math.min(F,t)}const P=t[m]+F,M=Math.abs(F),I=null!=n?n:250+M/1500*350,S=Date.now(),E=M<500?u:d,O=()=>{const e=I?Math.min((Date.now()-S)/I,1):1,s=F*(1-E(e));return t[m]=Math.round(P-s),e<1};return I&&F?Object(r.b)(O,t):(Object(r.c)(t),O(),Promise.resolve())}function d(t){return 1-Math.pow(1-t,5)}function u(t){return 1-Math.pow(1-t,3.5)}!function(t){t[t.Up=0]="Up",t[t.Down=1]="Down",t[t.Static=2]="Static"}(h||(h={}))}}]); +//# sourceMappingURL=2.a1197bdcb1dacde64b1b.chunk.js.map \ No newline at end of file diff --git a/public/2.a1197bdcb1dacde64b1b.chunk.js.map b/public/2.a1197bdcb1dacde64b1b.chunk.js.map new file mode 100644 index 000000000..3b942f6ce --- /dev/null +++ b/public/2.a1197bdcb1dacde64b1b.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/dom/findUpAsChild.ts","webpack:///./src/helpers/animation.ts","webpack:///./src/components/horizontalMenu.ts","webpack:///./src/components/transition.ts","webpack:///./src/lib/rlottie/rlottiePlayer.ts","webpack:///./src/lib/appManagers/appStateManager.ts","webpack:///./src/helpers/compareVersion.ts","webpack:///./src/helpers/array.ts","webpack:///./src/helpers/schedulers.ts","webpack:///./src/lib/rlottie/rlottie.worker.ts","webpack:///./src/lib/rlottie/queryableWorker.ts","webpack:///./src/lib/rlottie/applyReplacements.ts","webpack:///./src/lib/rlottie/lottieLoader.ts","webpack:///./src/helpers/dom/isInDOM.ts","webpack:///./src/helpers/number.ts","webpack:///./src/pages/pagesManager.ts","webpack:///./src/pages/page.ts","webpack:///./src/components/animationIntersector.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/helpers/dom/whichChild.ts","webpack:///./src/helpers/fastSmoothScroll.ts"],"names":["findUpAsChild","el","parent","parentElement","instances","Map","cancelAnimationByKey","key","instance","get","getAnimationInstance","isCancelled","deferred","resolve","animateSingle","tick","set","then","delete","createAnimationInstance","animate","horizontalMenu","tabs","content","onClick","onTransitionEnd","transitionTime","scrollableX","selectTab","dataset","animation","proxy","Proxy","apply","target","that","args","id","undefined","querySelector","children","selectTarget","tabContent","canChange","scrollIntoViewNew","Static","settings","animationsEnabled","prevId","classList","contains","prev","tagName","toLowerCase","remove","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","style","transform","requestAnimationFrame","add","firstElementChild","addEventListener","e","tab","slideNavigation","prevTabContent","toRight","width","getBoundingClientRect","elements","reverse","filter","offsetWidth","slideTabs","TransitionSlider","type","isHeavy","animationFunction","Transition","once","withAnimationListener","onTransitionEndCallbacks","animationDeferred","from","listenerName","onEndEvent","callback","removeEventListener","clear","overrideFrom","HTMLElement","to","timeout","clearTimeout","window","setTimeout","onTransitionEndCallback","toggle","_from","cache","this","name","frames","counter","height","color","toneIndex","Boolean","join","RLottiePlayer","worker","options","super","reqId","paused","direction","speed","autoplay","loop","group","cachingDelta","i","hasOwnProperty","skipRatio","_loop","_autoplay","initFrame","inverseColor","skipFirstFrameRendering","needUpscale","skipDelta","pixelRatio","devicePixelRatio","Math","round","isMobile","max","noCache","Infinity","canvas","document","createElement","context","getContext","clamped","Uint8ClampedArray","imageData","ImageData","cacheName","generateName","getCache","getCacheCounter","methodName","sendQuery","jsonString","setMainLoop","clearPendingRAF","rafId","onPauseCallback","setSpeed","curFrame","minFrame","maxFrame","renderFirstFrame","pause","resetCurrentFrame","requestFrame","stop","play","onDestroy","releaseCache","frame","r","g","b","length","frameNo","applyColor","applyInversing","data","putImageData","err","console","error","dispatchEvent","has","frInterval","delta","Date","now","frThen","renderFrame2","renderFrame","fps","method","mainLoopForwards","mainLoopBackwards","bind","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","setDirection","bounds","setMinMax","frameCount","diff","parentNode","appendChild","time","STATE_VERSION","versionFull","BUILD","build","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsList","updates","filters","maxSeenMsgId","stateCreatedTime","recentEmoji","topPeersCache","recentSearch","version","authState","_","hiddenPinnedMessages","messagesTextSize","sendShortcut","autoDownload","contacts","private","groups","channels","autoPlay","gifs","videos","stickers","suggest","emoji","big","themes","background","blur","slug","highlightningColor","theme","notifications","sound","timeFormat","toLocaleString","match","keepSigned","chatContextMenuHintWasShown","stateId","ALL_KEYS","Object","keys","REFRESH_KEYS","log","logger","neededPeers","singlePeerMap","storages","users","chats","dialogs","storagesResults","storage","stateStorage","loadSavedState","loaded","Promise","storagesKeys","storagesPromises","map","getAll","promises","concat","sessionStorage","all","arr","state","value","pushToState","splice","auth","shift","shiftedWebKAuth","push","values","dcID","baseDcId","date","toPeerId","obj","forEach","idx","rootScope","preserve","state_id","s","nightTheme","find","t","missingKey","v1","v2","split","s1","s2","compareVersion","result","newVersion","timeEnd","catch","first","direct","setKeyValueToStorage","peerId","limit","Set","keepPeerSingle","keepPeerIdSingle","requestPeer","existsPeerId","size","appStateManager","accumulate","initialValue","reduce","acc","indexOfAndSplice","array","item","indexOf","spliced","findAndSpliceAll","verify","out","findIndex","forEachReverse","insertInDescendSortedArray","element","property","pos","sortProperty","next","len","unshift","filterUnique","fastRafCallbacks","fastRaf","currentCallbacks","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","Worker_fn","Worker","onerror","cleanup","terminate","onmessage","event","queryMethodListener","queryMethodArguments","message","postMessage","queryMethod","transfer","arg","ArrayBuffer","buffer","COLORREPLACEMENTS","convert","min","applyReplacements","object","replacements","checkSmth","smth","ty","k","c","foundReplacement","p","applyTo","iterateIt","it","layer","layers","shapes","shape","warn","lottieLoader","isWebAssemblySupported","loadPromise","reject","workersLimit","players","workers","curWorkerNum","Error","onPlayerLoaded","rlPlayer","debug","onLoad","onFrame","onPlayerError","animationIntersector","getAnimations","checkAnimation","player","remain","params","loadAnimationFromURL","url","loadLottieWorkers","fetch","res","headers","text","arrayBuffer","invokeCrypto","str","newParams","assign","animationData","loadAnimationWorker","race","newAnimationData","JSON","parse","stringify","parseInt","container","initPlayer","addAnimation","loadFromData","isInDOM","isConnected","numberThousandSplitter","x","joiner","parts","toString","replace","formatBytes","bytes","decimals","dm","floor","parseFloat","pow","toFixed","formatNumber","clamp","v","pagesManager","pageId","pagesDiv","getElementById","scrollableDiv","page","onShown","isAuthPage","display","whichChild","pageEl","fastSmoothScroll","className","onFirstMount","onMount","installed","body","setPage","visible","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","observer","IntersectionObserver","entries","idle","isIDLE","entry","isIntersecting","clearCache","doc","checkAnimations","found","HTMLVideoElement","src","load","unobserve","observe","blurred","destroy","removeAnimation","animations","refreshGroup","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","promise","finally","perf","performance","_heavyAnimationPromise","isFulfilled","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","listenerSetter","removeManual","elem","previousElementSibling","FocusDirection","position","margin","maxDistance","forceDirection","forceDuration","axis","getNormalSize","scrollWithJs","elementRect","containerRect","offsetTop","top","scrollTop","Up","Down","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementPosition","elementSize","containerSize","rect","scrollPosition","scrollSize","path","remainingPath","absPath","abs","duration","startAt","transition","shortTransition","longTransition","currentPath"],"mappings":"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","file":"2.a1197bdcb1dacde64b1b.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's animation.ts\r\n\r\nimport { fastRaf } from './schedulers';\r\nimport { CancellablePromise, deferredPromise } from './cancellablePromise';\r\n\r\ninterface AnimationInstance {\r\n isCancelled: boolean;\r\n deferred: CancellablePromise\r\n}\r\n\r\ntype AnimationInstanceKey = any;\r\nconst instances: Map = new Map();\r\n\r\nexport function createAnimationInstance(key: AnimationInstanceKey) {\r\n cancelAnimationByKey(key);\r\n\r\n const instance: AnimationInstance = {\r\n isCancelled: false, \r\n deferred: deferredPromise()\r\n };\r\n\r\n instances.set(key, instance);\r\n instance.deferred.then(() => {\r\n instances.delete(key);\r\n });\r\n\r\n return instance;\r\n}\r\n\r\nexport function getAnimationInstance(key: AnimationInstanceKey) {\r\n return instances.get(key);\r\n}\r\n\r\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\r\n const instance = getAnimationInstance(key);\r\n if(instance) {\r\n instance.isCancelled = true;\r\n instance.deferred.resolve();\r\n }\r\n}\r\n\r\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\r\n if(!instance) {\r\n instance = createAnimationInstance(key);\r\n }\r\n\r\n fastRaf(() => {\r\n if(instance.isCancelled) {\r\n return;\r\n }\r\n \r\n if(tick()) {\r\n animateSingle(tick, key, instance);\r\n } else {\r\n instance.deferred.resolve();\r\n }\r\n });\r\n\r\n return instance.deferred;\r\n}\r\n\r\nexport function animate(tick: Function) {\r\n fastRaf(() => {\r\n if(tick()) {\r\n animate(tick);\r\n }\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { TransitionSlider } from \"./transition\";\r\nimport { ScrollableX } from \"./scrollable\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nexport function horizontalMenu(tabs: HTMLElement, content: HTMLElement, onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean, onTransitionEnd?: () => void, transitionTime = 250, scrollableX?: ScrollableX) {\r\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd);\r\n\r\n if(tabs) {\r\n const proxy = new Proxy(selectTab, {\r\n apply: (target, that, args) => {\r\n const id = +args[0];\r\n const animate = args[1] !== undefined ? args[1] : true;\r\n \r\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\r\n selectTarget(el, id, animate);\r\n }\r\n });\r\n\r\n const selectTarget = (target: HTMLElement, id: number, animate = true) => {\r\n const tabContent = content.children[id] as HTMLDivElement;\r\n\r\n if(onClick) {\r\n const canChange = onClick(id, tabContent, animate);\r\n if(canChange !== undefined && !canChange) {\r\n return;\r\n }\r\n }\r\n\r\n if(scrollableX) {\r\n scrollableX.scrollIntoViewNew(target.parentElement.children[id] as HTMLElement, 'center', undefined, undefined, animate ? undefined : FocusDirection.Static, transitionTime, 'x');\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(target.classList.contains('active') || id === prevId) {\r\n return false;\r\n }\r\n \r\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\r\n\r\n fastRaf(() => {\r\n prev && prev.classList.remove('active');\r\n });\r\n \r\n // stripe from ZINCHUK\r\n if(useStripe && prevId !== -1 && animate) {\r\n fastRaf(() => {\r\n const indicator = target.querySelector('i')!;\r\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\r\n \r\n currentIndicator.classList.remove('animate');\r\n indicator.classList.remove('animate');\r\n \r\n // We move and resize our indicator so it repeats the position and size of the previous one.\r\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\r\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\r\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\r\n \r\n //console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\r\n \r\n requestAnimationFrame(() => {\r\n // Now we remove the transform to let it animate to its own position and size.\r\n indicator.classList.add('animate');\r\n indicator.style.transform = 'none';\r\n });\r\n });\r\n }\r\n // stripe END\r\n\r\n fastRaf(() => {\r\n target.classList.add('active');\r\n });\r\n \r\n selectTab(id, animate);\r\n };\r\n\r\n const useStripe = !tabs.classList.contains('no-stripe');\r\n\r\n //const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\r\n const tagName = tabs.firstElementChild.tagName;\r\n tabs.addEventListener('click', function(e) {\r\n let target = e.target as HTMLElement;\r\n \r\n target = findUpAsChild(target, tabs);\r\n \r\n //console.log('tabs click:', target);\r\n \r\n if(!target) return false;\r\n\r\n let id: number;\r\n if(target.dataset.tab) {\r\n id = +target.dataset.tab;\r\n if(id === -1) {\r\n return false;\r\n }\r\n } else {\r\n id = whichChild(target);\r\n }\r\n\r\n selectTarget(target, id);\r\n });\r\n\r\n return proxy;\r\n }\r\n \r\n return selectTab;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n\r\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.filter = `brightness(80%)`;\r\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n tabContent.style.filter = '';\r\n\r\n return () => {\r\n prevTabContent.style.transform = prevTabContent.style.filter = '';\r\n };\r\n}\r\n\r\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\r\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\r\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\r\n // scrollableContainer.style.overflowY = 'hidden';\r\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\r\n // // this.container.classList.add('sliding');\r\n // }\r\n\r\n //window.requestAnimationFrame(() => {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n /* tabContent.style.setProperty('--width', width + 'px');\r\n prevTabContent.style.setProperty('--width', width + 'px');\r\n\r\n tabContent.classList.add('active'); */\r\n //void tabContent.offsetWidth; // reflow\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n \r\n tabContent.style.transform = '';\r\n //});\r\n \r\n return () => {\r\n prevTabContent.style.transform = '';\r\n\r\n // if(scrollableContainer) {\r\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\r\n // scrollableContainer.style.display = 'none';\r\n // }\r\n\r\n // scrollableContainer.style.overflowY = '';\r\n\r\n // if(isSafari) {\r\n // void scrollableContainer.offsetLeft; // reflow\r\n // scrollableContainer.style.display = '';\r\n // }\r\n\r\n // // scrollableContainer.style.paddingRight = '0';\r\n // // this.container.classList.remove('sliding');\r\n // }\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (\r\n content: HTMLElement, \r\n type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true\r\n) => {\r\n let animationFunction: TransitionFunction = null;\r\n\r\n switch(type) {\r\n case 'tabs':\r\n animationFunction = slideTabs;\r\n break;\r\n case 'navigation':\r\n animationFunction = slideNavigation;\r\n break;\r\n /* default:\r\n break; */\r\n }\r\n\r\n content.dataset.animation = type;\r\n \r\n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy);\r\n};\r\n\r\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\r\n\r\nconst Transition = (\r\n content: HTMLElement, \r\n animationFunction: TransitionFunction, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true,\r\n once = false,\r\n withAnimationListener = true\r\n) => {\r\n const onTransitionEndCallbacks: Map = new Map();\r\n let animationDeferred: CancellablePromise;\r\n // let animationStarted = 0;\r\n let from: HTMLElement = null;\r\n\r\n if(withAnimationListener) {\r\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\r\n\r\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\r\n cancelEvent(e);\r\n \r\n if((e.target as HTMLElement).parentElement !== content) {\r\n return;\r\n }\r\n \r\n //console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\r\n \r\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\r\n if(callback) callback();\r\n \r\n if(e.target !== from) {\r\n return;\r\n }\r\n \r\n if(!animationDeferred && isHeavy) return;\r\n \r\n if(animationDeferred) {\r\n animationDeferred.resolve();\r\n animationDeferred = undefined;\r\n }\r\n \r\n if(onTransitionEnd) {\r\n onTransitionEnd(selectTab.prevId());\r\n }\r\n \r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n \r\n if(once) {\r\n content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\r\n from = animationDeferred = undefined;\r\n onTransitionEndCallbacks.clear();\r\n }\r\n };\r\n \r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\r\n }\r\n\r\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\r\n if(overrideFrom) {\r\n from = overrideFrom;\r\n }\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n \r\n const prevId = selectTab.prevId();\r\n if(id === prevId) return false;\r\n\r\n //console.log('selectTab id:', id);\r\n\r\n const to = content.children[id] as HTMLElement;\r\n\r\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\r\n animate = false;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n const timeout = content.dataset.timeout;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n delete content.dataset.timeout;\r\n }\r\n\r\n if(!animate) {\r\n if(from) from.classList.remove('active', 'to', 'from');\r\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\r\n const callback = onTransitionEndCallbacks.get(to);\r\n if(callback) {\r\n callback();\r\n }\r\n }\r\n\r\n if(to) {\r\n to.classList.remove('to', 'from');\r\n to.classList.add('active');\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n from = to;\r\n\r\n if(onTransitionEnd) onTransitionEnd(id);\r\n return;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n content.dataset.timeout = '' + window.setTimeout(() => {\r\n to.classList.remove('to');\r\n from && from.classList.remove('from');\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n delete content.dataset.timeout;\r\n }, transitionTime);\r\n }\r\n\r\n if(from) {\r\n from.classList.remove('to');\r\n from.classList.add('from');\r\n }\r\n\r\n content.classList.add('animating'/* , 'disable-hover' */);\r\n const toRight = prevId < id;\r\n content.classList.toggle('backwards', !toRight);\r\n\r\n let onTransitionEndCallback: ReturnType;\r\n if(!to) {\r\n //prevTabContent.classList.remove('active');\r\n } else {\r\n if(animationFunction) {\r\n onTransitionEndCallback = animationFunction(to, from, toRight);\r\n } else {\r\n to.classList.add('active');\r\n }\r\n\r\n to.classList.remove('from');\r\n to.classList.add('to');\r\n }\r\n \r\n if(to) {\r\n onTransitionEndCallbacks.set(to, () => {\r\n to.classList.remove('to');\r\n onTransitionEndCallbacks.delete(to);\r\n });\r\n }\r\n\r\n if(from/* && false */) {\r\n const _from = from;\r\n const callback = () => {\r\n _from.classList.remove('active', 'from');\r\n\r\n if(onTransitionEndCallback) {\r\n onTransitionEndCallback();\r\n }\r\n\r\n onTransitionEndCallbacks.delete(_from);\r\n };\r\n\r\n if(to) {\r\n onTransitionEndCallbacks.set(_from, callback);\r\n } else {\r\n const timeout = window.setTimeout(callback, transitionTime);\r\n onTransitionEndCallbacks.set(_from, () => {\r\n clearTimeout(timeout);\r\n onTransitionEndCallbacks.delete(_from);\r\n });\r\n }\r\n\r\n if(isHeavy) {\r\n if(!animationDeferred) {\r\n animationDeferred = deferredPromise();\r\n // animationStarted = performance.now();\r\n }\r\n \r\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\r\n }\r\n }\r\n \r\n from = to;\r\n }\r\n\r\n //selectTab.prevId = -1;\r\n selectTab.prevId = () => from ? whichChild(from) : -1;\r\n \r\n return selectTab;\r\n};\r\n\r\nexport default Transition;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { 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\";\nimport lottieLoader from \"./lottieLoader\";\nimport QueryableWorker from \"./queryableWorker\";\n\nexport type RLottieOptions = {\n container: HTMLElement, \n canvas?: HTMLCanvasElement, \n autoplay?: boolean, \n animationData: string, \n loop?: boolean, \n width?: number,\n height?: number,\n group?: string,\n noCache?: true,\n needUpscale?: true,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number\n};\n\ntype RLottieCacheMap = Map;\nclass RLottieCache {\n private cache: Map;\n \n constructor() {\n this.cache = new Map();\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = {frames: new Map(), counter: 0});\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache.frames;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name, \n width, \n height, \n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst cache = new RLottieCache();\n\nexport type RLottieColor = [number, number, number];\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void\n}> {\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n private name: string;\n private cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n \n private width = 0;\n private height = 0;\n\n public el: HTMLElement;\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n\n public paused = true;\n //public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop = true;\n private _loop: boolean; // ! will be used to store original value for settings.stickers.loop\n private group = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n //private caching = false;\n //private removed = false;\n\n private frames: RLottieCacheMap;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n private minFrame: number;\n private maxFrame: number;\n\n //private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private onPauseCallback: () => void;\n private skipFirstFrameRendering: boolean;\n\n constructor({el, worker, options}: {\n el: HTMLElement,\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(let i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n //options.needUpscale = true;\n\n // * Pixel ratio\n //const pixelRatio = window.devicePixelRatio;\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1) {\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\n if(options.needUpscale) {\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 1) {\n if(this.width > 100 && this.height > 100) {\n if(IS_APPLE || !mediaSizes.isMobile) {\n /* this.width = Math.round(this.width * (pixelRatio - 1));\n this.height = Math.round(this.height * (pixelRatio - 1)); */\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 2.5) {\n this.width = Math.round(this.width * (pixelRatio - 1.5));\n this.height = Math.round(this.height * (pixelRatio - 1.5));\n }\n } else {\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\n }\n }\n }\n\n //options.noCache = true;\n \n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; //2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n \n // this.cachingDelta = Infinity;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n /* this.width *= 0.8;\n this.height *= 0.8; */\n \n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\n if(!this.canvas) {\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('rlottie');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n }\n\n this.context = this.canvas.getContext('2d');\n\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n this.imageData = new ImageData(this.width, this.height);\n\n if(this.name) {\n this.cacheName = cache.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n this.frames = cache.getCache(this.cacheName);\n } else {\n this.frames = new Map();\n }\n }\n\n public clearCache() {\n if(this.cacheName && cache.getCacheCounter(this.cacheName) > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n \n this.frames.clear();\n }\n\n public sendQuery(methodName: string, ...args: any[]) {\n //console.trace('RLottie sendQuery:', methodName);\n this.worker.sendQuery(methodName, this.reqId, ...args);\n }\n\n public loadFromData(jsonString: string) {\n this.sendQuery('loadFromData', jsonString, this.width, this.height/* , this.canvas.transferControlToOffscreen() */);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n //return;\n\n //console.log('RLOTTIE PLAY' + this.reqId);\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n }\n //window.cancelAnimationFrame(this.rafId);\n \n if(this.onPauseCallback) {\n this.setSpeed(1);\n this.onPauseCallback = undefined;\n\n const callback = this.onPauseCallback;\n callback && callback();\n }\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame || (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n //this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n \n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n //alert('remove');\n lottieLoader.onDestroy(this.reqId);\n this.pause();\n this.sendQuery('destroy');\n if(this.cacheName) cache.releaseCache(this.cacheName);\n //this.removed = true;\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n \n //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n //let perf = performance.now();\n this.context.putImageData(this.imageData, 0, 0);\n //console.log('renderFrame2 perf:', performance.now() - perf);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n return;\n }\n \n //console.log('set result enterFrame', frameNo);\n this.dispatchEvent('enterFrame', frameNo);\n }\n\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\n //console.log('renderFrame', frameNo, this);\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames.has(frameNo)) {\n this.frames.set(frameNo, new Uint8ClampedArray(frame));//frame;\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\n\n if(delta < 0) {\n if(this.rafId) clearTimeout(this.rafId);\n return this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.frames.get(frameNo);\n if(frame) {\n this.renderFrame(frame, frameNo);\n } else if(IS_SAFARI) {\n this.sendQuery('renderFrame', frameNo);\n } else {\n if(!this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n \n this.sendQuery('renderFrame', frameNo, this.clamped);\n }\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = this.minFrame : this.curFrame += skipDelta;\n //console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n //this.playedTimes++;\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\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.maxFrame : this.curFrame -= skipDelta;\n //console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n //this.playedTimes++;\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n }\n\n return true;\n }\n\n public setMainLoop() {\n //window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n //console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n //this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n //setTimeout(() => {\n //this.addListener('enterFrame', this.frameListener);\n //}, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n \n //this.mainLoop(method);\n //this.r(method);\n //method();\n }\n\n public playPart(options: {\n from: number, \n to: number, \n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number, \n speed?: number, \n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n \n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n \n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n this.onPauseCallback = callback;\n\n this.play();\n }\n\n public setColor(color: RLottieColor) {\n this.color = color;\n\n if(this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n //this.sendQuery('renderFrame', 0);\n \n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс, \n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс. \n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n \n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n }); \n }\n }\n \n console.timeEnd('cache' + this.reqId); */\n //console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas.parentNode && this.el) {\n this.el.appendChild(this.canvas);\n }\n\n //console.log('enterFrame firstFrame');\n \n //let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused) {\n return;\n }\n\n const time = Date.now();\n //console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n //lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n }, {once: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Dialog } from './appMessagesManager';\nimport { NULL_PEER_ID, UserAuth } from '../mtproto/mtproto_config';\nimport type { MyTopPeer, TopPeerType, User } from './appUsersManager';\nimport type { AuthState } from '../../types';\nimport type FiltersStorage from '../storages/filters';\nimport type DialogsStorage from '../storages/dialogs';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport { logger } from '../logger';\nimport { copy, setDeepProperty, validateInitObject } from '../../helpers/object';\nimport App from '../../config/app';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport AppStorage from '../storage';\nimport { Chat } from '../../layer';\nimport { IS_MOBILE } from '../../environment/userAgent';\nimport DATABASE_STATE from '../../config/databases/state';\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport compareVersion from '../../helpers/compareVersion';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n//const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\nconst STATE_VERSION = App.versionFull;\nconst BUILD = App.build;\n\nexport type Background = {\n type: 'color' | 'image' | 'default',\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string,\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n contactsList: UserId[],\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts: boolean\n private: boolean\n groups: boolean\n channels: boolean\n },\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\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: {\n type: 'image',\n blur: false,\n slug: 'ByxGo2lrMFAIAAAAmkJxZabh8eM', // * new blurred camomile,\n highlightningColor: 'hsla(85.5319, 36.9171%, 40.402%, 0.4)'\n }\n }, {\n name: 'night',\n background: {\n type: 'color',\n blur: false,\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)'\n }\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23'\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32)\n};\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS = ['contactsList', 'stateCreatedTime',\n 'maxSeenMsgId', 'filters', 'topPeers'] as any as Array;\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage';\n\n//const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise,\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void\n}> {\n public static STATE_INIT = STATE_INIT;\n private loaded: Promise;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map = new Map();\n\n public storages = {\n users: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'users'),\n chats: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'chats'),\n dialogs: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'dialogs')\n };\n\n public storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n\n public storage = stateStorage;\n\n public newVersion: string;\n\n constructor() {\n super();\n this.loadSavedState();\n }\n\n public loadSavedState(): Promise {\n if(this.loaded) return this.loaded;\n console.time('load state');\n this.loaded = new Promise((resolve) => {\n const storagesKeys = Object.keys(this.storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map(key => this.storages[key].getAll());\n\n const promises/* : Promise[] */ = ALL_KEYS.map(key => stateStorage.get(key))\n .concat(sessionStorage.get('user_auth'), sessionStorage.get('state_id'))\n .concat(stateStorage.get('user_auth')) // support old webk format\n .concat(storagesPromises);\n\n Promise.all(promises).then(async(arr) => {\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n \n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n \n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n let state: State = this.state = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n this.pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map(key => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n let obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n \n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ? \n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} : \n auth); // * support old version\n }\n\n // * Read storages\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n this.storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n \n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n \n state = this.state = copy(STATE_INIT);\n \n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n for(const key in this.storagesResults) {\n this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n this.storage.set(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n this.log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach(key => {\n this.pushToState(key, copy(STATE_INIT[key]));\n \n // @ts-ignore\n const s = this.storagesResults[key];\n if(s && s.length) {\n s.length = 0;\n }\n });\n };\n \n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n \n //state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n this.pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n this.pushToState('settings', state.settings);\n }\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n // @ts-ignore\n this.pushToState(missingKey, state[missingKey]);\n });\n\n if(state.version !== STATE_VERSION/* || true */) {\n // reset filters and dialogs if version is older\n if(compareVersion(state.version, '0.8.7') === -1) {\n this.state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n this.state.filters = copy(STATE_INIT.filters);\n const result = this.storagesResults.dialogs;\n if(result?.length) {\n result.length = 0;\n }\n }\n\n this.pushToState('version', this.newVersion = STATE_VERSION);\n this.pushToState('build', BUILD);\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n console.timeEnd('load state');\n resolve(state);\n }).catch(resolve);\n });\n\n return this.loaded;\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.dispatchEvent('settings_updated', {key, value});\n\n const first = key.split('.')[0];\n // @ts-ignore\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key]) {\n this.storage.set({\n [key]: value\n });\n }\n\n public requestPeer(peerId: PeerId, type: StatePeerType, limit?: number) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(type)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(type);\n\n this.dispatchEvent('peerNeeded', peerId);\n\n if(limit !== undefined) {\n this.keepPeerSingle(peerId, type);\n }\n }\n\n public requestPeerSingle(peerId: PeerId, type: StatePeerType, keepPeerIdSingle: PeerId = peerId) {\n return this.requestPeer(peerId, type + '_' + keepPeerIdSingle as any, 1);\n }\n\n public releaseSinglePeer(peerId: PeerId, type: StatePeerType) {\n return this.keepPeerSingle(NULL_PEER_ID, type + '_' + peerId as any);\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n\n public keepPeerSingle(peerId: PeerId, type: StatePeerType) {\n const existsPeerId = this.singlePeerMap.get(type);\n if(existsPeerId && existsPeerId !== peerId && this.neededPeers.has(existsPeerId)) {\n const set = this.neededPeers.get(existsPeerId);\n set.delete(type);\n\n if(!set.size) {\n this.neededPeers.delete(existsPeerId);\n this.dispatchEvent('peerUnneeded', existsPeerId);\n }\n }\n\n if(peerId) {\n this.singlePeerMap.set(type, peerId);\n } else {\n this.singlePeerMap.delete(type);\n }\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;\n","export default function 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\n/* import { copy } from \"./object\";\r\n\r\nexport function listMergeSorted(list1: any[] = [], list2: any[] = []) {\r\n const result = copy(list1);\r\n\r\n const minId = list1.length ? list1[list1.length - 1] : 0xFFFFFFFF;\r\n for(let i = 0; i < list2.length; i++) {\r\n if(list2[i] < minId) {\r\n result.push(list2[i]);\r\n }\r\n }\r\n\r\n return result;\r\n} */\r\n\r\nexport const accumulate = (arr: number[], initialValue: number) => arr.reduce((acc, value) => acc + value, initialValue);\r\n\r\nexport function indexOfAndSplice(array: Array, item: T) {\r\n const idx = array.indexOf(item);\r\n const spliced = idx !== -1 && array.splice(idx, 1);\r\n return spliced && spliced[0];\r\n}\r\n\r\nexport function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\r\n const out: typeof array = [];\r\n let idx = -1;\r\n while((idx = array.findIndex(verify)) !== -1) {\r\n out.push(array.splice(idx, 1)[0]);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\r\n for(let length = array.length, i = length - 1; i >= 0; --i) {\r\n callback(array[i], i, array);\r\n }\r\n};\r\n\r\nexport function insertInDescendSortedArray(array: Array, element: T, property: K, pos?: number) {\r\n const sortProperty: number = element[property];\r\n\r\n if(pos === undefined) {\r\n pos = array.indexOf(element);\r\n if(pos !== -1) {\r\n const prev = array[pos - 1];\r\n const next = array[pos + 1];\r\n if((!prev || prev[property] >= sortProperty) && (!next || next[property] <= sortProperty)) {\r\n // console.warn('same pos', pos, sortProperty, prev, next);\r\n return pos;\r\n }\r\n \r\n array.splice(pos, 1);\r\n }\r\n }\r\n\r\n const len = array.length;\r\n if(!len || sortProperty <= array[len - 1][property]) {\r\n return array.push(element) - 1;\r\n } else if(sortProperty >= array[0][property]) {\r\n array.unshift(element);\r\n return 0;\r\n } else {\r\n for(let i = 0; i < len; i++) {\r\n if(sortProperty > array[i][property]) {\r\n array.splice(i, 0, element);\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n console.error('wtf', array, element);\r\n return array.indexOf(element);\r\n}\r\n\r\nexport function filterUnique>(arr: T): T {\r\n return [...new Set(arr)] as T;\r\n}\r\n\r\nexport function flatten(arr: T[][]): T[] {\r\n return arr.reduce((acc, val) => (acc.push(...val), acc), []);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/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(requestAnimationFrame);\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","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"rlottie.worker.077a5af1cfa1feb04249.bundle.worker.js\");\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n \n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(queryMethod: string, ...args: any[]) {\n if(IS_SAFARI) {\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n });\n } else {\n const transfer: (ArrayBuffer | OffscreenCanvas)[] = [];\n args.forEach(arg => {\n if(arg instanceof ArrayBuffer) {\n transfer.push(arg);\n }\n \n if(arg.buffer && arg.buffer instanceof ArrayBuffer) {\n transfer.push(arg.buffer);\n }\n });\n \n //console.log('transfer', transfer);\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n }, transfer as PostMessageOptions);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\nconst COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n [0xffb139, 0xf6b689],\n [0xffd140, 0xffcda7],\n [0xffdf79, 0xffdfc5],\n ],\n\n [\n [0xf77e41, 0xa45a38],\n [0xffb139, 0xdf986b],\n [0xffd140, 0xedb183],\n [0xffdf79, 0xf4c3a0],\n ],\n\n [\n [0xf77e41, 0x703a17],\n [0xffb139, 0xab673d],\n [0xffd140, 0xc37f4e],\n [0xffdf79, 0xd89667],\n ],\n\n [\n [0xf77e41, 0x4a2409],\n [0xffb139, 0x7d3e0e],\n [0xffd140, 0x965529],\n [0xffdf79, 0xa96337],\n ],\n\n [\n [0xf77e41, 0x200f0a],\n [0xffb139, 0x412924],\n [0xffd140, 0x593d37],\n [0xffdf79, 0x63453f],\n ]\n];\n\nlet convert = (value: number) => {\n\treturn Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\n\nexport default function applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n}, toneIndex: number) {\n const replacements = COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find(p => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n //console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n\n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n console.warn('cant apply replacements', err, object, toneIndex);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport RLottieWorker from 'worker-loader!./rlottie.worker';\r\nimport animationIntersector from \"../../components/animationIntersector\";\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport { pause } from '../../helpers/schedulers/pause';\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport RLottiePlayer, { RLottieOptions } from './rlottiePlayer';\r\nimport QueryableWorker from './queryableWorker';\r\nimport applyReplacements from './applyReplacements';\r\n\r\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' | \r\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' | \r\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' | \r\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' | \r\n 'voice_outlined2' | 'voip_filled' | 'voice_mini';\r\n\r\nexport class LottieLoader {\r\n private isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\r\n private loadPromise: Promise = !this.isWebAssemblySupported ? Promise.reject() : undefined;\r\n private loaded = false;\r\n\r\n private workersLimit = 4;\r\n private players: {[reqId: number]: RLottiePlayer} = {};\r\n\r\n private workers: QueryableWorker[] = [];\r\n private curWorkerNum = 0;\r\n\r\n private log = logger('LOTTIE', LogTypes.Error);\r\n\r\n public getAnimation(element: HTMLElement) {\r\n for(const i in this.players) {\r\n if(this.players[i].el === element) {\r\n return this.players[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public setLoop(loop: boolean) {\r\n for(const i in this.players) {\r\n const player = this.players[i];\r\n player.loop = loop;\r\n player.autoplay = player._autoplay;\r\n }\r\n }\r\n\r\n public loadLottieWorkers() {\r\n if(this.loadPromise) {\r\n return this.loadPromise;\r\n }\r\n\r\n return this.loadPromise = new Promise((resolve, reject) => {\r\n let remain = this.workersLimit;\r\n for(let i = 0; i < this.workersLimit; ++i) {\r\n const worker = this.workers[i] = new QueryableWorker(new RLottieWorker());\r\n\r\n worker.addEventListener('ready', () => {\r\n this.log('worker #' + i + ' ready');\r\n\r\n worker.addEventListener('frame', this.onFrame);\r\n worker.addEventListener('loaded', this.onPlayerLoaded);\r\n worker.addEventListener('error', this.onPlayerError);\r\n\r\n --remain;\r\n if(!remain) {\r\n this.log('workers ready');\r\n resolve();\r\n this.loaded = true;\r\n }\r\n }, {once: true});\r\n\r\n worker.addEventListener('workerError', (error) => {\r\n reject('rlottie load error: ' + error.message);\r\n this.loaded = false;\r\n }, {once: true});\r\n }\r\n });\r\n }\r\n\r\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\r\n (params as RLottieOptions).name = name;\r\n return this.loadAnimationFromURL(params, 'assets/tgs/' + name + '.json');\r\n }\r\n\r\n public loadAnimationFromURL(params: Omit, url: string): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n \r\n if(!this.loaded) {\r\n this.loadLottieWorkers();\r\n }\r\n\r\n return fetch(url)\r\n .then(res => {\r\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\r\n return res.arrayBuffer().then(data => apiManager.invokeCrypto('gzipUncompress', data, true))\r\n } else {\r\n return res.text();\r\n }\r\n })\r\n /* .then(str => {\r\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n .then(str => {\r\n const newParams = Object.assign(params, {animationData: str as string/* JSON.parse(str) */, needUpscale: true});\r\n if(!newParams.name) newParams.name = url;\r\n return this.loadAnimationWorker(newParams);\r\n });\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer) {\r\n return Promise.race([\r\n /* new Promise((resolve) => {\r\n player.addEventListener('firstFrame', () => {\r\n setTimeout(() => resolve(), 1500);\r\n }, true);\r\n }) */\r\n new Promise((resolve) => {\r\n player.addEventListener('firstFrame', resolve, {once: true});\r\n }),\r\n pause(2500)\r\n ]).then(() => player);\r\n }\r\n\r\n public async loadAnimationWorker(params: RLottieOptions, group = params.group || '', toneIndex = -1): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n //params.autoplay = true;\r\n\r\n if(toneIndex >= 1 && toneIndex <= 5) {\r\n /* params.animationData = copy(params.animationData);\r\n this.applyReplacements(params.animationData, toneIndex); */\r\n\r\n params.toneIndex = toneIndex;\r\n const newAnimationData = JSON.parse(params.animationData);\r\n applyReplacements(newAnimationData, toneIndex);\r\n params.animationData = JSON.stringify(newAnimationData);\r\n }\r\n\r\n if(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n params.width = parseInt(params.container.style.width);\r\n params.height = parseInt(params.container.style.height);\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n throw new Error('No size for sticker!');\r\n }\r\n\r\n params.group = group;\r\n\r\n const player = this.initPlayer(params.container, params);\r\n\r\n if(group !== 'none') {\r\n animationIntersector.addAnimation(player, group);\r\n }\r\n\r\n return player;\r\n }\r\n\r\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\r\n return;\r\n }\r\n\r\n this.log.debug('onPlayerLoaded');\r\n rlPlayer.onLoad(frameCount, fps);\r\n //rlPlayer.addListener('firstFrame', () => {\r\n //animationIntersector.addAnimation(player, group);\r\n //}, true);\r\n };\r\n\r\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\r\n return;\r\n }\r\n\r\n rlPlayer.clamped = frame;\r\n rlPlayer.renderFrame(frame, frameNo);\r\n };\r\n\r\n private onPlayerError = (reqId: number, error: Error) => {\r\n const rlPlayer = this.players[reqId];\r\n if(rlPlayer) {\r\n // ! will need refactoring later, this is not the best way to remove the animation\r\n const animations = animationIntersector.getAnimations(rlPlayer.el);\r\n animations.forEach(animation => {\r\n animationIntersector.checkAnimation(animation, true, true);\r\n });\r\n }\r\n };\r\n\r\n public onDestroy(reqId: number) {\r\n delete this.players[reqId];\r\n }\r\n\r\n public destroyWorkers() {\r\n this.workers.forEach((worker, idx) => {\r\n worker.terminate();\r\n this.log('worker #' + idx + ' terminated');\r\n });\r\n\r\n this.log('workers destroyed');\r\n this.workers.length = 0;\r\n }\r\n\r\n private initPlayer(el: HTMLElement, options: RLottieOptions) {\r\n const rlPlayer = new RLottiePlayer({\r\n el, \r\n worker: this.workers[this.curWorkerNum++],\r\n options\r\n });\r\n\r\n this.players[rlPlayer.reqId] = rlPlayer;\r\n if(this.curWorkerNum >= this.workers.length) {\r\n this.curWorkerNum = 0;\r\n }\r\n\r\n rlPlayer.loadFromData(options.animationData);\r\n\r\n return rlPlayer;\r\n }\r\n}\r\n\r\nconst lottieLoader = new LottieLoader();\r\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\r\nexport default lottieLoader;\r\n","/*\r\n * https://github.com/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 function numberThousandSplitter(x: number, joiner = ' ') {\r\n const parts = x.toString().split(\".\");\r\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\r\n return parts.join(\".\");\r\n}\r\n\r\nexport function formatBytes(bytes: number, decimals = 2) {\r\n if(bytes === 0) return '0 Bytes';\r\n\r\n const k = 1024;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\r\n}\r\n\r\nexport function formatNumber(bytes: number, decimals = 2) {\r\n if(bytes === 0) return '0';\r\n\r\n const k = 1000;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const sizes = ['', 'K', 'M', 'B', 'T'];\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\r\n}\r\n\r\nexport function clamp(v: number, min: number, max: number): number {\r\n return v < min ? min : ((v > max) ? max : v);\r\n}\r\n\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Page from \"./page\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { horizontalMenu } from \"../components/horizontalMenu\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nclass PagesManager {\r\n private pageId = -1;\r\n private page: Page;\r\n\r\n private selectTab: ReturnType;\r\n public pagesDiv: HTMLDivElement;\r\n public scrollableDiv: HTMLElement;\r\n\r\n constructor() {\r\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\r\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\r\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\r\n if(this.page?.onShown) {\r\n this.page.onShown();\r\n }\r\n });\r\n }\r\n\r\n public setPage(page: Page) {\r\n if(page.isAuthPage) {\r\n this.pagesDiv.style.display = '';\r\n\r\n let id = whichChild(page.pageEl);\r\n if(this.pageId === id) return;\r\n\r\n this.selectTab(id);\r\n\r\n if(this.pageId !== -1 && id > 1) {\r\n lottieLoader.loadLottieWorkers();\r\n }\r\n\r\n\r\n\r\n this.pageId = id;\r\n\r\n if(this.scrollableDiv) {\r\n fastSmoothScroll(this.scrollableDiv, this.scrollableDiv.firstElementChild as HTMLElement, 'start');\r\n }\r\n } else {\r\n this.pagesDiv.style.display = 'none';\r\n page.pageEl.style.display = '';\r\n\r\n this.pageId = -1;\r\n }\r\n\r\n this.page = page;\r\n }\r\n}\r\n\r\nconst pagesManager = new PagesManager();\r\nMOUNT_CLASS_TO.pagesManager = pagesManager;\r\nexport default pagesManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pagesManager from \"./pagesManager\";\r\n\r\nexport default class Page {\r\n public pageEl: HTMLDivElement;\r\n private installed = false;\r\n\r\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\r\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\r\n }\r\n\r\n public async mount(...args: any[]) {\r\n //this.pageEl.style.display = '';\r\n\r\n if(this.onMount) {\r\n this.onMount(...args);\r\n }\r\n\r\n if(!this.installed) {\r\n if(this.onFirstMount) {\r\n try {\r\n const res = this.onFirstMount(...args);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n } catch(err) {\r\n console.error('PAGE MOUNT ERROR:', err);\r\n }\r\n }\r\n \r\n this.installed = true;\r\n }\r\n\r\n pagesManager.setPage(this);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\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 { indexOfAndSplice } from \"../helpers/array\";\r\nimport RLottiePlayer from \"../lib/rlottie/rlottiePlayer\";\r\n\r\nexport interface AnimationItem {\r\n el: HTMLElement,\r\n group: string,\r\n animation: RLottiePlayer | HTMLVideoElement\r\n};\r\n\r\nexport class AnimationIntersector {\r\n public observer: IntersectionObserver;\r\n private visible: Set = new Set();\r\n\r\n private byGroups: {[group: string]: AnimationItem[]} = {};\r\n private lockedGroups: {[group: string]: true} = {};\r\n private onlyOnePlayableGroup: string = '';\r\n \r\n private intersectionLockedGroups: {[group: string]: true} = {};\r\n private videosLocked = false;\r\n\r\n constructor() {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(rootScope.idle.isIDLE) return;\r\n\r\n for(const entry of entries) {\r\n const target = entry.target;\r\n\r\n for(const group in this.byGroups) {\r\n if(this.intersectionLockedGroups[group]) {\r\n continue;\r\n }\r\n\r\n const player = this.byGroups[group].find(p => p.el === target);\r\n if(player) {\r\n if(entry.isIntersecting) {\r\n this.visible.add(player);\r\n this.checkAnimation(player, false);\r\n } else {\r\n this.visible.delete(player);\r\n this.checkAnimation(player, true);\r\n\r\n if(player.animation instanceof RLottiePlayer/* && player.animation.cachingDelta === 2 */) {\r\n //console.warn('will clear cache', player);\r\n player.animation.clearCache();\r\n }\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_play', ({doc}) => {\r\n if(doc.type === 'round') {\r\n this.videosLocked = true;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_pause', () => {\r\n if(this.videosLocked) {\r\n this.videosLocked = false;\r\n this.checkAnimations();\r\n }\r\n });\r\n }\r\n\r\n public getAnimations(element: HTMLElement) {\r\n const found: AnimationItem[] = [];\r\n for(const group in this.byGroups) {\r\n for(const player of this.byGroups[group]) {\r\n if(player.el === element) {\r\n found.push(player);\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public removeAnimation(player: AnimationItem) {\r\n //console.log('destroy animation');\r\n const {el, animation} = player;\r\n animation.remove();\r\n\r\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n for(const group in this.byGroups) {\r\n indexOfAndSplice(this.byGroups[group], player);\r\n }\r\n \r\n this.observer.unobserve(el);\r\n this.visible.delete(player);\r\n }\r\n\r\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group = '') {\r\n const player = {\r\n el: animation instanceof RLottiePlayer ? animation.el : animation, \r\n animation: animation, \r\n group\r\n };\r\n\r\n if(animation instanceof RLottiePlayer) {\r\n if(!rootScope.settings.stickers.loop && animation.loop) {\r\n animation.loop = rootScope.settings.stickers.loop;\r\n }\r\n }\r\n\r\n (this.byGroups[group] ?? (this.byGroups[group] = [])).push(player);\r\n this.observer.observe(player.el);\r\n }\r\n\r\n public checkAnimations(blurred?: boolean, group?: string, destroy = false) {\r\n if(rootScope.idle.isIDLE) return;\r\n \r\n const groups = group /* && false */ ? [group] : Object.keys(this.byGroups);\r\n\r\n if(group && !this.byGroups[group]) {\r\n //console.warn('no animation group:', group);\r\n this.byGroups[group] = [];\r\n return;\r\n }\r\n\r\n for(const group of groups) {\r\n const animations = this.byGroups[group];\r\n\r\n animations.forEach(player => {\r\n this.checkAnimation(player, blurred, destroy);\r\n });\r\n }\r\n }\r\n\r\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\r\n const {el, animation, group} = player;\r\n //return;\r\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\r\n this.removeAnimation(player);\r\n return;\r\n }\r\n\r\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\r\n if(!animation.paused) {\r\n //console.warn('pause animation:', animation);\r\n animation.pause();\r\n }\r\n } else if(animation.paused && \r\n this.visible.has(player) && \r\n animation.autoplay && \r\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group)\r\n ) {\r\n //console.warn('play animation:', animation);\r\n animation.play();\r\n }\r\n }\r\n\r\n public setOnlyOnePlayableGroup(group: string) {\r\n this.onlyOnePlayableGroup = group;\r\n }\r\n\r\n public lockGroup(group: string) {\r\n this.lockedGroups[group] = true;\r\n }\r\n\r\n public unlockGroup(group: string) {\r\n delete this.lockedGroups[group];\r\n this.checkAnimations(undefined, group);\r\n }\r\n\r\n public refreshGroup(group: string) {\r\n const animations = this.byGroups[group];\r\n if(animations && animations.length) {\r\n animations.forEach(animation => {\r\n this.observer.unobserve(animation.el);\r\n });\r\n\r\n window.requestAnimationFrame(() => {\r\n animations.forEach(animation => {\r\n this.observer.observe(animation.el);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public lockIntersectionGroup(group: string) {\r\n this.intersectionLockedGroups[group] = true;\r\n }\r\n\r\n public unlockIntersectionGroup(group: string) {\r\n delete this.intersectionLockedGroups[group];\r\n this.refreshGroup(group);\r\n }\r\n}\r\n\r\nconst animationIntersector = new AnimationIntersector();\r\nif(MOUNT_CLASS_TO) {\r\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\r\n}\r\nexport default animationIntersector;","/*\r\n * https://github.com/morethanwords/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 { CancellablePromise, deferredPromise } from '../helpers/cancellablePromise';\r\nimport rootScope from '../lib/rootScope';\r\nimport DEBUG from '../config/debug';\r\nimport { pause } from '../helpers/schedulers/pause';\r\n\r\nconst ANIMATION_START_EVENT = 'event-heavy-animation-start';\r\nconst ANIMATION_END_EVENT = 'event-heavy-animation-end';\r\n\r\nlet isAnimating = false;\r\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\r\nlet promisesInQueue = 0;\r\n\r\nheavyAnimationPromise.resolve();\r\n\r\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\r\n\r\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\r\n if(!isAnimating) {\r\n heavyAnimationPromise = deferredPromise();\r\n rootScope.dispatchEvent(ANIMATION_START_EVENT);\r\n isAnimating = true;\r\n DEBUG && log('start');\r\n }\r\n \r\n ++promisesInQueue;\r\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\r\n\r\n const promises = [\r\n timeout !== undefined ? pause(timeout) : undefined,\r\n promise.finally(() => {})\r\n ].filter(Boolean);\r\n\r\n const perf = performance.now();\r\n const _heavyAnimationPromise = heavyAnimationPromise;\r\n Promise.race(promises).then(() => {\r\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\r\n return;\r\n }\r\n\r\n --promisesInQueue;\r\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\r\n if(promisesInQueue <= 0) {\r\n onHeavyAnimationEnd();\r\n }\r\n });\r\n\r\n return heavyAnimationPromise;\r\n}\r\n\r\nfunction onHeavyAnimationEnd() {\r\n if(heavyAnimationPromise.isFulfilled) {\r\n return;\r\n }\r\n\r\n isAnimating = false;\r\n promisesInQueue = 0;\r\n rootScope.dispatchEvent(ANIMATION_END_EVENT);\r\n heavyAnimationPromise.resolve();\r\n\r\n DEBUG && log('end');\r\n}\r\n\r\nexport function interruptHeavyAnimation() {\r\n onHeavyAnimationEnd();\r\n}\r\n\r\nexport function getHeavyAnimationPromise() {\r\n return heavyAnimationPromise;\r\n}\r\n\r\nexport default function(\r\n handleAnimationStart: AnyToVoidFunction,\r\n handleAnimationEnd: AnyToVoidFunction,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n //useEffect(() => {\r\n if(isAnimating) {\r\n handleAnimationStart();\r\n }\r\n\r\n const add = listenerSetter ? listenerSetter.add(rootScope) : rootScope.addEventListener.bind(rootScope);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, rootScope) : rootScope.removeEventListener.bind(rootScope);\r\n add(ANIMATION_START_EVENT, handleAnimationStart);\r\n add(ANIMATION_END_EVENT, handleAnimationEnd);\r\n\r\n return () => {\r\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\r\n remove(ANIMATION_START_EVENT, handleAnimationStart);\r\n };\r\n //}, [handleAnimationEnd, handleAnimationStart]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function whichChild(elem: Node) {\r\n if(!elem.parentNode) {\r\n return -1;\r\n }\r\n \r\n let i = 0;\r\n // @ts-ignore\r\n while((elem = elem.previousElementSibling) !== null) ++i;\r\n return i;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's fastSmoothScroll slightly patched\r\n\r\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\r\nimport { fastRaf } 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\n\r\nexport default function fastSmoothScroll(\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin = 0,\r\n maxDistance = LONG_TRANSITION_MAX_DISTANCE,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis: 'x' | 'y' = 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback\r\n) {\r\n //return;\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(forceDirection === FocusDirection.Static) {\r\n forceDuration = 0;\r\n return scrollWithJs(container, element, position, margin, forceDuration, axis, getNormalSize);\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 if(axis === 'y' && element !== container && isInDOM(element) && container.getBoundingClientRect) {\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect();\r\n \r\n const offsetTop = elementRect.top - containerRect.top;\r\n if(forceDirection === undefined) {\r\n if(offsetTop < -maxDistance) {\r\n container.scrollTop += (offsetTop + maxDistance);\r\n } else if(offsetTop > maxDistance) {\r\n container.scrollTop += (offsetTop - 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 /* const { offsetTop } = element;\r\n\r\n if(forceDirection === undefined) {\r\n const offset = offsetTop - container.scrollTop;\r\n\r\n if(offset < -maxDistance) {\r\n container.scrollTop += (offset + maxDistance);\r\n } else if(offset > maxDistance) {\r\n container.scrollTop += (offset - maxDistance);\r\n }\r\n } else if(forceDirection === FocusDirection.Up) {\r\n container.scrollTop = offsetTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) {\r\n container.scrollTop = Math.max(0, offsetTop - maxDistance);\r\n } */\r\n }\r\n\r\n const promise = new Promise((resolve) => {\r\n fastRaf(() => {\r\n scrollWithJs(container, element, position, margin, forceDuration, axis, getNormalSize)\r\n .then(resolve);\r\n });\r\n });\r\n\r\n return axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(\r\n container: HTMLElement, \r\n element: HTMLElement, \r\n position: ScrollLogicalPosition, \r\n margin = 0, \r\n forceDuration?: number, \r\n axis: 'x' | 'y' = 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback\r\n) {\r\n if(!isInDOM(element)) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n \r\n const rectStartKey = axis === 'y' ? 'top' : 'left';\r\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\r\n const sizeKey = axis === 'y' ? 'height' : 'width';\r\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\r\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\r\n\r\n //const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\r\n\r\n //const transformable = container.firstElementChild as HTMLElement;\r\n\r\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\r\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\r\n\r\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\r\n\r\n const 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];\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) - (containerSize / 2)\r\n : elementPosition - margin;\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 // console.log('scrollWithJs: will scroll path:', path, element);\r\n\r\n /* let existsTransform = 0;\r\n const currentTransform = transformable.style.transform;\r\n if(currentTransform) {\r\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\r\n //path += existsTransform;\r\n } */\r\n\r\n if(path < 0) {\r\n const remainingPath = -scrollPosition;\r\n path = Math.max(path, remainingPath);\r\n } else if(path > 0) {\r\n const remainingPath = scrollSize - (scrollPosition + containerSize);\r\n path = Math.min(path, remainingPath);\r\n }\r\n\r\n const target = container[scrollPositionKey] + path;\r\n const absPath = Math.abs(path);\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\r\n );\r\n const startAt = Date.now();\r\n\r\n /* transformable.classList.add('no-transition');\r\n\r\n const tickTransform = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const currentPath = path * transition(t);\r\n\r\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\r\n container.dataset.translate = '' + -currentPath;\r\n\r\n const willContinue = t < 1;\r\n if(!willContinue) {\r\n fastRaf(() => {\r\n delete container.dataset.transform;\r\n container.dataset.transform = '';\r\n transformable.style.transform = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n container[scrollPositionKey] = Math.round(target);\r\n });\r\n }\r\n\r\n return willContinue;\r\n };\r\n \r\n return animateSingle(tickTransform, container); */\r\n\r\n /* return new Promise((resolve) => {\r\n fastRaf(() => {\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n\r\n setTimeout(resolve, duration);\r\n });\r\n });\r\n\r\n const transformableHeight = transformable.scrollHeight;\r\n //transformable.style.minHeight = `${transformableHeight}px`;\r\n */\r\n\r\n const transition = absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\r\n const tick = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n\r\n const currentPath = path * (1 - transition(t));\r\n container[scrollPositionKey] = Math.round(target - currentPath);\r\n \r\n return t < 1;\r\n };\r\n\r\n if(!duration || !path) {\r\n cancelAnimationByKey(container);\r\n tick();\r\n return Promise.resolve();\r\n }\r\n\r\n /* return new Promise((resolve) => {\r\n setTimeout(resolve, duration);\r\n }).then(() => {\r\n transformable.classList.add('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n fastRaf(() => {\r\n \r\n container[scrollPositionKey] = Math.round(target);\r\n //transformable.style.minHeight = ``;\r\n });\r\n \r\n }); */\r\n\r\n 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"],"sourceRoot":""} \ No newline at end of file diff --git a/public/20.a35ba2852f47b30df3d5.chunk.js b/public/20.a35ba2852f47b30df3d5.chunk.js deleted file mode 100644 index 64ebeada7..000000000 --- a/public/20.a35ba2852f47b30df3d5.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[20],{15:function(e,t,s){"use strict";s.r(t),s.d(t,"RootScope",(function(){return r}));var i=s(46),n=s(56),o=s(29);class r extends n.a{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",e=>{this.peerId=e}),this.addEventListener("user_auth",({id:e})=>{this.myId="number"==typeof i.b?+e:""+e}),this.addEventListener("connection_status_change",e=>{this.connectionStatus[e.name]=e}),this.addEventListener("idle",e=>{e?this.idle.focusPromise=new Promise(e=>{this.idle.focusResolve=e}):this.idle.focusResolve()})}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",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(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()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find(t=>t.name===e)}}const c=new r;o.a.rootScope=c,t.default=c},29:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));const i=s(76).a.debug,n="undefined"!=typeof window?window:self;t.b=i},46:function(e,t,s){"use strict";s.d(t,"b",(function(){return i})),s.d(t,"c",(function(){return n})),s.d(t,"d",(function(){return o})),s.d(t,"a",(function(){return r}));const i=0,n=1271266957,o=777e3,r=2147483647},56:function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));class i{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,s){var i,n;(null!==(i=this.listeners[e])&&void 0!==i?i:this.listeners[e]=[]).push({callback:t,options:s}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(n=s)||void 0===n?void 0:n.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,s){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}dispatchEvent(e,...t){this.reuseResults&&(this.listenerResults[e]=t);const s=[],i=this.listeners[e];if(i){i.slice().forEach(n=>{var o;-1!==i.findIndex(e=>e.callback===n.callback)&&(s.push(n.callback(...t)),(null===(o=n.options)||void 0===o?void 0:o.once)&&this.removeEventListener(e,n.callback))})}return s}cleanup(){this.listeners={},this.listenerResults={}}}},76:function(e,t,s){"use strict";const i={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1};t.a=i}}]); -//# sourceMappingURL=20.a35ba2852f47b30df3d5.chunk.js.map \ No newline at end of file diff --git a/public/20.a35ba2852f47b30df3d5.chunk.js.map b/public/20.a35ba2852f47b30df3d5.chunk.js.map deleted file mode 100644 index de7f119f7..000000000 --- a/public/20.a35ba2852f47b30df3d5.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///20.475b02f54077024062fb.chunk.js"],"names":["this","push","15","module","__webpack_exports__","__webpack_require__","r","d","RootScope","_mtproto_mtproto_config__WEBPACK_IMPORTED_MODULE_0__","_helpers_eventListenerBase__WEBPACK_IMPORTED_MODULE_1__","_config_debug__WEBPACK_IMPORTED_MODULE_2__","[object Object]","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","Promise","resolve","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","addEventListener","peerId","id","myId","status","name","themeColorElem","undefined","_themeColorElem","document","head","querySelector","color","themeColor","isNight","setAttribute","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","err","colorScheme","documentElement","classList","toggle","setThemeColor","isOverlayActive","value","getTheme","settings","theme","themes","find","t","rootScope","29","MOUNT_CLASS_TO","DEBUG","debug","self","46","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","56","EventListenerBase","reuseResults","_constructor","listeners","listenerResults","callback","options","_a","_b","hasOwnProperty","once","pop","obj","i","findAndSplice","l","args","arr","slice","forEach","listener","findIndex","removeEventListener","76","Modes","test","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker"],"mappings":"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","file":"20.a35ba2852f47b30df3d5.chunk.js","sourceRoot":""} \ No newline at end of file diff --git a/public/20.a6eb3895e2c4cb798a93.chunk.js b/public/20.a6eb3895e2c4cb798a93.chunk.js new file mode 100644 index 000000000..e8c2f1255 --- /dev/null +++ b/public/20.a6eb3895e2c4cb798a93.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[20],{15:function(e,t,s){"use strict";s.r(t),s.d(t,"RootScope",(function(){return r}));var i=s(45),n=s(54),o=s(29);class r extends n.a{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",e=>{this.peerId=e,document.body.classList.toggle("has-chat",!!e)}),this.addEventListener("user_auth",({id:e})=>{this.myId="number"==typeof i.b?+e:""+e}),this.addEventListener("connection_status_change",e=>{this.connectionStatus[e.name]=e}),this.addEventListener("idle",e=>{e?this.idle.focusPromise=new Promise(e=>{this.idle.focusResolve=e}):this.idle.focusResolve()})}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",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(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()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find(t=>t.name===e)}}const c=new r;o.a.rootScope=c,t.default=c},29:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));const i=s(77).a.debug,n="undefined"!=typeof window?window:self;t.b=i},45:function(e,t,s){"use strict";s.d(t,"b",(function(){return i})),s.d(t,"c",(function(){return n})),s.d(t,"d",(function(){return o})),s.d(t,"a",(function(){return r}));const i=0,n=1271266957,o=777e3,r=2147483647},54:function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));class i{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,s){var i,n;(null!==(i=this.listeners[e])&&void 0!==i?i:this.listeners[e]=[]).push({callback:t,options:s}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(n=s)||void 0===n?void 0:n.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,s){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}dispatchEvent(e,...t){this.reuseResults&&(this.listenerResults[e]=t);const s=[],i=this.listeners[e];if(i){i.slice().forEach(n=>{var o;-1!==i.findIndex(e=>e.callback===n.callback)&&(s.push(n.callback(...t)),(null===(o=n.options)||void 0===o?void 0:o.once)&&this.removeEventListener(e,n.callback))})}return s}cleanup(){this.listeners={},this.listenerResults={}}}},77:function(e,t,s){"use strict";const i={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1};t.a=i}}]); +//# sourceMappingURL=20.a6eb3895e2c4cb798a93.chunk.js.map \ No newline at end of file diff --git a/public/20.a6eb3895e2c4cb798a93.chunk.js.map b/public/20.a6eb3895e2c4cb798a93.chunk.js.map new file mode 100644 index 000000000..5ad6a5194 --- /dev/null +++ b/public/20.a6eb3895e2c4cb798a93.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/lib/rootScope.ts","webpack:///./src/config/debug.ts","webpack:///./src/lib/mtproto/mtproto_config.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/config/modes.ts"],"names":["RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","Promise","resolve","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","this","addEventListener","peerId","document","body","classList","toggle","id","myId","status","name","undefined","_themeColorElem","head","querySelector","color","themeColor","isNight","themeColorElem","setAttribute","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","err","colorScheme","documentElement","setThemeColor","value","isOverlayActive","getTheme","settings","theme","themes","find","t","rootScope","DEBUG","debug","MOUNT_CLASS_TO","self","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","EventListenerBase","reuseResults","_constructor","listeners","listenerResults","callback","options","push","hasOwnProperty","once","pop","obj","i","findAndSplice","l","args","arr","slice","forEach","listener","findIndex","removeEventListener","Modes","test","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker"],"mappings":"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","file":"20.a6eb3895e2c4cb798a93.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId, GroupCallInstance, GroupCallOutputSource } from \"./appManagers/appGroupCallsManager\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_views': {peerId: PeerId, mid: number, views: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number},\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_mount': void,\n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_state': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n 'group_call_pinned': {instance: GroupCallInstance, source?: GroupCallOutputSource}\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\n \n}); */\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\n","/*\r\n * https://github.com/morethanwords/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\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\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase> {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = [];\r\n\r\n /* let a = e.wm.get(this)[name];\r\n if(!a) return arr;\r\n const listeners = [...a]; */\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 arr.push(listener.callback(...args));\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n\r\n /* for(let i = 0, length = listeners.length; i < length; ++i) {\r\n const listener = listeners[i];\r\n arr.push(listener.callback(...args));\r\n\r\n if(listener.once) {\r\n listeners.splice(i, 1);\r\n --i;\r\n --length;\r\n }\r\n } */\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * 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\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false, //location.search.indexOf('http=1') > 0,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false\r\n};\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/21.3aef9bc049fb6abb3cd5.chunk.js b/public/21.3aef9bc049fb6abb3cd5.chunk.js deleted file mode 100644 index 624575554..000000000 --- a/public/21.3aef9bc049fb6abb3cd5.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[21],{109:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(51);class a{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const n=e.input;n.addEventListener("blur",()=>{this.playAnimation(0)}),n.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.b.loadAnimationFromURL({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"assets/img/TwoFactorSetupMonkeyIdle.tgs").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.b.waitForFirstFrame(e))),i.b.loadAnimationFromURL({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"assets/img/TwoFactorSetupMonkeyTracking.tgs").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.b.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},110:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(38);class a extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const a=this.value.length;if(a===e.length)e.onFill(this.value);else if(a===n)return;n=a})}}},23:function(e,t,n){"use strict";n.r(t);var i=n(37),a=n(17),s=n(32),o=n(62),l=n(20),r=n(109),h=n(110),u=n(16),d=n(66),c=n(36),p=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{r(i.next(e))}catch(e){s(e)}}function l(e){try{r(i.throw(e))}catch(e){s(e)}}function r(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,l)}r((i=i.apply(e,t||[])).next())}))};let m,b=null,y=null,v=null;const E=new o.a("page-authCode",!0,()=>{const e=b.type.length,t=new h.a({label:"Code",name:Object(d.b)(),length:e,onFill:e=>{o(e)}});m=t.input,E.pageEl.querySelector(".input-wrapper").append(t.container);E.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return l.default.mount()}));const a=()=>{setTimeout(()=>{g.remove()},300)},o=e=>{m.setAttribute("disabled","true");const i={phone_number:b.phone_number,phone_code_hash:b.phone_code_hash,phone_code:e};s.a.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then(e=>{switch(e._){case"auth.authorization":s.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>{e.default.mount()}),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(5),n.e(23)]).then(n.bind(null,25)).then(e=>{e.default.mount({phone_number:b.phone_number,phone_code_hash:b.phone_code_hash})}),a()}}).catch(e=>p(void 0,void 0,void 0,(function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(19).then(n.bind(null,21))).default.mount(),setTimeout(()=>{m.value=""},300);break;case"PHONE_CODE_EXPIRED":m.classList.add("error"),Object(c.a)(t.label,Object(u.i18n)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":m.classList.add("error"),Object(c.a)(t.label,Object(u.i18n)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),m.removeAttribute("disabled")})))},y=E.pageEl.querySelector(".auth-image"),v=i.b.isMobile?100:166,g=new r.a(t,v);return y.append(g.container),g.load()},e=>{if(b=e,y){m.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),m.dispatchEvent(e)}else y=E.pageEl.getElementsByClassName("phone")[0],v=E.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(y.innerText=b.phone_number,b.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=[b.type._]}Object(c.a)(v,Object(u.i18n)(t,n)),a.default.pushToState("authState",{_:"authStateAuthCode",sentCode:e})},()=>{m.focus()});t.default=E}}]); -//# sourceMappingURL=21.3aef9bc049fb6abb3cd5.chunk.js.map \ No newline at end of file diff --git a/public/21.3aef9bc049fb6abb3cd5.chunk.js.map b/public/21.3aef9bc049fb6abb3cd5.chunk.js.map deleted file mode 100644 index 8f68b4d17..000000000 --- a/public/21.3aef9bc049fb6abb3cd5.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/pages/pageAuthCode.ts"],"names":["TrackingMonkey","inputField","size","max","needFrame","this","container","document","createElement","classList","add","input","addEventListener","playAnimation","e","value","length","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","loadPromise","Promise","all","loadAnimationFromURL","loop","autoplay","width","height","then","waitForFirstFrame","_animation","currentFrame","pause","remove","CodeInputField","options","super","plainText","type","setAttribute","autocomplete","lastLength","setLabel","replace","slice","setValueSilently","onFill","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","codeInputField","label","name","code","submitCode","pageEl","querySelector","append","mount","cleanup","setTimeout","monkey","params","phone_number","phone_code_hash","phone_code","invokeApi","ignoreErrors","response","_","setUser","user","m","default","catch","err","good","handled","innerText","select","removeAttribute","imageDiv","isMobile","load","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","key","args","pushToState","sentCode","focus"],"mappings":"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","file":"21.3aef9bc049fb6abb3cd5.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationFromURL({\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 }, 'assets/img/TwoFactorSetupMonkeyIdle.tgs').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.loadAnimationFromURL({\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 }, 'assets/img/TwoFactorSetupMonkeyTracking.tgs').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then(m => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/21.44abbe422120bbe15936.chunk.js b/public/21.44abbe422120bbe15936.chunk.js new file mode 100644 index 000000000..a5b462907 --- /dev/null +++ b/public/21.44abbe422120bbe15936.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[21],{112:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(51);class a{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const n=e.input;n.addEventListener("blur",()=>{this.playAnimation(0)}),n.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.a.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.a.waitForFirstFrame(e))),i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.a.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},113:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(38);class a extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const a=this.value.length;if(a===e.length)e.onFill(this.value);else if(a===n)return;n=a})}}},23:function(e,t,n){"use strict";n.r(t);var i=n(37),a=n(17),s=n(33),o=n(64),l=n(20),r=n(112),h=n(113),u=n(16),d=n(65),c=n(36),p=function(e,t,n,i){return new(n||(n=Promise))((function(a,s){function o(e){try{r(i.next(e))}catch(e){s(e)}}function l(e){try{r(i.throw(e))}catch(e){s(e)}}function r(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,l)}r((i=i.apply(e,t||[])).next())}))};let m,y=null,b=null,v=null;const E=new o.a("page-authCode",!0,()=>{const e=y.type.length,t=new h.a({label:"Code",name:Object(d.b)(),length:e,onFill:e=>{o(e)}});m=t.input,E.pageEl.querySelector(".input-wrapper").append(t.container);E.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return l.default.mount()}));const a=()=>{setTimeout(()=>{_.remove()},300)},o=e=>{m.setAttribute("disabled","true");const i={phone_number:y.phone_number,phone_code_hash:y.phone_code_hash,phone_code:e};s.a.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then(e=>{switch(e._){case"auth.authorization":s.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>{e.default.mount()}),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(5),n.e(23)]).then(n.bind(null,25)).then(e=>{e.default.mount({phone_number:y.phone_number,phone_code_hash:y.phone_code_hash})}),a()}}).catch(e=>p(void 0,void 0,void 0,(function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(19).then(n.bind(null,21))).default.mount(),setTimeout(()=>{m.value=""},300);break;case"PHONE_CODE_EXPIRED":m.classList.add("error"),Object(c.a)(t.label,Object(u.i18n)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":m.classList.add("error"),Object(c.a)(t.label,Object(u.i18n)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),m.removeAttribute("disabled")})))},b=E.pageEl.querySelector(".auth-image"),v=i.b.isMobile?100:166,_=new r.a(t,v);return b.append(_.container),_.load()},e=>{if(y=e,b){m.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),m.dispatchEvent(e)}else b=E.pageEl.getElementsByClassName("phone")[0],v=E.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(b.innerText=y.phone_number,y.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[y.type._]}Object(c.a)(v,Object(u.i18n)(t,n)),a.default.pushToState("authState",{_:"authStateAuthCode",sentCode:e})},()=>{m.focus()});t.default=E}}]); +//# sourceMappingURL=21.44abbe422120bbe15936.chunk.js.map \ No newline at end of file diff --git a/public/21.44abbe422120bbe15936.chunk.js.map b/public/21.44abbe422120bbe15936.chunk.js.map new file mode 100644 index 000000000..988e64ded --- /dev/null +++ b/public/21.44abbe422120bbe15936.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/pages/pageAuthCode.ts"],"names":["TrackingMonkey","inputField","size","max","needFrame","this","container","document","createElement","classList","add","input","addEventListener","playAnimation","e","value","length","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","loadPromise","Promise","all","loadAnimationAsAsset","loop","autoplay","width","height","then","waitForFirstFrame","_animation","currentFrame","pause","remove","CodeInputField","options","super","plainText","type","setAttribute","autocomplete","lastLength","setLabel","replace","slice","setValueSilently","onFill","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","codeInputField","label","name","code","submitCode","pageEl","querySelector","append","mount","cleanup","setTimeout","monkey","params","phone_number","phone_code_hash","phone_code","invokeApi","ignoreErrors","response","_","setUser","user","m","default","catch","err","good","handled","innerText","select","removeAttribute","imageDiv","isMobile","load","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","key","args","pushToState","sentCode","focus"],"mappings":"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","file":"21.44abbe422120bbe15936.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then(m => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/22.0606c021aacfc21418bd.chunk.js b/public/22.077684f6412887cea1da.chunk.js similarity index 91% rename from public/22.0606c021aacfc21418bd.chunk.js rename to public/22.077684f6412887cea1da.chunk.js index 99385bccd..7e6f772ca 100644 --- a/public/22.0606c021aacfc21418bd.chunk.js +++ b/public/22.077684f6412887cea1da.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[22],{27:function(t,n,r){"use strict";r.r(n);var e=r(75);Object.defineProperty(Uint8Array.prototype,"hex",{get:function(){return Object(e.e)(this)},set:function(t){this.set(Object(e.c)(t))},enumerable:!0,configurable:!0}),Uint8Array.prototype.randomize=function(){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(this),this},Uint8Array.prototype.concat=function(...t){return Object(e.a)(this,...t)},Uint8Array.prototype.toJSON=function(){return[...this]},Array.prototype.findAndSplice=function(t){let n=this.findIndex(t);return-1!==n?this.splice(n,1)[0]:void 0},String.prototype.toHHMMSS=function(t=!1){const n=parseInt(this+"",10),r=Math.floor(n/3600);let e=Math.floor((n-3600*r)/60),o=n-3600*r-60*e;return r&&(t=!0),e<10&&(e=t?"0"+e:e),o<10&&(o="0"+o),(r?r+":":"")+e+":"+o},Promise.prototype.finally=Promise.prototype.finally||function(t){const n=n=>Promise.resolve(t()).then(n);return this.then(t=>n(()=>t),t=>n(()=>Promise.reject(t)))},Promise.prototype.safeFinally=function(t){return this.catch(()=>{}).finally(t)}},75:function(t,n,r){"use strict";function e(t){const n=t.length,r=new Array(n);for(let e=0;e>>n&24),2!==n&&e-i!=1||(r+=String.fromCharCode(c(o>>>18&63),c(o>>>12&63),c(o>>>6&63),c(63&o)),o=0);return r.replace(/A(?=A$|$)/g,"=")}function c(t){return t<26?t+65:t<52?t+71:t<62?t-4:62===t?43:63===t?47:65}function u(t,n){const r=t.length;if(r!==n.length)return!1;for(let e=0;et+(n.byteLength||n.length),0),r=new Uint8Array(n);let e=0;return t.forEach(t=>{r.set(t instanceof ArrayBuffer?new Uint8Array(t):t,e),e+=t.byteLength||t.length}),r}r.d(n,"e",(function(){return e})),r.d(n,"c",(function(){return o})),r.d(n,"d",(function(){return i})),r.d(n,"b",(function(){return u})),r.d(n,"a",(function(){return s}))}}]); -//# sourceMappingURL=22.0606c021aacfc21418bd.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[22],{27:function(t,n,r){"use strict";r.r(n);var e=r(76);Object.defineProperty(Uint8Array.prototype,"hex",{get:function(){return Object(e.e)(this)},set:function(t){this.set(Object(e.c)(t))},enumerable:!0,configurable:!0}),Uint8Array.prototype.randomize=function(){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(this),this},Uint8Array.prototype.concat=function(...t){return Object(e.a)(this,...t)},Uint8Array.prototype.toJSON=function(){return[...this]},Array.prototype.findAndSplice=function(t){let n=this.findIndex(t);return-1!==n?this.splice(n,1)[0]:void 0},String.prototype.toHHMMSS=function(t=!1){const n=parseInt(this+"",10),r=Math.floor(n/3600);let e=Math.floor((n-3600*r)/60),o=n-3600*r-60*e;return r&&(t=!0),e<10&&(e=t?"0"+e:e),o<10&&(o="0"+o),(r?r+":":"")+e+":"+o},Promise.prototype.finally=Promise.prototype.finally||function(t){const n=n=>Promise.resolve(t()).then(n);return this.then(t=>n(()=>t),t=>n(()=>Promise.reject(t)))},Promise.prototype.safeFinally=function(t){return this.catch(()=>{}).finally(t)}},76:function(t,n,r){"use strict";function e(t){const n=t.length,r=new Array(n);for(let e=0;e>>n&24),2!==n&&e-i!=1||(r+=String.fromCharCode(c(o>>>18&63),c(o>>>12&63),c(o>>>6&63),c(63&o)),o=0);return r.replace(/A(?=A$|$)/g,"=")}function c(t){return t<26?t+65:t<52?t+71:t<62?t-4:62===t?43:63===t?47:65}function u(t,n){const r=t.length;if(r!==n.length)return!1;for(let e=0;et+(n.byteLength||n.length),0),r=new Uint8Array(n);let e=0;return t.forEach(t=>{r.set(t instanceof ArrayBuffer?new Uint8Array(t):t,e),e+=t.byteLength||t.length}),r}r.d(n,"e",(function(){return e})),r.d(n,"c",(function(){return o})),r.d(n,"d",(function(){return i})),r.d(n,"b",(function(){return u})),r.d(n,"a",(function(){return s}))}}]); +//# sourceMappingURL=22.077684f6412887cea1da.chunk.js.map \ No newline at end of file diff --git a/public/22.0606c021aacfc21418bd.chunk.js.map b/public/22.077684f6412887cea1da.chunk.js.map similarity index 98% rename from public/22.0606c021aacfc21418bd.chunk.js.map rename to public/22.077684f6412887cea1da.chunk.js.map index d1206c8e6..321d91546 100644 --- a/public/22.0606c021aacfc21418bd.chunk.js.map +++ b/public/22.077684f6412887cea1da.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/lib/polyfill.ts","webpack:///./src/helpers/bytes.ts"],"names":["Object","defineProperty","Uint8Array","prototype","get","this","set","str","enumerable","configurable","randomize","crypto","Error","getRandomValues","concat","args","toJSON","Array","findAndSplice","verify","index","findIndex","splice","undefined","String","toHHMMSS","leadZero","sec_num","parseInt","hours","Math","floor","minutes","seconds","Promise","finally","fn","onFinally","callback","resolve","then","result","reason","reject","safeFinally","catch","bytesToHex","bytes","length","arr","i","toString","join","bytesFromHex","hexString","len","ceil","start","charAt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","fromCharCode","uint6ToBase64","replace","nUint6","bytesCmp","bytes1","bytes2","bufferConcats","reduce","acc","v","byteLength","tmp","lastLength","forEach","b","ArrayBuffer"],"mappings":"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","file":"22.0606c021aacfc21418bd.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { bytesToHex, bytesFromHex, bufferConcats } from '../helpers/bytes';\n\nObject.defineProperty(Uint8Array.prototype, 'hex', {\n get: function(): string {\n return bytesToHex(this);\n },\n \n set: function(str: string) {\n this.set(bytesFromHex(str));\n },\n enumerable: true,\n configurable: true\n});\n\nUint8Array.prototype.randomize = function() {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(this);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return this;\n};\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\nArray.prototype.findAndSplice = function(verify: (value: T, index?: number, array?: Array) => boolean) {\n let index = this.findIndex(verify);\n return index !== -1 ? this.splice(index, 1)[0] : undefined;\n};\n\nString.prototype.toHHMMSS = function(leadZero = false) {\n const sec_num = parseInt(this + '', 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/* Promise.prototype.finally = Promise.prototype.finally || {\n finally(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}.finally; */\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\nPromise.prototype.safeFinally = function(this: Promise, fn: () => any) {\n return this.catch(() => {}).finally(fn);\n};\n\ndeclare global {\n interface Uint8Array {\n hex: string;\n randomize: () => Uint8Array,\n concat: (...args: Array) => Uint8Array,\n //toString: () => string,\n toJSON: () => number[],\n //toJSON: () => {type: 'bytes', value: number[]},\n }\n \n interface Array {\n findAndSplice(verify: (value: T, index?: number, array?: Array) => boolean): T;\n }\n \n interface String {\n toHHMMSS(leadZero?: boolean): string;\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n safeFinally: (onfinally?: () => void) => Promise;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[0]);\r\n})(); */\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/lib/polyfill.ts","webpack:///./src/helpers/bytes.ts"],"names":["Object","defineProperty","Uint8Array","prototype","get","this","set","str","enumerable","configurable","randomize","crypto","Error","getRandomValues","concat","args","toJSON","Array","findAndSplice","verify","index","findIndex","splice","undefined","String","toHHMMSS","leadZero","sec_num","parseInt","hours","Math","floor","minutes","seconds","Promise","finally","fn","onFinally","callback","resolve","then","result","reason","reject","safeFinally","catch","bytesToHex","bytes","length","arr","i","toString","join","bytesFromHex","hexString","len","ceil","start","charAt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","fromCharCode","uint6ToBase64","replace","nUint6","bytesCmp","bytes1","bytes2","bufferConcats","reduce","acc","v","byteLength","tmp","lastLength","forEach","b","ArrayBuffer"],"mappings":"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","file":"22.077684f6412887cea1da.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { bytesToHex, bytesFromHex, bufferConcats } from '../helpers/bytes';\n\nObject.defineProperty(Uint8Array.prototype, 'hex', {\n get: function(): string {\n return bytesToHex(this);\n },\n \n set: function(str: string) {\n this.set(bytesFromHex(str));\n },\n enumerable: true,\n configurable: true\n});\n\nUint8Array.prototype.randomize = function() {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(this);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return this;\n};\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\nArray.prototype.findAndSplice = function(verify: (value: T, index?: number, array?: Array) => boolean) {\n let index = this.findIndex(verify);\n return index !== -1 ? this.splice(index, 1)[0] : undefined;\n};\n\nString.prototype.toHHMMSS = function(leadZero = false) {\n const sec_num = parseInt(this + '', 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/* Promise.prototype.finally = Promise.prototype.finally || {\n finally(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}.finally; */\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\nPromise.prototype.safeFinally = function(this: Promise, fn: () => any) {\n return this.catch(() => {}).finally(fn);\n};\n\ndeclare global {\n interface Uint8Array {\n hex: string;\n randomize: () => Uint8Array,\n concat: (...args: Array) => Uint8Array,\n //toString: () => string,\n toJSON: () => number[],\n //toJSON: () => {type: 'bytes', value: number[]},\n }\n \n interface Array {\n findAndSplice(verify: (value: T, index?: number, array?: Array) => boolean): T;\n }\n \n interface String {\n toHHMMSS(leadZero?: boolean): string;\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n safeFinally: (onfinally?: () => void) => Promise;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[0]);\r\n})(); */\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/23.e3145c0ea9684176558f.chunk.js b/public/23.6ddfbc8ae4fd86a3b037.chunk.js similarity index 90% rename from public/23.e3145c0ea9684176558f.chunk.js rename to public/23.6ddfbc8ae4fd86a3b037.chunk.js index 29815007e..ae874d55e 100644 --- a/public/23.e3145c0ea9684176558f.chunk.js +++ b/public/23.6ddfbc8ae4fd86a3b037.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[23],{25:function(e,t,a){"use strict";a.r(t);var n=a(33),i=a(38),s=a(35),r=a(134),c=a(17),l=a(16),u=a(32),o=a(31),p=a(89),d=a(62),m=a(7),h=a(36);let b=null;const v=new d.a("page-signUp",!0,()=>Promise.all([a.e(6),a.e(25)]).then(a.bind(null,70)).then(e=>{const t=new p.a({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});t.imageDiv.classList.add("avatar-edit"),t.title.classList.add("fullName");const c=document.createElement("canvas");c.id="canvas-avatar",c.className="avatar-edit-canvas";const d=document.createElement("span");d.className="tgico tgico-cameraadd",t.imageDiv.append(c,d);const v=e.default;let g;t.imageDiv.addEventListener("click",()=>{(new r.a).open(c,e=>{g=e})});const L=e=>{const a=f.value||"",n=w.value||"",i=a||n?(a+" "+n).trim():"";i?Object(h.a)(t.title,o.b.wrapEmojiText(i)):Object(h.a)(t.title,Object(l.i18n)("YourName"))};const f=new i.b({label:"FirstName",maxLength:70}),w=new i.b({label:"LastName",maxLength:64}),y=Object(n.a)("btn-primary btn-color-primary"),E=new l.default.IntlElement({key:"StartMessaging"});return y.append(E.element),t.inputWrapper.append(f.container,w.container,y),f.input.addEventListener("input",L),w.input.addEventListener("input",L),y.addEventListener("click",(function(e){if(f.input.classList.contains("error")||w.input.classList.contains("error"))return!1;if(!f.value.length)return f.input.classList.add("error"),!1;this.disabled=!0;const t=f.value.trim(),n=w.value.trim(),i={phone_number:b.phone_number,phone_code_hash:b.phone_code_hash,first_name:t,last_name:n};E.update({key:"PleaseWait"});const r=Object(s.f)(this);u.a.invokeApi("auth.signUp",i).then(e=>{switch(e._){case"auth.authorization":u.a.setUser(e.user),new Promise((e,t)=>{if(!g)return e();g().then(a=>{v.uploadProfilePhoto(a).then(e,t)},t)}).finally(()=>{a.e(4).then(a.bind(null,19)).then(e=>{e.default.mount()})});break;default:E.update({key:e._}),this.removeAttribute("disabled"),r.remove()}}).catch(e=>{this.removeAttribute("disabled"),r.remove(),e.type,E.update({key:e.type})})})),Object(m.a)(),new Promise(e=>{window.requestAnimationFrame(e)})}),e=>{b=e,c.default.pushToState("authState",{_:"authStateSignUp",authCode:e})});t.default=v},89:function(e,t,a){"use strict";a.d(t,"a",(function(){return i}));var n=a(16);class i{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append(Object(n.i18n)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append(Object(n.i18n)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); -//# sourceMappingURL=23.e3145c0ea9684176558f.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[23],{25:function(e,t,a){"use strict";a.r(t);var n=a(34),i=a(38),s=a(35),r=a(138),c=a(17),l=a(16),u=a(33),o=a(31),p=a(91),d=a(64),m=a(7),h=a(36);let b=null;const v=new d.a("page-signUp",!0,()=>Promise.all([a.e(6),a.e(25)]).then(a.bind(null,71)).then(e=>{const t=new p.a({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});t.imageDiv.classList.add("avatar-edit"),t.title.classList.add("fullName");const c=document.createElement("canvas");c.id="canvas-avatar",c.className="avatar-edit-canvas";const d=document.createElement("span");d.className="tgico tgico-cameraadd",t.imageDiv.append(c,d);const v=e.default;let g;t.imageDiv.addEventListener("click",()=>{(new r.a).open(c,e=>{g=e})});const L=e=>{const a=f.value||"",n=w.value||"",i=a||n?(a+" "+n).trim():"";i?Object(h.a)(t.title,o.b.wrapEmojiText(i)):Object(h.a)(t.title,Object(l.i18n)("YourName"))};const f=new i.b({label:"FirstName",maxLength:70}),w=new i.b({label:"LastName",maxLength:64}),y=Object(n.a)("btn-primary btn-color-primary"),E=new l.default.IntlElement({key:"StartMessaging"});return y.append(E.element),t.inputWrapper.append(f.container,w.container,y),f.input.addEventListener("input",L),w.input.addEventListener("input",L),y.addEventListener("click",(function(e){if(f.input.classList.contains("error")||w.input.classList.contains("error"))return!1;if(!f.value.length)return f.input.classList.add("error"),!1;this.disabled=!0;const t=f.value.trim(),n=w.value.trim(),i={phone_number:b.phone_number,phone_code_hash:b.phone_code_hash,first_name:t,last_name:n};E.update({key:"PleaseWait"});const r=Object(s.f)(this);u.a.invokeApi("auth.signUp",i).then(e=>{switch(e._){case"auth.authorization":u.a.setUser(e.user),new Promise((e,t)=>{if(!g)return e();g().then(a=>{v.uploadProfilePhoto(a).then(e,t)},t)}).finally(()=>{a.e(4).then(a.bind(null,19)).then(e=>{e.default.mount()})});break;default:E.update({key:e._}),this.removeAttribute("disabled"),r.remove()}}).catch(e=>{this.removeAttribute("disabled"),r.remove(),e.type,E.update({key:e.type})})})),Object(m.a)(),new Promise(e=>{window.requestAnimationFrame(e)})}),e=>{b=e,c.default.pushToState("authState",{_:"authStateSignUp",authCode:e})});t.default=v},91:function(e,t,a){"use strict";a.d(t,"a",(function(){return i}));var n=a(16);class i{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append(Object(n.i18n)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append(Object(n.i18n)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); +//# sourceMappingURL=23.6ddfbc8ae4fd86a3b037.chunk.js.map \ No newline at end of file diff --git a/public/23.e3145c0ea9684176558f.chunk.js.map b/public/23.6ddfbc8ae4fd86a3b037.chunk.js.map similarity index 99% rename from public/23.e3145c0ea9684176558f.chunk.js.map rename to public/23.6ddfbc8ae4fd86a3b037.chunk.js.map index 0025f8e27..4ecbc5f8c 100644 --- a/public/23.e3145c0ea9684176558f.chunk.js.map +++ b/public/23.6ddfbc8ae4fd86a3b037.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/pages/pageSignUp.ts","webpack:///./src/pages/loginPage.ts"],"names":["authCode","page","then","imported","className","withInputWrapper","titleLangKey","subtitleLangKey","imageDiv","classList","add","title","avatarPreview","document","createElement","id","addIco","append","appProfileManager","default","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","wrapEmojiText","label","maxLength","btnSignUp","btnI18n","IntlElement","key","element","inputWrapper","container","input","contains","length","this","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","invokeApi","response","_","setUser","user","Promise","resolve","reject","inputFile","uploadProfilePhoto","finally","m","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode","pushToState","LoginPage","options","body","querySelector","subtitle"],"mappings":"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","file":"23.e3145c0ea9684176558f.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/pages/pageSignUp.ts","webpack:///./src/pages/loginPage.ts"],"names":["authCode","page","then","imported","className","withInputWrapper","titleLangKey","subtitleLangKey","imageDiv","classList","add","title","avatarPreview","document","createElement","id","addIco","append","appProfileManager","default","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","wrapEmojiText","label","maxLength","btnSignUp","btnI18n","IntlElement","key","element","inputWrapper","container","input","contains","length","this","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","invokeApi","response","_","setUser","user","Promise","resolve","reject","inputFile","uploadProfilePhoto","finally","m","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode","pushToState","LoginPage","options","body","querySelector","subtitle"],"mappings":"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","file":"23.6ddfbc8ae4fd86a3b037.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/24.8835e4abc95acb08dcd5.chunk.js b/public/24.db7832d10818afdb3839.chunk.js similarity index 99% rename from public/24.8835e4abc95acb08dcd5.chunk.js rename to public/24.db7832d10818afdb3839.chunk.js index 0f817eeb8..e12bb7a31 100644 --- a/public/24.8835e4abc95acb08dcd5.chunk.js +++ b/public/24.db7832d10818afdb3839.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[24],{146:function(X,e,o){"use strict";o.r(e);e.default={_:"help.countriesList",countries:[{iso2:"AD",default_name:"Andorra",country_codes:[{country_code:"376",patterns:["XX XX XX"]}]},{iso2:"AE",default_name:"United Arab Emirates",country_codes:[{country_code:"971",patterns:["XX XXX XXXX"]}]},{iso2:"AF",default_name:"Afghanistan",country_codes:[{country_code:"93",patterns:["XXX XXX XXX"]}]},{iso2:"AG",default_name:"Antigua & Barbuda",country_codes:[{country_code:"1268",patterns:["XXX XXXX"]}]},{iso2:"AI",default_name:"Anguilla",country_codes:[{country_code:"1264",patterns:["XXX XXXX"]}]},{iso2:"AL",default_name:"Albania",country_codes:[{country_code:"355",patterns:["XX XXX XXXX"]}]},{iso2:"AM",default_name:"Armenia",country_codes:[{country_code:"374",patterns:["XX XXX XXX"]}]},{iso2:"AO",default_name:"Angola",country_codes:[{country_code:"244",patterns:["XXX XXX XXX"]}]},{iso2:"AR",default_name:"Argentina",country_codes:[{country_code:"54"}]},{iso2:"AS",default_name:"American Samoa",country_codes:[{country_code:"1684",patterns:["XXX XXXX"]}]},{iso2:"AT",default_name:"Austria",country_codes:[{country_code:"43",patterns:["X XXXXXXXX"]}]},{iso2:"AU",default_name:"Australia",country_codes:[{country_code:"61",patterns:["X XXXX XXXX"]}]},{iso2:"AW",default_name:"Aruba",country_codes:[{country_code:"297",patterns:["XXX XXXX"]}]},{iso2:"AZ",default_name:"Azerbaijan",country_codes:[{country_code:"994",patterns:["XX XXX XXXX"]}]},{iso2:"BA",default_name:"Bosnia & Herzegovina",country_codes:[{country_code:"387",patterns:["XX XXX XXX"]}]},{iso2:"BB",default_name:"Barbados",country_codes:[{country_code:"1246",patterns:["XXX XXXX"]}]},{iso2:"BD",default_name:"Bangladesh",country_codes:[{country_code:"880",patterns:["XX XXX XXX"]}]},{iso2:"BE",default_name:"Belgium",country_codes:[{country_code:"32",patterns:["XXX XX XX XX"]}]},{iso2:"BF",default_name:"Burkina Faso",country_codes:[{country_code:"226",patterns:["XX XX XX XX"]}]},{iso2:"BG",default_name:"Bulgaria",country_codes:[{country_code:"359"}]},{iso2:"BH",default_name:"Bahrain",country_codes:[{country_code:"973",patterns:["XXXX XXXX"]}]},{iso2:"BI",default_name:"Burundi",country_codes:[{country_code:"257",patterns:["XX XX XXXX"]}]},{iso2:"BJ",default_name:"Benin",country_codes:[{country_code:"229",patterns:["XX XXX XXX"]}]},{iso2:"BM",default_name:"Bermuda",country_codes:[{country_code:"1441",patterns:["XXX XXXX"]}]},{iso2:"BN",default_name:"Brunei Darussalam",country_codes:[{country_code:"673",patterns:["XXX XXXX"]}]},{iso2:"BO",default_name:"Bolivia",country_codes:[{country_code:"591",patterns:["X XXX XXXX"]}]},{iso2:"BQ",default_name:"Bonaire, Sint Eustatius & Saba",country_codes:[{country_code:"599"}]},{iso2:"BR",default_name:"Brazil",country_codes:[{country_code:"55",patterns:["XX XXXXX XXXX"]}]},{iso2:"BS",default_name:"Bahamas",country_codes:[{country_code:"1242",patterns:["XXX XXXX"]}]},{iso2:"BT",default_name:"Bhutan",country_codes:[{country_code:"975",patterns:["XX XXX XXX"]}]},{iso2:"BW",default_name:"Botswana",country_codes:[{country_code:"267",patterns:["XX XXX XXX"]}]},{iso2:"BY",default_name:"Belarus",country_codes:[{country_code:"375",patterns:["XX XXX XXXX"]}]},{iso2:"BZ",default_name:"Belize",country_codes:[{country_code:"501"}]},{iso2:"CA",default_name:"Canada",country_codes:[{country_code:"1",prefixes:["403","587","780","825","236","250","604","672","778","204","431","506","709","902","782","226","249","289","343","365","416","437","519","548","613","647","705","807","905","418","438","450","514","579","581","819","873","306","639","867"],patterns:["XXX XXX XXXX"]}]},{iso2:"CD",default_name:"Congo (Dem. Rep.)",country_codes:[{country_code:"243",patterns:["XX XXX XXXX"]}]},{iso2:"CF",default_name:"Central African Rep.",country_codes:[{country_code:"236",patterns:["XX XX XX XX"]}]},{iso2:"CG",default_name:"Congo (Rep.)",country_codes:[{country_code:"242",patterns:["XX XXX XXXX"]}]},{iso2:"CH",default_name:"Switzerland",country_codes:[{country_code:"41",patterns:["XX XXX XXXX"]}]},{iso2:"CI",default_name:"Côte d'Ivoire",country_codes:[{country_code:"225",patterns:["XX XX XX XXXX"]}]},{iso2:"CK",default_name:"Cook Islands",country_codes:[{country_code:"682"}]},{iso2:"CL",default_name:"Chile",country_codes:[{country_code:"56",patterns:["X XXXX XXXX"]}]},{iso2:"CM",default_name:"Cameroon",country_codes:[{country_code:"237",patterns:["XXXX XXXX"]}]},{iso2:"CN",default_name:"China",country_codes:[{country_code:"86",patterns:["XXX XXXX XXXX"]}]},{iso2:"CO",default_name:"Colombia",country_codes:[{country_code:"57",patterns:["XXX XXX XXXX"]}]},{iso2:"CR",default_name:"Costa Rica",country_codes:[{country_code:"506",patterns:["XXXX XXXX"]}]},{iso2:"CU",default_name:"Cuba",country_codes:[{country_code:"53",patterns:["X XXX XXXX"]}]},{iso2:"CV",default_name:"Cape Verde",country_codes:[{country_code:"238",patterns:["XXX XXXX"]}]},{iso2:"CW",default_name:"Curaçao",country_codes:[{country_code:"599",prefixes:["9"]}]},{iso2:"CY",default_name:"Cyprus",country_codes:[{country_code:"357",patterns:["XXXX XXXX"]}]},{iso2:"CZ",default_name:"Czech Republic",country_codes:[{country_code:"420",patterns:["XXX XXX XXX"]}]},{iso2:"DE",default_name:"Germany",country_codes:[{country_code:"49",patterns:["XXXX XXXXXXX","16X XXXXXXX","17X XXXXXXX","3601 4198XX"]}]},{iso2:"DJ",default_name:"Djibouti",country_codes:[{country_code:"253",patterns:["XX XX XX XX"]}]},{iso2:"DK",default_name:"Denmark",country_codes:[{country_code:"45",patterns:["XXXX XXXX"]}]},{iso2:"DM",default_name:"Dominica",country_codes:[{country_code:"1767",patterns:["XXX XXXX"]}]},{iso2:"DO",default_name:"Dominican Rep.",country_codes:[{country_code:"1809",patterns:["XXX XXXX"]},{country_code:"1829",patterns:["XXX XXXX"]},{country_code:"1849",patterns:["XXX XXXX"]}]},{iso2:"DZ",default_name:"Algeria",country_codes:[{country_code:"213",patterns:["XXX XX XX XX"]}]},{iso2:"EC",default_name:"Ecuador",country_codes:[{country_code:"593",patterns:["XX XXX XXXX"]}]},{iso2:"EE",default_name:"Estonia",country_codes:[{country_code:"372",patterns:["XXXX XXXX"]}]},{iso2:"EG",default_name:"Egypt",country_codes:[{country_code:"20",patterns:["XX XXXX XXXX"]}]},{iso2:"ER",default_name:"Eritrea",country_codes:[{country_code:"291",patterns:["X XXX XXX"]}]},{iso2:"ES",default_name:"Spain",country_codes:[{country_code:"34",patterns:["XXX XXX XXX"]}]},{iso2:"ET",default_name:"Ethiopia",country_codes:[{country_code:"251",patterns:["XX XXX XXXX"]}]},{iso2:"FI",default_name:"Finland",country_codes:[{country_code:"358"}]},{iso2:"FJ",default_name:"Fiji",country_codes:[{country_code:"679",patterns:["XXX XXXX"]}]},{iso2:"FK",default_name:"Falkland Islands",country_codes:[{country_code:"500"}]},{iso2:"FM",default_name:"Micronesia",country_codes:[{country_code:"691"}]},{iso2:"FO",default_name:"Faroe Islands",country_codes:[{country_code:"298",patterns:["XXX XXX"]}]},{iso2:"FR",default_name:"France",country_codes:[{country_code:"33",patterns:["X XX XX XX XX"]}]},{iso2:"GA",default_name:"Gabon",country_codes:[{country_code:"241",patterns:["X XX XX XX"]}]},{iso2:"GB",default_name:"United Kingdom",country_codes:[{country_code:"44",patterns:["XXXX XXXXXX"]}]},{iso2:"GD",default_name:"Grenada",country_codes:[{country_code:"1473",patterns:["XXX XXXX"]}]},{iso2:"GE",default_name:"Georgia",country_codes:[{country_code:"995",patterns:["XXX XXX XXX"]}]},{iso2:"GF",default_name:"French Guiana",country_codes:[{country_code:"594"}]},{iso2:"GH",default_name:"Ghana",country_codes:[{country_code:"233",patterns:["XX XXX XXXX"]}]},{iso2:"GI",default_name:"Gibraltar",country_codes:[{country_code:"350",patterns:["XXXX XXXX"]}]},{iso2:"GL",default_name:"Greenland",country_codes:[{country_code:"299",patterns:["XXX XXX"]}]},{iso2:"GM",default_name:"Gambia",country_codes:[{country_code:"220",patterns:["XXX XXXX"]}]},{iso2:"GN",default_name:"Guinea",country_codes:[{country_code:"224",patterns:["XXX XXX XXX"]}]},{iso2:"GP",default_name:"Guadeloupe",country_codes:[{country_code:"590",patterns:["XXX XX XX XX"]}]},{iso2:"GQ",default_name:"Equatorial Guinea",country_codes:[{country_code:"240",patterns:["XXX XXX XXX"]}]},{iso2:"GR",default_name:"Greece",country_codes:[{country_code:"30",patterns:["XXX XXX XXXX"]}]},{iso2:"GT",default_name:"Guatemala",country_codes:[{country_code:"502",patterns:["X XXX XXXX"]}]},{iso2:"GU",default_name:"Guam",country_codes:[{country_code:"1671",patterns:["XXX XXXX"]}]},{iso2:"GW",default_name:"Guinea-Bissau",country_codes:[{country_code:"245",patterns:["XXX XXXX"]}]},{iso2:"GY",default_name:"Guyana",country_codes:[{country_code:"592"}]},{iso2:"HK",default_name:"Hong Kong",country_codes:[{country_code:"852",patterns:["X XXX XXXX"]}]},{iso2:"HN",default_name:"Honduras",country_codes:[{country_code:"504",patterns:["XXXX XXXX"]}]},{iso2:"HR",default_name:"Croatia",country_codes:[{country_code:"385",patterns:["XX XXX XXX"]}]},{iso2:"HT",default_name:"Haiti",country_codes:[{country_code:"509",patterns:["XXXX XXXX"]}]},{iso2:"HU",default_name:"Hungary",country_codes:[{country_code:"36",patterns:["XXX XXX XXX"]}]},{iso2:"ID",default_name:"Indonesia",country_codes:[{country_code:"62",patterns:["XXX XXXXXX"]}]},{iso2:"IE",default_name:"Ireland",country_codes:[{country_code:"353",patterns:["XX XXX XXXX"]}]},{iso2:"IL",default_name:"Israel",country_codes:[{country_code:"972",patterns:["XX XXX XXXX"]}]},{iso2:"IN",default_name:"India",country_codes:[{country_code:"91",patterns:["XXXXX XXXXX"]}]},{iso2:"IO",default_name:"Diego Garcia",country_codes:[{country_code:"246",patterns:["XXX XXXX"]}]},{iso2:"IQ",default_name:"Iraq",country_codes:[{country_code:"964",patterns:["XXX XXX XXXX"]}]},{iso2:"IR",default_name:"Iran",country_codes:[{country_code:"98",patterns:["XXX XXX XXXX"]}]},{iso2:"IS",default_name:"Iceland",country_codes:[{country_code:"354",patterns:["XXX XXXX"]}]},{iso2:"IT",default_name:"Italy",country_codes:[{country_code:"39",patterns:["XXX XXX XXX"]}]},{iso2:"JM",default_name:"Jamaica",country_codes:[{country_code:"1876",patterns:["XXX XXXX"]}]},{iso2:"JO",default_name:"Jordan",country_codes:[{country_code:"962",patterns:["X XXXX XXXX"]}]},{iso2:"JP",default_name:"Japan",country_codes:[{country_code:"81",patterns:["XX XXXX XXXX"]}]},{iso2:"KE",default_name:"Kenya",country_codes:[{country_code:"254",patterns:["XXX XXX XXX"]}]},{iso2:"KG",default_name:"Kyrgyzstan",country_codes:[{country_code:"996",patterns:["XXX XXXXXX"]}]},{iso2:"KH",default_name:"Cambodia",country_codes:[{country_code:"855",patterns:["XX XXX XXX"]}]},{iso2:"KI",default_name:"Kiribati",country_codes:[{country_code:"686",patterns:["XXXX XXXX"]}]},{iso2:"KM",default_name:"Comoros",country_codes:[{country_code:"269",patterns:["XXX XXXX"]}]},{iso2:"KN",default_name:"Saint Kitts & Nevis",country_codes:[{country_code:"1869",patterns:["XXX XXXX"]}]},{iso2:"KP",default_name:"North Korea",country_codes:[{country_code:"850"}]},{iso2:"KR",default_name:"South Korea",country_codes:[{country_code:"82",patterns:["XX XXXX XXX"]}]},{iso2:"KW",default_name:"Kuwait",country_codes:[{country_code:"965",patterns:["XXXX XXXX"]}]},{iso2:"KY",default_name:"Cayman Islands",country_codes:[{country_code:"1345",patterns:["XXX XXXX"]}]},{iso2:"KZ",default_name:"Kazakhstan",country_codes:[{country_code:"7",prefixes:["6","7"],patterns:["XXX XXX XX XX"]}]},{iso2:"LA",default_name:"Laos",country_codes:[{country_code:"856",patterns:["XX XX XXX XXX"]}]},{iso2:"LB",default_name:"Lebanon",country_codes:[{country_code:"961",patterns:["XX XXX XXX"]}]},{iso2:"LC",default_name:"Saint Lucia",country_codes:[{country_code:"1758",patterns:["XXX XXXX"]}]},{iso2:"LI",default_name:"Liechtenstein",country_codes:[{country_code:"423",patterns:["XXX XXXX"]}]},{iso2:"LK",default_name:"Sri Lanka",country_codes:[{country_code:"94",patterns:["XX XXX XXXX"]}]},{iso2:"LR",default_name:"Liberia",country_codes:[{country_code:"231",patterns:["XX XXX XXXX"]}]},{iso2:"LS",default_name:"Lesotho",country_codes:[{country_code:"266",patterns:["XX XXX XXX"]}]},{iso2:"LT",default_name:"Lithuania",country_codes:[{country_code:"370",patterns:["XXX XXXXX"]}]},{iso2:"LU",default_name:"Luxembourg",country_codes:[{country_code:"352",patterns:["XXX XXX XXX"]}]},{iso2:"LV",default_name:"Latvia",country_codes:[{country_code:"371",patterns:["XXX XXXXX"]}]},{iso2:"LY",default_name:"Libya",country_codes:[{country_code:"218",patterns:["XX XXX XXXX"]}]},{iso2:"MA",default_name:"Morocco",country_codes:[{country_code:"212",patterns:["XX XXX XXXX"]}]},{iso2:"MC",default_name:"Monaco",country_codes:[{country_code:"377",patterns:["XXXX XXXX"]}]},{iso2:"MD",default_name:"Moldova",country_codes:[{country_code:"373",patterns:["XX XXX XXX"]}]},{iso2:"ME",default_name:"Montenegro",country_codes:[{country_code:"382"}]},{iso2:"MG",default_name:"Madagascar",country_codes:[{country_code:"261",patterns:["XX XX XXX XX"]}]},{iso2:"MH",default_name:"Marshall Islands",country_codes:[{country_code:"692"}]},{iso2:"MK",default_name:"North Macedonia",country_codes:[{country_code:"389",patterns:["XX XXX XXX"]}]},{iso2:"ML",default_name:"Mali",country_codes:[{country_code:"223",patterns:["XXXX XXXX"]}]},{iso2:"MM",default_name:"Myanmar",country_codes:[{country_code:"95"}]},{iso2:"MN",default_name:"Mongolia",country_codes:[{country_code:"976",patterns:["XX XX XXXX"]}]},{iso2:"MO",default_name:"Macau",country_codes:[{country_code:"853",patterns:["XXXX XXXX"]}]},{iso2:"MP",default_name:"Northern Mariana Islands",country_codes:[{country_code:"1670",patterns:["XXX XXXX"]}]},{iso2:"MQ",default_name:"Martinique",country_codes:[{country_code:"596"}]},{iso2:"MR",default_name:"Mauritania",country_codes:[{country_code:"222",patterns:["XXXX XXXX"]}]},{iso2:"MS",default_name:"Montserrat",country_codes:[{country_code:"1664",patterns:["XXX XXXX"]}]},{iso2:"MT",default_name:"Malta",country_codes:[{country_code:"356",patterns:["XX XX XX XX"]}]},{iso2:"MU",default_name:"Mauritius",country_codes:[{country_code:"230",patterns:["XXXX XXXX"]}]},{iso2:"MV",default_name:"Maldives",country_codes:[{country_code:"960",patterns:["XXX XXXX"]}]},{iso2:"MW",default_name:"Malawi",country_codes:[{country_code:"265",patterns:["XX XXX XXXX"]}]},{iso2:"MX",default_name:"Mexico",country_codes:[{country_code:"52"}]},{iso2:"MY",default_name:"Malaysia",country_codes:[{country_code:"60",patterns:["XX XXXX XXXX"]}]},{iso2:"MZ",default_name:"Mozambique",country_codes:[{country_code:"258",patterns:["XX XXX XXXX"]}]},{iso2:"NA",default_name:"Namibia",country_codes:[{country_code:"264",patterns:["XX XXX XXXX"]}]},{iso2:"NC",default_name:"New Caledonia",country_codes:[{country_code:"687"}]},{iso2:"NE",default_name:"Niger",country_codes:[{country_code:"227",patterns:["XX XX XX XX"]}]},{iso2:"NF",default_name:"Norfolk Island",country_codes:[{country_code:"672"}]},{iso2:"NG",default_name:"Nigeria",country_codes:[{country_code:"234",patterns:["XX XXXX XXXX"]}]},{iso2:"NI",default_name:"Nicaragua",country_codes:[{country_code:"505",patterns:["XXXX XXXX"]}]},{iso2:"NL",default_name:"Netherlands",country_codes:[{country_code:"31",patterns:["X XX XX XX XX","97 XXXX XXXXX"]}]},{iso2:"NO",default_name:"Norway",country_codes:[{country_code:"47",patterns:["XXXX XXXX"]}]},{iso2:"NP",default_name:"Nepal",country_codes:[{country_code:"977",patterns:["XX XXXX XXXX"]}]},{iso2:"NR",default_name:"Nauru",country_codes:[{country_code:"674"}]},{iso2:"NU",default_name:"Niue",country_codes:[{country_code:"683"}]},{iso2:"NZ",default_name:"New Zealand",country_codes:[{country_code:"64",patterns:["XXXX XXXX"]}]},{iso2:"OM",default_name:"Oman",country_codes:[{country_code:"968",patterns:["XXXX XXXX"]}]},{iso2:"PA",default_name:"Panama",country_codes:[{country_code:"507",patterns:["XXXX XXXX"]}]},{iso2:"PE",default_name:"Peru",country_codes:[{country_code:"51",patterns:["XXX XXX XXX"]}]},{iso2:"PF",default_name:"French Polynesia",country_codes:[{country_code:"689"}]},{iso2:"PG",default_name:"Papua New Guinea",country_codes:[{country_code:"675"}]},{iso2:"PH",default_name:"Philippines",country_codes:[{country_code:"63",patterns:["XXX XXX XXXX"]}]},{iso2:"PK",default_name:"Pakistan",country_codes:[{country_code:"92",patterns:["XXX XXX XXXX"]}]},{iso2:"PL",default_name:"Poland",country_codes:[{country_code:"48",patterns:["XXX XXX XXX"]}]},{iso2:"PM",default_name:"Saint Pierre & Miquelon",country_codes:[{country_code:"508"}]},{iso2:"PR",default_name:"Puerto Rico",country_codes:[{country_code:"1787",patterns:["XXX XXXX"]},{country_code:"1939",patterns:["XXX XXXX"]}]},{iso2:"PS",default_name:"Palestine",country_codes:[{country_code:"970",patterns:["XXX XX XXXX"]}]},{iso2:"PT",default_name:"Portugal",country_codes:[{country_code:"351",patterns:["XXX XXX XXX"]}]},{iso2:"PW",default_name:"Palau",country_codes:[{country_code:"680"}]},{iso2:"PY",default_name:"Paraguay",country_codes:[{country_code:"595",patterns:["XXX XXX XXX"]}]},{iso2:"QA",default_name:"Qatar",country_codes:[{country_code:"974",patterns:["XX XXX XXX"]}]},{iso2:"RE",default_name:"Réunion",country_codes:[{country_code:"262",patterns:["XXX XXX XXX"]}]},{iso2:"RO",default_name:"Romania",country_codes:[{country_code:"40",patterns:["XXX XXX XXX"]}]},{iso2:"RS",default_name:"Serbia",country_codes:[{country_code:"381",patterns:["XX XXX XXXX"]}]},{iso2:"RU",default_name:"Russian Federation",country_codes:[{country_code:"7",patterns:["XXX XXX XXXX"]}]},{iso2:"RW",default_name:"Rwanda",country_codes:[{country_code:"250",patterns:["XXX XXX XXX"]}]},{iso2:"SA",default_name:"Saudi Arabia",country_codes:[{country_code:"966",patterns:["XX XXX XXXX"]}]},{iso2:"SB",default_name:"Solomon Islands",country_codes:[{country_code:"677"}]},{iso2:"SC",default_name:"Seychelles",country_codes:[{country_code:"248",patterns:["X XX XX XX"]}]},{iso2:"SD",default_name:"Sudan",country_codes:[{country_code:"249",patterns:["XX XXX XXXX"]}]},{iso2:"SE",default_name:"Sweden",country_codes:[{country_code:"46",patterns:["XX XXX XXXX"]}]},{iso2:"SG",default_name:"Singapore",country_codes:[{country_code:"65",patterns:["XXXX XXXX"]}]},{iso2:"SH",default_name:"Saint Helena",country_codes:[{country_code:"247"},{country_code:"290",patterns:["XX XXX"]}]},{iso2:"SI",default_name:"Slovenia",country_codes:[{country_code:"386",patterns:["XX XXX XXX"]}]},{iso2:"SK",default_name:"Slovakia",country_codes:[{country_code:"421",patterns:["XXX XXX XXX"]}]},{iso2:"SL",default_name:"Sierra Leone",country_codes:[{country_code:"232",patterns:["XX XXX XXX"]}]},{iso2:"SM",default_name:"San Marino",country_codes:[{country_code:"378",patterns:["XXX XXX XXXX"]}]},{iso2:"SN",default_name:"Senegal",country_codes:[{country_code:"221",patterns:["XX XXX XXXX"]}]},{iso2:"SO",default_name:"Somalia",country_codes:[{country_code:"252",patterns:["XX XXX XXX"]}]},{iso2:"SR",default_name:"Suriname",country_codes:[{country_code:"597",patterns:["XXX XXXX"]}]},{iso2:"SS",default_name:"South Sudan",country_codes:[{country_code:"211",patterns:["XX XXX XXXX"]}]},{iso2:"ST",default_name:"São Tomé & Príncipe",country_codes:[{country_code:"239",patterns:["XX XXXXX"]}]},{iso2:"SV",default_name:"El Salvador",country_codes:[{country_code:"503",patterns:["XXXX XXXX"]}]},{iso2:"SX",default_name:"Sint Maarten",country_codes:[{country_code:"1721",patterns:["XXX XXXX"]}]},{iso2:"SY",default_name:"Syria",country_codes:[{country_code:"963",patterns:["XXX XXX XXX"]}]},{iso2:"SZ",default_name:"Eswatini",country_codes:[{country_code:"268",patterns:["XXXX XXXX"]}]},{iso2:"TC",default_name:"Turks & Caicos Islands",country_codes:[{country_code:"1649",patterns:["XXX XXXX"]}]},{iso2:"TD",default_name:"Chad",country_codes:[{country_code:"235",patterns:["XX XX XX XX"]}]},{iso2:"TG",default_name:"Togo",country_codes:[{country_code:"228",patterns:["XX XXX XXX"]}]},{iso2:"TH",default_name:"Thailand",country_codes:[{country_code:"66",patterns:["X XXXX XXXX"]}]},{iso2:"TJ",default_name:"Tajikistan",country_codes:[{country_code:"992",patterns:["XX XXX XXXX"]}]},{iso2:"TK",default_name:"Tokelau",country_codes:[{country_code:"690"}]},{iso2:"TL",default_name:"Timor-Leste",country_codes:[{country_code:"670"}]},{iso2:"TM",default_name:"Turkmenistan",country_codes:[{country_code:"993",patterns:["XX XXXXXX"]}]},{iso2:"TN",default_name:"Tunisia",country_codes:[{country_code:"216",patterns:["XX XXX XXX"]}]},{iso2:"TO",default_name:"Tonga",country_codes:[{country_code:"676"}]},{iso2:"TR",default_name:"Turkey",country_codes:[{country_code:"90",patterns:["XXX XXX XXXX"]}]},{iso2:"TT",default_name:"Trinidad & Tobago",country_codes:[{country_code:"1868",patterns:["XXX XXXX"]}]},{iso2:"TV",default_name:"Tuvalu",country_codes:[{country_code:"688"}]},{iso2:"TW",default_name:"Taiwan",country_codes:[{country_code:"886",patterns:["XXX XXX XXX"]}]},{iso2:"TZ",default_name:"Tanzania",country_codes:[{country_code:"255",patterns:["XX XXX XXXX"]}]},{iso2:"UA",default_name:"Ukraine",country_codes:[{country_code:"380",patterns:["XX XXX XX XX"]}]},{iso2:"UG",default_name:"Uganda",country_codes:[{country_code:"256",patterns:["XX XXX XXXX"]}]},{iso2:"US",default_name:"USA",country_codes:[{country_code:"1",patterns:["XXX XXX XXXX"]}]},{iso2:"UY",default_name:"Uruguay",country_codes:[{country_code:"598",patterns:["X XXX XXXX"]}]},{iso2:"UZ",default_name:"Uzbekistan",country_codes:[{country_code:"998",patterns:["XX XXX XX XX"]}]},{iso2:"VC",default_name:"Saint Vincent & the Grenadines",country_codes:[{country_code:"1784",patterns:["XXX XXXX"]}]},{iso2:"VE",default_name:"Venezuela",country_codes:[{country_code:"58",patterns:["XXX XXX XXXX"]}]},{iso2:"VG",default_name:"British Virgin Islands",country_codes:[{country_code:"1284",patterns:["XXX XXXX"]}]},{iso2:"VI",default_name:"US Virgin Islands",country_codes:[{country_code:"1340",patterns:["XXX XXXX"]}]},{iso2:"VN",default_name:"Vietnam",country_codes:[{country_code:"84"}]},{iso2:"VU",default_name:"Vanuatu",country_codes:[{country_code:"678"}]},{iso2:"WF",default_name:"Wallis & Futuna",country_codes:[{country_code:"681"}]},{iso2:"WS",default_name:"Samoa",country_codes:[{country_code:"685"}]},{iso2:"XK",default_name:"Kosovo",country_codes:[{country_code:"383",patterns:["XXXX XXXX"]}]},{iso2:"YE",default_name:"Yemen",country_codes:[{country_code:"967",patterns:["XXX XXX XXX"]}]},{iso2:"ZA",default_name:"South Africa",country_codes:[{country_code:"27",patterns:["XX XXX XXXX"]}]},{iso2:"ZM",default_name:"Zambia",country_codes:[{country_code:"260",patterns:["XX XXX XXXX"]}]},{iso2:"ZW",default_name:"Zimbabwe",country_codes:[{country_code:"263",patterns:["XX XXX XXXX"]}]}],hash:0}}}]); -//# sourceMappingURL=24.8835e4abc95acb08dcd5.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[24],{152:function(X,e,o){"use strict";o.r(e);e.default={_:"help.countriesList",countries:[{iso2:"AD",default_name:"Andorra",country_codes:[{country_code:"376",patterns:["XX XX XX"]}]},{iso2:"AE",default_name:"United Arab Emirates",country_codes:[{country_code:"971",patterns:["XX XXX XXXX"]}]},{iso2:"AF",default_name:"Afghanistan",country_codes:[{country_code:"93",patterns:["XXX XXX XXX"]}]},{iso2:"AG",default_name:"Antigua & Barbuda",country_codes:[{country_code:"1268",patterns:["XXX XXXX"]}]},{iso2:"AI",default_name:"Anguilla",country_codes:[{country_code:"1264",patterns:["XXX XXXX"]}]},{iso2:"AL",default_name:"Albania",country_codes:[{country_code:"355",patterns:["XX XXX XXXX"]}]},{iso2:"AM",default_name:"Armenia",country_codes:[{country_code:"374",patterns:["XX XXX XXX"]}]},{iso2:"AO",default_name:"Angola",country_codes:[{country_code:"244",patterns:["XXX XXX XXX"]}]},{iso2:"AR",default_name:"Argentina",country_codes:[{country_code:"54"}]},{iso2:"AS",default_name:"American Samoa",country_codes:[{country_code:"1684",patterns:["XXX XXXX"]}]},{iso2:"AT",default_name:"Austria",country_codes:[{country_code:"43",patterns:["X XXXXXXXX"]}]},{iso2:"AU",default_name:"Australia",country_codes:[{country_code:"61",patterns:["X XXXX XXXX"]}]},{iso2:"AW",default_name:"Aruba",country_codes:[{country_code:"297",patterns:["XXX XXXX"]}]},{iso2:"AZ",default_name:"Azerbaijan",country_codes:[{country_code:"994",patterns:["XX XXX XXXX"]}]},{iso2:"BA",default_name:"Bosnia & Herzegovina",country_codes:[{country_code:"387",patterns:["XX XXX XXX"]}]},{iso2:"BB",default_name:"Barbados",country_codes:[{country_code:"1246",patterns:["XXX XXXX"]}]},{iso2:"BD",default_name:"Bangladesh",country_codes:[{country_code:"880",patterns:["XX XXX XXX"]}]},{iso2:"BE",default_name:"Belgium",country_codes:[{country_code:"32",patterns:["XXX XX XX XX"]}]},{iso2:"BF",default_name:"Burkina Faso",country_codes:[{country_code:"226",patterns:["XX XX XX XX"]}]},{iso2:"BG",default_name:"Bulgaria",country_codes:[{country_code:"359"}]},{iso2:"BH",default_name:"Bahrain",country_codes:[{country_code:"973",patterns:["XXXX XXXX"]}]},{iso2:"BI",default_name:"Burundi",country_codes:[{country_code:"257",patterns:["XX XX XXXX"]}]},{iso2:"BJ",default_name:"Benin",country_codes:[{country_code:"229",patterns:["XX XXX XXX"]}]},{iso2:"BM",default_name:"Bermuda",country_codes:[{country_code:"1441",patterns:["XXX XXXX"]}]},{iso2:"BN",default_name:"Brunei Darussalam",country_codes:[{country_code:"673",patterns:["XXX XXXX"]}]},{iso2:"BO",default_name:"Bolivia",country_codes:[{country_code:"591",patterns:["X XXX XXXX"]}]},{iso2:"BQ",default_name:"Bonaire, Sint Eustatius & Saba",country_codes:[{country_code:"599"}]},{iso2:"BR",default_name:"Brazil",country_codes:[{country_code:"55",patterns:["XX XXXXX XXXX"]}]},{iso2:"BS",default_name:"Bahamas",country_codes:[{country_code:"1242",patterns:["XXX XXXX"]}]},{iso2:"BT",default_name:"Bhutan",country_codes:[{country_code:"975",patterns:["XX XXX XXX"]}]},{iso2:"BW",default_name:"Botswana",country_codes:[{country_code:"267",patterns:["XX XXX XXX"]}]},{iso2:"BY",default_name:"Belarus",country_codes:[{country_code:"375",patterns:["XX XXX XXXX"]}]},{iso2:"BZ",default_name:"Belize",country_codes:[{country_code:"501"}]},{iso2:"CA",default_name:"Canada",country_codes:[{country_code:"1",prefixes:["403","587","780","825","236","250","604","672","778","204","431","506","709","902","782","226","249","289","343","365","416","437","519","548","613","647","705","807","905","418","438","450","514","579","581","819","873","306","639","867"],patterns:["XXX XXX XXXX"]}]},{iso2:"CD",default_name:"Congo (Dem. Rep.)",country_codes:[{country_code:"243",patterns:["XX XXX XXXX"]}]},{iso2:"CF",default_name:"Central African Rep.",country_codes:[{country_code:"236",patterns:["XX XX XX XX"]}]},{iso2:"CG",default_name:"Congo (Rep.)",country_codes:[{country_code:"242",patterns:["XX XXX XXXX"]}]},{iso2:"CH",default_name:"Switzerland",country_codes:[{country_code:"41",patterns:["XX XXX XXXX"]}]},{iso2:"CI",default_name:"Côte d'Ivoire",country_codes:[{country_code:"225",patterns:["XX XX XX XXXX"]}]},{iso2:"CK",default_name:"Cook Islands",country_codes:[{country_code:"682"}]},{iso2:"CL",default_name:"Chile",country_codes:[{country_code:"56",patterns:["X XXXX XXXX"]}]},{iso2:"CM",default_name:"Cameroon",country_codes:[{country_code:"237",patterns:["XXXX XXXX"]}]},{iso2:"CN",default_name:"China",country_codes:[{country_code:"86",patterns:["XXX XXXX XXXX"]}]},{iso2:"CO",default_name:"Colombia",country_codes:[{country_code:"57",patterns:["XXX XXX XXXX"]}]},{iso2:"CR",default_name:"Costa Rica",country_codes:[{country_code:"506",patterns:["XXXX XXXX"]}]},{iso2:"CU",default_name:"Cuba",country_codes:[{country_code:"53",patterns:["X XXX XXXX"]}]},{iso2:"CV",default_name:"Cape Verde",country_codes:[{country_code:"238",patterns:["XXX XXXX"]}]},{iso2:"CW",default_name:"Curaçao",country_codes:[{country_code:"599",prefixes:["9"]}]},{iso2:"CY",default_name:"Cyprus",country_codes:[{country_code:"357",patterns:["XXXX XXXX"]}]},{iso2:"CZ",default_name:"Czech Republic",country_codes:[{country_code:"420",patterns:["XXX XXX XXX"]}]},{iso2:"DE",default_name:"Germany",country_codes:[{country_code:"49",patterns:["XXXX XXXXXXX","16X XXXXXXX","17X XXXXXXX","3601 4198XX"]}]},{iso2:"DJ",default_name:"Djibouti",country_codes:[{country_code:"253",patterns:["XX XX XX XX"]}]},{iso2:"DK",default_name:"Denmark",country_codes:[{country_code:"45",patterns:["XXXX XXXX"]}]},{iso2:"DM",default_name:"Dominica",country_codes:[{country_code:"1767",patterns:["XXX XXXX"]}]},{iso2:"DO",default_name:"Dominican Rep.",country_codes:[{country_code:"1809",patterns:["XXX XXXX"]},{country_code:"1829",patterns:["XXX XXXX"]},{country_code:"1849",patterns:["XXX XXXX"]}]},{iso2:"DZ",default_name:"Algeria",country_codes:[{country_code:"213",patterns:["XXX XX XX XX"]}]},{iso2:"EC",default_name:"Ecuador",country_codes:[{country_code:"593",patterns:["XX XXX XXXX"]}]},{iso2:"EE",default_name:"Estonia",country_codes:[{country_code:"372",patterns:["XXXX XXXX"]}]},{iso2:"EG",default_name:"Egypt",country_codes:[{country_code:"20",patterns:["XX XXXX XXXX"]}]},{iso2:"ER",default_name:"Eritrea",country_codes:[{country_code:"291",patterns:["X XXX XXX"]}]},{iso2:"ES",default_name:"Spain",country_codes:[{country_code:"34",patterns:["XXX XXX XXX"]}]},{iso2:"ET",default_name:"Ethiopia",country_codes:[{country_code:"251",patterns:["XX XXX XXXX"]}]},{iso2:"FI",default_name:"Finland",country_codes:[{country_code:"358"}]},{iso2:"FJ",default_name:"Fiji",country_codes:[{country_code:"679",patterns:["XXX XXXX"]}]},{iso2:"FK",default_name:"Falkland Islands",country_codes:[{country_code:"500"}]},{iso2:"FM",default_name:"Micronesia",country_codes:[{country_code:"691"}]},{iso2:"FO",default_name:"Faroe Islands",country_codes:[{country_code:"298",patterns:["XXX XXX"]}]},{iso2:"FR",default_name:"France",country_codes:[{country_code:"33",patterns:["X XX XX XX XX"]}]},{iso2:"GA",default_name:"Gabon",country_codes:[{country_code:"241",patterns:["X XX XX XX"]}]},{iso2:"GB",default_name:"United Kingdom",country_codes:[{country_code:"44",patterns:["XXXX XXXXXX"]}]},{iso2:"GD",default_name:"Grenada",country_codes:[{country_code:"1473",patterns:["XXX XXXX"]}]},{iso2:"GE",default_name:"Georgia",country_codes:[{country_code:"995",patterns:["XXX XXX XXX"]}]},{iso2:"GF",default_name:"French Guiana",country_codes:[{country_code:"594"}]},{iso2:"GH",default_name:"Ghana",country_codes:[{country_code:"233",patterns:["XX XXX XXXX"]}]},{iso2:"GI",default_name:"Gibraltar",country_codes:[{country_code:"350",patterns:["XXXX XXXX"]}]},{iso2:"GL",default_name:"Greenland",country_codes:[{country_code:"299",patterns:["XXX XXX"]}]},{iso2:"GM",default_name:"Gambia",country_codes:[{country_code:"220",patterns:["XXX XXXX"]}]},{iso2:"GN",default_name:"Guinea",country_codes:[{country_code:"224",patterns:["XXX XXX XXX"]}]},{iso2:"GP",default_name:"Guadeloupe",country_codes:[{country_code:"590",patterns:["XXX XX XX XX"]}]},{iso2:"GQ",default_name:"Equatorial Guinea",country_codes:[{country_code:"240",patterns:["XXX XXX XXX"]}]},{iso2:"GR",default_name:"Greece",country_codes:[{country_code:"30",patterns:["XXX XXX XXXX"]}]},{iso2:"GT",default_name:"Guatemala",country_codes:[{country_code:"502",patterns:["X XXX XXXX"]}]},{iso2:"GU",default_name:"Guam",country_codes:[{country_code:"1671",patterns:["XXX XXXX"]}]},{iso2:"GW",default_name:"Guinea-Bissau",country_codes:[{country_code:"245",patterns:["XXX XXXX"]}]},{iso2:"GY",default_name:"Guyana",country_codes:[{country_code:"592"}]},{iso2:"HK",default_name:"Hong Kong",country_codes:[{country_code:"852",patterns:["X XXX XXXX"]}]},{iso2:"HN",default_name:"Honduras",country_codes:[{country_code:"504",patterns:["XXXX XXXX"]}]},{iso2:"HR",default_name:"Croatia",country_codes:[{country_code:"385",patterns:["XX XXX XXX"]}]},{iso2:"HT",default_name:"Haiti",country_codes:[{country_code:"509",patterns:["XXXX XXXX"]}]},{iso2:"HU",default_name:"Hungary",country_codes:[{country_code:"36",patterns:["XXX XXX XXX"]}]},{iso2:"ID",default_name:"Indonesia",country_codes:[{country_code:"62",patterns:["XXX XXXXXX"]}]},{iso2:"IE",default_name:"Ireland",country_codes:[{country_code:"353",patterns:["XX XXX XXXX"]}]},{iso2:"IL",default_name:"Israel",country_codes:[{country_code:"972",patterns:["XX XXX XXXX"]}]},{iso2:"IN",default_name:"India",country_codes:[{country_code:"91",patterns:["XXXXX XXXXX"]}]},{iso2:"IO",default_name:"Diego Garcia",country_codes:[{country_code:"246",patterns:["XXX XXXX"]}]},{iso2:"IQ",default_name:"Iraq",country_codes:[{country_code:"964",patterns:["XXX XXX XXXX"]}]},{iso2:"IR",default_name:"Iran",country_codes:[{country_code:"98",patterns:["XXX XXX XXXX"]}]},{iso2:"IS",default_name:"Iceland",country_codes:[{country_code:"354",patterns:["XXX XXXX"]}]},{iso2:"IT",default_name:"Italy",country_codes:[{country_code:"39",patterns:["XXX XXX XXX"]}]},{iso2:"JM",default_name:"Jamaica",country_codes:[{country_code:"1876",patterns:["XXX XXXX"]}]},{iso2:"JO",default_name:"Jordan",country_codes:[{country_code:"962",patterns:["X XXXX XXXX"]}]},{iso2:"JP",default_name:"Japan",country_codes:[{country_code:"81",patterns:["XX XXXX XXXX"]}]},{iso2:"KE",default_name:"Kenya",country_codes:[{country_code:"254",patterns:["XXX XXX XXX"]}]},{iso2:"KG",default_name:"Kyrgyzstan",country_codes:[{country_code:"996",patterns:["XXX XXXXXX"]}]},{iso2:"KH",default_name:"Cambodia",country_codes:[{country_code:"855",patterns:["XX XXX XXX"]}]},{iso2:"KI",default_name:"Kiribati",country_codes:[{country_code:"686",patterns:["XXXX XXXX"]}]},{iso2:"KM",default_name:"Comoros",country_codes:[{country_code:"269",patterns:["XXX XXXX"]}]},{iso2:"KN",default_name:"Saint Kitts & Nevis",country_codes:[{country_code:"1869",patterns:["XXX XXXX"]}]},{iso2:"KP",default_name:"North Korea",country_codes:[{country_code:"850"}]},{iso2:"KR",default_name:"South Korea",country_codes:[{country_code:"82",patterns:["XX XXXX XXX"]}]},{iso2:"KW",default_name:"Kuwait",country_codes:[{country_code:"965",patterns:["XXXX XXXX"]}]},{iso2:"KY",default_name:"Cayman Islands",country_codes:[{country_code:"1345",patterns:["XXX XXXX"]}]},{iso2:"KZ",default_name:"Kazakhstan",country_codes:[{country_code:"7",prefixes:["6","7"],patterns:["XXX XXX XX XX"]}]},{iso2:"LA",default_name:"Laos",country_codes:[{country_code:"856",patterns:["XX XX XXX XXX"]}]},{iso2:"LB",default_name:"Lebanon",country_codes:[{country_code:"961",patterns:["XX XXX XXX"]}]},{iso2:"LC",default_name:"Saint Lucia",country_codes:[{country_code:"1758",patterns:["XXX XXXX"]}]},{iso2:"LI",default_name:"Liechtenstein",country_codes:[{country_code:"423",patterns:["XXX XXXX"]}]},{iso2:"LK",default_name:"Sri Lanka",country_codes:[{country_code:"94",patterns:["XX XXX XXXX"]}]},{iso2:"LR",default_name:"Liberia",country_codes:[{country_code:"231",patterns:["XX XXX XXXX"]}]},{iso2:"LS",default_name:"Lesotho",country_codes:[{country_code:"266",patterns:["XX XXX XXX"]}]},{iso2:"LT",default_name:"Lithuania",country_codes:[{country_code:"370",patterns:["XXX XXXXX"]}]},{iso2:"LU",default_name:"Luxembourg",country_codes:[{country_code:"352",patterns:["XXX XXX XXX"]}]},{iso2:"LV",default_name:"Latvia",country_codes:[{country_code:"371",patterns:["XXX XXXXX"]}]},{iso2:"LY",default_name:"Libya",country_codes:[{country_code:"218",patterns:["XX XXX XXXX"]}]},{iso2:"MA",default_name:"Morocco",country_codes:[{country_code:"212",patterns:["XX XXX XXXX"]}]},{iso2:"MC",default_name:"Monaco",country_codes:[{country_code:"377",patterns:["XXXX XXXX"]}]},{iso2:"MD",default_name:"Moldova",country_codes:[{country_code:"373",patterns:["XX XXX XXX"]}]},{iso2:"ME",default_name:"Montenegro",country_codes:[{country_code:"382"}]},{iso2:"MG",default_name:"Madagascar",country_codes:[{country_code:"261",patterns:["XX XX XXX XX"]}]},{iso2:"MH",default_name:"Marshall Islands",country_codes:[{country_code:"692"}]},{iso2:"MK",default_name:"North Macedonia",country_codes:[{country_code:"389",patterns:["XX XXX XXX"]}]},{iso2:"ML",default_name:"Mali",country_codes:[{country_code:"223",patterns:["XXXX XXXX"]}]},{iso2:"MM",default_name:"Myanmar",country_codes:[{country_code:"95"}]},{iso2:"MN",default_name:"Mongolia",country_codes:[{country_code:"976",patterns:["XX XX XXXX"]}]},{iso2:"MO",default_name:"Macau",country_codes:[{country_code:"853",patterns:["XXXX XXXX"]}]},{iso2:"MP",default_name:"Northern Mariana Islands",country_codes:[{country_code:"1670",patterns:["XXX XXXX"]}]},{iso2:"MQ",default_name:"Martinique",country_codes:[{country_code:"596"}]},{iso2:"MR",default_name:"Mauritania",country_codes:[{country_code:"222",patterns:["XXXX XXXX"]}]},{iso2:"MS",default_name:"Montserrat",country_codes:[{country_code:"1664",patterns:["XXX XXXX"]}]},{iso2:"MT",default_name:"Malta",country_codes:[{country_code:"356",patterns:["XX XX XX XX"]}]},{iso2:"MU",default_name:"Mauritius",country_codes:[{country_code:"230",patterns:["XXXX XXXX"]}]},{iso2:"MV",default_name:"Maldives",country_codes:[{country_code:"960",patterns:["XXX XXXX"]}]},{iso2:"MW",default_name:"Malawi",country_codes:[{country_code:"265",patterns:["XX XXX XXXX"]}]},{iso2:"MX",default_name:"Mexico",country_codes:[{country_code:"52"}]},{iso2:"MY",default_name:"Malaysia",country_codes:[{country_code:"60",patterns:["XX XXXX XXXX"]}]},{iso2:"MZ",default_name:"Mozambique",country_codes:[{country_code:"258",patterns:["XX XXX XXXX"]}]},{iso2:"NA",default_name:"Namibia",country_codes:[{country_code:"264",patterns:["XX XXX XXXX"]}]},{iso2:"NC",default_name:"New Caledonia",country_codes:[{country_code:"687"}]},{iso2:"NE",default_name:"Niger",country_codes:[{country_code:"227",patterns:["XX XX XX XX"]}]},{iso2:"NF",default_name:"Norfolk Island",country_codes:[{country_code:"672"}]},{iso2:"NG",default_name:"Nigeria",country_codes:[{country_code:"234",patterns:["XX XXXX XXXX"]}]},{iso2:"NI",default_name:"Nicaragua",country_codes:[{country_code:"505",patterns:["XXXX XXXX"]}]},{iso2:"NL",default_name:"Netherlands",country_codes:[{country_code:"31",patterns:["X XX XX XX XX","97 XXXX XXXXX"]}]},{iso2:"NO",default_name:"Norway",country_codes:[{country_code:"47",patterns:["XXXX XXXX"]}]},{iso2:"NP",default_name:"Nepal",country_codes:[{country_code:"977",patterns:["XX XXXX XXXX"]}]},{iso2:"NR",default_name:"Nauru",country_codes:[{country_code:"674"}]},{iso2:"NU",default_name:"Niue",country_codes:[{country_code:"683"}]},{iso2:"NZ",default_name:"New Zealand",country_codes:[{country_code:"64",patterns:["XXXX XXXX"]}]},{iso2:"OM",default_name:"Oman",country_codes:[{country_code:"968",patterns:["XXXX XXXX"]}]},{iso2:"PA",default_name:"Panama",country_codes:[{country_code:"507",patterns:["XXXX XXXX"]}]},{iso2:"PE",default_name:"Peru",country_codes:[{country_code:"51",patterns:["XXX XXX XXX"]}]},{iso2:"PF",default_name:"French Polynesia",country_codes:[{country_code:"689"}]},{iso2:"PG",default_name:"Papua New Guinea",country_codes:[{country_code:"675"}]},{iso2:"PH",default_name:"Philippines",country_codes:[{country_code:"63",patterns:["XXX XXX XXXX"]}]},{iso2:"PK",default_name:"Pakistan",country_codes:[{country_code:"92",patterns:["XXX XXX XXXX"]}]},{iso2:"PL",default_name:"Poland",country_codes:[{country_code:"48",patterns:["XXX XXX XXX"]}]},{iso2:"PM",default_name:"Saint Pierre & Miquelon",country_codes:[{country_code:"508"}]},{iso2:"PR",default_name:"Puerto Rico",country_codes:[{country_code:"1787",patterns:["XXX XXXX"]},{country_code:"1939",patterns:["XXX XXXX"]}]},{iso2:"PS",default_name:"Palestine",country_codes:[{country_code:"970",patterns:["XXX XX XXXX"]}]},{iso2:"PT",default_name:"Portugal",country_codes:[{country_code:"351",patterns:["XXX XXX XXX"]}]},{iso2:"PW",default_name:"Palau",country_codes:[{country_code:"680"}]},{iso2:"PY",default_name:"Paraguay",country_codes:[{country_code:"595",patterns:["XXX XXX XXX"]}]},{iso2:"QA",default_name:"Qatar",country_codes:[{country_code:"974",patterns:["XX XXX XXX"]}]},{iso2:"RE",default_name:"Réunion",country_codes:[{country_code:"262",patterns:["XXX XXX XXX"]}]},{iso2:"RO",default_name:"Romania",country_codes:[{country_code:"40",patterns:["XXX XXX XXX"]}]},{iso2:"RS",default_name:"Serbia",country_codes:[{country_code:"381",patterns:["XX XXX XXXX"]}]},{iso2:"RU",default_name:"Russian Federation",country_codes:[{country_code:"7",patterns:["XXX XXX XXXX"]}]},{iso2:"RW",default_name:"Rwanda",country_codes:[{country_code:"250",patterns:["XXX XXX XXX"]}]},{iso2:"SA",default_name:"Saudi Arabia",country_codes:[{country_code:"966",patterns:["XX XXX XXXX"]}]},{iso2:"SB",default_name:"Solomon Islands",country_codes:[{country_code:"677"}]},{iso2:"SC",default_name:"Seychelles",country_codes:[{country_code:"248",patterns:["X XX XX XX"]}]},{iso2:"SD",default_name:"Sudan",country_codes:[{country_code:"249",patterns:["XX XXX XXXX"]}]},{iso2:"SE",default_name:"Sweden",country_codes:[{country_code:"46",patterns:["XX XXX XXXX"]}]},{iso2:"SG",default_name:"Singapore",country_codes:[{country_code:"65",patterns:["XXXX XXXX"]}]},{iso2:"SH",default_name:"Saint Helena",country_codes:[{country_code:"247"},{country_code:"290",patterns:["XX XXX"]}]},{iso2:"SI",default_name:"Slovenia",country_codes:[{country_code:"386",patterns:["XX XXX XXX"]}]},{iso2:"SK",default_name:"Slovakia",country_codes:[{country_code:"421",patterns:["XXX XXX XXX"]}]},{iso2:"SL",default_name:"Sierra Leone",country_codes:[{country_code:"232",patterns:["XX XXX XXX"]}]},{iso2:"SM",default_name:"San Marino",country_codes:[{country_code:"378",patterns:["XXX XXX XXXX"]}]},{iso2:"SN",default_name:"Senegal",country_codes:[{country_code:"221",patterns:["XX XXX XXXX"]}]},{iso2:"SO",default_name:"Somalia",country_codes:[{country_code:"252",patterns:["XX XXX XXX"]}]},{iso2:"SR",default_name:"Suriname",country_codes:[{country_code:"597",patterns:["XXX XXXX"]}]},{iso2:"SS",default_name:"South Sudan",country_codes:[{country_code:"211",patterns:["XX XXX XXXX"]}]},{iso2:"ST",default_name:"São Tomé & Príncipe",country_codes:[{country_code:"239",patterns:["XX XXXXX"]}]},{iso2:"SV",default_name:"El Salvador",country_codes:[{country_code:"503",patterns:["XXXX XXXX"]}]},{iso2:"SX",default_name:"Sint Maarten",country_codes:[{country_code:"1721",patterns:["XXX XXXX"]}]},{iso2:"SY",default_name:"Syria",country_codes:[{country_code:"963",patterns:["XXX XXX XXX"]}]},{iso2:"SZ",default_name:"Eswatini",country_codes:[{country_code:"268",patterns:["XXXX XXXX"]}]},{iso2:"TC",default_name:"Turks & Caicos Islands",country_codes:[{country_code:"1649",patterns:["XXX XXXX"]}]},{iso2:"TD",default_name:"Chad",country_codes:[{country_code:"235",patterns:["XX XX XX XX"]}]},{iso2:"TG",default_name:"Togo",country_codes:[{country_code:"228",patterns:["XX XXX XXX"]}]},{iso2:"TH",default_name:"Thailand",country_codes:[{country_code:"66",patterns:["X XXXX XXXX"]}]},{iso2:"TJ",default_name:"Tajikistan",country_codes:[{country_code:"992",patterns:["XX XXX XXXX"]}]},{iso2:"TK",default_name:"Tokelau",country_codes:[{country_code:"690"}]},{iso2:"TL",default_name:"Timor-Leste",country_codes:[{country_code:"670"}]},{iso2:"TM",default_name:"Turkmenistan",country_codes:[{country_code:"993",patterns:["XX XXXXXX"]}]},{iso2:"TN",default_name:"Tunisia",country_codes:[{country_code:"216",patterns:["XX XXX XXX"]}]},{iso2:"TO",default_name:"Tonga",country_codes:[{country_code:"676"}]},{iso2:"TR",default_name:"Turkey",country_codes:[{country_code:"90",patterns:["XXX XXX XXXX"]}]},{iso2:"TT",default_name:"Trinidad & Tobago",country_codes:[{country_code:"1868",patterns:["XXX XXXX"]}]},{iso2:"TV",default_name:"Tuvalu",country_codes:[{country_code:"688"}]},{iso2:"TW",default_name:"Taiwan",country_codes:[{country_code:"886",patterns:["XXX XXX XXX"]}]},{iso2:"TZ",default_name:"Tanzania",country_codes:[{country_code:"255",patterns:["XX XXX XXXX"]}]},{iso2:"UA",default_name:"Ukraine",country_codes:[{country_code:"380",patterns:["XX XXX XX XX"]}]},{iso2:"UG",default_name:"Uganda",country_codes:[{country_code:"256",patterns:["XX XXX XXXX"]}]},{iso2:"US",default_name:"USA",country_codes:[{country_code:"1",patterns:["XXX XXX XXXX"]}]},{iso2:"UY",default_name:"Uruguay",country_codes:[{country_code:"598",patterns:["X XXX XXXX"]}]},{iso2:"UZ",default_name:"Uzbekistan",country_codes:[{country_code:"998",patterns:["XX XXX XX XX"]}]},{iso2:"VC",default_name:"Saint Vincent & the Grenadines",country_codes:[{country_code:"1784",patterns:["XXX XXXX"]}]},{iso2:"VE",default_name:"Venezuela",country_codes:[{country_code:"58",patterns:["XXX XXX XXXX"]}]},{iso2:"VG",default_name:"British Virgin Islands",country_codes:[{country_code:"1284",patterns:["XXX XXXX"]}]},{iso2:"VI",default_name:"US Virgin Islands",country_codes:[{country_code:"1340",patterns:["XXX XXXX"]}]},{iso2:"VN",default_name:"Vietnam",country_codes:[{country_code:"84"}]},{iso2:"VU",default_name:"Vanuatu",country_codes:[{country_code:"678"}]},{iso2:"WF",default_name:"Wallis & Futuna",country_codes:[{country_code:"681"}]},{iso2:"WS",default_name:"Samoa",country_codes:[{country_code:"685"}]},{iso2:"XK",default_name:"Kosovo",country_codes:[{country_code:"383",patterns:["XXXX XXXX"]}]},{iso2:"YE",default_name:"Yemen",country_codes:[{country_code:"967",patterns:["XXX XXX XXX"]}]},{iso2:"ZA",default_name:"South Africa",country_codes:[{country_code:"27",patterns:["XX XXX XXXX"]}]},{iso2:"ZM",default_name:"Zambia",country_codes:[{country_code:"260",patterns:["XX XXX XXXX"]}]},{iso2:"ZW",default_name:"Zimbabwe",country_codes:[{country_code:"263",patterns:["XX XXX XXXX"]}]}],hash:0}}}]); +//# sourceMappingURL=24.db7832d10818afdb3839.chunk.js.map \ No newline at end of file diff --git a/public/24.8835e4abc95acb08dcd5.chunk.js.map b/public/24.db7832d10818afdb3839.chunk.js.map similarity index 99% rename from public/24.8835e4abc95acb08dcd5.chunk.js.map rename to public/24.db7832d10818afdb3839.chunk.js.map index a0c8684d7..417573d1e 100644 --- a/public/24.8835e4abc95acb08dcd5.chunk.js.map +++ b/public/24.db7832d10818afdb3839.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/countries.ts"],"names":["_","countries","hash"],"mappings":"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","file":"24.8835e4abc95acb08dcd5.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { HelpCountriesList } from \"./layer\";\n\nconst Countries: HelpCountriesList.helpCountriesList = {\n _: 'help.countriesList',\n countries: [{\"iso2\":\"AD\",\"default_name\":\"Andorra\",\"country_codes\":[{\"country_code\":\"376\",\"patterns\":[\"XX XX XX\"]}]},{\"iso2\":\"AE\",\"default_name\":\"United Arab Emirates\",\"country_codes\":[{\"country_code\":\"971\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AF\",\"default_name\":\"Afghanistan\",\"country_codes\":[{\"country_code\":\"93\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AG\",\"default_name\":\"Antigua & Barbuda\",\"country_codes\":[{\"country_code\":\"1268\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AI\",\"default_name\":\"Anguilla\",\"country_codes\":[{\"country_code\":\"1264\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AL\",\"default_name\":\"Albania\",\"country_codes\":[{\"country_code\":\"355\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AM\",\"default_name\":\"Armenia\",\"country_codes\":[{\"country_code\":\"374\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"AO\",\"default_name\":\"Angola\",\"country_codes\":[{\"country_code\":\"244\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AR\",\"default_name\":\"Argentina\",\"country_codes\":[{\"country_code\":\"54\"}]},{\"iso2\":\"AS\",\"default_name\":\"American Samoa\",\"country_codes\":[{\"country_code\":\"1684\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AT\",\"default_name\":\"Austria\",\"country_codes\":[{\"country_code\":\"43\",\"patterns\":[\"X XXXXXXXX\"]}]},{\"iso2\":\"AU\",\"default_name\":\"Australia\",\"country_codes\":[{\"country_code\":\"61\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"AW\",\"default_name\":\"Aruba\",\"country_codes\":[{\"country_code\":\"297\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AZ\",\"default_name\":\"Azerbaijan\",\"country_codes\":[{\"country_code\":\"994\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BA\",\"default_name\":\"Bosnia & Herzegovina\",\"country_codes\":[{\"country_code\":\"387\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BB\",\"default_name\":\"Barbados\",\"country_codes\":[{\"country_code\":\"1246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BD\",\"default_name\":\"Bangladesh\",\"country_codes\":[{\"country_code\":\"880\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BE\",\"default_name\":\"Belgium\",\"country_codes\":[{\"country_code\":\"32\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"BF\",\"default_name\":\"Burkina Faso\",\"country_codes\":[{\"country_code\":\"226\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"BG\",\"default_name\":\"Bulgaria\",\"country_codes\":[{\"country_code\":\"359\"}]},{\"iso2\":\"BH\",\"default_name\":\"Bahrain\",\"country_codes\":[{\"country_code\":\"973\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"BI\",\"default_name\":\"Burundi\",\"country_codes\":[{\"country_code\":\"257\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"BJ\",\"default_name\":\"Benin\",\"country_codes\":[{\"country_code\":\"229\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BM\",\"default_name\":\"Bermuda\",\"country_codes\":[{\"country_code\":\"1441\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BN\",\"default_name\":\"Brunei Darussalam\",\"country_codes\":[{\"country_code\":\"673\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BO\",\"default_name\":\"Bolivia\",\"country_codes\":[{\"country_code\":\"591\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"BQ\",\"default_name\":\"Bonaire, Sint Eustatius & Saba\",\"country_codes\":[{\"country_code\":\"599\"}]},{\"iso2\":\"BR\",\"default_name\":\"Brazil\",\"country_codes\":[{\"country_code\":\"55\",\"patterns\":[\"XX XXXXX XXXX\"]}]},{\"iso2\":\"BS\",\"default_name\":\"Bahamas\",\"country_codes\":[{\"country_code\":\"1242\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BT\",\"default_name\":\"Bhutan\",\"country_codes\":[{\"country_code\":\"975\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BW\",\"default_name\":\"Botswana\",\"country_codes\":[{\"country_code\":\"267\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BY\",\"default_name\":\"Belarus\",\"country_codes\":[{\"country_code\":\"375\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BZ\",\"default_name\":\"Belize\",\"country_codes\":[{\"country_code\":\"501\"}]},{\"iso2\":\"CA\",\"default_name\":\"Canada\",\"country_codes\":[{\"country_code\":\"1\",\"prefixes\":[\"403\",\"587\",\"780\",\"825\",\"236\",\"250\",\"604\",\"672\",\"778\",\"204\",\"431\",\"506\",\"709\",\"902\",\"782\",\"226\",\"249\",\"289\",\"343\",\"365\",\"416\",\"437\",\"519\",\"548\",\"613\",\"647\",\"705\",\"807\",\"905\",\"418\",\"438\",\"450\",\"514\",\"579\",\"581\",\"819\",\"873\",\"306\",\"639\",\"867\"],\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CD\",\"default_name\":\"Congo (Dem. Rep.)\",\"country_codes\":[{\"country_code\":\"243\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CF\",\"default_name\":\"Central African Rep.\",\"country_codes\":[{\"country_code\":\"236\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"CG\",\"default_name\":\"Congo (Rep.)\",\"country_codes\":[{\"country_code\":\"242\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CH\",\"default_name\":\"Switzerland\",\"country_codes\":[{\"country_code\":\"41\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CI\",\"default_name\":\"Côte d'Ivoire\",\"country_codes\":[{\"country_code\":\"225\",\"patterns\":[\"XX XX XX XXXX\"]}]},{\"iso2\":\"CK\",\"default_name\":\"Cook Islands\",\"country_codes\":[{\"country_code\":\"682\"}]},{\"iso2\":\"CL\",\"default_name\":\"Chile\",\"country_codes\":[{\"country_code\":\"56\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"CM\",\"default_name\":\"Cameroon\",\"country_codes\":[{\"country_code\":\"237\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CN\",\"default_name\":\"China\",\"country_codes\":[{\"country_code\":\"86\",\"patterns\":[\"XXX XXXX XXXX\"]}]},{\"iso2\":\"CO\",\"default_name\":\"Colombia\",\"country_codes\":[{\"country_code\":\"57\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CR\",\"default_name\":\"Costa Rica\",\"country_codes\":[{\"country_code\":\"506\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CU\",\"default_name\":\"Cuba\",\"country_codes\":[{\"country_code\":\"53\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"CV\",\"default_name\":\"Cape Verde\",\"country_codes\":[{\"country_code\":\"238\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"CW\",\"default_name\":\"Curaçao\",\"country_codes\":[{\"country_code\":\"599\",\"prefixes\":[\"9\"]}]},{\"iso2\":\"CY\",\"default_name\":\"Cyprus\",\"country_codes\":[{\"country_code\":\"357\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CZ\",\"default_name\":\"Czech Republic\",\"country_codes\":[{\"country_code\":\"420\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"DE\",\"default_name\":\"Germany\",\"country_codes\":[{\"country_code\":\"49\",\"patterns\":[\"XXXX XXXXXXX\",\"16X XXXXXXX\",\"17X XXXXXXX\",\"3601 4198XX\"]}]},{\"iso2\":\"DJ\",\"default_name\":\"Djibouti\",\"country_codes\":[{\"country_code\":\"253\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"DK\",\"default_name\":\"Denmark\",\"country_codes\":[{\"country_code\":\"45\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"DM\",\"default_name\":\"Dominica\",\"country_codes\":[{\"country_code\":\"1767\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DO\",\"default_name\":\"Dominican Rep.\",\"country_codes\":[{\"country_code\":\"1809\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1829\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1849\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DZ\",\"default_name\":\"Algeria\",\"country_codes\":[{\"country_code\":\"213\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"EC\",\"default_name\":\"Ecuador\",\"country_codes\":[{\"country_code\":\"593\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"EE\",\"default_name\":\"Estonia\",\"country_codes\":[{\"country_code\":\"372\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"EG\",\"default_name\":\"Egypt\",\"country_codes\":[{\"country_code\":\"20\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"ER\",\"default_name\":\"Eritrea\",\"country_codes\":[{\"country_code\":\"291\",\"patterns\":[\"X XXX XXX\"]}]},{\"iso2\":\"ES\",\"default_name\":\"Spain\",\"country_codes\":[{\"country_code\":\"34\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ET\",\"default_name\":\"Ethiopia\",\"country_codes\":[{\"country_code\":\"251\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"FI\",\"default_name\":\"Finland\",\"country_codes\":[{\"country_code\":\"358\"}]},{\"iso2\":\"FJ\",\"default_name\":\"Fiji\",\"country_codes\":[{\"country_code\":\"679\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"FK\",\"default_name\":\"Falkland Islands\",\"country_codes\":[{\"country_code\":\"500\"}]},{\"iso2\":\"FM\",\"default_name\":\"Micronesia\",\"country_codes\":[{\"country_code\":\"691\"}]},{\"iso2\":\"FO\",\"default_name\":\"Faroe Islands\",\"country_codes\":[{\"country_code\":\"298\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"FR\",\"default_name\":\"France\",\"country_codes\":[{\"country_code\":\"33\",\"patterns\":[\"X XX XX XX XX\"]}]},{\"iso2\":\"GA\",\"default_name\":\"Gabon\",\"country_codes\":[{\"country_code\":\"241\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"GB\",\"default_name\":\"United Kingdom\",\"country_codes\":[{\"country_code\":\"44\",\"patterns\":[\"XXXX XXXXXX\"]}]},{\"iso2\":\"GD\",\"default_name\":\"Grenada\",\"country_codes\":[{\"country_code\":\"1473\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GE\",\"default_name\":\"Georgia\",\"country_codes\":[{\"country_code\":\"995\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GF\",\"default_name\":\"French Guiana\",\"country_codes\":[{\"country_code\":\"594\"}]},{\"iso2\":\"GH\",\"default_name\":\"Ghana\",\"country_codes\":[{\"country_code\":\"233\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"GI\",\"default_name\":\"Gibraltar\",\"country_codes\":[{\"country_code\":\"350\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"GL\",\"default_name\":\"Greenland\",\"country_codes\":[{\"country_code\":\"299\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"GM\",\"default_name\":\"Gambia\",\"country_codes\":[{\"country_code\":\"220\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GN\",\"default_name\":\"Guinea\",\"country_codes\":[{\"country_code\":\"224\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GP\",\"default_name\":\"Guadeloupe\",\"country_codes\":[{\"country_code\":\"590\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"GQ\",\"default_name\":\"Equatorial Guinea\",\"country_codes\":[{\"country_code\":\"240\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GR\",\"default_name\":\"Greece\",\"country_codes\":[{\"country_code\":\"30\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"GT\",\"default_name\":\"Guatemala\",\"country_codes\":[{\"country_code\":\"502\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"GU\",\"default_name\":\"Guam\",\"country_codes\":[{\"country_code\":\"1671\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GW\",\"default_name\":\"Guinea-Bissau\",\"country_codes\":[{\"country_code\":\"245\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GY\",\"default_name\":\"Guyana\",\"country_codes\":[{\"country_code\":\"592\"}]},{\"iso2\":\"HK\",\"default_name\":\"Hong Kong\",\"country_codes\":[{\"country_code\":\"852\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"HN\",\"default_name\":\"Honduras\",\"country_codes\":[{\"country_code\":\"504\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HR\",\"default_name\":\"Croatia\",\"country_codes\":[{\"country_code\":\"385\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"HT\",\"default_name\":\"Haiti\",\"country_codes\":[{\"country_code\":\"509\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HU\",\"default_name\":\"Hungary\",\"country_codes\":[{\"country_code\":\"36\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ID\",\"default_name\":\"Indonesia\",\"country_codes\":[{\"country_code\":\"62\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"IE\",\"default_name\":\"Ireland\",\"country_codes\":[{\"country_code\":\"353\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IL\",\"default_name\":\"Israel\",\"country_codes\":[{\"country_code\":\"972\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IN\",\"default_name\":\"India\",\"country_codes\":[{\"country_code\":\"91\",\"patterns\":[\"XXXXX XXXXX\"]}]},{\"iso2\":\"IO\",\"default_name\":\"Diego Garcia\",\"country_codes\":[{\"country_code\":\"246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IQ\",\"default_name\":\"Iraq\",\"country_codes\":[{\"country_code\":\"964\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IR\",\"default_name\":\"Iran\",\"country_codes\":[{\"country_code\":\"98\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IS\",\"default_name\":\"Iceland\",\"country_codes\":[{\"country_code\":\"354\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IT\",\"default_name\":\"Italy\",\"country_codes\":[{\"country_code\":\"39\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"JM\",\"default_name\":\"Jamaica\",\"country_codes\":[{\"country_code\":\"1876\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"JO\",\"default_name\":\"Jordan\",\"country_codes\":[{\"country_code\":\"962\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"JP\",\"default_name\":\"Japan\",\"country_codes\":[{\"country_code\":\"81\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"KE\",\"default_name\":\"Kenya\",\"country_codes\":[{\"country_code\":\"254\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"KG\",\"default_name\":\"Kyrgyzstan\",\"country_codes\":[{\"country_code\":\"996\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"KH\",\"default_name\":\"Cambodia\",\"country_codes\":[{\"country_code\":\"855\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"KI\",\"default_name\":\"Kiribati\",\"country_codes\":[{\"country_code\":\"686\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KM\",\"default_name\":\"Comoros\",\"country_codes\":[{\"country_code\":\"269\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KN\",\"default_name\":\"Saint Kitts & Nevis\",\"country_codes\":[{\"country_code\":\"1869\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KP\",\"default_name\":\"North Korea\",\"country_codes\":[{\"country_code\":\"850\"}]},{\"iso2\":\"KR\",\"default_name\":\"South Korea\",\"country_codes\":[{\"country_code\":\"82\",\"patterns\":[\"XX XXXX XXX\"]}]},{\"iso2\":\"KW\",\"default_name\":\"Kuwait\",\"country_codes\":[{\"country_code\":\"965\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KY\",\"default_name\":\"Cayman Islands\",\"country_codes\":[{\"country_code\":\"1345\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KZ\",\"default_name\":\"Kazakhstan\",\"country_codes\":[{\"country_code\":\"7\",\"prefixes\":[\"6\",\"7\"],\"patterns\":[\"XXX XXX XX XX\"]}]},{\"iso2\":\"LA\",\"default_name\":\"Laos\",\"country_codes\":[{\"country_code\":\"856\",\"patterns\":[\"XX XX XXX XXX\"]}]},{\"iso2\":\"LB\",\"default_name\":\"Lebanon\",\"country_codes\":[{\"country_code\":\"961\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LC\",\"default_name\":\"Saint Lucia\",\"country_codes\":[{\"country_code\":\"1758\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LI\",\"default_name\":\"Liechtenstein\",\"country_codes\":[{\"country_code\":\"423\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LK\",\"default_name\":\"Sri Lanka\",\"country_codes\":[{\"country_code\":\"94\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LR\",\"default_name\":\"Liberia\",\"country_codes\":[{\"country_code\":\"231\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LS\",\"default_name\":\"Lesotho\",\"country_codes\":[{\"country_code\":\"266\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LT\",\"default_name\":\"Lithuania\",\"country_codes\":[{\"country_code\":\"370\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LU\",\"default_name\":\"Luxembourg\",\"country_codes\":[{\"country_code\":\"352\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"LV\",\"default_name\":\"Latvia\",\"country_codes\":[{\"country_code\":\"371\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LY\",\"default_name\":\"Libya\",\"country_codes\":[{\"country_code\":\"218\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MA\",\"default_name\":\"Morocco\",\"country_codes\":[{\"country_code\":\"212\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MC\",\"default_name\":\"Monaco\",\"country_codes\":[{\"country_code\":\"377\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MD\",\"default_name\":\"Moldova\",\"country_codes\":[{\"country_code\":\"373\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ME\",\"default_name\":\"Montenegro\",\"country_codes\":[{\"country_code\":\"382\"}]},{\"iso2\":\"MG\",\"default_name\":\"Madagascar\",\"country_codes\":[{\"country_code\":\"261\",\"patterns\":[\"XX XX XXX XX\"]}]},{\"iso2\":\"MH\",\"default_name\":\"Marshall Islands\",\"country_codes\":[{\"country_code\":\"692\"}]},{\"iso2\":\"MK\",\"default_name\":\"North Macedonia\",\"country_codes\":[{\"country_code\":\"389\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ML\",\"default_name\":\"Mali\",\"country_codes\":[{\"country_code\":\"223\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MM\",\"default_name\":\"Myanmar\",\"country_codes\":[{\"country_code\":\"95\"}]},{\"iso2\":\"MN\",\"default_name\":\"Mongolia\",\"country_codes\":[{\"country_code\":\"976\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"MO\",\"default_name\":\"Macau\",\"country_codes\":[{\"country_code\":\"853\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MP\",\"default_name\":\"Northern Mariana Islands\",\"country_codes\":[{\"country_code\":\"1670\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MQ\",\"default_name\":\"Martinique\",\"country_codes\":[{\"country_code\":\"596\"}]},{\"iso2\":\"MR\",\"default_name\":\"Mauritania\",\"country_codes\":[{\"country_code\":\"222\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MS\",\"default_name\":\"Montserrat\",\"country_codes\":[{\"country_code\":\"1664\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MT\",\"default_name\":\"Malta\",\"country_codes\":[{\"country_code\":\"356\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"MU\",\"default_name\":\"Mauritius\",\"country_codes\":[{\"country_code\":\"230\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MV\",\"default_name\":\"Maldives\",\"country_codes\":[{\"country_code\":\"960\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MW\",\"default_name\":\"Malawi\",\"country_codes\":[{\"country_code\":\"265\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MX\",\"default_name\":\"Mexico\",\"country_codes\":[{\"country_code\":\"52\"}]},{\"iso2\":\"MY\",\"default_name\":\"Malaysia\",\"country_codes\":[{\"country_code\":\"60\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"MZ\",\"default_name\":\"Mozambique\",\"country_codes\":[{\"country_code\":\"258\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NA\",\"default_name\":\"Namibia\",\"country_codes\":[{\"country_code\":\"264\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NC\",\"default_name\":\"New Caledonia\",\"country_codes\":[{\"country_code\":\"687\"}]},{\"iso2\":\"NE\",\"default_name\":\"Niger\",\"country_codes\":[{\"country_code\":\"227\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"NF\",\"default_name\":\"Norfolk Island\",\"country_codes\":[{\"country_code\":\"672\"}]},{\"iso2\":\"NG\",\"default_name\":\"Nigeria\",\"country_codes\":[{\"country_code\":\"234\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NI\",\"default_name\":\"Nicaragua\",\"country_codes\":[{\"country_code\":\"505\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NL\",\"default_name\":\"Netherlands\",\"country_codes\":[{\"country_code\":\"31\",\"patterns\":[\"X XX XX XX XX\",\"97 XXXX XXXXX\"]}]},{\"iso2\":\"NO\",\"default_name\":\"Norway\",\"country_codes\":[{\"country_code\":\"47\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NP\",\"default_name\":\"Nepal\",\"country_codes\":[{\"country_code\":\"977\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NR\",\"default_name\":\"Nauru\",\"country_codes\":[{\"country_code\":\"674\"}]},{\"iso2\":\"NU\",\"default_name\":\"Niue\",\"country_codes\":[{\"country_code\":\"683\"}]},{\"iso2\":\"NZ\",\"default_name\":\"New Zealand\",\"country_codes\":[{\"country_code\":\"64\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"OM\",\"default_name\":\"Oman\",\"country_codes\":[{\"country_code\":\"968\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PA\",\"default_name\":\"Panama\",\"country_codes\":[{\"country_code\":\"507\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PE\",\"default_name\":\"Peru\",\"country_codes\":[{\"country_code\":\"51\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PF\",\"default_name\":\"French Polynesia\",\"country_codes\":[{\"country_code\":\"689\"}]},{\"iso2\":\"PG\",\"default_name\":\"Papua New Guinea\",\"country_codes\":[{\"country_code\":\"675\"}]},{\"iso2\":\"PH\",\"default_name\":\"Philippines\",\"country_codes\":[{\"country_code\":\"63\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PK\",\"default_name\":\"Pakistan\",\"country_codes\":[{\"country_code\":\"92\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PL\",\"default_name\":\"Poland\",\"country_codes\":[{\"country_code\":\"48\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PM\",\"default_name\":\"Saint Pierre & Miquelon\",\"country_codes\":[{\"country_code\":\"508\"}]},{\"iso2\":\"PR\",\"default_name\":\"Puerto Rico\",\"country_codes\":[{\"country_code\":\"1787\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1939\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"PS\",\"default_name\":\"Palestine\",\"country_codes\":[{\"country_code\":\"970\",\"patterns\":[\"XXX XX XXXX\"]}]},{\"iso2\":\"PT\",\"default_name\":\"Portugal\",\"country_codes\":[{\"country_code\":\"351\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PW\",\"default_name\":\"Palau\",\"country_codes\":[{\"country_code\":\"680\"}]},{\"iso2\":\"PY\",\"default_name\":\"Paraguay\",\"country_codes\":[{\"country_code\":\"595\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"QA\",\"default_name\":\"Qatar\",\"country_codes\":[{\"country_code\":\"974\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"RE\",\"default_name\":\"Réunion\",\"country_codes\":[{\"country_code\":\"262\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RO\",\"default_name\":\"Romania\",\"country_codes\":[{\"country_code\":\"40\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RS\",\"default_name\":\"Serbia\",\"country_codes\":[{\"country_code\":\"381\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"RU\",\"default_name\":\"Russian Federation\",\"country_codes\":[{\"country_code\":\"7\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"RW\",\"default_name\":\"Rwanda\",\"country_codes\":[{\"country_code\":\"250\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SA\",\"default_name\":\"Saudi Arabia\",\"country_codes\":[{\"country_code\":\"966\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SB\",\"default_name\":\"Solomon Islands\",\"country_codes\":[{\"country_code\":\"677\"}]},{\"iso2\":\"SC\",\"default_name\":\"Seychelles\",\"country_codes\":[{\"country_code\":\"248\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"SD\",\"default_name\":\"Sudan\",\"country_codes\":[{\"country_code\":\"249\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SE\",\"default_name\":\"Sweden\",\"country_codes\":[{\"country_code\":\"46\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SG\",\"default_name\":\"Singapore\",\"country_codes\":[{\"country_code\":\"65\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SH\",\"default_name\":\"Saint Helena\",\"country_codes\":[{\"country_code\":\"247\"},{\"country_code\":\"290\",\"patterns\":[\"XX XXX\"]}]},{\"iso2\":\"SI\",\"default_name\":\"Slovenia\",\"country_codes\":[{\"country_code\":\"386\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SK\",\"default_name\":\"Slovakia\",\"country_codes\":[{\"country_code\":\"421\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SL\",\"default_name\":\"Sierra Leone\",\"country_codes\":[{\"country_code\":\"232\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SM\",\"default_name\":\"San Marino\",\"country_codes\":[{\"country_code\":\"378\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"SN\",\"default_name\":\"Senegal\",\"country_codes\":[{\"country_code\":\"221\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SO\",\"default_name\":\"Somalia\",\"country_codes\":[{\"country_code\":\"252\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SR\",\"default_name\":\"Suriname\",\"country_codes\":[{\"country_code\":\"597\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SS\",\"default_name\":\"South Sudan\",\"country_codes\":[{\"country_code\":\"211\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ST\",\"default_name\":\"São Tomé & Príncipe\",\"country_codes\":[{\"country_code\":\"239\",\"patterns\":[\"XX XXXXX\"]}]},{\"iso2\":\"SV\",\"default_name\":\"El Salvador\",\"country_codes\":[{\"country_code\":\"503\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SX\",\"default_name\":\"Sint Maarten\",\"country_codes\":[{\"country_code\":\"1721\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SY\",\"default_name\":\"Syria\",\"country_codes\":[{\"country_code\":\"963\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SZ\",\"default_name\":\"Eswatini\",\"country_codes\":[{\"country_code\":\"268\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"TC\",\"default_name\":\"Turks & Caicos Islands\",\"country_codes\":[{\"country_code\":\"1649\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TD\",\"default_name\":\"Chad\",\"country_codes\":[{\"country_code\":\"235\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"TG\",\"default_name\":\"Togo\",\"country_codes\":[{\"country_code\":\"228\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TH\",\"default_name\":\"Thailand\",\"country_codes\":[{\"country_code\":\"66\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"TJ\",\"default_name\":\"Tajikistan\",\"country_codes\":[{\"country_code\":\"992\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"TK\",\"default_name\":\"Tokelau\",\"country_codes\":[{\"country_code\":\"690\"}]},{\"iso2\":\"TL\",\"default_name\":\"Timor-Leste\",\"country_codes\":[{\"country_code\":\"670\"}]},{\"iso2\":\"TM\",\"default_name\":\"Turkmenistan\",\"country_codes\":[{\"country_code\":\"993\",\"patterns\":[\"XX XXXXXX\"]}]},{\"iso2\":\"TN\",\"default_name\":\"Tunisia\",\"country_codes\":[{\"country_code\":\"216\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TO\",\"default_name\":\"Tonga\",\"country_codes\":[{\"country_code\":\"676\"}]},{\"iso2\":\"TR\",\"default_name\":\"Turkey\",\"country_codes\":[{\"country_code\":\"90\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"TT\",\"default_name\":\"Trinidad & Tobago\",\"country_codes\":[{\"country_code\":\"1868\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TV\",\"default_name\":\"Tuvalu\",\"country_codes\":[{\"country_code\":\"688\"}]},{\"iso2\":\"TW\",\"default_name\":\"Taiwan\",\"country_codes\":[{\"country_code\":\"886\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"TZ\",\"default_name\":\"Tanzania\",\"country_codes\":[{\"country_code\":\"255\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"UA\",\"default_name\":\"Ukraine\",\"country_codes\":[{\"country_code\":\"380\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"UG\",\"default_name\":\"Uganda\",\"country_codes\":[{\"country_code\":\"256\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"US\",\"default_name\":\"USA\",\"country_codes\":[{\"country_code\":\"1\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"UY\",\"default_name\":\"Uruguay\",\"country_codes\":[{\"country_code\":\"598\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"UZ\",\"default_name\":\"Uzbekistan\",\"country_codes\":[{\"country_code\":\"998\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"VC\",\"default_name\":\"Saint Vincent & the Grenadines\",\"country_codes\":[{\"country_code\":\"1784\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VE\",\"default_name\":\"Venezuela\",\"country_codes\":[{\"country_code\":\"58\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"VG\",\"default_name\":\"British Virgin Islands\",\"country_codes\":[{\"country_code\":\"1284\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VI\",\"default_name\":\"US Virgin Islands\",\"country_codes\":[{\"country_code\":\"1340\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VN\",\"default_name\":\"Vietnam\",\"country_codes\":[{\"country_code\":\"84\"}]},{\"iso2\":\"VU\",\"default_name\":\"Vanuatu\",\"country_codes\":[{\"country_code\":\"678\"}]},{\"iso2\":\"WF\",\"default_name\":\"Wallis & Futuna\",\"country_codes\":[{\"country_code\":\"681\"}]},{\"iso2\":\"WS\",\"default_name\":\"Samoa\",\"country_codes\":[{\"country_code\":\"685\"}]},{\"iso2\":\"XK\",\"default_name\":\"Kosovo\",\"country_codes\":[{\"country_code\":\"383\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"YE\",\"default_name\":\"Yemen\",\"country_codes\":[{\"country_code\":\"967\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ZA\",\"default_name\":\"South Africa\",\"country_codes\":[{\"country_code\":\"27\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZM\",\"default_name\":\"Zambia\",\"country_codes\":[{\"country_code\":\"260\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZW\",\"default_name\":\"Zimbabwe\",\"country_codes\":[{\"country_code\":\"263\",\"patterns\":[\"XX XXX XXXX\"]}]}] as any,\n hash: 0\n};\n\n/* const PhoneCodesMain: {[phoneCode: string]: Country} = {\n '1': Countries.find(c => c.name === 'United States'),\n '44': Countries.find(c => c.name === 'United Kingdom'),\n '61': Countries.find(c => c.name === 'Australia'),\n '64': Countries.find(c => c.name === 'New Zealand'),\n '246': Countries.find(c => c.name === 'Diego Garcia'),\n '255': Countries.find(c => c.name === 'Tanzania'),\n '262': Countries.find(c => c.name === 'Reunion'),\n '500': Countries.find(c => c.name === 'Falkland Islands'),\n '590': Countries.find(c => c.name === 'Guadeloupe'),\n '672': Countries.find(c => c.name === 'Norfolk Island'),\n '1 268': Countries.find(c => c.name === 'Antigua & Barbuda'),\n}; */\n\n/* \nconst toInt = (str) => {\n return parseInt(str.replace(/ /g, ''));\n};\nvar arr = window.Countries.sort((a, b) => toInt(a.phoneCode) - toInt(b.phoneCode));\narr.forEach((el, idx) => {\n if(idx === (arr.length - 1)) {\n return;\n }\n\n if(toInt(arr[idx + 1].phoneCode) === toInt(el.phoneCode)) {\n console.log('duplicate', el, arr[idx + 1]);\n }\n});\n*/\n\nexport default Countries;\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/countries.ts"],"names":["_","countries","hash"],"mappings":"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","file":"24.db7832d10818afdb3839.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { HelpCountriesList } from \"./layer\";\n\nconst Countries: HelpCountriesList.helpCountriesList = {\n _: 'help.countriesList',\n countries: [{\"iso2\":\"AD\",\"default_name\":\"Andorra\",\"country_codes\":[{\"country_code\":\"376\",\"patterns\":[\"XX XX XX\"]}]},{\"iso2\":\"AE\",\"default_name\":\"United Arab Emirates\",\"country_codes\":[{\"country_code\":\"971\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AF\",\"default_name\":\"Afghanistan\",\"country_codes\":[{\"country_code\":\"93\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AG\",\"default_name\":\"Antigua & Barbuda\",\"country_codes\":[{\"country_code\":\"1268\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AI\",\"default_name\":\"Anguilla\",\"country_codes\":[{\"country_code\":\"1264\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AL\",\"default_name\":\"Albania\",\"country_codes\":[{\"country_code\":\"355\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"AM\",\"default_name\":\"Armenia\",\"country_codes\":[{\"country_code\":\"374\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"AO\",\"default_name\":\"Angola\",\"country_codes\":[{\"country_code\":\"244\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"AR\",\"default_name\":\"Argentina\",\"country_codes\":[{\"country_code\":\"54\"}]},{\"iso2\":\"AS\",\"default_name\":\"American Samoa\",\"country_codes\":[{\"country_code\":\"1684\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AT\",\"default_name\":\"Austria\",\"country_codes\":[{\"country_code\":\"43\",\"patterns\":[\"X XXXXXXXX\"]}]},{\"iso2\":\"AU\",\"default_name\":\"Australia\",\"country_codes\":[{\"country_code\":\"61\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"AW\",\"default_name\":\"Aruba\",\"country_codes\":[{\"country_code\":\"297\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"AZ\",\"default_name\":\"Azerbaijan\",\"country_codes\":[{\"country_code\":\"994\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BA\",\"default_name\":\"Bosnia & Herzegovina\",\"country_codes\":[{\"country_code\":\"387\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BB\",\"default_name\":\"Barbados\",\"country_codes\":[{\"country_code\":\"1246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BD\",\"default_name\":\"Bangladesh\",\"country_codes\":[{\"country_code\":\"880\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BE\",\"default_name\":\"Belgium\",\"country_codes\":[{\"country_code\":\"32\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"BF\",\"default_name\":\"Burkina Faso\",\"country_codes\":[{\"country_code\":\"226\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"BG\",\"default_name\":\"Bulgaria\",\"country_codes\":[{\"country_code\":\"359\"}]},{\"iso2\":\"BH\",\"default_name\":\"Bahrain\",\"country_codes\":[{\"country_code\":\"973\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"BI\",\"default_name\":\"Burundi\",\"country_codes\":[{\"country_code\":\"257\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"BJ\",\"default_name\":\"Benin\",\"country_codes\":[{\"country_code\":\"229\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BM\",\"default_name\":\"Bermuda\",\"country_codes\":[{\"country_code\":\"1441\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BN\",\"default_name\":\"Brunei Darussalam\",\"country_codes\":[{\"country_code\":\"673\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BO\",\"default_name\":\"Bolivia\",\"country_codes\":[{\"country_code\":\"591\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"BQ\",\"default_name\":\"Bonaire, Sint Eustatius & Saba\",\"country_codes\":[{\"country_code\":\"599\"}]},{\"iso2\":\"BR\",\"default_name\":\"Brazil\",\"country_codes\":[{\"country_code\":\"55\",\"patterns\":[\"XX XXXXX XXXX\"]}]},{\"iso2\":\"BS\",\"default_name\":\"Bahamas\",\"country_codes\":[{\"country_code\":\"1242\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"BT\",\"default_name\":\"Bhutan\",\"country_codes\":[{\"country_code\":\"975\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BW\",\"default_name\":\"Botswana\",\"country_codes\":[{\"country_code\":\"267\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"BY\",\"default_name\":\"Belarus\",\"country_codes\":[{\"country_code\":\"375\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"BZ\",\"default_name\":\"Belize\",\"country_codes\":[{\"country_code\":\"501\"}]},{\"iso2\":\"CA\",\"default_name\":\"Canada\",\"country_codes\":[{\"country_code\":\"1\",\"prefixes\":[\"403\",\"587\",\"780\",\"825\",\"236\",\"250\",\"604\",\"672\",\"778\",\"204\",\"431\",\"506\",\"709\",\"902\",\"782\",\"226\",\"249\",\"289\",\"343\",\"365\",\"416\",\"437\",\"519\",\"548\",\"613\",\"647\",\"705\",\"807\",\"905\",\"418\",\"438\",\"450\",\"514\",\"579\",\"581\",\"819\",\"873\",\"306\",\"639\",\"867\"],\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CD\",\"default_name\":\"Congo (Dem. Rep.)\",\"country_codes\":[{\"country_code\":\"243\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CF\",\"default_name\":\"Central African Rep.\",\"country_codes\":[{\"country_code\":\"236\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"CG\",\"default_name\":\"Congo (Rep.)\",\"country_codes\":[{\"country_code\":\"242\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CH\",\"default_name\":\"Switzerland\",\"country_codes\":[{\"country_code\":\"41\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"CI\",\"default_name\":\"Côte d'Ivoire\",\"country_codes\":[{\"country_code\":\"225\",\"patterns\":[\"XX XX XX XXXX\"]}]},{\"iso2\":\"CK\",\"default_name\":\"Cook Islands\",\"country_codes\":[{\"country_code\":\"682\"}]},{\"iso2\":\"CL\",\"default_name\":\"Chile\",\"country_codes\":[{\"country_code\":\"56\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"CM\",\"default_name\":\"Cameroon\",\"country_codes\":[{\"country_code\":\"237\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CN\",\"default_name\":\"China\",\"country_codes\":[{\"country_code\":\"86\",\"patterns\":[\"XXX XXXX XXXX\"]}]},{\"iso2\":\"CO\",\"default_name\":\"Colombia\",\"country_codes\":[{\"country_code\":\"57\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"CR\",\"default_name\":\"Costa Rica\",\"country_codes\":[{\"country_code\":\"506\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CU\",\"default_name\":\"Cuba\",\"country_codes\":[{\"country_code\":\"53\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"CV\",\"default_name\":\"Cape Verde\",\"country_codes\":[{\"country_code\":\"238\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"CW\",\"default_name\":\"Curaçao\",\"country_codes\":[{\"country_code\":\"599\",\"prefixes\":[\"9\"]}]},{\"iso2\":\"CY\",\"default_name\":\"Cyprus\",\"country_codes\":[{\"country_code\":\"357\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"CZ\",\"default_name\":\"Czech Republic\",\"country_codes\":[{\"country_code\":\"420\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"DE\",\"default_name\":\"Germany\",\"country_codes\":[{\"country_code\":\"49\",\"patterns\":[\"XXXX XXXXXXX\",\"16X XXXXXXX\",\"17X XXXXXXX\",\"3601 4198XX\"]}]},{\"iso2\":\"DJ\",\"default_name\":\"Djibouti\",\"country_codes\":[{\"country_code\":\"253\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"DK\",\"default_name\":\"Denmark\",\"country_codes\":[{\"country_code\":\"45\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"DM\",\"default_name\":\"Dominica\",\"country_codes\":[{\"country_code\":\"1767\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DO\",\"default_name\":\"Dominican Rep.\",\"country_codes\":[{\"country_code\":\"1809\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1829\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1849\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"DZ\",\"default_name\":\"Algeria\",\"country_codes\":[{\"country_code\":\"213\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"EC\",\"default_name\":\"Ecuador\",\"country_codes\":[{\"country_code\":\"593\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"EE\",\"default_name\":\"Estonia\",\"country_codes\":[{\"country_code\":\"372\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"EG\",\"default_name\":\"Egypt\",\"country_codes\":[{\"country_code\":\"20\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"ER\",\"default_name\":\"Eritrea\",\"country_codes\":[{\"country_code\":\"291\",\"patterns\":[\"X XXX XXX\"]}]},{\"iso2\":\"ES\",\"default_name\":\"Spain\",\"country_codes\":[{\"country_code\":\"34\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ET\",\"default_name\":\"Ethiopia\",\"country_codes\":[{\"country_code\":\"251\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"FI\",\"default_name\":\"Finland\",\"country_codes\":[{\"country_code\":\"358\"}]},{\"iso2\":\"FJ\",\"default_name\":\"Fiji\",\"country_codes\":[{\"country_code\":\"679\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"FK\",\"default_name\":\"Falkland Islands\",\"country_codes\":[{\"country_code\":\"500\"}]},{\"iso2\":\"FM\",\"default_name\":\"Micronesia\",\"country_codes\":[{\"country_code\":\"691\"}]},{\"iso2\":\"FO\",\"default_name\":\"Faroe Islands\",\"country_codes\":[{\"country_code\":\"298\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"FR\",\"default_name\":\"France\",\"country_codes\":[{\"country_code\":\"33\",\"patterns\":[\"X XX XX XX XX\"]}]},{\"iso2\":\"GA\",\"default_name\":\"Gabon\",\"country_codes\":[{\"country_code\":\"241\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"GB\",\"default_name\":\"United Kingdom\",\"country_codes\":[{\"country_code\":\"44\",\"patterns\":[\"XXXX XXXXXX\"]}]},{\"iso2\":\"GD\",\"default_name\":\"Grenada\",\"country_codes\":[{\"country_code\":\"1473\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GE\",\"default_name\":\"Georgia\",\"country_codes\":[{\"country_code\":\"995\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GF\",\"default_name\":\"French Guiana\",\"country_codes\":[{\"country_code\":\"594\"}]},{\"iso2\":\"GH\",\"default_name\":\"Ghana\",\"country_codes\":[{\"country_code\":\"233\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"GI\",\"default_name\":\"Gibraltar\",\"country_codes\":[{\"country_code\":\"350\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"GL\",\"default_name\":\"Greenland\",\"country_codes\":[{\"country_code\":\"299\",\"patterns\":[\"XXX XXX\"]}]},{\"iso2\":\"GM\",\"default_name\":\"Gambia\",\"country_codes\":[{\"country_code\":\"220\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GN\",\"default_name\":\"Guinea\",\"country_codes\":[{\"country_code\":\"224\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GP\",\"default_name\":\"Guadeloupe\",\"country_codes\":[{\"country_code\":\"590\",\"patterns\":[\"XXX XX XX XX\"]}]},{\"iso2\":\"GQ\",\"default_name\":\"Equatorial Guinea\",\"country_codes\":[{\"country_code\":\"240\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"GR\",\"default_name\":\"Greece\",\"country_codes\":[{\"country_code\":\"30\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"GT\",\"default_name\":\"Guatemala\",\"country_codes\":[{\"country_code\":\"502\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"GU\",\"default_name\":\"Guam\",\"country_codes\":[{\"country_code\":\"1671\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GW\",\"default_name\":\"Guinea-Bissau\",\"country_codes\":[{\"country_code\":\"245\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"GY\",\"default_name\":\"Guyana\",\"country_codes\":[{\"country_code\":\"592\"}]},{\"iso2\":\"HK\",\"default_name\":\"Hong Kong\",\"country_codes\":[{\"country_code\":\"852\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"HN\",\"default_name\":\"Honduras\",\"country_codes\":[{\"country_code\":\"504\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HR\",\"default_name\":\"Croatia\",\"country_codes\":[{\"country_code\":\"385\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"HT\",\"default_name\":\"Haiti\",\"country_codes\":[{\"country_code\":\"509\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"HU\",\"default_name\":\"Hungary\",\"country_codes\":[{\"country_code\":\"36\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ID\",\"default_name\":\"Indonesia\",\"country_codes\":[{\"country_code\":\"62\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"IE\",\"default_name\":\"Ireland\",\"country_codes\":[{\"country_code\":\"353\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IL\",\"default_name\":\"Israel\",\"country_codes\":[{\"country_code\":\"972\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"IN\",\"default_name\":\"India\",\"country_codes\":[{\"country_code\":\"91\",\"patterns\":[\"XXXXX XXXXX\"]}]},{\"iso2\":\"IO\",\"default_name\":\"Diego Garcia\",\"country_codes\":[{\"country_code\":\"246\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IQ\",\"default_name\":\"Iraq\",\"country_codes\":[{\"country_code\":\"964\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IR\",\"default_name\":\"Iran\",\"country_codes\":[{\"country_code\":\"98\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"IS\",\"default_name\":\"Iceland\",\"country_codes\":[{\"country_code\":\"354\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"IT\",\"default_name\":\"Italy\",\"country_codes\":[{\"country_code\":\"39\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"JM\",\"default_name\":\"Jamaica\",\"country_codes\":[{\"country_code\":\"1876\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"JO\",\"default_name\":\"Jordan\",\"country_codes\":[{\"country_code\":\"962\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"JP\",\"default_name\":\"Japan\",\"country_codes\":[{\"country_code\":\"81\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"KE\",\"default_name\":\"Kenya\",\"country_codes\":[{\"country_code\":\"254\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"KG\",\"default_name\":\"Kyrgyzstan\",\"country_codes\":[{\"country_code\":\"996\",\"patterns\":[\"XXX XXXXXX\"]}]},{\"iso2\":\"KH\",\"default_name\":\"Cambodia\",\"country_codes\":[{\"country_code\":\"855\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"KI\",\"default_name\":\"Kiribati\",\"country_codes\":[{\"country_code\":\"686\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KM\",\"default_name\":\"Comoros\",\"country_codes\":[{\"country_code\":\"269\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KN\",\"default_name\":\"Saint Kitts & Nevis\",\"country_codes\":[{\"country_code\":\"1869\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KP\",\"default_name\":\"North Korea\",\"country_codes\":[{\"country_code\":\"850\"}]},{\"iso2\":\"KR\",\"default_name\":\"South Korea\",\"country_codes\":[{\"country_code\":\"82\",\"patterns\":[\"XX XXXX XXX\"]}]},{\"iso2\":\"KW\",\"default_name\":\"Kuwait\",\"country_codes\":[{\"country_code\":\"965\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"KY\",\"default_name\":\"Cayman Islands\",\"country_codes\":[{\"country_code\":\"1345\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"KZ\",\"default_name\":\"Kazakhstan\",\"country_codes\":[{\"country_code\":\"7\",\"prefixes\":[\"6\",\"7\"],\"patterns\":[\"XXX XXX XX XX\"]}]},{\"iso2\":\"LA\",\"default_name\":\"Laos\",\"country_codes\":[{\"country_code\":\"856\",\"patterns\":[\"XX XX XXX XXX\"]}]},{\"iso2\":\"LB\",\"default_name\":\"Lebanon\",\"country_codes\":[{\"country_code\":\"961\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LC\",\"default_name\":\"Saint Lucia\",\"country_codes\":[{\"country_code\":\"1758\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LI\",\"default_name\":\"Liechtenstein\",\"country_codes\":[{\"country_code\":\"423\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"LK\",\"default_name\":\"Sri Lanka\",\"country_codes\":[{\"country_code\":\"94\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LR\",\"default_name\":\"Liberia\",\"country_codes\":[{\"country_code\":\"231\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"LS\",\"default_name\":\"Lesotho\",\"country_codes\":[{\"country_code\":\"266\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"LT\",\"default_name\":\"Lithuania\",\"country_codes\":[{\"country_code\":\"370\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LU\",\"default_name\":\"Luxembourg\",\"country_codes\":[{\"country_code\":\"352\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"LV\",\"default_name\":\"Latvia\",\"country_codes\":[{\"country_code\":\"371\",\"patterns\":[\"XXX XXXXX\"]}]},{\"iso2\":\"LY\",\"default_name\":\"Libya\",\"country_codes\":[{\"country_code\":\"218\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MA\",\"default_name\":\"Morocco\",\"country_codes\":[{\"country_code\":\"212\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MC\",\"default_name\":\"Monaco\",\"country_codes\":[{\"country_code\":\"377\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MD\",\"default_name\":\"Moldova\",\"country_codes\":[{\"country_code\":\"373\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ME\",\"default_name\":\"Montenegro\",\"country_codes\":[{\"country_code\":\"382\"}]},{\"iso2\":\"MG\",\"default_name\":\"Madagascar\",\"country_codes\":[{\"country_code\":\"261\",\"patterns\":[\"XX XX XXX XX\"]}]},{\"iso2\":\"MH\",\"default_name\":\"Marshall Islands\",\"country_codes\":[{\"country_code\":\"692\"}]},{\"iso2\":\"MK\",\"default_name\":\"North Macedonia\",\"country_codes\":[{\"country_code\":\"389\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"ML\",\"default_name\":\"Mali\",\"country_codes\":[{\"country_code\":\"223\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MM\",\"default_name\":\"Myanmar\",\"country_codes\":[{\"country_code\":\"95\"}]},{\"iso2\":\"MN\",\"default_name\":\"Mongolia\",\"country_codes\":[{\"country_code\":\"976\",\"patterns\":[\"XX XX XXXX\"]}]},{\"iso2\":\"MO\",\"default_name\":\"Macau\",\"country_codes\":[{\"country_code\":\"853\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MP\",\"default_name\":\"Northern Mariana Islands\",\"country_codes\":[{\"country_code\":\"1670\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MQ\",\"default_name\":\"Martinique\",\"country_codes\":[{\"country_code\":\"596\"}]},{\"iso2\":\"MR\",\"default_name\":\"Mauritania\",\"country_codes\":[{\"country_code\":\"222\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MS\",\"default_name\":\"Montserrat\",\"country_codes\":[{\"country_code\":\"1664\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MT\",\"default_name\":\"Malta\",\"country_codes\":[{\"country_code\":\"356\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"MU\",\"default_name\":\"Mauritius\",\"country_codes\":[{\"country_code\":\"230\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"MV\",\"default_name\":\"Maldives\",\"country_codes\":[{\"country_code\":\"960\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"MW\",\"default_name\":\"Malawi\",\"country_codes\":[{\"country_code\":\"265\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"MX\",\"default_name\":\"Mexico\",\"country_codes\":[{\"country_code\":\"52\"}]},{\"iso2\":\"MY\",\"default_name\":\"Malaysia\",\"country_codes\":[{\"country_code\":\"60\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"MZ\",\"default_name\":\"Mozambique\",\"country_codes\":[{\"country_code\":\"258\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NA\",\"default_name\":\"Namibia\",\"country_codes\":[{\"country_code\":\"264\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"NC\",\"default_name\":\"New Caledonia\",\"country_codes\":[{\"country_code\":\"687\"}]},{\"iso2\":\"NE\",\"default_name\":\"Niger\",\"country_codes\":[{\"country_code\":\"227\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"NF\",\"default_name\":\"Norfolk Island\",\"country_codes\":[{\"country_code\":\"672\"}]},{\"iso2\":\"NG\",\"default_name\":\"Nigeria\",\"country_codes\":[{\"country_code\":\"234\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NI\",\"default_name\":\"Nicaragua\",\"country_codes\":[{\"country_code\":\"505\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NL\",\"default_name\":\"Netherlands\",\"country_codes\":[{\"country_code\":\"31\",\"patterns\":[\"X XX XX XX XX\",\"97 XXXX XXXXX\"]}]},{\"iso2\":\"NO\",\"default_name\":\"Norway\",\"country_codes\":[{\"country_code\":\"47\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"NP\",\"default_name\":\"Nepal\",\"country_codes\":[{\"country_code\":\"977\",\"patterns\":[\"XX XXXX XXXX\"]}]},{\"iso2\":\"NR\",\"default_name\":\"Nauru\",\"country_codes\":[{\"country_code\":\"674\"}]},{\"iso2\":\"NU\",\"default_name\":\"Niue\",\"country_codes\":[{\"country_code\":\"683\"}]},{\"iso2\":\"NZ\",\"default_name\":\"New Zealand\",\"country_codes\":[{\"country_code\":\"64\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"OM\",\"default_name\":\"Oman\",\"country_codes\":[{\"country_code\":\"968\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PA\",\"default_name\":\"Panama\",\"country_codes\":[{\"country_code\":\"507\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"PE\",\"default_name\":\"Peru\",\"country_codes\":[{\"country_code\":\"51\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PF\",\"default_name\":\"French Polynesia\",\"country_codes\":[{\"country_code\":\"689\"}]},{\"iso2\":\"PG\",\"default_name\":\"Papua New Guinea\",\"country_codes\":[{\"country_code\":\"675\"}]},{\"iso2\":\"PH\",\"default_name\":\"Philippines\",\"country_codes\":[{\"country_code\":\"63\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PK\",\"default_name\":\"Pakistan\",\"country_codes\":[{\"country_code\":\"92\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"PL\",\"default_name\":\"Poland\",\"country_codes\":[{\"country_code\":\"48\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PM\",\"default_name\":\"Saint Pierre & Miquelon\",\"country_codes\":[{\"country_code\":\"508\"}]},{\"iso2\":\"PR\",\"default_name\":\"Puerto Rico\",\"country_codes\":[{\"country_code\":\"1787\",\"patterns\":[\"XXX XXXX\"]},{\"country_code\":\"1939\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"PS\",\"default_name\":\"Palestine\",\"country_codes\":[{\"country_code\":\"970\",\"patterns\":[\"XXX XX XXXX\"]}]},{\"iso2\":\"PT\",\"default_name\":\"Portugal\",\"country_codes\":[{\"country_code\":\"351\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"PW\",\"default_name\":\"Palau\",\"country_codes\":[{\"country_code\":\"680\"}]},{\"iso2\":\"PY\",\"default_name\":\"Paraguay\",\"country_codes\":[{\"country_code\":\"595\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"QA\",\"default_name\":\"Qatar\",\"country_codes\":[{\"country_code\":\"974\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"RE\",\"default_name\":\"Réunion\",\"country_codes\":[{\"country_code\":\"262\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RO\",\"default_name\":\"Romania\",\"country_codes\":[{\"country_code\":\"40\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"RS\",\"default_name\":\"Serbia\",\"country_codes\":[{\"country_code\":\"381\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"RU\",\"default_name\":\"Russian Federation\",\"country_codes\":[{\"country_code\":\"7\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"RW\",\"default_name\":\"Rwanda\",\"country_codes\":[{\"country_code\":\"250\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SA\",\"default_name\":\"Saudi Arabia\",\"country_codes\":[{\"country_code\":\"966\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SB\",\"default_name\":\"Solomon Islands\",\"country_codes\":[{\"country_code\":\"677\"}]},{\"iso2\":\"SC\",\"default_name\":\"Seychelles\",\"country_codes\":[{\"country_code\":\"248\",\"patterns\":[\"X XX XX XX\"]}]},{\"iso2\":\"SD\",\"default_name\":\"Sudan\",\"country_codes\":[{\"country_code\":\"249\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SE\",\"default_name\":\"Sweden\",\"country_codes\":[{\"country_code\":\"46\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SG\",\"default_name\":\"Singapore\",\"country_codes\":[{\"country_code\":\"65\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SH\",\"default_name\":\"Saint Helena\",\"country_codes\":[{\"country_code\":\"247\"},{\"country_code\":\"290\",\"patterns\":[\"XX XXX\"]}]},{\"iso2\":\"SI\",\"default_name\":\"Slovenia\",\"country_codes\":[{\"country_code\":\"386\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SK\",\"default_name\":\"Slovakia\",\"country_codes\":[{\"country_code\":\"421\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SL\",\"default_name\":\"Sierra Leone\",\"country_codes\":[{\"country_code\":\"232\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SM\",\"default_name\":\"San Marino\",\"country_codes\":[{\"country_code\":\"378\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"SN\",\"default_name\":\"Senegal\",\"country_codes\":[{\"country_code\":\"221\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"SO\",\"default_name\":\"Somalia\",\"country_codes\":[{\"country_code\":\"252\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"SR\",\"default_name\":\"Suriname\",\"country_codes\":[{\"country_code\":\"597\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SS\",\"default_name\":\"South Sudan\",\"country_codes\":[{\"country_code\":\"211\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ST\",\"default_name\":\"São Tomé & Príncipe\",\"country_codes\":[{\"country_code\":\"239\",\"patterns\":[\"XX XXXXX\"]}]},{\"iso2\":\"SV\",\"default_name\":\"El Salvador\",\"country_codes\":[{\"country_code\":\"503\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"SX\",\"default_name\":\"Sint Maarten\",\"country_codes\":[{\"country_code\":\"1721\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"SY\",\"default_name\":\"Syria\",\"country_codes\":[{\"country_code\":\"963\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"SZ\",\"default_name\":\"Eswatini\",\"country_codes\":[{\"country_code\":\"268\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"TC\",\"default_name\":\"Turks & Caicos Islands\",\"country_codes\":[{\"country_code\":\"1649\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TD\",\"default_name\":\"Chad\",\"country_codes\":[{\"country_code\":\"235\",\"patterns\":[\"XX XX XX XX\"]}]},{\"iso2\":\"TG\",\"default_name\":\"Togo\",\"country_codes\":[{\"country_code\":\"228\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TH\",\"default_name\":\"Thailand\",\"country_codes\":[{\"country_code\":\"66\",\"patterns\":[\"X XXXX XXXX\"]}]},{\"iso2\":\"TJ\",\"default_name\":\"Tajikistan\",\"country_codes\":[{\"country_code\":\"992\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"TK\",\"default_name\":\"Tokelau\",\"country_codes\":[{\"country_code\":\"690\"}]},{\"iso2\":\"TL\",\"default_name\":\"Timor-Leste\",\"country_codes\":[{\"country_code\":\"670\"}]},{\"iso2\":\"TM\",\"default_name\":\"Turkmenistan\",\"country_codes\":[{\"country_code\":\"993\",\"patterns\":[\"XX XXXXXX\"]}]},{\"iso2\":\"TN\",\"default_name\":\"Tunisia\",\"country_codes\":[{\"country_code\":\"216\",\"patterns\":[\"XX XXX XXX\"]}]},{\"iso2\":\"TO\",\"default_name\":\"Tonga\",\"country_codes\":[{\"country_code\":\"676\"}]},{\"iso2\":\"TR\",\"default_name\":\"Turkey\",\"country_codes\":[{\"country_code\":\"90\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"TT\",\"default_name\":\"Trinidad & Tobago\",\"country_codes\":[{\"country_code\":\"1868\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"TV\",\"default_name\":\"Tuvalu\",\"country_codes\":[{\"country_code\":\"688\"}]},{\"iso2\":\"TW\",\"default_name\":\"Taiwan\",\"country_codes\":[{\"country_code\":\"886\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"TZ\",\"default_name\":\"Tanzania\",\"country_codes\":[{\"country_code\":\"255\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"UA\",\"default_name\":\"Ukraine\",\"country_codes\":[{\"country_code\":\"380\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"UG\",\"default_name\":\"Uganda\",\"country_codes\":[{\"country_code\":\"256\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"US\",\"default_name\":\"USA\",\"country_codes\":[{\"country_code\":\"1\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"UY\",\"default_name\":\"Uruguay\",\"country_codes\":[{\"country_code\":\"598\",\"patterns\":[\"X XXX XXXX\"]}]},{\"iso2\":\"UZ\",\"default_name\":\"Uzbekistan\",\"country_codes\":[{\"country_code\":\"998\",\"patterns\":[\"XX XXX XX XX\"]}]},{\"iso2\":\"VC\",\"default_name\":\"Saint Vincent & the Grenadines\",\"country_codes\":[{\"country_code\":\"1784\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VE\",\"default_name\":\"Venezuela\",\"country_codes\":[{\"country_code\":\"58\",\"patterns\":[\"XXX XXX XXXX\"]}]},{\"iso2\":\"VG\",\"default_name\":\"British Virgin Islands\",\"country_codes\":[{\"country_code\":\"1284\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VI\",\"default_name\":\"US Virgin Islands\",\"country_codes\":[{\"country_code\":\"1340\",\"patterns\":[\"XXX XXXX\"]}]},{\"iso2\":\"VN\",\"default_name\":\"Vietnam\",\"country_codes\":[{\"country_code\":\"84\"}]},{\"iso2\":\"VU\",\"default_name\":\"Vanuatu\",\"country_codes\":[{\"country_code\":\"678\"}]},{\"iso2\":\"WF\",\"default_name\":\"Wallis & Futuna\",\"country_codes\":[{\"country_code\":\"681\"}]},{\"iso2\":\"WS\",\"default_name\":\"Samoa\",\"country_codes\":[{\"country_code\":\"685\"}]},{\"iso2\":\"XK\",\"default_name\":\"Kosovo\",\"country_codes\":[{\"country_code\":\"383\",\"patterns\":[\"XXXX XXXX\"]}]},{\"iso2\":\"YE\",\"default_name\":\"Yemen\",\"country_codes\":[{\"country_code\":\"967\",\"patterns\":[\"XXX XXX XXX\"]}]},{\"iso2\":\"ZA\",\"default_name\":\"South Africa\",\"country_codes\":[{\"country_code\":\"27\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZM\",\"default_name\":\"Zambia\",\"country_codes\":[{\"country_code\":\"260\",\"patterns\":[\"XX XXX XXXX\"]}]},{\"iso2\":\"ZW\",\"default_name\":\"Zimbabwe\",\"country_codes\":[{\"country_code\":\"263\",\"patterns\":[\"XX XXX XXXX\"]}]}] as any,\n hash: 0\n};\n\n/* const PhoneCodesMain: {[phoneCode: string]: Country} = {\n '1': Countries.find(c => c.name === 'United States'),\n '44': Countries.find(c => c.name === 'United Kingdom'),\n '61': Countries.find(c => c.name === 'Australia'),\n '64': Countries.find(c => c.name === 'New Zealand'),\n '246': Countries.find(c => c.name === 'Diego Garcia'),\n '255': Countries.find(c => c.name === 'Tanzania'),\n '262': Countries.find(c => c.name === 'Reunion'),\n '500': Countries.find(c => c.name === 'Falkland Islands'),\n '590': Countries.find(c => c.name === 'Guadeloupe'),\n '672': Countries.find(c => c.name === 'Norfolk Island'),\n '1 268': Countries.find(c => c.name === 'Antigua & Barbuda'),\n}; */\n\n/* \nconst toInt = (str) => {\n return parseInt(str.replace(/ /g, ''));\n};\nvar arr = window.Countries.sort((a, b) => toInt(a.phoneCode) - toInt(b.phoneCode));\narr.forEach((el, idx) => {\n if(idx === (arr.length - 1)) {\n return;\n }\n\n if(toInt(arr[idx + 1].phoneCode) === toInt(el.phoneCode)) {\n console.log('duplicate', el, arr[idx + 1]);\n }\n});\n*/\n\nexport default Countries;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/25.8300e3ae1cb91fc2bed3.chunk.js b/public/25.542232e0e7b171d74445.chunk.js similarity index 89% rename from public/25.8300e3ae1cb91fc2bed3.chunk.js rename to public/25.542232e0e7b171d74445.chunk.js index 893c05235..36db5be3e 100644 --- a/public/25.8300e3ae1cb91fc2bed3.chunk.js +++ b/public/25.542232e0e7b171d74445.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[25],{106:function(e,t,c){"use strict";c.d(t,"a",(function(){return s}));var o=c(16);const n=new Map;let r=0;const l=(e,t,c="")=>{c=t.country_code+c,r=Math.max(r,c.length),n.set(c,{country:e,code:t})};function s(e){n.size||o.default.countriesList.forEach(e=>{e.country_codes.forEach(t=>{t.prefixes?t.prefixes.forEach(c=>{l(e,t,c)}):l(e,t)})});let t,c=e.replace(/\D/g,""),s=c.slice(0,r);for(let e=s.length-1;e>=0&&(t=n.get(s.slice(0,e+1)),!t);--e);if(!t)return{formatted:c,country:void 0,code:void 0,leftPattern:""};const a=t.country,i=t.code.patterns||[],f=c.slice(t.code.country_code.length);let h="",d=0,u="";for(let e=i.length-1;e>=0;--e){h=i[e];const t=h.replace(/ /g,"");let c=0;for(let e=0,o=Math.min(f.length,t.length);ed&&(d=c,u=h)}h=u||h,h=h.replace(/\d/g,"X"),h=t.code.country_code+" "+h,h.split("").forEach((e,t)=>{" "===e&&" "!==c[t]&&c.length>t&&(c=c.slice(0,t)+" "+c.slice(t))});let g=h&&h.length>c.length?h.slice(c.length):"";return g&&(g=g.replace(/X/g,"‒")),{formatted:c,country:a,code:t.code,leftPattern:g}}}}]); -//# sourceMappingURL=25.8300e3ae1cb91fc2bed3.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[25],{107:function(e,t,c){"use strict";c.d(t,"a",(function(){return s}));var o=c(16);const n=new Map;let r=0;const l=(e,t,c="")=>{c=t.country_code+c,r=Math.max(r,c.length),n.set(c,{country:e,code:t})};function s(e){n.size||o.default.countriesList.forEach(e=>{e.country_codes.forEach(t=>{t.prefixes?t.prefixes.forEach(c=>{l(e,t,c)}):l(e,t)})});let t,c=e.replace(/\D/g,""),s=c.slice(0,r);for(let e=s.length-1;e>=0&&(t=n.get(s.slice(0,e+1)),!t);--e);if(!t)return{formatted:c,country:void 0,code:void 0,leftPattern:""};const a=t.country,i=t.code.patterns||[],f=c.slice(t.code.country_code.length);let h="",d=0,u="";for(let e=i.length-1;e>=0;--e){h=i[e];const t=h.replace(/ /g,"");let c=0;for(let e=0,o=Math.min(f.length,t.length);ed&&(d=c,u=h)}h=u||h,h=h.replace(/\d/g,"X"),h=t.code.country_code+" "+h,h.split("").forEach((e,t)=>{" "===e&&" "!==c[t]&&c.length>t&&(c=c.slice(0,t)+" "+c.slice(t))});let g=h&&h.length>c.length?h.slice(c.length):"";return g&&(g=g.replace(/X/g,"‒")),{formatted:c,country:a,code:t.code,leftPattern:g}}}}]); +//# sourceMappingURL=25.542232e0e7b171d74445.chunk.js.map \ No newline at end of file diff --git a/public/25.542232e0e7b171d74445.chunk.js.map b/public/25.542232e0e7b171d74445.chunk.js.map new file mode 100644 index 000000000..c17d46a02 --- /dev/null +++ b/public/25.542232e0e7b171d74445.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///25.f7da98ee7f72d7202d8c.chunk.js"],"names":["this","push","107","module","__webpack_exports__","__webpack_require__","d","formatPhoneNumber","_lib_langPack__WEBPACK_IMPORTED_MODULE_0__","prefixes","Map","maxPrefixLength","setPrefix","country","code","prefix","country_code","Math","max","length","set","originalStr","size","countriesList","forEach","country_codes","prefixCountry","str","replace","phoneCode","slice","i","get","formatted","undefined","leftPattern","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","min","split","symbol","idx"],"mappings":"CAACA,KAAmB,aAAIA,KAAmB,cAAK,IAAIC,KAAK,CAAC,CAAC,IAAI,CAEzDC,IACA,SAAUC,EAAQC,EAAqBC,GAE7C,aAC+BA,EAAoBC,EAAEF,EAAqB,KAAK,WAAa,OAAOG,KAC9E,IAAIC,EAA6CH,EAAoB,IAQ1F,MAAMI,EAAW,IAAIC,IACrB,IAAIC,EAAkB,EACtB,MAAMC,EAAY,CAACC,EAASC,EAAMC,EAAS,MACvCA,EAASD,EAAKE,aAAeD,EAI7BJ,EAAkBM,KAAKC,IAAIP,EAAiBI,EAAOI,QACnDV,EAASW,IAAIL,EAAQ,CAAEF,UAASC,UAEpC,SAASP,EAAkBc,GAClBZ,EAASa,MACVd,EAAoD,QAAEe,cAAcC,QAAQX,IACxEA,EAAQY,cAAcD,QAAQV,IAEtBA,EAAKL,SACLK,EAAKL,SAASe,QAAQT,IAClBH,EAAUC,EAASC,EAAMC,KAI7BH,EAAUC,EAASC,OAMnC,IASIY,EATAC,EAAMN,EAAYO,QAAQ,MAAO,IACjCC,EAAYF,EAAIG,MAAM,EAAGnB,GAS7B,IAAK,IAAIoB,EAAIF,EAAUV,OAAS,EAAGY,GAAK,IACpCL,EAAgBjB,EAASuB,IAAIH,EAAUC,MAAM,EAAGC,EAAI,KAChDL,KAFqCK,GAM7C,IAAKL,EACD,MAAO,CACHO,UAAWN,EACXd,aAASqB,EACTpB,UAAMoB,EACNC,YAAa,IAIrB,MAAMtB,EAAUa,EAAcb,QACxBuB,EAAWV,EAAcZ,KAAKsB,UAAY,GAC1CC,EAAmBV,EAAIG,MAAMJ,EAAcZ,KAAKE,aAAaG,QACnE,IAAImB,EAAU,GAAIC,EAA4B,EAAGC,EAAqB,GACtE,IAAK,IAAIT,EAAIK,EAASjB,OAAS,EAAGY,GAAK,IAAKA,EAAG,CAC3CO,EAAUF,EAASL,GACnB,MAAMU,EAAWH,EAAQV,QAAQ,KAAM,IACvC,IAAIc,EAAiB,EACrB,IAAK,IAAIC,EAAI,EAAGxB,EAASF,KAAK2B,IAAIP,EAAiBlB,OAAQsB,EAAStB,QAASwB,EAAIxB,IAAUwB,EAAG,CAC1F,GAAIN,EAAiBM,KAAOF,EAASE,IAAsB,MAAhBF,EAASE,GAG/C,CACDD,EAAiB,EACjB,QAJEA,EAONA,EAAiBH,IACjBA,EAA4BG,EAC5BF,EAAqBF,GAG7BA,EAAUE,GAAsBF,EAChCA,EAAUA,EAAQV,QAAQ,MAAO,KACjCU,EAAUZ,EAAcZ,KAAKE,aAAe,IAAMsB,EAElDA,EAAQO,MAAM,IAAIrB,QAAQ,CAACsB,EAAQC,KAChB,MAAXD,GAA+B,MAAbnB,EAAIoB,IAAgBpB,EAAIR,OAAS4B,IACnDpB,EAAMA,EAAIG,MAAM,EAAGiB,GAAO,IAAMpB,EAAIG,MAAMiB,MAMlD,IAAIZ,EAAcG,GAAWA,EAAQnB,OAASQ,EAAIR,OAASmB,EAAQR,MAAMH,EAAIR,QAAU,GAOvF,OANIgB,IAGAA,EAAcA,EAAYP,QAAQ,KAAM,MAGrC,CAAEK,UAAWN,EAAKd,UAASC,KAAMY,EAAcZ,KAAMqB","file":"25.542232e0e7b171d74445.chunk.js","sourceRoot":""} \ No newline at end of file diff --git a/public/25.8300e3ae1cb91fc2bed3.chunk.js.map b/public/25.8300e3ae1cb91fc2bed3.chunk.js.map deleted file mode 100644 index db70a5dcb..000000000 --- a/public/25.8300e3ae1cb91fc2bed3.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/formatPhoneNumber.ts"],"names":["prefixes","Map","maxPrefixLength","setPrefix","country","code","prefix","country_code","Math","max","length","set","formatPhoneNumber","originalStr","size","countriesList","forEach","country_codes","prefixCountry","str","replace","phoneCode","slice","i","get","formatted","undefined","leftPattern","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","min","split","symbol","idx"],"mappings":"uFAAA,8CAWA,MAAMA,EAAuC,IAAIC,IACjD,IAAIC,EAAkB,EACtB,MAAMC,EAAY,CAACC,EAAsBC,EAAuBC,EAAiB,MAC/EA,EAASD,EAAKE,aAAeD,EAI7BJ,EAAkBM,KAAKC,IAAIP,EAAiBI,EAAOI,QACnDV,EAASW,IAAIL,EAAQ,CAACF,UAASC,UAG1B,SAASO,EAAkBC,GAM5Bb,EAASc,MACX,UAAKC,cAAcC,QAAQZ,IACzBA,EAAQa,cAAcD,QAAQX,IAGzBA,EAAKL,SACNK,EAAKL,SAASgB,QAAQV,IACpBH,EAAUC,EAASC,EAAMC,KAG3BH,EAAUC,EAASC,OAO3B,IAYIa,EAZAC,EAAMN,EAAYO,QAAQ,MAAO,IACjCC,EAAYF,EAAIG,MAAM,EAAGpB,GAY7B,IAAI,IAAIqB,EAAIF,EAAUX,OAAS,EAAGa,GAAK,IACrCL,EAAgBlB,EAASwB,IAAIH,EAAUC,MAAM,EAAGC,EAAI,KACjDL,KAFuCK,GAO5C,IAAIL,EACF,MAAO,CACLO,UAAWN,EACXf,aAASsB,EACTrB,UAAMqB,EACNC,YAAa,IAKjB,MAAMvB,EAAUc,EAAcd,QAExBwB,EAAWV,EAAcb,KAAKuB,UAAY,GAC1CC,EAAmBV,EAAIG,MAAMJ,EAAcb,KAAKE,aAAaG,QACnE,IAAIoB,EAAU,GAAIC,EAA4B,EAAGC,EAAqB,GACtE,IAAI,IAAIT,EAAIK,EAASlB,OAAS,EAAGa,GAAK,IAAKA,EAAG,CAC5CO,EAAUF,EAASL,GAEnB,MAAMU,EAAWH,EAAQV,QAAQ,KAAM,IACvC,IAAIc,EAAiB,EACrB,IAAI,IAAIC,EAAI,EAAGzB,EAASF,KAAK4B,IAAIP,EAAiBnB,OAAQuB,EAASvB,QAASyB,EAAIzB,IAAUyB,EAAG,CAC3F,GAAGN,EAAiBM,KAAOF,EAASE,IAAsB,MAAhBF,EAASE,GAE5C,CACLD,EAAiB,EACjB,QAHEA,EAOHA,EAAiBH,IAClBA,EAA4BG,EAC5BF,EAAqBF,GAIzBA,EAAUE,GAAsBF,EAChCA,EAAUA,EAAQV,QAAQ,MAAO,KAEjCU,EAAUZ,EAAcb,KAAKE,aAAe,IAAMuB,EAElDA,EAAQO,MAAM,IAAIrB,QAAQ,CAACsB,EAAQC,KACnB,MAAXD,GAA+B,MAAbnB,EAAIoB,IAAgBpB,EAAIT,OAAS6B,IACpDpB,EAAMA,EAAIG,MAAM,EAAGiB,GAAO,IAAMpB,EAAIG,MAAMiB,MAQ9C,IAAIZ,EAAcG,GAAWA,EAAQpB,OAASS,EAAIT,OAASoB,EAAQR,MAAMH,EAAIT,QAAU,GAQvF,OAPGiB,IAGDA,EAAcA,EAAYP,QAAQ,KAAM,MAInC,CAACK,UAAWN,EAAKf,UAASC,KAAMa,EAAcb,KAAMsB","file":"25.8300e3ae1cb91fc2bed3.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { 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 if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n const s = {country, code};\n\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/26.27b86f0f8f80f7f420ab.chunk.js.map b/public/26.27b86f0f8f80f7f420ab.chunk.js.map deleted file mode 100644 index 6af5fe528..000000000 --- a/public/26.27b86f0f8f80f7f420ab.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/peerIdPolyfill.ts"],"names":["String","prototype","toUserId","this","toChatId","toPeerId","isChat","isPeerId","test","toString","Number","Math","abs","undefined"],"mappings":"sFAAA,OAMAA,OAAOC,UAAUC,SAAW,WAC1B,QAASC,MAAMD,YAGjBF,OAAOC,UAAUG,SAAW,WAC1B,QAASD,MAAMC,YAGjBJ,OAAOC,UAAUI,SAAW,SAASC,GACnC,QAASH,MAAME,SAASC,IAG1BN,OAAOC,UAAUM,SAAW,WAC1B,MAAO,SAASC,KAAKL,KAAKM,aAG5BC,OAAOT,UAAUC,SAAW,WAC1B,OAAOC,MAGTO,OAAOT,UAAUG,SAAW,WAC1B,OAAOO,KAAKC,IAAIT,OAGlBO,OAAOT,UAAUI,SAAW,SAASC,GACnC,YAAkBO,IAAXP,EAAuBH,KAAkBG,GAAUK,KAAKC,IAAIT,MAAkBA,MAGvFO,OAAOT,UAAUM,SAAW,WAC1B,OAAO","file":"26.27b86f0f8f80f7f420ab.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\nNumber.prototype.toUserId = function() {\n return this as any;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? this as number : (isChat ? -Math.abs(this as number) : this as number);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n }\n}\n\nexport {};\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/26.27b86f0f8f80f7f420ab.chunk.js b/public/26.3728922ed59faa39207a.chunk.js similarity index 91% rename from public/26.27b86f0f8f80f7f420ab.chunk.js rename to public/26.3728922ed59faa39207a.chunk.js index 7609de3f8..6c781c576 100644 --- a/public/26.27b86f0f8f80f7f420ab.chunk.js +++ b/public/26.3728922ed59faa39207a.chunk.js @@ -1,2 +1,2 @@ (this.webpackJsonp=this.webpackJsonp||[]).push([[26],{28:function(t,r,o){"use strict";o.r(r),String.prototype.toUserId=function(){return(+this).toUserId()},String.prototype.toChatId=function(){return(+this).toChatId()},String.prototype.toPeerId=function(t){return(+this).toPeerId(t)},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(t){return void 0===t?this:t?-Math.abs(this):this},Number.prototype.isPeerId=function(){return!0}}}]); -//# sourceMappingURL=26.27b86f0f8f80f7f420ab.chunk.js.map \ No newline at end of file +//# sourceMappingURL=26.3728922ed59faa39207a.chunk.js.map \ No newline at end of file diff --git a/public/26.3728922ed59faa39207a.chunk.js.map b/public/26.3728922ed59faa39207a.chunk.js.map new file mode 100644 index 000000000..228f562ac --- /dev/null +++ b/public/26.3728922ed59faa39207a.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///26.27b86f0f8f80f7f420ab.chunk.js"],"names":["this","push","28","module","__webpack_exports__","__webpack_require__","r","String","prototype","toUserId","toChatId","toPeerId","isChat","isPeerId","test","toString","Number","Math","abs","undefined"],"mappings":"CAACA,KAAmB,aAAIA,KAAmB,cAAK,IAAIC,KAAK,CAAC,CAAC,IAAI,CAEzDC,GACA,SAAUC,EAAQC,EAAqBC,GAE7C,aACAA,EAAoBC,EAAEF,GAMtBG,OAAOC,UAAUC,SAAW,WACxB,QAAST,MAAMS,YAEnBF,OAAOC,UAAUE,SAAW,WACxB,QAASV,MAAMU,YAEnBH,OAAOC,UAAUG,SAAW,SAAUC,GAClC,QAASZ,MAAMW,SAASC,IAE5BL,OAAOC,UAAUK,SAAW,WACxB,MAAO,SAASC,KAAKd,KAAKe,aAE9BC,OAAOR,UAAUC,SAAW,WACxB,OAAOT,MAEXgB,OAAOR,UAAUE,SAAW,WACxB,OAAOO,KAAKC,IAAIlB,OAEpBgB,OAAOR,UAAUG,SAAW,SAAUC,GAClC,YAAkBO,IAAXP,EAAuBZ,KAAQY,GAAUK,KAAKC,IAAIlB,MAAQA,MAErEgB,OAAOR,UAAUK,SAAW,WACxB,OAAO","file":"26.3728922ed59faa39207a.chunk.js","sourceRoot":""} \ No newline at end of file diff --git a/public/27.1bfe793cc702c7aa75db.chunk.js b/public/27.afe309283a478f17a54d.chunk.js similarity index 96% rename from public/27.1bfe793cc702c7aa75db.chunk.js rename to public/27.afe309283a478f17a54d.chunk.js index 3b7165340..1a1803b56 100644 --- a/public/27.1bfe793cc702c7aa75db.chunk.js +++ b/public/27.afe309283a478f17a54d.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[27],{17:function(e,t,s){"use strict";s.r(t),s.d(t,"STATE_INIT",(function(){return P})),s.d(t,"AppStateManager",(function(){return w}));var a=s(46),i=s(56),n=s(15),o=s(80),r=s(43),h=s(34),d=s(8),l=s(29),g=s(98),c=s(0),u=s(116),p=s(65),f=s(66);var S=function(e,t,s,a){return new(s||(s=Promise))((function(i,n){function o(e){try{h(a.next(e))}catch(e){n(e)}}function r(e){try{h(a.throw(e))}catch(e){n(e)}}function h(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}h((a=a.apply(e,t||[])).next())}))};const m=d.a.versionFull,b=d.a.build,P={allDialogsLoaded:{},pinnedOrders:{},contactsList:[],updates:{},filters:{},maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],topPeersCache:{},recentSearch:[],version:m,build:b,authState:{_:c.IS_MOBILE?"authStateSignIn":"authStateSignQr"},hiddenPinnedMessages:{},settings:{messagesTextSize:16,sendShortcut:"enter",animationsEnabled:!0,autoDownload:{contacts:!0,private:!0,groups:!0,channels:!0},autoPlay:{gifs:!0,videos:!0},stickers:{suggest:!0,loop:!0},emoji:{suggest:!0,big:!0},themes:[{name:"day",background:{type:"image",blur:!1,slug:"ByxGo2lrMFAIAAAAmkJxZabh8eM",highlightningColor:"hsla(85.5319, 36.9171%, 40.402%, 0.4)"}},{name:"night",background:{type:"color",blur:!1,color:"#0f0f0f",highlightningColor:"hsla(0, 0%, 3.82353%, 0.4)"}}],theme:"system",notifications:{sound:!1},timeFormat:(new Date).toLocaleString().match(/\s(AM|PM)/)?"h12":"h23"},keepSigned:!0,chatContextMenuHintWasShown:!1,stateId:Object(f.a)(32)},v=Object.keys(P),y=["contactsList","stateCreatedTime","maxSeenMsgId","filters","topPeers"];class w extends i.a{constructor(){super(),this.log=Object(r.b)("STATE"),this.neededPeers=new Map,this.singlePeerMap=new Map,this.storages={users:new g.a(u.a,"users"),chats:new g.a(u.a,"chats"),dialogs:new g.a(u.a,"dialogs")},this.storagesResults={},this.storage=o.a,this.loadSavedState()}loadSavedState(){return this.loaded||(console.time("load state"),this.loaded=new Promise(e=>{const t=Object.keys(this.storages),s=t.map(e=>this.storages[e].getAll()),a=v.map(e=>o.a.get(e)).concat(p.a.get("user_auth"),p.a.get("state_id")).concat(o.a.get("user_auth")).concat(s);Promise.all(a).then(s=>S(this,void 0,void 0,(function*(){let a=this.state={};for(let e=0,t=v.length;eo.a.get(e)));e.push("user_auth"),t.push("number"==typeof i||"string"==typeof i?{dcID:t[0]||d.a.baseDcId,date:Date.now()/1e3|0,id:i.toPeerId(!1)}:i);let s={};e.forEach((e,a)=>{s[e]=t[a]}),yield p.a.set(s)}i&&(a.authState={_:"authStateSignedIn"},n.default.dispatchEvent("user_auth","number"==typeof i||"string"==typeof i?{dcID:0,date:Date.now()/1e3|0,id:i.toPeerId(!1)}:i));for(let e=0,a=t.length;e{e.set(s,Object(h.a)(a[s]))}),a=this.state=Object(h.a)(P),e.forEach((e,t)=>{a[t]=e});for(const e in this.storagesResults)this.storagesResults[e].length=0;this.storage.set(a)}yield p.a.set({state_id:a.stateId})}const c=Date.now();if(a.stateCreatedTime+864e5{e.forEach(e=>{this.pushToState(e,Object(h.a)(P[e]));const t=this.storagesResults[e];t&&t.length&&(t.length=0)})})(y)}if(!a.settings.hasOwnProperty("theme")&&a.settings.hasOwnProperty("nightTheme")&&(a.settings.theme=a.settings.nightTheme?"night":"day",this.pushToState("settings",a.settings)),!a.settings.hasOwnProperty("themes")&&a.settings.background){a.settings.themes=Object(h.a)(P.settings.themes);const e=a.settings.themes.find(e=>e.name===a.settings.theme);e&&(e.background=a.settings.background,this.pushToState("settings",a.settings))}if(Object(h.k)(P,a,e=>{this.pushToState(e,a[e])}),a.version!==m){if(-1===function(e,t){e=e.split(" ",1)[0],t=t.split(" ",1)[0];const s=e.split("."),a=t.split(".");for(let e=0;ei)return 1;if(t{const t=Object.keys(this.storages),s=t.map(e=>this.storages[e].getAll()),a=v.map(e=>o.a.get(e)).concat(p.a.get("user_auth"),p.a.get("state_id")).concat(o.a.get("user_auth")).concat(s);Promise.all(a).then(s=>S(this,void 0,void 0,(function*(){let a=this.state={};for(let e=0,t=v.length;eo.a.get(e)));e.push("user_auth"),t.push("number"==typeof i||"string"==typeof i?{dcID:t[0]||d.a.baseDcId,date:Date.now()/1e3|0,id:i.toPeerId(!1)}:i);let s={};e.forEach((e,a)=>{s[e]=t[a]}),yield p.a.set(s)}i&&(a.authState={_:"authStateSignedIn"},n.default.dispatchEvent("user_auth","number"==typeof i||"string"==typeof i?{dcID:0,date:Date.now()/1e3|0,id:i.toPeerId(!1)}:i));for(let e=0,a=t.length;e{e.set(s,Object(h.a)(a[s]))}),a=this.state=Object(h.a)(P),e.forEach((e,t)=>{a[t]=e});for(const e in this.storagesResults)this.storagesResults[e].length=0;this.storage.set(a)}yield p.a.set({state_id:a.stateId})}const c=Date.now();if(a.stateCreatedTime+864e5{e.forEach(e=>{this.pushToState(e,Object(h.a)(P[e]));const t=this.storagesResults[e];t&&t.length&&(t.length=0)})})(y)}if(!a.settings.hasOwnProperty("theme")&&a.settings.hasOwnProperty("nightTheme")&&(a.settings.theme=a.settings.nightTheme?"night":"day",this.pushToState("settings",a.settings)),!a.settings.hasOwnProperty("themes")&&a.settings.background){a.settings.themes=Object(h.a)(P.settings.themes);const e=a.settings.themes.find(e=>e.name===a.settings.theme);e&&(e.background=a.settings.background,this.pushToState("settings",a.settings))}if(Object(h.k)(P,a,e=>{this.pushToState(e,a[e])}),a.version!==m){if(-1===function(e,t){e=e.split(" ",1)[0],t=t.split(" ",1)[0];const s=e.split("."),a=t.split(".");for(let e=0;ei)return 1;if(t,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts: boolean\n private: boolean\n groups: boolean\n channels: boolean\n },\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\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: {\n type: 'image',\n blur: false,\n slug: 'ByxGo2lrMFAIAAAAmkJxZabh8eM', // * new blurred camomile,\n highlightningColor: 'hsla(85.5319, 36.9171%, 40.402%, 0.4)'\n }\n }, {\n name: 'night',\n background: {\n type: 'color',\n blur: false,\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)'\n }\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23'\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32)\n};\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS = ['contactsList', 'stateCreatedTime',\n 'maxSeenMsgId', 'filters', 'topPeers'] as any as Array;\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage';\n\n//const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise,\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void\n}> {\n public static STATE_INIT = STATE_INIT;\n private loaded: Promise;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map = new Map();\n\n public storages = {\n users: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'users'),\n chats: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'chats'),\n dialogs: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'dialogs')\n };\n\n public storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n\n public storage = stateStorage;\n\n public newVersion: string;\n\n constructor() {\n super();\n this.loadSavedState();\n }\n\n public loadSavedState(): Promise {\n if(this.loaded) return this.loaded;\n console.time('load state');\n this.loaded = new Promise((resolve) => {\n const storagesKeys = Object.keys(this.storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map(key => this.storages[key].getAll());\n\n const promises/* : Promise[] */ = ALL_KEYS.map(key => stateStorage.get(key))\n .concat(sessionStorage.get('user_auth'), sessionStorage.get('state_id'))\n .concat(stateStorage.get('user_auth')) // support old webk format\n .concat(storagesPromises);\n\n Promise.all(promises).then(async(arr) => {\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n \n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n \n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n let state: State = this.state = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n this.pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map(key => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n let obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n \n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ? \n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} : \n auth); // * support old version\n }\n\n // * Read storages\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n this.storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n \n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n \n state = this.state = copy(STATE_INIT);\n \n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n for(const key in this.storagesResults) {\n this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n this.storage.set(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n this.log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach(key => {\n this.pushToState(key, copy(STATE_INIT[key]));\n \n // @ts-ignore\n const s = this.storagesResults[key];\n if(s && s.length) {\n s.length = 0;\n }\n });\n };\n \n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n \n //state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n this.pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n this.pushToState('settings', state.settings);\n }\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n // @ts-ignore\n this.pushToState(missingKey, state[missingKey]);\n });\n\n if(state.version !== STATE_VERSION/* || true */) {\n // reset filters and dialogs if version is older\n if(compareVersion(state.version, '0.8.7') === -1) {\n this.state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n this.state.filters = copy(STATE_INIT.filters);\n const result = this.storagesResults.dialogs;\n if(result?.length) {\n result.length = 0;\n }\n }\n\n this.pushToState('version', this.newVersion = STATE_VERSION);\n this.pushToState('build', BUILD);\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n console.timeEnd('load state');\n resolve(state);\n }).catch(resolve);\n });\n\n return this.loaded;\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.dispatchEvent('settings_updated', {key, value});\n\n const first = key.split('.')[0];\n // @ts-ignore\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key]) {\n this.storage.set({\n [key]: value\n });\n }\n\n public requestPeer(peerId: PeerId, type: StatePeerType, limit?: number) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(type)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(type);\n\n this.dispatchEvent('peerNeeded', peerId);\n\n if(limit !== undefined) {\n this.keepPeerSingle(peerId, type);\n }\n }\n\n public requestPeerSingle(peerId: PeerId, type: StatePeerType, keepPeerIdSingle: PeerId = peerId) {\n return this.requestPeer(peerId, type + '_' + keepPeerIdSingle as any, 1);\n }\n\n public releaseSinglePeer(peerId: PeerId, type: StatePeerType) {\n return this.keepPeerSingle(NULL_PEER_ID, type + '_' + peerId as any);\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n\n public keepPeerSingle(peerId: PeerId, type: StatePeerType) {\n const existsPeerId = this.singlePeerMap.get(type);\n if(existsPeerId && existsPeerId !== peerId && this.neededPeers.has(existsPeerId)) {\n const set = this.neededPeers.get(existsPeerId);\n set.delete(type);\n\n if(!set.size) {\n this.neededPeers.delete(existsPeerId);\n this.dispatchEvent('peerUnneeded', existsPeerId);\n }\n }\n\n if(peerId) {\n this.singlePeerMap.set(type, peerId);\n } else {\n this.singlePeerMap.delete(type);\n }\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;\n","export default function 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"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/lib/appManagers/appStateManager.ts","webpack:///./src/helpers/compareVersion.ts"],"names":["STATE_VERSION","versionFull","BUILD","build","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsList","updates","filters","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","topPeersCache","recentSearch","version","authState","_","hiddenPinnedMessages","settings","messagesTextSize","sendShortcut","animationsEnabled","autoDownload","contacts","private","groups","channels","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","name","background","type","blur","slug","highlightningColor","color","theme","notifications","sound","timeFormat","toLocaleString","match","keepSigned","chatContextMenuHintWasShown","stateId","ALL_KEYS","Object","keys","REFRESH_KEYS","super","log","logger","neededPeers","Map","singlePeerMap","storages","users","chats","dialogs","storagesResults","storage","stateStorage","this","loadSavedState","loaded","console","time","Promise","resolve","storagesKeys","storagesPromises","map","key","getAll","promises","get","concat","sessionStorage","all","then","arr","state","i","length","value","undefined","pushToState","splice","auth","shift","shiftedWebKAuth","push","values","dcID","baseDcId","date","id","toPeerId","obj","forEach","idx","set","rootScope","dispatchEvent","preserve","state_id","s","r","hasOwnProperty","nightTheme","find","t","missingKey","v1","v2","split","s1","s2","compareVersion","result","newVersion","timeEnd","catch","first","direct","setKeyValueToStorage","peerId","limit","has","Set","add","keepPeerSingle","keepPeerIdSingle","requestPeer","existsPeerId","delete","size","appStateManager"],"mappings":"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","file":"27.afe309283a478f17a54d.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Dialog } from './appMessagesManager';\nimport { NULL_PEER_ID, UserAuth } from '../mtproto/mtproto_config';\nimport type { MyTopPeer, TopPeerType, User } from './appUsersManager';\nimport type { AuthState } from '../../types';\nimport type FiltersStorage from '../storages/filters';\nimport type DialogsStorage from '../storages/dialogs';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport { logger } from '../logger';\nimport { copy, setDeepProperty, validateInitObject } from '../../helpers/object';\nimport App from '../../config/app';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport AppStorage from '../storage';\nimport { Chat } from '../../layer';\nimport { IS_MOBILE } from '../../environment/userAgent';\nimport DATABASE_STATE from '../../config/databases/state';\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport compareVersion from '../../helpers/compareVersion';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n//const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\nconst STATE_VERSION = App.versionFull;\nconst BUILD = App.build;\n\nexport type Background = {\n type: 'color' | 'image' | 'default',\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string,\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n contactsList: UserId[],\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts: boolean\n private: boolean\n groups: boolean\n channels: boolean\n },\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\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: {\n type: 'image',\n blur: false,\n slug: 'ByxGo2lrMFAIAAAAmkJxZabh8eM', // * new blurred camomile,\n highlightningColor: 'hsla(85.5319, 36.9171%, 40.402%, 0.4)'\n }\n }, {\n name: 'night',\n background: {\n type: 'color',\n blur: false,\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)'\n }\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23'\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32)\n};\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS = ['contactsList', 'stateCreatedTime',\n 'maxSeenMsgId', 'filters', 'topPeers'] as any as Array;\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage';\n\n//const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise,\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void\n}> {\n public static STATE_INIT = STATE_INIT;\n private loaded: Promise;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map = new Map();\n\n public storages = {\n users: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'users'),\n chats: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'chats'),\n dialogs: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'dialogs')\n };\n\n public storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n\n public storage = stateStorage;\n\n public newVersion: string;\n\n constructor() {\n super();\n this.loadSavedState();\n }\n\n public loadSavedState(): Promise {\n if(this.loaded) return this.loaded;\n console.time('load state');\n this.loaded = new Promise((resolve) => {\n const storagesKeys = Object.keys(this.storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map(key => this.storages[key].getAll());\n\n const promises/* : Promise[] */ = ALL_KEYS.map(key => stateStorage.get(key))\n .concat(sessionStorage.get('user_auth'), sessionStorage.get('state_id'))\n .concat(stateStorage.get('user_auth')) // support old webk format\n .concat(storagesPromises);\n\n Promise.all(promises).then(async(arr) => {\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n \n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n \n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n let state: State = this.state = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n this.pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map(key => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n let obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n \n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ? \n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} : \n auth); // * support old version\n }\n\n // * Read storages\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n this.storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n \n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n \n state = this.state = copy(STATE_INIT);\n \n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n for(const key in this.storagesResults) {\n this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n this.storage.set(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n this.log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach(key => {\n this.pushToState(key, copy(STATE_INIT[key]));\n \n // @ts-ignore\n const s = this.storagesResults[key];\n if(s && s.length) {\n s.length = 0;\n }\n });\n };\n \n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n \n //state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n this.pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n this.pushToState('settings', state.settings);\n }\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n // @ts-ignore\n this.pushToState(missingKey, state[missingKey]);\n });\n\n if(state.version !== STATE_VERSION/* || true */) {\n // reset filters and dialogs if version is older\n if(compareVersion(state.version, '0.8.7') === -1) {\n this.state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n this.state.filters = copy(STATE_INIT.filters);\n const result = this.storagesResults.dialogs;\n if(result?.length) {\n result.length = 0;\n }\n }\n\n this.pushToState('version', this.newVersion = STATE_VERSION);\n this.pushToState('build', BUILD);\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n console.timeEnd('load state');\n resolve(state);\n }).catch(resolve);\n });\n\n return this.loaded;\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.dispatchEvent('settings_updated', {key, value});\n\n const first = key.split('.')[0];\n // @ts-ignore\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key]) {\n this.storage.set({\n [key]: value\n });\n }\n\n public requestPeer(peerId: PeerId, type: StatePeerType, limit?: number) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(type)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(type);\n\n this.dispatchEvent('peerNeeded', peerId);\n\n if(limit !== undefined) {\n this.keepPeerSingle(peerId, type);\n }\n }\n\n public requestPeerSingle(peerId: PeerId, type: StatePeerType, keepPeerIdSingle: PeerId = peerId) {\n return this.requestPeer(peerId, type + '_' + keepPeerIdSingle as any, 1);\n }\n\n public releaseSinglePeer(peerId: PeerId, type: StatePeerType) {\n return this.keepPeerSingle(NULL_PEER_ID, type + '_' + peerId as any);\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n\n public keepPeerSingle(peerId: PeerId, type: StatePeerType) {\n const existsPeerId = this.singlePeerMap.get(type);\n if(existsPeerId && existsPeerId !== peerId && this.neededPeers.has(existsPeerId)) {\n const set = this.neededPeers.get(existsPeerId);\n set.delete(type);\n\n if(!set.size) {\n this.neededPeers.delete(existsPeerId);\n this.dispatchEvent('peerUnneeded', existsPeerId);\n }\n }\n\n if(peerId) {\n this.singlePeerMap.set(type, peerId);\n } else {\n this.singlePeerMap.delete(type);\n }\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;\n","export default function 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"],"sourceRoot":""} \ No newline at end of file diff --git a/public/28.b17aefb7c51046ff48ec.chunk.js b/public/28.915fd231c46789adc787.chunk.js similarity index 97% rename from public/28.b17aefb7c51046ff48ec.chunk.js rename to public/28.915fd231c46789adc787.chunk.js index 656775056..900b10141 100644 --- a/public/28.b17aefb7c51046ff48ec.chunk.js +++ b/public/28.915fd231c46789adc787.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[28],{147:function(e,a,s){"use strict";s.r(a);function c(e,a){switch(e){case 27764:if(a%10==1&&(a%100<11||a%100>19))return"one";if(a%10>=2&&a%10<=9&&(a%100<11||a%100>19))return"few";break;case 27766:if(0==a)return"zero";if(a%10==1&&a%100!=11)return"one";break;case 25465:if(2==a)return"two";if(3==a)return"few";if(0==a)return"zero";if(1==a)return"one";if(6==a)return"many";break;case 25189:case 25203:case 26738:case 29301:case 29544:case 29554:case 30059:if(a%10==1&&a%100!=11)return"one";if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return"few";if(a%10==0||a%10>=5&&a%10<=9||a%100>=11&&a%100<=14)return"many";break;case 7041896:if(0==a)return"zero";if(1==a)return"one";break;case 7563369:if(a>=2&&a<=10)return"few";if(a>=0&&a<=1)return"one";break;case 26725:if(2==a)return"two";if(1==a)return"one";if(0!=a&&a%10==0)return"many";break;case 25459:case 29547:if(1==a)return"one";if(a>=2&&a<=4)return"few";break;case 25202:if(0!=a&&a%1e6==0)return"many";if(a%10==1&&a%100!=11&&a%100!=71&&a%100!=91)return"one";if(a%10==2&&a%100!=12&&a%100!=72&&a%100!=92)return"two";if((a%10>=3&&a%10<=4||a%10==9)&&(a%100<10||a%100>19)&&(a%100<70||a%100>79)&&(a%100<90||a%100>99))return"few";break;case 29548:if(a%100==2)return"two";if(a%100==1)return"one";if(a%100>=3&&a%100<=4)return"few";break;case 7102823:if(0==a)return"zero";if(a>=0&&a<=2&&0!=a&&2!=a)return"one";break;case 28780:if(1==a)return"one";if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return"few";if(1!=a&&a%10>=0&&a%10<=1||a%10>=5&&a%10<=9||a%100>=12&&a%100<=14)return"many";break;case 26468:if(2==a||12==a)return"two";if(1==a||11==a)return"one";if(a>=3&&a<=10||a>=13&&a<=19)return"few";break;case 26486:if(a%10>=1&&a%10<=2||a%20==0)return"one";break;case 28011:if(a%10==1&&11!=a)return"one";break;case 28020:if(1==a)return"one";if(a%100>=11&&a%100<=19)return"many";if(0==a||a%100>=2&&a%100<=10)return"few";break;case 28015:case 29295:if(1==a)return"one";if(0==a||1!=a&&a%100>=1&&a%100<=19)return"few";break;case 26465:if(2==a)return"two";if(1==a)return"one";if(a>=3&&a<=6)return"few";if(a>=7&&a<=10)return"many";break;case 26214:case 26226:case 7037282:if(a>=0&&a<=2&&2!=a)return"one";break;case 26997:case 27511:case 29541:case 7233905:case 7564641:case 7564649:case 7564650:case 7564654:case 7564659:if(2==a)return"two";if(1==a)return"one";break;case 24939:case 24941:case 25192:case 26729:case 27758:case 28007:case 29801:case 29804:case 30561:case 6711660:case 6780279:case 7238511:if(a>=0&&a<=1)return"one";break;case 7633517:if(a>=0&&a<=1||a>=11&&a<=99)return"one";break;case 24934:case 25191:case 25198:case 25441:case 25697:case 25701:case 25718:case 25957:case 25964:case 25966:case 25967:case 25971:case 25972:case 25973:case 26217:case 26223:case 26233:case 26476:case 26485:case 26721:case 26995:case 26996:case 27499:case 27500:case 27507:case 27509:case 27513:case 27746:case 27751:case 28012:case 28014:case 28018:case 28258:case 28260:case 28261:case 28268:case 28270:case 28271:case 28274:case 28281:case 28525:case 28530:case 28531:case 28769:case 28787:case 28788:case 29293:case 29550:case 29551:case 29553:case 29555:case 29556:case 29558:case 29559:case 29793:case 29797:case 29803:case 29806:case 29811:case 30066:case 30309:case 30319:case 30824:case 31349:case 6386529:case 6386548:case 6448493:case 6448506:case 6451832:case 6514535:case 6514802:case 6515554:case 6714738:case 6779767:case 6840695:case 6973295:case 6974819:case 7037290:case 7037799:case 7039850:case 7041890:case 7168371:case 7169903:case 7233896:case 7237224:case 7240046:case 7364976:case 7499622:case 7501675:case 7561585:case 7562600:case 7566201:case 7567730:case 7628143:case 7629159:case 7763310:case 7823717:case 7892839:if(1==a)return"one";break;case 24946:if(2==a)return"two";if(1==a)return"one";if(0==a)return"zero";if(a%100>=3&&a%100<=10)return"few";if(a%100>=11&&a%100<=99)return"many"}return"other"}const r={PluralRules:class{constructor(e){this.select=c.bind(null,function(e){let a=0;for(let s=0;s19))return"one";if(a%10>=2&&a%10<=9&&(a%100<11||a%100>19))return"few";break;case 27766:if(0==a)return"zero";if(a%10==1&&a%100!=11)return"one";break;case 25465:if(2==a)return"two";if(3==a)return"few";if(0==a)return"zero";if(1==a)return"one";if(6==a)return"many";break;case 25189:case 25203:case 26738:case 29301:case 29544:case 29554:case 30059:if(a%10==1&&a%100!=11)return"one";if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return"few";if(a%10==0||a%10>=5&&a%10<=9||a%100>=11&&a%100<=14)return"many";break;case 7041896:if(0==a)return"zero";if(1==a)return"one";break;case 7563369:if(a>=2&&a<=10)return"few";if(a>=0&&a<=1)return"one";break;case 26725:if(2==a)return"two";if(1==a)return"one";if(0!=a&&a%10==0)return"many";break;case 25459:case 29547:if(1==a)return"one";if(a>=2&&a<=4)return"few";break;case 25202:if(0!=a&&a%1e6==0)return"many";if(a%10==1&&a%100!=11&&a%100!=71&&a%100!=91)return"one";if(a%10==2&&a%100!=12&&a%100!=72&&a%100!=92)return"two";if((a%10>=3&&a%10<=4||a%10==9)&&(a%100<10||a%100>19)&&(a%100<70||a%100>79)&&(a%100<90||a%100>99))return"few";break;case 29548:if(a%100==2)return"two";if(a%100==1)return"one";if(a%100>=3&&a%100<=4)return"few";break;case 7102823:if(0==a)return"zero";if(a>=0&&a<=2&&0!=a&&2!=a)return"one";break;case 28780:if(1==a)return"one";if(a%10>=2&&a%10<=4&&(a%100<12||a%100>14))return"few";if(1!=a&&a%10>=0&&a%10<=1||a%10>=5&&a%10<=9||a%100>=12&&a%100<=14)return"many";break;case 26468:if(2==a||12==a)return"two";if(1==a||11==a)return"one";if(a>=3&&a<=10||a>=13&&a<=19)return"few";break;case 26486:if(a%10>=1&&a%10<=2||a%20==0)return"one";break;case 28011:if(a%10==1&&11!=a)return"one";break;case 28020:if(1==a)return"one";if(a%100>=11&&a%100<=19)return"many";if(0==a||a%100>=2&&a%100<=10)return"few";break;case 28015:case 29295:if(1==a)return"one";if(0==a||1!=a&&a%100>=1&&a%100<=19)return"few";break;case 26465:if(2==a)return"two";if(1==a)return"one";if(a>=3&&a<=6)return"few";if(a>=7&&a<=10)return"many";break;case 26214:case 26226:case 7037282:if(a>=0&&a<=2&&2!=a)return"one";break;case 26997:case 27511:case 29541:case 7233905:case 7564641:case 7564649:case 7564650:case 7564654:case 7564659:if(2==a)return"two";if(1==a)return"one";break;case 24939:case 24941:case 25192:case 26729:case 27758:case 28007:case 29801:case 29804:case 30561:case 6711660:case 6780279:case 7238511:if(a>=0&&a<=1)return"one";break;case 7633517:if(a>=0&&a<=1||a>=11&&a<=99)return"one";break;case 24934:case 25191:case 25198:case 25441:case 25697:case 25701:case 25718:case 25957:case 25964:case 25966:case 25967:case 25971:case 25972:case 25973:case 26217:case 26223:case 26233:case 26476:case 26485:case 26721:case 26995:case 26996:case 27499:case 27500:case 27507:case 27509:case 27513:case 27746:case 27751:case 28012:case 28014:case 28018:case 28258:case 28260:case 28261:case 28268:case 28270:case 28271:case 28274:case 28281:case 28525:case 28530:case 28531:case 28769:case 28787:case 28788:case 29293:case 29550:case 29551:case 29553:case 29555:case 29556:case 29558:case 29559:case 29793:case 29797:case 29803:case 29806:case 29811:case 30066:case 30309:case 30319:case 30824:case 31349:case 6386529:case 6386548:case 6448493:case 6448506:case 6451832:case 6514535:case 6514802:case 6515554:case 6714738:case 6779767:case 6840695:case 6973295:case 6974819:case 7037290:case 7037799:case 7039850:case 7041890:case 7168371:case 7169903:case 7233896:case 7237224:case 7240046:case 7364976:case 7499622:case 7501675:case 7561585:case 7562600:case 7566201:case 7567730:case 7628143:case 7629159:case 7763310:case 7823717:case 7892839:if(1==a)return"one";break;case 24946:if(2==a)return"two";if(1==a)return"one";if(0==a)return"zero";if(a%100>=3&&a%100<=10)return"few";if(a%100>=11&&a%100<=99)return"many"}return"other"}const r={PluralRules:class{constructor(e){this.select=c.bind(null,function(e){let a=0;for(let s=0;s 19))) // n mod 10 is 1 and n mod 100 not in 11..19\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 9)) && (((n % 100) < 11 || (n % 100) > 19))) // n mod 10 in 2..9 and n mod 100 not in 11..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set2\r\n case 0x6c76: // lv\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set3\r\n case 0x6379: // cy\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 3) // n is 3\r\n return NumberPluralizationFormFew;\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (n == 6) // n is 6\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set4\r\n case 0x6265: // be\r\n case 0x6273: // bs\r\n case 0x6872: // hr\r\n case 0x7275: // ru\r\n case 0x7368: // sh\r\n case 0x7372: // sr\r\n case 0x756b: // uk\r\n if (((n % 10) == 1) && ((n % 100) != 11)) // n mod 10 is 1 and n mod 100 is not 11\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if (((n % 10) == 0) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 11 && (n % 100) <= 14))) // n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set5\r\n case 0x6b7368: // ksh\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set6\r\n case 0x736869: // shi\r\n if ((n >= 2 && n <= 10)) // n in 2..10\r\n return NumberPluralizationFormFew;\r\n if ((n >= 0 && n <= 1)) // n within 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set7\r\n case 0x6865: // he\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n != 0) && ((n % 10) == 0)) // n is not 0 AND n mod 10 is 0\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set8\r\n case 0x6373: // cs\r\n case 0x736b: // sk\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n >= 2 && n <= 4)) // n in 2..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set9\r\n case 0x6272: // br\r\n if ((n != 0) && ((n % 1000000) == 0)) // n is not 0 and n mod 1000000 is 0\r\n return NumberPluralizationFormMany;\r\n if (((n % 10) == 1) && (((n % 100) != 11) && ((n % 100) != 71) && ((n % 100) != 91))) // n mod 10 is 1 and n mod 100 not in 11,71,91\r\n return NumberPluralizationFormOne;\r\n if (((n % 10) == 2) && (((n % 100) != 12) && ((n % 100) != 72) && ((n % 100) != 92))) // n mod 10 is 2 and n mod 100 not in 12,72,92\r\n return NumberPluralizationFormTwo;\r\n if ((((n % 10) >= 3 && (n % 10) <= 4) || ((n % 10) == 9)) && (((n % 100) < 10 || (n % 100) > 19) && ((n % 100) < 70 || (n % 100) > 79) && ((n % 100) < 90 || (n % 100) > 99))) // n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set10\r\n case 0x736c: // sl\r\n if ((n % 100) == 2) // n mod 100 is 2\r\n return NumberPluralizationFormTwo;\r\n if ((n % 100) == 1) // n mod 100 is 1\r\n return NumberPluralizationFormOne;\r\n if (((n % 100) >= 3 && (n % 100) <= 4)) // n mod 100 in 3..4\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set11\r\n case 0x6c6167: // lag\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n >= 0 && n <= 2)) && (n != 0) && (n != 2)) // n within 0..2 and n is not 0 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set12\r\n case 0x706c: // pl\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((((n % 10) >= 2 && (n % 10) <= 4)) && (((n % 100) < 12 || (n % 100) > 14))) // n mod 10 in 2..4 and n mod 100 not in 12..14\r\n return NumberPluralizationFormFew;\r\n if (((n != 1) && (((n % 10) >= 0 && (n % 10) <= 1))) || (((n % 10) >= 5 && (n % 10) <= 9)) || (((n % 100) >= 12 && (n % 100) <= 14))) // n is not 1 and n mod 10 in 0..1 or n mod 10 in 5..9 or n mod 100 in 12..14\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set13\r\n case 0x6764: // gd\r\n if ((n == 2) || (n == 12)) // n in 2,12\r\n return NumberPluralizationFormTwo;\r\n if ((n == 1) || (n == 11)) // n in 1,11\r\n return NumberPluralizationFormOne;\r\n if ((n >= 3 && n <= 10) || (n >= 13 && n <= 19)) // n in 3..10,13..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set14\r\n case 0x6776: // gv\r\n if ((((n % 10) >= 1 && (n % 10) <= 2)) || ((n % 20) == 0)) // n mod 10 in 1..2 or n mod 20 is 0\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set15\r\n case 0x6d6b: // mk\r\n if (((n % 10) == 1) && (n != 11)) // n mod 10 is 1 and n is not 11\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set16\r\n case 0x6d74: // mt\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (((n % 100) >= 11 && (n % 100) <= 19)) // n mod 100 in 11..19\r\n return NumberPluralizationFormMany;\r\n if ((n == 0) || (((n % 100) >= 2 && (n % 100) <= 10))) // n is 0 or n mod 100 in 2..10\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set17\r\n case 0x6d6f: // mo\r\n case 0x726f: // ro\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n == 0) || ((n != 1) && (((n % 100) >= 1 && (n % 100) <= 19)))) // n is 0 OR n is not 1 AND n mod 100 in 1..19\r\n return NumberPluralizationFormFew;\r\n break;\r\n \r\n // set18\r\n case 0x6761: // ga\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if ((n >= 3 && n <= 6)) // n in 3..6\r\n return NumberPluralizationFormFew;\r\n if ((n >= 7 && n <= 10)) // n in 7..10\r\n return NumberPluralizationFormMany;\r\n break;\r\n \r\n // set19\r\n case 0x6666: // ff\r\n case 0x6672: // fr\r\n case 0x6b6162: // kab\r\n if (((n >= 0 && n <= 2)) && (n != 2)) // n within 0..2 and n is not 2\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set20\r\n case 0x6975: // iuw\r\n case 0x6b77: // kw\r\n case 0x7365: // se\r\n case 0x6e6171: // naq\r\n case 0x736d61: // sma\r\n case 0x736d69: // smi\r\n case 0x736d6a: // smj\r\n case 0x736d6e: // smn\r\n case 0x736d73: // sms\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set21\r\n case 0x616b: // ak\r\n case 0x616d: // am\r\n case 0x6268: // bh\r\n case 0x6869: // hi\r\n case 0x6c6e: // ln\r\n case 0x6d67: // mg\r\n case 0x7469: // ti\r\n case 0x746c: // tl\r\n case 0x7761: // wa\r\n case 0x66696c: // fil\r\n case 0x677577: // guw\r\n case 0x6e736f: // nso\r\n if ((n >= 0 && n <= 1)) // n in 0..1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set22\r\n case 0x747a6d: // tzm\r\n if (((n >= 0 && n <= 1)) || ((n >= 11 && n <= 99))) // n in 0..1 or n in 11..99\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set23\r\n case 0x6166: // af\r\n case 0x6267: // bg\r\n case 0x626e: // bn\r\n case 0x6361: // ca\r\n case 0x6461: // da\r\n case 0x6465: // de\r\n case 0x6476: // dv\r\n case 0x6565: // ee\r\n case 0x656c: // el\r\n case 0x656e: // en\r\n case 0x656f: // eo\r\n case 0x6573: // es\r\n case 0x6574: // et\r\n case 0x6575: // eu\r\n case 0x6669: // fi\r\n case 0x666f: // fo\r\n case 0x6679: // fy\r\n case 0x676c: // gl\r\n case 0x6775: // gu\r\n case 0x6861: // ha\r\n case 0x6973: // is\r\n case 0x6974: // it\r\n case 0x6b6b: // kk\r\n case 0x6b6c: // kl\r\n case 0x6b73: // ks\r\n case 0x6b75: // ku\r\n case 0x6b79: // ky\r\n case 0x6c62: // lb\r\n case 0x6c67: // lg\r\n case 0x6d6c: // ml\r\n case 0x6d6e: // mn\r\n case 0x6d72: // mr\r\n case 0x6e62: // nb\r\n case 0x6e64: // nd\r\n case 0x6e65: // ne\r\n case 0x6e6c: // nl\r\n case 0x6e6e: // nn\r\n case 0x6e6f: // no\r\n case 0x6e72: // nr\r\n case 0x6e79: // ny\r\n case 0x6f6d: // om\r\n case 0x6f72: // or\r\n case 0x6f73: // os\r\n case 0x7061: // pa\r\n case 0x7073: // ps\r\n case 0x7074: // pt\r\n case 0x726d: // rm\r\n case 0x736e: // sn\r\n case 0x736f: // so\r\n case 0x7371: // sq\r\n case 0x7373: // ss\r\n case 0x7374: // st\r\n case 0x7376: // sv\r\n case 0x7377: // sw\r\n case 0x7461: // ta\r\n case 0x7465: // te\r\n case 0x746b: // tk\r\n case 0x746e: // tn\r\n case 0x7473: // ts\r\n case 0x7572: // ur\r\n case 0x7665: // ve\r\n case 0x766f: // vo\r\n case 0x7868: // xh\r\n case 0x7a75: // zu\r\n case 0x617361: // asa\r\n case 0x617374: // ast\r\n case 0x62656d: // bem\r\n case 0x62657a: // bez\r\n case 0x627278: // brx\r\n case 0x636767: // cgg\r\n case 0x636872: // chr\r\n case 0x636b62: // ckb\r\n case 0x667572: // fur\r\n case 0x677377: // gsw\r\n case 0x686177: // haw\r\n case 0x6a676f: // jgo\r\n case 0x6a6d63: // jmc\r\n case 0x6b616a: // kaj\r\n case 0x6b6367: // kcg\r\n case 0x6b6b6a: // kkj\r\n case 0x6b7362: // ksb\r\n case 0x6d6173: // mas\r\n case 0x6d676f: // mgo\r\n case 0x6e6168: // nah\r\n case 0x6e6e68: // nnh\r\n case 0x6e796e: // nyn\r\n case 0x706170: // pap\r\n case 0x726f66: // rof\r\n case 0x72776b: // rwk\r\n case 0x736171: // saq\r\n case 0x736568: // seh\r\n case 0x737379: // ssy\r\n case 0x737972: // syr\r\n case 0x74656f: // teo\r\n case 0x746967: // tig\r\n case 0x76756e: // vun\r\n case 0x776165: // wae\r\n case 0x786f67: // xog\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n break;\r\n \r\n // set24\r\n case 0x6172: // ar\r\n if (n == 2) // n is 2\r\n return NumberPluralizationFormTwo;\r\n if (n == 1) // n is 1\r\n return NumberPluralizationFormOne;\r\n if (n == 0) // n is 0\r\n return NumberPluralizationFormZero;\r\n if (((n % 100) >= 3 && (n % 100) <= 10)) // n mod 100 in 3..10\r\n return NumberPluralizationFormFew;\r\n if (((n % 100) >= 11 && (n % 100) <= 99)) // n mod 100 in 11..99\r\n return NumberPluralizationFormMany;\r\n break;\r\n }\r\n \r\n return NumberPluralizationFormOther;\r\n}\r\n\r\n\r\nfunction languageCodehash(code: string) {\r\n let lc = 0;\r\n for(let i = 0; i < code.length; ++i) { lc = (lc << 8) + code.charCodeAt(i); }\r\n return lc;\r\n}\r\n\r\nconst Intl = {\r\n PluralRules: class {\r\n public select: (n: number) => Intl.LDMLPluralRule;\r\n\r\n constructor(code: string) {\r\n this.select = numberPluralizationForm.bind(null, languageCodehash(code));\r\n }\r\n }\r\n};\r\n\r\nexport default Intl;\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/lib/pluralPolyfill.ts"],"names":["numberPluralizationForm","lc","n","Intl","PluralRules","code","this","select","bind","i","length","charCodeAt","languageCodehash"],"mappings":"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","file":"28.915fd231c46789adc787.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\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) {\r\n \r\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"],"sourceRoot":""} \ No newline at end of file diff --git a/public/29.08bf9f3c8b9be9d555f9.chunk.js b/public/29.e7945a7ebae7a3b06d65.chunk.js similarity index 81% rename from public/29.08bf9f3c8b9be9d555f9.chunk.js rename to public/29.e7945a7ebae7a3b06d65.chunk.js index 3cd23d1ed..782732e70 100644 --- a/public/29.08bf9f3c8b9be9d555f9.chunk.js +++ b/public/29.e7945a7ebae7a3b06d65.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[29,4],{19:function(e,t,n){"use strict";n.r(t);var a=n(7),i=n(9),o=n(17),u=n(16),c=n(62),l=function(e,t,n,a){return new(n||(n=Promise))((function(i,o){function u(e){try{l(a.next(e))}catch(e){o(e)}}function c(e){try{l(a.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(u,c)}l((a=a.apply(e,t||[])).next())}))};const r=new c.a("page-chats",!1,()=>(o.default.pushToState("authState",{_:"authStateSignedIn"}),Promise.resolve().then(n.bind(null,15)).then(e=>{e.default.dispatchEvent("im_mount")}),u.default.requestedServerLanguage||u.default.getCacheLangPack().then(e=>{e.local&&u.default.getLangPack(e.lang_code)}),Object(a.a)(),Object(i.a)().then(()=>new Promise(e=>{window.requestAnimationFrame(()=>{Promise.all([n.e(3),n.e(5),n.e(6),n.e(14)]).then(n.bind(null,142)).finally(()=>l(void 0,void 0,void 0,(function*(){e()})))})}))));t.default=r}}]); -//# sourceMappingURL=29.08bf9f3c8b9be9d555f9.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[29,4],{19:function(e,t,n){"use strict";n.r(t);var a=n(7),i=n(9),o=n(17),u=n(16),c=n(64),l=function(e,t,n,a){return new(n||(n=Promise))((function(i,o){function u(e){try{l(a.next(e))}catch(e){o(e)}}function c(e){try{l(a.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(u,c)}l((a=a.apply(e,t||[])).next())}))};const r=new c.a("page-chats",!1,()=>(o.default.pushToState("authState",{_:"authStateSignedIn"}),Promise.resolve().then(n.bind(null,15)).then(e=>{e.default.dispatchEvent("im_mount")}),u.default.requestedServerLanguage||u.default.getCacheLangPack().then(e=>{e.local&&u.default.getLangPack(e.lang_code)}),Object(a.a)(),Object(i.a)().then(()=>new Promise(e=>{window.requestAnimationFrame(()=>{Promise.all([n.e(3),n.e(5),n.e(6),n.e(14)]).then(n.bind(null,148)).finally(()=>l(void 0,void 0,void 0,(function*(){e()})))})}))));t.default=r}}]); +//# sourceMappingURL=29.e7945a7ebae7a3b06d65.chunk.js.map \ No newline at end of file diff --git a/public/29.08bf9f3c8b9be9d555f9.chunk.js.map b/public/29.e7945a7ebae7a3b06d65.chunk.js.map similarity index 98% rename from public/29.08bf9f3c8b9be9d555f9.chunk.js.map rename to public/29.e7945a7ebae7a3b06d65.chunk.js.map index 54c88b2de..eca5bf999 100644 --- a/public/29.08bf9f3c8b9be9d555f9.chunk.js.map +++ b/public/29.e7945a7ebae7a3b06d65.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/pages/pageIm.ts"],"names":["page","pushToState","_","then","m","default","dispatchEvent","requestedServerLanguage","getCacheLangPack","langPack","local","getLangPack","lang_code","Promise","resolve","window","requestAnimationFrame","finally"],"mappings":"wFAAA,iD,sSAyFA,MAAMA,EAAO,IAAI,IAAK,cAAc,EA7EjB,KAEjB,UAAgBC,YAAY,YAAa,CAACC,EAAG,sBAI7C,wCAA2BC,KAAKC,IAC9BA,EAAEC,QAAQC,cAAc,cAGtB,UAAKC,yBACP,UAAKC,mBAAmBL,KAAKM,IACxBA,EAASC,OACV,UAAKC,YAAYF,EAASG,aAKhC,cACO,cAAYT,KAAK,IACf,IAAIU,QAAeC,IACxBC,OAAOC,sBAAsB,KAET,mEACRC,QAAQ,IAAW,OAAD,6BAExBH,eAoDG","file":"29.08bf9f3c8b9be9d555f9.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport loadFonts from \"../helpers/dom/loadFonts\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n //return;\r\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n import('../lib/rootScope').then(m => {\r\n m.default.dispatchEvent('im_mount');\r\n });\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 blurActiveElement();\r\n return loadFonts().then(() => {\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(() => {\r\n // setTimeout(() => {\r\n const promise = import('../lib/appManagers/appDialogsManager');\r\n promise.finally(async() => {\r\n //alert('pageIm!');\r\n resolve();\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 // }, 5e3);\r\n });\r\n })\r\n });\r\n\r\n //let promise = /* Promise.resolve() */.then(() => {//import('../lib/services').then(services => {\r\n /* fetch('assets/img/camomile.jpg')\r\n .then(res => res.blob())\r\n .then(blob => {\r\n let img = new Image();\r\n let url = URL.createObjectURL(blob);\r\n img.src = url;\r\n img.onload = () => {\r\n let id = 'chat-background-canvas';\r\n var canvas = document.getElementById(id) as HTMLCanvasElement;\r\n //URL.revokeObjectURL(url);\r\n \r\n let elements = ['.chat-container'].map(selector => {\r\n return document.querySelector(selector) as HTMLDivElement;\r\n });\r\n \r\n stackBlurImage(img, id, 15, 0);\r\n \r\n canvas.toBlob(blob => {\r\n //let dataUrl = canvas.toDataURL('image/jpeg', 1);\r\n let dataUrl = URL.createObjectURL(blob);\r\n \r\n elements.forEach(el => {\r\n el.style.backgroundImage = 'url(' + dataUrl + ')';\r\n });\r\n }, 'image/jpeg', 1);\r\n };\r\n }); */\r\n //});\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/pages/pageIm.ts"],"names":["page","pushToState","_","then","m","default","dispatchEvent","requestedServerLanguage","getCacheLangPack","langPack","local","getLangPack","lang_code","Promise","resolve","window","requestAnimationFrame","finally"],"mappings":"wFAAA,iD,sSAyFA,MAAMA,EAAO,IAAI,IAAK,cAAc,EA7EjB,KAEjB,UAAgBC,YAAY,YAAa,CAACC,EAAG,sBAI7C,wCAA2BC,KAAKC,IAC9BA,EAAEC,QAAQC,cAAc,cAGtB,UAAKC,yBACP,UAAKC,mBAAmBL,KAAKM,IACxBA,EAASC,OACV,UAAKC,YAAYF,EAASG,aAKhC,cACO,cAAYT,KAAK,IACf,IAAIU,QAAeC,IACxBC,OAAOC,sBAAsB,KAET,mEACRC,QAAQ,IAAW,OAAD,6BAExBH,eAoDG","file":"29.e7945a7ebae7a3b06d65.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport loadFonts from \"../helpers/dom/loadFonts\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n //return;\r\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n import('../lib/rootScope').then(m => {\r\n m.default.dispatchEvent('im_mount');\r\n });\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 blurActiveElement();\r\n return loadFonts().then(() => {\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(() => {\r\n // setTimeout(() => {\r\n const promise = import('../lib/appManagers/appDialogsManager');\r\n promise.finally(async() => {\r\n //alert('pageIm!');\r\n resolve();\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 // }, 5e3);\r\n });\r\n })\r\n });\r\n\r\n //let promise = /* Promise.resolve() */.then(() => {//import('../lib/services').then(services => {\r\n /* fetch('assets/img/camomile.jpg')\r\n .then(res => res.blob())\r\n .then(blob => {\r\n let img = new Image();\r\n let url = URL.createObjectURL(blob);\r\n img.src = url;\r\n img.onload = () => {\r\n let id = 'chat-background-canvas';\r\n var canvas = document.getElementById(id) as HTMLCanvasElement;\r\n //URL.revokeObjectURL(url);\r\n \r\n let elements = ['.chat-container'].map(selector => {\r\n return document.querySelector(selector) as HTMLDivElement;\r\n });\r\n \r\n stackBlurImage(img, id, 15, 0);\r\n \r\n canvas.toBlob(blob => {\r\n //let dataUrl = canvas.toDataURL('image/jpeg', 1);\r\n let dataUrl = URL.createObjectURL(blob);\r\n \r\n elements.forEach(el => {\r\n el.style.backgroundImage = 'url(' + dataUrl + ')';\r\n });\r\n }, 'image/jpeg', 1);\r\n };\r\n }); */\r\n //});\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/3.bdf444277e969e63a4c3.chunk.js b/public/3.f3be892bf29dd69632d3.chunk.js similarity index 93% rename from public/3.bdf444277e969e63a4c3.chunk.js rename to public/3.f3be892bf29dd69632d3.chunk.js index 51f4b1c74..edf892a52 100644 --- a/public/3.bdf444277e969e63a4c3.chunk.js +++ b/public/3.f3be892bf29dd69632d3.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[3,25],{100:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(1);function s(t,e=!1){if(!n.IS_TOUCH_SUPPORTED||e&&document.activeElement===t)if(t.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var i=document.createRange();i.selectNodeContents(t),i.collapse(!1);var s=window.getSelection();s.removeAllRanges(),s.addRange(i)}else if(void 0!==document.body.createTextRange){var a=document.body.createTextRange();a.moveToElementText(t),a.collapse(!1),a.select()}}},106:function(t,e,i){"use strict";i.d(e,"a",(function(){return l}));var n=i(16);const s=new Map;let a=0;const o=(t,e,i="")=>{i=e.country_code+i,a=Math.max(a,i.length),s.set(i,{country:t,code:e})};function l(t){s.size||n.default.countriesList.forEach(t=>{t.country_codes.forEach(e=>{e.prefixes?e.prefixes.forEach(i=>{o(t,e,i)}):o(t,e)})});let e,i=t.replace(/\D/g,""),l=i.slice(0,a);for(let t=l.length-1;t>=0&&(e=s.get(l.slice(0,t+1)),!e);--t);if(!e)return{formatted:i,country:void 0,code:void 0,leftPattern:""};const r=e.country,c=e.code.patterns||[],h=i.slice(e.code.country_code.length);let u="",d=0,p="";for(let t=c.length-1;t>=0;--t){u=c[t];const e=u.replace(/ /g,"");let i=0;for(let t=0,n=Math.min(h.length,e.length);td&&(d=i,p=u)}u=p||u,u=u.replace(/\d/g,"X"),u=e.code.country_code+" "+u,u.split("").forEach((t,e)=>{" "===t&&" "!==i[e]&&i.length>e&&(i=i.slice(0,e)+" "+i.slice(e))});let f=u&&u.length>i.length?u.slice(i.length):"";return f&&(f=f.replace(/X/g,"‒")),{formatted:i,country:r,code:e.code,leftPattern:f}}},115:function(t,e,i){"use strict";i.d(e,"a",(function(){return r}));var n=i(76),s=i(86),a=function(t,e,i,n){return new(i||(i=Promise))((function(s,a){function o(t){try{r(n.next(t))}catch(t){a(t)}}function l(t){try{r(n.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?s(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,l)}r((n=n.apply(t,e||[])).next())}))};var o=new class{constructor(){this.blobSupported=!0;try{Object(s.a)([],"")}catch(t){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(t,e){return e instanceof Blob?Object(s.d)(e).then(e=>t.write(e)):t.write(e)}getFakeFileWriter(t,e){const i=[];return{write:t=>a(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;i.push(t)})),truncate:()=>{i.length=0},finalize:(n=!0)=>{const a=Object(s.a)(i,t);return n&&e&&e(a),a}}}},l=function(t,e,i,n){return new(i||(i=Promise))((function(s,a){function o(t){try{r(n.next(t))}catch(t){a(t)}}function l(t){try{r(n.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?s(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,l)}r((n=n.apply(t,e||[])).next())}))};class r{constructor(t){this.dbName=t,this.useStorage=!0,n.a.test&&(this.dbName+="_test"),r.STORAGES.length&&(this.useStorage=r.STORAGES[0].useStorage),this.openDatabase(),r.STORAGES.push(this)}openDatabase(){var t;return null!==(t=this.openDbPromise)&&void 0!==t?t:this.openDbPromise=caches.open(this.dbName)}delete(t){return this.timeoutOperation(e=>e.delete("/"+t))}deleteAll(){return caches.delete(this.dbName)}get(t){return this.timeoutOperation(e=>e.match("/"+t))}save(t,e){return this.timeoutOperation(i=>i.put("/"+t,e))}getFile(t,e="blob"){return this.get(t).then(t=>{if(!t)throw"NO_ENTRY_FOUND";return t[e]()})}saveFile(t,e){e instanceof Blob||(e=Object(s.a)(e));const i=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(t,i).then(()=>e)}timeoutOperation(t){return this.useStorage?new Promise((e,i)=>l(this,void 0,void 0,(function*(){let n=!1;const s=setTimeout(()=>{i(),n=!0},15e3);try{const i=yield this.openDatabase();if(!i)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield t(i);if(n)return;e(s)}catch(t){i(t)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(t,e){const i=o.getFakeFileWriter(e,e=>this.saveFile(t,e).catch(()=>e));return Promise.resolve(i)}static toggleStorage(t){return Promise.all(this.STORAGES.map(e=>{if(e.useStorage=t,!t)return e.deleteAll()}))}}r.STORAGES=[]},121:function(t,e,i){"use strict";i.d(e,"a",(function(){return l}));var n=i(100),s=i(106),a=i(0),o=i(38);class l extends o.b{constructor(t={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},t)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");let e=this.input;if(e instanceof HTMLInputElement)e.type="tel",e.autocomplete="rr55RandomRR55";else{e.inputMode="decimal";const t=window.devicePixelRatio;if(t>1){let i;a.IS_APPLE?i=-.16*t:a.IS_ANDROID&&(i=0),e.style.setProperty("--letter-spacing",i+"px")}const i=this.setValueSilently.bind(this);this.setValueSilently=t=>{i(t),Object(n.a)(this.input,!0)}}e.addEventListener("input",()=>{e.classList.remove("error");const i=this.value;let n;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,l,r,c="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(n=Object(s.a)(this.value),o=n.formatted,l=n.country,c=n.leftPattern,r=n.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),e.dataset.leftPattern=c,t.onInput&&t.onInput(n)}),e.addEventListener("paste",()=>{this.pasted=!0}),e.addEventListener("keypress",t=>{const e=t.key;if(/\D/.test(e)&&!t.metaKey&&!t.ctrlKey&&"Backspace"!==e&&("+"!==e||!t.shiftKey))return t.preventDefault(),!1})}}},36:function(t,e,i){"use strict";function n(t,e){if("string"==typeof e)return void(t.innerHTML=e);const i=t.firstChild;i?t.lastChild===i?i.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}i.d(e,"a",(function(){return n}))},38:function(t,e,i){"use strict";i.d(e,"a",(function(){return u}));var n=i(52),s=i(84),a=i(67),o=i(88);var l=i(16),r=i(31),c=i(57);let h=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;t.preventDefault();let e=(t.originalEvent||t).clipboardData.getData("text/plain"),i=r.b.parseEntities(e);i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),e=r.b.wrapRichText(e,{entities:i,noLinks:!0,wrappingDraft:!0}),window.document.execCommand("insertHTML",!1,e)}),h=null};var u;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(u||(u={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:i,showLengthOn:n,name:s,plainText:r}=t;let c,u,d=t.label||t.labelText;if(r)this.container.innerHTML=`\n \n `,c=this.container.firstElementChild;else{h&&h(),this.container.innerHTML='\n
\n ',c=this.container.firstElementChild;const e=new MutationObserver(()=>{u&&u()});c.addEventListener("input",()=>{Object(o.a)(c)&&(c.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=c.innerHTML,this.onFakeInput())}),e.observe(c,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(c.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=c.className+" input-field-input-fake")}if(c.setAttribute("dir","auto"),e&&(Object(l._i18n)(c,e,void 0,"placeholder"),this.inputFake&&Object(l._i18n)(this.inputFake,e,void 0,"placeholder")),d||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(d&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const t=this.container.lastElementChild;let e=!1;u=()=>{const s=c.classList.contains("error"),o=r?c.value.length:[...Object(a.a)(c,!1).value].length,l=i-o,h=l<0;c.classList.toggle("error",h),h||l<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!h||e)&&(this.setLabel(),e=!1)},c.addEventListener("input",u)}this.input=c}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const i=window.getSelection();i.removeAllRanges(),i.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(l.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===e)return;const n=Math.round(50*Math.log(Math.abs(e-i)));this.input.style.transitionDuration=n+"ms",t&&(this.input.style.height=e?e+"px":"");Object(c.a)(this.input,"is-changing-height",!0,n,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(n.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=r.b.wrapDraftText(t)),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(l.i18n)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&u.Error)),this.input.classList.toggle("valid",!!(t&u.Valid))}setError(t){this.setState(u.Error,t)}}},49:function(t,e,i){"use strict";i.d(e,"b",(function(){return c})),i.d(e,"a",(function(){return h}));var n=i(1),s=i(43),a=i(87),o=i(82),l=i(5);class r{constructor(t,e="",i=document.createElement("div")){this.el=t,this.container=i,this.onScrollMeasure=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.container.classList.add("scrollable"),this.log=Object(s.b)("SCROLL"+(e?"-"+e:""),s.a.Error),t&&(Array.from(t.children).forEach(t=>this.container.append(t)),t.append(this.container))}setListeners(){window.addEventListener("resize",this.onScroll,{passive:!0}),this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}),Object(o.a)(()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.needCheckAfterAnimation=!0,window.cancelAnimationFrame(this.onScrollMeasure))},()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})}append(t){this.container.append(t)}scrollIntoViewNew(t,e,i,n,s,o,l,r){return Object(a.b)(this.container,t,e,i,n,s,o,l,r)}}class c extends r{constructor(t,e="",i=300,n){super(t,e),this.onScrollOffset=i,this.onAdditionalScroll=null,this.onScrolledTop=null,this.onScrolledBottom=null,this.lastScrollTop=0,this.lastScrollDirection=0,this.loadedAll={top:!0,bottom:!1},this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=window.requestAnimationFrame(()=>{this.onScrollMeasure=0;const t=this.container.scrollTop;this.lastScrollDirection=this.lastScrollTop===t?0:this.lastScrollTop{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const t=this.container.scrollHeight;if(!t)return;const e=t-this.container.clientHeight,i=this.lastScrollTop;this.onScrolledTop&&i<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&e-i<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners()}setVirtualContainer(t){this.splitUp=t,this.log("setVirtualContainer:",t,this)}prepend(...t){(this.splitUp||this.padding||this.container).prepend(...t)}append(...t){(this.splitUp||this.padding||this.container).append(...t)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(t){this.container.scrollTop=t}get scrollTop(){return this.container.scrollTop}get scrollHeight(){return this.container.scrollHeight}}class h extends r{constructor(t,e="",i=300,s=15,a=document.createElement("div")){if(super(t,e,a),this.onScrollOffset=i,this.splitCount=s,this.container=a,this.container.classList.add("scrollable-x"),!n.IS_TOUCH_SUPPORTED){const t=t=>{!t.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=t.deltaY/4,Object(l.a)(t))};this.container.addEventListener("wheel",t,{passive:!1})}}}},53:function(t,e,i){"use strict";i.d(e,"a",(function(){return l}));var n=i(17),s=i(34),a=i(18),o=i(16);class l{constructor(t={}){const e=this.label=document.createElement("label");e.classList.add("checkbox-field"),t.restriction&&e.classList.add("checkbox-field-restriction"),t.round&&e.classList.add("checkbox-field-round"),t.disabled&&this.toggleDisability(!0);const i=this.input=document.createElement("input");let l;if(i.classList.add("checkbox-field-input"),i.type="checkbox",t.name&&(i.id="input-"+t.name),t.checked&&(i.checked=!0),t.stateKey&&n.default.getState().then(e=>{const a=Object(s.d)(e,t.stateKey);let o;o=t.stateValues?1===t.stateValues.indexOf(a):a,this.setValueSilently(o),i.addEventListener("change",()=>{let e;e=t.stateValues?t.stateValues[i.checked?1:0]:i.checked,n.default.setByKey(t.stateKey,e)})}),t.text?(l=this.span=document.createElement("span"),l.classList.add("checkbox-caption"),Object(o._i18n)(l,t.text,t.textArgs)):e.classList.add("checkbox-without-caption"),e.append(i),t.toggle){e.classList.add("checkbox-field-toggle");const t=document.createElement("div");t.classList.add("checkbox-toggle"),e.append(t)}else{const t=document.createElement("div");t.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 n=document.createElementNS("http://www.w3.org/2000/svg","use");n.setAttributeNS(null,"href","#check"),n.setAttributeNS(null,"x","-1"),i.append(n);const s=document.createElement("div");s.classList.add("checkbox-box-background");const a=document.createElement("div");a.classList.add("checkbox-box-border"),t.append(a,s,i),e.append(t)}l&&e.append(l),t.withRipple?(e.classList.add("checkbox-ripple","hover-effect"),Object(a.ripple)(e,void 0,void 0,!0)):t.withHover&&e.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(t){this.setValueSilently(t);const e=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(e)}setValueSilently(t){this.input.checked=t}toggleDisability(t){return this.label.classList.toggle("checkbox-disabled",t),()=>this.toggleDisability(!t)}}},57:function(t,e,i){"use strict";var n=i(15);const s=(t,e,i,a,o,l)=>{const{timeout:r,raf:c}=t.dataset;if(void 0!==r&&clearTimeout(+r),void 0!==c&&(window.cancelAnimationFrame(+c),l||delete t.dataset.raf),l&&n.default.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,i,a,o,l-1)}));i&&e&&t.classList.add(e);const h=()=>{delete t.dataset.timeout,!i&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),o&&o()};if(!n.default.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void h();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(h,a)};e.a=s},59:function(t,e,i){"use strict";function n(t,e){return e?t.forEach(t=>t.setAttribute("disabled","true")):t.forEach(t=>t.removeAttribute("disabled")),()=>n(t,!e)}i.d(e,"a",(function(){return n}))},61:function(t,e,i){"use strict";function n(t,e){return t.closest(e)}i.d(e,"a",(function(){return n}))},67:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(29),s=i(31),a=i(85);function o(t,e=!0){const i=[],n=[],o=e?[]:void 0;Object(a.a)(t,i,n,void 0,void 0,o),n.length&&i.push(n.join(""));let l=i.join("\n");return l=l.replace(/\u00A0/g," "),o&&s.b.combineSameEntities(o),{value:l,entities:o}}n.a.getRichValue=o},84:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},85:function(t,e,i){"use strict";i.d(e,"b",(function(){return n})),i.d(e,"a",(function(){return s}));const n={bold:{match:'[style*="font-weight"], b',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"}};function s(t,e,i,a,o,l,r={offset:0}){if(3===t.nodeType){const e=t.nodeValue;if(a===t?i.push(e.substr(0,o)+""+e.substr(o)):i.push(e),l&&e.trim()&&t.parentNode){const i=t.parentElement;for(const t in n){const s=n[t],a=i.closest(s.match+", [contenteditable]");a&&null===a.getAttribute("contenteditable")&&("messageEntityTextUrl"===s.entityName?l.push({_:s.entityName,url:i.href,offset:r.offset,length:e.length}):"messageEntityMentionName"===s.entityName?l.push({_:s.entityName,offset:r.offset,length:e.length,user_id:i.dataset.follow.toUserId()}):l.push({_:s.entityName,offset:r.offset,length:e.length}))}}return void(r.offset+=e.length)}if(1!==t.nodeType)return;const c=a===t,h="DIV"===t.tagName||"P"===t.tagName;if(h&&i.length||"BR"===t.tagName)e.push(i.join("")),i.splice(0,i.length);else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),r.offset+=e.length)}c&&!o&&i.push("");let u=t.firstChild;for(;u;)s(u,e,i,a,o,l,r),u=u.nextSibling;c&&o&&i.push(""),h&&i.length&&(e.push(i.join("")),i.splice(0,i.length))}},88:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(67);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(n.a)(t,!1).value.trim():!t.value.trim()}}}]); -//# sourceMappingURL=3.bdf444277e969e63a4c3.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[3,25],{100:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(1);function s(t,e=!1){if(!n.IS_TOUCH_SUPPORTED||e&&document.activeElement===t)if(t.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var i=document.createRange();i.selectNodeContents(t),i.collapse(!1);var s=window.getSelection();s.removeAllRanges(),s.addRange(i)}else if(void 0!==document.body.createTextRange){var a=document.body.createTextRange();a.moveToElementText(t),a.collapse(!1),a.select()}}},107:function(t,e,i){"use strict";i.d(e,"a",(function(){return l}));var n=i(16);const s=new Map;let a=0;const o=(t,e,i="")=>{i=e.country_code+i,a=Math.max(a,i.length),s.set(i,{country:t,code:e})};function l(t){s.size||n.default.countriesList.forEach(t=>{t.country_codes.forEach(e=>{e.prefixes?e.prefixes.forEach(i=>{o(t,e,i)}):o(t,e)})});let e,i=t.replace(/\D/g,""),l=i.slice(0,a);for(let t=l.length-1;t>=0&&(e=s.get(l.slice(0,t+1)),!e);--t);if(!e)return{formatted:i,country:void 0,code:void 0,leftPattern:""};const r=e.country,c=e.code.patterns||[],h=i.slice(e.code.country_code.length);let u="",d=0,p="";for(let t=c.length-1;t>=0;--t){u=c[t];const e=u.replace(/ /g,"");let i=0;for(let t=0,n=Math.min(h.length,e.length);td&&(d=i,p=u)}u=p||u,u=u.replace(/\d/g,"X"),u=e.code.country_code+" "+u,u.split("").forEach((t,e)=>{" "===t&&" "!==i[e]&&i.length>e&&(i=i.slice(0,e)+" "+i.slice(e))});let f=u&&u.length>i.length?u.slice(i.length):"";return f&&(f=f.replace(/X/g,"‒")),{formatted:i,country:r,code:e.code,leftPattern:f}}},119:function(t,e,i){"use strict";i.d(e,"a",(function(){return r}));var n=i(77),s=i(88),a=function(t,e,i,n){return new(i||(i=Promise))((function(s,a){function o(t){try{r(n.next(t))}catch(t){a(t)}}function l(t){try{r(n.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?s(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,l)}r((n=n.apply(t,e||[])).next())}))};var o=new class{constructor(){this.blobSupported=!0;try{Object(s.a)([],"")}catch(t){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(t,e){return e instanceof Blob?Object(s.d)(e).then(e=>t.write(e)):t.write(e)}getFakeFileWriter(t,e){const i=[];return{write:t=>a(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;i.push(t)})),truncate:()=>{i.length=0},finalize:(n=!0)=>{const a=Object(s.a)(i,t);return n&&e&&e(a),a}}}},l=function(t,e,i,n){return new(i||(i=Promise))((function(s,a){function o(t){try{r(n.next(t))}catch(t){a(t)}}function l(t){try{r(n.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?s(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,l)}r((n=n.apply(t,e||[])).next())}))};class r{constructor(t){this.dbName=t,this.useStorage=!0,n.a.test&&(this.dbName+="_test"),r.STORAGES.length&&(this.useStorage=r.STORAGES[0].useStorage),this.openDatabase(),r.STORAGES.push(this)}openDatabase(){var t;return null!==(t=this.openDbPromise)&&void 0!==t?t:this.openDbPromise=caches.open(this.dbName)}delete(t){return this.timeoutOperation(e=>e.delete("/"+t))}deleteAll(){return caches.delete(this.dbName)}get(t){return this.timeoutOperation(e=>e.match("/"+t))}save(t,e){return this.timeoutOperation(i=>i.put("/"+t,e))}getFile(t,e="blob"){return this.get(t).then(t=>{if(!t)throw"NO_ENTRY_FOUND";return t[e]()})}saveFile(t,e){e instanceof Blob||(e=Object(s.a)(e));const i=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(t,i).then(()=>e)}timeoutOperation(t){return this.useStorage?new Promise((e,i)=>l(this,void 0,void 0,(function*(){let n=!1;const s=setTimeout(()=>{i(),n=!0},15e3);try{const i=yield this.openDatabase();if(!i)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield t(i);if(n)return;e(s)}catch(t){i(t)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(t,e){const i=o.getFakeFileWriter(e,e=>this.saveFile(t,e).catch(()=>e));return Promise.resolve(i)}static toggleStorage(t){return Promise.all(this.STORAGES.map(e=>{if(e.useStorage=t,!t)return e.deleteAll()}))}}r.STORAGES=[]},125:function(t,e,i){"use strict";i.d(e,"a",(function(){return l}));var n=i(100),s=i(107),a=i(0),o=i(38);class l extends o.b{constructor(t={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},t)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");let e=this.input;if(e instanceof HTMLInputElement)e.type="tel",e.autocomplete="rr55RandomRR55";else{e.inputMode="decimal";const t=window.devicePixelRatio;if(t>1){let i;a.IS_APPLE?i=-.16*t:a.IS_ANDROID&&(i=0),e.style.setProperty("--letter-spacing",i+"px")}const i=this.setValueSilently.bind(this);this.setValueSilently=t=>{i(t),Object(n.a)(this.input,!0)}}e.addEventListener("input",()=>{e.classList.remove("error");const i=this.value;let n;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,l,r,c="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(n=Object(s.a)(this.value),o=n.formatted,l=n.country,c=n.leftPattern,r=n.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),e.dataset.leftPattern=c,t.onInput&&t.onInput(n)}),e.addEventListener("paste",()=>{this.pasted=!0}),e.addEventListener("keypress",t=>{const e=t.key;if(/\D/.test(e)&&!t.metaKey&&!t.ctrlKey&&"Backspace"!==e&&("+"!==e||!t.shiftKey))return t.preventDefault(),!1})}}},36:function(t,e,i){"use strict";function n(t,e){if("string"==typeof e)return void(t.innerHTML=e);const i=t.firstChild;i?t.lastChild===i?i.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}i.d(e,"a",(function(){return n}))},38:function(t,e,i){"use strict";i.d(e,"a",(function(){return u}));var n=i(52),s=i(85),a=i(69),o=i(90);var l=i(16),r=i(31),c=i(57);let h=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;t.preventDefault();let e=(t.originalEvent||t).clipboardData.getData("text/plain"),i=r.b.parseEntities(e);i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),e=r.b.wrapRichText(e,{entities:i,noLinks:!0,wrappingDraft:!0}),window.document.execCommand("insertHTML",!1,e)}),h=null};var u;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(u||(u={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:i,showLengthOn:n,name:s,plainText:r}=t;let c,u,d=t.label||t.labelText;if(r)this.container.innerHTML=`\n \n `,c=this.container.firstElementChild;else{h&&h(),this.container.innerHTML='\n
\n ',c=this.container.firstElementChild;const e=new MutationObserver(()=>{u&&u()});c.addEventListener("input",()=>{Object(o.a)(c)&&(c.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=c.innerHTML,this.onFakeInput())}),e.observe(c,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(c.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=c.className+" input-field-input-fake")}if(c.setAttribute("dir","auto"),e&&(Object(l._i18n)(c,e,void 0,"placeholder"),this.inputFake&&Object(l._i18n)(this.inputFake,e,void 0,"placeholder")),d||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(d&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const t=this.container.lastElementChild;let e=!1;u=()=>{const s=c.classList.contains("error"),o=r?c.value.length:[...Object(a.a)(c,!1).value].length,l=i-o,h=l<0;c.classList.toggle("error",h),h||l<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!h||e)&&(this.setLabel(),e=!1)},c.addEventListener("input",u)}this.input=c}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const i=window.getSelection();i.removeAllRanges(),i.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(l.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===e)return;const n=Math.round(50*Math.log(Math.abs(e-i)));this.input.style.transitionDuration=n+"ms",t&&(this.input.style.height=e?e+"px":"");Object(c.a)(this.input,"is-changing-height",!0,n,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(n.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=r.b.wrapDraftText(t)),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(l.i18n)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&u.Error)),this.input.classList.toggle("valid",!!(t&u.Valid))}setError(t){this.setState(u.Error,t)}}},47:function(t,e,i){"use strict";i.d(e,"b",(function(){return c})),i.d(e,"a",(function(){return h}));var n=i(1),s=i(43),a=i(89),o=i(83),l=i(5);class r{constructor(t,e="",i=document.createElement("div")){this.el=t,this.container=i,this.onScrollMeasure=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.container.classList.add("scrollable"),this.log=Object(s.b)("SCROLL"+(e?"-"+e:""),s.a.Error),t&&(Array.from(t.children).forEach(t=>this.container.append(t)),t.append(this.container))}setListeners(){window.addEventListener("resize",this.onScroll,{passive:!0}),this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}),Object(o.a)(()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.needCheckAfterAnimation=!0,window.cancelAnimationFrame(this.onScrollMeasure))},()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})}append(t){this.container.append(t)}scrollIntoViewNew(t,e,i,n,s,o,l,r){return Object(a.b)(this.container,t,e,i,n,s,o,l,r)}}class c extends r{constructor(t,e="",i=300,n){super(t,e),this.onScrollOffset=i,this.onAdditionalScroll=null,this.onScrolledTop=null,this.onScrolledBottom=null,this.lastScrollTop=0,this.lastScrollDirection=0,this.loadedAll={top:!0,bottom:!1},this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=window.requestAnimationFrame(()=>{this.onScrollMeasure=0;const t=this.container.scrollTop;this.lastScrollDirection=this.lastScrollTop===t?0:this.lastScrollTop{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const t=this.container.scrollHeight;if(!t)return;const e=t-this.container.clientHeight,i=this.lastScrollTop;this.onScrolledTop&&i<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&e-i<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners()}setVirtualContainer(t){this.splitUp=t,this.log("setVirtualContainer:",t,this)}prepend(...t){(this.splitUp||this.padding||this.container).prepend(...t)}append(...t){(this.splitUp||this.padding||this.container).append(...t)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(t){this.container.scrollTop=t}get scrollTop(){return this.container.scrollTop}get scrollHeight(){return this.container.scrollHeight}}class h extends r{constructor(t,e="",i=300,s=15,a=document.createElement("div")){if(super(t,e,a),this.onScrollOffset=i,this.splitCount=s,this.container=a,this.container.classList.add("scrollable-x"),!n.IS_TOUCH_SUPPORTED){const t=t=>{!t.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=t.deltaY/4,Object(l.a)(t))};this.container.addEventListener("wheel",t,{passive:!1})}}}},55:function(t,e,i){"use strict";i.d(e,"a",(function(){return l}));var n=i(17),s=i(32),a=i(18),o=i(16);class l{constructor(t={}){const e=this.label=document.createElement("label");e.classList.add("checkbox-field"),t.restriction&&e.classList.add("checkbox-field-restriction"),t.round&&e.classList.add("checkbox-field-round"),t.disabled&&this.toggleDisability(!0);const i=this.input=document.createElement("input");let l;if(i.classList.add("checkbox-field-input"),i.type="checkbox",t.name&&(i.id="input-"+t.name),t.checked&&(i.checked=!0),t.stateKey&&n.default.getState().then(e=>{const a=Object(s.d)(e,t.stateKey);let o;o=t.stateValues?1===t.stateValues.indexOf(a):a,this.setValueSilently(o),i.addEventListener("change",()=>{let e;e=t.stateValues?t.stateValues[i.checked?1:0]:i.checked,n.default.setByKey(t.stateKey,e)})}),t.text?(l=this.span=document.createElement("span"),l.classList.add("checkbox-caption"),Object(o._i18n)(l,t.text,t.textArgs)):e.classList.add("checkbox-without-caption"),e.append(i),t.toggle){e.classList.add("checkbox-field-toggle");const t=document.createElement("div");t.classList.add("checkbox-toggle"),e.append(t)}else{const t=document.createElement("div");t.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 n=document.createElementNS("http://www.w3.org/2000/svg","use");n.setAttributeNS(null,"href","#check"),n.setAttributeNS(null,"x","-1"),i.append(n);const s=document.createElement("div");s.classList.add("checkbox-box-background");const a=document.createElement("div");a.classList.add("checkbox-box-border"),t.append(a,s,i),e.append(t)}l&&e.append(l),t.withRipple?(e.classList.add("checkbox-ripple","hover-effect"),Object(a.ripple)(e,void 0,void 0,!0)):t.withHover&&e.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(t){this.setValueSilently(t);const e=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(e)}setValueSilently(t){this.input.checked=t}toggleDisability(t){return this.label.classList.toggle("checkbox-disabled",t),()=>this.toggleDisability(!t)}}},57:function(t,e,i){"use strict";var n=i(15);const s=(t,e,i,a,o,l)=>{const{timeout:r,raf:c}=t.dataset;if(void 0!==r&&clearTimeout(+r),void 0!==c&&(window.cancelAnimationFrame(+c),l||delete t.dataset.raf),l&&n.default.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,i,a,o,l-1)}));i&&e&&t.classList.add(e);const h=()=>{delete t.dataset.timeout,!i&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),o&&o()};if(!n.default.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void h();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(h,a)};e.a=s},58:function(t,e,i){"use strict";function n(t,e){return e?t.forEach(t=>t.setAttribute("disabled","true")):t.forEach(t=>t.removeAttribute("disabled")),()=>n(t,!e)}i.d(e,"a",(function(){return n}))},63:function(t,e,i){"use strict";function n(t,e){return t.closest(e)}i.d(e,"a",(function(){return n}))},69:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(29),s=i(31),a=i(86);function o(t,e=!0){const i=[],n=[],o=e?[]:void 0;Object(a.a)(t,i,n,void 0,void 0,o),n.length&&i.push(n.join(""));let l=i.join("\n");return l=l.replace(/\u00A0/g," "),o&&s.b.combineSameEntities(o),{value:l,entities:o}}n.a.getRichValue=o},85:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},86:function(t,e,i){"use strict";i.d(e,"b",(function(){return n})),i.d(e,"a",(function(){return s}));const n={bold:{match:'[style*="font-weight"], b',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"}};function s(t,e,i,a,o,l,r={offset:0}){if(3===t.nodeType){const e=t.nodeValue;if(a===t?i.push(e.substr(0,o)+""+e.substr(o)):i.push(e),l&&e.trim()&&t.parentNode){const i=t.parentElement;for(const t in n){const s=n[t],a=i.closest(s.match+", [contenteditable]");a&&null===a.getAttribute("contenteditable")&&("messageEntityTextUrl"===s.entityName?l.push({_:s.entityName,url:i.href,offset:r.offset,length:e.length}):"messageEntityMentionName"===s.entityName?l.push({_:s.entityName,offset:r.offset,length:e.length,user_id:i.dataset.follow.toUserId()}):l.push({_:s.entityName,offset:r.offset,length:e.length}))}}return void(r.offset+=e.length)}if(1!==t.nodeType)return;const c=a===t,h="DIV"===t.tagName||"P"===t.tagName;if(h&&i.length||"BR"===t.tagName)e.push(i.join("")),i.splice(0,i.length);else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),r.offset+=e.length)}c&&!o&&i.push("");let u=t.firstChild;for(;u;)s(u,e,i,a,o,l,r),u=u.nextSibling;c&&o&&i.push(""),h&&i.length&&(e.push(i.join("")),i.splice(0,i.length))}},90:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(69);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(n.a)(t,!1).value.trim():!t.value.trim()}}}]); +//# sourceMappingURL=3.f3be892bf29dd69632d3.chunk.js.map \ No newline at end of file diff --git a/public/3.bdf444277e969e63a4c3.chunk.js.map b/public/3.f3be892bf29dd69632d3.chunk.js.map similarity index 99% rename from public/3.bdf444277e969e63a4c3.chunk.js.map rename to public/3.f3be892bf29dd69632d3.chunk.js.map index 02b36c755..61a4423f8 100644 --- a/public/3.bdf444277e969e63a4c3.chunk.js.map +++ b/public/3.f3be892bf29dd69632d3.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/formatPhoneNumber.ts","webpack:///./src/lib/filemanager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/findUpTag.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts"],"names":["placeCaretAtEnd","el","ignoreTouchCheck","document","activeElement","focus","window","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","body","createTextRange","textRange","moveToElementText","select","prefixes","Map","maxPrefixLength","setPrefix","country","code","prefix","country_code","Math","max","length","set","formatPhoneNumber","originalStr","size","countriesList","forEach","country_codes","prefixCountry","str","replace","phoneCode","slice","i","get","formatted","undefined","leftPattern","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","min","split","symbol","idx","blobSupported","e","this","fileWriter","bytes","Blob","then","arr","write","mimeType","saveFileCallback","blobParts","part","push","truncate","finalize","saveToStorage","blob","dbName","useStorage","test","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","match","response","put","fileName","method","Response","headers","save","callback","Promise","resolve","reject","rejected","timeout","setTimeout","res","err","clearTimeout","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","all","map","storage","deleteAll","TelInputField","options","super","label","name","pasted","lastValue","container","classList","add","telEl","input","HTMLInputElement","type","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","addEventListener","remove","formattedPhoneNumber","abs","setLabel","countryCode","dataset","onInput","key","metaKey","ctrlKey","shiftKey","preventDefault","replaceContent","elem","node","innerHTML","firstChild","lastChild","replaceWith","textContent","append","init","findUpAttribute","target","text","originalEvent","clipboardData","getData","entities","parseEntities","filter","_","wrapRichText","noLinks","wrappingDraft","execCommand","InputState","createElement","required","validate","maxLength","showLengthOn","round","placeholder","plainText","processInput","labelText","firstElementChild","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","setAttribute","className","border","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","getRichValue","diff","isError","toggle","selectElementContents","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","height","transitionDuration","log","fireFakeInput","originalValue","isValid","isChanged","silent","wrapDraftText","setDraftValue","state","Error","Valid","setState","ScrollableBase","logPrefix","onScrollMeasure","isHeavyAnimationInProgress","needCheckAfterAnimation","Array","from","children","c","onScroll","passive","capture","cancelAnimationFrame","element","position","margin","maxDistance","forceDirection","forceDuration","axis","getNormalSize","Scrollable","onScrollOffset","withPaddingContainer","onAdditionalScroll","onScrolledTop","onScrolledBottom","lastScrollTop","lastScrollDirection","loadedAll","top","bottom","splitUp","requestAnimationFrame","scrollTop","checkForTriggers","maxScrollTop","clientHeight","setListeners","elements","padding","prepend","offsetHeight","getDistanceToEnd","y","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","CheckboxField","restriction","disabled","toggleDisability","span","id","checked","stateKey","getState","stateValue","stateValues","indexOf","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","withRipple","withHover","event","Event","bubbles","cancelable","dispatchEvent","disable","SetTransition","forwards","duration","onTransitionEnd","useRafs","raf","settings","animationsEnabled","afterTimeout","removeAttribute","findUpTag","tag","closest","field","withEntities","lines","line","join","combineSameEntities","attribute","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","getRichElementValue","selNode","selOffset","offset","nodeType","nodeValue","substr","trim","parentNode","parentElement","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","tagName","splice","HTMLImageElement","alt","curChild","nextSibling","hasAttribute"],"mappings":"yFAAA,6CAae,SAASA,EAAgBC,EAAiBC,GAAmB,GAC1E,IAAG,sBAAwBA,GAAoBC,SAASC,gBAAkBH,EAK1E,GADAA,EAAGI,aAC+B,IAAxBC,OAAOC,mBAAgE,IAAzBJ,SAASK,YAA6B,CAC5F,IAAIC,EAAQN,SAASK,cACrBC,EAAMC,mBAAmBT,GACzBQ,EAAME,UAAS,GACf,IAAIC,EAAMN,OAAOC,eACjBK,EAAIC,kBACJD,EAAIE,SAASL,QAER,QAA4C,IAAlCN,SAASY,KAAKC,gBAAiC,CAE9D,IAAIC,EAAYd,SAASY,KAAKC,kBAC9BC,EAAUC,kBAAkBjB,GAC5BgB,EAAUN,UAAS,GACnBM,EAAUE,Y,iCChCd,8CAWA,MAAMC,EAAuC,IAAIC,IACjD,IAAIC,EAAkB,EACtB,MAAMC,EAAY,CAACC,EAAsBC,EAAuBC,EAAiB,MAC/EA,EAASD,EAAKE,aAAeD,EAI7BJ,EAAkBM,KAAKC,IAAIP,EAAiBI,EAAOI,QACnDV,EAASW,IAAIL,EAAQ,CAACF,UAASC,UAG1B,SAASO,EAAkBC,GAM5Bb,EAASc,MACX,UAAKC,cAAcC,QAAQZ,IACzBA,EAAQa,cAAcD,QAAQX,IAGzBA,EAAKL,SACNK,EAAKL,SAASgB,QAAQV,IACpBH,EAAUC,EAASC,EAAMC,KAG3BH,EAAUC,EAASC,OAO3B,IAYIa,EAZAC,EAAMN,EAAYO,QAAQ,MAAO,IACjCC,EAAYF,EAAIG,MAAM,EAAGpB,GAY7B,IAAI,IAAIqB,EAAIF,EAAUX,OAAS,EAAGa,GAAK,IACrCL,EAAgBlB,EAASwB,IAAIH,EAAUC,MAAM,EAAGC,EAAI,KACjDL,KAFuCK,GAO5C,IAAIL,EACF,MAAO,CACLO,UAAWN,EACXf,aAASsB,EACTrB,UAAMqB,EACNC,YAAa,IAKjB,MAAMvB,EAAUc,EAAcd,QAExBwB,EAAWV,EAAcb,KAAKuB,UAAY,GAC1CC,EAAmBV,EAAIG,MAAMJ,EAAcb,KAAKE,aAAaG,QACnE,IAAIoB,EAAU,GAAIC,EAA4B,EAAGC,EAAqB,GACtE,IAAI,IAAIT,EAAIK,EAASlB,OAAS,EAAGa,GAAK,IAAKA,EAAG,CAC5CO,EAAUF,EAASL,GAEnB,MAAMU,EAAWH,EAAQV,QAAQ,KAAM,IACvC,IAAIc,EAAiB,EACrB,IAAI,IAAIC,EAAI,EAAGzB,EAASF,KAAK4B,IAAIP,EAAiBnB,OAAQuB,EAASvB,QAASyB,EAAIzB,IAAUyB,EAAG,CAC3F,GAAGN,EAAiBM,KAAOF,EAASE,IAAsB,MAAhBF,EAASE,GAE5C,CACLD,EAAiB,EACjB,QAHEA,EAOHA,EAAiBH,IAClBA,EAA4BG,EAC5BF,EAAqBF,GAIzBA,EAAUE,GAAsBF,EAChCA,EAAUA,EAAQV,QAAQ,MAAO,KAEjCU,EAAUZ,EAAcb,KAAKE,aAAe,IAAMuB,EAElDA,EAAQO,MAAM,IAAIrB,QAAQ,CAACsB,EAAQC,KACnB,MAAXD,GAA+B,MAAbnB,EAAIoB,IAAgBpB,EAAIT,OAAS6B,IACpDpB,EAAMA,EAAIG,MAAM,EAAGiB,GAAO,IAAMpB,EAAIG,MAAMiB,MAQ9C,IAAIZ,EAAcG,GAAWA,EAAQpB,OAASS,EAAIT,OAASoB,EAAQR,MAAMH,EAAIT,QAAU,GAQvF,OAPGiB,IAGDA,EAAcA,EAAYP,QAAQ,KAAM,MAInC,CAACK,UAAWN,EAAKf,UAASC,KAAMa,EAAcb,KAAMsB,iB,6XCzD9C,UArDR,MAGL,cAFO,KAAAa,eAAgB,EAGrB,IACE,YAAc,GAAI,IAClB,MAAMC,GACNC,KAAKF,eAAgB,GAIlB,cACL,OAAOE,KAAKF,cAGP,MAAMG,EAA0DC,GACrE,OAAGA,aAAiBC,KACX,YAAqBD,GAAOE,KAAKC,GAC/BJ,EAAWK,MAAMD,IAGnBJ,EAAWK,MAAMJ,GAIrB,kBAAkBK,EAAkBC,GACzC,MAAMC,EAAwC,GAuB9C,MAtBuB,CACrBH,MAAaI,GAA8B,EAAD,gCACxC,IAAIV,KAAKF,cACP,MAAM,EAGRW,EAAUE,KAAKD,MAEjBE,SAAU,KACRH,EAAUzC,OAAS,GAErB6C,SAAU,CAACC,GAAgB,KACzB,MAAMC,EAAO,YAAcN,EAAWF,GAMtC,OAJGO,GAAiBN,GAClBA,EAAiBO,GAGZA,M,sSC5CA,MAAM,EAQnB,YAAoBC,GAAA,KAAAA,SAJZ,KAAAC,YAAa,EAKhB,IAAMC,OACPlB,KAAKgB,QAAU,SAGd,EAAuBG,SAASnD,SACjCgC,KAAKiB,WAAa,EAAuBE,SAAS,GAAGF,YAGvDjB,KAAKoB,eACL,EAAuBD,SAASR,KAAKX,MAG/B,e,MACN,OAAyB,QAAlB,EAAAA,KAAKqB,qBAAa,QAAKrB,KAAKqB,cAAgBC,OAAOC,KAAKvB,KAAKgB,QAG/D,OAAOQ,GACZ,OAAOxB,KAAKyB,iBAAkBC,GAAUA,EAAMC,OAAO,IAAMH,IAGtD,YACL,OAAOF,OAAOK,OAAO3B,KAAKgB,QAGrB,IAAIQ,GACT,OAAOxB,KAAKyB,iBAAkBC,GAAUA,EAAME,MAAM,IAAMJ,IAGrD,KAAKA,EAAmBK,GAE7B,OAAO7B,KAAKyB,iBAAkBC,GAAUA,EAAMI,IAAI,IAAMN,EAAWK,IAG9D,QAAQE,EAAkBC,EAAmC,QAOlE,OAAOhC,KAAKlB,IAAIiD,GAAU3B,KAAMyB,IAC9B,IAAIA,EAEF,KAAM,iBAOR,OAJgBA,EAASG,OAQtB,SAASD,EAAkBhB,GAE3BA,aAAgBZ,OACnBY,EAAO,YAAcA,IAGvB,MAAMc,EAAW,IAAII,SAASlB,EAAM,CAClCmB,QAAS,CACP,iBAAkB,GAAKnB,EAAK3C,QAIhC,OAAO4B,KAAKmC,KAAKJ,EAAUF,GAAUzB,KAAK,IAAMW,GAG3C,iBAAoBqB,GACzB,OAAIpC,KAAKiB,WAIF,IAAIoB,QAAW,CAAMC,EAASC,IAAW,kCAC9C,IAAIC,GAAW,EACf,MAAMC,EAAUC,WAAW,KACzBH,IAEAC,GAAW,GACV,MAEH,IACE,MAAMd,QAAc1B,KAAKoB,eACzB,IAAIM,EAGF,MAFA1B,KAAKiB,YAAa,EAClBjB,KAAKqB,mBAAgBrC,EACf,YAGR,MAAM2D,QAAYP,EAASV,GAE3B,GAAGc,EAAU,OACbF,EAAQK,GACR,MAAMC,GACNL,EAAOK,GAGTC,aAAaJ,OA3BNJ,QAAQE,OAAO,mBA+BnB,cAAcR,EAAkBxB,GACrC,MAAMuC,EAAa,EAAYC,kBAAkBxC,EAAWQ,GACnDf,KAAKgD,SAASjB,EAAUhB,GAAMkC,MAAM,IAAMlC,IAGnD,OAAOsB,QAAQC,QAAQQ,GAGlB,qBAAqBI,GAC1B,OAAOb,QAAQc,IAAInD,KAAKmB,SAASiC,IAAIC,IAGnC,GAFAA,EAAQpC,WAAaiC,GAEjBA,EACF,OAAOG,EAAQC,gBA3HN,EAAAnC,SAAqC,I,iCCftD,uEAYe,MAAMoC,UAAsB,IAIzC,YAAYC,EAER,IACFC,MAAM,OAAD,QACHC,MAAO,mCAEPC,KAAM,SACHH,IAVC,KAAAI,QAAS,EACV,KAAAC,UAAY,GAYjB7D,KAAK8D,UAAUC,UAAUC,IAAI,qBAE7B,IAAIC,EAAQjE,KAAKkE,MACjB,GAAGD,aAAiBE,iBAClBF,EAAMG,KAAO,MACbH,EAAMI,aAAe,qBAChB,CACLJ,EAAMK,UAAY,UAElB,MAAMC,EAAa/H,OAAOgI,iBAC1B,GAAGD,EAAa,EAAG,CACjB,IAAIE,EACD,WACDA,GAA8B,IAAdF,EACR,eACRE,EAAgB,GAGlBR,EAAMS,MAAMC,YAAY,mBAAoBF,EAAgB,MAG9D,MAAMG,EAAe5E,KAAK6E,iBAAiBC,KAAK9E,MAChDA,KAAK6E,iBAAoBE,IACvBH,EAAaG,GACb,YAAgB/E,KAAKkE,OAAO,IAIhCD,EAAMe,iBAAiB,QAAS,KAE9Bf,EAAMF,UAAUkB,OAAO,SAEvB,MAAMF,EAAQ/E,KAAK+E,MAUnB,IAAIG,EATSpH,KAAKqH,IAAIJ,EAAM/G,OAASgC,KAAK6D,UAAU7F,QAC1C,IAAMgC,KAAK4D,QAAU,mBAC7B5D,KAAK6E,iBAAiB7E,KAAK6D,UAAYkB,GAGzC/E,KAAK4D,QAAS,EAEd5D,KAAKoF,WAGL,IAAIrG,EAAmBrB,EAAsB2H,EAA8BpG,EAAc,GACnD,MAAnCe,KAAK+E,MAAMrG,QAAQ,MAAO,KAC3BsB,KAAK6E,iBAAiB,MAEtBK,EAAuB,YAAkBlF,KAAK+E,OAC9ChG,EAAYmG,EAAqBnG,UACjCrB,EAAUwH,EAAqBxH,QAC/BuB,EAAciG,EAAqBjG,YACnCoG,EAAcH,EAAqBvH,KACnCqC,KAAK6E,iBAAiB7E,KAAK6D,UAAY9E,EAAY,IAAMA,EAAY,KAGvEkF,EAAMqB,QAAQrG,YAAcA,EAI5BuE,EAAQ+B,SAAW/B,EAAQ+B,QAAQL,KAGrCjB,EAAMe,iBAAiB,QAAS,KAC9BhF,KAAK4D,QAAS,IAQhBK,EAAMe,iBAAiB,WAAajF,IAElC,MAAMyF,EAAMzF,EAAEyF,IACd,GAAG,KAAKtE,KAAKsE,KAAUzF,EAAE0F,UAAW1F,EAAE2F,SAAoB,cAARF,IAAiC,MAARA,IAAezF,EAAE4F,UAE1F,OADA5F,EAAE6F,kBACK,O,gCChGA,SAASC,EAAeC,EAAmBC,GACxD,GAAoB,iBAAX,EAEP,YADAD,EAAKE,UAAYD,GAKnB,MAAME,EAAaH,EAAKG,WACrBA,EACEH,EAAKI,YAAcD,EACpBA,EAAWE,YAAYJ,IAEvBD,EAAKM,YAAc,GACnBN,EAAKO,OAAON,IAGdD,EAAKO,OAAON,GAtBhB,mC,kICeA,IAAIO,EAAO,KACTjK,SAAS2I,iBAAiB,QAAUjF,IAClC,IAAI,OAAAwG,EAAA,GAAgBxG,EAAEyG,OAAQ,0BAC5B,OAMFzG,EAAE6F,iBAEF,IAAIa,GAAQ1G,EAAE2G,eAAiB3G,GAAG4G,cAAcC,QAAQ,cAEpDC,EAAW,IAAkBC,cAAcL,GAE/CI,EAAWA,EAASE,OAAOhH,GAAa,uBAARA,EAAEiH,GAAsC,2BAARjH,EAAEiH,GAElEP,EAAO,IAAkBQ,aAAaR,EAAM,CAACI,WAAUK,SAAS,EAAMC,eAAe,IASrF3K,OAAOH,SAAS+K,YAAY,cAAc,EAAOX,KAGnDH,EAAO,MAoBT,IAAYe,GAAZ,SAAYA,GACV,yBACA,qBACA,qBAHF,CAAYA,MAAU,KAsRP,IAlQf,MAeE,YAAmB7D,EAA6B,IAA7B,KAAAA,UACjBxD,KAAK8D,UAAYzH,SAASiL,cAAc,OACxCtH,KAAK8D,UAAUC,UAAUC,IAAI,eAE7BhE,KAAKuH,SAAW/D,EAAQ+D,SACxBvH,KAAKwH,SAAWhE,EAAQgE,cAECxI,IAAtBwE,EAAQiE,gBAAoDzI,IAAzBwE,EAAQkE,eAC5ClE,EAAQkE,aAAe5J,KAAK4B,IAAI,GAAI5B,KAAK6J,MAAMnE,EAAQiE,UAAY,KAGrE,MAAM,YAACG,EAAW,UAAEH,EAAS,aAAEC,EAAY,KAAE/D,EAAI,UAAEkE,GAAarE,EAEhE,IAEIU,EAyEA4D,EA3EApE,EAAQF,EAAQE,OAASF,EAAQuE,UAGrC,GAAIF,EA0CF7H,KAAK8D,UAAUkC,UAAY,8BACNrC,EAAO,SAASA,KAAU,yBAAyBD,EAAQ,cAAgB,wCAGhGQ,EAAQlE,KAAK8D,UAAUkE,sBA9CV,CACV1B,GACDA,IAGFtG,KAAK8D,UAAUkC,UAAY,+EAI3B9B,EAAQlE,KAAK8D,UAAUkE,kBACvB,MAAMC,EAAW,IAAIC,iBAAiB,KAGjCJ,GACDA,MAKJ5D,EAAMc,iBAAiB,QAAS,KAC3B,OAAAmD,EAAA,GAAajE,KACdA,EAAM8B,UAAY,IAGjBhG,KAAKoI,YACNpI,KAAKoI,UAAUpC,UAAY9B,EAAM8B,UACjChG,KAAKqI,iBAKTJ,EAASK,QAAQpE,EAAO,CAACqE,eAAe,EAAMC,WAAW,EAAMC,SAAS,IAErEjF,EAAQkF,UACTxE,EAAMH,UAAUC,IAAI,aAAc,gBAGlChE,KAAKoI,UAAY/L,SAASiL,cAAc,OACxCtH,KAAKoI,UAAUO,aAAa,kBAAmB,QAC/C3I,KAAKoI,UAAUQ,UAAY1E,EAAM0E,UAAY,2BAqBjD,GAVA1E,EAAMyE,aAAa,MAAO,QAEvBf,IACD,gBAAM1D,EAAO0D,OAAa5I,EAAW,eAElCgB,KAAKoI,WACN,gBAAMpI,KAAKoI,UAAWR,OAAa5I,EAAW,gBAI/C0E,GAASkE,EAAa,CACvB,MAAMiB,EAASxM,SAASiL,cAAc,OACtCuB,EAAO9E,UAAUC,IAAI,sBACrBhE,KAAK8D,UAAUuC,OAAOwC,GAUxB,GAPGnF,IACD1D,KAAK0D,MAAQrH,SAASiL,cAAc,SACpCtH,KAAKoF,WACLpF,KAAK8D,UAAUuC,OAAOrG,KAAK0D,QAI1B+D,EAAW,CACZ,MAAMqB,EAAU9I,KAAK8D,UAAUiF,iBAC/B,IAAIC,GAAgB,EAEpBlB,EAAe,KACb,MAAMmB,EAAW/E,EAAMH,UAAUmF,SAAS,SAEpCC,EAActB,EAAa3D,EAA2Ba,MAAM/G,OAAS,IAAI,OAAAoL,EAAA,GAAalF,GAAO,GAAOa,OAAO/G,OAC3GqL,EAAO5B,EAAY0B,EACnBG,EAAUD,EAAO,EACvBnF,EAAMH,UAAUwF,OAAO,QAASD,GAI7BA,GAAWD,GAAQ3B,GACpB1H,KAAKoF,WACL0D,EAAQzC,OAAO,KAAKoB,EAAY0B,MAC5BH,IAAeA,GAAgB,KAC1BC,IAAaK,GAAYN,KAClChJ,KAAKoF,WACL4D,GAAgB,IAIpB9E,EAAMc,iBAAiB,QAAS8C,GAGlC9H,KAAKkE,MAAQA,EAGR,SACDlE,KAAK+E,QAIN/E,KAAKwD,QAAQqE,UACb7H,KAAKkE,MAA2B7G,SC/NxB,SAA+BlB,GAC5C,MAAMQ,EAAQN,SAASK,cACvBC,EAAMC,mBAAmBT,GACzB,MAAMW,EAAMN,OAAOC,eACnBK,EAAIC,kBACJD,EAAIE,SAASL,GD4NT6M,CAAsBxJ,KAAKkE,QAIxB,WACLlE,KAAK0D,MAAM0C,YAAc,GACtBpG,KAAKwD,QAAQuE,UACd/H,KAAK0D,MAAMsC,UAAYhG,KAAKwD,QAAQuE,UAEpC/H,KAAK0D,MAAM2C,OAAO,eAAKrG,KAAKwD,QAAQE,MAAO1D,KAAKwD,QAAQiG,eAIrD,YAAYC,GAAY,GAC7B,MAAOC,aAAcC,GAAiC5J,KAAKoI,UAMrDyB,GAAiB7J,KAAKkE,MAAMQ,MAAMoF,OAAOpL,QAAQ,KAAM,IAC7D,GAAGmL,IAAkBD,EACnB,OAGF,MACMG,EAAqBjM,KAAK6J,MADG,GAEJ7J,KAAKkM,IAAIlM,KAAKqH,IAAIyE,EAAYC,KAI7D7J,KAAKkE,MAAMQ,MAAMqF,mBAAwBA,EAAH,KAEnCL,IACD1J,KAAKkE,MAAMQ,MAAMoF,OAASF,EAAYA,EAAY,KAAO,IAI3D,YAAc5J,KAAKkE,MADD,sBACmB,EAAM6F,EAAoB,KAC7D/J,KAAKkE,MAAMH,UAAUkB,OAFL,wBAMpB,YACE,OAAOjF,KAAKwD,QAAQqE,UAAa7H,KAAKkE,MAA2Ba,MAAQ,OAAAqE,EAAA,GAAapJ,KAAKkE,OAAO,GAAOa,MAI3G,UAAUA,GACR/E,KAAK6E,iBAAiBE,GAAO,GAE7B,YAAc/E,KAAKkE,MAAO,SAGrB,iBAAiBa,EAAekF,GAAgB,GAClDjK,KAAKwD,QAAQqE,UACb7H,KAAKkE,MAA2Ba,MAAQA,GAEzC/E,KAAKkE,MAAM8B,UAAYjB,EAEpB/E,KAAKoI,YACNpI,KAAKoI,UAAUpC,UAAYjB,EAExBkF,GACDjK,KAAKqI,gBAMN,YACL,OAAOrI,KAAK+E,QAAU/E,KAAKkK,cAGtB,UACL,OAAQlK,KAAKkE,MAAMH,UAAUmF,SAAS,YAClClJ,KAAKwH,UAAYxH,KAAKwH,eACtBxH,KAAKuH,WAAa,OAAAY,EAAA,GAAanI,KAAKkE,QAGnC,kBACL,OAAOlE,KAAKmK,WAAanK,KAAKoK,YAGzB,cAAcrF,EAAQ,GAAIsF,GAAS,GACpCrK,KAAKwD,QAAQqE,YACf9C,EAAQ,IAAkBuF,cAAcvF,IAGvCsF,EACDrK,KAAK6E,iBAAiBE,GAAO,GAE7B/E,KAAK+E,MAAQA,EAIV,iBAAiBA,EAAqC,GAAIsF,GAAS,GACxErK,KAAKkK,cAAgBnF,EACrB/E,KAAKuK,cAAcxF,EAAOsF,GAGrB,SAASG,EAAmB9G,GAC9BA,IACD1D,KAAK0D,MAAM0C,YAAc,GACzBpG,KAAK0D,MAAM2C,OAAO,eAAK3C,EAAO1D,KAAKwD,QAAQiG,gBAG7CzJ,KAAKkE,MAAMH,UAAUwF,OAAO,WAAYiB,EAAQnD,EAAWoD,QAC3DzK,KAAKkE,MAAMH,UAAUwF,OAAO,WAAYiB,EAAQnD,EAAWqD,QAGtD,SAAShH,GACd1D,KAAK2K,SAAStD,EAAWoD,MAAO/G,M,gCElVpC,8GAsDO,MAAMkH,EASX,YAAmBzO,EAAiB0O,EAAY,GAAW/G,EAAyBzH,SAASiL,cAAc,QAAxF,KAAAnL,KAAwC,KAAA2H,YANpD,KAAAgH,gBAA0B,EAG1B,KAAAC,4BAA6B,EAC1B,KAAAC,yBAA0B,EAGlChL,KAAK8D,UAAUC,UAAUC,IAAI,cAE7BhE,KAAKgK,IAAM,YAAO,UAAYa,EAAY,IAAMA,EAAY,IAAK,IAASJ,OAEvEtO,IACD8O,MAAMC,KAAK/O,EAAGgP,UAAU7M,QAAQ8M,GAAKpL,KAAK8D,UAAUuC,OAAO+E,IAE3DjP,EAAGkK,OAAOrG,KAAK8D,YAKT,eACRtH,OAAOwI,iBAAiB,SAAUhF,KAAKqL,SAAU,CAACC,SAAS,IAC3DtL,KAAK8D,UAAUkB,iBAAiB,SAAUhF,KAAKqL,SAAU,CAACC,SAAS,EAAMC,SAAS,IAElF,YAAuB,KACrBvL,KAAK+K,4BAA6B,EAE/B/K,KAAK8K,kBACN9K,KAAKgL,yBAA0B,EAC/BxO,OAAOgP,qBAAqBxL,KAAK8K,mBAElC,KACD9K,KAAK+K,4BAA6B,EAE/B/K,KAAKgL,0BACNhL,KAAKqL,WACLrL,KAAKgL,yBAA0B,KAK9B,OAAOS,GACZzL,KAAK8D,UAAUuC,OAAOoF,GAGjB,kBACLA,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAGA,OAAO,YAAiBhM,KAAK8D,UAAW2H,EAASC,EAAUC,EAAQC,EAAaC,EAAgBC,EAAeC,EAAMC,IAO1G,MAAMC,UAAmBrB,EAatC,YAAYzO,EAAiB0O,EAAY,GAAWqB,EAAiB,IAAKC,GACxE1I,MAAMtH,EAAI0O,GADwC,KAAAqB,iBAT7C,KAAAE,mBAAiC,KACjC,KAAAC,cAA4B,KAC5B,KAAAC,iBAA+B,KAE/B,KAAAC,cAAwB,EACxB,KAAAC,oBAA8B,EAE9B,KAAAC,UAAiC,CAACC,KAAK,EAAMC,QAAQ,GAqBrD,KAAAtB,SAAW,KAOhB,GAAGrL,KAAK+K,2BAMN,OALG/K,KAAK8K,iBACNtO,OAAOgP,qBAAqBxL,KAAK8K,sBAGnC9K,KAAKgL,yBAA0B,IAK5BhL,KAAKqM,eAAkBrM,KAAKsM,kBAAsBtM,KAAK4M,SAAY5M,KAAKoM,sBAC1EpM,KAAK8K,iBAAiBtO,OAAOgP,qBAAqBxL,KAAK8K,iBAC1D9K,KAAK8K,gBAAkBtO,OAAOqQ,sBAAsB,KAClD7M,KAAK8K,gBAAkB,EAEvB,MAAMgC,EAAY9M,KAAK8D,UAAUgJ,UACjC9M,KAAKwM,oBAAsBxM,KAAKuM,gBAAkBO,EAAY,EAAK9M,KAAKuM,cAAgBO,EAAY,GAAK,EACzG9M,KAAKuM,cAAgBO,EAElB9M,KAAKoM,oBAAmD,IAA7BpM,KAAKwM,qBACjCxM,KAAKoM,qBAGJpM,KAAK+M,kBACN/M,KAAK+M,uBAKJ,KAAAA,iBAAmB,KACxB,IAAK/M,KAAKqM,gBAAkBrM,KAAKsM,iBAAmB,OAEpD,GAAGtM,KAAK+K,2BAEN,YADA/K,KAAKqL,WAIP,MAAM1B,EAAe3J,KAAK8D,UAAU6F,aACpC,IAAIA,EACF,OAGF,MACMqD,EAAerD,EADA3J,KAAK8D,UAAUmJ,aAE9BH,EAAY9M,KAAKuM,cAIpBvM,KAAKqM,eAAiBS,GAAa9M,KAAKkM,gBAAkBlM,KAAKwM,qBAAuB,GACvFxM,KAAKqM,gBAGJrM,KAAKsM,kBAAqBU,EAAeF,GAAc9M,KAAKkM,gBAAkBlM,KAAKwM,qBAAuB,GAC3GxM,KAAKsM,oBArEPtM,KAAK8D,UAAUC,UAAUC,IAAI,gBAC7BhE,KAAKkN,eAGA,oBAAoB/Q,GACzB6D,KAAK4M,QAAUzQ,EACf6D,KAAKgK,IAAI,uBAAwB7N,EAAI6D,MAmEhC,WAAWmN,IACfnN,KAAK4M,SAAW5M,KAAKoN,SAAWpN,KAAK8D,WAAWuJ,WAAWF,GAGvD,UAAUA,IACdnN,KAAK4M,SAAW5M,KAAKoN,SAAWpN,KAAK8D,WAAWuC,UAAU8G,GAGtD,mBACL,OAAOnN,KAAK2J,aAAe7L,KAAK6J,MAAM3H,KAAK8M,UAAY9M,KAAK8D,UAAUwJ,cAGxE,qBACE,OAAOtN,KAAKuN,oBAAsB,EAGpC,cAAcC,GACZxN,KAAK8D,UAAUgJ,UAAYU,EAG7B,gBAEE,OAAOxN,KAAK8D,UAAUgJ,UAGxB,mBACE,OAAO9M,KAAK8D,UAAU6F,cAInB,MAAM8D,UAAoB7C,EAC/B,YAAYzO,EAAiB0O,EAAY,GAAWqB,EAAiB,IAAYwB,EAAa,GAAW5J,EAAyBzH,SAASiL,cAAc,QAKvJ,GAJA7D,MAAMtH,EAAI0O,EAAW/G,GAD6B,KAAAoI,iBAA6B,KAAAwB,aAAwB,KAAA5J,YAGvG9D,KAAK8D,UAAUC,UAAUC,IAAI,iBAEzB,qBAAoB,CACtB,MAAM2J,EAAsB5N,KACtBA,EAAE6N,QAAU5N,KAAK8D,UAAU+J,YAAc7N,KAAK8D,UAAUgK,cAC1D9N,KAAK8D,UAAUiK,YAAchO,EAAEiO,OAAS,EACxC,YAAYjO,KAIhBC,KAAK8D,UAAUkB,iBAAiB,QAAS2I,EAAoB,CAACrC,SAAS,Q,gCCnQ7E,sEAyBe,MAAM2C,EAKnB,YAAYzK,EAAgC,IAC1C,MAAME,EAAQ1D,KAAK0D,MAAQrH,SAASiL,cAAc,SAClD5D,EAAMK,UAAUC,IAAI,kBAEjBR,EAAQ0K,aACTxK,EAAMK,UAAUC,IAAI,8BAGnBR,EAAQmE,OACTjE,EAAMK,UAAUC,IAAI,wBAGnBR,EAAQ2K,UACTnO,KAAKoO,kBAAiB,GAGxB,MAAMlK,EAAQlE,KAAKkE,MAAQ7H,SAASiL,cAAc,SAoClD,IAAI+G,EAWJ,GA9CAnK,EAAMH,UAAUC,IAAI,wBACpBE,EAAME,KAAO,WACVZ,EAAQG,OACTO,EAAMoK,GAAK,SAAW9K,EAAQG,MAG7BH,EAAQ+K,UACTrK,EAAMqK,SAAU,GAGf/K,EAAQgL,UACT,UAAgBC,WAAWrO,KAAKoK,IAC9B,MAAMkE,EAAa,YAAgBlE,EAAOhH,EAAQgL,UAClD,IAAID,EAEFA,EADC/K,EAAQmL,YAC6C,IAA5CnL,EAAQmL,YAAYC,QAAQF,GAE5BA,EAGZ1O,KAAK6E,iBAAiB0J,GAEtBrK,EAAMc,iBAAiB,SAAU,KAC/B,IAAID,EAEFA,EADCvB,EAAQmL,YACDnL,EAAQmL,YAAYzK,EAAMqK,QAAU,EAAI,GAExCrK,EAAMqK,QAGhB,UAAgBM,SAASrL,EAAQgL,SAAUzJ,OAM9CvB,EAAQiD,MACT4H,EAAOrO,KAAKqO,KAAOhS,SAASiL,cAAc,QAC1C+G,EAAKtK,UAAUC,IAAI,oBACnB,gBAAMqK,EAAM7K,EAAQiD,KAAMjD,EAAQsL,WAElCpL,EAAMK,UAAUC,IAAI,4BAGtBN,EAAM2C,OAAOnC,GAEVV,EAAQ+F,OAAQ,CACjB7F,EAAMK,UAAUC,IAAI,yBAEpB,MAAMuF,EAASlN,SAASiL,cAAc,OACtCiC,EAAOxF,UAAUC,IAAI,mBACrBN,EAAM2C,OAAOkD,OACR,CACL,MAAMwF,EAAM1S,SAASiL,cAAc,OACnCyH,EAAIhL,UAAUC,IAAI,gBAElB,MAAMgL,EAAW3S,SAAS4S,gBAAgB,6BAA8B,OACxED,EAASjL,UAAUC,IAAI,sBACvBgL,EAASE,eAAe,KAAM,UAAW,aACzC,MAAMC,EAAM9S,SAAS4S,gBAAgB,6BAA8B,OACnEE,EAAID,eAAe,KAAM,OAAQ,UACjCC,EAAID,eAAe,KAAM,IAAK,MAC9BF,EAAS3I,OAAO8I,GAEhB,MAAMC,EAAK/S,SAASiL,cAAc,OAClC8H,EAAGrL,UAAUC,IAAI,2BAEjB,MAAM6E,EAASxM,SAASiL,cAAc,OACtCuB,EAAO9E,UAAUC,IAAI,uBAErB+K,EAAI1I,OAAOwC,EAAQuG,EAAIJ,GAEvBtL,EAAM2C,OAAO0I,GAGZV,GACD3K,EAAM2C,OAAOgI,GAGZ7K,EAAQ6L,YACT3L,EAAMK,UAAUC,IAAI,kBAAmB,gBACvC,iBAAON,OAAO1E,OAAWA,GAAW,IAE5BwE,EAAQ8L,WAChB5L,EAAMK,UAAUC,IAAI,gBAIxB,cACE,OAAOhE,KAAKkE,MAAMqK,QAGpB,YAAYA,GAKVvO,KAAK6E,iBAAiB0J,GAEtB,MAAMgB,EAAQ,IAAIC,MAAM,SAAU,CAACC,SAAS,EAAMC,YAAY,IAC9D1P,KAAKkE,MAAMyL,cAAcJ,GAGpB,iBAAiBhB,GACtBvO,KAAKkE,MAAMqK,QAAUA,EAGhB,iBAAiBqB,GAEtB,OADA5P,KAAK0D,MAAMK,UAAUwF,OAAO,oBAAqBqG,GAC1C,IAAM5P,KAAKoO,kBAAkBwB,M,gCC5JxC,YAQA,MAAMC,EAAgB,CACpBpE,EACA7C,EACAkH,EACAC,EACAC,EACAC,KAEA,MAAM,QAACxN,EAAO,IAAEyN,GAAOzE,EAAQnG,QAgB/B,QAfetG,IAAZyD,GACDI,cAAcJ,QAGLzD,IAARkR,IACD1T,OAAOgP,sBAAsB0E,GACzBD,UACKxE,EAAQnG,QAAQ4K,KAQxBD,GAAW,UAAUE,SAASC,mBAAqBL,EAMpD,YALAtE,EAAQnG,QAAQ4K,IAAM,GAAK1T,OAAOqQ,sBAAsB,YAC/CpB,EAAQnG,QAAQ4K,IACvBL,EAAcpE,EAAS7C,EAAWkH,EAAUC,EAAUC,EAAiBC,EAAU,MAMlFH,GAAYlH,GACb6C,EAAQ1H,UAAUC,IAAI4E,GAGxB,MAAMyH,EAAe,YACZ5E,EAAQnG,QAAQ7C,SACnBqN,GAAYlH,GACd6C,EAAQ1H,UAAUkB,OAAO,YAAa2D,GAGxC6C,EAAQ1H,UAAUkB,OAAO,aAEzB+K,GAAmBA,KAGrB,IAAI,UAAUG,SAASC,oBAAsBL,EAG3C,OAFAtE,EAAQ1H,UAAUkB,OAAO,YAAa,kBACtCoL,IAIF5E,EAAQ1H,UAAUC,IAAI,aAEtByH,EAAQ1H,UAAUwF,OAAO,aAAcuG,GACvCrE,EAAQnG,QAAQ7C,QAAU,GAAKC,WAAW2N,EAAcN,IAG3C,O,gCC9DA,SAAS3B,EAAiBjB,EAAyByC,GAOhE,OANGA,EACDzC,EAAS7O,QAAQnC,GAAMA,EAAGwM,aAAa,WAAY,SAEnDwE,EAAS7O,QAAQnC,GAAMA,EAAGmU,gBAAgB,aAGrC,IAAMlC,EAAiBjB,GAAWyC,GAb3C,mC,gCCMe,SAASW,EAAUpU,EAASqU,GACzC,OAAOrU,EAAGsU,QAAQD,GAPpB,mC,gCCAA,8DAgBe,SAASpH,EAAasH,EAAoBC,GAAe,GACtE,MAAMC,EAAkB,GAClBC,EAAiB,GAEjBhK,EAA4B8J,EAAe,QAAK3R,EACtD,YAAoB0R,EAAOE,EAAOC,OAAM7R,OAAWA,EAAW6H,GAC3DgK,EAAK7S,QACN4S,EAAMjQ,KAAKkQ,EAAKC,KAAK,KAGvB,IAAI/L,EAAQ6L,EAAME,KAAK,MASvB,OARA/L,EAAQA,EAAMrG,QAAQ,UAAW,KAE9BmI,GACD,IAAkBkK,oBAAoBlK,GAKjC,CAAC9B,QAAO8B,YAGjB,IAAeuC,aAAeA,G,gCChCf,SAAS7C,EAAgBpK,EAAS6U,GAC/C,OAAO7U,EAAGsU,QAAQ,IAAIO,MAPxB,mC,gCCAA,oEAkBO,MAAMC,EAAsD,CACjEC,KAAM,CACJtP,MAAO,4BACPuP,WAAY,qBAEdC,UAAW,CACTxP,MAAO,0BACPuP,WAAY,0BAEdE,OAAQ,CACNzP,MAAO,uBACPuP,WAAY,uBAEdG,UAAW,CACT1P,MAAO,gDACPuP,WAAY,oBAEdI,cAAe,CACb3P,MAAO,kCACPuP,WAAY,uBAEdK,KAAM,CACJ5P,MAAO,iBACPuP,WAAY,wBAEdM,YAAa,CACX7P,MAAO,WACPuP,WAAY,6BAID,SAASO,EAAoB3L,EAAmB6K,EAAiBC,EAAgBc,EAAgBC,EAAoB/K,EAA4BgL,EAAS,CAACA,OAAQ,IAChL,GAAqB,IAAlB9L,EAAK+L,SAAgB,CACtB,MAAMC,EAAYhM,EAAKgM,UAQvB,GANGJ,IAAY5L,EACb8K,EAAKlQ,KAAKoR,EAAUC,OAAO,EAAGJ,GAAa,IAASG,EAAUC,OAAOJ,IAErEf,EAAKlQ,KAAKoR,GAGTlL,GAAYkL,EAAUE,QACpBlM,EAAKmM,WAAY,CAClB,MAAMC,EAAgBpM,EAAKoM,cAE3B,IAAI,MAAM/N,KAAQ6M,EAAc,CAC9B,MAAMT,EAAMS,EAAa7M,GACnBqM,EAAU0B,EAAc1B,QAAQD,EAAI5O,MAAQ,uBAC/C6O,GAAuD,OAA5CA,EAAQ2B,aAAa,qBACX,yBAAnB5B,EAAIW,WACLtK,EAASlG,KAAK,CACZqG,EAAGwJ,EAAIW,WACPkB,IAAMF,EAAoCG,KAC1CT,OAAQA,EAAOA,OACf7T,OAAQ+T,EAAU/T,SAEO,6BAAnBwS,EAAIW,WACZtK,EAASlG,KAAK,CACZqG,EAAGwJ,EAAIW,WACPU,OAAQA,EAAOA,OACf7T,OAAQ+T,EAAU/T,OAClBuU,QAASJ,EAAc7M,QAAQkN,OAAOC,aAGxC5L,EAASlG,KAAK,CACZqG,EAAGwJ,EAAIW,WACPU,OAAQA,EAAOA,OACf7T,OAAQ+T,EAAU/T,WAU9B,YAFA6T,EAAOA,QAAUE,EAAU/T,QAK7B,GAAqB,IAAlB+H,EAAK+L,SACN,OAGF,MAAMY,EAAcf,IAAY5L,EAC1B4M,EAA2B,QAAjB5M,EAAK6M,SAAsC,MAAjB7M,EAAK6M,QAC/C,GAAGD,GAAW9B,EAAK7S,QAA2B,OAAjB+H,EAAK6M,QAChChC,EAAMjQ,KAAKkQ,EAAKC,KAAK,KACrBD,EAAKgC,OAAO,EAAGhC,EAAK7S,aACf,GAAG+H,aAAgB+M,iBAAkB,CAC1C,MAAMC,EAAMhN,EAAKgN,IACdA,IACDlC,EAAKlQ,KAAKoS,GACVlB,EAAOA,QAAUkB,EAAI/U,QAItB0U,IAAed,GAChBf,EAAKlQ,KAAK,KAGZ,IAAIqS,EAAWjN,EAAKE,WACpB,KAAM+M,GACJtB,EAAoBsB,EAAUpC,EAAOC,EAAMc,EAASC,EAAW/K,EAAUgL,GACzEmB,EAAWA,EAASC,YAGnBP,GAAcd,GACff,EAAKlQ,KAAK,KAGTgS,GAAW9B,EAAK7S,SACjB4S,EAAMjQ,KAAKkQ,EAAKC,KAAK,KACrBD,EAAKgC,OAAO,EAAGhC,EAAK7S,W,gCCnIxB,8CAQe,SAASmK,EAAasD,GACnC,OAAGA,EAAQyH,aAAa,oBAA0C,UAApBzH,EAAQmH,SAI5C,YAAanH,GAAS,GAAO1G,MAAMkN,QAElCxG,EAA6B1G,MAAMkN","file":"3.bdf444277e969e63a4c3.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n const s = {country, code};\n\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { blobConstruct, readBlobAsUint8Array } from \"../helpers/blob\";\r\n\r\nexport class FileManager {\r\n public blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport FileManager from './filemanager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n //console.log('document paste');\r\n\r\n //console.log('messageInput paste');\r\n\r\n e.preventDefault();\r\n // @ts-ignore\r\n let text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n\r\n let entities = RichTextProcessor.parseEntities(text);\r\n //console.log('messageInput paste', text, entities);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n //text = RichTextProcessor.wrapEmojiText(text);\r\n text = RichTextProcessor.wrapRichText(text, {entities, noLinks: true, wrappingDraft: true});\r\n\r\n // console.log('messageInput paste after', text);\r\n\r\n // @ts-ignore\r\n //let html = (e.originalEvent || e).clipboardData.getData('text/html');\r\n\r\n // @ts-ignore\r\n //console.log('paste text', text, );\r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: true,\r\n required?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { FocusDirection, ScrollGetNormalSizeCallback } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public onScrollMeasure: number = 0;\r\n protected onScroll: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\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 protected setListeners() {\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\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 append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(\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 ) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll(this.container, element, position, margin, maxDistance, forceDirection, forceDuration, axis, getNormalSize);\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 splitUp: HTMLElement;\r\n public padding: HTMLElement;\r\n \r\n public onAdditionalScroll: () => void = null;\r\n public onScrolledTop: () => void = null;\r\n public onScrolledBottom: () => void = null;\r\n \r\n public lastScrollTop: number = 0;\r\n public lastScrollDirection: number = 0;\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 }\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 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 if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\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) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollTop = this.container.scrollTop;\r\n this.lastScrollDirection = this.lastScrollTop === scrollTop ? 0 : (this.lastScrollTop < scrollTop ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollTop = scrollTop;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n\r\n public 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.lastScrollTop;\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 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}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { getDeepProperty } from \"../helpers/object\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean) {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityPre' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName';\r\n};\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"font-weight\"], b',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike',\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};\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n const nodeValue = node.nodeValue;\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.trim()) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest && closest.getAttribute('contenteditable') === null) {\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (parentElement as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: parentElement.dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = (selNode === node);\r\n const isBlock = node.tagName === 'DIV' || node.tagName === 'P';\r\n if(isBlock && line.length || node.tagName === 'BR') {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n 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(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/formatPhoneNumber.ts","webpack:///./src/lib/filemanager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/findUpTag.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/isInputEmpty.ts"],"names":["placeCaretAtEnd","el","ignoreTouchCheck","document","activeElement","focus","window","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","body","createTextRange","textRange","moveToElementText","select","prefixes","Map","maxPrefixLength","setPrefix","country","code","prefix","country_code","Math","max","length","set","formatPhoneNumber","originalStr","size","countriesList","forEach","country_codes","prefixCountry","str","replace","phoneCode","slice","i","get","formatted","undefined","leftPattern","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","min","split","symbol","idx","blobSupported","e","this","fileWriter","bytes","Blob","then","arr","write","mimeType","saveFileCallback","blobParts","part","push","truncate","finalize","saveToStorage","blob","dbName","useStorage","test","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","match","response","put","fileName","method","Response","headers","save","callback","Promise","resolve","reject","rejected","timeout","setTimeout","res","err","clearTimeout","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","all","map","storage","deleteAll","TelInputField","options","super","label","name","pasted","lastValue","container","classList","add","telEl","input","HTMLInputElement","type","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","addEventListener","remove","formattedPhoneNumber","abs","setLabel","countryCode","dataset","onInput","key","metaKey","ctrlKey","shiftKey","preventDefault","replaceContent","elem","node","innerHTML","firstChild","lastChild","replaceWith","textContent","append","init","findUpAttribute","target","text","originalEvent","clipboardData","getData","entities","parseEntities","filter","_","wrapRichText","noLinks","wrappingDraft","execCommand","InputState","createElement","required","validate","maxLength","showLengthOn","round","placeholder","plainText","processInput","labelText","firstElementChild","observer","MutationObserver","isInputEmpty","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","setAttribute","className","border","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","getRichValue","diff","isError","toggle","selectElementContents","labelOptions","setHeight","scrollHeight","newHeight","currentHeight","height","transitionDuration","log","fireFakeInput","originalValue","isValid","isChanged","silent","wrapDraftText","setDraftValue","state","Error","Valid","setState","ScrollableBase","logPrefix","onScrollMeasure","isHeavyAnimationInProgress","needCheckAfterAnimation","Array","from","children","c","onScroll","passive","capture","cancelAnimationFrame","element","position","margin","maxDistance","forceDirection","forceDuration","axis","getNormalSize","Scrollable","onScrollOffset","withPaddingContainer","onAdditionalScroll","onScrolledTop","onScrolledBottom","lastScrollTop","lastScrollDirection","loadedAll","top","bottom","splitUp","requestAnimationFrame","scrollTop","checkForTriggers","maxScrollTop","clientHeight","setListeners","elements","padding","prepend","offsetHeight","getDistanceToEnd","y","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","CheckboxField","restriction","disabled","toggleDisability","span","id","checked","stateKey","getState","stateValue","stateValues","indexOf","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","withRipple","withHover","event","Event","bubbles","cancelable","dispatchEvent","disable","SetTransition","forwards","duration","onTransitionEnd","useRafs","raf","settings","animationsEnabled","afterTimeout","removeAttribute","findUpTag","tag","closest","field","withEntities","lines","line","join","combineSameEntities","attribute","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","getRichElementValue","selNode","selOffset","offset","nodeType","nodeValue","substr","trim","parentNode","parentElement","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","tagName","splice","HTMLImageElement","alt","curChild","nextSibling","hasAttribute"],"mappings":"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","file":"3.f3be892bf29dd69632d3.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n const s = {country, code};\n\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { blobConstruct, readBlobAsUint8Array } from \"../helpers/blob\";\r\n\r\nexport class FileManager {\r\n public blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport FileManager from './filemanager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n //console.log('document paste');\r\n\r\n //console.log('messageInput paste');\r\n\r\n e.preventDefault();\r\n // @ts-ignore\r\n let text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n\r\n let entities = RichTextProcessor.parseEntities(text);\r\n //console.log('messageInput paste', text, entities);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n //text = RichTextProcessor.wrapEmojiText(text);\r\n text = RichTextProcessor.wrapRichText(text, {entities, noLinks: true, wrappingDraft: true});\r\n\r\n // console.log('messageInput paste after', text);\r\n\r\n // @ts-ignore\r\n //let html = (e.originalEvent || e).clipboardData.getData('text/html');\r\n\r\n // @ts-ignore\r\n //console.log('paste text', text, );\r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: true,\r\n required?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { FocusDirection, ScrollGetNormalSizeCallback } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public onScrollMeasure: number = 0;\r\n protected onScroll: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\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 protected setListeners() {\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\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 append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(\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 ) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll(this.container, element, position, margin, maxDistance, forceDirection, forceDuration, axis, getNormalSize);\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 splitUp: HTMLElement;\r\n public padding: HTMLElement;\r\n \r\n public onAdditionalScroll: () => void = null;\r\n public onScrolledTop: () => void = null;\r\n public onScrolledBottom: () => void = null;\r\n \r\n public lastScrollTop: number = 0;\r\n public lastScrollDirection: number = 0;\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 }\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 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 if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\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) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollTop = this.container.scrollTop;\r\n this.lastScrollDirection = this.lastScrollTop === scrollTop ? 0 : (this.lastScrollTop < scrollTop ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollTop = scrollTop;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n\r\n public 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.lastScrollTop;\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 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}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { getDeepProperty } from \"../helpers/object\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean) {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityPre' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName';\r\n};\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"font-weight\"], b',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike',\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};\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n const nodeValue = node.nodeValue;\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.trim()) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest && closest.getAttribute('contenteditable') === null) {\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (parentElement as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: parentElement.dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = (selNode === node);\r\n const isBlock = node.tagName === 'DIV' || node.tagName === 'P';\r\n if(isBlock && line.length || node.tagName === 'BR') {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n 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(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/30.0ba6f57fe3c460b08e24.chunk.js.map b/public/30.0ba6f57fe3c460b08e24.chunk.js.map deleted file mode 100644 index ee895f4d5..000000000 --- a/public/30.0ba6f57fe3c460b08e24.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/pages/pageSignIn.ts"],"names":["btnQr","btnNext","page","setCountries","countries","countriesList","filter","country","pFlags","hidden","sort","a","b","name","default_name","localeCompare","addEventListener","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","document","createElement","classList","add","countryInputField","label","container","countryInput","input","selectWrapper","arrowDown","append","selectList","appendChild","initSelect","forEach","c","emoji","iso2","liArr","country_codes","countryCode","li","wrapped","wrapEmojiText","spanEmoji","innerHTML","el","dataset","defaultName","span","innerText","country_code","push","set","e","button","target","selectCountryByTarget","childNodes","phoneCode","querySelector","replace","find","_countryCode","telInputField","value","lastValue","hidePicker","setTimeout","telEl","focus","hideTimeout","get","style","display","clearTimeout","undefined","remove","offsetWidth","select","pageEl","parentElement","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","window","key","ctrlKey","_value","toLowerCase","matches","good","Boolean","str","indexOf","length","cancelBubble","preventDefault","blur","onInput","formatted","loadLottieWorkers","code","countryName","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","pushToState","toggleStorage","getState","then","state","storage","isAvailable","toggle","phone_number","invokeApi","api_id","id","api_hash","hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","h4","subtitle","nearestDcResult","langPack","getFromCache","getLangPack","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","getNetworker","Promise","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute"],"mappings":"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","file":"30.0ba6f57fe3c460b08e24.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/lottieLoader\";\r\nimport { ripple } from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\r\n // const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter(country => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll(page.pageEl.parentElement.parentElement, countryInput, 'start', 4);\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n let good = !![c.name, c.default_name].filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch(err => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then(module => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach(dcId => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n apiManager.getNetworker(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/30.0ba6f57fe3c460b08e24.chunk.js b/public/30.b373d83017596ec6462f.chunk.js similarity index 93% rename from public/30.0ba6f57fe3c460b08e24.chunk.js rename to public/30.b373d83017596ec6462f.chunk.js index 9e3e41324..901ddf037 100644 --- a/public/30.0ba6f57fe3c460b08e24.chunk.js +++ b/public/30.b373d83017596ec6462f.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[30],{20:function(e,t,n){"use strict";n.r(t);var a=n(35),o=n(49),c=n(17),i=n(32),s=n(31),r=n(62),d=n(38),l=n(53),u=n(33),p=n(87),h=n(1),b=n(8),m=n(16),f=n(51),g=n(18),v=n(61),y=n(6),L=n(66),E=n(98),O=n(115),_=n(22),j=n(92),w=n(5),k=n(30),S=n(36),T=n(59),x=n(65),C=n(100),N=n(91),P=n(52),I=n(80),A=n(15),D=n(121),H=n(10),M=function(e,t,n,a){return new(n||(n=Promise))((function(o,c){function i(e){try{r(a.next(e))}catch(e){c(e)}}function s(e){try{r(a.throw(e))}catch(e){c(e)}}function r(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,s)}r((a=a.apply(e,t||[])).next())}))};let R,B=null;const U=new r.a("page-sign",!0,()=>{const e=()=>{t=m.default.countriesList.filter(e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)}).sort((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name))};let t;e(),A.default.addEventListener("language_change",()=>{e()});const r=new Map;let g,W;const q=document.createElement("div");q.classList.add("input-wrapper");const F=new d.b({label:"Login.CountrySelectorLabel",name:Object(L.b)()});F.container.classList.add("input-select");const J=F.input,K=document.createElement("div");K.classList.add("select-wrapper","z-depth-3","hide");const V=document.createElement("span");V.classList.add("arrow","arrow-down"),F.container.append(V);const z=document.createElement("ul");K.appendChild(z);new o.b(K);let Q=()=>{Q=null,t.forEach(e=>{const t=Object(N.c)(e.iso2),n=[];e.country_codes.forEach(a=>{const o=document.createElement("li");let c=s.a.wrapEmojiText(t);if(H.a){const e=document.createElement("span");e.innerHTML=c,o.append(e)}else o.innerHTML=c;const i=Object(m.i18n)(e.default_name);i.dataset.defaultName=e.default_name,o.append(i);const r=document.createElement("span");r.classList.add("phone-code"),r.innerText="+"+a.country_code,o.appendChild(r),n.push(o),z.append(o)}),r.set(e.iso2,n)}),z.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(v.a)(e.target,"LI");$(t)}),F.container.appendChild(K)};const $=e=>{const n=e.childNodes[1].dataset.defaultName,a=e.querySelector(".phone-code").innerText,o=a.replace(/\D/g,"");Object(S.a)(J,Object(m.i18n)(n)),Object(P.a)(J,"input"),g=t.find(e=>e.default_name===n),W=g.country_codes.find(e=>e.country_code===o),ee.value=ee.lastValue=a,Z(),setTimeout(()=>{te.focus(),Object(C.a)(te,!0)},0)};let G;Q(),J.addEventListener("focus",(function(e){Q?Q():t.forEach(e=>{r.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout(G),G=void 0,K.classList.remove("hide"),K.offsetWidth,K.classList.add("active"),F.select(),Object(p.b)(U.pageEl.parentElement.parentElement,J,"start",4),setTimeout(()=>{X||(document.addEventListener("mousedown",Y,{capture:!0}),X=!0)},0)}));let X=!1;const Y=e=>{Object(y.a)(e.target,"input-select")||e.target!==J&&(Z(),document.removeEventListener("mousedown",Y,{capture:!0}),X=!1)},Z=()=>{void 0===G&&(K.classList.remove("active"),G=window.setTimeout(()=>{K.classList.add("hide"),G=void 0},200))};J.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let a=F.value.toLowerCase(),o=[];t.forEach(e=>{let t=!![e.name,e.default_name].filter(Boolean).find(e=>-1!==e.toLowerCase().indexOf(a));r.get(e.iso2).forEach(e=>e.style.display=t?"":"none"),t&&o.push(e)}),0===o.length?t.forEach(e=>{r.get(e.iso2).forEach(e=>e.style.display="")}):1===o.length&&"Enter"===n&&$(r.get(o[0].iso2)[0])}),V.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),J.matches(":focus")?J.blur():J.focus()}));const ee=new D.a({onInput:e=>{f.b.loadLottieWorkers();const{country:t,code:n}=e||{};let a=t?t.name||t.default_name:"";a===F.value||g&&t&&n&&(g===t||W.country_code===n.country_code)||(Object(S.a)(J,t?Object(m.i18n)(t.default_name):a),g=t,W=n),t||ee.value.length-1>1?B.style.visibility="":B.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!B.style.visibility&&"Enter"===e.key)return ae()});const ne=new l.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.checked;c.default.pushToState("keepSigned",e),E.a.toggleStorage(e),O.a.toggleStorage(e),i.a.toggleStorage(e),x.a.toggleStorage(e)}),c.default.getState().then(e=>{c.default.storage.isAvailable()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),B=Object(u.a)("btn-primary btn-color-primary",{text:"Login.Next"}),B.style.visibility="hidden";const ae=e=>{e&&Object(w.a)(e);const t=Object(T.a)([B,R],!0);Object(S.a)(B,Object(m.i18n)("PleaseWait")),Object(a.f)(B);let o=ee.value;i.a.invokeApi("auth.sendCode",{phone_number:o,api_id:b.a.id,api_hash:b.a.hash,settings:{_:"codeSettings"}}).then(e=>{n.e(21).then(n.bind(null,23)).then(t=>t.default.mount(Object.assign(e,{phone_number:o})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(S.a)(ee.label,Object(m.i18n)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(S.a)(B,Object(m.i18n)("Login.Next"));break;default:console.error("auth.sendCode error:",e),B.innerText=e.type}})};Object(k.b)(B,ae),R=Object(u.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});R.addEventListener("click",()=>{_.default.mount()}),q.append(F.container,ee.container,ne.label,B,R);const oe=document.createElement("h4");oe.classList.add("text-center"),Object(m._i18n)(oe,"Login.Title");const ce=document.createElement("div");ce.classList.add("subtitle","text-center"),Object(m._i18n)(ce,"Login.StartText"),U.pageEl.querySelector(".container").append(oe,ce,q);h.IS_TOUCH_SUPPORTED||setTimeout(()=>{te.focus()},0),Object(j.a)(q),i.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=I.a.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&m.default.getLangPack(n.lang_code).then(()=>{Object(P.a)(te,"input")});const a=new Set([1,2,3,4,5]),o=[e.this_dc];let c;return e.nearest_dc!==e.this_dc&&(c=i.a.getNetworker(e.nearest_dc).then(()=>{o.push(e.nearest_dc)})),(c||Promise.resolve()).then(()=>{o.forEach(e=>{a.delete(e)});const e=[...a],t=()=>M(void 0,void 0,void 0,(function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield x.a.get(a))return t();setTimeout(()=>{i.a.getNetworker(n).finally(t)},3e3)}));t()}),e}).then(e=>{F.value.length||ee.value.length||$(r.get(e.country)[0])})},()=>{B&&(Object(S.a)(B,Object(m.i18n)("Login.Next")),Object(g.ripple)(B,void 0,void 0,!0),B.removeAttribute("disabled")),R&&R.removeAttribute("disabled"),c.default.pushToState("authState",{_:"authStateSignIn"})});t.default=U}}]); -//# sourceMappingURL=30.0ba6f57fe3c460b08e24.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[30],{20:function(e,t,n){"use strict";n.r(t);var a=n(35),o=n(47),c=n(17),i=n(33),s=n(31),r=n(64),d=n(38),l=n(55),u=n(34),p=n(89),h=n(1),b=n(8),m=n(16),f=n(51),g=n(18),v=n(63),y=n(6),L=n(65),E=n(99),O=n(119),_=n(22),j=n(94),w=n(5),k=n(30),S=n(36),T=n(58),x=n(67),C=n(100),N=n(93),P=n(52),I=n(80),A=n(15),D=n(125),H=n(10),M=function(e,t,n,a){return new(n||(n=Promise))((function(o,c){function i(e){try{r(a.next(e))}catch(e){c(e)}}function s(e){try{r(a.throw(e))}catch(e){c(e)}}function r(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,s)}r((a=a.apply(e,t||[])).next())}))};let R,B=null;const U=new r.a("page-sign",!0,()=>{const e=()=>{t=m.default.countriesList.filter(e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)}).sort((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name))};let t;e(),A.default.addEventListener("language_change",()=>{e()});const r=new Map;let g,W;const q=document.createElement("div");q.classList.add("input-wrapper");const F=new d.b({label:"Login.CountrySelectorLabel",name:Object(L.b)()});F.container.classList.add("input-select");const J=F.input,K=document.createElement("div");K.classList.add("select-wrapper","z-depth-3","hide");const V=document.createElement("span");V.classList.add("arrow","arrow-down"),F.container.append(V);const z=document.createElement("ul");K.appendChild(z);new o.b(K);let Q=()=>{Q=null,t.forEach(e=>{const t=Object(N.c)(e.iso2),n=[];e.country_codes.forEach(a=>{const o=document.createElement("li");let c=s.a.wrapEmojiText(t);if(H.a){const e=document.createElement("span");e.innerHTML=c,o.append(e)}else o.innerHTML=c;const i=Object(m.i18n)(e.default_name);i.dataset.defaultName=e.default_name,o.append(i);const r=document.createElement("span");r.classList.add("phone-code"),r.innerText="+"+a.country_code,o.appendChild(r),n.push(o),z.append(o)}),r.set(e.iso2,n)}),z.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(v.a)(e.target,"LI");$(t)}),F.container.appendChild(K)};const $=e=>{const n=e.childNodes[1].dataset.defaultName,a=e.querySelector(".phone-code").innerText,o=a.replace(/\D/g,"");Object(S.a)(J,Object(m.i18n)(n)),Object(P.a)(J,"input"),g=t.find(e=>e.default_name===n),W=g.country_codes.find(e=>e.country_code===o),ee.value=ee.lastValue=a,Z(),setTimeout(()=>{te.focus(),Object(C.a)(te,!0)},0)};let G;Q(),J.addEventListener("focus",(function(e){Q?Q():t.forEach(e=>{r.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout(G),G=void 0,K.classList.remove("hide"),K.offsetWidth,K.classList.add("active"),F.select(),Object(p.b)(U.pageEl.parentElement.parentElement,J,"start",4),setTimeout(()=>{X||(document.addEventListener("mousedown",Y,{capture:!0}),X=!0)},0)}));let X=!1;const Y=e=>{Object(y.a)(e.target,"input-select")||e.target!==J&&(Z(),document.removeEventListener("mousedown",Y,{capture:!0}),X=!1)},Z=()=>{void 0===G&&(K.classList.remove("active"),G=window.setTimeout(()=>{K.classList.add("hide"),G=void 0},200))};J.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let a=F.value.toLowerCase(),o=[];t.forEach(e=>{let t=!![e.name,e.default_name].filter(Boolean).find(e=>-1!==e.toLowerCase().indexOf(a));r.get(e.iso2).forEach(e=>e.style.display=t?"":"none"),t&&o.push(e)}),0===o.length?t.forEach(e=>{r.get(e.iso2).forEach(e=>e.style.display="")}):1===o.length&&"Enter"===n&&$(r.get(o[0].iso2)[0])}),V.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),J.matches(":focus")?J.blur():J.focus()}));const ee=new D.a({onInput:e=>{f.a.loadLottieWorkers();const{country:t,code:n}=e||{};let a=t?t.name||t.default_name:"";a===F.value||g&&t&&n&&(g===t||W.country_code===n.country_code)||(Object(S.a)(J,t?Object(m.i18n)(t.default_name):a),g=t,W=n),t||ee.value.length-1>1?B.style.visibility="":B.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!B.style.visibility&&"Enter"===e.key)return ae()});const ne=new l.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.checked;c.default.pushToState("keepSigned",e),E.a.toggleStorage(e),O.a.toggleStorage(e),i.a.toggleStorage(e),x.a.toggleStorage(e)}),c.default.getState().then(e=>{c.default.storage.isAvailable()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),B=Object(u.a)("btn-primary btn-color-primary",{text:"Login.Next"}),B.style.visibility="hidden";const ae=e=>{e&&Object(w.a)(e);const t=Object(T.a)([B,R],!0);Object(S.a)(B,Object(m.i18n)("PleaseWait")),Object(a.f)(B);let o=ee.value;i.a.invokeApi("auth.sendCode",{phone_number:o,api_id:b.a.id,api_hash:b.a.hash,settings:{_:"codeSettings"}}).then(e=>{n.e(21).then(n.bind(null,23)).then(t=>t.default.mount(Object.assign(e,{phone_number:o})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(S.a)(ee.label,Object(m.i18n)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(S.a)(B,Object(m.i18n)("Login.Next"));break;default:console.error("auth.sendCode error:",e),B.innerText=e.type}})};Object(k.b)(B,ae),R=Object(u.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});R.addEventListener("click",()=>{_.default.mount()}),q.append(F.container,ee.container,ne.label,B,R);const oe=document.createElement("h4");oe.classList.add("text-center"),Object(m._i18n)(oe,"Login.Title");const ce=document.createElement("div");ce.classList.add("subtitle","text-center"),Object(m._i18n)(ce,"Login.StartText"),U.pageEl.querySelector(".container").append(oe,ce,q);h.IS_TOUCH_SUPPORTED||setTimeout(()=>{te.focus()},0),Object(j.a)(q),i.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=I.a.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&m.default.getLangPack(n.lang_code).then(()=>{Object(P.a)(te,"input")});const a=new Set([1,2,3,4,5]),o=[e.this_dc];let c;return e.nearest_dc!==e.this_dc&&(c=i.a.getNetworker(e.nearest_dc).then(()=>{o.push(e.nearest_dc)})),(c||Promise.resolve()).then(()=>{o.forEach(e=>{a.delete(e)});const e=[...a],t=()=>M(void 0,void 0,void 0,(function*(){const n=e.shift();if(!n)return;const a=`dc${n}_auth_key`;if(yield x.a.get(a))return t();setTimeout(()=>{i.a.getNetworker(n).finally(t)},3e3)}));t()}),e}).then(e=>{F.value.length||ee.value.length||$(r.get(e.country)[0])})},()=>{B&&(Object(S.a)(B,Object(m.i18n)("Login.Next")),Object(g.ripple)(B,void 0,void 0,!0),B.removeAttribute("disabled")),R&&R.removeAttribute("disabled"),c.default.pushToState("authState",{_:"authStateSignIn"})});t.default=U}}]); +//# sourceMappingURL=30.b373d83017596ec6462f.chunk.js.map \ No newline at end of file diff --git a/public/30.b373d83017596ec6462f.chunk.js.map b/public/30.b373d83017596ec6462f.chunk.js.map new file mode 100644 index 000000000..e7571f581 --- /dev/null +++ b/public/30.b373d83017596ec6462f.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/pages/pageSignIn.ts"],"names":["btnQr","btnNext","page","setCountries","countries","countriesList","filter","country","pFlags","hidden","sort","a","b","name","default_name","localeCompare","addEventListener","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","document","createElement","classList","add","countryInputField","label","container","countryInput","input","selectWrapper","arrowDown","append","selectList","appendChild","initSelect","forEach","c","emoji","iso2","liArr","country_codes","countryCode","li","wrapped","wrapEmojiText","spanEmoji","innerHTML","el","dataset","defaultName","span","innerText","country_code","push","set","e","button","target","selectCountryByTarget","childNodes","phoneCode","querySelector","replace","find","_countryCode","telInputField","value","lastValue","hidePicker","setTimeout","telEl","focus","hideTimeout","get","style","display","clearTimeout","undefined","remove","offsetWidth","select","pageEl","parentElement","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","window","key","ctrlKey","_value","toLowerCase","matches","good","Boolean","str","indexOf","length","cancelBubble","preventDefault","blur","onInput","formatted","loadLottieWorkers","code","countryName","visibility","onSubmit","signedCheckboxField","text","withRipple","checked","keepSigned","pushToState","toggleStorage","getState","then","state","storage","isAvailable","toggle","phone_number","invokeApi","api_id","id","api_hash","hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","h4","subtitle","nearestDcResult","langPack","getFromCache","getLangPack","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","getNetworker","Promise","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute"],"mappings":"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","file":"30.b373d83017596ec6462f.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { ripple } from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\r\n // const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter(country => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll(page.pageEl.parentElement.parentElement, countryInput, 'start', 4);\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n let good = !![c.name, c.default_name].filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch(err => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then(module => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach(dcId => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n apiManager.getNetworker(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/31.623be4e5a35a57db3b0c.chunk.js b/public/31.2de22fb7274e1d4a2d03.chunk.js similarity index 95% rename from public/31.623be4e5a35a57db3b0c.chunk.js rename to public/31.2de22fb7274e1d4a2d03.chunk.js index 8d4cb095d..f9990b4e1 100644 --- a/public/31.623be4e5a35a57db3b0c.chunk.js +++ b/public/31.2de22fb7274e1d4a2d03.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[31],{149:function(t,r,o){"use strict";o.r(r),o.d(r,"default",(function(){return f}));const a=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],e=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function f(t,r,o,f,n,s,u){if(Number.isNaN(s)||s<1)return;s|=0,Number.isNaN(u)&&(u=1),(u|=0)>3&&(u=3),u<1&&(u=1);const i=t.getImageData(r,o,f,n),c=i.data;let p,N,b,m,d,g,h,k,l,w,D,I,J=f-1,j=n-1,q=s+1,v=[],x=[],y=[],z=a[s],A=e[s],B=[],C=[];for(;u-- >0;){for(I=D=0,d=0;dJ?J:g)<<2),p+=c[h++],N+=c[h++],b+=c[h++];for(m=0;m0?h<<2:0),k=I+B[m],l=I+C[m],p+=c[k++]-c[l++],N+=c[k++]-c[l++],b+=c[k++]-c[l++],D++;I+=f<<2}for(m=0;mj?0:f,p+=v[w],N+=x[w],b+=y[w];for(D=m<<2,d=0;d>>A,c[D+1]=N*z>>>A,c[D+2]=b*z>>>A,0==m&&(B[d]=((h=d+q)0?h*f:0),k=m+B[d],l=m+C[d],p+=v[k]-v[l],N+=x[k]-x[l],b+=y[k]-y[l],D+=f<<2}}t.putImageData(i,r,o)}}}]); -//# sourceMappingURL=31.623be4e5a35a57db3b0c.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[31],{155:function(t,r,o){"use strict";o.r(r),o.d(r,"default",(function(){return f}));const a=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],e=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function f(t,r,o,f,n,s,u){if(Number.isNaN(s)||s<1)return;s|=0,Number.isNaN(u)&&(u=1),(u|=0)>3&&(u=3),u<1&&(u=1);const i=t.getImageData(r,o,f,n),c=i.data;let p,N,b,m,d,g,h,k,l,w,D,I,J=f-1,j=n-1,q=s+1,v=[],x=[],y=[],z=a[s],A=e[s],B=[],C=[];for(;u-- >0;){for(I=D=0,d=0;dJ?J:g)<<2),p+=c[h++],N+=c[h++],b+=c[h++];for(m=0;m0?h<<2:0),k=I+B[m],l=I+C[m],p+=c[k++]-c[l++],N+=c[k++]-c[l++],b+=c[k++]-c[l++],D++;I+=f<<2}for(m=0;mj?0:f,p+=v[w],N+=x[w],b+=y[w];for(D=m<<2,d=0;d>>A,c[D+1]=N*z>>>A,c[D+2]=b*z>>>A,0==m&&(B[d]=((h=d+q)0?h*f:0),k=m+B[d],l=m+C[d],p+=v[k]-v[l],N+=x[k]-x[l],b+=y[k]-y[l],D+=f<<2}}t.putImageData(i,r,o)}}}]); +//# sourceMappingURL=31.2de22fb7274e1d4a2d03.chunk.js.map \ No newline at end of file diff --git a/public/31.623be4e5a35a57db3b0c.chunk.js.map b/public/31.2de22fb7274e1d4a2d03.chunk.js.map similarity index 99% rename from public/31.623be4e5a35a57db3b0c.chunk.js.map rename to public/31.2de22fb7274e1d4a2d03.chunk.js.map index 6f74f126a..05c769a8d 100644 --- a/public/31.623be4e5a35a57db3b0c.chunk.js.map +++ b/public/31.2de22fb7274e1d4a2d03.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/vendor/fastBlur.js"],"names":["mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","width","height","radius","iterations","Number","isNaN","imageData","getImageData","pixels","data","rsum","gsum","bsum","x","y","i","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","b","mul_sum","shg_sum","vmin","vmax","putImageData"],"mappings":"uFAAA,+CAyCA,MAAMA,EAAY,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAA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","file":"31.623be4e5a35a57db3b0c.chunk.js","sourcesContent":["/*\r\nSuperfast Blur - a fast Box Blur For Canvas\r\n\r\nVersion: 0.5\r\nAuthor: Mario Klingemann\r\nContact: mario@quasimondo.com\r\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\r\nTwitter: @quasimondo\r\n\r\nIn case you find this class useful - especially in commercial projects -\r\nI am not totally unhappy for a small donation to my PayPal account\r\nmario@quasimondo.de\r\n\r\nOr support me on flattr:\r\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\r\n\r\nCopyright (c) 2011 Mario Klingemann\r\n\r\nPermission is hereby granted, free of charge, to any person\r\nobtaining a copy of this software and associated documentation\r\nfiles (the \"Software\"), to deal in the Software without\r\nrestriction, including without limitation the rights to use,\r\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the\r\nSoftware is furnished to do so, subject to the following\r\nconditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\r\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\r\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\nOTHER DEALINGS IN THE SOFTWARE.\r\n*/\r\n\r\n// eslint-disable-next-line max-len\r\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\r\n// eslint-disable-next-line max-len\r\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\r\n\r\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\r\n if (Number.isNaN(radius) || radius < 1) return;\r\n\r\n radius |= 0;\r\n\r\n if (Number.isNaN(iterations)) iterations = 1;\r\n iterations |= 0;\r\n if (iterations > 3) iterations = 3;\r\n if (iterations < 1) iterations = 1;\r\n\r\n const imageData = context.getImageData(top_x, top_y, width, height);\r\n\r\n const pixels = imageData.data;\r\n\r\n let rsum;\r\n let gsum;\r\n let bsum;\r\n let x;\r\n let y;\r\n let i;\r\n let p;\r\n let p1;\r\n let p2;\r\n let yp;\r\n let yi;\r\n let yw;\r\n let wm = width - 1;\r\n let hm = height - 1;\r\n let rad1 = radius + 1;\r\n\r\n let r = [];\r\n let g = [];\r\n let b = [];\r\n\r\n let mul_sum = mul_table[radius];\r\n let shg_sum = shg_table[radius];\r\n\r\n let vmin = [];\r\n let vmax = [];\r\n\r\n while (iterations-- > 0) {\r\n yw = yi = 0;\r\n\r\n for (y = 0; y < height; y++) {\r\n rsum = pixels[yw] * rad1;\r\n gsum = pixels[yw + 1] * rad1;\r\n bsum = pixels[yw + 2] * rad1;\r\n\r\n for (i = 1; i <= radius; i++) {\r\n p = yw + (((i > wm ? wm : i)) << 2);\r\n rsum += pixels[p++];\r\n gsum += pixels[p++];\r\n bsum += pixels[p++];\r\n }\r\n\r\n for (x = 0; x < width; x++) {\r\n r[yi] = rsum;\r\n g[yi] = gsum;\r\n b[yi] = bsum;\r\n\r\n if (y == 0) {\r\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\r\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\r\n }\r\n\r\n p1 = yw + vmin[x];\r\n p2 = yw + vmax[x];\r\n\r\n rsum += pixels[p1++] - pixels[p2++];\r\n gsum += pixels[p1++] - pixels[p2++];\r\n bsum += pixels[p1++] - pixels[p2++];\r\n\r\n yi++;\r\n }\r\n yw += (width << 2);\r\n }\r\n\r\n for (x = 0; x < width; x++) {\r\n yp = x;\r\n rsum = r[yp] * rad1;\r\n gsum = g[yp] * rad1;\r\n bsum = b[yp] * rad1;\r\n\r\n for (i = 1; i <= radius; i++) {\r\n yp += (i > hm ? 0 : width);\r\n rsum += r[yp];\r\n gsum += g[yp];\r\n bsum += b[yp];\r\n }\r\n\r\n yi = x << 2;\r\n for (y = 0; y < height; y++) {\r\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\r\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\r\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\r\n\r\n if (x == 0) {\r\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\r\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\r\n }\r\n\r\n p1 = x + vmin[y];\r\n p2 = x + vmax[y];\r\n\r\n rsum += r[p1] - r[p2];\r\n gsum += g[p1] - g[p2];\r\n bsum += b[p1] - b[p2];\r\n\r\n yi += width << 2;\r\n }\r\n }\r\n }\r\n\r\n context.putImageData(imageData, top_x, top_y);\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/vendor/fastBlur.js"],"names":["mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","width","height","radius","iterations","Number","isNaN","imageData","getImageData","pixels","data","rsum","gsum","bsum","x","y","i","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","b","mul_sum","shg_sum","vmin","vmax","putImageData"],"mappings":"uFAAA,+CAyCA,MAAMA,EAAY,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAA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","file":"31.2de22fb7274e1d4a2d03.chunk.js","sourcesContent":["/*\r\nSuperfast Blur - a fast Box Blur For Canvas\r\n\r\nVersion: 0.5\r\nAuthor: Mario Klingemann\r\nContact: mario@quasimondo.com\r\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\r\nTwitter: @quasimondo\r\n\r\nIn case you find this class useful - especially in commercial projects -\r\nI am not totally unhappy for a small donation to my PayPal account\r\nmario@quasimondo.de\r\n\r\nOr support me on flattr:\r\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\r\n\r\nCopyright (c) 2011 Mario Klingemann\r\n\r\nPermission is hereby granted, free of charge, to any person\r\nobtaining a copy of this software and associated documentation\r\nfiles (the \"Software\"), to deal in the Software without\r\nrestriction, including without limitation the rights to use,\r\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the\r\nSoftware is furnished to do so, subject to the following\r\nconditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\r\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\r\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\nOTHER DEALINGS IN THE SOFTWARE.\r\n*/\r\n\r\n// eslint-disable-next-line max-len\r\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\r\n// eslint-disable-next-line max-len\r\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\r\n\r\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\r\n if (Number.isNaN(radius) || radius < 1) return;\r\n\r\n radius |= 0;\r\n\r\n if (Number.isNaN(iterations)) iterations = 1;\r\n iterations |= 0;\r\n if (iterations > 3) iterations = 3;\r\n if (iterations < 1) iterations = 1;\r\n\r\n const imageData = context.getImageData(top_x, top_y, width, height);\r\n\r\n const pixels = imageData.data;\r\n\r\n let rsum;\r\n let gsum;\r\n let bsum;\r\n let x;\r\n let y;\r\n let i;\r\n let p;\r\n let p1;\r\n let p2;\r\n let yp;\r\n let yi;\r\n let yw;\r\n let wm = width - 1;\r\n let hm = height - 1;\r\n let rad1 = radius + 1;\r\n\r\n let r = [];\r\n let g = [];\r\n let b = [];\r\n\r\n let mul_sum = mul_table[radius];\r\n let shg_sum = shg_table[radius];\r\n\r\n let vmin = [];\r\n let vmax = [];\r\n\r\n while (iterations-- > 0) {\r\n yw = yi = 0;\r\n\r\n for (y = 0; y < height; y++) {\r\n rsum = pixels[yw] * rad1;\r\n gsum = pixels[yw + 1] * rad1;\r\n bsum = pixels[yw + 2] * rad1;\r\n\r\n for (i = 1; i <= radius; i++) {\r\n p = yw + (((i > wm ? wm : i)) << 2);\r\n rsum += pixels[p++];\r\n gsum += pixels[p++];\r\n bsum += pixels[p++];\r\n }\r\n\r\n for (x = 0; x < width; x++) {\r\n r[yi] = rsum;\r\n g[yi] = gsum;\r\n b[yi] = bsum;\r\n\r\n if (y == 0) {\r\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\r\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\r\n }\r\n\r\n p1 = yw + vmin[x];\r\n p2 = yw + vmax[x];\r\n\r\n rsum += pixels[p1++] - pixels[p2++];\r\n gsum += pixels[p1++] - pixels[p2++];\r\n bsum += pixels[p1++] - pixels[p2++];\r\n\r\n yi++;\r\n }\r\n yw += (width << 2);\r\n }\r\n\r\n for (x = 0; x < width; x++) {\r\n yp = x;\r\n rsum = r[yp] * rad1;\r\n gsum = g[yp] * rad1;\r\n bsum = b[yp] * rad1;\r\n\r\n for (i = 1; i <= radius; i++) {\r\n yp += (i > hm ? 0 : width);\r\n rsum += r[yp];\r\n gsum += g[yp];\r\n bsum += b[yp];\r\n }\r\n\r\n yi = x << 2;\r\n for (y = 0; y < height; y++) {\r\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\r\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\r\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\r\n\r\n if (x == 0) {\r\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\r\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\r\n }\r\n\r\n p1 = x + vmin[y];\r\n p2 = x + vmax[y];\r\n\r\n rsum += r[p1] - r[p2];\r\n gsum += g[p1] - g[p2];\r\n bsum += b[p1] - b[p2];\r\n\r\n yi += width << 2;\r\n }\r\n }\r\n }\r\n\r\n context.putImageData(imageData, top_x, top_y);\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/4.6b5dd97948b29c598f75.chunk.js b/public/4.ec435aa1cabc18e1be43.chunk.js similarity index 82% rename from public/4.6b5dd97948b29c598f75.chunk.js rename to public/4.ec435aa1cabc18e1be43.chunk.js index d4e72d6f2..1e209e92f 100644 --- a/public/4.6b5dd97948b29c598f75.chunk.js +++ b/public/4.ec435aa1cabc18e1be43.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[4,29],{19:function(e,t,n){"use strict";n.r(t);var a=n(7),i=n(9),o=n(17),u=n(16),c=n(62),l=function(e,t,n,a){return new(n||(n=Promise))((function(i,o){function u(e){try{l(a.next(e))}catch(e){o(e)}}function c(e){try{l(a.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(u,c)}l((a=a.apply(e,t||[])).next())}))};const r=new c.a("page-chats",!1,()=>(o.default.pushToState("authState",{_:"authStateSignedIn"}),Promise.resolve().then(n.bind(null,15)).then(e=>{e.default.dispatchEvent("im_mount")}),u.default.requestedServerLanguage||u.default.getCacheLangPack().then(e=>{e.local&&u.default.getLangPack(e.lang_code)}),Object(a.a)(),Object(i.a)().then(()=>new Promise(e=>{window.requestAnimationFrame(()=>{Promise.all([n.e(3),n.e(5),n.e(6),n.e(14)]).then(n.bind(null,142)).finally(()=>l(void 0,void 0,void 0,(function*(){e()})))})}))));t.default=r}}]); -//# sourceMappingURL=4.6b5dd97948b29c598f75.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[4,29],{19:function(e,t,n){"use strict";n.r(t);var a=n(7),i=n(9),o=n(17),u=n(16),c=n(64),l=function(e,t,n,a){return new(n||(n=Promise))((function(i,o){function u(e){try{l(a.next(e))}catch(e){o(e)}}function c(e){try{l(a.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(u,c)}l((a=a.apply(e,t||[])).next())}))};const r=new c.a("page-chats",!1,()=>(o.default.pushToState("authState",{_:"authStateSignedIn"}),Promise.resolve().then(n.bind(null,15)).then(e=>{e.default.dispatchEvent("im_mount")}),u.default.requestedServerLanguage||u.default.getCacheLangPack().then(e=>{e.local&&u.default.getLangPack(e.lang_code)}),Object(a.a)(),Object(i.a)().then(()=>new Promise(e=>{window.requestAnimationFrame(()=>{Promise.all([n.e(3),n.e(5),n.e(6),n.e(14)]).then(n.bind(null,148)).finally(()=>l(void 0,void 0,void 0,(function*(){e()})))})}))));t.default=r}}]); +//# sourceMappingURL=4.ec435aa1cabc18e1be43.chunk.js.map \ No newline at end of file diff --git a/public/4.6b5dd97948b29c598f75.chunk.js.map b/public/4.ec435aa1cabc18e1be43.chunk.js.map similarity index 98% rename from public/4.6b5dd97948b29c598f75.chunk.js.map rename to public/4.ec435aa1cabc18e1be43.chunk.js.map index bc5901ff2..b9b4b0994 100644 --- a/public/4.6b5dd97948b29c598f75.chunk.js.map +++ b/public/4.ec435aa1cabc18e1be43.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/pages/pageIm.ts"],"names":["page","pushToState","_","then","m","default","dispatchEvent","requestedServerLanguage","getCacheLangPack","langPack","local","getLangPack","lang_code","Promise","resolve","window","requestAnimationFrame","finally"],"mappings":"wFAAA,iD,sSAyFA,MAAMA,EAAO,IAAI,IAAK,cAAc,EA7EjB,KAEjB,UAAgBC,YAAY,YAAa,CAACC,EAAG,sBAI7C,wCAA2BC,KAAKC,IAC9BA,EAAEC,QAAQC,cAAc,cAGtB,UAAKC,yBACP,UAAKC,mBAAmBL,KAAKM,IACxBA,EAASC,OACV,UAAKC,YAAYF,EAASG,aAKhC,cACO,cAAYT,KAAK,IACf,IAAIU,QAAeC,IACxBC,OAAOC,sBAAsB,KAET,mEACRC,QAAQ,IAAW,OAAD,6BAExBH,eAoDG","file":"4.6b5dd97948b29c598f75.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport loadFonts from \"../helpers/dom/loadFonts\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n //return;\r\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n import('../lib/rootScope').then(m => {\r\n m.default.dispatchEvent('im_mount');\r\n });\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 blurActiveElement();\r\n return loadFonts().then(() => {\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(() => {\r\n // setTimeout(() => {\r\n const promise = import('../lib/appManagers/appDialogsManager');\r\n promise.finally(async() => {\r\n //alert('pageIm!');\r\n resolve();\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 // }, 5e3);\r\n });\r\n })\r\n });\r\n\r\n //let promise = /* Promise.resolve() */.then(() => {//import('../lib/services').then(services => {\r\n /* fetch('assets/img/camomile.jpg')\r\n .then(res => res.blob())\r\n .then(blob => {\r\n let img = new Image();\r\n let url = URL.createObjectURL(blob);\r\n img.src = url;\r\n img.onload = () => {\r\n let id = 'chat-background-canvas';\r\n var canvas = document.getElementById(id) as HTMLCanvasElement;\r\n //URL.revokeObjectURL(url);\r\n \r\n let elements = ['.chat-container'].map(selector => {\r\n return document.querySelector(selector) as HTMLDivElement;\r\n });\r\n \r\n stackBlurImage(img, id, 15, 0);\r\n \r\n canvas.toBlob(blob => {\r\n //let dataUrl = canvas.toDataURL('image/jpeg', 1);\r\n let dataUrl = URL.createObjectURL(blob);\r\n \r\n elements.forEach(el => {\r\n el.style.backgroundImage = 'url(' + dataUrl + ')';\r\n });\r\n }, 'image/jpeg', 1);\r\n };\r\n }); */\r\n //});\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/pages/pageIm.ts"],"names":["page","pushToState","_","then","m","default","dispatchEvent","requestedServerLanguage","getCacheLangPack","langPack","local","getLangPack","lang_code","Promise","resolve","window","requestAnimationFrame","finally"],"mappings":"wFAAA,iD,sSAyFA,MAAMA,EAAO,IAAI,IAAK,cAAc,EA7EjB,KAEjB,UAAgBC,YAAY,YAAa,CAACC,EAAG,sBAI7C,wCAA2BC,KAAKC,IAC9BA,EAAEC,QAAQC,cAAc,cAGtB,UAAKC,yBACP,UAAKC,mBAAmBL,KAAKM,IACxBA,EAASC,OACV,UAAKC,YAAYF,EAASG,aAKhC,cACO,cAAYT,KAAK,IACf,IAAIU,QAAeC,IACxBC,OAAOC,sBAAsB,KAET,mEACRC,QAAQ,IAAW,OAAD,6BAExBH,eAoDG","file":"4.ec435aa1cabc18e1be43.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport loadFonts from \"../helpers/dom/loadFonts\";\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport Page from \"./page\";\r\n\r\nlet onFirstMount = () => {\r\n //return;\r\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\r\n // ! TOO SLOW\r\n /* appStateManager.saveState(); */\r\n\r\n import('../lib/rootScope').then(m => {\r\n m.default.dispatchEvent('im_mount');\r\n });\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 blurActiveElement();\r\n return loadFonts().then(() => {\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(() => {\r\n // setTimeout(() => {\r\n const promise = import('../lib/appManagers/appDialogsManager');\r\n promise.finally(async() => {\r\n //alert('pageIm!');\r\n resolve();\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 // }, 5e3);\r\n });\r\n })\r\n });\r\n\r\n //let promise = /* Promise.resolve() */.then(() => {//import('../lib/services').then(services => {\r\n /* fetch('assets/img/camomile.jpg')\r\n .then(res => res.blob())\r\n .then(blob => {\r\n let img = new Image();\r\n let url = URL.createObjectURL(blob);\r\n img.src = url;\r\n img.onload = () => {\r\n let id = 'chat-background-canvas';\r\n var canvas = document.getElementById(id) as HTMLCanvasElement;\r\n //URL.revokeObjectURL(url);\r\n \r\n let elements = ['.chat-container'].map(selector => {\r\n return document.querySelector(selector) as HTMLDivElement;\r\n });\r\n \r\n stackBlurImage(img, id, 15, 0);\r\n \r\n canvas.toBlob(blob => {\r\n //let dataUrl = canvas.toDataURL('image/jpeg', 1);\r\n let dataUrl = URL.createObjectURL(blob);\r\n \r\n elements.forEach(el => {\r\n el.style.backgroundImage = 'url(' + dataUrl + ')';\r\n });\r\n }, 'image/jpeg', 1);\r\n };\r\n }); */\r\n //});\r\n};\r\n\r\nconst page = new Page('page-chats', false, onFirstMount);\r\nexport default page;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/5.5145323b4bc82cc62ff7.chunk.js b/public/5.5145323b4bc82cc62ff7.chunk.js new file mode 100644 index 000000000..8a9c262c0 --- /dev/null +++ b/public/5.5145323b4bc82cc62ff7.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[5],{108:function(e,t,n){"use strict";function o(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function i(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function s(e,t,n){const o=n?n.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach(e=>{o(e,t,!1)})}function r(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function c(){return!!r()}n.d(t,"e",(function(){return o})),n.d(t,"b",(function(){return i})),n.d(t,"a",(function(){return s})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}))},126:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return i}));function o(e,t){const n=""["".length-1]||"";let o;switch(e._){case"inputPhotoFileLocation":o=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":o=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":o=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":o=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":o=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":o=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),o=""}return o+(n?"."+n:n)}function i(e,t){return"/"+e+"/"+encodeURIComponent(JSON.stringify(t))}},138:function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var o=n(73);var i=function(e,t){let n,o,i,s={},r=0,c=0,a=0,l=0,d=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,i=new Image,i.src=e.src,i.draggable=!1,i.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),n=document.createElement("div"),n.classList.add("crop-component"),o=document.createElement("div"),o.classList.add("crop-overlay");const s=document.createElement("div");s.classList.add("crop-overlay-color"),n.appendChild(o);e.parentNode.appendChild(n),n.appendChild(i),n.appendChild(e),n.appendChild(s),o.appendChild(i),i.style.maxWidth=e.width+"px",d=e.naturalWidth/e.offsetWidth;const r=e.offsetWidth/2-100,c=e.offsetHeight/2-100;u(200,200),p(r,c),m(r,c),o.addEventListener("mousedown",g,!1),o.addEventListener("touchstart",g,!1),o.addEventListener("wheel",b,!1),document.addEventListener("keypress",v,!1)}function u(e,t){a=e*d,l=t*d,o.style.width=e+"px",o.style.height=t+"px"}function p(e,t){c=t*d,r=e*d,i.style.top=-t+"px",i.style.left=-e+"px"}function m(e,t){o.style.top=t+"px",o.style.left=e+"px"}function f(e){e=e*Math.PI*2;let t,n,s,r,c=Math.floor(o.clientWidth+e),a=Math.floor(o.clientHeight+e),l=i.clientWidth,d=i.clientHeight;c<50||c>l||(t=o.offsetLeft-e/2,n=o.offsetTop-e/2,s=t+c,r=n+a,t<0&&(t=0),n<0&&(n=0),s>l||r>d||(u(c,c),p(t,n),m(t,n)))}function v(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":f(4);break;case"-":f(-4)}}function b(e){e.preventDefault(),f(e.deltaY>0?1:-1)}function g(e){e.preventDefault(),e.stopPropagation(),function(e){s.container_width=o.offsetWidth,s.container_height=o.offsetHeight,s.container_left=o.offsetLeft,s.container_top=o.offsetTop,s.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,s.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",E),document.addEventListener("touchmove",E),document.addEventListener("mouseup",w),document.addEventListener("touchend",w)}function w(e){e.preventDefault(),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",E),document.removeEventListener("touchmove",E)}function E(e){let t,n,r,c,a={x:0,y:0};e.preventDefault(),e.stopPropagation(),a.x=e.pageX||e.touches&&e.touches[0].pageX,a.y=e.pageY||e.touches&&e.touches[0].pageY,t=a.x-(s.mouse_x-s.container_left),n=a.y-(s.mouse_y-s.container_top),r=o.offsetWidth,c=o.offsetHeight,t<0?t=0:t>i.offsetWidth-r&&(t=i.offsetWidth-r),n<0?n=0:n>i.offsetHeight-c&&(n=i.offsetHeight-c),p(t,n),m(t,n)}return e.complete?h():e.onload=h,{crop:function(){t.width=a,t.height=l,t.getContext("2d").drawImage(e,r,c,a,l,0,0,a,l)},removeHandlers:function(){o.removeEventListener("mousedown",g),o.removeEventListener("touchstart",g),o.removeEventListener("wheel",b),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",E),document.removeEventListener("touchmove",E),document.removeEventListener("keypress",v),n.remove(),o.remove(),i.remove()}}},s=n(59),r=n(16),c=n(88),a=n(30);class l extends s.b{constructor(){super("popup-avatar",null,{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),Object(r._i18n)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",e=>{const t=e.target.files[0];t&&Object(c.b)(t).then(e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=i(this.image,this.canvas),this.input.value=""}})},!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",Object(a.b)(this.btnConfirm,()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob(e=>{this.blob=e,this.darkenCanvas(),this.resolve()},"image/jpeg",1)},{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()})}resolve(){this.onCrop(()=>o.a.upload(this.blob))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){let e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},142:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var o=n(15),i=n(0);function s(e){if("Enter"===e.key&&!i.IS_MOBILE&&!e.isComposing){if("enter"===o.default.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=i.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(i.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},59:function(e,t,n){"use strict";n.d(t,"b",(function(){return E})),n.d(t,"a",(function(){return y}));var o=n(15),i=n(18),s=n(68),r=n(50),c=n(16),a=n(6),l=n(7),d=n(87),h=n(30),u=n(142),p=n(5),m=n(54),f=n(41),v=n(108);const b=document.body;let g=b;const w=()=>{g=Object(v.c)()||b,E.reAppend()};Object(v.a)(b,w);class E extends m.a{constructor(e,t,n={}){super(!1),this.buttons=t,this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{r.a.backByItem(this.navigationItem)},this.destroy=()=>{this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.withoutOverlay||(o.default.isOverlayActive=!1),r.a.removeItem(this.navigationItem),this.navigationItem=void 0,Object(f.e)(E.POPUPS,this),w(),setTimeout(()=>{this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),this.withoutOverlay||s.a.checkAnimations(!1)},150)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),this.title.classList.add("popup-title"),this.header.append(this.title),this.listenerSetter=new d.a,this.confirmShortcutIsSendShortcut=n.confirmShortcutIsSendShortcut,n.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),Object(h.b)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=n.withoutOverlay,n.overlayClosable&&Object(h.b)(this.element,e=>{Object(a.a)(e.target,"popup-container")||this.hide()},{listenerSetter:this.listenerSetter}),n.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==n.withConfirm&&this.btnConfirm.append(Object(c.i18n)(n.withConfirm)),this.header.append(this.btnConfirm),Object(i.ripple)(this.btnConfirm)),this.container.append(this.header),n.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body));let l=this.btnConfirm;if(null==t?void 0:t.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons"),2===t.length&&e.classList.add("popup-buttons-row");const n=t.map(e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),Object(i.ripple)(t),e.text?t.innerHTML=e.text:t.append(Object(c.i18n)(e.langKey,e.langArgs)),Object(h.b)(t,()=>{e.callback&&e.callback(),this.destroy()},{listenerSetter:this.listenerSetter,once:!0}),e.element=t});if(!l&&2===t.length){const e=t.find(e=>!e.isCancel);e&&(l=e.element)}e.append(...n),this.container.append(e)}this.btnConfirmOnEnter=l,this.element.append(this.container),E.POPUPS.push(this)}show(){this.navigationItem={type:"popup",onPop:this.destroy,onEscape:this.onEscape},r.a.pushItem(this.navigationItem),Object(l.a)(),g.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.withoutOverlay||(o.default.isOverlayActive=!0,s.a.checkAnimations(!0)),this.btnConfirmOnEnter&&setTimeout(()=>{this.listenerSetter.add(document.body)("keydown",e=>{(this.confirmShortcutIsSendShortcut?Object(u.a)(e):"Enter"===e.key)&&(Object(h.d)(this.btnConfirmOnEnter),Object(p.a)(e))})},0)}static reAppend(){this.POPUPS.forEach(e=>{const{element:t,container:n}=e,o=t.parentElement;o&&o!==g&&g!==n&&g.append(t)})}static getPopup(e){return this.POPUPS.find(t=>t instanceof e)}}E.POPUPS=[];const y=e=>(e.find(e=>e.isCancel)||e.push({langKey:"Cancel",isCancel:!0}),e)},73:function(e,t,n){"use strict";var o=n(15),i=n(33),s=n(46),r=n(126),c=n(119),a=n(29);const l=new class{constructor(){this.cacheStorage=new c.a("cachedFiles"),this.downloads={},this.progress={},this.progressCallbacks={},this.uploadId=0,this.thumbsCache={photo:{},document:{}},o.default.addEventListener("download_progress",e=>{const t=e;this.progress[t.fileName]=t;const n=this.progressCallbacks[t.fileName];n&&n.forEach(e=>e(t));const o=this.downloads[t.fileName];o&&o.notifyAll(t)})}getNewDeferred(e){const t=Object(s.a)();return t.cancel=()=>{const n=new Error("Download canceled");n.name="AbortError",i.a.cancelDownload(e),t.reject(n),t.cancel=()=>{}},t.finally(()=>{delete this.progress[e],delete this.progressCallbacks[e]}),t.catch(()=>{this.clearDownload(e)}),this.downloads[e]=t}clearDownload(e){delete this.downloads[e]}fakeDownload(e,t){const n=this.getNewDeferred(e);return"string"==typeof t?fetch(t).then(e=>e.blob()).then(e=>n.resolve(e)):n.resolve(t),n}download(e){const t=Object(r.a)(e.location,{fileName:e.fileName});if(this.downloads.hasOwnProperty(t))return this.downloads[t];const n=this.getNewDeferred(t),o=e=>{n.reject(e)};return(()=>{if(!i.a.worker||e.onlyCache){const s=this.cacheStorage.getFile(t).then(t=>{if(t.sizei.a.downloadFile(e).then(n.resolve,o))}i.a.downloadFile(e).then(n.resolve,o)})(),n}upload(e,t){if(!t){const n=null==e?void 0:e.type;if(n){const e=this.uploadId+++"."+n.split("/")[1];t=["image/jpeg","image/png","image/bmp"].indexOf(n)>=0?"photo"+e:0===n.indexOf("audio/")||["video/ogg"].indexOf(n)>=0?"audio"+e:0===n.indexOf("video/")?"video"+e:"document"+e}else t="upload-"+this.uploadId++}const n=this.getNewDeferred(t);return i.a.uploadFile({file:e,fileName:t}).then(n.resolve,n.reject),n.finally(()=>{this.clearDownload(t)}),n}getDownload(e){return this.downloads[e]}addProgressCallback(e,t){var n;const o=this.progress[e];(null!==(n=this.progressCallbacks[e])&&void 0!==n?n:this.progressCallbacks[e]=[]).push(t),o&&t(o)}createDownloadAnchor(e,t,n){const o=document.createElement("a");o.href=e,o.download=t,o.target="_blank",o.style.position="absolute",o.style.top="1px",o.style.left="1px",document.body.append(o);try{var i=document.createEvent("MouseEvents");i.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),o.dispatchEvent(i)}catch(t){console.error("Download click error",t);try{o.click()}catch(t){window.open(e,"_blank")}}setTimeout(()=>{o.remove(),n&&n()},100)}downloadToDisc(e,t){const n=this.download(e);return n.then(e=>{const n=URL.createObjectURL(e);this.createDownloadAnchor(n,t,()=>{URL.revokeObjectURL(n)})}),n}getCacheContext(e,t="full"){var n,o;const i=null!==(n=this.thumbsCache[e._][e.id])&&void 0!==n?n:this.thumbsCache[e._][e.id]={};return null!==(o=i[t])&&void 0!==o?o:i[t]={downloaded:0,url:""}}};a.a&&(a.a.appDownloadManager=l),t.a=l},87:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));class o{constructor(){this.listeners=new Set}add(e){return(t,n,o)=>{const i={element:e,event:t,callback:n,options:o};return this.addManual(i),i}}addManual(e){var t;e.element.addEventListener(e.event,e.callback,e.options),(null===(t=e.options)||void 0===t?void 0:t.once)&&(e.onceCallback=()=>{this.remove(e),e.onceFired=!0},e.element.addEventListener(e.event,e.onceCallback,e.options)),this.listeners.add(e)}remove(e){e.onceFired||(e.element.removeEventListener(e.event,e.callback,e.options),e.onceCallback&&e.element.removeEventListener(e.event,e.onceCallback,e.options)),this.listeners.delete(e)}removeManual(e,t,n,o){let i;for(const s of this.listeners)if(s.element===e&&s.event===t&&s.callback===n&&s.options===o){i=s;break}i&&this.remove(i)}removeAll(){this.listeners.forEach(e=>{this.remove(e)})}}}}]); +//# sourceMappingURL=5.5145323b4bc82cc62ff7.chunk.js.map \ No newline at end of file diff --git a/public/5.5145323b4bc82cc62ff7.chunk.js.map b/public/5.5145323b4bc82cc62ff7.chunk.js.map new file mode 100644 index 000000000..7ae800a1d --- /dev/null +++ b/public/5.5145323b4bc82cc62ff7.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/dom/fullScreen.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/lib/cropper.ts","webpack:///./src/components/popups/avatar.ts","webpack:///./src/helpers/dom/isSendShortcutPressed.ts","webpack:///./src/components/popups/index.ts","webpack:///./src/lib/appManagers/appDownloadManager.ts","webpack:///./src/helpers/listenerSetter.ts"],"names":["requestFullScreen","element","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","document","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","callback","listenerSetter","addListener","add","addEventListener","bind","split","forEach","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getFileNameByLocation","location","options","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","getFileURL","type","encodeURIComponent","JSON","stringify","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","classList","draggable","Image","src","createElement","overlayColor","appendChild","parentNode","style","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","e","preventDefault","String","fromCharCode","charCode","deltaY","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","clientX","pageX","touches","window","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","onload","crop","getContext","drawImage","removeHandlers","remove","super","closable","withConfirm","image","cropper","this","h6","btnClose","header","append","cropContainer","input","display","file","target","files","then","contents","show","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","upload","postCanvas","click","ctx","fillStyle","fillRect","isSendShortcutPressed","key","isComposing","settings","sendShortcut","shiftKey","ctrlKey","metaKey","secondaryKey","DEFAULT_APPEND_TO","body","appendPopupTo","onFullScreenChange","PopupElement","reAppend","buttons","title","onEscape","backByItem","navigationItem","destroy","dispatchEvent","removeAll","withoutOverlay","isOverlayActive","removeItem","undefined","POPUPS","setTimeout","cleanup","checkAnimations","confirmShortcutIsSendShortcut","prepend","once","overlayClosable","btnConfirmOnEnter","buttonsDiv","buttonsEl","buttonsElements","map","b","button","isDanger","text","innerHTML","langKey","langArgs","find","isCancel","push","onPop","pushItem","popup","parentElement","popupConstructor","addCancelButton","cacheStorage","downloads","progress","progressCallbacks","uploadId","thumbsCache","photo","details","fileName","callbacks","download","notifyAll","deferred","cancel","Error","name","cancelDownload","reject","finally","catch","clearDownload","getNewDeferred","fetch","response","hasOwnProperty","onError","err","worker","onlyCache","promise","getFile","size","downloadFile","tryDownload","mimeType","indexOf","uploadFile","onRemove","a","href","position","clickEvent","createEvent","initMouseEvent","open","discFileName","objectURL","URL","createObjectURL","createDownloadAnchor","revokeObjectURL","media","thumbSize","cache","downloaded","ListenerSetter","listeners","Set","event","listener","addManual","onceCallback","onceFired","delete","_listener"],"mappings":"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","file":"5.5145323b4bc82cc62ff7.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from \"../listenerSetter\";\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach(eventName => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement, \r\n container: HTMLDivElement, \r\n cropImage: HTMLImageElement, \r\n event_state: Partial<{ \r\n mouse_x: number, \r\n mouse_y: number, \r\n container_width: number, \r\n container_height: number, \r\n container_left: number, \r\n container_top: number\r\n }> = {}, \r\n keyZoomValue = 4.0, \r\n MINWIDTH = 50, \r\n MINHEIGHT = 50, \r\n CROPWIDTH = 200, \r\n CROPHEIGHT = 200, \r\n cropLeft = 0, \r\n cropTop = 0, \r\n cropWidth = 0, \r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n \r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n \r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n \r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n \r\n document.addEventListener('keypress', keyHandler, false);\r\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n \r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n \r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n \r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n \r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n \r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n \r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n \r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n \r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n //crop();\r\n }\r\n \r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n \r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n \r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n \r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n \r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n \r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n \r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom), \r\n newHeight = Math.floor(container.clientHeight + zoom), \r\n w = cropImage.clientWidth, \r\n h = cropImage.clientHeight, \r\n left: number, \r\n top: number, \r\n right: number, \r\n bottom: number;\r\n \r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n \r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n \r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n \r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n \r\n switch (String.fromCharCode(e.charCode)) {\r\n case '+' :\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-' :\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n \r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n \r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n saveEventState(e);\r\n \r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n \r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n \r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0}, \r\n left: number, \r\n top: number, \r\n w: number, \r\n h: number;\r\n \r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n \r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n \r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n \r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n \r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { readBlobAsDataURL } from \"../../helpers/blob\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', null, {closable: true, withConfirm: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.listenerSetter.add(this.input)('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n\r\n readBlobAsDataURL(file).then(contents => {\r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n \r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n \r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n });\r\n }, false);\r\n\r\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n attachClickEvent(this.btnConfirm, () => {\r\n this.cropper.crop();\r\n this.hide();\r\n\r\n this.canvas.toBlob(blob => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\r\n\r\n this.addEventListener('closeAfterTimeout', () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n });\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { IS_MOBILE, IS_APPLE } from \"../../environment/userAgent\";\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '
';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSendShortcutPressed from \"../../helpers/dom/isSendShortcutPressed\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\nimport { addFullScreenListener, getFullScreenElement, isFullScreen } from \"../../helpers/dom/fullScreen\";\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: true, \r\n overlayClosable: true, \r\n withConfirm: LangPackKey | true, \r\n body: true,\r\n confirmShortcutIsSendShortcut: boolean,\r\n withoutOverlay: boolean\r\n}>;\r\n\r\nexport interface PopupElementConstructable {\r\n new(...args: any[]): PopupElement;\r\n}\r\n\r\nconst DEFAULT_APPEND_TO = document.body;\r\nlet appendPopupTo = DEFAULT_APPEND_TO;\r\n\r\nconst onFullScreenChange = () => {\r\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\r\n PopupElement.reAppend();\r\n};\r\n\r\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\r\n\r\nexport default class PopupElement extends EventListenerBase<{\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n}> {\r\n private static POPUPS: PopupElement[] = [];\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLButtonElement;\r\n\r\n protected withoutOverlay: boolean;\r\n\r\n constructor(className: string, protected buttons?: Array, options: PopupOptions = {}) {\r\n super(false);\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n this.title.classList.add('popup-title');\r\n\r\n this.header.append(this.title);\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n //ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n this.withoutOverlay = options.withoutOverlay;\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n if(buttons?.length) {\r\n const buttonsDiv = this.buttonsEl = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n\r\n if(buttons.length === 2) {\r\n buttonsDiv.classList.add('popup-buttons-row');\r\n }\r\n \r\n const buttonsElements = buttons.map(b => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n \r\n ripple(button);\r\n \r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n \r\n attachClickEvent(button, () => {\r\n b.callback && b.callback();\r\n this.destroy();\r\n }, {listenerSetter: this.listenerSetter, once: true});\r\n \r\n return b.element = button;\r\n });\r\n \r\n if(!btnConfirmOnEnter && buttons.length === 2) {\r\n const button = buttons.find(button => !button.isCancel);\r\n if(button) {\r\n btnConfirmOnEnter = button.element;\r\n }\r\n }\r\n\r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.btnConfirmOnEnter = btnConfirmOnEnter;\r\n\r\n this.element.append(this.container);\r\n\r\n PopupElement.POPUPS.push(this);\r\n }\r\n\r\n public show() {\r\n this.navigationItem = {\r\n type: 'popup',\r\n onPop: this.destroy,\r\n onEscape: this.onEscape\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n\r\n blurActiveElement(); // * hide mobile keyboard\r\n appendPopupTo.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n if(this.btnConfirmOnEnter) {\r\n setTimeout(() => {\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\r\n simulateClickEvent(this.btnConfirmOnEnter);\r\n cancelEvent(e);\r\n }\r\n });\r\n }, 0);\r\n }\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.backByItem(this.navigationItem);\r\n };\r\n\r\n private destroy = () => {\r\n this.dispatchEvent('close');\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n this.listenerSetter.removeAll();\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = false;\r\n }\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n indexOfAndSplice(PopupElement.POPUPS, this);\r\n\r\n // ! calm\r\n onFullScreenChange();\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n\r\n if(!this.withoutOverlay) {\r\n animationIntersector.checkAnimations(false);\r\n }\r\n }, 150);\r\n };\r\n\r\n public static reAppend() {\r\n this.POPUPS.forEach(popup => {\r\n const {element, container} = popup;\r\n const parentElement = element.parentElement;\r\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\r\n appendPopupTo.append(element);\r\n }\r\n });\r\n }\r\n\r\n public static getPopup(popupConstructor: PopupElementConstructable) {\r\n return this.POPUPS.find(element => element instanceof popupConstructor);\r\n }\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find(b => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport type { ApiError } from \"../mtproto/apiManager\";\r\nimport type { MyDocument } from \"./appDocsManager\";\r\nimport type { MyPhoto } from \"./appPhotosManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { deferredPromise, CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { InputFile } from \"../../layer\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise;\r\nexport type DownloadJson = CancellablePromise;\r\n//export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\nexport type ThumbCache = {\r\n downloaded: number, \r\n url: string\r\n};\r\n\r\nexport type ThumbsCache = {\r\n [id: string]: {\r\n [size: string]: ThumbCache\r\n }\r\n};\r\n\r\nexport class AppDownloadManager {\r\n public cacheStorage = new CacheStorageController('cachedFiles');\r\n private downloads: {[fileName: string]: Download} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n private progressCallbacks: {[fileName: string]: Array} = {};\r\n\r\n private uploadId = 0;\r\n\r\n private thumbsCache: {\r\n photo: ThumbsCache,\r\n document: ThumbsCache\r\n } = {\r\n photo: {},\r\n document: {}\r\n };\r\n\r\n constructor() {\r\n rootScope.addEventListener('download_progress', (e) => {\r\n const details = e as {done: number, fileName: string, total: number, offset: number};\r\n this.progress[details.fileName] = details;\r\n\r\n const callbacks = this.progressCallbacks[details.fileName];\r\n if(callbacks) {\r\n callbacks.forEach(callback => callback(details));\r\n }\r\n\r\n const download = this.downloads[details.fileName];\r\n if(download) {\r\n download.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred(fileName: string) {\r\n const deferred = deferredPromise();\r\n\r\n deferred.cancel = () => {\r\n //try {\r\n const error = new Error('Download canceled');\r\n error.name = 'AbortError';\r\n \r\n apiManager.cancelDownload(fileName);\r\n \r\n deferred.reject(error);\r\n deferred.cancel = () => {};\r\n /* } catch(err) {\r\n\r\n } */\r\n };\r\n\r\n deferred.finally(() => {\r\n delete this.progress[fileName];\r\n delete this.progressCallbacks[fileName];\r\n });\r\n\r\n deferred.catch(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return this.downloads[fileName] = deferred as any;\r\n }\r\n\r\n private clearDownload(fileName: string) {\r\n delete this.downloads[fileName];\r\n }\r\n\r\n public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then(response => response.blob())\r\n .then(blob => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getFileNameByLocation(options.location, {fileName: options.fileName});\r\n if(this.downloads.hasOwnProperty(fileName)) return this.downloads[fileName];\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n\r\n const onError = (err: ApiError) => {\r\n deferred.reject(err);\r\n };\r\n\r\n const tryDownload = (): Promise => {\r\n //return Promise.resolve();\r\n\r\n if(!apiManager.worker || options.onlyCache) {\r\n const promise = this.cacheStorage.getFile(fileName).then((blob) => {\r\n if(blob.size < options.size) throw 'wrong size';\r\n else deferred.resolve(blob);\r\n });\r\n \r\n if(options.onlyCache) return promise.catch(onError);\r\n return promise.catch(() => {\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n });\r\n } else {\r\n /* return apiManager.downloadFile(options).then(res => {\r\n setTimeout(() => deferred.resolve(res), 5e3);\r\n }, onError); */\r\n\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n }\r\n };\r\n\r\n tryDownload();\r\n\r\n //console.log('Will download file:', fileName, url);\r\n return deferred;\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string) {\r\n if(!fileName) {\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = this.uploadId++ + '.' + mimeType.split('/')[1];\r\n \r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n \r\n } else {\r\n fileName = 'upload-' + this.uploadId++;\r\n }\r\n }\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n apiManager.uploadFile({file, fileName}).then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as any as CancellablePromise;\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloads[fileName];\r\n }\r\n\r\n public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n const progress = this.progress[fileName];\r\n (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n if(progress) {\r\n callback(progress);\r\n }\r\n }\r\n\r\n public createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n a.target = '_blank';\r\n \r\n a.style.position = 'absolute';\r\n a.style.top = '1px';\r\n a.style.left = '1px';\r\n \r\n document.body.append(a);\r\n \r\n try {\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n a.dispatchEvent(clickEvent);\r\n } catch (e) {\r\n console.error('Download click error', e);\r\n try {\r\n a.click();\r\n } catch (e) {\r\n window.open(url as string, '_blank');\r\n }\r\n }\r\n \r\n setTimeout(() => {\r\n a.remove();\r\n onRemove && onRemove();\r\n }, 100);\r\n }\r\n\r\n /* public downloadToDisc(fileName: string, url: string) {\r\n this.createDownloadAnchor(url);\r\n \r\n return this.download(fileName, url);\r\n } */\r\n\r\n public downloadToDisc(options: DownloadOptions, discFileName: string) {\r\n const download = this.download(options);\r\n download/* .promise */.then(blob => {\r\n const objectURL = URL.createObjectURL(blob);\r\n this.createDownloadAnchor(objectURL, discFileName, () => {\r\n URL.revokeObjectURL(objectURL);\r\n });\r\n });\r\n \r\n return download;\r\n }\r\n\r\n public getCacheContext(media: MyPhoto | MyDocument, thumbSize: string = 'full'): ThumbCache {\r\n /* if(media._ === 'photo' && thumbSize !== 'i') {\r\n thumbSize = 'full';\r\n } */\r\n\r\n const cache = this.thumbsCache[media._][media.id] ?? (this.thumbsCache[media._][media.id] = {});\r\n return cache[thumbSize] ?? (cache[thumbSize] = {downloaded: 0, url: ''});\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\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"],"sourceRoot":""} \ No newline at end of file diff --git a/public/5.faa04da46f838e65acdf.chunk.js b/public/5.faa04da46f838e65acdf.chunk.js deleted file mode 100644 index e646ef9c9..000000000 --- a/public/5.faa04da46f838e65acdf.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[5],{122:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return i}));function o(e,t){const n=""["".length-1]||"";let o;switch(e._){case"inputPhotoFileLocation":o=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":o=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":o=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":o=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":o=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":o=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),o=""}return o+(n?"."+n:n)}function i(e,t){return"/"+e+"/"+encodeURIComponent(JSON.stringify(t))}},134:function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var o=n(73);var i=function(e,t){let n,o,i,s={},a=0,r=0,c=0,l=0,d=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,i=new Image,i.src=e.src,i.draggable=!1,i.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),n=document.createElement("div"),n.classList.add("crop-component"),o=document.createElement("div"),o.classList.add("crop-overlay");const s=document.createElement("div");s.classList.add("crop-overlay-color"),n.appendChild(o);e.parentNode.appendChild(n),n.appendChild(i),n.appendChild(e),n.appendChild(s),o.appendChild(i),i.style.maxWidth=e.width+"px",d=e.naturalWidth/e.offsetWidth;const a=e.offsetWidth/2-100,r=e.offsetHeight/2-100;p(200,200),u(a,r),m(a,r),o.addEventListener("mousedown",g,!1),o.addEventListener("touchstart",g,!1),o.addEventListener("wheel",b,!1),document.addEventListener("keypress",v,!1)}function p(e,t){c=e*d,l=t*d,o.style.width=e+"px",o.style.height=t+"px"}function u(e,t){r=t*d,a=e*d,i.style.top=-t+"px",i.style.left=-e+"px"}function m(e,t){o.style.top=t+"px",o.style.left=e+"px"}function f(e){e=e*Math.PI*2;let t,n,s,a,r=Math.floor(o.clientWidth+e),c=Math.floor(o.clientHeight+e),l=i.clientWidth,d=i.clientHeight;r<50||r>l||(t=o.offsetLeft-e/2,n=o.offsetTop-e/2,s=t+r,a=n+c,t<0&&(t=0),n<0&&(n=0),s>l||a>d||(p(r,r),u(t,n),m(t,n)))}function v(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":f(4);break;case"-":f(-4)}}function b(e){e.preventDefault(),f(e.deltaY>0?1:-1)}function g(e){e.preventDefault(),e.stopPropagation(),function(e){s.container_width=o.offsetWidth,s.container_height=o.offsetHeight,s.container_left=o.offsetLeft,s.container_top=o.offsetTop,s.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,s.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",y),document.addEventListener("touchmove",y),document.addEventListener("mouseup",w),document.addEventListener("touchend",w)}function w(e){e.preventDefault(),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",y),document.removeEventListener("touchmove",y)}function y(e){let t,n,a,r,c={x:0,y:0};e.preventDefault(),e.stopPropagation(),c.x=e.pageX||e.touches&&e.touches[0].pageX,c.y=e.pageY||e.touches&&e.touches[0].pageY,t=c.x-(s.mouse_x-s.container_left),n=c.y-(s.mouse_y-s.container_top),a=o.offsetWidth,r=o.offsetHeight,t<0?t=0:t>i.offsetWidth-a&&(t=i.offsetWidth-a),n<0?n=0:n>i.offsetHeight-r&&(n=i.offsetHeight-r),u(t,n),m(t,n)}return e.complete?h():e.onload=h,{crop:function(){t.width=c,t.height=l,t.getContext("2d").drawImage(e,a,r,c,l,0,0,c,l)},removeHandlers:function(){o.removeEventListener("mousedown",g),o.removeEventListener("touchstart",g),o.removeEventListener("wheel",b),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",y),document.removeEventListener("touchmove",y),document.removeEventListener("keypress",v),n.remove(),o.remove(),i.remove()}}},s=n(69),a=n(16),r=n(86),c=n(30);class l extends s.b{constructor(){super("popup-avatar",null,{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),Object(a._i18n)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",e=>{const t=e.target.files[0];t&&Object(r.b)(t).then(e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=i(this.image,this.canvas),this.input.value=""}})},!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",Object(c.b)(this.btnConfirm,()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob(e=>{this.blob=e,this.darkenCanvas(),this.resolve()},"image/jpeg",1)},{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()})}resolve(){this.onCrop(()=>o.a.upload(this.blob))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){let e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},136:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var o=n(15),i=n(0);function s(e){if("Enter"===e.key&&!i.IS_MOBILE&&!e.isComposing){if("enter"===o.default.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=i.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(i.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},69:function(e,t,n){"use strict";n.d(t,"b",(function(){return f})),n.d(t,"a",(function(){return v}));var o=n(15),i=n(18),s=n(72),a=n(48),r=n(16),c=n(6),l=n(7),d=n(90),h=n(30),p=n(136),u=n(5),m=n(56);class f extends m.a{constructor(e,t,n={}){super(!1),this.buttons=t,this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{a.a.back("popup")},this.destroy=()=>{this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),o.default.isOverlayActive=!1,a.a.removeItem(this.navigationItem),this.navigationItem=void 0,setTimeout(()=>{this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),s.a.checkAnimations(!1)},150)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),this.title.classList.add("popup-title"),this.header.append(this.title),this.listenerSetter=new d.a,this.confirmShortcutIsSendShortcut=n.confirmShortcutIsSendShortcut,n.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),Object(h.b)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),n.overlayClosable&&Object(h.b)(this.element,e=>{Object(c.a)(e.target,"popup-container")||this.hide()},{listenerSetter:this.listenerSetter}),n.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==n.withConfirm&&this.btnConfirm.append(Object(r.i18n)(n.withConfirm)),this.header.append(this.btnConfirm),Object(i.ripple)(this.btnConfirm)),this.container.append(this.header),n.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body));let l=this.btnConfirm;if(t&&t.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons"),2===t.length&&e.classList.add("popup-buttons-row");const n=t.map(e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),Object(i.ripple)(t),e.text?t.innerHTML=e.text:t.append(Object(r.i18n)(e.langKey,e.langArgs)),Object(h.b)(t,()=>{e.callback&&e.callback(),this.destroy()},{listenerSetter:this.listenerSetter,once:!0}),e.element=t});if(!l&&2===t.length){const e=t.find(e=>!e.isCancel);e&&(l=e.element)}e.append(...n),this.container.append(e)}this.btnConfirmOnEnter=l,this.element.append(this.container)}show(){this.navigationItem={type:"popup",onPop:this.destroy,onEscape:this.onEscape},a.a.pushItem(this.navigationItem),Object(l.a)(),document.body.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),o.default.isOverlayActive=!0,s.a.checkAnimations(!0),setTimeout(()=>{this.listenerSetter.add(document.body)("keydown",e=>{(this.confirmShortcutIsSendShortcut?Object(p.a)(e):"Enter"===e.key)&&(Object(h.d)(this.btnConfirmOnEnter),Object(u.a)(e))})},0)}}const v=e=>(e.find(e=>e.isCancel)||e.push({langKey:"Cancel",isCancel:!0}),e)},73:function(e,t,n){"use strict";var o=n(15),i=n(32),s=n(45),a=n(122),r=n(115),c=n(29);const l=new class{constructor(){this.cacheStorage=new r.a("cachedFiles"),this.downloads={},this.progress={},this.progressCallbacks={},this.uploadId=0,this.thumbsCache={photo:{},document:{}},o.default.addEventListener("download_progress",e=>{const t=e;this.progress[t.fileName]=t;const n=this.progressCallbacks[t.fileName];n&&n.forEach(e=>e(t));const o=this.downloads[t.fileName];o&&o.notifyAll(t)})}getNewDeferred(e){const t=Object(s.a)();return t.cancel=()=>{const n=new Error("Download canceled");n.name="AbortError",i.a.cancelDownload(e),t.reject(n),t.cancel=()=>{}},t.finally(()=>{delete this.progress[e],delete this.progressCallbacks[e]}),t.catch(()=>{this.clearDownload(e)}),this.downloads[e]=t}clearDownload(e){delete this.downloads[e]}fakeDownload(e,t){const n=this.getNewDeferred(e);return"string"==typeof t?fetch(t).then(e=>e.blob()).then(e=>n.resolve(e)):n.resolve(t),n}download(e){const t=Object(a.a)(e.location,{fileName:e.fileName});if(this.downloads.hasOwnProperty(t))return this.downloads[t];const n=this.getNewDeferred(t),o=e=>{n.reject(e)};return(()=>{if(!i.a.worker||e.onlyCache){const s=this.cacheStorage.getFile(t).then(t=>{if(t.sizei.a.downloadFile(e).then(n.resolve,o))}i.a.downloadFile(e).then(n.resolve,o)})(),n}upload(e,t){if(!t){const n=null==e?void 0:e.type;if(n){const e=this.uploadId+++"."+n.split("/")[1];t=["image/jpeg","image/png","image/bmp"].indexOf(n)>=0?"photo"+e:0===n.indexOf("audio/")||["video/ogg"].indexOf(n)>=0?"audio"+e:0===n.indexOf("video/")?"video"+e:"document"+e}else t="upload-"+this.uploadId++}const n=this.getNewDeferred(t);return i.a.uploadFile({file:e,fileName:t}).then(n.resolve,n.reject),n.finally(()=>{this.clearDownload(t)}),n}getDownload(e){return this.downloads[e]}addProgressCallback(e,t){var n;const o=this.progress[e];(null!==(n=this.progressCallbacks[e])&&void 0!==n?n:this.progressCallbacks[e]=[]).push(t),o&&t(o)}createDownloadAnchor(e,t,n){const o=document.createElement("a");o.href=e,o.download=t,o.target="_blank",o.style.position="absolute",o.style.top="1px",o.style.left="1px",document.body.append(o);try{var i=document.createEvent("MouseEvents");i.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),o.dispatchEvent(i)}catch(t){console.error("Download click error",t);try{o.click()}catch(t){window.open(e,"_blank")}}setTimeout(()=>{o.remove(),n&&n()},100)}downloadToDisc(e,t){const n=this.download(e);return n.then(e=>{const n=URL.createObjectURL(e);this.createDownloadAnchor(n,t,()=>{URL.revokeObjectURL(n)})}),n}getCacheContext(e,t="full"){var n,o;const i=null!==(n=this.thumbsCache[e._][e.id])&&void 0!==n?n:this.thumbsCache[e._][e.id]={};return null!==(o=i[t])&&void 0!==o?o:i[t]={downloaded:0,url:""}}};c.a&&(c.a.appDownloadManager=l),t.a=l},90:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));class o{constructor(){this.listeners=new Set}add(e){return(t,n,o)=>{const i={element:e,event:t,callback:n,options:o};return this.addManual(i),i}}addManual(e){var t;e.element.addEventListener(e.event,e.callback,e.options),(null===(t=e.options)||void 0===t?void 0:t.once)&&(e.onceCallback=()=>{this.remove(e),e.onceFired=!0},e.element.addEventListener(e.event,e.onceCallback,e.options)),this.listeners.add(e)}remove(e){e.onceFired||(e.element.removeEventListener(e.event,e.callback,e.options),e.onceCallback&&e.element.removeEventListener(e.event,e.onceCallback,e.options)),this.listeners.delete(e)}removeManual(e,t,n,o){let i;for(const s of this.listeners)if(s.element===e&&s.event===t&&s.callback===n&&s.options===o){i=s;break}i&&this.remove(i)}removeAll(){this.listeners.forEach(e=>{this.remove(e)})}}}}]); -//# sourceMappingURL=5.faa04da46f838e65acdf.chunk.js.map \ No newline at end of file diff --git a/public/5.faa04da46f838e65acdf.chunk.js.map b/public/5.faa04da46f838e65acdf.chunk.js.map deleted file mode 100644 index 91577336e..000000000 --- a/public/5.faa04da46f838e65acdf.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/fileName.ts","webpack:///./src/lib/cropper.ts","webpack:///./src/components/popups/avatar.ts","webpack:///./src/helpers/dom/isSendShortcutPressed.ts","webpack:///./src/components/popups/index.ts","webpack:///./src/lib/appManagers/appDownloadManager.ts","webpack:///./src/helpers/listenerSetter.ts"],"names":["getFileNameByLocation","location","options","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","getFileURL","type","encodeURIComponent","JSON","stringify","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","classList","add","draggable","Image","src","document","createElement","overlayColor","appendChild","parentNode","style","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","addEventListener","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","e","preventDefault","String","fromCharCode","charCode","deltaY","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","clientX","pageX","touches","window","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","onload","crop","getContext","drawImage","removeHandlers","remove","super","closable","withConfirm","image","cropper","this","h6","btnClose","header","append","cropContainer","input","display","listenerSetter","file","target","files","then","contents","show","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","upload","postCanvas","click","ctx","fillStyle","fillRect","isSendShortcutPressed","key","isComposing","settings","sendShortcut","shiftKey","ctrlKey","metaKey","secondaryKey","PopupElement","buttons","element","title","onEscape","back","destroy","dispatchEvent","removeAll","isOverlayActive","removeItem","navigationItem","undefined","setTimeout","cleanup","checkAnimations","confirmShortcutIsSendShortcut","prepend","once","overlayClosable","body","btnConfirmOnEnter","buttonsDiv","buttonsEl","buttonsElements","map","b","button","isDanger","text","innerHTML","langKey","langArgs","callback","find","isCancel","onPop","pushItem","addCancelButton","push","cacheStorage","downloads","progress","progressCallbacks","uploadId","thumbsCache","photo","details","fileName","callbacks","forEach","download","notifyAll","deferred","cancel","Error","name","cancelDownload","reject","finally","catch","clearDownload","getNewDeferred","fetch","response","hasOwnProperty","onError","err","worker","onlyCache","promise","getFile","size","downloadFile","tryDownload","mimeType","split","indexOf","uploadFile","onRemove","a","href","position","clickEvent","createEvent","initMouseEvent","open","discFileName","objectURL","URL","createObjectURL","createDownloadAnchor","revokeObjectURL","media","thumbSize","cache","downloaded","ListenerSetter","listeners","Set","event","listener","addManual","onceCallback","onceFired","delete","_listener"],"mappings":"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","file":"5.faa04da46f838e65acdf.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement, \r\n container: HTMLDivElement, \r\n cropImage: HTMLImageElement, \r\n event_state: Partial<{ \r\n mouse_x: number, \r\n mouse_y: number, \r\n container_width: number, \r\n container_height: number, \r\n container_left: number, \r\n container_top: number\r\n }> = {}, \r\n keyZoomValue = 4.0, \r\n MINWIDTH = 50, \r\n MINHEIGHT = 50, \r\n CROPWIDTH = 200, \r\n CROPHEIGHT = 200, \r\n cropLeft = 0, \r\n cropTop = 0, \r\n cropWidth = 0, \r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n \r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n \r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n \r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n \r\n document.addEventListener('keypress', keyHandler, false);\r\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n \r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n \r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n \r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n \r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n \r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n \r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n \r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n \r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n //crop();\r\n }\r\n \r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n \r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n \r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n \r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n \r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n \r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n \r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom), \r\n newHeight = Math.floor(container.clientHeight + zoom), \r\n w = cropImage.clientWidth, \r\n h = cropImage.clientHeight, \r\n left: number, \r\n top: number, \r\n right: number, \r\n bottom: number;\r\n \r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n \r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n \r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n \r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n \r\n switch (String.fromCharCode(e.charCode)) {\r\n case '+' :\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-' :\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n \r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n \r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n saveEventState(e);\r\n \r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n \r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n \r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0}, \r\n left: number, \r\n top: number, \r\n w: number, \r\n h: number;\r\n \r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n \r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n \r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n \r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n \r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { readBlobAsDataURL } from \"../../helpers/blob\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', null, {closable: true, withConfirm: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.listenerSetter.add(this.input)('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n\r\n readBlobAsDataURL(file).then(contents => {\r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n \r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n \r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n });\r\n }, false);\r\n\r\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n attachClickEvent(this.btnConfirm, () => {\r\n this.cropper.crop();\r\n this.hide();\r\n\r\n this.canvas.toBlob(blob => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\r\n\r\n this.addEventListener('closeAfterTimeout', () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n });\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { IS_MOBILE, IS_APPLE } from \"../../environment/userAgent\";\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '
';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSendShortcutPressed from \"../../helpers/dom/isSendShortcutPressed\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: true, \r\n overlayClosable: true, \r\n withConfirm: LangPackKey | true, \r\n body: true,\r\n confirmShortcutIsSendShortcut: boolean\r\n}>;\r\n\r\nexport default class PopupElement extends EventListenerBase<{\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n}> {\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLButtonElement;\r\n\r\n constructor(className: string, protected buttons?: Array, options: PopupOptions = {}) {\r\n super(false);\r\n\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n this.title.classList.add('popup-title');\r\n\r\n this.header.append(this.title);\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n //ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n if(buttons && buttons.length) {\r\n const buttonsDiv = this.buttonsEl = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n\r\n if(buttons.length === 2) {\r\n buttonsDiv.classList.add('popup-buttons-row');\r\n }\r\n \r\n const buttonsElements = buttons.map(b => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n \r\n ripple(button);\r\n \r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n \r\n attachClickEvent(button, () => {\r\n b.callback && b.callback();\r\n this.destroy();\r\n }, {listenerSetter: this.listenerSetter, once: true});\r\n \r\n return b.element = button;\r\n });\r\n \r\n if(!btnConfirmOnEnter && buttons.length === 2) {\r\n const button = buttons.find(button => !button.isCancel);\r\n if(button) {\r\n btnConfirmOnEnter = button.element;\r\n }\r\n }\r\n\r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.btnConfirmOnEnter = btnConfirmOnEnter;\r\n\r\n this.element.append(this.container);\r\n }\r\n\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 document.body.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n rootScope.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n setTimeout(() => {\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\r\n simulateClickEvent(this.btnConfirmOnEnter);\r\n cancelEvent(e);\r\n }\r\n });\r\n }, 0);\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.back('popup');\r\n };\r\n\r\n private destroy = () => {\r\n this.dispatchEvent('close');\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n this.listenerSetter.removeAll();\r\n\r\n rootScope.isOverlayActive = false;\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n animationIntersector.checkAnimations(false);\r\n }, 150);\r\n };\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find(b => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport type { ApiError } from \"../mtproto/apiManager\";\r\nimport type { MyDocument } from \"./appDocsManager\";\r\nimport type { MyPhoto } from \"./appPhotosManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { deferredPromise, CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { InputFile } from \"../../layer\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise;\r\nexport type DownloadJson = CancellablePromise;\r\n//export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\nexport type ThumbCache = {\r\n downloaded: number, \r\n url: string\r\n};\r\n\r\nexport type ThumbsCache = {\r\n [id: string]: {\r\n [size: string]: ThumbCache\r\n }\r\n};\r\n\r\nexport class AppDownloadManager {\r\n public cacheStorage = new CacheStorageController('cachedFiles');\r\n private downloads: {[fileName: string]: Download} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n private progressCallbacks: {[fileName: string]: Array} = {};\r\n\r\n private uploadId = 0;\r\n\r\n private thumbsCache: {\r\n photo: ThumbsCache,\r\n document: ThumbsCache\r\n } = {\r\n photo: {},\r\n document: {}\r\n };\r\n\r\n constructor() {\r\n rootScope.addEventListener('download_progress', (e) => {\r\n const details = e as {done: number, fileName: string, total: number, offset: number};\r\n this.progress[details.fileName] = details;\r\n\r\n const callbacks = this.progressCallbacks[details.fileName];\r\n if(callbacks) {\r\n callbacks.forEach(callback => callback(details));\r\n }\r\n\r\n const download = this.downloads[details.fileName];\r\n if(download) {\r\n download.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred(fileName: string) {\r\n const deferred = deferredPromise();\r\n\r\n deferred.cancel = () => {\r\n //try {\r\n const error = new Error('Download canceled');\r\n error.name = 'AbortError';\r\n \r\n apiManager.cancelDownload(fileName);\r\n \r\n deferred.reject(error);\r\n deferred.cancel = () => {};\r\n /* } catch(err) {\r\n\r\n } */\r\n };\r\n\r\n deferred.finally(() => {\r\n delete this.progress[fileName];\r\n delete this.progressCallbacks[fileName];\r\n });\r\n\r\n deferred.catch(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return this.downloads[fileName] = deferred as any;\r\n }\r\n\r\n private clearDownload(fileName: string) {\r\n delete this.downloads[fileName];\r\n }\r\n\r\n public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then(response => response.blob())\r\n .then(blob => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getFileNameByLocation(options.location, {fileName: options.fileName});\r\n if(this.downloads.hasOwnProperty(fileName)) return this.downloads[fileName];\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n\r\n const onError = (err: ApiError) => {\r\n deferred.reject(err);\r\n };\r\n\r\n const tryDownload = (): Promise => {\r\n //return Promise.resolve();\r\n\r\n if(!apiManager.worker || options.onlyCache) {\r\n const promise = this.cacheStorage.getFile(fileName).then((blob) => {\r\n if(blob.size < options.size) throw 'wrong size';\r\n else deferred.resolve(blob);\r\n });\r\n \r\n if(options.onlyCache) return promise.catch(onError);\r\n return promise.catch(() => {\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n });\r\n } else {\r\n /* return apiManager.downloadFile(options).then(res => {\r\n setTimeout(() => deferred.resolve(res), 5e3);\r\n }, onError); */\r\n\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n }\r\n };\r\n\r\n tryDownload();\r\n\r\n //console.log('Will download file:', fileName, url);\r\n return deferred;\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string) {\r\n if(!fileName) {\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = this.uploadId++ + '.' + mimeType.split('/')[1];\r\n \r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n \r\n } else {\r\n fileName = 'upload-' + this.uploadId++;\r\n }\r\n }\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n apiManager.uploadFile({file, fileName}).then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as any as CancellablePromise;\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloads[fileName];\r\n }\r\n\r\n public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n const progress = this.progress[fileName];\r\n (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n if(progress) {\r\n callback(progress);\r\n }\r\n }\r\n\r\n public createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n a.target = '_blank';\r\n \r\n a.style.position = 'absolute';\r\n a.style.top = '1px';\r\n a.style.left = '1px';\r\n \r\n document.body.append(a);\r\n \r\n try {\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n a.dispatchEvent(clickEvent);\r\n } catch (e) {\r\n console.error('Download click error', e);\r\n try {\r\n a.click();\r\n } catch (e) {\r\n window.open(url as string, '_blank');\r\n }\r\n }\r\n \r\n setTimeout(() => {\r\n a.remove();\r\n onRemove && onRemove();\r\n }, 100);\r\n }\r\n\r\n /* public downloadToDisc(fileName: string, url: string) {\r\n this.createDownloadAnchor(url);\r\n \r\n return this.download(fileName, url);\r\n } */\r\n\r\n public downloadToDisc(options: DownloadOptions, discFileName: string) {\r\n const download = this.download(options);\r\n download/* .promise */.then(blob => {\r\n const objectURL = URL.createObjectURL(blob);\r\n this.createDownloadAnchor(objectURL, discFileName, () => {\r\n URL.revokeObjectURL(objectURL);\r\n });\r\n });\r\n \r\n return download;\r\n }\r\n\r\n public getCacheContext(media: MyPhoto | MyDocument, thumbSize: string = 'full'): ThumbCache {\r\n /* if(media._ === 'photo' && thumbSize !== 'i') {\r\n thumbSize = 'full';\r\n } */\r\n\r\n const cache = this.thumbsCache[media._][media.id] ?? (this.thumbsCache[media._][media.id] = {});\r\n return cache[thumbSize] ?? (cache[thumbSize] = {downloaded: 0, url: ''});\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\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"],"sourceRoot":""} \ No newline at end of file diff --git a/public/6.7dba74a574616a20ac7d.chunk.js b/public/6.7dba74a574616a20ac7d.chunk.js deleted file mode 100644 index 084232bc5..000000000 --- a/public/6.7dba74a574616a20ac7d.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[6],{102:function(e,t,s){"use strict";var i=s(29);class a{constructor(){this.tempNum=0}generateMessageId(e,t=!1){const s=a.MESSAGE_ID_OFFSET,i=t?++this.tempNum:0;return e>=s?t?e+(i&a.MESSAGE_ID_INCREMENT-1):e:s+(e*a.MESSAGE_ID_INCREMENT+(i&a.MESSAGE_ID_INCREMENT-1))}getServerMessageId(e){return this.clearMessageId(e,!0)}clearMessageId(e,t){const s=a.MESSAGE_ID_OFFSET;if(e{e&&Object(r.a)(e),this.preloader.classList.contains("manual")?this.loadFunc&&this.loadFunc(e):this.promise&&this.promise.cancel&&this.promise.cancel()},e&&Object(n.g)(this,e)}constructContainer(e={}){this.preloader||(this.preloader=document.createElement("div"),this.preloader.classList.add("preloader-container"),e.color&&this.preloader.classList.add("preloader-"+e.color),e.bold&&this.preloader.classList.add("preloader-bold"),this.streamable&&this.preloader.classList.add("preloader-streamable"))}constructDownloadIcon(){this.constructContainer()}construct(){this.construct=null,this.constructContainer(),this.preloader.innerHTML=`\n
\n \n \n \n
`,this.streamable?this.totalLength=118.61124420166016:this.totalLength=149.82473754882812,this.cancelable?(this.preloader.innerHTML+='\n \n \n \n \n \n \n \n \n \n \n \n ',this.downloadSvg=this.preloader.lastElementChild,this.cancelSvg=this.downloadSvg.previousElementSibling):this.preloader.classList.add("preloader-swing"),this.circle=this.preloader.firstElementChild.firstElementChild.firstElementChild,this.cancelable&&Object(o.b)(this.preloader,this.onClick)}setDownloadFunction(e){this.loadFunc=e}setManual(){this.preloader.classList.add("manual"),this.setProgress(0)}attachPromise(e){if(this.isUpload&&this.promise)return;this.promise=e;const t=--this.tempId,s=Date.now(),i=i=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const n=Date.now()-s;if(!i&&this.cancelable){this.setProgress(100);const e=150;n{t===this.tempId&&this.detach()},e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),Object(a.b)(()=>{this.setManual()})):this.detach();this.promise=e=null};e.then(()=>i(null)).catch(e=>i(e)),e.addNotifyListener&&e.addNotifyListener(e=>{if(t!==this.tempId)return;const s=e.done/e.total*100;this.setProgress(s)})}attach(e,t=!1,s){if(this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,s&&this.attachPromise(s),this.detached||this.preloader.parentElement!==e){const t=Object(d.a)(this.preloader)?1:2;this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader),Object(i.a)(this.preloader,"is-visible",!0,200,void 0,t)}this.cancelable&&t&&this.setProgress(0)}detach(){this.detached||(this.detached=!0,this.preloader&&this.preloader.parentElement&&Object(i.a)(this.preloader,"is-visible",!1,200,()=>{this.preloader.remove()},1))}setProgress(e){if(this.totalLength||Object(d.a)(this.circle))if(0!==e)try{this.totalLength||(this.totalLength=this.circle.getTotalLength()),this.circle.style.strokeDasharray=Math.max(5,e/100*this.totalLength)+", "+this.totalLength}catch(e){}else this.circle.style.strokeDasharray=""}}},104:function(e,t,s){"use strict";s.d(t,"b",(function(){return o})),s.d(t,"c",(function(){return d})),s.d(t,"a",(function(){return l})),s.d(t,"e",(function(){return h})),s.d(t,"d",(function(){return c})),s.d(t,"f",(function(){return g}));var i=s(37),a=s(81),n=s(0),r=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};function o(e){let t,s;return e instanceof HTMLVideoElement?(t=e.videoWidth,s=e.videoHeight):(t=e.naturalWidth,s=e.naturalHeight),a={media:e,mediaSize:Object(i.c)(t,s),boxSize:Object(i.c)(320,240),quality:.9},new Promise(e=>{var t,s;const i=document.createElement("canvas"),n=a.mediaSize.aspectFitted(a.boxSize);i.width=n.width*window.devicePixelRatio,i.height=n.height*window.devicePixelRatio,i.getContext("2d").drawImage(a.media,0,0,i.width,i.height),i.toBlob(t=>{e({blob:t,size:n})},null!==(t=a.mimeType)&&void 0!==t?t:"image/jpeg",null!==(s=a.quality)&&void 0!==s?s:1)});var a}function d(e){return new Promise((t,s)=>{e.onseeked=()=>{e.onseeked=()=>{o(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=s,e.currentTime=Math.min(e.duration,1)})}function l(e){return r(this,void 0,void 0,(function*(){const t=yield function(e){return new Promise((t,s)=>{const i=document.createElement("video");i.volume=0,i.addEventListener("loadedmetadata",()=>t(i),{once:!0}),i.addEventListener("error",s,{once:!0}),i.src=e})}(e);return Promise.race([Object(a.a)(2e3),d(t)])}))}function h(e,t=e.HAVE_METADATA,s){return new Promise(i=>{e.readyState>=t?i():e.addEventListener(n.IS_APPLE_MOBILE&&!s?"loadeddata":"canplay",()=>i(),{once:!0})})}function c(e,t=!1){return r(this,void 0,void 0,(function*(){const s=[],i=(e,a)=>r(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise((e,s)=>{t.readEntries(t=>r(this,void 0,void 0,(function*(){for(const e of t)yield i(e,a);e()})))})}else if(e)if(t)s.push(e.type);else{const t=a.getAsFile(),i=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise((s,i)=>e.file(s,e=>s(t)));if(!i)return;s.push(i)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let i=0;i{t.addEventListener("change",t=>{const i=t.target.files[0];i?e(i):s("NO_FILE_SELECTED")},{once:!0})}).finally(()=>{t.remove()});return t.click(),s}},107:function(e,t,s){"use strict";function i(e){}s.d(t,"a",(function(){return i}))},108:function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));const i=()=>{let e={cleaned:!1};return{clean:()=>{e.cleaned=!0,e={cleaned:!1}},get:()=>{const t=e;return()=>!t.cleaned}}}},111:function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(123);class a{constructor(e,t=0){this.options=e,this.minChars=t,this.fullTexts=new Map}indexObject(e,t){if(this.options&&t.trim()&&(t=Object(i.c)(t,this.options)),!t)return this.fullTexts.delete(e),!1;this.fullTexts.set(e,t)}search(e){const t=this.fullTexts;this.options&&(e=Object(i.c)(e,this.options));const s=[],a=e.split(" "),n=a.length;t.forEach((e,t)=>{let i=!0,r=0;for(let t=0;te.fullTextLength-t.fullTextLength||t.foundChars-e.foundChars);return new Set(s.map(e=>e.what))}}},112:function(e,t,s){"use strict";s.d(t,"b",(function(){return r})),s.d(t,"a",(function(){return p}));var i=s(63);const a=new Map,n=new Set,r='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif';let o;const d=()=>{cancelAnimationFrame(o),o=window.requestAnimationFrame(l)},l=()=>{n.forEach(h),n.clear()};window.addEventListener("resize",()=>{for(const[e]of a)n.add(e);d()},{capture:!0,passive:!0});const h=e=>{let t=a.get(e);const s=!t;let{text:n,textLength:o,from:d,multiplier:l,font:h,textWidth:c,elementWidth:p}=t||{};s&&(n=e.textContent,o=n.length,d=50,l=d>0&&d/100,h=`${e.dataset.fontWeight||400} 16px ${r}`,c=g(n,h),p=e.getBoundingClientRect().width,t={text:n,textLength:o,from:d,multiplier:l,font:h,textWidth:c,elementWidth:p},a.set(e,t));const u=e.getBoundingClientRect().width,f=s||p!==u;if(!s&&f&&(t.elementWidth=p=u),f)if(c>p){e.setAttribute("title",n);let s=n,a=p;for(;s.length>3;){let t=s.length;const n=l&&Object(i.a)(l*t<<0,1,t-2)||Math.max(t+d-1,1),r=s.substr(0,n).replace(/\s*$/,""),o=s.substr(n+1).replace(/^\s*/,"");if(s=r+o,a=g(s+"…",h),a{this.drafts=e||{}}),i.default.addMultipleEventsListeners({updateDraftMessage:e=>{const t=a.a.getPeerId(e.peer);this.saveDraft(t,e.threadId,e.draft,{notify:!0})}})}getKey(e,t){return e+(t?"_"+t:"")}getDraft(e,t){return this.drafts[this.getKey(e,t)]}addMissedDialogs(){return this.getAllDrafts().then(()=>{for(const e in this.drafts){if(-1!==e.indexOf("_"))continue;const t=e.toPeerId();n.a.getDialogOnly(t)||n.a.reloadConversation(t)}})}getAllDrafts(){return this.getAllDraftPromise||(this.getAllDraftPromise=l.a.invokeApi("messages.getAllDrafts").then(e=>{(r.a.updatesState.syncLoading||Promise.resolve()).then(()=>{r.a.processUpdateMessage(e)})}))}saveDraft(e,t,s,a={}){const n=this.processApiDraft(s),r=this.getKey(e,t);return n?this.drafts[r]=n:delete this.drafts[r],u.a.set({drafts:this.drafts}),a.notify&&i.default.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:n,force:a.force}),n}draftsAreEqual(e,t){if(typeof e!=typeof t)return!1;if(!Object(g.a)(e))return!0;if(e._!==t._)return!1;if("draftMessage"===e._&&t._===e._){if(e.reply_to_msg_id!==t.reply_to_msg_id)return!1;if(!Object(c.b)(e.entities,t.entities))return!1;if(e.message!==t.message)return!1;if(e.pFlags.no_webpage!==t.pFlags.no_webpage)return!1}return!0}isEmptyDraft(e){return!e||"draftMessageEmpty"===e._||!(e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(!e||"draftMessage"!==e._)return;const t=o.b.parseEntities(e.message),s=e.entities||[],i=o.b.mergeEntities(s.slice(),t);return e.rMessage=o.b.wrapDraftText(e.message,{entities:i}),e.reply_to_msg_id&&(e.reply_to_msg_id=f.a.generateMessageId(e.reply_to_msg_id)),e}syncDraft(e,t,s,i=!0,r=!1){return m(this,void 0,void 0,(function*(){const o=this.getDraft(e,t);if(this.draftsAreEqual(o,s))return!0;let c,g={peer:a.a.getInputPeerById(e),message:""};if(this.isEmptyDraft(s))c={_:"draftMessageEmpty"};else{let e=s.message,t=s.entities;s.reply_to_msg_id&&(g.reply_to_msg_id=f.a.getServerMessageId(s.reply_to_msg_id)),(null==t?void 0:t.length)&&(g.entities=n.a.getInputEntities(t)),s.pFlags.no_webpage&&(g.no_webpage=s.pFlags.no_webpage),g.message=e}const p=c||s;return p.date=Object(h.g)(!0)+d.a.serverTimeOffset,this.saveDraft(e,t,p,{notify:!0,force:r}),!(i&&!t)||l.a.invokeApi("messages.saveDraft",g)}))}clearAllDrafts(){return l.a.invokeApi("messages.clearAllDrafts").then(e=>{if(e)for(const e in this.drafts){const[t,s]=e.split("_");i.default.dispatchEvent("draft_updated",{peerId:t.toPeerId(),threadId:s?+s:void 0,draft:void 0})}})}clearDraft(e,t){t?this.syncDraft(e,t):this.saveDraft(e,t,null,{notify:!0,force:!0})}setDraft(e,t,s,i){const a={_:"draftMessage",date:Date.now()/1e3|0,message:s,pFlags:{},entities:i};t?this.syncDraft(e,t,a,!1,!0):this.saveDraft(e,t,a,{notify:!0,force:!0})}};p.a.appDraftsManager=_,t.a=_},114:function(e,t,s){"use strict";var i=s(96),a=s(36),n=s(58),r=s(46),o=s(31),d=s(15),l=s(73),h=s(42),c=s(50),g=s(40);const p=new class{constructor(){this.savedAvatarURLs={}}isAvatarCached(e){return!!this.savedAvatarURLs[e]}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,s){const i=h.a.getInputPeerById(e);let a,n=!1,r=this.savedAvatarURLs[e];if(r&&r[s])"string"!=typeof r[s]?a=r[s]:(a=Promise.resolve(r[s]),n=!0);else{r||(r=this.savedAvatarURLs[e]={});const n={_:"inputPeerPhotoFileLocation",pFlags:{},peer:i,photo_id:t.photo_id};"photo_big"===s&&(n.pFlags.big=!0);const o={dcId:t.dc_id,location:n},d=l.a.download(o);a=r[s]=d.then(e=>r[s]=URL.createObjectURL(e))}return{cached:n,loadPromise:a}}putAvatar(e,t,s,r,o=new Image,l=!1){let h,g,p,{cached:u,loadPromise:f}=this.loadAvatar(t,s,r);if(o.classList.add("avatar-photo"),u)g=()=>{Object(a.a)(e,o),e.dataset.color=""};else{const l=d.default.settings.animationsEnabled;if(l&&o.classList.add("fade-in"),"photo_big"===r){const i=this.putAvatar(e,t,s,"photo_small");h=i.loadPromise,p=i.thumbImage}else if(s.stripped_thumb){p=new Image,e.classList.add("avatar-relative"),p.classList.add("avatar-photo","avatar-photo-thumbnail");const t=c.a.getPreviewURLFromBytes(s.stripped_thumb);h=Object(i.b)(p,t).then(()=>{Object(a.a)(e,p)})}g=()=>{p?e.append(o):Object(a.a)(e,o),setTimeout(()=>{e.childElementCount&&n.a.mutateElement(o,()=>{e.dataset.color="",l&&o.classList.remove("fade-in"),p&&p.remove()})},l?200:0)}}const m=f.then(e=>Object(i.b)(o,e)).then(g);return{cached:u,loadPromise:h||m,thumbImage:p}}s(e,t,s,i){e.innerHTML=t,e.dataset.color=s,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled"),i&&e.classList.add(i)}putPhoto(e,t,s=!1,i="",a=!1){var n;const l=d.default.myId;if(t===l&&s)return void this.s(e,"","","tgico-saved");if(t!==r.b&&t.isUser()){const s=g.a.getUser(t);if(s&&s.pFlags&&s.pFlags.deleted)return void this.s(e,"",h.a.getPeerColorById(t),"tgico-deletedaccount")}const c=h.a.getPeerPhoto(t),p=!!c,u=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!p||!u||!this.savedAvatarURLs[t]){let a,d="";if(!t||t===l&&s||(d=h.a.getPeerColorById(t)),t===r.c)return void this.s(e,"",d,"tgico-reply_filled");if(i)a=o.b.getAbbreviation(i);else{a=null!==(n=h.a.getPeer(t).initials)&&void 0!==n?n:""}this.s(e,a,d,"")}if(p){const s="photo_small";return this.putAvatar(e,t,c,s,void 0,a)}}};t.a=p},123:function(e,t,s){"use strict";s.d(t,"a",(function(){return r})),s.d(t,"b",(function(){return d})),s.d(t,"c",(function(){return l}));var i=s(129);const a=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,n=/^\s+|\s$/g;function r(e){return e.replace(a,"").replace(n,"")}function o(e){return e.replace(/[^A-Za-z0-9]/g,e=>{const t=i.a.LatinizeMap[e];return void 0!==t?t:e})}function d(e,t=!0){const s="%"===e.charAt(0);return e=r(e),t&&(e=o(e)),e=e.toLowerCase(),s&&(e="%"+e),e}function l(e,t={}){const s=t.includeTag&&"%"===e.charAt(0);return t.clearBadChars&&(e=r(e)),t.latinize&&(e=o(e)),t.ignoreCase&&(e=e.toLowerCase()),s&&(e="%"+e),e}},124:function(e,t,s){"use strict";s.d(t,"a",(function(){return i})),s.d(t,"b",(function(){return n}));var i,a=s(29);!function(e){e[e.None=0]="None",e[e.Top=1]="Top",e[e.Bottom=2]="Bottom",e[e.Both=3]="Both"}(i||(i={}));class n{constructor(){this.sliceConstructor=n.getSliceConstructor(this);const e=this.constructSlice();this.slices=[e]}static getSliceConstructor(e){return class extends Array{constructor(){super(...arguments),this.end=i.None}isEnd(t){if((this.end&t)===t)return!0;let s=!1;if(t===i.Top){const i=e.last;s=!!(i.end&t)&&this.includes(i[i.length-1])}else if(t===i.Bottom){const i=e.first;s=!!(i.end&t)&&this.includes(i[0])}else if(t===i.Both)return this.isEnd(i.Top)&&this.isEnd(i.Bottom);return s&&this.setEnd(t),s}setEnd(e){this.end|=e}unsetEnd(e){this.end^=e}splice(t,s,...a){const n=super.splice(t,s,...a);if(!this.length){const t=e.slices,s=t.indexOf(this);-1!==s&&(1===t.length?this.unsetEnd(i.Both):t.splice(s,1))}return n}}}constructSlice(...e){const t=new this.sliceConstructor(e.length);for(let s=0,i=e.length;ss[0])break}this.slices.splice(t,0,this.constructSlice(...e)),d=t}return t?this.flatten(d):void 0}flatten(e){if(this.slices.length>=2)for(let t=0,s=this.slices.length;t=t[i])return{slice:t,offset:e===t[i]?i:i-1}}if(t&&t.isEnd(i.Top))return{slice:t,offset:t.length}}sliceMe(e,t,s){let a=this.slice,n=0,r=0;if(e){const t=this.findSliceOffset(e);if(!t)return;a=t.slice,n=r=t.offset,a.includes(e)&&(r+=1)}let o=Math.max(r+t,0),d=r+t+s;const l=a.slice(o,d),h=t<0?s+t:s,c=Math.abs(t),g=a.length-r>=h||!!a.isEnd(i.Top)&&(l.setEnd(i.Top),!0),p=r-c>=0||!!a.isEnd(i.Bottom)&&(l.setEnd(i.Bottom),!0);return{slice:l,offsetIdOffset:n,fulfilled:i.None|(g&&p?i.Both:(g?i.Top:i.None)|(p?i.Bottom:i.None))}}unshift(...e){let t=this.first;t.length?t.isEnd(i.Bottom)||(t=this.constructSlice(),t.setEnd(i.Bottom),this.slices.unshift(t)):t.setEnd(i.Bottom),t.unshift(...e)}push(...e){let t=this.last;t.length?t.isEnd(i.Top)||(t=this.constructSlice(),t.setEnd(i.Top),this.slices.push(t)):t.setEnd(i.Top),t.push(...e)}delete(e){const t=this.findSlice(e);return!!t&&(t.slice.splice(t.index,1),!0)}}a.a&&(a.a.SlicedArray=n)},125:function(e,t,s){"use strict";var i=s(29),a=s(34),n=s(43),r=s(32),o=s(31),d=s(15),l=s(79),h=s(102),c=s(39),g=s(42),p=s(40);const u=new class{constructor(){this.polls={},this.results={},this.pollToMessages={},this.log=Object(n.b)("POLLS",n.a.Error),d.default.addMultipleEventsListeners({updateMessagePoll:e=>{this.log("updateMessagePoll:",e);let t=e.poll||this.polls[e.poll_id];if(!t)return;let s=e.results;const i=this.savePoll(t,s);t=i.poll,s=i.results,d.default.dispatchEvent("poll_update",{poll:t,results:s})}})}savePoll(e,t,s){s&&this.updatePollToMessage(s,!0);const i=e.id;return this.polls[i]?(e=Object.assign(this.polls[i],e),t=this.saveResults(e,t)):(this.polls[i]=e,e.rQuestion=o.a.wrapEmojiText(e.question),e.rReply=o.a.wrapEmojiText("📊")+" "+(e.rQuestion||"poll"),e.chosenIndexes=[],t=this.saveResults(e,t)),{poll:e,results:t}}saveResults(e,t){var s;return this.results[e.id]?t=Object.assign(this.results[e.id],t):this.results[e.id]=t,t.pFlags.min||(e.chosenIndexes.length=0,(null===(s=null==t?void 0:t.results)||void 0===s?void 0:s.length)&&t.results.forEach((t,s)=>{var i;(null===(i=t.pFlags)||void 0===i?void 0:i.chosen)&&e.chosenIndexes.push(s)})),t}getPoll(e){return{poll:this.polls[e],results:this.results[e]}}getInputMediaPoll(e,t,s,i){return s?(i||(i=[]),s=o.a.parseMarkdown(s,i)):s=void 0,{_:"inputMediaPoll",poll:e,correct_answers:t,solution:s,solution_entities:s?i:void 0}}updatePollToMessage(e,t){const{id:s}=e.media.poll;let i=this.pollToMessages[s];if(!t&&!i)return;i||(i=this.pollToMessages[s]=new Set);const a=e.peerId+"_"+e.mid;t?i.add(a):i.delete(a),t||i.size||(delete this.polls[s],delete this.results[s],delete this.pollToMessages[s])}sendVote(e,t){const s=e.media.poll,i=t.map(e=>s.answers[e].option),a=e.mid,n=e.peerId,o=g.a.getInputPeerById(n);return e.pFlags.is_outgoing?c.a.invokeAfterMessageIsSent(a,"sendVote",e=>(this.log("invoke sendVote callback"),this.sendVote(e,t))):r.a.invokeApi("messages.sendVote",{peer:o,msg_id:h.a.getServerMessageId(e.mid),options:i}).then(e=>{this.log("sendVote updates:",e),l.a.processUpdateMessage(e)})}getResults(e){const t=g.a.getInputPeerById(e.peerId);return r.a.invokeApi("messages.getPollResults",{peer:t,msg_id:h.a.getServerMessageId(e.mid)}).then(e=>{l.a.processUpdateMessage(e),this.log("getResults updates:",e)})}getVotes(e,t,s,i=20){return r.a.invokeApi("messages.getPollVotes",{peer:g.a.getInputPeerById(e.peerId),id:h.a.getServerMessageId(e.mid),option:t,offset:s,limit:i}).then(e=>(this.log("getPollVotes messages:",e),p.a.saveApiUsers(e.users),e))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const s=Object(a.a)(t);return s.pFlags.closed=!0,c.a.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(s)}).then(()=>{},e=>{this.log.error("stopPoll error:",e)})}};i.a.appPollsManager=u,t.a=u},126:function(e,t,s){"use strict";s.d(t,"a",(function(){return f}));var i=s(45),a=s(82),n=s(41),r=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const o=[];let d=!1;function l(e,t="push"){return e.items.length?(e.promise=Object(i.a)(),o[t](e),function e(){if(!d){(function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),s=[];return new Promise((i,o)=>{const d=()=>r(this,void 0,void 0,(function*(){const r=performance.now();do{yield Object(a.c)();const i=e.process.apply(e.context,t.shift());let n;if(i instanceof Promise)try{n=yield i}catch(e){return void o(e)}else n=i;s.push(n)}while(t.length>0&&performance.now()-r<6);t.length>0?Object(n.b)(d):i(s)}));Object(n.b)(d)}).then(e.promise.resolve,e.promise.reject)})(o.shift()).finally(()=>{d=!1,o.length&&e()})}}(),e.promise):Promise.resolve([])}const h="filter"in(document.createElement("canvas").getContext("2d")||{});let c,g;function p(e,t,s){return new Promise(i=>{const a=document.createElement("canvas");a.width=e.width,a.height=e.height;const n=a.getContext("2d",{alpha:!1});h?(n.filter=`blur(${t}px)`,n.drawImage(e,2*-t,2*-t,a.width+4*t,a.height+4*t)):(n.drawImage(e,0,0),g(n,0,0,a.width,a.height,t,s)),i(a.toDataURL())})}c=h?Promise.resolve():s.e(31).then(s.bind(null,149)).then(e=>{g=e.default});const u=new Map;function f(e,t=2,s=2){if(!e)return console.error("no dataUri for blur",e),Promise.resolve(e);if(u.size>1e3&&u.clear(),u.has(e))return u.get(e);const i=new Promise(i=>{c.then(()=>{const a=new Image;a.onload=()=>{h?p(a,t,s).then(i):l({items:[[a,t,s]],context:null,process:p},"unshift").then(e=>{i(e[0])})},a.src=e})});return u.set(e,i),i}},132:function(e,t,s){"use strict";var i=s(39),a=s(75),n=s(34),r=s(29),o=s(32),d=s(107),l=s(43);const h=new class{constructor(){this.contexts=new Map,this.links={},this.log=Object(l.b)("RD",void 0,!0),o.a.addTaskListener("refreshReference",e=>{const t=e.payload;Object(d.a)(e),e.originalPayload=t,this.refreshReference(t).then(t=>{e.payload=t},t=>{e.error=t}).then(()=>o.a.postMessage(e))})}saveContext(e,t,s){[s,e]=this.getContexts(e),s||(s=new Set,this.contexts.set(e,s)),this.links[Object(a.e)(e)]=e;for(const e of s)if(Object(n.b)(e,t))return;s.add(t)}getReferenceByLink(e){return this.links[Object(a.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,s){if([s,e]=this.getContexts(e),s)for(const i of s)if(Object(n.b)(i,t))return s.delete(i),s.size||(this.contexts.delete(e),delete this.links[Object(a.e)(e)]),!0;return!1}refreshReference(e,t){if(this.log("refreshReference: start",e.slice(),t),!t){const s=this.getContext(e);if(!s)return this.log("refreshReference: got no context for reference:",e.slice()),Promise.reject("NO_CONTEXT");[t,e]=s}let s;switch(null==t?void 0:t.type){case"message":s=i.a.wrapSingleMessage(t.peerId,t.messageId,!0);break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const n=Object(a.e)(e);return this.log("refreshReference: refreshing reference:",n),s.then(()=>{const s=Object(a.e)(e);if(this.log("refreshReference: refreshed, reference before:",n,"after:",s),n!==s)return e;this.deleteContext(e,t);const i=this.getContext(e);if(i)return this.refreshReference(e,i[0]);throw this.log.error("refreshReference: no new context, reference before:",n,"after:",s,t),"NO_NEW_CONTEXT"})}};r.a.referenceDatabase=h,t.a=h},133:function(e,t,s){"use strict";function i(e){var t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}s.d(t,"a",(function(){return i}))},139:function(e,t,s){"use strict";var i=s(29),a=s(0),n=s(43),r=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const o=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=Object(n.b)("OPUS",n.a.Error)}isPlaySupported(){if(void 0!==this.isPlaySupportedResult)return this.isPlaySupportedResult;const e=document.createElement("audio");return this.isPlaySupportedResult=!(!e.canPlayType||!e.canPlayType("audio/ogg;").replace(/no/,""))}loadWavWorker(){this.wavWorker||(this.wavWorker=new Worker("waveWorker.min.js"),this.wavWorker.addEventListener("message",e=>{const t=e.data;if(this.log("[WAV] got message:",t),t&&t.page){const e=t.page;this.onTaskEnd(this.tasks.shift(),e)}}))}loadWorker(){this.worker||(this.worker=new Worker("decoderWorker.min.js"),this.worker.addEventListener("message",e=>{const t=e.data;this.log("[DECODER] got message",t),"done"===t.type?(this.wavWorker.postMessage({command:"done"}),t.waveform&&(this.tasks[0].waveform=t.waveform)):this.wavWorker.postMessage({command:"encode",buffers:e.data},a.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},a.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((s,i)=>{const a={pages:e,withWaveform:t,callback:{resolve:s,reject:i},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(a)&&this.executeNewTask(a)})}decode(e,t=!1){return r(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then(e=>{const t=new Blob([e.bytes],{type:"audio/wav"});return{url:URL.createObjectURL(t),waveform:e.waveform}})}))}};i.a.opusDecodeController=o,t.a=o},140:function(e,t,s){"use strict";var i=s(50),a=s(64),n=s(31),r=s(15),o=s(34),d=s(77),l=s(29);const h=new Set(["photo","video","gif","document"]);const c=new class{constructor(){this.webpages={},this.pendingWebPages={},r.default.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,s){var l,c;if("webPageNotModified"===e._)return;const{id:g}=e,p=this.webpages[g],u=p&&p._===e._&&p.hash==p.hash;if("webPage"===e._){"photo"===(null===(l=e.photo)||void 0===l?void 0:l._)?e.photo=i.a.savePhoto(e.photo,s):delete e.photo,"document"===(null===(c=e.document)||void 0===c?void 0:c._)?e.document=a.a.saveDoc(e.document,s):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name;let r=e.title||e.author||t||"";t&&r===t&&delete e.site_name,r=Object(d.f)(r,80,100),e.rTitle=n.a.wrapRichText(r,{noLinks:!0,noLinebreaks:!0});let o="";if("GitHub"===t){const t=e.url.match(/(https?:\/\/github\.com\/[^\/]+\/[^\/]+)/);t&&(o=t[0]+"/issues/{1}")}const g=Object(d.f)(e.description||"",150,180);e.rDescription=n.a.wrapRichText(g,{contextSite:t||"external",contextHashtag:o}),h.has(e.type)||e.description||!e.photo||(e.type="photo")}let f=this.pendingWebPages[g];if(t&&(f||(f=this.pendingWebPages[g]=new Set),f.add(t)),void 0===p?this.webpages[g]=e:Object(o.i)(p,e),!t&&void 0!==f&&u){const e=[];f.forEach(t=>{const[s,i,a]=t.split("_");e.push({peerId:s.toPeerId(),mid:+i,isScheduled:!!a})}),r.default.dispatchEvent("webpage_updated",{id:g,msgs:e})}return e}getMessageKeyForPendingWebPage(e,t,s){return e+"_"+t+(s?"_s":"")}deleteWebPageFromPending(e,t){const s=e.id;if(!s)return;const i=this.pendingWebPages[s];i&&i.has(t)&&(i.delete(t),i.size||delete this.pendingWebPages[s])}getWebPage(e){return this.webpages[e]}};l.a&&(l.a.appWebPagesManager=c),t.a=c},141:function(e,t,s){"use strict";var i=s(117);const a=new Set(["image/jpeg","image/png","image/bmp"]);i.a&&a.add("image/webp"),t.a=a},144:function(e,t,s){"use strict";s.d(t,"a",(function(){return o}));s(75);var i=0,a=0;for(i=0;1<1<>=1))-1;n(1,1,1),n(0,1,1),new Array(0);function n(e,t,s){var a;a=s>(a=Math.ceil(t/i)+1)?s:a;var n=new Array(a);return r(n,e),n}function r(e,t){var s,n,r=e.length;for(n=t,s=0;s>=i}function o(e){return"object"==typeof e&&null!==e}},145:function(e,t,s){"use strict";var i=s(0);var a=!!document.createElement("video").canPlayType("video/quicktime")||i.IS_SAFARI||i.IS_APPLE_MOBILE;const n=new Set(["image/gif","video/mp4","video/webm"]);a&&n.add("video/quicktime");t.a=n},39:function(e,t,s){"use strict";var i=s(74),a=s(103),n=s(45),r=s(55),o=s(104),d=s(34),l=s(66),h=s(77),c=s(16),g=s(43),p=s(32),u=s(132),f=s(68),m=s(31),_=s(15),v=s(111),M=s(44),I=s(124),y=s(46),P=s(2);class b{constructor(e,t,s,i,a,n,r,o,d,l){this.appMessagesManager=e,this.appChatsManager=t,this.appPeersManager=s,this.appUsersManager=i,this.appDraftsManager=a,this.appNotificationsManager=n,this.appStateManager=r,this.apiUpdatesManager=o,this.serverTimeManager=d,this.appMessagesIdsManager=l,this.folders={},this.onUpdateFolderPeers=e=>{e.folder_peers.forEach(e=>{var t;const{folder_id:s,peer:i}=e,a=this.appPeersManager.getPeerId(i),n=this.dropDialog(a)[0];n&&((null===(t=n.pFlags)||void 0===t?void 0:t.pinned)&&this.handleDialogUnpinning(n,s),n.folder_id=s,this.generateIndexForDialog(n),this.pushDialog(n)),this.appMessagesManager.scheduleHandleNewDialogs(a,n)})},this.onUpdateDialogPinned=e=>{var t;const s=null!==(t=e.folder_id)&&void 0!==t?t:0,i=this.appPeersManager.getPeerId(e.peer.peer),a=this.getDialogOnly(i);a&&(e.pFlags.pinned?a.pFlags.pinned=!0:this.handleDialogUnpinning(a,s),this.generateIndexForDialog(a)),this.appMessagesManager.scheduleHandleNewDialogs(i,a)},this.onUpdatePinnedDialogs=e=>{var t;const s=null!==(t=e.folder_id)&&void 0!==t?t:0,i=e=>{this.pinnedOrders[s].length=0,e.reverse(),e.forEach(e=>{a[e]=!0;const t=this.getDialogOnly(e);this.appMessagesManager.scheduleHandleNewDialogs(e,t),t&&(t.pFlags.pinned=!0,this.generateIndexForDialog(t))});const t=this.getFolderDialogs(s,!1);for(const e of t){if(!e.pFlags.pinned)break;const t=e.peerId;a[t]||this.appMessagesManager.scheduleHandleNewDialogs(t)}},a={};e.order?i(e.order.map(e=>this.appPeersManager.getPeerId(e.peer))):p.a.invokeApi("messages.getPinnedDialogs",{folder_id:s}).then(e=>{this.applyDialogs(e),i(e.dialogs.map(e=>e.peerId))})},this.storage=this.appStateManager.storages.dialogs,this.dialogs=this.storage.getCache(),this.clear(!0),_.default.addEventListener("language_change",()=>{const e=i.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=s.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}});const h=e=>{const t=this.getCachedDialogs(!1);for(let s=0;s{const e=this.getCachedDialogs(!1);for(const e in this.folders)+e>1&&delete this.folders[e];for(let t=0;t{const t=this.getCachedDialogs(!1),s="index_"+e.orderIndex;for(let e=0;e{const t=this.appChatsManager.getChat(e),s=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(s)&&this.dropDialogOnDeletion(s)}),_.default.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updatePinnedDialogs:this.onUpdatePinnedDialogs}),r.getState().then(e=>{this.pinnedOrders=e.pinnedOrders||{},this.pinnedOrders[0]||(this.pinnedOrders[0]=[]),this.pinnedOrders[1]||(this.pinnedOrders[1]=[]);const t=r.storagesResults.dialogs;if(t.length)for(let e=0,s=t.length;evoid 0===e.migratedTo):s.dialogs}getCachedDialogs(e){return this.getFolderDialogs(0,e).concat(this.getFolderDialogs(1,e))}setDialogIndexInFilter(e,t,s){var i;let a;if(this.appMessagesManager.filtersStorage.testDialogForFilter(e,s)){const t=s.pinnedPeerIds.indexOf(e.peerId);a=-1!==t?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(s.pinned_peers.length-1-t),!0):(null===(i=e.pFlags)||void 0===i?void 0:i.pinned)?this.generateIndexForDialog(e,!0):e.index}return e[t]=a}getDialog(e,t,s=!0){const i=[];void 0===t?i.push(this.getFolder(0).dialogs,this.getFolder(1).dialogs):i.push(this.getFolderDialogs(t,!1));for(let t of i){let i=0,a=0;for(let n=t.length;it.peerId===e.peerId),n=i[a],r=n&&n[s],o=this.setDialogIndexInFilter(e,s,t);r!==o&&((!r&&o||a&&!o)&&this.prepareFolderUnreadCountModifyingByDialog(t.id,e,!!o),-1!==a&&i.splice(a,1),o&&Object(M.f)(i,e,s,a))}prepareDialogUnreadCountModifying(e){const t=[this.prepareFolderUnreadCountModifyingByDialog(e.folder_id,e)],s=this.appMessagesManager.filtersStorage.filters;for(const i in s){const a=s[i];this.appMessagesManager.filtersStorage.testDialogForFilter(e,a)&&t.push(this.prepareFolderUnreadCountModifyingByDialog(a.id,e))}return()=>t.forEach(e=>e())}prepareFolderUnreadCountModifyingByDialog(e,t,s){const i=this.appMessagesManager.getDialogUnreadCount(t);if(void 0===s)return()=>{const s=this.appMessagesManager.getDialogUnreadCount(t),a=s-i,n=s&&!i||!s&&i?i?-1:1:0;this.modifyFolderUnreadCount(e,a,n)};this.modifyFolderUnreadCount(e,s?i:-i,i?s?1:-1:0)}modifyFolderUnreadCount(e,t,s){if(!t&&!s)return;const i=this.getFolder(e);t&&(i.unreadMessagesCount=Math.max(0,i.unreadMessagesCount+t)),s&&(i.unreadDialogsCount=Math.max(0,i.unreadDialogsCount+s)),void 0===i.dispatchUnreadTimeout&&(i.dispatchUnreadTimeout=P.a.setTimeout(()=>{i.dispatchUnreadTimeout=void 0,_.default.dispatchEvent("folder_unread",i)},0))}generateIndexForDialog(e,t=!1,s){var i;let a,n=0;if(e.pFlags.pinned&&!t)n=this.generateDialogPinnedDate(e),a=!0;else{s||(s=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),n=s.date||n;const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!n||e.date&&e.date>n)&&(n=e.date)}"draftMessage"===(null===(i=e.draft)||void 0===i?void 0:i._)&&e.draft.date>n&&(n=e.draft.date)}n||(n=Object(r.g)(!0));const o=this.generateDialogIndex(n,a);if(t)return o;e.index=o}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.pinnedOrders[e.folder_id],s=t.indexOf(e.peerId);let i=s;return-1===s&&(i=t.push(e.peerId)-1,this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(i)}setDialogToState(e){const{peerId:t,pts:s}=e,i=this.appMessagesManager.getHistoryStorage(t),a=this.appMessagesManager.getMessagesStorage(t),n=i.history.slice;let r;for(let e=0,s=n.length;ee.peerId===n);if(-1!==o&&r.splice(o,1),this.dialogs[n]=e,this.setDialogToState(e),void 0===t&&(t=this.getDialogOffsetDate(e)),this.processDialogForFilters(e),t&&!e.pFlags.pinned){if(i){const e=this.dialogsOffsetDate[void 0];(!e||t{"dialogFolder"===t._&&e.dialogs.splice(s,1)}),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const t={};e.dialogs.forEach(e=>{const s=this.appPeersManager.getPeerId(e.peer);let i=e.top_message;const a=this.appMessagesManager.pendingTopMsgs[s];a&&(!i||this.appMessagesManager.getMessageByPeer(s,a).date>this.appMessagesManager.getMessageByPeer(s,i).date)&&(e.top_message=i=a,this.appMessagesManager.getHistoryStorage(s).maxId=a),i||e.draft&&"draftMessage"===e.draft._?(this.saveDialog(e),t[s]=e):this.dropDialogWithEvent(s);const n=this.appMessagesManager.newUpdatesAfterReloadToHandle[s];if(void 0!==n){for(const e of n)this.apiUpdatesManager.saveUpdate(e);delete this.appMessagesManager.newUpdatesAfterReloadToHandle[s]}}),Object.keys(t).length&&_.default.dispatchEvent("dialogs_multiupdate",t)}getDialogOffsetDate(e){return this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message).date||0}saveDialog(e,t,s,i){var a,n;void 0===t&&(t=null!==(a=e.folder_id)&&void 0!==a?a:0);const r=this.appPeersManager.getPeerId(e.peer);if(!r)return void console.error("saveConversation no peerId???",e,t);"dialog"!==e._&&console.error("saveConversation not regular dialog",e,Object.assign({},e));const o=this.appPeersManager.isChannel(r)?r.toChatId():y.b;if(r.isAnyChat()){const e=this.appChatsManager.getChat(r.toChatId());if("channelForbidden"===e._||e.pFlags.left||e.pFlags.kicked)return}const l=this.appPeersManager.getPeerSearchText(r);this.dialogsIndex.indexObject(r,l);const h=this.getDialogOnly(r);let c,g;if(e.top_message){c=this.appMessagesIdsManager.generateMessageId(e.top_message);const t=(null==h?void 0:h.top_message)&&this.appMessagesManager.getMessageByPeer(r,h.top_message);(null===(n=null==t?void 0:t.pFlags)||void 0===n?void 0:n.is_outgoing)&&h.top_message>=c&&(c=h.top_message),g=this.appMessagesManager.getMessageByPeer(r,c)}else c=this.appMessagesManager.generateTempMessageId(r),g={_:"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([g],{isOutgoing:!0});if((null==g?void 0:g.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,g),!o&&r.isAnyChat()){const t=this.appChatsManager.getChat(r.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const s=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[r]=s,this.appMessagesManager.migratedToFrom[s]=r,e.migratedTo=s}}if(e.top_message=c,e.read_inbox_max_id=this.appMessagesIdsManager.generateMessageId(h&&!e.read_inbox_max_id?h.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=this.appMessagesIdsManager.generateMessageId(h&&!e.read_outbox_max_id?h.read_outbox_max_id:e.read_outbox_max_id),void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=h?h.folder_id:t),e.draft=this.appDraftsManager.saveDraft(r,0,e.draft),e.peerId=r,g.pFlags.is_outgoing){const t=g.pFlags.out;c>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 p=this.appMessagesManager.getHistoryStorage(r),u=p.history.slice;if(u.length){if(!u.isEnd(I.a.Bottom)){p.history.insertSlice([c]).setEnd(I.a.Bottom),this.appMessagesManager.mergeReplyKeyboard(p,g)&&_.default.dispatchEvent("history_reply_markup",{peerId:r})}}else p.history.unshift(c),this.appMessagesManager.mergeReplyKeyboard(p,g)&&_.default.dispatchEvent("history_reply_markup",{peerId:r});p.maxId=c,p.readMaxId=e.read_inbox_max_id,p.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:r,settings:e.notify_settings}),o&&e.pts&&this.apiUpdatesManager.addChannelState(o,e.pts),this.generateIndexForDialog(e),Object(d.c)(e,["index_0","index_1","index_2","index_3","index_4","index_5","index_6","index_7","index_8","index_9","index_10"]),h&&Object(d.i)(h,e),this.pushDialog(e,g.date,s,i)}getDialogIndexKey(e){return e>1?"index_"+this.appMessagesManager.filtersStorage.getFilter(e).orderIndex:"index"}getDialogs(e="",t,s=20,i=0,a=!1){const n={};if(i>1){const r=[],o=this.appUsersManager.fillContacts();o.cached||r.push(o.promise);const d=this.appMessagesManager.filtersStorage.reloadMissingPeerIds(i);if(d&&r.push(d),r.length)return n.cached=!1,n.promise=Promise.all(r).then(()=>this.getDialogs(e,t,s,i,a).promise),n}const r=i>1||this.getOffsetDate(i)?void 0:i;let o=this.getFolderDialogs(i,a);const d=this.getDialogIndexKey(i);if(e){if(!s||this.cachedResults.query!==e||this.cachedResults.folderId!==i){this.cachedResults.query=e,this.cachedResults.folderId=i;const t=this.dialogsIndex.search(e),s=[];for(const e in this.dialogs){const a=this.dialogs[e];t.has(a.peerId)&&a.folder_id===i&&s.push(a)}s.sort((e,t)=>t[d]-e[d]),this.cachedResults.dialogs=s,this.cachedResults.count=s.length}o=this.cachedResults.dialogs}else this.cachedResults.query="";let l=0;if(t>0)for(let e=o.length;lo[l][d]);++l);const h=this.isDialogsLoaded(r),c=o.length>=l+s;if(e||h||c){const i=o.slice(l,l+s);return n.cached=!0,n.promise=Promise.resolve({dialogs:i,count:h?o.length:null,isTopEnd:o.length&&(i[0]&&i[0]===o[0]||o[0][d]=o.length}),n}return n.cached=!1,n.promise=this.appMessagesManager.getTopMessages(s,r).then(e=>{if(a&&(o=this.getFolderDialogs(i,a)),l=0,t>0)for(let e=o.length;lo[l][d]);++l);const n=o.slice(l,l+s);return{dialogs:n,count:void 0===e.count?o.length:e.count,isTopEnd:o.length&&(n[0]&&n[0]===o[0]||o[0][d]{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id]),this.appStateManager.pushToState("filters",this.filters)},this.onUpdateDialogFilterOrder=e=>{this.orderIndex=1,e.order.forEach((e,t)=>{const s=this.filters[e];delete s.orderIndex,this.setOrderIndex(s)}),this.rootScope.dispatchEvent("filter_order",e.order),this.appStateManager.pushToState("filters",this.filters)},this.clear(),this.filters={},this.appStateManager.getState().then(e=>{Object(d.i)(this.filters,e.filters);for(const e in this.filters){const t=this.filters[e];t.hasOwnProperty("orderIndex")&&t.orderIndex>=this.orderIndex&&(this.orderIndex=t.orderIndex+1)}}),r.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:e=>{const t=Object(d.a)(this.filters);this.getDialogFilters(!0).then(e=>{for(const s in t){const t=+s;e.find(e=>e.id===t)||this.onUpdateDialogFilter({_:"updateDialogFilter",id:t})}this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e.map(e=>e.id)})})},updateDialogFilterOrder:this.onUpdateDialogFilterOrder})}clear(e=!1){e||Object(d.i)(this.filters,{}),this.orderIndex=1,this.reloadedPeerIds=new Set}testDialogForFilter(e,t){const s=e.peerId;if(!this.appMessagesManager.getDialogOnly(s))return!1;if(t.excludePeerIds.includes(s))return!1;if(t.includePeerIds.includes(s))return!0;const i=t.pFlags;if(i.exclude_archived&&1===e.folder_id)return!1;if(i.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(i.exclude_muted){if(this.appNotificationsManager.isPeerLocalMuted(s))return!1}if(this.appPeersManager.isAnyChat(s)){if(i.broadcasts&&this.appPeersManager.isBroadcast(s))return!0;if(i.groups&&this.appPeersManager.isAnyGroup(s))return!0}else{const e=s.toUserId();if(this.appUsersManager.isBot(e))return!!i.bots;if(i.non_contacts&&!this.appUsersManager.isContact(e))return!0;if(i.contacts&&this.appUsersManager.isContact(e))return!0}return!1}testDialogForFilterId(e,t){return this.testDialogForFilter(e,this.filters[t])}getFilter(e){return this.filters[e]}toggleDialogPin(e,t){const s=this.filters[t],i=s.pinnedPeerIds.indexOf(e),a=-1!==i;if(a&&(s.pinned_peers.splice(i,1),s.pinnedPeerIds.splice(i,1)),!a){if(s.pinned_peers.length>=this.rootScope.config.pinned_infolder_count_max)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"});s.pinned_peers.unshift(this.appPeersManager.getInputPeerById(e)),s.pinnedPeerIds.unshift(e)}return this.updateDialogFilter(s)}createDialogFilter(e,t){const s=Math.max(1,...Object.keys(this.filters).map(e=>+e));return(e=Object(d.a)(e)).id=s+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,s=!1){const i=t?0:1;return p.a.invokeApi("messages.updateDialogFilter",{flags:i,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then(i=>{if(i&&(this.onUpdateDialogFilter({_:"updateDialogFilter",id:e.id,filter:t?void 0:e}),s)){const t=[];for(const e in this.filters){const s=this.filters[e];++s.orderIndex,t.push(s)}e.orderIndex=1;const s=t.sort((e,t)=>e.orderIndex-t.orderIndex).map(e=>e.id);this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:s})}return i})}getOutputDialogFilter(e){const t=Object(d.a)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){Object(M.d)(e.includePeerIds,(t,s)=>{e.pinnedPeerIds.includes(t)&&(e.include_peers.splice(s,1),e.includePeerIds.splice(s,1))})}reloadMissingPeerIds(e){const t=[],s=this.getFilter(e),i=null==s?void 0:s.pinned_peers;if(null==i?void 0:i.length){const e=i.filter((e,t)=>{const s=this.appPeersManager.getPeerId(e);return!this.reloadedPeerIds.has(s)&&!this.appMessagesManager.getDialogOnly(s)});if(e.length){const s=e.map(e=>{const t=this.appPeersManager.getPeerId(e),s=this.appMessagesManager.reloadConversation(e);return s.then(()=>{this.reloadedPeerIds.add(t)}),s}),i=Promise.all(s);t.push(i)}}return t.length?Promise.all(t):void 0}getDialogFilters(e=!1){return S(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);if(t.length&&!e)return t.map(e=>this.filters[e]).sort((e,t)=>e.orderIndex-t.orderIndex);const s=yield p.a.invokeApiSingle("messages.getDialogFilters");for(const t of s)this.saveDialogFilter(t,e);return s}))}saveDialogFilter(e,t=!0){C.forEach(([t,s])=>{e[s]=e[t].map(e=>this.appPeersManager.getPeerId(e))}),this.filterIncludedPinnedPeers(e),e.include_peers=e.pinned_peers.concat(e.include_peers),e.includePeerIds=e.pinnedPeerIds.concat(e.includePeerIds);const s=this.filters[e.id];s?Object.assign(s,e):this.filters[e.id]=e,this.setOrderIndex(e),t?this.rootScope.dispatchEvent("filter_update",e):s||this.rootScope.dispatchEvent("filter_new",e)}setOrderIndex(e){e.hasOwnProperty("orderIndex")?e.orderIndex>=this.orderIndex&&(this.orderIndex=e.orderIndex+1):e.orderIndex=this.orderIndex++,this.appStateManager.pushToState("filters",this.filters)}}var D=s(79),U=s(47),E=s(64),A=s(73),F=s(42),k=s(50),x=s(125),T=s(17),O=s(40),L=s(140),j=s(113),R=s(122),B=s(70),N=s(29),H=s(95),z=s(54),q=s(133),W=s(94);const V={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks"};function G(e){const t=function(e,t=2){e||(e=1);let s=[];const i=[{m:1,t:"s"},{m:60,t:"m"},{m:60,t:"h"},{m:24,t:"d"},{m:7,t:"w"}];let a=1;i.forEach((t,n)=>{if(a*=t.m,e=0;--e)0===n[e].duration&&n.splice(e,1);return n}(e,2).map(e=>Object(c.i18n)(V[e.type],[e.duration])),s=document.createElement("span");return s.append(...Object(c.join)(t,!1)),s}var K=s(114),$=s(24),Q=s(108),Y=s(107),Z=s(102),J=s(141),X=s(145),ee=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const te=new class{constructor(){this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new i.a(10),this.needSingleMessages=new Map,this.fetchSingleMessagesPromise=null,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newMessagesHandleTimeout=0,this.newMessagesToHandle={},this.newDialogsToHandle={},this.newUpdatesAfterReloadToHandle={},this.notificationsHandlePromise=0,this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=Object(g.b)("MESSAGES",g.a.Error|g.a.Debug|g.a.Log|g.a.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.handleNewMessages=()=>{clearTimeout(this.newMessagesHandleTimeout),this.newMessagesHandleTimeout=0,_.default.dispatchEvent("history_multiappend",this.newMessagesToHandle),this.newMessagesToHandle={}},this.handleNewDialogs=()=>{let e=0;const t=this.newDialogsToHandle;for(const s in t){const i=t[s];i?(this.dialogsStorage.pushDialog(i),F.a.isChannel(s.toPeerId())||(e=Math.max(e,i.top_message||0))):(this.reloadConversation(s.toPeerId()),delete t[s])}0!==e&&this.incrementMaxSeenId(e),_.default.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle={}},this.handleNotifications=()=>{window.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=0;for(const e in this.notificationsToHandle){const t=e.toPeerId();if(_.default.peerId===t&&!_.default.idle.isIDLE)continue;const s=this.notificationsToHandle[t];Promise.all([H.a.getNotifyPeerTypeSettings(),H.a.getNotifySettings(F.a.getInputNotifyPeerById(t,!0))]).then(([e,i])=>{const a=s.topMessage;!H.a.isPeerLocalMuted(t,!0)&&a.pFlags.unread&&a.pFlags.unread&&this.notifyAboutMessage(a,{fwdCount:s.fwdCount,peerTypeNotifySettings:i})})}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id,s=this.pendingByRandomId[t];if(s){const{peerId:i,tempId:a,threadId:n,storage:r}=s,o=Z.a.generateMessageId(e.id),d=this.getMessageFromStorage(r,o);d.deleted?this.pendingByMessageId[o]=t:([this.getHistoryStorage(i),n?this.getHistoryStorage(i,n):void 0].filter(Boolean).forEach(e=>{e.history.delete(a)}),this.finalizePendingMessageCallbacks(r,a,d))}},this.onUpdateNewMessage=e=>{var t;const s=e.message,i=this.getMessagePeer(s),a=this.getMessagesStorage(i),n=this.getDialogOnly(i),r="updateNewDiscussionMessage"===e._;this.saveMessages([s],{storage:new Map});const o=this.getThreadKey(s),d=o?+o.split("_")[1]:void 0;if(d&&!r&&this.threadsStorage[i]&&this.threadsStorage[i][d]){const e={_:"updateNewDiscussionMessage",message:s};this.onUpdateNewMessage(e)}if(!n&&!r){let s=!0;if(i.isAnyChat()&&(s=U.a.isInChat(i.toChatId())),s){const s=null!==(t=this.newUpdatesAfterReloadToHandle[i])&&void 0!==t?t:this.newUpdatesAfterReloadToHandle[i]=new Set;if(s.has(e))return void this.log.error("here we go again",i);this.scheduleHandleNewDialogs(i),s.add(e)}return}this.saveMessages([s],{storage:a});const l=this.checkPendingMessage(s),h=this.getHistoryStorage(i,r?d:void 0);if(r||this.updateMessageRepliesIfNeeded(s),h.history.findSlice(s.mid))return!1;const c=h.history.first;if(c.isEnd(I.a.Bottom)){let e=0;for(const t=c.length;ec[e]);++e);c.splice(e,0,s.mid)}else h.history.unshift(s.mid);null!==h.count&&h.count++,this.mergeReplyKeyboard(h,s)&&_.default.dispatchEvent("history_reply_markup",{peerId:i});const g=s.fromId;if(g.isUser()&&!s.pFlags.out&&s.from_id){O.a.forceUserOnline(g,s.date);const e={_:"sendMessageCancelAction"};let t;t=i.isUser()?{_:"updateUserTyping",action:e,user_id:g}:F.a.isChannel(i)?{_:"updateChannelUserTyping",action:e,channel_id:i.toChatId(),from_id:F.a.getOutputPeer(g),top_msg_id:d?Z.a.getServerMessageId(d):void 0}:{_:"updateChatUserTyping",action:e,chat_id:i.toChatId(),from_id:F.a.getOutputPeer(g)},D.a.processLocalUpdate(t)}if(l||this.handleNewMessage(i,s.mid),r)return;const p=!s.pFlags.out&&s.pFlags.unread;if(n){if(p){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(n);++n.unread_count,s.pFlags.mentioned&&(++n.unread_mentions_count,this.modifyCachedMentions(i,s.mid,!0)),e()}this.setDialogTopMessage(s,n)}if(p){const e=i;let t=this.notificationsToHandle[e];void 0===t&&(t=this.notificationsToHandle[e]={fwdCount:0,fromId:y.b}),t.fromId!==g&&(t.fromId=g,t.fwdCount=0),s.fwd_from&&++t.fwdCount,t.topMessage=s,this.notificationsHandlePromise||(this.notificationsHandlePromise=window.setTimeout(this.handleNotifications,0))}},this.onUpdateDialogUnreadMark=e=>{const t=F.a.getPeerId(e.peer.peer),s=this.getDialogOnly(t);if(s){const i=this.dialogsStorage.prepareDialogUnreadCountModifying(s);e.pFlags.unread?s.pFlags.unread_mark=!0:delete s.pFlags.unread_mark,i(),_.default.dispatchEvent("dialogs_multiupdate",{[t]:s}),this.dialogsStorage.setDialogToState(s)}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{const t=e.message,s=this.getMessagePeer(t),i=Z.a.generateMessageId(t.id),a=this.getMessagesStorage(s);if(!a.has(i))return;const n=this.getMessageFromStorage(a,i);this.saveMessages([t],{storage:a});const r=this.getMessageFromStorage(a,i);this.handleEditedMessage(n,r);const o=this.getDialogOnly(s),d=o&&o.top_message===i;if(t.clear_history)d&&_.default.dispatchEvent("dialog_flush",{peerId:s});else if(_.default.dispatchEvent("message_edit",{storage:a,peerId:s,mid:i}),d||t.grouped_id){const e={};e[s]=o,_.default.dispatchEvent("dialogs_multiupdate",e),this.dialogsStorage.setDialogToState(o)}},this.onUpdateReadHistory=e=>{const t=e.channel_id,s=Z.a.generateMessageId(e.max_id||e.read_max_id),i=Z.a.generateMessageId(e.top_msg_id),a=t?t.toPeerId(!0):F.a.getPeerId(e.peer),n="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=this.getMessagesStorage(a),o=Object(d.e)(r,"desc"),l=this.getDialogOnly(a),h=e.still_unread_count;let c=0,g=0,p=!1;const u=this.getHistoryStorage(a,i);if(a.isUser()&&n&&O.a.forceUserOnline(a),i){const e=this.threadsToReplies[a+"_"+i];if(e){const[t,s]=e.split("_");this.updateMessage(t.toPeerId(),+s,"replies_updated")}}const f=!i&&l&&this.dialogsStorage.prepareDialogUnreadCountModifying(l);for(let e=0,t=o.length;es)continue;const d=r.get(t);if(d.pFlags.out===n){if(!d.pFlags.unread)break;if(i){const e=d.reply_to;if(!e||(e.reply_to_top_id||e.reply_to_msg_id)!==i)continue}d.pFlags.unread&&(delete d.pFlags.unread,p||(p=!0),d.pFlags.out||i||!l||(void 0===h&&(c=--l.unread_count),d.pFlags.mentioned&&(g=--l.unread_mentions_count,this.modifyCachedMentions(a,d.mid,!1))),H.a.cancel("msg"+t))}}if(n?u.readOutboxMaxId=s:u.readMaxId=s,!i&&l){if(n?l.read_outbox_max_id=s:l.read_inbox_max_id=s,!n){let e;void 0!==h?e=h:c<0||!this.getReadMaxIdIfUnread(a)?e=0:c&&l.top_message>s&&(e=c),void 0!==e&&(l.unread_count=e),g<0&&(l.unread_mentions_count=0)}f&&f(),this.dialogsStorage.processDialogForFilters(l),_.default.dispatchEvent("dialog_unread",{peerId:a}),this.dialogsStorage.setDialogToState(l)}if(p&&_.default.dispatchEvent("messages_read"),!i&&t){const e=a+"_";for(const t in this.threadsToReplies)if(0===t.indexOf(e)){const[e,s]=this.threadsToReplies[t].split("_");_.default.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+s))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,s=e.messages.map(e=>Z.a.generateMessageId(e)),i=t?t.toPeerId(!0):this.getMessageById(s[0]).peerId;for(let e=0,t=s.length;e{const t=e.channel_id.toPeerId(!0),s=this.getHistoryStorage(t).history.slice,i=Z.a.generateMessageId(e.available_min_id),a=s.filter(e=>e<=i);e.messages=a,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{const t=e.channel_id,s=e.messages.map(e=>Z.a.generateMessageId(e)),i=t?t.toPeerId(!0):this.getMessageById(s[0]).peerId;if(!i)return;p.a.clearCache("messages.getSearchCounters",e=>F.a.getPeerId(e.peer)===i);const a=new Set;for(const e of s){const t=this.getMessageByPeer(i,e),s=this.getThreadKey(t);s&&this.threadsStorage[i]&&this.threadsStorage[i][+s.split("_")[1]]&&a.add(s)}const n=this.handleDeletedMessages(i,this.getMessagesStorage(i),s),r=Array.from(a).map(e=>{const[t,s]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+s)}),o=this.getHistoryStorage(i);[o].concat(r).forEach(e=>{for(const t of n.msgs)e.history.delete(t);n.count&&e.count&&(e.count=Math.max(0,e.count-n.count))}),_.default.dispatchEvent("history_delete",{peerId:i,msgs:n.msgs});const d=this.getDialogOnly(i);if(d){const e=n.unreadMentions||n.unread,t=e&&this.dialogsStorage.prepareDialogUnreadCountModifying(d);if(n.unreadMentions&&(d.unread_mentions_count=Math.max(0,d.unread_mentions_count-n.unreadMentions)),n.unread&&(d.unread_count=Math.max(0,d.unread_count-n.unread)),e&&(t(),_.default.dispatchEvent("dialog_unread",{peerId:i})),n.msgs.has(d.top_message)){const e=o.history.first;if(e.isEnd(I.a.Bottom)&&e.length){const t=e[0],s=this.getMessageByPeer(i,t);this.setDialogTopMessage(s,d)}else this.reloadConversation(i)}}},this.onUpdateChannel=e=>{const t=e.channel_id,s=t.toPeerId(!0),i=U.a.getChat(t),a=U.a.isInChat(t);(!!i.username||!i.pFlags.left)!==(void 0!==this.historiesStorage[s])&&(delete this.historiesStorage[s],_.default.dispatchEvent("history_forbidden",s));!!this.getDialogOnly(s)!==a&&(a?this.reloadConversation(s):this.dialogsStorage.dropDialogOnDeletion(s))},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.dialogsStorage.dropDialog(t),delete this.historiesStorage[t],this.reloadConversation(t).then(()=>{_.default.dispatchEvent("history_reload",t)})},this.onUpdateChannelMessageViews=e=>{const t=e.views,s=e.channel_id.toPeerId(!0),i=Z.a.generateMessageId(e.id),a=this.getMessageByPeer(s,i);!a.deleted&&void 0!==a.views&&a.views{const t=y.d,s=t,i=this.generateTempMessageId(s),a={_:"message",id:i,from_id:F.a.getOutputPeer(t),peer_id:F.a.getOutputPeer(s),pFlags:{unread:!0},date:(e.inbox_date||Object(r.g)(!0))+f.a.serverTimeOffset,message:e.message,media:e.media,entities:e.entities};O.a.hasUser(t)||O.a.saveApiUsers([{_:"user",id:t,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([a],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[s]=i,this.onUpdateNewMessage({_:"updateNewMessage",message:a,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,s=t?t.toPeerId(!0):F.a.getPeerId(e.peer),i=e.messages.map(e=>Z.a.generateMessageId(e)),a=this.getMessagesStorage(s),n=i.filter(e=>!a.has(e));(n.length?Promise.all(n.map(e=>this.wrapSingleMessage(s,e))):Promise.resolve()).finally(()=>{var t;const n=null===(t=e.pFlags)||void 0===t?void 0:t.pinned;if(n)for(const e of i){a.get(e).pFlags.pinned=!0}else for(const e of i){delete a.get(e).pFlags.pinned}delete this.pinnedMessages[s],T.default.getState().then(e=>{delete e.hiddenPinnedMessages[s],_.default.dispatchEvent("peer_pinned_messages",{peerId:s,mids:i,pinned:n})})})},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:s}=e;if("notifyPeer"===t._){const e=F.a.getPeerId(t.peer),i=this.getDialogOnly(e);i&&(i.notify_settings=s,_.default.dispatchEvent("dialog_notify_settings",i),this.dialogsStorage.setDialogToState(i))}},this.onUpdateNewScheduledMessage=e=>{const t=e.message,s=this.getMessagePeer(t),i=this.scheduledMessagesStorage[s];if(i){const e=Z.a.generateMessageId(t.id),a=this.getMessageFromStorage(i,e);this.saveMessages([t],{storage:i,isScheduled:!0});const n=this.getMessageFromStorage(i,e);if(a.deleted){this.checkPendingMessage(t)||_.default.dispatchEvent("scheduled_new",{peerId:s,mid:t.mid})}else this.handleEditedMessage(a,n),_.default.dispatchEvent("message_edit",{storage:i,peerId:s,mid:t.mid})}},this.onUpdateDeleteScheduledMessages=e=>{const t=F.a.getPeerId(e.peer),s=this.scheduledMessagesStorage[t];if(s){const i=e.messages.map(e=>Z.a.generateMessageId(e));this.handleDeletedMessages(t,s,i),_.default.dispatchEvent("scheduled_delete",{peerId:t,mids:i})}},this.clear(),_.default.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,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}),_.default.addEventListener("notify_peer_type_settings",({key:e,settings:t})=>{let s;s="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>e.peerId.isBroadcast():e=>F.a.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(s).forEach(e=>{_.default.dispatchEvent("dialog_notify_settings",e)})}),_.default.addEventListener("webpage_updated",({id:e,msgs:t})=>{t.forEach(({peerId:t,mid:s,isScheduled:i})=>{const a=i?this.getScheduledMessagesStorage(t):this.getMessagesStorage(t),n=this.getMessageFromStorage(a,s);n&&(n.media={_:"messageMediaWebPage",webpage:L.a.getWebPage(e)},_.default.dispatchEvent("message_edit",{storage:a,peerId:t,mid:s}))})}),_.default.addEventListener("draft_updated",({peerId:e,threadId:t,draft:s})=>{if(t)return;const i=this.getDialogOnly(e);if(i){if(!t){i.draft=s;let t=!1;s||Z.a.getServerMessageId(i.top_message)?(this.dialogsStorage.generateIndexForDialog(i),this.dialogsStorage.pushDialog(i)):(this.dialogsStorage.dropDialog(e),t=!0),_.default.dispatchEvent("dialog_draft",{peerId:e,dialog:i,drop:t,draft:s,index:i.index})}}else this.reloadConversation(e)}),_.default.addEventListener("poll_update",({poll:e})=>{const t=x.a.pollToMessages[e.id];if(t)for(const e of t){const[t,s]=e.split("_"),i=this.getMessageByPeer(t.toPeerId(),+s);this.setDialogToStateIfMessageIsTop(i)}}),T.default.getState().then(e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)})}clear(){this.middleware?this.middleware.clean():this.middleware=Object(Q.a)(),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(),this.filtersStorage&&this.filtersStorage.clear()}construct(){this.filtersStorage=new w(this,F.a,O.a,H.a,T.default,D.a,_.default),this.dialogsStorage=new b(this,U.a,F.a,O.a,j.a,H.a,T.default,D.a,f.a,Z.a)}getInputEntities(e){const t=Object(d.a)(e);return t.forEach(e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=O.a.getUserInput(e.user_id))}),t}invokeAfterMessageIsSent(e,t,s){var i,a;const r=null!==(i=this.tempFinalizeCallbacks[e])&&void 0!==i?i:this.tempFinalizeCallbacks[e]={},o=null!==(a=r[t])&&void 0!==a?a:r[t]={deferred:Object(n.a)()};return o.callback=s,o.deferred}editMessage(e,t,s={}){const{mid:i,peerId:a}=e;if(e.pFlags.is_outgoing)return this.invokeAfterMessageIsSent(i,"edit",e=>this.editMessage(e,t,s));let n=s.entities||[];t&&(t=m.a.parseMarkdown(t,n));const r=s.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return p.a.invokeApi("messages.editMessage",{peer:F.a.getInputPeerById(a),id:e.id,message:t,media:s.newMedia,entities:n.length?this.getInputEntities(n):void 0,no_webpage:s.noWebPage,schedule_date:r}).then(e=>{D.a.processUpdateMessage(e)},e=>{if(this.log.error("editMessage error:",e),!e||"MESSAGE_NOT_MODIFIED"!==e.type)return e&&"MESSAGE_EMPTY"===e.type&&(e.handled=!0),Promise.reject(e);e.handled=!0})}sendText(e,t,s={}){if(!t.trim())return;s.threadId&&!s.replyToMsgId&&(s.replyToMsgId=s.threadId);const i=_.default.config.message_length_max;if(t.length>i){const a=Object(h.g)(t,i);t=a[0],a.length>1&&delete s.webPage;for(let t=1;t{this.sendText(e,a[t],s)},t)}e=F.a.getPeerMigratedTo(e)||e;let a=s.entities||[];s.viaBotId||(t=m.a.parseMarkdown(t,a));let n=this.getInputEntities(a);n.length||(n=void 0);const r=this.generateOutgoingMessage(e,s);r.entities=a,r.message=t;const o=s.replyToMsgId?Z.a.getServerMessageId(s.replyToMsgId):void 0,l=F.a.isChannel(e);s.webPage&&(r.media={_:"messageMediaWebPage",webpage:s.webPage});const c=e=>{e?r.error=!0:delete r.error,_.default.dispatchEvent("messages_pending")};r.send=()=>{c(!1);const i={};let a;return this.pendingAfterMsgs[e]&&(i.afterMessageId=this.pendingAfterMsgs[e].messageId),a=s.viaBotId?p.a.invokeApiAfter("messages.sendInlineBotResult",{peer:F.a.getInputPeerById(e),random_id:r.random_id,reply_to_msg_id:o||void 0,query_id:s.queryId,id:s.resultId,clear_draft:s.clearDraft},i):p.a.invokeApiAfter("messages.sendMessage",{no_webpage:s.noWebPage,peer:F.a.getInputPeerById(e),message:t,random_id:r.random_id,reply_to_msg_id:o||void 0,entities:n,clear_draft:s.clearDraft,schedule_date:s.scheduleDate||void 0,silent:s.silent},i),this.pendingAfterMsgs[e]=i,a.then(e=>{if("updateShortSentMessage"===e._){const t=Object(d.a)(r);t.date=e.date,t.id=e.id,t.media=e.media,t.entities=e.entities,this.wrapMessageEntities(t),e.pFlags.out&&(t.pFlags.out=!0),e={_:"updates",users:[],chats:[],seq:0,date:void 0,updates:[{_:"updateMessageID",random_id:r.random_id,id:t.id},{_:s.scheduleDate?"updateNewScheduledMessage":l?"updateNewChannelMessage":"updateNewMessage",message:t,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach(e=>{"updateDraftMessage"===e._&&(e.local=!0)});D.a.processUpdateMessage(e)},()=>{c(!0)}).finally(()=>{this.pendingAfterMsgs[e]===i&&delete this.pendingAfterMsgs[e]})},this.beforeMessageSending(r,{isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft})}sendFile(e,t,s={}){e=F.a.getPeerMigratedTo(e)||e;const i=this.generateOutgoingMessage(e,s),r=s.replyToMsgId?Z.a.getServerMessageId(s.replyToMsgId):void 0;let d,l;const h="mime_type"in t?t.mime_type:t.type,c=t instanceof File?t.name:"",g=!(t instanceof File||t instanceof Blob);let u=s.caption||"";this.log("sendFile",t,h);const f=s.entities||[];u&&(u=m.a.parseMarkdown(u,f));const v=[],M=J.a.has(h);let I,y,P;if(g)d="document",l="";else if(0===h.indexOf("audio/")||["video/ogg"].indexOf(h)>=0){d="audio",l="audio."+("ogg"===h.split("/")[1]?"ogg":"mp3"),P="sendMessageUploadAudioAction",s.isVoiceMessage&&(d="voice",i.pFlags.media_unread=!0);let e={_:"documentAttributeAudio",pFlags:{voice:s.isVoiceMessage},waveform:s.waveform,duration:s.duration||0};v.push(e)}else if(s.isMedia)if(M){d="photo",l="photo."+h.split("/")[1],P="sendMessageUploadPhotoAction";const e={_:"photoSize",w:s.width,h:s.height,type:"full",location:null,size:t.size};I={_:"photo",id:""+i.id,sizes:[e],w:s.width,h:s.height};const a=A.a.getCacheContext(I,e.type);a.downloaded=t.size,a.url=s.objectURL||"",I=k.a.savePhoto(I)}else if(X.a.has(h)){d="video",l="video.mp4",P="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:s.isRoundMessage,supports_streaming:!0},duration:s.duration,w:s.width,h:s.height};v.push(e),s.noSound&&t.size>10240&&t.size<10485760&&v.push({_:"documentAttributeAnimated"})}else d="document",l="document."+h.split("/")[1],P="sendMessageUploadDocumentAction";else d="document",l="document."+h.split("/")[1],P="sendMessageUploadDocumentAction";if(v.push({_:"documentAttributeFilename",file_name:c||l}),-1!==["document","video","audio","voice"].indexOf(d)&&!g){const e=[];y={_:"document",id:""+i.id,duration:s.duration,attributes:v,w:s.width,h:s.height,thumbs:e,mime_type:h,size:t.size};const a=A.a.getCacheContext(y);let n;if(a.downloaded=t.size,a.url=s.objectURL||"",M)v.push({_:"documentAttributeImageSize",w:s.width,h:s.height}),n={_:"photoSize",w:s.width,h:s.height,type:"full",size:t.size};else if("video"===d&&s.thumb){n={_:"photoSize",w:s.thumb.size.width,h:s.thumb.size.height,type:"local-thumb",size:s.thumb.blob.size};const e=A.a.getCacheContext(y,n.type);e.downloaded=n.size,e.url=s.thumb.url}n&&e.push(n),y=E.a.saveDoc(y)}this.log("sendFile",d,l,t.type,s);const b=g?void 0:new a.a({attachMethod:"prepend",tryAgainOnFail:!1,isUpload:!0}),S=Object(n.a)();b&&(b.attachPromise(S),S.cancel=()=>{const e=new Error("Download canceled");e.name="AbortError",S.reject(e)},S.catch(t=>{"AbortError"!==t.name||U||(this.log("cancelling upload",C),this.cancelPendingMessage(i.random_id),this.setTyping(e,{_:"sendMessageCancelAction"}),(null==x?void 0:x.cancel)&&x.cancel())}));const C=g?void 0:{_:I?"messageMediaPhoto":"messageMediaDocument",pFlags:{},preloader:b,photo:I,document:y,promise:S};i.entities=f,i.message=u,i.media=g?{_:"messageMediaDocument",pFlags:{},document:t}:C;const w=e=>{e?i.error=!0:delete i.error,_.default.dispatchEvent("messages_pending")};let U=!1,x=null;return i.send=()=>{if(g){const{id:e,access_hash:s,file_reference:i}=t,a={_:"inputMediaDocument",id:{_:"inputDocument",id:e,access_hash:s,file_reference:i}};S.resolve(a)}else if(t instanceof File||t instanceof Blob){const a=()=>{let a;return U&&!i.error||(U=!1,x=A.a.upload(t),S.notifyAll({done:0,total:t.size})),"video"===d&&s.objectURL&&(a=new Promise((e,t)=>{(s.thumb&&s.thumb.blob?Promise.resolve(s.thumb):Object(o.a)(s.objectURL)).then(s=>{s?A.a.upload(s.blob).then(e,t):e(null)},t)})),x&&x.then(e=>ee(this,void 0,void 0,(function*(){let t;switch(delete i.media.preloader,e.name=l,U=!0,d){case"photo":t={_:"inputMediaUploadedPhoto",file:e};break;default:t={_:"inputMediaUploadedDocument",file:e,mime_type:h,pFlags:{force_file:"sendMessageUploadDocumentAction"===P||void 0},attributes:v}}if(a)try{const e=yield a;t.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}S.resolve(t)})),()=>{w(!0)}),x.addNotifyListener(t=>{const s=Math.max(1,Math.floor(100*t.done/t.total));P&&this.setTyping(e,{_:P,progress:0|s}),S.notifyAll(t)}),S};s.isGroupedItem?a():this.sendSmthLazyLoadQueue.push({load:a})}return S},this.beforeMessageSending(i,{isGroupedItem:s.isGroupedItem,isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft}),s.isGroupedItem||S.then(t=>(this.setTyping(e,{_:"sendMessageCancelAction"}),p.a.invokeApi("messages.sendMedia",{background:s.background,peer:F.a.getInputPeerById(e),media:t,message:u,random_id:i.random_id,reply_to_msg_id:r,schedule_date:s.scheduleDate,silent:s.silent,entities:f,clear_draft:s.clearDraft}).then(e=>{D.a.processUpdateMessage(e)},e=>{if("photo"===d&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,d="document",void i.send();w(!0)}))),{message:i,promise:S}}sendAlbum(e,t,s={}){return ee(this,void 0,void 0,(function*(){if(s.threadId&&!s.replyToMsgId&&(s.replyToMsgId=s.threadId),1===t.length)return this.sendFile(e,t[0],Object.assign(Object.assign({},s),s.sendFileDetails[0]));e=F.a.getPeerMigratedTo(e)||e;const i=s.replyToMsgId?Z.a.getServerMessageId(s.replyToMsgId):void 0;let a=s.caption||"",n=s.entities||[];a&&(a=m.a.parseMarkdown(a,n)),this.log("sendAlbum",t,s);const r=""+ ++this.groupedTempId,o=t.map((t,o)=>{const d=s.sendFileDetails[o],l=Object.assign({isGroupedItem:!0,isMedia:s.isMedia,scheduleDate:s.scheduleDate,silent:s.silent,replyToMsgId:i,threadId:s.threadId,groupId:r},d);return 0===o&&(l.caption=a,l.entities=n),this.sendFile(e,t,l).message});s.clearDraft&&setTimeout(()=>{j.a.clearDraft(e,s.threadId)},0);const d=(e,t)=>{t?e.error=!0:delete e.error,_.default.dispatchEvent("messages_pending")},l=F.a.getInputPeerById(e),h=t=>{this.setTyping(e,{_:"sendMessageCancelAction"}),this.sendSmthLazyLoadQueue.push({load:()=>p.a.invokeApi("messages.sendMultiMedia",{peer:l,multi_media:t,reply_to_msg_id:i,schedule_date:s.scheduleDate,silent:s.silent,clear_draft:s.clearDraft}).then(e=>{D.a.processUpdateMessage(e)},e=>{o.forEach(e=>d(e,!0))})})},c=o.map(e=>e.send().then(e=>p.a.invokeApi("messages.uploadMedia",{peer:l,media:e})).then(t=>{let s;if("messageMediaPhoto"===t._){const e=k.a.savePhoto(t.photo);s=k.a.getMediaInput(e)}else if("messageMediaDocument"===t._){const e=E.a.saveDoc(t.document);s=E.a.getMediaInput(e)}const i={_:"inputSingleMedia",media:s,random_id:e.random_id,message:a,entities:n};return a&&(a="",n=[]),i}).catch(t=>{if("AbortError"===t.name)return null;throw this.log.error("sendAlbum upload item error:",t,e),d(e,!0),t}));Promise.all(c).then(e=>{h(e.filter(Boolean))})}))}sendOther(e,t,s={}){var i;e=F.a.getPeerMigratedTo(e)||e;const a=this.generateOutgoingMessage(e,s),n=s.replyToMsgId?Z.a.getServerMessageId(s.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+a.id;t.poll.id=e,x.a.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{}});const{poll:s,results:i}=x.a.getPoll(e);r={_:"messageMediaPoll",poll:s,results:i};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:k.a.getPhoto(t.id.id)};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:E.a.getDoc(t.id.id)};break;case"inputMediaContact":r={_:"messageMediaContact",phone_number:t.phone_number,first_name:t.first_name,last_name:t.last_name,user_id:null!==(i=t.user_id)&&void 0!==i?i:"0",vcard:t.vcard};break;case"inputMediaGeoPoint":r={_:"messageMediaGeo",geo:s.geoPoint};break;case"inputMediaVenue":r={_:"messageMediaVenue",geo:s.geoPoint,title:t.title,address:t.address,provider:t.provider,venue_id:t.venue_id,venue_type:t.venue_type};break;case"messageMediaPending":r=t}a.media=r;a.send=()=>{const i={};let r;return this.pendingAfterMsgs[e]&&(i.afterMessageId=this.pendingAfterMsgs[e].messageId),r=s.viaBotId?p.a.invokeApiAfter("messages.sendInlineBotResult",{peer:F.a.getInputPeerById(e),random_id:a.random_id,reply_to_msg_id:n||void 0,query_id:s.queryId,id:s.resultId,clear_draft:s.clearDraft,schedule_date:s.scheduleDate,silent:s.silent},i):p.a.invokeApiAfter("messages.sendMedia",{peer:F.a.getInputPeerById(e),media:t,random_id:a.random_id,reply_to_msg_id:n||void 0,message:"",clear_draft:s.clearDraft,schedule_date:s.scheduleDate,silent:s.silent},i),this.pendingAfterMsgs[e]=i,r.then(e=>{e.updates&&e.updates.forEach(e=>{"updateDraftMessage"===e._&&(e.local=!0)}),D.a.processUpdateMessage(e)},e=>{_.default.dispatchEvent("messages_pending")}).finally(()=>{this.pendingAfterMsgs[e]===i&&delete this.pendingAfterMsgs[e]})},this.beforeMessageSending(a,{isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft})}beforeMessageSending(e,t={}){const s=e.id,i=this.getMessagePeer(e),a=t.isScheduled?this.getScheduledMessagesStorage(i):this.getMessagesStorage(i);if(t.isScheduled)this.saveMessages([e],{storage:a,isScheduled:!0,isOutgoing:!0}),setTimeout(()=>{_.default.dispatchEvent("scheduled_new",{peerId:i,mid:s})},0);else{const n=[this.getHistoryStorage(i),t.threadId?this.getHistoryStorage(i,t.threadId):void 0];for(const e of n)e&&e.history.unshift(s);this.saveMessages([e],{storage:a,isOutgoing:!0}),this.setDialogTopMessage(e),setTimeout(()=>{_.default.dispatchEvent("history_append",{storage:a,peerId:i,mid:s})},0)}this.pendingByRandomId[e.random_id]={peerId:i,tempId:s,threadId:t.threadId,storage:a},!t.isGroupedItem&&e.send&&setTimeout(()=>{t.clearDraft&&j.a.clearDraft(i,t.threadId),e.send()},0)}generateOutgoingMessage(e,t){let s;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const i=F.a.isBroadcast(e);if(i){if(F.a.getPeer(e).pFlags.signatures){const e=O.a.getSelf();s=e.first_name+(e.last_name?" "+e.last_name:"")}}return{_:"message",id:this.generateTempMessageId(e),from_id:this.generateFromId(e),peer_id:F.a.getOutputPeer(e),post_author:s,pFlags:this.generateFlags(e),date:t.scheduleDate||Object(r.g)(!0)+f.a.serverTimeOffset,message:"",grouped_id:t.groupId,random_id:Object(l.b)(),reply_to:this.generateReplyHeader(t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:i&&1,pending:!0}}generateReplyHeader(e,t){const s={_:"messageReplyHeader",reply_to_msg_id:e||t};return t&&s.reply_to_msg_id!==t&&(s.reply_to_top_id=t),s}generateReplies(e){let t;if(F.a.isBroadcast(e)){const s=B.default.chatsFull[e.toChatId()];(null==s?void 0:s.linked_chat_id)&&(t={_:"messageReplies",flags:1,pFlags:{comments:!0},channel_id:s.linked_chat_id,replies:0,replies_pts:0})}return t}generateFromId(e){return e.isAnyChat()&&(e.isBroadcast()||this.isAnonymousSending(e))?void 0:F.a.getOutputPeer(O.a.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==O.a.getSelf().id&&(t.out=!0,F.a.isChannel(e)||O.a.isBot(e)||(t.unread=!0)),F.a.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const s=O.a.getSelf().id.toPeerId();if(t.fromId===s&&t.peerId===s&&!t.fwd_from)return;const i={_:"messageFwdHeader",flags:0,date:t.date};return t.fwd_from?(i.from_id=t.fwd_from.from_id,i.from_name=t.fwd_from.from_name,i.post_author=t.fwd_from.post_author):(i.from_id=F.a.getOutputPeer(t.fromId),i.post_author=t.post_author),F.a.isBroadcast(t.peerId)&&(t.post_author&&(i.post_author=t.post_author),i.channel_post=t.id),e===s&&(i.saved_from_msg_id=t.id,i.saved_from_peer=F.a.getOutputPeer(t.peerId)),i}generateFakeAvatarMessage(e,t){const s=Number.MAX_SAFE_INTEGER,i={_:"messageService",action:{_:"messageActionChannelEditPhoto",photo:t},mid:s,peerId:e,date:t.date,fromId:e};return this.getMessagesStorage(e).set(s,i),i}isAnonymousSending(e){var t,s;return e.isAnyChat()&&(null===(s=null===(t=F.a.getPeer(e).admin_rights)||void 0===t?void 0:t.pFlags)||void 0===s?void 0:s.anonymous)}setDialogTopMessage(e,t=this.getDialogOnly(e.peerId)){if(t){t.top_message=e.mid;this.getHistoryStorage(e.peerId).maxId=e.mid,this.dialogsStorage.generateIndexForDialog(t,!1,e),this.scheduleHandleNewDialogs(e.peerId,t)}}cancelPendingMessage(e){const t=this.pendingByRandomId[e];if(t){const{peerId:s,tempId:i,storage:a}=t,n=this.getHistoryStorage(s);return D.a.processLocalUpdate({_:"updateDeleteMessages",messages:[i],pts:void 0,pts_count:void 0}),n.history.delete(i),delete this.pendingByRandomId[e],a.delete(i),!0}return!1}fillConversations(){return ee(this,void 0,void 0,(function*(){const e=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(void 0);){const t=yield this.getTopMessages(100,void 0);if(!e()||t.isEnd)break}}))}getConversations(e="",t,s,i=0,a){return this.dialogsStorage.getDialogs(e,t,s,i,a)}getReadMaxIdIfUnread(e,t){var s;const i=this.getHistoryStorage(e,t);if(t){const t=this.getHistoryStorage(e),a=Math.max(null!==(s=t.readMaxId)&&void 0!==s?s:0,i.readMaxId);return!this.getMessageByPeer(e,i.maxId).pFlags.out&&a{if(!a()||"messages.dialogsNotModified"===r._)return null;N.b&&this.log("messages.getDialogs result:",r.dialogs,Object.assign({},r.dialogs[0])),s||void 0===t||this.dialogsStorage.resetPinnedOrder(t),s||$.default.setAuthorized(!0),O.a.saveApiUsers(r.users),U.a.saveApiChats(r.chats),this.saveMessages(r.messages);let o=!!s,d=!1;const l={},h=void 0===t?0:t,c=void 0===t;Object(M.d)(r.dialogs,e=>{void 0===e.folder_id&&(e.folder_id=h),this.dialogsStorage.saveDialog(e,void 0,!0,c),o||F.a.isChannel(e.peerId||F.a.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),o=!0),void 0!==e.peerId&&(i&&e.index>i&&(this.scheduleHandleNewDialogs(e.peerId,e),d=!0),Z.a.getServerMessageId(e.read_inbox_max_id)||Z.a.getServerMessageId(e.read_outbox_max_id)||(l[e.peerId]=e,this.log.error("noIdsDialogs",e,n)))});const g=Object.keys(l);if(g.length){const e=g.map(e=>e.toPeerId()),t=e.map(e=>this.reloadConversation(e));Promise.all(t).then(()=>{_.default.dispatchEvent("dialogs_multiupdate",l);for(let t=0;t=p||!r.dialogs.length;m&&this.dialogsStorage.setDialogsLoaded(t,!0),d?this.scheduleHandleNewDialogs():_.default.dispatchEvent("dialogs_multiupdate",{});const v=r.dialogs,I=100===e?v:v.slice(0,e);return{isEnd:m&&I[I.length-1]===v[v.length-1],count:p,dialogs:I}})}forwardMessages(e,t,s,i={}){e=F.a.getPeerMigratedTo(e)||e,s=s.slice().sort((e,t)=>e-t),i.dropCaptions&&(i.dropAuthor=!0);const a={},n=s.map(s=>{var n,r;const o=this.getMessageByPeer(t,s),d=this.generateOutgoingMessage(e,i),l=["entities","media"];i.dropAuthor||(d.fwd_from=this.generateForwardHeader(e,o),l.push("views","forwards")),i.dropCaptions&&o.media||l.push("message"),l.forEach(e=>{d[e]=o[e]});const h=null===(n=d.media)||void 0===n?void 0:n.document;if(h){["round","voice"].includes(h.type)&&(d.pFlags.media_unread=!0)}if(o.grouped_id){(null!==(r=a[o.grouped_id])&&void 0!==r?r:a[o.grouped_id]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(d)}return d});for(const e in a){const t=a[e];t.messages.length>1&&t.messages.forEach(e=>{e.grouped_id=t.tempId})}n.forEach(e=>{this.beforeMessageSending(e,{isScheduled:!!i.scheduleDate||void 0})});const r={};this.pendingAfterMsgs[e]&&(r.afterMessageId=this.pendingAfterMsgs[e].messageId);const o=p.a.invokeApiAfter("messages.forwardMessages",{from_peer:F.a.getInputPeerById(t),id:s.map(e=>Z.a.getServerMessageId(e)),random_id:n.map(e=>e.random_id),to_peer:F.a.getInputPeerById(e),with_my_score:i.withMyScore,silent:i.silent,schedule_date:i.scheduleDate,drop_author:i.dropAuthor,drop_media_captions:i.dropCaptions},r).then(e=>{this.log("forwardMessages updates:",e),D.a.processUpdateMessage(e)}).finally(()=>{this.pendingAfterMsgs[e]===r&&delete this.pendingAfterMsgs[e]});return this.pendingAfterMsgs[e]=r,o}generateEmptyMessage(e){return{_:"messageEmpty",id:Z.a.getServerMessageId(e),mid:e,deleted:!0,pFlags:{}}}getMessageFromStorage(e,t){return e&&e.get(t)||this.generateEmptyMessage(t)}createMessageStorage(){return new Map}getMessagesStorage(e){var t;return null!==(t=this.messagesStorageByPeerId[e])&&void 0!==t?t:this.messagesStorageByPeerId[e]=this.createMessageStorage()}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(F.a.isChannel(t.toPeerId()))continue;const s=this.messagesStorageByPeerId[t].get(e);if(s)return s}return this.getMessageFromStorage(null,e)}getMessageByPeer(e,t){return e?this.getMessageFromStorage(this.getMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&F.a.getPeerId(e.peer_id)||y.b}getDialogByPeerId(e){return this.dialogsStorage.getDialog(e)}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}reloadConversation(e){let t;if(void 0!==e){const s=F.a.getPeerId(e);let i=this.reloadConversationsPeers.get(s);if(i&&(t=i.promise),t)return t;t=Object(n.a)(),this.reloadConversationsPeers.set(s,i={inputDialogPeer:F.a.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=new Promise((e,t)=>{setTimeout(()=>{const s=[],i={};for(const[e,{inputDialogPeer:t,promise:a}]of this.reloadConversationsPeers)s.push(t),i[e]=a;this.reloadConversationsPeers.clear();const a=()=>{for(const e in i)i[e].resolve(void 0)};p.a.invokeApi("messages.getPeerDialogs",{peers:s}).then(t=>{this.dialogsStorage.applyDialogs(t),t.dialogs.forEach(e=>{const t=e.peerId;t&&(i[t].resolve(e),delete i[t])}),a(),e()},e=>{a(),t(e)}).finally(()=>{this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()})},0)})),t||this.reloadConversationsPromise}doFlushHistory(e,t,s){return p.a.invokeApiSingle("messages.deleteHistory",{just_clear:t,revoke:s,peer:e,max_id:0}).then(i=>(D.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:i.pts,pts_count:i.pts_count}}),!i.offset||this.doFlushHistory(e,t,s)))}flushHistory(e,t,s){return ee(this,void 0,void 0,(function*(){if(F.a.isChannel(e)){const t=this.getHistory(e,0,1),s=t instanceof Promise?yield t:t,i=e.toChatId(),a=s.history[0]||0;return p.a.invokeApiSingle("channels.deleteHistory",{channel:U.a.getChannelInput(i),max_id:Z.a.getServerMessageId(a)}).then(e=>(e&&D.a.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:i,available_min_id:a}),e))}return this.doFlushHistory(F.a.getInputPeerById(e),t,s).then(()=>{[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pinnedMessages,this.pendingAfterMsgs,this.pendingTopMsgs].forEach(t=>{delete t[e]});const s=this.needSingleMessages.get(e);if(s&&s.clear(),[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach(t=>{const s=t[e];s&&s.clear()}),t)_.default.dispatchEvent("dialog_flush",{peerId:e});else{delete this.notificationsToHandle[e],delete this.typings[e];const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0)),this.dialogsStorage.dropDialogOnDeletion(e)}})}))}onPeerDeleted(e){}hidePinnedMessages(e){return Promise.all([T.default.getState(),this.getPinnedMessage(e)]).then(([t,s])=>{t.hiddenPinnedMessages[e]=s.maxId,_.default.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:s.maxId})})}getPinnedMessage(e){var t;const s=null!==(t=this.pinnedMessages[e])&&void 0!==t?t:this.pinnedMessages[e]={};return s.promise?s.promise:s.maxId?Promise.resolve(s):s.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1}).then(e=>{var t;return s.count=e.count,s.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,s}).finally(()=>{delete s.promise})}updatePinnedMessage(e,t,s,i,a){return p.a.invokeApi("messages.updatePinnedMessage",{peer:F.a.getInputPeerById(e),unpin:s,silent:i,pm_oneside:a,id:Z.a.getServerMessageId(t)}).then(e=>{D.a.processUpdateMessage(e)})}unpinAllMessages(e){return p.a.invokeApiSingle("messages.unpinAllMessages",{peer:F.a.getInputPeerById(e)}).then(t=>{if(D.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),!t.offset){return this.getMessagesStorage(e).forEach(e=>{e.pFlags.pinned&&delete e.pFlags.pinned}),_.default.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[e],!0}return this.unpinAllMessages(e)})}getAlbumText(e){const t=this.groupedMessagesStorage[e];let s,i,a,n=0;for(const[e,r]of t)if(r.message){if(++n>1)break;s=r.message,i=r.totalEntities,a=r.entities}return n>1&&(s=void 0,i=void 0,a=void 0),{message:s,entities:a,totalEntities:i}}getMidsByAlbum(e){return Object(d.e)(this.groupedMessagesStorage[e],"asc")}getMidsByMessage(e){return(null==e?void 0:e.grouped_id)?this.getMidsByAlbum(e.grouped_id):[e.mid]}filterMessages(e,t){const s=[];if(e.grouped_id){const i=this.groupedMessagesStorage[e.grouped_id];for(const[e,a]of i)t(a)&&s.push(a)}else t(e)&&s.push(e);return s}generateTempMessageId(e){const t=this.getDialogOnly(e);return Z.a.generateMessageId((null==t?void 0:t.top_message)||0,!0)}saveMessage(e,t={}){var s,i;if(void 0===e.pFlags&&(e.pFlags={}),"messageEmpty"===e._)return void(e.deleted=!0);const a=this.getMessagePeer(e),n=t.storage||this.getMessagesStorage(a),r="peerChannel"===e.peer_id._,o=r&&U.a.isBroadcast(a.toChatId());t.isScheduled&&(e.pFlags.is_scheduled=!0),t.isOutgoing&&(e.pFlags.is_outgoing=!0);const d=Z.a.generateMessageId(e.id);if(e.mid=d,e.grouped_id){(null!==(s=this.groupedMessagesStorage[e.grouped_id])&&void 0!==s?s:this.groupedMessagesStorage[e.grouped_id]=new Map).set(d,e)}const l=this.getDialogOnly(a);l&&d&&d>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=Z.a.generateMessageId(e.reply_to.reply_to_msg_id)),e.reply_to.reply_to_top_id&&(e.reply_to.reply_to_top_id=Z.a.generateMessageId(e.reply_to.reply_to_top_id))),e.replies&&(e.replies.max_id&&(e.replies.max_id=Z.a.generateMessageId(e.replies.max_id)),e.replies.read_max_id&&(e.replies.read_max_id=Z.a.generateMessageId(e.replies.read_max_id)));const h=!!a;h||(e.date-=f.a.serverTimeOffset);const c=O.a.getSelf().id;e.peerId=a,e.fromId=a===c?e.fwd_from?e.fwd_from.from_id?F.a.getPeerId(e.fwd_from.from_id):0:c:e.pFlags.post||!e.from_id?a:F.a.getPeerId(e.from_id);const g=e.fwd_from;if(g){g.saved_from_msg_id&&(g.saved_from_msg_id=Z.a.generateMessageId(g.saved_from_msg_id)),g.channel_post&&(g.channel_post=Z.a.generateMessageId(g.channel_post));const t=g.saved_from_peer||g.from_id,s=g.saved_from_msg_id||g.channel_post;if(t&&s){const i=F.a.getPeerId(t),a=Z.a.generateMessageId(s);e.savedFrom=i+"_"+a}e.fwdFromId=F.a.getPeerId(g.from_id),h||(g.date-=f.a.serverTimeOffset)}e.via_bot_id>0&&(e.viaBotId=e.via_bot_id);const p={type:"message",peerId:a,messageId:d};if(e.media)switch(e.media._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":e.media.ttl_seconds?e.media={_:"messageMediaUnsupportedWeb"}:e.media.photo=k.a.savePhoto(e.media.photo,p),e.media.photo||delete e.media;break;case"messageMediaPoll":{const t=x.a.savePoll(e.media.poll,e.media.results,e);e.media.poll=t.poll,e.media.results=t.results;break}case"messageMediaDocument":e.media.ttl_seconds?e.media={_:"messageMediaUnsupportedWeb"}:e.media.document=E.a.saveDoc(e.media.document,p);break;case"messageMediaWebPage":{const s=L.a.getMessageKeyForPendingWebPage(a,d,t.isScheduled);e.media.webpage=L.a.saveWebPage(e.media.webpage,s,p);break}case"messageMediaInvoice":e.media={_:"messageMediaUnsupportedWeb"}}if(e.action){const t=e.action;let s,n;const d=e.fromId===O.a.getSelf().id?"You":"";switch(t.photo&&(t.photo=k.a.savePhoto(t.photo,p)),t.document&&(t.document=E.a.saveDoc(t.photo,p)),t._){case"messageActionChatEditPhoto":(null===(i=t.photo)||void 0===i?void 0:i.video_sizes)?t._=o?"messageActionChannelEditVideo":"messageActionChatEditVideo":o&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let s;void 0===t.duration?(s="started",a!==e.fromId&&(s+="_by"+d)):s="ended_by"+d,t.type=s;break}case"messageActionChatEditTitle":o&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":o&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=r?"messageActionChatJoined"+d:"messageActionChatReturn"+d)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+d);break;case"messageActionChannelMigrateFrom":s=t.chat_id.toPeerId(!0),n=a;break;case"messageActionChatMigrateTo":s=a,n=t.channel_id.toPeerId(!0);break;case"messageActionHistoryClear":e.clear_history=!0,delete e.pFlags.out,delete e.pFlags.unread;break;case"messageActionPhoneCall":t.type=(e.pFlags.out?"out_":"in_")+("phoneCallDiscardReasonMissed"===t.reason._||"phoneCallDiscardReasonBusy"===t.reason._?"missed":"ok")}s&&n&&!this.migratedFromTo[s]&&!this.migratedToFrom[n]&&this.migrateChecks(s,n)}e.message&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),n.set(d,e)}saveMessages(e,t={}){e.saved||(e.saved=!0,e.forEach(e=>{this.saveMessage(e,t)}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=m.a.fixEmoji(e.message,t);const s=m.a.parseEntities(e.message);e.totalEntities=m.a.mergeEntities(t,s)}wrapMessageForReply(e,t=e.message,s,i,a,n){const r=[],o=(e,t,s)=>{if(e&&(t=i?c.default.format(e,!0):Object(c.i18n)(e)),i)r.push(t);else{const e=document.createElement("i");"string"==typeof t?e.innerHTML=t:e.append(t),r.push(e)}s&&r.push(", ")};if(e.media){Object(Y.a)(e);let a=!0;if(e.grouped_id){if(s){const t=this.getMidsByMessage(e);if(s.length===t.length){for(const e of t)if(!s.includes(e)){a=!1;break}}else a=!1}a&&(t=this.getAlbumText(e.grouped_id).message,n||o("AttachAlbum",void 0,t))}else a=!1;if(!a&&!n||!t){const s=e.media;switch(s._){case"messageMediaPhoto":o("AttachPhoto",void 0,e.message);break;case"messageMediaDice":o(void 0,i?s.emoticon:m.a.wrapEmojiText(s.emoticon));break;case"messageMediaVenue":{const e=i?s.title:m.a.wrapEmojiText(s.title);o("AttachLocation",void 0,e),r.push(Object(q.a)(e));break}case"messageMediaGeo":o("AttachLocation");break;case"messageMediaGeoLive":o("AttachLiveLocation");break;case"messageMediaPoll":o(void 0,i?"📊 "+(s.poll.question||"poll"):s.poll.rReply);break;case"messageMediaContact":o("AttachContact");break;case"messageMediaGame":{const e="🎮 ";o(void 0,i?e+s.game.title:m.a.wrapEmojiText(e+s.game.title));break}case"messageMediaDocument":{const a=s.document;if("video"===a.type)o("AttachVideo",void 0,e.message);else if("voice"===a.type)o("AttachAudio",void 0,e.message);else if("gif"===a.type)o("AttachGif",void 0,e.message);else if("round"===a.type)o("AttachRound",void 0,e.message);else if("sticker"===a.type)a.stickerEmojiRaw&&o(void 0,(i?a.stickerEmojiRaw:a.stickerEmoji)+" "),o("AttachSticker"),t="";else if("audio"===a.type){const t=a.attributes.find(e=>"documentAttributeAudio"===e._&&(e.title||e.performer)),s="🎵 "+(t?[t.title,t.performer].filter(Boolean).join(" - "):a.file_name);o(void 0,i?s:m.a.wrapEmojiText(s),e.message)}else o(void 0,i?a.file_name:m.a.wrapEmojiText(a.file_name),e.message);break}}}}if(e.action){const t=this.wrapMessageActionTextNew(e,i);t&&o(void 0,t)}if(t)if(t=Object(h.f)(t,100),i)r.push(t);else{let e=m.a.parseEntities(t.replace(/\n/g," "));if(a){a=a.trim(),e||(e=[]);let s,i=!1,n=new RegExp(Object(h.e)(a),"gi");for(;null!==(s=n.exec(t));)e.push({_:"messageEntityHighlight",length:a.length,offset:s.index}),i=!0;i&&e.sort((e,t)=>e.offset-t.offset)}const s=m.a.wrapRichText(t,{noLinebreaks:!0,entities:e,noLinks:!0,noTextFormat:!0});r.push(Object(q.a)(s))}if(i)return r.join("");{const e=document.createDocumentFragment();return e.append(...r),e}}wrapSenderToPeer(e){const t=document.createElement("span");t.classList.add("sender-title");const s=e.fromId===_.default.myId&&e.peerId!==_.default.myId;if(t.append(s?Object(c.i18n)("FromYou"):new z.a({peerId:e.fromId,dialog:e.peerId===_.default.myId}).element),F.a.isAnyGroup(e.peerId)||s){const s=new z.a({peerId:e.peerId}).element;t.append(" ➝ ",s)}return t}wrapSentTime(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append(Object(r.c)(new Date(1e3*e.date))),t}wrapMessageActionTextNew(e,t){const s=t?void 0:document.createElement("span"),i="action"in e&&e.action;if(i.message){const e=i.message;return t?m.a.wrapPlainText(e):(s.innerHTML=m.a.wrapRichText(e,{noLinebreaks:!0}),s)}{let a,n,o=i._;const d=(e,t)=>t?F.a.getPeerTitle(e,t)+" ":new z.a({peerId:e}).element;switch(i._){case"messageActionPhoneCall":o+="."+i.type,n=[G(i.duration)];break;case"messageActionGroupCall":o+="."+i.type,n=[],o.endsWith("You")||n.push(d(e.fromId,t)),n.push(G(i.duration));break;case"messageActionInviteToGroupCall":{const s=[e.fromId,i.users[0].toPeerId()];let r="ActionGroupCall";const o=O.a.getSelf().id;s[0]===o&&(r+="You"),r+="Invited",s[1]===o&&(r+="You"),Object(M.e)(s,o),a=r,n=s.map(e=>d(e,t));break}case"messageActionGroupCallScheduled":{const s=new Date,o=new Date(1e3*i.schedule_date),l=(o.getTime()-s.getTime())/864e5,h=new Date(s);h.setDate(h.getDate()+1);const g=F.a.isBroadcast(e.peerId);a=g?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",n=[];const p=O.a.getSelf().id;e.fromId===p?a+="You":g||n.push(d(e.fromId,t));let u,f=[];l<1&&o.getDate()===s.getDate()?u="TodayAtFormattedWithToday":l<2&&o.getDate()===h.getDate()?u="Time.TomorrowAt":(u="formatDateAtTime",f.push(new c.default.IntlDateElement({date:o,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),f.push(Object(r.e)(o));const m=Object(c.i18n)(u,f);n.push(m);break}case"messageActionChatCreate":{const s=O.a.getSelf().id;e.fromId===s?o+="You":n=[d(e.fromId,t)];break}case"messageActionPinMessage":{const s=e.peerId,i=this.getMessageByPeer(s,e.reply_to_mid);if(n=[d(e.fromId,t)],i.deleted)a="ActionPinnedNoText",e.reply_to_mid&&this.fetchMessageReplyTo(e).then(t=>{t.deleted||e.deleted||(_.default.dispatchEvent("message_edit",{storage:this.getMessagesStorage(s),peerId:s,mid:e.mid}),this.isMessageIsTopMessage(e)&&_.default.dispatchEvent("dialogs_multiupdate",{[s]:this.getDialogOnly(s)}))});else{const e=document.createElement("i");e.dataset.savedFrom=i.peerId+"_"+i.mid,e.dir="auto",e.append(this.wrapMessageForReply(i,void 0,void 0,t)),n.push(e)}break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":n=[d(e.fromId,t)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":n=[],"messageActionChatEditTitle"===i._&&n.push(d(e.fromId,t)),n.push(t?i.title:Object(W.a)(m.a.wrapEmojiText(i.title)));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const s=i.users||[i.user_id];if(n=[d(e.fromId,t)],s.length>1)if(t)n.push(...s.map(e=>d(e.toPeerId(),!0).trim()).join(", "));else{const e=document.createElement("span");e.append(...Object(c.join)(s.map(e=>d(e.toPeerId(),!1)),!1)),n.push(e)}else n.push(d(s[0].toPeerId(),t));break}case"messageActionBotAllowed":{const e=m.a.wrapRichText(i.domain,{entities:[{_:"messageEntityUrl",length:i.domain.length,offset:0}]});n=[Object(W.a)(e)];break}default:a=c.langPack[o]||`[${i._}]`}return a||(a=c.langPack[o],void 0===a&&(a="["+o+"]")),t?c.default.format(a,!0,n):Object(c._i18n)(s,a,n)}}reportMessages(e,t,s,i){return p.a.invokeApiSingle("messages.report",{peer:F.a.getInputPeerById(e),id:t.map(e=>Z.a.getServerMessageId(e)),reason:{_:s},message:i})}startBot(e,t,s){const i=t?t.toPeerId(!0):e.toPeerId();if(s){const t=Object(l.b)();return p.a.invokeApi("messages.startBot",{bot:O.a.getUserInput(e),peer:F.a.getInputPeerById(i),random_id:t,start_param:s}).then(e=>{D.a.processUpdateMessage(e)})}if(t){let s;return s=U.a.isChannel(t)?U.a.inviteToChannel(t,[e]):U.a.addChatUser(t,e,0),s.catch(e=>{if(!e||"USER_ALREADY_PARTICIPANT"!=e.type)throw e;e.handled=!0}).then(()=>{const t=O.a.getUser(e);return this.sendText(i,"/start@"+t.username)})}return this.sendText(i,"/start")}editPeerFolders(e,t){p.a.invokeApi("folders.editPeerFolders",{folder_peers:e.map(e=>({_:"inputFolderPeer",peer:F.a.getInputPeerById(e),folder_id:t}))}).then(e=>{D.a.processUpdateMessage(e)})}toggleDialogPin(e,t){var s;if(t>1)return this.filtersStorage.toggleDialogPin(e,t);const i=this.getDialogOnly(e);if(!i)return Promise.reject();const a=!(null===(s=i.pFlags)||void 0===s?void 0:s.pinned)||void 0;if(a){const e=1===t?_.default.config.pinned_infolder_count_max:_.default.config.pinned_dialogs_count_max;if(this.dialogsStorage.getPinnedOrders(t).length>=e)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"})}return p.a.invokeApi("messages.toggleDialogPin",{peer:F.a.getInputDialogPeerById(e),pinned:a}).then(s=>{if(s){const s=a?{pinned:a}:{};D.a.saveUpdate({_:"updateDialogPinned",peer:F.a.getDialogPeer(e),folder_id:t,pFlags:s})}})}markDialogUnread(e,t){var s;const i=this.getDialogOnly(e);if(!i)return Promise.reject();const a=!t&&!(null===(s=i.pFlags)||void 0===s?void 0:s.unread_mark)||void 0;return p.a.invokeApi("messages.markDialogUnread",{peer:F.a.getInputDialogPeerById(e),unread:a}).then(t=>{if(t){const t=a?{unread:a}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:F.a.getDialogPeer(e),pFlags:t})}})}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&U.a.hasChat(t.toChatId())){const s=U.a.getChat(e.toChatId());s&&s.migrated_to&&s.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,_.default.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){if(e.pFlags.is_outgoing)return!1;const s=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&s.push("messageMediaPoll"),!("message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===s.indexOf(e.media._)||e.fromId&&O.a.isBot(e.fromId))&&(!e.media||"messageMediaDocument"!==e.media._||!e.media.document.sticker&&"round"!==e.media.document.type)}canEditMessage(e,t="text"){var s;return!(!e||!this.canMessageBeEdited(e,t))&&(this.getMessagePeer(e)===O.a.getSelf().id||!(e.date=t.mid)&&(!a.pFlags.selective&&(e.maxOutId&&t.midn.mid||t.pFlags.is_outgoing)&&t.message)return n.pFlags.hidden=!0,!0}else(!e.maxOutId||t.mid>e.maxOutId)&&(e.maxOutId=t.mid);return Object(Y.a)(t),!("messageActionChatDeleteUser"!==(null===(i=t.action)||void 0===i?void 0:i._)||!(n?t.action.user_id===n.fromId:O.a.isBot(t.action.user_id)))&&(e.replyMarkup={_:"replyKeyboardHide",mid:t.mid,pFlags:{}},!0)}getSearchStorage(e,t){return this.searchesStorage[e]||(this.searchesStorage[e]={}),this.searchesStorage[e][t]||(this.searchesStorage[e][t]={history:[]}),this.searchesStorage[e][t]}getSearchCounters(e,t,s=!0){return(s?p.a.invokeApiCacheable:p.a.invokeApi).bind(p.a)("messages.getSearchCounters",{peer:F.a.getInputPeerById(e),filters:t})}filterMessagesByInputFilter(e,t,s,i){const a=[];if(!t.length)return a;let n=!0;const r={},o=[],d=[];switch(e){case"inputMessagesFilterPhotos":r.messageMediaPhoto=!0;break;case"inputMessagesFilterPhotoVideo":r.messageMediaPhoto=!0,r.messageMediaDocument=!0,o.push("video");break;case"inputMessagesFilterVideo":r.messageMediaDocument=!0,o.push("video");break;case"inputMessagesFilterDocument":r.messageMediaDocument=!0,d.push("video");break;case"inputMessagesFilterVoice":r.messageMediaDocument=!0,o.push("voice");break;case"inputMessagesFilterRoundVoice":r.messageMediaDocument=!0,o.push("round","voice");break;case"inputMessagesFilterRoundVideo":r.messageMediaDocument=!0,o.push("round");break;case"inputMessagesFilterMusic":r.messageMediaDocument=!0,o.push("audio");break;case"inputMessagesFilterUrl":r.url=!0;break;case"inputMessagesFilterChatPhotos":r.avatar=!0;break;default:n=!1}if(!n)return a;for(let e=0,n=t.length;ee.includes(t._))||m.a.matchUrl(n.message))&&(l=!0)}}else r.avatar&&n.action&&["messageActionChannelEditPhoto","messageActionChatEditPhoto","messageActionChannelEditVideo","messageActionChatEditVideo"].includes(n.action._)&&(l=!0);if(l&&(a.push(n),a.length>=i))break}return a}getSearch({peerId:e,query:t,inputFilter:s,maxId:i,limit:a,nextRate:n,backLimit:r,threadId:o,folderId:d,minDate:l,maxDate:h}){t||(t=""),s||(s={_:"inputMessagesFilterEmpty"}),void 0===a&&(a=20),n||(n=0),r||(r=0),l=l?l/1e3|0:0,h=h?h/1e3|0:0;let c=[];r&&(a+=r);let g;if(!e||r||i||t||1===a||o||(g=this.getHistoryStorage(e),c=this.filterMessagesByInputFilter(s._,g.history.slice,this.getMessagesStorage(e),a)),c.length){if(!(c.length{O.a.saveApiUsers(e.users),U.a.saveApiChats(e.chats),this.saveMessages(e.messages),N.b&&this.log("getSearch result:",s,e);const t=e.count||c.length+e.messages.length;return e.messages.forEach(e=>{const t=this.getMessagePeer(e);if(t.isAnyChat()){const e=U.a.getChat(t.toChatId());e.migrated_to&&this.migrateChecks(t,e.migrated_to.channel_id.toPeerId(!0))}c.push(e)}),{count:t,offset_id_offset:e.offset_id_offset||0,next_rate:e.next_rate,history:c}})}subscribeRepliesThread(e,t){const s=e+"_"+t;for(const e in this.threadsToReplies)if(this.threadsToReplies[e]===s)return;this.getDiscussionMessage(e,t)}generateThreadServiceStartMessage(e){const t=e.peerId+"_"+e.mid;if(this.threadsServiceMessagesIdsStorage[t])return;const s=Z.a.getServerMessageId(Math.max(...this.getMidsByMessage(e))),i={_:"messageService",pFlags:{is_single:!0},id:Z.a.generateMessageId(s,!0),date:e.date,from_id:{_:"peerUser",user_id:y.b},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.id)};this.saveMessages([i],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=i.mid}getDiscussionMessage(e,t){return p.a.invokeApiSingle("messages.getDiscussionMessage",{peer:F.a.getInputPeerById(e),msg_id:Z.a.getServerMessageId(t)}).then(s=>{var i;U.a.saveApiChats(s.chats),O.a.saveApiUsers(s.users),this.saveMessages(s.messages);const a=this.filterMessages(s.messages[0],e=>!!e.replies)[0],n=a.peerId+"_"+a.mid;this.generateThreadServiceStartMessage(a);const r=this.getHistoryStorage(a.peerId,a.mid);return s.max_id=r.maxId=Z.a.generateMessageId(s.max_id)||0,s.read_inbox_max_id=r.readMaxId=Z.a.generateMessageId(null!==(i=s.read_inbox_max_id)&&void 0!==i?i:a.mid),s.read_outbox_max_id=r.readOutboxMaxId=Z.a.generateMessageId(s.read_outbox_max_id)||0,this.threadsToReplies[n]=e+"_"+t,a})}handleNewMessage(e,t){void 0===this.newMessagesToHandle[e]&&(this.newMessagesToHandle[e]=new Set),this.newMessagesToHandle[e].add(t),this.newMessagesHandleTimeout||(this.newMessagesHandleTimeout=window.setTimeout(this.handleNewMessages,0))}scheduleHandleNewDialogs(e,t){return void 0!==e&&(this.newDialogsToHandle[e]=t),this.newDialogsHandlePromise?this.newDialogsHandlePromise:this.newDialogsHandlePromise=new Promise(e=>{setTimeout(()=>{e(),this.newDialogsHandlePromise=void 0,this.handleNewDialogs()},0)})}deleteMessages(e,t,s){var i,a;let n;const r=t.map(e=>Z.a.getServerMessageId(e));if(e.isAnyChat()&&F.a.isChannel(e)){const s=e.toChatId(),o=U.a.getChat(s);if(!o.pFlags.creator&&!(null===(a=null===(i=o.admin_rights)||void 0===i?void 0:i.pFlags)||void 0===a?void 0:a.delete_messages)&&!(t=t.filter(t=>!!this.getMessageByPeer(e,t).pFlags.out)).length)return;n=p.a.invokeApi("channels.deleteMessages",{channel:U.a.getChannelInput(s),id:r}).then(e=>{D.a.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:s,messages:t,pts:e.pts,pts_count:e.pts_count})})}else n=p.a.invokeApi("messages.deleteMessages",{revoke:s,id:r}).then(e=>{D.a.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})});return n}readHistory(e,t=0,s,i=!1){if(this.log("readHistory:",e,t,s),!this.getReadMaxIdIfUnread(e,s)&&!i)return this.log("readHistory: isn't unread"),Promise.resolve();const a=this.getHistoryStorage(e,s);if(a.triedToReadMaxId>=t)return Promise.resolve();let n;return s?(a.readPromise||(n=p.a.invokeApi("messages.readDiscussion",{peer:F.a.getInputPeerById(e),msg_id:Z.a.getServerMessageId(s),read_max_id:Z.a.getServerMessageId(t)})),D.a.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:s,read_max_id:t})):F.a.isChannel(e)?(a.readPromise||(n=p.a.invokeApi("channels.readHistory",{channel:U.a.getChannelInput(e.toChatId()),max_id:Z.a.getServerMessageId(t)})),D.a.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(a.readPromise||(n=p.a.invokeApi("messages.readHistory",{peer:F.a.getInputPeerById(e),max_id:Z.a.getServerMessageId(t)}).then(e=>{D.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})})),D.a.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:F.a.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),H.a.soundReset(F.a.getPeerString(e)),a.readPromise?a.readPromise:(a.triedToReadMaxId=t,n.finally(()=>{delete a.readPromise;const{readMaxId:i}=a;this.log("readHistory: promise finally",t,i),i>t&&this.readHistory(e,i,s,!0)}),a.readPromise=n)}readAllHistory(e,t,s=!1){const i=this.getHistoryStorage(e,t);i.maxId&&this.readHistory(e,i.maxId,t,s)}fixDialogUnreadMentionsIfNoMessage(e){const t=this.getDialogOnly(e);(null==t?void 0:t.unread_mentions_count)&&this.reloadConversation(e)}modifyCachedMentions(e,t,s){const i=this.unreadMentions[e];i&&(s?i.first.isEnd(I.a.Top)&&i.insertSlice([t]):i.delete(t))}goToNextMention(e){var t;const s=this.goToNextMentionPromises[e];if(s)return s;const i=null!==(t=this.unreadMentions[e])&&void 0!==t?t:this.unreadMentions[e]=new I.b,a=i.length,n=i.first.isEnd(I.a.Top);if(!a&&n)return Promise.resolve();let r=Promise.resolve();return!n&&a<25&&(r=this.loadNextMentions(e)),this.goToNextMentionPromises[e]=r.then(()=>{const t=i.last,s=t&&t[t.length-1];s&&(i.delete(s),_.default.dispatchEvent("history_focus",{peerId:e,mid:s}))}).finally(()=>{delete this.goToNextMentionPromises[e]})}loadNextMentions(e){const t=this.unreadMentions[e],s=t.first[0]||1;return this.getUnreadMentions(e,s,-50,50).then(e=>{this.mergeHistoryResult(t,e,1===s?0:s,50,-50)})}getUnreadMentions(e,t,s,i,a=0,n=0){return p.a.invokeApiSingle("messages.getUnreadMentions",{peer:F.a.getInputPeerById(e),offset_id:Z.a.getServerMessageId(t),add_offset:s,limit:i,max_id:Z.a.getServerMessageId(a),min_id:Z.a.getServerMessageId(n)}).then(e=>(Object(Y.a)(e),O.a.saveApiUsers(e.users),U.a.saveApiChats(e.chats),this.saveMessages(e.messages),e))}readMessages(e,t){if(!t.length)return Promise.resolve();let s,i;if(t=t.map(e=>Z.a.getServerMessageId(e)),e.isAnyChat()&&F.a.isChannel(e)){const a=e.toChatId();i={_:"updateChannelReadMessagesContents",channel_id:a,messages:t},s=p.a.invokeApi("channels.readMessageContents",{channel:U.a.getChannelInput(a),id:t})}else i={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},s=p.a.invokeApi("messages.readMessageContents",{id:t}).then(e=>{i.pts=e.pts,i.pts_count=e.pts_count,D.a.processLocalUpdate(i)});return D.a.processLocalUpdate(i),s}getHistoryStorage(e,t){var s,i;return t?(this.threadsStorage[e]||(this.threadsStorage[e]={}),null!==(s=this.threadsStorage[e][t])&&void 0!==s?s:this.threadsStorage[e][t]={count:null,history:new I.b}):null!==(i=this.historiesStorage[e])&&void 0!==i?i:this.historiesStorage[e]={count:null,history:new I.b}}setDialogToStateIfMessageIsTop(e){this.isMessageIsTopMessage(e)&&this.dialogsStorage.setDialogToState(this.getDialogOnly(e.peerId))}isMessageIsTopMessage(e){const t=this.getDialogOnly(e.peerId);return t&&t.top_message===e.mid}updateMessageRepliesIfNeeded(e){try{const t=this.getThreadKey(e);if(t){const e=this.threadsToReplies[t];if(e){const[t,s]=e.split("_");this.updateMessage(t.toPeerId(),+s,"replies_updated")}}}catch(t){this.log.error("incrementMessageReplies err",t,e)}}getThreadKey(e){var t;let s="";if((null===(t=e.peerId)||void 0===t?void 0:t.isAnyChat())&&e.reply_to){const t=e.reply_to.reply_to_top_id||e.reply_to.reply_to_msg_id;s=e.peerId+"_"+t}return s}updateMessage(e,t,s){return this.wrapSingleMessage(e,t,!0).then(()=>{const i=this.getMessageByPeer(e,t);return s&&_.default.dispatchEvent(s,i),i})}checkPendingMessage(e){const t=this.pendingByMessageId[e.mid];let s;if(t){const i=this.pendingByRandomId[t];(s=this.finalizePendingMessage(t,e))&&_.default.dispatchEvent("history_update",{storage:i.storage,peerId:e.peerId,mid:e.mid}),delete this.pendingByMessageId[e.mid]}return s}mutePeer(e,t){const s={_:"inputPeerNotifySettings"};return void 0===t&&(t=!H.a.isPeerLocalMuted(e,!1)),s.mute_until=t?y.a:0,H.a.updateNotifySettings({_:"inputNotifyPeer",peer:F.a.getInputPeerById(e)},s)}canSendToPeer(e,t,s="send_messages"){if(e.isAnyChat()){const i=U.a.getChat(e.toChatId());return U.a.hasRights(e.toChatId(),s,void 0,!!t)&&(!i.pFlags.left||!!t)}return O.a.canSendToUser(e)}finalizePendingMessage(e,t){const s=this.pendingByRandomId[e];if(s){const{peerId:i,tempId:a,threadId:n,storage:r}=s;[this.getHistoryStorage(i),n?this.getHistoryStorage(i,n):void 0].filter(Boolean).forEach(e=>{e.history.delete(a)});const o=this.getMessageFromStorage(r,a);return o.deleted||(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),_.default.dispatchEvent("messages_pending"),delete this.pendingByRandomId[e],this.finalizePendingMessageCallbacks(r,a,t),o}}finalizePendingMessageCallbacks(e,t,s){const i=this.tempFinalizeCallbacks[t];if(void 0!==i){for(const e in i){const{deferred:t,callback:a}=i[e];a(s).then(t.resolve,t.reject)}delete this.tempFinalizeCallbacks[t]}if(s.media){Object(Y.a)(s);const{photo:e,document:i}=s.media;if(e){const s=k.a.getPhoto(""+t);if(s){const t=e.sizes[e.sizes.length-1],i=A.a.getCacheContext(e,t.type),a=A.a.getCacheContext(s,"full");Object.assign(i,a);const n=e.sizes[e.sizes.length-1],r=k.a.getPhotoDownloadOptions(e,n),o=Object(R.a)(r.location);A.a.fakeDownload(o,a.url)}}else if(i){const e=E.a.getDoc(""+t);if(e&&e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type){const t=A.a.getCacheContext(i),s=A.a.getCacheContext(e);Object.assign(t,s);const a=E.a.getInputFileName(i);A.a.fakeDownload(a,s.url)}}else s.media.poll&&(delete x.a.polls[t],delete x.a.results[t])}const a=this.getMessageFromStorage(e,t);e.delete(t),this.handleReleasingMessage(a,e),_.default.dispatchEvent("message_sent",{storage:e,tempId:t,tempMessage:a,mid:s.mid,message:s})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,T.default.pushToState("maxSeenMsgId",e),p.a.invokeApi("messages.receivedMessages",{max_id:Z.a.getServerMessageId(e)})}incrementMessageViews(e,t){if(t.length)return p.a.invokeApiSingle("messages.getMessagesViews",{peer:F.a.getInputPeerById(e),id:t.map(e=>Z.a.getServerMessageId(e)),increment:!0}).then(s=>{const i=new Array(t.length),a=e.toChatId();for(let e=0,n=t.length;e{_.default.dispatchEvent("history_focus",{peerId:s,mid:e.mid})},i.message=n,i.key="msg"+e.mid,i.tag=a,i.silent=!0;const r=F.a.getPeerPhoto(s);r?K.a.loadAvatar(s,r,"photo_small").loadPromise.then(t=>{e.pFlags.unread&&(i.image=t,H.a.notify(i))}):H.a.notify(i)}getScheduledMessagesStorage(e){var t;return null!==(t=this.scheduledMessagesStorage[e])&&void 0!==t?t:this.scheduledMessagesStorage[e]=this.createMessageStorage()}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return Promise.resolve([]);const t=this.getScheduledMessagesStorage(e);return t.size?Promise.resolve([...t.keys()]):p.a.invokeApiSingle("messages.getScheduledHistory",{peer:F.a.getInputPeerById(e),hash:""}).then(t=>{if("messages.messagesNotModified"!==t._){O.a.saveApiUsers(t.users),U.a.saveApiChats(t.chats);const s=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:s,isScheduled:!0}),[...s.keys()]}return[]})}sendScheduledMessages(e,t){return p.a.invokeApi("messages.sendScheduledMessages",{peer:F.a.getInputPeerById(e),id:t.map(e=>Z.a.getServerMessageId(e))}).then(e=>{D.a.processUpdateMessage(e)})}deleteScheduledMessages(e,t){return p.a.invokeApi("messages.deleteScheduledMessages",{peer:F.a.getInputPeerById(e),id:t.map(e=>Z.a.getServerMessageId(e))}).then(e=>{D.a.processUpdateMessage(e)})}getMessageWithReplies(e){if(e.peerId===y.c||(e=this.filterMessages(e,e=>!!e.replies)[0])&&e.replies&&e.replies.pFlags.comments&&"777"!==e.replies.channel_id)return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&!U.a.isInChat(e.toChatId())}getNewHistory(e,t){var s;return ee(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const i=this.getHistoryStorage(e,t),a=i.history.slice;if(!a.isEnd(I.a.Bottom))return;delete i.maxId,a.unsetEnd(I.a.Bottom);let n=this.getHistory(e,null!==(s=a[0])&&void 0!==s?s:1,0,50,t);n instanceof Promise&&(n=yield n);for(let t=0,s=n.history.length;t{const e=n.history.sliceMe(t,r,s);return{count:n.count,history:(null==e?void 0:e.slice)||n.history.constructSlice(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||n.count}}):{count:n.count,history:o.slice,offsetIdOffset:o.offsetIdOffset}}isHistoryResultEnd(e,t,s){const{offset_id_offset:i,messages:a}=e,n=e.count||a.length,r=i||0,o=s<0?t+s:t;return{count:n,offsetIdOffset:r,isTopEnd:r>=n-o||ne.mid);if(s&&Z.a.getServerMessageId(s)&&!c.includes(s)&&dc[e]);++e);c.splice(e,0,s)}const g=e.insertSlice(c)||e.slice;return l&&g.setEnd(I.a.Top),h&&g.setEnd(I.a.Bottom),Object.assign({slice:g,mids:c,messages:n},r)}fillHistoryStorage(e,t,s,i,a,n){return this.requestHistory(e,t,s,i,void 0,n).then(n=>{const{count:r,isBottomEnd:o,slice:d,messages:l}=this.mergeHistoryResult(a.history,n,t,s,i);a.count=r;for(let t=0,s=l.length;t{N.b&&this.log("requestHistory result:",e,r,t,s,i),O.a.saveApiUsers(r.users),U.a.saveApiChats(r.chats),this.saveMessages(r.messages),F.a.isChannel(e)&&D.a.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,d=r.count;o&&r.messages[o-1].deleted&&(r.messages.splice(o-1,1),o--,d--);const l=this.getHistoryStorage(e,n),h=r.messages[o-1];if(o&&h.grouped_id){const t=l.history.findSlice(h.mid);if(t&&t.slice.length+r.messages.lengthr)}return r},t=>{switch(t.type){case"CHANNEL_PRIVATE":let t=U.a.getChat(e.toChatId());t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},D.a.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t})}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=new Promise(e=>{setTimeout(()=>{const t=[];for(const[e,s]of this.needSingleMessages){const i=[...s.keys()],a=i.map(e=>({_:"inputMessageID",id:Z.a.getServerMessageId(e)}));let n;n=e.isAnyChat()&&F.a.isChannel(e)?p.a.invokeApiSingle("channels.getMessages",{channel:U.a.getChannelInput(e.toChatId()),id:a}):p.a.invokeApiSingle("messages.getMessages",{id:a});const r=n.then(e=>{Object(Y.a)(e),O.a.saveApiUsers(e.users),U.a.saveApiChats(e.chats),this.saveMessages(e.messages);for(let t=0;t{_.default.dispatchEvent("messages_downloaded",{peerId:e,mids:i})});t.push(r)}this.needSingleMessages.clear(),Promise.all(t).finally(()=>{this.fetchSingleMessagesPromise=null,this.needSingleMessages.size&&this.fetchSingleMessages(),e()})},0)})}wrapSingleMessage(e,t,s=!1){const i=this.getMessageByPeer(e,t);if(i.deleted||s){let s=this.needSingleMessages.get(e);s||this.needSingleMessages.set(e,s=new Map);let i=s.get(t);return i||(i=Object(n.a)(),s.set(t,i),this.fetchSingleMessages(),i)}return _.default.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(i)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?F.a.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.wrapSingleMessage(t,e.reply_to_mid).then(t=>(t.deleted&&delete e.reply_to_mid,t))}setTyping(e,t){let s=this.typings[e];return _.default.myId&&e&&this.canSendToPeer(e)&&e!==_.default.myId&&(null==s?void 0:s.type)!==t._?((null==s?void 0:s.timeout)&&clearTimeout(s.timeout),s=this.typings[e]={type:t._},p.a.invokeApi("messages.setTyping",{peer:F.a.getInputPeerById(e),action:t}).finally(()=>{s===this.typings[e]&&(s.timeout=window.setTimeout(()=>{delete this.typings[e]},6e3))})):Promise.resolve(!1)}handleReleasingMessage(e,t){const s=e.media;if(s){const i=s.webpage||s,a=i.photo||i.document;if((null==a?void 0:a.file_reference)&&u.a.deleteContext(a.file_reference,{type:"message",peerId:e.peerId,messageId:e.mid}),"webpage"in s&&s.webpage){const i=this.getScheduledMessagesStorage(e.peerId)===t,a=L.a.getMessageKeyForPendingWebPage(e.peerId,e.mid,i);L.a.deleteWebPageFromPending(s.webpage,a)}s.poll&&x.a.updatePollToMessage(e,!1)}}handleDeletedMessages(e,t,s){const i={count:0,unread:0,unreadMentions:0,msgs:new Set};for(const a of s){const s=this.getMessageFromStorage(t,a);if(s.deleted){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(s,t),this.updateMessageRepliesIfNeeded(s),s.pFlags.out||s.pFlags.is_outgoing||!s.pFlags.unread||(++i.unread,H.a.cancel("msg"+a),s.pFlags.mentioned&&(++i.unreadMentions,this.modifyCachedMentions(e,a,!1))),++i.count,i.msgs.add(a),s.deleted=!0;const n=s.grouped_id;if(n){const e=this.groupedMessagesStorage[n];e&&(e.delete(a),i.albums||(i.albums={}),(i.albums[n]||(i.albums[n]=new Set)).add(a),e.size||(delete i.albums,delete this.groupedMessagesStorage[n]))}t.delete(a);const r=this.newMessagesToHandle[e];r&&r.has(a)&&r.delete(a)}if(i.albums)for(const t in i.albums)_.default.dispatchEvent("album_edit",{peerId:e,groupId:t,deletedMids:[...i.albums[t]]});return i}handleEditedMessage(e,t){var s;if("message"===e._&&(null===(s=e.media)||void 0===s?void 0:s.webpage)){const t=L.a.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);L.a.deleteWebPageFromPending(e.media.webpage,t)}}getMediaFromMessage(e){return e.action?e.action.photo:e.media&&(e.media.photo||e.media.document||e.media.webpage&&(e.media.webpage.document||e.media.webpage.photo))}isMentionUnread(e){var t;const s=null===(t=e.media)||void 0===t?void 0:t.document;return e.pFlags.media_unread&&e.pFlags.mentioned&&(!s||!["voice","round"].includes(s.type))}getDialogUnreadCount(e){return e.unread_count||+!!e.pFlags.unread_mark}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}};N.a.appMessagesManager=te;t.a=te},40:function(e,t,s){"use strict";var i=s(29),a=s(44),n=s(45),r=s(123);function o(e){return e&&e.toLowerCase()||""}var d=s(55),l=s(106),h=s(34),c=s(16),g=s(32),p=s(46),u=s(68),f=s(31),m=s(15),_=s(111),v=s(79),M=s(47),I=s(42),y=s(17);const P=new class{constructor(){this.storage=y.default.storages.users,this.updateUsersStatuses=()=>{const e=Object(d.g)(!0);for(const t in this.users){const s=this.users[t];this.updateUserStatus(s,e)}},this.clear(!0),setInterval(this.updateUsersStatuses,6e4),m.default.addEventListener("state_synchronized",this.updateUsersStatuses),m.default.addMultipleEventsListeners({updateUserStatus:e=>{const t=e.user_id,s=this.users[t];s&&(s.status=e.status,s.status&&("expires"in s.status&&(s.status.expires-=u.a.serverTimeOffset),"was_online"in s.status&&(s.status.was_online-=u.a.serverTimeOffset)),m.default.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(s))},updateUserPhoto:e=>{const t=e.user_id,s=this.users[t];s?(this.forceUserOnline(t),"userProfilePhotoEmpty"===e.photo._?delete s.photo:s.photo=Object(h.i)(s.photo,e.photo),this.setUserToStateIfNeeded(s),m.default.dispatchEvent("user_update",t),m.default.dispatchEvent("avatar_update",t.toPeerId())):console.warn("No user by id:",t)},updateUserName:e=>{const t=e.user_id,s=this.users[t];s&&(this.forceUserOnline(t),this.saveApiUser(Object.assign({},s,{first_name:e.first_name,last_name:e.last_name,username:e.username}),!0))}}),m.default.addEventListener("language_change",e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))}),y.default.getState().then(e=>{const t=y.default.storagesResults.users;if(t.length)for(let e=0,s=t.length;e{this.pushContact(e)}),s.length&&(this.contactsFillPromise=Object(n.a)(),this.contactsFillPromise.resolve(this.contactsList))),y.default.addEventListener("peerNeeded",e=>{if(!I.a.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})}),y.default.addEventListener("peerUnneeded",e=>{if(!I.a.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)})})}clear(e=!1){if(e)this.users={},this.usernames={};else{const e=y.default.storagesResults.users;for(const t in this.users){if(!t)continue;const s=t.toPeerId();if(!y.default.isPeerNeeded(s)){const s=this.users[t];s.username&&delete this.usernames[o(s.username)],e.findAndSplice(e=>e.id===t),this.storage.delete(t),delete this.users[t]}}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1}onContactsModified(){const e=[...this.contactsList];y.default.pushToState("contactsList",e)}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=Object(n.a)();return g.a.invokeApi("contacts.getContacts").then(e=>{"contacts.contacts"===e._&&(this.contactsList.clear(),this.saveApiUsers(e.users),e.contacts.forEach(e=>{this.pushContact(e.user_id)}),this.onContactsModified(),this.contactsFillPromise=t),t.resolve(this.contactsList)},()=>{this.updatedContactsList=!1}),{cached:null===(e=this.contactsFillPromise)||void 0===e?void 0:e.isFulfilled,promise:this.contactsFillPromise||(this.contactsFillPromise=t)}}resolveUsername(e){return"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase(),this.usernames[e]?Promise.resolve(this.users[this.usernames[e]]):g.a.invokeApi("contacts.resolveUsername",{username:e}).then(e=>(this.saveApiUsers(e.users),M.a.saveApiChats(e.chats),I.a.getPeer(I.a.getPeerId(e.peer))))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),y.default.requestPeerSingle(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),y.default.releaseSinglePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];if(!t)return"";return[t.first_name,t.last_name,t.phone,t.username,t.pFlags.self?c.default.format("SavedMessages",!0):"",t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" ")}getContacts(e,t=!1,s="name"){return this.fillContacts().promise.then(i=>{let n=[...i];if(e){const t=this.contactsIndex.search(e);n=[...n].filter(e=>t.has(e))}"name"===s?n.sort((e,t)=>{const s=(this.users[e]||{}).sortName||"",i=(this.users[t]||{}).sortName||"";return s.localeCompare(i)}):"online"===s&&n.sort((e,t)=>{const s=P.getUserStatusForSort(P.getUser(e).status);return P.getUserStatusForSort(P.getUser(t).status)-s});const r=m.default.myId.toUserId();return Object(a.e)(n,r),t&&this.testSelfSearch(e)&&n.unshift(r),n})}getContactsPeerIds(e,t,s){return this.getContacts(e,t,s).then(e=>e.map(e=>e.toPeerId(!1)))}toggleBlock(e,t){return g.a.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:I.a.getInputPeerById(e)}).then(s=>(s&&v.a.processLocalUpdate({_:"updatePeerBlocked",peer_id:I.a.getOutputPeer(e),blocked:t}),s))}testSelfSearch(e){const t=this.getSelf(),s=this.createSearchIndex();return s.indexObject(t.id,this.getUserSearchText(t.id)),s.search(e).has(t.id)}createSearchIndex(){return new _.a({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach(e=>this.saveApiUser(e,t)))}saveApiUser(e,t){var s,i;if("userEmpty"===e._)return;const a=e.id,n=this.users[a];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==n)return;if(!n||n.username!==e.username){if(null==n?void 0:n.username){const e=o(n.username);delete this.usernames[e]}if(e.username){const t=o(e.username);this.usernames[t]=a}}if(n&&void 0!==n.initials&&void 0!==n.sortName&&n.first_name===e.first_name&&n.last_name===e.last_name)e.sortName=n.sortName,e.initials=n.initials;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":Object(r.b)(t,!1),e.initials=f.a.getAbbreviation(t)}e.status&&(e.status.expires&&(e.status.expires-=u.a.serverTimeOffset),e.status.was_online&&(e.status.was_online-=u.a.serverTimeOffset));let d=!1,l=!1;if(void 0===n)this.users[a]=e;else{e.first_name===n.first_name&&e.last_name===n.last_name&&e.username===n.username||(l=!0);(null===(s=n.photo)||void 0===s?void 0:s.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id)&&(d=!0);const t=!!n.pFlags.contact,r=!!e.pFlags.contact;Object(h.i)(n,e),m.default.dispatchEvent("user_update",a),t!==r&&this.onContactUpdated(a,r,t)}d&&m.default.dispatchEvent("avatar_update",e.id.toPeerId()),l&&m.default.dispatchEvent("peer_title_edit",e.id.toPeerId()),this.setUserToStateIfNeeded(e)}setUserToStateIfNeeded(e){y.default.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}formatUserPhone(e){return"+"+Object(l.a)(e).formatted}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e&&(e=this.getUser(e).status),e){const t="userStatusOnline"===e._?e.expires:"userStatusOffline"===e._?e.was_online:0;if(t)return t;switch(e._){case"userStatusRecently":return 3;case"userStatusLastWeek":return 2;case"userStatusLastMonth":return 1}}return 0}getUser(e){return Object(h.f)(e)?e:this.users[e]||{id:e,pFlags:{deleted:!0},access_hash:""}}getSelf(){return this.getUser(m.default.myId)}getUserStatusString(e){var t;let s,i;switch(e){case p.c:s="Peer.RepliesNotifications";break;case p.d:s="Peer.ServiceNotifications";break;default:{if(this.isBot(e)){s="Bot";break}const a=this.getUser(e);if(!a){s="";break}if(a.pFlags.support){s="SupportStatus";break}switch(null===(t=a.status)||void 0===t?void 0:t._){case"userStatusRecently":s="Lately";break;case"userStatusLastWeek":s="WithinAWeek";break;case"userStatusLastMonth":s="WithinAMonth";break;case"userStatusOffline":{const e=a.status.was_online,t=Date.now()/1e3;if(t-e<60)s="Peer.Status.justNow";else if(t-e<3600){s="Peer.Status.minAgo";i=[(t-e)/60|0]}else if(t-e<86400){s="LastSeen.HoursAgo";i=[(t-e)/3600|0]}else{s="Peer.Status.LastSeenAt";const t=new Date(1e3*e);i=[("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2),("0"+t.getHours()).slice(-2)+":"+("0"+t.getMinutes()).slice(-2)]}break}case"userStatusOnline":s="Online";break;default:s="ALongTimeAgo"}break}}return Object(c.i18n)(s,i)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isContact(e){return this.contactsList.has(e)||!(!this.users[e]||!this.users[e].pFlags.contact)}isRegularUser(e){const t=this.users[e];return t&&!this.isBot(e)&&!t.pFlags.deleted&&!t.pFlags.support}isNonContactUser(e){return this.isRegularUser(e)&&!this.isContact(e)&&e.toPeerId()!==m.default.myId}hasUser(e,t){const s=this.users[e];return Object(h.f)(s)&&(t||!s.pFlags.min)}canSendToUser(e){const t=this.getUser(e);return!t.pFlags.deleted&&t.id.toPeerId()!==p.c}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}}getContactMediaInput(e){const t=this.getUser(e);return{_:"inputMediaContact",first_name:t.first_name,last_name:t.last_name,phone_number:t.phone,vcard:"",user_id:e}}updateUserStatus(e,t=Object(d.g)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(v.a.updatesState.syncLoading)return;const i=this.getUser(e);i&&i.status&&"userStatusOnline"!==i.status._&&"userStatusEmpty"!==i.status._&&!i.pFlags.support&&!i.pFlags.deleted&&(i.status={_:"userStatusOnline",expires:s+60},m.default.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(i))}importContact(e,t,s){return this.importContacts([{first_name:e,last_name:t,phones:[s]}]).then(e=>{if(!e.length){const e=new Error;throw e.type="NO_USER",e}return e[0]})}importContacts(e){const t=[];for(let s=0;s{this.saveApiUsers(e.users);return e.imported.map(e=>(this.onContactUpdated(e.user_id,!0),e.user_id))})}getTopPeers(e){return this.getTopPeersPromises[e]?this.getTopPeersPromises[e]:this.getTopPeersPromises[e]=y.default.getState().then(t=>{const s=t.topPeersCache[e];return s&&s.cachedTime+864e5>Date.now()&&s.peers?s.peers:g.a.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then(s=>{let i=[];return"contacts.topPeers"===s._&&(this.saveApiUsers(s.users),M.a.saveApiChats(s.chats),s.categories.length&&(i=s.categories[0].peers.map(e=>{const t=I.a.getPeerId(e.peer);return y.default.requestPeer(t,"topPeer"),{id:t,rating:e.rating}}))),t.topPeersCache[e]={peers:i,cachedTime:Date.now()},y.default.pushToState("topPeersCache",t.topPeersCache),i})})}getBlocked(e=0,t=0){return g.a.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then(e=>{this.saveApiUsers(e.users),M.a.saveApiChats(e.chats);return{count:"contacts.blocked"===e._?e.users.length+e.chats.length:e.count,peerIds:e.users.map(e=>e.id.toPeerId()).concat(e.chats.map(e=>e.id.toPeerId(!0)))}})}searchContacts(e,t=20){return g.a.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then(e=>{this.saveApiUsers(e.users),M.a.saveApiChats(e.chats);return{my_results:Object(a.b)(e.my_results.map(e=>I.a.getPeerId(e))),results:e.results.map(e=>I.a.getPeerId(e))}})}onContactUpdated(e,t,s=this.isContact(e)){t!==s&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),m.default.dispatchEvent("contacts_update",e))}updateUsername(e){return g.a.invokeApi("account.updateUsername",{username:e}).then(e=>{this.saveApiUser(e)})}setUserStatus(e,t){if(this.isBot(e))return;const s=this.users[e];if(s){const i=t?{_:"userStatusOffline",was_online:Object(d.g)(!0)}:{_:"userStatusOnline",expires:Object(d.g)(!0)+50};s.status=i,m.default.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(s)}}addContact(e,t,s,i,a){return g.a.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:s,phone:i,add_phone_privacy_exception:a}).then(t=>{v.a.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)})}deleteContacts(e){return g.a.invokeApi("contacts.deleteContacts",{id:e.map(e=>this.getUserInput(e))}).then(t=>{v.a.processUpdateMessage(t,{override:!0}),e.forEach(e=>{this.onContactUpdated(e,!1)})})}};i.a.appUsersManager=P;t.a=P},42:function(e,t,s){"use strict";var i=s(29),a=s(34),n=s(31),r=s(15),o=s(47),d=s(40),l=s(16);const h=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],c=["red","green","yellow","blue","violet","pink","cyan","orange"],g=[0,7,4,1,6,3,5];["isChannel","isMegagroup","isAnyGroup","isBroadcast","isBot","isContact","isUser","isAnyChat"].forEach(e=>{const t=Array.isArray(e)?e[0]:e,s=Array.isArray(e)?e[1]:e;String.prototype[t]=function(){return p[s](this.toString())},Number.prototype[t]=function(){return p[s](this)}});const p=new class{canPinMessage(e){return e.isUser()||o.a.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){const t=e.isUser()?d.a.getUserPhoto(e.toUserId()):o.a.getChatPhoto(e.toChatId());return"chatPhotoEmpty"!==t._&&"userProfilePhotoEmpty"!==t._?t:null}getPeerMigratedTo(e){if(e.isUser())return!1;const t=o.a.getChat(e.toChatId());return!!(t&&t.migrated_to&&t.pFlags.deactivated)&&this.getPeerId(t.migrated_to)}getPeerTitle(e,t=!1,s=!1){e||(e=r.default.myId);let i="";if(e.isUser()){const t=d.a.getUser(e.toUserId());t.first_name&&(i+=t.first_name),!t.last_name||s&&i||(i+=" "+t.last_name),i=i?i.trim():t.pFlags.deleted?l.default.format("HiddenName",!0):t.username}else{i=o.a.getChat(e.toChatId()).title,s&&(i=i.split(" ")[0])}return t?i:n.a.wrapEmojiText(i)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return o.a.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?d.a.getUserString(e.toUserId()):o.a.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeer(e).username||""}getPeer(e){return e.isUser()?d.a.getUser(e.toUserId()):o.a.getChat(e.toChatId())}getPeerId(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if(Object(a.f)(e))return void 0!==e.user_id?e.user_id.toPeerId():(e.channel_id||e.chat_id).toPeerId(!0);if(!e)return 0;const t="u"===e.charAt(0),s=e.substr(1).split("_");return t?s[0].toPeerId():(s[0]||"").toPeerId(!0)}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&o.a.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&o.a.isMegagroup(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!o.a.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&d.a.isBot(e.toUserId())}isContact(e){return e.isUser()&&d.a.isContact(e.toUserId())}isUser(e){return+e>=0}isAnyChat(e){return!this.isUser(e)}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 o.a.isChannel(t)?o.a.getChannelInputPeer(t):o.a.getChatInputPeer(t)}const t=e.toUserId();return{_:"inputPeerUser",user_id:t,access_hash:d.a.getUser(t).access_hash}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:Object(a.f)(e)?e:this.getInputPeerById(e)}}getPeerColorById(e,t=!0){if(!e)return"";const s=g[Math.abs(+e)%7];return(t?c:h)[s]}getPeerSearchText(e){let t;if(this.isUser(e))t="%pu "+d.a.getUserSearchText(e.toUserId());else{t="%pg "+(o.a.getChat(e.toChatId()).title||"")}return t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===r.default.myId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return o.a.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return o.a.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}};i.a.appPeersManager=p,t.a=p},47:function(e,t,s){"use strict";var i=s(29),a=s(34),n=s(32),r=s(31),o=s(15),d=s(79),l=s(42),h=s(17),c=s(40);const g=new class{constructor(){this.storage=h.default.storages.chats,this.onChatUpdated=(e,t)=>{var s;d.a.processUpdateMessage(t),(null===(s=null==t?void 0:t.updates)||void 0===s?void 0:s.length)&&this.isChannel(e)&&o.default.dispatchEvent("invalidate_participants",e)},this.clear(!0),o.default.addMultipleEventsListeners({updateChannelParticipant:e=>{n.a.clearCache("channels.getParticipants",t=>t.channel.channel_id===e.channel_id)},updateChatDefaultBannedRights:e=>{const t=l.a.getPeerId(e.peer).toChatId(),s=this.chats[t];s&&(s.default_banned_rights=e.default_banned_rights,o.default.dispatchEvent("chat_update",t))}}),h.default.getState().then(e=>{const t=h.default.storagesResults.chats;if(t.length)for(let e=0,s=t.length;e{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})}),h.default.addEventListener("peerUnneeded",e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())})})}clear(e=!1){if(e)this.chats={};else{const e=h.default.storagesResults.chats;for(const t in this.chats)t&&(h.default.isPeerNeeded(t.toPeerId(!0))||(e.findAndSplice(e=>e.id===t),this.storage.delete(t),delete this.chats[t]))}}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach(e=>this.saveApiChat(e,t)))}saveApiChat(e,t){var s,i;if("chatEmpty"===e._)return;const n=this.chats[e.id];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==n)return;e.initials=r.a.getAbbreviation(e.title),"channel"===e._&&void 0===e.participants_count&&void 0!==n&&n.participants_count&&(e.participants_count=n.participants_count);let d=!1,l=!1;if(void 0===n)this.chats[e.id]=e;else{(null===(s=n.photo)||void 0===s?void 0:s.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id)&&(d=!0),n.title!==e.title&&(l=!0),Object(a.i)(n,e),o.default.dispatchEvent("chat_update",e.id)}const c=e.id.toPeerId(!0);d&&o.default.dispatchEvent("avatar_update",c),l&&o.default.dispatchEvent("peer_title_edit",c),h.default.isPeerNeeded(c)&&this.storage.set({[e.id]:e})}getChat(e){return e.isAnyChat()&&(console.error("chatId should be positive"),i.b),this.chats[e]||{_:"chatEmpty",id:e,deleted:!0,access_hash:"",pFlags:{}}}combineParticipantBannedRights(e,t){const s=this.getChat(e);if(s.default_banned_rights){t=Object(a.a)(t);const e=s.default_banned_rights.pFlags;for(let s in e)t.pFlags[s]=e[s]}return t}hasRights(e,t,s,i){const a=this.getChat(e);if("chatEmpty"===a._)return!1;if(a.pFlags.deactivated&&"view_messages"!==t)return!1;if(a.pFlags.creator&&void 0===s)return!0;if("chatForbidden"===a._||"channelForbidden"===a._||a.pFlags.kicked||a.pFlags.left&&!a.pFlags.megagroup)return!1;if(!s&&!(s=a.admin_rights||a.banned_rights||a.default_banned_rights))return!1;let n={};switch(s&&(n=s.pFlags),t){case"embed_links":case"send_games":case"send_gifs":case"send_inline":case"send_media":case"send_messages":case"send_polls":case"send_stickers":if(!i&&a.pFlags.left)return!1;if("chatBannedRights"===s._&&n[t])return!1;if("channel"===a._&&!a.pFlags.megagroup&&!n.post_messages)return!1;break;case"delete_messages":return!!n.delete_messages;case"pin_messages":return"chatAdminRights"===s._?n[t]||!!n.post_messages:!n[t];case"invite_users":case"change_info":return"chatAdminRights"===s._?n[t]:!n[t];case"change_type":case"delete_chat":return!1;case"change_permissions":return"chatAdminRights"===s._&&n.ban_users;case"view_participants":return!("chat"!==a._&&a.pFlags.broadcast&&!a.pFlags.creator&&!a.admin_rights)}return!0}editChatDefaultBannedRights(e,t){const s=this.getChat(e);return s.default_banned_rights&&s.default_banned_rights.until_date===t.until_date&&Object(a.b)(s.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():n.a.invokeApi("messages.editChatDefaultBannedRights",{peer:l.a.getInputPeerById(e.toPeerId(!0)),banned_rights:t}).then(this.onChatUpdated.bind(this,e))}isChannel(e){const t=this.chats[e];return!(!t||"channel"!==t._&&"channelForbidden"!==t._)}isMegagroup(e){const t=this.chats[e];return!(!t||"channel"!==t._||!t.pFlags.megagroup)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const s=this.getChat(e);return("channelForbidden"===s._||"chatForbidden"===s._||"chatEmpty"===s._||s.pFlags.left||s.pFlags.kicked||s.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return"chatEmpty"!==t._&&t.access_hash?{_:"inputChannel",channel_id:e,access_hash:t.access_hash||"0"}:{_:"inputChannelEmpty"}}getChatInputPeer(e){return{_:"inputPeerChat",chat_id:e}}getChannelInputPeer(e){return{_:"inputPeerChannel",channel_id:e,access_hash:this.getChat(e).access_hash||0}}hasChat(e,t){const s=this.chats[e];return Object(a.f)(s)&&(t||!s.pFlags.min)}getChatPhoto(e){const t=this.getChat(e);return t&&t.photo||{_:"chatPhotoEmpty"}}getChatString(e){const t=this.getChat(e);return this.isChannel(e)?(this.isMegagroup(e)?"s":"c")+e+"_"+t.access_hash:"g"+e}createChannel(e,t){return n.a.invokeApi("channels.createChannel",{broadcast:!0,title:e,about:t}).then(e=>{d.a.processUpdateMessage(e);const t=e.chats[0].id;return o.default.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t})}inviteToChannel(e,t){const s=this.getChannelInput(e),i=t.map(e=>c.a.getUserInput(e));return n.a.invokeApi("channels.inviteToChannel",{channel:s,users:i}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return n.a.invokeApi("messages.createChat",{users:t.map(e=>c.a.getUserInput(e)),title:e}).then(e=>{d.a.processUpdateMessage(e);const t=e.chats[0].id;return o.default.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t})}leaveChannel(e){return n.a.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return n.a.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,s=100){return n.a.invokeApi("messages.addChatUser",{chat_id:e,user_id:c.a.getUserInput(t),fwd_limit:s}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return n.a.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:c.a.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,c.a.getSelf().id)}leave(e){return this.isChannel(e)?this.leaveChannel(e):this.leaveChat(e)}delete(e){return this.isChannel(e)?this.deleteChannel(e):this.deleteChat(e)}deleteChannel(e){return n.a.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return n.a.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):n.a.invokeApi("messages.migrateChat",{chat_id:e}).then(t=>{this.onChatUpdated(e,t);return t.updates.find(e=>"updateChannel"===e._).channel_id})}updateUsername(e,t){return n.a.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t}).then(s=>{if(s){this.getChat(e).username=t}return s})}editPhoto(e,t){const s={_:"inputChatUploadedPhoto",file:t};let i;return i=this.isChannel(e)?n.a.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:s}):n.a.invokeApi("messages.editChatPhoto",{chat_id:e,photo:s}),i.then(e=>{d.a.processUpdateMessage(e)})}editTitle(e,t){let s;return s=this.isChannel(e)?n.a.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):n.a.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),s.then(e=>{d.a.processUpdateMessage(e)})}editAbout(e,t){const s=e.toPeerId(!0);return n.a.invokeApi("messages.editChatAbout",{peer:l.a.getInputPeerById(s),about:t}).then(e=>(e&&o.default.dispatchEvent("peer_bio_edit",s),e))}getParticipantPeerId(e){return e.peer?l.a.getPeerId(e.peer):e.user_id.toPeerId()}editBanned(e,t,s){const i="object"!=typeof t?t:this.getParticipantPeerId(t);return n.a.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:l.a.getInputPeerById(i),banned_rights:s}).then(a=>{if(this.onChatUpdated(e,a),"object"==typeof t){const a=Date.now()/1e3|0;d.a.processLocalUpdate({_:"updateChannelParticipant",channel_id:e,date:a,actor_id:void 0,qts:void 0,user_id:i,prev_participant:t,new_participant:Object.keys(s.pFlags).length?{_:"channelParticipantBanned",date:a,banned_rights:s,kicked_by:c.a.getSelf().id,peer:l.a.getOutputPeer(i),pFlags:{}}:void 0})}})}clearChannelParticipantBannedRights(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{}})}kickFromChannel(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{view_messages:!0}})}resolveChannel(e){return n.a.invokeApiSingle("channels.getChannels",{id:[{_:"inputChannel",channel_id:e,access_hash:"0"}]}).then(e=>{this.saveApiChats(e.chats)})}togglePreHistoryHidden(e,t){return this.migrateChat(e).then(e=>n.a.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t})).then(e=>{d.a.processUpdateMessage(e)})}toggleSignatures(e,t){return n.a.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then(e=>{d.a.processUpdateMessage(e)})}};i.a.appChatsManager=g,t.a=g},50:function(e,t,s){"use strict";var i=s(75),a=s(122),n=s(34),r=s(0),o=s(32),d=s(132),l=s(73),h=s(40),c=s(126),g=s(29),p=s(96),u=s(118),f=s(37),m=s(97);class _{constructor(){this.photos={}}savePhoto(e,t){var s;if("photoEmpty"===e._)return;const i=this.photos[e.id];if(e.file_reference&&(Object(n.h)("file_reference",i,e),d.a.saveContext(e.file_reference,t)),null===(s=e.sizes)||void 0===s?void 0:s.length){const t=e.sizes[e.sizes.length-1];"photoSizeProgressive"===t._&&(t.size=t.sizes[t.sizes.length-1])}return i?Object.assign(i,e):this.photos[e.id]=e}choosePhotoSize(e,t=0,s=0,i=!1,a=!1){window.devicePixelRatio>1&&(t*=2,s*=2);let n={_:"photoSizeEmpty",type:""},r=e.sizes||e.thumbs;if(a&&r&&"document"===e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:void 0})),null==r?void 0:r.length){for(let e=0,i=r.length;e=t||a.height>=s)break}i&&"photoSizeEmpty"===n._&&"photoStrippedSize"===r[0]._&&(n=r[0])}return n}getUserPhotos(e,t="0",s=20){const i=h.a.getUserInput(e);return o.a.invokeApiCacheable("photos.getUserPhotos",{user_id:i,offset:0,limit:s,max_id:t},{cacheSeconds:60}).then(s=>{h.a.saveApiUsers(s.users);const i=s.photos.map((t,i)=>(s.photos[i]=this.savePhoto(t,{type:"profilePhoto",peerId:e.toPeerId()}),t.id));if("0"!==t&&t){const e=i.indexOf(t);-1!==e&&i.splice(e,1)}return{count:s.count||i.length,photos:i}})}getPreviewURLFromBytes(e,t=!1){let s,i;t?s=e instanceof Uint8Array?e:new Uint8Array(e):(s=new Uint8Array(_.jpegHeader.concat(Array.from(e.slice(3)),_.jpegTail)),s[164]=e[1],s[166]=e[2]),i=t?r.IS_SAFARI?"image/png":"image/webp":"image/jpeg";const a=new Blob([s],{type:i});return URL.createObjectURL(a)}getPathFromPhotoPathSize(e){const t=e.bytes;let s="M";for(let e=0,i=t.length;e=192?s+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[i-128-64]:(i>=128?s+=",":i>=64&&(s+="-"),s+=""+(63&i))}return s+="z",s}getPreviewURLFromThumb(e,t,s=!1){const i=l.a.getCacheContext(e,t.type);return i.url||(i.url=this.getPreviewURLFromBytes(t.bytes,s))}getImageFromStrippedThumb(e,t,s){const i=this.getPreviewURLFromThumb(e,t,!1),a=new Image;a.classList.add("thumbnail");const n=(s?Object(c.a)(i):Promise.resolve(i)).then(e=>Object(p.b)(a,e));return{image:a,loadPromise:n}}setAttachmentSize(e,t,s,i,a=!0,n,r,o){let d;o||(o=this.choosePhotoSize(e,s,i,void 0,r));const l="document"===e._;d=l?Object(f.c)(e.w||o.w||512,e.h||o.h||512):Object(f.c)(o.w||100,o.h||100);let h=Object(f.c)(s,i);h=d=d.aspect(h,a);let c=!0;return l&&!["video","gif"].includes(e.type)||(h.width<200&&h.height<200&&(h=d=d.aspectCovered(Object(f.c)(200,200))),n&&(n.message||n.reply_to_mid||n.media.webpage||n.replies&&n.replies.pFlags.comments&&777!==n.replies.channel_id)&&h.width<320&&(h=Object(f.c)(320,h.height),c=!1),c&&h.width<120&&n&&(h=Object(f.c)(120,h.height),c=!1)),t.style.width=h.width+"px",t.style.height=h.height+"px",{photoSize:o,size:d,isFit:c}}getStrippedThumbIfNeeded(e,t,s,i=!1){if(!t.downloaded||["video","gif"].includes(e.type)||i){if("document"===e._&&t.downloaded&&!i)return null;const a=e.sizes||e.thumbs,n=(null==a?void 0:a.length)?a.find(e=>"photoStrippedSize"===e._):null;if(n&&"bytes"in n)return this.getImageFromStrippedThumb(e,n,s)}return null}getPhotoDownloadOptions(e,t,s,i){const a="document"===e._;if(!t||"photoSizeEmpty"===t._)throw new Error("photoSizeEmpty!");const n=("photoSize"===t._||"photoSizeProgressive"===t._)&&e.access_hash&&e.file_reference,r={_:a?"inputDocumentFileLocation":"inputPhotoFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t.type};return{dcId:e.dc_id,location:r,size:n?t.size:void 0,queueId:s,onlyCache:i}}preloadPhoto(e,t,s,i){const n=this.getPhoto(e);if(!n||"photoEmpty"===n._)throw new Error("preloadPhoto photoEmpty!");if(!t){const e=m.a.windowW,s=m.a.windowH;t=this.choosePhotoSize(n,e,s)}const r=l.a.getCacheContext(n,t.type);if(r.downloaded>=("size"in t?t.size:0)&&r.url)return Promise.resolve();const o=this.getPhotoDownloadOptions(n,t,s,i),d=Object(a.a)(o.location);let h=l.a.getDownload(d);return h||(h=l.a.download(o),h.then(e=>{if(!r.downloaded||r.downloaded{}),h)}getPhoto(e){return Object(n.f)(e)?e:this.photos[e]}getInput(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}getMediaInput(e){return{_:"inputMediaPhoto",id:this.getInput(e),ttl_seconds:0}}savePhotoFile(e,t){const s=this.choosePhotoSize(e,65535,65535);if("photoSize"!==s._&&"photoSizeProgressive"!==s._)return;const i=this.getPhotoDownloadOptions(e,s,t);i.fileName="photo"+e.id+".jpg",l.a.downloadToDisc(i,i.fileName)}}_.jpegHeader=Object(i.c)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),_.jpegTail=Object(i.c)("ffd9");const v=new _;g.a&&(g.a.appPhotosManager=v),t.a=v},54:function(e,t,s){"use strict";s.d(t,"a",(function(){return h}));var i=s(29),a=s(42),n=s(15),r=s(16),o=s(36),d=s(40);const l=new WeakMap;i.a.peerTitleWeakMap=l,n.default.addEventListener("peer_title_edit",e=>{Array.from(document.querySelectorAll(`.peer-title[data-peer-id="${e}"]`)).forEach(e=>{const t=l.get(e);t&&t.update()})});class h{constructor(e){this.plainText=!1,this.onlyFirstName=!1,this.dialog=!1,this.element=document.createElement("span"),this.element.classList.add("peer-title"),this.element.setAttribute("dir","auto"),this.update(e),l.set(this.element,this)}update(e){if(e)for(let t in e)this.element.dataset[t]=e[t]?""+("boolean"==typeof e[t]?+e[t]:e[t]):"0",this[t]=e[t];this.peerId===n.default.myId&&this.dialog?Object(o.a)(this.element,Object(r.i18n)(this.onlyFirstName?"Saved":"SavedMessages")):this.peerId.isUser()&&d.a.getUser(this.peerId).pFlags.deleted?Object(o.a)(this.element,Object(r.i18n)(this.onlyFirstName?"Deleted":"HiddenName")):this.element.innerHTML=a.a.getPeerTitle(this.peerId,this.plainText,this.onlyFirstName)}}},64:function(e,t,s){"use strict";var i=s(122),a=s(34),n=s(132),r=s(139),o=s(31),d=s(73),l=s(50),h=s(126),c=s(32),g=s(29),p=s(55),u=s(15),f=s(117),m=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const _={mov:"video/quicktime",gif:"image/gif",pdf:"application/pdf"};const v=new class{constructor(){this.docs={},this.savingLottiePreview={},this.downloading=new Map,this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];if(t.supportsStreaming){delete t.supportsStreaming;delete d.a.getCacheContext(t).url}}},c.a.onServiceWorkerFail=this.onServiceWorkerFail}saveDoc(e,t){if("documentEmpty"===e._)return;const s=this.docs[e.id];if(e.file_reference&&(Object(a.h)("file_reference",s,e),n.a.saveContext(e.file_reference,t)),s||(this.docs[e.id]=e),e.attributes.forEach(t=>{switch(t._){case"documentAttributeFilename":e.file_name=o.a.wrapPlainText(t.file_name),e.fileName=o.a.wrapEmojiText(t.file_name);break;case"documentAttributeAudio":e.duration=t.duration,e.audioTitle=o.a.wrapEmojiText(t.title),e.audioPerformer=o.a.wrapEmojiText(t.performer),e.type=t.pFlags.voice&&"audio/ogg"===e.mime_type?"voice":"audio";break;case"documentAttributeVideo":e.duration=t.duration,e.w=t.w,e.h=t.h,t.pFlags.round_message?e.type="round":e.type="video";break;case"documentAttributeSticker":void 0!==t.alt&&(e.stickerEmojiRaw=t.alt,e.stickerEmoji=o.a.wrapRichText(e.stickerEmojiRaw,{noLinks:!0,noLinebreaks:!0})),t.stickerset&&("inputStickerSetEmpty"===t.stickerset._?delete t.stickerset:"inputStickerSetID"===t.stickerset._&&(e.stickerSetInput=t.stickerset)),"image/webp"===e.mime_type&&(e.thumbs||f.a)&&(e.type="sticker",e.sticker=1);break;case"documentAttributeImageSize":e.type="photo",e.w=t.w,e.h=t.h;break;case"documentAttributeAnimated":"image/gif"!==e.mime_type&&"video/mp4"!==e.mime_type||(e.type="gif"),e.animated=!0}}),e.mime_type)e.mime_type===_.pdf?e.type="pdf":e.mime_type===_.gif&&(e.type="gif");else{const t=(e.file_name||"").split(".").pop(),s=t&&_[t.toLowerCase()];if(s)e.mime_type=s;else switch(e.type){case"gif":case"video":case"round":e.mime_type="video/mp4";break;case"sticker":e.mime_type="image/webp";break;case"audio":e.mime_type="audio/mpeg";break;case"voice":e.mime_type="audio/ogg";break;default:e.mime_type="application/octet-stream"}}if("voice"!==e.type&&"round"!==e.type||(e.file_name=e.fileName=e.type+"_"+Object(p.f)(new Date(1e3*e.date),{monthAsNumber:!0,leadingZero:!0}).replace(/[:\.]/g,"-").replace(", ","_")),c.a.isServiceWorkerOnline()&&("gif"===e.type&&e.size>8e6||"audio"===e.type||"video"===e.type)){e.supportsStreaming=!0;const t=d.a.getCacheContext(e);t.url||(t.url=this.getFileURL(e))}return e.file_name||(e.file_name=e.fileName=""),"application/x-tgsticker"===e.mime_type&&"AnimatedSticker.tgs"===e.file_name&&(e.type="sticker",e.animated=!0,e.sticker=2),s?Object.assign(s,e):e}getDoc(e){return Object(a.f)(e)?e:this.docs[e]}getMediaInput(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}getInput(e,t){return{_:"inputDocumentFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t}}getFileDownloadOptions(e,t,s,i){const a=this.getInput(e,null==t?void 0:t.type);let n;return n=t?e.sticker?"image/webp":"image/jpeg":e.mime_type||"application/octet-stream",{dcId:e.dc_id,location:a,size:t?t.size:e.size,mimeType:n,fileName:e.file_name,queueId:s,onlyCache:i}}getFileURL(e,t=!1,s){let a;return a=t?"download":s?"thumb":e.supportsStreaming?"stream":"document",Object(i.b)(a,this.getFileDownloadOptions(e,s))}getThumbURL(e,t){let s=Promise.resolve();const i=d.a.getCacheContext(e,t.type);return i.url||(s="bytes"in t?Object(h.a)(l.a.getPreviewURLFromBytes(t.bytes,!!e.sticker)).then(e=>{i.url=e}):l.a.preloadPhoto(e,t)),{thumb:t,cacheContext:i,promise:s}}getThumb(e,t=!0){const s=l.a.choosePhotoSize(e,0,0,!t);return"photoSizeEmpty"===s._?null:this.getThumbURL(e,s)}getInputFileName(e,t){return Object(i.a)(this.getInput(e,t),{fileName:e.file_name})}downloadDoc(e,t,s){const i=this.getInputFileName(e);let a=d.a.getDownload(i);if(a)return a;const n=this.getFileDownloadOptions(e,void 0,t,s);a=d.a.download(n),this.downloading.set(e.id,a),u.default.dispatchEvent("download_start",e.id);const o=d.a.getCacheContext(e),l=a;return l.then(e=>{o.url=URL.createObjectURL(e),o.downloaded=e.size},()=>{}).finally(()=>{this.downloading.delete(e.id)}),"voice"!==e.type||r.a.isPlaySupported()||(a=l.then(e=>m(this,void 0,void 0,(function*(){const t=new FileReader;return yield new Promise((s,i)=>{t.onloadend=e=>{const t=new Uint8Array(e.target.result);r.a.decode(t).then(e=>{o.url=e.url,s()},e=>{delete o.downloaded,i(e)})},t.readAsArrayBuffer(e)}),e})))),a.then(()=>{u.default.dispatchEvent("document_downloaded",e)}),a}saveLottiePreview(e,t,s){const i=e.id+"-"+s;if(this.savingLottiePreview[i])return;e.stickerCachedThumbs||(Object(a.c)(e,["stickerCachedThumbs"]),e.stickerCachedThumbs={});const n=e.stickerCachedThumbs[s];n&&n.w>=t.width&&n.h>=t.height||(this.savingLottiePreview[i]=!0,t.toBlob(a=>{const n={url:URL.createObjectURL(a),w:t.width,h:t.height};e.stickerCachedThumbs[s]=n,delete this.savingLottiePreview[i]}))}saveDocFile(e,t){const s=this.downloadDoc(e,t);return s.then(()=>{const t=d.a.getCacheContext(e);d.a.createDownloadAnchor(t.url,e.file_name)}),s}};g.a.appDocsManager=v,t.a=v},68:function(e,t,s){"use strict";var i=s(29),a=s(65),n=s(32);const r=new class{constructor(){this.serverTimeOffset=0,a.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),n.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=r),t.a=r},70:function(e,t,s){"use strict";s.r(t),s.d(t,"AppProfileManager",(function(){return M}));var i=s(29),a=s(55),n=s(63),r=s(16),o=s(32),d=s(31),l=s(15),h=s(111),c=s(79),g=s(47),p=s(102),u=s(95),f=s(42),m=s(50),_=s(40),v=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class M{constructor(){this.usersFull={},this.chatsFull={},this.fullPromises={},this.onUpdateUserTyping=e=>{var t;const s=e.user_id?e.user_id.toPeerId():f.a.getPeerId(e.from_id);if(l.default.myId===s||"speakingInGroupCallAction"===e.action._)return;const i=f.a.getPeerId(e),a=null!==(t=this.typingsInPeer[i])&&void 0!==t?t:this.typingsInPeer[i]=[];let n=a.find(e=>e.userId===s);const r=()=>{delete n.timeout;const e=a.indexOf(n);-1!==e&&a.splice(e,1),l.default.dispatchEvent("peer_typings",{peerId:i,typings:a}),a.length||delete this.typingsInPeer[i]};if(n&&void 0!==n.timeout&&clearTimeout(n.timeout),"sendMessageCancelAction"===e.action._){if(!n)return;return void r()}n||(n={userId:s},a.push(n)),n.action=e.action;const o=_.a.hasUser(s);o?_.a.forceUserOnline(s):"updateChatUserTyping"===e._&&e.chat_id&&g.a.hasChat(e.chat_id)&&!g.a.isChannel(e.chat_id)&&I.getChatFull(e.chat_id).then(()=>{void 0!==n.timeout&&_.a.hasUser(s)&&l.default.dispatchEvent("peer_typings",{peerId:i,typings:a})}),n.timeout=window.setTimeout(r,6e3),o&&l.default.dispatchEvent("peer_typings",{peerId:i,typings:a})},this.onUpdatePeerBlocked=e=>{const t=f.a.getPeerId(e.peer_id);if(f.a.isUser(t)){const s=this.usersFull[t.toUserId()];s&&(e.blocked?s.pFlags.blocked=!0:delete s.pFlags.blocked)}l.default.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})},l.default.addMultipleEventsListeners({updateChatParticipants:e=>{const t=e.participants;if("chatParticipants"===t._){const e=t.chat_id,s=this.chatsFull[e];void 0!==s&&(s.participants=t,l.default.dispatchEvent("chat_full_update",e))}},updateChatParticipantAdd:e=>{const t=this.chatsFull[e.chat_id];if(void 0!==t){const s=t.participants,i=s.participants||[];for(let t=0,s=i.length;t{const t=this.chatsFull[e.chat_id];if(void 0!==t){const s=t.participants,i=s.participants||[];for(let t=0,a=i.length;t{var t;const s=this.chatsFull[e],i=g.a.getChat(e);if(!i.photo||!s)return;const a="chatPhotoEmpty"===i.photo._;if(s.chat_photo&&a!==("photoEmpty"===s.chat_photo._))return delete this.chatsFull[e],void l.default.dispatchEvent("chat_full_update",e);if(a)return;const n=i.photo.photo_id;(null===(t=s.chat_photo)||void 0===t?void 0:t.id)!==n&&(delete this.chatsFull[e],l.default.dispatchEvent("chat_full_update",e))}),l.default.addEventListener("invalidate_participants",e=>{this.invalidateChannelParticipants(e)}),this.typingsInPeer={}}getProfile(e,t){if(this.usersFull[e]&&!t)return Promise.resolve(this.usersFull[e]);const s=e.toPeerId(!1);return this.fullPromises[s]?this.fullPromises[s]:this.fullPromises[s]=o.a.invokeApi("users.getFullUser",{id:_.a.getUserInput(e)}).then(t=>{const i=t.user;return _.a.saveApiUser(i,!0),t.profile_photo&&(t.profile_photo=m.a.savePhoto(t.profile_photo,{type:"profilePhoto",peerId:s})),void 0!==t.about&&(t.rAbout=d.a.wrapRichText(t.about,{noLinebreaks:!0})),u.a.savePeerSettings({peerId:s,settings:t.notify_settings}),delete this.fullPromises[s],this.usersFull[e]=t})}getProfileByPeerId(e,t){return f.a.isAnyChat(e)?this.getChatFull(e.toChatId(),t):this.getProfile(e.toUserId(),t)}getFullPhoto(e){return this.getProfileByPeerId(e).then(e=>{switch(e._){case"userFull":return e.profile_photo;case"channelFull":case"chatFull":return e.chat_photo}})}getChatFull(e,t){if(g.a.isChannel(e))return this.getChannelFull(e,t);const s=this.chatsFull[e];if(s&&!t){const t=g.a.getChat(e);if(t.version===s.participants.version||t.pFlags.left)return Promise.resolve(s)}const i=e.toPeerId(!0);return void 0!==this.fullPromises[i]?this.fullPromises[i]:this.fullPromises[i]=o.a.invokeApi("messages.getFullChat",{chat_id:e}).then(t=>{g.a.saveApiChats(t.chats,!0),_.a.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo&&s.chat_photo.id&&(s.chat_photo=m.a.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:i})),u.a.savePeerSettings({peerId:i,settings:s.notify_settings}),delete this.fullPromises[i],this.chatsFull[e]=s,l.default.dispatchEvent("chat_full_update",e),s})}getChatInviteLink(e,t){return this.getChatFull(e).then(s=>!t&&s.exported_invite&&"chatInviteExported"==s.exported_invite._?s.exported_invite.link:o.a.invokeApi("messages.exportChatInvite",{peer:f.a.getInputPeerById(e.toPeerId(!0))}).then(t=>(void 0!==this.chatsFull[e]&&(this.chatsFull[e].exported_invite=t),t.link)))}getChannelParticipants(e,t={_:"channelParticipantsRecent"},s=200,i=0){if("channelParticipantsRecent"===t._){const t=g.a.getChat(e);if(t&&t.pFlags&&(t.pFlags.kicked||t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights))return Promise.reject()}return o.a.invokeApiCacheable("channels.getParticipants",{channel:g.a.getChannelInput(e),filter:t,offset:i,limit:s,hash:"0"},{cacheSeconds:60}).then(e=>(_.a.saveApiUsers(e.users),e))}getChannelParticipant(e,t){return o.a.invokeApiSingle("channels.getParticipant",{channel:g.a.getChannelInput(e),participant:f.a.getInputPeerById(t)}).then(e=>(_.a.saveApiUsers(e.users),e.participant))}getChannelFull(e,t){if(void 0!==this.chatsFull[e]&&!t)return Promise.resolve(this.chatsFull[e]);const s=e.toPeerId(!0);return void 0!==this.fullPromises[s]?this.fullPromises[s]:this.fullPromises[s]=o.a.invokeApi("channels.getFullChannel",{channel:g.a.getChannelInput(e)}).then(t=>{g.a.saveApiChats(t.chats,!0),_.a.saveApiUsers(t.users);const i=t.full_chat;return i&&i.chat_photo.id&&(i.chat_photo=m.a.savePhoto(i.chat_photo,{type:"profilePhoto",peerId:s})),u.a.savePeerSettings({peerId:s,settings:i.notify_settings}),delete this.fullPromises[s],this.chatsFull[e]=i,l.default.dispatchEvent("chat_full_update",e),i},t=>{switch(t.type){case"CHANNEL_PRIVATE":let t=g.a.getChat(e);t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},c.a.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:[t],users:[]})}throw t})}getMentions(e,t,s){let i;return i=g.a.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:p.a.getServerMessageId(s)},50,0).then(e=>e.participants.map(e=>g.a.getParticipantPeerId(e))):e?this.getChatFull(e).then(e=>e.participants.participants.map(e=>e.user_id.toPeerId())):Promise.resolve([]),Promise.all([_.a.getTopPeers("bots_inline").catch(()=>[]),i]).then(e=>(e=>{"@"===t.charAt(0)&&(t=t.slice(1));const s=new h.a({ignoreCase:!0}),i=new Map;e.forEach(e=>{s.indexObject(e.id,_.a.getUserSearchText(e.id)),i.set(e.id,e.rating)});const a=Array.from(s.search(t));return a.sort((e,t)=>i.get(t)-i.get(e)),a})(e[0].concat(e[1].map(e=>({id:e,rating:0})))))}invalidateChannelParticipants(e){delete this.chatsFull[e],delete this.fullPromises[e.toPeerId(!0)],o.a.clearCache("channels.getParticipants",t=>t.channel.channel_id===e),l.default.dispatchEvent("chat_full_update",e)}updateProfile(e,t,s){return o.a.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:s}).then(e=>(_.a.saveApiUser(e),this.getProfile(l.default.myId,!0)))}uploadProfilePhoto(e){return o.a.invokeApi("photos.uploadProfilePhoto",{file:e}).then(e=>{_.a.saveApiUsers(e.users);const t=l.default.myId;m.a.savePhoto(e.photo,{type:"profilePhoto",peerId:t}),c.a.processLocalUpdate({_:"updateUserPhoto",user_id:t,date:Object(a.g)(!0),photo:_.a.getUser(t.toUserId()).photo,previous:!0})})}deletePhotos(e){return o.a.invokeApiSingle("photos.deletePhotos",{id:e.map(e=>{const t=m.a.getPhoto(e);return m.a.getInput(t)})}).then(e=>{})}getChatMembersString(e){var t,s;const i=g.a.getChat(e);if("chatForbidden"===i._)return Object(r.i18n)("YouWereKicked");const a=this.chatsFull[e];let o;o=a?"channelFull"===a._?a.participants_count:null===(t=a.participants.participants)||void 0===t?void 0:t.length:i.participants_count||(null===(s=i.participants)||void 0===s?void 0:s.participants.length);o=o||1;let d=g.a.isBroadcast(e)?"Peer.Status.Subscribers":"Peer.Status.Member";return Object(r.i18n)(d,[Object(n.d)(o)])}verifyParticipantForOnlineCount(e){const t=_.a.getUser(e.user_id);return!(!t||!t.status||"userStatusOnline"!==t.status._)}reduceParticipantsForOnlineCount(e){return e.reduce((e,t)=>e+ +this.verifyParticipantForOnlineCount(t),0)}getOnlines(e){var t;return v(this,void 0,void 0,(function*(){if(g.a.isBroadcast(e))return 1;const s=yield this.getChatFull(e);if(g.a.isMegagroup(e)){if(s.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const i=yield o.a.invokeApiCacheable("messages.getOnlines",{peer:g.a.getChannelInputPeer(e)},{cacheSeconds:60});return null!==(t=i.onlines)&&void 0!==t?t:1}const i=s.participants;return(null==i?void 0:i.participants)?this.reduceParticipantsForOnlineCount(i.participants):1}))}getPeerTypings(e){return this.typingsInPeer[e]}}const I=new M;i.a.appProfileManager=I,t.default=I},74:function(e,t,s){"use strict";s.d(t,"a",(function(){return d})),s.d(t,"d",(function(){return h})),s.d(t,"b",(function(){return c})),s.d(t,"c",(function(){return g}));var i=s(43);class a{constructor(e){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver(t=>{if(this.locked)return;const s=[];t.forEach(e=>{const t=e.target;this.items.get(t)!==e.isIntersecting&&(this.items.set(t,e.isIntersecting),s[e.isIntersecting?"unshift":"push"]({target:t,visible:e.isIntersecting}))}),s.forEach(t=>{e(t.target,t.visible)})})}getVisible(){const e=[];return this.items.forEach((t,s)=>{t&&e.push(s)}),e}clearVisible(){const e=this.getVisible();for(const t of e)this.items.set(t,!1)}isVisible(e){return this.items.get(e)}disconnect(){this.observer.disconnect(),this.items.clear()}refresh(){this.observer.disconnect();const e=[...this.items.keys()];for(const t of e)this.observer.observe(t)}refreshVisible(){const e=this.getVisible();for(const t of e)this.observer.unobserve(t);for(const t of e)this.observer.observe(t)}observe(e){this.items.set(e,!1),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.items.delete(e)}unlock(){this.locked=!1}unlockAndRefresh(){this.unlock(),this.refresh()}lock(){this.locked=!0}}var n=s(44),r=s(127),o=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class d{constructor(e=8){this.parallelLimit=e,this.queueId=0,this.queue=[],this.inProcess=new Set,this.lockPromise=null,this.unlockResolve=null,this.log=Object(i.b)("LL",i.a.Error),this.processQueue=Object(r.a)(()=>this._processQueue(),20,!1)}clear(){this.inProcess.clear(),this.queue.length=0}lock(){this.lockPromise||(this.lockPromise=new Promise((e,t)=>{this.unlockResolve=e}))}unlock(){this.unlockResolve&&(this.unlockResolve(),this.unlockResolve=this.lockPromise=null,this.processQueue())}processItem(e){return o(this,void 0,void 0,(function*(){if(!this.lockPromise){this.inProcess.add(e);try{yield this.loadItem(e)}catch(e){["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(e)||this.log.error("loadMediaQueue error:",e)}this.inProcess.delete(e),this.processQueue()}}))}loadItem(e){return e.load()}getItem(){return this.queue.shift()}addElement(e,t){this.queue[e](t),this.processQueue()}_processQueue(e){if(!this.queue.length||this.lockPromise||this.parallelLimit>0&&this.inProcess.size>=this.parallelLimit)return;do{if(e?Object(n.e)(this.queue,e):e=this.getItem(),!e)break;this.processItem(e),e=null}while(this.inProcess.sizee.div===t.div&&e.load===t.load))return!1;for(const e of this.inProcess)if(e.div===t.div&&e.load===t.load)return!1;return this.queue[e](t),!0}setProcessQueueTimeout(){this.intersectorTimeout||(this.intersectorTimeout=window.setTimeout(()=>{this.intersectorTimeout=0,this.processQueue()},0))}push(e){super.push(e)}unshift(e){super.unshift(e)}unobserve(e){Object(n.c)(this.queue,t=>t.div===e),this.intersector.unobserve(e)}}class h extends l{constructor(e=8){super(e),this.parallelLimit=e,this.onVisibilityChange=(e,t)=>{t&&(Object(n.c)(this.queue,t=>t.div===e).forEach(e=>{e.wasSeen=!0,this.queue.unshift(e)}),this.setProcessQueueTimeout())},this.intersector=new a(this.onVisibilityChange)}getItem(){return this.queue.findAndSplice(e=>e.wasSeen)}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return o(this,void 0,void 0,(function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)}))}addElement(e,t){return!!super.addElement(e,t)&&(this.intersector.observe(t.div),t.hasOwnProperty("wasSeen")||(t.wasSeen=!1),!0)}}class c extends l{constructor(e=8,t){super(e),this.parallelLimit=e,this.onVisibilityChange=t,this._queue=new Map,this.intersector=new a((e,t)=>{const s=Object(n.c)(this.queue,t=>t.div===e);if(t){(s.length?s:[this._queue.get(e)]).forEach(t=>{this.queue.unshift(t||this._queue.get(e))})}this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()})}clear(){super.clear(),this._queue.clear()}observe(e){this._queue.set(e.div,e),this.intersector.observe(e.div)}}class g extends l{constructor(e=8,t){super(e),this.parallelLimit=e,this.onVisibilityChange=t,this.intersector=new a((e,t)=>{const s=Object(n.c)(this.queue,t=>t.div===e);t&&s.length&&s.forEach(e=>{this.queue.unshift(e)}),this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()})}observe(e){this.intersector.observe(e)}}},75:function(e,t,s){"use strict";function i(e){const t=e.length,s=new Array(t);for(let i=0;i>>t&24),2!==t&&i-n!=1||(s+=String.fromCharCode(r(a>>>18&63),r(a>>>12&63),r(a>>>6&63),r(63&a)),a=0);return s.replace(/A(?=A$|$)/g,"=")}function r(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function o(e,t){const s=e.length;if(s!==t.length)return!1;for(let i=0;ie+(t.byteLength||t.length),0),s=new Uint8Array(t);let i=0;return e.forEach(e=>{s.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),s}s.d(t,"e",(function(){return i})),s.d(t,"c",(function(){return a})),s.d(t,"d",(function(){return n})),s.d(t,"b",(function(){return o})),s.d(t,"a",(function(){return d}))},79:function(e,t,s){"use strict";var i=s(29),a=s(43),n=s(32),r=s(15),o=s(40),d=s(47),l=s(42),h=s(17),c=s(68),g=s(107),p=s(99),u=s(31),f=s(8);const m=new class{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=Object(a.b)("UPDATES",a.a.Error|a.a.Warn|a.a.Log),this.debug=i.b,this.processUpdateMessage=(e,t={})=>{const s={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(this.debug&&this.log.debug("processUpdateMessage",e),e._){case"updatesTooLong":case"new_session_created":this.forceGetDifference();break;case"updateShort":this.processUpdate(e.update,s);break;case"updateShortMessage":case"updateShortChatMessage":{Object(g.a)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,i=e.from_id||(t?r.default.myId:e.user_id),a=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||r.default.myId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:l.a.getOutputPeer(i.toPeerId()),peer_id:l.a.getOutputPeer(a),date:e.date,message:e.message,fwd_from:e.fwd_from,reply_to:e.reply_to,entities:e.entities},pts:e.pts,pts_count:e.pts_count},s);break}case"updatesCombined":case"updates":o.a.saveApiUsers(e.users,t.override),d.a.saveApiChats(e.chats,t.override),e.updates.forEach(e=>{this.processUpdate(e,s)});break;default:this.log.warn("Unknown update message",e)}}}setProxy(){const e=this;this.updatesState=new Proxy(this.updatesState,{set:function(t,s,i){return t[s]=i,e.saveUpdatesState(),!0}})}saveUpdatesState(){const e=this.updatesState;h.default.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){const e=this.updatesState,t=e.seq+1,s=e.pendingSeqUpdates[t];if(!s)return!1;const i=s.updates;for(let e=0,t=i.length;e=e.syncPending.seqAwaiting&&(e.syncPending.ptsAwaiting?delete e.syncPending.seqAwaiting:(clearTimeout(e.syncPending.timeout),e.syncPending=null)),!0}popPendingPtsUpdate(e){const t=e?this.getChannelState(e):this.updatesState;if(!t.pendingPtsUpdates.length)return!1;t.pendingPtsUpdates.sort((e,t)=>e.pts-t.pts);let s=t.pts,i=0,a=0;for(let e=0,n=t.pendingPtsUpdates.length;e=n.pts&&(i=n.pts,a=e)}if(!i)return!1;this.debug&&this.log.debug("pop pending pts updates",i,t.pendingPtsUpdates.slice(0,a+1)),t.pts=i;for(let e=0;e<=a;++e){const s=t.pendingPtsUpdates[e];this.saveUpdate(s)}return t.pendingPtsUpdates.splice(0,a+1),!t.pendingPtsUpdates.length&&t.syncPending&&(t.syncPending.seqAwaiting?delete t.syncPending.ptsAwaiting:(clearTimeout(t.syncPending.timeout),t.syncPending=null)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState;let s=t.syncLoading;s||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const i=n.a.invokeApi("updates.getDifference",{pts:t.pts,pts_total_limit:e?1200:void 0,date:t.date,qts:-1},{timeout:2147483647}).then(s=>{if(this.debug&&this.log.debug("Get diff result",s),"updates.differenceEmpty"===s._)return this.debug&&this.log.debug("apply empty diff",s.seq),t.date=s.date,void(t.seq=s.seq);if(e&&r.default.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==s._){o.a.saveApiUsers(s.users),d.a.saveApiChats(s.chats),s.other_updates.forEach(e=>{switch(e._){case"updateChannelTooLong":case"updateNewChannelMessage":case"updateEditChannelMessage":return void this.processUpdate(e)}this.saveUpdate(e)}),s.new_messages.forEach(e=>{this.saveUpdate({_:"updateNewMessage",message:e,pts:t.pts,pts_count:0})});const e="updates.difference"===s._?s.state:s.intermediate_state;t.seq=e.seq,t.pts=e.pts,t.date=e.date}else t.pts=s.pts,t.date=(Date.now()/1e3|0)+c.a.serverTimeOffset,delete t.seq,this.channelStates={},this.log.warn("getDifference:",s._),r.default.dispatchEvent("state_cleared");if("updates.differenceSlice"===s._)return this.getDifference();this.debug&&this.log.debug("finished get diff")});return s||this.justAName(t,i),i}getChannelDifference(e){const t=this.getChannelState(e),s=t.syncLoading;s||(t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const i=n.a.invokeApi("updates.getChannelDifference",{channel:d.a.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:30},{timeout:2147483647}).then(s=>{if(this.debug&&this.log.debug("Get channel diff result",s),t.pts="pts"in s?s.pts:void 0,"updates.channelDifferenceEmpty"!==s._){if("updates.channelDifferenceTooLong"===s._)return this.debug&&this.log.debug("channel diff too long",s),delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(o.a.saveApiUsers(s.users),d.a.saveApiChats(s.chats),this.debug&&this.log.debug("applying",s.other_updates.length,"channel other updates"),s.other_updates.forEach(e=>{this.saveUpdate(e)}),this.debug&&this.log.debug("applying",s.new_messages.length,"channel new messages"),s.new_messages.forEach(e=>{this.saveUpdate({_:"updateNewChannelMessage",message:e,pts:t.pts,pts_count:0})}),this.debug&&this.log.debug("apply channel diff",t.pts),"updates.channelDifference"===s._&&!s.pFlags.final)return this.getChannelDifference(e);this.debug&&this.log.debug("finished channel get diff")}else this.debug&&this.log.debug("apply channel empty diff",s)});return s||this.justAName(t,i,e),i}justAName(e,t,s){e.syncLoading=t,r.default.dispatchEvent("state_synchronizing",s),t.then(()=>{e.syncLoading=null,r.default.dispatchEvent("state_synchronized",s)},()=>{e.syncLoading=null})}addChannelState(e,t){if(!t)throw new Error("Add channel state without pts "+e);return!(e in this.channelStates)&&(this.channelStates[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null},!0)}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var s;let i;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":i=l.a.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(i=e.channel_id,!(i in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(i=e.channel_id)}const{pts:a,pts_count:n}=e,r=i?this.getChannelState(i,a):this.updatesState;if(r.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!r.lastPtsUpdateTime||r.lastPtsUpdateTime{r.syncPending=null,r.syncLoading||(i?this.getChannelDifference(i):this.getDifference())},6)}),r.syncPending.ptsAwaiting=!0,!1;if(a>r.pts)r.pts=a,h=!0,r.lastPtsUpdateTime=Date.now();else if(n)return!1;i&&t.date&&this.updatesState.date0){const s=t.seq,i=t.seqStart||s;if(i!==r.seq+1&&i>r.seq)return this.debug&&this.log.warn("Seq hole",r,r.syncPending&&r.syncPending.seqAwaiting),void 0===r.pendingSeqUpdates[i]&&(r.pendingSeqUpdates[i]={seq:s,date:t.date,updates:[]}),r.pendingSeqUpdates[i].updates.push(e),r.syncPending||(r.syncPending={timeout:window.setTimeout(()=>{r.syncPending=null,r.syncLoading||this.getDifference()},6)}),(!r.syncPending.seqAwaiting||r.syncPending.seqAwaiting{const t=h.default.newVersion;e&&e.pts&&e.date?(Object.assign(this.updatesState,e),this.log("will get difference",Object.assign({},e)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise(e=>{n.a.invokeApi("updates.getState",{},{noErrorBox:!0}).then(t=>{this.updatesState.seq=t.seq,this.updatesState.pts=t.pts,this.updatesState.date=t.date,this.saveUpdatesState(),this.updatesState.syncLoading=null,e()})})),n.a.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),t&&this.updatesState.syncLoading.then(()=>{fetch("changelogs/"+t+".md").then(e=>200===e.status&&e.ok&&e.text()||Promise.reject()).then(e=>{e=`**Telegram Web${f.a.suffix} was updated to version alpha ${t}**\n\n`+e;const s=[],i={_:"updateServiceNotification",entities:s,message:u.b.parseMarkdown(e,s),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(i)}).catch(p.a)})}))}};i.a.apiUpdatesManager=m,t.a=m},94:function(e,t,s){"use strict";function i(e){const t=document.createElement("span");return t.innerHTML=e,t}s.d(t,"a",(function(){return i}))},95:function(e,t,s){"use strict";var i=s(112),a=s(29),n=s(45),r=s(55),o=s(34),d=s(77),l=s(0),h=s(16),c=s(32),g=s(26),p=s(15),u=s(80),f=s(79),m=s(47),_=s(42),v=s(128),M=s(17),I=s(40);const y=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=!!navigator.vibrate,this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null},this.faviconEl=document.head.querySelector('link[rel="icon"]'),this.titleBackup=document.title,this.titleChanged=!1,this.stopped=!1,this.settings={},this.pushInited=!1,this.updateLocalSettings=()=>{Promise.all(["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map(e=>u.a.get(e))).then(e=>{if(this.settings.nodesktop=e[0],this.settings.volume=void 0===e[1]?.5:e[1],this.settings.novibrate=e[2],this.settings.nopreview=e[3],this.settings.nopush=e[4],this.pushInited){const e=!this.settings.nopush&&!this.settings.nodesktop&&g.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?g.default.subscribe():g.default.unsubscribe())}g.default.setSettings(this.settings)}),M.default.getState().then(e=>{this.settings.nosound=!e.settings.notifications.sound})},this.requestPermission=()=>{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)},navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.topMessagesDeferred=Object(n.a)(),this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),p.default.addEventListener("instance_deactivated",()=>{this.stop()}),p.default.addEventListener("instance_activated",()=>{this.stopped&&this.start()}),p.default.addEventListener("idle",e=>{this.stopped||(e||this.clear(),this.toggleToggler())}),p.default.addMultipleEventsListeners({updateNotifySettings:e=>{const t="notifyPeer"===e.peer._&&_.a.getPeerId(e.peer.peer),s="notifyPeer"!==e.peer._?e.peer._:void 0;this.savePeerSettings({key:s,peerId:t,settings:e.notify_settings}),p.default.dispatchEvent("notify_settings",e)}}),p.default.addEventListener("push_init",e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):g.default.subscribe()}),p.default.addEventListener("push_subscribe",e=>{this.registerDevice(e)}),p.default.addEventListener("push_unsubscribe",e=>{this.unregisterDevice(e)}),p.default.addEventListener("dialogs_multiupdate",()=>{this.topMessagesDeferred.resolve()},{once:!0}),p.default.addEventListener("push_notification_click",e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void c.a.invokeApi("account.updateDeviceLocked",{period:86400}).then(()=>{});const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then(()=>{e.custom.channel_id&&!m.a.hasChat(e.custom.channel_id)||t.isUser()&&!I.a.hasUser(t)||p.default.dispatchEvent("history_focus",{peerId:t,mid:+e.custom.msg_id})})})}toggleToggler(e=p.default.idle.isIDLE){if(l.IS_MOBILE)return;const t=()=>{this.titleChanged=!1,document.title=this.titleBackup,this.setFavicon()};window.clearInterval(this.titleInterval),this.titleInterval=0,e?this.titleInterval=window.setInterval(()=>{const e=this.notificationsCount;if(e)if(this.titleChanged)t();else{this.titleChanged=!0,document.title=h.default.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const s=t.getContext("2d");s.beginPath(),s.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),s.fillStyle="#3390ec",s.fill();let a=24,n=""+e;e<10?a=22:e<100?a=20:(n="99+",a=16),a*=window.devicePixelRatio,s.font=`700 ${a}px ${i.b}`,s.textBaseline="middle",s.textAlign="center",s.fillStyle="white",s.fillText(n,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)},1e3):t()}getLocalSettings(){return this.settings}getNotifySettings(e){let t,s=Object(d.b)(e._),i=this.peerSettings[s];return"inputNotifyPeer"===e._&&(t=s=_.a.getPeerId(e.peer),i=i[s]),i||((i||this.peerSettings)[s]=c.a.invokeApi("account.getNotifySettings",{peer:e}).then(e=>(this.savePeerSettings({key:s,peerId:t,settings:e}),e)))}getNotifyPeerTypeSettings(){if(this.getNotifyPeerTypePromise)return this.getNotifyPeerTypePromise;const e=["inputNotifyBroadcasts","inputNotifyUsers","inputNotifyChats"].map(e=>this.getNotifySettings({_:e}));return this.getNotifyPeerTypePromise=Promise.all(e)}updateNotifySettings(e,t){return c.a.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then(s=>{s&&f.a.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:Object(d.b)(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})})}getNotifyExceptions(){c.a.invokeApi("account.getNotifyExceptions",{compare_sound:!0}).then(e=>{f.a.processUpdateMessage(e)})}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=c.a.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){c.a.invokeApi("account.setContactSignUpNotification",{silent:e}).then(t=>{this.notifyContactsSignUp=Promise.resolve(!e)})}setFavicon(e="assets/img/favicon.ico"){if(this.prevFavicon===e)return;const t=this.faviconEl.cloneNode();t.href=e,this.faviconEl.parentNode.replaceChild(t,this.faviconEl),this.faviconEl=t,this.prevFavicon=e}savePeerSettings({key:e,peerId:t,settings:s}){let i;t&&(e=t,i=this.peerSettings.notifyPeer),(i||this.peerSettings)[e]=s,t||p.default.dispatchEvent("notify_peer_type_settings",{key:e,settings:s})}isMuted(e){return"peerNotifySettings"===e._&&(1e3*e.mute_until>Object(r.g)()||e.silent)}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:_.a.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then(e=>this.isMuted(e))}getPeerLocalSettings(e,t=!0){const s={_:"peerNotifySettings"},i=this.peerSettings.notifyPeer[e];if(!i||i instanceof Promise||Object.assign(s,i),t){const t=_.a.getInputNotifyPeerById(e,!0),i=Object(d.b)(t._),a=this.peerSettings[i];if(a&&!(a instanceof Promise))for(let e in a)void 0===s[e]&&(s[e]=a[e])}return s}isPeerLocalMuted(e,t=!0){if(e===p.default.myId)return!1;const s=this.getPeerLocalSettings(e,t);return this.isMuted(s)}start(){if(this.updateLocalSettings(),p.default.addEventListener("settings_updated",this.updateLocalSettings),g.default.start(),!this.notificationsUiSupport)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&window.addEventListener("click",this.requestPermission);try{"onbeforeunload"in window&&window.addEventListener("beforeunload",this.clear)}catch(e){}}stop(){this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}notify(e){if(this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),this.notificationsCount++,this.titleInterval||this.toggleToggler();const t=++this.notificationIndex,s=e.key||"k"+t;this.notificationsShown[s]=!0;const i=Object(r.g)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=i),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return!1;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;let a;if("Notification"in window){try{if(e.tag)for(let t in this.notificationsShown){const s=this.notificationsShown[t];"boolean"!=typeof s&&s.tag===e.tag&&(s.hidden=!0)}a=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1})}catch(e){return this.notificationsUiSupport=!1,void g.default.setLocalNotificationsDisabled()}a.onclick=()=>{a.close(),v.a.focus(),this.clear(),e.onclick&&e.onclick()},a.onclose=()=>{a.hidden||(delete this.notificationsShown[s],this.clear())},a.show&&a.show(),this.notificationsShown[s]=a,l.IS_MOBILE||setTimeout(()=>{this.hide(s)},8e3)}}testSound(e){const t=Object(r.g)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(i),i.addEventListener("ended",()=>{i.remove()},{once:!0})}cancel(e){const t=this.notificationsShown[e];if(t){this.notificationsCount>0&&--this.notificationsCount;try{"boolean"!=typeof t&&t.close&&(t.hidden=!0,t.close())}catch(e){}delete this.notificationsShown[e]}}hide(e){const t=this.notificationsShown[e];if(t&&"boolean"!=typeof t)try{t.close&&(t.hidden=!0,t.close())}catch(e){}}soundReset(e){delete this.soundsPlayed[e]}clear(){for(const e in this.notificationsShown){const t=this.notificationsShown[e];try{"boolean"!=typeof t&&t.close&&t.close()}catch(e){}}this.notificationsShown={},this.notificationsCount=0,g.default.hidePushNotifications()}registerDevice(e){if(this.registeredDevice&&Object(o.b)(this.registeredDevice,e))return!1;c.a.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then(()=>{this.registeredDevice=e},e=>{e.handled=!0})}unregisterDevice(e){if(!this.registeredDevice)return!1;c.a.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then(()=>{this.registeredDevice=!1},e=>{e.handled=!0})}getVibrateSupport(){return this.vibrateSupport}};a.a.appNotificationsManager=y,t.a=y},96:function(e,t,s){"use strict";s.d(t,"a",(function(){return n})),s.d(t,"b",(function(){return r}));const i={},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 n(e,t,s,n=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(s&&s());if(i[t]&&n||e instanceof HTMLVideoElement)e&&a(e,t),s&&s();else{const n=e instanceof HTMLImageElement,r=n?e:new Image;r.src=t,r.addEventListener("load",()=>{!n&&e&&a(e,t),i[t]=!0,s&&s()},{once:!0}),s&&r.addEventListener("error",s)}}function r(e,t,s){return new Promise(i=>{n(e,t,i,s)})}},97:function(e,t,s){"use strict";const i=new class{constructor(){this.windowW=0,this.windowH=0;const e="visualViewport"in window?window.visualViewport:window,t=()=>{this.windowW=e.width||e.innerWidth,this.windowH=e.height||e.innerHeight};e.addEventListener("resize",t),t()}};t.a=i}}]); -//# sourceMappingURL=6.7dba74a574616a20ac7d.chunk.js.map \ No newline at end of file diff --git a/public/6.7dba74a574616a20ac7d.chunk.js.map b/public/6.7dba74a574616a20ac7d.chunk.js.map deleted file mode 100644 index b9260d4da..000000000 --- a/public/6.7dba74a574616a20ac7d.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/lib/appManagers/appMessagesIdsManager.ts","webpack:///./src/components/preloader.ts","webpack:///./src/helpers/files.ts","webpack:///./src/helpers/assumeType.ts","webpack:///./src/helpers/middleware.ts","webpack:///./src/lib/searchIndex.ts","webpack:///./src/components/middleEllipsis.ts","webpack:///./src/lib/appManagers/appDraftsManager.ts","webpack:///./src/lib/appManagers/appAvatarsManager.ts","webpack:///./src/helpers/cleanSearchText.ts","webpack:///./src/helpers/slicedArray.ts","webpack:///./src/lib/appManagers/appPollsManager.ts","webpack:///./src/helpers/heavyQueue.ts","webpack:///./src/helpers/blur.ts","webpack:///./src/lib/mtproto/referenceDatabase.ts","webpack:///./src/helpers/dom/htmlToDocumentFragment.ts","webpack:///./src/lib/opusDecodeController.ts","webpack:///./src/lib/appManagers/appWebPagesManager.ts","webpack:///./src/environment/imageMimeTypesSupport.ts","webpack:///./src/vendor/leemon.ts","webpack:///./src/lib/mtproto/bin_utils.ts","webpack:///./src/environment/movSupport.ts","webpack:///./src/environment/videoMimeTypesSupport.ts","webpack:///./src/lib/storages/dialogs.ts","webpack:///./src/lib/storages/filters.ts","webpack:///./src/helpers/formatCallDuration.ts","webpack:///./src/helpers/formatDuration.ts","webpack:///./src/lib/appManagers/appMessagesManager.ts","webpack:///./src/helpers/cleanUsername.ts","webpack:///./src/lib/appManagers/appUsersManager.ts","webpack:///./src/lib/appManagers/appPeersManager.ts","webpack:///./src/lib/appManagers/appChatsManager.ts","webpack:///./src/lib/appManagers/appPhotosManager.ts","webpack:///./src/components/peerTitle.ts","webpack:///./src/lib/appManagers/appDocsManager.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/lib/appManagers/appProfileManager.ts","webpack:///./src/components/visibilityIntersector.ts","webpack:///./src/components/lazyLoadQueue.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/lib/appManagers/apiUpdatesManager.ts","webpack:///./src/helpers/dom/htmlToSpan.ts","webpack:///./src/lib/appManagers/appNotificationsManager.ts","webpack:///./src/helpers/dom/renderImageFromUrl.ts","webpack:///./src/helpers/windowSize.ts"],"names":["AppMessagesIdsManager","tempNum","messageId","temp","q","MESSAGE_ID_OFFSET","num","this","MESSAGE_ID_INCREMENT","clearMessageId","toServer","l","used","increment","generateMessageId","getServerMessageId","appMessagesIdsManager","ProgressivePreloader","options","tempId","detached","promise","isUpload","cancelable","streamable","tryAgainOnFail","attachMethod","onClick","e","preloader","classList","contains","loadFunc","cancel","document","createElement","add","color","bold","constructContainer","construct","innerHTML","totalLength","downloadSvg","lastElementChild","cancelSvg","previousElementSibling","circle","firstElementChild","func","setProgress","startTime","Date","now","onEnd","err","notify","notifyAll","elapsedTime","delay","TRANSITION_TIME","detach","setTimeout","attach","parentElement","setManual","then","catch","addNotifyListener","details","percents","done","total","elem","reset","remove","attachPromise","useRafs","undefined","getTotalLength","style","strokeDasharray","Math","max","createPosterFromMedia","media","width","height","HTMLVideoElement","videoWidth","videoHeight","naturalWidth","naturalHeight","mediaSize","boxSize","quality","Promise","resolve","canvas","size","aspectFitted","window","devicePixelRatio","getContext","drawImage","toBlob","blob","mimeType","createPosterFromVideo","video","reject","onseeked","currentTime","onerror","min","duration","createPosterForVideo","url","volume","addEventListener","once","src","preloadVideo","race","onMediaLoad","readyState","HAVE_METADATA","useCanplayOnIos","getFilesFromEvent","onlyTypes","files","scanFiles","entry","item","isDirectory","directoryReader","createReader","readEntries","entries","push","type","itemFile","getAsFile","file","File","DataTransferItem","DragEvent","dataTransfer","items","i","length","clipboardData","originalEvent","promises","kind","webkitGetAsEntry","all","requestFile","accept","input","display","body","append","target","finally","click","assumeType","x","getMiddleware","cleanupObj","cleaned","clean","get","_cleanupObj","SearchIndex","minChars","fullTexts","Map","id","searchText","trim","delete","set","query","newFoundObjs","queryWords","split","queryWordsLength","forEach","fullText","what","found","foundChars","word","idx","indexOf","fullTextLength","sort","a","b","Set","map","o","testQueue","fontFamily","timeoutId","setTestQueue","cancelAnimationFrame","requestAnimationFrame","testQueueElements","testElement","clear","key","capture","passive","element","mapped","firstTime","text","textLength","from","multiplier","font","textWidth","elementWidth","textContent","dataset","fontWeight","getTextWidth","getBoundingClientRect","newElementWidth","widthChanged","setAttribute","smallerText","smallerWidth","smallerTextLength","half","half1","substr","replace","half2","removeAttribute","context","measureText","MiddleEllipsisElement","HTMLElement","super","customElements","define","appDraftsManager","drafts","getAllDraftPromise","addMultipleEventsListeners","updateDraftMessage","update","peerID","getPeerId","peer","saveDraft","threadId","draft","peerId","getKey","getAllDrafts","toPeerId","getDialogOnly","reloadConversation","invokeApi","updates","updatesState","syncLoading","processUpdateMessage","apiDraft","processApiDraft","dispatchEvent","force","draft1","draft2","_","reply_to_msg_id","entities","message","pFlags","no_webpage","myEntities","parseEntities","apiEntities","totalEntities","mergeEntities","slice","rMessage","wrapDraftText","localDraft","saveOnServer","serverDraft","getDraft","draftsAreEqual","draftObj","params","getInputPeerById","isEmptyDraft","getInputEntities","saveLocalDraft","date","serverTimeOffset","bool","combined","syncDraft","appAvatarsManager","savedAvatarURLs","photo","inputPeer","getAvatarPromise","cached","saved","peerPhotoFileLocation","photo_id","big","downloadOptions","dcId","dc_id","location","download","URL","createObjectURL","loadPromise","div","img","Image","onlyThumb","renderThumbPromise","callback","thumbImage","loadAvatar","animate","settings","animationsEnabled","res","putAvatar","stripped_thumb","getPreviewURLFromBytes","childElementCount","mutateElement","renderPromise","icon","isDialog","title","myId","s","isUser","user","getUser","deleted","getPeerColorById","getPeerPhoto","avatarAvailable","avatarRendered","abbr","getAbbreviation","getPeer","initials","badCharsRe","trimRe","clearBadCharsAndTrim","latinizeString","ch","latinizeCh","LatinizeMap","cleanSearchText","latinize","hasTag","charAt","toLowerCase","processSearchText","includeTag","clearBadChars","ignoreCase","SliceEnd","SlicedArray","sliceConstructor","getSliceConstructor","first","constructSlice","slices","slicedArray","Array","end","None","side","isEnd","Top","last","includes","Bottom","Both","setEnd","start","deleteCount","ret","splice","unsetEnd","flatten","lowerBound","upperBound","foundSlice","lowerIndex","upperIndex","foundSliceIndex","sliced","unshift","insertIndex","prevSlice","nextSlice","insertSlice","index","maxId","offset","offsetId","add_offset","limit","sliceOffset","pos","findSliceOffset","sliceStart","sliceEnd","topWasMeantToLoad","bottomWasMeantToLoad","abs","topFulfilled","bottomFulfilled","offsetIdOffset","fulfilled","findSlice","appPollsManager","polls","results","pollToMessages","log","Error","updateMessagePoll","poll","poll_id","savePoll","updatePollToMessage","Object","assign","saveResults","rQuestion","wrapEmojiText","question","rReply","chosenIndexes","answer","chosen","pollId","correctAnswers","solution","solutionEntities","parseMarkdown","correct_answers","solution_entities","mid","optionIds","answers","option","is_outgoing","invokeAfterMessageIsSent","sendVote","msg_id","votesList","saveApiUsers","users","closed","newPoll","editMessage","newMedia","getInputMediaPoll","error","heavyQueue","processingQueue","addHeavyTask","queue","method","processHeavyQueue","todo","f","performance","possiblePromise","process","apply","shift","realResult","timedChunk","isFilterAvailable","requireBlurPromise","fastBlurFunc","processBlurNext","radius","iterations","ctx","alpha","filter","toDataURL","m","default","blurPromises","dataUri","console","has","onload","referenceDatabase","contexts","links","addTaskListener","task","originalPayload","payload","refreshReference","bytes","postMessage","reference","getContexts","_context","getReferenceByLink","values","next","value","c","wrapSingleMessage","warn","hex","newHex","deleteContext","newContext","htmlToDocumentFragment","html","template","content","opusDecodeController","sampleRate","tasks","keepAlive","isPlaySupportedResult","audio","canPlayType","wavWorker","Worker","data","page","onTaskEnd","worker","command","waveform","buffers","typedArray","buffer","loadWorker","loadWavWorker","terminateWorkers","result","clearTimeout","timeout","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","dataBlob","Blob","photoTypeSet","appWebPagesManager","webpages","pendingWebPages","updateWebPage","saveWebPage","webpage","apiWebPage","messageKey","mediaContext","oldWebPage","isUpdated","hash","savePhoto","saveDoc","siteName","site_name","shortTitle","author","rTitle","wrapRichText","noLinks","noLinebreaks","contextHashtag","matches","match","shortDescriptionText","description","rDescription","contextSite","pendingSet","msgs","isScheduled","webPage","IMAGE_MIME_TYPES_SUPPORTED","bpe","mask","int2bigInt","t","bits","minSize","k","ceil","buff","copyInt_","n","len","isObject","object","VIDEO_MIME_TYPES_SUPPORTED","appMessagesManager","appChatsManager","appPeersManager","appUsersManager","appNotificationsManager","appStateManager","apiUpdatesManager","serverTimeManager","folders","onUpdateFolderPeers","folder_peers","folderPeer","folder_id","dialog","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","folderId","onUpdatePinnedDialogs","handleOrder","order","pinnedOrders","reverse","newPinned","dialogs","getFolderDialogs","dialogsResult","applyDialogs","d","storage","storages","getCache","getSelf","peerText","getPeerSearchText","dialogsIndex","indexObject","onFilterUpdate","getCachedDialogs","processDialogForFilter","filterId","processDialogForFilters","indexKey","orderIndex","chatId","chat","getChat","left","dropDialogOnDeletion","updateFolderPeers","updateDialogPinned","updatePinnedDialogs","getState","state","storagesResults","top_message","topMessage","saveMessages","saveDialog","getMessageByPeer","allDialogsLoaded","loaded","pushToState","init","0","1","setDialogsLoaded","savePinnedOrders","dialogsOffsetDate","dialogsNum","cachedResults","count","offsetDate","getOffsetDate","unreadMessagesCount","unreadDialogsCount","skipMigrated","folder","getFolder","migratedTo","concat","filtersStorage","testDialogForFilter","pinnedIndex","pinnedPeerIds","generateDialogIndex","generateDialogPinnedDateByIndex","pinned_peers","skipped","isPinned","filters","getDialogIndexKey","wasIndex","findIndex","wasDialog","wasDialogIndex","newDialogIndex","setDialogIndexInFilter","prepareFolderUnreadCountModifyingByDialog","callbacks","toggle","wasUnreadCount","getDialogUnreadCount","newUnreadCount","addMessagesCount","addDialogsCount","modifyFolderUnreadCount","dispatchUnreadTimeout","justReturn","topDate","generateDialogPinnedDate","channelId","isChannel","toChatId","channel","foundIndex","pts","historyStorage","getHistoryStorage","messagesStorage","getMessagesStorage","history","incomingMessage","getMessageFromStorage","fromId","viaBotId","requestPeerSingle","isAnyChat","newPts","getChannelState","ignoreOffsetDate","saveGlobalOffset","setDialogToState","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","isDialogsLoaded","clearDialogFromState","foundDialog","getDialog","wasPinned","keepLocal","releaseSinglePeer","dropped","dropDialogWithEvent","saveApiChats","chats","messages","updatedDialogs","topPendingMessage","pendingTopMsgs","newUpdatesAfterReloadToHandle","saveUpdate","keys","kicked","wasDialogBefore","wasTopMessage","generateTempMessageId","from_id","getOutputPeer","peer_id","out","isOutgoing","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","isOut","unread","unread_count","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","notify_settings","addChannelState","getFilter","offsetIndex","fillContactsResult","fillContacts","reloadMissingDialogsPromise","reloadMissingPeerIds","getDialogs","realFolderId","curDialogStorage","indexStr","search","d1","d2","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","convertment","rootScope","onUpdateDialogFilter","saveDialogFilter","onUpdateDialogFilterOrder","setOrderIndex","hasOwnProperty","updateDialogFilter","updateDialogFilters","oldFilters","getDialogFilters","_filterId","find","updateDialogFilterOrder","reloadedPeerIds","excludePeerIds","includePeerIds","exclude_archived","exclude_read","isDialogUnread","exclude_muted","isPeerLocalMuted","broadcasts","isBroadcast","groups","isAnyGroup","userId","toUserId","isBot","bots","non_contacts","isContact","contacts","config","pinned_infolder_count_max","prepend","flags","getOutputDialogFilter","filterIncludedPinnedPeers","include_peers","pinnedPeers","reloadDialogs","reloadPromises","reloadPromise","overwrite","invokeApiSingle","to","oldFilter","CALL_DURATION_LANG_KEYS","h","w","formatCallDuration","elements","showLast","p","modulus","formatDuration","fragment","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","fetchSingleMessagesPromise","maxSeenId","newMessagesHandleTimeout","newMessagesToHandle","newDialogsToHandle","notificationsHandlePromise","notificationsToHandle","reloadConversationsPeers","logger","Debug","Log","Warn","groupedTempId","typings","unreadMentions","goToNextMentionPromises","handleNewMessages","handleNewDialogs","newMaxSeenId","obj","dialogsStorage","incrementMaxSeenId","handleNotifications","_peerId","idle","isIDLE","notifyPeerToHandle","getNotifyPeerTypeSettings","getNotifySettings","getInputNotifyPeerById","peerTypeNotifySettings","notifyAboutMessage","fwdCount","onUpdateMessageId","randomId","random_id","pendingData","Boolean","finalizePendingMessageCallbacks","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","threadKey","getThreadKey","threadsStorage","good","isInChat","pendingMessage","checkPendingMessage","updateMessageRepliesIfNeeded","firstSlice","forceUserOnline","action","user_id","channel_id","top_msg_id","chat_id","processLocalUpdate","handleNewMessage","inboxUnread","releaseUnreadCount","prepareDialogUnreadCountModifying","mentioned","unread_mentions_count","modifyCachedMentions","setDialogTopMessage","notifyPeer","fwd_from","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","grouped_id","onUpdateReadHistory","max_id","read_max_id","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","threadsToReplies","updateMessage","replyTo","reply_to","reply_to_top_id","setCount","getReadMaxIdIfUnread","threadKeyPart","onUpdateReadMessagesContents","mids","getMessageById","fixDialogUnreadMentionsIfNoMessage","media_unread","setDialogToStateIfMessageIsTop","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","clearCache","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","affected","onUpdateChannel","needDialog","username","historiesStorage","onUpdateChannelReload","onUpdateChannelMessageViews","views","onUpdateServiceNotification","inbox_date","hasUser","verified","access_hash","first_name","phone","pts_count","onUpdatePinnedMessages","missingMessages","werePinned","pinnedMessages","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","scheduledMessagesStorage","onUpdateDeleteScheduledMessages","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","filterFunc","getScheduledMessagesStorage","getWebPage","drop","maxSeenMsgId","middleware","messagesStorageByPeerId","groupedMessagesStorage","searchesStorage","threadsServiceMessagesIdsStorage","sendEntites","entity","getUserInput","callbackName","finalize","deferred","schedule_date","scheduleDate","is_scheduled","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","splitted","sendText","getPeerMigratedTo","generateOutgoingMessage","toggleError","on","send","sentRequestOptions","apiPromise","afterMessageId","invokeApiAfter","query_id","queryId","resultId","clear_draft","clearDraft","silent","wrapMessageEntities","seq","local","beforeMessageSending","attachType","apiFileName","fileType","mime_type","fileName","name","isDocument","caption","attributes","isPhoto","actionName","isVoiceMessage","attribute","voice","isMedia","photoSize","sizes","cacheContext","appDownloadManager","getCacheContext","downloaded","objectURL","appPhotosManager","videoAttribute","round_message","isRoundMessage","supports_streaming","noSound","file_name","thumbs","thumb","thumbCacheContext","appDocsManager","sentDeferred","uploaded","cancelPendingMessage","setTyping","uploadPromise","file_reference","inputMedia","load","thumbUploadPromise","upload","inputFile","force_file","progress","floor","isGroupedItem","background","code","sendFile","sendFileDetails","groupId","invoke","multiMedia","multi_media","messageMedia","getMediaInput","doc","inputSingleMedia","inputs","total_voters","getPoll","getPhoto","getDoc","phone_number","last_name","vcard","geo","geoPoint","address","provider","venue_id","venue_type","postAuthor","signatures","generateFromId","post_author","generateFlags","random","generateReplyHeader","via_bot_id","reply_markup","replyMarkup","replies","generateReplies","pending","replyToTopId","header","channelFull","appProfileManager","chatsFull","linked_chat_id","comments","replies_pts","isAnonymousSending","post","originalMessage","fwdHeader","from_name","channel_post","saved_from_msg_id","saved_from_peer","Number","MAX_SAFE_INTEGER","admin_rights","anonymous","chatHistoryStorage","offset_date","offset_id","offset_peer","offsetPeerId","noErrorBox","resetPinnedOrder","telegramMeWebManager","setAuthorized","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","peerIds","folderDialogs","dialogsLength","slicedDialogs","fromPeerId","dropCaptions","dropAuthor","newMessages","generateForwardHeader","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","createMessageStorage","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","fullfillLeft","peers","just_clear","revoke","affectedHistory","doFlushHistory","justClear","getHistory","historyResult","getChannelInput","ss","getPinnedMessage","getSearch","inputFilter","unpin","pm_oneside","unpinAll","unpinAllMessages","foundMessages","getMidsByAlbum","verify","reply_to_mid","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","fwdFromId","ttl_seconds","getMessageKeyForPendingWebPage","migrateFrom","migrateTo","suffix","video_sizes","reason","migrateChecks","saveMessage","fixEmoji","usingMids","plain","highlightWord","withoutMediaType","parts","addPart","langKey","part","format","el","usingFullAlbum","getMidsByMessage","getAlbumText","emoticon","prefix","game","stickerEmojiRaw","stickerEmoji","performer","join","actionWrapped","wrapMessageActionTextNew","regExp","RegExp","exec","messageWrapped","noTextFormat","createDocumentFragment","senderTitle","fromMe","peerTitle","unsafeMessage","wrapPlainText","langPackKey","args","getNameDivHTML","getPeerTitle","endsWith","today","daysToStart","getTime","tomorrowDate","setDate","getDate","_args","IntlDateElement","day","month","year","pinnedMessage","fetchMessageReplyTo","isMessageIsTopMessage","dir","wrapMessageForReply","htmlToSpan","anchorHTML","domain","langPack","botId","startParam","bot","start_param","inviteToChannel","addChatUser","str","toggleDialogPin","pinned_dialogs_count_max","getPinnedOrders","getDialogPeer","read","hasChat","fromChat","goodMedias","sticker","canMessageBeEdited","edit_time_limit","hasRights","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","hidden","canCache","invokeApiCacheable","bind","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","goodEntities","matchUrl","nextRate","backLimit","minDate","maxDate","filterMessagesByInputFilter","next_rate","offset_id_offset","min_date","max_date","min_id","offsetMessage","offset_rate","searchResult","foundCount","getDiscussionMessage","maxMessageId","serviceStartMessage","is_single","filterMessages","generateThreadServiceStartMessage","newDialogsHandlePromise","localMessageIds","creator","delete_messages","affectedMessages","triedToReadMaxId","readPromise","soundReset","getPeerString","readHistory","loadNextPromise","loadNextMentions","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","msgIds","threadMessage","broadcastEventName","finalizePendingMessage","mute","mute_until","canSendToUser","finalMessage","tempMessage","newPhoto","newDoc","newPhotoSize","oldCacheContext","getPhotoDownloadOptions","fakeDownload","getInputFileName","handleReleasingMessage","notification","peerString","notificationMessage","show_previews","onclick","tag","peerPhoto","image","canSendToPeer","isFetchIntervalNeeded","haveSlice","sliceMe","fillHistoryStorage","isBottomEnd","isHistoryResultEnd","requestHistory","oldestMessage","_historyResult","requestPromises","after","getMessagesResult","fetchSingleMessages","replyToPeerId","reply_to_peer_id","typing","smth","deleteWebPageFromPending","groupedId","groupedStorage","albums","peerMessagesToHandle","deletedMids","cleanUsername","updateUsersStatuses","timestampNow","updateUserStatus","setInterval","status","expires","was_online","setUserToStateIfNeeded","updateUserPhoto","updateUserName","saveApiUser","contactsIndex","getUserSearchText","contactsList","isArray","pushContact","contactsFillPromise","getFromCache","usernames","isPeerNeeded","findAndSplice","getTopPeersPromises","createSearchIndex","updatedContactsList","isFulfilled","contact","onContactsModified","resolvedPeer","self","includeSaved","sortBy","_contactsList","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","testSelfSearch","getContacts","userIds","block","blocked","apiUsers","override","oldUser","oldSearchUsername","searchUsername","fullName","changedPhoto","changedTitle","wasContact","newContact","onContactUpdated","formatPhoneNumber","formatted","support","getMonth","getHours","getMinutes","isRegularUser","allowMin","eventTimestamp","timestamp","importContacts","phones","inputContacts","j","client_id","toString","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","topPeers","categories","topPeer","requestPeer","rating","contactsBlocked","u","cacheSeconds","my_results","curIsContact","popContact","offline","showPhone","add_phone_privacy_exception","DialogColorsFg","DialogColors","DialogColorsMap","newMethod","originMethod","String","prototype","getUserPhoto","getChatPhoto","plainText","onlyFirstName","getUserString","getChatString","isPeerId","peerParams","isMegagroup","ignorePeerId","getChannelInputPeer","getChatInputPeer","pic","getDialogType","onChatUpdated","updateChannelParticipant","updateChatDefaultBannedRights","default_banned_rights","apiChats","saveApiChat","oldChat","participants_count","rights","defaultRights","isThread","megagroup","banned_rights","myFlags","post_messages","broadcast","until_date","about","usersInputs","fwdLimit","fwd_limit","deleteChatUser","leaveChannel","leaveChat","deleteChannel","deleteChat","inputChatPhoto","participant","getParticipantPeerId","actor_id","qts","prev_participant","new_participant","kicked_by","editBanned","view_messages","messagesChats","enabled","migrateChat","AppPhotosManager","photos","oldPhoto","saveContext","boxWidth","boxHeight","useBytes","pushDocumentSize","bestPhotoSize","inputUser","photosResult","photoIds","isSticker","arr","Uint8Array","jpegHeader","jpegTail","path","useBlur","getPreviewURLFromThumb","noZoom","choosePhotoSize","aspect","isFit","aspectCovered","ignoreCache","getImageFromStrippedThumb","queueId","onlyCache","thumb_size","photoId","fullWidth","windowW","fullHeight","windowH","getDownload","getInput","fullPhotoSize","downloadToDisc","weakMap","WeakMap","peerTitleWeakMap","querySelectorAll","PeerTitle","EXTENSION_MIME_TYPE_MAP","mov","gif","pdf","docs","savingLottiePreview","downloading","onServiceWorkerFail","supportsStreaming","oldDoc","audioTitle","audioPerformer","alt","stickerset","stickerSetInput","animated","ext","pop","mappedMimeType","monthAsNumber","leadingZero","isServiceWorkerOnline","getFileURL","docId","thumbSize","inputFileLocation","getFileDownloadOptions","preloadPhoto","tryNotToUseBytes","getThumbURL","originalPromise","isPlaySupported","reader","FileReader","onloadend","uint8","decode","readAsArrayBuffer","toneIndex","stickerCachedThumbs","downloadDoc","createDownloadAnchor","AppProfileManager","usersFull","fullPromises","onUpdateUserTyping","typingsInPeer","cancelAction","getChatFull","onUpdatePeerBlocked","userFull","updateChatParticipants","participants","chatFull","updateChatParticipantAdd","_participants","inviter_id","version","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","emptyPhoto","chat_photo","invalidateChannelParticipants","profile_photo","rAbout","getProfile","getProfileByPeerId","profile","getChannelFull","full_chat","exported_invite","link","exportedInvite","channelParticipant","fullChannel","getChannelParticipants","cP","getTopPeers","ratingMap","processUserIds","updateResult","previous","deletedList","reduce","acc","verifyParticipantForOnlineCount","chatInfo","channelParticipants","reduceParticipantsForOnlineCount","onlines","VisibilityIntersector","onVisibilityChange","locked","observer","IntersectionObserver","changed","isIntersecting","visible","getVisible","disconnect","targets","observe","unobserve","unlock","refresh","parallelLimit","inProcess","lockPromise","unlockResolve","processQueue","throttle","_processQueue","loadItem","getItem","processItem","addElement","lock","intersector","unlockAndRefresh","intersectorTimeout","wasSeen","setProcessQueueTimeout","_queue","spliced","bytesToHex","bytesFromHex","hexString","parseInt","bytesToBase64","mod3","nLen","nUint24","nIdx","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","bufferConcats","v","byteLength","tmp","lastLength","ArrayBuffer","pendingPtsUpdates","pendingSeqUpdates","syncPending","channelStates","attached","debug","processOpts","seqStart","seq_start","forceGetDifference","processUpdate","toId","Proxy","saveUpdatesState","us","nextSeq","pendingUpdatesData","popPendingSeqUpdate","seqAwaiting","ptsAwaiting","curState","curPts","goodPts","goodIndex","getDifference","wasSyncing","pts_total_limit","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","justAName","channelState","getChannelDifference","lastPtsUpdateTime","popPts","popSeq","popPendingPtsUpdate","newVersion","stateResult","setUpdatesProcessor","setProxy","fetch","ok","span","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","navigator","vibrate","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","faviconEl","head","querySelector","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","novibrate","nopreview","nopush","needPush","isAvailable","registeredDevice","subscribe","unsubscribe","setSettings","nosound","notifications","sound","requestPermission","Notification","removeEventListener","mozVibrate","webkitVibrate","notificationsUiSupport","topMessagesDeferred","notifySoundEl","stop","newVal","toggleToggler","tokenData","unregisterDevice","registerDevice","notificationData","period","custom","enable","resetTitle","setFavicon","clearInterval","titleInterval","beginPath","arc","PI","fillStyle","fill","fontSize","textBaseline","textAlign","fillText","getNotifyPeerTypePromise","inputKey","compare_sound","notifyContactsSignUp","href","prevFavicon","cloneNode","parentNode","replaceChild","peerNotifySettings","isMuted","respectType","notifySettings","inputNotify","typeNotifySettings","getPeerLocalSettings","permission","testSound","setLocalNotificationsDisabled","close","focus","onclose","show","hide","nextSoundAt","prevSoundVolume","filename","autoplay","hidePushNotifications","token_type","tokenType","token","tokenValue","other_uids","app_sandbox","secret","loadedURLs","HTMLImageElement","SVGImageElement","setAttributeNS","backgroundImage","renderImageFromUrl","useCache","isImage","loader","renderImageFromUrlPromise","windowSize","visualViewport","innerWidth","innerHeight"],"mappings":"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","file":"6.7dba74a574616a20ac7d.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport class AppMessagesIdsManager {\r\n private static MESSAGE_ID_INCREMENT = 0x10000;\r\n private static MESSAGE_ID_OFFSET = 0xFFFFFFFF;\r\n\r\n private tempNum = 0;\r\n\r\n public generateMessageId(messageId: number, temp = false) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n const num = temp ? ++this.tempNum : 0;\r\n if(messageId >= q) {\r\n if(temp) {\r\n return messageId + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1));\r\n }\r\n\r\n return messageId;\r\n }\r\n\r\n return q + (messageId * AppMessagesIdsManager.MESSAGE_ID_INCREMENT + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1)));\r\n }\r\n\r\n /**\r\n * * will ignore outgoing offset\r\n */\r\n public getServerMessageId(messageId: number) {\r\n return this.clearMessageId(messageId, true);\r\n }\r\n\r\n public clearMessageId(messageId: number, toServer?: boolean) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\r\n return messageId;\r\n }\r\n\r\n const l = AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1;\r\n const used = messageId & l;\r\n if(used !== l) {\r\n messageId -= used + 1;\r\n }\r\n\r\n return toServer ? (messageId - q) / AppMessagesIdsManager.MESSAGE_ID_INCREMENT : messageId;\r\n }\r\n\r\n public incrementMessageId(messageId: number, increment: number) {\r\n return this.generateMessageId(this.getServerMessageId(messageId) + increment);\r\n }\r\n}\r\n\r\nconst appMessagesIdsManager = new AppMessagesIdsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appMessagesIdsManager = appMessagesIdsManager);\r\nexport default appMessagesIdsManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 { safeAssign } from \"../helpers/object\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\n\r\nconst TRANSITION_TIME = 200;\r\n\r\nexport default class ProgressivePreloader {\r\n public preloader: HTMLDivElement;\r\n public circle: SVGCircleElement;\r\n private cancelSvg: SVGSVGElement;\r\n private downloadSvg: HTMLElement;\r\n \r\n private tempId = 0;\r\n public detached = true;\r\n\r\n public promise: CancellablePromise = null;\r\n\r\n public isUpload = false;\r\n private cancelable = true;\r\n private streamable = false;\r\n private tryAgainOnFail = true;\r\n private attachMethod: 'append' | 'prepend' = 'append';\r\n\r\n public loadFunc: (e?: Event) => {download: CancellablePromise};\r\n\r\n public totalLength: number;\r\n\r\n constructor(options?: Partial<{\r\n isUpload: ProgressivePreloader['isUpload'],\r\n cancelable: ProgressivePreloader['cancelable'], \r\n streamable: ProgressivePreloader['streamable'], \r\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\r\n attachMethod: ProgressivePreloader['attachMethod']\r\n }>) {\r\n if(options) {\r\n safeAssign(this, options);\r\n }\r\n }\r\n\r\n public constructContainer(options: Partial<{\r\n color: 'transparent',\r\n bold: boolean\r\n }> = {}) {\r\n if(!this.preloader) {\r\n this.preloader = document.createElement('div');\r\n this.preloader.classList.add('preloader-container');\r\n\r\n if(options.color) {\r\n this.preloader.classList.add('preloader-' + options.color);\r\n }\r\n\r\n if(options.bold) {\r\n this.preloader.classList.add('preloader-bold');\r\n }\r\n \r\n if(this.streamable) {\r\n this.preloader.classList.add('preloader-streamable');\r\n }\r\n }\r\n }\r\n\r\n public constructDownloadIcon() {\r\n this.constructContainer();\r\n }\r\n\r\n public construct() {\r\n this.construct = null;\r\n\r\n this.constructContainer();\r\n \r\n this.preloader.innerHTML = `\r\n
\r\n \r\n \r\n \r\n
`;\r\n\r\n if(this.streamable) {\r\n this.totalLength = 118.61124420166016;\r\n } else {\r\n this.totalLength = 149.82473754882812;\r\n }\r\n\r\n if(this.cancelable) {\r\n this.preloader.innerHTML += `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `;\r\n\r\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\r\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\r\n } else {\r\n this.preloader.classList.add('preloader-swing');\r\n }\r\n \r\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\r\n\r\n if(this.cancelable) {\r\n attachClickEvent(this.preloader, this.onClick);\r\n }\r\n }\r\n\r\n public onClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.preloader.classList.contains('manual')) {\r\n if(this.loadFunc) {\r\n this.loadFunc(e);\r\n }\r\n } else {\r\n if(this.promise && this.promise.cancel) {\r\n this.promise.cancel();\r\n }\r\n }\r\n };\r\n\r\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\r\n this.loadFunc = func;\r\n }\r\n\r\n public setManual() {\r\n this.preloader.classList.add('manual');\r\n this.setProgress(0);\r\n }\r\n\r\n public attachPromise(promise: CancellablePromise) {\r\n if(this.isUpload && this.promise) return;\r\n\r\n this.promise = promise;\r\n\r\n const tempId = --this.tempId;\r\n const startTime = Date.now();\r\n\r\n const onEnd = (err: Error) => {\r\n promise.notify = promise.notifyAll = null;\r\n\r\n if(tempId !== this.tempId) {\r\n return;\r\n }\r\n\r\n const elapsedTime = Date.now() - startTime;\r\n\r\n //console.log('[PP]: end', this.detached, performance.now());\r\n\r\n if(!err && this.cancelable) {\r\n this.setProgress(100);\r\n\r\n const delay = TRANSITION_TIME * 0.75;\r\n\r\n if(elapsedTime < delay) {\r\n this.detach();\r\n } else {\r\n setTimeout(() => { // * wait for transition complete\r\n if(tempId === this.tempId) {\r\n this.detach();\r\n }\r\n }, delay);\r\n }\r\n } else {\r\n if(this.tryAgainOnFail) {\r\n this.attach(this.preloader.parentElement);\r\n fastRaf(() => {\r\n this.setManual();\r\n });\r\n } else {\r\n this.detach();\r\n }\r\n }\r\n \r\n this.promise = promise = null;\r\n };\r\n \r\n promise\r\n .then(() => onEnd(null))\r\n .catch((err) => onEnd(err));\r\n\r\n if(promise.addNotifyListener) {\r\n promise.addNotifyListener((details: {done: number, total: number}) => {\r\n /* if(details.done >= details.total) {\r\n onEnd();\r\n } */\r\n\r\n if(tempId !== this.tempId) return;\r\n\r\n //console.log('preloader download', promise, details);\r\n const percents = details.done / details.total * 100;\r\n this.setProgress(percents);\r\n });\r\n }\r\n }\r\n\r\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\r\n if(this.construct) {\r\n this.construct();\r\n }\r\n\r\n if(this.preloader.parentElement) {\r\n this.preloader.classList.remove('manual');\r\n }\r\n\r\n this.detached = false;\r\n\r\n if(promise/* && false */) {\r\n this.attachPromise(promise);\r\n }\r\n\r\n if(this.detached || this.preloader.parentElement !== elem) {\r\n const useRafs = isInDOM(this.preloader) ? 1 : 2;\r\n if(this.preloader.parentElement !== elem) {\r\n elem[this.attachMethod](this.preloader);\r\n }\r\n\r\n SetTransition(this.preloader, 'is-visible', true, TRANSITION_TIME, undefined, useRafs);\r\n }\r\n\r\n if(this.cancelable && reset) {\r\n this.setProgress(0);\r\n }\r\n }\r\n \r\n public detach() {\r\n if(this.detached) {\r\n return;\r\n }\r\n //return;\r\n\r\n this.detached = true;\r\n\r\n //return;\r\n \r\n if(this.preloader && this.preloader.parentElement) {\r\n /* setTimeout(() => *///fastRaf(() => {\r\n /* if(!this.detached) return;\r\n this.detached = true; */\r\n\r\n // fastRaf(() => {\r\n //console.log('[PP]: detach after rAF', this.detached, performance.now());\r\n\r\n // if(!this.detached || !this.preloader.parentElement) {\r\n // return;\r\n // }\r\n\r\n SetTransition(this.preloader, 'is-visible', false, TRANSITION_TIME, () => {\r\n this.preloader.remove();\r\n }, 1);\r\n // });\r\n //})/* , 5e3) */;\r\n }\r\n }\r\n \r\n public setProgress(percents: number) {\r\n if(!this.totalLength && !isInDOM(this.circle)) {\r\n return;\r\n }\r\n \r\n if(percents === 0) {\r\n this.circle.style.strokeDasharray = '';\r\n return;\r\n }\r\n \r\n try {\r\n if(!this.totalLength) {\r\n this.totalLength = this.circle.getTotalLength();\r\n }\r\n\r\n //console.log('setProgress', (percents / 100 * totalLength));\r\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\r\n } catch(err) {}\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { makeMediaSize, MediaSize } from \"./mediaSizes\";\r\nimport { pause } from \"./schedulers/pause\";\r\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\r\n\r\nexport function scaleMediaElement(options: {\r\n media: CanvasImageSource, \r\n mediaSize: MediaSize, \r\n boxSize: MediaSize, \r\n quality?: number,\r\n mimeType?: 'image/jpeg' | 'image/png'\r\n}): Promise<{blob: Blob, size: MediaSize}> {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n const size = options.mediaSize.aspectFitted(options.boxSize);\r\n canvas.width = size.width * window.devicePixelRatio;\r\n canvas.height = size.height * window.devicePixelRatio;\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(options.media, 0, 0, canvas.width, canvas.height);\r\n canvas.toBlob(blob => {\r\n resolve({blob, size});\r\n }, options.mimeType ?? 'image/jpeg', options.quality ?? 1);\r\n });\r\n}\r\n\r\nexport function preloadVideo(url: string): Promise {\r\n return new Promise((resolve, reject) => {\r\n const video = document.createElement('video');\r\n video.volume = 0;\r\n video.addEventListener('loadedmetadata', () => resolve(video), {once: true});\r\n video.addEventListener('error', reject, {once: true});\r\n video.src = url;\r\n });\r\n}\r\n\r\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\r\n let width: number, height: number;\r\n if(media instanceof HTMLVideoElement) {\r\n width = media.videoWidth;\r\n height = media.videoHeight;\r\n } else {\r\n width = media.naturalWidth;\r\n height = media.naturalHeight;\r\n }\r\n\r\n return scaleMediaElement({\r\n media, \r\n mediaSize: makeMediaSize(width, height), \r\n boxSize: makeMediaSize(320, 240),\r\n quality: .9\r\n });\r\n}\r\n\r\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\r\n return new Promise((resolve, reject) => {\r\n video.onseeked = () => {\r\n video.onseeked = () => {\r\n createPosterFromMedia(video).then(resolve);\r\n\r\n video.onseeked = undefined;\r\n };\r\n\r\n video.currentTime = 0;\r\n };\r\n \r\n video.onerror = reject;\r\n video.currentTime = Math.min(video.duration, 1);\r\n });\r\n}\r\n\r\nexport async function createPosterForVideo(url: string) {\r\n const video = await preloadVideo(url);\r\n\r\n return Promise.race([\r\n pause(2000) as Promise,\r\n createPosterFromVideo(video),\r\n ]);\r\n}\r\n\r\nexport function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\r\n return new Promise((resolve) => {\r\n if(media.readyState >= readyState) {\r\n resolve();\r\n return;\r\n }\r\n\r\n media.addEventListener(IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay', () => resolve(), {once: true});\r\n });\r\n}\r\n\r\nexport async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\r\n const files: any[] = [];\r\n\r\n const scanFiles = async(entry: any, item: DataTransferItem) => {\r\n if(entry.isDirectory) {\r\n const directoryReader = entry.createReader();\r\n await new Promise((resolve, reject) => {\r\n directoryReader.readEntries(async(entries: any) => {\r\n for(const entry of entries) {\r\n await scanFiles(entry, item);\r\n }\r\n\r\n resolve();\r\n });\r\n });\r\n } else if(entry) {\r\n if(onlyTypes) {\r\n files.push(entry.type);\r\n } else {\r\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\r\n const file = entry instanceof File ? \r\n entry : \r\n (\r\n entry instanceof DataTransferItem ? \r\n entry.getAsFile() : \r\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\r\n );\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got file', item, file);\r\n } */\r\n\r\n if(!file) return;\r\n files.push(file);\r\n }\r\n }\r\n };\r\n\r\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\r\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\r\n const file = e.dataTransfer.files[i];\r\n files.push(onlyTypes ? file.type : file);\r\n }\r\n } else {\r\n // @ts-ignore\r\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\r\n\r\n const promises: Promise[] = [];\r\n for(let i = 0; i < items.length; ++i) {\r\n const item: DataTransferItem = items[i];\r\n if(item.kind === 'file') {\r\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\r\n promises.push(scanFiles(entry, item));\r\n }\r\n }\r\n \r\n await Promise.all(promises);\r\n }\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got files:', e, files);\r\n } */\r\n \r\n return files;\r\n}\r\n\r\nexport function requestFile(accept?: string) {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.style.display = 'none';\r\n\r\n if(accept) {\r\n input.accept = accept;\r\n }\r\n\r\n document.body.append(input);\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n input.addEventListener('change', (e: any) => {\r\n const file: File = e.target.files[0];\r\n if(!file) {\r\n reject('NO_FILE_SELECTED');\r\n return;\r\n }\r\n \r\n resolve(file);\r\n }, {once: true});\r\n }).finally(() => {\r\n input.remove();\r\n });\r\n\r\n input.click();\r\n\r\n return promise;\r\n}\r\n","export default function assumeType(x: unknown): asserts x is T {\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\n// * will change .cleaned and new instance will be created\r\nexport const getMiddleware = () => {\r\n let cleanupObj = {cleaned: false};\r\n return {\r\n clean: () => {\r\n cleanupObj.cleaned = true;\r\n cleanupObj = {cleaned: false};\r\n },\r\n get: () => {\r\n const _cleanupObj = cleanupObj;\r\n return () => {\r\n return !_cleanupObj.cleaned;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { processSearchText, ProcessSearchTextOptions } from '../helpers/cleanSearchText';\n\nexport default class SearchIndex {\n private fullTexts: Map = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n \n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n public search(query: string) {\n const fullTexts = this.fullTexts;\n //const shortIndexes = searchIndex.shortIndexes;\n\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' ')) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n //newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set = new Set(newFoundObjs.map(o => o.what));\n\n /* const queryWords = query.split(' ');\n let foundArr: number[];\n for(let i = 0; i < queryWords.length; i++) {\n const newFound = shortIndexes[queryWords[i].substr(0, 3)];\n if(!newFound) {\n foundArr = [];\n break;\n }\n \n if(foundArr === undefined || foundArr.length > newFound.length) {\n foundArr = newFound;\n }\n }\n\n for(let j = 0; j < foundArr.length; j++) {\n let found = true;\n let searchText = fullTexts[foundArr[j]];\n for(let i = 0; i < queryWords.length; i++) {\n if(searchText.indexOf(queryWords[i]) === -1) {\n found = false;\n break;\n }\n }\n\n if(found) {\n newFoundObjs[foundArr[j]] = true;\n }\n } */\n\n return newFoundObjs2;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// Thanks to https://stackoverflow.com/a/49349813\r\nimport { clamp } from \"../helpers/number\";\r\n\r\n/**\r\n * Attibute modifier to create middle ellipsis\r\n * When the attribute value is left blank the ellipsis will be in the middle\r\n * When positive the attribute value will be used as a percentage\r\n * When negative the attribute value will be used as character index counted from the end\r\n * @example\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n */\r\nconst ellipsis = '…';\r\nconst map: Map = new Map();\r\n\r\nconst testQueue: Set = new Set();\r\nexport const fontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\r\nconst fontSize = '16px';\r\nlet timeoutId: number;\r\n\r\nconst setTestQueue = () => {\r\n cancelAnimationFrame(timeoutId);\r\n timeoutId = window.requestAnimationFrame(testQueueElements);\r\n};\r\n\r\nconst 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\nconst testElement = (element: HTMLElement) => {\r\n //const perf = performance.now();\r\n // do not recalculate variables a second time\r\n let mapped = map.get(element);\r\n const firstTime = !mapped;\r\n\r\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\r\n //console.log('[MEE] testElement got mapped', mapped);\r\n\r\n if(firstTime) {\r\n text = element.textContent;\r\n textLength = text.length;\r\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\r\n multiplier = from > 0 && from / 100;\r\n\r\n //const perf = performance.now();\r\n font = `${element.dataset.fontWeight || 400} ${fontSize} ${fontFamily}`;\r\n /* const computedStyle = window.getComputedStyle(elm, null);\r\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\r\n //console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\r\n\r\n textWidth = getTextWidth(text, font);\r\n //const perf = performance.now();\r\n elementWidth = element.getBoundingClientRect().width;\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 = element.getBoundingClientRect().width;\r\n const widthChanged = firstTime || elementWidth !== newElementWidth;\r\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\r\n \r\n if(widthChanged) {\r\n if(textWidth > elementWidth) {\r\n element.setAttribute('title', text);\r\n let smallerText = text;\r\n let smallerWidth = elementWidth;\r\n while(smallerText.length > 3) {\r\n let smallerTextLength = smallerText.length;\r\n const half = multiplier &&\r\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\r\n Math.max(smallerTextLength + from - 1, 1);\r\n const half1 = smallerText.substr(0, half).replace(/\\s*$/,'');\r\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/,'');\r\n smallerText = half1 + half2;\r\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\r\n if(smallerWidth < elementWidth) {\r\n element.textContent = half1 + ellipsis + half2;\r\n break;\r\n }\r\n }\r\n\r\n // * set new width after cutting text\r\n mapped.elementWidth = element.getBoundingClientRect().width;\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\nlet context: CanvasRenderingContext2D;\r\n/**\r\n * Get the text width\r\n * @param {string} text\r\n * @param {string} font\r\n */\r\nfunction getTextWidth(text: string, font: string) {\r\n //const perf = performance.now();\r\n if(!context) {\r\n const canvas = document.createElement('canvas');\r\n context = canvas.getContext('2d');\r\n context.font = font;\r\n }\r\n\r\n //context.font = font;\r\n const metrics = context.measureText(text);\r\n //console.log('getTextWidth perf:', performance.now() - perf);\r\n return metrics.width;\r\n //return Math.round(metrics.width);\r\n}\r\n\r\nexport class MiddleEllipsisElement extends HTMLElement {\r\n constructor() {\r\n super();\r\n }\r\n\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 testQueue.add(this);\r\n setTestQueue();\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 //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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../rootScope\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport RichTextProcessor from \"../richtextprocessor\";\r\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\r\nimport { MessageEntity, DraftMessage, MessagesSaveDraft } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { deepEqual } from \"../../helpers/object\";\r\nimport { isObject } from \"../mtproto/bin_utils\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\n\r\nexport type MyDraftMessage = DraftMessage.draftMessage;\r\n\r\nexport class AppDraftsManager {\r\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\r\n private getAllDraftPromise: Promise = null;\r\n\r\n constructor() {\r\n stateStorage.get('drafts').then(drafts => {\r\n this.drafts = drafts || {};\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateDraftMessage: (update) => {\r\n const peerID = appPeersManager.getPeerId(update.peer);\r\n this.saveDraft(peerID, update.threadId, update.draft, {notify: true});\r\n }\r\n });\r\n }\r\n\r\n private getKey(peerId: PeerId, threadId?: number) {\r\n return '' + peerId + (threadId ? '_' + threadId : '');\r\n }\r\n\r\n public getDraft(peerId: PeerId, threadId?: number) {\r\n return this.drafts[this.getKey(peerId, threadId)];\r\n }\r\n\r\n public addMissedDialogs() {\r\n return this.getAllDrafts().then(() => {\r\n for(const key in this.drafts) {\r\n if(key.indexOf('_') !== -1) { // exclude threads\r\n continue;\r\n }\r\n\r\n const peerId = key.toPeerId();\r\n const dialog = appMessagesManager.getDialogOnly(peerId);\r\n if(!dialog) {\r\n appMessagesManager.reloadConversation(peerId);\r\n /* const dialog = appMessagesManager.generateDialog(peerId);\r\n dialog.draft = this.drafts[key];\r\n appMessagesManager.saveConversation(dialog);\r\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\r\n appMessagesManager.scheduleHandleNewDialogs(); */\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getAllDrafts() {\r\n return this.getAllDraftPromise || (\r\n this.getAllDraftPromise = apiManager.invokeApi('messages.getAllDrafts')\r\n .then((updates) => {\r\n const p = apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\r\n p.then(() => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n })\r\n );\r\n }\r\n\r\n public saveDraft(peerId: PeerId, threadId: number, apiDraft: DraftMessage, options: Partial<{\r\n notify: boolean,\r\n force: boolean\r\n }> = {}) {\r\n const draft = this.processApiDraft(apiDraft);\r\n\r\n const key = this.getKey(peerId, threadId);\r\n if(draft) {\r\n this.drafts[key] = draft;\r\n } else {\r\n delete this.drafts[key];\r\n }\r\n\r\n stateStorage.set({\r\n drafts: this.drafts\r\n });\r\n\r\n if(options.notify) {\r\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId,\r\n threadId,\r\n draft,\r\n force: options.force\r\n });\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\r\n if(typeof(draft1) !== typeof(draft2)) {\r\n return false;\r\n }\r\n\r\n if(!isObject(draft1)) {\r\n return true;\r\n }\r\n\r\n if(draft1._ !== draft2._) {\r\n return false;\r\n }\r\n \r\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\r\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\r\n return false;\r\n }\r\n \r\n if(!deepEqual(draft1.entities, draft2.entities)) {\r\n return false;\r\n }\r\n \r\n if(draft1.message !== draft2.message) {\r\n return false;\r\n }\r\n \r\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public isEmptyDraft(draft: DraftMessage) {\r\n if(!draft || draft._ === 'draftMessageEmpty') {\r\n return true;\r\n }\r\n \r\n if(draft.reply_to_msg_id > 0) {\r\n return false;\r\n }\r\n \r\n if(!draft.message.length) {\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public processApiDraft(draft: DraftMessage): MyDraftMessage {\r\n if(!draft || draft._ !== 'draftMessage') {\r\n return undefined;\r\n }\r\n\r\n const myEntities = RichTextProcessor.parseEntities(draft.message);\r\n const apiEntities = draft.entities || [];\r\n const totalEntities = RichTextProcessor.mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\r\n\r\n draft.rMessage = RichTextProcessor.wrapDraftText(draft.message, {entities: totalEntities});\r\n //draft.rReply = appMessagesManager.getRichReplyText(draft);\r\n if(draft.reply_to_msg_id) {\r\n draft.reply_to_msg_id = appMessagesIdsManager.generateMessageId(draft.reply_to_msg_id);\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public async syncDraft(peerId: PeerId, threadId: number, localDraft?: MyDraftMessage, saveOnServer = true, force = false) {\r\n // console.warn(dT(), 'sync draft', peerID)\r\n const serverDraft = this.getDraft(peerId, threadId);\r\n if(this.draftsAreEqual(serverDraft, localDraft)) {\r\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\r\n return true;\r\n }\r\n\r\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\r\n let params: MessagesSaveDraft = {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n message: ''\r\n };\r\n\r\n let draftObj: DraftMessage;\r\n if(this.isEmptyDraft(localDraft)) {\r\n draftObj = {_: 'draftMessageEmpty'};\r\n } else {\r\n let message = localDraft.message;\r\n let entities: MessageEntity[] = localDraft.entities;\r\n\r\n if(localDraft.reply_to_msg_id) {\r\n params.reply_to_msg_id = appMessagesIdsManager.getServerMessageId(localDraft.reply_to_msg_id);\r\n }\r\n\r\n if(entities?.length) {\r\n params.entities = appMessagesManager.getInputEntities(entities);\r\n }\r\n\r\n if(localDraft.pFlags.no_webpage) {\r\n params.no_webpage = localDraft.pFlags.no_webpage;\r\n }\r\n\r\n params.message = message;\r\n }\r\n\r\n const saveLocalDraft = draftObj || localDraft;\r\n saveLocalDraft.date = tsNow(true) + serverTimeManager.serverTimeOffset;\r\n\r\n this.saveDraft(peerId, threadId, saveLocalDraft, {notify: true, force});\r\n\r\n if(saveOnServer && !threadId) {\r\n return apiManager.invokeApi('messages.saveDraft', params);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public clearAllDrafts() {\r\n return apiManager.invokeApi('messages.clearAllDrafts').then(bool => {\r\n if(!bool) {\r\n return;\r\n }\r\n\r\n for(const combined in this.drafts) {\r\n const [peerId, threadId] = combined.split('_');\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId: peerId.toPeerId(),\r\n threadId: threadId ? +threadId : undefined,\r\n draft: undefined\r\n });\r\n }\r\n });\r\n }\r\n\r\n public clearDraft(peerId: PeerId, threadId: number) {\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId);\r\n } else {\r\n this.saveDraft(peerId, threadId, null, {notify: true, force: true}); \r\n }\r\n }\r\n\r\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\r\n const draft: DraftMessage.draftMessage = {\r\n _: 'draftMessage',\r\n date: Date.now() / 1000 | 0,\r\n message,\r\n pFlags: {},\r\n entities\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, draft, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, draft, {notify: true, force: true}); \r\n }\r\n }\r\n}\r\n\r\nconst appDraftsManager = new AppDraftsManager();\r\nMOUNT_CLASS_TO.appDraftsManager = appDraftsManager;\r\nexport default appDraftsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sequentialDom from \"../../helpers/sequentialDom\";\nimport { UserProfilePhoto, ChatPhoto, InputFileLocation } from \"../../layer\";\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../mtproto/mtproto_config\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager from \"./appUsersManager\";\n\ntype PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n public isAvatarCached(peerId: PeerId) {\n return !!this.savedAvatarURLs[peerId];\n }\n \n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n\n let cached = false;\n let getAvatarPromise: Promise;\n let saved = this.savedAvatarURLs[peerId];\n if(!saved || !saved[size]) {\n if(!saved) {\n saved = this.savedAvatarURLs[peerId] = {};\n }\n\n //console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation', \n pFlags: {},\n peer: inputPeer, \n photo_id: photo.photo_id\n };\n\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n }\n\n const downloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = appDownloadManager.download(downloadOptions);\n getAvatarPromise = saved[size] = promise.then(blob => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else if(typeof(saved[size]) !== 'string') {\n getAvatarPromise = saved[size] as Promise;\n } else {\n getAvatarPromise = Promise.resolve(saved[size]);\n cached = true;\n }\n\n return {cached, loadPromise: getAvatarPromise};\n }\n\n public putAvatar(\n div: HTMLElement, \n peerId: PeerId, \n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, \n size: PeerPhotoSize, \n img = new Image(), \n onlyThumb = false\n ) {\n let {cached, loadPromise} = this.loadAvatar(peerId, photo, size);\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n if(size === 'photo_big') { // let's load small photo first\n const res = this.putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = appPhotosManager.getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n \n if(animate) {\n img.classList.remove('fade-in');\n }\n\n if(thumbImage) {\n thumbImage.remove();\n }\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , false */))\n .then(callback);\n\n return {\n cached, \n loadPromise: renderThumbPromise || renderPromise,\n thumbImage\n };\n }\n\n public s(div: HTMLElement, innerHTML: string, color: string, icon: string) {\n div.innerHTML = innerHTML;\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled');\n icon && div.classList.add(icon);\n }\n\n // peerId === peerId || title\n public putPhoto(div: HTMLElement, peerId: PeerId, isDialog = false, title = '', onlyThumb = false) {\n const myId = rootScope.myId;\n \n //console.log('loadDialogPhoto location:', location, inputPeer);\n if(peerId === myId && isDialog) {\n this.s(div, '', '', 'tgico-saved');\n return;\n }\n \n if(peerId !== NULL_PEER_ID && peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.pFlags && user.pFlags.deleted) {\n this.s(div, '', appPeersManager.getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n }\n \n const photo = appPeersManager.getPeerPhoto(peerId);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !this.savedAvatarURLs[peerId]) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = appPeersManager.getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n this.s(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n let abbr: string;\n if(!title) {\n const peer = appPeersManager.getPeer(peerId);\n abbr = peer.initials ?? '';\n } else {\n abbr = RichTextProcessor.getAbbreviation(title);\n }\n\n this.s(div, abbr, color, '');\n //return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const size: PeerPhotoSize = 'photo_small';\n return this.putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n }\n }\n}\n\nconst appAvatarsManager = new AppAvatarsManager();\nexport default appAvatarsManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * 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 Config from \"../lib/config\";\n\nconst badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = Config.LatinizeMap[ch];\n return latinizeCh !== undefined ? latinizeCh : ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n const hasTag = text.charAt(0) === '%';\n text = clearBadCharsAndTrim(text);\n if(latinize) text = latinizeString(text);\n \n text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n\n return text;\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n return text;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n/**\r\n * Descend sorted storage\r\n */\r\n\r\ntype ItemType = number;\r\n\r\nexport enum SliceEnd {\r\n None = 0,\r\n Top = 1,\r\n Bottom = 2,\r\n Both = SliceEnd.Top | SliceEnd.Bottom\r\n};\r\n\r\nexport interface Slice extends Array {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd;\r\n\r\n isEnd: (side: SliceEnd) => boolean;\r\n setEnd: (side: SliceEnd) => void;\r\n unsetEnd: (side: SliceEnd) => void;\r\n\r\n slice: (from?: number, to?: number) => Slice;\r\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice;\r\n}\r\n\r\nexport interface SliceConstructor {\r\n new(...items: ItemType[]): Slice;\r\n}\r\n\r\nexport default class SlicedArray {\r\n private slices: Slice[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\r\n private sliceConstructor: SliceConstructor;\r\n \r\n constructor() {\r\n // @ts-ignore\r\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\r\n\r\n const first = this.constructSlice();\r\n //first.setEnd(SliceEnd.Bottom);\r\n this.slices = [first];\r\n }\r\n\r\n private static getSliceConstructor(slicedArray: SlicedArray) {\r\n return class Slice extends Array implements Slice {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd = SliceEnd.None;\r\n \r\n /* constructor(...items: ItemType[]) {\r\n super(...items);\r\n //this.slicedArray = slicedArray;\r\n } */\r\n \r\n isEnd(side: SliceEnd): boolean {\r\n if((this.end & side) === side) {\r\n return true;\r\n }/* else if(!this.slicedArray) {\r\n return false;\r\n } */\r\n \r\n let isEnd = false;\r\n if(side === SliceEnd.Top) {\r\n const slice = slicedArray.last;\r\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Bottom) {\r\n const slice = slicedArray.first;\r\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Both) {\r\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\r\n }\r\n\r\n if(isEnd) {\r\n this.setEnd(side);\r\n }\r\n \r\n return isEnd;\r\n }\r\n \r\n setEnd(side: SliceEnd) {\r\n this.end |= side;\r\n }\r\n\r\n unsetEnd(side: SliceEnd) {\r\n this.end ^= side;\r\n }\r\n\r\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\r\n const ret = super.splice(start, deleteCount, ...items);\r\n\r\n if(!this.length) {\r\n const slices = slicedArray.slices as number[][];\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: ItemType[]) {\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: ItemType[], 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(slice[0] > s[0]) {\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: ItemType) {\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: number) {\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(maxId >= slice[offset]) {\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: number, add_offset: number, limit: number) {\r\n let slice = this.slice;\r\n let offset = 0;\r\n let sliceOffset = 0;\r\n\r\n if(offsetId) {\r\n const pos = this.findSliceOffset(offsetId);\r\n if(!pos) {\r\n return undefined;\r\n }\r\n\r\n slice = pos.slice;\r\n offset = sliceOffset = pos.offset;\r\n\r\n if(slice.includes(offsetId)) {\r\n sliceOffset += 1;\r\n }\r\n\r\n /* if(slice.includes(offsetId) && add_offset < 0) {\r\n add_offset += 1;\r\n } */\r\n }\r\n\r\n let sliceStart = Math.max(sliceOffset + add_offset, 0);\r\n let sliceEnd = sliceOffset + add_offset + limit;\r\n //const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\r\n //sliceEnd += fixHalfBackLimit;\r\n\r\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice;\r\n\r\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\r\n const bottomWasMeantToLoad = Math.abs(add_offset);\r\n\r\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\r\n // useful when there is only 1 message in chat on its reopening\r\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\r\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\r\n\r\n //console.log('sliceMe', topFulfilled, bottomFulfilled);\r\n\r\n return {\r\n slice: sliced, \r\n offsetIdOffset: offset,\r\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\r\n };\r\n }\r\n\r\n public unshift(...items: ItemType[]) {\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: ItemType[]) {\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: ItemType) {\r\n const found = this.findSlice(item);\r\n if(found) {\r\n found.slice.splice(found.index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { copy } from \"../../helpers/object\";\r\nimport { InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults } from \"../../layer\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport appMessagesManager from './appMessagesManager';\r\nimport appPeersManager from './appPeersManager';\r\nimport appUsersManager from \"./appUsersManager\";\r\n\r\nexport class AppPollsManager {\r\n public polls: {[id: string]: Poll} = {};\r\n public results: {[id: string]: PollResults} = {};\r\n public pollToMessages: {[id: string]: Set} = {};\r\n\r\n private log = logger('POLLS', LogTypes.Error);\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateMessagePoll: (update) => {\r\n this.log('updateMessagePoll:', update);\r\n\r\n let poll: Poll = update.poll || this.polls[update.poll_id];\r\n if(!poll) {\r\n return;\r\n }\r\n\r\n let results = update.results;\r\n const ret = this.savePoll(poll, results as any);\r\n poll = ret.poll;\r\n results = ret.results;\r\n \r\n rootScope.dispatchEvent('poll_update', {poll, results: results as any});\r\n }\r\n });\r\n }\r\n\r\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\r\n if(message) {\r\n this.updatePollToMessage(message, true);\r\n }\r\n\r\n const id = poll.id;\r\n if(this.polls[id]) {\r\n poll = Object.assign(this.polls[id], poll);\r\n results = this.saveResults(poll, results);\r\n } else {\r\n this.polls[id] = poll;\r\n\r\n poll.rQuestion = RichTextProcessor.wrapEmojiText(poll.question);\r\n poll.rReply = RichTextProcessor.wrapEmojiText('📊') + ' ' + (poll.rQuestion || 'poll');\r\n poll.chosenIndexes = [];\r\n results = this.saveResults(poll, results);\r\n }\r\n\r\n return {poll, results};\r\n }\r\n\r\n public saveResults(poll: Poll, results: PollResults) {\r\n if(this.results[poll.id]) {\r\n results = Object.assign(this.results[poll.id], results);\r\n } else {\r\n this.results[poll.id] = results;\r\n }\r\n\r\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\r\n poll.chosenIndexes.length = 0;\r\n if(results?.results?.length) {\r\n results.results.forEach((answer, idx) => {\r\n if(answer.pFlags?.chosen) {\r\n poll.chosenIndexes.push(idx);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n public getPoll(pollId: string): {poll: Poll, results: PollResults} {\r\n return {\r\n poll: this.polls[pollId], \r\n results: this.results[pollId]\r\n };\r\n }\r\n\r\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\r\n if(solution) {\r\n if(!solutionEntities) {\r\n solutionEntities = [];\r\n }\r\n\r\n solution = RichTextProcessor.parseMarkdown(solution, solutionEntities);\r\n } else {\r\n solution = undefined; // can be string here\r\n }\r\n\r\n return {\r\n _: 'inputMediaPoll',\r\n poll,\r\n correct_answers: correctAnswers,\r\n solution,\r\n solution_entities: solution ? solutionEntities : undefined\r\n };\r\n }\r\n\r\n public updatePollToMessage(message: Message.message, add: boolean) {\r\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\r\n let set = this.pollToMessages[id];\r\n \r\n if(!add && !set) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = this.pollToMessages[id] = new Set();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n if(add) set.add(key);\r\n else set.delete(key);\r\n\r\n if(!add && !set.size) {\r\n delete this.polls[id];\r\n delete this.results[id];\r\n delete this.pollToMessages[id];\r\n }\r\n }\r\n\r\n public sendVote(message: any, optionIds: number[]): Promise {\r\n const poll: Poll = message.media.poll;\r\n\r\n const options: Uint8Array[] = optionIds.map(index => {\r\n return poll.answers[index].option;\r\n });\r\n \r\n const messageId = message.mid;\r\n const peerId = message.peerId;\r\n const inputPeer = appPeersManager.getInputPeerById(peerId);\r\n\r\n if(message.pFlags.is_outgoing) {\r\n return appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\r\n this.log('invoke sendVote callback');\r\n return this.sendVote(message, optionIds);\r\n });\r\n }\r\n\r\n return apiManager.invokeApi('messages.sendVote', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n options\r\n }).then(updates => {\r\n this.log('sendVote updates:', updates);\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getResults(message: any) {\r\n const inputPeer = appPeersManager.getInputPeerById(message.peerId);\r\n\r\n return apiManager.invokeApi('messages.getPollResults', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid)\r\n }).then(updates => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n this.log('getResults updates:', updates);\r\n });\r\n }\r\n\r\n public getVotes(message: any, option?: Uint8Array, offset?: string, limit = 20) {\r\n return apiManager.invokeApi('messages.getPollVotes', {\r\n peer: appPeersManager.getInputPeerById(message.peerId),\r\n id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n option,\r\n offset,\r\n limit\r\n }).then((votesList) => {\r\n this.log('getPollVotes messages:', votesList);\r\n\r\n appUsersManager.saveApiUsers(votesList.users);\r\n\r\n return votesList;\r\n });\r\n }\r\n\r\n public stopPoll(message: any) {\r\n const poll: Poll = message.media.poll;\r\n \r\n if(poll.pFlags.closed) return Promise.resolve();\r\n\r\n const newPoll = copy(poll);\r\n newPoll.pFlags.closed = true;\r\n return appMessagesManager.editMessage(message, undefined, {\r\n newMedia: this.getInputMediaPoll(newPoll)\r\n }).then(() => {\r\n //console.log('stopped poll');\r\n }, err => {\r\n this.log.error('stopPoll error:', err);\r\n });\r\n }\r\n}\r\n\r\nconst appPollsManager = new AppPollsManager();\r\nMOUNT_CLASS_TO.appPollsManager = appPollsManager;\r\nexport default appPollsManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\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, deferredPromise } from \"./cancellablePromise\";\r\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf } from \"./schedulers\";\r\n\r\ntype HeavyQueue = {\r\n items: any[], \r\n process: (...args: any[]) => T,\r\n context: any,\r\n promise?: CancellablePromise['process']>[]>\r\n};\r\nconst heavyQueue: HeavyQueue[] = [];\r\nlet processingQueue = false;\r\n\r\nexport default function addHeavyTask(queue: HeavyQueue, method: 'push' | 'unshift' = 'push') {\r\n if(!queue.items.length) {\r\n return Promise.resolve([]);\r\n }\r\n \r\n queue.promise = deferredPromise();\r\n heavyQueue[method](queue);\r\n processHeavyQueue();\r\n\r\n return queue.promise;\r\n}\r\n\r\nfunction processHeavyQueue() {\r\n if(!processingQueue) {\r\n const queue = heavyQueue.shift();\r\n timedChunk(queue).finally(() => {\r\n processingQueue = false;\r\n if(heavyQueue.length) {\r\n processHeavyQueue();\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction timedChunk(queue: HeavyQueue) {\r\n if(!queue.items.length) {\r\n queue.promise.resolve([]);\r\n return Promise.resolve([]);\r\n }\r\n\r\n const todo = queue.items.slice();\r\n const results: T[] = [];\r\n\r\n return new Promise((resolve, reject) => {\r\n const f = async() => {\r\n const start = performance.now();\r\n\r\n do {\r\n await getHeavyAnimationPromise();\r\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\r\n let realResult: T;\r\n if(possiblePromise instanceof Promise) {\r\n try {\r\n realResult = await possiblePromise;\r\n } catch(err) {\r\n reject(err);\r\n return;\r\n }\r\n } else {\r\n realResult = possiblePromise;\r\n }\r\n\r\n results.push(realResult);\r\n } while(todo.length > 0 && (performance.now() - start) < 6);\r\n\r\n if(todo.length > 0) {\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n } else {\r\n resolve(results);\r\n }\r\n };\r\n\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n }).then(queue.promise.resolve, queue.promise.reject);\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type fastBlur from '../vendor/fastBlur';\r\nimport addHeavyTask from './heavyQueue';\r\n\r\nconst RADIUS = 2;\r\nconst ITERATIONS = 2;\r\n\r\nconst isFilterAvailable = 'filter' in (document.createElement('canvas').getContext('2d') || {});\r\nlet requireBlurPromise: Promise;\r\nlet fastBlurFunc: typeof fastBlur;\r\nif(!isFilterAvailable) {\r\n requireBlurPromise = import('../vendor/fastBlur').then(m => {\r\n fastBlurFunc = m.default;\r\n });\r\n} else {\r\n requireBlurPromise = Promise.resolve();\r\n}\r\n\r\nfunction processBlurNext(img: HTMLImageElement, radius: number, iterations: number) {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n \r\n const ctx = canvas.getContext('2d', {alpha: false});\r\n if(isFilterAvailable) {\r\n ctx.filter = `blur(${radius}px)`;\r\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\r\n } else {\r\n ctx.drawImage(img, 0, 0);\r\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\r\n }\r\n \r\n resolve(canvas.toDataURL());\r\n /* if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n } */\r\n\r\n /* canvas.toBlob(blob => {\r\n resolve(URL.createObjectURL(blob));\r\n \r\n if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n }\r\n }); */\r\n });\r\n}\r\n\r\nconst blurPromises: Map> = new Map();\r\nconst CACHE_SIZE = 1000;\r\n\r\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\r\n if(!dataUri) {\r\n console.error('no dataUri for blur', dataUri);\r\n return Promise.resolve(dataUri);\r\n }\r\n\r\n if(blurPromises.size > CACHE_SIZE) {\r\n blurPromises.clear();\r\n }\r\n \r\n if(blurPromises.has(dataUri)) return blurPromises.get(dataUri);\r\n const promise = new Promise((resolve) => {\r\n //return resolve(dataUri);\r\n requireBlurPromise.then(() => {\r\n const img = new Image();\r\n img.onload = () => {\r\n if(isFilterAvailable) {\r\n processBlurNext(img, radius, iterations).then(resolve);\r\n } else {\r\n addHeavyTask({\r\n items: [[img, radius, iterations]],\r\n context: null,\r\n process: processBlurNext\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n });\r\n }\r\n };\r\n img.src = dataUri;\r\n\r\n /* addHeavyTask({\r\n items: [[dataUri, radius, iterations]],\r\n context: null,\r\n process: processBlur\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n }); */\r\n });\r\n });\r\n\r\n blurPromises.set(dataUri, promise);\r\n\r\n return promise;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { RefreshReferenceTask, RefreshReferenceTaskResponse } from \"./apiFileManager\";\nimport appMessagesManager from \"../appManagers/appMessagesManager\";\nimport { Photo } from \"../../layer\";\nimport { bytesToHex } from \"../../helpers/bytes\";\nimport { deepEqual } from \"../../helpers/object\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport apiManager from \"./mtprotoworker\";\nimport assumeType from \"../../helpers/assumeType\";\nimport { logger } from \"../logger\";\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage;\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\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n//type ReferenceBytes = Uint8Array;\n\nclass ReferenceDatabase {\n private contexts: Map = new Map();\n //private references: Map = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n\n constructor() {\n apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n const originalPayload = task.payload;\n\n assumeType(task);\n task.originalPayload = originalPayload;\n\n this.refreshReference(originalPayload).then((bytes) => {\n task.payload = bytes;\n }, (err) => {\n task.error = err;\n }).then(() => apiManager.postMessage(task));\n });\n }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n \n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise;\n switch(context?.type) {\n case 'message': {\n promise = appMessagesManager.wrapSingleMessage(context.peerId, context.messageId, true);\n break; \n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n default: {\n this.log.warn('refreshReference: not implemented context', context);\n return Promise.reject();\n }\n }\n\n const hex = bytesToHex(reference);\n this.log('refreshReference: refreshing reference:', hex);\n return promise.then(() => {\n const newHex = bytesToHex(reference);\n this.log('refreshReference: refreshed, reference before:', hex, 'after:', newHex);\n if(hex !== newHex) {\n return reference;\n }\n\n this.deleteContext(reference, context);\n\n const newContext = this.getContext(reference);\n if(newContext) {\n return this.refreshReference(reference, newContext[0]);\n }\n\n this.log.error('refreshReference: no new context, reference before:', hex, 'after:', newHex, context);\n\n throw 'NO_NEW_CONTEXT';\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n\nconst referenceDatabase = new ReferenceDatabase();\nMOUNT_CLASS_TO.referenceDatabase = referenceDatabase;\nexport default referenceDatabase;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToDocumentFragment(html: string) {\r\n var template = document.createElement('template');\r\n html = html.trim(); // Never return a text node of whitespace as the result\r\n template.innerHTML = html;\r\n return template.content;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { logger, LogTypes } from \"./logger\";\r\n\r\ntype Result = {\r\n bytes: Uint8Array, \r\n waveform?: Uint8Array\r\n};\r\n\r\ntype Task = {\r\n pages: Uint8Array,\r\n withWaveform: boolean,\r\n waveform?: Uint8Array,\r\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\r\n timeout: number\r\n};\r\n\r\nexport class OpusDecodeController {\r\n private worker: Worker;\r\n private wavWorker : Worker;\r\n private sampleRate = 48000;\r\n private tasks: Array = [];\r\n private keepAlive = false;\r\n private isPlaySupportedResult: boolean;\r\n private log = logger('OPUS', LogTypes.Error);\r\n\r\n public isPlaySupported() {\r\n if(this.isPlaySupportedResult !== undefined) return this.isPlaySupportedResult;\r\n\r\n const audio = document.createElement('audio');\r\n return this.isPlaySupportedResult = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\r\n }\r\n\r\n public loadWavWorker() {\r\n if(this.wavWorker) return;\r\n\r\n this.wavWorker = new Worker('waveWorker.min.js');\r\n this.wavWorker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n\r\n this.log('[WAV] got message:', data);\r\n if(data && data.page) {\r\n const bytes = data.page;\r\n this.onTaskEnd(this.tasks.shift(), bytes);\r\n }\r\n });\r\n }\r\n\r\n public loadWorker() {\r\n if(this.worker) return;\r\n\r\n this.worker = new Worker('decoderWorker.min.js');\r\n this.worker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n \r\n this.log('[DECODER] got message', data);\r\n if(data.type === 'done') {\r\n //this.log('[DECODER] send done to wav');\r\n this.wavWorker.postMessage({command: 'done'});\r\n\r\n if(data.waveform) {\r\n this.tasks[0].waveform = data.waveform;\r\n }\r\n } else { // e.data contains decoded buffers as float32 values\r\n //this.log('[DECODER] send encode to wav');\r\n this.wavWorker.postMessage({\r\n command: 'encode',\r\n buffers: e.data\r\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\r\n }\r\n });\r\n }\r\n\r\n public setKeepAlive(keepAlive: boolean) {\r\n this.keepAlive = keepAlive;\r\n if(this.keepAlive) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n } else if(!this.tasks.length) {\r\n this.terminateWorkers();\r\n }\r\n }\r\n\r\n public onTaskEnd(task: Task, result?: Uint8Array) {\r\n if(!result) {\r\n task.callback.reject('timeout');\r\n } else {\r\n clearTimeout(task.timeout);\r\n task.callback.resolve({bytes: result, waveform: task.waveform});\r\n }\r\n\r\n if(this.tasks.length) {\r\n this.executeNewTask(this.tasks[0]);\r\n }\r\n\r\n this.terminateWorkers();\r\n }\r\n\r\n public terminateWorkers(kill = false) {\r\n if((this.keepAlive || this.tasks.length) && !kill) return;\r\n\r\n if(this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n }\r\n \r\n if(this.wavWorker) {\r\n this.wavWorker.terminate();\r\n this.wavWorker = null;\r\n }\r\n }\r\n\r\n public executeNewTask(task: Task) {\r\n this.worker.postMessage({ \r\n command: 'init',\r\n decoderSampleRate: this.sampleRate,\r\n outputBufferSampleRate: this.sampleRate\r\n });\r\n\r\n this.wavWorker.postMessage({ \r\n command: 'init',\r\n wavBitDepth: 16,\r\n wavSampleRate: this.sampleRate\r\n });\r\n\r\n //console.log('sending command to worker:', task);\r\n //setTimeout(() => {\r\n this.log('[DECODER] send decode');\r\n this.worker.postMessage({\r\n command: 'decode',\r\n pages: task.pages,\r\n waveform: task.withWaveform\r\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\r\n //}, 1e3);\r\n\r\n task.timeout = window.setTimeout(() => {\r\n this.log.error('decode timeout'/* , task */);\r\n\r\n this.terminateWorkers(true);\r\n if(this.tasks.length) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n }\r\n\r\n this.onTaskEnd(this.tasks.shift());\r\n }, 10e3);\r\n }\r\n\r\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\r\n return new Promise((resolve, reject) => {\r\n const task = {\r\n pages,\r\n withWaveform,\r\n callback: {resolve, reject},\r\n timeout: 0\r\n };\r\n\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n\r\n if(this.tasks.push(task) === 1) {\r\n this.executeNewTask(task);\r\n }\r\n });\r\n }\r\n\r\n public async decode(typedArray: Uint8Array, withWaveform = false) {\r\n return this.pushDecodeTask(typedArray, withWaveform).then(result => {\r\n const dataBlob = new Blob([result.bytes], {type: \"audio/wav\"});\r\n return {url: URL.createObjectURL(dataBlob), waveform: result.waveform};\r\n });\r\n }\r\n}\r\n\r\nconst opusDecodeController = new OpusDecodeController();\r\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\r\nexport default opusDecodeController;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport appPhotosManager from \"./appPhotosManager\";\r\nimport appDocsManager from \"./appDocsManager\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\r\nimport rootScope from \"../rootScope\";\r\nimport { safeReplaceObject } from \"../../helpers/object\";\r\nimport { limitSymbols } from \"../../helpers/string\";\r\nimport { WebPage } from \"../../layer\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\r\n\r\ntype WebPageMessageKey = `${PeerId}_${number}`;\r\n\r\nexport class AppWebPagesManager {\r\n private webpages: {\r\n [webPageId: string]: WebPage\r\n } = {};\r\n private pendingWebPages: {\r\n [webPageId: string]: Set\r\n } = {};\r\n \r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateWebPage: (update) => {\r\n this.saveWebPage(update.webpage);\r\n }\r\n });\r\n }\r\n \r\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\r\n if(apiWebPage._ === 'webPageNotModified') return;\r\n const {id} = apiWebPage;\r\n\r\n const oldWebPage = this.webpages[id];\r\n const isUpdated = oldWebPage && \r\n oldWebPage._ === apiWebPage._ && \r\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\r\n\r\n if(apiWebPage._ === 'webPage') {\r\n if(apiWebPage.photo?._ === 'photo') {\r\n apiWebPage.photo = appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\r\n } else {\r\n delete apiWebPage.photo;\r\n }\r\n \r\n if(apiWebPage.document?._ === 'document') {\r\n apiWebPage.document = appDocsManager.saveDoc(apiWebPage.document, mediaContext);\r\n } else {\r\n if(apiWebPage.type === 'document') {\r\n delete apiWebPage.type;\r\n }\r\n \r\n delete apiWebPage.document;\r\n }\r\n\r\n const siteName = apiWebPage.site_name;\r\n let shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\r\n if(siteName && shortTitle === siteName) {\r\n delete apiWebPage.site_name;\r\n }\r\n\r\n shortTitle = limitSymbols(shortTitle, 80, 100);\r\n\r\n apiWebPage.rTitle = RichTextProcessor.wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\r\n let contextHashtag = '';\r\n if(siteName === 'GitHub') {\r\n const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\r\n if(matches) {\r\n contextHashtag = matches[0] + '/issues/{1}';\r\n }\r\n }\r\n\r\n // delete apiWebPage.description\r\n const shortDescriptionText = limitSymbols(apiWebPage.description || '', 150, 180);\r\n apiWebPage.rDescription = RichTextProcessor.wrapRichText(shortDescriptionText, {\r\n contextSite: siteName || 'external',\r\n contextHashtag: contextHashtag\r\n });\r\n\r\n if(!photoTypeSet.has(apiWebPage.type) &&\r\n !apiWebPage.description &&\r\n apiWebPage.photo) {\r\n apiWebPage.type = 'photo';\r\n }\r\n }\r\n \r\n let pendingSet = this.pendingWebPages[id];\r\n if(messageKey) {\r\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\r\n pendingSet.add(messageKey);\r\n }\r\n \r\n if(oldWebPage === undefined) {\r\n this.webpages[id] = apiWebPage;\r\n } else {\r\n safeReplaceObject(oldWebPage, apiWebPage);\r\n }\r\n \r\n if(!messageKey && pendingSet !== undefined && isUpdated) {\r\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\r\n pendingSet.forEach((value) => {\r\n const [peerId, mid, isScheduled] = value.split('_');\r\n msgs.push({\r\n peerId: peerId.toPeerId(), \r\n mid: +mid, \r\n isScheduled: !!isScheduled\r\n });\r\n });\r\n\r\n rootScope.dispatchEvent('webpage_updated', {\r\n id,\r\n msgs\r\n });\r\n }\r\n\r\n return apiWebPage;\r\n }\r\n\r\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\r\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\r\n }\r\n\r\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\r\n const id = (webPage as WebPage.webPage).id;\r\n if(!id) return;\r\n\r\n const set = this.pendingWebPages[id];\r\n if(set && set.has(messageKey)) {\r\n set.delete(messageKey);\r\n\r\n if(!set.size) {\r\n delete this.pendingWebPages[id];\r\n }\r\n }\r\n }\r\n\r\n public getWebPage(id: WebPage.webPage['id']) {\r\n return this.webpages[id];\r\n }\r\n}\r\n\r\nconst appWebPagesManager = new AppWebPagesManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appWebPagesManager = appWebPagesManager);\r\nexport default appWebPagesManager;\r\n","import IS_WEBP_SUPPORTED from \"./webpSupport\";\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","'use strict'\n//@flow\n\n/** * * * * * * * * * *\n * Big Integer Library *\n * Created 2000 *\n * Leemon Baird *\n * www.leemon.com *\n * * * * * * * * * * * */\n\n////////////////////////////////////////////////////////////////////////////////////////\n// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.\n// For most functions, if it needs a BigInt as a local variable it will actually use\n// a global, and will only allocate to it only when it's not the right size. This ensures\n// that when a function is called repeatedly with same-sized parameters, it only allocates\n// memory on the first call.\n//\n// Note that for cryptographic purposes, the calls to Math.random() must\n// be replaced with calls to a better pseudorandom number generator.\n//\n// In the following, \"bigInt\" means a bigInt with at least one leading zero element,\n// and \"integer\" means a nonnegative integer less than radix. In some cases, integer\n// can be negative. Negative bigInts are 2s complement.\n//\n// The following functions do not modify their inputs.\n// Those returning a bigInt, string, or Array will dynamically allocate memory for that value.\n// Those returning a boolean will return the integer 0 (false) or 1 (true).\n// Those returning boolean or int will not allocate memory except possibly on the first\n// time they're called with a given parameter size.\n//\n// bigInt add(x,y) //return (x+y) for bigInts x and y.\n// bigInt addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.\n// string bigInt2str(x,base) //return a string form of bigInt x in a given base, with 2 <= base <= 95\n// int bitSize(x) //return how many bits long the bigInt x is, not counting leading zeros\n// bigInt dup(x) //return a copy of bigInt x\n// boolean equals(x,y) //is the bigInt x equal to the bigint y?\n// boolean equalsInt(x,y) //is bigint x equal to integer y?\n// bigInt expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed\n// Array findPrimes(n) //return array of all primes less than integer n\n// bigInt GCD(x,y) //return greatest common divisor of bigInts x and y (each with same number of elements).\n// boolean greater(x,y) //is x>y? (x and y are nonnegative bigInts)\n// boolean greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?\n// bigInt int2bigInt(t,n,m) //return a bigInt equal to integer t, with at least n bits and m array elements\n// bigInt inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null\n// int inverseModInt(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse\n// boolean isZero(x) //is the bigInt x equal to zero?\n// boolean millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is bigInt, 1=1). If s=1, then the most significant of those n bits is set to 1.\n// bigInt randTruePrime(k) //return a new, random, k-bit, true prime bigInt using Maurer's algorithm.\n// bigInt randProbPrime(k) //return a new, random, k-bit, probable prime bigInt (probability it's composite less than 2^-80).\n// bigInt str2bigInt(s,b,n,m) //return a bigInt for number represented in string s in base b with at least n bits and m array elements\n// bigInt sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement\n// bigInt trim(x,k) //return a copy of x with exactly k leading zero elements\n//\n//\n// The following functions each have a non-underscored version, which most users should call instead.\n// These functions each write to a single parameter, and the caller is responsible for ensuring the array\n// passed in is large enough to hold the result.\n//\n// void addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer\n// void add_(x,y) //do x=x+y for bigInts x and y\n// void copy_(x,y) //do x=y on bigInts x and y\n// void copyInt_(x,n) //do x=n on bigInt x and integer n\n// void GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). (This never overflows its array).\n// boolean inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist\n// void mod_(x,n) //do x=x mod n for bigInts x and n. (This never overflows its array).\n// void mult_(x,y) //do x=x*y for bigInts x and y.\n// void multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.\n// void powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.\n// void randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.\n// void randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.\n// void sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.\n//\n// The following functions do NOT have a non-underscored version.\n// They each write a bigInt result to one or more parameters. The caller is responsible for\n// ensuring the arrays passed in are large enough to hold the results.\n//\n// void addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))\n// void carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.\n// void divide_(x,y,q,r) //divide x by y giving quotient q and remainder r\n// int divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder. (This never overflows its array).\n// void eGCD_(x,y,d,a,b) //sets a,b,d to positive bigInts such that d = GCD_(x,y) = a*x-b*y\n// void halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement. (This never overflows its array).\n// void leftShift_(x,n) //left shift bigInt x by n bits. n64 multiplier, but not with JavaScript's 32*32->32)\n// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square\n// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that\n// method would be slower. This is unfortunate because the code currently spends almost all of its time\n// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring\n// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded\n// sentences that seem to imply it's faster to do a non-modular square followed by a single\n// Montgomery reduction, but that's obviously wrong.\n////////////////////////////////////////////////////////////////////////////////////////\n\nexport type Bool = 1 | 0\n\n//globals\nexport var bpe = 0 //bits stored per array element\nvar mask = 0 //AND this with an array element to chop it down to bpe bits\nvar radix = mask + 1 //equals 2^bpe. A single 1 bit to the left of the last bit of mask.\n\n//the digits for converting to different bases\nvar digitsStr =\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\\\\'\"+-'\n\n//initialize the global variables\n\n//bpe=number of bits in the mantissa on this platform\nfor (bpe = 0; 1 << (bpe + 1) > 1 << bpe; bpe++);\nbpe >>= 1 //bpe=number of bits in one element of the array representing the bigInt\nmask = (1 << bpe) - 1 //AND the mask with an integer to get its bpe least significant bits\nradix = mask + 1 //2^bpe. a single 1 bit to the left of the first bit of mask\nexport var one = int2bigInt(1, 1, 1) //constant used in powMod_()\nexport var zero = int2bigInt(0, 1, 1)\n\n//the following global variables are scratchpad memory to\n//reduce dynamic memory allocation in the inner loop\nvar t: number[] | number = new Array(0)\nvar ss = t //used in mult_()\nvar s0 = t //used in multMod_(), squareMod_()\n// var s1=t; //used in powMod_(), multMod_(), squareMod_()\n// var s2=t; //used in powMod_(), multMod_()\nvar s3 = t //used in powMod_()\nvar s4 = t,\n s5 = t //used in mod_()\nvar s6 = t //used in bigInt2str()\nvar s7 = t //used in powMod_()\nvar T = t //used in GCD_()\nvar sa = t //used in mont_()\nvar mr_x1 = t,\n mr_r = t,\n mr_a = t, //used in millerRabin()\n eg_v = t,\n eg_u = t,\n eg_A = t,\n eg_B = t,\n eg_C = t,\n eg_D = t, //used in eGCD_(), inverseMod_()\n //, md_q1=t, md_q2=t, md_q3=t, md_r=t, md_r1=t, md_r2=t, md_tt=t, //used in mod_()\n\n primes = t,\n pows = t,\n s_i = t,\n s_i2 = t,\n s_R = t,\n s_rm = t,\n s_q = t,\n s_n1 = t,\n s_a = t,\n s_r2 = t,\n s_n = t,\n s_b = t,\n s_d = t,\n s_x1 = t,\n s_x2 = t,\n s_aa = t, //used in randTruePrime_()\n rpprb = t //used in randProbPrimeRounds() (which also uses \"primes\")\n\n////////////////////////////////////////////////////////////////////////////////////////\n\nvar k, buff\n\n/**\n * return array of all primes less than integer n\n *\n * @param {number} n\n * @returns {number[]}\n */\nexport function findPrimes(n: number): number[] {\n var i, s, p, ans\n s = new Array(n)\n for (i = 0; i < n; i++) s[i] = 0\n s[0] = 2\n p = 0 //first p elements of s are primes, the rest are a sieve\n for (; s[p] < n; ) {\n //s[p] is the pth prime\n for (\n i = s[p] * s[p];\n i < n;\n i += s[p] //mark multiples of s[p]\n )\n s[i] = 1\n p++\n s[p] = s[p - 1] + 1\n for (; s[p] < n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)\n }\n ans = new Array(p)\n for (i = 0; i < p; i++) ans[i] = s[i]\n return ans\n}\n\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x is a bigInt, and b is an integer, with b 0; j--);\n for (z = 0, w = x[j]; w; w >>= 1, z++);\n z += bpe * j\n return z\n}\n\n/**\n * return a copy of x with at least n elements, adding leading zeros if needed\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\nexport function expand(x: number[], n: number): number[] {\n var ans = int2bigInt(0, (x.length > n ? x.length : n) * bpe, 0)\n copy_(ans, x)\n return ans\n}\n\n/**\n * return a k-bit true random prime using Maurer's algorithm.\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randTruePrime(k: number): number[] {\n var ans = int2bigInt(0, k, 0)\n randTruePrime_(ans, k)\n return trim(ans, 1)\n} */\n\n/**\n * return a k-bit random probable prime with probability of error < 2^-80\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randProbPrime(k: number): number[] {\n if (k >= 600) return randProbPrimeRounds(k, 2) //numbers from HAC table 4.3\n if (k >= 550) return randProbPrimeRounds(k, 4)\n if (k >= 500) return randProbPrimeRounds(k, 5)\n if (k >= 400) return randProbPrimeRounds(k, 6)\n if (k >= 350) return randProbPrimeRounds(k, 7)\n if (k >= 300) return randProbPrimeRounds(k, 9)\n if (k >= 250) return randProbPrimeRounds(k, 12) //numbers from HAC table 4.4\n if (k >= 200) return randProbPrimeRounds(k, 15)\n if (k >= 150) return randProbPrimeRounds(k, 18)\n if (k >= 100) return randProbPrimeRounds(k, 27)\n return randProbPrimeRounds(k, 40) //number from HAC remark 4.26 (only an estimate)\n} */\n\n/**\n * return a k-bit probable random prime using n rounds of Miller Rabin\n * (after trial division with small primes)\n *\n * @export\n * @param {number} k\n * @param {number} n\n * @returns {number[]}\n */\n/* export function randProbPrimeRounds(k: number, n: number): number[] {\n var ans, i, divisible, B\n B = 30000 //B is largest prime to use in trial division\n ans = int2bigInt(0, k, 0)\n\n //optimization: try larger and smaller B to find the best limit.\n\n if (primes.length === 0) primes = findPrimes(30000) //check for divisibility by primes <=30000\n\n if (rpprb.length !== ans.length) rpprb = dup(ans)\n\n for (;;) {\n //keep trying random values for ans until one appears to be prime\n //optimization: pick a random number times L=2*3*5*...*p, plus a\n // random element of the list of all numbers in [0,L) not divisible by any prime up to p.\n // This can reduce the amount of random number generation.\n\n randBigInt_(ans, k, 0) //ans = a random odd number to check\n ans[0] |= 1\n divisible = 0\n\n //check ans for divisibility by small primes up to B\n for (i = 0; i < primes.length && primes[i] <= B; i++)\n if (modInt(ans, primes[i]) === 0 && !equalsInt(ans, primes[i])) {\n divisible = 1\n break\n }\n\n //optimization: change millerRabin so the base can be bigger than the number being checked, then eliminate the while here.\n\n //do n rounds of Miller Rabin, with random bases less than ans\n for (i = 0; i < n && !divisible; i++) {\n randBigInt_(rpprb, k, 0)\n while (\n !greater(ans, rpprb) //pick a random rpprb that's < ans\n )\n randBigInt_(rpprb, k, 0)\n if (!millerRabin(ans, rpprb)) divisible = 1\n }\n\n if (!divisible) return ans\n }\n} */\n\n/**\n * return a new bigInt equal to (x mod n) for bigInts x and n.\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {number[]}\n */\nexport function mod(x: number[], n: number[]): number[] {\n var ans = dup(x)\n mod_(ans, n)\n return trim(ans, 1)\n}\n\n/**\n * return (x+n) where x is a bigInt and n is an integer.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n/* export function addInt(x: number[], n: number): number[] {\n var ans = expand(x, x.length + 1)\n addInt_(ans, n)\n return trim(ans, 1)\n} */\n\n/**\n * return x*y for bigInts x and y. This is faster when y y.length ? x.length + 1 : y.length + 1)\n sub_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x+y) for bigInts x and y\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function add(x: number[], y: number[]): number[] {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1)\n add_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x**(-1) mod n) for bigInts x and n.\n *\n * If no inverse exists, it returns null\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(number[] | null)}\n */\n/* export function inverseMod(x: number[], n: number[]): number[] | null {\n var ans = expand(x, n.length)\n var s = inverseMod_(ans, n)\n return s ? trim(ans, 1) : null\n} */\n\n/**\n * return (x*y mod n) for bigInts x,y,n.\n *\n * For greater speed, let y= 2\n\n if (s_i2.length != ans.length) {\n s_i2 = dup(ans)\n s_R = dup(ans)\n s_n1 = dup(ans)\n s_r2 = dup(ans)\n s_d = dup(ans)\n s_x1 = dup(ans) //TODO Seems like a bug in eslint, reports as unused\n s_x2 = dup(ans)\n s_b = dup(ans)\n s_n = dup(ans)\n s_i = dup(ans)\n s_rm = dup(ans)\n s_q = dup(ans)\n s_a = dup(ans)\n s_aa = dup(ans)\n }\n\n if (k <= recLimit) {\n //generate small random primes by trial division up to its square root\n pm = (1 << ((k + 2) >> 1)) - 1 //pm is binary number with all ones, just over sqrt(2^k)\n copyInt_(ans, 0)\n for (dd = 1; dd; ) {\n dd = 0\n ans[0] = 1 | (1 << (k - 1)) | Math.floor(Math.random() * (1 << k)) //random, k-bit, odd integer, with msb 1\n for (j = 1; j < primes.length && (primes[j] & pm) == primes[j]; j++) {\n //trial division by all primes 3...sqrt(2^k)\n if (0 == ans[0] % primes[j]) {\n dd = 1\n break\n }\n }\n }\n carry_(ans)\n return\n }\n\n B = c * k * k //try small primes up to B (or all the primes[] array if the largest is less than B).\n if (k > 2 * m)\n //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n for (r = 1; k - k * r <= m; ) r = pows[Math.floor(Math.random() * 512)] //r=Math.pow(2,Math.random()-1);\n else r = 0.5\n\n //simulation suggests the more complex algorithm using r=.333 is only slightly faster.\n\n recSize = Math.floor(r * k) + 1\n\n randTruePrime_(s_q, recSize)\n copyInt_(s_i2, 0)\n s_i2[Math.floor((k - 2) / bpe)] |= 1 << ((k - 2) % bpe) //s_i2=2^(k-2)\n divide_(s_i2, s_q, s_i, s_rm) //s_i=floor((2^(k-1))/(2q))\n\n z = bitSize(s_i)\n\n for (;;) {\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_i-1]\n randBigInt_(s_R, z, 0)\n if (greater(s_i, s_R)) break\n } //now s_R is in the range [0,s_i-1]\n addInt_(s_R, 1) //now s_R is in the range [1,s_i]\n add_(s_R, s_i) //now s_R is in the range [s_i+1,2*s_i]\n\n copy_(s_n, s_q)\n mult_(s_n, s_R)\n multInt_(s_n, 2)\n addInt_(s_n, 1) //s_n=2*s_R*s_q+1\n\n copy_(s_r2, s_R)\n multInt_(s_r2, 2) //s_r2=2*s_R\n\n //check s_n for divisibility by small primes up to B\n for (divisible = 0, j = 0; j < primes.length && primes[j] < B; j++)\n if (modInt(s_n, primes[j]) == 0 && !equalsInt(s_n, primes[j])) {\n divisible = 1\n break\n }\n\n if (!divisible)\n if (!millerRabinInt(s_n, 2))\n //if it passes small primes check, then try a single Miller-Rabin base 2\n //this line represents 75% of the total runtime for randTruePrime_\n divisible = 1\n\n if (!divisible) {\n //if it passes that test, continue checking s_n\n addInt_(s_n, -3)\n for (j = s_n.length - 1; s_n[j] == 0 && j > 0; j--); //strip leading zeros\n for (zz = 0, w = s_n[j]; w; w >>= 1, zz++);\n zz += bpe * j //zz=number of bits in s_n, ignoring leading zeros\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_n-1]\n randBigInt_(s_a, zz, 0)\n if (greater(s_n, s_a)) break\n } //now s_a is in the range [0,s_n-1]\n addInt_(s_n, 3) //now s_a is in the range [0,s_n-4]\n addInt_(s_a, 2) //now s_a is in the range [2,s_n-2]\n copy_(s_b, s_a)\n copy_(s_n1, s_n)\n addInt_(s_n1, -1)\n powMod_(s_b, s_n1, s_n) //s_b=s_a^(s_n-1) modulo s_n\n addInt_(s_b, -1)\n if (isZero(s_b)) {\n copy_(s_b, s_a)\n powMod_(s_b, s_r2, s_n)\n addInt_(s_b, -1)\n copy_(s_aa, s_n)\n copy_(s_d, s_b)\n GCD_(s_d, s_n) //if s_b and s_n are relatively prime, then s_n is a prime\n if (equalsInt(s_d, 1)) {\n copy_(ans, s_aa)\n return //if we've made it this far, then s_n is absolutely guaranteed to be prime\n }\n }\n }\n }\n} */\n\n/**\n * Return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n *\n * @export\n * @param {number} n\n * @param {number} s\n * @returns {number[]}\n */\n/* export function randBigInt(n: number, s: number): number[] {\n var a, b\n a = Math.floor((n - 1) / bpe) + 2 //# array elements to hold the BigInt with a leading 0 element\n b = int2bigInt(0, 0, a)\n randBigInt_(b, n, s)\n return b\n} */\n\n/**\n * Set b to an n-bit random BigInt. If s=1, then the most significant of those n bits is set to 1.\n *\n * Array b must be big enough to hold the result. Must have n>=1\n *\n * @export\n * @param {number[]} b\n * @param {number} n\n * @param {number} s\n * @return {void}\n */\n/* export function randBigInt_(b: number[], n: number, s: number): void {\n var i, a\n for (i = 0; i < b.length; i++) b[i] = 0\n a = Math.floor((n - 1) / bpe) + 1 //# array elements to hold the BigInt\n for (i = 0; i < a; i++) {\n b[i] = Math.floor(Math.random() * (1 << (bpe - 1)))\n }\n b[a - 1] &= (2 << ((n - 1) % bpe)) - 1\n if (s == 1) b[a - 1] |= 1 << ((n - 1) % bpe)\n} */\n\n/**\n * Return the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function GCD(x: number[], y: number[]): number[] {\n var xc, yc\n xc = dup(x)\n yc = dup(y)\n GCD_(xc, yc)\n return xc\n}\n\n/**\n * set x to the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * y is destroyed.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n */\nexport function GCD_(x: number[], y: number[]): void {\n var i: number, xp: number, yp: number, A: number, B, C: number, D: number, q, sing\n var qp\n if (T.length !== x.length) T = dup(x)\n\n sing = 1\n while (sing) {\n //while y has nonzero elements other than y[0]\n sing = 0\n for (\n i = 1;\n i < y.length;\n i++ //check if y has nonzero elements other than 0\n )\n if (y[i]) {\n sing = 1\n break\n }\n if (!sing) break //quit when y all zero elements except possibly y[0]\n\n for (i = x.length; !x[i] && i >= 0; i--); //find most significant element of x\n xp = x[i]\n yp = y[i]\n A = 1\n B = 0\n C = 0\n D = 1\n while (yp + C && yp + D) {\n q = Math.floor((xp + A) / (yp + C))\n qp = Math.floor((xp + B) / (yp + D))\n if (q != qp) break\n t = A - q * C\n A = C\n C = t // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)\n t = B - q * D\n B = D\n D = t\n t = xp - q * yp\n xp = yp\n yp = t\n }\n if (B) {\n copy_(T, x)\n linComb_(x, y, A, B) //x=A*x+B*y\n linComb_(y, T, D, C) //y=D*y+C*T\n } else {\n mod_(x, y)\n copy_(T, x)\n copy_(x, y)\n copy_(y, T)\n }\n }\n if (y[0] === 0) return\n t = modInt(x, y[0])\n copyInt_(x, y[0])\n y[0] = t\n while (y[0]) {\n x[0] %= y[0]\n t = x[0]\n x[0] = y[0]\n y[0] = t\n }\n}\n\n/**\n * do x=x**(-1) mod n, for bigInts x and n.\n *\n * If no inverse exists, it sets x to zero and returns 0, else it returns 1.\n * The x array must be at least as large as the n array.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(0 | 1)}\n */\n/* export function inverseMod_(x: number[], n: number[]): Bool {\n var k = 1 + 2 * Math.max(x.length, n.length)\n\n if (!(x[0] & 1) && !(n[0] & 1)) {\n //if both inputs are even, then inverse doesn't exist\n copyInt_(x, 0)\n return 0\n }\n\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_v = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n\n copy_(eg_u, x)\n copy_(eg_v, n)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while eg_u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if eg_A==eg_B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, n)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(eg_v[0] & 1)) {\n //while eg_v is even\n halve_(eg_v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if eg_C==eg_D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, n)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(eg_v, eg_u)) {\n //eg_v <= eg_u\n sub_(eg_u, eg_v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //eg_v > eg_u\n sub_(eg_v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n\n if (equalsInt(eg_u, 0)) {\n while (\n negative(eg_C) //make sure answer is nonnegative\n )\n add_(eg_C, n)\n copy_(x, eg_C)\n\n if (!equalsInt(eg_v, 1)) {\n //if GCD_(x,n)!=1, then there is no inverse\n copyInt_(x, 0)\n return 0\n }\n return 1\n }\n }\n} */\n\n/**\n * return x**(-1) mod n, for integers x and n.\n *\n * Return 0 if there is no inverse\n *\n * @param {number} x\n * @param {number} n\n * @returns {number}\n */\nexport function inverseModInt(x: number, n: number): number {\n var a = 1,\n b = 0,\n t\n for (;;) {\n if (x === 1) return a\n if (x === 0) return 0\n b -= a * Math.floor(n / x)\n //$off\n n %= x\n\n if (n === 1) return b //to avoid negatives, change this b to n-b, and each -= to +=\n if (n === 0) return 0\n a -= b * Math.floor(x / n)\n //$off\n x %= n\n }\n /*::\n declare var never: empty\n return never\n */\n}\n\n//this deprecated function is for backward compatibility only.\n/* function inverseModInt_(x: number, n: number) {\n return inverseModInt(x, n)\n} */\n\n/**\n * Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:\n *\n * v = GCD_(x,y) = a*x-b*y\n *\n * The bigInts v, a, b, must have exactly as many elements as the larger of x and y.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} v\n * @param {number[]} a\n * @param {number[]} b\n * @return {void}\n */\nexport function eGCD_(\n x: number[],\n y: number[],\n v: number[],\n a: number[],\n b: number[],\n): void {\n var g = 0\n var k = Math.max(x.length, y.length)\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n while (!(x[0] & 1) && !(y[0] & 1)) {\n //while x and y both even\n halve_(x)\n halve_(y)\n g++\n }\n copy_(eg_u, x)\n copy_(v, y)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if A==B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, y)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(v[0] & 1)) {\n //while v is even\n halve_(v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if C==D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, y)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(v, eg_u)) {\n //v<=u\n sub_(eg_u, v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //v>u\n sub_(v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C)) {\n //make sure a (C) is nonnegative\n add_(eg_C, y)\n sub_(eg_D, x)\n }\n multInt_(eg_D, -1) ///make sure b (D) is nonnegative\n copy_(a, eg_C)\n copy_(b, eg_D)\n leftShift_(v, g)\n return\n }\n }\n}\n\n/**\n * is bigInt x negative?\n *\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function negative(x: number[]) {\n //TODO Flow Bool type inference\n return (x[x.length - 1] >> (bpe - 1)) & 1\n}\n\n/**\n * is (x << (shift*bpe)) > y?\n *\n * x and y are nonnegative bigInts\n * shift is a nonnegative integer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} shift\n * @returns {(1 | 0)}\n */\nexport function greaterShift(x: number[], y: number[], shift: number): Bool {\n var i,\n kx = x.length,\n ky = y.length\n k = kx + shift < ky ? kx + shift : ky\n for (i = ky - 1 - shift; i < kx && i >= 0; i++) if (x[i] > 0) return 1 //if there are nonzeros in x to the left of the first column of y, then x is bigger\n for (i = kx - 1 + shift; i < ky; i++) if (y[i] > 0) return 0 //if there are nonzeros in y to the left of the first column of x, then x is not bigger\n for (i = k - 1; i >= shift; i--)\n if (x[i - shift] > y[i]) return 1\n else if (x[i - shift] < y[i]) return 0\n return 0\n}\n\n/**\n * is x > y?\n *\n * x and y both nonnegative\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\nexport function greater(x: number[], y: number[]): Bool {\n var i\n var k = x.length < y.length ? x.length : y.length\n\n for (i = x.length; i < y.length; i++) if (y[i]) return 0 //y has more digits\n\n for (i = y.length; i < x.length; i++) if (x[i]) return 1 //x has more digits\n\n for (i = k - 1; i >= 0; i--)\n if (x[i] > y[i]) return 1\n else if (x[i] < y[i]) return 0\n return 0\n}\n\n/**\n * divide x by y giving quotient q and remainder r.\n *\n * q = floor(x/y)\n * r = x mod y\n *\n * All 4 are bigints.\n *\n * * x must have at least one leading zero element.\n * * y must be nonzero.\n * * q and r must be arrays that are exactly the same length as x. (Or q can have more).\n * * Must have x.length >= y.length >= 2.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} q\n * @param {number[]} r\n * @return {void}\n */\nexport function divide_(\n x: number[],\n y: number[],\n q: number[],\n r: number[],\n): void {\n var kx, ky\n var i, j, y1, y2, c, a, b\n copy_(r, x)\n for (ky = y.length; y[ky - 1] === 0; ky--); //ky is number of elements in y, not including leading zeros\n\n //normalize: ensure the most significant element of y has its highest bit set\n b = y[ky - 1]\n for (a = 0; b; a++) b >>= 1\n a = bpe - a //a is how many bits to shift so that the high order bit of y is leftmost in its array element\n leftShift_(y, a) //multiply both by 1< ky; kx--); //kx is number of elements in normalized x, not including leading zeros\n\n copyInt_(q, 0) // q=0\n while (!greaterShift(y, r, kx - ky)) {\n // while (leftShift_(y,kx-ky) <= r) {\n subShift_(r, y, kx - ky) // r=r-leftShift_(y,kx-ky)\n q[kx - ky]++ // q[kx-ky]++;\n } // }\n\n for (i = kx - 1; i >= ky; i--) {\n if (r[i] == y[ky - 1]) q[i - ky] = mask\n else q[i - ky] = Math.floor((r[i] * radix + r[i - 1]) / y[ky - 1])\n\n //The following for(;;) loop is equivalent to the commented while loop,\n //except that the uncommented version avoids overflow.\n //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0\n // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])\n // q[i-ky]--;\n for (;;) {\n y2 = (ky > 1 ? y[ky - 2] : 0) * q[i - ky]\n c = y2 >> bpe\n y2 = y2 & mask\n y1 = c + q[i - ky] * y[ky - 1]\n c = y1 >> bpe\n y1 = y1 & mask\n\n if (\n c == r[i]\n ? y1 == r[i - 1] ? y2 > (i > 1 ? r[i - 2] : 0) : y1 > r[i - 1]\n : c > r[i]\n )\n q[i - ky]--\n else break\n }\n\n linCombShift_(r, y, -q[i - ky], i - ky) //r=r-q[i-ky]*leftShift_(y,i-ky)\n if (negative(r)) {\n addShift_(r, y, i - ky) //r=r+leftShift_(y,i-ky)\n q[i - ky]--\n }\n }\n\n rightShift_(y, a) //undo the normalization step\n rightShift_(r, a) //undo the normalization step\n}\n\n/**\n * do carries and borrows so each element of the bigInt x fits in bpe bits.\n *\n * @param {number[]} x\n */\nexport function carry_(x: number[]): void {\n var i, k, c, b\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * return x mod n for bigInt x and integer n.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number}\n */\nexport function modInt(x: number[], n: number): number {\n var i,\n c = 0\n for (i = x.length - 1; i >= 0; i--) c = (c * radix + x[i]) % n\n return c\n}\n\n/**\n * convert the integer t into a bigInt with at least the given number of bits.\n * the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)\n * Pad the array with leading zeros so that it has at least minSize elements.\n *\n * There will always be at least one leading 0 element.\n *\n * @export\n * @param {number} t\n * @param {number} bits\n * @param {number} minSize\n * @returns {number[]}\n */\nexport function int2bigInt(t: number, bits: number, minSize: number): number[] {\n var i, k\n k = Math.ceil(bits / bpe) + 1\n k = minSize > k ? minSize : k\n var buff = new Array(k)\n copyInt_(buff, t)\n return buff\n}\n\n/**\n * return the bigInt given a string representation in a given base.\n * Pad the array with leading zeros so that it has at least minSize elements.\n * If base=-1, then it reads in a space-separated list of array elements in decimal.\n *\n * The array will always have at least one leading zero, unless base=-1.\n *\n * @export\n * @param {string} s\n * @param {number} base\n * @param {number} [minSize]\n * @returns {number[]}\n */\nexport function str2bigInt(\n s: string,\n base: number,\n minSize?: number,\n): number[] {\n var d, i, x, y, kk\n var k = s.length\n if (base === -1) {\n //comma-separated list of array elements in decimal\n x = new Array(0)\n for (;;) {\n y = new Array(x.length + 1)\n for (i = 0; i < x.length; i++) y[i + 1] = x[i]\n y[0] = parseInt(s, 10) //TODO PERF Should we replace that with ~~ (not not)? https://jsperf.com/number-vs-parseint-vs-plus/7\n x = y\n d = s.indexOf(',', 0)\n if (d < 1) break\n //$off\n s = s.substring(d + 1)\n if (s.length == 0) break\n }\n //$off\n if (x.length < minSize) {\n //$off\n y = new Array(minSize)\n copy_(y, x)\n return y\n }\n return x\n }\n\n x = int2bigInt(0, base * k, 0)\n for (i = 0; i < k; i++) {\n d = digitsStr.indexOf(s.substring(i, i + 1), 0)\n if (base <= 36 && d >= 36)\n //convert lowercase to uppercase if base<=36\n d -= 26\n if (d >= base || d < 0) {\n //stop at first illegal character\n break\n }\n multInt_(x, base)\n addInt_(x, d)\n }\n\n for (k = x.length; k > 0 && !x[k - 1]; k--); //strip off leading zeros\n //$off\n k = minSize > k + 1 ? minSize : k + 1\n //$off\n y = new Array(k)\n //$off\n kk = k < x.length ? k : x.length\n //$off\n for (i = 0; i < kk; i++) y[i] = x[i]\n //$off\n for (; i < k; i++) y[i] = 0\n return y\n}\n\n//return the bigInt given a string representation in a given base.\n//Pad the array with leading zeros so that it has at least minSize elements.\n//If base=-1, then it reads in a space-separated list of array elements in decimal.\n//The array will always have at least one leading zero, unless base=-1.\n// function str2bigInt(s,b,minSize) {\n// var d, i, j, base, str, x, y, kk;\n// if (typeof b === 'string') {\n// base = b.length;\n// str = b;\n// } else {\n// base = b;\n// str = digitsStr;\n// }\n// var k=s.length;\n// if (base==-1) { //comma-separated list of array elements in decimal\n// x=new Array(0);\n// for (;;) {\n// y=new Array(x.length+1);\n// for (i=0;i=36) { //convert lowercase to uppercase if base<=36\n// d-=26;\n// }\n// if (d>=base || d<0) { //ignore illegal characters\n// continue;\n// }\n// multInt_(x,base);\n// addInt_(x,d);\n// }\n\n// for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros\n// k=minSize>k+1 ? minSize : k+1;\n// y=new Array(k);\n// kk=k y.length) {\n for (; i < x.length; i++) if (x[i]) return 0\n } else {\n for (; i < y.length; i++) if (y[i]) return 0\n }\n return 1\n}\n\n/**\n * is the bigInt x equal to zero?\n *\n * @export\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function isZero(x: number[]): Bool {\n var i\n for (i = 0; i < x.length; i++) if (x[i]) return 0\n return 1\n}\n\n/**\n * Convert a bigInt into a string in a given base, from base 2 up to base 95.\n *\n * Base -1 prints the contents of the array representing the number.\n *\n * @export\n * @param {number[]} x\n * @param {number} base\n * @returns {string}\n */\nexport function bigInt2str(x: number[], base: number): string {\n var i,\n t,\n s = ''\n\n if (s6.length !== x.length) s6 = dup(x)\n else copy_(s6, x)\n\n if (base === -1) {\n //return the list of array contents\n for (i = x.length - 1; i > 0; i--) s += x[i] + ','\n s += x[0]\n } else {\n //return it in the given base\n while (!isZero(s6)) {\n t = divInt_(s6, base) //t=s6 % base; s6=floor(s6/base);\n s = digitsStr.substring(t, t + 1) + s\n }\n }\n if (s.length === 0) s = '0'\n return s\n}\n\n/**\n * Convert a bigInt into bytes\n * @param x bigInt\n * @param littleEndian byte order by default\n */\nexport function bigInt2bytes(x: number[], littleEndian = true) {\n if(s6.length !== x.length) s6 = dup(x);\n else copy_(s6, x);\n\n const out: number[] = [];\n\n //console.log('bigInt2bytes');\n while(!isZero(s6)) {\n t = divInt_(s6, 256); //t=s6 % base; s6=floor(s6/base);\n out.push(t);\n //console.log('bigInt2bytes', t);\n }\n\n if(littleEndian) {\n out.reverse();\n }\n\n //console.log('bigInt2bytes', out);\n\n return out;\n}\n\n/**\n * Compare two bigInts and return -1 if x is less, 0 if equals, 1 if greater\n * @param x bigInt\n * @param y bigInt\n */\nexport function cmp(x: number[], y: number[]) {\n return greater(x, y) ? 1 : (equals(x, y) ? 0 : -1);\n}\n\n/* Object.assign(self, {\n cmp,\n str2bigInt,\n int2bigInt,\n bigInt2str,\n one,\n divide_,\n divInt_,\n dup,\n negative\n}); */\n\n/**\n * Returns a duplicate of bigInt x\n *\n * @export\n * @param {number[]} x\n * @returns {number[]}\n */\nexport function dup(x: number[]): number[] {\n var i\n buff = Array(x.length)\n copy_(buff, x)\n return buff\n}\n\n/**\n * do x=y on bigInts x and y.\n *\n * x must be an array at least as big as y (not counting the leading zeros in y).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {void}\n */\nexport function copy_(x: number[], y: number[]): void {\n var i\n var k = x.length < y.length ? x.length : y.length\n for (i = 0; i < k; i++) x[i] = y[i]\n for (i = k; i < x.length; i++) x[i] = 0\n}\n\n/**\n * do x=y on bigInt x and integer y.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function copyInt_(x: number[], n: number): void {\n var i, c\n var len = x.length //TODO .length in for loop have perfomance costs. Bench this\n for (c = n, i = 0; i < len; i++) {\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function addInt_(x: number[], n: number): void {\n var i, k, c, b\n x[0] += n\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n if (!c) return //stop carrying as soon as the carry is zero\n }\n}\n\n/**\n * right shift bigInt x by n bits.\n *\n * 0 <= n < bpe.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n */\nexport function rightShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = 0;\n i < x.length - k;\n i++ //right shift x by k elements\n )\n x[i] = x[i + k]\n for (; i < x.length; i++) x[i] = 0\n //$off\n n %= bpe\n }\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - n)) | (x[i] >> n))\n }\n x[i] >>= n\n}\n\n/**\n * do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement\n *\n * @param {number[]} x\n * @returns {void}\n */\nexport function halve_(x: number[]): void {\n var i\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - 1)) | (x[i] >> 1))\n }\n x[i] = (x[i] >> 1) | (x[i] & (radix >> 1)) //most significant bit stays the same\n}\n\n/**\n * left shift bigInt x by n bits\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function leftShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = x.length;\n i >= k;\n i-- //left shift x by k elements\n )\n x[i] = x[i - k]\n for (; i >= 0; i--) x[i] = 0\n //$off\n n %= bpe\n }\n if (!n) return\n for (i = x.length - 1; i > 0; i--) {\n x[i] = mask & ((x[i] << n) | (x[i - 1] >> (bpe - n)))\n }\n x[i] = mask & (x[i] << n)\n}\n\n/**\n * do x=x*n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function multInt_(x: number[], n: number): void {\n var i, k, c, b\n if (!n) return\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i] * n\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * do x=floor(x/n) for bigInt x and integer n, and return the remainder\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number} remainder\n */\nexport function divInt_(x: number[], n: number): number {\n var i,\n r = 0,\n s\n for (i = x.length - 1; i >= 0; i--) {\n s = r * radix + x[i]\n x[i] = Math.floor(s / n)\n r = s % n\n }\n return r\n}\n\n/**\n * do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} a\n * @param {number} b\n * @returns {void}\n */\nexport function linComb_(x: number[], y: number[], a: number, b: number): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n kk = x.length\n for (c = 0, i = 0; i < k; i++) {\n c += a * x[i] + b * y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; i < kk; i++) {\n c += a * x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} b\n * @param {number} ys\n * @returns {void}\n */\nexport function linCombShift_(\n x: number[],\n y: number[],\n b: number,\n ys: number,\n): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + b * y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+(y<<(ys*bpe)) for bigInts x and y, and integer ys.\n *\n * x must be large enough to hold the answer.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function addShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-(y<<(ys*bpe)) for bigInts x and y, and integer ys\n *\n * x must be large enough to hold the answer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function subShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] - y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function sub_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] - y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function add_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] + y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x*y for bigInts x and y.\n *\n * This is faster when y 0 && !x[kx - 1]; kx--); //ignore leading zeros in x\n k = kx > n.length ? 2 * kx : 2 * n.length //k=# elements in the product, which is twice the elements in the larger of x and n\n if (s0.length != k) s0 = new Array(k)\n copyInt_(s0, 0)\n for (i = 0; i < kx; i++) {\n c = s0[2 * i] + x[i] * x[i]\n s0[2 * i] = c & mask\n c >>= bpe\n for (j = i + 1; j < kx; j++) {\n c = s0[i + j] + 2 * x[i] * x[j] + c\n s0[i + j] = c & mask\n c >>= bpe\n }\n s0[i + kx] = c\n }\n mod_(s0, n)\n copy_(x, s0)\n}\n\n/**\n * return x with exactly k leading zero elements\n *\n * @export\n * @param {number[]} x\n * @param {number} k\n * @returns {number[]}\n */\nexport function trim(x: number[], k: number): number[] {\n var i, y\n for (i = x.length; i > 0 && !x[i - 1]; i--);\n y = new Array(i + k)\n copy_(y, x)\n return y\n}\n\n/**\n * do `x=x**y mod n`, where x,y,n are bigInts and `**` is exponentiation. `0**0=1`.\n *\n * this is faster when n is odd.\n *\n * x usually needs to have as many elements as n.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\nexport function powMod_(x: number[], y: number[], n: number[]): void {\n var k1, k2, kn, np\n if (s7.length != n.length) s7 = dup(n)\n\n //for even modulus, use a simple square-and-multiply algorithm,\n //rather than using the more complex Montgomery algorithm.\n if ((n[0] & 1) == 0) {\n copy_(s7, x)\n copyInt_(x, 1)\n while (!equalsInt(y, 0)) {\n if (y[0] & 1) multMod_(x, s7, n)\n divInt_(y, 2)\n squareMod_(s7, n)\n }\n return\n }\n\n //calculate np from n for the Montgomery multiplications\n copyInt_(s7, 0)\n for (kn = n.length; kn > 0 && !n[kn - 1]; kn--);\n np = radix - inverseModInt(modInt(n, radix), radix)\n s7[kn] = 1\n multMod_(x, s7, n) // x = x * 2**(kn*bp) mod n\n\n if (s3.length != x.length) s3 = dup(x)\n else copy_(s3, x)\n //$off\n // @ts-ignore\n for (k1 = y.length - 1; (k1 > 0) & !y[k1]; k1--); //k1=first nonzero element of y\n if (y[k1] == 0) {\n //anything to the 0th power is 1\n copyInt_(x, 1)\n return\n }\n for (k2 = 1 << (bpe - 1); k2 && !(y[k1] & k2); k2 >>= 1); //k2=position of first 1 bit in y[k1]\n for (;;) {\n if (!(k2 >>= 1)) {\n //look at next bit of y\n k1--\n if (k1 < 0) {\n mont_(x, one, n, np)\n return\n }\n k2 = 1 << (bpe - 1)\n }\n mont_(x, x, n, np)\n\n if (k2 & y[k1])\n //if next bit is a 1\n mont_(x, s3, n, np)\n }\n}\n\n/**\n * do x=x*y*Ri mod n for bigInts x,y,n,\n * where Ri = 2**(-kn*bpe) mod n, and kn is the\n * number of elements in the n array, not\n * counting leading zeros.\n *\n * x array must have at least as many elemnts as the n array\n * It's OK if x and y are the same variable.\n *\n * must have:\n * * x,y < n\n * * n is odd\n * * np = -(n^(-1)) mod radix\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @param {number} np\n * @return {void}\n */\nexport function mont_(x: number[], y: number[], n: number[], np: number): void {\n var i, j, c, ui, t, ks\n var kn = n.length\n var ky = y.length\n\n if (sa.length != kn) sa = new Array(kn)\n\n copyInt_(sa, 0)\n\n for (; kn > 0 && n[kn - 1] == 0; kn--); //ignore leading zeros of n\n for (; ky > 0 && y[ky - 1] == 0; ky--); //ignore leading zeros of y\n ks = sa.length - 1 //sa will never have more than this many nonzero elements.\n\n //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large numbers\n for (i = 0; i < kn; i++) {\n t = sa[0] + x[i] * y[0]\n ui = ((t & mask) * np) & mask //the inner \"& mask\" was needed on Safari (but not MSIE) at one time\n c = (t + ui * n[0]) >> bpe\n t = x[i]\n\n //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe. Loop is unrolled 5-fold for speed\n j = 1\n for (; j < ky - 4; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ky; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn - 4; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ks; ) {\n c += sa[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n sa[j - 1] = c & mask\n }\n\n if (!greater(n, sa)) sub_(sa, n)\n copy_(x, sa)\n}","/*\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 { bufferConcats } from '../../helpers/bytes';\nimport { add_, bigInt2str, cmp, leftShift_, str2bigInt } from '../../vendor/leemon';\n\n \n \n \n\n \n \n \n \n \n \n \n \n \n\nexport function isObject(object: any) {\n return typeof(object) === 'object' && object !== null;\n}\n\n/* export function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n} */\n\n/* export function bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10);\n} */\n\n/* export function base64ToBlob(base64str: string, mimeType: string) {\n var sliceSize = 1024;\n var byteCharacters = atob(base64str);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n\n for(var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n\n var bytes = new Array(end - begin);\n for(var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n\n return blobConstruct(byteArrays, mimeType);\n}\n\nexport function dataUrlToBlob(url: string) {\n // var name = 'b64blob ' + url.length\n // console.time(name)\n var urlParts = url.split(',');\n var base64str = urlParts[1];\n var mimeType = urlParts[0].split(':')[1].split(';')[0];\n var blob = base64ToBlob(base64str, mimeType);\n // console.timeEnd(name)\n return blob;\n} */\n\nexport 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\n/* export function bytesFromBigInt(bigInt: BigInteger, len?: number) {\n var bytes = bigInt.toByteArray();\n\n if(len && bytes.length < len) {\n var padding = [];\n for(var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n padding[i] = 0;\n }\n if(bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(padding, bytes);\n } else {\n bytes = padding.concat(bytes);\n }\n } else {\n while (!bytes[0] && (!len || bytes.length > len)) {\n bytes = bytes.slice(1);\n }\n }\n\n return bytes;\n} */\n\nexport function longFromInts(high: number, low: number): string {\n //let perf = performance.now();\n //let str = bigint(high).shiftLeft(32).add(bigint(low)).toString(10);\n //console.log('longFromInts jsbn', performance.now() - perf);\n high = intToUint(high);\n low = intToUint(low);\n \n //perf = performance.now();\n const bigInt = str2bigInt(high.toString(16), 16, 32);//int2bigInt(high, 64, 64);\n //console.log('longFromInts construct high', bigint(high).toString(10), bigInt2str(bigInt, 10));\n leftShift_(bigInt, 32);\n //console.log('longFromInts shiftLeft', bigint(high).shiftLeft(32).toString(10), bigInt2str(bigInt, 10));\n add_(bigInt, str2bigInt(low.toString(16), 16, 32));\n const _str = bigInt2str(bigInt, 10);\n\n //console.log('longFromInts leemon', performance.now() - perf);\n\n //console.log('longFromInts', high, low, str, _str, str === _str);\n\n return _str;\n}\n\nexport function sortLongsArray(arr: string[]) {\n return arr.map(long => {\n return str2bigInt(long, 10);\n }).sort((a, b) => {\n return cmp(a, b);\n }).map(bigInt => {\n return bigInt2str(bigInt, 10);\n });\n}\n\nexport 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 padding.randomize();\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","import { IS_APPLE_MOBILE, IS_SAFARI } from \"./userAgent\";\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","import IS_MOV_SUPPORTED from \"./movSupport\";\n\nconst VIDEO_MIME_TYPES_SUPPORTED = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { Chat, DialogPeer, Message, MessagesPeerDialogs, Update } from \"../../layer\";\nimport type { AppChatsManager } from \"../appManagers/appChatsManager\";\nimport type { AppMessagesManager, Dialog, MyMessage } from \"../appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\nimport type { AppDraftsManager } from \"../appManagers/appDraftsManager\";\nimport type { AppNotificationsManager } from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport type { ServerTimeManager } from \"../mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../appManagers/appMessagesIdsManager\";\nimport { tsNow } from \"../../helpers/date\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport SearchIndex from \"../searchIndex\";\nimport { forEachReverse, indexOfAndSplice, insertInDescendSortedArray } from \"../../helpers/array\";\nimport rootScope from \"../rootScope\";\nimport { defineNotNumerableProperties, safeReplaceObject } from \"../../helpers/object\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\nimport { SliceEnd } from \"../../helpers/slicedArray\";\nimport { MyDialogFilter } from \"./filters\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport { NoneToVoidFunction } from \"../../types\";\nimport ctx from \"../../environment/ctx\";\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: Dialog[],\n id: number,\n unreadMessagesCount: number,\n unreadDialogsCount: number,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: number = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage {\n private storage: AppStateManager['storages']['dialogs'];\n \n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder} = {};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n constructor(\n private appMessagesManager: AppMessagesManager, \n private appChatsManager: AppChatsManager, \n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager,\n private appDraftsManager: AppDraftsManager,\n private appNotificationsManager: AppNotificationsManager,\n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager,\n private serverTimeManager: ServerTimeManager,\n private appMessagesIdsManager: AppMessagesIdsManager\n ) {\n this.storage = this.appStateManager.storages.dialogs;\n this.dialogs = this.storage.getCache();\n this.clear(true);\n\n rootScope.addEventListener('language_change', () => {\n const peerId = appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n for(let i = 0; i <= 10; ++i) {\n const indexKey = `index_${i}` as ReturnType;\n dialog[indexKey] = undefined;\n }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n rootScope.addEventListener('filter_update', onFilterUpdate);\n rootScope.addEventListener('filter_new', onFilterUpdate);\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = `index_${filter.orderIndex}` as const;\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const chat: Chat.chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if(chat.pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n });\n\n appStateManager.getState().then((state) => {\n this.pinnedOrders = state.pinnedOrders || {};\n if(!this.pinnedOrders[0]) this.pinnedOrders[0] = [];\n if(!this.pinnedOrders[1]) this.pinnedOrders[1] = [];\n \n const dialogs = appStateManager.storagesResults.dialogs;\n if(dialogs.length) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(dialog) {\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = this.appMessagesIdsManager.getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 10; ++i) {\n // @ts-ignore\n delete dialog[`index_${i}`];\n }\n \n this.saveDialog(dialog, undefined, true);\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(message.deleted) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n });\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[0] = loaded;\n this.allDialogsLoaded[1] = loaded;\n } else {\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(this.allDialogsLoaded[0] && this.allDialogsLoaded[1]) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear(init = false) {\n this.pinnedOrders = {\n 0: [],\n 1: []\n };\n\n if(!init) {\n const dialogs = this.appStateManager.storagesResults.dialogs;\n dialogs.length = 0;\n this.storage.clear();\n\n this.setDialogsLoaded(0, false);\n this.setDialogsLoaded(1, false);\n this.setDialogsLoaded(GLOBAL_FOLDER_ID, false);\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n }\n\n this.folders = {};\n this.dialogsOffsetDate = {};\n this.dialogsNum = 0;\n this.dialogsIndex = new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n this.cachedResults = {\n query: '',\n count: 0,\n dialogs: [],\n folderId: 0\n };\n }\n\n public handleDialogUnpinning(dialog: Dialog, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.pinnedOrders[folderId], dialog.peerId);\n this.savePinnedOrders();\n }\n\n public savePinnedOrders() {\n this.appStateManager.pushToState('pinnedOrders', this.pinnedOrders);\n }\n\n public resetPinnedOrder(folderId: number) {\n this.pinnedOrders[folderId] = [];\n }\n\n public getPinnedOrders(folderId: number) {\n return this.pinnedOrders[folderId];\n }\n\n public getOffsetDate(folderId: number): number {\n const offsetDate = this.dialogsOffsetDate[folderId] || 0;\n if(folderId === GLOBAL_FOLDER_ID && !offsetDate) { // make request not from beginning if we have loaded some dialogs\n return Math.min(this.getOffsetDate(0), this.getOffsetDate(1));\n }\n\n return offsetDate;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ?? (this.folders[id] = {dialogs: [], id, unreadMessagesCount: 0, unreadDialogsCount: 0});\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Dialog[] {\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\n return this.getCachedDialogs(skipMigrated);\n }\n\n const folder = this.getFolder(id);\n return skipMigrated ? folder.dialogs.filter(dialog => dialog.migratedTo === undefined) : folder.dialogs;\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n return this.getFolderDialogs(0, skipMigrated).concat(this.getFolderDialogs(1, skipMigrated));\n }\n\n private setDialogIndexInFilter(dialog: Dialog, indexKey: ReturnType, filter: MyDialogFilter) {\n let index: number;\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIndex = filter.pinnedPeerIds.indexOf(dialog.peerId);\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(filter.pinned_peers.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned) {\n index = this.generateIndexForDialog(dialog, true);\n } else {\n index = dialog.index;\n }\n }\n\n return dialog[indexKey] = index;\n }\n\n public getDialog(peerId: PeerId, folderId?: number, skipMigrated = true): [Dialog, number] | [] {\n const folders: Dialog[][] = [];\n\n if(folderId === undefined) {\n folders.push(this.getFolder(0).dialogs, this.getFolder(1).dialogs);\n } else {\n folders.push(this.getFolderDialogs(folderId, false));\n }\n\n for(let folder of folders) {\n let i = 0, skipped = 0;\n for(let length = folder.length; i < length; ++i) {\n const dialog = folder[i];\n if(dialog.peerId === peerId) {\n return [dialog, i - skipped];\n } else if(skipMigrated && dialog.migratedTo !== undefined) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n if(date === undefined) {\n date = tsNow(true) + this.serverTimeManager.serverTimeOffset;\n }\n\n return (date * 0x10000) + (isPinned ? 0 : ((++this.dialogsNum) & 0xFFFF));\n }\n\n public processDialogForFilters(dialog: Dialog) {\n // let perf = performance.now();\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const indexKey = this.getDialogIndexKey(filter.id);\n const folder = this.getFolder(filter.id);\n const dialogs = folder.dialogs;\n\n const wasIndex = dialogs.findIndex(d => d.peerId === dialog.peerId);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = wasDialog && wasDialog[indexKey];\n\n const newDialogIndex = this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return;\n }\n\n if((!wasDialogIndex && newDialogIndex) || (wasIndex && !newDialogIndex)) {\n this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, indexKey, wasIndex);\n }\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog) {\n const callbacks: NoneToVoidFunction[] = [\n this.prepareFolderUnreadCountModifyingByDialog(dialog.folder_id, dialog)\n ];\n\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog));\n }\n }\n\n return () => callbacks.forEach(callback => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n \n if(toggle !== undefined) {\n this.modifyFolderUnreadCount(folderId, toggle ? wasUnreadCount : -wasUnreadCount, wasUnreadCount ? (toggle ? 1 : -1) : 0);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n const addDialogsCount = (newUnreadCount && !wasUnreadCount) || (!newUnreadCount && wasUnreadCount) ? (wasUnreadCount ? -1 : 1) : 0;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, addDialogsCount);\n };\n }\n\n public modifyFolderUnreadCount(folderId: number, addMessagesCount: number, addDialogsCount: number) {\n if(!addMessagesCount && !addDialogsCount) {\n return;\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n \n if(addDialogsCount) {\n folder.unreadDialogsCount = Math.max(0, folder.unreadDialogsCount + addDialogsCount);\n }\n\n if(folder.dispatchUnreadTimeout === undefined) {\n folder.dispatchUnreadTimeout = ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n rootScope.dispatchEvent('folder_unread', folder);\n }, 0);\n }\n }\n\n public generateIndexForDialog(dialog: Dialog, justReturn = false, message?: MyMessage) {\n let topDate = 0, isPinned: boolean;\n if(dialog.pFlags.pinned && !justReturn) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n if(!message) {\n message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n \n topDate = (message as Message.message).date || topDate;\n\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n \n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n if(!topDate) {\n topDate = tsNow(true);\n }\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n dialog.index = index;\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog) {\n const order = this.pinnedOrders[dialog.folder_id];\n\n const foundIndex = order.indexOf(dialog.peerId);\n let pinnedIndex = foundIndex;\n if(foundIndex === -1) {\n pinnedIndex = order.push(dialog.peerId) - 1;\n this.savePinnedOrders();\n }\n\n return this.generateDialogPinnedDateByIndex(pinnedIndex);\n }\n\n /* public generateDialog(peerId: PeerId) {\n const dialog: Dialog = {\n _: 'dialog',\n pFlags: {},\n peer: this.appPeersManager.getOutputPeer(peerId),\n top_message: 0,\n read_inbox_max_id: 0,\n read_outbox_max_id: 0,\n unread_count: 0,\n unread_mentions_count: 0,\n notify_settings: {\n _: 'peerNotifySettings',\n },\n };\n\n return dialog;\n } */\n\n public setDialogToState(dialog: Dialog) {\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(!message.pFlags.is_outgoing && !message.deleted/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n \n const fromId = message.viaBotId || message.fromId;\n if(fromId !== peerId) {\n this.appStateManager.requestPeerSingle(fromId, 'topMessage', peerId);\n }\n \n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.appStateManager.requestPeerSingle(peerId, 'dialog');\n\n /* for(let id in this.appMessagesManager.filtersStorage.filters) {\n const filter = this.appMessagesManager.filtersStorage.filters[id];\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n \n }\n } */\n }\n\n public pushDialog(dialog: Dialog, offsetDate?: number, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const {folder_id, peerId} = dialog;\n const dialogs = this.getFolderDialogs(folder_id, false);\n const pos = dialogs.findIndex(d => d.peerId === peerId);\n if(pos !== -1) {\n dialogs.splice(pos, 1);\n }\n \n //if(!this.dialogs[peerId]) {\n this.dialogs[peerId] = dialog;\n \n this.setDialogToState(dialog);\n //}\n\n if(offsetDate === undefined) {\n offsetDate = this.getDialogOffsetDate(dialog);\n }\n\n this.processDialogForFilters(dialog);\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(saveGlobalOffset) {\n const savedGlobalOffsetDate = this.dialogsOffsetDate[GLOBAL_FOLDER_ID];\n if(!savedGlobalOffsetDate || offsetDate < savedGlobalOffsetDate) {\n this.dialogsOffsetDate[GLOBAL_FOLDER_ID] = offsetDate;\n }\n }\n\n const savedOffsetDate = this.dialogsOffsetDate[folder_id];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folder_id)) {\n this.clearDialogFromState(dialog, true);\n return;\n }\n \n this.dialogsOffsetDate[folder_id] = offsetDate;\n }\n }\n\n if(pos === -1) {\n this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n }\n\n /* const newPos = */insertInDescendSortedArray(dialogs, dialog, 'index', pos);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialog(peerId: PeerId): ReturnType {\n const foundDialog = this.getDialog(peerId, undefined, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n delete this.dialogs[peerId];\n\n const folder = this.getFolder(dialog.folder_id);\n folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.pinnedOrders[dialog.folder_id], peerId) !== undefined;\n \n this.processDialogForFilters(dialog);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n\n this.clearDialogFromState(dialog, false);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog, keepLocal: boolean) {\n const peerId = dialog.peerId;\n this.appStateManager.releaseSinglePeer(peerId, 'topMessage');\n this.appStateManager.releaseSinglePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId) {\n const dropped = this.dropDialog(peerId);\n if(dropped.length) {\n rootScope.dispatchEvent('dialog_drop', {peerId, dialog: dropped[0]});\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId) {\n this.dropDialogWithEvent(peerId);\n rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(dialogsResult.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n dialogsResult.dialogs.splice(idx, 1);\n }\n });\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.appMessagesManager.saveMessages(dialogsResult.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n (dialogsResult.dialogs as Dialog[]).forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMessage = dialog.top_message;\n\n const topPendingMessage = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMessage) {\n if(!topMessage \n || (this.appMessagesManager.getMessageByPeer(peerId, topPendingMessage) as MyMessage).date > (this.appMessagesManager.getMessageByPeer(peerId, topMessage) as MyMessage).date) {\n dialog.top_message = topMessage = topPendingMessage;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMessage;\n }\n }\n\n /* const d = Object.assign({}, dialog);\n if(peerId === 239602833) {\n this.log.error('applyConversation lun', dialog, d);\n } */\n\n if(topMessage || (dialog.draft && dialog.draft._ === 'draftMessage')) {\n this.saveDialog(dialog);\n updatedDialogs[peerId] = dialog;\n } else {\n this.dropDialogWithEvent(peerId);\n }\n\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n if(updates !== undefined) {\n for(const update of updates) {\n this.apiUpdatesManager.saveUpdate(update);\n }\n\n delete this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n }\n });\n\n if(Object.keys(updatedDialogs).length) {\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n public getDialogOffsetDate(dialog: Dialog) {\n return this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message).date || 0;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog(dialog: Dialog, folderId = dialog.folder_id ?? 0, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return;\n }\n\n if(dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n \n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(chat._ === 'channelForbidden' /* || chat._ === 'chatForbidden' */ || (chat as Chat.chat).pFlags.left || (chat as Chat.chat).pFlags.kicked) {\n return;\n }\n }\n\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n\n const wasDialogBefore = this.getDialogOnly(peerId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = this.appMessagesIdsManager.generateMessageId(dialog.top_message);//dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(!channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = this.appPeersManager.getPeerId(chat.migrated_to);\n this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer;\n this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId;\n dialog.migratedTo = migratedToPeer;\n //return;\n }\n }\n\n dialog.top_message = mid;\n // dialog.unread_count = wasDialogBefore && dialog.read_inbox_max_id === this.appMessagesIdsManager.getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? wasDialogBefore.folder_id : folderId;\n }/* else if(dialog._ === 'dialogFolder') {\n dialog.folder_id = dialog.folder.id;\n } */\n }\n\n dialog.draft = this.appDraftsManager.saveDraft(peerId, 0, dialog.draft);\n dialog.peerId = peerId;\n\n // Because we saved message without dialog present\n if(message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId, \n settings: dialog.notify_settings\n });\n\n if(channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n defineNotNumerableProperties(dialog, [\n 'index_0',\n 'index_1',\n 'index_2',\n 'index_3',\n 'index_4',\n 'index_5',\n 'index_6',\n 'index_7',\n 'index_8',\n 'index_9',\n 'index_10'\n ]);\n\n if(wasDialogBefore) {\n safeReplaceObject(wasDialogBefore, dialog);\n }\n\n this.pushDialog(dialog, message.date, ignoreOffsetDate, saveGlobalOffset);\n }\n\n public getDialogIndexKey(filterId: number) {\n const indexStr = filterId > 1 ? \n `index_${this.appMessagesManager.filtersStorage.getFilter(filterId).orderIndex}` as const : \n 'index' as const;\n\n return indexStr;\n }\n\n public getDialogs(query = '', offsetIndex?: number, limit = 20, folderId = 0, skipMigrated = false): {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } {\n const ret: {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } = {} as any;\n\n if(folderId > 1) {\n const promises: Promise[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.appMessagesManager.filtersStorage.reloadMissingPeerIds(folderId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n ret.cached = false;\n ret.promise = Promise.all(promises).then(() => {\n return this.getDialogs(query, offsetIndex, limit, folderId, skipMigrated).promise;\n });\n\n return ret;\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId = folderId > 1 || this.getOffsetDate(folderId) ? GLOBAL_FOLDER_ID : folderId;\n let curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n\n const indexStr = this.getDialogIndexKey(folderId);\n\n if(query) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== folderId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = folderId;\n\n const results = this.dialogsIndex.search(query);\n\n const dialogs: Dialog[] = [];\n for(const peerId in this.dialogs) {\n const dialog = this.dialogs[peerId];\n if(results.has(dialog.peerId) && dialog.folder_id === folderId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => d2[indexStr] - d1[indexStr]);\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n ret.cached = true;\n ret.promise = Promise.resolve({\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n });\n\n return ret;\n }\n\n ret.cached = false;\n ret.promise = this.appMessagesManager.getTopMessages(limit, realFolderId).then(result => {\n //const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n //this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n\n return ret;\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n //this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = this.appPeersManager.getPeerId(peer);\n const dialog = this.dropDialog(peerId)[0];\n if(dialog) {\n if(dialog.pFlags?.pinned) {\n this.handleDialogUnpinning(dialog, folder_id);\n }\n\n dialog.folder_id = folder_id;\n this.generateIndexForDialog(dialog);\n this.pushDialog(dialog); // need for simultaneously updatePinnedDialogs\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n });\n };\n\n private onUpdateDialogPinned = (update: Update.updateDialogPinned) => {\n const folderId = update.folder_id ?? 0;\n //this.log('updateDialogPinned', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter\n /* if(update.folder_id > 1) {\n const filter = this.filtersStorage.filters[update.folder_id];\n if(update.pFlags.pinned) {\n filter.pinned_peers.unshift(peerId);\n } else {\n filter.pinned_peers.findAndSplice(p => p === peerId);\n }\n } */\n\n if(dialog) {\n if(!update.pFlags.pinned) {\n this.handleDialogUnpinning(dialog, folderId);\n } else { // means set\n dialog.pFlags.pinned = true;\n }\n\n this.generateIndexForDialog(dialog);\n } \n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? 0;\n \n const handleOrder = (order: PeerId[]) => {\n this.pinnedOrders[folderId].length = 0;\n order.reverse(); // index must be higher\n order.forEach((peerId) => {\n newPinned[peerId] = true;\n \n const dialog = this.getDialogOnly(peerId);\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n if(!dialog) {\n return;\n }\n \n dialog.pFlags.pinned = true;\n this.generateIndexForDialog(dialog);\n });\n \n const dialogs = this.getFolderDialogs(folderId, false);\n for(const dialog of dialogs) {\n if(!dialog.pFlags.pinned) {\n break;\n }\n\n const peerId = dialog.peerId;\n if(!newPinned[peerId]) {\n this.appMessagesManager.scheduleHandleNewDialogs(peerId);\n }\n }\n };\n\n //this.log('updatePinnedDialogs', update);\n const newPinned: {[peerId: PeerId]: true} = {};\n if(!update.order) {\n apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n handleOrder(dialogsResult.dialogs.map(d => d.peerId));\n\n /* dialogsResult.dialogs.forEach((dialog) => {\n newPinned[dialog.peerId] = true;\n });\n\n this.dialogsStorage.getFolder(folderId).forEach((dialog) => {\n const peerId = dialog.peerId;\n if(dialog.pFlags.pinned && !newPinned[peerId]) {\n this.newDialogsToHandle[peerId] = {reload: true};\n this.scheduleHandleNewDialogs();\n }\n }); */\n });\n\n return;\n }\n\n //this.log('before order:', this.dialogsStorage[0].map(d => d.peerId));\n\n handleOrder(update.order.map(peer => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { copy, safeReplaceObject } from \"../../helpers/object\";\nimport type { DialogFilter, Update } from \"../../layer\";\nimport type { Modify } from \"../../types\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\n//import type { ApiManagerProxy } from \"../mtproto/mtprotoworker\";\nimport type _rootScope from \"../rootScope\";\nimport type {AppMessagesManager, Dialog} from '../appManagers/appMessagesManager';\nimport type {AppNotificationsManager} from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { forEachReverse } from \"../../helpers/array\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\n\nexport type MyDialogFilter = Modify;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'], \n ['exclude_peers', 'excludePeerIds'], \n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\n// ! because 0 index is 'All Chats'\nconst START_ORDER_INDEX = 1;\n\nexport default class FiltersStorage {\n public filters: {[filterId: string]: MyDialogFilter};\n private orderIndex: number;\n private reloadedPeerIds: Set;\n\n constructor(private appMessagesManager: AppMessagesManager,\n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager, \n private appNotificationsManager: AppNotificationsManager, \n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager, \n /* private apiManager: ApiManagerProxy, */ \n private rootScope: typeof _rootScope) {\n this.clear();\n this.filters = {};\n\n this.appStateManager.getState().then((state) => {\n safeReplaceObject(this.filters, state.filters);\n\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n if(filter.hasOwnProperty('orderIndex') && filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n\n /* this.appMessagesManager.dialogsStorage.folders[+filterId] = {\n dialogs: []\n }; */\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: (update) => {\n //console.warn('updateDialogFilters', update);\n\n const oldFilters = copy(this.filters);\n\n this.getDialogFilters(true).then(filters => {\n for(const _filterId in oldFilters) {\n const filterId = +_filterId;\n if(!filters.find(filter => filter.id === filterId)) { // * deleted\n this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});\n }\n }\n\n this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map(filter => filter.id)});\n });\n },\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach(arr => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(this.appPeersManager.getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n }\n\n public clear(init = false) {\n if(!init) {\n safeReplaceObject(this.filters, {});\n }\n\n this.orderIndex = START_ORDER_INDEX;\n this.reloadedPeerIds = new Set();\n }\n\n private onUpdateDialogFilter = (update: Update.updateDialogFilter) => {\n if(update.filter) {\n this.saveDialogFilter(update.filter as any);\n } else if(this.filters[update.id]) { // Папка удалена\n //this.getDialogFilters(true);\n this.rootScope.dispatchEvent('filter_delete', this.filters[update.id]);\n delete this.filters[update.id];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n //console.log('updateDialogFilterOrder', update);\n\n this.orderIndex = START_ORDER_INDEX;\n update.order.forEach((filterId, idx) => {\n const filter = this.filters[filterId];\n delete filter.orderIndex;\n this.setOrderIndex(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', update.order);\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n public testDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && dialog.folder_id === 1) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted) {\n const isMuted = this.appNotificationsManager.isPeerLocalMuted(peerId);\n if(isMuted) {\n return false;\n }\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n \n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n \n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n \n if(!wasPinned) {\n if(filter.pinned_peers.length >= this.rootScope.config.pinned_infolder_count_max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n \n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n \n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map(i => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n //console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.orderIndex;\n f.push(filter);\n }\n\n filter.orderIndex = START_ORDER_INDEX;\n\n const order = f.sort((a, b) => a.orderIndex - b.orderIndex).map(filter => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n }\n\n return bool;\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n public reloadMissingPeerIds(filterId: number) {\n const promises: Promise[] = [];\n const filter = this.getFilter(filterId);\n const pinnedPeers = filter?.pinned_peers;\n if(pinnedPeers?.length) {\n const reloadDialogs = pinnedPeers.filter((inputPeer, idx) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n return !this.reloadedPeerIds.has(peerId) && !this.appMessagesManager.getDialogOnly(peerId);\n });\n\n if(reloadDialogs.length) {\n const reloadPromises = reloadDialogs.map(inputPeer => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer);\n promise.then(() => {\n this.reloadedPeerIds.add(peerId);\n });\n return promise;\n });\n const reloadPromise = Promise.all(reloadPromises);\n promises.push(reloadPromise);\n }\n }\n\n return promises.length ? Promise.all(promises) : undefined;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length && !overwrite) {\n return keys.map(filterId => this.filters[filterId]).sort((a, b) => a.orderIndex - b.orderIndex);\n }\n\n const filters: MyDialogFilter[] = await apiManager.invokeApiSingle('messages.getDialogFilters') as any;\n for(const filter of filters) {\n this.saveDialogFilter(filter, overwrite);\n }\n\n //console.log(this.filters);\n return filters;\n }\n\n public saveDialogFilter(filter: MyDialogFilter, update = true) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n convertment.forEach(([from, to]) => {\n filter[to] = filter[from].map((peer) => this.appPeersManager.getPeerId(peer));\n });\n\n this.filterIncludedPinnedPeers(filter);\n \n filter.include_peers = filter.pinned_peers.concat(filter.include_peers);\n filter.includePeerIds = filter.pinnedPeerIds.concat(filter.includePeerIds);\n\n const oldFilter = this.filters[filter.id];\n if(oldFilter) {\n Object.assign(oldFilter, filter);\n } else {\n this.filters[filter.id] = filter;\n }\n \n this.setOrderIndex(filter);\n \n if(update) {\n this.rootScope.dispatchEvent('filter_update', filter);\n } else if(!oldFilter) {\n this.rootScope.dispatchEvent('filter_new', filter);\n }\n }\n\n public setOrderIndex(filter: MyDialogFilter) {\n if(filter.hasOwnProperty('orderIndex')) {\n if(filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n } else {\n filter.orderIndex = this.orderIndex++ as DialogFilter['orderIndex'];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\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, join, LangPackKey } from \"../lib/langPack\";\r\nimport formatDuration, { DurationType } from \"./formatDuration\";\r\n\r\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\r\n s: 'Seconds',\r\n m: 'Minutes',\r\n h: 'Hours',\r\n d: 'Days',\r\n w: 'Weeks'\r\n};\r\nexport default function formatCallDuration(duration: number) {\r\n const a = formatDuration(duration, 2);\r\n const elements = a.map(d => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\r\n\r\n const fragment = document.createElement('span');\r\n fragment.append(...join(elements, false));\r\n\r\n return fragment;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type DurationType = 's' | 'm' | 'h' | 'd' | 'w';\r\nexport default function formatDuration(duration: number, showLast = 2) {\r\n if(!duration) {\r\n duration = 1;\r\n }\r\n\r\n let d: {duration: number, type: DurationType}[] = [];\r\n const p = [\r\n {m: 1, t: 's'},\r\n {m: 60, t: 'm'}, \r\n {m: 60, t: 'h'}, \r\n {m: 24, t: 'd'}, \r\n {m: 7, t: 'w'}\r\n ] as Array<{m?: number, t: DurationType}>\r\n const s = 1;\r\n let t = s;\r\n p.forEach((o, idx) => {\r\n t *= o.m;\r\n\r\n if(duration < t) {\r\n return;\r\n }\r\n\r\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\r\n d.push({\r\n duration: (duration / t % modulus | 0),\r\n type: o.t\r\n });\r\n });\r\n\r\n const out = d.slice(-showLast).reverse();\r\n for(let i = out.length - 1; i >= 0; --i) {\r\n if(out[i].duration === 0) {\r\n out.splice(i, 1);\r\n }\r\n }\r\n \r\n return out;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { LazyLoadQueueBase } from \"../../components/lazyLoadQueue\";\nimport ProgressivePreloader from \"../../components/preloader\";\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\nimport { formatDateAccordingToTodayNew, formatTime, tsNow } from \"../../helpers/date\";\nimport { createPosterForVideo } from \"../../helpers/files\";\nimport { copy, getObjectKeysAndSort } from \"../../helpers/object\";\nimport { randomLong } from \"../../helpers/random\";\nimport { splitStringByLength, limitSymbols, escapeRegExp } from \"../../helpers/string\";\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 } from \"../../layer\";\nimport { InvokeApiOptions } from \"../../types\";\nimport I18n, { FormatterArguments, i18n, join, langPack, LangPackKey, _i18n } from \"../langPack\";\nimport { logger, LogTypes } from \"../logger\";\nimport type { ApiFileManager } from '../mtproto/apiFileManager';\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport DialogsStorage, { GLOBAL_FOLDER_ID } from \"../storages/dialogs\";\nimport FiltersStorage from \"../storages/filters\";\n//import { telegramMeWebService } from \"../mtproto/mtproto\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager, { ChatRights } from \"./appChatsManager\";\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport appPollsManager from \"./appPollsManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport appWebPagesManager from \"./appWebPagesManager\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport appProfileManager from \"./appProfileManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport SlicedArray, { Slice, SliceEnd } from \"../../helpers/slicedArray\";\nimport appNotificationsManager, { NotifyOptions } from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport { forEachReverse, indexOfAndSplice } from \"../../helpers/array\";\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\nimport htmlToSpan from \"../../helpers/dom/htmlToSpan\";\nimport { MUTE_UNTIL, NULL_PEER_ID, REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\nimport appAvatarsManager from \"./appAvatarsManager\";\nimport telegramMeWebManager from \"../mtproto/telegramMeWebManager\";\nimport { getMiddleware } from \"../../helpers/middleware\";\nimport assumeType from \"../../helpers/assumeType\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport type { MediaSize } from \"../../helpers/mediaSizes\";\nimport IMAGE_MIME_TYPES_SUPPORTED from \"../../environment/imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"../../environment/videoMimeTypesSupport\";\n\n//console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude\n};\n\nexport type HistoryResult = {\n count: number,\n history: Slice,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty' \n | 'inputMessagesFilterPhotos' \n | 'inputMessagesFilterPhotoVideo' \n | 'inputMessagesFilterVideo' \n | 'inputMessagesFilterDocument' \n | 'inputMessagesFilterVoice' \n | 'inputMessagesFilterRoundVoice' \n | 'inputMessagesFilterRoundVideo' \n | 'inputMessagesFilterMusic' \n | 'inputMessagesFilterUrl' \n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\nexport class AppMessagesManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n public groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n public pinnedMessages: {[peerId: PeerId]: PinnedStorage};\n\n public threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage\n }\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise, \n callback: (message: any) => Promise\n }>\n }\n } = {};\n \n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise = null;\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newMessagesHandleTimeout = 0;\n private newMessagesToHandle: {[peerId: PeerId]: Set} = {};\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: {[peerId: PeerId]: Dialog} = {};\n public newUpdatesAfterReloadToHandle: {[peerId: PeerId]: Set} = {};\n\n private notificationsHandlePromise = 0;\n private notificationsToHandle: {[peerId: PeerId]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise;\n private reloadConversationsPeers: Map}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n public dialogsStorage: DialogsStorage;\n public filtersStorage: FiltersStorage;\n\n private groupedTempId = 0;\n\n private typings: {[peerId: PeerId]: {type: SendMessageAction['_'], timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[peerId: PeerId]: SlicedArray} = {};\n private goToNextMentionPromises: {[peerId: PeerId]: Promise} = {};\n\n constructor() {\n this.clear();\n\n rootScope.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages\n });\n\n // ! Invalidate notify settings, can optimize though\n rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: Dialog) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => dialog.peerId.isBroadcast();\n else filterFunc = (dialog) => appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach(dialog => {\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage', \n webpage: appWebPagesManager.getWebPage(id)\n };\n\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n });\n });\n\n rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n if(threadId) return;\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n if(!threadId) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !appMessagesIdsManager.getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog(dialog);\n }\n\n rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft,\n index: dialog.index\n });\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n rootScope.addEventListener('poll_update', ({poll}) => {\n const set = appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n });\n \n appStateManager.getState().then(state => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear() {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear();\n this.filtersStorage && this.filtersStorage.clear();\n }\n\n public construct() {\n this.filtersStorage = new FiltersStorage(this, appPeersManager, appUsersManager, appNotificationsManager, appStateManager, apiUpdatesManager, /* apiManager, */ rootScope);\n this.dialogsStorage = new DialogsStorage(this, appChatsManager, appPeersManager, appUsersManager, appDraftsManager, appNotificationsManager, appStateManager, apiUpdatesManager, serverTimeManager, appMessagesIdsManager);\n }\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: any) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ?? (this.tempFinalizeCallbacks[tempId] = {});\n const obj = finalize[callbackName] ?? (finalize[callbackName] = {deferred: deferredPromise()});\n\n obj.callback = callback;\n\n return obj.deferred;\n }\n\n public editMessage(message: any, text: string, options: Partial<{\n noWebPage: true,\n newMedia: any,\n scheduleDate: number,\n entities: MessageEntity[]\n }> = {}): Promise {\n /* if(!this.canEditMessage(messageId)) {\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\n } */\n\n const {mid, peerId} = message;\n\n if(message.pFlags.is_outgoing) {\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\n //this.log('invoke editMessage callback', message);\n return this.editMessage(message, text, options);\n });\n }\n\n let entities = options.entities || [];\n if(text) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return apiManager.invokeApi('messages.editMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n \n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public sendText(peerId: PeerId, text: string, options: Partial<{\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n scheduleDate: number,\n silent: true\n }> = {}) {\n if(!text.trim()) {\n return;\n }\n\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const MAX_LENGTH = rootScope.config.message_length_max;\n if(text.length > MAX_LENGTH) {\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n\n if(splitted.length > 1) {\n delete options.webPage;\n }\n\n for(let i = 1; i < splitted.length; ++i) {\n setTimeout(() => {\n this.sendText(peerId, splitted[i], options);\n }, i);\n }\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n let entities = options.entities || [];\n if(!options.viaBotId) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n //entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError(false);\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent\n }, 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 const newMessage = copy(message);\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n // Testing bad situations\n // var upd = angular.copy(updates)\n // updates.updates.splice(0, 1)\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n // $timeout(function () {\n // ApiUpdatesManager.processUpdateMessage(upd)\n // }, 5000)\n }, (/* error: any */) => {\n toggleError(true);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n }\n\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 threadId: number,\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n duration: number,\n background: true,\n silent: true,\n clearDraft: true,\n scheduleDate: number,\n noSound: boolean,\n\n waveform: Uint8Array,\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n let attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage\n },\n waveform: options.waveform,\n duration: options.duration || 0\n };\n\n attributes.push(attribute);\n } else if(!options.isMedia) {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n } else if(isPhoto) {\n attachType = 'photo';\n apiFileName = 'photo.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadPhotoAction';\n\n const photoSize = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n \n photo = appPhotosManager.savePhoto(photo);\n } else if(VIDEO_MIME_TYPES_SUPPORTED.has(fileType)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage,\n supports_streaming: true\n }, \n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound && \n file.size > (10 * 1024) && \n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = appDownloadManager.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n \n document = appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const preloader = isDocument ? undefined : new ProgressivePreloader({\n attachMethod: 'prepend',\n tryAgainOnFail: false,\n isUpload: true\n });\n\n const sentDeferred = deferredPromise();\n\n if(preloader) {\n preloader.attachPromise(sentDeferred);\n sentDeferred.cancel = () => {\n const error = new Error('Download canceled');\n error.name = 'AbortError';\n sentDeferred.reject(error);\n };\n\n sentDeferred.catch(err => {\n if(err.name === 'AbortError' && !uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n if(uploadPromise?.cancel) {\n uploadPromise.cancel();\n }\n }\n });\n }\n\n const media = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n preloader,\n photo,\n document,\n promise: sentDeferred\n };\n\n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file \n } as MessageMedia.messageMediaDocument : media as any;\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const {id, access_hash, file_reference} = file as MyDocument;\n\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id,\n access_hash,\n file_reference\n }\n };\n \n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n uploadPromise = appDownloadManager.upload(file);\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL) {\n thumbUploadPromise = new Promise((resolve, reject) => {\n const thumbPromise = options.thumb && options.thumb.blob ? Promise.resolve(options.thumb) : createPosterForVideo(options.objectURL);\n thumbPromise.then(thumb => {\n if(!thumb) {\n resolve(null);\n } else {\n appDownloadManager.upload(thumb.blob).then(resolve, reject);\n }\n }, reject);\n });\n }\n \n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n // @ts-ignore\n delete message.media.preloader;\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto', \n file: inputFile,\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument', \n file: inputFile, \n mime_type: fileType, \n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' ? true : undefined,\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n \n sentDeferred.resolve(inputMedia);\n }, (/* error */) => {\n toggleError(true);\n });\n \n uploadPromise.addNotifyListener((progress: {done: number, total: number}) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0});\n }\n sentDeferred.notifyAll(progress);\n });\n\n return sentDeferred;\n };\n\n if(options.isGroupedItem) {\n load();\n } else {\n this.sendSmthLazyLoadQueue.push({\n load\n });\n }\n }\n\n return sentDeferred;\n };\n\n this.beforeMessageSending(message, {\n isGroupedItem: options.isGroupedItem, \n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then(inputMedia => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n return apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n if(attachType === 'photo' &&\n error.code === 400 &&\n (error.type === 'PHOTO_INVALID_DIMENSIONS' ||\n error.type === 'PHOTO_SAVE_FILE_INVALID')) {\n error.handled = true;\n attachType = 'document';\n message.send();\n return;\n }\n\n toggleError(true);\n });\n });\n }\n\n return {message, promise: sentDeferred};\n }\n\n public async sendAlbum(peerId: PeerId, files: File[], options: Partial<{\n isMedia: true,\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n caption: string,\n sendFileDetails: Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumbBlob: Blob,\n thumbURL: string\n }>[],\n silent: true,\n clearDraft: true,\n scheduleDate: number\n }> = {}) {\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(files.length === 1) {\n return this.sendFile(peerId, files[0], {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', files, options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const messages = files.map((file, idx) => {\n const details = options.sendFileDetails[idx];\n const o: Parameters[2] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n groupId,\n ...details\n };\n\n if(idx === 0) {\n o.caption = caption;\n o.entities = entities;\n //o.replyToMsgId = replyToMsgId;\n }\n\n return this.sendFile(peerId, file, o).message;\n });\n\n if(options.clearDraft) {\n setTimeout(() => {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }, 0);\n }\n \n // * test pending\n //return;\n\n const toggleError = (message: any, on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n messages.forEach(message => toggleError(message, true));\n });\n }\n });\n };\n\n const promises: Promise[] = messages.map((message) => {\n return (message.send() as Promise).then((inputMedia) => {\n return apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n });\n })\n .then(messageMedia => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = appPhotosManager.getMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = appDocsManager.saveDoc(messageMedia.document);\n inputMedia = appDocsManager.getMediaInput(doc);\n }\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: any) => {\n if(err.name === 'AbortError') {\n return null;\n }\n\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, true);\n throw err;\n });\n });\n\n Promise.all(promises).then(inputs => {\n invoke(inputs.filter(Boolean));\n });\n }\n\n public sendOther(peerId: PeerId, inputMedia: InputMedia, options: Partial<{\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n scheduleDate: number,\n silent: true,\n geoPoint: GeoPoint\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n });\n\n const {poll, results} = appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n \n // @ts-ignore\n case 'messageMediaPending': {\n media = inputMedia;\n break;\n }\n }\n\n message.media = media;\n\n let toggleError = (on: boolean) => {\n /* const historyMessage = this.messagesForHistory[messageId];\n if (on) {\n message.error = true\n if (historyMessage) {\n historyMessage.error = true\n }\n } else {\n delete message.error\n if (historyMessage) {\n delete historyMessage.error\n }\n } */\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMedia', {\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n message: '',\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n toggleError(true);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n }\n\n /* private checkSendOptions(options: Partial<{\n scheduleDate: number\n }>) {\n if(options.scheduleDate) {\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(options.scheduleDate <= minTimestamp) {\n delete options.scheduleDate;\n }\n }\n } */\n\n private beforeMessageSending(message: Message.message, options: Partial<{\n isGroupedItem: true, \n isScheduled: true, \n threadId: number, \n clearDraft: true\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n\n if(options.isScheduled) {\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n setTimeout(() => {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: messageId});\n }, 0);\n } else {\n /* if(options.threadId && this.threadsStorage[peerId]) {\n delete this.threadsStorage[peerId][options.threadId];\n } */\n const storages: HistoryStorage[] = [\n this.getHistoryStorage(peerId),\n options.threadId ? this.getHistoryStorage(peerId, options.threadId) : undefined\n ];\n\n for(const storage of storages) {\n if(storage) {\n storage.history.unshift(messageId);\n }\n }\n\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n setTimeout(() => {\n rootScope.dispatchEvent('history_append', {storage, peerId, mid: messageId});\n }, 0);\n }\n\n this.pendingByRandomId[message.random_id] = {\n peerId, \n tempId: messageId, \n threadId: options.threadId, \n storage\n };\n\n if(!options.isGroupedItem && message.send) {\n setTimeout(() => {\n if(options.clearDraft) {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n }, 0);\n }\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: Partial<{\n scheduleDate: number,\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: this.generateFromId(peerId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor, \n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + serverTimeManager.serverTimeOffset),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true,\n };\n\n return message;\n }\n\n private generateReplyHeader(replyToMsgId: number, replyToTopId?: number) {\n const header = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n } as MessageReplyHeader;\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(appPeersManager.isBroadcast(peerId)) {\n const channelFull = appProfileManager.chatsFull[peerId.toChatId()] as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(peerId.isAnyChat() && (peerId.isBroadcast() || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return appPeersManager.getOutputPeer(appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!appPeersManager.isChannel(peerId) && !appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = appUsersManager.getSelf().id.toPeerId();\n if(originalMessage.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 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.from_id = appPeersManager.getOutputPeer(originalMessage.fromId);\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n if(appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n \n // * there is no way to detect whether user profile is hidden\n if(peerId === myId) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message = {\n _: 'messageService',\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n } as Message.messageService;\n\n this.getMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n return peerId.isAnyChat() && appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(message: MyMessage, dialog: MTDialog.dialog = this.getDialogOnly(message.peerId)) {\n if(dialog) {\n dialog.top_message = message.mid;\n \n const historyStorage = this.getHistoryStorage(message.peerId);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n \n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = appPeersManager.getPeerId(dialog.peer);\n const mid = appMessagesIdsManager.generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n \n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach(dialog => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\n const result = await this.getTopMessages(100, GLOBAL_FOLDER_ID);\n if(!middleware() || result.isEnd) {\n break;\n }\n }\n }\n\n /* public async getConversationsAll(query = '', folderId = 0) {\n const limit = 200, outDialogs: Dialog[] = [];\n for(; folderId < 2; ++folderId) {\n let offsetIndex = 0;\n for(;;) {\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\n \n if(dialogs.length) {\n outDialogs.push(...dialogs);\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\n } else {\n break;\n }\n }\n }\n\n return outDialogs;\n } */\n\n public getConversations(query = '', offsetIndex?: number, limit?: number, folderId = 0, skipMigrated?: boolean) {\n return this.dialogsStorage.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n }\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId) {\n const chatHistoryStorage = this.getHistoryStorage(peerId);\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n } else {\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages(limit: number, folderId: number, offsetDate?: number) {\n //const dialogs = this.dialogsStorage.getFolder(folderId);\n let offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n if(offsetDate === undefined) {\n offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n }\n\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += serverTimeManager.serverTimeOffset;\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n const params: MessagesGetDialogs = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n };\n\n return apiManager.invokeApiSingle('messages.getDialogs', params, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }).then((dialogsResult) => {\n if(!middleware() || dialogsResult._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', dialogsResult.dialogs, {...dialogsResult.dialogs[0]});\n }\n\n /* if(!offsetDate) {\n telegramMeWebService.setAuthorized(true);\n } */\n\n // can reset pinned order here\n if(!offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!offsetDate) {\n telegramMeWebManager.setAuthorized(true);\n }\n\n appUsersManager.saveApiUsers(dialogsResult.users);\n appChatsManager.saveApiChats(dialogsResult.chats);\n this.saveMessages(dialogsResult.messages);\n\n /* if(folderId === 0 && !offsetDate) {\n const found = dialogsResult.dialogs.find(dialog => appPeersManager.getPeerId(dialog.peer) === -1325963535);\n if(!found) {\n debugger;\n }\n } */\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: {[peerId: PeerId]: Dialog} = {};\n const setFolderId = folderId === GLOBAL_FOLDER_ID ? 0 : folderId;\n const saveGlobalOffset = folderId === GLOBAL_FOLDER_ID;\n forEachReverse((dialogsResult.dialogs as Dialog[]), dialog => {\n //const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(dialog.folder_id === undefined) {\n dialog.folder_id = setFolderId;\n }\n\n this.dialogsStorage.saveDialog(dialog, undefined, true, saveGlobalOffset);\n\n if(!maxSeenIdIncremented &&\n !appPeersManager.isChannel(dialog.peerId || appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n if(dialog.peerId === undefined) {\n return;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId, d);\n } */\n\n if(offsetIndex && dialog.index > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!appMessagesIdsManager.getServerMessageId(dialog.read_inbox_max_id) && !appMessagesIdsManager.getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs[dialog.peerId] = dialog;\n\n this.log.error('noIdsDialogs', dialog, params);\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId);\n } */\n }\n });\n\n const keys = Object.keys(noIdsDialogs);\n if(keys.length) {\n //setTimeout(() => { // test bad situation\n const peerIds = keys.map(key => key.toPeerId());\n const promises = peerIds.map(peerId => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n \n for(let i = 0; i < peerIds.length; ++i) {\n rootScope.dispatchEvent('dialog_unread', {peerId: peerIds[i]});\n }\n });\n //}, 10e3);\n }\n\n const count = (dialogsResult as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n if(appMessagesIdsManager.getServerMessageId(folderDialogs[i].top_message)) {\n ++dialogsLength;\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */ \n !count || \n dialogsLength >= count ||\n !dialogsResult.dialogs.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n rootScope.dispatchEvent('dialogs_multiupdate', {});\n }\n\n const dialogs = (dialogsResult as MessagesDialogs.messagesDialogsSlice).dialogs;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1], \n count, \n dialogs: slicedDialogs\n };\n });\n }\n\n public forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: Partial<{\n withMyScore: true,\n silent: true,\n scheduleDate: number,\n dropAuthor: boolean,\n dropCaptions: boolean\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMessages = mids.map(mid => {\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n\n const keys: Array = [\n 'entities', \n 'media', \n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n keys.forEach(key => {\n // @ts-ignore\n message[key] = originalMessage[key];\n });\n\n const document = (message.media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n const types: MyDocument['type'][] = ['round', 'voice'];\n if(types.includes(document.type)) {\n (message as MyMessage).pFlags.media_unread = true;\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ?? (groups[originalMessage.grouped_id] = {tempId: '' + ++this.groupedTempId, messages: []});\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach(message => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach(message => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n random_id: newMessages.map(message => message.random_id),\n to_peer: appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n return promise;\n }\n\n public generateEmptyMessage(mid: number): Message.messageEmpty {\n return {\n _: 'messageEmpty',\n id: appMessagesIdsManager.getServerMessageId(mid),\n mid,\n deleted: true,\n pFlags: {}\n };\n }\n\n public getMessageFromStorage(storage: MessagesStorage, mid: number) {\n return storage && storage.get(mid) || this.generateEmptyMessage(mid);\n }\n\n private createMessageStorage() {\n const storage: MessagesStorage = new Map();\n \n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num, \n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ?? (this.messagesStorageByPeerId[peerId] = this.createMessageStorage());\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogByPeerId(peerId: PeerId): [Dialog, number] | [] {\n return this.dialogsStorage.getDialog(peerId);\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise;\n if(inputPeer !== undefined) {\n const peerId = appPeersManager.getPeerId(inputPeer);\n let obj = this.reloadConversationsPeers.get(peerId);\n if(obj) {\n promise = obj.promise;\n }\n\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n this.reloadConversationsPeers.set(peerId, obj = {\n inputDialogPeer: appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = new Promise((resolve, reject) => {\n setTimeout(() => {\n const inputDialogPeers: InputDialogPeer[] = [];\n const promises: {[peerId: string]: typeof promise} = {};\n for(const [peerId, {inputDialogPeer, promise}] of this.reloadConversationsPeers) {\n inputDialogPeers.push(inputDialogPeer);\n promises[peerId] = promise;\n }\n\n this.reloadConversationsPeers.clear();\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n promises[peerId].resolve(undefined);\n }\n };\n\n apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers}).then((result) => {\n this.dialogsStorage.applyDialogs(result);\n\n result.dialogs.forEach((dialog) => {\n const peerId = dialog.peerId;\n if(peerId) {\n promises[peerId].resolve(dialog as Dialog);\n delete promises[peerId];\n }\n });\n\n fullfillLeft();\n resolve();\n }, (err) => {\n fullfillLeft();\n reject(err);\n }).finally(() => {\n this.reloadConversationsPromise = null;\n\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n }, 0);\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peer: InputPeer, just_clear?: boolean, revoke?: boolean): Promise {\n return apiManager.invokeApiSingle('messages.deleteHistory', {\n just_clear,\n revoke,\n peer,\n max_id: 0\n }).then((affectedHistory) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peer, just_clear, revoke);\n });\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean) {\n if(appPeersManager.isChannel(peerId)) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = promise instanceof Promise ? await promise : promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: appChatsManager.getChannelInput(channelId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(appPeersManager.getInputPeerById(peerId), justClear, revoke).then(() => {\n [\n this.historiesStorage, \n this.threadsStorage, \n this.searchesStorage, \n this.pinnedMessages,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach(s => {\n delete s[peerId];\n });\n\n const m = this.needSingleMessages.get(peerId);\n if(m) {\n m.clear();\n }\n\n [\n this.messagesStorageByPeerId,\n this.scheduledMessagesStorage\n ].forEach(s => {\n const ss = s[peerId];\n if(ss) {\n ss.clear();\n }\n });\n \n if(justClear) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n } else {\n delete this.notificationsToHandle[peerId];\n delete this.typings[peerId];\n \n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n });\n }\n\n public onPeerDeleted(peerId: number) {\n\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessage(peerId: PeerId) {\n const p = this.pinnedMessages[peerId] ?? (this.pinnedMessages[peerId] = {});\n if(p.promise) return p.promise;\n else if(p.maxId) return Promise.resolve(p);\n\n return p.promise = this.getSearch({\n peerId, \n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: 0,\n limit: 1\n }).then(result => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(updates => {\n //this.log('pinned updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: appPeersManager.getInputPeerById(peerId)\n }).then(affectedHistory => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getMessagesStorage(peerId);\n storage.forEach((message) => {\n if(message.pFlags.pinned) {\n delete message.pFlags.pinned;\n }\n });\n\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[peerId];\n\n return true;\n }\n\n return this.unpinAllMessages(peerId);\n });\n }\n\n public getAlbumText(grouped_id: string) {\n const group = this.groupedMessagesStorage[grouped_id];\n let foundMessages = 0, message: string, totalEntities: MessageEntity[], entities: MessageEntity[];\n for(const [mid, m] of group) {\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m.message;\n totalEntities = m.totalEntities;\n entities = m.entities;\n } \n }\n\n if(foundMessages > 1) {\n message = undefined;\n totalEntities = undefined;\n entities = undefined;\n }\n\n return {message, entities, totalEntities};\n }\n\n public getMidsByAlbum(grouped_id: string) {\n return getObjectKeysAndSort(this.groupedMessagesStorage[grouped_id], 'asc');\n //return Object.keys(this.groupedMessagesStorage[grouped_id]).map(id => +id).sort((a, b) => a - b);\n }\n\n public getMidsByMessage(message: Message.message) {\n if(message?.grouped_id) return this.getMidsByAlbum(message.grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: any, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return appMessagesIdsManager.generateMessageId(dialog?.top_message || 0, true);\n }\n\n public saveMessage(message: any, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if(message.pFlags === undefined) {\n message.pFlags = {};\n }\n\n if(message._ === 'messageEmpty') {\n message.deleted = true;\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && appChatsManager.isBroadcast(peerId.toChatId());\n\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n \n const mid = appMessagesIdsManager.generateMessageId(message.id);\n message.mid = mid;\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ?? (this.groupedMessagesStorage[message.grouped_id] = new Map());\n storage.set(mid, message);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog && mid) {\n if(mid > dialog[message.pFlags.out\n ? 'read_outbox_max_id'\n : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n if(message.reply_to) {\n if(message.reply_to.reply_to_msg_id) {\n message.reply_to.reply_to_msg_id = message.reply_to_mid = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_msg_id);\n } \n\n if(message.reply_to.reply_to_top_id) message.reply_to.reply_to_top_id = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_top_id);\n }\n\n if(message.replies) {\n if(message.replies.max_id) message.replies.max_id = appMessagesIdsManager.generateMessageId(message.replies.max_id);\n if(message.replies.read_max_id) message.replies.read_max_id = appMessagesIdsManager.generateMessageId(message.replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= serverTimeManager.serverTimeOffset;\n }\n \n //storage.generateIndex(message);\n const myId = appUsersManager.getSelf().id;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = message.fwd_from ? (message.fwd_from.from_id ? appPeersManager.getPeerId(message.fwd_from.from_id) : 0) : myId;\n } else {\n //message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id);\n message.fromId = message.pFlags.post || !message.from_id ? peerId : appPeersManager.getPeerId(message.from_id);\n }\n\n const fwdHeader = message.fwd_from as MessageFwdHeader;\n if(fwdHeader) {\n //if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = appMessagesIdsManager.generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = appMessagesIdsManager.generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = appPeersManager.getPeerId(peer);\n const savedFromMid = appMessagesIdsManager.generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= serverTimeManager.serverTimeOffset;\n }\n }\n\n if(message.via_bot_id > 0) {\n message.viaBotId = message.via_bot_id;\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n if(message.media) {\n switch(message.media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(message.media.ttl_seconds) {\n message.media = {_: 'messageMediaUnsupportedWeb'};\n } else {\n message.media.photo = appPhotosManager.savePhoto(message.media.photo, mediaContext);\n }\n\n if(!message.media.photo) { // * found this bug on test DC\n delete message.media;\n }\n \n break;\n }\n \n case 'messageMediaPoll': {\n const result = appPollsManager.savePoll(message.media.poll, message.media.results, message);\n message.media.poll = result.poll;\n message.media.results = result.results;\n break;\n }\n \n case 'messageMediaDocument': {\n if(message.media.ttl_seconds) {\n message.media = {_: 'messageMediaUnsupportedWeb'};\n } else {\n message.media.document = appDocsManager.saveDoc(message.media.document, mediaContext); // 11.04.2020 warning\n }\n\n break;\n }\n \n case 'messageMediaWebPage': {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n message.media.webpage = appWebPagesManager.saveWebPage(message.media.webpage, messageKey, mediaContext);\n break;\n }\n \n /*case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n\n case 'messageMediaInvoice': {\n message.media = {_: 'messageMediaUnsupportedWeb'};\n break;\n }\n }\n }\n\n if(message.action) {\n const action = message.action as MessageAction;\n let migrateFrom: PeerId;\n let migrateTo: PeerId;\n const suffix = message.fromId === appUsersManager.getSelf().id ? 'You' : '';\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n //case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n \n case 'messageActionGroupCall': {\n //assumeType(action);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n if(peerId !== message.fromId) {\n type += '_by' + suffix;\n }\n } else {\n type = 'ended_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 (message.pFlags.out ? 'out_' : 'in_') +\n (\n action.reason._ === 'phoneCallDiscardReasonMissed' ||\n action.reason._ === 'phoneCallDiscardReasonBusy'\n ? 'missed'\n : 'ok'\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(message.message && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message); \n }\n\n storage.set(mid, message);\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if((messages as any).saved) return;\n (messages as any).saved = true;\n messages.forEach((message) => {\n this.saveMessage(message, options);\n });\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = RichTextProcessor.fixEmoji(message.message, apiEntities);\n\n const myEntities = RichTextProcessor.parseEntities(message.message);\n message.totalEntities = RichTextProcessor.mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): string;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment | string {\n const parts: (HTMLElement | string)[] = [];\n\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement, text?: string) => {\n if(langKey) {\n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n \n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('i');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n\n if(text) {\n parts.push(', ');\n }\n };\n\n if((message as Message.message).media) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = this.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n text = this.getAlbumText(message.grouped_id).message;\n\n if(!withoutMediaType) {\n addPart('AttachAlbum', undefined, text);\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', undefined, message.message);\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : RichTextProcessor.wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n const text = plain ? media.title : RichTextProcessor.wrapEmojiText(media.title);\n addPart('AttachLocation', undefined, text);\n parts.push(htmlToDocumentFragment(text) as any);\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n addPart(undefined, plain ? '📊' + ' ' + (media.poll.question || 'poll') : media.poll.rReply);\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const prefix = '🎮' + ' ';\n addPart(undefined, plain ? prefix + media.game.title : RichTextProcessor.wrapEmojiText(prefix + media.game.title));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n \n if(document.type === 'video') {\n addPart('AttachVideo', undefined, message.message);\n } else if(document.type === 'voice') {\n addPart('AttachAudio', undefined, message.message);\n } else if(document.type === 'gif') {\n addPart('AttachGif', undefined, message.message);\n } else if(document.type === 'round') {\n addPart('AttachRound', undefined, message.message);\n } else if(document.type === 'sticker') {\n if(document.stickerEmojiRaw) {\n addPart(undefined, (plain ? document.stickerEmojiRaw : document.stickerEmoji) + ' ');\n }\n \n addPart('AttachSticker');\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find(attribute => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f), message.message);\n } else {\n addPart(undefined, plain ? document.file_name : RichTextProcessor.wrapEmojiText(document.file_name), message.message);\n }\n \n break;\n }\n \n default:\n //messageText += media._;\n ///////this.log.warn('Got unknown media type!', message);\n break;\n }\n } \n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = this.wrapMessageActionTextNew((message as Message.messageService), plain);\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(plain) {\n parts.push(text);\n } else {\n let entities = RichTextProcessor.parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n if(!entities) entities = [];\n let found = false;\n let match: any;\n let regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\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 entities.sort((a, b) => a.offset - b.offset);\n }\n }\n\n const messageWrapped = RichTextProcessor.wrapRichText(text, {\n noLinebreaks: true, \n entities, \n noLinks: true,\n noTextFormat: true\n });\n \n parts.push(htmlToDocumentFragment(messageWrapped) as any);\n }\n }\n\n if(plain) {\n return parts.join('');\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment;\n }\n }\n\n public wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n \n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ? \n i18n('FromYou') : \n new PeerTitle({\n peerId: message.fromId, \n dialog: message.peerId === rootScope.myId\n }).element\n );\n\n if(appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = new PeerTitle({peerId: message.peerId}).element;\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n }\n\n public 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 public wrapMessageActionTextNew(message: MyMessage, plain: true): string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: false): HTMLElement;\n public wrapMessageActionTextNew(message: MyMessage, plain: boolean): HTMLElement | string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: boolean): HTMLElement | string {\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return RichTextProcessor.wrapPlainText(unsafeMessage);\n } else {\n element.innerHTML = RichTextProcessor.wrapRichText(unsafeMessage, {noLinebreaks: true});\n return element;\n }\n } else {\n let _ = action._;\n //let suffix = '';\n let langPackKey: LangPackKey;\n let args: any[];\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? appPeersManager.getPeerTitle(peerId, plain) + ' ' : (new PeerTitle({peerId})).element;\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You')) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(formatCallDuration(action.duration));\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'ActionGroupCall';\n const myId = appUsersManager.getSelf().id;\n if(peerIds[0] === myId) a += 'You';\n a += 'Invited';\n if(peerIds[1] === myId) a += 'You';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map(peerId => getNameDivHTML(peerId, plain));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey, _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date, \n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n \n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = this.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain),\n ];\n \n if(pinnedMessage.deleted/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n this.fetchMessageReplyTo(message).then(originalMessage => {\n if(!originalMessage.deleted && !message.deleted) {\n rootScope.dispatchEvent('message_edit', {\n storage: this.getMessagesStorage(peerId),\n peerId: peerId,\n mid: message.mid\n });\n\n if(this.isMessageIsTopMessage(message)) {\n rootScope.dispatchEvent('dialogs_multiupdate', {\n [peerId]: this.getDialogOnly(peerId)\n });\n }\n }\n });\n }\n } else {\n const a = document.createElement('i');\n a.dataset.savedFrom = pinnedMessage.peerId + '_' + pinnedMessage.mid;\n a.dir = 'auto';\n a.append(this.wrapMessageForReply(pinnedMessage, undefined, undefined, plain as any));\n args.push(a);\n }\n\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(plain ? action.title : htmlToSpan(RichTextProcessor.wrapEmojiText(action.title)));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users \n || [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n if(plain) {\n args.push(...users.map((userId: UserId) => (getNameDivHTML(userId.toPeerId(), true) as string).trim()).join(', '));\n } else {\n const fragment = document.createElement('span');\n fragment.append(\n ...join(\n users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), false)) as HTMLElement[],\n false\n )\n );\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = RichTextProcessor.wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n if(plain) {\n return I18n.format(langPackKey, true, args);\n } else {\n return _i18n(element, langPackKey, args);\n }\n\n //str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return apiManager.invokeApiSingle('messages.report', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return apiManager.invokeApi('messages.startBot', {\n bot: appUsersManager.getUserInput(botId),\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(appChatsManager.isChannel(chatId)) {\n promise = appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error) => {\n if(error && error.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n const bot = appUsersManager.getUser(botId);\n return this.sendText(peerId, str + '@' + bot.username);\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map(peerId => {\n return {\n _: 'inputFolderPeer',\n peer: appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then(updates => {\n //this.log('editPeerFolders updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public toggleDialogPin(peerId: PeerId, filterId?: number) {\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = filterId === 1 ? rootScope.config.pinned_infolder_count_max : rootScope.config.pinned_dialogs_count_max;\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n }\n\n return apiManager.invokeApi('messages.toggleDialogPin', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n }\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return apiManager.invokeApi('messages.markDialogUnread', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = appChatsManager.getChat(migrateFrom.toChatId());\n if(fromChat &&\n fromChat.migrated_to &&\n fromChat.migrated_to.channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n //setTimeout(() => {\n rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n //}, 100);\n }\n }\n }\n\n private canMessageBeEdited(message: any, kind: 'text' | 'poll') {\n if(message.pFlags.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(message._ !== 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && appUsersManager.isBot(message.fromId)) {\n return false;\n }\n \n if(message.media &&\n message.media._ === 'messageMediaDocument' &&\n (message.media.document.sticker || message.media.document.type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public canEditMessage(message: any, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === appUsersManager.getSelf().id) {\n return true;\n }\n\n if((message.date < (tsNow(true) - rootScope.config.edit_time_limit) && \n message.media?._ !== 'messageMediaPoll') || !message.pFlags.out) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() \n || message.fromId === rootScope.myId \n || appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' \n || appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && !message.pFlags.is_outgoing;\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n let messageReplyMarkup = (message as Message.message).reply_markup;\n if(!messageReplyMarkup &&\n !message.pFlags?.out &&\n !(message as Message.messageService).action) {\n return false;\n }\n\n if(messageReplyMarkup?._ === 'replyInlineMarkup') {\n return false;\n }\n\n const lastReplyMarkup = historyStorage.replyMarkup;\n if(messageReplyMarkup) {\n if(lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n\n if(messageReplyMarkup.pFlags.selective) {\n return false;\n }\n\n if(historyStorage.maxOutId &&\n message.mid < historyStorage.maxOutId &&\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.single_use) {\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.hidden = true;\n }\n\n messageReplyMarkup.mid = message.mid;\n /* messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup); */\n\n if(messageReplyMarkup._ !== 'replyKeyboardHide') {\n messageReplyMarkup.fromId = appPeersManager.getPeerId(message.from_id);\n }\n\n historyStorage.replyMarkup = messageReplyMarkup;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n if(message.pFlags.out) {\n if(lastReplyMarkup) {\n assumeType(lastReplyMarkup);\n if(lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.pFlags.is_outgoing) &&\n (message as Message.message).message) {\n lastReplyMarkup.pFlags.hidden = true;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n } else if(!historyStorage.maxOutId ||\n message.mid > historyStorage.maxOutId) {\n historyStorage.maxOutId = message.mid;\n }\n }\n\n assumeType(message);\n if(message.action?._ === 'messageActionChatDeleteUser' &&\n (lastReplyMarkup\n ? message.action.user_id === (lastReplyMarkup as ReplyMarkup.replyKeyboardMarkup).fromId\n : appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(peerId: PeerId, filters: MessagesFilter[], canCache = true) {\n const func = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n return func('messages.getSearchCounters', {\n peer: appPeersManager.getInputPeerById(peerId),\n filters\n });\n }\n\n public filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage, limit: number) {\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [], \n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n excludeDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = storage.get(history[i]);\n if(!message) continue;\n \n //|| (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n \n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc && ((neededDocTypes.length && !neededDocTypes.includes(doc.type)) \n || excludeDocTypes.includes(doc.type))) {\n continue;\n }\n \n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find(e => goodEntities.includes(e._)) || RichTextProcessor.matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] && \n message.action && \n ([\n 'messageActionChannelEditPhoto' as const, \n 'messageActionChatEditPhoto' as const, \n 'messageActionChannelEditVideo' as const, \n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find(flag => message.pFlags[flag])) {\n found = true;\n } */\n \n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n //this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n //const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ? \n this.getSearchStorage(peerId, inputFilter._) as any : \n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilter(inputFilter._, storage.history.slice, this.getMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId) || 0\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n //var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n let offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n //offsetDate = offsetMessage.date + serverTimeManager.serverTimeOffset;\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n appUsersManager.saveApiUsers(searchResult.users);\n appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter(mid => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = appMessagesIdsManager.getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: appMessagesIdsManager.generateMessageId(maxMessageId, true),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n } \n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(result => {\n appChatsManager.saveApiChats(result.chats);\n appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.filterMessages(result.messages[0], message => !!(message as Message.message).replies)[0] as Message.message;\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n \n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n result.max_id = historyStorage.maxId = appMessagesIdsManager.generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = appMessagesIdsManager.generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = appMessagesIdsManager.generateMessageId(result.read_outbox_max_id) || 0;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(peerId: PeerId, mid: number) {\n if(this.newMessagesToHandle[peerId] === undefined) {\n this.newMessagesToHandle[peerId] = new Set();\n }\n\n this.newMessagesToHandle[peerId].add(mid);\n if(!this.newMessagesHandleTimeout) {\n this.newMessagesHandleTimeout = window.setTimeout(this.handleNewMessages, 0);\n }\n }\n\n private handleNewMessages = () => {\n clearTimeout(this.newMessagesHandleTimeout);\n this.newMessagesHandleTimeout = 0;\n\n rootScope.dispatchEvent('history_multiappend', this.newMessagesToHandle);\n this.newMessagesToHandle = {};\n };\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const obj = this.newDialogsToHandle;\n for(const peerId in obj) {\n const dialog = obj[peerId];\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n delete obj[peerId];\n } else {\n this.dialogsStorage.pushDialog(dialog);\n if(!appPeersManager.isChannel(peerId.toPeerId())) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n }\n }\n\n //this.log('after order:', this.dialogsStorage[0].map(d => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n this.newDialogsToHandle = {};\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog) {\n if(peerId !== undefined) {\n this.newDialogsToHandle[peerId] = dialog;\n }\n\n if(this.newDialogsHandlePromise) return this.newDialogsHandlePromise;\n return this.newDialogsHandlePromise = new Promise((resolve) => {\n setTimeout(() => {\n resolve();\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n }, 0);\n });\n }\n\n public deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const localMessageIds = mids.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = apiManager.invokeApi('channels.deleteMessages', {\n channel: appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n return promise;\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n if(!this.getReadMaxIdIfUnread(peerId, threadId) && !force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readDiscussion', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(threadId),\n read_max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('channels.readHistory', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((affectedMessages) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n appNotificationsManager.soundReset(appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n public fixDialogUnreadMentionsIfNoMessage(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public modifyCachedMentions(peerId: PeerId, mid: number, add: boolean) {\n const slicedArray = this.unreadMentions[peerId];\n if(!slicedArray) return;\n\n if(add) {\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\n slicedArray.insertSlice([mid]);\n }\n } else {\n slicedArray.delete(mid);\n }\n }\n\n 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 return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId);\n }\n\n return this.goToNextMentionPromises[peerId] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n rootScope.dispatchEvent('history_focus', {peerId, mid});\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[peerId];\n });\n }\n\n public loadNextMentions(peerId: PeerId) {\n const slicedArray = this.unreadMentions[peerId];\n const maxId = slicedArray.first[0] || 1;\n\n const backLimit = 50;\n const add_offset = -backLimit;\n const limit = backLimit;\n return this.getUnreadMentions(peerId, maxId, add_offset, limit).then(messages => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n public getUnreadMentions(peerId: PeerId, offsetId: number, add_offset: number, limit: number, maxId = 0, minId = 0) {\n return apiManager.invokeApiSingle('messages.getUnreadMentions', {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: appMessagesIdsManager.getServerMessageId(maxId),\n min_id: appMessagesIdsManager.getServerMessageId(minId)\n }).then(messagesMessages => {\n assumeType>(messagesMessages);\n appUsersManager.saveApiUsers(messagesMessages.users);\n appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = apiManager.invokeApi('channels.readMessageContents', {\n channel: appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n //threadId = this.getLocalMessageId(threadId);\n if(!this.threadsStorage[peerId]) this.threadsStorage[peerId] = {};\n return this.threadsStorage[peerId][threadId] ?? (this.threadsStorage[peerId][threadId] = {count: null, history: new SlicedArray()});\n }\n\n return this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {count: null, history: new SlicedArray()});\n }\n\n private handleNotifications = () => {\n window.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = 0;\n\n //var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n //const timeout = 1000;\n\n for(const _peerId in this.notificationsToHandle) {\n const peerId = _peerId.toPeerId();\n if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n continue;\n }\n\n const notifyPeerToHandle = this.notificationsToHandle[peerId];\n\n Promise.all([\n appNotificationsManager.getNotifyPeerTypeSettings(),\n appNotificationsManager.getNotifySettings(appPeersManager.getInputNotifyPeerById(peerId, true))\n ]).then(([_, peerTypeNotifySettings]) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if(appNotificationsManager.isPeerLocalMuted(peerId, true) || !topMessage.pFlags.unread) {\n return;\n }\n\n //setTimeout(() => {\n if(topMessage.pFlags.unread) {\n this.notifyAboutMessage(topMessage, {\n fwdCount: notifyPeerToHandle.fwdCount,\n peerTypeNotifySettings\n });\n }\n //}, timeout);\n });\n }\n\n this.notificationsToHandle = {};\n };\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n //this.log('AMM updateMessageID:', update, pendingData);\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message = this.getMessageFromStorage(storage, mid);\n if(!message.deleted) {\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n this.finalizePendingMessageCallbacks(storage, tempId, message);\n } else {\n this.pendingByMessageId[mid] = randomId;\n }\n }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getMessagesStorage(peerId);\n const dialog = this.getDialogOnly(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: new Map()});\n\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n if(threadId && !isLocalThreadUpdate && this.threadsStorage[peerId] && this.threadsStorage[peerId][threadId]) {\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n this.onUpdateNewMessage(update);\n }\n\n if(!dialog && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n const set = this.newUpdatesAfterReloadToHandle[peerId] ?? (this.newUpdatesAfterReloadToHandle[peerId] = new Set());\n if(set.has(update)) {\n this.log.error('here we go again', peerId);\n return;\n }\n\n this.scheduleHandleNewDialogs(peerId);\n set.add(update);\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 if(historyStorage.history.findSlice(message.mid)) {\n return false;\n }\n\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 if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? appMessagesIdsManager.getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId)\n };\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n }\n\n if(!pendingMessage) {\n this.handleNewMessage(peerId, message.mid);\n }\n\n if(isLocalThreadUpdate) {\n return;\n }\n \n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n if(dialog) {\n if(inboxUnread) {\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 this.setDialogTopMessage(message, dialog);\n }\n\n if(inboxUnread/* && ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE) */) {\n const notifyPeer = peerId;\n let notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\n if(notifyPeerToHandle === undefined) {\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\n }\n\n if(notifyPeerToHandle.fromId !== fromId) {\n notifyPeerToHandle.fromId = fromId;\n notifyPeerToHandle.fwdCount = 0;\n }\n\n if((message as Message.message).fwd_from) {\n ++notifyPeerToHandle.fwdCount;\n }\n\n notifyPeerToHandle.topMessage = message;\n\n if(!this.notificationsHandlePromise) {\n this.notificationsHandlePromise = window.setTimeout(this.handleNotifications, 0);\n }\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n //this.log('updateDialogUnreadMark', update);\n const peerId = appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n if(!dialog) {\n this.scheduleHandleNewDialogs(peerId);\n } else {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(!update.pFlags.unread) {\n delete dialog.pFlags.unread_mark;\n } else {\n dialog.pFlags.unread_mark = true;\n }\n\n releaseUnreadCount();\n rootScope.dispatchEvent('dialogs_multiupdate', {[peerId]: dialog});\n this.dialogsStorage.setDialogToState(dialog);\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const storage = this.getMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n \n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog && dialog.top_message === mid;\n if((message as Message.message).clear_history) {\n if(isTopMessage) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n }\n } else {\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n\n if(isTopMessage || (message as Message.message).grouped_id) {\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n updatedDialogs[peerId] = dialog;\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox \n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox \n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' || update._ === 'updateReadChannelOutbox' || update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const storage = this.getMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n //this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n appUsersManager.forceUserOnline(peerId);\n }\n\n if(threadId) {\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n\n const releaseUnreadCount = !threadId && foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n\n for(let i = 0, length = history.length; i < length; i++) {\n const mid = history[i];\n if(mid > maxId) {\n continue;\n }\n \n const message: MyMessage = storage.get(mid);\n\n if(message.pFlags.out !== isOut) {\n continue;\n }\n\n if(!message.pFlags.unread) {\n break;\n }\n\n if(threadId) {\n const replyTo = message.reply_to;\n if(!replyTo || (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) !== threadId) {\n continue;\n }\n }\n \n // this.log.warn('read', messageId, message.pFlags.unread, message)\n if(message.pFlags.unread) {\n delete message.pFlags.unread;\n if(!foundAffected) {\n foundAffected = true;\n }\n\n if(!message.pFlags.out && !threadId && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n \n appNotificationsManager.cancel('msg' + mid);\n }\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(!threadId && foundDialog) {\n if(isOut) foundDialog.read_outbox_max_id = maxId;\n else foundDialog.read_inbox_max_id = maxId;\n\n if(!isOut) {\n let setCount: number;\n if(stillUnreadCount !== undefined) {\n setCount = stillUnreadCount;\n } else if(newUnreadCount < 0 || !this.getReadMaxIdIfUnread(peerId)) {\n setCount = 0;\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\n setCount = newUnreadCount;\n }\n\n if(setCount !== undefined) {\n foundDialog.unread_count = setCount;\n }\n\n if(newUnreadMentionsCount < 0) {\n foundDialog.unread_mentions_count = 0;\n }\n }\n\n if(releaseUnreadCount) {\n releaseUnreadCount();\n }\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n \n rootScope.dispatchEvent('dialog_unread', {peerId});\n this.dialogsStorage.setDialogToState(foundDialog);\n }\n\n if(foundAffected) {\n rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid));\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const mids = (update as Update.updateReadMessagesContents).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.getMessageById(mids[0]).peerId;\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(!message.deleted) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n \n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n }\n }\n\n rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = appMessagesIdsManager.generateMessageId(update.available_min_id);\n const messages = history.filter(mid => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n //const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.getMessageById(messages[0]).peerId;\n \n if(!peerId) {\n return;\n }\n\n apiManager.clearCache('messages.getSearchCounters', (params) => {\n return appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(threadKey && this.threadsStorage[peerId] && this.threadsStorage[peerId][+threadKey.split('_')[1]]) {\n threadKeys.add(threadKey);\n }\n }\n \n const historyUpdated = this.handleDeletedMessages(peerId, this.getMessagesStorage(peerId), messages);\n\n const threadsStorages = Array.from(threadKeys).map(threadKey => {\n const [peerId, mid] = threadKey.split('_');\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\n });\n\n const historyStorage = this.getHistoryStorage(peerId);\n [historyStorage].concat(threadsStorages).forEach(historyStorage => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n \n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const foundDialog = this.getDialogOnly(peerId);\n if(foundDialog) {\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n \n if(historyUpdated.unreadMentions) {\n foundDialog.unread_mentions_count = Math.max(0, foundDialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(historyUpdated.unread) {\n foundDialog.unread_count = Math.max(0, foundDialog.unread_count - historyUpdated.unread);\n }\n\n if(affected) {\n releaseUnreadCount();\n rootScope.dispatchEvent('dialog_unread', {peerId});\n }\n\n if(historyUpdated.msgs.has(foundDialog.top_message)) {\n const slice = historyStorage.history.first;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n const mid = slice[0];\n const message = this.getMessageByPeer(peerId, mid);\n this.setDialogTopMessage(message, foundDialog);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n };\n\n private onUpdateChannel = (update: Update.updateChannel) => {\n const channelId = update.channel_id;\n const peerId = channelId.toPeerId(true);\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n\n const needDialog = appChatsManager.isInChat(channelId);\n \n const canViewHistory = !!channel.username || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n \n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n rootScope.dispatchEvent('history_forbidden', peerId);\n }\n \n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n this.dialogsStorage.dropDialog(peerId);\n\n delete this.historiesStorage[peerId];\n this.reloadConversation(peerId).then(() => {\n rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n \n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.channel_id.toPeerId(true);\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message: Message.message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && message.views !== undefined && message.views < views) {\n message.views = views;\n rootScope.dispatchEvent('message_views', {peerId, mid, views});\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n //this.log('updateServiceNotification', update);\n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: appPeersManager.getOutputPeer(fromId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + serverTimeManager.serverTimeOffset,\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!appUsersManager.hasUser(fromId)) {\n appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updatePinnedMessages).peer);\n\n /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned');\n if(storage.count !== storage.history.length) {\n if(storage.count !== undefined) {\n delete this.searchesStorage[peerId]['inputMessagesFilterPinned']; \n }\n\n rootScope.broadcast('peer_pinned_messages', peerId);\n break;\n } */\n\n const messages = update.messages.map(id => appMessagesIdsManager.generateMessageId(id)); \n\n const storage = this.getMessagesStorage(peerId);\n const missingMessages = messages.filter(mid => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map(mid => this.wrapSingleMessage(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n //storage.history.push(mid);\n const message = storage.get(mid);\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n //storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n //storage.history.findAndSplice(_mid => _mid === mid);\n const message = storage.get(mid);\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n \n delete this.pinnedMessages[peerId];\n appStateManager.getState().then(state => {\n delete state.hiddenPinnedMessages[peerId];\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n if(peer._ === 'notifyPeer') {\n const peerId = appPeersManager.getPeerId((peer as NotifyPeer.notifyPeer).peer);\n \n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialog.notify_settings = notify_settings;\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(!oldMessage.deleted) {\n this.handleEditedMessage(oldMessage, newMessage);\n rootScope.dispatchEvent('message_edit', {storage, peerId, mid: message.mid});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: message.mid});\n }\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map(id => appMessagesIdsManager.generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\n if(this.isMessageIsTopMessage(message)) {\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\n }\n }\n\n public isMessageIsTopMessage(message: MyMessage) {\n const dialog = this.getDialogOnly(message.peerId);\n return dialog && dialog.top_message === message.mid;\n }\n\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\n try { // * на всякий случай, скорее всего это не понадобится\n const threadKey = this.getThreadKey(threadMessage);\n if(threadKey) {\n const repliesKey = this.threadsToReplies[threadKey];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n } catch(err) {\n this.log.error('incrementMessageReplies err', err, threadMessage);\n }\n }\n\n private getThreadKey(threadMessage: MyMessage) {\n let threadKey = '';\n if(threadMessage.peerId?.isAnyChat() && threadMessage.reply_to) {\n const threadId = threadMessage.reply_to.reply_to_top_id || threadMessage.reply_to.reply_to_msg_id;\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.wrapSingleMessage(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid);\n\n if(broadcastEventName) {\n rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n \n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n rootScope.dispatchEvent('history_update', {storage: pendingData.storage, peerId: message.peerId, mid: message.mid});\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(peerId: PeerId, mute?: boolean) {\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n if(mute === undefined) {\n mute = !appNotificationsManager.isPeerLocalMuted(peerId, false);\n }\n \n settings.mute_until = mute ? MUTE_UNTIL : 0;\n\n return appNotificationsManager.updateNotifySettings({\n _: 'inputNotifyPeer',\n peer: appPeersManager.getInputPeerById(peerId)\n }, settings);\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(peerId.isAnyChat()) {\n //const isChannel = appPeersManager.isChannel(peerId);\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n const hasRights = /* isChannel && */appChatsManager.hasRights(peerId.toChatId(), action, undefined, !!threadId); \n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n // this.log('pdata', randomID, pendingData)\n\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(!tempMessage.deleted) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n rootScope.dispatchEvent('messages_pending');\n \n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n //this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n //this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = appDownloadManager.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = appDownloadManager.getCacheContext(photo, 'full');\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = appPhotosManager.getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const doc = appDocsManager.getDoc('' + tempId);\n if(doc) {\n if(/* doc._ !== 'documentEmpty' && */doc.type && doc.type !== 'sticker' && doc.mime_type !== 'image/gif') {\n const cacheContext = appDownloadManager.getCacheContext(newDoc);\n const oldCacheContext = appDownloadManager.getCacheContext(doc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = appDocsManager.getInputFileName(newDoc);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete appPollsManager.polls[tempId];\n delete appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n \n this.handleReleasingMessage(tempMessage, storage);\n\n rootScope.dispatchEvent('message_sent', {storage, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n appStateManager.pushToState('maxSeenMsgId', maxId);\n\n apiManager.invokeApi('messages.receivedMessages', {\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n increment: true\n }).then(views => {\n const updates: Update[] = new Array(mids.length);\n const channelId = peerId.toChatId();\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: channelId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n const notification: NotifyOptions = {};\n const peerString = appPeersManager.getPeerString(peerId);\n let notificationMessage: string;\n\n if(options.peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && options.fwdCount) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [options.fwdCount]);\n } else {\n notificationMessage = this.wrapMessageForReply(message, undefined, undefined, true);\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n notification.title = appPeersManager.getPeerTitle(peerId, true);\n if(peerId.isAnyChat() && message.fromId !== message.peerId) {\n notification.title = appPeersManager.getPeerTitle(message.fromId, true) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = RichTextProcessor.wrapPlainText(notification.title);\n\n notification.onclick = () => {\n rootScope.dispatchEvent('history_focus', {peerId, mid: message.mid});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;//message.pFlags.silent || false;\n\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').loadPromise.then(url => {\n if(message.pFlags.unread) {\n notification.image = url;\n appNotificationsManager.notify(notification);\n }\n });\n } else {\n appNotificationsManager.notify(notification);\n }\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ?? (this.scheduledMessagesStorage[peerId] = this.createMessageStorage());\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId): Promise {\n if(!this.canSendToPeer(peerId)) return Promise.resolve([]);\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return Promise.resolve([...storage.keys()]);\n }\n\n return apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then(historyResult => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n \n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n \n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.filterMessages(message, message => !!(message as Message.message).replies)[0] as any;\n if(!(message && message.replies && message.replies.pFlags.comments && message.replies.channel_id !== '777')) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && !appChatsManager.isInChat(peerId.toChatId());\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n let historyResult = this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n if(historyResult instanceof Promise) {\n historyResult = await historyResult;\n }\n\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(peerId, historyResult.history[i]);\n }\n\n return historyStorage;\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n public getHistory(peerId: PeerId, maxId = 0, limit: number, backLimit?: number, threadId?: number): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n let offset = 0;\n /* \n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map(message => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: haveSlice.slice,\n offsetIdOffset: haveSlice.offsetIdOffset\n }; \n }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n return {\n count: historyStorage.count,\n history: slice?.slice || historyStorage.history.constructSlice(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(slicedArray: SlicedArray, \n historyResult: Parameters[0], \n offset_id: number, \n limit: number, \n add_offset: number) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually. \n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && appMessagesIdsManager.getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n \n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise {\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n historyStorage.maxId = slice[0]; // ! WARNING\n }\n \n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise> {\n //console.trace('requestHistory', peerId, maxId, limit, offset);\n\n //rootScope.broadcast('history_request');\n\n const options: any = {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n options.msg_id = appMessagesIdsManager.getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if(appPeersManager.isChannel(peerId)) {\n apiUpdatesManager.addChannelState(peerId.toChatId(), (historyResult as MessagesMessages.messagesChannelMessages).pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && historyResult.messages[length - 1].deleted) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch (error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(peerId.toChatId());\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = new Promise((resolve) => {\n setTimeout(() => {\n const requestPromises: Promise[] = [];\n \n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: appMessagesIdsManager.getServerMessageId(mid)\n };\n });\n \n let promise: Promise;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n promise = apiManager.invokeApiSingle('channels.getMessages', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then(getMessagesResult => {\n assumeType>(getMessagesResult);\n\n appUsersManager.saveApiUsers(getMessagesResult.users);\n appChatsManager.saveApiChats(getMessagesResult.chats);\n this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < getMessagesResult.messages.length; ++i) {\n const message = getMessagesResult.messages[i];\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(getMessagesResult.messages[i]);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n \n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n Promise.all(requestPromises).finally(() => {\n this.fetchSingleMessagesPromise = null;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n resolve();\n });\n }, 0);\n });\n }\n\n public wrapSingleMessage(peerId: PeerId, mid: number, overwrite = false): Promise {\n const message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && !overwrite) {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public fetchMessageReplyTo(message: MyMessage): Promise {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.wrapSingleMessage(replyToPeerId, message.reply_to_mid).then(originalMessage => {\n if(originalMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\n delete message.reply_to_mid; // ! WARNING!\n }\n\n return originalMessage;\n });\n }\n\n public setTyping(peerId: PeerId, action: SendMessageAction): Promise {\n let typing = this.typings[peerId];\n if(!rootScope.myId || \n !peerId || \n !this.canSendToPeer(peerId) || \n peerId === rootScope.myId ||\n typing?.type === 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 type: action._\n };\n\n return apiManager.invokeApi('messages.setTyping', {\n peer: appPeersManager.getInputPeerById(peerId),\n action\n }).finally(() => {\n if(typing === this.typings[peerId]) {\n typing.timeout = window.setTimeout(() => {\n delete this.typings[peerId];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number, \n unread: number, \n unreadMentions: number, \n msgs: Set,\n albums?: {[groupId: string]: Set},\n } = {\n count: 0, \n unread: 0, \n unreadMentions: 0, \n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(message.deleted) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n appNotificationsManager.cancel('msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n\n const peerMessagesToHandle = this.newMessagesToHandle[peerId];\n if(peerMessagesToHandle && peerMessagesToHandle.has(mid)) {\n peerMessagesToHandle.delete(mid);\n }\n }\n\n if(history.albums) {\n for(const groupId in history.albums) {\n rootScope.dispatchEvent('album_edit', {peerId, groupId, deletedMids: [...history.albums[groupId]]});\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n \n private handleEditedMessage(oldMessage: Message, newMessage: Message) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n }\n }\n\n public getMediaFromMessage(message: any) {\n return message.action ? \n message.action.photo : \n message.media && (\n message.media.photo || \n message.media.document || (\n message.media.webpage && (\n message.media.webpage.document || \n message.media.webpage.photo\n )\n )\n );\n }\n\n public isMentionUnread(message: MyMessage) {\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return message.pFlags.media_unread && \n message.pFlags.mentioned && \n (\n !doc || \n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n );\n }\n\n public getDialogUnreadCount(dialog: Dialog) {\n return dialog.unread_count || +!!dialog.pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog) {\n return !!this.getDialogUnreadCount(dialog);\n }\n}\n\nconst appMessagesManager = new AppMessagesManager();\nMOUNT_CLASS_TO.appMessagesManager = appMessagesManager;\nexport default appMessagesManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cleanUsername(username: string) {\r\n return username && username.toLowerCase() || '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { filterUnique, indexOfAndSplice } from \"../../helpers/array\";\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\nimport cleanSearchText from \"../../helpers/cleanSearchText\";\nimport cleanUsername from \"../../helpers/cleanUsername\";\nimport { tsNow } from \"../../helpers/date\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport { safeReplaceObject, isObject } from \"../../helpers/object\";\nimport { Chat, InputContact, InputMedia, InputUser, User as MTUser, UserProfilePhoto, UserStatus } from \"../../layer\";\nimport I18n, { i18n, LangPackKey } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager {\n private storage = appStateManager.storages.users;\n \n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: UserId};\n private contactsIndex: SearchIndex;\n private contactsFillPromise: CancellablePromise;\n private contactsList: Set;\n private updatedContactsList: boolean;\n \n private getTopPeersPromises: {[type in TopPeerType]?: Promise};\n\n constructor() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n rootScope.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= serverTimeManager.serverTimeOffset;\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } //////else console.warn('No user by id:', userId);\n },\n\n updateUserPhoto: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n\n if(update.photo._ === 'userProfilePhotoEmpty') {\n delete user.photo;\n } else {\n user.photo = safeReplaceObject(user.photo, update.photo);\n }\n\n this.setUserToStateIfNeeded(user);\n\n rootScope.dispatchEvent('user_update', userId);\n rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n } else console.warn('No user by id:', userId);\n },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n \n this.saveApiUser(Object.assign({}, user, {\n first_name: update.first_name,\n last_name: update.last_name,\n username: update.username\n }), true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n appStateManager.getState().then((state) => {\n const users = appStateManager.storagesResults.users;\n if(users.length) {\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(user) {\n this.users[user.id] = user;\n }\n }\n }\n\n const contactsList = state.contactsList;\n if(contactsList && Array.isArray(contactsList)) {\n contactsList.forEach(userId => {\n this.pushContact(userId);\n });\n\n if(contactsList.length) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n \n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const users = appStateManager.storagesResults.users;\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!appStateManager.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n if(user.username) {\n delete this.usernames[cleanUsername(user.username)];\n }\n\n users.findAndSplice((user) => user.id === userId);\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n \n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n }\n\n private onContactsModified() {\n const contactsList = [...this.contactsList];\n appStateManager.pushToState('contactsList', contactsList);\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise>();\n apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n \n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified();\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise || (this.contactsFillPromise = promise)\n };\n }\n\n public resolveUsername(username: string): Promise {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n if(this.usernames[username]) {\n return Promise.resolve(this.users[this.usernames[username]]);\n }\n\n return apiManager.invokeApi('contacts.resolveUsername', {username}).then(resolvedPeer => {\n this.saveApiUsers(resolvedPeer.users);\n appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return appPeersManager.getPeer(appPeersManager.getPeerId(resolvedPeer.peer));\n });\n }\n\n public pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n appStateManager.requestPeerSingle(id.toPeerId(), 'contact');\n }\n\n public popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n appStateManager.releaseSinglePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n user.username,\n user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then(_contactsList => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter(id => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId1).status);\n const status2 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = rootScope.myId.toUserId();\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters[0], \n includeSaved?: Parameters[1], \n sortBy?: Parameters[2]) {\n return this.getContacts(query, includeSaved, sortBy).then(userIds => {\n return userIds.map(userId => userId.toPeerId(false));\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: appPeersManager.getInputPeerById(peerId)\n }).then(value => {\n if(value) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n 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 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] = userId;\n }\n }\n\n if(!oldUser \n || oldUser.initials === undefined \n || oldUser.sortName === undefined \n || oldUser.first_name !== user.first_name \n || oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false); \n user.initials = RichTextProcessor.getAbbreviation(fullName);\n } else {\n user.sortName = oldUser.sortName;\n user.initials = oldUser.initials;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= serverTimeManager.serverTimeOffset;\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n let changedPhoto = false, changedTitle = false;\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n if(user.first_name !== oldUser.first_name \n || user.last_name !== oldUser.last_name \n || user.username !== oldUser.username) {\n changedTitle = true;\n }\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n \n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n }\n\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', user.id.toPeerId());\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());\n }\n\n this.setUserToStateIfNeeded(user);\n }\n\n public setUserToStateIfNeeded(user: User) {\n if(appStateManager.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n status = this.getUser(status).status;\n }\n\n if(status) {\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\n if(expires) {\n return expires;\n }\n\n /* const timeNow = tsNow(true);\n switch(status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n } */\n switch(status._) {\n case 'userStatusRecently':\n return 3;\n case 'userStatusLastWeek':\n return 2;\n case 'userStatusLastMonth':\n return 1;\n }\n }\n\n return 0;\n }\n\n public getUser(id: User | UserId) {\n if(isObject(id)) {\n return id;\n }\n\n return this.users[id] || {id, pFlags: {deleted: true}, access_hash: ''} as User;\n }\n\n public getSelf() {\n return this.getUser(rootScope.myId);\n }\n\n public getUserStatusString(id: UserId): HTMLElement {\n let key: LangPackKey;\n let args: any[];\n\n switch(id) {\n case REPLIES_PEER_ID:\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID:\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(this.isBot(id)) {\n key = 'Bot';\n break;\n }\n\n const user = this.getUser(id);\n if(!user) {\n key = '' as any;\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n \n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n \n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n \n case 'userStatusOffline': {\n const date = user.status.was_online;\n const now = Date.now() / 1000;\n \n if((now - date) < 60) {\n key = 'Peer.Status.justNow';\n } else if((now - date) < 3600) {\n key = 'Peer.Status.minAgo';\n const c = (now - date) / 60 | 0;\n args = [c];\n } else if(now - date < 86400) {\n key = 'LastSeen.HoursAgo';\n const c = (now - date) / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const d = new Date(date * 1000);\n args = [('0' + d.getDate()).slice(-2) + '.' + ('0' + (d.getMonth() + 1)).slice(-2), \n ('0' + d.getHours()).slice(-2) + ':' + ('0' + d.getMinutes()).slice(-2)];\n }\n \n break;\n }\n \n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n \n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n \n return i18n(key, args);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n \n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id.toPeerId() !== rootScope.myId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public canSendToUser(id: UserId) {\n const user = this.getUser(id);\n return !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID;\n }\n\n public getUserPhoto(id: UserId) {\n const user = this.getUser(id);\n\n return user && user.photo || {\n _: 'userProfilePhotoEmpty'\n };\n }\n\n public getUserString(id: UserId) {\n const user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n\n public getUserInput(id: UserId): InputUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputUserSelf'};\n }\n\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n public updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n public updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user &&\n user.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n \n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then(userIds => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n //console.log(result);\n this.saveApiUsers(result.users);\n appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = appPeersManager.getPeerId(topPeer.peer);\n appStateManager.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n \n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n appStateManager.pushToState('topPeersCache', state.topPeersCache);\n \n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then(contactsBlocked => {\n this.saveApiUsers(contactsBlocked.users);\n appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map(u => u.id.toPeerId()).concat(contactsBlocked.chats.map(c => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n /* public 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 return apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then(peers => {\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map(p => appPeersManager.getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map(p => appPeersManager.getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, showPhone?: true) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: showPhone\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map(userId => this.getUserInput(userId))\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach(userId => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n}\n\nconst appUsersManager = new AppUsersManager();\nMOUNT_CLASS_TO.appUsersManager = appUsersManager;\nexport default appUsersManager\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto } from \"../../layer\";\r\nimport type { LangPackKey } from \"../langPack\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { isObject } from \"../../helpers/object\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport I18n from '../langPack';\r\n\r\n// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\r\n/*\r\n HTML-color IRC-color Description\r\n #c03d33 4 red\r\n #4fad2d 3 green\r\n #d09306 7 yellow\r\n #168acd 10 blue\r\n #8544d6 6 purple\r\n #cd4073 13 pink\r\n #2996ad 11 sea\r\n #ce671b 5 orange\r\n */\r\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\r\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\r\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\r\n\r\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\r\nexport class AppPeersManager {\r\n /* public savePeerInstance(peerId: PeerId, instance: any) {\r\n if(peerId < 0) appChatsManager.saveApiChat(instance);\r\n else appUsersManager.saveApiUser(instance);\r\n } */\r\n\r\n public canPinMessage(peerId: PeerId) {\r\n return peerId.isUser() || appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\r\n }\r\n\r\n public getPeerPhoto(peerId: PeerId): UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto {\r\n const photo = peerId.isUser() \r\n ? appUsersManager.getUserPhoto(peerId.toUserId())\r\n : appChatsManager.getChatPhoto(peerId.toChatId());\r\n\r\n return photo._ !== 'chatPhotoEmpty' && photo._ !== 'userProfilePhotoEmpty' ? photo : null;\r\n }\r\n\r\n public getPeerMigratedTo(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return false;\r\n }\r\n\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\r\n return this.getPeerId(chat.migrated_to);\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public getPeerTitle(peerId: PeerId, plainText = false, onlyFirstName = false) {\r\n if(!peerId) {\r\n peerId = rootScope.myId;\r\n }\r\n \r\n let title = '';\r\n if(peerId.isUser()) {\r\n const user = appUsersManager.getUser(peerId.toUserId());\r\n if(user.first_name) title += user.first_name;\r\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\r\n \r\n if(!title) title = user.pFlags.deleted ? I18n.format('HiddenName', true) : user.username;\r\n else title = title.trim();\r\n } else {\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n title = chat.title;\r\n\r\n if(onlyFirstName) {\r\n title = title.split(' ')[0];\r\n }\r\n }\r\n \r\n return plainText ? title : RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n public getOutputPeer(peerId: PeerId): Peer {\r\n if(peerId.isUser()) {\r\n return {_: 'peerUser', user_id: peerId.toUserId()};\r\n }\r\n\r\n const chatId = peerId.toChatId();\r\n if(appChatsManager.isChannel(chatId)) {\r\n return {_: 'peerChannel', channel_id: chatId};\r\n }\r\n\r\n return {_: 'peerChat', chat_id: chatId};\r\n }\r\n\r\n public getPeerString(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return appUsersManager.getUserString(peerId.toUserId());\r\n }\r\n return appChatsManager.getChatString(peerId.toChatId());\r\n }\r\n\r\n public getPeerUsername(peerId: PeerId): string {\r\n return this.getPeer(peerId).username || '';\r\n }\r\n\r\n public getPeer(peerId: PeerId) {\r\n return peerId.isUser()\r\n ? appUsersManager.getUser(peerId.toUserId())\r\n : appChatsManager.getChat(peerId.toChatId());\r\n }\r\n\r\n public getPeerId(peerId: Peer | InputPeer | InputChannel | Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping | PeerId | string): PeerId {\r\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'number') return peerId;\r\n else if(isObject(peerId)) {\r\n return (peerId as Peer.peerUser).user_id !== undefined ? \r\n (peerId as Peer.peerUser).user_id.toPeerId() : \r\n ((peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id).toPeerId(true);\r\n // } else if(!peerId) return 'u0';\r\n } else if(!peerId) return 0;\r\n // } else if(!peerId) return '0';\r\n \r\n const isUser = (peerId as string).charAt(0) === 'u';\r\n const peerParams = (peerId as string).substr(1).split('_');\r\n\r\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\r\n }\r\n\r\n public getDialogPeer(peerId: PeerId): DialogPeer {\r\n return {\r\n _: 'dialogPeer',\r\n peer: this.getOutputPeer(peerId)\r\n };\r\n }\r\n\r\n public isChannel(peerId: PeerId): boolean {\r\n return !peerId.isUser() && appChatsManager.isChannel(peerId.toChatId());\r\n }\r\n\r\n public isMegagroup(peerId: PeerId) {\r\n return !peerId.isUser() && appChatsManager.isMegagroup(peerId.toChatId());\r\n }\r\n\r\n public isAnyGroup(peerId: PeerId): boolean {\r\n return !peerId.isUser() && !appChatsManager.isBroadcast(peerId.toChatId());\r\n }\r\n\r\n public isBroadcast(peerId: PeerId): boolean {\r\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\r\n }\r\n\r\n public isBot(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isBot(peerId.toUserId());\r\n }\r\n\r\n public isContact(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isContact(peerId.toUserId());\r\n }\r\n\r\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\r\n return +peerId >= 0;\r\n }\r\n \r\n public isAnyChat(peerId: PeerId) {\r\n return !this.isUser(peerId);\r\n }\r\n\r\n /* public 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 if(!appChatsManager.isChannel(chatId)) {\r\n return appChatsManager.getChatInputPeer(chatId);\r\n } else {\r\n return appChatsManager.getChannelInputPeer(chatId);\r\n }\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n return {\r\n _: 'inputPeerUser',\r\n user_id: userId,\r\n access_hash: appUsersManager.getUser(userId).access_hash\r\n };\r\n }\r\n\r\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\r\n return {\r\n _: 'inputDialogPeer',\r\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\r\n };\r\n }\r\n\r\n public getPeerColorById(peerId: PeerId, pic = true) {\r\n if(!peerId) return '';\r\n\r\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\r\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\r\n return color;\r\n }\r\n\r\n public getPeerSearchText(peerId: PeerId) {\r\n let text: string;\r\n if(this.isUser(peerId)) {\r\n text = '%pu ' + appUsersManager.getUserSearchText(peerId.toUserId());\r\n } else {\r\n const chat = appChatsManager.getChat(peerId.toChatId());\r\n text = '%pg ' + (chat.title || '');\r\n }\r\n\r\n return text;\r\n }\r\n\r\n public getDialogType(peerId: PeerId): PeerType {\r\n if(this.isMegagroup(peerId)) {\r\n return 'megagroup';\r\n } else if(this.isChannel(peerId)) {\r\n return 'channel';\r\n } else if(!this.isUser(peerId)) {\r\n return 'group';\r\n } else {\r\n return peerId === rootScope.myId ? 'saved' : 'chat';\r\n }\r\n }\r\n\r\n public getDeleteButtonText(peerId: PeerId): LangPackKey {\r\n switch(this.getDialogType(peerId)) {\r\n case 'channel':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\r\n\r\n case 'megagroup':\r\n case 'group':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\r\n \r\n default:\r\n return 'ChatList.Context.DeleteChat';\r\n }\r\n }\r\n}\r\n\r\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\r\n\r\n[\r\n 'isChannel',\r\n 'isMegagroup',\r\n 'isAnyGroup',\r\n 'isBroadcast',\r\n 'isBot',\r\n 'isContact',\r\n 'isUser',\r\n 'isAnyChat',\r\n].forEach((value) => {\r\n const newMethod = Array.isArray(value) ? value[0] : value;\r\n const originMethod = Array.isArray(value) ? value[1] : value;\r\n // @ts-ignore\r\n String.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this.toString());\r\n };\r\n\r\n // @ts-ignore\r\n Number.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this);\r\n };\r\n});\r\n\r\ndeclare global {\r\n interface String {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n\r\n interface Number {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n}\r\n\r\nconst appPeersManager = new AppPeersManager();\r\nMOUNT_CLASS_TO.appPeersManager = appPeersManager;\r\nexport default appPeersManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { isObject, safeReplaceObject, copy, deepEqual } from \"../../helpers/object\";\nimport { ChannelParticipant, Chat, ChatAdminRights, ChatBannedRights, ChatParticipant, ChatPhoto, InputChannel, InputChatPhoto, InputFile, InputPeer, Update, Updates } from \"../../layer\";\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager {\n private storage = appStateManager.storages.chats;\n \n private chats: {[id: ChatId]: Chat.channel | Chat.chat | any};\n //private usernames: any;\n //private channelAccess: any;\n //private megagroups: {[id: number]: true};\n\n constructor() {\n this.clear(true);\n\n rootScope.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n apiManagerProxy.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = appPeersManager.getPeerId(update.peer).toChatId();\n const chat: Chat.chat = this.chats[chatId];\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n appStateManager.getState().then((state) => {\n const chats = appStateManager.storagesResults.chats;\n if(chats.length) {\n for(let i = 0, length = chats.length; i < length; ++i) {\n const chat = chats[i];\n if(chat) {\n this.chats[chat.id] = chat;\n }\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const chats = appStateManager.storagesResults.chats;\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!appStateManager.isPeerNeeded(chatId.toPeerId(true))) {\n /* const chat = this.chats[chatId];\n if(chat.username) {\n delete this.usernames[cleanUsername(chat.username)];\n } */\n \n chats.findAndSplice((chat) => chat.id === chatId);\n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n }\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach(chat => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(chat._ === 'chatEmpty') return;\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\n return;\n } */\n \n // * exclude from state\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\n\n const oldChat: Exclude = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n if((chat as Chat.chat).pFlags === undefined) {\n (chat as Chat.chat).pFlags = {};\n }\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n chat.initials = RichTextProcessor.getAbbreviation(chat.title);\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n let changedPhoto = false, changedTitle = false;\n if(oldChat === undefined) {\n this.chats[chat.id] = chat;\n } else {\n const oldPhotoId = ((oldChat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const newPhotoId = ((chat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n if(oldChat.title !== chat.title) {\n changedTitle = true;\n }\n\n safeReplaceObject(oldChat, chat);\n rootScope.dispatchEvent('chat_update', chat.id);\n }\n\n const peerId = chat.id.toPeerId(true);\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', peerId);\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', peerId);\n }\n\n if(appStateManager.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n if(id.isAnyChat()) {\n console.error('chatId should be positive');\n\n if(DEBUG) {\n debugger;\n }\n }\n\n return this.chats[id] || {_: 'chatEmpty', id, deleted: true, access_hash: '', pFlags: {}/* this.channelAccess[id] */};\n }\n\n public combineParticipantBannedRights(id: ChatId, rights: ChatBannedRights) {\n const chat: Chat.channel = this.getChat(id);\n\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(let i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n }\n\n // * creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty') return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n if((chat as Chat.chat).pFlags.creator && rights === undefined) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n (chat as Chat.chat).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n 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 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 return !!myFlags.delete_messages;\n }\n\n case 'pin_messages': {\n return rights._ === 'chatAdminRights' ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n case 'invite_users':\n case 'change_info': {\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 'change_permissions': {\n return rights._ === 'chatAdminRights' && myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\n }\n\n return true;\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat: Chat.chat = this.getChat(id);\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n \n return apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat && chat._ === 'channel' && chat.pFlags.megagroup);\n }\n\n public isBroadcast(id: ChatId) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n\n public isInChat(id: ChatId) {\n let good = true;\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channelForbidden' \n || chat._ === 'chatForbidden' \n || chat._ === 'chatEmpty' \n || (chat as Chat.chat).pFlags.left \n || (chat as Chat.chat).pFlags.kicked \n || (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty' || !(chat as Chat.channel).access_hash) {\n return {\n _: 'inputChannelEmpty'\n };\n } else {\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\n };\n }\n }\n\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: this.getChat(id).access_hash/* || this.channelAccess[id] */ || 0\n };\n }\n\n public hasChat(id: ChatId, allowMin?: true) {\n const chat = this.chats[id];\n return isObject(chat) && (allowMin || !chat.pFlags.min);\n }\n\n public getChatPhoto(id: ChatId) {\n const chat: Chat.chat = this.getChat(id);\n\n return chat && chat.photo || {\n _: 'chatPhotoEmpty'\n };\n }\n\n public getChatString(id: ChatId) {\n const chat = this.getChat(id);\n if(this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = RichTextProcessor.wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(title: string, about: string): Promise {\n return apiManager.invokeApi('channels.createChannel', {\n broadcast: true,\n title,\n about\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: channelId.toPeerId(true)});\n\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map(u => appUsersManager.getUserInput(u));\n\n return apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise {\n return apiManager.invokeApi('messages.createChat', {\n users: userIds.map(u => appUsersManager.getUserInput(u)),\n title\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: chatId.toPeerId(true)});\n\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: any) => {\n //console.log('onChatUpdated', chatId, updates);\n\n apiUpdatesManager.processUpdateMessage(updates);\n if(updates?.updates?.length && this.isChannel(chatId)) {\n rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n //return this.leaveChat(id).then(() => {\n return apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n //});\n }\n\n public migrateChat(id: ChatId): Promise {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find(u => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string) {\n return apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n }).then((bool) => {\n if(bool) {\n const chat: Chat.channel = this.getChat(id);\n chat.username = username;\n }\n\n return bool;\n });\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return apiManager.invokeApi('messages.editChatAbout', {\n peer: appPeersManager.getInputPeerById(peerId),\n about\n }).then(bool => {\n if(bool) {\n rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ? \n appPeersManager.getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) : \n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : this.getParticipantPeerId(participant);\n return apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: appUsersManager.getSelf().id,\n peer: appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n \n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public resolveChannel(id: ChatId) {\n return apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then(messagesChats => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then(channelId => {\n return apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n });\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n}\n\nconst appChatsManager = new AppChatsManager();\nMOUNT_CLASS_TO.appChatsManager = appChatsManager;\nexport default appChatsManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\nimport { bytesFromHex } from \"../../helpers/bytes\";\nimport { CancellablePromise } from \"../../helpers/cancellablePromise\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport { safeReplaceArrayInObject, isObject } from \"../../helpers/object\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { InputFileLocation, InputMedia, InputPhoto, Photo, PhotoSize, PhotosPhotos } from \"../../layer\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager, { ThumbCache } from \"./appDownloadManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport blur from \"../../helpers/blur\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport { makeMediaSize, MediaSize } from \"../../helpers/mediaSizes\";\nimport windowSize from \"../../helpers/windowSize\";\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n//let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n private static jpegHeader = bytesFromHex('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00');\n private static jpegTail = bytesFromHex('ffd9');\n \n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(photo._ === 'photoEmpty') return undefined;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n \n public choosePhotoSize(photo: MyPhoto | MyDocument, boxWidth = 0, boxHeight = 0, useBytes = false, pushDocumentSize = false) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n \n /*\n s\tbox\t100x100\n m\tbox\t320x320\n x\tbox\t800x800\n y\tbox\t1280x1280\n w\tbox\t2560x2560\n a\tcrop\t160x160\n b\tcrop\t320x320\n c\tcrop\t640x640\n d\tcrop\t1280x1280 */\n\n let bestPhotoSize: PhotoSize = {_: 'photoSizeEmpty', type: ''};\n let sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n if(pushDocumentSize && sizes && photo._ === 'document') {\n sizes = sizes.concat({\n _: 'photoSize', \n w: (photo as MyDocument).w, \n h: (photo as MyDocument).h, \n size: (photo as MyDocument).size, \n type: undefined\n });\n }\n\n if(sizes?.length) {\n for(let i = 0, length = sizes.length; i < length; ++i) {\n const photoSize = sizes[i];\n if(!('w' in photoSize) && !('h' in photoSize)) continue;\n \n bestPhotoSize = photoSize;\n \n const size = calcImageInBox(photoSize.w, photoSize.h, boxWidth, boxHeight);\n if(size.width >= boxWidth || size.height >= boxHeight) {\n break;\n }\n }\n\n if(useBytes && bestPhotoSize._ === 'photoSizeEmpty' && sizes[0]._ === 'photoStrippedSize') {\n bestPhotoSize = sizes[0];\n }\n }\n \n return bestPhotoSize;\n }\n \n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = appUsersManager.getUserInput(userId);\n return apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n \n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n public getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker) {\n arr = new Uint8Array(AppPhotosManager.jpegHeader.concat(Array.from(bytes.slice(3)), AppPhotosManager.jpegTail));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n const blob = new Blob([arr], {type: mimeType});\n return URL.createObjectURL(blob);\n }\n\n /**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\n public getPathFromPhotoPathSize(size: PhotoSize.photoPathSize) {\n const bytes = size.bytes;\n const lookup = \"AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,\";\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-'; \n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n }\n\n public getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n return cacheContext.url || (cacheContext.url = this.getPreviewURLFromBytes(thumb.bytes, isSticker));\n }\n \n public getImageFromStrippedThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, useBlur: boolean) {\n const url = this.getPreviewURLFromThumb(photo, thumb, false);\n\n const image = new Image();\n image.classList.add('thumbnail');\n\n const loadPromise = (useBlur ? blur(url) : Promise.resolve(url)).then(url => {\n return renderImageFromUrlPromise(image, url);\n });\n \n return {image, loadPromise};\n }\n \n public setAttachmentSize(\n photo: MyPhoto | MyDocument, \n element: HTMLElement | SVGForeignObjectElement, \n boxWidth: number, \n boxHeight: number, \n noZoom = true, \n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n ) {\n if(!photoSize) {\n photoSize = this.choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n //console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n \n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument) {\n size = makeMediaSize((photo as MyDocument).w || (photoSize as PhotoSize.photoSize).w || 512, (photo as MyDocument).h || (photoSize as PhotoSize.photoSize).h || 512);\n } else {\n size = makeMediaSize((photoSize as PhotoSize.photoSize).w || 100, (photoSize as PhotoSize.photoSize).h || 100);\n }\n\n let boxSize = makeMediaSize(boxWidth, boxHeight);\n\n boxSize = size = size.aspect(boxSize, noZoom);\n\n let isFit = true;\n\n if(!isDocument || ['video', 'gif'].includes((photo as MyDocument).type)) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n \n if(message && \n (message.message || \n message.reply_to_mid || \n message.media.webpage || \n (message.replies && message.replies.pFlags.comments && message.replies.channel_id !== 777)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n \n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n \n return {photoSize, size, isFit};\n }\n\n public getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false): ReturnType {\n if(!cacheContext.downloaded || (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type) || ignoreCache) {\n if(photo._ === 'document' && cacheContext.downloaded && !ignoreCache) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find(size => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return this.getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n }\n \n public getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n //console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n \n // maybe it's a thumb\n const isPhoto = (photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference;\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id, \n location, \n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined, \n queueId, \n onlyCache\n };\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n \n public preloadPhoto(photoId: MyPhoto | MyDocument | string, photoSize?: PhotoSize, queueId?: number, onlyCache?: boolean): CancellablePromise {\n const photo = this.getPhoto(photoId);\n\n // @ts-ignore\n if(!photo || photo._ === 'photoEmpty') {\n throw new Error('preloadPhoto photoEmpty!');\n }\n\n if(!photoSize) {\n const fullWidth = windowSize.windowW;\n const fullHeight = windowSize.windowH;\n \n photoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n }\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n if(cacheContext.downloaded >= ('size' in photoSize ? photoSize.size : 0) && cacheContext.url) {\n return Promise.resolve() as any;\n }\n \n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize, queueId, onlyCache);\n const fileName = getFileNameByLocation(downloadOptions.location);\n\n let download = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n download = appDownloadManager.download(downloadOptions);\n download.then(blob => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n cacheContext.url = url;\n\n //console.log('wrote photo:', photo, photoSize, cacheContext, blob);\n }\n\n return blob;\n }).catch(() => {});\n\n return download;\n }\n \n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n\n public getInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n }\n\n public getMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: this.getInput(photo),\n ttl_seconds: 0\n };\n }\n\n public savePhotoFile(photo: MyPhoto | MyDocument, queueId?: number) {\n const fullPhotoSize = this.choosePhotoSize(photo, 0xFFFF, 0xFFFF);\n if(!(fullPhotoSize._ === 'photoSize' || fullPhotoSize._ === 'photoSizeProgressive')) {\n return;\n }\n\n const downloadOptions = this.getPhotoDownloadOptions(photo, fullPhotoSize, queueId);\n downloadOptions.fileName = 'photo' + photo.id + '.jpg';\n appDownloadManager.downloadToDisc(downloadOptions, downloadOptions.fileName);\n }\n}\n\nconst appPhotosManager = new AppPhotosManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appPhotosManager = appPhotosManager);\nexport default appPhotosManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { i18n } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\n\r\nexport type PeerTitleOptions = {\r\n peerId: PeerId,\r\n plainText?: boolean,\r\n onlyFirstName?: boolean,\r\n dialog?: boolean\r\n};\r\n\r\nconst weakMap: WeakMap = new WeakMap();\r\n\r\nMOUNT_CLASS_TO.peerTitleWeakMap = weakMap;\r\n\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n const elements = Array.from(document.querySelectorAll(`.peer-title[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n const peerTitle = weakMap.get(element);\r\n //console.log('in the summer silence i was doing nothing', peerTitle, peerId);\r\n\r\n if(peerTitle) {\r\n peerTitle.update();\r\n }\r\n });\r\n});\r\n\r\nexport default class PeerTitle {\r\n public element: HTMLElement;\r\n public peerId: PeerId;\r\n public plainText = false;\r\n public onlyFirstName = false;\r\n public dialog = false;\r\n\r\n constructor(options: PeerTitleOptions) {\r\n this.element = document.createElement('span');\r\n this.element.classList.add('peer-title');\r\n this.element.setAttribute('dir', 'auto');\r\n \r\n this.update(options);\r\n weakMap.set(this.element, this);\r\n }\r\n\r\n public update(options?: PeerTitleOptions) {\r\n if(options) {\r\n for(let i in options) {\r\n // @ts-ignore\r\n this.element.dataset[i] = options[i] ? '' + (typeof(options[i]) === 'boolean' ? +options[i] : options[i]) : '0';\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n if(this.peerId !== rootScope.myId || !this.dialog) {\r\n if(this.peerId.isUser() && appUsersManager.getUser(this.peerId).pFlags.deleted) {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Deleted' : 'HiddenName'));\r\n } else {\r\n this.element.innerHTML = appPeersManager.getPeerTitle(this.peerId, this.plainText, this.onlyFirstName);\r\n }\r\n } else {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Saved' : 'SavedMessages'));\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { FileURLType, getFileNameByLocation, getFileURL } from '../../helpers/fileName';\nimport { safeReplaceArrayInObject, defineNotNumerableProperties, isObject } from '../../helpers/object';\nimport { Document, InputFileLocation, InputMedia, PhotoSize } from '../../layer';\nimport referenceDatabase, { ReferenceContext } from '../mtproto/referenceDatabase';\nimport opusDecodeController from '../opusDecodeController';\nimport { RichTextProcessor } from '../richtextprocessor';\nimport appDownloadManager, { DownloadBlob } from './appDownloadManager';\nimport appPhotosManager from './appPhotosManager';\nimport blur from '../../helpers/blur';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { getFullDate } from '../../helpers/date';\nimport rootScope from '../rootScope';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\nconst EXTENSION_MIME_TYPE_MAP = {\n mov: 'video/quicktime',\n gif: 'image/gif',\n pdf: 'application/pdf',\n};\n\nexport class AppDocsManager {\n private docs: {[docId: DocId]: MyDocument} = {};\n private savingLottiePreview: {[docId: DocId]: true} = {};\n public downloading: Map = new Map();\n\n constructor() {\n apiManager.onServiceWorkerFail = this.onServiceWorkerFail;\n }\n\n public onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n const cacheContext = appDownloadManager.getCacheContext(doc);\n delete cacheContext.url;\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(doc._ === 'documentEmpty') {\n return undefined;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n referenceDatabase.saveContext(doc.file_reference, context);\n }\n \n //console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name', \n // 'file', 'duration', 'downloaded', 'url', 'audioTitle', \n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw', \n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n doc.attributes.forEach(attribute => {\n switch(attribute._) {\n case 'documentAttributeFilename':\n doc.file_name = RichTextProcessor.wrapPlainText(attribute.file_name);\n doc.fileName = RichTextProcessor.wrapEmojiText(attribute.file_name);\n break;\n\n case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.audioTitle = RichTextProcessor.wrapEmojiText(attribute.title);\n doc.audioPerformer = RichTextProcessor.wrapEmojiText(attribute.performer);\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n /* if(apiDoc.type === 'audio') {\n apiDoc.supportsStreaming = true;\n } */\n break;\n\n case 'documentAttributeVideo':\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n //apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n\n case 'documentAttributeSticker':\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n doc.stickerEmoji = RichTextProcessor.wrapRichText(doc.stickerEmojiRaw, {noLinks: true, noLinebreaks: true});\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n }\n break;\n\n case 'documentAttributeImageSize':\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n\n case 'documentAttributeAnimated':\n if((doc.mime_type === 'image/gif' || doc.mime_type === 'video/mp4')/* && apiDoc.thumbs */) {\n doc.type = 'gif';\n }\n\n doc.animated = true;\n break;\n }\n });\n \n if(!doc.mime_type) {\n const ext = (doc.file_name || '').split('.').pop();\n // @ts-ignore\n const mappedMimeType = ext && EXTENSION_MIME_TYPE_MAP[ext.toLowerCase()];\n if(mappedMimeType) {\n doc.mime_type = mappedMimeType;\n } else {\n switch(doc.type) {\n case 'gif':\n case 'video':\n case 'round':\n doc.mime_type = 'video/mp4';\n break;\n case 'sticker':\n doc.mime_type = 'image/webp';\n break;\n case 'audio':\n doc.mime_type = 'audio/mpeg';\n break;\n case 'voice':\n doc.mime_type = 'audio/ogg';\n break;\n default:\n doc.mime_type = 'application/octet-stream';\n break;\n }\n }\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.pdf) {\n doc.type = 'pdf';\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.gif) {\n doc.type = 'gif';\n }\n\n if(doc.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n doc.file_name = doc.fileName = doc.type + '_' + getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n }\n\n if(apiManager.isServiceWorkerOnline()) {\n if((doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video'/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n \n const cacheContext = appDownloadManager.getCacheContext(doc);\n if(!cacheContext.url) {\n cacheContext.url = this.getFileURL(doc);\n }\n }\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n \n if(!doc.file_name) {\n doc.file_name = doc.fileName = '';\n }\n\n if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n \n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject(docId) ? docId : this.docs[docId];\n }\n\n public getMediaInput(doc: MyDocument): InputMedia.inputMediaDocument {\n return {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n },\n ttl_seconds: 0\n };\n }\n\n public getInput(doc: MyDocument, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\n return {\n _: 'inputDocumentFileLocation',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference,\n thumb_size: thumbSize\n };\n }\n\n public getFileDownloadOptions(doc: MyDocument, thumb?: PhotoSize.photoSize, queueId?: number, onlyCache?: boolean) {\n const inputFileLocation = this.getInput(doc, thumb?.type);\n\n let mimeType: string;\n if(thumb) {\n mimeType = doc.sticker ? 'image/webp' : 'image/jpeg'/* doc.mime_type */;\n } else {\n mimeType = doc.mime_type || 'application/octet-stream';\n }\n\n return {\n dcId: doc.dc_id, \n location: inputFileLocation, \n size: thumb ? thumb.size : doc.size, \n mimeType,\n fileName: doc.file_name,\n queueId,\n onlyCache\n };\n }\n\n public getFileURL(doc: MyDocument, download = false, thumb?: PhotoSize.photoSize) {\n let type: FileURLType;\n if(download) {\n type = 'download';\n } else if(thumb) {\n type = 'thumb';\n } else if(doc.supportsStreaming) {\n type = 'stream';\n } else {\n type = 'document';\n }\n\n return getFileURL(type, this.getFileDownloadOptions(doc, thumb));\n }\n\n public getThumbURL(doc: MyDocument, thumb: PhotoSize.photoSize | PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize) {\n let promise: Promise = Promise.resolve();\n\n const cacheContext = appDownloadManager.getCacheContext(doc, thumb.type);\n if(!cacheContext.url) {\n if('bytes' in thumb) {\n promise = blur(appPhotosManager.getPreviewURLFromBytes(thumb.bytes, !!doc.sticker)).then(url => {\n cacheContext.url = url;\n }) as any;\n } else {\n //return this.getFileURL(doc, false, thumb);\n promise = appPhotosManager.preloadPhoto(doc, thumb) as any;\n }\n }\n\n return {thumb, cacheContext, promise};\n }\n\n public getThumb(doc: MyDocument, tryNotToUseBytes = true) {\n const thumb = appPhotosManager.choosePhotoSize(doc, 0, 0, !tryNotToUseBytes);\n if(thumb._ === 'photoSizeEmpty') return null;\n return this.getThumbURL(doc, thumb as any);\n }\n\n public getInputFileName(doc: MyDocument, thumbSize?: string) {\n return getFileNameByLocation(this.getInput(doc, thumbSize), {fileName: doc.file_name});\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean): DownloadBlob {\n const fileName = this.getInputFileName(doc);\n\n let download: DownloadBlob = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n const downloadOptions = this.getFileDownloadOptions(doc, undefined, queueId, onlyCache);\n download = appDownloadManager.download(downloadOptions);\n this.downloading.set(doc.id, download);\n rootScope.dispatchEvent('download_start', doc.id);\n\n const cacheContext = appDownloadManager.getCacheContext(doc);\n const originalPromise = download;\n originalPromise.then((blob) => {\n cacheContext.url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n }, () => {}).finally(() => {\n this.downloading.delete(doc.id);\n });\n \n if(doc.type === 'voice' && !opusDecodeController.isPlaySupported()) {\n download = originalPromise.then(async(blob) => {\n const reader = new FileReader();\n \n await new Promise((resolve, reject) => {\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n //console.log('sending uint8 to decoder:', uint8);\n opusDecodeController.decode(uint8).then(result => {\n cacheContext.url = result.url;\n resolve();\n }, (err) => {\n delete cacheContext.downloaded;\n reject(err);\n });\n };\n \n reader.readAsArrayBuffer(blob);\n });\n \n return blob;\n });\n }\n\n download.then(() => {\n rootScope.dispatchEvent('document_downloaded', doc);\n });\n\n return download;\n }\n\n public saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n if(this.savingLottiePreview[key]/* || true */) return;\n\n if(!doc.stickerCachedThumbs) {\n defineNotNumerableProperties(doc, ['stickerCachedThumbs']);\n doc.stickerCachedThumbs = {};\n }\n\n const thumb = doc.stickerCachedThumbs[toneIndex];\n if(thumb && thumb.w >= canvas.width && thumb.h >= canvas.height) {\n return;\n }\n\n /* if(doc.thumbs.find(t => t._ === 'photoStrippedSize') \n || (doc.stickerCachedThumb || (doc.stickerSavedThumbWidth >= canvas.width && doc.stickerSavedThumbHeight >= canvas.height))) {\n return;\n } */\n\n this.savingLottiePreview[key] = true;\n canvas.toBlob((blob) => {\n //console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n const thumb = {\n url: URL.createObjectURL(blob),\n w: canvas.width,\n h: canvas.height\n };\n\n doc.stickerCachedThumbs[toneIndex] = thumb;\n\n delete this.savingLottiePreview[key];\n \n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice(t => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n });\n }\n\n public saveDocFile(doc: MyDocument, queueId?: number) {\n /* const options = this.getFileDownloadOptions(doc, undefined, queueId);\n return appDownloadManager.downloadToDisc(options, doc.file_name); */\n const promise = this.downloadDoc(doc, queueId);\n promise.then(() => {\n const cacheContext = appDownloadManager.getCacheContext(doc);\n appDownloadManager.createDownloadAnchor(cacheContext.url, doc.file_name);\n });\n return promise;\n }\n}\n\nconst appDocsManager = new AppDocsManager();\nMOUNT_CLASS_TO.appDocsManager = appDocsManager;\nexport default appDocsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { tsNow } from \"../../helpers/date\";\nimport { numberThousandSplitter } from \"../../helpers/number\";\nimport { ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, InputFileLocation, PhotoSize, SendMessageAction, Update, UserFull, UserProfilePhoto } from \"../../layer\";\nimport { LangPackKey, i18n } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager, { MyTopPeer, User } from \"./appUsersManager\";\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nexport class AppProfileManager {\n //private botInfos: any = {};\n public usersFull: {[id: UserId]: UserFull.userFull} = {};\n public chatsFull: {[id: ChatId]: ChatFull} = {};\n private fullPromises: {[peerId: PeerId]: Promise} = {};\n private typingsInPeer: {[peerId: PeerId]: UserTyping[]};\n\n constructor() {\n rootScope.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat = appChatsManager.getChat(chatId);\n if(!chat.photo || !fullChat) {\n return;\n }\n\n const emptyPhoto = chat.photo._ === 'chatPhotoEmpty';\n //////console.log('chat_update:', fullChat);\n if(fullChat.chat_photo && emptyPhoto !== (fullChat.chat_photo._ === 'photoEmpty')) {\n delete this.chatsFull[chatId];\n rootScope.dispatchEvent('chat_full_update', chatId);\n return;\n }\n if(emptyPhoto) {\n return;\n }\n\n const photoId = (chat.photo as ChatPhoto.chatPhoto).photo_id;\n const chatFullPhotoId = fullChat.chat_photo?.id;\n if(chatFullPhotoId !== photoId) {\n delete this.chatsFull[chatId];\n rootScope.dispatchEvent('chat_full_update', chatId);\n }\n });\n\n rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true): Promise {\n if(this.usersFull[id] && !override) {\n return Promise.resolve(this.usersFull[id]);\n }\n\n const peerId = id.toPeerId(false);\n if(this.fullPromises[peerId]) {\n return this.fullPromises[peerId] as any;\n }\n\n return this.fullPromises[peerId] = apiManager.invokeApi('users.getFullUser', {\n id: appUsersManager.getUserInput(id)\n }).then((userFull) => {\n const user = userFull.user as User;\n appUsersManager.saveApiUser(user, true);\n\n if(userFull.profile_photo) {\n userFull.profile_photo = appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n if(userFull.about !== undefined) {\n userFull.rAbout = RichTextProcessor.wrapRichText(userFull.about, {noLinebreaks: true});\n }\n\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: userFull.notify_settings\n });\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 delete this.fullPromises[peerId];\n\n return this.usersFull[id] = userFull;\n }) as any;\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true): Promise {\n if(appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getFullPhoto(peerId: PeerId) {\n return this.getProfileByPeerId(peerId).then(profile => {\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\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): Promise {\n if(appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override) {\n const chat = appChatsManager.getChat(id);\n if(chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version ||\n chat.pFlags.left) {\n return Promise.resolve(fullChat);\n }\n }\n\n const peerId = id.toPeerId(true);\n if(this.fullPromises[peerId] !== undefined) {\n return this.fullPromises[peerId] as any;\n }\n\n // console.trace(dT(), 'Get chat full', id, appChatsManager.getChat(id))\n return this.fullPromises[peerId] = apiManager.invokeApi('messages.getFullChat', {\n chat_id: id\n }).then((result) => {\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChat = result.full_chat as ChatFull.chatFull;\n if(fullChat && fullChat.chat_photo && fullChat.chat_photo.id) {\n fullChat.chat_photo = appPhotosManager.savePhoto(fullChat.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n //appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChat.notify_settings\n });\n delete this.fullPromises[peerId];\n this.chatsFull[id] = fullChat;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChat;\n }) as any;\n }\n\n public getChatInviteLink(id: ChatId, force?: boolean) {\n return this.getChatFull(id).then((chatFull) => {\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n \n return apiManager.invokeApi('messages.exportChatInvite', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = appChatsManager.getChat(id);\n if(chat &&\n chat.pFlags && (\n chat.pFlags.kicked ||\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then(result => {\n appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex(p => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return apiManager.invokeApiSingle('channels.getParticipant', {\n channel: appChatsManager.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n }).then(channelParticipant => {\n appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true): Promise {\n if(this.chatsFull[id] !== undefined && !override) {\n return Promise.resolve(this.chatsFull[id] as ChatFull.channelFull);\n }\n\n const peerId = id.toPeerId(true);\n if(this.fullPromises[peerId] !== undefined) {\n return this.fullPromises[peerId] as any;\n }\n\n return this.fullPromises[peerId] = apiManager.invokeApi('channels.getFullChannel', {\n channel: appChatsManager.getChannelInput(id)\n }).then((result) => {\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n //appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChannel.notify_settings\n });\n\n delete this.fullPromises[peerId];\n this.chatsFull[id] = fullChannel;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n }, (error) => {\n switch (error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(id);\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n } as Update.updateChannel],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n }) as any;\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n \n const index = new SearchIndex(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex({\n ignoreCase: true\n });\n\n const ratingMap: Map = new Map();\n topPeers.forEach(peer => {\n index.indexObject(peer.id, appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise;\n if(appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId)\n }, 50, 0).then(cP => {\n return cP.participants.map(p => appChatsManager.getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = (this.getChatFull(chatId) as Promise).then(chatFull => {\n return (chatFull.participants as ChatParticipants.chatParticipants).participants.map(p => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]), \n promise\n ]).then(results => {\n const peers = results[0].concat(results[1].map(peerId => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n public invalidateChannelParticipants(id: ChatId) {\n delete this.chatsFull[id];\n delete this.fullPromises[id.toPeerId(true)];\n apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n rootScope.dispatchEvent('chat_full_update', id);\n }\n\n public updateProfile(first_name: string, last_name: string, about: string) {\n return apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then(user => {\n appUsersManager.saveApiUser(user);\n \n return this.getProfile(rootScope.myId, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = rootScope.myId;\n appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateUserPhoto',\n user_id: myId,\n date: tsNow(true),\n photo: appUsersManager.getUser(myId.toUserId()).photo,\n previous: true\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map(photoId => {\n const photo = appPhotosManager.getPhoto(photoId);\n return appPhotosManager.getInput(photo);\n })\n }).then((deletedList) => {\n \n });\n }\n\n public getChatMembersString(id: ChatId) {\n const chat: Chat = appChatsManager.getChat(id);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = this.chatsFull[id];\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isChannel = appChatsManager.isBroadcast(id);\n count = count || 1;\n\n let key: LangPackKey = isChannel ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise {\n const minOnline = 1;\n if(appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n \n const chatInfo = await this.getChatFull(id);\n if(appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\n const fromId = (update as Update.updateUserTyping).user_id ? \n (update as Update.updateUserTyping).user_id.toPeerId() : \n appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(rootScope.myId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n \n const peerId = appPeersManager.getPeerId(update);\n const typings = this.typingsInPeer[peerId] ?? (this.typingsInPeer[peerId] = []);\n let typing = typings.find(t => t.userId === fromId);\n\n const cancelAction = () => {\n delete typing.timeout;\n //typings.findAndSplice(t => t === typing);\n const idx = typings.indexOf(typing);\n if(idx !== -1) {\n typings.splice(idx, 1);\n }\n\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[peerId];\n }\n };\n\n if(typing && typing.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n //console.log('updateChatUserTyping', update, typings);\n \n typing.action = update.action;\n \n const hasUser = appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && appChatsManager.hasChat(update.chat_id) && !appChatsManager.isChannel(update.chat_id)) {\n appProfileManager.getChatFull(update.chat_id).then(() => {\n if(typing.timeout !== undefined && appUsersManager.hasUser(fromId)) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n });\n }\n }\n \n //return;\n } else {\n appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = window.setTimeout(cancelAction, 6000);\n if(hasUser) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = appPeersManager.getPeerId(update.peer_id);\n if(appPeersManager.isUser(peerId)) {\n const userFull = this.usersFull[peerId.toUserId()];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n }\n\n rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId) {\n return this.typingsInPeer[peerId];\n }\n}\n\nconst appProfileManager = new AppProfileManager();\nMOUNT_CLASS_TO.appProfileManager = appProfileManager;\nexport default appProfileManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\ntype TargetType = HTMLElement;\r\nexport type OnVisibilityChange = (target: TargetType, visible: boolean) => void;\r\n\r\nexport default class VisibilityIntersector {\r\n private observer: IntersectionObserver;\r\n private items: Map = new Map();\r\n private locked = false;\r\n\r\n constructor(onVisibilityChange: OnVisibilityChange) {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(this.locked) {\r\n return;\r\n }\r\n\r\n const changed: {target: TargetType, visible: boolean}[] = [];\r\n\r\n entries.forEach(entry => {\r\n const target = entry.target as TargetType;\r\n\r\n if(this.items.get(target) === entry.isIntersecting) {\r\n return;\r\n } else {\r\n this.items.set(target, entry.isIntersecting);\r\n }\r\n\r\n /* if(entry.isIntersecting) {\r\n console.log('ooo', entry);\r\n } */\r\n\r\n /* if(this.locked) {\r\n return;\r\n } */\r\n\r\n changed[entry.isIntersecting ? 'unshift' : 'push']({target, visible: entry.isIntersecting});\r\n\r\n //onVisibilityChange(target, entry.isIntersecting);\r\n });\r\n\r\n changed.forEach(smth => {\r\n onVisibilityChange(smth.target, smth.visible);\r\n });\r\n });\r\n }\r\n\r\n public getVisible() {\r\n const items: TargetType[] = [];\r\n this.items.forEach((value, key) => {\r\n if(value) {\r\n items.push(key);\r\n }\r\n });\r\n\r\n return items;\r\n }\r\n\r\n public clearVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.items.set(target, false);\r\n }\r\n }\r\n\r\n public isVisible(target: TargetType) {\r\n return this.items.get(target);\r\n }\r\n\r\n public disconnect() {\r\n this.observer.disconnect();\r\n this.items.clear();\r\n }\r\n\r\n public refresh() {\r\n this.observer.disconnect();\r\n\r\n //window.requestAnimationFrame(() => {\r\n const targets = [...this.items.keys()];\r\n for(const target of targets) {\r\n //this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n //});\r\n }\r\n\r\n public refreshVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.observer.unobserve(target);\r\n }\r\n\r\n for(const target of visible) {\r\n this.observer.observe(target);\r\n }\r\n }\r\n\r\n public observe(target: TargetType) {\r\n this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n\r\n public unobserve(target: TargetType) {\r\n this.observer.unobserve(target);\r\n this.items.delete(target);\r\n }\r\n\r\n public unlock() {\r\n this.locked = false;\r\n }\r\n\r\n public unlockAndRefresh() {\r\n this.unlock();\r\n this.refresh();\r\n }\r\n\r\n public lock() {\r\n this.locked = true;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport VisibilityIntersector, { OnVisibilityChange } from \"./visibilityIntersector\";\r\nimport { findAndSpliceAll, indexOfAndSplice } from \"../helpers/array\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\n\r\ntype LazyLoadElementBase = {\r\n load: () => Promise\r\n};\r\n\r\ntype LazyLoadElement = Omit & {\r\n load: (target?: HTMLElement) => Promise,\r\n div: HTMLElement\r\n wasSeen?: boolean,\r\n};\r\n\r\nconst PARALLEL_LIMIT = 8;\r\n\r\nexport class LazyLoadQueueBase {\r\n public queueId = 0;\r\n protected queue: Array = [];\r\n protected inProcess: Set = new Set();\r\n\r\n protected lockPromise: Promise = null;\r\n protected unlockResolve: () => void = null;\r\n\r\n protected log = logger('LL', LogTypes.Error);\r\n protected processQueue: () => void;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n this.processQueue = throttle(() => this._processQueue(), 20, false);\r\n }\r\n\r\n public clear() {\r\n this.inProcess.clear(); // ацтеки забьются, будет плохо\r\n\r\n this.queue.length = 0;\r\n // unreachable code\r\n /* for(let item of this.inProcess) { \r\n this.lazyLoadMedia.push(item);\r\n } */\r\n }\r\n\r\n public lock() {\r\n if(this.lockPromise) return;\r\n\r\n //const perf = performance.now();\r\n this.lockPromise = new Promise((resolve, reject) => {\r\n this.unlockResolve = resolve;\r\n });\r\n\r\n /* if(DEBUG) {\r\n this.lockPromise.then(() => {\r\n this.log('was locked for:', performance.now() - perf);\r\n });\r\n } */\r\n }\r\n\r\n public unlock() {\r\n if(!this.unlockResolve) return;\r\n\r\n this.unlockResolve();\r\n this.unlockResolve = this.lockPromise = null;\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected async processItem(item: LazyLoadElementBase) {\r\n if(this.lockPromise) {\r\n return;\r\n }\r\n\r\n this.inProcess.add(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('will load media', this.lockPromise, item);\r\n } */\r\n\r\n try {\r\n //await new Promise((resolve) => setTimeout(resolve, 2e3));\r\n //await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\r\n //await item.load(item.div);\r\n await this.loadItem(item);\r\n } catch(err) {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(err as string)) {\r\n this.log.error('loadMediaQueue error:', err/* , item */);\r\n }\r\n }\r\n\r\n this.inProcess.delete(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('loaded media', item);\r\n } */\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElementBase) {\r\n return item.load();\r\n }\r\n\r\n protected getItem() {\r\n return this.queue.shift();\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\r\n this.queue[method](el);\r\n this.processQueue();\r\n }\r\n\r\n protected _processQueue(item?: LazyLoadElementBase) {\r\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\r\n\r\n //console.log('_processQueue start');\r\n let added = 0;\r\n do {\r\n if(item) {\r\n indexOfAndSplice(this.queue, item);\r\n } else {\r\n item = this.getItem();\r\n }\r\n \r\n if(item) {\r\n this.processItem(item);\r\n } else {\r\n break;\r\n }\r\n\r\n item = null;\r\n ++added;\r\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\r\n //console.log('_processQueue end, added', added, this.queue.length);\r\n }\r\n\r\n public push(el: LazyLoadElementBase) {\r\n this.addElement('push', el);\r\n }\r\n\r\n public unshift(el: LazyLoadElementBase) {\r\n this.addElement('unshift', el);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueIntersector extends LazyLoadQueueBase {\r\n protected queue: Array = [];\r\n protected inProcess: Set = new Set();\r\n\r\n public intersector: VisibilityIntersector;\r\n protected intersectorTimeout: number;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n }\r\n\r\n public lock() {\r\n super.lock();\r\n this.intersector.lock();\r\n }\r\n\r\n public unlock() {\r\n super.unlock();\r\n this.intersector.unlock();\r\n }\r\n\r\n public unlockAndRefresh() {\r\n super.unlock();\r\n this.intersector.unlockAndRefresh();\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this.intersector.disconnect();\r\n }\r\n\r\n public refresh() {\r\n this.intersector.refresh();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElement) {\r\n return item.load(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const item = this.queue.find(i => i.div === el.div && i.load === el.load);\r\n if(item) {\r\n return false;\r\n } else {\r\n for(const item of this.inProcess) {\r\n if(item.div === el.div && item.load === el.load) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n this.queue[method](el);\r\n return true;\r\n }\r\n\r\n protected setProcessQueueTimeout() {\r\n if(!this.intersectorTimeout) {\r\n this.intersectorTimeout = window.setTimeout(() => {\r\n this.intersectorTimeout = 0;\r\n this.processQueue();\r\n }, 0);\r\n }\r\n }\r\n\r\n public push(el: LazyLoadElement) {\r\n super.push(el);\r\n }\r\n\r\n public unshift(el: LazyLoadElement) {\r\n super.unshift(el);\r\n }\r\n\r\n public unobserve(el: HTMLElement) {\r\n findAndSpliceAll(this.queue, (i) => i.div === el);\r\n\r\n this.intersector.unobserve(el);\r\n }\r\n}\r\n\r\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\r\n }\r\n\r\n private onVisibilityChange = (target: HTMLElement, visible: boolean) => {\r\n if(visible) {\r\n /* if(DEBUG) {\r\n this.log('isIntersecting', target);\r\n } */\r\n\r\n // need for set element first if scrolled\r\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach(item => {\r\n item.wasSeen = true;\r\n this.queue.unshift(item);\r\n //this.processQueue(item);\r\n });\r\n\r\n this.setProcessQueueTimeout();\r\n }\r\n };\r\n\r\n protected getItem() {\r\n return this.queue.findAndSplice(item => item.wasSeen);\r\n }\r\n\r\n public async processItem(item: LazyLoadElement) {\r\n await super.processItem(item);\r\n this.intersector.unobserve(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const inserted = super.addElement(method, el);\r\n\r\n if(!inserted) return false;\r\n\r\n this.intersector.observe(el.div);\r\n /* if(el.wasSeen) {\r\n this.processQueue(el);\r\n } else */if(!el.hasOwnProperty('wasSeen')) {\r\n el.wasSeen = false;\r\n }\r\n \r\n return true;\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\r\n private _queue: Map = new Map();\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible) {\r\n const items = spliced.length ? spliced : [this._queue.get(target)];\r\n items.forEach(item => {\r\n this.queue.unshift(item || this._queue.get(target));\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this._queue.clear();\r\n }\r\n\r\n /* public async processItem(item: LazyLoadElement) {\r\n //await super.processItem(item);\r\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\r\n\r\n if(this.lazyLoadMedia.length) {\r\n this.processQueue();\r\n }\r\n } */\r\n\r\n public observe(el: LazyLoadElement) {\r\n this._queue.set(el.div, el);\r\n this.intersector.observe(el.div);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible && spliced.length) {\r\n spliced.forEach(item => {\r\n this.queue.unshift(item);\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public observe(el: HTMLElement) {\r\n this.intersector.observe(el);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * 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 function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import apiManager from '../mtproto/apiManager';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport { Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates } from '../../layer';\nimport { logger, LogTypes } from '../logger';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\n//import networkerFactory from '../mtproto/networkerFactory';\nimport appUsersManager from \"./appUsersManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from './appStateManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport RichTextProcessor from '../richtextprocessor';\nimport App from '../../config/app';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: true,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nexport class ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n \n if(!this.popPendingSeqUpdate() &&\n state.syncPending &&\n state.syncPending.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n } else {\n delete state.syncPending.seqAwaiting;\n }\n }\n \n return true;\n }\n\n private popPendingPtsUpdate(channelId: ChatId) {\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\n if(!curState.pendingPtsUpdates.length) {\n return false;\n }\n\n curState.pendingPtsUpdates.sort((a, b) => {\n return a.pts - b.pts;\n });\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\n \n let curPts = curState.pts;\n let goodPts = 0;\n let goodIndex = 0;\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\n const update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if(curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n \n if(!goodPts) {\n return false;\n }\n \n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n \n curState.pts = goodPts;\n for(let i = 0; i <= goodIndex; ++i) {\n const update = curState.pendingPtsUpdates[i];\n\n // @ts-ignore\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n \n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\n if(!curState.syncPending.seqAwaiting) {\n clearTimeout(curState.syncPending.timeout);\n curState.syncPending = null;\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n \n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start,\n //ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n \n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n \n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n \n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? rootScope.myId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id\n ? (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true)\n : ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || rootScope.myId);\n \n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n \n case 'updatesCombined':\n case 'updates':\n appUsersManager.saveApiUsers(updateMessage.users, options.override);\n appChatsManager.saveApiChats(updateMessage.chats, options.override);\n \n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n \n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n \n private getDifference(first = false): Promise {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n let wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n \n if(updatesState.syncPending) {\n clearTimeout(updatesState.syncPending.timeout);\n updatesState.syncPending = null;\n }\n\n const promise = apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts, \n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date, \n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n \n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n \n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + serverTimeManager.serverTimeOffset;\n delete updatesState.seq;\n \n this.channelStates = {};\n \n this.log.warn('getDifference:', differenceResult._);\n rootScope.dispatchEvent('state_cleared');\n }\n \n // this.log('apply diff', updatesState.seq, updatesState.pts)\n \n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n \n return promise;\n }\n\n private getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n if(channelState.syncPending) {\n clearTimeout(channelState.syncPending.timeout);\n channelState.syncPending = null;\n }\n\n //this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = apiManager.invokeApi('updates.getChannelDifference', {\n channel: appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 30\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n this.debug && this.log.debug('Get channel diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n \n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n this.debug && this.log.debug('apply channel empty diff', differenceResult);\n return;\n }\n \n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n this.debug && this.log.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n \n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n \n // Should be first because of updateMessageID\n this.debug && this.log.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n \n this.debug && this.log.debug('applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n \n this.debug && this.log.debug('apply channel diff', channelState.pts);\n \n if(differenceResult._ === 'updates.channelDifference' &&\n !differenceResult.pFlags['final']) {\n return this.getChannelDifference(channelId);\n } else {\n this.debug && this.log.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n \n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n if(!(channelId in this.channelStates)) {\n this.channelStates[channelId] = {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n\n return true;\n }\n\n return false;\n }\n\n public getChannelState(channelId: ChatId, pts?: number) {\n if(this.channelStates[channelId] === undefined) {\n this.addChannelState(channelId, pts);\n }\n\n return this.channelStates[channelId];\n }\n\n private processUpdate(update: Update, options: Partial<{\n date: number,\n seq: number,\n seqStart: number/* ,\n ignoreSyncLoading: boolean */\n }> = {}) {\n let channelId: ChatId;\n switch(update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelId = appPeersManager.getPeerId(update.message.peer_id).toChatId();\n break;\n /* case 'updateDeleteChannelMessages':\n channelId = update.channel_id;\n break; */\n case 'updateChannelTooLong':\n channelId = update.channel_id;\n if(!(channelId in this.channelStates)) {\n return false;\n }\n break;\n default:\n if('channel_id' in update && 'pts' in update) {\n channelId = update.channel_id;\n }\n break;\n }\n \n const {pts, pts_count} = update as Update.updateNewMessage;\n const curState = channelId ? this.getChannelState(channelId, pts) : this.updatesState;\n \n // this.log.log('process', channelId, curState.pts, update)\n \n if(curState.syncLoading/* && !options.ignoreSyncLoading */) {\n return false;\n }\n \n if(update._ === 'updateChannelTooLong') {\n if(!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < (Date.now() - SYNC_DELAY)) {\n // this.log.trace('channel too long, get diff', channelId, update)\n this.getChannelDifference(channelId);\n }\n return false;\n }\n \n if(update._ === 'updateNewMessage' ||\n update._ === 'updateEditMessage' ||\n update._ === 'updateNewChannelMessage' ||\n update._ === 'updateEditChannelMessage') {\n const message = update.message as Message.message;\n const toPeerId = appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n \n let popPts: boolean;\n let popSeq: boolean;\n \n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n \n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n \n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending && curState.syncPending.seqAwaiting);\n \n if(curState.pendingSeqUpdates[seqStart] === undefined) {\n curState.pendingSeqUpdates[seqStart] = {seq, date: options.date, updates: []};\n }\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n \n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n \n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n \n this.saveUpdate(update);\n \n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n //this.debug && this.log('saveUpdate', update);\n rootScope.dispatchEvent(update._, update as any);\n }\n \n public attach() {\n if(this.attached) return;\n\n //return;\n\n this.log('attach');\n \n this.attached = true;\n\n appStateManager.getState().then(({updates: state}) => {\n const newVersion = appStateManager.newVersion/* || '0.8.6' */;\n\n //rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n //setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n //rootScope.broadcast('state_synchronized');\n //}, 1000);\n \n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n /* state.date = 1628623682;\n state.pts = 2007500;\n state.seq = 503; */\n\n Object.assign(this.updatesState, state);\n \n this.log('will get difference', Object.assign({}, state));\n \n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(() => {\n fetch('changelogs/' + newVersion + '.md')\n .then(res => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then(text => {\n const pre = `**Telegram Web${App.suffix} was updated to version alpha ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = RichTextProcessor.parseMarkdown(text, entities);\n\n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n this.processLocalUpdate(update);\n })\n .catch(noop);\n });\n }\n });\n }\n}\n\nconst apiUpdatesManager = new ApiUpdatesManager();\nMOUNT_CLASS_TO.apiUpdatesManager = apiUpdatesManager;\nexport default apiUpdatesManager\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { fontFamily } from \"../../components/middleEllipsis\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { deepEqual } from \"../../helpers/object\";\r\nimport { convertInputKeyToKey } from \"../../helpers/string\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport { InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update } from \"../../layer\";\r\nimport I18n from \"../langPack\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport webPushApiManager, { PushSubscriptionNotify } from \"../mtproto/webPushApiManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appRuntimeManager from \"./appRuntimeManager\";\r\nimport appStateManager from \"./appStateManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\n\r\ntype MyNotification = Notification & {\r\n hidden?: boolean,\r\n show?: () => void,\r\n};\r\n\r\nexport type NotifyOptions = Partial<{\r\n tag: string;\r\n image: string;\r\n key: string;\r\n title: string;\r\n message: string;\r\n silent: boolean;\r\n onclick: () => void;\r\n}>;\r\n\r\nexport type NotificationSettings = {\r\n nodesktop: boolean,\r\n volume: number,\r\n novibrate: boolean,\r\n nopreview: boolean,\r\n nopush: boolean,\r\n nosound: boolean\r\n};\r\n\r\ntype ImSadAboutIt = Promise | PeerNotifySettings;\r\nexport class AppNotificationsManager {\r\n private notificationsUiSupport: boolean;\r\n private notificationsShown: {[key: string]: MyNotification | true} = {};\r\n private notificationIndex = 0;\r\n private notificationsCount = 0;\r\n private soundsPlayed: {[tag: string]: number} = {};\r\n private vibrateSupport = !!navigator.vibrate;\r\n private nextSoundAt: number;\r\n private prevSoundVolume: number;\r\n private peerSettings = {\r\n notifyPeer: {} as {[peerId: PeerId]: ImSadAboutIt},\r\n notifyUsers: null as ImSadAboutIt,\r\n notifyChats: null as ImSadAboutIt,\r\n notifyBroadcasts: null as ImSadAboutIt\r\n };\r\n //private exceptions: {[peerId: string]: PeerNotifySettings} = {};\r\n private notifyContactsSignUp: Promise;\r\n private faviconEl: HTMLLinkElement = document.head.querySelector('link[rel=\"icon\"]');\r\n\r\n private titleBackup = document.title;\r\n private titleChanged = false;\r\n private titleInterval: number;\r\n private prevFavicon: string;\r\n private stopped = false;\r\n\r\n private settings: NotificationSettings = {} as any;\r\n\r\n private registeredDevice: any;\r\n private pushInited = false;\r\n\r\n private topMessagesDeferred: CancellablePromise;\r\n\r\n private notifySoundEl: HTMLElement;\r\n\r\n private getNotifyPeerTypePromise: Promise;\r\n\r\n constructor() {\r\n // @ts-ignore\r\n navigator.vibrate = navigator.vibrate || navigator.mozVibrate || navigator.webkitVibrate;\r\n\r\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\r\n\r\n this.topMessagesDeferred = deferredPromise();\r\n\r\n this.notifySoundEl = document.createElement('div');\r\n this.notifySoundEl.id = 'notify-sound';\r\n document.body.append(this.notifySoundEl);\r\n\r\n rootScope.addEventListener('instance_deactivated', () => {\r\n this.stop();\r\n });\r\n\r\n rootScope.addEventListener('instance_activated', () => {\r\n if(this.stopped) {\r\n this.start();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('idle', (newVal) => {\r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n if(!newVal) {\r\n this.clear();\r\n }\r\n\r\n this.toggleToggler();\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateNotifySettings: (update) => {\r\n const peerId = update.peer._ === 'notifyPeer' && appPeersManager.getPeerId(update.peer.peer);\r\n const key = update.peer._ !== 'notifyPeer' ? update.peer._ : undefined;\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings: update.notify_settings\r\n });\r\n rootScope.dispatchEvent('notify_settings', update);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('push_init', (tokenData) => {\r\n this.pushInited = true;\r\n if(!this.settings.nodesktop && !this.settings.nopush) {\r\n if(tokenData) {\r\n this.registerDevice(tokenData);\r\n } else {\r\n webPushApiManager.subscribe();\r\n }\r\n } else {\r\n this.unregisterDevice(tokenData);\r\n }\r\n });\r\n rootScope.addEventListener('push_subscribe', (tokenData) => {\r\n this.registerDevice(tokenData);\r\n });\r\n rootScope.addEventListener('push_unsubscribe', (tokenData) => {\r\n this.unregisterDevice(tokenData);\r\n });\r\n\r\n rootScope.addEventListener('dialogs_multiupdate', () => {\r\n //unregisterTopMsgs()\r\n this.topMessagesDeferred.resolve();\r\n }, {once: true});\r\n\r\n rootScope.addEventListener('push_notification_click', (notificationData) => {\r\n if(notificationData.action === 'push_settings') {\r\n /* this.topMessagesDeferred.then(() => {\r\n $modal.open({\r\n templateUrl: templateUrl('settings_modal'),\r\n controller: 'SettingsModalController',\r\n windowClass: 'settings_modal_window mobile_modal',\r\n backdrop: 'single'\r\n })\r\n }); */\r\n return;\r\n }\r\n\r\n if(notificationData.action === 'mute1d') {\r\n apiManager.invokeApi('account.updateDeviceLocked', {\r\n period: 86400\r\n }).then(() => {\r\n // var toastData = toaster.pop({\r\n // type: 'info',\r\n // body: _('push_action_mute1d_success'),\r\n // bodyOutputType: 'trustedHtml',\r\n // clickHandler: () => {\r\n // toaster.clear(toastData)\r\n // },\r\n // showCloseButton: false\r\n // })\r\n });\r\n\r\n return;\r\n }\r\n\r\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\r\n console.log('click', notificationData, peerId);\r\n if(peerId) {\r\n this.topMessagesDeferred.then(() => {\r\n if(notificationData.custom.channel_id &&\r\n !appChatsManager.hasChat(notificationData.custom.channel_id)) {\r\n return;\r\n }\r\n\r\n if(peerId.isUser() && !appUsersManager.hasUser(peerId)) {\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('history_focus', {\r\n peerId,\r\n mid: +notificationData.custom.msg_id\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n private toggleToggler(enable = rootScope.idle.isIDLE) {\r\n if(IS_MOBILE) return;\r\n\r\n const resetTitle = () => {\r\n this.titleChanged = false;\r\n document.title = this.titleBackup;\r\n this.setFavicon();\r\n };\r\n\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n\r\n if(!enable) {\r\n resetTitle();\r\n } else {\r\n this.titleInterval = window.setInterval(() => {\r\n const count = this.notificationsCount;\r\n if(!count) {\r\n this.toggleToggler(false);\r\n } else if(this.titleChanged) {\r\n resetTitle();\r\n } else {\r\n this.titleChanged = true;\r\n document.title = I18n.format('Notifications.Count', true, [count]);\r\n //this.setFavicon('assets/img/favicon_unread.ico');\r\n\r\n // fetch('assets/img/favicon.ico')\r\n // .then(res => res.blob())\r\n // .then(blob => {\r\n // const img = document.createElement('img');\r\n // img.src = URL.createObjectURL(blob);\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = 32 * window.devicePixelRatio;\r\n canvas.height = canvas.width;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\r\n ctx.fillStyle = '#3390ec';\r\n ctx.fill();\r\n\r\n let fontSize = 24;\r\n let str = '' + count;\r\n if(count < 10) {\r\n fontSize = 22;\r\n } else if(count < 100) {\r\n fontSize = 20;\r\n } else {\r\n str = '99+';\r\n fontSize = 16;\r\n }\r\n\r\n fontSize *= window.devicePixelRatio;\r\n \r\n ctx.font = `700 ${fontSize}px ${fontFamily}`;\r\n ctx.textBaseline = 'middle';\r\n ctx.textAlign = 'center';\r\n ctx.fillStyle = 'white';\r\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\r\n\r\n /* const ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\r\n \r\n this.setFavicon(canvas.toDataURL());\r\n // });\r\n }\r\n }, 1000);\r\n }\r\n }\r\n\r\n public updateLocalSettings = () => {\r\n Promise.all(['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'].map(k => stateStorage.get(k as any)))\r\n .then((updSettings) => {\r\n this.settings.nodesktop = updSettings[0];\r\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\r\n this.settings.novibrate = updSettings[2];\r\n this.settings.nopreview = updSettings[3];\r\n this.settings.nopush = updSettings[4];\r\n\r\n if(this.pushInited) {\r\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\r\n const hasPush = this.registeredDevice !== false;\r\n if(needPush !== hasPush) {\r\n if(needPush) {\r\n webPushApiManager.subscribe();\r\n } else {\r\n webPushApiManager.unsubscribe();\r\n }\r\n }\r\n }\r\n\r\n webPushApiManager.setSettings(this.settings);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n this.settings.nosound = !state.settings.notifications.sound;\r\n });\r\n }\r\n\r\n public getLocalSettings() {\r\n return this.settings;\r\n }\r\n\r\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\r\n let key: any = convertInputKeyToKey(peer._);\r\n let obj: any = this.peerSettings[key as NotifyPeer['_']];\r\n\r\n let peerId: PeerId;\r\n if(peer._ === 'inputNotifyPeer') {\r\n peerId = key = appPeersManager.getPeerId(peer.peer);\r\n obj = obj[key];\r\n }\r\n\r\n if(obj) {\r\n return obj;\r\n }\r\n\r\n return (obj || this.peerSettings)[key] = apiManager.invokeApi('account.getNotifySettings', {peer})\r\n .then(settings => {\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings\r\n });\r\n \r\n return settings;\r\n });\r\n }\r\n\r\n public getNotifyPeerTypeSettings() {\r\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\r\n\r\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as Exclude[])\r\n .map((inputKey) => {\r\n return this.getNotifySettings({_: inputKey});\r\n });\r\n\r\n return this.getNotifyPeerTypePromise = Promise.all(promises);\r\n }\r\n\r\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\r\n //this.savePeerSettings(peerId, settings);\r\n\r\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\r\n inputSettings._ = 'inputPeerNotifySettings'; */\r\n\r\n return apiManager.invokeApi('account.updateNotifySettings', {\r\n peer,\r\n settings\r\n }).then(value => {\r\n if(value) {\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updateNotifySettings', \r\n peer: {\r\n ...peer as any,\r\n _: convertInputKeyToKey(peer._)\r\n }, \r\n notify_settings: { // ! WOW, IT WORKS !\r\n ...settings,\r\n _: 'peerNotifySettings',\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n public getNotifyExceptions() {\r\n apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getContactSignUpNotification() {\r\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\r\n return this.notifyContactsSignUp = apiManager.invokeApi('account.getContactSignUpNotification');\r\n }\r\n\r\n public setContactSignUpNotification(silent: boolean) {\r\n apiManager.invokeApi('account.setContactSignUpNotification', {silent})\r\n .then(value => {\r\n this.notifyContactsSignUp = Promise.resolve(!silent);\r\n });\r\n }\r\n\r\n private setFavicon(href: string = 'assets/img/favicon.ico') {\r\n if(this.prevFavicon === href) {\r\n return;\r\n }\r\n\r\n const link = this.faviconEl.cloneNode() as HTMLLinkElement;\r\n link.href = href;\r\n this.faviconEl.parentNode.replaceChild(link, this.faviconEl);\r\n this.faviconEl = link;\r\n\r\n this.prevFavicon = href;\r\n }\r\n\r\n public savePeerSettings({key, peerId, settings}: {\r\n key?: Exclude,\r\n peerId?: PeerId, \r\n settings: PeerNotifySettings\r\n }) {\r\n let obj: any;\r\n if(peerId) {\r\n key = peerId as any;\r\n obj = this.peerSettings['notifyPeer'];\r\n }\r\n \r\n (obj || this.peerSettings)[key] = settings;\r\n\r\n if(!peerId) {\r\n rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\r\n }\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.mute_until * 1000) > tsNow() || peerNotifySettings.silent);\r\n }\r\n\r\n public getPeerMuted(peerId: PeerId) {\r\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: appPeersManager.getInputPeerById(peerId)});\r\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\r\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\r\n }\r\n\r\n public getPeerLocalSettings(peerId: PeerId, respectType = true): PeerNotifySettings {\r\n const n: PeerNotifySettings = {\r\n _: 'peerNotifySettings'\r\n };\r\n\r\n const notifySettings = this.peerSettings['notifyPeer'][peerId];\r\n //if(!notifySettings || (notifySettings instanceof Promise)) return false;\r\n if(notifySettings && !(notifySettings instanceof Promise)) {\r\n Object.assign(n, notifySettings);\r\n }\r\n\r\n if(respectType) {\r\n const inputNotify = appPeersManager.getInputNotifyPeerById(peerId, true);\r\n const key = convertInputKeyToKey(inputNotify._);\r\n const typeNotifySettings = this.peerSettings[key as NotifyPeer['_']];\r\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\r\n for(let i in typeNotifySettings) {\r\n // @ts-ignore\r\n if(n[i] === undefined) {\r\n // @ts-ignore\r\n n[i] = typeNotifySettings[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n public isPeerLocalMuted(peerId: PeerId, respectType = true) {\r\n if(peerId === rootScope.myId) return false;\r\n\r\n const notifySettings = this.getPeerLocalSettings(peerId, respectType);\r\n return this.isMuted(notifySettings);\r\n }\r\n\r\n public start() {\r\n this.updateLocalSettings();\r\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\r\n webPushApiManager.start();\r\n\r\n if(!this.notificationsUiSupport) {\r\n return false;\r\n }\r\n\r\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\r\n window.addEventListener('click', this.requestPermission);\r\n }\r\n\r\n try {\r\n if('onbeforeunload' in window) {\r\n window.addEventListener('beforeunload', this.clear);\r\n }\r\n } catch (e) {}\r\n }\r\n\r\n private stop() {\r\n this.clear();\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n this.setFavicon();\r\n this.stopped = true;\r\n }\r\n\r\n private requestPermission = () => {\r\n Notification.requestPermission();\r\n window.removeEventListener('click', this.requestPermission);\r\n };\r\n\r\n public notify(data: NotifyOptions) {\r\n //console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\r\n \r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n // FFOS Notification blob src bug workaround\r\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\r\n data.image = 'https://telegram.org/img/t_logo.png'\r\n }\r\n else if (data.image && !angular.isString(data.image)) {\r\n if (Config.Navigator.ffos2p) {\r\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\r\n data.image = url\r\n notify(data)\r\n })\r\n return false\r\n } else {\r\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\r\n }\r\n }\r\n else */ if(!data.image) {\r\n data.image = 'assets/img/logo_filled_rounded.png';\r\n }\r\n // console.log('notify image', data.image)\r\n\r\n this.notificationsCount++;\r\n if(!this.titleInterval) {\r\n this.toggleToggler();\r\n }\r\n\r\n const idx = ++this.notificationIndex;\r\n const key = data.key || 'k' + idx;\r\n this.notificationsShown[key] = true;\r\n\r\n const now = tsNow();\r\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\r\n (\r\n !data.tag ||\r\n !this.soundsPlayed[data.tag] ||\r\n now > this.soundsPlayed[data.tag] + 60000\r\n ) */\r\n ) {\r\n this.testSound(this.settings.volume);\r\n this.soundsPlayed[data.tag] = now;\r\n }\r\n\r\n if(!this.notificationsUiSupport ||\r\n 'Notification' in window && Notification.permission !== 'granted') {\r\n return false;\r\n }\r\n\r\n if(this.settings.nodesktop) {\r\n if(this.vibrateSupport && !this.settings.novibrate) {\r\n navigator.vibrate([200, 100, 200]);\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n let notification: MyNotification;\r\n\r\n if('Notification' in window) {\r\n try {\r\n if(data.tag) {\r\n for(let i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\r\n notification.hidden = true;\r\n }\r\n }\r\n }\r\n\r\n notification = new Notification(data.title, {\r\n icon: data.image || '',\r\n body: data.message || '',\r\n tag: data.tag || '',\r\n silent: data.silent || false\r\n });\r\n\r\n //console.log('notify constructed notification');\r\n } catch(e) {\r\n this.notificationsUiSupport = false;\r\n webPushApiManager.setLocalNotificationsDisabled();\r\n return;\r\n }\r\n } /* else if('mozNotification' in navigator) {\r\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\r\n } else if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\r\n window.external.msSiteModeActivate()\r\n notification = {\r\n index: idx\r\n }\r\n } */ else {\r\n return;\r\n }\r\n\r\n notification.onclick = () => {\r\n notification.close();\r\n appRuntimeManager.focus();\r\n this.clear();\r\n if(data.onclick) {\r\n data.onclick();\r\n }\r\n };\r\n\r\n notification.onclose = () => {\r\n if(!notification.hidden) {\r\n delete this.notificationsShown[key];\r\n this.clear();\r\n }\r\n };\r\n\r\n if(notification.show) {\r\n notification.show();\r\n }\r\n this.notificationsShown[key] = notification;\r\n\r\n if(!IS_MOBILE) {\r\n setTimeout(() => {\r\n this.hide(key);\r\n }, 8000);\r\n }\r\n }\r\n\r\n public testSound(volume: number) {\r\n const now = tsNow();\r\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\r\n return;\r\n }\r\n\r\n this.nextSoundAt = now + 1000;\r\n this.prevSoundVolume = volume;\r\n const filename = 'assets/audio/notification.mp3';\r\n const audio = document.createElement('audio');\r\n audio.autoplay = true;\r\n audio.setAttribute('mozaudiochannel', 'notification');\r\n audio.volume = volume;\r\n audio.innerHTML = `\r\n \r\n \r\n `;\r\n this.notifySoundEl.append(audio);\r\n\r\n audio.addEventListener('ended', () => {\r\n audio.remove();\r\n }, {once: true});\r\n }\r\n\r\n public cancel(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification) {\r\n if(this.notificationsCount > 0) {\r\n --this.notificationsCount;\r\n }\r\n\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }/* else if(notificationsMsSiteMode &&\r\n notification.index === notificationIndex) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } */\r\n } catch(e) {}\r\n\r\n delete this.notificationsShown[key];\r\n }\r\n }\r\n\r\n private hide(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification && typeof(notification) !== 'boolean') {\r\n try {\r\n if(notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n }\r\n\r\n public soundReset(tag: string) {\r\n delete this.soundsPlayed[tag];\r\n }\r\n\r\n public clear() {\r\n /* if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } else { */\r\n for(const i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n /* } */\r\n this.notificationsShown = {};\r\n this.notificationsCount = 0;\r\n\r\n webPushApiManager.hidePushNotifications();\r\n }\r\n\r\n private registerDevice(tokenData: PushSubscriptionNotify) {\r\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.registerDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: [],\r\n app_sandbox: false,\r\n secret: new Uint8Array()\r\n }).then(() => {\r\n this.registeredDevice = tokenData;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\r\n if(!this.registeredDevice) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.unregisterDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: []\r\n }).then(() => {\r\n this.registeredDevice = false;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n public getVibrateSupport() {\r\n return this.vibrateSupport\r\n }\r\n}\r\n\r\nconst appNotificationsManager = new AppNotificationsManager();\r\nMOUNT_CLASS_TO.appNotificationsManager = appNotificationsManager;\r\nexport default appNotificationsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, \n url: string, \n callback?: (err?: Event) => void, \n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback && callback();\n return;\n }\n\n if(((loadedURLs[url]/* && false */) && useCache) || elem instanceof HTMLVideoElement) {\n if(elem) {\n set(elem, url);\n }\n \n callback && callback();\n // callback && getHeavyAnimationPromise().then(() => callback());\n } else {\n const isImage = elem instanceof HTMLImageElement;\n const loader = isImage ? elem as HTMLImageElement : new Image();\n //const loader = new Image();\n loader.src = url;\n //let perf = performance.now();\n loader.addEventListener('load', () => {\n if(!isImage && elem) {\n set(elem, url);\n }\n\n loadedURLs[url] = true;\n //console.log('onload:', url, performance.now() - perf);\n // TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются\n // callback && getHeavyAnimationPromise().then(() => callback());\n callback && callback();\n }, {once: true});\n\n if(callback) {\n loader.addEventListener('error', callback);\n }\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport class WindowSize {\n public windowW = 0;\n public windowH = 0;\n\n constructor() {\n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.windowW = w.width || w.innerWidth;\n this.windowH = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/6.d600026c8e100eea4159.chunk.js b/public/6.d600026c8e100eea4159.chunk.js new file mode 100644 index 000000000..b6adac729 --- /dev/null +++ b/public/6.d600026c8e100eea4159.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[6],Array(39).concat([function(e,t,s){"use strict";var i=s(29),a=s(41),n=s(46),r=s(127);function o(e){return e&&e.toLowerCase()||""}var d=s(56),l=s(107),c=s(32),h=s(16),u=s(33),p=s(45),g=s(70),f=s(31),m=s(15),v=s(114),_=s(74),y=s(48),I=s(44),M=s(17);const P=new class{constructor(){this.storage=M.default.storages.users,this.updateUsersStatuses=()=>{const e=Object(d.g)(!0);for(const t in this.users){const s=this.users[t];this.updateUserStatus(s,e)}},this.clear(!0),setInterval(this.updateUsersStatuses,6e4),m.default.addEventListener("state_synchronized",this.updateUsersStatuses),m.default.addMultipleEventsListeners({updateUserStatus:e=>{const t=e.user_id,s=this.users[t];s&&(s.status=e.status,s.status&&("expires"in s.status&&(s.status.expires-=g.a.serverTimeOffset),"was_online"in s.status&&(s.status.was_online-=g.a.serverTimeOffset)),m.default.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(s))},updateUserPhoto:e=>{const t=e.user_id,s=this.users[t];s?(this.forceUserOnline(t),"userProfilePhotoEmpty"===e.photo._?delete s.photo:s.photo=Object(c.i)(s.photo,e.photo),this.setUserToStateIfNeeded(s),m.default.dispatchEvent("user_update",t),m.default.dispatchEvent("avatar_update",t.toPeerId())):console.warn("No user by id:",t)},updateUserName:e=>{const t=e.user_id,s=this.users[t];s&&(this.forceUserOnline(t),this.saveApiUser(Object.assign({},s,{first_name:e.first_name,last_name:e.last_name,username:e.username}),!0))}}),m.default.addEventListener("language_change",e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))}),M.default.getState().then(e=>{const t=M.default.storagesResults.users;if(t.length)for(let e=0,s=t.length;e{this.pushContact(e)}),s.length&&(this.contactsFillPromise=Object(n.a)(),this.contactsFillPromise.resolve(this.contactsList))),M.default.addEventListener("peerNeeded",e=>{if(!I.a.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})}),M.default.addEventListener("peerUnneeded",e=>{if(!I.a.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)})})}clear(e=!1){if(e)this.users={},this.usernames={};else{const e=M.default.storagesResults.users;for(const t in this.users){if(!t)continue;const s=t.toPeerId();if(!M.default.isPeerNeeded(s)){const s=this.users[t];s.username&&delete this.usernames[o(s.username)],e.findAndSplice(e=>e.id===t),this.storage.delete(t),delete this.users[t]}}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1}onContactsModified(){const e=[...this.contactsList];M.default.pushToState("contactsList",e)}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=Object(n.a)();return u.a.invokeApi("contacts.getContacts").then(e=>{"contacts.contacts"===e._&&(this.contactsList.clear(),this.saveApiUsers(e.users),e.contacts.forEach(e=>{this.pushContact(e.user_id)}),this.onContactsModified(),this.contactsFillPromise=t),t.resolve(this.contactsList)},()=>{this.updatedContactsList=!1}),{cached:null===(e=this.contactsFillPromise)||void 0===e?void 0:e.isFulfilled,promise:this.contactsFillPromise||(this.contactsFillPromise=t)}}resolveUsername(e){return"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase(),this.usernames[e]?Promise.resolve(this.users[this.usernames[e]]):u.a.invokeApi("contacts.resolveUsername",{username:e}).then(e=>(this.saveApiUsers(e.users),y.a.saveApiChats(e.chats),I.a.getPeer(I.a.getPeerId(e.peer))))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),M.default.requestPeerSingle(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),M.default.releaseSinglePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];if(!t)return"";return[t.first_name,t.last_name,t.phone,t.username,t.pFlags.self?h.default.format("SavedMessages",!0):"",t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" ")}getContacts(e,t=!1,s="name"){return this.fillContacts().promise.then(i=>{let n=[...i];if(e){const t=this.contactsIndex.search(e);n=[...n].filter(e=>t.has(e))}"name"===s?n.sort((e,t)=>{const s=(this.users[e]||{}).sortName||"",i=(this.users[t]||{}).sortName||"";return s.localeCompare(i)}):"online"===s&&n.sort((e,t)=>{const s=P.getUserStatusForSort(P.getUser(e).status);return P.getUserStatusForSort(P.getUser(t).status)-s});const r=m.default.myId.toUserId();return Object(a.e)(n,r),t&&this.testSelfSearch(e)&&n.unshift(r),n})}getContactsPeerIds(e,t,s){return this.getContacts(e,t,s).then(e=>e.map(e=>e.toPeerId(!1)))}toggleBlock(e,t){return u.a.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:I.a.getInputPeerById(e)}).then(s=>(s&&_.a.processLocalUpdate({_:"updatePeerBlocked",peer_id:I.a.getOutputPeer(e),blocked:t}),s))}testSelfSearch(e){const t=this.getSelf(),s=this.createSearchIndex();return s.indexObject(t.id,this.getUserSearchText(t.id)),s.search(e).has(t.id)}createSearchIndex(){return new v.a({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach(e=>this.saveApiUser(e,t)))}saveApiUser(e,t){var s,i;if("userEmpty"===e._)return;const a=e.id,n=this.users[a];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==n)return;if(!n||n.username!==e.username){if(null==n?void 0:n.username){const e=o(n.username);delete this.usernames[e]}if(e.username){const t=o(e.username);this.usernames[t]=a}}if(n&&void 0!==n.initials&&void 0!==n.sortName&&n.first_name===e.first_name&&n.last_name===e.last_name)e.sortName=n.sortName,e.initials=n.initials;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":Object(r.b)(t,!1),e.initials=f.a.getAbbreviation(t)}e.status&&(e.status.expires&&(e.status.expires-=g.a.serverTimeOffset),e.status.was_online&&(e.status.was_online-=g.a.serverTimeOffset));let d=!1,l=!1;if(void 0===n)this.users[a]=e;else{e.first_name===n.first_name&&e.last_name===n.last_name&&e.username===n.username||(l=!0);(null===(s=n.photo)||void 0===s?void 0:s.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id)&&(d=!0);const t=!!n.pFlags.contact,r=!!e.pFlags.contact;Object(c.i)(n,e),m.default.dispatchEvent("user_update",a),t!==r&&this.onContactUpdated(a,r,t)}d&&m.default.dispatchEvent("avatar_update",e.id.toPeerId()),l&&m.default.dispatchEvent("peer_title_edit",e.id.toPeerId()),this.setUserToStateIfNeeded(e)}setUserToStateIfNeeded(e){M.default.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}formatUserPhone(e){return"+"+Object(l.a)(e).formatted}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e&&(e=this.getUser(e).status),e){const t="userStatusOnline"===e._?e.expires:"userStatusOffline"===e._?e.was_online:0;if(t)return t;switch(e._){case"userStatusRecently":return 3;case"userStatusLastWeek":return 2;case"userStatusLastMonth":return 1}}return 0}getUser(e){return Object(c.f)(e)?e:this.users[e]||{id:e,pFlags:{deleted:!0},access_hash:""}}getSelf(){return this.getUser(m.default.myId)}getUserStatusString(e){var t;let s,i;switch(e){case p.c:s="Peer.RepliesNotifications";break;case p.d:s="Peer.ServiceNotifications";break;default:{if(this.isBot(e)){s="Bot";break}const a=this.getUser(e);if(!a){s="";break}if(a.pFlags.support){s="SupportStatus";break}switch(null===(t=a.status)||void 0===t?void 0:t._){case"userStatusRecently":s="Lately";break;case"userStatusLastWeek":s="WithinAWeek";break;case"userStatusLastMonth":s="WithinAMonth";break;case"userStatusOffline":{const e=a.status.was_online,t=Date.now()/1e3;if(t-e<60)s="Peer.Status.justNow";else if(t-e<3600){s="Peer.Status.minAgo";i=[(t-e)/60|0]}else if(t-e<86400){s="LastSeen.HoursAgo";i=[(t-e)/3600|0]}else{s="Peer.Status.LastSeenAt";const t=new Date(1e3*e);i=[("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2),("0"+t.getHours()).slice(-2)+":"+("0"+t.getMinutes()).slice(-2)]}break}case"userStatusOnline":s="Online";break;default:s="ALongTimeAgo"}break}}return Object(h.i18n)(s,i)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isContact(e){return this.contactsList.has(e)||!(!this.users[e]||!this.users[e].pFlags.contact)}isRegularUser(e){const t=this.users[e];return t&&!this.isBot(e)&&!t.pFlags.deleted&&!t.pFlags.support}isNonContactUser(e){return this.isRegularUser(e)&&!this.isContact(e)&&e.toPeerId()!==m.default.myId}hasUser(e,t){const s=this.users[e];return Object(c.f)(s)&&(t||!s.pFlags.min)}canSendToUser(e){const t=this.getUser(e);return!t.pFlags.deleted&&t.id.toPeerId()!==p.c}getUserPhoto(e){const t=this.getUser(e);return t&&t.photo||{_:"userProfilePhotoEmpty"}}getUserString(e){const t=this.getUser(e);return"u"+e+(t.access_hash?"_"+t.access_hash:"")}getUserInput(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputUserSelf"}:{_:"inputUser",user_id:e,access_hash:t.access_hash}}getUserInputPeer(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputPeerSelf"}:{_:"inputPeerUser",user_id:e,access_hash:t.access_hash}}getContactMediaInput(e){const t=this.getUser(e);return{_:"inputMediaContact",first_name:t.first_name,last_name:t.last_name,phone_number:t.phone,vcard:"",user_id:e}}updateUserStatus(e,t=Object(d.g)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(_.a.updatesState.syncLoading)return;const i=this.getUser(e);i&&i.status&&"userStatusOnline"!==i.status._&&"userStatusEmpty"!==i.status._&&!i.pFlags.support&&!i.pFlags.deleted&&(i.status={_:"userStatusOnline",expires:s+60},m.default.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(i))}importContact(e,t,s){return this.importContacts([{first_name:e,last_name:t,phones:[s]}]).then(e=>{if(!e.length){const e=new Error;throw e.type="NO_USER",e}return e[0]})}importContacts(e){const t=[];for(let s=0;s{this.saveApiUsers(e.users);return e.imported.map(e=>(this.onContactUpdated(e.user_id,!0),e.user_id))})}getTopPeers(e){return this.getTopPeersPromises[e]?this.getTopPeersPromises[e]:this.getTopPeersPromises[e]=M.default.getState().then(t=>{const s=t.topPeersCache[e];return s&&s.cachedTime+864e5>Date.now()&&s.peers?s.peers:u.a.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then(s=>{let i=[];return"contacts.topPeers"===s._&&(this.saveApiUsers(s.users),y.a.saveApiChats(s.chats),s.categories.length&&(i=s.categories[0].peers.map(e=>{const t=I.a.getPeerId(e.peer);return M.default.requestPeer(t,"topPeer"),{id:t,rating:e.rating}}))),t.topPeersCache[e]={peers:i,cachedTime:Date.now()},M.default.pushToState("topPeersCache",t.topPeersCache),i})})}getBlocked(e=0,t=0){return u.a.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then(e=>{this.saveApiUsers(e.users),y.a.saveApiChats(e.chats);return{count:"contacts.blocked"===e._?e.users.length+e.chats.length:e.count,peerIds:e.users.map(e=>e.id.toPeerId()).concat(e.chats.map(e=>e.id.toPeerId(!0)))}})}searchContacts(e,t=20){return u.a.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then(e=>{this.saveApiUsers(e.users),y.a.saveApiChats(e.chats);return{my_results:Object(a.b)(e.my_results.map(e=>I.a.getPeerId(e))),results:e.results.map(e=>I.a.getPeerId(e))}})}onContactUpdated(e,t,s=this.isContact(e)){t!==s&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),m.default.dispatchEvent("contacts_update",e))}updateUsername(e){return u.a.invokeApi("account.updateUsername",{username:e}).then(e=>{this.saveApiUser(e)})}setUserStatus(e,t){if(this.isBot(e))return;const s=this.users[e];if(s){const i=t?{_:"userStatusOffline",was_online:Object(d.g)(!0)}:{_:"userStatusOnline",expires:Object(d.g)(!0)+50};s.status=i,m.default.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(s)}}addContact(e,t,s,i,a){return u.a.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:s,phone:i,add_phone_privacy_exception:a}).then(t=>{_.a.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)})}deleteContacts(e){return u.a.invokeApi("contacts.deleteContacts",{id:e.map(e=>this.getUserInput(e))}).then(t=>{_.a.processUpdateMessage(t,{override:!0}),e.forEach(e=>{this.onContactUpdated(e,!1)})})}};i.a.appUsersManager=P;t.a=P},function(e,t,s){"use strict";var i=s(75),a=s(103),n=s(46),r=s(56),o=s(104),d=s(32),l=s(65),c=s(78),h=s(16),u=s(43),p=s(33),g=s(135),f=s(70),m=s(31),v=s(15),_=s(114),y=s(41),I=s(128),M=s(45),P=s(2);class S{constructor(e,t,s,i,a,n,r,o,d,l){this.appMessagesManager=e,this.appChatsManager=t,this.appPeersManager=s,this.appUsersManager=i,this.appDraftsManager=a,this.appNotificationsManager=n,this.appStateManager=r,this.apiUpdatesManager=o,this.serverTimeManager=d,this.appMessagesIdsManager=l,this.folders={},this.onUpdateFolderPeers=e=>{e.folder_peers.forEach(e=>{var t;const{folder_id:s,peer:i}=e,a=this.appPeersManager.getPeerId(i),n=this.dropDialog(a)[0];n&&((null===(t=n.pFlags)||void 0===t?void 0:t.pinned)&&this.handleDialogUnpinning(n,s),n.folder_id=s,this.generateIndexForDialog(n),this.pushDialog(n)),this.appMessagesManager.scheduleHandleNewDialogs(a,n)})},this.onUpdateDialogPinned=e=>{var t;const s=null!==(t=e.folder_id)&&void 0!==t?t:0,i=this.appPeersManager.getPeerId(e.peer.peer),a=this.getDialogOnly(i);a&&(e.pFlags.pinned?a.pFlags.pinned=!0:this.handleDialogUnpinning(a,s),this.generateIndexForDialog(a)),this.appMessagesManager.scheduleHandleNewDialogs(i,a)},this.onUpdatePinnedDialogs=e=>{var t;const s=null!==(t=e.folder_id)&&void 0!==t?t:0,i=e=>{this.pinnedOrders[s].length=0,e.reverse(),e.forEach(e=>{a[e]=!0;const t=this.getDialogOnly(e);this.appMessagesManager.scheduleHandleNewDialogs(e,t),t&&(t.pFlags.pinned=!0,this.generateIndexForDialog(t))});const t=this.getFolderDialogs(s,!1);for(const e of t){if(!e.pFlags.pinned)break;const t=e.peerId;a[t]||this.appMessagesManager.scheduleHandleNewDialogs(t)}},a={};e.order?i(e.order.map(e=>this.appPeersManager.getPeerId(e.peer))):p.a.invokeApi("messages.getPinnedDialogs",{folder_id:s}).then(e=>{this.applyDialogs(e),i(e.dialogs.map(e=>e.peerId))})},this.storage=this.appStateManager.storages.dialogs,this.dialogs=this.storage.getCache(),this.clear(!0),v.default.addEventListener("language_change",()=>{const e=i.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=s.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}});const c=e=>{const t=this.getCachedDialogs(!1);for(let s=0;s{const e=this.getCachedDialogs(!1);for(const e in this.folders)+e>1&&delete this.folders[e];for(let t=0;t{const t=this.getCachedDialogs(!1),s="index_"+e.orderIndex;for(let e=0;e{const t=this.appChatsManager.getChat(e),s=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(s)&&this.dropDialogOnDeletion(s)}),v.default.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updatePinnedDialogs:this.onUpdatePinnedDialogs}),r.getState().then(e=>{this.pinnedOrders=e.pinnedOrders||{},this.pinnedOrders[0]||(this.pinnedOrders[0]=[]),this.pinnedOrders[1]||(this.pinnedOrders[1]=[]);const t=r.storagesResults.dialogs;if(t.length)for(let e=0,s=t.length;evoid 0===e.migratedTo):s.dialogs}getCachedDialogs(e){return this.getFolderDialogs(0,e).concat(this.getFolderDialogs(1,e))}setDialogIndexInFilter(e,t,s){var i;let a;if(this.appMessagesManager.filtersStorage.testDialogForFilter(e,s)){const t=s.pinnedPeerIds.indexOf(e.peerId);a=-1!==t?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(s.pinned_peers.length-1-t),!0):(null===(i=e.pFlags)||void 0===i?void 0:i.pinned)?this.generateIndexForDialog(e,!0):e.index}return e[t]=a}getDialog(e,t,s=!0){const i=[];void 0===t?i.push(this.getFolder(0).dialogs,this.getFolder(1).dialogs):i.push(this.getFolderDialogs(t,!1));for(let t of i){let i=0,a=0;for(let n=t.length;it.peerId===e.peerId),n=i[a],r=n&&n[s],o=this.setDialogIndexInFilter(e,s,t);r!==o&&((!r&&o||a&&!o)&&this.prepareFolderUnreadCountModifyingByDialog(t.id,e,!!o),-1!==a&&i.splice(a,1),o&&Object(y.f)(i,e,s,a))}prepareDialogUnreadCountModifying(e){const t=[this.prepareFolderUnreadCountModifyingByDialog(e.folder_id,e)],s=this.appMessagesManager.filtersStorage.filters;for(const i in s){const a=s[i];this.appMessagesManager.filtersStorage.testDialogForFilter(e,a)&&t.push(this.prepareFolderUnreadCountModifyingByDialog(a.id,e))}return()=>t.forEach(e=>e())}prepareFolderUnreadCountModifyingByDialog(e,t,s){const i=this.appMessagesManager.getDialogUnreadCount(t);if(void 0===s)return()=>{const s=this.appMessagesManager.getDialogUnreadCount(t),a=s-i,n=s&&!i||!s&&i?i?-1:1:0;this.modifyFolderUnreadCount(e,a,n)};this.modifyFolderUnreadCount(e,s?i:-i,i?s?1:-1:0)}modifyFolderUnreadCount(e,t,s){if(!t&&!s)return;const i=this.getFolder(e);t&&(i.unreadMessagesCount=Math.max(0,i.unreadMessagesCount+t)),s&&(i.unreadDialogsCount=Math.max(0,i.unreadDialogsCount+s)),void 0===i.dispatchUnreadTimeout&&(i.dispatchUnreadTimeout=P.a.setTimeout(()=>{i.dispatchUnreadTimeout=void 0,v.default.dispatchEvent("folder_unread",i)},0))}generateIndexForDialog(e,t=!1,s){var i;let a,n=0;if(e.pFlags.pinned&&!t)n=this.generateDialogPinnedDate(e),a=!0;else{s||(s=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),n=s.date||n;const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!n||e.date&&e.date>n)&&(n=e.date)}"draftMessage"===(null===(i=e.draft)||void 0===i?void 0:i._)&&e.draft.date>n&&(n=e.draft.date)}n||(n=Object(r.g)(!0));const o=this.generateDialogIndex(n,a);if(t)return o;e.index=o}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.pinnedOrders[e.folder_id],s=t.indexOf(e.peerId);let i=s;return-1===s&&(i=t.push(e.peerId)-1,this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(i)}setDialogToState(e){const{peerId:t,pts:s}=e,i=this.appMessagesManager.getHistoryStorage(t),a=this.appMessagesManager.getMessagesStorage(t),n=i.history.slice;let r;for(let e=0,s=n.length;ee.peerId===n);if(-1!==o&&r.splice(o,1),this.dialogs[n]=e,this.setDialogToState(e),void 0===t&&(t=this.getDialogOffsetDate(e)),this.processDialogForFilters(e),t&&!e.pFlags.pinned){if(i){const e=this.dialogsOffsetDate[void 0];(!e||t{"dialogFolder"===t._&&e.dialogs.splice(s,1)}),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const t={};e.dialogs.forEach(e=>{const s=this.appPeersManager.getPeerId(e.peer);let i=e.top_message;const a=this.appMessagesManager.pendingTopMsgs[s];a&&(!i||this.appMessagesManager.getMessageByPeer(s,a).date>this.appMessagesManager.getMessageByPeer(s,i).date)&&(e.top_message=i=a,this.appMessagesManager.getHistoryStorage(s).maxId=a),i||e.draft&&"draftMessage"===e.draft._?(this.saveDialog(e),t[s]=e):this.dropDialogWithEvent(s);const n=this.appMessagesManager.newUpdatesAfterReloadToHandle[s];if(void 0!==n){for(const e of n)this.apiUpdatesManager.saveUpdate(e);delete this.appMessagesManager.newUpdatesAfterReloadToHandle[s]}}),Object.keys(t).length&&v.default.dispatchEvent("dialogs_multiupdate",t)}getDialogOffsetDate(e){return this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message).date||0}saveDialog(e,t,s,i){var a,n;void 0===t&&(t=null!==(a=e.folder_id)&&void 0!==a?a:0);const r=this.appPeersManager.getPeerId(e.peer);if(!r)return void console.error("saveConversation no peerId???",e,t);"dialog"!==e._&&console.error("saveConversation not regular dialog",e,Object.assign({},e));const o=this.appPeersManager.isChannel(r)?r.toChatId():M.b;if(r.isAnyChat()){const e=this.appChatsManager.getChat(r.toChatId());if("channelForbidden"===e._||e.pFlags.left||e.pFlags.kicked)return}const l=this.appPeersManager.getPeerSearchText(r);this.dialogsIndex.indexObject(r,l);const c=this.getDialogOnly(r);let h,u;if(e.top_message){h=this.appMessagesIdsManager.generateMessageId(e.top_message);const t=(null==c?void 0:c.top_message)&&this.appMessagesManager.getMessageByPeer(r,c.top_message);(null===(n=null==t?void 0:t.pFlags)||void 0===n?void 0:n.is_outgoing)&&c.top_message>=h&&(h=c.top_message),u=this.appMessagesManager.getMessageByPeer(r,h)}else h=this.appMessagesManager.generateTempMessageId(r),u={_:"message",id:h,mid:h,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([u],{isOutgoing:!0});if((null==u?void 0:u.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,u),!o&&r.isAnyChat()){const t=this.appChatsManager.getChat(r.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const s=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[r]=s,this.appMessagesManager.migratedToFrom[s]=r,e.migratedTo=s}}if(e.top_message=h,e.read_inbox_max_id=this.appMessagesIdsManager.generateMessageId(c&&!e.read_inbox_max_id?c.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=this.appMessagesIdsManager.generateMessageId(c&&!e.read_outbox_max_id?c.read_outbox_max_id:e.read_outbox_max_id),void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=c?c.folder_id:t),e.draft=this.appDraftsManager.saveDraft(r,0,e.draft),e.peerId=r,u.pFlags.is_outgoing){const t=u.pFlags.out;h>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(u.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete u.pFlags.unread}const p=this.appMessagesManager.getHistoryStorage(r),g=p.history.slice;if(g.length){if(!g.isEnd(I.a.Bottom)){p.history.insertSlice([h]).setEnd(I.a.Bottom),this.appMessagesManager.mergeReplyKeyboard(p,u)&&v.default.dispatchEvent("history_reply_markup",{peerId:r})}}else p.history.unshift(h),this.appMessagesManager.mergeReplyKeyboard(p,u)&&v.default.dispatchEvent("history_reply_markup",{peerId:r});p.maxId=h,p.readMaxId=e.read_inbox_max_id,p.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:r,settings:e.notify_settings}),o&&e.pts&&this.apiUpdatesManager.addChannelState(o,e.pts),this.generateIndexForDialog(e),Object(d.c)(e,["index_0","index_1","index_2","index_3","index_4","index_5","index_6","index_7","index_8","index_9","index_10"]),c&&Object(d.i)(c,e),this.pushDialog(e,u.date,s,i)}getDialogIndexKey(e){return e>1?"index_"+this.appMessagesManager.filtersStorage.getFilter(e).orderIndex:"index"}getDialogs(e="",t,s=20,i=0,a=!1){const n={};if(i>1){const r=[],o=this.appUsersManager.fillContacts();o.cached||r.push(o.promise);const d=this.appMessagesManager.filtersStorage.reloadMissingPeerIds(i);if(d&&r.push(d),r.length)return n.cached=!1,n.promise=Promise.all(r).then(()=>this.getDialogs(e,t,s,i,a).promise),n}const r=i>1||this.getOffsetDate(i)?void 0:i;let o=this.getFolderDialogs(i,a);const d=this.getDialogIndexKey(i);if(e){if(!s||this.cachedResults.query!==e||this.cachedResults.folderId!==i){this.cachedResults.query=e,this.cachedResults.folderId=i;const t=this.dialogsIndex.search(e),s=[];for(const e in this.dialogs){const a=this.dialogs[e];t.has(a.peerId)&&a.folder_id===i&&s.push(a)}s.sort((e,t)=>t[d]-e[d]),this.cachedResults.dialogs=s,this.cachedResults.count=s.length}o=this.cachedResults.dialogs}else this.cachedResults.query="";let l=0;if(t>0)for(let e=o.length;lo[l][d]);++l);const c=this.isDialogsLoaded(r),h=o.length>=l+s;if(e||c||h){const i=o.slice(l,l+s);return n.cached=!0,n.promise=Promise.resolve({dialogs:i,count:c?o.length:null,isTopEnd:o.length&&(i[0]&&i[0]===o[0]||o[0][d]=o.length}),n}return n.cached=!1,n.promise=this.appMessagesManager.getTopMessages(s,r).then(e=>{if(a&&(o=this.getFolderDialogs(i,a)),l=0,t>0)for(let e=o.length;lo[l][d]);++l);const n=o.slice(l,l+s);return{dialogs:n,count:void 0===e.count?o.length:e.count,isTopEnd:o.length&&(n[0]&&n[0]===o[0]||o[0][d]{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id]),this.appStateManager.pushToState("filters",this.filters)},this.onUpdateDialogFilterOrder=e=>{this.orderIndex=1,e.order.forEach((e,t)=>{const s=this.filters[e];delete s.orderIndex,this.setOrderIndex(s)}),this.rootScope.dispatchEvent("filter_order",e.order),this.appStateManager.pushToState("filters",this.filters)},this.clear(),this.filters={},this.appStateManager.getState().then(e=>{Object(d.i)(this.filters,e.filters);for(const e in this.filters){const t=this.filters[e];t.hasOwnProperty("orderIndex")&&t.orderIndex>=this.orderIndex&&(this.orderIndex=t.orderIndex+1)}}),r.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:e=>{const t=Object(d.a)(this.filters);this.getDialogFilters(!0).then(e=>{for(const s in t){const t=+s;e.find(e=>e.id===t)||this.onUpdateDialogFilter({_:"updateDialogFilter",id:t})}this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e.map(e=>e.id)})})},updateDialogFilterOrder:this.onUpdateDialogFilterOrder})}clear(e=!1){e||Object(d.i)(this.filters,{}),this.orderIndex=1,this.reloadedPeerIds=new Set}testDialogForFilter(e,t){const s=e.peerId;if(!this.appMessagesManager.getDialogOnly(s))return!1;if(t.excludePeerIds.includes(s))return!1;if(t.includePeerIds.includes(s))return!0;const i=t.pFlags;if(i.exclude_archived&&1===e.folder_id)return!1;if(i.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(i.exclude_muted){if(this.appNotificationsManager.isPeerLocalMuted(s))return!1}if(this.appPeersManager.isAnyChat(s)){if(i.broadcasts&&this.appPeersManager.isBroadcast(s))return!0;if(i.groups&&this.appPeersManager.isAnyGroup(s))return!0}else{const e=s.toUserId();if(this.appUsersManager.isBot(e))return!!i.bots;if(i.non_contacts&&!this.appUsersManager.isContact(e))return!0;if(i.contacts&&this.appUsersManager.isContact(e))return!0}return!1}testDialogForFilterId(e,t){return this.testDialogForFilter(e,this.filters[t])}getFilter(e){return this.filters[e]}toggleDialogPin(e,t){const s=this.filters[t],i=s.pinnedPeerIds.indexOf(e),a=-1!==i;if(a&&(s.pinned_peers.splice(i,1),s.pinnedPeerIds.splice(i,1)),!a){if(s.pinned_peers.length>=this.rootScope.config.pinned_infolder_count_max)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"});s.pinned_peers.unshift(this.appPeersManager.getInputPeerById(e)),s.pinnedPeerIds.unshift(e)}return this.updateDialogFilter(s)}createDialogFilter(e,t){const s=Math.max(1,...Object.keys(this.filters).map(e=>+e));return(e=Object(d.a)(e)).id=s+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,s=!1){const i=t?0:1;return p.a.invokeApi("messages.updateDialogFilter",{flags:i,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then(i=>{if(i&&(this.onUpdateDialogFilter({_:"updateDialogFilter",id:e.id,filter:t?void 0:e}),s)){const t=[];for(const e in this.filters){const s=this.filters[e];++s.orderIndex,t.push(s)}e.orderIndex=1;const s=t.sort((e,t)=>e.orderIndex-t.orderIndex).map(e=>e.id);this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:s})}return i})}getOutputDialogFilter(e){const t=Object(d.a)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){Object(y.d)(e.includePeerIds,(t,s)=>{e.pinnedPeerIds.includes(t)&&(e.include_peers.splice(s,1),e.includePeerIds.splice(s,1))})}reloadMissingPeerIds(e){const t=[],s=this.getFilter(e),i=null==s?void 0:s.pinned_peers;if(null==i?void 0:i.length){const e=i.filter((e,t)=>{const s=this.appPeersManager.getPeerId(e);return!this.reloadedPeerIds.has(s)&&!this.appMessagesManager.getDialogOnly(s)});if(e.length){const s=e.map(e=>{const t=this.appPeersManager.getPeerId(e),s=this.appMessagesManager.reloadConversation(e);return s.then(()=>{this.reloadedPeerIds.add(t)}),s}),i=Promise.all(s);t.push(i)}}return t.length?Promise.all(t):void 0}getDialogFilters(e=!1){return b(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);if(t.length&&!e)return t.map(e=>this.filters[e]).sort((e,t)=>e.orderIndex-t.orderIndex);const s=yield p.a.invokeApiSingle("messages.getDialogFilters");for(const t of s)this.saveDialogFilter(t,e);return s}))}saveDialogFilter(e,t=!0){w.forEach(([t,s])=>{e[s]=e[t].map(e=>this.appPeersManager.getPeerId(e))}),this.filterIncludedPinnedPeers(e),e.include_peers=e.pinned_peers.concat(e.include_peers),e.includePeerIds=e.pinnedPeerIds.concat(e.includePeerIds);const s=this.filters[e.id];s?Object.assign(s,e):this.filters[e.id]=e,this.setOrderIndex(e),t?this.rootScope.dispatchEvent("filter_update",e):s||this.rootScope.dispatchEvent("filter_new",e)}setOrderIndex(e){e.hasOwnProperty("orderIndex")?e.orderIndex>=this.orderIndex&&(this.orderIndex=e.orderIndex+1):e.orderIndex=this.orderIndex++,this.appStateManager.pushToState("filters",this.filters)}}var E=s(74),k=s(48),D=s(66),A=s(73),U=s(44),T=s(53),F=s(129),x=s(17),O=s(39),L=s(146),j=s(116),B=s(126),R=s(71),N=s(29),H=s(97),G=s(49),z=s(136),W=s(96);const q={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks"};function V(e,t){const s=function(e,t=2){e||(e=1);let s=[];const i=[{m:1,t:"s"},{m:60,t:"m"},{m:60,t:"h"},{m:24,t:"d"},{m:7,t:"w"}];let a=1;i.forEach((t,n)=>{if(a*=t.m,e=0;--e)0===n[e].duration&&n.splice(e,1);return n}(e,2);if(t){const e=s.map(e=>h.default.format(q[e.type],!0,[e.duration]));return Object(h.join)(e,!1,t)}const i=s.map(e=>Object(h.i18n)(q[e.type],[e.duration])),a=document.createElement("span");return a.append(...Object(h.join)(i,!1)),a}var $=s(117),K=s(24),Q=s(110),J=s(109),Y=s(102),Z=s(147),X=s(151),ee=s(137),te=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const se=new class{constructor(){this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new i.a(10),this.needSingleMessages=new Map,this.fetchSingleMessagesPromise=null,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newMessagesHandleTimeout=0,this.newMessagesToHandle={},this.newDialogsToHandle={},this.newUpdatesAfterReloadToHandle={},this.notificationsHandlePromise=0,this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=Object(u.b)("MESSAGES",u.a.Error|u.a.Debug|u.a.Log|u.a.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.handleNewMessages=()=>{clearTimeout(this.newMessagesHandleTimeout),this.newMessagesHandleTimeout=0,v.default.dispatchEvent("history_multiappend",this.newMessagesToHandle),this.newMessagesToHandle={}},this.handleNewDialogs=()=>{let e=0;const t=this.newDialogsToHandle;for(const s in t){const i=t[s];i?(this.dialogsStorage.pushDialog(i),U.a.isChannel(s.toPeerId())||(e=Math.max(e,i.top_message||0))):(this.reloadConversation(s.toPeerId()),delete t[s])}0!==e&&this.incrementMaxSeenId(e),v.default.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle={}},this.handleNotifications=()=>{window.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=0;for(const e in this.notificationsToHandle){const t=e.toPeerId();if(v.default.peerId===t&&!v.default.idle.isIDLE)continue;const s=this.notificationsToHandle[t];Promise.all([H.a.getNotifyPeerTypeSettings(),H.a.getNotifySettings(U.a.getInputNotifyPeerById(t,!0))]).then(([e,i])=>{const a=s.topMessage;!H.a.isPeerLocalMuted(t,!0)&&a.pFlags.unread&&a.pFlags.unread&&this.notifyAboutMessage(a,{fwdCount:s.fwdCount,peerTypeNotifySettings:i})})}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id,s=this.pendingByRandomId[t];if(s){const{peerId:i,tempId:a,threadId:n,storage:r}=s,o=Y.a.generateMessageId(e.id),d=this.getMessageFromStorage(r,o);d.deleted?this.pendingByMessageId[o]=t:([this.getHistoryStorage(i),n?this.getHistoryStorage(i,n):void 0].filter(Boolean).forEach(e=>{e.history.delete(a)}),this.finalizePendingMessageCallbacks(r,a,d))}},this.onUpdateNewMessage=e=>{var t;const s=e.message,i=this.getMessagePeer(s),a=this.getMessagesStorage(i),n=this.getDialogOnly(i),r="updateNewDiscussionMessage"===e._;this.saveMessages([s],{storage:new Map});const o=this.getThreadKey(s),d=o?+o.split("_")[1]:void 0;if(d&&!r&&this.threadsStorage[i]&&this.threadsStorage[i][d]){const e={_:"updateNewDiscussionMessage",message:s};this.onUpdateNewMessage(e)}if(!n&&!r){let s=!0;if(i.isAnyChat()&&(s=k.a.isInChat(i.toChatId())),s){const s=null!==(t=this.newUpdatesAfterReloadToHandle[i])&&void 0!==t?t:this.newUpdatesAfterReloadToHandle[i]=new Set;if(s.has(e))return void this.log.error("here we go again",i);this.scheduleHandleNewDialogs(i),s.add(e)}return}this.saveMessages([s],{storage:a});const l=this.checkPendingMessage(s),c=this.getHistoryStorage(i,r?d:void 0);if(r||this.updateMessageRepliesIfNeeded(s),c.history.findSlice(s.mid))return!1;const h=c.history.first;if(h.isEnd(I.a.Bottom)){let e=0;for(const t=h.length;eh[e]);++e);h.splice(e,0,s.mid)}else c.history.unshift(s.mid);null!==c.count&&c.count++,this.mergeReplyKeyboard(c,s)&&v.default.dispatchEvent("history_reply_markup",{peerId:i});const u=s.fromId;if(u.isUser()&&!s.pFlags.out&&s.from_id){O.a.forceUserOnline(u,s.date);const e={_:"sendMessageCancelAction"};let t;t=i.isUser()?{_:"updateUserTyping",action:e,user_id:u}:U.a.isChannel(i)?{_:"updateChannelUserTyping",action:e,channel_id:i.toChatId(),from_id:U.a.getOutputPeer(u),top_msg_id:d?Y.a.getServerMessageId(d):void 0}:{_:"updateChatUserTyping",action:e,chat_id:i.toChatId(),from_id:U.a.getOutputPeer(u)},E.a.processLocalUpdate(t)}if(l||this.handleNewMessage(i,s.mid),r)return;const p=!s.pFlags.out&&s.pFlags.unread;if(n){if(p){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(n);++n.unread_count,s.pFlags.mentioned&&(++n.unread_mentions_count,this.modifyCachedMentions(i,s.mid,!0)),e()}this.setDialogTopMessage(s,n)}if(p){const e=i;let t=this.notificationsToHandle[e];void 0===t&&(t=this.notificationsToHandle[e]={fwdCount:0,fromId:M.b}),t.fromId!==u&&(t.fromId=u,t.fwdCount=0),s.fwd_from&&++t.fwdCount,t.topMessage=s,this.notificationsHandlePromise||(this.notificationsHandlePromise=window.setTimeout(this.handleNotifications,0))}},this.onUpdateDialogUnreadMark=e=>{const t=U.a.getPeerId(e.peer.peer),s=this.getDialogOnly(t);if(s){const i=this.dialogsStorage.prepareDialogUnreadCountModifying(s);e.pFlags.unread?s.pFlags.unread_mark=!0:delete s.pFlags.unread_mark,i(),v.default.dispatchEvent("dialogs_multiupdate",{[t]:s}),this.dialogsStorage.setDialogToState(s)}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{const t=e.message,s=this.getMessagePeer(t),i=Y.a.generateMessageId(t.id),a=this.getMessagesStorage(s);if(!a.has(i))return;const n=this.getMessageFromStorage(a,i);this.saveMessages([t],{storage:a});const r=this.getMessageFromStorage(a,i);this.handleEditedMessage(n,r);const o=this.getDialogOnly(s),d=o&&o.top_message===i;if(t.clear_history)d&&v.default.dispatchEvent("dialog_flush",{peerId:s});else if(v.default.dispatchEvent("message_edit",{storage:a,peerId:s,mid:i}),d||t.grouped_id){const e={};e[s]=o,v.default.dispatchEvent("dialogs_multiupdate",e),this.dialogsStorage.setDialogToState(o)}},this.onUpdateReadHistory=e=>{const t=e.channel_id,s=Y.a.generateMessageId(e.max_id||e.read_max_id),i=Y.a.generateMessageId(e.top_msg_id),a=t?t.toPeerId(!0):U.a.getPeerId(e.peer),n="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=this.getMessagesStorage(a),o=Object(d.e)(r,"desc"),l=this.getDialogOnly(a),c=e.still_unread_count;let h=0,u=0,p=!1;const g=this.getHistoryStorage(a,i);if(a.isUser()&&n&&O.a.forceUserOnline(a),i){const e=this.threadsToReplies[a+"_"+i];if(e){const[t,s]=e.split("_");this.updateMessage(t.toPeerId(),+s,"replies_updated")}}const f=!i&&l&&this.dialogsStorage.prepareDialogUnreadCountModifying(l);for(let e=0,t=o.length;es)continue;const d=r.get(t);if(d.pFlags.out===n){if(!d.pFlags.unread)break;if(i){const e=d.reply_to;if(!e||(e.reply_to_top_id||e.reply_to_msg_id)!==i)continue}d.pFlags.unread&&(delete d.pFlags.unread,p||(p=!0),d.pFlags.out||i||!l||(void 0===c&&(h=--l.unread_count),d.pFlags.mentioned&&(u=--l.unread_mentions_count,this.modifyCachedMentions(a,d.mid,!1))),H.a.cancel("msg"+t))}}if(n?g.readOutboxMaxId=s:g.readMaxId=s,!i&&l){if(n?l.read_outbox_max_id=s:l.read_inbox_max_id=s,!n){let e;void 0!==c?e=c:h<0||!this.getReadMaxIdIfUnread(a)?e=0:h&&l.top_message>s&&(e=h),void 0!==e&&(l.unread_count=e),u<0&&(l.unread_mentions_count=0)}f&&f(),this.dialogsStorage.processDialogForFilters(l),v.default.dispatchEvent("dialog_unread",{peerId:a}),this.dialogsStorage.setDialogToState(l)}if(p&&v.default.dispatchEvent("messages_read"),!i&&t){const e=a+"_";for(const t in this.threadsToReplies)if(0===t.indexOf(e)){const[e,s]=this.threadsToReplies[t].split("_");v.default.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+s))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,s=e.messages.map(e=>Y.a.generateMessageId(e)),i=t?t.toPeerId(!0):this.getMessageById(s[0]).peerId;for(let e=0,t=s.length;e{const t=e.channel_id.toPeerId(!0),s=this.getHistoryStorage(t).history.slice,i=Y.a.generateMessageId(e.available_min_id),a=s.filter(e=>e<=i);e.messages=a,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{const t=e.channel_id,s=e.messages.map(e=>Y.a.generateMessageId(e)),i=t?t.toPeerId(!0):this.getMessageById(s[0]).peerId;if(!i)return;p.a.clearCache("messages.getSearchCounters",e=>U.a.getPeerId(e.peer)===i);const a=new Set;for(const e of s){const t=this.getMessageByPeer(i,e),s=this.getThreadKey(t);s&&this.threadsStorage[i]&&this.threadsStorage[i][+s.split("_")[1]]&&a.add(s)}const n=this.handleDeletedMessages(i,this.getMessagesStorage(i),s),r=Array.from(a).map(e=>{const[t,s]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+s)}),o=this.getHistoryStorage(i);[o].concat(r).forEach(e=>{for(const t of n.msgs)e.history.delete(t);n.count&&e.count&&(e.count=Math.max(0,e.count-n.count))}),v.default.dispatchEvent("history_delete",{peerId:i,msgs:n.msgs});const d=this.getDialogOnly(i);if(d){const e=n.unreadMentions||n.unread,t=e&&this.dialogsStorage.prepareDialogUnreadCountModifying(d);if(n.unreadMentions&&(d.unread_mentions_count=Math.max(0,d.unread_mentions_count-n.unreadMentions)),n.unread&&(d.unread_count=Math.max(0,d.unread_count-n.unread)),e&&(t(),v.default.dispatchEvent("dialog_unread",{peerId:i})),n.msgs.has(d.top_message)){const e=o.history.first;if(e.isEnd(I.a.Bottom)&&e.length){const t=e[0],s=this.getMessageByPeer(i,t);this.setDialogTopMessage(s,d)}else this.reloadConversation(i)}}},this.onUpdateChannel=e=>{const t=e.channel_id,s=t.toPeerId(!0),i=k.a.getChat(t),a=k.a.isInChat(t);(!!i.username||!i.pFlags.left)!==(void 0!==this.historiesStorage[s])&&(delete this.historiesStorage[s],v.default.dispatchEvent("history_forbidden",s));!!this.getDialogOnly(s)!==a&&(a?this.reloadConversation(s):this.dialogsStorage.dropDialogOnDeletion(s))},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.dialogsStorage.dropDialog(t),delete this.historiesStorage[t],this.reloadConversation(t).then(()=>{v.default.dispatchEvent("history_reload",t)})},this.onUpdateChannelMessageViews=e=>{const t=e.views,s=e.channel_id.toPeerId(!0),i=Y.a.generateMessageId(e.id),a=this.getMessageByPeer(s,i);!a.deleted&&void 0!==a.views&&a.views{const t=M.d,s=t,i=this.generateTempMessageId(s),a={_:"message",id:i,from_id:U.a.getOutputPeer(t),peer_id:U.a.getOutputPeer(s),pFlags:{unread:!0},date:(e.inbox_date||Object(r.g)(!0))+f.a.serverTimeOffset,message:e.message,media:e.media,entities:e.entities};O.a.hasUser(t)||O.a.saveApiUsers([{_:"user",id:t,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([a],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[s]=i,this.onUpdateNewMessage({_:"updateNewMessage",message:a,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,s=t?t.toPeerId(!0):U.a.getPeerId(e.peer),i=e.messages.map(e=>Y.a.generateMessageId(e)),a=this.getMessagesStorage(s),n=i.filter(e=>!a.has(e));(n.length?Promise.all(n.map(e=>this.wrapSingleMessage(s,e))):Promise.resolve()).finally(()=>{var t;const n=null===(t=e.pFlags)||void 0===t?void 0:t.pinned;if(n)for(const e of i){a.get(e).pFlags.pinned=!0}else for(const e of i){delete a.get(e).pFlags.pinned}delete this.pinnedMessages[s],x.default.getState().then(e=>{delete e.hiddenPinnedMessages[s],v.default.dispatchEvent("peer_pinned_messages",{peerId:s,mids:i,pinned:n})})})},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:s}=e;if("notifyPeer"===t._){const e=U.a.getPeerId(t.peer),i=this.getDialogOnly(e);i&&(i.notify_settings=s,v.default.dispatchEvent("dialog_notify_settings",i),this.dialogsStorage.setDialogToState(i))}},this.onUpdateNewScheduledMessage=e=>{const t=e.message,s=this.getMessagePeer(t),i=this.scheduledMessagesStorage[s];if(i){const e=Y.a.generateMessageId(t.id),a=this.getMessageFromStorage(i,e);this.saveMessages([t],{storage:i,isScheduled:!0});const n=this.getMessageFromStorage(i,e);if(a.deleted){this.checkPendingMessage(t)||v.default.dispatchEvent("scheduled_new",{peerId:s,mid:t.mid})}else this.handleEditedMessage(a,n),v.default.dispatchEvent("message_edit",{storage:i,peerId:s,mid:t.mid})}},this.onUpdateDeleteScheduledMessages=e=>{const t=U.a.getPeerId(e.peer),s=this.scheduledMessagesStorage[t];if(s){const i=e.messages.map(e=>Y.a.generateMessageId(e));this.handleDeletedMessages(t,s,i),v.default.dispatchEvent("scheduled_delete",{peerId:t,mids:i})}},this.clear(),v.default.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,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}),v.default.addEventListener("notify_peer_type_settings",({key:e,settings:t})=>{let s;s="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>e.peerId.isBroadcast():e=>U.a.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(s).forEach(e=>{v.default.dispatchEvent("dialog_notify_settings",e)})}),v.default.addEventListener("webpage_updated",({id:e,msgs:t})=>{t.forEach(({peerId:t,mid:s,isScheduled:i})=>{const a=i?this.getScheduledMessagesStorage(t):this.getMessagesStorage(t),n=this.getMessageFromStorage(a,s);n&&(n.media={_:"messageMediaWebPage",webpage:L.a.getWebPage(e)},v.default.dispatchEvent("message_edit",{storage:a,peerId:t,mid:s}))})}),v.default.addEventListener("draft_updated",({peerId:e,threadId:t,draft:s})=>{if(t)return;const i=this.getDialogOnly(e);if(i){if(!t){i.draft=s;let t=!1;s||Y.a.getServerMessageId(i.top_message)?(this.dialogsStorage.generateIndexForDialog(i),this.dialogsStorage.pushDialog(i)):(this.dialogsStorage.dropDialog(e),t=!0),v.default.dispatchEvent("dialog_draft",{peerId:e,dialog:i,drop:t,draft:s,index:i.index})}}else this.reloadConversation(e)}),v.default.addEventListener("poll_update",({poll:e})=>{const t=F.a.pollToMessages[e.id];if(t)for(const e of t){const[t,s]=e.split("_"),i=this.getMessageByPeer(t.toPeerId(),+s);this.setDialogToStateIfMessageIsTop(i)}}),x.default.getState().then(e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)})}clear(){this.middleware?this.middleware.clean():this.middleware=Object(Q.a)(),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(),this.filtersStorage&&this.filtersStorage.clear()}construct(){this.filtersStorage=new C(this,U.a,O.a,H.a,x.default,E.a,v.default),this.dialogsStorage=new S(this,k.a,U.a,O.a,j.a,H.a,x.default,E.a,f.a,Y.a)}getInputEntities(e){const t=Object(d.a)(e);return t.forEach(e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=O.a.getUserInput(e.user_id))}),t}invokeAfterMessageIsSent(e,t,s){var i,a;const r=null!==(i=this.tempFinalizeCallbacks[e])&&void 0!==i?i:this.tempFinalizeCallbacks[e]={},o=null!==(a=r[t])&&void 0!==a?a:r[t]={deferred:Object(n.a)()};return o.callback=s,o.deferred}editMessage(e,t,s={}){const{mid:i,peerId:a}=e;if(e.pFlags.is_outgoing)return this.invokeAfterMessageIsSent(i,"edit",e=>this.editMessage(e,t,s));let n=s.entities||[];t&&(t=m.a.parseMarkdown(t,n));const r=s.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return p.a.invokeApi("messages.editMessage",{peer:U.a.getInputPeerById(a),id:e.id,message:t,media:s.newMedia,entities:n.length?this.getInputEntities(n):void 0,no_webpage:s.noWebPage,schedule_date:r}).then(e=>{E.a.processUpdateMessage(e)},e=>{if(this.log.error("editMessage error:",e),!e||"MESSAGE_NOT_MODIFIED"!==e.type)return e&&"MESSAGE_EMPTY"===e.type&&(e.handled=!0),Promise.reject(e);e.handled=!0})}sendText(e,t,s={}){if(!t.trim())return;s.threadId&&!s.replyToMsgId&&(s.replyToMsgId=s.threadId);const i=v.default.config.message_length_max;if(t.length>i){const a=Object(c.g)(t,i);t=a[0],a.length>1&&delete s.webPage;for(let t=1;t{this.sendText(e,a[t],s)},t)}e=U.a.getPeerMigratedTo(e)||e;let a=s.entities||[];s.viaBotId||(t=m.a.parseMarkdown(t,a));let n=this.getInputEntities(a);n.length||(n=void 0);const r=this.generateOutgoingMessage(e,s);r.entities=a,r.message=t;const o=s.replyToMsgId?Y.a.getServerMessageId(s.replyToMsgId):void 0,l=U.a.isChannel(e);s.webPage&&(r.media={_:"messageMediaWebPage",webpage:s.webPage});const h=e=>{e?r.error=!0:delete r.error,v.default.dispatchEvent("messages_pending")};r.send=()=>{h(!1);const i={};let a;return this.pendingAfterMsgs[e]&&(i.afterMessageId=this.pendingAfterMsgs[e].messageId),a=s.viaBotId?p.a.invokeApiAfter("messages.sendInlineBotResult",{peer:U.a.getInputPeerById(e),random_id:r.random_id,reply_to_msg_id:o||void 0,query_id:s.queryId,id:s.resultId,clear_draft:s.clearDraft},i):p.a.invokeApiAfter("messages.sendMessage",{no_webpage:s.noWebPage,peer:U.a.getInputPeerById(e),message:t,random_id:r.random_id,reply_to_msg_id:o||void 0,entities:n,clear_draft:s.clearDraft,schedule_date:s.scheduleDate||void 0,silent:s.silent},i),this.pendingAfterMsgs[e]=i,a.then(e=>{if("updateShortSentMessage"===e._){const t=Object(d.a)(r);t.date=e.date,t.id=e.id,t.media=e.media,t.entities=e.entities,this.wrapMessageEntities(t),e.pFlags.out&&(t.pFlags.out=!0),e={_:"updates",users:[],chats:[],seq:0,date:void 0,updates:[{_:"updateMessageID",random_id:r.random_id,id:t.id},{_:s.scheduleDate?"updateNewScheduledMessage":l?"updateNewChannelMessage":"updateNewMessage",message:t,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach(e=>{"updateDraftMessage"===e._&&(e.local=!0)});E.a.processUpdateMessage(e)},()=>{h(!0)}).finally(()=>{this.pendingAfterMsgs[e]===i&&delete this.pendingAfterMsgs[e]})},this.beforeMessageSending(r,{isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft})}sendFile(e,t,s={}){e=U.a.getPeerMigratedTo(e)||e;const i=this.generateOutgoingMessage(e,s),r=s.replyToMsgId?Y.a.getServerMessageId(s.replyToMsgId):void 0;let d,l;const c="mime_type"in t?t.mime_type:t.type,h=t instanceof File?t.name:"",u=!(t instanceof File||t instanceof Blob);let g=s.caption||"";this.log("sendFile",t,c);const f=s.entities||[];g&&(g=m.a.parseMarkdown(g,f));const _=[],y=Z.a.has(c);let I,M,P;if(u)d="document",l="";else if(0===c.indexOf("audio/")||["video/ogg"].indexOf(c)>=0){d="audio",l="audio."+("ogg"===c.split("/")[1]?"ogg":"mp3"),P="sendMessageUploadAudioAction",s.isVoiceMessage&&(d="voice",i.pFlags.media_unread=!0);let e={_:"documentAttributeAudio",pFlags:{voice:s.isVoiceMessage},waveform:s.waveform,duration:s.duration||0};_.push(e)}else if(s.isMedia)if(y){d="photo",l="photo."+c.split("/")[1],P="sendMessageUploadPhotoAction";const e={_:"photoSize",w:s.width,h:s.height,type:"full",location:null,size:t.size};I={_:"photo",id:""+i.id,sizes:[e],w:s.width,h:s.height};const a=A.a.getCacheContext(I,e.type);a.downloaded=t.size,a.url=s.objectURL||"",I=T.a.savePhoto(I)}else if(X.a.has(c)){d="video",l="video.mp4",P="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:s.isRoundMessage,supports_streaming:!0},duration:s.duration,w:s.width,h:s.height};_.push(e),s.noSound&&t.size>10240&&t.size<10485760&&_.push({_:"documentAttributeAnimated"})}else d="document",l="document."+c.split("/")[1],P="sendMessageUploadDocumentAction";else d="document",l="document."+c.split("/")[1],P="sendMessageUploadDocumentAction";if(_.push({_:"documentAttributeFilename",file_name:h||l}),-1!==["document","video","audio","voice"].indexOf(d)&&!u){const e=[];M={_:"document",id:""+i.id,duration:s.duration,attributes:_,w:s.width,h:s.height,thumbs:e,mime_type:c,size:t.size};const a=A.a.getCacheContext(M);let n;if(a.downloaded=t.size,a.url=s.objectURL||"",y)_.push({_:"documentAttributeImageSize",w:s.width,h:s.height}),n={_:"photoSize",w:s.width,h:s.height,type:"full",size:t.size};else if("video"===d&&s.thumb){n={_:"photoSize",w:s.thumb.size.width,h:s.thumb.size.height,type:"local-thumb",size:s.thumb.blob.size};const e=A.a.getCacheContext(M,n.type);e.downloaded=n.size,e.url=s.thumb.url}n&&e.push(n),M=D.a.saveDoc(M)}this.log("sendFile",d,l,t.type,s);const S=u?void 0:new a.a({attachMethod:"prepend",tryAgainOnFail:!1,isUpload:!0}),b=Object(n.a)();S&&(S.attachPromise(b),b.cancel=()=>{const e=new Error("Download canceled");e.name="AbortError",b.reject(e)},b.catch(t=>{"AbortError"!==t.name||k||(this.log("cancelling upload",w),this.cancelPendingMessage(i.random_id),this.setTyping(e,{_:"sendMessageCancelAction"}),(null==F?void 0:F.cancel)&&F.cancel())}));const w=u?void 0:{_:I?"messageMediaPhoto":"messageMediaDocument",pFlags:{},preloader:S,photo:I,document:M,promise:b};i.entities=f,i.message=g,i.media=u?{_:"messageMediaDocument",pFlags:{},document:t}:w;const C=e=>{e?i.error=!0:delete i.error,v.default.dispatchEvent("messages_pending")};let k=!1,F=null;return i.send=()=>{if(u){const{id:e,access_hash:s,file_reference:i}=t,a={_:"inputMediaDocument",id:{_:"inputDocument",id:e,access_hash:s,file_reference:i}};b.resolve(a)}else if(t instanceof File||t instanceof Blob){const a=()=>{let a;return k&&!i.error||(k=!1,F=A.a.upload(t),b.notifyAll({done:0,total:t.size})),"video"===d&&s.objectURL&&(a=new Promise((e,t)=>{(s.thumb&&s.thumb.blob?Promise.resolve(s.thumb):Object(o.a)(s.objectURL)).then(s=>{s?A.a.upload(s.blob).then(e,t):e(null)},t)})),F&&F.then(e=>te(this,void 0,void 0,(function*(){let t;switch(delete i.media.preloader,e.name=l,k=!0,d){case"photo":t={_:"inputMediaUploadedPhoto",file:e};break;default:t={_:"inputMediaUploadedDocument",file:e,mime_type:c,pFlags:{force_file:"sendMessageUploadDocumentAction"===P||void 0},attributes:_}}if(a)try{const e=yield a;t.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}b.resolve(t)})),()=>{C(!0)}),F.addNotifyListener(t=>{const s=Math.max(1,Math.floor(100*t.done/t.total));P&&this.setTyping(e,{_:P,progress:0|s}),b.notifyAll(t)}),b};s.isGroupedItem?a():this.sendSmthLazyLoadQueue.push({load:a})}return b},this.beforeMessageSending(i,{isGroupedItem:s.isGroupedItem,isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft}),s.isGroupedItem||b.then(t=>(this.setTyping(e,{_:"sendMessageCancelAction"}),p.a.invokeApi("messages.sendMedia",{background:s.background,peer:U.a.getInputPeerById(e),media:t,message:g,random_id:i.random_id,reply_to_msg_id:r,schedule_date:s.scheduleDate,silent:s.silent,entities:f,clear_draft:s.clearDraft}).then(e=>{E.a.processUpdateMessage(e)},e=>{if("photo"===d&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,d="document",void i.send();C(!0)}))),{message:i,promise:b}}sendAlbum(e,t,s={}){return te(this,void 0,void 0,(function*(){if(s.threadId&&!s.replyToMsgId&&(s.replyToMsgId=s.threadId),1===t.length)return this.sendFile(e,t[0],Object.assign(Object.assign({},s),s.sendFileDetails[0]));e=U.a.getPeerMigratedTo(e)||e;const i=s.replyToMsgId?Y.a.getServerMessageId(s.replyToMsgId):void 0;let a=s.caption||"",n=s.entities||[];a&&(a=m.a.parseMarkdown(a,n)),this.log("sendAlbum",t,s);const r=""+ ++this.groupedTempId,o=t.map((t,o)=>{const d=s.sendFileDetails[o],l=Object.assign({isGroupedItem:!0,isMedia:s.isMedia,scheduleDate:s.scheduleDate,silent:s.silent,replyToMsgId:i,threadId:s.threadId,groupId:r},d);return 0===o&&(l.caption=a,l.entities=n),this.sendFile(e,t,l).message});s.clearDraft&&setTimeout(()=>{j.a.clearDraft(e,s.threadId)},0);const d=(e,t)=>{t?e.error=!0:delete e.error,v.default.dispatchEvent("messages_pending")},l=U.a.getInputPeerById(e),c=t=>{this.setTyping(e,{_:"sendMessageCancelAction"}),this.sendSmthLazyLoadQueue.push({load:()=>p.a.invokeApi("messages.sendMultiMedia",{peer:l,multi_media:t,reply_to_msg_id:i,schedule_date:s.scheduleDate,silent:s.silent,clear_draft:s.clearDraft}).then(e=>{E.a.processUpdateMessage(e)},e=>{o.forEach(e=>d(e,!0))})})},h=o.map(e=>e.send().then(e=>p.a.invokeApi("messages.uploadMedia",{peer:l,media:e})).then(t=>{let s;if("messageMediaPhoto"===t._){const e=T.a.savePhoto(t.photo);s=T.a.getMediaInput(e)}else if("messageMediaDocument"===t._){const e=D.a.saveDoc(t.document);s=D.a.getMediaInput(e)}const i={_:"inputSingleMedia",media:s,random_id:e.random_id,message:a,entities:n};return a&&(a="",n=[]),i}).catch(t=>{if("AbortError"===t.name)return null;throw this.log.error("sendAlbum upload item error:",t,e),d(e,!0),t}));Promise.all(h).then(e=>{c(e.filter(Boolean))})}))}sendOther(e,t,s={}){var i;e=U.a.getPeerMigratedTo(e)||e;const a=this.generateOutgoingMessage(e,s),n=s.replyToMsgId?Y.a.getServerMessageId(s.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+a.id;t.poll.id=e,F.a.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{}});const{poll:s,results:i}=F.a.getPoll(e);r={_:"messageMediaPoll",poll:s,results:i};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:T.a.getPhoto(t.id.id)};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:D.a.getDoc(t.id.id)};break;case"inputMediaContact":r={_:"messageMediaContact",phone_number:t.phone_number,first_name:t.first_name,last_name:t.last_name,user_id:null!==(i=t.user_id)&&void 0!==i?i:"0",vcard:t.vcard};break;case"inputMediaGeoPoint":r={_:"messageMediaGeo",geo:s.geoPoint};break;case"inputMediaVenue":r={_:"messageMediaVenue",geo:s.geoPoint,title:t.title,address:t.address,provider:t.provider,venue_id:t.venue_id,venue_type:t.venue_type};break;case"messageMediaPending":r=t}a.media=r;a.send=()=>{const i={};let r;return this.pendingAfterMsgs[e]&&(i.afterMessageId=this.pendingAfterMsgs[e].messageId),r=s.viaBotId?p.a.invokeApiAfter("messages.sendInlineBotResult",{peer:U.a.getInputPeerById(e),random_id:a.random_id,reply_to_msg_id:n||void 0,query_id:s.queryId,id:s.resultId,clear_draft:s.clearDraft,schedule_date:s.scheduleDate,silent:s.silent},i):p.a.invokeApiAfter("messages.sendMedia",{peer:U.a.getInputPeerById(e),media:t,random_id:a.random_id,reply_to_msg_id:n||void 0,message:"",clear_draft:s.clearDraft,schedule_date:s.scheduleDate,silent:s.silent},i),this.pendingAfterMsgs[e]=i,r.then(e=>{e.updates&&e.updates.forEach(e=>{"updateDraftMessage"===e._&&(e.local=!0)}),E.a.processUpdateMessage(e)},e=>{v.default.dispatchEvent("messages_pending")}).finally(()=>{this.pendingAfterMsgs[e]===i&&delete this.pendingAfterMsgs[e]})},this.beforeMessageSending(a,{isScheduled:!!s.scheduleDate||void 0,threadId:s.threadId,clearDraft:s.clearDraft})}beforeMessageSending(e,t={}){const s=e.id,i=this.getMessagePeer(e),a=t.isScheduled?this.getScheduledMessagesStorage(i):this.getMessagesStorage(i);if(t.isScheduled)this.saveMessages([e],{storage:a,isScheduled:!0,isOutgoing:!0}),setTimeout(()=>{v.default.dispatchEvent("scheduled_new",{peerId:i,mid:s})},0);else{const n=[this.getHistoryStorage(i),t.threadId?this.getHistoryStorage(i,t.threadId):void 0];for(const e of n)e&&e.history.unshift(s);this.saveMessages([e],{storage:a,isOutgoing:!0}),this.setDialogTopMessage(e),setTimeout(()=>{v.default.dispatchEvent("history_append",{storage:a,peerId:i,mid:s})},0)}this.pendingByRandomId[e.random_id]={peerId:i,tempId:s,threadId:t.threadId,storage:a},!t.isGroupedItem&&e.send&&setTimeout(()=>{t.clearDraft&&j.a.clearDraft(i,t.threadId),e.send()},0)}generateOutgoingMessage(e,t){let s;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const i=U.a.isBroadcast(e);if(i){if(U.a.getPeer(e).pFlags.signatures){const e=O.a.getSelf();s=e.first_name+(e.last_name?" "+e.last_name:"")}}return{_:"message",id:this.generateTempMessageId(e),from_id:this.generateFromId(e),peer_id:U.a.getOutputPeer(e),post_author:s,pFlags:this.generateFlags(e),date:t.scheduleDate||Object(r.g)(!0)+f.a.serverTimeOffset,message:"",grouped_id:t.groupId,random_id:Object(l.b)(),reply_to:this.generateReplyHeader(t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:i&&1,pending:!0}}generateReplyHeader(e,t){const s={_:"messageReplyHeader",reply_to_msg_id:e||t};return t&&s.reply_to_msg_id!==t&&(s.reply_to_top_id=t),s}generateReplies(e){let t;if(U.a.isBroadcast(e)){const s=R.default.chatsFull[e.toChatId()];(null==s?void 0:s.linked_chat_id)&&(t={_:"messageReplies",flags:1,pFlags:{comments:!0},channel_id:s.linked_chat_id,replies:0,replies_pts:0})}return t}generateFromId(e){return e.isAnyChat()&&(e.isBroadcast()||this.isAnonymousSending(e))?void 0:U.a.getOutputPeer(O.a.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==O.a.getSelf().id&&(t.out=!0,U.a.isChannel(e)||O.a.isBot(e)||(t.unread=!0)),U.a.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const s=O.a.getSelf().id.toPeerId();if(t.fromId===s&&t.peerId===s&&!t.fwd_from)return;const i={_:"messageFwdHeader",flags:0,date:t.date};return t.fwd_from?(i.from_id=t.fwd_from.from_id,i.from_name=t.fwd_from.from_name,i.post_author=t.fwd_from.post_author):(i.from_id=U.a.getOutputPeer(t.fromId),i.post_author=t.post_author),U.a.isBroadcast(t.peerId)&&(t.post_author&&(i.post_author=t.post_author),i.channel_post=t.id),e===s&&(i.saved_from_msg_id=t.id,i.saved_from_peer=U.a.getOutputPeer(t.peerId)),i}generateFakeAvatarMessage(e,t){const s=Number.MAX_SAFE_INTEGER,i={_:"messageService",action:{_:"messageActionChannelEditPhoto",photo:t},mid:s,peerId:e,date:t.date,fromId:e};return this.getMessagesStorage(e).set(s,i),i}isAnonymousSending(e){var t,s;return e.isAnyChat()&&(null===(s=null===(t=U.a.getPeer(e).admin_rights)||void 0===t?void 0:t.pFlags)||void 0===s?void 0:s.anonymous)}setDialogTopMessage(e,t=this.getDialogOnly(e.peerId)){if(t){t.top_message=e.mid;this.getHistoryStorage(e.peerId).maxId=e.mid,this.dialogsStorage.generateIndexForDialog(t,!1,e),this.scheduleHandleNewDialogs(e.peerId,t)}}cancelPendingMessage(e){const t=this.pendingByRandomId[e];if(t){const{peerId:s,tempId:i,storage:a}=t,n=this.getHistoryStorage(s);return E.a.processLocalUpdate({_:"updateDeleteMessages",messages:[i],pts:void 0,pts_count:void 0}),n.history.delete(i),delete this.pendingByRandomId[e],a.delete(i),!0}return!1}fillConversations(){return te(this,void 0,void 0,(function*(){const e=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(void 0);){const t=yield this.getTopMessages(100,void 0);if(!e()||t.isEnd)break}}))}getConversations(e="",t,s,i=0,a){return this.dialogsStorage.getDialogs(e,t,s,i,a)}getReadMaxIdIfUnread(e,t){var s;const i=this.getHistoryStorage(e,t);if(t){const t=this.getHistoryStorage(e),a=Math.max(null!==(s=t.readMaxId)&&void 0!==s?s:0,i.readMaxId);return!this.getMessageByPeer(e,i.maxId).pFlags.out&&a{if(!a()||"messages.dialogsNotModified"===r._)return null;N.b&&this.log("messages.getDialogs result:",r.dialogs,Object.assign({},r.dialogs[0])),s||void 0===t||this.dialogsStorage.resetPinnedOrder(t),s||K.default.setAuthorized(!0),O.a.saveApiUsers(r.users),k.a.saveApiChats(r.chats),this.saveMessages(r.messages);let o=!!s,d=!1;const l={},c=void 0===t?0:t,h=void 0===t;Object(y.d)(r.dialogs,e=>{void 0===e.folder_id&&(e.folder_id=c),this.dialogsStorage.saveDialog(e,void 0,!0,h),o||U.a.isChannel(e.peerId||U.a.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),o=!0),void 0!==e.peerId&&(i&&e.index>i&&(this.scheduleHandleNewDialogs(e.peerId,e),d=!0),Y.a.getServerMessageId(e.read_inbox_max_id)||Y.a.getServerMessageId(e.read_outbox_max_id)||(l[e.peerId]=e,this.log.error("noIdsDialogs",e,n)))});const u=Object.keys(l);if(u.length){const e=u.map(e=>e.toPeerId()),t=e.map(e=>this.reloadConversation(e));Promise.all(t).then(()=>{v.default.dispatchEvent("dialogs_multiupdate",l);for(let t=0;t=p||!r.dialogs.length;m&&this.dialogsStorage.setDialogsLoaded(t,!0),d?this.scheduleHandleNewDialogs():v.default.dispatchEvent("dialogs_multiupdate",{});const _=r.dialogs,I=100===e?_:_.slice(0,e);return{isEnd:m&&I[I.length-1]===_[_.length-1],count:p,dialogs:I}})}forwardMessages(e,t,s,i={}){e=U.a.getPeerMigratedTo(e)||e,s=s.slice().sort((e,t)=>e-t),i.dropCaptions&&(i.dropAuthor=!0);const a={},n=s.map(s=>{var n,r;const o=this.getMessageByPeer(t,s),d=this.generateOutgoingMessage(e,i),l=["entities","media"];i.dropAuthor||(d.fwd_from=this.generateForwardHeader(e,o),l.push("views","forwards")),i.dropCaptions&&o.media||l.push("message"),l.forEach(e=>{d[e]=o[e]});const c=null===(n=d.media)||void 0===n?void 0:n.document;if(c){["round","voice"].includes(c.type)&&(d.pFlags.media_unread=!0)}if(o.grouped_id){(null!==(r=a[o.grouped_id])&&void 0!==r?r:a[o.grouped_id]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(d)}return d});for(const e in a){const t=a[e];t.messages.length>1&&t.messages.forEach(e=>{e.grouped_id=t.tempId})}n.forEach(e=>{this.beforeMessageSending(e,{isScheduled:!!i.scheduleDate||void 0})});const r={};this.pendingAfterMsgs[e]&&(r.afterMessageId=this.pendingAfterMsgs[e].messageId);const o=p.a.invokeApiAfter("messages.forwardMessages",{from_peer:U.a.getInputPeerById(t),id:s.map(e=>Y.a.getServerMessageId(e)),random_id:n.map(e=>e.random_id),to_peer:U.a.getInputPeerById(e),with_my_score:i.withMyScore,silent:i.silent,schedule_date:i.scheduleDate,drop_author:i.dropAuthor,drop_media_captions:i.dropCaptions},r).then(e=>{this.log("forwardMessages updates:",e),E.a.processUpdateMessage(e)}).finally(()=>{this.pendingAfterMsgs[e]===r&&delete this.pendingAfterMsgs[e]});return this.pendingAfterMsgs[e]=r,o}generateEmptyMessage(e){return{_:"messageEmpty",id:Y.a.getServerMessageId(e),mid:e,deleted:!0,pFlags:{}}}getMessageFromStorage(e,t){return e&&e.get(t)||this.generateEmptyMessage(t)}createMessageStorage(){return new Map}getMessagesStorage(e){var t;return null!==(t=this.messagesStorageByPeerId[e])&&void 0!==t?t:this.messagesStorageByPeerId[e]=this.createMessageStorage()}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(U.a.isChannel(t.toPeerId()))continue;const s=this.messagesStorageByPeerId[t].get(e);if(s)return s}return this.getMessageFromStorage(null,e)}getMessageByPeer(e,t){return e?this.getMessageFromStorage(this.getMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&U.a.getPeerId(e.peer_id)||M.b}getDialogByPeerId(e){return this.dialogsStorage.getDialog(e)}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}reloadConversation(e){let t;if(void 0!==e){const s=U.a.getPeerId(e);let i=this.reloadConversationsPeers.get(s);if(i&&(t=i.promise),t)return t;t=Object(n.a)(),this.reloadConversationsPeers.set(s,i={inputDialogPeer:U.a.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=new Promise((e,t)=>{setTimeout(()=>{const s=[],i={};for(const[e,{inputDialogPeer:t,promise:a}]of this.reloadConversationsPeers)s.push(t),i[e]=a;this.reloadConversationsPeers.clear();const a=()=>{for(const e in i)i[e].resolve(void 0)};p.a.invokeApi("messages.getPeerDialogs",{peers:s}).then(t=>{this.dialogsStorage.applyDialogs(t),t.dialogs.forEach(e=>{const t=e.peerId;t&&(i[t].resolve(e),delete i[t])}),a(),e()},e=>{a(),t(e)}).finally(()=>{this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()})},0)})),t||this.reloadConversationsPromise}doFlushHistory(e,t,s){return p.a.invokeApiSingle("messages.deleteHistory",{just_clear:t,revoke:s,peer:e,max_id:0}).then(i=>(E.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:i.pts,pts_count:i.pts_count}}),!i.offset||this.doFlushHistory(e,t,s)))}flushHistory(e,t,s){return te(this,void 0,void 0,(function*(){if(U.a.isChannel(e)){const t=this.getHistory(e,0,1),s=t instanceof Promise?yield t:t,i=e.toChatId(),a=s.history[0]||0;return p.a.invokeApiSingle("channels.deleteHistory",{channel:k.a.getChannelInput(i),max_id:Y.a.getServerMessageId(a)}).then(e=>(e&&E.a.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:i,available_min_id:a}),e))}return this.doFlushHistory(U.a.getInputPeerById(e),t,s).then(()=>{[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pinnedMessages,this.pendingAfterMsgs,this.pendingTopMsgs].forEach(t=>{delete t[e]});const s=this.needSingleMessages.get(e);if(s&&s.clear(),[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach(t=>{const s=t[e];s&&s.clear()}),t)v.default.dispatchEvent("dialog_flush",{peerId:e});else{delete this.notificationsToHandle[e],delete this.typings[e];const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0)),this.dialogsStorage.dropDialogOnDeletion(e)}})}))}onPeerDeleted(e){}hidePinnedMessages(e){return Promise.all([x.default.getState(),this.getPinnedMessage(e)]).then(([t,s])=>{t.hiddenPinnedMessages[e]=s.maxId,v.default.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:s.maxId})})}getPinnedMessage(e){var t;const s=null!==(t=this.pinnedMessages[e])&&void 0!==t?t:this.pinnedMessages[e]={};return s.promise?s.promise:s.maxId?Promise.resolve(s):s.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1}).then(e=>{var t;return s.count=e.count,s.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,s}).finally(()=>{delete s.promise})}updatePinnedMessage(e,t,s,i,a){return p.a.invokeApi("messages.updatePinnedMessage",{peer:U.a.getInputPeerById(e),unpin:s,silent:i,pm_oneside:a,id:Y.a.getServerMessageId(t)}).then(e=>{E.a.processUpdateMessage(e)})}unpinAllMessages(e){return p.a.invokeApiSingle("messages.unpinAllMessages",{peer:U.a.getInputPeerById(e)}).then(t=>{if(E.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),!t.offset){return this.getMessagesStorage(e).forEach(e=>{e.pFlags.pinned&&delete e.pFlags.pinned}),v.default.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[e],!0}return this.unpinAllMessages(e)})}getAlbumText(e){const t=this.groupedMessagesStorage[e];let s,i,a,n=0;for(const[e,r]of t)if(r.message){if(++n>1)break;s=r.message,i=r.totalEntities,a=r.entities}return n>1&&(s=void 0,i=void 0,a=void 0),{message:s,entities:a,totalEntities:i}}getMidsByAlbum(e){return Object(d.e)(this.groupedMessagesStorage[e],"asc")}getMidsByMessage(e){return(null==e?void 0:e.grouped_id)?this.getMidsByAlbum(e.grouped_id):[e.mid]}filterMessages(e,t){const s=[];if(e.grouped_id){const i=this.groupedMessagesStorage[e.grouped_id];for(const[e,a]of i)t(a)&&s.push(a)}else t(e)&&s.push(e);return s}generateTempMessageId(e){const t=this.getDialogOnly(e);return Y.a.generateMessageId((null==t?void 0:t.top_message)||0,!0)}saveMessage(e,t={}){var s,i;if(void 0===e.pFlags&&(e.pFlags={}),"messageEmpty"===e._)return void(e.deleted=!0);const a=this.getMessagePeer(e),n=t.storage||this.getMessagesStorage(a),r="peerChannel"===e.peer_id._,o=r&&k.a.isBroadcast(a.toChatId());t.isScheduled&&(e.pFlags.is_scheduled=!0),t.isOutgoing&&(e.pFlags.is_outgoing=!0);const d=Y.a.generateMessageId(e.id);if(e.mid=d,e.grouped_id){(null!==(s=this.groupedMessagesStorage[e.grouped_id])&&void 0!==s?s:this.groupedMessagesStorage[e.grouped_id]=new Map).set(d,e)}const l=this.getDialogOnly(a);l&&d&&d>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=Y.a.generateMessageId(e.reply_to.reply_to_msg_id)),e.reply_to.reply_to_top_id&&(e.reply_to.reply_to_top_id=Y.a.generateMessageId(e.reply_to.reply_to_top_id))),e.replies&&(e.replies.max_id&&(e.replies.max_id=Y.a.generateMessageId(e.replies.max_id)),e.replies.read_max_id&&(e.replies.read_max_id=Y.a.generateMessageId(e.replies.read_max_id)));const c=!!a;c||(e.date-=f.a.serverTimeOffset);const h=O.a.getSelf().id;e.peerId=a,e.fromId=a===h?e.fwd_from?e.fwd_from.from_id?U.a.getPeerId(e.fwd_from.from_id):0:h:e.pFlags.post||!e.from_id?a:U.a.getPeerId(e.from_id);const u=e.fwd_from;if(u){u.saved_from_msg_id&&(u.saved_from_msg_id=Y.a.generateMessageId(u.saved_from_msg_id)),u.channel_post&&(u.channel_post=Y.a.generateMessageId(u.channel_post));const t=u.saved_from_peer||u.from_id,s=u.saved_from_msg_id||u.channel_post;if(t&&s){const i=U.a.getPeerId(t),a=Y.a.generateMessageId(s);e.savedFrom=i+"_"+a}e.fwdFromId=U.a.getPeerId(u.from_id),c||(u.date-=f.a.serverTimeOffset)}e.via_bot_id>0&&(e.viaBotId=e.via_bot_id);const p={type:"message",peerId:a,messageId:d};if(e.media)switch(e.media._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":e.media.ttl_seconds?e.media={_:"messageMediaUnsupportedWeb"}:e.media.photo=T.a.savePhoto(e.media.photo,p),e.media.photo||delete e.media;break;case"messageMediaPoll":{const t=F.a.savePoll(e.media.poll,e.media.results,e);e.media.poll=t.poll,e.media.results=t.results;break}case"messageMediaDocument":e.media.ttl_seconds?e.media={_:"messageMediaUnsupportedWeb"}:e.media.document=D.a.saveDoc(e.media.document,p);break;case"messageMediaWebPage":{const s=L.a.getMessageKeyForPendingWebPage(a,d,t.isScheduled);e.media.webpage=L.a.saveWebPage(e.media.webpage,s,p);break}case"messageMediaInvoice":e.media={_:"messageMediaUnsupportedWeb"}}if(e.action){const t=e.action;let s,n;const d=e.fromId===O.a.getSelf().id?"You":"";switch(t.photo&&(t.photo=T.a.savePhoto(t.photo,p)),t.document&&(t.document=D.a.saveDoc(t.photo,p)),t._){case"messageActionChatEditPhoto":(null===(i=t.photo)||void 0===i?void 0:i.video_sizes)?t._=o?"messageActionChannelEditVideo":"messageActionChatEditVideo":o&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;ee.a.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",o||(e+="_by"+d),t.type=e;break}case"messageActionChatEditTitle":o&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":o&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=r?"messageActionChatJoined"+d:"messageActionChatReturn"+d)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+d);break;case"messageActionChannelMigrateFrom":s=t.chat_id.toPeerId(!0),n=a;break;case"messageActionChatMigrateTo":s=a,n=t.channel_id.toPeerId(!0);break;case"messageActionHistoryClear":e.clear_history=!0,delete e.pFlags.out,delete e.pFlags.unread;break;case"messageActionPhoneCall":t.type=(e.pFlags.out?"out_":"in_")+("phoneCallDiscardReasonMissed"===t.reason._||"phoneCallDiscardReasonBusy"===t.reason._?"missed":"ok")}s&&n&&!this.migratedFromTo[s]&&!this.migratedToFrom[n]&&this.migrateChecks(s,n)}e.message&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),n.set(d,e)}saveMessages(e,t={}){e.saved||(e.saved=!0,e.forEach(e=>{this.saveMessage(e,t)}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=m.a.fixEmoji(e.message,t);const s=m.a.parseEntities(e.message);e.totalEntities=m.a.mergeEntities(t,s)}wrapMessageForReply(e,t=e.message,s,i,a,n){const r=[],o=(e,t,s)=>{if(e&&(t=i?h.default.format(e,!0):Object(h.i18n)(e)),i)r.push(t);else{const e=document.createElement("i");"string"==typeof t?e.innerHTML=t:e.append(t),r.push(e)}s&&r.push(", ")};if(e.media){Object(J.a)(e);let a=!0;if(e.grouped_id){if(s){const t=this.getMidsByMessage(e);if(s.length===t.length){for(const e of t)if(!s.includes(e)){a=!1;break}}else a=!1}a&&(t=this.getAlbumText(e.grouped_id).message,n||o("AttachAlbum",void 0,t))}else a=!1;if(!a&&!n||!t){const s=e.media;switch(s._){case"messageMediaPhoto":o("AttachPhoto",void 0,e.message);break;case"messageMediaDice":o(void 0,i?s.emoticon:m.a.wrapEmojiText(s.emoticon));break;case"messageMediaVenue":{const e=i?s.title:m.a.wrapEmojiText(s.title);o("AttachLocation",void 0,e),r.push(Object(z.a)(e));break}case"messageMediaGeo":o("AttachLocation");break;case"messageMediaGeoLive":o("AttachLiveLocation");break;case"messageMediaPoll":o(void 0,i?"📊 "+(s.poll.question||"poll"):s.poll.rReply);break;case"messageMediaContact":o("AttachContact");break;case"messageMediaGame":{const e="🎮 ";o(void 0,i?e+s.game.title:m.a.wrapEmojiText(e+s.game.title));break}case"messageMediaDocument":{const a=s.document;if("video"===a.type)o("AttachVideo",void 0,e.message);else if("voice"===a.type)o("AttachAudio",void 0,e.message);else if("gif"===a.type)o("AttachGif",void 0,e.message);else if("round"===a.type)o("AttachRound",void 0,e.message);else if("sticker"===a.type)a.stickerEmojiRaw&&o(void 0,(i?a.stickerEmojiRaw:a.stickerEmoji)+" "),o("AttachSticker"),t="";else if("audio"===a.type){const t=a.attributes.find(e=>"documentAttributeAudio"===e._&&(e.title||e.performer)),s="🎵 "+(t?[t.title,t.performer].filter(Boolean).join(" - "):a.file_name);o(void 0,i?s:m.a.wrapEmojiText(s),e.message)}else o(void 0,i?a.file_name:m.a.wrapEmojiText(a.file_name),e.message);break}}}}if(e.action){const t=this.wrapMessageActionTextNew(e,i);t&&o(void 0,t)}if(t)if(t=Object(c.f)(t,100),i)r.push(t);else{let e=m.a.parseEntities(t.replace(/\n/g," "));if(a){a=a.trim(),e||(e=[]);let s,i=!1,n=new RegExp(Object(c.e)(a),"gi");for(;null!==(s=n.exec(t));)e.push({_:"messageEntityHighlight",length:a.length,offset:s.index}),i=!0;i&&e.sort((e,t)=>e.offset-t.offset)}const s=m.a.wrapRichText(t,{noLinebreaks:!0,entities:e,noLinks:!0,noTextFormat:!0});r.push(Object(z.a)(s))}if(i)return r.join("");{const e=document.createDocumentFragment();return e.append(...r),e}}wrapSenderToPeer(e){const t=document.createElement("span");t.classList.add("sender-title");const s=e.fromId===v.default.myId&&e.peerId!==v.default.myId;if(t.append(s?Object(h.i18n)("FromYou"):new G.a({peerId:e.fromId,dialog:e.peerId===v.default.myId}).element),U.a.isAnyGroup(e.peerId)||s){const s=new G.a({peerId:e.peerId}).element;t.append(" ➝ ",s)}return t}wrapSentTime(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append(Object(r.c)(new Date(1e3*e.date))),t}wrapMessageActionTextNew(e,t){const s=t?void 0:document.createElement("span"),i="action"in e&&e.action;if(i.message){const e=i.message;return t?m.a.wrapPlainText(e):(s.innerHTML=m.a.wrapRichText(e,{noLinebreaks:!0}),s)}{let a,n,o=i._;const d=(e,t)=>t?U.a.getPeerTitle(e,t):new G.a({peerId:e}).element;switch(i._){case"messageActionPhoneCall":o+="."+i.type,n=[V(i.duration,t)];break;case"messageActionGroupCall":if(o+="."+i.type,n=[],o.endsWith("You")||e.pFlags.post||n.push(d(e.fromId,t)),void 0!==i.duration)n.push(V(i.duration,t));else{const{onclick:t,url:s}=m.a.wrapUrl(`tg://voicechat?chat_id=${e.peerId.toChatId()}&id=${i.call.id}&access_hash=${i.call.access_hash}`);if(!t){n.push(document.createElement("span"));break}const a=document.createElement("a");a.href=s,a.setAttribute("onclick",t+"(this)"),n.push(a)}break;case"messageActionInviteToGroupCall":{const s=[e.fromId,i.users[0].toPeerId()];let r="ActionGroupCall";const o=O.a.getSelf().id;s[0]===o&&(r+="You"),r+="Invited",s[1]===o&&(r+="You"),Object(y.e)(s,o),a=r,n=s.map(e=>d(e,t));break}case"messageActionGroupCallScheduled":{const s=new Date,o=new Date(1e3*i.schedule_date),l=(o.getTime()-s.getTime())/864e5,c=new Date(s);c.setDate(c.getDate()+1);const u=U.a.isBroadcast(e.peerId);a=u?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",n=[];const p=O.a.getSelf().id;e.fromId===p?a+="You":u||n.push(d(e.fromId,t));let g,f=[];l<1&&o.getDate()===s.getDate()?g="TodayAtFormattedWithToday":l<2&&o.getDate()===c.getDate()?g="Time.TomorrowAt":(g="formatDateAtTime",f.push(new h.default.IntlDateElement({date:o,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),f.push(Object(r.e)(o));const m=Object(h.i18n)(g,f);n.push(m);break}case"messageActionChatCreate":{const s=O.a.getSelf().id;e.fromId===s?o+="You":n=[d(e.fromId,t)];break}case"messageActionPinMessage":{const s=e.peerId,i=this.getMessageByPeer(s,e.reply_to_mid);if(n=[d(e.fromId,t)],i.deleted)a="ActionPinnedNoText",e.reply_to_mid&&this.fetchMessageReplyTo(e).then(t=>{t.deleted||e.deleted||(v.default.dispatchEvent("message_edit",{storage:this.getMessagesStorage(s),peerId:s,mid:e.mid}),this.isMessageIsTopMessage(e)&&v.default.dispatchEvent("dialogs_multiupdate",{[s]:this.getDialogOnly(s)}))});else{const e=document.createElement("i");e.dataset.savedFrom=i.peerId+"_"+i.mid,e.dir="auto",e.append(this.wrapMessageForReply(i,void 0,void 0,t)),n.push(e)}break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":n=[d(e.fromId,t)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":n=[],"messageActionChatEditTitle"===i._&&n.push(d(e.fromId,t)),n.push(t?i.title:Object(W.a)(m.a.wrapEmojiText(i.title)));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const s=i.users||[i.user_id];if(n=[d(e.fromId,t)],s.length>1){const e=Object(h.join)(s.map(e=>d(e.toPeerId(),t).trim()),!1,t);if(t)n.push(...e);else{const t=document.createElement("span");t.append(...e),n.push(t)}}else n.push(d(s[0].toPeerId(),t));break}case"messageActionBotAllowed":{const e=m.a.wrapRichText(i.domain,{entities:[{_:"messageEntityUrl",length:i.domain.length,offset:0}]});n=[Object(W.a)(e)];break}default:a=h.langPack[o]||`[${i._}]`}return a||(a=h.langPack[o],void 0===a&&(a="["+o+"]")),t?h.default.format(a,!0,n):Object(h._i18n)(s,a,n)}}reportMessages(e,t,s,i){return p.a.invokeApiSingle("messages.report",{peer:U.a.getInputPeerById(e),id:t.map(e=>Y.a.getServerMessageId(e)),reason:{_:s},message:i})}startBot(e,t,s){const i=t?t.toPeerId(!0):e.toPeerId();if(s){const t=Object(l.b)();return p.a.invokeApi("messages.startBot",{bot:O.a.getUserInput(e),peer:U.a.getInputPeerById(i),random_id:t,start_param:s}).then(e=>{E.a.processUpdateMessage(e)})}if(t){let s;return s=k.a.isChannel(t)?k.a.inviteToChannel(t,[e]):k.a.addChatUser(t,e,0),s.catch(e=>{if(!e||"USER_ALREADY_PARTICIPANT"!=e.type)throw e;e.handled=!0}).then(()=>{const t=O.a.getUser(e);return this.sendText(i,"/start@"+t.username)})}return this.sendText(i,"/start")}editPeerFolders(e,t){p.a.invokeApi("folders.editPeerFolders",{folder_peers:e.map(e=>({_:"inputFolderPeer",peer:U.a.getInputPeerById(e),folder_id:t}))}).then(e=>{E.a.processUpdateMessage(e)})}toggleDialogPin(e,t){var s;if(t>1)return this.filtersStorage.toggleDialogPin(e,t);const i=this.getDialogOnly(e);if(!i)return Promise.reject();const a=!(null===(s=i.pFlags)||void 0===s?void 0:s.pinned)||void 0;if(a){const e=1===t?v.default.config.pinned_infolder_count_max:v.default.config.pinned_dialogs_count_max;if(this.dialogsStorage.getPinnedOrders(t).length>=e)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"})}return p.a.invokeApi("messages.toggleDialogPin",{peer:U.a.getInputDialogPeerById(e),pinned:a}).then(s=>{if(s){const s=a?{pinned:a}:{};E.a.saveUpdate({_:"updateDialogPinned",peer:U.a.getDialogPeer(e),folder_id:t,pFlags:s})}})}markDialogUnread(e,t){var s;const i=this.getDialogOnly(e);if(!i)return Promise.reject();const a=!t&&!(null===(s=i.pFlags)||void 0===s?void 0:s.unread_mark)||void 0;return p.a.invokeApi("messages.markDialogUnread",{peer:U.a.getInputDialogPeerById(e),unread:a}).then(t=>{if(t){const t=a?{unread:a}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:U.a.getDialogPeer(e),pFlags:t})}})}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&k.a.hasChat(t.toChatId())){const s=k.a.getChat(e.toChatId());s&&s.migrated_to&&s.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,v.default.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){if(e.pFlags.is_outgoing)return!1;const s=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&s.push("messageMediaPoll"),!("message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===s.indexOf(e.media._)||e.fromId&&O.a.isBot(e.fromId))&&(!e.media||"messageMediaDocument"!==e.media._||!e.media.document.sticker&&"round"!==e.media.document.type)}canEditMessage(e,t="text"){var s;return!(!e||!this.canMessageBeEdited(e,t))&&(this.getMessagePeer(e)===O.a.getSelf().id||!(e.date=t.mid)&&(!a.pFlags.selective&&(e.maxOutId&&t.midn.mid||t.pFlags.is_outgoing)&&t.message)return n.pFlags.hidden=!0,!0}else(!e.maxOutId||t.mid>e.maxOutId)&&(e.maxOutId=t.mid);return Object(J.a)(t),!("messageActionChatDeleteUser"!==(null===(i=t.action)||void 0===i?void 0:i._)||!(n?t.action.user_id===n.fromId:O.a.isBot(t.action.user_id)))&&(e.replyMarkup={_:"replyKeyboardHide",mid:t.mid,pFlags:{}},!0)}getSearchStorage(e,t){return this.searchesStorage[e]||(this.searchesStorage[e]={}),this.searchesStorage[e][t]||(this.searchesStorage[e][t]={history:[]}),this.searchesStorage[e][t]}getSearchCounters(e,t,s=!0){return(s?p.a.invokeApiCacheable:p.a.invokeApi).bind(p.a)("messages.getSearchCounters",{peer:U.a.getInputPeerById(e),filters:t})}filterMessagesByInputFilter(e,t,s,i){const a=[];if(!t.length)return a;let n=!0;const r={},o=[],d=[];switch(e){case"inputMessagesFilterPhotos":r.messageMediaPhoto=!0;break;case"inputMessagesFilterPhotoVideo":r.messageMediaPhoto=!0,r.messageMediaDocument=!0,o.push("video");break;case"inputMessagesFilterVideo":r.messageMediaDocument=!0,o.push("video");break;case"inputMessagesFilterDocument":r.messageMediaDocument=!0,d.push("video");break;case"inputMessagesFilterVoice":r.messageMediaDocument=!0,o.push("voice");break;case"inputMessagesFilterRoundVoice":r.messageMediaDocument=!0,o.push("round","voice");break;case"inputMessagesFilterRoundVideo":r.messageMediaDocument=!0,o.push("round");break;case"inputMessagesFilterMusic":r.messageMediaDocument=!0,o.push("audio");break;case"inputMessagesFilterUrl":r.url=!0;break;case"inputMessagesFilterChatPhotos":r.avatar=!0;break;default:n=!1}if(!n)return a;for(let e=0,n=t.length;ee.includes(t._))||m.a.matchUrl(n.message))&&(l=!0)}}else r.avatar&&n.action&&["messageActionChannelEditPhoto","messageActionChatEditPhoto","messageActionChannelEditVideo","messageActionChatEditVideo"].includes(n.action._)&&(l=!0);if(l&&(a.push(n),a.length>=i))break}return a}getSearch({peerId:e,query:t,inputFilter:s,maxId:i,limit:a,nextRate:n,backLimit:r,threadId:o,folderId:d,minDate:l,maxDate:c}){t||(t=""),s||(s={_:"inputMessagesFilterEmpty"}),void 0===a&&(a=20),n||(n=0),r||(r=0),l=l?l/1e3|0:0,c=c?c/1e3|0:0;let h=[];r&&(a+=r);let u;if(!e||r||i||t||1===a||o||(u=this.getHistoryStorage(e),h=this.filterMessagesByInputFilter(s._,u.history.slice,this.getMessagesStorage(e),a)),h.length){if(!(h.length{O.a.saveApiUsers(e.users),k.a.saveApiChats(e.chats),this.saveMessages(e.messages),N.b&&this.log("getSearch result:",s,e);const t=e.count||h.length+e.messages.length;return e.messages.forEach(e=>{const t=this.getMessagePeer(e);if(t.isAnyChat()){const e=k.a.getChat(t.toChatId());e.migrated_to&&this.migrateChecks(t,e.migrated_to.channel_id.toPeerId(!0))}h.push(e)}),{count:t,offset_id_offset:e.offset_id_offset||0,next_rate:e.next_rate,history:h}})}subscribeRepliesThread(e,t){const s=e+"_"+t;for(const e in this.threadsToReplies)if(this.threadsToReplies[e]===s)return;this.getDiscussionMessage(e,t)}generateThreadServiceStartMessage(e){const t=e.peerId+"_"+e.mid;if(this.threadsServiceMessagesIdsStorage[t])return;const s=Y.a.getServerMessageId(Math.max(...this.getMidsByMessage(e))),i={_:"messageService",pFlags:{is_single:!0},id:Y.a.generateMessageId(s,!0),date:e.date,from_id:{_:"peerUser",user_id:M.b},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.id)};this.saveMessages([i],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=i.mid}getDiscussionMessage(e,t){return p.a.invokeApiSingle("messages.getDiscussionMessage",{peer:U.a.getInputPeerById(e),msg_id:Y.a.getServerMessageId(t)}).then(s=>{var i;k.a.saveApiChats(s.chats),O.a.saveApiUsers(s.users),this.saveMessages(s.messages);const a=this.filterMessages(s.messages[0],e=>!!e.replies)[0],n=a.peerId+"_"+a.mid;this.generateThreadServiceStartMessage(a);const r=this.getHistoryStorage(a.peerId,a.mid);return s.max_id=r.maxId=Y.a.generateMessageId(s.max_id)||0,s.read_inbox_max_id=r.readMaxId=Y.a.generateMessageId(null!==(i=s.read_inbox_max_id)&&void 0!==i?i:a.mid),s.read_outbox_max_id=r.readOutboxMaxId=Y.a.generateMessageId(s.read_outbox_max_id)||0,this.threadsToReplies[n]=e+"_"+t,a})}handleNewMessage(e,t){void 0===this.newMessagesToHandle[e]&&(this.newMessagesToHandle[e]=new Set),this.newMessagesToHandle[e].add(t),this.newMessagesHandleTimeout||(this.newMessagesHandleTimeout=window.setTimeout(this.handleNewMessages,0))}scheduleHandleNewDialogs(e,t){return void 0!==e&&(this.newDialogsToHandle[e]=t),this.newDialogsHandlePromise?this.newDialogsHandlePromise:this.newDialogsHandlePromise=new Promise(e=>{setTimeout(()=>{e(),this.newDialogsHandlePromise=void 0,this.handleNewDialogs()},0)})}deleteMessages(e,t,s){var i,a;let n;const r=t.map(e=>Y.a.getServerMessageId(e));if(e.isAnyChat()&&U.a.isChannel(e)){const s=e.toChatId(),o=k.a.getChat(s);if(!o.pFlags.creator&&!(null===(a=null===(i=o.admin_rights)||void 0===i?void 0:i.pFlags)||void 0===a?void 0:a.delete_messages)&&!(t=t.filter(t=>!!this.getMessageByPeer(e,t).pFlags.out)).length)return;n=p.a.invokeApi("channels.deleteMessages",{channel:k.a.getChannelInput(s),id:r}).then(e=>{E.a.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:s,messages:t,pts:e.pts,pts_count:e.pts_count})})}else n=p.a.invokeApi("messages.deleteMessages",{revoke:s,id:r}).then(e=>{E.a.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})});return n}readHistory(e,t=0,s,i=!1){if(this.log("readHistory:",e,t,s),!this.getReadMaxIdIfUnread(e,s)&&!i)return this.log("readHistory: isn't unread"),Promise.resolve();const a=this.getHistoryStorage(e,s);if(a.triedToReadMaxId>=t)return Promise.resolve();let n;return s?(a.readPromise||(n=p.a.invokeApi("messages.readDiscussion",{peer:U.a.getInputPeerById(e),msg_id:Y.a.getServerMessageId(s),read_max_id:Y.a.getServerMessageId(t)})),E.a.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:s,read_max_id:t})):U.a.isChannel(e)?(a.readPromise||(n=p.a.invokeApi("channels.readHistory",{channel:k.a.getChannelInput(e.toChatId()),max_id:Y.a.getServerMessageId(t)})),E.a.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(a.readPromise||(n=p.a.invokeApi("messages.readHistory",{peer:U.a.getInputPeerById(e),max_id:Y.a.getServerMessageId(t)}).then(e=>{E.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})})),E.a.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:U.a.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),H.a.soundReset(U.a.getPeerString(e)),a.readPromise?a.readPromise:(a.triedToReadMaxId=t,n.finally(()=>{delete a.readPromise;const{readMaxId:i}=a;this.log("readHistory: promise finally",t,i),i>t&&this.readHistory(e,i,s,!0)}),a.readPromise=n)}readAllHistory(e,t,s=!1){const i=this.getHistoryStorage(e,t);i.maxId&&this.readHistory(e,i.maxId,t,s)}fixDialogUnreadMentionsIfNoMessage(e){const t=this.getDialogOnly(e);(null==t?void 0:t.unread_mentions_count)&&this.reloadConversation(e)}modifyCachedMentions(e,t,s){const i=this.unreadMentions[e];i&&(s?i.first.isEnd(I.a.Top)&&i.insertSlice([t]):i.delete(t))}goToNextMention(e){var t;const s=this.goToNextMentionPromises[e];if(s)return s;const i=null!==(t=this.unreadMentions[e])&&void 0!==t?t:this.unreadMentions[e]=new I.b,a=i.length,n=i.first.isEnd(I.a.Top);if(!a&&n)return Promise.resolve();let r=Promise.resolve();return!n&&a<25&&(r=this.loadNextMentions(e)),this.goToNextMentionPromises[e]=r.then(()=>{const t=i.last,s=t&&t[t.length-1];s&&(i.delete(s),v.default.dispatchEvent("history_focus",{peerId:e,mid:s}))}).finally(()=>{delete this.goToNextMentionPromises[e]})}loadNextMentions(e){const t=this.unreadMentions[e],s=t.first[0]||1;return this.getUnreadMentions(e,s,-50,50).then(e=>{this.mergeHistoryResult(t,e,1===s?0:s,50,-50)})}getUnreadMentions(e,t,s,i,a=0,n=0){return p.a.invokeApiSingle("messages.getUnreadMentions",{peer:U.a.getInputPeerById(e),offset_id:Y.a.getServerMessageId(t),add_offset:s,limit:i,max_id:Y.a.getServerMessageId(a),min_id:Y.a.getServerMessageId(n)}).then(e=>(Object(J.a)(e),O.a.saveApiUsers(e.users),k.a.saveApiChats(e.chats),this.saveMessages(e.messages),e))}readMessages(e,t){if(!t.length)return Promise.resolve();let s,i;if(t=t.map(e=>Y.a.getServerMessageId(e)),e.isAnyChat()&&U.a.isChannel(e)){const a=e.toChatId();i={_:"updateChannelReadMessagesContents",channel_id:a,messages:t},s=p.a.invokeApi("channels.readMessageContents",{channel:k.a.getChannelInput(a),id:t})}else i={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},s=p.a.invokeApi("messages.readMessageContents",{id:t}).then(e=>{i.pts=e.pts,i.pts_count=e.pts_count,E.a.processLocalUpdate(i)});return E.a.processLocalUpdate(i),s}getHistoryStorage(e,t){var s,i;return t?(this.threadsStorage[e]||(this.threadsStorage[e]={}),null!==(s=this.threadsStorage[e][t])&&void 0!==s?s:this.threadsStorage[e][t]={count:null,history:new I.b}):null!==(i=this.historiesStorage[e])&&void 0!==i?i:this.historiesStorage[e]={count:null,history:new I.b}}setDialogToStateIfMessageIsTop(e){this.isMessageIsTopMessage(e)&&this.dialogsStorage.setDialogToState(this.getDialogOnly(e.peerId))}isMessageIsTopMessage(e){const t=this.getDialogOnly(e.peerId);return t&&t.top_message===e.mid}updateMessageRepliesIfNeeded(e){try{const t=this.getThreadKey(e);if(t){const e=this.threadsToReplies[t];if(e){const[t,s]=e.split("_");this.updateMessage(t.toPeerId(),+s,"replies_updated")}}}catch(t){this.log.error("incrementMessageReplies err",t,e)}}getThreadKey(e){var t;let s="";if((null===(t=e.peerId)||void 0===t?void 0:t.isAnyChat())&&e.reply_to){const t=e.reply_to.reply_to_top_id||e.reply_to.reply_to_msg_id;s=e.peerId+"_"+t}return s}updateMessage(e,t,s){return this.wrapSingleMessage(e,t,!0).then(()=>{const i=this.getMessageByPeer(e,t);return s&&v.default.dispatchEvent(s,i),i})}checkPendingMessage(e){const t=this.pendingByMessageId[e.mid];let s;if(t){const i=this.pendingByRandomId[t];(s=this.finalizePendingMessage(t,e))&&v.default.dispatchEvent("history_update",{storage:i.storage,peerId:e.peerId,mid:e.mid}),delete this.pendingByMessageId[e.mid]}return s}mutePeer(e,t){const s={_:"inputPeerNotifySettings"};return void 0===t&&(t=!H.a.isPeerLocalMuted(e,!1)),s.mute_until=t?M.a:0,H.a.updateNotifySettings({_:"inputNotifyPeer",peer:U.a.getInputPeerById(e)},s)}canSendToPeer(e,t,s="send_messages"){if(e.isAnyChat()){const i=k.a.getChat(e.toChatId());return k.a.hasRights(e.toChatId(),s,void 0,!!t)&&(!i.pFlags.left||!!t)}return O.a.canSendToUser(e)}finalizePendingMessage(e,t){const s=this.pendingByRandomId[e];if(s){const{peerId:i,tempId:a,threadId:n,storage:r}=s;[this.getHistoryStorage(i),n?this.getHistoryStorage(i,n):void 0].filter(Boolean).forEach(e=>{e.history.delete(a)});const o=this.getMessageFromStorage(r,a);return o.deleted||(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),v.default.dispatchEvent("messages_pending"),delete this.pendingByRandomId[e],this.finalizePendingMessageCallbacks(r,a,t),o}}finalizePendingMessageCallbacks(e,t,s){const i=this.tempFinalizeCallbacks[t];if(void 0!==i){for(const e in i){const{deferred:t,callback:a}=i[e];a(s).then(t.resolve,t.reject)}delete this.tempFinalizeCallbacks[t]}if(s.media){Object(J.a)(s);const{photo:e,document:i}=s.media;if(e){const s=T.a.getPhoto(""+t);if(s){const t=e.sizes[e.sizes.length-1],i=A.a.getCacheContext(e,t.type),a=A.a.getCacheContext(s,"full");Object.assign(i,a);const n=e.sizes[e.sizes.length-1],r=T.a.getPhotoDownloadOptions(e,n),o=Object(B.a)(r.location);A.a.fakeDownload(o,a.url)}}else if(i){const e=D.a.getDoc(""+t);if(e&&e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type){const t=A.a.getCacheContext(i),s=A.a.getCacheContext(e);Object.assign(t,s);const a=D.a.getInputFileName(i);A.a.fakeDownload(a,s.url)}}else s.media.poll&&(delete F.a.polls[t],delete F.a.results[t])}const a=this.getMessageFromStorage(e,t);e.delete(t),this.handleReleasingMessage(a,e),v.default.dispatchEvent("message_sent",{storage:e,tempId:t,tempMessage:a,mid:s.mid,message:s})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,x.default.pushToState("maxSeenMsgId",e),p.a.invokeApi("messages.receivedMessages",{max_id:Y.a.getServerMessageId(e)})}incrementMessageViews(e,t){if(t.length)return p.a.invokeApiSingle("messages.getMessagesViews",{peer:U.a.getInputPeerById(e),id:t.map(e=>Y.a.getServerMessageId(e)),increment:!0}).then(s=>{const i=new Array(t.length),a=e.toChatId();for(let e=0,n=t.length;e{v.default.dispatchEvent("history_focus",{peerId:s,mid:e.mid})},i.message=n,i.key="msg"+e.mid,i.tag=a,i.silent=!0;const r=U.a.getPeerPhoto(s);r?$.a.loadAvatar(s,r,"photo_small").loadPromise.then(t=>{e.pFlags.unread&&(i.image=t,H.a.notify(i))}):H.a.notify(i)}getScheduledMessagesStorage(e){var t;return null!==(t=this.scheduledMessagesStorage[e])&&void 0!==t?t:this.scheduledMessagesStorage[e]=this.createMessageStorage()}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return Promise.resolve([]);const t=this.getScheduledMessagesStorage(e);return t.size?Promise.resolve([...t.keys()]):p.a.invokeApiSingle("messages.getScheduledHistory",{peer:U.a.getInputPeerById(e),hash:""}).then(t=>{if("messages.messagesNotModified"!==t._){O.a.saveApiUsers(t.users),k.a.saveApiChats(t.chats);const s=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:s,isScheduled:!0}),[...s.keys()]}return[]})}sendScheduledMessages(e,t){return p.a.invokeApi("messages.sendScheduledMessages",{peer:U.a.getInputPeerById(e),id:t.map(e=>Y.a.getServerMessageId(e))}).then(e=>{E.a.processUpdateMessage(e)})}deleteScheduledMessages(e,t){return p.a.invokeApi("messages.deleteScheduledMessages",{peer:U.a.getInputPeerById(e),id:t.map(e=>Y.a.getServerMessageId(e))}).then(e=>{E.a.processUpdateMessage(e)})}getMessageWithReplies(e){if(e.peerId===M.c||(e=this.filterMessages(e,e=>!!e.replies)[0])&&e.replies&&e.replies.pFlags.comments&&"777"!==e.replies.channel_id)return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&!k.a.isInChat(e.toChatId())}getNewHistory(e,t){var s;return te(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const i=this.getHistoryStorage(e,t),a=i.history.slice;if(!a.isEnd(I.a.Bottom))return;delete i.maxId,a.unsetEnd(I.a.Bottom);let n=this.getHistory(e,null!==(s=a[0])&&void 0!==s?s:1,0,50,t);n instanceof Promise&&(n=yield n);for(let t=0,s=n.history.length;t{const e=n.history.sliceMe(t,r,s);return{count:n.count,history:(null==e?void 0:e.slice)||n.history.constructSlice(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||n.count}}):{count:n.count,history:o.slice,offsetIdOffset:o.offsetIdOffset}}isHistoryResultEnd(e,t,s){const{offset_id_offset:i,messages:a}=e,n=e.count||a.length,r=i||0,o=s<0?t+s:t;return{count:n,offsetIdOffset:r,isTopEnd:r>=n-o||ne.mid);if(s&&Y.a.getServerMessageId(s)&&!h.includes(s)&&dh[e]);++e);h.splice(e,0,s)}const u=e.insertSlice(h)||e.slice;return l&&u.setEnd(I.a.Top),c&&u.setEnd(I.a.Bottom),Object.assign({slice:u,mids:h,messages:n},r)}fillHistoryStorage(e,t,s,i,a,n){return this.requestHistory(e,t,s,i,void 0,n).then(n=>{const{count:r,isBottomEnd:o,slice:d,messages:l}=this.mergeHistoryResult(a.history,n,t,s,i);a.count=r;for(let t=0,s=l.length;t{N.b&&this.log("requestHistory result:",e,r,t,s,i),O.a.saveApiUsers(r.users),k.a.saveApiChats(r.chats),this.saveMessages(r.messages),U.a.isChannel(e)&&E.a.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,d=r.count;o&&r.messages[o-1].deleted&&(r.messages.splice(o-1,1),o--,d--);const l=this.getHistoryStorage(e,n),c=r.messages[o-1];if(o&&c.grouped_id){const t=l.history.findSlice(c.mid);if(t&&t.slice.length+r.messages.lengthr)}return r},t=>{switch(t.type){case"CHANNEL_PRIVATE":let t=k.a.getChat(e.toChatId());t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},E.a.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t})}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=new Promise(e=>{setTimeout(()=>{const t=[];for(const[e,s]of this.needSingleMessages){const i=[...s.keys()],a=i.map(e=>({_:"inputMessageID",id:Y.a.getServerMessageId(e)}));let n;n=e.isAnyChat()&&U.a.isChannel(e)?p.a.invokeApiSingle("channels.getMessages",{channel:k.a.getChannelInput(e.toChatId()),id:a}):p.a.invokeApiSingle("messages.getMessages",{id:a});const r=n.then(e=>{Object(J.a)(e),O.a.saveApiUsers(e.users),k.a.saveApiChats(e.chats),this.saveMessages(e.messages);for(let t=0;t{v.default.dispatchEvent("messages_downloaded",{peerId:e,mids:i})});t.push(r)}this.needSingleMessages.clear(),Promise.all(t).finally(()=>{this.fetchSingleMessagesPromise=null,this.needSingleMessages.size&&this.fetchSingleMessages(),e()})},0)})}wrapSingleMessage(e,t,s=!1){const i=this.getMessageByPeer(e,t);if(i.deleted||s){let s=this.needSingleMessages.get(e);s||this.needSingleMessages.set(e,s=new Map);let i=s.get(t);return i||(i=Object(n.a)(),s.set(t,i),this.fetchSingleMessages(),i)}return v.default.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(i)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?U.a.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.wrapSingleMessage(t,e.reply_to_mid).then(t=>(t.deleted&&delete e.reply_to_mid,t))}setTyping(e,t){let s=this.typings[e];return v.default.myId&&e&&this.canSendToPeer(e)&&e!==v.default.myId&&(null==s?void 0:s.type)!==t._?((null==s?void 0:s.timeout)&&clearTimeout(s.timeout),s=this.typings[e]={type:t._},p.a.invokeApi("messages.setTyping",{peer:U.a.getInputPeerById(e),action:t}).finally(()=>{s===this.typings[e]&&(s.timeout=window.setTimeout(()=>{delete this.typings[e]},6e3))})):Promise.resolve(!1)}handleReleasingMessage(e,t){const s=e.media;if(s){const i=s.webpage||s,a=i.photo||i.document;if((null==a?void 0:a.file_reference)&&g.a.deleteContext(a.file_reference,{type:"message",peerId:e.peerId,messageId:e.mid}),"webpage"in s&&s.webpage){const i=this.getScheduledMessagesStorage(e.peerId)===t,a=L.a.getMessageKeyForPendingWebPage(e.peerId,e.mid,i);L.a.deleteWebPageFromPending(s.webpage,a)}s.poll&&F.a.updatePollToMessage(e,!1)}}handleDeletedMessages(e,t,s){const i={count:0,unread:0,unreadMentions:0,msgs:new Set};for(const a of s){const s=this.getMessageFromStorage(t,a);if(s.deleted){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(s,t),this.updateMessageRepliesIfNeeded(s),s.pFlags.out||s.pFlags.is_outgoing||!s.pFlags.unread||(++i.unread,H.a.cancel("msg"+a),s.pFlags.mentioned&&(++i.unreadMentions,this.modifyCachedMentions(e,a,!1))),++i.count,i.msgs.add(a),s.deleted=!0;const n=s.grouped_id;if(n){const e=this.groupedMessagesStorage[n];e&&(e.delete(a),i.albums||(i.albums={}),(i.albums[n]||(i.albums[n]=new Set)).add(a),e.size||(delete i.albums,delete this.groupedMessagesStorage[n]))}t.delete(a);const r=this.newMessagesToHandle[e];r&&r.has(a)&&r.delete(a)}if(i.albums)for(const t in i.albums)v.default.dispatchEvent("album_edit",{peerId:e,groupId:t,deletedMids:[...i.albums[t]]});return i}handleEditedMessage(e,t){var s;if("message"===e._&&(null===(s=e.media)||void 0===s?void 0:s.webpage)){const t=L.a.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);L.a.deleteWebPageFromPending(e.media.webpage,t)}}getMediaFromMessage(e){return e.action?e.action.photo:e.media&&(e.media.photo||e.media.document||e.media.webpage&&(e.media.webpage.document||e.media.webpage.photo))}isMentionUnread(e){var t;const s=null===(t=e.media)||void 0===t?void 0:t.document;return e.pFlags.media_unread&&e.pFlags.mentioned&&(!s||!["voice","round"].includes(s.type))}getDialogUnreadCount(e){return e.unread_count||+!!e.pFlags.unread_mark}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}};N.a.appMessagesManager=se;t.a=se},,,,function(e,t,s){"use strict";var i=s(29),a=s(32),n=s(31),r=s(15),o=s(48),d=s(39),l=s(16),c=s(45);const h=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],u=["red","green","yellow","blue","violet","pink","cyan","orange"],p=[0,7,4,1,6,3,5];["isChannel","isMegagroup","isAnyGroup","isBroadcast","isBot","isContact","isUser","isAnyChat"].forEach(e=>{const t=Array.isArray(e)?e[0]:e,s=Array.isArray(e)?e[1]:e;String.prototype[t]=function(){return g[s](this.toString())},Number.prototype[t]=function(){return g[s](this)}});const g=new class{canPinMessage(e){return e.isUser()||o.a.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){const t=e.isUser()?d.a.getUserPhoto(e.toUserId()):o.a.getChatPhoto(e.toChatId());return"chatPhotoEmpty"!==t._&&"userProfilePhotoEmpty"!==t._?t:null}getPeerMigratedTo(e){if(e.isUser())return!1;const t=o.a.getChat(e.toChatId());return!!(t&&t.migrated_to&&t.pFlags.deactivated)&&this.getPeerId(t.migrated_to)}getPeerTitle(e,t=!1,s=!1){e||(e=r.default.myId);let i="";if(e.isUser()){const t=d.a.getUser(e.toUserId());t.first_name&&(i+=t.first_name),!t.last_name||s&&i||(i+=" "+t.last_name),i=i?i.trim():t.pFlags.deleted?l.default.format("HiddenName",!0):t.username}else{i=o.a.getChat(e.toChatId()).title,s&&(i=i.split(" ")[0])}return t?i:n.a.wrapEmojiText(i)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return o.a.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?d.a.getUserString(e.toUserId()):o.a.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeer(e).username||""}getPeer(e){return e.isUser()?d.a.getUser(e.toUserId()):o.a.getChat(e.toChatId())}getPeerId(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if(Object(a.f)(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):r.default.myId}if(!e)return c.b;const t="u"===e.charAt(0),s=e.substr(1).split("_");return t?s[0].toPeerId():(s[0]||"").toPeerId(!0)}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&o.a.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&o.a.isMegagroup(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!o.a.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&d.a.isBot(e.toUserId())}isContact(e){return e.isUser()&&d.a.isContact(e.toUserId())}isUser(e){return+e>=0}isAnyChat(e){return!this.isUser(e)}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 o.a.isChannel(t)?o.a.getChannelInputPeer(t):o.a.getChatInputPeer(t)}const t=e.toUserId();return d.a.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:Object(a.f)(e)?e:this.getInputPeerById(e)}}getPeerColorById(e,t=!0){if(!e)return"";const s=p[Math.abs(+e)%7];return(t?u:h)[s]}getPeerSearchText(e){let t;if(this.isUser(e))t="%pu "+d.a.getUserSearchText(e.toUserId());else{t="%pg "+(o.a.getChat(e.toChatId()).title||"")}return t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===r.default.myId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return o.a.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return o.a.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}};i.a.appPeersManager=g,t.a=g},,,,function(e,t,s){"use strict";var i=s(29),a=s(32),n=s(33),r=s(31),o=s(15),d=s(74),l=s(44),c=s(17),h=s(39);const u=new class{constructor(){this.storage=c.default.storages.chats,this.onChatUpdated=(e,t)=>{var s;d.a.processUpdateMessage(t),(null===(s=null==t?void 0:t.updates)||void 0===s?void 0:s.length)&&this.isChannel(e)&&o.default.dispatchEvent("invalidate_participants",e)},this.clear(!0),o.default.addMultipleEventsListeners({updateChannelParticipant:e=>{n.a.clearCache("channels.getParticipants",t=>t.channel.channel_id===e.channel_id)},updateChatDefaultBannedRights:e=>{const t=l.a.getPeerId(e.peer).toChatId(),s=this.chats[t];s&&(s.default_banned_rights=e.default_banned_rights,o.default.dispatchEvent("chat_update",t))}}),c.default.getState().then(e=>{const t=c.default.storagesResults.chats;if(t.length)for(let e=0,s=t.length;e{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})}),c.default.addEventListener("peerUnneeded",e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())})})}clear(e=!1){if(e)this.chats={};else{const e=c.default.storagesResults.chats;for(const t in this.chats)t&&(c.default.isPeerNeeded(t.toPeerId(!0))||(e.findAndSplice(e=>e.id===t),this.storage.delete(t),delete this.chats[t]))}}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach(e=>this.saveApiChat(e,t)))}saveApiChat(e,t){var s,i;if("chatEmpty"===e._)return;const n=this.chats[e.id];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==n)return;e.initials=r.a.getAbbreviation(e.title),"channel"===e._&&void 0===e.participants_count&&void 0!==n&&n.participants_count&&(e.participants_count=n.participants_count);let d=!1,l=!1;if(void 0===n)this.chats[e.id]=e;else{(null===(s=n.photo)||void 0===s?void 0:s.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id)&&(d=!0),n.title!==e.title&&(l=!0),Object(a.i)(n,e),o.default.dispatchEvent("chat_update",e.id)}const h=e.id.toPeerId(!0);d&&o.default.dispatchEvent("avatar_update",h),l&&o.default.dispatchEvent("peer_title_edit",h),c.default.isPeerNeeded(h)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]||{_:"chatEmpty",id:e,deleted:!0,access_hash:"",pFlags:{}}}getChatTyped(e){return this.getChat(e)}combineParticipantBannedRights(e,t){const s=this.getChat(e);if(s.default_banned_rights){t=Object(a.a)(t);const e=s.default_banned_rights.pFlags;for(let s in e)t.pFlags[s]=e[s]}return t}hasRights(e,t,s,i){const a=this.getChat(e);if("chatEmpty"===a._)return!1;if(a.pFlags.deactivated&&"view_messages"!==t)return!1;const n=void 0===s;if(a.pFlags.creator&&n)return!0;if("chatForbidden"===a._||"channelForbidden"===a._||a.pFlags.kicked||a.pFlags.left&&!a.pFlags.megagroup)return!1;if(!s&&!(s=a.admin_rights||a.banned_rights||a.default_banned_rights))return!1;let r={};switch(s&&(r=s.pFlags),t){case"embed_links":case"send_games":case"send_gifs":case"send_inline":case"send_media":case"send_messages":case"send_polls":case"send_stickers":if(!i&&a.pFlags.left)return!1;if("chatBannedRights"===s._&&r[t])return!1;if("channel"===a._&&!a.pFlags.megagroup&&!r.post_messages)return!1;break;case"delete_messages":case"manage_call":return!!r[t];case"pin_messages":return"chatAdminRights"===s._?r[t]||!!r.post_messages:!r[t];case"change_info":case"invite_users":return"chatAdminRights"===s._?r[t]:!r[t];case"change_type":case"delete_chat":return!1;case"ban_users":case"change_permissions":return"chatAdminRights"===s._&&!!r.ban_users;case"view_participants":return!("chat"!==a._&&a.pFlags.broadcast&&!a.pFlags.creator&&!a.admin_rights)}return!0}editChatDefaultBannedRights(e,t){const s=this.getChat(e);return s.default_banned_rights&&s.default_banned_rights.until_date===t.until_date&&Object(a.b)(s.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():n.a.invokeApi("messages.editChatDefaultBannedRights",{peer:l.a.getInputPeerById(e.toPeerId(!0)),banned_rights:t}).then(this.onChatUpdated.bind(this,e))}isChannel(e){const t=this.chats[e];return!(!t||"channel"!==t._&&"channelForbidden"!==t._)}isMegagroup(e){const t=this.chats[e];return!(!t||"channel"!==t._||!t.pFlags.megagroup)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const s=this.getChat(e);return("channelForbidden"===s._||"chatForbidden"===s._||"chatEmpty"===s._||s.pFlags.left||s.pFlags.kicked||s.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return"chatEmpty"!==t._&&t.access_hash?{_:"inputChannel",channel_id:e,access_hash:t.access_hash||"0"}:{_:"inputChannelEmpty"}}getChatInputPeer(e){return{_:"inputPeerChat",chat_id:e}}getChannelInputPeer(e){return{_:"inputPeerChannel",channel_id:e,access_hash:this.getChat(e).access_hash||0}}hasChat(e,t){const s=this.chats[e];return Object(a.f)(s)&&(t||!s.pFlags.min)}getChatPhoto(e){const t=this.getChat(e);return t&&t.photo||{_:"chatPhotoEmpty"}}getChatString(e){const t=this.getChat(e);return this.isChannel(e)?(this.isMegagroup(e)?"s":"c")+e+"_"+t.access_hash:"g"+e}createChannel(e,t){return n.a.invokeApi("channels.createChannel",{broadcast:!0,title:e,about:t}).then(e=>{d.a.processUpdateMessage(e);const t=e.chats[0].id;return o.default.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t})}inviteToChannel(e,t){const s=this.getChannelInput(e),i=t.map(e=>h.a.getUserInput(e));return n.a.invokeApi("channels.inviteToChannel",{channel:s,users:i}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return n.a.invokeApi("messages.createChat",{users:t.map(e=>h.a.getUserInput(e)),title:e}).then(e=>{d.a.processUpdateMessage(e);const t=e.chats[0].id;return o.default.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t})}leaveChannel(e){return n.a.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return n.a.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,s=100){return n.a.invokeApi("messages.addChatUser",{chat_id:e,user_id:h.a.getUserInput(t),fwd_limit:s}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return n.a.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:h.a.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,h.a.getSelf().id)}leave(e){return this.isChannel(e)?this.leaveChannel(e):this.leaveChat(e)}delete(e){return this.isChannel(e)?this.deleteChannel(e):this.deleteChat(e)}deleteChannel(e){return n.a.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return n.a.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):n.a.invokeApi("messages.migrateChat",{chat_id:e}).then(t=>{this.onChatUpdated(e,t);return t.updates.find(e=>"updateChannel"===e._).channel_id})}updateUsername(e,t){return n.a.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t}).then(s=>{if(s){this.getChat(e).username=t}return s})}editPhoto(e,t){const s={_:"inputChatUploadedPhoto",file:t};let i;return i=this.isChannel(e)?n.a.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:s}):n.a.invokeApi("messages.editChatPhoto",{chat_id:e,photo:s}),i.then(e=>{d.a.processUpdateMessage(e)})}editTitle(e,t){let s;return s=this.isChannel(e)?n.a.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):n.a.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),s.then(e=>{d.a.processUpdateMessage(e)})}editAbout(e,t){const s=e.toPeerId(!0);return n.a.invokeApi("messages.editChatAbout",{peer:l.a.getInputPeerById(s),about:t}).then(e=>(e&&o.default.dispatchEvent("peer_bio_edit",s),e))}getParticipantPeerId(e){return e.peer?l.a.getPeerId(e.peer):e.user_id.toPeerId()}editBanned(e,t,s){const i="object"!=typeof t?t:this.getParticipantPeerId(t);return n.a.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:l.a.getInputPeerById(i),banned_rights:s}).then(a=>{if(this.onChatUpdated(e,a),"object"==typeof t){const a=Date.now()/1e3|0;d.a.processLocalUpdate({_:"updateChannelParticipant",channel_id:e,date:a,actor_id:void 0,qts:void 0,user_id:i,prev_participant:t,new_participant:Object.keys(s.pFlags).length?{_:"channelParticipantBanned",date:a,banned_rights:s,kicked_by:h.a.getSelf().id,peer:l.a.getOutputPeer(i),pFlags:{}}:void 0})}})}clearChannelParticipantBannedRights(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{}})}kickFromChannel(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{view_messages:!0}})}kickFromChat(e,t){return this.isChannel(e)?this.kickFromChannel(e,t):this.deleteChatUser(e,t.toUserId())}resolveChannel(e){return n.a.invokeApiSingle("channels.getChannels",{id:[{_:"inputChannel",channel_id:e,access_hash:"0"}]}).then(e=>{this.saveApiChats(e.chats)})}togglePreHistoryHidden(e,t){return this.migrateChat(e).then(e=>n.a.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t})).then(e=>{d.a.processUpdateMessage(e)})}toggleSignatures(e,t){return n.a.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then(e=>{d.a.processUpdateMessage(e)})}};i.a.appChatsManager=u,t.a=u},function(e,t,s){"use strict";s.d(t,"a",(function(){return c}));var i=s(29),a=s(44),n=s(15),r=s(16),o=s(36),d=s(39);const l=new WeakMap;i.a.peerTitleWeakMap=l,n.default.addEventListener("peer_title_edit",e=>{Array.from(document.querySelectorAll(`.peer-title[data-peer-id="${e}"]`)).forEach(e=>{const t=l.get(e);t&&t.update()})});class c{constructor(e){this.plainText=!1,this.onlyFirstName=!1,this.dialog=!1,this.element=document.createElement("span"),this.element.classList.add("peer-title"),this.element.setAttribute("dir","auto"),this.update(e),l.set(this.element,this)}update(e){if(e)for(let t in e)this.element.dataset[t]=e[t]?""+("boolean"==typeof e[t]?+e[t]:e[t]):"0",this[t]=e[t];this.peerId===n.default.myId&&this.dialog?Object(o.a)(this.element,Object(r.i18n)(this.onlyFirstName?"Saved":"SavedMessages")):this.peerId.isUser()&&d.a.getUser(this.peerId).pFlags.deleted?Object(o.a)(this.element,Object(r.i18n)(this.onlyFirstName?"Deleted":"HiddenName")):this.element.innerHTML=a.a.getPeerTitle(this.peerId,this.plainText,this.onlyFirstName)}}},,,,function(e,t,s){"use strict";var i=s(76),a=s(126),n=s(32),r=s(0),o=s(33),d=s(135),l=s(73),c=s(39),h=s(130),u=s(29),p=s(98),g=s(122),f=s(37),m=s(92);class v{constructor(){this.photos={}}savePhoto(e,t){var s;if("photoEmpty"===e._)return;const i=this.photos[e.id];if(e.file_reference&&(Object(n.h)("file_reference",i,e),d.a.saveContext(e.file_reference,t)),null===(s=e.sizes)||void 0===s?void 0:s.length){const t=e.sizes[e.sizes.length-1];"photoSizeProgressive"===t._&&(t.size=t.sizes[t.sizes.length-1])}return i?Object.assign(i,e):this.photos[e.id]=e}choosePhotoSize(e,t=0,s=0,i=!1,a=!1){window.devicePixelRatio>1&&(t*=2,s*=2);let n={_:"photoSizeEmpty",type:""},r=e.sizes||e.thumbs;if(a&&r&&"document"===e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:void 0})),null==r?void 0:r.length){for(let e=0,i=r.length;e=t||a.height>=s)break}i&&"photoSizeEmpty"===n._&&"photoStrippedSize"===r[0]._&&(n=r[0])}return n}getUserPhotos(e,t="0",s=20){const i=c.a.getUserInput(e);return o.a.invokeApiCacheable("photos.getUserPhotos",{user_id:i,offset:0,limit:s,max_id:t},{cacheSeconds:60}).then(s=>{c.a.saveApiUsers(s.users);const i=s.photos.map((t,i)=>(s.photos[i]=this.savePhoto(t,{type:"profilePhoto",peerId:e.toPeerId()}),t.id));if("0"!==t&&t){const e=i.indexOf(t);-1!==e&&i.splice(e,1)}return{count:s.count||i.length,photos:i}})}getPreviewURLFromBytes(e,t=!1){let s,i;t?s=e instanceof Uint8Array?e:new Uint8Array(e):(s=new Uint8Array(v.jpegHeader.concat(Array.from(e.slice(3)),v.jpegTail)),s[164]=e[1],s[166]=e[2]),i=t?r.IS_SAFARI?"image/png":"image/webp":"image/jpeg";const a=new Blob([s],{type:i});return URL.createObjectURL(a)}getPathFromPhotoPathSize(e){const t=e.bytes;let s="M";for(let e=0,i=t.length;e=192?s+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[i-128-64]:(i>=128?s+=",":i>=64&&(s+="-"),s+=""+(63&i))}return s+="z",s}getPreviewURLFromThumb(e,t,s=!1){const i=l.a.getCacheContext(e,t.type);return i.url||(i.url=this.getPreviewURLFromBytes(t.bytes,s))}getImageFromStrippedThumb(e,t,s){const i=this.getPreviewURLFromThumb(e,t,!1),a=new Image;a.classList.add("thumbnail");const n=(s?Object(h.a)(i):Promise.resolve(i)).then(e=>Object(p.b)(a,e));return{image:a,loadPromise:n}}setAttachmentSize(e,t,s,i,a=!0,n,r,o){let d;o||(o=this.choosePhotoSize(e,s,i,void 0,r));const l="document"===e._;d=l?Object(f.c)(e.w||o.w||512,e.h||o.h||512):Object(f.c)(o.w||100,o.h||100);let c=Object(f.c)(s,i);c=d=d.aspect(c,a);let h=!0;return l&&!["video","gif"].includes(e.type)||(c.width<200&&c.height<200&&(c=d=d.aspectCovered(Object(f.c)(200,200))),n&&(n.message||n.reply_to_mid||n.media.webpage||n.replies&&n.replies.pFlags.comments&&777!==n.replies.channel_id)&&c.width<320&&(c=Object(f.c)(320,c.height),h=!1),h&&c.width<120&&n&&(c=Object(f.c)(120,c.height),h=!1)),t.style.width=c.width+"px",t.style.height=c.height+"px",{photoSize:o,size:d,isFit:h}}getStrippedThumbIfNeeded(e,t,s,i=!1){if(!t.downloaded||["video","gif"].includes(e.type)||i){if("document"===e._&&t.downloaded&&!i)return null;const a=e.sizes||e.thumbs,n=(null==a?void 0:a.length)?a.find(e=>"photoStrippedSize"===e._):null;if(n&&"bytes"in n)return this.getImageFromStrippedThumb(e,n,s)}return null}getPhotoDownloadOptions(e,t,s,i){const a="document"===e._;if(!t||"photoSizeEmpty"===t._)throw new Error("photoSizeEmpty!");const n=("photoSize"===t._||"photoSizeProgressive"===t._)&&e.access_hash&&e.file_reference,r={_:a?"inputDocumentFileLocation":"inputPhotoFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t.type};return{dcId:e.dc_id,location:r,size:n?t.size:void 0,queueId:s,onlyCache:i}}preloadPhoto(e,t,s,i){const n=this.getPhoto(e);if(!n||"photoEmpty"===n._)throw new Error("preloadPhoto photoEmpty!");if(!t){const e=m.a.width,s=m.a.height;t=this.choosePhotoSize(n,e,s)}const r=l.a.getCacheContext(n,t.type);if(r.downloaded>=("size"in t?t.size:0)&&r.url)return Promise.resolve();const o=this.getPhotoDownloadOptions(n,t,s,i),d=Object(a.a)(o.location);let c=l.a.getDownload(d);return c||(c=l.a.download(o),c.then(e=>{if(!r.downloaded||r.downloaded{}),c)}getPhoto(e){return Object(n.f)(e)?e:this.photos[e]}getInput(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}getMediaInput(e){return{_:"inputMediaPhoto",id:this.getInput(e),ttl_seconds:0}}savePhotoFile(e,t){const s=this.choosePhotoSize(e,65535,65535);if("photoSize"!==s._&&"photoSizeProgressive"!==s._)return;const i=this.getPhotoDownloadOptions(e,s,t);i.fileName="photo"+e.id+".jpg",l.a.downloadToDisc(i,i.fileName)}}v.jpegHeader=Object(i.c)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),v.jpegTail=Object(i.c)("ffd9");const _=new v;u.a&&(u.a.appPhotosManager=_),t.a=_},,,,,,,,,,,,,function(e,t,s){"use strict";var i=s(126),a=s(32),n=s(135),r=s(145),o=s(31),d=s(73),l=s(53),c=s(130),h=s(33),u=s(29),p=s(56),g=s(15),f=s(121),m=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const v={mov:"video/quicktime",gif:"image/gif",pdf:"application/pdf"};const _=new class{constructor(){this.docs={},this.savingLottiePreview={},this.downloading=new Map,this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];if(t.supportsStreaming){delete t.supportsStreaming;delete d.a.getCacheContext(t).url}}},h.a.onServiceWorkerFail=this.onServiceWorkerFail}saveDoc(e,t){if("documentEmpty"===e._)return;const s=this.docs[e.id];if(e.file_reference&&(Object(a.h)("file_reference",s,e),n.a.saveContext(e.file_reference,t)),s||(this.docs[e.id]=e),e.attributes.forEach(t=>{switch(t._){case"documentAttributeFilename":e.file_name=o.a.wrapPlainText(t.file_name),e.fileName=o.a.wrapEmojiText(t.file_name);break;case"documentAttributeAudio":e.duration=t.duration,e.audioTitle=o.a.wrapEmojiText(t.title),e.audioPerformer=o.a.wrapEmojiText(t.performer),e.type=t.pFlags.voice&&"audio/ogg"===e.mime_type?"voice":"audio";break;case"documentAttributeVideo":e.duration=t.duration,e.w=t.w,e.h=t.h,t.pFlags.round_message?e.type="round":e.type="video";break;case"documentAttributeSticker":void 0!==t.alt&&(e.stickerEmojiRaw=t.alt,e.stickerEmoji=o.a.wrapRichText(e.stickerEmojiRaw,{noLinks:!0,noLinebreaks:!0})),t.stickerset&&("inputStickerSetEmpty"===t.stickerset._?delete t.stickerset:"inputStickerSetID"===t.stickerset._&&(e.stickerSetInput=t.stickerset)),"image/webp"===e.mime_type&&(e.thumbs||f.a)&&(e.type="sticker",e.sticker=1);break;case"documentAttributeImageSize":e.type="photo",e.w=t.w,e.h=t.h;break;case"documentAttributeAnimated":"image/gif"!==e.mime_type&&"video/mp4"!==e.mime_type||(e.type="gif"),e.animated=!0}}),e.mime_type)e.mime_type===v.pdf?e.type="pdf":e.mime_type===v.gif&&(e.type="gif");else{const t=(e.file_name||"").split(".").pop(),s=t&&v[t.toLowerCase()];if(s)e.mime_type=s;else switch(e.type){case"gif":case"video":case"round":e.mime_type="video/mp4";break;case"sticker":e.mime_type="image/webp";break;case"audio":e.mime_type="audio/mpeg";break;case"voice":e.mime_type="audio/ogg";break;default:e.mime_type="application/octet-stream"}}if("voice"!==e.type&&"round"!==e.type||(e.file_name=e.fileName=e.type+"_"+Object(p.f)(new Date(1e3*e.date),{monthAsNumber:!0,leadingZero:!0}).replace(/[:\.]/g,"-").replace(", ","_")),h.a.isServiceWorkerOnline()&&("gif"===e.type&&e.size>8e6||"audio"===e.type||"video"===e.type)){e.supportsStreaming=!0;const t=d.a.getCacheContext(e);t.url||(t.url=this.getFileURL(e))}return e.file_name||(e.file_name=e.fileName=""),"application/x-tgsticker"===e.mime_type&&"AnimatedSticker.tgs"===e.file_name&&(e.type="sticker",e.animated=!0,e.sticker=2),s?Object.assign(s,e):e}getDoc(e){return Object(a.f)(e)?e:this.docs[e]}getMediaInput(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}getInput(e,t){return{_:"inputDocumentFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t}}getFileDownloadOptions(e,t,s,i){const a=this.getInput(e,null==t?void 0:t.type);let n;return n=t?e.sticker?"image/webp":"image/jpeg":e.mime_type||"application/octet-stream",{dcId:e.dc_id,location:a,size:t?t.size:e.size,mimeType:n,fileName:e.file_name,queueId:s,onlyCache:i}}getFileURL(e,t=!1,s){let a;return a=t?"download":s?"thumb":e.supportsStreaming?"stream":"document",Object(i.b)(a,this.getFileDownloadOptions(e,s))}getThumbURL(e,t){let s=Promise.resolve();const i=d.a.getCacheContext(e,t.type);return i.url||(s="bytes"in t?Object(c.a)(l.a.getPreviewURLFromBytes(t.bytes,!!e.sticker)).then(e=>{i.url=e}):l.a.preloadPhoto(e,t)),{thumb:t,cacheContext:i,promise:s}}getThumb(e,t=!0){const s=l.a.choosePhotoSize(e,0,0,!t);return"photoSizeEmpty"===s._?null:this.getThumbURL(e,s)}getInputFileName(e,t){return Object(i.a)(this.getInput(e,t),{fileName:e.file_name})}downloadDoc(e,t,s){const i=this.getInputFileName(e);let a=d.a.getDownload(i);if(a)return a;const n=this.getFileDownloadOptions(e,void 0,t,s);a=d.a.download(n),this.downloading.set(e.id,a),g.default.dispatchEvent("download_start",e.id);const o=d.a.getCacheContext(e),l=a;return l.then(e=>{o.url=URL.createObjectURL(e),o.downloaded=e.size},()=>{}).finally(()=>{this.downloading.delete(e.id)}),"voice"!==e.type||r.a.isPlaySupported()||(a=l.then(e=>m(this,void 0,void 0,(function*(){const t=new FileReader;return yield new Promise((s,i)=>{t.onloadend=e=>{const t=new Uint8Array(e.target.result);r.a.decode(t).then(e=>{o.url=e.url,s()},e=>{delete o.downloaded,i(e)})},t.readAsArrayBuffer(e)}),e})))),a.then(()=>{g.default.dispatchEvent("document_downloaded",e)}),a}saveLottiePreview(e,t,s){const i=e.id+"-"+s;if(this.savingLottiePreview[i])return;e.stickerCachedThumbs||(Object(a.c)(e,["stickerCachedThumbs"]),e.stickerCachedThumbs={});const n=e.stickerCachedThumbs[s];n&&n.w>=t.width&&n.h>=t.height||(this.savingLottiePreview[i]=!0,t.toBlob(a=>{const n={url:URL.createObjectURL(a),w:t.width,h:t.height};e.stickerCachedThumbs[s]=n,delete this.savingLottiePreview[i]}))}saveDocFile(e,t){const s=this.downloadDoc(e,t);return s.then(()=>{const t=d.a.getCacheContext(e);d.a.createDownloadAnchor(t.url,e.file_name)}),s}};u.a.appDocsManager=_,t.a=_},,,,function(e,t,s){"use strict";var i=s(29),a=s(67),n=s(33);const r=new class{constructor(){this.serverTimeOffset=0,a.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),n.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=r),t.a=r},function(e,t,s){"use strict";s.r(t),s.d(t,"AppProfileManager",(function(){return y}));var i=s(29),a=s(56),n=s(62),r=s(16),o=s(33),d=s(31),l=s(15),c=s(114),h=s(74),u=s(48),p=s(102),g=s(97),f=s(44),m=s(53),v=s(39),_=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class y{constructor(){this.usersFull={},this.chatsFull={},this.onUpdateUserTyping=e=>{var t;const s=e.user_id?e.user_id.toPeerId():f.a.getPeerId(e.from_id);if(l.default.myId===s||"speakingInGroupCallAction"===e.action._)return;const i=f.a.getPeerId(e),a=null!==(t=this.typingsInPeer[i])&&void 0!==t?t:this.typingsInPeer[i]=[];let n=a.find(e=>e.userId===s);const r=()=>{delete n.timeout;const e=a.indexOf(n);-1!==e&&a.splice(e,1),l.default.dispatchEvent("peer_typings",{peerId:i,typings:a}),a.length||delete this.typingsInPeer[i]};if(n&&void 0!==n.timeout&&clearTimeout(n.timeout),"sendMessageCancelAction"===e.action._){if(!n)return;return void r()}n||(n={userId:s},a.push(n)),n.action=e.action;const o=v.a.hasUser(s);o?v.a.forceUserOnline(s):"updateChatUserTyping"===e._&&e.chat_id&&u.a.hasChat(e.chat_id)&&!u.a.isChannel(e.chat_id)&&I.getChatFull(e.chat_id).then(()=>{void 0!==n.timeout&&v.a.hasUser(s)&&l.default.dispatchEvent("peer_typings",{peerId:i,typings:a})}),n.timeout=window.setTimeout(r,6e3),o&&l.default.dispatchEvent("peer_typings",{peerId:i,typings:a})},this.onUpdatePeerBlocked=e=>{const t=f.a.getPeerId(e.peer_id);if(f.a.isUser(t)){const s=t.toUserId(),i=this.usersFull[s];i&&(e.blocked?i.pFlags.blocked=!0:delete i.pFlags.blocked),l.default.dispatchEvent("user_full_update",s)}l.default.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})},l.default.addMultipleEventsListeners({updateChatParticipants:e=>{const t=e.participants;if("chatParticipants"===t._){const e=t.chat_id,s=this.chatsFull[e];void 0!==s&&(s.participants=t,l.default.dispatchEvent("chat_full_update",e))}},updateChatParticipantAdd:e=>{const t=this.chatsFull[e.chat_id];if(void 0!==t){const s=t.participants,i=s.participants||[];for(let t=0,s=i.length;t{const t=this.chatsFull[e.chat_id];if(void 0!==t){const s=t.participants,i=s.participants||[];for(let t=0,a=i.length;t{var t,s;const i=this.chatsFull[e],a=u.a.getChat(e);if(!i||!a)return;let n=!1;!!i.call!=!!(null===(t=a.pFlags)||void 0===t?void 0:t.call_active)&&(n=!0);const{photo:r}=a;if(r){"chatPhotoEmpty"!==r._===("photoEmpty"!==(null===(s=i.chat_photo)||void 0===s?void 0:s._))&&r.photo_id===i.chat_photo.id||(n=!0)}n&&this.refreshFullPeer(e.toPeerId(!0))}),l.default.addEventListener("chat_full_update",e=>{l.default.dispatchEvent("peer_full_update",e.toPeerId(!0))}),l.default.addEventListener("user_full_update",e=>{l.default.dispatchEvent("peer_full_update",e.toPeerId(!1))}),l.default.addEventListener("invalidate_participants",e=>{this.invalidateChannelParticipants(e)}),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t?Promise.resolve(this.usersFull[e]):o.a.invokeApiSingleProcess({method:"users.getFullUser",params:{id:v.a.getUserInput(e)},processResult:t=>{const s=t.user;v.a.saveApiUser(s,!0);const i=e.toPeerId(!1);return t.profile_photo&&(t.profile_photo=m.a.savePhoto(t.profile_photo,{type:"profilePhoto",peerId:i})),void 0!==t.about&&(t.rAbout=d.a.wrapRichText(t.about,{noLinebreaks:!0})),g.a.savePeerSettings({peerId:i,settings:t.notify_settings}),l.default.dispatchEvent("user_full_update",e),this.usersFull[e]=t}})}getProfileByPeerId(e,t){return f.a.isAnyChat(e)?this.getChatFull(e.toChatId(),t):this.getProfile(e.toUserId(),t)}getCachedFullChat(e){return this.chatsFull[e]}getCachedFullUser(e){return this.usersFull[e]}getCachedProfileByPeerId(e){return e.isUser()?this.getCachedFullUser(e.toUserId()):this.getCachedFullChat(e.toChatId())}getFullPhoto(e){return this.getProfileByPeerId(e).then(e=>{switch(e._){case"userFull":return e.profile_photo;case"channelFull":case"chatFull":return e.chat_photo}})}getChatFull(e,t){if(u.a.isChannel(e))return this.getChannelFull(e,t);const s=this.chatsFull[e];if(s&&!t){const t=u.a.getChat(e);if(t.version===s.participants.version||t.pFlags.left)return Promise.resolve(s)}return o.a.invokeApiSingleProcess({method:"messages.getFullChat",params:{chat_id:e},processResult:t=>{u.a.saveApiChats(t.chats,!0),v.a.saveApiUsers(t.users);const s=t.full_chat,i=e.toPeerId(!0);return s&&s.chat_photo&&s.chat_photo.id&&(s.chat_photo=m.a.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:i})),g.a.savePeerSettings({peerId:i,settings:s.notify_settings}),this.chatsFull[e]=s,l.default.dispatchEvent("chat_full_update",e),s}})}getChatInviteLink(e,t){return this.getChatFull(e).then(s=>!t&&s.exported_invite&&"chatInviteExported"==s.exported_invite._?s.exported_invite.link:o.a.invokeApi("messages.exportChatInvite",{peer:f.a.getInputPeerById(e.toPeerId(!0))}).then(t=>(void 0!==this.chatsFull[e]&&(this.chatsFull[e].exported_invite=t),t.link)))}getChannelParticipants(e,t={_:"channelParticipantsRecent"},s=200,i=0){if("channelParticipantsRecent"===t._){const t=u.a.getChat(e);if(t&&t.pFlags&&(t.pFlags.kicked||t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights))return Promise.reject()}return o.a.invokeApiCacheable("channels.getParticipants",{channel:u.a.getChannelInput(e),filter:t,offset:i,limit:s,hash:"0"},{cacheSeconds:60}).then(e=>(v.a.saveApiUsers(e.users),e))}getChannelParticipant(e,t){return o.a.invokeApiSingle("channels.getParticipant",{channel:u.a.getChannelInput(e),participant:f.a.getInputPeerById(t)}).then(e=>(v.a.saveApiUsers(e.users),e.participant))}getChannelFull(e,t){return void 0===this.chatsFull[e]||t?o.a.invokeApiSingleProcess({method:"channels.getFullChannel",params:{channel:u.a.getChannelInput(e)},processResult:t=>{const s=e.toPeerId(!0);u.a.saveApiChats(t.chats,!0),v.a.saveApiUsers(t.users);const i=t.full_chat;return i&&i.chat_photo.id&&(i.chat_photo=m.a.savePhoto(i.chat_photo,{type:"profilePhoto",peerId:s})),g.a.savePeerSettings({peerId:s,settings:i.notify_settings}),this.chatsFull[e]=i,l.default.dispatchEvent("chat_full_update",e),i},processError:t=>{switch(t.type){case"CHANNEL_PRIVATE":let t=u.a.getChat(e);t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},h.a.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:[t],users:[]})}throw t}}):Promise.resolve(this.chatsFull[e])}getMentions(e,t,s){let i;return i=u.a.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:p.a.getServerMessageId(s)},50,0).then(e=>e.participants.map(e=>u.a.getParticipantPeerId(e))):e?this.getChatFull(e).then(e=>e.participants.participants.map(e=>e.user_id.toPeerId())):Promise.resolve([]),Promise.all([v.a.getTopPeers("bots_inline").catch(()=>[]),i]).then(e=>(e=>{"@"===t.charAt(0)&&(t=t.slice(1));const s=new c.a({ignoreCase:!0}),i=new Map;e.forEach(e=>{s.indexObject(e.id,v.a.getUserSearchText(e.id)),i.set(e.id,e.rating)});const a=Array.from(s.search(t));return a.sort((e,t)=>i.get(t)-i.get(e)),a})(e[0].concat(e[1].map(e=>({id:e,rating:0})))))}invalidateChannelParticipants(e){o.a.clearCache("channels.getParticipants",t=>t.channel.channel_id===e),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){e.isUser()?delete this.usersFull[e.toUserId()]:delete this.chatsFull[e.toChatId()],l.default.dispatchEvent("peer_full_update",e)}updateProfile(e,t,s){return o.a.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:s}).then(e=>(v.a.saveApiUser(e),this.getProfile(l.default.myId,!0)))}uploadProfilePhoto(e){return o.a.invokeApi("photos.uploadProfilePhoto",{file:e}).then(e=>{v.a.saveApiUsers(e.users);const t=l.default.myId;m.a.savePhoto(e.photo,{type:"profilePhoto",peerId:t});const s=t.toUserId();h.a.processLocalUpdate({_:"updateUserPhoto",user_id:s,date:Object(a.g)(!0),photo:v.a.getUser(s).photo,previous:!0})})}deletePhotos(e){return o.a.invokeApiSingle("photos.deletePhotos",{id:e.map(e=>{const t=m.a.getPhoto(e);return m.a.getInput(t)})}).then(e=>{})}getChatMembersString(e){var t,s;const i=u.a.getChat(e);if("chatForbidden"===i._)return Object(r.i18n)("YouWereKicked");const a=this.chatsFull[e];let o;o=a?"channelFull"===a._?a.participants_count:null===(t=a.participants.participants)||void 0===t?void 0:t.length:i.participants_count||(null===(s=i.participants)||void 0===s?void 0:s.participants.length);o=o||1;let d=u.a.isBroadcast(e)?"Peer.Status.Subscribers":"Peer.Status.Member";return Object(r.i18n)(d,[Object(n.d)(o)])}verifyParticipantForOnlineCount(e){const t=v.a.getUser(e.user_id);return!(!t||!t.status||"userStatusOnline"!==t.status._)}reduceParticipantsForOnlineCount(e){return e.reduce((e,t)=>e+ +this.verifyParticipantForOnlineCount(t),0)}getOnlines(e){var t;return _(this,void 0,void 0,(function*(){if(u.a.isBroadcast(e))return 1;const s=yield this.getChatFull(e);if(u.a.isMegagroup(e)){if(s.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const i=yield o.a.invokeApiCacheable("messages.getOnlines",{peer:u.a.getChannelInputPeer(e)},{cacheSeconds:60});return null!==(t=i.onlines)&&void 0!==t?t:1}const i=s.participants;return(null==i?void 0:i.participants)?this.reduceParticipantsForOnlineCount(i.participants):1}))}getPeerTypings(e){return this.typingsInPeer[e]}}const I=new y;i.a.appProfileManager=I,t.default=I},,,function(e,t,s){"use strict";var i=s(29),a=s(43),n=s(33),r=s(15),o=s(39),d=s(48),l=s(44),c=s(17),h=s(70),u=s(109),p=s(81),g=s(31),f=s(8);const m=new class{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=Object(a.b)("UPDATES",a.a.Error|a.a.Warn|a.a.Log),this.debug=i.b,this.processUpdateMessage=(e,t={})=>{const s={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(this.debug&&this.log.debug("processUpdateMessage",e),e._){case"updatesTooLong":case"new_session_created":this.forceGetDifference();break;case"updateShort":this.processUpdate(e.update,s);break;case"updateShortMessage":case"updateShortChatMessage":{Object(u.a)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,i=e.from_id||(t?r.default.myId:e.user_id),a=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||r.default.myId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:l.a.getOutputPeer(i.toPeerId()),peer_id:l.a.getOutputPeer(a),date:e.date,message:e.message,fwd_from:e.fwd_from,reply_to:e.reply_to,entities:e.entities},pts:e.pts,pts_count:e.pts_count},s);break}case"updatesCombined":case"updates":o.a.saveApiUsers(e.users,t.override),d.a.saveApiChats(e.chats,t.override),e.updates.forEach(e=>{this.processUpdate(e,s)});break;default:this.log.warn("Unknown update message",e)}}}setProxy(){const e=this;this.updatesState=new Proxy(this.updatesState,{set:function(t,s,i){return t[s]=i,e.saveUpdatesState(),!0}})}saveUpdatesState(){const e=this.updatesState;c.default.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){const e=this.updatesState,t=e.seq+1,s=e.pendingSeqUpdates[t];if(!s)return!1;const i=s.updates;for(let e=0,t=i.length;e=e.syncPending.seqAwaiting&&(e.syncPending.ptsAwaiting?delete e.syncPending.seqAwaiting:(clearTimeout(e.syncPending.timeout),e.syncPending=null)),!0}popPendingPtsUpdate(e){const t=e?this.getChannelState(e):this.updatesState;if(!t.pendingPtsUpdates.length)return!1;t.pendingPtsUpdates.sort((e,t)=>e.pts-t.pts);let s=t.pts,i=0,a=0;for(let e=0,n=t.pendingPtsUpdates.length;e=n.pts&&(i=n.pts,a=e)}if(!i)return!1;this.debug&&this.log.debug("pop pending pts updates",i,t.pendingPtsUpdates.slice(0,a+1)),t.pts=i;for(let e=0;e<=a;++e){const s=t.pendingPtsUpdates[e];this.saveUpdate(s)}return t.pendingPtsUpdates.splice(0,a+1),!t.pendingPtsUpdates.length&&t.syncPending&&(t.syncPending.seqAwaiting?delete t.syncPending.ptsAwaiting:(clearTimeout(t.syncPending.timeout),t.syncPending=null)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState;let s=t.syncLoading;s||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const i=n.a.invokeApi("updates.getDifference",{pts:t.pts,pts_total_limit:e?1200:void 0,date:t.date,qts:-1},{timeout:2147483647}).then(s=>{if(this.debug&&this.log.debug("Get diff result",s),"updates.differenceEmpty"===s._)return this.debug&&this.log.debug("apply empty diff",s.seq),t.date=s.date,void(t.seq=s.seq);if(e&&r.default.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==s._){o.a.saveApiUsers(s.users),d.a.saveApiChats(s.chats),s.other_updates.forEach(e=>{switch(e._){case"updateChannelTooLong":case"updateNewChannelMessage":case"updateEditChannelMessage":return void this.processUpdate(e)}this.saveUpdate(e)}),s.new_messages.forEach(e=>{this.saveUpdate({_:"updateNewMessage",message:e,pts:t.pts,pts_count:0})});const e="updates.difference"===s._?s.state:s.intermediate_state;t.seq=e.seq,t.pts=e.pts,t.date=e.date}else t.pts=s.pts,t.date=(Date.now()/1e3|0)+h.a.serverTimeOffset,delete t.seq,this.channelStates={},this.log.warn("getDifference:",s._),r.default.dispatchEvent("state_cleared");if("updates.differenceSlice"===s._)return this.getDifference();this.debug&&this.log.debug("finished get diff")});return s||this.justAName(t,i),i}getChannelDifference(e){const t=this.getChannelState(e),s=t.syncLoading;s||(t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const i=n.a.invokeApi("updates.getChannelDifference",{channel:d.a.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:30},{timeout:2147483647}).then(s=>{if(this.debug&&this.log.debug("Get channel diff result",s),t.pts="pts"in s?s.pts:void 0,"updates.channelDifferenceEmpty"!==s._){if("updates.channelDifferenceTooLong"===s._)return this.debug&&this.log.debug("channel diff too long",s),delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(o.a.saveApiUsers(s.users),d.a.saveApiChats(s.chats),this.debug&&this.log.debug("applying",s.other_updates.length,"channel other updates"),s.other_updates.forEach(e=>{this.saveUpdate(e)}),this.debug&&this.log.debug("applying",s.new_messages.length,"channel new messages"),s.new_messages.forEach(e=>{this.saveUpdate({_:"updateNewChannelMessage",message:e,pts:t.pts,pts_count:0})}),this.debug&&this.log.debug("apply channel diff",t.pts),"updates.channelDifference"===s._&&!s.pFlags.final)return this.getChannelDifference(e);this.debug&&this.log.debug("finished channel get diff")}else this.debug&&this.log.debug("apply channel empty diff",s)});return s||this.justAName(t,i,e),i}justAName(e,t,s){e.syncLoading=t,r.default.dispatchEvent("state_synchronizing",s),t.then(()=>{e.syncLoading=null,r.default.dispatchEvent("state_synchronized",s)},()=>{e.syncLoading=null})}addChannelState(e,t){if(!t)throw new Error("Add channel state without pts "+e);return!(e in this.channelStates)&&(this.channelStates[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null},!0)}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var s;let i;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":i=l.a.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(i=e.channel_id,!(i in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(i=e.channel_id)}const{pts:a,pts_count:n}=e,r=i?this.getChannelState(i,a):this.updatesState;if(r.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!r.lastPtsUpdateTime||r.lastPtsUpdateTime{r.syncPending=null,r.syncLoading||(i?this.getChannelDifference(i):this.getDifference())},6)}),r.syncPending.ptsAwaiting=!0,!1;if(a>r.pts)r.pts=a,c=!0,r.lastPtsUpdateTime=Date.now();else if(n)return!1;i&&t.date&&this.updatesState.date0){const s=t.seq,i=t.seqStart||s;if(i!==r.seq+1&&i>r.seq)return this.debug&&this.log.warn("Seq hole",r,r.syncPending&&r.syncPending.seqAwaiting),void 0===r.pendingSeqUpdates[i]&&(r.pendingSeqUpdates[i]={seq:s,date:t.date,updates:[]}),r.pendingSeqUpdates[i].updates.push(e),r.syncPending||(r.syncPending={timeout:window.setTimeout(()=>{r.syncPending=null,r.syncLoading||this.getDifference()},6)}),(!r.syncPending.seqAwaiting||r.syncPending.seqAwaiting{const t=c.default.newVersion;e&&e.pts&&e.date?(Object.assign(this.updatesState,e),this.log("will get difference",Object.assign({},e)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise(e=>{n.a.invokeApi("updates.getState",{},{noErrorBox:!0}).then(t=>{this.updatesState.seq=t.seq,this.updatesState.pts=t.pts,this.updatesState.date=t.date,this.saveUpdatesState(),this.updatesState.syncLoading=null,e()})})),n.a.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),t&&this.updatesState.syncLoading.then(()=>{fetch("changelogs/"+t+".md").then(e=>200===e.status&&e.ok&&e.text()||Promise.reject()).then(e=>{e=`**Telegram Web${f.a.suffix} was updated to version alpha ${t}**\n\n`+e;const s=[],i={_:"updateServiceNotification",entities:s,message:g.b.parseMarkdown(e,s),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(i)}).catch(p.a)})}))}};i.a.apiUpdatesManager=m,t.a=m},function(e,t,s){"use strict";s.d(t,"a",(function(){return d})),s.d(t,"d",(function(){return c})),s.d(t,"b",(function(){return h})),s.d(t,"c",(function(){return u}));var i=s(43);class a{constructor(e){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver(t=>{if(this.locked)return;const s=[];t.forEach(e=>{const t=e.target;this.items.get(t)!==e.isIntersecting&&(this.items.set(t,e.isIntersecting),s[e.isIntersecting?"unshift":"push"]({target:t,visible:e.isIntersecting}))}),s.forEach(t=>{e(t.target,t.visible)})})}getVisible(){const e=[];return this.items.forEach((t,s)=>{t&&e.push(s)}),e}clearVisible(){const e=this.getVisible();for(const t of e)this.items.set(t,!1)}isVisible(e){return this.items.get(e)}disconnect(){this.observer.disconnect(),this.items.clear()}refresh(){this.observer.disconnect();const e=[...this.items.keys()];for(const t of e)this.observer.observe(t)}refreshVisible(){const e=this.getVisible();for(const t of e)this.observer.unobserve(t);for(const t of e)this.observer.observe(t)}observe(e){this.items.set(e,!1),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.items.delete(e)}unlock(){this.locked=!1}unlockAndRefresh(){this.unlock(),this.refresh()}lock(){this.locked=!0}}var n=s(41),r=s(105),o=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class d{constructor(e=8){this.parallelLimit=e,this.queueId=0,this.queue=[],this.inProcess=new Set,this.lockPromise=null,this.unlockResolve=null,this.log=Object(i.b)("LL",i.a.Error),this.processQueue=Object(r.a)(()=>this._processQueue(),20,!1)}clear(){this.inProcess.clear(),this.queue.length=0}lock(){this.lockPromise||(this.lockPromise=new Promise((e,t)=>{this.unlockResolve=e}))}unlock(){this.unlockResolve&&(this.unlockResolve(),this.unlockResolve=this.lockPromise=null,this.processQueue())}processItem(e){return o(this,void 0,void 0,(function*(){if(!this.lockPromise){this.inProcess.add(e);try{yield this.loadItem(e)}catch(e){["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(e)||this.log.error("loadMediaQueue error:",e)}this.inProcess.delete(e),this.processQueue()}}))}loadItem(e){return e.load()}getItem(){return this.queue.shift()}addElement(e,t){this.queue[e](t),this.processQueue()}_processQueue(e){if(!this.queue.length||this.lockPromise||this.parallelLimit>0&&this.inProcess.size>=this.parallelLimit)return;do{if(e?Object(n.e)(this.queue,e):e=this.getItem(),!e)break;this.processItem(e),e=null}while(this.inProcess.sizee.div===t.div&&e.load===t.load))return!1;for(const e of this.inProcess)if(e.div===t.div&&e.load===t.load)return!1;return this.queue[e](t),!0}setProcessQueueTimeout(){this.intersectorTimeout||(this.intersectorTimeout=window.setTimeout(()=>{this.intersectorTimeout=0,this.processQueue()},0))}push(e){super.push(e)}unshift(e){super.unshift(e)}unobserve(e){Object(n.c)(this.queue,t=>t.div===e),this.intersector.unobserve(e)}}class c extends l{constructor(e=8){super(e),this.parallelLimit=e,this.onVisibilityChange=(e,t)=>{t&&(Object(n.c)(this.queue,t=>t.div===e).forEach(e=>{e.wasSeen=!0,this.queue.unshift(e)}),this.setProcessQueueTimeout())},this.intersector=new a(this.onVisibilityChange)}getItem(){return this.queue.findAndSplice(e=>e.wasSeen)}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return o(this,void 0,void 0,(function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)}))}addElement(e,t){return!!super.addElement(e,t)&&(this.intersector.observe(t.div),t.hasOwnProperty("wasSeen")||(t.wasSeen=!1),!0)}}class h extends l{constructor(e=8,t){super(e),this.parallelLimit=e,this.onVisibilityChange=t,this._queue=new Map,this.intersector=new a((e,t)=>{const s=Object(n.c)(this.queue,t=>t.div===e);if(t){(s.length?s:[this._queue.get(e)]).forEach(t=>{this.queue.unshift(t||this._queue.get(e))})}this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()})}clear(){super.clear(),this._queue.clear()}observe(e){this._queue.set(e.div,e),this.intersector.observe(e.div)}}class u extends l{constructor(e=8,t){super(e),this.parallelLimit=e,this.onVisibilityChange=t,this.intersector=new a((e,t)=>{const s=Object(n.c)(this.queue,t=>t.div===e);t&&s.length&&s.forEach(e=>{this.queue.unshift(e)}),this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()})}observe(e){this.intersector.observe(e)}}},function(e,t,s){"use strict";function i(e){const t=e.length,s=new Array(t);for(let i=0;i>>t&24),2!==t&&i-n!=1||(s+=String.fromCharCode(r(a>>>18&63),r(a>>>12&63),r(a>>>6&63),r(63&a)),a=0);return s.replace(/A(?=A$|$)/g,"=")}function r(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function o(e,t){const s=e.length;if(s!==t.length)return!1;for(let i=0;ie+(t.byteLength||t.length),0),s=new Uint8Array(t);let i=0;return e.forEach(e=>{s.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),s}s.d(t,"e",(function(){return i})),s.d(t,"c",(function(){return a})),s.d(t,"d",(function(){return n})),s.d(t,"b",(function(){return o})),s.d(t,"a",(function(){return d}))},,,,,,,,,,,,,,,,function(e,t,s){"use strict";const i=new class{constructor(){this.width=0,this.height=0;const e="visualViewport"in window?window.visualViewport:window,t=()=>{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}};t.a=i},,,,function(e,t,s){"use strict";function i(e){const t=document.createElement("span");return t.innerHTML=e,t}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";var i=s(115),a=s(29),n=s(46),r=s(56),o=s(32),d=s(78),l=s(0),c=s(16),h=s(33),u=s(26),p=s(15),g=s(80),f=s(74),m=s(48),v=s(44),_=s(131),y=s(17),I=s(39);const M=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=!!navigator.vibrate,this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null},this.faviconEl=document.head.querySelector('link[rel="icon"]'),this.titleBackup=document.title,this.titleChanged=!1,this.stopped=!1,this.settings={},this.pushInited=!1,this.updateLocalSettings=()=>{Promise.all(["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map(e=>g.a.get(e))).then(e=>{if(this.settings.nodesktop=e[0],this.settings.volume=void 0===e[1]?.5:e[1],this.settings.novibrate=e[2],this.settings.nopreview=e[3],this.settings.nopush=e[4],this.pushInited){const e=!this.settings.nopush&&!this.settings.nodesktop&&u.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?u.default.subscribe():u.default.unsubscribe())}u.default.setSettings(this.settings)}),y.default.getState().then(e=>{this.settings.nosound=!e.settings.notifications.sound})},this.requestPermission=()=>{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)},navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.topMessagesDeferred=Object(n.a)(),this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),p.default.addEventListener("instance_deactivated",()=>{this.stop()}),p.default.addEventListener("instance_activated",()=>{this.stopped&&this.start()}),p.default.addEventListener("idle",e=>{this.stopped||(e||this.clear(),this.toggleToggler())}),p.default.addMultipleEventsListeners({updateNotifySettings:e=>{const t="notifyPeer"===e.peer._&&v.a.getPeerId(e.peer.peer),s="notifyPeer"!==e.peer._?e.peer._:void 0;this.savePeerSettings({key:s,peerId:t,settings:e.notify_settings}),p.default.dispatchEvent("notify_settings",e)}}),p.default.addEventListener("push_init",e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):u.default.subscribe()}),p.default.addEventListener("push_subscribe",e=>{this.registerDevice(e)}),p.default.addEventListener("push_unsubscribe",e=>{this.unregisterDevice(e)}),p.default.addEventListener("dialogs_multiupdate",()=>{this.topMessagesDeferred.resolve()},{once:!0}),p.default.addEventListener("push_notification_click",e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void h.a.invokeApi("account.updateDeviceLocked",{period:86400}).then(()=>{});const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then(()=>{e.custom.channel_id&&!m.a.hasChat(e.custom.channel_id)||t.isUser()&&!I.a.hasUser(t)||p.default.dispatchEvent("history_focus",{peerId:t,mid:+e.custom.msg_id})})})}toggleToggler(e=p.default.idle.isIDLE){if(l.IS_MOBILE)return;const t=()=>{this.titleChanged=!1,document.title=this.titleBackup,this.setFavicon()};window.clearInterval(this.titleInterval),this.titleInterval=0,e?this.titleInterval=window.setInterval(()=>{const e=this.notificationsCount;if(e)if(this.titleChanged)t();else{this.titleChanged=!0,document.title=c.default.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const s=t.getContext("2d");s.beginPath(),s.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),s.fillStyle="#3390ec",s.fill();let a=24,n=""+e;e<10?a=22:e<100?a=20:(n="99+",a=16),a*=window.devicePixelRatio,s.font=`700 ${a}px ${i.b}`,s.textBaseline="middle",s.textAlign="center",s.fillStyle="white",s.fillText(n,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)},1e3):t()}getLocalSettings(){return this.settings}getNotifySettings(e){let t,s=Object(d.b)(e._),i=this.peerSettings[s];return"inputNotifyPeer"===e._&&(t=s=v.a.getPeerId(e.peer),i=i[s]),i||((i||this.peerSettings)[s]=h.a.invokeApi("account.getNotifySettings",{peer:e}).then(e=>(this.savePeerSettings({key:s,peerId:t,settings:e}),e)))}getNotifyPeerTypeSettings(){if(this.getNotifyPeerTypePromise)return this.getNotifyPeerTypePromise;const e=["inputNotifyBroadcasts","inputNotifyUsers","inputNotifyChats"].map(e=>this.getNotifySettings({_:e}));return this.getNotifyPeerTypePromise=Promise.all(e)}updateNotifySettings(e,t){return h.a.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then(s=>{s&&f.a.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:Object(d.b)(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})})}getNotifyExceptions(){h.a.invokeApi("account.getNotifyExceptions",{compare_sound:!0}).then(e=>{f.a.processUpdateMessage(e)})}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=h.a.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){h.a.invokeApi("account.setContactSignUpNotification",{silent:e}).then(t=>{this.notifyContactsSignUp=Promise.resolve(!e)})}setFavicon(e="assets/img/favicon.ico"){if(this.prevFavicon===e)return;const t=this.faviconEl.cloneNode();t.href=e,this.faviconEl.parentNode.replaceChild(t,this.faviconEl),this.faviconEl=t,this.prevFavicon=e}savePeerSettings({key:e,peerId:t,settings:s}){let i;t&&(e=t,i=this.peerSettings.notifyPeer),(i||this.peerSettings)[e]=s,t||p.default.dispatchEvent("notify_peer_type_settings",{key:e,settings:s})}isMuted(e){return"peerNotifySettings"===e._&&(1e3*e.mute_until>Object(r.g)()||e.silent)}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:v.a.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then(e=>this.isMuted(e))}getPeerLocalSettings(e,t=!0){const s={_:"peerNotifySettings"},i=this.peerSettings.notifyPeer[e];if(!i||i instanceof Promise||Object.assign(s,i),t){const t=v.a.getInputNotifyPeerById(e,!0),i=Object(d.b)(t._),a=this.peerSettings[i];if(a&&!(a instanceof Promise))for(let e in a)void 0===s[e]&&(s[e]=a[e])}return s}isPeerLocalMuted(e,t=!0){if(e===p.default.myId)return!1;const s=this.getPeerLocalSettings(e,t);return this.isMuted(s)}start(){if(this.updateLocalSettings(),p.default.addEventListener("settings_updated",this.updateLocalSettings),u.default.start(),!this.notificationsUiSupport)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&window.addEventListener("click",this.requestPermission);try{"onbeforeunload"in window&&window.addEventListener("beforeunload",this.clear)}catch(e){}}stop(){this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}notify(e){if(this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),this.notificationsCount++,this.titleInterval||this.toggleToggler();const t=++this.notificationIndex,s=e.key||"k"+t;this.notificationsShown[s]=!0;const i=Object(r.g)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=i),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return!1;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;let a;if("Notification"in window){try{if(e.tag)for(let t in this.notificationsShown){const s=this.notificationsShown[t];"boolean"!=typeof s&&s.tag===e.tag&&(s.hidden=!0)}a=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1})}catch(e){return this.notificationsUiSupport=!1,void u.default.setLocalNotificationsDisabled()}a.onclick=()=>{a.close(),_.a.focus(),this.clear(),e.onclick&&e.onclick()},a.onclose=()=>{a.hidden||(delete this.notificationsShown[s],this.clear())},a.show&&a.show(),this.notificationsShown[s]=a,l.IS_MOBILE||setTimeout(()=>{this.hide(s)},8e3)}}testSound(e){const t=Object(r.g)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(i),i.addEventListener("ended",()=>{i.remove()},{once:!0})}cancel(e){const t=this.notificationsShown[e];if(t){this.notificationsCount>0&&--this.notificationsCount;try{"boolean"!=typeof t&&t.close&&(t.hidden=!0,t.close())}catch(e){}delete this.notificationsShown[e]}}hide(e){const t=this.notificationsShown[e];if(t&&"boolean"!=typeof t)try{t.close&&(t.hidden=!0,t.close())}catch(e){}}soundReset(e){delete this.soundsPlayed[e]}clear(){for(const e in this.notificationsShown){const t=this.notificationsShown[e];try{"boolean"!=typeof t&&t.close&&t.close()}catch(e){}}this.notificationsShown={},this.notificationsCount=0,u.default.hidePushNotifications()}registerDevice(e){if(this.registeredDevice&&Object(o.b)(this.registeredDevice,e))return!1;h.a.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then(()=>{this.registeredDevice=e},e=>{e.handled=!0})}unregisterDevice(e){if(!this.registeredDevice)return!1;h.a.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then(()=>{this.registeredDevice=!1},e=>{e.handled=!0})}getVibrateSupport(){return this.vibrateSupport}};a.a.appNotificationsManager=M,t.a=M},function(e,t,s){"use strict";s.d(t,"a",(function(){return n})),s.d(t,"b",(function(){return r}));const i={},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 n(e,t,s,n=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(s&&s());if(i[t]&&n||e instanceof HTMLVideoElement)e&&a(e,t),s&&s();else{const n=e instanceof HTMLImageElement,r=n?e:new Image;r.src=t,r.addEventListener("load",()=>{!n&&e&&a(e,t),i[t]=!0,s&&s()},{once:!0}),s&&r.addEventListener("error",s)}}function r(e,t,s){return new Promise(i=>{n(e,t,i,s)})}},,,,function(e,t,s){"use strict";var i=s(29);class a{constructor(){this.tempNum=0}generateMessageId(e,t=!1){const s=a.MESSAGE_ID_OFFSET,i=t?++this.tempNum:0;return e>=s?t?e+(i&a.MESSAGE_ID_INCREMENT-1):e:s+(e*a.MESSAGE_ID_INCREMENT+(i&a.MESSAGE_ID_INCREMENT-1))}getServerMessageId(e){return this.clearMessageId(e,!0)}clearMessageId(e,t){const s=a.MESSAGE_ID_OFFSET;if(e{e&&Object(r.a)(e),this.preloader.classList.contains("manual")?this.loadFunc&&this.loadFunc(e):this.promise&&this.promise.cancel&&this.promise.cancel()},e&&Object(n.g)(this,e)}constructContainer(e={}){this.preloader||(this.preloader=document.createElement("div"),this.preloader.classList.add("preloader-container"),e.color&&this.preloader.classList.add("preloader-"+e.color),e.bold&&this.preloader.classList.add("preloader-bold"),this.streamable&&this.preloader.classList.add("preloader-streamable"))}constructDownloadIcon(){this.constructContainer()}construct(){this.construct=null,this.constructContainer(),this.preloader.innerHTML=`\n
\n \n \n \n
`,this.streamable?this.totalLength=118.61124420166016:this.totalLength=149.82473754882812,this.cancelable?(this.preloader.innerHTML+='\n \n \n \n \n \n \n \n \n \n \n \n ',this.downloadSvg=this.preloader.lastElementChild,this.cancelSvg=this.downloadSvg.previousElementSibling):this.preloader.classList.add("preloader-swing"),this.circle=this.preloader.firstElementChild.firstElementChild.firstElementChild,this.cancelable&&Object(o.b)(this.preloader,this.onClick)}setDownloadFunction(e){this.loadFunc=e}setManual(){this.preloader.classList.add("manual"),this.setProgress(0)}attachPromise(e){if(this.isUpload&&this.promise)return;this.promise=e;const t=--this.tempId,s=Date.now(),i=i=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const n=Date.now()-s;if(!i&&this.cancelable){this.setProgress(100);const e=150;n{t===this.tempId&&this.detach()},e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),Object(a.b)(()=>{this.setManual()})):this.detach();this.promise=e=null};e.then(()=>i(null)).catch(e=>i(e)),e.addNotifyListener&&e.addNotifyListener(e=>{if(t!==this.tempId)return;const s=e.done/e.total*100;this.setProgress(s)})}attach(e,t=!1,s){if(this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,s&&this.attachPromise(s),this.detached||this.preloader.parentElement!==e){const t=Object(d.a)(this.preloader)?1:2;this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader),Object(i.a)(this.preloader,"is-visible",!0,200,void 0,t)}this.cancelable&&t&&this.setProgress(0)}detach(){this.detached||(this.detached=!0,this.preloader&&this.preloader.parentElement&&Object(i.a)(this.preloader,"is-visible",!1,200,()=>{this.preloader.remove()},1))}setProgress(e){if(this.totalLength||Object(d.a)(this.circle))if(0!==e)try{this.totalLength||(this.totalLength=this.circle.getTotalLength()),this.circle.style.strokeDasharray=Math.max(5,e/100*this.totalLength)+", "+this.totalLength}catch(e){}else this.circle.style.strokeDasharray=""}}},function(e,t,s){"use strict";s.d(t,"b",(function(){return o})),s.d(t,"c",(function(){return d})),s.d(t,"a",(function(){return l})),s.d(t,"e",(function(){return c})),s.d(t,"d",(function(){return h})),s.d(t,"f",(function(){return u}));var i=s(37),a=s(82),n=s(0),r=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};function o(e){let t,s;return e instanceof HTMLVideoElement?(t=e.videoWidth,s=e.videoHeight):(t=e.naturalWidth,s=e.naturalHeight),a={media:e,mediaSize:Object(i.c)(t,s),boxSize:Object(i.c)(320,240),quality:.9},new Promise(e=>{var t,s;const i=document.createElement("canvas"),n=a.mediaSize.aspectFitted(a.boxSize);i.width=n.width*window.devicePixelRatio,i.height=n.height*window.devicePixelRatio,i.getContext("2d").drawImage(a.media,0,0,i.width,i.height),i.toBlob(t=>{e({blob:t,size:n})},null!==(t=a.mimeType)&&void 0!==t?t:"image/jpeg",null!==(s=a.quality)&&void 0!==s?s:1)});var a}function d(e){return new Promise((t,s)=>{e.onseeked=()=>{e.onseeked=()=>{o(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=s,e.currentTime=Math.min(e.duration,1)})}function l(e){return r(this,void 0,void 0,(function*(){const t=yield function(e){return new Promise((t,s)=>{const i=document.createElement("video");i.volume=0,i.addEventListener("loadedmetadata",()=>t(i),{once:!0}),i.addEventListener("error",s,{once:!0}),i.src=e})}(e);return Promise.race([Object(a.a)(2e3),d(t)])}))}function c(e,t=e.HAVE_METADATA,s){return new Promise(i=>{e.readyState>=t?i():e.addEventListener(n.IS_APPLE_MOBILE&&!s?"loadeddata":"canplay",()=>i(),{once:!0})})}function h(e,t=!1){return r(this,void 0,void 0,(function*(){const s=[],i=(e,a)=>r(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise((e,s)=>{t.readEntries(t=>r(this,void 0,void 0,(function*(){for(const e of t)yield i(e,a);e()})))})}else if(e)if(t)s.push(e.type);else{const t=a.getAsFile(),i=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise((s,i)=>e.file(s,e=>s(t)));if(!i)return;s.push(i)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let i=0;i{t.addEventListener("change",t=>{const i=t.target.files[0];i?e(i):s("NO_FILE_SELECTED")},{once:!0})}).finally(()=>{t.remove()});return t.click(),s}},,,,,function(e,t,s){"use strict";function i(e){}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));const i=()=>{let e={cleaned:!1};return{clean:()=>{e.cleaned=!0,e={cleaned:!1}},get:()=>{const t=e;return()=>!t.cleaned}}}},,,,function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(127);class a{constructor(e,t=0){this.options=e,this.minChars=t,this.fullTexts=new Map}indexObject(e,t){if(this.options&&t.trim()&&(t=Object(i.c)(t,this.options)),!t)return this.fullTexts.delete(e),!1;this.fullTexts.set(e,t)}search(e){const t=this.fullTexts;this.options&&(e=Object(i.c)(e,this.options));const s=[],a=e.split(" "),n=a.length;t.forEach((e,t)=>{let i=!0,r=0;for(let t=0;te.fullTextLength-t.fullTextLength||t.foundChars-e.foundChars);return new Set(s.map(e=>e.what))}}},function(e,t,s){"use strict";s.d(t,"b",(function(){return r})),s.d(t,"a",(function(){return p}));var i=s(62);const a=new Map,n=new Set,r='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif';let o;const d=()=>{cancelAnimationFrame(o),o=window.requestAnimationFrame(l)},l=()=>{n.forEach(c),n.clear()};window.addEventListener("resize",()=>{for(const[e]of a)n.add(e);d()},{capture:!0,passive:!0});const c=e=>{let t=a.get(e);const s=!t;let{text:n,textLength:o,from:d,multiplier:l,font:c,textWidth:h,elementWidth:p}=t||{};s&&(n=e.textContent,o=n.length,d=50,l=d>0&&d/100,c=`${e.dataset.fontWeight||400} 16px ${r}`,h=u(n,c),p=e.getBoundingClientRect().width,t={text:n,textLength:o,from:d,multiplier:l,font:c,textWidth:h,elementWidth:p},a.set(e,t));const g=e.getBoundingClientRect().width,f=s||p!==g;if(!s&&f&&(t.elementWidth=p=g),f)if(h>p){e.setAttribute("title",n);let s=n,a=p;for(;s.length>3;){let t=s.length;const n=l&&Object(i.a)(l*t<<0,1,t-2)||Math.max(t+d-1,1),r=s.substr(0,n).replace(/\s*$/,""),o=s.substr(n+1).replace(/^\s*/,"");if(s=r+o,a=u(s+"…",c),a{this.drafts=e||{}}),i.default.addMultipleEventsListeners({updateDraftMessage:e=>{const t=a.a.getPeerId(e.peer);this.saveDraft(t,e.threadId,e.draft,{notify:!0})}})}getKey(e,t){return e+(t?"_"+t:"")}getDraft(e,t){return this.drafts[this.getKey(e,t)]}addMissedDialogs(){return this.getAllDrafts().then(()=>{for(const e in this.drafts){if(-1!==e.indexOf("_"))continue;const t=e.toPeerId();n.a.getDialogOnly(t)||n.a.reloadConversation(t)}})}getAllDrafts(){return this.getAllDraftPromise||(this.getAllDraftPromise=l.a.invokeApi("messages.getAllDrafts").then(e=>{(r.a.updatesState.syncLoading||Promise.resolve()).then(()=>{r.a.processUpdateMessage(e)})}))}saveDraft(e,t,s,a={}){const n=this.processApiDraft(s),r=this.getKey(e,t);return n?this.drafts[r]=n:delete this.drafts[r],g.a.set({drafts:this.drafts}),a.notify&&i.default.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:n,force:a.force}),n}draftsAreEqual(e,t){if(typeof e!=typeof t)return!1;if(!Object(u.a)(e))return!0;if(e._!==t._)return!1;if("draftMessage"===e._&&t._===e._){if(e.reply_to_msg_id!==t.reply_to_msg_id)return!1;if(!Object(h.b)(e.entities,t.entities))return!1;if(e.message!==t.message)return!1;if(e.pFlags.no_webpage!==t.pFlags.no_webpage)return!1}return!0}isEmptyDraft(e){return!e||"draftMessageEmpty"===e._||!(e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(!e||"draftMessage"!==e._)return;const t=o.b.parseEntities(e.message),s=e.entities||[],i=o.b.mergeEntities(s.slice(),t);return e.rMessage=o.b.wrapDraftText(e.message,{entities:i}),e.reply_to_msg_id&&(e.reply_to_msg_id=f.a.generateMessageId(e.reply_to_msg_id)),e}syncDraft(e,t,s,i=!0,r=!1){return m(this,void 0,void 0,(function*(){const o=this.getDraft(e,t);if(this.draftsAreEqual(o,s))return!0;let h,u={peer:a.a.getInputPeerById(e),message:""};if(this.isEmptyDraft(s))h={_:"draftMessageEmpty"};else{let e=s.message,t=s.entities;s.reply_to_msg_id&&(u.reply_to_msg_id=f.a.getServerMessageId(s.reply_to_msg_id)),(null==t?void 0:t.length)&&(u.entities=n.a.getInputEntities(t)),s.pFlags.no_webpage&&(u.no_webpage=s.pFlags.no_webpage),u.message=e}const p=h||s;return p.date=Object(c.g)(!0)+d.a.serverTimeOffset,this.saveDraft(e,t,p,{notify:!0,force:r}),!(i&&!t)||l.a.invokeApi("messages.saveDraft",u)}))}clearAllDrafts(){return l.a.invokeApi("messages.clearAllDrafts").then(e=>{if(e)for(const e in this.drafts){const[t,s]=e.split("_");i.default.dispatchEvent("draft_updated",{peerId:t.toPeerId(),threadId:s?+s:void 0,draft:void 0})}})}clearDraft(e,t){t?this.syncDraft(e,t):this.saveDraft(e,t,null,{notify:!0,force:!0})}setDraft(e,t,s,i){const a={_:"draftMessage",date:Date.now()/1e3|0,message:s,pFlags:{},entities:i};t?this.syncDraft(e,t,a,!1,!0):this.saveDraft(e,t,a,{notify:!0,force:!0})}};p.a.appDraftsManager=v,t.a=v},function(e,t,s){"use strict";var i=s(98),a=s(36),n=s(60),r=s(45),o=s(31),d=s(15),l=s(73),c=s(44),h=s(53),u=s(39);const p=new class{constructor(){this.savedAvatarURLs={}}isAvatarCached(e){return!!this.savedAvatarURLs[e]}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,s){const i=c.a.getInputPeerById(e);let a,n=!1,r=this.savedAvatarURLs[e];if(r&&r[s])"string"!=typeof r[s]?a=r[s]:(a=Promise.resolve(r[s]),n=!0);else{r||(r=this.savedAvatarURLs[e]={});const n={_:"inputPeerPhotoFileLocation",pFlags:{},peer:i,photo_id:t.photo_id};"photo_big"===s&&(n.pFlags.big=!0);const o={dcId:t.dc_id,location:n},d=l.a.download(o);a=r[s]=d.then(e=>r[s]=URL.createObjectURL(e))}return{cached:n,loadPromise:a}}putAvatar(e,t,s,r,o=new Image,l=!1){let c,u,p,{cached:g,loadPromise:f}=this.loadAvatar(t,s,r);if(o.classList.add("avatar-photo"),g)u=()=>{Object(a.a)(e,o),e.dataset.color=""};else{const l=d.default.settings.animationsEnabled;if(l&&o.classList.add("fade-in"),"photo_big"===r){const i=this.putAvatar(e,t,s,"photo_small");c=i.loadPromise,p=i.thumbImage}else if(s.stripped_thumb){p=new Image,e.classList.add("avatar-relative"),p.classList.add("avatar-photo","avatar-photo-thumbnail");const t=h.a.getPreviewURLFromBytes(s.stripped_thumb);c=Object(i.b)(p,t).then(()=>{Object(a.a)(e,p)})}u=()=>{p?e.append(o):Object(a.a)(e,o),setTimeout(()=>{e.childElementCount&&n.a.mutateElement(o,()=>{e.dataset.color="",l&&o.classList.remove("fade-in"),p&&p.remove()})},l?200:0)}}const m=f.then(e=>Object(i.b)(o,e)).then(u);return{cached:g,loadPromise:c||m,thumbImage:p}}s(e,t,s,i){e.innerHTML=t,e.dataset.color=s,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled"),i&&e.classList.add(i)}putPhoto(e,t,s=!1,i="",a=!1){var n;const l=d.default.myId;if(t===l&&s)return void this.s(e,"","","tgico-saved");if(t!==r.b&&t.isUser()){const s=u.a.getUser(t);if(s&&s.pFlags&&s.pFlags.deleted)return void this.s(e,"",c.a.getPeerColorById(t),"tgico-deletedaccount")}const h=c.a.getPeerPhoto(t),p=!!h,g=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!p||!g||!this.savedAvatarURLs[t]){let a,d="";if(!t||t===l&&s||(d=c.a.getPeerColorById(t)),t===r.c)return void this.s(e,"",d,"tgico-reply_filled");if(i)a=o.b.getAbbreviation(i);else{a=null!==(n=c.a.getPeer(t).initials)&&void 0!==n?n:""}this.s(e,a,d,"")}if(p){const s="photo_small";return this.putAvatar(e,t,h,s,void 0,a)}}};t.a=p},function(e,t,s){"use strict";var i;!function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_BY_ADMIN=2]="MUTED_BY_ADMIN",e[e.CONNECTING=3]="CONNECTING",e[e.CLOSED=4]="CLOSED"}(i||(i={})),t.a=i},,,,,,,,,function(e,t,s){"use strict";s.d(t,"a",(function(){return r})),s.d(t,"b",(function(){return d})),s.d(t,"c",(function(){return l}));var i=s(133);const a=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,n=/^\s+|\s$/g;function r(e){return e.replace(a,"").replace(n,"")}function o(e){return e.replace(/[^A-Za-z0-9]/g,e=>{const t=i.a.LatinizeMap[e];return void 0!==t?t:e})}function d(e,t=!0){const s="%"===e.charAt(0);return e=r(e),t&&(e=o(e)),e=e.toLowerCase(),s&&(e="%"+e),e}function l(e,t={}){const s=t.includeTag&&"%"===e.charAt(0);return t.clearBadChars&&(e=r(e)),t.latinize&&(e=o(e)),t.ignoreCase&&(e=e.toLowerCase()),s&&(e="%"+e),e}},function(e,t,s){"use strict";s.d(t,"a",(function(){return i})),s.d(t,"b",(function(){return n}));var i,a=s(29);!function(e){e[e.None=0]="None",e[e.Top=1]="Top",e[e.Bottom=2]="Bottom",e[e.Both=3]="Both"}(i||(i={}));class n{constructor(){this.sliceConstructor=n.getSliceConstructor(this);const e=this.constructSlice();this.slices=[e]}static getSliceConstructor(e){return class extends Array{constructor(){super(...arguments),this.end=i.None}isEnd(t){if((this.end&t)===t)return!0;let s=!1;if(t===i.Top){const i=e.last;s=!!(i.end&t)&&this.includes(i[i.length-1])}else if(t===i.Bottom){const i=e.first;s=!!(i.end&t)&&this.includes(i[0])}else if(t===i.Both)return this.isEnd(i.Top)&&this.isEnd(i.Bottom);return s&&this.setEnd(t),s}setEnd(e){this.end|=e}unsetEnd(e){this.end^=e}splice(t,s,...a){const n=super.splice(t,s,...a);if(!this.length){const t=e.slices,s=t.indexOf(this);-1!==s&&(1===t.length?this.unsetEnd(i.Both):t.splice(s,1))}return n}}}constructSlice(...e){const t=new this.sliceConstructor(e.length);for(let s=0,i=e.length;ss[0])break}this.slices.splice(t,0,this.constructSlice(...e)),d=t}return t?this.flatten(d):void 0}flatten(e){if(this.slices.length>=2)for(let t=0,s=this.slices.length;t=t[i])return{slice:t,offset:e===t[i]?i:i-1}}if(t&&t.isEnd(i.Top))return{slice:t,offset:t.length}}sliceMe(e,t,s){let a=this.slice,n=0,r=0;if(e){const t=this.findSliceOffset(e);if(!t)return;a=t.slice,n=r=t.offset,a.includes(e)&&(r+=1)}let o=Math.max(r+t,0),d=r+t+s;const l=a.slice(o,d),c=t<0?s+t:s,h=Math.abs(t),u=a.length-r>=c||!!a.isEnd(i.Top)&&(l.setEnd(i.Top),!0),p=r-h>=0||!!a.isEnd(i.Bottom)&&(l.setEnd(i.Bottom),!0);return{slice:l,offsetIdOffset:n,fulfilled:i.None|(u&&p?i.Both:(u?i.Top:i.None)|(p?i.Bottom:i.None))}}unshift(...e){let t=this.first;t.length?t.isEnd(i.Bottom)||(t=this.constructSlice(),t.setEnd(i.Bottom),this.slices.unshift(t)):t.setEnd(i.Bottom),t.unshift(...e)}push(...e){let t=this.last;t.length?t.isEnd(i.Top)||(t=this.constructSlice(),t.setEnd(i.Top),this.slices.push(t)):t.setEnd(i.Top),t.push(...e)}delete(e){const t=this.findSlice(e);return!!t&&(t.slice.splice(t.index,1),!0)}}a.a&&(a.a.SlicedArray=n)},function(e,t,s){"use strict";var i=s(29),a=s(32),n=s(43),r=s(33),o=s(31),d=s(15),l=s(74),c=s(102),h=s(40),u=s(44),p=s(39);const g=new class{constructor(){this.polls={},this.results={},this.pollToMessages={},this.log=Object(n.b)("POLLS",n.a.Error),d.default.addMultipleEventsListeners({updateMessagePoll:e=>{this.log("updateMessagePoll:",e);let t=e.poll||this.polls[e.poll_id];if(!t)return;let s=e.results;const i=this.savePoll(t,s);t=i.poll,s=i.results,d.default.dispatchEvent("poll_update",{poll:t,results:s})}})}savePoll(e,t,s){s&&this.updatePollToMessage(s,!0);const i=e.id;return this.polls[i]?(e=Object.assign(this.polls[i],e),t=this.saveResults(e,t)):(this.polls[i]=e,e.rQuestion=o.a.wrapEmojiText(e.question),e.rReply=o.a.wrapEmojiText("📊")+" "+(e.rQuestion||"poll"),e.chosenIndexes=[],t=this.saveResults(e,t)),{poll:e,results:t}}saveResults(e,t){var s;return this.results[e.id]?t=Object.assign(this.results[e.id],t):this.results[e.id]=t,t.pFlags.min||(e.chosenIndexes.length=0,(null===(s=null==t?void 0:t.results)||void 0===s?void 0:s.length)&&t.results.forEach((t,s)=>{var i;(null===(i=t.pFlags)||void 0===i?void 0:i.chosen)&&e.chosenIndexes.push(s)})),t}getPoll(e){return{poll:this.polls[e],results:this.results[e]}}getInputMediaPoll(e,t,s,i){return s?(i||(i=[]),s=o.a.parseMarkdown(s,i)):s=void 0,{_:"inputMediaPoll",poll:e,correct_answers:t,solution:s,solution_entities:s?i:void 0}}updatePollToMessage(e,t){const{id:s}=e.media.poll;let i=this.pollToMessages[s];if(!t&&!i)return;i||(i=this.pollToMessages[s]=new Set);const a=e.peerId+"_"+e.mid;t?i.add(a):i.delete(a),t||i.size||(delete this.polls[s],delete this.results[s],delete this.pollToMessages[s])}sendVote(e,t){const s=e.media.poll,i=t.map(e=>s.answers[e].option),a=e.mid,n=e.peerId,o=u.a.getInputPeerById(n);return e.pFlags.is_outgoing?h.a.invokeAfterMessageIsSent(a,"sendVote",e=>(this.log("invoke sendVote callback"),this.sendVote(e,t))):r.a.invokeApi("messages.sendVote",{peer:o,msg_id:c.a.getServerMessageId(e.mid),options:i}).then(e=>{this.log("sendVote updates:",e),l.a.processUpdateMessage(e)})}getResults(e){const t=u.a.getInputPeerById(e.peerId);return r.a.invokeApi("messages.getPollResults",{peer:t,msg_id:c.a.getServerMessageId(e.mid)}).then(e=>{l.a.processUpdateMessage(e),this.log("getResults updates:",e)})}getVotes(e,t,s,i=20){return r.a.invokeApi("messages.getPollVotes",{peer:u.a.getInputPeerById(e.peerId),id:c.a.getServerMessageId(e.mid),option:t,offset:s,limit:i}).then(e=>(this.log("getPollVotes messages:",e),p.a.saveApiUsers(e.users),e))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const s=Object(a.a)(t);return s.pFlags.closed=!0,h.a.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(s)}).then(()=>{},e=>{this.log.error("stopPoll error:",e)})}};i.a.appPollsManager=g,t.a=g},function(e,t,s){"use strict";s.d(t,"a",(function(){return f}));var i=s(46),a=s(83),n=s(42),r=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const o=[];let d=!1;function l(e,t="push"){return e.items.length?(e.promise=Object(i.a)(),o[t](e),function e(){if(!d){(function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),s=[];return new Promise((i,o)=>{const d=()=>r(this,void 0,void 0,(function*(){const r=performance.now();do{yield Object(a.c)();const i=e.process.apply(e.context,t.shift());let n;if(i instanceof Promise)try{n=yield i}catch(e){return void o(e)}else n=i;s.push(n)}while(t.length>0&&performance.now()-r<6);t.length>0?Object(n.b)(d):i(s)}));Object(n.b)(d)}).then(e.promise.resolve,e.promise.reject)})(o.shift()).finally(()=>{d=!1,o.length&&e()})}}(),e.promise):Promise.resolve([])}const c="filter"in(document.createElement("canvas").getContext("2d")||{});let h,u;function p(e,t,s){return new Promise(i=>{const a=document.createElement("canvas");a.width=e.width,a.height=e.height;const n=a.getContext("2d",{alpha:!1});c?(n.filter=`blur(${t}px)`,n.drawImage(e,2*-t,2*-t,a.width+4*t,a.height+4*t)):(n.drawImage(e,0,0),u(n,0,0,a.width,a.height,t,s)),i(a.toDataURL())})}h=c?Promise.resolve():s.e(31).then(s.bind(null,155)).then(e=>{u=e.default});const g=new Map;function f(e,t=2,s=2){if(!e)return console.error("no dataUri for blur",e),Promise.resolve(e);if(g.size>1e3&&g.clear(),g.has(e))return g.get(e);const i=new Promise(i=>{h.then(()=>{const a=new Image;a.onload=()=>{c?p(a,t,s).then(i):l({items:[[a,t,s]],context:null,process:p},"unshift").then(e=>{i(e[0])})},a.src=e})});return g.set(e,i),i}},,,,,function(e,t,s){"use strict";var i=s(40),a=s(76),n=s(32),r=s(29),o=s(33),d=s(109),l=s(43);const c=new class{constructor(){this.contexts=new Map,this.links={},this.log=Object(l.b)("RD",void 0,!0),o.a.addTaskListener("refreshReference",e=>{const t=e.payload;Object(d.a)(e),e.originalPayload=t,this.refreshReference(t).then(t=>{e.payload=t},t=>{e.error=t}).then(()=>o.a.postMessage(e))})}saveContext(e,t,s){[s,e]=this.getContexts(e),s||(s=new Set,this.contexts.set(e,s)),this.links[Object(a.e)(e)]=e;for(const e of s)if(Object(n.b)(e,t))return;s.add(t)}getReferenceByLink(e){return this.links[Object(a.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,s){if([s,e]=this.getContexts(e),s)for(const i of s)if(Object(n.b)(i,t))return s.delete(i),s.size||(this.contexts.delete(e),delete this.links[Object(a.e)(e)]),!0;return!1}refreshReference(e,t){if(this.log("refreshReference: start",e.slice(),t),!t){const s=this.getContext(e);if(!s)return this.log("refreshReference: got no context for reference:",e.slice()),Promise.reject("NO_CONTEXT");[t,e]=s}let s;switch(null==t?void 0:t.type){case"message":s=i.a.wrapSingleMessage(t.peerId,t.messageId,!0);break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const n=Object(a.e)(e);return this.log("refreshReference: refreshing reference:",n),s.then(()=>{const s=Object(a.e)(e);if(this.log("refreshReference: refreshed, reference before:",n,"after:",s),n!==s)return e;this.deleteContext(e,t);const i=this.getContext(e);if(i)return this.refreshReference(e,i[0]);throw this.log.error("refreshReference: no new context, reference before:",n,"after:",s,t),"NO_NEW_CONTEXT"})}};r.a.referenceDatabase=c,t.a=c},function(e,t,s){"use strict";function i(e){var t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}s.d(t,"a",(function(){return i}))},function(e,t,s){"use strict";var i=s(29);var a=s(0),n=s(41),r=s(52),o=s(32),d=s(65),l=s(105),c=s(132);var h=s(118);var u,p,g=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},f=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class m{constructor(e,t){u.set(this,void 0),p.set(this,void 0),g(this,u,e,"f"),g(this,p,t,"f")}get session(){return f(this,u,"f")}get media(){return f(this,p,"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 v(e,t,s){const i=e.split(t),a=[];for(;s>0&&i.length;)a.push(i.shift()),--s;return i.length&&a.push(i.join(t)),a}u=new WeakMap,p=new WeakMap;var _,y,I,M=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},P=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class S{constructor(e,t){_.set(this,void 0),y.set(this,void 0),I.set(this,void 0),M(this,_,new Set,"f"),M(this,y,e,"f"),M(this,I,t,"f")}generate(){const e=P(this,y,"f"),t=P(this,I,"f"),s=P(this,_,"f"),i=t-e+1;let a=Math.floor(e+i*Math.random()),n=0;for(;s.has(a);)if(a=i)return null;return s.add(a),a}add(e){P(this,_,"f").add(e)}}_=new WeakMap,y=new WeakMap,I=new WeakMap;var b,w,C=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},E=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class k{constructor(e,t){b.set(this,void 0),w.set(this,void 0),C(this,b,e,"f"),C(this,w,t,"f")}get key(){return E(this,b,"f")}get value(){return E(this,w,"f")}}b=new WeakMap,w=new WeakMap;var D,A,U,T,F=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},x=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class O{constructor(e,t,s,i){D.set(this,void 0),A.set(this,void 0),U.set(this,void 0),T.set(this,void 0),F(this,D,e,"f"),F(this,A,t,"f"),F(this,U,s,"f"),F(this,T,i,"f")}get type(){return x(this,D,"f")}get port(){return x(this,A,"f")}get protocol(){return x(this,U,"f")}get ids(){return x(this,T,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}D=new WeakMap,A=new WeakMap,U=new WeakMap,T=new WeakMap;var L,j,B,R,N=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},H=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class G{constructor(e,t){if(L.set(this,void 0),j.set(this,void 0),B.set(this,void 0),R.set(this,void 0),N(this,L,e,"f"),"string"==typeof t){if(N(this,j,t,"f"),"m"===e){const e=t.split(" ");N(this,B,new O(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=v(t,":",1);t=e[0],N(this,R,1===e.length?new k(t,null):new k(t,e[1]),"f")}}else t instanceof O?(N(this,B,t,"f"),N(this,j,t.toString(),"f")):t instanceof k&&(N(this,R,t,"f"),N(this,j,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return H(this,L,"f")}get value(){return H(this,j,"f")}get parsed(){return H(this,R,"f")}get mediaLineParts(){return H(this,B,"f")}toString(){return`${this.key}=${this.value}`}}L=new WeakMap,j=new WeakMap,B=new WeakMap,R=new WeakMap;var z,W,q,V,$,K,Q=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},J=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class Y{constructor(e,t,s=":",i=!1){z.set(this,void 0),W.set(this,void 0),q.set(this,void 0),V.set(this,void 0),$.set(this,void 0),K.set(this,void 0),Q(this,z,e,"f"),Q(this,W,t,"f"),Q(this,q,s,"f"),Q(this,$,i,"f"),Q(this,V,i?new Map:null,"f"),Q(this,K,i?[]:null,"f")}get lines(){return J(this,W,"f")}get value(){return J(this,$,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!J(this,$,"f")}get key(){return J(this,z,"f")}get keys(){return Y.fill(this),J(this,K,"f")}forEach(e){Y.fill(this),J(this,V,"f").forEach(e)}get(e){return Y.fill(this),J(this,V,"f").get(e)||new Y(e,[],":",!0)}static fill(e){if(null!==J(e,V,"f"))return;const t=new Map;e.lines.forEach(s=>{const[i,a]=v(s,J(e,q,"f"),1),n=t.get(i)||[];t.set(i,[...n,a||""])});const s=Q(e,V,Y.makeAttributes(t),"f");Q(e,K,Array.from(s.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach((e,s)=>{t.set(s,new Y(s,e))}),t}}z=new WeakMap,W=new WeakMap,q=new WeakMap,V=new WeakMap,$=new WeakMap,K=new WeakMap;var Z,X,ee=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},te=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class se{constructor(e){Z.set(this,void 0),X.set(this,void 0),ee(this,Z,e,"f"),ee(this,X,new Map,"f"),se.fillAttributes(this)}get(e){return te(this,X,"f").get(e)||new Y(e,[]," ",!0)}static fillAttributes(e){const t=new Map;te(e,Z,"f").forEach(e=>{if("a"===e.key){const{key:s,value:i}=e.parsed;let a=t.get(s);a||(a=[],t.set(s,a)),a.push(i||"")}}),t.forEach((t,s)=>{te(e,X,"f").set(s,new Y(s,t," ",!1))})}}Z=new WeakMap,X=new WeakMap;var ie,ae,ne,re,oe=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},de=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class le{constructor(e){ie.set(this,void 0),ae.set(this,void 0),ne.set(this,void 0),re.set(this,void 0),oe(this,ie,e,"f"),oe(this,ae,e[0],"f"),oe(this,ne,oe(this,re,null,"f"),"f")}get lines(){return de(this,ie,"f")}get mediaLine(){return de(this,ae,"f")}get mediaLineParts(){return de(this,ae,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!de(this,re,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",oe(this,re,t,"f")}return de(this,re,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return de(this,ne,"f")||oe(this,ne,new se(this.lines),"f"),de(this,ne,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const s in e){const i=this.attributes.get(s),a=!e[s];t[s]=i?a?i.lines:i.value:a?[]:void 0}return t}}ie=new WeakMap,ae=new WeakMap,ne=new WeakMap,re=new WeakMap;var ce,he,ue=function(e,t,s,i,a){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!a)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?a.call(e,s):a?a.value=s:t.set(e,s),s},pe=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)};class ge{constructor(e){ce.set(this,void 0),he.set(this,void 0),ue(this,ce,e,"f"),ue(this,he,e.filter(e=>"o"===e.key).map(e=>e.value.split(" ")[1])[0],"f")}get lines(){return pe(this,ce,"f")}get sessionId(){return pe(this,he,"f")}}function fe(e){function t(){s?i.push(new le(a)):s=new ge(a)}let s=null,i=[],a=[];return e.split(/\r?\n/).forEach(e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const s=me(e);"m"===s.key&&(t(),a=[]),a.push(s)}}),t(),new m(s,i)}function me(e){const t=v(e,"=",1);return new G(t[0],t[1])}ce=new WeakMap,he=new WeakMap;var ve=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};function _e(e,t){return ve(this,void 0,void 0,(function*(){const s=yield navigator.mediaDevices.getUserMedia(e);return s.getTracks().forEach(e=>{e.enabled=!t}),s}))}function ye(e){return e<<0}function Ie(e){return e>>>0}function Me(e,t){const s=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!s.fingerprint){const t=e.session.lines.find(e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)});s.fingerprint=t.parsed.value}const i=function(e){const t=e.map(e=>{const[t,...s]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:s.map(e=>ye(+e))}});return t.length?t:void 0}(s["ssrc-group"]),[a,n]=s.fingerprint.split(" ",2),r=s.ssrc&&ye(+s.ssrc.split(" ",1)[0]);return{raw:s,ufrag:s["ice-ufrag"],pwd:s["ice-pwd"],fingerprint:{fingerprint:n,setup:s.setup,hash:a},source:r,sourceGroups:i,mid:s.mid}}function Pe(e){const{offer:t,data:s}=e,i=fe(t.sdp);let a=!1;if(a=function(e){let t;return e.media.forEach((s,i)=>{if("video"===s.mediaType&&s.isSending&&!s.attributes.get("ssrc-group").get("SIM").exists){t||(t=new S(2,4294967295));const a=s.attributes.get("ssrc-group").get("FID").value.split(" "),n=s.lines;a.forEach(e=>t.add(+e));const r=[a[0],t.generate(),t.generate()],o=[a[1],t.generate(),t.generate()];n.push(me("a=ssrc-group:SIM "+r.join(" ")));const d=s.attributes.get("ssrc").get(a[0]).lines;r.forEach((e,t)=>{const s=o[t];t>0&&(n.push(me("a=ssrc-group:FID "+e+" "+s)),d.forEach(t=>{n.push(me("a=ssrc:"+e+" "+t))}),d.forEach(e=>{n.push(me("a=ssrc:"+s+" "+e))}))}),e.media[i]=new le(n)}}),!!t}(i)||a,Object(n.d)(i.media,(e,t,n)=>{if(e.isSending)return;if("application"===e.mediaType)return;const r=e.mediaLine,d=r.mediaLineParts,l=r.toString(),c=s[e.mediaType]["payload-types"].map(e=>""+e.id);if(l!==be(e.mediaType,void 0,c)){const r=Me(i,e);let l=Object.assign({},s);l.transport=Object(o.a)(l.transport),l.transport.ufrag=r.ufrag,l.transport.pwd=r.pwd,l.transport.fingerprints=[r.fingerprint],l.transport.candidates=[];const c=new Ce(r.mid,d.type);c.setPort(d.port),r.source&&c.setSource(r.sourceGroups||r.source),c.setDirection(e.direction);const h=fe((new we).addSsrcEntry(c,l).finalize()).media[0];n[t]=h,a=!0}}),a){const e=i.toString();t.sdp=e}return{offer:t,sdp:i}}function Se(e){return"application"===e?"DTLS/SCTP":"RTP/SAVPF"}function be(e,t="9",s){return`m=${e} ${t} ${Se(e)} ${s.join(" ")}`}class we extends class{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}}{addCandidate(e){return this.add(function(e){const t=[];return t.push("a=candidate:"),t.push(`${e.foundation} ${e.component} ${e.protocol.toUpperCase()} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`),void 0!==e["rel-addr"]&&t.push(` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t.push(" generation "+e.generation),t.join("")}(e))}addHeader(e,t){const s=t.join(" ");return this.add("v=0",`o=- ${e} 2 IN IP4 0.0.0.0`,"s=-","t=0 0","a=extmap-allow-mixed","a=group:BUNDLE "+s,"a=ice-options:trickle","a=ice-lite","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)for(const t of e.candidates)this.addCandidate(t);return this}addSsrc(e){let t="stream",{type:s,sourceGroups:i}=e;const a=Ie(e.source);t+=a,s+=a;const n=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${s}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${s}`)};return(()=>{this.add(`a=msid:${t} ${s}`)})(),(null==i?void 0:i.length)?i.forEach(e=>{if(e.sources.length){const t=e.sources.map(Ie);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(n)}}):n(a),this}addSsrcEntry(e,t,s){const i=(...e)=>this.add(...e),{type:a,mid:n,direction:r,port:o}=e,d=t.transport,l="application"===a,c=l?void 0:t[a],h="inactive"===r;if(e.shouldBeSkipped(s))return i(`m=${a} 0 ${Se(a)} 0`,"c=IN IP4 0.0.0.0","a=inactive","a=mid:"+n);const u=l?[{id:5e3}]:c["payload-types"],p=u.map(e=>e.id);i(be(a,o,p),"c=IN IP4 0.0.0.0",`a=rtcp:${o} IN IP4 0.0.0.0`),d["rtcp-mux"]&&i("a=rtcp-mux"),i("a=mid:"+n);let g=r;if(!s||h||l||(g="sendonly"===r?"recvonly":"sendonly"),i("a="+g),this.addTransport(d),l)i(`a=sctpmap:${u[0].id} webrtc-datachannel 256`);else{const e=c["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach(e=>{i(`a=extmap:${e.id} ${e.uri}`)}),u.forEach(e=>{i(`a=rtpmap:${e.id} ${e.name}/${e.clockrate}${e.channels&&e.channels>1?"/"+e.channels:""}`);const t=e.parameters;if(Array.isArray(t))t.length&&console.error("parameters is array???",t);else if(t&&Object.keys(t).length){const s=[];for(const e in t)s.push(`${e}=${t[e]}`);i(`a=fmtp:${e.id} ${s.join(";")}`)}const s=e["rtcp-fbs"];(null==s?void 0:s.length)&&s.forEach(t=>{i(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)})})}return!e.source||"sendonly"!==g&&"sendrecv"!==g||this.addSsrc(e),this}addConference(e){const{conference:t,entries:s,bundle:i,isAnswer:n}=e;this.addHeader(t.sessionId,i),a.IS_FIREFOX&&this.addTransport(t.transport);for(const e of s)this.addSsrcEntry(e,t,n);return this}static fromConference(e){return(new we).addConference(e).finalize()}}class Ce{constructor(e,t){this.mid=e,this.type=t,this.port="9"}setDirection(e){return this.originalDirection||(this.originalDirection=e),this.direction=e}setPort(e){return this.port=e}setEndpoint(e){return this.endpoint=e}setPeerId(e){return this.peerId=e}createTransceiver(e,t){return(null==t?void 0:t.direction)&&this.setDirection(t.direction),this.transceiver=e.addTransceiver(this.type,t)}setSource(e){let t;return Array.isArray(e)&&(t=e,e=t[0].sources[0]),this.sourceGroups=t,this.source=e}shouldBeSkipped(e){return e&&"inactive"===this.direction}}class Ee{constructor(e){this.connection=e,this.sessionId=""+Date.now(),this.maxSeenId=-1,this.entries=[],this.entriesByMid=new Map,this.entriesBySource=new Map,this.entriesByPeerId=new Map}setData(e){return Object(o.g)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,s=new Ce(t,e);return this.entries.push(s),this.entriesByMid.set(t,s),s}deleteEntry(e){Object(n.e)(this.entries,e),this.entriesByMid.delete(e.mid),this.entriesBySource.delete(e.source);const t=this.entriesByPeerId.get(e.peerId);t&&(t.delete(e),t.size||this.entriesByPeerId.delete(e.peerId))}setEntrySource(e,t){e.setSource(t),this.entriesBySource.set(e.source,e)}setEntryPeerId(e,t){e.setPeerId(t);let s=this.entriesByPeerId.get(t);s||this.entriesByPeerId.set(t,s=new Set),s.add(e)}findEntry(e){return this.entries.find(e)}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return we.fromConference(Object.assign({conference:this},e))}}var ke=s(43),De=s(15);class Ae{constructor(e,t){const s=this.streamSource=e.createMediaStreamSource(t),i=this.analyser=e.createAnalyser();this.gain=e.createGain();i.minDecibels=-100,i.maxDecibels=-30,i.smoothingTimeConstant=.05,i.fftSize=1024,s.connect(i)}}class Ue{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:s,track:i,source:a,type:n}=e,r=t.analyser;if(!r)return;const o=new Uint8Array(r.frequencyBinCount);r.getByteFrequencyData(o);return{type:n,source:a,stream:s,track:i,value:function(e,t=3){if(!e)return 0;const{length:s}=e;let i=0;for(let t=0;t{const e=this.counter%3==0,t=(e?this.items:this.items.filter(e=>"input"===e.type)).filter(e=>"audio"===e.kind).slice(0,50).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),De.default.dispatchEvent("group_call_amplitude",{amplitudes:t,type:e?"all":"input"})},this.context=new(window.AudioContext||window.webkitAudioContext),this.items=[],this.outputStream=new MediaStream,this.counter=0,this.log=Object(ke.b)("SM")}addStream(e,t){e.getTracks().forEach(s=>{this.addTrack(e,s,t)})}addTrack(e,t,s){this.log("addTrack",s,t,e);const{context:i,items:a,inputStream:n,outputStream:r}=this,o=t.kind,d=Ue.getSource(e,s);switch(s){case"input":n?n.addTrack(t):this.inputStream=e;break;case"output":for(let e=0;e{this.removeTrack(t)},{once:!0}),this.items.push(e)}hasInputTrackKind(e){return this.items.find(t=>"input"===t.type&&t.kind===e)}static getSource(e,t){return"input"===t?e.source||e.id:""+ye(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let s=!1;for(let i=0,a=t.length;!s&&i"sendonly"===e.direction&&e.type===t);s||(s=e.createEntry(t),s.createTransceiver(e.connection,a));const n=i.find(e=>e.kind===t),r=s.transceiver.sender;if(r.track!==n)try{r.replaceTrack(n)}catch(e){this.log.error(e)}}}}var Te=s(33),Fe=s(45),xe=s(74),Oe=s(48),Le=s(44),je=s(39),Be=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};class Re{constructor(e){Object(o.g)(this,e),this.log||(this.log=Object(ke.b)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map);const t=this.player=document.createElement("div");t.classList.add("group-call-player"),t.style.display="none",t.dataset.groupCallId=""+this.id,document.body.append(t),this.elements=new Map,this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=Object(l.a)(()=>{De.default.dispatchEvent("group_call_pinned",{instance:this,source:this.pinnedSource})},0,!1)}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return h.a.CLOSED;if("connected"===e||a.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?h.a.MUTED:h.a.UNMUTED:h.a.MUTED_BY_ADMIN}return h.a.CONNECTING}get participants(){return He.getCachedParticipants(this.id)}get isSharingAudio(){return!!this.connections.main.streamManager.hasInputTrackKind("audio")}get isSharingScreen(){return!!this.connections.presentation}get isSharingVideo(){return!!this.connections.main.streamManager.hasInputTrackKind("video")}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}pinSource(e){Object(n.e)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),Object(n.e)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return Fe.b===e?this.participant:this.participants.get(e)}toggleMuted(){return He.toggleMuted()}getElement(e){return this.elements.get(""+e)}getVideoElementFromParticipantByType(e,t){let s;if(e.pFlags.self){s="video"===t?"main":"presentation"}else{s=e[t].source_groups[0].sources[0]}const i=this.getElement(s);if(!i)return;const a=i.cloneNode();return a.srcObject=i.srcObject,a.setAttribute("playsinline","true"),a.muted=!0,{video:a,source:s}}createConnectionInstance(e){return this.connections[e.type]=new Ne(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type)},e))}changeRaiseHand(e){return He.editParticipant(this.id,this.participant,{raiseHand:e})}startScreenSharingInternal(){return Be(this,void 0,void 0,(function*(){try{const e="presentation",t=yield function(){return Be(this,void 0,void 0,(function*(){return yield navigator.mediaDevices.getDisplayMedia({video:{width:{max:1920},height:{max:1080},frameRate:{max:30}},audio:!0})}))}(),s=new Ue,i=this.createConnectionInstance({streamManager:s,type:e,options:{type:e}});i.createPeerConnection().addEventListener("negotiationneeded",()=>{i.negotiate()}),t.getVideoTracks()[0].addEventListener("ended",()=>{this.connections.presentation&&this.stopScreenSharing()},{once:!0}),i.createDescription(),i.addInputVideoStream(t)}catch(e){this.log.error("start screen sharing error",e)}}))}startScreenSharing(){return this.startScreenSharingPromise||(this.startScreenSharingPromise=this.startScreenSharingInternal().finally(()=>{this.startScreenSharingPromise=void 0}))}stopScreenSharing(){const e=this.connections.presentation;return e?(delete this.connections.presentation,this.unpinSource("presentation"),e.closeConnectionAndStream(!0),delete this.participant.presentation,He.saveApiParticipant(this.id,this.participant),Te.a.invokeApi("phone.leaveGroupCallPresentation",{call:He.getGroupCallInput(this.id)}).then(e=>{xe.a.processUpdateMessage(e)})):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return Be(this,void 0,void 0,(function*(){const e={video:He.getVideoConstraints()};try{const t=yield _e(e,!1);this.connections.main.addInputVideoStream(t),yield He.editParticipant(this.id,this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){return this.startVideoSharingPromise||(this.startVideoSharingPromise=this.startVideoSharingInternal().finally(()=>{this.startVideoSharingPromise=void 0}))}stopVideoSharing(){return Be(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&(e.stopTrack(t),e.streamManager.appendToConference(e.description),yield He.editParticipant(this.id,this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,s=!1){return Be(this,void 0,void 0,(function*(){for(const e in this.connections){this.connections[e].closeConnectionAndStream(!t)}if(De.default.dispatchEvent("group_call_state",this),this.player.textContent="",this.player.remove(),!s&&!t){let t;const s=He.getGroupCallInput(this.id);if(e)this.log("[api] discardGroupCall id="+this.id),t=Te.a.invokeApi("phone.discardGroupCall",{call:s});else if(this.joined){this.log("[api] leaveGroupCall id="+this.id);const e=this.connections.main;t=Te.a.invokeApi("phone.leaveGroupCall",{call:s,source:e.sources.audio.source})}else this.log(`[api] id=${this.id} payload=null`),t=Te.a.invokeApi("phone.joinGroupCall",{call:s,join_as:{_:"inputPeerSelf"},muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}});const i=yield t;xe.a.processUpdateMessage(i)}}))}onTrack(e){this.tryAddTrack(e.streams[0],e.track,"output")}saveInputVideoStream(e,t){const s=e.getVideoTracks()[0];this.tryAddTrack(e,s,"input",t)}tryAddTrack(e,t,s,i=Ue.getSource(e,s)){this.log("tryAddTrack",e,t,s,i);const a="output"===s,{connections:n,player:r,elements:o}=this,{streamManager:d,description:l}=n.main,c=t.kind,h="video"===c,u=h?i:c;let p=o.get(u);h&&t.addEventListener("ended",()=>{this.log("[track] onended"),o.delete(u)},{once:!0}),a&&d.addTrack(e,t,s);const g=h?e:d.outputStream;if(!p){if(p=document.createElement(c),p.autoplay=!0,p.srcObject=g,p.volume=1,"undefined"!==p.sinkId){const{outputDeviceId:e}=this;e&&p.setSinkId(e)}h||r.appendChild(p),o.set(u,p)}if(a){const e=l.getEntryBySource(+i),t=this.participants.get(e.peerId);t&&De.default.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:t})}}setMuted(e){this.connections.main.connection.getSenders().forEach(({track:t})=>{"audio"===(null==t?void 0:t.kind)&&(t.enabled=!e)})}onParticipantUpdate(e,t){const s=this.connections.main,{connection:i,description:a}=s,n=Le.a.getPeerId(e.peer),r=!!e.pFlags.left,o=this.participantsSsrcs.get(n)||[];if(e.presentation&&!r){const{source:t}=He.makeSsrcFromParticipant(e,"video",e.presentation.source_groups,e.presentation.endpoint);this.hadAutoPinnedSources.has(t)||(this.hadAutoPinnedSources.add(t),this.pinSource(e.pFlags.self?"presentation":t))}if(e.pFlags.self){this.participant=e,s.sources.audio.source!==e.source&&this.hangUp();let i=!1;return e.pFlags.can_self_unmute?e.pFlags.muted&&(i=!0):(this.stopScreenSharing(),this.stopVideoSharing(),i=!0),i&&this.setMuted(!0),void(t!==n&&De.default.dispatchEvent("group_call_state",this))}const d=r?[]:He.makeSsrcsFromParticipant(e);r?this.participantsSsrcs.delete(n):this.participantsSsrcs.set(n,d);const l=new Set;o.forEach(e=>{const t=e.source;if(!d.find(e=>e.source===t)){this.unpinSource(t);const e=a.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),l.add(e.type))}}),d.forEach(e=>{let t=a.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),l.add(t.type)):(t=a.createEntry(e.type),a.setEntrySource(t,e.sourceGroups||e.source),a.setEntryPeerId(t,n),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(i,{direction:"recvonly"}),l.add(t.type))}),l.size&&(l.has("video")&&(s.updateConstraints=!0),s.negotiateThrottled())}}class Ne{constructor(e){var t;Object(o.g)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||Object(ke.b)("GC-CONNECTION")),this.sources={},this.negotiateThrottled=Object(l.a)(this.negotiate.bind(this),0,!1)}createPeerConnection(){return this.connection||(this.connection=function(e){e||(e=Object(ke.b)("RTCPeerConnection")),e("constructor");const t=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",iceCandidatePoolSize:0});return t.addEventListener("track",t=>{e("ontrack",t)}),t.addEventListener("signalingstatechange",()=>{e("onsignalingstatechange",t.signalingState)}),t.addEventListener("connectionstatechange",()=>{e("onconnectionstatechange",t.connectionState)}),t.addEventListener("negotiationneeded",()=>{e("onnegotiationneeded",t.signalingState)}),t.addEventListener("icecandidate",t=>{e("onicecandidate",t)}),t.addEventListener("iceconnectionstatechange",()=>{e("oniceconnectionstatechange",t.iceConnectionState)}),t.addEventListener("datachannel",()=>{e("ondatachannel")}),t.log=e,{connection:t}}(this.log.bindPrefix("connection")).connection)}createDataChannel(){if(this.dataChannel)return this.dataChannel;const e=function(e,t){t||(t=Object(ke.b)("RTCDataChannel"));const s=e.createDataChannel("data",{});return s.addEventListener("message",e=>{t("onmessage",e)}),s.addEventListener("open",()=>{t("onopen")}),s.addEventListener("close",()=>{t("onclose")}),s.log=t,s}(this.connection,this.log.bindPrefix("data"));return e.addEventListener("open",()=>{this.maybeUpdateRemoteVideoConstraints()}),e.addEventListener("close",()=>{this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}),this.dataChannel=e}createDescription(){if(this.description)return this.description;return this.description=new Ee(this.connection)}appendStreamToConference(){this.streamManager.appendToConference(this.description)}invokeJoinGroupCall(e,t,s){return Be(this,void 0,void 0,(function*(){const{groupCall:i,description:a}=this,r=i.id,o=t.map(t=>{const s=function(e,t){const s=Me(e,t),i=t.mediaType,a={source:s.source,sourceGroups:s.sourceGroups,type:i};s.fingerprint.setup="active";const n={fingerprints:[s.fingerprint],pwd:s.pwd,ssrc:s.source,"ssrc-groups":s.sourceGroups||[],ufrag:s.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(n)},source:s.source,media:t,sourceGroups:s.sourceGroups,entry:a}}(e,t);return this.sources[s.entry.type]=s.entry,s});let d;const l=o.find(e=>"audio"===e.media.mediaType),c=o.find(e=>"video"===e.media.mediaType);let{source:h,params:u}=l||{};const p=c||l,g={audio:l,video:c};if(a.entries.forEach(e=>{if("sendonly"===e.direction){const t=g[e.type];if(!t)return;a.setEntrySource(e,t.sourceGroups||t.source),a.setEntryPeerId(e,De.default.myId)}}),u!==p.params){const e=JSON.parse(p.params.data);h?e.ssrc=h:delete e.ssrc,u={_:"dataJSON",data:JSON.stringify(e)}}const f=He.getGroupCallInput(r);if("main"===s.type){const e={call:f,join_as:{_:"inputPeerSelf"},params:u,muted:s.isMuted,video_stopped:!s.joinVideo};d=Te.a.invokeApi("phone.joinGroupCall",e),this.log("[api] joinGroupCall id="+r,e)}else{const e={call:f,params:u};d=Te.a.invokeApi("phone.joinGroupCallPresentation",e),this.log("[api] joinGroupCallPresentation id="+r,e)}const m=yield d;xe.a.processUpdateMessage(m);const v=m.updates.find(e=>"updateGroupCallConnection"===e._),_=JSON.parse(v.params.data);return _.audio=_.audio||i.connections.main.description.audio,a.setData(_),function(e,t){["audio","video"].filter(e=>t[e]).map(e=>[t[e],e]).forEach(([t,s])=>{const i=e.find(e=>e.mediaType===s);if(!i)return;const a=(e=>{const t={};return e.attributes.get("extmap").forEach(e=>{const s=e.key.split("/",1)[0];t[s]=e.value}),t})(i);Object(n.d)(t["rtp-hdrexts"],(e,t,i)=>{a[e.id]!==e.uri&&(i.splice(t,1),console.log("[sdp] filtered extmap:",e,t,s))})})}(t,_),_}))}negotiate(){return Be(this,void 0,void 0,(function*(){const{groupCall:e,connection:t,description:s}=this,{id:i}=e;if(this.negotiating)return;this.negotiating=!0;const a="new"===t.iceConnectionState&&!s.getEntryByMid("0").source,r=this.log.bindPrefix("startNegotiation");r("start");const o=yield t.createOffer({iceRestart:!1});if(a&&this.dataChannel){s.createEntry("application").setDirection("sendrecv")}const{sdp:d,offer:l}=Pe({offer:o,data:s});r("[sdp] setLocalDescription",l.sdp),yield t.setLocalDescription(l);const c=d.media.filter(e=>"application"!==e.mediaType&&e.isSending);if(a)try{yield this.invokeJoinGroupCall(d,c,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const h=[],u=d.bundle;Object(n.d)(u,(e,t,i)=>{const a=s.getEntryByMid(e);a.shouldBeSkipped(!0)&&(i.splice(t,1),h.push(a))});const p=d.media.map(e=>{const t=e.mid;let i=s.getEntryByMid(t);return i||(i=new Ce(t,e.mediaType),i.setDirection("inactive")),i}),g={type:"answer",sdp:s.generateSdp({bundle:u,entries:p,isAnswer:!0})};h.forEach(e=>{s.deleteEntry(e)}),r(`[sdp] setRemoteDescription signaling=${t.signalingState} ice=${t.iceConnectionState} gathering=${t.iceGatheringState} connection=${t.connectionState}`,g.sdp),yield t.setRemoteDescription(g),this.negotiating=!1,this.updateConstraints&&(this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1),r("end",i)}))}maybeUpdateRemoteVideoConstraints(){if("open"!==this.dataChannel.readyState)return;this.log("maybeUpdateRemoteVideoConstraints");const e={colibriClass:"ReceiverVideoConstraints",constraints:{},defaultConstraints:{maxHeight:0},onStageEndpoints:[]};for(const t of this.description.entries){if("recvonly"!==t.direction||"video"!==t.type)continue;const{endpoint:s}=t;e.onStageEndpoints.push(s),e.constraints[s]={minHeight:180,maxHeight:720}}this.dataChannel.send(JSON.stringify(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()}closeConnection(){const{connection:e}=this;if(e)try{e.log("close"),e.close()}catch(e){this.log.error(e)}}stopTrack(e){e.stop(),Object(r.a)(e,"ended")}stopStreamManager(){const{streamManager:e}=this;if(e)try{e.inputStream.getTracks().concat(e.outputStream.getTracks()).forEach(e=>{this.stopTrack(e)})}catch(e){this.log.error(e)}}closeConnectionAndStream(e){this.closeConnection(),e&&this.stopStreamManager()}}const He=new class{constructor(){this.makeSsrcsFromParticipant=e=>{var t,s;return[this.makeSsrcFromParticipant(e,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&this.makeSsrcFromParticipant(e,"audio",e.video.audio_source),e.video&&this.makeSsrcFromParticipant(e,"video",e.video.source_groups,e.video.endpoint),(null===(s=e.presentation)||void 0===s?void 0:s.audio_source)&&this.makeSsrcFromParticipant(e,"audio",e.presentation.audio_source),e.presentation&&this.makeSsrcFromParticipant(e,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)},this.log=Object(ke.b)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,De.default.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)}}),De.default.addEventListener("group_call_state",e=>{var t;(null===(t=this.currentGroupCall)||void 0===t?void 0:t.id)===e.id&&e.state===h.a.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(null),this.playSound("group_call_end.mp3"),De.default.dispatchEvent("chat_update",e.chatId))}),De.default.addEventListener("group_call_update",e=>{if("groupCallDiscarded"===e._){const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&t.hangUp(!1,!1,!0),this.participants.delete(e.id)}})}get groupCall(){return this.currentGroupCall}getCachedParticipants(e){let t=this.participants.get(e);return t||this.participants.set(e,t=new Map),t}prepareToSavingNextOffset(e){const t=this.nextOffsets,s=t.get(e);return{nextOffset:s,setNextOffset:i=>{t.get(e)===s&&t.set(e,i)}}}saveApiParticipant(e,t,s){const{currentGroupCall:i}=this,a=this.getCachedParticipants(e),n=Le.a.getPeerId(t.peer),r=a.get(n),d=t.pFlags.left;if(!r&&d)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0);const l=(null==i?void 0:i.id)===e;r?(Object(o.i)(r,t),t=r):a.set(n,t),l&&i.onParticipantUpdate(t,this.doNotDispatchParticipantUpdate);const c=this.getGroupCall(e);if("groupCall"===(null==c?void 0:c._)){let e=!1;d?(--c.participants_count,e=!0):!t.pFlags.just_joined||r||t.pFlags.self||(++c.participants_count,e=!0),e&&De.default.dispatchEvent("group_call_update",c)}d&&a.delete(n),r&&this.doNotDispatchParticipantUpdate!==n&&De.default.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}saveApiParticipants(e,t,s){t.saved||(t.saved=!0,t.forEach(t=>this.saveApiParticipant(e,t,s)))}editParticipant(e,t,s){return Be(this,void 0,void 0,(function*(){if(!Object.keys(s).length)return;if(t){const{currentGroupCall:i}=this,a=(null==i?void 0:i.id)===e&&t.pFlags.self;if(a&&void 0!==s.muted&&!i.isSharingAudio&&(delete s.muted,!Object.keys(s).length))return;const n=s.muted;void 0!==n&&t.pFlags.self&&(n?t.pFlags.muted=!0:t.pFlags.can_self_unmute&&delete t.pFlags.muted),void 0!==s.raiseHand&&(s.raiseHand?t.raise_hand_rating="1":delete t.raise_hand_rating),a&&(void 0!==s.videoStopped&&(s.videoStopped?delete t.video:t.video=this.generateSelfVideo(i.connections.main.sources.video)),!t.pFlags.muted&&t.pFlags.can_self_unmute&&i.setMuted(!1),De.default.dispatchEvent("group_call_state",i)),De.default.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}const i=t.pFlags.self?Fe.b:Le.a.getPeerId(t.peer),a=yield Te.a.invokeApiSingle("phone.editGroupCallParticipant",{call:He.getGroupCallInput(e),participant:i===Fe.b?Le.a.getInputPeerSelf():Le.a.getInputPeerById(i),muted:s.muted,volume:s.volume,raise_hand:s.raiseHand,video_paused:s.videoPaused,video_stopped:s.videoStopped,presentation_paused:s.presentationPaused});xe.a.processUpdateMessage(a)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return Be(this,void 0,void 0,(function*(){const s=this.getGroupCall(e);if(s&&"inputGroupCall"!==s._&&!t)return s;const i=this.getCachedParticipants(e).size?0:100;return Te.a.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:i},processResult:t=>{je.a.saveApiUsers(t.users),Oe.a.saveApiChats(t.chats),this.saveApiParticipants(e,t.participants,!0);const s=this.saveGroupCall(t.call);return i&&void 0===this.nextOffsets.get(e)&&this.nextOffsets.set(e,t.participants_next_offset),s}})}))}saveGroupCall(e,t){const s=this.groupCalls.get(e.id),i="inputGroupCall"!==e._&&(!s||"groupCallDiscarded"!==s._);return s?(i&&Object(o.i)(s,e),e=s):this.groupCalls.set(e.id,e),i&&De.default.dispatchEvent("group_call_update",e),e}playSound(e){try{const t=this.audio||(this.audio=new Audio);t.src="assets/audio/"+e,t.play()}catch(t){this.log.error("playSound",e,t)}}startConnectingSound(e){this.stopConnectingSound(null),setTimeout(()=>{var t;const{currentGroupCall:s}=this;if(s&&s.connections.main.connection===e&&("checking"===e.iceConnectionState||"new"===e.iceConnectionState)&&(null===(t=this.connectionAudio)||void 0===t?void 0:t.connection)!==e){const t=new Audio("assets/audio/group_call_connect.mp3");t.loop=!0,t.connection=e,this.connectionAudio=t,t.play()}},2500)}stopConnectingSound(e){const{connectionAudio:t}=this;(null==t?void 0:t.connection)===e&&(this.connectionAudio=null,t.pause())}setCurrentGroupCall(e){this.currentGroupCall=e}getVideoConstraints(){return{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}}getAudioConstraints(){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}createGroupCall(e,t,s){return Be(this,void 0,void 0,(function*(){const i=yield Te.a.invokeApi("phone.createGroupCall",{peer:Le.a.getInputPeerById(e.toPeerId(!0)),random_id:Object(d.a)(32),schedule_date:t,title:s});xe.a.processUpdateMessage(i);return i.updates.find(e=>"updateGroupCall"===e._).call}))}joinGroupCall(e,t,s=!0,i,a){return Be(this,void 0,void 0,(function*(){let n;if(this.audio||(this.audio=new Audio,this.audio.play()),this.log(`joinGroupCall chatId=${e} id=${t} muted=${s} rejoin=${i}`),i)n=this.currentGroupCall.connections.main.streamManager;else{const e={audio:this.getAudioConstraints(),video:a&&this.getVideoConstraints()};n=new Ue(100);try{const t=yield _e(e,s);n.addStream(t,"input")}catch(t){this.log.error("joinGroupCall getStream error",t,e),n.inputStream=new MediaStream}}return this.joinGroupCallInternal(e,t,n,s,i,a)}))}joinGroupCallInternal(e,t,s,i,a=!1,n){return Be(this,void 0,void 0,(function*(){const r=this.log.bindPrefix("joinGroupCallInternal");r("start",t);let{currentGroupCall:o}=this;if(!o||!a){o=new Re({chatId:e,id:t}),o.groupCall=yield this.getGroupCallFull(t);const d=o.createConnectionInstance({streamManager:s,type:"main",options:{type:"main",isMuted:i,joinVideo:n,rejoin:a}}),l=d.createPeerConnection();return l.addEventListener("negotiationneeded",()=>{a||this.startConnectingSound(l),d.negotiate()}),l.addEventListener("track",e=>{r("ontrack",e),o.onTrack(e)}),l.addEventListener("iceconnectionstatechange",()=>{De.default.dispatchEvent("group_call_state",o);const{iceConnectionState:e}=l;switch("connected"!==e&&"closed"!==e&&this.stopConnectingSound(l),e){case"checking":break;case"closed":o.hangUp();break;case"completed":break;case"connected":{const{currentGroupCall:e}=this;e&&e.connections.main.connection===l&&!e.joined&&(e.joined=!0,this.playSound("group_call_start.mp3"),this.getGroupCallParticipants(t).then(({participants:e})=>{this.saveApiParticipants(t,[...e.values()])}));break}case"disconnected":break;case"failed":o.hangUp()}}),d.createDescription(),d.createDataChannel(),d.appendStreamToConference(),this.setCurrentGroupCall(o),r("set currentGroupCall",t,o),d.negotiate()}o.handleUpdateGroupCallParticipants=!1,o.updatingSdp=!1,r("update currentGroupCall",t,o)}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}generateSelfVideo(e,t){return e&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:e.sourceGroups,audio_source:t}}generateSelfParticipant(){var e,t;const s=this.currentGroupCall.connections.main.sources,i=null===(e=this.currentGroupCall.connections.presentation)||void 0===e?void 0:e.sources;return{_:"groupCallParticipant",pFlags:{can_self_unmute:!0,self:!0},source:s.audio.source,video:this.generateSelfVideo(s.video),presentation:i&&this.generateSelfVideo(i.video,null===(t=i.audio)||void 0===t?void 0:t.source),date:Object(c.a)(!0),peer:Le.a.getOutputPeer(De.default.myId)}}makeSsrcFromParticipant(e,t,s,i){return function(e,t,s){let i;return Array.isArray(t)&&(i=t,t=i[0].sources[0]),{endpoint:s,type:e,source:t,sourceGroups:i}}(t,s,i)}getGroupCallParticipants(e){return Be(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:s}=this.prepareToSavingNextOffset(e);return""!==t&&(yield Te.a.invokeApiSingleProcess({method:"phone.getGroupParticipants",params:{call:this.getGroupCallInput(e),ids:[],sources:[],offset:t||"",limit:100},processResult:t=>{const i=t.count===t.participants.length?"":t.next_offset;Oe.a.saveApiChats(t.chats),je.a.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),s(i)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t=!1,s=!1){return Be(this,void 0,void 0,(function*(){this.log(`hangUp start id=${e} discard=${t} rejoin=${s}`);const{currentGroupCall:i}=this;(null==i?void 0:i.id)===e&&i.hangUp(t,s)}))}toggleMuted(e){return this.changeUserMuted(Fe.b,e)}changeUserMuted(e,t){const{currentGroupCall:s}=this;if(!s)return;const i=s.getParticipantByPeerId(e);return Fe.b===e&&i.pFlags.can_self_unmute&&(t=void 0===t?!i.pFlags.muted:t),this.editParticipant(s.id,i,{muted:t})}};i.a&&(i.a.appGroupCallsManager=He);t.a=He},,,,,,,,function(e,t,s){"use strict";var i=s(29),a=s(0),n=s(43),r=function(e,t,s,i){return new(s||(s=Promise))((function(a,n){function r(e){try{d(i.next(e))}catch(e){n(e)}}function o(e){try{d(i.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?a(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,o)}d((i=i.apply(e,t||[])).next())}))};const o=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=Object(n.b)("OPUS",n.a.Error)}isPlaySupported(){if(void 0!==this.isPlaySupportedResult)return this.isPlaySupportedResult;const e=document.createElement("audio");return this.isPlaySupportedResult=!(!e.canPlayType||!e.canPlayType("audio/ogg;").replace(/no/,""))}loadWavWorker(){this.wavWorker||(this.wavWorker=new Worker("waveWorker.min.js"),this.wavWorker.addEventListener("message",e=>{const t=e.data;if(this.log("[WAV] got message:",t),t&&t.page){const e=t.page;this.onTaskEnd(this.tasks.shift(),e)}}))}loadWorker(){this.worker||(this.worker=new Worker("decoderWorker.min.js"),this.worker.addEventListener("message",e=>{const t=e.data;this.log("[DECODER] got message",t),"done"===t.type?(this.wavWorker.postMessage({command:"done"}),t.waveform&&(this.tasks[0].waveform=t.waveform)):this.wavWorker.postMessage({command:"encode",buffers:e.data},a.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},a.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((s,i)=>{const a={pages:e,withWaveform:t,callback:{resolve:s,reject:i},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(a)&&this.executeNewTask(a)})}decode(e,t=!1){return r(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then(e=>{const t=new Blob([e.bytes],{type:"audio/wav"});return{url:URL.createObjectURL(t),waveform:e.waveform}})}))}};i.a.opusDecodeController=o,t.a=o},function(e,t,s){"use strict";var i=s(53),a=s(66),n=s(31),r=s(15),o=s(32),d=s(78),l=s(29);const c=new Set(["photo","video","gif","document"]);const h=new class{constructor(){this.webpages={},this.pendingWebPages={},r.default.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,s){var l,h;if("webPageNotModified"===e._)return;const{id:u}=e,p=this.webpages[u],g=p&&p._===e._&&p.hash==p.hash;if("webPage"===e._){"photo"===(null===(l=e.photo)||void 0===l?void 0:l._)?e.photo=i.a.savePhoto(e.photo,s):delete e.photo,"document"===(null===(h=e.document)||void 0===h?void 0:h._)?e.document=a.a.saveDoc(e.document,s):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name;let r=e.title||e.author||t||"";t&&r===t&&delete e.site_name,r=Object(d.f)(r,80,100),e.rTitle=n.a.wrapRichText(r,{noLinks:!0,noLinebreaks:!0});let o="";if("GitHub"===t){const t=e.url.match(/(https?:\/\/github\.com\/[^\/]+\/[^\/]+)/);t&&(o=t[0]+"/issues/{1}")}const u=Object(d.f)(e.description||"",150,180);e.rDescription=n.a.wrapRichText(u,{contextSite:t||"external",contextHashtag:o}),c.has(e.type)||e.description||!e.photo||(e.type="photo")}let f=this.pendingWebPages[u];if(t&&(f||(f=this.pendingWebPages[u]=new Set),f.add(t)),void 0===p?this.webpages[u]=e:Object(o.i)(p,e),!t&&void 0!==f&&g){const e=[];f.forEach(t=>{const[s,i,a]=t.split("_");e.push({peerId:s.toPeerId(),mid:+i,isScheduled:!!a})}),r.default.dispatchEvent("webpage_updated",{id:u,msgs:e})}return e}getMessageKeyForPendingWebPage(e,t,s){return e+"_"+t+(s?"_s":"")}deleteWebPageFromPending(e,t){const s=e.id;if(!s)return;const i=this.pendingWebPages[s];i&&i.has(t)&&(i.delete(t),i.size||delete this.pendingWebPages[s])}getWebPage(e){return this.webpages[e]}};l.a&&(l.a.appWebPagesManager=h),t.a=h},function(e,t,s){"use strict";var i=s(121);const a=new Set(["image/jpeg","image/png","image/bmp"]);i.a&&a.add("image/webp"),t.a=a},,,function(e,t,s){"use strict";s.d(t,"a",(function(){return o}));s(76);var i=0,a=0;for(i=0;1<1<>=1))-1;n(1,1,1),n(0,1,1),new Array(0);function n(e,t,s){var a;a=s>(a=Math.ceil(t/i)+1)?s:a;var n=new Array(a);return r(n,e),n}function r(e,t){var s,n,r=e.length;for(n=t,s=0;s>=i}function o(e){return"object"==typeof e&&null!==e}},function(e,t,s){"use strict";var i=s(0);var a=!!document.createElement("video").canPlayType("video/quicktime")||i.IS_SAFARI||i.IS_APPLE_MOBILE;const n=new Set(["image/gif","video/mp4","video/webm"]);a&&n.add("video/quicktime");t.a=n}])]); +//# sourceMappingURL=6.d600026c8e100eea4159.chunk.js.map \ No newline at end of file diff --git a/public/6.d600026c8e100eea4159.chunk.js.map b/public/6.d600026c8e100eea4159.chunk.js.map new file mode 100644 index 000000000..be743c88a --- /dev/null +++ b/public/6.d600026c8e100eea4159.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/cleanUsername.ts","webpack:///./src/lib/appManagers/appUsersManager.ts","webpack:///./src/lib/storages/dialogs.ts","webpack:///./src/lib/storages/filters.ts","webpack:///./src/helpers/formatCallDuration.ts","webpack:///./src/helpers/formatDuration.ts","webpack:///./src/lib/appManagers/appMessagesManager.ts","webpack:///./src/lib/appManagers/appPeersManager.ts","webpack:///./src/lib/appManagers/appChatsManager.ts","webpack:///./src/components/peerTitle.ts","webpack:///./src/lib/appManagers/appPhotosManager.ts","webpack:///./src/lib/appManagers/appDocsManager.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/lib/appManagers/appProfileManager.ts","webpack:///./src/lib/appManagers/apiUpdatesManager.ts","webpack:///./src/components/visibilityIntersector.ts","webpack:///./src/components/lazyLoadQueue.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/helpers/windowSize.ts","webpack:///./src/helpers/dom/htmlToSpan.ts","webpack:///./src/lib/appManagers/appNotificationsManager.ts","webpack:///./src/helpers/dom/renderImageFromUrl.ts","webpack:///./src/lib/appManagers/appMessagesIdsManager.ts","webpack:///./src/components/preloader.ts","webpack:///./src/helpers/files.ts","webpack:///./src/helpers/assumeType.ts","webpack:///./src/helpers/middleware.ts","webpack:///./src/lib/searchIndex.ts","webpack:///./src/components/middleEllipsis.ts","webpack:///./src/lib/appManagers/appDraftsManager.ts","webpack:///./src/lib/appManagers/appAvatarsManager.ts","webpack:///./src/lib/calls/groupCallState.ts","webpack:///./src/helpers/cleanSearchText.ts","webpack:///./src/helpers/slicedArray.ts","webpack:///./src/lib/appManagers/appPollsManager.ts","webpack:///./src/helpers/heavyQueue.ts","webpack:///./src/helpers/blur.ts","webpack:///./src/lib/mtproto/referenceDatabase.ts","webpack:///./src/helpers/dom/htmlToDocumentFragment.ts","webpack:///./src/lib/calls/sdp/index.ts","webpack:///./src/helpers/string/splitStringByLimitWithRest.ts","webpack:///./src/helpers/uniqueNumberGenerator.ts","webpack:///./src/lib/calls/sdp/attributeSplitted.ts","webpack:///./src/lib/calls/sdp/mediaLineParts.ts","webpack:///./src/lib/calls/sdp/line.ts","webpack:///./src/lib/calls/sdp/attributeInner.ts","webpack:///./src/lib/calls/sdp/attributes.ts","webpack:///./src/lib/calls/sdp/mediaSection.ts","webpack:///./src/lib/calls/sdp/sessionSection.ts","webpack:///./src/lib/calls/sdp/utils.ts","webpack:///./src/lib/calls/utils.ts","webpack:///./src/lib/calls/sdpBuilder.ts","webpack:///./src/lib/calls/stringFromLineBuilder.ts","webpack:///./src/lib/calls/localConferenceDescription.ts","webpack:///./src/lib/calls/streamManager.ts","webpack:///./src/lib/calls/constants.ts","webpack:///./src/lib/appManagers/appGroupCallsManager.ts","webpack:///./src/environment/constraintSupport.ts","webpack:///./src/lib/opusDecodeController.ts","webpack:///./src/lib/appManagers/appWebPagesManager.ts","webpack:///./src/environment/imageMimeTypesSupport.ts","webpack:///./src/vendor/leemon.ts","webpack:///./src/lib/mtproto/bin_utils.ts","webpack:///./src/environment/movSupport.ts","webpack:///./src/environment/videoMimeTypesSupport.ts"],"names":["cleanUsername","username","toLowerCase","appUsersManager","storage","appStateManager","storages","users","updateUsersStatuses","timestampNow","i","this","user","updateUserStatus","clear","setInterval","rootScope","addEventListener","addMultipleEventsListeners","update","userId","user_id","status","expires","serverTimeManager","serverTimeOffset","was_online","dispatchEvent","setUserToStateIfNeeded","updateUserPhoto","forceUserOnline","photo","_","toPeerId","console","warn","updateUserName","saveApiUser","Object","assign","first_name","last_name","e","getSelf","id","contactsIndex","indexObject","getUserSearchText","getState","then","state","storagesResults","length","contactsList","Array","isArray","forEach","pushContact","contactsFillPromise","resolve","peerId","appPeersManager","isUser","toUserId","getFromCache","set","getUser","delete","init","usernames","isPeerNeeded","findAndSplice","getTopPeersPromises","createSearchIndex","undefined","Set","updatedContactsList","pushToState","cached","isFulfilled","promise","invokeApi","result","saveApiUsers","contacts","contact","onContactsModified","slice","Promise","resolvedPeer","appChatsManager","saveApiChats","chats","getPeer","getPeerId","peer","add","requestPeerSingle","releaseSinglePeer","phone","pFlags","self","format","filter","Boolean","join","query","includeSaved","sortBy","fillContacts","_contactsList","results","search","has","sort","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","myId","testSelfSearch","unshift","getContacts","userIds","map","block","invokeApiSingle","getInputPeerById","value","apiUpdatesManager","processLocalUpdate","peer_id","getOutputPeer","blocked","index","clearBadChars","ignoreCase","latinize","includeTag","apiUsers","override","saved","oldUser","min","oldSearchUsername","searchUsername","initials","fullName","deleted","cleanSearchText","getAbbreviation","changedPhoto","changedTitle","photo_id","wasContact","newContact","onContactUpdated","formatPhoneNumber","formatted","access_hash","key","args","isBot","support","date","now","Date","d","getDate","getMonth","getHours","getMinutes","bot","isRegularUser","isContact","allowMin","phone_number","vcard","eventTimestamp","timestamp","updatesState","syncLoading","importContacts","phones","error","Error","type","inputContacts","j","push","client_id","toString","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","peers","offset","limit","hash","topPeers","categories","topPeer","requestPeer","rating","contactsBlocked","count","peerIds","u","concat","c","invokeApiCacheable","q","cacheSeconds","my_results","p","curIsContact","popContact","offline","showPhone","getUserInput","add_phone_privacy_exception","updates","processUpdateMessage","appMessagesManager","appDraftsManager","appNotificationsManager","appMessagesIdsManager","folders","onUpdateFolderPeers","folder_peers","folderPeer","folder_id","dialog","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","folderId","getDialogOnly","onUpdatePinnedDialogs","handleOrder","order","pinnedOrders","reverse","newPinned","dialogs","getFolderDialogs","dialogsResult","applyDialogs","getCache","peerText","getPeerSearchText","dialogsIndex","onFilterUpdate","getCachedDialogs","processDialogForFilter","filterId","processDialogForFilters","indexKey","orderIndex","chatId","chat","getChat","left","dropDialogOnDeletion","updateFolderPeers","updateDialogPinned","updatePinnedDialogs","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","getMessageByPeer","reloadConversation","allDialogsLoaded","loaded","0","1","setDialogsLoaded","savePinnedOrders","dialogsOffsetDate","dialogsNum","cachedResults","offsetDate","Math","getOffsetDate","unreadMessagesCount","unreadDialogsCount","skipMigrated","folder","getFolder","migratedTo","filtersStorage","testDialogForFilter","pinnedIndex","pinnedPeerIds","indexOf","generateDialogIndex","generateDialogPinnedDateByIndex","pinned_peers","skipped","isPinned","filters","getDialogIndexKey","wasIndex","findIndex","wasDialog","wasDialogIndex","newDialogIndex","setDialogIndexInFilter","prepareFolderUnreadCountModifyingByDialog","splice","callbacks","callback","toggle","wasUnreadCount","getDialogUnreadCount","newUnreadCount","addMessagesCount","addDialogsCount","modifyFolderUnreadCount","max","dispatchUnreadTimeout","ctx","setTimeout","justReturn","message","topDate","generateDialogPinnedDate","channelId","isChannel","toChatId","channel","draft","foundIndex","pts","historyStorage","getHistoryStorage","messagesStorage","getMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","fromId","viaBotId","isAnyChat","newPts","getChannelState","ignoreOffsetDate","saveGlobalOffset","pos","setDialogToState","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","isDialogsLoaded","clearDialogFromState","foundDialog","getDialog","wasPinned","keepLocal","dropped","dropDialogWithEvent","idx","messages","updatedDialogs","topPendingMessage","pendingTopMsgs","maxId","newUpdatesAfterReloadToHandle","saveUpdate","keys","kicked","wasDialogBefore","generateMessageId","wasTopMessage","generateTempMessageId","from_id","out","isOutgoing","log","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","Bottom","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","settings","notify_settings","addChannelState","getFilter","offsetIndex","ret","promises","fillContactsResult","reloadMissingDialogsPromise","reloadMissingPeerIds","all","getDialogs","realFolderId","curDialogStorage","indexStr","d1","d2","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","convertment","onUpdateDialogFilter","saveDialogFilter","onUpdateDialogFilterOrder","setOrderIndex","hasOwnProperty","updateDialogFilter","updateDialogFilters","oldFilters","getDialogFilters","_filterId","find","updateDialogFilterOrder","reloadedPeerIds","excludePeerIds","includes","includePeerIds","exclude_archived","exclude_read","isDialogUnread","exclude_muted","isPeerLocalMuted","broadcasts","isBroadcast","groups","isAnyGroup","bots","non_contacts","config","pinned_infolder_count_max","reject","prepend","remove","flags","getOutputDialogFilter","bool","f","a","b","filterIncludedPinnedPeers","include_peers","pinnedPeers","reloadDialogs","inputPeer","reloadPromises","reloadPromise","overwrite","from","to","oldFilter","CALL_DURATION_LANG_KEYS","s","m","h","w","formatCallDuration","duration","plain","showLast","t","o","modulus","formatDuration","strings","elements","fragment","document","createElement","append","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","Map","fetchSingleMessagesPromise","maxSeenId","newMessagesHandleTimeout","newMessagesToHandle","newDialogsToHandle","notificationsHandlePromise","notificationsToHandle","reloadConversationsPeers","logger","Debug","Log","Warn","groupedTempId","typings","unreadMentions","goToNextMentionPromises","handleNewMessages","clearTimeout","handleNewDialogs","newMaxSeenId","obj","dialogsStorage","incrementMaxSeenId","handleNotifications","window","_peerId","idle","isIDLE","notifyPeerToHandle","getNotifyPeerTypeSettings","getNotifySettings","getInputNotifyPeerById","peerTypeNotifySettings","notifyAboutMessage","fwdCount","onUpdateMessageId","randomId","random_id","pendingData","tempId","threadId","finalizePendingMessageCallbacks","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","threadKey","getThreadKey","split","threadsStorage","good","isInChat","pendingMessage","checkPendingMessage","updateMessageRepliesIfNeeded","findSlice","firstSlice","first","action","channel_id","top_msg_id","chat_id","handleNewMessage","inboxUnread","releaseUnreadCount","prepareDialogUnreadCountModifying","mentioned","unread_mentions_count","modifyCachedMentions","setDialogTopMessage","notifyPeer","fwd_from","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","grouped_id","onUpdateReadHistory","max_id","read_max_id","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","threadsToReplies","updateMessage","get","replyTo","reply_to","reply_to_top_id","reply_to_msg_id","cancel","setCount","getReadMaxIdIfUnread","threadKeyPart","onUpdateReadMessagesContents","mids","getMessageById","fixDialogUnreadMentionsIfNoMessage","media_unread","setDialogToStateIfMessageIsTop","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","clearCache","params","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","historiesStorage","onUpdateChannelReload","onUpdateChannelMessageViews","views","onUpdateServiceNotification","messageId","inbox_date","media","entities","hasUser","verified","pts_count","onUpdatePinnedMessages","missingMessages","wrapSingleMessage","finally","werePinned","pinnedMessages","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","scheduledMessagesStorage","isScheduled","onUpdateDeleteScheduledMessages","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getWebPage","drop","poll","appPollsManager","pollToMessages","maxSeenMsgId","middleware","clean","messagesStorageByPeerId","groupedMessagesStorage","searchesStorage","threadsServiceMessagesIdsStorage","sendEntites","entity","callbackName","finalize","deferred","text","options","invokeAfterMessageIsSent","editMessage","parseMarkdown","schedule_date","scheduleDate","is_scheduled","newMedia","getInputEntities","no_webpage","noWebPage","handled","trim","replyToMsgId","MAX_LENGTH","message_length_max","splitted","webPage","sendText","getPeerMigratedTo","generateOutgoingMessage","toggleError","on","send","sentRequestOptions","apiPromise","afterMessageId","invokeApiAfter","query_id","queryId","resultId","clear_draft","clearDraft","silent","wrapMessageEntities","seq","local","beforeMessageSending","file","attachType","apiFileName","fileType","mime_type","fileName","File","name","isDocument","Blob","caption","attributes","isPhoto","actionName","isVoiceMessage","attribute","voice","waveform","isMedia","photoSize","width","height","location","size","sizes","cacheContext","appDownloadManager","getCacheContext","downloaded","url","objectURL","appPhotosManager","savePhoto","videoAttribute","round_message","isRoundMessage","supports_streaming","noSound","file_name","thumbs","thumb","blob","thumbCacheContext","appDocsManager","saveDoc","preloader","attachMethod","tryAgainOnFail","isUpload","sentDeferred","attachPromise","catch","err","uploaded","cancelPendingMessage","setTyping","uploadPromise","file_reference","inputMedia","load","thumbUploadPromise","upload","notifyAll","done","total","inputFile","force_file","addNotifyListener","progress","percents","floor","isGroupedItem","background","code","files","sendFile","sendFileDetails","groupId","details","invoke","multiMedia","multi_media","messageMedia","getMediaInput","doc","inputSingleMedia","inputs","pollId","savePoll","total_voters","getPoll","getPhoto","getDoc","geo","geoPoint","title","address","provider","venue_id","venue_type","postAuthor","signatures","generateFromId","post_author","generateFlags","random","generateReplyHeader","via_bot_id","reply_markup","replyMarkup","replies","generateReplies","pending","replyToTopId","header","channelFull","appProfileManager","chatsFull","linked_chat_id","comments","replies_pts","isAnonymousSending","post","originalMessage","fwdHeader","from_name","channel_post","saved_from_msg_id","saved_from_peer","Number","MAX_SAFE_INTEGER","admin_rights","anonymous","chatHistoryStorage","offset_date","offset_id","offset_peer","offsetPeerId","noErrorBox","resetPinnedOrder","telegramMeWebManager","setAuthorized","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","folderDialogs","dialogsLength","slicedDialogs","fromPeerId","dropCaptions","dropAuthor","newMessages","generateForwardHeader","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","createMessageStorage","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","fullfillLeft","just_clear","revoke","affectedHistory","doFlushHistory","justClear","getHistory","historyResult","getChannelInput","ss","getPinnedMessage","getSearch","inputFilter","unpin","pm_oneside","unpinAll","unpinAllMessages","totalEntities","foundMessages","getMidsByAlbum","verify","reply_to_mid","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","fwdFromId","mediaContext","ttl_seconds","messageKey","getMessageKeyForPendingWebPage","saveWebPage","migrateFrom","migrateTo","suffix","video_sizes","appGroupCallsManager","saveGroupCall","call","reason","migrateChecks","saveMessage","apiEntities","fixEmoji","myEntities","parseEntities","mergeEntities","usingMids","highlightWord","withoutMediaType","parts","addPart","langKey","part","el","innerHTML","assumeType","usingFullAlbum","getMidsByMessage","getAlbumText","emoticon","wrapEmojiText","htmlToDocumentFragment","question","rReply","prefix","game","stickerEmojiRaw","stickerEmoji","performer","actionWrapped","wrapMessageActionTextNew","replace","match","found","regExp","RegExp","exec","messageWrapped","wrapRichText","noLinebreaks","noLinks","noTextFormat","createDocumentFragment","senderTitle","classList","fromMe","element","peerTitle","unsafeMessage","wrapPlainText","langPackKey","getNameDivHTML","getPeerTitle","endsWith","onclick","wrapUrl","href","setAttribute","today","daysToStart","getTime","tomorrowDate","setDate","k","_args","IntlDateElement","day","month","year","pinnedMessage","fetchMessageReplyTo","isMessageIsTopMessage","dataset","dir","wrapMessageForReply","htmlToSpan","joined","anchorHTML","domain","langPack","botId","startParam","start_param","inviteToChannel","addChatUser","str","toggleDialogPin","pinned_dialogs_count_max","getPinnedOrders","getDialogPeer","read","hasChat","fromChat","kind","goodMedias","sticker","canMessageBeEdited","edit_time_limit","hasRights","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","hidden","canCache","bind","func","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","goodEntities","matchUrl","nextRate","backLimit","minDate","maxDate","filterMessagesByInputFilter","next_rate","offset_id_offset","method","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","getDiscussionMessage","maxMessageId","serviceStartMessage","is_single","msg_id","filterMessages","generateThreadServiceStartMessage","newDialogsHandlePromise","localMessageIds","creator","delete_messages","affectedMessages","force","triedToReadMaxId","readPromise","soundReset","getPeerString","readHistory","slicedArray","Top","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","msgIds","threadMessage","broadcastEventName","finalizePendingMessage","mute","mute_until","canSendToUser","finalMessage","tempMessage","newPhoto","newDoc","newPhotoSize","oldCacheContext","downloadOptions","getPhotoDownloadOptions","fakeDownload","getInputFileName","polls","handleReleasingMessage","increment","notification","peerString","notificationMessage","show_previews","tag","peerPhoto","getPeerPhoto","appAvatarsManager","loadAvatar","loadPromise","image","notify","canSendToPeer","isFetchIntervalNeeded","unsetEnd","haveSlice","sliceMe","fulfilled","Both","fillHistoryStorage","constructSlice","offsetIdOffset","topWasMeantToLoad","isBottomEnd","isHistoryResultEnd","requestHistory","oldestMessage","foundSlice","_historyResult","requestPromises","after","getMessagesResult","fetchSingleMessages","replyToPeerId","reply_to_peer_id","typing","timeout","smth","referenceDatabase","deleteContext","deleteWebPageFromPending","updatePollToMessage","groupedId","groupedStorage","albums","peerMessagesToHandle","deletedMids","DialogColorsFg","DialogColors","DialogColorsMap","newMethod","originMethod","String","prototype","getUserPhoto","getChatPhoto","plainText","onlyFirstName","getUserString","getChatString","isPeerId","charAt","peerParams","substr","isMegagroup","ignorePeerId","getChannelInputPeer","getChatInputPeer","getUserInputPeer","pic","abs","getDialogType","onChatUpdated","updateChannelParticipant","updateChatDefaultBannedRights","default_banned_rights","apiChats","saveApiChat","oldChat","participants_count","rights","defaultRights","isThread","isCheckingRightsForSelf","megagroup","banned_rights","myFlags","post_messages","broadcast","until_date","about","input","usersInputs","fwdLimit","fwd_limit","deleteChatUser","leaveChannel","leaveChat","deleteChannel","deleteChat","inputChatPhoto","participant","getParticipantPeerId","actor_id","qts","prev_participant","new_participant","kicked_by","editBanned","view_messages","kickFromChannel","messagesChats","enabled","migrateChat","weakMap","WeakMap","peerTitleWeakMap","querySelectorAll","PeerTitle","AppPhotosManager","photos","context","oldPhoto","saveContext","boxWidth","boxHeight","useBytes","pushDocumentSize","devicePixelRatio","bestPhotoSize","inputUser","photosResult","photoIds","bytes","isSticker","arr","mimeType","Uint8Array","jpegHeader","jpegTail","URL","createObjectURL","path","num","getPreviewURLFromBytes","useBlur","getPreviewURLFromThumb","Image","noZoom","choosePhotoSize","boxSize","aspect","isFit","aspectCovered","style","ignoreCache","getImageFromStrippedThumb","queueId","onlyCache","thumb_size","dcId","dc_id","photoId","fullWidth","fullHeight","download","getDownload","getInput","fullPhotoSize","downloadToDisc","EXTENSION_MIME_TYPE_MAP","mov","gif","pdf","docs","savingLottiePreview","downloading","onServiceWorkerFail","supportsStreaming","oldDoc","audioTitle","audioPerformer","alt","stickerset","stickerSetInput","animated","ext","pop","mappedMimeType","monthAsNumber","leadingZero","isServiceWorkerOnline","getFileURL","docId","thumbSize","inputFileLocation","getFileDownloadOptions","preloadPhoto","tryNotToUseBytes","getThumbURL","originalPromise","isPlaySupported","reader","FileReader","onloadend","uint8","target","decode","readAsArrayBuffer","canvas","toneIndex","stickerCachedThumbs","toBlob","downloadDoc","createDownloadAnchor","addTaskListener","task","payload","AppProfileManager","usersFull","onUpdateUserTyping","typingsInPeer","cancelAction","getChatFull","onUpdatePeerBlocked","userFull","updateChatParticipants","participants","chatFull","updateChatParticipantAdd","_participants","inviter_id","version","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","chat_photo","refreshFullPeer","invalidateChannelParticipants","invokeApiSingleProcess","processResult","profile_photo","rAbout","getProfile","getCachedFullUser","getCachedFullChat","getProfileByPeerId","profile","getChannelFull","full_chat","exported_invite","link","exportedInvite","channelParticipant","fullChannel","processError","getChannelParticipants","cP","getTopPeers","ratingMap","processUserIds","updateResult","previous","deletedList","reduce","acc","verifyParticipantForOnlineCount","chatInfo","channelParticipants","reduceParticipantsForOnlineCount","res","onlines","pendingPtsUpdates","pendingSeqUpdates","syncPending","channelStates","attached","debug","processOpts","seqStart","seq_start","forceGetDifference","processUpdate","toId","Proxy","saveUpdatesState","us","nextSeq","pendingUpdatesData","popPendingSeqUpdate","seqAwaiting","ptsAwaiting","curState","curPts","goodPts","goodIndex","getDifference","wasSyncing","pts_total_limit","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","justAName","channelState","getChannelDifference","lastPtsUpdateTime","popPts","popSeq","popPendingPtsUpdate","newVersion","stateResult","setUpdatesProcessor","setProxy","fetch","ok","VisibilityIntersector","onVisibilityChange","items","locked","observer","IntersectionObserver","entries","changed","entry","isIntersecting","visible","getVisible","disconnect","targets","observe","unobserve","unlock","refresh","parallelLimit","queue","inProcess","lockPromise","unlockResolve","processQueue","throttle","_processQueue","item","loadItem","shift","getItem","processItem","addElement","super","lock","intersector","unlockAndRefresh","div","intersectorTimeout","wasSeen","setProcessQueueTimeout","_queue","spliced","bytesToHex","bytesFromHex","hexString","len","ceil","start","parseInt","bytesToBase64","mod3","nLen","nUint24","nIdx","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","bufferConcats","v","byteLength","tmp","lastLength","ArrayBuffer","windowSize","visualViewport","innerWidth","innerHeight","html","span","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","navigator","vibrate","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","faviconEl","head","querySelector","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","volume","novibrate","nopreview","nopush","needPush","isAvailable","registeredDevice","subscribe","unsubscribe","setSettings","nosound","notifications","sound","requestPermission","Notification","removeEventListener","mozVibrate","webkitVibrate","notificationsUiSupport","topMessagesDeferred","notifySoundEl","body","stop","newVal","toggleToggler","tokenData","unregisterDevice","registerDevice","once","notificationData","period","custom","enable","resetTitle","setFavicon","clearInterval","titleInterval","getContext","beginPath","arc","PI","fillStyle","fill","fontSize","font","textBaseline","textAlign","fillText","toDataURL","getNotifyPeerTypePromise","inputKey","compare_sound","notifyContactsSignUp","prevFavicon","cloneNode","parentNode","replaceChild","peerNotifySettings","isMuted","respectType","n","notifySettings","inputNotify","typeNotifySettings","getPeerLocalSettings","permission","data","testSound","icon","setLocalNotificationsDisabled","close","focus","onclose","show","hide","nextSoundAt","prevSoundVolume","filename","audio","autoplay","hidePushNotifications","token_type","tokenType","token","tokenValue","other_uids","app_sandbox","secret","loadedURLs","elem","HTMLImageElement","HTMLVideoElement","src","SVGImageElement","setAttributeNS","backgroundImage","renderImageFromUrl","useCache","isImage","loader","renderImageFromUrlPromise","AppMessagesIdsManager","tempNum","temp","MESSAGE_ID_OFFSET","MESSAGE_ID_INCREMENT","clearMessageId","toServer","l","used","ProgressivePreloader","detached","cancelable","streamable","onClick","contains","loadFunc","color","bold","constructContainer","construct","totalLength","downloadSvg","lastElementChild","cancelSvg","previousElementSibling","circle","firstElementChild","setProgress","startTime","onEnd","elapsedTime","delay","TRANSITION_TIME","detach","attach","parentElement","setManual","reset","useRafs","getTotalLength","strokeDasharray","createPosterFromMedia","videoWidth","videoHeight","naturalWidth","naturalHeight","mediaSize","quality","aspectFitted","drawImage","createPosterFromVideo","video","onseeked","currentTime","onerror","createPosterForVideo","preloadVideo","race","onMediaLoad","readyState","HAVE_METADATA","useCanplayOnIos","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","clipboardData","originalEvent","webkitGetAsEntry","requestFile","accept","display","click","x","getMiddleware","cleanupObj","cleaned","_cleanupObj","SearchIndex","minChars","fullTexts","searchText","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","word","fullTextLength","testQueue","fontFamily","timeoutId","setTestQueue","cancelAnimationFrame","requestAnimationFrame","testQueueElements","testElement","capture","passive","mapped","firstTime","textLength","multiplier","textWidth","elementWidth","textContent","fontWeight","getTextWidth","getBoundingClientRect","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","half2","removeAttribute","measureText","MiddleEllipsisElement","HTMLElement","customElements","define","drafts","getAllDraftPromise","updateDraftMessage","peerID","getKey","getAllDrafts","apiDraft","processApiDraft","draft1","draft2","rMessage","wrapDraftText","localDraft","saveOnServer","serverDraft","getDraft","draftsAreEqual","draftObj","isEmptyDraft","saveLocalDraft","combined","syncDraft","savedAvatarURLs","getAvatarPromise","peerPhotoFileLocation","big","img","onlyThumb","renderThumbPromise","thumbImage","animate","animationsEnabled","putAvatar","stripped_thumb","childElementCount","mutateElement","renderPromise","isDialog","getPeerColorById","avatarAvailable","avatarRendered","abbr","GROUP_CALL_STATE","badCharsRe","trimRe","clearBadCharsAndTrim","latinizeString","ch","latinizeCh","LatinizeMap","hasTag","processSearchText","SliceEnd","SlicedArray","sliceConstructor","getSliceConstructor","slices","end","None","side","deleteCount","flatten","lowerBound","upperBound","lowerIndex","upperIndex","foundSliceIndex","sliced","insertIndex","prevSlice","nextSlice","sliceOffset","findSliceOffset","sliceStart","sliceEnd","bottomWasMeantToLoad","topFulfilled","bottomFulfilled","updateMessagePoll","poll_id","saveResults","rQuestion","chosenIndexes","answer","chosen","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","optionIds","answers","option","sendVote","votesList","closed","newPoll","getInputMediaPoll","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","performance","possiblePromise","process","apply","realResult","timedChunk","isFilterAvailable","requireBlurPromise","fastBlurFunc","processBlurNext","radius","iterations","alpha","default","blurPromises","dataUri","onload","contexts","links","originalPayload","refreshReference","postMessage","reference","getContexts","_context","getReferenceByLink","values","next","hex","newHex","newContext","template","content","SDP","session","mediaSections","lines","line","parsed","section","splitStringByLimitWithRest","separator","UniqueNumberGenerator","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","port","protocol","ids","missed","rest","nestedMap","makeAttributes","innerParts","fillAttributes","attributesMap","linesArray","mediaLineParts","direction","exists","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","test","isIncorrectSdpLine","parseSdpLine","getStream","constraints","muted","stream","mediaDevices","getUserMedia","getTracks","toTelegramSource","source","fromTelegramSource","parseMediaSectionInfo","sdp","clientInfo","lookupAttributeKeys","fingerprint","setup","ssrc","telegramSourceGroups","sdpLines","semantics","sources","parseSourceGroups","raw","ufrag","pwd","sourceGroups","fixLocalOffer","offer","hasMunged","generator","mediaType","isSending","originalSsrcs","ssrcs","generate","ssrcs2","ssrcsStrLines","ssrc2","addSimulcast","mediaLine","localMLine","codecIds","generateMediaFirstLine","sectionInfo","newData","transport","fingerprints","candidates","setPort","setSource","setDirection","newChannel","addSsrcEntry","mungedSdp","getConnectionTypeForMediaType","payloadIds","joiner","newLine","strs","foundation","component","toUpperCase","priority","ip","generation","performCandidate","sId","bundleMids","bundle","skipCandidates","candidate","addCandidate","streamName","addSource","addMsid","ssrcGroup","isAnswer","isApplication","codec","isInactive","shouldBeSkipped","payloadTypes","addTransport","hdrexts","hdrext","uri","clockrate","channels","parameters","fbs","fb","subtype","addSsrc","conference","addHeader","sessionId","addConference","originalDirection","endpoint","connection","transceiver","addTransceiver","entriesByMid","entriesBySource","entriesByPeerId","setPeerId","fromConference","AudioStreamAnalyser","streamSource","createMediaStreamSource","analyser","createAnalyser","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","fftSize","connect","interval","getAmplitude","streamAnalyser","track","array","frequencyBinCount","getByteFrequencyData","scale","rms","sqrt","analyse","counter","amplitudes","AudioContext","webkitAudioContext","outputStream","MediaStream","addTrack","inputStream","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","substring","oldTrack","addStream","timer","transceiverInit","streams","types","tracks","findEntry","createEntry","createTransceiver","sender","replaceTrack","connections","isSpeakingMap","player","groupCallId","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","instance","pinnedSource","main","iceConnectionState","connectionState","CLOSED","can_self_unmute","MUTED","UNMUTED","MUTED_BY_ADMIN","CONNECTING","getCachedParticipants","streamManager","hasInputTrackKind","presentation","toggleMuted","source_groups","getElement","clone","srcObject","groupCall","bindPrefix","raise","editParticipant","raiseHand","getDisplayMedia","frameRate","getScreenStream","connectionInstance","createConnectionInstance","createPeerConnection","negotiate","getVideoTracks","stopScreenSharing","createDescription","addInputVideoStream","startScreenSharingPromise","startScreenSharingInternal","unpinSource","closeConnectionAndStream","saveApiParticipant","getGroupCallInput","isSharingScreen","startScreenSharing","getVideoConstraints","videoPaused","videoStopped","startVideoSharingPromise","startVideoSharingInternal","stopTrack","appendToConference","description","isSharingVideo","stopVideoSharing","startVideoSharing","discard","rejoin","isDiscarded","groupCallInput","join_as","video_stopped","event","tryAddTrack","isOutput","tagName","isVideo","elementEndpoint","useStream","sinkId","outputDeviceId","setSinkId","appendChild","getEntryBySource","getSenders","doNotDispatchParticipantUpdate","hasLeft","oldSsrcs","makeSsrcFromParticipant","pinSource","hangUp","setMuted","makeSsrcsFromParticipant","modifiedTypes","oldSsrc","oldSource","oldEntry","setEntrySource","setEntryPeerId","setEndpoint","updateConstraints","negotiateThrottled","RTCPeerConnection","iceServers","iceTransportPolicy","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","signalingState","dataChannel","createDataChannel","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","localSdp","mainChannels","processedChannels","processed","JSON","stringify","processMediaSection","audioChannel","videoChannel","useChannel","parse","request","joinVideo","setData","extmap","performExtmap","filterServerCodecs","negotiating","isNewConnection","getEntryByMid","originalOffer","createOffer","iceRestart","setLocalDescription","invokeJoinGroupCall","entriesToDelete","answerDescription","generateSdp","deleteEntry","iceGatheringState","setRemoteDescription","colibriClass","defaultConstraints","maxHeight","onStageEndpoints","minHeight","saveInputVideoStream","appendStreamToConference","stopStream","closeConnection","stopStreamManager","audio_source","groupCalls","nextOffsets","updateGroupCall","updateGroupCallParticipants","saveApiParticipants","currentGroupCall","setCurrentGroupCall","stopConnectingSound","playSound","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","skipCounterUpdating","oldParticipant","isCurrentGroupCall","onParticipantUpdate","getGroupCall","modified","just_joined","apiParticipants","isUpdatingMeInCurrentCall","isSharingAudio","raise_hand_rating","generateSelfVideo","getInputPeerSelf","raise_hand","video_paused","presentation_paused","presentationPaused","participants_next_offset","oldCall","shouldUpdate","Audio","play","connectionAudio","ASSETS_PATH","loop","pause","channelCount","constraint","getSupportedConstraints","constraintSupported","getAudioConstraints","joinGroupCallInternal","getGroupCallFull","startConnectingSound","onTrack","getGroupCallParticipants","handleUpdateGroupCallParticipants","updatingSdp","audioSource","mainSources","presentationSources","tsNow","generateSsrc","prepareToSavingNextOffset","groupCallParticipants","next_offset","changeUserMuted","getParticipantByPeerId","opusDecodeController","sampleRate","tasks","keepAlive","isPlaySupportedResult","canPlayType","wavWorker","Worker","page","onTaskEnd","worker","command","buffers","typedArray","buffer","loadWorker","loadWavWorker","terminateWorkers","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","dataBlob","photoTypeSet","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","rTitle","contextHashtag","matches","shortDescriptionText","rDescription","contextSite","pendingSet","IMAGE_MIME_TYPES_SUPPORTED","bpe","mask","int2bigInt","bits","minSize","buff","copyInt_","isObject","object","VIDEO_MIME_TYPES_SUPPORTED"],"mappings":"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","file":"6.d600026c8e100eea4159.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cleanUsername(username: string) {\r\n return username && username.toLowerCase() || '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { filterUnique, indexOfAndSplice } from \"../../helpers/array\";\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\nimport cleanSearchText from \"../../helpers/cleanSearchText\";\nimport cleanUsername from \"../../helpers/cleanUsername\";\nimport { tsNow } from \"../../helpers/date\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport { safeReplaceObject, isObject } from \"../../helpers/object\";\nimport { Chat, InputContact, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus } from \"../../layer\";\nimport I18n, { i18n, LangPackKey } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager {\n private storage = appStateManager.storages.users;\n \n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: UserId};\n private contactsIndex: SearchIndex;\n private contactsFillPromise: CancellablePromise;\n private contactsList: Set;\n private updatedContactsList: boolean;\n \n private getTopPeersPromises: {[type in TopPeerType]?: Promise};\n\n constructor() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n rootScope.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= serverTimeManager.serverTimeOffset;\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } //////else console.warn('No user by id:', userId);\n },\n\n updateUserPhoto: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n\n if(update.photo._ === 'userProfilePhotoEmpty') {\n delete user.photo;\n } else {\n user.photo = safeReplaceObject(user.photo, update.photo);\n }\n\n this.setUserToStateIfNeeded(user);\n\n rootScope.dispatchEvent('user_update', userId);\n rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n } else console.warn('No user by id:', userId);\n },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n \n this.saveApiUser(Object.assign({}, user, {\n first_name: update.first_name,\n last_name: update.last_name,\n username: update.username\n }), true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n appStateManager.getState().then((state) => {\n const users = appStateManager.storagesResults.users;\n if(users.length) {\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(user) {\n this.users[user.id] = user;\n }\n }\n }\n\n const contactsList = state.contactsList;\n if(contactsList && Array.isArray(contactsList)) {\n contactsList.forEach(userId => {\n this.pushContact(userId);\n });\n\n if(contactsList.length) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n \n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const users = appStateManager.storagesResults.users;\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!appStateManager.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n if(user.username) {\n delete this.usernames[cleanUsername(user.username)];\n }\n\n users.findAndSplice((user) => user.id === userId);\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n \n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n }\n\n private onContactsModified() {\n const contactsList = [...this.contactsList];\n appStateManager.pushToState('contactsList', contactsList);\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise>();\n apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n \n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified();\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise || (this.contactsFillPromise = promise)\n };\n }\n\n public resolveUsername(username: string): Promise {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n if(this.usernames[username]) {\n return Promise.resolve(this.users[this.usernames[username]]);\n }\n\n return apiManager.invokeApi('contacts.resolveUsername', {username}).then(resolvedPeer => {\n this.saveApiUsers(resolvedPeer.users);\n appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return appPeersManager.getPeer(appPeersManager.getPeerId(resolvedPeer.peer));\n });\n }\n\n public pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n appStateManager.requestPeerSingle(id.toPeerId(), 'contact');\n }\n\n public popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n appStateManager.releaseSinglePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n user.username,\n user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then(_contactsList => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter(id => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId1).status);\n const status2 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = rootScope.myId.toUserId();\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters[0], \n includeSaved?: Parameters[1], \n sortBy?: Parameters[2]) {\n return this.getContacts(query, includeSaved, sortBy).then(userIds => {\n return userIds.map(userId => userId.toPeerId(false));\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: appPeersManager.getInputPeerById(peerId)\n }).then(value => {\n if(value) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n 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 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] = userId;\n }\n }\n\n if(!oldUser \n || oldUser.initials === undefined \n || oldUser.sortName === undefined \n || oldUser.first_name !== user.first_name \n || oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false); \n user.initials = RichTextProcessor.getAbbreviation(fullName);\n } else {\n user.sortName = oldUser.sortName;\n user.initials = oldUser.initials;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= serverTimeManager.serverTimeOffset;\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n let changedPhoto = false, changedTitle = false;\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n if(user.first_name !== oldUser.first_name \n || user.last_name !== oldUser.last_name \n || user.username !== oldUser.username) {\n changedTitle = true;\n }\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n \n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n }\n\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', user.id.toPeerId());\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());\n }\n\n this.setUserToStateIfNeeded(user);\n }\n\n public setUserToStateIfNeeded(user: User) {\n if(appStateManager.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n status = this.getUser(status).status;\n }\n\n if(status) {\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\n if(expires) {\n return expires;\n }\n\n /* const timeNow = tsNow(true);\n switch(status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n } */\n switch(status._) {\n case 'userStatusRecently':\n return 3;\n case 'userStatusLastWeek':\n return 2;\n case 'userStatusLastMonth':\n return 1;\n }\n }\n\n return 0;\n }\n\n public getUser(id: User | UserId) {\n if(isObject(id)) {\n return id;\n }\n\n return this.users[id] || {id, pFlags: {deleted: true}, access_hash: ''} as User;\n }\n\n public getSelf() {\n return this.getUser(rootScope.myId);\n }\n\n public getUserStatusString(id: UserId): HTMLElement {\n let key: LangPackKey;\n let args: any[];\n\n switch(id) {\n case REPLIES_PEER_ID:\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID:\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(this.isBot(id)) {\n key = 'Bot';\n break;\n }\n\n const user = this.getUser(id);\n if(!user) {\n key = '' as any;\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n \n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n \n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n \n case 'userStatusOffline': {\n const date = user.status.was_online;\n const now = Date.now() / 1000;\n \n if((now - date) < 60) {\n key = 'Peer.Status.justNow';\n } else if((now - date) < 3600) {\n key = 'Peer.Status.minAgo';\n const c = (now - date) / 60 | 0;\n args = [c];\n } else if(now - date < 86400) {\n key = 'LastSeen.HoursAgo';\n const c = (now - date) / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const d = new Date(date * 1000);\n args = [('0' + d.getDate()).slice(-2) + '.' + ('0' + (d.getMonth() + 1)).slice(-2), \n ('0' + d.getHours()).slice(-2) + ':' + ('0' + d.getMinutes()).slice(-2)];\n }\n \n break;\n }\n \n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n \n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n \n return i18n(key, args);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n \n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id.toPeerId() !== rootScope.myId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public canSendToUser(id: UserId) {\n const user = this.getUser(id);\n return !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID;\n }\n\n public getUserPhoto(id: UserId) {\n const user = this.getUser(id);\n\n return user && user.photo || {\n _: 'userProfilePhotoEmpty'\n };\n }\n\n public getUserString(id: UserId) {\n const user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n\n public getUserInput(id: UserId): InputUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputUserSelf'};\n }\n\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputPeerSelf'};\n }\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n public updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n public updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user &&\n user.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n \n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then(userIds => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n //console.log(result);\n this.saveApiUsers(result.users);\n appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = appPeersManager.getPeerId(topPeer.peer);\n appStateManager.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n \n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n appStateManager.pushToState('topPeersCache', state.topPeersCache);\n \n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then(contactsBlocked => {\n this.saveApiUsers(contactsBlocked.users);\n appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map(u => u.id.toPeerId()).concat(contactsBlocked.chats.map(c => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n /* public 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 return apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then(peers => {\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map(p => appPeersManager.getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map(p => appPeersManager.getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, showPhone?: true) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: showPhone\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map(userId => this.getUserInput(userId))\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach(userId => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n}\n\nconst appUsersManager = new AppUsersManager();\nMOUNT_CLASS_TO.appUsersManager = appUsersManager;\nexport default appUsersManager\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { Chat, DialogPeer, Message, MessagesPeerDialogs, Update } from \"../../layer\";\nimport type { AppChatsManager } from \"../appManagers/appChatsManager\";\nimport type { AppMessagesManager, Dialog, MyMessage } from \"../appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\nimport type { AppDraftsManager } from \"../appManagers/appDraftsManager\";\nimport type { AppNotificationsManager } from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport type { ServerTimeManager } from \"../mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../appManagers/appMessagesIdsManager\";\nimport { tsNow } from \"../../helpers/date\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport SearchIndex from \"../searchIndex\";\nimport { forEachReverse, indexOfAndSplice, insertInDescendSortedArray } from \"../../helpers/array\";\nimport rootScope from \"../rootScope\";\nimport { defineNotNumerableProperties, safeReplaceObject } from \"../../helpers/object\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\nimport { SliceEnd } from \"../../helpers/slicedArray\";\nimport { MyDialogFilter } from \"./filters\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport { NoneToVoidFunction } from \"../../types\";\nimport ctx from \"../../environment/ctx\";\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: Dialog[],\n id: number,\n unreadMessagesCount: number,\n unreadDialogsCount: number,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: number = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage {\n private storage: AppStateManager['storages']['dialogs'];\n \n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder} = {};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n constructor(\n private appMessagesManager: AppMessagesManager, \n private appChatsManager: AppChatsManager, \n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager,\n private appDraftsManager: AppDraftsManager,\n private appNotificationsManager: AppNotificationsManager,\n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager,\n private serverTimeManager: ServerTimeManager,\n private appMessagesIdsManager: AppMessagesIdsManager\n ) {\n this.storage = this.appStateManager.storages.dialogs;\n this.dialogs = this.storage.getCache();\n this.clear(true);\n\n rootScope.addEventListener('language_change', () => {\n const peerId = appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n for(let i = 0; i <= 10; ++i) {\n const indexKey = `index_${i}` as ReturnType;\n dialog[indexKey] = undefined;\n }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n rootScope.addEventListener('filter_update', onFilterUpdate);\n rootScope.addEventListener('filter_new', onFilterUpdate);\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = `index_${filter.orderIndex}` as const;\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const chat: Chat.chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if(chat.pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n });\n\n appStateManager.getState().then((state) => {\n this.pinnedOrders = state.pinnedOrders || {};\n if(!this.pinnedOrders[0]) this.pinnedOrders[0] = [];\n if(!this.pinnedOrders[1]) this.pinnedOrders[1] = [];\n \n const dialogs = appStateManager.storagesResults.dialogs;\n if(dialogs.length) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(dialog) {\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = this.appMessagesIdsManager.getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 10; ++i) {\n // @ts-ignore\n delete dialog[`index_${i}`];\n }\n \n this.saveDialog(dialog, undefined, true);\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(message.deleted) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n });\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[0] = loaded;\n this.allDialogsLoaded[1] = loaded;\n } else {\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(this.allDialogsLoaded[0] && this.allDialogsLoaded[1]) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear(init = false) {\n this.pinnedOrders = {\n 0: [],\n 1: []\n };\n\n if(!init) {\n const dialogs = this.appStateManager.storagesResults.dialogs;\n dialogs.length = 0;\n this.storage.clear();\n\n this.setDialogsLoaded(0, false);\n this.setDialogsLoaded(1, false);\n this.setDialogsLoaded(GLOBAL_FOLDER_ID, false);\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n }\n\n this.folders = {};\n this.dialogsOffsetDate = {};\n this.dialogsNum = 0;\n this.dialogsIndex = new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n this.cachedResults = {\n query: '',\n count: 0,\n dialogs: [],\n folderId: 0\n };\n }\n\n public handleDialogUnpinning(dialog: Dialog, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.pinnedOrders[folderId], dialog.peerId);\n this.savePinnedOrders();\n }\n\n public savePinnedOrders() {\n this.appStateManager.pushToState('pinnedOrders', this.pinnedOrders);\n }\n\n public resetPinnedOrder(folderId: number) {\n this.pinnedOrders[folderId] = [];\n }\n\n public getPinnedOrders(folderId: number) {\n return this.pinnedOrders[folderId];\n }\n\n public getOffsetDate(folderId: number): number {\n const offsetDate = this.dialogsOffsetDate[folderId] || 0;\n if(folderId === GLOBAL_FOLDER_ID && !offsetDate) { // make request not from beginning if we have loaded some dialogs\n return Math.min(this.getOffsetDate(0), this.getOffsetDate(1));\n }\n\n return offsetDate;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ?? (this.folders[id] = {dialogs: [], id, unreadMessagesCount: 0, unreadDialogsCount: 0});\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Dialog[] {\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\n return this.getCachedDialogs(skipMigrated);\n }\n\n const folder = this.getFolder(id);\n return skipMigrated ? folder.dialogs.filter(dialog => dialog.migratedTo === undefined) : folder.dialogs;\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n return this.getFolderDialogs(0, skipMigrated).concat(this.getFolderDialogs(1, skipMigrated));\n }\n\n private setDialogIndexInFilter(dialog: Dialog, indexKey: ReturnType, filter: MyDialogFilter) {\n let index: number;\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIndex = filter.pinnedPeerIds.indexOf(dialog.peerId);\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(filter.pinned_peers.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned) {\n index = this.generateIndexForDialog(dialog, true);\n } else {\n index = dialog.index;\n }\n }\n\n return dialog[indexKey] = index;\n }\n\n public getDialog(peerId: PeerId, folderId?: number, skipMigrated = true): [Dialog, number] | [] {\n const folders: Dialog[][] = [];\n\n if(folderId === undefined) {\n folders.push(this.getFolder(0).dialogs, this.getFolder(1).dialogs);\n } else {\n folders.push(this.getFolderDialogs(folderId, false));\n }\n\n for(let folder of folders) {\n let i = 0, skipped = 0;\n for(let length = folder.length; i < length; ++i) {\n const dialog = folder[i];\n if(dialog.peerId === peerId) {\n return [dialog, i - skipped];\n } else if(skipMigrated && dialog.migratedTo !== undefined) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n if(date === undefined) {\n date = tsNow(true) + this.serverTimeManager.serverTimeOffset;\n }\n\n return (date * 0x10000) + (isPinned ? 0 : ((++this.dialogsNum) & 0xFFFF));\n }\n\n public processDialogForFilters(dialog: Dialog) {\n // let perf = performance.now();\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const indexKey = this.getDialogIndexKey(filter.id);\n const folder = this.getFolder(filter.id);\n const dialogs = folder.dialogs;\n\n const wasIndex = dialogs.findIndex(d => d.peerId === dialog.peerId);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = wasDialog && wasDialog[indexKey];\n\n const newDialogIndex = this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return;\n }\n\n if((!wasDialogIndex && newDialogIndex) || (wasIndex && !newDialogIndex)) {\n this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, indexKey, wasIndex);\n }\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog) {\n const callbacks: NoneToVoidFunction[] = [\n this.prepareFolderUnreadCountModifyingByDialog(dialog.folder_id, dialog)\n ];\n\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog));\n }\n }\n\n return () => callbacks.forEach(callback => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n \n if(toggle !== undefined) {\n this.modifyFolderUnreadCount(folderId, toggle ? wasUnreadCount : -wasUnreadCount, wasUnreadCount ? (toggle ? 1 : -1) : 0);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n const addDialogsCount = (newUnreadCount && !wasUnreadCount) || (!newUnreadCount && wasUnreadCount) ? (wasUnreadCount ? -1 : 1) : 0;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, addDialogsCount);\n };\n }\n\n public modifyFolderUnreadCount(folderId: number, addMessagesCount: number, addDialogsCount: number) {\n if(!addMessagesCount && !addDialogsCount) {\n return;\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n \n if(addDialogsCount) {\n folder.unreadDialogsCount = Math.max(0, folder.unreadDialogsCount + addDialogsCount);\n }\n\n if(folder.dispatchUnreadTimeout === undefined) {\n folder.dispatchUnreadTimeout = ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n rootScope.dispatchEvent('folder_unread', folder);\n }, 0);\n }\n }\n\n public generateIndexForDialog(dialog: Dialog, justReturn = false, message?: MyMessage) {\n let topDate = 0, isPinned: boolean;\n if(dialog.pFlags.pinned && !justReturn) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n if(!message) {\n message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n \n topDate = (message as Message.message).date || topDate;\n\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n \n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n if(!topDate) {\n topDate = tsNow(true);\n }\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n dialog.index = index;\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog) {\n const order = this.pinnedOrders[dialog.folder_id];\n\n const foundIndex = order.indexOf(dialog.peerId);\n let pinnedIndex = foundIndex;\n if(foundIndex === -1) {\n pinnedIndex = order.push(dialog.peerId) - 1;\n this.savePinnedOrders();\n }\n\n return this.generateDialogPinnedDateByIndex(pinnedIndex);\n }\n\n /* public generateDialog(peerId: PeerId) {\n const dialog: Dialog = {\n _: 'dialog',\n pFlags: {},\n peer: this.appPeersManager.getOutputPeer(peerId),\n top_message: 0,\n read_inbox_max_id: 0,\n read_outbox_max_id: 0,\n unread_count: 0,\n unread_mentions_count: 0,\n notify_settings: {\n _: 'peerNotifySettings',\n },\n };\n\n return dialog;\n } */\n\n public setDialogToState(dialog: Dialog) {\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(!message.pFlags.is_outgoing && !message.deleted/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n \n const fromId = message.viaBotId || message.fromId;\n if(fromId !== peerId) {\n this.appStateManager.requestPeerSingle(fromId, 'topMessage', peerId);\n }\n \n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.appStateManager.requestPeerSingle(peerId, 'dialog');\n\n /* for(let id in this.appMessagesManager.filtersStorage.filters) {\n const filter = this.appMessagesManager.filtersStorage.filters[id];\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n \n }\n } */\n }\n\n public pushDialog(dialog: Dialog, offsetDate?: number, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const {folder_id, peerId} = dialog;\n const dialogs = this.getFolderDialogs(folder_id, false);\n const pos = dialogs.findIndex(d => d.peerId === peerId);\n if(pos !== -1) {\n dialogs.splice(pos, 1);\n }\n \n //if(!this.dialogs[peerId]) {\n this.dialogs[peerId] = dialog;\n \n this.setDialogToState(dialog);\n //}\n\n if(offsetDate === undefined) {\n offsetDate = this.getDialogOffsetDate(dialog);\n }\n\n this.processDialogForFilters(dialog);\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(saveGlobalOffset) {\n const savedGlobalOffsetDate = this.dialogsOffsetDate[GLOBAL_FOLDER_ID];\n if(!savedGlobalOffsetDate || offsetDate < savedGlobalOffsetDate) {\n this.dialogsOffsetDate[GLOBAL_FOLDER_ID] = offsetDate;\n }\n }\n\n const savedOffsetDate = this.dialogsOffsetDate[folder_id];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folder_id)) {\n this.clearDialogFromState(dialog, true);\n return;\n }\n \n this.dialogsOffsetDate[folder_id] = offsetDate;\n }\n }\n\n if(pos === -1) {\n this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n }\n\n /* const newPos = */insertInDescendSortedArray(dialogs, dialog, 'index', pos);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialog(peerId: PeerId): ReturnType {\n const foundDialog = this.getDialog(peerId, undefined, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n delete this.dialogs[peerId];\n\n const folder = this.getFolder(dialog.folder_id);\n folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.pinnedOrders[dialog.folder_id], peerId) !== undefined;\n \n this.processDialogForFilters(dialog);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n\n this.clearDialogFromState(dialog, false);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog, keepLocal: boolean) {\n const peerId = dialog.peerId;\n this.appStateManager.releaseSinglePeer(peerId, 'topMessage');\n this.appStateManager.releaseSinglePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId) {\n const dropped = this.dropDialog(peerId);\n if(dropped.length) {\n rootScope.dispatchEvent('dialog_drop', {peerId, dialog: dropped[0]});\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId) {\n this.dropDialogWithEvent(peerId);\n rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(dialogsResult.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n dialogsResult.dialogs.splice(idx, 1);\n }\n });\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.appMessagesManager.saveMessages(dialogsResult.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n (dialogsResult.dialogs as Dialog[]).forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMessage = dialog.top_message;\n\n const topPendingMessage = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMessage) {\n if(!topMessage \n || (this.appMessagesManager.getMessageByPeer(peerId, topPendingMessage) as MyMessage).date > (this.appMessagesManager.getMessageByPeer(peerId, topMessage) as MyMessage).date) {\n dialog.top_message = topMessage = topPendingMessage;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMessage;\n }\n }\n\n /* const d = Object.assign({}, dialog);\n if(peerId === 239602833) {\n this.log.error('applyConversation lun', dialog, d);\n } */\n\n if(topMessage || (dialog.draft && dialog.draft._ === 'draftMessage')) {\n this.saveDialog(dialog);\n updatedDialogs[peerId] = dialog;\n } else {\n this.dropDialogWithEvent(peerId);\n }\n\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n if(updates !== undefined) {\n for(const update of updates) {\n this.apiUpdatesManager.saveUpdate(update);\n }\n\n delete this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n }\n });\n\n if(Object.keys(updatedDialogs).length) {\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n public getDialogOffsetDate(dialog: Dialog) {\n return this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message).date || 0;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog(dialog: Dialog, folderId = dialog.folder_id ?? 0, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return;\n }\n\n if(dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n \n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(chat._ === 'channelForbidden' /* || chat._ === 'chatForbidden' */ || (chat as Chat.chat).pFlags.left || (chat as Chat.chat).pFlags.kicked) {\n return;\n }\n }\n\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n\n const wasDialogBefore = this.getDialogOnly(peerId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = this.appMessagesIdsManager.generateMessageId(dialog.top_message);//dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(!channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = this.appPeersManager.getPeerId(chat.migrated_to);\n this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer;\n this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId;\n dialog.migratedTo = migratedToPeer;\n //return;\n }\n }\n\n dialog.top_message = mid;\n // dialog.unread_count = wasDialogBefore && dialog.read_inbox_max_id === this.appMessagesIdsManager.getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? wasDialogBefore.folder_id : folderId;\n }/* else if(dialog._ === 'dialogFolder') {\n dialog.folder_id = dialog.folder.id;\n } */\n }\n\n dialog.draft = this.appDraftsManager.saveDraft(peerId, 0, dialog.draft);\n dialog.peerId = peerId;\n\n // Because we saved message without dialog present\n if(message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId, \n settings: dialog.notify_settings\n });\n\n if(channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n defineNotNumerableProperties(dialog, [\n 'index_0',\n 'index_1',\n 'index_2',\n 'index_3',\n 'index_4',\n 'index_5',\n 'index_6',\n 'index_7',\n 'index_8',\n 'index_9',\n 'index_10'\n ]);\n\n if(wasDialogBefore) {\n safeReplaceObject(wasDialogBefore, dialog);\n }\n\n this.pushDialog(dialog, message.date, ignoreOffsetDate, saveGlobalOffset);\n }\n\n public getDialogIndexKey(filterId: number) {\n const indexStr = filterId > 1 ? \n `index_${this.appMessagesManager.filtersStorage.getFilter(filterId).orderIndex}` as const : \n 'index' as const;\n\n return indexStr;\n }\n\n public getDialogs(query = '', offsetIndex?: number, limit = 20, folderId = 0, skipMigrated = false): {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } {\n const ret: {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } = {} as any;\n\n if(folderId > 1) {\n const promises: Promise[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.appMessagesManager.filtersStorage.reloadMissingPeerIds(folderId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n ret.cached = false;\n ret.promise = Promise.all(promises).then(() => {\n return this.getDialogs(query, offsetIndex, limit, folderId, skipMigrated).promise;\n });\n\n return ret;\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId = folderId > 1 || this.getOffsetDate(folderId) ? GLOBAL_FOLDER_ID : folderId;\n let curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n\n const indexStr = this.getDialogIndexKey(folderId);\n\n if(query) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== folderId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = folderId;\n\n const results = this.dialogsIndex.search(query);\n\n const dialogs: Dialog[] = [];\n for(const peerId in this.dialogs) {\n const dialog = this.dialogs[peerId];\n if(results.has(dialog.peerId) && dialog.folder_id === folderId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => d2[indexStr] - d1[indexStr]);\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n ret.cached = true;\n ret.promise = Promise.resolve({\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n });\n\n return ret;\n }\n\n ret.cached = false;\n ret.promise = this.appMessagesManager.getTopMessages(limit, realFolderId).then(result => {\n //const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n //this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n\n return ret;\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n //this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = this.appPeersManager.getPeerId(peer);\n const dialog = this.dropDialog(peerId)[0];\n if(dialog) {\n if(dialog.pFlags?.pinned) {\n this.handleDialogUnpinning(dialog, folder_id);\n }\n\n dialog.folder_id = folder_id;\n this.generateIndexForDialog(dialog);\n this.pushDialog(dialog); // need for simultaneously updatePinnedDialogs\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n });\n };\n\n private onUpdateDialogPinned = (update: Update.updateDialogPinned) => {\n const folderId = update.folder_id ?? 0;\n //this.log('updateDialogPinned', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter\n /* if(update.folder_id > 1) {\n const filter = this.filtersStorage.filters[update.folder_id];\n if(update.pFlags.pinned) {\n filter.pinned_peers.unshift(peerId);\n } else {\n filter.pinned_peers.findAndSplice(p => p === peerId);\n }\n } */\n\n if(dialog) {\n if(!update.pFlags.pinned) {\n this.handleDialogUnpinning(dialog, folderId);\n } else { // means set\n dialog.pFlags.pinned = true;\n }\n\n this.generateIndexForDialog(dialog);\n } \n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? 0;\n \n const handleOrder = (order: PeerId[]) => {\n this.pinnedOrders[folderId].length = 0;\n order.reverse(); // index must be higher\n order.forEach((peerId) => {\n newPinned[peerId] = true;\n \n const dialog = this.getDialogOnly(peerId);\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n if(!dialog) {\n return;\n }\n \n dialog.pFlags.pinned = true;\n this.generateIndexForDialog(dialog);\n });\n \n const dialogs = this.getFolderDialogs(folderId, false);\n for(const dialog of dialogs) {\n if(!dialog.pFlags.pinned) {\n break;\n }\n\n const peerId = dialog.peerId;\n if(!newPinned[peerId]) {\n this.appMessagesManager.scheduleHandleNewDialogs(peerId);\n }\n }\n };\n\n //this.log('updatePinnedDialogs', update);\n const newPinned: {[peerId: PeerId]: true} = {};\n if(!update.order) {\n apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n handleOrder(dialogsResult.dialogs.map(d => d.peerId));\n\n /* dialogsResult.dialogs.forEach((dialog) => {\n newPinned[dialog.peerId] = true;\n });\n\n this.dialogsStorage.getFolder(folderId).forEach((dialog) => {\n const peerId = dialog.peerId;\n if(dialog.pFlags.pinned && !newPinned[peerId]) {\n this.newDialogsToHandle[peerId] = {reload: true};\n this.scheduleHandleNewDialogs();\n }\n }); */\n });\n\n return;\n }\n\n //this.log('before order:', this.dialogsStorage[0].map(d => d.peerId));\n\n handleOrder(update.order.map(peer => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { copy, safeReplaceObject } from \"../../helpers/object\";\nimport type { DialogFilter, Update } from \"../../layer\";\nimport type { Modify } from \"../../types\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\n//import type { ApiManagerProxy } from \"../mtproto/mtprotoworker\";\nimport type _rootScope from \"../rootScope\";\nimport type {AppMessagesManager, Dialog} from '../appManagers/appMessagesManager';\nimport type {AppNotificationsManager} from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { forEachReverse } from \"../../helpers/array\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\n\nexport type MyDialogFilter = Modify;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'], \n ['exclude_peers', 'excludePeerIds'], \n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\n// ! because 0 index is 'All Chats'\nconst START_ORDER_INDEX = 1;\n\nexport default class FiltersStorage {\n public filters: {[filterId: string]: MyDialogFilter};\n private orderIndex: number;\n private reloadedPeerIds: Set;\n\n constructor(private appMessagesManager: AppMessagesManager,\n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager, \n private appNotificationsManager: AppNotificationsManager, \n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager, \n /* private apiManager: ApiManagerProxy, */ \n private rootScope: typeof _rootScope) {\n this.clear();\n this.filters = {};\n\n this.appStateManager.getState().then((state) => {\n safeReplaceObject(this.filters, state.filters);\n\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n if(filter.hasOwnProperty('orderIndex') && filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n\n /* this.appMessagesManager.dialogsStorage.folders[+filterId] = {\n dialogs: []\n }; */\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: (update) => {\n //console.warn('updateDialogFilters', update);\n\n const oldFilters = copy(this.filters);\n\n this.getDialogFilters(true).then(filters => {\n for(const _filterId in oldFilters) {\n const filterId = +_filterId;\n if(!filters.find(filter => filter.id === filterId)) { // * deleted\n this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});\n }\n }\n\n this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map(filter => filter.id)});\n });\n },\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach(arr => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(this.appPeersManager.getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n }\n\n public clear(init = false) {\n if(!init) {\n safeReplaceObject(this.filters, {});\n }\n\n this.orderIndex = START_ORDER_INDEX;\n this.reloadedPeerIds = new Set();\n }\n\n private onUpdateDialogFilter = (update: Update.updateDialogFilter) => {\n if(update.filter) {\n this.saveDialogFilter(update.filter as any);\n } else if(this.filters[update.id]) { // Папка удалена\n //this.getDialogFilters(true);\n this.rootScope.dispatchEvent('filter_delete', this.filters[update.id]);\n delete this.filters[update.id];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n //console.log('updateDialogFilterOrder', update);\n\n this.orderIndex = START_ORDER_INDEX;\n update.order.forEach((filterId, idx) => {\n const filter = this.filters[filterId];\n delete filter.orderIndex;\n this.setOrderIndex(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', update.order);\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n public testDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && dialog.folder_id === 1) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted) {\n const isMuted = this.appNotificationsManager.isPeerLocalMuted(peerId);\n if(isMuted) {\n return false;\n }\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n \n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n \n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n \n if(!wasPinned) {\n if(filter.pinned_peers.length >= this.rootScope.config.pinned_infolder_count_max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n \n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n \n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map(i => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n //console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.orderIndex;\n f.push(filter);\n }\n\n filter.orderIndex = START_ORDER_INDEX;\n\n const order = f.sort((a, b) => a.orderIndex - b.orderIndex).map(filter => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n }\n\n return bool;\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n public reloadMissingPeerIds(filterId: number) {\n const promises: Promise[] = [];\n const filter = this.getFilter(filterId);\n const pinnedPeers = filter?.pinned_peers;\n if(pinnedPeers?.length) {\n const reloadDialogs = pinnedPeers.filter((inputPeer, idx) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n return !this.reloadedPeerIds.has(peerId) && !this.appMessagesManager.getDialogOnly(peerId);\n });\n\n if(reloadDialogs.length) {\n const reloadPromises = reloadDialogs.map(inputPeer => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer);\n promise.then(() => {\n this.reloadedPeerIds.add(peerId);\n });\n return promise;\n });\n const reloadPromise = Promise.all(reloadPromises);\n promises.push(reloadPromise);\n }\n }\n\n return promises.length ? Promise.all(promises) : undefined;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length && !overwrite) {\n return keys.map(filterId => this.filters[filterId]).sort((a, b) => a.orderIndex - b.orderIndex);\n }\n\n const filters: MyDialogFilter[] = await apiManager.invokeApiSingle('messages.getDialogFilters') as any;\n for(const filter of filters) {\n this.saveDialogFilter(filter, overwrite);\n }\n\n //console.log(this.filters);\n return filters;\n }\n\n public saveDialogFilter(filter: MyDialogFilter, update = true) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n convertment.forEach(([from, to]) => {\n filter[to] = filter[from].map((peer) => this.appPeersManager.getPeerId(peer));\n });\n\n this.filterIncludedPinnedPeers(filter);\n \n filter.include_peers = filter.pinned_peers.concat(filter.include_peers);\n filter.includePeerIds = filter.pinnedPeerIds.concat(filter.includePeerIds);\n\n const oldFilter = this.filters[filter.id];\n if(oldFilter) {\n Object.assign(oldFilter, filter);\n } else {\n this.filters[filter.id] = filter;\n }\n \n this.setOrderIndex(filter);\n \n if(update) {\n this.rootScope.dispatchEvent('filter_update', filter);\n } else if(!oldFilter) {\n this.rootScope.dispatchEvent('filter_new', filter);\n }\n }\n\n public setOrderIndex(filter: MyDialogFilter) {\n if(filter.hasOwnProperty('orderIndex')) {\n if(filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n } else {\n filter.orderIndex = this.orderIndex++ as DialogFilter['orderIndex'];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport I18n, { i18n, join, LangPackKey } from \"../lib/langPack\";\r\nimport formatDuration, { DurationType } from \"./formatDuration\";\r\n\r\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\r\n s: 'Seconds',\r\n m: 'Minutes',\r\n h: 'Hours',\r\n d: 'Days',\r\n w: 'Weeks'\r\n};\r\nexport default function formatCallDuration(duration: number, plain?: boolean) {\r\n const a = formatDuration(duration, 2);\r\n if(plain) {\r\n const strings = a.map(d => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\r\n return join(strings, false, plain);\r\n }\r\n\r\n const elements = a.map(d => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\r\n\r\n const fragment = document.createElement('span');\r\n fragment.append(...join(elements, false));\r\n\r\n return fragment;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type DurationType = 's' | 'm' | 'h' | 'd' | 'w';\r\nexport default function formatDuration(duration: number, showLast = 2) {\r\n if(!duration) {\r\n duration = 1;\r\n }\r\n\r\n let d: {duration: number, type: DurationType}[] = [];\r\n const p = [\r\n {m: 1, t: 's'},\r\n {m: 60, t: 'm'}, \r\n {m: 60, t: 'h'}, \r\n {m: 24, t: 'd'}, \r\n {m: 7, t: 'w'}\r\n ] as Array<{m?: number, t: DurationType}>\r\n const s = 1;\r\n let t = s;\r\n p.forEach((o, idx) => {\r\n t *= o.m;\r\n\r\n if(duration < t) {\r\n return;\r\n }\r\n\r\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\r\n d.push({\r\n duration: (duration / t % modulus | 0),\r\n type: o.t\r\n });\r\n });\r\n\r\n const out = d.slice(-showLast).reverse();\r\n for(let i = out.length - 1; i >= 0; --i) {\r\n if(out[i].duration === 0) {\r\n out.splice(i, 1);\r\n }\r\n }\r\n \r\n return out;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { LazyLoadQueueBase } from \"../../components/lazyLoadQueue\";\nimport ProgressivePreloader from \"../../components/preloader\";\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\nimport { formatDateAccordingToTodayNew, formatTime, tsNow } from \"../../helpers/date\";\nimport { createPosterForVideo } from \"../../helpers/files\";\nimport { copy, getObjectKeysAndSort } from \"../../helpers/object\";\nimport { randomLong } from \"../../helpers/random\";\nimport { splitStringByLength, limitSymbols, escapeRegExp } from \"../../helpers/string\";\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 } from \"../../layer\";\nimport { InvokeApiOptions } from \"../../types\";\nimport I18n, { FormatterArguments, i18n, join, langPack, LangPackKey, _i18n } from \"../langPack\";\nimport { logger, LogTypes } from \"../logger\";\nimport type { ApiFileManager } from '../mtproto/apiFileManager';\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport DialogsStorage, { GLOBAL_FOLDER_ID } from \"../storages/dialogs\";\nimport FiltersStorage from \"../storages/filters\";\n//import { telegramMeWebService } from \"../mtproto/mtproto\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager, { ChatRights } from \"./appChatsManager\";\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport appPollsManager from \"./appPollsManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport appWebPagesManager from \"./appWebPagesManager\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport appProfileManager from \"./appProfileManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport SlicedArray, { Slice, SliceEnd } from \"../../helpers/slicedArray\";\nimport appNotificationsManager, { NotifyOptions } from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport { forEachReverse, indexOfAndSplice } from \"../../helpers/array\";\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\nimport htmlToSpan from \"../../helpers/dom/htmlToSpan\";\nimport { MUTE_UNTIL, NULL_PEER_ID, REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\nimport appAvatarsManager from \"./appAvatarsManager\";\nimport telegramMeWebManager from \"../mtproto/telegramMeWebManager\";\nimport { getMiddleware } from \"../../helpers/middleware\";\nimport assumeType from \"../../helpers/assumeType\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport type { MediaSize } from \"../../helpers/mediaSizes\";\nimport IMAGE_MIME_TYPES_SUPPORTED from \"../../environment/imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"../../environment/videoMimeTypesSupport\";\nimport './appGroupCallsManager';\nimport appGroupCallsManager from \"./appGroupCallsManager\";\n\n//console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude\n};\n\nexport type HistoryResult = {\n count: number,\n history: Slice,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty' \n | 'inputMessagesFilterPhotos' \n | 'inputMessagesFilterPhotoVideo' \n | 'inputMessagesFilterVideo' \n | 'inputMessagesFilterDocument' \n | 'inputMessagesFilterVoice' \n | 'inputMessagesFilterRoundVoice' \n | 'inputMessagesFilterRoundVideo' \n | 'inputMessagesFilterMusic' \n | 'inputMessagesFilterUrl' \n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\nexport class AppMessagesManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n public groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n public pinnedMessages: {[peerId: PeerId]: PinnedStorage};\n\n public threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage\n }\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise, \n callback: (message: any) => Promise\n }>\n }\n } = {};\n \n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise = null;\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newMessagesHandleTimeout = 0;\n private newMessagesToHandle: {[peerId: PeerId]: Set} = {};\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: {[peerId: PeerId]: Dialog} = {};\n public newUpdatesAfterReloadToHandle: {[peerId: PeerId]: Set} = {};\n\n private notificationsHandlePromise = 0;\n private notificationsToHandle: {[peerId: PeerId]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise;\n private reloadConversationsPeers: Map}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n public dialogsStorage: DialogsStorage;\n public filtersStorage: FiltersStorage;\n\n private groupedTempId = 0;\n\n private typings: {[peerId: PeerId]: {type: SendMessageAction['_'], timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[peerId: PeerId]: SlicedArray} = {};\n private goToNextMentionPromises: {[peerId: PeerId]: Promise} = {};\n\n constructor() {\n this.clear();\n\n rootScope.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages\n });\n\n // ! Invalidate notify settings, can optimize though\n rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: Dialog) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => dialog.peerId.isBroadcast();\n else filterFunc = (dialog) => appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach(dialog => {\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage', \n webpage: appWebPagesManager.getWebPage(id)\n };\n\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n });\n });\n\n rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n if(threadId) return;\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n if(!threadId) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !appMessagesIdsManager.getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog(dialog);\n }\n\n rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft,\n index: dialog.index\n });\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n rootScope.addEventListener('poll_update', ({poll}) => {\n const set = appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n });\n \n appStateManager.getState().then(state => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear() {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear();\n this.filtersStorage && this.filtersStorage.clear();\n }\n\n public construct() {\n this.filtersStorage = new FiltersStorage(this, appPeersManager, appUsersManager, appNotificationsManager, appStateManager, apiUpdatesManager, /* apiManager, */ rootScope);\n this.dialogsStorage = new DialogsStorage(this, appChatsManager, appPeersManager, appUsersManager, appDraftsManager, appNotificationsManager, appStateManager, apiUpdatesManager, serverTimeManager, appMessagesIdsManager);\n }\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: any) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ?? (this.tempFinalizeCallbacks[tempId] = {});\n const obj = finalize[callbackName] ?? (finalize[callbackName] = {deferred: deferredPromise()});\n\n obj.callback = callback;\n\n return obj.deferred;\n }\n\n public editMessage(message: any, text: string, options: Partial<{\n noWebPage: true,\n newMedia: any,\n scheduleDate: number,\n entities: MessageEntity[]\n }> = {}): Promise {\n /* if(!this.canEditMessage(messageId)) {\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\n } */\n\n const {mid, peerId} = message;\n\n if(message.pFlags.is_outgoing) {\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\n //this.log('invoke editMessage callback', message);\n return this.editMessage(message, text, options);\n });\n }\n\n let entities = options.entities || [];\n if(text) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return apiManager.invokeApi('messages.editMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n \n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public sendText(peerId: PeerId, text: string, options: Partial<{\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n scheduleDate: number,\n silent: true\n }> = {}) {\n if(!text.trim()) {\n return;\n }\n\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const MAX_LENGTH = rootScope.config.message_length_max;\n if(text.length > MAX_LENGTH) {\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n\n if(splitted.length > 1) {\n delete options.webPage;\n }\n\n for(let i = 1; i < splitted.length; ++i) {\n setTimeout(() => {\n this.sendText(peerId, splitted[i], options);\n }, i);\n }\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n let entities = options.entities || [];\n if(!options.viaBotId) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n //entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError(false);\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent\n }, 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 const newMessage = copy(message);\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n // Testing bad situations\n // var upd = angular.copy(updates)\n // updates.updates.splice(0, 1)\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n // $timeout(function () {\n // ApiUpdatesManager.processUpdateMessage(upd)\n // }, 5000)\n }, (/* error: any */) => {\n toggleError(true);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n }\n\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 threadId: number,\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n duration: number,\n background: true,\n silent: true,\n clearDraft: true,\n scheduleDate: number,\n noSound: boolean,\n\n waveform: Uint8Array,\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n let attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage\n },\n waveform: options.waveform,\n duration: options.duration || 0\n };\n\n attributes.push(attribute);\n } else if(!options.isMedia) {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n } else if(isPhoto) {\n attachType = 'photo';\n apiFileName = 'photo.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadPhotoAction';\n\n const photoSize = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n \n photo = appPhotosManager.savePhoto(photo);\n } else if(VIDEO_MIME_TYPES_SUPPORTED.has(fileType)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage,\n supports_streaming: true\n }, \n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound && \n file.size > (10 * 1024) && \n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = appDownloadManager.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n \n document = appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const preloader = isDocument ? undefined : new ProgressivePreloader({\n attachMethod: 'prepend',\n tryAgainOnFail: false,\n isUpload: true\n });\n\n const sentDeferred = deferredPromise();\n\n if(preloader) {\n preloader.attachPromise(sentDeferred);\n sentDeferred.cancel = () => {\n const error = new Error('Download canceled');\n error.name = 'AbortError';\n sentDeferred.reject(error);\n };\n\n sentDeferred.catch(err => {\n if(err.name === 'AbortError' && !uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n if(uploadPromise?.cancel) {\n uploadPromise.cancel();\n }\n }\n });\n }\n\n const media = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n preloader,\n photo,\n document,\n promise: sentDeferred\n };\n\n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file \n } as MessageMedia.messageMediaDocument : media as any;\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const {id, access_hash, file_reference} = file as MyDocument;\n\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id,\n access_hash,\n file_reference\n }\n };\n \n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n uploadPromise = appDownloadManager.upload(file);\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL) {\n thumbUploadPromise = new Promise((resolve, reject) => {\n const thumbPromise = options.thumb && options.thumb.blob ? Promise.resolve(options.thumb) : createPosterForVideo(options.objectURL);\n thumbPromise.then(thumb => {\n if(!thumb) {\n resolve(null);\n } else {\n appDownloadManager.upload(thumb.blob).then(resolve, reject);\n }\n }, reject);\n });\n }\n \n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n // @ts-ignore\n delete message.media.preloader;\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto', \n file: inputFile,\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument', \n file: inputFile, \n mime_type: fileType, \n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' ? true : undefined,\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n \n sentDeferred.resolve(inputMedia);\n }, (/* error */) => {\n toggleError(true);\n });\n \n uploadPromise.addNotifyListener((progress: {done: number, total: number}) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0});\n }\n sentDeferred.notifyAll(progress);\n });\n\n return sentDeferred;\n };\n\n if(options.isGroupedItem) {\n load();\n } else {\n this.sendSmthLazyLoadQueue.push({\n load\n });\n }\n }\n\n return sentDeferred;\n };\n\n this.beforeMessageSending(message, {\n isGroupedItem: options.isGroupedItem, \n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then(inputMedia => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n return apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n if(attachType === 'photo' &&\n error.code === 400 &&\n (error.type === 'PHOTO_INVALID_DIMENSIONS' ||\n error.type === 'PHOTO_SAVE_FILE_INVALID')) {\n error.handled = true;\n attachType = 'document';\n message.send();\n return;\n }\n\n toggleError(true);\n });\n });\n }\n\n return {message, promise: sentDeferred};\n }\n\n public async sendAlbum(peerId: PeerId, files: File[], options: Partial<{\n isMedia: true,\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n caption: string,\n sendFileDetails: Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumbBlob: Blob,\n thumbURL: string\n }>[],\n silent: true,\n clearDraft: true,\n scheduleDate: number\n }> = {}) {\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(files.length === 1) {\n return this.sendFile(peerId, files[0], {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', files, options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const messages = files.map((file, idx) => {\n const details = options.sendFileDetails[idx];\n const o: Parameters[2] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n groupId,\n ...details\n };\n\n if(idx === 0) {\n o.caption = caption;\n o.entities = entities;\n //o.replyToMsgId = replyToMsgId;\n }\n\n return this.sendFile(peerId, file, o).message;\n });\n\n if(options.clearDraft) {\n setTimeout(() => {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }, 0);\n }\n \n // * test pending\n //return;\n\n const toggleError = (message: any, on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n messages.forEach(message => toggleError(message, true));\n });\n }\n });\n };\n\n const promises: Promise[] = messages.map((message) => {\n return (message.send() as Promise).then((inputMedia) => {\n return apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n });\n })\n .then(messageMedia => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = appPhotosManager.getMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = appDocsManager.saveDoc(messageMedia.document);\n inputMedia = appDocsManager.getMediaInput(doc);\n }\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: any) => {\n if(err.name === 'AbortError') {\n return null;\n }\n\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, true);\n throw err;\n });\n });\n\n Promise.all(promises).then(inputs => {\n invoke(inputs.filter(Boolean));\n });\n }\n\n public sendOther(peerId: PeerId, inputMedia: InputMedia, options: Partial<{\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n scheduleDate: number,\n silent: true,\n geoPoint: GeoPoint\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n });\n\n const {poll, results} = appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n \n // @ts-ignore\n case 'messageMediaPending': {\n media = inputMedia;\n break;\n }\n }\n\n message.media = media;\n\n let toggleError = (on: boolean) => {\n /* const historyMessage = this.messagesForHistory[messageId];\n if (on) {\n message.error = true\n if (historyMessage) {\n historyMessage.error = true\n }\n } else {\n delete message.error\n if (historyMessage) {\n delete historyMessage.error\n }\n } */\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMedia', {\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n message: '',\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n toggleError(true);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n }\n\n /* private checkSendOptions(options: Partial<{\n scheduleDate: number\n }>) {\n if(options.scheduleDate) {\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(options.scheduleDate <= minTimestamp) {\n delete options.scheduleDate;\n }\n }\n } */\n\n private beforeMessageSending(message: Message.message, options: Partial<{\n isGroupedItem: true, \n isScheduled: true, \n threadId: number, \n clearDraft: true\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n\n if(options.isScheduled) {\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n setTimeout(() => {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: messageId});\n }, 0);\n } else {\n /* if(options.threadId && this.threadsStorage[peerId]) {\n delete this.threadsStorage[peerId][options.threadId];\n } */\n const storages: HistoryStorage[] = [\n this.getHistoryStorage(peerId),\n options.threadId ? this.getHistoryStorage(peerId, options.threadId) : undefined\n ];\n\n for(const storage of storages) {\n if(storage) {\n storage.history.unshift(messageId);\n }\n }\n\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n setTimeout(() => {\n rootScope.dispatchEvent('history_append', {storage, peerId, mid: messageId});\n }, 0);\n }\n\n this.pendingByRandomId[message.random_id] = {\n peerId, \n tempId: messageId, \n threadId: options.threadId, \n storage\n };\n\n if(!options.isGroupedItem && message.send) {\n setTimeout(() => {\n if(options.clearDraft) {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n }, 0);\n }\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: Partial<{\n scheduleDate: number,\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: this.generateFromId(peerId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor, \n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + serverTimeManager.serverTimeOffset),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true,\n };\n\n return message;\n }\n\n private generateReplyHeader(replyToMsgId: number, replyToTopId?: number) {\n const header = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n } as MessageReplyHeader;\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(appPeersManager.isBroadcast(peerId)) {\n const channelFull = appProfileManager.chatsFull[peerId.toChatId()] as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(peerId.isAnyChat() && (peerId.isBroadcast() || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return appPeersManager.getOutputPeer(appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!appPeersManager.isChannel(peerId) && !appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = appUsersManager.getSelf().id.toPeerId();\n if(originalMessage.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 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.from_id = appPeersManager.getOutputPeer(originalMessage.fromId);\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n if(appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n \n // * there is no way to detect whether user profile is hidden\n if(peerId === myId) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message = {\n _: 'messageService',\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n } as Message.messageService;\n\n this.getMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n return peerId.isAnyChat() && appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(message: MyMessage, dialog: MTDialog.dialog = this.getDialogOnly(message.peerId)) {\n if(dialog) {\n dialog.top_message = message.mid;\n \n const historyStorage = this.getHistoryStorage(message.peerId);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n \n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = appPeersManager.getPeerId(dialog.peer);\n const mid = appMessagesIdsManager.generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n \n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach(dialog => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\n const result = await this.getTopMessages(100, GLOBAL_FOLDER_ID);\n if(!middleware() || result.isEnd) {\n break;\n }\n }\n }\n\n /* public async getConversationsAll(query = '', folderId = 0) {\n const limit = 200, outDialogs: Dialog[] = [];\n for(; folderId < 2; ++folderId) {\n let offsetIndex = 0;\n for(;;) {\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\n \n if(dialogs.length) {\n outDialogs.push(...dialogs);\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\n } else {\n break;\n }\n }\n }\n\n return outDialogs;\n } */\n\n public getConversations(query = '', offsetIndex?: number, limit?: number, folderId = 0, skipMigrated?: boolean) {\n return this.dialogsStorage.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n }\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId) {\n const chatHistoryStorage = this.getHistoryStorage(peerId);\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n } else {\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages(limit: number, folderId: number, offsetDate?: number) {\n //const dialogs = this.dialogsStorage.getFolder(folderId);\n let offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n if(offsetDate === undefined) {\n offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n }\n\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += serverTimeManager.serverTimeOffset;\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n const params: MessagesGetDialogs = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n };\n\n return apiManager.invokeApiSingle('messages.getDialogs', params, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }).then((dialogsResult) => {\n if(!middleware() || dialogsResult._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', dialogsResult.dialogs, {...dialogsResult.dialogs[0]});\n }\n\n /* if(!offsetDate) {\n telegramMeWebService.setAuthorized(true);\n } */\n\n // can reset pinned order here\n if(!offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!offsetDate) {\n telegramMeWebManager.setAuthorized(true);\n }\n\n appUsersManager.saveApiUsers(dialogsResult.users);\n appChatsManager.saveApiChats(dialogsResult.chats);\n this.saveMessages(dialogsResult.messages);\n\n /* if(folderId === 0 && !offsetDate) {\n const found = dialogsResult.dialogs.find(dialog => appPeersManager.getPeerId(dialog.peer) === -1325963535);\n if(!found) {\n debugger;\n }\n } */\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: {[peerId: PeerId]: Dialog} = {};\n const setFolderId = folderId === GLOBAL_FOLDER_ID ? 0 : folderId;\n const saveGlobalOffset = folderId === GLOBAL_FOLDER_ID;\n forEachReverse((dialogsResult.dialogs as Dialog[]), dialog => {\n //const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(dialog.folder_id === undefined) {\n dialog.folder_id = setFolderId;\n }\n\n this.dialogsStorage.saveDialog(dialog, undefined, true, saveGlobalOffset);\n\n if(!maxSeenIdIncremented &&\n !appPeersManager.isChannel(dialog.peerId || appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n if(dialog.peerId === undefined) {\n return;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId, d);\n } */\n\n if(offsetIndex && dialog.index > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!appMessagesIdsManager.getServerMessageId(dialog.read_inbox_max_id) && !appMessagesIdsManager.getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs[dialog.peerId] = dialog;\n\n this.log.error('noIdsDialogs', dialog, params);\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId);\n } */\n }\n });\n\n const keys = Object.keys(noIdsDialogs);\n if(keys.length) {\n //setTimeout(() => { // test bad situation\n const peerIds = keys.map(key => key.toPeerId());\n const promises = peerIds.map(peerId => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n \n for(let i = 0; i < peerIds.length; ++i) {\n rootScope.dispatchEvent('dialog_unread', {peerId: peerIds[i]});\n }\n });\n //}, 10e3);\n }\n\n const count = (dialogsResult as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n if(appMessagesIdsManager.getServerMessageId(folderDialogs[i].top_message)) {\n ++dialogsLength;\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */ \n !count || \n dialogsLength >= count ||\n !dialogsResult.dialogs.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n rootScope.dispatchEvent('dialogs_multiupdate', {});\n }\n\n const dialogs = (dialogsResult as MessagesDialogs.messagesDialogsSlice).dialogs;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1], \n count, \n dialogs: slicedDialogs\n };\n });\n }\n\n public forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: Partial<{\n withMyScore: true,\n silent: true,\n scheduleDate: number,\n dropAuthor: boolean,\n dropCaptions: boolean\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMessages = mids.map(mid => {\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n\n const keys: Array = [\n 'entities', \n 'media', \n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n keys.forEach(key => {\n // @ts-ignore\n message[key] = originalMessage[key];\n });\n\n const document = (message.media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n const types: MyDocument['type'][] = ['round', 'voice'];\n if(types.includes(document.type)) {\n (message as MyMessage).pFlags.media_unread = true;\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ?? (groups[originalMessage.grouped_id] = {tempId: '' + ++this.groupedTempId, messages: []});\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach(message => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach(message => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n random_id: newMessages.map(message => message.random_id),\n to_peer: appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n return promise;\n }\n\n public generateEmptyMessage(mid: number): Message.messageEmpty {\n return {\n _: 'messageEmpty',\n id: appMessagesIdsManager.getServerMessageId(mid),\n mid,\n deleted: true,\n pFlags: {}\n };\n }\n\n public getMessageFromStorage(storage: MessagesStorage, mid: number) {\n return storage && storage.get(mid) || this.generateEmptyMessage(mid);\n }\n\n private createMessageStorage() {\n const storage: MessagesStorage = new Map();\n \n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num, \n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ?? (this.messagesStorageByPeerId[peerId] = this.createMessageStorage());\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogByPeerId(peerId: PeerId): [Dialog, number] | [] {\n return this.dialogsStorage.getDialog(peerId);\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise;\n if(inputPeer !== undefined) {\n const peerId = appPeersManager.getPeerId(inputPeer);\n let obj = this.reloadConversationsPeers.get(peerId);\n if(obj) {\n promise = obj.promise;\n }\n\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n this.reloadConversationsPeers.set(peerId, obj = {\n inputDialogPeer: appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = new Promise((resolve, reject) => {\n setTimeout(() => {\n const inputDialogPeers: InputDialogPeer[] = [];\n const promises: {[peerId: string]: typeof promise} = {};\n for(const [peerId, {inputDialogPeer, promise}] of this.reloadConversationsPeers) {\n inputDialogPeers.push(inputDialogPeer);\n promises[peerId] = promise;\n }\n\n this.reloadConversationsPeers.clear();\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n promises[peerId].resolve(undefined);\n }\n };\n\n apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers}).then((result) => {\n this.dialogsStorage.applyDialogs(result);\n\n result.dialogs.forEach((dialog) => {\n const peerId = dialog.peerId;\n if(peerId) {\n promises[peerId].resolve(dialog as Dialog);\n delete promises[peerId];\n }\n });\n\n fullfillLeft();\n resolve();\n }, (err) => {\n fullfillLeft();\n reject(err);\n }).finally(() => {\n this.reloadConversationsPromise = null;\n\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n }, 0);\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peer: InputPeer, just_clear?: boolean, revoke?: boolean): Promise {\n return apiManager.invokeApiSingle('messages.deleteHistory', {\n just_clear,\n revoke,\n peer,\n max_id: 0\n }).then((affectedHistory) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peer, just_clear, revoke);\n });\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean) {\n if(appPeersManager.isChannel(peerId)) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = promise instanceof Promise ? await promise : promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: appChatsManager.getChannelInput(channelId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(appPeersManager.getInputPeerById(peerId), justClear, revoke).then(() => {\n [\n this.historiesStorage, \n this.threadsStorage, \n this.searchesStorage, \n this.pinnedMessages,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach(s => {\n delete s[peerId];\n });\n\n const m = this.needSingleMessages.get(peerId);\n if(m) {\n m.clear();\n }\n\n [\n this.messagesStorageByPeerId,\n this.scheduledMessagesStorage\n ].forEach(s => {\n const ss = s[peerId];\n if(ss) {\n ss.clear();\n }\n });\n \n if(justClear) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n } else {\n delete this.notificationsToHandle[peerId];\n delete this.typings[peerId];\n \n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n });\n }\n\n public onPeerDeleted(peerId: number) {\n\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessage(peerId: PeerId) {\n const p = this.pinnedMessages[peerId] ?? (this.pinnedMessages[peerId] = {});\n if(p.promise) return p.promise;\n else if(p.maxId) return Promise.resolve(p);\n\n return p.promise = this.getSearch({\n peerId, \n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: 0,\n limit: 1\n }).then(result => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(updates => {\n //this.log('pinned updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: appPeersManager.getInputPeerById(peerId)\n }).then(affectedHistory => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getMessagesStorage(peerId);\n storage.forEach((message) => {\n if(message.pFlags.pinned) {\n delete message.pFlags.pinned;\n }\n });\n\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[peerId];\n\n return true;\n }\n\n return this.unpinAllMessages(peerId);\n });\n }\n\n public getAlbumText(grouped_id: string) {\n const group = this.groupedMessagesStorage[grouped_id];\n let foundMessages = 0, message: string, totalEntities: MessageEntity[], entities: MessageEntity[];\n for(const [mid, m] of group) {\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m.message;\n totalEntities = m.totalEntities;\n entities = m.entities;\n } \n }\n\n if(foundMessages > 1) {\n message = undefined;\n totalEntities = undefined;\n entities = undefined;\n }\n\n return {message, entities, totalEntities};\n }\n\n public getMidsByAlbum(grouped_id: string) {\n return getObjectKeysAndSort(this.groupedMessagesStorage[grouped_id], 'asc');\n //return Object.keys(this.groupedMessagesStorage[grouped_id]).map(id => +id).sort((a, b) => a - b);\n }\n\n public getMidsByMessage(message: Message.message) {\n if(message?.grouped_id) return this.getMidsByAlbum(message.grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: any, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return appMessagesIdsManager.generateMessageId(dialog?.top_message || 0, true);\n }\n\n public saveMessage(message: any, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if(message.pFlags === undefined) {\n message.pFlags = {};\n }\n\n if(message._ === 'messageEmpty') {\n message.deleted = true;\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && appChatsManager.isBroadcast(peerId.toChatId());\n\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n \n const mid = appMessagesIdsManager.generateMessageId(message.id);\n message.mid = mid;\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ?? (this.groupedMessagesStorage[message.grouped_id] = new Map());\n storage.set(mid, message);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog && mid) {\n if(mid > dialog[message.pFlags.out\n ? 'read_outbox_max_id'\n : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n if(message.reply_to) {\n if(message.reply_to.reply_to_msg_id) {\n message.reply_to.reply_to_msg_id = message.reply_to_mid = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_msg_id);\n } \n\n if(message.reply_to.reply_to_top_id) message.reply_to.reply_to_top_id = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_top_id);\n }\n\n if(message.replies) {\n if(message.replies.max_id) message.replies.max_id = appMessagesIdsManager.generateMessageId(message.replies.max_id);\n if(message.replies.read_max_id) message.replies.read_max_id = appMessagesIdsManager.generateMessageId(message.replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= serverTimeManager.serverTimeOffset;\n }\n \n //storage.generateIndex(message);\n const myId = appUsersManager.getSelf().id;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = message.fwd_from ? (message.fwd_from.from_id ? appPeersManager.getPeerId(message.fwd_from.from_id) : 0) : myId;\n } else {\n //message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id);\n message.fromId = message.pFlags.post || !message.from_id ? peerId : appPeersManager.getPeerId(message.from_id);\n }\n\n const fwdHeader = message.fwd_from as MessageFwdHeader;\n if(fwdHeader) {\n //if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = appMessagesIdsManager.generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = appMessagesIdsManager.generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = appPeersManager.getPeerId(peer);\n const savedFromMid = appMessagesIdsManager.generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= serverTimeManager.serverTimeOffset;\n }\n }\n\n if(message.via_bot_id > 0) {\n message.viaBotId = message.via_bot_id;\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n if(message.media) {\n switch(message.media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(message.media.ttl_seconds) {\n message.media = {_: 'messageMediaUnsupportedWeb'};\n } else {\n message.media.photo = appPhotosManager.savePhoto(message.media.photo, mediaContext);\n }\n\n if(!message.media.photo) { // * found this bug on test DC\n delete message.media;\n }\n \n break;\n }\n \n case 'messageMediaPoll': {\n const result = appPollsManager.savePoll(message.media.poll, message.media.results, message);\n message.media.poll = result.poll;\n message.media.results = result.results;\n break;\n }\n \n case 'messageMediaDocument': {\n if(message.media.ttl_seconds) {\n message.media = {_: 'messageMediaUnsupportedWeb'};\n } else {\n message.media.document = appDocsManager.saveDoc(message.media.document, mediaContext); // 11.04.2020 warning\n }\n\n break;\n }\n \n case 'messageMediaWebPage': {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n message.media.webpage = appWebPagesManager.saveWebPage(message.media.webpage, messageKey, mediaContext);\n break;\n }\n \n /*case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n\n case 'messageMediaInvoice': {\n message.media = {_: 'messageMediaUnsupportedWeb'};\n break;\n }\n }\n }\n\n if(message.action) {\n const action = message.action as MessageAction;\n let migrateFrom: PeerId;\n let migrateTo: PeerId;\n const suffix = message.fromId === appUsersManager.getSelf().id ? 'You' : '';\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n //case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n \n case 'messageActionGroupCall': {\n //assumeType(action);\n\n appGroupCallsManager.saveGroupCall(action.call);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n } else {\n type = 'ended'\n }\n\n if(!isBroadcast) {\n type += '_by' + suffix;\n }\n\n // @ts-ignore\n action.type = type;\n\n break;\n }\n\n case 'messageActionChatEditTitle':\n /* if(options.isNew) {\n const chat = appChatsManager.getChat(peerId.toChatId());\n chat.title = action.title;\n appChatsManager.saveApiChat(chat, true);\n } */\n \n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelEditTitle';\n }\n break;\n\n case 'messageActionChatDeletePhoto':\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n\n case 'messageActionChatAddUser':\n if(action.users.length === 1) {\n // @ts-ignore\n action.user_id = action.users[0];\n // @ts-ignore\n if(message.fromId === action.user_id) {\n if(isChannel) {\n // @ts-ignore\n action._ = 'messageActionChatJoined' + suffix;\n } else {\n // @ts-ignore\n action._ = 'messageActionChatReturn' + suffix;\n }\n }\n } else if(action.users.length > 1) {\n // @ts-ignore\n action._ = 'messageActionChatAddUsers';\n }\n break;\n\n case 'messageActionChatDeleteUser':\n if(message.fromId === action.user_id) {\n // @ts-ignore\n action._ = 'messageActionChatLeave' + suffix;\n }\n break;\n\n case 'messageActionChannelMigrateFrom':\n migrateFrom = action.chat_id.toPeerId(true);\n migrateTo = peerId;\n break\n\n case 'messageActionChatMigrateTo':\n migrateFrom = peerId;\n migrateTo = action.channel_id.toPeerId(true);\n break;\n\n case 'messageActionHistoryClear':\n //apiMessage.deleted = true;\n message.clear_history = true;\n delete message.pFlags.out;\n delete message.pFlags.unread;\n break;\n\n case 'messageActionPhoneCall':\n // @ts-ignore\n action.type = \n (message.pFlags.out ? 'out_' : 'in_') +\n (\n action.reason._ === 'phoneCallDiscardReasonMissed' ||\n action.reason._ === 'phoneCallDiscardReasonBusy'\n ? 'missed'\n : 'ok'\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(message.message && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message); \n }\n\n storage.set(mid, message);\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if((messages as any).saved) return;\n (messages as any).saved = true;\n messages.forEach((message) => {\n this.saveMessage(message, options);\n });\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = RichTextProcessor.fixEmoji(message.message, apiEntities);\n\n const myEntities = RichTextProcessor.parseEntities(message.message);\n message.totalEntities = RichTextProcessor.mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): string;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment | string {\n const parts: (HTMLElement | string)[] = [];\n\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement, text?: string) => {\n if(langKey) {\n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n \n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('i');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n\n if(text) {\n parts.push(', ');\n }\n };\n\n if((message as Message.message).media) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = this.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n text = this.getAlbumText(message.grouped_id).message;\n\n if(!withoutMediaType) {\n addPart('AttachAlbum', undefined, text);\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', undefined, message.message);\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : RichTextProcessor.wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n const text = plain ? media.title : RichTextProcessor.wrapEmojiText(media.title);\n addPart('AttachLocation', undefined, text);\n parts.push(htmlToDocumentFragment(text) as any);\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n addPart(undefined, plain ? '📊' + ' ' + (media.poll.question || 'poll') : media.poll.rReply);\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const prefix = '🎮' + ' ';\n addPart(undefined, plain ? prefix + media.game.title : RichTextProcessor.wrapEmojiText(prefix + media.game.title));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n \n if(document.type === 'video') {\n addPart('AttachVideo', undefined, message.message);\n } else if(document.type === 'voice') {\n addPart('AttachAudio', undefined, message.message);\n } else if(document.type === 'gif') {\n addPart('AttachGif', undefined, message.message);\n } else if(document.type === 'round') {\n addPart('AttachRound', undefined, message.message);\n } else if(document.type === 'sticker') {\n if(document.stickerEmojiRaw) {\n addPart(undefined, (plain ? document.stickerEmojiRaw : document.stickerEmoji) + ' ');\n }\n \n addPart('AttachSticker');\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find(attribute => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f), message.message);\n } else {\n addPart(undefined, plain ? document.file_name : RichTextProcessor.wrapEmojiText(document.file_name), message.message);\n }\n \n break;\n }\n \n default:\n //messageText += media._;\n ///////this.log.warn('Got unknown media type!', message);\n break;\n }\n } \n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = this.wrapMessageActionTextNew((message as Message.messageService), plain);\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(plain) {\n parts.push(text);\n } else {\n let entities = RichTextProcessor.parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n if(!entities) entities = [];\n let found = false;\n let match: any;\n let regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\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 entities.sort((a, b) => a.offset - b.offset);\n }\n }\n\n const messageWrapped = RichTextProcessor.wrapRichText(text, {\n noLinebreaks: true, \n entities, \n noLinks: true,\n noTextFormat: true\n });\n \n parts.push(htmlToDocumentFragment(messageWrapped) as any);\n }\n }\n\n if(plain) {\n return parts.join('');\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment;\n }\n }\n\n public wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n \n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ? \n i18n('FromYou') : \n new PeerTitle({\n peerId: message.fromId, \n dialog: message.peerId === rootScope.myId\n }).element\n );\n\n if(appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = new PeerTitle({peerId: message.peerId}).element;\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n }\n\n public 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 public wrapMessageActionTextNew(message: MyMessage, plain: true): string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: false): HTMLElement;\n public wrapMessageActionTextNew(message: MyMessage, plain: boolean): HTMLElement | string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: boolean): HTMLElement | string {\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return RichTextProcessor.wrapPlainText(unsafeMessage);\n } else {\n element.innerHTML = RichTextProcessor.wrapRichText(unsafeMessage, {noLinebreaks: true});\n return element;\n }\n } else {\n let _ = action._;\n //let suffix = '';\n let langPackKey: LangPackKey;\n let args: any[];\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? appPeersManager.getPeerTitle(peerId, plain) : (new PeerTitle({peerId})).element;\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration, plain)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You') && !message.pFlags.post) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n if(action.duration !== undefined) {\n args.push(formatCallDuration(action.duration, plain));\n } else {\n const {onclick, url} = RichTextProcessor.wrapUrl(`tg://voicechat?chat_id=${message.peerId.toChatId()}&id=${action.call.id}&access_hash=${action.call.access_hash}`);\n if(!onclick) {\n args.push(document.createElement('span'));\n break;\n }\n \n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('onclick', onclick + '(this)');\n args.push(a);\n }\n\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'ActionGroupCall';\n const myId = appUsersManager.getSelf().id;\n if(peerIds[0] === myId) a += 'You';\n a += 'Invited';\n if(peerIds[1] === myId) a += 'You';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map(peerId => getNameDivHTML(peerId, plain));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey, _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date, \n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n \n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = this.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain),\n ];\n \n if(pinnedMessage.deleted/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n this.fetchMessageReplyTo(message).then(originalMessage => {\n if(!originalMessage.deleted && !message.deleted) {\n rootScope.dispatchEvent('message_edit', {\n storage: this.getMessagesStorage(peerId),\n peerId: peerId,\n mid: message.mid\n });\n\n if(this.isMessageIsTopMessage(message)) {\n rootScope.dispatchEvent('dialogs_multiupdate', {\n [peerId]: this.getDialogOnly(peerId)\n });\n }\n }\n });\n }\n } else {\n const a = document.createElement('i');\n a.dataset.savedFrom = pinnedMessage.peerId + '_' + pinnedMessage.mid;\n a.dir = 'auto';\n a.append(this.wrapMessageForReply(pinnedMessage, undefined, undefined, plain as any));\n args.push(a);\n }\n\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(plain ? action.title : htmlToSpan(RichTextProcessor.wrapEmojiText(action.title)));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users \n || [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n const joined = join(\n users.map((userId: UserId) => (getNameDivHTML(userId.toPeerId(), plain) as string).trim()),\n false,\n plain\n );\n \n if(plain) {\n args.push(...joined);\n } else {\n const fragment = document.createElement('span');\n fragment.append(...joined);\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = RichTextProcessor.wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n if(plain) {\n return I18n.format(langPackKey, true, args);\n } else {\n return _i18n(element, langPackKey, args);\n }\n\n //str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return apiManager.invokeApiSingle('messages.report', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return apiManager.invokeApi('messages.startBot', {\n bot: appUsersManager.getUserInput(botId),\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(appChatsManager.isChannel(chatId)) {\n promise = appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error) => {\n if(error && error.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n const bot = appUsersManager.getUser(botId);\n return this.sendText(peerId, str + '@' + bot.username);\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map(peerId => {\n return {\n _: 'inputFolderPeer',\n peer: appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then(updates => {\n //this.log('editPeerFolders updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public toggleDialogPin(peerId: PeerId, filterId?: number) {\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = filterId === 1 ? rootScope.config.pinned_infolder_count_max : rootScope.config.pinned_dialogs_count_max;\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n }\n\n return apiManager.invokeApi('messages.toggleDialogPin', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n }\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return apiManager.invokeApi('messages.markDialogUnread', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = appChatsManager.getChat(migrateFrom.toChatId());\n if(fromChat &&\n fromChat.migrated_to &&\n fromChat.migrated_to.channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n //setTimeout(() => {\n rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n //}, 100);\n }\n }\n }\n\n private canMessageBeEdited(message: any, kind: 'text' | 'poll') {\n if(message.pFlags.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(message._ !== 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && appUsersManager.isBot(message.fromId)) {\n return false;\n }\n \n if(message.media &&\n message.media._ === 'messageMediaDocument' &&\n (message.media.document.sticker || message.media.document.type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public canEditMessage(message: any, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === appUsersManager.getSelf().id) {\n return true;\n }\n\n if((message.date < (tsNow(true) - rootScope.config.edit_time_limit) && \n message.media?._ !== 'messageMediaPoll') || !message.pFlags.out) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() \n || message.fromId === rootScope.myId \n || appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' \n || appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && !message.pFlags.is_outgoing;\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n let messageReplyMarkup = (message as Message.message).reply_markup;\n if(!messageReplyMarkup &&\n !message.pFlags?.out &&\n !(message as Message.messageService).action) {\n return false;\n }\n\n if(messageReplyMarkup?._ === 'replyInlineMarkup') {\n return false;\n }\n\n const lastReplyMarkup = historyStorage.replyMarkup;\n if(messageReplyMarkup) {\n if(lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n\n if(messageReplyMarkup.pFlags.selective) {\n return false;\n }\n\n if(historyStorage.maxOutId &&\n message.mid < historyStorage.maxOutId &&\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.single_use) {\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.hidden = true;\n }\n\n messageReplyMarkup.mid = message.mid;\n /* messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup); */\n\n if(messageReplyMarkup._ !== 'replyKeyboardHide') {\n messageReplyMarkup.fromId = appPeersManager.getPeerId(message.from_id);\n }\n\n historyStorage.replyMarkup = messageReplyMarkup;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n if(message.pFlags.out) {\n if(lastReplyMarkup) {\n assumeType(lastReplyMarkup);\n if(lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.pFlags.is_outgoing) &&\n (message as Message.message).message) {\n lastReplyMarkup.pFlags.hidden = true;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n } else if(!historyStorage.maxOutId ||\n message.mid > historyStorage.maxOutId) {\n historyStorage.maxOutId = message.mid;\n }\n }\n\n assumeType(message);\n if(message.action?._ === 'messageActionChatDeleteUser' &&\n (lastReplyMarkup\n ? message.action.user_id === (lastReplyMarkup as ReplyMarkup.replyKeyboardMarkup).fromId\n : appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(peerId: PeerId, filters: MessagesFilter[], canCache = true) {\n const func = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n return func('messages.getSearchCounters', {\n peer: appPeersManager.getInputPeerById(peerId),\n filters\n });\n }\n\n public filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage, limit: number) {\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [], \n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n excludeDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = storage.get(history[i]);\n if(!message) continue;\n \n //|| (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n \n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc && ((neededDocTypes.length && !neededDocTypes.includes(doc.type)) \n || excludeDocTypes.includes(doc.type))) {\n continue;\n }\n \n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find(e => goodEntities.includes(e._)) || RichTextProcessor.matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] && \n message.action && \n ([\n 'messageActionChannelEditPhoto' as const, \n 'messageActionChatEditPhoto' as const, \n 'messageActionChannelEditVideo' as const, \n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find(flag => message.pFlags[flag])) {\n found = true;\n } */\n \n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n //this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n //const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ? \n this.getSearchStorage(peerId, inputFilter._) as any : \n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilter(inputFilter._, storage.history.slice, this.getMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId) || 0\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n //var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n let offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n //offsetDate = offsetMessage.date + serverTimeManager.serverTimeOffset;\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n appUsersManager.saveApiUsers(searchResult.users);\n appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter(mid => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = appMessagesIdsManager.getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: appMessagesIdsManager.generateMessageId(maxMessageId, true),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n } \n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(result => {\n appChatsManager.saveApiChats(result.chats);\n appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.filterMessages(result.messages[0], message => !!(message as Message.message).replies)[0] as Message.message;\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n \n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n result.max_id = historyStorage.maxId = appMessagesIdsManager.generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = appMessagesIdsManager.generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = appMessagesIdsManager.generateMessageId(result.read_outbox_max_id) || 0;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(peerId: PeerId, mid: number) {\n if(this.newMessagesToHandle[peerId] === undefined) {\n this.newMessagesToHandle[peerId] = new Set();\n }\n\n this.newMessagesToHandle[peerId].add(mid);\n if(!this.newMessagesHandleTimeout) {\n this.newMessagesHandleTimeout = window.setTimeout(this.handleNewMessages, 0);\n }\n }\n\n private handleNewMessages = () => {\n clearTimeout(this.newMessagesHandleTimeout);\n this.newMessagesHandleTimeout = 0;\n\n rootScope.dispatchEvent('history_multiappend', this.newMessagesToHandle);\n this.newMessagesToHandle = {};\n };\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const obj = this.newDialogsToHandle;\n for(const peerId in obj) {\n const dialog = obj[peerId];\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n delete obj[peerId];\n } else {\n this.dialogsStorage.pushDialog(dialog);\n if(!appPeersManager.isChannel(peerId.toPeerId())) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n }\n }\n\n //this.log('after order:', this.dialogsStorage[0].map(d => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n this.newDialogsToHandle = {};\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog) {\n if(peerId !== undefined) {\n this.newDialogsToHandle[peerId] = dialog;\n }\n\n if(this.newDialogsHandlePromise) return this.newDialogsHandlePromise;\n return this.newDialogsHandlePromise = new Promise((resolve) => {\n setTimeout(() => {\n resolve();\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n }, 0);\n });\n }\n\n public deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const localMessageIds = mids.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = apiManager.invokeApi('channels.deleteMessages', {\n channel: appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n return promise;\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n if(!this.getReadMaxIdIfUnread(peerId, threadId) && !force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readDiscussion', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(threadId),\n read_max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('channels.readHistory', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((affectedMessages) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n appNotificationsManager.soundReset(appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n public fixDialogUnreadMentionsIfNoMessage(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public modifyCachedMentions(peerId: PeerId, mid: number, add: boolean) {\n const slicedArray = this.unreadMentions[peerId];\n if(!slicedArray) return;\n\n if(add) {\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\n slicedArray.insertSlice([mid]);\n }\n } else {\n slicedArray.delete(mid);\n }\n }\n\n 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 return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId);\n }\n\n return this.goToNextMentionPromises[peerId] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n rootScope.dispatchEvent('history_focus', {peerId, mid});\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[peerId];\n });\n }\n\n public loadNextMentions(peerId: PeerId) {\n const slicedArray = this.unreadMentions[peerId];\n const maxId = slicedArray.first[0] || 1;\n\n const backLimit = 50;\n const add_offset = -backLimit;\n const limit = backLimit;\n return this.getUnreadMentions(peerId, maxId, add_offset, limit).then(messages => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n public getUnreadMentions(peerId: PeerId, offsetId: number, add_offset: number, limit: number, maxId = 0, minId = 0) {\n return apiManager.invokeApiSingle('messages.getUnreadMentions', {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: appMessagesIdsManager.getServerMessageId(maxId),\n min_id: appMessagesIdsManager.getServerMessageId(minId)\n }).then(messagesMessages => {\n assumeType>(messagesMessages);\n appUsersManager.saveApiUsers(messagesMessages.users);\n appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = apiManager.invokeApi('channels.readMessageContents', {\n channel: appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n //threadId = this.getLocalMessageId(threadId);\n if(!this.threadsStorage[peerId]) this.threadsStorage[peerId] = {};\n return this.threadsStorage[peerId][threadId] ?? (this.threadsStorage[peerId][threadId] = {count: null, history: new SlicedArray()});\n }\n\n return this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {count: null, history: new SlicedArray()});\n }\n\n private handleNotifications = () => {\n window.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = 0;\n\n //var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n //const timeout = 1000;\n\n for(const _peerId in this.notificationsToHandle) {\n const peerId = _peerId.toPeerId();\n if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n continue;\n }\n\n const notifyPeerToHandle = this.notificationsToHandle[peerId];\n\n Promise.all([\n appNotificationsManager.getNotifyPeerTypeSettings(),\n appNotificationsManager.getNotifySettings(appPeersManager.getInputNotifyPeerById(peerId, true))\n ]).then(([_, peerTypeNotifySettings]) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if(appNotificationsManager.isPeerLocalMuted(peerId, true) || !topMessage.pFlags.unread) {\n return;\n }\n\n //setTimeout(() => {\n if(topMessage.pFlags.unread) {\n this.notifyAboutMessage(topMessage, {\n fwdCount: notifyPeerToHandle.fwdCount,\n peerTypeNotifySettings\n });\n }\n //}, timeout);\n });\n }\n\n this.notificationsToHandle = {};\n };\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n //this.log('AMM updateMessageID:', update, pendingData);\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message = this.getMessageFromStorage(storage, mid);\n if(!message.deleted) {\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n this.finalizePendingMessageCallbacks(storage, tempId, message);\n } else {\n this.pendingByMessageId[mid] = randomId;\n }\n }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getMessagesStorage(peerId);\n const dialog = this.getDialogOnly(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: new Map()});\n\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n if(threadId && !isLocalThreadUpdate && this.threadsStorage[peerId] && this.threadsStorage[peerId][threadId]) {\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n this.onUpdateNewMessage(update);\n }\n\n if(!dialog && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n const set = this.newUpdatesAfterReloadToHandle[peerId] ?? (this.newUpdatesAfterReloadToHandle[peerId] = new Set());\n if(set.has(update)) {\n this.log.error('here we go again', peerId);\n return;\n }\n\n this.scheduleHandleNewDialogs(peerId);\n set.add(update);\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 if(historyStorage.history.findSlice(message.mid)) {\n return false;\n }\n\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 if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? appMessagesIdsManager.getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId)\n };\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n }\n\n if(!pendingMessage) {\n this.handleNewMessage(peerId, message.mid);\n }\n\n if(isLocalThreadUpdate) {\n return;\n }\n \n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n if(dialog) {\n if(inboxUnread) {\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 this.setDialogTopMessage(message, dialog);\n }\n\n if(inboxUnread/* && ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE) */) {\n const notifyPeer = peerId;\n let notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\n if(notifyPeerToHandle === undefined) {\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\n }\n\n if(notifyPeerToHandle.fromId !== fromId) {\n notifyPeerToHandle.fromId = fromId;\n notifyPeerToHandle.fwdCount = 0;\n }\n\n if((message as Message.message).fwd_from) {\n ++notifyPeerToHandle.fwdCount;\n }\n\n notifyPeerToHandle.topMessage = message;\n\n if(!this.notificationsHandlePromise) {\n this.notificationsHandlePromise = window.setTimeout(this.handleNotifications, 0);\n }\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n //this.log('updateDialogUnreadMark', update);\n const peerId = appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n if(!dialog) {\n this.scheduleHandleNewDialogs(peerId);\n } else {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(!update.pFlags.unread) {\n delete dialog.pFlags.unread_mark;\n } else {\n dialog.pFlags.unread_mark = true;\n }\n\n releaseUnreadCount();\n rootScope.dispatchEvent('dialogs_multiupdate', {[peerId]: dialog});\n this.dialogsStorage.setDialogToState(dialog);\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const storage = this.getMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n \n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog && dialog.top_message === mid;\n if((message as Message.message).clear_history) {\n if(isTopMessage) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n }\n } else {\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n\n if(isTopMessage || (message as Message.message).grouped_id) {\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n updatedDialogs[peerId] = dialog;\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox \n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox \n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' || update._ === 'updateReadChannelOutbox' || update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const storage = this.getMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n //this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n appUsersManager.forceUserOnline(peerId);\n }\n\n if(threadId) {\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n\n const releaseUnreadCount = !threadId && foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n\n for(let i = 0, length = history.length; i < length; i++) {\n const mid = history[i];\n if(mid > maxId) {\n continue;\n }\n \n const message: MyMessage = storage.get(mid);\n\n if(message.pFlags.out !== isOut) {\n continue;\n }\n\n if(!message.pFlags.unread) {\n break;\n }\n\n if(threadId) {\n const replyTo = message.reply_to;\n if(!replyTo || (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) !== threadId) {\n continue;\n }\n }\n \n // this.log.warn('read', messageId, message.pFlags.unread, message)\n if(message.pFlags.unread) {\n delete message.pFlags.unread;\n if(!foundAffected) {\n foundAffected = true;\n }\n\n if(!message.pFlags.out && !threadId && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n \n appNotificationsManager.cancel('msg' + mid);\n }\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(!threadId && foundDialog) {\n if(isOut) foundDialog.read_outbox_max_id = maxId;\n else foundDialog.read_inbox_max_id = maxId;\n\n if(!isOut) {\n let setCount: number;\n if(stillUnreadCount !== undefined) {\n setCount = stillUnreadCount;\n } else if(newUnreadCount < 0 || !this.getReadMaxIdIfUnread(peerId)) {\n setCount = 0;\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\n setCount = newUnreadCount;\n }\n\n if(setCount !== undefined) {\n foundDialog.unread_count = setCount;\n }\n\n if(newUnreadMentionsCount < 0) {\n foundDialog.unread_mentions_count = 0;\n }\n }\n\n if(releaseUnreadCount) {\n releaseUnreadCount();\n }\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n \n rootScope.dispatchEvent('dialog_unread', {peerId});\n this.dialogsStorage.setDialogToState(foundDialog);\n }\n\n if(foundAffected) {\n rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid));\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const mids = (update as Update.updateReadMessagesContents).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.getMessageById(mids[0]).peerId;\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(!message.deleted) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n \n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n }\n }\n\n rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = appMessagesIdsManager.generateMessageId(update.available_min_id);\n const messages = history.filter(mid => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n //const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.getMessageById(messages[0]).peerId;\n \n if(!peerId) {\n return;\n }\n\n apiManager.clearCache('messages.getSearchCounters', (params) => {\n return appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(threadKey && this.threadsStorage[peerId] && this.threadsStorage[peerId][+threadKey.split('_')[1]]) {\n threadKeys.add(threadKey);\n }\n }\n \n const historyUpdated = this.handleDeletedMessages(peerId, this.getMessagesStorage(peerId), messages);\n\n const threadsStorages = Array.from(threadKeys).map(threadKey => {\n const [peerId, mid] = threadKey.split('_');\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\n });\n\n const historyStorage = this.getHistoryStorage(peerId);\n [historyStorage].concat(threadsStorages).forEach(historyStorage => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n \n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const foundDialog = this.getDialogOnly(peerId);\n if(foundDialog) {\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n \n if(historyUpdated.unreadMentions) {\n foundDialog.unread_mentions_count = Math.max(0, foundDialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(historyUpdated.unread) {\n foundDialog.unread_count = Math.max(0, foundDialog.unread_count - historyUpdated.unread);\n }\n\n if(affected) {\n releaseUnreadCount();\n rootScope.dispatchEvent('dialog_unread', {peerId});\n }\n\n if(historyUpdated.msgs.has(foundDialog.top_message)) {\n const slice = historyStorage.history.first;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n const mid = slice[0];\n const message = this.getMessageByPeer(peerId, mid);\n this.setDialogTopMessage(message, foundDialog);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n };\n\n private onUpdateChannel = (update: Update.updateChannel) => {\n const channelId = update.channel_id;\n const peerId = channelId.toPeerId(true);\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n\n const needDialog = appChatsManager.isInChat(channelId);\n \n const canViewHistory = !!channel.username || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n \n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n rootScope.dispatchEvent('history_forbidden', peerId);\n }\n \n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n this.dialogsStorage.dropDialog(peerId);\n\n delete this.historiesStorage[peerId];\n this.reloadConversation(peerId).then(() => {\n rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n \n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.channel_id.toPeerId(true);\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message: Message.message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && message.views !== undefined && message.views < views) {\n message.views = views;\n rootScope.dispatchEvent('message_views', {peerId, mid, views});\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n //this.log('updateServiceNotification', update);\n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: appPeersManager.getOutputPeer(fromId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + serverTimeManager.serverTimeOffset,\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!appUsersManager.hasUser(fromId)) {\n appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updatePinnedMessages).peer);\n\n /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned');\n if(storage.count !== storage.history.length) {\n if(storage.count !== undefined) {\n delete this.searchesStorage[peerId]['inputMessagesFilterPinned']; \n }\n\n rootScope.broadcast('peer_pinned_messages', peerId);\n break;\n } */\n\n const messages = update.messages.map(id => appMessagesIdsManager.generateMessageId(id)); \n\n const storage = this.getMessagesStorage(peerId);\n const missingMessages = messages.filter(mid => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map(mid => this.wrapSingleMessage(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n //storage.history.push(mid);\n const message = storage.get(mid);\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n //storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n //storage.history.findAndSplice(_mid => _mid === mid);\n const message = storage.get(mid);\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n \n delete this.pinnedMessages[peerId];\n appStateManager.getState().then(state => {\n delete state.hiddenPinnedMessages[peerId];\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n if(peer._ === 'notifyPeer') {\n const peerId = appPeersManager.getPeerId((peer as NotifyPeer.notifyPeer).peer);\n \n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialog.notify_settings = notify_settings;\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(!oldMessage.deleted) {\n this.handleEditedMessage(oldMessage, newMessage);\n rootScope.dispatchEvent('message_edit', {storage, peerId, mid: message.mid});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: message.mid});\n }\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map(id => appMessagesIdsManager.generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\n if(this.isMessageIsTopMessage(message)) {\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\n }\n }\n\n public isMessageIsTopMessage(message: MyMessage) {\n const dialog = this.getDialogOnly(message.peerId);\n return dialog && dialog.top_message === message.mid;\n }\n\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\n try { // * на всякий случай, скорее всего это не понадобится\n const threadKey = this.getThreadKey(threadMessage);\n if(threadKey) {\n const repliesKey = this.threadsToReplies[threadKey];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n } catch(err) {\n this.log.error('incrementMessageReplies err', err, threadMessage);\n }\n }\n\n private getThreadKey(threadMessage: MyMessage) {\n let threadKey = '';\n if(threadMessage.peerId?.isAnyChat() && threadMessage.reply_to) {\n const threadId = threadMessage.reply_to.reply_to_top_id || threadMessage.reply_to.reply_to_msg_id;\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.wrapSingleMessage(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid);\n\n if(broadcastEventName) {\n rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n \n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n rootScope.dispatchEvent('history_update', {storage: pendingData.storage, peerId: message.peerId, mid: message.mid});\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(peerId: PeerId, mute?: boolean) {\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n if(mute === undefined) {\n mute = !appNotificationsManager.isPeerLocalMuted(peerId, false);\n }\n \n settings.mute_until = mute ? MUTE_UNTIL : 0;\n\n return appNotificationsManager.updateNotifySettings({\n _: 'inputNotifyPeer',\n peer: appPeersManager.getInputPeerById(peerId)\n }, settings);\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(peerId.isAnyChat()) {\n //const isChannel = appPeersManager.isChannel(peerId);\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n const hasRights = /* isChannel && */appChatsManager.hasRights(peerId.toChatId(), action, undefined, !!threadId); \n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n // this.log('pdata', randomID, pendingData)\n\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(!tempMessage.deleted) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n rootScope.dispatchEvent('messages_pending');\n \n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n //this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n //this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = appDownloadManager.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = appDownloadManager.getCacheContext(photo, 'full');\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = appPhotosManager.getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const doc = appDocsManager.getDoc('' + tempId);\n if(doc) {\n if(/* doc._ !== 'documentEmpty' && */doc.type && doc.type !== 'sticker' && doc.mime_type !== 'image/gif') {\n const cacheContext = appDownloadManager.getCacheContext(newDoc);\n const oldCacheContext = appDownloadManager.getCacheContext(doc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = appDocsManager.getInputFileName(newDoc);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete appPollsManager.polls[tempId];\n delete appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n \n this.handleReleasingMessage(tempMessage, storage);\n\n rootScope.dispatchEvent('message_sent', {storage, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n appStateManager.pushToState('maxSeenMsgId', maxId);\n\n apiManager.invokeApi('messages.receivedMessages', {\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n increment: true\n }).then(views => {\n const updates: Update[] = new Array(mids.length);\n const channelId = peerId.toChatId();\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: channelId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n const notification: NotifyOptions = {};\n const peerString = appPeersManager.getPeerString(peerId);\n let notificationMessage: string;\n\n if(options.peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && options.fwdCount) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [options.fwdCount]);\n } else {\n notificationMessage = this.wrapMessageForReply(message, undefined, undefined, true);\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n notification.title = appPeersManager.getPeerTitle(peerId, true);\n if(peerId.isAnyChat() && message.fromId !== message.peerId) {\n notification.title = appPeersManager.getPeerTitle(message.fromId, true) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = RichTextProcessor.wrapPlainText(notification.title);\n\n notification.onclick = () => {\n rootScope.dispatchEvent('history_focus', {peerId, mid: message.mid});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;//message.pFlags.silent || false;\n\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').loadPromise.then(url => {\n if(message.pFlags.unread) {\n notification.image = url;\n appNotificationsManager.notify(notification);\n }\n });\n } else {\n appNotificationsManager.notify(notification);\n }\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ?? (this.scheduledMessagesStorage[peerId] = this.createMessageStorage());\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId): Promise {\n if(!this.canSendToPeer(peerId)) return Promise.resolve([]);\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return Promise.resolve([...storage.keys()]);\n }\n\n return apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then(historyResult => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n \n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n \n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.filterMessages(message, message => !!(message as Message.message).replies)[0] as any;\n if(!(message && message.replies && message.replies.pFlags.comments && message.replies.channel_id !== '777')) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && !appChatsManager.isInChat(peerId.toChatId());\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n let historyResult = this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n if(historyResult instanceof Promise) {\n historyResult = await historyResult;\n }\n\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(peerId, historyResult.history[i]);\n }\n\n return historyStorage;\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n public getHistory(peerId: PeerId, maxId = 0, limit: number, backLimit?: number, threadId?: number): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n let offset = 0;\n /* \n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map(message => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: haveSlice.slice,\n offsetIdOffset: haveSlice.offsetIdOffset\n }; \n }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n return {\n count: historyStorage.count,\n history: slice?.slice || historyStorage.history.constructSlice(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(slicedArray: SlicedArray, \n historyResult: Parameters[0], \n offset_id: number, \n limit: number, \n add_offset: number) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually. \n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && appMessagesIdsManager.getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n \n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise {\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n historyStorage.maxId = slice[0]; // ! WARNING\n }\n \n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise> {\n //console.trace('requestHistory', peerId, maxId, limit, offset);\n\n //rootScope.broadcast('history_request');\n\n const options: any = {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n options.msg_id = appMessagesIdsManager.getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if(appPeersManager.isChannel(peerId)) {\n apiUpdatesManager.addChannelState(peerId.toChatId(), (historyResult as MessagesMessages.messagesChannelMessages).pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && historyResult.messages[length - 1].deleted) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch (error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(peerId.toChatId());\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = new Promise((resolve) => {\n setTimeout(() => {\n const requestPromises: Promise[] = [];\n \n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: appMessagesIdsManager.getServerMessageId(mid)\n };\n });\n \n let promise: Promise;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n promise = apiManager.invokeApiSingle('channels.getMessages', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then(getMessagesResult => {\n assumeType>(getMessagesResult);\n\n appUsersManager.saveApiUsers(getMessagesResult.users);\n appChatsManager.saveApiChats(getMessagesResult.chats);\n this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < getMessagesResult.messages.length; ++i) {\n const message = getMessagesResult.messages[i];\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(getMessagesResult.messages[i]);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n \n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n Promise.all(requestPromises).finally(() => {\n this.fetchSingleMessagesPromise = null;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n resolve();\n });\n }, 0);\n });\n }\n\n public wrapSingleMessage(peerId: PeerId, mid: number, overwrite = false): Promise {\n const message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && !overwrite) {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public fetchMessageReplyTo(message: MyMessage): Promise {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.wrapSingleMessage(replyToPeerId, message.reply_to_mid).then(originalMessage => {\n if(originalMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\n delete message.reply_to_mid; // ! WARNING!\n }\n\n return originalMessage;\n });\n }\n\n public setTyping(peerId: PeerId, action: SendMessageAction): Promise {\n let typing = this.typings[peerId];\n if(!rootScope.myId || \n !peerId || \n !this.canSendToPeer(peerId) || \n peerId === rootScope.myId ||\n typing?.type === 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 type: action._\n };\n\n return apiManager.invokeApi('messages.setTyping', {\n peer: appPeersManager.getInputPeerById(peerId),\n action\n }).finally(() => {\n if(typing === this.typings[peerId]) {\n typing.timeout = window.setTimeout(() => {\n delete this.typings[peerId];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number, \n unread: number, \n unreadMentions: number, \n msgs: Set,\n albums?: {[groupId: string]: Set},\n } = {\n count: 0, \n unread: 0, \n unreadMentions: 0, \n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(message.deleted) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n appNotificationsManager.cancel('msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n\n const peerMessagesToHandle = this.newMessagesToHandle[peerId];\n if(peerMessagesToHandle && peerMessagesToHandle.has(mid)) {\n peerMessagesToHandle.delete(mid);\n }\n }\n\n if(history.albums) {\n for(const groupId in history.albums) {\n rootScope.dispatchEvent('album_edit', {peerId, groupId, deletedMids: [...history.albums[groupId]]});\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n \n private handleEditedMessage(oldMessage: Message, newMessage: Message) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n }\n }\n\n public getMediaFromMessage(message: any) {\n return message.action ? \n message.action.photo : \n message.media && (\n message.media.photo || \n message.media.document || (\n message.media.webpage && (\n message.media.webpage.document || \n message.media.webpage.photo\n )\n )\n );\n }\n\n public isMentionUnread(message: MyMessage) {\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return message.pFlags.media_unread && \n message.pFlags.mentioned && \n (\n !doc || \n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n );\n }\n\n public getDialogUnreadCount(dialog: Dialog) {\n return dialog.unread_count || +!!dialog.pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog) {\n return !!this.getDialogUnreadCount(dialog);\n }\n}\n\nconst appMessagesManager = new AppMessagesManager();\nMOUNT_CLASS_TO.appMessagesManager = appMessagesManager;\nexport default appMessagesManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto } from \"../../layer\";\r\nimport type { LangPackKey } from \"../langPack\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { isObject } from \"../../helpers/object\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport I18n from '../langPack';\r\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\r\n\r\n// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\r\n/*\r\n HTML-color IRC-color Description\r\n #c03d33 4 red\r\n #4fad2d 3 green\r\n #d09306 7 yellow\r\n #168acd 10 blue\r\n #8544d6 6 purple\r\n #cd4073 13 pink\r\n #2996ad 11 sea\r\n #ce671b 5 orange\r\n */\r\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\r\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\r\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\r\n\r\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\r\nexport class AppPeersManager {\r\n /* public savePeerInstance(peerId: PeerId, instance: any) {\r\n if(peerId < 0) appChatsManager.saveApiChat(instance);\r\n else appUsersManager.saveApiUser(instance);\r\n } */\r\n\r\n public canPinMessage(peerId: PeerId) {\r\n return peerId.isUser() || appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\r\n }\r\n\r\n public getPeerPhoto(peerId: PeerId): UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto {\r\n const photo = peerId.isUser() \r\n ? appUsersManager.getUserPhoto(peerId.toUserId())\r\n : appChatsManager.getChatPhoto(peerId.toChatId());\r\n\r\n return photo._ !== 'chatPhotoEmpty' && photo._ !== 'userProfilePhotoEmpty' ? photo : null;\r\n }\r\n\r\n public getPeerMigratedTo(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return false;\r\n }\r\n\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\r\n return this.getPeerId(chat.migrated_to as InputChannel.inputChannel);\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public getPeerTitle(peerId: PeerId, plainText = false, onlyFirstName = false) {\r\n if(!peerId) {\r\n peerId = rootScope.myId;\r\n }\r\n \r\n let title = '';\r\n if(peerId.isUser()) {\r\n const user = appUsersManager.getUser(peerId.toUserId());\r\n if(user.first_name) title += user.first_name;\r\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\r\n \r\n if(!title) title = user.pFlags.deleted ? I18n.format('HiddenName', true) : user.username;\r\n else title = title.trim();\r\n } else {\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n title = chat.title;\r\n\r\n if(onlyFirstName) {\r\n title = title.split(' ')[0];\r\n }\r\n }\r\n \r\n return plainText ? title : RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n public getOutputPeer(peerId: PeerId): Peer {\r\n if(peerId.isUser()) {\r\n return {_: 'peerUser', user_id: peerId.toUserId()};\r\n }\r\n\r\n const chatId = peerId.toChatId();\r\n if(appChatsManager.isChannel(chatId)) {\r\n return {_: 'peerChannel', channel_id: chatId};\r\n }\r\n\r\n return {_: 'peerChat', chat_id: chatId};\r\n }\r\n\r\n public getPeerString(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return appUsersManager.getUserString(peerId.toUserId());\r\n }\r\n return appChatsManager.getChatString(peerId.toChatId());\r\n }\r\n\r\n public getPeerUsername(peerId: PeerId): string {\r\n return this.getPeer(peerId).username || '';\r\n }\r\n\r\n public getPeer(peerId: PeerId) {\r\n return peerId.isUser()\r\n ? appUsersManager.getUser(peerId.toUserId())\r\n : appChatsManager.getChat(peerId.toChatId());\r\n }\r\n\r\n public getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | PeerId | string): PeerId {\r\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'number') return peerId;\r\n else if(isObject(peerId)) {\r\n const userId = (peerId as Peer.peerUser).user_id;\r\n if(userId !== undefined) {\r\n return userId.toPeerId(false);\r\n }\r\n\r\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\r\n if(chatId !== undefined) {\r\n return chatId.toPeerId(true);\r\n }\r\n\r\n return rootScope.myId; // maybe it is an inputPeerSelf\r\n // } else if(!peerId) return 'u0';\r\n } else if(!peerId) return NULL_PEER_ID;\r\n \r\n const isUser = (peerId as string).charAt(0) === 'u';\r\n const peerParams = (peerId as string).substr(1).split('_');\r\n\r\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\r\n }\r\n\r\n public getDialogPeer(peerId: PeerId): DialogPeer {\r\n return {\r\n _: 'dialogPeer',\r\n peer: this.getOutputPeer(peerId)\r\n };\r\n }\r\n\r\n public isChannel(peerId: PeerId): boolean {\r\n return !peerId.isUser() && appChatsManager.isChannel(peerId.toChatId());\r\n }\r\n\r\n public isMegagroup(peerId: PeerId) {\r\n return !peerId.isUser() && appChatsManager.isMegagroup(peerId.toChatId());\r\n }\r\n\r\n public isAnyGroup(peerId: PeerId): boolean {\r\n return !peerId.isUser() && !appChatsManager.isBroadcast(peerId.toChatId());\r\n }\r\n\r\n public isBroadcast(peerId: PeerId): boolean {\r\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\r\n }\r\n\r\n public isBot(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isBot(peerId.toUserId());\r\n }\r\n\r\n public isContact(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isContact(peerId.toUserId());\r\n }\r\n\r\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\r\n return +peerId >= 0;\r\n }\r\n \r\n public isAnyChat(peerId: PeerId) {\r\n return !this.isUser(peerId);\r\n }\r\n\r\n /* public 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 if(!appChatsManager.isChannel(chatId)) {\r\n return appChatsManager.getChatInputPeer(chatId);\r\n } else {\r\n return appChatsManager.getChannelInputPeer(chatId);\r\n }\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n return appUsersManager.getUserInputPeer(userId);\r\n }\r\n\r\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\r\n return {_: 'inputPeerSelf'};\r\n }\r\n\r\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\r\n return {\r\n _: 'inputDialogPeer',\r\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\r\n };\r\n }\r\n\r\n public getPeerColorById(peerId: PeerId, pic = true) {\r\n if(!peerId) return '';\r\n\r\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\r\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\r\n return color;\r\n }\r\n\r\n public getPeerSearchText(peerId: PeerId) {\r\n let text: string;\r\n if(this.isUser(peerId)) {\r\n text = '%pu ' + appUsersManager.getUserSearchText(peerId.toUserId());\r\n } else {\r\n const chat = appChatsManager.getChat(peerId.toChatId());\r\n text = '%pg ' + (chat.title || '');\r\n }\r\n\r\n return text;\r\n }\r\n\r\n public getDialogType(peerId: PeerId): PeerType {\r\n if(this.isMegagroup(peerId)) {\r\n return 'megagroup';\r\n } else if(this.isChannel(peerId)) {\r\n return 'channel';\r\n } else if(!this.isUser(peerId)) {\r\n return 'group';\r\n } else {\r\n return peerId === rootScope.myId ? 'saved' : 'chat';\r\n }\r\n }\r\n\r\n public getDeleteButtonText(peerId: PeerId): LangPackKey {\r\n switch(this.getDialogType(peerId)) {\r\n case 'channel':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\r\n\r\n case 'megagroup':\r\n case 'group':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\r\n \r\n default:\r\n return 'ChatList.Context.DeleteChat';\r\n }\r\n }\r\n}\r\n\r\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\r\n\r\n[\r\n 'isChannel',\r\n 'isMegagroup',\r\n 'isAnyGroup',\r\n 'isBroadcast',\r\n 'isBot',\r\n 'isContact',\r\n 'isUser',\r\n 'isAnyChat',\r\n].forEach((value) => {\r\n const newMethod = Array.isArray(value) ? value[0] : value;\r\n const originMethod = Array.isArray(value) ? value[1] : value;\r\n // @ts-ignore\r\n String.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this.toString());\r\n };\r\n\r\n // @ts-ignore\r\n Number.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this);\r\n };\r\n});\r\n\r\ndeclare global {\r\n interface String {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n\r\n interface Number {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n}\r\n\r\nconst appPeersManager = new AppPeersManager();\r\nMOUNT_CLASS_TO.appPeersManager = appPeersManager;\r\nexport default appPeersManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { isObject, safeReplaceObject, copy, deepEqual } from \"../../helpers/object\";\nimport { ChannelParticipant, Chat, ChatAdminRights, ChatBannedRights, ChatParticipant, ChatPhoto, InputChannel, InputChatPhoto, InputFile, InputPeer, Update, Updates } from \"../../layer\";\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager {\n private storage = appStateManager.storages.chats;\n \n private chats: {[id: ChatId]: Chat.channel | Chat.chat | any};\n //private usernames: any;\n //private channelAccess: any;\n //private megagroups: {[id: number]: true};\n\n constructor() {\n this.clear(true);\n\n rootScope.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n apiManagerProxy.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = appPeersManager.getPeerId(update.peer).toChatId();\n const chat: Chat.chat = this.chats[chatId];\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n appStateManager.getState().then((state) => {\n const chats = appStateManager.storagesResults.chats;\n if(chats.length) {\n for(let i = 0, length = chats.length; i < length; ++i) {\n const chat = chats[i];\n if(chat) {\n this.chats[chat.id] = chat;\n }\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const chats = appStateManager.storagesResults.chats;\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!appStateManager.isPeerNeeded(chatId.toPeerId(true))) {\n /* const chat = this.chats[chatId];\n if(chat.username) {\n delete this.usernames[cleanUsername(chat.username)];\n } */\n \n chats.findAndSplice((chat) => chat.id === chatId);\n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n }\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach(chat => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(chat._ === 'chatEmpty') return;\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\n return;\n } */\n \n // * exclude from state\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\n\n const oldChat: Exclude = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n if((chat as Chat.chat).pFlags === undefined) {\n (chat as Chat.chat).pFlags = {};\n }\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n chat.initials = RichTextProcessor.getAbbreviation(chat.title);\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n let changedPhoto = false, changedTitle = false;\n if(oldChat === undefined) {\n this.chats[chat.id] = chat;\n } else {\n const oldPhotoId = ((oldChat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const newPhotoId = ((chat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n if(oldChat.title !== chat.title) {\n changedTitle = true;\n }\n\n safeReplaceObject(oldChat, chat);\n rootScope.dispatchEvent('chat_update', chat.id);\n }\n\n const peerId = chat.id.toPeerId(true);\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', peerId);\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', peerId);\n }\n\n if(appStateManager.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id] || {_: 'chatEmpty', id, deleted: true, access_hash: '', pFlags: {}/* this.channelAccess[id] */};\n }\n\n public getChatTyped(id: ChatId): Chat {\n return this.getChat(id);\n }\n\n public combineParticipantBannedRights(id: ChatId, rights: ChatBannedRights) {\n const chat: Chat.channel = this.getChat(id);\n\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(let i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n }\n\n /**\n * Check the user's ability to do an action in chat\n * @param id \n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread \n * @returns \n */\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty') return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n const isCheckingRightsForSelf = rights === undefined;\n if((chat as Chat.chat).pFlags.creator && isCheckingRightsForSelf) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n (chat as Chat.chat).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n // const adminRights = chat.admin_rights;\n // const bannedRights = (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n rights = chat.admin_rights || (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n return false;\n }\n }\n\n let myFlags: Partial<{[flag in keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags']]: true}> = {};\n if(rights) {\n myFlags = rights.pFlags as any;\n }\n\n // const adminFlags = adminRights?.pFlags || {};\n // const bannedFlags = bannedRights?.pFlags || {};\n\n switch(action) {\n case 'embed_links':\n case 'send_games':\n case 'send_gifs':\n case 'send_inline':\n case 'send_media':\n case 'send_messages':\n case 'send_polls':\n case 'send_stickers': {\n if(!isThread && chat.pFlags.left) {\n return false;\n }\n\n if(rights._ === 'chatBannedRights' && myFlags[action]) {\n return false;\n }\n\n if(chat._ === 'channel') {\n if(!chat.pFlags.megagroup && !myFlags.post_messages) {\n return false;\n }\n }\n\n break;\n }\n\n // * revoke foreign messages\n case 'delete_messages':\n case 'manage_call': {\n return !!myFlags[action];\n }\n\n case 'pin_messages': {\n return rights._ === 'chatAdminRights' ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n // case 'change_info': {\n // return adminRights || isCheckingRightsForSelf ? adminFlags[action] : !myFlags[action];\n // }\n\n case 'change_info':\n case 'invite_users': {\n return rights._ === 'chatAdminRights' ? myFlags[action] : !myFlags[action];\n }\n\n // * only creator can do that\n case 'change_type':\n case 'delete_chat': {\n return false;\n }\n\n case 'ban_users':\n case 'change_permissions': {\n return rights._ === 'chatAdminRights' && !!myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\n }\n\n return true;\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat: Chat.chat = this.getChat(id);\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n \n return apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat && chat._ === 'channel' && chat.pFlags.megagroup);\n }\n\n public isBroadcast(id: ChatId) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n\n public isInChat(id: ChatId) {\n let good = true;\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channelForbidden' \n || chat._ === 'chatForbidden' \n || chat._ === 'chatEmpty' \n || (chat as Chat.chat).pFlags.left \n || (chat as Chat.chat).pFlags.kicked \n || (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty' || !(chat as Chat.channel).access_hash) {\n return {\n _: 'inputChannelEmpty'\n };\n } else {\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\n };\n }\n }\n\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: this.getChat(id).access_hash/* || this.channelAccess[id] */ || 0\n };\n }\n\n public hasChat(id: ChatId, allowMin?: true) {\n const chat = this.chats[id];\n return isObject(chat) && (allowMin || !chat.pFlags.min);\n }\n\n public getChatPhoto(id: ChatId) {\n const chat: Chat.chat = this.getChat(id);\n\n return chat && chat.photo || {\n _: 'chatPhotoEmpty'\n };\n }\n\n public getChatString(id: ChatId) {\n const chat = this.getChat(id);\n if(this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = RichTextProcessor.wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(title: string, about: string): Promise {\n return apiManager.invokeApi('channels.createChannel', {\n broadcast: true,\n title,\n about\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: channelId.toPeerId(true)});\n\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map(u => appUsersManager.getUserInput(u));\n\n return apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise {\n return apiManager.invokeApi('messages.createChat', {\n users: userIds.map(u => appUsersManager.getUserInput(u)),\n title\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: chatId.toPeerId(true)});\n\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: any) => {\n //console.log('onChatUpdated', chatId, updates);\n\n apiUpdatesManager.processUpdateMessage(updates);\n if(updates?.updates?.length && this.isChannel(chatId)) {\n rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n //return this.leaveChat(id).then(() => {\n return apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n //});\n }\n\n public migrateChat(id: ChatId): Promise {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find(u => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string) {\n return apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n }).then((bool) => {\n if(bool) {\n const chat: Chat.channel = this.getChat(id);\n chat.username = username;\n }\n\n return bool;\n });\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return apiManager.invokeApi('messages.editChatAbout', {\n peer: appPeersManager.getInputPeerById(peerId),\n about\n }).then(bool => {\n if(bool) {\n rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ? \n appPeersManager.getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) : \n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : this.getParticipantPeerId(participant);\n return apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: appUsersManager.getSelf().id,\n peer: appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n \n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\n }\n\n public resolveChannel(id: ChatId) {\n return apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then(messagesChats => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then(channelId => {\n return apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n });\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n}\n\nconst appChatsManager = new AppChatsManager();\nMOUNT_CLASS_TO.appChatsManager = appChatsManager;\nexport default appChatsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { i18n } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\n\r\nexport type PeerTitleOptions = {\r\n peerId: PeerId,\r\n plainText?: boolean,\r\n onlyFirstName?: boolean,\r\n dialog?: boolean\r\n};\r\n\r\nconst weakMap: WeakMap = new WeakMap();\r\n\r\nMOUNT_CLASS_TO.peerTitleWeakMap = weakMap;\r\n\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n const elements = Array.from(document.querySelectorAll(`.peer-title[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n const peerTitle = weakMap.get(element);\r\n //console.log('in the summer silence i was doing nothing', peerTitle, peerId);\r\n\r\n if(peerTitle) {\r\n peerTitle.update();\r\n }\r\n });\r\n});\r\n\r\nexport default class PeerTitle {\r\n public element: HTMLElement;\r\n public peerId: PeerId;\r\n public plainText = false;\r\n public onlyFirstName = false;\r\n public dialog = false;\r\n\r\n constructor(options: PeerTitleOptions) {\r\n this.element = document.createElement('span');\r\n this.element.classList.add('peer-title');\r\n this.element.setAttribute('dir', 'auto');\r\n \r\n this.update(options);\r\n weakMap.set(this.element, this);\r\n }\r\n\r\n public update(options?: PeerTitleOptions) {\r\n if(options) {\r\n for(let i in options) {\r\n // @ts-ignore\r\n this.element.dataset[i] = options[i] ? '' + (typeof(options[i]) === 'boolean' ? +options[i] : options[i]) : '0';\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n if(this.peerId !== rootScope.myId || !this.dialog) {\r\n if(this.peerId.isUser() && appUsersManager.getUser(this.peerId).pFlags.deleted) {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Deleted' : 'HiddenName'));\r\n } else {\r\n this.element.innerHTML = appPeersManager.getPeerTitle(this.peerId, this.plainText, this.onlyFirstName);\r\n }\r\n } else {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Saved' : 'SavedMessages'));\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\nimport { bytesFromHex } from \"../../helpers/bytes\";\nimport { CancellablePromise } from \"../../helpers/cancellablePromise\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport { safeReplaceArrayInObject, isObject } from \"../../helpers/object\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { InputFileLocation, InputMedia, InputPhoto, Photo, PhotoSize, PhotosPhotos } from \"../../layer\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager, { ThumbCache } from \"./appDownloadManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport blur from \"../../helpers/blur\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport { makeMediaSize, MediaSize } from \"../../helpers/mediaSizes\";\nimport windowSize from \"../../helpers/windowSize\";\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n//let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n private static jpegHeader = bytesFromHex('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00');\n private static jpegTail = bytesFromHex('ffd9');\n \n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(photo._ === 'photoEmpty') return undefined;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n \n public choosePhotoSize(photo: MyPhoto | MyDocument, boxWidth = 0, boxHeight = 0, useBytes = false, pushDocumentSize = false) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n \n /*\n s\tbox\t100x100\n m\tbox\t320x320\n x\tbox\t800x800\n y\tbox\t1280x1280\n w\tbox\t2560x2560\n a\tcrop\t160x160\n b\tcrop\t320x320\n c\tcrop\t640x640\n d\tcrop\t1280x1280 */\n\n let bestPhotoSize: PhotoSize = {_: 'photoSizeEmpty', type: ''};\n let sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n if(pushDocumentSize && sizes && photo._ === 'document') {\n sizes = sizes.concat({\n _: 'photoSize', \n w: (photo as MyDocument).w, \n h: (photo as MyDocument).h, \n size: (photo as MyDocument).size, \n type: undefined\n });\n }\n\n if(sizes?.length) {\n for(let i = 0, length = sizes.length; i < length; ++i) {\n const photoSize = sizes[i];\n if(!('w' in photoSize) && !('h' in photoSize)) continue;\n \n bestPhotoSize = photoSize;\n \n const size = calcImageInBox(photoSize.w, photoSize.h, boxWidth, boxHeight);\n if(size.width >= boxWidth || size.height >= boxHeight) {\n break;\n }\n }\n\n if(useBytes && bestPhotoSize._ === 'photoSizeEmpty' && sizes[0]._ === 'photoStrippedSize') {\n bestPhotoSize = sizes[0];\n }\n }\n \n return bestPhotoSize;\n }\n \n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = appUsersManager.getUserInput(userId);\n return apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n \n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n public getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker) {\n arr = new Uint8Array(AppPhotosManager.jpegHeader.concat(Array.from(bytes.slice(3)), AppPhotosManager.jpegTail));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n const blob = new Blob([arr], {type: mimeType});\n return URL.createObjectURL(blob);\n }\n\n /**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\n public getPathFromPhotoPathSize(size: PhotoSize.photoPathSize) {\n const bytes = size.bytes;\n const lookup = \"AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,\";\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-'; \n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n }\n\n public getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n return cacheContext.url || (cacheContext.url = this.getPreviewURLFromBytes(thumb.bytes, isSticker));\n }\n \n public getImageFromStrippedThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, useBlur: boolean) {\n const url = this.getPreviewURLFromThumb(photo, thumb, false);\n\n const image = new Image();\n image.classList.add('thumbnail');\n\n const loadPromise = (useBlur ? blur(url) : Promise.resolve(url)).then(url => {\n return renderImageFromUrlPromise(image, url);\n });\n \n return {image, loadPromise};\n }\n \n public setAttachmentSize(\n photo: MyPhoto | MyDocument, \n element: HTMLElement | SVGForeignObjectElement, \n boxWidth: number, \n boxHeight: number, \n noZoom = true, \n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n ) {\n if(!photoSize) {\n photoSize = this.choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n //console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n \n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument) {\n size = makeMediaSize((photo as MyDocument).w || (photoSize as PhotoSize.photoSize).w || 512, (photo as MyDocument).h || (photoSize as PhotoSize.photoSize).h || 512);\n } else {\n size = makeMediaSize((photoSize as PhotoSize.photoSize).w || 100, (photoSize as PhotoSize.photoSize).h || 100);\n }\n\n let boxSize = makeMediaSize(boxWidth, boxHeight);\n\n boxSize = size = size.aspect(boxSize, noZoom);\n\n let isFit = true;\n\n if(!isDocument || ['video', 'gif'].includes((photo as MyDocument).type)) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n \n if(message && \n (message.message || \n message.reply_to_mid || \n message.media.webpage || \n (message.replies && message.replies.pFlags.comments && message.replies.channel_id !== 777)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n \n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n \n return {photoSize, size, isFit};\n }\n\n public getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false): ReturnType {\n if(!cacheContext.downloaded || (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type) || ignoreCache) {\n if(photo._ === 'document' && cacheContext.downloaded && !ignoreCache) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find(size => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return this.getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n }\n \n public getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n //console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n \n // maybe it's a thumb\n const isPhoto = (photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference;\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id, \n location, \n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined, \n queueId, \n onlyCache\n };\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n \n public preloadPhoto(photoId: MyPhoto | MyDocument | string, photoSize?: PhotoSize, queueId?: number, onlyCache?: boolean): CancellablePromise {\n const photo = this.getPhoto(photoId);\n\n // @ts-ignore\n if(!photo || photo._ === 'photoEmpty') {\n throw new Error('preloadPhoto photoEmpty!');\n }\n\n if(!photoSize) {\n const fullWidth = windowSize.width;\n const fullHeight = windowSize.height;\n \n photoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n }\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n if(cacheContext.downloaded >= ('size' in photoSize ? photoSize.size : 0) && cacheContext.url) {\n return Promise.resolve() as any;\n }\n \n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize, queueId, onlyCache);\n const fileName = getFileNameByLocation(downloadOptions.location);\n\n let download = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n download = appDownloadManager.download(downloadOptions);\n download.then(blob => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n cacheContext.url = url;\n\n //console.log('wrote photo:', photo, photoSize, cacheContext, blob);\n }\n\n return blob;\n }).catch(() => {});\n\n return download;\n }\n \n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n\n public getInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n }\n\n public getMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: this.getInput(photo),\n ttl_seconds: 0\n };\n }\n\n public savePhotoFile(photo: MyPhoto | MyDocument, queueId?: number) {\n const fullPhotoSize = this.choosePhotoSize(photo, 0xFFFF, 0xFFFF);\n if(!(fullPhotoSize._ === 'photoSize' || fullPhotoSize._ === 'photoSizeProgressive')) {\n return;\n }\n\n const downloadOptions = this.getPhotoDownloadOptions(photo, fullPhotoSize, queueId);\n downloadOptions.fileName = 'photo' + photo.id + '.jpg';\n appDownloadManager.downloadToDisc(downloadOptions, downloadOptions.fileName);\n }\n}\n\nconst appPhotosManager = new AppPhotosManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appPhotosManager = appPhotosManager);\nexport default appPhotosManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { FileURLType, getFileNameByLocation, getFileURL } from '../../helpers/fileName';\nimport { safeReplaceArrayInObject, defineNotNumerableProperties, isObject } from '../../helpers/object';\nimport { Document, InputFileLocation, InputMedia, PhotoSize } from '../../layer';\nimport referenceDatabase, { ReferenceContext } from '../mtproto/referenceDatabase';\nimport opusDecodeController from '../opusDecodeController';\nimport { RichTextProcessor } from '../richtextprocessor';\nimport appDownloadManager, { DownloadBlob } from './appDownloadManager';\nimport appPhotosManager from './appPhotosManager';\nimport blur from '../../helpers/blur';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { getFullDate } from '../../helpers/date';\nimport rootScope from '../rootScope';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\nconst EXTENSION_MIME_TYPE_MAP = {\n mov: 'video/quicktime',\n gif: 'image/gif',\n pdf: 'application/pdf',\n};\n\nexport class AppDocsManager {\n private docs: {[docId: DocId]: MyDocument} = {};\n private savingLottiePreview: {[docId: DocId]: true} = {};\n public downloading: Map = new Map();\n\n constructor() {\n apiManager.onServiceWorkerFail = this.onServiceWorkerFail;\n }\n\n public onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n const cacheContext = appDownloadManager.getCacheContext(doc);\n delete cacheContext.url;\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(doc._ === 'documentEmpty') {\n return undefined;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n referenceDatabase.saveContext(doc.file_reference, context);\n }\n \n //console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name', \n // 'file', 'duration', 'downloaded', 'url', 'audioTitle', \n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw', \n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n doc.attributes.forEach(attribute => {\n switch(attribute._) {\n case 'documentAttributeFilename':\n doc.file_name = RichTextProcessor.wrapPlainText(attribute.file_name);\n doc.fileName = RichTextProcessor.wrapEmojiText(attribute.file_name);\n break;\n\n case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.audioTitle = RichTextProcessor.wrapEmojiText(attribute.title);\n doc.audioPerformer = RichTextProcessor.wrapEmojiText(attribute.performer);\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n /* if(apiDoc.type === 'audio') {\n apiDoc.supportsStreaming = true;\n } */\n break;\n\n case 'documentAttributeVideo':\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n //apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n\n case 'documentAttributeSticker':\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n doc.stickerEmoji = RichTextProcessor.wrapRichText(doc.stickerEmojiRaw, {noLinks: true, noLinebreaks: true});\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n }\n break;\n\n case 'documentAttributeImageSize':\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n\n case 'documentAttributeAnimated':\n if((doc.mime_type === 'image/gif' || doc.mime_type === 'video/mp4')/* && apiDoc.thumbs */) {\n doc.type = 'gif';\n }\n\n doc.animated = true;\n break;\n }\n });\n \n if(!doc.mime_type) {\n const ext = (doc.file_name || '').split('.').pop();\n // @ts-ignore\n const mappedMimeType = ext && EXTENSION_MIME_TYPE_MAP[ext.toLowerCase()];\n if(mappedMimeType) {\n doc.mime_type = mappedMimeType;\n } else {\n switch(doc.type) {\n case 'gif':\n case 'video':\n case 'round':\n doc.mime_type = 'video/mp4';\n break;\n case 'sticker':\n doc.mime_type = 'image/webp';\n break;\n case 'audio':\n doc.mime_type = 'audio/mpeg';\n break;\n case 'voice':\n doc.mime_type = 'audio/ogg';\n break;\n default:\n doc.mime_type = 'application/octet-stream';\n break;\n }\n }\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.pdf) {\n doc.type = 'pdf';\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.gif) {\n doc.type = 'gif';\n }\n\n if(doc.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n doc.file_name = doc.fileName = doc.type + '_' + getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n }\n\n if(apiManager.isServiceWorkerOnline()) {\n if((doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video'/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n \n const cacheContext = appDownloadManager.getCacheContext(doc);\n if(!cacheContext.url) {\n cacheContext.url = this.getFileURL(doc);\n }\n }\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n \n if(!doc.file_name) {\n doc.file_name = doc.fileName = '';\n }\n\n if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n \n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject(docId) ? docId : this.docs[docId];\n }\n\n public getMediaInput(doc: MyDocument): InputMedia.inputMediaDocument {\n return {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n },\n ttl_seconds: 0\n };\n }\n\n public getInput(doc: MyDocument, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\n return {\n _: 'inputDocumentFileLocation',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference,\n thumb_size: thumbSize\n };\n }\n\n public getFileDownloadOptions(doc: MyDocument, thumb?: PhotoSize.photoSize, queueId?: number, onlyCache?: boolean) {\n const inputFileLocation = this.getInput(doc, thumb?.type);\n\n let mimeType: string;\n if(thumb) {\n mimeType = doc.sticker ? 'image/webp' : 'image/jpeg'/* doc.mime_type */;\n } else {\n mimeType = doc.mime_type || 'application/octet-stream';\n }\n\n return {\n dcId: doc.dc_id, \n location: inputFileLocation, \n size: thumb ? thumb.size : doc.size, \n mimeType,\n fileName: doc.file_name,\n queueId,\n onlyCache\n };\n }\n\n public getFileURL(doc: MyDocument, download = false, thumb?: PhotoSize.photoSize) {\n let type: FileURLType;\n if(download) {\n type = 'download';\n } else if(thumb) {\n type = 'thumb';\n } else if(doc.supportsStreaming) {\n type = 'stream';\n } else {\n type = 'document';\n }\n\n return getFileURL(type, this.getFileDownloadOptions(doc, thumb));\n }\n\n public getThumbURL(doc: MyDocument, thumb: PhotoSize.photoSize | PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize) {\n let promise: Promise = Promise.resolve();\n\n const cacheContext = appDownloadManager.getCacheContext(doc, thumb.type);\n if(!cacheContext.url) {\n if('bytes' in thumb) {\n promise = blur(appPhotosManager.getPreviewURLFromBytes(thumb.bytes, !!doc.sticker)).then(url => {\n cacheContext.url = url;\n }) as any;\n } else {\n //return this.getFileURL(doc, false, thumb);\n promise = appPhotosManager.preloadPhoto(doc, thumb) as any;\n }\n }\n\n return {thumb, cacheContext, promise};\n }\n\n public getThumb(doc: MyDocument, tryNotToUseBytes = true) {\n const thumb = appPhotosManager.choosePhotoSize(doc, 0, 0, !tryNotToUseBytes);\n if(thumb._ === 'photoSizeEmpty') return null;\n return this.getThumbURL(doc, thumb as any);\n }\n\n public getInputFileName(doc: MyDocument, thumbSize?: string) {\n return getFileNameByLocation(this.getInput(doc, thumbSize), {fileName: doc.file_name});\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean): DownloadBlob {\n const fileName = this.getInputFileName(doc);\n\n let download: DownloadBlob = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n const downloadOptions = this.getFileDownloadOptions(doc, undefined, queueId, onlyCache);\n download = appDownloadManager.download(downloadOptions);\n this.downloading.set(doc.id, download);\n rootScope.dispatchEvent('download_start', doc.id);\n\n const cacheContext = appDownloadManager.getCacheContext(doc);\n const originalPromise = download;\n originalPromise.then((blob) => {\n cacheContext.url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n }, () => {}).finally(() => {\n this.downloading.delete(doc.id);\n });\n \n if(doc.type === 'voice' && !opusDecodeController.isPlaySupported()) {\n download = originalPromise.then(async(blob) => {\n const reader = new FileReader();\n \n await new Promise((resolve, reject) => {\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n //console.log('sending uint8 to decoder:', uint8);\n opusDecodeController.decode(uint8).then(result => {\n cacheContext.url = result.url;\n resolve();\n }, (err) => {\n delete cacheContext.downloaded;\n reject(err);\n });\n };\n \n reader.readAsArrayBuffer(blob);\n });\n \n return blob;\n });\n }\n\n download.then(() => {\n rootScope.dispatchEvent('document_downloaded', doc);\n });\n\n return download;\n }\n\n public saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n if(this.savingLottiePreview[key]/* || true */) return;\n\n if(!doc.stickerCachedThumbs) {\n defineNotNumerableProperties(doc, ['stickerCachedThumbs']);\n doc.stickerCachedThumbs = {};\n }\n\n const thumb = doc.stickerCachedThumbs[toneIndex];\n if(thumb && thumb.w >= canvas.width && thumb.h >= canvas.height) {\n return;\n }\n\n /* if(doc.thumbs.find(t => t._ === 'photoStrippedSize') \n || (doc.stickerCachedThumb || (doc.stickerSavedThumbWidth >= canvas.width && doc.stickerSavedThumbHeight >= canvas.height))) {\n return;\n } */\n\n this.savingLottiePreview[key] = true;\n canvas.toBlob((blob) => {\n //console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n const thumb = {\n url: URL.createObjectURL(blob),\n w: canvas.width,\n h: canvas.height\n };\n\n doc.stickerCachedThumbs[toneIndex] = thumb;\n\n delete this.savingLottiePreview[key];\n \n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice(t => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n });\n }\n\n public saveDocFile(doc: MyDocument, queueId?: number) {\n /* const options = this.getFileDownloadOptions(doc, undefined, queueId);\n return appDownloadManager.downloadToDisc(options, doc.file_name); */\n const promise = this.downloadDoc(doc, queueId);\n promise.then(() => {\n const cacheContext = appDownloadManager.getCacheContext(doc);\n appDownloadManager.createDownloadAnchor(cacheContext.url, doc.file_name);\n });\n return promise;\n }\n}\n\nconst appDocsManager = new AppDocsManager();\nMOUNT_CLASS_TO.appDocsManager = appDocsManager;\nexport default appDocsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { tsNow } from \"../../helpers/date\";\nimport { numberThousandSplitter } from \"../../helpers/number\";\nimport { ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, InputFileLocation, PhotoSize, SendMessageAction, Update, UserFull, UserProfilePhoto } from \"../../layer\";\nimport { LangPackKey, i18n } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager, { Channel } from \"./appChatsManager\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager, { MyTopPeer, User } from \"./appUsersManager\";\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nexport class AppProfileManager {\n //private botInfos: any = {};\n public usersFull: {[id: UserId]: UserFull.userFull} = {};\n public chatsFull: {[id: ChatId]: ChatFull} = {};\n private typingsInPeer: {[peerId: PeerId]: UserTyping[]};\n\n constructor() {\n rootScope.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = appChatsManager.getChat(chatId);\n if(!fullChat || !chat) {\n return;\n }\n\n let updated = false;\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\n updated = true;\n }\n\n const {photo} = chat as Chat.chat;\n if(photo) {\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\n const hasFullChatPhoto = fullChat.chat_photo?._ !== 'photoEmpty';\n if(hasChatPhoto !== hasFullChatPhoto || (photo as ChatPhoto.chatPhoto).photo_id !== fullChat.chat_photo.id) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n // * genius\n rootScope.addEventListener('chat_full_update', (chatId) => {\n rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n \n // * genius\n rootScope.addEventListener('user_full_update', (userId) => {\n rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true): Promise {\n if(this.usersFull[id] && !override) {\n return Promise.resolve(this.usersFull[id]);\n }\n\n return apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser', \n params: {\n id: appUsersManager.getUserInput(id)\n },\n processResult: (userFull) => {\n const user = userFull.user as User;\n appUsersManager.saveApiUser(user, true);\n \n const peerId = id.toPeerId(false);\n if(userFull.profile_photo) {\n userFull.profile_photo = appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n if(userFull.about !== undefined) {\n userFull.rAbout = RichTextProcessor.wrapRichText(userFull.about, {noLinebreaks: true});\n }\n\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: userFull.notify_settings\n });\n\n rootScope.dispatchEvent('user_full_update', id);\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 return this.usersFull[id] = userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true): Promise {\n if(appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getCachedFullChat(chatId: ChatId) {\n return this.chatsFull[chatId];\n }\n\n public getCachedFullUser(userId: UserId) {\n return this.usersFull[userId];\n }\n\n public getCachedProfileByPeerId(peerId: PeerId) {\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\n }\n\n public getFullPhoto(peerId: PeerId) {\n return this.getProfileByPeerId(peerId).then(profile => {\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\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): Promise {\n if(appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override) {\n const chat = appChatsManager.getChat(id);\n if(chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version ||\n chat.pFlags.left) {\n return Promise.resolve(fullChat);\n }\n }\n \n return apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat', \n params: {\n chat_id: id\n },\n processResult: (result) => {\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChat = result.full_chat as ChatFull.chatFull;\n const peerId = id.toPeerId(true);\n if(fullChat && fullChat.chat_photo && fullChat.chat_photo.id) {\n fullChat.chat_photo = appPhotosManager.savePhoto(fullChat.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n //appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChat.notify_settings\n });\n \n this.chatsFull[id] = fullChat;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChat;\n }\n });\n }\n\n public getChatInviteLink(id: ChatId, force?: boolean) {\n return this.getChatFull(id).then((chatFull) => {\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n \n return apiManager.invokeApi('messages.exportChatInvite', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = appChatsManager.getChat(id);\n if(chat &&\n chat.pFlags && (\n chat.pFlags.kicked ||\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then(result => {\n appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex(p => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return apiManager.invokeApiSingle('channels.getParticipant', {\n channel: appChatsManager.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n }).then(channelParticipant => {\n appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true): Promise {\n if(this.chatsFull[id] !== undefined && !override) {\n return Promise.resolve(this.chatsFull[id] as ChatFull.channelFull);\n }\n\n return apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel', \n params: {\n channel: appChatsManager.getChannelInput(id)\n }, \n processResult: (result) => {\n const peerId = id.toPeerId(true);\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n //appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n }, \n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(id);\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n } as Update.updateChannel],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n }\n });\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n \n const index = new SearchIndex(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex({\n ignoreCase: true\n });\n\n const ratingMap: Map = new Map();\n topPeers.forEach(peer => {\n index.indexObject(peer.id, appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise;\n if(appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId)\n }, 50, 0).then(cP => {\n return cP.participants.map(p => appChatsManager.getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = (this.getChatFull(chatId) as Promise).then(chatFull => {\n return (chatFull.participants as ChatParticipants.chatParticipants).participants.map(p => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]), \n promise\n ]).then(results => {\n const peers = results[0].concat(results[1].map(peerId => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n public invalidateChannelParticipants(id: ChatId) {\n apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n this.refreshFullPeer(id.toPeerId(true));\n }\n\n private refreshFullPeer(peerId: PeerId) {\n if(peerId.isUser()) delete this.usersFull[peerId.toUserId()];\n else delete this.chatsFull[peerId.toChatId()];\n\n rootScope.dispatchEvent('peer_full_update', peerId);\n\n // ! эта строчка будет создавать race condition:\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\n // this.getProfileByPeerId(peerId, true);\n }\n\n public updateProfile(first_name: string, last_name: string, about: string) {\n return apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then(user => {\n appUsersManager.saveApiUser(user);\n \n return this.getProfile(rootScope.myId, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = rootScope.myId;\n appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n apiUpdatesManager.processLocalUpdate({\n _: 'updateUserPhoto',\n user_id: userId,\n date: tsNow(true),\n photo: appUsersManager.getUser(userId).photo,\n previous: true\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map(photoId => {\n const photo = appPhotosManager.getPhoto(photoId);\n return appPhotosManager.getInput(photo);\n })\n }).then((deletedList) => {\n \n });\n }\n\n public getChatMembersString(id: ChatId) {\n const chat: Chat = appChatsManager.getChat(id);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = this.chatsFull[id];\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isChannel = appChatsManager.isBroadcast(id);\n count = count || 1;\n\n let key: LangPackKey = isChannel ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise {\n const minOnline = 1;\n if(appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n \n const chatInfo = await this.getChatFull(id);\n if(appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\n const fromId = (update as Update.updateUserTyping).user_id ? \n (update as Update.updateUserTyping).user_id.toPeerId() : \n appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(rootScope.myId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n \n const peerId = appPeersManager.getPeerId(update);\n const typings = this.typingsInPeer[peerId] ?? (this.typingsInPeer[peerId] = []);\n let typing = typings.find(t => t.userId === fromId);\n\n const cancelAction = () => {\n delete typing.timeout;\n //typings.findAndSplice(t => t === typing);\n const idx = typings.indexOf(typing);\n if(idx !== -1) {\n typings.splice(idx, 1);\n }\n\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[peerId];\n }\n };\n\n if(typing && typing.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n //console.log('updateChatUserTyping', update, typings);\n \n typing.action = update.action;\n \n const hasUser = appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && appChatsManager.hasChat(update.chat_id) && !appChatsManager.isChannel(update.chat_id)) {\n appProfileManager.getChatFull(update.chat_id).then(() => {\n if(typing.timeout !== undefined && appUsersManager.hasUser(fromId)) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n });\n }\n }\n \n //return;\n } else {\n appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = window.setTimeout(cancelAction, 6000);\n if(hasUser) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = appPeersManager.getPeerId(update.peer_id);\n if(appPeersManager.isUser(peerId)) {\n const userId = peerId.toUserId();\n const userFull = this.usersFull[userId];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n\n rootScope.dispatchEvent('user_full_update', userId);\n }\n\n rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId) {\n return this.typingsInPeer[peerId];\n }\n}\n\nconst appProfileManager = new AppProfileManager();\nMOUNT_CLASS_TO.appProfileManager = appProfileManager;\nexport default appProfileManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import apiManager from '../mtproto/apiManager';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport { Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates } from '../../layer';\nimport { logger, LogTypes } from '../logger';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\n//import networkerFactory from '../mtproto/networkerFactory';\nimport appUsersManager from \"./appUsersManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from './appStateManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport RichTextProcessor from '../richtextprocessor';\nimport App from '../../config/app';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: true,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nexport class ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n \n if(!this.popPendingSeqUpdate() &&\n state.syncPending &&\n state.syncPending.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n } else {\n delete state.syncPending.seqAwaiting;\n }\n }\n \n return true;\n }\n\n private popPendingPtsUpdate(channelId: ChatId) {\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\n if(!curState.pendingPtsUpdates.length) {\n return false;\n }\n\n curState.pendingPtsUpdates.sort((a, b) => {\n return a.pts - b.pts;\n });\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\n \n let curPts = curState.pts;\n let goodPts = 0;\n let goodIndex = 0;\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\n const update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if(curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n \n if(!goodPts) {\n return false;\n }\n \n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n \n curState.pts = goodPts;\n for(let i = 0; i <= goodIndex; ++i) {\n const update = curState.pendingPtsUpdates[i];\n\n // @ts-ignore\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n \n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\n if(!curState.syncPending.seqAwaiting) {\n clearTimeout(curState.syncPending.timeout);\n curState.syncPending = null;\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n \n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start,\n //ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n \n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n \n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n \n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? rootScope.myId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id\n ? (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true)\n : ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || rootScope.myId);\n \n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n \n case 'updatesCombined':\n case 'updates':\n appUsersManager.saveApiUsers(updateMessage.users, options.override);\n appChatsManager.saveApiChats(updateMessage.chats, options.override);\n \n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n \n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n \n private getDifference(first = false): Promise {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n let wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n \n if(updatesState.syncPending) {\n clearTimeout(updatesState.syncPending.timeout);\n updatesState.syncPending = null;\n }\n\n const promise = apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts, \n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date, \n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n \n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n \n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + serverTimeManager.serverTimeOffset;\n delete updatesState.seq;\n \n this.channelStates = {};\n \n this.log.warn('getDifference:', differenceResult._);\n rootScope.dispatchEvent('state_cleared');\n }\n \n // this.log('apply diff', updatesState.seq, updatesState.pts)\n \n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n \n return promise;\n }\n\n private getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n if(channelState.syncPending) {\n clearTimeout(channelState.syncPending.timeout);\n channelState.syncPending = null;\n }\n\n //this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = apiManager.invokeApi('updates.getChannelDifference', {\n channel: appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 30\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n this.debug && this.log.debug('Get channel diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n \n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n this.debug && this.log.debug('apply channel empty diff', differenceResult);\n return;\n }\n \n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n this.debug && this.log.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n \n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n \n // Should be first because of updateMessageID\n this.debug && this.log.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n \n this.debug && this.log.debug('applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n \n this.debug && this.log.debug('apply channel diff', channelState.pts);\n \n if(differenceResult._ === 'updates.channelDifference' &&\n !differenceResult.pFlags['final']) {\n return this.getChannelDifference(channelId);\n } else {\n this.debug && this.log.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n \n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n if(!(channelId in this.channelStates)) {\n this.channelStates[channelId] = {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n\n return true;\n }\n\n return false;\n }\n\n public getChannelState(channelId: ChatId, pts?: number) {\n if(this.channelStates[channelId] === undefined) {\n this.addChannelState(channelId, pts);\n }\n\n return this.channelStates[channelId];\n }\n\n private processUpdate(update: Update, options: Partial<{\n date: number,\n seq: number,\n seqStart: number/* ,\n ignoreSyncLoading: boolean */\n }> = {}) {\n let channelId: ChatId;\n switch(update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelId = appPeersManager.getPeerId(update.message.peer_id).toChatId();\n break;\n /* case 'updateDeleteChannelMessages':\n channelId = update.channel_id;\n break; */\n case 'updateChannelTooLong':\n channelId = update.channel_id;\n if(!(channelId in this.channelStates)) {\n return false;\n }\n break;\n default:\n if('channel_id' in update && 'pts' in update) {\n channelId = update.channel_id;\n }\n break;\n }\n \n const {pts, pts_count} = update as Update.updateNewMessage;\n const curState = channelId ? this.getChannelState(channelId, pts) : this.updatesState;\n \n // this.log.log('process', channelId, curState.pts, update)\n \n if(curState.syncLoading/* && !options.ignoreSyncLoading */) {\n return false;\n }\n \n if(update._ === 'updateChannelTooLong') {\n if(!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < (Date.now() - SYNC_DELAY)) {\n // this.log.trace('channel too long, get diff', channelId, update)\n this.getChannelDifference(channelId);\n }\n return false;\n }\n \n if(update._ === 'updateNewMessage' ||\n update._ === 'updateEditMessage' ||\n update._ === 'updateNewChannelMessage' ||\n update._ === 'updateEditChannelMessage') {\n const message = update.message as Message.message;\n const toPeerId = appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n \n let popPts: boolean;\n let popSeq: boolean;\n \n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n \n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n \n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending && curState.syncPending.seqAwaiting);\n \n if(curState.pendingSeqUpdates[seqStart] === undefined) {\n curState.pendingSeqUpdates[seqStart] = {seq, date: options.date, updates: []};\n }\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n \n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n \n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n \n this.saveUpdate(update);\n \n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n //this.debug && this.log('saveUpdate', update);\n rootScope.dispatchEvent(update._, update as any);\n }\n \n public attach() {\n if(this.attached) return;\n\n //return;\n\n this.log('attach');\n \n this.attached = true;\n\n appStateManager.getState().then(({updates: state}) => {\n const newVersion = appStateManager.newVersion/* || '0.8.6' */;\n\n //rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n //setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n //rootScope.broadcast('state_synchronized');\n //}, 1000);\n \n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n /* state.date = 1628623682;\n state.pts = 2007500;\n state.seq = 503; */\n\n Object.assign(this.updatesState, state);\n \n this.log('will get difference', Object.assign({}, state));\n \n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(() => {\n fetch('changelogs/' + newVersion + '.md')\n .then(res => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then(text => {\n const pre = `**Telegram Web${App.suffix} was updated to version alpha ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = RichTextProcessor.parseMarkdown(text, entities);\n\n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n this.processLocalUpdate(update);\n })\n .catch(noop);\n });\n }\n });\n }\n}\n\nconst apiUpdatesManager = new ApiUpdatesManager();\nMOUNT_CLASS_TO.apiUpdatesManager = apiUpdatesManager;\nexport default apiUpdatesManager\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\ntype TargetType = HTMLElement;\r\nexport type OnVisibilityChange = (target: TargetType, visible: boolean) => void;\r\n\r\nexport default class VisibilityIntersector {\r\n private observer: IntersectionObserver;\r\n private items: Map = new Map();\r\n private locked = false;\r\n\r\n constructor(onVisibilityChange: OnVisibilityChange) {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(this.locked) {\r\n return;\r\n }\r\n\r\n const changed: {target: TargetType, visible: boolean}[] = [];\r\n\r\n entries.forEach(entry => {\r\n const target = entry.target as TargetType;\r\n\r\n if(this.items.get(target) === entry.isIntersecting) {\r\n return;\r\n } else {\r\n this.items.set(target, entry.isIntersecting);\r\n }\r\n\r\n /* if(entry.isIntersecting) {\r\n console.log('ooo', entry);\r\n } */\r\n\r\n /* if(this.locked) {\r\n return;\r\n } */\r\n\r\n changed[entry.isIntersecting ? 'unshift' : 'push']({target, visible: entry.isIntersecting});\r\n\r\n //onVisibilityChange(target, entry.isIntersecting);\r\n });\r\n\r\n changed.forEach(smth => {\r\n onVisibilityChange(smth.target, smth.visible);\r\n });\r\n });\r\n }\r\n\r\n public getVisible() {\r\n const items: TargetType[] = [];\r\n this.items.forEach((value, key) => {\r\n if(value) {\r\n items.push(key);\r\n }\r\n });\r\n\r\n return items;\r\n }\r\n\r\n public clearVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.items.set(target, false);\r\n }\r\n }\r\n\r\n public isVisible(target: TargetType) {\r\n return this.items.get(target);\r\n }\r\n\r\n public disconnect() {\r\n this.observer.disconnect();\r\n this.items.clear();\r\n }\r\n\r\n public refresh() {\r\n this.observer.disconnect();\r\n\r\n //window.requestAnimationFrame(() => {\r\n const targets = [...this.items.keys()];\r\n for(const target of targets) {\r\n //this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n //});\r\n }\r\n\r\n public refreshVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.observer.unobserve(target);\r\n }\r\n\r\n for(const target of visible) {\r\n this.observer.observe(target);\r\n }\r\n }\r\n\r\n public observe(target: TargetType) {\r\n this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n\r\n public unobserve(target: TargetType) {\r\n this.observer.unobserve(target);\r\n this.items.delete(target);\r\n }\r\n\r\n public unlock() {\r\n this.locked = false;\r\n }\r\n\r\n public unlockAndRefresh() {\r\n this.unlock();\r\n this.refresh();\r\n }\r\n\r\n public lock() {\r\n this.locked = true;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport VisibilityIntersector, { OnVisibilityChange } from \"./visibilityIntersector\";\r\nimport { findAndSpliceAll, indexOfAndSplice } from \"../helpers/array\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\n\r\ntype LazyLoadElementBase = {\r\n load: () => Promise\r\n};\r\n\r\ntype LazyLoadElement = Omit & {\r\n load: (target?: HTMLElement) => Promise,\r\n div: HTMLElement\r\n wasSeen?: boolean,\r\n};\r\n\r\nconst PARALLEL_LIMIT = 8;\r\n\r\nexport class LazyLoadQueueBase {\r\n public queueId = 0;\r\n protected queue: Array = [];\r\n protected inProcess: Set = new Set();\r\n\r\n protected lockPromise: Promise = null;\r\n protected unlockResolve: () => void = null;\r\n\r\n protected log = logger('LL', LogTypes.Error);\r\n protected processQueue: () => void;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n this.processQueue = throttle(() => this._processQueue(), 20, false);\r\n }\r\n\r\n public clear() {\r\n this.inProcess.clear(); // ацтеки забьются, будет плохо\r\n\r\n this.queue.length = 0;\r\n // unreachable code\r\n /* for(let item of this.inProcess) { \r\n this.lazyLoadMedia.push(item);\r\n } */\r\n }\r\n\r\n public lock() {\r\n if(this.lockPromise) return;\r\n\r\n //const perf = performance.now();\r\n this.lockPromise = new Promise((resolve, reject) => {\r\n this.unlockResolve = resolve;\r\n });\r\n\r\n /* if(DEBUG) {\r\n this.lockPromise.then(() => {\r\n this.log('was locked for:', performance.now() - perf);\r\n });\r\n } */\r\n }\r\n\r\n public unlock() {\r\n if(!this.unlockResolve) return;\r\n\r\n this.unlockResolve();\r\n this.unlockResolve = this.lockPromise = null;\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected async processItem(item: LazyLoadElementBase) {\r\n if(this.lockPromise) {\r\n return;\r\n }\r\n\r\n this.inProcess.add(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('will load media', this.lockPromise, item);\r\n } */\r\n\r\n try {\r\n //await new Promise((resolve) => setTimeout(resolve, 2e3));\r\n //await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\r\n //await item.load(item.div);\r\n await this.loadItem(item);\r\n } catch(err) {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(err as string)) {\r\n this.log.error('loadMediaQueue error:', err/* , item */);\r\n }\r\n }\r\n\r\n this.inProcess.delete(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('loaded media', item);\r\n } */\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElementBase) {\r\n return item.load();\r\n }\r\n\r\n protected getItem() {\r\n return this.queue.shift();\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\r\n this.queue[method](el);\r\n this.processQueue();\r\n }\r\n\r\n protected _processQueue(item?: LazyLoadElementBase) {\r\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\r\n\r\n //console.log('_processQueue start');\r\n let added = 0;\r\n do {\r\n if(item) {\r\n indexOfAndSplice(this.queue, item);\r\n } else {\r\n item = this.getItem();\r\n }\r\n \r\n if(item) {\r\n this.processItem(item);\r\n } else {\r\n break;\r\n }\r\n\r\n item = null;\r\n ++added;\r\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\r\n //console.log('_processQueue end, added', added, this.queue.length);\r\n }\r\n\r\n public push(el: LazyLoadElementBase) {\r\n this.addElement('push', el);\r\n }\r\n\r\n public unshift(el: LazyLoadElementBase) {\r\n this.addElement('unshift', el);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueIntersector extends LazyLoadQueueBase {\r\n protected queue: Array = [];\r\n protected inProcess: Set = new Set();\r\n\r\n public intersector: VisibilityIntersector;\r\n protected intersectorTimeout: number;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n }\r\n\r\n public lock() {\r\n super.lock();\r\n this.intersector.lock();\r\n }\r\n\r\n public unlock() {\r\n super.unlock();\r\n this.intersector.unlock();\r\n }\r\n\r\n public unlockAndRefresh() {\r\n super.unlock();\r\n this.intersector.unlockAndRefresh();\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this.intersector.disconnect();\r\n }\r\n\r\n public refresh() {\r\n this.intersector.refresh();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElement) {\r\n return item.load(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const item = this.queue.find(i => i.div === el.div && i.load === el.load);\r\n if(item) {\r\n return false;\r\n } else {\r\n for(const item of this.inProcess) {\r\n if(item.div === el.div && item.load === el.load) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n this.queue[method](el);\r\n return true;\r\n }\r\n\r\n protected setProcessQueueTimeout() {\r\n if(!this.intersectorTimeout) {\r\n this.intersectorTimeout = window.setTimeout(() => {\r\n this.intersectorTimeout = 0;\r\n this.processQueue();\r\n }, 0);\r\n }\r\n }\r\n\r\n public push(el: LazyLoadElement) {\r\n super.push(el);\r\n }\r\n\r\n public unshift(el: LazyLoadElement) {\r\n super.unshift(el);\r\n }\r\n\r\n public unobserve(el: HTMLElement) {\r\n findAndSpliceAll(this.queue, (i) => i.div === el);\r\n\r\n this.intersector.unobserve(el);\r\n }\r\n}\r\n\r\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\r\n }\r\n\r\n private onVisibilityChange = (target: HTMLElement, visible: boolean) => {\r\n if(visible) {\r\n /* if(DEBUG) {\r\n this.log('isIntersecting', target);\r\n } */\r\n\r\n // need for set element first if scrolled\r\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach(item => {\r\n item.wasSeen = true;\r\n this.queue.unshift(item);\r\n //this.processQueue(item);\r\n });\r\n\r\n this.setProcessQueueTimeout();\r\n }\r\n };\r\n\r\n protected getItem() {\r\n return this.queue.findAndSplice(item => item.wasSeen);\r\n }\r\n\r\n public async processItem(item: LazyLoadElement) {\r\n await super.processItem(item);\r\n this.intersector.unobserve(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const inserted = super.addElement(method, el);\r\n\r\n if(!inserted) return false;\r\n\r\n this.intersector.observe(el.div);\r\n /* if(el.wasSeen) {\r\n this.processQueue(el);\r\n } else */if(!el.hasOwnProperty('wasSeen')) {\r\n el.wasSeen = false;\r\n }\r\n \r\n return true;\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\r\n private _queue: Map = new Map();\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible) {\r\n const items = spliced.length ? spliced : [this._queue.get(target)];\r\n items.forEach(item => {\r\n this.queue.unshift(item || this._queue.get(target));\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this._queue.clear();\r\n }\r\n\r\n /* public async processItem(item: LazyLoadElement) {\r\n //await super.processItem(item);\r\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\r\n\r\n if(this.lazyLoadMedia.length) {\r\n this.processQueue();\r\n }\r\n } */\r\n\r\n public observe(el: LazyLoadElement) {\r\n this._queue.set(el.div, el);\r\n this.intersector.observe(el.div);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible && spliced.length) {\r\n spliced.forEach(item => {\r\n this.queue.unshift(item);\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public observe(el: HTMLElement) {\r\n this.intersector.observe(el);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * 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 function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[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\nexport class WindowSize {\n public width = 0;\n public height = 0;\n\n constructor() {\n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || w.innerWidth;\n this.height = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { fontFamily } from \"../../components/middleEllipsis\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { deepEqual } from \"../../helpers/object\";\r\nimport { convertInputKeyToKey } from \"../../helpers/string\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport { InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update } from \"../../layer\";\r\nimport I18n from \"../langPack\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport webPushApiManager, { PushSubscriptionNotify } from \"../mtproto/webPushApiManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appRuntimeManager from \"./appRuntimeManager\";\r\nimport appStateManager from \"./appStateManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\n\r\ntype MyNotification = Notification & {\r\n hidden?: boolean,\r\n show?: () => void,\r\n};\r\n\r\nexport type NotifyOptions = Partial<{\r\n tag: string;\r\n image: string;\r\n key: string;\r\n title: string;\r\n message: string;\r\n silent: boolean;\r\n onclick: () => void;\r\n}>;\r\n\r\nexport type NotificationSettings = {\r\n nodesktop: boolean,\r\n volume: number,\r\n novibrate: boolean,\r\n nopreview: boolean,\r\n nopush: boolean,\r\n nosound: boolean\r\n};\r\n\r\ntype ImSadAboutIt = Promise | PeerNotifySettings;\r\nexport class AppNotificationsManager {\r\n private notificationsUiSupport: boolean;\r\n private notificationsShown: {[key: string]: MyNotification | true} = {};\r\n private notificationIndex = 0;\r\n private notificationsCount = 0;\r\n private soundsPlayed: {[tag: string]: number} = {};\r\n private vibrateSupport = !!navigator.vibrate;\r\n private nextSoundAt: number;\r\n private prevSoundVolume: number;\r\n private peerSettings = {\r\n notifyPeer: {} as {[peerId: PeerId]: ImSadAboutIt},\r\n notifyUsers: null as ImSadAboutIt,\r\n notifyChats: null as ImSadAboutIt,\r\n notifyBroadcasts: null as ImSadAboutIt\r\n };\r\n //private exceptions: {[peerId: string]: PeerNotifySettings} = {};\r\n private notifyContactsSignUp: Promise;\r\n private faviconEl: HTMLLinkElement = document.head.querySelector('link[rel=\"icon\"]');\r\n\r\n private titleBackup = document.title;\r\n private titleChanged = false;\r\n private titleInterval: number;\r\n private prevFavicon: string;\r\n private stopped = false;\r\n\r\n private settings: NotificationSettings = {} as any;\r\n\r\n private registeredDevice: any;\r\n private pushInited = false;\r\n\r\n private topMessagesDeferred: CancellablePromise;\r\n\r\n private notifySoundEl: HTMLElement;\r\n\r\n private getNotifyPeerTypePromise: Promise;\r\n\r\n constructor() {\r\n // @ts-ignore\r\n navigator.vibrate = navigator.vibrate || navigator.mozVibrate || navigator.webkitVibrate;\r\n\r\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\r\n\r\n this.topMessagesDeferred = deferredPromise();\r\n\r\n this.notifySoundEl = document.createElement('div');\r\n this.notifySoundEl.id = 'notify-sound';\r\n document.body.append(this.notifySoundEl);\r\n\r\n rootScope.addEventListener('instance_deactivated', () => {\r\n this.stop();\r\n });\r\n\r\n rootScope.addEventListener('instance_activated', () => {\r\n if(this.stopped) {\r\n this.start();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('idle', (newVal) => {\r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n if(!newVal) {\r\n this.clear();\r\n }\r\n\r\n this.toggleToggler();\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateNotifySettings: (update) => {\r\n const peerId = update.peer._ === 'notifyPeer' && appPeersManager.getPeerId(update.peer.peer);\r\n const key = update.peer._ !== 'notifyPeer' ? update.peer._ : undefined;\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings: update.notify_settings\r\n });\r\n rootScope.dispatchEvent('notify_settings', update);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('push_init', (tokenData) => {\r\n this.pushInited = true;\r\n if(!this.settings.nodesktop && !this.settings.nopush) {\r\n if(tokenData) {\r\n this.registerDevice(tokenData);\r\n } else {\r\n webPushApiManager.subscribe();\r\n }\r\n } else {\r\n this.unregisterDevice(tokenData);\r\n }\r\n });\r\n rootScope.addEventListener('push_subscribe', (tokenData) => {\r\n this.registerDevice(tokenData);\r\n });\r\n rootScope.addEventListener('push_unsubscribe', (tokenData) => {\r\n this.unregisterDevice(tokenData);\r\n });\r\n\r\n rootScope.addEventListener('dialogs_multiupdate', () => {\r\n //unregisterTopMsgs()\r\n this.topMessagesDeferred.resolve();\r\n }, {once: true});\r\n\r\n rootScope.addEventListener('push_notification_click', (notificationData) => {\r\n if(notificationData.action === 'push_settings') {\r\n /* this.topMessagesDeferred.then(() => {\r\n $modal.open({\r\n templateUrl: templateUrl('settings_modal'),\r\n controller: 'SettingsModalController',\r\n windowClass: 'settings_modal_window mobile_modal',\r\n backdrop: 'single'\r\n })\r\n }); */\r\n return;\r\n }\r\n\r\n if(notificationData.action === 'mute1d') {\r\n apiManager.invokeApi('account.updateDeviceLocked', {\r\n period: 86400\r\n }).then(() => {\r\n // var toastData = toaster.pop({\r\n // type: 'info',\r\n // body: _('push_action_mute1d_success'),\r\n // bodyOutputType: 'trustedHtml',\r\n // clickHandler: () => {\r\n // toaster.clear(toastData)\r\n // },\r\n // showCloseButton: false\r\n // })\r\n });\r\n\r\n return;\r\n }\r\n\r\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\r\n console.log('click', notificationData, peerId);\r\n if(peerId) {\r\n this.topMessagesDeferred.then(() => {\r\n if(notificationData.custom.channel_id &&\r\n !appChatsManager.hasChat(notificationData.custom.channel_id)) {\r\n return;\r\n }\r\n\r\n if(peerId.isUser() && !appUsersManager.hasUser(peerId)) {\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('history_focus', {\r\n peerId,\r\n mid: +notificationData.custom.msg_id\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n private toggleToggler(enable = rootScope.idle.isIDLE) {\r\n if(IS_MOBILE) return;\r\n\r\n const resetTitle = () => {\r\n this.titleChanged = false;\r\n document.title = this.titleBackup;\r\n this.setFavicon();\r\n };\r\n\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n\r\n if(!enable) {\r\n resetTitle();\r\n } else {\r\n this.titleInterval = window.setInterval(() => {\r\n const count = this.notificationsCount;\r\n if(!count) {\r\n this.toggleToggler(false);\r\n } else if(this.titleChanged) {\r\n resetTitle();\r\n } else {\r\n this.titleChanged = true;\r\n document.title = I18n.format('Notifications.Count', true, [count]);\r\n //this.setFavicon('assets/img/favicon_unread.ico');\r\n\r\n // fetch('assets/img/favicon.ico')\r\n // .then(res => res.blob())\r\n // .then(blob => {\r\n // const img = document.createElement('img');\r\n // img.src = URL.createObjectURL(blob);\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = 32 * window.devicePixelRatio;\r\n canvas.height = canvas.width;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\r\n ctx.fillStyle = '#3390ec';\r\n ctx.fill();\r\n\r\n let fontSize = 24;\r\n let str = '' + count;\r\n if(count < 10) {\r\n fontSize = 22;\r\n } else if(count < 100) {\r\n fontSize = 20;\r\n } else {\r\n str = '99+';\r\n fontSize = 16;\r\n }\r\n\r\n fontSize *= window.devicePixelRatio;\r\n \r\n ctx.font = `700 ${fontSize}px ${fontFamily}`;\r\n ctx.textBaseline = 'middle';\r\n ctx.textAlign = 'center';\r\n ctx.fillStyle = 'white';\r\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\r\n\r\n /* const ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\r\n \r\n this.setFavicon(canvas.toDataURL());\r\n // });\r\n }\r\n }, 1000);\r\n }\r\n }\r\n\r\n public updateLocalSettings = () => {\r\n Promise.all(['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'].map(k => stateStorage.get(k as any)))\r\n .then((updSettings) => {\r\n this.settings.nodesktop = updSettings[0];\r\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\r\n this.settings.novibrate = updSettings[2];\r\n this.settings.nopreview = updSettings[3];\r\n this.settings.nopush = updSettings[4];\r\n\r\n if(this.pushInited) {\r\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\r\n const hasPush = this.registeredDevice !== false;\r\n if(needPush !== hasPush) {\r\n if(needPush) {\r\n webPushApiManager.subscribe();\r\n } else {\r\n webPushApiManager.unsubscribe();\r\n }\r\n }\r\n }\r\n\r\n webPushApiManager.setSettings(this.settings);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n this.settings.nosound = !state.settings.notifications.sound;\r\n });\r\n }\r\n\r\n public getLocalSettings() {\r\n return this.settings;\r\n }\r\n\r\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\r\n let key: any = convertInputKeyToKey(peer._);\r\n let obj: any = this.peerSettings[key as NotifyPeer['_']];\r\n\r\n let peerId: PeerId;\r\n if(peer._ === 'inputNotifyPeer') {\r\n peerId = key = appPeersManager.getPeerId(peer.peer);\r\n obj = obj[key];\r\n }\r\n\r\n if(obj) {\r\n return obj;\r\n }\r\n\r\n return (obj || this.peerSettings)[key] = apiManager.invokeApi('account.getNotifySettings', {peer})\r\n .then(settings => {\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings\r\n });\r\n \r\n return settings;\r\n });\r\n }\r\n\r\n public getNotifyPeerTypeSettings() {\r\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\r\n\r\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as Exclude[])\r\n .map((inputKey) => {\r\n return this.getNotifySettings({_: inputKey});\r\n });\r\n\r\n return this.getNotifyPeerTypePromise = Promise.all(promises);\r\n }\r\n\r\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\r\n //this.savePeerSettings(peerId, settings);\r\n\r\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\r\n inputSettings._ = 'inputPeerNotifySettings'; */\r\n\r\n return apiManager.invokeApi('account.updateNotifySettings', {\r\n peer,\r\n settings\r\n }).then(value => {\r\n if(value) {\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updateNotifySettings', \r\n peer: {\r\n ...peer as any,\r\n _: convertInputKeyToKey(peer._)\r\n }, \r\n notify_settings: { // ! WOW, IT WORKS !\r\n ...settings,\r\n _: 'peerNotifySettings',\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n public getNotifyExceptions() {\r\n apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getContactSignUpNotification() {\r\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\r\n return this.notifyContactsSignUp = apiManager.invokeApi('account.getContactSignUpNotification');\r\n }\r\n\r\n public setContactSignUpNotification(silent: boolean) {\r\n apiManager.invokeApi('account.setContactSignUpNotification', {silent})\r\n .then(value => {\r\n this.notifyContactsSignUp = Promise.resolve(!silent);\r\n });\r\n }\r\n\r\n private setFavicon(href: string = 'assets/img/favicon.ico') {\r\n if(this.prevFavicon === href) {\r\n return;\r\n }\r\n\r\n const link = this.faviconEl.cloneNode() as HTMLLinkElement;\r\n link.href = href;\r\n this.faviconEl.parentNode.replaceChild(link, this.faviconEl);\r\n this.faviconEl = link;\r\n\r\n this.prevFavicon = href;\r\n }\r\n\r\n public savePeerSettings({key, peerId, settings}: {\r\n key?: Exclude,\r\n peerId?: PeerId, \r\n settings: PeerNotifySettings\r\n }) {\r\n let obj: any;\r\n if(peerId) {\r\n key = peerId as any;\r\n obj = this.peerSettings['notifyPeer'];\r\n }\r\n \r\n (obj || this.peerSettings)[key] = settings;\r\n\r\n if(!peerId) {\r\n rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\r\n }\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.mute_until * 1000) > tsNow() || peerNotifySettings.silent);\r\n }\r\n\r\n public getPeerMuted(peerId: PeerId) {\r\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: appPeersManager.getInputPeerById(peerId)});\r\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\r\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\r\n }\r\n\r\n public getPeerLocalSettings(peerId: PeerId, respectType = true): PeerNotifySettings {\r\n const n: PeerNotifySettings = {\r\n _: 'peerNotifySettings'\r\n };\r\n\r\n const notifySettings = this.peerSettings['notifyPeer'][peerId];\r\n //if(!notifySettings || (notifySettings instanceof Promise)) return false;\r\n if(notifySettings && !(notifySettings instanceof Promise)) {\r\n Object.assign(n, notifySettings);\r\n }\r\n\r\n if(respectType) {\r\n const inputNotify = appPeersManager.getInputNotifyPeerById(peerId, true);\r\n const key = convertInputKeyToKey(inputNotify._);\r\n const typeNotifySettings = this.peerSettings[key as NotifyPeer['_']];\r\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\r\n for(let i in typeNotifySettings) {\r\n // @ts-ignore\r\n if(n[i] === undefined) {\r\n // @ts-ignore\r\n n[i] = typeNotifySettings[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n public isPeerLocalMuted(peerId: PeerId, respectType = true) {\r\n if(peerId === rootScope.myId) return false;\r\n\r\n const notifySettings = this.getPeerLocalSettings(peerId, respectType);\r\n return this.isMuted(notifySettings);\r\n }\r\n\r\n public start() {\r\n this.updateLocalSettings();\r\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\r\n webPushApiManager.start();\r\n\r\n if(!this.notificationsUiSupport) {\r\n return false;\r\n }\r\n\r\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\r\n window.addEventListener('click', this.requestPermission);\r\n }\r\n\r\n try {\r\n if('onbeforeunload' in window) {\r\n window.addEventListener('beforeunload', this.clear);\r\n }\r\n } catch (e) {}\r\n }\r\n\r\n private stop() {\r\n this.clear();\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n this.setFavicon();\r\n this.stopped = true;\r\n }\r\n\r\n private requestPermission = () => {\r\n Notification.requestPermission();\r\n window.removeEventListener('click', this.requestPermission);\r\n };\r\n\r\n public notify(data: NotifyOptions) {\r\n //console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\r\n \r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n // FFOS Notification blob src bug workaround\r\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\r\n data.image = 'https://telegram.org/img/t_logo.png'\r\n }\r\n else if (data.image && !angular.isString(data.image)) {\r\n if (Config.Navigator.ffos2p) {\r\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\r\n data.image = url\r\n notify(data)\r\n })\r\n return false\r\n } else {\r\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\r\n }\r\n }\r\n else */ if(!data.image) {\r\n data.image = 'assets/img/logo_filled_rounded.png';\r\n }\r\n // console.log('notify image', data.image)\r\n\r\n this.notificationsCount++;\r\n if(!this.titleInterval) {\r\n this.toggleToggler();\r\n }\r\n\r\n const idx = ++this.notificationIndex;\r\n const key = data.key || 'k' + idx;\r\n this.notificationsShown[key] = true;\r\n\r\n const now = tsNow();\r\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\r\n (\r\n !data.tag ||\r\n !this.soundsPlayed[data.tag] ||\r\n now > this.soundsPlayed[data.tag] + 60000\r\n ) */\r\n ) {\r\n this.testSound(this.settings.volume);\r\n this.soundsPlayed[data.tag] = now;\r\n }\r\n\r\n if(!this.notificationsUiSupport ||\r\n 'Notification' in window && Notification.permission !== 'granted') {\r\n return false;\r\n }\r\n\r\n if(this.settings.nodesktop) {\r\n if(this.vibrateSupport && !this.settings.novibrate) {\r\n navigator.vibrate([200, 100, 200]);\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n let notification: MyNotification;\r\n\r\n if('Notification' in window) {\r\n try {\r\n if(data.tag) {\r\n for(let i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\r\n notification.hidden = true;\r\n }\r\n }\r\n }\r\n\r\n notification = new Notification(data.title, {\r\n icon: data.image || '',\r\n body: data.message || '',\r\n tag: data.tag || '',\r\n silent: data.silent || false\r\n });\r\n\r\n //console.log('notify constructed notification');\r\n } catch(e) {\r\n this.notificationsUiSupport = false;\r\n webPushApiManager.setLocalNotificationsDisabled();\r\n return;\r\n }\r\n } /* else if('mozNotification' in navigator) {\r\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\r\n } else if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\r\n window.external.msSiteModeActivate()\r\n notification = {\r\n index: idx\r\n }\r\n } */ else {\r\n return;\r\n }\r\n\r\n notification.onclick = () => {\r\n notification.close();\r\n appRuntimeManager.focus();\r\n this.clear();\r\n if(data.onclick) {\r\n data.onclick();\r\n }\r\n };\r\n\r\n notification.onclose = () => {\r\n if(!notification.hidden) {\r\n delete this.notificationsShown[key];\r\n this.clear();\r\n }\r\n };\r\n\r\n if(notification.show) {\r\n notification.show();\r\n }\r\n this.notificationsShown[key] = notification;\r\n\r\n if(!IS_MOBILE) {\r\n setTimeout(() => {\r\n this.hide(key);\r\n }, 8000);\r\n }\r\n }\r\n\r\n public testSound(volume: number) {\r\n const now = tsNow();\r\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\r\n return;\r\n }\r\n\r\n this.nextSoundAt = now + 1000;\r\n this.prevSoundVolume = volume;\r\n const filename = 'assets/audio/notification.mp3';\r\n const audio = document.createElement('audio');\r\n audio.autoplay = true;\r\n audio.setAttribute('mozaudiochannel', 'notification');\r\n audio.volume = volume;\r\n audio.innerHTML = `\r\n \r\n \r\n `;\r\n this.notifySoundEl.append(audio);\r\n\r\n audio.addEventListener('ended', () => {\r\n audio.remove();\r\n }, {once: true});\r\n }\r\n\r\n public cancel(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification) {\r\n if(this.notificationsCount > 0) {\r\n --this.notificationsCount;\r\n }\r\n\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }/* else if(notificationsMsSiteMode &&\r\n notification.index === notificationIndex) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } */\r\n } catch(e) {}\r\n\r\n delete this.notificationsShown[key];\r\n }\r\n }\r\n\r\n private hide(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification && typeof(notification) !== 'boolean') {\r\n try {\r\n if(notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n }\r\n\r\n public soundReset(tag: string) {\r\n delete this.soundsPlayed[tag];\r\n }\r\n\r\n public clear() {\r\n /* if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } else { */\r\n for(const i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n /* } */\r\n this.notificationsShown = {};\r\n this.notificationsCount = 0;\r\n\r\n webPushApiManager.hidePushNotifications();\r\n }\r\n\r\n private registerDevice(tokenData: PushSubscriptionNotify) {\r\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.registerDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: [],\r\n app_sandbox: false,\r\n secret: new Uint8Array()\r\n }).then(() => {\r\n this.registeredDevice = tokenData;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\r\n if(!this.registeredDevice) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.unregisterDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: []\r\n }).then(() => {\r\n this.registeredDevice = false;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n public getVibrateSupport() {\r\n return this.vibrateSupport\r\n }\r\n}\r\n\r\nconst appNotificationsManager = new AppNotificationsManager();\r\nMOUNT_CLASS_TO.appNotificationsManager = appNotificationsManager;\r\nexport default appNotificationsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, \n url: string, \n callback?: (err?: Event) => void, \n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback && callback();\n return;\n }\n\n if(((loadedURLs[url]/* && false */) && useCache) || elem instanceof HTMLVideoElement) {\n if(elem) {\n set(elem, url);\n }\n \n callback && callback();\n // callback && getHeavyAnimationPromise().then(() => callback());\n } else {\n const isImage = elem instanceof HTMLImageElement;\n const loader = isImage ? elem as HTMLImageElement : new Image();\n //const loader = new Image();\n loader.src = url;\n //let perf = performance.now();\n loader.addEventListener('load', () => {\n if(!isImage && elem) {\n set(elem, url);\n }\n\n loadedURLs[url] = true;\n //console.log('onload:', url, performance.now() - perf);\n // TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются\n // callback && getHeavyAnimationPromise().then(() => callback());\n callback && callback();\n }, {once: true});\n\n if(callback) {\n loader.addEventListener('error', callback);\n }\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport class AppMessagesIdsManager {\r\n private static MESSAGE_ID_INCREMENT = 0x10000;\r\n private static MESSAGE_ID_OFFSET = 0xFFFFFFFF;\r\n\r\n private tempNum = 0;\r\n\r\n public generateMessageId(messageId: number, temp = false) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n const num = temp ? ++this.tempNum : 0;\r\n if(messageId >= q) {\r\n if(temp) {\r\n return messageId + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1));\r\n }\r\n\r\n return messageId;\r\n }\r\n\r\n return q + (messageId * AppMessagesIdsManager.MESSAGE_ID_INCREMENT + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1)));\r\n }\r\n\r\n /**\r\n * * will ignore outgoing offset\r\n */\r\n public getServerMessageId(messageId: number) {\r\n return this.clearMessageId(messageId, true);\r\n }\r\n\r\n public clearMessageId(messageId: number, toServer?: boolean) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\r\n return messageId;\r\n }\r\n\r\n const l = AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1;\r\n const used = messageId & l;\r\n if(used !== l) {\r\n messageId -= used + 1;\r\n }\r\n\r\n return toServer ? (messageId - q) / AppMessagesIdsManager.MESSAGE_ID_INCREMENT : messageId;\r\n }\r\n\r\n public incrementMessageId(messageId: number, increment: number) {\r\n return this.generateMessageId(this.getServerMessageId(messageId) + increment);\r\n }\r\n}\r\n\r\nconst appMessagesIdsManager = new AppMessagesIdsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appMessagesIdsManager = appMessagesIdsManager);\r\nexport default appMessagesIdsManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\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 { safeAssign } from \"../helpers/object\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\n\r\nconst TRANSITION_TIME = 200;\r\n\r\nexport default class ProgressivePreloader {\r\n public preloader: HTMLDivElement;\r\n public circle: SVGCircleElement;\r\n private cancelSvg: SVGSVGElement;\r\n private downloadSvg: HTMLElement;\r\n \r\n private tempId = 0;\r\n public detached = true;\r\n\r\n public promise: CancellablePromise = null;\r\n\r\n public isUpload = false;\r\n private cancelable = true;\r\n private streamable = false;\r\n private tryAgainOnFail = true;\r\n private attachMethod: 'append' | 'prepend' = 'append';\r\n\r\n public loadFunc: (e?: Event) => {download: CancellablePromise};\r\n\r\n public totalLength: number;\r\n\r\n constructor(options?: Partial<{\r\n isUpload: ProgressivePreloader['isUpload'],\r\n cancelable: ProgressivePreloader['cancelable'], \r\n streamable: ProgressivePreloader['streamable'], \r\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\r\n attachMethod: ProgressivePreloader['attachMethod']\r\n }>) {\r\n if(options) {\r\n safeAssign(this, options);\r\n }\r\n }\r\n\r\n public constructContainer(options: Partial<{\r\n color: 'transparent',\r\n bold: boolean\r\n }> = {}) {\r\n if(!this.preloader) {\r\n this.preloader = document.createElement('div');\r\n this.preloader.classList.add('preloader-container');\r\n\r\n if(options.color) {\r\n this.preloader.classList.add('preloader-' + options.color);\r\n }\r\n\r\n if(options.bold) {\r\n this.preloader.classList.add('preloader-bold');\r\n }\r\n \r\n if(this.streamable) {\r\n this.preloader.classList.add('preloader-streamable');\r\n }\r\n }\r\n }\r\n\r\n public constructDownloadIcon() {\r\n this.constructContainer();\r\n }\r\n\r\n public construct() {\r\n this.construct = null;\r\n\r\n this.constructContainer();\r\n \r\n this.preloader.innerHTML = `\r\n
\r\n \r\n \r\n \r\n
`;\r\n\r\n if(this.streamable) {\r\n this.totalLength = 118.61124420166016;\r\n } else {\r\n this.totalLength = 149.82473754882812;\r\n }\r\n\r\n if(this.cancelable) {\r\n this.preloader.innerHTML += `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `;\r\n\r\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\r\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\r\n } else {\r\n this.preloader.classList.add('preloader-swing');\r\n }\r\n \r\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\r\n\r\n if(this.cancelable) {\r\n attachClickEvent(this.preloader, this.onClick);\r\n }\r\n }\r\n\r\n public onClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.preloader.classList.contains('manual')) {\r\n if(this.loadFunc) {\r\n this.loadFunc(e);\r\n }\r\n } else {\r\n if(this.promise && this.promise.cancel) {\r\n this.promise.cancel();\r\n }\r\n }\r\n };\r\n\r\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\r\n this.loadFunc = func;\r\n }\r\n\r\n public setManual() {\r\n this.preloader.classList.add('manual');\r\n this.setProgress(0);\r\n }\r\n\r\n public attachPromise(promise: CancellablePromise) {\r\n if(this.isUpload && this.promise) return;\r\n\r\n this.promise = promise;\r\n\r\n const tempId = --this.tempId;\r\n const startTime = Date.now();\r\n\r\n const onEnd = (err: Error) => {\r\n promise.notify = promise.notifyAll = null;\r\n\r\n if(tempId !== this.tempId) {\r\n return;\r\n }\r\n\r\n const elapsedTime = Date.now() - startTime;\r\n\r\n //console.log('[PP]: end', this.detached, performance.now());\r\n\r\n if(!err && this.cancelable) {\r\n this.setProgress(100);\r\n\r\n const delay = TRANSITION_TIME * 0.75;\r\n\r\n if(elapsedTime < delay) {\r\n this.detach();\r\n } else {\r\n setTimeout(() => { // * wait for transition complete\r\n if(tempId === this.tempId) {\r\n this.detach();\r\n }\r\n }, delay);\r\n }\r\n } else {\r\n if(this.tryAgainOnFail) {\r\n this.attach(this.preloader.parentElement);\r\n fastRaf(() => {\r\n this.setManual();\r\n });\r\n } else {\r\n this.detach();\r\n }\r\n }\r\n \r\n this.promise = promise = null;\r\n };\r\n \r\n promise\r\n .then(() => onEnd(null))\r\n .catch((err) => onEnd(err));\r\n\r\n if(promise.addNotifyListener) {\r\n promise.addNotifyListener((details: {done: number, total: number}) => {\r\n /* if(details.done >= details.total) {\r\n onEnd();\r\n } */\r\n\r\n if(tempId !== this.tempId) return;\r\n\r\n //console.log('preloader download', promise, details);\r\n const percents = details.done / details.total * 100;\r\n this.setProgress(percents);\r\n });\r\n }\r\n }\r\n\r\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\r\n if(this.construct) {\r\n this.construct();\r\n }\r\n\r\n if(this.preloader.parentElement) {\r\n this.preloader.classList.remove('manual');\r\n }\r\n\r\n this.detached = false;\r\n\r\n if(promise/* && false */) {\r\n this.attachPromise(promise);\r\n }\r\n\r\n if(this.detached || this.preloader.parentElement !== elem) {\r\n const useRafs = isInDOM(this.preloader) ? 1 : 2;\r\n if(this.preloader.parentElement !== elem) {\r\n elem[this.attachMethod](this.preloader);\r\n }\r\n\r\n SetTransition(this.preloader, 'is-visible', true, TRANSITION_TIME, undefined, useRafs);\r\n }\r\n\r\n if(this.cancelable && reset) {\r\n this.setProgress(0);\r\n }\r\n }\r\n \r\n public detach() {\r\n if(this.detached) {\r\n return;\r\n }\r\n //return;\r\n\r\n this.detached = true;\r\n\r\n //return;\r\n \r\n if(this.preloader && this.preloader.parentElement) {\r\n /* setTimeout(() => *///fastRaf(() => {\r\n /* if(!this.detached) return;\r\n this.detached = true; */\r\n\r\n // fastRaf(() => {\r\n //console.log('[PP]: detach after rAF', this.detached, performance.now());\r\n\r\n // if(!this.detached || !this.preloader.parentElement) {\r\n // return;\r\n // }\r\n\r\n SetTransition(this.preloader, 'is-visible', false, TRANSITION_TIME, () => {\r\n this.preloader.remove();\r\n }, 1);\r\n // });\r\n //})/* , 5e3) */;\r\n }\r\n }\r\n \r\n public setProgress(percents: number) {\r\n if(!this.totalLength && !isInDOM(this.circle)) {\r\n return;\r\n }\r\n \r\n if(percents === 0) {\r\n this.circle.style.strokeDasharray = '';\r\n return;\r\n }\r\n \r\n try {\r\n if(!this.totalLength) {\r\n this.totalLength = this.circle.getTotalLength();\r\n }\r\n\r\n //console.log('setProgress', (percents / 100 * totalLength));\r\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\r\n } catch(err) {}\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { makeMediaSize, MediaSize } from \"./mediaSizes\";\r\nimport { pause } from \"./schedulers/pause\";\r\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\r\n\r\nexport function scaleMediaElement(options: {\r\n media: CanvasImageSource, \r\n mediaSize: MediaSize, \r\n boxSize: MediaSize, \r\n quality?: number,\r\n mimeType?: 'image/jpeg' | 'image/png'\r\n}): Promise<{blob: Blob, size: MediaSize}> {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n const size = options.mediaSize.aspectFitted(options.boxSize);\r\n canvas.width = size.width * window.devicePixelRatio;\r\n canvas.height = size.height * window.devicePixelRatio;\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(options.media, 0, 0, canvas.width, canvas.height);\r\n canvas.toBlob(blob => {\r\n resolve({blob, size});\r\n }, options.mimeType ?? 'image/jpeg', options.quality ?? 1);\r\n });\r\n}\r\n\r\nexport function preloadVideo(url: string): Promise {\r\n return new Promise((resolve, reject) => {\r\n const video = document.createElement('video');\r\n video.volume = 0;\r\n video.addEventListener('loadedmetadata', () => resolve(video), {once: true});\r\n video.addEventListener('error', reject, {once: true});\r\n video.src = url;\r\n });\r\n}\r\n\r\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\r\n let width: number, height: number;\r\n if(media instanceof HTMLVideoElement) {\r\n width = media.videoWidth;\r\n height = media.videoHeight;\r\n } else {\r\n width = media.naturalWidth;\r\n height = media.naturalHeight;\r\n }\r\n\r\n return scaleMediaElement({\r\n media, \r\n mediaSize: makeMediaSize(width, height), \r\n boxSize: makeMediaSize(320, 240),\r\n quality: .9\r\n });\r\n}\r\n\r\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\r\n return new Promise((resolve, reject) => {\r\n video.onseeked = () => {\r\n video.onseeked = () => {\r\n createPosterFromMedia(video).then(resolve);\r\n\r\n video.onseeked = undefined;\r\n };\r\n\r\n video.currentTime = 0;\r\n };\r\n \r\n video.onerror = reject;\r\n video.currentTime = Math.min(video.duration, 1);\r\n });\r\n}\r\n\r\nexport async function createPosterForVideo(url: string) {\r\n const video = await preloadVideo(url);\r\n\r\n return Promise.race([\r\n pause(2000) as Promise,\r\n createPosterFromVideo(video),\r\n ]);\r\n}\r\n\r\nexport function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\r\n return new Promise((resolve) => {\r\n if(media.readyState >= readyState) {\r\n resolve();\r\n return;\r\n }\r\n\r\n media.addEventListener(IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay', () => resolve(), {once: true});\r\n });\r\n}\r\n\r\nexport async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\r\n const files: any[] = [];\r\n\r\n const scanFiles = async(entry: any, item: DataTransferItem) => {\r\n if(entry.isDirectory) {\r\n const directoryReader = entry.createReader();\r\n await new Promise((resolve, reject) => {\r\n directoryReader.readEntries(async(entries: any) => {\r\n for(const entry of entries) {\r\n await scanFiles(entry, item);\r\n }\r\n\r\n resolve();\r\n });\r\n });\r\n } else if(entry) {\r\n if(onlyTypes) {\r\n files.push(entry.type);\r\n } else {\r\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\r\n const file = entry instanceof File ? \r\n entry : \r\n (\r\n entry instanceof DataTransferItem ? \r\n entry.getAsFile() : \r\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\r\n );\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got file', item, file);\r\n } */\r\n\r\n if(!file) return;\r\n files.push(file);\r\n }\r\n }\r\n };\r\n\r\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\r\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\r\n const file = e.dataTransfer.files[i];\r\n files.push(onlyTypes ? file.type : file);\r\n }\r\n } else {\r\n // @ts-ignore\r\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\r\n\r\n const promises: Promise[] = [];\r\n for(let i = 0; i < items.length; ++i) {\r\n const item: DataTransferItem = items[i];\r\n if(item.kind === 'file') {\r\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\r\n promises.push(scanFiles(entry, item));\r\n }\r\n }\r\n \r\n await Promise.all(promises);\r\n }\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got files:', e, files);\r\n } */\r\n \r\n return files;\r\n}\r\n\r\nexport function requestFile(accept?: string) {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.style.display = 'none';\r\n\r\n if(accept) {\r\n input.accept = accept;\r\n }\r\n\r\n document.body.append(input);\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n input.addEventListener('change', (e: any) => {\r\n const file: File = e.target.files[0];\r\n if(!file) {\r\n reject('NO_FILE_SELECTED');\r\n return;\r\n }\r\n \r\n resolve(file);\r\n }, {once: true});\r\n }).finally(() => {\r\n input.remove();\r\n });\r\n\r\n input.click();\r\n\r\n return promise;\r\n}\r\n","export default function assumeType(x: unknown): asserts x is T {\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\n// * will change .cleaned and new instance will be created\r\nexport const getMiddleware = () => {\r\n let cleanupObj = {cleaned: false};\r\n return {\r\n clean: () => {\r\n cleanupObj.cleaned = true;\r\n cleanupObj = {cleaned: false};\r\n },\r\n get: () => {\r\n const _cleanupObj = cleanupObj;\r\n return () => {\r\n return !_cleanupObj.cleaned;\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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { processSearchText, ProcessSearchTextOptions } from '../helpers/cleanSearchText';\n\nexport default class SearchIndex {\n private fullTexts: Map = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n \n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n public search(query: string) {\n const fullTexts = this.fullTexts;\n //const shortIndexes = searchIndex.shortIndexes;\n\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' ')) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n //newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set = new Set(newFoundObjs.map(o => o.what));\n\n /* const queryWords = query.split(' ');\n let foundArr: number[];\n for(let i = 0; i < queryWords.length; i++) {\n const newFound = shortIndexes[queryWords[i].substr(0, 3)];\n if(!newFound) {\n foundArr = [];\n break;\n }\n \n if(foundArr === undefined || foundArr.length > newFound.length) {\n foundArr = newFound;\n }\n }\n\n for(let j = 0; j < foundArr.length; j++) {\n let found = true;\n let searchText = fullTexts[foundArr[j]];\n for(let i = 0; i < queryWords.length; i++) {\n if(searchText.indexOf(queryWords[i]) === -1) {\n found = false;\n break;\n }\n }\n\n if(found) {\n newFoundObjs[foundArr[j]] = true;\n }\n } */\n\n return newFoundObjs2;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// Thanks to https://stackoverflow.com/a/49349813\r\nimport { clamp } from \"../helpers/number\";\r\n\r\n/**\r\n * Attibute modifier to create middle ellipsis\r\n * When the attribute value is left blank the ellipsis will be in the middle\r\n * When positive the attribute value will be used as a percentage\r\n * When negative the attribute value will be used as character index counted from the end\r\n * @example\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n */\r\nconst ellipsis = '…';\r\nconst map: Map = new Map();\r\n\r\nconst testQueue: Set = new Set();\r\nexport const fontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\r\nconst fontSize = '16px';\r\nlet timeoutId: number;\r\n\r\nconst setTestQueue = () => {\r\n cancelAnimationFrame(timeoutId);\r\n timeoutId = window.requestAnimationFrame(testQueueElements);\r\n};\r\n\r\nconst 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\nconst testElement = (element: HTMLElement) => {\r\n //const perf = performance.now();\r\n // do not recalculate variables a second time\r\n let mapped = map.get(element);\r\n const firstTime = !mapped;\r\n\r\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\r\n //console.log('[MEE] testElement got mapped', mapped);\r\n\r\n if(firstTime) {\r\n text = element.textContent;\r\n textLength = text.length;\r\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\r\n multiplier = from > 0 && from / 100;\r\n\r\n //const perf = performance.now();\r\n font = `${element.dataset.fontWeight || 400} ${fontSize} ${fontFamily}`;\r\n /* const computedStyle = window.getComputedStyle(elm, null);\r\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\r\n //console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\r\n\r\n textWidth = getTextWidth(text, font);\r\n //const perf = performance.now();\r\n elementWidth = element.getBoundingClientRect().width;\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 = element.getBoundingClientRect().width;\r\n const widthChanged = firstTime || elementWidth !== newElementWidth;\r\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\r\n \r\n if(widthChanged) {\r\n if(textWidth > elementWidth) {\r\n element.setAttribute('title', text);\r\n let smallerText = text;\r\n let smallerWidth = elementWidth;\r\n while(smallerText.length > 3) {\r\n let smallerTextLength = smallerText.length;\r\n const half = multiplier &&\r\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\r\n Math.max(smallerTextLength + from - 1, 1);\r\n const half1 = smallerText.substr(0, half).replace(/\\s*$/,'');\r\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/,'');\r\n smallerText = half1 + half2;\r\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\r\n if(smallerWidth < elementWidth) {\r\n element.textContent = half1 + ellipsis + half2;\r\n break;\r\n }\r\n }\r\n\r\n // * set new width after cutting text\r\n mapped.elementWidth = element.getBoundingClientRect().width;\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\nlet context: CanvasRenderingContext2D;\r\n/**\r\n * Get the text width\r\n * @param {string} text\r\n * @param {string} font\r\n */\r\nfunction getTextWidth(text: string, font: string) {\r\n //const perf = performance.now();\r\n if(!context) {\r\n const canvas = document.createElement('canvas');\r\n context = canvas.getContext('2d');\r\n context.font = font;\r\n }\r\n\r\n //context.font = font;\r\n const metrics = context.measureText(text);\r\n //console.log('getTextWidth perf:', performance.now() - perf);\r\n return metrics.width;\r\n //return Math.round(metrics.width);\r\n}\r\n\r\nexport class MiddleEllipsisElement extends HTMLElement {\r\n constructor() {\r\n super();\r\n }\r\n\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 testQueue.add(this);\r\n setTestQueue();\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 //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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../rootScope\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport RichTextProcessor from \"../richtextprocessor\";\r\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\r\nimport { MessageEntity, DraftMessage, MessagesSaveDraft } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { deepEqual } from \"../../helpers/object\";\r\nimport { isObject } from \"../mtproto/bin_utils\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\n\r\nexport type MyDraftMessage = DraftMessage.draftMessage;\r\n\r\nexport class AppDraftsManager {\r\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\r\n private getAllDraftPromise: Promise = null;\r\n\r\n constructor() {\r\n stateStorage.get('drafts').then(drafts => {\r\n this.drafts = drafts || {};\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateDraftMessage: (update) => {\r\n const peerID = appPeersManager.getPeerId(update.peer);\r\n this.saveDraft(peerID, update.threadId, update.draft, {notify: true});\r\n }\r\n });\r\n }\r\n\r\n private getKey(peerId: PeerId, threadId?: number) {\r\n return '' + peerId + (threadId ? '_' + threadId : '');\r\n }\r\n\r\n public getDraft(peerId: PeerId, threadId?: number) {\r\n return this.drafts[this.getKey(peerId, threadId)];\r\n }\r\n\r\n public addMissedDialogs() {\r\n return this.getAllDrafts().then(() => {\r\n for(const key in this.drafts) {\r\n if(key.indexOf('_') !== -1) { // exclude threads\r\n continue;\r\n }\r\n\r\n const peerId = key.toPeerId();\r\n const dialog = appMessagesManager.getDialogOnly(peerId);\r\n if(!dialog) {\r\n appMessagesManager.reloadConversation(peerId);\r\n /* const dialog = appMessagesManager.generateDialog(peerId);\r\n dialog.draft = this.drafts[key];\r\n appMessagesManager.saveConversation(dialog);\r\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\r\n appMessagesManager.scheduleHandleNewDialogs(); */\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getAllDrafts() {\r\n return this.getAllDraftPromise || (\r\n this.getAllDraftPromise = apiManager.invokeApi('messages.getAllDrafts')\r\n .then((updates) => {\r\n const p = apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\r\n p.then(() => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n })\r\n );\r\n }\r\n\r\n public saveDraft(peerId: PeerId, threadId: number, apiDraft: DraftMessage, options: Partial<{\r\n notify: boolean,\r\n force: boolean\r\n }> = {}) {\r\n const draft = this.processApiDraft(apiDraft);\r\n\r\n const key = this.getKey(peerId, threadId);\r\n if(draft) {\r\n this.drafts[key] = draft;\r\n } else {\r\n delete this.drafts[key];\r\n }\r\n\r\n stateStorage.set({\r\n drafts: this.drafts\r\n });\r\n\r\n if(options.notify) {\r\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId,\r\n threadId,\r\n draft,\r\n force: options.force\r\n });\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\r\n if(typeof(draft1) !== typeof(draft2)) {\r\n return false;\r\n }\r\n\r\n if(!isObject(draft1)) {\r\n return true;\r\n }\r\n\r\n if(draft1._ !== draft2._) {\r\n return false;\r\n }\r\n \r\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\r\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\r\n return false;\r\n }\r\n \r\n if(!deepEqual(draft1.entities, draft2.entities)) {\r\n return false;\r\n }\r\n \r\n if(draft1.message !== draft2.message) {\r\n return false;\r\n }\r\n \r\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public isEmptyDraft(draft: DraftMessage) {\r\n if(!draft || draft._ === 'draftMessageEmpty') {\r\n return true;\r\n }\r\n \r\n if(draft.reply_to_msg_id > 0) {\r\n return false;\r\n }\r\n \r\n if(!draft.message.length) {\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public processApiDraft(draft: DraftMessage): MyDraftMessage {\r\n if(!draft || draft._ !== 'draftMessage') {\r\n return undefined;\r\n }\r\n\r\n const myEntities = RichTextProcessor.parseEntities(draft.message);\r\n const apiEntities = draft.entities || [];\r\n const totalEntities = RichTextProcessor.mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\r\n\r\n draft.rMessage = RichTextProcessor.wrapDraftText(draft.message, {entities: totalEntities});\r\n //draft.rReply = appMessagesManager.getRichReplyText(draft);\r\n if(draft.reply_to_msg_id) {\r\n draft.reply_to_msg_id = appMessagesIdsManager.generateMessageId(draft.reply_to_msg_id);\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public async syncDraft(peerId: PeerId, threadId: number, localDraft?: MyDraftMessage, saveOnServer = true, force = false) {\r\n // console.warn(dT(), 'sync draft', peerID)\r\n const serverDraft = this.getDraft(peerId, threadId);\r\n if(this.draftsAreEqual(serverDraft, localDraft)) {\r\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\r\n return true;\r\n }\r\n\r\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\r\n let params: MessagesSaveDraft = {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n message: ''\r\n };\r\n\r\n let draftObj: DraftMessage;\r\n if(this.isEmptyDraft(localDraft)) {\r\n draftObj = {_: 'draftMessageEmpty'};\r\n } else {\r\n let message = localDraft.message;\r\n let entities: MessageEntity[] = localDraft.entities;\r\n\r\n if(localDraft.reply_to_msg_id) {\r\n params.reply_to_msg_id = appMessagesIdsManager.getServerMessageId(localDraft.reply_to_msg_id);\r\n }\r\n\r\n if(entities?.length) {\r\n params.entities = appMessagesManager.getInputEntities(entities);\r\n }\r\n\r\n if(localDraft.pFlags.no_webpage) {\r\n params.no_webpage = localDraft.pFlags.no_webpage;\r\n }\r\n\r\n params.message = message;\r\n }\r\n\r\n const saveLocalDraft = draftObj || localDraft;\r\n saveLocalDraft.date = tsNow(true) + serverTimeManager.serverTimeOffset;\r\n\r\n this.saveDraft(peerId, threadId, saveLocalDraft, {notify: true, force});\r\n\r\n if(saveOnServer && !threadId) {\r\n return apiManager.invokeApi('messages.saveDraft', params);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public clearAllDrafts() {\r\n return apiManager.invokeApi('messages.clearAllDrafts').then(bool => {\r\n if(!bool) {\r\n return;\r\n }\r\n\r\n for(const combined in this.drafts) {\r\n const [peerId, threadId] = combined.split('_');\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId: peerId.toPeerId(),\r\n threadId: threadId ? +threadId : undefined,\r\n draft: undefined\r\n });\r\n }\r\n });\r\n }\r\n\r\n public clearDraft(peerId: PeerId, threadId: number) {\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId);\r\n } else {\r\n this.saveDraft(peerId, threadId, null, {notify: true, force: true}); \r\n }\r\n }\r\n\r\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\r\n const draft: DraftMessage.draftMessage = {\r\n _: 'draftMessage',\r\n date: Date.now() / 1000 | 0,\r\n message,\r\n pFlags: {},\r\n entities\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, draft, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, draft, {notify: true, force: true}); \r\n }\r\n }\r\n}\r\n\r\nconst appDraftsManager = new AppDraftsManager();\r\nMOUNT_CLASS_TO.appDraftsManager = appDraftsManager;\r\nexport default appDraftsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sequentialDom from \"../../helpers/sequentialDom\";\nimport { UserProfilePhoto, ChatPhoto, InputFileLocation } from \"../../layer\";\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../mtproto/mtproto_config\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager from \"./appUsersManager\";\n\ntype PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n public isAvatarCached(peerId: PeerId) {\n return !!this.savedAvatarURLs[peerId];\n }\n \n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n\n let cached = false;\n let getAvatarPromise: Promise;\n let saved = this.savedAvatarURLs[peerId];\n if(!saved || !saved[size]) {\n if(!saved) {\n saved = this.savedAvatarURLs[peerId] = {};\n }\n\n //console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation', \n pFlags: {},\n peer: inputPeer, \n photo_id: photo.photo_id\n };\n\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n }\n\n const downloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = appDownloadManager.download(downloadOptions);\n getAvatarPromise = saved[size] = promise.then(blob => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else if(typeof(saved[size]) !== 'string') {\n getAvatarPromise = saved[size] as Promise;\n } else {\n getAvatarPromise = Promise.resolve(saved[size]);\n cached = true;\n }\n\n return {cached, loadPromise: getAvatarPromise};\n }\n\n public putAvatar(\n div: HTMLElement, \n peerId: PeerId, \n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, \n size: PeerPhotoSize, \n img = new Image(), \n onlyThumb = false\n ) {\n let {cached, loadPromise} = this.loadAvatar(peerId, photo, size);\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n if(size === 'photo_big') { // let's load small photo first\n const res = this.putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = appPhotosManager.getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n \n if(animate) {\n img.classList.remove('fade-in');\n }\n\n if(thumbImage) {\n thumbImage.remove();\n }\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , false */))\n .then(callback);\n\n return {\n cached, \n loadPromise: renderThumbPromise || renderPromise,\n thumbImage\n };\n }\n\n public s(div: HTMLElement, innerHTML: string, color: string, icon: string) {\n div.innerHTML = innerHTML;\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled');\n icon && div.classList.add(icon);\n }\n\n // peerId === peerId || title\n public putPhoto(div: HTMLElement, peerId: PeerId, isDialog = false, title = '', onlyThumb = false) {\n const myId = rootScope.myId;\n \n //console.log('loadDialogPhoto location:', location, inputPeer);\n if(peerId === myId && isDialog) {\n this.s(div, '', '', 'tgico-saved');\n return;\n }\n \n if(peerId !== NULL_PEER_ID && peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.pFlags && user.pFlags.deleted) {\n this.s(div, '', appPeersManager.getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n }\n \n const photo = appPeersManager.getPeerPhoto(peerId);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !this.savedAvatarURLs[peerId]) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = appPeersManager.getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n this.s(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n let abbr: string;\n if(!title) {\n const peer = appPeersManager.getPeer(peerId);\n abbr = peer.initials ?? '';\n } else {\n abbr = RichTextProcessor.getAbbreviation(title);\n }\n\n this.s(div, abbr, color, '');\n //return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const size: PeerPhotoSize = 'photo_small';\n return this.putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n }\n }\n}\n\nconst appAvatarsManager = new AppAvatarsManager();\nexport default appAvatarsManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum GROUP_CALL_STATE {\n UNMUTED,\n MUTED,\n MUTED_BY_ADMIN,\n CONNECTING,\n CLOSED\n}\n\nexport default GROUP_CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * 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 Config from \"../lib/config\";\n\nconst badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = Config.LatinizeMap[ch];\n return latinizeCh !== undefined ? latinizeCh : ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n const hasTag = text.charAt(0) === '%';\n text = clearBadCharsAndTrim(text);\n if(latinize) text = latinizeString(text);\n \n text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n\n return text;\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n return text;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n/**\r\n * Descend sorted storage\r\n */\r\n\r\ntype ItemType = number;\r\n\r\nexport enum SliceEnd {\r\n None = 0,\r\n Top = 1,\r\n Bottom = 2,\r\n Both = SliceEnd.Top | SliceEnd.Bottom\r\n};\r\n\r\nexport interface Slice extends Array {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd;\r\n\r\n isEnd: (side: SliceEnd) => boolean;\r\n setEnd: (side: SliceEnd) => void;\r\n unsetEnd: (side: SliceEnd) => void;\r\n\r\n slice: (from?: number, to?: number) => Slice;\r\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice;\r\n}\r\n\r\nexport interface SliceConstructor {\r\n new(...items: ItemType[]): Slice;\r\n}\r\n\r\nexport default class SlicedArray {\r\n private slices: Slice[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\r\n private sliceConstructor: SliceConstructor;\r\n \r\n constructor() {\r\n // @ts-ignore\r\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\r\n\r\n const first = this.constructSlice();\r\n //first.setEnd(SliceEnd.Bottom);\r\n this.slices = [first];\r\n }\r\n\r\n private static getSliceConstructor(slicedArray: SlicedArray) {\r\n return class Slice extends Array implements Slice {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd = SliceEnd.None;\r\n \r\n /* constructor(...items: ItemType[]) {\r\n super(...items);\r\n //this.slicedArray = slicedArray;\r\n } */\r\n \r\n isEnd(side: SliceEnd): boolean {\r\n if((this.end & side) === side) {\r\n return true;\r\n }/* else if(!this.slicedArray) {\r\n return false;\r\n } */\r\n \r\n let isEnd = false;\r\n if(side === SliceEnd.Top) {\r\n const slice = slicedArray.last;\r\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Bottom) {\r\n const slice = slicedArray.first;\r\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Both) {\r\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\r\n }\r\n\r\n if(isEnd) {\r\n this.setEnd(side);\r\n }\r\n \r\n return isEnd;\r\n }\r\n \r\n setEnd(side: SliceEnd) {\r\n this.end |= side;\r\n }\r\n\r\n unsetEnd(side: SliceEnd) {\r\n this.end ^= side;\r\n }\r\n\r\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\r\n const ret = super.splice(start, deleteCount, ...items);\r\n\r\n if(!this.length) {\r\n const slices = slicedArray.slices as number[][];\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: ItemType[]) {\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: ItemType[], 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(slice[0] > s[0]) {\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: ItemType) {\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: number) {\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(maxId >= slice[offset]) {\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: number, add_offset: number, limit: number) {\r\n let slice = this.slice;\r\n let offset = 0;\r\n let sliceOffset = 0;\r\n\r\n if(offsetId) {\r\n const pos = this.findSliceOffset(offsetId);\r\n if(!pos) {\r\n return undefined;\r\n }\r\n\r\n slice = pos.slice;\r\n offset = sliceOffset = pos.offset;\r\n\r\n if(slice.includes(offsetId)) {\r\n sliceOffset += 1;\r\n }\r\n\r\n /* if(slice.includes(offsetId) && add_offset < 0) {\r\n add_offset += 1;\r\n } */\r\n }\r\n\r\n let sliceStart = Math.max(sliceOffset + add_offset, 0);\r\n let sliceEnd = sliceOffset + add_offset + limit;\r\n //const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\r\n //sliceEnd += fixHalfBackLimit;\r\n\r\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice;\r\n\r\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\r\n const bottomWasMeantToLoad = Math.abs(add_offset);\r\n\r\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\r\n // useful when there is only 1 message in chat on its reopening\r\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\r\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\r\n\r\n //console.log('sliceMe', topFulfilled, bottomFulfilled);\r\n\r\n return {\r\n slice: sliced, \r\n offsetIdOffset: offset,\r\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\r\n };\r\n }\r\n\r\n public unshift(...items: ItemType[]) {\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: ItemType[]) {\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: ItemType) {\r\n const found = this.findSlice(item);\r\n if(found) {\r\n found.slice.splice(found.index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { copy } from \"../../helpers/object\";\r\nimport { InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults } from \"../../layer\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport appMessagesManager from './appMessagesManager';\r\nimport appPeersManager from './appPeersManager';\r\nimport appUsersManager from \"./appUsersManager\";\r\n\r\nexport class AppPollsManager {\r\n public polls: {[id: string]: Poll} = {};\r\n public results: {[id: string]: PollResults} = {};\r\n public pollToMessages: {[id: string]: Set} = {};\r\n\r\n private log = logger('POLLS', LogTypes.Error);\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateMessagePoll: (update) => {\r\n this.log('updateMessagePoll:', update);\r\n\r\n let poll: Poll = update.poll || this.polls[update.poll_id];\r\n if(!poll) {\r\n return;\r\n }\r\n\r\n let results = update.results;\r\n const ret = this.savePoll(poll, results as any);\r\n poll = ret.poll;\r\n results = ret.results;\r\n \r\n rootScope.dispatchEvent('poll_update', {poll, results: results as any});\r\n }\r\n });\r\n }\r\n\r\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\r\n if(message) {\r\n this.updatePollToMessage(message, true);\r\n }\r\n\r\n const id = poll.id;\r\n if(this.polls[id]) {\r\n poll = Object.assign(this.polls[id], poll);\r\n results = this.saveResults(poll, results);\r\n } else {\r\n this.polls[id] = poll;\r\n\r\n poll.rQuestion = RichTextProcessor.wrapEmojiText(poll.question);\r\n poll.rReply = RichTextProcessor.wrapEmojiText('📊') + ' ' + (poll.rQuestion || 'poll');\r\n poll.chosenIndexes = [];\r\n results = this.saveResults(poll, results);\r\n }\r\n\r\n return {poll, results};\r\n }\r\n\r\n public saveResults(poll: Poll, results: PollResults) {\r\n if(this.results[poll.id]) {\r\n results = Object.assign(this.results[poll.id], results);\r\n } else {\r\n this.results[poll.id] = results;\r\n }\r\n\r\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\r\n poll.chosenIndexes.length = 0;\r\n if(results?.results?.length) {\r\n results.results.forEach((answer, idx) => {\r\n if(answer.pFlags?.chosen) {\r\n poll.chosenIndexes.push(idx);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n public getPoll(pollId: string): {poll: Poll, results: PollResults} {\r\n return {\r\n poll: this.polls[pollId], \r\n results: this.results[pollId]\r\n };\r\n }\r\n\r\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\r\n if(solution) {\r\n if(!solutionEntities) {\r\n solutionEntities = [];\r\n }\r\n\r\n solution = RichTextProcessor.parseMarkdown(solution, solutionEntities);\r\n } else {\r\n solution = undefined; // can be string here\r\n }\r\n\r\n return {\r\n _: 'inputMediaPoll',\r\n poll,\r\n correct_answers: correctAnswers,\r\n solution,\r\n solution_entities: solution ? solutionEntities : undefined\r\n };\r\n }\r\n\r\n public updatePollToMessage(message: Message.message, add: boolean) {\r\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\r\n let set = this.pollToMessages[id];\r\n \r\n if(!add && !set) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = this.pollToMessages[id] = new Set();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n if(add) set.add(key);\r\n else set.delete(key);\r\n\r\n if(!add && !set.size) {\r\n delete this.polls[id];\r\n delete this.results[id];\r\n delete this.pollToMessages[id];\r\n }\r\n }\r\n\r\n public sendVote(message: any, optionIds: number[]): Promise {\r\n const poll: Poll = message.media.poll;\r\n\r\n const options: Uint8Array[] = optionIds.map(index => {\r\n return poll.answers[index].option;\r\n });\r\n \r\n const messageId = message.mid;\r\n const peerId = message.peerId;\r\n const inputPeer = appPeersManager.getInputPeerById(peerId);\r\n\r\n if(message.pFlags.is_outgoing) {\r\n return appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\r\n this.log('invoke sendVote callback');\r\n return this.sendVote(message, optionIds);\r\n });\r\n }\r\n\r\n return apiManager.invokeApi('messages.sendVote', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n options\r\n }).then(updates => {\r\n this.log('sendVote updates:', updates);\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getResults(message: any) {\r\n const inputPeer = appPeersManager.getInputPeerById(message.peerId);\r\n\r\n return apiManager.invokeApi('messages.getPollResults', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid)\r\n }).then(updates => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n this.log('getResults updates:', updates);\r\n });\r\n }\r\n\r\n public getVotes(message: any, option?: Uint8Array, offset?: string, limit = 20) {\r\n return apiManager.invokeApi('messages.getPollVotes', {\r\n peer: appPeersManager.getInputPeerById(message.peerId),\r\n id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n option,\r\n offset,\r\n limit\r\n }).then((votesList) => {\r\n this.log('getPollVotes messages:', votesList);\r\n\r\n appUsersManager.saveApiUsers(votesList.users);\r\n\r\n return votesList;\r\n });\r\n }\r\n\r\n public stopPoll(message: any) {\r\n const poll: Poll = message.media.poll;\r\n \r\n if(poll.pFlags.closed) return Promise.resolve();\r\n\r\n const newPoll = copy(poll);\r\n newPoll.pFlags.closed = true;\r\n return appMessagesManager.editMessage(message, undefined, {\r\n newMedia: this.getInputMediaPoll(newPoll)\r\n }).then(() => {\r\n //console.log('stopped poll');\r\n }, err => {\r\n this.log.error('stopPoll error:', err);\r\n });\r\n }\r\n}\r\n\r\nconst appPollsManager = new AppPollsManager();\r\nMOUNT_CLASS_TO.appPollsManager = appPollsManager;\r\nexport default appPollsManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\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, deferredPromise } from \"./cancellablePromise\";\r\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf } from \"./schedulers\";\r\n\r\ntype HeavyQueue = {\r\n items: any[], \r\n process: (...args: any[]) => T,\r\n context: any,\r\n promise?: CancellablePromise['process']>[]>\r\n};\r\nconst heavyQueue: HeavyQueue[] = [];\r\nlet processingQueue = false;\r\n\r\nexport default function addHeavyTask(queue: HeavyQueue, method: 'push' | 'unshift' = 'push') {\r\n if(!queue.items.length) {\r\n return Promise.resolve([]);\r\n }\r\n \r\n queue.promise = deferredPromise();\r\n heavyQueue[method](queue);\r\n processHeavyQueue();\r\n\r\n return queue.promise;\r\n}\r\n\r\nfunction processHeavyQueue() {\r\n if(!processingQueue) {\r\n const queue = heavyQueue.shift();\r\n timedChunk(queue).finally(() => {\r\n processingQueue = false;\r\n if(heavyQueue.length) {\r\n processHeavyQueue();\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction timedChunk(queue: HeavyQueue) {\r\n if(!queue.items.length) {\r\n queue.promise.resolve([]);\r\n return Promise.resolve([]);\r\n }\r\n\r\n const todo = queue.items.slice();\r\n const results: T[] = [];\r\n\r\n return new Promise((resolve, reject) => {\r\n const f = async() => {\r\n const start = performance.now();\r\n\r\n do {\r\n await getHeavyAnimationPromise();\r\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\r\n let realResult: T;\r\n if(possiblePromise instanceof Promise) {\r\n try {\r\n realResult = await possiblePromise;\r\n } catch(err) {\r\n reject(err);\r\n return;\r\n }\r\n } else {\r\n realResult = possiblePromise;\r\n }\r\n\r\n results.push(realResult);\r\n } while(todo.length > 0 && (performance.now() - start) < 6);\r\n\r\n if(todo.length > 0) {\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n } else {\r\n resolve(results);\r\n }\r\n };\r\n\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n }).then(queue.promise.resolve, queue.promise.reject);\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type fastBlur from '../vendor/fastBlur';\r\nimport addHeavyTask from './heavyQueue';\r\n\r\nconst RADIUS = 2;\r\nconst ITERATIONS = 2;\r\n\r\nconst isFilterAvailable = 'filter' in (document.createElement('canvas').getContext('2d') || {});\r\nlet requireBlurPromise: Promise;\r\nlet fastBlurFunc: typeof fastBlur;\r\nif(!isFilterAvailable) {\r\n requireBlurPromise = import('../vendor/fastBlur').then(m => {\r\n fastBlurFunc = m.default;\r\n });\r\n} else {\r\n requireBlurPromise = Promise.resolve();\r\n}\r\n\r\nfunction processBlurNext(img: HTMLImageElement, radius: number, iterations: number) {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n \r\n const ctx = canvas.getContext('2d', {alpha: false});\r\n if(isFilterAvailable) {\r\n ctx.filter = `blur(${radius}px)`;\r\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\r\n } else {\r\n ctx.drawImage(img, 0, 0);\r\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\r\n }\r\n \r\n resolve(canvas.toDataURL());\r\n /* if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n } */\r\n\r\n /* canvas.toBlob(blob => {\r\n resolve(URL.createObjectURL(blob));\r\n \r\n if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n }\r\n }); */\r\n });\r\n}\r\n\r\nconst blurPromises: Map> = new Map();\r\nconst CACHE_SIZE = 1000;\r\n\r\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\r\n if(!dataUri) {\r\n console.error('no dataUri for blur', dataUri);\r\n return Promise.resolve(dataUri);\r\n }\r\n\r\n if(blurPromises.size > CACHE_SIZE) {\r\n blurPromises.clear();\r\n }\r\n \r\n if(blurPromises.has(dataUri)) return blurPromises.get(dataUri);\r\n const promise = new Promise((resolve) => {\r\n //return resolve(dataUri);\r\n requireBlurPromise.then(() => {\r\n const img = new Image();\r\n img.onload = () => {\r\n if(isFilterAvailable) {\r\n processBlurNext(img, radius, iterations).then(resolve);\r\n } else {\r\n addHeavyTask({\r\n items: [[img, radius, iterations]],\r\n context: null,\r\n process: processBlurNext\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n });\r\n }\r\n };\r\n img.src = dataUri;\r\n\r\n /* addHeavyTask({\r\n items: [[dataUri, radius, iterations]],\r\n context: null,\r\n process: processBlur\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n }); */\r\n });\r\n });\r\n\r\n blurPromises.set(dataUri, promise);\r\n\r\n return promise;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { RefreshReferenceTask, RefreshReferenceTaskResponse } from \"./apiFileManager\";\nimport appMessagesManager from \"../appManagers/appMessagesManager\";\nimport { Photo } from \"../../layer\";\nimport { bytesToHex } from \"../../helpers/bytes\";\nimport { deepEqual } from \"../../helpers/object\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport apiManager from \"./mtprotoworker\";\nimport assumeType from \"../../helpers/assumeType\";\nimport { logger } from \"../logger\";\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage;\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\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n//type ReferenceBytes = Uint8Array;\n\nclass ReferenceDatabase {\n private contexts: Map = new Map();\n //private references: Map = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n\n constructor() {\n apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n const originalPayload = task.payload;\n\n assumeType(task);\n task.originalPayload = originalPayload;\n\n this.refreshReference(originalPayload).then((bytes) => {\n task.payload = bytes;\n }, (err) => {\n task.error = err;\n }).then(() => apiManager.postMessage(task));\n });\n }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n \n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise;\n switch(context?.type) {\n case 'message': {\n promise = appMessagesManager.wrapSingleMessage(context.peerId, context.messageId, true);\n break; \n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n default: {\n this.log.warn('refreshReference: not implemented context', context);\n return Promise.reject();\n }\n }\n\n const hex = bytesToHex(reference);\n this.log('refreshReference: refreshing reference:', hex);\n return promise.then(() => {\n const newHex = bytesToHex(reference);\n this.log('refreshReference: refreshed, reference before:', hex, 'after:', newHex);\n if(hex !== newHex) {\n return reference;\n }\n\n this.deleteContext(reference, context);\n\n const newContext = this.getContext(reference);\n if(newContext) {\n return this.refreshReference(reference, newContext[0]);\n }\n\n this.log.error('refreshReference: no new context, reference before:', hex, 'after:', newHex, context);\n\n throw 'NO_NEW_CONTEXT';\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n\nconst referenceDatabase = new ReferenceDatabase();\nMOUNT_CLASS_TO.referenceDatabase = referenceDatabase;\nexport default referenceDatabase;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToDocumentFragment(html: string) {\r\n var template = document.createElement('template');\r\n html = html.trim(); // Never return a text node of whitespace as the result\r\n template.innerHTML = html;\r\n return template.content;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport type AttributeKey = 'group' | 'rtcp' | 'ice-ufrag' | \n 'ice-pwd' | 'ice-options' | 'fingerprint' | 'setup' | \n 'mid' | 'extmap' | 'sendonly' | 'msid' | 'rtcp-mux' | \n 'rtpmap' | 'rtcp-fb' | 'fmtp' | 'ssrc' | 'ssrc-group' |\n 'extmap-allow-mixed' | 'msid-semantic';\n\nexport type AttributeMap = {[k in AttributeKey]?: boolean};\n\nexport default class SDP {\n #session: SDPSessionSection;\n #media: SDPMediaSection[];\n\n constructor(session: SDP['session'], mediaSections: SDP['media']) {\n this.#session = session;\n this.#media = mediaSections;\n }\n\n public get session() {\n return this.#session;\n }\n\n public get media() {\n return this.#media;\n }\n\n public get bundle() {\n const bundleLine = this.session.lines.find(line => line.parsed?.key === 'group');\n return bundleLine.value.split(' ').slice(1);\n }\n\n toString() {\n return this.session.lines\n .concat(...this.media.map(section => section.lines))\n .map(line => line.toString()).join('\\r\\n') + '\\r\\n';\n }\n\n /* get buggedMedia() {\n const bundle = this.bundle;\n type A = {\n mid: SDPMediaSection['mid'],\n mediaType: SDPMediaSection['mediaType'],\n direction: SDPMediaSection['direction']\n };\n const out: A[] = [];\n for(let i = 0, length = this.media.length; i < length; ++i) {\n const section = this.media[i];\n const mid = section.mid;\n if(!bundle.includes(mid)) {\n out.push(section);\n }\n }\n\n return out;\n } */\n\n /* get mediaTypes() {\n return this.media.map((section) => {\n return {mid: section.oa.get('mid').oa, type: section.mediaType, direction: section.direction};\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function splitStringByLimitWithRest(str: string, separator: string, limit: number) {\n const splitted = str.split(separator);\n const out: string[] = [];\n\n while(limit > 0 && splitted.length) {\n out.push(splitted.shift());\n --limit;\n }\n\n if(splitted.length) {\n out.push(splitted.join(separator));\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class UniqueNumberGenerator {\n #set: Set;\n #min: number;\n #max: number;\n\n constructor(min: number, max: number) {\n this.#set = new Set();\n this.#min = min;\n this.#max = max;\n }\n\n public generate() {\n const min = this.#min;\n const max = this.#max;\n const set = this.#set;\n\n const maxTries = max - min + 1;\n let value = Math.floor(min + maxTries * Math.random()), _try = 0;\n while(set.has(value)) {\n if(value < max) {\n ++value;\n } else {\n value = min;\n }\n\n if(++_try >= maxTries) {\n return null;\n }\n }\n\n set.add(value);\n return value;\n }\n\n public add(value: number) {\n this.#set.add(value);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AttributeKey } from \".\";\n\nexport default class SDPAttributeSplitted {\n #key: AttributeKey;\n #value: string;\n\n // key = 'ssrc-group', value = 'SIM 1 2 3'\n constructor(key: AttributeKey, value: string) {\n this.#key = key;\n this.#value = value;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class SDPMediaLineParts {\n #type: 'audio' | 'video' | 'application';\n #port: string;\n #protocol: string;\n #ids: string[];\n\n constructor(\n type: SDPMediaLineParts['type'], \n port: SDPMediaLineParts['port'], \n protocol: SDPMediaLineParts['protocol'], \n ids: SDPMediaLineParts['ids']\n ) {\n this.#type = type;\n this.#port = port;\n this.#protocol = protocol;\n this.#ids = ids;\n }\n\n public get type() {\n return this.#type;\n }\n \n public get port() {\n return this.#port;\n }\n\n public get protocol() {\n return this.#protocol;\n }\n\n public get ids() {\n return this.#ids;\n }\n\n toString() {\n return this.type + ' ' + this.port + ' ' + this.protocol + ' ' + this.ids.join(' ');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport SDPAttributeSplitted from \"./attributeSplitted\";\nimport SDPMediaLineParts from \"./mediaLineParts\";\n\nexport default class SDPLine {\n #key: 'm' | 'a' | 'o' | 'v' | 's' | 't' | 'c';\n #value: string;\n #mediaLineParts: SDPMediaLineParts;\n #parsed?: SDPAttributeSplitted;\n\n // key = 'a', value = 'ssrc-group:SIM 1 2 3'\n constructor(key: SDPLine['key'], value: string | SDPMediaLineParts | SDPAttributeSplitted) {\n this.#key = key;\n\n if(typeof(value) === 'string') {\n this.#value = value;\n\n if(key === 'm') {\n const splitted = value.split(' ');\n this.#mediaLineParts = new SDPMediaLineParts(splitted[0] as any, splitted[1], splitted[2], splitted.slice(3));\n } else {\n if(key === 'a') {\n const result = splitStringByLimitWithRest(value, ':', 1);\n value = result[0];\n this.#parsed = result.length === 1 ? new SDPAttributeSplitted(value as any, null) : new SDPAttributeSplitted(value as any, result[1]);\n }\n }\n } else {\n if(value instanceof SDPMediaLineParts) {\n this.#mediaLineParts = value;\n this.#value = value.toString();\n } else if(value instanceof SDPAttributeSplitted) {\n this.#parsed = value;\n this.#value = value.value ? `${value.key}:${value.value}` : value.key;\n }\n }\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n\n public get parsed() {\n return this.#parsed;\n }\n\n public get mediaLineParts() {\n return this.#mediaLineParts;\n }\n\n toString() {\n return `${this.key}=${this.value}`;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\n\nexport default class SDPAttributeInner {\n #key: string;\n #lines: Array;\n #prefix: string;\n #nestedMap: Map;\n #missed: boolean;\n #keys: Array;\n\n constructor(key: SDPAttributeInner['key'], lines: SDPAttributeInner['lines'], prefix: string = ':', missed = false) {\n this.#key = key;\n this.#lines = lines;\n this.#prefix = prefix;\n this.#missed = missed;\n this.#nestedMap = missed ? new Map() : null;\n this.#keys = missed ? [] : null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get value() {\n return this.#missed || !this.lines.length ? null : this.lines[0];\n }\n\n public get exists() {\n return !this.#missed;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get keys() {\n SDPAttributeInner.fill(this);\n return this.#keys;\n }\n\n public forEach(callback: Parameters['forEach']>[0]) {\n SDPAttributeInner.fill(this);\n this.#nestedMap.forEach(callback);\n }\n\n public get(key: string) {\n SDPAttributeInner.fill(this);\n return this.#nestedMap.get(key) || new SDPAttributeInner(key, [], ':', true);\n }\n \n private static fill(attribute: SDPAttributeInner) {\n if(attribute.#nestedMap !== null) {\n return;\n }\n\n const map: Map> = new Map();\n attribute.lines.forEach(str => {\n const [key, rest] = splitStringByLimitWithRest(str, attribute.#prefix, 1);\n const values = map.get(key) || [];\n map.set(key, [...values, rest || '']);\n });\n \n const nestedMap = attribute.#nestedMap = SDPAttributeInner.makeAttributes(map);\n attribute.#keys = Array.from(nestedMap.keys());\n }\n\n private static makeAttributes(innerParts: Map>) {\n const out: Map = new Map();\n \n innerParts.forEach((lines, key) => {\n out.set(key, new SDPAttributeInner(key, lines));\n });\n \n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPAttributeInner from \"./attributeInner\";\nimport SDPLine from \"./line\";\n\nexport default class SDPAttributes {\n #lines: SDPLine[];\n #attributes: Map;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#attributes = new Map();\n SDPAttributes.fillAttributes(this);\n }\n\n public get(key: string) {\n return this.#attributes.get(key) || new SDPAttributeInner(key, [], ' ', true);\n }\n\n private static fillAttributes(attributes: SDPAttributes) {\n const attributesMap: Map> = new Map();\n attributes.#lines.forEach((line) => {\n if(line.key === 'a') {\n const {key, value} = line.parsed;\n\n let linesArray = attributesMap.get(key);\n if(!linesArray) {\n linesArray = [];\n attributesMap.set(key, linesArray);\n }\n \n linesArray.push(value || '');\n }\n });\n\n attributesMap.forEach((linesArray, key) => {\n attributes.#attributes.set(key, new SDPAttributeInner(key, linesArray, ' ', false));\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AttributeMap } from \".\";\nimport { NoExtraProperties } from \"../../../types\";\nimport SDPAttributes from \"./attributes\";\nimport SDPLine from \"./line\";\n\nexport type SDPMediaDirection = 'sendonly' | 'recvonly' | 'inactive' | 'sendrecv';\nexport default class SDPMediaSection {\n #lines: Array;\n #mediaLine: SDPLine;\n #attributes: SDPAttributes;\n #direction: SDPMediaDirection;\n\n constructor(lines: Array) {\n this.#lines = lines;\n this.#mediaLine = lines[0];\n this.#attributes = this.#direction = null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get mediaLine() {\n return this.#mediaLine;\n }\n\n public get mediaLineParts() {\n return this.#mediaLine.mediaLineParts;\n }\n\n public get mediaType() {\n return this.mediaLineParts.type;\n }\n\n public get direction() {\n if(!this.#direction) {\n const attributes = this.attributes;\n\n let direction: SDPMediaDirection;\n if(attributes.get('sendonly').exists) direction = 'sendonly';\n else if(attributes.get('recvonly').exists) direction = 'recvonly';\n else if(attributes.get('inactive').exists) direction = 'inactive';\n else direction = 'sendrecv';\n\n this.#direction = direction;\n }\n\n return this.#direction;\n }\n\n public get isSending() {\n return this.direction === 'sendrecv' || this.direction === 'sendonly';\n }\n\n public get isReceiving() {\n return this.direction === 'sendrecv' || this.direction === 'recvonly';\n }\n\n public get attributes() {\n this.#attributes || (this.#attributes = new SDPAttributes(this.lines));\n return this.#attributes;\n }\n\n public get mid() {\n return this.attributes.get('mid').value;\n }\n\n public lookupAttributeKeys(keys: NoExtraProperties): {[k in keyof T]: T[k] extends true ? string : string[]} {\n const out: any = {};\n\n for(const key in keys) {\n const result = this.attributes.get(key);\n // @ts-ignore\n const resultShouldBeArray = !keys[key];\n if(!result) {\n out[key] = resultShouldBeArray ? [] : undefined;\n } else {\n out[key] = resultShouldBeArray ? result.lines : result.value;\n }\n }\n\n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPLine from \"./line\";\n\nexport default class SDPSessionSection {\n #lines: SDPLine[];\n #sessionId: string;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#sessionId = lines.filter(line => line.key === 'o').map(line => line.value.split(' ')[1])[0];\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get sessionId() {\n return this.#sessionId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from \".\";\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport UniqueNumberGenerator from \"../../../helpers/uniqueNumberGenerator\";\nimport SDPLine from \"./line\";\nimport SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport function parseSdp(str: string) {\n function createSection() {\n if(sessionSection) {\n mediaSections.push(new SDPMediaSection(lines));\n } else {\n sessionSection = new SDPSessionSection(lines);\n }\n }\n\n let sessionSection: SDPSessionSection = null, mediaSections: SDPMediaSection[] = [], lines: SDPLine[] = [];\n str.split(/\\r?\\n/).forEach(lineStr => {\n if(!isIncorrectSdpLine(lineStr)) {\n const line = parseSdpLine(lineStr);\n if(line.key === 'm') {\n createSection();\n lines = [];\n }\n\n lines.push(line);\n }\n });\n\n createSection();\n return new SDP(sessionSection, mediaSections);\n}\n\nexport function isIncorrectSdpLine(str: string) {\n return /^[\\s\\xa0]*$/.test(str);\n}\n\nexport function parseSdpLine(str: string) {\n const splitted = splitStringByLimitWithRest(str, '=', 1);\n return new SDPLine(splitted[0] as any, splitted[1]);\n}\n\nexport function addSimulcast(sdp: SDP) {\n let generator: UniqueNumberGenerator;\n sdp.media.forEach((section, idx) => {\n if(section.mediaType === 'video' && section.isSending && !section.attributes.get('ssrc-group').get('SIM').exists) {\n if(!generator) {\n generator = new UniqueNumberGenerator(2, 4294967295);\n }\n\n const originalSsrcs = section.attributes.get('ssrc-group').get('FID').value.split(' ');\n const lines = section.lines;\n originalSsrcs.forEach(ssrc => generator.add(+ssrc)); // fix possible duplicates\n const ssrcs = [originalSsrcs[0], generator.generate(), generator.generate()];\n const ssrcs2 = [originalSsrcs[1], generator.generate(), generator.generate()];\n\n lines.push(parseSdpLine('a=ssrc-group:SIM ' + ssrcs.join(' ')));\n\n const ssrcsStrLines = section.attributes.get('ssrc').get(originalSsrcs[0]).lines;\n\n ssrcs.forEach((ssrc, idx) => {\n const ssrc2 = ssrcs2[idx];\n if(idx > 0) {\n lines.push(parseSdpLine('a=ssrc-group:FID ' + ssrc + ' ' + ssrc2));\n\n ssrcsStrLines.forEach(v => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc + ' ' + v));\n });\n\n ssrcsStrLines.forEach(v => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc2 + ' ' + v));\n });\n }\n });\n\n sdp.media[idx] = new SDPMediaSection(lines);\n }\n });\n\n return !!generator;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * 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 { forEachReverse } from \"../../helpers/array\";\nimport { copy } from \"../../helpers/object\";\nimport { GroupCallParticipantVideoSourceGroup } from \"../../layer\";\nimport { ConferenceEntry } from \"./localConferenceDescription\";\nimport SDP from \"./sdp\";\nimport SDPMediaSection from \"./sdp/mediaSection\";\nimport { parseSdp, addSimulcast } from \"./sdp/utils\";\nimport { generateMediaFirstLine, SDPBuilder } from \"./sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"./types\";\n\nexport async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n\tconst stream = await navigator.mediaDevices.getUserMedia(constraints);\n\tstream.getTracks().forEach(x => {\n\t\t/* x.onmute = x => {\n\t\t\tconsole.log('track.onmute', x);\n\t\t};\n\t\tx.onunmute = x => {\n\t\t\tconsole.log('track.onunmute', x);\n\t\t}; */\n\n\t\tx.enabled = !muted;\n\t});\n\n\t// console.log('getStream result', stream);\n\treturn stream;\n}\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// unsign => sign\nexport function toTelegramSource(source: number) {\n\treturn source << 0;\n}\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// sign => unsign\nexport function fromTelegramSource(source: number) {\n\treturn source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n\tif(!array) return 0;\n\n\tconst {length} = array;\n\tlet total = 0;\n\tfor(let i = 0; i < length; ++i) {\n\t\ttotal += array[i] * array[i];\n\t}\n\tconst rms = Math.sqrt(total / length) / 255;\n\n\treturn Math.min(1, rms * scale);\n}\n\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\nexport 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\nexport function fixLocalOffer(options: {\n offer: RTCSessionDescriptionInit, \n data: UpdateGroupCallConnectionData,\n // mids?: string[]\n}) {\n const {offer, data} = options;\n const sdp = parseSdp(offer.sdp);\n let hasMunged = false;\n hasMunged = addSimulcast(sdp) || hasMunged;\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 localMLine = mediaLine.toString();\n \n const codec = data[section.mediaType];\n const codecIds = codec['payload-types'].map(payload => '' + payload.id);\n const correctMLine = generateMediaFirstLine(section.mediaType, undefined, codecIds);\n \n if(localMLine !== correctMLine) {\n const sectionInfo = parseMediaSectionInfo(sdp, section);\n\n let newData = {...data};\n newData.transport = copy(newData.transport);\n newData.transport.ufrag = sectionInfo.ufrag;\n newData.transport.pwd = sectionInfo.pwd;\n newData.transport.fingerprints = [sectionInfo.fingerprint];\n newData.transport.candidates = [];\n\n const entry = new ConferenceEntry(sectionInfo.mid, mediaLineParts.type);\n entry.setPort(mediaLineParts.port);\n sectionInfo.source && entry.setSource(sectionInfo.sourceGroups || sectionInfo.source);\n entry.setDirection(section.direction);\n\n const newSdp = new SDPBuilder().addSsrcEntry(entry, newData).finalize();\n\n const newChannel = parseSdp(newSdp).media[0];\n arr[idx] = newChannel;\n\n hasMunged = true;\n }\n });\n\n if(hasMunged) {\n const mungedSdp = sdp.toString();\n offer.sdp = mungedSdp;\n }\n\n return {offer, sdp/* , bundleMids */};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * 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 { Codec, GroupCallConnectionTransport, PayloadType, Ssrc, UpdateGroupCallConnectionData } from './types';\nimport { fromTelegramSource } from './utils';\n\nexport type WebRTCLineType = 'video' | 'audio' | 'application';\n\nexport const WEBRTC_MEDIA_PORT = '9';\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}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${mediaType} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData;\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) {\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=${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(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 }\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\nexport default class StringFromLineBuilder {\n private lines: string[] = [];\n private newLine: string[] = [];\n\n constructor(private joiner = '\\r\\n') {\n\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\nimport { indexOfAndSplice } from '../../helpers/array';\nimport { safeAssign } from '../../helpers/object';\nimport { GroupCallParticipantVideoSourceGroup } from '../../layer';\nimport { 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 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(this.type, init);\n }\n\n public setSource(source: number | GroupCallParticipantVideoSourceGroup[]) {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\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 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 \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 getEntryByMid(mid: ConferenceEntry['mid']) {\n return this.entriesByMid.get(mid);\n }\n\n public getEntryBySource(source: ConferenceEntry['source']) {\n return this.entriesBySource.get(source);\n }\n\n public getEntriesByPeerId(peerId: ConferenceEntry['peerId']) {\n return this.entriesByPeerId.get(peerId);\n }\n\n public generateSdp(options: Omit[0], 'conference'>) {\n return SDPBuilder.fromConference({\n conference: this,\n ...options\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX } from './constants';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport { getAmplitude, toTelegramSource } from './utils';\n\nexport type StreamItemBase = {\n type: 'input' | 'output',\n track: MediaStreamTrack,\n source: string,\n stream: MediaStream\n};\n\nexport type StreamItem = StreamAudioItem | StreamVideoItem;\n\nexport type StreamAudioItem = StreamItemBase & {kind: 'audio', streamAnalyser: AudioStreamAnalyser};\nexport type StreamVideoItem = StreamItemBase & {kind: 'video'};\n\nexport type StreamAmplitude = {\n type: \"input\" | \"output\";\n source: string;\n stream: MediaStream;\n track: MediaStreamTrack;\n value: number;\n};\n\nclass AudioStreamAnalyser {\n public analyser: AnalyserNode;\n public gain: GainNode;\n public streamSource: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext, stream: MediaStream) {\n const streamSource = this.streamSource = context.createMediaStreamSource(stream);\n const analyser = this.analyser = context.createAnalyser();\n const gain = this.gain = context.createGain();\n // const streamDestination = context.createMediaStreamDestination();\n \n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n \n // connect Web Audio API\n streamSource.connect(analyser);\n // analyser.connect(context.destination);\n }\n}\n\nexport default class StreamManager {\n private context: AudioContext;\n public outputStream: MediaStream;\n public inputStream: MediaStream;\n\n private timer: number;\n private counter: number;\n\n private items: StreamItem[];\n\n private log: ReturnType;\n \n constructor(private interval?: number) {\n this.context = new (window.AudioContext || (window as any).webkitAudioContext)();\n this.items = [];\n this.outputStream = new MediaStream();\n this.counter = 0;\n this.log = logger('SM');\n }\n\n public addStream(stream: MediaStream, type: StreamItem['type']) {\n stream.getTracks().forEach(track => {\n this.addTrack(stream, track, type);\n });\n }\n\n public addTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type']) {\n this.log('addTrack', type, track, stream);\n\n const {context, items, inputStream, outputStream} = this;\n const kind: StreamItem['kind'] = track.kind as any;\n const source = StreamManager.getSource(stream, type);\n \n // this.removeTrack(track);\n switch(type) {\n case 'input': {\n if(!inputStream) {\n this.inputStream = stream;\n } else {\n inputStream.addTrack(track);\n }\n\n break;\n }\n\n case 'output': {\n for(let i = 0; i < items.length; ++i) {\n const {track: t, type, source: itemSource} = items[i];\n if(itemSource === source && type === 'input') {\n items.splice(i, 1);\n outputStream.removeTrack(t);\n break;\n }\n }\n \n if(kind !== 'video') {\n outputStream.addTrack(track);\n }\n \n break;\n }\n }\n\n this.finalizeAddingTrack({\n type,\n source,\n stream,\n track,\n kind,\n streamAnalyser: kind === 'audio' ? new AudioStreamAnalyser(context, stream) : undefined\n });\n\n if(kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n private finalizeAddingTrack(item: StreamItem) {\n const {track} = item;\n track.addEventListener('ended', () => {\n this.removeTrack(track);\n }, {once: true});\n\n this.items.push(item);\n }\n\n public hasInputTrackKind(kind: StreamItem['kind']) {\n return this.items.find(item => item.type === 'input' && item.kind === kind);\n }\n\n public static getSource(stream: MediaStream, type: StreamItem['type']) {\n return type === 'input' ? (stream.source || stream.id) : '' + toTelegramSource(+stream.id.substring(6));\n }\n \n public removeTrack(track: MediaStreamTrack) {\n this.log('removeTrack', track);\n\n const {items} = this;\n \n let handled = false;\n for(let i = 0, length = items.length; !handled && i < length; ++i) {\n const {track: t, type} = items[i];\n switch(type) {\n case 'output': {\n if(t === track) {\n items.splice(i, 1);\n this.outputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n\n case 'input': {\n if(t === track) {\n items.splice(i, 1);\n this.inputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n }\n }\n \n if(track.kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n \n public replaceInputAudio(stream: MediaStream, oldTrack: MediaStreamTrack) {\n this.removeTrack(oldTrack);\n this.addStream(stream, 'input');\n }\n \n private changeTimer() {\n if(this.timer !== undefined) {\n clearInterval(this.timer);\n }\n \n if(this.items.length) {\n this.timer = window.setInterval(this.analyse, this.interval);\n }\n }\n \n public getAmplitude = (item: StreamAudioItem): StreamAmplitude => {\n const {streamAnalyser, stream, track, source, type} = item;\n const analyser = streamAnalyser.analyser;\n if(!analyser) return;\n \n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n const value = getAmplitude(array);\n \n return {\n type,\n source,\n stream,\n track,\n value\n };\n };\n \n public analyse = () => {\n const all = this.counter % 3 === 0;\n const filteredItems = all ? this.items : this.items.filter(x => x.type === 'input');\n const audioItems = filteredItems.filter(x => x.kind === 'audio') as StreamAudioItem[];\n const amplitudes = audioItems.slice(0, GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX).map(this.getAmplitude);\n if(++this.counter >= 1000) {\n this.counter = 0;\n }\n \n rootScope.dispatchEvent('group_call_amplitude', {\n amplitudes,\n type: all ? 'all' : 'input'\n });\n };\n\n /* public appendToConnection(connection: RTCPeerConnection) {\n if(this.inputStream) {\n this.inputStream.getTracks().forEach(track => {\n connection.log('addTrack', track);\n connection.addTrack(track, this.inputStream);\n\n if(track.kind === 'video') {\n track.enabled = true;\n }\n });\n }\n } */\n\n public appendToConference(conference: LocalConferenceDescription) {\n const transceiverInit: RTCRtpTransceiverInit = {direction: 'sendonly', streams: [this.inputStream]};\n const types: ['audio' | 'video', RTCRtpTransceiverInit][] = [\n ['audio' as const, transceiverInit], \n ['video' as const, transceiverInit/* {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} */]\n ];\n\n const tracks = this.inputStream.getTracks();\n for(const [type, transceiverInit] of types) {\n let entry = conference.findEntry(entry => entry.direction === 'sendonly' && entry.type === type);\n if(!entry) {\n entry = conference.createEntry(type);\n entry.createTransceiver(conference.connection, transceiverInit);\n }\n \n const track = tracks.find(track => track.kind === type);\n const sender = entry.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);\n } catch(err) {\n this.log.error(err);\n }\n }\n }\n}\n","export const GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX = 50;\nexport const GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS = 100;\nexport const GROUP_CALL_PARTICIPANTS_LOAD_LIMIT = 100;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport constraintSupported, { MyMediaTrackSupportedConstraints } from \"../../environment/constraintSupport\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { forEachReverse, indexOfAndSplice } from \"../../helpers/array\";\nimport simulateEvent from \"../../helpers/dom/dispatchEvent\";\nimport { safeAssign, safeReplaceObject } from \"../../helpers/object\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport tsNow from \"../../helpers/tsNow\";\nimport { DataJSON, GroupCall, GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup, InputGroupCall, Peer, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates } from \"../../layer\";\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS } from \"../calls/constants\";\nimport GROUP_CALL_STATE from \"../calls/groupCallState\";\nimport LocalConferenceDescription, { ConferenceEntry, generateSsrc } from \"../calls/localConferenceDescription\";\nimport SDP from \"../calls/sdp\";\nimport SDPMediaSection from \"../calls/sdp/mediaSection\";\nimport { WebRTCLineType } from \"../calls/sdpBuilder\";\nimport StreamManager, { StreamItem } from \"../calls/streamManager\";\nimport { Codec, Ssrc, UpdateGroupCallConnectionData } from \"../calls/types\";\nimport { fixLocalOffer, getStream, parseMediaSectionInfo } from \"../calls/utils\";\nimport { Logger, logger } from \"../logger\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type GroupCallId = GroupCall['id'];\nexport type MyGroupCall = GroupCall | InputGroupCall;\n\nexport type ConnectionType = '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 ASSETS_PATH = 'assets/audio/';\n\nconst GET_PARTICIPANTS_LIMIT = 100;\n\nlet IS_MUTED = true;\n\nexport 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\nexport 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\nexport async function getScreenStream() {\n const options: DisplayMediaStreamConstraints = {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n },\n audio: true\n };\n\n const screenStream = await navigator.mediaDevices.getDisplayMedia(options);\n\n return screenStream;\n}\n\nexport function createPeerConnection(log?: Logger) {\n if(!log) {\n log = logger('RTCPeerConnection');\n }\n\n log('constructor');\n\n const options = {\n optional: [\n {googHighStartBitrate: true}, \n {googHighBitrate: true}, \n {googPayloadPadding: true}, \n {googSkipEncodingUnusedStreams: true}, \n {googScreencastMinBitrate: 100}, \n {googVeryHighBitrate: true}, \n {googDscp: true}\n ]\n };\n\n const config: RTCConfiguration = { \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 // @ts-ignore\n const connection = new RTCPeerConnection(config/* , options */);\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\nexport function createDataChannel(connection: RTCPeerConnection, log?: Logger) {\n // return;\n\n if(!log) {\n log = logger('RTCDataChannel');\n }\n\n const channel = connection.createDataChannel('data', {\n /* id: 0,\n negotiated: true */\n });\n\n channel.addEventListener('message', (e) => {\n log('onmessage', e);\n // const {data} = e;\n // this.p2pApplyCallDataChannelData(JSON.parse(data));\n });\n channel.addEventListener('open', () => {\n log('onopen');\n\n /* const { currentCall } = this;\n if (!currentCall) return;\n\n const { callId } = currentCall;\n\n const mediaState = this.p2pGetMediaState(callId, 'input');\n if (!mediaState) return;\n\n this.p2pSendMediaState(callId, mediaState); */\n });\n channel.addEventListener('close', () => {\n log('onclose');\n });\n\n channel.log = log;\n\n return channel;\n}\n\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport class GroupCallInstance {\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 ConnectionType]?: GroupCallConnectionInstance};\n public groupCall: GroupCall;\n public participant: GroupCallParticipant;\n public log: ReturnType;\n \n // will be set with negotiation\n public joined: boolean;\n \n private outputDeviceId: string;\n\n private player: HTMLElement;\n private elements: Map;\n\n private pinnedSources: Array;\n private participantsSsrcs: Map;\n private hadAutoPinnedSources: Set;\n private dispatchPinnedThrottled: () => void;\n private startVideoSharingPromise: Promise;\n startScreenSharingPromise: Promise;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections']\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 const player = this.player = document.createElement('div');\n player.classList.add('group-call-player');\n player.style.display = 'none';\n player.dataset.groupCallId = '' + this.id;\n document.body.append(player);\n\n this.elements = new Map();\n this.pinnedSources = [];\n this.participantsSsrcs = new Map();\n this.hadAutoPinnedSources = new Set();\n this.dispatchPinnedThrottled = throttle(() => {\n rootScope.dispatchEvent('group_call_pinned', {instance: this, source: this.pinnedSource});\n }, 0, false);\n }\n\n get connectionState() {\n return this.connections.main.connection.iceConnectionState;\n }\n\n get state() {\n const {connectionState} = this;\n if(connectionState === 'closed') {\n return GROUP_CALL_STATE.CLOSED;\n } else if(connectionState !== 'connected' && (!IS_SAFARI || connectionState !== 'completed')) {\n return GROUP_CALL_STATE.CONNECTING;\n } else {\n const {participant} = this;\n if(!participant.pFlags.can_self_unmute) {\n return GROUP_CALL_STATE.MUTED_BY_ADMIN;\n } else if(participant.pFlags.muted) {\n return GROUP_CALL_STATE.MUTED;\n } else {\n return GROUP_CALL_STATE.UNMUTED;\n }\n }\n }\n\n get participants() {\n return appGroupCallsManager.getCachedParticipants(this.id);\n }\n\n get isSharingAudio() {\n return !!this.connections.main.streamManager.hasInputTrackKind('audio');\n }\n\n get isSharingScreen() {\n return !!this.connections.presentation;\n }\n\n get isSharingVideo() {\n return !!this.connections.main.streamManager.hasInputTrackKind('video');\n }\n\n get pinnedSource() {\n return this.pinnedSources[this.pinnedSources.length - 1];\n }\n\n public pinSource(source: GroupCallOutputSource) {\n indexOfAndSplice(this.pinnedSources, source);\n this.pinnedSources.push(source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinSource(source: GroupCallOutputSource) {\n this.hadAutoPinnedSources.delete(source);\n indexOfAndSplice(this.pinnedSources, source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinAll() {\n this.pinnedSources.length = 0;\n this.dispatchPinnedThrottled();\n }\n\n public getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : this.participants.get(peerId);\n }\n\n public toggleMuted() {\n return appGroupCallsManager.toggleMuted();\n }\n\n public getElement(endpoint: GroupCallOutputSource) {\n return this.elements.get('' + endpoint);\n }\n\n public getVideoElementFromParticipantByType(participant: GroupCallParticipant, type: 'video' | 'presentation') {\n let source: GroupCallOutputSource;\n if(participant.pFlags.self) {\n const connectionType: ConnectionType = 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 clone.setAttribute('playsinline', 'true');\n clone.muted = true;\n return {video: clone, source};\n }\n\n public createConnectionInstance(options: {\n streamManager: StreamManager,\n type: ConnectionType,\n options: GroupCallConnectionInstance['options'],\n }) {\n return this.connections[options.type] = new GroupCallConnectionInstance({\n groupCall: this,\n log: this.log.bindPrefix(options.type),\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return appGroupCallsManager.editParticipant(this.id, this.participant, {raiseHand: raise});\n }\n\n public async startScreenSharingInternal() {\n try {\n const type: ConnectionType = 'presentation';\n\n const stream = await getScreenStream();\n const streamManager = new StreamManager();\n \n const connectionInstance = this.createConnectionInstance({\n streamManager,\n type,\n options: {\n type\n }\n });\n \n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n stream.getVideoTracks()[0].addEventListener('ended', () => {\n if(this.connections.presentation) { // maybe user has stopped screensharing through browser's ui\n this.stopScreenSharing();\n }\n }, {once: true});\n \n connectionInstance.createDescription();\n connectionInstance.addInputVideoStream(stream);\n } catch(err) {\n this.log.error('start screen sharing error', err);\n }\n }\n\n public startScreenSharing() {\n return this.startScreenSharingPromise || (this.startScreenSharingPromise = this.startScreenSharingInternal().finally(() => {\n this.startScreenSharingPromise = undefined;\n }));\n }\n\n public stopScreenSharing() {\n const connectionInstance = this.connections.presentation;\n if(!connectionInstance) {\n return Promise.resolve();\n }\n\n delete this.connections.presentation;\n this.unpinSource('presentation');\n connectionInstance.closeConnectionAndStream(true);\n\n delete this.participant.presentation;\n appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: appGroupCallsManager.getGroupCallInput(this.id)\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleScreenSharing() {\n if(this.isSharingScreen) {\n return this.stopScreenSharing();\n } else {\n return this.startScreenSharing();\n }\n }\n\n public async startVideoSharingInternal() {\n const constraints: MediaStreamConstraints = {\n video: appGroupCallsManager.getVideoConstraints()\n };\n\n try {\n const stream = await getStream(constraints, false);\n const connectionInstance = this.connections.main;\n connectionInstance.addInputVideoStream(stream);\n\n await appGroupCallsManager.editParticipant(this.id, this.participant, {\n videoPaused: false,\n videoStopped: false\n });\n } catch(err) {\n this.log.error('startVideoSharing error', err, constraints);\n }\n }\n\n public startVideoSharing() {\n return this.startVideoSharingPromise || (this.startVideoSharingPromise = this.startVideoSharingInternal().finally(() => {\n this.startVideoSharingPromise = undefined;\n }));\n }\n\n public async stopVideoSharing() {\n const connectionInstance = this.connections.main;\n const track = connectionInstance.streamManager.inputStream.getVideoTracks()[0];\n if(!track) {\n return;\n }\n\n connectionInstance.stopTrack(track);\n connectionInstance.streamManager.appendToConference(connectionInstance.description); // clear sender track\n\n await appGroupCallsManager.editParticipant(this.id, this.participant, {\n videoStopped: true\n });\n }\n\n public toggleVideoSharing() {\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharing();\n }\n }\n\n public async hangUp(discard = false, rejoin = false, isDiscarded = false) {\n for(const type in this.connections) {\n const connection = this.connections[type as ConnectionType];\n connection.closeConnectionAndStream(!rejoin);\n }\n\n rootScope.dispatchEvent('group_call_state', this);\n\n this.player.textContent = '';\n this.player.remove();\n\n if(isDiscarded) {\n return;\n }\n \n if(!rejoin) {\n let promise: Promise;\n const groupCallInput = appGroupCallsManager.getGroupCallInput(this.id);\n\n if(discard) {\n this.log(`[api] discardGroupCall id=${this.id}`);\n promise = apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(this.joined) {\n this.log(`[api] leaveGroupCall id=${this.id}`);\n const connectionInstance = this.connections.main;\n promise = apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: connectionInstance.sources.audio.source\n });\n } else {\n this.log(`[api] id=${this.id} payload=null`);\n promise = apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n const updates = await promise;\n apiUpdatesManager.processUpdateMessage(updates);\n }\n }\n\n public onTrack(event: RTCTrackEvent) {\n this.tryAddTrack(event.streams[0], event.track, 'output');\n }\n\n public saveInputVideoStream(stream: MediaStream, type: ConnectionType) {\n const track = stream.getVideoTracks()[0];\n this.tryAddTrack(stream, track, 'input', type);\n }\n\n public tryAddTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type'], source: string = StreamManager.getSource(stream, type)) {\n this.log('tryAddTrack', stream, track, type, source);\n\n const isOutput = type === 'output';\n\n const {connections, player, elements} = this;\n const {streamManager, description} = connections.main;\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 }\n // audio.play();\n\n elements.set(elementEndpoint, element);\n }/* else {\n element.srcObject = useStream;\n } */\n\n if(isOutput) {\n const entry = description.getEntryBySource(+source);\n const participant = this.participants.get(entry.peerId);\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n }\n }\n\n public setMuted(muted: boolean) {\n this.connections.main.connection.getSenders().forEach(({track}) => {\n if(track?.kind === 'audio') {\n track.enabled = !muted;\n }\n });\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = appPeersManager.getPeerId(participant.peer);\n const hasLeft = !!participant.pFlags.left;\n const oldSsrcs = this.participantsSsrcs.get(peerId) || [];\n\n if(participant.presentation && !hasLeft) {\n const {source} = appGroupCallsManager.makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint);\n if(!this.hadAutoPinnedSources.has(source)) {\n this.hadAutoPinnedSources.add(source);\n this.pinSource(participant.pFlags.self ? 'presentation' : source);\n }\n }\n\n if(participant.pFlags.self) {\n this.participant = participant;\n\n if(connectionInstance.sources.audio.source !== participant.source) {\n this.hangUp();\n }\n\n let mute = false;\n if(!participant.pFlags.can_self_unmute) {\n this.stopScreenSharing();\n this.stopVideoSharing();\n mute = true;\n } else if(participant.pFlags.muted) {\n mute = true;\n }\n\n if(mute) {\n this.setMuted(true);\n }\n\n if(doNotDispatchParticipantUpdate !== peerId) {\n rootScope.dispatchEvent('group_call_state', this);\n }\n\n return;\n }\n\n const ssrcs = hasLeft ? [] : appGroupCallsManager.makeSsrcsFromParticipant(participant);\n\n if(!hasLeft) {\n this.participantsSsrcs.set(peerId, ssrcs);\n } else {\n this.participantsSsrcs.delete(peerId);\n }\n\n // const TEST_OLD = false;\n\n const modifiedTypes: Set = new Set();\n oldSsrcs.forEach(oldSsrc => {\n const oldSource = oldSsrc.source;\n const newSsrc = ssrcs.find(ssrc => ssrc.source === oldSource);\n if(!newSsrc) {\n this.unpinSource(oldSource);\n\n const oldEntry = description.getEntryBySource(oldSource);\n if(oldEntry && oldEntry.direction !== 'inactive') {\n oldEntry.setDirection('inactive');\n modifiedTypes.add(oldEntry.type);\n }\n }\n });\n\n ssrcs.forEach(ssrc => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n if(entry.direction === 'inactive') {\n entry.setDirection(entry.originalDirection);\n modifiedTypes.add(entry.type);\n }\n\n return;\n }\n\n entry = description.createEntry(ssrc.type);\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n description.setEntryPeerId(entry, peerId);\n\n // if(TEST_OLD) {\n // description.bundleMids.push(entry.mid);\n // entry.setDirection('recvonly');\n // } else {\n ssrc.type === 'video' && entry.setEndpoint(ssrc.endpoint);\n entry.createTransceiver(connection, {direction: 'recvonly'});\n // }\n\n modifiedTypes.add(entry.type);\n });\n\n /* if(TEST_OLD) {\n this.setRemoteOffer({\n connection,\n description,\n ssrcs\n });\n } else */if(modifiedTypes.size) {\n if(modifiedTypes.has('video')) {\n connectionInstance.updateConstraints = true;\n }\n\n connectionInstance.negotiateThrottled();\n }\n }\n}\n\nexport class GroupCallConnectionInstance {\n private groupCall: GroupCallInstance;\n public connection: RTCPeerConnection;\n public streamManager: StreamManager;\n private dataChannel: RTCDataChannel;\n public description: LocalConferenceDescription;\n public sources?: {\n audio: Ssrc,\n video?: Ssrc,\n };\n private negotiating?: boolean;\n public updateConstraints?: boolean;\n private type: ConnectionType;\n private log: ReturnType;\n private options: {\n type: Extract, \n isMuted?: boolean, \n joinVideo?: boolean, \n rejoin?: boolean\n } | {\n type: Extract,\n };\n\n private updateConstraintsInterval: number;\n public negotiateThrottled: () => void;\n\n constructor(options: {\n groupCall: GroupCallConnectionInstance['groupCall'],\n streamManager: GroupCallConnectionInstance['streamManager'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n connection?: GroupCallConnectionInstance['connection'],\n log?: GroupCallConnectionInstance['log']\n }) {\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = this.connection?.log || logger('GC-CONNECTION');\n }\n\n this.sources = {} as any;\n\n this.negotiateThrottled = throttle(this.negotiate.bind(this), 0, false);\n }\n\n public createPeerConnection() {\n return this.connection || (this.connection = createPeerConnection(this.log.bindPrefix('connection')).connection);\n }\n\n public createDataChannel() {\n if(this.dataChannel) {\n return this.dataChannel;\n }\n\n const dataChannel = createDataChannel(this.connection, this.log.bindPrefix('data'));\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 this.dataChannel = dataChannel;\n }\n\n public createDescription() {\n if(this.description) {\n return this.description;\n }\n\n const description = this.description = new LocalConferenceDescription(this.connection);\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 this.streamManager.appendToConference(this.description);/* .then(() => {\n currentGroupCall.connections.main.negotiating = false;\n this.startNegotiation({\n type: type,\n isMuted: muted,\n rejoin\n });\n }); */\n }\n\n private async invokeJoinGroupCall(localSdp: SDP, mainChannels: SDPMediaSection[], options: GroupCallConnectionInstance['options']) {\n const {groupCall, description} = this;\n const groupCallId = groupCall.id;\n\n const processedChannels = mainChannels.map(section => {\n const processed = processMediaSection(localSdp, section);\n\n this.sources[processed.entry.type as 'video' | 'audio'] = processed.entry;\n \n return processed;\n });\n\n let promise: Promise;\n const audioChannel = processedChannels.find(channel => channel.media.mediaType === 'audio');\n const videoChannel = processedChannels.find(channel => channel.media.mediaType === 'video');\n let {source, params} = audioChannel || {};\n const useChannel = videoChannel || audioChannel;\n\n const channels: {[type in WebRTCLineType]?: typeof audioChannel} = {\n audio: audioChannel,\n video: videoChannel\n };\n\n description.entries.forEach(entry => {\n if(entry.direction === 'sendonly') {\n const channel = channels[entry.type];\n if(!channel) return;\n\n description.setEntrySource(entry, channel.sourceGroups || channel.source);\n description.setEntryPeerId(entry, rootScope.myId);\n }\n });\n\n // overwrite ssrc with audio in video params\n if(params !== useChannel.params) {\n const data: JoinGroupCallJsonPayload = JSON.parse(useChannel.params.data);\n // data.ssrc = source || data.ssrc - 1; // audio channel can be missed in screensharing\n if(source) data.ssrc = source;\n else delete data.ssrc;\n params = {\n _: 'dataJSON',\n data: JSON.stringify(data)\n };\n }\n \n const groupCallInput = appGroupCallsManager.getGroupCallInput(groupCallId);\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = apiManager.invokeApi('phone.joinGroupCall', request);\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\n } else {\n const request: PhoneJoinGroupCallPresentation = {\n call: groupCallInput,\n params,\n };\n\n promise = apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n apiUpdatesManager.processUpdateMessage(updates);\n const update = (updates as Updates.updates).updates.find(update => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n\n const data: UpdateGroupCallConnectionData = JSON.parse(update.params.data);\n\n data.audio = data.audio || groupCall.connections.main.description.audio;\n description.setData(data);\n filterServerCodecs(mainChannels, data);\n\n return data;\n }\n\n public async negotiate() {\n const {groupCall, connection, description} = this;\n const {id: groupCallId} = groupCall;\n\n if(this.negotiating) {\n return;\n }\n\n this.negotiating = true;\n\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 this.negotiating = false;\n\n if(this.updateConstraints) {\n this.maybeUpdateRemoteVideoConstraints();\n this.updateConstraints = false;\n }\n\n log('end', groupCallId);\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.dataChannel.send(JSON.stringify(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 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 stopTrack(track: MediaStreamTrack) {\n track.stop();\n simulateEvent(track, 'ended');\n }\n\n public stopStreamManager() {\n const {streamManager} = this;\n if(!streamManager) {\n return;\n }\n\n try {\n const tracks = streamManager.inputStream.getTracks().concat(streamManager.outputStream.getTracks());\n tracks.forEach(track => {\n this.stopTrack(track);\n });\n } catch(e) {\n this.log.error(e);\n }\n }\n\n public closeConnectionAndStream(stopStream: boolean) {\n this.closeConnection();\n stopStream && this.stopStreamManager();\n }\n}\n\nexport class AppGroupCallsManager {\n private log: ReturnType;\n \n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n \n private audio: HTMLAudioElement;\n \n private currentGroupCall: GroupCallInstance;\n private connectionAudio: HTMLAudioElement;\n private doNotDispatchParticipantUpdate: PeerId;\n\n constructor() {\n this.log = logger('GROUP-CALLS');\n \n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n \n rootScope.addMultipleEventsListeners({\n updateGroupCall: (update) => {\n this.saveGroupCall(update.call, update.chat_id);\n },\n \n updateGroupCallParticipants: (update) => {\n this.saveGroupCall(update.call);\n \n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\n\n const groupCallId = update.call.id;\n this.saveApiParticipants(groupCallId, update.participants);\n }\n });\n\n rootScope.addEventListener('group_call_state', (instance) => {\n if(this.currentGroupCall?.id === instance.id && instance.state === GROUP_CALL_STATE.CLOSED) {\n this.setCurrentGroupCall(null);\n this.stopConnectingSound(null);\n this.playSound('group_call_end.mp3');\n rootScope.dispatchEvent('chat_update', instance.chatId);\n }\n });\n\n rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCall.id) {\n currentGroupCall.hangUp(false, false, true);\n }\n\n this.participants.delete(groupCall.id);\n }\n });\n }\n\n get groupCall() {\n return this.currentGroupCall;\n }\n\n public getCachedParticipants(groupCallId: GroupCallId) {\n let participants = this.participants.get(groupCallId);\n if(!participants) {\n this.participants.set(groupCallId, participants = new Map());\n }\n\n return participants;\n }\n\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\n const nextOffsetsMap = this.nextOffsets;\n\n const setNextOffset = (newNextOffset: string) => {\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\n nextOffsetsMap.set(groupCallId, newNextOffset);\n }\n };\n\n const nextOffset = nextOffsetsMap.get(groupCallId);\n return {\n nextOffset,\n setNextOffset\n };\n }\n\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\n const {currentGroupCall} = this;\n const participants = this.getCachedParticipants(groupCallId);\n\n const peerId = appPeersManager.getPeerId(participant.peer);\n\n const oldParticipant = participants.get(peerId);\n const hasLeft = participant.pFlags.left;\n if(!oldParticipant && hasLeft) {\n return;\n }\n\n // * fix missing flag\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\n participant.pFlags.can_self_unmute = true;\n }\n\n const isCurrentGroupCall = currentGroupCall?.id === groupCallId;\n\n if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\n }\n\n if(isCurrentGroupCall) {\n currentGroupCall.onParticipantUpdate(participant, this.doNotDispatchParticipantUpdate);\n }\n\n // if(!skipCounterUpdating) {\n const groupCall = this.getGroupCall(groupCallId);\n if(groupCall?._ === 'groupCall') {\n let modified = false;\n if(hasLeft) {\n --groupCall.participants_count;\n modified = true;\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\n ++groupCall.participants_count;\n modified = true;\n }\n \n if(modified) {\n rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n \n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant && this.doNotDispatchParticipantUpdate !== peerId) {\n rootScope.dispatchEvent('group_call_participant', {\n groupCallId,\n participant\n });\n }\n }\n\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\n if((apiParticipants as any).saved) return;\n (apiParticipants as any).saved = true;\n apiParticipants.forEach(p => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\n }\n\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n if(!Object.keys(options).length) {\n return;\n }\n\n let processUpdate = true;\n if(participant) {\n const {currentGroupCall} = this;\n const isCurrentCall = currentGroupCall?.id === groupCallId;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !currentGroupCall.isSharingAudio) {\n delete options.muted;\n\n if(!Object.keys(options).length) {\n return;\n }\n }\n }\n\n // if(isCurrentCall) {\n const muted = options.muted;\n if(muted !== undefined) {\n /* const isAdmin = appChatsManager.hasRights(currentGroupCall.chatId, 'manage_call');\n if(isAdmin) {\n if(muted) {\n participant.pFlags.muted = true;\n delete participant.pFlags.can_self_unmute;\n } else {\n participant.pFlags.can_self_unmute = true;\n }\n } else */if(participant.pFlags.self) {\n if(muted) {\n participant.pFlags.muted = true;\n } else if(participant.pFlags.can_self_unmute) {\n delete participant.pFlags.muted;\n }\n }/* else {\n if(muted) {\n participant.pFlags.muted_by_you = true;\n } else {\n delete participant.pFlags.muted_by_you;\n }\n } */\n }\n // }\n\n /* const a: [keyof GroupCallParticipant['pFlags'], keyof typeof options][] = [\n ['muted', 'muted']\n ];\n\n a.forEach(([key, optionKey]) => {\n const value = options[optionKey];\n if(value === undefined) {\n return;\n }\n\n if(value) {\n participant.pFlags[key] = true;\n } else {\n delete participant.pFlags[key];\n }\n }); */\n\n if(options.raiseHand !== undefined) {\n if(options.raiseHand) participant.raise_hand_rating = '1';\n else delete participant.raise_hand_rating;\n }\n\n if(isUpdatingMeInCurrentCall) {\n if(options.videoStopped !== undefined) {\n if(options.videoStopped) delete participant.video;\n else participant.video = this.generateSelfVideo(currentGroupCall.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n currentGroupCall.setMuted(false);\n }\n\n rootScope.dispatchEvent('group_call_state', currentGroupCall);\n }\n\n rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : appPeersManager.getPeerId(participant.peer);\n const updates = await apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: appGroupCallsManager.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? appPeersManager.getInputPeerSelf() : appPeersManager.getInputPeerById(peerId),\n muted: options.muted,\n volume: options.volume,\n raise_hand: options.raiseHand,\n video_paused: options.videoPaused,\n video_stopped: options.videoStopped,\n presentation_paused: options.presentationPaused\n });\n \n // do not replace with peerId because it can be null\n if(!processUpdate) this.doNotDispatchParticipantUpdate = appPeersManager.getPeerId(participant.peer);\n apiUpdatesManager.processUpdateMessage(updates);\n if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\n }\n \n public getGroupCall(id: GroupCallId) {\n return this.groupCalls.get(id);\n }\n\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise {\n const call = this.getGroupCall(id);\n if(call && call._ !== 'inputGroupCall' && !override) {\n return call;\n }\n\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\n return apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupCall',\n params: {\n call: this.getGroupCallInput(id),\n limit\n },\n processResult: (groupCall) => {\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\n appUsersManager.saveApiUsers(groupCall.users);\n appChatsManager.saveApiChats(groupCall.chats);\n this.saveApiParticipants(id, groupCall.participants, true);\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\n\n if(limit && this.nextOffsets.get(id) === undefined) {\n this.nextOffsets.set(id, groupCall.participants_next_offset);\n }\n\n return call;\n }\n });\n }\n \n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\n const oldCall = this.groupCalls.get(call.id);\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\n if(oldCall) {\n if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n }\n \n call = oldCall;\n } else {\n this.groupCalls.set(call.id, call);\n }\n\n if(shouldUpdate) {\n rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n \n public playSound(sound: string) {\n try {\n const audio = this.audio || (this.audio = new Audio());\n audio.src = ASSETS_PATH + sound;\n audio.play();\n } catch(e) {\n this.log.error('playSound', sound, e);\n }\n }\n \n public startConnectingSound(connection: RTCPeerConnection) {\n this.stopConnectingSound(null);\n \n setTimeout(() => {\n const {currentGroupCall} = this;\n if(currentGroupCall && \n currentGroupCall.connections.main.connection === connection && \n (connection.iceConnectionState === 'checking' || connection.iceConnectionState === 'new') &&\n this.connectionAudio?.connection !== connection) {\n const audio = new Audio(ASSETS_PATH + 'group_call_connect.mp3');\n audio.loop = true;\n audio.connection = connection;\n \n this.connectionAudio = audio;\n \n audio.play();\n }\n }, 2500);\n }\n \n public stopConnectingSound(connection: RTCPeerConnection) {\n const {connectionAudio} = this;\n if(connectionAudio?.connection !== connection) return;\n \n this.connectionAudio = null;\n connectionAudio.pause();\n }\n\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\n this.currentGroupCall = groupCall;\n /* TdLibController.clientUpdate({\n '@type': 'clientUpdateGroupCall',\n call\n }); */\n }\n\n public 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 public 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\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await apiManager.invokeApi('phone.createGroupCall', {\n peer: appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find(update => update._ === 'updateGroupCall') as Update.updateGroupCall;\n return update.call;\n }\n \n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\n if(!this.audio) {\n this.audio = new Audio();\n this.audio.play();\n }\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 const constraints: MediaStreamConstraints = {\n audio: this.getAudioConstraints(),\n video: joinVideo && this.getVideoConstraints()\n };\n\n 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 this.log.error('joinGroupCall getStream error', err, constraints);\n streamManager.inputStream = new MediaStream();\n }\n }\n\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo);\n }\n\n public async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\n const log = this.log.bindPrefix('joinGroupCallInternal');\n log('start', groupCallId);\n\n const type: ConnectionType = 'main';\n\n let {currentGroupCall} = this;\n if(currentGroupCall && rejoin) {\n // currentGroupCall.connections.main.connection = connection;\n currentGroupCall.handleUpdateGroupCallParticipants = false;\n currentGroupCall.updatingSdp = false;\n log('update currentGroupCall', groupCallId, currentGroupCall);\n } else {\n currentGroupCall = new GroupCallInstance({\n chatId,\n id: groupCallId\n });\n\n currentGroupCall.groupCall = await this.getGroupCallFull(groupCallId);\n\n const connectionInstance = currentGroupCall.createConnectionInstance({\n streamManager,\n type,\n options: {\n type,\n isMuted: muted,\n joinVideo,\n rejoin\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n if(!rejoin) {\n this.startConnectingSound(connection);\n }\n \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 rootScope.dispatchEvent('group_call_state', currentGroupCall);\n \n const {iceConnectionState} = connection;\n if(iceConnectionState !== 'connected' && iceConnectionState !== 'closed') {\n this.stopConnectingSound(connection);\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 const {currentGroupCall} = this;\n if(currentGroupCall && currentGroupCall.connections.main.connection === connection && !currentGroupCall.joined) {\n currentGroupCall.joined = true;\n this.playSound('group_call_start.mp3');\n \n this.getGroupCallParticipants(groupCallId).then(({participants}) => {\n this.saveApiParticipants(groupCallId, [...participants.values()]);\n });\n }\n \n break;\n }\n \n case 'disconnected': {\n break;\n }\n \n case 'failed': {\n //TODO: replace with ICE restart\n currentGroupCall.hangUp();\n // connection.restartIce();\n break;\n }\n \n case 'new': {\n break;\n }\n }\n });\n\n connectionInstance.createDescription();\n connectionInstance.createDataChannel();\n\n connectionInstance.appendStreamToConference();\n\n this.setCurrentGroupCall(currentGroupCall);\n log('set currentGroupCall', groupCallId, currentGroupCall);\n\n return connectionInstance.negotiate();\n }\n }\n \n public getGroupCallInput(id: GroupCallId): InputGroupCall {\n const groupCall = this.getGroupCall(id);\n return {\n _: 'inputGroupCall',\n id: groupCall.id,\n access_hash: groupCall.access_hash\n };\n }\n\n public generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\n return source && {\n _: 'groupCallParticipantVideo',\n pFlags: {},\n endpoint: '',\n source_groups: source.sourceGroups,\n audio_source: audioSource\n };\n }\n \n public generateSelfParticipant(): GroupCallParticipant {\n const mainSources = this.currentGroupCall.connections.main.sources;\n const presentationSources = this.currentGroupCall.connections.presentation?.sources;\n return {\n _: 'groupCallParticipant',\n pFlags: {\n can_self_unmute: true,\n self: true\n },\n source: mainSources.audio.source,\n video: this.generateSelfVideo(mainSources.video),\n presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\n date: tsNow(true),\n peer: appPeersManager.getOutputPeer(rootScope.myId)\n };\n }\n\n public makeSsrcsFromParticipant = (participant: GroupCallParticipant) => {\n return [\n this.makeSsrcFromParticipant(participant, 'audio', participant.source),\n participant.video?.audio_source && this.makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\n participant.video && this.makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\n participant.presentation?.audio_source && this.makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\n participant.presentation && this.makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\n ].filter(Boolean);\n };\n\n public makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n return generateSsrc(type, source, endpoint);\n }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupParticipants', \n params: {\n call: this.getGroupCallInput(id),\n ids: [],\n sources: [],\n offset: nextOffset || '',\n limit: GET_PARTICIPANTS_LIMIT\n },\n processResult: (groupCallParticipants) => {\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\n \n appChatsManager.saveApiChats(groupCallParticipants.chats);\n appUsersManager.saveApiUsers(groupCallParticipants.users);\n this.saveApiParticipants(id, groupCallParticipants.participants);\n \n setNextOffset(newNextOffset);\n }\n });\n }\n\n return {\n participants: this.getCachedParticipants(id),\n isEnd: this.nextOffsets.get(id) === ''\n };\n }\n\n public async hangUp(groupCallId: GroupCallId, discard = false, rejoin = false) {\n this.log(`hangUp start id=${groupCallId} discard=${discard} rejoin=${rejoin}`);\n const {currentGroupCall} = this;\n if(currentGroupCall?.id !== groupCallId) return;\n\n currentGroupCall.hangUp(discard, rejoin);\n }\n\n public toggleMuted(muted?: boolean) {\n return this.changeUserMuted(NULL_PEER_ID, muted);\n }\n \n public changeUserMuted(peerId: PeerId, muted?: boolean) {\n const {currentGroupCall} = this;\n if(!currentGroupCall) return;\n\n const participant = currentGroupCall.getParticipantByPeerId(peerId);\n if(NULL_PEER_ID === peerId && participant.pFlags.can_self_unmute) {\n muted = muted === undefined ? !participant.pFlags.muted : muted;\n }\n\n return this.editParticipant(currentGroupCall.id, participant, {muted});\n }\n\n // private attachScreenStream(screenStream: MediaStream, connection: RTCPeerConnection) {\n // let replaced = false;\n // /* connection.getSenders().forEach(x => {\n // if (x.track.kind === 'video') {\n // x.replaceTrack(screenStream.getVideoTracks()[0]);\n // replaced = true;\n // }\n // }); */\n // if(!replaced) {\n // screenStream.getTracks().forEach(track => {\n // connection.addTrack(track, screenStream);\n // });\n // }\n\n // /* const inputMediaState = this.p2pGetMediaState(id, 'input');\n // if (inputMediaState && inputMediaState.videoState !== 'active') {\n // this.p2pVideoEnabled(true);\n // } */\n // }\n\n /* public async stopScreenSharing() {\n const { currentCall } = this;\n if (!currentCall) return;\n\n const { connection, inputStream, screenStream } = currentCall;\n if (!connection) return;\n if (!screenStream) return;\n\n const videoTracks = inputStream.getVideoTracks();\n const videoTrack = videoTracks.length > 0 ? videoTracks[0] : null\n\n connection.getSenders().forEach(x => {\n if (x.track.kind === 'video') {\n x.replaceTrack(videoTrack);\n }\n })\n\n screenStream.getTracks().forEach(x => {\n x.stop();\n });\n\n const inputVideo = document.getElementById('call-input-video');\n if (inputVideo) {\n inputVideo.srcObject = inputStream;\n }\n\n currentCall.screenStream = null;\n\n if (!videoTrack || videoTrack.readyState !== 'live') {\n this.p2pVideoEnabled(false);\n }\n } */\n}\n\nconst appGroupCallsManager = new AppGroupCallsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appGroupCallsManager = appGroupCallsManager);\nexport default appGroupCallsManager;\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { logger, LogTypes } from \"./logger\";\r\n\r\ntype Result = {\r\n bytes: Uint8Array, \r\n waveform?: Uint8Array\r\n};\r\n\r\ntype Task = {\r\n pages: Uint8Array,\r\n withWaveform: boolean,\r\n waveform?: Uint8Array,\r\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\r\n timeout: number\r\n};\r\n\r\nexport class OpusDecodeController {\r\n private worker: Worker;\r\n private wavWorker : Worker;\r\n private sampleRate = 48000;\r\n private tasks: Array = [];\r\n private keepAlive = false;\r\n private isPlaySupportedResult: boolean;\r\n private log = logger('OPUS', LogTypes.Error);\r\n\r\n public isPlaySupported() {\r\n if(this.isPlaySupportedResult !== undefined) return this.isPlaySupportedResult;\r\n\r\n const audio = document.createElement('audio');\r\n return this.isPlaySupportedResult = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\r\n }\r\n\r\n public loadWavWorker() {\r\n if(this.wavWorker) return;\r\n\r\n this.wavWorker = new Worker('waveWorker.min.js');\r\n this.wavWorker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n\r\n this.log('[WAV] got message:', data);\r\n if(data && data.page) {\r\n const bytes = data.page;\r\n this.onTaskEnd(this.tasks.shift(), bytes);\r\n }\r\n });\r\n }\r\n\r\n public loadWorker() {\r\n if(this.worker) return;\r\n\r\n this.worker = new Worker('decoderWorker.min.js');\r\n this.worker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n \r\n this.log('[DECODER] got message', data);\r\n if(data.type === 'done') {\r\n //this.log('[DECODER] send done to wav');\r\n this.wavWorker.postMessage({command: 'done'});\r\n\r\n if(data.waveform) {\r\n this.tasks[0].waveform = data.waveform;\r\n }\r\n } else { // e.data contains decoded buffers as float32 values\r\n //this.log('[DECODER] send encode to wav');\r\n this.wavWorker.postMessage({\r\n command: 'encode',\r\n buffers: e.data\r\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\r\n }\r\n });\r\n }\r\n\r\n public setKeepAlive(keepAlive: boolean) {\r\n this.keepAlive = keepAlive;\r\n if(this.keepAlive) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n } else if(!this.tasks.length) {\r\n this.terminateWorkers();\r\n }\r\n }\r\n\r\n public onTaskEnd(task: Task, result?: Uint8Array) {\r\n if(!result) {\r\n task.callback.reject('timeout');\r\n } else {\r\n clearTimeout(task.timeout);\r\n task.callback.resolve({bytes: result, waveform: task.waveform});\r\n }\r\n\r\n if(this.tasks.length) {\r\n this.executeNewTask(this.tasks[0]);\r\n }\r\n\r\n this.terminateWorkers();\r\n }\r\n\r\n public terminateWorkers(kill = false) {\r\n if((this.keepAlive || this.tasks.length) && !kill) return;\r\n\r\n if(this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n }\r\n \r\n if(this.wavWorker) {\r\n this.wavWorker.terminate();\r\n this.wavWorker = null;\r\n }\r\n }\r\n\r\n public executeNewTask(task: Task) {\r\n this.worker.postMessage({ \r\n command: 'init',\r\n decoderSampleRate: this.sampleRate,\r\n outputBufferSampleRate: this.sampleRate\r\n });\r\n\r\n this.wavWorker.postMessage({ \r\n command: 'init',\r\n wavBitDepth: 16,\r\n wavSampleRate: this.sampleRate\r\n });\r\n\r\n //console.log('sending command to worker:', task);\r\n //setTimeout(() => {\r\n this.log('[DECODER] send decode');\r\n this.worker.postMessage({\r\n command: 'decode',\r\n pages: task.pages,\r\n waveform: task.withWaveform\r\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\r\n //}, 1e3);\r\n\r\n task.timeout = window.setTimeout(() => {\r\n this.log.error('decode timeout'/* , task */);\r\n\r\n this.terminateWorkers(true);\r\n if(this.tasks.length) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n }\r\n\r\n this.onTaskEnd(this.tasks.shift());\r\n }, 10e3);\r\n }\r\n\r\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\r\n return new Promise((resolve, reject) => {\r\n const task = {\r\n pages,\r\n withWaveform,\r\n callback: {resolve, reject},\r\n timeout: 0\r\n };\r\n\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n\r\n if(this.tasks.push(task) === 1) {\r\n this.executeNewTask(task);\r\n }\r\n });\r\n }\r\n\r\n public async decode(typedArray: Uint8Array, withWaveform = false) {\r\n return this.pushDecodeTask(typedArray, withWaveform).then(result => {\r\n const dataBlob = new Blob([result.bytes], {type: \"audio/wav\"});\r\n return {url: URL.createObjectURL(dataBlob), waveform: result.waveform};\r\n });\r\n }\r\n}\r\n\r\nconst opusDecodeController = new OpusDecodeController();\r\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\r\nexport default opusDecodeController;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport appPhotosManager from \"./appPhotosManager\";\r\nimport appDocsManager from \"./appDocsManager\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\r\nimport rootScope from \"../rootScope\";\r\nimport { safeReplaceObject } from \"../../helpers/object\";\r\nimport { limitSymbols } from \"../../helpers/string\";\r\nimport { WebPage } from \"../../layer\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\r\n\r\ntype WebPageMessageKey = `${PeerId}_${number}`;\r\n\r\nexport class AppWebPagesManager {\r\n private webpages: {\r\n [webPageId: string]: WebPage\r\n } = {};\r\n private pendingWebPages: {\r\n [webPageId: string]: Set\r\n } = {};\r\n \r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateWebPage: (update) => {\r\n this.saveWebPage(update.webpage);\r\n }\r\n });\r\n }\r\n \r\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\r\n if(apiWebPage._ === 'webPageNotModified') return;\r\n const {id} = apiWebPage;\r\n\r\n const oldWebPage = this.webpages[id];\r\n const isUpdated = oldWebPage && \r\n oldWebPage._ === apiWebPage._ && \r\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\r\n\r\n if(apiWebPage._ === 'webPage') {\r\n if(apiWebPage.photo?._ === 'photo') {\r\n apiWebPage.photo = appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\r\n } else {\r\n delete apiWebPage.photo;\r\n }\r\n \r\n if(apiWebPage.document?._ === 'document') {\r\n apiWebPage.document = appDocsManager.saveDoc(apiWebPage.document, mediaContext);\r\n } else {\r\n if(apiWebPage.type === 'document') {\r\n delete apiWebPage.type;\r\n }\r\n \r\n delete apiWebPage.document;\r\n }\r\n\r\n const siteName = apiWebPage.site_name;\r\n let shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\r\n if(siteName && shortTitle === siteName) {\r\n delete apiWebPage.site_name;\r\n }\r\n\r\n shortTitle = limitSymbols(shortTitle, 80, 100);\r\n\r\n apiWebPage.rTitle = RichTextProcessor.wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\r\n let contextHashtag = '';\r\n if(siteName === 'GitHub') {\r\n const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\r\n if(matches) {\r\n contextHashtag = matches[0] + '/issues/{1}';\r\n }\r\n }\r\n\r\n // delete apiWebPage.description\r\n const shortDescriptionText = limitSymbols(apiWebPage.description || '', 150, 180);\r\n apiWebPage.rDescription = RichTextProcessor.wrapRichText(shortDescriptionText, {\r\n contextSite: siteName || 'external',\r\n contextHashtag: contextHashtag\r\n });\r\n\r\n if(!photoTypeSet.has(apiWebPage.type) &&\r\n !apiWebPage.description &&\r\n apiWebPage.photo) {\r\n apiWebPage.type = 'photo';\r\n }\r\n }\r\n \r\n let pendingSet = this.pendingWebPages[id];\r\n if(messageKey) {\r\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\r\n pendingSet.add(messageKey);\r\n }\r\n \r\n if(oldWebPage === undefined) {\r\n this.webpages[id] = apiWebPage;\r\n } else {\r\n safeReplaceObject(oldWebPage, apiWebPage);\r\n }\r\n \r\n if(!messageKey && pendingSet !== undefined && isUpdated) {\r\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\r\n pendingSet.forEach((value) => {\r\n const [peerId, mid, isScheduled] = value.split('_');\r\n msgs.push({\r\n peerId: peerId.toPeerId(), \r\n mid: +mid, \r\n isScheduled: !!isScheduled\r\n });\r\n });\r\n\r\n rootScope.dispatchEvent('webpage_updated', {\r\n id,\r\n msgs\r\n });\r\n }\r\n\r\n return apiWebPage;\r\n }\r\n\r\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\r\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\r\n }\r\n\r\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\r\n const id = (webPage as WebPage.webPage).id;\r\n if(!id) return;\r\n\r\n const set = this.pendingWebPages[id];\r\n if(set && set.has(messageKey)) {\r\n set.delete(messageKey);\r\n\r\n if(!set.size) {\r\n delete this.pendingWebPages[id];\r\n }\r\n }\r\n }\r\n\r\n public getWebPage(id: WebPage.webPage['id']) {\r\n return this.webpages[id];\r\n }\r\n}\r\n\r\nconst appWebPagesManager = new AppWebPagesManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appWebPagesManager = appWebPagesManager);\r\nexport default appWebPagesManager;\r\n","import IS_WEBP_SUPPORTED from \"./webpSupport\";\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","'use strict'\n//@flow\n\n/** * * * * * * * * * *\n * Big Integer Library *\n * Created 2000 *\n * Leemon Baird *\n * www.leemon.com *\n * * * * * * * * * * * */\n\n////////////////////////////////////////////////////////////////////////////////////////\n// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.\n// For most functions, if it needs a BigInt as a local variable it will actually use\n// a global, and will only allocate to it only when it's not the right size. This ensures\n// that when a function is called repeatedly with same-sized parameters, it only allocates\n// memory on the first call.\n//\n// Note that for cryptographic purposes, the calls to Math.random() must\n// be replaced with calls to a better pseudorandom number generator.\n//\n// In the following, \"bigInt\" means a bigInt with at least one leading zero element,\n// and \"integer\" means a nonnegative integer less than radix. In some cases, integer\n// can be negative. Negative bigInts are 2s complement.\n//\n// The following functions do not modify their inputs.\n// Those returning a bigInt, string, or Array will dynamically allocate memory for that value.\n// Those returning a boolean will return the integer 0 (false) or 1 (true).\n// Those returning boolean or int will not allocate memory except possibly on the first\n// time they're called with a given parameter size.\n//\n// bigInt add(x,y) //return (x+y) for bigInts x and y.\n// bigInt addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.\n// string bigInt2str(x,base) //return a string form of bigInt x in a given base, with 2 <= base <= 95\n// int bitSize(x) //return how many bits long the bigInt x is, not counting leading zeros\n// bigInt dup(x) //return a copy of bigInt x\n// boolean equals(x,y) //is the bigInt x equal to the bigint y?\n// boolean equalsInt(x,y) //is bigint x equal to integer y?\n// bigInt expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed\n// Array findPrimes(n) //return array of all primes less than integer n\n// bigInt GCD(x,y) //return greatest common divisor of bigInts x and y (each with same number of elements).\n// boolean greater(x,y) //is x>y? (x and y are nonnegative bigInts)\n// boolean greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?\n// bigInt int2bigInt(t,n,m) //return a bigInt equal to integer t, with at least n bits and m array elements\n// bigInt inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null\n// int inverseModInt(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse\n// boolean isZero(x) //is the bigInt x equal to zero?\n// boolean millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is bigInt, 1=1). If s=1, then the most significant of those n bits is set to 1.\n// bigInt randTruePrime(k) //return a new, random, k-bit, true prime bigInt using Maurer's algorithm.\n// bigInt randProbPrime(k) //return a new, random, k-bit, probable prime bigInt (probability it's composite less than 2^-80).\n// bigInt str2bigInt(s,b,n,m) //return a bigInt for number represented in string s in base b with at least n bits and m array elements\n// bigInt sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement\n// bigInt trim(x,k) //return a copy of x with exactly k leading zero elements\n//\n//\n// The following functions each have a non-underscored version, which most users should call instead.\n// These functions each write to a single parameter, and the caller is responsible for ensuring the array\n// passed in is large enough to hold the result.\n//\n// void addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer\n// void add_(x,y) //do x=x+y for bigInts x and y\n// void copy_(x,y) //do x=y on bigInts x and y\n// void copyInt_(x,n) //do x=n on bigInt x and integer n\n// void GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). (This never overflows its array).\n// boolean inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist\n// void mod_(x,n) //do x=x mod n for bigInts x and n. (This never overflows its array).\n// void mult_(x,y) //do x=x*y for bigInts x and y.\n// void multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.\n// void powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.\n// void randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.\n// void randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.\n// void sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.\n//\n// The following functions do NOT have a non-underscored version.\n// They each write a bigInt result to one or more parameters. The caller is responsible for\n// ensuring the arrays passed in are large enough to hold the results.\n//\n// void addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))\n// void carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.\n// void divide_(x,y,q,r) //divide x by y giving quotient q and remainder r\n// int divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder. (This never overflows its array).\n// void eGCD_(x,y,d,a,b) //sets a,b,d to positive bigInts such that d = GCD_(x,y) = a*x-b*y\n// void halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement. (This never overflows its array).\n// void leftShift_(x,n) //left shift bigInt x by n bits. n64 multiplier, but not with JavaScript's 32*32->32)\n// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square\n// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that\n// method would be slower. This is unfortunate because the code currently spends almost all of its time\n// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring\n// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded\n// sentences that seem to imply it's faster to do a non-modular square followed by a single\n// Montgomery reduction, but that's obviously wrong.\n////////////////////////////////////////////////////////////////////////////////////////\n\nexport type Bool = 1 | 0\n\n//globals\nexport var bpe = 0 //bits stored per array element\nvar mask = 0 //AND this with an array element to chop it down to bpe bits\nvar radix = mask + 1 //equals 2^bpe. A single 1 bit to the left of the last bit of mask.\n\n//the digits for converting to different bases\nvar digitsStr =\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\\\\'\"+-'\n\n//initialize the global variables\n\n//bpe=number of bits in the mantissa on this platform\nfor (bpe = 0; 1 << (bpe + 1) > 1 << bpe; bpe++);\nbpe >>= 1 //bpe=number of bits in one element of the array representing the bigInt\nmask = (1 << bpe) - 1 //AND the mask with an integer to get its bpe least significant bits\nradix = mask + 1 //2^bpe. a single 1 bit to the left of the first bit of mask\nexport var one = int2bigInt(1, 1, 1) //constant used in powMod_()\nexport var zero = int2bigInt(0, 1, 1)\n\n//the following global variables are scratchpad memory to\n//reduce dynamic memory allocation in the inner loop\nvar t: number[] | number = new Array(0)\nvar ss = t //used in mult_()\nvar s0 = t //used in multMod_(), squareMod_()\n// var s1=t; //used in powMod_(), multMod_(), squareMod_()\n// var s2=t; //used in powMod_(), multMod_()\nvar s3 = t //used in powMod_()\nvar s4 = t,\n s5 = t //used in mod_()\nvar s6 = t //used in bigInt2str()\nvar s7 = t //used in powMod_()\nvar T = t //used in GCD_()\nvar sa = t //used in mont_()\nvar mr_x1 = t,\n mr_r = t,\n mr_a = t, //used in millerRabin()\n eg_v = t,\n eg_u = t,\n eg_A = t,\n eg_B = t,\n eg_C = t,\n eg_D = t, //used in eGCD_(), inverseMod_()\n //, md_q1=t, md_q2=t, md_q3=t, md_r=t, md_r1=t, md_r2=t, md_tt=t, //used in mod_()\n\n primes = t,\n pows = t,\n s_i = t,\n s_i2 = t,\n s_R = t,\n s_rm = t,\n s_q = t,\n s_n1 = t,\n s_a = t,\n s_r2 = t,\n s_n = t,\n s_b = t,\n s_d = t,\n s_x1 = t,\n s_x2 = t,\n s_aa = t, //used in randTruePrime_()\n rpprb = t //used in randProbPrimeRounds() (which also uses \"primes\")\n\n////////////////////////////////////////////////////////////////////////////////////////\n\nvar k, buff\n\n/**\n * return array of all primes less than integer n\n *\n * @param {number} n\n * @returns {number[]}\n */\nexport function findPrimes(n: number): number[] {\n var i, s, p, ans\n s = new Array(n)\n for (i = 0; i < n; i++) s[i] = 0\n s[0] = 2\n p = 0 //first p elements of s are primes, the rest are a sieve\n for (; s[p] < n; ) {\n //s[p] is the pth prime\n for (\n i = s[p] * s[p];\n i < n;\n i += s[p] //mark multiples of s[p]\n )\n s[i] = 1\n p++\n s[p] = s[p - 1] + 1\n for (; s[p] < n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)\n }\n ans = new Array(p)\n for (i = 0; i < p; i++) ans[i] = s[i]\n return ans\n}\n\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x is a bigInt, and b is an integer, with b 0; j--);\n for (z = 0, w = x[j]; w; w >>= 1, z++);\n z += bpe * j\n return z\n}\n\n/**\n * return a copy of x with at least n elements, adding leading zeros if needed\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\nexport function expand(x: number[], n: number): number[] {\n var ans = int2bigInt(0, (x.length > n ? x.length : n) * bpe, 0)\n copy_(ans, x)\n return ans\n}\n\n/**\n * return a k-bit true random prime using Maurer's algorithm.\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randTruePrime(k: number): number[] {\n var ans = int2bigInt(0, k, 0)\n randTruePrime_(ans, k)\n return trim(ans, 1)\n} */\n\n/**\n * return a k-bit random probable prime with probability of error < 2^-80\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randProbPrime(k: number): number[] {\n if (k >= 600) return randProbPrimeRounds(k, 2) //numbers from HAC table 4.3\n if (k >= 550) return randProbPrimeRounds(k, 4)\n if (k >= 500) return randProbPrimeRounds(k, 5)\n if (k >= 400) return randProbPrimeRounds(k, 6)\n if (k >= 350) return randProbPrimeRounds(k, 7)\n if (k >= 300) return randProbPrimeRounds(k, 9)\n if (k >= 250) return randProbPrimeRounds(k, 12) //numbers from HAC table 4.4\n if (k >= 200) return randProbPrimeRounds(k, 15)\n if (k >= 150) return randProbPrimeRounds(k, 18)\n if (k >= 100) return randProbPrimeRounds(k, 27)\n return randProbPrimeRounds(k, 40) //number from HAC remark 4.26 (only an estimate)\n} */\n\n/**\n * return a k-bit probable random prime using n rounds of Miller Rabin\n * (after trial division with small primes)\n *\n * @export\n * @param {number} k\n * @param {number} n\n * @returns {number[]}\n */\n/* export function randProbPrimeRounds(k: number, n: number): number[] {\n var ans, i, divisible, B\n B = 30000 //B is largest prime to use in trial division\n ans = int2bigInt(0, k, 0)\n\n //optimization: try larger and smaller B to find the best limit.\n\n if (primes.length === 0) primes = findPrimes(30000) //check for divisibility by primes <=30000\n\n if (rpprb.length !== ans.length) rpprb = dup(ans)\n\n for (;;) {\n //keep trying random values for ans until one appears to be prime\n //optimization: pick a random number times L=2*3*5*...*p, plus a\n // random element of the list of all numbers in [0,L) not divisible by any prime up to p.\n // This can reduce the amount of random number generation.\n\n randBigInt_(ans, k, 0) //ans = a random odd number to check\n ans[0] |= 1\n divisible = 0\n\n //check ans for divisibility by small primes up to B\n for (i = 0; i < primes.length && primes[i] <= B; i++)\n if (modInt(ans, primes[i]) === 0 && !equalsInt(ans, primes[i])) {\n divisible = 1\n break\n }\n\n //optimization: change millerRabin so the base can be bigger than the number being checked, then eliminate the while here.\n\n //do n rounds of Miller Rabin, with random bases less than ans\n for (i = 0; i < n && !divisible; i++) {\n randBigInt_(rpprb, k, 0)\n while (\n !greater(ans, rpprb) //pick a random rpprb that's < ans\n )\n randBigInt_(rpprb, k, 0)\n if (!millerRabin(ans, rpprb)) divisible = 1\n }\n\n if (!divisible) return ans\n }\n} */\n\n/**\n * return a new bigInt equal to (x mod n) for bigInts x and n.\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {number[]}\n */\nexport function mod(x: number[], n: number[]): number[] {\n var ans = dup(x)\n mod_(ans, n)\n return trim(ans, 1)\n}\n\n/**\n * return (x+n) where x is a bigInt and n is an integer.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n/* export function addInt(x: number[], n: number): number[] {\n var ans = expand(x, x.length + 1)\n addInt_(ans, n)\n return trim(ans, 1)\n} */\n\n/**\n * return x*y for bigInts x and y. This is faster when y y.length ? x.length + 1 : y.length + 1)\n sub_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x+y) for bigInts x and y\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function add(x: number[], y: number[]): number[] {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1)\n add_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x**(-1) mod n) for bigInts x and n.\n *\n * If no inverse exists, it returns null\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(number[] | null)}\n */\n/* export function inverseMod(x: number[], n: number[]): number[] | null {\n var ans = expand(x, n.length)\n var s = inverseMod_(ans, n)\n return s ? trim(ans, 1) : null\n} */\n\n/**\n * return (x*y mod n) for bigInts x,y,n.\n *\n * For greater speed, let y= 2\n\n if (s_i2.length != ans.length) {\n s_i2 = dup(ans)\n s_R = dup(ans)\n s_n1 = dup(ans)\n s_r2 = dup(ans)\n s_d = dup(ans)\n s_x1 = dup(ans) //TODO Seems like a bug in eslint, reports as unused\n s_x2 = dup(ans)\n s_b = dup(ans)\n s_n = dup(ans)\n s_i = dup(ans)\n s_rm = dup(ans)\n s_q = dup(ans)\n s_a = dup(ans)\n s_aa = dup(ans)\n }\n\n if (k <= recLimit) {\n //generate small random primes by trial division up to its square root\n pm = (1 << ((k + 2) >> 1)) - 1 //pm is binary number with all ones, just over sqrt(2^k)\n copyInt_(ans, 0)\n for (dd = 1; dd; ) {\n dd = 0\n ans[0] = 1 | (1 << (k - 1)) | Math.floor(Math.random() * (1 << k)) //random, k-bit, odd integer, with msb 1\n for (j = 1; j < primes.length && (primes[j] & pm) == primes[j]; j++) {\n //trial division by all primes 3...sqrt(2^k)\n if (0 == ans[0] % primes[j]) {\n dd = 1\n break\n }\n }\n }\n carry_(ans)\n return\n }\n\n B = c * k * k //try small primes up to B (or all the primes[] array if the largest is less than B).\n if (k > 2 * m)\n //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n for (r = 1; k - k * r <= m; ) r = pows[Math.floor(Math.random() * 512)] //r=Math.pow(2,Math.random()-1);\n else r = 0.5\n\n //simulation suggests the more complex algorithm using r=.333 is only slightly faster.\n\n recSize = Math.floor(r * k) + 1\n\n randTruePrime_(s_q, recSize)\n copyInt_(s_i2, 0)\n s_i2[Math.floor((k - 2) / bpe)] |= 1 << ((k - 2) % bpe) //s_i2=2^(k-2)\n divide_(s_i2, s_q, s_i, s_rm) //s_i=floor((2^(k-1))/(2q))\n\n z = bitSize(s_i)\n\n for (;;) {\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_i-1]\n randBigInt_(s_R, z, 0)\n if (greater(s_i, s_R)) break\n } //now s_R is in the range [0,s_i-1]\n addInt_(s_R, 1) //now s_R is in the range [1,s_i]\n add_(s_R, s_i) //now s_R is in the range [s_i+1,2*s_i]\n\n copy_(s_n, s_q)\n mult_(s_n, s_R)\n multInt_(s_n, 2)\n addInt_(s_n, 1) //s_n=2*s_R*s_q+1\n\n copy_(s_r2, s_R)\n multInt_(s_r2, 2) //s_r2=2*s_R\n\n //check s_n for divisibility by small primes up to B\n for (divisible = 0, j = 0; j < primes.length && primes[j] < B; j++)\n if (modInt(s_n, primes[j]) == 0 && !equalsInt(s_n, primes[j])) {\n divisible = 1\n break\n }\n\n if (!divisible)\n if (!millerRabinInt(s_n, 2))\n //if it passes small primes check, then try a single Miller-Rabin base 2\n //this line represents 75% of the total runtime for randTruePrime_\n divisible = 1\n\n if (!divisible) {\n //if it passes that test, continue checking s_n\n addInt_(s_n, -3)\n for (j = s_n.length - 1; s_n[j] == 0 && j > 0; j--); //strip leading zeros\n for (zz = 0, w = s_n[j]; w; w >>= 1, zz++);\n zz += bpe * j //zz=number of bits in s_n, ignoring leading zeros\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_n-1]\n randBigInt_(s_a, zz, 0)\n if (greater(s_n, s_a)) break\n } //now s_a is in the range [0,s_n-1]\n addInt_(s_n, 3) //now s_a is in the range [0,s_n-4]\n addInt_(s_a, 2) //now s_a is in the range [2,s_n-2]\n copy_(s_b, s_a)\n copy_(s_n1, s_n)\n addInt_(s_n1, -1)\n powMod_(s_b, s_n1, s_n) //s_b=s_a^(s_n-1) modulo s_n\n addInt_(s_b, -1)\n if (isZero(s_b)) {\n copy_(s_b, s_a)\n powMod_(s_b, s_r2, s_n)\n addInt_(s_b, -1)\n copy_(s_aa, s_n)\n copy_(s_d, s_b)\n GCD_(s_d, s_n) //if s_b and s_n are relatively prime, then s_n is a prime\n if (equalsInt(s_d, 1)) {\n copy_(ans, s_aa)\n return //if we've made it this far, then s_n is absolutely guaranteed to be prime\n }\n }\n }\n }\n} */\n\n/**\n * Return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n *\n * @export\n * @param {number} n\n * @param {number} s\n * @returns {number[]}\n */\n/* export function randBigInt(n: number, s: number): number[] {\n var a, b\n a = Math.floor((n - 1) / bpe) + 2 //# array elements to hold the BigInt with a leading 0 element\n b = int2bigInt(0, 0, a)\n randBigInt_(b, n, s)\n return b\n} */\n\n/**\n * Set b to an n-bit random BigInt. If s=1, then the most significant of those n bits is set to 1.\n *\n * Array b must be big enough to hold the result. Must have n>=1\n *\n * @export\n * @param {number[]} b\n * @param {number} n\n * @param {number} s\n * @return {void}\n */\n/* export function randBigInt_(b: number[], n: number, s: number): void {\n var i, a\n for (i = 0; i < b.length; i++) b[i] = 0\n a = Math.floor((n - 1) / bpe) + 1 //# array elements to hold the BigInt\n for (i = 0; i < a; i++) {\n b[i] = Math.floor(Math.random() * (1 << (bpe - 1)))\n }\n b[a - 1] &= (2 << ((n - 1) % bpe)) - 1\n if (s == 1) b[a - 1] |= 1 << ((n - 1) % bpe)\n} */\n\n/**\n * Return the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function GCD(x: number[], y: number[]): number[] {\n var xc, yc\n xc = dup(x)\n yc = dup(y)\n GCD_(xc, yc)\n return xc\n}\n\n/**\n * set x to the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * y is destroyed.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n */\nexport function GCD_(x: number[], y: number[]): void {\n var i: number, xp: number, yp: number, A: number, B, C: number, D: number, q, sing\n var qp\n if (T.length !== x.length) T = dup(x)\n\n sing = 1\n while (sing) {\n //while y has nonzero elements other than y[0]\n sing = 0\n for (\n i = 1;\n i < y.length;\n i++ //check if y has nonzero elements other than 0\n )\n if (y[i]) {\n sing = 1\n break\n }\n if (!sing) break //quit when y all zero elements except possibly y[0]\n\n for (i = x.length; !x[i] && i >= 0; i--); //find most significant element of x\n xp = x[i]\n yp = y[i]\n A = 1\n B = 0\n C = 0\n D = 1\n while (yp + C && yp + D) {\n q = Math.floor((xp + A) / (yp + C))\n qp = Math.floor((xp + B) / (yp + D))\n if (q != qp) break\n t = A - q * C\n A = C\n C = t // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)\n t = B - q * D\n B = D\n D = t\n t = xp - q * yp\n xp = yp\n yp = t\n }\n if (B) {\n copy_(T, x)\n linComb_(x, y, A, B) //x=A*x+B*y\n linComb_(y, T, D, C) //y=D*y+C*T\n } else {\n mod_(x, y)\n copy_(T, x)\n copy_(x, y)\n copy_(y, T)\n }\n }\n if (y[0] === 0) return\n t = modInt(x, y[0])\n copyInt_(x, y[0])\n y[0] = t\n while (y[0]) {\n x[0] %= y[0]\n t = x[0]\n x[0] = y[0]\n y[0] = t\n }\n}\n\n/**\n * do x=x**(-1) mod n, for bigInts x and n.\n *\n * If no inverse exists, it sets x to zero and returns 0, else it returns 1.\n * The x array must be at least as large as the n array.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(0 | 1)}\n */\n/* export function inverseMod_(x: number[], n: number[]): Bool {\n var k = 1 + 2 * Math.max(x.length, n.length)\n\n if (!(x[0] & 1) && !(n[0] & 1)) {\n //if both inputs are even, then inverse doesn't exist\n copyInt_(x, 0)\n return 0\n }\n\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_v = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n\n copy_(eg_u, x)\n copy_(eg_v, n)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while eg_u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if eg_A==eg_B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, n)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(eg_v[0] & 1)) {\n //while eg_v is even\n halve_(eg_v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if eg_C==eg_D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, n)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(eg_v, eg_u)) {\n //eg_v <= eg_u\n sub_(eg_u, eg_v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //eg_v > eg_u\n sub_(eg_v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n\n if (equalsInt(eg_u, 0)) {\n while (\n negative(eg_C) //make sure answer is nonnegative\n )\n add_(eg_C, n)\n copy_(x, eg_C)\n\n if (!equalsInt(eg_v, 1)) {\n //if GCD_(x,n)!=1, then there is no inverse\n copyInt_(x, 0)\n return 0\n }\n return 1\n }\n }\n} */\n\n/**\n * return x**(-1) mod n, for integers x and n.\n *\n * Return 0 if there is no inverse\n *\n * @param {number} x\n * @param {number} n\n * @returns {number}\n */\nexport function inverseModInt(x: number, n: number): number {\n var a = 1,\n b = 0,\n t\n for (;;) {\n if (x === 1) return a\n if (x === 0) return 0\n b -= a * Math.floor(n / x)\n //$off\n n %= x\n\n if (n === 1) return b //to avoid negatives, change this b to n-b, and each -= to +=\n if (n === 0) return 0\n a -= b * Math.floor(x / n)\n //$off\n x %= n\n }\n /*::\n declare var never: empty\n return never\n */\n}\n\n//this deprecated function is for backward compatibility only.\n/* function inverseModInt_(x: number, n: number) {\n return inverseModInt(x, n)\n} */\n\n/**\n * Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:\n *\n * v = GCD_(x,y) = a*x-b*y\n *\n * The bigInts v, a, b, must have exactly as many elements as the larger of x and y.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} v\n * @param {number[]} a\n * @param {number[]} b\n * @return {void}\n */\nexport function eGCD_(\n x: number[],\n y: number[],\n v: number[],\n a: number[],\n b: number[],\n): void {\n var g = 0\n var k = Math.max(x.length, y.length)\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n while (!(x[0] & 1) && !(y[0] & 1)) {\n //while x and y both even\n halve_(x)\n halve_(y)\n g++\n }\n copy_(eg_u, x)\n copy_(v, y)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if A==B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, y)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(v[0] & 1)) {\n //while v is even\n halve_(v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if C==D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, y)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(v, eg_u)) {\n //v<=u\n sub_(eg_u, v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //v>u\n sub_(v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C)) {\n //make sure a (C) is nonnegative\n add_(eg_C, y)\n sub_(eg_D, x)\n }\n multInt_(eg_D, -1) ///make sure b (D) is nonnegative\n copy_(a, eg_C)\n copy_(b, eg_D)\n leftShift_(v, g)\n return\n }\n }\n}\n\n/**\n * is bigInt x negative?\n *\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function negative(x: number[]) {\n //TODO Flow Bool type inference\n return (x[x.length - 1] >> (bpe - 1)) & 1\n}\n\n/**\n * is (x << (shift*bpe)) > y?\n *\n * x and y are nonnegative bigInts\n * shift is a nonnegative integer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} shift\n * @returns {(1 | 0)}\n */\nexport function greaterShift(x: number[], y: number[], shift: number): Bool {\n var i,\n kx = x.length,\n ky = y.length\n k = kx + shift < ky ? kx + shift : ky\n for (i = ky - 1 - shift; i < kx && i >= 0; i++) if (x[i] > 0) return 1 //if there are nonzeros in x to the left of the first column of y, then x is bigger\n for (i = kx - 1 + shift; i < ky; i++) if (y[i] > 0) return 0 //if there are nonzeros in y to the left of the first column of x, then x is not bigger\n for (i = k - 1; i >= shift; i--)\n if (x[i - shift] > y[i]) return 1\n else if (x[i - shift] < y[i]) return 0\n return 0\n}\n\n/**\n * is x > y?\n *\n * x and y both nonnegative\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\nexport function greater(x: number[], y: number[]): Bool {\n var i\n var k = x.length < y.length ? x.length : y.length\n\n for (i = x.length; i < y.length; i++) if (y[i]) return 0 //y has more digits\n\n for (i = y.length; i < x.length; i++) if (x[i]) return 1 //x has more digits\n\n for (i = k - 1; i >= 0; i--)\n if (x[i] > y[i]) return 1\n else if (x[i] < y[i]) return 0\n return 0\n}\n\n/**\n * divide x by y giving quotient q and remainder r.\n *\n * q = floor(x/y)\n * r = x mod y\n *\n * All 4 are bigints.\n *\n * * x must have at least one leading zero element.\n * * y must be nonzero.\n * * q and r must be arrays that are exactly the same length as x. (Or q can have more).\n * * Must have x.length >= y.length >= 2.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} q\n * @param {number[]} r\n * @return {void}\n */\nexport function divide_(\n x: number[],\n y: number[],\n q: number[],\n r: number[],\n): void {\n var kx, ky\n var i, j, y1, y2, c, a, b\n copy_(r, x)\n for (ky = y.length; y[ky - 1] === 0; ky--); //ky is number of elements in y, not including leading zeros\n\n //normalize: ensure the most significant element of y has its highest bit set\n b = y[ky - 1]\n for (a = 0; b; a++) b >>= 1\n a = bpe - a //a is how many bits to shift so that the high order bit of y is leftmost in its array element\n leftShift_(y, a) //multiply both by 1<
ky; kx--); //kx is number of elements in normalized x, not including leading zeros\n\n copyInt_(q, 0) // q=0\n while (!greaterShift(y, r, kx - ky)) {\n // while (leftShift_(y,kx-ky) <= r) {\n subShift_(r, y, kx - ky) // r=r-leftShift_(y,kx-ky)\n q[kx - ky]++ // q[kx-ky]++;\n } // }\n\n for (i = kx - 1; i >= ky; i--) {\n if (r[i] == y[ky - 1]) q[i - ky] = mask\n else q[i - ky] = Math.floor((r[i] * radix + r[i - 1]) / y[ky - 1])\n\n //The following for(;;) loop is equivalent to the commented while loop,\n //except that the uncommented version avoids overflow.\n //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0\n // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])\n // q[i-ky]--;\n for (;;) {\n y2 = (ky > 1 ? y[ky - 2] : 0) * q[i - ky]\n c = y2 >> bpe\n y2 = y2 & mask\n y1 = c + q[i - ky] * y[ky - 1]\n c = y1 >> bpe\n y1 = y1 & mask\n\n if (\n c == r[i]\n ? y1 == r[i - 1] ? y2 > (i > 1 ? r[i - 2] : 0) : y1 > r[i - 1]\n : c > r[i]\n )\n q[i - ky]--\n else break\n }\n\n linCombShift_(r, y, -q[i - ky], i - ky) //r=r-q[i-ky]*leftShift_(y,i-ky)\n if (negative(r)) {\n addShift_(r, y, i - ky) //r=r+leftShift_(y,i-ky)\n q[i - ky]--\n }\n }\n\n rightShift_(y, a) //undo the normalization step\n rightShift_(r, a) //undo the normalization step\n}\n\n/**\n * do carries and borrows so each element of the bigInt x fits in bpe bits.\n *\n * @param {number[]} x\n */\nexport function carry_(x: number[]): void {\n var i, k, c, b\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * return x mod n for bigInt x and integer n.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number}\n */\nexport function modInt(x: number[], n: number): number {\n var i,\n c = 0\n for (i = x.length - 1; i >= 0; i--) c = (c * radix + x[i]) % n\n return c\n}\n\n/**\n * convert the integer t into a bigInt with at least the given number of bits.\n * the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)\n * Pad the array with leading zeros so that it has at least minSize elements.\n *\n * There will always be at least one leading 0 element.\n *\n * @export\n * @param {number} t\n * @param {number} bits\n * @param {number} minSize\n * @returns {number[]}\n */\nexport function int2bigInt(t: number, bits: number, minSize: number): number[] {\n var i, k\n k = Math.ceil(bits / bpe) + 1\n k = minSize > k ? minSize : k\n var buff = new Array(k)\n copyInt_(buff, t)\n return buff\n}\n\n/**\n * return the bigInt given a string representation in a given base.\n * Pad the array with leading zeros so that it has at least minSize elements.\n * If base=-1, then it reads in a space-separated list of array elements in decimal.\n *\n * The array will always have at least one leading zero, unless base=-1.\n *\n * @export\n * @param {string} s\n * @param {number} base\n * @param {number} [minSize]\n * @returns {number[]}\n */\nexport function str2bigInt(\n s: string,\n base: number,\n minSize?: number,\n): number[] {\n var d, i, x, y, kk\n var k = s.length\n if (base === -1) {\n //comma-separated list of array elements in decimal\n x = new Array(0)\n for (;;) {\n y = new Array(x.length + 1)\n for (i = 0; i < x.length; i++) y[i + 1] = x[i]\n y[0] = parseInt(s, 10) //TODO PERF Should we replace that with ~~ (not not)? https://jsperf.com/number-vs-parseint-vs-plus/7\n x = y\n d = s.indexOf(',', 0)\n if (d < 1) break\n //$off\n s = s.substring(d + 1)\n if (s.length == 0) break\n }\n //$off\n if (x.length < minSize) {\n //$off\n y = new Array(minSize)\n copy_(y, x)\n return y\n }\n return x\n }\n\n x = int2bigInt(0, base * k, 0)\n for (i = 0; i < k; i++) {\n d = digitsStr.indexOf(s.substring(i, i + 1), 0)\n if (base <= 36 && d >= 36)\n //convert lowercase to uppercase if base<=36\n d -= 26\n if (d >= base || d < 0) {\n //stop at first illegal character\n break\n }\n multInt_(x, base)\n addInt_(x, d)\n }\n\n for (k = x.length; k > 0 && !x[k - 1]; k--); //strip off leading zeros\n //$off\n k = minSize > k + 1 ? minSize : k + 1\n //$off\n y = new Array(k)\n //$off\n kk = k < x.length ? k : x.length\n //$off\n for (i = 0; i < kk; i++) y[i] = x[i]\n //$off\n for (; i < k; i++) y[i] = 0\n return y\n}\n\n//return the bigInt given a string representation in a given base.\n//Pad the array with leading zeros so that it has at least minSize elements.\n//If base=-1, then it reads in a space-separated list of array elements in decimal.\n//The array will always have at least one leading zero, unless base=-1.\n// function str2bigInt(s,b,minSize) {\n// var d, i, j, base, str, x, y, kk;\n// if (typeof b === 'string') {\n// base = b.length;\n// str = b;\n// } else {\n// base = b;\n// str = digitsStr;\n// }\n// var k=s.length;\n// if (base==-1) { //comma-separated list of array elements in decimal\n// x=new Array(0);\n// for (;;) {\n// y=new Array(x.length+1);\n// for (i=0;i=36) { //convert lowercase to uppercase if base<=36\n// d-=26;\n// }\n// if (d>=base || d<0) { //ignore illegal characters\n// continue;\n// }\n// multInt_(x,base);\n// addInt_(x,d);\n// }\n\n// for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros\n// k=minSize>k+1 ? minSize : k+1;\n// y=new Array(k);\n// kk=k y.length) {\n for (; i < x.length; i++) if (x[i]) return 0\n } else {\n for (; i < y.length; i++) if (y[i]) return 0\n }\n return 1\n}\n\n/**\n * is the bigInt x equal to zero?\n *\n * @export\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function isZero(x: number[]): Bool {\n var i\n for (i = 0; i < x.length; i++) if (x[i]) return 0\n return 1\n}\n\n/**\n * Convert a bigInt into a string in a given base, from base 2 up to base 95.\n *\n * Base -1 prints the contents of the array representing the number.\n *\n * @export\n * @param {number[]} x\n * @param {number} base\n * @returns {string}\n */\nexport function bigInt2str(x: number[], base: number): string {\n var i,\n t,\n s = ''\n\n if (s6.length !== x.length) s6 = dup(x)\n else copy_(s6, x)\n\n if (base === -1) {\n //return the list of array contents\n for (i = x.length - 1; i > 0; i--) s += x[i] + ','\n s += x[0]\n } else {\n //return it in the given base\n while (!isZero(s6)) {\n t = divInt_(s6, base) //t=s6 % base; s6=floor(s6/base);\n s = digitsStr.substring(t, t + 1) + s\n }\n }\n if (s.length === 0) s = '0'\n return s\n}\n\n/**\n * Convert a bigInt into bytes\n * @param x bigInt\n * @param littleEndian byte order by default\n */\nexport function bigInt2bytes(x: number[], littleEndian = true) {\n if(s6.length !== x.length) s6 = dup(x);\n else copy_(s6, x);\n\n const out: number[] = [];\n\n //console.log('bigInt2bytes');\n while(!isZero(s6)) {\n t = divInt_(s6, 256); //t=s6 % base; s6=floor(s6/base);\n out.push(t);\n //console.log('bigInt2bytes', t);\n }\n\n if(littleEndian) {\n out.reverse();\n }\n\n //console.log('bigInt2bytes', out);\n\n return out;\n}\n\n/**\n * Compare two bigInts and return -1 if x is less, 0 if equals, 1 if greater\n * @param x bigInt\n * @param y bigInt\n */\nexport function cmp(x: number[], y: number[]) {\n return greater(x, y) ? 1 : (equals(x, y) ? 0 : -1);\n}\n\n/* Object.assign(self, {\n cmp,\n str2bigInt,\n int2bigInt,\n bigInt2str,\n one,\n divide_,\n divInt_,\n dup,\n negative\n}); */\n\n/**\n * Returns a duplicate of bigInt x\n *\n * @export\n * @param {number[]} x\n * @returns {number[]}\n */\nexport function dup(x: number[]): number[] {\n var i\n buff = Array(x.length)\n copy_(buff, x)\n return buff\n}\n\n/**\n * do x=y on bigInts x and y.\n *\n * x must be an array at least as big as y (not counting the leading zeros in y).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {void}\n */\nexport function copy_(x: number[], y: number[]): void {\n var i\n var k = x.length < y.length ? x.length : y.length\n for (i = 0; i < k; i++) x[i] = y[i]\n for (i = k; i < x.length; i++) x[i] = 0\n}\n\n/**\n * do x=y on bigInt x and integer y.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function copyInt_(x: number[], n: number): void {\n var i, c\n var len = x.length //TODO .length in for loop have perfomance costs. Bench this\n for (c = n, i = 0; i < len; i++) {\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function addInt_(x: number[], n: number): void {\n var i, k, c, b\n x[0] += n\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n if (!c) return //stop carrying as soon as the carry is zero\n }\n}\n\n/**\n * right shift bigInt x by n bits.\n *\n * 0 <= n < bpe.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n */\nexport function rightShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = 0;\n i < x.length - k;\n i++ //right shift x by k elements\n )\n x[i] = x[i + k]\n for (; i < x.length; i++) x[i] = 0\n //$off\n n %= bpe\n }\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - n)) | (x[i] >> n))\n }\n x[i] >>= n\n}\n\n/**\n * do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement\n *\n * @param {number[]} x\n * @returns {void}\n */\nexport function halve_(x: number[]): void {\n var i\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - 1)) | (x[i] >> 1))\n }\n x[i] = (x[i] >> 1) | (x[i] & (radix >> 1)) //most significant bit stays the same\n}\n\n/**\n * left shift bigInt x by n bits\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function leftShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = x.length;\n i >= k;\n i-- //left shift x by k elements\n )\n x[i] = x[i - k]\n for (; i >= 0; i--) x[i] = 0\n //$off\n n %= bpe\n }\n if (!n) return\n for (i = x.length - 1; i > 0; i--) {\n x[i] = mask & ((x[i] << n) | (x[i - 1] >> (bpe - n)))\n }\n x[i] = mask & (x[i] << n)\n}\n\n/**\n * do x=x*n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function multInt_(x: number[], n: number): void {\n var i, k, c, b\n if (!n) return\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i] * n\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * do x=floor(x/n) for bigInt x and integer n, and return the remainder\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number} remainder\n */\nexport function divInt_(x: number[], n: number): number {\n var i,\n r = 0,\n s\n for (i = x.length - 1; i >= 0; i--) {\n s = r * radix + x[i]\n x[i] = Math.floor(s / n)\n r = s % n\n }\n return r\n}\n\n/**\n * do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} a\n * @param {number} b\n * @returns {void}\n */\nexport function linComb_(x: number[], y: number[], a: number, b: number): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n kk = x.length\n for (c = 0, i = 0; i < k; i++) {\n c += a * x[i] + b * y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; i < kk; i++) {\n c += a * x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} b\n * @param {number} ys\n * @returns {void}\n */\nexport function linCombShift_(\n x: number[],\n y: number[],\n b: number,\n ys: number,\n): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + b * y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+(y<<(ys*bpe)) for bigInts x and y, and integer ys.\n *\n * x must be large enough to hold the answer.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function addShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-(y<<(ys*bpe)) for bigInts x and y, and integer ys\n *\n * x must be large enough to hold the answer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function subShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] - y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function sub_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] - y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function add_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] + y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x*y for bigInts x and y.\n *\n * This is faster when y 0 && !x[kx - 1]; kx--); //ignore leading zeros in x\n k = kx > n.length ? 2 * kx : 2 * n.length //k=# elements in the product, which is twice the elements in the larger of x and n\n if (s0.length != k) s0 = new Array(k)\n copyInt_(s0, 0)\n for (i = 0; i < kx; i++) {\n c = s0[2 * i] + x[i] * x[i]\n s0[2 * i] = c & mask\n c >>= bpe\n for (j = i + 1; j < kx; j++) {\n c = s0[i + j] + 2 * x[i] * x[j] + c\n s0[i + j] = c & mask\n c >>= bpe\n }\n s0[i + kx] = c\n }\n mod_(s0, n)\n copy_(x, s0)\n}\n\n/**\n * return x with exactly k leading zero elements\n *\n * @export\n * @param {number[]} x\n * @param {number} k\n * @returns {number[]}\n */\nexport function trim(x: number[], k: number): number[] {\n var i, y\n for (i = x.length; i > 0 && !x[i - 1]; i--);\n y = new Array(i + k)\n copy_(y, x)\n return y\n}\n\n/**\n * do `x=x**y mod n`, where x,y,n are bigInts and `**` is exponentiation. `0**0=1`.\n *\n * this is faster when n is odd.\n *\n * x usually needs to have as many elements as n.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\nexport function powMod_(x: number[], y: number[], n: number[]): void {\n var k1, k2, kn, np\n if (s7.length != n.length) s7 = dup(n)\n\n //for even modulus, use a simple square-and-multiply algorithm,\n //rather than using the more complex Montgomery algorithm.\n if ((n[0] & 1) == 0) {\n copy_(s7, x)\n copyInt_(x, 1)\n while (!equalsInt(y, 0)) {\n if (y[0] & 1) multMod_(x, s7, n)\n divInt_(y, 2)\n squareMod_(s7, n)\n }\n return\n }\n\n //calculate np from n for the Montgomery multiplications\n copyInt_(s7, 0)\n for (kn = n.length; kn > 0 && !n[kn - 1]; kn--);\n np = radix - inverseModInt(modInt(n, radix), radix)\n s7[kn] = 1\n multMod_(x, s7, n) // x = x * 2**(kn*bp) mod n\n\n if (s3.length != x.length) s3 = dup(x)\n else copy_(s3, x)\n //$off\n // @ts-ignore\n for (k1 = y.length - 1; (k1 > 0) & !y[k1]; k1--); //k1=first nonzero element of y\n if (y[k1] == 0) {\n //anything to the 0th power is 1\n copyInt_(x, 1)\n return\n }\n for (k2 = 1 << (bpe - 1); k2 && !(y[k1] & k2); k2 >>= 1); //k2=position of first 1 bit in y[k1]\n for (;;) {\n if (!(k2 >>= 1)) {\n //look at next bit of y\n k1--\n if (k1 < 0) {\n mont_(x, one, n, np)\n return\n }\n k2 = 1 << (bpe - 1)\n }\n mont_(x, x, n, np)\n\n if (k2 & y[k1])\n //if next bit is a 1\n mont_(x, s3, n, np)\n }\n}\n\n/**\n * do x=x*y*Ri mod n for bigInts x,y,n,\n * where Ri = 2**(-kn*bpe) mod n, and kn is the\n * number of elements in the n array, not\n * counting leading zeros.\n *\n * x array must have at least as many elemnts as the n array\n * It's OK if x and y are the same variable.\n *\n * must have:\n * * x,y < n\n * * n is odd\n * * np = -(n^(-1)) mod radix\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @param {number} np\n * @return {void}\n */\nexport function mont_(x: number[], y: number[], n: number[], np: number): void {\n var i, j, c, ui, t, ks\n var kn = n.length\n var ky = y.length\n\n if (sa.length != kn) sa = new Array(kn)\n\n copyInt_(sa, 0)\n\n for (; kn > 0 && n[kn - 1] == 0; kn--); //ignore leading zeros of n\n for (; ky > 0 && y[ky - 1] == 0; ky--); //ignore leading zeros of y\n ks = sa.length - 1 //sa will never have more than this many nonzero elements.\n\n //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large numbers\n for (i = 0; i < kn; i++) {\n t = sa[0] + x[i] * y[0]\n ui = ((t & mask) * np) & mask //the inner \"& mask\" was needed on Safari (but not MSIE) at one time\n c = (t + ui * n[0]) >> bpe\n t = x[i]\n\n //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe. Loop is unrolled 5-fold for speed\n j = 1\n for (; j < ky - 4; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ky; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn - 4; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ks; ) {\n c += sa[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n sa[j - 1] = c & mask\n }\n\n if (!greater(n, sa)) sub_(sa, n)\n copy_(x, sa)\n}","/*\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 { bufferConcats } from '../../helpers/bytes';\nimport { add_, bigInt2str, cmp, leftShift_, str2bigInt } from '../../vendor/leemon';\n\n \n \n \n\n \n \n \n \n \n \n \n \n \n\nexport function isObject(object: any) {\n return typeof(object) === 'object' && object !== null;\n}\n\n/* export function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n} */\n\n/* export function bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10);\n} */\n\n/* export function base64ToBlob(base64str: string, mimeType: string) {\n var sliceSize = 1024;\n var byteCharacters = atob(base64str);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n\n for(var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n\n var bytes = new Array(end - begin);\n for(var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n\n return blobConstruct(byteArrays, mimeType);\n}\n\nexport function dataUrlToBlob(url: string) {\n // var name = 'b64blob ' + url.length\n // console.time(name)\n var urlParts = url.split(',');\n var base64str = urlParts[1];\n var mimeType = urlParts[0].split(':')[1].split(';')[0];\n var blob = base64ToBlob(base64str, mimeType);\n // console.timeEnd(name)\n return blob;\n} */\n\nexport 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\n/* export function bytesFromBigInt(bigInt: BigInteger, len?: number) {\n var bytes = bigInt.toByteArray();\n\n if(len && bytes.length < len) {\n var padding = [];\n for(var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n padding[i] = 0;\n }\n if(bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(padding, bytes);\n } else {\n bytes = padding.concat(bytes);\n }\n } else {\n while (!bytes[0] && (!len || bytes.length > len)) {\n bytes = bytes.slice(1);\n }\n }\n\n return bytes;\n} */\n\nexport function longFromInts(high: number, low: number): string {\n //let perf = performance.now();\n //let str = bigint(high).shiftLeft(32).add(bigint(low)).toString(10);\n //console.log('longFromInts jsbn', performance.now() - perf);\n high = intToUint(high);\n low = intToUint(low);\n \n //perf = performance.now();\n const bigInt = str2bigInt(high.toString(16), 16, 32);//int2bigInt(high, 64, 64);\n //console.log('longFromInts construct high', bigint(high).toString(10), bigInt2str(bigInt, 10));\n leftShift_(bigInt, 32);\n //console.log('longFromInts shiftLeft', bigint(high).shiftLeft(32).toString(10), bigInt2str(bigInt, 10));\n add_(bigInt, str2bigInt(low.toString(16), 16, 32));\n const _str = bigInt2str(bigInt, 10);\n\n //console.log('longFromInts leemon', performance.now() - perf);\n\n //console.log('longFromInts', high, low, str, _str, str === _str);\n\n return _str;\n}\n\nexport function sortLongsArray(arr: string[]) {\n return arr.map(long => {\n return str2bigInt(long, 10);\n }).sort((a, b) => {\n return cmp(a, b);\n }).map(bigInt => {\n return bigInt2str(bigInt, 10);\n });\n}\n\nexport 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 padding.randomize();\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","import { IS_APPLE_MOBILE, IS_SAFARI } from \"./userAgent\";\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","import IS_MOV_SUPPORTED from \"./movSupport\";\n\nconst VIDEO_MIME_TYPES_SUPPORTED = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/7.52c0a0f3b6f476d2bcec.chunk.js b/public/7.52c0a0f3b6f476d2bcec.chunk.js deleted file mode 100644 index 40e2b5be4..000000000 --- a/public/7.52c0a0f3b6f476d2bcec.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[7],{137:function(e,t,o){"use strict";o.r(t);t.default={Animations:"Animations",AttachAlbum:"Album","Appearance.Color.Hex":"HEX","Appearance.Color.RGB":"RGB","BlockModal.Search.Placeholder":"Block user...",DarkMode:"Dark Mode",FilterIncludeExcludeInfo:"Choose chats and types of chats that will\nappear and never appear in this folder.",FilterNameInputLabel:"Folder Name",FilterMenuDelete:"Delete Folder",FilterHeaderEdit:"Edit Folder",FilterAllGroups:"All Groups",FilterAllContacts:"All Contacts",FilterAllNonContacts:"All Non-Contacts",FilterAllChannels:"All Channels",FilterAllBots:"All Bots",WordDelimiter:", ",WordDelimiterLast:" and ","EditContact.OriginalName":"original name","EditProfile.FirstNameLabel":"Name","EditProfile.BioLabel":"Bio (optional)","EditProfile.Username.Label":"Username (optional)","EditProfile.Username.Available":"Username is available","EditProfile.Username.Taken":"Username is already taken","EditProfile.Username.Invalid":"Username is invalid","ExceptionModal.Search.Placeholder":"Add exception...","Chat.Menu.SelectMessages":"Select Messages","Chat.Menu.ClearSelection":"Clear Selection","Chat.Menu.Hint":"To **edit** or **reply**, close this menu.\nThen tap next to a message.","Chat.Input.UnpinAll":"Unpin All Messages","Chat.Input.Attach.PhotoOrVideo":"Photo or Video","Chat.Input.Attach.Document":"Document","Chat.Subscribe":"SUBSCRIBE","Chat.Selection.LimitToast":"Max selection count reached.","Chat.Search.MessagesFound":{one_value:"%d message found",other_value:"%d messages found"},"Chat.Search.NoMessagesFound":"No messages found","Chat.Search.PrivateSearch":"Private Search","ChatList.Main.EmptyPlaceholder.Title":"Your chats will appear here","ChatList.Main.EmptyPlaceholder.Subtitle":"You have %s on Telegram","ChatList.Main.EmptyPlaceholder.SubtitleNoContacts":"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts","ChatList.Menu.SwitchTo.Webogram":"Switch to Old Version","ChatList.Menu.SwitchTo.Z":"Switch to Z version","ChatMigration.From":"Migrated from %s","ChatMigration.To":"Migrated to %s","ConnectionStatus.ForceReconnect":"force reconnect","ConnectionStatus.ReconnectIn":"Reconnect in %ds, %s","ConnectionStatus.Reconnect":"reconnect","ConnectionStatus.Reconnecting":"Reconnecting...","ConnectionStatus.TimedOut":"Request timed out, %s","ConnectionStatus.Waiting":"Waiting for network...","Contacts.Count":{one_value:"%d contact",other_value:"%d contacts"},"Deactivated.Title":"Too many tabs...","Deactivated.Subtitle":"Telegram supports only one active tab with the app.\nClick anywhere to continue using this tab.","General.Keyboard":"Keyboard","General.SendShortcut.Enter":"Send by Enter","General.SendShortcut.CtrlEnter":"Send by %s + Enter","General.SendShortcut.NewLine.ShiftEnter":"New line by Shift + Enter","General.SendShortcut.NewLine.Enter":"New line by Enter","General.AutoplayMedia":"Auto-Play Media","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","Notifications.MessagePreview":"Message preview",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","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","Search.Chats":"Chats","Search.Global":"Global Search","Search.Messages":"Messages","StickersTab.SearchPlaceholder":"Search Stickers",ForwardedFrom:"Forwarded from %s","Popup.Avatar.Title":"Drag to Reposition","Popup.Unpin.AllTitle":"Unpin all messages","Popup.Unpin.HideTitle":"Hide pinned messages","Popup.Unpin.HideDescription":"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.","Popup.Unpin.Hide":"Hide","TwoStepAuth.InvalidPassword":"Invalid password","TwoStepAuth.EmailCodeChangeEmail":"Change Email","MarkupTooltip.LinkPlaceholder":"Enter URL...","MediaViewer.Context.Download":"Download",Profile:"Profile",Saved:"Saved",Deleted:"Deleted",ReportBug:"Report Bug","Notifications.Count":{one_value:"%d notification",other_value:"%d notifications"},"Notifications.Forwarded":{one_value:"Forwarded %d message",other_value:"Forwarded %d messages"},"Notifications.New":"New notification","PushNotification.Action.Mute1d":"Mute background alerts for 1 day","PushNotification.Action.Settings":"Background alerts settings","PushNotification.Action.Mute1d.Mobile":"Mute for 24H","PushNotification.Action.Settings.Mobile":"Alerts settings","PushNotification.Message.NoPreview":"You have a new message","LogOut.Description":"Are you sure you want to log out?\n\nNote that you can seamlessly use Telegram on all your devices at once.",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",ActionGroupCallStarted:"un1 started a voice chat",ActionGroupCallStartedByYou:"You started a voice chat",ActionGroupCallJustStarted:"Voice chat started",ActionGroupCallEnded:"Voice chat ended (%s)",ActionGroupCallInvited:"un1 invited un2 to the voice chat",ActionGroupCallYouInvited:"You invited un2 to the voice chat",ActionGroupCallInvitedYou:"un1 invited you to the voice chat",Seconds:{one_value:"%1$d second",other_value:"%1$d seconds"},Minutes:{one_value:"%1$d minute",other_value:"%1$d minutes"},Hours:{one_value:"%1$d hour",other_value:"%1$d hours"},Days:{one_value:"%1$d day",other_value:"%1$d days"},Weeks:{one_value:"%1$d week",other_value:"%1$d weeks"},TodayAtFormattedWithToday:"today at %1$s",formatDateAtTime:"%1$s at %2$s",JoinByPeekChannelTitle:"Join Channel",JoinByPeekGroupTitle:"Join Group",YouWereKicked:"you were removed",ViaBot:"via",InviteExpired:"This invite link has expired.",NoUsernameFound:"There is no Telegram account with this username.",PrivacyDeleteCloudDrafts:"Delete All Cloud Drafts",AreYouSureClearDraftsTitle:"Delete cloud drafts",AreYouSureClearDrafts:"Are you sure you want to delete all cloud drafts?",BotInfoTitle:"What can this bot do?",ChatYourSelf:"forward here to save",GroupEmptyTitle1:"You have created a **group**.",GroupEmptyTitle2:"Groups can have:",GroupDescription1:"Up to 200,000 members",GroupDescription2:"Persistent chat history",GroupDescription3:"Public links such as t.me/title",GroupDescription4:"Admins with different rights",ChatYourSelfDescription1:"Forward messages here to save them",ChatYourSelfDescription2:"Send media and files to store them",ChatYourSelfDescription3:"Access this chat from any device",ChatYourSelfDescription4:"Use search to quickly find things",ChatYourSelfTitle:"Your cloud storage",ActionYouCreateGroup:"You created the group",NoMessages:"No messages here yet...",NoScheduledMessages:"No scheduled messages here yet...",NoMessagesGreetingsDescription:"Send a message or tap the greeting below.",InviteToGroupError:"Sorry, you can't add this user to groups because of user's privacy settings.",InviteToChannelError:"Sorry, you can't add this user to channels because of user's privacy settings.",AddMembersAlertTitle:"Add %1$s",AddOneMemberAlertTitle:"Add member",AddMembersAlertNamesText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersAlertCountText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersForwardMessages:"Show the last 100 messages to the new members",AddOneMemberForwardMessages:"Show the last 100 messages to **%1$s**",PinToTopLimitReached2:"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.",FiltersSetupPinAlert:"Set Up Folders",AppName:"Telegram",OK:"OK",PinFolderLimitReached:"Sorry, you can't pin any more chats to the top.",Send:"Send",ChannelJoin:"JOIN",Yesterday:"yesterday",LeaveAComment:"Leave a comment",ViewInChat:"View in chat",LinkNotFound:"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.",Create:"Create",ViewDiscussion:"View discussion",MessageScheduledUntilOnline:"Scheduled until online",ReportChat:"Report",ReportChatSpam:"Spam",ReportChatViolence:"Violence",ReportChatPornography:"Pornography",ReportChatChild:"Child Abuse",ReportChatOther:"Other",ReportChatDescription:"Description",ReportInfo:"Please enter any additional details relevant to your report.",ReportSentInfo:"Telegram moderators will review your report.\nThank you for your cooperation!",ReportHint:"Additional details...",ChatHistory:"Chat history for new members",ShareContact:"Share contact",SendMessageTitle:"Send message",SendContactToGroupText:"Do you want to send this contact to **%1$s**?",ChannelBroadcast:"Broadcast",ChannelSilentBroadcast:"Silent Broadcast",Comment:"Comment",SendAnonymously:"Send anonymously",DiscardVoiceMessageTitle:"Discard Voice Message",DiscardVoiceMessageDescription:"Are you sure you want to stop recording and discard your voice message?",DiscardVoiceMessageAction:"Discard",AddContact:"Add to contacts",BlockUser:"Block user",MobileHidden:"Mobile hidden",MobileHiddenExceptionInfo:"Phone number will be visible once %1$s adds you as a contact.",FirstName:"First name (required)",LastName:"Last name (optional)",AreYouSureBlockContact2:"Are you sure you want to block **%1$s**?",UserBlocked:"User blocked",UserUnblocked:"User unblocked",AudioUnknownArtist:"Unknown artist",AudioUnknownTitle:"Unknown title",LogOut:"Log out",OnlineCount:{one_value:"%1$d online",other_value:"%1$d online"},EditedMessage:"edited","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","Bio.Description":"Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco","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.Date.ScheduledFor":"Scheduled for %@","Chat.Date.ScheduledForToday":"Scheduled for today","Chat.DropTitle":"Drop files here to send them","Chat.DropQuickDesc":"in a quick way","Chat.DropAsFilesDesc":"without compression","Chat.Edit.Cancel.Text":"Are you sure you want to discard all changes?","Chat.Service.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.VoiceChatFinished":"%1$@ ended the voice chat (%2$@)","Chat.Service.VoiceChatFinishedYou":"You ended the voice chat (%@)","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.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?"},"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.Call.Cancelled":"Cancelled Call","ChatList.Service.Call.Missed":"Missed Call","ChatList.Service.VoiceChatScheduled":"%1$@ scheduled a voice chat for %2$@","ChatList.Service.VoiceChatScheduledYou":"You scheduled a voice chat for %2$@","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.AllChats":"All 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.","Channel.DescriptionHolderDescrpiton":"You can provide an optional description for your channel.","CreateGroup.NameHolder":"Group Name","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","EditAccount.Username":"Username","EditAccount.Title":"Edit Profile","EditAccount.Logout":"Log Out","Emoji.Recent":"Frequently Used","Emoji.SmilesAndPeople":"Smileys & People","Emoji.AnimalsAndNature":"Animals & Nature","Emoji.FoodAndDrink":"Food & Drink","Emoji.ActivityAndSport":"Activity & Sport","Emoji.TravelAndPlaces":"Travel & Places","Emoji.Objects":"Objects","Emoji.Flags":"Flags","LastSeen.HoursAgo":{one_value:"last seen %d hour ago",other_value:"last seen %d hours ago"},"Login.Register.LastName.Placeholder":"Last Name","Modal.Send":"Send","Telegram.GeneralSettingsViewController":"General Settings","Telegram.InstalledStickerPacksController":"Stickers","Telegram.NotificationSettingsViewController":"Notifications","Telegram.LanguageViewController":"Language","Stickers.SearchAdd":"Add","Stickers.SearchAdded":"Added","Stickers.SuggestStickers":"Suggest Stickers by Emoji","ShareModal.Search.Placeholder":"Share to...","ShareModal.Search.ForwardPlaceholder":"Forward to...","InstalledStickers.LoopAnimated":"Loop Animated Stickers","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.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.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","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.","Message.Context.Select":"Select","Message.Context.Pin":"Pin","Message.Context.Unpin":"Unpin","Message.Context.Goto":"Show Message","MessageContext.CopyMessageLink1":"Copy Message Link","NewPoll.Anonymous":"Anonymous Voting","NewPoll.Explanation.Placeholder":"Add a Comment (Optional)","NewPoll.OptionsAddOption":"Add an Option","NewPoll.MultipleChoice":"Multiple Answers","NewPoll.Quiz":"Quiz Mode","GeneralSettings.BigEmoji":"Large Emoji","GeneralSettings.EmojiPrediction":"Suggest Emoji","GroupPermission.Delete":"Delete Exception","ScheduleController.at":"at","Schedule.SendToday":"Send today at %@","Schedule.SendDate":"Send on %@ at %@","Schedule.SendWhenOnline":"Send When Online","Stickers.Recent":"Recent","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."}}}]); -//# sourceMappingURL=7.52c0a0f3b6f476d2bcec.chunk.js.map \ No newline at end of file diff --git a/public/7.52c0a0f3b6f476d2bcec.chunk.js.map b/public/7.52c0a0f3b6f476d2bcec.chunk.js.map deleted file mode 100644 index fb3a01afb..000000000 --- a/public/7.52c0a0f3b6f476d2bcec.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/lang.ts"],"names":[],"mappings":"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","file":"7.52c0a0f3b6f476d2bcec.chunk.js","sourcesContent":["const lang = {\n \"Animations\": \"Animations\",\n \"AttachAlbum\": \"Album\",\n \"Appearance.Color.Hex\": \"HEX\",\n \"Appearance.Color.RGB\": \"RGB\",\n \"BlockModal.Search.Placeholder\": \"Block user...\",\n \"DarkMode\": \"Dark Mode\",\n \"FilterIncludeExcludeInfo\": \"Choose chats and types of chats that will\\nappear and never appear in this folder.\",\n \"FilterNameInputLabel\": \"Folder Name\",\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 \"WordDelimiter\": \", \",\n \"WordDelimiterLast\": \" and \",\n \"EditContact.OriginalName\": \"original name\",\n \"EditProfile.FirstNameLabel\": \"Name\",\n \"EditProfile.BioLabel\": \"Bio (optional)\",\n \"EditProfile.Username.Label\": \"Username (optional)\",\n \"EditProfile.Username.Available\": \"Username is available\",\n \"EditProfile.Username.Taken\": \"Username is already taken\",\n \"EditProfile.Username.Invalid\": \"Username is invalid\",\n \"ExceptionModal.Search.Placeholder\": \"Add exception...\",\n \"Chat.Menu.SelectMessages\": \"Select Messages\",\n \"Chat.Menu.ClearSelection\": \"Clear Selection\",\n \"Chat.Menu.Hint\": \"To **edit** or **reply**, close this menu.\\nThen tap next to a message.\",\n \"Chat.Input.UnpinAll\": \"Unpin All Messages\",\n \"Chat.Input.Attach.PhotoOrVideo\": \"Photo or Video\",\n \"Chat.Input.Attach.Document\": \"Document\",\n \"Chat.Subscribe\": \"SUBSCRIBE\",\n \"Chat.Selection.LimitToast\": \"Max selection count reached.\",\n \"Chat.Search.MessagesFound\": {\n \"one_value\": \"%d message found\",\n \"other_value\": \"%d messages found\",\n },\n \"Chat.Search.NoMessagesFound\": \"No messages found\",\n \"Chat.Search.PrivateSearch\": \"Private Search\",\n \"ChatList.Main.EmptyPlaceholder.Title\": \"Your chats will appear here\",\n \"ChatList.Main.EmptyPlaceholder.Subtitle\": \"You have %s on Telegram\",\n \"ChatList.Main.EmptyPlaceholder.SubtitleNoContacts\": \"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts\",\n //\"ChatList.Menu.Archived\": \"Archived\",\n \"ChatList.Menu.SwitchTo.Webogram\": \"Switch to Old Version\",\n \"ChatList.Menu.SwitchTo.Z\": \"Switch to Z version\",\n \"ChatMigration.From\": \"Migrated from %s\",\n \"ChatMigration.To\": \"Migrated to %s\",\n \"ConnectionStatus.ForceReconnect\": \"force reconnect\",\n \"ConnectionStatus.ReconnectIn\": \"Reconnect in %ds, %s\",\n \"ConnectionStatus.Reconnect\": \"reconnect\",\n \"ConnectionStatus.Reconnecting\": \"Reconnecting...\",\n \"ConnectionStatus.TimedOut\": \"Request timed out, %s\",\n \"ConnectionStatus.Waiting\": \"Waiting for network...\",\n \"Contacts.Count\": {\n \"one_value\": \"%d contact\",\n \"other_value\": \"%d contacts\",\n },\n \"Deactivated.Title\": \"Too many tabs...\",\n \"Deactivated.Subtitle\": \"Telegram supports only one active tab with the app.\\nClick anywhere to continue using this tab.\",\n /* \"Drafts\": {\n \"one_value\": \"%d draft\",\n \"other_value\": \"%d drafts\",\n }, */\n \"General.Keyboard\": \"Keyboard\",\n \"General.SendShortcut.Enter\": \"Send by Enter\",\n \"General.SendShortcut.CtrlEnter\": \"Send by %s + Enter\",\n \"General.SendShortcut.NewLine.ShiftEnter\": \"New line by Shift + Enter\",\n \"General.SendShortcut.NewLine.Enter\": \"New line by Enter\",\n \"General.AutoplayMedia\": \"Auto-Play Media\",\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 \"Notifications.MessagePreview\": \"Message preview\",\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 \"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 \"Search.Chats\": \"Chats\",\n \"Search.Global\": \"Global Search\",\n \"Search.Messages\": \"Messages\",\n \"StickersTab.SearchPlaceholder\": \"Search Stickers\",\n \"ForwardedFrom\": \"Forwarded from %s\",\n \"Popup.Avatar.Title\": \"Drag to Reposition\",\n \"Popup.Unpin.AllTitle\": \"Unpin all messages\",\n \"Popup.Unpin.HideTitle\": \"Hide pinned messages\",\n \"Popup.Unpin.HideDescription\": \"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.\",\n \"Popup.Unpin.Hide\": \"Hide\",\n \"TwoStepAuth.InvalidPassword\": \"Invalid password\",\n \"TwoStepAuth.EmailCodeChangeEmail\": \"Change Email\",\n \"MarkupTooltip.LinkPlaceholder\": \"Enter URL...\",\n \"MediaViewer.Context.Download\": \"Download\",\n \"Profile\": \"Profile\",\n \"Saved\": \"Saved\",\n \"Deleted\": \"Deleted\",\n \"ReportBug\": \"Report Bug\",\n \"Notifications.Count\": {\n \"one_value\": \"%d notification\",\n \"other_value\": \"%d notifications\"\n },\n \"Notifications.Forwarded\": {\n \"one_value\": \"Forwarded %d message\",\n \"other_value\": \"Forwarded %d messages\"\n },\n \"Notifications.New\": \"New notification\",\n \"PushNotification.Action.Mute1d\": \"Mute background alerts for 1 day\",\n\t\"PushNotification.Action.Settings\": \"Background alerts settings\",\n\t\"PushNotification.Action.Mute1d.Mobile\": \"Mute for 24H\",\n\t\"PushNotification.Action.Settings.Mobile\": \"Alerts settings\",\n\t\"PushNotification.Message.NoPreview\": \"You have a new message\",\n \"LogOut.Description\": \"Are you sure you want to log out?\\n\\nNote that you can seamlessly use Telegram on all your devices at once.\",\n\t//\"PushNotification.Action.Mute1d.Success\": \"Notification settings were successfully saved.\",\n\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 \"ActionGroupCallStarted\": \"un1 started a voice chat\",\n \"ActionGroupCallStartedByYou\": \"You started a voice chat\",\n \"ActionGroupCallJustStarted\": \"Voice chat started\",\n \"ActionGroupCallEnded\": \"Voice chat ended (%s)\",\n \"ActionGroupCallInvited\": \"un1 invited un2 to the voice chat\",\n \"ActionGroupCallYouInvited\": \"You invited un2 to the voice chat\",\n \"ActionGroupCallInvitedYou\": \"un1 invited you to the voice chat\",\n \"Seconds\": {\n \"one_value\": \"%1$d second\",\n \"other_value\": \"%1$d seconds\"\n },\n \"Minutes\": {\n \"one_value\": \"%1$d minute\",\n \"other_value\": \"%1$d minutes\"\n },\n \"Hours\": {\n \"one_value\": \"%1$d hour\",\n \"other_value\": \"%1$d hours\"\n },\n \"Days\": {\n \"one_value\": \"%1$d day\",\n \"other_value\": \"%1$d days\"\n },\n \"Weeks\": {\n \"one_value\": \"%1$d week\",\n \"other_value\": \"%1$d weeks\"\n },\n \"TodayAtFormattedWithToday\": \"today at %1$s\",\n \"formatDateAtTime\": \"%1$s at %2$s\",\n \"JoinByPeekChannelTitle\": \"Join Channel\",\n \"JoinByPeekGroupTitle\": \"Join Group\",\n \"YouWereKicked\": \"you were removed\",\n \"ViaBot\": \"via\",\n \"InviteExpired\": \"This invite link has expired.\",\n \"NoUsernameFound\": \"There is no Telegram account with this username.\",\n \"PrivacyDeleteCloudDrafts\": \"Delete All Cloud Drafts\",\n \"AreYouSureClearDraftsTitle\": \"Delete cloud drafts\",\n \"AreYouSureClearDrafts\": \"Are you sure you want to delete all cloud drafts?\",\n \"BotInfoTitle\": \"What can this bot do?\",\n \"ChatYourSelf\": \"forward here to save\",\n \"GroupEmptyTitle1\": \"You have created a **group**.\",\n \"GroupEmptyTitle2\": \"Groups can have:\",\n \"GroupDescription1\": \"Up to 200,000 members\",\n \"GroupDescription2\": \"Persistent chat history\",\n \"GroupDescription3\": \"Public links such as t.me/title\",\n \"GroupDescription4\": \"Admins with different rights\",\n \"ChatYourSelfDescription1\": \"Forward messages here to save them\",\n \"ChatYourSelfDescription2\": \"Send media and files to store them\",\n \"ChatYourSelfDescription3\": \"Access this chat from any device\",\n \"ChatYourSelfDescription4\": \"Use search to quickly find things\",\n \"ChatYourSelfTitle\": \"Your cloud storage\",\n \"ActionYouCreateGroup\": \"You created the group\",\n \"NoMessages\": \"No messages here yet...\",\n \"NoScheduledMessages\": \"No scheduled messages here yet...\",\n \"NoMessagesGreetingsDescription\": \"Send a message or tap the greeting below.\",\n \"InviteToGroupError\": \"Sorry, you can\\'t add this user to groups because of user\\'s privacy settings.\",\n \"InviteToChannelError\": \"Sorry, you can\\'t add this user to channels because of user\\'s privacy settings.\",\n \"AddMembersAlertTitle\": \"Add %1$s\",\n \"AddOneMemberAlertTitle\": \"Add member\",\n \"AddMembersAlertNamesText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersAlertCountText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersForwardMessages\": \"Show the last 100 messages to the new members\",\n \"AddOneMemberForwardMessages\": \"Show the last 100 messages to **%1$s**\",\n \"PinToTopLimitReached2\": \"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.\",\n \"FiltersSetupPinAlert\": \"Set Up Folders\",\n \"AppName\": \"Telegram\",\n \"OK\": \"OK\",\n \"PinFolderLimitReached\": \"Sorry, you can\\'t pin any more chats to the top.\",\n \"Send\": \"Send\",\n \"ChannelJoin\": \"JOIN\",\n \"Yesterday\": \"yesterday\",\n \"LeaveAComment\": \"Leave a comment\",\n \"ViewInChat\": \"View in chat\",\n \"LinkNotFound\": \"Unfortunately, you can\\'t access this message. You are not a member of the chat where it was posted.\",\n \"Create\": \"Create\",\n \"ViewDiscussion\": \"View discussion\",\n \"MessageScheduledUntilOnline\": \"Scheduled until online\",\n \"ReportChat\": \"Report\",\n \"ReportChatSpam\": \"Spam\",\n // \"ReportChatFakeAccount\": \"Fake Account\",\n \"ReportChatViolence\": \"Violence\",\n \"ReportChatPornography\": \"Pornography\",\n \"ReportChatChild\": \"Child Abuse\",\n \"ReportChatOther\": \"Other\",\n \"ReportChatDescription\": \"Description\",\n \"ReportInfo\": \"Please enter any additional details relevant to your report.\",\n \"ReportSentInfo\": \"Telegram moderators will review your report.\\nThank you for your cooperation!\",\n \"ReportHint\": \"Additional details...\",\n \"ChatHistory\": \"Chat history for new members\",\n \"ShareContact\": \"Share contact\",\n \"SendMessageTitle\": \"Send message\",\n \"SendContactToGroupText\": \"Do you want to send this contact to **%1$s**?\",\n \"ChannelBroadcast\": \"Broadcast\",\n \"ChannelSilentBroadcast\": \"Silent Broadcast\",\n \"Comment\": \"Comment\",\n \"SendAnonymously\": \"Send anonymously\",\n \"DiscardVoiceMessageTitle\": \"Discard Voice Message\",\n \"DiscardVoiceMessageDescription\": \"Are you sure you want to stop recording and discard your voice message?\",\n \"DiscardVoiceMessageAction\": \"Discard\",\n \"AddContact\": \"Add to contacts\",\n \"BlockUser\": \"Block user\",\n \"MobileHidden\": \"Mobile hidden\",\n \"MobileHiddenExceptionInfo\": \"Phone number will be visible once %1$s adds you as a contact.\",\n \"FirstName\": \"First name (required)\",\n \"LastName\": \"Last name (optional)\",\n \"AreYouSureBlockContact2\": \"Are you sure you want to block **%1$s**?\",\n \"UserBlocked\": \"User blocked\",\n \"UserUnblocked\": \"User unblocked\",\n \"AudioUnknownArtist\": \"Unknown artist\",\n \"AudioUnknownTitle\": \"Unknown title\",\n \"LogOut\": \"Log out\",\n \"OnlineCount\": {\n \"one_value\": \"%1$d online\",\n \"other_value\": \"%1$d online\"\n },\n \"EditedMessage\": \"edited\",\n\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 \"Bio.Description\": \"Any details such as age, occupation or city.\\nExample: 23 y.o. designer from San Francisco\",\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.Date.ScheduledFor\": \"Scheduled for %@\",\n \"Chat.Date.ScheduledForToday\": \"Scheduled for today\",\n \"Chat.DropTitle\": \"Drop files here to send them\",\n \"Chat.DropQuickDesc\": \"in a quick way\",\n \"Chat.DropAsFilesDesc\": \"without compression\",\n \"Chat.Edit.Cancel.Text\": \"Are you sure you want to discard all changes?\",\n \"Chat.Service.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.VoiceChatFinished\": \"%1$@ ended the voice chat (%2$@)\",\n \"Chat.Service.VoiceChatFinishedYou\": \"You ended the voice chat (%@)\",\n //\"Chat.Service.VoiceChatScheduled\": \"%1$@ scheduled a [voice chat](open) for %2$@\",\n //\"Chat.Service.VoiceChatScheduledYou\": \"You scheduled a [voice chat](open) for %1$@\",\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.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 \"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.Call.Cancelled\": \"Cancelled Call\",\n \"ChatList.Service.Call.Missed\": \"Missed Call\",\n \"ChatList.Service.VoiceChatScheduled\": \"%1$@ scheduled a voice chat for %2$@\",\n \"ChatList.Service.VoiceChatScheduledYou\": \"You scheduled a voice chat for %2$@\",\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.AllChats\": \"All Chats\",\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 \"Channel.DescriptionHolderDescrpiton\": \"You can provide an optional description for your channel.\",\n \"CreateGroup.NameHolder\": \"Group Name\",\n \"Date.Today\": \"Today\",\n \"DeleteChat.DeleteGroupForAll\": \"Delete for all members\",\n \"DeleteChannelForAll\": \"Delete for all subscribers\",\n \"EditAccount.Username\": \"Username\",\n \"EditAccount.Title\": \"Edit Profile\",\n \"EditAccount.Logout\": \"Log Out\",\n \"Emoji.Recent\": \"Frequently Used\",\n \"Emoji.SmilesAndPeople\": \"Smileys & People\",\n \"Emoji.AnimalsAndNature\": \"Animals & Nature\",\n \"Emoji.FoodAndDrink\": \"Food & Drink\",\n \"Emoji.ActivityAndSport\": \"Activity & Sport\",\n \"Emoji.TravelAndPlaces\": \"Travel & Places\",\n \"Emoji.Objects\": \"Objects\",\n //\"Emoji.Symbols\": \"Symbols\",\n \"Emoji.Flags\": \"Flags\",\n \"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 \"Modal.Send\": \"Send\",\n \"Telegram.GeneralSettingsViewController\": \"General Settings\",\n \"Telegram.InstalledStickerPacksController\": \"Stickers\",\n \"Telegram.NotificationSettingsViewController\": \"Notifications\",\n \"Telegram.LanguageViewController\": \"Language\",\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 \"InstalledStickers.LoopAnimated\": \"Loop Animated Stickers\",\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.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.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 \"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 \"Message.Context.Select\": \"Select\",\n \"Message.Context.Pin\": \"Pin\",\n \"Message.Context.Unpin\": \"Unpin\",\n \"Message.Context.Goto\": \"Show Message\",\n \"MessageContext.CopyMessageLink1\": \"Copy Message Link\",\n \"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 \"GeneralSettings.BigEmoji\": \"Large Emoji\",\n \"GeneralSettings.EmojiPrediction\": \"Suggest Emoji\",\n \"GroupPermission.Delete\": \"Delete Exception\",\n \"ScheduleController.at\": \"at\",\n \"Schedule.SendToday\": \"Send today at %@\",\n \"Schedule.SendDate\": \"Send on %@ at %@\",\n \"Schedule.SendWhenOnline\": \"Send When Online\",\n \"Stickers.Recent\": \"Recent\",\n //\"Stickers.Favorite\": \"Favorite\",\n \"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};\n\nexport default lang;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/7.eebe55366b507a8f74c2.chunk.js b/public/7.eebe55366b507a8f74c2.chunk.js new file mode 100644 index 000000000..a59ed4d52 --- /dev/null +++ b/public/7.eebe55366b507a8f74c2.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[7],{143:function(e,t,o){"use strict";o.r(t);t.default={Animations:"Animations",AttachAlbum:"Album","Appearance.Color.Hex":"HEX","Appearance.Color.RGB":"RGB","BlockModal.Search.Placeholder":"Block user...",DarkMode:"Dark Mode",FilterIncludeExcludeInfo:"Choose chats and types of chats that will\nappear and never appear in this folder.",FilterNameInputLabel:"Folder Name",FilterMenuDelete:"Delete Folder",FilterHeaderEdit:"Edit Folder",FilterAllGroups:"All Groups",FilterAllContacts:"All Contacts",FilterAllNonContacts:"All Non-Contacts",FilterAllChannels:"All Channels",FilterAllBots:"All Bots",WordDelimiter:", ",WordDelimiterLast:" and ","EditContact.OriginalName":"original name","EditProfile.FirstNameLabel":"Name","EditProfile.BioLabel":"Bio (optional)","EditProfile.Username.Label":"Username (optional)","EditProfile.Username.Available":"Username is available","EditProfile.Username.Taken":"Username is already taken","EditProfile.Username.Invalid":"Username is invalid","ExceptionModal.Search.Placeholder":"Add exception...","Chat.Menu.SelectMessages":"Select Messages","Chat.Menu.ClearSelection":"Clear Selection","Chat.Menu.Hint":"To **edit** or **reply**, close this menu.\nThen tap next to a message.","Chat.Input.UnpinAll":"Unpin All Messages","Chat.Input.Attach.PhotoOrVideo":"Photo or Video","Chat.Input.Attach.Document":"Document","Chat.Subscribe":"SUBSCRIBE","Chat.Selection.LimitToast":"Max selection count reached.","Chat.Search.MessagesFound":{one_value:"%d message found",other_value:"%d messages found"},"Chat.Search.NoMessagesFound":"No messages found","Chat.Search.PrivateSearch":"Private Search","ChatList.Main.EmptyPlaceholder.Title":"Your chats will appear here","ChatList.Main.EmptyPlaceholder.Subtitle":"You have %s on Telegram","ChatList.Main.EmptyPlaceholder.SubtitleNoContacts":"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts","ChatList.Menu.SwitchTo.Webogram":"Switch to Old Version","ChatList.Menu.SwitchTo.Z":"Switch to Z version","ChatMigration.From":"Migrated from %s","ChatMigration.To":"Migrated to %s","ConnectionStatus.ForceReconnect":"force reconnect","ConnectionStatus.ReconnectIn":"Reconnect in %ds, %s","ConnectionStatus.Reconnect":"reconnect","ConnectionStatus.Reconnecting":"Reconnecting...","ConnectionStatus.TimedOut":"Request timed out, %s","ConnectionStatus.Waiting":"Waiting for network...","Contacts.Count":{one_value:"%d contact",other_value:"%d contacts"},"Deactivated.Title":"Too many tabs...","Deactivated.Subtitle":"Telegram supports only one active tab with the app.\nClick anywhere to continue using this tab.","General.Keyboard":"Keyboard","General.SendShortcut.Enter":"Send by Enter","General.SendShortcut.CtrlEnter":"Send by %s + Enter","General.SendShortcut.NewLine.ShiftEnter":"New line by Shift + Enter","General.SendShortcut.NewLine.Enter":"New line by Enter","General.AutoplayMedia":"Auto-Play Media","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","Notifications.MessagePreview":"Message preview",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","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","Search.Chats":"Chats","Search.Global":"Global Search","Search.Messages":"Messages","StickersTab.SearchPlaceholder":"Search Stickers",ForwardedFrom:"Forwarded from %s","Popup.Avatar.Title":"Drag to Reposition","Popup.Unpin.AllTitle":"Unpin all messages","Popup.Unpin.HideTitle":"Hide pinned messages","Popup.Unpin.HideDescription":"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.","Popup.Unpin.Hide":"Hide","TwoStepAuth.InvalidPassword":"Invalid password","TwoStepAuth.EmailCodeChangeEmail":"Change Email","MarkupTooltip.LinkPlaceholder":"Enter URL...","MediaViewer.Context.Download":"Download",Profile:"Profile",Saved:"Saved",Deleted:"Deleted",ReportBug:"Report Bug","Notifications.Count":{one_value:"%d notification",other_value:"%d notifications"},"Notifications.Forwarded":{one_value:"Forwarded %d message",other_value:"Forwarded %d messages"},"Notifications.New":"New notification","PushNotification.Action.Mute1d":"Mute background alerts for 1 day","PushNotification.Action.Settings":"Background alerts settings","PushNotification.Action.Mute1d.Mobile":"Mute for 24H","PushNotification.Action.Settings.Mobile":"Alerts settings","PushNotification.Message.NoPreview":"You have a new message","LogOut.Description":"Are you sure you want to log out?\n\nNote that you can seamlessly use Telegram on all your devices at once.",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",ActionGroupCallInvited:"un1 invited un2 to the voice chat",ActionGroupCallYouInvited:"You invited un2 to the voice chat",ActionGroupCallInvitedYou:"un1 invited you to the voice chat",Seconds:{one_value:"%1$d second",other_value:"%1$d seconds"},Minutes:{one_value:"%1$d minute",other_value:"%1$d minutes"},Hours:{one_value:"%1$d hour",other_value:"%1$d hours"},Days:{one_value:"%1$d day",other_value:"%1$d days"},Weeks:{one_value:"%1$d week",other_value:"%1$d weeks"},TodayAtFormattedWithToday:"today at %1$s",formatDateAtTime:"%1$s at %2$s",JoinByPeekChannelTitle:"Join Channel",JoinByPeekGroupTitle:"Join Group",YouWereKicked:"you were removed",ViaBot:"via",InviteExpired:"This invite link has expired.",NoUsernameFound:"There is no Telegram account with this username.",PrivacyDeleteCloudDrafts:"Delete All Cloud Drafts",AreYouSureClearDraftsTitle:"Delete cloud drafts",AreYouSureClearDrafts:"Are you sure you want to delete all cloud drafts?",BotInfoTitle:"What can this bot do?",ChatYourSelf:"forward here to save",GroupEmptyTitle1:"You have created a **group**.",GroupEmptyTitle2:"Groups can have:",GroupDescription1:"Up to 200,000 members",GroupDescription2:"Persistent chat history",GroupDescription3:"Public links such as t.me/title",GroupDescription4:"Admins with different rights",ChatYourSelfDescription1:"Forward messages here to save them",ChatYourSelfDescription2:"Send media and files to store them",ChatYourSelfDescription3:"Access this chat from any device",ChatYourSelfDescription4:"Use search to quickly find things",ChatYourSelfTitle:"Your cloud storage",ActionYouCreateGroup:"You created the group",NoMessages:"No messages here yet...",NoScheduledMessages:"No scheduled messages here yet...",NoMessagesGreetingsDescription:"Send a message or tap the greeting below.",InviteToGroupError:"Sorry, you can't add this user to groups because of user's privacy settings.",InviteToChannelError:"Sorry, you can't add this user to channels because of user's privacy settings.",AddMembersAlertTitle:"Add %1$s",AddOneMemberAlertTitle:"Add member",AddMembersAlertNamesText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersAlertCountText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersForwardMessages:"Show the last 100 messages to the new members",AddOneMemberForwardMessages:"Show the last 100 messages to **%1$s**",PinToTopLimitReached2:"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.",FiltersSetupPinAlert:"Set Up Folders",AppName:"Telegram",OK:"OK",PinFolderLimitReached:"Sorry, you can't pin any more chats to the top.",Send:"Send",ChannelJoin:"JOIN",Yesterday:"yesterday",LeaveAComment:"Leave a comment",ViewInChat:"View in chat",LinkNotFound:"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.",Create:"Create",ViewDiscussion:"View discussion",MessageScheduledUntilOnline:"Scheduled until online",ReportChat:"Report",ReportChatSpam:"Spam",ReportChatViolence:"Violence",ReportChatPornography:"Pornography",ReportChatChild:"Child Abuse",ReportChatOther:"Other",ReportChatDescription:"Description",ReportInfo:"Please enter any additional details relevant to your report.",ReportSentInfo:"Telegram moderators will review your report.\nThank you for your cooperation!",ReportHint:"Additional details...",ChatHistory:"Chat history for new members",ShareContact:"Share contact",SendMessageTitle:"Send message",SendContactToGroupText:"Do you want to send this contact to **%1$s**?",ChannelBroadcast:"Broadcast",ChannelSilentBroadcast:"Silent Broadcast",Comment:"Comment",SendAnonymously:"Send anonymously",DiscardVoiceMessageTitle:"Discard Voice Message",DiscardVoiceMessageDescription:"Are you sure you want to stop recording and discard your voice message?",DiscardVoiceMessageAction:"Discard",AddContact:"Add to contacts",BlockUser:"Block user",MobileHidden:"Mobile hidden",MobileHiddenExceptionInfo:"Phone number will be visible once %1$s adds you as a contact.",FirstName:"First name (required)",LastName:"Last name (optional)",AreYouSureBlockContact2:"Are you sure you want to block **%1$s**?",UserBlocked:"User blocked",UserUnblocked:"User unblocked",AudioUnknownArtist:"Unknown artist",AudioUnknownTitle:"Unknown title",LogOut:"Log out",OnlineCount:{one_value:"%1$d online",other_value:"%1$d online"},EditedMessage:"edited","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","Bio.Description":"Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco","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$@"?',"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.Date.ScheduledFor":"Scheduled for %@","Chat.Date.ScheduledForToday":"Scheduled for today","Chat.DropTitle":"Drop files here to send them","Chat.DropQuickDesc":"in a quick way","Chat.DropAsFilesDesc":"without compression","Chat.Edit.Cancel.Text":"Are you sure you want to discard all changes?","Chat.Service.PeerJoinedTelegram":"%@ joined Telegram","Chat.Service.Channel.UpdatedTitle":'Channel renamed to "%@"',"Chat.Service.Channel.UpdatedPhoto":"Channel photo updated","Chat.Service.Channel.RemovedPhoto":"Channel photo removed","Chat.Service.Channel.UpdatedVideo":"Channel video updated","Chat.Service.BotPermissionAllowed":"You allowed this bot to message you when you logged in on %@","Chat.Service.Group.UpdatedPinnedMessage":'%@ pinned "%@"',"Chat.Service.VoiceChatStarted":"%1$@ started a [video chat](open)","Chat.Service.VoiceChatStartedYou":"You started a [video chat](open)","Chat.Service.VoiceChatStarted.Channel":"[Live Stream](open) started","Chat.Service.VoiceChatFinished":"%1$@ ended the video chat (%2$@)","Chat.Service.VoiceChatFinishedYou":"You ended the video chat (%@)","Chat.Service.VoiceChatFinished.Channel":"Live Stream ended (%1$@)","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.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?"},"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.Call.Cancelled":"Cancelled Call","ChatList.Service.Call.Missed":"Missed 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.AllChats":"All 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.","Channel.DescriptionHolderDescrpiton":"You can provide an optional description for your channel.","CreateGroup.NameHolder":"Group Name","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","EditAccount.Username":"Username","EditAccount.Title":"Edit Profile","EditAccount.Logout":"Log Out","Emoji.Recent":"Frequently Used","Emoji.SmilesAndPeople":"Smileys & People","Emoji.AnimalsAndNature":"Animals & Nature","Emoji.FoodAndDrink":"Food & Drink","Emoji.ActivityAndSport":"Activity & Sport","Emoji.TravelAndPlaces":"Travel & Places","Emoji.Objects":"Objects","Emoji.Flags":"Flags","LastSeen.HoursAgo":{one_value:"last seen %d hour ago",other_value:"last seen %d hours ago"},"Login.Register.LastName.Placeholder":"Last Name","Modal.Send":"Send","Telegram.GeneralSettingsViewController":"General Settings","Telegram.InstalledStickerPacksController":"Stickers","Telegram.NotificationSettingsViewController":"Notifications","Telegram.LanguageViewController":"Language","Stickers.SearchAdd":"Add","Stickers.SearchAdded":"Added","Stickers.SuggestStickers":"Suggest Stickers by Emoji","ShareModal.Search.Placeholder":"Share to...","ShareModal.Search.ForwardPlaceholder":"Forward to...","InstalledStickers.LoopAnimated":"Loop Animated Stickers","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.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.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.","Message.Context.Select":"Select","Message.Context.Pin":"Pin","Message.Context.Unpin":"Unpin","Message.Context.Goto":"Show Message","MessageContext.CopyMessageLink1":"Copy Message Link","NewPoll.Anonymous":"Anonymous Voting","NewPoll.Explanation.Placeholder":"Add a Comment (Optional)","NewPoll.OptionsAddOption":"Add an Option","NewPoll.MultipleChoice":"Multiple Answers","NewPoll.Quiz":"Quiz Mode","GeneralSettings.BigEmoji":"Large Emoji","GeneralSettings.EmojiPrediction":"Suggest Emoji","GroupPermission.Delete":"Delete Exception","ScheduleController.at":"at","Schedule.SendToday":"Send today at %@","Schedule.SendDate":"Send on %@ at %@","Schedule.SendWhenOnline":"Send When Online","Stickers.Recent":"Recent","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","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."}}}]); +//# sourceMappingURL=7.eebe55366b507a8f74c2.chunk.js.map \ No newline at end of file diff --git a/public/7.eebe55366b507a8f74c2.chunk.js.map b/public/7.eebe55366b507a8f74c2.chunk.js.map new file mode 100644 index 000000000..836f266ea --- /dev/null +++ b/public/7.eebe55366b507a8f74c2.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/lang.ts"],"names":[],"mappings":"sFAAA,OA46Be,UA56BF,CACX,WAAc,aACd,YAAe,QACf,uBAAwB,MACxB,uBAAwB,MACxB,gCAAiC,gBACjC,SAAY,YACZ,yBAA4B,qFAC5B,qBAAwB,cACxB,iBAAoB,gBACpB,iBAAoB,cACpB,gBAAmB,aACnB,kBAAqB,eACrB,qBAAwB,mBACxB,kBAAqB,eACrB,cAAiB,WACjB,cAAiB,KACjB,kBAAqB,QACrB,2BAA4B,gBAC5B,6BAA8B,OAC9B,uBAAwB,iBACxB,6BAA8B,sBAC9B,iCAAkC,wBAClC,6BAA8B,4BAC9B,+BAAgC,sBAChC,oCAAqC,mBACrC,2BAA4B,kBAC5B,2BAA4B,kBAC5B,iBAAkB,0EAClB,sBAAuB,qBACvB,iCAAkC,iBAClC,6BAA8B,WAC9B,iBAAkB,YAClB,4BAA6B,+BAC7B,4BAA6B,CAC3B,UAAa,mBACb,YAAe,qBAEjB,8BAA+B,oBAC/B,4BAA6B,iBAC7B,uCAAwC,8BACxC,0CAA2C,0BAC3C,oDAAqD,sIAErD,kCAAmC,wBACnC,2BAA4B,sBAC5B,qBAAsB,mBACtB,mBAAoB,iBACpB,kCAAmC,kBACnC,+BAAgC,uBAChC,6BAA8B,YAC9B,gCAAiC,kBACjC,4BAA6B,wBAC7B,2BAA4B,yBAC5B,iBAAkB,CAChB,UAAa,aACb,YAAe,eAEjB,oBAAqB,mBACrB,uBAAwB,kGAKxB,mBAAoB,WACpB,6BAA8B,gBAC9B,iCAAkC,qBAClC,0CAA2C,4BAC3C,qCAAsC,oBACtC,wBAAyB,kBACzB,qBAAsB,cACtB,yBAA0B,UAC1B,yBAA0B,UAC1B,iCAAkC,mBAClC,sBAAuB,uBACvB,sBAAuB,qBACvB,+BAAgC,kBAChC,eAAkB,mBAClB,sBAAuB,YACvB,iCAAkC,gBAClC,kCAAmC,kBACnC,mCAAoC,kBACpC,oCAAqC,mBACrC,oCAAqC,oBACrC,mBAAoB,UACpB,oBAAqB,WACrB,qCAAsC,uBACtC,2BAA4B,cAC5B,0BAA2B,CACzB,UAAa,aACb,YAAe,kBAEjB,oBAAqB,qBACrB,kBAAmB,CACjB,UAAa,cACb,YAAe,gBAEjB,2BAA4B,oBAC5B,kCAAmC,yBACnC,2BAA4B,gBAC5B,8BAA+B,CAC7B,UAAa,eACb,YAAe,iBAEjB,iBAAkB,oBAClB,aAAc,wBACd,eAAgB,kBAChB,eAAgB,QAChB,gBAAiB,gBACjB,kBAAmB,WACnB,gCAAiC,kBACjC,cAAiB,oBACjB,qBAAsB,qBACtB,uBAAwB,qBACxB,wBAAyB,uBACzB,8BAA+B,gGAC/B,mBAAoB,OACpB,8BAA+B,mBAC/B,mCAAoC,eACpC,gCAAiC,eACjC,+BAAgC,WAChC,QAAW,UACX,MAAS,QACT,QAAW,UACX,UAAa,aACb,sBAAuB,CACrB,UAAa,kBACb,YAAe,oBAEjB,0BAA2B,CACzB,UAAa,uBACb,YAAe,yBAEjB,oBAAqB,mBACrB,iCAAkC,mCACnC,mCAAoC,6BACpC,wCAAyC,eACzC,0CAA2C,kBAC3C,qCAAsC,yBACrC,qBAAsB,8GAItB,gBAAmB,UACnB,oBAAuB,kBACvB,kBAAqB,wBACrB,mBAAsB,oCACtB,mBAAsB,8BACtB,mBAAsB,8BACtB,mBAAsB,8BACtB,cAAiB,gBACjB,kBAAqB,4BACrB,qBAAwB,4BACxB,sBAAyB,uBACzB,eAAkB,qBAClB,eAAkB,kBAClB,iBAAoB,uCACpB,mBAAsB,uBACtB,uBAA0B,0CAC1B,gBAAmB,kBACnB,iBAAoB,kBACpB,sBAAyB,yBACzB,uBAA0B,yBAC1B,SAAY,CACV,UAAa,iBACb,YAAe,mBAEjB,YAAe,QACf,YAAe,QACf,UAAa,MACb,eAAkB,WAClB,mBAAsB,gBACtB,cAAiB,UAEjB,cAAiB,UACjB,YAAe,gBACf,YAAe,gBACf,WAAc,OACd,IAAO,MAEP,kBAAqB,wBACrB,iBAAoB,eACpB,+BAAkC,yBAClC,uBAA0B,cAC1B,kBAAqB,qBACrB,MAAS,QACT,iBAAoB,gBACpB,gBAAmB,gBACnB,cAAiB,iBACjB,cAAiB,iBACjB,gBAAmB,aACnB,YAAe,QACf,UAAa,aACb,QAAW,UACX,kBAAqB,sBACrB,oBAAuB,CACrB,UAAa,sBACb,YAAe,wBAEjB,sBAAyB,CACvB,UAAa,oBACb,YAAe,2BAEjB,QAAW,MACX,IAAO,MACP,MAAS,CACP,UAAa,YACb,YAAe,cAEjB,SAAY,CACV,UAAa,eACb,YAAe,iBAEjB,SAAY,CACV,UAAa,eACb,YAAe,iBAEjB,OAAU,CACR,UAAa,aACb,YAAe,eAEjB,MAAS,CACP,UAAa,YACb,YAAe,cAEjB,QAAW,CACT,UAAa,cACb,YAAe,gBAEjB,SAAY,CACV,UAAa,eACb,YAAe,iBAEjB,iBAAoB,yCACpB,WAAc,cACd,SAAY,YACZ,SAAY,WACZ,cAAiB,iBACjB,SAAY,WACZ,aAAgB,OAChB,QAAW,UACX,SAAY,oBACZ,eAAkB,kBAClB,iBAAoB,oBACpB,kBAAqB,sBACrB,qBAAwB,WACxB,yBAA4B,gBAC5B,uBAA0B,cAC1B,qBAAwB,WACxB,YAAe,OACf,cAAiB,SACjB,uBAA0B,2BAC1B,6BAAgC,kCAChC,yBAA4B,6BAC5B,0BAA6B,gBAC7B,oBAAuB,SACvB,sBAAyB,WACzB,mBAAsB,QACtB,aAAgB,iBAChB,WAAc,eACd,cAAiB,0BACjB,QAAW,aACX,QAAW,UACX,aAAgB,gBAChB,iBAAoB,sFACpB,aAAgB,OAChB,oBAAuB,wBACvB,yBAA4B,wBAC5B,cAAiB,iBACjB,oBAAuB,CACrB,UAAa,iBACb,YAAe,wBAGjB,kBAAqB,aACrB,gBAAmB,qBACnB,gBAAmB,uBACnB,aAAgB,UAChB,aAAgB,eAChB,kBAAqB,+BACrB,mBAAsB,gCACtB,iBAAoB,mFACpB,kBAAqB,sGACrB,oBAAuB,iBACvB,yBAA4B,0CAC5B,iBAAoB,eACpB,qBAAwB,gEACxB,UAAa,YACb,kBAAqB,qBACrB,cAAiB,mCACjB,cAAiB,kBACjB,eAAkB,cAClB,qBAAwB,+BACxB,qBAAwB,mDACxB,cAAiB,kBACjB,8BAAiC,gDACjC,4BAA+B,kDAC/B,kCAAqC,6DACrC,gCAAmC,+DACnC,4BAA+B,gEAC/B,sCAAyC,sDACzC,iCAAoC,0DACpC,uBAA0B,oBAC1B,wBAA2B,qBAC3B,mBAAsB,yDACtB,UAAa,YACb,aAAgB,mBAChB,YAAe,iCACf,cAAiB,iBACjB,OAAU,SACV,eAAkB,sBAClB,QAAW,UACX,UAAa,YACb,OAAU,SACV,MAAS,QACT,KAAQ,OACR,QAAW,UACX,SAAY,YACZ,KAAQ,OACR,OAAU,SACV,WAAc,2BACd,sBAAyB,qDACzB,gBAAmB,cACnB,cAAiB,gBAEjB,WAAc,eACd,QAAW,UACX,QAAW,UACX,KAAQ,OACR,gBAAmB,QACnB,gBAAmB,QAGnB,gBAAmB,QACnB,gBAAmB,QACnB,gBAAmB,QAEnB,QAAW,WACX,YAAe,eACf,aAAgB,iBAChB,qBAAwB,2FACxB,wBAA2B,cAC3B,YAAe,4BACf,eAAkB,gCAElB,UAAa,2BACb,QAAW,MACX,SAAY,WACZ,MAAS,QACT,cAAiB,gBACjB,wBAA2B,gDAC3B,wBAA2B,uDAC3B,+BAAkC,+CAClC,cAAiB,iBACjB,UAAa,aACb,YAAe,eACf,YAAe,UACf,WAAc,SACd,iBAAoB,UACpB,gBAAmB,SACnB,aAAgB,UAChB,WAAc,eACd,eAAkB,eAClB,oBAAuB,yBACvB,cAAiB,iBACjB,kBAAqB,iBACrB,mBAAsB,cACtB,yBAA4B,qCAC5B,oBAAuB,gBACvB,oBAAuB,gBACvB,eAAkB,mBAClB,iBAAoB,mBACpB,yBAA4B,+DAC5B,sBAAyB,yBACzB,qBAAwB,gBACxB,qBAAwB,gBACxB,0BAA6B,aAC7B,0BAA6B,aAC7B,6BAAgC,yBAChC,2BAA8B,cAC9B,2BAA8B,mBAC9B,4BAA+B,eAC/B,4BAA+B,YAE/B,uBAA0B,sBAC1B,4BAA+B,WAC/B,4BAA+B,WAC/B,+BAAkC,qBAClC,6BAAgC,iBAChC,6BAAgC,oBAChC,8BAAiC,UACjC,8BAAiC,kBACjC,sBAAyB,4BACzB,cAAiB,iBACjB,WAAc,eAEd,kBAAqB,gEACrB,eAAkB,mGAClB,eAAkB,kBAClB,YAAe,gBACf,mBAAsB,0DACtB,gBAAmB,gFACnB,uBAA0B,yFAC1B,oBAAuB,uFACvB,aAAgB,SAChB,WAAc,cACd,YAAe,6GACf,kBAAqB,OACrB,YAAe,CACb,UAAa,kBACb,YAAe,oBAEjB,gBAAmB,cACnB,gBAAmB,iCACnB,qBAAwB,cACxB,uBAA0B,mDAC1B,oBAAuB,0DACvB,uBAA0B,gBAC1B,kBAAqB,qCACrB,UAAa,qBACb,WAAc,MACd,aAAgB,QAChB,WAAc,oBACd,oBAAuB,cACvB,0BAA6B,iBAC7B,qBAAwB,qBACxB,yBAA4B,uBAC5B,aAAgB,yBAChB,wBAA2B,kHAC3B,aAAgB,gBAChB,iBAAoB,gBACpB,0BAA6B,2CAC7B,cAAiB,cACjB,eAAkB,cAClB,2BAA8B,sBAC9B,yBAA4B,mBAC5B,sBAAyB,yBACzB,SAAY,WACZ,cAAiB,OACjB,qBAAwB,UACxB,yBAA4B,oIAC5B,6BAAgC,mBAChC,wBAA2B,kDAC3B,QAAW,UACX,+BAAkC,eAClC,+BAAkC,gBAClC,mCAAsC,6GACtC,0CAA6C,qBAC7C,cAAiB,iBACjB,mBAAsB,iBACtB,WAAc,cACd,oBAAuB,4CACvB,iBAAoB,WACpB,oBAAuB,cACvB,SAAY,CACV,UAAa,eACb,YAAe,iBAEjB,WAAc,qCACd,iBAAoB,oBACpB,SAAY,cACZ,KAAQ,OACR,aAAgB,YAChB,cAAiB,4BACjB,uBAA0B,kBAC1B,2BAA8B,4CAC9B,cAAiB,UACjB,OAAU,qBACV,YAAe,0BACf,aAAgB,2BAChB,aAAgB,4BAChB,OAAU,SACV,oBAAuB,WACvB,wBAA2B,aAC3B,QAAW,sBACX,OAAU,SACV,GAAM,eACN,SAAY,aACZ,SAAY,cACZ,MAAS,QACT,gBAAmB,cACnB,WAAc,kBACd,uBAA0B,oCAC1B,0BAA6B,oCAC7B,0BAA6B,oCAC7B,QAAW,CACT,UAAa,cACb,YAAe,gBAEjB,QAAW,CACT,UAAa,cACb,YAAe,gBAEjB,MAAS,CACP,UAAa,YACb,YAAe,cAEjB,KAAQ,CACN,UAAa,WACb,YAAe,aAEjB,MAAS,CACP,UAAa,YACb,YAAe,cAEjB,0BAA6B,gBAC7B,iBAAoB,eACpB,uBAA0B,eAC1B,qBAAwB,aACxB,cAAiB,mBACjB,OAAU,MACV,cAAiB,gCACjB,gBAAmB,mDACnB,yBAA4B,0BAC5B,2BAA8B,sBAC9B,sBAAyB,oDACzB,aAAgB,wBAChB,aAAgB,uBAChB,iBAAoB,gCACpB,iBAAoB,mBACpB,kBAAqB,wBACrB,kBAAqB,0BACrB,kBAAqB,kCACrB,kBAAqB,+BACrB,yBAA4B,qCAC5B,yBAA4B,qCAC5B,yBAA4B,mCAC5B,yBAA4B,oCAC5B,kBAAqB,qBACrB,qBAAwB,wBACxB,WAAc,0BACd,oBAAuB,oCACvB,+BAAkC,4CAClC,mBAAsB,+EACtB,qBAAwB,iFACxB,qBAAwB,WACxB,uBAA0B,aAC1B,yBAA4B,iDAC5B,yBAA4B,iDAC5B,0BAA6B,gDAC7B,4BAA+B,yCAC/B,sBAAyB,uHACzB,qBAAwB,iBACxB,QAAW,WACX,GAAM,KACN,sBAAyB,kDACzB,KAAQ,OACR,YAAe,OACf,UAAa,YACb,cAAiB,kBACjB,WAAc,eACd,aAAgB,sGAChB,OAAU,SACV,eAAkB,kBAClB,4BAA+B,yBAC/B,WAAc,SACd,eAAkB,OAElB,mBAAsB,WACtB,sBAAyB,cACzB,gBAAmB,cACnB,gBAAmB,QACnB,sBAAyB,cACzB,WAAc,+DACd,eAAkB,gFAClB,WAAc,wBACd,YAAe,+BACf,aAAgB,gBAChB,iBAAoB,eACpB,uBAA0B,gDAC1B,iBAAoB,YACpB,uBAA0B,mBAC1B,QAAW,UACX,gBAAmB,mBACnB,yBAA4B,wBAC5B,+BAAkC,0EAClC,0BAA6B,UAC7B,WAAc,kBACd,UAAa,aACb,aAAgB,gBAChB,0BAA6B,gEAC7B,UAAa,wBACb,SAAY,uBACZ,wBAA2B,2CAC3B,YAAe,eACf,cAAiB,iBACjB,mBAAsB,iBACtB,kBAAqB,gBACrB,OAAU,UACV,YAAe,CACb,UAAa,cACb,YAAe,eAEjB,cAAiB,SAGjB,0BAA2B,eAC3B,gCAAiC,2BACjC,qCAAsC,uBACtC,2BAA4B,WAC5B,yBAA0B,0CAC1B,wBAAyB,UACzB,mBAAoB,oBACpB,kBAAmB,6FACnB,oCAAqC,yBACrC,0CAA2C,4DAC3C,oCAAqC,uEACrC,+BAAgC,0FAChC,6BAA8B,oFAC9B,yBAA0B,CACxB,UAAa,kBACb,YAAe,uBAEjB,6BAA8B,MAC9B,8BAA+B,OAC/B,wBAAyB,CACvB,UAAa,yCACb,YAAe,+CAEjB,oCAAqC,0BACrC,kCAAmC,CACjC,UAAa,qBACb,YAAe,uBAEjB,kCAAmC,CACjC,UAAa,qBACb,YAAe,uBAEjB,wCAAyC,CACvC,UAAa,eACb,YAAe,iBAEjB,wCAAyC,CACvC,UAAa,eACb,YAAe,iBAEjB,wBAAyB,qBACzB,qBAAsB,wCACtB,yBAA0B,mBAC1B,8BAA+B,sBAC/B,iBAAkB,+BAClB,qBAAsB,iBACtB,uBAAwB,sBACxB,wBAAyB,gDACzB,kCAAmC,qBACnC,oCAAqC,0BACrC,oCAAqC,wBACrC,oCAAqC,wBACrC,oCAAqC,wBACrC,oCAAqC,+DACrC,0CAA2C,iBAC3C,gCAAiC,oCACjC,mCAAoC,mCACpC,wCAAyC,8BACzC,iCAAkC,mCAClC,oCAAqC,gCACrC,yCAA0C,2BAC1C,sCAAuC,uCACvC,yCAA0C,sCAC1C,mBAAoB,eACpB,iBAAkB,YAClB,wBAAyB,eACzB,uBAAwB,OACxB,2BAA4B,iBAC5B,wBAAyB,OACzB,+BAAgC,iBAChC,sBAAuB,OACvB,wBAAyB,gBACzB,wBAAyB,CACvB,UAAa,UACb,YAAe,YAEjB,uBAAwB,CACtB,UAAa,YACb,YAAe,cAEjB,4BAA6B,eAC7B,kCAAmC,WACnC,4BAA6B,iBAC7B,kCAAmC,aAOnC,uBAAwB,6BACxB,sBAAuB,CACrB,UAAa,aACb,YAAe,eAEjB,2BAA4B,kBAC5B,yBAA0B,qBAC1B,wBAAyB,iBACzB,6BAA8B,mBAC9B,oCAAqC,CACnC,UAAa,gDACb,YAAe,sDAEjB,wBAAyB,OACzB,0BAA2B,SAC3B,uBAAwB,MACxB,yBAA0B,QAC1B,8BAA+B,cAC/B,iCAAkC,mBAClC,gCAAiC,gBACjC,8BAA+B,cAC/B,iCAAkC,qBAClC,iCAAkC,qBAClC,kCAAmC,iBACnC,+BAAgC,cAChC,8CAA+C,8BAC/C,yBAA0B,gFAC1B,2BAA4B,gBAC5B,6BAA8B,eAC9B,kCAAmC,YACnC,kCAAmC,YAEnC,2BAA4B,YAC5B,2BAA4B,WAC5B,8BAA+B,eAC/B,yBAA0B,SAC1B,2BAA4B,WAC5B,uBAAwB,OACxB,6BAA8B,QAC9B,4BAA6B,OAC7B,0BAA2B,WAC3B,uCAAwC,4EACxC,uCAAwC,4EACxC,wCAAyC,gBACzC,sCAAuC,+EACvC,sCAAuC,4DACvC,yBAA0B,aAC1B,aAAc,QACd,+BAAgC,yBAChC,oBAAuB,6BACvB,uBAAwB,WACxB,oBAAqB,eACrB,qBAAsB,UACtB,eAAgB,kBAChB,wBAAyB,mBACzB,yBAA0B,mBAC1B,qBAAsB,eACtB,yBAA0B,mBAC1B,wBAAyB,kBACzB,gBAAiB,UAEjB,cAAe,QACf,oBAAqB,CACnB,UAAa,wBACb,YAAe,0BAEjB,sCAAuC,YACvC,aAAc,OACd,yCAA0C,mBAC1C,2CAA4C,WAC5C,8CAA+C,gBAC/C,kCAAmC,WACnC,qBAAsB,MACtB,uBAAwB,QACxB,2BAA4B,4BAC5B,gCAAiC,cACjC,uCAAwC,gBACxC,iCAAkC,yBAClC,iCAAkC,iBAClC,gCAAiC,SACjC,kCAAmC,kBACnC,oCAAqC,kBACrC,kCAAmC,kBACnC,oCAAqC,kBACrC,iCAAkC,eAClC,qCAAsC,qBACtC,iCAAkC,uBAClC,gCAAiC,eACjC,kCAAmC,wBACnC,oCAAqC,wBACrC,kCAAmC,wBACnC,oCAAqC,wBACrC,iCAAkC,uBAClC,qCAAsC,2BACtC,wCAAyC,sCACzC,uCAAwC,8BACxC,yCAA0C,sCAC1C,2CAA4C,uCAC5C,yCAA0C,sCAC1C,2CAA4C,uCAE5C,wCAAyC,qCACzC,4CAA6C,yCAC7C,4BAA6B,wBAC7B,4BAA6B,sBAC7B,sBAAuB,qBACvB,oBAAqB,QACrB,wBAAyB,YACzB,yBAA0B,qBAC1B,qBAAsB,CACpB,UAAa,0BACb,YAAe,4BAEjB,qBAAsB,CACpB,UAAa,YACb,YAAe,cAEjB,0BAA2B,CACzB,UAAa,gBACb,YAAe,kBAEjB,0BAA2B,iBAC3B,yBAA0B,iBAC1B,sBAAuB,aACvB,0BAA2B,MAC3B,wBAAyB,gBACzB,uBAAwB,eACxB,uBAAwB,cACxB,yBAA0B,iBAE1B,4BAA6B,aAC7B,6BAA8B,cAC9B,oBAAqB,UACrB,yBAA0B,eAC1B,yBAA0B,eAC1B,uBAAwB,CACtB,YAAe,kBAGjB,4BAA6B,CAC3B,UAAa,WACb,YAAe,aAEjB,mCAAoC,mBACpC,6BAA8B,kBAC9B,yBAA0B,CACxB,UAAa,YACb,YAAe,iBAEjB,0BAA2B,CACzB,UAAa,aACb,YAAe,kBAEjB,0BAA2B,CACzB,UAAa,aACb,YAAe,kBAEjB,6BAA8B,KAC9B,8BAA+B,MAC/B,mCAAoC,oBACpC,mCAAoC,2EACpC,6BAA8B,QAC9B,2BAA4B,qBAC5B,yBAA0B,sBAC1B,qCAAsC,YACtC,6CAA8C,mFAC9C,gDAAiD,qFACjD,qCAAsC,8JACtC,iDAAkD,6DAClD,oDAAqD,2EACrD,gDAAiD,iLACjD,qCAAsC,0FACtC,qCAAsC,YACtC,uCAAwC,cACxC,mCAAoC,SACpC,uCAAwC,mBACxC,wCAAyC,oBACzC,uCAAwC,cACxC,wCAAyC,eACzC,sCAAuC,CACrC,UAAa,UACb,YAAe,YAEjB,kCAAmC,+JACnC,yBAA0B,SAC1B,sBAAuB,MACvB,wBAAyB,QACzB,uBAAwB,eACxB,kCAAmC,oBACnC,oBAAqB,mBACrB,kCAAmC,2BACnC,2BAA4B,gBAC5B,yBAA0B,mBAC1B,eAAgB,YAChB,2BAA4B,cAC5B,kCAAmC,gBACnC,yBAA0B,mBAC1B,wBAAyB,KACzB,qBAAsB,mBACtB,oBAAqB,mBACrB,0BAA2B,mBAC3B,kBAAmB,SAEnB,0BAA2B,qCAC3B,6BAA8B,QAC9B,uBAAwB,oBACxB,iCAAkC,iBAClC,8BAA+B,gBAC/B,2BAA4B,CAC1B,UAAa,iBACb,YAAe,mBAEjB,+BAAgC,gBAChC,4BAA6B,WAC7B,6BAA8B,YAC9B,8BAA+B,iBAC/B,yBAA0B,QAC1B,uBAAwB,cACxB,+BAAgC,QAChC,oCAAqC,SACrC,8BAA+B,OAC/B,kBAAmB,QACnB,sBAAuB,mBACvB,qBAAsB,kDACtB,sBAAuB,iBACvB,mBAAoB,QACpB,qBAAsB,OACtB,uBAAwB,iBACxB,uBAAwB,SACxB,wBAAyB,eACzB,sBAAuB,cACvB,wBAAyB,gBACzB,uCAAwC,+CACxC,+BAAgC,uDAChC,kCAAmC,SACnC,6BAA8B,gBAC9B,4BAA6B,eAC7B,kBAAmB,iBACnB,8BAA+B,2HAC/B,0BAA2B,wHAC3B,6BAA8B,kBAC9B,6BAA8B,oBAC9B,yBAA0B,qBAC1B,0BAA2B,wBAC3B,mCAAoC,kDACpC,4BAA6B,aAC7B,2BAA4B,OAC5B,kCAAmC,kCACnC,kCAAmC,eACnC,6BAA8B,gBAC9B,mCAAoC,OACpC,qCAAsC","file":"7.eebe55366b507a8f74c2.chunk.js","sourcesContent":["const lang = {\n \"Animations\": \"Animations\",\n \"AttachAlbum\": \"Album\",\n \"Appearance.Color.Hex\": \"HEX\",\n \"Appearance.Color.RGB\": \"RGB\",\n \"BlockModal.Search.Placeholder\": \"Block user...\",\n \"DarkMode\": \"Dark Mode\",\n \"FilterIncludeExcludeInfo\": \"Choose chats and types of chats that will\\nappear and never appear in this folder.\",\n \"FilterNameInputLabel\": \"Folder Name\",\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 \"WordDelimiter\": \", \",\n \"WordDelimiterLast\": \" and \",\n \"EditContact.OriginalName\": \"original name\",\n \"EditProfile.FirstNameLabel\": \"Name\",\n \"EditProfile.BioLabel\": \"Bio (optional)\",\n \"EditProfile.Username.Label\": \"Username (optional)\",\n \"EditProfile.Username.Available\": \"Username is available\",\n \"EditProfile.Username.Taken\": \"Username is already taken\",\n \"EditProfile.Username.Invalid\": \"Username is invalid\",\n \"ExceptionModal.Search.Placeholder\": \"Add exception...\",\n \"Chat.Menu.SelectMessages\": \"Select Messages\",\n \"Chat.Menu.ClearSelection\": \"Clear Selection\",\n \"Chat.Menu.Hint\": \"To **edit** or **reply**, close this menu.\\nThen tap next to a message.\",\n \"Chat.Input.UnpinAll\": \"Unpin All Messages\",\n \"Chat.Input.Attach.PhotoOrVideo\": \"Photo or Video\",\n \"Chat.Input.Attach.Document\": \"Document\",\n \"Chat.Subscribe\": \"SUBSCRIBE\",\n \"Chat.Selection.LimitToast\": \"Max selection count reached.\",\n \"Chat.Search.MessagesFound\": {\n \"one_value\": \"%d message found\",\n \"other_value\": \"%d messages found\",\n },\n \"Chat.Search.NoMessagesFound\": \"No messages found\",\n \"Chat.Search.PrivateSearch\": \"Private Search\",\n \"ChatList.Main.EmptyPlaceholder.Title\": \"Your chats will appear here\",\n \"ChatList.Main.EmptyPlaceholder.Subtitle\": \"You have %s on Telegram\",\n \"ChatList.Main.EmptyPlaceholder.SubtitleNoContacts\": \"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts\",\n //\"ChatList.Menu.Archived\": \"Archived\",\n \"ChatList.Menu.SwitchTo.Webogram\": \"Switch to Old Version\",\n \"ChatList.Menu.SwitchTo.Z\": \"Switch to Z version\",\n \"ChatMigration.From\": \"Migrated from %s\",\n \"ChatMigration.To\": \"Migrated to %s\",\n \"ConnectionStatus.ForceReconnect\": \"force reconnect\",\n \"ConnectionStatus.ReconnectIn\": \"Reconnect in %ds, %s\",\n \"ConnectionStatus.Reconnect\": \"reconnect\",\n \"ConnectionStatus.Reconnecting\": \"Reconnecting...\",\n \"ConnectionStatus.TimedOut\": \"Request timed out, %s\",\n \"ConnectionStatus.Waiting\": \"Waiting for network...\",\n \"Contacts.Count\": {\n \"one_value\": \"%d contact\",\n \"other_value\": \"%d contacts\",\n },\n \"Deactivated.Title\": \"Too many tabs...\",\n \"Deactivated.Subtitle\": \"Telegram supports only one active tab with the app.\\nClick anywhere to continue using this tab.\",\n /* \"Drafts\": {\n \"one_value\": \"%d draft\",\n \"other_value\": \"%d drafts\",\n }, */\n \"General.Keyboard\": \"Keyboard\",\n \"General.SendShortcut.Enter\": \"Send by Enter\",\n \"General.SendShortcut.CtrlEnter\": \"Send by %s + Enter\",\n \"General.SendShortcut.NewLine.ShiftEnter\": \"New line by Shift + Enter\",\n \"General.SendShortcut.NewLine.Enter\": \"New line by Enter\",\n \"General.AutoplayMedia\": \"Auto-Play Media\",\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 \"Notifications.MessagePreview\": \"Message preview\",\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 \"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 \"Search.Chats\": \"Chats\",\n \"Search.Global\": \"Global Search\",\n \"Search.Messages\": \"Messages\",\n \"StickersTab.SearchPlaceholder\": \"Search Stickers\",\n \"ForwardedFrom\": \"Forwarded from %s\",\n \"Popup.Avatar.Title\": \"Drag to Reposition\",\n \"Popup.Unpin.AllTitle\": \"Unpin all messages\",\n \"Popup.Unpin.HideTitle\": \"Hide pinned messages\",\n \"Popup.Unpin.HideDescription\": \"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.\",\n \"Popup.Unpin.Hide\": \"Hide\",\n \"TwoStepAuth.InvalidPassword\": \"Invalid password\",\n \"TwoStepAuth.EmailCodeChangeEmail\": \"Change Email\",\n \"MarkupTooltip.LinkPlaceholder\": \"Enter URL...\",\n \"MediaViewer.Context.Download\": \"Download\",\n \"Profile\": \"Profile\",\n \"Saved\": \"Saved\",\n \"Deleted\": \"Deleted\",\n \"ReportBug\": \"Report Bug\",\n \"Notifications.Count\": {\n \"one_value\": \"%d notification\",\n \"other_value\": \"%d notifications\"\n },\n \"Notifications.Forwarded\": {\n \"one_value\": \"Forwarded %d message\",\n \"other_value\": \"Forwarded %d messages\"\n },\n \"Notifications.New\": \"New notification\",\n \"PushNotification.Action.Mute1d\": \"Mute background alerts for 1 day\",\n\t\"PushNotification.Action.Settings\": \"Background alerts settings\",\n\t\"PushNotification.Action.Mute1d.Mobile\": \"Mute for 24H\",\n\t\"PushNotification.Action.Settings.Mobile\": \"Alerts settings\",\n\t\"PushNotification.Message.NoPreview\": \"You have a new message\",\n \"LogOut.Description\": \"Are you sure you want to log out?\\n\\nNote that you can seamlessly use Telegram on all your devices at once.\",\n\t//\"PushNotification.Action.Mute1d.Success\": \"Notification settings were successfully saved.\",\n\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 \"ActionGroupCallInvited\": \"un1 invited un2 to the voice chat\",\n \"ActionGroupCallYouInvited\": \"You invited un2 to the voice chat\",\n \"ActionGroupCallInvitedYou\": \"un1 invited you to the voice chat\",\n \"Seconds\": {\n \"one_value\": \"%1$d second\",\n \"other_value\": \"%1$d seconds\"\n },\n \"Minutes\": {\n \"one_value\": \"%1$d minute\",\n \"other_value\": \"%1$d minutes\"\n },\n \"Hours\": {\n \"one_value\": \"%1$d hour\",\n \"other_value\": \"%1$d hours\"\n },\n \"Days\": {\n \"one_value\": \"%1$d day\",\n \"other_value\": \"%1$d days\"\n },\n \"Weeks\": {\n \"one_value\": \"%1$d week\",\n \"other_value\": \"%1$d weeks\"\n },\n \"TodayAtFormattedWithToday\": \"today at %1$s\",\n \"formatDateAtTime\": \"%1$s at %2$s\",\n \"JoinByPeekChannelTitle\": \"Join Channel\",\n \"JoinByPeekGroupTitle\": \"Join Group\",\n \"YouWereKicked\": \"you were removed\",\n \"ViaBot\": \"via\",\n \"InviteExpired\": \"This invite link has expired.\",\n \"NoUsernameFound\": \"There is no Telegram account with this username.\",\n \"PrivacyDeleteCloudDrafts\": \"Delete All Cloud Drafts\",\n \"AreYouSureClearDraftsTitle\": \"Delete cloud drafts\",\n \"AreYouSureClearDrafts\": \"Are you sure you want to delete all cloud drafts?\",\n \"BotInfoTitle\": \"What can this bot do?\",\n \"ChatYourSelf\": \"forward here to save\",\n \"GroupEmptyTitle1\": \"You have created a **group**.\",\n \"GroupEmptyTitle2\": \"Groups can have:\",\n \"GroupDescription1\": \"Up to 200,000 members\",\n \"GroupDescription2\": \"Persistent chat history\",\n \"GroupDescription3\": \"Public links such as t.me/title\",\n \"GroupDescription4\": \"Admins with different rights\",\n \"ChatYourSelfDescription1\": \"Forward messages here to save them\",\n \"ChatYourSelfDescription2\": \"Send media and files to store them\",\n \"ChatYourSelfDescription3\": \"Access this chat from any device\",\n \"ChatYourSelfDescription4\": \"Use search to quickly find things\",\n \"ChatYourSelfTitle\": \"Your cloud storage\",\n \"ActionYouCreateGroup\": \"You created the group\",\n \"NoMessages\": \"No messages here yet...\",\n \"NoScheduledMessages\": \"No scheduled messages here yet...\",\n \"NoMessagesGreetingsDescription\": \"Send a message or tap the greeting below.\",\n \"InviteToGroupError\": \"Sorry, you can\\'t add this user to groups because of user\\'s privacy settings.\",\n \"InviteToChannelError\": \"Sorry, you can\\'t add this user to channels because of user\\'s privacy settings.\",\n \"AddMembersAlertTitle\": \"Add %1$s\",\n \"AddOneMemberAlertTitle\": \"Add member\",\n \"AddMembersAlertNamesText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersAlertCountText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersForwardMessages\": \"Show the last 100 messages to the new members\",\n \"AddOneMemberForwardMessages\": \"Show the last 100 messages to **%1$s**\",\n \"PinToTopLimitReached2\": \"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.\",\n \"FiltersSetupPinAlert\": \"Set Up Folders\",\n \"AppName\": \"Telegram\",\n \"OK\": \"OK\",\n \"PinFolderLimitReached\": \"Sorry, you can\\'t pin any more chats to the top.\",\n \"Send\": \"Send\",\n \"ChannelJoin\": \"JOIN\",\n \"Yesterday\": \"yesterday\",\n \"LeaveAComment\": \"Leave a comment\",\n \"ViewInChat\": \"View in chat\",\n \"LinkNotFound\": \"Unfortunately, you can\\'t access this message. You are not a member of the chat where it was posted.\",\n \"Create\": \"Create\",\n \"ViewDiscussion\": \"View discussion\",\n \"MessageScheduledUntilOnline\": \"Scheduled until online\",\n \"ReportChat\": \"Report\",\n \"ReportChatSpam\": \"Spam\",\n // \"ReportChatFakeAccount\": \"Fake Account\",\n \"ReportChatViolence\": \"Violence\",\n \"ReportChatPornography\": \"Pornography\",\n \"ReportChatChild\": \"Child Abuse\",\n \"ReportChatOther\": \"Other\",\n \"ReportChatDescription\": \"Description\",\n \"ReportInfo\": \"Please enter any additional details relevant to your report.\",\n \"ReportSentInfo\": \"Telegram moderators will review your report.\\nThank you for your cooperation!\",\n \"ReportHint\": \"Additional details...\",\n \"ChatHistory\": \"Chat history for new members\",\n \"ShareContact\": \"Share contact\",\n \"SendMessageTitle\": \"Send message\",\n \"SendContactToGroupText\": \"Do you want to send this contact to **%1$s**?\",\n \"ChannelBroadcast\": \"Broadcast\",\n \"ChannelSilentBroadcast\": \"Silent Broadcast\",\n \"Comment\": \"Comment\",\n \"SendAnonymously\": \"Send anonymously\",\n \"DiscardVoiceMessageTitle\": \"Discard Voice Message\",\n \"DiscardVoiceMessageDescription\": \"Are you sure you want to stop recording and discard your voice message?\",\n \"DiscardVoiceMessageAction\": \"Discard\",\n \"AddContact\": \"Add to contacts\",\n \"BlockUser\": \"Block user\",\n \"MobileHidden\": \"Mobile hidden\",\n \"MobileHiddenExceptionInfo\": \"Phone number will be visible once %1$s adds you as a contact.\",\n \"FirstName\": \"First name (required)\",\n \"LastName\": \"Last name (optional)\",\n \"AreYouSureBlockContact2\": \"Are you sure you want to block **%1$s**?\",\n \"UserBlocked\": \"User blocked\",\n \"UserUnblocked\": \"User unblocked\",\n \"AudioUnknownArtist\": \"Unknown artist\",\n \"AudioUnknownTitle\": \"Unknown title\",\n \"LogOut\": \"Log out\",\n \"OnlineCount\": {\n \"one_value\": \"%1$d online\",\n \"other_value\": \"%1$d online\"\n },\n \"EditedMessage\": \"edited\",\n\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 \"Bio.Description\": \"Any details such as age, occupation or city.\\nExample: 23 y.o. designer from San Francisco\",\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 \"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.Date.ScheduledFor\": \"Scheduled for %@\",\n \"Chat.Date.ScheduledForToday\": \"Scheduled for today\",\n \"Chat.DropTitle\": \"Drop files here to send them\",\n \"Chat.DropQuickDesc\": \"in a quick way\",\n \"Chat.DropAsFilesDesc\": \"without compression\",\n \"Chat.Edit.Cancel.Text\": \"Are you sure you want to discard all changes?\",\n \"Chat.Service.PeerJoinedTelegram\": \"%@ joined Telegram\",\n \"Chat.Service.Channel.UpdatedTitle\": \"Channel renamed to \\\"%@\\\"\",\n \"Chat.Service.Channel.UpdatedPhoto\": \"Channel photo updated\",\n \"Chat.Service.Channel.RemovedPhoto\": \"Channel photo removed\",\n \"Chat.Service.Channel.UpdatedVideo\": \"Channel video updated\",\n \"Chat.Service.BotPermissionAllowed\": \"You allowed this bot to message you when you logged in on %@\",\n \"Chat.Service.Group.UpdatedPinnedMessage\": \"%@ pinned \\\"%@\\\"\",\n \"Chat.Service.VoiceChatStarted\": \"%1$@ started a [video chat](open)\",\n \"Chat.Service.VoiceChatStartedYou\": \"You started a [video chat](open)\",\n \"Chat.Service.VoiceChatStarted.Channel\": \"[Live Stream](open) started\",\n \"Chat.Service.VoiceChatFinished\": \"%1$@ ended the video chat (%2$@)\",\n \"Chat.Service.VoiceChatFinishedYou\": \"You ended the video chat (%@)\",\n \"Chat.Service.VoiceChatFinished.Channel\": \"Live Stream ended (%1$@)\",\n \"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.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 \"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.Call.Cancelled\": \"Cancelled Call\",\n \"ChatList.Service.Call.Missed\": \"Missed 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.AllChats\": \"All Chats\",\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 \"Channel.DescriptionHolderDescrpiton\": \"You can provide an optional description for your channel.\",\n \"CreateGroup.NameHolder\": \"Group Name\",\n \"Date.Today\": \"Today\",\n \"DeleteChat.DeleteGroupForAll\": \"Delete for all members\",\n \"DeleteChannelForAll\": \"Delete for all subscribers\",\n \"EditAccount.Username\": \"Username\",\n \"EditAccount.Title\": \"Edit Profile\",\n \"EditAccount.Logout\": \"Log Out\",\n \"Emoji.Recent\": \"Frequently Used\",\n \"Emoji.SmilesAndPeople\": \"Smileys & People\",\n \"Emoji.AnimalsAndNature\": \"Animals & Nature\",\n \"Emoji.FoodAndDrink\": \"Food & Drink\",\n \"Emoji.ActivityAndSport\": \"Activity & Sport\",\n \"Emoji.TravelAndPlaces\": \"Travel & Places\",\n \"Emoji.Objects\": \"Objects\",\n //\"Emoji.Symbols\": \"Symbols\",\n \"Emoji.Flags\": \"Flags\",\n \"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 \"Modal.Send\": \"Send\",\n \"Telegram.GeneralSettingsViewController\": \"General Settings\",\n \"Telegram.InstalledStickerPacksController\": \"Stickers\",\n \"Telegram.NotificationSettingsViewController\": \"Notifications\",\n \"Telegram.LanguageViewController\": \"Language\",\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 \"InstalledStickers.LoopAnimated\": \"Loop Animated Stickers\",\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.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.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 \"Message.Context.Select\": \"Select\",\n \"Message.Context.Pin\": \"Pin\",\n \"Message.Context.Unpin\": \"Unpin\",\n \"Message.Context.Goto\": \"Show Message\",\n \"MessageContext.CopyMessageLink1\": \"Copy Message Link\",\n \"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 \"GeneralSettings.BigEmoji\": \"Large Emoji\",\n \"GeneralSettings.EmojiPrediction\": \"Suggest Emoji\",\n \"GroupPermission.Delete\": \"Delete Exception\",\n \"ScheduleController.at\": \"at\",\n \"Schedule.SendToday\": \"Send today at %@\",\n \"Schedule.SendDate\": \"Send on %@ at %@\",\n \"Schedule.SendWhenOnline\": \"Send When Online\",\n \"Stickers.Recent\": \"Recent\",\n //\"Stickers.Favorite\": \"Favorite\",\n \"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 \"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};\n\nexport default lang;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/8.cbbad398924d87521a47.chunk.js b/public/8.479ac71b1f70d56a0c98.chunk.js similarity index 92% rename from public/8.cbbad398924d87521a47.chunk.js rename to public/8.479ac71b1f70d56a0c98.chunk.js index e06ec16f2..fea9d3ecf 100644 --- a/public/8.cbbad398924d87521a47.chunk.js +++ b/public/8.479ac71b1f70d56a0c98.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[8],{138:function(e,n,o){"use strict";o.r(n);n.default={"Login.Title":"Sign in to Telegram","Login.CountrySelectorLabel":"Country","Login.PhoneLabel":"Phone Number","Login.PhoneLabelInvalid":"Phone Number Invalid","Login.KeepSigned":"Keep me signed in","Login.StartText":"Please confirm your country and\nenter your phone number.","Login.Code.SentSms":"We have sent you an SMS\nwith the code.","Login.Code.SentInApp":"We have sent you a message in Telegram\nwith the code.","Login.Code.SentCall":"We will call you and voice\nthe code.","Login.Code.SentUnknown":"Please check everything\nfor a code (type: %s)","Login.Password.Title":"Enter Your Password","Login.Password.Subtitle":"Your account is protected with\nan additional password","Login.Register.Subtitle":"Enter your name and add\na profile picture",PleaseWait:"Please wait...",Code:"Code",LoginPassword:"Password",YourName:"Your Name",FirstName:"First name (required)",LastName:"Last name (optional)",StartMessaging:"Start Messaging","Contacts.PhoneNumber.Placeholder":"Phone Number","Login.Next":"Next","Login.ContinueOnLanguage":"Continue in English","Login.QR.Title":"Log in to Telegram by QR Code","Login.QR.Help1":"Open Telegram on your phone","Login.QR.Help2":"Go to **Settings** > **Devices** > **Scan QR**","Login.QR.Help3":"Point your phone at this screen to confirm login","Login.QR.Cancel":"Log in by phone Number","Login.QR.Login":"Log in by QR Code",PHONE_CODE_INVALID:"Invalid code",PHONE_CODE_EXPIRED:"Code expired",PASSWORD_HASH_INVALID:"Incorrect password"}}}]); -//# sourceMappingURL=8.cbbad398924d87521a47.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[8],{144:function(e,n,o){"use strict";o.r(n);n.default={"Login.Title":"Sign in to Telegram","Login.CountrySelectorLabel":"Country","Login.PhoneLabel":"Phone Number","Login.PhoneLabelInvalid":"Phone Number Invalid","Login.KeepSigned":"Keep me signed in","Login.StartText":"Please confirm your country and\nenter your phone number.","Login.Code.SentSms":"We have sent you an SMS\nwith the code.","Login.Code.SentInApp":"We have sent you a message in Telegram\nwith the code.","Login.Code.SentCall":"We will call you and voice\nthe code.","Login.Code.SentUnknown":"Please check everything\nfor a code (type: %s)","Login.Password.Title":"Enter Your Password","Login.Password.Subtitle":"Your account is protected with\nan additional password","Login.Register.Subtitle":"Enter your name and add\na profile picture",PleaseWait:"Please wait...",Code:"Code",LoginPassword:"Password",YourName:"Your Name",FirstName:"First name (required)",LastName:"Last name (optional)",StartMessaging:"Start Messaging","Contacts.PhoneNumber.Placeholder":"Phone Number","Login.Next":"Next","Login.ContinueOnLanguage":"Continue in English","Login.QR.Title":"Log in to Telegram by QR Code","Login.QR.Help1":"Open Telegram on your phone","Login.QR.Help2":"Go to **Settings** > **Devices** > **Scan QR**","Login.QR.Help3":"Point your phone at this screen to confirm login","Login.QR.Cancel":"Log in by phone Number","Login.QR.Login":"Log in by QR Code",PHONE_CODE_INVALID:"Invalid code",PHONE_CODE_EXPIRED:"Code expired",PASSWORD_HASH_INVALID:"Incorrect password"}}}]); +//# sourceMappingURL=8.479ac71b1f70d56a0c98.chunk.js.map \ No newline at end of file diff --git a/public/8.cbbad398924d87521a47.chunk.js.map b/public/8.479ac71b1f70d56a0c98.chunk.js.map similarity index 95% rename from public/8.cbbad398924d87521a47.chunk.js.map rename to public/8.479ac71b1f70d56a0c98.chunk.js.map index 49d509733..e0f408b75 100644 --- a/public/8.cbbad398924d87521a47.chunk.js.map +++ b/public/8.479ac71b1f70d56a0c98.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/langSign.ts"],"names":[],"mappings":"sFAAA,OAuCe,UAvCF,CACX,cAAe,sBACf,6BAA8B,UAC9B,mBAAoB,eACpB,0BAA2B,uBAC3B,mBAAoB,oBACpB,kBAAmB,4DACnB,qBAAsB,0CACtB,uBAAwB,yDACxB,sBAAuB,wCACvB,yBAA0B,iDAC1B,uBAAwB,sBACxB,0BAA2B,yDAC3B,0BAA2B,6CAC3B,WAAc,iBAGd,KAAQ,OACR,cAAiB,WACjB,SAAY,YACZ,UAAa,wBACb,SAAY,uBACZ,eAAkB,kBAGlB,mCAAoC,eACpC,aAAc,OACd,2BAA4B,sBAC5B,iBAAkB,gCAClB,iBAAkB,8BAClB,iBAAkB,iDAClB,iBAAkB,mDAClB,kBAAmB,yBACnB,iBAAkB,oBAClB,mBAAsB,eACtB,mBAAsB,eACtB,sBAAyB","file":"8.cbbad398924d87521a47.chunk.js","sourcesContent":["const lang = {\r\n \"Login.Title\": \"Sign in to Telegram\",\r\n \"Login.CountrySelectorLabel\": \"Country\",\r\n \"Login.PhoneLabel\": \"Phone Number\",\r\n \"Login.PhoneLabelInvalid\": \"Phone Number Invalid\",\r\n \"Login.KeepSigned\": \"Keep me signed in\",\r\n \"Login.StartText\": \"Please confirm your country and\\nenter your phone number.\",\r\n \"Login.Code.SentSms\": \"We have sent you an SMS\\nwith the code.\",\r\n \"Login.Code.SentInApp\": \"We have sent you a message in Telegram\\nwith the code.\",\r\n \"Login.Code.SentCall\": \"We will call you and voice\\nthe code.\",\r\n \"Login.Code.SentUnknown\": \"Please check everything\\nfor a code (type: %s)\",\r\n \"Login.Password.Title\": \"Enter Your Password\",\r\n \"Login.Password.Subtitle\": \"Your account is protected with\\nan additional password\",\r\n \"Login.Register.Subtitle\": \"Enter your name and add\\na profile picture\",\r\n \"PleaseWait\": \"Please wait...\",\r\n\r\n // * android\r\n \"Code\": \"Code\",\r\n \"LoginPassword\": \"Password\",\r\n \"YourName\": \"Your Name\",\r\n \"FirstName\": \"First name (required)\",\r\n \"LastName\": \"Last name (optional)\",\r\n \"StartMessaging\": \"Start Messaging\",\r\n\r\n // * macos\r\n \"Contacts.PhoneNumber.Placeholder\": \"Phone Number\",\r\n \"Login.Next\": \"Next\",\r\n \"Login.ContinueOnLanguage\": \"Continue in English\",\r\n \"Login.QR.Title\": \"Log in to Telegram by QR Code\",\r\n \"Login.QR.Help1\": \"Open Telegram on your phone\",\r\n \"Login.QR.Help2\": \"Go to **Settings** > **Devices** > **Scan QR**\",\r\n \"Login.QR.Help3\": \"Point your phone at this screen to confirm login\",\r\n \"Login.QR.Cancel\": \"Log in by phone Number\",\r\n \"Login.QR.Login\": \"Log in by QR Code\",\r\n \"PHONE_CODE_INVALID\": \"Invalid code\",\r\n \"PHONE_CODE_EXPIRED\": \"Code expired\",\r\n \"PASSWORD_HASH_INVALID\": \"Incorrect password\"\r\n};\r\n\r\nexport default lang;\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/langSign.ts"],"names":[],"mappings":"sFAAA,OAuCe,UAvCF,CACX,cAAe,sBACf,6BAA8B,UAC9B,mBAAoB,eACpB,0BAA2B,uBAC3B,mBAAoB,oBACpB,kBAAmB,4DACnB,qBAAsB,0CACtB,uBAAwB,yDACxB,sBAAuB,wCACvB,yBAA0B,iDAC1B,uBAAwB,sBACxB,0BAA2B,yDAC3B,0BAA2B,6CAC3B,WAAc,iBAGd,KAAQ,OACR,cAAiB,WACjB,SAAY,YACZ,UAAa,wBACb,SAAY,uBACZ,eAAkB,kBAGlB,mCAAoC,eACpC,aAAc,OACd,2BAA4B,sBAC5B,iBAAkB,gCAClB,iBAAkB,8BAClB,iBAAkB,iDAClB,iBAAkB,mDAClB,kBAAmB,yBACnB,iBAAkB,oBAClB,mBAAsB,eACtB,mBAAsB,eACtB,sBAAyB","file":"8.479ac71b1f70d56a0c98.chunk.js","sourcesContent":["const lang = {\r\n \"Login.Title\": \"Sign in to Telegram\",\r\n \"Login.CountrySelectorLabel\": \"Country\",\r\n \"Login.PhoneLabel\": \"Phone Number\",\r\n \"Login.PhoneLabelInvalid\": \"Phone Number Invalid\",\r\n \"Login.KeepSigned\": \"Keep me signed in\",\r\n \"Login.StartText\": \"Please confirm your country and\\nenter your phone number.\",\r\n \"Login.Code.SentSms\": \"We have sent you an SMS\\nwith the code.\",\r\n \"Login.Code.SentInApp\": \"We have sent you a message in Telegram\\nwith the code.\",\r\n \"Login.Code.SentCall\": \"We will call you and voice\\nthe code.\",\r\n \"Login.Code.SentUnknown\": \"Please check everything\\nfor a code (type: %s)\",\r\n \"Login.Password.Title\": \"Enter Your Password\",\r\n \"Login.Password.Subtitle\": \"Your account is protected with\\nan additional password\",\r\n \"Login.Register.Subtitle\": \"Enter your name and add\\na profile picture\",\r\n \"PleaseWait\": \"Please wait...\",\r\n\r\n // * android\r\n \"Code\": \"Code\",\r\n \"LoginPassword\": \"Password\",\r\n \"YourName\": \"Your Name\",\r\n \"FirstName\": \"First name (required)\",\r\n \"LastName\": \"Last name (optional)\",\r\n \"StartMessaging\": \"Start Messaging\",\r\n\r\n // * macos\r\n \"Contacts.PhoneNumber.Placeholder\": \"Phone Number\",\r\n \"Login.Next\": \"Next\",\r\n \"Login.ContinueOnLanguage\": \"Continue in English\",\r\n \"Login.QR.Title\": \"Log in to Telegram by QR Code\",\r\n \"Login.QR.Help1\": \"Open Telegram on your phone\",\r\n \"Login.QR.Help2\": \"Go to **Settings** > **Devices** > **Scan QR**\",\r\n \"Login.QR.Help3\": \"Point your phone at this screen to confirm login\",\r\n \"Login.QR.Cancel\": \"Log in by phone Number\",\r\n \"Login.QR.Login\": \"Log in by QR Code\",\r\n \"PHONE_CODE_INVALID\": \"Invalid code\",\r\n \"PHONE_CODE_EXPIRED\": \"Code expired\",\r\n \"PASSWORD_HASH_INVALID\": \"Incorrect password\"\r\n};\r\n\r\nexport default lang;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/changelogs/1.0.0 (36).md b/public/changelogs/1.0.0 (36).md new file mode 100644 index 000000000..c8fba75ca --- /dev/null +++ b/public/changelogs/1.0.0 (36).md @@ -0,0 +1,7 @@ +An early version of Video Chats is available in all groups and channels – with a polished design exclusively for Web: + +• Expand to view your video chats in fullscreen. +• Try the wide mode, which shows video feeds side-by-side. +• Resize and place the video layout on any part of the screen. +• Minimize the window and the app will remember its precious size and position. +• Mute or leave the video chat from the interactive header. diff --git a/public/index.html b/public/index.html index 9965722e4..1f1c82f95 100644 --- a/public/index.html +++ b/public/index.html @@ -1,3 +1,3 @@ -Telegram Web \ No newline at end of file + \ No newline at end of file diff --git a/public/main.6a45f609a7a2d67d16ff.bundle.js b/public/main.44c380c3c13ddc1cf9bd.bundle.js similarity index 92% rename from public/main.6a45f609a7a2d67d16ff.bundle.js rename to public/main.44c380c3c13ddc1cf9bd.bundle.js index 11171fcf4..575626534 100644 --- a/public/main.6a45f609a7a2d67d16ff.bundle.js +++ b/public/main.44c380c3c13ddc1cf9bd.bundle.js @@ -1,2 +1,2 @@ -!function(e){function t(t){for(var n,a,i=t[0],r=t[1],c=0,s=[];c1)&&!o.a.MSStream,u=!!("safari"in o.a)||!(!a||!(/\b(iPad|iPhone|iPod)\b/.test(a)||a.match("Safari")&&!a.match("Chrome"))),d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,l=u&&s,f=navigator.maxTouchPoints>0&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},function(e,t,n){"use strict";n.r(t),n.d(t,"IS_TOUCH_SUPPORTED",(function(){return o}));const o="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},function(e,t,n){"use strict";const o="undefined"!=typeof window?window:self;t.a=o},function(e,t,n){"use strict";n.d(t,"a",(function(){return c})),n.d(t,"b",(function(){return s}));var o=n(1),a=n(0),i=n(6),r=n(4);const c=a.IS_SAFARI&&a.IS_MOBILE&&o.IS_TOUCH_SUPPORTED;if(c){let e="clientY",t=0;const n={capture:!0,passive:!1},o=n=>{const o=n.touches[0],a=Object(i.a)(o.target,"scrollable-y");if(a){const i=o[e],r=t-i,c=a.scrollTop,s=a.scrollHeight,u=a.clientHeight,d=c?Math.round(c+a.clientHeight+r):c+r;(s===u||d>=s||d<=0)&&n.preventDefault()}else n.preventDefault()};let a=0;document.addEventListener("focusin",i=>{!i.target.classList.contains("is-sticky-input-bugged")||i.timeStamp-a<50||(Object(r.a)(i.target),document.addEventListener("touchmove",o,n),document.addEventListener("touchstart",n=>{if(n.touches.length>1)return;const o=n.touches[0];t=o[e]}))},{passive:!0}),document.addEventListener("focusout",e=>{document.removeEventListener("touchmove",o,n),a=e.timeStamp},{passive:!0}),document.addEventListener("visibilitychange",()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&Object(r.a)(document.activeElement)},{passive:!0})}function s(e){c&&e.classList.add("is-sticky-input-bugged")}},function(e,t,n){"use strict";function o(e){e.style.transform="translateY(-99999px)",e.focus(),setTimeout(()=>{e.style.transform=""},0)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";function o(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,"a",(function(){return o}))},function(e,t,n){"use strict";function o(e,t){return e.closest("."+t)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";function o(){return!(!document.activeElement||!document.activeElement.blur)&&(document.activeElement.blur(),!0)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";const o={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"0.9.2",versionFull:"0.9.2 (35)",build:35,langPackVersion:"0.3.7",langPack:"macos",langPackCode:"en",domains:["web.telegram.org"],baseDcId:2,isMainDomain:"web.telegram.org"===location.hostname,suffix:"K"};o.isMainDomain&&(o.id=2496,o.hash="8da85b0d5bfe62527e5b244c209159c3"),t.a=o},function(e,t,n){"use strict";let o;function a(){return o||(o="fonts"in document?Promise.race([Promise.all(["400 1rem Roboto","500 1rem Roboto","500 1rem tgico"].map(e=>document.fonts.load(e))),new Promise(e=>setTimeout(e,1e3))]):Promise.resolve())}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";const o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i);t.a=o},function(e,t,n){"use strict";n.r(t);var o=n(8),a=n(7),i=n(5),r=n(3),c=n(9),s=n(10),u=n(0),d=(n(12),n(13),n(14),function(e,t,n,o){return new(n||(n=Promise))((function(a,i){function r(e){try{s(o.next(e))}catch(e){i(e)}}function c(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,c)}s((o=o.apply(e,t||[])).next())}))});document.addEventListener("DOMContentLoaded",()=>d(void 0,void 0,void 0,(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)});const e=window.visualViewport||window;let t,d=!1;const l=()=>{const n=.01*(d&&!v.default.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==n&&(b.IS_TOUCH_SUPPORTED&&t1&&Object(a.a)(),t=n,document.documentElement.style.setProperty("--vh",n+"px"))},f=new Proxy(Worker,{construct:(e,t)=>new e(t[0]+location.search)});Worker=f;const[m,b,h,v,g,p,P]=yield Promise.all([n.e(22).then(n.bind(null,27)),Promise.resolve().then(n.bind(null,1)),Promise.resolve().then(n.bind(null,0)),n.e(20).then(n.bind(null,15)),Promise.all([n.e(0),n.e(27)]).then(n.bind(null,17)),Promise.all([n.e(0),n.e(1)]).then(n.bind(null,16)),n.e(26).then(n.bind(null,28))]);if(window.addEventListener("resize",l),l(),r.a){const t=()=>{d=1===n&&r.a&&!v.default.isOverlayActive,l(),e!==window&&(d?(window.removeEventListener("resize",l),e.addEventListener("resize",l)):(e.removeEventListener("resize",l),window.addEventListener("resize",l)))};let n;v.default.addEventListener("im_tab_change",e=>{const o=void 0!==n;n=e,(o||1===n)&&t()}),v.default.addEventListener("overlay_toggle",()=>{t()})}h.IS_FIREFOX&&!s.a&&document.addEventListener("dragstart",e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return Object(i.a)(e),!1}),document.addEventListener("dragstart",e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1}),h.IS_FIREFOX&&document.documentElement.classList.add("is-firefox"),h.IS_APPLE?(h.IS_SAFARI&&document.documentElement.classList.add("is-safari"),document.documentElement.classList.add("emoji-supported"),h.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac")):h.IS_ANDROID&&document.documentElement.classList.add("is-android"),b.IS_TOUCH_SUPPORTED?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch");const y=performance.now(),E=p.default.getCacheLangPack(),[S,w]=yield Promise.all([g.default.getState(),E]);function I(e,t){e.style.opacity="0",t.then(()=>{window.requestAnimationFrame(()=>{e.style.opacity=""})})}p.default.setTimeFormat(S.settings.timeFormat),v.default.setThemeListener(),w.appVersion!==o.a.langPackVersion&&p.default.getLangPack(w.lang_code),console.log("got state, time:",performance.now()-y);const O=S.authState;if("authStateSignedIn"!==O._){console.log("Will mount auth page:",O._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,o;if(e){t=e.querySelector(".scrollable"),b.IS_TOUCH_SUPPORTED&&!u.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.all([n.e(0),n.e(1)]).then(n.bind(null,24)),Promise.all([n.e(0),n.e(1)]).then(n.bind(null,26))]).then(([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()})}catch(e){}switch(O._){case"authStateSignIn":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(16)]).then(n.bind(null,20))).default.mount();break;case"authStateSignQr":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(17)]).then(n.bind(null,22))).default.mount();break;case"authStateAuthCode":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(13)]).then(n.bind(null,23))).default.mount(O.sentCode);break;case"authStatePassword":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(11)]).then(n.bind(null,21))).default.mount();break;case"authStateSignUp":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(5),n.e(12)]).then(n.bind(null,25))).default.mount(O.authCode)}if(t){o&&(yield o);I(t,"fonts"in document?Promise.race([new Promise(e=>setTimeout(e,1e3)),document.fonts.ready]):Promise.resolve())}}else console.log("Will mount IM page:",Date.now()/1e3),I(document.getElementById("main-columns"),Object(c.a)()),(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(29)]).then(n.bind(null,19))).default.mount();const L=(yield n.e(18).then(n.bind(null,18))).ripple;Array.from(document.getElementsByClassName("rp")).forEach(e=>L(e))})))},function(e,t,n){},function(e,t,n){},function(e,t,n){}]); -//# sourceMappingURL=main.6a45f609a7a2d67d16ff.bundle.js.map \ No newline at end of file +!function(e){function t(t){for(var n,a,i=t[0],r=t[1],c=0,s=[];c1)&&!o.a.MSStream,u=!!("safari"in o.a)||!(!a||!(/\b(iPad|iPhone|iPod)\b/.test(a)||a.match("Safari")&&!a.match("Chrome"))),d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,l=u&&s,f=navigator.maxTouchPoints>0&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},function(e,t,n){"use strict";n.r(t),n.d(t,"IS_TOUCH_SUPPORTED",(function(){return o}));const o="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},function(e,t,n){"use strict";const o="undefined"!=typeof window?window:self;t.a=o},function(e,t,n){"use strict";n.d(t,"a",(function(){return c})),n.d(t,"b",(function(){return s}));var o=n(1),a=n(0),i=n(6),r=n(4);const c=a.IS_SAFARI&&a.IS_MOBILE&&o.IS_TOUCH_SUPPORTED;if(c){let e="clientY",t=0;const n={capture:!0,passive:!1},o=n=>{const o=n.touches[0],a=Object(i.a)(o.target,"scrollable-y");if(a){const i=o[e],r=t-i,c=a.scrollTop,s=a.scrollHeight,u=a.clientHeight,d=c?Math.round(c+a.clientHeight+r):c+r;(s===u||d>=s||d<=0)&&n.preventDefault()}else n.preventDefault()};let a=0;document.addEventListener("focusin",i=>{!i.target.classList.contains("is-sticky-input-bugged")||i.timeStamp-a<50||(Object(r.a)(i.target),document.addEventListener("touchmove",o,n),document.addEventListener("touchstart",n=>{if(n.touches.length>1)return;const o=n.touches[0];t=o[e]}))},{passive:!0}),document.addEventListener("focusout",e=>{document.removeEventListener("touchmove",o,n),a=e.timeStamp},{passive:!0}),document.addEventListener("visibilitychange",()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&Object(r.a)(document.activeElement)},{passive:!0})}function s(e){c&&e.classList.add("is-sticky-input-bugged")}},function(e,t,n){"use strict";function o(e){e.style.transform="translateY(-99999px)",e.focus(),setTimeout(()=>{e.style.transform=""},0)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";function o(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,"a",(function(){return o}))},function(e,t,n){"use strict";function o(e,t){return e.closest("."+t)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";function o(){return!(!document.activeElement||!document.activeElement.blur)&&(document.activeElement.blur(),!0)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";const o={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.0.0",versionFull:"1.0.0 (36)",build:36,langPackVersion:"0.3.7",langPack:"macos",langPackCode:"en",domains:["web.telegram.org"],baseDcId:2,isMainDomain:"web.telegram.org"===location.hostname,suffix:"K"};o.isMainDomain&&(o.id=2496,o.hash="8da85b0d5bfe62527e5b244c209159c3"),t.a=o},function(e,t,n){"use strict";let o;function a(){return o||(o="fonts"in document?Promise.race([Promise.all(["400 1rem Roboto","500 1rem Roboto","500 1rem tgico"].map(e=>document.fonts.load(e))),new Promise(e=>setTimeout(e,1e3))]):Promise.resolve())}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";const o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i);t.a=o},function(e,t,n){"use strict";n.r(t);var o=n(8),a=n(7),i=n(5),r=n(3),c=n(9),s=n(10),u=n(0),d=(n(12),n(13),n(14),function(e,t,n,o){return new(n||(n=Promise))((function(a,i){function r(e){try{s(o.next(e))}catch(e){i(e)}}function c(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,c)}s((o=o.apply(e,t||[])).next())}))});document.addEventListener("DOMContentLoaded",()=>d(void 0,void 0,void 0,(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)});const e=window.visualViewport||window;let t,d=!1;const l=()=>{const n=.01*(d&&!v.default.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==n&&(b.IS_TOUCH_SUPPORTED&&t1&&Object(a.a)(),t=n,document.documentElement.style.setProperty("--vh",n+"px"))},f=new Proxy(Worker,{construct:(e,t)=>new e(t[0]+location.search)});Worker=f;const[m,b,h,v,g,p,P]=yield Promise.all([n.e(22).then(n.bind(null,27)),Promise.resolve().then(n.bind(null,1)),Promise.resolve().then(n.bind(null,0)),n.e(20).then(n.bind(null,15)),Promise.all([n.e(0),n.e(27)]).then(n.bind(null,17)),Promise.all([n.e(0),n.e(1)]).then(n.bind(null,16)),n.e(26).then(n.bind(null,28))]);if(window.addEventListener("resize",l),l(),r.a){const t=()=>{d=1===n&&r.a&&!v.default.isOverlayActive,l(),e!==window&&(d?(window.removeEventListener("resize",l),e.addEventListener("resize",l)):(e.removeEventListener("resize",l),window.addEventListener("resize",l)))};let n;v.default.addEventListener("im_tab_change",e=>{const o=void 0!==n;n=e,(o||1===n)&&t()}),v.default.addEventListener("overlay_toggle",()=>{t()})}h.IS_FIREFOX&&!s.a&&document.addEventListener("dragstart",e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return Object(i.a)(e),!1}),document.addEventListener("dragstart",e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1}),h.IS_FIREFOX&&document.documentElement.classList.add("is-firefox"),h.IS_APPLE?(h.IS_SAFARI&&document.documentElement.classList.add("is-safari"),document.documentElement.classList.add("emoji-supported"),h.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac")):h.IS_ANDROID&&document.documentElement.classList.add("is-android"),b.IS_TOUCH_SUPPORTED?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch");const y=performance.now(),E=p.default.getCacheLangPack(),[S,w]=yield Promise.all([g.default.getState(),E]);function I(e,t){e.style.opacity="0",t.then(()=>{window.requestAnimationFrame(()=>{e.style.opacity=""})})}p.default.setTimeFormat(S.settings.timeFormat),v.default.setThemeListener(),w.appVersion!==o.a.langPackVersion&&p.default.getLangPack(w.lang_code),console.log("got state, time:",performance.now()-y);const O=S.authState;if("authStateSignedIn"!==O._){console.log("Will mount auth page:",O._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,o;if(e){t=e.querySelector(".scrollable"),b.IS_TOUCH_SUPPORTED&&!u.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.all([n.e(0),n.e(1)]).then(n.bind(null,24)),Promise.all([n.e(0),n.e(1)]).then(n.bind(null,26))]).then(([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()})}catch(e){}switch(O._){case"authStateSignIn":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(16)]).then(n.bind(null,20))).default.mount();break;case"authStateSignQr":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(17)]).then(n.bind(null,22))).default.mount();break;case"authStateAuthCode":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(13)]).then(n.bind(null,23))).default.mount(O.sentCode);break;case"authStatePassword":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(11)]).then(n.bind(null,21))).default.mount();break;case"authStateSignUp":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(5),n.e(12)]).then(n.bind(null,25))).default.mount(O.authCode)}if(t){o&&(yield o);I(t,"fonts"in document?Promise.race([new Promise(e=>setTimeout(e,1e3)),document.fonts.ready]):Promise.resolve())}}else console.log("Will mount IM page:",Date.now()/1e3),I(document.getElementById("main-columns"),Object(c.a)()),(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(29)]).then(n.bind(null,19))).default.mount();const L=(yield n.e(18).then(n.bind(null,18))).ripple;Array.from(document.getElementsByClassName("rp")).forEach(e=>L(e))})))},function(e,t,n){},function(e,t,n){},function(e,t,n){}]); +//# sourceMappingURL=main.44c380c3c13ddc1cf9bd.bundle.js.map \ No newline at end of file diff --git a/public/main.44c380c3c13ddc1cf9bd.bundle.js.map b/public/main.44c380c3c13ddc1cf9bd.bundle.js.map new file mode 100644 index 000000000..cd3936b10 --- /dev/null +++ b/public/main.44c380c3c13ddc1cf9bd.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/environment/userAgent.ts","webpack:///./src/environment/touchSupport.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack:///./src/helpers/dom/fixSafariStickyInput.ts","webpack:///./src/helpers/dom/cancelEvent.ts","webpack:///./src/helpers/dom/findUpClassName.ts","webpack:///./src/helpers/dom/blurActiveElement.ts","webpack:///./src/config/app.ts","webpack:///./src/helpers/dom/loadFonts.ts","webpack:///./src/environment/emojiSupport.ts","webpack:///./src/index.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","9","jsonpScriptSrc","__webpack_require__","p","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","error","Error","script","loadScript","src","retries","onScriptComplete","document","createElement","charset","timeout","nc","setAttribute","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","cacheBust","Date","now","retryScript","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","this","oldJsonpFunction","slice","s","USER_AGENT","navigator","userAgent","IS_APPLE","search","IS_ANDROID","toLowerCase","indexOf","IS_CHROMIUM","test","vendor","IS_APPLE_MOBILE","platform","maxTouchPoints","MSStream","IS_SAFARI","match","IS_FIREFOX","IS_MOBILE_SAFARI","IS_MOBILE","IS_TOUCH_SUPPORTED","window","DocumentTouch","ctx","self","IS_STICKY_INPUT_BUGGED","startY","capture","passive","onTouchMove","touch","touches","scrollable","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","Math","round","preventDefault","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","activeElement","blur","fixSafariStickyInputFocusing","input","add","fixSafariStickyInput","style","transform","focus","cancelEvent","originalEvent","stopPropagation","returnValue","cancelBubble","findUpClassName","el","className","closest","blurActiveElement","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","location","hostname","suffix","loadFonts","race","map","font","fonts","load","IS_EMOJI_SUPPORTED","Element","toggleAttribute","force","hasAttribute","removeAttribute","w","visualViewport","lastVH","setViewportVH","setVH","vh","rootScope","default","isOverlayActive","height","innerHeight","touchSupport","documentElement","setProperty","workerProxy","Proxy","Worker","construct","args","_","appStateManager","I18n","__","toggleResizeMode","tabId","wasTabId","tagName","perf","performance","langPromise","getCacheLangPack","state","getState","fadeInWhenFontsReady","elem","opacity","then","requestAnimationFrame","setTimeFormat","settings","timeFormat","setThemeListener","appVersion","getLangPack","lang_code","log","authState","getElementById","pagePromise","querySelector","placeholder","prepend","append","cloneNode","meModule","pushModule","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","ready","ripple","Array","from","getElementsByClassName","forEach"],"mappings":"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","file":"main.44c380c3c13ddc1cf9bd.bundle.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t9: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"10\":\"npm.qr-code-styling\"}[chunkId]||chunkId) + \".\" + {\"0\":\"0b9ffba7741c4b0e3b41\",\"1\":\"5ce290a0391e0bae24df\",\"2\":\"a1197bdcb1dacde64b1b\",\"3\":\"f3be892bf29dd69632d3\",\"4\":\"ec435aa1cabc18e1be43\",\"5\":\"5145323b4bc82cc62ff7\",\"6\":\"d600026c8e100eea4159\",\"7\":\"eebe55366b507a8f74c2\",\"8\":\"479ac71b1f70d56a0c98\",\"10\":\"b2874a156be40d4efbb7\",\"11\":\"0091c78c69fac393d4c2\",\"12\":\"72db7f7146e96df8b3df\",\"13\":\"e32751cf9be91bb5497a\",\"14\":\"11183df10f220f2bd1db\",\"15\":\"9bac63e86519380bd679\",\"16\":\"e12ddbc52a3f75e72c89\",\"17\":\"be8ba8da5cf5a29471fb\",\"18\":\"587a0b097be84c2c4267\",\"19\":\"f2e6785986f5892e804d\",\"20\":\"a6eb3895e2c4cb798a93\",\"21\":\"44abbe422120bbe15936\",\"22\":\"077684f6412887cea1da\",\"23\":\"6ddfbc8ae4fd86a3b037\",\"24\":\"db7832d10818afdb3839\",\"25\":\"542232e0e7b171d74445\",\"26\":\"3728922ed59faa39207a\",\"27\":\"afe309283a478f17a54d\",\"28\":\"915fd231c46789adc787\",\"29\":\"e7945a7ebae7a3b06d65\",\"30\":\"b373d83017596ec6462f\",\"31\":\"2de22fb7274e1d4a2d03\"}[chunkId] + \".chunk.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tfunction loadScript(src, retries) {\n \t\t\t\t var script = document.createElement('script');\n \t\t\t\t var retryAttempt = 999999 - retries + 1;\n \t\t\t\t var retryAttemptString = '&retry-attempt=' + retryAttempt;\n \t\t\t\t var onScriptComplete;\n\n \t\t\t\t script.charset = 'utf-8';\n \t\t\t\t script.timeout = 120;\n \t\t\t\t if (__webpack_require__.nc) {\n \t\t\t\t script.setAttribute('nonce', __webpack_require__.nc);\n \t\t\t\t }\n \t\t\t\t script.src = src;\n\n \t\t\t\t onScriptComplete = function(event) {\n \t\t\t\t // avoid mem leaks in IE.\n \t\t\t\t script.onerror = script.onload = null;\n \t\t\t\t clearTimeout(timeout);\n \t\t\t\t var chunk = installedChunks[chunkId];\n \t\t\t\t if (chunk !== 0) {\n \t\t\t\t if (chunk) {\n \t\t\t\t if (retries === 0) {\n \t\t\t\t var errorType =\n \t\t\t\t event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t var realSrc = event && event.target && event.target.src;\n \t\t\t\t error.message =\n \t\t\t\t 'Loading chunk ' +\n \t\t\t\t chunkId +\n \t\t\t\t ' failed after 999999 retries.\\n(' +\n \t\t\t\t errorType +\n \t\t\t\t ': ' +\n \t\t\t\t realSrc +\n \t\t\t\t ')';\n \t\t\t\t error.name = 'ChunkLoadError';\n \t\t\t\t error.type = errorType;\n \t\t\t\t error.request = realSrc;\n \t\t\t\t chunk[1](error);\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t } else {\n \t\t\t\t setTimeout(function() {\n \t\t\t\t var cacheBust = (function() {\n \t\t\t\t return Date.now();\n \t\t\t\t })();\n \t\t\t\t +retryAttemptString;\n \t\t\t\t var retryScript = loadScript(\n \t\t\t\t jsonpScriptSrc(chunkId) + '?' + cacheBust,\n \t\t\t\t retries - 1\n \t\t\t\t );\n \t\t\t\t document.head.appendChild(retryScript);\n \t\t\t\t }, 0);\n \t\t\t\t }\n \t\t\t\t } else {\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t }\n \t\t\t\t }\n \t\t\t\t };\n \t\t\t\t var timeout = setTimeout(function() {\n \t\t\t\t onScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t }, 120000);\n \t\t\t\t script.onerror = script.onload = onScriptComplete;\n \t\t\t\t return script;\n \t\t\t\t}\n\n \t\t\t\tvar script = loadScript(jsonpScriptSrc(chunkId), 999999);\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = this[\"webpackJsonp\"] = this[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 11);\n","/*\r\n * https://github.com/morethanwords/tweb\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// @ts-ignore\r\nexport const IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport { IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\nimport findUpClassName from \"./findUpClassName\";\nimport fixSafariStickyInput from \"./fixSafariStickyInput\";\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n let key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n //console.log('touchmove y', touch[key], startY);\n \n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n //const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n //console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n //console.log('touchmove no scrollable', e, touch);\n }\n\n //if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n \n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n \n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n \n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement && \n document.activeElement.classList.contains('is-sticky-input-bugged') && \n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\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 //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 }, 0);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport 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\nexport default function blurActiveElement() {\r\n if(document.activeElement && (document.activeElement as HTMLInputElement).blur) {\r\n (document.activeElement as HTMLInputElement).blur();\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.3.7',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nlet promise: Promise;\r\nexport default function loadFonts(): Promise {\r\n if(promise) return promise;\r\n return promise = 'fonts' in document ? \r\n Promise.race([\r\n // @ts-ignore\r\n Promise.all(['400 1rem Roboto', '500 1rem Roboto', '500 1rem tgico'].map(font => document.fonts.load(font))),\r\n new Promise((resolve) => setTimeout(resolve, 1e3))\r\n ]) : \r\n Promise.resolve();\r\n}\r\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\r\n\r\nexport default IS_EMOJI_SUPPORTED;","/*\n * 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_MOBILE_SAFARI } from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport './scss/tgico.scss';\n/* import { computeCheck } from './lib/crypto/srp';\nimport { salt1, salt2, g, p, srp_id, secure_random, srp_B, password } from './mock/srp'; */\n\n//console.log('pineapples are in my head');\n\n/* console.time('get storage1');\nimport * as a from './lib/config';\nimport * as b from './lib/mtproto/mtproto_config';\nimport * as c from './helpers/userAgent';\nimport * as d from './lib/mtproto/mtprotoworker';\nimport * as e from './lib/polyfill';\nimport * as f from './lib/storage';\na && b && c && d && e && f;\nconsole.timeEnd('get storage1'); */\n\n/* Promise.all([\n import('./components/pageIm'),\n import('./components/pageSignIn'),\n import('./components/misc'),\n import('./lib/storage')\n]).then(imports => {\n let [pageIm, pageSignIn, misc, AppStorage] = imports; */\n\n document.addEventListener('DOMContentLoaded', async() => {\n //let socket = new Socket(2);\n\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 // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n // @ts-ignore\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n // @ts-ignore\n const vh = (setViewportVH && !rootScope.default.isOverlayActive ? w.height || w.innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(touchSupport.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 // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n //console.log(target, args);\n const url = args[0] + location.search;\n\n return new target(url);\n }\n };\n \n const workerProxy = new Proxy(Worker, workerHandler);\n Worker = workerProxy;\n\n 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 //console.timeEnd('get storage');\n\n window.addEventListener('resize', setVH);\n setVH();\n\n //console.log(new Uint8Array([255, 200, 145]).hex);\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !rootScope.default.isOverlayActive;\n setVH();\n \n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n \n let tabId: number;\n rootScope.default.addEventListener('im_tab_change', (id) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n \n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n });\n \n rootScope.default.addEventListener('overlay_toggle', () => {\n toggleResizeMode();\n });\n }\n\n if(userAgent.IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === \"IMG\") {\n e.preventDefault();\n return false;\n }\n });\n\n if(userAgent.IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox');\n }\n\n if(userAgent.IS_APPLE) {\n if(userAgent.IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n \n document.documentElement.classList.add('emoji-supported');\n\n if(userAgent.IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(userAgent.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(!touchSupport.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 /* if(config.isServiceWorkerSupported) {\n await navigator.serviceWorker.ready;\n navigator.serviceWorker.controller ? true : await new Promise((resolve, reject) => {\n navigator.serviceWorker.addEventListener('controllerchange', resolve);\n });\n } */\n \n //console.time('get storage');\n\n const perf = performance.now();\n\n //import('./vendor/dateFormat');\n\n const langPromise = I18n.default.getCacheLangPack();\n\n const [state, langPack] = await Promise.all([\n appStateManager.default.getState(), \n langPromise\n ]);\n //I18n.getCacheLangPack();\n //console.log('got auth:', auth);\n //console.timeEnd('get storage');\n\n I18n.default.setTimeFormat(state.settings.timeFormat);\n\n rootScope.default.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.default.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n const authState = state.authState;\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!touchSupport.IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n \n }\n\n let pagePromise: Promise;\n //langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn': \n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr': \n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n }\n //});\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ? \n Promise.race([\n new Promise((resolve) => setTimeout(resolve, 1e3)), \n // @ts-ignore\n document.fonts.ready\n ]) : \n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* computeCheck(password, {\n current_algo: {\n salt1, \n salt2,\n p,\n g\n },\n srp_id,\n srp_B,\n secure_random,\n }).then(res => {\n console.log(res);\n }); */\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\t\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pageSignQR')).default.mount();\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pagePassword')).default.mount();\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\t\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n //getNearestDc();\n }\n\n const ripple = (await import('./components/ripple')).ripple;\n (Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\n });\n//});\n\n\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.46ecaa33a4d72f91b821.css b/public/main.46ecaa33a4d72f91b821.css new file mode 100644 index 000000000..0911e6c06 --- /dev/null +++ b/public/main.46ecaa33a4d72f91b821.css @@ -0,0 +1,5 @@ +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{text-decoration:none;-webkit-tap-highlight-color:transparent}img,video{-webkit-user-drag:none}.valign-wrapper{display:flex;align-items:center}.z-depth-0{box-shadow:none !important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none !important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition{transition:none !important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start !important}.justify-self-start{justify-self:flex-start !important}.justify-self-end{justify-self:flex-end !important}.position-center{position:absolute !important;left:50%;top:50%;transform:translate(-50%, -50%)}.text-bold{font-weight:500 !important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap !important}.no-border-radius{border-radius:0 !important}.disable-hover{pointer-events:none !important}a{text-decoration:none}html{line-height:1.5;font-weight:normal}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}pre,code{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word} +:root{--vh: 1vh;--z-below: -1;--hover-alpha: 0.08;--transition-standard-easing: cubic-bezier(.4, .0, .2, 1);--transition-standard-in-time: .3s;--transition-standard-out-time: .25s;--transition-standard-in: var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out: var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition: .2s ease-in-out;--layer-transition: .2s cubic-bezier(.4, .0, .2, 1);--slide-header-transition: .4s ease-in-out;--tabs-transition: .25s ease-in-out;--btn-menu-transition: .2s cubic-bezier(.4, 0, .2, 1);--esg-transition: var(--btn-menu-transition);--popup-transition-function: cubic-bezier(.4, 0, .2, 1);--popup-transition-time: .15s;--btn-corner-transition: .2s cubic-bezier(.34, 1.56, .64, 1);--chatlist-badge-transition-in: .2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out: .2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin: 5.5625rem;--message-beside-button-size: 2.375rem;--message-beside-button-margin: calc((var(--message-beside-button-size) + .5rem) * -1);--message-time-background: rgba(0, 0, 0, .35);--message-highlightning-color: hsla(85.5319, 36.9171%, 40.402%, .4);--messages-container-width: 728px;--messages-text-size: 16px;--messages-secondary-text-size: calc(var(--messages-text-size) - 2px);--line-height: 1.3125;--esg-sticker-size: 80px;--disabled-opacity: .3;--round-video-size: 280px;--topbar-floating-scaleX: 1;--topbar-call-height: 3rem;--topbar-floating-call-height: 0px;--peer-avatar-red-top: #ff885e;--peer-avatar-red-bottom: #ff516a;--peer-avatar-orange-top: #ffcd6a;--peer-avatar-orange-bottom: #ffa85c;--peer-avatar-violet-top: #82b1ff;--peer-avatar-violet-bottom: #665fff;--peer-avatar-green-top: #a0de7e;--peer-avatar-green-bottom: #54cb68;--peer-avatar-cyan-top: #53edd6;--peer-avatar-cyan-bottom: #28c9b7;--peer-avatar-blue-top: #72d5fd;--peer-avatar-blue-bottom: #2a9ef1;--peer-avatar-pink-top: #e0a2f3;--peer-avatar-pink-bottom: #d669ed}@media only screen and (max-width: 600px){:root{--right-column-width: 100vw;--esg-sticker-size: 68px;--round-video-size: 200px;--chat-input-size: 2.875rem;--chat-input-padding: 0.5rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 601px){:root{--right-column-width: calc(1680px / 4);--chat-input-size: 3.375rem;--chat-input-padding: 0.8125rem;--chat-input-inner-padding: 0.5rem}}@media only screen and (max-height: 569px){:root{--chat-input-size: 2.875rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 1276px)and (max-width: 1680px){:root{--right-column-width: 25vw}}:root{--body-background-color: #fff;--background-color-true: #f4f4f5;--background-color: #fff;--border-color: #dfe1e5;--surface-color: #fff;--scrollbar-color: rgba(0, 0, 0, .2);--input-search-background-color: #fff;--input-search-border-color: #dfe1e5;--primary-color: #3390ec;--light-primary-color: rgba(51, 144, 236, 0.08);--dark-primary-color: #157ce1;--primary-text-color: #000;--secondary-color: #c4c9cc;--secondary-text-color: #707579;--light-secondary-text-color: rgba(112, 117, 121, 0.08);--danger-color: #df3f40;--light-danger-color: rgba(223, 63, 64, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-blue-top);--avatar-color-bottom: var(--peer-avatar-blue-bottom);--chatlist-status-color: var(--avatar-online-color);--chatlist-pinned-color: #a2abb2;--badge-text-color: #fff;--link-color: #00488f;--ripple-color: rgba(0, 0, 0, .08);--poll-circle-color: var(--border-color);--message-background-color: var(--surface-color);--message-checkbox-color: #61c642;--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #eeffde;--light-message-out-background-color: rgba(238, 255, 222, 0.08);--dark-message-out-background-color: #d9ffb5;--message-out-link-color: var(--link-color);--message-out-primary-color: #4fae4e;--message-out-status-color: var(--message-out-primary-color);--message-out-audio-play-button-color: #fff;--gc-background-color: #212121;--gc-button-leave-color: rgba(255, 89, 90, .3);--gc-button-unmuted-color: rgba(1, 200, 80, .2);--gc-button-muted-color: rgba(60, 135, 247, .2);--gc-button-hand-color: rgba(223, 68, 184, .2);--gc-button-unmuted-fill-color: #195530;--gc-button-muted-fill-color: #3C87F7;--gc-green-color: #195530;--gc-blue-color: #3C87F7;--gc-red-color: #643333;--gc-primary-text-color: #fff;--gc-secondary-text-color: #aaaaaa;--gc-green-text-color: #5CC85E;--gc-blue-text-color: #3390ec;--gc-red-text-color: #ff595a;--gc-right-column-width: 26.25rem}.night{--body-background-color: #181818;--background-color-true: #181818;--background-color: #212121;--border-color: #0f0f0f;--surface-color: #212121;--scrollbar-color: rgba(255, 255, 255, .2);--input-search-background-color: #181818;--input-search-border-color: #2f2f2f;--primary-color: #8774E1;--light-primary-color: rgba(135, 116, 225, 0.08);--dark-primary-color: #6a52da;--primary-text-color: #fff;--secondary-color: #707579;--secondary-text-color: #aaaaaa;--light-secondary-text-color: rgba(170, 170, 170, 0.08);--danger-color: #ff595a;--light-danger-color: rgba(255, 89, 90, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-violet-top);--avatar-color-bottom: var(--peer-avatar-violet-bottom);--chatlist-status-color: var(--primary-color);--chatlist-pinned-color: var(--secondary-color);--badge-text-color: #fff;--link-color: var(--primary-color);--ripple-color: rgba(255, 255, 255, .08);--poll-circle-color: #fff;--message-background-color: var(--surface-color);--message-checkbox-color: var(--primary-color);--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #8774E1;--light-message-out-background-color: rgba(135, 116, 225, 0.08);--dark-message-out-background-color: #6a52da;--message-out-link-color: #fff;--message-out-primary-color: #fff;--message-out-status-color: rgba(255, 255, 255, .6);--message-out-audio-play-button-color: var(--message-out-background-color)}.input-wrapper{width:360px;margin:0 auto}.input-field{--height: 54px;--border-radius: 10px;position:relative}@media only screen and (max-width: 600px){.input-field{--height: 50px}}.input-field .arrow-down{position:absolute;content:" ";top:50%;bottom:0;right:21px;cursor:pointer;height:0;width:0;border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;display:inline-block;padding:5px;vertical-align:middle;z-index:2;margin-top:-9px;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:.2s all}.input-field label{position:absolute;color:#9e9e9e;top:0;left:1rem;right:auto;z-index:2;height:1.5rem;transform:translate(0, 0);background-color:#fff;background-color:var(--surface-color);transform-origin:left center;pointer-events:none;margin-top:calc((var(--height) - 1.5rem) / 2);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-2 .input-field label{transition:.2s transform,.2s padding,.1s opacity,font-weight 0s .1s}.input-field-border{position:absolute;top:0;right:0;bottom:0;left:0;border:2px solid #3390ec;border:2px solid var(--primary-color);opacity:0;border-radius:var(--border-radius);pointer-events:none;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding: 1rem;--padding-horizontal: 1rem;--border-width: 1px;border:var(--border-width) solid #dfe1e5;border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);background-color:#fff;background-color:var(--surface-color);padding:calc(var(--padding) - var(--border-width));box-sizing:border-box;width:100%;min-height:var(--height);transition:0s border-color;position:relative;z-index:1;line-height:1.3125;line-height:var(--line-height)}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{-webkit-box-shadow:0 0 0px 1000px #fff inset;-webkit-box-shadow:0 0 0px 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill::first-line,.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{font-family:"Roboto",-apple-system,apple color emoji,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif !important;font-size:1rem !important;color:#000 !important;color:var(--primary-text-color) !important}@media only screen and (max-width: 600px){.input-field-input{--padding: .9375rem}}body.animation-level-0 .input-field-input{transition:none !important}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:.2s border-color}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40 !important;color:var(--danger-color) !important}.input-field-input.error~.input-field-border{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f !important}.input-field-input.valid~.input-field-border{border-color:#26962f !important}.input-field-input:focus~.arrow-down{margin-top:-4px;transform:rotate(225deg);border-color:#3390ec;border-color:var(--primary-color)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:focus~label,.input-field-input:valid~label,.input-field-input:not(:empty)~label,.input-field-input:disabled~label{transform:translate(-0.25rem, calc(var(--height) / -2 + .125rem)) scale(0.75);padding:0 6px;opacity:1}.input-field-input-fake{opacity:0;pointer-events:none;position:absolute !important;top:0;left:0;bottom:auto !important;right:auto !important;height:auto !important;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}input:focus,button:focus{outline:none}.input-clear{outline:none;border:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40 !important;color:var(--danger-color) !important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}.input-search{position:relative;width:100%;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;--border-radius: 22px}@media only screen and (max-width: 600px){.input-search{margin-left:1rem}}.input-search-input{--height: 42px;background-color:#fff;background-color:var(--input-search-background-color);padding:0px calc(var(--height) + 3px - var(--border-width));height:var(--height);min-height:var(--height) !important;max-height:var(--height) !important;border-color:#dfe1e5;border-color:var(--input-search-border-color);line-height:var(--height)}body.animation-level-2 .input-search-input{transition:background-color .2s ease-in-out,border-color .2s ease-in-out}html.no-touch .input-search-input:hover:not(:focus),html.no-touch .input-search-input:active:not(:focus){border-color:#c4c9cc !important;border-color:var(--secondary-color) !important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:hover,html.no-touch .input-search-input:focus~.btn-icon:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{position:absolute;top:50%;transform:translate(0, -50%);text-align:center;font-size:24px;color:#707579;color:var(--secondary-text-color);opacity:.6;line-height:1;z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{width:24px;height:24px;left:.8125rem;pointer-events:none}.input-search>.tgico-close{right:0px;z-index:1;width:42px;height:42px}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{padding-right:2.5rem;max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-size:2.25rem;padding-left:calc(.875rem - var(--border-width))}@media(-webkit-min-device-pixel-ratio: 2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{position:absolute;right:.375rem;z-index:2;font-size:1.5rem;color:#9e9e9e;cursor:pointer;transition:color .2s;padding:.5rem;display:flex;align-items:center;justify-content:center;top:50%;transform:translateY(-50%)}.input-field-password .toggle-visible:before{content:""}.input-field-password .toggle-visible.eye-hidden:before{content:""}html.no-touch .input-field-password .toggle-visible:hover,html.no-touch .input-field-password .toggle-visible:active{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing: .24px}.input-field-phone .input-field-input:after{content:attr(data-left-pattern);color:#9e9e9e;letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;outline:none;border:none;cursor:pointer}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn:hover,html.no-touch .btn:active,html.no-touch .btn-icon:hover,html.no-touch .btn-icon:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn.primary:hover,html.no-touch .btn.primary:active,html.no-touch .btn.blue:hover,html.no-touch .btn.blue:active,html.no-touch .btn.active:hover,html.no-touch .btn.active:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn-icon.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn:disabled,.btn-icon:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{text-align:center;font-size:1.5rem;line-height:1;border-radius:50% !important;color:#707579;color:var(--secondary-text-color);background-color:transparent;border:none;padding:.5rem;position:relative;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out;display:flex;align-items:center;justify-content:center}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset: 1.25rem;--translateY: calc(54px + var(--offset));position:absolute !important;bottom:var(--offset);right:var(--offset);transition:transform .2s cubic-bezier(.34, 1.56, .64, 1) !important;transition:transform var(--btn-corner-transition) !important;transform:translate3d(0, var(--translateY), 0);z-index:3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#3390ec;background-color:var(--primary-color);text-align:center;font-size:1.5rem;color:#fff;border:none;outline:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0 !important}.btn-corner.is-visible{--translateY: 0}body.animation-level-0 .btn-corner{transition:none !important}.btn-corner:disabled{opacity:1 !important;pointer-events:all !important}.btn-corner .preloader-circular{width:2.5rem;height:2.5rem}.btn-menu{visibility:hidden;position:absolute;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 2px 8px 1px rgba(0,0,0,.24);z-index:3;top:100%;padding:.5rem 0;border-radius:10px;opacity:0;transform:scale(0.8);transition:opacity .2s cubic-bezier(.4, 0, .2, 1),transform .2s cubic-bezier(.4, 0, .2, 1),visibility .2s cubic-bezier(.4, 0, .2, 1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);font-size:16px;-webkit-user-select:none;-webkit-touch-callout:none}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{visibility:visible;opacity:1;transform:scale3d(1, 1, 1)}.btn-menu:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none !important}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{top:auto;top:initial;right:0;bottom:100%;transform-origin:bottom right}.btn-menu.top-right{top:auto;top:initial;left:0;bottom:100%;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{display:flex;position:relative;padding:0 40px 0 1rem;height:56px;cursor:pointer !important;pointer-events:all !important;color:#000;color:var(--primary-text-color);text-transform:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;align-items:center;text-align:left;line-height:1.3125;line-height:var(--line-height)}html.no-touch .btn-menu-item:hover,html.no-touch .btn-menu-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:hover,html.no-touch .btn-menu-item.danger:active{background-color:danger}.btn-menu-item:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}@media only screen and (max-width: 600px){.btn-menu-item{padding:0 30px 0 16px;height:50px}}.btn-menu-item-text{flex:1 1 auto}.btn-menu-overlay{position:fixed !important;left:0;right:0;top:0;bottom:0;z-index:3;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-menu-overlay{left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;width:auto !important;max-width:none !important}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{height:2.5rem;background:#f4f4f5;background:var(--background-color-true);display:flex;align-items:center;justify-content:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;font-size:.875rem;color:currentColor}.btn-menu hr{padding:0;margin:.5rem 0}.btn-primary{border-radius:10px;width:100%;text-align:center;height:54px;border:none;font-weight:500;cursor:pointer;overflow:hidden;position:relative;padding:0;transition:.2s opacity}html.no-touch .btn-primary:hover,html.no-touch .btn-primary:active{transition:.2s background-color,.2s opacity;background:#157ce1;background:var(--dark-primary-color)}.btn-primary-transparent{color:#3390ec;color:var(--primary-color);background-color:transparent}html.no-touch .btn-primary-transparent:hover,html.no-touch .btn-primary-transparent:active{background:rgba(51, 144, 236, 0.08);background:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:hover,html.no-touch .btn-primary-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary>svg,.btn-primary use{height:calc(100% - 20px);right:15px;left:auto}.btn-primary:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-control{width:auto;height:40px;align-items:center;margin:15px auto 1rem;border-radius:20px;padding:0 24px 0 12px;display:flex}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{color:#000;color:var(--primary-text-color);background-color:transparent;display:flex;align-items:center;padding:0 1rem;height:3.5rem;font-weight:normal;line-height:1.3125}@media only screen and (max-width: 600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:hover,html.no-touch .btn-transparent:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:hover,html.no-touch .btn-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);right:auto;left:auto;margin:0;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{position:relative;overflow:visible !important;font-weight:normal !important;cursor:pointer !important;pointer-events:all !important}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size: 54px;border-radius:50%;height:var(--size);width:var(--size);line-height:var(--size)}@media only screen and (max-width: 600px){.btn-circle{--size: 46px}}.btn-circle path{fill:#fff}.btn-disabled{pointer-events:none !important;cursor:default !important;color:#707579 !important;color:var(--secondary-text-color) !important}.btn-disabled:before{color:inherit !important}.btn-secondary:not(:first-child){margin-top:.5rem !important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.animated-close-icon{position:absolute;transform:rotate(-45deg);pointer-events:none}.animated-close-icon,.animated-close-icon:before,.animated-close-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color)}.animated-close-icon:before,.animated-close-icon:after{position:absolute;left:0;top:0;content:""}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:before,body.animation-level-2 .animated-close-icon:after{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}body.animation-level-2 .animated-close-icon.no-transition,body.animation-level-2 .animated-close-icon.no-transition:before,body.animation-level-2 .animated-close-icon.no-transition:after{transition:none}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translateY(-0.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translateY(0.375rem)}.animated-menu-icon{position:absolute}.animated-menu-icon,.animated-menu-icon:before,.animated-menu-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color);transform:rotate(0)}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:before,body.animation-level-2 .animated-menu-icon:after{transition:transform .25s}.animated-menu-icon:before,.animated-menu-icon:after{position:absolute;left:0;content:""}.animated-menu-icon:before{top:-0.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem)}.animated-button-icon>.tgico{position:absolute;height:24px;line-height:24px}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s forwards ease-in-out;animation:hide-icon .4s forwards ease-in-out}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden;-webkit-animation:none !important;animation:none !important}.autocomplete-helper{--border-radius: 10px;position:absolute !important;bottom:calc(100% + .5rem);overflow:hidden;padding:0 !important;border-radius:var(--border-radius) !important;max-width:100%;left:0;width:auto !important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width: 319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal) * 4)}}.autocomplete-peer-helper .scrollable{position:relative;max-height:232px}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{height:3.125rem;display:flex;padding:0 2.125rem 0 .75rem;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{margin-left:.875rem;font-weight:500;flex:0 0 auto}.autocomplete-peer-helper-list-element-description{margin-left:.5625rem;color:#707579;color:var(--secondary-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;font-weight:500;color:#fff;color:var(--badge-text-color);font-size:.875rem;text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;min-width:1.25rem;line-height:1.25rem !important;padding:0 .375rem}.badge-24{height:1.5rem;min-width:1.5rem;line-height:1.5rem !important;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:100%;width:100%;z-index:10000000;background:#000;border-radius:0 !important;display:flex}.ckin__player.ckin__fullscreen video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.ckin__player .time{margin-left:.875rem;font-size:.875rem;color:#fff}@media only screen and (max-width: 600px){.ckin__player .time{margin-left:1.125rem}}.default{position:relative;font-size:0;display:flex;align-items:center;justify-content:center}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;line-height:1;color:#fff;text-align:center;outline:0;padding:0;cursor:pointer;position:absolute;opacity:1;visibility:visible;top:50%;left:50%;transform:translate3d(-50%, -50%, 0) scale(1);font-size:4rem;touch-action:manipulation}body.animation-level-2 .default__button--big{transition:visibility .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1);transition:visibility var(--layer-transition),opacity var(--layer-transition)}@media only screen and (max-width: 600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default__controls{position:absolute;bottom:0;right:0;left:0;text-align:left;direction:ltr;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}.default__controls .progress-line{margin:0 16px;border-radius:var(--border-radius)}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:rgba(255,255,255,.38)}@media only screen and (max-width: 600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{height:49px;padding-top:93px;bottom:0;z-index:2;background-position:bottom;width:100%;position:absolute;background-repeat:repeat-x;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);pointer-events:none}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}@media only screen and (max-width: 600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:""}.default .default__gradient-bottom{transform:translate3d(0, 50px, 0)}.default .default__controls{transform:translate3d(0, 52px, 0)}@media only screen and (max-width: 600px){.default .default__controls{transform:translate3d(0, 65px, 0)}}.default.show-controls .default__gradient-bottom,.default.show-controls .default__controls{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:""}.default .player-volume{margin:0 .125rem 0 .625rem;display:flex;align-items:center}html.is-touch .default .player-volume{display:none}.default .player-volume__icon{fill:#fff;width:2.25rem;height:2.25rem;margin-right:.5rem;cursor:pointer;padding:.375rem}.default .player-volume .progress-line{--color: #fff;margin:0;width:50px;--thumb-size: 15px}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none !important}video::-webkit-media-controls-enclosure{display:none !important}.progress-line{--color: var(--primary-color);--height: 5px;--border-radius: 6px;--thumb-size: 13px;border-radius:var(--border-radius);height:var(--height);position:relative;cursor:pointer}.progress-line:before{position:absolute;left:0;top:0;right:0;bottom:0;display:block;content:" ";border-radius:inherit}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;width:100%;cursor:pointer;padding:0;margin:0;outline:none;caret-color:var(--color);position:absolute;top:-0.5rem;bottom:-0.5rem}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;width:0;height:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{content:" ";display:block;height:var(--thumb-size);width:var(--thumb-size);border-radius:50%;background-color:var(--color);cursor:pointer;position:absolute;right:0;top:50%;transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1.25)}.progress-line__loaded,.progress-line:before{opacity:.3;background-color:#c4c9cc;background-color:var(--secondary-color)}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);position:absolute;top:0;bottom:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{width:100%;transform-origin:left center}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;color:none;border:none}input[type=range]::-ms-thumb{visibility:hidden}input[type=range]::-ms-tooltip{visibility:hidden}.left-controls,.right-controls{display:flex;align-items:center}.bottom-controls{padding:0 .625rem;height:2.25rem;display:flex;justify-content:space-between;align-items:center}@media only screen and (max-width: 600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size: 1.25rem;margin:1.5rem 1.1875rem;display:block;text-align:left;position:relative;cursor:pointer;min-width:var(--size);min-height:var(--size)}body.animation-level-2 .checkbox-field{transition:.2s opacity}.checkbox-field.checkbox-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width: 600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{position:absolute;left:0;top:50%;transform:translateY(-50%);width:var(--size);height:var(--size);border-radius:.25rem;overflow:hidden}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.checkbox-field .checkbox-box-check,.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border{position:absolute;top:0;left:0}.checkbox-field .checkbox-box-border{right:0;bottom:0;border-radius:inherit;border:2px solid #8d969c}.checkbox-field .checkbox-box-background{top:-15%;right:-15%;bottom:-15%;left:-15%;background-color:#3390ec;background-color:var(--primary-color);transform:scale(1);border-radius:50%;transition:transform .2s 0s ease-in-out}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none !important}.checkbox-field .checkbox-box-check{--offset: 3px;width:calc(var(--size) - var(--offset));height:calc(var(--size) - var(--offset));top:50%;left:50%;transform:translate(-50%, -50%)}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s .15s ease-in-out,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none !important}.checkbox-field .checkbox-caption{position:relative;padding-left:3.375rem;cursor:pointer;display:inline-block;min-height:24px;margin-top:1px;line-height:26px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:.2s opacity;color:inherit}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin-left:0;margin-right:0}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{overflow:hidden;border-radius:10px}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size: 1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{top:0;right:0;bottom:0;left:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset: calc(var(--size) - (var(--size) / 2 + .125rem))}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size: 1.375rem;position:relative;text-align:left;margin:1.25rem 0;line-height:1.3125;cursor:pointer}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main::before,.radio-field.hidden-widget .radio-field-main::after{visibility:hidden}.radio-field>input:checked~.radio-field-main::before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main::after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{padding-left:3.5rem;position:relative;color:inherit}.radio-field .radio-field-main::before,.radio-field .radio-field-main::after{content:"";display:block;position:absolute;left:0;top:50%;width:var(--size);height:var(--size);transform:translateY(-50%)}.radio-field .radio-field-main::before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main::before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main::after{left:.3125rem;width:.75rem;height:.75rem;border-radius:50%;background:#3390ec;background:var(--primary-color);transform:translateY(-50%) scale(0);transform-origin:center}body.animation-level-2 .radio-field .radio-field-main::after{transition:transform .1s ease}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0;opacity:0;z-index:-1;z-index:var(--z-below);position:absolute}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;visibility:hidden;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transition:transform .2s .05s ease-in-out;transform:scale(0)}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none !important;transition:background-color .2s !important}.checkbox-field-restriction .checkbox-box-check use{visibility:visible !important;stroke-dasharray:24.19,24.19 !important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out !important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{transform:rotate(45deg) translateY(-10px);stroke-dashoffset:35.5}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size: 20px;margin:0 .3125rem;padding:0;display:flex;align-items:center;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset: 3px;--toggle-width: 1.9375rem;width:var(--toggle-width);height:.875rem;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;position:relative;display:flex;align-items:center;margin:0 var(--offset)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{width:1.25rem;height:1.25rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);background-color:#fff;background-color:var(--surface-color);content:" ";transform:translateX(calc(var(--offset) * -1));border-radius:50%;position:absolute}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width: 600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{width:100%;padding:1rem 0 .5rem;margin-bottom:17px}@media only screen and (max-width: 600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);padding:0 23px;padding-bottom:1rem;font-weight:500;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width: 600px){.chatlist-container .search-group__name{padding:5px 9px 0 16px;font-size:15px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width: 600px){.chatlist-container .search-group-contacts{padding:0px 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0 5px !important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0px;padding:4px 0 0}.chatlist-container .search-super .search-group__name{padding-top:1rem;display:flex;justify-content:space-between}ul.chatlist{padding:0 .5rem}@media only screen and (max-width: 600px){ul.chatlist{padding:0}}.chatlist{margin:0;display:flex;flex-direction:column;position:relative;width:100%;background-color:#fff;background-color:var(--surface-color);-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.chatlist-chat{--background: unset;height:72px;border-radius:10px;display:flex;align-items:flex-start;flex-direction:row;position:relative;cursor:pointer;padding:.5625rem;overflow:hidden;background:var(--background)}@media only screen and (max-width: 600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:hover,html.no-touch .chatlist-chat:active{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{flex:0 0 auto;content:"";color:#a2abb2;color:var(--chatlist-pinned-color);font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{margin:0;display:flex;flex-direction:row;align-items:flex-start;height:27px}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background: var(--light-secondary-text-color)}@media only screen and (min-width: 601px){.chatlist-chat.active{--background: var(--primary-color) !important}.chatlist-chat.active .user-caption,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight{color:#fff}.chatlist-chat.active b{color:#fff !important}.chatlist-chat.active .user-title:after{color:rgba(255,255,255,.7)}.chatlist-chat.active .verified-background{fill:#fff !important}.chatlist-chat.active .verified-check{fill:#3390ec !important;fill:var(--primary-color) !important}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff !important;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color: #fff}}.chatlist li span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:27px}.chatlist .peer-typing-container{--color: var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{font-size:.75rem;padding:1px 0px 0px 0px;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block !important;margin-top:4px;margin-right:-3px;margin-left:.5rem;flex:0 0 auto}.chatlist .dialog-subtitle-media{width:1.25rem;height:1.25rem;position:relative;flex:0 0 auto;border-radius:.1875rem;margin-top:-0.1875rem;margin-right:.375rem;display:inline-block;vertical-align:middle}.chatlist .dialog-subtitle-media .tgico-play{position:absolute;z-index:1;color:#fff;left:50%;top:50%;transform:translate(-50%, -50%);line-height:1;font-size:.625rem}.chatlist .dialog-subtitle-media .media-photo{width:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;border-radius:inherit}.chatlist .dialog-group-call-icon{position:absolute;left:45px;top:45px;border:2px solid #fff;border:2px solid var(--surface-color);overflow:hidden;border-radius:50%;background-color:#0ac630;background-color:var(--avatar-online-color);width:20px;height:20px;z-index:2}body.animation-level-2 .chatlist .dialog-subtitle-badge,body.animation-level-2 .chatlist .dialog-group-call-icon{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating,body.animation-level-2 .chatlist .dialog-group-call-icon.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{overflow:hidden;color:#707579;color:var(--secondary-text-color);flex:1 1 auto;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{display:flex !important;align-items:center}.chatlist .user-title img.emoji{vertical-align:top;margin-top:4px;width:18px;height:18px}.chatlist .user-last-message img.emoji{width:20px;height:20px;margin-top:-3px}.chatlist .user-title,.chatlist .user-last-message{flex-grow:1}.chatlist .user-title i,.chatlist .user-last-message i{font-style:normal}.chatlist .message-status{margin-right:.125rem;display:inline-block;vertical-align:middle;color:#0ac630;color:var(--chatlist-status-color);line-height:1;width:1.25rem;height:1.25rem;font-size:1.25rem;position:relative;margin-top:-0.0625rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{position:absolute;top:0;left:0}.chatlist .mention{padding:0;background-color:#0ac630 !important;background-color:var(--chatlist-status-color) !important}html.is-mac .chatlist .mention{line-height:22px !important}.chatlist .mention-badge{margin-right:-2px}.chatlist .unread,.chatlist .is-muted.backwards .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0;margin-top:-0.5rem}.chatlist-new .chatlist-chat{height:4.5rem;padding:0 .75rem;align-items:center}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto !important}.chatlist-new span{line-height:1.3125 !important;line-height:var(--line-height) !important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width: 600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width: 600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-title,.contacts-container b,.contacts-container .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b,.search-group-contacts .user-last-message b{font-weight:normal}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width: 600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.chat-input{--translateY: 0;--padding-bottom: 0.5rem;--bottom: var(--padding-bottom);display:flex;width:100%;max-width:100%;padding-top:.25rem;flex-direction:column;flex:0 0 auto;position:relative;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translate3d(0, var(--translateY), 0)}body.animation-level-0 .chat-input{transition:none !important}@media only screen and (min-height: 570px)and (min-width: 601px){.chat-input{max-width:728px !important;max-width:var(--messages-container-width) !important}}@media only screen and (min-width: 601px){.chat-input{--padding-bottom: 1.25rem}}@media only screen and (max-height: 569px){.chat-input{--padding-bottom: 0.5rem}}@media only screen and (min-width: 1276px){.chat-input{width:calc(100% - var(--right-column-width)) !important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0) !important}}.chat-input.is-hidden{--translateY: 100%;transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, var(--translateY), 0) !important;position:absolute !important;bottom:0}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY: 0}.chat-input .chat-input-container{--padding-horizontal: var(--chat-input-padding);display:flex;align-items:flex-end;justify-content:space-between;max-width:728px;max-width:var(--messages-container-width);margin:0 auto;width:100%;padding:0 var(--padding-horizontal);flex:0 0 auto;position:relative;padding-bottom:var(--bottom)}.chat-input .chat-input-container .btn-circle{width:var(--chat-input-size);height:var(--chat-input-size)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .menu-send{top:auto;bottom:calc(100% + .5rem)}.chat-input .input-message-input{background:none;border:none;width:100%;padding:.5rem .5625rem;margin-top:-1px;max-height:calc(30rem - 2.5rem);overflow-y:none;resize:none;border:none;outline:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height)}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height: 30rem){.chat-input .input-message-input{max-height:max(36px, calc(100vh - 10rem))}}@media only screen and (max-width: 600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{content:attr(data-inline-placeholder);color:#a2acb4;pointer-events:none}.chat-input .toggle-emoticons:before{content:""}html.is-ios .chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:"" !important}.chat-input .btn-record-cancel{visibility:hidden;opacity:0;transition:visibility 0s .1s,opacity .1s 0s;padding:0;z-index:3;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal) * -1 + -0.5rem))}body.animation-level-0 .chat-input .btn-record-cancel{transition:none !important}.chat-input .btn-scheduled:after{content:"";position:absolute;top:5px;right:5px;width:.5rem;height:.5rem;border-radius:50%;background:#61c642;background:var(--message-checkbox-color)}.chat-input .btn-preloader .preloader{width:1.5rem;height:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s forwards ease-in-out !important;animation:hide-icon .4s forwards ease-in-out !important}.chat-input .float{align-self:center;display:none !important;margin:0 .75rem 0 0 !important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.chat-input .float{margin-right:.125rem !important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex !important}.chat-input .btn-send-container{position:absolute;right:var(--padding-horizontal);bottom:0;padding-bottom:inherit}.chat-input .btn-icon{transition:.2s color,background-color .2s,.2s opacity}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{transition:.2s transform;color:#707579;color:var(--secondary-text-color);z-index:3}.chat-input .btn-send .tgico-send{color:#3390ec !important;color:var(--primary-color) !important}.chat-input .btn-send .tgico-check{color:#3390ec !important;color:var(--primary-color) !important;height:32px !important;font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:bold}.chat-input .btn-send .tgico-schedule{background-color:#3390ec;background-color:var(--primary-color);color:#fff;border-radius:50%;width:34px;height:34px;display:flex;align-items:center;justify-content:center}.chat-input .btn-send.send .tgico-send,.chat-input .btn-send.record .tgico-microphone,.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.schedule .tgico-schedule{visibility:visible !important}.chat-input .btn-send:not(.record) .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}body.animation-level-2 .chat-input .btn-send.send .tgico-send,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone,body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem;background-color:#fff !important;background-color:var(--surface-color) !important}.chat-input .record-time{height:44px;line-height:44px;display:none}.chat-input .record-time:after{content:" ";width:10px;height:10px;background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;margin:0 9px;display:inline-block}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{border-radius:50%;background-color:rgba(0,0,0,.2);width:240px;height:240px;transform:scale(0);position:absolute;top:-94px;left:-94px;transition:transform .03s ease-in-out,visibility .1s;visibility:hidden}body.animation-level-0 .chat-input .record-ripple{transition:none !important}@media only screen and (max-width: 600px){.chat-input .record-ripple{width:300px;height:300px;top:-124px;left:-124px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon{color:#c6cbce}.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording .btn-record-cancel{opacity:1;visibility:visible;transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording .btn-send,.chat-input.is-recording .btn-record-cancel{pointer-events:all}.chat-input.is-recording .rows-wrapper{width:calc(100% - (var(--chat-input-size) * 2 + 1rem))}.chat-input.is-recording .attach-file{display:none}.chat-input.is-recording .record-time{display:block}.chat-input.is-recording .record-ripple{transition:transform .03s,visibility 0s;visibility:visible}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0px}.chat-input .new-message-wrapper,.chat-input .pinned-container{opacity:1}body.animation-level-2 .chat-input .new-message-wrapper,body.animation-level-2 .chat-input .pinned-container{transition:opacity .1s 0s}.chat-input .pinned-container{width:auto}.chat-input .pinned-container-button{height:2.5rem;padding:0 .625rem}.bubbles.is-selecting~.chat-input .new-message-wrapper{pointer-events:none}.bubbles.is-selecting:not(.backwards)~.chat-input .new-message-wrapper,.bubbles.is-selecting:not(.backwards)~.chat-input .pinned-container{opacity:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting:not(.backwards)~.chat-input .rows-wrapper{max-height:var(--chat-input-size)}.bubbles.is-selecting:not(.backwards)~.chat-input .reply-wrapper{height:0 !important;opacity:0;pointer-events:none}.bubbles.is-selecting:not(.backwards)~.chat-input .btn-send{transform:scale(0)}body.animation-level-2 .bubbles.is-selecting.backwards~.chat-input .new-message-wrapper,body.animation-level-2 .bubbles.is-selecting.backwards~.chat-input .pinned-container{transition:opacity .1s .1s}body.animation-level-2 .bubbles.is-selecting.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}.chat-input .pinned-container{box-shadow:none}@media only screen and (max-width: 600px){.chat-input .pinned-container{font-size:15px}}.chat-input .pinned-container .btn-transparent{justify-content:center}.chat-input .pinned-container .btn-transparent::before{margin-right:10px}.chat-input .pinned-container::before{box-shadow:none}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}#column-center{width:100%;position:relative;flex:3}@media only screen and (max-width: 600px){body.is-left-column-shown #column-center{transform:translate3d(100vw, 0, 0)}body.is-right-column-shown #column-center{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-center{position:fixed !important;left:0;top:0;bottom:0;right:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem, 0, 0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex !important;width:100%;align-items:center;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body.animation-level-0 .chat{transition:none !important}.chat:not(.active):not(:last-child){filter:brightness(0.8)}@media only screen and (min-width: 926px){.chat:not(.active){transform:translate3d(calc((100vw - min(calc(100vw * .4), 420px)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(calc(100vw * .4), 420px)), 0, 0)}}@media only screen and (min-width: 1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)), 0, 0)}}@media only screen and (min-width: 1276px)and (max-width: 1680px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(75vw, 0, 0)}}@media only screen and (max-width: 925px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(100vw, 0, 0)}}.chat-background{overflow:hidden;background-color:#e6ebee}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none !important}.chat-background,.chat-background-item{position:absolute !important;top:0;left:0;bottom:0;right:0}.chat-background-item{background-image:url("assets/img/bg.jpeg");background-size:cover;background-position:center center;background-color:inherit}body.animation-level-2 .chat-background-item{transition:opacity .25s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-out);opacity:0}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in);opacity:1}@media only screen and (min-width: 1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem 0;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out) !important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(0.666666667);transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in) !important}}.chat .drops-container{--padding: 20px;--pinned-floating-height: 0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width: 1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width: 600px){.chat .drops-container{--padding: 10px}}.chat .drop{max-width:696px;--wrapper-padding: 15px}.chat-input-wrapper{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);display:flex;align-items:center;flex-direction:column;width:calc(100% - (var(--chat-input-size) + 0.5rem));max-width:calc(100% - (var(--chat-input-size) + 0.5rem));justify-content:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;border-bottom-right-radius:0;box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);min-height:var(--chat-input-size);max-height:30rem;flex:0 0 auto;position:relative;z-index:3;transition:width .1s}body.animation-level-0 .chat-input-wrapper{transition:none}.selection-wrapper,.fake-selection-wrapper{position:absolute;left:50%;top:0;transform:translateX(-50%);width:28.75rem;max-width:calc(100% - (var(--chat-input-padding) * 2))}.selection-wrapper{border-radius:12px;box-shadow:none;transition:opacity .1s .1s;opacity:0}.selection-wrapper .selection-container{display:flex;justify-content:space-between;height:100%;border-radius:inherit;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:15px;display:flex;justify-content:space-between;align-items:center;width:100%}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);font-weight:500;flex-grow:1;white-space:nowrap;text-transform:capitalize}.selection-wrapper .selection-container .btn-icon{margin:0 5px 0 6px;height:42px;width:42px;line-height:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width: 600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width: 380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-right:.625rem;margin-left:.375rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;z-index:-1;visibility:hidden}.chat-input.type-pinned .rows-wrapper,.chat-input.type-pinned .fake-rows-wrapper{width:auto}.fake-rows-wrapper{position:absolute;left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - (var(--padding-horizontal) * 2) - .5625rem)}.fake-rows-wrapper .pinned-container{padding:0 .5rem}.rows-wrapper{transform:scaleX(1);transition:transform .2s,width .2s,max-height .2s,border-radius .1s}.rows-wrapper.is-centered{margin:0 auto}.rows-wrapper.is-centered~.fake-rows-wrapper{left:50%;transform:translateX(-50%)}.rows-wrapper .bubble-tail{transition:transform .1s}body.animation-level-0 .rows-wrapper .bubble-tail{transition:none}.rows-wrapper.is-centering:not(.backwards),.rows-wrapper.is-centered{border-bottom-right-radius:12px}.rows-wrapper.is-centering:not(.backwards) .bubble-tail,.rows-wrapper.is-centered .bubble-tail{transform:scaleX(-1) translateX(1.125rem)}@media only screen and (max-width: 600px){.rows-wrapper{--padding-vertical: 1px}}@media only screen and (max-width: 420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height: 569px){.rows-wrapper{--padding-vertical: 1px}}.rows-wrapper .bubble-tail{position:absolute;bottom:-1px;right:-8.4px;width:11px;height:20px;fill:#fff;fill:var(--surface-color);transform:scaleX(-1)}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color);background-color:rgba(51, 144, 236, 0.08) !important;background-color:var(--light-primary-color) !important}.rows-wrapper .attach-file .btn-menu{right:calc(var(--padding-horizontal) * -1 - .125rem);bottom:calc(100% + 1.125rem)}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .attach-file .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .attach-file .btn-menu>div{padding:0 38px 0 16px}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{display:flex;justify-content:space-between;align-items:center;width:100%;position:relative;background-color:inherit;border-radius:.75rem;padding:var(--padding)}.rows-wrapper .reply-wrapper{justify-content:flex-start;height:0;width:calc(100% - var(--padding-horizontal) * 2);padding:0;margin-top:.5625rem;margin-bottom:-0.5625rem;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2;opacity:0;pointer-events:none}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .reply-wrapper{margin-top:.3125rem;margin-bottom:-0.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{pointer-events:unset;height:36px;opacity:1}.rows-wrapper .reply-wrapper .reply{order:1;flex:1 1 auto;margin:0 .625rem}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{top:auto;bottom:calc(100% + 1.0625rem);left:3.125rem;transform:scale(1) !important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size: 1.5rem;order:0;margin:0 2rem 0 0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#3390ec;stroke:var(--primary-color)}@media only screen and (max-width: 600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal) * -1)}}.rows-wrapper .new-message-wrapper{align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .input-message-container{width:1%;max-height:inherit;flex:1 1 auto;position:relative;overflow:hidden;align-self:center;min-height:calc(var(--chat-input-size) - var(--padding-vertical) * 2);display:flex;align-items:center}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{flex:0 0 auto;font-size:24px;color:#707579;color:var(--secondary-text-color);margin:0 .125rem 5px;padding:0;width:34px;height:34px}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY: 0;width:100%;flex:1 1 auto;position:relative;transform:translate3d(0, var(--translateY), 0);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles{transition:none !important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);--translateY: -78px}@media only screen and (max-width: 600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY: -58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translateY(calc(var(--translateY) * -1))}.bubbles>.scrollable{height:auto;display:block}@media only screen and (min-width: 1276px){body.is-right-column-shown .bubbles{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0)}}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:scale(1) translateX(2.5rem)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:opacity var(--layer-transition),visibility 0s 0s !important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY: calc(var(--chat-input-size) * -1 + -.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{width:100%;display:flex;flex-direction:column;margin:0 auto;min-height:100%;justify-content:flex-end;padding:0 .8125rem;max-width:728px;max-width:var(--messages-container-width);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translateY(0)}body.animation-level-0 .bubbles-inner{transition:none !important}@media only screen and (min-width: 1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width: 600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width: 600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - calc((2.375rem + .5rem) * -1) * -1) !important;max-width:calc(100% - var(--message-beside-button-margin) * -1) !important}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-inner{margin-bottom:1rem}.bubbles-inner:not(.is-channel) .message,.bubbles-inner.is-chat .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999 !important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY) * -1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden;transform:none !important;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention{--translateY: 0;cursor:default;opacity:0;visibility:hidden;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s !important}.bubbles-corner-button{position:absolute;background-color:#fff;background-color:var(--surface-color);border-radius:50%;color:#707579;color:var(--secondary-text-color);font-size:1.5rem;display:flex;align-items:center;justify-content:center;right:var(--chat-input-padding);bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);z-index:2;overflow:visible}body.animation-level-0 .bubbles-corner-button{transition:none !important}.bubbles-corner-button .badge{position:absolute;top:-0.25rem;right:-0.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width: 600px){.bubbles-corner-button .badge{top:-0.75rem;right:.1875rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height: var(--topbar-call-height)}@media only screen and (min-width: 1276px){body.is-right-column-shown{--topbar-floating-scaleX: calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height: 3.5rem;--pinned-floating-audio-height: 0px;--pinned-floating-message-height: 0px;--pinned-floating-height: calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height: 52px;--pinned-message-height: 52px;width:100%;z-index:1;min-height:var(--topbar-height) !important;max-height:var(--topbar-height) !important;margin-bottom:var(--pinned-floating-height);position:relative;cursor:pointer !important}.topbar:before{content:" ";position:absolute;height:calc(var(--topbar-height) + var(--pinned-floating-height) - 0px);height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));top:0;right:0;left:0;box-shadow:0px 1px 5px -1px rgba(0,0,0,.21);pointer-events:none}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height: var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height: var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width: 601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width: 926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width: 1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem);display:flex;align-items:center}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .peer-title,.topbar .info{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{top:calc(100% + 7px);max-height:calc(100 * 1vh - 4.375rem);max-height:calc(100 * var(--vh) - 4.375rem)}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem);top:29px}}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;overflow:hidden;padding-left:49px;max-width:calc(100% - var(--utils-width))}@media only screen and (max-width: 600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width: 1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{display:flex;align-items:center;justify-content:space-between;height:3.5rem;max-height:3.5rem;flex:1 1 auto}.topbar .chat-utils{display:flex;align-items:center;flex:0 0 auto}@media only screen and (min-width: 1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width: 600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{width:auto;height:2.25rem;font-weight:400;font-size:.875rem;margin-right:.5rem;padding:0 1.375rem}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;padding-left:1.125rem;max-width:100%;overflow:hidden}.topbar .person{display:flex;align-items:center}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{height:3rem !important;height:var(--topbar-call-height) !important;min-height:auto !important;position:absolute;top:calc(3rem * -1);top:calc(var(--topbar-call-height) * -1);right:0;left:1px;color:#fff;z-index:2;cursor:pointer !important}body:not(.has-chat) .topbar-call-container{background:none !important}@media only screen and (max-width: 925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;width:2.5rem;height:2.5rem;padding:0}.topbar-call-container .peer-title{font-weight:500;white-space:nowrap}@media only screen and (max-width: 480px){.topbar-call-container .topbar-call-left,.topbar-call-container .topbar-call-right{width:auto}.topbar-call-container .group-call-description{display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{display:flex;align-items:center}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-center{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}@media only screen and (min-width: 1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width) * -.5), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width: 1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{position:absolute;top:0;right:0;bottom:-1.125rem;left:0;z-index:-1;transform:scale(1, -1);transform:scale(var(--topbar-floating-scaleX), -1);transform-origin:left center;pointer-events:none}@media only screen and (min-width: 1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{width:100%;height:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubble{position:relative;z-index:1;margin:0 auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-wrap:wrap}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);position:absolute;top:50%;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);transform:translateY(-50%);color:#fff;border-radius:50%;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);opacity:0;display:flex;align-items:center;justify-content:center;transform:translateY(-50%) scale(0.6);visibility:hidden}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem !important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{visibility:visible;transform:translateY(-50%) scale(1)}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{position:absolute;left:-50%;top:-0.125rem;bottom:-0.125rem;content:" ";z-index:-1}.bubble.is-highlighted:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width: 600px){.bubble.is-first-unread{max-width:unset}}.bubble.is-first-unread:before{content:"Unread messages";height:30px;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;text-align:center;color:#3390ec;color:var(--primary-color);line-height:2.1;font-weight:500;font-size:15px;background-color:#fff;background-color:var(--surface-color);z-index:2;position:relative}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(0.125rem + 30px)}.bubble.is-selected:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{width:200%;display:block}.bubble.is-multiple-documents:before,.bubble.is-multiple-documents:after{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0 !important}.bubble-select-checkbox{z-index:3;position:absolute;left:0;display:flex;margin:0}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none !important}.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video,.bubbles.is-selecting .bubble a{pointer-events:none}.bubble-content{min-width:56px;max-width:100%;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);position:relative;display:flex;flex-direction:column-reverse;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-color:var(--message-background-color)}body.animation-level-0 .bubble-content{transition:none}html.no-touch .bubbles:not(.is-selecting) .bubble-content,html.is-touch body:not(.no-select) .bubbles.is-selecting .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{margin:0 auto;max-width:100%;box-shadow:none}.bubble.is-date{position:sticky;top:.25rem;padding-bottom:.25rem;z-index:2;transition:opacity .3s ease;opacity:.99999;pointer-events:none}.bubble.is-date:before,.bubble.is-date:after{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubble-beside-button{position:absolute;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);bottom:0;width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);font-size:1.5rem;align-items:center;display:flex;justify-content:center;color:#fff;color:var(--badge-text-color);border-radius:50%;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color);cursor:pointer}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}html.no-touch .bubble:hover .bubble-beside-button,html.no-touch .bubble:active .bubble-beside-button{opacity:1}.bubble .forward svg{width:22px;height:22px}.bubble.is-group-last{margin-bottom:0.5rem}.bubble.is-group-last:after{bottom:-0.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-0.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0 !important}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width: 600px){.bubble.webpage .document{padding-left:44px}}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;width:18px;vertical-align:bottom}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{padding-top:.5rem;padding-bottom:1.5rem;max-height:-webkit-fit-content !important;max-height:-moz-fit-content !important;max-height:fit-content !important;cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big.sticker .bubble-content{max-width:140px !important;max-height:140px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none !important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.bubble.sticker .attachment{border-radius:0;z-index:1}.bubble.sticker .bubble-content{max-width:200px !important;max-height:200px !important}.bubble.round .attachment{max-width:280px !important;max-width:var(--round-video-size) !important;max-height:280px !important;max-height:var(--round-video-size) !important;width:280px !important;width:var(--round-video-size) !important;height:280px !important;height:var(--round-video-size) !important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{max-width:100%;border-radius:inherit;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;position:relative;cursor:pointer}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{position:absolute;left:0;top:0;height:100%;width:100%;cursor:pointer;display:flex;justify-content:center;align-items:center}.bubble .attachment .download span{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);font-size:23px;color:#fff;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{position:relative;margin:0 auto;z-index:1}.bubble .media-container-fitted{background-color:transparent !important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-width:min(420px, 100%);max-height:min(340px, 100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-width:min(451px, 100%);max-height:none}.bubble .album-item{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);max-width:100%;cursor:pointer;position:absolute;overflow:hidden}body.animation-level-0 .bubble .album-item{transition:none !important}.bubble .album-item img,.bubble .album-item video{border-radius:inherit}.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none !important}.bubble .album-item .bubble-select-checkbox{bottom:auto !important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4, .0, .2, 1),border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transition:transform .3s cubic-bezier(.4, .0, .2, 1),border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in);transform:scale(0.883333)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:hover,html.no-touch .bubble a:active{text-decoration:underline}.bubble-first{order:-1;margin-top:.5rem;justify-content:center;align-items:center;max-width:100%}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column;align-items:flex-start !important;padding:.75rem 1rem .875rem !important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-size:1rem !important}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{margin-right:.25rem;font-size:1.25rem;vertical-align:bottom;margin-left:-0.1875rem}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubble-first.empty-bubble-placeholder:not(:first-child:last-child) .bubble-content-wrapper{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0;pointer-events:none}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem !important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem !important;position:relative;width:200px;height:200px;cursor:pointer}.bubble-first .time{display:none !important}.bubble-first:before,.bubble-first:after{display:none}.bubble .web{margin:.125rem 0 -0.5625rem;max-width:100%;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.bubble .web .preview{max-width:min(420px, 100%);max-height:min(340px, 100%);border-radius:4px;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;position:relative;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title{font-weight:500 !important}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .webpage-name{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);font-weight:500 !important;text-decoration:none}html.no-touch .bubble .web .webpage-name:hover,html.no-touch .bubble .web .webpage-name:active{text-decoration:underline}.bubble .web .text{word-break:break-word;margin-top:1px;font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble .web .quote{max-width:100%;overflow:hidden;width:100%;display:flex}.bubble .web .quote-text{width:100%;max-width:100%;padding-left:.625rem;margin-left:-0.625rem}.bubble .web .quote:before{flex:0 0 auto;width:.125rem;border-radius:.125rem;background-color:#3390ec;background-color:var(--primary-color);margin:.1875rem .5rem .125rem 0;content:" "}.bubble .web,.bubble .reply{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{margin:0;width:3rem;height:3rem;float:right;margin-left:.625rem;margin-top:.1875rem}.bubble.is-square-photo .web .preview{max-width:min(3rem, 100%);max-height:min(3rem, 100%);margin:0}.bubble .reply{padding:.25rem;margin:0 .25rem .375rem .375rem;cursor:pointer;border-radius:.25rem;min-width:10rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{position:absolute;max-width:calc(100% - 1.25rem);height:auto;min-height:32px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.bubble .message+.reply{margin-bottom:0}.bubble.just-media .reply,.bubble.just-media .name{padding:10px;border-radius:12px;position:absolute;top:0;margin-bottom:0;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);white-space:nowrap;max-width:15rem}@media only screen and (max-width: 600px){.bubble.just-media .reply,.bubble.just-media .name{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff !important;padding:.3125rem .625rem;line-height:1.3125;line-height:var(--line-height)}.bubble.just-media .name .peer-title{font-weight:400 !important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width: 600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;position:relative;max-width:none !important}.bubble.just-media .reply-title,.bubble.just-media .reply-subtitle,.bubble.just-media .reply i{color:#fff !important}.bubble.just-media .reply-border{background:#fff}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{font-size:16px;font-size:var(--messages-text-size);padding:0 .5rem .375rem .625rem;max-width:100%;color:#000;color:var(--primary-text-color);line-height:1.3125;word-break:break-word;white-space:pre-wrap;position:relative}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width: 600px){.bubble .document-ico,.bubble .document-download,.bubble .audio-ico,.bubble .audio-download{height:2.25rem;width:2.25rem}}.bubble .audio .audio-title{font-weight:500}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width: 600px){.bubble .audio{height:2.375rem;padding-left:calc(2.375rem + .5625rem)}.bubble .audio .audio-details{margin-top:2px;margin-bottom:0}.bubble .audio .audio-subtitle{margin-top:-1px}.bubble .audio.corner-download .audio-download{margin:1.375rem 1.375rem 0}}.bubble .message.audio-message{width:335px;max-width:min(100%, 335px) !important}@media only screen and (max-width: 600px){.bubble .message.audio-message{width:280px;max-width:min(100%, 300px) !important}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px !important}.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{display:flex;padding:2px 0;cursor:pointer}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{padding-left:12px;margin-top:8px;display:flex;flex-direction:column}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500}.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{padding-left:66px;height:58px}@media only screen and (max-width: 600px){.bubble .message.document-message .document{padding-left:44px;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 0px 0px 0px}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-container .time.tgico{position:relative !important;height:0px !important;visibility:hidden !important;float:none}.bubble .document-container .time.tgico .inner{visibility:hidden !important}.bubble.is-multiple-documents .message{padding:0 !important;border-radius:inherit}.bubble.is-multiple-documents .document-container{position:relative;border-radius:inherit}.bubble.is-multiple-documents .document-container .document-selection{position:absolute;top:0;bottom:0;z-index:-1;width:200vw;left:-75vw}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.06);border-radius:inherit}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{left:2rem;top:2rem;background:#fff;border-radius:50%}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size: 1.125rem;left:20px;top:25px}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size: .125rem;content:" ";position:absolute;width:calc(var(--size) - (var(--inner-size) * 2));height:calc(var(--size) - (var(--inner-size) * 2));left:var(--inner-size);top:var(--inner-size);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-0.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{padding-top:.5rem;border-top-left-radius:inherit;border-top-right-radius:inherit}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-0.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{padding-bottom:.5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-0.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-0.25rem}.bubble.is-multiple-documents .document{height:54px !important}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document{height:38px !important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{padding:0 0 .25rem 0;margin-top:-0.1875rem}.bubble .message.document-message .time,.bubble .message.audio-message .time,.bubble .message.voice-message .time,.bubble .message.poll-message .time,.bubble .message.contact-message .time{position:absolute;right:0;bottom:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{position:absolute;bottom:.1875rem;right:.1875rem;border-radius:.75rem;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0 .3125rem;z-index:2}.bubble.is-message-empty .message .time{margin-left:0;display:flex;align-items:center;padding:0;margin:0;white-space:nowrap;height:18px}.bubble.is-message-empty .message .time .inner{right:unset;bottom:unset;color:#fff;margin:inherit}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message,.bubble.is-message-empty.emoji-big .message{bottom:0}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{visibility:hidden;font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1;vertical-align:middle;pointer-events:none;display:inline-flex;z-index:1;height:12px;direction:ltr;float:right;cursor:pointer}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{margin-left:2px;pointer-events:none}.bubble .time i.edited{overflow:visible;font-size:inherit}.bubble .time .inner{pointer-events:all;position:absolute;bottom:0;right:0;display:flex;align-items:center;line-height:1;padding:inherit;white-space:nowrap;height:12px;visibility:visible}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-time,.bubble .video-play{pointer-events:none}.bubble .video-time{position:absolute;top:3px;left:3px;border-radius:12px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 6px;z-index:2;font-size:12px;color:#fff;display:flex;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:1.125rem;line-height:1}.bubble .video-time.can-autoplay:after{content:"";padding:0 1px 0 3px;font-size:1.25rem;color:#fff}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);color:#fff;text-align:center;font-size:2.125rem;display:flex;align-items:center;justify-content:center;z-index:1}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{padding:5px 9px 0 9px;font-weight:500 !important;color:#3390ec;color:var(--primary-color);font-size:.9rem;max-width:100%;overflow:hidden;text-overflow:ellipsis}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{position:absolute;width:11px;height:20px;z-index:-2;display:block;fill:#fff;fill:var(--message-background-color);transform:translateY(1px)}.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{cursor:pointer;border-radius:inherit}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.bubble .replies .rp{width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden;border-radius:inherit;cursor:pointer}.bubble .replies-beside{flex-direction:column;width:36px;min-height:36px;height:auto;max-height:52px;bottom:47px;border-radius:2rem;right:-44px;padding:5.5px 0}.bubble .replies-beside .tgico-commentssticker{font-size:23px}.bubble .replies-beside-text{font-size:.75rem}.bubble .replies-footer{height:50px;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);position:relative;display:flex;align-items:center;padding:0 .5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:#3390ec;color:var(--primary-color);min-width:15rem}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.4375rem}.bubble .replies-footer-text{font-weight:500;font-size:15px;margin-left:9px;display:flex;align-items:center;color:#3390ec;color:var(--primary-color)}.bubble .replies-footer-avatars{display:flex;flex-direction:row-reverse}.bubble .replies-footer-avatars avatar-element{width:34px;height:34px;border:2px solid #fff;border:2px solid var(--surface-color);cursor:pointer;z-index:0}.bubble .replies-footer-avatars avatar-element:not(:first-child){margin-right:-14px}.bubble .replies-footer .tgico-next{position:absolute;right:4px}.bubble .replies-footer.is-unread .replies-footer-text:after{content:" ";background-color:#3390ec;background-color:var(--primary-color);width:.5rem;height:.5rem;margin-left:.75rem;border-radius:50%}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.bubble-content-wrapper{transform:scale(1) translateX(0);transform-origin:center;opacity:1}body.animation-level-2 .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)}.bubbles-inner.zoom-fading .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0}@media only screen and (min-width: 601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width: 600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble-content-wrapper>.user-avatar{position:absolute;margin-left:-45px;bottom:0;cursor:pointer}.bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transform:scale3d(1, 1, 1);transform-origin:bottom;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transition:none}.bubbles.is-selecting:not(.backwards) .bubble-content-wrapper>.user-avatar{transform:scale3d(0.76, 0.76, 1);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{color:#fff;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);font-size:.9375rem;padding:.28125rem .625rem;line-height:1.25rem;border-radius:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;text-align:center;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg a:hover,.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover{text-decoration:underline;cursor:pointer}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 10px)}@media only screen and (max-width: 600px){.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .contact-number,.bubble.is-in .audio-time{color:#707579 !important;color:var(--secondary-text-color) !important}.bubble.is-out{flex-direction:row-reverse;--message-background-color: var(--message-out-background-color);--light-message-background-color: var(--light-message-out-background-color);--dark-message-background-color: var(--dark-message-out-background-color);--link-color: var(--message-out-link-color)}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width: 1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .reply,.bubble.is-out.just-media .name{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out:not(.just-media) .reply-title,.bubble.is-out:not(.just-media) .reply i{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{padding-right:5px;margin-left:-4px}.bubble.is-out .time .inner{color:#4fae4e;color:var(--message-out-status-color);bottom:4px}.bubble.is-out .time:after,.bubble.is-out .time .inner:after{font-size:19px;margin-left:1px;line-height:16px;color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time:after,.bubble.is-out.is-read .time .inner:after{content:""}.bubble.is-out.is-sent .time:after,.bubble.is-out.is-sent .time .inner:after{content:""}.bubble.is-out.is-sending .time:after,.bubble.is-out.is-sending .time .inner:after{content:""}.bubble.is-out .document-ico:after{border-top-color:#fff;border-top-color:var(--message-background-color);border-right-color:#fff;border-right-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e !important;fill:var(--message-out-primary-color) !important}.bubble.is-out .audio-time,.bubble.is-out .audio-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-toggle,.bubble.is-out .audio-download,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.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 .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color: var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color: var(--message-background-color)}.bubble.is-out .bubble-beside-button{right:auto;left:calc((2.375rem + .5rem) * -1);left:var(--message-beside-button-margin)}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.reply-markup{width:100%}.reply-markup-row{margin-top:.3125rem;overflow:hidden;min-height:2.5rem;display:flex}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{padding:.5625rem 0;border-radius:6px;z-index:2;font-size:.875rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;color:#fff !important;outline:none;border:none;width:100%;cursor:pointer;position:relative;overflow:hidden;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.reply-markup-button.anchor-url{text-decoration:none !important}.reply-markup-button:after{content:" ";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;opacity:0;z-index:-1;background-color:#fff}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:hover:after,html.no-touch .reply-markup-button:active:after{opacity:0.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button.tgico:before,.reply-markup-button .forward-icon{position:absolute;right:.125rem;top:.125rem;display:block}.reply-markup-button.is-link:before{content:"";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:""}.pinned-message-border{position:relative;height:2rem;width:.125rem;flex:0 0 auto}.pinned-message-border-wrapper-1{position:relative;top:50%;transform:translateY(-50%);height:2rem;width:.125rem;border-radius:1px;background:#3390ec;background:var(--primary-color)}.pinned-message-border-mask{--mask-height: .375rem;--height: 2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:before,.pinned-message-border-mask:after{position:absolute;left:0;right:0;content:" ";display:block;z-index:1;height:var(--mask-height);opacity:0}body.animation-level-2 .pinned-message-border-mask:before,body.animation-level-2 .pinned-message-border-mask:after{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{top:0;background:linear-gradient(#fff, transparent);background:linear-gradient(var(--surface-color), transparent)}.pinned-message-border-mask:after{bottom:0;background:linear-gradient(transparent, #fff);background:linear-gradient(transparent, var(--surface-color))}.pinned-message-border-mask.mask-top:before,.pinned-message-border-mask.mask-bottom:after{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{position:absolute;content:" ";left:0;top:0;right:0;bottom:0;display:block;background:#3390ec;background:var(--primary-color);opacity:.4}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{position:absolute;left:0;top:0;width:2px;background:currentColor;border-radius:1px}body:not(.animation-level-0) .pinned-message-border-wrapper,body:not(.animation-level-0) .pinned-message-border-mark{will-change:transform;transition:transform .25s ease-in-out}.pinned-message-content{--height: 32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{cursor:pointer;display:flex;align-items:center;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;overflow:hidden;pointer-events:none;position:relative;margin-left:.5rem}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-title,.pinned-message-subtitle,.reply-title,.reply-subtitle{font-size:14px;line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-message-media,.reply-media{height:2rem !important;width:2rem !important;overflow:hidden;position:absolute;left:0;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.pinned-message i,.reply i{font-style:normal;color:#707579;color:var(--secondary-text-color)}.pinned-message img.emoji,.reply img.emoji{height:1rem;width:1rem;vertical-align:top}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{height:2rem;border-radius:1px;min-width:2px;background:#3390ec;background:var(--primary-color)}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0 !important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500}.pinned-container{--container-height: 3.25rem;display:flex;justify-content:space-between;align-items:center;flex:0 0 auto;overflow:visible;cursor:pointer}.pinned-container.is-floating{position:absolute !important;top:var(--topbar-height);right:0;left:0;margin:0;width:auto;height:var(--container-height);max-height:var(--container-height);background-color:#fff !important;background-color:var(--surface-color) !important}.pinned-container.is-floating .pinned-container-wrapper{order:0;padding:0 1rem;height:100%;border-radius:0;z-index:0;max-width:100%}@media only screen and (max-width: 600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width: 1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{content:" ";border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);position:absolute;top:0;right:0;bottom:0;left:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;position:relative;pointer-events:none}.pinned-container .btn-icon{font-size:1.5rem;display:flex;justify-content:center;flex:0 0 auto}.pinned-container-wrapper{display:flex;flex:1 1 auto;overflow:hidden;align-items:center;padding:.25rem;border-radius:.25rem;order:1}.pinned-container-wrapper-utils{flex:0 0 auto;display:flex;align-items:center;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible !important}.pinned-message-media-container{width:2rem;height:2rem;position:absolute;margin-left:-0.25rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title,.pinned-message-subtitle{transform:translateX(0)}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height: var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-title,.pinned-message-content .pinned-message-subtitle{position:relative;height:calc(var(--height) / 2);min-height:calc(var(--height) / 2);overflow:visible}body.animation-level-2 .pinned-message-content .pinned-message-title,body.animation-level-2 .pinned-message-content .pinned-message-subtitle{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-top:-0.125rem;margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:.875rem;line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:"#"}.pinned-message .animated-counter.is-last:not(.backwards){transform:scale(0.68);opacity:0}.pinned-message .animated-super-row{--translateY: 16px}.pinned-message .pinned-message-media{--translateY: 32px}.pinned-message.hide~.tgico-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message.is-many .pinned-message-close{display:none}.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist{display:none}.pinned-message.is-many.is-floating .pinned-message-close{display:none}.pinned-message:not(.is-many) .pinned-message-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none !important}.pinned-audio{--progress-height: .25rem}.pinned-audio.is-floating{--container-height: var(--pinned-audio-height)}.pinned-audio:not(.is-floating){padding-right:1.75rem;max-width:210px;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible !important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0 !important}.pinned-audio-ico:before{content:""}.pinned-audio-ico.flip-icon:before{content:""}.pinned-audio-title{font-weight:500}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-title,.pinned-audio-subtitle{font-size:.875rem;line-height:1.3125;line-height:var(--line-height);width:100%;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius: 0;--height: var(--progress-height);--translateY: .125rem;position:absolute;right:0;bottom:0;left:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width: 1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:hover,html.no-touch .pinned-audio-progress:active{--translateY: 0}.pinned-audio-progress .progress-line__filled:after{display:none !important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{position:absolute;height:.5rem;right:0;bottom:0;left:0;overflow:hidden}.pinned-audio-volume{align-items:center;position:relative;width:2.5rem;height:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{position:absolute;top:100%;left:0;right:0;bottom:-1rem;content:" "}.pinned-audio-volume .player-volume__icon{fill:#707579;fill:var(--secondary-text-color);width:inherit;height:inherit;cursor:pointer}.pinned-audio-volume.active .player-volume__icon{fill:#3390ec;fill:var(--primary-color)}.pinned-audio-volume .progress-line-container{position:absolute;top:100%;width:5rem;padding:.75rem 1rem;margin-top:2.25rem;transform:rotate(270deg);border-radius:10px;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 5px 0px rgba(0,0,0,.15);opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility 0s .2s}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none !important}.pinned-audio-volume:hover .progress-line-container,.pinned-audio-volume:active .progress-line-container{opacity:1;visibility:visible;transition:opacity .2s ease-in-out,visibility 0s 0s}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;transform:translateZ(0);opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),transform .2s cubic-bezier(.4, .0, .2, 1),width .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);position:fixed;top:0;right:0;bottom:0;left:0;height:44px;width:218px;overflow:hidden;z-index:1;display:flex;justify-content:flex-start}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{position:absolute;left:0;top:0;display:flex;align-items:center;justify-content:flex-start;width:638px;height:100%;transform:translateX(0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:100%}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{display:flex;align-items:center;justify-content:space-between;padding:7px;flex:0 0 auto;max-width:100%}.markup-tooltip-tools:first-child{width:218px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{width:1px;height:25px;background-color:#dfe1e5;background-color:var(--border-color)}.markup-tooltip .btn-icon{border-radius:8px !important;width:30px;height:30px;padding:0}.markup-tooltip .btn-icon.active{color:#fff !important;background-color:#3390ec !important;background-color:var(--primary-color) !important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-218px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{display:flex;align-items:center;opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition);pointer-events:none}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;text-overflow:ellipsis;margin:0 .5rem}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{position:relative;max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem}.stickers-helper-stickers{max-width:100%;border-radius:var(--border-radius)}html.no-touch .stickers-helper .super-sticker:not(.active):hover,html.no-touch .stickers-helper .super-sticker:not(.active):active{background:none}.emoji-helper{height:50px;padding:.25rem 0 !important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:before,.emoji-helper .super-emojis:after{display:inline-block;content:" ";width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):hover,html.no-touch .emoji-helper .super-emoji:not(.active):active{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec !important;background-color:var(--primary-color) !important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem, 100%)}.inline-helper .scrollable{position:relative;max-height:232px}.inline-helper-separator{height:1px;width:100%;margin-left:4rem;background-color:#dfe1e5;background-color:var(--border-color)}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:unset}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;padding:.5rem .5rem .5rem 4rem;line-height:1.3125;line-height:var(--line-height)}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{position:absolute;left:.5rem;width:3rem !important;height:3rem !important;overflow:hidden}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{color:#fff;text-transform:uppercase;font-size:1.75rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;display:flex;align-items:center;justify-content:center}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-video,.inline-helper .media-poster{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.inline-helper .gif{position:absolute;top:0;right:0;bottom:0;left:0;width:auto !important;height:auto !important}.inline-helper-results.is-gallery{max-width:100%;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill, minmax(80px, 1fr));grid-template-columns:repeat(auto-fill, minmax(var(--esg-sticker-size), 1fr));grid-gap:1px}.inline-helper-results.is-gallery .inline-helper-result{width:auto !important;height:auto !important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.inline-helper-result-description{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden;white-space:pre-wrap}.chat-search{position:absolute !important;top:0;z-index:2}.chat-search-footer{height:46px;padding:0 8px;flex:0 0 auto;width:100%;background-color:#fff;background-color:var(--surface-color);display:flex;justify-content:space-between;align-items:center;box-shadow:0px -1px 5px -1px rgba(0,0,0,.21);overflow:hidden}.chat-search-footer .chat-search-count{margin-left:8px;color:#707579;color:var(--secondary-text-color)}.chat-search-footer+.chat-input{display:none}.chat-search-count:empty{display:none}.chat-search-count:not(:empty)+.btn-icon{display:none}.chat-search-controls{display:flex}.chat-search-results{width:100%;height:100%;max-height:100%;overflow:hidden;position:absolute;top:0;left:0;visibility:hidden;opacity:0;background-color:#fff;background-color:var(--surface-color);transition:.2s ease}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding: 0px;position:absolute !important;z-index:3;top:var(--padding);right:var(--padding);bottom:var(--padding);left:var(--padding);display:flex;flex-direction:column;justify-content:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto !important}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding: -4px;background-color:#fff;background-color:var(--surface-color);position:relative;border-radius:12px;width:100%;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#a2acb4;transition:color .2s ease-in-out;pointer-events:all;flex:1 1 auto}.drop-outline-wrapper{position:absolute;top:var(--wrapper-padding);right:var(--wrapper-padding);bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;transition:stroke .2s ease-in-out;stroke-dashoffset:0}.drop.is-dragover .drop-outline-path{-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite;stroke:#3390ec;stroke:var(--primary-color)}.drop-icon{font-size:6rem}.drop-header{font-weight:500;font-size:1.25rem}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height: 670px){.drop-icon{font-size:0}.drop-header{margin-top:0px}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{width:auto;height:auto;display:block;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center}.crop-image{display:block;position:relative;pointer-events:none}.crop-component{position:relative;z-index:999;background-color:#fff;margin:0 auto;overflow:hidden}.crop-component>img{max-width:100%}.crop-overlay{position:absolute;z-index:999;overflow:hidden;box-sizing:content-box;border-radius:50%}html.no-touch .crop-overlay:hover,.crop-overlay:active{cursor:move}.crop-overlay-image{position:absolute;display:block}.crop-overlay-color{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,.7);border-radius:8px}.sidebar-header{background-color:#fff;background-color:var(--surface-color);display:flex;align-items:center;justify-content:space-between;padding:0 1rem;min-height:3.5rem;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width: 600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{flex:1;font-weight:500;padding-left:1.5rem;font-size:1.25rem;color:#000;color:var(--primary-text-color)}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{overflow:inherit !important;width:2.5rem;height:2.5rem}.sidebar-content{width:100%;max-height:100%;height:100%;overflow:hidden;display:flex;position:relative;flex:1 1 auto}.profile-avatars-container{width:100%;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.no-touch .profile-avatars-container:hover .profile-avatars-arrow,html.no-touch .profile-avatars-container:active .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0 !important}.profile-avatars-avatars{width:100%;height:100%;display:flex;flex-wrap:nowrap;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;position:absolute}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0, 0)}.profile-avatars-avatars:before{content:" ";top:0;right:0;bottom:0;left:0}.profile-avatars-avatar{width:inherit;height:inherit;min-width:100%;min-height:100%;display:flex;background-color:#000;position:relative}.profile-avatars-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none}.profile-avatars-gradient{position:absolute;left:0;right:0;bottom:0;height:80px;background:linear-gradient(360deg, rgba(0, 0, 0, 0.3) 8.98%, rgba(0, 0, 0, 0) 100%)}.profile-avatars-info{position:absolute;bottom:0;display:flex;flex-direction:column;align-items:flex-start;left:1.5rem;bottom:.5625rem;pointer-events:none}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color: #fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit !important}.profile-avatars-tabs{display:flex;position:absolute;top:.5rem;left:.375rem;right:.375rem;height:.125rem;pointer-events:none}.profile-avatars-tab{flex:1 1 auto;border-radius:4px;margin:0 .125rem;background-color:#fff;opacity:.2;transition:opacity .2s ease-in-out;height:inherit}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{position:absolute;top:0;left:0;bottom:0;width:calc(100% / 3);opacity:0}.profile-avatars-arrow:before{position:absolute;top:50%;transform:translateY(-50%);font-size:2.1875rem;color:#fff;left:.625rem}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active{opacity:1 !important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{flex:0 0 auto;display:flex;flex-direction:column;position:relative;width:100%}.profile-content-wrapper{flex:1 1 auto;display:flex;flex-direction:column;padding-bottom:13px}@media only screen and (min-width: 601px){.profile-content-wrapper{padding-top:15px}}.profile-content .sidebar-left-section{position:relative;background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{text-align:center;font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);font-weight:500;overflow:hidden;max-width:21.25rem;margin:0 auto;color:#000;color:var(--primary-text-color);display:flex;align-items:flex-end}.profile-name span.emoji{vertical-align:inherit;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.profile-name .peer-title{word-break:break-word;text-overflow:ellipsis;overflow:hidden}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-subtitle{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px}@media only screen and (max-width: 600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{margin:.5rem auto 10px;display:block}@media only screen and (max-width: 600px){.profile-avatar{margin:0 auto 10px;--size: 100px;--multiplier: .54}}.profile-name,.profile-subtitle,.profile-avatar{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size: 3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{content:" ";position:absolute;height:1px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;left:0;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size: var(--scrollable-size, 3.5rem);width:100%;display:flex;justify-content:space-around;align-items:center;flex-direction:row;position:relative;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#707579;color:var(--secondary-text-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.menu-horizontal-div-item{height:var(--size);padding:0 1rem;cursor:pointer;text-align:center;flex:1 1 auto;font-size:1rem;font-weight:500;position:relative;transition:none !important;display:flex;align-items:center;justify-content:center;line-height:1.3125;line-height:var(--line-height);border-radius:0}html.no-touch .menu-horizontal-div-item:hover,html.no-touch .menu-horizontal-div-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .menu-horizontal-div-item.active:hover,html.no-touch .menu-horizontal-div-item.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{position:relative;display:inline-flex;align-items:center;overflow:visible}.menu-horizontal-div i{position:absolute;bottom:calc(-.625rem - 7px);left:0;opacity:0;background-color:#3390ec;background-color:var(--primary-color);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:content-box;transform-origin:left;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{min-width:100%;width:100%;display:grid;grid-template-columns:100%;grid-template-rows:100%}.tabs-container .tabs-tab{display:none;flex-direction:column;grid-row-start:1;grid-column-start:1;background-color:#fff;background-color:var(--background-color);overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none !important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4, .0, .2, 1),filter .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4, .0, .2, 1),filter .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex-direction:column;flex:1 1 auto;min-width:18rem;max-width:calc(1680px / 4)}@media only screen and (max-width: 600px){#column-left{width:100%;max-width:100%}body:not(.is-left-column-shown) #column-left{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px){#column-left{overflow:visible}#column-left:after{position:absolute;content:" ";display:block;height:100vh;width:1px;background-color:#dfe1e5;background-color:var(--border-color);right:-1px;top:0;z-index:2}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-left{display:flex;position:fixed;left:0;top:0;width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:unset}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width: 926px){#column-left{display:flex}}@media only screen and (max-width: 1275px){#column-left{flex:2}}@media only screen and (min-width: 1681px){html.is-safari #column-left{max-width:calc(1680px / 4 - 1.25px)}}#column-left .item-main{--menu-size: 3rem}#column-left .menu-horizontal-scrollable{--scrollable-size: var(--menu-size);z-index:1;background-color:#fff;background-color:var(--surface-color);position:relative;top:unset}@media only screen and (max-width: 600px){#column-left .menu-horizontal-scrollable{box-shadow:0px 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .menu-horizontal-div{position:relative !important;justify-content:flex-start;z-index:0}#column-left .menu-horizontal-scrollable .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem;border-top-left-radius:6px;border-top-right-radius:6px}#column-left .menu-horizontal-scrollable .menu-horizontal-div-item>span{overflow:visible}#column-left .menu-horizontal-scrollable .menu-horizontal-div-item>span i{bottom:calc(-.6875rem - 2px)}#column-left .menu-horizontal-scrollable .menu-horizontal-div__stripe{display:none}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .folders-tabs-scrollable .menu-horizontal-div-item:first-child{margin-left:.6875rem}@media only screen and (max-width: 600px){#column-left .folders-tabs-scrollable .menu-horizontal-div-item:first-child{margin-left:.1875rem}}#column-left .item-main .input-search .selector-user{height:30px;position:absolute !important;left:6px;top:6px;z-index:1;margin-left:0;line-height:1.875rem}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block !important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width: 600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{margin-top:7px;font-size:14px}html.no-touch #column-left .item-main .search-helper .selector-user:hover,html.no-touch #column-left .item-main .search-helper .selector-user:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none !important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative !important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto !important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%, -50%)}#column-left #chatlist-container{max-height:100%;overflow:hidden;position:relative;background-color:#fff;background-color:var(--surface-color)}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{position:relative;width:2.5rem;height:2.5rem;flex:0 0 auto;display:flex;align-items:center;justify-content:center}#column-left .sidebar-header__btn-container>.btn-icon{visibility:hidden;opacity:0;position:absolute;top:0;right:0;bottom:0;left:0;transition:.2s opacity,.15s background-color;z-index:2;margin:0}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width: 600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-0.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{width:300px;max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem)}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width: 600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:1rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;padding-left:4px;margin-top:-1px;padding-bottom:1px}#column-left .search-group-people .chatlist-chat{height:98px;border-radius:10px;max-width:78px;width:78px;align-items:center;display:flex;flex-direction:column;padding:12px 0 0 !important;margin:0 5px 0 0;flex:0 0 auto}@media only screen and (max-width: 600px){#column-left .search-group-people .chatlist-chat{width:77px;max-width:77px}}#column-left .search-group-people .dialog-title-details,#column-left .search-group-people .dialog-subtitle{display:none}#column-left .search-group-people .user-caption{max-width:65px;padding:2px 0px 9px;font-size:12px}@media only screen and (max-width: 600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width: 600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{visibility:visible !important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-width: 600px){#column-left .item-main .sidebar-content .btn-corner{--size: 54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{width:100%;padding:0 .5rem .5rem;overflow:hidden;flex:0 0 auto}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(64px)}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px)}#column-left .connection-status-button{color:#2e3939;align-self:center;cursor:default;padding-left:4.5rem;text-align:left;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{cursor:pointer;text-decoration:underline;color:inherit}#column-left .connection-status-button .preloader-container{right:auto;left:1rem;width:1.5rem;height:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{position:absolute;left:0;top:0;bottom:0;right:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);transform:translateY(0);height:100%}#column-left .input-wrapper{width:420px;margin:0 auto;flex:0 0 auto;padding:0 1.25rem;max-width:100%}@media only screen and (max-width: 600px){#column-left .input-wrapper{width:100%;padding:0 1rem}}#search-container{display:flex}#search-container .scrollable-y{position:relative;flex:1 1 auto}.new-channel-container .sidebar-content,.new-group-container .sidebar-content,.edit-profile-container .sidebar-content{flex-direction:column}.new-channel-container .chatlist-container,.new-group-container .chatlist-container,.edit-profile-container .chatlist-container{flex:1 1 auto}.new-channel-container .caption,.new-group-container .caption,.edit-profile-container .caption{font-size:.875rem;margin-top:14px;margin-left:23px;color:#707579;color:var(--secondary-text-color);padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}@media only screen and (max-width: 600px){.settings-container .profile-button{border-radius:0}}.settings-container .profile-buttons{margin-top:1.1875rem;width:100%;padding:0 .4375rem}@media only screen and (max-width: 600px){.settings-container .profile-buttons{margin-top:.6875rem;padding:0}}.edit-profile-container .caption{margin-top:1.0625rem;margin-left:1.4375rem;line-height:1.3125;line-height:var(--line-height);padding-bottom:1.4375rem}@media only screen and (max-width: 600px){.edit-profile-container .caption{padding-right:24px}}.edit-profile-container .sidebar-left-h2{padding:0 1.4375rem;padding-bottom:1.5rem}.edit-profile-container hr{margin-bottom:1rem}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-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{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.chat-folders-container .caption,.edit-folder-container .caption{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);max-width:20rem;margin:0 auto}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{height:30px;padding:0 12px;font-size:15px;width:auto;transition:width .2s;margin:0;position:absolute;right:1rem;top:50%;transform:translateY(-50%);border-radius:15px}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width: 600px){.edit-folder-container .input-wrapper{width:100%;padding:0 16px}}.edit-folder-container .input-wrapper{margin-bottom:.125rem !important}.edit-folder-container .sidebar-left-section{padding-bottom:0rem}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list .chatlist-chat{padding:9px 12px;height:50px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:normal}.folder-categories .checkbox-field{position:absolute;right:1.125rem !important}.folder-category-button{height:50px}.popup-forward .selector .chatlist-chat,.included-chatlist-container .selector .chatlist-chat{padding:7px .75rem !important;height:3.75rem}.popup-forward .selector .chatlist .user-caption,.included-chatlist-container .selector .chatlist .user-caption{padding:0px 0px 0 14px;margin-top:-2px}.popup-forward .selector .chatlist .user-last-message,.included-chatlist-container .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{display:flex;justify-content:space-between;align-items:center}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width: 600px){.search-group-recent .chatlist-chat{height:62px;padding-top:7px;padding-bottom:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500 !important}.search-group-recent .dialog-avatar{--size: 46px;--multiplier: 1.173913}}@media only screen and (max-width: 600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width: 601px){.search-group-recent.search-group.search-group-contacts{padding:0px 0 7px}}.sidebar-left-section{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0}@media only screen and (max-width: 600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width: 601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width: 600px){.sidebar-left-section-content>.checkbox-ripple,.sidebar-left-section-content>.btn-primary{border-radius:0}}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width: 600px){.sidebar-left-section-name{padding:.5rem 1rem;font-size:.875rem}}.sidebar-left-section-caption{margin-top:1rem;font-size:1rem;color:#707579;color:var(--secondary-text-color);line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width: 600px){.sidebar-left-section-caption{margin:.5rem;font-size:.875rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none !important;opacity:.25}.sidebar-left-section .media-sticker-wrapper{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500}.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}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{text-align:center;max-width:342px;margin-left:auto;margin-right:auto;margin-bottom:1.125rem}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem !important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{width:168px;height:168px;margin:.625rem auto 1.1875rem}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{margin:1.125rem auto 1.8125rem;width:157px;height:157px}.two-step-verification-hint .media-sticker-wrapper{width:160px;height:160px;margin:.5rem auto 2.25rem}.two-step-verification-email .media-sticker-wrapper{width:160px;height:160px;margin:.5625rem auto 2.1875rem}.two-step-verification-set .media-sticker-wrapper{width:160px;height:160px;margin:1rem auto 1.3125rem}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width: 601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-top:1rem;padding-bottom:.9375rem}.active-sessions-container .row-title-row{align-items:flex-end}.active-sessions-container .row-title:first-child{font-weight:500}.active-sessions-container .row-title-right{font-size:.75rem;color:#707579;color:var(--secondary-text-color);line-height:1.5}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500}.blocked-users-container .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{margin-top:-0.375rem;font-size:.875rem}.blocked-users-container ul{margin-top:.3125rem}@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{padding:0 .5rem .5rem}.background-container .grid-item:after{content:" ";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border:3px solid #3390ec;border:3px solid var(--primary-color);opacity:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(0.91)}.background-container .grid-item-media{transition:transform .2s ease-in-out;transform:scale(1)}.background-container .grid .media-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.background-container .grid .preloader-container{z-index:1}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{top:40%;transform:translateY(-50%);text-align:center;line-height:1.3125;line-height:var(--line-height);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem !important;margin:0 auto;padding:0 1rem;position:relative}.empty-placeholder .media-sticker-wrapper{width:128px;height:128px;margin:0 auto 1.9375rem;position:relative}.empty-placeholder-header{font-size:1.25rem;font-weight:500}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{position:relative;overflow:unset}@media only screen and (min-width: 601px)and (max-width: 1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width: 600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw, 0, 0)}}@media only screen and (min-width: 601px){#column-right{width:calc(var(--right-column-width));transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);position:absolute;right:0;z-index:3;transform:translate3d(var(--right-column-width), 0, 0)}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, 0, 0)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width: 1276px){#column-right{width:calc(var(--right-column-width) + 1px);transform:translate3d(calc(var(--right-column-width) + 1px), 0, 0);border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}@media only screen and (min-width: 601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}}#column-right #search-private-container .chatlist-container{position:relative;flex:1 1 auto}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{width:100%;max-width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0px;perspective-origin:left top}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .search-super{top:100%;min-height:calc((1vh * 100) - 56px);min-height:calc((var(--vh, 1vh) * 100) - 56px)}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{display:flex;align-items:center}.shared-media-container .btn-corner.menu-open:before{content:""}@media only screen and (max-width: 600px){.shared-media-container .btn-corner{width:54px;height:54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{width:100%;max-width:100%;position:absolute;min-height:100%;display:flex;flex-direction:column;background-color:#fff;background-color:var(--surface-color)}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);padding:24px 0px 0px 24px;font-weight:500;color:#707579;color:var(--secondary-text-color)}@media only screen and (max-width: 600px){.search-super .search-super-month-name{padding:18px 0px 0px 16px}}.search-super.sliding{max-height:none !important}.search-super-tabs{width:auto;flex:1 1 auto}.search-super-tabs-scrollable{box-shadow:none !important;position:sticky !important;top:0px;z-index:2;background-color:#fff;background-color:var(--surface-color)}.search-super-tabs-scrollable:before{position:absolute;width:100%;height:1px;left:0;top:0;background-color:inherit;display:block;content:" ";z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{position:relative;display:flex}.search-super-tabs-container{min-height:calc(100% - 49px);grid-template-rows:100%;flex:1 1 auto}.search-super-tabs-container>div{position:relative;min-height:150px}.search-super-tabs-container>div>div:first-child{transform:translateY(0);min-height:calc(100vh - 111px)}.search-super-tabs-container .preloader{padding:0;position:absolute !important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .document-name,.search-super .audio-title,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{flex:0 0 auto;margin-left:8px;margin-top:3px;font-size:12px;color:#707579;color:var(--secondary-text-color)}.search-super-content-media .search-super-month-name{border:none;padding:9px 0px 7px 24px}.search-super-content-media .video-time{position:absolute;left:5px;top:4px;height:18px;border-radius:4px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 5px;z-index:1;font-size:12px;color:#fff;line-height:18px}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute;z-index:2;margin:0}.search-super .document .checkbox-field,.search-super .audio .checkbox-field{top:50%;left:0;margin-left:2rem;margin-top:1rem;transform:translateY(-50%)}.search-super-content-media .search-super-month-items{width:100%;padding-top:1px;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:1px}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width: 600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{padding-left:60px;height:calc(48px + 1.5rem)}.search-super-content-files .document-ico,.search-super-content-files .document-download{width:48px;height:48px;border-radius:5px !important}.search-super-content-files .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis}.search-super-content-links .search-super-item{display:flex;flex-direction:column;padding-left:4.4375rem;position:relative;overflow:hidden;min-height:4.375rem;cursor:pointer;justify-content:flex-start}.search-super-content-links .row-media{height:3rem;width:3rem;border-radius:.375rem;overflow:hidden;position:absolute;left:.6875rem}.search-super-content-links .row-media.empty{display:flex;align-items:center;justify-content:center;font-size:2rem;color:#fff;text-transform:uppercase;background-color:#3390ec;background-color:var(--primary-color)}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:unset}.search-super-content-links .anchor-url:last-child:before{position:absolute;top:0;right:0;bottom:0;left:0;content:" ";cursor:pointer;z-index:1}.search-super-content-links .media-photo{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;white-space:pre-wrap;text-overflow:ellipsis;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{padding:0 !important;margin:2rem 0 0 -1.75rem !important}@media only screen and (min-width: 601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width: 600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 20px}@media only screen and (max-width: 600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:unset;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-top:.5rem;padding-bottom:.5rem}.search-super-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-0.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent !important}.search-super-selection-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;opacity:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width: 600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{flex-grow:1;font-weight:500;color:#000;color:var(--primary-text-color);white-space:nowrap;text-transform:capitalize;margin-left:1.5rem}#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before{display:none}#search-container .search-group.is-short li:nth-child(n+4){display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{display:flex;flex-direction:column;height:140px;cursor:pointer}#stickers-container .sticker-set-name{font-weight:500}#stickers-container .sticker-set-count{font-size:14px;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-header{display:flex;padding-left:16px;padding-bottom:12px;justify-content:space-between}#stickers-container .sticker-set-button{height:30px;padding-left:12px;padding-right:13px;margin-right:16px;font-size:15px;border-radius:16px;font-weight:400;width:auto;transition:width .2s}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{width:68px;height:68px;position:relative}#stickers-container .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}#stickers-container .sticker-set-sticker img{max-width:100%;max-height:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);padding:0 16px 8px 16px;margin:0;font-weight:500;justify-content:space-between;display:flex;font-size:15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width: 601px){#poll-results-container .poll-results-answer{padding:0 24px 8px 24px}}#poll-results-container .poll-results-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{float:left;padding-right:32px;padding-left:16.5px;font-size:24px;color:#707579;color:var(--secondary-text-color)}#poll-results-container .poll-results h3{padding:0 16px;margin-top:15px;font-size:20px;margin-bottom:16px}@media only screen and (min-width: 601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:normal}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width: 601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{padding:0 .75rem;margin-bottom:.5625rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none !important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem !important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.88);display:flex;align-items:center;justify-content:center}@media only screen and (max-width: 600px){.media-viewer{background:#000}}.media-viewer-author{height:100%;cursor:pointer;display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width: 600px){.media-viewer-userpic{display:none}}.media-viewer-name{line-height:1.3125;line-height:var(--line-height);font-weight:500;margin:.0625rem 0}@media only screen and (min-width: 601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{line-height:1.3125;line-height:var(--line-height);font-size:.875rem}.media-viewer-buttons{position:absolute;top:0;right:0;display:flex;flex-flow:row nowrap;padding:.5rem .75rem}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:hover,html.no-touch .media-viewer-buttons .btn-icon:active{color:#fff}@media only screen and (max-width: 600px){.media-viewer-buttons{display:none}}.media-viewer-content{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;position:relative;max-width:100%;max-height:100%;overflow:hidden;flex:1 1 auto;display:flex;align-items:center}.media-viewer-media{visibility:hidden}.media-viewer-caption{position:absolute;text-align:center;color:#fff;word-break:break-word;overflow:hidden;text-overflow:ellipsis;z-index:4;bottom:0;left:0;right:0;padding:.5rem .5rem 0;opacity:0;line-height:1.3125;line-height:var(--line-height);white-space:pre-wrap;background-color:transparent}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9 !important}.media-viewer-caption .scrollable{padding:.5rem .875rem;max-height:6rem;max-width:50rem;height:6rem;position:relative;margin:0 auto}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width: 600px){.media-viewer-caption{width:100%;transform:translateZ(0);text-align:unset;bottom:1.0625rem}.media-viewer-caption .scrollable{padding:0 .5rem;height:auto}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0, -69px, 0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:hover,html.no-touch .media-viewer-caption:active{background-color:#000;opacity:1 !important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1 !important}.media-viewer-switcher{position:absolute;left:0;top:3.75rem;width:7rem;height:calc(100% - 7.5rem);cursor:pointer;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width: 600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-prev-button,.media-viewer-next-button{cursor:pointer;position:absolute;color:#fff;font-size:2rem;left:1rem;top:50%;transform:translateY(-50%) rotate(90deg);opacity:0;transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width: 601px){.media-viewer-prev-button,.media-viewer-next-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width: 601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{position:fixed !important;display:flex;justify-content:center;align-items:center;min-height:auto !important;left:0;top:0;transform-origin:top left;overflow:hidden;transform:translateZ(0) scale3d(1, 1, 1);border-radius:0}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}@media only screen and (max-width: 600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{width:100%;height:100%;position:absolute;left:0;top:0}.media-viewer-mover>svg{width:100%;height:100%}.media-viewer-mover img,.media-viewer-mover video{width:100%;height:100%;max-width:100%;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-o-object-fit:cover;object-fit:cover;opacity:1;transition:var(--open-duration) opacity;position:absolute}.media-viewer-mover svg img,.media-viewer-mover svg video{position:unset}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration) / 8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none !important}.media-viewer-mover.center{left:50% !important;top:50% !important;transform:translate3d(-50%, -50%, 0) !important;max-width:100vw;max-height:calc((1vh * 100) - 15rem);max-height:calc((var(--vh, 1vh) * 100) - 15rem)}@media only screen and (max-width: 600px){.media-viewer-mover.center{width:100% !important;height:100% !important;max-width:100vw !important;max-height:calc((1vh * 100) - 120px);max-height:calc((var(--vh, 1vh) * 100) - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{width:auto;-o-object-fit:contain;object-fit:contain}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{position:absolute;top:0;left:0;right:0;height:3.5rem;display:flex;align-items:center;justify-content:space-between;z-index:5;padding:0 1.25rem}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active{opacity:1}.media-viewer-topbar-left{display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{width:100%;height:100%;transform:scale3d(1, 1, 1);position:absolute;border-radius:0;display:flex;align-items:center;justify-content:center}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration: .2s;--move-duration: .35s;top:0;left:0;width:100%;height:100%;position:fixed !important;display:block;z-index:4;visibility:hidden;transition:visibility 0s var(--open-duration)}body.animation-level-0 .media-viewer-whole{--open-duration: 0s;--move-duration: 0s}.media-viewer-whole.active{visibility:visible;transition-delay:0s}.media-viewer-whole.active .overlays,.media-viewer-whole.active .media-viewer-appear{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .overlays,body.animation-level-2 .media-viewer-whole.active .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width: 600px){.media-viewer-whole .btn-menu-toggle{color:rgba(255,255,255,.4);opacity:1}.media-viewer-whole .btn-menu-toggle.menu-open{color:#fff;background-color:rgba(112,117,121,.2) !important}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-movers{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:""}.tgico-zoom.zoom-in:before{content:""}.zoom-container{width:17.125rem;height:3.375rem;background-color:rgba(0,0,0,.4);border-radius:12px;padding:.5rem;opacity:1;display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.25rem;left:50%;transform:translateX(-50%);z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{pointer-events:none;opacity:.4}.zoom-container .progress-line{--color: #fff;--height: 2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.zoom-container:not(.is-visible),.media-viewer-whole:not(.active) .zoom-container{opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0 !important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0 !important}.overlays{top:0;left:0;width:100%;height:100%;position:fixed !important;background-color:rgba(0,0,0,.2);z-index:4;opacity:0;visibility:hidden;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.emoji-dropdown{display:flex;flex-direction:column;width:100%;height:min(282px, calc(1vh * 100 - 135px));height:min(282px, calc(var(--vh) * 100 - 135px));background:#fff;background:var(--surface-color);overflow:hidden;flex:1 1 auto;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-height: 570px)and (min-width: 601px){.emoji-dropdown{position:absolute !important;left:.8125rem;bottom:5.125rem;width:26.25rem !important;height:26.25rem;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:0 100%}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{width:100%;max-width:100%;overflow:hidden;height:100%}.emoji-dropdown .emoji-tabs{justify-content:center;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.emoji-dropdown .emoji-tabs-search{position:absolute;left:0;margin-left:4px !important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0;margin-right:4px !important}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{top:0;font-size:14px;font-weight:500;color:#707579;color:var(--secondary-text-color);z-index:2;padding:12px 6px 6px 6px;width:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{top:0;height:1px}.emoji-dropdown .tabs-container .tabs-tab{min-height:100%;flex-direction:column;height:100%}.emoji-dropdown .tabs-container .emoticons-content{flex:1;padding:0;position:relative}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width: 600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:unset;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill, 40px)}.emoji-dropdown .emoji-padding.active .category-items>span{width:40px;height:40px;justify-self:center}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:unset}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{height:48px;padding:2px;width:100%;z-index:4;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{position:relative;margin:0 -0.125rem}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}.emoji-dropdown #content-stickers .scrollable{padding:0px 5px 0}.emoji-dropdown .menu-horizontal-div{width:100%;height:48px}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{font-size:1.5rem;margin:0 12px;width:48px;height:48px;line-height:48px;display:flex;align-items:center;flex:0 0 auto}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;width:48px;padding:0;margin-right:1px;margin-left:1px}.emoji-dropdown .stickers-padding .menu-wrapper{padding:0;height:48px;max-width:100%;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{padding:8px;max-width:100%;max-height:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{width:100%;height:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{width:0;height:0;opacity:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{width:0;height:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{width:0;height:0;display:none}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{min-height:5rem;max-height:12.5rem;border-radius:10px;background-color:rgba(0, 0, 0, .2);background-color:var(--scrollbar-color);opacity:1}.scrollable-x::-webkit-scrollbar,.no-scrollbar::-webkit-scrollbar{display:none}.scrollable{width:100%;height:100%;overflow-y:hidden;overflow-x:hidden;max-height:100%;transform:translateZ(0);position:absolute;top:0px;left:0px;bottom:0px;right:0px;-webkit-overflow-scrolling:touch}.scrollable.scrollable-x{overflow-x:auto;scrollbar-width:thin;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;-ms-overflow-style:none}.scrollable-padding{min-width:100%;height:100%}@-webkit-keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}.selector{width:100%;height:100%;display:flex;flex-direction:column}.selector-search-container{flex:0 0 auto;position:relative;max-height:132px;overflow:hidden}.selector-search-container .scrollable{position:relative;max-height:inherit}.selector-search{padding:0 24px 0 24px;display:flex;flex-flow:wrap;position:relative}.selector-search-input{border:none;outline:none;flex:1 1 auto}.selector-search .selector-search-input{padding:7px 0px 19px 0px}.selector-user{color:#000;color:var(--primary-text-color);background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);font-size:1rem;padding:0 17px 0px 0px;margin-left:-0.25rem;margin-right:.75rem;height:2rem;line-height:2rem;margin-bottom:7px;border-radius:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:0 0 auto;transition:.2s opacity,.2s transform,.2s background-color;max-width:11.25rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:hover,html.no-touch .selector-user:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:hover .selector-user-avatar:after,html.no-touch .selector-user:active .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.selector-user-avatar:after{position:absolute;content:"";left:0;top:0;background-color:#df3f40;background-color:var(--danger-color);height:100%;width:100%;z-index:2;font-size:23px;line-height:32px !important;opacity:0;transition:.2s opacity,.2s transform;transform:scaleX(-1) rotate(0deg)}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{height:100%;flex:1 1 auto}.selector .chatlist-container .scrollable>:first-child{margin-top:.5rem}.selector .chatlist-chat{padding-top:.75rem;padding-bottom:.75rem}@media only screen and (max-width: 600px){.selector .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px !important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;transform:translateY(-50%);top:50%;z-index:1}.selector .checkbox-field:first-child{margin-right:1.6875rem;margin-left:.6875rem}.selector .checkbox-field-round{pointer-events:none;position:absolute;right:1.125rem;--size: 1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:unset}.selector .checkbox-field-round .checkbox-box-check{--offset: 6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{flex:1 0 auto;max-width:100%;height:100px;margin:2.5px;cursor:pointer;position:relative}.gifs-masonry>.gif video,.gifs-masonry>.gif img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.gifs-masonry>.gif img{position:absolute;left:0;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;height:100%;transform-origin:center center;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:54px;height:54px;display:flex;cursor:pointer;overflow:hidden;opacity:0;transform:scale(0)}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color: #fff}.preloader-container .you-spin-me-round{width:100%;height:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;width:100%;height:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new,body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite !important;animation:rotate 1s linear infinite !important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;color:var(--color);width:56%;height:56%;opacity:1}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-download:hover,html.no-touch .preloader-container .preloader-download:active{background:none}.preloader-container:not(.manual) .preloader-download,.preloader-container.manual .preloader-close{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{width:1.5rem;height:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer !important}.preloader-container.preloader-streamable circle{stroke-width:2.5 !important}.preloader-container.preloader-streamable:after{content:"";position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:var(--color);left:50%;top:50%;transform:translate(-50%, -50%)}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{100%{transform:rotate(360deg)}}@keyframes rotate{100%{transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rp-overflow .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.btn-corner.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple{width:100%;height:100%;overflow:hidden;border-radius:inherit}.rp-overflow .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.btn-corner.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration: .7s;position:absolute;top:0;left:0;bottom:0;right:0}html.is-safari .c-ripple:not(:empty){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%);border-radius:inherit}.c-ripple__circle{background-color:rgba(0, 0, 0, .08);background-color:var(--ripple-color);display:block;position:absolute;transform:scale(0);border-radius:50%;-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;transition:.35s opacity,.35s background-color;pointer-events:none}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration: .2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width: 925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration: .2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}avatar-element{--size: 54px;--multiplier: 1;--color-top: var(--avatar-color-top);--color-bottom: var(--avatar-color-bottom);color:#fff;width:var(--size);height:var(--size);line-height:var(--size) !important;border-radius:50%;background:linear-gradient(var(--color-top), var(--color-bottom));text-align:center;font-size:calc(1.25rem / var(--multiplier));-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase;font-weight:700}avatar-element[data-color=red]{--color-top: var(--peer-avatar-red-top);--color-bottom: var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top: var(--peer-avatar-orange-top);--color-bottom: var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top: var(--peer-avatar-violet-top);--color-bottom: var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top: var(--peer-avatar-green-top);--color-bottom: var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top: var(--peer-avatar-cyan-top);--color-bottom: var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top: var(--peer-avatar-pink-top);--color-bottom: var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top: var(--peer-avatar-blue-top);--color-bottom: var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px / var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px / var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(21px / var(--multiplier)) !important}avatar-element.tgico-reply_filled:before{font-size:calc(28px / var(--multiplier)) !important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px / var(--multiplier))}avatar-element:before{line-height:inherit !important}avatar-element.media-container{position:relative}avatar-element img{width:var(--size) !important;height:var(--size) !important;border-radius:inherit !important;display:block}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{width:calc(1.125rem / var(--multiplier)) !important;height:calc(1.125rem / var(--multiplier)) !important;vertical-align:middle !important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{position:absolute;content:" ";display:block;border-radius:50%;border:2px solid #fff;border:2px solid var(--surface-color);background-color:#0ac630;background-color:var(--avatar-online-color);width:14px;height:14px;left:2.4375rem;top:2.4375rem}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size: 120px;--multiplier: .45}avatar-element.avatar-100{--size: 100px;--multiplier: .54}avatar-element.avatar-48{--size: 48px;--multiplier: 1.125}avatar-element.avatar-46{--size: 46px;--multiplier: 1.173913}avatar-element.avatar-44{--size: 44px;--multiplier: 1.227272}avatar-element.avatar-42{--size: 42px;--multiplier: 1.285714}avatar-element.avatar-40{--size: 40px;--multiplier: 1.35}avatar-element.avatar-35{--size: 35px;--multiplier: 1.542857}avatar-element.avatar-34{--size: 34px;--multiplier: 1.588235}avatar-element.avatar-32{--size: 32px;--multiplier: 1.6875}avatar-element.avatar-30{--size: 30px;--multiplier: 1.8}avatar-element.avatar-18{--size: 18px;--multiplier: 3}avatar-element.avatar-16{--size: 16px;--multiplier: 3.375}.avatar-relative .avatar-photo{position:absolute;top:0;left:0}.document{--background-color: var(--primary-color);padding-left:4.25rem;height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#fff;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0 .25rem}@media only screen and (max-width: 600px){.document:not(.document-with-thumb) .document-ico{padding:1.5rem 0px 0px 0px;font-size:14px}.document:not(.document-with-thumb) .document-ico:after{--size: .875rem}}.document-ico:after{--size: 1.125rem;content:"";display:block;position:absolute;top:0;right:0;width:var(--size);height:var(--size);border-bottom-left-radius:.25rem;border-style:solid;border-width:calc(var(--size) / 2);border-left-color:rgba(0,0,0,.25);border-bottom-color:rgba(0,0,0,.25);border-top-color:#fff;border-right-color:#fff}.document-ico,.document-download{font-size:1.125rem;background-size:contain}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#fff;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color: #FB8C00}.document.ext-pdf{--background-color: #DF3F40}.document.ext-apk{--background-color: #43A047}.document.document-with-thumb{--background-color: #fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3) !important}.document-thumb{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.document-name{white-space:nowrap;font-weight:500;font-size:1rem}.document-size{white-space:nowrap;color:#707579;color:var(--secondary-text-color);font-size:.875rem;text-overflow:ellipsis;overflow:hidden}.document-name,.document-size{line-height:1.3125;line-height:var(--line-height)}.document .preloader-container{width:2.5rem;height:2.5rem}@media only screen and (max-width: 600px){.document .preloader-container{width:1.625rem;height:1.625rem}}.document .preloader-circular{background-color:transparent !important}.document .preloader-path-new{stroke-width:2.5}.document,.audio{display:flex;flex-direction:column;justify-content:center;cursor:pointer;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.document-ico,.document-download,.audio-ico,.audio-download{position:absolute;left:0;width:3.375rem;height:3.375rem;color:#fff}.document-download,.audio-download{z-index:1;align-items:center;font-size:1.5rem;cursor:pointer;display:flex;justify-content:center;transition:opacity .2s ease-in-out;opacity:1}.document-download.downloaded,.audio-download.downloaded{opacity:0}.document-description,.audio-description{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.document:not(.corner-download) .preloader-container:not(.preloader-streamable),.audio:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1) !important}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent !important}.audio .preloader-container:not(.preloader-streamable){width:100%;height:100%}.audio{position:relative;padding-left:67px;overflow:visible !important;height:3.375rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:3rem;padding-left:calc(3rem + .5625rem)}.audio-toggle,.audio-download{overflow:hidden;border-radius:50%;background-color:#3390ec;background-color:var(--primary-color);align-items:center}.audio.corner-download .audio-download{width:1.375rem;height:1.375rem;margin:2rem 2rem 0;background:none;display:flex !important;top:0}.audio.corner-download .preloader-container{border-radius:inherit;background-color:#3390ec;background-color:var(--primary-color)}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{position:absolute;top:0;right:0;bottom:0;left:0;transform:rotate(-119deg);overflow:hidden;max-width:100%;max-height:100%;border-radius:inherit}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{position:absolute;background-color:#fff;top:50%;left:50%;transform:translate(-50%, -50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out}@media only screen and (min-width: 601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width: 600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width: 601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width: 600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:23px;margin-top:1px}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color);opacity:.3}html.no-touch .audio-waveform rect:hover,html.no-touch .audio-waveform rect:active{opacity:1}.audio-waveform rect.active,.audio.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform rect{opacity:1}.audio .audio-details{margin-top:3px;margin-bottom:0}.audio .audio-title{margin-bottom:-2px}.audio-ico,.audio-download{width:3rem;height:3rem}.audio .part{height:112px !important;width:112px !important}@media only screen and (max-width: 600px){.audio .part{width:100px !important;height:100px !important}}.audio-title{font-size:1rem;color:#000;color:var(--primary-text-color)}.audio-description:not(:empty):before{content:" • "}.audio-time,.audio-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex}@media only screen and (max-width: 600px){.audio-time,.audio-subtitle{font-size:.75rem}}.audio-title,.audio-time,.audio-subtitle{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-title,.audio-subtitle{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{line-height:1;margin-left:-1px;margin-top:7px;align-items:center}@media only screen and (max-width: 600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{content:" ";width:.5rem;height:.5rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;margin-left:.375rem}.audio .progress-line{--height: 2px;--border-radius: 4px;--thumb-size: .75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{z-index:1;background-color:transparent;opacity:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff !important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;-o-object-fit:cover;object-fit:cover;width:inherit;height:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{position:absolute;left:0;display:flex;width:100%;justify-content:center;top:8px;align-items:center;transform:translate3d(0, calc(-100% - 10px), 0);transition:transform .2s ease}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translate3d(0, 0, 0)}.quiz-hint .container{background:rgba(0,0,0,.7);text-align:center;width:auto;padding:10px 18px 12px 50px;min-height:48px;border-radius:12px;line-height:1.5;color:#fff;font-size:15px;max-width:400px;overflow:hidden;text-align:left;position:relative;display:flex;align-items:center;flex-wrap:wrap}@media only screen and (max-width: 600px){.quiz-hint .container{padding:10px 18px 12px 54px;margin:0 10px;font-size:14px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"";position:absolute;left:15px;font-size:1.5rem;top:12px}.quiz-hint .container a{color:#fff;border-bottom:1px solid #fff}.peer-typing{margin-right:4px}.peer-typing-container{--color: var(--primary-color);color:var(--color)}.peer-typing-flex{display:flex;align-items:center}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;vertical-align:middle;transform:translateY(-1px)}.peer-typing-text-dot{width:6px;height:6px;border-radius:50%;background-color:var(--color);margin:0 .5px;display:inline-block;vertical-align:middle;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:dotMiddle;animation-name:dotMiddle}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{width:13px;height:5px;overflow:hidden;position:relative;border-radius:2px;margin-right:.375rem}.peer-typing-upload:before,.peer-typing-upload:after{display:block;content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--color);border-radius:inherit}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{content:" ";display:block;width:6px;height:6px;border-radius:50%;background-color:var(--color);-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.peer-typing-choosing-sticker{margin-right:.375rem;flex:0 0 auto;display:flex;align-items:center;height:16px}.peer-typing-choosing-sticker-eye{width:8px;height:14px;border-radius:50%;display:inline-block;vertical-align:middle;border:1px solid var(--color);margin:0 .0625rem;position:relative;-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite}.peer-typing-choosing-sticker-eye:before{content:" ";display:block;width:.25rem;height:.25rem;background-color:var(--color);border-radius:50%;position:absolute;top:50%;-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;transform:translate(-1px, -50%)}@-webkit-keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@-webkit-keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@-webkit-keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}@keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}poll-element{margin-top:-1px;display:block;width:330px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#000;color:var(--primary-text-color)}@media only screen and (max-width: 600px){poll-element{width:240px;max-width:100%}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500}@media only screen and (max-width: 600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{font-size:14px;color:#707579;color:var(--secondary-text-color);margin-top:2px;margin-bottom:5px;display:flex;align-items:center;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{position:absolute;font-size:1.5rem;top:-4px;right:2px;color:#3390ec;color:var(--primary-color);cursor:pointer;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{transform:scale(0);pointer-events:none}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;width:18px;height:18px}poll-element .poll-answer{display:flex;position:relative;padding-bottom:20px;padding-left:28px;margin-top:1px}poll-element .poll-answer-text{margin-top:6px;margin-left:12px}poll-element .poll-answer-percents{position:absolute;left:0;top:0;opacity:0;font-weight:500;margin-top:7px;font-size:14px;margin-left:-9px;text-align:right;width:40px}poll-element .poll-answer-selected{position:absolute;bottom:1px;left:15px;color:#fff;background:#3390ec;background:var(--primary-color);border-radius:50%;height:16px;width:16px;font-weight:bold;font-size:.75rem;opacity:1;display:flex;align-items:center;justify-content:center}poll-element .poll-answer-selected:before{content:"";font-weight:bold}html.no-touch poll-element .poll-answer:hover .animation-ring,html.no-touch poll-element .poll-answer:active .animation-ring{visibility:visible;transform:scale(1)}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-0.5rem}poll-element .poll-line{height:35px;position:absolute;left:10px;bottom:2px;stroke-dashoffset:0;stroke-dasharray:0,485.9}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{text-align:center;margin:-0.375rem -0.5rem -0.375rem -0.625rem;height:2.875rem}poll-element .poll-footer-button{cursor:pointer;width:100%;height:100%;color:#3390ec;color:var(--primary-color);font-weight:500;border-top-left-radius:0 !important;border-top-right-radius:0 !important;font-size:1rem;overflow:hidden}poll-element .poll-footer,poll-element .poll-footer-button{display:flex;align-items:center;justify-content:center}poll-element .poll-quiz-timer{width:32px;height:32px;stroke:#a3adb6;transform:rotate(270deg);top:-7px;fill:none;position:absolute;right:-2px;stroke-linecap:round}poll-element .poll-time{font-size:12px;font-weight:500;position:absolute;right:27px;color:#a3adb6}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:"";font-size:12px}poll-element .circle-hover{display:flex;justify-content:center;align-items:center;width:34px;height:34px;position:absolute;left:-1px;top:-1px;transform:scale(1)}poll-element .circle-hover .poll-answer-selected{display:flex !important;opacity:0;left:50%;top:50%;transform:translate(-50%, -50%);width:20px;height:20px;font-size:20px;line-height:16px;-webkit-animation:none;animation:none}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{display:block;border-radius:50%;height:34px;width:34px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);transform:scale(0.1);visibility:hidden}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;width:26px;top:unset;left:unset}poll-element .progress-ring__circle{transform-origin:center;transform:rotate(-90deg);stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent}poll-element.is-voted .circle-hover,poll-element.is-voted .animation-ring{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity .1s ease forwards}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:.34s opacity}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:.1s transform}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-animation-fill-mode:forwards !important;animation-fill-mode:forwards !important}.transition>.transition-item:not(.active):not(.from):not(.to){display:none !important}.transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.transition.zoom-fade>.to{transform-origin:center;opacity:0}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(0.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine: cubic-bezier(.39, .575, .565, 1);--easeInSine: cubic-bezier(.47, 0, .745, .715);position:relative}.transition.slide-fade>.from{transform-origin:left center;transform:translateX(0);opacity:1}.transition.slide-fade>.to{transform-origin:left center;transform:translateX(1.5rem);opacity:0}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}.row{min-height:3.5rem;position:relative;padding:.6875rem 1rem;display:flex;flex-direction:column;justify-content:center}.row a{position:relative;z-index:1}.row-title-row{display:flex;justify-content:space-between;align-items:center;order:0}.row-title-row .row-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word;text-overflow:ellipsis;overflow:hidden}.row-title-right{flex:0 0 auto !important;margin-left:1rem}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{position:absolute;left:1rem;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);pointer-events:none;margin-top:-0.125rem}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width: 601px){.row-clickable{border-radius:10px}}.row .radio-field-main,.row .checkbox-field{padding-left:3.375rem;margin-left:-3.375rem}.row .checkbox-field{margin-right:0;height:auto}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0;margin-right:.125rem;padding:0}.row-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important;font-size:.875rem !important;line-height:1.3125;line-height:var(--line-height);margin-top:.125rem;margin-bottom:.0625rem;order:1}.row-subtitle:empty{display:none}.row-media{width:48px !important;height:48px !important;position:absolute !important;margin:0 !important;left:.5rem}.row.menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.color-picker{width:380px;max-width:100%;margin:1.1875rem auto 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.color-picker-box{width:100%;height:198px}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible !important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);position:absolute !important;right:0;bottom:calc(100% + .625rem);width:26.25rem !important;max-width:100%;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:bottom right;padding:.625rem !important;display:block !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{width:100%;border-radius:.375rem;border:2px solid #3390ec;border:2px solid var(--primary-color);text-align:center;color:#3390ec;color:var(--primary-color);background-color:transparent;height:3rem;font-weight:500;font-size:.9375rem}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:hover,html.no-touch .reply-keyboard-button:active{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.popup{position:fixed !important;top:0;right:0;bottom:0;left:0;max-width:none;z-index:3;background-color:rgba(0,0,0,.3);margin:0;padding:1.875rem;box-shadow:none;opacity:0;visibility:hidden;transition-property:opacity,visibility;transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-timing-function:cubic-bezier(.4, 0, .2, 1);transition-timing-function:var(--popup-transition-function);overflow:auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;visibility:visible;transition-delay:0s,0s;z-index:4}.popup.active .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup.hiding .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup-container{--translateX: 0;position:relative;border-radius:10px;background-color:#fff;background-color:var(--surface-color);padding:1rem;transform:translate3d(var(--translateX), 3rem, 0);-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .15s cubic-bezier(.4, 0, .2, 1);transition:transform var(--popup-transition-time) var(--popup-transition-function);display:flex;flex-direction:column;overflow:hidden;margin:auto}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500}.popup-centerer{margin:auto}.popup-close{z-index:3;justify-self:center;flex:0 0 auto}.popup-header{display:flex;margin-bottom:2rem;align-items:center;flex:0 0 auto}.popup-body{flex:1 1 auto;display:flex;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-top:0 !important;margin-right:1.125rem}.popup-buttons .btn{font-weight:500;padding:.5rem;text-transform:uppercase;border-radius:8px;position:relative;overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis}.popup-buttons .btn+.btn{margin-top:.5rem;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{position:absolute;bottom:20px;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;text-align:left;margin:0;margin-left:2rem}.popup-avatar .crop{max-width:100%;max-height:100%;padding:24px 54px 46px 46px;border-radius:8px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{width:420px;max-width:420px;padding:12px 20px 32.5px;max-height:100%}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{width:auto;height:36px;font-size:14px;font-weight:normal;padding:0 1.375rem;margin-top:-3px;border-radius:10px;text-transform:uppercase}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;padding-left:1.5rem;margin:0;margin-top:-3px;font-size:1.25rem;font-weight:500}.popup-new-media .popup-photo{max-width:380px;overflow:hidden;width:100%;border-radius:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{width:100%;margin-top:25px;flex:0 0 auto}.popup-new-media .input-field-input{font-size:1rem;border-radius:10px}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{z-index:4;top:calc(100% + .25rem)}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{position:relative;border-radius:inherit;overflow:hidden}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{max-width:100%;overflow:hidden;cursor:default;padding-left:3.75rem;height:4.5rem}.popup-new-media.popup-send-photo .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;line-height:1.5}.popup-new-media.popup-send-photo .document-ico{height:48px;width:48px;font-size:16px;font-weight:normal;line-height:11px;letter-spacing:0}.popup-create-contact .name-fields{display:flex;flex-direction:column;position:relative;padding-left:116px;margin-top:1rem}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{display:flex;margin-bottom:.625rem;align-items:center}.popup-peer .popup-container{padding:1rem 1.5rem .8125rem;max-width:min(400px, 100%)}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{margin-top:0;margin-bottom:0;min-width:15rem;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;text-overflow:ellipsis;overflow:hidden;word-break:break-word;line-height:1.3125;line-height:var(--line-height)}.popup-peer .popup-buttons{margin-top:1.625rem;margin-right:-0.5rem}.popup-peer .popup-buttons .btn{font-weight:500}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin:0 -1.0625rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{padding:0 2rem 0 1.5rem;margin:0;font-size:1.25rem;font-weight:500;line-height:1.3125;line-height:var(--line-height)}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);text-align:center;color:#3390ec;color:var(--primary-color)}.popup-stickers .sticker-set-footer .btn-primary{text-transform:uppercase;width:auto;padding:0 1.0625rem;height:44px}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-width:420px;max-height:420px;width:420px;padding:0}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{margin-bottom:12px;flex:0 0 auto;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{padding:0 5px;display:grid;grid-template-columns:repeat(5, 1fr)}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4, 1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{width:80px;width:var(--esg-sticker-size);height:80px;height:var(--esg-sticker-size);margin-bottom:2px;justify-self:center;cursor:pointer;position:relative}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height: 470px){.popup-date-picker .popup-container[data-lines="7"]{top:19px}.popup-date-picker .popup-container[data-lines="5"]{top:-19px}}.popup-date-picker .popup-header{margin-left:6px;margin-top:4px;margin-bottom:1.375rem}.popup-date-picker .popup-title{font-weight:500;font-size:20px}.popup-date-picker .popup-buttons{order:2;margin-right:-2px}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{display:flex;justify-content:space-between;align-items:center}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-prev:disabled,.popup-date-picker .date-picker-next:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-top:7px;margin-bottom:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7, 1fr);width:100%;justify-content:center}.popup-date-picker .date-picker-month .btn-icon{justify-self:center;width:38px;height:38px;font-size:12px;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;align-items:center}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7 !important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{color:#fff;color:var(--badge-text-color);border-radius:50%;background-color:#3390ec !important;background-color:var(--primary-color) !important}.popup-schedule .popup-header{justify-content:space-between;margin-top:5px;margin-bottom:17px;margin-left:0}@media only screen and (max-width: 600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;width:420px;padding:4px 16px 16px 16px}@media only screen and (max-width: 600px){.popup-schedule .popup-container{min-width:312px;width:312px;padding:4px 14px 14px 14px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-right:-20px;margin-left:2px;width:unset}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-weight:500;font-size:20px;margin-left:-5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{justify-self:auto;font-weight:500;font-size:14px;width:36px;height:36px;margin-top:-4px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8 !important}.popup-schedule .date-picker-month-day{font-weight:bold;color:#000 !important;color:var(--primary-text-color) !important;font-size:14px !important}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width: 600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:normal}@media only screen and (max-width: 600px){.popup-schedule .btn-primary{height:50px;widtH:280px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px, 100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main::before{left:.25rem}.popup-create-poll .radio-field .radio-field-main::after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none;opacity:0 !important}.popup-create-poll .input-field .btn-icon{position:absolute;right:.4375rem;top:.4375rem;z-index:1;opacity:1;transition:opacity .2s ease}@media only screen and (max-width: 600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{margin-top:.875rem;font-size:.875rem;line-height:1.2}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{top:54px;right:20px}.popup-forward .popup-container{width:420px;max-width:420px;padding:7px 0 0 0;max-height:min(40.625rem, 100%);height:40.625rem}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width: 600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .selector,.popup-forward .chatlist-container{height:auto;overflow:hidden;display:flex;width:100%;flex-direction:row;flex:1 1 auto}.popup-forward .selector-search-input{font-size:1.25rem;padding:.5rem 1.5rem;width:100%;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0 !important}.popup-forward .selector .chatlist-chat{height:3.875rem !important;padding-top:.5rem !important;padding-bottom:.5rem !important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;text-align:center;pointer-events:none}.popup-instance-deactivated .header{font-size:2rem;color:#fff}.popup-instance-deactivated .subtitle{color:#fff;opacity:.6;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:bold;margin:.75rem 0 .25rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{width:100px;height:100px;position:relative;margin:0 auto}.popup-report-messages-confirm .popup-body{margin:1em -0.5rem .375rem -0.5rem;overflow:unset}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-group-call{padding:0;background-color:transparent;overflow:visible}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-right-radius:0;border-bottom-left-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--button-size: 3.375rem;width:100%;height:100%;padding:0 .5rem}.group-call:after{content:" ";position:absolute;right:0;bottom:0;left:0;height:7.5rem;background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, #212121 100%);background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, var(--gc-background-color) 100%)}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{flex:0 0 auto;color:inherit}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500}.group-call-header-title,.group-call-header-subtitle{line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-header-subtitle{font-size:.875rem;color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-buttons{display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.75rem;align-self:center;z-index:1}.group-call-button{width:var(--button-size);height:var(--button-size);display:flex;align-items:center;justify-content:center;cursor:pointer;color:#fff;color:var(--gc-primary-text-color);font-size:1.5rem;position:relative;background-color:rgba(1, 200, 80, .2);background-color:var(--gc-button-unmuted-color);border-radius:50%;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px)}body.animation-level-2 .group-call-button{transition:background-color .3s cubic-bezier(.4, .0, .2, 1);transition:background-color var(--transition-standard-in)}.group-call-button+.group-call-button{margin-left:1.25rem}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60, 135, 247, .2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223, 68, 184, .2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255, 89, 90, .3) !important;background-color:var(--gc-button-leave-color) !important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg, #00A3B4 12.94%, #00CB47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg, #4EABF8 14.73%, #3478F6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg, #DF44B8 14.73%, #3851EB 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{align-items:center;padding-right:.5rem}.group-call-participant-status-icon{vertical-align:middle;margin-right:6px;margin-top:2px;line-height:1;display:inline-block;font-size:18px}.group-call-participant-status-container{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-muted-icon-container{flex:0 0 auto}.group-call-participant-video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain;position:absolute}.group-call-participant-video-container{position:relative;height:15rem;width:100%;display:flex;align-items:center;border-radius:10px;background-color:#000;overflow:hidden;margin:.25rem;width:33%;flex:1 1 auto;cursor:pointer}.group-call-participant-video-container:after{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0) 55.62%, rgba(0, 0, 0, 0.5) 86.46%)}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;margin-top:0}.group-call-participant-video-container:after,.group-call-participant-video-info,.group-call-participant-video-header{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-info,body.animation-level-2 .group-call-participant-video-header{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-info,.group-call-participant-video-header{display:flex;align-items:center;justify-content:space-between;padding:0 .5rem 0 .75rem;position:absolute;right:0;bottom:.25rem;left:0;z-index:1}.group-call-participant-video-header{top:0;bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem}.group-call-participant-video-header .group-call-pin-icon{width:1.5rem;height:1.5rem;font-size:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-video-info .group-call-participant-status-container{opacity:.6;margin-top:-1px;margin-bottom:-1px}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant-video-blur{position:absolute;width:100%;height:100%;opacity:.7}.group-call-participant .is-speaking{color:#5CC85E;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;overflow:hidden;flex:1 1 auto}.group-call-participants-scrollable{position:relative;border-radius:inherit;height:auto;padding-bottom:6rem}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-0.25rem -0.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container,.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2){height:auto;flex:1 0 auto}.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container:before,.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before{content:" ";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-info,.group-call-participants-video-container.show-controls .group-call-participant-video-header{opacity:1}.group-call-participants .chatlist{background:none;padding:0;max-width:600px;margin:0 auto}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-participants .dialog-subtitle{margin-top:-0.25rem}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{min-height:100%;margin-bottom:.25rem}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25% !important}.group-call-cfs{display:none}.group-call:not(.is-big-layout) .popup-body .group-call-header{display:none}.group-call:not(.is-big-layout) .group-call-big-video-container{display:none}.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width: 17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active{background-color:rgba(112,117,121,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(calc(26.25rem / -2));transform:translateX(calc(var(--gc-right-column-width) / -2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX: calc(var(--gc-right-column-width) / -2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{position:absolute;top:0;right:calc(26.25rem * -1);right:calc(var(--gc-right-column-width) * -1);bottom:0;width:26.25rem;width:var(--gc-right-column-width);background-color:#212121;background-color:var(--gc-background-color);padding:inherit}.group-call.is-big-layout .group-call-buttons{padding:.75rem;bottom:2.5rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{position:absolute;content:" ";top:0;right:0;bottom:0;left:0;-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),background-color .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}#auth-pages{max-width:100%;overflow:hidden;background:#fff;background:var(--surface-color)}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width: 600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width: 600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width: 600px){#auth-pages .input-wrapper{margin-top:41px;width:100%;padding:0 16px}}#auth-pages .auth-image,#auth-pages .subtitle,#auth-pages .input-wrapper{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;position:relative;max-width:720px;margin:0 auto}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height: 810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{max-width:720px;min-width:auto;margin:0 auto;position:relative}#auth-pages .tabs-container .tabs-tab .container{height:810px;padding:0;flex:1 1 auto;display:flex;flex-direction:column;width:100%}@media screen and (max-height: 810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width: 600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-top:.5rem;margin-bottom:.5rem}.page-sign .auth-image,.page-signUp .auth-image{width:7.5rem;height:7.5rem;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.page-sign .auth-image,.page-signUp .auth-image{width:10rem;height:10rem;margin-bottom:1.5rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{max-width:100%;max-height:100%;fill:#3390ec;fill:var(--primary-color)}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:normal}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:unset !important}.page-signQR .auth-image{width:240px !important;height:240px !important;display:flex;justify-content:center;align-items:center}.page-signQR .auth-image .preloader{transform:none;left:unset;top:unset}.page-signQR .auth-image .qr-canvas{width:100%;height:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem !important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{max-width:480px;margin:1rem auto;line-height:1.3125;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-top:10px;margin-bottom:14px}@media only screen and (max-width: 600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width: 600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{display:flex;align-items:center;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{padding:0 1rem;border:none;outline:none;padding:0 1rem;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color)}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:calc(1680px + 2px) !important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{width:100%;overflow:hidden;position:relative;min-height:100%;height:100%;max-height:100%}@media only screen and (max-width: 600px){.page-chats .main-column{width:100%;display:flex !important;z-index:1}}@media only screen and (min-width: 601px){.page-chats #column-center{display:flex !important;background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex !important}.page-chats .main-column{height:100%;position:relative;min-height:100%;max-height:100%}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;width:100%;max-height:100%;height:100%;overflow:hidden;position:absolute;left:0;top:0;z-index:3}@media only screen and (min-width: 1681px){.page-chats{border-top-width:0;border-right-width:1px;border-bottom-width:0;border-left-width:1px;border-style:solid;border-color:#dfe1e5;border-color:var(--border-color)}}.page-chats .avatar-edit{width:120px;height:120px;margin:1rem auto 2rem;flex:0 0 auto}body.animation-level-2 .page-chats .main-column{transition:.25s ease-in-out;transition:var(--tabs-transition)}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}html,body{height:100%;width:100%;margin:0;padding:0}@media only screen and (max-width: 600px){html,body{overflow:hidden;height:calc(1vh * 100);height:calc(var(--vh, 1vh) * 100)}}html.is-ios{position:fixed;-webkit-user-select:none;-webkit-touch-callout:none}@supports(padding: max(0px)){html{padding:0 min(16px, env(safe-area-inset-right)) 0 min(16px, env(safe-area-inset-left))}}html{font-size:16px;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,input,optgroup,select,textarea,html{font-family:"Roboto",-apple-system,apple color emoji,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}input,textarea,button,select,a,div{-webkit-tap-highlight-color:rgba(0,0,0,0)}.whole{min-height:100%;width:100%;margin:0 auto;max-width:1680px;height:100%}@media only screen and (min-width: 601px){.only-handhelds{display:none !important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500}h4{font-size:2rem;margin:22px 0 14px;line-height:110%}@media only screen and (max-width: 600px){h4{font-size:20px;margin:2px 0 8px}}input,[contenteditable=true]{caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color);background-color:transparent}input,textarea{-webkit-appearance:none}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40 !important;color:var(--danger-color) !important}.danger .c-ripple__circle{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec !important;color:var(--primary-color) !important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.blue:before,.primary:before,.danger:before{color:inherit !important}.bg-warning{background:#fed85a !important}.contextmenu{position:fixed !important;right:auto !important;bottom:auto !important;width:auto !important;z-index:4 !important}.preloader{width:50px;height:50px;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);padding:.5rem 1rem;background-color:rgba(0,0,0,.66);color:#fff;font-size:1rem;border-radius:10px;-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;z-index:5;max-width:22.5rem}.toast b{color:inherit}hr{width:100%;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:bolder}.user-last-message b{font-weight:400}.avatar-edit{position:relative;border-radius:50%;cursor:pointer;overflow:hidden}.avatar-edit-canvas{max-width:100%;max-height:100%;width:100%;height:100%;background:linear-gradient(#72d5fd, #2a9ef1);background:linear-gradient(var(--avatar-color-top), var(--avatar-color-bottom))}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{position:absolute;font-size:48px;line-height:48px;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);z-index:2;color:#fff}.avatar-edit .avatar-placeholder{position:absolute;left:0;top:0;width:100%;height:100%;filter:brightness(0.7)}.missing-icon{width:1.5rem;height:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{max-height:23.5rem;position:absolute;width:100%;top:calc(100% + .5rem);left:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);z-index:3;border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;transition:opacity .2s ease-out,transform .2s ease-out;transform:scale(0.95);transform-origin:top center;opacity:0}.select-wrapper.active{transform:scale(1);opacity:1}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;padding:0 1rem;justify-content:space-between;height:3.5rem;cursor:pointer;text-align:left;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px}html.no-touch .select-wrapper li:hover,html.no-touch .select-wrapper li:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{height:26px;width:26px;font-size:26px;line-height:1}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{width:166px;height:166px;margin:0 auto 18px;position:relative}@media only screen and (max-width: 600px){.auth-image{width:120px;height:120px}}.phone-edit{display:inline-block;width:24px;height:24px;margin-left:.4rem;opacity:.5;transition:.2s opacity;cursor:pointer;font-size:1.5rem}@media only screen and (max-width: 600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:hover,html.no-touch .phone-edit:active{opacity:1}span.emoji{display:inline !important;vertical-align:unset !important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1 !important}@media not screen and (-webkit-min-device-pixel-ratio: 2),not screen and (min-device-pixel-ratio: 2),not screen and (min-resolution: 192dpi),not screen and (min-resolution: 2dppx){html:not(.is-safari) span.emoji{margin-right:5px !important}html:not(.is-safari) avatar-element span.emoji{margin-right:0 !important}}img.emoji{width:18px;height:18px;display:inline-block;max-width:100%;max-height:100%;vertical-align:middle}[contenteditable=true]{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;outline:none;cursor:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{content:attr(data-placeholder);color:#a2acb4;display:block;pointer-events:none}.sticky_sentinel{position:absolute;left:0;right:0;visibility:hidden;pointer-events:none}.super-stickers{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}html.no-touch .super-sticker:hover,html.no-touch .super-sticker:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;padding-right:32px;padding-left:16px;font-size:24px;color:#707579;color:var(--secondary-text-color)}.content-empty{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@-webkit-keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}@keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{width:100%;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.grid-item{height:0;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{position:absolute;left:0;top:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.animated-super-row{--translateY: 100%;position:absolute;left:0;top:0;right:0;bottom:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0, calc(var(--translateY) * -1), 0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0, var(--translateY), 0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{position:absolute;left:0;top:0;bottom:0;right:0}middle-ellipsis-element{width:100%;overflow:hidden;display:block}.album-item-media{width:100%;height:100%}html.no-touch .hover-effect:hover,html.no-touch .hover-effect:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.progress-ring{position:absolute;top:0;left:0;pointer-events:none}.progress-ring__circle{transition:stroke-dashoffset;stroke-linecap:round}.rlottie,.rlottie-vector{left:0;top:0;bottom:0;right:0;position:absolute;max-width:100%;max-height:100%;width:100%;height:100%}.rlottie-icon{position:relative}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.media-photo,.media-video,.media-sticker,.media-round,.media-poster{position:absolute;top:0;right:0;bottom:0;left:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-video.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-poster.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-video.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-poster.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{margin:auto;-o-object-fit:contain;object-fit:contain;width:100%;height:100%;max-width:100%;max-height:100%}.media-round{max-width:280px;max-width:var(--round-video-size);max-height:280px;max-height:var(--round-video-size);z-index:1}.media-round canvas{width:100%;height:100%;border-radius:50%;position:relative}.media-round .video-time{padding:0 .375rem;background-color:hsla(85.5319, 36.9171%, 40.402%, .4) !important;background-color:var(--message-highlightning-color) !important}.media-round .video-time:before,.media-round .video-time:after{margin-left:.25rem}.media-round.is-unread .video-time:before{order:1;width:.5rem;height:.5rem;background-color:#fff;border-radius:50%;content:" "}.media-round.is-paused .video-time:after{content:"";display:flex;align-items:center;font-size:1.125rem;order:2}.gradient-delimiter{width:100%;height:.75rem;background-color:#f4f4f5;background-color:var(--background-color-true);position:relative}.gradient-delimiter:before{content:" ";position:absolute;left:0;top:0;right:0;bottom:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0.06) 100%)}.tgico-reply:before,.tgico-attach:before,.tgico-saved:before,.tgico-phone:before,.tgico-admin:before,.tgico-message:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-reply_filled:before,.tgico-forward_filled:before{font-size:20px !important;padding:0 2px}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{display:grid;grid-column-gap:2.44px;grid-template-columns:repeat(auto-fill, 2.625rem);justify-content:space-between;font-size:2.125rem;line-height:2.125rem}.super-emojis .super-emoji{display:inline-block;margin:0 .0625rem;padding:.25rem;line-height:inherit;border-radius:8px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem;height:2.625rem}html:not(.emoji-supported) .super-emojis .super-emoji{position:relative}.super-emojis .super-emoji .emoji-placeholder{position:absolute;left:7px;top:7px;width:1.75rem;height:1.75rem;border-radius:50%;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);pointer-events:none}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{width:100%;height:100%;vertical-align:unset;margin:0}html.no-touch .super-emojis .super-emoji:hover,html.no-touch .super-emojis .super-emoji:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:"Roboto" !important;font-weight:500;width:1.5rem;text-align:center}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status-icon{position:absolute;line-height:1 !important}.verified-icon{flex:0 0 auto;width:1.25rem;height:1.25rem;margin-left:.125rem}.movable-element{--size: .5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{left:0;right:0;height:var(--size);cursor:row-resize}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{top:0;bottom:0;width:var(--size);cursor:col-resize}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw,.movable-element-resize-handler-side-se{width:var(--size);height:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-nw{cursor:nwse-resize}.movable-element-resize-handler-side-ne{top:0;right:0}.movable-element-resize-handler-side-se{right:0;bottom:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{top:0;left:0} +@font-face{font-family:"tgico";src:url("assets/fonts/tgico.ttf?onwvlx") format("truetype"),url("assets/fonts/tgico.woff?onwvlx") format("woff"),url("assets/fonts/tgico.svg?onwvlx#tgico") format("svg");font-weight:normal;font-style:normal;font-display:block}[class^=tgico-],.tgico:before,.tgico:after,[class*=" tgico-"]:before,[class*=" tgico-"]:after{font-family:"tgico";speak:never;font-style:normal;font-weight:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tgico-check:before{content:""}.tgico-checks:before{content:""}.tgico-activesessions:before{content:""}.tgico-add:before{content:""}.tgico-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-avatarnext:before{content:""}.tgico-avatarprevious:before{content:""}.tgico-bold:before{content:""}.tgico-botcom:before{content:""}.tgico-bots:before{content:""}.tgico-bug:before{content:""}.tgico-calendar:before{content:""}.tgico-calendarfilter:before{content:""}.tgico-camera:before{content:""}.tgico-cameraadd:before{content:""}.tgico-car:before{content:""}.tgico-channel:before{content:""}.tgico-channelviews:before{content:""}.tgico-chatspinned:before{content:""}.tgico-chatsplaceholder:before{content:""}.tgico-check1:before{content:""}.tgico-checkbox:before{content:""}.tgico-checkboxblock:before{content:""}.tgico-checkboxempty:before{content:""}.tgico-checkboxon:before{content:""}.tgico-checkretract:before{content:""}.tgico-checkround:before{content:""}.tgico-close:before{content:""}.tgico-clouddownload:before{content:""}.tgico-colorize:before{content:""}.tgico-comments:before{content:""}.tgico-commentssticker:before{content:""}.tgico-copy:before{content:""}.tgico-darkmode:before{content:""}.tgico-data:before{content:""}.tgico-delete_filled:before{content:""}.tgico-delete: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-favourites:before{content:""}.tgico-flag:before{content:""}.tgico-folder:before{content:""}.tgico-fontsize:before{content:""}.tgico-forward_filled:before{content:""}.tgico-forward:before{content:""}.tgico-fullscreen:before{content:""}.tgico-gc_microphone:before{content:""}.tgico-gc_microphoneoff:before{content:""}.tgico-gifs:before{content:""}.tgico-group:before{content:""}.tgico-help:before{content:""}.tgico-image:before{content:""}.tgico-info:before{content:""}.tgico-info2:before{content:""}.tgico-italic:before{content:""}.tgico-keyboard:before{content:""}.tgico-lamp:before{content:""}.tgico-language:before{content:""}.tgico-largepause:before{content:""}.tgico-largeplay:before{content:""}.tgico-left:before{content:""}.tgico-link:before{content:""}.tgico-listscreenshare:before{content:""}.tgico-livelocation:before{content:""}.tgico-location:before{content:""}.tgico-lock:before{content:""}.tgico-lockoff:before{content:""}.tgico-loginlogodesktop:before{content:""}.tgico-loginlogomobile:before{content:""}.tgico-logout:before{content:""}.tgico-mention:before{content:""}.tgico-menu:before{content:""}.tgico-message:before{content:""}.tgico-messageunread:before{content:""}.tgico-microphone:before{content:""}.tgico-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-play:before{content:""}.tgico-plus:before{content:""}.tgico-poll:before{content:""}.tgico-previous:before{content:""}.tgico-radiooff:before{content:""}.tgico-radioon:before{content:""}.tgico-readchats:before{content:""}.tgico-recent:before{content:""}.tgico-replace:before{content:""}.tgico-reply_filled:before{content:""}.tgico-reply:before{content:""}.tgico-rightpanel: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_filled:before{content:""}.tgico-settings:before{content:""}.tgico-sharescreen_filled:before{content:""}.tgico-smallscreen:before{content:""}.tgico-smile:before{content:""}.tgico-sport:before{content:""}.tgico-stickers:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools:before{content:""}.tgico-unarchive:before{content:""}.tgico-underline:before{content:""}.tgico-unmute:before{content:""}.tgico-unpin:before{content:""}.tgico-unread:before{content:""}.tgico-up:before{content:""}.tgico-user:before{content:""}.tgico-username:before{content:""}.tgico-videocamera_filled:before{content:""}.tgico-videocamera:before{content:""}.tgico-videochat:before{content:""}.tgico-zoomin:before{content:""}.tgico-zoomout:before{content:""} + +/*# sourceMappingURL=main.46ecaa33a4d72f91b821.css.map*/ \ No newline at end of file diff --git a/public/main.46ecaa33a4d72f91b821.css.map b/public/main.46ecaa33a4d72f91b821.css.map new file mode 100644 index 000000000..1c9e933c1 --- /dev/null +++ b/public/main.46ecaa33a4d72f91b821.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/materialize.scss","webpack:///./src/scss/style.scss","webpack:///./src/scss/tgico.scss"],"names":[],"mappings":"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","file":"main.46ecaa33a4d72f91b821.css","sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{text-decoration:none;-webkit-tap-highlight-color:transparent}img,video{-webkit-user-drag:none}.valign-wrapper{display:flex;align-items:center}.z-depth-0{box-shadow:none !important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none !important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition{transition:none !important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start !important}.justify-self-start{justify-self:flex-start !important}.justify-self-end{justify-self:flex-end !important}.position-center{position:absolute !important;left:50%;top:50%;transform:translate(-50%, -50%)}.text-bold{font-weight:500 !important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap !important}.no-border-radius{border-radius:0 !important}.disable-hover{pointer-events:none !important}a{text-decoration:none}html{line-height:1.5;font-weight:normal}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}pre,code{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}",":root{--vh: 1vh;--z-below: -1;--hover-alpha: 0.08;--transition-standard-easing: cubic-bezier(.4, .0, .2, 1);--transition-standard-in-time: .3s;--transition-standard-out-time: .25s;--transition-standard-in: var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out: var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition: .2s ease-in-out;--layer-transition: .2s cubic-bezier(.4, .0, .2, 1);--slide-header-transition: .4s ease-in-out;--tabs-transition: .25s ease-in-out;--btn-menu-transition: .2s cubic-bezier(.4, 0, .2, 1);--esg-transition: var(--btn-menu-transition);--popup-transition-function: cubic-bezier(.4, 0, .2, 1);--popup-transition-time: .15s;--btn-corner-transition: .2s cubic-bezier(.34, 1.56, .64, 1);--chatlist-badge-transition-in: .2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out: .2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin: 5.5625rem;--message-beside-button-size: 2.375rem;--message-beside-button-margin: calc((var(--message-beside-button-size) + .5rem) * -1);--message-time-background: rgba(0, 0, 0, .35);--message-highlightning-color: hsla(85.5319, 36.9171%, 40.402%, .4);--messages-container-width: 728px;--messages-text-size: 16px;--messages-secondary-text-size: calc(var(--messages-text-size) - 2px);--line-height: 1.3125;--esg-sticker-size: 80px;--disabled-opacity: .3;--round-video-size: 280px;--topbar-floating-scaleX: 1;--topbar-call-height: 3rem;--topbar-floating-call-height: 0px;--peer-avatar-red-top: #ff885e;--peer-avatar-red-bottom: #ff516a;--peer-avatar-orange-top: #ffcd6a;--peer-avatar-orange-bottom: #ffa85c;--peer-avatar-violet-top: #82b1ff;--peer-avatar-violet-bottom: #665fff;--peer-avatar-green-top: #a0de7e;--peer-avatar-green-bottom: #54cb68;--peer-avatar-cyan-top: #53edd6;--peer-avatar-cyan-bottom: #28c9b7;--peer-avatar-blue-top: #72d5fd;--peer-avatar-blue-bottom: #2a9ef1;--peer-avatar-pink-top: #e0a2f3;--peer-avatar-pink-bottom: #d669ed}@media only screen and (max-width: 600px){:root{--right-column-width: 100vw;--esg-sticker-size: 68px;--round-video-size: 200px;--chat-input-size: 2.875rem;--chat-input-padding: 0.5rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 601px){:root{--right-column-width: calc(1680px / 4);--chat-input-size: 3.375rem;--chat-input-padding: 0.8125rem;--chat-input-inner-padding: 0.5rem}}@media only screen and (max-height: 569px){:root{--chat-input-size: 2.875rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 1276px)and (max-width: 1680px){:root{--right-column-width: 25vw}}:root{--body-background-color: #fff;--background-color-true: #f4f4f5;--background-color: #fff;--border-color: #dfe1e5;--surface-color: #fff;--scrollbar-color: rgba(0, 0, 0, .2);--input-search-background-color: #fff;--input-search-border-color: #dfe1e5;--primary-color: #3390ec;--light-primary-color: rgba(51, 144, 236, 0.08);--dark-primary-color: #157ce1;--primary-text-color: #000;--secondary-color: #c4c9cc;--secondary-text-color: #707579;--light-secondary-text-color: rgba(112, 117, 121, 0.08);--danger-color: #df3f40;--light-danger-color: rgba(223, 63, 64, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-blue-top);--avatar-color-bottom: var(--peer-avatar-blue-bottom);--chatlist-status-color: var(--avatar-online-color);--chatlist-pinned-color: #a2abb2;--badge-text-color: #fff;--link-color: #00488f;--ripple-color: rgba(0, 0, 0, .08);--poll-circle-color: var(--border-color);--message-background-color: var(--surface-color);--message-checkbox-color: #61c642;--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #eeffde;--light-message-out-background-color: rgba(238, 255, 222, 0.08);--dark-message-out-background-color: #d9ffb5;--message-out-link-color: var(--link-color);--message-out-primary-color: #4fae4e;--message-out-status-color: var(--message-out-primary-color);--message-out-audio-play-button-color: #fff;--gc-background-color: #212121;--gc-button-leave-color: rgba(255, 89, 90, .3);--gc-button-unmuted-color: rgba(1, 200, 80, .2);--gc-button-muted-color: rgba(60, 135, 247, .2);--gc-button-hand-color: rgba(223, 68, 184, .2);--gc-button-unmuted-fill-color: #195530;--gc-button-muted-fill-color: #3C87F7;--gc-green-color: #195530;--gc-blue-color: #3C87F7;--gc-red-color: #643333;--gc-primary-text-color: #fff;--gc-secondary-text-color: #aaaaaa;--gc-green-text-color: #5CC85E;--gc-blue-text-color: #3390ec;--gc-red-text-color: #ff595a;--gc-right-column-width: 26.25rem}.night{--body-background-color: #181818;--background-color-true: #181818;--background-color: #212121;--border-color: #0f0f0f;--surface-color: #212121;--scrollbar-color: rgba(255, 255, 255, .2);--input-search-background-color: #181818;--input-search-border-color: #2f2f2f;--primary-color: #8774E1;--light-primary-color: rgba(135, 116, 225, 0.08);--dark-primary-color: #6a52da;--primary-text-color: #fff;--secondary-color: #707579;--secondary-text-color: #aaaaaa;--light-secondary-text-color: rgba(170, 170, 170, 0.08);--danger-color: #ff595a;--light-danger-color: rgba(255, 89, 90, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-violet-top);--avatar-color-bottom: var(--peer-avatar-violet-bottom);--chatlist-status-color: var(--primary-color);--chatlist-pinned-color: var(--secondary-color);--badge-text-color: #fff;--link-color: var(--primary-color);--ripple-color: rgba(255, 255, 255, .08);--poll-circle-color: #fff;--message-background-color: var(--surface-color);--message-checkbox-color: var(--primary-color);--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #8774E1;--light-message-out-background-color: rgba(135, 116, 225, 0.08);--dark-message-out-background-color: #6a52da;--message-out-link-color: #fff;--message-out-primary-color: #fff;--message-out-status-color: rgba(255, 255, 255, .6);--message-out-audio-play-button-color: var(--message-out-background-color)}.input-wrapper{width:360px;margin:0 auto}.input-field{--height: 54px;--border-radius: 10px;position:relative}@media only screen and (max-width: 600px){.input-field{--height: 50px}}.input-field .arrow-down{position:absolute;content:\" \";top:50%;bottom:0;right:21px;cursor:pointer;height:0;width:0;border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;display:inline-block;padding:5px;vertical-align:middle;z-index:2;margin-top:-9px;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:.2s all}.input-field label{position:absolute;color:#9e9e9e;top:0;left:1rem;right:auto;z-index:2;height:1.5rem;transform:translate(0, 0);background-color:#fff;background-color:var(--surface-color);transform-origin:left center;pointer-events:none;margin-top:calc((var(--height) - 1.5rem) / 2);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-2 .input-field label{transition:.2s transform,.2s padding,.1s opacity,font-weight 0s .1s}.input-field-border{position:absolute;top:0;right:0;bottom:0;left:0;border:2px solid #3390ec;border:2px solid var(--primary-color);opacity:0;border-radius:var(--border-radius);pointer-events:none;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding: 1rem;--padding-horizontal: 1rem;--border-width: 1px;border:var(--border-width) solid #dfe1e5;border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);background-color:#fff;background-color:var(--surface-color);padding:calc(var(--padding) - var(--border-width));box-sizing:border-box;width:100%;min-height:var(--height);transition:0s border-color;position:relative;z-index:1;line-height:1.3125;line-height:var(--line-height)}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{-webkit-box-shadow:0 0 0px 1000px #fff inset;-webkit-box-shadow:0 0 0px 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill::first-line,.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{font-family:\"Roboto\",-apple-system,apple color emoji,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif !important;font-size:1rem !important;color:#000 !important;color:var(--primary-text-color) !important}@media only screen and (max-width: 600px){.input-field-input{--padding: .9375rem}}body.animation-level-0 .input-field-input{transition:none !important}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:.2s border-color}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40 !important;color:var(--danger-color) !important}.input-field-input.error~.input-field-border{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f !important}.input-field-input.valid~.input-field-border{border-color:#26962f !important}.input-field-input:focus~.arrow-down{margin-top:-4px;transform:rotate(225deg);border-color:#3390ec;border-color:var(--primary-color)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:focus~label,.input-field-input:valid~label,.input-field-input:not(:empty)~label,.input-field-input:disabled~label{transform:translate(-0.25rem, calc(var(--height) / -2 + .125rem)) scale(0.75);padding:0 6px;opacity:1}.input-field-input-fake{opacity:0;pointer-events:none;position:absolute !important;top:0;left:0;bottom:auto !important;right:auto !important;height:auto !important;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}input:focus,button:focus{outline:none}.input-clear{outline:none;border:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40 !important;color:var(--danger-color) !important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}.input-search{position:relative;width:100%;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;--border-radius: 22px}@media only screen and (max-width: 600px){.input-search{margin-left:1rem}}.input-search-input{--height: 42px;background-color:#fff;background-color:var(--input-search-background-color);padding:0px calc(var(--height) + 3px - var(--border-width));height:var(--height);min-height:var(--height) !important;max-height:var(--height) !important;border-color:#dfe1e5;border-color:var(--input-search-border-color);line-height:var(--height)}body.animation-level-2 .input-search-input{transition:background-color .2s ease-in-out,border-color .2s ease-in-out}html.no-touch .input-search-input:hover:not(:focus),html.no-touch .input-search-input:active:not(:focus){border-color:#c4c9cc !important;border-color:var(--secondary-color) !important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:hover,html.no-touch .input-search-input:focus~.btn-icon:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{position:absolute;top:50%;transform:translate(0, -50%);text-align:center;font-size:24px;color:#707579;color:var(--secondary-text-color);opacity:.6;line-height:1;z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{width:24px;height:24px;left:.8125rem;pointer-events:none}.input-search>.tgico-close{right:0px;z-index:1;width:42px;height:42px}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{padding-right:2.5rem;max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-size:2.25rem;padding-left:calc(.875rem - var(--border-width))}@media(-webkit-min-device-pixel-ratio: 2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{position:absolute;right:.375rem;z-index:2;font-size:1.5rem;color:#9e9e9e;cursor:pointer;transition:color .2s;padding:.5rem;display:flex;align-items:center;justify-content:center;top:50%;transform:translateY(-50%)}.input-field-password .toggle-visible:before{content:\"\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"\"}html.no-touch .input-field-password .toggle-visible:hover,html.no-touch .input-field-password .toggle-visible:active{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing: .24px}.input-field-phone .input-field-input:after{content:attr(data-left-pattern);color:#9e9e9e;letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;outline:none;border:none;cursor:pointer}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn:hover,html.no-touch .btn:active,html.no-touch .btn-icon:hover,html.no-touch .btn-icon:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn.primary:hover,html.no-touch .btn.primary:active,html.no-touch .btn.blue:hover,html.no-touch .btn.blue:active,html.no-touch .btn.active:hover,html.no-touch .btn.active:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn-icon.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn:disabled,.btn-icon:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{text-align:center;font-size:1.5rem;line-height:1;border-radius:50% !important;color:#707579;color:var(--secondary-text-color);background-color:transparent;border:none;padding:.5rem;position:relative;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out;display:flex;align-items:center;justify-content:center}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset: 1.25rem;--translateY: calc(54px + var(--offset));position:absolute !important;bottom:var(--offset);right:var(--offset);transition:transform .2s cubic-bezier(.34, 1.56, .64, 1) !important;transition:transform var(--btn-corner-transition) !important;transform:translate3d(0, var(--translateY), 0);z-index:3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#3390ec;background-color:var(--primary-color);text-align:center;font-size:1.5rem;color:#fff;border:none;outline:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0 !important}.btn-corner.is-visible{--translateY: 0}body.animation-level-0 .btn-corner{transition:none !important}.btn-corner:disabled{opacity:1 !important;pointer-events:all !important}.btn-corner .preloader-circular{width:2.5rem;height:2.5rem}.btn-menu{visibility:hidden;position:absolute;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 2px 8px 1px rgba(0,0,0,.24);z-index:3;top:100%;padding:.5rem 0;border-radius:10px;opacity:0;transform:scale(0.8);transition:opacity .2s cubic-bezier(.4, 0, .2, 1),transform .2s cubic-bezier(.4, 0, .2, 1),visibility .2s cubic-bezier(.4, 0, .2, 1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);font-size:16px;-webkit-user-select:none;-webkit-touch-callout:none}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{visibility:visible;opacity:1;transform:scale3d(1, 1, 1)}.btn-menu:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none !important}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{top:auto;top:initial;right:0;bottom:100%;transform-origin:bottom right}.btn-menu.top-right{top:auto;top:initial;left:0;bottom:100%;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{display:flex;position:relative;padding:0 40px 0 1rem;height:56px;cursor:pointer !important;pointer-events:all !important;color:#000;color:var(--primary-text-color);text-transform:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;align-items:center;text-align:left;line-height:1.3125;line-height:var(--line-height)}html.no-touch .btn-menu-item:hover,html.no-touch .btn-menu-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:hover,html.no-touch .btn-menu-item.danger:active{background-color:danger}.btn-menu-item:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}@media only screen and (max-width: 600px){.btn-menu-item{padding:0 30px 0 16px;height:50px}}.btn-menu-item-text{flex:1 1 auto}.btn-menu-overlay{position:fixed !important;left:0;right:0;top:0;bottom:0;z-index:3;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-menu-overlay{left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;width:auto !important;max-width:none !important}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{height:2.5rem;background:#f4f4f5;background:var(--background-color-true);display:flex;align-items:center;justify-content:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;font-size:.875rem;color:currentColor}.btn-menu hr{padding:0;margin:.5rem 0}.btn-primary{border-radius:10px;width:100%;text-align:center;height:54px;border:none;font-weight:500;cursor:pointer;overflow:hidden;position:relative;padding:0;transition:.2s opacity}html.no-touch .btn-primary:hover,html.no-touch .btn-primary:active{transition:.2s background-color,.2s opacity;background:#157ce1;background:var(--dark-primary-color)}.btn-primary-transparent{color:#3390ec;color:var(--primary-color);background-color:transparent}html.no-touch .btn-primary-transparent:hover,html.no-touch .btn-primary-transparent:active{background:rgba(51, 144, 236, 0.08);background:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:hover,html.no-touch .btn-primary-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary>svg,.btn-primary use{height:calc(100% - 20px);right:15px;left:auto}.btn-primary:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-control{width:auto;height:40px;align-items:center;margin:15px auto 1rem;border-radius:20px;padding:0 24px 0 12px;display:flex}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{color:#000;color:var(--primary-text-color);background-color:transparent;display:flex;align-items:center;padding:0 1rem;height:3.5rem;font-weight:normal;line-height:1.3125}@media only screen and (max-width: 600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:hover,html.no-touch .btn-transparent:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:hover,html.no-touch .btn-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);right:auto;left:auto;margin:0;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{position:relative;overflow:visible !important;font-weight:normal !important;cursor:pointer !important;pointer-events:all !important}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size: 54px;border-radius:50%;height:var(--size);width:var(--size);line-height:var(--size)}@media only screen and (max-width: 600px){.btn-circle{--size: 46px}}.btn-circle path{fill:#fff}.btn-disabled{pointer-events:none !important;cursor:default !important;color:#707579 !important;color:var(--secondary-text-color) !important}.btn-disabled:before{color:inherit !important}.btn-secondary:not(:first-child){margin-top:.5rem !important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.animated-close-icon{position:absolute;transform:rotate(-45deg);pointer-events:none}.animated-close-icon,.animated-close-icon:before,.animated-close-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color)}.animated-close-icon:before,.animated-close-icon:after{position:absolute;left:0;top:0;content:\"\"}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:before,body.animation-level-2 .animated-close-icon:after{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}body.animation-level-2 .animated-close-icon.no-transition,body.animation-level-2 .animated-close-icon.no-transition:before,body.animation-level-2 .animated-close-icon.no-transition:after{transition:none}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translateY(-0.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translateY(0.375rem)}.animated-menu-icon{position:absolute}.animated-menu-icon,.animated-menu-icon:before,.animated-menu-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color);transform:rotate(0)}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:before,body.animation-level-2 .animated-menu-icon:after{transition:transform .25s}.animated-menu-icon:before,.animated-menu-icon:after{position:absolute;left:0;content:\"\"}.animated-menu-icon:before{top:-0.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem)}.animated-button-icon>.tgico{position:absolute;height:24px;line-height:24px}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s forwards ease-in-out;animation:hide-icon .4s forwards ease-in-out}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden;-webkit-animation:none !important;animation:none !important}.autocomplete-helper{--border-radius: 10px;position:absolute !important;bottom:calc(100% + .5rem);overflow:hidden;padding:0 !important;border-radius:var(--border-radius) !important;max-width:100%;left:0;width:auto !important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width: 319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal) * 4)}}.autocomplete-peer-helper .scrollable{position:relative;max-height:232px}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{height:3.125rem;display:flex;padding:0 2.125rem 0 .75rem;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{margin-left:.875rem;font-weight:500;flex:0 0 auto}.autocomplete-peer-helper-list-element-description{margin-left:.5625rem;color:#707579;color:var(--secondary-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;font-weight:500;color:#fff;color:var(--badge-text-color);font-size:.875rem;text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;min-width:1.25rem;line-height:1.25rem !important;padding:0 .375rem}.badge-24{height:1.5rem;min-width:1.5rem;line-height:1.5rem !important;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:100%;width:100%;z-index:10000000;background:#000;border-radius:0 !important;display:flex}.ckin__player.ckin__fullscreen video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.ckin__player .time{margin-left:.875rem;font-size:.875rem;color:#fff}@media only screen and (max-width: 600px){.ckin__player .time{margin-left:1.125rem}}.default{position:relative;font-size:0;display:flex;align-items:center;justify-content:center}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;line-height:1;color:#fff;text-align:center;outline:0;padding:0;cursor:pointer;position:absolute;opacity:1;visibility:visible;top:50%;left:50%;transform:translate3d(-50%, -50%, 0) scale(1);font-size:4rem;touch-action:manipulation}body.animation-level-2 .default__button--big{transition:visibility .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1);transition:visibility var(--layer-transition),opacity var(--layer-transition)}@media only screen and (max-width: 600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default__controls{position:absolute;bottom:0;right:0;left:0;text-align:left;direction:ltr;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}.default__controls .progress-line{margin:0 16px;border-radius:var(--border-radius)}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:rgba(255,255,255,.38)}@media only screen and (max-width: 600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{height:49px;padding-top:93px;bottom:0;z-index:2;background-position:bottom;width:100%;position:absolute;background-repeat:repeat-x;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);pointer-events:none}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}@media only screen and (max-width: 600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:\"\"}.default .default__gradient-bottom{transform:translate3d(0, 50px, 0)}.default .default__controls{transform:translate3d(0, 52px, 0)}@media only screen and (max-width: 600px){.default .default__controls{transform:translate3d(0, 65px, 0)}}.default.show-controls .default__gradient-bottom,.default.show-controls .default__controls{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"\"}.default .player-volume{margin:0 .125rem 0 .625rem;display:flex;align-items:center}html.is-touch .default .player-volume{display:none}.default .player-volume__icon{fill:#fff;width:2.25rem;height:2.25rem;margin-right:.5rem;cursor:pointer;padding:.375rem}.default .player-volume .progress-line{--color: #fff;margin:0;width:50px;--thumb-size: 15px}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none !important}video::-webkit-media-controls-enclosure{display:none !important}.progress-line{--color: var(--primary-color);--height: 5px;--border-radius: 6px;--thumb-size: 13px;border-radius:var(--border-radius);height:var(--height);position:relative;cursor:pointer}.progress-line:before{position:absolute;left:0;top:0;right:0;bottom:0;display:block;content:\" \";border-radius:inherit}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;width:100%;cursor:pointer;padding:0;margin:0;outline:none;caret-color:var(--color);position:absolute;top:-0.5rem;bottom:-0.5rem}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;width:0;height:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{content:\" \";display:block;height:var(--thumb-size);width:var(--thumb-size);border-radius:50%;background-color:var(--color);cursor:pointer;position:absolute;right:0;top:50%;transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1.25)}.progress-line__loaded,.progress-line:before{opacity:.3;background-color:#c4c9cc;background-color:var(--secondary-color)}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);position:absolute;top:0;bottom:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{width:100%;transform-origin:left center}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;color:none;border:none}input[type=range]::-ms-thumb{visibility:hidden}input[type=range]::-ms-tooltip{visibility:hidden}.left-controls,.right-controls{display:flex;align-items:center}.bottom-controls{padding:0 .625rem;height:2.25rem;display:flex;justify-content:space-between;align-items:center}@media only screen and (max-width: 600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size: 1.25rem;margin:1.5rem 1.1875rem;display:block;text-align:left;position:relative;cursor:pointer;min-width:var(--size);min-height:var(--size)}body.animation-level-2 .checkbox-field{transition:.2s opacity}.checkbox-field.checkbox-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width: 600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{position:absolute;left:0;top:50%;transform:translateY(-50%);width:var(--size);height:var(--size);border-radius:.25rem;overflow:hidden}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.checkbox-field .checkbox-box-check,.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border{position:absolute;top:0;left:0}.checkbox-field .checkbox-box-border{right:0;bottom:0;border-radius:inherit;border:2px solid #8d969c}.checkbox-field .checkbox-box-background{top:-15%;right:-15%;bottom:-15%;left:-15%;background-color:#3390ec;background-color:var(--primary-color);transform:scale(1);border-radius:50%;transition:transform .2s 0s ease-in-out}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none !important}.checkbox-field .checkbox-box-check{--offset: 3px;width:calc(var(--size) - var(--offset));height:calc(var(--size) - var(--offset));top:50%;left:50%;transform:translate(-50%, -50%)}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s .15s ease-in-out,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none !important}.checkbox-field .checkbox-caption{position:relative;padding-left:3.375rem;cursor:pointer;display:inline-block;min-height:24px;margin-top:1px;line-height:26px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:.2s opacity;color:inherit}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin-left:0;margin-right:0}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{overflow:hidden;border-radius:10px}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size: 1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{top:0;right:0;bottom:0;left:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset: calc(var(--size) - (var(--size) / 2 + .125rem))}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size: 1.375rem;position:relative;text-align:left;margin:1.25rem 0;line-height:1.3125;cursor:pointer}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main::before,.radio-field.hidden-widget .radio-field-main::after{visibility:hidden}.radio-field>input:checked~.radio-field-main::before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main::after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{padding-left:3.5rem;position:relative;color:inherit}.radio-field .radio-field-main::before,.radio-field .radio-field-main::after{content:\"\";display:block;position:absolute;left:0;top:50%;width:var(--size);height:var(--size);transform:translateY(-50%)}.radio-field .radio-field-main::before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main::before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main::after{left:.3125rem;width:.75rem;height:.75rem;border-radius:50%;background:#3390ec;background:var(--primary-color);transform:translateY(-50%) scale(0);transform-origin:center}body.animation-level-2 .radio-field .radio-field-main::after{transition:transform .1s ease}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0;opacity:0;z-index:-1;z-index:var(--z-below);position:absolute}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;visibility:hidden;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transition:transform .2s .05s ease-in-out;transform:scale(0)}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none !important;transition:background-color .2s !important}.checkbox-field-restriction .checkbox-box-check use{visibility:visible !important;stroke-dasharray:24.19,24.19 !important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out !important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{transform:rotate(45deg) translateY(-10px);stroke-dashoffset:35.5}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size: 20px;margin:0 .3125rem;padding:0;display:flex;align-items:center;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset: 3px;--toggle-width: 1.9375rem;width:var(--toggle-width);height:.875rem;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;position:relative;display:flex;align-items:center;margin:0 var(--offset)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{width:1.25rem;height:1.25rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);background-color:#fff;background-color:var(--surface-color);content:\" \";transform:translateX(calc(var(--offset) * -1));border-radius:50%;position:absolute}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width: 600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{width:100%;padding:1rem 0 .5rem;margin-bottom:17px}@media only screen and (max-width: 600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);padding:0 23px;padding-bottom:1rem;font-weight:500;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width: 600px){.chatlist-container .search-group__name{padding:5px 9px 0 16px;font-size:15px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width: 600px){.chatlist-container .search-group-contacts{padding:0px 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0 5px !important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0px;padding:4px 0 0}.chatlist-container .search-super .search-group__name{padding-top:1rem;display:flex;justify-content:space-between}ul.chatlist{padding:0 .5rem}@media only screen and (max-width: 600px){ul.chatlist{padding:0}}.chatlist{margin:0;display:flex;flex-direction:column;position:relative;width:100%;background-color:#fff;background-color:var(--surface-color);-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.chatlist-chat{--background: unset;height:72px;border-radius:10px;display:flex;align-items:flex-start;flex-direction:row;position:relative;cursor:pointer;padding:.5625rem;overflow:hidden;background:var(--background)}@media only screen and (max-width: 600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:hover,html.no-touch .chatlist-chat:active{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{flex:0 0 auto;content:\"\";color:#a2abb2;color:var(--chatlist-pinned-color);font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{margin:0;display:flex;flex-direction:row;align-items:flex-start;height:27px}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background: var(--light-secondary-text-color)}@media only screen and (min-width: 601px){.chatlist-chat.active{--background: var(--primary-color) !important}.chatlist-chat.active .user-caption,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight{color:#fff}.chatlist-chat.active b{color:#fff !important}.chatlist-chat.active .user-title:after{color:rgba(255,255,255,.7)}.chatlist-chat.active .verified-background{fill:#fff !important}.chatlist-chat.active .verified-check{fill:#3390ec !important;fill:var(--primary-color) !important}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff !important;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color: #fff}}.chatlist li span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:27px}.chatlist .peer-typing-container{--color: var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{font-size:.75rem;padding:1px 0px 0px 0px;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block !important;margin-top:4px;margin-right:-3px;margin-left:.5rem;flex:0 0 auto}.chatlist .dialog-subtitle-media{width:1.25rem;height:1.25rem;position:relative;flex:0 0 auto;border-radius:.1875rem;margin-top:-0.1875rem;margin-right:.375rem;display:inline-block;vertical-align:middle}.chatlist .dialog-subtitle-media .tgico-play{position:absolute;z-index:1;color:#fff;left:50%;top:50%;transform:translate(-50%, -50%);line-height:1;font-size:.625rem}.chatlist .dialog-subtitle-media .media-photo{width:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;border-radius:inherit}.chatlist .dialog-group-call-icon{position:absolute;left:45px;top:45px;border:2px solid #fff;border:2px solid var(--surface-color);overflow:hidden;border-radius:50%;background-color:#0ac630;background-color:var(--avatar-online-color);width:20px;height:20px;z-index:2}body.animation-level-2 .chatlist .dialog-subtitle-badge,body.animation-level-2 .chatlist .dialog-group-call-icon{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating,body.animation-level-2 .chatlist .dialog-group-call-icon.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{overflow:hidden;color:#707579;color:var(--secondary-text-color);flex:1 1 auto;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{display:flex !important;align-items:center}.chatlist .user-title img.emoji{vertical-align:top;margin-top:4px;width:18px;height:18px}.chatlist .user-last-message img.emoji{width:20px;height:20px;margin-top:-3px}.chatlist .user-title,.chatlist .user-last-message{flex-grow:1}.chatlist .user-title i,.chatlist .user-last-message i{font-style:normal}.chatlist .message-status{margin-right:.125rem;display:inline-block;vertical-align:middle;color:#0ac630;color:var(--chatlist-status-color);line-height:1;width:1.25rem;height:1.25rem;font-size:1.25rem;position:relative;margin-top:-0.0625rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{position:absolute;top:0;left:0}.chatlist .mention{padding:0;background-color:#0ac630 !important;background-color:var(--chatlist-status-color) !important}html.is-mac .chatlist .mention{line-height:22px !important}.chatlist .mention-badge{margin-right:-2px}.chatlist .unread,.chatlist .is-muted.backwards .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0;margin-top:-0.5rem}.chatlist-new .chatlist-chat{height:4.5rem;padding:0 .75rem;align-items:center}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto !important}.chatlist-new span{line-height:1.3125 !important;line-height:var(--line-height) !important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width: 600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width: 600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-title,.contacts-container b,.contacts-container .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b,.search-group-contacts .user-last-message b{font-weight:normal}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width: 600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.chat-input{--translateY: 0;--padding-bottom: 0.5rem;--bottom: var(--padding-bottom);display:flex;width:100%;max-width:100%;padding-top:.25rem;flex-direction:column;flex:0 0 auto;position:relative;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translate3d(0, var(--translateY), 0)}body.animation-level-0 .chat-input{transition:none !important}@media only screen and (min-height: 570px)and (min-width: 601px){.chat-input{max-width:728px !important;max-width:var(--messages-container-width) !important}}@media only screen and (min-width: 601px){.chat-input{--padding-bottom: 1.25rem}}@media only screen and (max-height: 569px){.chat-input{--padding-bottom: 0.5rem}}@media only screen and (min-width: 1276px){.chat-input{width:calc(100% - var(--right-column-width)) !important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0) !important}}.chat-input.is-hidden{--translateY: 100%;transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, var(--translateY), 0) !important;position:absolute !important;bottom:0}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY: 0}.chat-input .chat-input-container{--padding-horizontal: var(--chat-input-padding);display:flex;align-items:flex-end;justify-content:space-between;max-width:728px;max-width:var(--messages-container-width);margin:0 auto;width:100%;padding:0 var(--padding-horizontal);flex:0 0 auto;position:relative;padding-bottom:var(--bottom)}.chat-input .chat-input-container .btn-circle{width:var(--chat-input-size);height:var(--chat-input-size)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .menu-send{top:auto;bottom:calc(100% + .5rem)}.chat-input .input-message-input{background:none;border:none;width:100%;padding:.5rem .5625rem;margin-top:-1px;max-height:calc(30rem - 2.5rem);overflow-y:none;resize:none;border:none;outline:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height)}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height: 30rem){.chat-input .input-message-input{max-height:max(36px, calc(100vh - 10rem))}}@media only screen and (max-width: 600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{content:attr(data-inline-placeholder);color:#a2acb4;pointer-events:none}.chat-input .toggle-emoticons:before{content:\"\"}html.is-ios .chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\" !important}.chat-input .btn-record-cancel{visibility:hidden;opacity:0;transition:visibility 0s .1s,opacity .1s 0s;padding:0;z-index:3;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal) * -1 + -0.5rem))}body.animation-level-0 .chat-input .btn-record-cancel{transition:none !important}.chat-input .btn-scheduled:after{content:\"\";position:absolute;top:5px;right:5px;width:.5rem;height:.5rem;border-radius:50%;background:#61c642;background:var(--message-checkbox-color)}.chat-input .btn-preloader .preloader{width:1.5rem;height:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s forwards ease-in-out !important;animation:hide-icon .4s forwards ease-in-out !important}.chat-input .float{align-self:center;display:none !important;margin:0 .75rem 0 0 !important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.chat-input .float{margin-right:.125rem !important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex !important}.chat-input .btn-send-container{position:absolute;right:var(--padding-horizontal);bottom:0;padding-bottom:inherit}.chat-input .btn-icon{transition:.2s color,background-color .2s,.2s opacity}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{transition:.2s transform;color:#707579;color:var(--secondary-text-color);z-index:3}.chat-input .btn-send .tgico-send{color:#3390ec !important;color:var(--primary-color) !important}.chat-input .btn-send .tgico-check{color:#3390ec !important;color:var(--primary-color) !important;height:32px !important;font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:bold}.chat-input .btn-send .tgico-schedule{background-color:#3390ec;background-color:var(--primary-color);color:#fff;border-radius:50%;width:34px;height:34px;display:flex;align-items:center;justify-content:center}.chat-input .btn-send.send .tgico-send,.chat-input .btn-send.record .tgico-microphone,.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.schedule .tgico-schedule{visibility:visible !important}.chat-input .btn-send:not(.record) .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}body.animation-level-2 .chat-input .btn-send.send .tgico-send,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone,body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem;background-color:#fff !important;background-color:var(--surface-color) !important}.chat-input .record-time{height:44px;line-height:44px;display:none}.chat-input .record-time:after{content:\" \";width:10px;height:10px;background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;margin:0 9px;display:inline-block}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{border-radius:50%;background-color:rgba(0,0,0,.2);width:240px;height:240px;transform:scale(0);position:absolute;top:-94px;left:-94px;transition:transform .03s ease-in-out,visibility .1s;visibility:hidden}body.animation-level-0 .chat-input .record-ripple{transition:none !important}@media only screen and (max-width: 600px){.chat-input .record-ripple{width:300px;height:300px;top:-124px;left:-124px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon{color:#c6cbce}.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording .btn-record-cancel{opacity:1;visibility:visible;transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording .btn-send,.chat-input.is-recording .btn-record-cancel{pointer-events:all}.chat-input.is-recording .rows-wrapper{width:calc(100% - (var(--chat-input-size) * 2 + 1rem))}.chat-input.is-recording .attach-file{display:none}.chat-input.is-recording .record-time{display:block}.chat-input.is-recording .record-ripple{transition:transform .03s,visibility 0s;visibility:visible}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0px}.chat-input .new-message-wrapper,.chat-input .pinned-container{opacity:1}body.animation-level-2 .chat-input .new-message-wrapper,body.animation-level-2 .chat-input .pinned-container{transition:opacity .1s 0s}.chat-input .pinned-container{width:auto}.chat-input .pinned-container-button{height:2.5rem;padding:0 .625rem}.bubbles.is-selecting~.chat-input .new-message-wrapper{pointer-events:none}.bubbles.is-selecting:not(.backwards)~.chat-input .new-message-wrapper,.bubbles.is-selecting:not(.backwards)~.chat-input .pinned-container{opacity:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting:not(.backwards)~.chat-input .rows-wrapper{max-height:var(--chat-input-size)}.bubbles.is-selecting:not(.backwards)~.chat-input .reply-wrapper{height:0 !important;opacity:0;pointer-events:none}.bubbles.is-selecting:not(.backwards)~.chat-input .btn-send{transform:scale(0)}body.animation-level-2 .bubbles.is-selecting.backwards~.chat-input .new-message-wrapper,body.animation-level-2 .bubbles.is-selecting.backwards~.chat-input .pinned-container{transition:opacity .1s .1s}body.animation-level-2 .bubbles.is-selecting.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}.chat-input .pinned-container{box-shadow:none}@media only screen and (max-width: 600px){.chat-input .pinned-container{font-size:15px}}.chat-input .pinned-container .btn-transparent{justify-content:center}.chat-input .pinned-container .btn-transparent::before{margin-right:10px}.chat-input .pinned-container::before{box-shadow:none}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}#column-center{width:100%;position:relative;flex:3}@media only screen and (max-width: 600px){body.is-left-column-shown #column-center{transform:translate3d(100vw, 0, 0)}body.is-right-column-shown #column-center{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-center{position:fixed !important;left:0;top:0;bottom:0;right:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem, 0, 0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex !important;width:100%;align-items:center;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body.animation-level-0 .chat{transition:none !important}.chat:not(.active):not(:last-child){filter:brightness(0.8)}@media only screen and (min-width: 926px){.chat:not(.active){transform:translate3d(calc((100vw - min(calc(100vw * .4), 420px)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(calc(100vw * .4), 420px)), 0, 0)}}@media only screen and (min-width: 1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)), 0, 0)}}@media only screen and (min-width: 1276px)and (max-width: 1680px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(75vw, 0, 0)}}@media only screen and (max-width: 925px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(100vw, 0, 0)}}.chat-background{overflow:hidden;background-color:#e6ebee}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none !important}.chat-background,.chat-background-item{position:absolute !important;top:0;left:0;bottom:0;right:0}.chat-background-item{background-image:url(\"assets/img/bg.jpeg\");background-size:cover;background-position:center center;background-color:inherit}body.animation-level-2 .chat-background-item{transition:opacity .25s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-out);opacity:0}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in);opacity:1}@media only screen and (min-width: 1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem 0;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out) !important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(0.666666667);transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in) !important}}.chat .drops-container{--padding: 20px;--pinned-floating-height: 0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width: 1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width: 600px){.chat .drops-container{--padding: 10px}}.chat .drop{max-width:696px;--wrapper-padding: 15px}.chat-input-wrapper{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);display:flex;align-items:center;flex-direction:column;width:calc(100% - (var(--chat-input-size) + 0.5rem));max-width:calc(100% - (var(--chat-input-size) + 0.5rem));justify-content:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;border-bottom-right-radius:0;box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);min-height:var(--chat-input-size);max-height:30rem;flex:0 0 auto;position:relative;z-index:3;transition:width .1s}body.animation-level-0 .chat-input-wrapper{transition:none}.selection-wrapper,.fake-selection-wrapper{position:absolute;left:50%;top:0;transform:translateX(-50%);width:28.75rem;max-width:calc(100% - (var(--chat-input-padding) * 2))}.selection-wrapper{border-radius:12px;box-shadow:none;transition:opacity .1s .1s;opacity:0}.selection-wrapper .selection-container{display:flex;justify-content:space-between;height:100%;border-radius:inherit;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:15px;display:flex;justify-content:space-between;align-items:center;width:100%}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);font-weight:500;flex-grow:1;white-space:nowrap;text-transform:capitalize}.selection-wrapper .selection-container .btn-icon{margin:0 5px 0 6px;height:42px;width:42px;line-height:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width: 600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width: 380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-right:.625rem;margin-left:.375rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;z-index:-1;visibility:hidden}.chat-input.type-pinned .rows-wrapper,.chat-input.type-pinned .fake-rows-wrapper{width:auto}.fake-rows-wrapper{position:absolute;left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - (var(--padding-horizontal) * 2) - .5625rem)}.fake-rows-wrapper .pinned-container{padding:0 .5rem}.rows-wrapper{transform:scaleX(1);transition:transform .2s,width .2s,max-height .2s,border-radius .1s}.rows-wrapper.is-centered{margin:0 auto}.rows-wrapper.is-centered~.fake-rows-wrapper{left:50%;transform:translateX(-50%)}.rows-wrapper .bubble-tail{transition:transform .1s}body.animation-level-0 .rows-wrapper .bubble-tail{transition:none}.rows-wrapper.is-centering:not(.backwards),.rows-wrapper.is-centered{border-bottom-right-radius:12px}.rows-wrapper.is-centering:not(.backwards) .bubble-tail,.rows-wrapper.is-centered .bubble-tail{transform:scaleX(-1) translateX(1.125rem)}@media only screen and (max-width: 600px){.rows-wrapper{--padding-vertical: 1px}}@media only screen and (max-width: 420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height: 569px){.rows-wrapper{--padding-vertical: 1px}}.rows-wrapper .bubble-tail{position:absolute;bottom:-1px;right:-8.4px;width:11px;height:20px;fill:#fff;fill:var(--surface-color);transform:scaleX(-1)}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color);background-color:rgba(51, 144, 236, 0.08) !important;background-color:var(--light-primary-color) !important}.rows-wrapper .attach-file .btn-menu{right:calc(var(--padding-horizontal) * -1 - .125rem);bottom:calc(100% + 1.125rem)}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .attach-file .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .attach-file .btn-menu>div{padding:0 38px 0 16px}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{display:flex;justify-content:space-between;align-items:center;width:100%;position:relative;background-color:inherit;border-radius:.75rem;padding:var(--padding)}.rows-wrapper .reply-wrapper{justify-content:flex-start;height:0;width:calc(100% - var(--padding-horizontal) * 2);padding:0;margin-top:.5625rem;margin-bottom:-0.5625rem;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2;opacity:0;pointer-events:none}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .reply-wrapper{margin-top:.3125rem;margin-bottom:-0.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{pointer-events:unset;height:36px;opacity:1}.rows-wrapper .reply-wrapper .reply{order:1;flex:1 1 auto;margin:0 .625rem}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{top:auto;bottom:calc(100% + 1.0625rem);left:3.125rem;transform:scale(1) !important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size: 1.5rem;order:0;margin:0 2rem 0 0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#3390ec;stroke:var(--primary-color)}@media only screen and (max-width: 600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal) * -1)}}.rows-wrapper .new-message-wrapper{align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .input-message-container{width:1%;max-height:inherit;flex:1 1 auto;position:relative;overflow:hidden;align-self:center;min-height:calc(var(--chat-input-size) - var(--padding-vertical) * 2);display:flex;align-items:center}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{flex:0 0 auto;font-size:24px;color:#707579;color:var(--secondary-text-color);margin:0 .125rem 5px;padding:0;width:34px;height:34px}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY: 0;width:100%;flex:1 1 auto;position:relative;transform:translate3d(0, var(--translateY), 0);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles{transition:none !important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);--translateY: -78px}@media only screen and (max-width: 600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY: -58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translateY(calc(var(--translateY) * -1))}.bubbles>.scrollable{height:auto;display:block}@media only screen and (min-width: 1276px){body.is-right-column-shown .bubbles{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0)}}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:scale(1) translateX(2.5rem)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:opacity var(--layer-transition),visibility 0s 0s !important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY: calc(var(--chat-input-size) * -1 + -.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{width:100%;display:flex;flex-direction:column;margin:0 auto;min-height:100%;justify-content:flex-end;padding:0 .8125rem;max-width:728px;max-width:var(--messages-container-width);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translateY(0)}body.animation-level-0 .bubbles-inner{transition:none !important}@media only screen and (min-width: 1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width: 600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width: 600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - calc((2.375rem + .5rem) * -1) * -1) !important;max-width:calc(100% - var(--message-beside-button-margin) * -1) !important}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-inner{margin-bottom:1rem}.bubbles-inner:not(.is-channel) .message,.bubbles-inner.is-chat .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999 !important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY) * -1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden;transform:none !important;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention{--translateY: 0;cursor:default;opacity:0;visibility:hidden;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s !important}.bubbles-corner-button{position:absolute;background-color:#fff;background-color:var(--surface-color);border-radius:50%;color:#707579;color:var(--secondary-text-color);font-size:1.5rem;display:flex;align-items:center;justify-content:center;right:var(--chat-input-padding);bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);z-index:2;overflow:visible}body.animation-level-0 .bubbles-corner-button{transition:none !important}.bubbles-corner-button .badge{position:absolute;top:-0.25rem;right:-0.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width: 600px){.bubbles-corner-button .badge{top:-0.75rem;right:.1875rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height: var(--topbar-call-height)}@media only screen and (min-width: 1276px){body.is-right-column-shown{--topbar-floating-scaleX: calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height: 3.5rem;--pinned-floating-audio-height: 0px;--pinned-floating-message-height: 0px;--pinned-floating-height: calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height: 52px;--pinned-message-height: 52px;width:100%;z-index:1;min-height:var(--topbar-height) !important;max-height:var(--topbar-height) !important;margin-bottom:var(--pinned-floating-height);position:relative;cursor:pointer !important}.topbar:before{content:\" \";position:absolute;height:calc(var(--topbar-height) + var(--pinned-floating-height) - 0px);height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));top:0;right:0;left:0;box-shadow:0px 1px 5px -1px rgba(0,0,0,.21);pointer-events:none}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height: var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height: var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width: 601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width: 926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width: 1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem);display:flex;align-items:center}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .peer-title,.topbar .info{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{top:calc(100% + 7px);max-height:calc(100 * 1vh - 4.375rem);max-height:calc(100 * var(--vh) - 4.375rem)}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem);top:29px}}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;overflow:hidden;padding-left:49px;max-width:calc(100% - var(--utils-width))}@media only screen and (max-width: 600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width: 1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{display:flex;align-items:center;justify-content:space-between;height:3.5rem;max-height:3.5rem;flex:1 1 auto}.topbar .chat-utils{display:flex;align-items:center;flex:0 0 auto}@media only screen and (min-width: 1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width: 600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{width:auto;height:2.25rem;font-weight:400;font-size:.875rem;margin-right:.5rem;padding:0 1.375rem}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;padding-left:1.125rem;max-width:100%;overflow:hidden}.topbar .person{display:flex;align-items:center}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{height:3rem !important;height:var(--topbar-call-height) !important;min-height:auto !important;position:absolute;top:calc(3rem * -1);top:calc(var(--topbar-call-height) * -1);right:0;left:1px;color:#fff;z-index:2;cursor:pointer !important}body:not(.has-chat) .topbar-call-container{background:none !important}@media only screen and (max-width: 925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;width:2.5rem;height:2.5rem;padding:0}.topbar-call-container .peer-title{font-weight:500;white-space:nowrap}@media only screen and (max-width: 480px){.topbar-call-container .topbar-call-left,.topbar-call-container .topbar-call-right{width:auto}.topbar-call-container .group-call-description{display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{display:flex;align-items:center}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-center{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}@media only screen and (min-width: 1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width) * -.5), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width: 1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{position:absolute;top:0;right:0;bottom:-1.125rem;left:0;z-index:-1;transform:scale(1, -1);transform:scale(var(--topbar-floating-scaleX), -1);transform-origin:left center;pointer-events:none}@media only screen and (min-width: 1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{width:100%;height:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubble{position:relative;z-index:1;margin:0 auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-wrap:wrap}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);position:absolute;top:50%;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);transform:translateY(-50%);color:#fff;border-radius:50%;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);opacity:0;display:flex;align-items:center;justify-content:center;transform:translateY(-50%) scale(0.6);visibility:hidden}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem !important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{visibility:visible;transform:translateY(-50%) scale(1)}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{position:absolute;left:-50%;top:-0.125rem;bottom:-0.125rem;content:\" \";z-index:-1}.bubble.is-highlighted:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width: 600px){.bubble.is-first-unread{max-width:unset}}.bubble.is-first-unread:before{content:\"Unread messages\";height:30px;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;text-align:center;color:#3390ec;color:var(--primary-color);line-height:2.1;font-weight:500;font-size:15px;background-color:#fff;background-color:var(--surface-color);z-index:2;position:relative}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(0.125rem + 30px)}.bubble.is-selected:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{width:200%;display:block}.bubble.is-multiple-documents:before,.bubble.is-multiple-documents:after{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0 !important}.bubble-select-checkbox{z-index:3;position:absolute;left:0;display:flex;margin:0}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none !important}.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video,.bubbles.is-selecting .bubble a{pointer-events:none}.bubble-content{min-width:56px;max-width:100%;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);position:relative;display:flex;flex-direction:column-reverse;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-color:var(--message-background-color)}body.animation-level-0 .bubble-content{transition:none}html.no-touch .bubbles:not(.is-selecting) .bubble-content,html.is-touch body:not(.no-select) .bubbles.is-selecting .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{margin:0 auto;max-width:100%;box-shadow:none}.bubble.is-date{position:sticky;top:.25rem;padding-bottom:.25rem;z-index:2;transition:opacity .3s ease;opacity:.99999;pointer-events:none}.bubble.is-date:before,.bubble.is-date:after{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubble-beside-button{position:absolute;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);bottom:0;width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);font-size:1.5rem;align-items:center;display:flex;justify-content:center;color:#fff;color:var(--badge-text-color);border-radius:50%;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color);cursor:pointer}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}html.no-touch .bubble:hover .bubble-beside-button,html.no-touch .bubble:active .bubble-beside-button{opacity:1}.bubble .forward svg{width:22px;height:22px}.bubble.is-group-last{margin-bottom:0.5rem}.bubble.is-group-last:after{bottom:-0.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-0.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0 !important}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width: 600px){.bubble.webpage .document{padding-left:44px}}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;width:18px;vertical-align:bottom}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{padding-top:.5rem;padding-bottom:1.5rem;max-height:-webkit-fit-content !important;max-height:-moz-fit-content !important;max-height:fit-content !important;cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big.sticker .bubble-content{max-width:140px !important;max-height:140px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none !important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.bubble.sticker .attachment{border-radius:0;z-index:1}.bubble.sticker .bubble-content{max-width:200px !important;max-height:200px !important}.bubble.round .attachment{max-width:280px !important;max-width:var(--round-video-size) !important;max-height:280px !important;max-height:var(--round-video-size) !important;width:280px !important;width:var(--round-video-size) !important;height:280px !important;height:var(--round-video-size) !important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{max-width:100%;border-radius:inherit;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;position:relative;cursor:pointer}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{position:absolute;left:0;top:0;height:100%;width:100%;cursor:pointer;display:flex;justify-content:center;align-items:center}.bubble .attachment .download span{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);font-size:23px;color:#fff;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{position:relative;margin:0 auto;z-index:1}.bubble .media-container-fitted{background-color:transparent !important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-width:min(420px, 100%);max-height:min(340px, 100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-width:min(451px, 100%);max-height:none}.bubble .album-item{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);max-width:100%;cursor:pointer;position:absolute;overflow:hidden}body.animation-level-0 .bubble .album-item{transition:none !important}.bubble .album-item img,.bubble .album-item video{border-radius:inherit}.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none !important}.bubble .album-item .bubble-select-checkbox{bottom:auto !important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4, .0, .2, 1),border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transition:transform .3s cubic-bezier(.4, .0, .2, 1),border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in);transform:scale(0.883333)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:hover,html.no-touch .bubble a:active{text-decoration:underline}.bubble-first{order:-1;margin-top:.5rem;justify-content:center;align-items:center;max-width:100%}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column;align-items:flex-start !important;padding:.75rem 1rem .875rem !important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-size:1rem !important}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{margin-right:.25rem;font-size:1.25rem;vertical-align:bottom;margin-left:-0.1875rem}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubble-first.empty-bubble-placeholder:not(:first-child:last-child) .bubble-content-wrapper{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0;pointer-events:none}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem !important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem !important;position:relative;width:200px;height:200px;cursor:pointer}.bubble-first .time{display:none !important}.bubble-first:before,.bubble-first:after{display:none}.bubble .web{margin:.125rem 0 -0.5625rem;max-width:100%;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.bubble .web .preview{max-width:min(420px, 100%);max-height:min(340px, 100%);border-radius:4px;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;position:relative;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title{font-weight:500 !important}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .webpage-name{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);font-weight:500 !important;text-decoration:none}html.no-touch .bubble .web .webpage-name:hover,html.no-touch .bubble .web .webpage-name:active{text-decoration:underline}.bubble .web .text{word-break:break-word;margin-top:1px;font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble .web .quote{max-width:100%;overflow:hidden;width:100%;display:flex}.bubble .web .quote-text{width:100%;max-width:100%;padding-left:.625rem;margin-left:-0.625rem}.bubble .web .quote:before{flex:0 0 auto;width:.125rem;border-radius:.125rem;background-color:#3390ec;background-color:var(--primary-color);margin:.1875rem .5rem .125rem 0;content:\" \"}.bubble .web,.bubble .reply{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{margin:0;width:3rem;height:3rem;float:right;margin-left:.625rem;margin-top:.1875rem}.bubble.is-square-photo .web .preview{max-width:min(3rem, 100%);max-height:min(3rem, 100%);margin:0}.bubble .reply{padding:.25rem;margin:0 .25rem .375rem .375rem;cursor:pointer;border-radius:.25rem;min-width:10rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{position:absolute;max-width:calc(100% - 1.25rem);height:auto;min-height:32px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.bubble .message+.reply{margin-bottom:0}.bubble.just-media .reply,.bubble.just-media .name{padding:10px;border-radius:12px;position:absolute;top:0;margin-bottom:0;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);white-space:nowrap;max-width:15rem}@media only screen and (max-width: 600px){.bubble.just-media .reply,.bubble.just-media .name{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff !important;padding:.3125rem .625rem;line-height:1.3125;line-height:var(--line-height)}.bubble.just-media .name .peer-title{font-weight:400 !important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width: 600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;position:relative;max-width:none !important}.bubble.just-media .reply-title,.bubble.just-media .reply-subtitle,.bubble.just-media .reply i{color:#fff !important}.bubble.just-media .reply-border{background:#fff}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{font-size:16px;font-size:var(--messages-text-size);padding:0 .5rem .375rem .625rem;max-width:100%;color:#000;color:var(--primary-text-color);line-height:1.3125;word-break:break-word;white-space:pre-wrap;position:relative}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width: 600px){.bubble .document-ico,.bubble .document-download,.bubble .audio-ico,.bubble .audio-download{height:2.25rem;width:2.25rem}}.bubble .audio .audio-title{font-weight:500}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width: 600px){.bubble .audio{height:2.375rem;padding-left:calc(2.375rem + .5625rem)}.bubble .audio .audio-details{margin-top:2px;margin-bottom:0}.bubble .audio .audio-subtitle{margin-top:-1px}.bubble .audio.corner-download .audio-download{margin:1.375rem 1.375rem 0}}.bubble .message.audio-message{width:335px;max-width:min(100%, 335px) !important}@media only screen and (max-width: 600px){.bubble .message.audio-message{width:280px;max-width:min(100%, 300px) !important}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px !important}.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{display:flex;padding:2px 0;cursor:pointer}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{padding-left:12px;margin-top:8px;display:flex;flex-direction:column}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500}.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{padding-left:66px;height:58px}@media only screen and (max-width: 600px){.bubble .message.document-message .document{padding-left:44px;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 0px 0px 0px}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-container .time.tgico{position:relative !important;height:0px !important;visibility:hidden !important;float:none}.bubble .document-container .time.tgico .inner{visibility:hidden !important}.bubble.is-multiple-documents .message{padding:0 !important;border-radius:inherit}.bubble.is-multiple-documents .document-container{position:relative;border-radius:inherit}.bubble.is-multiple-documents .document-container .document-selection{position:absolute;top:0;bottom:0;z-index:-1;width:200vw;left:-75vw}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.06);border-radius:inherit}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{left:2rem;top:2rem;background:#fff;border-radius:50%}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size: 1.125rem;left:20px;top:25px}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size: .125rem;content:\" \";position:absolute;width:calc(var(--size) - (var(--inner-size) * 2));height:calc(var(--size) - (var(--inner-size) * 2));left:var(--inner-size);top:var(--inner-size);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-0.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{padding-top:.5rem;border-top-left-radius:inherit;border-top-right-radius:inherit}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-0.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{padding-bottom:.5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-0.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-0.25rem}.bubble.is-multiple-documents .document{height:54px !important}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document{height:38px !important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{padding:0 0 .25rem 0;margin-top:-0.1875rem}.bubble .message.document-message .time,.bubble .message.audio-message .time,.bubble .message.voice-message .time,.bubble .message.poll-message .time,.bubble .message.contact-message .time{position:absolute;right:0;bottom:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{position:absolute;bottom:.1875rem;right:.1875rem;border-radius:.75rem;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0 .3125rem;z-index:2}.bubble.is-message-empty .message .time{margin-left:0;display:flex;align-items:center;padding:0;margin:0;white-space:nowrap;height:18px}.bubble.is-message-empty .message .time .inner{right:unset;bottom:unset;color:#fff;margin:inherit}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message,.bubble.is-message-empty.emoji-big .message{bottom:0}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{visibility:hidden;font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1;vertical-align:middle;pointer-events:none;display:inline-flex;z-index:1;height:12px;direction:ltr;float:right;cursor:pointer}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{margin-left:2px;pointer-events:none}.bubble .time i.edited{overflow:visible;font-size:inherit}.bubble .time .inner{pointer-events:all;position:absolute;bottom:0;right:0;display:flex;align-items:center;line-height:1;padding:inherit;white-space:nowrap;height:12px;visibility:visible}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-time,.bubble .video-play{pointer-events:none}.bubble .video-time{position:absolute;top:3px;left:3px;border-radius:12px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 6px;z-index:2;font-size:12px;color:#fff;display:flex;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:1.125rem;line-height:1}.bubble .video-time.can-autoplay:after{content:\"\";padding:0 1px 0 3px;font-size:1.25rem;color:#fff}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);color:#fff;text-align:center;font-size:2.125rem;display:flex;align-items:center;justify-content:center;z-index:1}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{padding:5px 9px 0 9px;font-weight:500 !important;color:#3390ec;color:var(--primary-color);font-size:.9rem;max-width:100%;overflow:hidden;text-overflow:ellipsis}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{position:absolute;width:11px;height:20px;z-index:-2;display:block;fill:#fff;fill:var(--message-background-color);transform:translateY(1px)}.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{cursor:pointer;border-radius:inherit}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.bubble .replies .rp{width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden;border-radius:inherit;cursor:pointer}.bubble .replies-beside{flex-direction:column;width:36px;min-height:36px;height:auto;max-height:52px;bottom:47px;border-radius:2rem;right:-44px;padding:5.5px 0}.bubble .replies-beside .tgico-commentssticker{font-size:23px}.bubble .replies-beside-text{font-size:.75rem}.bubble .replies-footer{height:50px;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);position:relative;display:flex;align-items:center;padding:0 .5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:#3390ec;color:var(--primary-color);min-width:15rem}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.4375rem}.bubble .replies-footer-text{font-weight:500;font-size:15px;margin-left:9px;display:flex;align-items:center;color:#3390ec;color:var(--primary-color)}.bubble .replies-footer-avatars{display:flex;flex-direction:row-reverse}.bubble .replies-footer-avatars avatar-element{width:34px;height:34px;border:2px solid #fff;border:2px solid var(--surface-color);cursor:pointer;z-index:0}.bubble .replies-footer-avatars avatar-element:not(:first-child){margin-right:-14px}.bubble .replies-footer .tgico-next{position:absolute;right:4px}.bubble .replies-footer.is-unread .replies-footer-text:after{content:\" \";background-color:#3390ec;background-color:var(--primary-color);width:.5rem;height:.5rem;margin-left:.75rem;border-radius:50%}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.bubble-content-wrapper{transform:scale(1) translateX(0);transform-origin:center;opacity:1}body.animation-level-2 .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)}.bubbles-inner.zoom-fading .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0}@media only screen and (min-width: 601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width: 600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble-content-wrapper>.user-avatar{position:absolute;margin-left:-45px;bottom:0;cursor:pointer}.bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transform:scale3d(1, 1, 1);transform-origin:bottom;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transition:none}.bubbles.is-selecting:not(.backwards) .bubble-content-wrapper>.user-avatar{transform:scale3d(0.76, 0.76, 1);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{color:#fff;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);font-size:.9375rem;padding:.28125rem .625rem;line-height:1.25rem;border-radius:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;text-align:center;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg a:hover,.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover{text-decoration:underline;cursor:pointer}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 10px)}@media only screen and (max-width: 600px){.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .contact-number,.bubble.is-in .audio-time{color:#707579 !important;color:var(--secondary-text-color) !important}.bubble.is-out{flex-direction:row-reverse;--message-background-color: var(--message-out-background-color);--light-message-background-color: var(--light-message-out-background-color);--dark-message-background-color: var(--dark-message-out-background-color);--link-color: var(--message-out-link-color)}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width: 1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .reply,.bubble.is-out.just-media .name{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out:not(.just-media) .reply-title,.bubble.is-out:not(.just-media) .reply i{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{padding-right:5px;margin-left:-4px}.bubble.is-out .time .inner{color:#4fae4e;color:var(--message-out-status-color);bottom:4px}.bubble.is-out .time:after,.bubble.is-out .time .inner:after{font-size:19px;margin-left:1px;line-height:16px;color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time:after,.bubble.is-out.is-read .time .inner:after{content:\"\"}.bubble.is-out.is-sent .time:after,.bubble.is-out.is-sent .time .inner:after{content:\"\"}.bubble.is-out.is-sending .time:after,.bubble.is-out.is-sending .time .inner:after{content:\"\"}.bubble.is-out .document-ico:after{border-top-color:#fff;border-top-color:var(--message-background-color);border-right-color:#fff;border-right-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e !important;fill:var(--message-out-primary-color) !important}.bubble.is-out .audio-time,.bubble.is-out .audio-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-toggle,.bubble.is-out .audio-download,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.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 .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color: var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color: var(--message-background-color)}.bubble.is-out .bubble-beside-button{right:auto;left:calc((2.375rem + .5rem) * -1);left:var(--message-beside-button-margin)}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.reply-markup{width:100%}.reply-markup-row{margin-top:.3125rem;overflow:hidden;min-height:2.5rem;display:flex}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{padding:.5625rem 0;border-radius:6px;z-index:2;font-size:.875rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;color:#fff !important;outline:none;border:none;width:100%;cursor:pointer;position:relative;overflow:hidden;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.reply-markup-button.anchor-url{text-decoration:none !important}.reply-markup-button:after{content:\" \";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;opacity:0;z-index:-1;background-color:#fff}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:hover:after,html.no-touch .reply-markup-button:active:after{opacity:0.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button.tgico:before,.reply-markup-button .forward-icon{position:absolute;right:.125rem;top:.125rem;display:block}.reply-markup-button.is-link:before{content:\"\";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:\"\"}.pinned-message-border{position:relative;height:2rem;width:.125rem;flex:0 0 auto}.pinned-message-border-wrapper-1{position:relative;top:50%;transform:translateY(-50%);height:2rem;width:.125rem;border-radius:1px;background:#3390ec;background:var(--primary-color)}.pinned-message-border-mask{--mask-height: .375rem;--height: 2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:before,.pinned-message-border-mask:after{position:absolute;left:0;right:0;content:\" \";display:block;z-index:1;height:var(--mask-height);opacity:0}body.animation-level-2 .pinned-message-border-mask:before,body.animation-level-2 .pinned-message-border-mask:after{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{top:0;background:linear-gradient(#fff, transparent);background:linear-gradient(var(--surface-color), transparent)}.pinned-message-border-mask:after{bottom:0;background:linear-gradient(transparent, #fff);background:linear-gradient(transparent, var(--surface-color))}.pinned-message-border-mask.mask-top:before,.pinned-message-border-mask.mask-bottom:after{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{position:absolute;content:\" \";left:0;top:0;right:0;bottom:0;display:block;background:#3390ec;background:var(--primary-color);opacity:.4}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{position:absolute;left:0;top:0;width:2px;background:currentColor;border-radius:1px}body:not(.animation-level-0) .pinned-message-border-wrapper,body:not(.animation-level-0) .pinned-message-border-mark{will-change:transform;transition:transform .25s ease-in-out}.pinned-message-content{--height: 32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{cursor:pointer;display:flex;align-items:center;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;overflow:hidden;pointer-events:none;position:relative;margin-left:.5rem}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-title,.pinned-message-subtitle,.reply-title,.reply-subtitle{font-size:14px;line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-message-media,.reply-media{height:2rem !important;width:2rem !important;overflow:hidden;position:absolute;left:0;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.pinned-message i,.reply i{font-style:normal;color:#707579;color:var(--secondary-text-color)}.pinned-message img.emoji,.reply img.emoji{height:1rem;width:1rem;vertical-align:top}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{height:2rem;border-radius:1px;min-width:2px;background:#3390ec;background:var(--primary-color)}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0 !important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500}.pinned-container{--container-height: 3.25rem;display:flex;justify-content:space-between;align-items:center;flex:0 0 auto;overflow:visible;cursor:pointer}.pinned-container.is-floating{position:absolute !important;top:var(--topbar-height);right:0;left:0;margin:0;width:auto;height:var(--container-height);max-height:var(--container-height);background-color:#fff !important;background-color:var(--surface-color) !important}.pinned-container.is-floating .pinned-container-wrapper{order:0;padding:0 1rem;height:100%;border-radius:0;z-index:0;max-width:100%}@media only screen and (max-width: 600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width: 1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{content:\" \";border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);position:absolute;top:0;right:0;bottom:0;left:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;position:relative;pointer-events:none}.pinned-container .btn-icon{font-size:1.5rem;display:flex;justify-content:center;flex:0 0 auto}.pinned-container-wrapper{display:flex;flex:1 1 auto;overflow:hidden;align-items:center;padding:.25rem;border-radius:.25rem;order:1}.pinned-container-wrapper-utils{flex:0 0 auto;display:flex;align-items:center;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible !important}.pinned-message-media-container{width:2rem;height:2rem;position:absolute;margin-left:-0.25rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title,.pinned-message-subtitle{transform:translateX(0)}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height: var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-title,.pinned-message-content .pinned-message-subtitle{position:relative;height:calc(var(--height) / 2);min-height:calc(var(--height) / 2);overflow:visible}body.animation-level-2 .pinned-message-content .pinned-message-title,body.animation-level-2 .pinned-message-content .pinned-message-subtitle{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-top:-0.125rem;margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:.875rem;line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:\"#\"}.pinned-message .animated-counter.is-last:not(.backwards){transform:scale(0.68);opacity:0}.pinned-message .animated-super-row{--translateY: 16px}.pinned-message .pinned-message-media{--translateY: 32px}.pinned-message.hide~.tgico-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message.is-many .pinned-message-close{display:none}.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist{display:none}.pinned-message.is-many.is-floating .pinned-message-close{display:none}.pinned-message:not(.is-many) .pinned-message-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none !important}.pinned-audio{--progress-height: .25rem}.pinned-audio.is-floating{--container-height: var(--pinned-audio-height)}.pinned-audio:not(.is-floating){padding-right:1.75rem;max-width:210px;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible !important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0 !important}.pinned-audio-ico:before{content:\"\"}.pinned-audio-ico.flip-icon:before{content:\"\"}.pinned-audio-title{font-weight:500}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-title,.pinned-audio-subtitle{font-size:.875rem;line-height:1.3125;line-height:var(--line-height);width:100%;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius: 0;--height: var(--progress-height);--translateY: .125rem;position:absolute;right:0;bottom:0;left:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width: 1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:hover,html.no-touch .pinned-audio-progress:active{--translateY: 0}.pinned-audio-progress .progress-line__filled:after{display:none !important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{position:absolute;height:.5rem;right:0;bottom:0;left:0;overflow:hidden}.pinned-audio-volume{align-items:center;position:relative;width:2.5rem;height:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{position:absolute;top:100%;left:0;right:0;bottom:-1rem;content:\" \"}.pinned-audio-volume .player-volume__icon{fill:#707579;fill:var(--secondary-text-color);width:inherit;height:inherit;cursor:pointer}.pinned-audio-volume.active .player-volume__icon{fill:#3390ec;fill:var(--primary-color)}.pinned-audio-volume .progress-line-container{position:absolute;top:100%;width:5rem;padding:.75rem 1rem;margin-top:2.25rem;transform:rotate(270deg);border-radius:10px;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 5px 0px rgba(0,0,0,.15);opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility 0s .2s}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none !important}.pinned-audio-volume:hover .progress-line-container,.pinned-audio-volume:active .progress-line-container{opacity:1;visibility:visible;transition:opacity .2s ease-in-out,visibility 0s 0s}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;transform:translateZ(0);opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),transform .2s cubic-bezier(.4, .0, .2, 1),width .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);position:fixed;top:0;right:0;bottom:0;left:0;height:44px;width:218px;overflow:hidden;z-index:1;display:flex;justify-content:flex-start}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{position:absolute;left:0;top:0;display:flex;align-items:center;justify-content:flex-start;width:638px;height:100%;transform:translateX(0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:100%}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{display:flex;align-items:center;justify-content:space-between;padding:7px;flex:0 0 auto;max-width:100%}.markup-tooltip-tools:first-child{width:218px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{width:1px;height:25px;background-color:#dfe1e5;background-color:var(--border-color)}.markup-tooltip .btn-icon{border-radius:8px !important;width:30px;height:30px;padding:0}.markup-tooltip .btn-icon.active{color:#fff !important;background-color:#3390ec !important;background-color:var(--primary-color) !important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-218px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{display:flex;align-items:center;opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition);pointer-events:none}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;text-overflow:ellipsis;margin:0 .5rem}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{position:relative;max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem}.stickers-helper-stickers{max-width:100%;border-radius:var(--border-radius)}html.no-touch .stickers-helper .super-sticker:not(.active):hover,html.no-touch .stickers-helper .super-sticker:not(.active):active{background:none}.emoji-helper{height:50px;padding:.25rem 0 !important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:before,.emoji-helper .super-emojis:after{display:inline-block;content:\" \";width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):hover,html.no-touch .emoji-helper .super-emoji:not(.active):active{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec !important;background-color:var(--primary-color) !important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem, 100%)}.inline-helper .scrollable{position:relative;max-height:232px}.inline-helper-separator{height:1px;width:100%;margin-left:4rem;background-color:#dfe1e5;background-color:var(--border-color)}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:unset}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;padding:.5rem .5rem .5rem 4rem;line-height:1.3125;line-height:var(--line-height)}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{position:absolute;left:.5rem;width:3rem !important;height:3rem !important;overflow:hidden}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{color:#fff;text-transform:uppercase;font-size:1.75rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;display:flex;align-items:center;justify-content:center}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-video,.inline-helper .media-poster{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.inline-helper .gif{position:absolute;top:0;right:0;bottom:0;left:0;width:auto !important;height:auto !important}.inline-helper-results.is-gallery{max-width:100%;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill, minmax(80px, 1fr));grid-template-columns:repeat(auto-fill, minmax(var(--esg-sticker-size), 1fr));grid-gap:1px}.inline-helper-results.is-gallery .inline-helper-result{width:auto !important;height:auto !important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.inline-helper-result-description{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden;white-space:pre-wrap}.chat-search{position:absolute !important;top:0;z-index:2}.chat-search-footer{height:46px;padding:0 8px;flex:0 0 auto;width:100%;background-color:#fff;background-color:var(--surface-color);display:flex;justify-content:space-between;align-items:center;box-shadow:0px -1px 5px -1px rgba(0,0,0,.21);overflow:hidden}.chat-search-footer .chat-search-count{margin-left:8px;color:#707579;color:var(--secondary-text-color)}.chat-search-footer+.chat-input{display:none}.chat-search-count:empty{display:none}.chat-search-count:not(:empty)+.btn-icon{display:none}.chat-search-controls{display:flex}.chat-search-results{width:100%;height:100%;max-height:100%;overflow:hidden;position:absolute;top:0;left:0;visibility:hidden;opacity:0;background-color:#fff;background-color:var(--surface-color);transition:.2s ease}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding: 0px;position:absolute !important;z-index:3;top:var(--padding);right:var(--padding);bottom:var(--padding);left:var(--padding);display:flex;flex-direction:column;justify-content:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto !important}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding: -4px;background-color:#fff;background-color:var(--surface-color);position:relative;border-radius:12px;width:100%;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#a2acb4;transition:color .2s ease-in-out;pointer-events:all;flex:1 1 auto}.drop-outline-wrapper{position:absolute;top:var(--wrapper-padding);right:var(--wrapper-padding);bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;transition:stroke .2s ease-in-out;stroke-dashoffset:0}.drop.is-dragover .drop-outline-path{-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite;stroke:#3390ec;stroke:var(--primary-color)}.drop-icon{font-size:6rem}.drop-header{font-weight:500;font-size:1.25rem}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height: 670px){.drop-icon{font-size:0}.drop-header{margin-top:0px}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{width:auto;height:auto;display:block;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center}.crop-image{display:block;position:relative;pointer-events:none}.crop-component{position:relative;z-index:999;background-color:#fff;margin:0 auto;overflow:hidden}.crop-component>img{max-width:100%}.crop-overlay{position:absolute;z-index:999;overflow:hidden;box-sizing:content-box;border-radius:50%}html.no-touch .crop-overlay:hover,.crop-overlay:active{cursor:move}.crop-overlay-image{position:absolute;display:block}.crop-overlay-color{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,.7);border-radius:8px}.sidebar-header{background-color:#fff;background-color:var(--surface-color);display:flex;align-items:center;justify-content:space-between;padding:0 1rem;min-height:3.5rem;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width: 600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{flex:1;font-weight:500;padding-left:1.5rem;font-size:1.25rem;color:#000;color:var(--primary-text-color)}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{overflow:inherit !important;width:2.5rem;height:2.5rem}.sidebar-content{width:100%;max-height:100%;height:100%;overflow:hidden;display:flex;position:relative;flex:1 1 auto}.profile-avatars-container{width:100%;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.no-touch .profile-avatars-container:hover .profile-avatars-arrow,html.no-touch .profile-avatars-container:active .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0 !important}.profile-avatars-avatars{width:100%;height:100%;display:flex;flex-wrap:nowrap;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;position:absolute}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0, 0)}.profile-avatars-avatars:before{content:\" \";top:0;right:0;bottom:0;left:0}.profile-avatars-avatar{width:inherit;height:inherit;min-width:100%;min-height:100%;display:flex;background-color:#000;position:relative}.profile-avatars-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none}.profile-avatars-gradient{position:absolute;left:0;right:0;bottom:0;height:80px;background:linear-gradient(360deg, rgba(0, 0, 0, 0.3) 8.98%, rgba(0, 0, 0, 0) 100%)}.profile-avatars-info{position:absolute;bottom:0;display:flex;flex-direction:column;align-items:flex-start;left:1.5rem;bottom:.5625rem;pointer-events:none}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color: #fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit !important}.profile-avatars-tabs{display:flex;position:absolute;top:.5rem;left:.375rem;right:.375rem;height:.125rem;pointer-events:none}.profile-avatars-tab{flex:1 1 auto;border-radius:4px;margin:0 .125rem;background-color:#fff;opacity:.2;transition:opacity .2s ease-in-out;height:inherit}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{position:absolute;top:0;left:0;bottom:0;width:calc(100% / 3);opacity:0}.profile-avatars-arrow:before{position:absolute;top:50%;transform:translateY(-50%);font-size:2.1875rem;color:#fff;left:.625rem}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active{opacity:1 !important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{flex:0 0 auto;display:flex;flex-direction:column;position:relative;width:100%}.profile-content-wrapper{flex:1 1 auto;display:flex;flex-direction:column;padding-bottom:13px}@media only screen and (min-width: 601px){.profile-content-wrapper{padding-top:15px}}.profile-content .sidebar-left-section{position:relative;background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{text-align:center;font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);font-weight:500;overflow:hidden;max-width:21.25rem;margin:0 auto;color:#000;color:var(--primary-text-color);display:flex;align-items:flex-end}.profile-name span.emoji{vertical-align:inherit;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.profile-name .peer-title{word-break:break-word;text-overflow:ellipsis;overflow:hidden}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-subtitle{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px}@media only screen and (max-width: 600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{margin:.5rem auto 10px;display:block}@media only screen and (max-width: 600px){.profile-avatar{margin:0 auto 10px;--size: 100px;--multiplier: .54}}.profile-name,.profile-subtitle,.profile-avatar{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size: 3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{content:\" \";position:absolute;height:1px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;left:0;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size: var(--scrollable-size, 3.5rem);width:100%;display:flex;justify-content:space-around;align-items:center;flex-direction:row;position:relative;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#707579;color:var(--secondary-text-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.menu-horizontal-div-item{height:var(--size);padding:0 1rem;cursor:pointer;text-align:center;flex:1 1 auto;font-size:1rem;font-weight:500;position:relative;transition:none !important;display:flex;align-items:center;justify-content:center;line-height:1.3125;line-height:var(--line-height);border-radius:0}html.no-touch .menu-horizontal-div-item:hover,html.no-touch .menu-horizontal-div-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .menu-horizontal-div-item.active:hover,html.no-touch .menu-horizontal-div-item.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{position:relative;display:inline-flex;align-items:center;overflow:visible}.menu-horizontal-div i{position:absolute;bottom:calc(-.625rem - 7px);left:0;opacity:0;background-color:#3390ec;background-color:var(--primary-color);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:content-box;transform-origin:left;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{min-width:100%;width:100%;display:grid;grid-template-columns:100%;grid-template-rows:100%}.tabs-container .tabs-tab{display:none;flex-direction:column;grid-row-start:1;grid-column-start:1;background-color:#fff;background-color:var(--background-color);overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none !important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4, .0, .2, 1),filter .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4, .0, .2, 1),filter .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex-direction:column;flex:1 1 auto;min-width:18rem;max-width:calc(1680px / 4)}@media only screen and (max-width: 600px){#column-left{width:100%;max-width:100%}body:not(.is-left-column-shown) #column-left{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px){#column-left{overflow:visible}#column-left:after{position:absolute;content:\" \";display:block;height:100vh;width:1px;background-color:#dfe1e5;background-color:var(--border-color);right:-1px;top:0;z-index:2}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-left{display:flex;position:fixed;left:0;top:0;width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:unset}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width: 926px){#column-left{display:flex}}@media only screen and (max-width: 1275px){#column-left{flex:2}}@media only screen and (min-width: 1681px){html.is-safari #column-left{max-width:calc(1680px / 4 - 1.25px)}}#column-left .item-main{--menu-size: 3rem}#column-left .menu-horizontal-scrollable{--scrollable-size: var(--menu-size);z-index:1;background-color:#fff;background-color:var(--surface-color);position:relative;top:unset}@media only screen and (max-width: 600px){#column-left .menu-horizontal-scrollable{box-shadow:0px 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .menu-horizontal-div{position:relative !important;justify-content:flex-start;z-index:0}#column-left .menu-horizontal-scrollable .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem;border-top-left-radius:6px;border-top-right-radius:6px}#column-left .menu-horizontal-scrollable .menu-horizontal-div-item>span{overflow:visible}#column-left .menu-horizontal-scrollable .menu-horizontal-div-item>span i{bottom:calc(-.6875rem - 2px)}#column-left .menu-horizontal-scrollable .menu-horizontal-div__stripe{display:none}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .folders-tabs-scrollable .menu-horizontal-div-item:first-child{margin-left:.6875rem}@media only screen and (max-width: 600px){#column-left .folders-tabs-scrollable .menu-horizontal-div-item:first-child{margin-left:.1875rem}}#column-left .item-main .input-search .selector-user{height:30px;position:absolute !important;left:6px;top:6px;z-index:1;margin-left:0;line-height:1.875rem}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block !important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width: 600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{margin-top:7px;font-size:14px}html.no-touch #column-left .item-main .search-helper .selector-user:hover,html.no-touch #column-left .item-main .search-helper .selector-user:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none !important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative !important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto !important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%, -50%)}#column-left #chatlist-container{max-height:100%;overflow:hidden;position:relative;background-color:#fff;background-color:var(--surface-color)}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{position:relative;width:2.5rem;height:2.5rem;flex:0 0 auto;display:flex;align-items:center;justify-content:center}#column-left .sidebar-header__btn-container>.btn-icon{visibility:hidden;opacity:0;position:absolute;top:0;right:0;bottom:0;left:0;transition:.2s opacity,.15s background-color;z-index:2;margin:0}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width: 600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-0.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{width:300px;max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem)}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width: 600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:1rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;padding-left:4px;margin-top:-1px;padding-bottom:1px}#column-left .search-group-people .chatlist-chat{height:98px;border-radius:10px;max-width:78px;width:78px;align-items:center;display:flex;flex-direction:column;padding:12px 0 0 !important;margin:0 5px 0 0;flex:0 0 auto}@media only screen and (max-width: 600px){#column-left .search-group-people .chatlist-chat{width:77px;max-width:77px}}#column-left .search-group-people .dialog-title-details,#column-left .search-group-people .dialog-subtitle{display:none}#column-left .search-group-people .user-caption{max-width:65px;padding:2px 0px 9px;font-size:12px}@media only screen and (max-width: 600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width: 600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{visibility:visible !important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-width: 600px){#column-left .item-main .sidebar-content .btn-corner{--size: 54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{width:100%;padding:0 .5rem .5rem;overflow:hidden;flex:0 0 auto}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(64px)}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px)}#column-left .connection-status-button{color:#2e3939;align-self:center;cursor:default;padding-left:4.5rem;text-align:left;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{cursor:pointer;text-decoration:underline;color:inherit}#column-left .connection-status-button .preloader-container{right:auto;left:1rem;width:1.5rem;height:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{position:absolute;left:0;top:0;bottom:0;right:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);transform:translateY(0);height:100%}#column-left .input-wrapper{width:420px;margin:0 auto;flex:0 0 auto;padding:0 1.25rem;max-width:100%}@media only screen and (max-width: 600px){#column-left .input-wrapper{width:100%;padding:0 1rem}}#search-container{display:flex}#search-container .scrollable-y{position:relative;flex:1 1 auto}.new-channel-container .sidebar-content,.new-group-container .sidebar-content,.edit-profile-container .sidebar-content{flex-direction:column}.new-channel-container .chatlist-container,.new-group-container .chatlist-container,.edit-profile-container .chatlist-container{flex:1 1 auto}.new-channel-container .caption,.new-group-container .caption,.edit-profile-container .caption{font-size:.875rem;margin-top:14px;margin-left:23px;color:#707579;color:var(--secondary-text-color);padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}@media only screen and (max-width: 600px){.settings-container .profile-button{border-radius:0}}.settings-container .profile-buttons{margin-top:1.1875rem;width:100%;padding:0 .4375rem}@media only screen and (max-width: 600px){.settings-container .profile-buttons{margin-top:.6875rem;padding:0}}.edit-profile-container .caption{margin-top:1.0625rem;margin-left:1.4375rem;line-height:1.3125;line-height:var(--line-height);padding-bottom:1.4375rem}@media only screen and (max-width: 600px){.edit-profile-container .caption{padding-right:24px}}.edit-profile-container .sidebar-left-h2{padding:0 1.4375rem;padding-bottom:1.5rem}.edit-profile-container hr{margin-bottom:1rem}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-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{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.chat-folders-container .caption,.edit-folder-container .caption{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);max-width:20rem;margin:0 auto}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{height:30px;padding:0 12px;font-size:15px;width:auto;transition:width .2s;margin:0;position:absolute;right:1rem;top:50%;transform:translateY(-50%);border-radius:15px}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width: 600px){.edit-folder-container .input-wrapper{width:100%;padding:0 16px}}.edit-folder-container .input-wrapper{margin-bottom:.125rem !important}.edit-folder-container .sidebar-left-section{padding-bottom:0rem}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list .chatlist-chat{padding:9px 12px;height:50px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:normal}.folder-categories .checkbox-field{position:absolute;right:1.125rem !important}.folder-category-button{height:50px}.popup-forward .selector .chatlist-chat,.included-chatlist-container .selector .chatlist-chat{padding:7px .75rem !important;height:3.75rem}.popup-forward .selector .chatlist .user-caption,.included-chatlist-container .selector .chatlist .user-caption{padding:0px 0px 0 14px;margin-top:-2px}.popup-forward .selector .chatlist .user-last-message,.included-chatlist-container .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{display:flex;justify-content:space-between;align-items:center}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width: 600px){.search-group-recent .chatlist-chat{height:62px;padding-top:7px;padding-bottom:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500 !important}.search-group-recent .dialog-avatar{--size: 46px;--multiplier: 1.173913}}@media only screen and (max-width: 600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width: 601px){.search-group-recent.search-group.search-group-contacts{padding:0px 0 7px}}.sidebar-left-section{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0}@media only screen and (max-width: 600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width: 601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width: 600px){.sidebar-left-section-content>.checkbox-ripple,.sidebar-left-section-content>.btn-primary{border-radius:0}}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width: 600px){.sidebar-left-section-name{padding:.5rem 1rem;font-size:.875rem}}.sidebar-left-section-caption{margin-top:1rem;font-size:1rem;color:#707579;color:var(--secondary-text-color);line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width: 600px){.sidebar-left-section-caption{margin:.5rem;font-size:.875rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none !important;opacity:.25}.sidebar-left-section .media-sticker-wrapper{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500}.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}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{text-align:center;max-width:342px;margin-left:auto;margin-right:auto;margin-bottom:1.125rem}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem !important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{width:168px;height:168px;margin:.625rem auto 1.1875rem}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{margin:1.125rem auto 1.8125rem;width:157px;height:157px}.two-step-verification-hint .media-sticker-wrapper{width:160px;height:160px;margin:.5rem auto 2.25rem}.two-step-verification-email .media-sticker-wrapper{width:160px;height:160px;margin:.5625rem auto 2.1875rem}.two-step-verification-set .media-sticker-wrapper{width:160px;height:160px;margin:1rem auto 1.3125rem}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width: 601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-top:1rem;padding-bottom:.9375rem}.active-sessions-container .row-title-row{align-items:flex-end}.active-sessions-container .row-title:first-child{font-weight:500}.active-sessions-container .row-title-right{font-size:.75rem;color:#707579;color:var(--secondary-text-color);line-height:1.5}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500}.blocked-users-container .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{margin-top:-0.375rem;font-size:.875rem}.blocked-users-container ul{margin-top:.3125rem}@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{padding:0 .5rem .5rem}.background-container .grid-item:after{content:\" \";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border:3px solid #3390ec;border:3px solid var(--primary-color);opacity:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(0.91)}.background-container .grid-item-media{transition:transform .2s ease-in-out;transform:scale(1)}.background-container .grid .media-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.background-container .grid .preloader-container{z-index:1}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{top:40%;transform:translateY(-50%);text-align:center;line-height:1.3125;line-height:var(--line-height);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem !important;margin:0 auto;padding:0 1rem;position:relative}.empty-placeholder .media-sticker-wrapper{width:128px;height:128px;margin:0 auto 1.9375rem;position:relative}.empty-placeholder-header{font-size:1.25rem;font-weight:500}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{position:relative;overflow:unset}@media only screen and (min-width: 601px)and (max-width: 1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width: 600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw, 0, 0)}}@media only screen and (min-width: 601px){#column-right{width:calc(var(--right-column-width));transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);position:absolute;right:0;z-index:3;transform:translate3d(var(--right-column-width), 0, 0)}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, 0, 0)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width: 1276px){#column-right{width:calc(var(--right-column-width) + 1px);transform:translate3d(calc(var(--right-column-width) + 1px), 0, 0);border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}@media only screen and (min-width: 601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}}#column-right #search-private-container .chatlist-container{position:relative;flex:1 1 auto}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{width:100%;max-width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0px;perspective-origin:left top}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .search-super{top:100%;min-height:calc((1vh * 100) - 56px);min-height:calc((var(--vh, 1vh) * 100) - 56px)}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{display:flex;align-items:center}.shared-media-container .btn-corner.menu-open:before{content:\"\"}@media only screen and (max-width: 600px){.shared-media-container .btn-corner{width:54px;height:54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{width:100%;max-width:100%;position:absolute;min-height:100%;display:flex;flex-direction:column;background-color:#fff;background-color:var(--surface-color)}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);padding:24px 0px 0px 24px;font-weight:500;color:#707579;color:var(--secondary-text-color)}@media only screen and (max-width: 600px){.search-super .search-super-month-name{padding:18px 0px 0px 16px}}.search-super.sliding{max-height:none !important}.search-super-tabs{width:auto;flex:1 1 auto}.search-super-tabs-scrollable{box-shadow:none !important;position:sticky !important;top:0px;z-index:2;background-color:#fff;background-color:var(--surface-color)}.search-super-tabs-scrollable:before{position:absolute;width:100%;height:1px;left:0;top:0;background-color:inherit;display:block;content:\" \";z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{position:relative;display:flex}.search-super-tabs-container{min-height:calc(100% - 49px);grid-template-rows:100%;flex:1 1 auto}.search-super-tabs-container>div{position:relative;min-height:150px}.search-super-tabs-container>div>div:first-child{transform:translateY(0);min-height:calc(100vh - 111px)}.search-super-tabs-container .preloader{padding:0;position:absolute !important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .document-name,.search-super .audio-title,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{flex:0 0 auto;margin-left:8px;margin-top:3px;font-size:12px;color:#707579;color:var(--secondary-text-color)}.search-super-content-media .search-super-month-name{border:none;padding:9px 0px 7px 24px}.search-super-content-media .video-time{position:absolute;left:5px;top:4px;height:18px;border-radius:4px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 5px;z-index:1;font-size:12px;color:#fff;line-height:18px}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute;z-index:2;margin:0}.search-super .document .checkbox-field,.search-super .audio .checkbox-field{top:50%;left:0;margin-left:2rem;margin-top:1rem;transform:translateY(-50%)}.search-super-content-media .search-super-month-items{width:100%;padding-top:1px;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:1px}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width: 600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{padding-left:60px;height:calc(48px + 1.5rem)}.search-super-content-files .document-ico,.search-super-content-files .document-download{width:48px;height:48px;border-radius:5px !important}.search-super-content-files .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis}.search-super-content-links .search-super-item{display:flex;flex-direction:column;padding-left:4.4375rem;position:relative;overflow:hidden;min-height:4.375rem;cursor:pointer;justify-content:flex-start}.search-super-content-links .row-media{height:3rem;width:3rem;border-radius:.375rem;overflow:hidden;position:absolute;left:.6875rem}.search-super-content-links .row-media.empty{display:flex;align-items:center;justify-content:center;font-size:2rem;color:#fff;text-transform:uppercase;background-color:#3390ec;background-color:var(--primary-color)}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:unset}.search-super-content-links .anchor-url:last-child:before{position:absolute;top:0;right:0;bottom:0;left:0;content:\" \";cursor:pointer;z-index:1}.search-super-content-links .media-photo{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;white-space:pre-wrap;text-overflow:ellipsis;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{padding:0 !important;margin:2rem 0 0 -1.75rem !important}@media only screen and (min-width: 601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width: 600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 20px}@media only screen and (max-width: 600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:unset;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-top:.5rem;padding-bottom:.5rem}.search-super-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-0.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent !important}.search-super-selection-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;opacity:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width: 600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{flex-grow:1;font-weight:500;color:#000;color:var(--primary-text-color);white-space:nowrap;text-transform:capitalize;margin-left:1.5rem}#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before{display:none}#search-container .search-group.is-short li:nth-child(n+4){display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{display:flex;flex-direction:column;height:140px;cursor:pointer}#stickers-container .sticker-set-name{font-weight:500}#stickers-container .sticker-set-count{font-size:14px;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-header{display:flex;padding-left:16px;padding-bottom:12px;justify-content:space-between}#stickers-container .sticker-set-button{height:30px;padding-left:12px;padding-right:13px;margin-right:16px;font-size:15px;border-radius:16px;font-weight:400;width:auto;transition:width .2s}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{width:68px;height:68px;position:relative}#stickers-container .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}#stickers-container .sticker-set-sticker img{max-width:100%;max-height:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);padding:0 16px 8px 16px;margin:0;font-weight:500;justify-content:space-between;display:flex;font-size:15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width: 601px){#poll-results-container .poll-results-answer{padding:0 24px 8px 24px}}#poll-results-container .poll-results-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{float:left;padding-right:32px;padding-left:16.5px;font-size:24px;color:#707579;color:var(--secondary-text-color)}#poll-results-container .poll-results h3{padding:0 16px;margin-top:15px;font-size:20px;margin-bottom:16px}@media only screen and (min-width: 601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:normal}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width: 601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{padding:0 .75rem;margin-bottom:.5625rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none !important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem !important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.88);display:flex;align-items:center;justify-content:center}@media only screen and (max-width: 600px){.media-viewer{background:#000}}.media-viewer-author{height:100%;cursor:pointer;display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width: 600px){.media-viewer-userpic{display:none}}.media-viewer-name{line-height:1.3125;line-height:var(--line-height);font-weight:500;margin:.0625rem 0}@media only screen and (min-width: 601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{line-height:1.3125;line-height:var(--line-height);font-size:.875rem}.media-viewer-buttons{position:absolute;top:0;right:0;display:flex;flex-flow:row nowrap;padding:.5rem .75rem}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:hover,html.no-touch .media-viewer-buttons .btn-icon:active{color:#fff}@media only screen and (max-width: 600px){.media-viewer-buttons{display:none}}.media-viewer-content{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;position:relative;max-width:100%;max-height:100%;overflow:hidden;flex:1 1 auto;display:flex;align-items:center}.media-viewer-media{visibility:hidden}.media-viewer-caption{position:absolute;text-align:center;color:#fff;word-break:break-word;overflow:hidden;text-overflow:ellipsis;z-index:4;bottom:0;left:0;right:0;padding:.5rem .5rem 0;opacity:0;line-height:1.3125;line-height:var(--line-height);white-space:pre-wrap;background-color:transparent}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9 !important}.media-viewer-caption .scrollable{padding:.5rem .875rem;max-height:6rem;max-width:50rem;height:6rem;position:relative;margin:0 auto}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width: 600px){.media-viewer-caption{width:100%;transform:translateZ(0);text-align:unset;bottom:1.0625rem}.media-viewer-caption .scrollable{padding:0 .5rem;height:auto}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0, -69px, 0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:hover,html.no-touch .media-viewer-caption:active{background-color:#000;opacity:1 !important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1 !important}.media-viewer-switcher{position:absolute;left:0;top:3.75rem;width:7rem;height:calc(100% - 7.5rem);cursor:pointer;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width: 600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-prev-button,.media-viewer-next-button{cursor:pointer;position:absolute;color:#fff;font-size:2rem;left:1rem;top:50%;transform:translateY(-50%) rotate(90deg);opacity:0;transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width: 601px){.media-viewer-prev-button,.media-viewer-next-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width: 601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{position:fixed !important;display:flex;justify-content:center;align-items:center;min-height:auto !important;left:0;top:0;transform-origin:top left;overflow:hidden;transform:translateZ(0) scale3d(1, 1, 1);border-radius:0}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}@media only screen and (max-width: 600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{width:100%;height:100%;position:absolute;left:0;top:0}.media-viewer-mover>svg{width:100%;height:100%}.media-viewer-mover img,.media-viewer-mover video{width:100%;height:100%;max-width:100%;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-o-object-fit:cover;object-fit:cover;opacity:1;transition:var(--open-duration) opacity;position:absolute}.media-viewer-mover svg img,.media-viewer-mover svg video{position:unset}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration) / 8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none !important}.media-viewer-mover.center{left:50% !important;top:50% !important;transform:translate3d(-50%, -50%, 0) !important;max-width:100vw;max-height:calc((1vh * 100) - 15rem);max-height:calc((var(--vh, 1vh) * 100) - 15rem)}@media only screen and (max-width: 600px){.media-viewer-mover.center{width:100% !important;height:100% !important;max-width:100vw !important;max-height:calc((1vh * 100) - 120px);max-height:calc((var(--vh, 1vh) * 100) - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{width:auto;-o-object-fit:contain;object-fit:contain}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{position:absolute;top:0;left:0;right:0;height:3.5rem;display:flex;align-items:center;justify-content:space-between;z-index:5;padding:0 1.25rem}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active{opacity:1}.media-viewer-topbar-left{display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{width:100%;height:100%;transform:scale3d(1, 1, 1);position:absolute;border-radius:0;display:flex;align-items:center;justify-content:center}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration: .2s;--move-duration: .35s;top:0;left:0;width:100%;height:100%;position:fixed !important;display:block;z-index:4;visibility:hidden;transition:visibility 0s var(--open-duration)}body.animation-level-0 .media-viewer-whole{--open-duration: 0s;--move-duration: 0s}.media-viewer-whole.active{visibility:visible;transition-delay:0s}.media-viewer-whole.active .overlays,.media-viewer-whole.active .media-viewer-appear{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .overlays,body.animation-level-2 .media-viewer-whole.active .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width: 600px){.media-viewer-whole .btn-menu-toggle{color:rgba(255,255,255,.4);opacity:1}.media-viewer-whole .btn-menu-toggle.menu-open{color:#fff;background-color:rgba(112,117,121,.2) !important}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-movers{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:\"\"}.tgico-zoom.zoom-in:before{content:\"\"}.zoom-container{width:17.125rem;height:3.375rem;background-color:rgba(0,0,0,.4);border-radius:12px;padding:.5rem;opacity:1;display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.25rem;left:50%;transform:translateX(-50%);z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{pointer-events:none;opacity:.4}.zoom-container .progress-line{--color: #fff;--height: 2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.zoom-container:not(.is-visible),.media-viewer-whole:not(.active) .zoom-container{opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0 !important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0 !important}.overlays{top:0;left:0;width:100%;height:100%;position:fixed !important;background-color:rgba(0,0,0,.2);z-index:4;opacity:0;visibility:hidden;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.emoji-dropdown{display:flex;flex-direction:column;width:100%;height:min(282px, calc(1vh * 100 - 135px));height:min(282px, calc(var(--vh) * 100 - 135px));background:#fff;background:var(--surface-color);overflow:hidden;flex:1 1 auto;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-height: 570px)and (min-width: 601px){.emoji-dropdown{position:absolute !important;left:.8125rem;bottom:5.125rem;width:26.25rem !important;height:26.25rem;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:0 100%}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{width:100%;max-width:100%;overflow:hidden;height:100%}.emoji-dropdown .emoji-tabs{justify-content:center;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.emoji-dropdown .emoji-tabs-search{position:absolute;left:0;margin-left:4px !important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0;margin-right:4px !important}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{top:0;font-size:14px;font-weight:500;color:#707579;color:var(--secondary-text-color);z-index:2;padding:12px 6px 6px 6px;width:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{top:0;height:1px}.emoji-dropdown .tabs-container .tabs-tab{min-height:100%;flex-direction:column;height:100%}.emoji-dropdown .tabs-container .emoticons-content{flex:1;padding:0;position:relative}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width: 600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:unset;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill, 40px)}.emoji-dropdown .emoji-padding.active .category-items>span{width:40px;height:40px;justify-self:center}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:unset}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{height:48px;padding:2px;width:100%;z-index:4;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{position:relative;margin:0 -0.125rem}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}.emoji-dropdown #content-stickers .scrollable{padding:0px 5px 0}.emoji-dropdown .menu-horizontal-div{width:100%;height:48px}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{font-size:1.5rem;margin:0 12px;width:48px;height:48px;line-height:48px;display:flex;align-items:center;flex:0 0 auto}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;width:48px;padding:0;margin-right:1px;margin-left:1px}.emoji-dropdown .stickers-padding .menu-wrapper{padding:0;height:48px;max-width:100%;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{padding:8px;max-width:100%;max-height:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{width:100%;height:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{width:0;height:0;opacity:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{width:0;height:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{width:0;height:0;display:none}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{min-height:5rem;max-height:12.5rem;border-radius:10px;background-color:rgba(0, 0, 0, .2);background-color:var(--scrollbar-color);opacity:1}.scrollable-x::-webkit-scrollbar,.no-scrollbar::-webkit-scrollbar{display:none}.scrollable{width:100%;height:100%;overflow-y:hidden;overflow-x:hidden;max-height:100%;transform:translateZ(0);position:absolute;top:0px;left:0px;bottom:0px;right:0px;-webkit-overflow-scrolling:touch}.scrollable.scrollable-x{overflow-x:auto;scrollbar-width:thin;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;-ms-overflow-style:none}.scrollable-padding{min-width:100%;height:100%}@-webkit-keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}.selector{width:100%;height:100%;display:flex;flex-direction:column}.selector-search-container{flex:0 0 auto;position:relative;max-height:132px;overflow:hidden}.selector-search-container .scrollable{position:relative;max-height:inherit}.selector-search{padding:0 24px 0 24px;display:flex;flex-flow:wrap;position:relative}.selector-search-input{border:none;outline:none;flex:1 1 auto}.selector-search .selector-search-input{padding:7px 0px 19px 0px}.selector-user{color:#000;color:var(--primary-text-color);background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);font-size:1rem;padding:0 17px 0px 0px;margin-left:-0.25rem;margin-right:.75rem;height:2rem;line-height:2rem;margin-bottom:7px;border-radius:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:0 0 auto;transition:.2s opacity,.2s transform,.2s background-color;max-width:11.25rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:hover,html.no-touch .selector-user:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:hover .selector-user-avatar:after,html.no-touch .selector-user:active .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.selector-user-avatar:after{position:absolute;content:\"\";left:0;top:0;background-color:#df3f40;background-color:var(--danger-color);height:100%;width:100%;z-index:2;font-size:23px;line-height:32px !important;opacity:0;transition:.2s opacity,.2s transform;transform:scaleX(-1) rotate(0deg)}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{height:100%;flex:1 1 auto}.selector .chatlist-container .scrollable>:first-child{margin-top:.5rem}.selector .chatlist-chat{padding-top:.75rem;padding-bottom:.75rem}@media only screen and (max-width: 600px){.selector .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px !important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;transform:translateY(-50%);top:50%;z-index:1}.selector .checkbox-field:first-child{margin-right:1.6875rem;margin-left:.6875rem}.selector .checkbox-field-round{pointer-events:none;position:absolute;right:1.125rem;--size: 1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:unset}.selector .checkbox-field-round .checkbox-box-check{--offset: 6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{flex:1 0 auto;max-width:100%;height:100px;margin:2.5px;cursor:pointer;position:relative}.gifs-masonry>.gif video,.gifs-masonry>.gif img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.gifs-masonry>.gif img{position:absolute;left:0;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;height:100%;transform-origin:center center;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:54px;height:54px;display:flex;cursor:pointer;overflow:hidden;opacity:0;transform:scale(0)}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color: #fff}.preloader-container .you-spin-me-round{width:100%;height:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;width:100%;height:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new,body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite !important;animation:rotate 1s linear infinite !important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;color:var(--color);width:56%;height:56%;opacity:1}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-download:hover,html.no-touch .preloader-container .preloader-download:active{background:none}.preloader-container:not(.manual) .preloader-download,.preloader-container.manual .preloader-close{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{width:1.5rem;height:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer !important}.preloader-container.preloader-streamable circle{stroke-width:2.5 !important}.preloader-container.preloader-streamable:after{content:\"\";position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:var(--color);left:50%;top:50%;transform:translate(-50%, -50%)}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{100%{transform:rotate(360deg)}}@keyframes rotate{100%{transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rp-overflow .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.btn-corner.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple{width:100%;height:100%;overflow:hidden;border-radius:inherit}.rp-overflow .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.btn-corner.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration: .7s;position:absolute;top:0;left:0;bottom:0;right:0}html.is-safari .c-ripple:not(:empty){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%);border-radius:inherit}.c-ripple__circle{background-color:rgba(0, 0, 0, .08);background-color:var(--ripple-color);display:block;position:absolute;transform:scale(0);border-radius:50%;-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;transition:.35s opacity,.35s background-color;pointer-events:none}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration: .2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width: 925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration: .2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}avatar-element{--size: 54px;--multiplier: 1;--color-top: var(--avatar-color-top);--color-bottom: var(--avatar-color-bottom);color:#fff;width:var(--size);height:var(--size);line-height:var(--size) !important;border-radius:50%;background:linear-gradient(var(--color-top), var(--color-bottom));text-align:center;font-size:calc(1.25rem / var(--multiplier));-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase;font-weight:700}avatar-element[data-color=red]{--color-top: var(--peer-avatar-red-top);--color-bottom: var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top: var(--peer-avatar-orange-top);--color-bottom: var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top: var(--peer-avatar-violet-top);--color-bottom: var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top: var(--peer-avatar-green-top);--color-bottom: var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top: var(--peer-avatar-cyan-top);--color-bottom: var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top: var(--peer-avatar-pink-top);--color-bottom: var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top: var(--peer-avatar-blue-top);--color-bottom: var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px / var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px / var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(21px / var(--multiplier)) !important}avatar-element.tgico-reply_filled:before{font-size:calc(28px / var(--multiplier)) !important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px / var(--multiplier))}avatar-element:before{line-height:inherit !important}avatar-element.media-container{position:relative}avatar-element img{width:var(--size) !important;height:var(--size) !important;border-radius:inherit !important;display:block}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{width:calc(1.125rem / var(--multiplier)) !important;height:calc(1.125rem / var(--multiplier)) !important;vertical-align:middle !important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{position:absolute;content:\" \";display:block;border-radius:50%;border:2px solid #fff;border:2px solid var(--surface-color);background-color:#0ac630;background-color:var(--avatar-online-color);width:14px;height:14px;left:2.4375rem;top:2.4375rem}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size: 120px;--multiplier: .45}avatar-element.avatar-100{--size: 100px;--multiplier: .54}avatar-element.avatar-48{--size: 48px;--multiplier: 1.125}avatar-element.avatar-46{--size: 46px;--multiplier: 1.173913}avatar-element.avatar-44{--size: 44px;--multiplier: 1.227272}avatar-element.avatar-42{--size: 42px;--multiplier: 1.285714}avatar-element.avatar-40{--size: 40px;--multiplier: 1.35}avatar-element.avatar-35{--size: 35px;--multiplier: 1.542857}avatar-element.avatar-34{--size: 34px;--multiplier: 1.588235}avatar-element.avatar-32{--size: 32px;--multiplier: 1.6875}avatar-element.avatar-30{--size: 30px;--multiplier: 1.8}avatar-element.avatar-18{--size: 18px;--multiplier: 3}avatar-element.avatar-16{--size: 16px;--multiplier: 3.375}.avatar-relative .avatar-photo{position:absolute;top:0;left:0}.document{--background-color: var(--primary-color);padding-left:4.25rem;height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#fff;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0 .25rem}@media only screen and (max-width: 600px){.document:not(.document-with-thumb) .document-ico{padding:1.5rem 0px 0px 0px;font-size:14px}.document:not(.document-with-thumb) .document-ico:after{--size: .875rem}}.document-ico:after{--size: 1.125rem;content:\"\";display:block;position:absolute;top:0;right:0;width:var(--size);height:var(--size);border-bottom-left-radius:.25rem;border-style:solid;border-width:calc(var(--size) / 2);border-left-color:rgba(0,0,0,.25);border-bottom-color:rgba(0,0,0,.25);border-top-color:#fff;border-right-color:#fff}.document-ico,.document-download{font-size:1.125rem;background-size:contain}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#fff;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color: #FB8C00}.document.ext-pdf{--background-color: #DF3F40}.document.ext-apk{--background-color: #43A047}.document.document-with-thumb{--background-color: #fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3) !important}.document-thumb{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.document-name{white-space:nowrap;font-weight:500;font-size:1rem}.document-size{white-space:nowrap;color:#707579;color:var(--secondary-text-color);font-size:.875rem;text-overflow:ellipsis;overflow:hidden}.document-name,.document-size{line-height:1.3125;line-height:var(--line-height)}.document .preloader-container{width:2.5rem;height:2.5rem}@media only screen and (max-width: 600px){.document .preloader-container{width:1.625rem;height:1.625rem}}.document .preloader-circular{background-color:transparent !important}.document .preloader-path-new{stroke-width:2.5}.document,.audio{display:flex;flex-direction:column;justify-content:center;cursor:pointer;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.document-ico,.document-download,.audio-ico,.audio-download{position:absolute;left:0;width:3.375rem;height:3.375rem;color:#fff}.document-download,.audio-download{z-index:1;align-items:center;font-size:1.5rem;cursor:pointer;display:flex;justify-content:center;transition:opacity .2s ease-in-out;opacity:1}.document-download.downloaded,.audio-download.downloaded{opacity:0}.document-description,.audio-description{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.document:not(.corner-download) .preloader-container:not(.preloader-streamable),.audio:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1) !important}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent !important}.audio .preloader-container:not(.preloader-streamable){width:100%;height:100%}.audio{position:relative;padding-left:67px;overflow:visible !important;height:3.375rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:3rem;padding-left:calc(3rem + .5625rem)}.audio-toggle,.audio-download{overflow:hidden;border-radius:50%;background-color:#3390ec;background-color:var(--primary-color);align-items:center}.audio.corner-download .audio-download{width:1.375rem;height:1.375rem;margin:2rem 2rem 0;background:none;display:flex !important;top:0}.audio.corner-download .preloader-container{border-radius:inherit;background-color:#3390ec;background-color:var(--primary-color)}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{position:absolute;top:0;right:0;bottom:0;left:0;transform:rotate(-119deg);overflow:hidden;max-width:100%;max-height:100%;border-radius:inherit}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{position:absolute;background-color:#fff;top:50%;left:50%;transform:translate(-50%, -50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out}@media only screen and (min-width: 601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width: 600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width: 601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width: 600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:23px;margin-top:1px}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color);opacity:.3}html.no-touch .audio-waveform rect:hover,html.no-touch .audio-waveform rect:active{opacity:1}.audio-waveform rect.active,.audio.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform rect{opacity:1}.audio .audio-details{margin-top:3px;margin-bottom:0}.audio .audio-title{margin-bottom:-2px}.audio-ico,.audio-download{width:3rem;height:3rem}.audio .part{height:112px !important;width:112px !important}@media only screen and (max-width: 600px){.audio .part{width:100px !important;height:100px !important}}.audio-title{font-size:1rem;color:#000;color:var(--primary-text-color)}.audio-description:not(:empty):before{content:\" • \"}.audio-time,.audio-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex}@media only screen and (max-width: 600px){.audio-time,.audio-subtitle{font-size:.75rem}}.audio-title,.audio-time,.audio-subtitle{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-title,.audio-subtitle{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{line-height:1;margin-left:-1px;margin-top:7px;align-items:center}@media only screen and (max-width: 600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{content:\" \";width:.5rem;height:.5rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;margin-left:.375rem}.audio .progress-line{--height: 2px;--border-radius: 4px;--thumb-size: .75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{z-index:1;background-color:transparent;opacity:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff !important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;-o-object-fit:cover;object-fit:cover;width:inherit;height:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{position:absolute;left:0;display:flex;width:100%;justify-content:center;top:8px;align-items:center;transform:translate3d(0, calc(-100% - 10px), 0);transition:transform .2s ease}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translate3d(0, 0, 0)}.quiz-hint .container{background:rgba(0,0,0,.7);text-align:center;width:auto;padding:10px 18px 12px 50px;min-height:48px;border-radius:12px;line-height:1.5;color:#fff;font-size:15px;max-width:400px;overflow:hidden;text-align:left;position:relative;display:flex;align-items:center;flex-wrap:wrap}@media only screen and (max-width: 600px){.quiz-hint .container{padding:10px 18px 12px 54px;margin:0 10px;font-size:14px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"\";position:absolute;left:15px;font-size:1.5rem;top:12px}.quiz-hint .container a{color:#fff;border-bottom:1px solid #fff}.peer-typing{margin-right:4px}.peer-typing-container{--color: var(--primary-color);color:var(--color)}.peer-typing-flex{display:flex;align-items:center}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;vertical-align:middle;transform:translateY(-1px)}.peer-typing-text-dot{width:6px;height:6px;border-radius:50%;background-color:var(--color);margin:0 .5px;display:inline-block;vertical-align:middle;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:dotMiddle;animation-name:dotMiddle}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{width:13px;height:5px;overflow:hidden;position:relative;border-radius:2px;margin-right:.375rem}.peer-typing-upload:before,.peer-typing-upload:after{display:block;content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--color);border-radius:inherit}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{content:\" \";display:block;width:6px;height:6px;border-radius:50%;background-color:var(--color);-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.peer-typing-choosing-sticker{margin-right:.375rem;flex:0 0 auto;display:flex;align-items:center;height:16px}.peer-typing-choosing-sticker-eye{width:8px;height:14px;border-radius:50%;display:inline-block;vertical-align:middle;border:1px solid var(--color);margin:0 .0625rem;position:relative;-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite}.peer-typing-choosing-sticker-eye:before{content:\" \";display:block;width:.25rem;height:.25rem;background-color:var(--color);border-radius:50%;position:absolute;top:50%;-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;transform:translate(-1px, -50%)}@-webkit-keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@-webkit-keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@-webkit-keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}@keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}poll-element{margin-top:-1px;display:block;width:330px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#000;color:var(--primary-text-color)}@media only screen and (max-width: 600px){poll-element{width:240px;max-width:100%}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500}@media only screen and (max-width: 600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{font-size:14px;color:#707579;color:var(--secondary-text-color);margin-top:2px;margin-bottom:5px;display:flex;align-items:center;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{position:absolute;font-size:1.5rem;top:-4px;right:2px;color:#3390ec;color:var(--primary-color);cursor:pointer;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{transform:scale(0);pointer-events:none}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;width:18px;height:18px}poll-element .poll-answer{display:flex;position:relative;padding-bottom:20px;padding-left:28px;margin-top:1px}poll-element .poll-answer-text{margin-top:6px;margin-left:12px}poll-element .poll-answer-percents{position:absolute;left:0;top:0;opacity:0;font-weight:500;margin-top:7px;font-size:14px;margin-left:-9px;text-align:right;width:40px}poll-element .poll-answer-selected{position:absolute;bottom:1px;left:15px;color:#fff;background:#3390ec;background:var(--primary-color);border-radius:50%;height:16px;width:16px;font-weight:bold;font-size:.75rem;opacity:1;display:flex;align-items:center;justify-content:center}poll-element .poll-answer-selected:before{content:\"\";font-weight:bold}html.no-touch poll-element .poll-answer:hover .animation-ring,html.no-touch poll-element .poll-answer:active .animation-ring{visibility:visible;transform:scale(1)}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-0.5rem}poll-element .poll-line{height:35px;position:absolute;left:10px;bottom:2px;stroke-dashoffset:0;stroke-dasharray:0,485.9}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{text-align:center;margin:-0.375rem -0.5rem -0.375rem -0.625rem;height:2.875rem}poll-element .poll-footer-button{cursor:pointer;width:100%;height:100%;color:#3390ec;color:var(--primary-color);font-weight:500;border-top-left-radius:0 !important;border-top-right-radius:0 !important;font-size:1rem;overflow:hidden}poll-element .poll-footer,poll-element .poll-footer-button{display:flex;align-items:center;justify-content:center}poll-element .poll-quiz-timer{width:32px;height:32px;stroke:#a3adb6;transform:rotate(270deg);top:-7px;fill:none;position:absolute;right:-2px;stroke-linecap:round}poll-element .poll-time{font-size:12px;font-weight:500;position:absolute;right:27px;color:#a3adb6}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:\"\";font-size:12px}poll-element .circle-hover{display:flex;justify-content:center;align-items:center;width:34px;height:34px;position:absolute;left:-1px;top:-1px;transform:scale(1)}poll-element .circle-hover .poll-answer-selected{display:flex !important;opacity:0;left:50%;top:50%;transform:translate(-50%, -50%);width:20px;height:20px;font-size:20px;line-height:16px;-webkit-animation:none;animation:none}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{display:block;border-radius:50%;height:34px;width:34px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);transform:scale(0.1);visibility:hidden}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;width:26px;top:unset;left:unset}poll-element .progress-ring__circle{transform-origin:center;transform:rotate(-90deg);stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent}poll-element.is-voted .circle-hover,poll-element.is-voted .animation-ring{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity .1s ease forwards}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:.34s opacity}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:.1s transform}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-animation-fill-mode:forwards !important;animation-fill-mode:forwards !important}.transition>.transition-item:not(.active):not(.from):not(.to){display:none !important}.transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.transition.zoom-fade>.to{transform-origin:center;opacity:0}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(0.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine: cubic-bezier(.39, .575, .565, 1);--easeInSine: cubic-bezier(.47, 0, .745, .715);position:relative}.transition.slide-fade>.from{transform-origin:left center;transform:translateX(0);opacity:1}.transition.slide-fade>.to{transform-origin:left center;transform:translateX(1.5rem);opacity:0}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}.row{min-height:3.5rem;position:relative;padding:.6875rem 1rem;display:flex;flex-direction:column;justify-content:center}.row a{position:relative;z-index:1}.row-title-row{display:flex;justify-content:space-between;align-items:center;order:0}.row-title-row .row-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word;text-overflow:ellipsis;overflow:hidden}.row-title-right{flex:0 0 auto !important;margin-left:1rem}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{position:absolute;left:1rem;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);pointer-events:none;margin-top:-0.125rem}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width: 601px){.row-clickable{border-radius:10px}}.row .radio-field-main,.row .checkbox-field{padding-left:3.375rem;margin-left:-3.375rem}.row .checkbox-field{margin-right:0;height:auto}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0;margin-right:.125rem;padding:0}.row-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important;font-size:.875rem !important;line-height:1.3125;line-height:var(--line-height);margin-top:.125rem;margin-bottom:.0625rem;order:1}.row-subtitle:empty{display:none}.row-media{width:48px !important;height:48px !important;position:absolute !important;margin:0 !important;left:.5rem}.row.menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.color-picker{width:380px;max-width:100%;margin:1.1875rem auto 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.color-picker-box{width:100%;height:198px}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible !important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);position:absolute !important;right:0;bottom:calc(100% + .625rem);width:26.25rem !important;max-width:100%;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:bottom right;padding:.625rem !important;display:block !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{width:100%;border-radius:.375rem;border:2px solid #3390ec;border:2px solid var(--primary-color);text-align:center;color:#3390ec;color:var(--primary-color);background-color:transparent;height:3rem;font-weight:500;font-size:.9375rem}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:hover,html.no-touch .reply-keyboard-button:active{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.popup{position:fixed !important;top:0;right:0;bottom:0;left:0;max-width:none;z-index:3;background-color:rgba(0,0,0,.3);margin:0;padding:1.875rem;box-shadow:none;opacity:0;visibility:hidden;transition-property:opacity,visibility;transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-timing-function:cubic-bezier(.4, 0, .2, 1);transition-timing-function:var(--popup-transition-function);overflow:auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;visibility:visible;transition-delay:0s,0s;z-index:4}.popup.active .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup.hiding .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup-container{--translateX: 0;position:relative;border-radius:10px;background-color:#fff;background-color:var(--surface-color);padding:1rem;transform:translate3d(var(--translateX), 3rem, 0);-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .15s cubic-bezier(.4, 0, .2, 1);transition:transform var(--popup-transition-time) var(--popup-transition-function);display:flex;flex-direction:column;overflow:hidden;margin:auto}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500}.popup-centerer{margin:auto}.popup-close{z-index:3;justify-self:center;flex:0 0 auto}.popup-header{display:flex;margin-bottom:2rem;align-items:center;flex:0 0 auto}.popup-body{flex:1 1 auto;display:flex;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-top:0 !important;margin-right:1.125rem}.popup-buttons .btn{font-weight:500;padding:.5rem;text-transform:uppercase;border-radius:8px;position:relative;overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis}.popup-buttons .btn+.btn{margin-top:.5rem;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{position:absolute;bottom:20px;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;text-align:left;margin:0;margin-left:2rem}.popup-avatar .crop{max-width:100%;max-height:100%;padding:24px 54px 46px 46px;border-radius:8px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{width:420px;max-width:420px;padding:12px 20px 32.5px;max-height:100%}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{width:auto;height:36px;font-size:14px;font-weight:normal;padding:0 1.375rem;margin-top:-3px;border-radius:10px;text-transform:uppercase}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;padding-left:1.5rem;margin:0;margin-top:-3px;font-size:1.25rem;font-weight:500}.popup-new-media .popup-photo{max-width:380px;overflow:hidden;width:100%;border-radius:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{width:100%;margin-top:25px;flex:0 0 auto}.popup-new-media .input-field-input{font-size:1rem;border-radius:10px}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{z-index:4;top:calc(100% + .25rem)}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{position:relative;border-radius:inherit;overflow:hidden}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{max-width:100%;overflow:hidden;cursor:default;padding-left:3.75rem;height:4.5rem}.popup-new-media.popup-send-photo .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;line-height:1.5}.popup-new-media.popup-send-photo .document-ico{height:48px;width:48px;font-size:16px;font-weight:normal;line-height:11px;letter-spacing:0}.popup-create-contact .name-fields{display:flex;flex-direction:column;position:relative;padding-left:116px;margin-top:1rem}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{display:flex;margin-bottom:.625rem;align-items:center}.popup-peer .popup-container{padding:1rem 1.5rem .8125rem;max-width:min(400px, 100%)}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{margin-top:0;margin-bottom:0;min-width:15rem;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;text-overflow:ellipsis;overflow:hidden;word-break:break-word;line-height:1.3125;line-height:var(--line-height)}.popup-peer .popup-buttons{margin-top:1.625rem;margin-right:-0.5rem}.popup-peer .popup-buttons .btn{font-weight:500}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin:0 -1.0625rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{padding:0 2rem 0 1.5rem;margin:0;font-size:1.25rem;font-weight:500;line-height:1.3125;line-height:var(--line-height)}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);text-align:center;color:#3390ec;color:var(--primary-color)}.popup-stickers .sticker-set-footer .btn-primary{text-transform:uppercase;width:auto;padding:0 1.0625rem;height:44px}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-width:420px;max-height:420px;width:420px;padding:0}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{margin-bottom:12px;flex:0 0 auto;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{padding:0 5px;display:grid;grid-template-columns:repeat(5, 1fr)}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4, 1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{width:80px;width:var(--esg-sticker-size);height:80px;height:var(--esg-sticker-size);margin-bottom:2px;justify-self:center;cursor:pointer;position:relative}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height: 470px){.popup-date-picker .popup-container[data-lines=\"7\"]{top:19px}.popup-date-picker .popup-container[data-lines=\"5\"]{top:-19px}}.popup-date-picker .popup-header{margin-left:6px;margin-top:4px;margin-bottom:1.375rem}.popup-date-picker .popup-title{font-weight:500;font-size:20px}.popup-date-picker .popup-buttons{order:2;margin-right:-2px}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{display:flex;justify-content:space-between;align-items:center}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-prev:disabled,.popup-date-picker .date-picker-next:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-top:7px;margin-bottom:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7, 1fr);width:100%;justify-content:center}.popup-date-picker .date-picker-month .btn-icon{justify-self:center;width:38px;height:38px;font-size:12px;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;align-items:center}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7 !important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{color:#fff;color:var(--badge-text-color);border-radius:50%;background-color:#3390ec !important;background-color:var(--primary-color) !important}.popup-schedule .popup-header{justify-content:space-between;margin-top:5px;margin-bottom:17px;margin-left:0}@media only screen and (max-width: 600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;width:420px;padding:4px 16px 16px 16px}@media only screen and (max-width: 600px){.popup-schedule .popup-container{min-width:312px;width:312px;padding:4px 14px 14px 14px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-right:-20px;margin-left:2px;width:unset}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-weight:500;font-size:20px;margin-left:-5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{justify-self:auto;font-weight:500;font-size:14px;width:36px;height:36px;margin-top:-4px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8 !important}.popup-schedule .date-picker-month-day{font-weight:bold;color:#000 !important;color:var(--primary-text-color) !important;font-size:14px !important}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width: 600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:normal}@media only screen and (max-width: 600px){.popup-schedule .btn-primary{height:50px;widtH:280px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px, 100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main::before{left:.25rem}.popup-create-poll .radio-field .radio-field-main::after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none;opacity:0 !important}.popup-create-poll .input-field .btn-icon{position:absolute;right:.4375rem;top:.4375rem;z-index:1;opacity:1;transition:opacity .2s ease}@media only screen and (max-width: 600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{margin-top:.875rem;font-size:.875rem;line-height:1.2}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{top:54px;right:20px}.popup-forward .popup-container{width:420px;max-width:420px;padding:7px 0 0 0;max-height:min(40.625rem, 100%);height:40.625rem}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width: 600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .selector,.popup-forward .chatlist-container{height:auto;overflow:hidden;display:flex;width:100%;flex-direction:row;flex:1 1 auto}.popup-forward .selector-search-input{font-size:1.25rem;padding:.5rem 1.5rem;width:100%;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0 !important}.popup-forward .selector .chatlist-chat{height:3.875rem !important;padding-top:.5rem !important;padding-bottom:.5rem !important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;text-align:center;pointer-events:none}.popup-instance-deactivated .header{font-size:2rem;color:#fff}.popup-instance-deactivated .subtitle{color:#fff;opacity:.6;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:bold;margin:.75rem 0 .25rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{width:100px;height:100px;position:relative;margin:0 auto}.popup-report-messages-confirm .popup-body{margin:1em -0.5rem .375rem -0.5rem;overflow:unset}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-group-call{padding:0;background-color:transparent;overflow:visible}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-right-radius:0;border-bottom-left-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--button-size: 3.375rem;width:100%;height:100%;padding:0 .5rem}.group-call:after{content:\" \";position:absolute;right:0;bottom:0;left:0;height:7.5rem;background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, #212121 100%);background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, var(--gc-background-color) 100%)}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{flex:0 0 auto;color:inherit}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500}.group-call-header-title,.group-call-header-subtitle{line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-header-subtitle{font-size:.875rem;color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-buttons{display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.75rem;align-self:center;z-index:1}.group-call-button{width:var(--button-size);height:var(--button-size);display:flex;align-items:center;justify-content:center;cursor:pointer;color:#fff;color:var(--gc-primary-text-color);font-size:1.5rem;position:relative;background-color:rgba(1, 200, 80, .2);background-color:var(--gc-button-unmuted-color);border-radius:50%;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px)}body.animation-level-2 .group-call-button{transition:background-color .3s cubic-bezier(.4, .0, .2, 1);transition:background-color var(--transition-standard-in)}.group-call-button+.group-call-button{margin-left:1.25rem}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60, 135, 247, .2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223, 68, 184, .2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255, 89, 90, .3) !important;background-color:var(--gc-button-leave-color) !important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg, #00A3B4 12.94%, #00CB47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg, #4EABF8 14.73%, #3478F6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg, #DF44B8 14.73%, #3851EB 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{align-items:center;padding-right:.5rem}.group-call-participant-status-icon{vertical-align:middle;margin-right:6px;margin-top:2px;line-height:1;display:inline-block;font-size:18px}.group-call-participant-status-container{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-muted-icon-container{flex:0 0 auto}.group-call-participant-video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain;position:absolute}.group-call-participant-video-container{position:relative;height:15rem;width:100%;display:flex;align-items:center;border-radius:10px;background-color:#000;overflow:hidden;margin:.25rem;width:33%;flex:1 1 auto;cursor:pointer}.group-call-participant-video-container:after{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0) 55.62%, rgba(0, 0, 0, 0.5) 86.46%)}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;margin-top:0}.group-call-participant-video-container:after,.group-call-participant-video-info,.group-call-participant-video-header{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-info,body.animation-level-2 .group-call-participant-video-header{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-info,.group-call-participant-video-header{display:flex;align-items:center;justify-content:space-between;padding:0 .5rem 0 .75rem;position:absolute;right:0;bottom:.25rem;left:0;z-index:1}.group-call-participant-video-header{top:0;bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem}.group-call-participant-video-header .group-call-pin-icon{width:1.5rem;height:1.5rem;font-size:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-video-info .group-call-participant-status-container{opacity:.6;margin-top:-1px;margin-bottom:-1px}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant-video-blur{position:absolute;width:100%;height:100%;opacity:.7}.group-call-participant .is-speaking{color:#5CC85E;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;overflow:hidden;flex:1 1 auto}.group-call-participants-scrollable{position:relative;border-radius:inherit;height:auto;padding-bottom:6rem}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-0.25rem -0.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container,.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2){height:auto;flex:1 0 auto}.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container:before,.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before{content:\" \";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-info,.group-call-participants-video-container.show-controls .group-call-participant-video-header{opacity:1}.group-call-participants .chatlist{background:none;padding:0;max-width:600px;margin:0 auto}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-participants .dialog-subtitle{margin-top:-0.25rem}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{min-height:100%;margin-bottom:.25rem}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25% !important}.group-call-cfs{display:none}.group-call:not(.is-big-layout) .popup-body .group-call-header{display:none}.group-call:not(.is-big-layout) .group-call-big-video-container{display:none}.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width: 17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active{background-color:rgba(112,117,121,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(calc(26.25rem / -2));transform:translateX(calc(var(--gc-right-column-width) / -2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX: calc(var(--gc-right-column-width) / -2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{position:absolute;top:0;right:calc(26.25rem * -1);right:calc(var(--gc-right-column-width) * -1);bottom:0;width:26.25rem;width:var(--gc-right-column-width);background-color:#212121;background-color:var(--gc-background-color);padding:inherit}.group-call.is-big-layout .group-call-buttons{padding:.75rem;bottom:2.5rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{position:absolute;content:\" \";top:0;right:0;bottom:0;left:0;-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),background-color .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}#auth-pages{max-width:100%;overflow:hidden;background:#fff;background:var(--surface-color)}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width: 600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width: 600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width: 600px){#auth-pages .input-wrapper{margin-top:41px;width:100%;padding:0 16px}}#auth-pages .auth-image,#auth-pages .subtitle,#auth-pages .input-wrapper{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;position:relative;max-width:720px;margin:0 auto}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height: 810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{max-width:720px;min-width:auto;margin:0 auto;position:relative}#auth-pages .tabs-container .tabs-tab .container{height:810px;padding:0;flex:1 1 auto;display:flex;flex-direction:column;width:100%}@media screen and (max-height: 810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width: 600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-top:.5rem;margin-bottom:.5rem}.page-sign .auth-image,.page-signUp .auth-image{width:7.5rem;height:7.5rem;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.page-sign .auth-image,.page-signUp .auth-image{width:10rem;height:10rem;margin-bottom:1.5rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{max-width:100%;max-height:100%;fill:#3390ec;fill:var(--primary-color)}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:normal}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:unset !important}.page-signQR .auth-image{width:240px !important;height:240px !important;display:flex;justify-content:center;align-items:center}.page-signQR .auth-image .preloader{transform:none;left:unset;top:unset}.page-signQR .auth-image .qr-canvas{width:100%;height:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem !important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{max-width:480px;margin:1rem auto;line-height:1.3125;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-top:10px;margin-bottom:14px}@media only screen and (max-width: 600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width: 600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{display:flex;align-items:center;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{padding:0 1rem;border:none;outline:none;padding:0 1rem;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color)}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:calc(1680px + 2px) !important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{width:100%;overflow:hidden;position:relative;min-height:100%;height:100%;max-height:100%}@media only screen and (max-width: 600px){.page-chats .main-column{width:100%;display:flex !important;z-index:1}}@media only screen and (min-width: 601px){.page-chats #column-center{display:flex !important;background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex !important}.page-chats .main-column{height:100%;position:relative;min-height:100%;max-height:100%}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;width:100%;max-height:100%;height:100%;overflow:hidden;position:absolute;left:0;top:0;z-index:3}@media only screen and (min-width: 1681px){.page-chats{border-top-width:0;border-right-width:1px;border-bottom-width:0;border-left-width:1px;border-style:solid;border-color:#dfe1e5;border-color:var(--border-color)}}.page-chats .avatar-edit{width:120px;height:120px;margin:1rem auto 2rem;flex:0 0 auto}body.animation-level-2 .page-chats .main-column{transition:.25s ease-in-out;transition:var(--tabs-transition)}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}html,body{height:100%;width:100%;margin:0;padding:0}@media only screen and (max-width: 600px){html,body{overflow:hidden;height:calc(1vh * 100);height:calc(var(--vh, 1vh) * 100)}}html.is-ios{position:fixed;-webkit-user-select:none;-webkit-touch-callout:none}@supports(padding: max(0px)){html{padding:0 min(16px, env(safe-area-inset-right)) 0 min(16px, env(safe-area-inset-left))}}html{font-size:16px;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,input,optgroup,select,textarea,html{font-family:\"Roboto\",-apple-system,apple color emoji,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif}input,textarea,button,select,a,div{-webkit-tap-highlight-color:rgba(0,0,0,0)}.whole{min-height:100%;width:100%;margin:0 auto;max-width:1680px;height:100%}@media only screen and (min-width: 601px){.only-handhelds{display:none !important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500}h4{font-size:2rem;margin:22px 0 14px;line-height:110%}@media only screen and (max-width: 600px){h4{font-size:20px;margin:2px 0 8px}}input,[contenteditable=true]{caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color);background-color:transparent}input,textarea{-webkit-appearance:none}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40 !important;color:var(--danger-color) !important}.danger .c-ripple__circle{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec !important;color:var(--primary-color) !important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.blue:before,.primary:before,.danger:before{color:inherit !important}.bg-warning{background:#fed85a !important}.contextmenu{position:fixed !important;right:auto !important;bottom:auto !important;width:auto !important;z-index:4 !important}.preloader{width:50px;height:50px;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);padding:.5rem 1rem;background-color:rgba(0,0,0,.66);color:#fff;font-size:1rem;border-radius:10px;-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;z-index:5;max-width:22.5rem}.toast b{color:inherit}hr{width:100%;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:bolder}.user-last-message b{font-weight:400}.avatar-edit{position:relative;border-radius:50%;cursor:pointer;overflow:hidden}.avatar-edit-canvas{max-width:100%;max-height:100%;width:100%;height:100%;background:linear-gradient(#72d5fd, #2a9ef1);background:linear-gradient(var(--avatar-color-top), var(--avatar-color-bottom))}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{position:absolute;font-size:48px;line-height:48px;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);z-index:2;color:#fff}.avatar-edit .avatar-placeholder{position:absolute;left:0;top:0;width:100%;height:100%;filter:brightness(0.7)}.missing-icon{width:1.5rem;height:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{max-height:23.5rem;position:absolute;width:100%;top:calc(100% + .5rem);left:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);z-index:3;border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;transition:opacity .2s ease-out,transform .2s ease-out;transform:scale(0.95);transform-origin:top center;opacity:0}.select-wrapper.active{transform:scale(1);opacity:1}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;padding:0 1rem;justify-content:space-between;height:3.5rem;cursor:pointer;text-align:left;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px}html.no-touch .select-wrapper li:hover,html.no-touch .select-wrapper li:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{height:26px;width:26px;font-size:26px;line-height:1}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{width:166px;height:166px;margin:0 auto 18px;position:relative}@media only screen and (max-width: 600px){.auth-image{width:120px;height:120px}}.phone-edit{display:inline-block;width:24px;height:24px;margin-left:.4rem;opacity:.5;transition:.2s opacity;cursor:pointer;font-size:1.5rem}@media only screen and (max-width: 600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:hover,html.no-touch .phone-edit:active{opacity:1}span.emoji{display:inline !important;vertical-align:unset !important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1 !important}@media not screen and (-webkit-min-device-pixel-ratio: 2),not screen and (min-device-pixel-ratio: 2),not screen and (min-resolution: 192dpi),not screen and (min-resolution: 2dppx){html:not(.is-safari) span.emoji{margin-right:5px !important}html:not(.is-safari) avatar-element span.emoji{margin-right:0 !important}}img.emoji{width:18px;height:18px;display:inline-block;max-width:100%;max-height:100%;vertical-align:middle}[contenteditable=true]{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;outline:none;cursor:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{content:attr(data-placeholder);color:#a2acb4;display:block;pointer-events:none}.sticky_sentinel{position:absolute;left:0;right:0;visibility:hidden;pointer-events:none}.super-stickers{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}html.no-touch .super-sticker:hover,html.no-touch .super-sticker:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;padding-right:32px;padding-left:16px;font-size:24px;color:#707579;color:var(--secondary-text-color)}.content-empty{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@-webkit-keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}@keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{width:100%;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.grid-item{height:0;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{position:absolute;left:0;top:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.animated-super-row{--translateY: 100%;position:absolute;left:0;top:0;right:0;bottom:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0, calc(var(--translateY) * -1), 0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0, var(--translateY), 0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{position:absolute;left:0;top:0;bottom:0;right:0}middle-ellipsis-element{width:100%;overflow:hidden;display:block}.album-item-media{width:100%;height:100%}html.no-touch .hover-effect:hover,html.no-touch .hover-effect:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.progress-ring{position:absolute;top:0;left:0;pointer-events:none}.progress-ring__circle{transition:stroke-dashoffset;stroke-linecap:round}.rlottie,.rlottie-vector{left:0;top:0;bottom:0;right:0;position:absolute;max-width:100%;max-height:100%;width:100%;height:100%}.rlottie-icon{position:relative}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.media-photo,.media-video,.media-sticker,.media-round,.media-poster{position:absolute;top:0;right:0;bottom:0;left:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-video.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-poster.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-video.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-poster.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{margin:auto;-o-object-fit:contain;object-fit:contain;width:100%;height:100%;max-width:100%;max-height:100%}.media-round{max-width:280px;max-width:var(--round-video-size);max-height:280px;max-height:var(--round-video-size);z-index:1}.media-round canvas{width:100%;height:100%;border-radius:50%;position:relative}.media-round .video-time{padding:0 .375rem;background-color:hsla(85.5319, 36.9171%, 40.402%, .4) !important;background-color:var(--message-highlightning-color) !important}.media-round .video-time:before,.media-round .video-time:after{margin-left:.25rem}.media-round.is-unread .video-time:before{order:1;width:.5rem;height:.5rem;background-color:#fff;border-radius:50%;content:\" \"}.media-round.is-paused .video-time:after{content:\"\";display:flex;align-items:center;font-size:1.125rem;order:2}.gradient-delimiter{width:100%;height:.75rem;background-color:#f4f4f5;background-color:var(--background-color-true);position:relative}.gradient-delimiter:before{content:\" \";position:absolute;left:0;top:0;right:0;bottom:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0.06) 100%)}.tgico-reply:before,.tgico-attach:before,.tgico-saved:before,.tgico-phone:before,.tgico-admin:before,.tgico-message:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-reply_filled:before,.tgico-forward_filled:before{font-size:20px !important;padding:0 2px}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{display:grid;grid-column-gap:2.44px;grid-template-columns:repeat(auto-fill, 2.625rem);justify-content:space-between;font-size:2.125rem;line-height:2.125rem}.super-emojis .super-emoji{display:inline-block;margin:0 .0625rem;padding:.25rem;line-height:inherit;border-radius:8px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem;height:2.625rem}html:not(.emoji-supported) .super-emojis .super-emoji{position:relative}.super-emojis .super-emoji .emoji-placeholder{position:absolute;left:7px;top:7px;width:1.75rem;height:1.75rem;border-radius:50%;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);pointer-events:none}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{width:100%;height:100%;vertical-align:unset;margin:0}html.no-touch .super-emojis .super-emoji:hover,html.no-touch .super-emojis .super-emoji:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:\"Roboto\" !important;font-weight:500;width:1.5rem;text-align:center}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status-icon{position:absolute;line-height:1 !important}.verified-icon{flex:0 0 auto;width:1.25rem;height:1.25rem;margin-left:.125rem}.movable-element{--size: .5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{left:0;right:0;height:var(--size);cursor:row-resize}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{top:0;bottom:0;width:var(--size);cursor:col-resize}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw,.movable-element-resize-handler-side-se{width:var(--size);height:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-nw{cursor:nwse-resize}.movable-element-resize-handler-side-ne{top:0;right:0}.movable-element-resize-handler-side-se{right:0;bottom:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{top:0;left:0}","@font-face{font-family:\"tgico\";src:url(\"assets/fonts/tgico.ttf?onwvlx\") format(\"truetype\"),url(\"assets/fonts/tgico.woff?onwvlx\") format(\"woff\"),url(\"assets/fonts/tgico.svg?onwvlx#tgico\") format(\"svg\");font-weight:normal;font-style:normal;font-display:block}[class^=tgico-],.tgico:before,.tgico:after,[class*=\" tgico-\"]:before,[class*=\" tgico-\"]:after{font-family:\"tgico\";speak:never;font-style:normal;font-weight:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tgico-check:before{content:\"\"}.tgico-checks:before{content:\"\"}.tgico-activesessions:before{content:\"\"}.tgico-add:before{content:\"\"}.tgico-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-avatarnext:before{content:\"\"}.tgico-avatarprevious:before{content:\"\"}.tgico-bold:before{content:\"\"}.tgico-botcom:before{content:\"\"}.tgico-bots:before{content:\"\"}.tgico-bug:before{content:\"\"}.tgico-calendar:before{content:\"\"}.tgico-calendarfilter:before{content:\"\"}.tgico-camera:before{content:\"\"}.tgico-cameraadd:before{content:\"\"}.tgico-car:before{content:\"\"}.tgico-channel:before{content:\"\"}.tgico-channelviews:before{content:\"\"}.tgico-chatspinned:before{content:\"\"}.tgico-chatsplaceholder:before{content:\"\"}.tgico-check1:before{content:\"\"}.tgico-checkbox:before{content:\"\"}.tgico-checkboxblock:before{content:\"\"}.tgico-checkboxempty:before{content:\"\"}.tgico-checkboxon:before{content:\"\"}.tgico-checkretract:before{content:\"\"}.tgico-checkround:before{content:\"\"}.tgico-close:before{content:\"\"}.tgico-clouddownload:before{content:\"\"}.tgico-colorize:before{content:\"\"}.tgico-comments:before{content:\"\"}.tgico-commentssticker:before{content:\"\"}.tgico-copy:before{content:\"\"}.tgico-darkmode:before{content:\"\"}.tgico-data:before{content:\"\"}.tgico-delete_filled:before{content:\"\"}.tgico-delete: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-favourites:before{content:\"\"}.tgico-flag:before{content:\"\"}.tgico-folder:before{content:\"\"}.tgico-fontsize:before{content:\"\"}.tgico-forward_filled:before{content:\"\"}.tgico-forward:before{content:\"\"}.tgico-fullscreen:before{content:\"\"}.tgico-gc_microphone:before{content:\"\"}.tgico-gc_microphoneoff:before{content:\"\"}.tgico-gifs:before{content:\"\"}.tgico-group:before{content:\"\"}.tgico-help:before{content:\"\"}.tgico-image:before{content:\"\"}.tgico-info:before{content:\"\"}.tgico-info2:before{content:\"\"}.tgico-italic:before{content:\"\"}.tgico-keyboard:before{content:\"\"}.tgico-lamp:before{content:\"\"}.tgico-language:before{content:\"\"}.tgico-largepause:before{content:\"\"}.tgico-largeplay:before{content:\"\"}.tgico-left:before{content:\"\"}.tgico-link:before{content:\"\"}.tgico-listscreenshare:before{content:\"\"}.tgico-livelocation:before{content:\"\"}.tgico-location:before{content:\"\"}.tgico-lock:before{content:\"\"}.tgico-lockoff:before{content:\"\"}.tgico-loginlogodesktop:before{content:\"\"}.tgico-loginlogomobile:before{content:\"\"}.tgico-logout:before{content:\"\"}.tgico-mention:before{content:\"\"}.tgico-menu:before{content:\"\"}.tgico-message:before{content:\"\"}.tgico-messageunread:before{content:\"\"}.tgico-microphone:before{content:\"\"}.tgico-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-play:before{content:\"\"}.tgico-plus:before{content:\"\"}.tgico-poll:before{content:\"\"}.tgico-previous:before{content:\"\"}.tgico-radiooff:before{content:\"\"}.tgico-radioon:before{content:\"\"}.tgico-readchats:before{content:\"\"}.tgico-recent:before{content:\"\"}.tgico-replace:before{content:\"\"}.tgico-reply_filled:before{content:\"\"}.tgico-reply:before{content:\"\"}.tgico-rightpanel: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_filled:before{content:\"\"}.tgico-settings:before{content:\"\"}.tgico-sharescreen_filled:before{content:\"\"}.tgico-smallscreen:before{content:\"\"}.tgico-smile:before{content:\"\"}.tgico-sport:before{content:\"\"}.tgico-stickers:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools:before{content:\"\"}.tgico-unarchive:before{content:\"\"}.tgico-underline:before{content:\"\"}.tgico-unmute:before{content:\"\"}.tgico-unpin:before{content:\"\"}.tgico-unread:before{content:\"\"}.tgico-up:before{content:\"\"}.tgico-user:before{content:\"\"}.tgico-username:before{content:\"\"}.tgico-videocamera_filled:before{content:\"\"}.tgico-videocamera:before{content:\"\"}.tgico-videochat:before{content:\"\"}.tgico-zoomin:before{content:\"\"}.tgico-zoomout:before{content:\"\"}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.6a45f609a7a2d67d16ff.bundle.js.map b/public/main.6a45f609a7a2d67d16ff.bundle.js.map deleted file mode 100644 index 0f25bc7cd..000000000 --- a/public/main.6a45f609a7a2d67d16ff.bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/environment/userAgent.ts","webpack:///./src/environment/touchSupport.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack:///./src/helpers/dom/fixSafariStickyInput.ts","webpack:///./src/helpers/dom/cancelEvent.ts","webpack:///./src/helpers/dom/findUpClassName.ts","webpack:///./src/helpers/dom/blurActiveElement.ts","webpack:///./src/config/app.ts","webpack:///./src/helpers/dom/loadFonts.ts","webpack:///./src/environment/emojiSupport.ts","webpack:///./src/index.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","9","jsonpScriptSrc","__webpack_require__","p","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","error","Error","script","loadScript","src","retries","onScriptComplete","document","createElement","charset","timeout","nc","setAttribute","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","cacheBust","Date","now","retryScript","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","this","oldJsonpFunction","slice","s","USER_AGENT","navigator","userAgent","IS_APPLE","search","IS_ANDROID","toLowerCase","indexOf","IS_CHROMIUM","test","vendor","IS_APPLE_MOBILE","platform","maxTouchPoints","MSStream","IS_SAFARI","match","IS_FIREFOX","IS_MOBILE_SAFARI","IS_MOBILE","IS_TOUCH_SUPPORTED","window","DocumentTouch","ctx","self","IS_STICKY_INPUT_BUGGED","startY","capture","passive","onTouchMove","touch","touches","scrollable","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","Math","round","preventDefault","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","activeElement","blur","fixSafariStickyInputFocusing","input","add","fixSafariStickyInput","style","transform","focus","cancelEvent","originalEvent","stopPropagation","returnValue","cancelBubble","findUpClassName","el","className","closest","blurActiveElement","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","location","hostname","suffix","loadFonts","race","map","font","fonts","load","IS_EMOJI_SUPPORTED","Element","toggleAttribute","force","hasAttribute","removeAttribute","w","visualViewport","lastVH","setViewportVH","setVH","vh","rootScope","default","isOverlayActive","height","innerHeight","touchSupport","documentElement","setProperty","workerProxy","Proxy","Worker","construct","args","_","appStateManager","I18n","__","toggleResizeMode","tabId","wasTabId","tagName","perf","performance","langPromise","getCacheLangPack","state","getState","fadeInWhenFontsReady","elem","opacity","then","requestAnimationFrame","setTimeFormat","settings","timeFormat","setThemeListener","appVersion","getLangPack","lang_code","log","authState","getElementById","pagePromise","querySelector","placeholder","prepend","append","cloneNode","meModule","pushModule","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","ready","ripple","Array","from","getElementsByClassName","forEach"],"mappings":"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","file":"main.6a45f609a7a2d67d16ff.bundle.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t9: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"10\":\"npm.qr-code-styling\"}[chunkId]||chunkId) + \".\" + {\"0\":\"e35d290837b4c624b83e\",\"1\":\"3982babdf2d0e2fda6f3\",\"2\":\"935038cc2873713ebe19\",\"3\":\"bdf444277e969e63a4c3\",\"4\":\"6b5dd97948b29c598f75\",\"5\":\"faa04da46f838e65acdf\",\"6\":\"7dba74a574616a20ac7d\",\"7\":\"52c0a0f3b6f476d2bcec\",\"8\":\"cbbad398924d87521a47\",\"10\":\"c53238820878551c10bf\",\"11\":\"4cedf32c13708a0f972d\",\"12\":\"3862167550311cfa0c62\",\"13\":\"a60e06bd2a9f185ee65e\",\"14\":\"97bef6a6862c0bc097eb\",\"15\":\"e91ef68debad566c74d5\",\"16\":\"8f20a4414cdceb869a1b\",\"17\":\"e503493b3028be8a4735\",\"18\":\"781d3d503cc3c4f5b47e\",\"19\":\"96f69841477e2045dbd5\",\"20\":\"a35ba2852f47b30df3d5\",\"21\":\"3aef9bc049fb6abb3cd5\",\"22\":\"0606c021aacfc21418bd\",\"23\":\"e3145c0ea9684176558f\",\"24\":\"8835e4abc95acb08dcd5\",\"25\":\"8300e3ae1cb91fc2bed3\",\"26\":\"27b86f0f8f80f7f420ab\",\"27\":\"1bfe793cc702c7aa75db\",\"28\":\"b17aefb7c51046ff48ec\",\"29\":\"08bf9f3c8b9be9d555f9\",\"30\":\"0ba6f57fe3c460b08e24\",\"31\":\"623be4e5a35a57db3b0c\"}[chunkId] + \".chunk.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tfunction loadScript(src, retries) {\n \t\t\t\t var script = document.createElement('script');\n \t\t\t\t var retryAttempt = 999999 - retries + 1;\n \t\t\t\t var retryAttemptString = '&retry-attempt=' + retryAttempt;\n \t\t\t\t var onScriptComplete;\n\n \t\t\t\t script.charset = 'utf-8';\n \t\t\t\t script.timeout = 120;\n \t\t\t\t if (__webpack_require__.nc) {\n \t\t\t\t script.setAttribute('nonce', __webpack_require__.nc);\n \t\t\t\t }\n \t\t\t\t script.src = src;\n\n \t\t\t\t onScriptComplete = function(event) {\n \t\t\t\t // avoid mem leaks in IE.\n \t\t\t\t script.onerror = script.onload = null;\n \t\t\t\t clearTimeout(timeout);\n \t\t\t\t var chunk = installedChunks[chunkId];\n \t\t\t\t if (chunk !== 0) {\n \t\t\t\t if (chunk) {\n \t\t\t\t if (retries === 0) {\n \t\t\t\t var errorType =\n \t\t\t\t event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t var realSrc = event && event.target && event.target.src;\n \t\t\t\t error.message =\n \t\t\t\t 'Loading chunk ' +\n \t\t\t\t chunkId +\n \t\t\t\t ' failed after 999999 retries.\\n(' +\n \t\t\t\t errorType +\n \t\t\t\t ': ' +\n \t\t\t\t realSrc +\n \t\t\t\t ')';\n \t\t\t\t error.name = 'ChunkLoadError';\n \t\t\t\t error.type = errorType;\n \t\t\t\t error.request = realSrc;\n \t\t\t\t chunk[1](error);\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t } else {\n \t\t\t\t setTimeout(function() {\n \t\t\t\t var cacheBust = (function() {\n \t\t\t\t return Date.now();\n \t\t\t\t })();\n \t\t\t\t +retryAttemptString;\n \t\t\t\t var retryScript = loadScript(\n \t\t\t\t jsonpScriptSrc(chunkId) + '?' + cacheBust,\n \t\t\t\t retries - 1\n \t\t\t\t );\n \t\t\t\t document.head.appendChild(retryScript);\n \t\t\t\t }, 0);\n \t\t\t\t }\n \t\t\t\t } else {\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t }\n \t\t\t\t }\n \t\t\t\t };\n \t\t\t\t var timeout = setTimeout(function() {\n \t\t\t\t onScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t }, 120000);\n \t\t\t\t script.onerror = script.onload = onScriptComplete;\n \t\t\t\t return script;\n \t\t\t\t}\n\n \t\t\t\tvar script = loadScript(jsonpScriptSrc(chunkId), 999999);\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = this[\"webpackJsonp\"] = this[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 11);\n","/*\r\n * https://github.com/morethanwords/tweb\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// @ts-ignore\r\nexport const IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport { IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\nimport findUpClassName from \"./findUpClassName\";\nimport fixSafariStickyInput from \"./fixSafariStickyInput\";\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n let key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n //console.log('touchmove y', touch[key], startY);\n \n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n //const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n //console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n //console.log('touchmove no scrollable', e, touch);\n }\n\n //if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n \n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n \n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n \n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement && \n document.activeElement.classList.contains('is-sticky-input-bugged') && \n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\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 //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 }, 0);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport 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: any, className: string): HTMLElement {\r\n return el.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\nexport default function blurActiveElement() {\r\n if(document.activeElement && (document.activeElement as HTMLInputElement).blur) {\r\n (document.activeElement as HTMLInputElement).blur();\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.3.7',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nlet promise: Promise;\r\nexport default function loadFonts(): Promise {\r\n if(promise) return promise;\r\n return promise = 'fonts' in document ? \r\n Promise.race([\r\n // @ts-ignore\r\n Promise.all(['400 1rem Roboto', '500 1rem Roboto', '500 1rem tgico'].map(font => document.fonts.load(font))),\r\n new Promise((resolve) => setTimeout(resolve, 1e3))\r\n ]) : \r\n Promise.resolve();\r\n}\r\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\r\n\r\nexport default IS_EMOJI_SUPPORTED;","/*\n * 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_MOBILE_SAFARI } from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport './scss/tgico.scss';\n/* import { computeCheck } from './lib/crypto/srp';\nimport { salt1, salt2, g, p, srp_id, secure_random, srp_B, password } from './mock/srp'; */\n\n//console.log('pineapples are in my head');\n\n/* console.time('get storage1');\nimport * as a from './lib/config';\nimport * as b from './lib/mtproto/mtproto_config';\nimport * as c from './helpers/userAgent';\nimport * as d from './lib/mtproto/mtprotoworker';\nimport * as e from './lib/polyfill';\nimport * as f from './lib/storage';\na && b && c && d && e && f;\nconsole.timeEnd('get storage1'); */\n\n/* Promise.all([\n import('./components/pageIm'),\n import('./components/pageSignIn'),\n import('./components/misc'),\n import('./lib/storage')\n]).then(imports => {\n let [pageIm, pageSignIn, misc, AppStorage] = imports; */\n\n document.addEventListener('DOMContentLoaded', async() => {\n //let socket = new Socket(2);\n\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 // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n // @ts-ignore\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n // @ts-ignore\n const vh = (setViewportVH && !rootScope.default.isOverlayActive ? w.height || w.innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(touchSupport.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 // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n //console.log(target, args);\n const url = args[0] + location.search;\n\n return new target(url);\n }\n };\n \n const workerProxy = new Proxy(Worker, workerHandler);\n Worker = workerProxy;\n\n 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 //console.timeEnd('get storage');\n\n window.addEventListener('resize', setVH);\n setVH();\n\n //console.log(new Uint8Array([255, 200, 145]).hex);\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !rootScope.default.isOverlayActive;\n setVH();\n \n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n \n let tabId: number;\n rootScope.default.addEventListener('im_tab_change', (id) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n \n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n });\n \n rootScope.default.addEventListener('overlay_toggle', () => {\n toggleResizeMode();\n });\n }\n\n if(userAgent.IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === \"IMG\") {\n e.preventDefault();\n return false;\n }\n });\n\n if(userAgent.IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox');\n }\n\n if(userAgent.IS_APPLE) {\n if(userAgent.IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n \n document.documentElement.classList.add('emoji-supported');\n\n if(userAgent.IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(userAgent.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(!touchSupport.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 /* if(config.isServiceWorkerSupported) {\n await navigator.serviceWorker.ready;\n navigator.serviceWorker.controller ? true : await new Promise((resolve, reject) => {\n navigator.serviceWorker.addEventListener('controllerchange', resolve);\n });\n } */\n \n //console.time('get storage');\n\n const perf = performance.now();\n\n //import('./vendor/dateFormat');\n\n const langPromise = I18n.default.getCacheLangPack();\n\n const [state, langPack] = await Promise.all([\n appStateManager.default.getState(), \n langPromise\n ]);\n //I18n.getCacheLangPack();\n //console.log('got auth:', auth);\n //console.timeEnd('get storage');\n\n I18n.default.setTimeFormat(state.settings.timeFormat);\n\n rootScope.default.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.default.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n const authState = state.authState;\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!touchSupport.IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n \n }\n\n let pagePromise: Promise;\n //langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn': \n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr': \n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n }\n //});\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ? \n Promise.race([\n new Promise((resolve) => setTimeout(resolve, 1e3)), \n // @ts-ignore\n document.fonts.ready\n ]) : \n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* computeCheck(password, {\n current_algo: {\n salt1, \n salt2,\n p,\n g\n },\n srp_id,\n srp_B,\n secure_random,\n }).then(res => {\n console.log(res);\n }); */\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\t\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pageSignQR')).default.mount();\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pagePassword')).default.mount();\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\t\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n //getNearestDc();\n }\n\n const ripple = (await import('./components/ripple')).ripple;\n (Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\n });\n//});\n\n\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.e47f94920a4918a10f5a.css b/public/main.e47f94920a4918a10f5a.css deleted file mode 100644 index d53f5aec5..000000000 --- a/public/main.e47f94920a4918a10f5a.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{text-decoration:none;-webkit-tap-highlight-color:transparent}img,video{-webkit-user-drag:none}.valign-wrapper{display:flex;align-items:center}.z-depth-0{box-shadow:none !important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none !important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition{transition:none !important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start !important}.justify-self-start{justify-self:flex-start !important}.justify-self-end{justify-self:flex-end !important}.position-center{position:absolute !important;left:50%;top:50%;transform:translate(-50%, -50%)}.text-bold{font-weight:500 !important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap !important}.no-border-radius{border-radius:0 !important}.disable-hover{pointer-events:none !important}a{text-decoration:none}html{line-height:1.5;font-weight:normal}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}pre,code{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word} -:root{--vh: 1vh;--z-below: -1;--hover-alpha: 0.08;--transition-standard-easing: cubic-bezier(.4, .0, .2, 1);--transition-standard-in-time: .3s;--transition-standard-out-time: .25s;--transition-standard-in: var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out: var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition: .2s ease-in-out;--layer-transition: .2s cubic-bezier(.4, .0, .2, 1);--slide-header-transition: .4s ease-in-out;--tabs-transition: .25s ease-in-out;--btn-menu-transition: .2s cubic-bezier(.4, 0, .2, 1);--esg-transition: var(--btn-menu-transition);--popup-transition-function: cubic-bezier(.4, 0, .2, 1);--popup-transition-time: .15s;--btn-corner-transition: .2s cubic-bezier(.34, 1.56, .64, 1);--chatlist-badge-transition-in: .2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out: .2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin: 5.5625rem;--message-beside-button-size: 2.375rem;--message-beside-button-margin: calc((var(--message-beside-button-size) + .5rem) * -1);--message-time-background: rgba(0, 0, 0, .35);--message-highlightning-color: hsla(85.5319, 36.9171%, 40.402%, .4);--messages-container-width: 728px;--messages-text-size: 16px;--messages-secondary-text-size: calc(var(--messages-text-size) - 2px);--line-height: 1.3125;--esg-sticker-size: 80px;--disabled-opacity: .3;--round-video-size: 280px;--peer-avatar-red-top: #ff885e;--peer-avatar-red-bottom: #ff516a;--peer-avatar-orange-top: #ffcd6a;--peer-avatar-orange-bottom: #ffa85c;--peer-avatar-violet-top: #82b1ff;--peer-avatar-violet-bottom: #665fff;--peer-avatar-green-top: #a0de7e;--peer-avatar-green-bottom: #54cb68;--peer-avatar-cyan-top: #53edd6;--peer-avatar-cyan-bottom: #28c9b7;--peer-avatar-blue-top: #72d5fd;--peer-avatar-blue-bottom: #2a9ef1;--peer-avatar-pink-top: #e0a2f3;--peer-avatar-pink-bottom: #d669ed}@media only screen and (max-width: 600px){:root{--right-column-width: 100vw;--esg-sticker-size: 68px;--round-video-size: 200px;--chat-input-size: 2.875rem;--chat-input-padding: 0.5rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 601px){:root{--right-column-width: calc(1680px / 4);--chat-input-size: 3.375rem;--chat-input-padding: 0.8125rem;--chat-input-inner-padding: 0.5rem}}@media only screen and (max-height: 569px){:root{--chat-input-size: 2.875rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 1276px)and (max-width: 1680px){:root{--right-column-width: 25vw}}:root{--body-background-color: #fff;--background-color-true: #f4f4f5;--background-color: #fff;--border-color: #dfe1e5;--surface-color: #fff;--scrollbar-color: rgba(0, 0, 0, .2);--input-search-background-color: #fff;--input-search-border-color: #dfe1e5;--primary-color: #3390ec;--light-primary-color: rgba(51, 144, 236, 0.08);--dark-primary-color: #157ce1;--primary-text-color: #000;--secondary-color: #c4c9cc;--secondary-text-color: #707579;--light-secondary-text-color: rgba(112, 117, 121, 0.08);--danger-color: #df3f40;--light-danger-color: rgba(223, 63, 64, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-blue-top);--avatar-color-bottom: var(--peer-avatar-blue-bottom);--chatlist-status-color: var(--avatar-online-color);--chatlist-pinned-color: #a2abb2;--badge-text-color: #fff;--link-color: #00488f;--ripple-color: rgba(0, 0, 0, .08);--poll-circle-color: var(--border-color);--message-background-color: var(--surface-color);--message-checkbox-color: #61c642;--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #eeffde;--light-message-out-background-color: rgba(238, 255, 222, 0.08);--dark-message-out-background-color: #d9ffb5;--message-out-link-color: var(--link-color);--message-out-primary-color: #4fae4e;--message-out-status-color: var(--message-out-primary-color);--message-out-audio-play-button-color: #fff}html.night{--body-background-color: #181818;--background-color-true: #181818;--background-color: #212121;--border-color: #0f0f0f;--surface-color: #212121;--scrollbar-color: rgba(255, 255, 255, .2);--input-search-background-color: #181818;--input-search-border-color: #2f2f2f;--primary-color: #8774E1;--light-primary-color: rgba(135, 116, 225, 0.08);--dark-primary-color: #6a52da;--primary-text-color: #fff;--secondary-color: #707579;--secondary-text-color: #aaaaaa;--light-secondary-text-color: rgba(170, 170, 170, 0.08);--danger-color: #ff595a;--light-danger-color: rgba(255, 89, 90, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-violet-top);--avatar-color-bottom: var(--peer-avatar-violet-bottom);--chatlist-status-color: var(--primary-color);--chatlist-pinned-color: var(--secondary-color);--badge-text-color: #fff;--link-color: var(--primary-color);--ripple-color: rgba(255, 255, 255, .08);--poll-circle-color: #fff;--message-background-color: var(--surface-color);--message-checkbox-color: var(--primary-color);--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #8774E1;--light-message-out-background-color: rgba(135, 116, 225, 0.08);--dark-message-out-background-color: #6a52da;--message-out-link-color: #fff;--message-out-primary-color: #fff;--message-out-status-color: rgba(255, 255, 255, .6);--message-out-audio-play-button-color: var(--message-out-background-color)}.input-wrapper{width:360px;margin:0 auto}.input-field{--height: 54px;--border-radius: 10px;position:relative}@media only screen and (max-width: 600px){.input-field{--height: 50px}}.input-field .arrow-down{position:absolute;content:" ";top:50%;bottom:0;right:21px;cursor:pointer;height:0;width:0;border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;display:inline-block;padding:5px;vertical-align:middle;z-index:2;margin-top:-9px;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:.2s all}.input-field label{position:absolute;color:#9e9e9e;top:0;left:1rem;right:auto;z-index:2;height:1.5rem;transform:translate(0, 0);background-color:#fff;background-color:var(--surface-color);transform-origin:left center;pointer-events:none;margin-top:calc((var(--height) - 1.5rem) / 2);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-2 .input-field label{transition:.2s transform,.2s padding,.1s opacity,font-weight 0s .1s}.input-field-border{position:absolute;top:0;right:0;bottom:0;left:0;border:2px solid #3390ec;border:2px solid var(--primary-color);opacity:0;border-radius:var(--border-radius);pointer-events:none;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding: 1rem;--padding-horizontal: 1rem;--border-width: 1px;border:var(--border-width) solid #dfe1e5;border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);background-color:#fff;background-color:var(--surface-color);padding:calc(var(--padding) - var(--border-width));box-sizing:border-box;width:100%;min-height:var(--height);transition:0s border-color;position:relative;z-index:1;line-height:1.3125;line-height:var(--line-height)}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{-webkit-box-shadow:0 0 0px 1000px #fff inset;-webkit-box-shadow:0 0 0px 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill::first-line,.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{font-family:"Roboto",-apple-system,apple color emoji,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif !important;font-size:1rem !important;color:#000 !important;color:var(--primary-text-color) !important}@media only screen and (max-width: 600px){.input-field-input{--padding: .9375rem}}body.animation-level-0 .input-field-input{transition:none !important}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:.2s border-color}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40 !important;color:var(--danger-color) !important}.input-field-input.error~.input-field-border{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f !important}.input-field-input.valid~.input-field-border{border-color:#26962f !important}.input-field-input:focus~.arrow-down{margin-top:-4px;transform:rotate(225deg);border-color:#3390ec;border-color:var(--primary-color)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:focus~label,.input-field-input:valid~label,.input-field-input:not(:empty)~label,.input-field-input:disabled~label{transform:translate(-0.25rem, calc(var(--height) / -2 + .125rem)) scale(0.75);padding:0 6px;opacity:1}.input-field-input-fake{opacity:0;pointer-events:none;position:absolute !important;top:0;left:0;bottom:auto !important;right:auto !important;height:auto !important;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}input:focus,button:focus{outline:none}.input-clear{outline:none;border:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40 !important;color:var(--danger-color) !important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}.input-search{position:relative;width:100%;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;--border-radius: 22px}@media only screen and (max-width: 600px){.input-search{margin-left:1rem}}.input-search-input{--height: 42px;background-color:#fff;background-color:var(--input-search-background-color);padding:0px calc(var(--height) + 3px - var(--border-width));height:var(--height);min-height:var(--height) !important;max-height:var(--height) !important;border-color:#dfe1e5;border-color:var(--input-search-border-color);line-height:var(--height)}body.animation-level-2 .input-search-input{transition:background-color .2s ease-in-out,border-color .2s ease-in-out}html.no-touch .input-search-input:hover:not(:focus),html.no-touch .input-search-input:active:not(:focus){border-color:#c4c9cc !important;border-color:var(--secondary-color) !important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:hover,html.no-touch .input-search-input:focus~.btn-icon:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{position:absolute;top:50%;transform:translate(0, -50%);text-align:center;font-size:24px;color:#707579;color:var(--secondary-text-color);opacity:.6;line-height:1;z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{width:24px;height:24px;left:.8125rem;pointer-events:none}.input-search>.tgico-close{right:0px;z-index:1;width:42px;height:42px}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{padding-right:2.5rem;max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-size:2.25rem;padding-left:calc(.875rem - var(--border-width))}@media(-webkit-min-device-pixel-ratio: 2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{position:absolute;right:.375rem;z-index:2;font-size:1.5rem;color:#9e9e9e;cursor:pointer;transition:color .2s;padding:.5rem;display:flex;align-items:center;justify-content:center;top:50%;transform:translateY(-50%)}.input-field-password .toggle-visible:before{content:""}.input-field-password .toggle-visible.eye-hidden:before{content:""}html.no-touch .input-field-password .toggle-visible:hover,html.no-touch .input-field-password .toggle-visible:active{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing: .24px}.input-field-phone .input-field-input:after{content:attr(data-left-pattern);color:#9e9e9e;letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;outline:none;border:none;cursor:pointer}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn:hover,html.no-touch .btn:active,html.no-touch .btn-icon:hover,html.no-touch .btn-icon:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn.primary:hover,html.no-touch .btn.primary:active,html.no-touch .btn.blue:hover,html.no-touch .btn.blue:active,html.no-touch .btn.active:hover,html.no-touch .btn.active:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn-icon.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn:disabled,.btn-icon:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{text-align:center;font-size:1.5rem;line-height:1;border-radius:50% !important;color:#707579;color:var(--secondary-text-color);background-color:transparent;border:none;padding:.5rem;position:relative;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out;display:flex;align-items:center;justify-content:center}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset: 1.25rem;--translateY: calc(54px + var(--offset));position:absolute !important;bottom:var(--offset);right:var(--offset);transition:transform .2s cubic-bezier(.34, 1.56, .64, 1) !important;transition:transform var(--btn-corner-transition) !important;transform:translate3d(0, var(--translateY), 0);z-index:3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#3390ec;background-color:var(--primary-color);text-align:center;font-size:1.5rem;color:#fff;border:none;outline:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0 !important}.btn-corner.is-visible{--translateY: 0}body.animation-level-0 .btn-corner{transition:none !important}.btn-corner:disabled{opacity:1 !important;pointer-events:all !important}.btn-corner .preloader-circular{width:2.5rem;height:2.5rem}.btn-menu{visibility:hidden;position:absolute;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 2px 8px 1px rgba(0,0,0,.24);z-index:3;top:100%;padding:.5rem 0;border-radius:10px;opacity:0;transform:scale(0.8);transition:opacity .2s cubic-bezier(.4, 0, .2, 1),transform .2s cubic-bezier(.4, 0, .2, 1),visibility .2s cubic-bezier(.4, 0, .2, 1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);font-size:16px;-webkit-user-select:none;-webkit-touch-callout:none}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{visibility:visible;opacity:1;transform:scale3d(1, 1, 1)}.btn-menu:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none !important}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{top:auto;top:initial;right:0;bottom:100%;transform-origin:bottom right}.btn-menu.top-right{top:auto;top:initial;left:0;bottom:100%;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{display:flex;position:relative;padding:0 40px 0 1rem;height:56px;cursor:pointer !important;pointer-events:all !important;color:#000;color:var(--primary-text-color);text-transform:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;align-items:center;text-align:left;line-height:1.3125;line-height:var(--line-height)}html.no-touch .btn-menu-item:hover,html.no-touch .btn-menu-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:hover,html.no-touch .btn-menu-item.danger:active{background-color:danger}.btn-menu-item:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}@media only screen and (max-width: 600px){.btn-menu-item{padding:0 30px 0 16px;height:50px}}.btn-menu-item-text{flex:1 1 auto}.btn-menu-overlay{position:fixed !important;left:0;right:0;top:0;bottom:0;z-index:3;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-menu-overlay{left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;width:auto !important;max-width:none !important}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{height:2.5rem;background:#f4f4f5;background:var(--background-color-true);display:flex;align-items:center;justify-content:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;font-size:.875rem;color:currentColor}.btn-menu hr{padding:0;margin:.5rem 0}.btn-primary{border-radius:10px;width:100%;text-align:center;height:54px;border:none;font-weight:500;cursor:pointer;overflow:hidden;position:relative;padding:0;transition:.2s opacity}html.no-touch .btn-primary:hover,html.no-touch .btn-primary:active{transition:.2s background-color,.2s opacity;background:#157ce1;background:var(--dark-primary-color)}.btn-primary-transparent{color:#3390ec;color:var(--primary-color);background-color:transparent}html.no-touch .btn-primary-transparent:hover,html.no-touch .btn-primary-transparent:active{background:rgba(51, 144, 236, 0.08);background:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:hover,html.no-touch .btn-primary-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary>svg,.btn-primary use{height:calc(100% - 20px);right:15px;left:auto}.btn-primary:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-control{width:auto;height:40px;align-items:center;margin:15px auto 1rem;border-radius:20px;padding:0 24px 0 12px;display:flex}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{color:#000;color:var(--primary-text-color);background-color:transparent;display:flex;align-items:center;padding:0 1rem;height:3.5rem;font-weight:normal;line-height:1.3125}@media only screen and (max-width: 600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:hover,html.no-touch .btn-transparent:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:hover,html.no-touch .btn-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);right:auto;left:auto;margin:0;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{position:relative;overflow:visible !important;font-weight:normal !important;cursor:pointer !important;pointer-events:all !important}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size: 54px;border-radius:50%;height:var(--size);width:var(--size);line-height:var(--size)}@media only screen and (max-width: 600px){.btn-circle{--size: 46px}}.btn-circle path{fill:#fff}.btn-disabled{pointer-events:none !important;cursor:default !important;color:#707579 !important;color:var(--secondary-text-color) !important}.btn-disabled:before{color:inherit !important}.btn-secondary:not(:first-child){margin-top:.5rem !important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.animated-close-icon{position:absolute;transform:rotate(-45deg);pointer-events:none}.animated-close-icon,.animated-close-icon:before,.animated-close-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color)}.animated-close-icon:before,.animated-close-icon:after{position:absolute;left:0;top:0;content:""}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:before,body.animation-level-2 .animated-close-icon:after{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}body.animation-level-2 .animated-close-icon.no-transition,body.animation-level-2 .animated-close-icon.no-transition:before,body.animation-level-2 .animated-close-icon.no-transition:after{transition:none}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translateY(-0.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translateY(0.375rem)}.animated-menu-icon{position:absolute}.animated-menu-icon,.animated-menu-icon:before,.animated-menu-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color);transform:rotate(0)}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:before,body.animation-level-2 .animated-menu-icon:after{transition:transform .25s}.animated-menu-icon:before,.animated-menu-icon:after{position:absolute;left:0;content:""}.animated-menu-icon:before{top:-0.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem)}.animated-button-icon>.tgico{position:absolute;height:24px;line-height:24px}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s forwards ease-in-out;animation:hide-icon .4s forwards ease-in-out}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden;-webkit-animation:none !important;animation:none !important}.autocomplete-helper{--border-radius: 10px;position:absolute !important;bottom:calc(100% + .5rem);overflow:hidden;padding:0 !important;border-radius:var(--border-radius) !important;max-width:100%;left:0;width:auto !important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width: 319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal) * 4)}}.autocomplete-peer-helper .scrollable{position:relative;max-height:232px}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{height:3.125rem;display:flex;padding:0 2.125rem 0 .75rem;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{margin-left:.875rem;font-weight:500;flex:0 0 auto}.autocomplete-peer-helper-list-element-description{margin-left:.5625rem;color:#707579;color:var(--secondary-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;font-weight:500;color:#fff;color:var(--badge-text-color);font-size:.875rem;text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;min-width:1.25rem;line-height:1.25rem !important;padding:0 .375rem}.badge-24{height:1.5rem;min-width:1.5rem;line-height:1.5rem !important;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:100%;width:100%;z-index:10000000;background:#000;border-radius:0 !important;display:flex}.ckin__player.ckin__fullscreen video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.ckin__player .time{margin-left:.875rem;font-size:.875rem;color:#fff}@media only screen and (max-width: 600px){.ckin__player .time{margin-left:1.125rem}}.default{position:relative;font-size:0;display:flex;align-items:center;justify-content:center}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;line-height:1;color:#fff;text-align:center;outline:0;padding:0;cursor:pointer;position:absolute;opacity:1;visibility:visible;top:50%;left:50%;transform:translate3d(-50%, -50%, 0) scale(1);font-size:4rem;touch-action:manipulation}body.animation-level-2 .default__button--big{transition:visibility .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1);transition:visibility var(--layer-transition),opacity var(--layer-transition)}@media only screen and (max-width: 600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default__controls{position:absolute;bottom:0;right:0;left:0;text-align:left;direction:ltr;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}.default__controls .progress-line{margin:0 16px;border-radius:var(--border-radius)}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:rgba(255,255,255,.38)}@media only screen and (max-width: 600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{height:49px;padding-top:93px;bottom:0;z-index:2;background-position:bottom;width:100%;position:absolute;background-repeat:repeat-x;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);pointer-events:none}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}@media only screen and (max-width: 600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:""}.default .default__gradient-bottom{transform:translate3d(0, 50px, 0)}.default .default__controls{transform:translate3d(0, 52px, 0)}@media only screen and (max-width: 600px){.default .default__controls{transform:translate3d(0, 65px, 0)}}.default.show-controls .default__gradient-bottom,.default.show-controls .default__controls{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:""}.default .player-volume{margin:0 .125rem 0 .625rem;display:flex;align-items:center}html.is-touch .default .player-volume{display:none}.default .player-volume__icon{fill:#fff;width:2.25rem;height:2.25rem;margin-right:.5rem;cursor:pointer;padding:.375rem}.default .player-volume .progress-line{--color: #fff;margin:0;width:50px;--thumb-size: 15px}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none !important}video::-webkit-media-controls-enclosure{display:none !important}.progress-line{--color: var(--primary-color);--height: 5px;--border-radius: 6px;--thumb-size: 13px;border-radius:var(--border-radius);height:var(--height);position:relative;cursor:pointer}.progress-line:before{position:absolute;left:0;top:0;right:0;bottom:0;display:block;content:" ";border-radius:inherit}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;width:100%;cursor:pointer;padding:0;margin:0;outline:none;caret-color:var(--color);position:absolute;top:-0.5rem;bottom:-0.5rem}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;width:0;height:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{content:" ";display:block;height:var(--thumb-size);width:var(--thumb-size);border-radius:50%;background-color:var(--color);cursor:pointer;position:absolute;right:0;top:50%;transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1.25)}.progress-line__loaded,.progress-line:before{opacity:.3;background-color:#c4c9cc;background-color:var(--secondary-color)}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);position:absolute;top:0;bottom:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{width:100%;transform-origin:left center}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;color:none;border:none}input[type=range]::-ms-thumb{visibility:hidden}input[type=range]::-ms-tooltip{visibility:hidden}.left-controls,.right-controls{display:flex;align-items:center}.bottom-controls{padding:0 .625rem;height:2.25rem;display:flex;justify-content:space-between;align-items:center}@media only screen and (max-width: 600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size: 1.25rem;margin:1.5rem 1.1875rem;display:block;text-align:left;position:relative;cursor:pointer;min-width:var(--size);min-height:var(--size)}body.animation-level-2 .checkbox-field{transition:.2s opacity}.checkbox-field.checkbox-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width: 600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{position:absolute;left:0;top:50%;transform:translateY(-50%);width:var(--size);height:var(--size);border-radius:.25rem;overflow:hidden}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.checkbox-field .checkbox-box-check,.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border{position:absolute;top:0;left:0}.checkbox-field .checkbox-box-border{right:0;bottom:0;border-radius:inherit;border:2px solid #8d969c}.checkbox-field .checkbox-box-background{top:-15%;right:-15%;bottom:-15%;left:-15%;background-color:#3390ec;background-color:var(--primary-color);transform:scale(1);border-radius:50%;transition:transform .2s 0s ease-in-out}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none !important}.checkbox-field .checkbox-box-check{--offset: 3px;width:calc(var(--size) - var(--offset));height:calc(var(--size) - var(--offset));top:50%;left:50%;transform:translate(-50%, -50%)}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s .15s ease-in-out,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none !important}.checkbox-field .checkbox-caption{position:relative;padding-left:3.375rem;cursor:pointer;display:inline-block;min-height:24px;margin-top:1px;line-height:26px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:.2s opacity;color:#000;color:var(--primary-text-color)}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin-left:0;margin-right:0}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{overflow:hidden;border-radius:10px}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size: 1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{top:0;right:0;bottom:0;left:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset: calc(var(--size) - (var(--size) / 2 + .125rem))}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size: 1.375rem;position:relative;text-align:left;margin:1.25rem 0;line-height:1.3125;cursor:pointer}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main::before,.radio-field.hidden-widget .radio-field-main::after{visibility:hidden}.radio-field>input:checked~.radio-field-main::before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main::after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{padding-left:3.5rem;position:relative;color:#000;color:var(--primary-text-color)}.radio-field .radio-field-main::before,.radio-field .radio-field-main::after{content:"";display:block;position:absolute;left:0;top:50%;width:var(--size);height:var(--size);transform:translateY(-50%)}.radio-field .radio-field-main::before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main::before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main::after{left:.3125rem;width:.75rem;height:.75rem;border-radius:50%;background:#3390ec;background:var(--primary-color);transform:translateY(-50%) scale(0);transform-origin:center}body.animation-level-2 .radio-field .radio-field-main::after{transition:transform .1s ease}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0;opacity:0;z-index:-1;z-index:var(--z-below);position:absolute}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;visibility:hidden;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transition:transform .2s .05s ease-in-out;transform:scale(0)}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none !important;transition:background-color .2s !important}.checkbox-field-restriction .checkbox-box-check use{visibility:visible !important;stroke-dasharray:24.19,24.19 !important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out !important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{transform:rotate(45deg) translateY(-10px);stroke-dashoffset:35.5}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size: 20px;margin:0 .3125rem;padding:0;display:flex;align-items:center;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset: 3px;--toggle-width: 1.9375rem;width:var(--toggle-width);height:.875rem;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;position:relative;display:flex;align-items:center;margin:0 var(--offset)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{width:1.25rem;height:1.25rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);background-color:#fff;background-color:var(--surface-color);content:" ";transform:translateX(calc(var(--offset) * -1));border-radius:50%;position:absolute}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width: 600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{width:100%;padding:1rem 0 .5rem;margin-bottom:17px}@media only screen and (max-width: 600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);padding:0 23px;padding-bottom:1rem;font-weight:500;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width: 600px){.chatlist-container .search-group__name{padding:5px 9px 0 16px;font-size:15px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width: 600px){.chatlist-container .search-group-contacts{padding:0px 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0 5px !important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0px;padding:4px 0 0}.chatlist-container .search-super .search-group__name{padding-top:1rem;display:flex;justify-content:space-between}ul.chatlist{padding:0 .5rem}@media only screen and (max-width: 600px){ul.chatlist{padding:0}}.chatlist{margin:0;display:flex;flex-direction:column;position:relative;width:100%;background-color:#fff;background-color:var(--surface-color);-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.chatlist li{--background: unset;height:72px;border-radius:10px;display:flex;align-items:flex-start;flex-direction:row;position:relative;cursor:pointer;padding:.5625rem;overflow:hidden;background:var(--background)}@media only screen and (max-width: 600px){.chatlist li{border-radius:0}}html.no-touch .chatlist li:hover,html.no-touch .chatlist li:active{--background:var(--light-secondary-text-color)}.chatlist li.is-muted .user-title:after{flex:0 0 auto;content:"";color:#a2abb2;color:var(--chatlist-pinned-color);font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist li.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 li.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 li p{margin:0;display:flex;flex-direction:row;align-items:flex-start;height:27px}.chatlist li a{color:inherit}.chatlist li .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist li.menu-open{--background: var(--light-secondary-text-color)}@media only screen and (min-width: 601px){.chatlist li.active{--background: var(--primary-color) !important}.chatlist li.active .user-caption,.chatlist li.active .tgico-chatspinned:before,.chatlist li.active .user-title,.chatlist li.active .message-status,.chatlist li.active .text-highlight{color:#fff}.chatlist li.active b{color:#fff !important}.chatlist li.active .user-title:after{color:rgba(255,255,255,.7)}.chatlist li.active .verified-background{fill:#fff !important}.chatlist li.active .verified-check{fill:#3390ec !important;fill:var(--primary-color) !important}.chatlist li.active .dialog-avatar.is-online:after{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist li.active .badge.unread,.chatlist li.active .mention{background-color:#fff !important;color:#3390ec;color:var(--primary-color)}.chatlist li.active .peer-typing-container{--color: #fff}}.chatlist li span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:27px}.chatlist .peer-typing-container{--color: var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{font-size:.75rem;padding:1px 0px 0px 0px;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block !important;margin-top:4px;margin-right:-3px;margin-left:.5rem;flex:0 0 auto}body.animation-level-2 .chatlist .dialog-subtitle-badge{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}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-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)}.chatlist .dialog-subtitle-media{width:1.25rem;height:1.25rem;position:relative;flex:0 0 auto;border-radius:.1875rem;margin-top:-0.1875rem;margin-right:.375rem;display:inline-block;vertical-align:middle}.chatlist .dialog-subtitle-media .tgico-play{position:absolute;z-index:1;color:#fff;left:50%;top:50%;transform:translate(-50%, -50%);line-height:1;font-size:.625rem}.chatlist .dialog-subtitle-media .media-photo{width:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;border-radius:inherit}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{overflow:hidden;color:#707579;color:var(--secondary-text-color);flex:1 1 auto;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{display:flex !important;align-items:center}.chatlist .user-title img.emoji{vertical-align:top;margin-top:4px;width:18px;height:18px}.chatlist .user-last-message img.emoji{width:20px;height:20px;margin-top:-3px}.chatlist .user-title,.chatlist .user-last-message{flex-grow:1}.chatlist .user-title i,.chatlist .user-last-message i{font-style:normal}.chatlist .message-status{margin-right:.125rem;display:inline-block;vertical-align:middle;color:#0ac630;color:var(--chatlist-status-color);line-height:1;width:1.25rem;height:1.25rem;font-size:1.25rem;position:relative;margin-top:-0.0625rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{position:absolute;top:0;left:0}.chatlist .mention{padding:0;background-color:#0ac630 !important;background-color:var(--chatlist-status-color) !important}html.is-mac .chatlist .mention{line-height:22px !important}.chatlist .mention-badge{margin-right:-2px}.chatlist .unread,.chatlist .is-muted.backwards .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0;margin-top:-0.5rem}.chatlist-bottom .chatlist-new li{height:3.5rem}.chatlist-bottom .chatlist-new .user-caption{padding-left:1.125rem}.chatlist-bottom .chatlist-new .dialog-subtitle{margin-top:.0625rem}.chatlist-new li{height:4.5rem;padding:0 .75rem;align-items:center}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto !important}.chatlist-new span{line-height:1.3125 !important;line-height:var(--line-height) !important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container li,.search-group-contacts li{padding:.75rem}@media only screen and (max-width: 600px){.contacts-container li,.search-group-contacts li{height:66px;padding-top:9px;padding-bottom:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width: 600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-title,.contacts-container b,.contacts-container .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b,.search-group-contacts .user-last-message b{font-weight:normal}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width: 600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chat-input{--translateY: 0;--padding-bottom: 0.5rem;--bottom: var(--padding-bottom);display:flex;width:100%;max-width:100%;padding-top:.25rem;flex-direction:column;flex:0 0 auto;position:relative;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translate3d(0, var(--translateY), 0)}body.animation-level-0 .chat-input{transition:none !important}@media only screen and (min-height: 570px)and (min-width: 601px){.chat-input{max-width:728px !important;max-width:var(--messages-container-width) !important}}@media only screen and (min-width: 601px){.chat-input{--padding-bottom: 1.25rem}}@media only screen and (max-height: 569px){.chat-input{--padding-bottom: 0.5rem}}@media only screen and (min-width: 1276px){.chat-input{width:calc(100% - var(--right-column-width)) !important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0) !important}}.chat-input.is-hidden{--translateY: 100%;transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, var(--translateY), 0) !important;position:absolute !important;bottom:0}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY: 0}.chat-input .chat-input-container{--padding-horizontal: var(--chat-input-padding);display:flex;align-items:flex-end;justify-content:space-between;max-width:728px;max-width:var(--messages-container-width);margin:0 auto;width:100%;padding:0 var(--padding-horizontal);flex:0 0 auto;position:relative;padding-bottom:var(--bottom)}.chat-input .chat-input-container .btn-circle{width:var(--chat-input-size);height:var(--chat-input-size)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .menu-send{top:auto;bottom:calc(100% + .5rem)}.chat-input .input-message-input{background:none;border:none;width:100%;padding:.5rem .5625rem;margin-top:-1px;max-height:calc(30rem - 2.5rem);overflow-y:none;resize:none;border:none;outline:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height)}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height: 30rem){.chat-input .input-message-input{max-height:max(36px, calc(100vh - 10rem))}}@media only screen and (max-width: 600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{content:attr(data-inline-placeholder);color:#a2acb4;pointer-events:none}.chat-input .toggle-emoticons:before{content:""}html.is-ios .chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:"" !important}.chat-input .btn-record-cancel{visibility:hidden;opacity:0;transition:visibility 0s .1s,opacity .1s 0s;padding:0;z-index:3;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal) * -1 + -0.5rem))}body.animation-level-0 .chat-input .btn-record-cancel{transition:none !important}.chat-input .btn-scheduled:after{content:"";position:absolute;top:5px;right:5px;width:.5rem;height:.5rem;border-radius:50%;background:#61c642;background:var(--message-checkbox-color)}.chat-input .btn-preloader .preloader{width:1.5rem;height:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s forwards ease-in-out !important;animation:hide-icon .4s forwards ease-in-out !important}.chat-input .float{align-self:center;display:none !important;margin:0 .75rem 0 0 !important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.chat-input .float{margin-right:.125rem !important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex !important}.chat-input .btn-send-container{position:absolute;right:var(--padding-horizontal);bottom:0;padding-bottom:inherit}.chat-input .btn-icon{transition:.2s color,background-color .2s,.2s opacity}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{transition:.2s transform;color:#707579;color:var(--secondary-text-color);z-index:3}.chat-input .btn-send .tgico-send{color:#3390ec !important;color:var(--primary-color) !important}.chat-input .btn-send .tgico-check{color:#3390ec !important;color:var(--primary-color) !important;height:32px !important;font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:bold}.chat-input .btn-send .tgico-schedule{background-color:#3390ec;background-color:var(--primary-color);color:#fff;border-radius:50%;width:34px;height:34px;display:flex;align-items:center;justify-content:center}.chat-input .btn-send.send .tgico-send,.chat-input .btn-send.record .tgico-microphone,.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.schedule .tgico-schedule{visibility:visible !important}.chat-input .btn-send:not(.record) .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}body.animation-level-2 .chat-input .btn-send.send .tgico-send,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone,body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem;background-color:#fff !important;background-color:var(--surface-color) !important}.chat-input .record-time{height:44px;line-height:44px;display:none}.chat-input .record-time:after{content:" ";width:10px;height:10px;background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;margin:0 9px;display:inline-block}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{border-radius:50%;background-color:rgba(0,0,0,.2);width:240px;height:240px;transform:scale(0);position:absolute;top:-94px;left:-94px;transition:transform .03s ease-in-out,visibility .1s;visibility:hidden}body.animation-level-0 .chat-input .record-ripple{transition:none !important}@media only screen and (max-width: 600px){.chat-input .record-ripple{width:300px;height:300px;top:-124px;left:-124px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon{color:#c6cbce}.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording .btn-record-cancel{opacity:1;visibility:visible;transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording .btn-send,.chat-input.is-recording .btn-record-cancel{pointer-events:all}.chat-input.is-recording .rows-wrapper{width:calc(100% - (var(--chat-input-size) * 2 + 1rem))}.chat-input.is-recording .attach-file{display:none}.chat-input.is-recording .record-time{display:block}.chat-input.is-recording .record-ripple{transition:transform .03s,visibility 0s;visibility:visible}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0px}.chat-input .new-message-wrapper,.chat-input .pinned-container{opacity:1}body.animation-level-2 .chat-input .new-message-wrapper,body.animation-level-2 .chat-input .pinned-container{transition:opacity .1s 0s}.chat-input .pinned-container{width:auto}.chat-input .pinned-container-button{height:2.5rem;padding:0 .625rem}.bubbles.is-selecting~.chat-input .new-message-wrapper{pointer-events:none}.bubbles.is-selecting:not(.backwards)~.chat-input .new-message-wrapper,.bubbles.is-selecting:not(.backwards)~.chat-input .pinned-container{opacity:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting:not(.backwards)~.chat-input .rows-wrapper{max-height:var(--chat-input-size)}.bubbles.is-selecting:not(.backwards)~.chat-input .reply-wrapper{height:0 !important;opacity:0;pointer-events:none}.bubbles.is-selecting:not(.backwards)~.chat-input .btn-send{transform:scale(0)}body.animation-level-2 .bubbles.is-selecting.backwards~.chat-input .new-message-wrapper,body.animation-level-2 .bubbles.is-selecting.backwards~.chat-input .pinned-container{transition:opacity .1s .1s}body.animation-level-2 .bubbles.is-selecting.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}.chat-input .pinned-container{box-shadow:none}@media only screen and (max-width: 600px){.chat-input .pinned-container{font-size:15px}}.chat-input .pinned-container .btn-transparent{justify-content:center}.chat-input .pinned-container .btn-transparent::before{margin-right:10px}.chat-input .pinned-container::before{box-shadow:none}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}#column-center{width:100%;position:relative;flex:3}@media only screen and (max-width: 600px){body.is-left-column-shown #column-center{transform:translate3d(100vw, 0, 0)}body.is-right-column-shown #column-center{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-center{position:fixed !important;left:0;top:0;bottom:0;right:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem, 0, 0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex !important;width:100%;align-items:center;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body.animation-level-0 .chat{transition:none !important}.chat:not(.active):not(:last-child){filter:brightness(0.8)}@media only screen and (min-width: 926px){.chat:not(.active){transform:translate3d(calc((100vw - min(calc(100vw * .4), 420px)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(calc(100vw * .4), 420px)), 0, 0)}}@media only screen and (min-width: 1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)), 0, 0)}}@media only screen and (min-width: 1276px)and (max-width: 1680px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(75vw, 0, 0)}}@media only screen and (max-width: 925px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(100vw, 0, 0)}}.chat-background{overflow:hidden;background-color:#e6ebee}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none !important}.chat-background,.chat-background-item{position:absolute !important;top:0;left:0;bottom:0;right:0}.chat-background-item{background-image:url("assets/img/bg.jpeg");background-size:cover;background-position:center center;background-color:inherit}body.animation-level-2 .chat-background-item{transition:opacity .25s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-out);opacity:0}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in);opacity:1}@media only screen and (min-width: 1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem 0;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out) !important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(0.666666667);transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in) !important}}.chat .drops-container{--padding: 20px;--pinned-floating-height: 0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width: 1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width: 600px){.chat .drops-container{--padding: 10px}}.chat .drop{max-width:696px;--wrapper-padding: 15px}.chat-input-wrapper{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);display:flex;align-items:center;flex-direction:column;width:calc(100% - (var(--chat-input-size) + 0.5rem));max-width:calc(100% - (var(--chat-input-size) + 0.5rem));justify-content:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;border-bottom-right-radius:0;box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);min-height:var(--chat-input-size);max-height:30rem;flex:0 0 auto;position:relative;z-index:3;transition:width .1s}body.animation-level-0 .chat-input-wrapper{transition:none}.selection-wrapper,.fake-selection-wrapper{position:absolute;left:50%;top:0;transform:translateX(-50%);width:28.75rem;max-width:calc(100% - (var(--chat-input-padding) * 2))}.selection-wrapper{border-radius:12px;box-shadow:none;transition:opacity .1s .1s;opacity:0}.selection-wrapper .selection-container{display:flex;justify-content:space-between;height:100%;border-radius:inherit;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:15px;display:flex;justify-content:space-between;align-items:center;width:100%}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);font-weight:500;flex-grow:1;white-space:nowrap;text-transform:capitalize}.selection-wrapper .selection-container .btn-icon{margin:0 5px 0 6px;height:42px;width:42px;line-height:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width: 600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width: 380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-right:.625rem;margin-left:.375rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;z-index:-1;visibility:hidden}.chat-input.type-pinned .rows-wrapper,.chat-input.type-pinned .fake-rows-wrapper{width:auto}.fake-rows-wrapper{position:absolute;left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - (var(--padding-horizontal) * 2) - .5625rem)}.fake-rows-wrapper .pinned-container{padding:0 .5rem}.rows-wrapper{transform:scaleX(1);transition:transform .2s,width .2s,max-height .2s,border-radius .1s}.rows-wrapper.is-centered{margin:0 auto}.rows-wrapper.is-centered~.fake-rows-wrapper{left:50%;transform:translateX(-50%)}.rows-wrapper .bubble-tail{transition:transform .1s}body.animation-level-0 .rows-wrapper .bubble-tail{transition:none}.rows-wrapper.is-centering:not(.backwards),.rows-wrapper.is-centered{border-bottom-right-radius:12px}.rows-wrapper.is-centering:not(.backwards) .bubble-tail,.rows-wrapper.is-centered .bubble-tail{transform:scaleX(-1) translateX(1.125rem)}@media only screen and (max-width: 600px){.rows-wrapper{--padding-vertical: 1px}}@media only screen and (max-width: 420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height: 569px){.rows-wrapper{--padding-vertical: 1px}}.rows-wrapper .bubble-tail{position:absolute;bottom:-1px;right:-8.4px;width:11px;height:20px;fill:#fff;fill:var(--surface-color);transform:scaleX(-1)}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color);background-color:rgba(51, 144, 236, 0.08) !important;background-color:var(--light-primary-color) !important}.rows-wrapper .attach-file .btn-menu{right:calc(var(--padding-horizontal) * -1 - .125rem);bottom:calc(100% + 1.125rem)}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .attach-file .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .attach-file .btn-menu>div{padding:0 38px 0 16px}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{display:flex;justify-content:space-between;align-items:center;width:100%;position:relative;background-color:inherit;border-radius:.75rem;padding:var(--padding)}.rows-wrapper .reply-wrapper{justify-content:flex-start;height:0;width:calc(100% - var(--padding-horizontal) * 2);padding:0;margin-top:.5625rem;margin-bottom:-0.5625rem;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2;opacity:0;pointer-events:none}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .reply-wrapper{margin-top:.3125rem;margin-bottom:-0.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{pointer-events:unset;height:36px;opacity:1}.rows-wrapper .reply-wrapper .reply{order:1;flex:1 1 auto;margin:0 .625rem}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{top:auto;bottom:calc(100% + 1.0625rem);left:3.125rem;transform:scale(1) !important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size: 1.5rem;order:0;margin:0 2rem 0 0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#3390ec;stroke:var(--primary-color)}@media only screen and (max-width: 600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal) * -1)}}.rows-wrapper .new-message-wrapper{align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .input-message-container{width:1%;max-height:inherit;flex:1 1 auto;position:relative;overflow:hidden;align-self:center;min-height:calc(var(--chat-input-size) - var(--padding-vertical) * 2);display:flex;align-items:center}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{flex:0 0 auto;font-size:24px;color:#707579;color:var(--secondary-text-color);margin:0 .125rem 5px;padding:0;width:34px;height:34px}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY: 0;width:100%;flex:1 1 auto;position:relative;transform:translate3d(0, var(--translateY), 0);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles{transition:none !important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);--translateY: -78px}@media only screen and (max-width: 600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY: -58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translateY(calc(var(--translateY) * -1))}.bubbles>.scrollable{height:auto;display:block}@media only screen and (min-width: 1276px){body.is-right-column-shown .bubbles{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0)}}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:scale(1) translateX(2.5rem)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:opacity var(--layer-transition),visibility 0s 0s !important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY: calc(var(--chat-input-size) * -1 + -.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{width:100%;display:flex;flex-direction:column;margin:0 auto;min-height:100%;justify-content:flex-end;padding:0 .8125rem;max-width:728px;max-width:var(--messages-container-width);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translateY(0)}body.animation-level-0 .bubbles-inner{transition:none !important}@media only screen and (min-width: 1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width: 600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width: 600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - calc((2.375rem + .5rem) * -1) * -1) !important;max-width:calc(100% - var(--message-beside-button-margin) * -1) !important}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-inner{margin-bottom:1rem}.bubbles-inner:not(.is-channel) .message,.bubbles-inner.is-chat .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999 !important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY) * -1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden;transform:none !important;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention{--translateY: 0;cursor:default;opacity:0;visibility:hidden;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s !important}.bubbles-corner-button{position:absolute;background-color:#fff;background-color:var(--surface-color);border-radius:50%;color:#707579;color:var(--secondary-text-color);font-size:1.5rem;display:flex;align-items:center;justify-content:center;right:var(--chat-input-padding);bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);z-index:2;overflow:visible}body.animation-level-0 .bubbles-corner-button{transition:none !important}.bubbles-corner-button .badge{position:absolute;top:-0.25rem;right:-0.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width: 600px){.bubbles-corner-button .badge{top:-0.75rem;right:.1875rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}.topbar{--topbar-height: 3.5rem;--pinned-floating-height: 0px;--pinned-audio-height: 52px;--pinned-message-height: 52px;width:100%;z-index:1;min-height:var(--height);max-height:var(--height);margin-bottom:var(--pinned-floating-height);position:relative;cursor:pointer !important}.topbar:before{content:" ";position:absolute;height:calc(var(--topbar-height) + var(--pinned-floating-height));top:0;right:0;left:0;box-shadow:0px 1px 5px -1px rgba(0,0,0,.21);pointer-events:none}.topbar.is-pinned-audio-floating{--pinned-floating-height: var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-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-floating-height: calc(var(--pinned-audio-height) + var(--pinned-message-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width: 601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width: 926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width: 1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem);display:flex;align-items:center}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .peer-title,.topbar .info{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{top:calc(100% + 7px);max-height:calc(100 * 1vh - 4.375rem);max-height:calc(100 * var(--vh) - 4.375rem)}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem);top:29px}}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;overflow:hidden;padding-left:49px;max-width:calc(100% - var(--utils-width))}@media only screen and (max-width: 600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width: 1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-utils{display:flex;align-items:center;flex:0 0 auto}@media only screen and (min-width: 1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width: 600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{width:auto;height:2.25rem;font-weight:400;font-size:.875rem;margin-right:.5rem;padding:0 1.375rem}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;padding-left:1.125rem;max-width:100%;overflow:hidden}.topbar .person{display:flex;align-items:center}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubble{position:relative;z-index:1;margin:0 auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-wrap:wrap}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);position:absolute;top:50%;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);transform:translateY(-50%);color:#fff;border-radius:50%;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);opacity:0;display:flex;align-items:center;justify-content:center;transform:translateY(-50%) scale(0.6);visibility:hidden}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem !important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{visibility:visible;transform:translateY(-50%) scale(1)}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{position:absolute;left:-50%;top:-0.125rem;bottom:-0.125rem;content:" ";z-index:-1}.bubble.is-highlighted:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width: 600px){.bubble.is-first-unread{max-width:unset}}.bubble.is-first-unread:before{content:"Unread messages";height:30px;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;text-align:center;color:#3390ec;color:var(--primary-color);line-height:2.1;font-weight:500;font-size:15px;background-color:#fff;background-color:var(--surface-color);z-index:2;position:relative}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(0.125rem + 30px)}.bubble.is-selected:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{width:200%;display:block}.bubble.is-multiple-documents:before,.bubble.is-multiple-documents:after{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0 !important}.bubble-select-checkbox{z-index:3;position:absolute;left:0;display:flex;margin:0}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none !important}.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video,.bubbles.is-selecting .bubble a{pointer-events:none}.bubble-content{min-width:56px;max-width:100%;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);position:relative;display:flex;flex-direction:column-reverse;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-color:var(--message-background-color)}body.animation-level-0 .bubble-content{transition:none}html.no-touch .bubbles:not(.is-selecting) .bubble-content,html.is-touch body:not(.no-select) .bubbles.is-selecting .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{margin:0 auto;max-width:100%;box-shadow:none}.bubble.is-date{position:sticky;top:.25rem;padding-bottom:.25rem;z-index:2;transition:opacity .3s ease;opacity:.99999;pointer-events:none}.bubble.is-date:before,.bubble.is-date:after{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubble-beside-button{position:absolute;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);bottom:0;width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);font-size:1.5rem;align-items:center;display:flex;justify-content:center;color:#fff;color:var(--badge-text-color);border-radius:50%;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color);cursor:pointer}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}html.no-touch .bubble:hover .bubble-beside-button,html.no-touch .bubble:active .bubble-beside-button{opacity:1}.bubble .forward svg{width:22px;height:22px}.bubble.is-group-last{margin-bottom:0.5rem}.bubble.is-group-last:after{bottom:-0.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-0.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0 !important}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width: 600px){.bubble.webpage .document{padding-left:44px}}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;width:18px;vertical-align:bottom}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{padding-top:.5rem;padding-bottom:1.5rem;max-height:-webkit-fit-content !important;max-height:-moz-fit-content !important;max-height:fit-content !important;cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big.sticker .bubble-content{max-width:140px !important;max-height:140px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none !important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.bubble.sticker .attachment{border-radius:0;z-index:1}.bubble.sticker .bubble-content{max-width:200px !important;max-height:200px !important}.bubble.round .attachment{max-width:280px !important;max-width:var(--round-video-size) !important;max-height:280px !important;max-height:var(--round-video-size) !important;width:280px !important;width:var(--round-video-size) !important;height:280px !important;height:var(--round-video-size) !important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{max-width:100%;border-radius:inherit;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;position:relative;cursor:pointer}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{position:absolute;left:0;top:0;height:100%;width:100%;cursor:pointer;display:flex;justify-content:center;align-items:center}.bubble .attachment .download span{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);font-size:23px;color:#fff;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{position:relative;margin:0 auto;z-index:1}.bubble .media-container-fitted{background-color:transparent !important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-width:min(420px, 100%);max-height:min(340px, 100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-width:min(451px, 100%);max-height:none}.bubble .album-item{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);max-width:100%;cursor:pointer;position:absolute;overflow:hidden}body.animation-level-0 .bubble .album-item{transition:none !important}.bubble .album-item img,.bubble .album-item video{border-radius:inherit}.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none !important}.bubble .album-item .bubble-select-checkbox{bottom:auto !important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4, .0, .2, 1),border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transition:transform .3s cubic-bezier(.4, .0, .2, 1),border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in);transform:scale(0.883333)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:hover,html.no-touch .bubble a:active{text-decoration:underline}.bubble-first{order:-1;margin-top:.5rem;justify-content:center;align-items:center;max-width:100%}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column;align-items:flex-start !important;padding:.75rem 1rem .875rem !important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-size:1rem !important}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{margin-right:.25rem;font-size:1.25rem;vertical-align:bottom;margin-left:-0.1875rem}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubble-first.empty-bubble-placeholder:not(:first-child:last-child) .bubble-content-wrapper{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0;pointer-events:none}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem !important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem !important;position:relative;width:200px;height:200px;cursor:pointer}.bubble-first .time{display:none !important}.bubble-first:before,.bubble-first:after{display:none}.bubble .web{margin:.125rem 0 -0.5625rem;max-width:100%;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.bubble .web .preview{max-width:min(420px, 100%);max-height:min(340px, 100%);border-radius:4px;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;position:relative;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title{font-weight:500 !important}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .webpage-name{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);font-weight:500 !important;text-decoration:none}html.no-touch .bubble .web .webpage-name:hover,html.no-touch .bubble .web .webpage-name:active{text-decoration:underline}.bubble .web .text{word-break:break-word;margin-top:1px;font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble .web .quote{max-width:100%;overflow:hidden;width:100%;display:flex}.bubble .web .quote-text{width:100%;max-width:100%;padding-left:.625rem;margin-left:-0.625rem}.bubble .web .quote:before{flex:0 0 auto;width:.125rem;border-radius:.125rem;background-color:#3390ec;background-color:var(--primary-color);margin:.1875rem .5rem .125rem 0;content:" "}.bubble .web,.bubble .reply{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{margin:0;width:3rem;height:3rem;float:right;margin-left:.625rem;margin-top:.1875rem}.bubble.is-square-photo .web .preview{max-width:min(3rem, 100%);max-height:min(3rem, 100%);margin:0}.bubble .reply{padding:.25rem;margin:0 .25rem .375rem .375rem;cursor:pointer;border-radius:.25rem;min-width:10rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{position:absolute;max-width:calc(100% - 1.25rem);height:auto;min-height:32px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.bubble .message+.reply{margin-bottom:0}.bubble.just-media .reply,.bubble.just-media .name{padding:10px;border-radius:12px;position:absolute;top:0;margin-bottom:0;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);white-space:nowrap;max-width:15rem}@media only screen and (max-width: 600px){.bubble.just-media .reply,.bubble.just-media .name{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff !important;padding:.3125rem .625rem;line-height:1.3125;line-height:var(--line-height)}.bubble.just-media .name .peer-title{font-weight:400 !important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width: 600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;position:relative;max-width:none !important}.bubble.just-media .reply-title,.bubble.just-media .reply-subtitle,.bubble.just-media .reply i{color:#fff !important}.bubble.just-media .reply-border{background:#fff}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{font-size:16px;font-size:var(--messages-text-size);padding:0 .5rem .375rem .625rem;max-width:100%;color:#000;color:var(--primary-text-color);line-height:1.3125;word-break:break-word;white-space:pre-wrap;position:relative}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width: 600px){.bubble .document-ico,.bubble .document-download,.bubble .audio-ico,.bubble .audio-download{height:2.25rem;width:2.25rem}}.bubble .audio .audio-title{font-weight:500}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width: 600px){.bubble .audio{height:2.375rem;padding-left:calc(2.375rem + .5625rem)}.bubble .audio .audio-details{margin-top:2px;margin-bottom:0}.bubble .audio .audio-subtitle{margin-top:-1px}.bubble .audio.corner-download .audio-download{margin:1.375rem 1.375rem 0}}.bubble .message.audio-message{width:335px;max-width:min(100%, 335px) !important}@media only screen and (max-width: 600px){.bubble .message.audio-message{width:280px;max-width:min(100%, 300px) !important}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px !important}.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{display:flex;padding:2px 0;cursor:pointer}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{padding-left:12px;margin-top:8px;display:flex;flex-direction:column}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500}.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{padding-left:66px;height:58px}@media only screen and (max-width: 600px){.bubble .message.document-message .document{padding-left:44px;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 0px 0px 0px}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-container .time.tgico{position:relative !important;height:0px !important;visibility:hidden !important;float:none}.bubble .document-container .time.tgico .inner{visibility:hidden !important}.bubble.is-multiple-documents .message{padding:0 !important;border-radius:inherit}.bubble.is-multiple-documents .document-container{position:relative;border-radius:inherit}.bubble.is-multiple-documents .document-container .document-selection{position:absolute;top:0;bottom:0;z-index:-1;width:200vw;left:-75vw}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.06);border-radius:inherit}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{left:2rem;top:2rem;background:#fff;border-radius:50%}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size: 1.125rem;left:20px;top:25px}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size: .125rem;content:" ";position:absolute;width:calc(var(--size) - (var(--inner-size) * 2));height:calc(var(--size) - (var(--inner-size) * 2));left:var(--inner-size);top:var(--inner-size);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-0.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{padding-top:.5rem;border-top-left-radius:inherit;border-top-right-radius:inherit}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-0.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{padding-bottom:.5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-0.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-0.25rem}.bubble.is-multiple-documents .document{height:54px !important}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document{height:38px !important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{padding:0 0 .25rem 0;margin-top:-0.1875rem}.bubble .message.document-message .time,.bubble .message.audio-message .time,.bubble .message.voice-message .time,.bubble .message.poll-message .time,.bubble .message.contact-message .time{position:absolute;right:0;bottom:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{position:absolute;bottom:.1875rem;right:.1875rem;border-radius:.75rem;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0 .3125rem;z-index:2}.bubble.is-message-empty .message .time{margin-left:0;display:flex;align-items:center;padding:0;margin:0;white-space:nowrap;height:18px}.bubble.is-message-empty .message .time .inner{right:unset;bottom:unset;color:#fff;margin:inherit}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message,.bubble.is-message-empty.emoji-big .message{bottom:0}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{visibility:hidden;font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1;vertical-align:middle;pointer-events:none;display:inline-flex;z-index:1;height:12px;direction:ltr;float:right;cursor:pointer}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{margin-left:2px;pointer-events:none}.bubble .time i.edited{overflow:visible;font-size:inherit}.bubble .time .inner{pointer-events:all;position:absolute;bottom:0;right:0;display:flex;align-items:center;line-height:1;padding:inherit;white-space:nowrap;height:12px;visibility:visible}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-time,.bubble .video-play{pointer-events:none}.bubble .video-time{position:absolute;top:3px;left:3px;border-radius:12px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 6px;z-index:2;font-size:12px;color:#fff;display:flex;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:1.125rem;line-height:1}.bubble .video-time.can-autoplay:after{content:"";padding:0 1px 0 3px;font-size:1.25rem;color:#fff}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);color:#fff;text-align:center;font-size:2.125rem;display:flex;align-items:center;justify-content:center;z-index:1}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{padding:5px 9px 0 9px;font-weight:500 !important;color:#3390ec;color:var(--primary-color);font-size:.9rem;max-width:100%;overflow:hidden;text-overflow:ellipsis}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{position:absolute;width:11px;height:20px;z-index:-2;display:block;fill:#fff;fill:var(--message-background-color);transform:translateY(1px)}.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{cursor:pointer;border-radius:inherit}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.bubble .replies .rp{width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden;border-radius:inherit;cursor:pointer}.bubble .replies-beside{flex-direction:column;width:36px;min-height:36px;height:auto;max-height:52px;bottom:47px;border-radius:2rem;right:-44px;padding:5.5px 0}.bubble .replies-beside .tgico-commentssticker{font-size:23px}.bubble .replies-beside-text{font-size:.75rem}.bubble .replies-footer{height:50px;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);position:relative;display:flex;align-items:center;padding:0 .5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:#3390ec;color:var(--primary-color);min-width:15rem}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.4375rem}.bubble .replies-footer-text{font-weight:500;font-size:15px;margin-left:9px;display:flex;align-items:center;color:#3390ec;color:var(--primary-color)}.bubble .replies-footer-avatars{display:flex;flex-direction:row-reverse}.bubble .replies-footer-avatars avatar-element{width:34px;height:34px;border:2px solid #fff;border:2px solid var(--surface-color);cursor:pointer;z-index:0}.bubble .replies-footer-avatars avatar-element:not(:first-child){margin-right:-14px}.bubble .replies-footer .tgico-next{position:absolute;right:4px}.bubble .replies-footer.is-unread .replies-footer-text:after{content:" ";background-color:#3390ec;background-color:var(--primary-color);width:.5rem;height:.5rem;margin-left:.75rem;border-radius:50%}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.bubble-content-wrapper{transform:scale(1) translateX(0);transform-origin:center;opacity:1}body.animation-level-2 .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)}.bubbles-inner.zoom-fading .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0}@media only screen and (min-width: 601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width: 600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble-content-wrapper>.user-avatar{position:absolute;margin-left:-45px;bottom:0;cursor:pointer}.bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transform:scale3d(1, 1, 1);transform-origin:bottom;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transition:none}.bubbles.is-selecting:not(.backwards) .bubble-content-wrapper>.user-avatar{transform:scale3d(0.76, 0.76, 1);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{color:#fff;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);font-size:.9375rem;padding:.28125rem .625rem;line-height:1.25rem;border-radius:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;text-align:center;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg a:hover,.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover{text-decoration:underline;cursor:pointer}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 10px)}@media only screen and (max-width: 600px){.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .contact-number,.bubble.is-in .audio-time{color:#707579 !important;color:var(--secondary-text-color) !important}.bubble.is-out{flex-direction:row-reverse;--message-background-color: var(--message-out-background-color);--light-message-background-color: var(--light-message-out-background-color);--dark-message-background-color: var(--dark-message-out-background-color);--link-color: var(--message-out-link-color)}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width: 1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .reply,.bubble.is-out.just-media .name{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out:not(.just-media) .reply-title,.bubble.is-out:not(.just-media) .reply i{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{padding-right:5px;margin-left:-4px}.bubble.is-out .time .inner{color:#4fae4e;color:var(--message-out-status-color);bottom:4px}.bubble.is-out .time:after,.bubble.is-out .time .inner:after{font-size:19px;margin-left:1px;line-height:16px;color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time:after,.bubble.is-out.is-read .time .inner:after{content:""}.bubble.is-out.is-sent .time:after,.bubble.is-out.is-sent .time .inner:after{content:""}.bubble.is-out.is-sending .time:after,.bubble.is-out.is-sending .time .inner:after{content:""}.bubble.is-out .document-ico:after{border-top-color:#fff;border-top-color:var(--message-background-color);border-right-color:#fff;border-right-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e !important;fill:var(--message-out-primary-color) !important}.bubble.is-out .audio-time,.bubble.is-out .audio-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-toggle,.bubble.is-out .audio-download,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.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 .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color: var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color: var(--message-background-color)}.bubble.is-out .bubble-beside-button{right:auto;left:calc((2.375rem + .5rem) * -1);left:var(--message-beside-button-margin)}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.reply-markup{width:100%}.reply-markup-row{margin-top:.3125rem;overflow:hidden;min-height:2.5rem;display:flex}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{padding:.5625rem 0;border-radius:6px;z-index:2;font-size:.875rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;color:#fff !important;outline:none;border:none;width:100%;cursor:pointer;position:relative;overflow:hidden;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.reply-markup-button.anchor-url{text-decoration:none !important}.reply-markup-button:after{content:" ";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;opacity:0;z-index:-1;background-color:#fff}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:hover:after,html.no-touch .reply-markup-button:active:after{opacity:0.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button.tgico:before,.reply-markup-button .forward-icon{position:absolute;right:.125rem;top:.125rem;display:block}.reply-markup-button.is-link:before{content:"";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:""}.pinned-message-border{position:relative;height:2rem;width:.125rem;flex:0 0 auto}.pinned-message-border-wrapper-1{position:relative;top:50%;transform:translateY(-50%);height:2rem;width:.125rem;border-radius:1px;background:#3390ec;background:var(--primary-color)}.pinned-message-border-mask{--mask-height: .375rem;--height: 2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:before,.pinned-message-border-mask:after{position:absolute;left:0;right:0;content:" ";display:block;z-index:1;height:var(--mask-height);opacity:0}body.animation-level-2 .pinned-message-border-mask:before,body.animation-level-2 .pinned-message-border-mask:after{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{top:0;background:linear-gradient(#fff, transparent);background:linear-gradient(var(--surface-color), transparent)}.pinned-message-border-mask:after{bottom:0;background:linear-gradient(transparent, #fff);background:linear-gradient(transparent, var(--surface-color))}.pinned-message-border-mask.mask-top:before,.pinned-message-border-mask.mask-bottom:after{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{position:absolute;content:" ";left:0;top:0;right:0;bottom:0;display:block;background:#3390ec;background:var(--primary-color);opacity:.4}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{position:absolute;left:0;top:0;width:2px;background:currentColor;border-radius:1px}body:not(.animation-level-0) .pinned-message-border-wrapper,body:not(.animation-level-0) .pinned-message-border-mark{will-change:transform;transition:transform .25s ease-in-out}.pinned-message-content{--height: 32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{cursor:pointer;display:flex;align-items:center;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;overflow:hidden;pointer-events:none;position:relative;margin-left:.5rem}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-title,.pinned-message-subtitle,.reply-title,.reply-subtitle{font-size:14px;line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-message-media,.reply-media{height:2rem !important;width:2rem !important;overflow:hidden;position:absolute;left:0;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.pinned-message i,.reply i{font-style:normal;color:#707579;color:var(--secondary-text-color)}.pinned-message img.emoji,.reply img.emoji{height:1rem;width:1rem;vertical-align:top}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{height:2rem;border-radius:1px;min-width:2px;background:#3390ec;background:var(--primary-color)}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0 !important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500}.pinned-container{--container-height: 3.25rem;display:flex;justify-content:space-between;align-items:center;flex:0 0 auto;overflow:visible;cursor:pointer}.pinned-container.is-floating{position:absolute !important;top:var(--topbar-height);right:0;left:0;margin:0;width:auto;height:var(--container-height);max-height:var(--container-height);background-color:#fff !important;background-color:var(--surface-color) !important}.pinned-container.is-floating .pinned-container-wrapper{order:0;padding:0 1rem;height:100%;border-radius:0;z-index:0;max-width:100%}@media only screen and (max-width: 600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width: 1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{content:" ";border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);position:absolute;top:0;right:0;bottom:0;left:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;position:relative;pointer-events:none}.pinned-container .btn-icon{font-size:1.5rem;display:flex;justify-content:center;flex:0 0 auto}.pinned-container-wrapper{display:flex;flex:1 1 auto;overflow:hidden;align-items:center;padding:.25rem;border-radius:.25rem;order:1}.pinned-container-wrapper-utils{flex:0 0 auto;display:flex;align-items:center;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible !important}.pinned-message-media-container{width:2rem;height:2rem;position:absolute;margin-left:-0.25rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title,.pinned-message-subtitle{transform:translateX(0)}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height: var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-title,.pinned-message-content .pinned-message-subtitle{position:relative;height:calc(var(--height) / 2);min-height:calc(var(--height) / 2);overflow:visible}body.animation-level-2 .pinned-message-content .pinned-message-title,body.animation-level-2 .pinned-message-content .pinned-message-subtitle{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-top:-0.125rem;margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:.875rem;line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:"#"}.pinned-message .animated-counter.is-last:not(.backwards){transform:scale(0.68);opacity:0}.pinned-message .animated-super-row{--translateY: 16px}.pinned-message .pinned-message-media{--translateY: 32px}.pinned-message.hide~.tgico-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message.is-many .pinned-message-close{display:none}.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist{display:none}.pinned-message.is-many.is-floating .pinned-message-close{display:none}.pinned-message:not(.is-many) .pinned-message-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none !important}.pinned-audio{--progress-height: .25rem}.pinned-audio.is-floating{--container-height: var(--pinned-audio-height)}.pinned-audio:not(.is-floating){padding-right:1.75rem;max-width:210px;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible !important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0 !important}.pinned-audio-ico:before{content:""}.pinned-audio-ico.flip-icon:before{content:""}.pinned-audio-title{font-weight:500}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-title,.pinned-audio-subtitle{font-size:.875rem;line-height:1.3125;line-height:var(--line-height);width:100%;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius: 0;--height: var(--progress-height);--scaleX: 1;--translateY: .125rem;position:absolute;right:0;bottom:0;left:0;transform:scaleX(var(--scaleX)) translateY(var(--translateY));transform-origin:left center;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)}@media only screen and (min-width: 1276px){body.is-right-column-shown .pinned-audio-progress{--scaleX: calc(1 - var(--right-column-proportion))}}body.animation-level-0 .pinned-audio-progress{transition:none !important}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:hover,html.no-touch .pinned-audio-progress:active{--translateY: 0}.pinned-audio-progress .progress-line__filled:after{display:none !important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{position:absolute;height:.5rem;right:0;bottom:0;left:0;overflow:hidden}.pinned-audio-volume{align-items:center;position:relative;width:2.5rem;height:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{position:absolute;top:100%;left:0;right:0;bottom:-1rem;content:" "}.pinned-audio-volume .player-volume__icon{fill:#707579;fill:var(--secondary-text-color);width:inherit;height:inherit;cursor:pointer}.pinned-audio-volume.active .player-volume__icon{fill:#3390ec;fill:var(--primary-color)}.pinned-audio-volume .progress-line-container{position:absolute;top:100%;width:5rem;padding:.75rem 1rem;margin-top:2.25rem;transform:rotate(270deg);border-radius:10px;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 5px 0px rgba(0,0,0,.15);opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility 0s .2s}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none !important}.pinned-audio-volume:hover .progress-line-container,.pinned-audio-volume:active .progress-line-container{opacity:1;visibility:visible;transition:opacity .2s ease-in-out,visibility 0s 0s}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;transform:translateZ(0);opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),transform .2s cubic-bezier(.4, .0, .2, 1),width .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);position:fixed;top:0;right:0;bottom:0;left:0;height:44px;width:218px;overflow:hidden;z-index:1;display:flex;justify-content:flex-start}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{position:absolute;left:0;top:0;display:flex;align-items:center;justify-content:flex-start;width:638px;height:100%;transform:translateX(0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:100%}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{display:flex;align-items:center;justify-content:space-between;padding:7px;flex:0 0 auto;max-width:100%}.markup-tooltip-tools:first-child{width:218px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{width:1px;height:25px;background-color:#dfe1e5;background-color:var(--border-color)}.markup-tooltip .btn-icon{border-radius:8px !important;width:30px;height:30px;padding:0}.markup-tooltip .btn-icon.active{color:#fff !important;background-color:#3390ec !important;background-color:var(--primary-color) !important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-218px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{display:flex;align-items:center;opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition);pointer-events:none}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;text-overflow:ellipsis;margin:0 .5rem}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{position:relative;max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem}.stickers-helper-stickers{max-width:100%;border-radius:var(--border-radius)}html.no-touch .stickers-helper .super-sticker:not(.active):hover,html.no-touch .stickers-helper .super-sticker:not(.active):active{background:none}.emoji-helper{height:50px;padding:.25rem 0 !important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:before,.emoji-helper .super-emojis:after{display:inline-block;content:" ";width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):hover,html.no-touch .emoji-helper .super-emoji:not(.active):active{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec !important;background-color:var(--primary-color) !important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem, 100%)}.inline-helper .scrollable{position:relative;max-height:232px}.inline-helper-separator{height:1px;width:100%;margin-left:4rem;background-color:#dfe1e5;background-color:var(--border-color)}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:unset}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;padding:.5rem .5rem .5rem 4rem;line-height:1.3125;line-height:var(--line-height)}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{position:absolute;left:.5rem;width:3rem !important;height:3rem !important;overflow:hidden}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{color:#fff;text-transform:uppercase;font-size:1.75rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;display:flex;align-items:center;justify-content:center}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-video,.inline-helper .media-poster{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.inline-helper .gif{position:absolute;top:0;right:0;bottom:0;left:0;width:auto !important;height:auto !important}.inline-helper-results.is-gallery{max-width:100%;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill, minmax(80px, 1fr));grid-template-columns:repeat(auto-fill, minmax(var(--esg-sticker-size), 1fr));grid-gap:1px}.inline-helper-results.is-gallery .inline-helper-result{width:auto !important;height:auto !important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.inline-helper-result-description{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden;white-space:pre-wrap}.chat-search{position:absolute !important;top:0;z-index:2}.chat-search-footer{height:46px;padding:0 8px;flex:0 0 auto;width:100%;background-color:#fff;background-color:var(--surface-color);display:flex;justify-content:space-between;align-items:center;box-shadow:0px -1px 5px -1px rgba(0,0,0,.21);overflow:hidden}.chat-search-footer .chat-search-count{margin-left:8px;color:#707579;color:var(--secondary-text-color)}.chat-search-footer+.chat-input{display:none}.chat-search-count:empty{display:none}.chat-search-count:not(:empty)+.btn-icon{display:none}.chat-search-controls{display:flex}.chat-search-results{width:100%;height:100%;max-height:100%;overflow:hidden;position:absolute;top:0;left:0;visibility:hidden;opacity:0;background-color:#fff;background-color:var(--surface-color);transition:.2s ease}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding: 0px;position:absolute !important;z-index:3;top:var(--padding);right:var(--padding);bottom:var(--padding);left:var(--padding);display:flex;flex-direction:column;justify-content:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto !important}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding: -4px;background-color:#fff;background-color:var(--surface-color);position:relative;border-radius:12px;width:100%;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#a2acb4;transition:color .2s ease-in-out;pointer-events:all;flex:1 1 auto}.drop-outline-wrapper{position:absolute;top:var(--wrapper-padding);right:var(--wrapper-padding);bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;transition:stroke .2s ease-in-out;stroke-dashoffset:0}.drop.is-dragover .drop-outline-path{-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite;stroke:#3390ec;stroke:var(--primary-color)}.drop-icon{font-size:6rem}.drop-header{font-weight:500;font-size:1.25rem}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height: 670px){.drop-icon{font-size:0}.drop-header{margin-top:0px}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{width:auto;height:auto;display:block;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center}.crop-image{display:block;position:relative;pointer-events:none}.crop-component{position:relative;z-index:999;background-color:#fff;margin:0 auto;overflow:hidden}.crop-component>img{max-width:100%}.crop-overlay{position:absolute;z-index:999;overflow:hidden;box-sizing:content-box;border-radius:50%}html.no-touch .crop-overlay:hover,.crop-overlay:active{cursor:move}.crop-overlay-image{position:absolute;display:block}.crop-overlay-color{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,.7);border-radius:8px}.sidebar-header{background-color:#fff;background-color:var(--surface-color);display:flex;align-items:center;justify-content:space-between;padding:0 1rem;min-height:3.5rem;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width: 600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{flex:1;font-weight:500;padding-left:1.5rem;font-size:1.25rem;color:#000;color:var(--primary-text-color)}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{overflow:inherit !important;width:2.5rem;height:2.5rem}.sidebar-content{width:100%;max-height:100%;height:100%;overflow:hidden;display:flex;position:relative;flex:1 1 auto}.profile-avatars-container{width:100%;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.no-touch .profile-avatars-container:hover .profile-avatars-arrow,html.no-touch .profile-avatars-container:active .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0 !important}.profile-avatars-avatars{width:100%;height:100%;display:flex;flex-wrap:nowrap;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;position:absolute}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0, 0)}.profile-avatars-avatars:before{content:" ";top:0;right:0;bottom:0;left:0}.profile-avatars-avatar{width:inherit;height:inherit;min-width:100%;min-height:100%;display:flex;background-color:#000;position:relative}.profile-avatars-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none}.profile-avatars-gradient{position:absolute;left:0;right:0;bottom:0;height:80px;background:linear-gradient(360deg, rgba(0, 0, 0, 0.3) 8.98%, rgba(0, 0, 0, 0) 100%)}.profile-avatars-info{position:absolute;bottom:0;display:flex;flex-direction:column;align-items:flex-start;left:1.5rem;bottom:.5625rem;pointer-events:none}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color: #fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit !important}.profile-avatars-tabs{display:flex;position:absolute;top:.5rem;left:.375rem;right:.375rem;height:.125rem;pointer-events:none}.profile-avatars-tab{flex:1 1 auto;border-radius:4px;margin:0 .125rem;background-color:#fff;opacity:.2;transition:opacity .2s ease-in-out;height:inherit}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{position:absolute;top:0;left:0;bottom:0;width:calc(100% / 3);opacity:0}.profile-avatars-arrow:before{position:absolute;top:50%;transform:translateY(-50%);font-size:2.1875rem;color:#fff;left:.625rem}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active{opacity:1 !important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{flex:0 0 auto;display:flex;flex-direction:column;position:relative;width:100%}.profile-content-wrapper{flex:1 1 auto;display:flex;flex-direction:column;padding-bottom:13px}@media only screen and (min-width: 601px){.profile-content-wrapper{padding-top:15px}}.profile-content .sidebar-left-section{position:relative;background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{text-align:center;font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);font-weight:500;overflow:hidden;max-width:21.25rem;margin:0 auto;color:#000;color:var(--primary-text-color);display:flex;align-items:flex-end}.profile-name span.emoji{vertical-align:inherit;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.profile-name .peer-title{word-break:break-word;text-overflow:ellipsis;overflow:hidden}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-subtitle{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px}@media only screen and (max-width: 600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{margin:.5rem auto 10px;display:block}@media only screen and (max-width: 600px){.profile-avatar{margin:0 auto 10px;--size: 100px;--multiplier: .54}}.profile-name,.profile-subtitle,.profile-avatar{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size: 3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{content:" ";position:absolute;height:1px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;left:0;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size: var(--scrollable-size, 3.5rem);width:100%;display:flex;justify-content:space-around;align-items:center;flex-direction:row;position:relative;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#707579;color:var(--secondary-text-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.menu-horizontal-div-item{height:var(--size);padding:0 1rem;cursor:pointer;text-align:center;flex:1 1 auto;font-size:1rem;font-weight:500;position:relative;transition:none !important;display:flex;align-items:center;justify-content:center;line-height:1.3125;line-height:var(--line-height);border-radius:0}html.no-touch .menu-horizontal-div-item:hover,html.no-touch .menu-horizontal-div-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .menu-horizontal-div-item.active:hover,html.no-touch .menu-horizontal-div-item.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{position:relative;display:inline-flex;align-items:center;overflow:visible}.menu-horizontal-div i{position:absolute;bottom:calc(-.625rem - 7px);left:0;opacity:0;background-color:#3390ec;background-color:var(--primary-color);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:content-box;transform-origin:left;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{min-width:100%;width:100%;display:grid;grid-template-columns:100%;grid-template-rows:100%}.tabs-container .tabs-tab{display:none;flex-direction:column;grid-row-start:1;grid-column-start:1;background-color:#fff;background-color:var(--background-color);overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none !important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4, .0, .2, 1),filter .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4, .0, .2, 1),filter .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex-direction:column;flex:1 1 auto;min-width:18rem;max-width:calc(1680px / 4)}@media only screen and (max-width: 600px){#column-left{width:100%;max-width:100%}body:not(.is-left-column-shown) #column-left{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px){#column-left{overflow:visible}#column-left:after{position:absolute;content:" ";display:block;height:100vh;width:1px;background-color:#dfe1e5;background-color:var(--border-color);right:-1px;top:0;z-index:2}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-left{display:flex;position:fixed;left:0;top:0;width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:unset}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width: 926px){#column-left{display:flex}}@media only screen and (max-width: 1275px){#column-left{flex:2}}@media only screen and (min-width: 1681px){html.is-safari #column-left{max-width:calc(1680px / 4 - 1.25px)}}#column-left .item-main{--menu-size: 3rem}#column-left .menu-horizontal-scrollable{--scrollable-size: var(--menu-size);z-index:1;background-color:#fff;background-color:var(--surface-color);position:relative;top:unset}@media only screen and (max-width: 600px){#column-left .menu-horizontal-scrollable{box-shadow:0px 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .menu-horizontal-div{position:relative !important;justify-content:flex-start;z-index:0}#column-left .menu-horizontal-scrollable .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem;border-top-left-radius:6px;border-top-right-radius:6px}#column-left .menu-horizontal-scrollable .menu-horizontal-div-item>span{overflow:visible}#column-left .menu-horizontal-scrollable .menu-horizontal-div-item>span i{bottom:calc(-.6875rem - 2px)}#column-left .menu-horizontal-scrollable .menu-horizontal-div__stripe{display:none}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .folders-tabs-scrollable .menu-horizontal-div-item:first-child{margin-left:.6875rem}@media only screen and (max-width: 600px){#column-left .folders-tabs-scrollable .menu-horizontal-div-item:first-child{margin-left:.1875rem}}#column-left .item-main .input-search .selector-user{height:30px;position:absolute !important;left:6px;top:6px;z-index:1;margin-left:0;line-height:1.875rem}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block !important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width: 600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{margin-top:7px;font-size:14px}html.no-touch #column-left .item-main .search-helper .selector-user:hover,html.no-touch #column-left .item-main .search-helper .selector-user:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none !important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative !important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto !important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%, -50%)}#column-left #chatlist-container{max-height:100%;overflow:hidden;position:relative;background-color:#fff;background-color:var(--surface-color)}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{position:relative;width:2.5rem;height:2.5rem;flex:0 0 auto;display:flex;align-items:center;justify-content:center}#column-left .sidebar-header__btn-container>.btn-icon{visibility:hidden;opacity:0;position:absolute;top:0;right:0;bottom:0;left:0;transition:.2s opacity,.15s background-color;z-index:2;margin:0}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width: 600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-0.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{width:300px;max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem)}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width: 600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:1rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;padding-left:4px;margin-top:-1px;padding-bottom:1px}#column-left .search-group-people li{height:98px;border-radius:10px;max-width:78px;width:78px;align-items:center;display:flex;flex-direction:column;padding:12px 0 0 !important;margin:0 5px 0 0;flex:0 0 auto}@media only screen and (max-width: 600px){#column-left .search-group-people li{width:77px;max-width:77px}}#column-left .search-group-people .dialog-title-details,#column-left .search-group-people .dialog-subtitle{display:none}#column-left .search-group-people .user-caption{max-width:65px;padding:2px 0px 9px;font-size:12px}@media only screen and (max-width: 600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width: 600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{visibility:visible !important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-width: 600px){#column-left .item-main .sidebar-content .btn-corner{--size: 54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{width:100%;padding:0 .5rem .5rem;overflow:hidden;flex:0 0 auto}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(64px)}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px)}#column-left .connection-status-button{color:#2e3939;align-self:center;cursor:default;padding-left:4.5rem;text-align:left;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{cursor:pointer;text-decoration:underline;color:inherit}#column-left .connection-status-button .preloader-container{right:auto;left:1rem;width:1.5rem;height:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{position:absolute;left:0;top:0;bottom:0;right:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);transform:translateY(0);height:100%}#column-left .input-wrapper{width:420px;margin:0 auto;flex:0 0 auto;padding:0 1.25rem;max-width:100%}@media only screen and (max-width: 600px){#column-left .input-wrapper{width:100%;padding:0 1rem}}#search-container{display:flex}#search-container .scrollable-y{position:relative;flex:1 1 auto}.new-channel-container .sidebar-content,.new-group-container .sidebar-content,.edit-profile-container .sidebar-content{flex-direction:column}.new-channel-container .chatlist-container,.new-group-container .chatlist-container,.edit-profile-container .chatlist-container{flex:1 1 auto}.new-channel-container .caption,.new-group-container .caption,.edit-profile-container .caption{font-size:.875rem;margin-top:14px;margin-left:23px;color:#707579;color:var(--secondary-text-color);padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}@media only screen and (max-width: 600px){.settings-container .profile-button{border-radius:0}}.settings-container .profile-buttons{margin-top:1.1875rem;width:100%;padding:0 .4375rem}@media only screen and (max-width: 600px){.settings-container .profile-buttons{margin-top:.6875rem;padding:0}}.edit-profile-container .caption{margin-top:1.0625rem;margin-left:1.4375rem;line-height:1.3125;line-height:var(--line-height);padding-bottom:1.4375rem}@media only screen and (max-width: 600px){.edit-profile-container .caption{padding-right:24px}}.edit-profile-container .sidebar-left-h2{padding:0 1.4375rem;padding-bottom:1.5rem}.edit-profile-container hr{margin-bottom:1rem}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-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{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.chat-folders-container .caption,.edit-folder-container .caption{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);max-width:20rem;margin:0 auto}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{height:30px;padding:0 12px;font-size:15px;width:auto;transition:width .2s;margin:0;position:absolute;right:1rem;top:50%;transform:translateY(-50%);border-radius:15px}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width: 600px){.edit-folder-container .input-wrapper{width:100%;padding:0 16px}}.edit-folder-container .input-wrapper{margin-bottom:.125rem !important}.edit-folder-container .sidebar-left-section{padding-bottom:0rem}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list li{padding:9px 12px;height:50px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:normal}.folder-categories .checkbox-field{position:absolute;right:1.125rem !important}.folder-category-button{height:50px}.popup-forward .selector .chatlist li,.included-chatlist-container .selector .chatlist li{padding:7px .75rem !important;height:3.75rem}.popup-forward .selector .chatlist .user-caption,.included-chatlist-container .selector .chatlist .user-caption{padding:0px 0px 0 14px;margin-top:-2px}.popup-forward .selector .chatlist .user-last-message,.included-chatlist-container .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{display:flex;justify-content:space-between;align-items:center}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width: 600px){.search-group-recent li{height:62px;padding-top:7px;padding-bottom:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500 !important}.search-group-recent .dialog-avatar{--size: 46px;--multiplier: 1.173913}}@media only screen and (max-width: 600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width: 601px){.search-group-recent.search-group.search-group-contacts{padding:0px 0 7px}}.sidebar-left-section{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0}@media only screen and (max-width: 600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width: 601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width: 600px){.sidebar-left-section-content>.checkbox-ripple,.sidebar-left-section-content>.btn-primary{border-radius:0}}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width: 600px){.sidebar-left-section-name{padding:.5rem 1rem;font-size:.875rem}}.sidebar-left-section-caption{margin-top:1rem;font-size:1rem;color:#707579;color:var(--secondary-text-color);line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width: 600px){.sidebar-left-section-caption{margin:.5rem;font-size:.875rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none !important;opacity:.25}.sidebar-left-section .media-sticker-wrapper{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500}.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}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{text-align:center;max-width:342px;margin-left:auto;margin-right:auto;margin-bottom:1.125rem}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem !important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{width:168px;height:168px;margin:.625rem auto 1.1875rem}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{margin:1.125rem auto 1.8125rem;width:157px;height:157px}.two-step-verification-hint .media-sticker-wrapper{width:160px;height:160px;margin:.5rem auto 2.25rem}.two-step-verification-email .media-sticker-wrapper{width:160px;height:160px;margin:.5625rem auto 2.1875rem}.two-step-verification-set .media-sticker-wrapper{width:160px;height:160px;margin:1rem auto 1.3125rem}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width: 601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-top:1rem;padding-bottom:.9375rem}.active-sessions-container .row-title-row{align-items:flex-end}.active-sessions-container .row-title:first-child{font-weight:500}.active-sessions-container .row-title-right{font-size:.75rem;color:#707579;color:var(--secondary-text-color);line-height:1.5}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500}.blocked-users-container li{height:66px;padding-top:9px;padding-bottom:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{margin-top:-0.375rem;font-size:.875rem}.blocked-users-container ul{margin-top:.3125rem}@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{padding:0 .5rem .5rem}.background-container .grid-item:after{content:" ";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border:3px solid #3390ec;border:3px solid var(--primary-color);opacity:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(0.91)}.background-container .grid-item-media{transition:transform .2s ease-in-out;transform:scale(1)}.background-container .grid .media-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.background-container .grid .preloader-container{z-index:1}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{top:40%;transform:translateY(-50%);text-align:center;line-height:1.3125;line-height:var(--line-height);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem !important;margin:0 auto;padding:0 1rem;position:relative}.empty-placeholder .media-sticker-wrapper{width:128px;height:128px;margin:0 auto 1.9375rem;position:relative}.empty-placeholder-header{font-size:1.25rem;font-weight:500}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{position:relative;overflow:unset}@media only screen and (min-width: 601px)and (max-width: 1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width: 600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw, 0, 0)}}@media only screen and (min-width: 601px){#column-right{width:calc(var(--right-column-width));transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);position:absolute;right:0;z-index:3;transform:translate3d(var(--right-column-width), 0, 0)}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, 0, 0)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width: 1276px){#column-right{width:calc(var(--right-column-width) + 1px);transform:translate3d(calc(var(--right-column-width) + 1px), 0, 0);border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}@media only screen and (min-width: 601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}}#column-right #search-private-container .chatlist-container{position:relative;flex:1 1 auto}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{width:100%;max-width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0px;perspective-origin:left top}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .search-super{top:100%;min-height:calc((1vh * 100) - 56px);min-height:calc((var(--vh, 1vh) * 100) - 56px)}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{display:flex;align-items:center}.shared-media-container .btn-corner.menu-open:before{content:""}@media only screen and (max-width: 600px){.shared-media-container .btn-corner{width:54px;height:54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{width:100%;max-width:100%;position:absolute;min-height:100%;display:flex;flex-direction:column;background-color:#fff;background-color:var(--surface-color)}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);padding:24px 0px 0px 24px;font-weight:500;color:#707579;color:var(--secondary-text-color)}@media only screen and (max-width: 600px){.search-super .search-super-month-name{padding:18px 0px 0px 16px}}.search-super.sliding{max-height:none !important}.search-super-tabs{width:auto;flex:1 1 auto}.search-super-tabs-scrollable{box-shadow:none !important;position:sticky !important;top:0px;z-index:2;background-color:#fff;background-color:var(--surface-color)}.search-super-tabs-scrollable:before{position:absolute;width:100%;height:1px;left:0;top:0;background-color:inherit;display:block;content:" ";z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{position:relative;display:flex}.search-super-tabs-container{min-height:calc(100% - 49px);grid-template-rows:100%;flex:1 1 auto}.search-super-tabs-container>div{position:relative;min-height:150px}.search-super-tabs-container>div>div:first-child{transform:translateY(0);min-height:calc(100vh - 111px)}.search-super-tabs-container .preloader{padding:0;position:absolute !important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .document-name,.search-super .audio-title,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{flex:0 0 auto;margin-left:8px;margin-top:3px;font-size:12px;color:#707579;color:var(--secondary-text-color)}.search-super-content-media .search-super-month-name{border:none;padding:9px 0px 7px 24px}.search-super-content-media .video-time{position:absolute;left:5px;top:4px;height:18px;border-radius:4px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 5px;z-index:1;font-size:12px;color:#fff;line-height:18px}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute;z-index:2;margin:0}.search-super .document .checkbox-field,.search-super .audio .checkbox-field{top:50%;left:0;margin-left:2rem;margin-top:1rem;transform:translateY(-50%)}.search-super-content-media .search-super-month-items{width:100%;padding-top:1px;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:1px}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width: 600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{padding-left:60px;height:calc(48px + 1.5rem)}.search-super-content-files .document-ico,.search-super-content-files .document-download{width:48px;height:48px;border-radius:5px !important}.search-super-content-files .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis}.search-super-content-links .search-super-item{display:flex;flex-direction:column;padding-left:4.4375rem;position:relative;overflow:hidden;min-height:4.375rem;cursor:pointer;justify-content:flex-start}.search-super-content-links .row-media{height:3rem;width:3rem;border-radius:.375rem;overflow:hidden;position:absolute;left:.6875rem}.search-super-content-links .row-media.empty{display:flex;align-items:center;justify-content:center;font-size:2rem;color:#fff;text-transform:uppercase;background-color:#3390ec;background-color:var(--primary-color)}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:unset}.search-super-content-links .anchor-url:last-child:before{position:absolute;top:0;right:0;bottom:0;left:0;content:" ";cursor:pointer;z-index:1}.search-super-content-links .media-photo{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;white-space:pre-wrap;text-overflow:ellipsis;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{padding:0 !important;margin:2rem 0 0 -1.75rem !important}@media only screen and (min-width: 601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width: 600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 20px}@media only screen and (max-width: 600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:unset;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-top:.5rem;padding-bottom:.5rem}.search-super-content-members .chatlist li{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-0.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent !important}.search-super-selection-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;opacity:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width: 600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{flex-grow:1;font-weight:500;color:#000;color:var(--primary-text-color);white-space:nowrap;text-transform:capitalize;margin-left:1.5rem}#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before{display:none}#search-container .search-group.is-short li:nth-child(n+4){display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{display:flex;flex-direction:column;height:140px;cursor:pointer}#stickers-container .sticker-set-name{font-weight:500}#stickers-container .sticker-set-count{font-size:14px;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-header{display:flex;padding-left:16px;padding-bottom:12px;justify-content:space-between}#stickers-container .sticker-set-button{height:30px;padding-left:12px;padding-right:13px;margin-right:16px;font-size:15px;border-radius:16px;font-weight:400;width:auto;transition:width .2s}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{width:68px;height:68px;position:relative}#stickers-container .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}#stickers-container .sticker-set-sticker img{max-width:100%;max-height:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);padding:0 16px 8px 16px;margin:0;font-weight:500;justify-content:space-between;display:flex;font-size:15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width: 601px){#poll-results-container .poll-results-answer{padding:0 24px 8px 24px}}#poll-results-container .poll-results-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{float:left;padding-right:32px;padding-left:16.5px;font-size:24px;color:#707579;color:var(--secondary-text-color)}#poll-results-container .poll-results h3{padding:0 16px;margin-top:15px;font-size:20px;margin-bottom:16px}@media only screen and (min-width: 601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:normal}#poll-results-container .poll-results li{height:50px;padding:9px}@media only screen and (min-width: 601px){#poll-results-container .poll-results li{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{padding:0 .75rem;margin-bottom:.5625rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none !important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem !important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.88);display:flex;align-items:center;justify-content:center}@media only screen and (max-width: 600px){.media-viewer{background:#000}}.media-viewer-author{height:100%;cursor:pointer;display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width: 600px){.media-viewer-userpic{display:none}}.media-viewer-name{line-height:1.3125;line-height:var(--line-height);font-weight:500;margin:.0625rem 0}@media only screen and (min-width: 601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{line-height:1.3125;line-height:var(--line-height);font-size:.875rem}.media-viewer-buttons{position:absolute;top:0;right:0;display:flex;flex-flow:row nowrap;padding:.5rem .75rem}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:hover,html.no-touch .media-viewer-buttons .btn-icon:active{color:#fff}@media only screen and (max-width: 600px){.media-viewer-buttons{display:none}}.media-viewer-content{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;position:relative;max-width:100%;max-height:100%;overflow:hidden;flex:1 1 auto;display:flex;align-items:center}.media-viewer-media{visibility:hidden}.media-viewer-caption{position:absolute;text-align:center;color:#fff;word-break:break-word;overflow:hidden;text-overflow:ellipsis;z-index:4;bottom:0;left:0;right:0;padding:.5rem .5rem 0;opacity:0;line-height:1.3125;line-height:var(--line-height);white-space:pre-wrap;background-color:transparent}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9 !important}.media-viewer-caption .scrollable{padding:.5rem .875rem;max-height:6rem;max-width:50rem;height:6rem;position:relative;margin:0 auto}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width: 600px){.media-viewer-caption{width:100%;transform:translateZ(0);text-align:unset;bottom:1.0625rem}.media-viewer-caption .scrollable{padding:0 .5rem;height:auto}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0, -69px, 0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:hover,html.no-touch .media-viewer-caption:active{background-color:#000;opacity:1 !important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1 !important}.media-viewer-switcher{position:absolute;left:0;top:3.75rem;width:7rem;height:calc(100% - 7.5rem);cursor:pointer;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width: 600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-prev-button,.media-viewer-next-button{cursor:pointer;position:absolute;color:#fff;font-size:2rem;left:1rem;top:50%;transform:translateY(-50%) rotate(90deg);opacity:0;transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width: 601px){.media-viewer-prev-button,.media-viewer-next-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width: 601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{position:fixed !important;display:flex;justify-content:center;align-items:center;min-height:auto !important;left:0;top:0;transform-origin:top left;overflow:hidden;transform:translateZ(0) scale3d(1, 1, 1);border-radius:0}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}@media only screen and (max-width: 600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{width:100%;height:100%;position:absolute;left:0;top:0}.media-viewer-mover>svg{width:100%;height:100%}.media-viewer-mover img,.media-viewer-mover video{width:100%;height:100%;max-width:100%;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-o-object-fit:cover;object-fit:cover;opacity:1;transition:var(--open-duration) opacity;position:absolute}.media-viewer-mover svg img,.media-viewer-mover svg video{position:unset}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration) / 8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none !important}.media-viewer-mover.center{left:50% !important;top:50% !important;transform:translate3d(-50%, -50%, 0) !important;max-width:100vw;max-height:calc((1vh * 100) - 15rem);max-height:calc((var(--vh, 1vh) * 100) - 15rem)}@media only screen and (max-width: 600px){.media-viewer-mover.center{width:100% !important;height:100% !important;max-width:100vw !important;max-height:calc((1vh * 100) - 120px);max-height:calc((var(--vh, 1vh) * 100) - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{width:auto;-o-object-fit:contain;object-fit:contain}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{position:absolute;top:0;left:0;right:0;height:3.5rem;display:flex;align-items:center;justify-content:space-between;z-index:5;padding:0 1.25rem}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active{opacity:1}.media-viewer-topbar-left{display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{width:100%;height:100%;transform:scale3d(1, 1, 1);position:absolute;border-radius:0;display:flex;align-items:center;justify-content:center}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration: .2s;--move-duration: .35s;top:0;left:0;width:100%;height:100%;position:fixed !important;display:block;z-index:4;visibility:hidden;transition:visibility 0s var(--open-duration)}body.animation-level-0 .media-viewer-whole{--open-duration: 0s;--move-duration: 0s}.media-viewer-whole.active{visibility:visible;transition-delay:0s}.media-viewer-whole.active .overlays,.media-viewer-whole.active .media-viewer-appear{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .overlays,body.animation-level-2 .media-viewer-whole.active .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width: 600px){.media-viewer-whole .btn-menu-toggle{color:rgba(255,255,255,.4);opacity:1}.media-viewer-whole .btn-menu-toggle.menu-open{color:#fff;background-color:rgba(112,117,121,.2) !important}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-movers{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:""}.tgico-zoom.zoom-in:before{content:""}.zoom-container{width:17.125rem;height:3.375rem;background-color:rgba(0,0,0,.4);border-radius:12px;padding:.5rem;opacity:1;display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.25rem;left:50%;transform:translateX(-50%);z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{pointer-events:none;opacity:.4}.zoom-container .progress-line{--color: #fff;--height: 2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.zoom-container:not(.is-visible),.media-viewer-whole:not(.active) .zoom-container{opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0 !important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0 !important}.overlays{top:0;left:0;width:100%;height:100%;position:fixed !important;background-color:rgba(0,0,0,.2);z-index:4;opacity:0;visibility:hidden;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.emoji-dropdown{display:flex;flex-direction:column;width:100%;height:min(282px, calc(1vh * 100 - 135px));height:min(282px, calc(var(--vh) * 100 - 135px));background:#fff;background:var(--surface-color);overflow:hidden;flex:1 1 auto;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-height: 570px)and (min-width: 601px){.emoji-dropdown{position:absolute !important;left:.8125rem;bottom:5.125rem;width:26.25rem !important;height:26.25rem;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:0 100%}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{width:100%;max-width:100%;overflow:hidden;height:100%}.emoji-dropdown .emoji-tabs{justify-content:center;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.emoji-dropdown .emoji-tabs-search{position:absolute;left:0;margin-left:4px !important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0;margin-right:4px !important}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{top:0;font-size:14px;font-weight:500;color:#707579;color:var(--secondary-text-color);z-index:2;padding:12px 6px 6px 6px;width:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{top:0;height:1px}.emoji-dropdown .tabs-container .tabs-tab{min-height:100%;flex-direction:column;height:100%}.emoji-dropdown .tabs-container .emoticons-content{flex:1;padding:0;position:relative}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width: 600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:unset;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill, 40px)}.emoji-dropdown .emoji-padding.active .category-items>span{width:40px;height:40px;justify-self:center}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:unset}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{height:48px;padding:2px;width:100%;z-index:4;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{position:relative;margin:0 -0.125rem}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}.emoji-dropdown #content-stickers .scrollable{padding:0px 5px 0}.emoji-dropdown .menu-horizontal-div{width:100%;height:48px}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{font-size:1.5rem;margin:0 12px;width:48px;height:48px;line-height:48px;display:flex;align-items:center;flex:0 0 auto}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;width:48px;padding:0;margin-right:1px;margin-left:1px}.emoji-dropdown .stickers-padding .menu-wrapper{padding:0;height:48px;max-width:100%;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{padding:8px;max-width:100%;max-height:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{width:100%;height:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{width:0;height:0;opacity:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{width:0;height:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{width:0;height:0;display:none}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{min-height:5rem;max-height:12.5rem;border-radius:10px;background-color:rgba(0, 0, 0, .2);background-color:var(--scrollbar-color);opacity:1}.scrollable-x::-webkit-scrollbar,.no-scrollbar::-webkit-scrollbar{display:none}.scrollable{width:100%;height:100%;overflow-y:hidden;overflow-x:hidden;max-height:100%;transform:translateZ(0);position:absolute;top:0px;left:0px;bottom:0px;right:0px;-webkit-overflow-scrolling:touch}.scrollable.scrollable-x{overflow-x:auto;scrollbar-width:thin;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;-ms-overflow-style:none}.scrollable-padding{min-width:100%;height:100%}@-webkit-keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}.selector{width:100%;height:100%;display:flex;flex-direction:column}.selector-search-container{flex:0 0 auto;position:relative;max-height:132px;overflow:hidden}.selector-search-container .scrollable{position:relative;max-height:inherit}.selector-search{padding:0 24px 0 24px;display:flex;flex-flow:wrap;position:relative}.selector-search-input{border:none;outline:none;flex:1 1 auto}.selector-search .selector-search-input{padding:7px 0px 19px 0px}.selector-user{color:#000;color:var(--primary-text-color);background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);font-size:1rem;padding:0 17px 0px 0px;margin-left:-0.25rem;margin-right:.75rem;height:2rem;line-height:2rem;margin-bottom:7px;border-radius:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:0 0 auto;transition:.2s opacity,.2s transform,.2s background-color;max-width:11.25rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:hover,html.no-touch .selector-user:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:hover .selector-user-avatar:after,html.no-touch .selector-user:active .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.selector-user-avatar:after{position:absolute;content:"";left:0;top:0;background-color:#df3f40;background-color:var(--danger-color);height:100%;width:100%;z-index:2;font-size:23px;line-height:32px !important;opacity:0;transition:.2s opacity,.2s transform;transform:scaleX(-1) rotate(0deg)}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{height:100%;flex:1 1 auto}.selector .chatlist-container .scrollable>:first-child{margin-top:.5rem}.selector .chatlist li{padding-top:.75rem;padding-bottom:.75rem}@media only screen and (max-width: 600px){.selector .chatlist li{height:66px;padding-top:9px;padding-bottom:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px !important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;transform:translateY(-50%);top:50%;z-index:1}.selector .checkbox-field:first-child{margin-right:1.6875rem;margin-left:.6875rem}.selector .checkbox-field-round{pointer-events:none;position:absolute;right:1.125rem;--size: 1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:unset}.selector .checkbox-field-round .checkbox-box-check{--offset: 6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{flex:1 0 auto;max-width:100%;height:100px;margin:2.5px;cursor:pointer;position:relative}.gifs-masonry>.gif video,.gifs-masonry>.gif img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.gifs-masonry>.gif img{position:absolute;left:0;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;height:100%;transform-origin:center center;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:54px;height:54px;display:flex;cursor:pointer;overflow:hidden;opacity:0;transform:scale(0)}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color: #fff}.preloader-container .you-spin-me-round{width:100%;height:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;width:100%;height:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new,body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite !important;animation:rotate 1s linear infinite !important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;color:var(--color);width:56%;height:56%;opacity:1}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-download:hover,html.no-touch .preloader-container .preloader-download:active{background:none}.preloader-container:not(.manual) .preloader-download,.preloader-container.manual .preloader-close{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{width:1.5rem;height:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer !important}.preloader-container.preloader-streamable circle{stroke-width:2.5 !important}.preloader-container.preloader-streamable:after{content:"";position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:var(--color);left:50%;top:50%;transform:translate(-50%, -50%)}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{100%{transform:rotate(360deg)}}@keyframes rotate{100%{transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rp-overflow .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.btn-corner.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple{width:100%;height:100%;overflow:hidden;border-radius:inherit}.rp-overflow .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.btn-corner.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration: .7s;position:absolute;top:0;left:0;bottom:0;right:0}html.is-safari .c-ripple:not(:empty){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%);border-radius:inherit}.c-ripple__circle{background-color:rgba(0, 0, 0, .08);background-color:var(--ripple-color);display:block;position:absolute;transform:scale(0);border-radius:50%;-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;transition:.35s opacity,.35s background-color;pointer-events:none}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration: .2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width: 925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration: .2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}avatar-element{--size: 54px;--multiplier: 1;--color-top: var(--avatar-color-top);--color-bottom: var(--avatar-color-bottom);color:#fff;width:var(--size);height:var(--size);line-height:var(--size) !important;border-radius:50%;background:linear-gradient(var(--color-top), var(--color-bottom));text-align:center;font-size:calc(1.25rem / var(--multiplier));-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase;font-weight:700}avatar-element[data-color=red]{--color-top: var(--peer-avatar-red-top);--color-bottom: var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top: var(--peer-avatar-orange-top);--color-bottom: var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top: var(--peer-avatar-violet-top);--color-bottom: var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top: var(--peer-avatar-green-top);--color-bottom: var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top: var(--peer-avatar-cyan-top);--color-bottom: var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top: var(--peer-avatar-pink-top);--color-bottom: var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top: var(--peer-avatar-blue-top);--color-bottom: var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px / var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px / var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(21px / var(--multiplier)) !important}avatar-element.tgico-reply_filled:before{font-size:calc(28px / var(--multiplier)) !important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px / var(--multiplier))}avatar-element:before{line-height:inherit !important}avatar-element.media-container{position:relative}avatar-element img{width:var(--size) !important;height:var(--size) !important;border-radius:inherit !important;display:block}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{width:calc(1.125rem / var(--multiplier)) !important;height:calc(1.125rem / var(--multiplier)) !important;vertical-align:middle !important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{position:absolute;content:" ";display:block;border-radius:50%;border:2px solid #fff;border:2px solid var(--surface-color);background-color:#0ac630;background-color:var(--avatar-online-color);width:14px;height:14px;left:2.4375rem;top:2.4375rem}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size: 120px;--multiplier: .45}avatar-element.avatar-100{--size: 100px;--multiplier: .54}avatar-element.avatar-48{--size: 48px;--multiplier: 1.125}avatar-element.avatar-46{--size: 46px;--multiplier: 1.173913}avatar-element.avatar-44{--size: 44px;--multiplier: 1.227272}avatar-element.avatar-42{--size: 42px;--multiplier: 1.285714}avatar-element.avatar-40{--size: 40px;--multiplier: 1.35}avatar-element.avatar-34{--size: 34px;--multiplier: 1.588235}avatar-element.avatar-32{--size: 32px;--multiplier: 1.6875}avatar-element.avatar-30{--size: 30px;--multiplier: 1.8}avatar-element.avatar-18{--size: 18px;--multiplier: 3}avatar-element.avatar-16{--size: 16px;--multiplier: 3.375}.avatar-relative .avatar-photo{position:absolute;top:0;left:0}.document{--background-color: var(--primary-color);padding-left:4.25rem;height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#fff;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0 .25rem}@media only screen and (max-width: 600px){.document:not(.document-with-thumb) .document-ico{padding:1.5rem 0px 0px 0px;font-size:14px}.document:not(.document-with-thumb) .document-ico:after{--size: .875rem}}.document-ico:after{--size: 1.125rem;content:"";display:block;position:absolute;top:0;right:0;width:var(--size);height:var(--size);border-bottom-left-radius:.25rem;border-style:solid;border-width:calc(var(--size) / 2);border-left-color:rgba(0,0,0,.25);border-bottom-color:rgba(0,0,0,.25);border-top-color:#fff;border-right-color:#fff}.document-ico,.document-download{font-size:1.125rem;background-size:contain}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#fff;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color: #FB8C00}.document.ext-pdf{--background-color: #DF3F40}.document.ext-apk{--background-color: #43A047}.document.document-with-thumb{--background-color: #fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3) !important}.document-thumb{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.document-name{white-space:nowrap;font-weight:500;font-size:1rem}.document-size{white-space:nowrap;color:#707579;color:var(--secondary-text-color);font-size:.875rem;text-overflow:ellipsis;overflow:hidden}.document-name,.document-size{line-height:1.3125;line-height:var(--line-height)}.document .preloader-container{width:2.5rem;height:2.5rem}@media only screen and (max-width: 600px){.document .preloader-container{width:1.625rem;height:1.625rem}}.document .preloader-circular{background-color:transparent !important}.document .preloader-path-new{stroke-width:2.5}.document,.audio{display:flex;flex-direction:column;justify-content:center;cursor:pointer;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.document-ico,.document-download,.audio-ico,.audio-download{position:absolute;left:0;width:3.375rem;height:3.375rem;color:#fff}.document-download,.audio-download{z-index:1;align-items:center;font-size:1.5rem;cursor:pointer;display:flex;justify-content:center;transition:opacity .2s ease-in-out;opacity:1}.document-download.downloaded,.audio-download.downloaded{opacity:0}.document-description,.audio-description{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.document:not(.corner-download) .preloader-container:not(.preloader-streamable),.audio:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1) !important}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent !important}.audio .preloader-container:not(.preloader-streamable){width:100%;height:100%}.audio{position:relative;padding-left:67px;overflow:visible !important;height:3.375rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:3rem;padding-left:calc(3rem + .5625rem)}.audio-toggle,.audio-download{overflow:hidden;border-radius:50%;background-color:#3390ec;background-color:var(--primary-color);align-items:center}.audio.corner-download .audio-download{width:1.375rem;height:1.375rem;margin:2rem 2rem 0;background:none;display:flex !important;top:0}.audio.corner-download .preloader-container{border-radius:inherit;background-color:#3390ec;background-color:var(--primary-color)}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{position:absolute;top:0;right:0;bottom:0;left:0;transform:rotate(-119deg);overflow:hidden;max-width:100%;max-height:100%;border-radius:inherit}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{position:absolute;background-color:#fff;top:50%;left:50%;transform:translate(-50%, -50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out}@media only screen and (min-width: 601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width: 600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width: 601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width: 600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:23px;margin-top:1px}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color);opacity:.3}html.no-touch .audio-waveform rect:hover,html.no-touch .audio-waveform rect:active{opacity:1}.audio-waveform rect.active,.audio.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform rect{opacity:1}.audio .audio-details{margin-top:3px;margin-bottom:0}.audio .audio-title{margin-bottom:-2px}.audio-ico,.audio-download{width:3rem;height:3rem}.audio .part{height:112px !important;width:112px !important}@media only screen and (max-width: 600px){.audio .part{width:100px !important;height:100px !important}}.audio-title{font-size:1rem;color:#000;color:var(--primary-text-color)}.audio-description:not(:empty):before{content:" • "}.audio-time,.audio-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex}@media only screen and (max-width: 600px){.audio-time,.audio-subtitle{font-size:.75rem}}.audio-title,.audio-time,.audio-subtitle{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-title,.audio-subtitle{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{line-height:1;margin-left:-1px;margin-top:7px;align-items:center}@media only screen and (max-width: 600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{content:" ";width:.5rem;height:.5rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;margin-left:.375rem}.audio .progress-line{--height: 2px;--border-radius: 4px;--thumb-size: .75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{z-index:1;background-color:transparent;opacity:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff !important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;-o-object-fit:cover;object-fit:cover;width:inherit;height:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{position:absolute;left:0;display:flex;width:100%;justify-content:center;top:8px;align-items:center;transform:translate3d(0, calc(-100% - 10px), 0);transition:transform .2s ease}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translate3d(0, 0, 0)}.quiz-hint .container{background:rgba(0,0,0,.7);text-align:center;width:auto;padding:10px 18px 12px 50px;min-height:48px;border-radius:12px;line-height:1.5;color:#fff;font-size:15px;max-width:400px;overflow:hidden;text-align:left;position:relative;display:flex;align-items:center;flex-wrap:wrap}@media only screen and (max-width: 600px){.quiz-hint .container{padding:10px 18px 12px 54px;margin:0 10px;font-size:14px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"";position:absolute;left:15px;font-size:1.5rem;top:12px}.quiz-hint .container a{color:#fff;border-bottom:1px solid #fff}.peer-typing{margin-right:4px}.peer-typing-container{--color: var(--primary-color);color:var(--color)}.peer-typing-flex{display:flex;align-items:center}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;vertical-align:middle;transform:translateY(-1px)}.peer-typing-text-dot{width:6px;height:6px;border-radius:50%;background-color:var(--color);margin:0 .5px;display:inline-block;vertical-align:middle;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:dotMiddle;animation-name:dotMiddle}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{width:13px;height:5px;overflow:hidden;position:relative;border-radius:2px;margin-right:.375rem}.peer-typing-upload:before,.peer-typing-upload:after{display:block;content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--color);border-radius:inherit}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{content:" ";display:block;width:6px;height:6px;border-radius:50%;background-color:var(--color);-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.peer-typing-choosing-sticker{margin-right:.375rem;flex:0 0 auto;display:flex;align-items:center;height:16px}.peer-typing-choosing-sticker-eye{width:8px;height:14px;border-radius:50%;display:inline-block;vertical-align:middle;border:1px solid var(--color);margin:0 .0625rem;position:relative;-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite}.peer-typing-choosing-sticker-eye:before{content:" ";display:block;width:.25rem;height:.25rem;background-color:var(--color);border-radius:50%;position:absolute;top:50%;-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;transform:translate(-1px, -50%)}@-webkit-keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@-webkit-keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@-webkit-keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}@keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}poll-element{margin-top:-1px;display:block;width:330px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#000;color:var(--primary-text-color)}@media only screen and (max-width: 600px){poll-element{width:240px;max-width:100%}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500}@media only screen and (max-width: 600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{font-size:14px;color:#707579;color:var(--secondary-text-color);margin-top:2px;margin-bottom:5px;display:flex;align-items:center;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{position:absolute;font-size:1.5rem;top:-4px;right:2px;color:#3390ec;color:var(--primary-color);cursor:pointer;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{transform:scale(0);pointer-events:none}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;width:18px;height:18px}poll-element .poll-answer{display:flex;position:relative;padding-bottom:20px;padding-left:28px;margin-top:1px}poll-element .poll-answer-text{margin-top:6px;margin-left:12px}poll-element .poll-answer-percents{position:absolute;left:0;top:0;opacity:0;font-weight:500;margin-top:7px;font-size:14px;margin-left:-9px;text-align:right;width:40px}poll-element .poll-answer-selected{position:absolute;bottom:1px;left:15px;color:#fff;background:#3390ec;background:var(--primary-color);border-radius:50%;height:16px;width:16px;font-weight:bold;font-size:.75rem;opacity:1;display:flex;align-items:center;justify-content:center}poll-element .poll-answer-selected:before{content:"";font-weight:bold}html.no-touch poll-element .poll-answer:hover .animation-ring,html.no-touch poll-element .poll-answer:active .animation-ring{visibility:visible;transform:scale(1)}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-0.5rem}poll-element .poll-line{height:35px;position:absolute;left:10px;bottom:2px;stroke-dashoffset:0;stroke-dasharray:0,485.9}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{text-align:center;margin:-0.375rem -0.5rem -0.375rem -0.625rem;height:2.875rem}poll-element .poll-footer-button{cursor:pointer;width:100%;height:100%;color:#3390ec;color:var(--primary-color);font-weight:500;border-top-left-radius:0 !important;border-top-right-radius:0 !important;font-size:1rem;overflow:hidden}poll-element .poll-footer,poll-element .poll-footer-button{display:flex;align-items:center;justify-content:center}poll-element .poll-quiz-timer{width:32px;height:32px;stroke:#a3adb6;transform:rotate(270deg);top:-7px;fill:none;position:absolute;right:-2px;stroke-linecap:round}poll-element .poll-time{font-size:12px;font-weight:500;position:absolute;right:27px;color:#a3adb6}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:"";font-size:12px}poll-element .circle-hover{display:flex;justify-content:center;align-items:center;width:34px;height:34px;position:absolute;left:-1px;top:-1px;transform:scale(1)}poll-element .circle-hover .poll-answer-selected{display:flex !important;opacity:0;left:50%;top:50%;transform:translate(-50%, -50%);width:20px;height:20px;font-size:20px;line-height:16px;-webkit-animation:none;animation:none}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{display:block;border-radius:50%;height:34px;width:34px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);transform:scale(0.1);visibility:hidden}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;width:26px;top:unset;left:unset}poll-element .progress-ring__circle{transform-origin:center;transform:rotate(-90deg);stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent}poll-element.is-voted .circle-hover,poll-element.is-voted .animation-ring{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity .1s ease forwards}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:.34s opacity}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:.1s transform}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-animation-fill-mode:forwards !important;animation-fill-mode:forwards !important}.transition>.transition-item:not(.active):not(.from):not(.to){display:none !important}.transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.transition.zoom-fade>.to{transform-origin:center;opacity:0}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(0.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine: cubic-bezier(.39, .575, .565, 1);--easeInSine: cubic-bezier(.47, 0, .745, .715);position:relative}.transition.slide-fade>.from{transform-origin:left center;transform:translateX(0);opacity:1}.transition.slide-fade>.to{transform-origin:left center;transform:translateX(1.5rem);opacity:0}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}.row{min-height:3.5rem;position:relative;padding:.6875rem 1rem;display:flex;flex-direction:column;justify-content:center}.row a{position:relative;z-index:1}.row-title-row{display:flex;justify-content:space-between;align-items:center;order:0}.row-title-row .row-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word;text-overflow:ellipsis;overflow:hidden}.row-title-right{flex:0 0 auto !important;margin-left:1rem}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{position:absolute;left:1rem;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);pointer-events:none;margin-top:-0.125rem}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width: 601px){.row-clickable{border-radius:10px}}.row .radio-field-main,.row .checkbox-field{padding-left:3.375rem;margin-left:-3.375rem}.row .checkbox-field{margin-right:0;height:auto}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0;margin-right:.125rem;padding:0}.row-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important;font-size:.875rem !important;line-height:1.3125;line-height:var(--line-height);margin-top:.125rem;margin-bottom:.0625rem;order:1}.row-subtitle:empty{display:none}.row-media{width:48px !important;height:48px !important;position:absolute !important;margin:0 !important;left:.5rem}.row.menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.color-picker{width:380px;max-width:100%;margin:1.1875rem auto 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.color-picker-box{width:100%;height:198px}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible !important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);position:absolute !important;right:0;bottom:calc(100% + .625rem);width:26.25rem !important;max-width:100%;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:bottom right;padding:.625rem !important;display:block !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{width:100%;border-radius:.375rem;border:2px solid #3390ec;border:2px solid var(--primary-color);text-align:center;color:#3390ec;color:var(--primary-color);background-color:transparent;height:3rem;font-weight:500;font-size:.9375rem}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:hover,html.no-touch .reply-keyboard-button:active{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.popup{position:fixed !important;top:0;right:0;bottom:0;left:0;max-width:none;z-index:3;background-color:rgba(0,0,0,.3);margin:0;padding:1.875rem;box-shadow:none;opacity:0;visibility:hidden;transition-property:opacity,visibility;transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-timing-function:cubic-bezier(.4, 0, .2, 1);transition-timing-function:var(--popup-transition-function);overflow:auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;visibility:visible;transition-delay:0s,0s;z-index:4}.popup.active .popup-container{transform:translate3d(0, 0, 0)}.popup.hiding .popup-container{transform:translate3d(0, 0, 0)}.popup-container{position:relative;border-radius:10px;background-color:#fff;background-color:var(--surface-color);padding:1rem;transform:translate3d(0, 3rem, 0);-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .15s cubic-bezier(.4, 0, .2, 1);transition:transform var(--popup-transition-time) var(--popup-transition-function);display:flex;flex-direction:column;overflow:hidden;margin:auto}body.animation-level-0 .popup-container{transition:none}.popup-centerer{margin:auto}.popup-close{z-index:3;justify-self:center;flex:0 0 auto}.popup-header{display:flex;margin-bottom:2rem;align-items:center}.popup-body{flex:1 1 auto;display:flex;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-top:0 !important;margin-right:1.125rem}.popup-buttons .btn{font-weight:500;padding:.5rem;text-transform:uppercase;border-radius:8px;position:relative;overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis}.popup-buttons .btn+.btn{margin-top:.5rem;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{position:absolute;bottom:20px;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;text-align:left;margin:0;margin-left:2rem}.popup-avatar .crop{max-width:100%;max-height:100%;padding:24px 54px 46px 46px;border-radius:8px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{width:420px;max-width:420px;padding:12px 20px 32.5px;max-height:100%}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{width:auto;height:36px;font-size:14px;font-weight:normal;padding:0 1.375rem;margin-top:-3px;border-radius:10px;text-transform:uppercase}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;padding-left:1.5rem;margin:0;margin-top:-3px;font-size:1.25rem;font-weight:500}.popup-new-media .popup-photo{max-width:380px;overflow:hidden;width:100%;border-radius:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{width:100%;margin-top:25px;flex:0 0 auto}.popup-new-media .input-field-input{font-size:1rem;border-radius:10px}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{z-index:4;top:calc(100% + .25rem)}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{position:relative;border-radius:inherit;overflow:hidden}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{max-width:100%;overflow:hidden;cursor:default;padding-left:3.75rem;height:4.5rem}.popup-new-media.popup-send-photo .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;line-height:1.5}.popup-new-media.popup-send-photo .document-ico{height:48px;width:48px;font-size:16px;font-weight:normal;line-height:11px;letter-spacing:0}.popup-create-contact .name-fields{display:flex;flex-direction:column;position:relative;padding-left:116px;margin-top:1rem}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{display:flex;margin-bottom:.625rem;align-items:center}.popup-peer .popup-container{padding:1rem 1.5rem .8125rem;max-width:min(400px, 100%)}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{margin-top:0;margin-bottom:0;min-width:15rem;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;text-overflow:ellipsis;overflow:hidden;word-break:break-word;line-height:1.3125;line-height:var(--line-height)}.popup-peer .popup-buttons{margin-top:1.625rem;margin-right:-0.5rem}.popup-peer .popup-buttons .btn{font-weight:500}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin:0 -1.0625rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{padding:0 2rem 0 1.5rem;margin:0;font-size:1.25rem;font-weight:500;line-height:1.3125;line-height:var(--line-height)}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);text-align:center;color:#3390ec;color:var(--primary-color)}.popup-stickers .sticker-set-footer .btn-primary{text-transform:uppercase;width:auto;padding:0 1.0625rem;height:44px}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-width:420px;max-height:420px;width:420px;padding:0}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{margin-bottom:12px;flex:0 0 auto;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{padding:0 5px;display:grid;grid-template-columns:repeat(5, 1fr)}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4, 1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{width:80px;width:var(--esg-sticker-size);height:80px;height:var(--esg-sticker-size);margin-bottom:2px;justify-self:center;cursor:pointer;position:relative}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height: 470px){.popup-date-picker .popup-container[data-lines="7"]{top:19px}.popup-date-picker .popup-container[data-lines="5"]{top:-19px}}.popup-date-picker .popup-header{margin-left:6px;margin-top:4px;margin-bottom:1.375rem}.popup-date-picker .popup-title{font-weight:500;font-size:20px}.popup-date-picker .popup-buttons{order:2;margin-right:-2px}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{display:flex;justify-content:space-between;align-items:center}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-prev:disabled,.popup-date-picker .date-picker-next:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-top:7px;margin-bottom:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7, 1fr);width:100%;justify-content:center}.popup-date-picker .date-picker-month .btn-icon{justify-self:center;width:38px;height:38px;font-size:12px;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;align-items:center}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7 !important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{color:#fff;color:var(--badge-text-color);border-radius:50%;background-color:#3390ec !important;background-color:var(--primary-color) !important}.popup-schedule .popup-header{justify-content:space-between;margin-top:5px;margin-bottom:17px;margin-left:0}@media only screen and (max-width: 600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;width:420px;padding:4px 16px 16px 16px}@media only screen and (max-width: 600px){.popup-schedule .popup-container{min-width:312px;width:312px;padding:4px 14px 14px 14px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-right:-20px;margin-left:2px;width:unset}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-weight:500;font-size:20px;margin-left:-5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{justify-self:auto;font-weight:500;font-size:14px;width:36px;height:36px;margin-top:-4px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8 !important}.popup-schedule .date-picker-month-day{font-weight:bold;color:#000 !important;color:var(--primary-text-color) !important;font-size:14px !important}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width: 600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:normal}@media only screen and (max-width: 600px){.popup-schedule .btn-primary{height:50px;widtH:280px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px, 100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main::before{left:.25rem}.popup-create-poll .radio-field .radio-field-main::after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none;opacity:0 !important}.popup-create-poll .input-field .btn-icon{position:absolute;right:.4375rem;top:.4375rem;z-index:1;opacity:1;transition:opacity .2s ease}@media only screen and (max-width: 600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{margin-top:.875rem;font-size:.875rem;line-height:1.2}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{top:54px;right:20px}.popup-forward .popup-container{width:420px;max-width:420px;padding:7px 0 0 0;max-height:min(40.625rem, 100%);height:40.625rem}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width: 600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .selector,.popup-forward .chatlist-container{height:auto;overflow:hidden;display:flex;width:100%;flex-direction:row;flex:1 1 auto}.popup-forward .selector-search-input{font-size:1.25rem;padding:.5rem 1.5rem;width:100%;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0 !important}.popup-forward .selector .chatlist li{height:3.875rem !important;padding-top:.5rem !important;padding-bottom:.5rem !important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;text-align:center;pointer-events:none}.popup-instance-deactivated .header{font-size:2rem;color:#fff}.popup-instance-deactivated .subtitle{color:#fff;opacity:.6;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:bold;margin:.75rem 0 .25rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{width:100px;height:100px;position:relative;margin:0 auto}.popup-report-messages-confirm .popup-body{margin:1em -0.5rem .375rem -0.5rem;overflow:unset}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}#auth-pages{max-width:100%;overflow:hidden;background:#fff;background:var(--surface-color)}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width: 600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width: 600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width: 600px){#auth-pages .input-wrapper{margin-top:41px;width:100%;padding:0 16px}}#auth-pages .auth-image,#auth-pages .subtitle,#auth-pages .input-wrapper{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;position:relative;max-width:720px;margin:0 auto}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height: 810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{max-width:720px;min-width:auto;margin:0 auto;position:relative}#auth-pages .tabs-container .tabs-tab .container{height:810px;padding:0;flex:1 1 auto;display:flex;flex-direction:column;width:100%}@media screen and (max-height: 810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width: 600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-top:.5rem;margin-bottom:.5rem}.page-sign .auth-image,.page-signUp .auth-image{width:7.5rem;height:7.5rem;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.page-sign .auth-image,.page-signUp .auth-image{width:10rem;height:10rem;margin-bottom:1.5rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{max-width:100%;max-height:100%;fill:#3390ec;fill:var(--primary-color)}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:normal}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:unset !important}.page-signQR .auth-image{width:240px !important;height:240px !important;display:flex;justify-content:center;align-items:center}.page-signQR .auth-image .preloader{transform:none;left:unset;top:unset}.page-signQR .auth-image .qr-canvas{width:100%;height:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem !important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{max-width:480px;margin:1rem auto;line-height:1.3125;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-top:10px;margin-bottom:14px}@media only screen and (max-width: 600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width: 600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{display:flex;align-items:center;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{padding:0 1rem;border:none;outline:none;padding:0 1rem;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color)}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:calc(1680px + 2px) !important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{width:100%;overflow:hidden;position:relative;min-height:100%;height:100%;max-height:100%}@media only screen and (max-width: 600px){.page-chats .main-column{width:100%;display:flex !important;z-index:1}}@media only screen and (min-width: 601px){.page-chats #column-center{display:flex !important;background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex !important}.page-chats .main-column{height:100%;position:relative;min-height:100%;max-height:100%}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;width:100%;max-height:100%;height:100%;overflow:hidden;position:absolute;left:0;top:0;z-index:3}@media only screen and (min-width: 1681px){.page-chats{border-top-width:0;border-right-width:1px;border-bottom-width:0;border-left-width:1px;border-style:solid;border-color:#dfe1e5;border-color:var(--border-color)}}.page-chats .avatar-edit{width:120px;height:120px;margin:1rem auto 2rem;flex:0 0 auto}body.animation-level-2 .page-chats .main-column{transition:.25s ease-in-out;transition:var(--tabs-transition)}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}html,body{height:100%;width:100%;margin:0;padding:0}@media only screen and (max-width: 600px){html,body{overflow:hidden;height:calc(1vh * 100);height:calc(var(--vh, 1vh) * 100)}}html.is-ios{position:fixed;-webkit-user-select:none;-webkit-touch-callout:none}@supports(padding: max(0px)){html{padding:0 min(16px, env(safe-area-inset-right)) 0 min(16px, env(safe-area-inset-left))}}html{font-size:16px;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,input,optgroup,select,textarea,html{font-family:"Roboto",-apple-system,apple color emoji,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}input,textarea,button,select,a,div{-webkit-tap-highlight-color:rgba(0,0,0,0)}.whole{min-height:100%;width:100%;margin:0 auto;max-width:1680px;height:100%}@media only screen and (min-width: 601px){.only-handhelds{display:none !important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500}h4{font-size:2rem;margin:22px 0 14px;line-height:110%}@media only screen and (max-width: 600px){h4{font-size:20px;margin:2px 0 8px}}input,[contenteditable=true]{caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color);background-color:transparent}input,textarea{-webkit-appearance:none}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40 !important;color:var(--danger-color) !important}.danger .c-ripple__circle{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec !important;color:var(--primary-color) !important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.blue:before,.primary:before,.danger:before{color:inherit !important}.bg-warning{background:#fed85a !important}.contextmenu{position:fixed !important;right:auto !important;bottom:auto !important;width:auto !important;z-index:4 !important}.preloader{width:50px;height:50px;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);padding:.5rem 1rem;background-color:rgba(0,0,0,.66);color:#fff;font-size:1rem;border-radius:10px;-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;z-index:5;max-width:22.5rem}.toast b{color:inherit}hr{width:100%;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:bolder}.user-last-message b{font-weight:400}.avatar-edit{position:relative;border-radius:50%;cursor:pointer;overflow:hidden}.avatar-edit-canvas{max-width:100%;max-height:100%;width:100%;height:100%;background:linear-gradient(#72d5fd, #2a9ef1);background:linear-gradient(var(--avatar-color-top), var(--avatar-color-bottom))}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{position:absolute;font-size:48px;line-height:48px;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);z-index:2;color:#fff}.avatar-edit .avatar-placeholder{position:absolute;left:0;top:0;width:100%;height:100%;filter:brightness(0.7)}.missing-icon{width:1.5rem;height:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{max-height:23.5rem;position:absolute;width:100%;top:calc(100% + .5rem);left:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);z-index:3;border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;transition:opacity .2s ease-out,transform .2s ease-out;transform:scale(0.95);transform-origin:top center;opacity:0}.select-wrapper.active{transform:scale(1);opacity:1}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;padding:0 1rem;justify-content:space-between;height:3.5rem;cursor:pointer;text-align:left;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px}html.no-touch .select-wrapper li:hover,html.no-touch .select-wrapper li:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{height:26px;width:26px;font-size:26px;line-height:1}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{width:166px;height:166px;margin:0 auto 18px;position:relative}@media only screen and (max-width: 600px){.auth-image{width:120px;height:120px}}.phone-edit{display:inline-block;width:24px;height:24px;margin-left:.4rem;opacity:.5;transition:.2s opacity;cursor:pointer;font-size:1.5rem}@media only screen and (max-width: 600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:hover,html.no-touch .phone-edit:active{opacity:1}span.emoji{display:inline !important;vertical-align:unset !important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1 !important}@media not screen and (-webkit-min-device-pixel-ratio: 2),not screen and (min-device-pixel-ratio: 2),not screen and (min-resolution: 192dpi),not screen and (min-resolution: 2dppx){html:not(.is-safari) span.emoji{margin-right:5px !important}html:not(.is-safari) avatar-element span.emoji{margin-right:0 !important}}img.emoji{width:18px;height:18px;display:inline-block;max-width:100%;max-height:100%;vertical-align:middle}[contenteditable=true]{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;outline:none;cursor:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{content:attr(data-placeholder);color:#a2acb4;display:block;pointer-events:none}.sticky_sentinel{position:absolute;left:0;right:0;visibility:hidden;pointer-events:none}.super-stickers{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}html.no-touch .super-sticker:hover,html.no-touch .super-sticker:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;padding-right:32px;padding-left:16px;font-size:24px;color:#707579;color:var(--secondary-text-color)}.content-empty{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@-webkit-keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}@keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{width:100%;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.grid-item{height:0;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{position:absolute;left:0;top:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.animated-super-row{--translateY: 100%;position:absolute;left:0;top:0;right:0;bottom:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0, calc(var(--translateY) * -1), 0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0, var(--translateY), 0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{position:absolute;left:0;top:0;bottom:0;right:0}middle-ellipsis-element{width:100%;overflow:hidden;display:block}.album-item-media{width:100%;height:100%}html.no-touch .hover-effect:hover,html.no-touch .hover-effect:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.progress-ring{position:absolute;top:0;left:0;pointer-events:none}.progress-ring__circle{transition:stroke-dashoffset;stroke-linecap:round}.rlottie,.rlottie-vector{left:0;top:0;bottom:0;right:0;position:absolute;max-width:100%;max-height:100%;width:100%;height:100%}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.media-photo,.media-video,.media-sticker,.media-round,.media-poster{position:absolute;top:0;right:0;bottom:0;left:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-video.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-poster.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-video.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-poster.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{margin:auto;-o-object-fit:contain;object-fit:contain;width:100%;height:100%;max-width:100%;max-height:100%}.media-round{max-width:280px;max-width:var(--round-video-size);max-height:280px;max-height:var(--round-video-size);z-index:1}.media-round canvas{width:100%;height:100%;border-radius:50%;position:relative}.media-round .video-time{padding:0 .375rem;background-color:hsla(85.5319, 36.9171%, 40.402%, .4) !important;background-color:var(--message-highlightning-color) !important}.media-round .video-time:before,.media-round .video-time:after{margin-left:.25rem}.media-round.is-unread .video-time:before{order:1;width:.5rem;height:.5rem;background-color:#fff;border-radius:50%;content:" "}.media-round.is-paused .video-time:after{content:"";display:flex;align-items:center;font-size:1.125rem;order:2}.gradient-delimiter{width:100%;height:.75rem;background-color:#f4f4f5;background-color:var(--background-color-true);position:relative}.gradient-delimiter:before{content:" ";position:absolute;left:0;top:0;right:0;bottom:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0.06) 100%)}.tgico-reply:before,.tgico-attach:before,.tgico-saved:before,.tgico-phone:before,.tgico-admin:before,.tgico-message:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-reply_filled:before,.tgico-forward_filled:before{font-size:20px !important;padding:0 2px}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{display:grid;grid-column-gap:2.44px;grid-template-columns:repeat(auto-fill, 2.625rem);justify-content:space-between;font-size:2.125rem;line-height:2.125rem}.super-emojis .super-emoji{display:inline-block;margin:0 .0625rem;padding:.25rem;line-height:inherit;border-radius:8px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem;height:2.625rem}html:not(.emoji-supported) .super-emojis .super-emoji{position:relative}.super-emojis .super-emoji .emoji-placeholder{position:absolute;left:7px;top:7px;width:1.75rem;height:1.75rem;border-radius:50%;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);pointer-events:none}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{width:100%;height:100%;vertical-align:unset;margin:0}html.no-touch .super-emojis .super-emoji:hover,html.no-touch .super-emojis .super-emoji:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:"Roboto" !important;font-weight:500;width:1.5rem;text-align:center}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status-icon{position:absolute;line-height:1 !important}.verified-icon{flex:0 0 auto;width:1.25rem;height:1.25rem;margin-left:.125rem} -@font-face{font-family:"tgico";src:url("assets/fonts/tgico.ttf?vbev5x") format("truetype"),url("assets/fonts/tgico.woff?vbev5x") format("woff"),url("assets/fonts/tgico.svg?vbev5x#tgico") format("svg");font-weight:normal;font-style:normal;font-display:block}[class^=tgico-],.tgico:before,.tgico:after,[class*=" tgico-"]:before,[class*=" tgico-"]:after{font-family:"tgico";speak:never;font-style:normal;font-weight:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tgico-avatarnext:before{content:""}.tgico-avatarprevious:before{content:""}.tgico-forward_filled:before{content:""}.tgico-reply_filled:before{content:""}.tgico-check:before{content:""}.tgico-checks:before{content:""}.tgico-activesessions:before{content:""}.tgico-add: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-bold:before{content:""}.tgico-botcom:before{content:""}.tgico-bots:before{content:""}.tgico-bug:before{content:""}.tgico-calendar:before{content:""}.tgico-calendarfilter:before{content:""}.tgico-camera:before{content:""}.tgico-cameraadd:before{content:""}.tgico-car:before{content:""}.tgico-channel:before{content:""}.tgico-channelviews:before{content:""}.tgico-chatspinned:before{content:""}.tgico-chatsplaceholder:before{content:""}.tgico-check1:before{content:""}.tgico-checkbox:before{content:""}.tgico-checkboxblock:before{content:""}.tgico-checkboxempty:before{content:""}.tgico-checkboxon:before{content:""}.tgico-checkretract:before{content:""}.tgico-checkround:before{content:""}.tgico-close:before{content:""}.tgico-clouddownload:before{content:""}.tgico-colorize:before{content:""}.tgico-comments:before{content:""}.tgico-commentssticker:before{content:""}.tgico-copy:before{content:""}.tgico-darkmode:before{content:""}.tgico-data:before{content:""}.tgico-delete_filled:before{content:""}.tgico-delete: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-enter:before{content:""}.tgico-eye1:before{content:""}.tgico-eye2:before{content:""}.tgico-favourites:before{content:""}.tgico-flag:before{content:""}.tgico-folder:before{content:""}.tgico-fontsize:before{content:""}.tgico-forward:before{content:""}.tgico-fullscreen:before{content:""}.tgico-gifs:before{content:""}.tgico-group:before{content:""}.tgico-help:before{content:""}.tgico-image:before{content:""}.tgico-info:before{content:""}.tgico-info2:before{content:""}.tgico-italic:before{content:""}.tgico-keyboard:before{content:""}.tgico-lamp:before{content:""}.tgico-language:before{content:""}.tgico-largepause:before{content:""}.tgico-largeplay:before{content:""}.tgico-left:before{content:""}.tgico-link:before{content:""}.tgico-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-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-play:before{content:""}.tgico-plus:before{content:""}.tgico-poll:before{content:""}.tgico-previous:before{content:""}.tgico-radiooff:before{content:""}.tgico-radioon:before{content:""}.tgico-readchats:before{content:""}.tgico-recent:before{content:""}.tgico-replace:before{content:""}.tgico-reply: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-smallscreen:before{content:""}.tgico-smile:before{content:""}.tgico-sport:before{content:""}.tgico-stickers:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools:before{content:""}.tgico-unarchive:before{content:""}.tgico-underline:before{content:""}.tgico-unmute:before{content:""}.tgico-unpin:before{content:""}.tgico-unread:before{content:""}.tgico-up:before{content:""}.tgico-user:before{content:""}.tgico-username:before{content:""}.tgico-zoomin:before{content:""}.tgico-zoomout:before{content:""} - -/*# sourceMappingURL=main.e47f94920a4918a10f5a.css.map*/ \ No newline at end of file diff --git a/public/main.e47f94920a4918a10f5a.css.map b/public/main.e47f94920a4918a10f5a.css.map deleted file mode 100644 index 1fb31b861..000000000 --- a/public/main.e47f94920a4918a10f5a.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/materialize.scss","webpack:///./src/scss/style.scss","webpack:///./src/scss/tgico.scss"],"names":[],"mappings":"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","file":"main.e47f94920a4918a10f5a.css","sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{text-decoration:none;-webkit-tap-highlight-color:transparent}img,video{-webkit-user-drag:none}.valign-wrapper{display:flex;align-items:center}.z-depth-0{box-shadow:none !important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none !important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition{transition:none !important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start !important}.justify-self-start{justify-self:flex-start !important}.justify-self-end{justify-self:flex-end !important}.position-center{position:absolute !important;left:50%;top:50%;transform:translate(-50%, -50%)}.text-bold{font-weight:500 !important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap !important}.no-border-radius{border-radius:0 !important}.disable-hover{pointer-events:none !important}a{text-decoration:none}html{line-height:1.5;font-weight:normal}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}pre,code{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}",":root{--vh: 1vh;--z-below: -1;--hover-alpha: 0.08;--transition-standard-easing: cubic-bezier(.4, .0, .2, 1);--transition-standard-in-time: .3s;--transition-standard-out-time: .25s;--transition-standard-in: var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out: var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition: .2s ease-in-out;--layer-transition: .2s cubic-bezier(.4, .0, .2, 1);--slide-header-transition: .4s ease-in-out;--tabs-transition: .25s ease-in-out;--btn-menu-transition: .2s cubic-bezier(.4, 0, .2, 1);--esg-transition: var(--btn-menu-transition);--popup-transition-function: cubic-bezier(.4, 0, .2, 1);--popup-transition-time: .15s;--btn-corner-transition: .2s cubic-bezier(.34, 1.56, .64, 1);--chatlist-badge-transition-in: .2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out: .2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin: 5.5625rem;--message-beside-button-size: 2.375rem;--message-beside-button-margin: calc((var(--message-beside-button-size) + .5rem) * -1);--message-time-background: rgba(0, 0, 0, .35);--message-highlightning-color: hsla(85.5319, 36.9171%, 40.402%, .4);--messages-container-width: 728px;--messages-text-size: 16px;--messages-secondary-text-size: calc(var(--messages-text-size) - 2px);--line-height: 1.3125;--esg-sticker-size: 80px;--disabled-opacity: .3;--round-video-size: 280px;--peer-avatar-red-top: #ff885e;--peer-avatar-red-bottom: #ff516a;--peer-avatar-orange-top: #ffcd6a;--peer-avatar-orange-bottom: #ffa85c;--peer-avatar-violet-top: #82b1ff;--peer-avatar-violet-bottom: #665fff;--peer-avatar-green-top: #a0de7e;--peer-avatar-green-bottom: #54cb68;--peer-avatar-cyan-top: #53edd6;--peer-avatar-cyan-bottom: #28c9b7;--peer-avatar-blue-top: #72d5fd;--peer-avatar-blue-bottom: #2a9ef1;--peer-avatar-pink-top: #e0a2f3;--peer-avatar-pink-bottom: #d669ed}@media only screen and (max-width: 600px){:root{--right-column-width: 100vw;--esg-sticker-size: 68px;--round-video-size: 200px;--chat-input-size: 2.875rem;--chat-input-padding: 0.5rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 601px){:root{--right-column-width: calc(1680px / 4);--chat-input-size: 3.375rem;--chat-input-padding: 0.8125rem;--chat-input-inner-padding: 0.5rem}}@media only screen and (max-height: 569px){:root{--chat-input-size: 2.875rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 1276px)and (max-width: 1680px){:root{--right-column-width: 25vw}}:root{--body-background-color: #fff;--background-color-true: #f4f4f5;--background-color: #fff;--border-color: #dfe1e5;--surface-color: #fff;--scrollbar-color: rgba(0, 0, 0, .2);--input-search-background-color: #fff;--input-search-border-color: #dfe1e5;--primary-color: #3390ec;--light-primary-color: rgba(51, 144, 236, 0.08);--dark-primary-color: #157ce1;--primary-text-color: #000;--secondary-color: #c4c9cc;--secondary-text-color: #707579;--light-secondary-text-color: rgba(112, 117, 121, 0.08);--danger-color: #df3f40;--light-danger-color: rgba(223, 63, 64, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-blue-top);--avatar-color-bottom: var(--peer-avatar-blue-bottom);--chatlist-status-color: var(--avatar-online-color);--chatlist-pinned-color: #a2abb2;--badge-text-color: #fff;--link-color: #00488f;--ripple-color: rgba(0, 0, 0, .08);--poll-circle-color: var(--border-color);--message-background-color: var(--surface-color);--message-checkbox-color: #61c642;--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #eeffde;--light-message-out-background-color: rgba(238, 255, 222, 0.08);--dark-message-out-background-color: #d9ffb5;--message-out-link-color: var(--link-color);--message-out-primary-color: #4fae4e;--message-out-status-color: var(--message-out-primary-color);--message-out-audio-play-button-color: #fff}html.night{--body-background-color: #181818;--background-color-true: #181818;--background-color: #212121;--border-color: #0f0f0f;--surface-color: #212121;--scrollbar-color: rgba(255, 255, 255, .2);--input-search-background-color: #181818;--input-search-border-color: #2f2f2f;--primary-color: #8774E1;--light-primary-color: rgba(135, 116, 225, 0.08);--dark-primary-color: #6a52da;--primary-text-color: #fff;--secondary-color: #707579;--secondary-text-color: #aaaaaa;--light-secondary-text-color: rgba(170, 170, 170, 0.08);--danger-color: #ff595a;--light-danger-color: rgba(255, 89, 90, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-violet-top);--avatar-color-bottom: var(--peer-avatar-violet-bottom);--chatlist-status-color: var(--primary-color);--chatlist-pinned-color: var(--secondary-color);--badge-text-color: #fff;--link-color: var(--primary-color);--ripple-color: rgba(255, 255, 255, .08);--poll-circle-color: #fff;--message-background-color: var(--surface-color);--message-checkbox-color: var(--primary-color);--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #8774E1;--light-message-out-background-color: rgba(135, 116, 225, 0.08);--dark-message-out-background-color: #6a52da;--message-out-link-color: #fff;--message-out-primary-color: #fff;--message-out-status-color: rgba(255, 255, 255, .6);--message-out-audio-play-button-color: var(--message-out-background-color)}.input-wrapper{width:360px;margin:0 auto}.input-field{--height: 54px;--border-radius: 10px;position:relative}@media only screen and (max-width: 600px){.input-field{--height: 50px}}.input-field .arrow-down{position:absolute;content:\" \";top:50%;bottom:0;right:21px;cursor:pointer;height:0;width:0;border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;display:inline-block;padding:5px;vertical-align:middle;z-index:2;margin-top:-9px;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:.2s all}.input-field label{position:absolute;color:#9e9e9e;top:0;left:1rem;right:auto;z-index:2;height:1.5rem;transform:translate(0, 0);background-color:#fff;background-color:var(--surface-color);transform-origin:left center;pointer-events:none;margin-top:calc((var(--height) - 1.5rem) / 2);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-2 .input-field label{transition:.2s transform,.2s padding,.1s opacity,font-weight 0s .1s}.input-field-border{position:absolute;top:0;right:0;bottom:0;left:0;border:2px solid #3390ec;border:2px solid var(--primary-color);opacity:0;border-radius:var(--border-radius);pointer-events:none;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding: 1rem;--padding-horizontal: 1rem;--border-width: 1px;border:var(--border-width) solid #dfe1e5;border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);background-color:#fff;background-color:var(--surface-color);padding:calc(var(--padding) - var(--border-width));box-sizing:border-box;width:100%;min-height:var(--height);transition:0s border-color;position:relative;z-index:1;line-height:1.3125;line-height:var(--line-height)}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{-webkit-box-shadow:0 0 0px 1000px #fff inset;-webkit-box-shadow:0 0 0px 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill::first-line,.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{font-family:\"Roboto\",-apple-system,apple color emoji,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif !important;font-size:1rem !important;color:#000 !important;color:var(--primary-text-color) !important}@media only screen and (max-width: 600px){.input-field-input{--padding: .9375rem}}body.animation-level-0 .input-field-input{transition:none !important}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:.2s border-color}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40 !important;color:var(--danger-color) !important}.input-field-input.error~.input-field-border{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f !important}.input-field-input.valid~.input-field-border{border-color:#26962f !important}.input-field-input:focus~.arrow-down{margin-top:-4px;transform:rotate(225deg);border-color:#3390ec;border-color:var(--primary-color)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:focus~label,.input-field-input:valid~label,.input-field-input:not(:empty)~label,.input-field-input:disabled~label{transform:translate(-0.25rem, calc(var(--height) / -2 + .125rem)) scale(0.75);padding:0 6px;opacity:1}.input-field-input-fake{opacity:0;pointer-events:none;position:absolute !important;top:0;left:0;bottom:auto !important;right:auto !important;height:auto !important;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}input:focus,button:focus{outline:none}.input-clear{outline:none;border:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40 !important;color:var(--danger-color) !important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}.input-search{position:relative;width:100%;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;--border-radius: 22px}@media only screen and (max-width: 600px){.input-search{margin-left:1rem}}.input-search-input{--height: 42px;background-color:#fff;background-color:var(--input-search-background-color);padding:0px calc(var(--height) + 3px - var(--border-width));height:var(--height);min-height:var(--height) !important;max-height:var(--height) !important;border-color:#dfe1e5;border-color:var(--input-search-border-color);line-height:var(--height)}body.animation-level-2 .input-search-input{transition:background-color .2s ease-in-out,border-color .2s ease-in-out}html.no-touch .input-search-input:hover:not(:focus),html.no-touch .input-search-input:active:not(:focus){border-color:#c4c9cc !important;border-color:var(--secondary-color) !important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:hover,html.no-touch .input-search-input:focus~.btn-icon:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{position:absolute;top:50%;transform:translate(0, -50%);text-align:center;font-size:24px;color:#707579;color:var(--secondary-text-color);opacity:.6;line-height:1;z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{width:24px;height:24px;left:.8125rem;pointer-events:none}.input-search>.tgico-close{right:0px;z-index:1;width:42px;height:42px}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{padding-right:2.5rem;max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-size:2.25rem;padding-left:calc(.875rem - var(--border-width))}@media(-webkit-min-device-pixel-ratio: 2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{position:absolute;right:.375rem;z-index:2;font-size:1.5rem;color:#9e9e9e;cursor:pointer;transition:color .2s;padding:.5rem;display:flex;align-items:center;justify-content:center;top:50%;transform:translateY(-50%)}.input-field-password .toggle-visible:before{content:\"\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"\"}html.no-touch .input-field-password .toggle-visible:hover,html.no-touch .input-field-password .toggle-visible:active{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing: .24px}.input-field-phone .input-field-input:after{content:attr(data-left-pattern);color:#9e9e9e;letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;outline:none;border:none;cursor:pointer}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn:hover,html.no-touch .btn:active,html.no-touch .btn-icon:hover,html.no-touch .btn-icon:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn.primary:hover,html.no-touch .btn.primary:active,html.no-touch .btn.blue:hover,html.no-touch .btn.blue:active,html.no-touch .btn.active:hover,html.no-touch .btn.active:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn-icon.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn:disabled,.btn-icon:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{text-align:center;font-size:1.5rem;line-height:1;border-radius:50% !important;color:#707579;color:var(--secondary-text-color);background-color:transparent;border:none;padding:.5rem;position:relative;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out;display:flex;align-items:center;justify-content:center}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset: 1.25rem;--translateY: calc(54px + var(--offset));position:absolute !important;bottom:var(--offset);right:var(--offset);transition:transform .2s cubic-bezier(.34, 1.56, .64, 1) !important;transition:transform var(--btn-corner-transition) !important;transform:translate3d(0, var(--translateY), 0);z-index:3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#3390ec;background-color:var(--primary-color);text-align:center;font-size:1.5rem;color:#fff;border:none;outline:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0 !important}.btn-corner.is-visible{--translateY: 0}body.animation-level-0 .btn-corner{transition:none !important}.btn-corner:disabled{opacity:1 !important;pointer-events:all !important}.btn-corner .preloader-circular{width:2.5rem;height:2.5rem}.btn-menu{visibility:hidden;position:absolute;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 2px 8px 1px rgba(0,0,0,.24);z-index:3;top:100%;padding:.5rem 0;border-radius:10px;opacity:0;transform:scale(0.8);transition:opacity .2s cubic-bezier(.4, 0, .2, 1),transform .2s cubic-bezier(.4, 0, .2, 1),visibility .2s cubic-bezier(.4, 0, .2, 1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);font-size:16px;-webkit-user-select:none;-webkit-touch-callout:none}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{visibility:visible;opacity:1;transform:scale3d(1, 1, 1)}.btn-menu:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none !important}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{top:auto;top:initial;right:0;bottom:100%;transform-origin:bottom right}.btn-menu.top-right{top:auto;top:initial;left:0;bottom:100%;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{display:flex;position:relative;padding:0 40px 0 1rem;height:56px;cursor:pointer !important;pointer-events:all !important;color:#000;color:var(--primary-text-color);text-transform:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;align-items:center;text-align:left;line-height:1.3125;line-height:var(--line-height)}html.no-touch .btn-menu-item:hover,html.no-touch .btn-menu-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:hover,html.no-touch .btn-menu-item.danger:active{background-color:danger}.btn-menu-item:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}@media only screen and (max-width: 600px){.btn-menu-item{padding:0 30px 0 16px;height:50px}}.btn-menu-item-text{flex:1 1 auto}.btn-menu-overlay{position:fixed !important;left:0;right:0;top:0;bottom:0;z-index:3;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-menu-overlay{left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;width:auto !important;max-width:none !important}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{height:2.5rem;background:#f4f4f5;background:var(--background-color-true);display:flex;align-items:center;justify-content:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;font-size:.875rem;color:currentColor}.btn-menu hr{padding:0;margin:.5rem 0}.btn-primary{border-radius:10px;width:100%;text-align:center;height:54px;border:none;font-weight:500;cursor:pointer;overflow:hidden;position:relative;padding:0;transition:.2s opacity}html.no-touch .btn-primary:hover,html.no-touch .btn-primary:active{transition:.2s background-color,.2s opacity;background:#157ce1;background:var(--dark-primary-color)}.btn-primary-transparent{color:#3390ec;color:var(--primary-color);background-color:transparent}html.no-touch .btn-primary-transparent:hover,html.no-touch .btn-primary-transparent:active{background:rgba(51, 144, 236, 0.08);background:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:hover,html.no-touch .btn-primary-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary>svg,.btn-primary use{height:calc(100% - 20px);right:15px;left:auto}.btn-primary:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-control{width:auto;height:40px;align-items:center;margin:15px auto 1rem;border-radius:20px;padding:0 24px 0 12px;display:flex}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{color:#000;color:var(--primary-text-color);background-color:transparent;display:flex;align-items:center;padding:0 1rem;height:3.5rem;font-weight:normal;line-height:1.3125}@media only screen and (max-width: 600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:hover,html.no-touch .btn-transparent:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:hover,html.no-touch .btn-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);right:auto;left:auto;margin:0;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{position:relative;overflow:visible !important;font-weight:normal !important;cursor:pointer !important;pointer-events:all !important}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size: 54px;border-radius:50%;height:var(--size);width:var(--size);line-height:var(--size)}@media only screen and (max-width: 600px){.btn-circle{--size: 46px}}.btn-circle path{fill:#fff}.btn-disabled{pointer-events:none !important;cursor:default !important;color:#707579 !important;color:var(--secondary-text-color) !important}.btn-disabled:before{color:inherit !important}.btn-secondary:not(:first-child){margin-top:.5rem !important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.animated-close-icon{position:absolute;transform:rotate(-45deg);pointer-events:none}.animated-close-icon,.animated-close-icon:before,.animated-close-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color)}.animated-close-icon:before,.animated-close-icon:after{position:absolute;left:0;top:0;content:\"\"}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:before,body.animation-level-2 .animated-close-icon:after{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}body.animation-level-2 .animated-close-icon.no-transition,body.animation-level-2 .animated-close-icon.no-transition:before,body.animation-level-2 .animated-close-icon.no-transition:after{transition:none}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translateY(-0.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translateY(0.375rem)}.animated-menu-icon{position:absolute}.animated-menu-icon,.animated-menu-icon:before,.animated-menu-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color);transform:rotate(0)}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:before,body.animation-level-2 .animated-menu-icon:after{transition:transform .25s}.animated-menu-icon:before,.animated-menu-icon:after{position:absolute;left:0;content:\"\"}.animated-menu-icon:before{top:-0.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem)}.animated-button-icon>.tgico{position:absolute;height:24px;line-height:24px}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s forwards ease-in-out;animation:hide-icon .4s forwards ease-in-out}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden;-webkit-animation:none !important;animation:none !important}.autocomplete-helper{--border-radius: 10px;position:absolute !important;bottom:calc(100% + .5rem);overflow:hidden;padding:0 !important;border-radius:var(--border-radius) !important;max-width:100%;left:0;width:auto !important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width: 319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal) * 4)}}.autocomplete-peer-helper .scrollable{position:relative;max-height:232px}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{height:3.125rem;display:flex;padding:0 2.125rem 0 .75rem;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{margin-left:.875rem;font-weight:500;flex:0 0 auto}.autocomplete-peer-helper-list-element-description{margin-left:.5625rem;color:#707579;color:var(--secondary-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;font-weight:500;color:#fff;color:var(--badge-text-color);font-size:.875rem;text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;min-width:1.25rem;line-height:1.25rem !important;padding:0 .375rem}.badge-24{height:1.5rem;min-width:1.5rem;line-height:1.5rem !important;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:100%;width:100%;z-index:10000000;background:#000;border-radius:0 !important;display:flex}.ckin__player.ckin__fullscreen video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.ckin__player .time{margin-left:.875rem;font-size:.875rem;color:#fff}@media only screen and (max-width: 600px){.ckin__player .time{margin-left:1.125rem}}.default{position:relative;font-size:0;display:flex;align-items:center;justify-content:center}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;line-height:1;color:#fff;text-align:center;outline:0;padding:0;cursor:pointer;position:absolute;opacity:1;visibility:visible;top:50%;left:50%;transform:translate3d(-50%, -50%, 0) scale(1);font-size:4rem;touch-action:manipulation}body.animation-level-2 .default__button--big{transition:visibility .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1);transition:visibility var(--layer-transition),opacity var(--layer-transition)}@media only screen and (max-width: 600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default__controls{position:absolute;bottom:0;right:0;left:0;text-align:left;direction:ltr;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}.default__controls .progress-line{margin:0 16px;border-radius:var(--border-radius)}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:rgba(255,255,255,.38)}@media only screen and (max-width: 600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{height:49px;padding-top:93px;bottom:0;z-index:2;background-position:bottom;width:100%;position:absolute;background-repeat:repeat-x;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);pointer-events:none}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}@media only screen and (max-width: 600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:\"\"}.default .default__gradient-bottom{transform:translate3d(0, 50px, 0)}.default .default__controls{transform:translate3d(0, 52px, 0)}@media only screen and (max-width: 600px){.default .default__controls{transform:translate3d(0, 65px, 0)}}.default.show-controls .default__gradient-bottom,.default.show-controls .default__controls{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"\"}.default .player-volume{margin:0 .125rem 0 .625rem;display:flex;align-items:center}html.is-touch .default .player-volume{display:none}.default .player-volume__icon{fill:#fff;width:2.25rem;height:2.25rem;margin-right:.5rem;cursor:pointer;padding:.375rem}.default .player-volume .progress-line{--color: #fff;margin:0;width:50px;--thumb-size: 15px}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none !important}video::-webkit-media-controls-enclosure{display:none !important}.progress-line{--color: var(--primary-color);--height: 5px;--border-radius: 6px;--thumb-size: 13px;border-radius:var(--border-radius);height:var(--height);position:relative;cursor:pointer}.progress-line:before{position:absolute;left:0;top:0;right:0;bottom:0;display:block;content:\" \";border-radius:inherit}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;width:100%;cursor:pointer;padding:0;margin:0;outline:none;caret-color:var(--color);position:absolute;top:-0.5rem;bottom:-0.5rem}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;width:0;height:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{content:\" \";display:block;height:var(--thumb-size);width:var(--thumb-size);border-radius:50%;background-color:var(--color);cursor:pointer;position:absolute;right:0;top:50%;transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1.25)}.progress-line__loaded,.progress-line:before{opacity:.3;background-color:#c4c9cc;background-color:var(--secondary-color)}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);position:absolute;top:0;bottom:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{width:100%;transform-origin:left center}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;color:none;border:none}input[type=range]::-ms-thumb{visibility:hidden}input[type=range]::-ms-tooltip{visibility:hidden}.left-controls,.right-controls{display:flex;align-items:center}.bottom-controls{padding:0 .625rem;height:2.25rem;display:flex;justify-content:space-between;align-items:center}@media only screen and (max-width: 600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size: 1.25rem;margin:1.5rem 1.1875rem;display:block;text-align:left;position:relative;cursor:pointer;min-width:var(--size);min-height:var(--size)}body.animation-level-2 .checkbox-field{transition:.2s opacity}.checkbox-field.checkbox-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width: 600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{position:absolute;left:0;top:50%;transform:translateY(-50%);width:var(--size);height:var(--size);border-radius:.25rem;overflow:hidden}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.checkbox-field .checkbox-box-check,.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border{position:absolute;top:0;left:0}.checkbox-field .checkbox-box-border{right:0;bottom:0;border-radius:inherit;border:2px solid #8d969c}.checkbox-field .checkbox-box-background{top:-15%;right:-15%;bottom:-15%;left:-15%;background-color:#3390ec;background-color:var(--primary-color);transform:scale(1);border-radius:50%;transition:transform .2s 0s ease-in-out}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none !important}.checkbox-field .checkbox-box-check{--offset: 3px;width:calc(var(--size) - var(--offset));height:calc(var(--size) - var(--offset));top:50%;left:50%;transform:translate(-50%, -50%)}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s .15s ease-in-out,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none !important}.checkbox-field .checkbox-caption{position:relative;padding-left:3.375rem;cursor:pointer;display:inline-block;min-height:24px;margin-top:1px;line-height:26px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:.2s opacity;color:#000;color:var(--primary-text-color)}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin-left:0;margin-right:0}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{overflow:hidden;border-radius:10px}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size: 1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{top:0;right:0;bottom:0;left:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset: calc(var(--size) - (var(--size) / 2 + .125rem))}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size: 1.375rem;position:relative;text-align:left;margin:1.25rem 0;line-height:1.3125;cursor:pointer}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main::before,.radio-field.hidden-widget .radio-field-main::after{visibility:hidden}.radio-field>input:checked~.radio-field-main::before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main::after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{padding-left:3.5rem;position:relative;color:#000;color:var(--primary-text-color)}.radio-field .radio-field-main::before,.radio-field .radio-field-main::after{content:\"\";display:block;position:absolute;left:0;top:50%;width:var(--size);height:var(--size);transform:translateY(-50%)}.radio-field .radio-field-main::before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main::before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main::after{left:.3125rem;width:.75rem;height:.75rem;border-radius:50%;background:#3390ec;background:var(--primary-color);transform:translateY(-50%) scale(0);transform-origin:center}body.animation-level-2 .radio-field .radio-field-main::after{transition:transform .1s ease}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0;opacity:0;z-index:-1;z-index:var(--z-below);position:absolute}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;visibility:hidden;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transition:transform .2s .05s ease-in-out;transform:scale(0)}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none !important;transition:background-color .2s !important}.checkbox-field-restriction .checkbox-box-check use{visibility:visible !important;stroke-dasharray:24.19,24.19 !important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out !important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{transform:rotate(45deg) translateY(-10px);stroke-dashoffset:35.5}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size: 20px;margin:0 .3125rem;padding:0;display:flex;align-items:center;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset: 3px;--toggle-width: 1.9375rem;width:var(--toggle-width);height:.875rem;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;position:relative;display:flex;align-items:center;margin:0 var(--offset)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{width:1.25rem;height:1.25rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);background-color:#fff;background-color:var(--surface-color);content:\" \";transform:translateX(calc(var(--offset) * -1));border-radius:50%;position:absolute}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width: 600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{width:100%;padding:1rem 0 .5rem;margin-bottom:17px}@media only screen and (max-width: 600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);padding:0 23px;padding-bottom:1rem;font-weight:500;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width: 600px){.chatlist-container .search-group__name{padding:5px 9px 0 16px;font-size:15px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width: 600px){.chatlist-container .search-group-contacts{padding:0px 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0 5px !important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0px;padding:4px 0 0}.chatlist-container .search-super .search-group__name{padding-top:1rem;display:flex;justify-content:space-between}ul.chatlist{padding:0 .5rem}@media only screen and (max-width: 600px){ul.chatlist{padding:0}}.chatlist{margin:0;display:flex;flex-direction:column;position:relative;width:100%;background-color:#fff;background-color:var(--surface-color);-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.chatlist li{--background: unset;height:72px;border-radius:10px;display:flex;align-items:flex-start;flex-direction:row;position:relative;cursor:pointer;padding:.5625rem;overflow:hidden;background:var(--background)}@media only screen and (max-width: 600px){.chatlist li{border-radius:0}}html.no-touch .chatlist li:hover,html.no-touch .chatlist li:active{--background:var(--light-secondary-text-color)}.chatlist li.is-muted .user-title:after{flex:0 0 auto;content:\"\";color:#a2abb2;color:var(--chatlist-pinned-color);font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist li.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 li.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 li p{margin:0;display:flex;flex-direction:row;align-items:flex-start;height:27px}.chatlist li a{color:inherit}.chatlist li .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist li.menu-open{--background: var(--light-secondary-text-color)}@media only screen and (min-width: 601px){.chatlist li.active{--background: var(--primary-color) !important}.chatlist li.active .user-caption,.chatlist li.active .tgico-chatspinned:before,.chatlist li.active .user-title,.chatlist li.active .message-status,.chatlist li.active .text-highlight{color:#fff}.chatlist li.active b{color:#fff !important}.chatlist li.active .user-title:after{color:rgba(255,255,255,.7)}.chatlist li.active .verified-background{fill:#fff !important}.chatlist li.active .verified-check{fill:#3390ec !important;fill:var(--primary-color) !important}.chatlist li.active .dialog-avatar.is-online:after{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist li.active .badge.unread,.chatlist li.active .mention{background-color:#fff !important;color:#3390ec;color:var(--primary-color)}.chatlist li.active .peer-typing-container{--color: #fff}}.chatlist li span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:27px}.chatlist .peer-typing-container{--color: var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{font-size:.75rem;padding:1px 0px 0px 0px;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block !important;margin-top:4px;margin-right:-3px;margin-left:.5rem;flex:0 0 auto}body.animation-level-2 .chatlist .dialog-subtitle-badge{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}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-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)}.chatlist .dialog-subtitle-media{width:1.25rem;height:1.25rem;position:relative;flex:0 0 auto;border-radius:.1875rem;margin-top:-0.1875rem;margin-right:.375rem;display:inline-block;vertical-align:middle}.chatlist .dialog-subtitle-media .tgico-play{position:absolute;z-index:1;color:#fff;left:50%;top:50%;transform:translate(-50%, -50%);line-height:1;font-size:.625rem}.chatlist .dialog-subtitle-media .media-photo{width:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;border-radius:inherit}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{overflow:hidden;color:#707579;color:var(--secondary-text-color);flex:1 1 auto;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{display:flex !important;align-items:center}.chatlist .user-title img.emoji{vertical-align:top;margin-top:4px;width:18px;height:18px}.chatlist .user-last-message img.emoji{width:20px;height:20px;margin-top:-3px}.chatlist .user-title,.chatlist .user-last-message{flex-grow:1}.chatlist .user-title i,.chatlist .user-last-message i{font-style:normal}.chatlist .message-status{margin-right:.125rem;display:inline-block;vertical-align:middle;color:#0ac630;color:var(--chatlist-status-color);line-height:1;width:1.25rem;height:1.25rem;font-size:1.25rem;position:relative;margin-top:-0.0625rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{position:absolute;top:0;left:0}.chatlist .mention{padding:0;background-color:#0ac630 !important;background-color:var(--chatlist-status-color) !important}html.is-mac .chatlist .mention{line-height:22px !important}.chatlist .mention-badge{margin-right:-2px}.chatlist .unread,.chatlist .is-muted.backwards .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0;margin-top:-0.5rem}.chatlist-bottom .chatlist-new li{height:3.5rem}.chatlist-bottom .chatlist-new .user-caption{padding-left:1.125rem}.chatlist-bottom .chatlist-new .dialog-subtitle{margin-top:.0625rem}.chatlist-new li{height:4.5rem;padding:0 .75rem;align-items:center}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto !important}.chatlist-new span{line-height:1.3125 !important;line-height:var(--line-height) !important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container li,.search-group-contacts li{padding:.75rem}@media only screen and (max-width: 600px){.contacts-container li,.search-group-contacts li{height:66px;padding-top:9px;padding-bottom:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width: 600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-title,.contacts-container b,.contacts-container .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b,.search-group-contacts .user-last-message b{font-weight:normal}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width: 600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chat-input{--translateY: 0;--padding-bottom: 0.5rem;--bottom: var(--padding-bottom);display:flex;width:100%;max-width:100%;padding-top:.25rem;flex-direction:column;flex:0 0 auto;position:relative;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translate3d(0, var(--translateY), 0)}body.animation-level-0 .chat-input{transition:none !important}@media only screen and (min-height: 570px)and (min-width: 601px){.chat-input{max-width:728px !important;max-width:var(--messages-container-width) !important}}@media only screen and (min-width: 601px){.chat-input{--padding-bottom: 1.25rem}}@media only screen and (max-height: 569px){.chat-input{--padding-bottom: 0.5rem}}@media only screen and (min-width: 1276px){.chat-input{width:calc(100% - var(--right-column-width)) !important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0) !important}}.chat-input.is-hidden{--translateY: 100%;transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, var(--translateY), 0) !important;position:absolute !important;bottom:0}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY: 0}.chat-input .chat-input-container{--padding-horizontal: var(--chat-input-padding);display:flex;align-items:flex-end;justify-content:space-between;max-width:728px;max-width:var(--messages-container-width);margin:0 auto;width:100%;padding:0 var(--padding-horizontal);flex:0 0 auto;position:relative;padding-bottom:var(--bottom)}.chat-input .chat-input-container .btn-circle{width:var(--chat-input-size);height:var(--chat-input-size)}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .menu-send{top:auto;bottom:calc(100% + .5rem)}.chat-input .input-message-input{background:none;border:none;width:100%;padding:.5rem .5625rem;margin-top:-1px;max-height:calc(30rem - 2.5rem);overflow-y:none;resize:none;border:none;outline:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height)}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height: 30rem){.chat-input .input-message-input{max-height:max(36px, calc(100vh - 10rem))}}@media only screen and (max-width: 600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{content:attr(data-inline-placeholder);color:#a2acb4;pointer-events:none}.chat-input .toggle-emoticons:before{content:\"\"}html.is-ios .chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\" !important}.chat-input .btn-record-cancel{visibility:hidden;opacity:0;transition:visibility 0s .1s,opacity .1s 0s;padding:0;z-index:3;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal) * -1 + -0.5rem))}body.animation-level-0 .chat-input .btn-record-cancel{transition:none !important}.chat-input .btn-scheduled:after{content:\"\";position:absolute;top:5px;right:5px;width:.5rem;height:.5rem;border-radius:50%;background:#61c642;background:var(--message-checkbox-color)}.chat-input .btn-preloader .preloader{width:1.5rem;height:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s forwards ease-in-out !important;animation:hide-icon .4s forwards ease-in-out !important}.chat-input .float{align-self:center;display:none !important;margin:0 .75rem 0 0 !important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.chat-input .float{margin-right:.125rem !important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex !important}.chat-input .btn-send-container{position:absolute;right:var(--padding-horizontal);bottom:0;padding-bottom:inherit}.chat-input .btn-icon{transition:.2s color,background-color .2s,.2s opacity}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{transition:.2s transform;color:#707579;color:var(--secondary-text-color);z-index:3}.chat-input .btn-send .tgico-send{color:#3390ec !important;color:var(--primary-color) !important}.chat-input .btn-send .tgico-check{color:#3390ec !important;color:var(--primary-color) !important;height:32px !important;font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:bold}.chat-input .btn-send .tgico-schedule{background-color:#3390ec;background-color:var(--primary-color);color:#fff;border-radius:50%;width:34px;height:34px;display:flex;align-items:center;justify-content:center}.chat-input .btn-send.send .tgico-send,.chat-input .btn-send.record .tgico-microphone,.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.schedule .tgico-schedule{visibility:visible !important}.chat-input .btn-send:not(.record) .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}body.animation-level-2 .chat-input .btn-send.send .tgico-send,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone,body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem;background-color:#fff !important;background-color:var(--surface-color) !important}.chat-input .record-time{height:44px;line-height:44px;display:none}.chat-input .record-time:after{content:\" \";width:10px;height:10px;background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;margin:0 9px;display:inline-block}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{border-radius:50%;background-color:rgba(0,0,0,.2);width:240px;height:240px;transform:scale(0);position:absolute;top:-94px;left:-94px;transition:transform .03s ease-in-out,visibility .1s;visibility:hidden}body.animation-level-0 .chat-input .record-ripple{transition:none !important}@media only screen and (max-width: 600px){.chat-input .record-ripple{width:300px;height:300px;top:-124px;left:-124px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon{color:#c6cbce}.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording .btn-record-cancel{opacity:1;visibility:visible;transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording .btn-send,.chat-input.is-recording .btn-record-cancel{pointer-events:all}.chat-input.is-recording .rows-wrapper{width:calc(100% - (var(--chat-input-size) * 2 + 1rem))}.chat-input.is-recording .attach-file{display:none}.chat-input.is-recording .record-time{display:block}.chat-input.is-recording .record-ripple{transition:transform .03s,visibility 0s;visibility:visible}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0px}.chat-input .new-message-wrapper,.chat-input .pinned-container{opacity:1}body.animation-level-2 .chat-input .new-message-wrapper,body.animation-level-2 .chat-input .pinned-container{transition:opacity .1s 0s}.chat-input .pinned-container{width:auto}.chat-input .pinned-container-button{height:2.5rem;padding:0 .625rem}.bubbles.is-selecting~.chat-input .new-message-wrapper{pointer-events:none}.bubbles.is-selecting:not(.backwards)~.chat-input .new-message-wrapper,.bubbles.is-selecting:not(.backwards)~.chat-input .pinned-container{opacity:0}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting:not(.backwards)~.chat-input .rows-wrapper{max-height:var(--chat-input-size)}.bubbles.is-selecting:not(.backwards)~.chat-input .reply-wrapper{height:0 !important;opacity:0;pointer-events:none}.bubbles.is-selecting:not(.backwards)~.chat-input .btn-send{transform:scale(0)}body.animation-level-2 .bubbles.is-selecting.backwards~.chat-input .new-message-wrapper,body.animation-level-2 .bubbles.is-selecting.backwards~.chat-input .pinned-container{transition:opacity .1s .1s}body.animation-level-2 .bubbles.is-selecting.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}.chat-input .pinned-container{box-shadow:none}@media only screen and (max-width: 600px){.chat-input .pinned-container{font-size:15px}}.chat-input .pinned-container .btn-transparent{justify-content:center}.chat-input .pinned-container .btn-transparent::before{margin-right:10px}.chat-input .pinned-container::before{box-shadow:none}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}#column-center{width:100%;position:relative;flex:3}@media only screen and (max-width: 600px){body.is-left-column-shown #column-center{transform:translate3d(100vw, 0, 0)}body.is-right-column-shown #column-center{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-center{position:fixed !important;left:0;top:0;bottom:0;right:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem, 0, 0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex !important;width:100%;align-items:center;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body.animation-level-0 .chat{transition:none !important}.chat:not(.active):not(:last-child){filter:brightness(0.8)}@media only screen and (min-width: 926px){.chat:not(.active){transform:translate3d(calc((100vw - min(calc(100vw * .4), 420px)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(calc(100vw * .4), 420px)), 0, 0)}}@media only screen and (min-width: 1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)), 0, 0)}}@media only screen and (min-width: 1276px)and (max-width: 1680px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(75vw, 0, 0)}}@media only screen and (max-width: 925px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(100vw, 0, 0)}}.chat-background{overflow:hidden;background-color:#e6ebee}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none !important}.chat-background,.chat-background-item{position:absolute !important;top:0;left:0;bottom:0;right:0}.chat-background-item{background-image:url(\"assets/img/bg.jpeg\");background-size:cover;background-position:center center;background-color:inherit}body.animation-level-2 .chat-background-item{transition:opacity .25s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-out);opacity:0}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in);opacity:1}@media only screen and (min-width: 1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem 0;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out) !important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(0.666666667);transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in) !important}}.chat .drops-container{--padding: 20px;--pinned-floating-height: 0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width: 1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width: 600px){.chat .drops-container{--padding: 10px}}.chat .drop{max-width:696px;--wrapper-padding: 15px}.chat-input-wrapper{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);display:flex;align-items:center;flex-direction:column;width:calc(100% - (var(--chat-input-size) + 0.5rem));max-width:calc(100% - (var(--chat-input-size) + 0.5rem));justify-content:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;border-bottom-right-radius:0;box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);min-height:var(--chat-input-size);max-height:30rem;flex:0 0 auto;position:relative;z-index:3;transition:width .1s}body.animation-level-0 .chat-input-wrapper{transition:none}.selection-wrapper,.fake-selection-wrapper{position:absolute;left:50%;top:0;transform:translateX(-50%);width:28.75rem;max-width:calc(100% - (var(--chat-input-padding) * 2))}.selection-wrapper{border-radius:12px;box-shadow:none;transition:opacity .1s .1s;opacity:0}.selection-wrapper .selection-container{display:flex;justify-content:space-between;height:100%;border-radius:inherit;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:15px;display:flex;justify-content:space-between;align-items:center;width:100%}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);font-weight:500;flex-grow:1;white-space:nowrap;text-transform:capitalize}.selection-wrapper .selection-container .btn-icon{margin:0 5px 0 6px;height:42px;width:42px;line-height:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width: 600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width: 380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-right:.625rem;margin-left:.375rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;z-index:-1;visibility:hidden}.chat-input.type-pinned .rows-wrapper,.chat-input.type-pinned .fake-rows-wrapper{width:auto}.fake-rows-wrapper{position:absolute;left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - (var(--padding-horizontal) * 2) - .5625rem)}.fake-rows-wrapper .pinned-container{padding:0 .5rem}.rows-wrapper{transform:scaleX(1);transition:transform .2s,width .2s,max-height .2s,border-radius .1s}.rows-wrapper.is-centered{margin:0 auto}.rows-wrapper.is-centered~.fake-rows-wrapper{left:50%;transform:translateX(-50%)}.rows-wrapper .bubble-tail{transition:transform .1s}body.animation-level-0 .rows-wrapper .bubble-tail{transition:none}.rows-wrapper.is-centering:not(.backwards),.rows-wrapper.is-centered{border-bottom-right-radius:12px}.rows-wrapper.is-centering:not(.backwards) .bubble-tail,.rows-wrapper.is-centered .bubble-tail{transform:scaleX(-1) translateX(1.125rem)}@media only screen and (max-width: 600px){.rows-wrapper{--padding-vertical: 1px}}@media only screen and (max-width: 420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height: 569px){.rows-wrapper{--padding-vertical: 1px}}.rows-wrapper .bubble-tail{position:absolute;bottom:-1px;right:-8.4px;width:11px;height:20px;fill:#fff;fill:var(--surface-color);transform:scaleX(-1)}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color);background-color:rgba(51, 144, 236, 0.08) !important;background-color:var(--light-primary-color) !important}.rows-wrapper .attach-file .btn-menu{right:calc(var(--padding-horizontal) * -1 - .125rem);bottom:calc(100% + 1.125rem)}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .attach-file .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .attach-file .btn-menu>div{padding:0 38px 0 16px}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{display:flex;justify-content:space-between;align-items:center;width:100%;position:relative;background-color:inherit;border-radius:.75rem;padding:var(--padding)}.rows-wrapper .reply-wrapper{justify-content:flex-start;height:0;width:calc(100% - var(--padding-horizontal) * 2);padding:0;margin-top:.5625rem;margin-bottom:-0.5625rem;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2;opacity:0;pointer-events:none}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .reply-wrapper{margin-top:.3125rem;margin-bottom:-0.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{pointer-events:unset;height:36px;opacity:1}.rows-wrapper .reply-wrapper .reply{order:1;flex:1 1 auto;margin:0 .625rem}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{top:auto;bottom:calc(100% + 1.0625rem);left:3.125rem;transform:scale(1) !important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size: 1.5rem;order:0;margin:0 2rem 0 0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#3390ec;stroke:var(--primary-color)}@media only screen and (max-width: 600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal) * -1)}}.rows-wrapper .new-message-wrapper{align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .input-message-container{width:1%;max-height:inherit;flex:1 1 auto;position:relative;overflow:hidden;align-self:center;min-height:calc(var(--chat-input-size) - var(--padding-vertical) * 2);display:flex;align-items:center}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{flex:0 0 auto;font-size:24px;color:#707579;color:var(--secondary-text-color);margin:0 .125rem 5px;padding:0;width:34px;height:34px}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY: 0;width:100%;flex:1 1 auto;position:relative;transform:translate3d(0, var(--translateY), 0);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles{transition:none !important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);--translateY: -78px}@media only screen and (max-width: 600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY: -58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translateY(calc(var(--translateY) * -1))}.bubbles>.scrollable{height:auto;display:block}@media only screen and (min-width: 1276px){body.is-right-column-shown .bubbles{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0)}}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:scale(1) translateX(2.5rem)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:opacity var(--layer-transition),visibility 0s 0s !important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY: calc(var(--chat-input-size) * -1 + -.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{width:100%;display:flex;flex-direction:column;margin:0 auto;min-height:100%;justify-content:flex-end;padding:0 .8125rem;max-width:728px;max-width:var(--messages-container-width);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translateY(0)}body.animation-level-0 .bubbles-inner{transition:none !important}@media only screen and (min-width: 1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width: 600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width: 600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - calc((2.375rem + .5rem) * -1) * -1) !important;max-width:calc(100% - var(--message-beside-button-margin) * -1) !important}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-inner{margin-bottom:1rem}.bubbles-inner:not(.is-channel) .message,.bubbles-inner.is-chat .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999 !important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY) * -1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden;transform:none !important;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention{--translateY: 0;cursor:default;opacity:0;visibility:hidden;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s !important}.bubbles-corner-button{position:absolute;background-color:#fff;background-color:var(--surface-color);border-radius:50%;color:#707579;color:var(--secondary-text-color);font-size:1.5rem;display:flex;align-items:center;justify-content:center;right:var(--chat-input-padding);bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);z-index:2;overflow:visible}body.animation-level-0 .bubbles-corner-button{transition:none !important}.bubbles-corner-button .badge{position:absolute;top:-0.25rem;right:-0.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width: 600px){.bubbles-corner-button .badge{top:-0.75rem;right:.1875rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}.topbar{--topbar-height: 3.5rem;--pinned-floating-height: 0px;--pinned-audio-height: 52px;--pinned-message-height: 52px;width:100%;z-index:1;min-height:var(--height);max-height:var(--height);margin-bottom:var(--pinned-floating-height);position:relative;cursor:pointer !important}.topbar:before{content:\" \";position:absolute;height:calc(var(--topbar-height) + var(--pinned-floating-height));top:0;right:0;left:0;box-shadow:0px 1px 5px -1px rgba(0,0,0,.21);pointer-events:none}.topbar.is-pinned-audio-floating{--pinned-floating-height: var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-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-floating-height: calc(var(--pinned-audio-height) + var(--pinned-message-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width: 601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width: 926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width: 1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem);display:flex;align-items:center}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .peer-title,.topbar .info{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{top:calc(100% + 7px);max-height:calc(100 * 1vh - 4.375rem);max-height:calc(100 * var(--vh) - 4.375rem)}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem);top:29px}}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;overflow:hidden;padding-left:49px;max-width:calc(100% - var(--utils-width))}@media only screen and (max-width: 600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width: 1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-utils{display:flex;align-items:center;flex:0 0 auto}@media only screen and (min-width: 1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width: 600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{width:auto;height:2.25rem;font-weight:400;font-size:.875rem;margin-right:.5rem;padding:0 1.375rem}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;padding-left:1.125rem;max-width:100%;overflow:hidden}.topbar .person{display:flex;align-items:center}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubble{position:relative;z-index:1;margin:0 auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-wrap:wrap}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);position:absolute;top:50%;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);transform:translateY(-50%);color:#fff;border-radius:50%;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);opacity:0;display:flex;align-items:center;justify-content:center;transform:translateY(-50%) scale(0.6);visibility:hidden}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem !important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{visibility:visible;transform:translateY(-50%) scale(1)}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{position:absolute;left:-50%;top:-0.125rem;bottom:-0.125rem;content:\" \";z-index:-1}.bubble.is-highlighted:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width: 600px){.bubble.is-first-unread{max-width:unset}}.bubble.is-first-unread:before{content:\"Unread messages\";height:30px;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;text-align:center;color:#3390ec;color:var(--primary-color);line-height:2.1;font-weight:500;font-size:15px;background-color:#fff;background-color:var(--surface-color);z-index:2;position:relative}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(0.125rem + 30px)}.bubble.is-selected:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{width:200%;display:block}.bubble.is-multiple-documents:before,.bubble.is-multiple-documents:after{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0 !important}.bubble-select-checkbox{z-index:3;position:absolute;left:0;display:flex;margin:0}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none !important}.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video,.bubbles.is-selecting .bubble a{pointer-events:none}.bubble-content{min-width:56px;max-width:100%;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);position:relative;display:flex;flex-direction:column-reverse;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-color:var(--message-background-color)}body.animation-level-0 .bubble-content{transition:none}html.no-touch .bubbles:not(.is-selecting) .bubble-content,html.is-touch body:not(.no-select) .bubbles.is-selecting .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{margin:0 auto;max-width:100%;box-shadow:none}.bubble.is-date{position:sticky;top:.25rem;padding-bottom:.25rem;z-index:2;transition:opacity .3s ease;opacity:.99999;pointer-events:none}.bubble.is-date:before,.bubble.is-date:after{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubble-beside-button{position:absolute;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);bottom:0;width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);font-size:1.5rem;align-items:center;display:flex;justify-content:center;color:#fff;color:var(--badge-text-color);border-radius:50%;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color);cursor:pointer}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}html.no-touch .bubble:hover .bubble-beside-button,html.no-touch .bubble:active .bubble-beside-button{opacity:1}.bubble .forward svg{width:22px;height:22px}.bubble.is-group-last{margin-bottom:0.5rem}.bubble.is-group-last:after{bottom:-0.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-0.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0 !important}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width: 600px){.bubble.webpage .document{padding-left:44px}}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;width:18px;vertical-align:bottom}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{padding-top:.5rem;padding-bottom:1.5rem;max-height:-webkit-fit-content !important;max-height:-moz-fit-content !important;max-height:fit-content !important;cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big.sticker .bubble-content{max-width:140px !important;max-height:140px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none !important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.bubble.sticker .attachment{border-radius:0;z-index:1}.bubble.sticker .bubble-content{max-width:200px !important;max-height:200px !important}.bubble.round .attachment{max-width:280px !important;max-width:var(--round-video-size) !important;max-height:280px !important;max-height:var(--round-video-size) !important;width:280px !important;width:var(--round-video-size) !important;height:280px !important;height:var(--round-video-size) !important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{max-width:100%;border-radius:inherit;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;position:relative;cursor:pointer}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{position:absolute;left:0;top:0;height:100%;width:100%;cursor:pointer;display:flex;justify-content:center;align-items:center}.bubble .attachment .download span{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);font-size:23px;color:#fff;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{position:relative;margin:0 auto;z-index:1}.bubble .media-container-fitted{background-color:transparent !important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-width:min(420px, 100%);max-height:min(340px, 100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-width:min(451px, 100%);max-height:none}.bubble .album-item{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);max-width:100%;cursor:pointer;position:absolute;overflow:hidden}body.animation-level-0 .bubble .album-item{transition:none !important}.bubble .album-item img,.bubble .album-item video{border-radius:inherit}.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none !important}.bubble .album-item .bubble-select-checkbox{bottom:auto !important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4, .0, .2, 1),border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transition:transform .3s cubic-bezier(.4, .0, .2, 1),border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in);transform:scale(0.883333)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:hover,html.no-touch .bubble a:active{text-decoration:underline}.bubble-first{order:-1;margin-top:.5rem;justify-content:center;align-items:center;max-width:100%}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column;align-items:flex-start !important;padding:.75rem 1rem .875rem !important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-size:1rem !important}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{margin-right:.25rem;font-size:1.25rem;vertical-align:bottom;margin-left:-0.1875rem}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubble-first.empty-bubble-placeholder:not(:first-child:last-child) .bubble-content-wrapper{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0;pointer-events:none}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem !important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem !important;position:relative;width:200px;height:200px;cursor:pointer}.bubble-first .time{display:none !important}.bubble-first:before,.bubble-first:after{display:none}.bubble .web{margin:.125rem 0 -0.5625rem;max-width:100%;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.bubble .web .preview{max-width:min(420px, 100%);max-height:min(340px, 100%);border-radius:4px;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;position:relative;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title{font-weight:500 !important}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .webpage-name{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);font-weight:500 !important;text-decoration:none}html.no-touch .bubble .web .webpage-name:hover,html.no-touch .bubble .web .webpage-name:active{text-decoration:underline}.bubble .web .text{word-break:break-word;margin-top:1px;font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble .web .quote{max-width:100%;overflow:hidden;width:100%;display:flex}.bubble .web .quote-text{width:100%;max-width:100%;padding-left:.625rem;margin-left:-0.625rem}.bubble .web .quote:before{flex:0 0 auto;width:.125rem;border-radius:.125rem;background-color:#3390ec;background-color:var(--primary-color);margin:.1875rem .5rem .125rem 0;content:\" \"}.bubble .web,.bubble .reply{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{margin:0;width:3rem;height:3rem;float:right;margin-left:.625rem;margin-top:.1875rem}.bubble.is-square-photo .web .preview{max-width:min(3rem, 100%);max-height:min(3rem, 100%);margin:0}.bubble .reply{padding:.25rem;margin:0 .25rem .375rem .375rem;cursor:pointer;border-radius:.25rem;min-width:10rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{position:absolute;max-width:calc(100% - 1.25rem);height:auto;min-height:32px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.bubble .message+.reply{margin-bottom:0}.bubble.just-media .reply,.bubble.just-media .name{padding:10px;border-radius:12px;position:absolute;top:0;margin-bottom:0;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);white-space:nowrap;max-width:15rem}@media only screen and (max-width: 600px){.bubble.just-media .reply,.bubble.just-media .name{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff !important;padding:.3125rem .625rem;line-height:1.3125;line-height:var(--line-height)}.bubble.just-media .name .peer-title{font-weight:400 !important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width: 600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;position:relative;max-width:none !important}.bubble.just-media .reply-title,.bubble.just-media .reply-subtitle,.bubble.just-media .reply i{color:#fff !important}.bubble.just-media .reply-border{background:#fff}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{font-size:16px;font-size:var(--messages-text-size);padding:0 .5rem .375rem .625rem;max-width:100%;color:#000;color:var(--primary-text-color);line-height:1.3125;word-break:break-word;white-space:pre-wrap;position:relative}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width: 600px){.bubble .document-ico,.bubble .document-download,.bubble .audio-ico,.bubble .audio-download{height:2.25rem;width:2.25rem}}.bubble .audio .audio-title{font-weight:500}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width: 600px){.bubble .audio{height:2.375rem;padding-left:calc(2.375rem + .5625rem)}.bubble .audio .audio-details{margin-top:2px;margin-bottom:0}.bubble .audio .audio-subtitle{margin-top:-1px}.bubble .audio.corner-download .audio-download{margin:1.375rem 1.375rem 0}}.bubble .message.audio-message{width:335px;max-width:min(100%, 335px) !important}@media only screen and (max-width: 600px){.bubble .message.audio-message{width:280px;max-width:min(100%, 300px) !important}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px !important}.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{display:flex;padding:2px 0;cursor:pointer}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{padding-left:12px;margin-top:8px;display:flex;flex-direction:column}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500}.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{padding-left:66px;height:58px}@media only screen and (max-width: 600px){.bubble .message.document-message .document{padding-left:44px;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 0px 0px 0px}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-container .time.tgico{position:relative !important;height:0px !important;visibility:hidden !important;float:none}.bubble .document-container .time.tgico .inner{visibility:hidden !important}.bubble.is-multiple-documents .message{padding:0 !important;border-radius:inherit}.bubble.is-multiple-documents .document-container{position:relative;border-radius:inherit}.bubble.is-multiple-documents .document-container .document-selection{position:absolute;top:0;bottom:0;z-index:-1;width:200vw;left:-75vw}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.06);border-radius:inherit}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{left:2rem;top:2rem;background:#fff;border-radius:50%}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size: 1.125rem;left:20px;top:25px}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size: .125rem;content:\" \";position:absolute;width:calc(var(--size) - (var(--inner-size) * 2));height:calc(var(--size) - (var(--inner-size) * 2));left:var(--inner-size);top:var(--inner-size);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-0.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{padding-top:.5rem;border-top-left-radius:inherit;border-top-right-radius:inherit}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-0.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{padding-bottom:.5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-0.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-0.25rem}.bubble.is-multiple-documents .document{height:54px !important}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document{height:38px !important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{padding:0 0 .25rem 0;margin-top:-0.1875rem}.bubble .message.document-message .time,.bubble .message.audio-message .time,.bubble .message.voice-message .time,.bubble .message.poll-message .time,.bubble .message.contact-message .time{position:absolute;right:0;bottom:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{position:absolute;bottom:.1875rem;right:.1875rem;border-radius:.75rem;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0 .3125rem;z-index:2}.bubble.is-message-empty .message .time{margin-left:0;display:flex;align-items:center;padding:0;margin:0;white-space:nowrap;height:18px}.bubble.is-message-empty .message .time .inner{right:unset;bottom:unset;color:#fff;margin:inherit}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message,.bubble.is-message-empty.emoji-big .message{bottom:0}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{visibility:hidden;font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1;vertical-align:middle;pointer-events:none;display:inline-flex;z-index:1;height:12px;direction:ltr;float:right;cursor:pointer}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{margin-left:2px;pointer-events:none}.bubble .time i.edited{overflow:visible;font-size:inherit}.bubble .time .inner{pointer-events:all;position:absolute;bottom:0;right:0;display:flex;align-items:center;line-height:1;padding:inherit;white-space:nowrap;height:12px;visibility:visible}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-time,.bubble .video-play{pointer-events:none}.bubble .video-time{position:absolute;top:3px;left:3px;border-radius:12px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 6px;z-index:2;font-size:12px;color:#fff;display:flex;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:1.125rem;line-height:1}.bubble .video-time.can-autoplay:after{content:\"\";padding:0 1px 0 3px;font-size:1.25rem;color:#fff}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);color:#fff;text-align:center;font-size:2.125rem;display:flex;align-items:center;justify-content:center;z-index:1}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{padding:5px 9px 0 9px;font-weight:500 !important;color:#3390ec;color:var(--primary-color);font-size:.9rem;max-width:100%;overflow:hidden;text-overflow:ellipsis}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{position:absolute;width:11px;height:20px;z-index:-2;display:block;fill:#fff;fill:var(--message-background-color);transform:translateY(1px)}.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{cursor:pointer;border-radius:inherit}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.bubble .replies .rp{width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden;border-radius:inherit;cursor:pointer}.bubble .replies-beside{flex-direction:column;width:36px;min-height:36px;height:auto;max-height:52px;bottom:47px;border-radius:2rem;right:-44px;padding:5.5px 0}.bubble .replies-beside .tgico-commentssticker{font-size:23px}.bubble .replies-beside-text{font-size:.75rem}.bubble .replies-footer{height:50px;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);position:relative;display:flex;align-items:center;padding:0 .5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:#3390ec;color:var(--primary-color);min-width:15rem}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.4375rem}.bubble .replies-footer-text{font-weight:500;font-size:15px;margin-left:9px;display:flex;align-items:center;color:#3390ec;color:var(--primary-color)}.bubble .replies-footer-avatars{display:flex;flex-direction:row-reverse}.bubble .replies-footer-avatars avatar-element{width:34px;height:34px;border:2px solid #fff;border:2px solid var(--surface-color);cursor:pointer;z-index:0}.bubble .replies-footer-avatars avatar-element:not(:first-child){margin-right:-14px}.bubble .replies-footer .tgico-next{position:absolute;right:4px}.bubble .replies-footer.is-unread .replies-footer-text:after{content:\" \";background-color:#3390ec;background-color:var(--primary-color);width:.5rem;height:.5rem;margin-left:.75rem;border-radius:50%}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.bubble-content-wrapper{transform:scale(1) translateX(0);transform-origin:center;opacity:1}body.animation-level-2 .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)}.bubbles-inner.zoom-fading .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0}@media only screen and (min-width: 601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width: 600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble-content-wrapper>.user-avatar{position:absolute;margin-left:-45px;bottom:0;cursor:pointer}.bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transform:scale3d(1, 1, 1);transform-origin:bottom;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transition:none}.bubbles.is-selecting:not(.backwards) .bubble-content-wrapper>.user-avatar{transform:scale3d(0.76, 0.76, 1);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{color:#fff;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);font-size:.9375rem;padding:.28125rem .625rem;line-height:1.25rem;border-radius:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;text-align:center;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg a:hover,.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover{text-decoration:underline;cursor:pointer}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 10px)}@media only screen and (max-width: 600px){.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .contact-number,.bubble.is-in .audio-time{color:#707579 !important;color:var(--secondary-text-color) !important}.bubble.is-out{flex-direction:row-reverse;--message-background-color: var(--message-out-background-color);--light-message-background-color: var(--light-message-out-background-color);--dark-message-background-color: var(--dark-message-out-background-color);--link-color: var(--message-out-link-color)}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width: 1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .reply,.bubble.is-out.just-media .name{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out:not(.just-media) .reply-title,.bubble.is-out:not(.just-media) .reply i{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{padding-right:5px;margin-left:-4px}.bubble.is-out .time .inner{color:#4fae4e;color:var(--message-out-status-color);bottom:4px}.bubble.is-out .time:after,.bubble.is-out .time .inner:after{font-size:19px;margin-left:1px;line-height:16px;color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time:after,.bubble.is-out.is-read .time .inner:after{content:\"\"}.bubble.is-out.is-sent .time:after,.bubble.is-out.is-sent .time .inner:after{content:\"\"}.bubble.is-out.is-sending .time:after,.bubble.is-out.is-sending .time .inner:after{content:\"\"}.bubble.is-out .document-ico:after{border-top-color:#fff;border-top-color:var(--message-background-color);border-right-color:#fff;border-right-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e !important;fill:var(--message-out-primary-color) !important}.bubble.is-out .audio-time,.bubble.is-out .audio-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-toggle,.bubble.is-out .audio-download,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.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 .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color: var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color: var(--message-background-color)}.bubble.is-out .bubble-beside-button{right:auto;left:calc((2.375rem + .5rem) * -1);left:var(--message-beside-button-margin)}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.reply-markup{width:100%}.reply-markup-row{margin-top:.3125rem;overflow:hidden;min-height:2.5rem;display:flex}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{padding:.5625rem 0;border-radius:6px;z-index:2;font-size:.875rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;color:#fff !important;outline:none;border:none;width:100%;cursor:pointer;position:relative;overflow:hidden;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.reply-markup-button.anchor-url{text-decoration:none !important}.reply-markup-button:after{content:\" \";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;opacity:0;z-index:-1;background-color:#fff}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:hover:after,html.no-touch .reply-markup-button:active:after{opacity:0.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button.tgico:before,.reply-markup-button .forward-icon{position:absolute;right:.125rem;top:.125rem;display:block}.reply-markup-button.is-link:before{content:\"\";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:\"\"}.pinned-message-border{position:relative;height:2rem;width:.125rem;flex:0 0 auto}.pinned-message-border-wrapper-1{position:relative;top:50%;transform:translateY(-50%);height:2rem;width:.125rem;border-radius:1px;background:#3390ec;background:var(--primary-color)}.pinned-message-border-mask{--mask-height: .375rem;--height: 2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:before,.pinned-message-border-mask:after{position:absolute;left:0;right:0;content:\" \";display:block;z-index:1;height:var(--mask-height);opacity:0}body.animation-level-2 .pinned-message-border-mask:before,body.animation-level-2 .pinned-message-border-mask:after{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{top:0;background:linear-gradient(#fff, transparent);background:linear-gradient(var(--surface-color), transparent)}.pinned-message-border-mask:after{bottom:0;background:linear-gradient(transparent, #fff);background:linear-gradient(transparent, var(--surface-color))}.pinned-message-border-mask.mask-top:before,.pinned-message-border-mask.mask-bottom:after{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{position:absolute;content:\" \";left:0;top:0;right:0;bottom:0;display:block;background:#3390ec;background:var(--primary-color);opacity:.4}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{position:absolute;left:0;top:0;width:2px;background:currentColor;border-radius:1px}body:not(.animation-level-0) .pinned-message-border-wrapper,body:not(.animation-level-0) .pinned-message-border-mark{will-change:transform;transition:transform .25s ease-in-out}.pinned-message-content{--height: 32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{cursor:pointer;display:flex;align-items:center;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;overflow:hidden;pointer-events:none;position:relative;margin-left:.5rem}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-title,.pinned-message-subtitle,.reply-title,.reply-subtitle{font-size:14px;line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-message-media,.reply-media{height:2rem !important;width:2rem !important;overflow:hidden;position:absolute;left:0;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.pinned-message i,.reply i{font-style:normal;color:#707579;color:var(--secondary-text-color)}.pinned-message img.emoji,.reply img.emoji{height:1rem;width:1rem;vertical-align:top}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{height:2rem;border-radius:1px;min-width:2px;background:#3390ec;background:var(--primary-color)}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0 !important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500}.pinned-container{--container-height: 3.25rem;display:flex;justify-content:space-between;align-items:center;flex:0 0 auto;overflow:visible;cursor:pointer}.pinned-container.is-floating{position:absolute !important;top:var(--topbar-height);right:0;left:0;margin:0;width:auto;height:var(--container-height);max-height:var(--container-height);background-color:#fff !important;background-color:var(--surface-color) !important}.pinned-container.is-floating .pinned-container-wrapper{order:0;padding:0 1rem;height:100%;border-radius:0;z-index:0;max-width:100%}@media only screen and (max-width: 600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width: 1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{content:\" \";border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);position:absolute;top:0;right:0;bottom:0;left:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;position:relative;pointer-events:none}.pinned-container .btn-icon{font-size:1.5rem;display:flex;justify-content:center;flex:0 0 auto}.pinned-container-wrapper{display:flex;flex:1 1 auto;overflow:hidden;align-items:center;padding:.25rem;border-radius:.25rem;order:1}.pinned-container-wrapper-utils{flex:0 0 auto;display:flex;align-items:center;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible !important}.pinned-message-media-container{width:2rem;height:2rem;position:absolute;margin-left:-0.25rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title,.pinned-message-subtitle{transform:translateX(0)}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height: var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-title,.pinned-message-content .pinned-message-subtitle{position:relative;height:calc(var(--height) / 2);min-height:calc(var(--height) / 2);overflow:visible}body.animation-level-2 .pinned-message-content .pinned-message-title,body.animation-level-2 .pinned-message-content .pinned-message-subtitle{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-top:-0.125rem;margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:.875rem;line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:\"#\"}.pinned-message .animated-counter.is-last:not(.backwards){transform:scale(0.68);opacity:0}.pinned-message .animated-super-row{--translateY: 16px}.pinned-message .pinned-message-media{--translateY: 32px}.pinned-message.hide~.tgico-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message.is-many .pinned-message-close{display:none}.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist{display:none}.pinned-message.is-many.is-floating .pinned-message-close{display:none}.pinned-message:not(.is-many) .pinned-message-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none !important}.pinned-audio{--progress-height: .25rem}.pinned-audio.is-floating{--container-height: var(--pinned-audio-height)}.pinned-audio:not(.is-floating){padding-right:1.75rem;max-width:210px;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible !important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0 !important}.pinned-audio-ico:before{content:\"\"}.pinned-audio-ico.flip-icon:before{content:\"\"}.pinned-audio-title{font-weight:500}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-title,.pinned-audio-subtitle{font-size:.875rem;line-height:1.3125;line-height:var(--line-height);width:100%;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius: 0;--height: var(--progress-height);--scaleX: 1;--translateY: .125rem;position:absolute;right:0;bottom:0;left:0;transform:scaleX(var(--scaleX)) translateY(var(--translateY));transform-origin:left center;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)}@media only screen and (min-width: 1276px){body.is-right-column-shown .pinned-audio-progress{--scaleX: calc(1 - var(--right-column-proportion))}}body.animation-level-0 .pinned-audio-progress{transition:none !important}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:hover,html.no-touch .pinned-audio-progress:active{--translateY: 0}.pinned-audio-progress .progress-line__filled:after{display:none !important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{position:absolute;height:.5rem;right:0;bottom:0;left:0;overflow:hidden}.pinned-audio-volume{align-items:center;position:relative;width:2.5rem;height:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{position:absolute;top:100%;left:0;right:0;bottom:-1rem;content:\" \"}.pinned-audio-volume .player-volume__icon{fill:#707579;fill:var(--secondary-text-color);width:inherit;height:inherit;cursor:pointer}.pinned-audio-volume.active .player-volume__icon{fill:#3390ec;fill:var(--primary-color)}.pinned-audio-volume .progress-line-container{position:absolute;top:100%;width:5rem;padding:.75rem 1rem;margin-top:2.25rem;transform:rotate(270deg);border-radius:10px;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 5px 0px rgba(0,0,0,.15);opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility 0s .2s}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none !important}.pinned-audio-volume:hover .progress-line-container,.pinned-audio-volume:active .progress-line-container{opacity:1;visibility:visible;transition:opacity .2s ease-in-out,visibility 0s 0s}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;transform:translateZ(0);opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),transform .2s cubic-bezier(.4, .0, .2, 1),width .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);position:fixed;top:0;right:0;bottom:0;left:0;height:44px;width:218px;overflow:hidden;z-index:1;display:flex;justify-content:flex-start}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{position:absolute;left:0;top:0;display:flex;align-items:center;justify-content:flex-start;width:638px;height:100%;transform:translateX(0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:100%}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{display:flex;align-items:center;justify-content:space-between;padding:7px;flex:0 0 auto;max-width:100%}.markup-tooltip-tools:first-child{width:218px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{width:1px;height:25px;background-color:#dfe1e5;background-color:var(--border-color)}.markup-tooltip .btn-icon{border-radius:8px !important;width:30px;height:30px;padding:0}.markup-tooltip .btn-icon.active{color:#fff !important;background-color:#3390ec !important;background-color:var(--primary-color) !important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-218px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{display:flex;align-items:center;opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition);pointer-events:none}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;text-overflow:ellipsis;margin:0 .5rem}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{position:relative;max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem}.stickers-helper-stickers{max-width:100%;border-radius:var(--border-radius)}html.no-touch .stickers-helper .super-sticker:not(.active):hover,html.no-touch .stickers-helper .super-sticker:not(.active):active{background:none}.emoji-helper{height:50px;padding:.25rem 0 !important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:before,.emoji-helper .super-emojis:after{display:inline-block;content:\" \";width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):hover,html.no-touch .emoji-helper .super-emoji:not(.active):active{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec !important;background-color:var(--primary-color) !important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem, 100%)}.inline-helper .scrollable{position:relative;max-height:232px}.inline-helper-separator{height:1px;width:100%;margin-left:4rem;background-color:#dfe1e5;background-color:var(--border-color)}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:unset}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;padding:.5rem .5rem .5rem 4rem;line-height:1.3125;line-height:var(--line-height)}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{position:absolute;left:.5rem;width:3rem !important;height:3rem !important;overflow:hidden}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{color:#fff;text-transform:uppercase;font-size:1.75rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;display:flex;align-items:center;justify-content:center}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-video,.inline-helper .media-poster{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.inline-helper .gif{position:absolute;top:0;right:0;bottom:0;left:0;width:auto !important;height:auto !important}.inline-helper-results.is-gallery{max-width:100%;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill, minmax(80px, 1fr));grid-template-columns:repeat(auto-fill, minmax(var(--esg-sticker-size), 1fr));grid-gap:1px}.inline-helper-results.is-gallery .inline-helper-result{width:auto !important;height:auto !important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.inline-helper-result-description{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden;white-space:pre-wrap}.chat-search{position:absolute !important;top:0;z-index:2}.chat-search-footer{height:46px;padding:0 8px;flex:0 0 auto;width:100%;background-color:#fff;background-color:var(--surface-color);display:flex;justify-content:space-between;align-items:center;box-shadow:0px -1px 5px -1px rgba(0,0,0,.21);overflow:hidden}.chat-search-footer .chat-search-count{margin-left:8px;color:#707579;color:var(--secondary-text-color)}.chat-search-footer+.chat-input{display:none}.chat-search-count:empty{display:none}.chat-search-count:not(:empty)+.btn-icon{display:none}.chat-search-controls{display:flex}.chat-search-results{width:100%;height:100%;max-height:100%;overflow:hidden;position:absolute;top:0;left:0;visibility:hidden;opacity:0;background-color:#fff;background-color:var(--surface-color);transition:.2s ease}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding: 0px;position:absolute !important;z-index:3;top:var(--padding);right:var(--padding);bottom:var(--padding);left:var(--padding);display:flex;flex-direction:column;justify-content:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto !important}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding: -4px;background-color:#fff;background-color:var(--surface-color);position:relative;border-radius:12px;width:100%;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#a2acb4;transition:color .2s ease-in-out;pointer-events:all;flex:1 1 auto}.drop-outline-wrapper{position:absolute;top:var(--wrapper-padding);right:var(--wrapper-padding);bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;transition:stroke .2s ease-in-out;stroke-dashoffset:0}.drop.is-dragover .drop-outline-path{-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite;stroke:#3390ec;stroke:var(--primary-color)}.drop-icon{font-size:6rem}.drop-header{font-weight:500;font-size:1.25rem}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height: 670px){.drop-icon{font-size:0}.drop-header{margin-top:0px}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{width:auto;height:auto;display:block;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center}.crop-image{display:block;position:relative;pointer-events:none}.crop-component{position:relative;z-index:999;background-color:#fff;margin:0 auto;overflow:hidden}.crop-component>img{max-width:100%}.crop-overlay{position:absolute;z-index:999;overflow:hidden;box-sizing:content-box;border-radius:50%}html.no-touch .crop-overlay:hover,.crop-overlay:active{cursor:move}.crop-overlay-image{position:absolute;display:block}.crop-overlay-color{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,.7);border-radius:8px}.sidebar-header{background-color:#fff;background-color:var(--surface-color);display:flex;align-items:center;justify-content:space-between;padding:0 1rem;min-height:3.5rem;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width: 600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{flex:1;font-weight:500;padding-left:1.5rem;font-size:1.25rem;color:#000;color:var(--primary-text-color)}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{overflow:inherit !important;width:2.5rem;height:2.5rem}.sidebar-content{width:100%;max-height:100%;height:100%;overflow:hidden;display:flex;position:relative;flex:1 1 auto}.profile-avatars-container{width:100%;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.no-touch .profile-avatars-container:hover .profile-avatars-arrow,html.no-touch .profile-avatars-container:active .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0 !important}.profile-avatars-avatars{width:100%;height:100%;display:flex;flex-wrap:nowrap;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;position:absolute}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0, 0)}.profile-avatars-avatars:before{content:\" \";top:0;right:0;bottom:0;left:0}.profile-avatars-avatar{width:inherit;height:inherit;min-width:100%;min-height:100%;display:flex;background-color:#000;position:relative}.profile-avatars-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none}.profile-avatars-gradient{position:absolute;left:0;right:0;bottom:0;height:80px;background:linear-gradient(360deg, rgba(0, 0, 0, 0.3) 8.98%, rgba(0, 0, 0, 0) 100%)}.profile-avatars-info{position:absolute;bottom:0;display:flex;flex-direction:column;align-items:flex-start;left:1.5rem;bottom:.5625rem;pointer-events:none}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color: #fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit !important}.profile-avatars-tabs{display:flex;position:absolute;top:.5rem;left:.375rem;right:.375rem;height:.125rem;pointer-events:none}.profile-avatars-tab{flex:1 1 auto;border-radius:4px;margin:0 .125rem;background-color:#fff;opacity:.2;transition:opacity .2s ease-in-out;height:inherit}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{position:absolute;top:0;left:0;bottom:0;width:calc(100% / 3);opacity:0}.profile-avatars-arrow:before{position:absolute;top:50%;transform:translateY(-50%);font-size:2.1875rem;color:#fff;left:.625rem}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active{opacity:1 !important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{flex:0 0 auto;display:flex;flex-direction:column;position:relative;width:100%}.profile-content-wrapper{flex:1 1 auto;display:flex;flex-direction:column;padding-bottom:13px}@media only screen and (min-width: 601px){.profile-content-wrapper{padding-top:15px}}.profile-content .sidebar-left-section{position:relative;background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{text-align:center;font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);font-weight:500;overflow:hidden;max-width:21.25rem;margin:0 auto;color:#000;color:var(--primary-text-color);display:flex;align-items:flex-end}.profile-name span.emoji{vertical-align:inherit;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.profile-name .peer-title{word-break:break-word;text-overflow:ellipsis;overflow:hidden}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-subtitle{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px}@media only screen and (max-width: 600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{margin:.5rem auto 10px;display:block}@media only screen and (max-width: 600px){.profile-avatar{margin:0 auto 10px;--size: 100px;--multiplier: .54}}.profile-name,.profile-subtitle,.profile-avatar{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size: 3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{content:\" \";position:absolute;height:1px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;left:0;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size: var(--scrollable-size, 3.5rem);width:100%;display:flex;justify-content:space-around;align-items:center;flex-direction:row;position:relative;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#707579;color:var(--secondary-text-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.menu-horizontal-div-item{height:var(--size);padding:0 1rem;cursor:pointer;text-align:center;flex:1 1 auto;font-size:1rem;font-weight:500;position:relative;transition:none !important;display:flex;align-items:center;justify-content:center;line-height:1.3125;line-height:var(--line-height);border-radius:0}html.no-touch .menu-horizontal-div-item:hover,html.no-touch .menu-horizontal-div-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .menu-horizontal-div-item.active:hover,html.no-touch .menu-horizontal-div-item.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{position:relative;display:inline-flex;align-items:center;overflow:visible}.menu-horizontal-div i{position:absolute;bottom:calc(-.625rem - 7px);left:0;opacity:0;background-color:#3390ec;background-color:var(--primary-color);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:content-box;transform-origin:left;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{min-width:100%;width:100%;display:grid;grid-template-columns:100%;grid-template-rows:100%}.tabs-container .tabs-tab{display:none;flex-direction:column;grid-row-start:1;grid-column-start:1;background-color:#fff;background-color:var(--background-color);overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none !important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4, .0, .2, 1),filter .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4, .0, .2, 1),filter .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex-direction:column;flex:1 1 auto;min-width:18rem;max-width:calc(1680px / 4)}@media only screen and (max-width: 600px){#column-left{width:100%;max-width:100%}body:not(.is-left-column-shown) #column-left{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px){#column-left{overflow:visible}#column-left:after{position:absolute;content:\" \";display:block;height:100vh;width:1px;background-color:#dfe1e5;background-color:var(--border-color);right:-1px;top:0;z-index:2}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-left{display:flex;position:fixed;left:0;top:0;width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:unset}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width: 926px){#column-left{display:flex}}@media only screen and (max-width: 1275px){#column-left{flex:2}}@media only screen and (min-width: 1681px){html.is-safari #column-left{max-width:calc(1680px / 4 - 1.25px)}}#column-left .item-main{--menu-size: 3rem}#column-left .menu-horizontal-scrollable{--scrollable-size: var(--menu-size);z-index:1;background-color:#fff;background-color:var(--surface-color);position:relative;top:unset}@media only screen and (max-width: 600px){#column-left .menu-horizontal-scrollable{box-shadow:0px 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .menu-horizontal-div{position:relative !important;justify-content:flex-start;z-index:0}#column-left .menu-horizontal-scrollable .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem;border-top-left-radius:6px;border-top-right-radius:6px}#column-left .menu-horizontal-scrollable .menu-horizontal-div-item>span{overflow:visible}#column-left .menu-horizontal-scrollable .menu-horizontal-div-item>span i{bottom:calc(-.6875rem - 2px)}#column-left .menu-horizontal-scrollable .menu-horizontal-div__stripe{display:none}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .folders-tabs-scrollable .menu-horizontal-div-item:first-child{margin-left:.6875rem}@media only screen and (max-width: 600px){#column-left .folders-tabs-scrollable .menu-horizontal-div-item:first-child{margin-left:.1875rem}}#column-left .item-main .input-search .selector-user{height:30px;position:absolute !important;left:6px;top:6px;z-index:1;margin-left:0;line-height:1.875rem}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block !important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width: 600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{margin-top:7px;font-size:14px}html.no-touch #column-left .item-main .search-helper .selector-user:hover,html.no-touch #column-left .item-main .search-helper .selector-user:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none !important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative !important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto !important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%, -50%)}#column-left #chatlist-container{max-height:100%;overflow:hidden;position:relative;background-color:#fff;background-color:var(--surface-color)}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{position:relative;width:2.5rem;height:2.5rem;flex:0 0 auto;display:flex;align-items:center;justify-content:center}#column-left .sidebar-header__btn-container>.btn-icon{visibility:hidden;opacity:0;position:absolute;top:0;right:0;bottom:0;left:0;transition:.2s opacity,.15s background-color;z-index:2;margin:0}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width: 600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-0.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{width:300px;max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem)}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width: 600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:1rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;padding-left:4px;margin-top:-1px;padding-bottom:1px}#column-left .search-group-people li{height:98px;border-radius:10px;max-width:78px;width:78px;align-items:center;display:flex;flex-direction:column;padding:12px 0 0 !important;margin:0 5px 0 0;flex:0 0 auto}@media only screen and (max-width: 600px){#column-left .search-group-people li{width:77px;max-width:77px}}#column-left .search-group-people .dialog-title-details,#column-left .search-group-people .dialog-subtitle{display:none}#column-left .search-group-people .user-caption{max-width:65px;padding:2px 0px 9px;font-size:12px}@media only screen and (max-width: 600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width: 600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{visibility:visible !important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-width: 600px){#column-left .item-main .sidebar-content .btn-corner{--size: 54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{width:100%;padding:0 .5rem .5rem;overflow:hidden;flex:0 0 auto}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(64px)}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px)}#column-left .connection-status-button{color:#2e3939;align-self:center;cursor:default;padding-left:4.5rem;text-align:left;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{cursor:pointer;text-decoration:underline;color:inherit}#column-left .connection-status-button .preloader-container{right:auto;left:1rem;width:1.5rem;height:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{position:absolute;left:0;top:0;bottom:0;right:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);transform:translateY(0);height:100%}#column-left .input-wrapper{width:420px;margin:0 auto;flex:0 0 auto;padding:0 1.25rem;max-width:100%}@media only screen and (max-width: 600px){#column-left .input-wrapper{width:100%;padding:0 1rem}}#search-container{display:flex}#search-container .scrollable-y{position:relative;flex:1 1 auto}.new-channel-container .sidebar-content,.new-group-container .sidebar-content,.edit-profile-container .sidebar-content{flex-direction:column}.new-channel-container .chatlist-container,.new-group-container .chatlist-container,.edit-profile-container .chatlist-container{flex:1 1 auto}.new-channel-container .caption,.new-group-container .caption,.edit-profile-container .caption{font-size:.875rem;margin-top:14px;margin-left:23px;color:#707579;color:var(--secondary-text-color);padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}@media only screen and (max-width: 600px){.settings-container .profile-button{border-radius:0}}.settings-container .profile-buttons{margin-top:1.1875rem;width:100%;padding:0 .4375rem}@media only screen and (max-width: 600px){.settings-container .profile-buttons{margin-top:.6875rem;padding:0}}.edit-profile-container .caption{margin-top:1.0625rem;margin-left:1.4375rem;line-height:1.3125;line-height:var(--line-height);padding-bottom:1.4375rem}@media only screen and (max-width: 600px){.edit-profile-container .caption{padding-right:24px}}.edit-profile-container .sidebar-left-h2{padding:0 1.4375rem;padding-bottom:1.5rem}.edit-profile-container hr{margin-bottom:1rem}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-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{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.chat-folders-container .caption,.edit-folder-container .caption{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);max-width:20rem;margin:0 auto}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{height:30px;padding:0 12px;font-size:15px;width:auto;transition:width .2s;margin:0;position:absolute;right:1rem;top:50%;transform:translateY(-50%);border-radius:15px}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width: 600px){.edit-folder-container .input-wrapper{width:100%;padding:0 16px}}.edit-folder-container .input-wrapper{margin-bottom:.125rem !important}.edit-folder-container .sidebar-left-section{padding-bottom:0rem}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list li{padding:9px 12px;height:50px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:normal}.folder-categories .checkbox-field{position:absolute;right:1.125rem !important}.folder-category-button{height:50px}.popup-forward .selector .chatlist li,.included-chatlist-container .selector .chatlist li{padding:7px .75rem !important;height:3.75rem}.popup-forward .selector .chatlist .user-caption,.included-chatlist-container .selector .chatlist .user-caption{padding:0px 0px 0 14px;margin-top:-2px}.popup-forward .selector .chatlist .user-last-message,.included-chatlist-container .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{display:flex;justify-content:space-between;align-items:center}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width: 600px){.search-group-recent li{height:62px;padding-top:7px;padding-bottom:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500 !important}.search-group-recent .dialog-avatar{--size: 46px;--multiplier: 1.173913}}@media only screen and (max-width: 600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width: 601px){.search-group-recent.search-group.search-group-contacts{padding:0px 0 7px}}.sidebar-left-section{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0}@media only screen and (max-width: 600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width: 601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width: 600px){.sidebar-left-section-content>.checkbox-ripple,.sidebar-left-section-content>.btn-primary{border-radius:0}}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width: 600px){.sidebar-left-section-name{padding:.5rem 1rem;font-size:.875rem}}.sidebar-left-section-caption{margin-top:1rem;font-size:1rem;color:#707579;color:var(--secondary-text-color);line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width: 600px){.sidebar-left-section-caption{margin:.5rem;font-size:.875rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none !important;opacity:.25}.sidebar-left-section .media-sticker-wrapper{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500}.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}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{text-align:center;max-width:342px;margin-left:auto;margin-right:auto;margin-bottom:1.125rem}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem !important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{width:168px;height:168px;margin:.625rem auto 1.1875rem}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{margin:1.125rem auto 1.8125rem;width:157px;height:157px}.two-step-verification-hint .media-sticker-wrapper{width:160px;height:160px;margin:.5rem auto 2.25rem}.two-step-verification-email .media-sticker-wrapper{width:160px;height:160px;margin:.5625rem auto 2.1875rem}.two-step-verification-set .media-sticker-wrapper{width:160px;height:160px;margin:1rem auto 1.3125rem}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width: 601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-top:1rem;padding-bottom:.9375rem}.active-sessions-container .row-title-row{align-items:flex-end}.active-sessions-container .row-title:first-child{font-weight:500}.active-sessions-container .row-title-right{font-size:.75rem;color:#707579;color:var(--secondary-text-color);line-height:1.5}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500}.blocked-users-container li{height:66px;padding-top:9px;padding-bottom:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{margin-top:-0.375rem;font-size:.875rem}.blocked-users-container ul{margin-top:.3125rem}@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{padding:0 .5rem .5rem}.background-container .grid-item:after{content:\" \";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border:3px solid #3390ec;border:3px solid var(--primary-color);opacity:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(0.91)}.background-container .grid-item-media{transition:transform .2s ease-in-out;transform:scale(1)}.background-container .grid .media-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.background-container .grid .preloader-container{z-index:1}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{top:40%;transform:translateY(-50%);text-align:center;line-height:1.3125;line-height:var(--line-height);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem !important;margin:0 auto;padding:0 1rem;position:relative}.empty-placeholder .media-sticker-wrapper{width:128px;height:128px;margin:0 auto 1.9375rem;position:relative}.empty-placeholder-header{font-size:1.25rem;font-weight:500}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{position:relative;overflow:unset}@media only screen and (min-width: 601px)and (max-width: 1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width: 600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw, 0, 0)}}@media only screen and (min-width: 601px){#column-right{width:calc(var(--right-column-width));transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);position:absolute;right:0;z-index:3;transform:translate3d(var(--right-column-width), 0, 0)}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, 0, 0)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width: 1276px){#column-right{width:calc(var(--right-column-width) + 1px);transform:translate3d(calc(var(--right-column-width) + 1px), 0, 0);border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}@media only screen and (min-width: 601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}}#column-right #search-private-container .chatlist-container{position:relative;flex:1 1 auto}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{width:100%;max-width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0px;perspective-origin:left top}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .search-super{top:100%;min-height:calc((1vh * 100) - 56px);min-height:calc((var(--vh, 1vh) * 100) - 56px)}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{display:flex;align-items:center}.shared-media-container .btn-corner.menu-open:before{content:\"\"}@media only screen and (max-width: 600px){.shared-media-container .btn-corner{width:54px;height:54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{width:100%;max-width:100%;position:absolute;min-height:100%;display:flex;flex-direction:column;background-color:#fff;background-color:var(--surface-color)}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);padding:24px 0px 0px 24px;font-weight:500;color:#707579;color:var(--secondary-text-color)}@media only screen and (max-width: 600px){.search-super .search-super-month-name{padding:18px 0px 0px 16px}}.search-super.sliding{max-height:none !important}.search-super-tabs{width:auto;flex:1 1 auto}.search-super-tabs-scrollable{box-shadow:none !important;position:sticky !important;top:0px;z-index:2;background-color:#fff;background-color:var(--surface-color)}.search-super-tabs-scrollable:before{position:absolute;width:100%;height:1px;left:0;top:0;background-color:inherit;display:block;content:\" \";z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{position:relative;display:flex}.search-super-tabs-container{min-height:calc(100% - 49px);grid-template-rows:100%;flex:1 1 auto}.search-super-tabs-container>div{position:relative;min-height:150px}.search-super-tabs-container>div>div:first-child{transform:translateY(0);min-height:calc(100vh - 111px)}.search-super-tabs-container .preloader{padding:0;position:absolute !important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .document-name,.search-super .audio-title,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{flex:0 0 auto;margin-left:8px;margin-top:3px;font-size:12px;color:#707579;color:var(--secondary-text-color)}.search-super-content-media .search-super-month-name{border:none;padding:9px 0px 7px 24px}.search-super-content-media .video-time{position:absolute;left:5px;top:4px;height:18px;border-radius:4px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 5px;z-index:1;font-size:12px;color:#fff;line-height:18px}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute;z-index:2;margin:0}.search-super .document .checkbox-field,.search-super .audio .checkbox-field{top:50%;left:0;margin-left:2rem;margin-top:1rem;transform:translateY(-50%)}.search-super-content-media .search-super-month-items{width:100%;padding-top:1px;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:1px}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width: 600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{padding-left:60px;height:calc(48px + 1.5rem)}.search-super-content-files .document-ico,.search-super-content-files .document-download{width:48px;height:48px;border-radius:5px !important}.search-super-content-files .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis}.search-super-content-links .search-super-item{display:flex;flex-direction:column;padding-left:4.4375rem;position:relative;overflow:hidden;min-height:4.375rem;cursor:pointer;justify-content:flex-start}.search-super-content-links .row-media{height:3rem;width:3rem;border-radius:.375rem;overflow:hidden;position:absolute;left:.6875rem}.search-super-content-links .row-media.empty{display:flex;align-items:center;justify-content:center;font-size:2rem;color:#fff;text-transform:uppercase;background-color:#3390ec;background-color:var(--primary-color)}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:unset}.search-super-content-links .anchor-url:last-child:before{position:absolute;top:0;right:0;bottom:0;left:0;content:\" \";cursor:pointer;z-index:1}.search-super-content-links .media-photo{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;white-space:pre-wrap;text-overflow:ellipsis;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{padding:0 !important;margin:2rem 0 0 -1.75rem !important}@media only screen and (min-width: 601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width: 600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 20px}@media only screen and (max-width: 600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:unset;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-top:.5rem;padding-bottom:.5rem}.search-super-content-members .chatlist li{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-0.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent !important}.search-super-selection-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;opacity:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width: 600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{flex-grow:1;font-weight:500;color:#000;color:var(--primary-text-color);white-space:nowrap;text-transform:capitalize;margin-left:1.5rem}#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before{display:none}#search-container .search-group.is-short li:nth-child(n+4){display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{display:flex;flex-direction:column;height:140px;cursor:pointer}#stickers-container .sticker-set-name{font-weight:500}#stickers-container .sticker-set-count{font-size:14px;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-header{display:flex;padding-left:16px;padding-bottom:12px;justify-content:space-between}#stickers-container .sticker-set-button{height:30px;padding-left:12px;padding-right:13px;margin-right:16px;font-size:15px;border-radius:16px;font-weight:400;width:auto;transition:width .2s}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{width:68px;height:68px;position:relative}#stickers-container .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}#stickers-container .sticker-set-sticker img{max-width:100%;max-height:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);padding:0 16px 8px 16px;margin:0;font-weight:500;justify-content:space-between;display:flex;font-size:15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width: 601px){#poll-results-container .poll-results-answer{padding:0 24px 8px 24px}}#poll-results-container .poll-results-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{float:left;padding-right:32px;padding-left:16.5px;font-size:24px;color:#707579;color:var(--secondary-text-color)}#poll-results-container .poll-results h3{padding:0 16px;margin-top:15px;font-size:20px;margin-bottom:16px}@media only screen and (min-width: 601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:normal}#poll-results-container .poll-results li{height:50px;padding:9px}@media only screen and (min-width: 601px){#poll-results-container .poll-results li{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{padding:0 .75rem;margin-bottom:.5625rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none !important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem !important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.88);display:flex;align-items:center;justify-content:center}@media only screen and (max-width: 600px){.media-viewer{background:#000}}.media-viewer-author{height:100%;cursor:pointer;display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width: 600px){.media-viewer-userpic{display:none}}.media-viewer-name{line-height:1.3125;line-height:var(--line-height);font-weight:500;margin:.0625rem 0}@media only screen and (min-width: 601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{line-height:1.3125;line-height:var(--line-height);font-size:.875rem}.media-viewer-buttons{position:absolute;top:0;right:0;display:flex;flex-flow:row nowrap;padding:.5rem .75rem}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:hover,html.no-touch .media-viewer-buttons .btn-icon:active{color:#fff}@media only screen and (max-width: 600px){.media-viewer-buttons{display:none}}.media-viewer-content{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;position:relative;max-width:100%;max-height:100%;overflow:hidden;flex:1 1 auto;display:flex;align-items:center}.media-viewer-media{visibility:hidden}.media-viewer-caption{position:absolute;text-align:center;color:#fff;word-break:break-word;overflow:hidden;text-overflow:ellipsis;z-index:4;bottom:0;left:0;right:0;padding:.5rem .5rem 0;opacity:0;line-height:1.3125;line-height:var(--line-height);white-space:pre-wrap;background-color:transparent}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9 !important}.media-viewer-caption .scrollable{padding:.5rem .875rem;max-height:6rem;max-width:50rem;height:6rem;position:relative;margin:0 auto}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width: 600px){.media-viewer-caption{width:100%;transform:translateZ(0);text-align:unset;bottom:1.0625rem}.media-viewer-caption .scrollable{padding:0 .5rem;height:auto}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0, -69px, 0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:hover,html.no-touch .media-viewer-caption:active{background-color:#000;opacity:1 !important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1 !important}.media-viewer-switcher{position:absolute;left:0;top:3.75rem;width:7rem;height:calc(100% - 7.5rem);cursor:pointer;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width: 600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-prev-button,.media-viewer-next-button{cursor:pointer;position:absolute;color:#fff;font-size:2rem;left:1rem;top:50%;transform:translateY(-50%) rotate(90deg);opacity:0;transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width: 601px){.media-viewer-prev-button,.media-viewer-next-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width: 601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{position:fixed !important;display:flex;justify-content:center;align-items:center;min-height:auto !important;left:0;top:0;transform-origin:top left;overflow:hidden;transform:translateZ(0) scale3d(1, 1, 1);border-radius:0}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}@media only screen and (max-width: 600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{width:100%;height:100%;position:absolute;left:0;top:0}.media-viewer-mover>svg{width:100%;height:100%}.media-viewer-mover img,.media-viewer-mover video{width:100%;height:100%;max-width:100%;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-o-object-fit:cover;object-fit:cover;opacity:1;transition:var(--open-duration) opacity;position:absolute}.media-viewer-mover svg img,.media-viewer-mover svg video{position:unset}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration) / 8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none !important}.media-viewer-mover.center{left:50% !important;top:50% !important;transform:translate3d(-50%, -50%, 0) !important;max-width:100vw;max-height:calc((1vh * 100) - 15rem);max-height:calc((var(--vh, 1vh) * 100) - 15rem)}@media only screen and (max-width: 600px){.media-viewer-mover.center{width:100% !important;height:100% !important;max-width:100vw !important;max-height:calc((1vh * 100) - 120px);max-height:calc((var(--vh, 1vh) * 100) - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{width:auto;-o-object-fit:contain;object-fit:contain}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{position:absolute;top:0;left:0;right:0;height:3.5rem;display:flex;align-items:center;justify-content:space-between;z-index:5;padding:0 1.25rem}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active{opacity:1}.media-viewer-topbar-left{display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{width:100%;height:100%;transform:scale3d(1, 1, 1);position:absolute;border-radius:0;display:flex;align-items:center;justify-content:center}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration: .2s;--move-duration: .35s;top:0;left:0;width:100%;height:100%;position:fixed !important;display:block;z-index:4;visibility:hidden;transition:visibility 0s var(--open-duration)}body.animation-level-0 .media-viewer-whole{--open-duration: 0s;--move-duration: 0s}.media-viewer-whole.active{visibility:visible;transition-delay:0s}.media-viewer-whole.active .overlays,.media-viewer-whole.active .media-viewer-appear{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .overlays,body.animation-level-2 .media-viewer-whole.active .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width: 600px){.media-viewer-whole .btn-menu-toggle{color:rgba(255,255,255,.4);opacity:1}.media-viewer-whole .btn-menu-toggle.menu-open{color:#fff;background-color:rgba(112,117,121,.2) !important}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-movers{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:\"\"}.tgico-zoom.zoom-in:before{content:\"\"}.zoom-container{width:17.125rem;height:3.375rem;background-color:rgba(0,0,0,.4);border-radius:12px;padding:.5rem;opacity:1;display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.25rem;left:50%;transform:translateX(-50%);z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{pointer-events:none;opacity:.4}.zoom-container .progress-line{--color: #fff;--height: 2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.zoom-container:not(.is-visible),.media-viewer-whole:not(.active) .zoom-container{opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0 !important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0 !important}.overlays{top:0;left:0;width:100%;height:100%;position:fixed !important;background-color:rgba(0,0,0,.2);z-index:4;opacity:0;visibility:hidden;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.emoji-dropdown{display:flex;flex-direction:column;width:100%;height:min(282px, calc(1vh * 100 - 135px));height:min(282px, calc(var(--vh) * 100 - 135px));background:#fff;background:var(--surface-color);overflow:hidden;flex:1 1 auto;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-height: 570px)and (min-width: 601px){.emoji-dropdown{position:absolute !important;left:.8125rem;bottom:5.125rem;width:26.25rem !important;height:26.25rem;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:0 100%}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{width:100%;max-width:100%;overflow:hidden;height:100%}.emoji-dropdown .emoji-tabs{justify-content:center;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.emoji-dropdown .emoji-tabs-search{position:absolute;left:0;margin-left:4px !important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0;margin-right:4px !important}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{top:0;font-size:14px;font-weight:500;color:#707579;color:var(--secondary-text-color);z-index:2;padding:12px 6px 6px 6px;width:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{top:0;height:1px}.emoji-dropdown .tabs-container .tabs-tab{min-height:100%;flex-direction:column;height:100%}.emoji-dropdown .tabs-container .emoticons-content{flex:1;padding:0;position:relative}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width: 600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:unset;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill, 40px)}.emoji-dropdown .emoji-padding.active .category-items>span{width:40px;height:40px;justify-self:center}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:unset}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{height:48px;padding:2px;width:100%;z-index:4;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{position:relative;margin:0 -0.125rem}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}.emoji-dropdown #content-stickers .scrollable{padding:0px 5px 0}.emoji-dropdown .menu-horizontal-div{width:100%;height:48px}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{font-size:1.5rem;margin:0 12px;width:48px;height:48px;line-height:48px;display:flex;align-items:center;flex:0 0 auto}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;width:48px;padding:0;margin-right:1px;margin-left:1px}.emoji-dropdown .stickers-padding .menu-wrapper{padding:0;height:48px;max-width:100%;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{padding:8px;max-width:100%;max-height:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{width:100%;height:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{width:0;height:0;opacity:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{width:0;height:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{width:0;height:0;display:none}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{min-height:5rem;max-height:12.5rem;border-radius:10px;background-color:rgba(0, 0, 0, .2);background-color:var(--scrollbar-color);opacity:1}.scrollable-x::-webkit-scrollbar,.no-scrollbar::-webkit-scrollbar{display:none}.scrollable{width:100%;height:100%;overflow-y:hidden;overflow-x:hidden;max-height:100%;transform:translateZ(0);position:absolute;top:0px;left:0px;bottom:0px;right:0px;-webkit-overflow-scrolling:touch}.scrollable.scrollable-x{overflow-x:auto;scrollbar-width:thin;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;-ms-overflow-style:none}.scrollable-padding{min-width:100%;height:100%}@-webkit-keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}.selector{width:100%;height:100%;display:flex;flex-direction:column}.selector-search-container{flex:0 0 auto;position:relative;max-height:132px;overflow:hidden}.selector-search-container .scrollable{position:relative;max-height:inherit}.selector-search{padding:0 24px 0 24px;display:flex;flex-flow:wrap;position:relative}.selector-search-input{border:none;outline:none;flex:1 1 auto}.selector-search .selector-search-input{padding:7px 0px 19px 0px}.selector-user{color:#000;color:var(--primary-text-color);background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);font-size:1rem;padding:0 17px 0px 0px;margin-left:-0.25rem;margin-right:.75rem;height:2rem;line-height:2rem;margin-bottom:7px;border-radius:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:0 0 auto;transition:.2s opacity,.2s transform,.2s background-color;max-width:11.25rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:hover,html.no-touch .selector-user:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:hover .selector-user-avatar:after,html.no-touch .selector-user:active .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.selector-user-avatar:after{position:absolute;content:\"\";left:0;top:0;background-color:#df3f40;background-color:var(--danger-color);height:100%;width:100%;z-index:2;font-size:23px;line-height:32px !important;opacity:0;transition:.2s opacity,.2s transform;transform:scaleX(-1) rotate(0deg)}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{height:100%;flex:1 1 auto}.selector .chatlist-container .scrollable>:first-child{margin-top:.5rem}.selector .chatlist li{padding-top:.75rem;padding-bottom:.75rem}@media only screen and (max-width: 600px){.selector .chatlist li{height:66px;padding-top:9px;padding-bottom:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px !important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;transform:translateY(-50%);top:50%;z-index:1}.selector .checkbox-field:first-child{margin-right:1.6875rem;margin-left:.6875rem}.selector .checkbox-field-round{pointer-events:none;position:absolute;right:1.125rem;--size: 1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:unset}.selector .checkbox-field-round .checkbox-box-check{--offset: 6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{flex:1 0 auto;max-width:100%;height:100px;margin:2.5px;cursor:pointer;position:relative}.gifs-masonry>.gif video,.gifs-masonry>.gif img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.gifs-masonry>.gif img{position:absolute;left:0;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;height:100%;transform-origin:center center;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:54px;height:54px;display:flex;cursor:pointer;overflow:hidden;opacity:0;transform:scale(0)}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color: #fff}.preloader-container .you-spin-me-round{width:100%;height:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;width:100%;height:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new,body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite !important;animation:rotate 1s linear infinite !important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;color:var(--color);width:56%;height:56%;opacity:1}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-download:hover,html.no-touch .preloader-container .preloader-download:active{background:none}.preloader-container:not(.manual) .preloader-download,.preloader-container.manual .preloader-close{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{width:1.5rem;height:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer !important}.preloader-container.preloader-streamable circle{stroke-width:2.5 !important}.preloader-container.preloader-streamable:after{content:\"\";position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:var(--color);left:50%;top:50%;transform:translate(-50%, -50%)}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{100%{transform:rotate(360deg)}}@keyframes rotate{100%{transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rp-overflow .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.btn-corner.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple{width:100%;height:100%;overflow:hidden;border-radius:inherit}.rp-overflow .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.btn-corner.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration: .7s;position:absolute;top:0;left:0;bottom:0;right:0}html.is-safari .c-ripple:not(:empty){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%);border-radius:inherit}.c-ripple__circle{background-color:rgba(0, 0, 0, .08);background-color:var(--ripple-color);display:block;position:absolute;transform:scale(0);border-radius:50%;-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;transition:.35s opacity,.35s background-color;pointer-events:none}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration: .2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width: 925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration: .2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}avatar-element{--size: 54px;--multiplier: 1;--color-top: var(--avatar-color-top);--color-bottom: var(--avatar-color-bottom);color:#fff;width:var(--size);height:var(--size);line-height:var(--size) !important;border-radius:50%;background:linear-gradient(var(--color-top), var(--color-bottom));text-align:center;font-size:calc(1.25rem / var(--multiplier));-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase;font-weight:700}avatar-element[data-color=red]{--color-top: var(--peer-avatar-red-top);--color-bottom: var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top: var(--peer-avatar-orange-top);--color-bottom: var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top: var(--peer-avatar-violet-top);--color-bottom: var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top: var(--peer-avatar-green-top);--color-bottom: var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top: var(--peer-avatar-cyan-top);--color-bottom: var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top: var(--peer-avatar-pink-top);--color-bottom: var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top: var(--peer-avatar-blue-top);--color-bottom: var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px / var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px / var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(21px / var(--multiplier)) !important}avatar-element.tgico-reply_filled:before{font-size:calc(28px / var(--multiplier)) !important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px / var(--multiplier))}avatar-element:before{line-height:inherit !important}avatar-element.media-container{position:relative}avatar-element img{width:var(--size) !important;height:var(--size) !important;border-radius:inherit !important;display:block}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{width:calc(1.125rem / var(--multiplier)) !important;height:calc(1.125rem / var(--multiplier)) !important;vertical-align:middle !important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{position:absolute;content:\" \";display:block;border-radius:50%;border:2px solid #fff;border:2px solid var(--surface-color);background-color:#0ac630;background-color:var(--avatar-online-color);width:14px;height:14px;left:2.4375rem;top:2.4375rem}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size: 120px;--multiplier: .45}avatar-element.avatar-100{--size: 100px;--multiplier: .54}avatar-element.avatar-48{--size: 48px;--multiplier: 1.125}avatar-element.avatar-46{--size: 46px;--multiplier: 1.173913}avatar-element.avatar-44{--size: 44px;--multiplier: 1.227272}avatar-element.avatar-42{--size: 42px;--multiplier: 1.285714}avatar-element.avatar-40{--size: 40px;--multiplier: 1.35}avatar-element.avatar-34{--size: 34px;--multiplier: 1.588235}avatar-element.avatar-32{--size: 32px;--multiplier: 1.6875}avatar-element.avatar-30{--size: 30px;--multiplier: 1.8}avatar-element.avatar-18{--size: 18px;--multiplier: 3}avatar-element.avatar-16{--size: 16px;--multiplier: 3.375}.avatar-relative .avatar-photo{position:absolute;top:0;left:0}.document{--background-color: var(--primary-color);padding-left:4.25rem;height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#fff;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0 .25rem}@media only screen and (max-width: 600px){.document:not(.document-with-thumb) .document-ico{padding:1.5rem 0px 0px 0px;font-size:14px}.document:not(.document-with-thumb) .document-ico:after{--size: .875rem}}.document-ico:after{--size: 1.125rem;content:\"\";display:block;position:absolute;top:0;right:0;width:var(--size);height:var(--size);border-bottom-left-radius:.25rem;border-style:solid;border-width:calc(var(--size) / 2);border-left-color:rgba(0,0,0,.25);border-bottom-color:rgba(0,0,0,.25);border-top-color:#fff;border-right-color:#fff}.document-ico,.document-download{font-size:1.125rem;background-size:contain}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#fff;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color: #FB8C00}.document.ext-pdf{--background-color: #DF3F40}.document.ext-apk{--background-color: #43A047}.document.document-with-thumb{--background-color: #fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3) !important}.document-thumb{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.document-name{white-space:nowrap;font-weight:500;font-size:1rem}.document-size{white-space:nowrap;color:#707579;color:var(--secondary-text-color);font-size:.875rem;text-overflow:ellipsis;overflow:hidden}.document-name,.document-size{line-height:1.3125;line-height:var(--line-height)}.document .preloader-container{width:2.5rem;height:2.5rem}@media only screen and (max-width: 600px){.document .preloader-container{width:1.625rem;height:1.625rem}}.document .preloader-circular{background-color:transparent !important}.document .preloader-path-new{stroke-width:2.5}.document,.audio{display:flex;flex-direction:column;justify-content:center;cursor:pointer;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.document-ico,.document-download,.audio-ico,.audio-download{position:absolute;left:0;width:3.375rem;height:3.375rem;color:#fff}.document-download,.audio-download{z-index:1;align-items:center;font-size:1.5rem;cursor:pointer;display:flex;justify-content:center;transition:opacity .2s ease-in-out;opacity:1}.document-download.downloaded,.audio-download.downloaded{opacity:0}.document-description,.audio-description{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.document:not(.corner-download) .preloader-container:not(.preloader-streamable),.audio:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1) !important}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent !important}.audio .preloader-container:not(.preloader-streamable){width:100%;height:100%}.audio{position:relative;padding-left:67px;overflow:visible !important;height:3.375rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:3rem;padding-left:calc(3rem + .5625rem)}.audio-toggle,.audio-download{overflow:hidden;border-radius:50%;background-color:#3390ec;background-color:var(--primary-color);align-items:center}.audio.corner-download .audio-download{width:1.375rem;height:1.375rem;margin:2rem 2rem 0;background:none;display:flex !important;top:0}.audio.corner-download .preloader-container{border-radius:inherit;background-color:#3390ec;background-color:var(--primary-color)}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{position:absolute;top:0;right:0;bottom:0;left:0;transform:rotate(-119deg);overflow:hidden;max-width:100%;max-height:100%;border-radius:inherit}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{position:absolute;background-color:#fff;top:50%;left:50%;transform:translate(-50%, -50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out}@media only screen and (min-width: 601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width: 600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width: 601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width: 600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:23px;margin-top:1px}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color);opacity:.3}html.no-touch .audio-waveform rect:hover,html.no-touch .audio-waveform rect:active{opacity:1}.audio-waveform rect.active,.audio.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform rect{opacity:1}.audio .audio-details{margin-top:3px;margin-bottom:0}.audio .audio-title{margin-bottom:-2px}.audio-ico,.audio-download{width:3rem;height:3rem}.audio .part{height:112px !important;width:112px !important}@media only screen and (max-width: 600px){.audio .part{width:100px !important;height:100px !important}}.audio-title{font-size:1rem;color:#000;color:var(--primary-text-color)}.audio-description:not(:empty):before{content:\" • \"}.audio-time,.audio-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex}@media only screen and (max-width: 600px){.audio-time,.audio-subtitle{font-size:.75rem}}.audio-title,.audio-time,.audio-subtitle{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-title,.audio-subtitle{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{line-height:1;margin-left:-1px;margin-top:7px;align-items:center}@media only screen and (max-width: 600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{content:\" \";width:.5rem;height:.5rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;margin-left:.375rem}.audio .progress-line{--height: 2px;--border-radius: 4px;--thumb-size: .75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{z-index:1;background-color:transparent;opacity:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff !important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;-o-object-fit:cover;object-fit:cover;width:inherit;height:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{position:absolute;left:0;display:flex;width:100%;justify-content:center;top:8px;align-items:center;transform:translate3d(0, calc(-100% - 10px), 0);transition:transform .2s ease}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translate3d(0, 0, 0)}.quiz-hint .container{background:rgba(0,0,0,.7);text-align:center;width:auto;padding:10px 18px 12px 50px;min-height:48px;border-radius:12px;line-height:1.5;color:#fff;font-size:15px;max-width:400px;overflow:hidden;text-align:left;position:relative;display:flex;align-items:center;flex-wrap:wrap}@media only screen and (max-width: 600px){.quiz-hint .container{padding:10px 18px 12px 54px;margin:0 10px;font-size:14px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"\";position:absolute;left:15px;font-size:1.5rem;top:12px}.quiz-hint .container a{color:#fff;border-bottom:1px solid #fff}.peer-typing{margin-right:4px}.peer-typing-container{--color: var(--primary-color);color:var(--color)}.peer-typing-flex{display:flex;align-items:center}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;vertical-align:middle;transform:translateY(-1px)}.peer-typing-text-dot{width:6px;height:6px;border-radius:50%;background-color:var(--color);margin:0 .5px;display:inline-block;vertical-align:middle;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:dotMiddle;animation-name:dotMiddle}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{width:13px;height:5px;overflow:hidden;position:relative;border-radius:2px;margin-right:.375rem}.peer-typing-upload:before,.peer-typing-upload:after{display:block;content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--color);border-radius:inherit}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{content:\" \";display:block;width:6px;height:6px;border-radius:50%;background-color:var(--color);-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.peer-typing-choosing-sticker{margin-right:.375rem;flex:0 0 auto;display:flex;align-items:center;height:16px}.peer-typing-choosing-sticker-eye{width:8px;height:14px;border-radius:50%;display:inline-block;vertical-align:middle;border:1px solid var(--color);margin:0 .0625rem;position:relative;-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite}.peer-typing-choosing-sticker-eye:before{content:\" \";display:block;width:.25rem;height:.25rem;background-color:var(--color);border-radius:50%;position:absolute;top:50%;-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;transform:translate(-1px, -50%)}@-webkit-keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@-webkit-keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@-webkit-keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}@keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}poll-element{margin-top:-1px;display:block;width:330px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#000;color:var(--primary-text-color)}@media only screen and (max-width: 600px){poll-element{width:240px;max-width:100%}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500}@media only screen and (max-width: 600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{font-size:14px;color:#707579;color:var(--secondary-text-color);margin-top:2px;margin-bottom:5px;display:flex;align-items:center;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{position:absolute;font-size:1.5rem;top:-4px;right:2px;color:#3390ec;color:var(--primary-color);cursor:pointer;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{transform:scale(0);pointer-events:none}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;width:18px;height:18px}poll-element .poll-answer{display:flex;position:relative;padding-bottom:20px;padding-left:28px;margin-top:1px}poll-element .poll-answer-text{margin-top:6px;margin-left:12px}poll-element .poll-answer-percents{position:absolute;left:0;top:0;opacity:0;font-weight:500;margin-top:7px;font-size:14px;margin-left:-9px;text-align:right;width:40px}poll-element .poll-answer-selected{position:absolute;bottom:1px;left:15px;color:#fff;background:#3390ec;background:var(--primary-color);border-radius:50%;height:16px;width:16px;font-weight:bold;font-size:.75rem;opacity:1;display:flex;align-items:center;justify-content:center}poll-element .poll-answer-selected:before{content:\"\";font-weight:bold}html.no-touch poll-element .poll-answer:hover .animation-ring,html.no-touch poll-element .poll-answer:active .animation-ring{visibility:visible;transform:scale(1)}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-0.5rem}poll-element .poll-line{height:35px;position:absolute;left:10px;bottom:2px;stroke-dashoffset:0;stroke-dasharray:0,485.9}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{text-align:center;margin:-0.375rem -0.5rem -0.375rem -0.625rem;height:2.875rem}poll-element .poll-footer-button{cursor:pointer;width:100%;height:100%;color:#3390ec;color:var(--primary-color);font-weight:500;border-top-left-radius:0 !important;border-top-right-radius:0 !important;font-size:1rem;overflow:hidden}poll-element .poll-footer,poll-element .poll-footer-button{display:flex;align-items:center;justify-content:center}poll-element .poll-quiz-timer{width:32px;height:32px;stroke:#a3adb6;transform:rotate(270deg);top:-7px;fill:none;position:absolute;right:-2px;stroke-linecap:round}poll-element .poll-time{font-size:12px;font-weight:500;position:absolute;right:27px;color:#a3adb6}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:\"\";font-size:12px}poll-element .circle-hover{display:flex;justify-content:center;align-items:center;width:34px;height:34px;position:absolute;left:-1px;top:-1px;transform:scale(1)}poll-element .circle-hover .poll-answer-selected{display:flex !important;opacity:0;left:50%;top:50%;transform:translate(-50%, -50%);width:20px;height:20px;font-size:20px;line-height:16px;-webkit-animation:none;animation:none}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{display:block;border-radius:50%;height:34px;width:34px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);transform:scale(0.1);visibility:hidden}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;width:26px;top:unset;left:unset}poll-element .progress-ring__circle{transform-origin:center;transform:rotate(-90deg);stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent}poll-element.is-voted .circle-hover,poll-element.is-voted .animation-ring{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity .1s ease forwards}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:.34s opacity}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:.1s transform}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-animation-fill-mode:forwards !important;animation-fill-mode:forwards !important}.transition>.transition-item:not(.active):not(.from):not(.to){display:none !important}.transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.transition.zoom-fade>.to{transform-origin:center;opacity:0}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(0.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine: cubic-bezier(.39, .575, .565, 1);--easeInSine: cubic-bezier(.47, 0, .745, .715);position:relative}.transition.slide-fade>.from{transform-origin:left center;transform:translateX(0);opacity:1}.transition.slide-fade>.to{transform-origin:left center;transform:translateX(1.5rem);opacity:0}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}.row{min-height:3.5rem;position:relative;padding:.6875rem 1rem;display:flex;flex-direction:column;justify-content:center}.row a{position:relative;z-index:1}.row-title-row{display:flex;justify-content:space-between;align-items:center;order:0}.row-title-row .row-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word;text-overflow:ellipsis;overflow:hidden}.row-title-right{flex:0 0 auto !important;margin-left:1rem}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{position:absolute;left:1rem;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);pointer-events:none;margin-top:-0.125rem}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width: 601px){.row-clickable{border-radius:10px}}.row .radio-field-main,.row .checkbox-field{padding-left:3.375rem;margin-left:-3.375rem}.row .checkbox-field{margin-right:0;height:auto}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0;margin-right:.125rem;padding:0}.row-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important;font-size:.875rem !important;line-height:1.3125;line-height:var(--line-height);margin-top:.125rem;margin-bottom:.0625rem;order:1}.row-subtitle:empty{display:none}.row-media{width:48px !important;height:48px !important;position:absolute !important;margin:0 !important;left:.5rem}.row.menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.color-picker{width:380px;max-width:100%;margin:1.1875rem auto 1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.color-picker-box{width:100%;height:198px}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible !important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);position:absolute !important;right:0;bottom:calc(100% + .625rem);width:26.25rem !important;max-width:100%;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:bottom right;padding:.625rem !important;display:block !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{width:100%;border-radius:.375rem;border:2px solid #3390ec;border:2px solid var(--primary-color);text-align:center;color:#3390ec;color:var(--primary-color);background-color:transparent;height:3rem;font-weight:500;font-size:.9375rem}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:hover,html.no-touch .reply-keyboard-button:active{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.popup{position:fixed !important;top:0;right:0;bottom:0;left:0;max-width:none;z-index:3;background-color:rgba(0,0,0,.3);margin:0;padding:1.875rem;box-shadow:none;opacity:0;visibility:hidden;transition-property:opacity,visibility;transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-timing-function:cubic-bezier(.4, 0, .2, 1);transition-timing-function:var(--popup-transition-function);overflow:auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;visibility:visible;transition-delay:0s,0s;z-index:4}.popup.active .popup-container{transform:translate3d(0, 0, 0)}.popup.hiding .popup-container{transform:translate3d(0, 0, 0)}.popup-container{position:relative;border-radius:10px;background-color:#fff;background-color:var(--surface-color);padding:1rem;transform:translate3d(0, 3rem, 0);-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .15s cubic-bezier(.4, 0, .2, 1);transition:transform var(--popup-transition-time) var(--popup-transition-function);display:flex;flex-direction:column;overflow:hidden;margin:auto}body.animation-level-0 .popup-container{transition:none}.popup-centerer{margin:auto}.popup-close{z-index:3;justify-self:center;flex:0 0 auto}.popup-header{display:flex;margin-bottom:2rem;align-items:center}.popup-body{flex:1 1 auto;display:flex;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-top:0 !important;margin-right:1.125rem}.popup-buttons .btn{font-weight:500;padding:.5rem;text-transform:uppercase;border-radius:8px;position:relative;overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis}.popup-buttons .btn+.btn{margin-top:.5rem;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{position:absolute;bottom:20px;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;text-align:left;margin:0;margin-left:2rem}.popup-avatar .crop{max-width:100%;max-height:100%;padding:24px 54px 46px 46px;border-radius:8px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{width:420px;max-width:420px;padding:12px 20px 32.5px;max-height:100%}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{width:auto;height:36px;font-size:14px;font-weight:normal;padding:0 1.375rem;margin-top:-3px;border-radius:10px;text-transform:uppercase}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;padding-left:1.5rem;margin:0;margin-top:-3px;font-size:1.25rem;font-weight:500}.popup-new-media .popup-photo{max-width:380px;overflow:hidden;width:100%;border-radius:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{width:100%;margin-top:25px;flex:0 0 auto}.popup-new-media .input-field-input{font-size:1rem;border-radius:10px}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{z-index:4;top:calc(100% + .25rem)}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{position:relative;border-radius:inherit;overflow:hidden}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{max-width:100%;overflow:hidden;cursor:default;padding-left:3.75rem;height:4.5rem}.popup-new-media.popup-send-photo .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;line-height:1.5}.popup-new-media.popup-send-photo .document-ico{height:48px;width:48px;font-size:16px;font-weight:normal;line-height:11px;letter-spacing:0}.popup-create-contact .name-fields{display:flex;flex-direction:column;position:relative;padding-left:116px;margin-top:1rem}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{display:flex;margin-bottom:.625rem;align-items:center}.popup-peer .popup-container{padding:1rem 1.5rem .8125rem;max-width:min(400px, 100%)}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{margin-top:0;margin-bottom:0;min-width:15rem;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;text-overflow:ellipsis;overflow:hidden;word-break:break-word;line-height:1.3125;line-height:var(--line-height)}.popup-peer .popup-buttons{margin-top:1.625rem;margin-right:-0.5rem}.popup-peer .popup-buttons .btn{font-weight:500}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin:0 -1.0625rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{padding:0 2rem 0 1.5rem;margin:0;font-size:1.25rem;font-weight:500;line-height:1.3125;line-height:var(--line-height)}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);text-align:center;color:#3390ec;color:var(--primary-color)}.popup-stickers .sticker-set-footer .btn-primary{text-transform:uppercase;width:auto;padding:0 1.0625rem;height:44px}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-width:420px;max-height:420px;width:420px;padding:0}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{margin-bottom:12px;flex:0 0 auto;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{padding:0 5px;display:grid;grid-template-columns:repeat(5, 1fr)}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4, 1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{width:80px;width:var(--esg-sticker-size);height:80px;height:var(--esg-sticker-size);margin-bottom:2px;justify-self:center;cursor:pointer;position:relative}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height: 470px){.popup-date-picker .popup-container[data-lines=\"7\"]{top:19px}.popup-date-picker .popup-container[data-lines=\"5\"]{top:-19px}}.popup-date-picker .popup-header{margin-left:6px;margin-top:4px;margin-bottom:1.375rem}.popup-date-picker .popup-title{font-weight:500;font-size:20px}.popup-date-picker .popup-buttons{order:2;margin-right:-2px}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{display:flex;justify-content:space-between;align-items:center}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-prev:disabled,.popup-date-picker .date-picker-next:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-top:7px;margin-bottom:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7, 1fr);width:100%;justify-content:center}.popup-date-picker .date-picker-month .btn-icon{justify-self:center;width:38px;height:38px;font-size:12px;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;align-items:center}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7 !important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{color:#fff;color:var(--badge-text-color);border-radius:50%;background-color:#3390ec !important;background-color:var(--primary-color) !important}.popup-schedule .popup-header{justify-content:space-between;margin-top:5px;margin-bottom:17px;margin-left:0}@media only screen and (max-width: 600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;width:420px;padding:4px 16px 16px 16px}@media only screen and (max-width: 600px){.popup-schedule .popup-container{min-width:312px;width:312px;padding:4px 14px 14px 14px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-right:-20px;margin-left:2px;width:unset}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-weight:500;font-size:20px;margin-left:-5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{justify-self:auto;font-weight:500;font-size:14px;width:36px;height:36px;margin-top:-4px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8 !important}.popup-schedule .date-picker-month-day{font-weight:bold;color:#000 !important;color:var(--primary-text-color) !important;font-size:14px !important}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width: 600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:normal}@media only screen and (max-width: 600px){.popup-schedule .btn-primary{height:50px;widtH:280px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px, 100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main::before{left:.25rem}.popup-create-poll .radio-field .radio-field-main::after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none;opacity:0 !important}.popup-create-poll .input-field .btn-icon{position:absolute;right:.4375rem;top:.4375rem;z-index:1;opacity:1;transition:opacity .2s ease}@media only screen and (max-width: 600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{margin-top:.875rem;font-size:.875rem;line-height:1.2}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{top:54px;right:20px}.popup-forward .popup-container{width:420px;max-width:420px;padding:7px 0 0 0;max-height:min(40.625rem, 100%);height:40.625rem}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width: 600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .selector,.popup-forward .chatlist-container{height:auto;overflow:hidden;display:flex;width:100%;flex-direction:row;flex:1 1 auto}.popup-forward .selector-search-input{font-size:1.25rem;padding:.5rem 1.5rem;width:100%;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0 !important}.popup-forward .selector .chatlist li{height:3.875rem !important;padding-top:.5rem !important;padding-bottom:.5rem !important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;text-align:center;pointer-events:none}.popup-instance-deactivated .header{font-size:2rem;color:#fff}.popup-instance-deactivated .subtitle{color:#fff;opacity:.6;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:bold;margin:.75rem 0 .25rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{width:100px;height:100px;position:relative;margin:0 auto}.popup-report-messages-confirm .popup-body{margin:1em -0.5rem .375rem -0.5rem;overflow:unset}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}#auth-pages{max-width:100%;overflow:hidden;background:#fff;background:var(--surface-color)}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width: 600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width: 600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width: 600px){#auth-pages .input-wrapper{margin-top:41px;width:100%;padding:0 16px}}#auth-pages .auth-image,#auth-pages .subtitle,#auth-pages .input-wrapper{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;position:relative;max-width:720px;margin:0 auto}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height: 810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{max-width:720px;min-width:auto;margin:0 auto;position:relative}#auth-pages .tabs-container .tabs-tab .container{height:810px;padding:0;flex:1 1 auto;display:flex;flex-direction:column;width:100%}@media screen and (max-height: 810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width: 600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-top:.5rem;margin-bottom:.5rem}.page-sign .auth-image,.page-signUp .auth-image{width:7.5rem;height:7.5rem;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.page-sign .auth-image,.page-signUp .auth-image{width:10rem;height:10rem;margin-bottom:1.5rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{max-width:100%;max-height:100%;fill:#3390ec;fill:var(--primary-color)}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:normal}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:unset !important}.page-signQR .auth-image{width:240px !important;height:240px !important;display:flex;justify-content:center;align-items:center}.page-signQR .auth-image .preloader{transform:none;left:unset;top:unset}.page-signQR .auth-image .qr-canvas{width:100%;height:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem !important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{max-width:480px;margin:1rem auto;line-height:1.3125;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-top:10px;margin-bottom:14px}@media only screen and (max-width: 600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width: 600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{display:flex;align-items:center;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{padding:0 1rem;border:none;outline:none;padding:0 1rem;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color)}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:calc(1680px + 2px) !important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{width:100%;overflow:hidden;position:relative;min-height:100%;height:100%;max-height:100%}@media only screen and (max-width: 600px){.page-chats .main-column{width:100%;display:flex !important;z-index:1}}@media only screen and (min-width: 601px){.page-chats #column-center{display:flex !important;background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex !important}.page-chats .main-column{height:100%;position:relative;min-height:100%;max-height:100%}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;width:100%;max-height:100%;height:100%;overflow:hidden;position:absolute;left:0;top:0;z-index:3}@media only screen and (min-width: 1681px){.page-chats{border-top-width:0;border-right-width:1px;border-bottom-width:0;border-left-width:1px;border-style:solid;border-color:#dfe1e5;border-color:var(--border-color)}}.page-chats .avatar-edit{width:120px;height:120px;margin:1rem auto 2rem;flex:0 0 auto}body.animation-level-2 .page-chats .main-column{transition:.25s ease-in-out;transition:var(--tabs-transition)}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}html,body{height:100%;width:100%;margin:0;padding:0}@media only screen and (max-width: 600px){html,body{overflow:hidden;height:calc(1vh * 100);height:calc(var(--vh, 1vh) * 100)}}html.is-ios{position:fixed;-webkit-user-select:none;-webkit-touch-callout:none}@supports(padding: max(0px)){html{padding:0 min(16px, env(safe-area-inset-right)) 0 min(16px, env(safe-area-inset-left))}}html{font-size:16px;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,input,optgroup,select,textarea,html{font-family:\"Roboto\",-apple-system,apple color emoji,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif}input,textarea,button,select,a,div{-webkit-tap-highlight-color:rgba(0,0,0,0)}.whole{min-height:100%;width:100%;margin:0 auto;max-width:1680px;height:100%}@media only screen and (min-width: 601px){.only-handhelds{display:none !important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500}h4{font-size:2rem;margin:22px 0 14px;line-height:110%}@media only screen and (max-width: 600px){h4{font-size:20px;margin:2px 0 8px}}input,[contenteditable=true]{caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color);background-color:transparent}input,textarea{-webkit-appearance:none}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40 !important;color:var(--danger-color) !important}.danger .c-ripple__circle{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec !important;color:var(--primary-color) !important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.blue:before,.primary:before,.danger:before{color:inherit !important}.bg-warning{background:#fed85a !important}.contextmenu{position:fixed !important;right:auto !important;bottom:auto !important;width:auto !important;z-index:4 !important}.preloader{width:50px;height:50px;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);padding:.5rem 1rem;background-color:rgba(0,0,0,.66);color:#fff;font-size:1rem;border-radius:10px;-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;z-index:5;max-width:22.5rem}.toast b{color:inherit}hr{width:100%;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:bolder}.user-last-message b{font-weight:400}.avatar-edit{position:relative;border-radius:50%;cursor:pointer;overflow:hidden}.avatar-edit-canvas{max-width:100%;max-height:100%;width:100%;height:100%;background:linear-gradient(#72d5fd, #2a9ef1);background:linear-gradient(var(--avatar-color-top), var(--avatar-color-bottom))}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{position:absolute;font-size:48px;line-height:48px;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);z-index:2;color:#fff}.avatar-edit .avatar-placeholder{position:absolute;left:0;top:0;width:100%;height:100%;filter:brightness(0.7)}.missing-icon{width:1.5rem;height:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{max-height:23.5rem;position:absolute;width:100%;top:calc(100% + .5rem);left:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);z-index:3;border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;transition:opacity .2s ease-out,transform .2s ease-out;transform:scale(0.95);transform-origin:top center;opacity:0}.select-wrapper.active{transform:scale(1);opacity:1}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;padding:0 1rem;justify-content:space-between;height:3.5rem;cursor:pointer;text-align:left;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px}html.no-touch .select-wrapper li:hover,html.no-touch .select-wrapper li:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{height:26px;width:26px;font-size:26px;line-height:1}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{width:166px;height:166px;margin:0 auto 18px;position:relative}@media only screen and (max-width: 600px){.auth-image{width:120px;height:120px}}.phone-edit{display:inline-block;width:24px;height:24px;margin-left:.4rem;opacity:.5;transition:.2s opacity;cursor:pointer;font-size:1.5rem}@media only screen and (max-width: 600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:hover,html.no-touch .phone-edit:active{opacity:1}span.emoji{display:inline !important;vertical-align:unset !important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1 !important}@media not screen and (-webkit-min-device-pixel-ratio: 2),not screen and (min-device-pixel-ratio: 2),not screen and (min-resolution: 192dpi),not screen and (min-resolution: 2dppx){html:not(.is-safari) span.emoji{margin-right:5px !important}html:not(.is-safari) avatar-element span.emoji{margin-right:0 !important}}img.emoji{width:18px;height:18px;display:inline-block;max-width:100%;max-height:100%;vertical-align:middle}[contenteditable=true]{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;outline:none;cursor:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{content:attr(data-placeholder);color:#a2acb4;display:block;pointer-events:none}.sticky_sentinel{position:absolute;left:0;right:0;visibility:hidden;pointer-events:none}.super-stickers{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}html.no-touch .super-sticker:hover,html.no-touch .super-sticker:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;padding-right:32px;padding-left:16px;font-size:24px;color:#707579;color:var(--secondary-text-color)}.content-empty{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@-webkit-keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}@keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{width:100%;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.grid-item{height:0;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{position:absolute;left:0;top:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.animated-super-row{--translateY: 100%;position:absolute;left:0;top:0;right:0;bottom:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0, calc(var(--translateY) * -1), 0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0, var(--translateY), 0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{position:absolute;left:0;top:0;bottom:0;right:0}middle-ellipsis-element{width:100%;overflow:hidden;display:block}.album-item-media{width:100%;height:100%}html.no-touch .hover-effect:hover,html.no-touch .hover-effect:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.progress-ring{position:absolute;top:0;left:0;pointer-events:none}.progress-ring__circle{transition:stroke-dashoffset;stroke-linecap:round}.rlottie,.rlottie-vector{left:0;top:0;bottom:0;right:0;position:absolute;max-width:100%;max-height:100%;width:100%;height:100%}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.media-photo,.media-video,.media-sticker,.media-round,.media-poster{position:absolute;top:0;right:0;bottom:0;left:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-video.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-poster.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-video.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-poster.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{margin:auto;-o-object-fit:contain;object-fit:contain;width:100%;height:100%;max-width:100%;max-height:100%}.media-round{max-width:280px;max-width:var(--round-video-size);max-height:280px;max-height:var(--round-video-size);z-index:1}.media-round canvas{width:100%;height:100%;border-radius:50%;position:relative}.media-round .video-time{padding:0 .375rem;background-color:hsla(85.5319, 36.9171%, 40.402%, .4) !important;background-color:var(--message-highlightning-color) !important}.media-round .video-time:before,.media-round .video-time:after{margin-left:.25rem}.media-round.is-unread .video-time:before{order:1;width:.5rem;height:.5rem;background-color:#fff;border-radius:50%;content:\" \"}.media-round.is-paused .video-time:after{content:\"\";display:flex;align-items:center;font-size:1.125rem;order:2}.gradient-delimiter{width:100%;height:.75rem;background-color:#f4f4f5;background-color:var(--background-color-true);position:relative}.gradient-delimiter:before{content:\" \";position:absolute;left:0;top:0;right:0;bottom:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0.06) 100%)}.tgico-reply:before,.tgico-attach:before,.tgico-saved:before,.tgico-phone:before,.tgico-admin:before,.tgico-message:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-reply_filled:before,.tgico-forward_filled:before{font-size:20px !important;padding:0 2px}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{display:grid;grid-column-gap:2.44px;grid-template-columns:repeat(auto-fill, 2.625rem);justify-content:space-between;font-size:2.125rem;line-height:2.125rem}.super-emojis .super-emoji{display:inline-block;margin:0 .0625rem;padding:.25rem;line-height:inherit;border-radius:8px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem;height:2.625rem}html:not(.emoji-supported) .super-emojis .super-emoji{position:relative}.super-emojis .super-emoji .emoji-placeholder{position:absolute;left:7px;top:7px;width:1.75rem;height:1.75rem;border-radius:50%;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);pointer-events:none}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{width:100%;height:100%;vertical-align:unset;margin:0}html.no-touch .super-emojis .super-emoji:hover,html.no-touch .super-emojis .super-emoji:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:\"Roboto\" !important;font-weight:500;width:1.5rem;text-align:center}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status-icon{position:absolute;line-height:1 !important}.verified-icon{flex:0 0 auto;width:1.25rem;height:1.25rem;margin-left:.125rem}","@font-face{font-family:\"tgico\";src:url(\"assets/fonts/tgico.ttf?vbev5x\") format(\"truetype\"),url(\"assets/fonts/tgico.woff?vbev5x\") format(\"woff\"),url(\"assets/fonts/tgico.svg?vbev5x#tgico\") format(\"svg\");font-weight:normal;font-style:normal;font-display:block}[class^=tgico-],.tgico:before,.tgico:after,[class*=\" tgico-\"]:before,[class*=\" tgico-\"]:after{font-family:\"tgico\";speak:never;font-style:normal;font-weight:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tgico-avatarnext:before{content:\"\"}.tgico-avatarprevious:before{content:\"\"}.tgico-forward_filled:before{content:\"\"}.tgico-reply_filled:before{content:\"\"}.tgico-check:before{content:\"\"}.tgico-checks:before{content:\"\"}.tgico-activesessions:before{content:\"\"}.tgico-add: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-bold:before{content:\"\"}.tgico-botcom:before{content:\"\"}.tgico-bots:before{content:\"\"}.tgico-bug:before{content:\"\"}.tgico-calendar:before{content:\"\"}.tgico-calendarfilter:before{content:\"\"}.tgico-camera:before{content:\"\"}.tgico-cameraadd:before{content:\"\"}.tgico-car:before{content:\"\"}.tgico-channel:before{content:\"\"}.tgico-channelviews:before{content:\"\"}.tgico-chatspinned:before{content:\"\"}.tgico-chatsplaceholder:before{content:\"\"}.tgico-check1:before{content:\"\"}.tgico-checkbox:before{content:\"\"}.tgico-checkboxblock:before{content:\"\"}.tgico-checkboxempty:before{content:\"\"}.tgico-checkboxon:before{content:\"\"}.tgico-checkretract:before{content:\"\"}.tgico-checkround:before{content:\"\"}.tgico-close:before{content:\"\"}.tgico-clouddownload:before{content:\"\"}.tgico-colorize:before{content:\"\"}.tgico-comments:before{content:\"\"}.tgico-commentssticker:before{content:\"\"}.tgico-copy:before{content:\"\"}.tgico-darkmode:before{content:\"\"}.tgico-data:before{content:\"\"}.tgico-delete_filled:before{content:\"\"}.tgico-delete: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-enter:before{content:\"\"}.tgico-eye1:before{content:\"\"}.tgico-eye2:before{content:\"\"}.tgico-favourites:before{content:\"\"}.tgico-flag:before{content:\"\"}.tgico-folder:before{content:\"\"}.tgico-fontsize:before{content:\"\"}.tgico-forward:before{content:\"\"}.tgico-fullscreen:before{content:\"\"}.tgico-gifs:before{content:\"\"}.tgico-group:before{content:\"\"}.tgico-help:before{content:\"\"}.tgico-image:before{content:\"\"}.tgico-info:before{content:\"\"}.tgico-info2:before{content:\"\"}.tgico-italic:before{content:\"\"}.tgico-keyboard:before{content:\"\"}.tgico-lamp:before{content:\"\"}.tgico-language:before{content:\"\"}.tgico-largepause:before{content:\"\"}.tgico-largeplay:before{content:\"\"}.tgico-left:before{content:\"\"}.tgico-link:before{content:\"\"}.tgico-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-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-play:before{content:\"\"}.tgico-plus:before{content:\"\"}.tgico-poll:before{content:\"\"}.tgico-previous:before{content:\"\"}.tgico-radiooff:before{content:\"\"}.tgico-radioon:before{content:\"\"}.tgico-readchats:before{content:\"\"}.tgico-recent:before{content:\"\"}.tgico-replace:before{content:\"\"}.tgico-reply: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-smallscreen:before{content:\"\"}.tgico-smile:before{content:\"\"}.tgico-sport:before{content:\"\"}.tgico-stickers:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools:before{content:\"\"}.tgico-unarchive:before{content:\"\"}.tgico-underline:before{content:\"\"}.tgico-unmute:before{content:\"\"}.tgico-unpin:before{content:\"\"}.tgico-unread:before{content:\"\"}.tgico-up:before{content:\"\"}.tgico-user:before{content:\"\"}.tgico-username:before{content:\"\"}.tgico-zoomin:before{content:\"\"}.tgico-zoomout:before{content:\"\"}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.e3c0dc69d0f5dd450f72.bundle.worker.js b/public/mtproto.worker.e3c0dc69d0f5dd450f72.bundle.worker.js deleted file mode 100644 index e588e1d69..000000000 --- a/public/mtproto.worker.e3c0dc69d0f5dd450f72.bundle.worker.js +++ /dev/null @@ -1,4 +0,0 @@ -!function(e){var t={};function a(n){if(t[n])return t[n].exports;var s=t[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,a),s.l=!0,s.exports}a.m=e,a.c=t,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)a.d(n,s,function(t){return e[t]}.bind(null,s));return n},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="",a(a.s=1)}([function(e,t,a){ -/*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -!function(e){"use strict";var t=(e,t,a,n)=>{let s=65535&e|0,i=e>>>16&65535|0,r=0;for(;0!==a;){r=a>2e3?2e3:a,a-=r;do{s=s+t[n++]|0,i=i+s|0}while(--r);s%=65521,i%=65521}return s|i<<16|0};const a=new Uint32Array((()=>{let e,t=[];for(var a=0;a<256;a++){e=a;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[a]=e}return t})());var n=(e,t,n,s)=>{const i=a,r=s+n;e^=-1;for(let a=s;a>>8^i[255&(e^t[a])];return-1^e},s=function(e,t){let a,n,s,i,r,p,o,m,d,y,c,l,g,h,u,f,_,v,b,P,w,S,I,k;const C=e.state;a=e.next_in,I=e.input,n=a+(e.avail_in-5),s=e.next_out,k=e.output,i=s-(t-e.avail_out),r=s+(e.avail_out-257),p=C.dmax,o=C.wsize,m=C.whave,d=C.wnext,y=C.window,c=C.hold,l=C.bits,g=C.lencode,h=C.distcode,u=(1<>>24,c>>>=v,l-=v,v=_>>>16&255,0===v)k[s++]=65535&_;else{if(!(16&v)){if(0==(64&v)){_=g[(65535&_)+(c&(1<>>=v,l-=v),l<15&&(c+=I[a++]<>>24,c>>>=v,l-=v,v=_>>>16&255,!(16&v)){if(0==(64&v)){_=h[(65535&_)+(c&(1<p){e.msg="invalid distance too far back",C.mode=30;break e}if(c>>>=v,l-=v,v=s-i,P>v){if(v=P-v,v>m&&C.sane){e.msg="invalid distance too far back",C.mode=30;break e}if(w=0,S=y,0===d){if(w+=o-v,v2;)k[s++]=S[w++],k[s++]=S[w++],k[s++]=S[w++],b-=3;b&&(k[s++]=S[w++],b>1&&(k[s++]=S[w++]))}else{w=s-P;do{k[s++]=k[w++],k[s++]=k[w++],k[s++]=k[w++],b-=3}while(b>2);b&&(k[s++]=k[w++],b>1&&(k[s++]=k[w++]))}break}}break}}while(a>3,a-=b,l-=b<<3,c&=(1<{const c=y.bits;let l,g,h,u,f,_,v=0,b=0,P=0,w=0,S=0,I=0,k=0,C=0,A=0,M=0,R=null,E=0;const V=new Uint16Array(16),D=new Uint16Array(16);let U,T,B,x=null,F=0;for(v=0;v<=15;v++)V[v]=0;for(b=0;b=1&&0===V[w];w--);if(S>w&&(S=w),0===w)return s[m++]=20971520,s[m++]=20971520,y.bits=1,0;for(P=1;P0&&(0===e||1!==w))return-1;for(D[1]=0,v=1;v<15;v++)D[v+1]=D[v]+V[v];for(b=0;b852||2===e&&A>592)return 1;for(;;){U=v-k,d[b]<_?(T=0,B=d[b]):d[b]>_?(T=x[F+d[b]],B=R[E+d[b]]):(T=96,B=0),l=1<>k)+g]=U<<24|T<<16|B|0}while(0!==g);for(l=1<>=1;if(0!==l?(M&=l-1,M+=l):M=0,b++,0==--V[v]){if(v===w)break;v=t[a+d[b]]}if(v>S&&(M&u)!==h){for(0===k&&(k=S),f+=P,I=v-k,C=1<852||2===e&&A>592)return 1;h=M&u,s[h]=S<<24|I<<16|f-m|0}}return 0!==M&&(s[f+M]=v-k<<24|64<<16|0),y.bits=S,0},d={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:y,Z_BLOCK:c,Z_TREES:l,Z_OK:g,Z_STREAM_END:h,Z_NEED_DICT:u,Z_STREAM_ERROR:f,Z_DATA_ERROR:_,Z_MEM_ERROR:v,Z_BUF_ERROR:b,Z_DEFLATED:P}=d,w=12,S=30,I=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function k(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const C=e=>{if(!e||!e.state)return f;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,g},A=e=>{if(!e||!e.state)return f;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,C(e)},M=(e,t)=>{let a;if(!e||!e.state)return f;const n=e.state;return t<0?(a=0,t=-t):(a=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?f:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=a,n.wbits=t,A(e))},R=(e,t)=>{if(!e)return f;const a=new k;e.state=a,a.window=null;const n=M(e,t);return n!==g&&(e.state=null),n};let E,V,D=!0;const U=e=>{if(D){E=new Int32Array(512),V=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(m(1,e.lens,0,288,E,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;m(2,e.lens,0,32,V,0,e.work,{bits:5}),D=!1}e.lencode=E,e.lenbits=9,e.distcode=V,e.distbits=5},T=(e,t,a,n)=>{let s;const i=e.state;return null===i.window&&(i.wsize=1<=i.wsize?(i.window.set(t.subarray(a-i.wsize,a),0),i.wnext=0,i.whave=i.wsize):(s=i.wsize-i.wnext,s>n&&(s=n),i.window.set(t.subarray(a-n,a-n+s),i.wnext),(n-=s)?(i.window.set(t.subarray(a-n,a),0),i.wnext=n,i.whave=i.wsize):(i.wnext+=s,i.wnext===i.wsize&&(i.wnext=0),i.whave{let i,r,p,o,d,k,C,A,M,R,E,V,D,B,x,F,L,N,O,q,G,K,z=0;const H=new Uint8Array(4);let j,W;const J=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return f;i=e.state,i.mode===w&&(i.mode=13),d=e.next_out,p=e.output,C=e.avail_out,o=e.next_in,r=e.input,k=e.avail_in,A=i.hold,M=i.bits,R=k,E=C,K=g;e:for(;;)switch(i.mode){case 1:if(0===i.wrap){i.mode=13;break}for(;M<16;){if(0===k)break e;k--,A+=r[o++]<>>8&255,i.check=n(i.check,H,2,0),A=0,M=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&A)<<8)+(A>>8))%31){e.msg="incorrect header check",i.mode=S;break}if((15&A)!==P){e.msg="unknown compression method",i.mode=S;break}if(A>>>=4,M-=4,G=8+(15&A),0===i.wbits)i.wbits=G;else if(G>i.wbits){e.msg="invalid window size",i.mode=S;break}i.dmax=1<>8&1),512&i.flags&&(H[0]=255&A,H[1]=A>>>8&255,i.check=n(i.check,H,2,0)),A=0,M=0,i.mode=3;case 3:for(;M<32;){if(0===k)break e;k--,A+=r[o++]<>>8&255,H[2]=A>>>16&255,H[3]=A>>>24&255,i.check=n(i.check,H,4,0)),A=0,M=0,i.mode=4;case 4:for(;M<16;){if(0===k)break e;k--,A+=r[o++]<>8),512&i.flags&&(H[0]=255&A,H[1]=A>>>8&255,i.check=n(i.check,H,2,0)),A=0,M=0,i.mode=5;case 5:if(1024&i.flags){for(;M<16;){if(0===k)break e;k--,A+=r[o++]<>>8&255,i.check=n(i.check,H,2,0)),A=0,M=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(V=i.length,V>k&&(V=k),V&&(i.head&&(G=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Uint8Array(i.head.extra_len)),i.head.extra.set(r.subarray(o,o+V),G)),512&i.flags&&(i.check=n(i.check,r,V,o)),k-=V,o+=V,i.length-=V),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===k)break e;V=0;do{G=r[o+V++],i.head&&G&&i.length<65536&&(i.head.name+=String.fromCharCode(G))}while(G&&V>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=w;break;case 10:for(;M<32;){if(0===k)break e;k--,A+=r[o++]<>>=7&M,M-=7&M,i.mode=27;break}for(;M<3;){if(0===k)break e;k--,A+=r[o++]<>>=1,M-=1,3&A){case 0:i.mode=14;break;case 1:if(U(i),i.mode=20,a===l){A>>>=2,M-=2;break e}break;case 2:i.mode=17;break;case 3:e.msg="invalid block type",i.mode=S}A>>>=2,M-=2;break;case 14:for(A>>>=7&M,M-=7&M;M<32;){if(0===k)break e;k--,A+=r[o++]<>>16^65535)){e.msg="invalid stored block lengths",i.mode=S;break}if(i.length=65535&A,A=0,M=0,i.mode=15,a===l)break e;case 15:i.mode=16;case 16:if(V=i.length,V){if(V>k&&(V=k),V>C&&(V=C),0===V)break e;p.set(r.subarray(o,o+V),d),k-=V,o+=V,C-=V,d+=V,i.length-=V;break}i.mode=w;break;case 17:for(;M<14;){if(0===k)break e;k--,A+=r[o++]<>>=5,M-=5,i.ndist=1+(31&A),A>>>=5,M-=5,i.ncode=4+(15&A),A>>>=4,M-=4,i.nlen>286||i.ndist>30){e.msg="too many length or distance symbols",i.mode=S;break}i.have=0,i.mode=18;case 18:for(;i.have>>=3,M-=3}for(;i.have<19;)i.lens[J[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,j={bits:i.lenbits},K=m(0,i.lens,0,19,i.lencode,0,i.work,j),i.lenbits=j.bits,K){e.msg="invalid code lengths set",i.mode=S;break}i.have=0,i.mode=19;case 19:for(;i.have>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===k)break e;k--,A+=r[o++]<>>=x,M-=x,i.lens[i.have++]=L;else{if(16===L){for(W=x+2;M>>=x,M-=x,0===i.have){e.msg="invalid bit length repeat",i.mode=S;break}G=i.lens[i.have-1],V=3+(3&A),A>>>=2,M-=2}else if(17===L){for(W=x+3;M>>=x,M-=x,G=0,V=3+(7&A),A>>>=3,M-=3}else{for(W=x+7;M>>=x,M-=x,G=0,V=11+(127&A),A>>>=7,M-=7}if(i.have+V>i.nlen+i.ndist){e.msg="invalid bit length repeat",i.mode=S;break}for(;V--;)i.lens[i.have++]=G}}if(i.mode===S)break;if(0===i.lens[256]){e.msg="invalid code -- missing end-of-block",i.mode=S;break}if(i.lenbits=9,j={bits:i.lenbits},K=m(1,i.lens,0,i.nlen,i.lencode,0,i.work,j),i.lenbits=j.bits,K){e.msg="invalid literal/lengths set",i.mode=S;break}if(i.distbits=6,i.distcode=i.distdyn,j={bits:i.distbits},K=m(2,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,j),i.distbits=j.bits,K){e.msg="invalid distances set",i.mode=S;break}if(i.mode=20,a===l)break e;case 20:i.mode=21;case 21:if(k>=6&&C>=258){e.next_out=d,e.avail_out=C,e.next_in=o,e.avail_in=k,i.hold=A,i.bits=M,s(e,E),d=e.next_out,p=e.output,C=e.avail_out,o=e.next_in,r=e.input,k=e.avail_in,A=i.hold,M=i.bits,i.mode===w&&(i.back=-1);break}for(i.back=0;z=i.lencode[A&(1<>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===k)break e;k--,A+=r[o++]<>N)],x=z>>>24,F=z>>>16&255,L=65535&z,!(N+x<=M);){if(0===k)break e;k--,A+=r[o++]<>>=N,M-=N,i.back+=N}if(A>>>=x,M-=x,i.back+=x,i.length=L,0===F){i.mode=26;break}if(32&F){i.back=-1,i.mode=w;break}if(64&F){e.msg="invalid literal/length code",i.mode=S;break}i.extra=15&F,i.mode=22;case 22:if(i.extra){for(W=i.extra;M>>=i.extra,M-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;z=i.distcode[A&(1<>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===k)break e;k--,A+=r[o++]<>N)],x=z>>>24,F=z>>>16&255,L=65535&z,!(N+x<=M);){if(0===k)break e;k--,A+=r[o++]<>>=N,M-=N,i.back+=N}if(A>>>=x,M-=x,i.back+=x,64&F){e.msg="invalid distance code",i.mode=S;break}i.offset=L,i.extra=15&F,i.mode=24;case 24:if(i.extra){for(W=i.extra;M>>=i.extra,M-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg="invalid distance too far back",i.mode=S;break}i.mode=25;case 25:if(0===C)break e;if(V=E-C,i.offset>V){if(V=i.offset-V,V>i.whave&&i.sane){e.msg="invalid distance too far back",i.mode=S;break}V>i.wnext?(V-=i.wnext,D=i.wsize-V):D=i.wnext-V,V>i.length&&(V=i.length),B=i.window}else B=p,D=d-i.offset,V=i.length;V>C&&(V=C),C-=V,i.length-=V;do{p[d++]=B[D++]}while(--V);0===i.length&&(i.mode=21);break;case 26:if(0===C)break e;p[d++]=i.length,C--,i.mode=21;break;case 27:if(i.wrap){for(;M<32;){if(0===k)break e;k--,A|=r[o++]<{if(!e||!e.state)return f;let t=e.state;return t.window&&(t.window=null),e.state=null,g},N=(e,t)=>{if(!e||!e.state)return f;const a=e.state;return 0==(2&a.wrap)?f:(a.head=t,t.done=!1,g)},O=(e,a)=>{const n=a.length;let s,i,r;return e&&e.state?(s=e.state,0!==s.wrap&&11!==s.mode?f:11===s.mode&&(i=1,i=t(i,a,n,0),i!==s.check)?_:(r=T(e,a,n,n),r?(s.mode=31,v):(s.havedict=1,g))):f};const q=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);let G=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){G=!1}const K=new Uint8Array(256);for(let e=0;e<256;e++)K[e]=e>=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;K[254]=K[254]=1;var z=(e,t)=>{let a,n;const s=t||e.length,i=new Array(2*s);for(n=0,a=0;a4)i[n++]=65533,a+=r-1;else{for(t&=2===r?31:3===r?15:7;r>1&&a1?i[n++]=65533:t<65536?i[n++]=t:(t-=65536,i[n++]=55296|t>>10&1023,i[n++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&G)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let a="";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let a=t-1;for(;a>=0&&128==(192&e[a]);)a--;return a<0||0===a?t:a+K[e[a]]>t?a:t},j={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},W=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},J=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Z=Object.prototype.toString,{Z_NO_FLUSH:Q,Z_FINISH:X,Z_OK:Y,Z_STREAM_END:$,Z_NEED_DICT:ee,Z_STREAM_ERROR:te,Z_DATA_ERROR:ae,Z_MEM_ERROR:ne}=d;function se(e){this.options=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const a=t.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const t in a)q(a,t)&&(e[t]=a[t])}}return e}({chunkSize:65536,windowBits:15,to:""},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new W,this.strm.avail_out=0;let a=x(this.strm,t.windowBits);if(a!==Y)throw new Error(j[a]);if(this.header=new J,N(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=(e=>{let t,a,n,s,i,r=e.length,p=0;for(s=0;s>>6,t[i++]=128|63&a):a<65536?(t[i++]=224|a>>>12,t[i++]=128|a>>>6&63,t[i++]=128|63&a):(t[i++]=240|a>>>18,t[i++]=128|a>>>12&63,t[i++]=128|a>>>6&63,t[i++]=128|63&a);return t})(t.dictionary):"[object ArrayBuffer]"===Z.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(a=O(this.strm,t.dictionary),a!==Y)))throw new Error(j[a])}function ie(e,t){const a=new se(t);if(a.push(e),a.err)throw a.msg||j[a.err];return a.result}se.prototype.push=function(e,t){const a=this.strm,n=this.options.chunkSize,s=this.options.dictionary;let i,r,p;if(this.ended)return!1;for(r=t===~~t?t:!0===t?X:Q,"[object ArrayBuffer]"===Z.call(e)?a.input=new Uint8Array(e):a.input=e,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),i=F(a,r),i===ee&&s&&(i=O(a,s),i===Y?i=F(a,r):i===ae&&(i=ee));a.avail_in>0&&i===$&&a.state.wrap>0&&0!==e[a.next_in];)B(a),i=F(a,r);switch(i){case te:case ae:case ee:case ne:return this.onEnd(i),this.ended=!0,!1}if(p=a.avail_out,a.next_out&&(0===a.avail_out||i===$))if("string"===this.options.to){let e=H(a.output,a.next_out),t=a.next_out-e,s=z(a.output,e);a.next_out=t,a.avail_out=n-t,t&&a.output.set(a.output.subarray(e,e+t),0),this.onData(s)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(i!==Y||0!==p){if(i===$)return i=L(this.strm),this.onEnd(i),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},se.prototype.onData=function(e){this.chunks.push(e)},se.prototype.onEnd=function(e){e===Y&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=(e=>{let t=0;for(let a=0,n=e.length;ae+(t.byteLength||t.length),0),a=new Uint8Array(t);let n=0;return e.forEach(e=>{a.set(e instanceof ArrayBuffer?new Uint8Array(e):e,n),n+=e.byteLength||e.length}),a}function m(e){const t=new Uint8Array(e.byteLength);for(let a=0,n=4*e.length;a>>2]>>>24-a%4*8&255;return t}function d(e){const t=p(e),a=[];for(let e=0,n=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(a)}a.r(t),a.d(t,"isWebpSupported",(function(){return Ia})),Object.defineProperty(Uint8Array.prototype,"hex",{get:function(){return n(this)},set:function(e){this.set(s(e))},enumerable:!0,configurable:!0}),Uint8Array.prototype.randomize=function(){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(this),this},Uint8Array.prototype.concat=function(...e){return o(this,...e)},Uint8Array.prototype.toJSON=function(){return[...this]},Array.prototype.findAndSplice=function(e){let t=this.findIndex(e);return-1!==t?this.splice(t,1)[0]:void 0},String.prototype.toHHMMSS=function(e=!1){const t=parseInt(this+"",10),a=Math.floor(t/3600);let n=Math.floor((t-3600*a)/60),s=t-3600*a-60*n;return a&&(e=!0),n<10&&(n=e?"0"+n:n),s<10&&(s="0"+s),(a?a+":":"")+n+":"+s},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)))},Promise.prototype.safeFinally=function(e){return this.catch(()=>{}).finally(e)};var y={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1};const c=y.debug,l="undefined"!=typeof window?window:self;var g=c;const h="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,u="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,f=h||u,_=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(a=>{a.length&&a.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},v=(...e)=>{self.postMessage(...e)},b=()=>{},P=u?_.bind(null,!1):h?v:b,w=u?_.bind(null,!0):h?v:b;class S{constructor(){this.prefix="",this.cache={},this.useStorage=!0,y.test&&(this.prefix="t_")}get(e,t=!0){if(this.cache.hasOwnProperty(e)&&t)return this.cache[e];if(this.useStorage){let t;try{t=localStorage.getItem(this.prefix+e)}catch(e){this.useStorage=!1}if(null!==t)try{t=JSON.parse(t)}catch(e){}else t=void 0;return t}}set(e,t=!1){for(const a in e)if(e.hasOwnProperty(a)){const n=e[a];if(this.cache[a]=n,this.useStorage&&!t)try{const e=JSON.stringify(n);localStorage.setItem(this.prefix+a,e)}catch(e){this.useStorage=!1}}}delete(e,t=!1){e=""+e,t||delete this.cache[e];try{localStorage.removeItem(this.prefix+e)}catch(e){}}clear(){const e=["dc","server_time_offset","xt_instance","user_auth","state_id"];for(let t=1;t<=5;++t)e.push(`dc${t}_server_salt`),e.push(`dc${t}_auth_key`);for(let t of e)this.delete(t,!0)}toggleStorage(e){if(this.useStorage=e,e)return this.set(this.cache);this.clear()}}class I{constructor(){this.taskId=0,this.tasks={},I.STORAGES.push(this),f||(this.storage=new S)}finishTask(e,t){this.tasks.hasOwnProperty(e)&&(this.tasks[e](t),delete this.tasks[e])}proxy(e,...t){return new Promise((a,n)=>{if(f){const n=this.taskId++;this.tasks[n]=a;P({type:"localStorageProxy",id:n,payload:{type:e,args:t}})}else{t=Array.prototype.slice.call(t);a(this.storage[e].apply(this.storage,t))}})}get(e,t){return this.proxy("get",e,t)}set(e,t){return this.proxy("set",e,t)}delete(e,t){return this.proxy("delete",e,t)}clear(){return this.proxy("clear")}toggleStorage(e){return this.proxy("toggleStorage",e)}}I.STORAGES=[];const k=new I;l.appStorage=k;var C,A=k,M=0,R=0,E="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\'\"+-";for(M=0;1<1<>=1))-1)+1;var V,D,U=pe(1,1,1),T=(pe(0,1,1),new Array(0)),B=T,x=T,F=T,L=T,N=T,O=T,q=T,G=T,K=T,z=T,H=T,j=T,W=T;function J(e){var t,a,n;for(t=e.length-1;0==e[t]&&t>0;t--);for(a=0,n=e[t];n;n>>=1,a++);return a+=M*t}function Z(e,t){var a=pe(0,(e.length>t?e.length:t)*M,0);return ue(a,e),a}function Q(e,t){var a=he(e);return Re(a,t),De(a,1)}function X(e,t){var a=Z(e,e.length+t.length);return function(e,t){var a;B.length!=2*e.length&&(B=new Array(2*e.length));for(fe(B,0),a=0;at.length?e.length+1:t.length+1);return Ae(a,t),De(a,1)}function ee(e,t){var a=Z(e,e.length>t.length?e.length+1:t.length+1);return Me(a,t),De(a,1)}function te(e,t,a,n,s){var i=0,r=Math.max(e.length,t.length);for(K.length!=r&&(K=new Array(r),z=new Array(r),H=new Array(r),j=new Array(r),W=new Array(r));!(1&e[0]||1&t[0]);)be(e),be(t),i++;for(ue(K,e),ue(a,t),fe(z,1),fe(H,0),fe(j,0),fe(W,1);;){for(;!(1&K[0]);)be(K),1&z[0]||1&H[0]?(Me(z,t),be(z),Ae(H,e),be(H)):(be(z),be(H));for(;!(1&a[0]);)be(a),1&j[0]||1&W[0]?(Me(j,t),be(j),Ae(W,e),be(W)):(be(j),be(W));if(se(a,K)?(Ae(a,K),Ae(j,z),Ae(W,H)):(Ae(K,a),Ae(z,j),Ae(H,W)),me(K,0)){for(;ae(j);)Me(j,t),Ae(W,e);return we(W,-1),ue(n,j),ue(s,W),void Pe(a,i)}}}function ae(e){return e[e.length-1]>>M-1&1}function ne(e,t,a){var n,s=e.length,i=t.length;for(V=s+a=0;n++)if(e[n]>0)return 1;for(n=s-1+a;n0)return 0;for(n=V-1;n>=a;n--){if(e[n-a]>t[n])return 1;if(e[n-a]=0;a--){if(e[a]>t[a])return 1;if(e[a]>=1;for(Pe(t,d=M-d),Pe(n,d),s=n.length;0===n[s-1]&&s>i;s--);for(fe(a,0);!ne(t,n,s-i);)Ce(n,t,s-i),a[s-i]++;for(r=s-1;r>=i;r--){for(n[r]==t[i-1]?a[r-i]=R:a[r-i]=Math.floor((n[r]*C+n[r-1])/t[i-1]);m=(o=(i>1?t[i-2]:0)*a[r-i])>>M,o&=R,m=(p=m+a[r-i]*t[i-1])>>M,p&=R,m==n[r]?p==n[r-1]?o>(r>1?n[r-2]:0):p>n[r-1]:m>n[r];)a[r-i]--;Ie(n,t,-a[r-i],r-i),ae(n)&&(ke(n,t,r-i),a[r-i]--)}ve(t,d),ve(n,d)}function re(e,t){var a,n=0;for(a=e.length-1;a>=0;a--)n=(n*C+e[a])%t;return n}function pe(e,t,a){var n;n=a>(n=Math.ceil(t/M)+1)?a:n;var s=new Array(n);return fe(s,e),s}function oe(e,t,a){var n,s,i,r,p,o=e.length;if(-1===t){for(i=new Array(0);;){for(r=new Array(i.length+1),s=0;s=36&&(n-=26),!(n>=t||n<0));s++)we(i,t),_e(i,n);for(o=i.length;o>0&&!i[o-1];o--);for(o=a>o+1?a:o+1,r=new Array(o),p=ot.length){for(;a0;a--)s+=e[a]+",";s+=e[0]}else for(;!ye(O);)n=Se(O,t),s=E.substring(n,n+1)+s;return 0===s.length&&(s="0"),s}function le(e,t=!0){O.length!==e.length?O=he(e):ue(O,e);const a=[];for(;!ye(O);)T=Se(O,256),a.push(T);return t&&a.reverse(),a}function ge(e,t){return se(e,t)?1:de(e,t)?0:-1}function he(e){return ue(D=Array(e.length),e),D}function ue(e,t){var a,n=e.length>=M}function _e(e,t){var a,n,s,i;for(e[0]+=t,n=e.length,s=0,a=0;a>M))*C),e[a]=s&R,!(s=(s>>M)-i))return}function ve(e,t){var a,n=Math.floor(t/M);if(n){for(a=0;a>t);e[a]>>=t}function be(e){var t;for(t=0;t>1);e[t]=e[t]>>1|e[t]&C>>1}function Pe(e,t){var a,n=Math.floor(t/M);if(n){for(a=e.length;a>=n;a--)e[a]=e[a-n];for(;a>=0;a--)e[a]=0;t%=M}if(t){for(a=e.length-1;a>0;a--)e[a]=R&(e[a]<>M-t);e[a]=R&e[a]<>M))*C),e[a]=s&R,s=(s>>M)-i}function Se(e,t){var a,n,s=0;for(a=e.length-1;a>=0;a--)n=s*C+e[a],e[a]=Math.floor(n/t),s=n%t;return s}function Ie(e,t,a,n){var s,i,r,p;for(r=e.length>=M;for(s=r;i&&s>=M}function ke(e,t,a){var n,s,i,r;for(i=e.length>=M;for(n=i;s&&n>=M}function Ce(e,t,a){var n,s,i,r;for(i=e.length>=M;for(n=i;s&&n>=M}function Ae(e,t){var a,n,s;for(s=e.length>=M;for(a=s;n&&a>=M}function Me(e,t){var a,n,s;for(s=e.length>=M;for(a=s;n&&a>=M}function Re(e,t){L.length!==e.length?L=he(e):ue(L,e),N.length!==e.length&&(N=he(e)),ie(L,t,N,e)}function Ee(e,t,a){var n;for(x.length!=2*e.length&&(x=new Array(2*e.length)),fe(x,0),n=0;n0&&!e[i-1];i--);for(r=i>t.length?2*i:2*t.length,x.length!=r&&(x=new Array(r)),fe(x,0),a=0;a>=M,n=a+1;n>=M;x[a+i]=s}Re(x,t),ue(e,x)}function De(e,t){var a,n;for(a=e.length;a>0&&!e[a-1];a--);return ue(n=new Array(a+t),e),n}function Ue(e,t,a){var n,s,i,r;if(q.length!=a.length&&(q=he(a)),0!=(1&a[0])){for(fe(q,0),i=a.length;i>0&&!a[i-1];i--);for(r=C-function(e,t){for(var a=1,n=0;;){if(1===e)return a;if(0===e)return 0;if(n-=a*Math.floor(t/e),1===(t%=e))return n;if(0===t)return 0;a-=n*Math.floor(e/t),e%=t}}(re(a,C),C),q[i]=1,Ee(e,q,a),F.length!=e.length?F=he(e):ue(F,e),n=t.length-1;n>0&!t[n];n--);if(0!=t[n]){for(s=1<>=1);for(;;){if(!(s>>=1)){if(--n<0)return void Te(e,U,a,r);s=1<0&&0==a[d-1];d--);for(;y>0&&0==t[y-1];y--);for(m=G.length-1,s=0;s>M,o=e[s],i=1;i>=M,i++,r+=G[i]+p*a[i]+o*t[i],G[i-1]=r&R,r>>=M,i++,r+=G[i]+p*a[i]+o*t[i],G[i-1]=r&R,r>>=M,i++,r+=G[i]+p*a[i]+o*t[i],G[i-1]=r&R,r>>=M,i++,r+=G[i]+p*a[i]+o*t[i],G[i-1]=r&R,r>>=M,i++;for(;i>=M,i++;for(;i>=M,i++,r+=G[i]+p*a[i],G[i-1]=r&R,r>>=M,i++,r+=G[i]+p*a[i],G[i-1]=r&R,r>>=M,i++,r+=G[i]+p*a[i],G[i-1]=r&R,r>>=M,i++,r+=G[i]+p*a[i],G[i-1]=r&R,r>>=M,i++;for(;i>=M,i++;for(;i>=M,i++;G[i-1]=r&R}se(a,G)||Ae(G,a),ue(e,G)}function Be(e){return"object"==typeof e&&null!==e}function xe(e){return e>>>0}function Fe(e,t){e=xe(e),t=xe(t);const a=oe(e.toString(16),16,32);Pe(a,32),Me(a,oe(t.toString(16),16,32));return ce(a,10)}function Le(e,t=16,a,n=!1,s=!1){const i=e.byteLength||e.length,r=n?t-i:t-i%t;if(r>0&&r"}],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:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{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:-1182234929,predicate:"inputUserEmpty",params:[],type:"InputUser"},{id:-138301121,predicate:"inputUserSelf",params:[],type:"InputUser"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],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:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",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: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:-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:-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:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{id:-646342540,predicate:"inputMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"start_param",type:"flags.1?string"}],type:"InputMedia"},{id:-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: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:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",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:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{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:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{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: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:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_id",type:"long"}],type:"Peer"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_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:1073147056,predicate:"user",params:[{name:"flags",type:"#"},{name:"self",type:"flags.10?true"},{name:"contact",type:"flags.11?true"},{name:"mutual_contact",type:"flags.12?true"},{name:"deleted",type:"flags.13?true"},{name:"bot",type:"flags.14?true"},{name:"bot_chat_history",type:"flags.15?true"},{name:"bot_nochats",type:"flags.16?true"},{name:"verified",type:"flags.17?true"},{name:"restricted",type:"flags.18?true"},{name:"min",type:"flags.20?true"},{name:"bot_inline_geo",type:"flags.21?true"},{name:"support",type:"flags.23?true"},{name:"scam",type:"flags.24?true"},{name:"apply_min_photo",type:"flags.25?true"},{name:"fake",type:"flags.26?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.0?long"},{name:"first_name",type:"flags.1?string"},{name:"last_name",type:"flags.2?string"},{name:"username",type:"flags.3?string"},{name:"phone",type:"flags.4?string"},{name:"photo",type:"flags.5?UserProfilePhoto"},{name:"status",type:"flags.6?UserStatus"},{name:"bot_info_version",type:"flags.14?int"},{name:"restriction_reason",type:"flags.18?Vector"},{name:"bot_inline_placeholder",type:"flags.19?string"},{name:"lang_code",type:"flags.22?string"}],type:"User"},{id: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:-496024847,predicate:"userStatusRecently",params:[],type:"UserStatus"},{id:129960444,predicate:"userStatusLastWeek",params:[],type:"UserStatus"},{id:2011940674,predicate:"userStatusLastMonth",params:[],type:"UserStatus"},{id:693512293,predicate:"chatEmpty",params:[{name:"id",type:"long"}],type:"Chat"},{id:1103884886,predicate:"chat",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"kicked",type:"flags.1?true"},{name:"left",type:"flags.2?true"},{name:"deactivated",type:"flags.5?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"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:-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:"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:1304281241,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"}],type:"ChatFull"},{id:-374179305,predicate:"channelFull",params:[{name:"flags",type:"#"},{name:"can_view_participants",type:"flags.3?true"},{name:"can_set_username",type:"flags.6?true"},{name:"can_set_stickers",type:"flags.7?true"},{name:"hidden_prehistory",type:"flags.10?true"},{name:"can_set_location",type:"flags.16?true"},{name:"has_scheduled",type:"flags.19?true"},{name:"can_view_stats",type:"flags.20?true"},{name:"blocked",type:"flags.22?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants_count",type:"flags.0?int"},{name:"admins_count",type:"flags.1?int"},{name:"kicked_count",type:"flags.2?int"},{name:"banned_count",type:"flags.2?int"},{name:"online_count",type:"flags.13?int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"chat_photo",type:"Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.23?ExportedChatInvite"},{name:"bot_info",type:"Vector"},{name:"migrated_from_chat_id",type:"flags.4?long"},{name:"migrated_from_max_id",type:"flags.4?int"},{name:"pinned_msg_id",type:"flags.5?int"},{name:"stickerset",type:"flags.8?StickerSet"},{name:"available_min_id",type:"flags.9?int"},{name:"folder_id",type:"flags.11?int"},{name:"linked_chat_id",type:"flags.14?long"},{name:"location",type:"flags.15?ChannelLocation"},{name:"slowmode_seconds",type:"flags.17?int"},{name:"slowmode_next_send_date",type:"flags.18?int"},{name:"stats_dc",type:"flags.12?int"},{name:"pts",type:"int"},{name:"call",type:"flags.21?InputGroupCall"},{name:"ttl_period",type:"flags.24?int"},{name:"pending_suggestions",type:"flags.25?Vector"},{name:"groupcall_default_join_as",type:"flags.26?Peer"},{name:"theme_emoticon",type:"flags.27?string"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{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:-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:-2049520670,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:"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:"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:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{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:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-2074799289,predicate:"messageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"receipt_msg_id",type:"flags.2?int"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"start_param",type:"string"}],type:"MessageMedia"},{id:-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:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],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:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{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:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{id:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"charge",type:"PaymentCharge"}],type:"MessageAction"},{id:1080663248,predicate:"messageActionPaymentSent",params:[{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"MessageAction"},{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:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{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:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{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:-1441072131,predicate:"messageActionSetMessagesTTL",params:[{name:"period",type:"int"}],type:"MessageAction"},{id:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:739712882,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:"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: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: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:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{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:-855308010,predicate:"auth.authorization",params:[{name:"flags",type:"#"},{name:"tmp_sessions",type:"flags.0?int"},{name:"user",type:"User"}],type:"auth.Authorization"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],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:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-1673717362,predicate:"inputPeerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"InputPeerNotifySettings"},{id:-1353671392,predicate:"peerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"PeerNotifySettings"},{id:1933519201,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:"geo_distance",type:"flags.6?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:-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: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:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{id:-694681851,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:"user",type:"User"},{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"}],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:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],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: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:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{id:1694474197,predicate:"messages.chats",params:[{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{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:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{id:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:464520273,predicate:"inputMessagesFilterPinned",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: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: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:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{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:-298113238,predicate:"updatePrivacy",params:[{name:"key",type:"PrivacyKey"},{name:"rules",type:"Vector"}],type:"Update"},{id:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{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:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{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:-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:1753886890,predicate:"updateNewStickerSet",params:[{name:"stickerset",type:"messages.StickerSet"}],type:"Update"},{id:196268545,predicate:"updateStickerSetsOrder",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Update"},{id:1135492588,predicate:"updateStickerSets",params:[],type:"Update"},{id:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{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:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{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:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{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:-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:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{id:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{id:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{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: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:-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:-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:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{id:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{id:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:1153291573,predicate:"updateChannelReadMessagesContents",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"}],type:"Update"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{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:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{id:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{id:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{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:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{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: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:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{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:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{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:-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:-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:-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:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{id:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",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:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],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:-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:-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:-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:414687501,predicate:"dcOption",params:[{name:"flags",type:"#"},{name:"ipv6",type:"flags.0?true"},{name:"media_only",type:"flags.1?true"},{name:"tcpo_only",type:"flags.2?true"},{name:"cdn",type:"flags.3?true"},{name:"static",type:"flags.4?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:856375399,predicate:"config",params:[{name:"flags",type:"#"},{name:"phonecalls_enabled",type:"flags.1?true"},{name:"default_p2p_contacts",type:"flags.3?true"},{name:"preload_featured_stickers",type:"flags.4?true"},{name:"ignore_phone_entities",type:"flags.5?true"},{name:"revoke_pm_inbox",type:"flags.6?true"},{name:"blocked_mode",type:"flags.8?true"},{name:"pfs_enabled",type:"flags.13?true"},{name:"date",type:"int"},{name:"expires",type:"int"},{name:"test_mode",type:"Bool"},{name:"this_dc",type:"int"},{name:"dc_options",type:"Vector"},{name:"dc_txt_domain_name",type:"string"},{name:"chat_size_max",type:"int"},{name:"megagroup_size_max",type:"int"},{name:"forwarded_count_max",type:"int"},{name:"online_update_period_ms",type:"int"},{name:"offline_blur_timeout_ms",type:"int"},{name:"offline_idle_timeout_ms",type:"int"},{name:"online_cloud_timeout_ms",type:"int"},{name:"notify_cloud_delay_ms",type:"int"},{name:"notify_default_delay_ms",type:"int"},{name:"push_chat_period_ms",type:"int"},{name:"push_chat_limit",type:"int"},{name:"saved_gifs_limit",type:"int"},{name:"edit_time_limit",type:"int"},{name:"revoke_time_limit",type:"int"},{name:"revoke_pm_time_limit",type:"int"},{name:"rating_e_decay",type:"int"},{name:"stickers_recent_limit",type:"int"},{name:"stickers_faved_limit",type:"int"},{name:"channels_read_media_period",type:"int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"pinned_dialogs_count_max",type:"int"},{name:"pinned_infolder_count_max",type:"int"},{name:"call_receive_timeout_ms",type:"int"},{name:"call_ring_timeout_ms",type:"int"},{name:"call_connect_timeout_ms",type:"int"},{name:"call_packet_timeout_ms",type:"int"},{name:"me_url_prefix",type:"string"},{name:"autoupdate_url_prefix",type:"flags.7?string"},{name:"gif_search_username",type:"flags.9?string"},{name:"venue_search_username",type:"flags.10?string"},{name:"img_search_username",type:"flags.11?string"},{name:"static_maps_provider",type:"flags.12?string"},{name:"caption_length_max",type:"int"},{name:"message_length_max",type:"int"},{name:"webfile_dc_id",type:"int"},{name:"suggested_lang_code",type:"flags.2?string"},{name:"lang_pack_version",type:"flags.2?int"},{name:"base_lang_pack_version",type:"flags.2?int"}],type:"Config"},{id:-1910892683,predicate:"nearestDc",params:[{name:"country",type:"string"},{name:"this_dc",type:"int"},{name:"nearest_dc",type:"int"}],type:"NearestDc"},{id:-860107216,predicate:"help.appUpdate",params:[{name:"flags",type:"#"},{name:"can_not_skip",type:"flags.0?true"},{name:"id",type:"int"},{name:"version",type:"string"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"document",type:"flags.1?Document"},{name:"url",type:"flags.2?string"},{name:"sticker",type:"flags.3?Document"}],type:"help.AppUpdate"},{id:-1000708810,predicate:"help.noAppUpdate",params:[],type:"help.AppUpdate"},{id:415997816,predicate:"help.inviteText",params:[{name:"message",type:"string"}],type:"help.InviteText"},{id:-1417756512,predicate:"encryptedChatEmpty",params:[{name:"id",type:"int"}],type:"EncryptedChat"},{id:1722964307,predicate:"encryptedChatWaiting",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"}],type:"EncryptedChat"},{id:1223809356,predicate:"encryptedChatRequested",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1643173063,predicate:"encryptedChat",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:505183301,predicate:"encryptedChatDiscarded",params:[{name:"flags",type:"#"},{name:"history_deleted",type:"flags.0?true"},{name:"id",type:"int"}],type:"EncryptedChat"},{id:-247351839,predicate:"inputEncryptedChat",params:[{name:"chat_id",type:"int"},{name:"access_hash",type:"long"}],type:"InputEncryptedChat"},{id:-1038136962,predicate:"encryptedFileEmpty",params:[],type:"EncryptedFile"},{id:1248893260,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"key_fingerprint",type:"int"}],type:"EncryptedFile"},{id:406307684,predicate:"inputEncryptedFileEmpty",params:[],type:"InputEncryptedFile"},{id:1690108678,predicate:"inputEncryptedFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1511503333,predicate:"inputEncryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputEncryptedFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{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: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:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:512177195,predicate:"document",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"mime_type",type:"string"},{name:"size",type:"int"},{name:"thumbs",type:"flags.0?Vector"},{name:"video_thumbs",type:"flags.1?Vector"},{name:"dc_id",type:"int"},{name:"attributes",type:"Vector"}],type:"Document"},{id:398898678,predicate:"help.support",params:[{name:"phone_number",type:"string"},{name:"user",type:"User"}],type:"help.Support"},{id:-1613493288,predicate:"notifyPeer",params:[{name:"peer",type:"Peer"}],type:"NotifyPeer"},{id:-1261946036,predicate:"notifyUsers",params:[],type:"NotifyPeer"},{id:-1073230141,predicate:"notifyChats",params:[],type:"NotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{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:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:1781674934,predicate:"sendMessageEmojiInteraction",params:[{name:"emoticon",type:"string"},{name:"interaction",type:"DataJSON"}],type:"SendMessageAction"},{id:-1234857938,predicate:"sendMessageEmojiInteractionSeen",params:[{name:"emoticon",type:"string"}],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:1335282456,predicate:"inputPrivacyKeyStatusTimestamp",params:[],type:"InputPrivacyKey"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:-1137792208,predicate:"privacyKeyStatusTimestamp",params:[],type:"PrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",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:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",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:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",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: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:-1744710921,predicate:"documentAttributeHasStickers",params:[],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:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{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:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{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:"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:307276766,predicate:"account.authorizations",params:[{name:"authorizations",type:"Vector"}],type:"account.Authorizations"},{id:408623183,predicate:"account.password",params:[{name:"flags",type:"#"},{name:"has_recovery",type:"flags.0?true"},{name:"has_secure_values",type:"flags.1?true"},{name:"has_password",type:"flags.2?true"},{name:"current_algo",type:"flags.2?PasswordKdfAlgo"},{name:"srp_B",type:"flags.2?bytes"},{name:"srp_id",type:"flags.2?long"},{name:"hint",type:"flags.3?string"},{name:"email_unconfirmed_pattern",type:"flags.4?string"},{name:"new_algo",type:"PasswordKdfAlgo"},{name:"new_secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_random",type:"bytes"},{name:"pending_reset_date",type:"flags.5?int"}],type:"account.Password"},{id:-1705233435,predicate:"account.passwordSettings",params:[{name:"flags",type:"#"},{name:"email",type:"flags.0?string"},{name:"secure_settings",type:"flags.1?SecureSecretSettings"}],type:"account.PasswordSettings"},{id:-1036572727,predicate:"account.passwordInputSettings",params:[{name:"flags",type:"#"},{name:"new_algo",type:"flags.0?PasswordKdfAlgo"},{name:"new_password_hash",type:"flags.0?bytes"},{name:"hint",type:"flags.0?string"},{name:"email",type:"flags.1?string"},{name:"new_secure_settings",type:"flags.2?SecureSecretSettings"}],type:"account.PasswordInputSettings"},{id:326715557,predicate:"auth.passwordRecovery",params:[{name:"email_pattern",type:"string"}],type:"auth.PasswordRecovery"},{id:-1551583367,predicate:"receivedNotifyMessage",params:[{name:"id",type:"int"},{name:"flags",type:"int"}],type:"ReceivedNotifyMessage"},{id:-1316944408,predicate:"chatInviteExported",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.0?true"},{name:"permanent",type:"flags.5?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"}],type:"ExportedChatInvite"},{id:1516793212,predicate:"chatInviteAlready",params:[{name:"chat",type:"Chat"}],type:"ChatInvite"},{id:-540871282,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:"title",type:"string"},{name:"photo",type:"Photo"},{name:"participants_count",type:"int"},{name:"participants",type:"flags.4?Vector"}],type:"ChatInvite"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{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:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{id:-673242758,predicate:"stickerSet",params:[{name:"flags",type:"#"},{name:"archived",type:"flags.1?true"},{name:"official",type:"flags.2?true"},{name:"masks",type:"flags.3?true"},{name:"animated",type:"flags.5?true"},{name:"installed_date",type:"flags.0?int"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumbs",type:"flags.4?Vector"},{name:"thumb_dc_id",type:"flags.4?int"},{name:"thumb_version",type:"flags.4?int"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:-1240849242,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:460632885,predicate:"botInfo",params:[{name:"user_id",type:"long"},{name:"description",type:"string"},{name:"commands",type:"Vector"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id: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:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{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:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{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:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{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:-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:-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:-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:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{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:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{id:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{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:682146919,predicate:"channelParticipantSelf",params:[{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: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:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],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:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{id:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{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:-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:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],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: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:-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: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:-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:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{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:-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:-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:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{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: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: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: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: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:-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: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: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: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:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{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: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:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",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:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{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:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-2067782896,predicate:"messages.featuredStickers",params:[{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id: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: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: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: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: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: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:-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:-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:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],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:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{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:-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: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:-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:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{id:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:215516896,predicate:"invoice",params:[{name:"flags",type:"#"},{name:"test",type:"flags.0?true"},{name:"name_requested",type:"flags.1?true"},{name:"phone_requested",type:"flags.2?true"},{name:"email_requested",type:"flags.3?true"},{name:"shipping_address_requested",type:"flags.4?true"},{name:"flexible",type:"flags.5?true"},{name:"phone_to_provider",type:"flags.6?true"},{name:"email_to_provider",type:"flags.7?true"},{name:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"}],type:"Invoice"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{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:-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:-104284986,predicate:"webDocumentNoProxy",params:[{name:"url",type:"string"},{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:-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:568808380,predicate:"upload.webFile",params:[{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"file_type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.WebFile"},{id:378828315,predicate:"payments.paymentForm",params:[{name:"flags",type:"#"},{name:"can_save_credentials",type:"flags.2?true"},{name:"password_missing",type:"flags.3?true"},{name:"form_id",type:"long"},{name:"bot_id",type:"long"},{name:"invoice",type:"Invoice"},{name:"provider_id",type:"long"},{name:"url",type:"string"},{name:"native_provider",type:"flags.4?string"},{name:"native_params",type:"flags.4?DataJSON"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?PaymentSavedCredentials"},{name:"users",type:"Vector"}],type:"payments.PaymentForm"},{id:-784000893,predicate:"payments.validatedRequestedInfo",params:[{name:"flags",type:"#"},{name:"id",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"payments.ValidatedRequestedInfo"},{id:1314881805,predicate:"payments.paymentResult",params:[{name:"updates",type:"Updates"}],type:"payments.PaymentResult"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],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:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",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:-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:506920429,predicate:"inputPhoneCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPhoneCall"},{id:1399245077,predicate:"phoneCallEmpty",params:[{name:"id",type:"long"}],type:"PhoneCall"},{id:-987599081,predicate:"phoneCallWaiting",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"receive_date",type:"flags.0?int"}],type:"PhoneCall"},{id:347139340,predicate:"phoneCallRequested",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:912311057,predicate:"phoneCallAccepted",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:-1770029977,predicate:"phoneCall",params:[{name:"flags",type:"#"},{name:"p2p_allowed",type:"flags.5?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"connections",type:"Vector"},{name:"start_date",type:"int"}],type:"PhoneCall"},{id:1355435489,predicate:"phoneCallDiscarded",params:[{name:"flags",type:"#"},{name:"need_rating",type:"flags.2?true"},{name:"need_debug",type:"flags.3?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"PhoneCall"},{id:-1655957568,predicate:"phoneConnection",params:[{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],type:"PhoneConnection"},{id: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:-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:-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:-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:-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:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{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:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{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: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:-26672755,predicate:"channelAdminLogEventActionChangeTheme",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],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"}],type:"ChannelAdminLogEventsFilter"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{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: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: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:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],type:"DialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{id:223655517,predicate:"messages.foundStickerSetsNotModified",params:[],type:"messages.FoundStickerSets"},{id:-1963942446,predicate:"messages.foundStickerSets",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.FoundStickerSets"},{id:1648543603,predicate:"fileHash",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{id: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:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:-534283678,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"date",type:"int"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureFile"},{id:-1964327229,predicate:"secureData",params:[{name:"data",type:"bytes"},{name:"data_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureData"},{id:2103482845,predicate:"securePlainPhone",params:[{name:"phone",type:"string"}],type:"SecurePlainData"},{id:569137759,predicate:"securePlainEmail",params:[{name:"email",type:"string"}],type:"SecurePlainData"},{id:-1658158621,predicate:"secureValueTypePersonalDetails",params:[],type:"SecureValueType"},{id:1034709504,predicate:"secureValueTypePassport",params:[],type:"SecureValueType"},{id:115615172,predicate:"secureValueTypeDriverLicense",params:[],type:"SecureValueType"},{id:-1596951477,predicate:"secureValueTypeIdentityCard",params:[],type:"SecureValueType"},{id:-1717268701,predicate:"secureValueTypeInternalPassport",params:[],type:"SecureValueType"},{id:-874308058,predicate:"secureValueTypeAddress",params:[],type:"SecureValueType"},{id:-63531698,predicate:"secureValueTypeUtilityBill",params:[],type:"SecureValueType"},{id:-1995211763,predicate:"secureValueTypeBankStatement",params:[],type:"SecureValueType"},{id:-1954007928,predicate:"secureValueTypeRentalAgreement",params:[],type:"SecureValueType"},{id:-1713143702,predicate:"secureValueTypePassportRegistration",params:[],type:"SecureValueType"},{id:-368907213,predicate:"secureValueTypeTemporaryRegistration",params:[],type:"SecureValueType"},{id:-1289704741,predicate:"secureValueTypePhone",params:[],type:"SecureValueType"},{id:-1908627474,predicate:"secureValueTypeEmail",params:[],type:"SecureValueType"},{id:411017418,predicate:"secureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?SecureFile"},{name:"reverse_side",type:"flags.2?SecureFile"},{name:"selfie",type:"flags.3?SecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"},{name:"hash",type:"bytes"}],type:"SecureValue"},{id:-618540889,predicate:"inputSecureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?InputSecureFile"},{name:"reverse_side",type:"flags.2?InputSecureFile"},{name:"selfie",type:"flags.3?InputSecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"}],type:"InputSecureValue"},{id:-316748368,predicate:"secureValueHash",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"}],type:"SecureValueHash"},{id:-391902247,predicate:"secureValueErrorData",params:[{name:"type",type:"SecureValueType"},{name:"data_hash",type:"bytes"},{name:"field",type:"string"},{name:"text",type:"string"}],type:"SecureValueError"},{id:12467706,predicate:"secureValueErrorFrontSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2037765467,predicate:"secureValueErrorReverseSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-449327402,predicate:"secureValueErrorSelfie",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:2054162547,predicate:"secureValueErrorFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:1717706985,predicate:"secureValueErrorFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-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: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: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:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],type:"PasswordKdfAlgo"},{id:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],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:-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:-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: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: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:-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:-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:-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: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:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{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:-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:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{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:-557924733,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"}],type:"CodeSettings"},{id:499236004,predicate:"wallPaperSettings",params:[{name:"flags",type:"#"},{name:"blur",type:"flags.1?true"},{name:"motion",type:"flags.2?true"},{name:"background_color",type:"flags.0?int"},{name:"second_background_color",type:"flags.4?int"},{name:"third_background_color",type:"flags.5?int"},{name:"fourth_background_color",type:"flags.6?int"},{name:"intensity",type:"flags.3?int"},{name:"rotation",type:"flags.4?int"}],type:"WallPaperSettings"},{id:-532532493,predicate:"autoDownloadSettings",params:[{name:"flags",type:"#"},{name:"disabled",type:"flags.0?true"},{name:"video_preload_large",type:"flags.1?true"},{name:"audio_preload_next",type:"flags.2?true"},{name:"phonecalls_less_data",type:"flags.3?true"},{name:"photo_size_max",type:"int"},{name:"video_size_max",type:"int"},{name:"file_size_max",type:"int"},{name:"video_upload_maxbitrate",type:"int"}],type:"AutoDownloadSettings"},{id:1674235686,predicate:"account.autoDownloadSettings",params:[{name:"low",type:"AutoDownloadSettings"},{name:"medium",type:"AutoDownloadSettings"},{name:"high",type:"AutoDownloadSettings"}],type:"account.AutoDownloadSettings"},{id:-709641735,predicate:"emojiKeyword",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:594408994,predicate:"emojiKeywordDeleted",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:1556570557,predicate:"emojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"keywords",type:"Vector"}],type:"EmojiKeywordsDifference"},{id:-1519029347,predicate:"emojiURL",params:[{name:"url",type:"string"}],type:"EmojiURL"},{id:-1275374751,predicate:"emojiLanguage",params:[{name:"lang_code",type:"string"}],type:"EmojiLanguage"},{id:-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:-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:-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:-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:-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:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{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:-402474788,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?ThemeSettings"},{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: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:-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: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:-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: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:-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:-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:-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: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:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{id:-1506535550,predicate:"messages.discussionMessage",params:[{name:"flags",type:"#"},{name:"messages",type:"Vector"},{name:"max_id",type:"flags.0?int"},{name:"read_inbox_max_id",type:"flags.1?int"},{name:"read_outbox_max_id",type:"flags.2?int"},{name:"unread_count",type:"int"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.DiscussionMessage"},{id:-1495959709,predicate:"messageReplyHeader",params:[{name:"flags",type:"#"},{name:"reply_to_msg_id",type:"int"},{name:"reply_to_peer_id",type:"flags.0?Peer"},{name:"reply_to_top_id",type:"flags.1?int"}],type:"MessageReplyHeader"},{id:-2083123262,predicate:"messageReplies",params:[{name:"flags",type:"#"},{name:"comments",type:"flags.0?true"},{name:"replies",type:"int"},{name:"replies_pts",type:"int"},{name:"recent_repliers",type:"flags.1?Vector"},{name:"channel_id",type:"flags.0?long"},{name:"max_id",type:"flags.2?int"},{name:"read_max_id",type:"flags.3?int"}],type:"MessageReplies"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{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:"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:-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:-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:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{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:-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:190633460,predicate:"chatInviteImporter",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],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:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{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:-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:-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:-318022605,predicate:"chatTheme",params:[{name:"emoticon",type:"string"},{name:"theme",type:"Theme"},{name:"dark_theme",type:"Theme"}],type:"ChatTheme"},{id:-535699004,predicate:"account.chatThemesNotModified",params:[],type:"account.ChatThemes"},{id:-28524867,predicate:"account.chatThemes",params:[{name:"hash",type:"int"},{name:"themes",type:"Vector"}],type:"account.ChatThemes"},{id:708589599,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"random_id",type:"bytes"},{name:"from_id",type:"Peer"},{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"}],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:-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:-627372787,method:"invokeWithLayer",params:[{name:"layer",type:"int"},{name:"query",type:"!X"}],type:"X"},{id:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{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:-1502141361,method:"auth.sendCode",params:[{name:"phone_number",type:"string"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:-2131827673,method:"auth.signUp",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"auth.Authorization"},{id:-1126886015,method:"auth.signIn",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"auth.Authorization"},{id:1461180992,method:"auth.logOut",params:[],type:"Bool"},{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: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:-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: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:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{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:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],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:655677548,method:"account.checkUsername",params:[{name:"username",type:"string"}],type:"Bool"},{id:1040964988,method:"account.updateUsername",params:[{name:"username",type:"string"}],type:"User"},{id:-623130288,method:"account.getPrivacy",params:[{name:"key",type:"InputPrivacyKey"}],type:"account.PrivacyRules"},{id:-906486552,method:"account.setPrivacy",params:[{name:"key",type:"InputPrivacyKey"},{name:"rules",type:"Vector"}],type:"account.PrivacyRules"},{id:1099779595,method:"account.deleteAccount",params:[{name:"reason",type:"string"}],type:"Bool"},{id:150761757,method:"account.getAccountTTL",params:[],type:"AccountDaysTTL"},{id:608323678,method:"account.setAccountTTL",params:[{name:"ttl",type:"AccountDaysTTL"}],type:"Bool"},{id:-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:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],type:"Bool"},{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: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:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{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:-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:-1456907910,method:"account.getAuthorizationForm",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"}],type:"account.AuthorizationForm"},{id:-202552205,method:"account.acceptAuthorization",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"},{name:"value_hashes",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"Bool"},{id:-1516022023,method:"account.sendVerifyPhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1305716726,method:"account.verifyPhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:1880182943,method:"account.sendVerifyEmailCode",params:[{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:-323339813,method:"account.verifyEmail",params:[{name:"email",type:"string"},{name:"code",type:"string"}],type:"Bool"},{id:-262453244,method:"account.initTakeoutSession",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"message_users",type:"flags.1?true"},{name:"message_chats",type:"flags.2?true"},{name:"message_megagroups",type:"flags.3?true"},{name:"message_channels",type:"flags.4?true"},{name:"files",type:"flags.5?true"},{name:"file_max_size",type:"flags.5?int"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:-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:-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:-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: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:-2077048289,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?InputThemeSettings"}],type:"Theme"},{id:1555261397,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?InputThemeSettings"}],type:"Theme"},{id:-229175188,method:"account.saveTheme",params:[{name:"theme",type:"InputTheme"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:2061776695,method:"account.installTheme",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"format",type:"flags.1?string"},{name:"theme",type:"flags.1?InputTheme"}],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:-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:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{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:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:-690545285,method:"account.getChatThemes",params:[{name:"hash",type:"int"}],type:"account.ChatThemes"},{id:227648840,method:"users.getUsers",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-902781519,method:"users.getFullUser",params:[{name:"id",type:"InputUser"}],type:"UserFull"},{id:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",type:"Vector"}],type:"Bool"},{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:301470424,method:"contacts.search",params:[{name:"q",type:"string"},{name:"limit",type:"int"}],type:"contacts.Found"},{id:-113456221,method:"contacts.resolveUsername",params:[{name:"username",type:"string"}],type:"contacts.ResolvedPeer"},{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:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],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:-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: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: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:469850889,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"}],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:1376532592,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:"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"}],type:"Updates"},{id:881978281,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:"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"}],type:"Updates"},{id:-637606386,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:"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"}],type:"Updates"},{id:-820669733,method:"messages.reportSpam",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:913498268,method:"messages.getPeerSettings",params:[{name:"peer",type:"InputPeer"}],type:"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: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:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{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:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{id:347716823,method:"messages.exportChatInvite",params:[{name:"flags",type:"#"},{name:"legacy_revoke_permanent",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"}],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:639215886,method:"messages.getStickerSet",params:[{name:"stickerset",type:"InputStickerSet"}],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:1468322785,method:"messages.getMessagesViews",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"increment",type:"Bool"}],type:"messages.MessageViews"},{id:-1470377534,method:"messages.editChatAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"is_admin",type:"Bool"}],type:"Bool"},{id:-1568189671,method:"messages.migrateChat",params:[{name:"chat_id",type:"long"}],type:"Updates"},{id:1271290010,method:"messages.searchGlobal",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:2016638777,method:"messages.reorderStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:864953444,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"int"},{name:"mime_type",type:"string"}],type:"Document"},{id:1559270965,method:"messages.getSavedGifs",params:[{name:"hash",type:"long"}],type:"messages.SavedGifs"},{id:846868683,method:"messages.saveGif",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:1364105629,method:"messages.getInlineBotResults",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"geo_point",type:"flags.0?InputGeoPoint"},{name:"query",type:"string"},{name:"offset",type:"string"}],type:"messages.BotResults"},{id:-346119674,method:"messages.setInlineBotResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"private",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"next_offset",type:"flags.2?string"},{name:"switch_pm",type:"flags.3?InlineBotSwitchPM"}],type:"Bool"},{id:570955184,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"}],type:"Updates"},{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:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1137057461,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"peer",type:"InputPeer"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:1782549861,method:"messages.getAllDrafts",params:[],type:"Updates"},{id:1685588756,method:"messages.getFeaturedStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:1527873830,method:"messages.readFeaturedStickers",params:[{name:"id",type:"Vector"}],type:"Bool"},{id:-1649852357,method:"messages.getRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"hash",type:"long"}],type:"messages.RecentStickers"},{id:958863608,method:"messages.saveRecentSticker",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-1986437075,method:"messages.clearRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"}],type:"Bool"},{id:1475442322,method:"messages.getArchivedStickers",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{id: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:-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: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:-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:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{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: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: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: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:-872345397,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:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"multi_media",type:"Vector"},{name:"schedule_date",type:"flags.10?int"}],type:"Updates"},{id:1347929239,method:"messages.uploadEncryptedFile",params:[{name:"peer",type:"InputEncryptedChat"},{name:"file",type:"InputEncryptedFile"}],type:"EncryptedFile"},{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:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{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:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{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: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:-2127811866,method:"messages.getStatsURL",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"params",type:"string"}],type:"StatsURL"},{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: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:1932455680,method:"messages.getSearchCounters",params:[{name:"peer",type:"InputPeer"},{name:"filters",type:"Vector"}],type:"Vector"},{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:-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:-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:-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:2127598753,method:"messages.getOldFeaturedStickers",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{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:-265962357,method:"messages.unpinAllMessages",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{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:48562110,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"}],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:654013065,method:"messages.getChatInviteImporters",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"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:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],type:"Updates"},{id:745510839,method:"messages.getMessageReadParticipants",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Vector"},{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: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: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:-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:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1319462148,method:"upload.getFile",params:[{name:"flags",type:"#"},{name:"precise",type:"flags.0?true"},{name:"cdn_supported",type:"flags.1?true"},{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.File"},{id:-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:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:536919235,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.CdnFile"},{id:-1691921240,method:"upload.reuploadCdnFile",params:[{name:"file_token",type:"bytes"},{name:"request_token",type:"bytes"}],type:"Vector"},{id:1302676017,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"}],type:"Vector"},{id:-956147407,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"}],type:"Vector"},{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:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",type:"string"}],type:"Updates"},{id:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{id:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],type:"Bool"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{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:-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:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{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:-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:-787622117,method:"channels.deleteUserHistory",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"}],type:"messages.AffectedHistory"},{id:-32999408,method:"channels.reportSpam",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{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:-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:-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:-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:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1355375294,method:"channels.deleteHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{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:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],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:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],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:-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:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",type:"Vector"}],type:"Bool"},{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:-1976353651,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"payments.PaymentForm"},{id:611897804,method:"payments.getPaymentReceipt",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"payments.PaymentReceipt"},{id:-619695760,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:818134173,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"requested_info_id",type:"flags.0?string"},{name:"shipping_option_id",type:"flags.1?string"},{name:"credentials",type:"InputPaymentCredentials"},{name:"tip_amount",type:"flags.2?long"}],type:"payments.PaymentResult"},{id: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:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{id:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?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:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{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: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:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{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:-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:-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:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{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:-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:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{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"}]},layer:133},Oe=new Uint8Array(256),qe=new Uint8Array(256),Ge=new Uint32Array(256),Ke=new Uint32Array(256),ze=new Uint32Array(256),He=new Uint32Array(256),je=new Uint32Array(256),We=new Uint32Array(256),Je=new Uint32Array(256),Ze=new Uint32Array(256);function Qe(e){if(e instanceof Uint32Array)return e;if("string"==typeof e){if(e.length%4!=0)for(var t=e.length%4;t<=4;t++)e+="\0x00";var a=new Uint32Array(e.length/4);for(t=0;t>7),r[i[m]^m]=m;for(;!Oe[p];p^=e||1)a=(a=o^o<<1^o<<2^o<<3^o<<4)>>8^255&a^99,Oe[p]=a,qe[a]=p,s=16843009*i[t=i[e=i[p]]]^65537*t^257*e^16843008*p,n=257*i[a]^16843008*a,Ge[p]=n=n<<24^n>>>8,Ke[p]=n=n<<24^n>>>8,ze[p]=n=n<<24^n>>>8,He[p]=n=n<<24^n>>>8,je[a]=s=s<<24^s>>>8,We[a]=s=s<<24^s>>>8,Je[a]=s=s<<24^s>>>8,Ze[a]=s=s<<24^s>>>8,o=r[o]||1}();var Ye=function(){function e(e){var t=Qe(e);if(4!==t.length&&6!==t.length&&8!==t.length)throw new Error("Invalid key size");this.encKey=new Uint32Array(4*t.length+28),this.decKey=new Uint32Array(4*t.length+28),this.encKey.set(t);for(var a,n=1,s=t.length;s<4*t.length+28;s++)a=this.encKey[s-1],(s%t.length==0||8===t.length&&s%t.length==4)&&(a=Oe[a>>>24]<<24^Oe[a>>16&255]<<16^Oe[a>>8&255]<<8^Oe[255&a],s%t.length==0&&(a=a<<8^a>>>24^n<<24,n=n<<1^283*(n>>7))),this.encKey[s]=this.encKey[s-t.length]^a;for(var i=0;s;i++,s--)a=this.encKey[3&i?s:s-4],this.decKey[i]=s<=4||i<4?a:je[Oe[a>>>24]]^We[Oe[a>>16&255]]^Je[Oe[a>>8&255]]^Ze[Oe[255&a]]}return e.prototype.encrypt=function(e){for(var t,a,n,s=Qe(e),i=new Uint32Array(4),r=s[0]^this.encKey[0],p=s[1]^this.encKey[1],o=s[2]^this.encKey[2],m=s[3]^this.encKey[3],d=this.encKey.length/4-2,y=4,c=0;c>>24]^Ke[p>>16&255]^ze[o>>8&255]^He[255&m]^this.encKey[y],a=Ge[p>>>24]^Ke[o>>16&255]^ze[m>>8&255]^He[255&r]^this.encKey[y+1],n=Ge[o>>>24]^Ke[m>>16&255]^ze[r>>8&255]^He[255&p]^this.encKey[y+2],m=Ge[m>>>24]^Ke[r>>16&255]^ze[p>>8&255]^He[255&o]^this.encKey[y+3],r=t,p=a,o=n,y+=4;for(c=0;c<4;c++)i[c]=Oe[r>>>24]<<24^Oe[p>>16&255]<<16^Oe[o>>8&255]<<8^Oe[255&m]^this.encKey[y++],t=r,r=p,p=o,o=m,m=t;return i},e.prototype.decrypt=function(e){for(var t,a,n,s=Qe(e),i=new Uint32Array(4),r=s[0]^this.decKey[0],p=s[3]^this.decKey[1],o=s[2]^this.decKey[2],m=s[1]^this.decKey[3],d=this.decKey.length/4-2,y=4,c=0;c>>24]^We[p>>16&255]^Je[o>>8&255]^Ze[255&m]^this.decKey[y],a=je[p>>>24]^We[o>>16&255]^Je[m>>8&255]^Ze[255&r]^this.decKey[y+1],n=je[o>>>24]^We[m>>16&255]^Je[r>>8&255]^Ze[255&p]^this.decKey[y+2],m=je[m>>>24]^We[r>>16&255]^Je[p>>8&255]^Ze[255&o]^this.decKey[y+3],r=t,p=a,o=n,y+=4;for(c=0;c<4;c++)i[3&-c]=qe[r>>>24]<<24^qe[p>>16&255]<<16^qe[o>>8&255]<<8^qe[255&m]^this.decKey[y++],t=r,r=p,p=o,o=m,m=t;return i},e}(),$e=function(){function e(e,t,a){void 0===a&&(a=16),this.key=Qe(e),this.iv=Qe(t),this.cipher=new Ye(e),this.blockSize=a/4}return e.prototype.encrypt=function(e,t){for(var a=Qe(e),n=t||new Uint32Array(a.length),s=this.iv.subarray(this.blockSize,this.iv.length),i=this.iv.subarray(0,this.blockSize),r=new Uint32Array(this.blockSize),p=0;p=this.blockSize&&this.incrementCounter(),s&&(i-=s,s=0)}return this.offset=(this.offset+a.length%4)%4,n},e.prototype.decrypt=function(e,t){return this.encrypt(e,t)},e.prototype.incrementCounter=function(){for(var e=this.counter.length-1;e>=0&&!(++this.counter[e]<4294967295);e--);}}(),Ye),tt=a(0),at=a.n(tt);const nt={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function st(e){const t=nt[e];return crypto.getRandomValues(t),t[0]}var it=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const rt="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;function pt(e){return rt.digest("SHA-1",p(e)).then(e=>new Uint8Array(e))}function ot(e){return rt.digest("SHA-256",p(e)).then(e=>new Uint8Array(e))}function mt(e,t,a){e=Le(e);return m(new $e(d(t),d(a)).encrypt(d(e)))}function dt(e,t,a){return m(new $e(d(t),d(a)).decrypt(d(e)))}function yt(e,t){const a=oe(t.modulus,16),i=oe(t.exponent,16);return s(ce(Y(oe(n(e),16),i,a),16))}function ct(e,t,a){return it(this,void 0,void 0,(function*(){const n=yield rt.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return rt.deriveBits({name:"PBKDF2",salt:t,iterations:a,hash:{name:"SHA-512"}},n,512).then(e=>new Uint8Array(e))}))}function lt(e){let t;try{t=function(e){var t,a,n,s,i,r,p=Math.ceil(64/M)+1,o=0,m=new Array(p),d=new Array(p),y=new Array(p),c=new Array(p),l=new Array(p),g=new Array(p),h=new Array(p);for(t=0;t<3;++t){for(a=17+(15&st(8)),ue(g,Q(pe(st(32),32,0),e)),ue(h,g),s=1<"boolFalse"===e.predicate).id,ft=+Ne.API.constructors.find(e=>"boolTrue"===e.predicate).id,_t=+Ne.API.constructors.find(e=>"vector"===e.predicate).id,vt=+Ne.MTProto.constructors.find(e=>"gzip_packed"===e.predicate).id;class bt{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(ft,(t||"")+":bool"):this.writeInt(ut,(t||"")+":bool")}storeLongP(e,t,a){this.writeInt(t,(a||"")+":long[low]"),this.writeInt(e,(a||"")+":long[high]")}storeLong(e,t){if(Array.isArray(e))return 2===e.length?this.storeLongP(e[0],e[1],t):this.storeIntBytes(e,64,t);"string"!=typeof e&&(e=e?e.toString():"0");const a=4294967296,n=oe(e,10,64),s=he(n),i=he(n);ie(n,oe(a.toString(16),16,64),s,i);const r=+ce(s,10);let p=+ce(i,10);r>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const n=a.length;n<=253?this.byteView[this.offset++]=n:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&n,this.byteView[this.offset++]=(65280&n)>>8,this.byteView[this.offset++]=(16711680&n)>>16);for(let e=0;e>>",n(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(">>>",n(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(">>>",n(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?Ne.MTProto:Ne.API).methods.find(t=>t.method===e);if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const n=t.pFlags||t,s={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),s=e[0].split(".");if(!(t[s[0]]&1<<+s[1])){if(!("true"===e[1]?n[i.name]:void 0!==t[i.name]))continue;t[s[0]]|=1<<+s[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,s[i.name]=r)}for(let e in s)this.intView[s[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(_t,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const n=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===s);if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+s+" found");s===t&&(i=!0),i||this.writeInt(r.id,a+"["+s+"][id]");const p=e.pFlags,o={};for(const t of r.params){let n=t.type;if(-1!==n.indexOf("?")){const a=n.split("?"),s=a[0].split(".");if(!(e[s[0]]&1<<+s[1])){if(!("true"===a[1]?p&&p[t.name]:void 0!==e[t.name]))continue;e[s[0]]|=1<<+s[1]}n=a[1]}const i=this.storeObject(e[t.name],n,a+"["+s+"]["+t.name+"]");"#"===n&&(e[t.name]=e[t.name]||0,o[t.name]=i)}for(let t in o)this.intView[o[t]]=e[t];return r.type}}class Pt{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),this.byteView.slice(this.offset-16,this.offset+16).hex),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),n=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),n[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]"),a=Fe(this.readInt((e||"")+":long[high]"),t);if(!this.mtproto){const e=+a;if(Number.isSafeInteger(e))return e}return a}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===ft||t!==ut&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,n="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView.subarray(this.offset,this.offset+e)),this.offset+=e,t}const s=new Array(e);for(let t=0;t0){const s=e.substr(7,e.length-8);for(let e=0;ee.type===t),!n)throw new Error("Constructor not found for type: "+e)}else{const i=this.readInt(t+"[id]");if(i===vt){const a=ht(this.fetchBytes(t+"[packed_string]"));return new Pt(a).fetchObject(e,t)}if(i===_t)return this.fetchVector(e,t);let r=a.constructorsIndex;if(!r){a.constructorsIndex=r={};for(let e=0,t=a.constructors.length;ee|t,0)},n}var At=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};Ct("SRP",wt.Error);function Mt(e,t,a){return At(this,void 0,void 0,(function*(){const i=a?t.new_algo:t.current_algo,m=oe(n(i.p),16),d=pe(i.g,32,256),y=oe(n(yield function(e,t,a){return At(this,void 0,void 0,(function*(){let n=yield Rt.invokeCrypto("sha256-hash",o(t,(new TextEncoder).encode(e),t));n=o(a,n,a),n=yield Rt.invokeCrypto("sha256-hash",n);let s=yield Rt.invokeCrypto("pbkdf2",new Uint8Array(n),t,1e5);return s=o(a,s,a),n=yield Rt.invokeCrypto("sha256-hash",s),n}))}(e,i.salt1,i.salt2)),16),c=function(e,t){return e instanceof Uint8Array||(e=p(e)),Le(e,t,!0,!0,!0)},l=Y(d,y,m),g=e=>{const t=new Uint8Array(e.length);for(let a=0;a{const a=$(t,e);return!(ae(a)||J(a)<1984||J(e)<1984||Math.floor((J(e)+7)/8)>256)},{a:P,a_for_hash:w,u:S}=yield(()=>At(this,void 0,void 0,(function*(){for(;;){const e=oe(n(g(t.secure_random)),16),a=Y(d,e,m);if(b(a,m)){const t=s(ce(a,16)),n=oe((yield Rt.invokeCrypto("sha256-hash",o(t,_))).hex,16);if(!ye(n)&&!ae(n))return{a:e,a_for_hash:t,u:n}}}})))();let I;I=se(h,v)?h:ee(h,m),I=Q($(I,v),m);const k=Y(I,ee(P,X(S,y)),m),C=yield Rt.invokeCrypto("sha256-hash",c(s(ce(k,16)),256));let A=yield Rt.invokeCrypto("sha256-hash",u);A=r(A,yield Rt.invokeCrypto("sha256-hash",f));const M=o(A,yield Rt.invokeCrypto("sha256-hash",i.salt1),yield Rt.invokeCrypto("sha256-hash",i.salt2),w,_,C),R=yield Rt.invokeCrypto("sha256-hash",M);return{_:"inputCheckPasswordSRP",srp_id:t.srp_id,A:new Uint8Array(w),M1:R}}))}var Rt=new class extends class{invokeCrypto(e,...t){return this.performTaskWorker(e,...t)}}{constructor(){super(),this.webWorker=!1,this.taskId=0,this.awaiting={},this.pending=[],this.debug=!1,console.log("CW constructor"),this.utils={"sha1-hash":pt,"sha256-hash":ot,pbkdf2:ct,"aes-encrypt":mt,"aes-decrypt":dt,"rsa-encrypt":yt,factorize:lt,"mod-pow":gt,gzipUncompress:ht,computeSRP:Mt}}performTaskWorker(e,...t){return this.debug&&console.log("CW start",e,t),Promise.resolve(this.utils[e](...t))}};const Et=new class{constructor(){this.lastMessageId=[0,0],this.timeOffset=0,A.get("server_time_offset").then(e=>{e&&(this.timeOffset=e)})}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|st(16)<<3|4];(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t;return Fe(t[0],t[1])}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),n=Math.abs(this.timeOffset-a)>10;A.set({server_time_offset:a}),this.lastMessageId=[0,0],this.timeOffset=a;return P({type:"applyServerTimeOffset",payload:a}),n}};l.timeManager=Et;var Vt=Et;const Dt={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"0.9.2",versionFull:"0.9.2 (35)",build:35,langPackVersion:"0.3.7",langPack:"macos",langPackCode:"en",domains:["web.telegram.org"],baseDcId:2,isMainDomain:"web.telegram.org"===location.hostname,suffix:"K"};Dt.isMainDomain&&(Dt.id=2496,Dt.hash="8da85b0d5bfe62527e5b244c209159c3");var Ut=Dt;function Tt(){}var Bt;!function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(Bt||(Bt={}));var xt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};let Ft;class Lt{constructor(e,t,a,n,s,i={}){this.dcId=e,this.authKey=t,this.authKeyId=a,this.transport=s,this.lastServerMessages=[],this.sentMessages={},this.pendingMessages={},this.pendingAcks=[],this.pendingResends=[],this.connectionInited=!1,this.nextReq=0,this.seqNo=0,this.lastResendReq=null,this.isOnline=!1,this.status=Bt.Closed,this.lastResponseTime=0,this.debug=g||y.debug,this.activeRequests=0,this.authKeyUint8=p(this.authKey),this.serverSalt=p(n),this.isFileUpload=!!i.fileUpload,this.isFileDownload=!!i.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload;const r=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+e+r,this.log=Ct(this.name,wt.Log|wt.Error|wt.Warn),this.log("constructor"),this.updateSession(),this.transport.networker=this,this.transport.connected&&this.setConnectionStatus(Bt.Connected)}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=new Uint8Array(8).randomize()}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&function(e,t){for(let a=e.length-1;a>=0;--a)t(e[a],a,e)}(t.inner,(e,a)=>{const n=this.updateSentMessage(e);n?t.inner[a]=n.msg_id:t.inner.splice(a,1)}),t.msg_id=Vt.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const n=new bt({mtproto:!0});n.storeMethod(e,t);const s=Vt.generateId(),i=this.generateSeqNo(),r={msg_id:s,seq_no:i,body:n.getBytes(!0)};return y.debug&&this.log("MT call",e,t,s,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new bt({mtproto:!0});a.storeObject(e,"Object");const n=Vt.generateId(),s=this.generateSeqNo(t.notContentRelated),i={msg_id:n,seq_no:s,body:a.getBytes(!0)};return y.debug&&this.log("MT message",e,n,s),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const n=new bt(a);if(!this.connectionInited){const e=Ne.API.methods.find(e=>"invokeWithLayer"===e.method);if(!e)throw new Error("no invokeWithLayer!");n.storeInt(+e.id,"invokeWithLayer"),n.storeInt(Ne.layer,"layer");const t=Ne.API.methods.find(e=>"initConnection"===e.method);if(!t)throw new Error("no initConnection!");n.storeInt(+t.id,"initConnection"),n.storeInt(0,"flags"),n.storeInt(Ut.id,"api_id"),n.storeString(Ot.userAgent||"Unknown UserAgent","device_model"),n.storeString(navigator.platform||"Unknown Platform","system_version"),n.storeString(Ut.version+(Ut.isMainDomain?" "+Ut.suffix:""),"app_version"),n.storeString(navigator.language||"en","system_lang_code"),n.storeString(Ut.langPack,"lang_pack"),n.storeString(Ot.language,"lang_code")}if(a.afterMessageId){if(void 0===Ft){const e=Ne.API.methods.find(e=>"invokeAfterMsg"===e.method);Ft=e?+e.id:0}Ft?(n.storeInt(Ft,"invokeAfterMsg"),n.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=n.storeMethod(e,t);const s={msg_id:Vt.generateId(),seq_no:this.generateSeqNo(),body:n.getBytes(!0),isAPI:!0};return y.debug?this.log("Api call",e,s,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(s,a)}destroy(){this.transport.destroy()}forceReconnectTimeout(){this.transport.reconnect&&this.transport.reconnect()}forceReconnect(){this.transport.forceReconnect&&this.transport.forceReconnect()}pushMessage(e,t){const a=new Promise((a,n)=>{this.sentMessages[e.msg_id]=Object.assign(e,t,t.notContentRelated?void 0:{deferred:{resolve:a,reject:n}}),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),Be(t)&&(t.messageId=e.msg_id)});if(!t.notContentRelated&&!t.noResponse){const t=setTimeout(()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime<5e3||(this.log.error("timeout",e),this.isOnline&&this.setConnectionStatus(Bt.TimedOut))},5e3);a.catch(Tt).finally(()=>{clearTimeout(t),this.setConnectionStatus(Bt.Connected),--this.activeRequests,this.setDrainTimeout()}),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}return a}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=self.setTimeout(()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()},1e4))}setConnectionStatus(e,t){const a=e===Bt.Connected,n=this.status!==e;this.isOnline=a,this.status=e,n&&(Ot.onConnectionStatusChange&&Ot.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())}pushResend(e,t=100){const a=t?Date.now()+t:0,n=this.sentMessages[e];if(n.container)for(const e of n.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;n.acked&&this.log.error("pushResend: acked message?",n),this.debug&&this.log.debug("pushResend:",e,n,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return xt(this,void 0,void 0,(function*(){const a=t?0:8,n=o(this.authKeyUint8.subarray(88+a,88+a+32),e),s=yield Rt.invokeCrypto("sha256-hash",n);return new Uint8Array(s).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),s=new Uint8Array(52),i=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),i.push(Rt.invokeCrypto("sha256-hash",n)),s.set(this.authKeyUint8.subarray(40+a,40+a+36),0),s.set(e,36),i.push(Rt.invokeCrypto("sha256-hash",s)),Promise.all(i).then(e=>{const t=new Uint8Array(32),a=new Uint8Array(32),n=new Uint8Array(e[0]),s=new Uint8Array(e[1]);return t.set(n.subarray(0,8)),t.set(s.subarray(8,24),8),t.set(n.subarray(24,32),24),a.set(s.subarray(0,8)),a.set(n.subarray(8,24),8),a.set(s.subarray(24,32),24),[t,a]})}isStopped(){return Ot.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})}if(this.pendingResends.length){const e=this.pendingResends.slice(),t={noSchedule:!0,notContentRelated:!0,messageId:""};this.wrapMtpMessage({_:"msg_resend_req",msg_ids:e},t),this.lastResendReq={req_msg_id:t.messageId,resend_msg_ids:e}}let e;const t=[];let a=0,n=!1;const s=Object.keys(this.pendingMessages).map(e=>oe(e,10)).sort((e,t)=>ge(e,t)).map(e=>ce(e,10));for(const i of s){const s=this.sentMessages[i];if(s&&s.body){const i=s.body.length+32;if(a+i>655360&&(this.log.warn("lengthOverflow",s,t),n=!0,e))break;t.push(s),a+=i,e=s}delete this.pendingMessages[i]}if(!t.length)return;if(t.length>1){const n=this.generateContainerMessage(a,t);e=n.messageWithBody,this.sentMessages[e.msg_id]=n.message}else this.sentMessages[e.msg_id]=e;this.pendingAcks=[];this.sendEncryptedRequest(e);this.cleanupSent(),n&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new bt({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const n=[];t.forEach((e,t)=>{n.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")});const s={msg_id:Vt.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:n};return y.debug&&this.log.warn("Container",n,s.msg_id,s.seq_no),{message:s,messageWithBody:Object.assign({body:a.getBytes(!0)},s)}}getEncryptedMessage(e){return xt(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield Rt.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then(e=>Rt.invokeCrypto("aes-decrypt",t,e[0],e[1]))}getEncryptedOutput(e){const t=new bt({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(),n=16-t.getOffset()%16+16*(1+st(8)%5),s=o(a,new Uint8Array(n).randomize());return this.getEncryptedMessage(s).then(e=>{const t=new bt({startMaxLength:e.bytes.length+256});t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data");return t.getBytes(!0)})}sendEncryptedRequest(e){return this.getEncryptedOutput(e).then(t=>{this.debug&&this.log.debug("sendEncryptedRequest: launching message into space:",e,[e.msg_id].concat(e.inner||[]));return this.transport.send(t)})}parseResponse(e){this.lastResponseTime=Date.now();const t=new Pt(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!i(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+a.hex);const s=t.fetchIntBytes(128,!0,"msg_key"),r=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(s,r).then(e=>this.getMsgKey(e,!1).then(t=>{if(!i(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new Pt(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const r=a.fetchIntBytes(64,!0,"session_id"),p=a.fetchLong("message_id");if(!(i(r,this.sessionId)||this.prevSessionId&&i(r,this.prevSessionId)))throw this.log.warn("Sessions",r,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+n(r));const o=a.fetchInt("seq_no"),m=e.byteLength,d=a.fetchInt("message_data[length]");let y=a.getOffset();if(d%4||d>m-y)throw new Error("[MT] Invalid body length: "+d);const c=a.fetchRawBytes(d,!0,"message_data");y=a.getOffset();const l=m-y;if(l<12||l>1024)throw new Error("[MT] Invalid padding length: "+l);a=new Pt(c,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const n=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==n+e.bytes&&a.setOffset(n+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const n=this.sentMessages[e.req_msg_id],s=n&&n.resultType||"Object";e.req_msg_id&&!n||(e.result=a.fetchObject(s,t+"[result]"))}}});return{response:a.fetchObject("","INPUT"),messageId:p,sessionId:r,seqNo:o}}))}applyServerSalt(e){const t=Le(new Uint8Array(le(oe(e,10),!1)),8,!0,!1,!1);A.set({["dc"+this.dcId+"_server_salt"]:n(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){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.performScheduledRequest()};this.nextReq=t,e?this.nextReqTimeout=self.setTimeout(a,e):a()}ackMessage(e){this.pendingAcks.push(e),this.scheduleRequest()}reqResendMessage(e){this.debug&&this.log.debug("Req resend",e),this.pendingResends.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;return Object.keys(this.sentMessages).forEach(t=>{const a=this.sentMessages[t];if(a.notContentRelated&&void 0===this.pendingMessages[t])delete this.sentMessages[t];else if(a.container){for(const t of a.inner)if(void 0!==this.sentMessages[t])return void(e=!0);delete this.sentMessages[t]}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(){for(const e in this.sentMessages){const t=this.sentMessages[e];(t.body||t.container)&&this.pushResend(e)}}processMessage(e,t,a){if("messageEmpty"===e._)return void this.log.warn("processMessage: messageEmpty",e,t);if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(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=oe(t,10);ve(a,32);const n=Vt.applyServerTime(+ce(a,10));(17===e.error_code||n)&&(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),A.get("dc").then(t=>{t===this.dcId&&!this.isFileNetworker&&Ot.updatesProcessor&&Ot.updatesProcessor(e)});break;case"msgs_ack":for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResendMessage(e.answer_msg_id);break;case"msgs_state_info":if(this.ackMessage(e.answer_msg_id),this.lastResendReq&&this.lastResendReq.req_msg_id===e.req_msg_id&&this.pendingResends.length)for(const e of this.lastResendReq.resend_msg_ids){const t=this.pendingResends.indexOf(e);-1!==t&&this.pendingResends.splice(t,1)}break;case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,n=this.sentMessages[a];if(this.processMessageAck(a),n){const t=n.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),n.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":if(this.transport.networker){const t=e.msg_id,a=this.sentMessages[t];a&&(a.deferred.resolve(e),delete this.sentMessages[t])}break;default:this.ackMessage(t),null!==Ot.updatesProcessor&&Ot.updatesProcessor(e)}}}const Nt=new class{constructor(){this.networkers=[],this.language=navigator.language||Ut.langPackCode,this.updatesProcessor=null,this.onConnectionStatusChange=null,this.akStopped=!1,this.userAgent=navigator.userAgent}removeNetworker(e){const t=this.networkers.indexOf(e);-1!==t&&this.networkers.splice(t,1)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,n,s,i){const r=new Lt(e,t,a,n,s,i);return this.networkers.push(r),r}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)}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}};l&&(l.networkerFactory=Nt);var Ot=Nt;class qt{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,a){var n,s;(null!==(n=this.listeners[e])&&void 0!==n?n:this.listeners[e]=[]).push({callback:t,options:a}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(s=a)||void 0===s?void 0:s.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,a){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}dispatchEvent(e,...t){this.reuseResults&&(this.listenerResults[e]=t);const a=[],n=this.listeners[e];if(n){n.slice().forEach(s=>{var i;-1!==n.findIndex(e=>e.callback===s.callback)&&(a.push(s.callback(...t)),(null===(i=s.options)||void 0===i?void 0:i.once)&&this.removeEventListener(e,s.callback))})}return a}cleanup(){this.listeners={},this.listenerResults={}}}class Gt extends qt{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.debug=y.debug&&!1,this.handleOpen=()=>{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=e=>{this.log.error("handleError",e),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=e=>{this.debug&&this.log.debug("<-","handleMessage",e.data.byteLength),this.dispatchEvent("message",e.data)},this.send=e=>{this.debug&&this.log.debug("-> body length to send:",e.length),this.ws.send(e)};let n=wt.Error|wt.Log;return this.debug&&(n|=wt.Debug),this.log=Ct("WS-"+e+a,n),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(e){}this.handleClose()}}}class Kt{constructor(e){this._counter=e}increment(){for(let e=15;e>=0;e--){if(255!==this._counter[e]){this._counter[e]++;break}this._counter[e]=0}}}class zt{constructor(e,t){this._remainingCounter=null,this._remainingCounterIndex=16,this._counter=new Kt(t),this._aes=new et(e)}update(e){const t=e.slice();for(let e=0;e{this.connected=!0;const e=this.obfuscation.init(this.codec);if(this.connection.send(e),this.networker)this.pending.length=0,this.networker.setConnectionStatus(Bt.Connected),this.networker.cleanupSent(),this.networker.resend();else for(const e of this.pending)e.encoded&&e.body&&(e.encoded=this.encodeBody(e.body));setTimeout(()=>{this.releasePending()},0)},this.onMessage=e=>{let t=this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then(e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}}).catch(e=>{this.log.error("handleMessage networker parseResponse error",e)});const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",t.hex)},this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),n=a-this.lastCloseTime;e=!isNaN(n)&&n{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(Bt.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=wt.Error|wt.Log;this.debug&&(i|=wt.Debug),this.log=Ct("TCP-"+t+n,i),this.log("constructor"),this.connect()}clear(){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()}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",()=>{e.removeEventListener("message",this.onMessage)},{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=this.connected?this.encodeBody(e):void 0;if(!this.networker){const a=new Promise((a,n)=>{this.pending.push({resolve:a,reject:n,body:e,encoded:t})});return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){if(!this.connected)return;let e=this.pending.length;for(let t=0;t body length to send:",n.length),i||(i=a.encoded=this.encodeBody(n)),this.connection.send(i),a.resolve?a.bodySent=!0:(this.pending.splice(t--,1),e--))}}}var Jt="undefined"!=typeof window?window:self;const Zt=navigator?navigator.userAgent:null,Qt=(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)&&Jt.MSStream,!!("safari"in Jt)||!(!Zt||!(/\b(iPad|iPhone|iPod)\b/.test(Zt)||Zt.match("Safari")&&!Zt.match("Chrome"))));navigator.userAgent.toLowerCase().indexOf("firefox"),navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i);let Xt=0;class Yt extends qt{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.id=++Xt,$t.set(this.id,this);const n={type:"socketProxy",payload:{type:"setup",payload:{dcId:e,url:t,logSuffix:a},id:this.id}};w(n)}send(e){const t={type:"socketProxy",payload:{type:"send",payload:e,id:this.id}};w(t)}close(){const e={type:"socketProxy",payload:{type:"close",id:this.id}};w(e)}}const $t=new Map,ea=y.test?"_test":"";class ta{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=y.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const n="apiws"+ea,s=`wss://${Ut.suffix.toLowerCase()}ws${e}${a}.web.telegram.org/${n}`;return new Wt(Qt&&h&&void 0!==Yt?Yt:Gt,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)}}chooseServer(e,t="client",a="websocket",n=!0){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const s=this.chosenServers[a][t];e in s||(s[e]=[]);const i=s[e];if(!i.length||!n){let a;const s="client"===t?"":"-1";return a=this.transportSocket(e,t,s),a?(n&&i.push(a),a):(console.error("No chosenServer!",e),null)}return i[0]}static removeTransport(e,t){for(const a in e)for(const n in e[a])for(const s in e[a][n]){const i=e[a][n][s],r=i.indexOf(t);-1!==r&&i.splice(r,1)}}}var aa=new ta,na=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var sa=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,y.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 bt;t.storeBytes(s(e.modulus),"n"),t.storeBytes(s(e.exponent),"e");const a=t.getBuffer();return Rt.invokeCrypto("sha1-hash",a).then(t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[n(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}})})).then(()=>{this.prepared=!0,this.preparePromise=null})}select(e){return na(this,void 0,void 0,(function*(){yield this.prepare();for(let t=0;t{if(g&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw p;try{const t=new Pt(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const n=t.fetchLong("msg_id");"0"===n&&this.log.error("msg_id === 0",n);const s=t.fetchInt("msg_len");return s||this.log.error("no msg_len",s),t}catch(e){this.log.error("mtpSendPlainRequest: deserialization went bad",e);throw Object.assign(p,{originalError:e})}},e=>{throw e.message||e.type||(e=Object.assign(p,{originalError:e})),e})}sendReqPQ(e){return ia(this,void 0,void 0,(function*(){const t=new bt({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),g&&this.log("Send req_pq",e.nonce.hex);try{const n=this.sendPlainRequest(e.dcId,t.getBytes(!0));sa.prepare(),a=yield n}catch(e){throw this.log.error("req_pq error",e.message),e}const s=a.fetchObject("ResPQ");if("resPQ"!==s._)throw new Error("[MT] resPQ response invalid: "+s._);if(!i(e.nonce,s.nonce))throw this.log.error(e.nonce,s.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=s.server_nonce,e.pq=s.pq,e.fingerprints=s.server_public_key_fingerprints,g&&this.log("Got ResPQ",n(e.serverNonce),n(e.pq),e.fingerprints);const r=yield sa.select(e.fingerprints);if(!r)throw new Error("[MT] No public key found");e.publicKey=r,g&&this.log("PQ factorization start",e.pq);try{var p=yield Rt.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=p[0],e.q=p[1],g&&this.log("PQ factorization done",p),this.sendReqDhParams(e)}))}sendReqDhParams(e){return ia(this,void 0,void 0,(function*(){e.newNonce=new Uint8Array(32).randomize();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 bt({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const s=a.getBytes(!0);if(s.length>144)throw"DH_params: data is more than 144 bytes!";const p=Le(s,192,!1,!0,!1),o=p.slice().reverse(),m=yield(()=>ia(this,void 0,void 0,(function*(){for(;;){const t=new Uint8Array(32).randomize(),a=o.concat(yield Rt.invokeCrypto("sha256-hash",t.concat(p)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const s=yield Rt.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),i=r(t,yield Rt.invokeCrypto("sha256-hash",s)).concat(s);if(-1===ge(oe(n(i),16),oe(e.publicKey.modulus,16)))return i}})))(),d=Le(yield Rt.invokeCrypto("rsa-encrypt",m,e.publicKey),256,!0,!0,!0),y={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:d},c=new bt({mtproto:!0});c.storeMethod("req_DH_params",y);const l=c.getBytes(!0);let h;g&&this.log("Send req_DH_params",y);try{h=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const u=h.fetchObject("Server_DH_Params","RESPONSE");if(g&&this.log("Sent req_DH_params, response:",u),"server_DH_params_fail"!==u._&&"server_DH_params_ok"!==u._)throw new Error("[MT] Server_DH_Params response invalid: "+u._);if(!i(e.nonce,u.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!i(e.serverNonce,u.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===u._){if(!i((yield Rt.invokeCrypto("sha1-hash",e.newNonce)).slice(-16),u.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,u.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return ia(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield Rt.invokeCrypto("sha1-hash",e.newNonce.concat(e.serverNonce))).concat((yield Rt.invokeCrypto("sha1-hash",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield Rt.invokeCrypto("sha1-hash",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield Rt.invokeCrypto("sha1-hash",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield Rt.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),s=a.slice(20),r=new Pt(s,{mtproto:!0}),p=r.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==p._)throw new Error("[MT] server_DH_inner_data response invalid: "+p);if(!i(e.nonce,p.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!i(e.serverNonce,p.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");g&&this.log("Done decrypting answer"),e.g=p.g,e.dhPrime=p.dh_prime,e.gA=p.g_a,e.serverTime=p.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const o=r.getOffset();if(!i(n,yield Rt.invokeCrypto("sha1-hash",s.slice(0,o))))throw new Error("[MT] server_DH_inner_data SHA1-hash mismatch");Vt.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){g&&this.log("Verifying DH params",e,t,a);const s=n(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");g&&this.log("dhPrime cmp OK");const i=oe(n(a),16),r=oe(s,16);if(ge(i,U)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(ge(i,$(r,U))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");g&&this.log("1 < gA < dhPrime-1 OK");const p=function(e,t){let a=he(e);t-=1;for(let n=0;n=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return g&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return ia(this,void 0,void 0,(function*(){const t=s(e.g.toString(16));e.b=new Uint8Array(256).randomize();try{var a=yield Rt.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new bt({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 p=(yield Rt.invokeCrypto("sha1-hash",n.getBuffer())).concat(n.getBytes(!0)),o=yield Rt.invokeCrypto("aes-encrypt",p,e.tmpAesKey,e.tmpAesIv),m=new bt({mtproto:!0});let d;m.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:o}),g&&this.log("Send set_client_DH_params");try{d=yield this.sendPlainRequest(e.dcId,m.getBytes(!0))}catch(e){throw e}const y=d.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==y._&&"dh_gen_retry"!==y._&&"dh_gen_fail"!==y._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+y._);if(!i(e.nonce,y.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!i(e.serverNonce,y.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var c=yield Rt.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw c}const l=yield Rt.invokeCrypto("sha1-hash",c),h=l.slice(0,8),u=l.slice(-8);switch(g&&this.log("Got Set_client_DH_params_answer",y._,c),y._){case"dh_gen_ok":{const t=(yield Rt.invokeCrypto("sha1-hash",e.newNonce.concat([1],h))).slice(-16);if(!i(t,y.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,y),new Error("new_nonce_hash1 mismatch");const a=r(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return g&&this.log("Auth successfull!",u,c,a),e.authKeyId=u,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":if(!i((yield Rt.invokeCrypto("sha1-hash",e.newNonce.concat([2],h))).slice(-16),y.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e);case"dh_gen_fail":if(!i((yield Rt.invokeCrypto("sha1-hash",e.newNonce.concat([3],h))).slice(-16),y.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")}}))}auth(e){return ia(this,void 0,void 0,(function*(){if(e in this.cached)return this.cached[e];const t=new Uint8Array(16).randomize();if(!aa.chooseServer(e))throw new Error("[MT] No server found for dc "+e);const a={dcId:e,nonce:t,localTry:1};try{const t=this.sendReqPQ(a);return this.cached[e]=t,yield t}catch(t){if(a.localTry<=3)return this.sendReqPQ({dcId:a.dcId,nonce:new Uint8Array(16).randomize(),localTry:a.localTry+1});throw delete this.cached[e],t}}))}};function pa(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((a,n)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,a(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,n(...e))}});return t.catch(Tt).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}function oa(e,t){return new Promise(a=>{const n=new FileReader;n.addEventListener("loadend",e=>a(e.target.result)),n[t](e)})}function ma(e){return oa(e,"readAsArrayBuffer")}function da(e,t=""){let a;const n=function(e){if(-1===["image/jpeg","image/png","image/gif","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e))return"application/octet-stream";return e}(t);try{a=new Blob(e,{type:n})}catch(t){let s=new BlobBuilder;e.forEach(e=>{s.append(e)}),a=s.getBlob(n)}return a}class ya{constructor(e,t){this.storageIsAvailable=!0,function(e,t){if(t)for(let a in t)void 0!==t[a]&&(e[a]=t[a])}(this,e),y.test&&(this.name+="_test"),this.storeName=t,this.log=Ct("IDB-"+this.storeName),this.openDatabase(!0),ya.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let a=!1;return setTimeout(()=>{a||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,n)=>{t.onsuccess=s=>{a=!0;const i=t.result;let r=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},i.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{a=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},t.onupgradeneeded=e=>{a=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var a;const n=e.createObjectStore(t.name);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const e of t.indexes)n.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",a=>e.map((e,n)=>a.put(t[n],e)),"")}saveFile(e,t){return t instanceof Blob||(t=da([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,a,n=this.storeName){let s;return a&&(s=performance.now(),this.log(a+": start")),this.openDatabase().then(i=>new Promise((r,p)=>{const o=i.transaction([n],e);o.onerror=e=>{clearTimeout(m),p(o.error)},o.oncomplete=e=>{clearTimeout(m),a&&this.log(a+": end",performance.now()-s);const t=c.map(e=>e.result);r(y?t:t[0])};const m=setTimeout(()=>{this.log.error("transaction not finished",o)},1e4),d=t(o.objectStore(n)),y=Array.isArray(d),c=y?d:[].concat(d)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}ya.STORAGES=[];var ca=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const la=new class{constructor(){this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.log=Ct("API"),this.afterMessageTempIds={}}getBaseDcId(){return ca(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield A.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(Ut.baseDcId)),this.baseDcId}))}setUserAuth(e){return ca(this,void 0,void 0,(function*(){if(!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}A.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then(e=>{this.setOnDrainIfNeeded(e)}),this.baseDcId=e,A.set({dc:this.baseDcId})}logOut(){return ca(this,void 0,void 0,(function*(){const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map(e=>A.get(e))),a=[];for(let e=0;e{this.baseDcId=void 0,ya.closeDatabases(),self.postMessage({type:"clear"})};return setTimeout(n,1e3),Promise.all(a).catch(e=>{e.handled=!0}).finally(n)}))}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",i="websocket";this.cachedNetworkers.hasOwnProperty(i)||(this.cachedNetworkers[i]={client:{},download:{},upload:{}});const r=this.cachedNetworkers[i][a];e in r||(r[e]=[]);const p=r[e],o="client"===a||"https"===i?1:3;if(p.length>=o){let e=p.length-1,t=!1;for(;e>=0;--e)if(p[e].isOnline){t=!0;break}const a=t?p.splice(e,1)[0]:p.pop();return p.unshift(a),Promise.resolve(a)}const m=[e,i,a].join("-");if(this.gettingNetworkers[m])return this.gettingNetworkers[m];const d=`dc${e}_auth_key`,y=`dc${e}_server_salt`;return this.gettingNetworkers[m]=Promise.all([d,y].map(e=>A.get(e))).then(([r,o])=>ca(this,void 0,void 0,(function*(){const c=aa.chooseServer(e,a,i,"client"===a);let l;if(r&&512===r.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=s(r),n=(yield Rt.invokeCrypto("sha1-hash",a)).slice(-8),i=s(o);l=Ot.getNetworker(e,a,n,i,c,t)}else try{const a=yield ra.auth(e),s={[d]:n(a.authKey),[y]:n(a.serverSalt)};A.set(s),l=Ot.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,c,t)}catch(e){throw this.log("Get networker error",e,e.stack),delete this.gettingNetworkers[m],e}return delete this.gettingNetworkers[m],p.unshift(l),this.setOnDrainIfNeeded(l),l})))}setOnDrainIfNeeded(e){if(e.onDrain)return;(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then(t=>e.dcId!==t)).then(t=>{e.onDrain||t&&(e.onDrain=()=>{this.log("networker drain",e.dcId),e.onDrain=void 0,e.destroy(),Ot.removeNetworker(e),ta.removeTransport(this.cachedNetworkers,e),ta.removeTransport(aa.chosenServers,e.transport)},e.setDrainTimeout())})}invokeApi(e,t={},a={}){const n=pa();let{afterMessageId:s,prepareTempMessageId:i}=a;if(i&&n.then(()=>{delete this.afterMessageTempIds[i]}),l){const s=Date.now(),i=Jt.setInterval(()=>{o&&o.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-s)/1e3)},5e3);n.catch(Tt).finally(()=>{clearInterval(i)})}const r=t=>{t?Be(t)||(t={message:t}):t={type:"ERROR_EMPTY"},n.reject(t),(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors||(406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=m||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout(()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)},100)))};let p,o,m=(new Error).stack||"empty stack";const d=m=>{if(s){const e=this.afterMessageTempIds[s];e&&(a.afterMessageId=e.messageId)}const y=(o=m).wrapApiCall(e,t,a);return i&&(this.afterMessageTempIds[i]={messageId:a.messageId,promise:n}),y.then(n.resolve,i=>{if("FILE_REFERENCE_EXPIRED"!==i.type&&this.log.error("Error",i.code,i.type,this.baseDcId,p,e,t),401===i.code&&this.baseDcId===p)"SESSION_PASSWORD_NEEDED"!==i.type&&(A.delete("dc"),A.delete("user_auth")),r(i);else if(401===i.code&&this.baseDcId&&p!==this.baseDcId){if(void 0===this.cachedExportPromise[p]){const e=new Promise((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:p},{noErrorBox:!0}).then(a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:p,noErrorBox:!0}).then(e,t)},t)});this.cachedExportPromise[p]=e}this.cachedExportPromise[p].then(()=>{this.invokeApi(e,t,a).then(n.resolve,r)},r)}else if(303===i.code){const s=+i.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];s!==p&&(a.dcId?a.dcId=s:this.setBaseDcId(s),this.getNetworker(s,a).then(s=>{s.wrapApiCall(e,t,a).then(n.resolve,r)},r))}else if(400===i.code&&0===i.type.indexOf("FILE_MIGRATE")){const s=+i.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];s!==p?this.getNetworker(s,a).then(s=>{s.wrapApiCall(e,t,a).then(n.resolve,r)},r):r(i)}else if(a.rawError||420!==i.code)if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(i.type)){const e=this.afterMessageTempIds[s];s=void 0,delete a.afterMessageId,e?e.promise.then(()=>d(o)):d(o)}else if(a.rawError||500!==i.code)"UNKNOWN"===i.type?setTimeout(()=>{d(o)},1e3):r(i);else{const e=Date.now();if(a.stopTime&&e>=a.stopTime)return r(i);a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,setTimeout(()=>{d(o)},1e3*a.waitTime)}else{const e=+i.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(void 0!==a.floodMaxTimeout?a.floodMaxTimeout:60)&&!a.prepareTempMessageId)return r(i);setTimeout(()=>{d(o)},1e3*e)}})};return(p=a.dcId||this.baseDcId)?this.getNetworker(p,a).then(d,r):this.getBaseDcId().then(e=>{this.getNetworker(p=e,a).then(d,r)}),n}};l.apiManager=la;var ga=la;var ha=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var ua=new class{constructor(){this.blobSupported=!0;try{da([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?(a=t,ma(a).then(e=>new Uint8Array(e))).then(t=>e.write(t)):e.write(t);var a}getFakeFileWriter(e,t){const a=[];return{write:e=>ha(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;a.push(e)})),truncate:()=>{a.length=0},finalize:(n=!0)=>{const s=da(a,e);return n&&t&&t(s),s}}}},fa=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};class _a{constructor(e){this.dbName=e,this.useStorage=!0,y.test&&(this.dbName+="_test"),_a.STORAGES.length&&(this.useStorage=_a.STORAGES[0].useStorage),this.openDatabase(),_a.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation(t=>t.delete("/"+e))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation(t=>t.match("/"+e))}save(e,t){return this.timeoutOperation(a=>a.put("/"+e,t))}getFile(e,t="blob"){return this.get(e).then(e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()})}saveFile(e,t){t instanceof Blob||(t=da(t));const a=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,a).then(()=>t)}timeoutOperation(e){return this.useStorage?new Promise((t,a)=>fa(this,void 0,void 0,(function*(){let n=!1;const s=setTimeout(()=>{a(),n=!0},15e3);try{const a=yield this.openDatabase();if(!a)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield e(a);if(n)return;t(s)}catch(e){a(e)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const a=ua.getFakeFileWriter(t,t=>this.saveFile(e,t).catch(()=>t));return Promise.resolve(a)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>{if(t.useStorage=e,!e)return t.deleteAll()}))}}_a.STORAGES=[];var va=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const ba=new class{constructor(){this.cacheStorage=new _a("cachedFiles"),this.cachedDownloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.webpConvertPromises={},this.refreshReferencePromises={},this.log=Ct("AFM",wt.Error|wt.Log),this.tempId=0,this.queueId=0,this.debug=y.debug,this.uncompressTGS=(e,t)=>Rt.invokeCrypto("gzipUncompress",e.slice().buffer,!0),this.convertWebp=(e,t)=>{const a=pa();return P({type:"convertWebp",payload:{fileName:t,bytes:e}}),this.webpConvertPromises[t]=a},setInterval(()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}},18e5)}downloadRequest(e,t,a,n,s=0){void 0===this.downloadPulls[e]&&(this.downloadPulls[e]=[],this.downloadActives[e]=0);const i=this.downloadPulls[e],r=new Promise((e,r)=>{i.push({id:t,queueId:s,cb:a,deferred:{resolve:e,reject:r},activeDelta:n})});return setTimeout(()=>{this.downloadCheck(e)},0),r}downloadCheck(e){const t=this.downloadPulls[e],a="upload"===e?24:36;if(this.downloadActives[e]>=a||!t||!t.length)return!1;const n=t.findAndSplice(e=>0===e.queueId)||t.findAndSplice(e=>e.queueId===this.queueId)||t.shift(),s=n.activeDelta||1;this.downloadActives[e]+=s,n.cb().then(t=>{this.downloadActives[e]-=s,this.downloadCheck(e),n.deferred.resolve(t)},t=>{t&&t.type&&("DOWNLOAD_CANCELED"===t.type||"UPLOAD_CANCELED"===t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=s,this.downloadCheck(e),n.deferred.reject(t)})}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=(this.cachedDownloadPromises[e]?[this.cachedDownloadPromises[e]]:void 0)||(this.uploadPromises[e]?Array.from(this.uploadPromises[e]):[]);let a=!1;for(let e=0,n=t.length;eva(this,void 0,void 0,(function*(){return r&&r(),ga.invokeApi("upload.getWebFile",{location:t,offset:a,limit:n},{dcId:e,fileDownload:!0})})),this.getDelta(n),i)}requestFilePart(e,t,a,s,i=0,r=0,p){return this.downloadRequest(e,i,()=>va(this,void 0,void 0,(function*(){p&&p();const i=()=>va(this,void 0,void 0,(function*(){p&&p();return ga.invokeApi("upload.getFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0}).catch(e=>{if("FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t).then(i);throw e})})),r=t.file_reference;if(r&&!t.checkedReference){t.checkedReference=!0;const e=n(r);if(this.refreshReferencePromises[e])return this.refreshReference(t).then(i)}return i()})),this.getDelta(s),r)}getDelta(e){return e/1024/128}getLimitPart(e){let t;return t=512,524288}refreshReference(e){const t=e.file_reference,a=n(t);let s=this.refreshReferencePromises[a];if(!s){const n=pa();s=this.refreshReferencePromises[a]={deferred:n,timeout:Jt.setTimeout(()=>{this.log.error("Didn't refresh the reference:",e),n.reject("REFERENCE_IS_NOT_REFRESHED")},6e4)},n.catch(Tt).finally(()=>{clearTimeout(s.timeout)});P({type:"refreshReference",payload:t})}return s.deferred.then(t=>{if(a===n(t))throw"REFERENCE_IS_NOT_REFRESHED";e.file_reference=t})}downloadFile(e){var t;if(!ua.isAvailable())return Promise.reject({type:"BROWSER_BLOB_NOT_SUPPORTED"});const a=null!==(t=e.size)&&void 0!==t?t:0,{dcId:n,location:s}=e;let i;"image/webp"!==e.mimeType||Ia()?"application/x-tgsticker"===e.mimeType&&(i=this.uncompressTGS,e.mimeType="application/json"):(i=this.convertWebp,e.mimeType="image/png");const r=function(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),n=""}return n+(a?"."+a:a)}(s,e.fileName),p=this.cachedDownloadPromises[r],o=this.getFileStorage();if(this.debug&&this.log("downloadFile",r,a,s,e.mimeType),p)return a?p.then(t=>t.sizethis.downloadFile(e)).catch(()=>this.downloadFile(e))):t):p;const m=pa(),d=e.mimeType||"image/jpeg";let y,c,l=!1,g=e=>{y=e,delete this.cachedDownloadPromises[r],m.reject(y),g=()=>{},!c||y&&"DOWNLOAD_CANCELED"===y.type||c.truncate()};const h=this.tempId++;o.getFile(r).then(e=>va(this,void 0,void 0,(function*(){if(e.size{o.getFileWriter(r,d).then(t=>{c=t;const p=e.limitPart||this.getLimitPart(a);let o,d,y=Promise.resolve();const f=(e,t)=>va(this,void 0,void 0,(function*(){if(i){return yield i(e,r)}return e})),_="inputWebFileLocation"===s._?this.requestWebFilePart.bind(this):this.requestFilePart.bind(this),v=[];o=0;do{d=pa(),v.push({offset:o,writeFilePromise:y,writeFileDeferred:d}),y=d,o+=p}while(ova(this,void 0,void 0,(function*(){const{offset:i,writeFilePromise:o,writeFileDeferred:d}=v.shift();try{u();const y=yield _(n,s,i,p,h,e.queueId,u),c=y.bytes;v.length&&P(),this.debug&&this.log("downloadFile requestFilePart result:",r,y);const g=i+p>=a||!c.byteLength;if(c.byteLength){b+=c.byteLength,m.notify({done:b,offset:i,total:a});const e=yield f(c);u(),yield o,u(),yield ua.write(t,e)}d.resolve(),g&&(l=!0,m.resolve(t.finalize(a<2e7)))}catch(e){g(e)}}));for(let e=0,t=Math.min(1/0,v.length);e{["STORAGE_OFFLINE"].includes(e)||this.log.error("saveFile error:",e)})});const u=()=>{if(y)throw y};return m.cancel=()=>{if(!y&&!l){const e=new Error("Canceled");e.type="DOWNLOAD_CANCELED",g(e)}},m.notify=e=>{w({progress:Object.assign({fileName:r},e)})},this.cachedDownloadPromises[r]=m,m.safeFinally(()=>{delete this.cachedDownloadPromises[r]}),m}deleteFile(e){return delete this.cachedDownloadPromises[e],this.getFileStorage().delete(e)}uploadFile({file:e,fileName:t}){var a;const n=e.size,s=n>=10485760;let i=!1,r=!1,p=0,o=262144;n>67108864?o=524288:n<102400&&(o=32768);const m=this.getDelta(o),d=Math.ceil(n/o),y=""+st(32)+st(32)%16777215;let c=0;const l={_:s?"inputFileBig":"inputFile",id:y,parts:d,name:t,md5_checksum:""},g={notify:e=>{}},h=new Promise((e,t)=>{if(d>4e3)return t({type:"FILE_TOO_BIG"});g.resolve=e,g.reject=t});if(Object.assign(h,g),d>4e3)return h;let u=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),h.reject(e),i=!0,u=()=>{}};const f=s?"upload.saveBigFilePart":"upload.saveFilePart",_=this.tempId++,v=this;const b=function*(){for(let t=0;tma(e.slice(t,t+o)).then(e=>{if(i)throw{type:"UPLOAD_CANCELED"};return v.debug&&v.log("Upload file part, isBig:",s,a,e.byteLength,new Uint8Array(e).length,new Uint8Array(e).slice().length),ga.invokeApi(f,{file_id:y,file_part:a,file_total_parts:d,bytes:e},{fileUpload:!0}).then(e=>{p++,h.notify({done:p*o,total:n}),p>=d&&(h.resolve(l),r=!0)},u)}),m).catch(u)}}(),P=()=>{if(i)return;const e=b.next();e.done||i||e.value.then(P)};for(let e=0,t=Math.min(1/0,d);e{i||r||(i=!0,u({type:"UPLOAD_CANCELED"}))},h.notify=e=>{w({progress:Object.assign({fileName:t},e)})},h.finally(()=>{S.delete(h),S.size||delete this.uploadPromises[t]});const S=null!==(a=this.uploadPromises[t])&&void 0!==a?a:this.uploadPromises[t]=new Set;return S.add(h),h}};l.apiFileManager=ba;var Pa=ba,wa=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};let Sa=!1;const Ia=()=>Sa;Ot.setUpdatesProcessor(e=>{w({update:e})}),Ot.onConnectionStatusChange=e=>{w({type:"connectionStatusChange",payload:e})};const ka={convertWebp:e=>{const{fileName:t,bytes:a}=e.payload,n=Pa.webpConvertPromises[t];n&&(n.resolve(a),delete Pa.webpConvertPromises[t])},webpSupport:e=>{Sa=e.payload},socketProxy:e=>{const t=e.payload,a=t.id,n=$t.get(a);"message"===t.type?n.dispatchEvent("message",t.payload):"open"===t.type?n.dispatchEvent("open"):"close"===t.type&&(n.dispatchEvent("close"),$t.delete(a))},localStorageProxy:e=>{A.finishTask(e.id,e.payload)},userAgent:e=>{Ot.userAgent=e.payload},online:()=>{Ot.forceReconnectTimeout()},forceReconnect:()=>{Ot.forceReconnect()},toggleStorage:e=>{const t=e.payload;_a.toggleStorage(t)},refreshReference:e=>{const t=n(e.originalPayload),a=Pa.refreshReferencePromises[t],s=null==a?void 0:a.deferred;s&&(e.error?s.reject(e.error):s.resolve(e.payload))}};Jt.addEventListener("message",e=>wa(void 0,void 0,void 0,(function*(){try{const t=e.data,a=t.taskId,n=ka[t.type];if(n)return void n(t);if(!t.task)return;switch(t.task){case"computeSRP":case"gzipUncompress":return Rt.invokeCrypto(t.task,...t.args).then(e=>{w({taskId:a,result:e})});case"requestFilePart":case"setQueueId":case"cancelDownload":case"uploadFile":case"downloadFile":try{let e=Pa[t.task].apply(Pa,t.args);e instanceof Promise&&(e=yield e),w({taskId:a,result:e})}catch(e){w({taskId:a,error:e})}break;case"getNetworker":ga[t.task].apply(ga,t.args).finally(()=>{w({taskId:a,result:null})});break;case"setLanguage":case"startAll":case"stopAll":Ot[t.task].apply(Ot,t.args);break;default:try{let e=ga[t.task].apply(ga,t.args);e instanceof Promise&&(e=yield e),w({taskId:a,result:e})}catch(e){w({taskId:a,error:e})}}}catch(e){console.error("worker task error:",e)}}))),w("ready")}]); -//# sourceMappingURL=mtproto.worker.e3c0dc69d0f5dd450f72.bundle.worker.js.map \ No newline at end of file diff --git a/public/mtproto.worker.e3c0dc69d0f5dd450f72.bundle.worker.js.map b/public/mtproto.worker.e3c0dc69d0f5dd450f72.bundle.worker.js.map deleted file mode 100644 index c0ee8d05d..000000000 --- a/public/mtproto.worker.e3c0dc69d0f5dd450f72.bundle.worker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/pako/dist/pako_inflate.min.js","webpack:///./src/helpers/bytes.ts","webpack:///./src/lib/polyfill.ts","webpack:///./src/config/modes.ts","webpack:///./src/config/debug.ts","webpack:///./src/helpers/context.ts","webpack:///./src/lib/localStorage.ts","webpack:///./src/lib/sessionStorage.ts","webpack:///./src/vendor/leemon.ts","webpack:///./src/lib/mtproto/bin_utils.ts","webpack:///./src/lib/mtproto/schema.ts","webpack:///./node_modules/@cryptography/aes/dist/es/aes.js","webpack:///./src/helpers/random.ts","webpack:///./src/lib/crypto/crypto_utils.ts","webpack:///./src/lib/mtproto/tl_utils.ts","webpack:///./src/lib/logger.ts","webpack:///./src/lib/crypto/srp.ts","webpack:///./src/lib/crypto/cryptoworker.ts","webpack:///./src/lib/crypto/crypto_methods.ts","webpack:///./src/lib/mtproto/timeManager.ts","webpack:///./src/config/app.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/lib/mtproto/connectionStatus.ts","webpack:///./src/lib/mtproto/networker.ts","webpack:///./src/helpers/array.ts","webpack:///./src/lib/mtproto/networkerFactory.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/lib/mtproto/transports/websocket.ts","webpack:///./src/lib/mtproto/transports/obfuscation.ts","webpack:///./src/lib/mtproto/transports/intermediate.ts","webpack:///./src/lib/mtproto/transports/tcpObfuscated.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/environment/userAgent.ts","webpack:///./src/lib/mtproto/transports/socketProxied.ts","webpack:///./src/lib/mtproto/dcConfigurator.ts","webpack:///./src/lib/mtproto/rsaKeysManager.ts","webpack:///./src/lib/mtproto/authorizer.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/helpers/blob.ts","webpack:///./src/lib/idb.ts","webpack:///./src/helpers/object.ts","webpack:///./src/lib/mtproto/apiManager.ts","webpack:///./src/lib/filemanager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/lib/mtproto/apiFileManager.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/lib/mtproto/mtproto.worker.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","e","a","Uint32Array","f","h","u","w","b","k","_","g","v","y","x","E","R","A","state","next_in","input","avail_in","next_out","output","avail_out","dmax","wsize","whave","wnext","window","hold","bits","lencode","distcode","lenbits","distbits","msg","sane","Uint16Array","Uint8Array","Z","S","O","U","T","D","I","B","N","C","z","F","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","this","last","wrap","havedict","flags","check","total","head","wbits","length","offset","extra","ncode","nlen","ndist","have","next","lens","work","lendyn","distdyn","back","was","total_in","total_out","adler","Int32Array","set","subarray","L","M","H","j","K","P","Y","G","X","W","done","text","time","xflags","os","extra_len","String","fromCharCode","comment","hcrc","data_type","apply","Array","2","1","0","toString","q","J","Q","V","$","ee","te","ie","ne","options","slice","arguments","shift","TypeError","chunkSize","windowBits","to","raw","err","ended","chunks","strm","Error","header","dictionary","charCodeAt","ae","push","result","onEnd","onData","join","re","se","oe","le","de","fe","Inflate","inflate","inflateRaw","ungzip","constants","default","bytesToHex","bytes","arr","bytesFromHex","hexString","len","Math","ceil","start","parseInt","charAt","substr","bytesCmp","bytes1","bytes2","bytesXor","convertToUint8Array","TextEncoder","encode","bufferConcats","args","reduce","acc","byteLength","tmp","lastLength","forEach","ArrayBuffer","bytesFromWordss","bytesToWordss","words","str","configurable","randomize","crypto","getRandomValues","concat","toJSON","findAndSplice","verify","index","findIndex","splice","undefined","toHHMMSS","leadZero","sec_num","hours","floor","minutes","seconds","Promise","finally","fn","onFinally","callback","resolve","then","reason","reject","safeFinally","catch","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","DEBUG","MOUNT_CLASS_TO","self","isWebWorker","WorkerGlobalScope","isServiceWorker","ServiceWorkerGlobalScope","isWorker","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","listeners","listener","postMessage","notifyWorker","noop","notifySomeone","notifyAll","prefix","cache","useStorage","useCache","localStorage","getItem","JSON","parse","obj","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","keys","delete","enabled","clear","taskId","tasks","STORAGES","storage","id","payload","proxy","sessionStorage","appStorage","radix","bpe","mask","digitsStr","one","int2bigInt","s0","s3","s4","s5","s6","s7","sa","eg_u","eg_A","eg_B","eg_C","eg_D","bitSize","expand","ans","copy_","mod","dup","mod_","trim","mult","copyInt_","linCombShift_","mult_","powMod","powMod_","sub","sub_","add","add_","eGCD_","max","halve_","greater","equalsInt","negative","multInt_","leftShift_","greaterShift","kx","ky","divide_","y1","y2","subShift_","addShift_","rightShift_","modInt","minSize","buff","str2bigInt","base","kk","substring","addInt_","equals","isZero","bigInt2str","divInt_","bigInt2bytes","littleEndian","out","reverse","cmp","ys","multMod_","squareMod_","k1","k2","kn","np","inverseModInt","mont_","ui","ks","isObject","intToUint","val","longFromInts","high","low","bigInt","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","needPadding","padding","buffer","Si","T1","T2","T3","T4","T5","T6","T7","T8","getWords","buf","pos","xor","left","right","x2","x4","tEnc","tDec","xInv","computeTables","AES","_key","encKey","decKey","rcon","encrypt","_message","a2","b2","c2","message","rounds","decrypt","AES_IGE","iv","cipher","cipherText","prevX","prevY","yXOR","counter","incrementCounter","carry","arrays","8","16","32","nextRandomUint","array","subtle","sha1HashSync","digest","sha256HashSync","aesEncryptSync","keyBytes","ivBytes","aesDecryptSync","rsaEncrypt","publicKey","modulus","exponent","hash_pbkdf2","salt","iterations","importKey","deriveBits","hash","pqPrimeFactorization","pqBytes","what","lim","minLen","it","pqPrimeLeemon","console","error","bytesModPow","xBigInt","yBigInt","mBigInt","gzipUncompress","boolFalse","API","constructors","find","predicate","boolTrue","vector","gzipPacked","MTProto","maxLength","mtproto","startMaxLength","createBuffer","intView","byteView","resultBuffer","resultInt32","getArray","typed","resultArray","needBytes","previousBuffer","previousArray","field","log","checkLength","writeInt","iHigh","iLow","sLong","isArray","storeLongP","storeIntBytes","Float64Array","sUTF8","unescape","encodeURIComponent","methodName","params","methodData","methods","method","storeInt","pFlags","flagsOffsets","param","condType","split","fieldBit","storeObject","paramName","storeLong","storeString","storeBytes","storeDouble","storeBool","itemType","toLowerCase","schema","isBare","constructorData","override","hex","readInt","doubleView","longDec","num","Number","isSafeInteger","fetchObject","decodeURIComponent","escape","fetchInt","fetchLong","fetchIntBytes","fetchString","fetchBytes","fetchDouble","fetchBool","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","TLDeserialization","TLSerialization","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","_logTimer","Date","now","dT","toFixed","logger","ignoreDebugReset","warn","info","trace","setPrefix","_prefix","setLevel","level","computeSRP","password","isNew","algo","new_algo","current_algo","client_salt","server_salt","invokeCrypto","makePasswordHash","salt1","salt2","padArray","flipper","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","a_for_hash","secure_random","generate_and_check_random","g_b","h1","M1","srp_id","performTaskWorker","super","webWorker","awaiting","pending","utils","task","timeManager","lastMessageId","timeOffset","timeTicks","messageId","serverTime","localTime","newTimeOffset","changed","abs","server_time_offset","App","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","hostname","suffix","ConnectionStatus","invokeAfterMsgConstructor","dcId","authKey","authKeyId","serverSalt","transport","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResends","connectionInited","nextReq","seqNo","lastResendReq","isOnline","status","Closed","lastResponseTime","activeRequests","authKeyUint8","isFileUpload","fileUpload","isFileDownload","fileDownload","isFileNetworker","updateSession","networker","connected","setConnectionStatus","Connected","prevSessionId","sessionId","sentMessageId","sentMessage","container","forEachReverse","inner","innerSentMessageId","idx","innerSentMessage","updateSentMessage","msg_id","generateId","seq_no","generateSeqNo","notContentRelated","serializer","storeMethod","body","getBytes","pushMessage","invokeWithLayer","layer","initConnection","userAgent","navigator","platform","language","afterMessageId","resultType","isAPI","destroy","reconnect","forceReconnect","promise","assign","deferred","noSchedule","scheduleRequest","noResponse","timeout","setTimeout","TimedOut","clearTimeout","setDrainTimeout","onDrainTimeout","onDrain","retryAt","willChange","onConnectionStatusChange","delay","innerMsgId","acked","dataWithPadding","isOut","msgKeyLargePlain","msgKeyLarge","msgKey","sha2aText","sha2bText","promises","results","aesKey","aesIv","sha2a","sha2b","akStopped","isStopped","ackMsgIds","wrapMtpMessage","msg_ids","resendMsgIds","resendOpts","req_msg_id","resend_msg_ids","outMessage","messages","messagesByteLen","lengthOverflow","map","long","sort","messageByteLength","generateContainerMessage","messageWithBody","sendEncryptedRequest","cleanupSent","innerMessages","storeRawBytes","getMsgKey","keyIv","getAesKeyIv","encryptedData","data","dataBuffer","getBuffer","paddingLength","getOffset","getEncryptedMessage","encryptedResult","request","getEncryptedOutput","requestData","send","responseBuffer","deserializer","fetchRawBytes","getDecryptedMessage","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","stack","setOffset","mt_rpc_result","response","newServerSalt","nextReqTimeout","cb","performScheduledRequest","msgId","notEmpty","rawError","matches","error_message","match","error_code","code","description","originalError","pushResend","innerMessage","processMessage","applyServerSalt","new_server_salt","bad_msg_id","ackMessage","changedOffset","applyServerTime","badMessage","processMessageAck","first_msg_id","updatesProcessor","answer_msg_id","reqResendMessage","badMsgId","processError","networkerFactory","networkers","stoppedNetworkers","filter","langCode","forceReconnectTimeout","EventListenerBase","reuseResults","_constructor","listenerResults","once","pop","addEventListener","removeEventListener","url","logSuffix","handleOpen","dispatchEvent","handleError","close","handleClose","removeListeners","handleMessage","event","ws","logTypes","connect","WebSocket","binaryType","Counter","initialValue","_counter","_remainingCounter","_remainingCounterIndex","_aes","encrypted","increment","Obfuscation","codec","initPayload","val2","reversedPayload","encIv","decIv","encNew","decNew","obfuscateTag","update","tag","Connection","retryTimeout","intermediate","obfuscation","autoReconnect","onOpen","init","connection","resend","encoded","encodeBody","releasePending","onMessage","decode","readPacket","parseResponse","onClose","needTimeout","lastCloseTime","isNaN","reconnectTimeout","Connecting","bodySent","setAutoReconnect","enable","toEncode","encodePacket","USER_AGENT","IS_SAFARI","vendor","maxTouchPoints","MSStream","socketId","socketsProxied","Map","TEST_SUFFIX","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","connectionType","path","chosenServer","transportType","reuse","client","download","upload","servers","transports","testPublicKeysHex","publisKeysHex","publicKeysParsed","prepared","preparePromise","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","prepare","fingerprintHex","fill","foundKey","fingerprint","cached","requestArray","requestLength","headerArray","dcConfigurator","chooseServer","baseError","errorCode","auth_key_id","msg_len","auth","nonce","sendPlainRequest","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","select","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","dc","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","_gABigInt","_dhPrimeBigInt","_twoPow","pow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","new_nonce_hash2","new_nonce_hash3","localTry","sendReqPQ","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","lastNotify","addNotifyListener","cancel","readBlobAs","blob","reader","FileReader","target","readBlobAsArrayBuffer","blobConstruct","blobParts","mimeType","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","db","storeName","storageIsAvailable","fromObject","safeAssign","openDatabase","preserve","onclose","createNew","openDbPromise","indexedDB","open","finished","onerror","onsuccess","calledNew","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","store","objectStoreNames","contains","createObjectStore","indexes","createIndex","indexName","keyPath","objectParameters","entryName","getObjectStore","objectStore","put","fileName","save","perf","performance","oncomplete","requests","getAll","apiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","afterMessageTempIds","setBaseDcId","userAuth","dcID","getBaseDcId","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","storageKeys","storageResult","logoutPromises","invokeApi","ignoreErrors","closeDatabases","handled","maxNetworkers","found","unshift","getKey","ak","ss","authKeyHex","serverSaltHex","authorizer","storeObj","canRelease","removeNetworker","removeTransport","prepareTempMessageId","startTime","interval","setInterval","cachedNetworker","clearInterval","rejectPromise","logOut","noErrorBox","performRequest","after","wrapApiCall","exportResolve","exportReject","dc_id","exportedAuth","newDcId","includes","stopTime","waitTime","min","floodMaxTimeout","blobSupported","fileWriter","write","saveFileCallback","part","truncate","finalize","saveToStorage","dbName","caches","timeoutOperation","Response","headers","size","rejected","res","fakeWriter","getFakeFileWriter","saveFile","deleteAll","apiFileManager","cacheStorage","cachedDownloadPromises","uploadPromises","downloadPulls","downloadActives","webpConvertPromises","refreshReferencePromises","tempId","queueId","uncompressTGS","convertWebp","convertPromise","activeDelta","downloadPull","downloadCheck","downloadLimit","from","canceled","limit","checkCancel","downloadRequest","getDelta","invoke","refreshReference","reference","file_reference","checkedReference","inputFileLocation","isAvailable","process","isWebpSupported","ext","thumb_size","Boolean","photo_id","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","getFileNameByLocation","cachedPromise","fileStorage","getFileStorage","deleteFile","downloadFile","cacheFileWriter","resolved","errorHandler","_error","getFile","getFileWriter","limitPart","getLimitPart","writeFileDeferred","writeFilePromise","processDownloaded","requestWebFilePart","requestFilePart","delayed","superpuper","isFinal","processedResult","Infinity","progress","file","fileSize","isBigFile","doneParts","partSize","totalParts","fileId","_part","resultInputFile","parts","md5_checksum","details","file_id","file_part","file_total_parts","generator","Set","webpSupported","setUpdatesProcessor","taskListeners","webpSupport","socketProxy","socketTask","socketProxied","localStorageProxy","finishTask","online","toggleStorage","originalPayload"],"mappings":"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","file":"mtproto.worker.e3c0dc69d0f5dd450f72.bundle.worker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","/*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=\"undefined\"!=typeof globalThis?globalThis:e||self).pako={})}(this,(function(e){\"use strict\";var t=(e,t,i,n)=>{let a=65535&e|0,r=e>>>16&65535|0,s=0;for(;0!==i;){s=i>2e3?2e3:i,i-=s;do{a=a+t[n++]|0,r=r+a|0}while(--s);a%=65521,r%=65521}return a|r<<16|0};const i=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());var n=(e,t,n,a)=>{const r=i,s=a+n;e^=-1;for(let i=a;i>>8^r[255&(e^t[i])];return-1^e};var a=function(e,t){let i,n,a,r,s,o,l,d,f,h,c,u,w,b,k,m,_,g,v,p,y,x,E,R;const A=e.state;i=e.next_in,E=e.input,n=i+(e.avail_in-5),a=e.next_out,R=e.output,r=a-(t-e.avail_out),s=a+(e.avail_out-257),o=A.dmax,l=A.wsize,d=A.whave,f=A.wnext,h=A.window,c=A.hold,u=A.bits,w=A.lencode,b=A.distcode,k=(1<>>24,c>>>=g,u-=g,g=_>>>16&255,0===g)R[a++]=65535&_;else{if(!(16&g)){if(0==(64&g)){_=w[(65535&_)+(c&(1<>>=g,u-=g),u<15&&(c+=E[i++]<>>24,c>>>=g,u-=g,g=_>>>16&255,!(16&g)){if(0==(64&g)){_=b[(65535&_)+(c&(1<o){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(c>>>=g,u-=g,g=a-r,p>g){if(g=p-g,g>d&&A.sane){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(y=0,x=h,0===f){if(y+=l-g,g2;)R[a++]=x[y++],R[a++]=x[y++],R[a++]=x[y++],v-=3;v&&(R[a++]=x[y++],v>1&&(R[a++]=x[y++]))}else{y=a-p;do{R[a++]=R[y++],R[a++]=R[y++],R[a++]=R[y++],v-=3}while(v>2);v&&(R[a++]=R[y++],v>1&&(R[a++]=R[y++]))}break}}break}}while(i>3,i-=v,u-=v<<3,c&=(1<{const u=c.bits;let w,b,k,m,_,g,v=0,p=0,y=0,x=0,E=0,R=0,A=0,Z=0,S=0,O=0,U=null,T=0;const D=new Uint16Array(16),I=new Uint16Array(16);let B,N,C,z=null,F=0;for(v=0;v<=r;v++)D[v]=0;for(p=0;p=1&&0===D[x];x--);if(E>x&&(E=x),0===x)return a[f++]=20971520,a[f++]=20971520,c.bits=1,0;for(y=1;y0&&(0===e||1!==x))return-1;for(I[1]=0,v=1;v852||2===e&&S>592)return 1;for(;;){B=v-A,h[p]g?(N=z[F+h[p]],C=U[T+h[p]]):(N=96,C=0),w=1<>A)+b]=B<<24|N<<16|C|0}while(0!==b);for(w=1<>=1;if(0!==w?(O&=w-1,O+=w):O=0,p++,0==--D[v]){if(v===x)break;v=t[i+h[p]]}if(v>E&&(O&m)!==k){for(0===A&&(A=E),_+=y,R=v-A,Z=1<852||2===e&&S>592)return 1;k=O&m,a[k]=E<<24|R<<16|_-f|0}}return 0!==O&&(a[_+O]=v-A<<24|64<<16|0),c.bits=E,0},h={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:c,Z_BLOCK:u,Z_TREES:w,Z_OK:b,Z_STREAM_END:k,Z_NEED_DICT:m,Z_STREAM_ERROR:_,Z_DATA_ERROR:g,Z_MEM_ERROR:v,Z_BUF_ERROR:p,Z_DEFLATED:y}=h,x=12,E=30,R=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function A(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Z=e=>{if(!e||!e.state)return _;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,b},S=e=>{if(!e||!e.state)return _;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,Z(e)},O=(e,t)=>{let i;if(!e||!e.state)return _;const n=e.state;return t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?_:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,S(e))},U=(e,t)=>{if(!e)return _;const i=new A;e.state=i,i.window=null;const n=O(e,t);return n!==b&&(e.state=null),n};let T,D,I=!0;const B=e=>{if(I){T=new Int32Array(512),D=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(f(1,e.lens,0,288,T,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;f(2,e.lens,0,32,D,0,e.work,{bits:5}),I=!1}e.lencode=T,e.lenbits=9,e.distcode=D,e.distbits=5},N=(e,t,i,n)=>{let a;const r=e.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(t.subarray(i-r.wsize,i),0),r.wnext=0,r.whave=r.wsize):(a=r.wsize-r.wnext,a>n&&(a=n),r.window.set(t.subarray(i-n,i-n+a),r.wnext),(n-=a)?(r.window.set(t.subarray(i-n,i),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whaveU(e,15),inflateInit2:U,inflate:(e,i)=>{let r,s,o,l,d,h,A,Z,S,O,U,T,D,I,C,z,F,L,M,H,j,K,P=0;const Y=new Uint8Array(4);let G,X;const W=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return _;r=e.state,r.mode===x&&(r.mode=13),d=e.next_out,o=e.output,A=e.avail_out,l=e.next_in,s=e.input,h=e.avail_in,Z=r.hold,S=r.bits,O=h,U=A,K=b;e:for(;;)switch(r.mode){case 1:if(0===r.wrap){r.mode=13;break}for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,r.check=n(r.check,Y,2,0),Z=0,S=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&Z)<<8)+(Z>>8))%31){e.msg=\"incorrect header check\",r.mode=E;break}if((15&Z)!==y){e.msg=\"unknown compression method\",r.mode=E;break}if(Z>>>=4,S-=4,j=8+(15&Z),0===r.wbits)r.wbits=j;else if(j>r.wbits){e.msg=\"invalid window size\",r.mode=E;break}r.dmax=1<>8&1),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=3;case 3:for(;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,Y[2]=Z>>>16&255,Y[3]=Z>>>24&255,r.check=n(r.check,Y,4,0)),Z=0,S=0,r.mode=4;case 4:for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>8),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=5;case 5:if(1024&r.flags){for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(T=r.length,T>h&&(T=h),T&&(r.head&&(j=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Uint8Array(r.head.extra_len)),r.head.extra.set(s.subarray(l,l+T),j)),512&r.flags&&(r.check=n(r.check,s,T,l)),h-=T,l+=T,r.length-=T),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===h)break e;T=0;do{j=s[l+T++],r.head&&j&&r.length<65536&&(r.head.name+=String.fromCharCode(j))}while(j&&T>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=x;break;case 10:for(;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>=7&S,S-=7&S,r.mode=27;break}for(;S<3;){if(0===h)break e;h--,Z+=s[l++]<>>=1,S-=1,3&Z){case 0:r.mode=14;break;case 1:if(B(r),r.mode=20,i===w){Z>>>=2,S-=2;break e}break;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=E}Z>>>=2,S-=2;break;case 14:for(Z>>>=7&S,S-=7&S;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=E;break}if(r.length=65535&Z,Z=0,S=0,r.mode=15,i===w)break e;case 15:r.mode=16;case 16:if(T=r.length,T){if(T>h&&(T=h),T>A&&(T=A),0===T)break e;o.set(s.subarray(l,l+T),d),h-=T,l+=T,A-=T,d+=T,r.length-=T;break}r.mode=x;break;case 17:for(;S<14;){if(0===h)break e;h--,Z+=s[l++]<>>=5,S-=5,r.ndist=1+(31&Z),Z>>>=5,S-=5,r.ncode=4+(15&Z),Z>>>=4,S-=4,r.nlen>286||r.ndist>30){e.msg=\"too many length or distance symbols\",r.mode=E;break}r.have=0,r.mode=18;case 18:for(;r.have>>=3,S-=3}for(;r.have<19;)r.lens[W[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,G={bits:r.lenbits},K=f(0,r.lens,0,19,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid code lengths set\",r.mode=E;break}r.have=0,r.mode=19;case 19:for(;r.have>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=C,S-=C,r.lens[r.have++]=F;else{if(16===F){for(X=C+2;S>>=C,S-=C,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=E;break}j=r.lens[r.have-1],T=3+(3&Z),Z>>>=2,S-=2}else if(17===F){for(X=C+3;S>>=C,S-=C,j=0,T=3+(7&Z),Z>>>=3,S-=3}else{for(X=C+7;S>>=C,S-=C,j=0,T=11+(127&Z),Z>>>=7,S-=7}if(r.have+T>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=E;break}for(;T--;)r.lens[r.have++]=j}}if(r.mode===E)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=E;break}if(r.lenbits=9,G={bits:r.lenbits},K=f(1,r.lens,0,r.nlen,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid literal/lengths set\",r.mode=E;break}if(r.distbits=6,r.distcode=r.distdyn,G={bits:r.distbits},K=f(2,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,G),r.distbits=G.bits,K){e.msg=\"invalid distances set\",r.mode=E;break}if(r.mode=20,i===w)break e;case 20:r.mode=21;case 21:if(h>=6&&A>=258){e.next_out=d,e.avail_out=A,e.next_in=l,e.avail_in=h,r.hold=Z,r.bits=S,a(e,U),d=e.next_out,o=e.output,A=e.avail_out,l=e.next_in,s=e.input,h=e.avail_in,Z=r.hold,S=r.bits,r.mode===x&&(r.back=-1);break}for(r.back=0;P=r.lencode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,r.length=F,0===z){r.mode=26;break}if(32&z){r.back=-1,r.mode=x;break}if(64&z){e.msg=\"invalid literal/length code\",r.mode=E;break}r.extra=15&z,r.mode=22;case 22:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;P=r.distcode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,64&z){e.msg=\"invalid distance code\",r.mode=E;break}r.offset=F,r.extra=15&z,r.mode=24;case 24:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=E;break}r.mode=25;case 25:if(0===A)break e;if(T=U-A,r.offset>T){if(T=r.offset-T,T>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=E;break}T>r.wnext?(T-=r.wnext,D=r.wsize-T):D=r.wnext-T,T>r.length&&(T=r.length),I=r.window}else I=o,D=d-r.offset,T=r.length;T>A&&(T=A),A-=T,r.length-=T;do{o[d++]=I[D++]}while(--T);0===r.length&&(r.mode=21);break;case 26:if(0===A)break e;o[d++]=r.length,A--,r.mode=21;break;case 27:if(r.wrap){for(;S<32;){if(0===h)break e;h--,Z|=s[l++]<{if(!e||!e.state)return _;let t=e.state;return t.window&&(t.window=null),e.state=null,b},inflateGetHeader:(e,t)=>{if(!e||!e.state)return _;const i=e.state;return 0==(2&i.wrap)?_:(i.head=t,t.done=!1,b)},inflateSetDictionary:(e,i)=>{const n=i.length;let a,r,s;return e&&e.state?(a=e.state,0!==a.wrap&&11!==a.mode?_:11===a.mode&&(r=1,r=t(r,i,n,0),r!==a.check)?g:(s=N(e,i,n,n),s?(a.mode=31,v):(a.havedict=1,b))):_},inflateInfo:\"pako inflate (from Nodeca project)\"};const z=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var F=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const i=t.shift();if(i){if(\"object\"!=typeof i)throw new TypeError(i+\"must be non-object\");for(const t in i)z(i,t)&&(e[t]=i[t])}}return e},L=e=>{let t=0;for(let i=0,n=e.length;i=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;H[254]=H[254]=1;var j=e=>{let t,i,n,a,r,s=e.length,o=0;for(a=0;a>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},K=(e,t)=>{let i,n;const a=t||e.length,r=new Array(2*a);for(n=0,i=0;i4)r[n++]=65533,i+=s-1;else{for(t&=2===s?31:3===s?15:7;s>1&&i1?r[n++]=65533:t<65536?r[n++]=t:(t-=65536,r[n++]=55296|t>>10&1023,r[n++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&M)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let i=\"\";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let i=t-1;for(;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+H[e[i]]>t?i:t},Y={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"};var G=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0};var X=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1};const W=Object.prototype.toString,{Z_NO_FLUSH:q,Z_FINISH:J,Z_OK:Q,Z_STREAM_END:V,Z_NEED_DICT:$,Z_STREAM_ERROR:ee,Z_DATA_ERROR:te,Z_MEM_ERROR:ie}=h;function ne(e){this.options=F({chunkSize:65536,windowBits:15,to:\"\"},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new G,this.strm.avail_out=0;let i=C.inflateInit2(this.strm,t.windowBits);if(i!==Q)throw new Error(Y[i]);if(this.header=new X,C.inflateGetHeader(this.strm,this.header),t.dictionary&&(\"string\"==typeof t.dictionary?t.dictionary=j(t.dictionary):\"[object ArrayBuffer]\"===W.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=C.inflateSetDictionary(this.strm,t.dictionary),i!==Q)))throw new Error(Y[i])}function ae(e,t){const i=new ne(t);if(i.push(e),i.err)throw i.msg||Y[i.err];return i.result}ne.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize,a=this.options.dictionary;let r,s,o;if(this.ended)return!1;for(s=t===~~t?t:!0===t?J:q,\"[object ArrayBuffer]\"===W.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;;){for(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),r=C.inflate(i,s),r===$&&a&&(r=C.inflateSetDictionary(i,a),r===Q?r=C.inflate(i,s):r===te&&(r=$));i.avail_in>0&&r===V&&i.state.wrap>0&&0!==e[i.next_in];)C.inflateReset(i),r=C.inflate(i,s);switch(r){case ee:case te:case $:case ie:return this.onEnd(r),this.ended=!0,!1}if(o=i.avail_out,i.next_out&&(0===i.avail_out||r===V))if(\"string\"===this.options.to){let e=P(i.output,i.next_out),t=i.next_out-e,a=K(i.output,e);i.next_out=t,i.avail_out=n-t,t&&i.output.set(i.output.subarray(e,e+t),0),this.onData(a)}else this.onData(i.output.length===i.next_out?i.output:i.output.subarray(0,i.next_out));if(r!==Q||0!==o){if(r===V)return r=C.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,!0;if(0===i.avail_in)break}}return!0},ne.prototype.onData=function(e){this.chunks.push(e)},ne.prototype.onEnd=function(e){e===Q&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=L(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var re=ne,se=ae,oe=function(e,t){return(t=t||{}).raw=!0,ae(e,t)},le=ae,de=h,fe={Inflate:re,inflate:se,inflateRaw:oe,ungzip:le,constants:de};e.Inflate=re,e.constants=de,e.default=fe,e.inflate=se,e.inflateRaw=oe,e.ungzip=le,Object.defineProperty(e,\"__esModule\",{value:!0})}));\n","/*\r\n * https://github.com/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 function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[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 { bytesToHex, bytesFromHex, bufferConcats } from '../helpers/bytes';\n\nObject.defineProperty(Uint8Array.prototype, 'hex', {\n get: function(): string {\n return bytesToHex(this);\n },\n \n set: function(str: string) {\n this.set(bytesFromHex(str));\n },\n enumerable: true,\n configurable: true\n});\n\nUint8Array.prototype.randomize = function() {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(this);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return this;\n};\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\nArray.prototype.findAndSplice = function(verify: (value: T, index?: number, array?: Array) => boolean) {\n let index = this.findIndex(verify);\n return index !== -1 ? this.splice(index, 1)[0] : undefined;\n};\n\nString.prototype.toHHMMSS = function(leadZero = false) {\n const sec_num = parseInt(this + '', 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/* Promise.prototype.finally = Promise.prototype.finally || {\n finally(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}.finally; */\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\nPromise.prototype.safeFinally = function(this: Promise, fn: () => any) {\n return this.catch(() => {}).finally(fn);\n};\n\ndeclare global {\n interface Uint8Array {\n hex: string;\n randomize: () => Uint8Array,\n concat: (...args: Array) => Uint8Array,\n //toString: () => string,\n toJSON: () => number[],\n //toJSON: () => {type: 'bytes', value: number[]},\n }\n \n interface Array {\n findAndSplice(verify: (value: T, index?: number, array?: Array) => boolean): T;\n }\n \n interface String {\n toHHMMSS(leadZero?: boolean): string;\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n safeFinally: (onfinally?: () => void) => Promise;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false, //location.search.indexOf('http=1') > 0,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false\r\n};\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport const isWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;\r\nexport const isServiceWorker = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const isWorker = isWebWorker || isServiceWorker;\r\n\r\n// в SW может быть сразу две переменных TRUE, поэтому проверяю по последней\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = isServiceWorker ? notifyServiceWorker.bind(null, false) : (isWebWorker ? notifyWorker : noop);\r\nexport const notifyAll = isServiceWorker ? notifyServiceWorker.bind(null, true) : (isWebWorker ? notifyWorker : noop);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { notifySomeone, isWorker } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach(key => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n private taskId = 0;\r\n private tasks: {[taskID: number]: (result: any) => void} = {};\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!isWorker) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n public finishTask(taskId: number, result: any) {\r\n //this.log('finishTask:', taskID, result, Object.keys(this.tasks));\r\n\r\n if(!this.tasks.hasOwnProperty(taskId)) {\r\n //this.log('no such task:', taskID, result);\r\n return;\r\n }\r\n\r\n this.tasks[taskId](result);\r\n delete this.tasks[taskId];\r\n }\r\n\r\n private proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']) {\r\n return new Promise((resolve, reject) => {\r\n if(isWorker) {\r\n const taskId = this.taskId++;\r\n\r\n this.tasks[taskId] = resolve;\r\n const task: LocalStorageProxyTask = {\r\n type: 'localStorageProxy', \r\n id: taskId,\r\n payload: {\r\n type,\r\n args\r\n }\r\n };\r\n\r\n notifySomeone(task);\r\n } else {\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n const result: any = this.storage[type].apply(this.storage, args as any);\r\n resolve(result);\r\n }\r\n });\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.proxy('toggleStorage', enabled);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n }\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\r\n","'use strict'\n//@flow\n\n/** * * * * * * * * * *\n * Big Integer Library *\n * Created 2000 *\n * Leemon Baird *\n * www.leemon.com *\n * * * * * * * * * * * */\n\n////////////////////////////////////////////////////////////////////////////////////////\n// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.\n// For most functions, if it needs a BigInt as a local variable it will actually use\n// a global, and will only allocate to it only when it's not the right size. This ensures\n// that when a function is called repeatedly with same-sized parameters, it only allocates\n// memory on the first call.\n//\n// Note that for cryptographic purposes, the calls to Math.random() must\n// be replaced with calls to a better pseudorandom number generator.\n//\n// In the following, \"bigInt\" means a bigInt with at least one leading zero element,\n// and \"integer\" means a nonnegative integer less than radix. In some cases, integer\n// can be negative. Negative bigInts are 2s complement.\n//\n// The following functions do not modify their inputs.\n// Those returning a bigInt, string, or Array will dynamically allocate memory for that value.\n// Those returning a boolean will return the integer 0 (false) or 1 (true).\n// Those returning boolean or int will not allocate memory except possibly on the first\n// time they're called with a given parameter size.\n//\n// bigInt add(x,y) //return (x+y) for bigInts x and y.\n// bigInt addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.\n// string bigInt2str(x,base) //return a string form of bigInt x in a given base, with 2 <= base <= 95\n// int bitSize(x) //return how many bits long the bigInt x is, not counting leading zeros\n// bigInt dup(x) //return a copy of bigInt x\n// boolean equals(x,y) //is the bigInt x equal to the bigint y?\n// boolean equalsInt(x,y) //is bigint x equal to integer y?\n// bigInt expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed\n// Array findPrimes(n) //return array of all primes less than integer n\n// bigInt GCD(x,y) //return greatest common divisor of bigInts x and y (each with same number of elements).\n// boolean greater(x,y) //is x>y? (x and y are nonnegative bigInts)\n// boolean greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?\n// bigInt int2bigInt(t,n,m) //return a bigInt equal to integer t, with at least n bits and m array elements\n// bigInt inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null\n// int inverseModInt(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse\n// boolean isZero(x) //is the bigInt x equal to zero?\n// boolean millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is bigInt, 1=1). If s=1, then the most significant of those n bits is set to 1.\n// bigInt randTruePrime(k) //return a new, random, k-bit, true prime bigInt using Maurer's algorithm.\n// bigInt randProbPrime(k) //return a new, random, k-bit, probable prime bigInt (probability it's composite less than 2^-80).\n// bigInt str2bigInt(s,b,n,m) //return a bigInt for number represented in string s in base b with at least n bits and m array elements\n// bigInt sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement\n// bigInt trim(x,k) //return a copy of x with exactly k leading zero elements\n//\n//\n// The following functions each have a non-underscored version, which most users should call instead.\n// These functions each write to a single parameter, and the caller is responsible for ensuring the array\n// passed in is large enough to hold the result.\n//\n// void addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer\n// void add_(x,y) //do x=x+y for bigInts x and y\n// void copy_(x,y) //do x=y on bigInts x and y\n// void copyInt_(x,n) //do x=n on bigInt x and integer n\n// void GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). (This never overflows its array).\n// boolean inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist\n// void mod_(x,n) //do x=x mod n for bigInts x and n. (This never overflows its array).\n// void mult_(x,y) //do x=x*y for bigInts x and y.\n// void multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.\n// void powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.\n// void randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.\n// void randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.\n// void sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.\n//\n// The following functions do NOT have a non-underscored version.\n// They each write a bigInt result to one or more parameters. The caller is responsible for\n// ensuring the arrays passed in are large enough to hold the results.\n//\n// void addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))\n// void carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.\n// void divide_(x,y,q,r) //divide x by y giving quotient q and remainder r\n// int divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder. (This never overflows its array).\n// void eGCD_(x,y,d,a,b) //sets a,b,d to positive bigInts such that d = GCD_(x,y) = a*x-b*y\n// void halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement. (This never overflows its array).\n// void leftShift_(x,n) //left shift bigInt x by n bits. n64 multiplier, but not with JavaScript's 32*32->32)\n// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square\n// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that\n// method would be slower. This is unfortunate because the code currently spends almost all of its time\n// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring\n// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded\n// sentences that seem to imply it's faster to do a non-modular square followed by a single\n// Montgomery reduction, but that's obviously wrong.\n////////////////////////////////////////////////////////////////////////////////////////\n\nexport type Bool = 1 | 0\n\n//globals\nexport var bpe = 0 //bits stored per array element\nvar mask = 0 //AND this with an array element to chop it down to bpe bits\nvar radix = mask + 1 //equals 2^bpe. A single 1 bit to the left of the last bit of mask.\n\n//the digits for converting to different bases\nvar digitsStr =\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\\\\'\"+-'\n\n//initialize the global variables\n\n//bpe=number of bits in the mantissa on this platform\nfor (bpe = 0; 1 << (bpe + 1) > 1 << bpe; bpe++);\nbpe >>= 1 //bpe=number of bits in one element of the array representing the bigInt\nmask = (1 << bpe) - 1 //AND the mask with an integer to get its bpe least significant bits\nradix = mask + 1 //2^bpe. a single 1 bit to the left of the first bit of mask\nexport var one = int2bigInt(1, 1, 1) //constant used in powMod_()\nexport var zero = int2bigInt(0, 1, 1)\n\n//the following global variables are scratchpad memory to\n//reduce dynamic memory allocation in the inner loop\nvar t: number[] | number = new Array(0)\nvar ss = t //used in mult_()\nvar s0 = t //used in multMod_(), squareMod_()\n// var s1=t; //used in powMod_(), multMod_(), squareMod_()\n// var s2=t; //used in powMod_(), multMod_()\nvar s3 = t //used in powMod_()\nvar s4 = t,\n s5 = t //used in mod_()\nvar s6 = t //used in bigInt2str()\nvar s7 = t //used in powMod_()\nvar T = t //used in GCD_()\nvar sa = t //used in mont_()\nvar mr_x1 = t,\n mr_r = t,\n mr_a = t, //used in millerRabin()\n eg_v = t,\n eg_u = t,\n eg_A = t,\n eg_B = t,\n eg_C = t,\n eg_D = t, //used in eGCD_(), inverseMod_()\n //, md_q1=t, md_q2=t, md_q3=t, md_r=t, md_r1=t, md_r2=t, md_tt=t, //used in mod_()\n\n primes = t,\n pows = t,\n s_i = t,\n s_i2 = t,\n s_R = t,\n s_rm = t,\n s_q = t,\n s_n1 = t,\n s_a = t,\n s_r2 = t,\n s_n = t,\n s_b = t,\n s_d = t,\n s_x1 = t,\n s_x2 = t,\n s_aa = t, //used in randTruePrime_()\n rpprb = t //used in randProbPrimeRounds() (which also uses \"primes\")\n\n////////////////////////////////////////////////////////////////////////////////////////\n\nvar k, buff\n\n/**\n * return array of all primes less than integer n\n *\n * @param {number} n\n * @returns {number[]}\n */\nexport function findPrimes(n: number): number[] {\n var i, s, p, ans\n s = new Array(n)\n for (i = 0; i < n; i++) s[i] = 0\n s[0] = 2\n p = 0 //first p elements of s are primes, the rest are a sieve\n for (; s[p] < n; ) {\n //s[p] is the pth prime\n for (\n i = s[p] * s[p];\n i < n;\n i += s[p] //mark multiples of s[p]\n )\n s[i] = 1\n p++\n s[p] = s[p - 1] + 1\n for (; s[p] < n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)\n }\n ans = new Array(p)\n for (i = 0; i < p; i++) ans[i] = s[i]\n return ans\n}\n\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x is a bigInt, and b is an integer, with b 0; j--);\n for (z = 0, w = x[j]; w; w >>= 1, z++);\n z += bpe * j\n return z\n}\n\n/**\n * return a copy of x with at least n elements, adding leading zeros if needed\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\nexport function expand(x: number[], n: number): number[] {\n var ans = int2bigInt(0, (x.length > n ? x.length : n) * bpe, 0)\n copy_(ans, x)\n return ans\n}\n\n/**\n * return a k-bit true random prime using Maurer's algorithm.\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randTruePrime(k: number): number[] {\n var ans = int2bigInt(0, k, 0)\n randTruePrime_(ans, k)\n return trim(ans, 1)\n} */\n\n/**\n * return a k-bit random probable prime with probability of error < 2^-80\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randProbPrime(k: number): number[] {\n if (k >= 600) return randProbPrimeRounds(k, 2) //numbers from HAC table 4.3\n if (k >= 550) return randProbPrimeRounds(k, 4)\n if (k >= 500) return randProbPrimeRounds(k, 5)\n if (k >= 400) return randProbPrimeRounds(k, 6)\n if (k >= 350) return randProbPrimeRounds(k, 7)\n if (k >= 300) return randProbPrimeRounds(k, 9)\n if (k >= 250) return randProbPrimeRounds(k, 12) //numbers from HAC table 4.4\n if (k >= 200) return randProbPrimeRounds(k, 15)\n if (k >= 150) return randProbPrimeRounds(k, 18)\n if (k >= 100) return randProbPrimeRounds(k, 27)\n return randProbPrimeRounds(k, 40) //number from HAC remark 4.26 (only an estimate)\n} */\n\n/**\n * return a k-bit probable random prime using n rounds of Miller Rabin\n * (after trial division with small primes)\n *\n * @export\n * @param {number} k\n * @param {number} n\n * @returns {number[]}\n */\n/* export function randProbPrimeRounds(k: number, n: number): number[] {\n var ans, i, divisible, B\n B = 30000 //B is largest prime to use in trial division\n ans = int2bigInt(0, k, 0)\n\n //optimization: try larger and smaller B to find the best limit.\n\n if (primes.length === 0) primes = findPrimes(30000) //check for divisibility by primes <=30000\n\n if (rpprb.length !== ans.length) rpprb = dup(ans)\n\n for (;;) {\n //keep trying random values for ans until one appears to be prime\n //optimization: pick a random number times L=2*3*5*...*p, plus a\n // random element of the list of all numbers in [0,L) not divisible by any prime up to p.\n // This can reduce the amount of random number generation.\n\n randBigInt_(ans, k, 0) //ans = a random odd number to check\n ans[0] |= 1\n divisible = 0\n\n //check ans for divisibility by small primes up to B\n for (i = 0; i < primes.length && primes[i] <= B; i++)\n if (modInt(ans, primes[i]) === 0 && !equalsInt(ans, primes[i])) {\n divisible = 1\n break\n }\n\n //optimization: change millerRabin so the base can be bigger than the number being checked, then eliminate the while here.\n\n //do n rounds of Miller Rabin, with random bases less than ans\n for (i = 0; i < n && !divisible; i++) {\n randBigInt_(rpprb, k, 0)\n while (\n !greater(ans, rpprb) //pick a random rpprb that's < ans\n )\n randBigInt_(rpprb, k, 0)\n if (!millerRabin(ans, rpprb)) divisible = 1\n }\n\n if (!divisible) return ans\n }\n} */\n\n/**\n * return a new bigInt equal to (x mod n) for bigInts x and n.\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {number[]}\n */\nexport function mod(x: number[], n: number[]): number[] {\n var ans = dup(x)\n mod_(ans, n)\n return trim(ans, 1)\n}\n\n/**\n * return (x+n) where x is a bigInt and n is an integer.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n/* export function addInt(x: number[], n: number): number[] {\n var ans = expand(x, x.length + 1)\n addInt_(ans, n)\n return trim(ans, 1)\n} */\n\n/**\n * return x*y for bigInts x and y. This is faster when y y.length ? x.length + 1 : y.length + 1)\n sub_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x+y) for bigInts x and y\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function add(x: number[], y: number[]): number[] {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1)\n add_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x**(-1) mod n) for bigInts x and n.\n *\n * If no inverse exists, it returns null\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(number[] | null)}\n */\n/* export function inverseMod(x: number[], n: number[]): number[] | null {\n var ans = expand(x, n.length)\n var s = inverseMod_(ans, n)\n return s ? trim(ans, 1) : null\n} */\n\n/**\n * return (x*y mod n) for bigInts x,y,n.\n *\n * For greater speed, let y= 2\n\n if (s_i2.length != ans.length) {\n s_i2 = dup(ans)\n s_R = dup(ans)\n s_n1 = dup(ans)\n s_r2 = dup(ans)\n s_d = dup(ans)\n s_x1 = dup(ans) //TODO Seems like a bug in eslint, reports as unused\n s_x2 = dup(ans)\n s_b = dup(ans)\n s_n = dup(ans)\n s_i = dup(ans)\n s_rm = dup(ans)\n s_q = dup(ans)\n s_a = dup(ans)\n s_aa = dup(ans)\n }\n\n if (k <= recLimit) {\n //generate small random primes by trial division up to its square root\n pm = (1 << ((k + 2) >> 1)) - 1 //pm is binary number with all ones, just over sqrt(2^k)\n copyInt_(ans, 0)\n for (dd = 1; dd; ) {\n dd = 0\n ans[0] = 1 | (1 << (k - 1)) | Math.floor(Math.random() * (1 << k)) //random, k-bit, odd integer, with msb 1\n for (j = 1; j < primes.length && (primes[j] & pm) == primes[j]; j++) {\n //trial division by all primes 3...sqrt(2^k)\n if (0 == ans[0] % primes[j]) {\n dd = 1\n break\n }\n }\n }\n carry_(ans)\n return\n }\n\n B = c * k * k //try small primes up to B (or all the primes[] array if the largest is less than B).\n if (k > 2 * m)\n //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n for (r = 1; k - k * r <= m; ) r = pows[Math.floor(Math.random() * 512)] //r=Math.pow(2,Math.random()-1);\n else r = 0.5\n\n //simulation suggests the more complex algorithm using r=.333 is only slightly faster.\n\n recSize = Math.floor(r * k) + 1\n\n randTruePrime_(s_q, recSize)\n copyInt_(s_i2, 0)\n s_i2[Math.floor((k - 2) / bpe)] |= 1 << ((k - 2) % bpe) //s_i2=2^(k-2)\n divide_(s_i2, s_q, s_i, s_rm) //s_i=floor((2^(k-1))/(2q))\n\n z = bitSize(s_i)\n\n for (;;) {\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_i-1]\n randBigInt_(s_R, z, 0)\n if (greater(s_i, s_R)) break\n } //now s_R is in the range [0,s_i-1]\n addInt_(s_R, 1) //now s_R is in the range [1,s_i]\n add_(s_R, s_i) //now s_R is in the range [s_i+1,2*s_i]\n\n copy_(s_n, s_q)\n mult_(s_n, s_R)\n multInt_(s_n, 2)\n addInt_(s_n, 1) //s_n=2*s_R*s_q+1\n\n copy_(s_r2, s_R)\n multInt_(s_r2, 2) //s_r2=2*s_R\n\n //check s_n for divisibility by small primes up to B\n for (divisible = 0, j = 0; j < primes.length && primes[j] < B; j++)\n if (modInt(s_n, primes[j]) == 0 && !equalsInt(s_n, primes[j])) {\n divisible = 1\n break\n }\n\n if (!divisible)\n if (!millerRabinInt(s_n, 2))\n //if it passes small primes check, then try a single Miller-Rabin base 2\n //this line represents 75% of the total runtime for randTruePrime_\n divisible = 1\n\n if (!divisible) {\n //if it passes that test, continue checking s_n\n addInt_(s_n, -3)\n for (j = s_n.length - 1; s_n[j] == 0 && j > 0; j--); //strip leading zeros\n for (zz = 0, w = s_n[j]; w; w >>= 1, zz++);\n zz += bpe * j //zz=number of bits in s_n, ignoring leading zeros\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_n-1]\n randBigInt_(s_a, zz, 0)\n if (greater(s_n, s_a)) break\n } //now s_a is in the range [0,s_n-1]\n addInt_(s_n, 3) //now s_a is in the range [0,s_n-4]\n addInt_(s_a, 2) //now s_a is in the range [2,s_n-2]\n copy_(s_b, s_a)\n copy_(s_n1, s_n)\n addInt_(s_n1, -1)\n powMod_(s_b, s_n1, s_n) //s_b=s_a^(s_n-1) modulo s_n\n addInt_(s_b, -1)\n if (isZero(s_b)) {\n copy_(s_b, s_a)\n powMod_(s_b, s_r2, s_n)\n addInt_(s_b, -1)\n copy_(s_aa, s_n)\n copy_(s_d, s_b)\n GCD_(s_d, s_n) //if s_b and s_n are relatively prime, then s_n is a prime\n if (equalsInt(s_d, 1)) {\n copy_(ans, s_aa)\n return //if we've made it this far, then s_n is absolutely guaranteed to be prime\n }\n }\n }\n }\n} */\n\n/**\n * Return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n *\n * @export\n * @param {number} n\n * @param {number} s\n * @returns {number[]}\n */\n/* export function randBigInt(n: number, s: number): number[] {\n var a, b\n a = Math.floor((n - 1) / bpe) + 2 //# array elements to hold the BigInt with a leading 0 element\n b = int2bigInt(0, 0, a)\n randBigInt_(b, n, s)\n return b\n} */\n\n/**\n * Set b to an n-bit random BigInt. If s=1, then the most significant of those n bits is set to 1.\n *\n * Array b must be big enough to hold the result. Must have n>=1\n *\n * @export\n * @param {number[]} b\n * @param {number} n\n * @param {number} s\n * @return {void}\n */\n/* export function randBigInt_(b: number[], n: number, s: number): void {\n var i, a\n for (i = 0; i < b.length; i++) b[i] = 0\n a = Math.floor((n - 1) / bpe) + 1 //# array elements to hold the BigInt\n for (i = 0; i < a; i++) {\n b[i] = Math.floor(Math.random() * (1 << (bpe - 1)))\n }\n b[a - 1] &= (2 << ((n - 1) % bpe)) - 1\n if (s == 1) b[a - 1] |= 1 << ((n - 1) % bpe)\n} */\n\n/**\n * Return the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function GCD(x: number[], y: number[]): number[] {\n var xc, yc\n xc = dup(x)\n yc = dup(y)\n GCD_(xc, yc)\n return xc\n}\n\n/**\n * set x to the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * y is destroyed.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n */\nexport function GCD_(x: number[], y: number[]): void {\n var i: number, xp: number, yp: number, A: number, B, C: number, D: number, q, sing\n var qp\n if (T.length !== x.length) T = dup(x)\n\n sing = 1\n while (sing) {\n //while y has nonzero elements other than y[0]\n sing = 0\n for (\n i = 1;\n i < y.length;\n i++ //check if y has nonzero elements other than 0\n )\n if (y[i]) {\n sing = 1\n break\n }\n if (!sing) break //quit when y all zero elements except possibly y[0]\n\n for (i = x.length; !x[i] && i >= 0; i--); //find most significant element of x\n xp = x[i]\n yp = y[i]\n A = 1\n B = 0\n C = 0\n D = 1\n while (yp + C && yp + D) {\n q = Math.floor((xp + A) / (yp + C))\n qp = Math.floor((xp + B) / (yp + D))\n if (q != qp) break\n t = A - q * C\n A = C\n C = t // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)\n t = B - q * D\n B = D\n D = t\n t = xp - q * yp\n xp = yp\n yp = t\n }\n if (B) {\n copy_(T, x)\n linComb_(x, y, A, B) //x=A*x+B*y\n linComb_(y, T, D, C) //y=D*y+C*T\n } else {\n mod_(x, y)\n copy_(T, x)\n copy_(x, y)\n copy_(y, T)\n }\n }\n if (y[0] === 0) return\n t = modInt(x, y[0])\n copyInt_(x, y[0])\n y[0] = t\n while (y[0]) {\n x[0] %= y[0]\n t = x[0]\n x[0] = y[0]\n y[0] = t\n }\n}\n\n/**\n * do x=x**(-1) mod n, for bigInts x and n.\n *\n * If no inverse exists, it sets x to zero and returns 0, else it returns 1.\n * The x array must be at least as large as the n array.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(0 | 1)}\n */\n/* export function inverseMod_(x: number[], n: number[]): Bool {\n var k = 1 + 2 * Math.max(x.length, n.length)\n\n if (!(x[0] & 1) && !(n[0] & 1)) {\n //if both inputs are even, then inverse doesn't exist\n copyInt_(x, 0)\n return 0\n }\n\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_v = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n\n copy_(eg_u, x)\n copy_(eg_v, n)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while eg_u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if eg_A==eg_B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, n)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(eg_v[0] & 1)) {\n //while eg_v is even\n halve_(eg_v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if eg_C==eg_D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, n)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(eg_v, eg_u)) {\n //eg_v <= eg_u\n sub_(eg_u, eg_v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //eg_v > eg_u\n sub_(eg_v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n\n if (equalsInt(eg_u, 0)) {\n while (\n negative(eg_C) //make sure answer is nonnegative\n )\n add_(eg_C, n)\n copy_(x, eg_C)\n\n if (!equalsInt(eg_v, 1)) {\n //if GCD_(x,n)!=1, then there is no inverse\n copyInt_(x, 0)\n return 0\n }\n return 1\n }\n }\n} */\n\n/**\n * return x**(-1) mod n, for integers x and n.\n *\n * Return 0 if there is no inverse\n *\n * @param {number} x\n * @param {number} n\n * @returns {number}\n */\nexport function inverseModInt(x: number, n: number): number {\n var a = 1,\n b = 0,\n t\n for (;;) {\n if (x === 1) return a\n if (x === 0) return 0\n b -= a * Math.floor(n / x)\n //$off\n n %= x\n\n if (n === 1) return b //to avoid negatives, change this b to n-b, and each -= to +=\n if (n === 0) return 0\n a -= b * Math.floor(x / n)\n //$off\n x %= n\n }\n /*::\n declare var never: empty\n return never\n */\n}\n\n//this deprecated function is for backward compatibility only.\n/* function inverseModInt_(x: number, n: number) {\n return inverseModInt(x, n)\n} */\n\n/**\n * Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:\n *\n * v = GCD_(x,y) = a*x-b*y\n *\n * The bigInts v, a, b, must have exactly as many elements as the larger of x and y.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} v\n * @param {number[]} a\n * @param {number[]} b\n * @return {void}\n */\nexport function eGCD_(\n x: number[],\n y: number[],\n v: number[],\n a: number[],\n b: number[],\n): void {\n var g = 0\n var k = Math.max(x.length, y.length)\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n while (!(x[0] & 1) && !(y[0] & 1)) {\n //while x and y both even\n halve_(x)\n halve_(y)\n g++\n }\n copy_(eg_u, x)\n copy_(v, y)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if A==B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, y)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(v[0] & 1)) {\n //while v is even\n halve_(v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if C==D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, y)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(v, eg_u)) {\n //v<=u\n sub_(eg_u, v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //v>u\n sub_(v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C)) {\n //make sure a (C) is nonnegative\n add_(eg_C, y)\n sub_(eg_D, x)\n }\n multInt_(eg_D, -1) ///make sure b (D) is nonnegative\n copy_(a, eg_C)\n copy_(b, eg_D)\n leftShift_(v, g)\n return\n }\n }\n}\n\n/**\n * is bigInt x negative?\n *\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function negative(x: number[]) {\n //TODO Flow Bool type inference\n return (x[x.length - 1] >> (bpe - 1)) & 1\n}\n\n/**\n * is (x << (shift*bpe)) > y?\n *\n * x and y are nonnegative bigInts\n * shift is a nonnegative integer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} shift\n * @returns {(1 | 0)}\n */\nexport function greaterShift(x: number[], y: number[], shift: number): Bool {\n var i,\n kx = x.length,\n ky = y.length\n k = kx + shift < ky ? kx + shift : ky\n for (i = ky - 1 - shift; i < kx && i >= 0; i++) if (x[i] > 0) return 1 //if there are nonzeros in x to the left of the first column of y, then x is bigger\n for (i = kx - 1 + shift; i < ky; i++) if (y[i] > 0) return 0 //if there are nonzeros in y to the left of the first column of x, then x is not bigger\n for (i = k - 1; i >= shift; i--)\n if (x[i - shift] > y[i]) return 1\n else if (x[i - shift] < y[i]) return 0\n return 0\n}\n\n/**\n * is x > y?\n *\n * x and y both nonnegative\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\nexport function greater(x: number[], y: number[]): Bool {\n var i\n var k = x.length < y.length ? x.length : y.length\n\n for (i = x.length; i < y.length; i++) if (y[i]) return 0 //y has more digits\n\n for (i = y.length; i < x.length; i++) if (x[i]) return 1 //x has more digits\n\n for (i = k - 1; i >= 0; i--)\n if (x[i] > y[i]) return 1\n else if (x[i] < y[i]) return 0\n return 0\n}\n\n/**\n * divide x by y giving quotient q and remainder r.\n *\n * q = floor(x/y)\n * r = x mod y\n *\n * All 4 are bigints.\n *\n * * x must have at least one leading zero element.\n * * y must be nonzero.\n * * q and r must be arrays that are exactly the same length as x. (Or q can have more).\n * * Must have x.length >= y.length >= 2.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} q\n * @param {number[]} r\n * @return {void}\n */\nexport function divide_(\n x: number[],\n y: number[],\n q: number[],\n r: number[],\n): void {\n var kx, ky\n var i, j, y1, y2, c, a, b\n copy_(r, x)\n for (ky = y.length; y[ky - 1] === 0; ky--); //ky is number of elements in y, not including leading zeros\n\n //normalize: ensure the most significant element of y has its highest bit set\n b = y[ky - 1]\n for (a = 0; b; a++) b >>= 1\n a = bpe - a //a is how many bits to shift so that the high order bit of y is leftmost in its array element\n leftShift_(y, a) //multiply both by 1< ky; kx--); //kx is number of elements in normalized x, not including leading zeros\n\n copyInt_(q, 0) // q=0\n while (!greaterShift(y, r, kx - ky)) {\n // while (leftShift_(y,kx-ky) <= r) {\n subShift_(r, y, kx - ky) // r=r-leftShift_(y,kx-ky)\n q[kx - ky]++ // q[kx-ky]++;\n } // }\n\n for (i = kx - 1; i >= ky; i--) {\n if (r[i] == y[ky - 1]) q[i - ky] = mask\n else q[i - ky] = Math.floor((r[i] * radix + r[i - 1]) / y[ky - 1])\n\n //The following for(;;) loop is equivalent to the commented while loop,\n //except that the uncommented version avoids overflow.\n //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0\n // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])\n // q[i-ky]--;\n for (;;) {\n y2 = (ky > 1 ? y[ky - 2] : 0) * q[i - ky]\n c = y2 >> bpe\n y2 = y2 & mask\n y1 = c + q[i - ky] * y[ky - 1]\n c = y1 >> bpe\n y1 = y1 & mask\n\n if (\n c == r[i]\n ? y1 == r[i - 1] ? y2 > (i > 1 ? r[i - 2] : 0) : y1 > r[i - 1]\n : c > r[i]\n )\n q[i - ky]--\n else break\n }\n\n linCombShift_(r, y, -q[i - ky], i - ky) //r=r-q[i-ky]*leftShift_(y,i-ky)\n if (negative(r)) {\n addShift_(r, y, i - ky) //r=r+leftShift_(y,i-ky)\n q[i - ky]--\n }\n }\n\n rightShift_(y, a) //undo the normalization step\n rightShift_(r, a) //undo the normalization step\n}\n\n/**\n * do carries and borrows so each element of the bigInt x fits in bpe bits.\n *\n * @param {number[]} x\n */\nexport function carry_(x: number[]): void {\n var i, k, c, b\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * return x mod n for bigInt x and integer n.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number}\n */\nexport function modInt(x: number[], n: number): number {\n var i,\n c = 0\n for (i = x.length - 1; i >= 0; i--) c = (c * radix + x[i]) % n\n return c\n}\n\n/**\n * convert the integer t into a bigInt with at least the given number of bits.\n * the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)\n * Pad the array with leading zeros so that it has at least minSize elements.\n *\n * There will always be at least one leading 0 element.\n *\n * @export\n * @param {number} t\n * @param {number} bits\n * @param {number} minSize\n * @returns {number[]}\n */\nexport function int2bigInt(t: number, bits: number, minSize: number): number[] {\n var i, k\n k = Math.ceil(bits / bpe) + 1\n k = minSize > k ? minSize : k\n var buff = new Array(k)\n copyInt_(buff, t)\n return buff\n}\n\n/**\n * return the bigInt given a string representation in a given base.\n * Pad the array with leading zeros so that it has at least minSize elements.\n * If base=-1, then it reads in a space-separated list of array elements in decimal.\n *\n * The array will always have at least one leading zero, unless base=-1.\n *\n * @export\n * @param {string} s\n * @param {number} base\n * @param {number} [minSize]\n * @returns {number[]}\n */\nexport function str2bigInt(\n s: string,\n base: number,\n minSize?: number,\n): number[] {\n var d, i, x, y, kk\n var k = s.length\n if (base === -1) {\n //comma-separated list of array elements in decimal\n x = new Array(0)\n for (;;) {\n y = new Array(x.length + 1)\n for (i = 0; i < x.length; i++) y[i + 1] = x[i]\n y[0] = parseInt(s, 10) //TODO PERF Should we replace that with ~~ (not not)? https://jsperf.com/number-vs-parseint-vs-plus/7\n x = y\n d = s.indexOf(',', 0)\n if (d < 1) break\n //$off\n s = s.substring(d + 1)\n if (s.length == 0) break\n }\n //$off\n if (x.length < minSize) {\n //$off\n y = new Array(minSize)\n copy_(y, x)\n return y\n }\n return x\n }\n\n x = int2bigInt(0, base * k, 0)\n for (i = 0; i < k; i++) {\n d = digitsStr.indexOf(s.substring(i, i + 1), 0)\n if (base <= 36 && d >= 36)\n //convert lowercase to uppercase if base<=36\n d -= 26\n if (d >= base || d < 0) {\n //stop at first illegal character\n break\n }\n multInt_(x, base)\n addInt_(x, d)\n }\n\n for (k = x.length; k > 0 && !x[k - 1]; k--); //strip off leading zeros\n //$off\n k = minSize > k + 1 ? minSize : k + 1\n //$off\n y = new Array(k)\n //$off\n kk = k < x.length ? k : x.length\n //$off\n for (i = 0; i < kk; i++) y[i] = x[i]\n //$off\n for (; i < k; i++) y[i] = 0\n return y\n}\n\n//return the bigInt given a string representation in a given base.\n//Pad the array with leading zeros so that it has at least minSize elements.\n//If base=-1, then it reads in a space-separated list of array elements in decimal.\n//The array will always have at least one leading zero, unless base=-1.\n// function str2bigInt(s,b,minSize) {\n// var d, i, j, base, str, x, y, kk;\n// if (typeof b === 'string') {\n// base = b.length;\n// str = b;\n// } else {\n// base = b;\n// str = digitsStr;\n// }\n// var k=s.length;\n// if (base==-1) { //comma-separated list of array elements in decimal\n// x=new Array(0);\n// for (;;) {\n// y=new Array(x.length+1);\n// for (i=0;i=36) { //convert lowercase to uppercase if base<=36\n// d-=26;\n// }\n// if (d>=base || d<0) { //ignore illegal characters\n// continue;\n// }\n// multInt_(x,base);\n// addInt_(x,d);\n// }\n\n// for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros\n// k=minSize>k+1 ? minSize : k+1;\n// y=new Array(k);\n// kk=k y.length) {\n for (; i < x.length; i++) if (x[i]) return 0\n } else {\n for (; i < y.length; i++) if (y[i]) return 0\n }\n return 1\n}\n\n/**\n * is the bigInt x equal to zero?\n *\n * @export\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function isZero(x: number[]): Bool {\n var i\n for (i = 0; i < x.length; i++) if (x[i]) return 0\n return 1\n}\n\n/**\n * Convert a bigInt into a string in a given base, from base 2 up to base 95.\n *\n * Base -1 prints the contents of the array representing the number.\n *\n * @export\n * @param {number[]} x\n * @param {number} base\n * @returns {string}\n */\nexport function bigInt2str(x: number[], base: number): string {\n var i,\n t,\n s = ''\n\n if (s6.length !== x.length) s6 = dup(x)\n else copy_(s6, x)\n\n if (base === -1) {\n //return the list of array contents\n for (i = x.length - 1; i > 0; i--) s += x[i] + ','\n s += x[0]\n } else {\n //return it in the given base\n while (!isZero(s6)) {\n t = divInt_(s6, base) //t=s6 % base; s6=floor(s6/base);\n s = digitsStr.substring(t, t + 1) + s\n }\n }\n if (s.length === 0) s = '0'\n return s\n}\n\n/**\n * Convert a bigInt into bytes\n * @param x bigInt\n * @param littleEndian byte order by default\n */\nexport function bigInt2bytes(x: number[], littleEndian = true) {\n if(s6.length !== x.length) s6 = dup(x);\n else copy_(s6, x);\n\n const out: number[] = [];\n\n //console.log('bigInt2bytes');\n while(!isZero(s6)) {\n t = divInt_(s6, 256); //t=s6 % base; s6=floor(s6/base);\n out.push(t);\n //console.log('bigInt2bytes', t);\n }\n\n if(littleEndian) {\n out.reverse();\n }\n\n //console.log('bigInt2bytes', out);\n\n return out;\n}\n\n/**\n * Compare two bigInts and return -1 if x is less, 0 if equals, 1 if greater\n * @param x bigInt\n * @param y bigInt\n */\nexport function cmp(x: number[], y: number[]) {\n return greater(x, y) ? 1 : (equals(x, y) ? 0 : -1);\n}\n\n/* Object.assign(self, {\n cmp,\n str2bigInt,\n int2bigInt,\n bigInt2str,\n one,\n divide_,\n divInt_,\n dup,\n negative\n}); */\n\n/**\n * Returns a duplicate of bigInt x\n *\n * @export\n * @param {number[]} x\n * @returns {number[]}\n */\nexport function dup(x: number[]): number[] {\n var i\n buff = Array(x.length)\n copy_(buff, x)\n return buff\n}\n\n/**\n * do x=y on bigInts x and y.\n *\n * x must be an array at least as big as y (not counting the leading zeros in y).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {void}\n */\nexport function copy_(x: number[], y: number[]): void {\n var i\n var k = x.length < y.length ? x.length : y.length\n for (i = 0; i < k; i++) x[i] = y[i]\n for (i = k; i < x.length; i++) x[i] = 0\n}\n\n/**\n * do x=y on bigInt x and integer y.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function copyInt_(x: number[], n: number): void {\n var i, c\n var len = x.length //TODO .length in for loop have perfomance costs. Bench this\n for (c = n, i = 0; i < len; i++) {\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function addInt_(x: number[], n: number): void {\n var i, k, c, b\n x[0] += n\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n if (!c) return //stop carrying as soon as the carry is zero\n }\n}\n\n/**\n * right shift bigInt x by n bits.\n *\n * 0 <= n < bpe.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n */\nexport function rightShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = 0;\n i < x.length - k;\n i++ //right shift x by k elements\n )\n x[i] = x[i + k]\n for (; i < x.length; i++) x[i] = 0\n //$off\n n %= bpe\n }\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - n)) | (x[i] >> n))\n }\n x[i] >>= n\n}\n\n/**\n * do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement\n *\n * @param {number[]} x\n * @returns {void}\n */\nexport function halve_(x: number[]): void {\n var i\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - 1)) | (x[i] >> 1))\n }\n x[i] = (x[i] >> 1) | (x[i] & (radix >> 1)) //most significant bit stays the same\n}\n\n/**\n * left shift bigInt x by n bits\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function leftShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = x.length;\n i >= k;\n i-- //left shift x by k elements\n )\n x[i] = x[i - k]\n for (; i >= 0; i--) x[i] = 0\n //$off\n n %= bpe\n }\n if (!n) return\n for (i = x.length - 1; i > 0; i--) {\n x[i] = mask & ((x[i] << n) | (x[i - 1] >> (bpe - n)))\n }\n x[i] = mask & (x[i] << n)\n}\n\n/**\n * do x=x*n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function multInt_(x: number[], n: number): void {\n var i, k, c, b\n if (!n) return\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i] * n\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * do x=floor(x/n) for bigInt x and integer n, and return the remainder\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number} remainder\n */\nexport function divInt_(x: number[], n: number): number {\n var i,\n r = 0,\n s\n for (i = x.length - 1; i >= 0; i--) {\n s = r * radix + x[i]\n x[i] = Math.floor(s / n)\n r = s % n\n }\n return r\n}\n\n/**\n * do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} a\n * @param {number} b\n * @returns {void}\n */\nexport function linComb_(x: number[], y: number[], a: number, b: number): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n kk = x.length\n for (c = 0, i = 0; i < k; i++) {\n c += a * x[i] + b * y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; i < kk; i++) {\n c += a * x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} b\n * @param {number} ys\n * @returns {void}\n */\nexport function linCombShift_(\n x: number[],\n y: number[],\n b: number,\n ys: number,\n): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + b * y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+(y<<(ys*bpe)) for bigInts x and y, and integer ys.\n *\n * x must be large enough to hold the answer.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function addShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-(y<<(ys*bpe)) for bigInts x and y, and integer ys\n *\n * x must be large enough to hold the answer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function subShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] - y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function sub_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] - y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function add_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] + y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x*y for bigInts x and y.\n *\n * This is faster when y 0 && !x[kx - 1]; kx--); //ignore leading zeros in x\n k = kx > n.length ? 2 * kx : 2 * n.length //k=# elements in the product, which is twice the elements in the larger of x and n\n if (s0.length != k) s0 = new Array(k)\n copyInt_(s0, 0)\n for (i = 0; i < kx; i++) {\n c = s0[2 * i] + x[i] * x[i]\n s0[2 * i] = c & mask\n c >>= bpe\n for (j = i + 1; j < kx; j++) {\n c = s0[i + j] + 2 * x[i] * x[j] + c\n s0[i + j] = c & mask\n c >>= bpe\n }\n s0[i + kx] = c\n }\n mod_(s0, n)\n copy_(x, s0)\n}\n\n/**\n * return x with exactly k leading zero elements\n *\n * @export\n * @param {number[]} x\n * @param {number} k\n * @returns {number[]}\n */\nexport function trim(x: number[], k: number): number[] {\n var i, y\n for (i = x.length; i > 0 && !x[i - 1]; i--);\n y = new Array(i + k)\n copy_(y, x)\n return y\n}\n\n/**\n * do `x=x**y mod n`, where x,y,n are bigInts and `**` is exponentiation. `0**0=1`.\n *\n * this is faster when n is odd.\n *\n * x usually needs to have as many elements as n.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\nexport function powMod_(x: number[], y: number[], n: number[]): void {\n var k1, k2, kn, np\n if (s7.length != n.length) s7 = dup(n)\n\n //for even modulus, use a simple square-and-multiply algorithm,\n //rather than using the more complex Montgomery algorithm.\n if ((n[0] & 1) == 0) {\n copy_(s7, x)\n copyInt_(x, 1)\n while (!equalsInt(y, 0)) {\n if (y[0] & 1) multMod_(x, s7, n)\n divInt_(y, 2)\n squareMod_(s7, n)\n }\n return\n }\n\n //calculate np from n for the Montgomery multiplications\n copyInt_(s7, 0)\n for (kn = n.length; kn > 0 && !n[kn - 1]; kn--);\n np = radix - inverseModInt(modInt(n, radix), radix)\n s7[kn] = 1\n multMod_(x, s7, n) // x = x * 2**(kn*bp) mod n\n\n if (s3.length != x.length) s3 = dup(x)\n else copy_(s3, x)\n //$off\n // @ts-ignore\n for (k1 = y.length - 1; (k1 > 0) & !y[k1]; k1--); //k1=first nonzero element of y\n if (y[k1] == 0) {\n //anything to the 0th power is 1\n copyInt_(x, 1)\n return\n }\n for (k2 = 1 << (bpe - 1); k2 && !(y[k1] & k2); k2 >>= 1); //k2=position of first 1 bit in y[k1]\n for (;;) {\n if (!(k2 >>= 1)) {\n //look at next bit of y\n k1--\n if (k1 < 0) {\n mont_(x, one, n, np)\n return\n }\n k2 = 1 << (bpe - 1)\n }\n mont_(x, x, n, np)\n\n if (k2 & y[k1])\n //if next bit is a 1\n mont_(x, s3, n, np)\n }\n}\n\n/**\n * do x=x*y*Ri mod n for bigInts x,y,n,\n * where Ri = 2**(-kn*bpe) mod n, and kn is the\n * number of elements in the n array, not\n * counting leading zeros.\n *\n * x array must have at least as many elemnts as the n array\n * It's OK if x and y are the same variable.\n *\n * must have:\n * * x,y < n\n * * n is odd\n * * np = -(n^(-1)) mod radix\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @param {number} np\n * @return {void}\n */\nexport function mont_(x: number[], y: number[], n: number[], np: number): void {\n var i, j, c, ui, t, ks\n var kn = n.length\n var ky = y.length\n\n if (sa.length != kn) sa = new Array(kn)\n\n copyInt_(sa, 0)\n\n for (; kn > 0 && n[kn - 1] == 0; kn--); //ignore leading zeros of n\n for (; ky > 0 && y[ky - 1] == 0; ky--); //ignore leading zeros of y\n ks = sa.length - 1 //sa will never have more than this many nonzero elements.\n\n //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large numbers\n for (i = 0; i < kn; i++) {\n t = sa[0] + x[i] * y[0]\n ui = ((t & mask) * np) & mask //the inner \"& mask\" was needed on Safari (but not MSIE) at one time\n c = (t + ui * n[0]) >> bpe\n t = x[i]\n\n //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe. Loop is unrolled 5-fold for speed\n j = 1\n for (; j < ky - 4; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ky; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn - 4; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ks; ) {\n c += sa[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n sa[j - 1] = c & mask\n }\n\n if (!greater(n, sa)) sub_(sa, n)\n copy_(x, sa)\n}","/*\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 { bufferConcats } from '../../helpers/bytes';\nimport { add_, bigInt2str, cmp, leftShift_, str2bigInt } from '../../vendor/leemon';\n\n \n \n \n\n \n \n \n \n \n \n \n \n \n\nexport function isObject(object: any) {\n return typeof(object) === 'object' && object !== null;\n}\n\n/* export function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n} */\n\n/* export function bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10);\n} */\n\n/* export function base64ToBlob(base64str: string, mimeType: string) {\n var sliceSize = 1024;\n var byteCharacters = atob(base64str);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n\n for(var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n\n var bytes = new Array(end - begin);\n for(var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n\n return blobConstruct(byteArrays, mimeType);\n}\n\nexport function dataUrlToBlob(url: string) {\n // var name = 'b64blob ' + url.length\n // console.time(name)\n var urlParts = url.split(',');\n var base64str = urlParts[1];\n var mimeType = urlParts[0].split(':')[1].split(';')[0];\n var blob = base64ToBlob(base64str, mimeType);\n // console.timeEnd(name)\n return blob;\n} */\n\nexport 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\n/* export function bytesFromBigInt(bigInt: BigInteger, len?: number) {\n var bytes = bigInt.toByteArray();\n\n if(len && bytes.length < len) {\n var padding = [];\n for(var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n padding[i] = 0;\n }\n if(bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(padding, bytes);\n } else {\n bytes = padding.concat(bytes);\n }\n } else {\n while (!bytes[0] && (!len || bytes.length > len)) {\n bytes = bytes.slice(1);\n }\n }\n\n return bytes;\n} */\n\nexport function longFromInts(high: number, low: number): string {\n //let perf = performance.now();\n //let str = bigint(high).shiftLeft(32).add(bigint(low)).toString(10);\n //console.log('longFromInts jsbn', performance.now() - perf);\n high = intToUint(high);\n low = intToUint(low);\n \n //perf = performance.now();\n const bigInt = str2bigInt(high.toString(16), 16, 32);//int2bigInt(high, 64, 64);\n //console.log('longFromInts construct high', bigint(high).toString(10), bigInt2str(bigInt, 10));\n leftShift_(bigInt, 32);\n //console.log('longFromInts shiftLeft', bigint(high).shiftLeft(32).toString(10), bigInt2str(bigInt, 10));\n add_(bigInt, str2bigInt(low.toString(16), 16, 32));\n const _str = bigInt2str(bigInt, 10);\n\n //console.log('longFromInts leemon', performance.now() - perf);\n\n //console.log('longFromInts', high, low, str, _str, str === _str);\n\n return _str;\n}\n\nexport function sortLongsArray(arr: string[]) {\n return arr.map(long => {\n return str2bigInt(long, 10);\n }).sort((a, b) => {\n return cmp(a, b);\n }).map(bigInt => {\n return bigInt2str(bigInt, 10);\n });\n}\n\nexport 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 padding.randomize();\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"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\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"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\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"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\":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\":-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\":-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\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":-646342540,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-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\":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\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"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\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"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\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"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\":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\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_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\":1073147056,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"}],\"type\":\"User\"},{\"id\":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\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"kicked\",\"type\":\"flags.1?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"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\":-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\":\"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\":1304281241,\"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\"}],\"type\":\"ChatFull\"},{\"id\":-374179305,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"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\":-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\":-2049520670,\"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\":\"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\":\"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\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"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\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-2074799289,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-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\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"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\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"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\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":1080663248,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"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\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"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\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"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\":-1441072131,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":739712882,\"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\":\"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\":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\":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\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"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\":-855308010,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"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\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-1673717362,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1353671392,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"PeerNotifySettings\"},{\"id\":1933519201,\"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\":\"geo_distance\",\"type\":\"flags.6?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\":-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\":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\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-694681851,\"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\":\"user\",\"type\":\"User\"},{\"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\"}],\"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\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"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\":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\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"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\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"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\":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\":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\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"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\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"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\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":-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\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1135492588,\"predicate\":\"updateStickerSets\",\"params\":[],\"type\":\"Update\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"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\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":-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\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"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\":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\":-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\":-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\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1153291573,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"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\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"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\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"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\":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\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"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\":-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\":-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\":-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\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"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\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"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\":-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\":-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\":-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\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":856375399,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":1248893260,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"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\":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\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":512177195,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"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\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":1781674934,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"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\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"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\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"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\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"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\":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\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"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\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"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\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"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\":\"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\":307276766,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector\"}],\"type\":\"account.Authorizations\"},{\"id\":408623183,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":-1316944408,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?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\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":-540871282,\"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\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector\"}],\"type\":\"ChatInvite\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"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\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-673242758,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":-1240849242,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":460632885,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":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\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"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\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"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\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"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\":-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\":-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\":-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\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"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\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"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\":682146919,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"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\":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\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"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\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"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\":-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\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"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\":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\":-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\":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\":-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\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"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\":-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\":-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\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"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\":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\":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\":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\":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\":-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\":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\":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\":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\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"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\":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\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"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\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"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\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-2067782896,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":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\":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\":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\":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\":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\":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\":-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\":-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\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"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\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"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\":-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\":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\":-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\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":215516896,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"}],\"type\":\"Invoice\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"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\":-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\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"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\":-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\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":378828315,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"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\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"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\":-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\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1655957568,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":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\":-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\":-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\":-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\":-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\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"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\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"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\":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\":-26672755,\"predicate\":\"channelAdminLogEventActionChangeTheme\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"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\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"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\":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\":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\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":1648543603,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":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\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":-534283678,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-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\":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\":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\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"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\":-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\":-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\":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\":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\":-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\":-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\":-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\":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\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"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\":-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\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"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\":-557924733,\"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\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-532532493,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"int\"},{\"name\":\"file_size_max\",\"type\":\"int\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-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\":-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\":-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\":-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\":-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\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"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\":-402474788,\"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?ThemeSettings\"},{\"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\":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\":-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\":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\":-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\":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\":-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\":-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\":-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\":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\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"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\":\"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\":-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\":-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\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"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\":-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\":190633460,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"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\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"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\":-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\":-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\":-318022605,\"predicate\":\"chatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"Theme\"},{\"name\":\"dark_theme\",\"type\":\"Theme\"}],\"type\":\"ChatTheme\"},{\"id\":-535699004,\"predicate\":\"account.chatThemesNotModified\",\"params\":[],\"type\":\"account.ChatThemes\"},{\"id\":-28524867,\"predicate\":\"account.chatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"themes\",\"type\":\"Vector\"}],\"type\":\"account.ChatThemes\"},{\"id\":708589599,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"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\"}],\"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\":-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\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"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\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1126886015,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":1461180992,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"Bool\"},{\"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\":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\":-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\":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\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"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\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"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\":655677548,\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1040964988,\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-623130288,\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-906486552,\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":1099779595,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"reason\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-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\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"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\":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\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"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\":-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\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1880182943,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":-323339813,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-262453244,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?int\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-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\":-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\":-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\":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\":-2077048289,\"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?InputThemeSettings\"}],\"type\":\"Theme\"},{\"id\":1555261397,\"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?InputThemeSettings\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2061776695,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"format\",\"type\":\"flags.1?string\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"}],\"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\":-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\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"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\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":-690545285,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"account.ChatThemes\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-902781519,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"UserFull\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"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\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"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\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"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\":-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\":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\":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\":469850889,\"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\"}],\"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\":1376532592,\"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\":\"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\"}],\"type\":\"Updates\"},{\"id\":881978281,\"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\":\"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\"}],\"type\":\"Updates\"},{\"id\":-637606386,\"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\":\"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\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":913498268,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"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\":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\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"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\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"id\":347716823,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"}],\"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\":639215886,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"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\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":864953444,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":570955184,\"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\"}],\"type\":\"Updates\"},{\"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\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1137057461,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":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\":-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\":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\":-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\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"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\":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\":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\":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\":-872345397,\"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\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"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\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"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\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"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\":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\":-2127811866,\"method\":\"messages.getStatsURL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"params\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"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\":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\":1932455680,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"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\":-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\":-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\":-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\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"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\":-265962357,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"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\":48562110,\"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\"}],\"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\":654013065,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"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\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"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\":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\":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\":-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\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1319462148,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-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\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":536919235,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector\"},{\"id\":1302676017,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":-956147407,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"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\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"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\":-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\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"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\":-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\":-787622117,\"method\":\"channels.deleteUserHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-32999408,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"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\":-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\":-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\":-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\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1355375294,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"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\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"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\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"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\":-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\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"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\":-1976353651,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-619695760,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":818134173,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":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\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?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\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"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\":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\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"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\":-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\":-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\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"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\":-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\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"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\"}]},\"layer\":133} 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","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","/*\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import sha1 from '@cryptography/sha1';\n//import sha256 from '@cryptography/sha256';\nimport {IGE} from '@cryptography/aes';\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n\nimport {str2bigInt, bpe, equalsInt, greater, \n copy_, eGCD_, add_, rightShift_, sub_, copyInt_, isZero,\n divide_, one, bigInt2str, powMod, bigInt2bytes, int2bigInt, mod} from '../../vendor/leemon';//from 'leemon';\n\nimport { addPadding } from '../mtproto/bin_utils';\nimport { bytesToWordss, bytesFromWordss, bytesToHex, bytesFromHex, convertToUint8Array } from '../../helpers/bytes';\nimport { nextRandomUint } from '../../helpers/random';\nimport type { RSAPublicKeyHex } from '../mtproto/rsaKeysManager';\n\nconst subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport function longToBytes(sLong: string) {\n /* let perf = performance.now();\n for(let i = 0; i < 1000000; ++i) {\n bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse();\n }\n console.log('longToBytes JSBN', sLong, performance.now() - perf);\n \n //const bytes = bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse();\n \n perf = performance.now();\n for(let i = 0; i < 1000000; ++i) {\n bigInt2bytes(str2bigInt(sLong, 10));\n }\n console.log('longToBytes LEEMON', sLong, performance.now() - perf); */\n\n const bigIntBytes = new Uint8Array(bigInt2bytes(str2bigInt(sLong, 10), false));\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n //console.log('longToBytes', bytes, b);\n \n return bytes;\n}\n\nexport function sha1HashSync(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\nexport function sha256HashSync(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\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n //console.log(dT(), 'AES encrypt start', bytes, keyBytes, ivBytes);\n // console.log('aes before padding bytes:', bytesToHex(bytes));\n bytes = addPadding(bytes);\n // console.log('aes after padding bytes:', bytesToHex(bytes));\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const encryptedBytes = cipher.encrypt(bytesToWordss(bytes));\n //console.log(dT(), 'AES encrypt finish');\n\n return bytesFromWordss(encryptedBytes);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n //console.log(dT(), 'AES decrypt start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const decryptedBytes = cipher.decrypt(bytesToWordss(bytes));\n\n //console.log(dT(), 'AES decrypt finish');\n\n return bytesFromWordss(decryptedBytes);\n}\n\nexport function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n //console.log(dT(), 'RSA encrypt start', publicKey, bytes);\n\n const N = str2bigInt(publicKey.modulus, 16);\n const E = str2bigInt(publicKey.exponent, 16);\n const X = str2bigInt(bytesToHex(bytes), 16);\n\n const encryptedBigInt = powMod(X, E, N);\n const encryptedBytes = bytesFromHex(bigInt2str(encryptedBigInt, 16));\n\n //console.log(dT(), 'RSA encrypt finish');\n\n return encryptedBytes;\n}\n\nexport async function hash_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 let 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\nexport function pqPrimeFactorization(pqBytes: Uint8Array | number[]) {\n let result: ReturnType;\n\n //console.log('PQ start', pqBytes, bytesToHex(pqBytes));\n\n try {\n //console.time('PQ leemon');\n result = pqPrimeLeemon(str2bigInt(bytesToHex(pqBytes), 16, Math.ceil(64 / bpe) + 1));\n //console.timeEnd('PQ leemon');\n } catch(e) {\n console.error('Pq leemon Exception', e);\n }\n\n //console.log('PQ finish', result);\n\n return result;\n}\n\nexport function pqPrimeLeemon(what: number[]): [Uint8Array, Uint8Array, number] {\n var minBits = 64;\n var minLen = Math.ceil(minBits / bpe) + 1;\n var it = 0;\n var i, q;\n var j, lim;\n var P;\n var Q;\n var a = new Array(minLen);\n var b = new Array(minLen);\n var c = new Array(minLen);\n var g = new Array(minLen);\n var z = new Array(minLen);\n var x = new Array(minLen);\n var y = new Array(minLen);\n\n for(i = 0; i < 3; ++i) {\n q = (nextRandomUint(8) & 15) + 17;\n copy_(x, mod(int2bigInt(nextRandomUint(32), 32, 0), what));\n copy_(y, x);\n lim = 1 << (i + 18);\n\n for (j = 1; j < lim; ++j) {\n ++it;\n copy_(a, x);\n copy_(b, x);\n copyInt_(c, q);\n\n while(!isZero(b)) {\n if(b[0] & 1) {\n add_(c, a);\n if(greater(c, what)) {\n sub_(c, what);\n }\n }\n add_(a, a);\n if(greater(a, what)) {\n sub_(a, what);\n }\n rightShift_(b, 1);\n }\n\n copy_(x, c);\n if(greater(x, y)) {\n copy_(z, x);\n sub_(z, y);\n } else {\n copy_(z, y);\n sub_(z, x);\n }\n eGCD_(z, what, g, a, b);\n if(!equalsInt(g, 1)) {\n break;\n }\n if((j & (j - 1)) === 0) {\n copy_(y, x);\n }\n }\n if(greater(g, one)) {\n break;\n }\n }\n\n divide_(what, g, x, y);\n\n if(greater(g, x)) {\n P = x;\n Q = g;\n } else {\n P = g;\n Q = x;\n }\n\n // console.log(dT(), 'done', bigInt2str(what, 10), bigInt2str(P, 10), bigInt2str(Q, 10))\n\n return [new Uint8Array(bigInt2bytes(P)), new Uint8Array(bigInt2bytes(Q)), it];\n}\n\nexport function bytesModPow(x: number[] | Uint8Array, y: number[] | Uint8Array, m: number[] | Uint8Array) {\n try {\n const xBigInt = str2bigInt(bytesToHex(x), 16);\n const yBigInt = str2bigInt(bytesToHex(y), 16);\n const mBigInt = str2bigInt(bytesToHex(m), 16);\n const resBigInt = powMod(xBigInt, yBigInt, mBigInt);\n\n return bytesFromHex(bigInt2str(resBigInt, 16));\n } catch(e) {\n console.error('mod pow error', e);\n }\n\n //return bytesFromBigInt(new BigInteger(x).modPow(new BigInteger(y), new BigInteger(m)), 256);\n}\n\n//export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n//export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport 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 * 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 { bytesToHex } from '../../helpers/bytes';\nimport { isObject, longFromInts } from './bin_utils';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { str2bigInt, dup, divide_, bigInt2str } from '../../vendor/leemon';\nimport Schema, { MTProtoConstructor } from './schema';\n\n \n// @ts-ignore\nimport { gzipUncompress } from '../crypto/crypto_utils';\n \n\nconst boolFalse = +Schema.API.constructors.find(c => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find(c => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find(c => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find(c => c.predicate === 'gzip_packed').id;\n\n//console.log('boolFalse', boolFalse === 0xbc799737);\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;//Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n //let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n //console.log('perf uint8', performance.now() - perf);\n\n //perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n //console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n \n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n \n resultArray.set(this.byteView.subarray(0, this.offset));\n \n return resultArray;\n }\n \n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; i++) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n \n //console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n //const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n \n this.createBuffer();\n \n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32), \n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n \n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n \n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n \n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n \n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n \n if(typeof sLong !== 'string') {\n sLong = sLong ? sLong.toString() : '0';\n }\n\n const R = 0x100000000;\n //const divRem = bigStringInt(sLong).divideAndRemainder(bigint(R));\n\n const a = str2bigInt(sLong, 10, 64);\n const q = dup(a);\n const r = dup(a);\n divide_(a, str2bigInt((R).toString(16), 16, 64), q, r);\n //divInt_(a, R);\n\n const high = +bigInt2str(q, 10);\n let low = +bigInt2str(r, 10);\n\n if(high < low) {\n low -= R; \n }\n\n //console.log('storeLong', sLong, divRem[0].intValue(), divRem[1].intValue(), high, low);\n \n //this.writeInt(divRem[1].intValue(), (field || '') + ':long[low]');\n //this.writeInt(divRem[0].intValue(), (field || '') + ':long[high]');\n this.writeInt(low, (field || '') + ':long[low]');\n this.writeInt(high, (field || '') + ':long[high]');\n }\n \n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n doubleView[0] = f;\n \n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n \n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n \n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n \n this.checkLength(sUTF8.length + 8);\n \n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; i++) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n \n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n \n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n \n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n \n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n \n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n \n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find(m => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n \n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n //console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n \n //console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n \n //console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n \n public storeObject(obj: any, type: string, field?: string) {\n //console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n \n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if (type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; i++) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if (type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n \n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find(c => c.predicate === predicate);\n \n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n \n if(predicate === type) {\n isBare = true;\n }\n \n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n //console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n //console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n //console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n //console.log('storeObject', param, type);\n \n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n \n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug = \n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n //buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n //console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n 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 this.byteView.slice(this.offset - 16, this.offset + 16).hex);\n \n this.offset += 4;\n \n return i;\n }\n \n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n \n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n \n return doubleView[0];\n }\n \n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n \n //const longDec = bigint(iHigh).shiftLeft(32).add(bigint(iLow)).toString();\n const longDec = longFromInts(iHigh, iLow);\n\n if(!this.mtproto) {\n const num = +longDec;\n if(Number.isSafeInteger(num)) {\n // @ts-ignore\n return num;\n }\n }\n \n // @ts-ignore\n return longDec;\n }\n \n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n \n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n let sUTF8 = '';\n for(let i = 0; i < len; i++) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch (e) {\n s = sUTF8;\n }\n \n this.debug && console.log('<<<', s, (field || '') + ':string');\n \n return s;\n }\n \n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n const bytes = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n \n return bytes;\n }\n \n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n \n const len = bits / 8;\n if(typed) {\n const result = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n \n return bytes;\n }\n \n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n \n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView.subarray(this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n \n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n \n return result;\n }\n \n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n \n field = field || type || 'Object';\n \n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n \n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find(c => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find(c => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n \n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n \n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n \n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; i++) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n \n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; i++) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n \n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n \n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n \n const predicate = constructorData.predicate;\n \n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; i++) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = (type.indexOf('?') !== -1);\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n //console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\n continue;\n }\n\n //console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\n\n type = condType[1];\n }\n \n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n \n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n /* if(param.name === 'read_outbox_max_id') {\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\n } */\n \n result[param.name] = value;\n }\n }\n }\n \n if(fallback) {\n this.mtproto = true;\n }\n \n return result;\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","/*\n * 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\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false) {\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n function Log(...args: any[]) {\n return type & LogTypes.Log && console.log(dT(), prefix, ...args);\n }\n \n Log.warn = function(...args: any[]) {\n return type & LogTypes.Warn && console.warn(dT(), prefix, ...args);\n };\n \n Log.info = function(...args: any[]) {\n return type & LogTypes.Log && console.info(dT(), prefix, ...args);\n };\n \n Log.error = function(...args: any[]) {\n return type & LogTypes.Error && console.error(dT(), prefix, ...args);\n };\n \n Log.trace = function(...args: any[]) {\n return type & LogTypes.Log && console.trace(dT(), prefix, ...args);\n };\n\n /* Log.debug = function(...args: any[]) {\n return level & LogLevels.debug && console.log(dT(), prefix, ...args);\n }; */\n\n Log.debug = function(...args: any[]) {\n return type & LogTypes.Debug && console.debug(dT(), prefix, ...args);\n };\n\n Log.setPrefix = function(_prefix: string) {\n prefix = '[' + _prefix + ']:';\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 return Log;\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport {str2bigInt, isZero,\r\n bigInt2str, powMod, int2bigInt, mult, mod, sub, bitSize, negative, add, greater} from '../../vendor/leemon';\r\n\r\nimport {logger, LogTypes} from '../logger';\r\nimport { AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo } from \"../../layer\";\r\nimport { bufferConcats, bytesToHex, bytesFromHex, bytesXor, convertToUint8Array } from \"../../helpers/bytes\";\r\nimport { addPadding } from \"../mtproto/bin_utils\";\r\n//import { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nconst log = logger('SRP', LogTypes.Error);\r\n\r\n//MOUNT_CLASS_TO && Object.assign(MOUNT_CLASS_TO, {str2bigInt, bigInt2str, int2bigInt});\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-hash', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\r\n //log('encoded 1', bytesToHex(new Uint8Array(buffer)));\r\n\r\n buffer = bufferConcats(server_salt, buffer, server_salt);\r\n\r\n buffer = await CryptoWorker.invokeCrypto('sha256-hash', buffer);\r\n //log('encoded 2', buffer, bytesToHex(new Uint8Array(buffer)));\r\n\r\n let hash = await CryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\r\n //log('encoded 3', hash, bytesToHex(new Uint8Array(hash)));\r\n\r\n hash = bufferConcats(server_salt, hash, server_salt);\r\n\r\n buffer = await CryptoWorker.invokeCrypto('sha256-hash', hash);\r\n //log('got password hash:', buffer, bytesToHex(new Uint8Array(buffer)));\r\n\r\n return buffer;\r\n}\r\n\r\nexport 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 //console.log('computeSRP:', password, state, isNew, algo);\r\n\r\n const p = str2bigInt(bytesToHex(algo.p), 16);\r\n const g = int2bigInt(algo.g, 32, 256);\r\n \r\n //log('p', bigInt2str(p, 16));\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 = str2bigInt(bytesToHex(pw_hash), 16);\r\n \r\n //log('computed pw_hash:', pw_hash, x, bytesToHex(new Uint8Array(pw_hash)));\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 = powMod(g, 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 = bytesFromHex(bigInt2str(v, 16));\r\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\r\n }\r\n \r\n const B = str2bigInt(bytesToHex(state.srp_B), 16);\r\n //log('B', bigInt2str(B, 16));\r\n \r\n const pForHash = padArray(bytesFromHex(bigInt2str(p, 16)), 256);\r\n const gForHash = padArray(bytesFromHex(bigInt2str(g, 16)), 256); // like uint8array\r\n const b_for_hash = padArray(bytesFromHex(bigInt2str(B, 16)), 256);\r\n /* log(bytesToHex(pForHash));\r\n log(bytesToHex(gForHash));\r\n log(bytesToHex(b_for_hash)); */\r\n\r\n //log('g_x', bigInt2str(g_x, 16));\r\n\r\n const kHash = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(pForHash, gForHash));\r\n const k = str2bigInt(bytesToHex(kHash), 16);\r\n\r\n //log('k', bigInt2str(k, 16));\r\n\r\n // kg_x = (k * g_x) % p\r\n const k_v = mod(mult(k, v), p);\r\n\r\n // good\r\n\r\n //log('kg_x', bigInt2str(kg_x, 16));\r\n\r\n const is_good_mod_exp_first = (modexp: any, prime: any) => {\r\n const diff = sub(prime, modexp);\r\n const min_diff_bits_count = 2048 - 64;\r\n const max_mod_exp_size = 256;\r\n if(negative(diff) ||\r\n bitSize(diff) < min_diff_bits_count || \r\n bitSize(modexp) < min_diff_bits_count || \r\n Math.floor((bitSize(modexp) + 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 = str2bigInt(bytesToHex(flipper(state.secure_random)), 16);\r\n //const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\r\n\r\n //console.log('ITERATION');\r\n\r\n //log('g a p', bigInt2str(g, 16), bigInt2str(a, 16), bigInt2str(p, 16));\r\n\r\n const A = powMod(g, a, p);\r\n //log('A MODPOW', bigInt2str(A, 16));\r\n if(is_good_mod_exp_first(A, p)) {\r\n const a_for_hash = bytesFromHex(bigInt2str(A, 16));\r\n\r\n const s = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(a_for_hash, b_for_hash));\r\n const u = str2bigInt(s.hex, 16);\r\n if(!isZero(u) && !negative(u))\r\n return {a, a_for_hash, u};\r\n } \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 /* log('a', bigInt2str(a, 16));\r\n log('a_for_hash', bytesToHex(a_for_hash));\r\n log('u', bigInt2str(u, 16)); */\r\n\r\n // g_b = (B - kg_x) % p\r\n /* log('B - kg_x', bigInt2str(sub(B, kg_x), 16));\r\n log('subtract', bigInt2str(B, 16), bigInt2str(kg_x, 16));\r\n log('B - kg_x', bigInt2str(sub(B, kg_x), 16)); */\r\n\r\n let g_b: number[];\r\n if(!greater(B, k_v)) {\r\n //log('negative');\r\n g_b = add(B, p);\r\n } else g_b = B;\r\n g_b = mod(sub(g_b, k_v), p);\r\n /* let g_b = sub(B, kg_x);\r\n if(negative(g_b)) g_b = add(g_b, p); */\r\n \r\n //log('g_b', bigInt2str(g_b, 16));\r\n\r\n /* if(!is_good_mod_exp_first(g_b, p))\r\n throw new Error('bad g_b'); */\r\n\r\n const ux = mult(u, x);\r\n //log('u and x multiply', bigInt2str(u, 16), bigInt2str(x, 16), bigInt2str(ux, 16));\r\n const a_ux = add(a, ux);\r\n const S = powMod(g_b, a_ux, p);\r\n\r\n const K = await CryptoWorker.invokeCrypto('sha256-hash', padArray(bytesFromHex(bigInt2str(S, 16)), 256));\r\n\r\n //log('K', bytesToHex(K), new Uint32Array(new Uint8Array(K).buffer));\r\n\r\n let h1 = await CryptoWorker.invokeCrypto('sha256-hash', pForHash);\r\n const h2 = await CryptoWorker.invokeCrypto('sha256-hash', gForHash);\r\n h1 = bytesXor(h1, h2);\r\n\r\n const buff = bufferConcats(h1, \r\n await CryptoWorker.invokeCrypto('sha256-hash', algo.salt1),\r\n await CryptoWorker.invokeCrypto('sha256-hash', 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-hash', buff);\r\n\r\n const out = {\r\n _: 'inputCheckPasswordSRP', \r\n srp_id: state.srp_id, \r\n A: new Uint8Array(a_for_hash), \r\n M1\r\n } as InputCheckPasswordSRP.inputCheckPasswordSRP;\r\n\r\n\r\n //log('out', bytesToHex(out.A), bytesToHex(out.M1));\r\n return out;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n// import { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport CryptoWorkerMethods, { CryptoMethods } from './crypto_methods';\r\n\r\n \r\nimport { aesDecryptSync, aesEncryptSync, bytesModPow, gzipUncompress, hash_pbkdf2, pqPrimeFactorization, rsaEncrypt, sha1HashSync, sha256HashSync } from './crypto_utils';\r\nimport { computeSRP } from './srp';\r\n \r\n\r\ntype Task = {\r\n taskId: number,\r\n task: string,\r\n args: any[]\r\n};\r\n\r\nclass CryptoWorker extends CryptoWorkerMethods {\r\n private webWorker: Worker | boolean = false;\r\n private taskId = 0;\r\n private awaiting: {\r\n [id: number]: {\r\n resolve: any,\r\n reject: any,\r\n taskName: string\r\n }\r\n } = {} as any;\r\n private pending: Array = [];\r\n private debug = false;\r\n\r\n private utils: CryptoMethods;\r\n\r\n constructor() {\r\n super();\r\n console.log('CW constructor');\r\n\r\n \r\n this.utils = {\r\n 'sha1-hash': sha1HashSync,\r\n 'sha256-hash': sha256HashSync,\r\n 'pbkdf2': hash_pbkdf2,\r\n 'aes-encrypt': aesEncryptSync,\r\n 'aes-decrypt': aesDecryptSync,\r\n 'rsa-encrypt': rsaEncrypt,\r\n 'factorize': pqPrimeFactorization,\r\n 'mod-pow': bytesModPow,\r\n 'gzipUncompress': gzipUncompress,\r\n 'computeSRP': computeSRP\r\n };\r\n\r\n // Promise.all([\r\n // import('./crypto_utils').then(utils => {\r\n // Object.assign(this.utils, {\r\n // 'sha1-hash': utils.sha1HashSync,\r\n // 'sha256-hash': utils.sha256HashSync,\r\n // 'pbkdf2': utils.hash_pbkdf2,\r\n // 'aes-encrypt': utils.aesEncryptSync,\r\n // 'aes-decrypt': utils.aesDecryptSync,\r\n // 'rsa-encrypt': utils.rsaEncrypt,\r\n // 'factorize': utils.pqPrimeFactorization,\r\n // 'mod-pow': utils.bytesModPow,\r\n // 'gzipUncompress': utils.gzipUncompress,\r\n // });\r\n // }),\r\n\r\n // import('./srp').then(srp => {\r\n // this.utils.computeSRP = srp.computeSRP;\r\n // })/* ,\r\n\r\n // import('../bin_utils').then(utils => {\r\n // this.utils.unzip = utils.gzipUncompress;\r\n // }) */\r\n // ]);\r\n\r\n return;\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n public performTaskWorker(task: string, ...args: any[]) {\r\n this.debug && console.log('CW start', task, args);\r\n\r\n \r\n // @ts-ignore\r\n return Promise.resolve(this.utils[task](...args));\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n}\r\n\r\nconst cryptoWorker = new CryptoWorker();\r\n// MOUNT_CLASS_TO.CryptoWorker = cryptoWorker;\r\nexport default cryptoWorker;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Awaited } from \"../../types\";\r\nimport type { aesEncryptSync, aesDecryptSync, sha256HashSync, sha1HashSync, bytesModPow, hash_pbkdf2, rsaEncrypt, pqPrimeFactorization, gzipUncompress } from \"./crypto_utils\";\r\nimport type { computeSRP } from \"./srp\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1-hash': typeof sha1HashSync,\r\n 'sha256-hash': typeof sha256HashSync,\r\n 'pbkdf2': typeof hash_pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof pqPrimeFactorization,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker(task: string, ...args: any[]): Promise;\r\n\r\n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\r\n return this.performTaskWorker>>(method, ...args as any[]);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport { longFromInts } from './bin_utils';\nimport { nextRandomUint } from '../../helpers/random';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { WorkerTaskVoidTemplate } from '../../types';\nimport { notifySomeone } from '../../helpers/context';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager {\n private lastMessageId: [number, number] = [0, 0];\n private timeOffset: number = 0;\n\n constructor() {\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = longFromInts(messageId[0], messageId[1]);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.lastMessageId = [0, 0];\n this.timeOffset = newTimeOffset;\n \n //console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n \n const task: ApplyServerTimeOffsetTask = {\n type: 'applyServerTimeOffset',\n payload: newTimeOffset\n };\n notifySomeone(task);\n \n\n return changed;\n }\n}\n\nconst timeManager = new TimeManager();\nMOUNT_CLASS_TO.timeManager = timeManager;\nexport default timeManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.3.7',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","export default function noop() {}\r\n","/*\r\n * https://github.com/morethanwords/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 * 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 {isObject, sortLongsArray} from './bin_utils';\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoworker';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport timeManager from './timeManager';\nimport networkerFactory from './networkerFactory';\nimport { logger, LogTypes } from '../logger';\nimport { InvokeApiOptions } from '../../types';\nimport { longToBytes } from '../crypto/crypto_utils';\nimport MTTransport from './transports/transport';\nimport { convertToUint8Array, bytesCmp, bytesToHex, bufferConcats } from '../../helpers/bytes';\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 \n \n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport { bigInt2str, rightShift_, str2bigInt } from '../../vendor/leemon';\nimport { forEachReverse } from '../../helpers/array';\nimport { ConnectionStatus } from './connectionStatus';\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 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?: {\n resolve: any,\n reject: any\n },\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 CONNECTION_TIMEOUT = 5000;\nconst DRAIN_TIMEOUT = 10000;\nlet invokeAfterMsgConstructor: number;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResends: Array = [];\n public connectionInited = false;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n \n \n \n \n \n \n \n \n \n\n private seqNo: number = 0;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n req_msg_id: MTLong,\n resend_msg_ids: Array\n } | null = null;\n\n private name: string;\n private log: ReturnType;\n \n public isOnline = false;\n public 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 //private disconnectDelay: number;\n //private pingPromise: CancellablePromise;\n //public onConnectionStatusChange: (online: boolean) => void;\n\n //private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n constructor(public dcId: number, private authKey: Uint8Array, private authKeyId: Uint8Array,\n serverSalt: Uint8Array, public transport: MTTransport, options: InvokeApiOptions = {}) {\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\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n //this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name, LogTypes.Log | /* LogTypes.Debug | */LogTypes.Error | LogTypes.Warn);\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 \n \n \n \n \n \n \n \n \n \n \n //} else {\n (this.transport as TcpObfuscated).networker = this;\n //}\n \n\n // * handle outcoming dead socket, server will close the connection\n // if((this.transport as TcpObfuscated).networker) {\n // this.disconnectDelay = /* (this.transport as TcpObfuscated).retryTimeout */75;\n // //setInterval(this.sendPingDelayDisconnect, (this.disconnectDelay - 5) * 1000);\n // this.sendPingDelayDisconnect();\n // }\n\n if((this.transport as TcpObfuscated).connected) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = new Uint8Array(8).randomize();\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n \n sentMessage.msg_id = timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n /* if(DEBUG) {\n this.log('updateSentMessage', sentMessage.msg_id, sentMessageId);\n } */\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n \n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n \n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n \n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n \n serializer.storeMethod(method, params);\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n \n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n \n if(!this.connectionInited) { // this will call once for each new session\n ///////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find(m => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n \n const initConnection = Schema.API.methods.find(m => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n \n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(networkerFactory.userAgent || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(networkerFactory.language, 'lang_code');\n //serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n \n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find(m => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n \n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n \n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n \n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n \n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n \n return this.pushMessage(message, options);\n }\n\n public destroy() {\n //assumeType(this.transport);\n (this.transport as TcpObfuscated).destroy();\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n }\n }\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).handleClose();\n // }\n\n // return;\n // }\n\n // this.log('sendPingDelayDisconnect', this.sentPingTimes);\n\n // /* if(this.tt) clearTimeout(this.tt);\n // this.tt = self.setTimeout(() => { \n // (this.transport as any).ws.close(1000);\n // this.tt = 0;\n // }, this.disconnectDelay * 1000); */\n // /* this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {\n // noResponse: true,\n // notContentRelated: true\n // }); */\n // const deferred = this.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // /* if(!this.sentPingTimes || true) {\n // ++this.sentPingTimes; */\n // const startTime = Date.now();\n // this.wrapMtpCall('ping', {\n // ping_id: randomLong()\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n // //}\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // (this.transport as Socket).handleClose();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) 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.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // const startTime = Date.now();\n // this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // this.log.error('sendPingDelayDisconnect: catch, closing connection if exists');\n // (this.transport as TcpObfuscated).connection.close();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\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 \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 \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 \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 \n \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 const promise = new Promise((resolve, reject) => {\n this.sentMessages[message.msg_id] = Object.assign(message, options, options.notContentRelated \n ? undefined \n : {\n deferred: {resolve, reject}\n }\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\n if(!options.notContentRelated && !options.noResponse) {\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < CONNECTION_TIMEOUT) {\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 }, CONNECTION_TIMEOUT);\n \n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n --this.activeRequests;\n this.setDrainTimeout();\n });\n \n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n\n return promise;\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = self.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(networkerFactory.onConnectionStatusChange) {\n networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n // if((this.transport as TcpObfuscated).networker) {\n // this.sendPingDelayDisconnect();\n // }\n /* this.sentPingTimes = 0;\n this.sendPingDelayDisconnect(); */\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-hash', 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-hash', 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-hash', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n \n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n \n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n \n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n // this.log('scheduled', this.dcId, this.iii)\n\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 if(this.pendingResends.length) {\n const resendMsgIds = this.pendingResends.slice();\n const resendOpts: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true,\n messageId: '' // will set in wrapMtpMessage->pushMessage\n };\n\n //this.log('resendReq messages', resendMsgIds);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: resendMsgIds\n }, resendOpts);\n\n this.lastResendReq = {\n req_msg_id: resendOpts.messageId,\n resend_msg_ids: resendMsgIds\n };\n }\n \n let outMessage: MTPNetworker['sentMessages'][keyof MTPNetworker['sentMessages']];\n const messages: typeof outMessage[] = [];\n \n //const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n \n \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 \n \n \n \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 \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n \n \n \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 \n \n \n \n \n \n this.cleanupSent(); // ! WARNING\n \n \n \n \n \n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message),\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n \n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n \n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */new Uint8Array(paddingLength).randomize()/* .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 sendEncryptedRequest(message: MTMessage) {\n return this.getEncryptedOutput(message).then(requestData => {\n this.debug && this.log.debug('sendEncryptedRequest: launching message into space:', message, [message.msg_id].concat(message.inner || []));\n\n const promise: Promise = this.transport.send(requestData) as any;\n \n return promise;\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 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: ' + authKeyId.hex);\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 result.result = deserializer.fetchObject(type, field + '[result]');\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 \n \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 \n \n \n \n /* if(!this.isOnline) {\n return;\n } */\n\n this.performScheduledRequest();\n \n };\n\n this.nextReq = nextReq;\n\n if(delay) {\n this.nextReqTimeout = self.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n \n \n \n this.scheduleRequest();\n \n }\n \n private reqResendMessage(msgId: MTLong) {\n if(this.debug) {\n this.log.debug('Req resend', msgId);\n }\n\n this.pendingResends.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n // this.log('clean start', this.dcId/*, this.sentMessages*/)\n Object.keys(this.sentMessages).forEach((msgId) => {\n const message = this.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 this.sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(this.sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], this.sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete this.sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n \n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n //delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}) {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n \n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n for(const id in this.sentMessages) {\n const msg = this.sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\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 // * 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('process message', message, messageId, sessionId);\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 //const changedOffset = timeManager.applyServerTime(bigStringInt(messageId).shiftRight(32).toString(10));\n const bigInt = str2bigInt(messageId, 10);\n rightShift_(bigInt, 32);\n const changedOffset = timeManager.applyServerTime(+bigInt2str(bigInt, 10));\n if(message.error_code === 17 || changedOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n //this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n \n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n \n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n //this.updateSession();\n \n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n \n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && networkerFactory.updatesProcessor) {\n networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n \n case 'msgs_ack': {\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n \n case 'msg_detailed_info':\n if(!this.sentMessages[message.msg_id]) {\n this.ackMessage(message.answer_msg_id);\n break;\n }\n case 'msg_new_detailed_info':\n if(this.pendingAcks.indexOf(message.answer_msg_id)) {\n break;\n }\n this.reqResendMessage(message.answer_msg_id);\n break;\n \n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n if(this.lastResendReq && \n this.lastResendReq.req_msg_id === message.req_msg_id && \n this.pendingResends.length\n ) {\n for(const badMsgId of this.lastResendReq.resend_msg_ids) {\n const pos = this.pendingResends.indexOf(badMsgId);\n if(pos !== -1) {\n this.pendingResends.splice(pos, 1);\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 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 /* if(DEBUG) {\n this.log.debug('Rpc response', message.result, sentMessage);\n } */\n\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n ////this.log('Rpc set connectionInited to:', this.connectionInited);\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 doesn't require acknowledgments\n if((this.transport as TcpObfuscated).networker) {\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 }\n\n break;\n }\n \n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n \n if(networkerFactory.updatesProcessor !== null) {\n networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/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 { copy } from \"./object\";\r\n\r\nexport function listMergeSorted(list1: any[] = [], list2: any[] = []) {\r\n const result = copy(list1);\r\n\r\n const minId = list1.length ? list1[list1.length - 1] : 0xFFFFFFFF;\r\n for(let i = 0; i < list2.length; i++) {\r\n if(list2[i] < minId) {\r\n result.push(list2[i]);\r\n }\r\n }\r\n\r\n return result;\r\n} */\r\n\r\nexport const accumulate = (arr: number[], initialValue: number) => arr.reduce((acc, value) => acc + value, initialValue);\r\n\r\nexport function indexOfAndSplice(array: Array, item: T) {\r\n const idx = array.indexOf(item);\r\n const spliced = idx !== -1 && array.splice(idx, 1);\r\n return spliced && spliced[0];\r\n}\r\n\r\nexport function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\r\n const out: typeof array = [];\r\n let idx = -1;\r\n while((idx = array.findIndex(verify)) !== -1) {\r\n out.push(array.splice(idx, 1)[0]);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\r\n for(let length = array.length, i = length - 1; i >= 0; --i) {\r\n callback(array[i], i, array);\r\n }\r\n};\r\n\r\nexport function insertInDescendSortedArray(array: Array, element: T, property: K, pos?: number) {\r\n const sortProperty: number = element[property];\r\n\r\n if(pos === undefined) {\r\n pos = array.indexOf(element);\r\n if(pos !== -1) {\r\n const prev = array[pos - 1];\r\n const next = array[pos + 1];\r\n if((!prev || prev[property] >= sortProperty) && (!next || next[property] <= sortProperty)) {\r\n // console.warn('same pos', pos, sortProperty, prev, next);\r\n return pos;\r\n }\r\n \r\n array.splice(pos, 1);\r\n }\r\n }\r\n\r\n const len = array.length;\r\n if(!len || sortProperty <= array[len - 1][property]) {\r\n return array.push(element) - 1;\r\n } else if(sortProperty >= array[0][property]) {\r\n array.unshift(element);\r\n return 0;\r\n } else {\r\n for(let i = 0; i < len; i++) {\r\n if(sortProperty > array[i][property]) {\r\n array.splice(i, 0, element);\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n console.error('wtf', array, element);\r\n return array.indexOf(element);\r\n}\r\n\r\nexport function filterUnique>(arr: T): T {\r\n return [...new Set(arr)] as T;\r\n}\r\n","/*\r\n * https://github.com/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 MTTransport from \"./transports/transport\";\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport class NetworkerFactory {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n public onConnectionStatusChange: (info: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n public userAgent = navigator.userAgent;\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n const idx = this.networkers.indexOf(networker);\r\n if(idx !== -1) {\r\n this.networkers.splice(idx, 1);\r\n }\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, transport: MTTransport, options: InvokeApiOptions) {\r\n //console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(dcId, authKey, authKeyId, serverSalt, transport, 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 forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst networkerFactory = new NetworkerFactory();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.networkerFactory = networkerFactory);\r\nexport default networkerFactory;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\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\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase> {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = [];\r\n\r\n /* let a = e.wm.get(this)[name];\r\n if(!a) return arr;\r\n const listeners = [...a]; */\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 arr.push(listener.callback(...args));\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n\r\n /* for(let i = 0, length = listeners.length; i < length; ++i) {\r\n const listener = listeners[i];\r\n arr.push(listener.callback(...args));\r\n\r\n if(listener.once) {\r\n listeners.splice(i, 1);\r\n --i;\r\n --length;\r\n }\r\n } */\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\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\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import aesjs from 'aes-js';\r\nimport AES from \"@cryptography/aes\";\r\nimport { bytesFromWordss } from \"../../../helpers/bytes\";\r\nimport { Codec } from \"./codec\";\r\n\r\nclass Counter {\r\n _counter: Uint8Array;\r\n\r\n constructor(initialValue: Uint8Array) {\r\n this._counter = initialValue;\r\n }\r\n\r\n increment() {\r\n for(let i = 15; i >= 0; i--) {\r\n if(this._counter[i] === 255) {\r\n this._counter[i] = 0;\r\n } else {\r\n this._counter[i]++;\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass CTR {\r\n _counter: Counter;\r\n _remainingCounter: Uint8Array = null;\r\n _remainingCounterIndex = 16;\r\n _aes: AES;\r\n\r\n constructor(key: Uint8Array, counter: Uint8Array) {\r\n this._counter = new Counter(counter);\r\n this._aes = new AES(key);\r\n }\r\n\r\n update(payload: Uint8Array) {\r\n const encrypted = payload.slice();\r\n\r\n for(let i = 0; i < encrypted.length; i++) {\r\n if(this._remainingCounterIndex === 16) {\r\n this._remainingCounter = new Uint8Array(bytesFromWordss(this._aes.encrypt(this._counter._counter)));\r\n this._remainingCounterIndex = 0;\r\n this._counter.increment();\r\n }\r\n\r\n encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];\r\n }\r\n\r\n return encrypted;\r\n }\r\n}\r\n\r\n/* \r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* public enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n public dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n public encNew: CTR;\r\n public decNew: CTR;\r\n\r\n public init(codec: Codec) {\r\n const initPayload = new Uint8Array(64);\r\n initPayload.randomize();\r\n \r\n while(true) {\r\n let val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | (initPayload[0]);\r\n let 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 initPayload.randomize();\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 = initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n\r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n this.encNew = new CTR(encKey, encIv);\r\n this.decNew = new CTR(decKey, decIv);\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = this.encode(initPayload);\r\n\r\n //console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n } */\r\n public encode(payload: Uint8Array) {\r\n return this.encNew.update(payload);\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.decNew.update(payload);\r\n }\r\n /* public encode(payload: Uint8Array) {\r\n let res = this.encNew.encrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.decNew.decrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n } */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Codec } from \"./codec\";\r\n\r\nexport class IntermediatePacketCodec implements Codec {\r\n public tag = 0xee;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n //private lol = 0;\r\n\r\n public encodePacket(data: Uint8Array) {\r\n if((data.length % 4) !== 0) {\r\n console.error('Encode error!', data.length, data);\r\n }\r\n\r\n const len = data.length;\r\n const header = new Uint8Array(new Int32Array([/* ++this.lol >= 25 ? 0x80000001 : */len]).buffer);\r\n\r\n //console.log('got nobody cause im braindead', header, len, /* data, */data.buffer.byteLength === data.length);\r\n return header.concat(data);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n const length = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);\r\n\r\n return data.slice(4, 4 + length);\r\n }\r\n}\r\n\r\nexport default new IntermediatePacketCodec();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from \"../../../config/modes\";\nimport { logger, LogTypes } from \"../../logger\";\nimport MTPNetworker from \"../networker\";\nimport Obfuscation from \"./obfuscation\";\nimport MTTransport, { MTConnection, MTConnectionConstructable } from \"./transport\";\nimport intermediatePacketCodec from './intermediate';\nimport { ConnectionStatus } from \"../connectionStatus\";\n\nexport default class TcpObfuscated implements MTTransport {\n private codec = intermediatePacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n private connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n\n //private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(private Connection: MTConnectionConstructable, \n private dcId: number, \n private url: string, \n private logSuffix: string, \n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n \n this.connect();\n }\n\n private onOpen = () => {\n this.connected = true;\n\n const initPayload = this.obfuscation.init(this.codec);\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n } else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n }\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = (buffer: ArrayBuffer) => {\n let data = this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n //this.pending = this.pending.filter(p => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then(response => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n //this.releasePending();\n }).catch(err => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n //this.dd();\n return;\n }\n\n //console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', data.hex);\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n \n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n \n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = self.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n 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\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n //this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n //this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = this.connected ? this.encodeBody(body) : undefined;\n\n //return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private releasePending(/* tt = false */) {\n if(!this.connected) {\n //this.connect();\n return;\n }\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n //this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n //for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n /* if(this.ws.bufferedAmount) {\n break;\n } */\n\n const pending = this.pending[i];\n const {body, bodySent} = pending;\n let encoded = pending.encoded;\n if(body && !bodySent) {\n\n //this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n /* if(this.ws.bufferedAmount) {\n this.log.error('bufferedAmount:', this.ws.bufferedAmount);\n } */\n\n /* if(this.ws.readyState !== this.ws.OPEN) {\n this.log.error('ws is closed?');\n this.connected = false;\n break;\n } */\n\n if(!encoded) {\n encoded = pending.encoded = this.encodeBody(body);\n }\n\n //this.lol.push(body);\n //setTimeout(() => {\n this.connection.send(encoded);\n //}, 100);\n //this.dd();\n \n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n //delete pending.body;\n }\n }\n }\n}\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;","/*\r\n * https://github.com/morethanwords/tweb\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\nimport { notifyAll } from \"../../../helpers/context\";\r\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\r\nimport { WorkerTaskVoidTemplate } from \"../../../types\";\r\nimport { MTConnection } from \"./transport\";\r\n\r\nlet socketId = 0;\r\nexport interface SocketProxyTask extends WorkerTaskVoidTemplate {\r\n type: 'socketProxy',\r\n payload: SocketProxySetupTask | SocketProxySendTask | SocketProxyCloseTask\r\n};\r\n\r\nexport interface SocketProxySetupTask extends WorkerTaskVoidTemplate {\r\n type: 'setup',\r\n payload: {\r\n dcId: number,\r\n url: string,\r\n logSuffix: string\r\n },\r\n id: number\r\n};\r\n\r\nexport interface SocketProxySendTask extends WorkerTaskVoidTemplate {\r\n type: 'send',\r\n payload: Uint8Array,\r\n id: number\r\n};\r\n\r\nexport interface SocketProxyCloseTask extends WorkerTaskVoidTemplate {\r\n type: 'close',\r\n id: number\r\n};\r\n\r\n \r\nexport default class SocketProxied extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private id: number;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n this.id = ++socketId;\r\n socketsProxied.set(this.id, this);\r\n\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'setup', \r\n payload: {\r\n dcId, \r\n url,\r\n logSuffix\r\n },\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public send(payload: Uint8Array) {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy', \r\n payload: {\r\n type: 'send',\r\n payload,\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public close() {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'close',\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n}\r\n \r\n\r\nexport const socketsProxied: Map = new Map();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport MTTransport, { MTConnectionConstructable } from './transports/transport';\r\nimport Modes from '../../config/modes';\r\n\r\n \r\n \r\n \r\n\r\n \r\nimport Socket from './transports/websocket';\r\nimport TcpObfuscated from './transports/tcpObfuscated';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport { isWebWorker } from '../../helpers/context';\r\nimport SocketProxied from './transports/socketProxied';\r\nimport App from '../../config/app';\r\n \r\n\r\nexport type TransportType = 'websocket' | 'https' | 'http';\r\nexport type ConnectionType = 'client' | 'download' | 'upload';\r\ntype Servers = {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: number]: MTTransport[]\r\n }\r\n }\r\n};\r\n\r\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\r\n\r\nexport class DcConfigurator {\r\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\r\n\r\n private dcOptions = Modes.test\r\n ? [\r\n {id: 1, host: '149.154.175.10', port: 80},\r\n {id: 2, host: '149.154.167.40', port: 80},\r\n {id: 3, host: '149.154.175.117', port: 80}\r\n ]\r\n : [\r\n {id: 1, host: '149.154.175.50', port: 80},\r\n {id: 2, host: '149.154.167.50', port: 80},\r\n {id: 3, host: '149.154.175.100', port: 80},\r\n {id: 4, host: '149.154.167.91', port: 80},\r\n {id: 5, host: '149.154.171.5', port: 80}\r\n ];\r\n\r\n public chosenServers: Servers = {} as any;\r\n\r\n \r\n private transportSocket = (dcId: number, connectionType: ConnectionType, suffix: string) => {\r\n const path = 'apiws' + TEST_SUFFIX;\r\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n\r\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\r\n\r\n const oooohLetMeLive: MTConnectionConstructable = (IS_SAFARI && isWebWorker && typeof(SocketProxied) !== 'undefined') /* || true */ ? SocketProxied : Socket;\r\n\r\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\r\n };\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n public chooseServer(dcId: number, connectionType: ConnectionType = 'client', transportType: TransportType = 'websocket', reuse = true) {\r\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\r\n connectionType = 'client';\r\n } */\r\n\r\n if(!this.chosenServers.hasOwnProperty(transportType)) {\r\n this.chosenServers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const servers = this.chosenServers[transportType][connectionType];\r\n\r\n if(!(dcId in servers)) {\r\n servers[dcId] = [];\r\n }\r\n\r\n const transports = servers[dcId];\r\n\r\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\r\n let transport: MTTransport;\r\n\r\n const suffix = connectionType === 'client' ? '' : '-1';\r\n\r\n \r\n \r\n \r\n transport = this.transportSocket(dcId, connectionType, suffix);\r\n \r\n \r\n \r\n \r\n if(!transport) {\r\n console.error('No chosenServer!', dcId);\r\n return null;\r\n }\r\n \r\n if(reuse) {\r\n transports.push(transport);\r\n }\r\n \r\n return transport;\r\n }\r\n \r\n return transports[0];\r\n }\r\n \r\n public static removeTransport(obj: any, transport: T) {\r\n for(const transportType in obj) {\r\n // @ts-ignore\r\n for(const connectionType in obj[transportType]) {\r\n // @ts-ignore\r\n for(const dcId in obj[transportType][connectionType]) {\r\n // @ts-ignore\r\n const transports: T[] = obj[transportType][connectionType][dcId];\r\n const idx = transports.indexOf(transport);\r\n if(idx !== -1) {\r\n transports.splice(idx, 1);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new DcConfigurator();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { TLSerialization } from \"./tl_utils\";\r\nimport CryptoWorker from '../crypto/cryptoworker';\r\nimport { bytesFromHex, bytesToHex } from \"../../helpers/bytes\";\r\nimport { bigInt2str, str2bigInt } from \"../../vendor/leemon\";\r\nimport Modes from \"../../config/modes\";\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\r\n\r\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n * \r\n * \r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via \r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map(keyParsed => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return CryptoWorker.invokeCrypto('sha1-hash', 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 //fingerprintHex = bigStringInt(fingerprints[i]).toString(16);\r\n let fingerprintHex = bigInt2str(str2bigInt(fingerprints[i], 10), 16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n //console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { TLSerialization, TLDeserialization } from \"./tl_utils\";\nimport dcConfigurator from \"./dcConfigurator\";\nimport rsaKeysManager from \"./rsaKeysManager\";\nimport timeManager from \"./timeManager\";\n\nimport CryptoWorker from \"../crypto/cryptoworker\";\n\nimport { logger, LogTypes } from \"../logger\";\nimport { bytesCmp, bytesToHex, bytesFromHex, bytesXor } from \"../../helpers/bytes\";\nimport DEBUG from \"../../config/debug\";\nimport { cmp, int2bigInt, one, pow, str2bigInt, sub } from \"../../vendor/leemon\";\nimport { addPadding } from \"./bin_utils\";\nimport { Awaited } from \"../../types\";\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 localTry?: number\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer {\n private cached: {\n [dcId: number]: Promise\n } = {};\n \n private log: ReturnType;\n \n constructor() {\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n \n private sendPlainRequest(dcId: number, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n \n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n \n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = dcConfigurator.chooseServer(dcId);\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', auth.nonce.hex);\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 = new Uint8Array(32).randomize();\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 = new Uint8Array(32).randomize();\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256-hash', 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-hash', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = str2bigInt(bytesToHex(keyAesEncrypted), 16);\n const publicKeyModulusBigInt = str2bigInt(auth.publicKey.modulus, 16);\n\n if(cmp(keyAesEncryptedBigInt, 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-hash', 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-hash', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1-hash', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n \n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1-hash', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1-hash', 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-hash', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1-hash mismatch');\n }\n \n timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n \n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n \n const _gABigInt = str2bigInt(bytesToHex(gA), 16);\n const _dhPrimeBigInt = str2bigInt(dhPrimeHex, 16);\n\n if(cmp(_gABigInt, one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(cmp(_gABigInt, sub(_dhPrimeBigInt, 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 _two = int2bigInt(2, 32, 0);\n const _twoPow = pow(_two, 2048 - 64);\n\n if(cmp(_gABigInt, _twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(cmp(_gABigInt, sub(_dhPrimeBigInt, _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 = new Uint8Array(256).randomize();\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-hash', 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-hash', 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-hash', 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-hash', 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-hash', 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 public async auth(dcId: number): Promise {\n if(dcId in this.cached) {\n return this.cached[dcId];\n }\n \n const nonce = /* fNonce ? fNonce : */new Uint8Array(16).randomize();\n /* const nonce = new Array(16);\n MTProto.secureRandom.nextBytes(nonce); */\n \n if(!dcConfigurator.chooseServer(dcId)) {\n throw new Error('[MT] No server found for dc ' + dcId);\n }\n\n // await new Promise((resolve) => setTimeout(resolve, 2e3));\n\n const auth: AuthOptions = {dcId, nonce, localTry: 1};\n \n try {\n const promise = this.sendReqPQ(auth);\n this.cached[dcId] = promise;\n return await promise;\n } catch(err) {\n if(/* err.originalError === -404 && */auth.localTry <= 3) {\n return this.sendReqPQ({\n dcId: auth.dcId, \n nonce: new Uint8Array(16).randomize(),\n localTry: auth.localTry + 1\n });\n }\n\n delete this.cached[dcId];\n throw err;\n }\n }\n}\n\nexport default new Authorizer();\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}","/*\r\n * https://github.com/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 function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.addEventListener('loadend', (e) => resolve(e.target.result));\r\n reader[method](blob);\r\n });\r\n}\r\n\r\nexport function readBlobAsText(blob: Blob) {\r\n return readBlobAs(blob, 'readAsText');\r\n}\r\n\r\nexport function readBlobAsDataURL(blob: Blob) {\r\n return readBlobAs(blob, 'readAsDataURL');\r\n}\r\n\r\nexport function readBlobAsArrayBuffer(blob: Blob) {\r\n return readBlobAs(blob, 'readAsArrayBuffer');\r\n}\r\n\r\nexport function readBlobAsUint8Array(blob: Blob) {\r\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\r\n}\r\n\r\nexport function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\r\n let blob;\r\n const safeMimeType = blobSafeMimeType(mimeType);\r\n try {\r\n blob = new Blob(blobParts, {type: safeMimeType});\r\n } catch(e) {\r\n // @ts-ignore\r\n let bb = new BlobBuilder;\r\n blobParts.forEach((blobPart: any) => {\r\n bb.append(blobPart);\r\n });\r\n blob = bb.getBlob(safeMimeType);\r\n }\r\n return blob;\r\n}\r\n\r\n// https://www.iana.org/assignments/media-types/media-types.xhtml\r\nexport function blobSafeMimeType(mimeType: string) {\r\n if([\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/gif',\r\n 'image/webp',\r\n 'image/bmp',\r\n 'video/mp4',\r\n 'video/webm',\r\n 'video/quicktime',\r\n 'audio/ogg',\r\n 'audio/mpeg',\r\n 'audio/mp4',\r\n 'application/json',\r\n 'application/pdf'\r\n ].indexOf(mimeType) === -1) {\r\n return 'application/octet-stream';\r\n }\r\n\r\n return mimeType;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport { safeAssign } from '../helpers/object';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.forEach(storage => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map(name => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map(storage => storage.name)));\r\n const promises = dbNames.map(dbName => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[]) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct([blob]) as Blob;\r\n }\r\n\r\n return this.save(fileName, blob);\r\n }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function copy(obj: T): T {\r\n //in case of premitives\r\n if(obj === null || typeof(obj) !== \"object\") {\r\n return obj;\r\n }\r\n \r\n //date objects should be \r\n if(obj instanceof Date) {\r\n return new Date(obj.getTime()) as any;\r\n }\r\n \r\n //handle Array\r\n if(Array.isArray(obj)) {\r\n // @ts-ignore\r\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\r\n return clonedArr;\r\n }\r\n \r\n //lastly, handle objects\r\n // @ts-ignore\r\n let clonedObj = new obj.constructor();\r\n for(var prop in obj){\r\n if(obj.hasOwnProperty(prop)) {\r\n clonedObj[prop] = copy(obj[prop]);\r\n }\r\n }\r\n return clonedObj;\r\n}\r\n\r\nexport function deepEqual(x: any, y: any): boolean {\r\n const ok = Object.keys, tx = typeof x, ty = typeof y;\r\n return x && y && tx === 'object' && tx === ty ? (\r\n ok(x).length === ok(y).length &&\r\n ok(x).every(key => deepEqual(x[key], y[key]))\r\n ) : (x === y);\r\n}\r\n\r\nexport function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\r\n //const perf = performance.now();\r\n const props = {writable: true, configurable: true};\r\n const out: {[name in keyof T]?: typeof props} = {};\r\n names.forEach(name => {\r\n if(!obj.hasOwnProperty(name)) {\r\n out[name] = props;\r\n }\r\n });\r\n Object.defineProperties(obj, out);\r\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\r\n}\r\n\r\nexport function getObjectKeysAndSort(object: {[key: string]: any}, sort: 'asc' | 'desc' = 'asc') {\r\n if(!object) return [];\r\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map(i => +i);\r\n if(sort === 'asc') return ids.sort((a, b) => a - b);\r\n else return ids.sort((a, b) => b - a);\r\n}\r\n\r\nexport function safeReplaceObject(wasObject: any, newObject: any) {\r\n if(!wasObject) {\r\n return newObject;\r\n }\r\n\r\n for(var key in wasObject) {\r\n if(!newObject.hasOwnProperty(key)) {\r\n delete wasObject[key];\r\n }\r\n }\r\n\r\n for(var key in newObject) {\r\n //if (newObject.hasOwnProperty(key)) { // useless\r\n wasObject[key] = newObject[key];\r\n //}\r\n }\r\n \r\n return wasObject;\r\n}\r\n\r\n/**\r\n * Will be used for FILE_REFERENCE_EXPIRED\r\n * @param key \r\n * @param wasObject \r\n * @param newObject \r\n */\r\nexport function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\r\n if('byteLength' in newObject[key]) { // Uint8Array\r\n newObject[key] = [...newObject[key]];\r\n }\r\n\r\n if(wasObject && wasObject[key] !== newObject[key]) {\r\n wasObject[key].length = newObject[key].length;\r\n (newObject[key] as any[]).forEach((v, i) => {\r\n wasObject[key][i] = v;\r\n });\r\n\r\n /* wasObject[key].set(newObject[key]); */\r\n newObject[key] = wasObject[key];\r\n }\r\n}\r\n\r\nexport function isObject>(object: any): object is T {\r\n return typeof(object) === 'object' && object !== null;\r\n}\r\n\r\nexport function getDeepProperty(object: any, key: string) {\r\n const splitted = key.split('.');\r\n let o: any = object;\r\n splitted.forEach(key => {\r\n if(!key) {\r\n return;\r\n }\r\n \r\n // @ts-ignore\r\n o = o[key];\r\n });\r\n \r\n return o;\r\n}\r\n\r\nexport function setDeepProperty(object: any, key: string, value: any) {\r\n const splitted = key.split('.');\r\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\r\n}\r\n\r\nexport function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\r\n for(const key in initObject) {\r\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\r\n currentObject[key] = copy(initObject[key]);\r\n onReplace && onReplace(previousKey || key);\r\n } else if(isObject(initObject[key])) {\r\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\r\n }\r\n }\r\n}\r\n\r\nexport function safeAssign(object: any, fromObject: any) {\r\n if(!fromObject) return;\r\n \r\n for(let i in fromObject) {\r\n if(fromObject[i] !== undefined) {\r\n object[i] = fromObject[i];\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { UserAuth } from './mtproto_config';\r\nimport sessionStorage from '../sessionStorage';\r\nimport MTPNetworker, { MTMessage } from './networker';\r\nimport { isObject } from './bin_utils';\r\nimport networkerFactory from './networkerFactory';\r\n//import { telegramMeWebService } from './mtproto';\r\nimport authorizer from './authorizer';\r\nimport dcConfigurator, { ConnectionType, DcConfigurator, TransportType } from './dcConfigurator';\r\nimport { logger } from '../logger';\r\nimport type { DcAuthKey, DcId, DcServerSalt, InvokeApiOptions } from '../../types';\r\nimport type { MethodDeclMap } from '../../layer';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\nimport { bytesFromHex, bytesToHex } from '../../helpers/bytes';\r\n//import { clamp } from '../../helpers/number';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport App from '../../config/app';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport IDBStorage from '../idb';\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport ctx from '../../environment/ctx';\r\nimport noop from '../../helpers/noop';\r\n\r\n \r\n \r\n \r\n\r\n/* var networker = apiManager.cachedNetworkers.websocket.upload[2];\r\nnetworker.wrapMtpMessage({\r\n _: 'msgs_state_req',\r\n msg_ids: [\"6888292542796810828\"]\r\n}, {\r\n notContentRelated: true\r\n}).then(res => {\r\n console.log('status', res);\r\n}); */\r\n\r\n//console.error('apiManager included!');\r\n// TODO: если запрос словил флуд, нужно сохранять его параметры и возвращать тот же промис на новый такой же запрос, например - загрузка истории\r\n\r\nexport type ApiError = Partial<{\r\n code: number,\r\n type: string,\r\n description: string,\r\n originalError: any,\r\n stack: string,\r\n handled: boolean,\r\n input: string,\r\n message: ApiError\r\n}>;\r\n\r\n/* class RotatableArray {\r\n public array: Array = [];\r\n private lastIndex = -1;\r\n\r\n public get() {\r\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\r\n return this.array[this.lastIndex];\r\n }\r\n} */\r\n\r\nexport class ApiManager {\r\n private cachedNetworkers: {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: number]: MTPNetworker[]\r\n }\r\n }\r\n } = {} as any;\r\n \r\n private cachedExportPromise: {[x: number]: Promise} = {};\r\n private gettingNetworkers: {[dcIdAndType: string]: Promise} = {};\r\n private baseDcId: DcId = 0 as DcId;\r\n \r\n //public telegramMeNotified = false;\r\n\r\n private log: ReturnType = logger('API');\r\n\r\n private afterMessageTempIds: {\r\n [tempId: string]: {\r\n messageId: string,\r\n promise: Promise\r\n }\r\n } = {};\r\n\r\n //private lol = false;\r\n \r\n // constructor() {\r\n //MtpSingleInstanceService.start();\r\n \r\n /* AppStorage.get('dc').then((dcId) => {\r\n if(dcId) {\r\n this.baseDcId = dcId;\r\n }\r\n }); */\r\n // }\r\n \r\n /* public telegramMeNotify(newValue: boolean) {\r\n if(this.telegramMeNotified !== newValue) {\r\n this.telegramMeNotified = newValue;\r\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\r\n }\r\n } */\r\n\r\n public async getBaseDcId() {\r\n if(this.baseDcId) {\r\n return this.baseDcId;\r\n }\r\n\r\n const baseDcId = await sessionStorage.get('dc');\r\n if(!this.baseDcId) {\r\n if(!baseDcId) {\r\n this.setBaseDcId(App.baseDcId);\r\n } else {\r\n this.baseDcId = baseDcId;\r\n }\r\n }\r\n\r\n return this.baseDcId;\r\n }\r\n \r\n public async setUserAuth(userAuth: UserAuth) {\r\n if(!userAuth.dcID) {\r\n const baseDcId = await this.getBaseDcId();\r\n userAuth.dcID = baseDcId;\r\n }\r\n\r\n sessionStorage.set({\r\n user_auth: userAuth\r\n });\r\n \r\n //this.telegramMeNotify(true);\r\n\r\n \r\n \r\n \r\n }\r\n\r\n public setBaseDcId(dcId: DcId) {\r\n const wasDcId = this.baseDcId;\r\n if(wasDcId) { // if migrated set ondrain\r\n this.getNetworker(wasDcId).then(networker => {\r\n this.setOnDrainIfNeeded(networker);\r\n });\r\n }\r\n\r\n this.baseDcId = dcId;\r\n\r\n sessionStorage.set({\r\n dc: this.baseDcId\r\n });\r\n }\r\n \r\n public async logOut() {\r\n const storageKeys: Array = [];\r\n \r\n const prefix = 'dc';\r\n for(let dcId = 1; dcId <= 5; dcId++) {\r\n storageKeys.push(prefix + dcId + '_auth_key' as any);\r\n }\r\n \r\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\r\n const storageResult = await Promise.all(storageKeys.map(key => sessionStorage.get(key)));\r\n \r\n const logoutPromises: Promise[] = [];\r\n for(let i = 0; i < storageResult.length; i++) {\r\n if(storageResult[i]) {\r\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\r\n }\r\n }\r\n\r\n const clear = () => {\r\n //console.error('apiManager: logOut clear');\r\n \r\n this.baseDcId = undefined;\r\n //this.telegramMeNotify(false);\r\n IDBStorage.closeDatabases();\r\n self.postMessage({type: 'clear'});\r\n };\r\n\r\n setTimeout(clear, 1e3);\r\n\r\n //return;\r\n \r\n return Promise.all(logoutPromises).catch((error) => {\r\n error.handled = true;\r\n }).finally(clear)/* .then(() => {\r\n location.pathname = '/';\r\n }) */;\r\n }\r\n \r\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\r\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\r\n //const connectionType: ConnectionType = 'client';\r\n\r\n \r\n \r\n \r\n \r\n \r\n // @ts-ignore\r\n const transportType = 'websocket';\r\n \r\n\r\n if(!this.cachedNetworkers.hasOwnProperty(transportType)) {\r\n this.cachedNetworkers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const cache = this.cachedNetworkers[transportType][connectionType];\r\n if(!(dcId in cache)) {\r\n cache[dcId] = [];\r\n }\r\n \r\n const networkers = cache[dcId];\r\n // @ts-ignore\r\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (connectionType === 'download' ? 3 : 3);\r\n if(networkers.length >= maxNetworkers) {\r\n let i = networkers.length - 1, found = false;\r\n for(; i >= 0; --i) {\r\n if(networkers[i].isOnline) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n \r\n const networker = found ? networkers.splice(i, 1)[0] : networkers.pop();\r\n networkers.unshift(networker);\r\n return Promise.resolve(networker);\r\n }\r\n \r\n const getKey = [dcId, transportType, connectionType].join('-');\r\n if(this.gettingNetworkers[getKey]) {\r\n return this.gettingNetworkers[getKey];\r\n }\r\n\r\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\r\n \r\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map(key => sessionStorage.get(key)))\r\n .then(async([authKeyHex, serverSaltHex]) => {\r\n const transport = dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client');\r\n let networker: MTPNetworker;\r\n if(authKeyHex && authKeyHex.length === 512) {\r\n if(!serverSaltHex || serverSaltHex.length !== 16) {\r\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\r\n }\r\n \r\n const authKey = bytesFromHex(authKeyHex);\r\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1-hash', authKey)).slice(-8);\r\n const serverSalt = bytesFromHex(serverSaltHex);\r\n \r\n networker = networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, transport, options);\r\n } else {\r\n try { // if no saved state\r\n const auth = await authorizer.auth(dcId);\r\n \r\n const storeObj = {\r\n [ak]: bytesToHex(auth.authKey),\r\n [ss]: bytesToHex(auth.serverSalt)\r\n };\r\n \r\n sessionStorage.set(storeObj);\r\n \r\n networker = networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, transport, options);\r\n } catch(error) {\r\n this.log('Get networker error', error, (error as Error).stack);\r\n delete this.gettingNetworkers[getKey];\r\n throw error;\r\n }\r\n }\r\n\r\n /* networker.onConnectionStatusChange = (online) => {\r\n console.log('status:', online);\r\n }; */\r\n \r\n delete this.gettingNetworkers[getKey];\r\n networkers.unshift(networker);\r\n this.setOnDrainIfNeeded(networker);\r\n return networker;\r\n });\r\n }\r\n\r\n public setOnDrainIfNeeded(networker: MTPNetworker) {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n const checkPromise: Promise = networker.isFileNetworker ? \r\n Promise.resolve(true) : \r\n this.getBaseDcId().then(baseDcId => networker.dcId !== baseDcId);\r\n checkPromise.then(canRelease => {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n if(canRelease) {\r\n networker.onDrain = () => {\r\n this.log('networker drain', networker.dcId);\r\n\r\n networker.onDrain = undefined;\r\n networker.destroy();\r\n networkerFactory.removeNetworker(networker);\r\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\r\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, networker.transport);\r\n };\r\n\r\n networker.setDrainTimeout();\r\n }\r\n });\r\n }\r\n \r\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\r\n ///////this.log('Invoke api', method, params, options);\r\n\r\n /* if(!this.lol) {\r\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\r\n this.lol = true;\r\n } */\r\n\r\n const deferred = deferredPromise();\r\n\r\n let {afterMessageId, prepareTempMessageId} = options;\r\n if(prepareTempMessageId) {\r\n deferred.then(() => {\r\n delete this.afterMessageTempIds[prepareTempMessageId];\r\n });\r\n }\r\n\r\n if(MOUNT_CLASS_TO) {\r\n const startTime = Date.now();\r\n const interval = ctx.setInterval(() => {\r\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\r\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\r\n }\r\n //this.cachedUploadNetworkers[2].requestMessageStatus();\r\n }, 5e3);\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearInterval(interval);\r\n });\r\n }\r\n\r\n const rejectPromise = (error: ApiError) => {\r\n if(!error) {\r\n error = {type: 'ERROR_EMPTY'};\r\n } else if(!isObject(error)) {\r\n error = {message: error};\r\n }\r\n \r\n deferred.reject(error);\r\n\r\n if((error.code === 401 && error.type === 'SESSION_REVOKED') || \r\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\r\n this.logOut();\r\n }\r\n\r\n if(options.ignoreErrors) {\r\n return;\r\n }\r\n \r\n if(error.code === 406) {\r\n error.handled = true;\r\n }\r\n \r\n if(!options.noErrorBox) {\r\n error.input = method;\r\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\r\n setTimeout(() => {\r\n if(!error.handled) {\r\n if(error.code === 401) {\r\n this.logOut();\r\n } else {\r\n // ErrorService.show({error: error}); // WARNING\r\n }\r\n \r\n error.handled = true;\r\n }\r\n }, 100);\r\n }\r\n };\r\n \r\n let dcId: DcId;\r\n \r\n let cachedNetworker: MTPNetworker;\r\n let stack = (new Error()).stack || 'empty stack';\r\n const performRequest = (networker: MTPNetworker) => {\r\n if(afterMessageId) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n if(after) {\r\n options.afterMessageId = after.messageId;\r\n }\r\n }\r\n\r\n const promise = (cachedNetworker = networker).wrapApiCall(method, params, options);\r\n\r\n if(prepareTempMessageId) {\r\n this.afterMessageTempIds[prepareTempMessageId] = {\r\n messageId: (options as MTMessage).messageId,\r\n promise: deferred\r\n };\r\n }\r\n\r\n return promise.then(deferred.resolve, (error: ApiError) => {\r\n //if(!options.ignoreErrors) {\r\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\r\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\r\n }\r\n \r\n if(error.code === 401 && this.baseDcId === dcId) {\r\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\r\n sessionStorage.delete('dc')\r\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\r\n //this.telegramMeNotify(false);\r\n }\r\n \r\n rejectPromise(error);\r\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\r\n if(this.cachedExportPromise[dcId] === undefined) {\r\n const promise = new Promise((exportResolve, exportReject) => {\r\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\r\n this.invokeApi('auth.importAuthorization', {\r\n id: exportedAuth.id,\r\n bytes: exportedAuth.bytes\r\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\r\n }, exportReject);\r\n });\r\n \r\n this.cachedExportPromise[dcId] = promise;\r\n }\r\n \r\n this.cachedExportPromise[dcId].then(() => {\r\n //(cachedNetworker = networker).wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n this.invokeApi(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else if(error.code === 303) {\r\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n if(options.dcId) {\r\n options.dcId = newDcId;\r\n } else {\r\n this.setBaseDcId(newDcId);\r\n }\r\n \r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n }\r\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\r\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n } else if(!options.rawError && error.code === 420) {\r\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\r\n \r\n if(waitTime > (options.floodMaxTimeout !== undefined ? options.floodMaxTimeout : 60) && !options.prepareTempMessageId) {\r\n return rejectPromise(error);\r\n }\r\n \r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, waitTime/* (waitTime + 5) */ * 1000); // 03.02.2020\r\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n\r\n afterMessageId = undefined;\r\n delete options.afterMessageId;\r\n\r\n if(after) after.promise.then(() => performRequest(cachedNetworker));\r\n else performRequest(cachedNetworker);\r\n } else if(!options.rawError && error.code === 500) {\r\n const now = Date.now();\r\n if(options.stopTime) {\r\n if(now >= options.stopTime) {\r\n return rejectPromise(error);\r\n }\r\n }\r\n \r\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, options.waitTime * 1000);\r\n } else if(error.type === 'UNKNOWN') {\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, 1000);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n });\r\n }\r\n \r\n if(dcId = (options.dcId || this.baseDcId)) {\r\n this.getNetworker(dcId, options).then(performRequest, rejectPromise);\r\n } else {\r\n this.getBaseDcId().then(baseDcId => {\r\n this.getNetworker(dcId = baseDcId, options).then(performRequest, rejectPromise);\r\n });\r\n }\r\n\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiManager = new ApiManager();\r\nMOUNT_CLASS_TO.apiManager = apiManager;\r\nexport default apiManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { blobConstruct, readBlobAsUint8Array } from \"../helpers/blob\";\r\n\r\nexport class FileManager {\r\n public blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport FileManager from './filemanager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ReferenceBytes } from \"./referenceDatabase\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport { readBlobAsArrayBuffer } from \"../../helpers/blob\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { notifyAll, notifySomeone } from \"../../helpers/context\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport { randomLong } from \"../../helpers/random\";\r\nimport { InputFile, InputFileLocation, InputWebFileLocation, UploadFile, UploadWebFile } from \"../../layer\";\r\nimport { DcId, WorkerTaskVoidTemplate } from \"../../types\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport cryptoWorker from \"../crypto/cryptoworker\";\r\nimport FileManager from \"../filemanager\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"./apiManager\";\r\nimport { isWebpSupported } from \"./mtproto.worker\";\r\nimport { bytesToHex } from \"../../helpers/bytes\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport ctx from \"../../environment/ctx\";\r\nimport noop from \"../../helpers/noop\";\r\n\r\ntype Delayed = {\r\n offset: number, \r\n writeFilePromise: CancellablePromise, \r\n writeFileDeferred: CancellablePromise\r\n};\r\n\r\nexport type DownloadOptions = {\r\n dcId: DcId, \r\n location: InputFileLocation | InputWebFileLocation, \r\n size?: number,\r\n fileName?: string,\r\n mimeType?: string,\r\n limitPart?: number,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n};\r\n\r\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\r\n\r\nexport interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\r\n type: 'refreshReference',\r\n payload: ReferenceBytes,\r\n};\r\n\r\nexport interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\r\n type: 'refreshReference',\r\n payload: ReferenceBytes,\r\n originalPayload: ReferenceBytes\r\n};\r\n\r\nconst MAX_FILE_SAVE_SIZE = 20e6;\r\n\r\nexport class ApiFileManager {\r\n private cacheStorage = new CacheStorageController('cachedFiles');\r\n\r\n private cachedDownloadPromises: {\r\n [fileName: string]: CancellablePromise\r\n } = {};\r\n\r\n private uploadPromises: {\r\n [fileName: string]: Set>\r\n } = {};\r\n\r\n private downloadPulls: {\r\n [dcId: string]: Array<{\r\n id: number,\r\n queueId: number,\r\n cb: () => Promise,\r\n deferred: {\r\n resolve: (...args: any[]) => void,\r\n reject: (...args: any[]) => void\r\n },\r\n activeDelta: number\r\n }>\r\n } = {};\r\n private downloadActives: {[dcId: string]: number} = {};\r\n\r\n public webpConvertPromises: {[fileName: string]: CancellablePromise} = {};\r\n public refreshReferencePromises: {\r\n [referenceHex: string]: {\r\n deferred: CancellablePromise,\r\n timeout: number\r\n }\r\n } = {};\r\n\r\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\r\n private tempId = 0;\r\n private queueId = 0;\r\n private debug = Modes.debug;\r\n\r\n constructor() {\r\n setInterval(() => { // clear old promises\r\n for(const hex in this.refreshReferencePromises) {\r\n const {deferred} = this.refreshReferencePromises[hex];\r\n if(deferred.isFulfilled || deferred.isRejected) {\r\n delete this.refreshReferencePromises[hex];\r\n }\r\n }\r\n }, 1800e3);\r\n }\r\n\r\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\r\n if(this.downloadPulls[dcId] === undefined) {\r\n this.downloadPulls[dcId] = [];\r\n this.downloadActives[dcId] = 0;\r\n }\r\n\r\n const downloadPull = this.downloadPulls[dcId];\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\r\n });\r\n\r\n setTimeout(() => {\r\n this.downloadCheck(dcId);\r\n }, 0);\r\n\r\n return promise;\r\n }\r\n\r\n private downloadCheck(dcId: string | number) {\r\n const downloadPull = this.downloadPulls[dcId];\r\n const downloadLimit = dcId === 'upload' ? 24 : 36;\r\n //const downloadLimit = Infinity;\r\n\r\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull || !downloadPull.length) {\r\n return false;\r\n }\r\n\r\n //const data = downloadPull.shift();\r\n const data = downloadPull.findAndSplice(d => d.queueId === 0) || downloadPull.findAndSplice(d => d.queueId === this.queueId) || downloadPull.shift();\r\n const activeDelta = data.activeDelta || 1;\r\n\r\n this.downloadActives[dcId] += activeDelta;\r\n \r\n data.cb()\r\n .then((result) => {\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n data.deferred.resolve(result);\r\n }, (error: Error) => {\r\n // @ts-ignore\r\n if(!error || !error.type || (error.type !== 'DOWNLOAD_CANCELED' && error.type !== 'UPLOAD_CANCELED')) {\r\n this.log.error('downloadCheck error:', error);\r\n }\r\n\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n data.deferred.reject(error);\r\n });\r\n }\r\n\r\n public setQueueId(queueId: number) {\r\n //this.log.error('setQueueId', queueId);\r\n this.queueId = queueId;\r\n }\r\n\r\n private getFileStorage() {\r\n return this.cacheStorage;\r\n }\r\n\r\n public cancelDownload(fileName: string) {\r\n const promises = (this.cachedDownloadPromises[fileName] ? [this.cachedDownloadPromises[fileName]] : undefined) || \r\n (this.uploadPromises[fileName] ? Array.from(this.uploadPromises[fileName]) : []);\r\n let canceled = false;\r\n for(let i = 0, length = promises.length; i < length; ++i) {\r\n const promise = promises[i];\r\n if(promise && !promise.isRejected && !promise.isFulfilled) {\r\n promise.cancel();\r\n canceled = true;\r\n }\r\n }\r\n\r\n return canceled;\r\n }\r\n\r\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n return apiManager.invokeApi('upload.getWebFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n });\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n public requestFilePart(dcId: DcId, location: InputFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n const invoke = async(): Promise => {\r\n checkCancel && checkCancel(); // do not remove async, because checkCancel will throw an error\r\n\r\n const promise = apiManager.invokeApi('upload.getFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n }) as Promise;\r\n\r\n return promise.catch((err) => {\r\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n\r\n throw err;\r\n });\r\n };\r\n\r\n assumeType(location);\r\n const reference = location.file_reference;\r\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\r\n location.checkedReference = true;\r\n const hex = bytesToHex(reference);\r\n if(this.refreshReferencePromises[hex]) {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n }\r\n\r\n return invoke();\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n /* private convertBlobToBytes(blob: Blob) {\r\n return blob.arrayBuffer().then(buffer => new Uint8Array(buffer));\r\n } */\r\n\r\n private getDelta(bytes: number) {\r\n return bytes / 1024 / 128;\r\n }\r\n\r\n private getLimitPart(size: number): number {\r\n let bytes: number;\r\n\r\n bytes = 512;\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 * 1024;\r\n }\r\n\r\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\r\n //this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n return cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, true) as Promise;\r\n };\r\n\r\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\r\n const convertPromise = deferredPromise();\r\n\r\n const task = {type: 'convertWebp', payload: {fileName, bytes}};\r\n notifySomeone(task);\r\n return this.webpConvertPromises[fileName] = convertPromise;\r\n };\r\n\r\n private refreshReference(inputFileLocation: InputFileLocation) {\r\n const reference = (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference;\r\n const hex = bytesToHex(reference);\r\n\r\n let r = this.refreshReferencePromises[hex];\r\n if(!r) {\r\n const deferred = deferredPromise();\r\n\r\n r = this.refreshReferencePromises[hex] = {\r\n deferred,\r\n timeout: ctx.setTimeout(() => {\r\n this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\r\n deferred.reject('REFERENCE_IS_NOT_REFRESHED');\r\n }, 60000)\r\n };\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearTimeout(r.timeout);\r\n });\r\n\r\n const task = {type: 'refreshReference', payload: reference};\r\n notifySomeone(task);\r\n }\r\n\r\n // have to replace file_reference in any way, because location can be different everytime if it's stream\r\n return r.deferred.then(reference => {\r\n if(hex === bytesToHex(reference)) {\r\n throw 'REFERENCE_IS_NOT_REFRESHED';\r\n }\r\n\r\n (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference = reference;\r\n });\r\n }\r\n\r\n public downloadFile(options: DownloadOptions): CancellablePromise {\r\n if(!FileManager.isAvailable()) {\r\n return Promise.reject({type: 'BROWSER_BLOB_NOT_SUPPORTED'});\r\n }\r\n\r\n const size = options.size ?? 0;\r\n const {dcId, location} = options;\r\n\r\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\r\n\r\n if(options.mimeType === 'image/webp' && !isWebpSupported()) {\r\n process = this.convertWebp;\r\n options.mimeType = 'image/png';\r\n } else if(options.mimeType === 'application/x-tgsticker') {\r\n process = this.uncompressTGS;\r\n options.mimeType = 'application/json';\r\n }\r\n\r\n const fileName = getFileNameByLocation(location, {fileName: options.fileName});\r\n const cachedPromise = this.cachedDownloadPromises[fileName];\r\n const fileStorage = this.getFileStorage();\r\n\r\n this.debug && this.log('downloadFile', fileName, size, location, options.mimeType);\r\n\r\n /* if(options.queueId) {\r\n this.log.error('downloadFile queueId:', fileName, options.queueId);\r\n } */\r\n\r\n if(cachedPromise) {\r\n //this.log('downloadFile cachedPromise');\r\n\r\n if(size) {\r\n return cachedPromise.then((blob: Blob) => {\r\n if(blob.size < size) {\r\n this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\r\n\r\n return this.deleteFile(fileName).then(() => {\r\n return this.downloadFile(options);\r\n }).catch(() => {\r\n return this.downloadFile(options);\r\n });\r\n } else {\r\n return blob;\r\n }\r\n });\r\n } else {\r\n return cachedPromise;\r\n }\r\n }\r\n\r\n const deferred = deferredPromise();\r\n const mimeType = options.mimeType || 'image/jpeg';\r\n\r\n let error: Error;\r\n let resolved = false;\r\n let cacheFileWriter: ReturnType;\r\n let errorHandler = (_error: Error) => {\r\n error = _error;\r\n delete this.cachedDownloadPromises[fileName];\r\n deferred.reject(error);\r\n errorHandler = () => {};\r\n\r\n if(cacheFileWriter && (!error || error.type !== 'DOWNLOAD_CANCELED')) {\r\n cacheFileWriter.truncate();\r\n }\r\n };\r\n\r\n const id = this.tempId++;\r\n\r\n fileStorage.getFile(fileName).then(async(blob: Blob) => {\r\n //this.log('maybe cached', fileName);\r\n //throw '';\r\n\r\n if(blob.size < size) {\r\n //this.log('downloadFile need to deleteFile 2, wrong size:', blob.size, size);\r\n await this.deleteFile(fileName);\r\n throw false;\r\n }\r\n\r\n deferred.resolve(blob);\r\n }).catch(() => {\r\n //this.log('not cached', fileName);\r\n const fileWriterPromise = fileStorage.getFileWriter(fileName, mimeType);\r\n\r\n fileWriterPromise.then((fileWriter) => {\r\n cacheFileWriter = fileWriter;\r\n const limit = options.limitPart || this.getLimitPart(size);\r\n let offset: number;\r\n let startOffset = 0;\r\n let writeFilePromise: CancellablePromise = Promise.resolve(),\r\n writeFileDeferred: CancellablePromise;\r\n //const maxRequests = 13107200 / limit; // * 100 Mb speed\r\n const maxRequests = Infinity;\r\n\r\n //console.error('maxRequests', maxRequests);\r\n\r\n const processDownloaded = async(bytes: Uint8Array, offset: number) => {\r\n if(process) {\r\n //const perf = performance.now();\r\n const processed = await process(bytes, fileName);\r\n //this.log('downloadFile process downloaded time', performance.now() - perf, mimeType, process);\r\n return processed;\r\n }\r\n \r\n return bytes;\r\n };\r\n\r\n const r = location._ === 'inputWebFileLocation' ? this.requestWebFilePart.bind(this) : this.requestFilePart.bind(this);\r\n\r\n const delayed: Delayed[] = [];\r\n offset = startOffset;\r\n do {\r\n ////this.log('offset:', startOffset);\r\n writeFileDeferred = deferredPromise();\r\n delayed.push({offset, writeFilePromise, writeFileDeferred});\r\n writeFilePromise = writeFileDeferred;\r\n offset += limit;\r\n } while(offset < size);\r\n\r\n let done = 0;\r\n const superpuper = async() => {\r\n //if(!delayed.length) return;\r\n\r\n const {offset, writeFilePromise, writeFileDeferred} = delayed.shift();\r\n try {\r\n checkCancel();\r\n\r\n // @ts-ignore\r\n const result = await r(dcId, location as any, offset, limit, id, options.queueId, checkCancel);\r\n\r\n const bytes = result.bytes;\r\n\r\n if(delayed.length) {\r\n superpuper();\r\n }\r\n\r\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\r\n const isFinal = offset + limit >= size || !bytes.byteLength;\r\n if(bytes.byteLength) {\r\n //done += limit;\r\n done += bytes.byteLength;\r\n\r\n //if(!isFinal) {\r\n ////this.log('deferred notify 2:', {done: offset + limit, total: size}, deferred);\r\n deferred.notify({done, offset, total: size});\r\n //}\r\n\r\n const processedResult = await processDownloaded(bytes, offset);\r\n checkCancel();\r\n\r\n await writeFilePromise;\r\n checkCancel();\r\n\r\n await FileManager.write(fileWriter, processedResult);\r\n }\r\n\r\n writeFileDeferred.resolve();\r\n\r\n if(isFinal) {\r\n resolved = true;\r\n\r\n deferred.resolve(fileWriter.finalize(size < MAX_FILE_SAVE_SIZE));\r\n }\r\n } catch(err) {\r\n errorHandler(err as Error);\r\n }\r\n };\r\n\r\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\r\n superpuper();\r\n }\r\n }).catch((err) => {\r\n if(!['STORAGE_OFFLINE'].includes(err)) {\r\n this.log.error('saveFile error:', err);\r\n }\r\n });\r\n });\r\n\r\n const checkCancel = () => {\r\n if(error) {\r\n throw error;\r\n }\r\n };\r\n\r\n deferred.cancel = () => {\r\n if(!error && !resolved) {\r\n const error = new Error('Canceled');\r\n error.type = 'DOWNLOAD_CANCELED';\r\n errorHandler(error);\r\n }\r\n };\r\n\r\n deferred.notify = (progress: {done: number, total: number, offset: number}) => {\r\n notifyAll({progress: {fileName, ...progress}});\r\n };\r\n\r\n this.cachedDownloadPromises[fileName] = deferred;\r\n\r\n deferred.safeFinally(() => {\r\n delete this.cachedDownloadPromises[fileName];\r\n });\r\n\r\n return deferred;\r\n }\r\n\r\n private deleteFile(fileName: string) {\r\n //this.log('will delete file:', fileName);\r\n delete this.cachedDownloadPromises[fileName];\r\n return this.getFileStorage().delete(fileName);\r\n }\r\n\r\n public uploadFile({file, fileName}: {file: Blob | File, fileName: string}) {\r\n const fileSize = file.size, \r\n isBigFile = fileSize >= 10485760;\r\n\r\n let canceled = false,\r\n resolved = false,\r\n doneParts = 0,\r\n partSize = 262144; // 256 Kb\r\n\r\n /* if(fileSize > (524288 * 3000)) {\r\n partSize = 1024 * 1024;\r\n activeDelta = 8;\r\n } else */if(fileSize > 67108864) {\r\n partSize = 524288;\r\n } else if(fileSize < 102400) {\r\n partSize = 32768;\r\n }\r\n\r\n const activeDelta = this.getDelta(partSize);\r\n\r\n const totalParts = Math.ceil(fileSize / partSize);\r\n const fileId = randomLong();\r\n\r\n let _part = 0;\r\n\r\n const resultInputFile: InputFile = {\r\n _: isBigFile ? 'inputFileBig' : 'inputFile',\r\n id: fileId as any,\r\n parts: totalParts,\r\n name: fileName,\r\n md5_checksum: ''\r\n };\r\n\r\n const deferredHelper: {\r\n resolve?: (input: typeof resultInputFile) => void,\r\n reject?: (error: any) => void,\r\n notify?: (details: {done: number, total: number}) => void\r\n } = {\r\n notify: (details: {done: number, total: number}) => {}\r\n };\r\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n if(totalParts > 4000) {\r\n return reject({type: 'FILE_TOO_BIG'});\r\n }\r\n\r\n deferredHelper.resolve = resolve;\r\n deferredHelper.reject = reject;\r\n });\r\n Object.assign(deferred, deferredHelper);\r\n\r\n if(totalParts > 4000) {\r\n return deferred;\r\n }\r\n \r\n let errorHandler = (error: any) => {\r\n if(error?.type !== 'UPLOAD_CANCELED') {\r\n this.log.error('Up Error', error);\r\n }\r\n\r\n deferred.reject(error);\r\n canceled = true;\r\n errorHandler = () => {};\r\n };\r\n\r\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\r\n\r\n const id = this.tempId++;\r\n\r\n /* setInterval(() => {\r\n console.log(file);\r\n }, 1e3); */\r\n\r\n const self = this;\r\n function* generator() {\r\n for(let offset = 0; offset < fileSize; offset += partSize) {\r\n const part = _part++; // 0, 1\r\n yield self.downloadRequest('upload', id, () => {\r\n const blob = file.slice(offset, offset + partSize);\r\n\r\n return readBlobAsArrayBuffer(blob).then(buffer => {\r\n if(canceled) {\r\n throw {type: 'UPLOAD_CANCELED'};\r\n }\r\n\r\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\r\n\r\n /* const u = new Uint8Array(buffer.byteLength);\r\n for(let i = 0; i < u.length; ++i) {\r\n //u[i] = Math.random() * 255 | 0;\r\n u[i] = 0;\r\n }\r\n buffer = u.buffer; */\r\n \r\n /* setTimeout(() => {\r\n doneParts++;\r\n uploadResolve();\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n\r\n self.log('done part', part, doneParts);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, 1250);\r\n return; */\r\n\r\n return apiManager.invokeApi(method, {\r\n file_id: fileId,\r\n file_part: part,\r\n file_total_parts: totalParts,\r\n bytes: buffer/* new Uint8Array(buffer) */\r\n } as any, {\r\n //startMaxLength: partSize + 256,\r\n fileUpload: true\r\n }).then((result) => {\r\n doneParts++;\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, errorHandler);\r\n });\r\n }, activeDelta).catch(errorHandler);\r\n }\r\n }\r\n\r\n const it = generator();\r\n const process = () => {\r\n if(canceled) return;\r\n const r = it.next();\r\n if(r.done || canceled) return;\r\n (r.value as Promise).then(process);\r\n };\r\n\r\n const maxRequests = Infinity;\r\n //const maxRequests = 10;\r\n /* for(let i = 0; i < 10; ++i) {\r\n process();\r\n } */\r\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\r\n process();\r\n }\r\n\r\n deferred.cancel = () => {\r\n //this.log('cancel upload', canceled, resolved);\r\n if(!canceled && !resolved) {\r\n canceled = true;\r\n errorHandler({type: 'UPLOAD_CANCELED'});\r\n }\r\n };\r\n\r\n deferred.notify = (progress: {done: number, total: number}) => {\r\n notifyAll({progress: {fileName, ...progress}});\r\n };\r\n\r\n deferred.finally(() => {\r\n set.delete(deferred);\r\n if(!set.size) {\r\n delete this.uploadPromises[fileName];\r\n }\r\n });\r\n\r\n const set = this.uploadPromises[fileName] ?? (this.uploadPromises[fileName] = new Set());\r\n set.add(deferred);\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiFileManager = new ApiFileManager();\r\nMOUNT_CLASS_TO.apiFileManager = apiFileManager;\r\nexport default apiFileManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// just to include\nimport '../polyfill';\n\nimport type { LocalStorageProxyTask } from '../localStorage';\nimport type { WebpConvertTask } from '../webp/webpWorkerController';\nimport type { ToggleStorageTask } from './mtprotoworker';\nimport type { RefreshReferenceTaskResponse } from './apiFileManager';\nimport apiManager from \"./apiManager\";\nimport cryptoWorker from \"../crypto/cryptoworker\";\nimport networkerFactory from \"./networkerFactory\";\nimport apiFileManager from './apiFileManager';\nimport { notifyAll } from '../../helpers/context';\nimport CacheStorageController from '../cacheStorage';\nimport sessionStorage from '../sessionStorage';\nimport { socketsProxied } from './transports/socketProxied';\nimport { bytesToHex } from '../../helpers/bytes';\nimport ctx from '../../environment/ctx';\n\nlet webpSupported = false;\nexport const isWebpSupported = () => {\n return webpSupported;\n};\n\nnetworkerFactory.setUpdatesProcessor((obj) => {\n notifyAll({update: obj});\n});\n\nnetworkerFactory.onConnectionStatusChange = (status) => {\n notifyAll({type: 'connectionStatusChange', payload: status});\n};\n\nconst taskListeners = {\n convertWebp: (task: WebpConvertTask) => {\n const {fileName, bytes} = task.payload;\n const deferred = apiFileManager.webpConvertPromises[fileName];\n if(deferred) {\n deferred.resolve(bytes);\n delete apiFileManager.webpConvertPromises[fileName];\n }\n },\n\n webpSupport: (task: any) => {\n webpSupported = task.payload;\n },\n\n socketProxy: (task: any) => {\n const socketTask = task.payload;\n const id = socketTask.id;\n \n const socketProxied = socketsProxied.get(id);\n if(socketTask.type === 'message') {\n socketProxied.dispatchEvent('message', socketTask.payload);\n } else if(socketTask.type === 'open') {\n socketProxied.dispatchEvent('open');\n } else if(socketTask.type === 'close') {\n socketProxied.dispatchEvent('close');\n socketsProxied.delete(id);\n }\n },\n\n localStorageProxy: (task: LocalStorageProxyTask) => {\n sessionStorage.finishTask(task.id, task.payload);\n },\n\n userAgent: (task: any) => {\n networkerFactory.userAgent = task.payload;\n },\n\n online: () => {\n networkerFactory.forceReconnectTimeout();\n },\n\n forceReconnect: () => {\n networkerFactory.forceReconnect();\n },\n\n toggleStorage: (task: ToggleStorageTask) => {\n const enabled = task.payload;\n // AppStorage.toggleStorage(enabled);\n CacheStorageController.toggleStorage(enabled);\n },\n\n refreshReference: (task: RefreshReferenceTaskResponse) => {\n const hex = bytesToHex(task.originalPayload);\n const r = apiFileManager.refreshReferencePromises[hex];\n const deferred = r?.deferred;\n if(deferred) {\n if(task.error) {\n deferred.reject(task.error);\n } else {\n deferred.resolve(task.payload);\n }\n }\n }\n};\n\nconst onMessage = async(e: any) => {\n try {\n const task: {\n task: string,\n taskId: number,\n args: any[],\n type?: string\n } = e.data;\n const taskId = task.taskId;\n\n // @ts-ignore\n const f = taskListeners[task.type];\n if(f) {\n f(task);\n return;\n }\n\n if(!task.task) {\n return;\n }\n \n switch(task.task) {\n case 'computeSRP':\n case 'gzipUncompress':\n return cryptoWorker.invokeCrypto(task.task, ...task.args as any).then(result => {\n notifyAll({taskId, result});\n });\n \n case 'requestFilePart':\n case 'setQueueId':\n case 'cancelDownload':\n case 'uploadFile':\n case 'downloadFile': {\n try {\n // @ts-ignore\n let result: any = apiFileManager[task.task].apply(apiFileManager, task.args);\n \n if(result instanceof Promise) {\n /* (result as ReturnType).notify = (progress: {done: number, total: number, offset: number}) => {\n notify({progress: {fileName, ...progress}});\n }; */\n result = await result;\n }\n \n notifyAll({taskId, result});\n } catch(error) {\n notifyAll({taskId, error});\n }\n\n break;\n }\n\n case 'getNetworker': {\n // @ts-ignore\n apiManager[task.task].apply(apiManager, task.args).finally(() => {\n notifyAll({taskId, result: null});\n });\n \n break;\n }\n\n case 'setLanguage':\n case 'startAll':\n case 'stopAll': {\n // @ts-ignore\n networkerFactory[task.task].apply(networkerFactory, task.args);\n break;\n }\n \n default: {\n try {\n // @ts-ignore\n let result = apiManager[task.task].apply(apiManager, task.args);\n \n if(result instanceof Promise) {\n result = await result;\n }\n\n //console.log(notifyAll);\n \n notifyAll({taskId, result});\n } catch(error) {\n notifyAll({taskId, error});\n }\n \n //throw new Error('Unknown task: ' + task.task);\n break;\n }\n }\n } catch(err) {\n console.error('worker task error:', err);\n }\n};\n\n//console.log('[WORKER] Will send ready', Date.now() / 1000);\nctx.addEventListener('message', onMessage);\nnotifyAll('ready');\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.fd3e71e917088f6f049f.bundle.worker.js b/public/mtproto.worker.fd3e71e917088f6f049f.bundle.worker.js new file mode 100644 index 000000000..937007361 --- /dev/null +++ b/public/mtproto.worker.fd3e71e917088f6f049f.bundle.worker.js @@ -0,0 +1,4 @@ +!function(e){var t={};function a(n){if(t[n])return t[n].exports;var s=t[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,a),s.l=!0,s.exports}a.m=e,a.c=t,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)a.d(n,s,function(t){return e[t]}.bind(null,s));return n},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="",a(a.s=1)}([function(e,t,a){ +/*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */ +!function(e){"use strict";var t=(e,t,a,n)=>{let s=65535&e|0,i=e>>>16&65535|0,r=0;for(;0!==a;){r=a>2e3?2e3:a,a-=r;do{s=s+t[n++]|0,i=i+s|0}while(--r);s%=65521,i%=65521}return s|i<<16|0};const a=new Uint32Array((()=>{let e,t=[];for(var a=0;a<256;a++){e=a;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[a]=e}return t})());var n=(e,t,n,s)=>{const i=a,r=s+n;e^=-1;for(let a=s;a>>8^i[255&(e^t[a])];return-1^e},s=function(e,t){let a,n,s,i,r,p,o,m,d,y,c,l,g,h,u,f,_,v,b,P,w,S,I,k;const C=e.state;a=e.next_in,I=e.input,n=a+(e.avail_in-5),s=e.next_out,k=e.output,i=s-(t-e.avail_out),r=s+(e.avail_out-257),p=C.dmax,o=C.wsize,m=C.whave,d=C.wnext,y=C.window,c=C.hold,l=C.bits,g=C.lencode,h=C.distcode,u=(1<>>24,c>>>=v,l-=v,v=_>>>16&255,0===v)k[s++]=65535&_;else{if(!(16&v)){if(0==(64&v)){_=g[(65535&_)+(c&(1<>>=v,l-=v),l<15&&(c+=I[a++]<>>24,c>>>=v,l-=v,v=_>>>16&255,!(16&v)){if(0==(64&v)){_=h[(65535&_)+(c&(1<p){e.msg="invalid distance too far back",C.mode=30;break e}if(c>>>=v,l-=v,v=s-i,P>v){if(v=P-v,v>m&&C.sane){e.msg="invalid distance too far back",C.mode=30;break e}if(w=0,S=y,0===d){if(w+=o-v,v2;)k[s++]=S[w++],k[s++]=S[w++],k[s++]=S[w++],b-=3;b&&(k[s++]=S[w++],b>1&&(k[s++]=S[w++]))}else{w=s-P;do{k[s++]=k[w++],k[s++]=k[w++],k[s++]=k[w++],b-=3}while(b>2);b&&(k[s++]=k[w++],b>1&&(k[s++]=k[w++]))}break}}break}}while(a>3,a-=b,l-=b<<3,c&=(1<{const c=y.bits;let l,g,h,u,f,_,v=0,b=0,P=0,w=0,S=0,I=0,k=0,C=0,A=0,M=0,E=null,R=0;const V=new Uint16Array(16),D=new Uint16Array(16);let U,T,B,x=null,F=0;for(v=0;v<=15;v++)V[v]=0;for(b=0;b=1&&0===V[w];w--);if(S>w&&(S=w),0===w)return s[m++]=20971520,s[m++]=20971520,y.bits=1,0;for(P=1;P0&&(0===e||1!==w))return-1;for(D[1]=0,v=1;v<15;v++)D[v+1]=D[v]+V[v];for(b=0;b852||2===e&&A>592)return 1;for(;;){U=v-k,d[b]<_?(T=0,B=d[b]):d[b]>_?(T=x[F+d[b]],B=E[R+d[b]]):(T=96,B=0),l=1<>k)+g]=U<<24|T<<16|B|0}while(0!==g);for(l=1<>=1;if(0!==l?(M&=l-1,M+=l):M=0,b++,0==--V[v]){if(v===w)break;v=t[a+d[b]]}if(v>S&&(M&u)!==h){for(0===k&&(k=S),f+=P,I=v-k,C=1<852||2===e&&A>592)return 1;h=M&u,s[h]=S<<24|I<<16|f-m|0}}return 0!==M&&(s[f+M]=v-k<<24|64<<16|0),y.bits=S,0},d={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:y,Z_BLOCK:c,Z_TREES:l,Z_OK:g,Z_STREAM_END:h,Z_NEED_DICT:u,Z_STREAM_ERROR:f,Z_DATA_ERROR:_,Z_MEM_ERROR:v,Z_BUF_ERROR:b,Z_DEFLATED:P}=d,w=12,S=30,I=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function k(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const C=e=>{if(!e||!e.state)return f;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,g},A=e=>{if(!e||!e.state)return f;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,C(e)},M=(e,t)=>{let a;if(!e||!e.state)return f;const n=e.state;return t<0?(a=0,t=-t):(a=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?f:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=a,n.wbits=t,A(e))},E=(e,t)=>{if(!e)return f;const a=new k;e.state=a,a.window=null;const n=M(e,t);return n!==g&&(e.state=null),n};let R,V,D=!0;const U=e=>{if(D){R=new Int32Array(512),V=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(m(1,e.lens,0,288,R,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;m(2,e.lens,0,32,V,0,e.work,{bits:5}),D=!1}e.lencode=R,e.lenbits=9,e.distcode=V,e.distbits=5},T=(e,t,a,n)=>{let s;const i=e.state;return null===i.window&&(i.wsize=1<=i.wsize?(i.window.set(t.subarray(a-i.wsize,a),0),i.wnext=0,i.whave=i.wsize):(s=i.wsize-i.wnext,s>n&&(s=n),i.window.set(t.subarray(a-n,a-n+s),i.wnext),(n-=s)?(i.window.set(t.subarray(a-n,a),0),i.wnext=n,i.whave=i.wsize):(i.wnext+=s,i.wnext===i.wsize&&(i.wnext=0),i.whave{let i,r,p,o,d,k,C,A,M,E,R,V,D,B,x,F,L,N,O,q,G,K,z=0;const H=new Uint8Array(4);let j,W;const J=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return f;i=e.state,i.mode===w&&(i.mode=13),d=e.next_out,p=e.output,C=e.avail_out,o=e.next_in,r=e.input,k=e.avail_in,A=i.hold,M=i.bits,E=k,R=C,K=g;e:for(;;)switch(i.mode){case 1:if(0===i.wrap){i.mode=13;break}for(;M<16;){if(0===k)break e;k--,A+=r[o++]<>>8&255,i.check=n(i.check,H,2,0),A=0,M=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&A)<<8)+(A>>8))%31){e.msg="incorrect header check",i.mode=S;break}if((15&A)!==P){e.msg="unknown compression method",i.mode=S;break}if(A>>>=4,M-=4,G=8+(15&A),0===i.wbits)i.wbits=G;else if(G>i.wbits){e.msg="invalid window size",i.mode=S;break}i.dmax=1<>8&1),512&i.flags&&(H[0]=255&A,H[1]=A>>>8&255,i.check=n(i.check,H,2,0)),A=0,M=0,i.mode=3;case 3:for(;M<32;){if(0===k)break e;k--,A+=r[o++]<>>8&255,H[2]=A>>>16&255,H[3]=A>>>24&255,i.check=n(i.check,H,4,0)),A=0,M=0,i.mode=4;case 4:for(;M<16;){if(0===k)break e;k--,A+=r[o++]<>8),512&i.flags&&(H[0]=255&A,H[1]=A>>>8&255,i.check=n(i.check,H,2,0)),A=0,M=0,i.mode=5;case 5:if(1024&i.flags){for(;M<16;){if(0===k)break e;k--,A+=r[o++]<>>8&255,i.check=n(i.check,H,2,0)),A=0,M=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(V=i.length,V>k&&(V=k),V&&(i.head&&(G=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Uint8Array(i.head.extra_len)),i.head.extra.set(r.subarray(o,o+V),G)),512&i.flags&&(i.check=n(i.check,r,V,o)),k-=V,o+=V,i.length-=V),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===k)break e;V=0;do{G=r[o+V++],i.head&&G&&i.length<65536&&(i.head.name+=String.fromCharCode(G))}while(G&&V>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=w;break;case 10:for(;M<32;){if(0===k)break e;k--,A+=r[o++]<>>=7&M,M-=7&M,i.mode=27;break}for(;M<3;){if(0===k)break e;k--,A+=r[o++]<>>=1,M-=1,3&A){case 0:i.mode=14;break;case 1:if(U(i),i.mode=20,a===l){A>>>=2,M-=2;break e}break;case 2:i.mode=17;break;case 3:e.msg="invalid block type",i.mode=S}A>>>=2,M-=2;break;case 14:for(A>>>=7&M,M-=7&M;M<32;){if(0===k)break e;k--,A+=r[o++]<>>16^65535)){e.msg="invalid stored block lengths",i.mode=S;break}if(i.length=65535&A,A=0,M=0,i.mode=15,a===l)break e;case 15:i.mode=16;case 16:if(V=i.length,V){if(V>k&&(V=k),V>C&&(V=C),0===V)break e;p.set(r.subarray(o,o+V),d),k-=V,o+=V,C-=V,d+=V,i.length-=V;break}i.mode=w;break;case 17:for(;M<14;){if(0===k)break e;k--,A+=r[o++]<>>=5,M-=5,i.ndist=1+(31&A),A>>>=5,M-=5,i.ncode=4+(15&A),A>>>=4,M-=4,i.nlen>286||i.ndist>30){e.msg="too many length or distance symbols",i.mode=S;break}i.have=0,i.mode=18;case 18:for(;i.have>>=3,M-=3}for(;i.have<19;)i.lens[J[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,j={bits:i.lenbits},K=m(0,i.lens,0,19,i.lencode,0,i.work,j),i.lenbits=j.bits,K){e.msg="invalid code lengths set",i.mode=S;break}i.have=0,i.mode=19;case 19:for(;i.have>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===k)break e;k--,A+=r[o++]<>>=x,M-=x,i.lens[i.have++]=L;else{if(16===L){for(W=x+2;M>>=x,M-=x,0===i.have){e.msg="invalid bit length repeat",i.mode=S;break}G=i.lens[i.have-1],V=3+(3&A),A>>>=2,M-=2}else if(17===L){for(W=x+3;M>>=x,M-=x,G=0,V=3+(7&A),A>>>=3,M-=3}else{for(W=x+7;M>>=x,M-=x,G=0,V=11+(127&A),A>>>=7,M-=7}if(i.have+V>i.nlen+i.ndist){e.msg="invalid bit length repeat",i.mode=S;break}for(;V--;)i.lens[i.have++]=G}}if(i.mode===S)break;if(0===i.lens[256]){e.msg="invalid code -- missing end-of-block",i.mode=S;break}if(i.lenbits=9,j={bits:i.lenbits},K=m(1,i.lens,0,i.nlen,i.lencode,0,i.work,j),i.lenbits=j.bits,K){e.msg="invalid literal/lengths set",i.mode=S;break}if(i.distbits=6,i.distcode=i.distdyn,j={bits:i.distbits},K=m(2,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,j),i.distbits=j.bits,K){e.msg="invalid distances set",i.mode=S;break}if(i.mode=20,a===l)break e;case 20:i.mode=21;case 21:if(k>=6&&C>=258){e.next_out=d,e.avail_out=C,e.next_in=o,e.avail_in=k,i.hold=A,i.bits=M,s(e,R),d=e.next_out,p=e.output,C=e.avail_out,o=e.next_in,r=e.input,k=e.avail_in,A=i.hold,M=i.bits,i.mode===w&&(i.back=-1);break}for(i.back=0;z=i.lencode[A&(1<>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===k)break e;k--,A+=r[o++]<>N)],x=z>>>24,F=z>>>16&255,L=65535&z,!(N+x<=M);){if(0===k)break e;k--,A+=r[o++]<>>=N,M-=N,i.back+=N}if(A>>>=x,M-=x,i.back+=x,i.length=L,0===F){i.mode=26;break}if(32&F){i.back=-1,i.mode=w;break}if(64&F){e.msg="invalid literal/length code",i.mode=S;break}i.extra=15&F,i.mode=22;case 22:if(i.extra){for(W=i.extra;M>>=i.extra,M-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;z=i.distcode[A&(1<>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===k)break e;k--,A+=r[o++]<>N)],x=z>>>24,F=z>>>16&255,L=65535&z,!(N+x<=M);){if(0===k)break e;k--,A+=r[o++]<>>=N,M-=N,i.back+=N}if(A>>>=x,M-=x,i.back+=x,64&F){e.msg="invalid distance code",i.mode=S;break}i.offset=L,i.extra=15&F,i.mode=24;case 24:if(i.extra){for(W=i.extra;M>>=i.extra,M-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg="invalid distance too far back",i.mode=S;break}i.mode=25;case 25:if(0===C)break e;if(V=R-C,i.offset>V){if(V=i.offset-V,V>i.whave&&i.sane){e.msg="invalid distance too far back",i.mode=S;break}V>i.wnext?(V-=i.wnext,D=i.wsize-V):D=i.wnext-V,V>i.length&&(V=i.length),B=i.window}else B=p,D=d-i.offset,V=i.length;V>C&&(V=C),C-=V,i.length-=V;do{p[d++]=B[D++]}while(--V);0===i.length&&(i.mode=21);break;case 26:if(0===C)break e;p[d++]=i.length,C--,i.mode=21;break;case 27:if(i.wrap){for(;M<32;){if(0===k)break e;k--,A|=r[o++]<{if(!e||!e.state)return f;let t=e.state;return t.window&&(t.window=null),e.state=null,g},N=(e,t)=>{if(!e||!e.state)return f;const a=e.state;return 0==(2&a.wrap)?f:(a.head=t,t.done=!1,g)},O=(e,a)=>{const n=a.length;let s,i,r;return e&&e.state?(s=e.state,0!==s.wrap&&11!==s.mode?f:11===s.mode&&(i=1,i=t(i,a,n,0),i!==s.check)?_:(r=T(e,a,n,n),r?(s.mode=31,v):(s.havedict=1,g))):f};const q=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);let G=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){G=!1}const K=new Uint8Array(256);for(let e=0;e<256;e++)K[e]=e>=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;K[254]=K[254]=1;var z=(e,t)=>{let a,n;const s=t||e.length,i=new Array(2*s);for(n=0,a=0;a4)i[n++]=65533,a+=r-1;else{for(t&=2===r?31:3===r?15:7;r>1&&a1?i[n++]=65533:t<65536?i[n++]=t:(t-=65536,i[n++]=55296|t>>10&1023,i[n++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&G)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let a="";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let a=t-1;for(;a>=0&&128==(192&e[a]);)a--;return a<0||0===a?t:a+K[e[a]]>t?a:t},j={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},W=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},J=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Z=Object.prototype.toString,{Z_NO_FLUSH:Q,Z_FINISH:X,Z_OK:$,Z_STREAM_END:Y,Z_NEED_DICT:ee,Z_STREAM_ERROR:te,Z_DATA_ERROR:ae,Z_MEM_ERROR:ne}=d;function se(e){this.options=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const a=t.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const t in a)q(a,t)&&(e[t]=a[t])}}return e}({chunkSize:65536,windowBits:15,to:""},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new W,this.strm.avail_out=0;let a=x(this.strm,t.windowBits);if(a!==$)throw new Error(j[a]);if(this.header=new J,N(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=(e=>{let t,a,n,s,i,r=e.length,p=0;for(s=0;s>>6,t[i++]=128|63&a):a<65536?(t[i++]=224|a>>>12,t[i++]=128|a>>>6&63,t[i++]=128|63&a):(t[i++]=240|a>>>18,t[i++]=128|a>>>12&63,t[i++]=128|a>>>6&63,t[i++]=128|63&a);return t})(t.dictionary):"[object ArrayBuffer]"===Z.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(a=O(this.strm,t.dictionary),a!==$)))throw new Error(j[a])}function ie(e,t){const a=new se(t);if(a.push(e),a.err)throw a.msg||j[a.err];return a.result}se.prototype.push=function(e,t){const a=this.strm,n=this.options.chunkSize,s=this.options.dictionary;let i,r,p;if(this.ended)return!1;for(r=t===~~t?t:!0===t?X:Q,"[object ArrayBuffer]"===Z.call(e)?a.input=new Uint8Array(e):a.input=e,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),i=F(a,r),i===ee&&s&&(i=O(a,s),i===$?i=F(a,r):i===ae&&(i=ee));a.avail_in>0&&i===Y&&a.state.wrap>0&&0!==e[a.next_in];)B(a),i=F(a,r);switch(i){case te:case ae:case ee:case ne:return this.onEnd(i),this.ended=!0,!1}if(p=a.avail_out,a.next_out&&(0===a.avail_out||i===Y))if("string"===this.options.to){let e=H(a.output,a.next_out),t=a.next_out-e,s=z(a.output,e);a.next_out=t,a.avail_out=n-t,t&&a.output.set(a.output.subarray(e,e+t),0),this.onData(s)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(i!==$||0!==p){if(i===Y)return i=L(this.strm),this.onEnd(i),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},se.prototype.onData=function(e){this.chunks.push(e)},se.prototype.onEnd=function(e){e===$&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=(e=>{let t=0;for(let a=0,n=e.length;ae+(t.byteLength||t.length),0),a=new Uint8Array(t);let n=0;return e.forEach(e=>{a.set(e instanceof ArrayBuffer?new Uint8Array(e):e,n),n+=e.byteLength||e.length}),a}function m(e){const t=new Uint8Array(e.byteLength);for(let a=0,n=4*e.length;a>>2]>>>24-a%4*8&255;return t}function d(e){const t=p(e),a=[];for(let e=0,n=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(a)}a.r(t),a.d(t,"isWebpSupported",(function(){return Da})),Object.defineProperty(Uint8Array.prototype,"hex",{get:function(){return n(this)},set:function(e){this.set(s(e))},enumerable:!0,configurable:!0}),Uint8Array.prototype.randomize=function(){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(this),this},Uint8Array.prototype.concat=function(...e){return o(this,...e)},Uint8Array.prototype.toJSON=function(){return[...this]},Array.prototype.findAndSplice=function(e){let t=this.findIndex(e);return-1!==t?this.splice(t,1)[0]:void 0},String.prototype.toHHMMSS=function(e=!1){const t=parseInt(this+"",10),a=Math.floor(t/3600);let n=Math.floor((t-3600*a)/60),s=t-3600*a-60*n;return a&&(e=!0),n<10&&(n=e?"0"+n:n),s<10&&(s="0"+s),(a?a+":":"")+n+":"+s},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)))},Promise.prototype.safeFinally=function(e){return this.catch(()=>{}).finally(e)};var y={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1};const c=y.debug,l="undefined"!=typeof window?window:self;var g=c;const h="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,u="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!h,f=u||h,_=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(a=>{a.length&&a.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},v=(...e)=>{self.postMessage(...e)},b=()=>{},P=h?_.bind(null,!1):u?v:b,w=h?_.bind(null,!0):u?v:b;class S{constructor(){this.prefix="",this.cache={},this.useStorage=!0,y.test&&(this.prefix="t_")}get(e,t=!0){if(this.cache.hasOwnProperty(e)&&t)return this.cache[e];if(this.useStorage){let t;try{t=localStorage.getItem(this.prefix+e)}catch(e){this.useStorage=!1}if(null!==t)try{t=JSON.parse(t)}catch(e){}else t=void 0;return t}}set(e,t=!1){for(const a in e)if(e.hasOwnProperty(a)){const n=e[a];if(this.cache[a]=n,this.useStorage&&!t)try{const e=JSON.stringify(n);localStorage.setItem(this.prefix+a,e)}catch(e){this.useStorage=!1}}}delete(e,t=!1){e=""+e,t||delete this.cache[e];try{localStorage.removeItem(this.prefix+e)}catch(e){}}clear(){const e=["dc","server_time_offset","xt_instance","user_auth","state_id"];for(let t=1;t<=5;++t)e.push(`dc${t}_server_salt`),e.push(`dc${t}_auth_key`);for(let t of e)this.delete(t,!0)}toggleStorage(e){if(this.useStorage=e,e)return this.set(this.cache);this.clear()}}class I{constructor(){this.taskId=0,this.tasks={},I.STORAGES.push(this),f||(this.storage=new S)}finishTask(e,t){this.tasks.hasOwnProperty(e)&&(this.tasks[e](t),delete this.tasks[e])}proxy(e,...t){return new Promise((a,n)=>{if(f){const n=this.taskId++;this.tasks[n]=a;P({type:"localStorageProxy",id:n,payload:{type:e,args:t}})}else{t=Array.prototype.slice.call(t);a(this.storage[e].apply(this.storage,t))}})}get(e,t){return this.proxy("get",e,t)}set(e,t){return this.proxy("set",e,t)}delete(e,t){return this.proxy("delete",e,t)}clear(){return this.proxy("clear")}toggleStorage(e){return this.proxy("toggleStorage",e)}}I.STORAGES=[];const k=new I;l.appStorage=k;var C,A=k,M=0,E=0,R="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\'\"+-";for(M=0;1<1<>=1))-1)+1;var V,D,U=pe(1,1,1),T=(pe(0,1,1),new Array(0)),B=T,x=T,F=T,L=T,N=T,O=T,q=T,G=T,K=T,z=T,H=T,j=T,W=T;function J(e){var t,a,n;for(t=e.length-1;0==e[t]&&t>0;t--);for(a=0,n=e[t];n;n>>=1,a++);return a+=M*t}function Z(e,t){var a=pe(0,(e.length>t?e.length:t)*M,0);return ue(a,e),a}function Q(e,t){var a=he(e);return Ee(a,t),De(a,1)}function X(e,t){var a=Z(e,e.length+t.length);return function(e,t){var a;B.length!=2*e.length&&(B=new Array(2*e.length));for(fe(B,0),a=0;at.length?e.length+1:t.length+1);return Ae(a,t),De(a,1)}function ee(e,t){var a=Z(e,e.length>t.length?e.length+1:t.length+1);return Me(a,t),De(a,1)}function te(e,t,a,n,s){var i=0,r=Math.max(e.length,t.length);for(K.length!=r&&(K=new Array(r),z=new Array(r),H=new Array(r),j=new Array(r),W=new Array(r));!(1&e[0]||1&t[0]);)be(e),be(t),i++;for(ue(K,e),ue(a,t),fe(z,1),fe(H,0),fe(j,0),fe(W,1);;){for(;!(1&K[0]);)be(K),1&z[0]||1&H[0]?(Me(z,t),be(z),Ae(H,e),be(H)):(be(z),be(H));for(;!(1&a[0]);)be(a),1&j[0]||1&W[0]?(Me(j,t),be(j),Ae(W,e),be(W)):(be(j),be(W));if(se(a,K)?(Ae(a,K),Ae(j,z),Ae(W,H)):(Ae(K,a),Ae(z,j),Ae(H,W)),me(K,0)){for(;ae(j);)Me(j,t),Ae(W,e);return we(W,-1),ue(n,j),ue(s,W),void Pe(a,i)}}}function ae(e){return e[e.length-1]>>M-1&1}function ne(e,t,a){var n,s=e.length,i=t.length;for(V=s+a=0;n++)if(e[n]>0)return 1;for(n=s-1+a;n0)return 0;for(n=V-1;n>=a;n--){if(e[n-a]>t[n])return 1;if(e[n-a]=0;a--){if(e[a]>t[a])return 1;if(e[a]>=1;for(Pe(t,d=M-d),Pe(n,d),s=n.length;0===n[s-1]&&s>i;s--);for(fe(a,0);!ne(t,n,s-i);)Ce(n,t,s-i),a[s-i]++;for(r=s-1;r>=i;r--){for(n[r]==t[i-1]?a[r-i]=E:a[r-i]=Math.floor((n[r]*C+n[r-1])/t[i-1]);m=(o=(i>1?t[i-2]:0)*a[r-i])>>M,o&=E,m=(p=m+a[r-i]*t[i-1])>>M,p&=E,m==n[r]?p==n[r-1]?o>(r>1?n[r-2]:0):p>n[r-1]:m>n[r];)a[r-i]--;Ie(n,t,-a[r-i],r-i),ae(n)&&(ke(n,t,r-i),a[r-i]--)}ve(t,d),ve(n,d)}function re(e,t){var a,n=0;for(a=e.length-1;a>=0;a--)n=(n*C+e[a])%t;return n}function pe(e,t,a){var n;n=a>(n=Math.ceil(t/M)+1)?a:n;var s=new Array(n);return fe(s,e),s}function oe(e,t,a){var n,s,i,r,p,o=e.length;if(-1===t){for(i=new Array(0);;){for(r=new Array(i.length+1),s=0;s=36&&(n-=26),!(n>=t||n<0));s++)we(i,t),_e(i,n);for(o=i.length;o>0&&!i[o-1];o--);for(o=a>o+1?a:o+1,r=new Array(o),p=ot.length){for(;a0;a--)s+=e[a]+",";s+=e[0]}else for(;!ye(O);)n=Se(O,t),s=R.substring(n,n+1)+s;return 0===s.length&&(s="0"),s}function le(e,t=!0){O.length!==e.length?O=he(e):ue(O,e);const a=[];for(;!ye(O);)T=Se(O,256),a.push(T);return t&&a.reverse(),a}function ge(e,t){return se(e,t)?1:de(e,t)?0:-1}function he(e){return ue(D=Array(e.length),e),D}function ue(e,t){var a,n=e.length>=M}function _e(e,t){var a,n,s,i;for(e[0]+=t,n=e.length,s=0,a=0;a>M))*C),e[a]=s&E,!(s=(s>>M)-i))return}function ve(e,t){var a,n=Math.floor(t/M);if(n){for(a=0;a>t);e[a]>>=t}function be(e){var t;for(t=0;t>1);e[t]=e[t]>>1|e[t]&C>>1}function Pe(e,t){var a,n=Math.floor(t/M);if(n){for(a=e.length;a>=n;a--)e[a]=e[a-n];for(;a>=0;a--)e[a]=0;t%=M}if(t){for(a=e.length-1;a>0;a--)e[a]=E&(e[a]<>M-t);e[a]=E&e[a]<>M))*C),e[a]=s&E,s=(s>>M)-i}function Se(e,t){var a,n,s=0;for(a=e.length-1;a>=0;a--)n=s*C+e[a],e[a]=Math.floor(n/t),s=n%t;return s}function Ie(e,t,a,n){var s,i,r,p;for(r=e.length>=M;for(s=r;i&&s>=M}function ke(e,t,a){var n,s,i,r;for(i=e.length>=M;for(n=i;s&&n>=M}function Ce(e,t,a){var n,s,i,r;for(i=e.length>=M;for(n=i;s&&n>=M}function Ae(e,t){var a,n,s;for(s=e.length>=M;for(a=s;n&&a>=M}function Me(e,t){var a,n,s;for(s=e.length>=M;for(a=s;n&&a>=M}function Ee(e,t){L.length!==e.length?L=he(e):ue(L,e),N.length!==e.length&&(N=he(e)),ie(L,t,N,e)}function Re(e,t,a){var n;for(x.length!=2*e.length&&(x=new Array(2*e.length)),fe(x,0),n=0;n0&&!e[i-1];i--);for(r=i>t.length?2*i:2*t.length,x.length!=r&&(x=new Array(r)),fe(x,0),a=0;a>=M,n=a+1;n>=M;x[a+i]=s}Ee(x,t),ue(e,x)}function De(e,t){var a,n;for(a=e.length;a>0&&!e[a-1];a--);return ue(n=new Array(a+t),e),n}function Ue(e,t,a){var n,s,i,r;if(q.length!=a.length&&(q=he(a)),0!=(1&a[0])){for(fe(q,0),i=a.length;i>0&&!a[i-1];i--);for(r=C-function(e,t){for(var a=1,n=0;;){if(1===e)return a;if(0===e)return 0;if(n-=a*Math.floor(t/e),1===(t%=e))return n;if(0===t)return 0;a-=n*Math.floor(e/t),e%=t}}(re(a,C),C),q[i]=1,Re(e,q,a),F.length!=e.length?F=he(e):ue(F,e),n=t.length-1;n>0&!t[n];n--);if(0!=t[n]){for(s=1<>=1);for(;;){if(!(s>>=1)){if(--n<0)return void Te(e,U,a,r);s=1<0&&0==a[d-1];d--);for(;y>0&&0==t[y-1];y--);for(m=G.length-1,s=0;s>M,o=e[s],i=1;i>=M,i++,r+=G[i]+p*a[i]+o*t[i],G[i-1]=r&E,r>>=M,i++,r+=G[i]+p*a[i]+o*t[i],G[i-1]=r&E,r>>=M,i++,r+=G[i]+p*a[i]+o*t[i],G[i-1]=r&E,r>>=M,i++,r+=G[i]+p*a[i]+o*t[i],G[i-1]=r&E,r>>=M,i++;for(;i>=M,i++;for(;i>=M,i++,r+=G[i]+p*a[i],G[i-1]=r&E,r>>=M,i++,r+=G[i]+p*a[i],G[i-1]=r&E,r>>=M,i++,r+=G[i]+p*a[i],G[i-1]=r&E,r>>=M,i++,r+=G[i]+p*a[i],G[i-1]=r&E,r>>=M,i++;for(;i>=M,i++;for(;i>=M,i++;G[i-1]=r&E}se(a,G)||Ae(G,a),ue(e,G)}function Be(e){return"object"==typeof e&&null!==e}function xe(e){return e>>>0}function Fe(e,t){e=xe(e),t=xe(t);const a=oe(e.toString(16),16,32);Pe(a,32),Me(a,oe(t.toString(16),16,32));return ce(a,10)}function Le(e,t=16,a,n=!1,s=!1){const i=e.byteLength||e.length,r=n?t-i:t-i%t;if(r>0&&r"}],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:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{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:-1182234929,predicate:"inputUserEmpty",params:[],type:"InputUser"},{id:-138301121,predicate:"inputUserSelf",params:[],type:"InputUser"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],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:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",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: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:-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:-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:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{id:-646342540,predicate:"inputMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"start_param",type:"flags.1?string"}],type:"InputMedia"},{id:-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: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:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",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:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{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:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{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: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:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_id",type:"long"}],type:"Peer"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_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:1073147056,predicate:"user",params:[{name:"flags",type:"#"},{name:"self",type:"flags.10?true"},{name:"contact",type:"flags.11?true"},{name:"mutual_contact",type:"flags.12?true"},{name:"deleted",type:"flags.13?true"},{name:"bot",type:"flags.14?true"},{name:"bot_chat_history",type:"flags.15?true"},{name:"bot_nochats",type:"flags.16?true"},{name:"verified",type:"flags.17?true"},{name:"restricted",type:"flags.18?true"},{name:"min",type:"flags.20?true"},{name:"bot_inline_geo",type:"flags.21?true"},{name:"support",type:"flags.23?true"},{name:"scam",type:"flags.24?true"},{name:"apply_min_photo",type:"flags.25?true"},{name:"fake",type:"flags.26?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.0?long"},{name:"first_name",type:"flags.1?string"},{name:"last_name",type:"flags.2?string"},{name:"username",type:"flags.3?string"},{name:"phone",type:"flags.4?string"},{name:"photo",type:"flags.5?UserProfilePhoto"},{name:"status",type:"flags.6?UserStatus"},{name:"bot_info_version",type:"flags.14?int"},{name:"restriction_reason",type:"flags.18?Vector"},{name:"bot_inline_placeholder",type:"flags.19?string"},{name:"lang_code",type:"flags.22?string"}],type:"User"},{id: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:-496024847,predicate:"userStatusRecently",params:[],type:"UserStatus"},{id:129960444,predicate:"userStatusLastWeek",params:[],type:"UserStatus"},{id:2011940674,predicate:"userStatusLastMonth",params:[],type:"UserStatus"},{id:693512293,predicate:"chatEmpty",params:[{name:"id",type:"long"}],type:"Chat"},{id:1103884886,predicate:"chat",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"kicked",type:"flags.1?true"},{name:"left",type:"flags.2?true"},{name:"deactivated",type:"flags.5?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"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:-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:"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:1304281241,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"}],type:"ChatFull"},{id:-374179305,predicate:"channelFull",params:[{name:"flags",type:"#"},{name:"can_view_participants",type:"flags.3?true"},{name:"can_set_username",type:"flags.6?true"},{name:"can_set_stickers",type:"flags.7?true"},{name:"hidden_prehistory",type:"flags.10?true"},{name:"can_set_location",type:"flags.16?true"},{name:"has_scheduled",type:"flags.19?true"},{name:"can_view_stats",type:"flags.20?true"},{name:"blocked",type:"flags.22?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants_count",type:"flags.0?int"},{name:"admins_count",type:"flags.1?int"},{name:"kicked_count",type:"flags.2?int"},{name:"banned_count",type:"flags.2?int"},{name:"online_count",type:"flags.13?int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"chat_photo",type:"Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.23?ExportedChatInvite"},{name:"bot_info",type:"Vector"},{name:"migrated_from_chat_id",type:"flags.4?long"},{name:"migrated_from_max_id",type:"flags.4?int"},{name:"pinned_msg_id",type:"flags.5?int"},{name:"stickerset",type:"flags.8?StickerSet"},{name:"available_min_id",type:"flags.9?int"},{name:"folder_id",type:"flags.11?int"},{name:"linked_chat_id",type:"flags.14?long"},{name:"location",type:"flags.15?ChannelLocation"},{name:"slowmode_seconds",type:"flags.17?int"},{name:"slowmode_next_send_date",type:"flags.18?int"},{name:"stats_dc",type:"flags.12?int"},{name:"pts",type:"int"},{name:"call",type:"flags.21?InputGroupCall"},{name:"ttl_period",type:"flags.24?int"},{name:"pending_suggestions",type:"flags.25?Vector"},{name:"groupcall_default_join_as",type:"flags.26?Peer"},{name:"theme_emoticon",type:"flags.27?string"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{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:-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:-2049520670,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:"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:"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:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{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:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-2074799289,predicate:"messageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"receipt_msg_id",type:"flags.2?int"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"start_param",type:"string"}],type:"MessageMedia"},{id:-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:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],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:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{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:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{id:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"charge",type:"PaymentCharge"}],type:"MessageAction"},{id:1080663248,predicate:"messageActionPaymentSent",params:[{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"MessageAction"},{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:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{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:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{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:-1441072131,predicate:"messageActionSetMessagesTTL",params:[{name:"period",type:"int"}],type:"MessageAction"},{id:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:739712882,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:"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: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: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:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{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:-855308010,predicate:"auth.authorization",params:[{name:"flags",type:"#"},{name:"tmp_sessions",type:"flags.0?int"},{name:"user",type:"User"}],type:"auth.Authorization"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],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:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-1673717362,predicate:"inputPeerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"InputPeerNotifySettings"},{id:-1353671392,predicate:"peerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"PeerNotifySettings"},{id:1933519201,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:"geo_distance",type:"flags.6?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:-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: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:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{id:-694681851,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:"user",type:"User"},{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"}],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:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],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: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:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{id:1694474197,predicate:"messages.chats",params:[{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{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:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{id:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:464520273,predicate:"inputMessagesFilterPinned",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: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: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:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{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:-298113238,predicate:"updatePrivacy",params:[{name:"key",type:"PrivacyKey"},{name:"rules",type:"Vector"}],type:"Update"},{id:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{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:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{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:-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:1753886890,predicate:"updateNewStickerSet",params:[{name:"stickerset",type:"messages.StickerSet"}],type:"Update"},{id:196268545,predicate:"updateStickerSetsOrder",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Update"},{id:1135492588,predicate:"updateStickerSets",params:[],type:"Update"},{id:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{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:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{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:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{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:-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:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{id:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{id:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{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: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:-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:-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:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{id:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{id:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:1153291573,predicate:"updateChannelReadMessagesContents",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"}],type:"Update"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{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:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{id:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{id:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{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:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{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: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:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{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:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{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:-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:-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:-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:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{id:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",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:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],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:-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:-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:-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:414687501,predicate:"dcOption",params:[{name:"flags",type:"#"},{name:"ipv6",type:"flags.0?true"},{name:"media_only",type:"flags.1?true"},{name:"tcpo_only",type:"flags.2?true"},{name:"cdn",type:"flags.3?true"},{name:"static",type:"flags.4?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:856375399,predicate:"config",params:[{name:"flags",type:"#"},{name:"phonecalls_enabled",type:"flags.1?true"},{name:"default_p2p_contacts",type:"flags.3?true"},{name:"preload_featured_stickers",type:"flags.4?true"},{name:"ignore_phone_entities",type:"flags.5?true"},{name:"revoke_pm_inbox",type:"flags.6?true"},{name:"blocked_mode",type:"flags.8?true"},{name:"pfs_enabled",type:"flags.13?true"},{name:"date",type:"int"},{name:"expires",type:"int"},{name:"test_mode",type:"Bool"},{name:"this_dc",type:"int"},{name:"dc_options",type:"Vector"},{name:"dc_txt_domain_name",type:"string"},{name:"chat_size_max",type:"int"},{name:"megagroup_size_max",type:"int"},{name:"forwarded_count_max",type:"int"},{name:"online_update_period_ms",type:"int"},{name:"offline_blur_timeout_ms",type:"int"},{name:"offline_idle_timeout_ms",type:"int"},{name:"online_cloud_timeout_ms",type:"int"},{name:"notify_cloud_delay_ms",type:"int"},{name:"notify_default_delay_ms",type:"int"},{name:"push_chat_period_ms",type:"int"},{name:"push_chat_limit",type:"int"},{name:"saved_gifs_limit",type:"int"},{name:"edit_time_limit",type:"int"},{name:"revoke_time_limit",type:"int"},{name:"revoke_pm_time_limit",type:"int"},{name:"rating_e_decay",type:"int"},{name:"stickers_recent_limit",type:"int"},{name:"stickers_faved_limit",type:"int"},{name:"channels_read_media_period",type:"int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"pinned_dialogs_count_max",type:"int"},{name:"pinned_infolder_count_max",type:"int"},{name:"call_receive_timeout_ms",type:"int"},{name:"call_ring_timeout_ms",type:"int"},{name:"call_connect_timeout_ms",type:"int"},{name:"call_packet_timeout_ms",type:"int"},{name:"me_url_prefix",type:"string"},{name:"autoupdate_url_prefix",type:"flags.7?string"},{name:"gif_search_username",type:"flags.9?string"},{name:"venue_search_username",type:"flags.10?string"},{name:"img_search_username",type:"flags.11?string"},{name:"static_maps_provider",type:"flags.12?string"},{name:"caption_length_max",type:"int"},{name:"message_length_max",type:"int"},{name:"webfile_dc_id",type:"int"},{name:"suggested_lang_code",type:"flags.2?string"},{name:"lang_pack_version",type:"flags.2?int"},{name:"base_lang_pack_version",type:"flags.2?int"}],type:"Config"},{id:-1910892683,predicate:"nearestDc",params:[{name:"country",type:"string"},{name:"this_dc",type:"int"},{name:"nearest_dc",type:"int"}],type:"NearestDc"},{id:-860107216,predicate:"help.appUpdate",params:[{name:"flags",type:"#"},{name:"can_not_skip",type:"flags.0?true"},{name:"id",type:"int"},{name:"version",type:"string"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"document",type:"flags.1?Document"},{name:"url",type:"flags.2?string"},{name:"sticker",type:"flags.3?Document"}],type:"help.AppUpdate"},{id:-1000708810,predicate:"help.noAppUpdate",params:[],type:"help.AppUpdate"},{id:415997816,predicate:"help.inviteText",params:[{name:"message",type:"string"}],type:"help.InviteText"},{id:-1417756512,predicate:"encryptedChatEmpty",params:[{name:"id",type:"int"}],type:"EncryptedChat"},{id:1722964307,predicate:"encryptedChatWaiting",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"}],type:"EncryptedChat"},{id:1223809356,predicate:"encryptedChatRequested",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1643173063,predicate:"encryptedChat",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:505183301,predicate:"encryptedChatDiscarded",params:[{name:"flags",type:"#"},{name:"history_deleted",type:"flags.0?true"},{name:"id",type:"int"}],type:"EncryptedChat"},{id:-247351839,predicate:"inputEncryptedChat",params:[{name:"chat_id",type:"int"},{name:"access_hash",type:"long"}],type:"InputEncryptedChat"},{id:-1038136962,predicate:"encryptedFileEmpty",params:[],type:"EncryptedFile"},{id:1248893260,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"key_fingerprint",type:"int"}],type:"EncryptedFile"},{id:406307684,predicate:"inputEncryptedFileEmpty",params:[],type:"InputEncryptedFile"},{id:1690108678,predicate:"inputEncryptedFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1511503333,predicate:"inputEncryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputEncryptedFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{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: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:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:512177195,predicate:"document",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"mime_type",type:"string"},{name:"size",type:"int"},{name:"thumbs",type:"flags.0?Vector"},{name:"video_thumbs",type:"flags.1?Vector"},{name:"dc_id",type:"int"},{name:"attributes",type:"Vector"}],type:"Document"},{id:398898678,predicate:"help.support",params:[{name:"phone_number",type:"string"},{name:"user",type:"User"}],type:"help.Support"},{id:-1613493288,predicate:"notifyPeer",params:[{name:"peer",type:"Peer"}],type:"NotifyPeer"},{id:-1261946036,predicate:"notifyUsers",params:[],type:"NotifyPeer"},{id:-1073230141,predicate:"notifyChats",params:[],type:"NotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{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:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:1781674934,predicate:"sendMessageEmojiInteraction",params:[{name:"emoticon",type:"string"},{name:"interaction",type:"DataJSON"}],type:"SendMessageAction"},{id:-1234857938,predicate:"sendMessageEmojiInteractionSeen",params:[{name:"emoticon",type:"string"}],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:1335282456,predicate:"inputPrivacyKeyStatusTimestamp",params:[],type:"InputPrivacyKey"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:-1137792208,predicate:"privacyKeyStatusTimestamp",params:[],type:"PrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",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:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",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:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",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: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:-1744710921,predicate:"documentAttributeHasStickers",params:[],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:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{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:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{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:"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:307276766,predicate:"account.authorizations",params:[{name:"authorizations",type:"Vector"}],type:"account.Authorizations"},{id:408623183,predicate:"account.password",params:[{name:"flags",type:"#"},{name:"has_recovery",type:"flags.0?true"},{name:"has_secure_values",type:"flags.1?true"},{name:"has_password",type:"flags.2?true"},{name:"current_algo",type:"flags.2?PasswordKdfAlgo"},{name:"srp_B",type:"flags.2?bytes"},{name:"srp_id",type:"flags.2?long"},{name:"hint",type:"flags.3?string"},{name:"email_unconfirmed_pattern",type:"flags.4?string"},{name:"new_algo",type:"PasswordKdfAlgo"},{name:"new_secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_random",type:"bytes"},{name:"pending_reset_date",type:"flags.5?int"}],type:"account.Password"},{id:-1705233435,predicate:"account.passwordSettings",params:[{name:"flags",type:"#"},{name:"email",type:"flags.0?string"},{name:"secure_settings",type:"flags.1?SecureSecretSettings"}],type:"account.PasswordSettings"},{id:-1036572727,predicate:"account.passwordInputSettings",params:[{name:"flags",type:"#"},{name:"new_algo",type:"flags.0?PasswordKdfAlgo"},{name:"new_password_hash",type:"flags.0?bytes"},{name:"hint",type:"flags.0?string"},{name:"email",type:"flags.1?string"},{name:"new_secure_settings",type:"flags.2?SecureSecretSettings"}],type:"account.PasswordInputSettings"},{id:326715557,predicate:"auth.passwordRecovery",params:[{name:"email_pattern",type:"string"}],type:"auth.PasswordRecovery"},{id:-1551583367,predicate:"receivedNotifyMessage",params:[{name:"id",type:"int"},{name:"flags",type:"int"}],type:"ReceivedNotifyMessage"},{id:-1316944408,predicate:"chatInviteExported",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.0?true"},{name:"permanent",type:"flags.5?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"}],type:"ExportedChatInvite"},{id:1516793212,predicate:"chatInviteAlready",params:[{name:"chat",type:"Chat"}],type:"ChatInvite"},{id:-540871282,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:"title",type:"string"},{name:"photo",type:"Photo"},{name:"participants_count",type:"int"},{name:"participants",type:"flags.4?Vector"}],type:"ChatInvite"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{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:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{id:-673242758,predicate:"stickerSet",params:[{name:"flags",type:"#"},{name:"archived",type:"flags.1?true"},{name:"official",type:"flags.2?true"},{name:"masks",type:"flags.3?true"},{name:"animated",type:"flags.5?true"},{name:"installed_date",type:"flags.0?int"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumbs",type:"flags.4?Vector"},{name:"thumb_dc_id",type:"flags.4?int"},{name:"thumb_version",type:"flags.4?int"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:-1240849242,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:460632885,predicate:"botInfo",params:[{name:"user_id",type:"long"},{name:"description",type:"string"},{name:"commands",type:"Vector"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id: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:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{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:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{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:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{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:-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:-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:-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:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{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:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{id:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{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:682146919,predicate:"channelParticipantSelf",params:[{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: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:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],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:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{id:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{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:-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:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],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: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:-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: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:-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:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{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:-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:-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:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{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: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: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: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: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:-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: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: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: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:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{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: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:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",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:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{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:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-2067782896,predicate:"messages.featuredStickers",params:[{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id: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: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: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: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: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: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:-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:-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:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],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:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{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:-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: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:-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:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{id:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:215516896,predicate:"invoice",params:[{name:"flags",type:"#"},{name:"test",type:"flags.0?true"},{name:"name_requested",type:"flags.1?true"},{name:"phone_requested",type:"flags.2?true"},{name:"email_requested",type:"flags.3?true"},{name:"shipping_address_requested",type:"flags.4?true"},{name:"flexible",type:"flags.5?true"},{name:"phone_to_provider",type:"flags.6?true"},{name:"email_to_provider",type:"flags.7?true"},{name:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"}],type:"Invoice"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{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:-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:-104284986,predicate:"webDocumentNoProxy",params:[{name:"url",type:"string"},{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:-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:568808380,predicate:"upload.webFile",params:[{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"file_type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.WebFile"},{id:378828315,predicate:"payments.paymentForm",params:[{name:"flags",type:"#"},{name:"can_save_credentials",type:"flags.2?true"},{name:"password_missing",type:"flags.3?true"},{name:"form_id",type:"long"},{name:"bot_id",type:"long"},{name:"invoice",type:"Invoice"},{name:"provider_id",type:"long"},{name:"url",type:"string"},{name:"native_provider",type:"flags.4?string"},{name:"native_params",type:"flags.4?DataJSON"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?PaymentSavedCredentials"},{name:"users",type:"Vector"}],type:"payments.PaymentForm"},{id:-784000893,predicate:"payments.validatedRequestedInfo",params:[{name:"flags",type:"#"},{name:"id",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"payments.ValidatedRequestedInfo"},{id:1314881805,predicate:"payments.paymentResult",params:[{name:"updates",type:"Updates"}],type:"payments.PaymentResult"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],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:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",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:-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:506920429,predicate:"inputPhoneCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPhoneCall"},{id:1399245077,predicate:"phoneCallEmpty",params:[{name:"id",type:"long"}],type:"PhoneCall"},{id:-987599081,predicate:"phoneCallWaiting",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"receive_date",type:"flags.0?int"}],type:"PhoneCall"},{id:347139340,predicate:"phoneCallRequested",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:912311057,predicate:"phoneCallAccepted",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:-1770029977,predicate:"phoneCall",params:[{name:"flags",type:"#"},{name:"p2p_allowed",type:"flags.5?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"connections",type:"Vector"},{name:"start_date",type:"int"}],type:"PhoneCall"},{id:1355435489,predicate:"phoneCallDiscarded",params:[{name:"flags",type:"#"},{name:"need_rating",type:"flags.2?true"},{name:"need_debug",type:"flags.3?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"PhoneCall"},{id:-1655957568,predicate:"phoneConnection",params:[{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],type:"PhoneConnection"},{id: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:-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:-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:-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:-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:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{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:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{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: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:-26672755,predicate:"channelAdminLogEventActionChangeTheme",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],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"}],type:"ChannelAdminLogEventsFilter"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{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: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: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:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],type:"DialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{id:223655517,predicate:"messages.foundStickerSetsNotModified",params:[],type:"messages.FoundStickerSets"},{id:-1963942446,predicate:"messages.foundStickerSets",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.FoundStickerSets"},{id:1648543603,predicate:"fileHash",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{id: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:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:-534283678,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"date",type:"int"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureFile"},{id:-1964327229,predicate:"secureData",params:[{name:"data",type:"bytes"},{name:"data_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureData"},{id:2103482845,predicate:"securePlainPhone",params:[{name:"phone",type:"string"}],type:"SecurePlainData"},{id:569137759,predicate:"securePlainEmail",params:[{name:"email",type:"string"}],type:"SecurePlainData"},{id:-1658158621,predicate:"secureValueTypePersonalDetails",params:[],type:"SecureValueType"},{id:1034709504,predicate:"secureValueTypePassport",params:[],type:"SecureValueType"},{id:115615172,predicate:"secureValueTypeDriverLicense",params:[],type:"SecureValueType"},{id:-1596951477,predicate:"secureValueTypeIdentityCard",params:[],type:"SecureValueType"},{id:-1717268701,predicate:"secureValueTypeInternalPassport",params:[],type:"SecureValueType"},{id:-874308058,predicate:"secureValueTypeAddress",params:[],type:"SecureValueType"},{id:-63531698,predicate:"secureValueTypeUtilityBill",params:[],type:"SecureValueType"},{id:-1995211763,predicate:"secureValueTypeBankStatement",params:[],type:"SecureValueType"},{id:-1954007928,predicate:"secureValueTypeRentalAgreement",params:[],type:"SecureValueType"},{id:-1713143702,predicate:"secureValueTypePassportRegistration",params:[],type:"SecureValueType"},{id:-368907213,predicate:"secureValueTypeTemporaryRegistration",params:[],type:"SecureValueType"},{id:-1289704741,predicate:"secureValueTypePhone",params:[],type:"SecureValueType"},{id:-1908627474,predicate:"secureValueTypeEmail",params:[],type:"SecureValueType"},{id:411017418,predicate:"secureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?SecureFile"},{name:"reverse_side",type:"flags.2?SecureFile"},{name:"selfie",type:"flags.3?SecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"},{name:"hash",type:"bytes"}],type:"SecureValue"},{id:-618540889,predicate:"inputSecureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?InputSecureFile"},{name:"reverse_side",type:"flags.2?InputSecureFile"},{name:"selfie",type:"flags.3?InputSecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"}],type:"InputSecureValue"},{id:-316748368,predicate:"secureValueHash",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"}],type:"SecureValueHash"},{id:-391902247,predicate:"secureValueErrorData",params:[{name:"type",type:"SecureValueType"},{name:"data_hash",type:"bytes"},{name:"field",type:"string"},{name:"text",type:"string"}],type:"SecureValueError"},{id:12467706,predicate:"secureValueErrorFrontSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2037765467,predicate:"secureValueErrorReverseSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-449327402,predicate:"secureValueErrorSelfie",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:2054162547,predicate:"secureValueErrorFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:1717706985,predicate:"secureValueErrorFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-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: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: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:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],type:"PasswordKdfAlgo"},{id:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],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:-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:-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: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: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:-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:-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:-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: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:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{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:-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:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{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:-557924733,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"}],type:"CodeSettings"},{id:499236004,predicate:"wallPaperSettings",params:[{name:"flags",type:"#"},{name:"blur",type:"flags.1?true"},{name:"motion",type:"flags.2?true"},{name:"background_color",type:"flags.0?int"},{name:"second_background_color",type:"flags.4?int"},{name:"third_background_color",type:"flags.5?int"},{name:"fourth_background_color",type:"flags.6?int"},{name:"intensity",type:"flags.3?int"},{name:"rotation",type:"flags.4?int"}],type:"WallPaperSettings"},{id:-532532493,predicate:"autoDownloadSettings",params:[{name:"flags",type:"#"},{name:"disabled",type:"flags.0?true"},{name:"video_preload_large",type:"flags.1?true"},{name:"audio_preload_next",type:"flags.2?true"},{name:"phonecalls_less_data",type:"flags.3?true"},{name:"photo_size_max",type:"int"},{name:"video_size_max",type:"int"},{name:"file_size_max",type:"int"},{name:"video_upload_maxbitrate",type:"int"}],type:"AutoDownloadSettings"},{id:1674235686,predicate:"account.autoDownloadSettings",params:[{name:"low",type:"AutoDownloadSettings"},{name:"medium",type:"AutoDownloadSettings"},{name:"high",type:"AutoDownloadSettings"}],type:"account.AutoDownloadSettings"},{id:-709641735,predicate:"emojiKeyword",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:594408994,predicate:"emojiKeywordDeleted",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:1556570557,predicate:"emojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"keywords",type:"Vector"}],type:"EmojiKeywordsDifference"},{id:-1519029347,predicate:"emojiURL",params:[{name:"url",type:"string"}],type:"EmojiURL"},{id:-1275374751,predicate:"emojiLanguage",params:[{name:"lang_code",type:"string"}],type:"EmojiLanguage"},{id:-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:-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:-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:-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:-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:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{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:-402474788,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?ThemeSettings"},{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: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:-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: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:-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: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:-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:-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:-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: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:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{id:-1506535550,predicate:"messages.discussionMessage",params:[{name:"flags",type:"#"},{name:"messages",type:"Vector"},{name:"max_id",type:"flags.0?int"},{name:"read_inbox_max_id",type:"flags.1?int"},{name:"read_outbox_max_id",type:"flags.2?int"},{name:"unread_count",type:"int"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.DiscussionMessage"},{id:-1495959709,predicate:"messageReplyHeader",params:[{name:"flags",type:"#"},{name:"reply_to_msg_id",type:"int"},{name:"reply_to_peer_id",type:"flags.0?Peer"},{name:"reply_to_top_id",type:"flags.1?int"}],type:"MessageReplyHeader"},{id:-2083123262,predicate:"messageReplies",params:[{name:"flags",type:"#"},{name:"comments",type:"flags.0?true"},{name:"replies",type:"int"},{name:"replies_pts",type:"int"},{name:"recent_repliers",type:"flags.1?Vector"},{name:"channel_id",type:"flags.0?long"},{name:"max_id",type:"flags.2?int"},{name:"read_max_id",type:"flags.3?int"}],type:"MessageReplies"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{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:"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:-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:-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:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{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:-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:190633460,predicate:"chatInviteImporter",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],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:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{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:-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:-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:-318022605,predicate:"chatTheme",params:[{name:"emoticon",type:"string"},{name:"theme",type:"Theme"},{name:"dark_theme",type:"Theme"}],type:"ChatTheme"},{id:-535699004,predicate:"account.chatThemesNotModified",params:[],type:"account.ChatThemes"},{id:-28524867,predicate:"account.chatThemes",params:[{name:"hash",type:"int"},{name:"themes",type:"Vector"}],type:"account.ChatThemes"},{id:708589599,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"random_id",type:"bytes"},{name:"from_id",type:"Peer"},{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"}],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:-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:-627372787,method:"invokeWithLayer",params:[{name:"layer",type:"int"},{name:"query",type:"!X"}],type:"X"},{id:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{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:-1502141361,method:"auth.sendCode",params:[{name:"phone_number",type:"string"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:-2131827673,method:"auth.signUp",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"auth.Authorization"},{id:-1126886015,method:"auth.signIn",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"auth.Authorization"},{id:1461180992,method:"auth.logOut",params:[],type:"Bool"},{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: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:-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: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:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{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:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],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:655677548,method:"account.checkUsername",params:[{name:"username",type:"string"}],type:"Bool"},{id:1040964988,method:"account.updateUsername",params:[{name:"username",type:"string"}],type:"User"},{id:-623130288,method:"account.getPrivacy",params:[{name:"key",type:"InputPrivacyKey"}],type:"account.PrivacyRules"},{id:-906486552,method:"account.setPrivacy",params:[{name:"key",type:"InputPrivacyKey"},{name:"rules",type:"Vector"}],type:"account.PrivacyRules"},{id:1099779595,method:"account.deleteAccount",params:[{name:"reason",type:"string"}],type:"Bool"},{id:150761757,method:"account.getAccountTTL",params:[],type:"AccountDaysTTL"},{id:608323678,method:"account.setAccountTTL",params:[{name:"ttl",type:"AccountDaysTTL"}],type:"Bool"},{id:-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:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],type:"Bool"},{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: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:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{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:-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:-1456907910,method:"account.getAuthorizationForm",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"}],type:"account.AuthorizationForm"},{id:-202552205,method:"account.acceptAuthorization",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"},{name:"value_hashes",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"Bool"},{id:-1516022023,method:"account.sendVerifyPhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1305716726,method:"account.verifyPhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:1880182943,method:"account.sendVerifyEmailCode",params:[{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:-323339813,method:"account.verifyEmail",params:[{name:"email",type:"string"},{name:"code",type:"string"}],type:"Bool"},{id:-262453244,method:"account.initTakeoutSession",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"message_users",type:"flags.1?true"},{name:"message_chats",type:"flags.2?true"},{name:"message_megagroups",type:"flags.3?true"},{name:"message_channels",type:"flags.4?true"},{name:"files",type:"flags.5?true"},{name:"file_max_size",type:"flags.5?int"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:-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:-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:-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: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:-2077048289,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?InputThemeSettings"}],type:"Theme"},{id:1555261397,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?InputThemeSettings"}],type:"Theme"},{id:-229175188,method:"account.saveTheme",params:[{name:"theme",type:"InputTheme"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:2061776695,method:"account.installTheme",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"format",type:"flags.1?string"},{name:"theme",type:"flags.1?InputTheme"}],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:-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:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{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:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:-690545285,method:"account.getChatThemes",params:[{name:"hash",type:"int"}],type:"account.ChatThemes"},{id:227648840,method:"users.getUsers",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-902781519,method:"users.getFullUser",params:[{name:"id",type:"InputUser"}],type:"UserFull"},{id:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",type:"Vector"}],type:"Bool"},{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:301470424,method:"contacts.search",params:[{name:"q",type:"string"},{name:"limit",type:"int"}],type:"contacts.Found"},{id:-113456221,method:"contacts.resolveUsername",params:[{name:"username",type:"string"}],type:"contacts.ResolvedPeer"},{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:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],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:-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: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: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:469850889,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"}],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:1376532592,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:"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"}],type:"Updates"},{id:881978281,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:"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"}],type:"Updates"},{id:-637606386,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:"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"}],type:"Updates"},{id:-820669733,method:"messages.reportSpam",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:913498268,method:"messages.getPeerSettings",params:[{name:"peer",type:"InputPeer"}],type:"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: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:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{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:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{id:347716823,method:"messages.exportChatInvite",params:[{name:"flags",type:"#"},{name:"legacy_revoke_permanent",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"}],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:639215886,method:"messages.getStickerSet",params:[{name:"stickerset",type:"InputStickerSet"}],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:1468322785,method:"messages.getMessagesViews",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"increment",type:"Bool"}],type:"messages.MessageViews"},{id:-1470377534,method:"messages.editChatAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"is_admin",type:"Bool"}],type:"Bool"},{id:-1568189671,method:"messages.migrateChat",params:[{name:"chat_id",type:"long"}],type:"Updates"},{id:1271290010,method:"messages.searchGlobal",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:2016638777,method:"messages.reorderStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:864953444,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"int"},{name:"mime_type",type:"string"}],type:"Document"},{id:1559270965,method:"messages.getSavedGifs",params:[{name:"hash",type:"long"}],type:"messages.SavedGifs"},{id:846868683,method:"messages.saveGif",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:1364105629,method:"messages.getInlineBotResults",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"geo_point",type:"flags.0?InputGeoPoint"},{name:"query",type:"string"},{name:"offset",type:"string"}],type:"messages.BotResults"},{id:-346119674,method:"messages.setInlineBotResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"private",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"next_offset",type:"flags.2?string"},{name:"switch_pm",type:"flags.3?InlineBotSwitchPM"}],type:"Bool"},{id:570955184,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"}],type:"Updates"},{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:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1137057461,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"peer",type:"InputPeer"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:1782549861,method:"messages.getAllDrafts",params:[],type:"Updates"},{id:1685588756,method:"messages.getFeaturedStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:1527873830,method:"messages.readFeaturedStickers",params:[{name:"id",type:"Vector"}],type:"Bool"},{id:-1649852357,method:"messages.getRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"hash",type:"long"}],type:"messages.RecentStickers"},{id:958863608,method:"messages.saveRecentSticker",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-1986437075,method:"messages.clearRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"}],type:"Bool"},{id:1475442322,method:"messages.getArchivedStickers",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{id: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:-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: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:-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:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{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: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: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: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:-872345397,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:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"multi_media",type:"Vector"},{name:"schedule_date",type:"flags.10?int"}],type:"Updates"},{id:1347929239,method:"messages.uploadEncryptedFile",params:[{name:"peer",type:"InputEncryptedChat"},{name:"file",type:"InputEncryptedFile"}],type:"EncryptedFile"},{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:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{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:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{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: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:-2127811866,method:"messages.getStatsURL",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"params",type:"string"}],type:"StatsURL"},{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: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:1932455680,method:"messages.getSearchCounters",params:[{name:"peer",type:"InputPeer"},{name:"filters",type:"Vector"}],type:"Vector"},{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:-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:-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:-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:2127598753,method:"messages.getOldFeaturedStickers",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{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:-265962357,method:"messages.unpinAllMessages",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{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:48562110,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"}],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:654013065,method:"messages.getChatInviteImporters",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"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:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],type:"Updates"},{id:745510839,method:"messages.getMessageReadParticipants",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Vector"},{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: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: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:-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:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1319462148,method:"upload.getFile",params:[{name:"flags",type:"#"},{name:"precise",type:"flags.0?true"},{name:"cdn_supported",type:"flags.1?true"},{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.File"},{id:-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:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:536919235,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.CdnFile"},{id:-1691921240,method:"upload.reuploadCdnFile",params:[{name:"file_token",type:"bytes"},{name:"request_token",type:"bytes"}],type:"Vector"},{id:1302676017,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"}],type:"Vector"},{id:-956147407,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"}],type:"Vector"},{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:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",type:"string"}],type:"Updates"},{id:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{id:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],type:"Bool"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{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:-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:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{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:-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:-787622117,method:"channels.deleteUserHistory",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"}],type:"messages.AffectedHistory"},{id:-32999408,method:"channels.reportSpam",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{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:-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:-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:-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:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1355375294,method:"channels.deleteHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{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:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],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:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],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:-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:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",type:"Vector"}],type:"Bool"},{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:-1976353651,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"payments.PaymentForm"},{id:611897804,method:"payments.getPaymentReceipt",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"payments.PaymentReceipt"},{id:-619695760,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:818134173,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"requested_info_id",type:"flags.0?string"},{name:"shipping_option_id",type:"flags.1?string"},{name:"credentials",type:"InputPaymentCredentials"},{name:"tip_amount",type:"flags.2?long"}],type:"payments.PaymentResult"},{id: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:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{id:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?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:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{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: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:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{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:-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:-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:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{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:-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:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{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"}]},layer:133},Oe=new Uint8Array(256),qe=new Uint8Array(256),Ge=new Uint32Array(256),Ke=new Uint32Array(256),ze=new Uint32Array(256),He=new Uint32Array(256),je=new Uint32Array(256),We=new Uint32Array(256),Je=new Uint32Array(256),Ze=new Uint32Array(256);function Qe(e){if(e instanceof Uint32Array)return e;if("string"==typeof e){if(e.length%4!=0)for(var t=e.length%4;t<=4;t++)e+="\0x00";var a=new Uint32Array(e.length/4);for(t=0;t>7),r[i[m]^m]=m;for(;!Oe[p];p^=e||1)a=(a=o^o<<1^o<<2^o<<3^o<<4)>>8^255&a^99,Oe[p]=a,qe[a]=p,s=16843009*i[t=i[e=i[p]]]^65537*t^257*e^16843008*p,n=257*i[a]^16843008*a,Ge[p]=n=n<<24^n>>>8,Ke[p]=n=n<<24^n>>>8,ze[p]=n=n<<24^n>>>8,He[p]=n=n<<24^n>>>8,je[a]=s=s<<24^s>>>8,We[a]=s=s<<24^s>>>8,Je[a]=s=s<<24^s>>>8,Ze[a]=s=s<<24^s>>>8,o=r[o]||1}();var $e=function(){function e(e){var t=Qe(e);if(4!==t.length&&6!==t.length&&8!==t.length)throw new Error("Invalid key size");this.encKey=new Uint32Array(4*t.length+28),this.decKey=new Uint32Array(4*t.length+28),this.encKey.set(t);for(var a,n=1,s=t.length;s<4*t.length+28;s++)a=this.encKey[s-1],(s%t.length==0||8===t.length&&s%t.length==4)&&(a=Oe[a>>>24]<<24^Oe[a>>16&255]<<16^Oe[a>>8&255]<<8^Oe[255&a],s%t.length==0&&(a=a<<8^a>>>24^n<<24,n=n<<1^283*(n>>7))),this.encKey[s]=this.encKey[s-t.length]^a;for(var i=0;s;i++,s--)a=this.encKey[3&i?s:s-4],this.decKey[i]=s<=4||i<4?a:je[Oe[a>>>24]]^We[Oe[a>>16&255]]^Je[Oe[a>>8&255]]^Ze[Oe[255&a]]}return e.prototype.encrypt=function(e){for(var t,a,n,s=Qe(e),i=new Uint32Array(4),r=s[0]^this.encKey[0],p=s[1]^this.encKey[1],o=s[2]^this.encKey[2],m=s[3]^this.encKey[3],d=this.encKey.length/4-2,y=4,c=0;c>>24]^Ke[p>>16&255]^ze[o>>8&255]^He[255&m]^this.encKey[y],a=Ge[p>>>24]^Ke[o>>16&255]^ze[m>>8&255]^He[255&r]^this.encKey[y+1],n=Ge[o>>>24]^Ke[m>>16&255]^ze[r>>8&255]^He[255&p]^this.encKey[y+2],m=Ge[m>>>24]^Ke[r>>16&255]^ze[p>>8&255]^He[255&o]^this.encKey[y+3],r=t,p=a,o=n,y+=4;for(c=0;c<4;c++)i[c]=Oe[r>>>24]<<24^Oe[p>>16&255]<<16^Oe[o>>8&255]<<8^Oe[255&m]^this.encKey[y++],t=r,r=p,p=o,o=m,m=t;return i},e.prototype.decrypt=function(e){for(var t,a,n,s=Qe(e),i=new Uint32Array(4),r=s[0]^this.decKey[0],p=s[3]^this.decKey[1],o=s[2]^this.decKey[2],m=s[1]^this.decKey[3],d=this.decKey.length/4-2,y=4,c=0;c>>24]^We[p>>16&255]^Je[o>>8&255]^Ze[255&m]^this.decKey[y],a=je[p>>>24]^We[o>>16&255]^Je[m>>8&255]^Ze[255&r]^this.decKey[y+1],n=je[o>>>24]^We[m>>16&255]^Je[r>>8&255]^Ze[255&p]^this.decKey[y+2],m=je[m>>>24]^We[r>>16&255]^Je[p>>8&255]^Ze[255&o]^this.decKey[y+3],r=t,p=a,o=n,y+=4;for(c=0;c<4;c++)i[3&-c]=qe[r>>>24]<<24^qe[p>>16&255]<<16^qe[o>>8&255]<<8^qe[255&m]^this.decKey[y++],t=r,r=p,p=o,o=m,m=t;return i},e}(),Ye=function(){function e(e,t,a){void 0===a&&(a=16),this.key=Qe(e),this.iv=Qe(t),this.cipher=new $e(e),this.blockSize=a/4}return e.prototype.encrypt=function(e,t){for(var a=Qe(e),n=t||new Uint32Array(a.length),s=this.iv.subarray(this.blockSize,this.iv.length),i=this.iv.subarray(0,this.blockSize),r=new Uint32Array(this.blockSize),p=0;p=this.blockSize&&this.incrementCounter(),s&&(i-=s,s=0)}return this.offset=(this.offset+a.length%4)%4,n},e.prototype.decrypt=function(e,t){return this.encrypt(e,t)},e.prototype.incrementCounter=function(){for(var e=this.counter.length-1;e>=0&&!(++this.counter[e]<4294967295);e--);}}(),$e),tt=a(0),at=a.n(tt);const nt={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function st(e){const t=nt[e];return crypto.getRandomValues(t),t[0]}var it=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const rt="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;function pt(e){return rt.digest("SHA-1",p(e)).then(e=>new Uint8Array(e))}function ot(e){return rt.digest("SHA-256",p(e)).then(e=>new Uint8Array(e))}function mt(e,t,a){e=Le(e);return m(new Ye(d(t),d(a)).encrypt(d(e)))}function dt(e,t,a){return m(new Ye(d(t),d(a)).decrypt(d(e)))}function yt(e,t){const a=oe(t.modulus,16),i=oe(t.exponent,16);return s(ce($(oe(n(e),16),i,a),16))}function ct(e,t,a){return it(this,void 0,void 0,(function*(){const n=yield rt.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return rt.deriveBits({name:"PBKDF2",salt:t,iterations:a,hash:{name:"SHA-512"}},n,512).then(e=>new Uint8Array(e))}))}function lt(e){let t;try{t=function(e){var t,a,n,s,i,r,p=Math.ceil(64/M)+1,o=0,m=new Array(p),d=new Array(p),y=new Array(p),c=new Array(p),l=new Array(p),g=new Array(p),h=new Array(p);for(t=0;t<3;++t){for(a=17+(15&st(8)),ue(g,Q(pe(st(32),32,0),e)),ue(h,g),s=1<"boolFalse"===e.predicate).id,ft=+Ne.API.constructors.find(e=>"boolTrue"===e.predicate).id,_t=+Ne.API.constructors.find(e=>"vector"===e.predicate).id,vt=+Ne.MTProto.constructors.find(e=>"gzip_packed"===e.predicate).id;class bt{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(ft,(t||"")+":bool"):this.writeInt(ut,(t||"")+":bool")}storeLongP(e,t,a){this.writeInt(t,(a||"")+":long[low]"),this.writeInt(e,(a||"")+":long[high]")}storeLong(e,t){if(Array.isArray(e))return 2===e.length?this.storeLongP(e[0],e[1],t):this.storeIntBytes(e,64,t);"string"!=typeof e&&(e=e?e.toString():"0");const a=4294967296,n=oe(e,10,64),s=he(n),i=he(n);ie(n,oe(a.toString(16),16,64),s,i);const r=+ce(s,10);let p=+ce(i,10);r>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const n=a.length;n<=253?this.byteView[this.offset++]=n:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&n,this.byteView[this.offset++]=(65280&n)>>8,this.byteView[this.offset++]=(16711680&n)>>16);for(let e=0;e>>",n(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(">>>",n(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(">>>",n(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?Ne.MTProto:Ne.API).methods.find(t=>t.method===e);if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const n=t.pFlags||t,s={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),s=e[0].split(".");if(!(t[s[0]]&1<<+s[1])){if(!("true"===e[1]?n[i.name]:void 0!==t[i.name]))continue;t[s[0]]|=1<<+s[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,s[i.name]=r)}for(let e in s)this.intView[s[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(_t,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const n=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===s);if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+s+" found");s===t&&(i=!0),i||this.writeInt(r.id,a+"["+s+"][id]");const p=e.pFlags,o={};for(const t of r.params){let n=t.type;if(-1!==n.indexOf("?")){const a=n.split("?"),s=a[0].split(".");if(!(e[s[0]]&1<<+s[1])){if(!("true"===a[1]?p&&p[t.name]:void 0!==e[t.name]))continue;e[s[0]]|=1<<+s[1]}n=a[1]}const i=this.storeObject(e[t.name],n,a+"["+s+"]["+t.name+"]");"#"===n&&(e[t.name]=e[t.name]||0,o[t.name]=i)}for(let t in o)this.intView[o[t]]=e[t];return r.type}}class Pt{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),this.byteView.slice(this.offset-16,this.offset+16).hex),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),n=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),n[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]"),a=Fe(this.readInt((e||"")+":long[high]"),t);if(!this.mtproto){const e=+a;if(Number.isSafeInteger(e))return e}return a}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===ft||t!==ut&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,n="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView.subarray(this.offset,this.offset+e)),this.offset+=e,t}const s=new Array(e);for(let t=0;t0){const s=e.substr(7,e.length-8);for(let e=0;ee.type===t),!n)throw new Error("Constructor not found for type: "+e)}else{const i=this.readInt(t+"[id]");if(i===vt){const a=ht(this.fetchBytes(t+"[packed_string]"));return new Pt(a).fetchObject(e,t)}if(i===_t)return this.fetchVector(e,t);let r=a.constructorsIndex;if(!r){a.constructorsIndex=r={};for(let e=0,t=a.constructors.length;e1)&&wt.MSStream,!!("safari"in wt)||!(!St||!(/\b(iPad|iPhone|iPod)\b/.test(St)||St.match("Safari")&&!St.match("Chrome")))),kt=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i);var Ct;!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"}(Ct||(Ct={}));const At=[Ct.None,Ct.Error,Ct.Warn,Ct.Log,Ct.Debug],Mt=Date.now();function Et(){return"["+((Date.now()-Mt)/1e3).toFixed(3)+"]"}let Rt;const Vt=It||kt;Rt=Vt?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const Dt=!Vt,Ut=Vt?2:3;function Tt(){const e=(new Error).stack.split("\n"),t=e[Ut]||e[e.length-1];return"["+(Rt(t)||"")+"]"}const Bt={black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:""},xt=[["debug",Ct.Debug],["info",Ct.Log],["warn",Ct.Warn],["error",Ct.Error],["assert",Ct.Error],["trace",Ct.Log]];function Ft(e,t=Ct.Log|Ct.Warn|Ct.Error,a=!1,n=""){let s;g||a||(t=Ct.Error),Dt?n||(h?n=Bt.yellow:u&&(n=Bt.cyan)):n="";let i=n;n=n?`%s ${n}%s`:"%s";const r=function(...a){return t&Ct.Log&&console.log(n,Et(),e,Tt(),...a)};return xt.forEach(([a,s])=>{r[a]=function(...i){return t&s&&console[a](n,Et(),e,Tt(),...i)}}),r.setPrefix=function(t){s=t,e="["+t+"]"},r.setPrefix(e),r.setLevel=function(e){t=At.slice(0,e+1).reduce((e,t)=>e|t,0)},r.bindPrefix=function(e){return Ft(`${s}] [${e}`,t,a,i)},r}var Lt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};Ft("SRP",Ct.Error);function Nt(e,t,a){return Lt(this,void 0,void 0,(function*(){const i=a?t.new_algo:t.current_algo,m=oe(n(i.p),16),d=pe(i.g,32,256),y=oe(n(yield function(e,t,a){return Lt(this,void 0,void 0,(function*(){let n=yield Ot.invokeCrypto("sha256-hash",o(t,(new TextEncoder).encode(e),t));n=o(a,n,a),n=yield Ot.invokeCrypto("sha256-hash",n);let s=yield Ot.invokeCrypto("pbkdf2",new Uint8Array(n),t,1e5);return s=o(a,s,a),n=yield Ot.invokeCrypto("sha256-hash",s),n}))}(e,i.salt1,i.salt2)),16),c=function(e,t){return e instanceof Uint8Array||(e=p(e)),Le(e,t,!0,!0,!0)},l=$(d,y,m),g=e=>{const t=new Uint8Array(e.length);for(let a=0;a{const a=Y(t,e);return!(ae(a)||J(a)<1984||J(e)<1984||Math.floor((J(e)+7)/8)>256)},{a:P,a_for_hash:w,u:S}=yield(()=>Lt(this,void 0,void 0,(function*(){for(;;){const e=oe(n(g(t.secure_random)),16),a=$(d,e,m);if(b(a,m)){const t=s(ce(a,16)),n=oe((yield Ot.invokeCrypto("sha256-hash",o(t,_))).hex,16);if(!ye(n)&&!ae(n))return{a:e,a_for_hash:t,u:n}}}})))();let I;I=se(h,v)?h:ee(h,m),I=Q(Y(I,v),m);const k=$(I,ee(P,X(S,y)),m),C=yield Ot.invokeCrypto("sha256-hash",c(s(ce(k,16)),256));let A=yield Ot.invokeCrypto("sha256-hash",u);A=r(A,yield Ot.invokeCrypto("sha256-hash",f));const M=o(A,yield Ot.invokeCrypto("sha256-hash",i.salt1),yield Ot.invokeCrypto("sha256-hash",i.salt2),w,_,C),E=yield Ot.invokeCrypto("sha256-hash",M);return{_:"inputCheckPasswordSRP",srp_id:t.srp_id,A:new Uint8Array(w),M1:E}}))}var Ot=new class extends class{invokeCrypto(e,...t){return this.performTaskWorker(e,...t)}}{constructor(){super(),this.webWorker=!1,this.taskId=0,this.awaiting={},this.pending=[],this.debug=!1,console.log("CW constructor"),this.utils={"sha1-hash":pt,"sha256-hash":ot,pbkdf2:ct,"aes-encrypt":mt,"aes-decrypt":dt,"rsa-encrypt":yt,factorize:lt,"mod-pow":gt,gzipUncompress:ht,computeSRP:Nt}}performTaskWorker(e,...t){return this.debug&&console.log("CW start",e,t),Promise.resolve(this.utils[e](...t))}};const qt=new class{constructor(){this.lastMessageId=[0,0],this.timeOffset=0,A.get("server_time_offset").then(e=>{e&&(this.timeOffset=e)})}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|st(16)<<3|4];(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t;return Fe(t[0],t[1])}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),n=Math.abs(this.timeOffset-a)>10;A.set({server_time_offset:a}),this.lastMessageId=[0,0],this.timeOffset=a;return P({type:"applyServerTimeOffset",payload:a}),n}};l.timeManager=qt;var Gt=qt;const Kt={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.0.0",versionFull:"1.0.0 (36)",build:36,langPackVersion:"0.3.7",langPack:"macos",langPackCode:"en",domains:["web.telegram.org"],baseDcId:2,isMainDomain:"web.telegram.org"===location.hostname,suffix:"K"};Kt.isMainDomain&&(Kt.id=2496,Kt.hash="8da85b0d5bfe62527e5b244c209159c3");var zt=Kt;function Ht(){}var jt;!function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(jt||(jt={}));var Wt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};let Jt;class Zt{constructor(e,t,a,n,s,i={}){this.dcId=e,this.authKey=t,this.authKeyId=a,this.transport=s,this.lastServerMessages=[],this.sentMessages={},this.pendingMessages={},this.pendingAcks=[],this.pendingResends=[],this.connectionInited=!1,this.nextReq=0,this.seqNo=0,this.lastResendReq=null,this.isOnline=!1,this.status=jt.Closed,this.lastResponseTime=0,this.debug=g||y.debug,this.activeRequests=0,this.authKeyUint8=p(this.authKey),this.serverSalt=p(n),this.isFileUpload=!!i.fileUpload,this.isFileDownload=!!i.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload;const r=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+e+r,this.log=Ft(this.name,Ct.Log|Ct.Error|Ct.Warn,void 0),this.log("constructor"),this.updateSession(),this.transport.networker=this,this.transport.connected&&this.setConnectionStatus(jt.Connected)}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=new Uint8Array(8).randomize()}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&function(e,t){for(let a=e.length-1;a>=0;--a)t(e[a],a,e)}(t.inner,(e,a)=>{const n=this.updateSentMessage(e);n?t.inner[a]=n.msg_id:t.inner.splice(a,1)}),t.msg_id=Gt.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const n=new bt({mtproto:!0});n.storeMethod(e,t);const s=Gt.generateId(),i=this.generateSeqNo(),r={msg_id:s,seq_no:i,body:n.getBytes(!0)};return y.debug&&this.log("MT call",e,t,s,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new bt({mtproto:!0});a.storeObject(e,"Object");const n=Gt.generateId(),s=this.generateSeqNo(t.notContentRelated),i={msg_id:n,seq_no:s,body:a.getBytes(!0)};return y.debug&&this.log("MT message",e,n,s),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const n=new bt(a);if(!this.connectionInited){const e=Ne.API.methods.find(e=>"invokeWithLayer"===e.method);if(!e)throw new Error("no invokeWithLayer!");n.storeInt(+e.id,"invokeWithLayer"),n.storeInt(Ne.layer,"layer");const t=Ne.API.methods.find(e=>"initConnection"===e.method);if(!t)throw new Error("no initConnection!");n.storeInt(+t.id,"initConnection"),n.storeInt(0,"flags"),n.storeInt(zt.id,"api_id"),n.storeString(Xt.userAgent||"Unknown UserAgent","device_model"),n.storeString(navigator.platform||"Unknown Platform","system_version"),n.storeString(zt.version+(zt.isMainDomain?" "+zt.suffix:""),"app_version"),n.storeString(navigator.language||"en","system_lang_code"),n.storeString(zt.langPack,"lang_pack"),n.storeString(Xt.language,"lang_code")}if(a.afterMessageId){if(void 0===Jt){const e=Ne.API.methods.find(e=>"invokeAfterMsg"===e.method);Jt=e?+e.id:0}Jt?(n.storeInt(Jt,"invokeAfterMsg"),n.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=n.storeMethod(e,t);const s={msg_id:Gt.generateId(),seq_no:this.generateSeqNo(),body:n.getBytes(!0),isAPI:!0};return y.debug?this.log("Api call",e,s,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(s,a)}destroy(){this.transport.destroy()}forceReconnectTimeout(){this.transport.reconnect&&this.transport.reconnect()}forceReconnect(){this.transport.forceReconnect&&this.transport.forceReconnect()}pushMessage(e,t){const a=new Promise((a,n)=>{this.sentMessages[e.msg_id]=Object.assign(e,t,t.notContentRelated?void 0:{deferred:{resolve:a,reject:n}}),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),Be(t)&&(t.messageId=e.msg_id)});if(!t.notContentRelated&&!t.noResponse){const t=setTimeout(()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime<5e3||(this.log.error("timeout",e),this.isOnline&&this.setConnectionStatus(jt.TimedOut))},5e3);a.catch(Ht).finally(()=>{clearTimeout(t),this.setConnectionStatus(jt.Connected),--this.activeRequests,this.setDrainTimeout()}),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}return a}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=self.setTimeout(()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()},1e4))}setConnectionStatus(e,t){const a=e===jt.Connected,n=this.status!==e;this.isOnline=a,this.status=e,n&&(Xt.onConnectionStatusChange&&Xt.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())}pushResend(e,t=100){const a=t?Date.now()+t:0,n=this.sentMessages[e];if(n.container)for(const e of n.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;n.acked&&this.log.error("pushResend: acked message?",n),this.debug&&this.log.debug("pushResend:",e,n,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return Wt(this,void 0,void 0,(function*(){const a=t?0:8,n=o(this.authKeyUint8.subarray(88+a,88+a+32),e),s=yield Ot.invokeCrypto("sha256-hash",n);return new Uint8Array(s).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),s=new Uint8Array(52),i=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),i.push(Ot.invokeCrypto("sha256-hash",n)),s.set(this.authKeyUint8.subarray(40+a,40+a+36),0),s.set(e,36),i.push(Ot.invokeCrypto("sha256-hash",s)),Promise.all(i).then(e=>{const t=new Uint8Array(32),a=new Uint8Array(32),n=new Uint8Array(e[0]),s=new Uint8Array(e[1]);return t.set(n.subarray(0,8)),t.set(s.subarray(8,24),8),t.set(n.subarray(24,32),24),a.set(s.subarray(0,8)),a.set(n.subarray(8,24),8),a.set(s.subarray(24,32),24),[t,a]})}isStopped(){return Xt.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})}if(this.pendingResends.length){const e=this.pendingResends.slice(),t={noSchedule:!0,notContentRelated:!0,messageId:""};this.wrapMtpMessage({_:"msg_resend_req",msg_ids:e},t),this.lastResendReq={req_msg_id:t.messageId,resend_msg_ids:e}}let e;const t=[];let a=0,n=!1;const s=Object.keys(this.pendingMessages).map(e=>oe(e,10)).sort((e,t)=>ge(e,t)).map(e=>ce(e,10));for(const i of s){const s=this.sentMessages[i];if(s&&s.body){const i=s.body.length+32;if(a+i>655360&&(this.log.warn("lengthOverflow",s,t),n=!0,e))break;t.push(s),a+=i,e=s}delete this.pendingMessages[i]}if(!t.length)return;if(t.length>1){const n=this.generateContainerMessage(a,t);e=n.messageWithBody,this.sentMessages[e.msg_id]=n.message}else this.sentMessages[e.msg_id]=e;this.pendingAcks=[];this.sendEncryptedRequest(e);this.cleanupSent(),n&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new bt({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const n=[];t.forEach((e,t)=>{n.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")});const s={msg_id:Gt.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:n};return y.debug&&this.log.warn("Container",n,s.msg_id,s.seq_no),{message:s,messageWithBody:Object.assign({body:a.getBytes(!0)},s)}}getEncryptedMessage(e){return Wt(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield Ot.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then(e=>Ot.invokeCrypto("aes-decrypt",t,e[0],e[1]))}getEncryptedOutput(e){const t=new bt({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(),n=16-t.getOffset()%16+16*(1+st(8)%5),s=o(a,new Uint8Array(n).randomize());return this.getEncryptedMessage(s).then(e=>{const t=new bt({startMaxLength:e.bytes.length+256});t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data");return t.getBytes(!0)})}sendEncryptedRequest(e){return this.getEncryptedOutput(e).then(t=>{this.debug&&this.log.debug("sendEncryptedRequest: launching message into space:",e,[e.msg_id].concat(e.inner||[]));return this.transport.send(t)})}parseResponse(e){this.lastResponseTime=Date.now();const t=new Pt(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!i(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+a.hex);const s=t.fetchIntBytes(128,!0,"msg_key"),r=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(s,r).then(e=>this.getMsgKey(e,!1).then(t=>{if(!i(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new Pt(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const r=a.fetchIntBytes(64,!0,"session_id"),p=a.fetchLong("message_id");if(!(i(r,this.sessionId)||this.prevSessionId&&i(r,this.prevSessionId)))throw this.log.warn("Sessions",r,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+n(r));const o=a.fetchInt("seq_no"),m=e.byteLength,d=a.fetchInt("message_data[length]");let y=a.getOffset();if(d%4||d>m-y)throw new Error("[MT] Invalid body length: "+d);const c=a.fetchRawBytes(d,!0,"message_data");y=a.getOffset();const l=m-y;if(l<12||l>1024)throw new Error("[MT] Invalid padding length: "+l);a=new Pt(c,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const n=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==n+e.bytes&&a.setOffset(n+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const n=this.sentMessages[e.req_msg_id],s=n&&n.resultType||"Object";e.req_msg_id&&!n||(e.result=a.fetchObject(s,t+"[result]"))}}});return{response:a.fetchObject("","INPUT"),messageId:p,sessionId:r,seqNo:o}}))}applyServerSalt(e){const t=Le(new Uint8Array(le(oe(e,10),!1)),8,!0,!1,!1);A.set({["dc"+this.dcId+"_server_salt"]:n(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){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.performScheduledRequest()};this.nextReq=t,e?this.nextReqTimeout=self.setTimeout(a,e):a()}ackMessage(e){this.pendingAcks.push(e),this.scheduleRequest()}reqResendMessage(e){this.debug&&this.log.debug("Req resend",e),this.pendingResends.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;return Object.keys(this.sentMessages).forEach(t=>{const a=this.sentMessages[t];if(a.notContentRelated&&void 0===this.pendingMessages[t])delete this.sentMessages[t];else if(a.container){for(const t of a.inner)if(void 0!==this.sentMessages[t])return void(e=!0);delete this.sentMessages[t]}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(){for(const e in this.sentMessages){const t=this.sentMessages[e];(t.body||t.container)&&this.pushResend(e)}}processMessage(e,t,a){if("messageEmpty"===e._)return void this.log.warn("processMessage: messageEmpty",e,t);if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(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=oe(t,10);ve(a,32);const n=Gt.applyServerTime(+ce(a,10));(17===e.error_code||n)&&(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),A.get("dc").then(t=>{t===this.dcId&&!this.isFileNetworker&&Xt.updatesProcessor&&Xt.updatesProcessor(e)});break;case"msgs_ack":for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResendMessage(e.answer_msg_id);break;case"msgs_state_info":if(this.ackMessage(e.answer_msg_id),this.lastResendReq&&this.lastResendReq.req_msg_id===e.req_msg_id&&this.pendingResends.length)for(const e of this.lastResendReq.resend_msg_ids){const t=this.pendingResends.indexOf(e);-1!==t&&this.pendingResends.splice(t,1)}break;case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,n=this.sentMessages[a];if(this.processMessageAck(a),n){const t=n.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),n.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":if(this.transport.networker){const t=e.msg_id,a=this.sentMessages[t];a&&(a.deferred.resolve(e),delete this.sentMessages[t])}break;default:this.ackMessage(t),null!==Xt.updatesProcessor&&Xt.updatesProcessor(e)}}}const Qt=new class{constructor(){this.networkers=[],this.language=navigator.language||zt.langPackCode,this.updatesProcessor=null,this.onConnectionStatusChange=null,this.akStopped=!1,this.userAgent=navigator.userAgent}removeNetworker(e){const t=this.networkers.indexOf(e);-1!==t&&this.networkers.splice(t,1)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,n,s,i){const r=new Zt(e,t,a,n,s,i);return this.networkers.push(r),r}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)}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}};l&&(l.networkerFactory=Qt);var Xt=Qt;class $t{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,a){var n,s;(null!==(n=this.listeners[e])&&void 0!==n?n:this.listeners[e]=[]).push({callback:t,options:a}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(s=a)||void 0===s?void 0:s.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,a){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}dispatchEvent(e,...t){this.reuseResults&&(this.listenerResults[e]=t);const a=[],n=this.listeners[e];if(n){n.slice().forEach(s=>{var i;-1!==n.findIndex(e=>e.callback===s.callback)&&(a.push(s.callback(...t)),(null===(i=s.options)||void 0===i?void 0:i.once)&&this.removeEventListener(e,s.callback))})}return a}cleanup(){this.listeners={},this.listenerResults={}}}class Yt extends $t{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.debug=y.debug&&!1,this.handleOpen=()=>{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=e=>{this.log.error("handleError",e),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=e=>{this.debug&&this.log.debug("<-","handleMessage",e.data.byteLength),this.dispatchEvent("message",e.data)},this.send=e=>{this.debug&&this.log.debug("-> body length to send:",e.length),this.ws.send(e)};let n=Ct.Error|Ct.Log;return this.debug&&(n|=Ct.Debug),this.log=Ft("WS-"+e+a,n),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(e){}this.handleClose()}}}class ea{constructor(e){this._counter=e}increment(){for(let e=15;e>=0;e--){if(255!==this._counter[e]){this._counter[e]++;break}this._counter[e]=0}}}class ta{constructor(e,t){this._remainingCounter=null,this._remainingCounterIndex=16,this._counter=new ea(t),this._aes=new et(e)}update(e){const t=e.slice();for(let e=0;e{this.connected=!0;const e=this.obfuscation.init(this.codec);if(this.connection.send(e),this.networker)this.pending.length=0,this.networker.setConnectionStatus(jt.Connected),this.networker.cleanupSent(),this.networker.resend();else for(const e of this.pending)e.encoded&&e.body&&(e.encoded=this.encodeBody(e.body));setTimeout(()=>{this.releasePending()},0)},this.onMessage=e=>{let t=this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then(e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}}).catch(e=>{this.log.error("handleMessage networker parseResponse error",e)});const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",t.hex)},this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),n=a-this.lastCloseTime;e=!isNaN(n)&&n{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(jt.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=Ct.Error|Ct.Log;this.debug&&(i|=Ct.Debug),this.log=Ft("TCP-"+t+n,i),this.log("constructor"),this.connect()}clear(){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()}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",()=>{e.removeEventListener("message",this.onMessage)},{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=this.connected?this.encodeBody(e):void 0;if(!this.networker){const a=new Promise((a,n)=>{this.pending.push({resolve:a,reject:n,body:e,encoded:t})});return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){if(!this.connected)return;let e=this.pending.length;for(let t=0;t body length to send:",n.length),i||(i=a.encoded=this.encodeBody(n)),this.connection.send(i),a.resolve?a.bodySent=!0:(this.pending.splice(t--,1),e--))}}}let ia=0;class ra extends $t{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.id=++ia,pa.set(this.id,this);const n={type:"socketProxy",payload:{type:"setup",payload:{dcId:e,url:t,logSuffix:a},id:this.id}};w(n)}send(e){const t={type:"socketProxy",payload:{type:"send",payload:e,id:this.id}};w(t)}close(){const e={type:"socketProxy",payload:{type:"close",id:this.id}};w(e)}}const pa=new Map,oa=y.test?"_test":"";class ma{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=y.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const n="apiws"+oa,s=`wss://${zt.suffix.toLowerCase()}ws${e}${a}.web.telegram.org/${n}`;return new sa(It&&u&&void 0!==ra?ra:Yt,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)}}chooseServer(e,t="client",a="websocket",n=!0){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const s=this.chosenServers[a][t];e in s||(s[e]=[]);const i=s[e];if(!i.length||!n){let a;const s="client"===t?"":"-1";return a=this.transportSocket(e,t,s),a?(n&&i.push(a),a):(console.error("No chosenServer!",e),null)}return i[0]}static removeTransport(e,t){for(const a in e)for(const n in e[a])for(const s in e[a][n]){const i=e[a][n][s],r=i.indexOf(t);-1!==r&&i.splice(r,1)}}}var da=new ma,ya=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var ca=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,y.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 bt;t.storeBytes(s(e.modulus),"n"),t.storeBytes(s(e.exponent),"e");const a=t.getBuffer();return Ot.invokeCrypto("sha1-hash",a).then(t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[n(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}})})).then(()=>{this.prepared=!0,this.preparePromise=null})}select(e){return ya(this,void 0,void 0,(function*(){yield this.prepare();for(let t=0;t{if(g&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw p;try{const t=new Pt(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const n=t.fetchLong("msg_id");"0"===n&&this.log.error("msg_id === 0",n);const s=t.fetchInt("msg_len");return s||this.log.error("no msg_len",s),t}catch(e){this.log.error("mtpSendPlainRequest: deserialization went bad",e);throw Object.assign(p,{originalError:e})}},e=>{throw e.message||e.type||(e=Object.assign(p,{originalError:e})),e})}sendReqPQ(e){return la(this,void 0,void 0,(function*(){const t=new bt({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),g&&this.log("Send req_pq",e.nonce.hex);try{const n=this.sendPlainRequest(e.dcId,t.getBytes(!0));ca.prepare(),a=yield n}catch(e){throw this.log.error("req_pq error",e.message),e}const s=a.fetchObject("ResPQ");if("resPQ"!==s._)throw new Error("[MT] resPQ response invalid: "+s._);if(!i(e.nonce,s.nonce))throw this.log.error(e.nonce,s.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=s.server_nonce,e.pq=s.pq,e.fingerprints=s.server_public_key_fingerprints,g&&this.log("Got ResPQ",n(e.serverNonce),n(e.pq),e.fingerprints);const r=yield ca.select(e.fingerprints);if(!r)throw new Error("[MT] No public key found");e.publicKey=r,g&&this.log("PQ factorization start",e.pq);try{var p=yield Ot.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=p[0],e.q=p[1],g&&this.log("PQ factorization done",p),this.sendReqDhParams(e)}))}sendReqDhParams(e){return la(this,void 0,void 0,(function*(){e.newNonce=new Uint8Array(32).randomize();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 bt({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const s=a.getBytes(!0);if(s.length>144)throw"DH_params: data is more than 144 bytes!";const p=Le(s,192,!1,!0,!1),o=p.slice().reverse(),m=yield(()=>la(this,void 0,void 0,(function*(){for(;;){const t=new Uint8Array(32).randomize(),a=o.concat(yield Ot.invokeCrypto("sha256-hash",t.concat(p)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const s=yield Ot.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),i=r(t,yield Ot.invokeCrypto("sha256-hash",s)).concat(s);if(-1===ge(oe(n(i),16),oe(e.publicKey.modulus,16)))return i}})))(),d=Le(yield Ot.invokeCrypto("rsa-encrypt",m,e.publicKey),256,!0,!0,!0),y={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:d},c=new bt({mtproto:!0});c.storeMethod("req_DH_params",y);const l=c.getBytes(!0);let h;g&&this.log("Send req_DH_params",y);try{h=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const u=h.fetchObject("Server_DH_Params","RESPONSE");if(g&&this.log("Sent req_DH_params, response:",u),"server_DH_params_fail"!==u._&&"server_DH_params_ok"!==u._)throw new Error("[MT] Server_DH_Params response invalid: "+u._);if(!i(e.nonce,u.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!i(e.serverNonce,u.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===u._){if(!i((yield Ot.invokeCrypto("sha1-hash",e.newNonce)).slice(-16),u.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,u.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return la(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield Ot.invokeCrypto("sha1-hash",e.newNonce.concat(e.serverNonce))).concat((yield Ot.invokeCrypto("sha1-hash",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield Ot.invokeCrypto("sha1-hash",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield Ot.invokeCrypto("sha1-hash",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield Ot.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),s=a.slice(20),r=new Pt(s,{mtproto:!0}),p=r.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==p._)throw new Error("[MT] server_DH_inner_data response invalid: "+p);if(!i(e.nonce,p.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!i(e.serverNonce,p.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");g&&this.log("Done decrypting answer"),e.g=p.g,e.dhPrime=p.dh_prime,e.gA=p.g_a,e.serverTime=p.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const o=r.getOffset();if(!i(n,yield Ot.invokeCrypto("sha1-hash",s.slice(0,o))))throw new Error("[MT] server_DH_inner_data SHA1-hash mismatch");Gt.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){g&&this.log("Verifying DH params",e,t,a);const s=n(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");g&&this.log("dhPrime cmp OK");const i=oe(n(a),16),r=oe(s,16);if(ge(i,U)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(ge(i,Y(r,U))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");g&&this.log("1 < gA < dhPrime-1 OK");const p=function(e,t){let a=he(e);t-=1;for(let n=0;n=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return g&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return la(this,void 0,void 0,(function*(){const t=s(e.g.toString(16));e.b=new Uint8Array(256).randomize();try{var a=yield Ot.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new bt({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 p=(yield Ot.invokeCrypto("sha1-hash",n.getBuffer())).concat(n.getBytes(!0)),o=yield Ot.invokeCrypto("aes-encrypt",p,e.tmpAesKey,e.tmpAesIv),m=new bt({mtproto:!0});let d;m.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:o}),g&&this.log("Send set_client_DH_params");try{d=yield this.sendPlainRequest(e.dcId,m.getBytes(!0))}catch(e){throw e}const y=d.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==y._&&"dh_gen_retry"!==y._&&"dh_gen_fail"!==y._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+y._);if(!i(e.nonce,y.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!i(e.serverNonce,y.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var c=yield Ot.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw c}const l=yield Ot.invokeCrypto("sha1-hash",c),h=l.slice(0,8),u=l.slice(-8);switch(g&&this.log("Got Set_client_DH_params_answer",y._,c),y._){case"dh_gen_ok":{const t=(yield Ot.invokeCrypto("sha1-hash",e.newNonce.concat([1],h))).slice(-16);if(!i(t,y.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,y),new Error("new_nonce_hash1 mismatch");const a=r(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return g&&this.log("Auth successfull!",u,c,a),e.authKeyId=u,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":if(!i((yield Ot.invokeCrypto("sha1-hash",e.newNonce.concat([2],h))).slice(-16),y.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e);case"dh_gen_fail":if(!i((yield Ot.invokeCrypto("sha1-hash",e.newNonce.concat([3],h))).slice(-16),y.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")}}))}auth(e){return la(this,void 0,void 0,(function*(){if(e in this.cached)return this.cached[e];const t=new Uint8Array(16).randomize();if(!da.chooseServer(e))throw new Error("[MT] No server found for dc "+e);const a={dcId:e,nonce:t,localTry:1};try{const t=this.sendReqPQ(a);return this.cached[e]=t,yield t}catch(t){if(a.localTry<=3)return this.sendReqPQ({dcId:a.dcId,nonce:new Uint8Array(16).randomize(),localTry:a.localTry+1});throw delete this.cached[e],t}}))}};function ha(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((a,n)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,a(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,n(...e))}});return t.catch(Ht).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}function ua(e,t){return new Promise(a=>{const n=new FileReader;n.addEventListener("loadend",e=>a(e.target.result)),n[t](e)})}function fa(e){return ua(e,"readAsArrayBuffer")}function _a(e,t=""){let a;const n=function(e){if(-1===["image/jpeg","image/png","image/gif","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e))return"application/octet-stream";return e}(t);try{a=new Blob(e,{type:n})}catch(t){let s=new BlobBuilder;e.forEach(e=>{s.append(e)}),a=s.getBlob(n)}return a}class va{constructor(e,t){this.storageIsAvailable=!0,function(e,t){if(t)for(let a in t)void 0!==t[a]&&(e[a]=t[a])}(this,e),y.test&&(this.name+="_test"),this.storeName=t,this.log=Ft("IDB-"+this.storeName),this.openDatabase(!0),va.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let a=!1;return setTimeout(()=>{a||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,n)=>{t.onsuccess=s=>{a=!0;const i=t.result;let r=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},i.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{a=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},t.onupgradeneeded=e=>{a=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var a;const n=e.createObjectStore(t.name);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const e of t.indexes)n.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",a=>e.map((e,n)=>a.put(t[n],e)),"")}saveFile(e,t){return t instanceof Blob||(t=_a([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,a,n=this.storeName){let s;return a&&(s=performance.now(),this.log(a+": start")),this.openDatabase().then(i=>new Promise((r,p)=>{const o=i.transaction([n],e);o.onerror=e=>{clearTimeout(m),p(o.error)},o.oncomplete=e=>{clearTimeout(m),a&&this.log(a+": end",performance.now()-s);const t=c.map(e=>e.result);r(y?t:t[0])};const m=setTimeout(()=>{this.log.error("transaction not finished",o)},1e4),d=t(o.objectStore(n)),y=Array.isArray(d),c=y?d:[].concat(d)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}va.STORAGES=[];var ba=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const Pa=new class{constructor(){this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.log=Ft("API"),this.afterMessageTempIds={}}getBaseDcId(){return ba(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield A.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(zt.baseDcId)),this.baseDcId}))}setUserAuth(e){return ba(this,void 0,void 0,(function*(){if(!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}A.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then(e=>{this.setOnDrainIfNeeded(e)}),this.baseDcId=e,A.set({dc:this.baseDcId})}logOut(){return ba(this,void 0,void 0,(function*(){const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map(e=>A.get(e))),a=[];for(let e=0;e{this.baseDcId=void 0,va.closeDatabases(),self.postMessage({type:"clear"})};return setTimeout(n,1e3),Promise.all(a).catch(e=>{e.handled=!0}).finally(n)}))}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",i="websocket";this.cachedNetworkers.hasOwnProperty(i)||(this.cachedNetworkers[i]={client:{},download:{},upload:{}});const r=this.cachedNetworkers[i][a];e in r||(r[e]=[]);const p=r[e],o="client"===a||"https"===i?1:3;if(p.length>=o){let e=p.length-1,t=!1;for(;e>=0;--e)if(p[e].isOnline){t=!0;break}const a=t?p.splice(e,1)[0]:p.pop();return p.unshift(a),Promise.resolve(a)}const m=[e,i,a].join("-");if(this.gettingNetworkers[m])return this.gettingNetworkers[m];const d=`dc${e}_auth_key`,y=`dc${e}_server_salt`;return this.gettingNetworkers[m]=Promise.all([d,y].map(e=>A.get(e))).then(([r,o])=>ba(this,void 0,void 0,(function*(){const c=da.chooseServer(e,a,i,"client"===a);let l;if(r&&512===r.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=s(r),n=(yield Ot.invokeCrypto("sha1-hash",a)).slice(-8),i=s(o);l=Xt.getNetworker(e,a,n,i,c,t)}else try{const a=yield ga.auth(e),s={[d]:n(a.authKey),[y]:n(a.serverSalt)};A.set(s),l=Xt.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,c,t)}catch(e){throw this.log("Get networker error",e,e.stack),delete this.gettingNetworkers[m],e}return delete this.gettingNetworkers[m],p.unshift(l),this.setOnDrainIfNeeded(l),l})))}setOnDrainIfNeeded(e){if(e.onDrain)return;(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then(t=>e.dcId!==t)).then(t=>{e.onDrain||t&&(e.onDrain=()=>{this.log("networker drain",e.dcId),e.onDrain=void 0,e.destroy(),Xt.removeNetworker(e),ma.removeTransport(this.cachedNetworkers,e),ma.removeTransport(da.chosenServers,e.transport)},e.setDrainTimeout())})}invokeApi(e,t={},a={}){const n=ha();let{afterMessageId:s,prepareTempMessageId:i}=a;if(i&&n.then(()=>{delete this.afterMessageTempIds[i]}),l){const s=Date.now(),i=wt.setInterval(()=>{o&&o.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-s)/1e3)},5e3);n.catch(Ht).finally(()=>{clearInterval(i)})}const r=t=>{t?Be(t)||(t={message:t}):t={type:"ERROR_EMPTY"},n.reject(t),(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors||(406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=m||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout(()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)},100)))};let p,o,m=(new Error).stack||"empty stack";const d=m=>{if(s){const e=this.afterMessageTempIds[s];e&&(a.afterMessageId=e.messageId)}const y=(o=m).wrapApiCall(e,t,a);return i&&(this.afterMessageTempIds[i]={messageId:a.messageId,promise:n}),y.then(n.resolve,i=>{if("FILE_REFERENCE_EXPIRED"!==i.type&&this.log.error("Error",i.code,i.type,this.baseDcId,p,e,t),401===i.code&&this.baseDcId===p)"SESSION_PASSWORD_NEEDED"!==i.type&&(A.delete("dc"),A.delete("user_auth")),r(i);else if(401===i.code&&this.baseDcId&&p!==this.baseDcId){if(void 0===this.cachedExportPromise[p]){const e=new Promise((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:p},{noErrorBox:!0}).then(a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:p,noErrorBox:!0}).then(e,t)},t)});this.cachedExportPromise[p]=e}this.cachedExportPromise[p].then(()=>{this.invokeApi(e,t,a).then(n.resolve,r)},r)}else if(303===i.code){const s=+i.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];s!==p&&(a.dcId?a.dcId=s:this.setBaseDcId(s),this.getNetworker(s,a).then(s=>{s.wrapApiCall(e,t,a).then(n.resolve,r)},r))}else if(400===i.code&&0===i.type.indexOf("FILE_MIGRATE")){const s=+i.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];s!==p?this.getNetworker(s,a).then(s=>{s.wrapApiCall(e,t,a).then(n.resolve,r)},r):r(i)}else if(a.rawError||420!==i.code)if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(i.type)){const e=this.afterMessageTempIds[s];s=void 0,delete a.afterMessageId,e?e.promise.then(()=>d(o)):d(o)}else if(a.rawError||500!==i.code)"UNKNOWN"===i.type?setTimeout(()=>{d(o)},1e3):r(i);else{const e=Date.now();if(a.stopTime&&e>=a.stopTime)return r(i);a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,setTimeout(()=>{d(o)},1e3*a.waitTime)}else{const e=+i.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(void 0!==a.floodMaxTimeout?a.floodMaxTimeout:60)&&!a.prepareTempMessageId)return r(i);setTimeout(()=>{d(o)},1e3*e)}})};return(p=a.dcId||this.baseDcId)?this.getNetworker(p,a).then(d,r):this.getBaseDcId().then(e=>{this.getNetworker(p=e,a).then(d,r)}),n}};l.apiManager=Pa;var wa=Pa;var Sa=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var Ia=new class{constructor(){this.blobSupported=!0;try{_a([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?(a=t,fa(a).then(e=>new Uint8Array(e))).then(t=>e.write(t)):e.write(t);var a}getFakeFileWriter(e,t){const a=[];return{write:e=>Sa(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;a.push(e)})),truncate:()=>{a.length=0},finalize:(n=!0)=>{const s=_a(a,e);return n&&t&&t(s),s}}}},ka=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};class Ca{constructor(e){this.dbName=e,this.useStorage=!0,y.test&&(this.dbName+="_test"),Ca.STORAGES.length&&(this.useStorage=Ca.STORAGES[0].useStorage),this.openDatabase(),Ca.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation(t=>t.delete("/"+e))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation(t=>t.match("/"+e))}save(e,t){return this.timeoutOperation(a=>a.put("/"+e,t))}getFile(e,t="blob"){return this.get(e).then(e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()})}saveFile(e,t){t instanceof Blob||(t=_a(t));const a=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,a).then(()=>t)}timeoutOperation(e){return this.useStorage?new Promise((t,a)=>ka(this,void 0,void 0,(function*(){let n=!1;const s=setTimeout(()=>{a(),n=!0},15e3);try{const a=yield this.openDatabase();if(!a)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield e(a);if(n)return;t(s)}catch(e){a(e)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const a=Ia.getFakeFileWriter(t,t=>this.saveFile(e,t).catch(()=>t));return Promise.resolve(a)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>{if(t.useStorage=e,!e)return t.deleteAll()}))}}Ca.STORAGES=[];var Aa=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const Ma=new class{constructor(){this.cacheStorage=new Ca("cachedFiles"),this.cachedDownloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.webpConvertPromises={},this.refreshReferencePromises={},this.log=Ft("AFM",Ct.Error|Ct.Log),this.tempId=0,this.queueId=0,this.debug=y.debug,this.uncompressTGS=(e,t)=>Ot.invokeCrypto("gzipUncompress",e.slice().buffer,!0),this.convertWebp=(e,t)=>{const a=ha();return P({type:"convertWebp",payload:{fileName:t,bytes:e}}),this.webpConvertPromises[t]=a},setInterval(()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}},18e5)}downloadRequest(e,t,a,n,s=0){void 0===this.downloadPulls[e]&&(this.downloadPulls[e]=[],this.downloadActives[e]=0);const i=this.downloadPulls[e],r=new Promise((e,r)=>{i.push({id:t,queueId:s,cb:a,deferred:{resolve:e,reject:r},activeDelta:n})});return setTimeout(()=>{this.downloadCheck(e)},0),r}downloadCheck(e){const t=this.downloadPulls[e],a="upload"===e?24:36;if(this.downloadActives[e]>=a||!t||!t.length)return!1;const n=t.findAndSplice(e=>0===e.queueId)||t.findAndSplice(e=>e.queueId===this.queueId)||t.shift(),s=n.activeDelta||1;this.downloadActives[e]+=s,n.cb().then(t=>{this.downloadActives[e]-=s,this.downloadCheck(e),n.deferred.resolve(t)},t=>{t&&t.type&&("DOWNLOAD_CANCELED"===t.type||"UPLOAD_CANCELED"===t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=s,this.downloadCheck(e),n.deferred.reject(t)})}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=(this.cachedDownloadPromises[e]?[this.cachedDownloadPromises[e]]:void 0)||(this.uploadPromises[e]?Array.from(this.uploadPromises[e]):[]);let a=!1;for(let e=0,n=t.length;eAa(this,void 0,void 0,(function*(){return r&&r(),wa.invokeApi("upload.getWebFile",{location:t,offset:a,limit:n},{dcId:e,fileDownload:!0})})),this.getDelta(n),i)}requestFilePart(e,t,a,s,i=0,r=0,p){return this.downloadRequest(e,i,()=>Aa(this,void 0,void 0,(function*(){p&&p();const i=()=>Aa(this,void 0,void 0,(function*(){p&&p();return wa.invokeApi("upload.getFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0}).catch(e=>{if("FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t).then(i);throw e})})),r=t.file_reference;if(r&&!t.checkedReference){t.checkedReference=!0;const e=n(r);if(this.refreshReferencePromises[e])return this.refreshReference(t).then(i)}return i()})),this.getDelta(s),r)}getDelta(e){return e/1024/128}getLimitPart(e){let t;return t=512,524288}refreshReference(e){const t=e.file_reference,a=n(t);let s=this.refreshReferencePromises[a];if(!s){const n=ha();s=this.refreshReferencePromises[a]={deferred:n,timeout:wt.setTimeout(()=>{this.log.error("Didn't refresh the reference:",e),n.reject("REFERENCE_IS_NOT_REFRESHED")},6e4)},n.catch(Ht).finally(()=>{clearTimeout(s.timeout)});P({type:"refreshReference",payload:t})}return s.deferred.then(t=>{if(a===n(t))throw"REFERENCE_IS_NOT_REFRESHED";e.file_reference=t})}downloadFile(e){var t;if(!Ia.isAvailable())return Promise.reject({type:"BROWSER_BLOB_NOT_SUPPORTED"});const a=null!==(t=e.size)&&void 0!==t?t:0,{dcId:n,location:s}=e;let i;"image/webp"!==e.mimeType||Da()?"application/x-tgsticker"===e.mimeType&&(i=this.uncompressTGS,e.mimeType="application/json"):(i=this.convertWebp,e.mimeType="image/png");const r=function(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),n=""}return n+(a?"."+a:a)}(s,e.fileName),p=this.cachedDownloadPromises[r],o=this.getFileStorage();if(this.debug&&this.log("downloadFile",r,a,s,e.mimeType),p)return a?p.then(t=>t.sizethis.downloadFile(e)).catch(()=>this.downloadFile(e))):t):p;const m=ha(),d=e.mimeType||"image/jpeg";let y,c,l=!1,g=e=>{y=e,delete this.cachedDownloadPromises[r],m.reject(y),g=()=>{},!c||y&&"DOWNLOAD_CANCELED"===y.type||c.truncate()};const h=this.tempId++;o.getFile(r).then(e=>Aa(this,void 0,void 0,(function*(){if(e.size{o.getFileWriter(r,d).then(t=>{c=t;const p=e.limitPart||this.getLimitPart(a);let o,d,y=Promise.resolve();const f=(e,t)=>Aa(this,void 0,void 0,(function*(){if(i){return yield i(e,r)}return e})),_="inputWebFileLocation"===s._?this.requestWebFilePart.bind(this):this.requestFilePart.bind(this),v=[];o=0;do{d=ha(),v.push({offset:o,writeFilePromise:y,writeFileDeferred:d}),y=d,o+=p}while(oAa(this,void 0,void 0,(function*(){const{offset:i,writeFilePromise:o,writeFileDeferred:d}=v.shift();try{u();const y=yield _(n,s,i,p,h,e.queueId,u),c=y.bytes;v.length&&P(),this.debug&&this.log("downloadFile requestFilePart result:",r,y);const g=i+p>=a||!c.byteLength;if(c.byteLength){b+=c.byteLength,m.notify({done:b,offset:i,total:a});const e=yield f(c);u(),yield o,u(),yield Ia.write(t,e)}d.resolve(),g&&(l=!0,m.resolve(t.finalize(a<2e7)))}catch(e){g(e)}}));for(let e=0,t=Math.min(1/0,v.length);e{["STORAGE_OFFLINE"].includes(e)||this.log.error("saveFile error:",e)})});const u=()=>{if(y)throw y};return m.cancel=()=>{if(!y&&!l){const e=new Error("Canceled");e.type="DOWNLOAD_CANCELED",g(e)}},m.notify=e=>{w({progress:Object.assign({fileName:r},e)})},this.cachedDownloadPromises[r]=m,m.safeFinally(()=>{delete this.cachedDownloadPromises[r]}),m}deleteFile(e){return delete this.cachedDownloadPromises[e],this.getFileStorage().delete(e)}uploadFile({file:e,fileName:t}){var a;const n=e.size,s=n>=10485760;let i=!1,r=!1,p=0,o=262144;n>67108864?o=524288:n<102400&&(o=32768);const m=this.getDelta(o),d=Math.ceil(n/o),y=""+st(32)+st(32)%16777215;let c=0;const l={_:s?"inputFileBig":"inputFile",id:y,parts:d,name:t,md5_checksum:""},g={notify:e=>{}},h=new Promise((e,t)=>{if(d>4e3)return t({type:"FILE_TOO_BIG"});g.resolve=e,g.reject=t});if(Object.assign(h,g),d>4e3)return h;let u=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),h.reject(e),i=!0,u=()=>{}};const f=s?"upload.saveBigFilePart":"upload.saveFilePart",_=this.tempId++,v=this;const b=function*(){for(let t=0;tfa(e.slice(t,t+o)).then(e=>{if(i)throw{type:"UPLOAD_CANCELED"};return v.debug&&v.log("Upload file part, isBig:",s,a,e.byteLength,new Uint8Array(e).length,new Uint8Array(e).slice().length),wa.invokeApi(f,{file_id:y,file_part:a,file_total_parts:d,bytes:e},{fileUpload:!0}).then(e=>{p++,h.notify({done:p*o,total:n}),p>=d&&(h.resolve(l),r=!0)},u)}),m).catch(u)}}(),P=()=>{if(i)return;const e=b.next();e.done||i||e.value.then(P)};for(let e=0,t=Math.min(1/0,d);e{i||r||(i=!0,u({type:"UPLOAD_CANCELED"}))},h.notify=e=>{w({progress:Object.assign({fileName:t},e)})},h.finally(()=>{S.delete(h),S.size||delete this.uploadPromises[t]});const S=null!==(a=this.uploadPromises[t])&&void 0!==a?a:this.uploadPromises[t]=new Set;return S.add(h),h}};l.apiFileManager=Ma;var Ea=Ma,Ra=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};let Va=!1;const Da=()=>Va;Xt.setUpdatesProcessor(e=>{w({update:e})}),Xt.onConnectionStatusChange=e=>{w({type:"connectionStatusChange",payload:e})};const Ua={convertWebp:e=>{const{fileName:t,bytes:a}=e.payload,n=Ea.webpConvertPromises[t];n&&(n.resolve(a),delete Ea.webpConvertPromises[t])},webpSupport:e=>{Va=e.payload},socketProxy:e=>{const t=e.payload,a=t.id,n=pa.get(a);"message"===t.type?n.dispatchEvent("message",t.payload):"open"===t.type?n.dispatchEvent("open"):"close"===t.type&&(n.dispatchEvent("close"),pa.delete(a))},localStorageProxy:e=>{A.finishTask(e.id,e.payload)},userAgent:e=>{Xt.userAgent=e.payload},online:()=>{Xt.forceReconnectTimeout()},forceReconnect:()=>{Xt.forceReconnect()},toggleStorage:e=>{const t=e.payload;Ca.toggleStorage(t)},refreshReference:e=>{const t=n(e.originalPayload),a=Ea.refreshReferencePromises[t],s=null==a?void 0:a.deferred;s&&(e.error?s.reject(e.error):s.resolve(e.payload))}};wt.addEventListener("message",e=>Ra(void 0,void 0,void 0,(function*(){try{const t=e.data,a=t.taskId,n=Ua[t.type];if(n)return void n(t);if(!t.task)return;switch(t.task){case"computeSRP":case"gzipUncompress":return Ot.invokeCrypto(t.task,...t.args).then(e=>{w({taskId:a,result:e})});case"requestFilePart":case"setQueueId":case"cancelDownload":case"uploadFile":case"downloadFile":try{let e=Ea[t.task].apply(Ea,t.args);e instanceof Promise&&(e=yield e),w({taskId:a,result:e})}catch(e){w({taskId:a,error:e})}break;case"getNetworker":wa[t.task].apply(wa,t.args).finally(()=>{w({taskId:a,result:null})});break;case"setLanguage":case"startAll":case"stopAll":Xt[t.task].apply(Xt,t.args);break;default:try{let e=wa[t.task].apply(wa,t.args);e instanceof Promise&&(e=yield e),w({taskId:a,result:e})}catch(e){w({taskId:a,error:e})}}}catch(e){console.error("worker task error:",e)}}))),w("ready")}]); +//# sourceMappingURL=mtproto.worker.fd3e71e917088f6f049f.bundle.worker.js.map \ No newline at end of file diff --git a/public/mtproto.worker.fd3e71e917088f6f049f.bundle.worker.js.map b/public/mtproto.worker.fd3e71e917088f6f049f.bundle.worker.js.map new file mode 100644 index 000000000..095e3085b --- /dev/null +++ b/public/mtproto.worker.fd3e71e917088f6f049f.bundle.worker.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/pako/dist/pako_inflate.min.js","webpack:///./src/helpers/bytes.ts","webpack:///./src/lib/polyfill.ts","webpack:///./src/config/modes.ts","webpack:///./src/config/debug.ts","webpack:///./src/helpers/context.ts","webpack:///./src/lib/localStorage.ts","webpack:///./src/lib/sessionStorage.ts","webpack:///./src/vendor/leemon.ts","webpack:///./src/lib/mtproto/bin_utils.ts","webpack:///./src/lib/mtproto/schema.ts","webpack:///./node_modules/@cryptography/aes/dist/es/aes.js","webpack:///./src/helpers/random.ts","webpack:///./src/lib/crypto/crypto_utils.ts","webpack:///./src/lib/mtproto/tl_utils.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/environment/userAgent.ts","webpack:///./src/lib/logger.ts","webpack:///./src/lib/crypto/srp.ts","webpack:///./src/lib/crypto/cryptoworker.ts","webpack:///./src/lib/crypto/crypto_methods.ts","webpack:///./src/lib/mtproto/timeManager.ts","webpack:///./src/config/app.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/lib/mtproto/connectionStatus.ts","webpack:///./src/lib/mtproto/networker.ts","webpack:///./src/helpers/array.ts","webpack:///./src/lib/mtproto/networkerFactory.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/lib/mtproto/transports/websocket.ts","webpack:///./src/lib/mtproto/transports/obfuscation.ts","webpack:///./src/lib/mtproto/transports/intermediate.ts","webpack:///./src/lib/mtproto/transports/tcpObfuscated.ts","webpack:///./src/lib/mtproto/transports/socketProxied.ts","webpack:///./src/lib/mtproto/dcConfigurator.ts","webpack:///./src/lib/mtproto/rsaKeysManager.ts","webpack:///./src/lib/mtproto/authorizer.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/helpers/blob.ts","webpack:///./src/lib/idb.ts","webpack:///./src/helpers/object.ts","webpack:///./src/lib/mtproto/apiManager.ts","webpack:///./src/lib/filemanager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/lib/mtproto/apiFileManager.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/lib/mtproto/mtproto.worker.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","e","a","Uint32Array","f","h","u","w","b","k","_","g","v","y","x","E","R","A","state","next_in","input","avail_in","next_out","output","avail_out","dmax","wsize","whave","wnext","window","hold","bits","lencode","distcode","lenbits","distbits","msg","sane","Uint16Array","Uint8Array","Z","S","O","U","T","D","I","B","N","C","z","F","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","this","last","wrap","havedict","flags","check","total","head","wbits","length","offset","extra","ncode","nlen","ndist","have","next","lens","work","lendyn","distdyn","back","was","total_in","total_out","adler","Int32Array","set","subarray","L","M","H","j","K","P","Y","G","X","W","done","text","time","xflags","os","extra_len","String","fromCharCode","comment","hcrc","data_type","apply","Array","2","1","0","toString","q","J","Q","V","$","ee","te","ie","ne","options","slice","arguments","shift","TypeError","chunkSize","windowBits","to","raw","err","ended","chunks","strm","Error","header","dictionary","charCodeAt","ae","push","result","onEnd","onData","join","re","se","oe","le","de","fe","Inflate","inflate","inflateRaw","ungzip","constants","default","bytesToHex","bytes","arr","bytesFromHex","hexString","len","Math","ceil","start","parseInt","charAt","substr","bytesCmp","bytes1","bytes2","bytesXor","convertToUint8Array","TextEncoder","encode","bufferConcats","args","reduce","acc","byteLength","tmp","lastLength","forEach","ArrayBuffer","bytesFromWordss","bytesToWordss","words","str","configurable","randomize","crypto","getRandomValues","concat","toJSON","findAndSplice","verify","index","findIndex","splice","undefined","toHHMMSS","leadZero","sec_num","hours","floor","minutes","seconds","Promise","finally","fn","onFinally","callback","resolve","then","reason","reject","safeFinally","catch","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","DEBUG","MOUNT_CLASS_TO","self","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","listeners","listener","postMessage","notifyWorker","noop","notifySomeone","notifyAll","prefix","cache","useStorage","useCache","localStorage","getItem","JSON","parse","obj","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","keys","delete","enabled","clear","taskId","tasks","STORAGES","storage","id","payload","proxy","sessionStorage","appStorage","radix","bpe","mask","digitsStr","one","int2bigInt","s0","s3","s4","s5","s6","s7","sa","eg_u","eg_A","eg_B","eg_C","eg_D","bitSize","expand","ans","copy_","mod","dup","mod_","trim","mult","copyInt_","linCombShift_","mult_","powMod","powMod_","sub","sub_","add","add_","eGCD_","max","halve_","greater","equalsInt","negative","multInt_","leftShift_","greaterShift","kx","ky","divide_","y1","y2","subShift_","addShift_","rightShift_","modInt","minSize","buff","str2bigInt","base","kk","substring","addInt_","equals","isZero","bigInt2str","divInt_","bigInt2bytes","littleEndian","out","reverse","cmp","ys","multMod_","squareMod_","k1","k2","kn","np","inverseModInt","mont_","ui","ks","isObject","intToUint","val","longFromInts","high","low","bigInt","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","needPadding","padding","buffer","Si","T1","T2","T3","T4","T5","T6","T7","T8","getWords","buf","pos","xor","left","right","x2","x4","tEnc","tDec","xInv","computeTables","AES","_key","encKey","decKey","rcon","encrypt","_message","a2","b2","c2","message","rounds","decrypt","AES_IGE","iv","cipher","cipherText","prevX","prevY","yXOR","counter","incrementCounter","carry","arrays","8","16","32","nextRandomUint","array","subtle","sha1HashSync","digest","sha256HashSync","aesEncryptSync","keyBytes","ivBytes","aesDecryptSync","rsaEncrypt","publicKey","modulus","exponent","hash_pbkdf2","salt","iterations","importKey","deriveBits","hash","pqPrimeFactorization","pqBytes","what","lim","minLen","it","pqPrimeLeemon","console","error","bytesModPow","xBigInt","yBigInt","mBigInt","gzipUncompress","boolFalse","API","constructors","find","predicate","boolTrue","vector","gzipPacked","MTProto","maxLength","mtproto","startMaxLength","createBuffer","intView","byteView","resultBuffer","resultInt32","getArray","typed","resultArray","needBytes","previousBuffer","previousArray","field","log","checkLength","writeInt","iHigh","iLow","sLong","isArray","storeLongP","storeIntBytes","Float64Array","sUTF8","unescape","encodeURIComponent","methodName","params","methodData","methods","method","storeInt","pFlags","flagsOffsets","param","condType","split","fieldBit","storeObject","paramName","storeLong","storeString","storeBytes","storeDouble","storeBool","itemType","toLowerCase","schema","isBare","constructorData","override","hex","readInt","doubleView","longDec","num","Number","isSafeInteger","fetchObject","decodeURIComponent","escape","fetchInt","fetchLong","fetchIntBytes","fetchString","fetchBytes","fetchDouble","fetchBool","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","TLDeserialization","TLSerialization","USER_AGENT","navigator","userAgent","IS_SAFARI","vendor","platform","maxTouchPoints","MSStream","match","IS_FIREFOX","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","_logTimer","Date","now","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","splitted","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","black","red","green","yellow","blue","magenta","cyan","white","logger","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","computeSRP","password","isNew","algo","new_algo","current_algo","client_salt","server_salt","invokeCrypto","makePasswordHash","salt1","salt2","padArray","flipper","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","a_for_hash","secure_random","generate_and_check_random","g_b","h1","M1","srp_id","performTaskWorker","super","webWorker","awaiting","pending","utils","task","timeManager","lastMessageId","timeOffset","timeTicks","messageId","serverTime","localTime","newTimeOffset","changed","abs","server_time_offset","App","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","hostname","suffix","ConnectionStatus","invokeAfterMsgConstructor","dcId","authKey","authKeyId","serverSalt","transport","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResends","connectionInited","nextReq","seqNo","lastResendReq","isOnline","status","Closed","lastResponseTime","activeRequests","authKeyUint8","isFileUpload","fileUpload","isFileDownload","fileDownload","isFileNetworker","updateSession","networker","connected","setConnectionStatus","Connected","prevSessionId","sessionId","sentMessageId","sentMessage","container","forEachReverse","inner","innerSentMessageId","idx","innerSentMessage","updateSentMessage","msg_id","generateId","seq_no","generateSeqNo","notContentRelated","serializer","storeMethod","body","getBytes","pushMessage","invokeWithLayer","layer","initConnection","language","afterMessageId","resultType","isAPI","destroy","reconnect","forceReconnect","promise","assign","deferred","noSchedule","scheduleRequest","noResponse","timeout","setTimeout","TimedOut","clearTimeout","setDrainTimeout","onDrainTimeout","onDrain","retryAt","willChange","onConnectionStatusChange","delay","innerMsgId","acked","dataWithPadding","isOut","msgKeyLargePlain","msgKeyLarge","msgKey","sha2aText","sha2bText","promises","results","aesKey","aesIv","sha2a","sha2b","akStopped","isStopped","ackMsgIds","wrapMtpMessage","msg_ids","resendMsgIds","resendOpts","req_msg_id","resend_msg_ids","outMessage","messages","messagesByteLen","lengthOverflow","map","long","sort","messageByteLength","warn","generateContainerMessage","messageWithBody","sendEncryptedRequest","cleanupSent","innerMessages","storeRawBytes","getMsgKey","keyIv","getAesKeyIv","encryptedData","data","dataBuffer","getBuffer","paddingLength","getOffset","getEncryptedMessage","encryptedResult","request","getEncryptedOutput","requestData","send","responseBuffer","deserializer","fetchRawBytes","getDecryptedMessage","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","setOffset","mt_rpc_result","response","newServerSalt","nextReqTimeout","cb","performScheduledRequest","msgId","notEmpty","rawError","matches","error_message","error_code","code","description","originalError","pushResend","innerMessage","processMessage","applyServerSalt","new_server_salt","bad_msg_id","ackMessage","changedOffset","applyServerTime","badMessage","processMessageAck","first_msg_id","updatesProcessor","answer_msg_id","reqResendMessage","badMsgId","processError","networkerFactory","networkers","stoppedNetworkers","filter","langCode","forceReconnectTimeout","EventListenerBase","reuseResults","_constructor","listenerResults","once","pop","addEventListener","removeEventListener","url","logSuffix","handleOpen","dispatchEvent","handleError","close","handleClose","removeListeners","handleMessage","event","ws","logTypes","connect","WebSocket","binaryType","Counter","initialValue","_counter","_remainingCounter","_remainingCounterIndex","_aes","encrypted","increment","Obfuscation","codec","initPayload","val2","reversedPayload","encIv","decIv","encNew","decNew","obfuscateTag","update","tag","Connection","retryTimeout","intermediate","obfuscation","autoReconnect","onOpen","init","connection","resend","encoded","encodeBody","releasePending","onMessage","decode","readPacket","parseResponse","onClose","needTimeout","lastCloseTime","isNaN","reconnectTimeout","Connecting","bodySent","setAutoReconnect","enable","toEncode","encodePacket","socketId","socketsProxied","Map","TEST_SUFFIX","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","connectionType","path","chosenServer","transportType","reuse","client","download","upload","servers","transports","testPublicKeysHex","publisKeysHex","publicKeysParsed","prepared","preparePromise","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","prepare","fingerprintHex","fill","foundKey","fingerprint","cached","requestArray","requestLength","headerArray","dcConfigurator","chooseServer","baseError","errorCode","auth_key_id","msg_len","auth","nonce","sendPlainRequest","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","select","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","dc","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","_gABigInt","_dhPrimeBigInt","_twoPow","pow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","new_nonce_hash2","new_nonce_hash3","localTry","sendReqPQ","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","lastNotify","addNotifyListener","cancel","readBlobAs","blob","reader","FileReader","target","readBlobAsArrayBuffer","blobConstruct","blobParts","mimeType","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","db","storeName","storageIsAvailable","fromObject","safeAssign","openDatabase","preserve","onclose","createNew","openDbPromise","indexedDB","open","finished","onerror","onsuccess","calledNew","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","store","objectStoreNames","contains","createObjectStore","indexes","createIndex","indexName","keyPath","objectParameters","entryName","getObjectStore","objectStore","put","fileName","save","perf","performance","oncomplete","requests","getAll","apiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","afterMessageTempIds","setBaseDcId","userAuth","dcID","getBaseDcId","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","storageKeys","storageResult","logoutPromises","invokeApi","ignoreErrors","closeDatabases","handled","maxNetworkers","found","unshift","getKey","ak","ss","authKeyHex","serverSaltHex","authorizer","storeObj","canRelease","removeNetworker","removeTransport","prepareTempMessageId","startTime","interval","setInterval","cachedNetworker","clearInterval","rejectPromise","logOut","noErrorBox","performRequest","after","wrapApiCall","exportResolve","exportReject","dc_id","exportedAuth","newDcId","includes","stopTime","waitTime","min","floodMaxTimeout","blobSupported","fileWriter","write","saveFileCallback","part","truncate","finalize","saveToStorage","dbName","caches","timeoutOperation","Response","headers","size","rejected","res","fakeWriter","getFakeFileWriter","saveFile","deleteAll","apiFileManager","cacheStorage","cachedDownloadPromises","uploadPromises","downloadPulls","downloadActives","webpConvertPromises","refreshReferencePromises","tempId","queueId","uncompressTGS","convertWebp","convertPromise","activeDelta","downloadPull","downloadCheck","downloadLimit","from","canceled","limit","checkCancel","downloadRequest","getDelta","invoke","refreshReference","reference","file_reference","checkedReference","inputFileLocation","isAvailable","process","isWebpSupported","ext","thumb_size","Boolean","photo_id","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","getFileNameByLocation","cachedPromise","fileStorage","getFileStorage","deleteFile","downloadFile","cacheFileWriter","resolved","errorHandler","_error","getFile","getFileWriter","limitPart","getLimitPart","writeFileDeferred","writeFilePromise","processDownloaded","requestWebFilePart","requestFilePart","delayed","superpuper","isFinal","processedResult","Infinity","progress","file","fileSize","isBigFile","doneParts","partSize","totalParts","fileId","_part","resultInputFile","parts","md5_checksum","details","file_id","file_part","file_total_parts","generator","Set","webpSupported","setUpdatesProcessor","taskListeners","webpSupport","socketProxy","socketTask","socketProxied","localStorageProxy","finishTask","online","toggleStorage","originalPayload"],"mappings":"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","file":"mtproto.worker.fd3e71e917088f6f049f.bundle.worker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","/*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=\"undefined\"!=typeof globalThis?globalThis:e||self).pako={})}(this,(function(e){\"use strict\";var t=(e,t,i,n)=>{let a=65535&e|0,r=e>>>16&65535|0,s=0;for(;0!==i;){s=i>2e3?2e3:i,i-=s;do{a=a+t[n++]|0,r=r+a|0}while(--s);a%=65521,r%=65521}return a|r<<16|0};const i=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());var n=(e,t,n,a)=>{const r=i,s=a+n;e^=-1;for(let i=a;i>>8^r[255&(e^t[i])];return-1^e};var a=function(e,t){let i,n,a,r,s,o,l,d,f,h,c,u,w,b,k,m,_,g,v,p,y,x,E,R;const A=e.state;i=e.next_in,E=e.input,n=i+(e.avail_in-5),a=e.next_out,R=e.output,r=a-(t-e.avail_out),s=a+(e.avail_out-257),o=A.dmax,l=A.wsize,d=A.whave,f=A.wnext,h=A.window,c=A.hold,u=A.bits,w=A.lencode,b=A.distcode,k=(1<>>24,c>>>=g,u-=g,g=_>>>16&255,0===g)R[a++]=65535&_;else{if(!(16&g)){if(0==(64&g)){_=w[(65535&_)+(c&(1<>>=g,u-=g),u<15&&(c+=E[i++]<>>24,c>>>=g,u-=g,g=_>>>16&255,!(16&g)){if(0==(64&g)){_=b[(65535&_)+(c&(1<o){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(c>>>=g,u-=g,g=a-r,p>g){if(g=p-g,g>d&&A.sane){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(y=0,x=h,0===f){if(y+=l-g,g2;)R[a++]=x[y++],R[a++]=x[y++],R[a++]=x[y++],v-=3;v&&(R[a++]=x[y++],v>1&&(R[a++]=x[y++]))}else{y=a-p;do{R[a++]=R[y++],R[a++]=R[y++],R[a++]=R[y++],v-=3}while(v>2);v&&(R[a++]=R[y++],v>1&&(R[a++]=R[y++]))}break}}break}}while(i>3,i-=v,u-=v<<3,c&=(1<{const u=c.bits;let w,b,k,m,_,g,v=0,p=0,y=0,x=0,E=0,R=0,A=0,Z=0,S=0,O=0,U=null,T=0;const D=new Uint16Array(16),I=new Uint16Array(16);let B,N,C,z=null,F=0;for(v=0;v<=r;v++)D[v]=0;for(p=0;p=1&&0===D[x];x--);if(E>x&&(E=x),0===x)return a[f++]=20971520,a[f++]=20971520,c.bits=1,0;for(y=1;y0&&(0===e||1!==x))return-1;for(I[1]=0,v=1;v852||2===e&&S>592)return 1;for(;;){B=v-A,h[p]g?(N=z[F+h[p]],C=U[T+h[p]]):(N=96,C=0),w=1<>A)+b]=B<<24|N<<16|C|0}while(0!==b);for(w=1<>=1;if(0!==w?(O&=w-1,O+=w):O=0,p++,0==--D[v]){if(v===x)break;v=t[i+h[p]]}if(v>E&&(O&m)!==k){for(0===A&&(A=E),_+=y,R=v-A,Z=1<852||2===e&&S>592)return 1;k=O&m,a[k]=E<<24|R<<16|_-f|0}}return 0!==O&&(a[_+O]=v-A<<24|64<<16|0),c.bits=E,0},h={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:c,Z_BLOCK:u,Z_TREES:w,Z_OK:b,Z_STREAM_END:k,Z_NEED_DICT:m,Z_STREAM_ERROR:_,Z_DATA_ERROR:g,Z_MEM_ERROR:v,Z_BUF_ERROR:p,Z_DEFLATED:y}=h,x=12,E=30,R=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function A(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Z=e=>{if(!e||!e.state)return _;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,b},S=e=>{if(!e||!e.state)return _;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,Z(e)},O=(e,t)=>{let i;if(!e||!e.state)return _;const n=e.state;return t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?_:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,S(e))},U=(e,t)=>{if(!e)return _;const i=new A;e.state=i,i.window=null;const n=O(e,t);return n!==b&&(e.state=null),n};let T,D,I=!0;const B=e=>{if(I){T=new Int32Array(512),D=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(f(1,e.lens,0,288,T,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;f(2,e.lens,0,32,D,0,e.work,{bits:5}),I=!1}e.lencode=T,e.lenbits=9,e.distcode=D,e.distbits=5},N=(e,t,i,n)=>{let a;const r=e.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(t.subarray(i-r.wsize,i),0),r.wnext=0,r.whave=r.wsize):(a=r.wsize-r.wnext,a>n&&(a=n),r.window.set(t.subarray(i-n,i-n+a),r.wnext),(n-=a)?(r.window.set(t.subarray(i-n,i),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whaveU(e,15),inflateInit2:U,inflate:(e,i)=>{let r,s,o,l,d,h,A,Z,S,O,U,T,D,I,C,z,F,L,M,H,j,K,P=0;const Y=new Uint8Array(4);let G,X;const W=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return _;r=e.state,r.mode===x&&(r.mode=13),d=e.next_out,o=e.output,A=e.avail_out,l=e.next_in,s=e.input,h=e.avail_in,Z=r.hold,S=r.bits,O=h,U=A,K=b;e:for(;;)switch(r.mode){case 1:if(0===r.wrap){r.mode=13;break}for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,r.check=n(r.check,Y,2,0),Z=0,S=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&Z)<<8)+(Z>>8))%31){e.msg=\"incorrect header check\",r.mode=E;break}if((15&Z)!==y){e.msg=\"unknown compression method\",r.mode=E;break}if(Z>>>=4,S-=4,j=8+(15&Z),0===r.wbits)r.wbits=j;else if(j>r.wbits){e.msg=\"invalid window size\",r.mode=E;break}r.dmax=1<>8&1),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=3;case 3:for(;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,Y[2]=Z>>>16&255,Y[3]=Z>>>24&255,r.check=n(r.check,Y,4,0)),Z=0,S=0,r.mode=4;case 4:for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>8),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=5;case 5:if(1024&r.flags){for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(T=r.length,T>h&&(T=h),T&&(r.head&&(j=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Uint8Array(r.head.extra_len)),r.head.extra.set(s.subarray(l,l+T),j)),512&r.flags&&(r.check=n(r.check,s,T,l)),h-=T,l+=T,r.length-=T),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===h)break e;T=0;do{j=s[l+T++],r.head&&j&&r.length<65536&&(r.head.name+=String.fromCharCode(j))}while(j&&T>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=x;break;case 10:for(;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>=7&S,S-=7&S,r.mode=27;break}for(;S<3;){if(0===h)break e;h--,Z+=s[l++]<>>=1,S-=1,3&Z){case 0:r.mode=14;break;case 1:if(B(r),r.mode=20,i===w){Z>>>=2,S-=2;break e}break;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=E}Z>>>=2,S-=2;break;case 14:for(Z>>>=7&S,S-=7&S;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=E;break}if(r.length=65535&Z,Z=0,S=0,r.mode=15,i===w)break e;case 15:r.mode=16;case 16:if(T=r.length,T){if(T>h&&(T=h),T>A&&(T=A),0===T)break e;o.set(s.subarray(l,l+T),d),h-=T,l+=T,A-=T,d+=T,r.length-=T;break}r.mode=x;break;case 17:for(;S<14;){if(0===h)break e;h--,Z+=s[l++]<>>=5,S-=5,r.ndist=1+(31&Z),Z>>>=5,S-=5,r.ncode=4+(15&Z),Z>>>=4,S-=4,r.nlen>286||r.ndist>30){e.msg=\"too many length or distance symbols\",r.mode=E;break}r.have=0,r.mode=18;case 18:for(;r.have>>=3,S-=3}for(;r.have<19;)r.lens[W[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,G={bits:r.lenbits},K=f(0,r.lens,0,19,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid code lengths set\",r.mode=E;break}r.have=0,r.mode=19;case 19:for(;r.have>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=C,S-=C,r.lens[r.have++]=F;else{if(16===F){for(X=C+2;S>>=C,S-=C,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=E;break}j=r.lens[r.have-1],T=3+(3&Z),Z>>>=2,S-=2}else if(17===F){for(X=C+3;S>>=C,S-=C,j=0,T=3+(7&Z),Z>>>=3,S-=3}else{for(X=C+7;S>>=C,S-=C,j=0,T=11+(127&Z),Z>>>=7,S-=7}if(r.have+T>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=E;break}for(;T--;)r.lens[r.have++]=j}}if(r.mode===E)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=E;break}if(r.lenbits=9,G={bits:r.lenbits},K=f(1,r.lens,0,r.nlen,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid literal/lengths set\",r.mode=E;break}if(r.distbits=6,r.distcode=r.distdyn,G={bits:r.distbits},K=f(2,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,G),r.distbits=G.bits,K){e.msg=\"invalid distances set\",r.mode=E;break}if(r.mode=20,i===w)break e;case 20:r.mode=21;case 21:if(h>=6&&A>=258){e.next_out=d,e.avail_out=A,e.next_in=l,e.avail_in=h,r.hold=Z,r.bits=S,a(e,U),d=e.next_out,o=e.output,A=e.avail_out,l=e.next_in,s=e.input,h=e.avail_in,Z=r.hold,S=r.bits,r.mode===x&&(r.back=-1);break}for(r.back=0;P=r.lencode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,r.length=F,0===z){r.mode=26;break}if(32&z){r.back=-1,r.mode=x;break}if(64&z){e.msg=\"invalid literal/length code\",r.mode=E;break}r.extra=15&z,r.mode=22;case 22:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;P=r.distcode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,64&z){e.msg=\"invalid distance code\",r.mode=E;break}r.offset=F,r.extra=15&z,r.mode=24;case 24:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=E;break}r.mode=25;case 25:if(0===A)break e;if(T=U-A,r.offset>T){if(T=r.offset-T,T>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=E;break}T>r.wnext?(T-=r.wnext,D=r.wsize-T):D=r.wnext-T,T>r.length&&(T=r.length),I=r.window}else I=o,D=d-r.offset,T=r.length;T>A&&(T=A),A-=T,r.length-=T;do{o[d++]=I[D++]}while(--T);0===r.length&&(r.mode=21);break;case 26:if(0===A)break e;o[d++]=r.length,A--,r.mode=21;break;case 27:if(r.wrap){for(;S<32;){if(0===h)break e;h--,Z|=s[l++]<{if(!e||!e.state)return _;let t=e.state;return t.window&&(t.window=null),e.state=null,b},inflateGetHeader:(e,t)=>{if(!e||!e.state)return _;const i=e.state;return 0==(2&i.wrap)?_:(i.head=t,t.done=!1,b)},inflateSetDictionary:(e,i)=>{const n=i.length;let a,r,s;return e&&e.state?(a=e.state,0!==a.wrap&&11!==a.mode?_:11===a.mode&&(r=1,r=t(r,i,n,0),r!==a.check)?g:(s=N(e,i,n,n),s?(a.mode=31,v):(a.havedict=1,b))):_},inflateInfo:\"pako inflate (from Nodeca project)\"};const z=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var F=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const i=t.shift();if(i){if(\"object\"!=typeof i)throw new TypeError(i+\"must be non-object\");for(const t in i)z(i,t)&&(e[t]=i[t])}}return e},L=e=>{let t=0;for(let i=0,n=e.length;i=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;H[254]=H[254]=1;var j=e=>{let t,i,n,a,r,s=e.length,o=0;for(a=0;a>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},K=(e,t)=>{let i,n;const a=t||e.length,r=new Array(2*a);for(n=0,i=0;i4)r[n++]=65533,i+=s-1;else{for(t&=2===s?31:3===s?15:7;s>1&&i1?r[n++]=65533:t<65536?r[n++]=t:(t-=65536,r[n++]=55296|t>>10&1023,r[n++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&M)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let i=\"\";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let i=t-1;for(;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+H[e[i]]>t?i:t},Y={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"};var G=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0};var X=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1};const W=Object.prototype.toString,{Z_NO_FLUSH:q,Z_FINISH:J,Z_OK:Q,Z_STREAM_END:V,Z_NEED_DICT:$,Z_STREAM_ERROR:ee,Z_DATA_ERROR:te,Z_MEM_ERROR:ie}=h;function ne(e){this.options=F({chunkSize:65536,windowBits:15,to:\"\"},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new G,this.strm.avail_out=0;let i=C.inflateInit2(this.strm,t.windowBits);if(i!==Q)throw new Error(Y[i]);if(this.header=new X,C.inflateGetHeader(this.strm,this.header),t.dictionary&&(\"string\"==typeof t.dictionary?t.dictionary=j(t.dictionary):\"[object ArrayBuffer]\"===W.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=C.inflateSetDictionary(this.strm,t.dictionary),i!==Q)))throw new Error(Y[i])}function ae(e,t){const i=new ne(t);if(i.push(e),i.err)throw i.msg||Y[i.err];return i.result}ne.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize,a=this.options.dictionary;let r,s,o;if(this.ended)return!1;for(s=t===~~t?t:!0===t?J:q,\"[object ArrayBuffer]\"===W.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;;){for(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),r=C.inflate(i,s),r===$&&a&&(r=C.inflateSetDictionary(i,a),r===Q?r=C.inflate(i,s):r===te&&(r=$));i.avail_in>0&&r===V&&i.state.wrap>0&&0!==e[i.next_in];)C.inflateReset(i),r=C.inflate(i,s);switch(r){case ee:case te:case $:case ie:return this.onEnd(r),this.ended=!0,!1}if(o=i.avail_out,i.next_out&&(0===i.avail_out||r===V))if(\"string\"===this.options.to){let e=P(i.output,i.next_out),t=i.next_out-e,a=K(i.output,e);i.next_out=t,i.avail_out=n-t,t&&i.output.set(i.output.subarray(e,e+t),0),this.onData(a)}else this.onData(i.output.length===i.next_out?i.output:i.output.subarray(0,i.next_out));if(r!==Q||0!==o){if(r===V)return r=C.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,!0;if(0===i.avail_in)break}}return!0},ne.prototype.onData=function(e){this.chunks.push(e)},ne.prototype.onEnd=function(e){e===Q&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=L(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var re=ne,se=ae,oe=function(e,t){return(t=t||{}).raw=!0,ae(e,t)},le=ae,de=h,fe={Inflate:re,inflate:se,inflateRaw:oe,ungzip:le,constants:de};e.Inflate=re,e.constants=de,e.default=fe,e.inflate=se,e.inflateRaw=oe,e.ungzip=le,Object.defineProperty(e,\"__esModule\",{value:!0})}));\n","/*\r\n * https://github.com/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 function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[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 { bytesToHex, bytesFromHex, bufferConcats } from '../helpers/bytes';\n\nObject.defineProperty(Uint8Array.prototype, 'hex', {\n get: function(): string {\n return bytesToHex(this);\n },\n \n set: function(str: string) {\n this.set(bytesFromHex(str));\n },\n enumerable: true,\n configurable: true\n});\n\nUint8Array.prototype.randomize = function() {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(this);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return this;\n};\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\nArray.prototype.findAndSplice = function(verify: (value: T, index?: number, array?: Array) => boolean) {\n let index = this.findIndex(verify);\n return index !== -1 ? this.splice(index, 1)[0] : undefined;\n};\n\nString.prototype.toHHMMSS = function(leadZero = false) {\n const sec_num = parseInt(this + '', 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/* Promise.prototype.finally = Promise.prototype.finally || {\n finally(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}.finally; */\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\nPromise.prototype.safeFinally = function(this: Promise, fn: () => any) {\n return this.catch(() => {}).finally(fn);\n};\n\ndeclare global {\n interface Uint8Array {\n hex: string;\n randomize: () => Uint8Array,\n concat: (...args: Array) => Uint8Array,\n //toString: () => string,\n toJSON: () => number[],\n //toJSON: () => {type: 'bytes', value: number[]},\n }\n \n interface Array {\n findAndSplice(verify: (value: T, index?: number, array?: Array) => boolean): T;\n }\n \n interface String {\n toHHMMSS(leadZero?: boolean): string;\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n safeFinally: (onfinally?: () => void) => Promise;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false, //location.search.indexOf('http=1') > 0,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false\r\n};\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { notifySomeone, IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach(key => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n private taskId = 0;\r\n private tasks: {[taskID: number]: (result: any) => void} = {};\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n public finishTask(taskId: number, result: any) {\r\n //this.log('finishTask:', taskID, result, Object.keys(this.tasks));\r\n\r\n if(!this.tasks.hasOwnProperty(taskId)) {\r\n //this.log('no such task:', taskID, result);\r\n return;\r\n }\r\n\r\n this.tasks[taskId](result);\r\n delete this.tasks[taskId];\r\n }\r\n\r\n private proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']) {\r\n return new Promise((resolve, reject) => {\r\n if(IS_WORKER) {\r\n const taskId = this.taskId++;\r\n\r\n this.tasks[taskId] = resolve;\r\n const task: LocalStorageProxyTask = {\r\n type: 'localStorageProxy', \r\n id: taskId,\r\n payload: {\r\n type,\r\n args\r\n }\r\n };\r\n\r\n notifySomeone(task);\r\n } else {\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n const result: any = this.storage[type].apply(this.storage, args as any);\r\n resolve(result);\r\n }\r\n });\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.proxy('toggleStorage', enabled);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n }\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\r\n","'use strict'\n//@flow\n\n/** * * * * * * * * * *\n * Big Integer Library *\n * Created 2000 *\n * Leemon Baird *\n * www.leemon.com *\n * * * * * * * * * * * */\n\n////////////////////////////////////////////////////////////////////////////////////////\n// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.\n// For most functions, if it needs a BigInt as a local variable it will actually use\n// a global, and will only allocate to it only when it's not the right size. This ensures\n// that when a function is called repeatedly with same-sized parameters, it only allocates\n// memory on the first call.\n//\n// Note that for cryptographic purposes, the calls to Math.random() must\n// be replaced with calls to a better pseudorandom number generator.\n//\n// In the following, \"bigInt\" means a bigInt with at least one leading zero element,\n// and \"integer\" means a nonnegative integer less than radix. In some cases, integer\n// can be negative. Negative bigInts are 2s complement.\n//\n// The following functions do not modify their inputs.\n// Those returning a bigInt, string, or Array will dynamically allocate memory for that value.\n// Those returning a boolean will return the integer 0 (false) or 1 (true).\n// Those returning boolean or int will not allocate memory except possibly on the first\n// time they're called with a given parameter size.\n//\n// bigInt add(x,y) //return (x+y) for bigInts x and y.\n// bigInt addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.\n// string bigInt2str(x,base) //return a string form of bigInt x in a given base, with 2 <= base <= 95\n// int bitSize(x) //return how many bits long the bigInt x is, not counting leading zeros\n// bigInt dup(x) //return a copy of bigInt x\n// boolean equals(x,y) //is the bigInt x equal to the bigint y?\n// boolean equalsInt(x,y) //is bigint x equal to integer y?\n// bigInt expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed\n// Array findPrimes(n) //return array of all primes less than integer n\n// bigInt GCD(x,y) //return greatest common divisor of bigInts x and y (each with same number of elements).\n// boolean greater(x,y) //is x>y? (x and y are nonnegative bigInts)\n// boolean greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?\n// bigInt int2bigInt(t,n,m) //return a bigInt equal to integer t, with at least n bits and m array elements\n// bigInt inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null\n// int inverseModInt(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse\n// boolean isZero(x) //is the bigInt x equal to zero?\n// boolean millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is bigInt, 1=1). If s=1, then the most significant of those n bits is set to 1.\n// bigInt randTruePrime(k) //return a new, random, k-bit, true prime bigInt using Maurer's algorithm.\n// bigInt randProbPrime(k) //return a new, random, k-bit, probable prime bigInt (probability it's composite less than 2^-80).\n// bigInt str2bigInt(s,b,n,m) //return a bigInt for number represented in string s in base b with at least n bits and m array elements\n// bigInt sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement\n// bigInt trim(x,k) //return a copy of x with exactly k leading zero elements\n//\n//\n// The following functions each have a non-underscored version, which most users should call instead.\n// These functions each write to a single parameter, and the caller is responsible for ensuring the array\n// passed in is large enough to hold the result.\n//\n// void addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer\n// void add_(x,y) //do x=x+y for bigInts x and y\n// void copy_(x,y) //do x=y on bigInts x and y\n// void copyInt_(x,n) //do x=n on bigInt x and integer n\n// void GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). (This never overflows its array).\n// boolean inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist\n// void mod_(x,n) //do x=x mod n for bigInts x and n. (This never overflows its array).\n// void mult_(x,y) //do x=x*y for bigInts x and y.\n// void multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.\n// void powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.\n// void randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.\n// void randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.\n// void sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.\n//\n// The following functions do NOT have a non-underscored version.\n// They each write a bigInt result to one or more parameters. The caller is responsible for\n// ensuring the arrays passed in are large enough to hold the results.\n//\n// void addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))\n// void carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.\n// void divide_(x,y,q,r) //divide x by y giving quotient q and remainder r\n// int divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder. (This never overflows its array).\n// void eGCD_(x,y,d,a,b) //sets a,b,d to positive bigInts such that d = GCD_(x,y) = a*x-b*y\n// void halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement. (This never overflows its array).\n// void leftShift_(x,n) //left shift bigInt x by n bits. n64 multiplier, but not with JavaScript's 32*32->32)\n// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square\n// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that\n// method would be slower. This is unfortunate because the code currently spends almost all of its time\n// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring\n// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded\n// sentences that seem to imply it's faster to do a non-modular square followed by a single\n// Montgomery reduction, but that's obviously wrong.\n////////////////////////////////////////////////////////////////////////////////////////\n\nexport type Bool = 1 | 0\n\n//globals\nexport var bpe = 0 //bits stored per array element\nvar mask = 0 //AND this with an array element to chop it down to bpe bits\nvar radix = mask + 1 //equals 2^bpe. A single 1 bit to the left of the last bit of mask.\n\n//the digits for converting to different bases\nvar digitsStr =\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\\\\'\"+-'\n\n//initialize the global variables\n\n//bpe=number of bits in the mantissa on this platform\nfor (bpe = 0; 1 << (bpe + 1) > 1 << bpe; bpe++);\nbpe >>= 1 //bpe=number of bits in one element of the array representing the bigInt\nmask = (1 << bpe) - 1 //AND the mask with an integer to get its bpe least significant bits\nradix = mask + 1 //2^bpe. a single 1 bit to the left of the first bit of mask\nexport var one = int2bigInt(1, 1, 1) //constant used in powMod_()\nexport var zero = int2bigInt(0, 1, 1)\n\n//the following global variables are scratchpad memory to\n//reduce dynamic memory allocation in the inner loop\nvar t: number[] | number = new Array(0)\nvar ss = t //used in mult_()\nvar s0 = t //used in multMod_(), squareMod_()\n// var s1=t; //used in powMod_(), multMod_(), squareMod_()\n// var s2=t; //used in powMod_(), multMod_()\nvar s3 = t //used in powMod_()\nvar s4 = t,\n s5 = t //used in mod_()\nvar s6 = t //used in bigInt2str()\nvar s7 = t //used in powMod_()\nvar T = t //used in GCD_()\nvar sa = t //used in mont_()\nvar mr_x1 = t,\n mr_r = t,\n mr_a = t, //used in millerRabin()\n eg_v = t,\n eg_u = t,\n eg_A = t,\n eg_B = t,\n eg_C = t,\n eg_D = t, //used in eGCD_(), inverseMod_()\n //, md_q1=t, md_q2=t, md_q3=t, md_r=t, md_r1=t, md_r2=t, md_tt=t, //used in mod_()\n\n primes = t,\n pows = t,\n s_i = t,\n s_i2 = t,\n s_R = t,\n s_rm = t,\n s_q = t,\n s_n1 = t,\n s_a = t,\n s_r2 = t,\n s_n = t,\n s_b = t,\n s_d = t,\n s_x1 = t,\n s_x2 = t,\n s_aa = t, //used in randTruePrime_()\n rpprb = t //used in randProbPrimeRounds() (which also uses \"primes\")\n\n////////////////////////////////////////////////////////////////////////////////////////\n\nvar k, buff\n\n/**\n * return array of all primes less than integer n\n *\n * @param {number} n\n * @returns {number[]}\n */\nexport function findPrimes(n: number): number[] {\n var i, s, p, ans\n s = new Array(n)\n for (i = 0; i < n; i++) s[i] = 0\n s[0] = 2\n p = 0 //first p elements of s are primes, the rest are a sieve\n for (; s[p] < n; ) {\n //s[p] is the pth prime\n for (\n i = s[p] * s[p];\n i < n;\n i += s[p] //mark multiples of s[p]\n )\n s[i] = 1\n p++\n s[p] = s[p - 1] + 1\n for (; s[p] < n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)\n }\n ans = new Array(p)\n for (i = 0; i < p; i++) ans[i] = s[i]\n return ans\n}\n\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x is a bigInt, and b is an integer, with b 0; j--);\n for (z = 0, w = x[j]; w; w >>= 1, z++);\n z += bpe * j\n return z\n}\n\n/**\n * return a copy of x with at least n elements, adding leading zeros if needed\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\nexport function expand(x: number[], n: number): number[] {\n var ans = int2bigInt(0, (x.length > n ? x.length : n) * bpe, 0)\n copy_(ans, x)\n return ans\n}\n\n/**\n * return a k-bit true random prime using Maurer's algorithm.\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randTruePrime(k: number): number[] {\n var ans = int2bigInt(0, k, 0)\n randTruePrime_(ans, k)\n return trim(ans, 1)\n} */\n\n/**\n * return a k-bit random probable prime with probability of error < 2^-80\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randProbPrime(k: number): number[] {\n if (k >= 600) return randProbPrimeRounds(k, 2) //numbers from HAC table 4.3\n if (k >= 550) return randProbPrimeRounds(k, 4)\n if (k >= 500) return randProbPrimeRounds(k, 5)\n if (k >= 400) return randProbPrimeRounds(k, 6)\n if (k >= 350) return randProbPrimeRounds(k, 7)\n if (k >= 300) return randProbPrimeRounds(k, 9)\n if (k >= 250) return randProbPrimeRounds(k, 12) //numbers from HAC table 4.4\n if (k >= 200) return randProbPrimeRounds(k, 15)\n if (k >= 150) return randProbPrimeRounds(k, 18)\n if (k >= 100) return randProbPrimeRounds(k, 27)\n return randProbPrimeRounds(k, 40) //number from HAC remark 4.26 (only an estimate)\n} */\n\n/**\n * return a k-bit probable random prime using n rounds of Miller Rabin\n * (after trial division with small primes)\n *\n * @export\n * @param {number} k\n * @param {number} n\n * @returns {number[]}\n */\n/* export function randProbPrimeRounds(k: number, n: number): number[] {\n var ans, i, divisible, B\n B = 30000 //B is largest prime to use in trial division\n ans = int2bigInt(0, k, 0)\n\n //optimization: try larger and smaller B to find the best limit.\n\n if (primes.length === 0) primes = findPrimes(30000) //check for divisibility by primes <=30000\n\n if (rpprb.length !== ans.length) rpprb = dup(ans)\n\n for (;;) {\n //keep trying random values for ans until one appears to be prime\n //optimization: pick a random number times L=2*3*5*...*p, plus a\n // random element of the list of all numbers in [0,L) not divisible by any prime up to p.\n // This can reduce the amount of random number generation.\n\n randBigInt_(ans, k, 0) //ans = a random odd number to check\n ans[0] |= 1\n divisible = 0\n\n //check ans for divisibility by small primes up to B\n for (i = 0; i < primes.length && primes[i] <= B; i++)\n if (modInt(ans, primes[i]) === 0 && !equalsInt(ans, primes[i])) {\n divisible = 1\n break\n }\n\n //optimization: change millerRabin so the base can be bigger than the number being checked, then eliminate the while here.\n\n //do n rounds of Miller Rabin, with random bases less than ans\n for (i = 0; i < n && !divisible; i++) {\n randBigInt_(rpprb, k, 0)\n while (\n !greater(ans, rpprb) //pick a random rpprb that's < ans\n )\n randBigInt_(rpprb, k, 0)\n if (!millerRabin(ans, rpprb)) divisible = 1\n }\n\n if (!divisible) return ans\n }\n} */\n\n/**\n * return a new bigInt equal to (x mod n) for bigInts x and n.\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {number[]}\n */\nexport function mod(x: number[], n: number[]): number[] {\n var ans = dup(x)\n mod_(ans, n)\n return trim(ans, 1)\n}\n\n/**\n * return (x+n) where x is a bigInt and n is an integer.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n/* export function addInt(x: number[], n: number): number[] {\n var ans = expand(x, x.length + 1)\n addInt_(ans, n)\n return trim(ans, 1)\n} */\n\n/**\n * return x*y for bigInts x and y. This is faster when y y.length ? x.length + 1 : y.length + 1)\n sub_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x+y) for bigInts x and y\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function add(x: number[], y: number[]): number[] {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1)\n add_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x**(-1) mod n) for bigInts x and n.\n *\n * If no inverse exists, it returns null\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(number[] | null)}\n */\n/* export function inverseMod(x: number[], n: number[]): number[] | null {\n var ans = expand(x, n.length)\n var s = inverseMod_(ans, n)\n return s ? trim(ans, 1) : null\n} */\n\n/**\n * return (x*y mod n) for bigInts x,y,n.\n *\n * For greater speed, let y= 2\n\n if (s_i2.length != ans.length) {\n s_i2 = dup(ans)\n s_R = dup(ans)\n s_n1 = dup(ans)\n s_r2 = dup(ans)\n s_d = dup(ans)\n s_x1 = dup(ans) //TODO Seems like a bug in eslint, reports as unused\n s_x2 = dup(ans)\n s_b = dup(ans)\n s_n = dup(ans)\n s_i = dup(ans)\n s_rm = dup(ans)\n s_q = dup(ans)\n s_a = dup(ans)\n s_aa = dup(ans)\n }\n\n if (k <= recLimit) {\n //generate small random primes by trial division up to its square root\n pm = (1 << ((k + 2) >> 1)) - 1 //pm is binary number with all ones, just over sqrt(2^k)\n copyInt_(ans, 0)\n for (dd = 1; dd; ) {\n dd = 0\n ans[0] = 1 | (1 << (k - 1)) | Math.floor(Math.random() * (1 << k)) //random, k-bit, odd integer, with msb 1\n for (j = 1; j < primes.length && (primes[j] & pm) == primes[j]; j++) {\n //trial division by all primes 3...sqrt(2^k)\n if (0 == ans[0] % primes[j]) {\n dd = 1\n break\n }\n }\n }\n carry_(ans)\n return\n }\n\n B = c * k * k //try small primes up to B (or all the primes[] array if the largest is less than B).\n if (k > 2 * m)\n //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n for (r = 1; k - k * r <= m; ) r = pows[Math.floor(Math.random() * 512)] //r=Math.pow(2,Math.random()-1);\n else r = 0.5\n\n //simulation suggests the more complex algorithm using r=.333 is only slightly faster.\n\n recSize = Math.floor(r * k) + 1\n\n randTruePrime_(s_q, recSize)\n copyInt_(s_i2, 0)\n s_i2[Math.floor((k - 2) / bpe)] |= 1 << ((k - 2) % bpe) //s_i2=2^(k-2)\n divide_(s_i2, s_q, s_i, s_rm) //s_i=floor((2^(k-1))/(2q))\n\n z = bitSize(s_i)\n\n for (;;) {\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_i-1]\n randBigInt_(s_R, z, 0)\n if (greater(s_i, s_R)) break\n } //now s_R is in the range [0,s_i-1]\n addInt_(s_R, 1) //now s_R is in the range [1,s_i]\n add_(s_R, s_i) //now s_R is in the range [s_i+1,2*s_i]\n\n copy_(s_n, s_q)\n mult_(s_n, s_R)\n multInt_(s_n, 2)\n addInt_(s_n, 1) //s_n=2*s_R*s_q+1\n\n copy_(s_r2, s_R)\n multInt_(s_r2, 2) //s_r2=2*s_R\n\n //check s_n for divisibility by small primes up to B\n for (divisible = 0, j = 0; j < primes.length && primes[j] < B; j++)\n if (modInt(s_n, primes[j]) == 0 && !equalsInt(s_n, primes[j])) {\n divisible = 1\n break\n }\n\n if (!divisible)\n if (!millerRabinInt(s_n, 2))\n //if it passes small primes check, then try a single Miller-Rabin base 2\n //this line represents 75% of the total runtime for randTruePrime_\n divisible = 1\n\n if (!divisible) {\n //if it passes that test, continue checking s_n\n addInt_(s_n, -3)\n for (j = s_n.length - 1; s_n[j] == 0 && j > 0; j--); //strip leading zeros\n for (zz = 0, w = s_n[j]; w; w >>= 1, zz++);\n zz += bpe * j //zz=number of bits in s_n, ignoring leading zeros\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_n-1]\n randBigInt_(s_a, zz, 0)\n if (greater(s_n, s_a)) break\n } //now s_a is in the range [0,s_n-1]\n addInt_(s_n, 3) //now s_a is in the range [0,s_n-4]\n addInt_(s_a, 2) //now s_a is in the range [2,s_n-2]\n copy_(s_b, s_a)\n copy_(s_n1, s_n)\n addInt_(s_n1, -1)\n powMod_(s_b, s_n1, s_n) //s_b=s_a^(s_n-1) modulo s_n\n addInt_(s_b, -1)\n if (isZero(s_b)) {\n copy_(s_b, s_a)\n powMod_(s_b, s_r2, s_n)\n addInt_(s_b, -1)\n copy_(s_aa, s_n)\n copy_(s_d, s_b)\n GCD_(s_d, s_n) //if s_b and s_n are relatively prime, then s_n is a prime\n if (equalsInt(s_d, 1)) {\n copy_(ans, s_aa)\n return //if we've made it this far, then s_n is absolutely guaranteed to be prime\n }\n }\n }\n }\n} */\n\n/**\n * Return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n *\n * @export\n * @param {number} n\n * @param {number} s\n * @returns {number[]}\n */\n/* export function randBigInt(n: number, s: number): number[] {\n var a, b\n a = Math.floor((n - 1) / bpe) + 2 //# array elements to hold the BigInt with a leading 0 element\n b = int2bigInt(0, 0, a)\n randBigInt_(b, n, s)\n return b\n} */\n\n/**\n * Set b to an n-bit random BigInt. If s=1, then the most significant of those n bits is set to 1.\n *\n * Array b must be big enough to hold the result. Must have n>=1\n *\n * @export\n * @param {number[]} b\n * @param {number} n\n * @param {number} s\n * @return {void}\n */\n/* export function randBigInt_(b: number[], n: number, s: number): void {\n var i, a\n for (i = 0; i < b.length; i++) b[i] = 0\n a = Math.floor((n - 1) / bpe) + 1 //# array elements to hold the BigInt\n for (i = 0; i < a; i++) {\n b[i] = Math.floor(Math.random() * (1 << (bpe - 1)))\n }\n b[a - 1] &= (2 << ((n - 1) % bpe)) - 1\n if (s == 1) b[a - 1] |= 1 << ((n - 1) % bpe)\n} */\n\n/**\n * Return the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function GCD(x: number[], y: number[]): number[] {\n var xc, yc\n xc = dup(x)\n yc = dup(y)\n GCD_(xc, yc)\n return xc\n}\n\n/**\n * set x to the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * y is destroyed.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n */\nexport function GCD_(x: number[], y: number[]): void {\n var i: number, xp: number, yp: number, A: number, B, C: number, D: number, q, sing\n var qp\n if (T.length !== x.length) T = dup(x)\n\n sing = 1\n while (sing) {\n //while y has nonzero elements other than y[0]\n sing = 0\n for (\n i = 1;\n i < y.length;\n i++ //check if y has nonzero elements other than 0\n )\n if (y[i]) {\n sing = 1\n break\n }\n if (!sing) break //quit when y all zero elements except possibly y[0]\n\n for (i = x.length; !x[i] && i >= 0; i--); //find most significant element of x\n xp = x[i]\n yp = y[i]\n A = 1\n B = 0\n C = 0\n D = 1\n while (yp + C && yp + D) {\n q = Math.floor((xp + A) / (yp + C))\n qp = Math.floor((xp + B) / (yp + D))\n if (q != qp) break\n t = A - q * C\n A = C\n C = t // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)\n t = B - q * D\n B = D\n D = t\n t = xp - q * yp\n xp = yp\n yp = t\n }\n if (B) {\n copy_(T, x)\n linComb_(x, y, A, B) //x=A*x+B*y\n linComb_(y, T, D, C) //y=D*y+C*T\n } else {\n mod_(x, y)\n copy_(T, x)\n copy_(x, y)\n copy_(y, T)\n }\n }\n if (y[0] === 0) return\n t = modInt(x, y[0])\n copyInt_(x, y[0])\n y[0] = t\n while (y[0]) {\n x[0] %= y[0]\n t = x[0]\n x[0] = y[0]\n y[0] = t\n }\n}\n\n/**\n * do x=x**(-1) mod n, for bigInts x and n.\n *\n * If no inverse exists, it sets x to zero and returns 0, else it returns 1.\n * The x array must be at least as large as the n array.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(0 | 1)}\n */\n/* export function inverseMod_(x: number[], n: number[]): Bool {\n var k = 1 + 2 * Math.max(x.length, n.length)\n\n if (!(x[0] & 1) && !(n[0] & 1)) {\n //if both inputs are even, then inverse doesn't exist\n copyInt_(x, 0)\n return 0\n }\n\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_v = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n\n copy_(eg_u, x)\n copy_(eg_v, n)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while eg_u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if eg_A==eg_B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, n)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(eg_v[0] & 1)) {\n //while eg_v is even\n halve_(eg_v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if eg_C==eg_D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, n)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(eg_v, eg_u)) {\n //eg_v <= eg_u\n sub_(eg_u, eg_v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //eg_v > eg_u\n sub_(eg_v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n\n if (equalsInt(eg_u, 0)) {\n while (\n negative(eg_C) //make sure answer is nonnegative\n )\n add_(eg_C, n)\n copy_(x, eg_C)\n\n if (!equalsInt(eg_v, 1)) {\n //if GCD_(x,n)!=1, then there is no inverse\n copyInt_(x, 0)\n return 0\n }\n return 1\n }\n }\n} */\n\n/**\n * return x**(-1) mod n, for integers x and n.\n *\n * Return 0 if there is no inverse\n *\n * @param {number} x\n * @param {number} n\n * @returns {number}\n */\nexport function inverseModInt(x: number, n: number): number {\n var a = 1,\n b = 0,\n t\n for (;;) {\n if (x === 1) return a\n if (x === 0) return 0\n b -= a * Math.floor(n / x)\n //$off\n n %= x\n\n if (n === 1) return b //to avoid negatives, change this b to n-b, and each -= to +=\n if (n === 0) return 0\n a -= b * Math.floor(x / n)\n //$off\n x %= n\n }\n /*::\n declare var never: empty\n return never\n */\n}\n\n//this deprecated function is for backward compatibility only.\n/* function inverseModInt_(x: number, n: number) {\n return inverseModInt(x, n)\n} */\n\n/**\n * Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:\n *\n * v = GCD_(x,y) = a*x-b*y\n *\n * The bigInts v, a, b, must have exactly as many elements as the larger of x and y.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} v\n * @param {number[]} a\n * @param {number[]} b\n * @return {void}\n */\nexport function eGCD_(\n x: number[],\n y: number[],\n v: number[],\n a: number[],\n b: number[],\n): void {\n var g = 0\n var k = Math.max(x.length, y.length)\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n while (!(x[0] & 1) && !(y[0] & 1)) {\n //while x and y both even\n halve_(x)\n halve_(y)\n g++\n }\n copy_(eg_u, x)\n copy_(v, y)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if A==B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, y)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(v[0] & 1)) {\n //while v is even\n halve_(v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if C==D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, y)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(v, eg_u)) {\n //v<=u\n sub_(eg_u, v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //v>u\n sub_(v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C)) {\n //make sure a (C) is nonnegative\n add_(eg_C, y)\n sub_(eg_D, x)\n }\n multInt_(eg_D, -1) ///make sure b (D) is nonnegative\n copy_(a, eg_C)\n copy_(b, eg_D)\n leftShift_(v, g)\n return\n }\n }\n}\n\n/**\n * is bigInt x negative?\n *\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function negative(x: number[]) {\n //TODO Flow Bool type inference\n return (x[x.length - 1] >> (bpe - 1)) & 1\n}\n\n/**\n * is (x << (shift*bpe)) > y?\n *\n * x and y are nonnegative bigInts\n * shift is a nonnegative integer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} shift\n * @returns {(1 | 0)}\n */\nexport function greaterShift(x: number[], y: number[], shift: number): Bool {\n var i,\n kx = x.length,\n ky = y.length\n k = kx + shift < ky ? kx + shift : ky\n for (i = ky - 1 - shift; i < kx && i >= 0; i++) if (x[i] > 0) return 1 //if there are nonzeros in x to the left of the first column of y, then x is bigger\n for (i = kx - 1 + shift; i < ky; i++) if (y[i] > 0) return 0 //if there are nonzeros in y to the left of the first column of x, then x is not bigger\n for (i = k - 1; i >= shift; i--)\n if (x[i - shift] > y[i]) return 1\n else if (x[i - shift] < y[i]) return 0\n return 0\n}\n\n/**\n * is x > y?\n *\n * x and y both nonnegative\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\nexport function greater(x: number[], y: number[]): Bool {\n var i\n var k = x.length < y.length ? x.length : y.length\n\n for (i = x.length; i < y.length; i++) if (y[i]) return 0 //y has more digits\n\n for (i = y.length; i < x.length; i++) if (x[i]) return 1 //x has more digits\n\n for (i = k - 1; i >= 0; i--)\n if (x[i] > y[i]) return 1\n else if (x[i] < y[i]) return 0\n return 0\n}\n\n/**\n * divide x by y giving quotient q and remainder r.\n *\n * q = floor(x/y)\n * r = x mod y\n *\n * All 4 are bigints.\n *\n * * x must have at least one leading zero element.\n * * y must be nonzero.\n * * q and r must be arrays that are exactly the same length as x. (Or q can have more).\n * * Must have x.length >= y.length >= 2.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} q\n * @param {number[]} r\n * @return {void}\n */\nexport function divide_(\n x: number[],\n y: number[],\n q: number[],\n r: number[],\n): void {\n var kx, ky\n var i, j, y1, y2, c, a, b\n copy_(r, x)\n for (ky = y.length; y[ky - 1] === 0; ky--); //ky is number of elements in y, not including leading zeros\n\n //normalize: ensure the most significant element of y has its highest bit set\n b = y[ky - 1]\n for (a = 0; b; a++) b >>= 1\n a = bpe - a //a is how many bits to shift so that the high order bit of y is leftmost in its array element\n leftShift_(y, a) //multiply both by 1< ky; kx--); //kx is number of elements in normalized x, not including leading zeros\n\n copyInt_(q, 0) // q=0\n while (!greaterShift(y, r, kx - ky)) {\n // while (leftShift_(y,kx-ky) <= r) {\n subShift_(r, y, kx - ky) // r=r-leftShift_(y,kx-ky)\n q[kx - ky]++ // q[kx-ky]++;\n } // }\n\n for (i = kx - 1; i >= ky; i--) {\n if (r[i] == y[ky - 1]) q[i - ky] = mask\n else q[i - ky] = Math.floor((r[i] * radix + r[i - 1]) / y[ky - 1])\n\n //The following for(;;) loop is equivalent to the commented while loop,\n //except that the uncommented version avoids overflow.\n //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0\n // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])\n // q[i-ky]--;\n for (;;) {\n y2 = (ky > 1 ? y[ky - 2] : 0) * q[i - ky]\n c = y2 >> bpe\n y2 = y2 & mask\n y1 = c + q[i - ky] * y[ky - 1]\n c = y1 >> bpe\n y1 = y1 & mask\n\n if (\n c == r[i]\n ? y1 == r[i - 1] ? y2 > (i > 1 ? r[i - 2] : 0) : y1 > r[i - 1]\n : c > r[i]\n )\n q[i - ky]--\n else break\n }\n\n linCombShift_(r, y, -q[i - ky], i - ky) //r=r-q[i-ky]*leftShift_(y,i-ky)\n if (negative(r)) {\n addShift_(r, y, i - ky) //r=r+leftShift_(y,i-ky)\n q[i - ky]--\n }\n }\n\n rightShift_(y, a) //undo the normalization step\n rightShift_(r, a) //undo the normalization step\n}\n\n/**\n * do carries and borrows so each element of the bigInt x fits in bpe bits.\n *\n * @param {number[]} x\n */\nexport function carry_(x: number[]): void {\n var i, k, c, b\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * return x mod n for bigInt x and integer n.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number}\n */\nexport function modInt(x: number[], n: number): number {\n var i,\n c = 0\n for (i = x.length - 1; i >= 0; i--) c = (c * radix + x[i]) % n\n return c\n}\n\n/**\n * convert the integer t into a bigInt with at least the given number of bits.\n * the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)\n * Pad the array with leading zeros so that it has at least minSize elements.\n *\n * There will always be at least one leading 0 element.\n *\n * @export\n * @param {number} t\n * @param {number} bits\n * @param {number} minSize\n * @returns {number[]}\n */\nexport function int2bigInt(t: number, bits: number, minSize: number): number[] {\n var i, k\n k = Math.ceil(bits / bpe) + 1\n k = minSize > k ? minSize : k\n var buff = new Array(k)\n copyInt_(buff, t)\n return buff\n}\n\n/**\n * return the bigInt given a string representation in a given base.\n * Pad the array with leading zeros so that it has at least minSize elements.\n * If base=-1, then it reads in a space-separated list of array elements in decimal.\n *\n * The array will always have at least one leading zero, unless base=-1.\n *\n * @export\n * @param {string} s\n * @param {number} base\n * @param {number} [minSize]\n * @returns {number[]}\n */\nexport function str2bigInt(\n s: string,\n base: number,\n minSize?: number,\n): number[] {\n var d, i, x, y, kk\n var k = s.length\n if (base === -1) {\n //comma-separated list of array elements in decimal\n x = new Array(0)\n for (;;) {\n y = new Array(x.length + 1)\n for (i = 0; i < x.length; i++) y[i + 1] = x[i]\n y[0] = parseInt(s, 10) //TODO PERF Should we replace that with ~~ (not not)? https://jsperf.com/number-vs-parseint-vs-plus/7\n x = y\n d = s.indexOf(',', 0)\n if (d < 1) break\n //$off\n s = s.substring(d + 1)\n if (s.length == 0) break\n }\n //$off\n if (x.length < minSize) {\n //$off\n y = new Array(minSize)\n copy_(y, x)\n return y\n }\n return x\n }\n\n x = int2bigInt(0, base * k, 0)\n for (i = 0; i < k; i++) {\n d = digitsStr.indexOf(s.substring(i, i + 1), 0)\n if (base <= 36 && d >= 36)\n //convert lowercase to uppercase if base<=36\n d -= 26\n if (d >= base || d < 0) {\n //stop at first illegal character\n break\n }\n multInt_(x, base)\n addInt_(x, d)\n }\n\n for (k = x.length; k > 0 && !x[k - 1]; k--); //strip off leading zeros\n //$off\n k = minSize > k + 1 ? minSize : k + 1\n //$off\n y = new Array(k)\n //$off\n kk = k < x.length ? k : x.length\n //$off\n for (i = 0; i < kk; i++) y[i] = x[i]\n //$off\n for (; i < k; i++) y[i] = 0\n return y\n}\n\n//return the bigInt given a string representation in a given base.\n//Pad the array with leading zeros so that it has at least minSize elements.\n//If base=-1, then it reads in a space-separated list of array elements in decimal.\n//The array will always have at least one leading zero, unless base=-1.\n// function str2bigInt(s,b,minSize) {\n// var d, i, j, base, str, x, y, kk;\n// if (typeof b === 'string') {\n// base = b.length;\n// str = b;\n// } else {\n// base = b;\n// str = digitsStr;\n// }\n// var k=s.length;\n// if (base==-1) { //comma-separated list of array elements in decimal\n// x=new Array(0);\n// for (;;) {\n// y=new Array(x.length+1);\n// for (i=0;i=36) { //convert lowercase to uppercase if base<=36\n// d-=26;\n// }\n// if (d>=base || d<0) { //ignore illegal characters\n// continue;\n// }\n// multInt_(x,base);\n// addInt_(x,d);\n// }\n\n// for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros\n// k=minSize>k+1 ? minSize : k+1;\n// y=new Array(k);\n// kk=k y.length) {\n for (; i < x.length; i++) if (x[i]) return 0\n } else {\n for (; i < y.length; i++) if (y[i]) return 0\n }\n return 1\n}\n\n/**\n * is the bigInt x equal to zero?\n *\n * @export\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function isZero(x: number[]): Bool {\n var i\n for (i = 0; i < x.length; i++) if (x[i]) return 0\n return 1\n}\n\n/**\n * Convert a bigInt into a string in a given base, from base 2 up to base 95.\n *\n * Base -1 prints the contents of the array representing the number.\n *\n * @export\n * @param {number[]} x\n * @param {number} base\n * @returns {string}\n */\nexport function bigInt2str(x: number[], base: number): string {\n var i,\n t,\n s = ''\n\n if (s6.length !== x.length) s6 = dup(x)\n else copy_(s6, x)\n\n if (base === -1) {\n //return the list of array contents\n for (i = x.length - 1; i > 0; i--) s += x[i] + ','\n s += x[0]\n } else {\n //return it in the given base\n while (!isZero(s6)) {\n t = divInt_(s6, base) //t=s6 % base; s6=floor(s6/base);\n s = digitsStr.substring(t, t + 1) + s\n }\n }\n if (s.length === 0) s = '0'\n return s\n}\n\n/**\n * Convert a bigInt into bytes\n * @param x bigInt\n * @param littleEndian byte order by default\n */\nexport function bigInt2bytes(x: number[], littleEndian = true) {\n if(s6.length !== x.length) s6 = dup(x);\n else copy_(s6, x);\n\n const out: number[] = [];\n\n //console.log('bigInt2bytes');\n while(!isZero(s6)) {\n t = divInt_(s6, 256); //t=s6 % base; s6=floor(s6/base);\n out.push(t);\n //console.log('bigInt2bytes', t);\n }\n\n if(littleEndian) {\n out.reverse();\n }\n\n //console.log('bigInt2bytes', out);\n\n return out;\n}\n\n/**\n * Compare two bigInts and return -1 if x is less, 0 if equals, 1 if greater\n * @param x bigInt\n * @param y bigInt\n */\nexport function cmp(x: number[], y: number[]) {\n return greater(x, y) ? 1 : (equals(x, y) ? 0 : -1);\n}\n\n/* Object.assign(self, {\n cmp,\n str2bigInt,\n int2bigInt,\n bigInt2str,\n one,\n divide_,\n divInt_,\n dup,\n negative\n}); */\n\n/**\n * Returns a duplicate of bigInt x\n *\n * @export\n * @param {number[]} x\n * @returns {number[]}\n */\nexport function dup(x: number[]): number[] {\n var i\n buff = Array(x.length)\n copy_(buff, x)\n return buff\n}\n\n/**\n * do x=y on bigInts x and y.\n *\n * x must be an array at least as big as y (not counting the leading zeros in y).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {void}\n */\nexport function copy_(x: number[], y: number[]): void {\n var i\n var k = x.length < y.length ? x.length : y.length\n for (i = 0; i < k; i++) x[i] = y[i]\n for (i = k; i < x.length; i++) x[i] = 0\n}\n\n/**\n * do x=y on bigInt x and integer y.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function copyInt_(x: number[], n: number): void {\n var i, c\n var len = x.length //TODO .length in for loop have perfomance costs. Bench this\n for (c = n, i = 0; i < len; i++) {\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function addInt_(x: number[], n: number): void {\n var i, k, c, b\n x[0] += n\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n if (!c) return //stop carrying as soon as the carry is zero\n }\n}\n\n/**\n * right shift bigInt x by n bits.\n *\n * 0 <= n < bpe.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n */\nexport function rightShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = 0;\n i < x.length - k;\n i++ //right shift x by k elements\n )\n x[i] = x[i + k]\n for (; i < x.length; i++) x[i] = 0\n //$off\n n %= bpe\n }\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - n)) | (x[i] >> n))\n }\n x[i] >>= n\n}\n\n/**\n * do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement\n *\n * @param {number[]} x\n * @returns {void}\n */\nexport function halve_(x: number[]): void {\n var i\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - 1)) | (x[i] >> 1))\n }\n x[i] = (x[i] >> 1) | (x[i] & (radix >> 1)) //most significant bit stays the same\n}\n\n/**\n * left shift bigInt x by n bits\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function leftShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = x.length;\n i >= k;\n i-- //left shift x by k elements\n )\n x[i] = x[i - k]\n for (; i >= 0; i--) x[i] = 0\n //$off\n n %= bpe\n }\n if (!n) return\n for (i = x.length - 1; i > 0; i--) {\n x[i] = mask & ((x[i] << n) | (x[i - 1] >> (bpe - n)))\n }\n x[i] = mask & (x[i] << n)\n}\n\n/**\n * do x=x*n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function multInt_(x: number[], n: number): void {\n var i, k, c, b\n if (!n) return\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i] * n\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * do x=floor(x/n) for bigInt x and integer n, and return the remainder\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number} remainder\n */\nexport function divInt_(x: number[], n: number): number {\n var i,\n r = 0,\n s\n for (i = x.length - 1; i >= 0; i--) {\n s = r * radix + x[i]\n x[i] = Math.floor(s / n)\n r = s % n\n }\n return r\n}\n\n/**\n * do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} a\n * @param {number} b\n * @returns {void}\n */\nexport function linComb_(x: number[], y: number[], a: number, b: number): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n kk = x.length\n for (c = 0, i = 0; i < k; i++) {\n c += a * x[i] + b * y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; i < kk; i++) {\n c += a * x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} b\n * @param {number} ys\n * @returns {void}\n */\nexport function linCombShift_(\n x: number[],\n y: number[],\n b: number,\n ys: number,\n): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + b * y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+(y<<(ys*bpe)) for bigInts x and y, and integer ys.\n *\n * x must be large enough to hold the answer.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function addShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-(y<<(ys*bpe)) for bigInts x and y, and integer ys\n *\n * x must be large enough to hold the answer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function subShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] - y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function sub_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] - y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function add_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] + y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x*y for bigInts x and y.\n *\n * This is faster when y 0 && !x[kx - 1]; kx--); //ignore leading zeros in x\n k = kx > n.length ? 2 * kx : 2 * n.length //k=# elements in the product, which is twice the elements in the larger of x and n\n if (s0.length != k) s0 = new Array(k)\n copyInt_(s0, 0)\n for (i = 0; i < kx; i++) {\n c = s0[2 * i] + x[i] * x[i]\n s0[2 * i] = c & mask\n c >>= bpe\n for (j = i + 1; j < kx; j++) {\n c = s0[i + j] + 2 * x[i] * x[j] + c\n s0[i + j] = c & mask\n c >>= bpe\n }\n s0[i + kx] = c\n }\n mod_(s0, n)\n copy_(x, s0)\n}\n\n/**\n * return x with exactly k leading zero elements\n *\n * @export\n * @param {number[]} x\n * @param {number} k\n * @returns {number[]}\n */\nexport function trim(x: number[], k: number): number[] {\n var i, y\n for (i = x.length; i > 0 && !x[i - 1]; i--);\n y = new Array(i + k)\n copy_(y, x)\n return y\n}\n\n/**\n * do `x=x**y mod n`, where x,y,n are bigInts and `**` is exponentiation. `0**0=1`.\n *\n * this is faster when n is odd.\n *\n * x usually needs to have as many elements as n.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\nexport function powMod_(x: number[], y: number[], n: number[]): void {\n var k1, k2, kn, np\n if (s7.length != n.length) s7 = dup(n)\n\n //for even modulus, use a simple square-and-multiply algorithm,\n //rather than using the more complex Montgomery algorithm.\n if ((n[0] & 1) == 0) {\n copy_(s7, x)\n copyInt_(x, 1)\n while (!equalsInt(y, 0)) {\n if (y[0] & 1) multMod_(x, s7, n)\n divInt_(y, 2)\n squareMod_(s7, n)\n }\n return\n }\n\n //calculate np from n for the Montgomery multiplications\n copyInt_(s7, 0)\n for (kn = n.length; kn > 0 && !n[kn - 1]; kn--);\n np = radix - inverseModInt(modInt(n, radix), radix)\n s7[kn] = 1\n multMod_(x, s7, n) // x = x * 2**(kn*bp) mod n\n\n if (s3.length != x.length) s3 = dup(x)\n else copy_(s3, x)\n //$off\n // @ts-ignore\n for (k1 = y.length - 1; (k1 > 0) & !y[k1]; k1--); //k1=first nonzero element of y\n if (y[k1] == 0) {\n //anything to the 0th power is 1\n copyInt_(x, 1)\n return\n }\n for (k2 = 1 << (bpe - 1); k2 && !(y[k1] & k2); k2 >>= 1); //k2=position of first 1 bit in y[k1]\n for (;;) {\n if (!(k2 >>= 1)) {\n //look at next bit of y\n k1--\n if (k1 < 0) {\n mont_(x, one, n, np)\n return\n }\n k2 = 1 << (bpe - 1)\n }\n mont_(x, x, n, np)\n\n if (k2 & y[k1])\n //if next bit is a 1\n mont_(x, s3, n, np)\n }\n}\n\n/**\n * do x=x*y*Ri mod n for bigInts x,y,n,\n * where Ri = 2**(-kn*bpe) mod n, and kn is the\n * number of elements in the n array, not\n * counting leading zeros.\n *\n * x array must have at least as many elemnts as the n array\n * It's OK if x and y are the same variable.\n *\n * must have:\n * * x,y < n\n * * n is odd\n * * np = -(n^(-1)) mod radix\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @param {number} np\n * @return {void}\n */\nexport function mont_(x: number[], y: number[], n: number[], np: number): void {\n var i, j, c, ui, t, ks\n var kn = n.length\n var ky = y.length\n\n if (sa.length != kn) sa = new Array(kn)\n\n copyInt_(sa, 0)\n\n for (; kn > 0 && n[kn - 1] == 0; kn--); //ignore leading zeros of n\n for (; ky > 0 && y[ky - 1] == 0; ky--); //ignore leading zeros of y\n ks = sa.length - 1 //sa will never have more than this many nonzero elements.\n\n //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large numbers\n for (i = 0; i < kn; i++) {\n t = sa[0] + x[i] * y[0]\n ui = ((t & mask) * np) & mask //the inner \"& mask\" was needed on Safari (but not MSIE) at one time\n c = (t + ui * n[0]) >> bpe\n t = x[i]\n\n //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe. Loop is unrolled 5-fold for speed\n j = 1\n for (; j < ky - 4; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ky; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn - 4; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ks; ) {\n c += sa[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n sa[j - 1] = c & mask\n }\n\n if (!greater(n, sa)) sub_(sa, n)\n copy_(x, sa)\n}","/*\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 { bufferConcats } from '../../helpers/bytes';\nimport { add_, bigInt2str, cmp, leftShift_, str2bigInt } from '../../vendor/leemon';\n\n \n \n \n\n \n \n \n \n \n \n \n \n \n\nexport function isObject(object: any) {\n return typeof(object) === 'object' && object !== null;\n}\n\n/* export function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n} */\n\n/* export function bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10);\n} */\n\n/* export function base64ToBlob(base64str: string, mimeType: string) {\n var sliceSize = 1024;\n var byteCharacters = atob(base64str);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n\n for(var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n\n var bytes = new Array(end - begin);\n for(var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n\n return blobConstruct(byteArrays, mimeType);\n}\n\nexport function dataUrlToBlob(url: string) {\n // var name = 'b64blob ' + url.length\n // console.time(name)\n var urlParts = url.split(',');\n var base64str = urlParts[1];\n var mimeType = urlParts[0].split(':')[1].split(';')[0];\n var blob = base64ToBlob(base64str, mimeType);\n // console.timeEnd(name)\n return blob;\n} */\n\nexport 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\n/* export function bytesFromBigInt(bigInt: BigInteger, len?: number) {\n var bytes = bigInt.toByteArray();\n\n if(len && bytes.length < len) {\n var padding = [];\n for(var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n padding[i] = 0;\n }\n if(bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(padding, bytes);\n } else {\n bytes = padding.concat(bytes);\n }\n } else {\n while (!bytes[0] && (!len || bytes.length > len)) {\n bytes = bytes.slice(1);\n }\n }\n\n return bytes;\n} */\n\nexport function longFromInts(high: number, low: number): string {\n //let perf = performance.now();\n //let str = bigint(high).shiftLeft(32).add(bigint(low)).toString(10);\n //console.log('longFromInts jsbn', performance.now() - perf);\n high = intToUint(high);\n low = intToUint(low);\n \n //perf = performance.now();\n const bigInt = str2bigInt(high.toString(16), 16, 32);//int2bigInt(high, 64, 64);\n //console.log('longFromInts construct high', bigint(high).toString(10), bigInt2str(bigInt, 10));\n leftShift_(bigInt, 32);\n //console.log('longFromInts shiftLeft', bigint(high).shiftLeft(32).toString(10), bigInt2str(bigInt, 10));\n add_(bigInt, str2bigInt(low.toString(16), 16, 32));\n const _str = bigInt2str(bigInt, 10);\n\n //console.log('longFromInts leemon', performance.now() - perf);\n\n //console.log('longFromInts', high, low, str, _str, str === _str);\n\n return _str;\n}\n\nexport function sortLongsArray(arr: string[]) {\n return arr.map(long => {\n return str2bigInt(long, 10);\n }).sort((a, b) => {\n return cmp(a, b);\n }).map(bigInt => {\n return bigInt2str(bigInt, 10);\n });\n}\n\nexport 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 padding.randomize();\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","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"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\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"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\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"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\":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\":-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\":-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\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":-646342540,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-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\":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\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"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\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"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\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"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\":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\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_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\":1073147056,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"}],\"type\":\"User\"},{\"id\":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\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"kicked\",\"type\":\"flags.1?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"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\":-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\":\"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\":1304281241,\"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\"}],\"type\":\"ChatFull\"},{\"id\":-374179305,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"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\":-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\":-2049520670,\"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\":\"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\":\"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\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"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\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-2074799289,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-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\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"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\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"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\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":1080663248,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"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\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"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\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"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\":-1441072131,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":739712882,\"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\":\"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\":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\":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\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"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\":-855308010,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"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\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-1673717362,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1353671392,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"PeerNotifySettings\"},{\"id\":1933519201,\"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\":\"geo_distance\",\"type\":\"flags.6?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\":-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\":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\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-694681851,\"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\":\"user\",\"type\":\"User\"},{\"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\"}],\"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\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"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\":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\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"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\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"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\":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\":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\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"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\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"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\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":-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\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1135492588,\"predicate\":\"updateStickerSets\",\"params\":[],\"type\":\"Update\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"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\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":-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\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"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\":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\":-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\":-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\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1153291573,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"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\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"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\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"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\":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\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"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\":-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\":-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\":-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\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"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\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"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\":-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\":-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\":-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\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":856375399,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":1248893260,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"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\":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\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":512177195,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"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\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":1781674934,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"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\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"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\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"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\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"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\":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\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"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\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"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\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"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\":\"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\":307276766,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector\"}],\"type\":\"account.Authorizations\"},{\"id\":408623183,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":-1316944408,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?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\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":-540871282,\"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\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector\"}],\"type\":\"ChatInvite\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"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\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-673242758,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":-1240849242,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":460632885,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":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\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"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\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"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\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"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\":-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\":-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\":-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\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"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\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"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\":682146919,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"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\":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\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"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\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"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\":-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\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"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\":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\":-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\":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\":-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\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"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\":-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\":-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\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"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\":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\":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\":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\":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\":-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\":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\":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\":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\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"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\":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\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"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\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"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\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-2067782896,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":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\":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\":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\":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\":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\":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\":-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\":-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\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"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\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"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\":-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\":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\":-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\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":215516896,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"}],\"type\":\"Invoice\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"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\":-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\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"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\":-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\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":378828315,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"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\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"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\":-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\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1655957568,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":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\":-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\":-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\":-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\":-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\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"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\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"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\":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\":-26672755,\"predicate\":\"channelAdminLogEventActionChangeTheme\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"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\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"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\":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\":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\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":1648543603,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":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\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":-534283678,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-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\":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\":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\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"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\":-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\":-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\":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\":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\":-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\":-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\":-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\":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\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"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\":-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\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"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\":-557924733,\"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\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-532532493,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"int\"},{\"name\":\"file_size_max\",\"type\":\"int\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-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\":-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\":-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\":-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\":-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\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"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\":-402474788,\"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?ThemeSettings\"},{\"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\":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\":-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\":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\":-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\":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\":-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\":-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\":-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\":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\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"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\":\"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\":-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\":-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\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"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\":-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\":190633460,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"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\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"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\":-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\":-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\":-318022605,\"predicate\":\"chatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"Theme\"},{\"name\":\"dark_theme\",\"type\":\"Theme\"}],\"type\":\"ChatTheme\"},{\"id\":-535699004,\"predicate\":\"account.chatThemesNotModified\",\"params\":[],\"type\":\"account.ChatThemes\"},{\"id\":-28524867,\"predicate\":\"account.chatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"themes\",\"type\":\"Vector\"}],\"type\":\"account.ChatThemes\"},{\"id\":708589599,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"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\"}],\"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\":-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\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"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\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1126886015,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":1461180992,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"Bool\"},{\"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\":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\":-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\":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\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"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\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"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\":655677548,\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1040964988,\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-623130288,\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-906486552,\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":1099779595,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"reason\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-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\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"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\":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\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"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\":-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\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1880182943,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":-323339813,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-262453244,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?int\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-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\":-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\":-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\":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\":-2077048289,\"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?InputThemeSettings\"}],\"type\":\"Theme\"},{\"id\":1555261397,\"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?InputThemeSettings\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2061776695,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"format\",\"type\":\"flags.1?string\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"}],\"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\":-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\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"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\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":-690545285,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"account.ChatThemes\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-902781519,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"UserFull\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"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\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"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\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"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\":-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\":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\":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\":469850889,\"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\"}],\"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\":1376532592,\"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\":\"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\"}],\"type\":\"Updates\"},{\"id\":881978281,\"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\":\"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\"}],\"type\":\"Updates\"},{\"id\":-637606386,\"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\":\"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\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":913498268,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"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\":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\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"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\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"id\":347716823,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"}],\"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\":639215886,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"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\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":864953444,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":570955184,\"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\"}],\"type\":\"Updates\"},{\"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\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1137057461,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":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\":-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\":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\":-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\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"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\":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\":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\":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\":-872345397,\"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\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"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\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"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\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"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\":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\":-2127811866,\"method\":\"messages.getStatsURL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"params\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"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\":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\":1932455680,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"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\":-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\":-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\":-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\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"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\":-265962357,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"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\":48562110,\"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\"}],\"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\":654013065,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"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\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"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\":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\":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\":-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\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1319462148,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-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\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":536919235,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector\"},{\"id\":1302676017,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":-956147407,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"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\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"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\":-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\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"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\":-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\":-787622117,\"method\":\"channels.deleteUserHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-32999408,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"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\":-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\":-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\":-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\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1355375294,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"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\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"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\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"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\":-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\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"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\":-1976353651,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-619695760,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":818134173,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":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\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?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\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"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\":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\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"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\":-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\":-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\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"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\":-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\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"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\"}]},\"layer\":133} 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","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","/*\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import sha1 from '@cryptography/sha1';\n//import sha256 from '@cryptography/sha256';\nimport {IGE} from '@cryptography/aes';\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n\nimport {str2bigInt, bpe, equalsInt, greater, \n copy_, eGCD_, add_, rightShift_, sub_, copyInt_, isZero,\n divide_, one, bigInt2str, powMod, bigInt2bytes, int2bigInt, mod} from '../../vendor/leemon';//from 'leemon';\n\nimport { addPadding } from '../mtproto/bin_utils';\nimport { bytesToWordss, bytesFromWordss, bytesToHex, bytesFromHex, convertToUint8Array } from '../../helpers/bytes';\nimport { nextRandomUint } from '../../helpers/random';\nimport type { RSAPublicKeyHex } from '../mtproto/rsaKeysManager';\n\nconst subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport function longToBytes(sLong: string) {\n /* let perf = performance.now();\n for(let i = 0; i < 1000000; ++i) {\n bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse();\n }\n console.log('longToBytes JSBN', sLong, performance.now() - perf);\n \n //const bytes = bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse();\n \n perf = performance.now();\n for(let i = 0; i < 1000000; ++i) {\n bigInt2bytes(str2bigInt(sLong, 10));\n }\n console.log('longToBytes LEEMON', sLong, performance.now() - perf); */\n\n const bigIntBytes = new Uint8Array(bigInt2bytes(str2bigInt(sLong, 10), false));\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n //console.log('longToBytes', bytes, b);\n \n return bytes;\n}\n\nexport function sha1HashSync(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\nexport function sha256HashSync(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\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n //console.log(dT(), 'AES encrypt start', bytes, keyBytes, ivBytes);\n // console.log('aes before padding bytes:', bytesToHex(bytes));\n bytes = addPadding(bytes);\n // console.log('aes after padding bytes:', bytesToHex(bytes));\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const encryptedBytes = cipher.encrypt(bytesToWordss(bytes));\n //console.log(dT(), 'AES encrypt finish');\n\n return bytesFromWordss(encryptedBytes);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n //console.log(dT(), 'AES decrypt start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const decryptedBytes = cipher.decrypt(bytesToWordss(bytes));\n\n //console.log(dT(), 'AES decrypt finish');\n\n return bytesFromWordss(decryptedBytes);\n}\n\nexport function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n //console.log(dT(), 'RSA encrypt start', publicKey, bytes);\n\n const N = str2bigInt(publicKey.modulus, 16);\n const E = str2bigInt(publicKey.exponent, 16);\n const X = str2bigInt(bytesToHex(bytes), 16);\n\n const encryptedBigInt = powMod(X, E, N);\n const encryptedBytes = bytesFromHex(bigInt2str(encryptedBigInt, 16));\n\n //console.log(dT(), 'RSA encrypt finish');\n\n return encryptedBytes;\n}\n\nexport async function hash_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 let 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\nexport function pqPrimeFactorization(pqBytes: Uint8Array | number[]) {\n let result: ReturnType;\n\n //console.log('PQ start', pqBytes, bytesToHex(pqBytes));\n\n try {\n //console.time('PQ leemon');\n result = pqPrimeLeemon(str2bigInt(bytesToHex(pqBytes), 16, Math.ceil(64 / bpe) + 1));\n //console.timeEnd('PQ leemon');\n } catch(e) {\n console.error('Pq leemon Exception', e);\n }\n\n //console.log('PQ finish', result);\n\n return result;\n}\n\nexport function pqPrimeLeemon(what: number[]): [Uint8Array, Uint8Array, number] {\n var minBits = 64;\n var minLen = Math.ceil(minBits / bpe) + 1;\n var it = 0;\n var i, q;\n var j, lim;\n var P;\n var Q;\n var a = new Array(minLen);\n var b = new Array(minLen);\n var c = new Array(minLen);\n var g = new Array(minLen);\n var z = new Array(minLen);\n var x = new Array(minLen);\n var y = new Array(minLen);\n\n for(i = 0; i < 3; ++i) {\n q = (nextRandomUint(8) & 15) + 17;\n copy_(x, mod(int2bigInt(nextRandomUint(32), 32, 0), what));\n copy_(y, x);\n lim = 1 << (i + 18);\n\n for (j = 1; j < lim; ++j) {\n ++it;\n copy_(a, x);\n copy_(b, x);\n copyInt_(c, q);\n\n while(!isZero(b)) {\n if(b[0] & 1) {\n add_(c, a);\n if(greater(c, what)) {\n sub_(c, what);\n }\n }\n add_(a, a);\n if(greater(a, what)) {\n sub_(a, what);\n }\n rightShift_(b, 1);\n }\n\n copy_(x, c);\n if(greater(x, y)) {\n copy_(z, x);\n sub_(z, y);\n } else {\n copy_(z, y);\n sub_(z, x);\n }\n eGCD_(z, what, g, a, b);\n if(!equalsInt(g, 1)) {\n break;\n }\n if((j & (j - 1)) === 0) {\n copy_(y, x);\n }\n }\n if(greater(g, one)) {\n break;\n }\n }\n\n divide_(what, g, x, y);\n\n if(greater(g, x)) {\n P = x;\n Q = g;\n } else {\n P = g;\n Q = x;\n }\n\n // console.log(dT(), 'done', bigInt2str(what, 10), bigInt2str(P, 10), bigInt2str(Q, 10))\n\n return [new Uint8Array(bigInt2bytes(P)), new Uint8Array(bigInt2bytes(Q)), it];\n}\n\nexport function bytesModPow(x: number[] | Uint8Array, y: number[] | Uint8Array, m: number[] | Uint8Array) {\n try {\n const xBigInt = str2bigInt(bytesToHex(x), 16);\n const yBigInt = str2bigInt(bytesToHex(y), 16);\n const mBigInt = str2bigInt(bytesToHex(m), 16);\n const resBigInt = powMod(xBigInt, yBigInt, mBigInt);\n\n return bytesFromHex(bigInt2str(resBigInt, 16));\n } catch(e) {\n console.error('mod pow error', e);\n }\n\n //return bytesFromBigInt(new BigInteger(x).modPow(new BigInteger(y), new BigInteger(m)), 256);\n}\n\n//export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n//export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport 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 * 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 { bytesToHex } from '../../helpers/bytes';\nimport { isObject, longFromInts } from './bin_utils';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { str2bigInt, dup, divide_, bigInt2str } from '../../vendor/leemon';\nimport Schema, { MTProtoConstructor } from './schema';\n\n \n// @ts-ignore\nimport { gzipUncompress } from '../crypto/crypto_utils';\n \n\nconst boolFalse = +Schema.API.constructors.find(c => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find(c => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find(c => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find(c => c.predicate === 'gzip_packed').id;\n\n//console.log('boolFalse', boolFalse === 0xbc799737);\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;//Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n //let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n //console.log('perf uint8', performance.now() - perf);\n\n //perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n //console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n \n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n \n resultArray.set(this.byteView.subarray(0, this.offset));\n \n return resultArray;\n }\n \n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; i++) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n \n //console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n //const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n \n this.createBuffer();\n \n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32), \n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n \n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n \n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n \n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n \n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n \n if(typeof sLong !== 'string') {\n sLong = sLong ? sLong.toString() : '0';\n }\n\n const R = 0x100000000;\n //const divRem = bigStringInt(sLong).divideAndRemainder(bigint(R));\n\n const a = str2bigInt(sLong, 10, 64);\n const q = dup(a);\n const r = dup(a);\n divide_(a, str2bigInt((R).toString(16), 16, 64), q, r);\n //divInt_(a, R);\n\n const high = +bigInt2str(q, 10);\n let low = +bigInt2str(r, 10);\n\n if(high < low) {\n low -= R; \n }\n\n //console.log('storeLong', sLong, divRem[0].intValue(), divRem[1].intValue(), high, low);\n \n //this.writeInt(divRem[1].intValue(), (field || '') + ':long[low]');\n //this.writeInt(divRem[0].intValue(), (field || '') + ':long[high]');\n this.writeInt(low, (field || '') + ':long[low]');\n this.writeInt(high, (field || '') + ':long[high]');\n }\n \n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n doubleView[0] = f;\n \n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n \n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n \n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n \n this.checkLength(sUTF8.length + 8);\n \n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; i++) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n \n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n \n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n \n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n \n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n \n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n \n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find(m => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n \n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n //console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n \n //console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n \n //console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n \n public storeObject(obj: any, type: string, field?: string) {\n //console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n \n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if (type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; i++) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if (type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n \n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find(c => c.predicate === predicate);\n \n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n \n if(predicate === type) {\n isBare = true;\n }\n \n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n //console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n //console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n //console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n //console.log('storeObject', param, type);\n \n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n \n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug = \n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n //buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n //console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n 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 this.byteView.slice(this.offset - 16, this.offset + 16).hex);\n \n this.offset += 4;\n \n return i;\n }\n \n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n \n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n \n return doubleView[0];\n }\n \n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n \n //const longDec = bigint(iHigh).shiftLeft(32).add(bigint(iLow)).toString();\n const longDec = longFromInts(iHigh, iLow);\n\n if(!this.mtproto) {\n const num = +longDec;\n if(Number.isSafeInteger(num)) {\n // @ts-ignore\n return num;\n }\n }\n \n // @ts-ignore\n return longDec;\n }\n \n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n \n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n let sUTF8 = '';\n for(let i = 0; i < len; i++) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch (e) {\n s = sUTF8;\n }\n \n this.debug && console.log('<<<', s, (field || '') + ':string');\n \n return s;\n }\n \n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n const bytes = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n \n return bytes;\n }\n \n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n \n const len = bits / 8;\n if(typed) {\n const result = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n \n return bytes;\n }\n \n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n \n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView.subarray(this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n \n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n \n return result;\n }\n \n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n \n field = field || type || 'Object';\n \n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n \n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find(c => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find(c => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n \n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n \n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n \n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; i++) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n \n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; i++) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n \n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n \n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n \n const predicate = constructorData.predicate;\n \n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; i++) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = (type.indexOf('?') !== -1);\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n //console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\n continue;\n }\n\n //console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\n\n type = condType[1];\n }\n \n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n \n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n /* if(param.name === 'read_outbox_max_id') {\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\n } */\n \n result[param.name] = value;\n }\n }\n }\n \n if(fallback) {\n this.mtproto = true;\n }\n \n return result;\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","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport {str2bigInt, isZero,\r\n bigInt2str, powMod, int2bigInt, mult, mod, sub, bitSize, negative, add, greater} from '../../vendor/leemon';\r\n\r\nimport {logger, LogTypes} from '../logger';\r\nimport { AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo } from \"../../layer\";\r\nimport { bufferConcats, bytesToHex, bytesFromHex, bytesXor, convertToUint8Array } from \"../../helpers/bytes\";\r\nimport { addPadding } from \"../mtproto/bin_utils\";\r\n//import { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nconst log = logger('SRP', LogTypes.Error);\r\n\r\n//MOUNT_CLASS_TO && Object.assign(MOUNT_CLASS_TO, {str2bigInt, bigInt2str, int2bigInt});\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-hash', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\r\n //log('encoded 1', bytesToHex(new Uint8Array(buffer)));\r\n\r\n buffer = bufferConcats(server_salt, buffer, server_salt);\r\n\r\n buffer = await CryptoWorker.invokeCrypto('sha256-hash', buffer);\r\n //log('encoded 2', buffer, bytesToHex(new Uint8Array(buffer)));\r\n\r\n let hash = await CryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\r\n //log('encoded 3', hash, bytesToHex(new Uint8Array(hash)));\r\n\r\n hash = bufferConcats(server_salt, hash, server_salt);\r\n\r\n buffer = await CryptoWorker.invokeCrypto('sha256-hash', hash);\r\n //log('got password hash:', buffer, bytesToHex(new Uint8Array(buffer)));\r\n\r\n return buffer;\r\n}\r\n\r\nexport 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 //console.log('computeSRP:', password, state, isNew, algo);\r\n\r\n const p = str2bigInt(bytesToHex(algo.p), 16);\r\n const g = int2bigInt(algo.g, 32, 256);\r\n \r\n //log('p', bigInt2str(p, 16));\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 = str2bigInt(bytesToHex(pw_hash), 16);\r\n \r\n //log('computed pw_hash:', pw_hash, x, bytesToHex(new Uint8Array(pw_hash)));\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 = powMod(g, 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 = bytesFromHex(bigInt2str(v, 16));\r\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\r\n }\r\n \r\n const B = str2bigInt(bytesToHex(state.srp_B), 16);\r\n //log('B', bigInt2str(B, 16));\r\n \r\n const pForHash = padArray(bytesFromHex(bigInt2str(p, 16)), 256);\r\n const gForHash = padArray(bytesFromHex(bigInt2str(g, 16)), 256); // like uint8array\r\n const b_for_hash = padArray(bytesFromHex(bigInt2str(B, 16)), 256);\r\n /* log(bytesToHex(pForHash));\r\n log(bytesToHex(gForHash));\r\n log(bytesToHex(b_for_hash)); */\r\n\r\n //log('g_x', bigInt2str(g_x, 16));\r\n\r\n const kHash = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(pForHash, gForHash));\r\n const k = str2bigInt(bytesToHex(kHash), 16);\r\n\r\n //log('k', bigInt2str(k, 16));\r\n\r\n // kg_x = (k * g_x) % p\r\n const k_v = mod(mult(k, v), p);\r\n\r\n // good\r\n\r\n //log('kg_x', bigInt2str(kg_x, 16));\r\n\r\n const is_good_mod_exp_first = (modexp: any, prime: any) => {\r\n const diff = sub(prime, modexp);\r\n const min_diff_bits_count = 2048 - 64;\r\n const max_mod_exp_size = 256;\r\n if(negative(diff) ||\r\n bitSize(diff) < min_diff_bits_count || \r\n bitSize(modexp) < min_diff_bits_count || \r\n Math.floor((bitSize(modexp) + 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 = str2bigInt(bytesToHex(flipper(state.secure_random)), 16);\r\n //const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\r\n\r\n //console.log('ITERATION');\r\n\r\n //log('g a p', bigInt2str(g, 16), bigInt2str(a, 16), bigInt2str(p, 16));\r\n\r\n const A = powMod(g, a, p);\r\n //log('A MODPOW', bigInt2str(A, 16));\r\n if(is_good_mod_exp_first(A, p)) {\r\n const a_for_hash = bytesFromHex(bigInt2str(A, 16));\r\n\r\n const s = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(a_for_hash, b_for_hash));\r\n const u = str2bigInt(s.hex, 16);\r\n if(!isZero(u) && !negative(u))\r\n return {a, a_for_hash, u};\r\n } \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 /* log('a', bigInt2str(a, 16));\r\n log('a_for_hash', bytesToHex(a_for_hash));\r\n log('u', bigInt2str(u, 16)); */\r\n\r\n // g_b = (B - kg_x) % p\r\n /* log('B - kg_x', bigInt2str(sub(B, kg_x), 16));\r\n log('subtract', bigInt2str(B, 16), bigInt2str(kg_x, 16));\r\n log('B - kg_x', bigInt2str(sub(B, kg_x), 16)); */\r\n\r\n let g_b: number[];\r\n if(!greater(B, k_v)) {\r\n //log('negative');\r\n g_b = add(B, p);\r\n } else g_b = B;\r\n g_b = mod(sub(g_b, k_v), p);\r\n /* let g_b = sub(B, kg_x);\r\n if(negative(g_b)) g_b = add(g_b, p); */\r\n \r\n //log('g_b', bigInt2str(g_b, 16));\r\n\r\n /* if(!is_good_mod_exp_first(g_b, p))\r\n throw new Error('bad g_b'); */\r\n\r\n const ux = mult(u, x);\r\n //log('u and x multiply', bigInt2str(u, 16), bigInt2str(x, 16), bigInt2str(ux, 16));\r\n const a_ux = add(a, ux);\r\n const S = powMod(g_b, a_ux, p);\r\n\r\n const K = await CryptoWorker.invokeCrypto('sha256-hash', padArray(bytesFromHex(bigInt2str(S, 16)), 256));\r\n\r\n //log('K', bytesToHex(K), new Uint32Array(new Uint8Array(K).buffer));\r\n\r\n let h1 = await CryptoWorker.invokeCrypto('sha256-hash', pForHash);\r\n const h2 = await CryptoWorker.invokeCrypto('sha256-hash', gForHash);\r\n h1 = bytesXor(h1, h2);\r\n\r\n const buff = bufferConcats(h1, \r\n await CryptoWorker.invokeCrypto('sha256-hash', algo.salt1),\r\n await CryptoWorker.invokeCrypto('sha256-hash', 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-hash', buff);\r\n\r\n const out = {\r\n _: 'inputCheckPasswordSRP', \r\n srp_id: state.srp_id, \r\n A: new Uint8Array(a_for_hash), \r\n M1\r\n } as InputCheckPasswordSRP.inputCheckPasswordSRP;\r\n\r\n\r\n //log('out', bytesToHex(out.A), bytesToHex(out.M1));\r\n return out;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n// import { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport CryptoWorkerMethods, { CryptoMethods } from './crypto_methods';\r\n\r\n \r\nimport { aesDecryptSync, aesEncryptSync, bytesModPow, gzipUncompress, hash_pbkdf2, pqPrimeFactorization, rsaEncrypt, sha1HashSync, sha256HashSync } from './crypto_utils';\r\nimport { computeSRP } from './srp';\r\n \r\n\r\ntype Task = {\r\n taskId: number,\r\n task: string,\r\n args: any[]\r\n};\r\n\r\nclass CryptoWorker extends CryptoWorkerMethods {\r\n private webWorker: Worker | boolean = false;\r\n private taskId = 0;\r\n private awaiting: {\r\n [id: number]: {\r\n resolve: any,\r\n reject: any,\r\n taskName: string\r\n }\r\n } = {} as any;\r\n private pending: Array = [];\r\n private debug = false;\r\n\r\n private utils: CryptoMethods;\r\n\r\n constructor() {\r\n super();\r\n console.log('CW constructor');\r\n\r\n \r\n this.utils = {\r\n 'sha1-hash': sha1HashSync,\r\n 'sha256-hash': sha256HashSync,\r\n 'pbkdf2': hash_pbkdf2,\r\n 'aes-encrypt': aesEncryptSync,\r\n 'aes-decrypt': aesDecryptSync,\r\n 'rsa-encrypt': rsaEncrypt,\r\n 'factorize': pqPrimeFactorization,\r\n 'mod-pow': bytesModPow,\r\n 'gzipUncompress': gzipUncompress,\r\n 'computeSRP': computeSRP\r\n };\r\n\r\n // Promise.all([\r\n // import('./crypto_utils').then(utils => {\r\n // Object.assign(this.utils, {\r\n // 'sha1-hash': utils.sha1HashSync,\r\n // 'sha256-hash': utils.sha256HashSync,\r\n // 'pbkdf2': utils.hash_pbkdf2,\r\n // 'aes-encrypt': utils.aesEncryptSync,\r\n // 'aes-decrypt': utils.aesDecryptSync,\r\n // 'rsa-encrypt': utils.rsaEncrypt,\r\n // 'factorize': utils.pqPrimeFactorization,\r\n // 'mod-pow': utils.bytesModPow,\r\n // 'gzipUncompress': utils.gzipUncompress,\r\n // });\r\n // }),\r\n\r\n // import('./srp').then(srp => {\r\n // this.utils.computeSRP = srp.computeSRP;\r\n // })/* ,\r\n\r\n // import('../bin_utils').then(utils => {\r\n // this.utils.unzip = utils.gzipUncompress;\r\n // }) */\r\n // ]);\r\n\r\n return;\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n public performTaskWorker(task: string, ...args: any[]) {\r\n this.debug && console.log('CW start', task, args);\r\n\r\n \r\n // @ts-ignore\r\n return Promise.resolve(this.utils[task](...args));\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n}\r\n\r\nconst cryptoWorker = new CryptoWorker();\r\n// MOUNT_CLASS_TO.CryptoWorker = cryptoWorker;\r\nexport default cryptoWorker;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Awaited } from \"../../types\";\r\nimport type { aesEncryptSync, aesDecryptSync, sha256HashSync, sha1HashSync, bytesModPow, hash_pbkdf2, rsaEncrypt, pqPrimeFactorization, gzipUncompress } from \"./crypto_utils\";\r\nimport type { computeSRP } from \"./srp\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1-hash': typeof sha1HashSync,\r\n 'sha256-hash': typeof sha256HashSync,\r\n 'pbkdf2': typeof hash_pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof pqPrimeFactorization,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker(task: string, ...args: any[]): Promise;\r\n\r\n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\r\n return this.performTaskWorker>>(method, ...args as any[]);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport { longFromInts } from './bin_utils';\nimport { nextRandomUint } from '../../helpers/random';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { WorkerTaskVoidTemplate } from '../../types';\nimport { notifySomeone } from '../../helpers/context';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager {\n private lastMessageId: [number, number] = [0, 0];\n private timeOffset: number = 0;\n\n constructor() {\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = longFromInts(messageId[0], messageId[1]);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.lastMessageId = [0, 0];\n this.timeOffset = newTimeOffset;\n \n //console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n \n const task: ApplyServerTimeOffsetTask = {\n type: 'applyServerTimeOffset',\n payload: newTimeOffset\n };\n notifySomeone(task);\n \n\n return changed;\n }\n}\n\nconst timeManager = new TimeManager();\nMOUNT_CLASS_TO.timeManager = timeManager;\nexport default timeManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.3.7',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","export default function noop() {}\r\n","/*\r\n * https://github.com/morethanwords/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 * 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 {isObject, sortLongsArray} from './bin_utils';\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoworker';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport timeManager from './timeManager';\nimport networkerFactory from './networkerFactory';\nimport { logger, LogTypes } from '../logger';\nimport { InvokeApiOptions } from '../../types';\nimport { longToBytes } from '../crypto/crypto_utils';\nimport MTTransport from './transports/transport';\nimport { convertToUint8Array, bytesCmp, bytesToHex, bufferConcats } from '../../helpers/bytes';\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 \n \n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport { bigInt2str, rightShift_, str2bigInt } from '../../vendor/leemon';\nimport { forEachReverse } from '../../helpers/array';\nimport { ConnectionStatus } from './connectionStatus';\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 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?: {\n resolve: any,\n reject: any\n },\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 CONNECTION_TIMEOUT = 5000;\nconst DRAIN_TIMEOUT = 10000;\nlet invokeAfterMsgConstructor: number;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResends: Array = [];\n public connectionInited = false;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n \n \n \n \n \n \n \n \n \n\n private seqNo: number = 0;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n req_msg_id: MTLong,\n resend_msg_ids: Array\n } | null = null;\n\n private name: string;\n private log: ReturnType;\n \n public isOnline = false;\n public 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 //private disconnectDelay: number;\n //private pingPromise: CancellablePromise;\n //public onConnectionStatusChange: (online: boolean) => void;\n\n //private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n constructor(public dcId: number, private authKey: Uint8Array, private authKeyId: Uint8Array,\n serverSalt: Uint8Array, public transport: MTTransport, options: InvokeApiOptions = {}) {\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\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n //this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name, LogTypes.Log | /* LogTypes.Debug | */LogTypes.Error | LogTypes.Warn, undefined);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n\n \n \n \n \n \n \n \n \n \n \n \n \n //} else {\n (this.transport as TcpObfuscated).networker = this;\n //}\n \n\n // * handle outcoming dead socket, server will close the connection\n // if((this.transport as TcpObfuscated).networker) {\n // this.disconnectDelay = /* (this.transport as TcpObfuscated).retryTimeout */75;\n // //setInterval(this.sendPingDelayDisconnect, (this.disconnectDelay - 5) * 1000);\n // this.sendPingDelayDisconnect();\n // }\n\n if((this.transport as TcpObfuscated).connected) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = new Uint8Array(8).randomize();\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n \n sentMessage.msg_id = timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n /* if(DEBUG) {\n this.log('updateSentMessage', sentMessage.msg_id, sentMessageId);\n } */\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n \n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n \n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n \n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n \n serializer.storeMethod(method, params);\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n \n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n \n if(!this.connectionInited) { // this will call once for each new session\n ///////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find(m => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n \n const initConnection = Schema.API.methods.find(m => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n \n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(networkerFactory.userAgent || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(networkerFactory.language, 'lang_code');\n //serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n \n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find(m => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n \n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n \n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n \n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n \n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n \n return this.pushMessage(message, options);\n }\n\n public destroy() {\n //assumeType(this.transport);\n (this.transport as TcpObfuscated).destroy();\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n }\n }\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).handleClose();\n // }\n\n // return;\n // }\n\n // this.log('sendPingDelayDisconnect', this.sentPingTimes);\n\n // /* if(this.tt) clearTimeout(this.tt);\n // this.tt = self.setTimeout(() => { \n // (this.transport as any).ws.close(1000);\n // this.tt = 0;\n // }, this.disconnectDelay * 1000); */\n // /* this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {\n // noResponse: true,\n // notContentRelated: true\n // }); */\n // const deferred = this.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // /* if(!this.sentPingTimes || true) {\n // ++this.sentPingTimes; */\n // const startTime = Date.now();\n // this.wrapMtpCall('ping', {\n // ping_id: randomLong()\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n // //}\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // (this.transport as Socket).handleClose();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) 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.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // const startTime = Date.now();\n // this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // this.log.error('sendPingDelayDisconnect: catch, closing connection if exists');\n // (this.transport as TcpObfuscated).connection.close();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\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 \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 \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 \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 \n \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 const promise = new Promise((resolve, reject) => {\n this.sentMessages[message.msg_id] = Object.assign(message, options, options.notContentRelated \n ? undefined \n : {\n deferred: {resolve, reject}\n }\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\n if(!options.notContentRelated && !options.noResponse) {\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < CONNECTION_TIMEOUT) {\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 }, CONNECTION_TIMEOUT);\n \n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n --this.activeRequests;\n this.setDrainTimeout();\n });\n \n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n\n return promise;\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = self.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(networkerFactory.onConnectionStatusChange) {\n networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n // if((this.transport as TcpObfuscated).networker) {\n // this.sendPingDelayDisconnect();\n // }\n /* this.sentPingTimes = 0;\n this.sendPingDelayDisconnect(); */\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-hash', 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-hash', 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-hash', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n \n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n \n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n \n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n // this.log('scheduled', this.dcId, this.iii)\n\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 if(this.pendingResends.length) {\n const resendMsgIds = this.pendingResends.slice();\n const resendOpts: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true,\n messageId: '' // will set in wrapMtpMessage->pushMessage\n };\n\n //this.log('resendReq messages', resendMsgIds);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: resendMsgIds\n }, resendOpts);\n\n this.lastResendReq = {\n req_msg_id: resendOpts.messageId,\n resend_msg_ids: resendMsgIds\n };\n }\n \n let outMessage: MTPNetworker['sentMessages'][keyof MTPNetworker['sentMessages']];\n const messages: typeof outMessage[] = [];\n \n //const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n \n \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 \n \n \n \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 \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n \n \n \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 \n \n \n \n \n \n this.cleanupSent(); // ! WARNING\n \n \n \n \n \n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message),\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n \n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n \n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */new Uint8Array(paddingLength).randomize()/* .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 sendEncryptedRequest(message: MTMessage) {\n return this.getEncryptedOutput(message).then(requestData => {\n this.debug && this.log.debug('sendEncryptedRequest: launching message into space:', message, [message.msg_id].concat(message.inner || []));\n\n const promise: Promise = this.transport.send(requestData) as any;\n \n return promise;\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 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: ' + authKeyId.hex);\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 result.result = deserializer.fetchObject(type, field + '[result]');\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 \n \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 \n \n \n \n /* if(!this.isOnline) {\n return;\n } */\n\n this.performScheduledRequest();\n \n };\n\n this.nextReq = nextReq;\n\n if(delay) {\n this.nextReqTimeout = self.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n \n \n \n this.scheduleRequest();\n \n }\n \n private reqResendMessage(msgId: MTLong) {\n if(this.debug) {\n this.log.debug('Req resend', msgId);\n }\n\n this.pendingResends.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n // this.log('clean start', this.dcId/*, this.sentMessages*/)\n Object.keys(this.sentMessages).forEach((msgId) => {\n const message = this.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 this.sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(this.sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], this.sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete this.sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n \n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n //delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}) {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n \n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n for(const id in this.sentMessages) {\n const msg = this.sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\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 // * 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('process message', message, messageId, sessionId);\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 //const changedOffset = timeManager.applyServerTime(bigStringInt(messageId).shiftRight(32).toString(10));\n const bigInt = str2bigInt(messageId, 10);\n rightShift_(bigInt, 32);\n const changedOffset = timeManager.applyServerTime(+bigInt2str(bigInt, 10));\n if(message.error_code === 17 || changedOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n //this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n \n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n \n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n //this.updateSession();\n \n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n \n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && networkerFactory.updatesProcessor) {\n networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n \n case 'msgs_ack': {\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n \n case 'msg_detailed_info':\n if(!this.sentMessages[message.msg_id]) {\n this.ackMessage(message.answer_msg_id);\n break;\n }\n case 'msg_new_detailed_info':\n if(this.pendingAcks.indexOf(message.answer_msg_id)) {\n break;\n }\n this.reqResendMessage(message.answer_msg_id);\n break;\n \n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n if(this.lastResendReq && \n this.lastResendReq.req_msg_id === message.req_msg_id && \n this.pendingResends.length\n ) {\n for(const badMsgId of this.lastResendReq.resend_msg_ids) {\n const pos = this.pendingResends.indexOf(badMsgId);\n if(pos !== -1) {\n this.pendingResends.splice(pos, 1);\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 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 /* if(DEBUG) {\n this.log.debug('Rpc response', message.result, sentMessage);\n } */\n\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n ////this.log('Rpc set connectionInited to:', this.connectionInited);\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 doesn't require acknowledgments\n if((this.transport as TcpObfuscated).networker) {\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 }\n\n break;\n }\n \n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n \n if(networkerFactory.updatesProcessor !== null) {\n networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/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 { copy } from \"./object\";\r\n\r\nexport function listMergeSorted(list1: any[] = [], list2: any[] = []) {\r\n const result = copy(list1);\r\n\r\n const minId = list1.length ? list1[list1.length - 1] : 0xFFFFFFFF;\r\n for(let i = 0; i < list2.length; i++) {\r\n if(list2[i] < minId) {\r\n result.push(list2[i]);\r\n }\r\n }\r\n\r\n return result;\r\n} */\r\n\r\nexport const accumulate = (arr: number[], initialValue: number) => arr.reduce((acc, value) => acc + value, initialValue);\r\n\r\nexport function indexOfAndSplice(array: Array, item: T) {\r\n const idx = array.indexOf(item);\r\n const spliced = idx !== -1 && array.splice(idx, 1);\r\n return spliced && spliced[0];\r\n}\r\n\r\nexport function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\r\n const out: typeof array = [];\r\n let idx = -1;\r\n while((idx = array.findIndex(verify)) !== -1) {\r\n out.push(array.splice(idx, 1)[0]);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\r\n for(let length = array.length, i = length - 1; i >= 0; --i) {\r\n callback(array[i], i, array);\r\n }\r\n};\r\n\r\nexport function insertInDescendSortedArray(array: Array, element: T, property: K, pos?: number) {\r\n const sortProperty: number = element[property];\r\n\r\n if(pos === undefined) {\r\n pos = array.indexOf(element);\r\n if(pos !== -1) {\r\n const prev = array[pos - 1];\r\n const next = array[pos + 1];\r\n if((!prev || prev[property] >= sortProperty) && (!next || next[property] <= sortProperty)) {\r\n // console.warn('same pos', pos, sortProperty, prev, next);\r\n return pos;\r\n }\r\n \r\n array.splice(pos, 1);\r\n }\r\n }\r\n\r\n const len = array.length;\r\n if(!len || sortProperty <= array[len - 1][property]) {\r\n return array.push(element) - 1;\r\n } else if(sortProperty >= array[0][property]) {\r\n array.unshift(element);\r\n return 0;\r\n } else {\r\n for(let i = 0; i < len; i++) {\r\n if(sortProperty > array[i][property]) {\r\n array.splice(i, 0, element);\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n console.error('wtf', array, element);\r\n return array.indexOf(element);\r\n}\r\n\r\nexport function filterUnique>(arr: T): T {\r\n return [...new Set(arr)] as T;\r\n}\r\n\r\nexport function flatten(arr: T[][]): T[] {\r\n return arr.reduce((acc, val) => (acc.push(...val), acc), []);\r\n}\r\n","/*\r\n * https://github.com/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 MTTransport from \"./transports/transport\";\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport class NetworkerFactory {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n public onConnectionStatusChange: (info: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n public userAgent = navigator.userAgent;\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n const idx = this.networkers.indexOf(networker);\r\n if(idx !== -1) {\r\n this.networkers.splice(idx, 1);\r\n }\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, transport: MTTransport, options: InvokeApiOptions) {\r\n //console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(dcId, authKey, authKeyId, serverSalt, transport, 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 forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst networkerFactory = new NetworkerFactory();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.networkerFactory = networkerFactory);\r\nexport default networkerFactory;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\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\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase> {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = [];\r\n\r\n /* let a = e.wm.get(this)[name];\r\n if(!a) return arr;\r\n const listeners = [...a]; */\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 arr.push(listener.callback(...args));\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n\r\n /* for(let i = 0, length = listeners.length; i < length; ++i) {\r\n const listener = listeners[i];\r\n arr.push(listener.callback(...args));\r\n\r\n if(listener.once) {\r\n listeners.splice(i, 1);\r\n --i;\r\n --length;\r\n }\r\n } */\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\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\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import aesjs from 'aes-js';\r\nimport AES from \"@cryptography/aes\";\r\nimport { bytesFromWordss } from \"../../../helpers/bytes\";\r\nimport { Codec } from \"./codec\";\r\n\r\nclass Counter {\r\n _counter: Uint8Array;\r\n\r\n constructor(initialValue: Uint8Array) {\r\n this._counter = initialValue;\r\n }\r\n\r\n increment() {\r\n for(let i = 15; i >= 0; i--) {\r\n if(this._counter[i] === 255) {\r\n this._counter[i] = 0;\r\n } else {\r\n this._counter[i]++;\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass CTR {\r\n _counter: Counter;\r\n _remainingCounter: Uint8Array = null;\r\n _remainingCounterIndex = 16;\r\n _aes: AES;\r\n\r\n constructor(key: Uint8Array, counter: Uint8Array) {\r\n this._counter = new Counter(counter);\r\n this._aes = new AES(key);\r\n }\r\n\r\n update(payload: Uint8Array) {\r\n const encrypted = payload.slice();\r\n\r\n for(let i = 0; i < encrypted.length; i++) {\r\n if(this._remainingCounterIndex === 16) {\r\n this._remainingCounter = new Uint8Array(bytesFromWordss(this._aes.encrypt(this._counter._counter)));\r\n this._remainingCounterIndex = 0;\r\n this._counter.increment();\r\n }\r\n\r\n encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];\r\n }\r\n\r\n return encrypted;\r\n }\r\n}\r\n\r\n/* \r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* public enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n public dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n public encNew: CTR;\r\n public decNew: CTR;\r\n\r\n public init(codec: Codec) {\r\n const initPayload = new Uint8Array(64);\r\n initPayload.randomize();\r\n \r\n while(true) {\r\n let val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | (initPayload[0]);\r\n let 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 initPayload.randomize();\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 = initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n\r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n this.encNew = new CTR(encKey, encIv);\r\n this.decNew = new CTR(decKey, decIv);\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = this.encode(initPayload);\r\n\r\n //console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n } */\r\n public encode(payload: Uint8Array) {\r\n return this.encNew.update(payload);\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.decNew.update(payload);\r\n }\r\n /* public encode(payload: Uint8Array) {\r\n let res = this.encNew.encrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.decNew.decrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n } */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Codec } from \"./codec\";\r\n\r\nexport class IntermediatePacketCodec implements Codec {\r\n public tag = 0xee;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n //private lol = 0;\r\n\r\n public encodePacket(data: Uint8Array) {\r\n if((data.length % 4) !== 0) {\r\n console.error('Encode error!', data.length, data);\r\n }\r\n\r\n const len = data.length;\r\n const header = new Uint8Array(new Int32Array([/* ++this.lol >= 25 ? 0x80000001 : */len]).buffer);\r\n\r\n //console.log('got nobody cause im braindead', header, len, /* data, */data.buffer.byteLength === data.length);\r\n return header.concat(data);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n const length = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);\r\n\r\n return data.slice(4, 4 + length);\r\n }\r\n}\r\n\r\nexport default new IntermediatePacketCodec();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from \"../../../config/modes\";\nimport { logger, LogTypes } from \"../../logger\";\nimport MTPNetworker from \"../networker\";\nimport Obfuscation from \"./obfuscation\";\nimport MTTransport, { MTConnection, MTConnectionConstructable } from \"./transport\";\nimport intermediatePacketCodec from './intermediate';\nimport { ConnectionStatus } from \"../connectionStatus\";\n\nexport default class TcpObfuscated implements MTTransport {\n private codec = intermediatePacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n private connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n\n //private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(private Connection: MTConnectionConstructable, \n private dcId: number, \n private url: string, \n private logSuffix: string, \n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n \n this.connect();\n }\n\n private onOpen = () => {\n this.connected = true;\n\n const initPayload = this.obfuscation.init(this.codec);\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n } else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n }\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = (buffer: ArrayBuffer) => {\n let data = this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n //this.pending = this.pending.filter(p => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then(response => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n //this.releasePending();\n }).catch(err => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n //this.dd();\n return;\n }\n\n //console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', data.hex);\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n \n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n \n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = self.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n 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\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n //this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n //this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = this.connected ? this.encodeBody(body) : undefined;\n\n //return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private releasePending(/* tt = false */) {\n if(!this.connected) {\n //this.connect();\n return;\n }\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n //this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n //for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n /* if(this.ws.bufferedAmount) {\n break;\n } */\n\n const pending = this.pending[i];\n const {body, bodySent} = pending;\n let encoded = pending.encoded;\n if(body && !bodySent) {\n\n //this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n /* if(this.ws.bufferedAmount) {\n this.log.error('bufferedAmount:', this.ws.bufferedAmount);\n } */\n\n /* if(this.ws.readyState !== this.ws.OPEN) {\n this.log.error('ws is closed?');\n this.connected = false;\n break;\n } */\n\n if(!encoded) {\n encoded = pending.encoded = this.encodeBody(body);\n }\n\n //this.lol.push(body);\n //setTimeout(() => {\n this.connection.send(encoded);\n //}, 100);\n //this.dd();\n \n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n //delete pending.body;\n }\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { notifyAll } from \"../../../helpers/context\";\r\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\r\nimport { WorkerTaskVoidTemplate } from \"../../../types\";\r\nimport { MTConnection } from \"./transport\";\r\n\r\nlet socketId = 0;\r\nexport interface SocketProxyTask extends WorkerTaskVoidTemplate {\r\n type: 'socketProxy',\r\n payload: SocketProxySetupTask | SocketProxySendTask | SocketProxyCloseTask\r\n};\r\n\r\nexport interface SocketProxySetupTask extends WorkerTaskVoidTemplate {\r\n type: 'setup',\r\n payload: {\r\n dcId: number,\r\n url: string,\r\n logSuffix: string\r\n },\r\n id: number\r\n};\r\n\r\nexport interface SocketProxySendTask extends WorkerTaskVoidTemplate {\r\n type: 'send',\r\n payload: Uint8Array,\r\n id: number\r\n};\r\n\r\nexport interface SocketProxyCloseTask extends WorkerTaskVoidTemplate {\r\n type: 'close',\r\n id: number\r\n};\r\n\r\n \r\nexport default class SocketProxied extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private id: number;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n this.id = ++socketId;\r\n socketsProxied.set(this.id, this);\r\n\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'setup', \r\n payload: {\r\n dcId, \r\n url,\r\n logSuffix\r\n },\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public send(payload: Uint8Array) {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy', \r\n payload: {\r\n type: 'send',\r\n payload,\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public close() {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'close',\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n}\r\n \r\n\r\nexport const socketsProxied: Map = new Map();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport MTTransport, { MTConnectionConstructable } from './transports/transport';\r\nimport Modes from '../../config/modes';\r\n\r\n \r\n \r\n \r\n\r\n \r\nimport Socket from './transports/websocket';\r\nimport TcpObfuscated from './transports/tcpObfuscated';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport { IS_WEB_WORKER } from '../../helpers/context';\r\nimport SocketProxied from './transports/socketProxied';\r\nimport App from '../../config/app';\r\n \r\n\r\nexport type TransportType = 'websocket' | 'https' | 'http';\r\nexport type ConnectionType = 'client' | 'download' | 'upload';\r\ntype Servers = {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: number]: MTTransport[]\r\n }\r\n }\r\n};\r\n\r\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\r\n\r\nexport class DcConfigurator {\r\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\r\n\r\n private dcOptions = Modes.test\r\n ? [\r\n {id: 1, host: '149.154.175.10', port: 80},\r\n {id: 2, host: '149.154.167.40', port: 80},\r\n {id: 3, host: '149.154.175.117', port: 80}\r\n ]\r\n : [\r\n {id: 1, host: '149.154.175.50', port: 80},\r\n {id: 2, host: '149.154.167.50', port: 80},\r\n {id: 3, host: '149.154.175.100', port: 80},\r\n {id: 4, host: '149.154.167.91', port: 80},\r\n {id: 5, host: '149.154.171.5', port: 80}\r\n ];\r\n\r\n public chosenServers: Servers = {} as any;\r\n\r\n \r\n private transportSocket = (dcId: number, connectionType: ConnectionType, suffix: string) => {\r\n const path = 'apiws' + TEST_SUFFIX;\r\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n\r\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\r\n\r\n const oooohLetMeLive: MTConnectionConstructable = (IS_SAFARI && IS_WEB_WORKER && typeof(SocketProxied) !== 'undefined') /* || true */ ? SocketProxied : Socket;\r\n\r\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\r\n };\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n public chooseServer(dcId: number, connectionType: ConnectionType = 'client', transportType: TransportType = 'websocket', reuse = true) {\r\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\r\n connectionType = 'client';\r\n } */\r\n\r\n if(!this.chosenServers.hasOwnProperty(transportType)) {\r\n this.chosenServers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const servers = this.chosenServers[transportType][connectionType];\r\n\r\n if(!(dcId in servers)) {\r\n servers[dcId] = [];\r\n }\r\n\r\n const transports = servers[dcId];\r\n\r\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\r\n let transport: MTTransport;\r\n\r\n const suffix = connectionType === 'client' ? '' : '-1';\r\n\r\n \r\n \r\n \r\n transport = this.transportSocket(dcId, connectionType, suffix);\r\n \r\n \r\n \r\n \r\n if(!transport) {\r\n console.error('No chosenServer!', dcId);\r\n return null;\r\n }\r\n \r\n if(reuse) {\r\n transports.push(transport);\r\n }\r\n \r\n return transport;\r\n }\r\n \r\n return transports[0];\r\n }\r\n \r\n public static removeTransport(obj: any, transport: T) {\r\n for(const transportType in obj) {\r\n // @ts-ignore\r\n for(const connectionType in obj[transportType]) {\r\n // @ts-ignore\r\n for(const dcId in obj[transportType][connectionType]) {\r\n // @ts-ignore\r\n const transports: T[] = obj[transportType][connectionType][dcId];\r\n const idx = transports.indexOf(transport);\r\n if(idx !== -1) {\r\n transports.splice(idx, 1);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new DcConfigurator();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { TLSerialization } from \"./tl_utils\";\r\nimport CryptoWorker from '../crypto/cryptoworker';\r\nimport { bytesFromHex, bytesToHex } from \"../../helpers/bytes\";\r\nimport { bigInt2str, str2bigInt } from \"../../vendor/leemon\";\r\nimport Modes from \"../../config/modes\";\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\r\n\r\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n * \r\n * \r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via \r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map(keyParsed => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return CryptoWorker.invokeCrypto('sha1-hash', 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 //fingerprintHex = bigStringInt(fingerprints[i]).toString(16);\r\n let fingerprintHex = bigInt2str(str2bigInt(fingerprints[i], 10), 16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n //console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { TLSerialization, TLDeserialization } from \"./tl_utils\";\nimport dcConfigurator from \"./dcConfigurator\";\nimport rsaKeysManager from \"./rsaKeysManager\";\nimport timeManager from \"./timeManager\";\n\nimport CryptoWorker from \"../crypto/cryptoworker\";\n\nimport { logger, LogTypes } from \"../logger\";\nimport { bytesCmp, bytesToHex, bytesFromHex, bytesXor } from \"../../helpers/bytes\";\nimport DEBUG from \"../../config/debug\";\nimport { cmp, int2bigInt, one, pow, str2bigInt, sub } from \"../../vendor/leemon\";\nimport { addPadding } from \"./bin_utils\";\nimport { Awaited } from \"../../types\";\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 localTry?: number\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer {\n private cached: {\n [dcId: number]: Promise\n } = {};\n \n private log: ReturnType;\n \n constructor() {\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n \n private sendPlainRequest(dcId: number, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n \n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n \n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = dcConfigurator.chooseServer(dcId);\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', auth.nonce.hex);\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 = new Uint8Array(32).randomize();\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 = new Uint8Array(32).randomize();\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256-hash', 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-hash', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = str2bigInt(bytesToHex(keyAesEncrypted), 16);\n const publicKeyModulusBigInt = str2bigInt(auth.publicKey.modulus, 16);\n\n if(cmp(keyAesEncryptedBigInt, 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-hash', 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-hash', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1-hash', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n \n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1-hash', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1-hash', 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-hash', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1-hash mismatch');\n }\n \n timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n \n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n \n const _gABigInt = str2bigInt(bytesToHex(gA), 16);\n const _dhPrimeBigInt = str2bigInt(dhPrimeHex, 16);\n\n if(cmp(_gABigInt, one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(cmp(_gABigInt, sub(_dhPrimeBigInt, 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 _two = int2bigInt(2, 32, 0);\n const _twoPow = pow(_two, 2048 - 64);\n\n if(cmp(_gABigInt, _twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(cmp(_gABigInt, sub(_dhPrimeBigInt, _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 = new Uint8Array(256).randomize();\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-hash', 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-hash', 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-hash', 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-hash', 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-hash', 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 public async auth(dcId: number): Promise {\n if(dcId in this.cached) {\n return this.cached[dcId];\n }\n \n const nonce = /* fNonce ? fNonce : */new Uint8Array(16).randomize();\n /* const nonce = new Array(16);\n MTProto.secureRandom.nextBytes(nonce); */\n \n if(!dcConfigurator.chooseServer(dcId)) {\n throw new Error('[MT] No server found for dc ' + dcId);\n }\n\n // await new Promise((resolve) => setTimeout(resolve, 2e3));\n\n const auth: AuthOptions = {dcId, nonce, localTry: 1};\n \n try {\n const promise = this.sendReqPQ(auth);\n this.cached[dcId] = promise;\n return await promise;\n } catch(err) {\n if(/* err.originalError === -404 && */auth.localTry <= 3) {\n return this.sendReqPQ({\n dcId: auth.dcId, \n nonce: new Uint8Array(16).randomize(),\n localTry: auth.localTry + 1\n });\n }\n\n delete this.cached[dcId];\n throw err;\n }\n }\n}\n\nexport default new Authorizer();\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}","/*\r\n * https://github.com/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 function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.addEventListener('loadend', (e) => resolve(e.target.result));\r\n reader[method](blob);\r\n });\r\n}\r\n\r\nexport function readBlobAsText(blob: Blob) {\r\n return readBlobAs(blob, 'readAsText');\r\n}\r\n\r\nexport function readBlobAsDataURL(blob: Blob) {\r\n return readBlobAs(blob, 'readAsDataURL');\r\n}\r\n\r\nexport function readBlobAsArrayBuffer(blob: Blob) {\r\n return readBlobAs(blob, 'readAsArrayBuffer');\r\n}\r\n\r\nexport function readBlobAsUint8Array(blob: Blob) {\r\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\r\n}\r\n\r\nexport function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\r\n let blob;\r\n const safeMimeType = blobSafeMimeType(mimeType);\r\n try {\r\n blob = new Blob(blobParts, {type: safeMimeType});\r\n } catch(e) {\r\n // @ts-ignore\r\n let bb = new BlobBuilder;\r\n blobParts.forEach((blobPart: any) => {\r\n bb.append(blobPart);\r\n });\r\n blob = bb.getBlob(safeMimeType);\r\n }\r\n return blob;\r\n}\r\n\r\n// https://www.iana.org/assignments/media-types/media-types.xhtml\r\nexport function blobSafeMimeType(mimeType: string) {\r\n if([\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/gif',\r\n 'image/webp',\r\n 'image/bmp',\r\n 'video/mp4',\r\n 'video/webm',\r\n 'video/quicktime',\r\n 'audio/ogg',\r\n 'audio/mpeg',\r\n 'audio/mp4',\r\n 'application/json',\r\n 'application/pdf'\r\n ].indexOf(mimeType) === -1) {\r\n return 'application/octet-stream';\r\n }\r\n\r\n return mimeType;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport { safeAssign } from '../helpers/object';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.forEach(storage => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map(name => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map(storage => storage.name)));\r\n const promises = dbNames.map(dbName => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[]) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct([blob]) as Blob;\r\n }\r\n\r\n return this.save(fileName, blob);\r\n }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function copy(obj: T): T {\r\n //in case of premitives\r\n if(obj === null || typeof(obj) !== \"object\") {\r\n return obj;\r\n }\r\n \r\n //date objects should be \r\n if(obj instanceof Date) {\r\n return new Date(obj.getTime()) as any;\r\n }\r\n \r\n //handle Array\r\n if(Array.isArray(obj)) {\r\n // @ts-ignore\r\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\r\n return clonedArr;\r\n }\r\n \r\n //lastly, handle objects\r\n // @ts-ignore\r\n let clonedObj = new obj.constructor();\r\n for(var prop in obj){\r\n if(obj.hasOwnProperty(prop)) {\r\n clonedObj[prop] = copy(obj[prop]);\r\n }\r\n }\r\n return clonedObj;\r\n}\r\n\r\nexport function deepEqual(x: any, y: any): boolean {\r\n const ok = Object.keys, tx = typeof x, ty = typeof y;\r\n return x && y && tx === 'object' && tx === ty ? (\r\n ok(x).length === ok(y).length &&\r\n ok(x).every(key => deepEqual(x[key], y[key]))\r\n ) : (x === y);\r\n}\r\n\r\nexport function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\r\n //const perf = performance.now();\r\n const props = {writable: true, configurable: true};\r\n const out: {[name in keyof T]?: typeof props} = {};\r\n names.forEach(name => {\r\n if(!obj.hasOwnProperty(name)) {\r\n out[name] = props;\r\n }\r\n });\r\n Object.defineProperties(obj, out);\r\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\r\n}\r\n\r\nexport function getObjectKeysAndSort(object: {[key: string]: any}, sort: 'asc' | 'desc' = 'asc') {\r\n if(!object) return [];\r\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map(i => +i);\r\n if(sort === 'asc') return ids.sort((a, b) => a - b);\r\n else return ids.sort((a, b) => b - a);\r\n}\r\n\r\nexport function safeReplaceObject(wasObject: any, newObject: any) {\r\n if(!wasObject) {\r\n return newObject;\r\n }\r\n\r\n for(var key in wasObject) {\r\n if(!newObject.hasOwnProperty(key)) {\r\n delete wasObject[key];\r\n }\r\n }\r\n\r\n for(var key in newObject) {\r\n //if (newObject.hasOwnProperty(key)) { // useless\r\n wasObject[key] = newObject[key];\r\n //}\r\n }\r\n \r\n return wasObject;\r\n}\r\n\r\n/**\r\n * Will be used for FILE_REFERENCE_EXPIRED\r\n * @param key \r\n * @param wasObject \r\n * @param newObject \r\n */\r\nexport function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\r\n if('byteLength' in newObject[key]) { // Uint8Array\r\n newObject[key] = [...newObject[key]];\r\n }\r\n\r\n if(wasObject && wasObject[key] !== newObject[key]) {\r\n wasObject[key].length = newObject[key].length;\r\n (newObject[key] as any[]).forEach((v, i) => {\r\n wasObject[key][i] = v;\r\n });\r\n\r\n /* wasObject[key].set(newObject[key]); */\r\n newObject[key] = wasObject[key];\r\n }\r\n}\r\n\r\nexport function isObject>(object: any): object is T {\r\n return typeof(object) === 'object' && object !== null;\r\n}\r\n\r\nexport function getDeepProperty(object: any, key: string) {\r\n const splitted = key.split('.');\r\n let o: any = object;\r\n splitted.forEach(key => {\r\n if(!key) {\r\n return;\r\n }\r\n \r\n // @ts-ignore\r\n o = o[key];\r\n });\r\n \r\n return o;\r\n}\r\n\r\nexport function setDeepProperty(object: any, key: string, value: any) {\r\n const splitted = key.split('.');\r\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\r\n}\r\n\r\nexport function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\r\n for(const key in initObject) {\r\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\r\n currentObject[key] = copy(initObject[key]);\r\n onReplace && onReplace(previousKey || key);\r\n } else if(isObject(initObject[key])) {\r\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\r\n }\r\n }\r\n}\r\n\r\nexport function safeAssign(object: T, fromObject: any) {\r\n if(fromObject) {\r\n for(let i in fromObject) {\r\n if(fromObject[i] !== undefined) {\r\n // @ts-ignore\r\n object[i] = fromObject[i];\r\n }\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { UserAuth } from './mtproto_config';\r\nimport sessionStorage from '../sessionStorage';\r\nimport MTPNetworker, { MTMessage } from './networker';\r\nimport { isObject } from './bin_utils';\r\nimport networkerFactory from './networkerFactory';\r\n//import { telegramMeWebService } from './mtproto';\r\nimport authorizer from './authorizer';\r\nimport dcConfigurator, { ConnectionType, DcConfigurator, TransportType } from './dcConfigurator';\r\nimport { logger } from '../logger';\r\nimport type { DcAuthKey, DcId, DcServerSalt, InvokeApiOptions } from '../../types';\r\nimport type { MethodDeclMap } from '../../layer';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\nimport { bytesFromHex, bytesToHex } from '../../helpers/bytes';\r\n//import { clamp } from '../../helpers/number';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport App from '../../config/app';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport IDBStorage from '../idb';\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport ctx from '../../environment/ctx';\r\nimport noop from '../../helpers/noop';\r\n\r\n \r\n \r\n \r\n\r\n/* var networker = apiManager.cachedNetworkers.websocket.upload[2];\r\nnetworker.wrapMtpMessage({\r\n _: 'msgs_state_req',\r\n msg_ids: [\"6888292542796810828\"]\r\n}, {\r\n notContentRelated: true\r\n}).then(res => {\r\n console.log('status', res);\r\n}); */\r\n\r\n//console.error('apiManager included!');\r\n// TODO: если запрос словил флуд, нужно сохранять его параметры и возвращать тот же промис на новый такой же запрос, например - загрузка истории\r\n\r\nexport type ApiError = Partial<{\r\n code: number,\r\n type: string,\r\n description: string,\r\n originalError: any,\r\n stack: string,\r\n handled: boolean,\r\n input: string,\r\n message: ApiError\r\n}>;\r\n\r\n/* class RotatableArray {\r\n public array: Array = [];\r\n private lastIndex = -1;\r\n\r\n public get() {\r\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\r\n return this.array[this.lastIndex];\r\n }\r\n} */\r\n\r\nexport class ApiManager {\r\n private cachedNetworkers: {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: number]: MTPNetworker[]\r\n }\r\n }\r\n } = {} as any;\r\n \r\n private cachedExportPromise: {[x: number]: Promise} = {};\r\n private gettingNetworkers: {[dcIdAndType: string]: Promise} = {};\r\n private baseDcId: DcId = 0 as DcId;\r\n \r\n //public telegramMeNotified = false;\r\n\r\n private log: ReturnType = logger('API');\r\n\r\n private afterMessageTempIds: {\r\n [tempId: string]: {\r\n messageId: string,\r\n promise: Promise\r\n }\r\n } = {};\r\n\r\n //private lol = false;\r\n \r\n // constructor() {\r\n //MtpSingleInstanceService.start();\r\n \r\n /* AppStorage.get('dc').then((dcId) => {\r\n if(dcId) {\r\n this.baseDcId = dcId;\r\n }\r\n }); */\r\n // }\r\n \r\n /* public telegramMeNotify(newValue: boolean) {\r\n if(this.telegramMeNotified !== newValue) {\r\n this.telegramMeNotified = newValue;\r\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\r\n }\r\n } */\r\n\r\n public async getBaseDcId() {\r\n if(this.baseDcId) {\r\n return this.baseDcId;\r\n }\r\n\r\n const baseDcId = await sessionStorage.get('dc');\r\n if(!this.baseDcId) {\r\n if(!baseDcId) {\r\n this.setBaseDcId(App.baseDcId);\r\n } else {\r\n this.baseDcId = baseDcId;\r\n }\r\n }\r\n\r\n return this.baseDcId;\r\n }\r\n \r\n public async setUserAuth(userAuth: UserAuth) {\r\n if(!userAuth.dcID) {\r\n const baseDcId = await this.getBaseDcId();\r\n userAuth.dcID = baseDcId;\r\n }\r\n\r\n sessionStorage.set({\r\n user_auth: userAuth\r\n });\r\n \r\n //this.telegramMeNotify(true);\r\n\r\n \r\n \r\n \r\n }\r\n\r\n public setBaseDcId(dcId: DcId) {\r\n const wasDcId = this.baseDcId;\r\n if(wasDcId) { // if migrated set ondrain\r\n this.getNetworker(wasDcId).then(networker => {\r\n this.setOnDrainIfNeeded(networker);\r\n });\r\n }\r\n\r\n this.baseDcId = dcId;\r\n\r\n sessionStorage.set({\r\n dc: this.baseDcId\r\n });\r\n }\r\n \r\n public async logOut() {\r\n const storageKeys: Array = [];\r\n \r\n const prefix = 'dc';\r\n for(let dcId = 1; dcId <= 5; dcId++) {\r\n storageKeys.push(prefix + dcId + '_auth_key' as any);\r\n }\r\n \r\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\r\n const storageResult = await Promise.all(storageKeys.map(key => sessionStorage.get(key)));\r\n \r\n const logoutPromises: Promise[] = [];\r\n for(let i = 0; i < storageResult.length; i++) {\r\n if(storageResult[i]) {\r\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\r\n }\r\n }\r\n\r\n const clear = () => {\r\n //console.error('apiManager: logOut clear');\r\n \r\n this.baseDcId = undefined;\r\n //this.telegramMeNotify(false);\r\n IDBStorage.closeDatabases();\r\n self.postMessage({type: 'clear'});\r\n };\r\n\r\n setTimeout(clear, 1e3);\r\n\r\n //return;\r\n \r\n return Promise.all(logoutPromises).catch((error) => {\r\n error.handled = true;\r\n }).finally(clear)/* .then(() => {\r\n location.pathname = '/';\r\n }) */;\r\n }\r\n \r\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\r\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\r\n //const connectionType: ConnectionType = 'client';\r\n\r\n \r\n \r\n \r\n \r\n \r\n // @ts-ignore\r\n const transportType = 'websocket';\r\n \r\n\r\n if(!this.cachedNetworkers.hasOwnProperty(transportType)) {\r\n this.cachedNetworkers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const cache = this.cachedNetworkers[transportType][connectionType];\r\n if(!(dcId in cache)) {\r\n cache[dcId] = [];\r\n }\r\n \r\n const networkers = cache[dcId];\r\n // @ts-ignore\r\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (connectionType === 'download' ? 3 : 3);\r\n if(networkers.length >= maxNetworkers) {\r\n let i = networkers.length - 1, found = false;\r\n for(; i >= 0; --i) {\r\n if(networkers[i].isOnline) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n \r\n const networker = found ? networkers.splice(i, 1)[0] : networkers.pop();\r\n networkers.unshift(networker);\r\n return Promise.resolve(networker);\r\n }\r\n \r\n const getKey = [dcId, transportType, connectionType].join('-');\r\n if(this.gettingNetworkers[getKey]) {\r\n return this.gettingNetworkers[getKey];\r\n }\r\n\r\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\r\n \r\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map(key => sessionStorage.get(key)))\r\n .then(async([authKeyHex, serverSaltHex]) => {\r\n const transport = dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client');\r\n let networker: MTPNetworker;\r\n if(authKeyHex && authKeyHex.length === 512) {\r\n if(!serverSaltHex || serverSaltHex.length !== 16) {\r\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\r\n }\r\n \r\n const authKey = bytesFromHex(authKeyHex);\r\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1-hash', authKey)).slice(-8);\r\n const serverSalt = bytesFromHex(serverSaltHex);\r\n \r\n networker = networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, transport, options);\r\n } else {\r\n try { // if no saved state\r\n const auth = await authorizer.auth(dcId);\r\n \r\n const storeObj = {\r\n [ak]: bytesToHex(auth.authKey),\r\n [ss]: bytesToHex(auth.serverSalt)\r\n };\r\n \r\n sessionStorage.set(storeObj);\r\n \r\n networker = networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, transport, options);\r\n } catch(error) {\r\n this.log('Get networker error', error, (error as Error).stack);\r\n delete this.gettingNetworkers[getKey];\r\n throw error;\r\n }\r\n }\r\n\r\n /* networker.onConnectionStatusChange = (online) => {\r\n console.log('status:', online);\r\n }; */\r\n \r\n delete this.gettingNetworkers[getKey];\r\n networkers.unshift(networker);\r\n this.setOnDrainIfNeeded(networker);\r\n return networker;\r\n });\r\n }\r\n\r\n public setOnDrainIfNeeded(networker: MTPNetworker) {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n const checkPromise: Promise = networker.isFileNetworker ? \r\n Promise.resolve(true) : \r\n this.getBaseDcId().then(baseDcId => networker.dcId !== baseDcId);\r\n checkPromise.then(canRelease => {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n if(canRelease) {\r\n networker.onDrain = () => {\r\n this.log('networker drain', networker.dcId);\r\n\r\n networker.onDrain = undefined;\r\n networker.destroy();\r\n networkerFactory.removeNetworker(networker);\r\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\r\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, networker.transport);\r\n };\r\n\r\n networker.setDrainTimeout();\r\n }\r\n });\r\n }\r\n \r\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\r\n ///////this.log('Invoke api', method, params, options);\r\n\r\n /* if(!this.lol) {\r\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\r\n this.lol = true;\r\n } */\r\n\r\n const deferred = deferredPromise();\r\n\r\n let {afterMessageId, prepareTempMessageId} = options;\r\n if(prepareTempMessageId) {\r\n deferred.then(() => {\r\n delete this.afterMessageTempIds[prepareTempMessageId];\r\n });\r\n }\r\n\r\n if(MOUNT_CLASS_TO) {\r\n const startTime = Date.now();\r\n const interval = ctx.setInterval(() => {\r\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\r\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\r\n }\r\n //this.cachedUploadNetworkers[2].requestMessageStatus();\r\n }, 5e3);\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearInterval(interval);\r\n });\r\n }\r\n\r\n const rejectPromise = (error: ApiError) => {\r\n if(!error) {\r\n error = {type: 'ERROR_EMPTY'};\r\n } else if(!isObject(error)) {\r\n error = {message: error};\r\n }\r\n \r\n deferred.reject(error);\r\n\r\n if((error.code === 401 && error.type === 'SESSION_REVOKED') || \r\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\r\n this.logOut();\r\n }\r\n\r\n if(options.ignoreErrors) {\r\n return;\r\n }\r\n \r\n if(error.code === 406) {\r\n error.handled = true;\r\n }\r\n \r\n if(!options.noErrorBox) {\r\n error.input = method;\r\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\r\n setTimeout(() => {\r\n if(!error.handled) {\r\n if(error.code === 401) {\r\n this.logOut();\r\n } else {\r\n // ErrorService.show({error: error}); // WARNING\r\n }\r\n \r\n error.handled = true;\r\n }\r\n }, 100);\r\n }\r\n };\r\n \r\n let dcId: DcId;\r\n \r\n let cachedNetworker: MTPNetworker;\r\n let stack = (new Error()).stack || 'empty stack';\r\n const performRequest = (networker: MTPNetworker) => {\r\n if(afterMessageId) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n if(after) {\r\n options.afterMessageId = after.messageId;\r\n }\r\n }\r\n\r\n const promise = (cachedNetworker = networker).wrapApiCall(method, params, options);\r\n\r\n if(prepareTempMessageId) {\r\n this.afterMessageTempIds[prepareTempMessageId] = {\r\n messageId: (options as MTMessage).messageId,\r\n promise: deferred\r\n };\r\n }\r\n\r\n return promise.then(deferred.resolve, (error: ApiError) => {\r\n //if(!options.ignoreErrors) {\r\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\r\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\r\n }\r\n \r\n if(error.code === 401 && this.baseDcId === dcId) {\r\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\r\n sessionStorage.delete('dc')\r\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\r\n //this.telegramMeNotify(false);\r\n }\r\n \r\n rejectPromise(error);\r\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\r\n if(this.cachedExportPromise[dcId] === undefined) {\r\n const promise = new Promise((exportResolve, exportReject) => {\r\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\r\n this.invokeApi('auth.importAuthorization', {\r\n id: exportedAuth.id,\r\n bytes: exportedAuth.bytes\r\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\r\n }, exportReject);\r\n });\r\n \r\n this.cachedExportPromise[dcId] = promise;\r\n }\r\n \r\n this.cachedExportPromise[dcId].then(() => {\r\n //(cachedNetworker = networker).wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n this.invokeApi(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else if(error.code === 303) {\r\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n if(options.dcId) {\r\n options.dcId = newDcId;\r\n } else {\r\n this.setBaseDcId(newDcId);\r\n }\r\n \r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n }\r\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\r\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n } else if(!options.rawError && error.code === 420) {\r\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\r\n \r\n if(waitTime > (options.floodMaxTimeout !== undefined ? options.floodMaxTimeout : 60) && !options.prepareTempMessageId) {\r\n return rejectPromise(error);\r\n }\r\n \r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, waitTime/* (waitTime + 5) */ * 1000); // 03.02.2020\r\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n\r\n afterMessageId = undefined;\r\n delete options.afterMessageId;\r\n\r\n if(after) after.promise.then(() => performRequest(cachedNetworker));\r\n else performRequest(cachedNetworker);\r\n } else if(!options.rawError && error.code === 500) {\r\n const now = Date.now();\r\n if(options.stopTime) {\r\n if(now >= options.stopTime) {\r\n return rejectPromise(error);\r\n }\r\n }\r\n \r\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, options.waitTime * 1000);\r\n } else if(error.type === 'UNKNOWN') {\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, 1000);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n });\r\n }\r\n \r\n if(dcId = (options.dcId || this.baseDcId)) {\r\n this.getNetworker(dcId, options).then(performRequest, rejectPromise);\r\n } else {\r\n this.getBaseDcId().then(baseDcId => {\r\n this.getNetworker(dcId = baseDcId, options).then(performRequest, rejectPromise);\r\n });\r\n }\r\n\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiManager = new ApiManager();\r\nMOUNT_CLASS_TO.apiManager = apiManager;\r\nexport default apiManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { blobConstruct, readBlobAsUint8Array } from \"../helpers/blob\";\r\n\r\nexport class FileManager {\r\n public blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport FileManager from './filemanager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ReferenceBytes } from \"./referenceDatabase\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport { readBlobAsArrayBuffer } from \"../../helpers/blob\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { notifyAll, notifySomeone } from \"../../helpers/context\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport { randomLong } from \"../../helpers/random\";\r\nimport { InputFile, InputFileLocation, InputWebFileLocation, UploadFile, UploadWebFile } from \"../../layer\";\r\nimport { DcId, WorkerTaskVoidTemplate } from \"../../types\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport cryptoWorker from \"../crypto/cryptoworker\";\r\nimport FileManager from \"../filemanager\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"./apiManager\";\r\nimport { isWebpSupported } from \"./mtproto.worker\";\r\nimport { bytesToHex } from \"../../helpers/bytes\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport ctx from \"../../environment/ctx\";\r\nimport noop from \"../../helpers/noop\";\r\n\r\ntype Delayed = {\r\n offset: number, \r\n writeFilePromise: CancellablePromise, \r\n writeFileDeferred: CancellablePromise\r\n};\r\n\r\nexport type DownloadOptions = {\r\n dcId: DcId, \r\n location: InputFileLocation | InputWebFileLocation, \r\n size?: number,\r\n fileName?: string,\r\n mimeType?: string,\r\n limitPart?: number,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n};\r\n\r\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\r\n\r\nexport interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\r\n type: 'refreshReference',\r\n payload: ReferenceBytes,\r\n};\r\n\r\nexport interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\r\n type: 'refreshReference',\r\n payload: ReferenceBytes,\r\n originalPayload: ReferenceBytes\r\n};\r\n\r\nconst MAX_FILE_SAVE_SIZE = 20e6;\r\n\r\nexport class ApiFileManager {\r\n private cacheStorage = new CacheStorageController('cachedFiles');\r\n\r\n private cachedDownloadPromises: {\r\n [fileName: string]: CancellablePromise\r\n } = {};\r\n\r\n private uploadPromises: {\r\n [fileName: string]: Set>\r\n } = {};\r\n\r\n private downloadPulls: {\r\n [dcId: string]: Array<{\r\n id: number,\r\n queueId: number,\r\n cb: () => Promise,\r\n deferred: {\r\n resolve: (...args: any[]) => void,\r\n reject: (...args: any[]) => void\r\n },\r\n activeDelta: number\r\n }>\r\n } = {};\r\n private downloadActives: {[dcId: string]: number} = {};\r\n\r\n public webpConvertPromises: {[fileName: string]: CancellablePromise} = {};\r\n public refreshReferencePromises: {\r\n [referenceHex: string]: {\r\n deferred: CancellablePromise,\r\n timeout: number\r\n }\r\n } = {};\r\n\r\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\r\n private tempId = 0;\r\n private queueId = 0;\r\n private debug = Modes.debug;\r\n\r\n constructor() {\r\n setInterval(() => { // clear old promises\r\n for(const hex in this.refreshReferencePromises) {\r\n const {deferred} = this.refreshReferencePromises[hex];\r\n if(deferred.isFulfilled || deferred.isRejected) {\r\n delete this.refreshReferencePromises[hex];\r\n }\r\n }\r\n }, 1800e3);\r\n }\r\n\r\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\r\n if(this.downloadPulls[dcId] === undefined) {\r\n this.downloadPulls[dcId] = [];\r\n this.downloadActives[dcId] = 0;\r\n }\r\n\r\n const downloadPull = this.downloadPulls[dcId];\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\r\n });\r\n\r\n setTimeout(() => {\r\n this.downloadCheck(dcId);\r\n }, 0);\r\n\r\n return promise;\r\n }\r\n\r\n private downloadCheck(dcId: string | number) {\r\n const downloadPull = this.downloadPulls[dcId];\r\n const downloadLimit = dcId === 'upload' ? 24 : 36;\r\n //const downloadLimit = Infinity;\r\n\r\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull || !downloadPull.length) {\r\n return false;\r\n }\r\n\r\n //const data = downloadPull.shift();\r\n const data = downloadPull.findAndSplice(d => d.queueId === 0) || downloadPull.findAndSplice(d => d.queueId === this.queueId) || downloadPull.shift();\r\n const activeDelta = data.activeDelta || 1;\r\n\r\n this.downloadActives[dcId] += activeDelta;\r\n \r\n data.cb()\r\n .then((result) => {\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n data.deferred.resolve(result);\r\n }, (error: Error) => {\r\n // @ts-ignore\r\n if(!error || !error.type || (error.type !== 'DOWNLOAD_CANCELED' && error.type !== 'UPLOAD_CANCELED')) {\r\n this.log.error('downloadCheck error:', error);\r\n }\r\n\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n data.deferred.reject(error);\r\n });\r\n }\r\n\r\n public setQueueId(queueId: number) {\r\n //this.log.error('setQueueId', queueId);\r\n this.queueId = queueId;\r\n }\r\n\r\n private getFileStorage() {\r\n return this.cacheStorage;\r\n }\r\n\r\n public cancelDownload(fileName: string) {\r\n const promises = (this.cachedDownloadPromises[fileName] ? [this.cachedDownloadPromises[fileName]] : undefined) || \r\n (this.uploadPromises[fileName] ? Array.from(this.uploadPromises[fileName]) : []);\r\n let canceled = false;\r\n for(let i = 0, length = promises.length; i < length; ++i) {\r\n const promise = promises[i];\r\n if(promise && !promise.isRejected && !promise.isFulfilled) {\r\n promise.cancel();\r\n canceled = true;\r\n }\r\n }\r\n\r\n return canceled;\r\n }\r\n\r\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n return apiManager.invokeApi('upload.getWebFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n });\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n public requestFilePart(dcId: DcId, location: InputFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n const invoke = async(): Promise => {\r\n checkCancel && checkCancel(); // do not remove async, because checkCancel will throw an error\r\n\r\n const promise = apiManager.invokeApi('upload.getFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n }) as Promise;\r\n\r\n return promise.catch((err) => {\r\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n\r\n throw err;\r\n });\r\n };\r\n\r\n assumeType(location);\r\n const reference = location.file_reference;\r\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\r\n location.checkedReference = true;\r\n const hex = bytesToHex(reference);\r\n if(this.refreshReferencePromises[hex]) {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n }\r\n\r\n return invoke();\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n /* private convertBlobToBytes(blob: Blob) {\r\n return blob.arrayBuffer().then(buffer => new Uint8Array(buffer));\r\n } */\r\n\r\n private getDelta(bytes: number) {\r\n return bytes / 1024 / 128;\r\n }\r\n\r\n private getLimitPart(size: number): number {\r\n let bytes: number;\r\n\r\n bytes = 512;\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 * 1024;\r\n }\r\n\r\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\r\n //this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n return cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, true) as Promise;\r\n };\r\n\r\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\r\n const convertPromise = deferredPromise();\r\n\r\n const task = {type: 'convertWebp', payload: {fileName, bytes}};\r\n notifySomeone(task);\r\n return this.webpConvertPromises[fileName] = convertPromise;\r\n };\r\n\r\n private refreshReference(inputFileLocation: InputFileLocation) {\r\n const reference = (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference;\r\n const hex = bytesToHex(reference);\r\n\r\n let r = this.refreshReferencePromises[hex];\r\n if(!r) {\r\n const deferred = deferredPromise();\r\n\r\n r = this.refreshReferencePromises[hex] = {\r\n deferred,\r\n timeout: ctx.setTimeout(() => {\r\n this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\r\n deferred.reject('REFERENCE_IS_NOT_REFRESHED');\r\n }, 60000)\r\n };\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearTimeout(r.timeout);\r\n });\r\n\r\n const task = {type: 'refreshReference', payload: reference};\r\n notifySomeone(task);\r\n }\r\n\r\n // have to replace file_reference in any way, because location can be different everytime if it's stream\r\n return r.deferred.then(reference => {\r\n if(hex === bytesToHex(reference)) {\r\n throw 'REFERENCE_IS_NOT_REFRESHED';\r\n }\r\n\r\n (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference = reference;\r\n });\r\n }\r\n\r\n public downloadFile(options: DownloadOptions): CancellablePromise {\r\n if(!FileManager.isAvailable()) {\r\n return Promise.reject({type: 'BROWSER_BLOB_NOT_SUPPORTED'});\r\n }\r\n\r\n const size = options.size ?? 0;\r\n const {dcId, location} = options;\r\n\r\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\r\n\r\n if(options.mimeType === 'image/webp' && !isWebpSupported()) {\r\n process = this.convertWebp;\r\n options.mimeType = 'image/png';\r\n } else if(options.mimeType === 'application/x-tgsticker') {\r\n process = this.uncompressTGS;\r\n options.mimeType = 'application/json';\r\n }\r\n\r\n const fileName = getFileNameByLocation(location, {fileName: options.fileName});\r\n const cachedPromise = this.cachedDownloadPromises[fileName];\r\n const fileStorage = this.getFileStorage();\r\n\r\n this.debug && this.log('downloadFile', fileName, size, location, options.mimeType);\r\n\r\n /* if(options.queueId) {\r\n this.log.error('downloadFile queueId:', fileName, options.queueId);\r\n } */\r\n\r\n if(cachedPromise) {\r\n //this.log('downloadFile cachedPromise');\r\n\r\n if(size) {\r\n return cachedPromise.then((blob: Blob) => {\r\n if(blob.size < size) {\r\n this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\r\n\r\n return this.deleteFile(fileName).then(() => {\r\n return this.downloadFile(options);\r\n }).catch(() => {\r\n return this.downloadFile(options);\r\n });\r\n } else {\r\n return blob;\r\n }\r\n });\r\n } else {\r\n return cachedPromise;\r\n }\r\n }\r\n\r\n const deferred = deferredPromise();\r\n const mimeType = options.mimeType || 'image/jpeg';\r\n\r\n let error: Error;\r\n let resolved = false;\r\n let cacheFileWriter: ReturnType;\r\n let errorHandler = (_error: Error) => {\r\n error = _error;\r\n delete this.cachedDownloadPromises[fileName];\r\n deferred.reject(error);\r\n errorHandler = () => {};\r\n\r\n if(cacheFileWriter && (!error || error.type !== 'DOWNLOAD_CANCELED')) {\r\n cacheFileWriter.truncate();\r\n }\r\n };\r\n\r\n const id = this.tempId++;\r\n\r\n fileStorage.getFile(fileName).then(async(blob: Blob) => {\r\n //this.log('maybe cached', fileName);\r\n //throw '';\r\n\r\n if(blob.size < size) {\r\n //this.log('downloadFile need to deleteFile 2, wrong size:', blob.size, size);\r\n await this.deleteFile(fileName);\r\n throw false;\r\n }\r\n\r\n deferred.resolve(blob);\r\n }).catch(() => {\r\n //this.log('not cached', fileName);\r\n const fileWriterPromise = fileStorage.getFileWriter(fileName, mimeType);\r\n\r\n fileWriterPromise.then((fileWriter) => {\r\n cacheFileWriter = fileWriter;\r\n const limit = options.limitPart || this.getLimitPart(size);\r\n let offset: number;\r\n let startOffset = 0;\r\n let writeFilePromise: CancellablePromise = Promise.resolve(),\r\n writeFileDeferred: CancellablePromise;\r\n //const maxRequests = 13107200 / limit; // * 100 Mb speed\r\n const maxRequests = Infinity;\r\n\r\n //console.error('maxRequests', maxRequests);\r\n\r\n const processDownloaded = async(bytes: Uint8Array, offset: number) => {\r\n if(process) {\r\n //const perf = performance.now();\r\n const processed = await process(bytes, fileName);\r\n //this.log('downloadFile process downloaded time', performance.now() - perf, mimeType, process);\r\n return processed;\r\n }\r\n \r\n return bytes;\r\n };\r\n\r\n const r = location._ === 'inputWebFileLocation' ? this.requestWebFilePart.bind(this) : this.requestFilePart.bind(this);\r\n\r\n const delayed: Delayed[] = [];\r\n offset = startOffset;\r\n do {\r\n ////this.log('offset:', startOffset);\r\n writeFileDeferred = deferredPromise();\r\n delayed.push({offset, writeFilePromise, writeFileDeferred});\r\n writeFilePromise = writeFileDeferred;\r\n offset += limit;\r\n } while(offset < size);\r\n\r\n let done = 0;\r\n const superpuper = async() => {\r\n //if(!delayed.length) return;\r\n\r\n const {offset, writeFilePromise, writeFileDeferred} = delayed.shift();\r\n try {\r\n checkCancel();\r\n\r\n // @ts-ignore\r\n const result = await r(dcId, location as any, offset, limit, id, options.queueId, checkCancel);\r\n\r\n const bytes = result.bytes;\r\n\r\n if(delayed.length) {\r\n superpuper();\r\n }\r\n\r\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\r\n const isFinal = offset + limit >= size || !bytes.byteLength;\r\n if(bytes.byteLength) {\r\n //done += limit;\r\n done += bytes.byteLength;\r\n\r\n //if(!isFinal) {\r\n ////this.log('deferred notify 2:', {done: offset + limit, total: size}, deferred);\r\n deferred.notify({done, offset, total: size});\r\n //}\r\n\r\n const processedResult = await processDownloaded(bytes, offset);\r\n checkCancel();\r\n\r\n await writeFilePromise;\r\n checkCancel();\r\n\r\n await FileManager.write(fileWriter, processedResult);\r\n }\r\n\r\n writeFileDeferred.resolve();\r\n\r\n if(isFinal) {\r\n resolved = true;\r\n\r\n deferred.resolve(fileWriter.finalize(size < MAX_FILE_SAVE_SIZE));\r\n }\r\n } catch(err) {\r\n errorHandler(err as Error);\r\n }\r\n };\r\n\r\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\r\n superpuper();\r\n }\r\n }).catch((err) => {\r\n if(!['STORAGE_OFFLINE'].includes(err)) {\r\n this.log.error('saveFile error:', err);\r\n }\r\n });\r\n });\r\n\r\n const checkCancel = () => {\r\n if(error) {\r\n throw error;\r\n }\r\n };\r\n\r\n deferred.cancel = () => {\r\n if(!error && !resolved) {\r\n const error = new Error('Canceled');\r\n error.type = 'DOWNLOAD_CANCELED';\r\n errorHandler(error);\r\n }\r\n };\r\n\r\n deferred.notify = (progress: {done: number, total: number, offset: number}) => {\r\n notifyAll({progress: {fileName, ...progress}});\r\n };\r\n\r\n this.cachedDownloadPromises[fileName] = deferred;\r\n\r\n deferred.safeFinally(() => {\r\n delete this.cachedDownloadPromises[fileName];\r\n });\r\n\r\n return deferred;\r\n }\r\n\r\n private deleteFile(fileName: string) {\r\n //this.log('will delete file:', fileName);\r\n delete this.cachedDownloadPromises[fileName];\r\n return this.getFileStorage().delete(fileName);\r\n }\r\n\r\n public uploadFile({file, fileName}: {file: Blob | File, fileName: string}) {\r\n const fileSize = file.size, \r\n isBigFile = fileSize >= 10485760;\r\n\r\n let canceled = false,\r\n resolved = false,\r\n doneParts = 0,\r\n partSize = 262144; // 256 Kb\r\n\r\n /* if(fileSize > (524288 * 3000)) {\r\n partSize = 1024 * 1024;\r\n activeDelta = 8;\r\n } else */if(fileSize > 67108864) {\r\n partSize = 524288;\r\n } else if(fileSize < 102400) {\r\n partSize = 32768;\r\n }\r\n\r\n const activeDelta = this.getDelta(partSize);\r\n\r\n const totalParts = Math.ceil(fileSize / partSize);\r\n const fileId = randomLong();\r\n\r\n let _part = 0;\r\n\r\n const resultInputFile: InputFile = {\r\n _: isBigFile ? 'inputFileBig' : 'inputFile',\r\n id: fileId as any,\r\n parts: totalParts,\r\n name: fileName,\r\n md5_checksum: ''\r\n };\r\n\r\n const deferredHelper: {\r\n resolve?: (input: typeof resultInputFile) => void,\r\n reject?: (error: any) => void,\r\n notify?: (details: {done: number, total: number}) => void\r\n } = {\r\n notify: (details: {done: number, total: number}) => {}\r\n };\r\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n if(totalParts > 4000) {\r\n return reject({type: 'FILE_TOO_BIG'});\r\n }\r\n\r\n deferredHelper.resolve = resolve;\r\n deferredHelper.reject = reject;\r\n });\r\n Object.assign(deferred, deferredHelper);\r\n\r\n if(totalParts > 4000) {\r\n return deferred;\r\n }\r\n \r\n let errorHandler = (error: any) => {\r\n if(error?.type !== 'UPLOAD_CANCELED') {\r\n this.log.error('Up Error', error);\r\n }\r\n\r\n deferred.reject(error);\r\n canceled = true;\r\n errorHandler = () => {};\r\n };\r\n\r\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\r\n\r\n const id = this.tempId++;\r\n\r\n /* setInterval(() => {\r\n console.log(file);\r\n }, 1e3); */\r\n\r\n const self = this;\r\n function* generator() {\r\n for(let offset = 0; offset < fileSize; offset += partSize) {\r\n const part = _part++; // 0, 1\r\n yield self.downloadRequest('upload', id, () => {\r\n const blob = file.slice(offset, offset + partSize);\r\n\r\n return readBlobAsArrayBuffer(blob).then(buffer => {\r\n if(canceled) {\r\n throw {type: 'UPLOAD_CANCELED'};\r\n }\r\n\r\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\r\n\r\n /* const u = new Uint8Array(buffer.byteLength);\r\n for(let i = 0; i < u.length; ++i) {\r\n //u[i] = Math.random() * 255 | 0;\r\n u[i] = 0;\r\n }\r\n buffer = u.buffer; */\r\n \r\n /* setTimeout(() => {\r\n doneParts++;\r\n uploadResolve();\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n\r\n self.log('done part', part, doneParts);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, 1250);\r\n return; */\r\n\r\n return apiManager.invokeApi(method, {\r\n file_id: fileId,\r\n file_part: part,\r\n file_total_parts: totalParts,\r\n bytes: buffer/* new Uint8Array(buffer) */\r\n } as any, {\r\n //startMaxLength: partSize + 256,\r\n fileUpload: true\r\n }).then((result) => {\r\n doneParts++;\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, errorHandler);\r\n });\r\n }, activeDelta).catch(errorHandler);\r\n }\r\n }\r\n\r\n const it = generator();\r\n const process = () => {\r\n if(canceled) return;\r\n const r = it.next();\r\n if(r.done || canceled) return;\r\n (r.value as Promise).then(process);\r\n };\r\n\r\n const maxRequests = Infinity;\r\n //const maxRequests = 10;\r\n /* for(let i = 0; i < 10; ++i) {\r\n process();\r\n } */\r\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\r\n process();\r\n }\r\n\r\n deferred.cancel = () => {\r\n //this.log('cancel upload', canceled, resolved);\r\n if(!canceled && !resolved) {\r\n canceled = true;\r\n errorHandler({type: 'UPLOAD_CANCELED'});\r\n }\r\n };\r\n\r\n deferred.notify = (progress: {done: number, total: number}) => {\r\n notifyAll({progress: {fileName, ...progress}});\r\n };\r\n\r\n deferred.finally(() => {\r\n set.delete(deferred);\r\n if(!set.size) {\r\n delete this.uploadPromises[fileName];\r\n }\r\n });\r\n\r\n const set = this.uploadPromises[fileName] ?? (this.uploadPromises[fileName] = new Set());\r\n set.add(deferred);\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiFileManager = new ApiFileManager();\r\nMOUNT_CLASS_TO.apiFileManager = apiFileManager;\r\nexport default apiFileManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// just to include\nimport '../polyfill';\n\nimport type { LocalStorageProxyTask } from '../localStorage';\nimport type { WebpConvertTask } from '../webp/webpWorkerController';\nimport type { ToggleStorageTask } from './mtprotoworker';\nimport type { RefreshReferenceTaskResponse } from './apiFileManager';\nimport apiManager from \"./apiManager\";\nimport cryptoWorker from \"../crypto/cryptoworker\";\nimport networkerFactory from \"./networkerFactory\";\nimport apiFileManager from './apiFileManager';\nimport { notifyAll } from '../../helpers/context';\nimport CacheStorageController from '../cacheStorage';\nimport sessionStorage from '../sessionStorage';\nimport { socketsProxied } from './transports/socketProxied';\nimport { bytesToHex } from '../../helpers/bytes';\nimport ctx from '../../environment/ctx';\n\nlet webpSupported = false;\nexport const isWebpSupported = () => {\n return webpSupported;\n};\n\nnetworkerFactory.setUpdatesProcessor((obj) => {\n notifyAll({update: obj});\n});\n\nnetworkerFactory.onConnectionStatusChange = (status) => {\n notifyAll({type: 'connectionStatusChange', payload: status});\n};\n\nconst taskListeners = {\n convertWebp: (task: WebpConvertTask) => {\n const {fileName, bytes} = task.payload;\n const deferred = apiFileManager.webpConvertPromises[fileName];\n if(deferred) {\n deferred.resolve(bytes);\n delete apiFileManager.webpConvertPromises[fileName];\n }\n },\n\n webpSupport: (task: any) => {\n webpSupported = task.payload;\n },\n\n socketProxy: (task: any) => {\n const socketTask = task.payload;\n const id = socketTask.id;\n \n const socketProxied = socketsProxied.get(id);\n if(socketTask.type === 'message') {\n socketProxied.dispatchEvent('message', socketTask.payload);\n } else if(socketTask.type === 'open') {\n socketProxied.dispatchEvent('open');\n } else if(socketTask.type === 'close') {\n socketProxied.dispatchEvent('close');\n socketsProxied.delete(id);\n }\n },\n\n localStorageProxy: (task: LocalStorageProxyTask) => {\n sessionStorage.finishTask(task.id, task.payload);\n },\n\n userAgent: (task: any) => {\n networkerFactory.userAgent = task.payload;\n },\n\n online: () => {\n networkerFactory.forceReconnectTimeout();\n },\n\n forceReconnect: () => {\n networkerFactory.forceReconnect();\n },\n\n toggleStorage: (task: ToggleStorageTask) => {\n const enabled = task.payload;\n // AppStorage.toggleStorage(enabled);\n CacheStorageController.toggleStorage(enabled);\n },\n\n refreshReference: (task: RefreshReferenceTaskResponse) => {\n const hex = bytesToHex(task.originalPayload);\n const r = apiFileManager.refreshReferencePromises[hex];\n const deferred = r?.deferred;\n if(deferred) {\n if(task.error) {\n deferred.reject(task.error);\n } else {\n deferred.resolve(task.payload);\n }\n }\n }\n};\n\nconst onMessage = async(e: any) => {\n try {\n const task: {\n task: string,\n taskId: number,\n args: any[],\n type?: string\n } = e.data;\n const taskId = task.taskId;\n\n // @ts-ignore\n const f = taskListeners[task.type];\n if(f) {\n f(task);\n return;\n }\n\n if(!task.task) {\n return;\n }\n \n switch(task.task) {\n case 'computeSRP':\n case 'gzipUncompress':\n return cryptoWorker.invokeCrypto(task.task, ...task.args as any).then(result => {\n notifyAll({taskId, result});\n });\n \n case 'requestFilePart':\n case 'setQueueId':\n case 'cancelDownload':\n case 'uploadFile':\n case 'downloadFile': {\n try {\n // @ts-ignore\n let result: any = apiFileManager[task.task].apply(apiFileManager, task.args);\n \n if(result instanceof Promise) {\n /* (result as ReturnType).notify = (progress: {done: number, total: number, offset: number}) => {\n notify({progress: {fileName, ...progress}});\n }; */\n result = await result;\n }\n \n notifyAll({taskId, result});\n } catch(error) {\n notifyAll({taskId, error});\n }\n\n break;\n }\n\n case 'getNetworker': {\n // @ts-ignore\n apiManager[task.task].apply(apiManager, task.args).finally(() => {\n notifyAll({taskId, result: null});\n });\n \n break;\n }\n\n case 'setLanguage':\n case 'startAll':\n case 'stopAll': {\n // @ts-ignore\n networkerFactory[task.task].apply(networkerFactory, task.args);\n break;\n }\n \n default: {\n try {\n // @ts-ignore\n let result = apiManager[task.task].apply(apiManager, task.args);\n \n if(result instanceof Promise) {\n result = await result;\n }\n\n //console.log(notifyAll);\n \n notifyAll({taskId, result});\n } catch(error) {\n notifyAll({taskId, error});\n }\n \n //throw new Error('Unknown task: ' + task.task);\n break;\n }\n }\n } catch(err) {\n console.error('worker task error:', err);\n }\n};\n\n//console.log('[WORKER] Will send ready', Date.now() / 1000);\nctx.addEventListener('message', onMessage);\nnotifyAll('ready');\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/npm.qr-code-styling.c53238820878551c10bf.chunk.js b/public/npm.qr-code-styling.b2874a156be40d4efbb7.chunk.js similarity index 99% rename from public/npm.qr-code-styling.c53238820878551c10bf.chunk.js rename to public/npm.qr-code-styling.b2874a156be40d4efbb7.chunk.js index e79416bec..3377beea8 100644 --- a/public/npm.qr-code-styling.c53238820878551c10bf.chunk.js +++ b/public/npm.qr-code-styling.b2874a156be40d4efbb7.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[10],{131:function(t,r,e){self,t.exports=(()=>{var t={192:(t,r)=>{var e,n,o=function(){var t=function(t,r){var e=t,n=a[r],o=null,i=0,u=null,v=[],y={},x=function(t,r){o=function(t){for(var r=new Array(t),e=0;e=7&&m(t),null==u&&(u=k(e,n,v)),S(u,r)},b=function(t,r){for(var e=-1;e<=7;e+=1)if(!(t+e<=-1||i<=t+e))for(var n=-1;n<=7;n+=1)r+n<=-1||i<=r+n||(o[t+e][r+n]=0<=e&&e<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==e||6==e)||2<=e&&e<=4&&2<=n&&n<=4)},_=function(){for(var t=8;t>n&1);o[Math.floor(n/3)][n%3+i-8-3]=a}for(n=0;n<18;n+=1)a=!t&&1==(r>>n&1),o[n%3+i-8-3][Math.floor(n/3)]=a},O=function(t,r){for(var e=n<<3|r,a=s.getBCHTypeInfo(e),u=0;u<15;u+=1){var c=!t&&1==(a>>u&1);u<6?o[u][8]=c:u<8?o[u+1][8]=c:o[i-15+u][8]=c}for(u=0;u<15;u+=1)c=!t&&1==(a>>u&1),u<8?o[8][i-u-1]=c:u<9?o[8][15-u-1+1]=c:o[8][15-u-1]=c;o[i-8][8]=!t},S=function(t,r){for(var e=-1,n=i-1,a=7,u=0,c=s.getMaskFunction(r),h=i-1;h>0;h-=2)for(6==h&&(h-=1);;){for(var f=0;f<2;f+=1)if(null==o[n][h-f]){var d=!1;u>>a&1)),c(n,h-f)&&(d=!d),o[n][h-f]=d,-1==(a-=1)&&(u+=1,a=7)}if((n+=e)<0||i<=n){n-=e,e=-e;break}}},k=function(t,r,e){for(var n=h.getRSBlocks(t,r),o=f(),i=0;i8*u)throw"code length overflow. ("+o.getLengthInBits()+">"+8*u+")";for(o.getLengthInBits()+4<=8*u&&o.put(0,4);o.getLengthInBits()%8!=0;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*u||(o.put(236,8),o.getLengthInBits()>=8*u));)o.put(17,8);return function(t,r){for(var e=0,n=0,o=0,i=new Array(r.length),a=new Array(r.length),u=0;u=0?g.getAt(p):0}}var v=0;for(d=0;dn)&&(t=n,r=e)}return r}())},y.createTableTag=function(t,r){t=t||2;var e="";e+='',e+="";for(var n=0;n";for(var o=0;o';e+=""}return(e+="")+"
"},y.createSvgTag=function(t,r,e,n){var o={};"object"==typeof arguments[0]&&(t=(o=arguments[0]).cellSize,r=o.margin,e=o.alt,n=o.title),t=t||2,r=void 0===r?4*t:r,(e="string"==typeof e?{text:e}:e||{}).text=e.text||null,e.id=e.text?e.id||"qrcode-description":null,(n="string"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||"qrcode-title":null;var i,a,s,u,c=y.getModuleCount()*t+2*r,h="";for(u="l"+t+",0 0,"+t+" -"+t+",0 0,-"+t+"z ",h+=''+C(n.text)+"":"",h+=e.text?''+C(e.text)+"":"",h+='',h+='"},y.createDataURL=function(t,r){t=t||2,r=void 0===r?4*t:r;var e=y.getModuleCount()*t+2*r,n=r,o=e-r;return w(e,e,(function(r,e){if(n<=r&&r"};var C=function(t){for(var r="",e=0;e":r+=">";break;case"&":r+="&";break;case'"':r+=""";break;default:r+=n}}return r};return y.createASCII=function(t,r){if((t=t||1)<2)return function(t){t=void 0===t?2:t;var r,e,n,o,i,a=1*y.getModuleCount()+2*t,s=t,u=a-t,c={"██":"█","█ ":"▀"," █":"▄"," ":" "},h={"██":"▀","█ ":"▀"," █":" "," ":" "},f="";for(r=0;r=u?h[i]:c[i];f+="\n"}return a%2&&t>0?f.substring(0,f.length-a-1)+Array(a+1).join("▀"):f.substring(0,f.length-1)}(r);t-=1,r=void 0===r?2*t:r;var e,n,o,i,a=y.getModuleCount()*t+2*r,s=r,u=a-r,c=Array(t+1).join("██"),h=Array(t+1).join(" "),f="",d="";for(e=0;e>>8),r.push(255&a)):r.push(n)}}return r}};var r,e,n,o,i,a={L:1,M:0,Q:3,H:2},s=(r=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e=1335,n=7973,i=function(t){for(var r=0;0!=t;)r+=1,t>>>=1;return r},(o={}).getBCHTypeInfo=function(t){for(var r=t<<10;i(r)-i(e)>=0;)r^=e<=0;)r^=n<5&&(e+=3+i-5)}for(n=0;n=256;)r-=255;return t[r]}}}();function c(t,r){if(void 0===t.length)throw t.length+"/"+r;var e=function(){for(var e=0;e>>7-r%8&1)},put:function(t,r){for(var n=0;n>>r-n-1&1))},getLengthInBits:function(){return r},putBit:function(e){var n=Math.floor(r/8);t.length<=n&&t.push(0),e&&(t[n]|=128>>>r%8),r+=1}};return e},d=function(t){var r=t,e={getMode:function(){return 1},getLength:function(t){return r.length},write:function(t){for(var e=r,o=0;o+2>>8&255)+(255&o),t.put(o,13),e+=2}if(e>>8)},writeBytes:function(t,e,n){e=e||0,n=n||t.length;for(var o=0;o0&&(r+=","),r+=t[e];return r+"]"}};return r},y=function(t){var r=t,e=0,n=0,o=0,i={read:function(){for(;o<8;){if(e>=r.length){if(0==o)return-1;throw"unexpected end of file./"+o}var t=r.charAt(e);if(e+=1,"="==t)return o=0,-1;t.match(/^\s$/)||(n=n<<6|a(t.charCodeAt(0)),o+=6)}var i=n>>>o-8&255;return o-=8,i}},a=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw"c:"+t};return i},w=function(t,r,e){for(var n=function(t,r){var e=t,n=r,o=new Array(t*r),i={setPixel:function(t,r,n){o[r*e+t]=n},write:function(t){t.writeString("GIF87a"),t.writeShort(e),t.writeShort(n),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(","),t.writeShort(0),t.writeShort(0),t.writeShort(e),t.writeShort(n),t.writeByte(0);var r=a(2);t.writeByte(2);for(var o=0;r.length-o>255;)t.writeByte(255),t.writeBytes(r,o,255),o+=255;t.writeByte(r.length-o),t.writeBytes(r,o,r.length-o),t.writeByte(0),t.writeString(";")}},a=function(t){for(var r=1<>>r!=0)throw"length over";for(;c+r>=8;)u.writeByte(255&(t<>>=8-c,h=0,c=0;h|=t<0&&u.writeByte(h)}});d.write(r,n);var l=0,g=String.fromCharCode(o[l]);for(l+=1;l=6;)i(t>>>r-6),r-=6},o.flush=function(){if(r>0&&(i(t<<6-r),t=0,r=0),e%3!=0)for(var o=3-e%3,a=0;a>6,128|63&n):n<55296||n>=57344?r.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&t.charCodeAt(e)),r.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return r}(t)},void 0===(n="function"==typeof(e=function(){return o})?e.apply(r,[]):e)||(t.exports=n)},151:(t,r,e)=>{"use strict";e.d(r,{default:()=>S});var n=function(){return(n=Object.assign||function(t){for(var r,e=1,n=arguments.length;e2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawExtraRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1),h=a+s+u+c;if(0!==h)if(h>2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawClassy=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t}();var h=function(){return(h=Object.assign||function(t){for(var r,e=1,n=arguments.length;e0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]n||o&&o=(r-o.hideXDots)/2&&t<(r+o.hideXDots)/2&&e>=(r-o.hideYDots)/2&&e<(r+o.hideYDots)/2||(null===(n=g[t])||void 0===n?void 0:n[e])||(null===(i=g[t-r+7])||void 0===i?void 0:i[e])||(null===(a=g[t])||void 0===a?void 0:a[e-r+7])||(null===(s=p[t])||void 0===s?void 0:s[e])||(null===(u=p[t-r+7])||void 0===u?void 0:u[e])||(null===(c=p[t])||void 0===c?void 0:c[e-r+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:r,dotSize:n}),[2]}}))},new((e=void 0)||(e=Promise))((function(t,o){function i(t){try{s(n.next(t))}catch(t){o(t)}}function a(t){try{s(n.throw(t))}catch(t){o(t)}}function s(r){var n;r.done?t(r.value):(n=r.value,n instanceof e?n:new e((function(t){t(n)}))).then(i,a)}s((n=n.apply(r,[])).next())}));var r,e,n},t.prototype.drawBackground=function(){var t=this.context,r=this._options;if(t){if(r.backgroundOptions.gradient){var e=r.backgroundOptions.gradient,n=this._createGradient({context:t,options:e,additionalRotation:0,x:0,y:0,size:this._canvas.width>this._canvas.height?this._canvas.width:this._canvas.height});e.colorStops.forEach((function(t){var r=t.offset,e=t.color;n.addColorStop(r,e)})),t.fillStyle=n}else r.backgroundOptions.color&&(t.fillStyle=r.backgroundOptions.color);t.fillRect(0,0,this._canvas.width,this._canvas.height)}},t.prototype.drawDots=function(t){var r=this;if(!this._qr)throw"QR code is not defined";var e=this.context;if(!e)throw"QR code is not defined";var n=this._options,o=this._qr.getModuleCount();if(o>n.width||o>n.height)throw"The canvas is too small.";var i=Math.min(n.width,n.height)-2*n.margin,a=Math.floor(i/o),s=Math.floor((n.width-o*a)/2),u=Math.floor((n.height-o*a)/2),h=new c({context:e,type:n.dotsOptions.type});e.beginPath();for(var f=function(e){for(var n=function(n){return t&&!t(e,n)?"continue":d._qr.isDark(e,n)?void h.draw(s+e*a,u+n*a,a,(function(i,a){return!(e+i<0||n+a<0||e+i>=o||n+a>=o)&&!(t&&!t(e+i,n+a))&&!!r._qr&&r._qr.isDark(e+i,n+a)})):"continue"},i=0;i=0&&c<=.25*Math.PI||c>1.75*Math.PI&&c<=2*Math.PI?(h-=s/2,f-=s/2*Math.tan(u),d+=s/2,l+=s/2*Math.tan(u)):c>.25*Math.PI&&c<=.75*Math.PI?(f-=s/2,h-=s/2/Math.tan(u),l+=s/2,d+=s/2/Math.tan(u)):c>.75*Math.PI&&c<=1.25*Math.PI?(h+=s/2,f+=s/2*Math.tan(u),d-=s/2,l-=s/2*Math.tan(u)):c>1.25*Math.PI&&c<=1.75*Math.PI&&(f+=s/2,h+=s/2/Math.tan(u),l-=s/2,d-=s/2/Math.tan(u)),r=e.createLinearGradient(Math.round(h),Math.round(f),Math.round(d),Math.round(l))}return r},t}();for(var y={},w=0;w<=40;w++)y[w]=w;const x={width:300,height:300,data:"",margin:0,qrOptions:{typeNumber:y[0],mode:void 0,errorCorrectionLevel:"Q"},imageOptions:{hideBackgroundDots:!0,imageSize:.4,crossOrigin:void 0,margin:0},dotsOptions:{type:"square",color:"#000"},backgroundOptions:{color:"#fff"}};var b=function(){return(b=Object.assign||function(t){for(var r,e=1,n=arguments.length;eMath.min(r.width,r.height)&&(r.margin=Math.min(r.width,r.height)),r.dotsOptions=b({},r.dotsOptions),r.dotsOptions.gradient&&(r.dotsOptions.gradient=_(r.dotsOptions.gradient)),r.cornersSquareOptions&&(r.cornersSquareOptions=b({},r.cornersSquareOptions),r.cornersSquareOptions.gradient&&(r.cornersSquareOptions.gradient=_(r.cornersSquareOptions.gradient))),r.cornersDotOptions&&(r.cornersDotOptions=b({},r.cornersDotOptions),r.cornersDotOptions.gradient&&(r.cornersDotOptions.gradient=_(r.cornersDotOptions.gradient))),r.backgroundOptions&&(r.backgroundOptions=b({},r.backgroundOptions),r.backgroundOptions.gradient&&(r.backgroundOptions.gradient=_(r.backgroundOptions.gradient))),r}var m=e(192),O=e.n(m);const S=function(){function t(t){this._options=t?M(a(x,t)):x,this.update()}return t._clearContainer=function(t){t&&(t.innerHTML="")},t.prototype.update=function(r){t._clearContainer(this._container),this._options=r?M(a(this._options,r)):this._options,this._options.data&&(this._qr=O()(this._options.qrOptions.typeNumber,this._options.qrOptions.errorCorrectionLevel),this._qr.addData(this._options.data,this._options.qrOptions.mode||function(t){switch(!0){case/^[0-9]*$/.test(t):return"Numeric";case/^[0-9A-Z $%*+\-./:]*$/.test(t):return"Alphanumeric";default:return"Byte"}}(this._options.data)),this._qr.make(),this._canvas=new v(this._options),this._drawingPromise=this._canvas.drawQR(this._qr),this.append(this._container))},t.prototype.append=function(t){if(t){if("function"!=typeof t.appendChild)throw"Container should be a single DOM node";this._canvas&&t.appendChild(this._canvas.getCanvas()),this._container=t}},t.prototype.download=function(t){var r=this;this._drawingPromise&&this._drawingPromise.then((function(){if(r._canvas){var e="png",n="qr";"string"==typeof t?(e=t,console.warn("Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument")):"object"==typeof t&&null!==t&&(t.name&&(n=t.name),t.extension&&(e=t.extension)),function(t,r){var e=document.createElement("a");e.download=r,e.href=t,document.body.appendChild(e),e.click(),document.body.removeChild(e)}(r._canvas.getCanvas().toDataURL("image/"+e),n+"."+e)}}))},t}()}},r={};function e(n){if(r[n])return r[n].exports;var o=r[n]={exports:{}};return t[n](o,o.exports,e),o.exports}return e.n=t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},e.d=(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},e.o=(t,r)=>Object.prototype.hasOwnProperty.call(t,r),e(151)})().default}}]); -//# sourceMappingURL=npm.qr-code-styling.c53238820878551c10bf.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[10],{134:function(t,r,e){self,t.exports=(()=>{var t={192:(t,r)=>{var e,n,o=function(){var t=function(t,r){var e=t,n=a[r],o=null,i=0,u=null,v=[],y={},x=function(t,r){o=function(t){for(var r=new Array(t),e=0;e=7&&m(t),null==u&&(u=k(e,n,v)),S(u,r)},b=function(t,r){for(var e=-1;e<=7;e+=1)if(!(t+e<=-1||i<=t+e))for(var n=-1;n<=7;n+=1)r+n<=-1||i<=r+n||(o[t+e][r+n]=0<=e&&e<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==e||6==e)||2<=e&&e<=4&&2<=n&&n<=4)},_=function(){for(var t=8;t>n&1);o[Math.floor(n/3)][n%3+i-8-3]=a}for(n=0;n<18;n+=1)a=!t&&1==(r>>n&1),o[n%3+i-8-3][Math.floor(n/3)]=a},O=function(t,r){for(var e=n<<3|r,a=s.getBCHTypeInfo(e),u=0;u<15;u+=1){var c=!t&&1==(a>>u&1);u<6?o[u][8]=c:u<8?o[u+1][8]=c:o[i-15+u][8]=c}for(u=0;u<15;u+=1)c=!t&&1==(a>>u&1),u<8?o[8][i-u-1]=c:u<9?o[8][15-u-1+1]=c:o[8][15-u-1]=c;o[i-8][8]=!t},S=function(t,r){for(var e=-1,n=i-1,a=7,u=0,c=s.getMaskFunction(r),h=i-1;h>0;h-=2)for(6==h&&(h-=1);;){for(var f=0;f<2;f+=1)if(null==o[n][h-f]){var d=!1;u>>a&1)),c(n,h-f)&&(d=!d),o[n][h-f]=d,-1==(a-=1)&&(u+=1,a=7)}if((n+=e)<0||i<=n){n-=e,e=-e;break}}},k=function(t,r,e){for(var n=h.getRSBlocks(t,r),o=f(),i=0;i8*u)throw"code length overflow. ("+o.getLengthInBits()+">"+8*u+")";for(o.getLengthInBits()+4<=8*u&&o.put(0,4);o.getLengthInBits()%8!=0;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*u||(o.put(236,8),o.getLengthInBits()>=8*u));)o.put(17,8);return function(t,r){for(var e=0,n=0,o=0,i=new Array(r.length),a=new Array(r.length),u=0;u=0?g.getAt(p):0}}var v=0;for(d=0;dn)&&(t=n,r=e)}return r}())},y.createTableTag=function(t,r){t=t||2;var e="";e+='',e+="";for(var n=0;n";for(var o=0;o';e+=""}return(e+="")+"
"},y.createSvgTag=function(t,r,e,n){var o={};"object"==typeof arguments[0]&&(t=(o=arguments[0]).cellSize,r=o.margin,e=o.alt,n=o.title),t=t||2,r=void 0===r?4*t:r,(e="string"==typeof e?{text:e}:e||{}).text=e.text||null,e.id=e.text?e.id||"qrcode-description":null,(n="string"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||"qrcode-title":null;var i,a,s,u,c=y.getModuleCount()*t+2*r,h="";for(u="l"+t+",0 0,"+t+" -"+t+",0 0,-"+t+"z ",h+=''+C(n.text)+"":"",h+=e.text?''+C(e.text)+"":"",h+='',h+='"},y.createDataURL=function(t,r){t=t||2,r=void 0===r?4*t:r;var e=y.getModuleCount()*t+2*r,n=r,o=e-r;return w(e,e,(function(r,e){if(n<=r&&r"};var C=function(t){for(var r="",e=0;e":r+=">";break;case"&":r+="&";break;case'"':r+=""";break;default:r+=n}}return r};return y.createASCII=function(t,r){if((t=t||1)<2)return function(t){t=void 0===t?2:t;var r,e,n,o,i,a=1*y.getModuleCount()+2*t,s=t,u=a-t,c={"██":"█","█ ":"▀"," █":"▄"," ":" "},h={"██":"▀","█ ":"▀"," █":" "," ":" "},f="";for(r=0;r=u?h[i]:c[i];f+="\n"}return a%2&&t>0?f.substring(0,f.length-a-1)+Array(a+1).join("▀"):f.substring(0,f.length-1)}(r);t-=1,r=void 0===r?2*t:r;var e,n,o,i,a=y.getModuleCount()*t+2*r,s=r,u=a-r,c=Array(t+1).join("██"),h=Array(t+1).join(" "),f="",d="";for(e=0;e>>8),r.push(255&a)):r.push(n)}}return r}};var r,e,n,o,i,a={L:1,M:0,Q:3,H:2},s=(r=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e=1335,n=7973,i=function(t){for(var r=0;0!=t;)r+=1,t>>>=1;return r},(o={}).getBCHTypeInfo=function(t){for(var r=t<<10;i(r)-i(e)>=0;)r^=e<=0;)r^=n<5&&(e+=3+i-5)}for(n=0;n=256;)r-=255;return t[r]}}}();function c(t,r){if(void 0===t.length)throw t.length+"/"+r;var e=function(){for(var e=0;e>>7-r%8&1)},put:function(t,r){for(var n=0;n>>r-n-1&1))},getLengthInBits:function(){return r},putBit:function(e){var n=Math.floor(r/8);t.length<=n&&t.push(0),e&&(t[n]|=128>>>r%8),r+=1}};return e},d=function(t){var r=t,e={getMode:function(){return 1},getLength:function(t){return r.length},write:function(t){for(var e=r,o=0;o+2>>8&255)+(255&o),t.put(o,13),e+=2}if(e>>8)},writeBytes:function(t,e,n){e=e||0,n=n||t.length;for(var o=0;o0&&(r+=","),r+=t[e];return r+"]"}};return r},y=function(t){var r=t,e=0,n=0,o=0,i={read:function(){for(;o<8;){if(e>=r.length){if(0==o)return-1;throw"unexpected end of file./"+o}var t=r.charAt(e);if(e+=1,"="==t)return o=0,-1;t.match(/^\s$/)||(n=n<<6|a(t.charCodeAt(0)),o+=6)}var i=n>>>o-8&255;return o-=8,i}},a=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw"c:"+t};return i},w=function(t,r,e){for(var n=function(t,r){var e=t,n=r,o=new Array(t*r),i={setPixel:function(t,r,n){o[r*e+t]=n},write:function(t){t.writeString("GIF87a"),t.writeShort(e),t.writeShort(n),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(","),t.writeShort(0),t.writeShort(0),t.writeShort(e),t.writeShort(n),t.writeByte(0);var r=a(2);t.writeByte(2);for(var o=0;r.length-o>255;)t.writeByte(255),t.writeBytes(r,o,255),o+=255;t.writeByte(r.length-o),t.writeBytes(r,o,r.length-o),t.writeByte(0),t.writeString(";")}},a=function(t){for(var r=1<>>r!=0)throw"length over";for(;c+r>=8;)u.writeByte(255&(t<>>=8-c,h=0,c=0;h|=t<0&&u.writeByte(h)}});d.write(r,n);var l=0,g=String.fromCharCode(o[l]);for(l+=1;l=6;)i(t>>>r-6),r-=6},o.flush=function(){if(r>0&&(i(t<<6-r),t=0,r=0),e%3!=0)for(var o=3-e%3,a=0;a>6,128|63&n):n<55296||n>=57344?r.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&t.charCodeAt(e)),r.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return r}(t)},void 0===(n="function"==typeof(e=function(){return o})?e.apply(r,[]):e)||(t.exports=n)},151:(t,r,e)=>{"use strict";e.d(r,{default:()=>S});var n=function(){return(n=Object.assign||function(t){for(var r,e=1,n=arguments.length;e2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawExtraRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1),h=a+s+u+c;if(0!==h)if(h>2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawClassy=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t}();var h=function(){return(h=Object.assign||function(t){for(var r,e=1,n=arguments.length;e0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]n||o&&o=(r-o.hideXDots)/2&&t<(r+o.hideXDots)/2&&e>=(r-o.hideYDots)/2&&e<(r+o.hideYDots)/2||(null===(n=g[t])||void 0===n?void 0:n[e])||(null===(i=g[t-r+7])||void 0===i?void 0:i[e])||(null===(a=g[t])||void 0===a?void 0:a[e-r+7])||(null===(s=p[t])||void 0===s?void 0:s[e])||(null===(u=p[t-r+7])||void 0===u?void 0:u[e])||(null===(c=p[t])||void 0===c?void 0:c[e-r+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:r,dotSize:n}),[2]}}))},new((e=void 0)||(e=Promise))((function(t,o){function i(t){try{s(n.next(t))}catch(t){o(t)}}function a(t){try{s(n.throw(t))}catch(t){o(t)}}function s(r){var n;r.done?t(r.value):(n=r.value,n instanceof e?n:new e((function(t){t(n)}))).then(i,a)}s((n=n.apply(r,[])).next())}));var r,e,n},t.prototype.drawBackground=function(){var t=this.context,r=this._options;if(t){if(r.backgroundOptions.gradient){var e=r.backgroundOptions.gradient,n=this._createGradient({context:t,options:e,additionalRotation:0,x:0,y:0,size:this._canvas.width>this._canvas.height?this._canvas.width:this._canvas.height});e.colorStops.forEach((function(t){var r=t.offset,e=t.color;n.addColorStop(r,e)})),t.fillStyle=n}else r.backgroundOptions.color&&(t.fillStyle=r.backgroundOptions.color);t.fillRect(0,0,this._canvas.width,this._canvas.height)}},t.prototype.drawDots=function(t){var r=this;if(!this._qr)throw"QR code is not defined";var e=this.context;if(!e)throw"QR code is not defined";var n=this._options,o=this._qr.getModuleCount();if(o>n.width||o>n.height)throw"The canvas is too small.";var i=Math.min(n.width,n.height)-2*n.margin,a=Math.floor(i/o),s=Math.floor((n.width-o*a)/2),u=Math.floor((n.height-o*a)/2),h=new c({context:e,type:n.dotsOptions.type});e.beginPath();for(var f=function(e){for(var n=function(n){return t&&!t(e,n)?"continue":d._qr.isDark(e,n)?void h.draw(s+e*a,u+n*a,a,(function(i,a){return!(e+i<0||n+a<0||e+i>=o||n+a>=o)&&!(t&&!t(e+i,n+a))&&!!r._qr&&r._qr.isDark(e+i,n+a)})):"continue"},i=0;i=0&&c<=.25*Math.PI||c>1.75*Math.PI&&c<=2*Math.PI?(h-=s/2,f-=s/2*Math.tan(u),d+=s/2,l+=s/2*Math.tan(u)):c>.25*Math.PI&&c<=.75*Math.PI?(f-=s/2,h-=s/2/Math.tan(u),l+=s/2,d+=s/2/Math.tan(u)):c>.75*Math.PI&&c<=1.25*Math.PI?(h+=s/2,f+=s/2*Math.tan(u),d-=s/2,l-=s/2*Math.tan(u)):c>1.25*Math.PI&&c<=1.75*Math.PI&&(f+=s/2,h+=s/2/Math.tan(u),l-=s/2,d-=s/2/Math.tan(u)),r=e.createLinearGradient(Math.round(h),Math.round(f),Math.round(d),Math.round(l))}return r},t}();for(var y={},w=0;w<=40;w++)y[w]=w;const x={width:300,height:300,data:"",margin:0,qrOptions:{typeNumber:y[0],mode:void 0,errorCorrectionLevel:"Q"},imageOptions:{hideBackgroundDots:!0,imageSize:.4,crossOrigin:void 0,margin:0},dotsOptions:{type:"square",color:"#000"},backgroundOptions:{color:"#fff"}};var b=function(){return(b=Object.assign||function(t){for(var r,e=1,n=arguments.length;eMath.min(r.width,r.height)&&(r.margin=Math.min(r.width,r.height)),r.dotsOptions=b({},r.dotsOptions),r.dotsOptions.gradient&&(r.dotsOptions.gradient=_(r.dotsOptions.gradient)),r.cornersSquareOptions&&(r.cornersSquareOptions=b({},r.cornersSquareOptions),r.cornersSquareOptions.gradient&&(r.cornersSquareOptions.gradient=_(r.cornersSquareOptions.gradient))),r.cornersDotOptions&&(r.cornersDotOptions=b({},r.cornersDotOptions),r.cornersDotOptions.gradient&&(r.cornersDotOptions.gradient=_(r.cornersDotOptions.gradient))),r.backgroundOptions&&(r.backgroundOptions=b({},r.backgroundOptions),r.backgroundOptions.gradient&&(r.backgroundOptions.gradient=_(r.backgroundOptions.gradient))),r}var m=e(192),O=e.n(m);const S=function(){function t(t){this._options=t?M(a(x,t)):x,this.update()}return t._clearContainer=function(t){t&&(t.innerHTML="")},t.prototype.update=function(r){t._clearContainer(this._container),this._options=r?M(a(this._options,r)):this._options,this._options.data&&(this._qr=O()(this._options.qrOptions.typeNumber,this._options.qrOptions.errorCorrectionLevel),this._qr.addData(this._options.data,this._options.qrOptions.mode||function(t){switch(!0){case/^[0-9]*$/.test(t):return"Numeric";case/^[0-9A-Z $%*+\-./:]*$/.test(t):return"Alphanumeric";default:return"Byte"}}(this._options.data)),this._qr.make(),this._canvas=new v(this._options),this._drawingPromise=this._canvas.drawQR(this._qr),this.append(this._container))},t.prototype.append=function(t){if(t){if("function"!=typeof t.appendChild)throw"Container should be a single DOM node";this._canvas&&t.appendChild(this._canvas.getCanvas()),this._container=t}},t.prototype.download=function(t){var r=this;this._drawingPromise&&this._drawingPromise.then((function(){if(r._canvas){var e="png",n="qr";"string"==typeof t?(e=t,console.warn("Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument")):"object"==typeof t&&null!==t&&(t.name&&(n=t.name),t.extension&&(e=t.extension)),function(t,r){var e=document.createElement("a");e.download=r,e.href=t,document.body.appendChild(e),e.click(),document.body.removeChild(e)}(r._canvas.getCanvas().toDataURL("image/"+e),n+"."+e)}}))},t}()}},r={};function e(n){if(r[n])return r[n].exports;var o=r[n]={exports:{}};return t[n](o,o.exports,e),o.exports}return e.n=t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},e.d=(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},e.o=(t,r)=>Object.prototype.hasOwnProperty.call(t,r),e(151)})().default}}]); +//# sourceMappingURL=npm.qr-code-styling.b2874a156be40d4efbb7.chunk.js.map \ No newline at end of file diff --git a/public/npm.qr-code-styling.c53238820878551c10bf.chunk.js.map b/public/npm.qr-code-styling.b2874a156be40d4efbb7.chunk.js.map similarity index 99% rename from public/npm.qr-code-styling.c53238820878551c10bf.chunk.js.map rename to public/npm.qr-code-styling.b2874a156be40d4efbb7.chunk.js.map index 18c365f7c..693e4c7f7 100644 --- a/public/npm.qr-code-styling.c53238820878551c10bf.chunk.js.map +++ b/public/npm.qr-code-styling.b2874a156be40d4efbb7.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./node_modules/qr-code-styling/lib/qr-code-styling.js"],"names":["self","module","exports","t","192","r","e","n","o","a","i","u","v","y","x","Array","b","m","_","S","M","C","O","s","getPatternPosition","length","c","getBCHTypeNumber","Math","floor","getBCHTypeInfo","getMaskFunction","h","f","d","getRSBlocks","put","getMode","getLength","getLengthInBits","write","dataCount","putBit","totalCount","max","getBuffer","l","getErrorCorrectPolynomial","g","mod","p","getAt","w","addData","push","isDark","getModuleCount","make","getLostPoint","createTableTag","createSvgTag","arguments","cellSize","margin","alt","title","text","id","scalable","k","join","trim","createDataURL","createImgTag","charAt","createASCII","substring","renderTo2dContext","fillStyle","fillRect","stringToBytes","stringToBytesFuncs","default","charCodeAt","createStringToBytes","read","String","fromCharCode","L","Q","H","multiply","gexp","abs","glog","SJIS","writeByte","writeShort","writeBytes","writeString","toByteArray","toString","match","setPixel","add","flush","contains","indexOf","size","apply","151","Object","assign","prototype","hasOwnProperty","call","this","isArray","shift","keys","forEach","context","type","_context","_type","draw","_drawDot","_drawClassy","_drawClassyRounded","_drawRounded","_drawExtraRounded","_drawSquare","getNeighbor","_rotateFigure","rotation","translate","rotate","closePath","_basicDot","arc","PI","_basicSquare","rect","_basicSideRounded","lineTo","_basicCornerRounded","_basicCornerExtraRounded","_basicCornersRounded","_basicCornersExtraRounded","_basicExtraRounded","_canvas","document","createElement","width","height","_options","defineProperty","get","getContext","enumerable","configurable","getCanvas","clear","clearRect","drawQR","label","sent","trys","ops","next","throw","return","Symbol","iterator","TypeError","done","value","pop","min","hideXDots","hideYDots","_qr","image","loadImage","_image","imageOptions","qrOptions","imageSize","errorCorrectionLevel","originalHeight","originalWidth","maxHiddenDots","maxHiddenAxisDots","dotSize","sqrt","ceil","round","drawBackground","drawDots","hideBackgroundDots","drawCorners","drawImage","count","Promise","then","backgroundOptions","gradient","_createGradient","options","additionalRotation","colorStops","offset","color","addColorStop","dotsOptions","beginPath","strokeStyle","fill","P","D","I","cornersSquareOptions","z","B","A","q","R","cornersDotOptions","T","j","E","Image","crossOrigin","onload","src","createRadialGradient","tan","createLinearGradient","data","typeNumber","mode","Number","map","Boolean","update","_clearContainer","innerHTML","_container","test","_drawingPromise","append","appendChild","download","console","warn","name","extension","href","body","click","removeChild","toDataURL","__esModule"],"mappings":"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GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,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","file":"npm.qr-code-styling.c53238820878551c10bf.chunk.js","sourcesContent":["!function(t,r){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=r():\"function\"==typeof define&&define.amd?define([],r):\"object\"==typeof exports?exports.QRCodeStyling=r():t.QRCodeStyling=r()}(self,(function(){return(()=>{var t={192:(t,r)=>{var e,n,o=function(){var t=function(t,r){var e=t,n=a[r],o=null,i=0,u=null,v=[],y={},x=function(t,r){o=function(t){for(var r=new Array(t),e=0;e=7&&M(t),null==u&&(u=C(e,n,v)),O(u,r)},b=function(t,r){for(var e=-1;e<=7;e+=1)if(!(t+e<=-1||i<=t+e))for(var n=-1;n<=7;n+=1)r+n<=-1||i<=r+n||(o[t+e][r+n]=0<=e&&e<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==e||6==e)||2<=e&&e<=4&&2<=n&&n<=4)},_=function(){for(var t=8;t>n&1);o[Math.floor(n/3)][n%3+i-8-3]=a}for(n=0;n<18;n+=1)a=!t&&1==(r>>n&1),o[n%3+i-8-3][Math.floor(n/3)]=a},S=function(t,r){for(var e=n<<3|r,a=s.getBCHTypeInfo(e),u=0;u<15;u+=1){var c=!t&&1==(a>>u&1);u<6?o[u][8]=c:u<8?o[u+1][8]=c:o[i-15+u][8]=c}for(u=0;u<15;u+=1)c=!t&&1==(a>>u&1),u<8?o[8][i-u-1]=c:u<9?o[8][15-u-1+1]=c:o[8][15-u-1]=c;o[i-8][8]=!t},O=function(t,r){for(var e=-1,n=i-1,a=7,u=0,c=s.getMaskFunction(r),h=i-1;h>0;h-=2)for(6==h&&(h-=1);;){for(var f=0;f<2;f+=1)if(null==o[n][h-f]){var d=!1;u>>a&1)),c(n,h-f)&&(d=!d),o[n][h-f]=d,-1==(a-=1)&&(u+=1,a=7)}if((n+=e)<0||i<=n){n-=e,e=-e;break}}},C=function(t,r,e){for(var n=h.getRSBlocks(t,r),o=f(),i=0;i8*u)throw\"code length overflow. (\"+o.getLengthInBits()+\">\"+8*u+\")\";for(o.getLengthInBits()+4<=8*u&&o.put(0,4);o.getLengthInBits()%8!=0;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*u||(o.put(236,8),o.getLengthInBits()>=8*u));)o.put(17,8);return function(t,r){for(var e=0,n=0,o=0,i=new Array(r.length),a=new Array(r.length),u=0;u=0?g.getAt(p):0}}var v=0;for(d=0;dn)&&(t=n,r=e)}return r}())},y.createTableTag=function(t,r){t=t||2;var e=\"\";e+='',e+=\"\";for(var n=0;n\";for(var o=0;o';e+=\"\"}return(e+=\"\")+\"
\"},y.createSvgTag=function(t,r,e,n){var o={};\"object\"==typeof arguments[0]&&(t=(o=arguments[0]).cellSize,r=o.margin,e=o.alt,n=o.title),t=t||2,r=void 0===r?4*t:r,(e=\"string\"==typeof e?{text:e}:e||{}).text=e.text||null,e.id=e.text?e.id||\"qrcode-description\":null,(n=\"string\"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||\"qrcode-title\":null;var i,a,s,u,c=y.getModuleCount()*t+2*r,h=\"\";for(u=\"l\"+t+\",0 0,\"+t+\" -\"+t+\",0 0,-\"+t+\"z \",h+='\",h+=n.text?''+k(n.text)+\"\":\"\",h+=e.text?''+k(e.text)+\"\":\"\",h+='',h+='')+\"\"},y.createDataURL=function(t,r){t=t||2,r=void 0===r?4*t:r;var e=y.getModuleCount()*t+2*r,n=r,o=e-r;return w(e,e,(function(r,e){if(n<=r&&r\"};var k=function(t){for(var r=\"\",e=0;e\":r+=\">\";break;case\"&\":r+=\"&\";break;case'\"':r+=\""\";break;default:r+=n}}return r};return y.createASCII=function(t,r){if((t=t||1)<2)return function(t){t=void 0===t?2:t;var r,e,n,o,i,a=1*y.getModuleCount()+2*t,s=t,u=a-t,c={\"██\":\"█\",\"█ \":\"▀\",\" █\":\"▄\",\" \":\" \"},h={\"██\":\"▀\",\"█ \":\"▀\",\" █\":\" \",\" \":\" \"},f=\"\";for(r=0;r=u?h[i]:c[i];f+=\"\\n\"}return a%2&&t>0?f.substring(0,f.length-a-1)+Array(a+1).join(\"▀\"):f.substring(0,f.length-1)}(r);t-=1,r=void 0===r?2*t:r;var e,n,o,i,a=y.getModuleCount()*t+2*r,s=r,u=a-r,c=Array(t+1).join(\"██\"),h=Array(t+1).join(\" \"),f=\"\",d=\"\";for(e=0;e>>8),r.push(255&a)):r.push(n)}}return r}};var r,e,n,o,i,a={L:1,M:0,Q:3,H:2},s=(r=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e=1335,n=7973,i=function(t){for(var r=0;0!=t;)r+=1,t>>>=1;return r},(o={}).getBCHTypeInfo=function(t){for(var r=t<<10;i(r)-i(e)>=0;)r^=e<=0;)r^=n<5&&(e+=3+i-5)}for(n=0;n=256;)r-=255;return t[r]}}}();function c(t,r){if(void 0===t.length)throw t.length+\"/\"+r;var e=function(){for(var e=0;e>>7-r%8&1)},put:function(t,r){for(var n=0;n>>r-n-1&1))},getLengthInBits:function(){return r},putBit:function(e){var n=Math.floor(r/8);t.length<=n&&t.push(0),e&&(t[n]|=128>>>r%8),r+=1}};return e},d=function(t){var r=t,e={getMode:function(){return 1},getLength:function(t){return r.length},write:function(t){for(var e=r,o=0;o+2>>8&255)+(255&o),t.put(o,13),e+=2}if(e>>8)},writeBytes:function(t,e,n){e=e||0,n=n||t.length;for(var o=0;o0&&(r+=\",\"),r+=t[e];return r+\"]\"}};return r},y=function(t){var r=t,e=0,n=0,o=0,i={read:function(){for(;o<8;){if(e>=r.length){if(0==o)return-1;throw\"unexpected end of file./\"+o}var t=r.charAt(e);if(e+=1,\"=\"==t)return o=0,-1;t.match(/^\\s$/)||(n=n<<6|a(t.charCodeAt(0)),o+=6)}var i=n>>>o-8&255;return o-=8,i}},a=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw\"c:\"+t};return i},w=function(t,r,e){for(var n=function(t,r){var e=t,n=r,o=new Array(t*r),i={setPixel:function(t,r,n){o[r*e+t]=n},write:function(t){t.writeString(\"GIF87a\"),t.writeShort(e),t.writeShort(n),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(\",\"),t.writeShort(0),t.writeShort(0),t.writeShort(e),t.writeShort(n),t.writeByte(0);var r=a(2);t.writeByte(2);for(var o=0;r.length-o>255;)t.writeByte(255),t.writeBytes(r,o,255),o+=255;t.writeByte(r.length-o),t.writeBytes(r,o,r.length-o),t.writeByte(0),t.writeString(\";\")}},a=function(t){for(var r=1<>>r!=0)throw\"length over\";for(;c+r>=8;)u.writeByte(255&(t<>>=8-c,h=0,c=0;h|=t<0&&u.writeByte(h)}});d.write(r,n);var l=0,g=String.fromCharCode(o[l]);for(l+=1;l=6;)i(t>>>r-6),r-=6},o.flush=function(){if(r>0&&(i(t<<6-r),t=0,r=0),e%3!=0)for(var o=3-e%3,a=0;a>6,128|63&n):n<55296||n>=57344?r.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&t.charCodeAt(e)),r.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return r}(t)},void 0===(n=\"function\"==typeof(e=function(){return o})?e.apply(r,[]):e)||(t.exports=n)},151:(t,r,e)=>{\"use strict\";e.d(r,{default:()=>O});var n=function(){return(n=Object.assign||function(t){for(var r,e=1,n=arguments.length;e2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawExtraRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1),h=a+s+u+c;if(0!==h)if(h>2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawClassy=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t}();var h=function(){return(h=Object.assign||function(t){for(var r,e=1,n=arguments.length;e0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]n||o&&o=(r-o.hideXDots)/2&&t<(r+o.hideXDots)/2&&e>=(r-o.hideYDots)/2&&e<(r+o.hideYDots)/2||(null===(n=g[t])||void 0===n?void 0:n[e])||(null===(i=g[t-r+7])||void 0===i?void 0:i[e])||(null===(a=g[t])||void 0===a?void 0:a[e-r+7])||(null===(s=p[t])||void 0===s?void 0:s[e])||(null===(u=p[t-r+7])||void 0===u?void 0:u[e])||(null===(c=p[t])||void 0===c?void 0:c[e-r+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:r,dotSize:n}),[2]}}))},new((n=void 0)||(n=Promise))((function(t,i){function a(t){try{u(o.next(t))}catch(t){i(t)}}function s(t){try{u(o.throw(t))}catch(t){i(t)}}function u(r){var e;r.done?t(r.value):(e=r.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,s)}u((o=o.apply(r,e||[])).next())}));var r,e,n,o},t.prototype.drawBackground=function(){var t=this.context,r=this._options;if(t){if(r.backgroundOptions.gradient){var e=r.backgroundOptions.gradient,n=this._createGradient({context:t,options:e,additionalRotation:0,x:0,y:0,size:this._canvas.width>this._canvas.height?this._canvas.width:this._canvas.height});e.colorStops.forEach((function(t){var r=t.offset,e=t.color;n.addColorStop(r,e)})),t.fillStyle=n}else r.backgroundOptions.color&&(t.fillStyle=r.backgroundOptions.color);t.fillRect(0,0,this._canvas.width,this._canvas.height)}},t.prototype.drawDots=function(t){var r=this;if(!this._qr)throw\"QR code is not defined\";var e=this.context;if(!e)throw\"QR code is not defined\";var n=this._options,o=this._qr.getModuleCount();if(o>n.width||o>n.height)throw\"The canvas is too small.\";var i=Math.min(n.width,n.height)-2*n.margin,a=Math.floor(i/o),s=Math.floor((n.width-o*a)/2),u=Math.floor((n.height-o*a)/2),h=new c({context:e,type:n.dotsOptions.type});e.beginPath();for(var f=function(e){for(var n=function(n){return t&&!t(e,n)?\"continue\":d._qr.isDark(e,n)?void h.draw(s+e*a,u+n*a,a,(function(i,a){return!(e+i<0||n+a<0||e+i>=o||n+a>=o)&&!(t&&!t(e+i,n+a))&&!!r._qr&&r._qr.isDark(e+i,n+a)})):\"continue\"},i=0;i=0&&c<=.25*Math.PI||c>1.75*Math.PI&&c<=2*Math.PI?(h-=s/2,f-=s/2*Math.tan(u),d+=s/2,l+=s/2*Math.tan(u)):c>.25*Math.PI&&c<=.75*Math.PI?(f-=s/2,h-=s/2/Math.tan(u),l+=s/2,d+=s/2/Math.tan(u)):c>.75*Math.PI&&c<=1.25*Math.PI?(h+=s/2,f+=s/2*Math.tan(u),d-=s/2,l-=s/2*Math.tan(u)):c>1.25*Math.PI&&c<=1.75*Math.PI&&(f+=s/2,h+=s/2/Math.tan(u),l-=s/2,d-=s/2/Math.tan(u)),r=e.createLinearGradient(Math.round(h),Math.round(f),Math.round(d),Math.round(l))}return r},t}();for(var y={},w=0;w<=40;w++)y[w]=w;const x={width:300,height:300,data:\"\",margin:0,qrOptions:{typeNumber:y[0],mode:void 0,errorCorrectionLevel:\"Q\"},imageOptions:{hideBackgroundDots:!0,imageSize:.4,crossOrigin:void 0,margin:0},dotsOptions:{type:\"square\",color:\"#000\"},backgroundOptions:{color:\"#fff\"}};var b=function(){return(b=Object.assign||function(t){for(var r,e=1,n=arguments.length;eMath.min(r.width,r.height)&&(r.margin=Math.min(r.width,r.height)),r.dotsOptions=b({},r.dotsOptions),r.dotsOptions.gradient&&(r.dotsOptions.gradient=_(r.dotsOptions.gradient)),r.cornersSquareOptions&&(r.cornersSquareOptions=b({},r.cornersSquareOptions),r.cornersSquareOptions.gradient&&(r.cornersSquareOptions.gradient=_(r.cornersSquareOptions.gradient))),r.cornersDotOptions&&(r.cornersDotOptions=b({},r.cornersDotOptions),r.cornersDotOptions.gradient&&(r.cornersDotOptions.gradient=_(r.cornersDotOptions.gradient))),r.backgroundOptions&&(r.backgroundOptions=b({},r.backgroundOptions),r.backgroundOptions.gradient&&(r.backgroundOptions.gradient=_(r.backgroundOptions.gradient))),r}var M=e(192),S=e.n(M);const O=function(){function t(t){this._options=t?m(a(x,t)):x,this.update()}return t._clearContainer=function(t){t&&(t.innerHTML=\"\")},t.prototype.update=function(r){t._clearContainer(this._container),this._options=r?m(a(this._options,r)):this._options,this._options.data&&(this._qr=S()(this._options.qrOptions.typeNumber,this._options.qrOptions.errorCorrectionLevel),this._qr.addData(this._options.data,this._options.qrOptions.mode||function(t){switch(!0){case/^[0-9]*$/.test(t):return\"Numeric\";case/^[0-9A-Z $%*+\\-./:]*$/.test(t):return\"Alphanumeric\";default:return\"Byte\"}}(this._options.data)),this._qr.make(),this._canvas=new v(this._options),this._drawingPromise=this._canvas.drawQR(this._qr),this.append(this._container))},t.prototype.append=function(t){if(t){if(\"function\"!=typeof t.appendChild)throw\"Container should be a single DOM node\";this._canvas&&t.appendChild(this._canvas.getCanvas()),this._container=t}},t.prototype.download=function(t){var r=this;this._drawingPromise&&this._drawingPromise.then((function(){if(r._canvas){var e=\"png\",n=\"qr\";\"string\"==typeof t?(e=t,console.warn(\"Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument\")):\"object\"==typeof t&&null!==t&&(t.name&&(n=t.name),t.extension&&(e=t.extension)),function(t,r){var e=document.createElement(\"a\");e.download=r,e.href=t,document.body.appendChild(e),e.click(),document.body.removeChild(e)}(r._canvas.getCanvas().toDataURL(\"image/\"+e),n+\".\"+e)}}))},t}()}},r={};function e(n){if(r[n])return r[n].exports;var o=r[n]={exports:{}};return t[n](o,o.exports,e),o.exports}return e.n=t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},e.d=(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},e.o=(t,r)=>Object.prototype.hasOwnProperty.call(t,r),e(151)})().default}));\n//# sourceMappingURL=qr-code-styling.js.map"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./node_modules/qr-code-styling/lib/qr-code-styling.js"],"names":["self","module","exports","t","192","r","e","n","o","a","i","u","v","y","x","Array","b","m","_","S","M","C","O","s","getPatternPosition","length","c","getBCHTypeNumber","Math","floor","getBCHTypeInfo","getMaskFunction","h","f","d","getRSBlocks","put","getMode","getLength","getLengthInBits","write","dataCount","putBit","totalCount","max","getBuffer","l","getErrorCorrectPolynomial","g","mod","p","getAt","w","addData","push","isDark","getModuleCount","make","getLostPoint","createTableTag","createSvgTag","arguments","cellSize","margin","alt","title","text","id","scalable","k","join","trim","createDataURL","createImgTag","charAt","createASCII","substring","renderTo2dContext","fillStyle","fillRect","stringToBytes","stringToBytesFuncs","default","charCodeAt","createStringToBytes","read","String","fromCharCode","L","Q","H","multiply","gexp","abs","glog","SJIS","writeByte","writeShort","writeBytes","writeString","toByteArray","toString","match","setPixel","add","flush","contains","indexOf","size","apply","151","Object","assign","prototype","hasOwnProperty","call","this","isArray","shift","keys","forEach","context","type","_context","_type","draw","_drawDot","_drawClassy","_drawClassyRounded","_drawRounded","_drawExtraRounded","_drawSquare","getNeighbor","_rotateFigure","rotation","translate","rotate","closePath","_basicDot","arc","PI","_basicSquare","rect","_basicSideRounded","lineTo","_basicCornerRounded","_basicCornerExtraRounded","_basicCornersRounded","_basicCornersExtraRounded","_basicExtraRounded","_canvas","document","createElement","width","height","_options","defineProperty","get","getContext","enumerable","configurable","getCanvas","clear","clearRect","drawQR","label","sent","trys","ops","next","throw","return","Symbol","iterator","TypeError","done","value","pop","min","hideXDots","hideYDots","_qr","image","loadImage","_image","imageOptions","qrOptions","imageSize","errorCorrectionLevel","originalHeight","originalWidth","maxHiddenDots","maxHiddenAxisDots","dotSize","sqrt","ceil","round","drawBackground","drawDots","hideBackgroundDots","drawCorners","drawImage","count","Promise","then","backgroundOptions","gradient","_createGradient","options","additionalRotation","colorStops","offset","color","addColorStop","dotsOptions","beginPath","strokeStyle","fill","P","D","I","cornersSquareOptions","z","B","A","q","R","cornersDotOptions","T","j","E","Image","crossOrigin","onload","src","createRadialGradient","tan","createLinearGradient","data","typeNumber","mode","Number","map","Boolean","update","_clearContainer","innerHTML","_container","test","_drawingPromise","append","appendChild","download","console","warn","name","extension","href","body","click","removeChild","toDataURL","__esModule"],"mappings":"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GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,KAAKE,EAAE,SAASF,EAAEE,GAAG,IAAIC,EAAE,GAAG,OAAOA,EAAEqC,WAAWxC,EAAEG,EAAEmC,UAAUpC,EAAEC,GAA4Y,MAAvY,CAAC6B,YAAY,SAAS7B,EAAEC,GAAG,IAAIC,EAAE,SAASH,EAAEC,GAAG,OAAOA,GAAG,KAAKG,EAAE+E,EAAE,OAAOrF,EAAE,GAAGE,EAAE,GAAG,GAAG,KAAKI,EAAEW,EAAE,OAAOjB,EAAE,GAAGE,EAAE,GAAG,GAAG,KAAKI,EAAEgF,EAAE,OAAOtF,EAAE,GAAGE,EAAE,GAAG,GAAG,KAAKI,EAAEiF,EAAE,OAAOvF,EAAE,GAAGE,EAAE,GAAG,GAAG,QAAQ,QAApJ,CAA6JC,EAAEC,GAAG,QAAG,IAASC,EAAE,KAAK,6BAA6BF,EAAE,yBAAyBC,EAAE,IAAI,IAAIG,EAAEF,EAAEiB,OAAO,EAAEF,EAAE,GAAGZ,EAAE,EAAEA,EAAED,EAAEC,GAAG,EAAE,IAAI,IAAIe,EAAElB,EAAE,EAAEG,EAAE,GAAGqB,EAAExB,EAAE,EAAEG,EAAE,GAAGsB,EAAEzB,EAAE,EAAEG,EAAE,GAAGuB,EAAE,EAAEA,EAAER,EAAEQ,GAAG,EAAEX,EAAE+B,KAAKjD,EAAE2B,EAAEC,IAAI,OAAOV,IAAnwG,GAAmxGU,EAAE,WAAW,IAAI9B,EAAE,GAAGE,EAAE,EAAEC,EAAE,CAACuC,UAAU,WAAW,OAAO1C,GAAGgD,MAAM,SAAS9C,GAAG,IAAIC,EAAEsB,KAAKC,MAAMxB,EAAE,GAAG,OAAO,IAAIF,EAAEG,KAAK,EAAED,EAAE,EAAE,IAAI+B,IAAI,SAASjC,EAAEE,GAAG,IAAI,IAAIE,EAAE,EAAEA,EAAEF,EAAEE,GAAG,EAAED,EAAEoC,OAAO,IAAIvC,IAAIE,EAAEE,EAAE,EAAE,KAAKgC,gBAAgB,WAAW,OAAOlC,GAAGqC,OAAO,SAASpC,GAAG,IAAIC,EAAEqB,KAAKC,MAAMxB,EAAE,GAAGF,EAAEsB,QAAQlB,GAAGJ,EAAEmD,KAAK,GAAGhD,IAAIH,EAAEI,IAAI,MAAMF,EAAE,GAAGA,GAAG,IAAI,OAAOC,GAAG4B,EAAE,SAAS/B,GAAG,IAAIE,EAAEF,EAAEG,EAAE,CAAC+B,QAAQ,WAAW,OAAO,GAAGC,UAAU,SAASnC,GAAG,OAAOE,EAAEoB,QAAQe,MAAM,SAASrC,GAAG,IAAI,IAAIG,EAAED,EAAEG,EAAE,EAAEA,EAAE,EAAEF,EAAEmB,QAAQtB,EAAEiC,IAAI7B,EAAED,EAAEsE,UAAUpE,EAAEA,EAAE,IAAI,IAAIA,GAAG,EAAEA,EAAEF,EAAEmB,SAASnB,EAAEmB,OAAOjB,GAAG,EAAEL,EAAEiC,IAAI7B,EAAED,EAAEsE,UAAUpE,EAAEA,EAAE,IAAI,GAAGF,EAAEmB,OAAOjB,GAAG,GAAGL,EAAEiC,IAAI7B,EAAED,EAAEsE,UAAUpE,EAAEA,EAAE,IAAI,MAAMD,EAAE,SAASJ,GAAG,IAAI,IAAIE,EAAE,EAAEC,EAAE,EAAEA,EAAEH,EAAEsB,OAAOnB,GAAG,EAAED,EAAE,GAAGA,EAAEG,EAAEL,EAAEuE,OAAOpE,IAAI,OAAOD,GAAGG,EAAE,SAASL,GAAG,GAAG,KAAKA,GAAGA,GAAG,IAAI,OAAOA,EAAEgF,WAAW,GAAG,IAAIA,WAAW,GAAG,KAAK,iBAAiBhF,GAAG,OAAOG,GAAGwC,EAAE,SAAS3C,GAAG,IAAIE,EAAEF,EAAEG,EAAE,CAAC+B,QAAQ,WAAW,OAAO,GAAGC,UAAU,SAASnC,GAAG,OAAOE,EAAEoB,QAAQe,MAAM,SAASrC,GAAG,IAAI,IAAIG,EAAED,EAAEG,EAAE,EAAEA,EAAE,EAAEF,EAAEmB,QAAQtB,EAAEiC,IAAI,GAAG7B,EAAED,EAAEoE,OAAOlE,IAAID,EAAED,EAAEoE,OAAOlE,EAAE,IAAI,IAAIA,GAAG,EAAEA,EAAEF,EAAEmB,QAAQtB,EAAEiC,IAAI7B,EAAED,EAAEoE,OAAOlE,IAAI,KAAKD,EAAE,SAASJ,GAAG,GAAG,KAAKA,GAAGA,GAAG,IAAI,OAAOA,EAAEgF,WAAW,GAAG,IAAIA,WAAW,GAAG,GAAG,KAAKhF,GAAGA,GAAG,IAAI,OAAOA,EAAEgF,WAAW,GAAG,IAAIA,WAAW,GAAG,GAAG,OAAOhF,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,QAAQ,KAAK,iBAAiBA,IAAI,OAAOG,GAAG0C,EAAE,SAAS3C,GAAG,IAAIC,EAAEH,EAAE6E,cAAc3E,GAAG,MAAM,CAACgC,QAAQ,WAAW,OAAO,GAAGC,UAAU,SAASnC,GAAG,OAAOG,EAAEmB,QAAQe,MAAM,SAASrC,GAAG,IAAI,IAAIE,EAAE,EAAEA,EAAEC,EAAEmB,OAAOpB,GAAG,EAAEF,EAAEiC,IAAI9B,EAAED,GAAG,MAAM6C,EAAE,SAAS7C,GAAG,IAAIC,EAAEH,EAAE8E,mBAAmBc,KAAK,IAAIzF,EAAE,KAAK,uBAAuB,SAASH,EAAEE,GAAG,IAAIE,EAAED,EAAE,KAAK,GAAG,GAAGC,EAAEkB,QAAQ,QAAQlB,EAAE,IAAI,EAAEA,EAAE,IAAI,KAAK,sBAAtE,GAA+F,IAAIA,EAAED,EAAED,GAAG,MAAM,CAACgC,QAAQ,WAAW,OAAO,GAAGC,UAAU,SAASnC,GAAG,SAASI,EAAEkB,OAAO,IAAIe,MAAM,SAASrC,GAAG,IAAI,IAAIE,EAAEE,EAAED,EAAE,EAAEA,EAAE,EAAED,EAAEoB,QAAQ,CAAC,IAAIjB,GAAG,IAAIH,EAAEC,KAAK,EAAE,IAAID,EAAEC,EAAE,GAAG,GAAG,OAAOE,GAAGA,GAAG,MAAMA,GAAG,UAAU,CAAC,KAAK,OAAOA,GAAGA,GAAG,OAAO,KAAK,oBAAoBF,EAAE,GAAG,IAAIE,EAAEA,GAAG,MAAMA,EAAE,KAAKA,IAAI,EAAE,MAAM,IAAIA,GAAGL,EAAEiC,IAAI5B,EAAE,IAAIF,GAAG,EAAE,GAAGA,EAAED,EAAEoB,OAAO,KAAK,oBAAoBnB,EAAE,MAAMM,EAAE,WAAW,IAAIT,EAAE,GAAGE,EAAE,CAAC2F,UAAU,SAAS3F,GAAGF,EAAEmD,KAAK,IAAIjD,IAAI4F,WAAW,SAAS9F,GAAGE,EAAE2F,UAAU7F,GAAGE,EAAE2F,UAAU7F,IAAI,IAAI+F,WAAW,SAAS/F,EAAEG,EAAEC,GAAGD,EAAEA,GAAG,EAAEC,EAAEA,GAAGJ,EAAEsB,OAAO,IAAI,IAAIjB,EAAE,EAAEA,EAAED,EAAEC,GAAG,EAAEH,EAAE2F,UAAU7F,EAAEK,EAAEF,KAAK6F,YAAY,SAAShG,GAAG,IAAI,IAAIG,EAAE,EAAEA,EAAEH,EAAEsB,OAAOnB,GAAG,EAAED,EAAE2F,UAAU7F,EAAEgF,WAAW7E,KAAK8F,YAAY,WAAW,OAAOjG,GAAGkG,SAAS,WAAW,IAAIhG,EAAE,GAAGA,GAAG,IAAI,IAAI,IAAIC,EAAE,EAAEA,EAAEH,EAAEsB,OAAOnB,GAAG,EAAEA,EAAE,IAAID,GAAG,KAAKA,GAAGF,EAAEG,GAAG,OAAOD,EAAE,MAAM,OAAOA,GAAGQ,EAAE,SAASV,GAAG,IAAIE,EAAEF,EAAEG,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEE,EAAE,CAAC2E,KAAK,WAAW,KAAK7E,EAAE,GAAG,CAAC,GAAGF,GAAGD,EAAEoB,OAAO,CAAC,GAAG,GAAGjB,EAAE,OAAO,EAAE,KAAK,2BAA2BA,EAAE,IAAIL,EAAEE,EAAEqE,OAAOpE,GAAG,GAAGA,GAAG,EAAE,KAAKH,EAAE,OAAOK,EAAE,GAAG,EAAEL,EAAEmG,MAAM,UAAU/F,EAAEA,GAAG,EAAEE,EAAEN,EAAEgF,WAAW,IAAI3E,GAAG,GAAG,IAAIE,EAAEH,IAAIC,EAAE,EAAE,IAAI,OAAOA,GAAG,EAAEE,IAAID,EAAE,SAASN,GAAG,GAAG,IAAIA,GAAGA,GAAG,GAAG,OAAOA,EAAE,GAAG,GAAG,IAAIA,GAAGA,GAAG,IAAI,OAAOA,EAAE,GAAG,GAAG,GAAG,IAAIA,GAAGA,GAAG,GAAG,OAAOA,EAAE,GAAG,GAAG,GAAG,IAAIA,EAAE,OAAO,GAAG,GAAG,IAAIA,EAAE,OAAO,GAAG,KAAK,KAAKA,GAAG,OAAOO,GAAG0C,EAAE,SAASjD,EAAEE,EAAEC,GAAG,IAAI,IAAIC,EAAE,SAASJ,EAAEE,GAAG,IAAIC,EAAEH,EAAEI,EAAEF,EAAEG,EAAE,IAAIO,MAAMZ,EAAEE,GAAGK,EAAE,CAAC6F,SAAS,SAASpG,EAAEE,EAAEE,GAAGC,EAAEH,EAAEC,EAAEH,GAAGI,GAAGiC,MAAM,SAASrC,GAAGA,EAAEgG,YAAY,UAAUhG,EAAE8F,WAAW3F,GAAGH,EAAE8F,WAAW1F,GAAGJ,EAAE6F,UAAU,KAAK7F,EAAE6F,UAAU,GAAG7F,EAAE6F,UAAU,GAAG7F,EAAE6F,UAAU,GAAG7F,EAAE6F,UAAU,GAAG7F,EAAE6F,UAAU,GAAG7F,EAAE6F,UAAU,KAAK7F,EAAE6F,UAAU,KAAK7F,EAAE6F,UAAU,KAAK7F,EAAEgG,YAAY,KAAKhG,EAAE8F,WAAW,GAAG9F,EAAE8F,WAAW,GAAG9F,EAAE8F,WAAW3F,GAAGH,EAAE8F,WAAW1F,GAAGJ,EAAE6F,UAAU,GAAG,IAAI3F,EAAEI,EAAE,GAAGN,EAAE6F,UAAU,GAAG,IAAI,IAAIxF,EAAE,EAAEH,EAAEoB,OAAOjB,EAAE,KAAKL,EAAE6F,UAAU,KAAK7F,EAAE+F,WAAW7F,EAAEG,EAAE,KAAKA,GAAG,IAAIL,EAAE6F,UAAU3F,EAAEoB,OAAOjB,GAAGL,EAAE+F,WAAW7F,EAAEG,EAAEH,EAAEoB,OAAOjB,GAAGL,EAAE6F,UAAU,GAAG7F,EAAEgG,YAAY,OAAO1F,EAAE,SAASN,GAAG,IAAI,IAAIE,EAAE,GAAGF,EAAEG,EAAE,GAAG,GAAGH,GAAGI,EAAEJ,EAAE,EAAEO,EAAEa,IAAId,EAAE,EAAEA,EAAEJ,EAAEI,GAAG,EAAEC,EAAE8F,IAAIlB,OAAOC,aAAa9E,IAAIC,EAAE8F,IAAIlB,OAAOC,aAAalF,IAAIK,EAAE8F,IAAIlB,OAAOC,aAAajF,IAAI,IAAIK,EAAEe,EAAEM,EAAEC,EAAErB,IAAIsB,GAAGvB,EAAEsB,EAAEP,EAAE,EAAEM,EAAE,EAAE,CAACQ,MAAM,SAASrC,EAAEE,GAAG,GAAGF,IAAIE,GAAG,EAAE,KAAK,cAAc,KAAKqB,EAAErB,GAAG,GAAGM,EAAEqF,UAAU,KAAK7F,GAAGuB,EAAEM,IAAI3B,GAAG,EAAEqB,EAAEvB,KAAK,EAAEuB,EAAEM,EAAE,EAAEN,EAAE,EAAEM,GAAG7B,GAAGuB,EAAEA,GAAGrB,GAAGoG,MAAM,WAAW/E,EAAE,GAAGf,EAAEqF,UAAUhE,MAAME,EAAEM,MAAMnC,EAAEE,GAAG,IAAIuC,EAAE,EAAEE,EAAEsC,OAAOC,aAAa/E,EAAEsC,IAAI,IAAIA,GAAG,EAAEA,EAAEtC,EAAEiB,QAAQ,CAAC,IAAIyB,EAAEoC,OAAOC,aAAa/E,EAAEsC,IAAIA,GAAG,EAAEpC,EAAEgG,SAAS1D,EAAEE,GAAGF,GAAGE,GAAGhB,EAAEM,MAAM9B,EAAEiG,QAAQ3D,GAAGzC,GAAGG,EAAEkG,OAAO,OAAOlG,EAAEkG,QAAQ,GAAGrG,IAAIA,GAAG,GAAGG,EAAE8F,IAAIxD,EAAEE,IAAIF,EAAEE,GAAG,OAAOhB,EAAEM,MAAM9B,EAAEiG,QAAQ3D,GAAGzC,GAAG2B,EAAEM,MAAMlC,EAAEC,GAAG2B,EAAEuE,QAAQxE,EAAEmE,eAAe7E,EAAE,WAAW,IAAIpB,EAAE,GAAGE,EAAE,EAAEC,EAAE,CAACkG,IAAI,SAASjG,GAAG,GAAGD,EAAEoG,SAASnG,GAAG,KAAK,WAAWA,EAAEJ,EAAEI,GAAGF,EAAEA,GAAG,GAAGuG,KAAK,WAAW,OAAOvG,GAAGsG,QAAQ,SAAStG,GAAG,OAAOF,EAAEE,IAAIqG,SAAS,SAASrG,GAAG,YAAO,IAASF,EAAEE,KAAK,OAAOC,GAAG,OAAOI,EAA55C,CAA+5CP,EAAEE,GAAGG,EAAE,EAAEA,EAAEH,EAAEG,GAAG,EAAE,IAAI,IAAIE,EAAE,EAAEA,EAAEP,EAAEO,GAAG,EAAEH,EAAEgG,SAAS7F,EAAEF,EAAEF,EAAEI,EAAEF,IAAI,IAAIC,EAAEG,IAAIL,EAAEiC,MAAM/B,GAAG,IAAI,IAAIc,EAAE,WAAW,IAAIpB,EAAE,EAAEE,EAAE,EAAEC,EAAE,EAAEC,EAAE,GAAGC,EAAE,GAAGE,EAAE,SAASP,GAAGI,GAAG+E,OAAOC,aAAa9E,EAAE,GAAGN,KAAKM,EAAE,SAASN,GAAG,GAAGA,EAAE,OAAO,CAAC,GAAGA,EAAE,GAAG,OAAO,GAAGA,EAAE,GAAGA,EAAE,GAAG,OAAOA,EAAE,GAAG,GAAG,GAAGA,EAAE,GAAG,OAAOA,EAAE,GAAG,GAAG,GAAG,IAAIA,EAAE,OAAO,GAAG,GAAG,IAAIA,EAAE,OAAO,GAAG,KAAK,KAAKA,GAAG,OAAOK,EAAEwF,UAAU,SAASzF,GAAG,IAAIJ,EAAEA,GAAG,EAAE,IAAII,EAAEF,GAAG,EAAEC,GAAG,EAAED,GAAG,GAAGK,EAAEP,IAAIE,EAAE,GAAGA,GAAG,GAAGG,EAAEiG,MAAM,WAAW,GAAGpG,EAAE,IAAIK,EAAEP,GAAG,EAAEE,GAAGF,EAAE,EAAEE,EAAE,GAAGC,EAAE,GAAG,EAAE,IAAI,IAAIE,EAAE,EAAEF,EAAE,EAAEG,EAAE,EAAEA,EAAED,EAAEC,GAAG,EAAEF,GAAG,KAAKC,EAAE6F,SAAS,WAAW,OAAO9F,GAAGC,EAAhb,GAAqbG,EAAEF,EAAE2F,cAAc1E,EAAE,EAAEA,EAAEf,EAAEc,OAAOC,GAAG,EAAEH,EAAEyE,UAAUrF,EAAEe,IAAI,OAAOH,EAAEkF,QAAQ,yBAAyBlF,GAAG,OAAOpB,EAA/1mB,GAAo2mBK,EAAEyE,mBAAmB,SAAS,SAAS9E,GAAG,OAAO,SAASA,GAAG,IAAI,IAAIE,EAAE,GAAGC,EAAE,EAAEA,EAAEH,EAAEsB,OAAOnB,IAAI,CAAC,IAAIC,EAAEJ,EAAEgF,WAAW7E,GAAGC,EAAE,IAAIF,EAAEiD,KAAK/C,GAAGA,EAAE,KAAKF,EAAEiD,KAAK,IAAI/C,GAAG,EAAE,IAAI,GAAGA,GAAGA,EAAE,OAAOA,GAAG,MAAMF,EAAEiD,KAAK,IAAI/C,GAAG,GAAG,IAAIA,GAAG,EAAE,GAAG,IAAI,GAAGA,IAAID,IAAIC,EAAE,QAAQ,KAAKA,IAAI,GAAG,KAAKJ,EAAEgF,WAAW7E,IAAID,EAAEiD,KAAK,IAAI/C,GAAG,GAAG,IAAIA,GAAG,GAAG,GAAG,IAAIA,GAAG,EAAE,GAAG,IAAI,GAAGA,IAAI,OAAOF,EAA1R,CAA6RF,SAAI,KAAUI,EAAE,mBAAmBD,EAAE,WAAW,OAAOE,IAAIF,EAAEuG,MAAMxG,EAAE,IAAIC,KAAKH,EAAED,QAAQK,IAAIuG,IAAI,CAAC3G,EAAEE,EAAEC,KAAK,aAAaA,EAAE4B,EAAE7B,EAAE,CAAC6E,QAAQ,IAAI5D,IAAI,IAAIf,EAAE,WAAW,OAAOA,EAAEwG,OAAOC,QAAQ,SAAS7G,GAAG,IAAI,IAAIE,EAAEC,EAAE,EAAEC,EAAEsD,UAAUpC,OAAOnB,EAAEC,EAAED,IAAI,IAAI,IAAIE,KAAKH,EAAEwD,UAAUvD,GAAGyG,OAAOE,UAAUC,eAAeC,KAAK9G,EAAEG,KAAKL,EAAEK,GAAGH,EAAEG,IAAI,OAAOL,IAAI0G,MAAMO,KAAKvD,YAAYrD,EAAE,WAAW,IAAI,IAAIL,EAAE,EAAEE,EAAE,EAAEC,EAAEuD,UAAUpC,OAAOpB,EAAEC,EAAED,IAAIF,GAAG0D,UAAUxD,GAAGoB,OAAO,IAAIlB,EAAEQ,MAAMZ,GAAGK,EAAE,EAAE,IAAIH,EAAE,EAAEA,EAAEC,EAAED,IAAI,IAAI,IAAIK,EAAEmD,UAAUxD,GAAGI,EAAE,EAAEc,EAAEb,EAAEe,OAAOhB,EAAEc,EAAEd,IAAID,IAAID,EAAEC,GAAGE,EAAED,GAAG,OAAOF,GAAGG,EAAE,SAASP,GAAG,QAAQA,GAAG,iBAAiBA,IAAIY,MAAMsG,QAAQlH,IAAI,SAASM,EAAEN,GAAG,IAAI,IAAIE,EAAE,GAAGC,EAAE,EAAEA,EAAEuD,UAAUpC,OAAOnB,IAAID,EAAEC,EAAE,GAAGuD,UAAUvD,GAAG,IAAID,EAAEoB,OAAO,OAAOtB,EAAE,IAAIoB,EAAElB,EAAEiH,QAAQ,YAAO,IAAS/F,GAAGb,EAAEP,IAAIO,EAAEa,IAAIpB,EAAEI,EAAE,GAAGJ,GAAG4G,OAAOQ,KAAKhG,GAAGiG,SAAQ,SAAUnH,GAAG,IAAIC,EAAEH,EAAEE,GAAGE,EAAEgB,EAAElB,GAAGU,MAAMsG,QAAQ/G,IAAIS,MAAMsG,QAAQ9G,GAAGJ,EAAEE,GAAGE,EAAEG,EAAEJ,IAAII,EAAEH,GAAGJ,EAAEE,GAAGI,EAAEsG,OAAOC,OAAO,GAAG1G,GAAGC,GAAGJ,EAAEE,GAAGE,KAAKE,EAAEoG,WAAM,EAAOrG,EAAE,CAACL,GAAGE,KAAKF,EAAE,MAAMoB,EAAE,CAACiE,EAAE,IAAIpE,EAAE,IAAIqE,EAAE,IAAIC,EAAE,IAAI,IAAI/E,EAAE,WAAW,OAAOA,EAAEoG,OAAOC,QAAQ,SAAS7G,GAAG,IAAI,IAAIE,EAAEC,EAAE,EAAEC,EAAEsD,UAAUpC,OAAOnB,EAAEC,EAAED,IAAI,IAAI,IAAIE,KAAKH,EAAEwD,UAAUvD,GAAGyG,OAAOE,UAAUC,eAAeC,KAAK9G,EAAEG,KAAKL,EAAEK,GAAGH,EAAEG,IAAI,OAAOL,IAAI0G,MAAMO,KAAKvD,YAAY,MAAMnC,EAAE,WAAW,SAASvB,EAAEA,GAAG,IAAIE,EAAEF,EAAEsH,QAAQnH,EAAEH,EAAEuH,KAAKN,KAAKO,SAAStH,EAAE+G,KAAKQ,MAAMtH,EAAE,OAAOH,EAAE8G,UAAUY,KAAK,SAAS1H,EAAEE,EAAEC,EAAEC,GAAG,IAAIC,EAAEE,EAAE0G,KAAKO,SAAS,OAAOP,KAAKQ,OAAO,IAAI,OAAOpH,EAAE4G,KAAKU,SAAS,MAAM,IAAI,SAAStH,EAAE4G,KAAKW,YAAY,MAAM,IAAI,iBAAiBvH,EAAE4G,KAAKY,mBAAmB,MAAM,IAAI,UAAUxH,EAAE4G,KAAKa,aAAa,MAAM,IAAI,gBAAgBzH,EAAE4G,KAAKc,kBAAkB,MAAM,IAAI,SAAS,QAAQ1H,EAAE4G,KAAKe,YAAY3H,EAAE2G,KAAKC,KAAK,CAACtG,EAAEX,EAAEU,EAAER,EAAEuG,KAAKtG,EAAEmH,QAAQ/G,EAAE0H,YAAY7H,KAAKJ,EAAE8G,UAAUoB,cAAc,SAASlI,GAAG,IAAIE,EAAEF,EAAEW,EAAER,EAAEH,EAAEU,EAAEN,EAAEJ,EAAEyG,KAAKpG,EAAEL,EAAEsH,QAAQ/G,EAAEP,EAAEmI,SAAS7H,EAAEN,EAAE0H,KAAKtG,EAAElB,EAAEE,EAAE,EAAEI,EAAEL,EAAEC,EAAE,EAAEC,EAAE+H,UAAUhH,EAAEZ,GAAGD,GAAGF,EAAEgI,OAAO9H,GAAGD,IAAID,EAAEiI,YAAY/H,GAAGF,EAAEgI,QAAQ9H,GAAGF,EAAE+H,WAAWhH,GAAGZ,IAAIR,EAAE8G,UAAUyB,UAAU,SAASvI,GAAG,IAAIE,EAAEF,EAAEyG,KAAKtG,EAAEH,EAAEsH,QAAQL,KAAKiB,cAAc1H,EAAEA,EAAE,GAAGR,GAAG,CAAC0H,KAAK,WAAWvH,EAAEqI,IAAI,EAAE,EAAEtI,EAAE,EAAE,EAAE,EAAEuB,KAAKgH,SAASzI,EAAE8G,UAAU4B,aAAa,SAAS1I,GAAG,IAAIE,EAAEF,EAAEyG,KAAKtG,EAAEH,EAAEsH,QAAQL,KAAKiB,cAAc1H,EAAEA,EAAE,GAAGR,GAAG,CAAC0H,KAAK,WAAWvH,EAAEwI,MAAMzI,EAAE,GAAGA,EAAE,EAAEA,EAAEA,QAAQF,EAAE8G,UAAU8B,kBAAkB,SAAS5I,GAAG,IAAIE,EAAEF,EAAEyG,KAAKtG,EAAEH,EAAEsH,QAAQL,KAAKiB,cAAc1H,EAAEA,EAAE,GAAGR,GAAG,CAAC0H,KAAK,WAAWvH,EAAEqI,IAAI,EAAE,EAAEtI,EAAE,GAAGuB,KAAKgH,GAAG,EAAEhH,KAAKgH,GAAG,GAAGtI,EAAE0I,QAAQ3I,EAAE,EAAEA,EAAE,GAAGC,EAAE0I,QAAQ3I,EAAE,GAAGA,EAAE,GAAGC,EAAE0I,OAAO,GAAG3I,EAAE,QAAQF,EAAE8G,UAAUgC,oBAAoB,SAAS9I,GAAG,IAAIE,EAAEF,EAAEyG,KAAKtG,EAAEH,EAAEsH,QAAQL,KAAKiB,cAAc1H,EAAEA,EAAE,GAAGR,GAAG,CAAC0H,KAAK,WAAWvH,EAAEqI,IAAI,EAAE,EAAEtI,EAAE,GAAGuB,KAAKgH,GAAG,EAAE,GAAGtI,EAAE0I,OAAO3I,EAAE,EAAEA,EAAE,GAAGC,EAAE0I,QAAQ3I,EAAE,EAAEA,EAAE,GAAGC,EAAE0I,QAAQ3I,EAAE,GAAGA,EAAE,GAAGC,EAAE0I,OAAO,GAAG3I,EAAE,QAAQF,EAAE8G,UAAUiC,yBAAyB,SAAS/I,GAAG,IAAIE,EAAEF,EAAEyG,KAAKtG,EAAEH,EAAEsH,QAAQL,KAAKiB,cAAc1H,EAAEA,EAAE,GAAGR,GAAG,CAAC0H,KAAK,WAAWvH,EAAEqI,KAAKtI,EAAE,EAAEA,EAAE,EAAEA,GAAGuB,KAAKgH,GAAG,EAAE,GAAGtI,EAAE0I,QAAQ3I,EAAE,EAAEA,EAAE,GAAGC,EAAE0I,QAAQ3I,EAAE,GAAGA,EAAE,QAAQF,EAAE8G,UAAUkC,qBAAqB,SAAShJ,GAAG,IAAIE,EAAEF,EAAEyG,KAAKtG,EAAEH,EAAEsH,QAAQL,KAAKiB,cAAc1H,EAAEA,EAAE,GAAGR,GAAG,CAAC0H,KAAK,WAAWvH,EAAEqI,IAAI,EAAE,EAAEtI,EAAE,GAAGuB,KAAKgH,GAAG,EAAE,GAAGtI,EAAE0I,OAAO3I,EAAE,EAAEA,EAAE,GAAGC,EAAE0I,OAAO,EAAE3I,EAAE,GAAGC,EAAEqI,IAAI,EAAE,EAAEtI,EAAE,EAAEuB,KAAKgH,GAAG,EAAEhH,KAAKgH,IAAItI,EAAE0I,QAAQ3I,EAAE,GAAGA,EAAE,GAAGC,EAAE0I,OAAO,GAAG3I,EAAE,QAAQF,EAAE8G,UAAUmC,0BAA0B,SAASjJ,GAAG,IAAIE,EAAEF,EAAEyG,KAAKtG,EAAEH,EAAEsH,QAAQL,KAAKiB,cAAc1H,EAAEA,EAAE,GAAGR,GAAG,CAAC0H,KAAK,WAAWvH,EAAEqI,KAAKtI,EAAE,EAAEA,EAAE,EAAEA,GAAGuB,KAAKgH,GAAG,EAAE,GAAGtI,EAAEqI,IAAItI,EAAE,GAAGA,EAAE,EAAEA,EAAEuB,KAAKgH,GAAG,EAAEhH,KAAKgH,SAASzI,EAAE8G,UAAUa,SAAS,SAAS3H,GAAG,IAAIE,EAAEF,EAAEW,EAAER,EAAEH,EAAEU,EAAEN,EAAEJ,EAAEyG,KAAKpG,EAAEL,EAAEsH,QAAQL,KAAKsB,UAAU,CAAC5H,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS,KAAKnI,EAAE8G,UAAUkB,YAAY,SAAShI,GAAG,IAAIE,EAAEF,EAAEW,EAAER,EAAEH,EAAEU,EAAEN,EAAEJ,EAAEyG,KAAKpG,EAAEL,EAAEsH,QAAQL,KAAKyB,aAAa,CAAC/H,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS,KAAKnI,EAAE8G,UAAUgB,aAAa,SAAS9H,GAAG,IAAIE,EAAEF,EAAEW,EAAER,EAAEH,EAAEU,EAAEN,EAAEJ,EAAEyG,KAAKpG,EAAEL,EAAEsH,QAAQ/G,EAAEP,EAAEiI,YAAY3H,GAAGC,GAAG,EAAE,GAAGa,GAAGb,EAAE,EAAE,GAAGC,GAAGD,EAAE,GAAG,GAAGgB,GAAGhB,EAAE,EAAE,GAAGsB,EAAEvB,EAAEc,EAAEZ,EAAEe,EAAE,GAAG,IAAIM,EAAE,GAAGA,EAAE,GAAGvB,GAAGc,GAAGZ,GAAGe,EAAE0F,KAAKyB,aAAa,CAAC/H,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS,QAAQ,CAAC,GAAG,IAAItG,EAAE,CAAC,IAAIC,EAAE,EAAE,OAAOxB,GAAGE,EAAEsB,EAAEL,KAAKgH,GAAG,EAAEjI,GAAGY,EAAEU,EAAEL,KAAKgH,GAAGrH,GAAGG,IAAIO,GAAGL,KAAKgH,GAAG,QAAQxB,KAAK6B,oBAAoB,CAACnI,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAASrG,IAAI,GAAG,IAAID,EAAE,OAAOC,EAAE,EAAEtB,EAAEsB,EAAEL,KAAKgH,GAAG,EAAErH,EAAEU,EAAEL,KAAKgH,GAAGlH,IAAIO,GAAGL,KAAKgH,GAAG,QAAQxB,KAAK2B,kBAAkB,CAACjI,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAASrG,SAASmF,KAAKsB,UAAU,CAAC5H,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS,KAAKnI,EAAE8G,UAAUiB,kBAAkB,SAAS/H,GAAG,IAAIE,EAAEF,EAAEW,EAAER,EAAEH,EAAEU,EAAEN,EAAEJ,EAAEyG,KAAKpG,EAAEL,EAAEsH,QAAQ/G,EAAEP,EAAEiI,YAAY3H,GAAGC,GAAG,EAAE,GAAGa,GAAGb,EAAE,EAAE,GAAGC,GAAGD,EAAE,GAAG,GAAGgB,GAAGhB,EAAE,EAAE,GAAGsB,EAAEvB,EAAEc,EAAEZ,EAAEe,EAAE,GAAG,IAAIM,EAAE,GAAGA,EAAE,GAAGvB,GAAGc,GAAGZ,GAAGe,EAAE0F,KAAKyB,aAAa,CAAC/H,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS,QAAQ,CAAC,GAAG,IAAItG,EAAE,CAAC,IAAIC,EAAE,EAAE,OAAOxB,GAAGE,EAAEsB,EAAEL,KAAKgH,GAAG,EAAEjI,GAAGY,EAAEU,EAAEL,KAAKgH,GAAGrH,GAAGG,IAAIO,GAAGL,KAAKgH,GAAG,QAAQxB,KAAK8B,yBAAyB,CAACpI,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAASrG,IAAI,GAAG,IAAID,EAAE,OAAOC,EAAE,EAAEtB,EAAEsB,EAAEL,KAAKgH,GAAG,EAAErH,EAAEU,EAAEL,KAAKgH,GAAGlH,IAAIO,GAAGL,KAAKgH,GAAG,QAAQxB,KAAK2B,kBAAkB,CAACjI,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAASrG,SAASmF,KAAKsB,UAAU,CAAC5H,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS,KAAKnI,EAAE8G,UAAUc,YAAY,SAAS5H,GAAG,IAAIE,EAAEF,EAAEW,EAAER,EAAEH,EAAEU,EAAEN,EAAEJ,EAAEyG,KAAKpG,EAAEL,EAAEsH,QAAQ/G,EAAEP,EAAEiI,YAAY3H,GAAGC,GAAG,EAAE,GAAGa,GAAGb,EAAE,EAAE,GAAGC,GAAGD,EAAE,GAAG,GAAGgB,GAAGhB,EAAE,EAAE,GAAG,IAAID,EAAEc,EAAEZ,EAAEe,EAAEjB,GAAGE,EAAEY,GAAGG,EAAE0F,KAAKyB,aAAa,CAAC/H,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS,IAAIlB,KAAK6B,oBAAoB,CAACnI,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS1G,KAAKgH,GAAG,IAAIxB,KAAK6B,oBAAoB,CAACnI,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,UAAU1G,KAAKgH,GAAG,IAAIxB,KAAK+B,qBAAqB,CAACrI,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS1G,KAAKgH,GAAG,KAAKzI,EAAE8G,UAAUe,mBAAmB,SAAS7H,GAAG,IAAIE,EAAEF,EAAEW,EAAER,EAAEH,EAAEU,EAAEN,EAAEJ,EAAEyG,KAAKpG,EAAEL,EAAEsH,QAAQ/G,EAAEP,EAAEiI,YAAY3H,GAAGC,GAAG,EAAE,GAAGa,GAAGb,EAAE,EAAE,GAAGC,GAAGD,EAAE,GAAG,GAAGgB,GAAGhB,EAAE,EAAE,GAAG,IAAID,EAAEc,EAAEZ,EAAEe,EAAEjB,GAAGE,EAAEY,GAAGG,EAAE0F,KAAKyB,aAAa,CAAC/H,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS,IAAIlB,KAAK8B,yBAAyB,CAACpI,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS1G,KAAKgH,GAAG,IAAIxB,KAAK8B,yBAAyB,CAACpI,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,UAAU1G,KAAKgH,GAAG,IAAIxB,KAAK+B,qBAAqB,CAACrI,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS1G,KAAKgH,GAAG,KAAKzI,EAAzsI,GAA8sI,IAAI6B,EAAE,WAAW,OAAOA,EAAE+E,OAAOC,QAAQ,SAAS7G,GAAG,IAAI,IAAIE,EAAEC,EAAE,EAAEC,EAAEsD,UAAUpC,OAAOnB,EAAEC,EAAED,IAAI,IAAI,IAAIE,KAAKH,EAAEwD,UAAUvD,GAAGyG,OAAOE,UAAUC,eAAeC,KAAK9G,EAAEG,KAAKL,EAAEK,GAAGH,EAAEG,IAAI,OAAOL,IAAI0G,MAAMO,KAAKvD,YAAY,MAAM5B,EAAE,WAAW,SAAS9B,EAAEA,GAAG,IAAIE,EAAEF,EAAEsH,QAAQnH,EAAEH,EAAEuH,KAAKN,KAAKO,SAAStH,EAAE+G,KAAKQ,MAAMtH,EAAE,OAAOH,EAAE8G,UAAUY,KAAK,SAAS1H,EAAEE,EAAEC,EAAEC,GAAG,IAAIC,EAAEE,EAAE0G,KAAKO,SAAS,OAAOP,KAAKQ,OAAO,IAAI,SAASpH,EAAE4G,KAAKe,YAAY,MAAM,IAAI,gBAAgB3H,EAAE4G,KAAKc,kBAAkB,MAAM,IAAI,MAAM,QAAQ1H,EAAE4G,KAAKU,SAAStH,EAAE2G,KAAKC,KAAK,CAACtG,EAAEX,EAAEU,EAAER,EAAEuG,KAAKtG,EAAEmH,QAAQ/G,EAAE4H,SAAS/H,KAAKJ,EAAE8G,UAAUoB,cAAc,SAASlI,GAAG,IAAIE,EAAEF,EAAEW,EAAER,EAAEH,EAAEU,EAAEN,EAAEJ,EAAEyG,KAAKpG,EAAEL,EAAEsH,QAAQ/G,EAAEP,EAAEmI,SAAS7H,EAAEN,EAAE0H,KAAKtG,EAAElB,EAAEE,EAAE,EAAEI,EAAEL,EAAEC,EAAE,EAAEC,EAAE+H,UAAUhH,EAAEZ,GAAGD,GAAGF,EAAEgI,OAAO9H,GAAGD,IAAID,EAAEiI,YAAY/H,GAAGF,EAAEgI,QAAQ9H,GAAGF,EAAE+H,WAAWhH,GAAGZ,IAAIR,EAAE8G,UAAUyB,UAAU,SAASvI,GAAG,IAAIE,EAAEF,EAAEyG,KAAKtG,EAAEH,EAAEsH,QAAQlH,EAAEF,EAAE,EAAE+G,KAAKiB,cAAcrG,EAAEA,EAAE,GAAG7B,GAAG,CAAC0H,KAAK,WAAWvH,EAAEqI,IAAI,EAAE,EAAEtI,EAAE,EAAE,EAAE,EAAEuB,KAAKgH,IAAItI,EAAEqI,IAAI,EAAE,EAAEtI,EAAE,EAAEE,EAAE,EAAE,EAAEqB,KAAKgH,SAASzI,EAAE8G,UAAU4B,aAAa,SAAS1I,GAAG,IAAIE,EAAEF,EAAEyG,KAAKtG,EAAEH,EAAEsH,QAAQlH,EAAEF,EAAE,EAAE+G,KAAKiB,cAAcrG,EAAEA,EAAE,GAAG7B,GAAG,CAAC0H,KAAK,WAAWvH,EAAEwI,MAAMzI,EAAE,GAAGA,EAAE,EAAEA,EAAEA,GAAGC,EAAEwI,MAAMzI,EAAE,EAAEE,GAAGF,EAAE,EAAEE,EAAEF,EAAE,EAAEE,EAAEF,EAAE,EAAEE,QAAQJ,EAAE8G,UAAUoC,mBAAmB,SAASlJ,GAAG,IAAIE,EAAEF,EAAEyG,KAAKtG,EAAEH,EAAEsH,QAAQlH,EAAEF,EAAE,EAAE+G,KAAKiB,cAAcrG,EAAEA,EAAE,GAAG7B,GAAG,CAAC0H,KAAK,WAAWvH,EAAEqI,KAAKpI,GAAGA,EAAE,IAAIA,EAAEqB,KAAKgH,IAAIhH,KAAKgH,GAAG,GAAGtI,EAAE0I,OAAOzI,GAAG,IAAIA,GAAGD,EAAEqI,IAAIpI,GAAGA,EAAE,IAAIA,GAAGqB,KAAKgH,GAAG,EAAE,GAAGtI,EAAE0I,OAAO,IAAIzI,GAAGA,GAAGD,EAAEqI,IAAIpI,EAAEA,EAAE,IAAIA,EAAE,EAAEqB,KAAKgH,GAAG,GAAGtI,EAAE0I,QAAQzI,EAAE,IAAIA,GAAGD,EAAEqI,KAAKpI,EAAEA,EAAE,IAAIA,EAAEqB,KAAKgH,GAAG,EAAEhH,KAAKgH,IAAItI,EAAE0I,QAAQ,IAAIzI,GAAGA,GAAGD,EAAEqI,KAAKpI,GAAGA,EAAE,IAAIA,EAAEqB,KAAKgH,IAAIhH,KAAKgH,GAAG,GAAGtI,EAAE0I,OAAOzI,GAAG,IAAIA,GAAGD,EAAEqI,IAAIpI,GAAGA,EAAE,IAAIA,GAAGqB,KAAKgH,GAAG,EAAE,GAAGtI,EAAE0I,OAAO,IAAIzI,GAAGA,GAAGD,EAAEqI,IAAIpI,EAAEA,EAAE,IAAIA,EAAE,EAAEqB,KAAKgH,GAAG,GAAGtI,EAAE0I,QAAQzI,EAAE,IAAIA,GAAGD,EAAEqI,KAAKpI,EAAEA,EAAE,IAAIA,EAAEqB,KAAKgH,GAAG,EAAEhH,KAAKgH,IAAItI,EAAE0I,QAAQ,IAAIzI,GAAGA,QAAQJ,EAAE8G,UAAUa,SAAS,SAAS3H,GAAG,IAAIE,EAAEF,EAAEW,EAAER,EAAEH,EAAEU,EAAEN,EAAEJ,EAAEyG,KAAKpG,EAAEL,EAAEsH,QAAQ/G,EAAEP,EAAEmI,SAASlB,KAAKsB,UAAU,CAAC5H,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS5H,KAAKP,EAAE8G,UAAUkB,YAAY,SAAShI,GAAG,IAAIE,EAAEF,EAAEW,EAAER,EAAEH,EAAEU,EAAEN,EAAEJ,EAAEyG,KAAKpG,EAAEL,EAAEsH,QAAQ/G,EAAEP,EAAEmI,SAASlB,KAAKyB,aAAa,CAAC/H,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS5H,KAAKP,EAAE8G,UAAUiB,kBAAkB,SAAS/H,GAAG,IAAIE,EAAEF,EAAEW,EAAER,EAAEH,EAAEU,EAAEN,EAAEJ,EAAEyG,KAAKpG,EAAEL,EAAEsH,QAAQ/G,EAAEP,EAAEmI,SAASlB,KAAKiC,mBAAmB,CAACvI,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS5H,KAAKP,EAA50D,GAAi1D,IAAI+B,EAAE,WAAW,OAAOA,EAAE6E,OAAOC,QAAQ,SAAS7G,GAAG,IAAI,IAAIE,EAAEC,EAAE,EAAEC,EAAEsD,UAAUpC,OAAOnB,EAAEC,EAAED,IAAI,IAAI,IAAIE,KAAKH,EAAEwD,UAAUvD,GAAGyG,OAAOE,UAAUC,eAAeC,KAAK9G,EAAEG,KAAKL,EAAEK,GAAGH,EAAEG,IAAI,OAAOL,IAAI0G,MAAMO,KAAKvD,YAAY,MAAMf,EAAE,WAAW,SAAS3C,EAAEA,GAAG,IAAIE,EAAEF,EAAEsH,QAAQnH,EAAEH,EAAEuH,KAAKN,KAAKO,SAAStH,EAAE+G,KAAKQ,MAAMtH,EAAE,OAAOH,EAAE8G,UAAUY,KAAK,SAAS1H,EAAEE,EAAEC,EAAEC,GAAG,IAAIC,EAAEE,EAAE0G,KAAKO,SAAS,OAAOP,KAAKQ,OAAO,IAAI,SAASpH,EAAE4G,KAAKe,YAAY,MAAM,IAAI,MAAM,QAAQ3H,EAAE4G,KAAKU,SAAStH,EAAE2G,KAAKC,KAAK,CAACtG,EAAEX,EAAEU,EAAER,EAAEuG,KAAKtG,EAAEmH,QAAQ/G,EAAE4H,SAAS/H,KAAKJ,EAAE8G,UAAUoB,cAAc,SAASlI,GAAG,IAAIE,EAAEF,EAAEW,EAAER,EAAEH,EAAEU,EAAEN,EAAEJ,EAAEyG,KAAKpG,EAAEL,EAAEsH,QAAQ/G,EAAEP,EAAEmI,SAAS7H,EAAEN,EAAE0H,KAAKtG,EAAElB,EAAEE,EAAE,EAAEI,EAAEL,EAAEC,EAAE,EAAEC,EAAE+H,UAAUhH,EAAEZ,GAAGD,GAAGF,EAAEgI,OAAO9H,GAAGD,IAAID,EAAEiI,YAAY/H,GAAGF,EAAEgI,QAAQ9H,GAAGF,EAAE+H,WAAWhH,GAAGZ,IAAIR,EAAE8G,UAAUyB,UAAU,SAASvI,GAAG,IAAIE,EAAEF,EAAEyG,KAAKtG,EAAEH,EAAEsH,QAAQL,KAAKiB,cAAcnG,EAAEA,EAAE,GAAG/B,GAAG,CAAC0H,KAAK,WAAWvH,EAAEqI,IAAI,EAAE,EAAEtI,EAAE,EAAE,EAAE,EAAEuB,KAAKgH,SAASzI,EAAE8G,UAAU4B,aAAa,SAAS1I,GAAG,IAAIE,EAAEF,EAAEyG,KAAKtG,EAAEH,EAAEsH,QAAQL,KAAKiB,cAAcnG,EAAEA,EAAE,GAAG/B,GAAG,CAAC0H,KAAK,WAAWvH,EAAEwI,MAAMzI,EAAE,GAAGA,EAAE,EAAEA,EAAEA,QAAQF,EAAE8G,UAAUa,SAAS,SAAS3H,GAAG,IAAIE,EAAEF,EAAEW,EAAER,EAAEH,EAAEU,EAAEN,EAAEJ,EAAEyG,KAAKpG,EAAEL,EAAEsH,QAAQ/G,EAAEP,EAAEmI,SAASlB,KAAKsB,UAAU,CAAC5H,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS5H,KAAKP,EAAE8G,UAAUkB,YAAY,SAAShI,GAAG,IAAIE,EAAEF,EAAEW,EAAER,EAAEH,EAAEU,EAAEN,EAAEJ,EAAEyG,KAAKpG,EAAEL,EAAEsH,QAAQ/G,EAAEP,EAAEmI,SAASlB,KAAKyB,aAAa,CAAC/H,EAAET,EAAEQ,EAAEP,EAAEsG,KAAKrG,EAAEkH,QAAQjH,EAAE8H,SAAS5H,KAAKP,EAA/gC,GAAohC,IAAI6C,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAIE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,MAAMtC,EAAE,WAAW,SAAST,EAAEA,GAAGiH,KAAKkC,QAAQC,SAASC,cAAc,UAAUpC,KAAKkC,QAAQG,MAAMtJ,EAAEsJ,MAAMrC,KAAKkC,QAAQI,OAAOvJ,EAAEuJ,OAAOtC,KAAKuC,SAASxJ,EAAE,OAAO4G,OAAO6C,eAAezJ,EAAE8G,UAAU,UAAU,CAAC4C,IAAI,WAAW,OAAOzC,KAAKkC,QAAQQ,WAAW,OAAOC,YAAW,EAAGC,cAAa,IAAKjD,OAAO6C,eAAezJ,EAAE8G,UAAU,QAAQ,CAAC4C,IAAI,WAAW,OAAOzC,KAAKkC,QAAQG,OAAOM,YAAW,EAAGC,cAAa,IAAKjD,OAAO6C,eAAezJ,EAAE8G,UAAU,SAAS,CAAC4C,IAAI,WAAW,OAAOzC,KAAKkC,QAAQI,QAAQK,YAAW,EAAGC,cAAa,IAAK7J,EAAE8G,UAAUgD,UAAU,WAAW,OAAO7C,KAAKkC,SAASnJ,EAAE8G,UAAUiD,MAAM,WAAW,IAAI/J,EAAEiH,KAAKK,QAAQtH,GAAGA,EAAEgK,UAAU,EAAE,EAAE/C,KAAKkC,QAAQG,MAAMrC,KAAKkC,QAAQI,SAASvJ,EAAE8G,UAAUmD,OAAO,SAASjK,GAAG,OAAOE,EAAE+G,KAAc5G,EAAE,WAAW,IAAIH,EAAEC,EAAEC,EAAEC,EAAEE,EAAED,EAAEE,EAAEe,EAAEM,EAAEC,EAAEmF,KAAK,OAAO,SAASjH,EAAEE,GAAG,IAAIC,EAAEC,EAAEC,EAAEE,EAAED,EAAE,CAAC4J,MAAM,EAAEC,KAAK,WAAW,GAAG,EAAE9J,EAAE,GAAG,MAAMA,EAAE,GAAG,OAAOA,EAAE,IAAI+J,KAAK,GAAGC,IAAI,IAAI,OAAO9J,EAAE,CAAC+J,KAAKlJ,EAAE,GAAGmJ,MAAMnJ,EAAE,GAAGoJ,OAAOpJ,EAAE,IAAI,mBAAmBqJ,SAASlK,EAAEkK,OAAOC,UAAU,WAAW,OAAOzD,OAAO1G,EAAE,SAASa,EAAEb,GAAG,OAAO,SAASa,GAAG,OAAO,SAASb,GAAG,GAAGJ,EAAE,MAAM,IAAIwK,UAAU,mCAAmC,KAAKrK,GAAG,IAAI,GAAGH,EAAE,EAAEC,IAAIC,EAAE,EAAEE,EAAE,GAAGH,EAAEoK,OAAOjK,EAAE,GAAGH,EAAEmK,SAASlK,EAAED,EAAEoK,SAASnK,EAAE2G,KAAK5G,GAAG,GAAGA,EAAEkK,SAASjK,EAAEA,EAAE2G,KAAK5G,EAAEG,EAAE,KAAKqK,KAAK,OAAOvK,EAAE,OAAOD,EAAE,EAAEC,IAAIE,EAAE,CAAC,EAAEA,EAAE,GAAGF,EAAEwK,QAAQtK,EAAE,IAAI,KAAK,EAAE,KAAK,EAAEF,EAAEE,EAAE,MAAM,KAAK,EAAE,OAAOD,EAAE4J,QAAQ,CAACW,MAAMtK,EAAE,GAAGqK,MAAK,GAAI,KAAK,EAAEtK,EAAE4J,QAAQ9J,EAAEG,EAAE,GAAGA,EAAE,CAAC,GAAG,SAAS,KAAK,EAAEA,EAAED,EAAE+J,IAAIS,MAAMxK,EAAE8J,KAAKU,MAAM,SAAS,QAAQ,MAAMzK,GAAGA,EAAEC,EAAE8J,MAAM9I,OAAO,GAAGjB,EAAEA,EAAEiB,OAAO,KAAK,IAAIf,EAAE,IAAI,IAAIA,EAAE,IAAI,CAACD,EAAE,EAAE,SAAS,GAAG,IAAIC,EAAE,MAAMF,GAAGE,EAAE,GAAGF,EAAE,IAAIE,EAAE,GAAGF,EAAE,IAAI,CAACC,EAAE4J,MAAM3J,EAAE,GAAG,MAAM,GAAG,IAAIA,EAAE,IAAID,EAAE4J,MAAM7J,EAAE,GAAG,CAACC,EAAE4J,MAAM7J,EAAE,GAAGA,EAAEE,EAAE,MAAM,GAAGF,GAAGC,EAAE4J,MAAM7J,EAAE,GAAG,CAACC,EAAE4J,MAAM7J,EAAE,GAAGC,EAAE+J,IAAIlH,KAAK5C,GAAG,MAAMF,EAAE,IAAIC,EAAE+J,IAAIS,MAAMxK,EAAE8J,KAAKU,MAAM,SAASvK,EAAEL,EAAE8G,KAAKhH,EAAEM,GAAG,MAAMN,GAAGO,EAAE,CAAC,EAAEP,GAAGI,EAAE,EAAE,QAAQD,EAAEE,EAAE,EAAE,GAAG,EAAEE,EAAE,GAAG,MAAMA,EAAE,GAAG,MAAM,CAACsK,MAAMtK,EAAE,GAAGA,EAAE,QAAG,EAAOqK,MAAK,GAAjxB,CAAsxB,CAACrK,EAAEa,MAA9hC,CAAqiC6F,MAAK,SAAUlF,GAAG,OAAOA,EAAEmI,OAAO,KAAK,EAAE,OAAOhK,EAAEF,EAAEqD,iBAAiBlD,EAAEsB,KAAKsJ,IAAI9D,KAAKuC,SAASF,MAAMrC,KAAKuC,SAASD,QAAQ,EAAEtC,KAAKuC,SAAS5F,OAAOxD,EAAEqB,KAAKC,MAAMvB,EAAED,GAAGG,EAAE,CAAC2K,UAAU,EAAEC,UAAU,EAAE3B,MAAM,EAAEC,OAAO,GAAGtC,KAAKiE,IAAIlL,EAAEiH,KAAKuC,SAAS2B,MAAM,CAAC,EAAElE,KAAKmE,aAAa,CAAC,EAAE,GAAG,KAAK,EAAE,GAAGrJ,EAAEoI,QAAQlD,KAAKoE,OAAO,MAAM,CAAC,GAAG9K,EAAE0G,KAAKuC,SAASlJ,EAAEC,EAAE+K,aAAa9K,EAAED,EAAEgL,UAAUhK,EAAEjB,EAAEkL,UAAUpK,EAAEZ,EAAEiL,sBAAsB5J,EAAEJ,KAAKC,MAAMH,EAAErB,EAAEA,GAAGG,EAAE,SAASL,GAAG,IAAIE,EAAEF,EAAE0L,eAAevL,EAAEH,EAAE2L,cAAcvL,EAAEJ,EAAE4L,cAAcvL,EAAEL,EAAE6L,kBAAkBtL,EAAEP,EAAE8L,QAAQxL,EAAE,CAACK,EAAE,EAAED,EAAE,GAAGU,EAAE,CAACT,EAAE,EAAED,EAAE,GAAG,GAAGR,GAAG,GAAGC,GAAG,GAAGC,GAAG,GAAGG,GAAG,EAAE,MAAM,CAACgJ,OAAO,EAAED,MAAM,EAAE2B,UAAU,EAAED,UAAU,GAAG,IAAIxK,EAAEN,EAAEC,EAAE,OAAOG,EAAEK,EAAEc,KAAKC,MAAMD,KAAKsK,KAAK3L,EAAEI,IAAIF,EAAEK,GAAG,IAAIL,EAAEK,EAAE,GAAGN,GAAGA,EAAEC,EAAEK,IAAIL,EAAEK,EAAEN,GAAGC,EAAEK,EAAE,GAAG,GAAGL,EAAEK,IAAIS,EAAET,EAAEL,EAAEK,EAAEJ,EAAED,EAAEI,EAAE,EAAE,EAAEe,KAAKuK,MAAM1L,EAAEK,EAAEH,EAAE,GAAG,GAAGY,EAAEV,EAAEe,KAAKwK,MAAM7K,EAAET,EAAEH,IAAIF,EAAEI,EAAEJ,EAAEK,EAAEP,GAAGC,GAAGA,EAAEC,EAAEI,KAAKL,GAAGA,EAAEC,EAAEI,GAAGJ,EAAEI,EAAEL,EAAEC,EAAEI,EAAE,GAAG,GAAGJ,EAAEK,KAAKL,EAAEI,GAAG,EAAEU,EAAEV,EAAEJ,EAAEI,EAAEH,EAAED,EAAEK,EAAE,EAAE,EAAEc,KAAKuK,MAAM1L,EAAEI,EAAEF,EAAE,GAAG,GAAGY,EAAET,EAAEc,KAAKwK,MAAM7K,EAAEV,EAAEF,IAAI,CAAC+I,OAAOnI,EAAEV,EAAE4I,MAAMlI,EAAET,EAAEsK,UAAU3K,EAAEI,EAAEsK,UAAU1K,EAAEK,GAA7hB,CAAiiB,CAACgL,cAAc1E,KAAKoE,OAAO/B,MAAMoC,eAAezE,KAAKoE,OAAO9B,OAAOqC,cAAc/J,EAAEgK,kBAAkB3L,EAAE,GAAG4L,QAAQ1L,IAAI2B,EAAEmI,MAAM,EAAE,KAAK,EAAE,OAAOjD,KAAK8C,QAAQ9C,KAAKiF,iBAAiBjF,KAAKkF,UAAS,SAAUnM,EAAEG,GAAG,IAAIC,EAAEG,EAAED,EAAEc,EAAEZ,EAAEe,EAAE,QAAQO,EAAE0H,SAAS8B,aAAac,oBAAoBpM,IAAIE,EAAEG,EAAE2K,WAAW,GAAGhL,GAAGE,EAAEG,EAAE2K,WAAW,GAAG7K,IAAID,EAAEG,EAAE4K,WAAW,GAAG9K,GAAGD,EAAEG,EAAE4K,WAAW,IAAI,QAAQ7K,EAAEyC,EAAE7C,UAAK,IAASI,OAAE,EAAOA,EAAED,MAAM,QAAQI,EAAEsC,EAAE7C,EAAEE,EAAE,UAAK,IAASK,OAAE,EAAOA,EAAEJ,MAAM,QAAQG,EAAEuC,EAAE7C,UAAK,IAASM,OAAE,EAAOA,EAAEH,EAAED,EAAE,MAAM,QAAQkB,EAAE2B,EAAE/C,UAAK,IAASoB,OAAE,EAAOA,EAAEjB,MAAM,QAAQK,EAAEuC,EAAE/C,EAAEE,EAAE,UAAK,IAASM,OAAE,EAAOA,EAAEL,MAAM,QAAQoB,EAAEwB,EAAE/C,UAAK,IAASuB,OAAE,EAAOA,EAAEpB,EAAED,EAAE,QAAQ+G,KAAKoF,cAAcpF,KAAKuC,SAAS2B,OAAOlE,KAAKqF,UAAU,CAAChD,MAAMjJ,EAAEiJ,MAAMC,OAAOlJ,EAAEkJ,OAAOgD,MAAMrM,EAAE4L,QAAQ1L,IAAI,CAAC,QAAQ,KAAKA,OAAE,KAAUA,EAAEoM,WAAU,SAAUxM,EAAEO,GAAG,SAASD,EAAEN,GAAG,IAAIQ,EAAEH,EAAEiK,KAAKtK,IAAI,MAAMA,GAAGO,EAAEP,IAAI,SAASoB,EAAEpB,GAAG,IAAIQ,EAAEH,EAAEkK,MAAMvK,IAAI,MAAMA,GAAGO,EAAEP,IAAI,SAASQ,EAAEN,GAAG,IAAIC,EAAED,EAAE0K,KAAK5K,EAAEE,EAAE2K,QAAQ1K,EAAED,EAAE2K,MAAM1K,aAAaC,EAAED,EAAE,IAAIC,GAAE,SAAUJ,GAAGA,EAAEG,OAAOsM,KAAKnM,EAAEc,GAAGZ,GAAGH,EAAEA,EAAEqG,MAAMxG,EAAK,KAAKoK,WAAW,IAAIpK,EAAIE,EAAEC,GAAGL,EAAE8G,UAAUoF,eAAe,WAAW,IAAIlM,EAAEiH,KAAKK,QAAQpH,EAAE+G,KAAKuC,SAAS,GAAGxJ,EAAE,CAAC,GAAGE,EAAEwM,kBAAkBC,SAAS,CAAC,IAAIxM,EAAED,EAAEwM,kBAAkBC,SAASvM,EAAE6G,KAAK2F,gBAAgB,CAACtF,QAAQtH,EAAE6M,QAAQ1M,EAAE2M,mBAAmB,EAAEnM,EAAE,EAAED,EAAE,EAAE+F,KAAKQ,KAAKkC,QAAQG,MAAMrC,KAAKkC,QAAQI,OAAOtC,KAAKkC,QAAQG,MAAMrC,KAAKkC,QAAQI,SAASpJ,EAAE4M,WAAW1F,SAAQ,SAAUrH,GAAG,IAAIE,EAAEF,EAAEgN,OAAO7M,EAAEH,EAAEiN,MAAM7M,EAAE8M,aAAahN,EAAEC,MAAMH,EAAE2E,UAAUvE,OAAOF,EAAEwM,kBAAkBO,QAAQjN,EAAE2E,UAAUzE,EAAEwM,kBAAkBO,OAAOjN,EAAE4E,SAAS,EAAE,EAAEqC,KAAKkC,QAAQG,MAAMrC,KAAKkC,QAAQI,UAAUvJ,EAAE8G,UAAUqF,SAAS,SAASnM,GAAG,IAAIE,EAAE+G,KAAK,IAAIA,KAAKiE,IAAI,KAAK,yBAAyB,IAAI/K,EAAE8G,KAAKK,QAAQ,IAAInH,EAAE,KAAK,yBAAyB,IAAIC,EAAE6G,KAAKuC,SAASnJ,EAAE4G,KAAKiE,IAAI7H,iBAAiB,GAAGhD,EAAED,EAAEkJ,OAAOjJ,EAAED,EAAEmJ,OAAO,KAAK,2BAA2B,IAAIhJ,EAAEkB,KAAKsJ,IAAI3K,EAAEkJ,MAAMlJ,EAAEmJ,QAAQ,EAAEnJ,EAAEwD,OAAOtD,EAAEmB,KAAKC,MAAMnB,EAAEF,GAAGe,EAAEK,KAAKC,OAAOtB,EAAEkJ,MAAMjJ,EAAEC,GAAG,GAAGE,EAAEiB,KAAKC,OAAOtB,EAAEmJ,OAAOlJ,EAAEC,GAAG,GAAGuB,EAAE,IAAIN,EAAE,CAAC+F,QAAQnH,EAAEoH,KAAKnH,EAAE+M,YAAY5F,OAAOpH,EAAEiN,YAAY,IAAI,IAAItL,EAAE,SAAS3B,GAAG,IAAI,IAAIC,EAAE,SAASA,GAAG,OAAOJ,IAAIA,EAAEG,EAAEC,GAAG,WAAW2B,EAAEmJ,IAAI9H,OAAOjD,EAAEC,QAAQyB,EAAE6F,KAAKtG,EAAEjB,EAAEG,EAAEE,EAAEJ,EAAEE,EAAEA,GAAE,SAAUC,EAAED,GAAG,QAAQH,EAAEI,EAAE,GAAGH,EAAEE,EAAE,GAAGH,EAAEI,GAAGF,GAAGD,EAAEE,GAAGD,MAAML,IAAIA,EAAEG,EAAEI,EAAEH,EAAEE,OAAOJ,EAAEgL,KAAKhL,EAAEgL,IAAI9H,OAAOjD,EAAEI,EAAEH,EAAEE,MAAM,YAAYC,EAAE,EAAEA,EAAEF,EAAEE,IAAIH,EAAEG,IAAIwB,EAAEkF,KAAKtE,EAAE,EAAEA,EAAEtC,EAAEsC,IAAIb,EAAEa,GAAG,GAAGvC,EAAE+M,YAAYR,SAAS,CAAC,IAAI9J,EAAEzC,EAAE+M,YAAYR,SAAS5J,EAAEkE,KAAK2F,gBAAgB,CAACtF,QAAQnH,EAAE0M,QAAQhK,EAAEiK,mBAAmB,EAAEnM,EAAES,EAAEV,EAAEF,EAAEiG,KAAKpG,EAAEC,IAAIuC,EAAEkK,WAAW1F,SAAQ,SAAUrH,GAAG,IAAIE,EAAEF,EAAEgN,OAAO7M,EAAEH,EAAEiN,MAAMlK,EAAEmK,aAAahN,EAAEC,MAAMA,EAAEwE,UAAUxE,EAAEkN,YAAYtK,OAAO3C,EAAE+M,YAAYF,QAAQ9M,EAAEwE,UAAUxE,EAAEkN,YAAYjN,EAAE+M,YAAYF,OAAO9M,EAAEmN,KAAK,YAAYtN,EAAE8G,UAAUuF,YAAY,SAASrM,GAAG,IAAIE,EAAE+G,KAAK,IAAIA,KAAKiE,IAAI,KAAK,yBAAyB,IAAI/K,EAAE8G,KAAKK,QAAQ,IAAInH,EAAE,KAAK,yBAAyB,IAAIC,EAAE6G,KAAKuC,SAASnJ,EAAE4G,KAAKiE,IAAI7H,iBAAiB9C,EAAEkB,KAAKsJ,IAAI3K,EAAEkJ,MAAMlJ,EAAEmJ,QAAQ,EAAEnJ,EAAEwD,OAAOtD,EAAEmB,KAAKC,MAAMnB,EAAEF,GAAGe,EAAE,EAAEd,EAAEE,EAAE,EAAEF,EAAEuB,EAAEJ,KAAKC,OAAOtB,EAAEkJ,MAAMjJ,EAAEC,GAAG,GAAGyB,EAAEN,KAAKC,OAAOtB,EAAEmJ,OAAOlJ,EAAEC,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAEmB,KAAKgH,GAAG,GAAG,CAAC,EAAE,GAAGhH,KAAKgH,GAAG,IAAIpB,SAAQ,SAAU9G,GAAG,IAAIE,EAAEC,EAAEuC,EAAEtC,EAAEE,EAAEE,EAAED,EAAEG,EAAED,EAAEG,EAAED,EAAEX,EAAE,GAAG2D,EAAE3D,EAAE,GAAGgN,EAAEhN,EAAE,GAAG,IAAIP,GAAGA,EAAEkB,EAAEgD,GAAG,CAAC,IAAIsJ,EAAE3L,EAAEX,EAAEZ,GAAGD,EAAE,GAAGoN,EAAE1L,EAAEmC,EAAE5D,GAAGD,EAAE,GAAG,GAAG,QAAQI,EAAEL,EAAEsN,4BAAuB,IAASjN,OAAE,EAAOA,EAAE8G,KAAK,CAAC,IAAIoG,EAAE,IAAI7L,EAAE,CAACwF,QAAQnH,EAAEoH,KAAK,QAAQ7G,EAAEN,EAAEsN,4BAAuB,IAAShN,OAAE,EAAOA,EAAE6G,OAAOpH,EAAEiN,YAAYO,EAAEjG,KAAK8F,EAAEC,EAAErM,EAAEmM,OAAO,CAAC,IAAIK,EAAE,IAAIrM,EAAE,CAAC+F,QAAQnH,EAAEoH,KAAKnH,EAAE+M,YAAY5F,OAAOpH,EAAEiN,YAAY,IAAI,IAAIS,EAAE,SAAS7N,GAAG,IAAI,IAAIE,EAAE,SAASA,GAAG,KAAK,QAAQ+C,EAAEJ,EAAE7C,UAAK,IAASiD,OAAE,EAAOA,EAAE/C,IAAI,MAAM,WAAW0N,EAAElG,KAAK8F,EAAExN,EAAEM,EAAEmN,EAAEvN,EAAEI,EAAEA,GAAE,SAAUH,EAAEC,GAAG,IAAIC,EAAE,SAAS,QAAQA,EAAEwC,EAAE7C,EAAEG,UAAK,IAASE,OAAE,EAAOA,EAAEH,EAAEE,QAAQD,EAAE,EAAEA,EAAE0C,EAAE7C,GAAGsB,OAAOnB,IAAID,EAAEC,IAAI2N,EAAE,EAAEA,EAAEjL,EAAEvB,OAAOwM,IAAID,EAAEC,GAAG,GAAG,QAAQnN,EAAEP,EAAEsN,4BAAuB,IAAS/M,OAAE,EAAOA,EAAEgM,SAAS,CAAC,IAAIoB,EAAE3N,EAAEsN,qBAAqBf,SAAStH,EAAEnF,EAAE0M,gBAAgB,CAACtF,QAAQnH,EAAE0M,QAAQkB,EAAEjB,mBAAmBS,EAAE5M,EAAE6M,EAAE9M,EAAE+M,EAAEhH,KAAKrF,IAAI2M,EAAEhB,WAAW1F,SAAQ,SAAUrH,GAAG,IAAIE,EAAEF,EAAEgN,OAAO7M,EAAEH,EAAEiN,MAAM5H,EAAE6H,aAAahN,EAAEC,MAAMA,EAAEwE,UAAUxE,EAAEkN,YAAYhI,OAAO,QAAQxE,EAAET,EAAEsN,4BAAuB,IAAS7M,OAAE,EAAOA,EAAEoM,SAAS9M,EAAEwE,UAAUxE,EAAEkN,YAAYjN,EAAEsN,qBAAqBT,OAAO,GAAG9M,EAAEmN,KAAK,WAAW,QAAQvM,EAAEX,EAAE4N,yBAAoB,IAASjN,OAAE,EAAOA,EAAEwG,KAAK,CAAC,IAAI0G,EAAE,IAAItL,EAAE,CAAC2E,QAAQnH,EAAEoH,KAAK,QAAQzG,EAAEV,EAAE4N,yBAAoB,IAASlN,OAAE,EAAOA,EAAEyG,OAAOpH,EAAEiN,YAAYa,EAAEvG,KAAK8F,EAAE,EAAElN,EAAEmN,EAAE,EAAEnN,EAAEE,EAAE+M,OAAO,CAACK,EAAE,IAAIrM,EAAE,CAAC+F,QAAQnH,EAAEoH,KAAKnH,EAAE+M,YAAY5F,OAAOpH,EAAEiN,YAAY,IAAIc,EAAE,SAASlO,GAAG,IAAI,IAAIE,EAAE,SAASA,GAAG,KAAK,QAAQe,EAAE8B,EAAE/C,UAAK,IAASiB,OAAE,EAAOA,EAAEf,IAAI,MAAM,WAAW0N,EAAElG,KAAK8F,EAAExN,EAAEM,EAAEmN,EAAEvN,EAAEI,EAAEA,GAAE,SAAUH,EAAEC,GAAG,IAAIC,EAAE,SAAS,QAAQA,EAAE0C,EAAE/C,EAAEG,UAAK,IAASE,OAAE,EAAOA,EAAEH,EAAEE,QAAQD,EAAE,EAAEA,EAAE4C,EAAE/C,GAAGsB,OAAOnB,IAAID,EAAEC,IAAI,IAAI2N,EAAE,EAAEA,EAAE/K,EAAEzB,OAAOwM,IAAII,EAAEJ,GAAG,GAAG,QAAQ9M,EAAEZ,EAAE4N,yBAAoB,IAAShN,OAAE,EAAOA,EAAE2L,SAAS,CAACoB,EAAE3N,EAAE4N,kBAAkBrB,SAAS,IAAIwB,EAAEjO,EAAE0M,gBAAgB,CAACtF,QAAQnH,EAAE0M,QAAQkB,EAAEjB,mBAAmBS,EAAE5M,EAAE6M,EAAE,EAAElN,EAAEI,EAAE+M,EAAE,EAAEnN,EAAEmG,KAAKjG,IAAIuN,EAAEhB,WAAW1F,SAAQ,SAAUrH,GAAG,IAAIE,EAAEF,EAAEgN,OAAO7M,EAAEH,EAAEiN,MAAMkB,EAAEjB,aAAahN,EAAEC,MAAMA,EAAEwE,UAAUxE,EAAEkN,YAAYc,OAAO,QAAQhN,EAAEf,EAAE4N,yBAAoB,IAAS7M,OAAE,EAAOA,EAAE8L,SAAS9M,EAAEwE,UAAUxE,EAAEkN,YAAYjN,EAAE4N,kBAAkBf,OAAO9M,EAAEmN,KAAK,gBAAgBtN,EAAE8G,UAAUsE,UAAU,WAAW,IAAIpL,EAAEiH,KAAK,OAAO,IAAIuF,SAAQ,SAAUtM,EAAEC,GAAG,IAAIC,EAAEJ,EAAEwJ,SAASnJ,EAAE,IAAI+N,MAAM,IAAIhO,EAAE+K,MAAM,OAAOhL,EAAE,wBAAwB,iBAAiBC,EAAEkL,aAAa+C,cAAchO,EAAEgO,YAAYjO,EAAEkL,aAAa+C,aAAarO,EAAEqL,OAAOhL,EAAEA,EAAEiO,OAAO,WAAWpO,KAAKG,EAAEkO,IAAInO,EAAE+K,UAAUnL,EAAE8G,UAAUwF,UAAU,SAAStM,GAAG,IAAIE,EAAEF,EAAEsJ,MAAMnJ,EAAEH,EAAEuJ,OAAOnJ,EAAEJ,EAAEuM,MAAMlM,EAAEL,EAAE8L,QAAQvL,EAAE0G,KAAKK,QAAQ,IAAI/G,EAAE,KAAK,+BAA+B,IAAI0G,KAAKoE,OAAO,KAAK,uBAAuB,IAAI/K,EAAE2G,KAAKuC,SAASpI,EAAEK,KAAKC,OAAOpB,EAAEgJ,MAAMlJ,EAAEC,GAAG,GAAGG,EAAEiB,KAAKC,OAAOpB,EAAEiJ,OAAOnJ,EAAEC,GAAG,GAAGkB,EAAEH,EAAEd,EAAEgL,aAAa1H,QAAQxD,EAAEC,EAAEH,GAAG,EAAE2B,EAAErB,EAAEF,EAAEgL,aAAa1H,QAAQxD,EAAEC,EAAEF,GAAG,EAAE2B,EAAE5B,EAAE,EAAEI,EAAEgL,aAAa1H,OAAO7B,EAAE5B,EAAE,EAAEG,EAAEgL,aAAa1H,OAAOrD,EAAE+L,UAAUrF,KAAKoE,OAAO9J,EAAEM,EAAEC,EAAE,EAAE,EAAEA,EAAEC,EAAE,EAAE,EAAEA,IAAI/B,EAAE8G,UAAU8F,gBAAgB,SAAS5M,GAAG,IAAIE,EAAEC,EAAEH,EAAEsH,QAAQlH,EAAEJ,EAAE6M,QAAQxM,EAAEL,EAAE8M,mBAAmBvM,EAAEP,EAAEW,EAAEL,EAAEN,EAAEU,EAAEU,EAAEpB,EAAEyG,KAAK,GAAG,WAAWrG,EAAEmH,KAAKrH,EAAEC,EAAEqO,qBAAqBjO,EAAEa,EAAE,EAAEd,EAAEc,EAAE,EAAE,EAAEb,EAAEa,EAAE,EAAEd,EAAEc,EAAE,EAAEA,EAAE,OAAO,CAAC,IAAIZ,IAAIJ,EAAE+H,UAAU,GAAG9H,IAAI,EAAEoB,KAAKgH,IAAIlH,GAAGf,EAAE,EAAEiB,KAAKgH,KAAK,EAAEhH,KAAKgH,IAAI5G,EAAEtB,EAAEa,EAAE,EAAEU,EAAExB,EAAEc,EAAE,EAAEW,EAAExB,EAAEa,EAAE,EAAEuB,EAAErC,EAAEc,EAAE,EAAEG,GAAG,GAAGA,GAAG,IAAIE,KAAKgH,IAAIlH,EAAE,KAAKE,KAAKgH,IAAIlH,GAAG,EAAEE,KAAKgH,IAAI5G,GAAGT,EAAE,EAAEU,GAAGV,EAAE,EAAEK,KAAKgN,IAAIjO,GAAGuB,GAAGX,EAAE,EAAEuB,GAAGvB,EAAE,EAAEK,KAAKgN,IAAIjO,IAAIe,EAAE,IAAIE,KAAKgH,IAAIlH,GAAG,IAAIE,KAAKgH,IAAI3G,GAAGV,EAAE,EAAES,GAAGT,EAAE,EAAEK,KAAKgN,IAAIjO,GAAGmC,GAAGvB,EAAE,EAAEW,GAAGX,EAAE,EAAEK,KAAKgN,IAAIjO,IAAIe,EAAE,IAAIE,KAAKgH,IAAIlH,GAAG,KAAKE,KAAKgH,IAAI5G,GAAGT,EAAE,EAAEU,GAAGV,EAAE,EAAEK,KAAKgN,IAAIjO,GAAGuB,GAAGX,EAAE,EAAEuB,GAAGvB,EAAE,EAAEK,KAAKgN,IAAIjO,IAAIe,EAAE,KAAKE,KAAKgH,IAAIlH,GAAG,KAAKE,KAAKgH,KAAK3G,GAAGV,EAAE,EAAES,GAAGT,EAAE,EAAEK,KAAKgN,IAAIjO,GAAGmC,GAAGvB,EAAE,EAAEW,GAAGX,EAAE,EAAEK,KAAKgN,IAAIjO,IAAIN,EAAEC,EAAEuO,qBAAqBjN,KAAKwK,MAAMpK,GAAGJ,KAAKwK,MAAMnK,GAAGL,KAAKwK,MAAMlK,GAAGN,KAAKwK,MAAMtJ,IAAI,OAAOzC,GAAGF,EAA/jS,GAAokS,IAAI,IAAIU,EAAE,GAAGuC,EAAE,EAAEA,GAAG,GAAGA,IAAIvC,EAAEuC,GAAGA,EAAE,MAAMtC,EAAE,CAAC2I,MAAM,IAAIC,OAAO,IAAIoF,KAAK,GAAG/K,OAAO,EAAE2H,UAAU,CAACqD,WAAWlO,EAAE,GAAGmO,UAAK,EAAOpD,qBAAqB,KAAKH,aAAa,CAACc,oBAAmB,EAAGZ,UAAU,GAAG6C,iBAAY,EAAOzK,OAAO,GAAGuJ,YAAY,CAAC5F,KAAK,SAAS0F,MAAM,QAAQP,kBAAkB,CAACO,MAAM,SAAS,IAAIpM,EAAE,WAAW,OAAOA,EAAE+F,OAAOC,QAAQ,SAAS7G,GAAG,IAAI,IAAIE,EAAEC,EAAE,EAAEC,EAAEsD,UAAUpC,OAAOnB,EAAEC,EAAED,IAAI,IAAI,IAAIE,KAAKH,EAAEwD,UAAUvD,GAAGyG,OAAOE,UAAUC,eAAeC,KAAK9G,EAAEG,KAAKL,EAAEK,GAAGH,EAAEG,IAAI,OAAOL,IAAI0G,MAAMO,KAAKvD,YAAY,SAAS3C,EAAEf,GAAG,IAAIE,EAAEW,EAAE,GAAGb,GAAG,IAAIE,EAAE6M,aAAa7M,EAAE6M,WAAWzL,OAAO,KAAK,6CAA6C,OAAOpB,EAAEiI,SAASjI,EAAEiI,SAAS2G,OAAO5O,EAAEiI,UAAUjI,EAAEiI,SAAS,EAAEjI,EAAE6M,WAAW7M,EAAE6M,WAAWgC,KAAI,SAAU/O,GAAG,OAAOa,EAAEA,EAAE,GAAGb,GAAG,CAACgN,OAAO8B,OAAO9O,EAAEgN,aAAa9M,EAAE,SAASY,EAAEd,GAAG,IAAIE,EAAEW,EAAE,GAAGb,GAAG,OAAOE,EAAEoJ,MAAMwF,OAAO5O,EAAEoJ,OAAOpJ,EAAEqJ,OAAOuF,OAAO5O,EAAEqJ,QAAQrJ,EAAE0D,OAAOkL,OAAO5O,EAAE0D,QAAQ1D,EAAEoL,aAAazK,EAAEA,EAAE,GAAGX,EAAEoL,cAAc,CAACc,mBAAmB4C,QAAQ9O,EAAEoL,aAAac,oBAAoBZ,UAAUsD,OAAO5O,EAAEoL,aAAaE,WAAW5H,OAAOkL,OAAO5O,EAAEoL,aAAa1H,UAAU1D,EAAE0D,OAAOnC,KAAKsJ,IAAI7K,EAAEoJ,MAAMpJ,EAAEqJ,UAAUrJ,EAAE0D,OAAOnC,KAAKsJ,IAAI7K,EAAEoJ,MAAMpJ,EAAEqJ,SAASrJ,EAAEiN,YAAYtM,EAAE,GAAGX,EAAEiN,aAAajN,EAAEiN,YAAYR,WAAWzM,EAAEiN,YAAYR,SAAS5L,EAAEb,EAAEiN,YAAYR,WAAWzM,EAAEwN,uBAAuBxN,EAAEwN,qBAAqB7M,EAAE,GAAGX,EAAEwN,sBAAsBxN,EAAEwN,qBAAqBf,WAAWzM,EAAEwN,qBAAqBf,SAAS5L,EAAEb,EAAEwN,qBAAqBf,YAAYzM,EAAE8N,oBAAoB9N,EAAE8N,kBAAkBnN,EAAE,GAAGX,EAAE8N,mBAAmB9N,EAAE8N,kBAAkBrB,WAAWzM,EAAE8N,kBAAkBrB,SAAS5L,EAAEb,EAAE8N,kBAAkBrB,YAAYzM,EAAEwM,oBAAoBxM,EAAEwM,kBAAkB7L,EAAE,GAAGX,EAAEwM,mBAAmBxM,EAAEwM,kBAAkBC,WAAWzM,EAAEwM,kBAAkBC,SAAS5L,EAAEb,EAAEwM,kBAAkBC,YAAYzM,EAAE,IAAIe,EAAEd,EAAE,KAAKa,EAAEb,EAAEC,EAAEa,GAAG,MAAME,EAAE,WAAW,SAASnB,EAAEA,GAAGiH,KAAKuC,SAASxJ,EAAEc,EAAER,EAAEK,EAAEX,IAAIW,EAAEsG,KAAKgI,SAAS,OAAOjP,EAAEkP,gBAAgB,SAASlP,GAAGA,IAAIA,EAAEmP,UAAU,KAAKnP,EAAE8G,UAAUmI,OAAO,SAAS/O,GAAGF,EAAEkP,gBAAgBjI,KAAKmI,YAAYnI,KAAKuC,SAAStJ,EAAEY,EAAER,EAAE2G,KAAKuC,SAAStJ,IAAI+G,KAAKuC,SAASvC,KAAKuC,SAASmF,OAAO1H,KAAKiE,IAAIlK,IAAIiG,KAAKuC,SAAS+B,UAAUqD,WAAW3H,KAAKuC,SAAS+B,UAAUE,sBAAsBxE,KAAKiE,IAAIhI,QAAQ+D,KAAKuC,SAASmF,KAAK1H,KAAKuC,SAAS+B,UAAUsD,MAAM,SAAS7O,GAAG,QAAO,GAAI,IAAI,WAAWqP,KAAKrP,GAAG,MAAM,UAAU,IAAI,wBAAwBqP,KAAKrP,GAAG,MAAM,eAAe,QAAQ,MAAM,QAArI,CAA8IiH,KAAKuC,SAASmF,OAAO1H,KAAKiE,IAAI5H,OAAO2D,KAAKkC,QAAQ,IAAI1I,EAAEwG,KAAKuC,UAAUvC,KAAKqI,gBAAgBrI,KAAKkC,QAAQc,OAAOhD,KAAKiE,KAAKjE,KAAKsI,OAAOtI,KAAKmI,cAAcpP,EAAE8G,UAAUyI,OAAO,SAASvP,GAAG,GAAGA,EAAE,CAAC,GAAG,mBAAmBA,EAAEwP,YAAY,KAAK,wCAAwCvI,KAAKkC,SAASnJ,EAAEwP,YAAYvI,KAAKkC,QAAQW,aAAa7C,KAAKmI,WAAWpP,IAAIA,EAAE8G,UAAU2I,SAAS,SAASzP,GAAG,IAAIE,EAAE+G,KAAKA,KAAKqI,iBAAiBrI,KAAKqI,gBAAgB7C,MAAK,WAAY,GAAGvM,EAAEiJ,QAAQ,CAAC,IAAIhJ,EAAE,MAAMC,EAAE,KAAK,iBAAiBJ,GAAGG,EAAEH,EAAE0P,QAAQC,KAAK,gIAAgI,iBAAiB3P,GAAG,OAAOA,IAAIA,EAAE4P,OAAOxP,EAAEJ,EAAE4P,MAAM5P,EAAE6P,YAAY1P,EAAEH,EAAE6P,YAAY,SAAS7P,EAAEE,GAAG,IAAIC,EAAEiJ,SAASC,cAAc,KAAKlJ,EAAEsP,SAASvP,EAAEC,EAAE2P,KAAK9P,EAAEoJ,SAAS2G,KAAKP,YAAYrP,GAAGA,EAAE6P,QAAQ5G,SAAS2G,KAAKE,YAAY9P,GAAvI,CAA2ID,EAAEiJ,QAAQW,YAAYoG,UAAU,SAAS/P,GAAGC,EAAE,IAAID,QAAQH,EAAl9C,KAAy9CE,EAAE,GAAG,SAASC,EAAEC,GAAG,GAAGF,EAAEE,GAAG,OAAOF,EAAEE,GAAGL,QAAQ,IAAIM,EAAEH,EAAEE,GAAG,CAACL,QAAQ,IAAI,OAAOC,EAAEI,GAAGC,EAAEA,EAAEN,QAAQI,GAAGE,EAAEN,QAAQ,OAAOI,EAAEC,EAAEJ,IAAI,IAAIE,EAAEF,GAAGA,EAAEmQ,WAAW,IAAInQ,EAAE+E,QAAQ,IAAI/E,EAAE,OAAOG,EAAE4B,EAAE7B,EAAE,CAACI,EAAEJ,IAAIA,GAAGC,EAAE4B,EAAE,CAAC/B,EAAEE,KAAK,IAAI,IAAIE,KAAKF,EAAEC,EAAEE,EAAEH,EAAEE,KAAKD,EAAEE,EAAEL,EAAEI,IAAIwG,OAAO6C,eAAezJ,EAAEI,EAAE,CAACwJ,YAAW,EAAGF,IAAIxJ,EAAEE,MAAMD,EAAEE,EAAE,CAACL,EAAEE,IAAI0G,OAAOE,UAAUC,eAAeC,KAAKhH,EAAEE,GAAGC,EAAE,MAAtsyC,GAA+syC4E","file":"npm.qr-code-styling.b2874a156be40d4efbb7.chunk.js","sourcesContent":["!function(t,r){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=r():\"function\"==typeof define&&define.amd?define([],r):\"object\"==typeof exports?exports.QRCodeStyling=r():t.QRCodeStyling=r()}(self,(function(){return(()=>{var t={192:(t,r)=>{var e,n,o=function(){var t=function(t,r){var e=t,n=a[r],o=null,i=0,u=null,v=[],y={},x=function(t,r){o=function(t){for(var r=new Array(t),e=0;e=7&&M(t),null==u&&(u=C(e,n,v)),O(u,r)},b=function(t,r){for(var e=-1;e<=7;e+=1)if(!(t+e<=-1||i<=t+e))for(var n=-1;n<=7;n+=1)r+n<=-1||i<=r+n||(o[t+e][r+n]=0<=e&&e<=6&&(0==n||6==n)||0<=n&&n<=6&&(0==e||6==e)||2<=e&&e<=4&&2<=n&&n<=4)},_=function(){for(var t=8;t>n&1);o[Math.floor(n/3)][n%3+i-8-3]=a}for(n=0;n<18;n+=1)a=!t&&1==(r>>n&1),o[n%3+i-8-3][Math.floor(n/3)]=a},S=function(t,r){for(var e=n<<3|r,a=s.getBCHTypeInfo(e),u=0;u<15;u+=1){var c=!t&&1==(a>>u&1);u<6?o[u][8]=c:u<8?o[u+1][8]=c:o[i-15+u][8]=c}for(u=0;u<15;u+=1)c=!t&&1==(a>>u&1),u<8?o[8][i-u-1]=c:u<9?o[8][15-u-1+1]=c:o[8][15-u-1]=c;o[i-8][8]=!t},O=function(t,r){for(var e=-1,n=i-1,a=7,u=0,c=s.getMaskFunction(r),h=i-1;h>0;h-=2)for(6==h&&(h-=1);;){for(var f=0;f<2;f+=1)if(null==o[n][h-f]){var d=!1;u>>a&1)),c(n,h-f)&&(d=!d),o[n][h-f]=d,-1==(a-=1)&&(u+=1,a=7)}if((n+=e)<0||i<=n){n-=e,e=-e;break}}},C=function(t,r,e){for(var n=h.getRSBlocks(t,r),o=f(),i=0;i8*u)throw\"code length overflow. (\"+o.getLengthInBits()+\">\"+8*u+\")\";for(o.getLengthInBits()+4<=8*u&&o.put(0,4);o.getLengthInBits()%8!=0;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*u||(o.put(236,8),o.getLengthInBits()>=8*u));)o.put(17,8);return function(t,r){for(var e=0,n=0,o=0,i=new Array(r.length),a=new Array(r.length),u=0;u=0?g.getAt(p):0}}var v=0;for(d=0;dn)&&(t=n,r=e)}return r}())},y.createTableTag=function(t,r){t=t||2;var e=\"\";e+='',e+=\"\";for(var n=0;n\";for(var o=0;o';e+=\"\"}return(e+=\"\")+\"
\"},y.createSvgTag=function(t,r,e,n){var o={};\"object\"==typeof arguments[0]&&(t=(o=arguments[0]).cellSize,r=o.margin,e=o.alt,n=o.title),t=t||2,r=void 0===r?4*t:r,(e=\"string\"==typeof e?{text:e}:e||{}).text=e.text||null,e.id=e.text?e.id||\"qrcode-description\":null,(n=\"string\"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||\"qrcode-title\":null;var i,a,s,u,c=y.getModuleCount()*t+2*r,h=\"\";for(u=\"l\"+t+\",0 0,\"+t+\" -\"+t+\",0 0,-\"+t+\"z \",h+='\",h+=n.text?''+k(n.text)+\"\":\"\",h+=e.text?''+k(e.text)+\"\":\"\",h+='',h+='')+\"\"},y.createDataURL=function(t,r){t=t||2,r=void 0===r?4*t:r;var e=y.getModuleCount()*t+2*r,n=r,o=e-r;return w(e,e,(function(r,e){if(n<=r&&r\"};var k=function(t){for(var r=\"\",e=0;e\":r+=\">\";break;case\"&\":r+=\"&\";break;case'\"':r+=\""\";break;default:r+=n}}return r};return y.createASCII=function(t,r){if((t=t||1)<2)return function(t){t=void 0===t?2:t;var r,e,n,o,i,a=1*y.getModuleCount()+2*t,s=t,u=a-t,c={\"██\":\"█\",\"█ \":\"▀\",\" █\":\"▄\",\" \":\" \"},h={\"██\":\"▀\",\"█ \":\"▀\",\" █\":\" \",\" \":\" \"},f=\"\";for(r=0;r=u?h[i]:c[i];f+=\"\\n\"}return a%2&&t>0?f.substring(0,f.length-a-1)+Array(a+1).join(\"▀\"):f.substring(0,f.length-1)}(r);t-=1,r=void 0===r?2*t:r;var e,n,o,i,a=y.getModuleCount()*t+2*r,s=r,u=a-r,c=Array(t+1).join(\"██\"),h=Array(t+1).join(\" \"),f=\"\",d=\"\";for(e=0;e>>8),r.push(255&a)):r.push(n)}}return r}};var r,e,n,o,i,a={L:1,M:0,Q:3,H:2},s=(r=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e=1335,n=7973,i=function(t){for(var r=0;0!=t;)r+=1,t>>>=1;return r},(o={}).getBCHTypeInfo=function(t){for(var r=t<<10;i(r)-i(e)>=0;)r^=e<=0;)r^=n<5&&(e+=3+i-5)}for(n=0;n=256;)r-=255;return t[r]}}}();function c(t,r){if(void 0===t.length)throw t.length+\"/\"+r;var e=function(){for(var e=0;e>>7-r%8&1)},put:function(t,r){for(var n=0;n>>r-n-1&1))},getLengthInBits:function(){return r},putBit:function(e){var n=Math.floor(r/8);t.length<=n&&t.push(0),e&&(t[n]|=128>>>r%8),r+=1}};return e},d=function(t){var r=t,e={getMode:function(){return 1},getLength:function(t){return r.length},write:function(t){for(var e=r,o=0;o+2>>8&255)+(255&o),t.put(o,13),e+=2}if(e>>8)},writeBytes:function(t,e,n){e=e||0,n=n||t.length;for(var o=0;o0&&(r+=\",\"),r+=t[e];return r+\"]\"}};return r},y=function(t){var r=t,e=0,n=0,o=0,i={read:function(){for(;o<8;){if(e>=r.length){if(0==o)return-1;throw\"unexpected end of file./\"+o}var t=r.charAt(e);if(e+=1,\"=\"==t)return o=0,-1;t.match(/^\\s$/)||(n=n<<6|a(t.charCodeAt(0)),o+=6)}var i=n>>>o-8&255;return o-=8,i}},a=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw\"c:\"+t};return i},w=function(t,r,e){for(var n=function(t,r){var e=t,n=r,o=new Array(t*r),i={setPixel:function(t,r,n){o[r*e+t]=n},write:function(t){t.writeString(\"GIF87a\"),t.writeShort(e),t.writeShort(n),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(\",\"),t.writeShort(0),t.writeShort(0),t.writeShort(e),t.writeShort(n),t.writeByte(0);var r=a(2);t.writeByte(2);for(var o=0;r.length-o>255;)t.writeByte(255),t.writeBytes(r,o,255),o+=255;t.writeByte(r.length-o),t.writeBytes(r,o,r.length-o),t.writeByte(0),t.writeString(\";\")}},a=function(t){for(var r=1<>>r!=0)throw\"length over\";for(;c+r>=8;)u.writeByte(255&(t<>>=8-c,h=0,c=0;h|=t<0&&u.writeByte(h)}});d.write(r,n);var l=0,g=String.fromCharCode(o[l]);for(l+=1;l=6;)i(t>>>r-6),r-=6},o.flush=function(){if(r>0&&(i(t<<6-r),t=0,r=0),e%3!=0)for(var o=3-e%3,a=0;a>6,128|63&n):n<55296||n>=57344?r.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&t.charCodeAt(e)),r.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return r}(t)},void 0===(n=\"function\"==typeof(e=function(){return o})?e.apply(r,[]):e)||(t.exports=n)},151:(t,r,e)=>{\"use strict\";e.d(r,{default:()=>O});var n=function(){return(n=Object.assign||function(t){for(var r,e=1,n=arguments.length;e2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawExtraRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1),h=a+s+u+c;if(0!==h)if(h>2||a&&s||u&&c)this._basicSquare({x:r,y:e,size:n,context:o,rotation:0});else{if(2===h){var f=0;return a&&u?f=Math.PI/2:u&&s?f=Math.PI:s&&c&&(f=-Math.PI/2),void this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:f})}if(1===h)return f=0,u?f=Math.PI/2:s?f=Math.PI:c&&(f=-Math.PI/2),void this._basicSideRounded({x:r,y:e,size:n,context:o,rotation:f})}else this._basicDot({x:r,y:e,size:n,context:o,rotation:0})},t.prototype._drawClassy=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t.prototype._drawClassyRounded=function(t){var r=t.x,e=t.y,n=t.size,o=t.context,i=t.getNeighbor,a=+i(-1,0),s=+i(1,0),u=+i(0,-1),c=+i(0,1);0!==a+s+u+c?a||u?s||c?this._basicSquare({x:r,y:e,size:n,context:o,rotation:0}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:r,y:e,size:n,context:o,rotation:-Math.PI/2}):this._basicCornersRounded({x:r,y:e,size:n,context:o,rotation:Math.PI/2})},t}();var h=function(){return(h=Object.assign||function(t){for(var r,e=1,n=arguments.length;e0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]n||o&&o=(r-o.hideXDots)/2&&t<(r+o.hideXDots)/2&&e>=(r-o.hideYDots)/2&&e<(r+o.hideYDots)/2||(null===(n=g[t])||void 0===n?void 0:n[e])||(null===(i=g[t-r+7])||void 0===i?void 0:i[e])||(null===(a=g[t])||void 0===a?void 0:a[e-r+7])||(null===(s=p[t])||void 0===s?void 0:s[e])||(null===(u=p[t-r+7])||void 0===u?void 0:u[e])||(null===(c=p[t])||void 0===c?void 0:c[e-r+7]))})),this.drawCorners(),this._options.image&&this.drawImage({width:o.width,height:o.height,count:r,dotSize:n}),[2]}}))},new((n=void 0)||(n=Promise))((function(t,i){function a(t){try{u(o.next(t))}catch(t){i(t)}}function s(t){try{u(o.throw(t))}catch(t){i(t)}}function u(r){var e;r.done?t(r.value):(e=r.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,s)}u((o=o.apply(r,e||[])).next())}));var r,e,n,o},t.prototype.drawBackground=function(){var t=this.context,r=this._options;if(t){if(r.backgroundOptions.gradient){var e=r.backgroundOptions.gradient,n=this._createGradient({context:t,options:e,additionalRotation:0,x:0,y:0,size:this._canvas.width>this._canvas.height?this._canvas.width:this._canvas.height});e.colorStops.forEach((function(t){var r=t.offset,e=t.color;n.addColorStop(r,e)})),t.fillStyle=n}else r.backgroundOptions.color&&(t.fillStyle=r.backgroundOptions.color);t.fillRect(0,0,this._canvas.width,this._canvas.height)}},t.prototype.drawDots=function(t){var r=this;if(!this._qr)throw\"QR code is not defined\";var e=this.context;if(!e)throw\"QR code is not defined\";var n=this._options,o=this._qr.getModuleCount();if(o>n.width||o>n.height)throw\"The canvas is too small.\";var i=Math.min(n.width,n.height)-2*n.margin,a=Math.floor(i/o),s=Math.floor((n.width-o*a)/2),u=Math.floor((n.height-o*a)/2),h=new c({context:e,type:n.dotsOptions.type});e.beginPath();for(var f=function(e){for(var n=function(n){return t&&!t(e,n)?\"continue\":d._qr.isDark(e,n)?void h.draw(s+e*a,u+n*a,a,(function(i,a){return!(e+i<0||n+a<0||e+i>=o||n+a>=o)&&!(t&&!t(e+i,n+a))&&!!r._qr&&r._qr.isDark(e+i,n+a)})):\"continue\"},i=0;i=0&&c<=.25*Math.PI||c>1.75*Math.PI&&c<=2*Math.PI?(h-=s/2,f-=s/2*Math.tan(u),d+=s/2,l+=s/2*Math.tan(u)):c>.25*Math.PI&&c<=.75*Math.PI?(f-=s/2,h-=s/2/Math.tan(u),l+=s/2,d+=s/2/Math.tan(u)):c>.75*Math.PI&&c<=1.25*Math.PI?(h+=s/2,f+=s/2*Math.tan(u),d-=s/2,l-=s/2*Math.tan(u)):c>1.25*Math.PI&&c<=1.75*Math.PI&&(f+=s/2,h+=s/2/Math.tan(u),l-=s/2,d-=s/2/Math.tan(u)),r=e.createLinearGradient(Math.round(h),Math.round(f),Math.round(d),Math.round(l))}return r},t}();for(var y={},w=0;w<=40;w++)y[w]=w;const x={width:300,height:300,data:\"\",margin:0,qrOptions:{typeNumber:y[0],mode:void 0,errorCorrectionLevel:\"Q\"},imageOptions:{hideBackgroundDots:!0,imageSize:.4,crossOrigin:void 0,margin:0},dotsOptions:{type:\"square\",color:\"#000\"},backgroundOptions:{color:\"#fff\"}};var b=function(){return(b=Object.assign||function(t){for(var r,e=1,n=arguments.length;eMath.min(r.width,r.height)&&(r.margin=Math.min(r.width,r.height)),r.dotsOptions=b({},r.dotsOptions),r.dotsOptions.gradient&&(r.dotsOptions.gradient=_(r.dotsOptions.gradient)),r.cornersSquareOptions&&(r.cornersSquareOptions=b({},r.cornersSquareOptions),r.cornersSquareOptions.gradient&&(r.cornersSquareOptions.gradient=_(r.cornersSquareOptions.gradient))),r.cornersDotOptions&&(r.cornersDotOptions=b({},r.cornersDotOptions),r.cornersDotOptions.gradient&&(r.cornersDotOptions.gradient=_(r.cornersDotOptions.gradient))),r.backgroundOptions&&(r.backgroundOptions=b({},r.backgroundOptions),r.backgroundOptions.gradient&&(r.backgroundOptions.gradient=_(r.backgroundOptions.gradient))),r}var M=e(192),S=e.n(M);const O=function(){function t(t){this._options=t?m(a(x,t)):x,this.update()}return t._clearContainer=function(t){t&&(t.innerHTML=\"\")},t.prototype.update=function(r){t._clearContainer(this._container),this._options=r?m(a(this._options,r)):this._options,this._options.data&&(this._qr=S()(this._options.qrOptions.typeNumber,this._options.qrOptions.errorCorrectionLevel),this._qr.addData(this._options.data,this._options.qrOptions.mode||function(t){switch(!0){case/^[0-9]*$/.test(t):return\"Numeric\";case/^[0-9A-Z $%*+\\-./:]*$/.test(t):return\"Alphanumeric\";default:return\"Byte\"}}(this._options.data)),this._qr.make(),this._canvas=new v(this._options),this._drawingPromise=this._canvas.drawQR(this._qr),this.append(this._container))},t.prototype.append=function(t){if(t){if(\"function\"!=typeof t.appendChild)throw\"Container should be a single DOM node\";this._canvas&&t.appendChild(this._canvas.getCanvas()),this._container=t}},t.prototype.download=function(t){var r=this;this._drawingPromise&&this._drawingPromise.then((function(){if(r._canvas){var e=\"png\",n=\"qr\";\"string\"==typeof t?(e=t,console.warn(\"Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument\")):\"object\"==typeof t&&null!==t&&(t.name&&(n=t.name),t.extension&&(e=t.extension)),function(t,r){var e=document.createElement(\"a\");e.download=r,e.href=t,document.body.appendChild(e),e.click(),document.body.removeChild(e)}(r._canvas.getCanvas().toDataURL(\"image/\"+e),n+\".\"+e)}}))},t}()}},r={};function e(n){if(r[n])return r[n].exports;var o=r[n]={exports:{}};return t[n](o,o.exports,e),o.exports}return e.n=t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},e.d=(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},e.o=(t,r)=>Object.prototype.hasOwnProperty.call(t,r),e(151)})().default}));\n//# sourceMappingURL=qr-code-styling.js.map"],"sourceRoot":""} \ No newline at end of file diff --git a/public/rlottie.worker.077a5af1cfa1feb04249.bundle.worker.js b/public/rlottie.worker.077a5af1cfa1feb04249.bundle.worker.js new file mode 100644 index 000000000..dacf962a6 --- /dev/null +++ b/public/rlottie.worker.077a5af1cfa1feb04249.bundle.worker.js @@ -0,0 +1,2 @@ +!function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";r.r(t),r.d(t,"RLottieItem",(function(){return i})),importScripts("rlottie-wasm.js");const n=self.Module;class i{constructor(e,t,r,n,i){this.reqId=e,this.width=r,this.height=n,this.fps=i,this.fps=Math.max(1,Math.min(60,i||60)),this.frameCount=0,this.init(t),l("loaded",this.reqId,this.frameCount,this.fps)}init(e){try{this.handle=o.Api.init(),this.stringOnWasmHeap=allocate(intArrayFromString(e),"i8",0),this.frameCount=o.Api.loadFromData(this.handle,this.stringOnWasmHeap),o.Api.resize(this.handle,this.width,this.height)}catch(e){console.error("init RLottieItem error:",e),l("error",this.reqId,e)}}render(e,t){if(!this.dead&&!(this.frameCount {\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\r\n private init(jsString: string) {\r\n try {\r\n this.handle = worker.Api.init();\r\n \r\n // @ts-ignore\r\n this.stringOnWasmHeap = allocate(intArrayFromString(jsString), '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 } 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) return;\r\n //return;\r\n \r\n if(this.frameCount < frameNo || frameNo < 0) {\r\n return;\r\n }\r\n \r\n try {\r\n worker.Api.render(this.handle, frameNo);\r\n \r\n const bufferPointer = worker.Api.buffer(this.handle);\r\n \r\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\r\n \r\n if(!clamped) {\r\n clamped = new Uint8ClampedArray(data);\r\n } else {\r\n clamped.set(data);\r\n }\r\n\r\n //this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\r\n \r\n reply('frame', this.reqId, frameNo, clamped);\r\n } catch(e) {\r\n console.error('Render error:', e);\r\n this.dead = true;\r\n reply('error', this.reqId, e);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.dead = true;\r\n\r\n worker.Api.destroy(this.handle);\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, jsString: string, width: number, height: number/* , canvas: OffscreenCanvas */) {\r\n try {\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 = jsString.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 items[reqId] = new RLottieItem(reqId, jsString, width, height, frameRate/* , canvas */);\r\n } catch(e) {\r\n console.error('Invalid file for sticker:', jsString);\r\n reply('error', reqId, e);\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\n/**\r\n * Returns true when run in WebKit derived browsers.\r\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\r\n * transfer data between WebWorkers and the main thread.\r\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\r\n *\r\n * This should be removed once the underlying Safari issue is fixed.\r\n *\r\n * @private\r\n * @param scope {WindowOrWorkerGlobalScope} Since this function is used both on the main thread and WebWorker context,\r\n * let the calling scope pass in the global scope object.\r\n * @returns {boolean}\r\n */\r\nlet _isSafari: boolean = null;\r\nfunction isSafari(scope: any) {\r\n if(_isSafari === null) {\r\n const userAgent = scope.navigator ? scope.navigator.userAgent : null;\r\n _isSafari = !!scope.safari ||\r\n !!(userAgent && (/\\b(iPad|iPhone|iPod)\\b/.test(userAgent) || (!!userAgent.match('Safari') && !userAgent.match('Chrome'))));\r\n }\r\n return _isSafari;\r\n}\r\n\r\nfunction reply(...args: any[]) {\r\n if(arguments.length < 1) { \r\n throw new TypeError('reply - not enough arguments'); \r\n }\r\n\r\n //if(arguments[0] === 'frame') return;\r\n\r\n args = Array.prototype.slice.call(arguments, 1);\r\n if(isSafari(self)) {\r\n postMessage({queryMethodListener: arguments[0], queryMethodArguments: args});\r\n } else {\r\n const transfer: ArrayBuffer[] = [];\r\n for(let i = 0; i < args.length; ++i) {\r\n if(args[i] instanceof ArrayBuffer) {\r\n transfer.push(args[i]);\r\n }\r\n \r\n if(args[i].buffer && args[i].buffer instanceof ArrayBuffer) {\r\n transfer.push(args[i].buffer);\r\n }\r\n }\r\n\r\n postMessage({queryMethodListener: arguments[0], queryMethodArguments: args}, transfer);\r\n }\r\n}\r\n\r\nonmessage = function(e) {\r\n // @ts-ignore\r\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\r\n};\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/sw.js b/public/sw.js index c4bb47c6d..98ffa8367 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,4 +1,4 @@ -var serviceWorkerOption = {"assets":["/0.e35d290837b4c624b83e.chunk.js","/1.3982babdf2d0e2fda6f3.chunk.js","/11.4cedf32c13708a0f972d.chunk.js","/12.3862167550311cfa0c62.chunk.js","/13.a60e06bd2a9f185ee65e.chunk.js","/14.97bef6a6862c0bc097eb.chunk.js","/15.e91ef68debad566c74d5.chunk.js","/16.8f20a4414cdceb869a1b.chunk.js","/17.e503493b3028be8a4735.chunk.js","/18.781d3d503cc3c4f5b47e.chunk.js","/19.96f69841477e2045dbd5.chunk.js","/2.935038cc2873713ebe19.chunk.js","/20.a35ba2852f47b30df3d5.chunk.js","/21.3aef9bc049fb6abb3cd5.chunk.js","/22.0606c021aacfc21418bd.chunk.js","/23.e3145c0ea9684176558f.chunk.js","/24.8835e4abc95acb08dcd5.chunk.js","/25.8300e3ae1cb91fc2bed3.chunk.js","/26.27b86f0f8f80f7f420ab.chunk.js","/27.1bfe793cc702c7aa75db.chunk.js","/28.b17aefb7c51046ff48ec.chunk.js","/29.08bf9f3c8b9be9d555f9.chunk.js","/3.bdf444277e969e63a4c3.chunk.js","/30.0ba6f57fe3c460b08e24.chunk.js","/31.623be4e5a35a57db3b0c.chunk.js","/4.6b5dd97948b29c598f75.chunk.js","/5.faa04da46f838e65acdf.chunk.js","/6.7dba74a574616a20ac7d.chunk.js","/7.52c0a0f3b6f476d2bcec.chunk.js","/8.cbbad398924d87521a47.chunk.js","/main.6a45f609a7a2d67d16ff.bundle.js","/main.e47f94920a4918a10f5a.css","/mtproto.worker.e3c0dc69d0f5dd450f72.bundle.worker.js","/npm.qr-code-styling.c53238820878551c10bf.chunk.js","/rlottie.worker.6777ef401e7048467332.bundle.worker.js","/style-desktop.9d7b485ed526720a3aad.css","/webp.worker.bd598dc02a03fd59d71a.bundle.worker.js"]}; +var serviceWorkerOption = {"assets":["/0.0b9ffba7741c4b0e3b41.chunk.js","/1.5ce290a0391e0bae24df.chunk.js","/11.0091c78c69fac393d4c2.chunk.js","/12.72db7f7146e96df8b3df.chunk.js","/13.e32751cf9be91bb5497a.chunk.js","/14.11183df10f220f2bd1db.chunk.js","/15.9bac63e86519380bd679.chunk.js","/16.e12ddbc52a3f75e72c89.chunk.js","/17.be8ba8da5cf5a29471fb.chunk.js","/18.587a0b097be84c2c4267.chunk.js","/19.f2e6785986f5892e804d.chunk.js","/2.a1197bdcb1dacde64b1b.chunk.js","/20.a6eb3895e2c4cb798a93.chunk.js","/21.44abbe422120bbe15936.chunk.js","/22.077684f6412887cea1da.chunk.js","/23.6ddfbc8ae4fd86a3b037.chunk.js","/24.db7832d10818afdb3839.chunk.js","/25.542232e0e7b171d74445.chunk.js","/26.3728922ed59faa39207a.chunk.js","/27.afe309283a478f17a54d.chunk.js","/28.915fd231c46789adc787.chunk.js","/29.e7945a7ebae7a3b06d65.chunk.js","/3.f3be892bf29dd69632d3.chunk.js","/30.b373d83017596ec6462f.chunk.js","/31.2de22fb7274e1d4a2d03.chunk.js","/4.ec435aa1cabc18e1be43.chunk.js","/5.5145323b4bc82cc62ff7.chunk.js","/6.d600026c8e100eea4159.chunk.js","/7.eebe55366b507a8f74c2.chunk.js","/8.479ac71b1f70d56a0c98.chunk.js","/main.44c380c3c13ddc1cf9bd.bundle.js","/main.46ecaa33a4d72f91b821.css","/mtproto.worker.fd3e71e917088f6f049f.bundle.worker.js","/npm.qr-code-styling.b2874a156be40d4efbb7.chunk.js","/rlottie.worker.077a5af1cfa1feb04249.bundle.worker.js","/style-desktop.9d7b485ed526720a3aad.css","/webp.worker.b00d941ab33d112bf66c.bundle.worker.js"]}; - !function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";n.r(t),n.d(t,"log",(function(){return H})),n.d(t,"deferredPromises",(function(){return Q}));var o={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1};const r=o.debug;"undefined"!=typeof window?window:self;var i,s=r;!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"}(i||(i={}));const a=[i.None,i.Error,i.Warn,i.Log,i.Debug],c=Date.now();function l(){return"["+((Date.now()-c)/1e3).toFixed(3)+"]"}function u(e,t=i.Log|i.Warn|i.Error,n=!1){function o(...n){return t&i.Log&&console.log(l(),e,...n)}return s||n||(t=i.Error),o.warn=function(...n){return t&i.Warn&&console.warn(l(),e,...n)},o.info=function(...n){return t&i.Log&&console.info(l(),e,...n)},o.error=function(...n){return t&i.Error&&console.error(l(),e,...n)},o.trace=function(...n){return t&i.Log&&console.trace(l(),e,...n)},o.debug=function(...n){return t&i.Debug&&console.debug(l(),e,...n)},o.setPrefix=function(t){e="["+t+"]:"},o.setPrefix(e),o.setLevel=function(e){t=a.slice(0,e+1).reduce((e,t)=>e|t,0)},o}var h=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 d=self;function f(e){return e.ok&&200===e.status}function g(e){return Promise.race([e,(t=1e4,new Promise(e=>{setTimeout(e,t)})).then(()=>Promise.reject())]);var t}function p(e,t){return new Promise(n=>{const o=new FileReader;o.addEventListener("loadend",e=>n(e.target.result)),o[t](e)})}function m(e){return function(e){return p(e,"readAsArrayBuffer")}(e).then(e=>new Uint8Array(e))}function v(e,t=""){let n;const o=function(e){if(-1===["image/jpeg","image/png","image/gif","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e))return"application/octet-stream";return e}(t);try{n=new Blob(e,{type:o})}catch(t){let r=new BlobBuilder;e.forEach(e=>{r.append(e)}),n=r.getBlob(o)}return n}function w(){}const y="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,b="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,S=()=>self.clients.matchAll({includeUncontrolled:!1,type:"window"}),P=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(n=>{n.length&&n.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},A=(...e)=>{self.postMessage(...e)},O=()=>{};b&&P.bind(null,!1),b&&P.bind(null,!0);var _=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())}))};var T=new class{constructor(){this.blobSupported=!0;try{v([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?m(t).then(t=>e.write(t)):e.write(t)}getFakeFileWriter(e,t){const n=[];return{write:e=>_(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;n.push(e)})),truncate:()=>{n.length=0},finalize:(o=!0)=>{const r=v(n,e);return o&&t&&t(r),r}}}},x=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())}))};class j{constructor(e){this.dbName=e,this.useStorage=!0,o.test&&(this.dbName+="_test"),j.STORAGES.length&&(this.useStorage=j.STORAGES[0].useStorage),this.openDatabase(),j.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation(t=>t.delete("/"+e))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation(t=>t.match("/"+e))}save(e,t){return this.timeoutOperation(n=>n.put("/"+e,t))}getFile(e,t="blob"){return this.get(e).then(e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()})}saveFile(e,t){t instanceof Blob||(t=v(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)=>x(this,void 0,void 0,(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)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const n=T.getFakeFileWriter(t,t=>this.saveFile(e,t).catch(()=>t));return Promise.resolve(n)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>{if(t.useStorage=e,!e)return t.deleteAll()}))}}j.STORAGES=[];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 C=new j("cachedStreamChunks");setInterval(()=>C.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("Time-Cached")+86400<=o)return H("will delete stream chunk:",t),e.delete(i,{ignoreSearch:!0,ignoreVary:!0})});r.push(n)}return Promise.all(r)})),18e5),setInterval(()=>{S().then(e=>{for(const[t,n]of Q)if(!e.find(e=>e.id===t)){for(const e in n){n[e].reject()}Q.delete(t)}})},12e4);const D=new Map;class k{constructor(e){this.info=e,this.loadedOffsets=new Set,this.destroy=()=>{D.delete(this.id)},this.id=k.getId(e),D.set(this.id,this),this.limitPart=e.size>78643200?R:F,this.destroyDebounced=function(e,t,n=!0,o=!0){let r,i,s,a,c=!1;return(...l)=>(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&&(s(e(...l)),c=!1),r=setTimeout(()=>{!o||n&&!c||s(e(...l)),r=i=s=a=void 0,c=!1},t),i.catch(()=>{}),i)}(this.destroy,15e4,!1,!0)}requestFilePartFromWorker(e,t,n=!1){return E(this,void 0,void 0,(function*(){const o={type:"requestFilePart",payload:[this.info.dcId,this.info.location,e,t]},r=JSON.stringify(o);o.id=r;const i=yield S().then(e=>{if(e.length)return e.find(e=>Q.has(e.id))||e[0]});if(!i)throw new Error("no window");let s=Q.get(i.id);s||Q.set(i.id,s={});let a=s[r];if(a)return a.then(e=>e.bytes);i.postMessage(o),this.loadedOffsets.add(e),a=s[r]=function(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((n,o)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,n(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,o(...e))}});return t.catch(w).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}();const c=a.then(e=>e.bytes);return this.saveChunkToCache(c,e,t),!n&&this.preloadChunks(e,e+15*this.limitPart),c}))}requestFilePartFromCache(e,t,n){const o=this.getChunkKey(e,t);return C.getFile(o).then(e=>n?new Uint8Array:m(e),e=>{})}requestFilePart(e,t,n){return this.requestFilePartFromCache(e,t,n).then(o=>o||this.requestFilePartFromWorker(e,t,n))}saveChunkToCache(e,t,n){return e.then(e=>{const o=this.getChunkKey(t,n),r=new Response(e,{headers:{"Content-Length":""+e.length,"Content-Type":"application/octet-stream","Time-Cached":""+(Date.now()/1e3|0)}});return C.save(o,r)})}preloadChunk(e){this.loadedOffsets.has(e)||(this.loadedOffsets.add(e),this.requestFilePart(e,this.limitPart,!0))}preloadChunks(e,t){if(t>this.info.size&&(t=this.info.size),e)for(;e{n===i&&o===i+r||(e=e.slice(n-i,o-i+1));const t={"Accept-Ranges":"bytes","Content-Range":`bytes ${n}-${n+e.byteLength-1}/${this.info.size||"*"}`,"Content-Length":""+e.byteLength};return this.info.mimeType&&(t["Content-Type"]=this.info.mimeType),new Response(e,{status:206,statusText:"Partial Content",headers:t})})}getChunkKey(e,t){return this.id+"?offset="+e+"&limit="+t}static get(e){var t;return null!==(t=D.get(this.getId(e)))&&void 0!==t?t:new k(e)}static getId(e){return e.location.id}}const F=524288,R=1048576;function N(e,t=2048){return e-e%t}var L={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]};var M="undefined"!=typeof window?window:self;const W=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)&&M.MSStream,!!("safari"in M)||(!W||(/\b(iPad|iPhone|iPod)\b/.test(W)||W.match("Safari")&&W.match("Chrome"))),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);class q{constructor(e,t){this.storageIsAvailable=!0,function(e,t){if(t)for(let n in t)void 0!==t[n]&&(e[n]=t[n])}(this,e),o.test&&(this.name+="_test"),this.storeName=t,this.log=u("IDB-"+this.storeName),this.openDatabase(!0),q.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let n=!1;return setTimeout(()=>{n||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,o)=>{t.onsuccess=r=>{n=!0;const i=t.result;let s=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),o(e)},i.onclose=e=>{this.log.error("closed:",e),!s&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(s=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{n=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),o(e)},t.onupgradeneeded=e=>{n=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var n;const o=e.createObjectStore(t.name);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const e of t.indexes)o.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",n=>e.map((e,o)=>n.put(t[o],e)),"")}saveFile(e,t){return t instanceof Blob||(t=v([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,n,o=this.storeName){let r;return n&&(r=performance.now(),this.log(n+": start")),this.openDatabase().then(i=>new Promise((s,a)=>{const c=i.transaction([o],e);c.onerror=e=>{clearTimeout(l),a(c.error)},c.oncomplete=e=>{clearTimeout(l),n&&this.log(n+": end",performance.now()-r);const t=d.map(e=>e.result);s(h?t:t[0])};const l=setTimeout(()=>{this.log.error("transaction not finished",c)},1e4),u=t(c.objectStore(o)),h=Array.isArray(u),d=h?u:[].concat(u)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}q.STORAGES=[];var B=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};const G=self,U=location.protocol+"//"+location.hostname+location.pathname.split("/").slice(0,-1).join("/")+"/";const z=new class{constructor(e,t,n){this.defaults=n,this.cache={},this.storage=new q(e,t)}get(e){return B(this,void 0,void 0,(function*(){if(void 0!==this.cache[e])return this.cache[e];let t;try{t=yield this.storage.get(e)}catch(e){}if(void 0!==this.cache[e])return this.cache[e];if(void 0===t){const n=this.defaults[e];t="function"==typeof n?n():n}return this.cache[e]=t}))}set(e,t){return B(this,void 0,void 0,(function*(){this.cache[e]=t;try{this.storage.save(e,t)}catch(e){}}))}}(L,"session",{push_mute_until:0,push_last_alive:0,push_lang:{},push_settings:{}});G.addEventListener("push",e=>{const t=e.data.json();H("push",t);let n=!1;const o=Promise.all([z.get("push_mute_until"),z.get("push_last_alive"),G.clients.matchAll({type:"window"})]).then(e=>{const[o,r,i]=e;if(H("matched clients",i),n=i.length>0,n)throw"Supress notification because some instance is alive";const s=Date.now();if(Y()&&o&&s{H(e)});const r=o.then(()=>Promise.all([z.get("push_settings"),z.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||"You have a new message",a="unknown_peer");H("show notify",i,s,o,e);const c=[{action:"mute1d",title:n.push_action_mute1d||"Mute for 24H"}];return G.registration.showNotification(i,{body:s,icon:o,tag:a,data:e,actions:c}).then(e=>{var t;e&&e.notification&&(t=e.notification,V.has(t)||(V.add(t),t.onclose=J))}).catch(e=>{H.error("Show notification promise",e)})}(t,e[0],e[1])).catch(()=>(H("Closing all notifications on push",n),Y()||n?K():G.registration.showNotification("Telegram",{tag:"unknown_peer"}).then(()=>{if(n)return K();setTimeout(()=>K(),n?0:100)}).catch(e=>{H.error("Show notification error",e)})));e.waitUntil(r)}),G.addEventListener("notificationclick",e=>{const t=e.notification;H("On notification click: ",t.tag),t.close();const n=e.action;if("mute1d"===n&&Y())return H("[SW] mute for 1d"),void z.set("push_mute_until",Date.now()+864e5);const o=t.data;if(!o)return;const r=G.clients.matchAll({type:"window"}).then(e=>{o.action=n,$={type:"push_click",payload:o};for(let t=0;tG.clients.openWindow(e.baseUrl||U))}).catch(e=>{H.error("Clients.matchAll error",e)});e.waitUntil(r)}),G.addEventListener("notificationclose",J);let $,V=new Set;function J(e){var t;t=e.notification,V.delete(t)}function K(){for(const e of V)try{e.close()}catch(e){}let e;return e="getNotifications"in G.registration?G.registration.getNotifications({}).then(e=>{for(let t=0,n=e.length;t{H.error("Offline register SW error",e)}):Promise.resolve(),V.clear(),e}function Y(){return I}const H=u("SW",i.Error|i.Debug|i.Log|i.Warn),X=self,Q=new Map,Z={notifications_clear:()=>{K()},ping:(e,t)=>{!function(e,t){const n=t.ports&&t.ports[0]||t.source,o=e.payload;o.localNotifications&&z.set("push_last_alive",Date.now()),$&&n&&"postMessage"in n&&(n.postMessage($,[]),$=void 0),o.lang&&z.set("push_lang",o.lang),o.settings&&z.set("push_settings",o.settings)}(e,t)},requestFilePart:(e,t)=>{const n=t.source,o=Q.get(n.id);if(!o)return;const r=o[e.id];r&&(e.error?r.reject(e.error):r.resolve(e.payload),delete o[e.id])},toggleStorage:e=>{j.toggleStorage(e.payload)}};X.addEventListener("message",e=>{const t=e.data,n=Z[t.type];n&&n(t,e)});const ee=e=>{if(0===e.request.url.indexOf(location.origin+"/")&&e.request.url.match(/\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\?.*)?$/))return e.respondWith(function(e){return h(this,void 0,void 0,(function*(){try{const t=yield g(d.caches.open("cachedAssets")),n=yield g(t.match(e.request,{ignoreVary:!0}));if(n&&f(n))return n;const o={Vary:"*"};let r=yield fetch(e.request,{headers:o});if(f(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}),f(r)&&t.put(e.request,r.clone())}return r}catch(t){return fetch(e.request)}}))}(e));try{const[,t,n,o]=/http[:s]+\/\/.*?(\/(.*?)(?:$|\/(.*)$))/.exec(e.request.url)||[];switch(n){case"stream":!function(e,t){const n=function(e){if(!e)return[0,0];const[,t]=e.split("="),n=t.split(", "),[o,r]=n[0].split("-");return[+o,+r||0]}(e.request.headers.get("Range")),o=JSON.parse(decodeURIComponent(t)),r=k.get(o);var i;e.respondWith(Promise.race([(i=45e3,new Promise(e=>{setTimeout(()=>{e(new Response("",{status:408,statusText:"Request timed out."}))},i)})),r.requestRange(n)]))}(e,o)}}catch(t){e.respondWith(new Response("",{status:500,statusText:"Internal Server Error"}))}},te=()=>{X.onfetch=ee};X.addEventListener("install",e=>{H("installing"),e.waitUntil(X.skipWaiting())}),X.addEventListener("activate",e=>{H("activating",X),e.waitUntil(X.caches.delete("cachedAssets")),e.waitUntil(X.clients.claim())}),X.onerror=e=>{H.error("error:",e)},X.onunhandledrejection=e=>{H.error("onunhandledrejection:",e)},X.onoffline=X.ononline=te,te()}]); + !function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";n.r(t),n.d(t,"log",(function(){return re})),n.d(t,"deferredPromises",(function(){return se}));var o={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1};const r=o.debug;"undefined"!=typeof window?window:self;var i=r;var s="undefined"!=typeof window?window:self;const a=navigator?navigator.userAgent:null,c=(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.MSStream,!!("safari"in s)||!(!a||!(/\b(iPad|iPhone|iPod)\b/.test(a)||a.match("Safari")&&!a.match("Chrome")))),l=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,u=(navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i),"undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope),h="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!u,d=()=>self.clients.matchAll({includeUncontrolled:!1,type:"window"}),f=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(n=>{n.length&&n.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},g=(...e)=>{self.postMessage(...e)},p=()=>{};u&&f.bind(null,!1),u&&f.bind(null,!0);var m;!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(m||(m={}));const v=[m.None,m.Error,m.Warn,m.Log,m.Debug],w=Date.now();function y(){return"["+((Date.now()-w)/1e3).toFixed(3)+"]"}let b;const P=c||l;b=P?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const S=!P,O=P?2:3;function A(){const e=(new Error).stack.split("\n"),t=e[O]||e[e.length-1];return"["+(b(t)||"")+"]"}const _={black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:""},T=[["debug",m.Debug],["info",m.Log],["warn",m.Warn],["error",m.Error],["assert",m.Error],["trace",m.Log]];function x(e,t=m.Log|m.Warn|m.Error,n=!1,o=""){let r;i||n||(t=m.Error),S?o||(u?o=_.yellow:h&&(o=_.cyan)):o="";let s=o;o=o?`%s ${o}%s`:"%s";const a=function(...n){return t&m.Log&&console.log(o,y(),e,A(),...n)};return T.forEach(([n,r])=>{a[n]=function(...i){return t&r&&console[n](o,y(),e,A(),...i)}}),a.setPrefix=function(t){r=t,e="["+t+"]"},a.setPrefix(e),a.setLevel=function(e){t=v.slice(0,e+1).reduce((e,t)=>e|t,0)},a.bindPrefix=function(e){return x(`${r}] [${e}`,t,n,s)},a}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 j=self;function C(e){return e.ok&&200===e.status}function k(e){return Promise.race([e,(t=1e4,new Promise(e=>{setTimeout(e,t)})).then(()=>Promise.reject())]);var t}function D(e,t){return new Promise(n=>{const o=new FileReader;o.addEventListener("loadend",e=>n(e.target.result)),o[t](e)})}function F(e){return function(e){return D(e,"readAsArrayBuffer")}(e).then(e=>new Uint8Array(e))}function R(e,t=""){let n;const o=function(e){if(-1===["image/jpeg","image/png","image/gif","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e))return"application/octet-stream";return e}(t);try{n=new Blob(e,{type:o})}catch(t){let r=new BlobBuilder;e.forEach(e=>{r.append(e)}),n=r.getBlob(o)}return n}function N(){}var L=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())}))};var M=new class{constructor(){this.blobSupported=!0;try{R([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?F(t).then(t=>e.write(t)):e.write(t)}getFakeFileWriter(e,t){const n=[];return{write:e=>L(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;n.push(e)})),truncate:()=>{n.length=0},finalize:(o=!0)=>{const r=R(n,e);return o&&t&&t(r),r}}}},W=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())}))};class I{constructor(e){this.dbName=e,this.useStorage=!0,o.test&&(this.dbName+="_test"),I.STORAGES.length&&(this.useStorage=I.STORAGES[0].useStorage),this.openDatabase(),I.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation(t=>t.delete("/"+e))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation(t=>t.match("/"+e))}save(e,t){return this.timeoutOperation(n=>n.put("/"+e,t))}getFile(e,t="blob"){return this.get(e).then(e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()})}saveFile(e,t){t instanceof Blob||(t=R(t));const n=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,n).then(()=>t)}timeoutOperation(e){return this.useStorage?new Promise((t,n)=>W(this,void 0,void 0,(function*(){let 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)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const n=M.getFakeFileWriter(t,t=>this.saveFile(e,t).catch(()=>t));return Promise.resolve(n)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>{if(t.useStorage=e,!e)return t.deleteAll()}))}}I.STORAGES=[];var q=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 B=new I("cachedStreamChunks");setInterval(()=>B.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("Time-Cached")+86400<=o)return re("will delete stream chunk:",t),e.delete(i,{ignoreSearch:!0,ignoreVary:!0})});r.push(n)}return Promise.all(r)})),18e5),setInterval(()=>{d().then(e=>{for(const[t,n]of se)if(!e.find(e=>e.id===t)){for(const e in n){n[e].reject()}se.delete(t)}})},12e4);const G=new Map;class U{constructor(e){this.info=e,this.loadedOffsets=new Set,this.destroy=()=>{G.delete(this.id)},this.id=U.getId(e),G.set(this.id,this),this.limitPart=e.size>78643200?z:$,this.destroyDebounced=function(e,t,n=!0,o=!0){let r,i,s,a,c=!1;return(...l)=>(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&&(s(e(...l)),c=!1),r=setTimeout(()=>{!o||n&&!c||s(e(...l)),r=i=s=a=void 0,c=!1},t),i.catch(()=>{}),i)}(this.destroy,15e4,!1,!0)}requestFilePartFromWorker(e,t,n=!1){return q(this,void 0,void 0,(function*(){const o={type:"requestFilePart",payload:[this.info.dcId,this.info.location,e,t]},r=JSON.stringify(o);o.id=r;const i=yield d().then(e=>{if(e.length)return e.find(e=>se.has(e.id))||e[0]});if(!i)throw new Error("no window");let s=se.get(i.id);s||se.set(i.id,s={});let a=s[r];if(a)return a.then(e=>e.bytes);i.postMessage(o),this.loadedOffsets.add(e),a=s[r]=function(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((n,o)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,n(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,o(...e))}});return t.catch(N).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}();const c=a.then(e=>e.bytes);return this.saveChunkToCache(c,e,t),!n&&this.preloadChunks(e,e+15*this.limitPart),c}))}requestFilePartFromCache(e,t,n){const o=this.getChunkKey(e,t);return B.getFile(o).then(e=>n?new Uint8Array:F(e),e=>{})}requestFilePart(e,t,n){return this.requestFilePartFromCache(e,t,n).then(o=>o||this.requestFilePartFromWorker(e,t,n))}saveChunkToCache(e,t,n){return e.then(e=>{const o=this.getChunkKey(t,n),r=new Response(e,{headers:{"Content-Length":""+e.length,"Content-Type":"application/octet-stream","Time-Cached":""+(Date.now()/1e3|0)}});return B.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=G.get(this.getId(e)))&&void 0!==t?t:new U(e)}static getId(e){return e.location.id}}const $=524288,z=1048576;function V(e,t=2048){return e-e%t}var J={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]};class K{constructor(e,t){this.storageIsAvailable=!0,function(e,t){if(t)for(let n in t)void 0!==t[n]&&(e[n]=t[n])}(this,e),o.test&&(this.name+="_test"),this.storeName=t,this.log=x("IDB-"+this.storeName),this.openDatabase(!0),K.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let n=!1;return setTimeout(()=>{n||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,o)=>{t.onsuccess=r=>{n=!0;const i=t.result;let s=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),o(e)},i.onclose=e=>{this.log.error("closed:",e),!s&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(s=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{n=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),o(e)},t.onupgradeneeded=e=>{n=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var n;const o=e.createObjectStore(t.name);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const e of t.indexes)o.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",n=>e.map((e,o)=>n.put(t[o],e)),"")}saveFile(e,t){return t instanceof Blob||(t=R([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,n,o=this.storeName){let r;return n&&(r=performance.now(),this.log(n+": start")),this.openDatabase().then(i=>new Promise((s,a)=>{const c=i.transaction([o],e);c.onerror=e=>{clearTimeout(l),a(c.error)},c.oncomplete=e=>{clearTimeout(l),n&&this.log(n+": end",performance.now()-r);const t=d.map(e=>e.result);s(h?t:t[0])};const l=setTimeout(()=>{this.log.error("transaction not finished",c)},1e4),u=t(c.objectStore(o)),h=Array.isArray(u),d=h?u:[].concat(u)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}K.STORAGES=[];var Y=function(e,t,n,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 H=self,X=location.protocol+"//"+location.hostname+location.pathname.split("/").slice(0,-1).join("/")+"/";const Q=new class{constructor(e,t,n){this.defaults=n,this.cache={},this.storage=new K(e,t)}get(e){return Y(this,void 0,void 0,(function*(){if(void 0!==this.cache[e])return this.cache[e];let t;try{t=yield this.storage.get(e)}catch(e){}if(void 0!==this.cache[e])return this.cache[e];if(void 0===t){const n=this.defaults[e];t="function"==typeof n?n():n}return this.cache[e]=t}))}set(e,t){return Y(this,void 0,void 0,(function*(){this.cache[e]=t;try{this.storage.save(e,t)}catch(e){}}))}}(J,"session",{push_mute_until:0,push_last_alive:0,push_lang:{},push_settings:{}});H.addEventListener("push",e=>{const t=e.data.json();re("push",t);let n=!1;const o=Promise.all([Q.get("push_mute_until"),Q.get("push_last_alive"),H.clients.matchAll({type:"window"})]).then(e=>{const[o,r,i]=e;if(re("matched clients",i),n=i.length>0,n)throw"Supress notification because some instance is alive";const s=Date.now();if(oe()&&o&&s{re(e)});const r=o.then(()=>Promise.all([Q.get("push_settings"),Q.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||"You have a new message",a="unknown_peer");re("show notify",i,s,o,e);const c=[{action:"mute1d",title:n.push_action_mute1d||"Mute for 24H"}];return H.registration.showNotification(i,{body:s,icon:o,tag:a,data:e,actions:c}).then(e=>{var t;e&&e.notification&&(t=e.notification,ee.has(t)||(ee.add(t),t.onclose=te))}).catch(e=>{re.error("Show notification promise",e)})}(t,e[0],e[1])).catch(()=>(re("Closing all notifications on push",n),oe()||n?ne():H.registration.showNotification("Telegram",{tag:"unknown_peer"}).then(()=>{if(n)return ne();setTimeout(()=>ne(),n?0:100)}).catch(e=>{re.error("Show notification error",e)})));e.waitUntil(r)}),H.addEventListener("notificationclick",e=>{const t=e.notification;re("On notification click: ",t.tag),t.close();const n=e.action;if("mute1d"===n&&oe())return re("[SW] mute for 1d"),void Q.set("push_mute_until",Date.now()+864e5);const o=t.data;if(!o)return;const r=H.clients.matchAll({type:"window"}).then(e=>{o.action=n,Z={type:"push_click",payload:o};for(let t=0;tH.clients.openWindow(e.baseUrl||X))}).catch(e=>{re.error("Clients.matchAll error",e)});e.waitUntil(r)}),H.addEventListener("notificationclose",te);let Z,ee=new Set;function te(e){var t;t=e.notification,ee.delete(t)}function ne(){for(const e of ee)try{e.close()}catch(e){}let e;return e="getNotifications"in H.registration?H.registration.getNotifications({}).then(e=>{for(let t=0,n=e.length;t{re.error("Offline register SW error",e)}):Promise.resolve(),ee.clear(),e}function oe(){return l}const re=x("SW",m.Error|m.Debug|m.Log|m.Warn),ie=self,se=new Map,ae={notifications_clear:()=>{ne()},ping:(e,t)=>{!function(e,t){const n=t.ports&&t.ports[0]||t.source,o=e.payload;o.localNotifications&&Q.set("push_last_alive",Date.now()),Z&&n&&"postMessage"in n&&(n.postMessage(Z,[]),Z=void 0),o.lang&&Q.set("push_lang",o.lang),o.settings&&Q.set("push_settings",o.settings)}(e,t)},requestFilePart:(e,t)=>{const n=t.source,o=se.get(n.id);if(!o)return;const r=o[e.id];r&&(e.error?r.reject(e.error):r.resolve(e.payload),delete o[e.id])},toggleStorage:e=>{I.toggleStorage(e.payload)}};ie.addEventListener("message",e=>{const t=e.data,n=ae[t.type];n&&n(t,e)});const ce=e=>{if(0===e.request.url.indexOf(location.origin+"/")&&e.request.url.match(/\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\?.*)?$/))return e.respondWith(function(e){return E(this,void 0,void 0,(function*(){try{const t=yield k(j.caches.open("cachedAssets")),n=yield k(t.match(e.request,{ignoreVary:!0}));if(n&&C(n))return n;const o={Vary:"*"};let r=yield fetch(e.request,{headers:o});if(C(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}),C(r)&&t.put(e.request,r.clone())}return r}catch(t){return fetch(e.request)}}))}(e));try{const[,t,n,o]=/http[:s]+\/\/.*?(\/(.*?)(?:$|\/(.*)$))/.exec(e.request.url)||[];switch(n){case"stream":!function(e,t){const n=function(e){if(!e)return[0,0];const[,t]=e.split("="),n=t.split(", "),[o,r]=n[0].split("-");return[+o,+r||0]}(e.request.headers.get("Range")),o=JSON.parse(decodeURIComponent(t)),r=U.get(o);var i;e.respondWith(Promise.race([(i=45e3,new Promise(e=>{setTimeout(()=>{e(new Response("",{status:408,statusText:"Request timed out."}))},i)})),r.requestRange(n)]))}(e,o)}}catch(t){e.respondWith(new Response("",{status:500,statusText:"Internal Server Error"}))}},le=()=>{ie.onfetch=ce};ie.addEventListener("install",e=>{re("installing"),e.waitUntil(ie.skipWaiting())}),ie.addEventListener("activate",e=>{re("activating",ie),e.waitUntil(ie.caches.delete("cachedAssets")),e.waitUntil(ie.clients.claim())}),ie.onerror=e=>{re.error("error:",e)},ie.onunhandledrejection=e=>{re.error("onunhandledrejection:",e)},ie.onoffline=ie.ononline=le,le()}]); //# sourceMappingURL=sw.js.map \ No newline at end of file diff --git a/public/sw.js.map b/public/sw.js.map index cce7c4024..ed9fee458 100644 --- a/public/sw.js.map +++ b/public/sw.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/config/modes.ts","webpack:///./src/config/debug.ts","webpack:///./src/lib/logger.ts","webpack:///./src/lib/serviceWorker/cache.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/helpers/blob.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/helpers/context.ts","webpack:///./src/lib/filemanager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/lib/serviceWorker/stream.ts","webpack:///./src/helpers/schedulers/debounce.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/config/databases/state.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/environment/userAgent.ts","webpack:///./src/lib/idb.ts","webpack:///./src/helpers/object.ts","webpack:///./src/lib/serviceWorker/push.ts","webpack:///./src/lib/serviceWorker/index.service.ts","webpack:///./src/lib/serviceWorker/timeout.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","DEBUG","window","self","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","_logTimer","Date","now","dT","toFixed","logger","prefix","type","ignoreDebugReset","args","console","log","warn","info","error","trace","setPrefix","_prefix","setLevel","level","slice","reduce","acc","v","isCorrectResponse","response","ok","status","timeoutRace","promise","Promise","race","ms","resolve","setTimeout","then","reject","readBlobAs","blob","method","reader","FileReader","addEventListener","e","target","result","readBlobAsUint8Array","readBlobAsArrayBuffer","buffer","Uint8Array","blobConstruct","blobParts","mimeType","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","forEach","blobPart","append","getBlob","noop","isWebWorker","WorkerGlobalScope","isServiceWorker","ServiceWorkerGlobalScope","getWindowClients","clients","matchAll","includeUncontrolled","notifyServiceWorker","all","listeners","length","listener","postMessage","notifyWorker","blobSupported","this","fileWriter","bytes","arr","write","saveFileCallback","part","push","truncate","finalize","saveToStorage","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","match","put","fileName","Response","headers","size","save","callback","rejected","timeout","undefined","res","err","clearTimeout","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","map","storage","deleteAll","cacheStorage","setInterval","keys","requests","filtered","Map","timestamp","request","url","has","set","promises","id","ignoreSearch","ignoreVary","clientId","deferredPromises","find","client","taskId","streams","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","_resolve","_reject","debounce","alignedOffset","limit","fromPreload","task","payload","dcId","JSON","stringify","windowClient","deferred","uploadFile","add","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","addNotifyListener","finally","cancel","assign","deferredPromise","bytesPromise","saveChunkToCache","preloadChunks","getChunkKey","getFile","requestFilePartFromCache","requestFilePartFromWorker","offset","requestFilePart","end","preloadChunk","alignOffset","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","byteLength","base","version","stores","USER_AGENT","navigator","userAgent","IS_FIREFOX","toLowerCase","vendor","platform","maxTouchPoints","MSStream","db","storeName","storageIsAvailable","fromObject","safeAssign","preserve","onclose","close","createNew","indexedDB","message","finished","onerror","onsuccess","event","calledNew","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","store","objectStoreNames","contains","os","createObjectStore","indexes","index","createIndex","indexName","keyPath","objectParameters","Array","isArray","concat","getObjectStore","objectStore","clear","idx","perf","performance","oncomplete","results","getAll","defaultBaseUrl","protocol","hostname","pathname","split","join","defaults","push_mute_until","push_last_alive","push_lang","push_settings","obj","data","json","hasActiveWindows","checksPromise","muteUntil","lastAliveTime","clientList","nowTime","userInvisibleIsSupported","badge","reason","closePromise","settings","lang","icon","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","nopreview","push_message_nopreview","actions","action","push_action_mute1d","registration","showNotification","notification","notifications","onCloseNotification","fireNotification","closeAllNotifications","waitUntil","pendingNotification","focus","openWindow","baseUrl","getNotifications","len","taskListeners","notifications_clear","ping","ports","source","localNotifications","onPing","toggleStorage","onFetch","origin","respondWith","file","fetch","clone","replace","random","requestCache","scope","params","exec","header","chunks","ranges","parseRange","parse","decodeURIComponent","stream","delay","requestRange","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onunhandledrejection","onoffline","ononline"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,2HC1DtC,MAbD,CACZC,KAAMC,SAASC,OAAOC,QAAQ,UAAY,EAC1CC,MAAOH,SAASC,OAAOC,QAAQ,WAAa,EAC5CE,MAAM,EACNC,KAAK,EACLC,qBAAqB,EACrBC,iBAAiB,GCTZ,MAAMC,EAAiD,EAAML,MAChC,oBAAb,OAA2BM,OAASC,KAE5C,ICHHC,EDGG,KCHf,SAAYA,GACV,mBACA,qBACA,mBACA,iBACA,qBALF,CAAYA,MAAQ,KAQb,MAAMC,EAAa,CAACD,EAASE,KAAMF,EAASG,MAAOH,EAASI,KAAMJ,EAASK,IAAKL,EAASM,OAE1FC,EAAYC,KAAKC,MACvB,SAASC,IACP,MAAO,MAAQF,KAAKC,MAAQF,GAAa,KAAMI,QAAQ,GAAK,IAGvD,SAASC,EAAOC,EAAgBC,EAAiBd,EAASK,IAAML,EAASI,KAAOJ,EAASG,MAAOY,GAAmB,GAOxH,SAASV,KAAOW,GACd,OAAOF,EAAOd,EAASK,KAAOY,QAAQC,IAAIR,IAAMG,KAAWG,GAqC7D,OA5CI,GAAUD,IACZD,EAAOd,EAASG,OASlBE,EAAIc,KAAO,YAAYH,GACrB,OAAOF,EAAOd,EAASI,MAAQa,QAAQE,KAAKT,IAAMG,KAAWG,IAG/DX,EAAIe,KAAO,YAAYJ,GACrB,OAAOF,EAAOd,EAASK,KAAOY,QAAQG,KAAKV,IAAMG,KAAWG,IAG9DX,EAAIgB,MAAQ,YAAYL,GACtB,OAAOF,EAAOd,EAASG,OAASc,QAAQI,MAAMX,IAAMG,KAAWG,IAGjEX,EAAIiB,MAAQ,YAAYN,GACtB,OAAOF,EAAOd,EAASK,KAAOY,QAAQK,MAAMZ,IAAMG,KAAWG,IAO/DX,EAAIb,MAAQ,YAAYwB,GACtB,OAAOF,EAAOd,EAASM,OAASW,QAAQzB,MAAMkB,IAAMG,KAAWG,IAGjEX,EAAIkB,UAAY,SAASC,GACvBX,EAAS,IAAMW,EAAU,MAG3BnB,EAAIkB,UAAUV,GAEdR,EAAIoB,SAAW,SAASC,GACtBZ,EAAOb,EAAW0B,MAAM,EAAGD,EAAQ,GAAGE,OAAO,CAACC,EAAKC,IAAMD,EAAMC,EAAG,IAG7DzB,E,0SC5DT,MAAM,EAAMN,KAGZ,SAASgC,EAAkBC,GACzB,OAAOA,EAASC,IAA0B,MAApBD,EAASE,OAGjC,SAASC,EAAoCC,GAC3C,OAAOC,QAAQC,KAAK,CAClBF,GCjBkBG,EDkBZ,IClB2B,IAAIF,QAAeG,IACtDC,WAAWD,EAASD,MDiBLG,KAAK,IAAML,QAAQM,YClBf,IAACJ,ECcf,SAASK,EAAWC,EAAYC,GACrC,OAAO,IAAIT,QAAcG,IACvB,MAAMO,EAAS,IAAIC,WACnBD,EAAOE,iBAAiB,UAAYC,GAAMV,EAAQU,EAAEC,OAAOC,SAC3DL,EAAOD,GAAQD,KAgBZ,SAASQ,EAAqBR,GACnC,OALK,SAA+BA,GACpC,OAAOD,EAAWC,EAAM,qBAIjBS,CAAsBT,GAAMH,KAAKa,GAAU,IAAIC,WAAWD,IAG5D,SAASE,EAAcC,EAAgBC,EAAmB,IAC/D,IAAId,EACJ,MAAMe,EAeD,SAA0BD,GAC/B,IAcyB,IAdtB,CACD,aACA,YACA,YACA,aACA,YACA,YACA,aACA,kBACA,YACA,aACA,YACA,mBACA,mBACApE,QAAQoE,GACR,MAAO,2BAGT,OAAOA,EAlCcE,CAAiBF,GACtC,IACEd,EAAO,IAAIiB,KAAKJ,EAAW,CAAC5C,KAAM8C,IAClC,MAAMV,GAEN,IAAIa,EAAK,IAAIC,YACbN,EAAUO,QAASC,IACjBH,EAAGI,OAAOD,KAEZrB,EAAOkB,EAAGK,QAAQR,GAEpB,OAAOf,ECnDM,SAASwB,KCMjB,MAAMC,EAA2C,oBAAtBC,mBAAqCxE,gBAAgBwE,kBAC1EC,EAAsD,oBAA7BC,0BAA4C1E,gBAAgB0E,yBAKrFC,EAAmB,IACtB3E,KACP4E,QACAC,SAAS,CAAEC,qBAAqB,EAAO/D,KAAM,WAG1CgE,EAAsB,CAACC,KAAiB/D,KAC3CjB,KACA4E,QACAC,SAAS,CAAEC,qBAAqB,EAAO/D,KAAM,WAC7C4B,KAAMsC,IACDA,EAAUC,QAKdD,EAAUrD,MAAMoD,EAAM,GAAK,GAAGd,QAAQiB,IAEpCA,EAASC,eAAenE,QAKxBoE,EAAe,IAAIpE,KAEtBjB,KAA2CoF,eAAenE,IAGvD,EAAO,OAEgBwD,GAAkBM,EAAoBlG,KAAK,MAAM,GACrD4F,GAAkBM,EAAoBlG,KAAK,MAAM,G,0SCuB3D,UArDR,MAGL,cAFO,KAAAyG,eAAgB,EAGrB,IACE5B,EAAc,GAAI,IAClB,MAAMP,GACNoC,KAAKD,eAAgB,GAIlB,cACL,OAAOC,KAAKD,cAGP,MAAME,EAA0DC,GACrE,OAAGA,aAAiB1B,KACXT,EAAqBmC,GAAO9C,KAAK+C,GAC/BF,EAAWG,MAAMD,IAGnBF,EAAWG,MAAMF,GAIrB,kBAAkB7B,EAAkBgC,GACzC,MAAMjC,EAAwC,GAuB9C,MAtBuB,CACrBgC,MAAaE,GAA8B,kCACzC,IAAIN,KAAKD,cACP,MAAM,EAGR3B,EAAUmC,KAAKD,MAEjBE,SAAU,KACRpC,EAAUuB,OAAS,GAErBc,SAAU,CAACC,GAAgB,KACzB,MAAMnD,EAAOY,EAAcC,EAAWC,GAMtC,OAJGqC,GAAiBL,GAClBA,EAAiB9C,GAGZA,M,sSC5CA,MAAM,EAQnB,YAAoBoD,GAAA,KAAAA,SAJZ,KAAAC,YAAa,EAKhB,EAAM9G,OACPkG,KAAKW,QAAU,SAGd,EAAuBE,SAASlB,SACjCK,KAAKY,WAAa,EAAuBC,SAAS,GAAGD,YAGvDZ,KAAKc,eACL,EAAuBD,SAASN,KAAKP,MAG/B,e,MACN,OAAyB,QAAlB,EAAAA,KAAKe,qBAAa,QAAKf,KAAKe,cAAgBC,OAAOC,KAAKjB,KAAKW,QAG/D,OAAOO,GACZ,OAAOlB,KAAKmB,iBAAkBC,GAAUA,EAAMC,OAAO,IAAMH,IAGtD,YACL,OAAOF,OAAOK,OAAOrB,KAAKW,QAGrB,IAAIO,GACT,OAAOlB,KAAKmB,iBAAkBC,GAAUA,EAAME,MAAM,IAAMJ,IAGrD,KAAKA,EAAmBxE,GAE7B,OAAOsD,KAAKmB,iBAAkBC,GAAUA,EAAMG,IAAI,IAAML,EAAWxE,IAG9D,QAAQ8E,EAAkBhE,EAAmC,QAOlE,OAAOwC,KAAKrH,IAAI6I,GAAUpE,KAAMV,IAC9B,IAAIA,EAEF,KAAM,iBAOR,OAJgBA,EAASc,OAQtB,SAASgE,EAAkBjE,GAE3BA,aAAgBiB,OACnBjB,EAAOY,EAAcZ,IAGvB,MAAMb,EAAW,IAAI+E,SAASlE,EAAM,CAClCmE,QAAS,CACP,iBAAkB,GAAKnE,EAAKoE,QAIhC,OAAO3B,KAAK4B,KAAKJ,EAAU9E,GAAUU,KAAK,IAAMG,GAG3C,iBAAoBsE,GACzB,OAAI7B,KAAKY,WAIF,IAAI7D,QAAW,CAAMG,EAASG,IAAW,kCAC9C,IAAIyE,GAAW,EACf,MAAMC,EAAU5E,WAAW,KACzBE,IAEAyE,GAAW,GACV,MAEH,IACE,MAAMV,QAAcpB,KAAKc,eACzB,IAAIM,EAGF,MAFApB,KAAKY,YAAa,EAClBZ,KAAKe,mBAAgBiB,EACf,YAGR,MAAMC,QAAYJ,EAAST,GAE3B,GAAGU,EAAU,OACb5E,EAAQ+E,GACR,MAAMC,GACN7E,EAAO6E,GAGTC,aAAaJ,OA3BNhF,QAAQM,OAAO,mBA+BnB,cAAcmE,EAAkBnD,GACrC,MAAM+D,EAAa,EAAYC,kBAAkBhE,EAAWd,GACnDyC,KAAKsC,SAASd,EAAUjE,GAAMgF,MAAM,IAAMhF,IAGnD,OAAOR,QAAQG,QAAQkF,GAGlB,qBAAqBI,GAC1B,OAAOzF,QAAQ0C,IAAIO,KAAKa,SAAS4B,IAAIC,IAGnC,GAFAA,EAAQ9B,WAAa4B,GAEjBA,EACF,OAAOE,EAAQC,gBA3HN,EAAA9B,SAAqC,G,0SCCtD,MAAM+B,EAAe,IAAI,EAAuB,sBAiChDC,YA7BuB,IACdD,EAAazB,iBAAkBC,GAC7BA,EAAM0B,OAAO1F,KAAK2F,IACvB,MAAMC,EAAmC,IAAIC,IACvCC,EAAYhI,KAAKC,MAAQ,IAAO,EACtC,IAAI,MAAMgI,KAAWJ,EAAU,CAC7B,MAAMzB,EAAQ6B,EAAQC,IAAI9B,MAAM,cAC7BA,IAAU0B,EAASK,IAAI/B,EAAM,KAC9B0B,EAASM,IAAIhC,EAAM,GAAI6B,GAI3B,MAAMI,EAA2B,GACjC,IAAI,MAAOC,EAAIL,KAAYH,EAAU,CACnC,MAAMlG,EAAUsE,EAAME,MAAM6B,GAAS/F,KAAMV,IACzC,IAAKA,EAASgF,QAAQ/I,IAjBC,eADf,OAkB4DuK,EAElE,OADAtH,EAAI,4BAA6B4H,GAC1BpC,EAAMC,OAAO8B,EAAS,CAACM,cAAc,EAAMC,YAAY,MAIlEH,EAAShD,KAAKzD,GAGhB,OAAOC,QAAQ0C,IAAI8D,MAKG,MAC5BV,YAAY,KACVzD,IAAmBhC,KAAMiC,IACvB,IAAI,MAAOsE,EAAUJ,KAAaK,EAChC,IAAIvE,EAAQwE,KAAKC,GAAUA,EAAON,KAAOG,GAAW,CAClD,IAAI,MAAMI,KAAUR,EAAU,CACZA,EAASQ,GACjB1G,SAGVuG,EAAiBvC,OAAOsC,OAI7B,MAIH,MAAMK,EAAiC,IAAIf,IAC3C,MAAM,EAMJ,YAAoBnH,GAAA,KAAAA,OAFZ,KAAAmI,cAA6B,IAAIC,IAWjC,KAAAC,QAAU,KAChBH,EAAQ3C,OAAOrB,KAAKwD,KATpBxD,KAAKwD,GAAK,EAAOY,MAAMtI,GACvBkI,EAAQV,IAAItD,KAAKwD,GAAIxD,MAGrBA,KAAKqE,UAAYvI,EAAK6F,KAAO,SAAqB2C,EAA2BC,EAC7EvE,KAAKwE,iBC5EM,SACbC,EACAxH,EACAyH,GAAiB,EACjBC,GAAgB,GAEhB,IAAIC,EACAC,EAAiD3H,EAAgCG,EACjFyH,GAAa,EAEjB,MAAO,IAAIpJ,KACLmJ,IAAgBA,EAAiB,IAAI9H,QAAQ,CAACgI,EAAUC,KAAa9H,EAAU6H,EAAU1H,EAAS2H,KAEnGJ,GACDzC,aAAayC,GACbE,GAAa,EACbzH,IACAwH,EAAiB,IAAI9H,QAAQ,CAACgI,EAAUC,KAAa9H,EAAU6H,EAAU1H,EAAS2H,KAC1EN,IAERxH,EAAQuH,KAAM/I,IACdoJ,GAAa,GAGfF,EAAiBzH,WAAW,MAEvBwH,GAAmBD,IAAkBI,GAEtC5H,EAAQuH,KAAM/I,IAGhBkJ,EAAiBC,EAAiB3H,EAAUG,OAAS2E,EACrD8C,GAAa,GACZ7H,GAEH4H,EAAetC,MAAM,QACdsC,GDwCiBI,CAASjF,KAAKmE,QAAS,MAAQ,GAAO,GAOlD,0BAA0Be,EAAuBC,EAAeC,GAAc,G,yCAC1F,MAAMC,EAAwC,CAC5C7J,KAAM,kBACN8J,QAAS,CAACtF,KAAKlE,KAAKyJ,KAAMvF,KAAKlE,KAAK/B,SAAUmL,EAAeC,IAGzDpB,EAASyB,KAAKC,UAAUJ,GAC7BA,EAA6B7B,GAAKO,EAEnC,MAAM2B,QAAqBtG,IAAmBhC,KAAMiC,IAClD,GAAIA,EAAQM,OAIZ,OAAON,EAAQwE,KAAKC,GAAUF,EAAiBP,IAAIS,EAAON,MAAQnE,EAAQ,KAG5E,IAAIqG,EACF,MAAM,IAAI7K,MAAM,aAGlB,IAAI0I,EAAWK,EAAiBjL,IAAI+M,EAAalC,IAC7CD,GACFK,EAAiBN,IAAIoC,EAAalC,GAAID,EAAW,IAGnD,IAAIoC,EAAWpC,EAASQ,GACxB,GAAG4B,EACD,OAAOA,EAASvI,KAAKwI,GAAcA,EAAW1F,OAGhDwF,EAAa7F,YAAYwF,GACzBrF,KAAKiE,cAAc4B,IAAIX,GAEvBS,EAAWpC,EAASQ,GElGjB,WACL,IAAI+B,EAAsB,CACxBC,aAAa,EACbC,YAAY,EAEZC,OAAQ,OACRC,UAAW,IAAIxK,KACboK,EAAeK,WAAazK,EAC5BoK,EAAepG,UAAUf,QAASkD,GAAkBA,KAAYnG,KAGlEgE,UAAW,GACX0G,kBAAoBvE,IACfiE,EAAeK,YAChBtE,KAAYiE,EAAeK,YAG7BL,EAAepG,UAAUa,KAAKsB,KAI9B8D,EAAkC,IAAI5I,QAAW,CAACG,EAASG,KAC7DyI,EAAe5I,QAAWnE,IACrB4M,EAASI,aAAeJ,EAASK,aAEpCL,EAASI,aAAc,EACvB7I,EAAQnE,KAGV+M,EAAezI,OAAS,IAAI3B,KACvBiK,EAASK,YAAcL,EAASI,cAEnCJ,EAASK,YAAa,EACtB3I,KAAU3B,OAqBd,OAXAiK,EAASpD,MAAMxD,GAAMsH,QAAQ,KAC3BV,EAASM,OAASN,EAASO,UAAYP,EAASQ,WAAa,KAC7DR,EAASjG,UAAUC,OAAS,EAEzBgG,EAASW,SACVX,EAASW,OAAS,UAItB9N,OAAO+N,OAAOZ,EAAUG,GAEjBH,EF4CyBa,GAC9B,MAAMC,EAAed,EAASvI,KAAKwI,GAAcA,EAAW1F,OAK5D,OAHAF,KAAK0G,iBAAiBD,EAAcvB,EAAeC,IAClDC,GAAepF,KAAK2G,cAAczB,EAAeA,EAAkC,GAAjBlF,KAAKqE,WAEjEoC,KAGD,yBAAyBvB,EAAuBC,EAAeC,GACrE,MAAM/L,EAAM2G,KAAK4G,YAAY1B,EAAeC,GAC5C,OAAOvC,EAAaiE,QAAQxN,GAAK+D,KAAMG,GAC9B6H,EAAc,IAAIlH,WAAeH,EAAqBR,GAC3DxB,OAOE,gBAAgBmJ,EAAuBC,EAAeC,GAC5D,OAAOpF,KAAK8G,yBAAyB5B,EAAeC,EAAOC,GAAahI,KAAK8C,GACpEA,GAASF,KAAK+G,0BAA0B7B,EAAeC,EAAOC,IAIjE,iBAAiBO,EAA+BT,EAAuBC,GAC7E,OAAOQ,EAASvI,KAAK8C,IACnB,MAAM7G,EAAM2G,KAAK4G,YAAY1B,EAAeC,GACtCzI,EAAW,IAAI+E,SAASvB,EAAO,CACnCwB,QAAS,CACP,iBAAkB,GAAKxB,EAAMP,OAC7B,eAAgB,2BAChB,cAA4B,IAAMzE,KAAKC,MAAQ,IAAO,MAI1D,OAAOyH,EAAahB,KAAKvI,EAAKqD,KAI1B,aAAasK,GAChBhH,KAAKiE,cAAcZ,IAAI2D,KAI1BhH,KAAKiE,cAAc4B,IAAImB,GACvBhH,KAAKiH,gBAAgBD,EAAQhH,KAAKqE,WAAW,IAGvC,cAAc2C,EAAgBE,GAKpC,GAJGA,EAAMlH,KAAKlE,KAAK6F,OACjBuF,EAAMlH,KAAKlE,KAAK6F,MAGdqF,EAGF,KAAMA,EAASE,EAAKF,GAAUhH,KAAKqE,UACjCrE,KAAKmH,aAAaH,QAHpBhH,KAAKmH,aAAaC,EAAYJ,EAAQhH,KAAKqE,YAQxC,aAAagD,GAClBrH,KAAKwE,mBAEL,MAAM8C,EA2EV,SAAqCD,EAAoBhJ,EAAkBsD,GACzE,GAAgB,IAAb0F,EAAM,IAAyB,IAAbA,EAAM,GACzB,OAAO,IAAI5F,SAAS,IAAIvD,WAAW,GAAGD,OAAQ,CAC5CrB,OAAQ,IACR2K,WAAY,kBACZ7F,QAAS,CACP,gBAAiB,QACjB,gBAAiB,cAAaC,GAAQ,KACtC,iBAAkB,IAClB,eAAgBtD,GAAY,eAKlC,OAAO,KAzFoBmJ,CAA4BH,EAAOrH,KAAKlE,KAAKuC,SAAU2B,KAAKlE,KAAK6F,MAC1F,GAAG2F,EACD,OAAOA,EAGT,IAAKN,EAAQE,GAAOG,EAQpB,MAAMlC,EAAQ+B,GAAOA,EAAMlH,KAAKqE,UAoGpC,SAAoBc,GAClB,OAAO,WAAKsC,KAAKC,KAAKD,KAAK7L,IAAIuJ,GAASsC,KAAK7L,IAAI,KArGH+L,CAAWT,EAAMF,EAAS,GAAKhH,KAAKqE,UAC1Ea,EAAgBkC,EAAYJ,EAAQ7B,GAM1C,OAJI+B,IACFA,EAAMO,KAAKG,IAAIZ,EAAS7B,EAAOnF,KAAKlE,KAAK6F,KAAO,IAG3C3B,KAAKiH,gBAAgB/B,EAAeC,GAAO/H,KAAKyK,IAIlDb,IAAW9B,GAAiBgC,IAAShC,EAAgBC,IACtD0C,EAAKA,EAAGxL,MAAM2K,EAAS9B,EAAegC,EAAMhC,EAAgB,IAG9D,MAAMxD,EAAkC,CACtC,gBAAiB,QACjB,gBAAiB,SAASsF,KAAUA,EAASa,EAAGC,WAAa,KAAK9H,KAAKlE,KAAK6F,MAAQ,MACpF,iBAAkB,GAAGkG,EAAGC,YASxB,OANC9H,KAAKlE,KAAKuC,WACXqD,EAAQ,gBAAkB1B,KAAKlE,KAAKuC,UAK7B,IAAIoD,SAASoG,EAAI,CACtBjL,OAAQ,IACR2K,WAAY,kBACZ7F,cAMA,YAAYwD,EAAuBC,GACzC,OAAOnF,KAAKwD,GAAK,WAAa0B,EAAgB,UAAYC,EAGrD,WAAWrJ,G,MAChB,OAAoC,QAA7B,EAAAkI,EAAQrL,IAAIqH,KAAKoE,MAAMtI,WAAM,QAAI,IAAI,EAAOA,GAG7C,aAAaA,GACnB,OAAQA,EAAK/B,SAAyDyJ,IAsC1E,MAAMe,EAA4B,OAC5BD,EAA2B,QAYjC,SAAS8C,EAAYJ,EAAgBe,EAXR,MAY3B,OAAOf,EAAUA,EAASe,EGhRb,MAlB0F,CACvG1P,KAAM,OACN2P,QAAS,EACTC,OAAQ,CAAC,CACP5P,KAAM,WACL,CACDA,KAAM,eACL,CACDA,KAAM,SACL,CACDA,KAAM,SACL,CACDA,KAAM,WACL,CACDA,KAAM,cCpBK,MAFgB,oBAAb,OAA2BmC,OAASC,KCQ/C,MAAMyN,EAAaC,UAAYA,UAAUC,UAAY,KAW/CC,GAVWF,UAAUC,UAAUpO,OAAO,yBACzBmO,UAAUC,UAAUE,cAAcrO,QAAQ,WACzC,SAASH,KAAKqO,UAAUC,YAAc,aAAatO,KAAKqO,UAAUI,SAG7D,mBAAmBzO,KAAKqO,UAAUK,WACxC,aAAvBL,UAAUK,UAA2BL,UAAUM,eAAiB,IAC/D,EAAYC,YAEY,WAAY,MAAWR,IAAe,yBAAyBpO,KAAKoO,IAAkBA,EAAW5G,MAAM,WAAc4G,EAAW5G,MAAM,YACxI6G,UAAUC,UAAUE,cAAcrO,QAAQ,YAAc,GAIbkO,UAAUM,eAAiB,GAAKN,UAAUC,UAAUpO,OAAO,kHCiBjH,MAAM,EAanB,YAAY2O,EAAOC,GATX,KAAAC,oBAAqB,ECqGxB,SAAoBrP,EAAasP,GACtC,GAAIA,EAEJ,IAAI,IAAIhR,KAAKgR,OACU9G,IAAlB8G,EAAWhR,KACZ0B,EAAO1B,GAAKgR,EAAWhR,IDhGzBiR,CAAW/I,KAAM2I,GAEd,EAAM7O,OACPkG,KAAK3H,MAAQ,SAGf2H,KAAK4I,UAAYA,EAEjB5I,KAAKpE,IAAMN,EAAO,OAAS0E,KAAK4I,WAEhC5I,KAAKc,cAAa,GAElB,EAAWD,SAASN,KAAKP,MAGpB,sBAAsBgJ,GAC3BhJ,KAAKa,SAASlC,QAAQ+D,IACpB,GAAGsG,GAAYA,IAAatG,EAC1B,OAGF,MAAMiG,EAAKjG,EAAQiG,GAChBA,IACDA,EAAGM,QAAU,OACbN,EAAGO,WAuCF,cACL,OAAOlJ,KAAK6I,mBAGP,aAAaM,GAAY,GAC9B,GAAGnJ,KAAKe,gBAAkBoI,EACxB,OAAOnJ,KAAKe,cAad,IACE,IAAIoC,EAAUiG,UAAUnI,KAAKjB,KAAK3H,KAAM2H,KAAKgI,SAE7C,IAAI7E,EACF,OAAOpG,QAAQM,SAEjB,MAAMtB,GAGN,OAFAiE,KAAKpE,IAAIG,MAAM,mBAAqBA,EAAgBsN,SACpDrJ,KAAK6I,oBAAqB,EACnB9L,QAAQM,OAAOtB,GAGxB,IAAIuN,GAAW,EAOf,OANAnM,WAAW,KACLmM,GACFnG,EAAQoG,QAAQ,CAAC/N,KAAM,wBAExB,KAEIwE,KAAKe,cAAgB,IAAIhE,QAAqB,CAACG,EAASG,KAC7D8F,EAAQqG,UAAaC,IACnBH,GAAW,EACX,MAAMX,EAAKxF,EAAQrF,OACnB,IAAI4L,GAAY,EAEhB1J,KAAKpE,IAAI,UAET+M,EAAGY,QAAWxN,IACZiE,KAAK6I,oBAAqB,EAC1B7I,KAAKpE,IAAIG,MAAM,8CAA+CA,GAC9DsB,EAAOtB,IAGT4M,EAAGM,QAAWrL,IACZoC,KAAKpE,IAAIG,MAAM,UAAW6B,IACzB8L,GAAa1J,KAAKc,gBAGrB6H,EAAGgB,QAAW/L,IACZoC,KAAKpE,IAAIG,MAAM,SAAU6B,GACzB,MAAMgM,EAAchM,EAAEC,OAEtBmC,KAAKc,aAAa4I,GAAY,GAE3BE,EAAYL,SACbK,EAAYL,QAAQ3L,GAGtB+K,EAAGO,SAGLP,EAAGkB,gBAAmBjM,IACpBoC,KAAKpE,IAAIG,MAAM,0BAGjBmB,EAAQ8C,KAAK2I,GAAKA,IAGpBxF,EAAQoG,QAAWE,IACjBH,GAAW,EACXtJ,KAAK6I,oBAAqB,EAC1B7I,KAAKpE,IAAIG,MAAM,8CAA+C0N,GAC9DpM,EAAOoM,IAGTtG,EAAQ2G,gBAAmBL,IACzBH,GAAW,EACXtJ,KAAKpE,IAAIC,KAAK,8BAA+B4N,EAAMM,WAAY,KAAMN,EAAMO,YAG3E,IAAIrB,EAAKc,EAAM5L,OAAOC,OACtBkC,KAAKiI,OAAOtJ,QAASsL,IAOftB,EAAGuB,iBAAiBC,SAASF,EAAM5R,OAxFnB,EAACsQ,EAAiBsB,K,MAC1C,MAAMG,EAAKzB,EAAG0B,kBAAkBJ,EAAM5R,MAEtC,GAAgB,QAAb,EAAA4R,EAAMK,eAAO,eAAE3K,OAChB,IAAI,MAAM4K,KAASN,EAAMK,QACvBF,EAAGI,YAAYD,EAAME,UAAWF,EAAMG,QAASH,EAAMI,mBAoFnDN,CAAkB1B,EAAIsB,QAOzB,OAAO/I,GAMZ,OAJI0J,MAAMC,QAAQ3J,KAChBA,EAAY,GAAG4J,OAAO5J,IAGjBlB,KAAK+K,eAAe,YAAcC,GAC/B9J,EAAuBuB,IAAKvB,GAAc8J,EAAY3J,OAAOH,IACxB,IAG1C,MAAM0H,GACX,OAAO5I,KAAK+K,eAAe,YAAcC,GAAgBA,EAAYC,QAA2B,GAAIrC,GAG/F,KAAK1H,EAA8BnI,GAiBxC,OALI6R,MAAMC,QAAQ3J,KAChBA,EAAY,GAAG4J,OAAO5J,GACtBnI,EAAQ,GAAG+R,OAAO/R,IAGbiH,KAAK+K,eAAe,YAAcC,GAC/B9J,EAAuBuB,IAAI,CAACvB,EAAWgK,IAAQF,EAAYzJ,IAAIxI,EAAMmS,GAAMhK,IACxC,IAGxC,SAASM,EAAkBjE,GAMhC,OAJKA,aAAgBiB,OACnBjB,EAAOY,EAAc,CAACZ,KAGjByC,KAAK4B,KAAKJ,EAAUjE,GAqEtB,IAAO2D,GAOZ,OAJI0J,MAAMC,QAAQ3J,KAChBA,EAAY,GAAG4J,OAAO5J,IAGjBlB,KAAK+K,eAAkB,WAAaC,GACjC9J,EAAuBuB,IAAKvB,GAAc8J,EAAYrS,IAAIuI,IACxB,IAGtC,eAAkBjI,EAA0B+R,EAAyEpP,EAAcgN,EAAY5I,KAAK4I,WAC1J,IAAIuC,EAOJ,OALGvP,IACDuP,EAAOC,YAAYjQ,MACnB6E,KAAKpE,IAAIA,EAAM,YAGVoE,KAAKc,eAAe1D,KAAMuL,GACxB,IAAI5L,QAAW,CAACG,EAASG,KAK9B,MAAMuM,EAAcjB,EAAGiB,YAAY,CAAChB,GAAY3P,GAEhD2Q,EAAYL,QAAW3L,IACrBuE,aAAaJ,GACb1E,EAAOuM,EAAY7N,QAGrB6N,EAAYyB,WAAczN,IACxBuE,aAAaJ,GAEVnG,GACDoE,KAAKpE,IAAIA,EAAM,QAASwP,YAAYjQ,MAAQgQ,GAG9C,MAAMG,EAAU1S,EAAE6J,IAAI7J,GAAKA,EAAEkF,QAC7BZ,EAAQ2N,EAAUS,EAAUA,EAAQ,KAGtC,MAAMvJ,EAAU5E,WAAW,KACzB6C,KAAKpE,IAAIG,MAAM,2BAA4B6N,IAC1C,KAOG7G,EAAWiI,EAAYpB,EAAYoB,YAAYpC,IAE/CiC,EAAUD,MAAMC,QAAQ9H,GACxBnK,EAAkBiS,EAAU9H,EAAW,GAAG+H,OAAO/H,MA0BtD,SACL,OAAO/C,KAAK+K,eAAoB,WAAaC,GAAgBA,EAAYO,SAA6B,KAxXzF,EAAA1K,SAAwC,G,0SExBzD,MAAM,EAAMpG,KACN+Q,EAAiBzR,SAAS0R,SAAW,KAAO1R,SAAS2R,SAAW3R,SAAS4R,SAASC,MAAM,KAAKvP,MAAM,GAAI,GAAGwP,KAAK,KAAO,IA+E5H,MAAMvT,EAAS,IAxDf,MAIE,YACEqQ,EACAC,EACQkD,GAAA,KAAAA,WANF,KAAA1K,MAA0B,GAUhCpB,KAAK0C,QAAU,IAAI,EAAciG,EAAIC,GAG1B,IAA6BvP,G,yCACxC,QAAuB2I,IAApBhC,KAAKoB,MAAM/H,GACZ,OAAO2G,KAAKoB,MAAM/H,GAGpB,IAAIN,EACJ,IACEA,QAAciH,KAAK0C,QAAQ/J,IAAIU,GAC/B,MAAM6I,IAIR,QAAuBF,IAApBhC,KAAKoB,MAAM/H,GACZ,OAAO2G,KAAKoB,MAAM/H,GAGpB,QAAa2I,IAAVjJ,EAAqB,CACtB,MAAM8I,EAAW7B,KAAK8L,SAASzS,GAC/BN,EAA6B,mBAAf,EAA4B8I,IAAaA,EAGzD,OAAO7B,KAAKoB,MAAM/H,GAAON,KAGd,IAA6BM,EAAQN,G,yCAChDiH,KAAKoB,MAAM/H,GAAON,EAElB,IACEiH,KAAK0C,QAAQd,KAAKvI,EAAeN,GACjC,MAAMmJ,UAa2D,EAAgB,UAAW,CAChG6J,gBAAiB,EACjBC,gBAAiB,EACjBC,UAAW,GACXC,cAAe,KAGjB,EAAIvO,iBAAiB,OAAS8L,IAC5B,MAAM0C,EAA8B1C,EAAM2C,KAAKC,OAC/CzQ,EAAI,OAAQuQ,GAEZ,IAAIG,GAAmB,EACvB,MAAMC,EAAgBxP,QAAQ0C,IAAI,CAChCnH,EAAOK,IAAI,mBACXL,EAAOK,IAAI,mBACX,EAAI0G,QAAQC,SAAS,CAAC9D,KAAM,aAC3B4B,KAAMU,IACP,MAAO0O,EAAWC,EAAeC,GAAc5O,EAI/C,GAFAlC,EAAI,kBAAmB8Q,GACvBJ,EAAmBI,EAAW/M,OAAS,EACpC2M,EACD,KAAM,sDAGR,MAAMK,EAAUzR,KAAKC,MACrB,GAAGyR,KACCJ,GACAG,EAAUH,EACZ,KAAM,yCAAyC/E,KAAKC,MAAM8E,EAAYG,GAAW,WAGnF,IAAIR,EAAIU,MACN,KAAM,cAIVN,EAAchK,MAAMuK,IAClBlR,EAAIkR,KAGN,MAMMC,EANsBR,EAAcnP,KAAK,IACtCL,QAAQ0C,IAAI,CAACnH,EAAOK,IAAI,iBAAkBL,EAAOK,IAAI,gBAC3DyE,KAAMU,GAyHX,SAA0BqO,EAA6Ba,EAAwCC,GAC7F,MAAMC,EAAO,qCACb,IAEIC,EAFAC,EAAQjB,EAAIiB,OAAS,WACrBC,EAAOlB,EAAImB,aAAe,GAG3BnB,EAAIoB,SAEHJ,EADChB,EAAIoB,OAAOC,WACH,IAAMrB,EAAIoB,OAAOC,WAClBrB,EAAIoB,OAAOE,QACV,IAAMtB,EAAIoB,OAAOE,QAEjBtB,EAAIoB,OAAOG,SAAW,IAInCvB,EAAIoB,OAAOJ,OAAS,GAAKA,EACzB,IAAIQ,EAAM,OAASR,EAEhBH,GAAYA,EAASY,YACtBR,EAAQ,WACRC,EAAOJ,EAAKY,wBAA0B,yBACtCF,EAAM,gBAGR/R,EAAI,cAAewR,EAAOC,EAAMH,EAAMf,GAEtC,MAAM2B,EAA+F,CAAC,CACpGC,OAAQ,SACRX,MAAOH,EAAKe,oBAAsB,iBAcpC,OAR4B,EAAIC,aAAaC,iBAAiBd,EAAO,CACnEC,OACAH,OACAS,MACAvB,KAAMD,EACN2B,YAGyB1Q,KAAMqM,IA1FnC,IAA6B0E,EA4FtB1E,GAASA,EAAM0E,eA5FOA,EA8FH1E,EAAM0E,aA7F1BC,EAAc/K,IAAI8K,KACpBC,EAAcvI,IAAIsI,GAElBA,EAAalF,QAAUoF,MA4FtB9L,MAAOxG,IACRH,EAAIG,MAAM,4BAA6BA,KA1KhCuS,CAAiBnC,EAAKrO,EAAO,GAAIA,EAAO,KAGRyE,MAAM,KAC7C3G,EAAI,oCAAqC0Q,GACtCM,KAA8BN,EACxBiC,IAGF,EAAIN,aAAaC,iBAAiB,WAAY,CACnDP,IAAK,iBACJvQ,KAAK,KACN,GAAGkP,EACD,OAAOiC,IAGTpR,WAAW,IAAMoR,IAAyBjC,EAAmB,EAAI,OAChE/J,MAAOxG,IACRH,EAAIG,MAAM,0BAA2BA,OAIzC0N,EAAM+E,UAAUzB,KAGlB,EAAIpP,iBAAiB,oBAAsB8L,IACzC,MAAM0E,EAAe1E,EAAM0E,aAC3BvS,EAAI,0BAA2BuS,EAAaR,KAC5CQ,EAAajF,QAEb,MAAM6E,EAAStE,EAAMsE,OACrB,GAAc,WAAXA,GAAuBnB,IAGxB,OAFAhR,EAAI,yBACJtD,EAAOgL,IAAI,kBAAmBpI,KAAKC,MAAQ,OAI7C,MAAMiR,EAA+B+B,EAAa/B,KAClD,IAAIA,EACF,OAGF,MAAMtP,EAAU,EAAIuC,QAAQC,SAAS,CACnC9D,KAAM,WACL4B,KAAMsP,IACPN,EAAK2B,OAASA,EACdU,EAAsB,CAACjT,KAAM,aAAc8J,QAAS8G,GACpD,IAAI,IAAItU,EAAI,EAAGA,EAAI4U,EAAW/M,OAAQ7H,IAAK,CACzC,MAAMgM,EAAS4I,EAAW5U,GAC1B,GAAG,UAAWgM,EAIZ,OAHAA,EAAO4K,QACP5K,EAAOjE,YAAY4O,QACnBA,OAAsBzM,GAK1B,GAAG,EAAI3C,QAAQsP,WACb,OAAOrW,EAAOK,IAAI,iBAAiByE,KAAM4P,GAChC,EAAI3N,QAAQsP,WAAW3B,EAAS4B,SAAWpD,MAGrDjJ,MAAOxG,IACRH,EAAIG,MAAM,yBAA0BA,KAGtC0N,EAAM+E,UAAU1R,KAGlB,EAAIa,iBAAiB,oBAAqB0Q,GAE1C,IACII,EADAL,EAAmC,IAAIlK,IAU3C,SAASmK,EAAoB5E,GAI7B,IAAiC0E,IAHP1E,EAAM0E,aAI9BC,EAAc/M,OAAO8M,GAGhB,SAASI,IACd,IAAI,MAAMJ,KAAgBC,EACxB,IACED,EAAajF,QACb,MAAMtL,IAGV,IAAId,EAiBJ,OAfEA,EADC,qBAAsB,EAAImR,aACjB,EAAIA,aAAaY,iBAAiB,IAAIzR,KAAMgR,IACpD,IAAI,IAAItW,EAAI,EAAGgX,EAAMV,EAAczO,OAAQ7H,EAAIgX,IAAOhX,EACpD,IACEsW,EAActW,GAAGoR,QACjB,MAAMtL,OAET2E,MAAOxG,IACRH,EAAIG,MAAM,4BAA6BA,KAG/BgB,QAAQG,UAGpBkR,EAAcnD,QAEPnO,EAGT,SAAS8P,IACP,OAAOvE,EC3OF,MAAMzM,EAAMN,EAAO,KAAMZ,EAASG,MAAQH,EAASM,MAAQN,EAASK,IAAML,EAASI,MACpF,EAAML,KACCmJ,EAAyF,IAAIX,IAsCpG8L,EAEF,CACFC,oBAAqB,KACnBT,KAEFU,KAAM,CAAC5J,EAA6BoE,MDsP/B,SAAgBpE,EAA6BoE,GAClD,MAAM3F,EAAS2F,EAAMyF,OAASzF,EAAMyF,MAAM,IAAMzF,EAAM0F,OAChD7J,EAAUD,EAAKC,QAElBA,EAAQ8J,oBACT9W,EAAOgL,IAAI,kBAAmBpI,KAAKC,OAGlCsT,GACC3K,GACA,gBAAiBA,IACnBA,EAAOjE,YAAY4O,EAAqB,IACxCA,OAAsBzM,GAGrBsD,EAAQ2H,MACT3U,EAAOgL,IAAI,YAAagC,EAAQ2H,MAG/B3H,EAAQ0H,UACT1U,EAAOgL,IAAI,gBAAiBgC,EAAQ0H,UCzQpCqC,CAAOhK,EAAMoE,IAEfxC,gBAAiB,CAAC5B,EAAmCzH,KACnD,MAAM8H,EAAe9H,EAAEuR,OACjB5L,EAAWK,EAAiBjL,IAAI+M,EAAalC,IACnD,IAAID,EACF,OAGF,MAAMzG,EAAUyG,EAAS8B,EAAK7B,IAC3B1G,IACEuI,EAAKtJ,MACNe,EAAQO,OAAOgI,EAAKtJ,OAEpBe,EAAQI,QAAQmI,EAAKC,gBAGhB/B,EAAS8B,EAAK7B,MAGzB8L,cAAgBjK,IACd,EAAuBiK,cAAcjK,EAAKC,WAG9C,EAAI3H,iBAAiB,UAAYC,IAC/B,MAAMyH,EAAOzH,EAAEwO,KACTvK,EAAWkN,EAAc1J,EAAK7J,MACjCqG,GACDA,EAASwD,EAAMzH,KAgBnB,MAAM2R,GAAW9F,IACf,GAAwD,IAArDA,EAAMtG,QAAQC,IAAInJ,QAAQF,SAASyV,OAAS,MAAc/F,EAAMtG,QAAQC,IAAI9B,MAAM,oFACnF,OAAOmI,EAAMgG,YhB9FV,SAA4BhG,G,yCACjC,IAEE,MAAMrI,QAAcvE,EAAY,EAAImE,OAAOC,KAhBd,iBAiBvByO,QAAa7S,EAAYuE,EAAME,MAAMmI,EAAMtG,QAAS,CAACO,YAAY,KAEvE,GAAGgM,GAAQjT,EAAkBiT,GAC3B,OAAOA,EAGT,MAAMhO,EAAuB,CAAC,KAAQ,KACtC,IAAIhF,QAAiBiT,MAAMlG,EAAMtG,QAAS,CAACzB,YAC3C,GAAGjF,EAAkBC,GACnB0E,EAAMG,IAAIkI,EAAMtG,QAASzG,EAASkT,cAC7B,GAAuB,MAApBlT,EAASE,OAAgB,CACjC,MAAMwG,EAAMqG,EAAMtG,QAAQC,IAAIyM,QAAQ,QAAS,IAAM,KAAuB,IAAhBpI,KAAKqI,SAAoB,GACrFpT,QAAiBiT,MAAMvM,EAAK,CAAC1B,YAC1BjF,EAAkBC,IACnB0E,EAAMG,IAAIkI,EAAMtG,QAASzG,EAASkT,SAItC,OAAOlT,EACP,MAAMwF,GACN,OAAOyN,MAAMlG,EAAMtG,agBsEM4M,CAAatG,IAGxC,IACE,MAAO,CAAErG,EAAK4M,EAAOC,GAAU,yCAAyCC,KAAKzG,EAAMtG,QAAQC,MAAQ,GAInG,OAAO4M,GACL,IAAK,UT6HI,SAAuBvG,EAAmBwG,GACvD,MAAM5I,EAqCR,SAAoB8I,GAClB,IAAIA,EAAQ,MAAO,CAAC,EAAG,GACvB,MAAO,CAAEC,GAAUD,EAAOvE,MAAM,KAC1ByE,EAASD,EAAOxE,MAAM,OACrB5E,EAAQE,GAAOmJ,EAAO,GAAGzE,MAAM,KAEtC,MAAO,EAAE5E,GAASE,GAAO,GA3CXoJ,CAAW7G,EAAMtG,QAAQzB,QAAQ/I,IAAI,UAC7CmD,EAAwB0J,KAAK+K,MAAMC,mBAAmBP,IACtDQ,EAAS,EAAO9X,IAAImD,GU7Pb,IAAiB4U,EViQ9BjH,EAAMgG,YAAY1S,QAAQC,KAAK,EUjQD0T,EVkQpB,KUjQH,IAAI3T,QAAUG,IACnBC,WAAW,KACTD,EAAQ,IAAIuE,SAAS,GAAI,CACvB7E,OAAQ,IACR2K,WAAY,yBAEbmJ,MV4PHD,EAAOE,aAAatJ,MSrIhBuJ,CAAcnH,EAAOwG,IAIzB,MAAM/N,GACNuH,EAAMgG,YAAY,IAAIhO,SAAS,GAAI,CACjC7E,OAAQ,IACR2K,WAAY,6BAKZsJ,GAAgB,KACpB,EAAIC,QAAUvB,IAGhB,EAAI5R,iBAAiB,UAAY8L,IAC/B7N,EAAI,cACJ6N,EAAM+E,UAAU,EAAIuC,iBAGtB,EAAIpT,iBAAiB,WAAa8L,IAChC7N,EAAI,aAAc,GAClB6N,EAAM+E,UAAU,EAAIxN,OAAOK,OhB5II,iBgB6I/BoI,EAAM+E,UAAU,EAAInP,QAAQ2R,WAG9B,EAAIzH,QAAWxN,IACbH,EAAIG,MAAM,SAAUA,IAGtB,EAAIkV,qBAAwBlV,IAC1BH,EAAIG,MAAM,wBAAyBA,IAGrC,EAAImV,UAAY,EAAIC,SAAWN,GAE/BA","file":"sw.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false, //location.search.indexOf('http=1') > 0,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false\r\n};\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\n * 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\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false) {\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n function Log(...args: any[]) {\n return type & LogTypes.Log && console.log(dT(), prefix, ...args);\n }\n \n Log.warn = function(...args: any[]) {\n return type & LogTypes.Warn && console.warn(dT(), prefix, ...args);\n };\n \n Log.info = function(...args: any[]) {\n return type & LogTypes.Log && console.info(dT(), prefix, ...args);\n };\n \n Log.error = function(...args: any[]) {\n return type & LogTypes.Error && console.error(dT(), prefix, ...args);\n };\n \n Log.trace = function(...args: any[]) {\n return type & LogTypes.Log && console.trace(dT(), prefix, ...args);\n };\n\n /* Log.debug = function(...args: any[]) {\n return level & LogLevels.debug && console.log(dT(), prefix, ...args);\n }; */\n\n Log.debug = function(...args: any[]) {\n return type & LogTypes.Debug && console.debug(dT(), prefix, ...args);\n };\n\n Log.setPrefix = function(_prefix: string) {\n prefix = '[' + _prefix + ']:';\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 return Log;\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { pause } from \"../../helpers/schedulers/pause\";\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\r\n\r\nfunction isCorrectResponse(response: Response) {\r\n return response.ok && response.status === 200;\r\n}\r\n\r\nfunction timeoutRace>(promise: T) {\r\n return Promise.race([\r\n promise,\r\n pause(10000).then(() => Promise.reject())\r\n ]);\r\n}\r\n\r\nexport async function requestCache(event: FetchEvent) {\r\n try {\r\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\r\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\r\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\r\n \r\n if(file && isCorrectResponse(file)) {\r\n return file;\r\n }\r\n \r\n const headers: HeadersInit = {'Vary': '*'};\r\n let response = await fetch(event.request, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n } else if(response.status === 304) { // possible fix for 304 in Safari\r\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\r\n response = await fetch(url, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n }\r\n }\r\n \r\n return response;\r\n } catch(err) {\r\n return fetch(event.request);\r\n }\r\n}\r\n","export const pause = (ms: number) => new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n});\r\n","/*\r\n * https://github.com/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 function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.addEventListener('loadend', (e) => resolve(e.target.result));\r\n reader[method](blob);\r\n });\r\n}\r\n\r\nexport function readBlobAsText(blob: Blob) {\r\n return readBlobAs(blob, 'readAsText');\r\n}\r\n\r\nexport function readBlobAsDataURL(blob: Blob) {\r\n return readBlobAs(blob, 'readAsDataURL');\r\n}\r\n\r\nexport function readBlobAsArrayBuffer(blob: Blob) {\r\n return readBlobAs(blob, 'readAsArrayBuffer');\r\n}\r\n\r\nexport function readBlobAsUint8Array(blob: Blob) {\r\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\r\n}\r\n\r\nexport function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\r\n let blob;\r\n const safeMimeType = blobSafeMimeType(mimeType);\r\n try {\r\n blob = new Blob(blobParts, {type: safeMimeType});\r\n } catch(e) {\r\n // @ts-ignore\r\n let bb = new BlobBuilder;\r\n blobParts.forEach((blobPart: any) => {\r\n bb.append(blobPart);\r\n });\r\n blob = bb.getBlob(safeMimeType);\r\n }\r\n return blob;\r\n}\r\n\r\n// https://www.iana.org/assignments/media-types/media-types.xhtml\r\nexport function blobSafeMimeType(mimeType: string) {\r\n if([\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/gif',\r\n 'image/webp',\r\n 'image/bmp',\r\n 'video/mp4',\r\n 'video/webm',\r\n 'video/quicktime',\r\n 'audio/ogg',\r\n 'audio/mpeg',\r\n 'audio/mp4',\r\n 'application/json',\r\n 'application/pdf'\r\n ].indexOf(mimeType) === -1) {\r\n return 'application/octet-stream';\r\n }\r\n\r\n return mimeType;\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\nexport const isWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;\r\nexport const isServiceWorker = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const isWorker = isWebWorker || isServiceWorker;\r\n\r\n// в SW может быть сразу две переменных TRUE, поэтому проверяю по последней\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = isServiceWorker ? notifyServiceWorker.bind(null, false) : (isWebWorker ? notifyWorker : noop);\r\nexport const notifyAll = isServiceWorker ? notifyServiceWorker.bind(null, true) : (isWebWorker ? notifyWorker : noop);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { blobConstruct, readBlobAsUint8Array } from \"../helpers/blob\";\r\n\r\nexport class FileManager {\r\n public blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport FileManager from './filemanager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { readBlobAsUint8Array } from \"../../helpers/blob\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { getWindowClients } from \"../../helpers/context\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { InputFileLocation, UploadFile } from \"../../layer\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport { RequestFilePartTask, deferredPromises, log } from \"./index.service\";\r\nimport timeout from \"./timeout\";\r\n\r\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\r\nconst CHUNK_TTL = 86400;\r\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\r\n\r\nconst clearOldChunks = () => {\r\n return cacheStorage.timeoutOperation((cache) => {\r\n return cache.keys().then(requests => {\r\n const filtered: Map = new Map();\r\n const timestamp = Date.now() / 1000 | 0;\r\n for(const request of requests) {\r\n const match = request.url.match(/\\/(\\d+?)\\?/);\r\n if(match && !filtered.has(match[1])) {\r\n filtered.set(match[1], request);\r\n }\r\n }\r\n\r\n const promises: Promise[] = [];\r\n for(const [id, request] of filtered) {\r\n const promise = cache.match(request).then((response) => {\r\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\r\n log('will delete stream chunk:', id);\r\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\r\n }\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n return Promise.all(promises);\r\n });\r\n });\r\n};\r\n\r\nsetInterval(clearOldChunks, 1800e3);\r\nsetInterval(() => {\r\n getWindowClients().then((clients) => {\r\n for(const [clientId, promises] of deferredPromises) {\r\n if(!clients.find(client => client.id === clientId)) {\r\n for(const taskId in promises) {\r\n const promise = promises[taskId];\r\n promise.reject();\r\n }\r\n\r\n deferredPromises.delete(clientId);\r\n }\r\n }\r\n });\r\n}, 120e3);\r\n\r\ntype StreamRange = [number, number];\r\ntype StreamId = DocId;\r\nconst streams: Map = new Map();\r\nclass Stream {\r\n private destroyDebounced: () => void;\r\n private id: StreamId;\r\n private limitPart: number;\r\n private loadedOffsets: Set = new Set();\r\n\r\n constructor(private info: DownloadOptions) {\r\n this.id = Stream.getId(info);\r\n streams.set(this.id, this);\r\n\r\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\r\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\r\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\r\n }\r\n\r\n private destroy = () => {\r\n streams.delete(this.id);\r\n };\r\n\r\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\r\n const task: Omit = {\r\n type: 'requestFilePart',\r\n payload: [this.info.dcId, this.info.location, alignedOffset, limit]\r\n };\r\n\r\n const taskId = JSON.stringify(task);\r\n (task as RequestFilePartTask).id = taskId;\r\n\r\n const windowClient = await getWindowClients().then((clients) => {\r\n if(!clients.length) {\r\n return;\r\n }\r\n\r\n return clients.find(client => deferredPromises.has(client.id)) || clients[0];\r\n });\r\n\r\n if(!windowClient) {\r\n throw new Error('no window');\r\n }\r\n\r\n let promises = deferredPromises.get(windowClient.id);\r\n if(!promises) {\r\n deferredPromises.set(windowClient.id, promises = {});\r\n }\r\n \r\n let deferred = promises[taskId] as CancellablePromise;\r\n if(deferred) {\r\n return deferred.then(uploadFile => uploadFile.bytes);\r\n }\r\n \r\n windowClient.postMessage(task);\r\n this.loadedOffsets.add(alignedOffset);\r\n \r\n deferred = promises[taskId] = deferredPromise();\r\n const bytesPromise = deferred.then(uploadFile => uploadFile.bytes);\r\n\r\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\r\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\r\n\r\n return bytesPromise;\r\n }\r\n\r\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n return cacheStorage.getFile(key).then((blob: Blob) => {\r\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\r\n }, (error) => {\r\n if(error === 'NO_ENTRY_FOUND') {\r\n return;\r\n }\r\n });\r\n }\r\n\r\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then(bytes => {\r\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\r\n });\r\n }\r\n\r\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\r\n return deferred.then(bytes => {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n const response = new Response(bytes, {\r\n headers: {\r\n 'Content-Length': '' + bytes.length,\r\n 'Content-Type': 'application/octet-stream',\r\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\r\n }\r\n });\r\n\r\n return cacheStorage.save(key, response);\r\n });\r\n }\r\n\r\n private preloadChunk(offset: number) {\r\n if(this.loadedOffsets.has(offset)) {\r\n return;\r\n }\r\n\r\n this.loadedOffsets.add(offset);\r\n this.requestFilePart(offset, this.limitPart, true);\r\n }\r\n\r\n private preloadChunks(offset: number, end: number) {\r\n if(end > this.info.size) {\r\n end = this.info.size;\r\n }\r\n\r\n if(!offset) { // load last chunk for bounds\r\n this.preloadChunk(alignOffset(offset, this.limitPart));\r\n } else { // don't preload next chunks before the start\r\n for(; offset < end; offset += this.limitPart) {\r\n this.preloadChunk(offset);\r\n }\r\n }\r\n }\r\n\r\n public requestRange(range: StreamRange) {\r\n this.destroyDebounced();\r\n\r\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\r\n if(possibleResponse) {\r\n return possibleResponse;\r\n }\r\n\r\n let [offset, end] = range;\r\n\r\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\r\n //end = info.size - 1;\r\n //offset = info.size - 1 - limitPart;\r\n offset = info.size - (info.size % limitPart);\r\n } */\r\n\r\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\r\n const alignedOffset = alignOffset(offset, limit);\r\n\r\n if(!end) {\r\n end = Math.min(offset + limit, this.info.size - 1);\r\n }\r\n\r\n return this.requestFilePart(alignedOffset, limit).then(ab => {\r\n //log.debug('[stream] requestFilePart result:', result);\r\n\r\n // if(isSafari) {\r\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\r\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\r\n }\r\n \r\n const headers: Record = {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\r\n 'Content-Length': `${ab.byteLength}`\r\n };\r\n\r\n if(this.info.mimeType) {\r\n headers['Content-Type'] = this.info.mimeType;\r\n }\r\n\r\n // simulate slow connection\r\n //setTimeout(() => {\r\n return new Response(ab, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers,\r\n });\r\n //}, 2.5e3);\r\n });\r\n }\r\n\r\n private getChunkKey(alignedOffset: number, limit: number) {\r\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\r\n }\r\n\r\n public static get(info: DownloadOptions) {\r\n return streams.get(this.getId(info)) ?? new Stream(info);\r\n }\r\n\r\n private static getId(info: DownloadOptions) {\r\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\r\n }\r\n}\r\n\r\nexport default function onStreamFetch(event: FetchEvent, params: string) {\r\n const range = parseRange(event.request.headers.get('Range'));\r\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\r\n const stream = Stream.get(info);\r\n\r\n //log.debug('[stream]', url, offset, end);\r\n\r\n event.respondWith(Promise.race([\r\n timeout(45 * 1000),\r\n stream.requestRange(range)\r\n ]));\r\n}\r\n\r\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\r\n if(range[0] === 0 && range[1] === 1) {\r\n return new Response(new Uint8Array(2).buffer, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers: {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes 0-1/${size || '*'}`,\r\n 'Content-Length': '2',\r\n 'Content-Type': mimeType || 'video/mp4',\r\n },\r\n });\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\r\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\r\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\r\n\r\nfunction parseRange(header: string): StreamRange {\r\n if(!header) return [0, 0];\r\n const [, chunks] = header.split('=');\r\n const ranges = chunks.split(', ');\r\n const [offset, end] = ranges[0].split('-');\r\n\r\n return [+offset, +end || 0];\r\n}\r\n\r\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\r\n return offset - (offset % base);\r\n}\r\n\r\nfunction alignLimit(limit: number) {\r\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyFunction, Awaited } from \"../../types\";\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) {\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 return (...args: Parameters): typeof waitingPromise => {\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 // @ts-ignore\r\n resolve(fn(...args));\r\n hadNewCall = false;\r\n }\r\n\r\n waitingTimeout = setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n }\r\n\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }, ms) as any;\r\n\r\n waitingPromise.catch(() => {});\r\n return waitingPromise;\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '.';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;","/*\r\n * https://github.com/morethanwords/tweb\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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport { safeAssign } from '../helpers/object';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.forEach(storage => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map(name => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map(storage => storage.name)));\r\n const promises = dbNames.map(dbName => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[]) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct([blob]) as Blob;\r\n }\r\n\r\n return this.save(fileName, blob);\r\n }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function copy(obj: T): T {\r\n //in case of premitives\r\n if(obj === null || typeof(obj) !== \"object\") {\r\n return obj;\r\n }\r\n \r\n //date objects should be \r\n if(obj instanceof Date) {\r\n return new Date(obj.getTime()) as any;\r\n }\r\n \r\n //handle Array\r\n if(Array.isArray(obj)) {\r\n // @ts-ignore\r\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\r\n return clonedArr;\r\n }\r\n \r\n //lastly, handle objects\r\n // @ts-ignore\r\n let clonedObj = new obj.constructor();\r\n for(var prop in obj){\r\n if(obj.hasOwnProperty(prop)) {\r\n clonedObj[prop] = copy(obj[prop]);\r\n }\r\n }\r\n return clonedObj;\r\n}\r\n\r\nexport function deepEqual(x: any, y: any): boolean {\r\n const ok = Object.keys, tx = typeof x, ty = typeof y;\r\n return x && y && tx === 'object' && tx === ty ? (\r\n ok(x).length === ok(y).length &&\r\n ok(x).every(key => deepEqual(x[key], y[key]))\r\n ) : (x === y);\r\n}\r\n\r\nexport function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\r\n //const perf = performance.now();\r\n const props = {writable: true, configurable: true};\r\n const out: {[name in keyof T]?: typeof props} = {};\r\n names.forEach(name => {\r\n if(!obj.hasOwnProperty(name)) {\r\n out[name] = props;\r\n }\r\n });\r\n Object.defineProperties(obj, out);\r\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\r\n}\r\n\r\nexport function getObjectKeysAndSort(object: {[key: string]: any}, sort: 'asc' | 'desc' = 'asc') {\r\n if(!object) return [];\r\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map(i => +i);\r\n if(sort === 'asc') return ids.sort((a, b) => a - b);\r\n else return ids.sort((a, b) => b - a);\r\n}\r\n\r\nexport function safeReplaceObject(wasObject: any, newObject: any) {\r\n if(!wasObject) {\r\n return newObject;\r\n }\r\n\r\n for(var key in wasObject) {\r\n if(!newObject.hasOwnProperty(key)) {\r\n delete wasObject[key];\r\n }\r\n }\r\n\r\n for(var key in newObject) {\r\n //if (newObject.hasOwnProperty(key)) { // useless\r\n wasObject[key] = newObject[key];\r\n //}\r\n }\r\n \r\n return wasObject;\r\n}\r\n\r\n/**\r\n * Will be used for FILE_REFERENCE_EXPIRED\r\n * @param key \r\n * @param wasObject \r\n * @param newObject \r\n */\r\nexport function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\r\n if('byteLength' in newObject[key]) { // Uint8Array\r\n newObject[key] = [...newObject[key]];\r\n }\r\n\r\n if(wasObject && wasObject[key] !== newObject[key]) {\r\n wasObject[key].length = newObject[key].length;\r\n (newObject[key] as any[]).forEach((v, i) => {\r\n wasObject[key][i] = v;\r\n });\r\n\r\n /* wasObject[key].set(newObject[key]); */\r\n newObject[key] = wasObject[key];\r\n }\r\n}\r\n\r\nexport function isObject>(object: any): object is T {\r\n return typeof(object) === 'object' && object !== null;\r\n}\r\n\r\nexport function getDeepProperty(object: any, key: string) {\r\n const splitted = key.split('.');\r\n let o: any = object;\r\n splitted.forEach(key => {\r\n if(!key) {\r\n return;\r\n }\r\n \r\n // @ts-ignore\r\n o = o[key];\r\n });\r\n \r\n return o;\r\n}\r\n\r\nexport function setDeepProperty(object: any, key: string, value: any) {\r\n const splitted = key.split('.');\r\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\r\n}\r\n\r\nexport function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\r\n for(const key in initObject) {\r\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\r\n currentObject[key] = copy(initObject[key]);\r\n onReplace && onReplace(previousKey || key);\r\n } else if(isObject(initObject[key])) {\r\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\r\n }\r\n }\r\n}\r\n\r\nexport function safeAssign(object: any, fromObject: any) {\r\n if(!fromObject) return;\r\n \r\n for(let i in fromObject) {\r\n if(fromObject[i] !== undefined) {\r\n object[i] = fromObject[i];\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 { Database } from \"../../config/databases\";\r\nimport DATABASE_STATE from \"../../config/databases/state\";\r\nimport { IS_FIREFOX } from \"../../environment/userAgent\";\r\nimport IDBStorage from \"../idb\";\r\nimport { log, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"./index.service\";\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\r\n\r\nexport type PushNotificationObject = {\r\n loc_key: string,\r\n loc_args: string[],\r\n //user_id: number, // should be number\r\n custom: {\r\n channel_id?: string, // should be number\r\n chat_id?: string, // should be number\r\n from_id?: string, // should be number\r\n msg_id: string,\r\n peerId?: string // should be number\r\n },\r\n sound?: string,\r\n random_id: number,\r\n badge?: string, // should be number\r\n description: string,\r\n mute: string, // should be number\r\n title: string,\r\n\r\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\r\n};\r\n\r\nclass SomethingGetter, Storage extends Record> {\r\n private cache: Partial = {};\r\n private storage: IDBStorage;\r\n\r\n constructor(\r\n db: T, \r\n storeName: typeof db['stores'][number]['name'], \r\n private defaults: {\r\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\r\n }\r\n ) {\r\n this.storage = new IDBStorage(db, storeName);\r\n }\r\n\r\n public async get(key: T) {\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n let value: Storage[T];\r\n try {\r\n value = await this.storage.get(key as string);\r\n } catch(err) {\r\n\r\n }\r\n\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n if(value === undefined) {\r\n const callback = this.defaults[key];\r\n value = typeof(callback) === 'function' ? callback() : callback;\r\n }\r\n\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async set(key: T, value: Storage[T]) {\r\n this.cache[key] = value;\r\n\r\n try {\r\n this.storage.save(key as string, value);\r\n } catch(err) {\r\n\r\n }\r\n }\r\n}\r\n\r\ntype PushStorage = {\r\n push_mute_until: number,\r\n push_last_alive: number,\r\n push_lang: Partial\r\n push_settings: Partial\r\n};\r\n\r\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', {\r\n push_mute_until: 0,\r\n push_last_alive: 0,\r\n push_lang: {},\r\n push_settings: {}\r\n});\r\n\r\nctx.addEventListener('push', (event) => {\r\n const obj: PushNotificationObject = event.data.json();\r\n log('push', obj);\r\n\r\n let hasActiveWindows = false;\r\n const checksPromise = Promise.all([\r\n getter.get('push_mute_until'), \r\n getter.get('push_last_alive'), \r\n ctx.clients.matchAll({type: 'window'})\r\n ]).then((result) => {\r\n const [muteUntil, lastAliveTime, clientList] = result;\r\n \r\n log('matched clients', clientList);\r\n hasActiveWindows = clientList.length > 0;\r\n if(hasActiveWindows) {\r\n throw 'Supress notification because some instance is alive';\r\n }\r\n \r\n const nowTime = Date.now();\r\n if(userInvisibleIsSupported() &&\r\n muteUntil &&\r\n nowTime < muteUntil) {\r\n throw `Supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\r\n }\r\n\r\n if(!obj.badge) {\r\n throw 'No badge?';\r\n }\r\n });\r\n\r\n checksPromise.catch(reason => {\r\n log(reason);\r\n });\r\n\r\n const notificationPromise = checksPromise.then(() => {\r\n return Promise.all([getter.get('push_settings'), getter.get('push_lang')])\r\n }).then((result) => {\r\n return fireNotification(obj, result[0], result[1]);\r\n });\r\n\r\n const closePromise = notificationPromise.catch(() => {\r\n log('Closing all notifications on push', hasActiveWindows);\r\n if(userInvisibleIsSupported() || hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n return ctx.registration.showNotification('Telegram', {\r\n tag: 'unknown_peer'\r\n }).then(() => {\r\n if(hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n setTimeout(() => closeAllNotifications(), hasActiveWindows ? 0 : 100);\r\n }).catch((error) => {\r\n log.error('Show notification error', error);\r\n });\r\n });\r\n\r\n event.waitUntil(closePromise);\r\n});\r\n\r\nctx.addEventListener('notificationclick', (event) => {\r\n const notification = event.notification;\r\n log('On notification click: ', notification.tag);\r\n notification.close();\r\n\r\n const action = event.action as PushNotificationObject['action'];\r\n if(action === 'mute1d' && userInvisibleIsSupported()) {\r\n log('[SW] mute for 1d');\r\n getter.set('push_mute_until', Date.now() + 86400e3);\r\n return;\r\n }\r\n\r\n const data: PushNotificationObject = notification.data;\r\n if(!data) {\r\n return;\r\n }\r\n\r\n const promise = ctx.clients.matchAll({\r\n type: 'window'\r\n }).then((clientList) => {\r\n data.action = action;\r\n pendingNotification = {type: 'push_click', payload: data};\r\n for(let i = 0; i < clientList.length; i++) {\r\n const client = clientList[i];\r\n if('focus' in client) {\r\n client.focus();\r\n client.postMessage(pendingNotification);\r\n pendingNotification = undefined;\r\n return;\r\n }\r\n }\r\n\r\n if(ctx.clients.openWindow) {\r\n return getter.get('push_settings').then((settings) => {\r\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\r\n });\r\n }\r\n }).catch((error) => {\r\n log.error('Clients.matchAll error', error);\r\n })\r\n\r\n event.waitUntil(promise);\r\n});\r\n\r\nctx.addEventListener('notificationclose', onCloseNotification);\r\n\r\nlet notifications: Set = new Set();\r\nlet pendingNotification: ServiceWorkerPushClickTask;\r\nfunction pushToNotifications(notification: Notification) {\r\n if(!notifications.has(notification)) {\r\n notifications.add(notification);\r\n // @ts-ignore\r\n notification.onclose = onCloseNotification;\r\n }\r\n}\r\n\r\nfunction onCloseNotification(event: NotificationEvent) {\r\n removeFromNotifications(event.notification)\r\n}\r\n\r\nfunction removeFromNotifications(notification: Notification) {\r\n notifications.delete(notification);\r\n}\r\n\r\nexport function closeAllNotifications() {\r\n for(const notification of notifications) {\r\n try {\r\n notification.close();\r\n } catch(e) {}\r\n }\r\n\r\n let promise: Promise;\r\n if('getNotifications' in ctx.registration) {\r\n promise = ctx.registration.getNotifications({}).then((notifications) => {\r\n for(let i = 0, len = notifications.length; i < len; ++i) {\r\n try {\r\n notifications[i].close();\r\n } catch(e) {}\r\n }\r\n }).catch((error) => {\r\n log.error('Offline register SW error', error);\r\n });\r\n } else {\r\n promise = Promise.resolve();\r\n }\r\n\r\n notifications.clear();\r\n\r\n return promise;\r\n}\r\n\r\nfunction userInvisibleIsSupported() {\r\n return IS_FIREFOX;\r\n}\r\n\r\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\r\n const icon = 'assets/img/logo_filled_rounded.png';\r\n let title = obj.title || 'Telegram';\r\n let body = obj.description || '';\r\n let peerId: string;\r\n\r\n if(obj.custom) {\r\n if(obj.custom.channel_id) {\r\n peerId = '' + -obj.custom.channel_id;\r\n } else if(obj.custom.chat_id) {\r\n peerId = '' + -obj.custom.chat_id;\r\n } else {\r\n peerId = obj.custom.from_id || '';\r\n }\r\n }\r\n\r\n obj.custom.peerId = '' + peerId;\r\n let tag = 'peer' + peerId;\r\n\r\n if(settings && settings.nopreview) {\r\n title = 'Telegram';\r\n body = lang.push_message_nopreview || 'You have a new message';\r\n tag = 'unknown_peer';\r\n }\r\n\r\n log('show notify', title, body, icon, obj);\r\n\r\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\r\n action: 'mute1d',\r\n title: lang.push_action_mute1d || 'Mute for 24H'\r\n }/* , {\r\n action: 'push_settings',\r\n title: lang.push_action_settings || 'Settings'\r\n } */];\r\n\r\n const notificationPromise = ctx.registration.showNotification(title, {\r\n body,\r\n icon,\r\n tag,\r\n data: obj,\r\n actions\r\n });\r\n\r\n return notificationPromise.then((event) => {\r\n // @ts-ignore\r\n if(event && event.notification) {\r\n // @ts-ignore\r\n pushToNotifications(event.notification);\r\n }\r\n }).catch((error) => {\r\n log.error('Show notification promise', error);\r\n });\r\n}\r\n\r\nexport function onPing(task: ServiceWorkerPingTask, event: ExtendableMessageEvent) {\r\n const client = event.ports && event.ports[0] || event.source;\r\n const payload = task.payload;\r\n\r\n if(payload.localNotifications) {\r\n getter.set('push_last_alive', Date.now());\r\n }\r\n\r\n if(pendingNotification &&\r\n client &&\r\n 'postMessage' in client) {\r\n client.postMessage(pendingNotification, []);\r\n pendingNotification = undefined;\r\n }\r\n\r\n if(payload.lang) {\r\n getter.set('push_lang', payload.lang);\r\n }\r\n\r\n if(payload.settings) {\r\n getter.set('push_settings', payload.settings);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n \r\n \r\n \r\n//import CacheStorageController from '../cacheStorage';\r\nimport type { Modify, WorkerTaskTemplate, WorkerTaskVoidTemplate } from '../../types';\r\nimport type { InputFileLocation, InputWebFileLocation, UploadFile } from '../../layer';\r\nimport type { WebPushApiManager } from '../mtproto/webPushApiManager';\r\nimport type { PushNotificationObject } from './push';\r\nimport type { ToggleStorageTask } from '../mtproto/mtprotoworker';\r\nimport type { MyUploadFile } from '../mtproto/apiFileManager';\r\nimport { logger, LogTypes } from '../logger';\r\nimport { CancellablePromise } from '../../helpers/cancellablePromise';\r\nimport { CACHE_ASSETS_NAME, requestCache } from './cache';\r\nimport onStreamFetch from './stream';\r\nimport { closeAllNotifications, onPing } from './push';\r\nimport CacheStorageController from '../cacheStorage';\r\n\r\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nexport const deferredPromises: Map}> = new Map();\r\n\r\nexport interface RequestFilePartTask extends Modify {\r\n type: 'requestFilePart',\r\n payload: [number, InputFileLocation | InputWebFileLocation, number, number]\r\n};\r\n\r\nexport interface RequestFilePartTaskResponse extends Modify {\r\n type: 'requestFilePart',\r\n payload?: MyUploadFile,\r\n originalPayload?: RequestFilePartTask['payload']\r\n};\r\n\r\nexport interface ServiceWorkerPingTask extends WorkerTaskVoidTemplate {\r\n type: 'ping',\r\n payload: {\r\n localNotifications: boolean,\r\n lang: {\r\n push_action_mute1d: string\r\n push_action_settings: string\r\n push_message_nopreview: string\r\n },\r\n settings: WebPushApiManager['settings']\r\n }\r\n};\r\n\r\nexport interface ServiceWorkerNotificationsClearTask extends WorkerTaskVoidTemplate {\r\n type: 'notifications_clear'\r\n};\r\n\r\nexport interface ServiceWorkerPushClickTask extends WorkerTaskVoidTemplate {\r\n type: 'push_click',\r\n payload: PushNotificationObject\r\n};\r\n\r\nexport type ServiceWorkerTask = RequestFilePartTaskResponse | ServiceWorkerPingTask | ServiceWorkerNotificationsClearTask | ToggleStorageTask;\r\n\r\n \r\nconst taskListeners: {\r\n [type in ServiceWorkerTask['type']]: (task: any, event: ExtendableMessageEvent) => void\r\n} = {\r\n notifications_clear: () => {\r\n closeAllNotifications();\r\n },\r\n ping: (task: ServiceWorkerPingTask, event) => {\r\n onPing(task, event);\r\n },\r\n requestFilePart: (task: RequestFilePartTaskResponse, e: ExtendableMessageEvent) => {\r\n const windowClient = e.source as WindowClient;\r\n const promises = deferredPromises.get(windowClient.id);\r\n if(!promises) {\r\n return;\r\n }\r\n\r\n const promise = promises[task.id];\r\n if(promise) {\r\n if(task.error) {\r\n promise.reject(task.error);\r\n } else {\r\n promise.resolve(task.payload);\r\n }\r\n \r\n delete promises[task.id];\r\n }\r\n },\r\n toggleStorage: (task: ToggleStorageTask) => {\r\n CacheStorageController.toggleStorage(task.payload);\r\n }\r\n};\r\nctx.addEventListener('message', (e) => {\r\n const task = e.data as ServiceWorkerTask;\r\n const callback = taskListeners[task.type];\r\n if(callback) {\r\n callback(task, e);\r\n }\r\n});\r\n \r\n\r\n//const cacheStorage = new CacheStorageController('cachedAssets');\r\n/* let taskId = 0;\r\n\r\nexport function getTaskId() {\r\n return taskId;\r\n}\r\n\r\nexport function incrementTaskId() {\r\n return taskId++;\r\n} */\r\n\r\nconst onFetch = (event: FetchEvent): void => {\r\n if(event.request.url.indexOf(location.origin + '/') === 0 && event.request.url.match(/\\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\\?.*)?$/)) {\r\n return event.respondWith(requestCache(event));\r\n }\r\n\r\n try {\r\n const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\r\n\r\n //log.debug('[fetch]:', event);\r\n \r\n switch(scope) {\r\n case 'stream': {\r\n onStreamFetch(event, params);\r\n break;\r\n }\r\n }\r\n } catch(err) {\r\n event.respondWith(new Response('', {\r\n status: 500,\r\n statusText: 'Internal Server Error',\r\n }));\r\n }\r\n};\r\n\r\nconst onChangeState = () => {\r\n ctx.onfetch = onFetch;\r\n};\r\n\r\nctx.addEventListener('install', (event) => {\r\n log('installing');\r\n event.waitUntil(ctx.skipWaiting()); // Activate worker immediately\r\n});\r\n\r\nctx.addEventListener('activate', (event) => {\r\n log('activating', ctx);\r\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME));\r\n event.waitUntil(ctx.clients.claim());\r\n});\r\n\r\nctx.onerror = (error) => {\r\n log.error('error:', error);\r\n};\r\n\r\nctx.onunhandledrejection = (error) => {\r\n log.error('onunhandledrejection:', error);\r\n};\r\n\r\nctx.onoffline = ctx.ononline = onChangeState;\r\n\r\nonChangeState();\r\n","export default function timeout(delay: number): Promise {\r\n return new Promise(((resolve) => {\r\n setTimeout(() => {\r\n resolve(new Response('', {\r\n status: 408,\r\n statusText: 'Request timed out.',\r\n }));\r\n }, delay);\r\n }));\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/config/modes.ts","webpack:///./src/config/debug.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/environment/userAgent.ts","webpack:///./src/helpers/context.ts","webpack:///./src/lib/logger.ts","webpack:///./src/lib/serviceWorker/cache.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/helpers/blob.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/lib/filemanager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/lib/serviceWorker/stream.ts","webpack:///./src/helpers/schedulers/debounce.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/config/databases/state.ts","webpack:///./src/lib/idb.ts","webpack:///./src/helpers/object.ts","webpack:///./src/lib/serviceWorker/push.ts","webpack:///./src/lib/serviceWorker/index.service.ts","webpack:///./src/lib/serviceWorker/timeout.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","DEBUG","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","toLowerCase","vendor","platform","maxTouchPoints","MSStream","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","getWindowClients","clients","matchAll","includeUncontrolled","type","notifyServiceWorker","all","args","then","listeners","length","slice","forEach","listener","postMessage","notifyWorker","noop","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","_logTimer","Date","now","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","split","splitted","trim","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","black","red","green","yellow","blue","magenta","cyan","white","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","console","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","isCorrectResponse","response","ok","status","timeoutRace","promise","Promise","race","ms","resolve","setTimeout","reject","readBlobAs","blob","reader","FileReader","addEventListener","e","target","result","readBlobAsUint8Array","readBlobAsArrayBuffer","buffer","Uint8Array","blobConstruct","blobParts","mimeType","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","blobSupported","this","fileWriter","bytes","arr","write","saveFileCallback","part","push","truncate","finalize","saveToStorage","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","entryName","timeoutOperation","cache","delete","put","fileName","Response","headers","size","save","callback","rejected","timeout","undefined","res","err","clearTimeout","fakeWriter","getFakeFileWriter","saveFile","catch","enabled","map","storage","deleteAll","cacheStorage","setInterval","keys","requests","filtered","Map","timestamp","request","url","has","set","promises","id","ignoreSearch","ignoreVary","clientId","deferredPromises","find","client","taskId","streams","info","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","_resolve","_reject","debounce","alignedOffset","limit","fromPreload","task","payload","dcId","JSON","stringify","windowClient","deferred","uploadFile","add","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","addNotifyListener","finally","cancel","assign","deferredPromise","bytesPromise","saveChunkToCache","preloadChunks","getChunkKey","getFile","error","requestFilePartFromCache","requestFilePartFromWorker","offset","requestFilePart","end","preloadChunk","alignOffset","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","byteLength","base","version","stores","db","storeName","storageIsAvailable","fromObject","safeAssign","preserve","onclose","close","createNew","indexedDB","message","finished","onerror","onsuccess","event","calledNew","onabort","transaction","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","store","objectStoreNames","contains","os","createObjectStore","indexes","index","createIndex","indexName","keyPath","objectParameters","Array","isArray","concat","getObjectStore","objectStore","clear","idx","perf","performance","oncomplete","results","getAll","defaultBaseUrl","protocol","hostname","pathname","join","defaults","push_mute_until","push_last_alive","push_lang","push_settings","obj","data","json","hasActiveWindows","checksPromise","muteUntil","lastAliveTime","clientList","nowTime","userInvisibleIsSupported","badge","reason","closePromise","settings","lang","icon","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","nopreview","push_message_nopreview","actions","action","push_action_mute1d","registration","showNotification","notification","notifications","onCloseNotification","fireNotification","closeAllNotifications","waitUntil","pendingNotification","focus","openWindow","baseUrl","getNotifications","len","taskListeners","notifications_clear","ping","ports","source","localNotifications","onPing","toggleStorage","onFetch","origin","respondWith","file","fetch","clone","replace","random","requestCache","scope","params","exec","header","chunks","ranges","parseRange","parse","decodeURIComponent","stream","delay","requestRange","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onunhandledrejection","onoffline","ononline"],"mappings":"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","file":"sw.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false, //location.search.indexOf('http=1') > 0,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false\r\n};\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { pause } from \"../../helpers/schedulers/pause\";\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\r\n\r\nfunction isCorrectResponse(response: Response) {\r\n return response.ok && response.status === 200;\r\n}\r\n\r\nfunction timeoutRace>(promise: T) {\r\n return Promise.race([\r\n promise,\r\n pause(10000).then(() => Promise.reject())\r\n ]);\r\n}\r\n\r\nexport async function requestCache(event: FetchEvent) {\r\n try {\r\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\r\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\r\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\r\n \r\n if(file && isCorrectResponse(file)) {\r\n return file;\r\n }\r\n \r\n const headers: HeadersInit = {'Vary': '*'};\r\n let response = await fetch(event.request, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n } else if(response.status === 304) { // possible fix for 304 in Safari\r\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\r\n response = await fetch(url, {headers});\r\n if(isCorrectResponse(response)) {\r\n cache.put(event.request, response.clone());\r\n }\r\n }\r\n \r\n return response;\r\n } catch(err) {\r\n return fetch(event.request);\r\n }\r\n}\r\n","export const pause = (ms: number) => new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n});\r\n","/*\r\n * https://github.com/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 function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.addEventListener('loadend', (e) => resolve(e.target.result));\r\n reader[method](blob);\r\n });\r\n}\r\n\r\nexport function readBlobAsText(blob: Blob) {\r\n return readBlobAs(blob, 'readAsText');\r\n}\r\n\r\nexport function readBlobAsDataURL(blob: Blob) {\r\n return readBlobAs(blob, 'readAsDataURL');\r\n}\r\n\r\nexport function readBlobAsArrayBuffer(blob: Blob) {\r\n return readBlobAs(blob, 'readAsArrayBuffer');\r\n}\r\n\r\nexport function readBlobAsUint8Array(blob: Blob) {\r\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\r\n}\r\n\r\nexport function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\r\n let blob;\r\n const safeMimeType = blobSafeMimeType(mimeType);\r\n try {\r\n blob = new Blob(blobParts, {type: safeMimeType});\r\n } catch(e) {\r\n // @ts-ignore\r\n let bb = new BlobBuilder;\r\n blobParts.forEach((blobPart: any) => {\r\n bb.append(blobPart);\r\n });\r\n blob = bb.getBlob(safeMimeType);\r\n }\r\n return blob;\r\n}\r\n\r\n// https://www.iana.org/assignments/media-types/media-types.xhtml\r\nexport function blobSafeMimeType(mimeType: string) {\r\n if([\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/gif',\r\n 'image/webp',\r\n 'image/bmp',\r\n 'video/mp4',\r\n 'video/webm',\r\n 'video/quicktime',\r\n 'audio/ogg',\r\n 'audio/mpeg',\r\n 'audio/mp4',\r\n 'application/json',\r\n 'application/pdf'\r\n ].indexOf(mimeType) === -1) {\r\n return 'application/octet-stream';\r\n }\r\n\r\n return mimeType;\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 * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { blobConstruct, readBlobAsUint8Array } from \"../helpers/blob\";\r\n\r\nexport class FileManager {\r\n public blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport FileManager from './filemanager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { readBlobAsUint8Array } from \"../../helpers/blob\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { getWindowClients } from \"../../helpers/context\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { InputFileLocation, UploadFile } from \"../../layer\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport { RequestFilePartTask, deferredPromises, log } from \"./index.service\";\r\nimport timeout from \"./timeout\";\r\n\r\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\r\nconst CHUNK_TTL = 86400;\r\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\r\n\r\nconst clearOldChunks = () => {\r\n return cacheStorage.timeoutOperation((cache) => {\r\n return cache.keys().then(requests => {\r\n const filtered: Map = new Map();\r\n const timestamp = Date.now() / 1000 | 0;\r\n for(const request of requests) {\r\n const match = request.url.match(/\\/(\\d+?)\\?/);\r\n if(match && !filtered.has(match[1])) {\r\n filtered.set(match[1], request);\r\n }\r\n }\r\n\r\n const promises: Promise[] = [];\r\n for(const [id, request] of filtered) {\r\n const promise = cache.match(request).then((response) => {\r\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\r\n log('will delete stream chunk:', id);\r\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\r\n }\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n return Promise.all(promises);\r\n });\r\n });\r\n};\r\n\r\nsetInterval(clearOldChunks, 1800e3);\r\nsetInterval(() => {\r\n getWindowClients().then((clients) => {\r\n for(const [clientId, promises] of deferredPromises) {\r\n if(!clients.find(client => client.id === clientId)) {\r\n for(const taskId in promises) {\r\n const promise = promises[taskId];\r\n promise.reject();\r\n }\r\n\r\n deferredPromises.delete(clientId);\r\n }\r\n }\r\n });\r\n}, 120e3);\r\n\r\ntype StreamRange = [number, number];\r\ntype StreamId = DocId;\r\nconst streams: Map = new Map();\r\nclass Stream {\r\n private destroyDebounced: () => void;\r\n private id: StreamId;\r\n private limitPart: number;\r\n private loadedOffsets: Set = new Set();\r\n\r\n constructor(private info: DownloadOptions) {\r\n this.id = Stream.getId(info);\r\n streams.set(this.id, this);\r\n\r\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\r\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\r\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\r\n }\r\n\r\n private destroy = () => {\r\n streams.delete(this.id);\r\n };\r\n\r\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\r\n const task: Omit = {\r\n type: 'requestFilePart',\r\n payload: [this.info.dcId, this.info.location, alignedOffset, limit]\r\n };\r\n\r\n const taskId = JSON.stringify(task);\r\n (task as RequestFilePartTask).id = taskId;\r\n\r\n const windowClient = await getWindowClients().then((clients) => {\r\n if(!clients.length) {\r\n return;\r\n }\r\n\r\n return clients.find(client => deferredPromises.has(client.id)) || clients[0];\r\n });\r\n\r\n if(!windowClient) {\r\n throw new Error('no window');\r\n }\r\n\r\n let promises = deferredPromises.get(windowClient.id);\r\n if(!promises) {\r\n deferredPromises.set(windowClient.id, promises = {});\r\n }\r\n \r\n let deferred = promises[taskId] as CancellablePromise;\r\n if(deferred) {\r\n return deferred.then(uploadFile => uploadFile.bytes);\r\n }\r\n \r\n windowClient.postMessage(task);\r\n this.loadedOffsets.add(alignedOffset);\r\n \r\n deferred = promises[taskId] = deferredPromise();\r\n const bytesPromise = deferred.then(uploadFile => uploadFile.bytes);\r\n\r\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\r\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\r\n\r\n return bytesPromise;\r\n }\r\n\r\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n return cacheStorage.getFile(key).then((blob: Blob) => {\r\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\r\n }, (error) => {\r\n if(error === 'NO_ENTRY_FOUND') {\r\n return;\r\n }\r\n });\r\n }\r\n\r\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\r\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then(bytes => {\r\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\r\n });\r\n }\r\n\r\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\r\n return deferred.then(bytes => {\r\n const key = this.getChunkKey(alignedOffset, limit);\r\n const response = new Response(bytes, {\r\n headers: {\r\n 'Content-Length': '' + bytes.length,\r\n 'Content-Type': 'application/octet-stream',\r\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\r\n }\r\n });\r\n\r\n return cacheStorage.save(key, response);\r\n });\r\n }\r\n\r\n private preloadChunk(offset: number) {\r\n if(this.loadedOffsets.has(offset)) {\r\n return;\r\n }\r\n\r\n this.loadedOffsets.add(offset);\r\n this.requestFilePart(offset, this.limitPart, true);\r\n }\r\n\r\n private preloadChunks(offset: number, end: number) {\r\n if(end > this.info.size) {\r\n end = this.info.size;\r\n }\r\n\r\n if(!offset) { // load last chunk for bounds\r\n this.preloadChunk(alignOffset(offset, this.limitPart));\r\n } else { // don't preload next chunks before the start\r\n for(; offset < end; offset += this.limitPart) {\r\n this.preloadChunk(offset);\r\n }\r\n }\r\n }\r\n\r\n public requestRange(range: StreamRange) {\r\n this.destroyDebounced();\r\n\r\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\r\n if(possibleResponse) {\r\n return possibleResponse;\r\n }\r\n\r\n let [offset, end] = range;\r\n\r\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\r\n //end = info.size - 1;\r\n //offset = info.size - 1 - limitPart;\r\n offset = info.size - (info.size % limitPart);\r\n } */\r\n\r\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\r\n const alignedOffset = alignOffset(offset, limit);\r\n\r\n if(!end) {\r\n end = Math.min(offset + limit, this.info.size - 1);\r\n }\r\n\r\n return this.requestFilePart(alignedOffset, limit).then(ab => {\r\n //log.debug('[stream] requestFilePart result:', result);\r\n\r\n // if(isSafari) {\r\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\r\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\r\n }\r\n \r\n const headers: Record = {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\r\n 'Content-Length': `${ab.byteLength}`\r\n };\r\n\r\n if(this.info.mimeType) {\r\n headers['Content-Type'] = this.info.mimeType;\r\n }\r\n\r\n // simulate slow connection\r\n //setTimeout(() => {\r\n return new Response(ab, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers,\r\n });\r\n //}, 2.5e3);\r\n });\r\n }\r\n\r\n private getChunkKey(alignedOffset: number, limit: number) {\r\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\r\n }\r\n\r\n public static get(info: DownloadOptions) {\r\n return streams.get(this.getId(info)) ?? new Stream(info);\r\n }\r\n\r\n private static getId(info: DownloadOptions) {\r\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\r\n }\r\n}\r\n\r\nexport default function onStreamFetch(event: FetchEvent, params: string) {\r\n const range = parseRange(event.request.headers.get('Range'));\r\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\r\n const stream = Stream.get(info);\r\n\r\n //log.debug('[stream]', url, offset, end);\r\n\r\n event.respondWith(Promise.race([\r\n timeout(45 * 1000),\r\n stream.requestRange(range)\r\n ]));\r\n}\r\n\r\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\r\n if(range[0] === 0 && range[1] === 1) {\r\n return new Response(new Uint8Array(2).buffer, {\r\n status: 206,\r\n statusText: 'Partial Content',\r\n headers: {\r\n 'Accept-Ranges': 'bytes',\r\n 'Content-Range': `bytes 0-1/${size || '*'}`,\r\n 'Content-Length': '2',\r\n 'Content-Type': mimeType || 'video/mp4',\r\n },\r\n });\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\r\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\r\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\r\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\r\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\r\n\r\nfunction parseRange(header: string): StreamRange {\r\n if(!header) return [0, 0];\r\n const [, chunks] = header.split('=');\r\n const ranges = chunks.split(', ');\r\n const [offset, end] = ranges[0].split('-');\r\n\r\n return [+offset, +end || 0];\r\n}\r\n\r\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\r\n return offset - (offset % base);\r\n}\r\n\r\nfunction alignLimit(limit: number) {\r\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyFunction, Awaited } from \"../../types\";\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) {\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 return (...args: Parameters): typeof waitingPromise => {\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 // @ts-ignore\r\n resolve(fn(...args));\r\n hadNewCall = false;\r\n }\r\n\r\n waitingTimeout = setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n }\r\n\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }, ms) as any;\r\n\r\n waitingPromise.catch(() => {});\r\n return waitingPromise;\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '.';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport { safeAssign } from '../helpers/object';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.forEach(storage => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map(name => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map(storage => storage.name)));\r\n const promises = dbNames.map(dbName => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[]) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct([blob]) as Blob;\r\n }\r\n\r\n return this.save(fileName, blob);\r\n }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function copy(obj: T): T {\r\n //in case of premitives\r\n if(obj === null || typeof(obj) !== \"object\") {\r\n return obj;\r\n }\r\n \r\n //date objects should be \r\n if(obj instanceof Date) {\r\n return new Date(obj.getTime()) as any;\r\n }\r\n \r\n //handle Array\r\n if(Array.isArray(obj)) {\r\n // @ts-ignore\r\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\r\n return clonedArr;\r\n }\r\n \r\n //lastly, handle objects\r\n // @ts-ignore\r\n let clonedObj = new obj.constructor();\r\n for(var prop in obj){\r\n if(obj.hasOwnProperty(prop)) {\r\n clonedObj[prop] = copy(obj[prop]);\r\n }\r\n }\r\n return clonedObj;\r\n}\r\n\r\nexport function deepEqual(x: any, y: any): boolean {\r\n const ok = Object.keys, tx = typeof x, ty = typeof y;\r\n return x && y && tx === 'object' && tx === ty ? (\r\n ok(x).length === ok(y).length &&\r\n ok(x).every(key => deepEqual(x[key], y[key]))\r\n ) : (x === y);\r\n}\r\n\r\nexport function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\r\n //const perf = performance.now();\r\n const props = {writable: true, configurable: true};\r\n const out: {[name in keyof T]?: typeof props} = {};\r\n names.forEach(name => {\r\n if(!obj.hasOwnProperty(name)) {\r\n out[name] = props;\r\n }\r\n });\r\n Object.defineProperties(obj, out);\r\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\r\n}\r\n\r\nexport function getObjectKeysAndSort(object: {[key: string]: any}, sort: 'asc' | 'desc' = 'asc') {\r\n if(!object) return [];\r\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map(i => +i);\r\n if(sort === 'asc') return ids.sort((a, b) => a - b);\r\n else return ids.sort((a, b) => b - a);\r\n}\r\n\r\nexport function safeReplaceObject(wasObject: any, newObject: any) {\r\n if(!wasObject) {\r\n return newObject;\r\n }\r\n\r\n for(var key in wasObject) {\r\n if(!newObject.hasOwnProperty(key)) {\r\n delete wasObject[key];\r\n }\r\n }\r\n\r\n for(var key in newObject) {\r\n //if (newObject.hasOwnProperty(key)) { // useless\r\n wasObject[key] = newObject[key];\r\n //}\r\n }\r\n \r\n return wasObject;\r\n}\r\n\r\n/**\r\n * Will be used for FILE_REFERENCE_EXPIRED\r\n * @param key \r\n * @param wasObject \r\n * @param newObject \r\n */\r\nexport function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\r\n if('byteLength' in newObject[key]) { // Uint8Array\r\n newObject[key] = [...newObject[key]];\r\n }\r\n\r\n if(wasObject && wasObject[key] !== newObject[key]) {\r\n wasObject[key].length = newObject[key].length;\r\n (newObject[key] as any[]).forEach((v, i) => {\r\n wasObject[key][i] = v;\r\n });\r\n\r\n /* wasObject[key].set(newObject[key]); */\r\n newObject[key] = wasObject[key];\r\n }\r\n}\r\n\r\nexport function isObject>(object: any): object is T {\r\n return typeof(object) === 'object' && object !== null;\r\n}\r\n\r\nexport function getDeepProperty(object: any, key: string) {\r\n const splitted = key.split('.');\r\n let o: any = object;\r\n splitted.forEach(key => {\r\n if(!key) {\r\n return;\r\n }\r\n \r\n // @ts-ignore\r\n o = o[key];\r\n });\r\n \r\n return o;\r\n}\r\n\r\nexport function setDeepProperty(object: any, key: string, value: any) {\r\n const splitted = key.split('.');\r\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\r\n}\r\n\r\nexport function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\r\n for(const key in initObject) {\r\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\r\n currentObject[key] = copy(initObject[key]);\r\n onReplace && onReplace(previousKey || key);\r\n } else if(isObject(initObject[key])) {\r\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\r\n }\r\n }\r\n}\r\n\r\nexport function safeAssign(object: T, fromObject: any) {\r\n if(fromObject) {\r\n for(let i in fromObject) {\r\n if(fromObject[i] !== undefined) {\r\n // @ts-ignore\r\n object[i] = fromObject[i];\r\n }\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from \"../../config/databases\";\r\nimport DATABASE_STATE from \"../../config/databases/state\";\r\nimport { IS_FIREFOX } from \"../../environment/userAgent\";\r\nimport IDBStorage from \"../idb\";\r\nimport { log, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"./index.service\";\r\n\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\r\n\r\nexport type PushNotificationObject = {\r\n loc_key: string,\r\n loc_args: string[],\r\n //user_id: number, // should be number\r\n custom: {\r\n channel_id?: string, // should be number\r\n chat_id?: string, // should be number\r\n from_id?: string, // should be number\r\n msg_id: string,\r\n peerId?: string // should be number\r\n },\r\n sound?: string,\r\n random_id: number,\r\n badge?: string, // should be number\r\n description: string,\r\n mute: string, // should be number\r\n title: string,\r\n\r\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\r\n};\r\n\r\nclass SomethingGetter, Storage extends Record> {\r\n private cache: Partial = {};\r\n private storage: IDBStorage;\r\n\r\n constructor(\r\n db: T, \r\n storeName: typeof db['stores'][number]['name'], \r\n private defaults: {\r\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\r\n }\r\n ) {\r\n this.storage = new IDBStorage(db, storeName);\r\n }\r\n\r\n public async get(key: T) {\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n let value: Storage[T];\r\n try {\r\n value = await this.storage.get(key as string);\r\n } catch(err) {\r\n\r\n }\r\n\r\n if(this.cache[key] !== undefined) {\r\n return this.cache[key];\r\n }\r\n\r\n if(value === undefined) {\r\n const callback = this.defaults[key];\r\n value = typeof(callback) === 'function' ? callback() : callback;\r\n }\r\n\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async set(key: T, value: Storage[T]) {\r\n this.cache[key] = value;\r\n\r\n try {\r\n this.storage.save(key as string, value);\r\n } catch(err) {\r\n\r\n }\r\n }\r\n}\r\n\r\ntype PushStorage = {\r\n push_mute_until: number,\r\n push_last_alive: number,\r\n push_lang: Partial\r\n push_settings: Partial\r\n};\r\n\r\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', {\r\n push_mute_until: 0,\r\n push_last_alive: 0,\r\n push_lang: {},\r\n push_settings: {}\r\n});\r\n\r\nctx.addEventListener('push', (event) => {\r\n const obj: PushNotificationObject = event.data.json();\r\n log('push', obj);\r\n\r\n let hasActiveWindows = false;\r\n const checksPromise = Promise.all([\r\n getter.get('push_mute_until'), \r\n getter.get('push_last_alive'), \r\n ctx.clients.matchAll({type: 'window'})\r\n ]).then((result) => {\r\n const [muteUntil, lastAliveTime, clientList] = result;\r\n \r\n log('matched clients', clientList);\r\n hasActiveWindows = clientList.length > 0;\r\n if(hasActiveWindows) {\r\n throw 'Supress notification because some instance is alive';\r\n }\r\n \r\n const nowTime = Date.now();\r\n if(userInvisibleIsSupported() &&\r\n muteUntil &&\r\n nowTime < muteUntil) {\r\n throw `Supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\r\n }\r\n\r\n if(!obj.badge) {\r\n throw 'No badge?';\r\n }\r\n });\r\n\r\n checksPromise.catch(reason => {\r\n log(reason);\r\n });\r\n\r\n const notificationPromise = checksPromise.then(() => {\r\n return Promise.all([getter.get('push_settings'), getter.get('push_lang')])\r\n }).then((result) => {\r\n return fireNotification(obj, result[0], result[1]);\r\n });\r\n\r\n const closePromise = notificationPromise.catch(() => {\r\n log('Closing all notifications on push', hasActiveWindows);\r\n if(userInvisibleIsSupported() || hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n return ctx.registration.showNotification('Telegram', {\r\n tag: 'unknown_peer'\r\n }).then(() => {\r\n if(hasActiveWindows) {\r\n return closeAllNotifications();\r\n }\r\n\r\n setTimeout(() => closeAllNotifications(), hasActiveWindows ? 0 : 100);\r\n }).catch((error) => {\r\n log.error('Show notification error', error);\r\n });\r\n });\r\n\r\n event.waitUntil(closePromise);\r\n});\r\n\r\nctx.addEventListener('notificationclick', (event) => {\r\n const notification = event.notification;\r\n log('On notification click: ', notification.tag);\r\n notification.close();\r\n\r\n const action = event.action as PushNotificationObject['action'];\r\n if(action === 'mute1d' && userInvisibleIsSupported()) {\r\n log('[SW] mute for 1d');\r\n getter.set('push_mute_until', Date.now() + 86400e3);\r\n return;\r\n }\r\n\r\n const data: PushNotificationObject = notification.data;\r\n if(!data) {\r\n return;\r\n }\r\n\r\n const promise = ctx.clients.matchAll({\r\n type: 'window'\r\n }).then((clientList) => {\r\n data.action = action;\r\n pendingNotification = {type: 'push_click', payload: data};\r\n for(let i = 0; i < clientList.length; i++) {\r\n const client = clientList[i];\r\n if('focus' in client) {\r\n client.focus();\r\n client.postMessage(pendingNotification);\r\n pendingNotification = undefined;\r\n return;\r\n }\r\n }\r\n\r\n if(ctx.clients.openWindow) {\r\n return getter.get('push_settings').then((settings) => {\r\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\r\n });\r\n }\r\n }).catch((error) => {\r\n log.error('Clients.matchAll error', error);\r\n })\r\n\r\n event.waitUntil(promise);\r\n});\r\n\r\nctx.addEventListener('notificationclose', onCloseNotification);\r\n\r\nlet notifications: Set = new Set();\r\nlet pendingNotification: ServiceWorkerPushClickTask;\r\nfunction pushToNotifications(notification: Notification) {\r\n if(!notifications.has(notification)) {\r\n notifications.add(notification);\r\n // @ts-ignore\r\n notification.onclose = onCloseNotification;\r\n }\r\n}\r\n\r\nfunction onCloseNotification(event: NotificationEvent) {\r\n removeFromNotifications(event.notification)\r\n}\r\n\r\nfunction removeFromNotifications(notification: Notification) {\r\n notifications.delete(notification);\r\n}\r\n\r\nexport function closeAllNotifications() {\r\n for(const notification of notifications) {\r\n try {\r\n notification.close();\r\n } catch(e) {}\r\n }\r\n\r\n let promise: Promise;\r\n if('getNotifications' in ctx.registration) {\r\n promise = ctx.registration.getNotifications({}).then((notifications) => {\r\n for(let i = 0, len = notifications.length; i < len; ++i) {\r\n try {\r\n notifications[i].close();\r\n } catch(e) {}\r\n }\r\n }).catch((error) => {\r\n log.error('Offline register SW error', error);\r\n });\r\n } else {\r\n promise = Promise.resolve();\r\n }\r\n\r\n notifications.clear();\r\n\r\n return promise;\r\n}\r\n\r\nfunction userInvisibleIsSupported() {\r\n return IS_FIREFOX;\r\n}\r\n\r\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\r\n const icon = 'assets/img/logo_filled_rounded.png';\r\n let title = obj.title || 'Telegram';\r\n let body = obj.description || '';\r\n let peerId: string;\r\n\r\n if(obj.custom) {\r\n if(obj.custom.channel_id) {\r\n peerId = '' + -obj.custom.channel_id;\r\n } else if(obj.custom.chat_id) {\r\n peerId = '' + -obj.custom.chat_id;\r\n } else {\r\n peerId = obj.custom.from_id || '';\r\n }\r\n }\r\n\r\n obj.custom.peerId = '' + peerId;\r\n let tag = 'peer' + peerId;\r\n\r\n if(settings && settings.nopreview) {\r\n title = 'Telegram';\r\n body = lang.push_message_nopreview || 'You have a new message';\r\n tag = 'unknown_peer';\r\n }\r\n\r\n log('show notify', title, body, icon, obj);\r\n\r\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\r\n action: 'mute1d',\r\n title: lang.push_action_mute1d || 'Mute for 24H'\r\n }/* , {\r\n action: 'push_settings',\r\n title: lang.push_action_settings || 'Settings'\r\n } */];\r\n\r\n const notificationPromise = ctx.registration.showNotification(title, {\r\n body,\r\n icon,\r\n tag,\r\n data: obj,\r\n actions\r\n });\r\n\r\n return notificationPromise.then((event) => {\r\n // @ts-ignore\r\n if(event && event.notification) {\r\n // @ts-ignore\r\n pushToNotifications(event.notification);\r\n }\r\n }).catch((error) => {\r\n log.error('Show notification promise', error);\r\n });\r\n}\r\n\r\nexport function onPing(task: ServiceWorkerPingTask, event: ExtendableMessageEvent) {\r\n const client = event.ports && event.ports[0] || event.source;\r\n const payload = task.payload;\r\n\r\n if(payload.localNotifications) {\r\n getter.set('push_last_alive', Date.now());\r\n }\r\n\r\n if(pendingNotification &&\r\n client &&\r\n 'postMessage' in client) {\r\n client.postMessage(pendingNotification, []);\r\n pendingNotification = undefined;\r\n }\r\n\r\n if(payload.lang) {\r\n getter.set('push_lang', payload.lang);\r\n }\r\n\r\n if(payload.settings) {\r\n getter.set('push_settings', payload.settings);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n \r\n \r\n \r\n//import CacheStorageController from '../cacheStorage';\r\nimport type { Modify, WorkerTaskTemplate, WorkerTaskVoidTemplate } from '../../types';\r\nimport type { InputFileLocation, InputWebFileLocation, UploadFile } from '../../layer';\r\nimport type { WebPushApiManager } from '../mtproto/webPushApiManager';\r\nimport type { PushNotificationObject } from './push';\r\nimport type { ToggleStorageTask } from '../mtproto/mtprotoworker';\r\nimport type { MyUploadFile } from '../mtproto/apiFileManager';\r\nimport { logger, LogTypes } from '../logger';\r\nimport { CancellablePromise } from '../../helpers/cancellablePromise';\r\nimport { CACHE_ASSETS_NAME, requestCache } from './cache';\r\nimport onStreamFetch from './stream';\r\nimport { closeAllNotifications, onPing } from './push';\r\nimport CacheStorageController from '../cacheStorage';\r\n\r\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\r\nconst ctx = self as any as ServiceWorkerGlobalScope;\r\nexport const deferredPromises: Map}> = new Map();\r\n\r\nexport interface RequestFilePartTask extends Modify {\r\n type: 'requestFilePart',\r\n payload: [number, InputFileLocation | InputWebFileLocation, number, number]\r\n};\r\n\r\nexport interface RequestFilePartTaskResponse extends Modify {\r\n type: 'requestFilePart',\r\n payload?: MyUploadFile,\r\n originalPayload?: RequestFilePartTask['payload']\r\n};\r\n\r\nexport interface ServiceWorkerPingTask extends WorkerTaskVoidTemplate {\r\n type: 'ping',\r\n payload: {\r\n localNotifications: boolean,\r\n lang: {\r\n push_action_mute1d: string\r\n push_action_settings: string\r\n push_message_nopreview: string\r\n },\r\n settings: WebPushApiManager['settings']\r\n }\r\n};\r\n\r\nexport interface ServiceWorkerNotificationsClearTask extends WorkerTaskVoidTemplate {\r\n type: 'notifications_clear'\r\n};\r\n\r\nexport interface ServiceWorkerPushClickTask extends WorkerTaskVoidTemplate {\r\n type: 'push_click',\r\n payload: PushNotificationObject\r\n};\r\n\r\nexport type ServiceWorkerTask = RequestFilePartTaskResponse | ServiceWorkerPingTask | ServiceWorkerNotificationsClearTask | ToggleStorageTask;\r\n\r\n \r\nconst taskListeners: {\r\n [type in ServiceWorkerTask['type']]: (task: any, event: ExtendableMessageEvent) => void\r\n} = {\r\n notifications_clear: () => {\r\n closeAllNotifications();\r\n },\r\n ping: (task: ServiceWorkerPingTask, event) => {\r\n onPing(task, event);\r\n },\r\n requestFilePart: (task: RequestFilePartTaskResponse, e: ExtendableMessageEvent) => {\r\n const windowClient = e.source as WindowClient;\r\n const promises = deferredPromises.get(windowClient.id);\r\n if(!promises) {\r\n return;\r\n }\r\n\r\n const promise = promises[task.id];\r\n if(promise) {\r\n if(task.error) {\r\n promise.reject(task.error);\r\n } else {\r\n promise.resolve(task.payload);\r\n }\r\n \r\n delete promises[task.id];\r\n }\r\n },\r\n toggleStorage: (task: ToggleStorageTask) => {\r\n CacheStorageController.toggleStorage(task.payload);\r\n }\r\n};\r\nctx.addEventListener('message', (e) => {\r\n const task = e.data as ServiceWorkerTask;\r\n const callback = taskListeners[task.type];\r\n if(callback) {\r\n callback(task, e);\r\n }\r\n});\r\n \r\n\r\n//const cacheStorage = new CacheStorageController('cachedAssets');\r\n/* let taskId = 0;\r\n\r\nexport function getTaskId() {\r\n return taskId;\r\n}\r\n\r\nexport function incrementTaskId() {\r\n return taskId++;\r\n} */\r\n\r\nconst onFetch = (event: FetchEvent): void => {\r\n if(event.request.url.indexOf(location.origin + '/') === 0 && event.request.url.match(/\\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\\?.*)?$/)) {\r\n return event.respondWith(requestCache(event));\r\n }\r\n\r\n try {\r\n const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\r\n\r\n //log.debug('[fetch]:', event);\r\n \r\n switch(scope) {\r\n case 'stream': {\r\n onStreamFetch(event, params);\r\n break;\r\n }\r\n }\r\n } catch(err) {\r\n event.respondWith(new Response('', {\r\n status: 500,\r\n statusText: 'Internal Server Error',\r\n }));\r\n }\r\n};\r\n\r\nconst onChangeState = () => {\r\n ctx.onfetch = onFetch;\r\n};\r\n\r\nctx.addEventListener('install', (event) => {\r\n log('installing');\r\n event.waitUntil(ctx.skipWaiting()); // Activate worker immediately\r\n});\r\n\r\nctx.addEventListener('activate', (event) => {\r\n log('activating', ctx);\r\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME));\r\n event.waitUntil(ctx.clients.claim());\r\n});\r\n\r\nctx.onerror = (error) => {\r\n log.error('error:', error);\r\n};\r\n\r\nctx.onunhandledrejection = (error) => {\r\n log.error('onunhandledrejection:', error);\r\n};\r\n\r\nctx.onoffline = ctx.ononline = onChangeState;\r\n\r\nonChangeState();\r\n","export default function timeout(delay: number): Promise {\r\n return new Promise(((resolve) => {\r\n setTimeout(() => {\r\n resolve(new Response('', {\r\n status: 408,\r\n statusText: 'Request timed out.',\r\n }));\r\n }, delay);\r\n }));\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/webp.worker.bd598dc02a03fd59d71a.bundle.worker.js b/public/webp.worker.b00d941ab33d112bf66c.bundle.worker.js similarity index 99% rename from public/webp.worker.bd598dc02a03fd59d71a.bundle.worker.js rename to public/webp.worker.b00d941ab33d112bf66c.bundle.worker.js index a88db7c01..e40851da7 100644 --- a/public/webp.worker.bd598dc02a03fd59d71a.bundle.worker.js +++ b/public/webp.worker.b00d941ab33d112bf66c.bundle.worker.js @@ -1,3 +1,3 @@ !function(t){var e={};function a(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.m=t,a.c=e,a.d=function(t,e,n){a.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},a.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},a.t=function(t,e){if(1&e&&(t=a(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)a.d(n,r,function(e){return t[e]}.bind(null,r));return n},a.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return a.d(e,"a",e),e},a.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},a.p="",a(a.s=1)}([function(t,e,a){"use strict";!function(t){if(t.TextEncoder&&t.TextDecoder)return!1;function e(t="utf-8"){if("utf-8"!==t)throw new RangeError(`Failed to construct 'TextEncoder': The encoding label provided ('${t}') is invalid.`)}function a(t="utf-8",e={fatal:!1}){if("utf-8"!==t)throw new RangeError(`Failed to construct 'TextDecoder': The encoding label provided ('${t}') is invalid.`);if(e.fatal)throw new Error("Failed to construct 'TextDecoder': the 'fatal' option is unsupported.")}Object.defineProperty(e.prototype,"encoding",{value:"utf-8"}),e.prototype.encode=function(t,e={stream:!1}){if(e.stream)throw new Error("Failed to encode: the 'stream' option is unsupported.");let a=0;const n=t.length;let r=0,i=Math.max(32,n+(n>>1)+7),s=new Uint8Array(i>>3<<3);for(;a=55296&&e<=56319){if(a=55296&&e<=56319)continue}if(r+4>s.length){i+=8,i*=1+a/t.length*2,i=i>>3<<3;const e=new Uint8Array(i);e.set(s),s=e}if(0!=(4294967168&e)){if(0==(4294965248&e))s[r++]=e>>6&31|192;else if(0==(4294901760&e))s[r++]=e>>12&15|224,s[r++]=e>>6&63|128;else{if(0!=(4292870144&e))continue;s[r++]=e>>18&7|240,s[r++]=e>>12&63|128,s[r++]=e>>6&63|128}s[r++]=63&e|128}else s[r++]=e}return s.slice(0,r)},Object.defineProperty(a.prototype,"encoding",{value:"utf-8"}),Object.defineProperty(a.prototype,"fatal",{value:!1}),Object.defineProperty(a.prototype,"ignoreBOM",{value:!1}),a.prototype.decode=function(t,e={stream:!1}){if(e.stream)throw new Error("Failed to decode: the 'stream' option is unsupported.");const a=new Uint8Array(t);let n=0;const r=a.length,i=[];for(;n65535&&(e-=65536,i.push(e>>>10&1023|55296),e=56320|1023&e),i.push(e)}}return String.fromCharCode.apply(null,i)},t.TextEncoder=e,t.TextDecoder=a}("undefined"!=typeof window?window:"undefined"!=typeof self?self:this)},function(t,e,a){"use strict";let n,r;a.r(e);const i=null;function s(t){return JSON.parse(JSON.stringify(t))}function o(t,e,a,r,i){for(n=0;n=0;--a)e=s(_(t[a],e));return e}function p(t){if(!t)throw Error("assert :P")}const g=function(){function t(t){return t==Be||t==Le||t==Ce||t==Fe}function e(t){return m(t,1)}function a(t,e){const a=1+((t.la-1)*e>>8),n=a<<8;let r=0;for(t.Z>=n?(r=1,t.la-=a,t.Z-=n):(r=0,t.la=a);t.la<128;)t.Z<<=1,t.la<<=1,8==++t.gc&&(t.gc=0,t.bc&&(t.Z+=t.qa[t.Ia++],t.bc--));return r}function g(t,e,a,n){(n-=a)>=2?(t.Z=e[a+0]<<8|e[a+1],t.qa=e,t.Ia=a+2,t.bc=n-2):(t.Z=0,t.qa=i,t.bc=0),t.la=255,t.gc=0}function m(t,e){var n=0,r=0;for(r=e-1;r>=0;r--)n|=a(t,128)<=8&&t.Q>>=8,t.T+=t.qa[t.Ia+t.Q]<<24>>>0,++t.Q,t.g-=8}function A(t){t.g>=8&&y(t),t.Q==t.ya&&32==t.g&&(t.L=1)}function E(t,e){let a=0;if(p(e>=0),!t.L&&e=32&&(t.L=1,t.g+e>32))return a;a=t.T>>t.g&sa[e],t.g+=e,t.g>=8&&t.g>=8&&y(t)}else t.fa=1;return a}function R(t){return t.Pa==t.gb}function U(t,e){return p(t!=i),0==e?0:(t.gb=2*e-1,t.Y=b(t.gb,Pa),t.Y==i?0:(t.Y[0].s=-1,t.Pa=1))}function x(t){t!=i&&(t.Y=i,t.Y=i,t.gb=0,t.Pa=0)}function T(t,e,a,n){for(var r=t.Y,i=0,s=+t.gb;n-- >0;){if(i>=s)return 0;if(r[i].s<0){if(R(t))return 0;const e=t,a=e.Y,n=+e.Pa;r[i].s=n-i,e.Pa+=2,a[n+0].s=-1,a[n+1].s=-1}else if(0==r[i].s)return 0;i+=r[i].s+(a>>n&1)}if(r[i].s<0)r[i].s=0;else if(0!=r[i].s)return 0;return r[i].kc=e,1}function S(t,e,a){var n=0;let r=0,s=0;for(p(t!=i),p(e!=i),n=0;n0&&(++r,s=n);if(!U(t,r))return 0;if(1==r)return s<0||s>=a?(x(t),0):T(t,s,0,0);if(r=0,s=_(a,0),s==i)return(r=r&&R(t))||x(t),r;var o=0;o=0,n=_(wa+1,0);let l=0;const f=_(wa+1,0);let h=0;for(p(e!=i),p(a>0),p(s!=i),o=0;oh&&(h=e[o]);if(h>wa)n=0;else{for(o=0;o0?f[e[o]]++:La;n=1}if(!n)return(r=r&&R(t))||x(t),r;for(n=0;n0&&!T(t,n,s[n],e[n]))return(r=r&&R(t))||x(t),r;return(r=R(t))||x(t),r}function z(t,e,a,n,r,i,s){var o=0;for(o=0;ot.P.v)&&(a=0==e)){t:{let e=t.Ga;var r=t.G,l=t.ub;a=t.P.l;let u=t.P.v;const b=t.Xb;var f=[i];let w=i,g=u*a;var h=i,c=i;c="WEBP_FILTER_TYPE";let m=0;f=0;var d=0;let v=0;if(p(a>0&&u>0&&n>=a),p(e!=i&&b!=i),l<=Ea)a=0;else if(v=e[r+0]>>0&3,c=e[r+0]>>2&3,m=e[r+0]>>4&3,f=e[r+0]>>6&3,vUa||c>=Un||m>xa||0!=f)a=0;else{if(v==Ra)d=l>=g,f=e,w=r+Ea;else{if(f=_(g,0),w=0,f==i){a=0;break t}d=r+Ea,l=l-Ea,r=f,h=s(ta);let t=0;const n=jt();n==i?d=0:(n.l=a,n.v=u,n.N=h,ct(Te),h.put=ge,h.Mb=pe,h.Pb=me,h.ka=i,h.ka=r,h.fd=0,h.width=a,h.height=u,n.a=He,k(n.o,e,d,l),n.Wa=vn,Kt(a,u,1,n,i)&&Yt(n,a)&&(n.Wa=mn,t=Vt(n,n.V,n.Ha,n.l,n.v,qt)),n!=i&&Gt(n),d=t)}if(d){for(e=xn[c],e!=i?((h=_(g,0))==i&&(d=0,v!=Ra&&(w=f=i)),e(f,w,a,u,1,a,h,c=0),g=h,v=c):(g=f,v=w),e=0;u-- >0;)o(b,e,g,v,a),v+=a,e+=n;m==xa&&(d=f==i||w<=0||a<=0?0:1)}a=d}}a=!a}return a?i:0==e?t.Xb:+e*n}function D(t,e,a,n){if(n==i||t<=0||e<=0)return Ge;if(a!=i){if(a.Ua){const n=a.wc,r=a.vc,i=-2&a.t,s=-2&a.k;if(i<0||s<0||n<=0||r<=0||i+n>t||s+r>e)return Ge;t=n,e=r}if(a.I){if(a.Ba<=0||a.Aa<=0)return Ge;t=a.Ba,e=a.Aa}}return n.width=t,n.height=e,function(t){let e=t.width;const a=t.height;let n=t.J;if(e<=0||a<=0||!(n>=Se&&n=Se&&s=o*Tn[s],n&=t.ma!=i):(f=(t=t.c.Va).nb*parseInt((l+1)/2,10),h=t.rb*parseInt((l+1)/2,10),c=t.Fa*l,n&=t.F*l<=t.Wc,n&=f<=t.Rc,n&=h<=t.Uc,n&=c<=t.Wb,n&=t.F>=o,n&=t.nb>=parseInt((o+1)/2,10),n&=t.rb>=parseInt((o+1)/2,10),n&=t.y!=i,n&=t.c!=i,n&=t.S!=i,s==Me&&(n&=t.Fa>=o,n&=c<=t.Wb,n&=t.p!=i)):n=0,n?He:Ge}(n)}function I(t){return-256&t?t<0?0:255:t}function N(t,e,a,n){const r=_(16,0);let i,s;for(i=0,s=0;s<4;++s){var o=t[e+0]+t[e+8],l=t[e+0]-t[e+8],f=(t[e+4]*Bn>>16)-(t[e+12]*Pn>>16),h=(t[e+4]*Pn>>16)+(t[e+12]*Bn>>16);r[i+0]=o+h,r[i+1]=l+f,r[i+2]=l-f,r[i+3]=o-h,i+=4,e++}for(s=i=0;s<4;++s)o=(t=r[i+0]+4)+r[i+8],l=t-r[i+8],f=(r[i+4]*Bn>>16)-(r[i+12]*Pn>>16),h=(r[i+4]*Pn>>16)+(r[i+12]*Bn>>16),a[n+0+0*an]=I(a[n+0+0*an]+(o+h>>3)),a[n+1+0*an]=I(a[n+1+0*an]+(l+f>>3)),a[n+2+0*an]=I(a[n+2+0*an]+(l-f>>3)),a[n+3+0*an]=I(a[n+3+0*an]+(o-h>>3)),i++,n+=an}function P(t,e,a,n,r){N(t,e,a,n),r&&N(t,e+16,a,n+4)}function B(t,e,a,n){Zn(t,e+0,a,n+0,1),Zn(t,e+32,a,n+4*an,1)}function L(t,e,a,n){let r;for(t=t[e+0]+4,r=0;r<4;++r)for(e=0;e<4;++e)a[n+e+r*an]=I(a[n+e+r*an]+(t>>3))}function C(t,e,a,n){t[e+0]&&L(t,e+0,a,n+0),t[e+16]&&L(t,e+16,a,n+4),t[e+32]&&L(t,e+32,a,n+4*an),t[e+48]&&L(t,e+48,a,n+4*an+4)}function F(t,e,a){const n=e-an,r=In,i=255-t[n-1];let s;for(s=0;s>2}function W(t,e,a){let n,r;for(n=0;n<8;++n)for(r=0;r<8;++r)e[a+r+n*an]=t}function V(t,e,a){const n=t[e-a],r=t[e+0],i=3*(r-n)+On[1020+t[e-2*a]-t[e+a]],s=Dn[112+(i+4>>3)];t[e-a]=In[255+n+Dn[112+(i+3>>3)]],t[e+0]=In[255+r-s]}function H(t,e,a,n){const r=t[e+0],i=t[e+a];return Sn[255+t[e-2*a]-t[e-a]]>n||Sn[255+i-r]>n}function G(t,e,a,n,r){const i=t[e-3*a],s=t[e-2*a],o=t[e-a],l=t[e+0],f=t[e+a],h=t[e+2*a],c=t[e+3*a];return 2*Sn[255+o-l]+zn[255+s-f]>n?0:Sn[255+t[e-4*a]-i]<=r&&Sn[255+i-s]<=r&&Sn[255+s-o]<=r&&Sn[255+c-h]<=r&&Sn[255+h-f]<=r&&Sn[255+f-l]<=r}function K(t,e,a,n){let r;for(r=0;r<16;++r)2*Sn[255+t[e+r-a]-t[e+r+0]]+zn[255+t[e+r-2*a]-t[e+r+a]]<=n&&V(t,e+r,a)}function Y(t,e,a,n){let r;for(r=0;r<16;++r)2*Sn[255+t[e+r*a-1]-t[e+r*a+0]]+zn[255+t[e+r*a-2]-t[e+r*a+1]]<=n&&V(t,e+r*a,1)}function q(t,e,a,n){let r;for(r=3;r>0;--r)K(t,(e+=4*a)+0,a,n)}function J(t,e,a,n){let r;for(r=3;r>0;--r)Y(t,(e+=4)+0,a,n)}function X(t,e,a,n,r,i,s,o){for(;r-- >0;){if(G(t,e+0,a,i,s))if(H(t,e+0,a,o))V(t,e+0,a);else{const n=t,r=e+0,i=a,s=n[r-2*i],o=n[r-i],f=n[r+0],h=n[r+i],c=n[r+2*i];const d=27*(l=On[1020+3*(f-o)+On[1020+s-h]])+63>>7,u=18*l+63>>7;var l=9*l+63>>7;n[r-3*i]=In[255+n[r-3*i]+l],n[r-2*i]=In[255+s+u],n[r-i]=In[255+o+d],n[r+0]=In[255+f-d],n[r+i]=In[255+h-u],n[r+2*i]=In[255+c-l]}e+=n}}function $(t,e,a,n,r,i,s,o){for(;r-- >0;){if(G(t,e+0,a,i,s))if(H(t,e+0,a,o))V(t,e+0,a);else{const n=t,r=e+0,i=a,s=n[r-i],o=n[r+0],f=n[r+i];const h=Dn[112+((l=3*(o-s))+4>>3)];var l=Dn[112+(l+3>>3)];const c=h+1>>1;n[r-2*i]=In[255+n[r-2*i]+c],n[r-i]=In[255+s+l],n[r+0]=In[255+o-h],n[r+i]=In[255+f-c]}e+=n}}function Q(t,e,a,n,r,i){X(t,e+0,a,1,16,n,r,i)}function tt(t,e,a,n,r,i){X(t,e+0,1,a,16,n,r,i)}function et(t,e,a,n,r,i){let s;for(s=3;s>0;--s)$(t,(e+=4*a)+0,a,1,16,n,r,i)}function at(t,e,a,n,r,i){let s;for(s=3;s>0;--s)$(t,(e+=4)+0,1,a,16,n,r,i)}function nt(t,e,a,n,r,i,s,o){X(t,e,r,1,8,i,s,o),X(a,n,r,1,8,i,s,o)}function rt(t,e,a,n,r,i,s,o){X(t,e,1,r,8,i,s,o),X(a,n,1,r,8,i,s,o)}function it(t,e,a,n,r,i,s,o){$(t,e+4*r,r,1,8,i,s,o),$(a,n+4*r,r,1,8,i,s,o)}function st(t,e,a,n,r,i,s,o){$(t,e+4,1,r,8,i,s,o),$(a,n+4,1,r,8,i,s,o)}function ot(t,e){return e==Za?0==t.i?0==t.d?Ka:Ga:0==t.d?ja:Za:e}function lt(t,e,a,r){for(n=0;n<4;++n)t[e+n]=a[r+n]}function ft(t,e){return t<0?0:t>e?e:t}function ht(t){t.a="VP8_STATUS_OK",t.xc="OK"}function ct(t){t>>>8!=Te>>>8&&alert("mismatch error")}function dt(t,e,a){return t.a==He&&(t.a=e,t.xc=a,t.za=0),0}function ut(t,r){let o=[0],l=0;var f=[0],h=s(ln),c=s(fn);let d=s(na);f="VP8StatusCode",h=s(aa);if(t==i)return alert("(dec == null)"),0;if(ht(t),r==i)return dt(t,"VP8_STATUS_INVALID_PARAM","null VP8Io passed to VP8GetHeaders()");if(h.data=r.data,h.b=r.b,h.e=r.e,h.b=[h.b],h.e=[h.e],(f=Ae(h=[h]))!=He)return dt(t,f,"Incorrect/incomplete header.");if((h=h[0]).b=h.b[0],h.e=h.e[0],h.ia)return dt(t,Ke,"Unexpected lossless format encountered.");if(t.Ga==i&&(p(0==t.ub),t.Ga=h.$,t.G=h.G,t.ub=h.pa),l=h.data,o=h.b+h.offset,f=h.e-h.offset,p(h.e>=h.offset),f[0]<4)return dt(t,Xe,"Truncated header.");if(d=l[o+0]|l[o+1]<<8|l[o+2]<<16,(h=t.Ac).fb=!(1&d)+0,h.Jc=d>>1&7,h.Nc=d>>4&1,h.Ra=d>>5,h.Jc>3)return dt(t,"VP8_STATUS_BITSTREAM_ERROR","Incorrect keyframe parameters.");if(!h.Nc)return dt(t,"VP8_STATUS_UNSUPPORTED_FEATURE","Frame not displayable.");if(o+=3,f-=3,c=t.P,h.fb){if(f<7)return dt(t,"VP8_STATUS_NOT_ENOUGH_DATA","cannot parse picture header");if(!(f>=3&&157==l[o+0]&&1==l[o+1]&&42==l[o+2]))return dt(t,"VP8_STATUS_BITSTREAM_ERROR","Bad code word");for(c.l=16383&(l[o+4]<<8|l[o+3]),c.gd=l[o+4]>>6,c.v=16383&(l[o+6]<<8|l[o+5]),c.hd=l[o+6]>>6,o+=7,f-=7,t.Ma=c.l+15>>4,t.hb=c.v+15>>4,r.width=c.l,r.height=c.v,r.I=0,r.Ua=0,r.k=0,r.t=0,r.Ka=r.width,r.K=r.height,r.m=r.width,r.h=r.height,d=t.R,n=0;nf)return dt(t,"VP8_STATUS_NOT_ENOUGH_DATA","bad partition length");d=t.o,g(d,l,o,o+h.Ra),o+=h.Ra,f-=h.Ra,h.fb&&(c.uc=e(d),c.$c=e(d));c=d;var u=t.Ca;let _=t.R;if(p(c!=i),p(u!=i),u.pb=e(c),u.pb){if(u.ob=e(c),e(c)){var b;for(u.tb=e(c),b=0;b0)if(t.Ca.pb)for(_=0;_f&&(y=c),g(t.ic[+k],_,b,A),_=y,b=A,u+=3}g(t.ic[+w],_,b,f),f=b0){t.yb[y]=t.yb[0];continue}A=f}const e=t.yb[y];e.sc[0]=or[ft(A+c,127)],e.sc[1]=lr[ft(A+0,127)],e.sb[0]=2*or[ft(A+u,127)],e.sb[1]=101581*lr[ft(A+_,127)]>>16,e.sb[1]<8&&(e.sb[1]=8),e.qc[0]=or[ft(A+b,117)],e.qc[1]=lr[ft(A+w,127)]}if(!h.fb)return dt(t,Ye,"Not a key frame.");for(t.Zc=259,e(d),f=t.R,c=0;c<$a;++c)for(u=0;u0)+0],16==i||!a(t,o[0]))return i}else o=e[ur[i]][0];if(16==i)return 16}}function bt(t,e){return((16777216*t[0]+65536*t[1]+256*t[2]+1*t[3])*gr&4278190080)>>e}function wt(t,e){let r,s=0;if(t==i)return 0;if(e==i)return dt(t,"VP8_STATUS_INVALID_PARAM","NULL VP8Io parameter in VP8Decode().");if(!t.za&&!ut(t,e))return 0;if(p(t.za),e.Mb&&!e.Mb(e))dt(t,Je,"Frame setup failed"),r=t.a;else{e.Za&&(t.A=0);const a=nr[t.A];2==t.A?(t.lb=0,t.mb=0):(t.lb=e.t-a>>4,t.mb=e.k-a>>4,t.lb<0&&(t.lb=0),t.mb<0&&(t.mb=0)),t.Ya=e.K+15+a>>4,t.wb=e.Ka+15+a>>4,t.wb>t.Ma&&(t.wb=t.Ma),t.Ya>t.hb&&(t.Ya=t.hb),r=He}if(s=r==He){if(s){let a,n;t:{if(t.Ja=0,t.qb){const e=t.rc;if(!WebPWorkerReset(e)){a=dt(t,je,"thread initialization failed.");break t}e.Qd=t,e.Rd=t.oa.N,e.Ud=FinishRow,t.jb=t.A>0?rr:rr-1}else t.jb=ir;a=1}if(!(n=!a)){let e;t:{const a=t.jb,n=t.Ma,r=4*n,s=32*n,o=n+1,l=t.A>0?n*(t.qb?2:1):0,c=nn,d=s*(16*a+parseInt(3*nr[t.A]/2,10)),u=t.Ga!=i?t.P.l*t.P.v:0,b=r+s+o+l+c+384+d+u+ar;if(b!=b)e=0;else{if(b>t.Gb){if(t.ib=0,t.Gb=0,t.ib==i){e=dt(t,"VP8_STATUS_OUT_OF_MEMORY","no memory during frame initialization.");break t}t.Gb=b}t.dc=205,t.Xc=h(205,16*n),t.Sc=h(205,8*n),t.Vc=h(205,8*n),t.M=l?f(un,l):i,t.Sd=l?0:i,t.oa.ha=0,t.oa.M=t.M,p(0==(c&ar)),t.Ea=h(205,1*c),t.z=-12851,t.H=16*n,t.r=8*n;const s=nr[t.A],w=s*t.H,g=s/2*t.r;t.ca=_(d,205),t.da=+w,t.aa=t.ca,t.ba=t.da+16*a*t.H+g,t.ra=t.aa,t.sa=t.ba+8*a*t.r+g,t.Xb=u?_(u,0):i,t.La=f(_n,o),t.dc=h(Za,r),e=1}}n=!e}if(n)s=0;else{if(e.width=t.P.l,e.height=t.P.v,e.w=0,e.y=t.ca,e.D=t.da,e.c=t.aa,e.B=t.ba,e.S=t.ra,e.C=t.sa,e.F=t.H,e.Da=t.r,e.p=i,e.q=i,!Nn){let t;for(t=-255;t<=255;++t)Sn[255+t]=t<0?-t:t,zn[255+t]=Sn[255+t]>>1;for(t=-1020;t<=1020;++t)On[1020+t]=t<-128?-128:t>127?127:t;for(t=-112;t<=112;++t)Dn[112+t]=t<-16?-16:t>15?15:t;for(t=-255;t<=510;++t)In[255+t]=t<0?0:t>255?255:t;Nn=1}Zn=P,Mn=B,Wn=L,Vn=C,Hn=Q,jn=tt,Gn=nt,Kn=rt,Yn=et,qn=at,Jn=it,Xn=st,$n=K,Qn=Y,tr=q,er=J,s=1}}if(s)t:{for(t.d=0;t.d0&&f.d>=f.mb&&f.d<=f.Ya)+0,t.i=0;t.i0);m=-v,O[O[O.length-1]+g]=m,u[b]=m,b++}P[w]=m}}else{m=a(f,156)?a(f,128)?Ha:Va:a(f,163)?Wa:Ma;for(e.Eb[0]=m,v=0;v<4;++v)O[v+O[O.length-1]]=m;for(v=0;v<4;++v)P[v]=m}if(e.Tc=a(f,142)?a(f,114)?a(f,183)?Ha:Va:Wa:Ma,f.Ab)c=0;else{if(p.Nb)d.X=p.X=0,e.wa||(d.ua=p.ua=0),e.ja=0,e.Oa=0;else{let t=0,a=0;var k=0,y=wr;const n=e.yb[e.Lb];var A=e.z;const r=e.La[0],s=_(4,0),o=_(4,0);let f=_(4,0),c=_(4,0),d=0,u=0;var E=0;let b=0,w=0;A=h(0,384);if(e.wa)k=0,y=e.R.z[3];else{const t=_(16,0);var R=p.ua+r.ua;p.ua=r.ua=(_t(i,e.R.z[1],R,n.sb,0,t)>0)+0;k=1,y=e.R.z[0];var U=t,x=A,T=_(16,0),S=0;for(S=0;S<4;++S){var z=U[0+S]+U[12+S],D=U[4+S]+U[8+S],I=U[4+S]-U[8+S],N=U[0+S]-U[12+S];T[0+S]=z+D,T[8+S]=z-D,T[4+S]=N+I,T[12+S]=N-I}for(S=0;S<4;++S){const t=x[x.length-1],e=T[0+4*S]+3;z=e+T[3+4*S],D=T[1+4*S]+T[2+4*S],I=T[1+4*S]-T[2+4*S],N=e-T[3+4*S];x[t+0]=z+D>>3,x[t+16]=N+I>>3,x[t+32]=z-D>>3,x[t+48]=N-I>>3,x[x.length-1]+=64}A[A.length-1]=0}for(f=l(pr[15&p.X]),c=l(pr[15&r.X]),b=0;b<4;++b){var F=c[b];for(E=0;E<4;++E){var Z=_t(i,y,R=F+f[E],n.sc,k,A);f[E]=F=(Z>0)+0,o[E]=(0!=A[A[A.length-1]+0])+0,s[E]=(Z>1)+0,A[A.length-1]+=16}c[b]=F,u|=bt(o,24-4*b),d|=bt(s,24-4*b)}for(t=bt(f,24),a=bt(c,24),f=l(pr[p.X>>4]),c=l(pr[r.X>>4]),w=0;w<4;w+=2){for(b=0;b<2;++b){for(F=c[w+b],E=0;E<2;++E)R=F+f[w+E],Z=_t(i,e.R.z[2],R,n.qc,0,A),f[w+E]=F=(Z>0)+0,o[2*b+E]=(0!=A[A[A.length-1]+0])+0,s[2*b+E]=(Z>1)+0,A[A.length-1]+=16;c[w+b]=F}u|=bt(o,8-2*w),d|=bt(s,8-2*w)}t|=bt(f,20),a|=bt(c,20),p.X=t,r.X=a,e.z=A,e.Oa=d+0,e.ja=d|u,p.Nb=!e.ja+0}c=!i.Ab}if(!c){s=dt(t,"VP8_STATUS_NOT_ENOUGH_DATA",`Premature end-of-file encountered.${t.i} ${t.d}`);break t}const B=t,L=B.Ea,C=rn,K=B.Ea,Y=sn,q=B.Ea,J=on;if(B.i>0){var M=0;for(M=-1;M<16;++M)lt(L,C+M*an-4,L,C+M*an+12);for(M=-1;M<8;++M)lt(K,Y+M*an-4,K,Y+M*an+4),lt(q,J+M*an-4,q,J+M*an+4)}else{for(M=0;M<16;++M)L[C+M*an-1]=129;for(M=0;M<8;++M)K[Y+M*an-1]=129,q[J+M*an-1]=129;B.d>0&&(L[C-1-an]=K[Y-1-an]=q[J-1-an]=129)}const Q=B.Xc,tt=16*+B.i,et=B.Sc,at=8*+B.i,nt=B.Vc,rt=8*+B.i,it=B.z;let st=0;if(B.d>0)o(L,C-an,Q,tt,16),o(K,Y-an,et,at,8),o(q,J-an,nt,rt,8);else if(0==B.i){for(n=0;n<21;++n)L[C-an-1+n]=127;for(n=0;n<9;++n)K[Y-an-1+n]=127;for(n=0;n<9;++n)q[J-an-1+n]=127}if(B.wa){const t=C-an+16;B.d>0&&(B.i>=B.Ma-1?L[t+0]=L[t+1]=L[t+2]=L[t+3]=Q[tt+15]:o(L,t+0,Q,tt+16,4));for(let e=0;e<4;++e)L[e+t+4*an]=L[e+t+4*an]=L[e+t+8*an]=L[e+t+12*an]=L[e+t+0];for(st=0;st<16;st++){var W=L,V=C+sr[st];Ln[B.Eb[st]](W,V),B.Oa&1<0){const t=ut.M[1+ut.i],e=ut.La[1+ut.i].Nb;let a=ut.Zb[ut.Lb];ut.ga.oc&&(a+=ut.ga.Lc[0],ut.wa&&(a+=ut.ga.Gc[0])),a=a<0?0:a>63?63:a,t.zc=a,ut.ga.kb>0&&(a=ut.ga.kb>4?a>>2:a>>1,a>9-ut.ga.kb&&(a=9-ut.ga.kb)),t.yc=a<1?1:a,t.ab=(!e||ut.wa)+0}var G=0,X=8*ut.Ja*ut.r,$=ut.ca,ft=ut.da+16*ut.i+16*ut.Ja*ut.H,ht=ut.aa,ct=ut.ba+8*ut.i+X,wt=ut.ra,gt=ut.sa+8*ut.i+X;for(G=0;G<16;++G)o($,ft+G*ut.H,ut.Ea,+rn+G*an,16);for(G=0;G<8;++G)o(ht,ct+G*ut.r,ut.Ea,+sn+G*an,8),o(wt,gt+G*ut.r,ut.Ea,+on+G*an,8)}const B=t,L=e;var mt=1;const C=B.oa;if(B.qb){const t=B.rc;mt=mt&WebPWorkerSync(t);if(p(t.a==OK),mt){if(C.N=L,C.ha=B.Ja,C.d=B.d,C.W=B.W,C.W){const t=C.M;C.M=B.M,B.M=t}WebPWorkerLaunch(t),++B.Ja==B.jb&&(B.Ja=0)}}else{C.d=B.d,C.W=B.W;e:{let t=1;const e=B.oa,a=nr[B.A],n=a*B.H,r=parseInt(a/2)*B.r,s=16*e.ha*B.H,l=8*e.ha*B.r,f=B.ca,h=B.da-n+s,c=B.aa,d=B.ba-r+l,u=B.ra,_=B.sa-r+l,b=0==e.d,w=(e.d>=B.hb-1)+0;var vt=16*e.d;let g=16*(e.d+1);if(e.W){const t=B;let e=0;const a=t.oa.d;for(p(t.oa.W),e=t.lb;e0&&Qn(f,h,o,u+4),l.ab&&er(f,h,o,u),i>0&&$n(f,h,o,u+4),l.ab&&tr(f,h,o,u);else{const t=n.r,e=n.aa,a=n.ba+8*s.ha*t+8*r,_=n.ra,b=n.sa+8*s.ha*t+8*r,w=n.Ac.fb?c>=40?2:c>=15?1:0:c>=40?3:c>=20?2:c>=15?1:0;r>0&&(jn(f,h,o,u+4,d,w),Kn(e,a,_,b,t,u+4,d,w)),l.ab&&(qn(f,h,o,u,d,w),Xn(e,a,_,b,t,u,d,w)),i>0&&(Hn(f,h,o,u+4,d,w),Gn(e,a,_,b,t,u+4,d,w)),l.ab&&(Yn(f,h,o,u,d,w),Jn(e,a,_,b,t,u,d,w))}}}if(L.put){if(b?(L.y=B.ca,L.D=B.da+s,L.c=B.aa,L.B=B.ba+l,L.S=B.ra,L.C=B.sa+l):(vt-=a,L.y=f,L.D=h,L.c=c,L.B=d,L.S=u,L.C=_),w||(g-=a),g>L.K&&(g=L.K),B.Ga!=i&&vt>1),L.C+=B.r*(t>>1),L.p!=i&&(L.q+=L.width*t)}vt>1,L.C+=L.t>>1,L.p!=i&&(L.q+=L.t),L.w=vt-L.k,L.m=L.Ka-L.t,L.h=g-vt,t=L.put(L))}e.ha+1==B.jb&&!w&&(o(B.ca,B.da-n,f,h+16*B.H,n),o(B.aa,B.ba-r,c,d+8*B.r,r),o(B.ra,B.sa-r,u,_+8*B.r,r)),mt=t}}if(!mt){s=dt(t,"VP8_STATUS_USER_ABORT","Output aborted.");break t}}let r;if(!(r=t.qb&&!WebPWorkerSync(t.rc))){let e;(e=t.fc>0)&&(p(t),p(t.fc>0),e=!1),r=e}s=r?0:1}const r=s;e.Pb&&e.Pb(e),s=1&r}return s?(t.za=0,s):(pt(t),0)}function pt(t){t!=i&&(t.ib&&(t.ib=0),t.ib=i,t.Gb=0,t.za=0)}function gt(t,e){return t+(1<>e}function mt(t,e,a,n,r){const i=Wr[a]+Vr[e]>>mr;e=Mr[e],n[r+0]=Hr[t+Zr[a]-vr],n[r+1]=Hr[t+i-vr],n[r+2]=Hr[t+e-vr]}function vt(t,e,a,n,r){const i=Wr[a]+Vr[e]>>mr;e=Mr[e],n[r+0]=248&Hr[t+Zr[a]-vr]|Hr[t+i-vr]>>5,n[r+1]=Hr[t+i-vr]<<3&224|Hr[t+e-vr]>>3}function kt(t,e,a,n,r){n[r+0]=255,mt(t,e,a,n,r+1)}function yt(t,e,a,n,r){const i=Mr[e];n[r+0]=jr[t+Zr[a]-vr]<<4|jr[t+(Wr[a]+Vr[e]>>mr)-vr],n[r+1]=15|jr[t+i-vr]<<4}function At(t,e,a,n,r){const i=Zr[a];a=Wr[a]+Vr[e]>>mr,n[r+0]=Hr[t+Mr[e]-vr],n[r+1]=Hr[t+a-vr],n[r+2]=Hr[t+i-vr]}function Et(t,e,a,n,r){At(t,e,a,n,r),n[r+3]=255}function Rt(t,e,a,n,r){mt(t,e,a,n,r),n[r+3]=255}function Ut(t,e,a){t[e]=((((4278255360&t[e])>>>0)+((4278255360&a)>>>0)&4278255360)>>>0|(16711935&t[e])+(16711935&a)&16711935)>>>0}function xt(t,e){return((4278124286&(t^e))>>>1)+((t&e)>>>0)>>>0}function Tt(t){return t<256&&t>0?t:t<=0?0:~t>>24&255}function St(t,e){return Tt(t+parseInt((t-e)/2,10))}function zt(){return _a}function Ot(t,e){return(t&=255)>127&&(t-=256),(e&=255)>127&&(e-=256),t*e>>>5}function Dt(t,e,a,n,r,i,s){var o=0;const l=8>>t.n,f=t.U,h=t.u;if(l<8){t=(1<>8&255),i[s++]=h[e&c],e>>=l}}else for(o=e;o>8&255]}function It(t,e,a,n,r){for(a=e+a;e>16&255,n[r++]=a>>8&255,n[r++]=a>>0&255,n[r++]=a>>24&255}}function Nt(t,e,a,n,r){for(a=e+a;e>16&240|a>>12&15,n[r++]=a>>0&240|a>>28&15}}function Pt(t,e,a,n,r){for(a=e+a;e>24&255,n[r++]=a>>16&255,n[r++]=a>>8&255,n[r++]=a>>0&255}}function Bt(t,e,a,n){return E(t,8)!=la?0:(e[0]=E(t,fa)+1,a[0]=E(t,fa)+1,n[0]=E(t,1),E(t,ha),1)}function Lt(t,e){let a=0;return t<4?t+1:(a=t-2>>1,(2+(1&t)<e.ya){var a=t.Y,n=0;for(p(a!=i);0!=a[n].s;){var r=a,s=e;const t=s.T>>s.g&1;s.L?s.fa=1:(++s.g,s.g>=8&&y(s),s.Q==s.ya&&32==s.g&&(s.L=1)),n=n+r[n].s+t}return a[n].kc}for(n=0,p((a=t.Y)!=i);0!=a[n].s;)r=a,s=e.T>>e.g&1,++e.g,n=n+r[n].s+s;return a[n].kc}function Ft(t,e){if(t!=i){var a=0,n=0;for(a=0;a>t.eb)+(e>>t.eb)])0;){e=t.nc[r];let x=l;var u=h,_=d;d=n,h=a;switch(p(x<(b=f)),p(b<=e.Vb),e.Qc){case ya:for(u=0,e=h+(b-x)*e.U;h>8&255,g=16711935&(g=(g=(16711935&b[_])>>>0)+(w<<16|w));d[h++]=((4278255360&b[_])>>>0|g)>>>0,32==x&&u++}break;case va:var m=x;u=b,_=d,w=h,g=(E=e).U;if(0==m){var v=0;for(Ut(_,w,_a),v=1;v>E.n)*y;m>8&15],v=1;v>8&15]),e=t(_[w+v-1],_,w+v-g),Ut(_,w+v,e)}w+=g,0==(++m&k)&&(E+=y)}b!=e.Vb&&o(d,h-(e=e.U),d,h+(b-x-1)*e,e);break;case ka:for(u=e.U,_=(1<>e.n)*w;x>0&255,E.Bc=A>>8&255,E.Kc=A>>16&255),E=(A=d[h+y])>>>8,R=A>>>16,U=A,R+=Ot(k.Cc,E),R&=255,U+=Ot(k.Bc,E),U+=Ot(k.Kc,R),U&=255,d[h+y]=(4278255360&A|R<<16|U)>>>0;h+=u,++x,0==(x&_)&&(e+=w)}break;case Aa:u==d&&e.n>0?(u=(b-x)*gt(e.U,e.n),c(d,_=h+(b-x)*e.U-u,d,h,u),Dt(e,x,b,d,_,d,h)):Dt(e,x,b,u,_,d,h)}h=n,d=a}}function Wt(t,e){var a=t.V,n=t.Ha+t.l*t.O;if(!((i=e-t.O)<=0)){Mt(t,i,a,n);var r=t.N;a=t.Xa;let d=[t.vb];n=t.O;var i=e,s=d,o=r.width;if(p(nr.K&&(i=r.K),n=i?n=0:(s[0]+=r.t,r.w=n-r.k,r.m=r.Ka-r.t,r.h=i-n,n=1),n){if(d=d[0],n=t.Ib,i=r.width,n.J0;){const t=a;let n=d,r=l;const h=s;let u=e;switch(o){case Se:for(r=n+r;n>16&255,h[u++]=c>>8&255,h[u++]=c>>0&255}break;case ze:It(t,n,r,h,u);break;case Be:It(t,n,r,h,u),WebPApplyAlphaMultiply(h,0,r,1,0);break;case Oe:for(r=n+r;n>0&255,h[u++]=c>>8&255,h[u++]=c>>16&255;break;case De:Pt(t,n,r,h,u);break;case Le:Pt(t,n,r,h,u),WebPApplyAlphaMultiply(h,0,r,1,0);break;case Ie:Pt(t,n,r,h,u);break;case Ce:Pt(t,n,r,h,u),WebPApplyAlphaMultiply(h,1,r,1,0);break;case Ne:Nt(t,n,r,h,u);break;case Fe:Nt(t,n,r,h,u),WebPApplyAlphaMultiply4444(h,r,1,0);break;case Pe:for(r=n+r;n>16&248|c>>13&7,h[u++]=c>>5&224|c>>3&31;break;default:p(0)}d+=i,e+=f}a=r}t.xa+=a}else t.xa=r.I?EmitRescaledRowsYUVA(t,a,d,i,r.h):EmitRowsYUVA(t,a,d,i,r.m,r.h);p(t.xa<=n.height)}t.O=e,p(t.O<=t.v)}}function Vt(t,e,a,n,r,s){let o=1,l=0,f=0;const h=t.o,c=t.cb;let d=c.Db,u=a,_=a;a+=n*r;const b=(r=pa+ga)+c.xb,w=c.xb>0?c.Yb:i,g=c.Dc;let m=!1;for(p(d!=i);!h.L&&u>>0)+(m<<16)+(o<<8)+v}if(m=!1,++u,++l,l>=n&&(l=0,++f,s!=i&&f%Er==0&&s(t,f),w!=i))for(;_>>w.bb]=o}else if(yLr?v-=Lr:(y=Cr[v-1],y=(y>>4)*n+(8-(15&y)),v=y>=1?y:1),y=0,y=0;y=n;)l-=n,++f,s!=i&&f%Er==0&&s(t,f);if(u>>w.bb]=o}else if(y>>w.bb]=y;y=e,v=u,p(m<=-1>>>(k=w).bb),y[v]=k.ea[m],m=!0;continue}(o=!h.fa)||End}return s!=i&&s(t,f),h.fa||!o||h.L&&u16?0:u>4?1:u>2?2:3,d[0]=gt(o.U,w),o.n=w,d=w=Kt(u,1,0,z,o.u))if(d=u,w=0,u=1<<(8>>>(z=o).n)>>>0,(g=Array(u))==i)d=0;else{m=z.u[0];var v=z.b;for(g[0]=z.u[0][z.b+0],w=1;w>>0)+((4278255360&g[w-1])>>>0)&4278255360)>>>0|(16711935&m[v+w])+(16711935&g[w-1])&16711935)>>>0;for(;w=1&&c<=da)){n.a=Ke;break}if(o)t:{o=n;var k=t[0],y=e[0],z=(d=c,v=m=0,v=o.o,o.cb);w=[i],u=i,g=1;if(a&&E(v,1)){y=(k=gt(k,m=E(v,3)+2))*(O=gt(y,m));if(!Kt(k,O,0,o,w)){o.a=Ke,Ft(u,g),o=0;break t}for(w=w[0],z.eb=m,m=0;m>>8&65535,w[m]=k,k>=g&&(g=k+1)}if(v.fa)Ft(u,g),o=0;else if(p(g<=65536),(u=b(g,An))==i)o.a=je,Ft(u,g),o=0;else{for(m=0;m0&&(k+=1<=t){(B=B&&R(e))||x(e),D=B;break a}if(!T(e,I[L],N[L],P[L])){(B=B&&R(e))||x(e),D=B;break a}}(B=(B=1)&&R(e))||x(e),D=B}else D=0}}else{if(D=0,N=[],(I=E(O,4)+4)>Pr){k.a=Ke,k=0;break e}if((P=Array(t))==i){k.a=je,k=0;break e}for(D=0;DN){D.a=Ke,x(r),D=B;break a}}else a=N;for(e=0;eN){D.a=Ke,x(r),D=B;break a}for(C=C?n:0;F-- >0;)I[e++]=C}}B=1,x(r),D=B}else D.a=Ke,D=0}D&&(D=S(e,P,t))}(D=D&&!O.fa)?k=1:(k.a=Ke,k=0)}if(!k){Ft(u,g),o=0;break t}}z.ac=w,z.hc=g,z.Db=u,o=1}}if(!o){n.a=Ke;break}if(c>0){if(f.xb=1<0),d.ea=_(z,0),d.ea==i?c=0:(d.bb=32-c,c=1),!c){n.a=je,o=0;break}}else f.xb=0;if(c=n,d=t[0],z=e[0],u=(w=c.cb).eb,c.l=d,c.v=z,w.Ec=gt(d,u),w.Dc=0==u?-1:(1<>>8&255;t.O=t.xa=e}}function ft(t,e){return t<0?0:t>e?e:t}function Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,p,g){let m;const v=w-1>>1;let k=r[i+0]|s[o+0]<<16,y=l[f+0]|h[c+0]<<16;if(t){var A=3*k+y+131074>>2;p(t[e+0],255&A,A>>16,d,u)}for(a&&(A=3*y+k+131074>>2,p(a[n+0],255&A,A>>16,_,b)),m=1;m<=v;++m){const w=r[i+m]|s[o+m]<<16,v=l[f+m]|h[c+m]<<16;const E=(A=k+w+y+v+524296)+2*(w+y)>>3,R=A+2*(k+v)>>3;t&&(A=E+k>>1,k=R+w>>1,p(t[e+2*m-1],255&A,A>>16,d,u+(2*m-1)*g),p(t[e+2*m-0],255&k,k>>16,d,u+(2*m-0)*g)),a&&(A=R+y>>1,k=E+v>>1,p(a[n+2*m-1],255&A,A>>16,_,b+(2*m-1)*g),p(a[n+2*m+0],255&k,k>>16,_,b+(2*m+0)*g)),k=w,y=v}1&w||(t&&(A=3*k+y+131074>>2,p(t[e+w-1],255&A,A>>16,d,u+(w-1)*g)),a&&(A=3*y+k+131074>>2,p(a[n+w-1],255&A,A>>16,_,b+(w-1)*g)))}function Xt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,mt,3)}function $t(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,At,3)}function Qt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,Rt,4)}function te(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,Et,4)}function ee(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,kt,4)}function ae(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,yt,2)}function ne(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w){Jt(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,vt,2)}function re(t,e,a,n,r,i,s,o,l,f,h,c,d,u,_){let b;for(b=0;b0;){var s=t,o=e+(a?1:0),l=t,f=e+(a?0:3),h=0;for(h=0;h>1)*a.nb,l=a.S,f=a.C+(t.w>>1)*a.rb,h=t.m,c=t.h,d=parseInt((h+1)/2,10),u=parseInt((c+1)/2,10);let _;for(_=0;_>4;h[c+2*u]=240&h[c+2*u]|t,d&=t}r+=e.width,c+=l.f}15!=d&&t(o)&&WebPApplyAlphaMultiply4444(h,s,i,f,l.f)}return 0}function pe(e){let a=e.ka;const n=a.j.J,r=n>1,n=e.m+2*t;let r;const s=[];for(r=0;r>mr,Vr[e]=-22014*(e-128)+Fr,Wr[e]=-45773*(e-128),Mr[e]=113618*(e-128)+Fr>>mr;for(e=vr;e>mr,Hr[e-vr]=ft(a,255),jr[e-vr]=ft(a+8>>4,15);Gr=1}return 1}function ge(t){const e=t.ka;let a=t.m;const n=t.h;return p(!(1&t.w)),a<=0||n<=0?0:(a=e.$a(t,e),e.ec+=a,e.zb&&e.zb(t,e),1)}function me(t){(t=t.ka).memory="",t.memory=i}function ve(t,e){return t[e+0]|t[e+1]<<8|t[e+2]<<16}function ke(t,e){return(ve(t,e)|t[e+3]<<24)>>>0}function ye(t,e,a,n,r,o,l){var f=0,h=[0],c="VP8StatusCode";const d=s(aa);if(t==i||a[0]=za&&!u(t,e[0],"RIFF",Ta)){if(u(t,e[0]+8,"WEBP",Ta)){c=Ke;break t}if((g=ke(t,e[0]+Ta))0,g=[0];t:if(c=Sa+Oa,p(t!=i),p(a!=i),p(h!=i),h[0]=0,a[0]=Ia){c=Ke;break t}g!=i&&(g[0]=w),n!=i&&(n[0]=_),r!=i&&(r[0]=b),e[0]+=c,a[0]-=c,h[0]=1}c=He}if(c!=He)return c;if(!f&&h[0])return Ke;if(o!=i&&(o[0]=!!(g[0]&Da)),h&&l==i)return He;if(a0&&n>h){c=Ke;break t}if(w=_&&b>h-_){c=Ke;break t}f[0]=b,e[0]+=Sa,a[0]-=Sa,g[0]=c}else g[0]=a>=1&&t[e+0]==la,f[0]=a[0];c=He}if(d.ta=d.ta[0],d.ia=d.ia[0],c!=He)return c;if(d.ta>Na)return Ke;if(d.ia){if(a[0]=3&&157==t[h+3+0]&&1==t[h+3+1]&&42==t[h+3+2]?(f=t[h+0]|t[h+1]<<8|t[h+2]<<16,g=16383&(t[h+7]<<8|t[h+6]),t=16383&(t[h+9]<<8|t[h+8]),!(!(1&f)+0)||(f>>1&7)>3||!(f>>4&1)||f>>5>=d.ta?t=0:(n&&(n[0]=g),r&&(r[0]=t),t=1)):t=0}return t?(o!=i&&(o[0]|=d.$!=i),l!=i&&(l[0]=d,l[0].offset=e[0]-l[0].b,p(e[0]-l[0].b0,e.Ua&&(l=t.wc,f=t.vc,s=t.t,o=t.k,an||o+f>r))return 0;if(e.t=s,e.k=o,e.Ka=s+l,e.K=o+f,e.m=l,e.h=f,e.I=t!=i&&t.I>0,e.I){if(t.Ba<=0||t.Aa<=0)return 0;e.Ba=t.Ba,e.Aa=t.Aa}return e.Za=t&&t.Za,e.Bb=t==i||!t.ed,e.I&&(e.Za=e.Ba<3*n/4&&e.Aa<3*r/4,e.Bb=0),1}var Te=512,Se=0,ze=1,Oe=2,De=3,Ie=4,Ne=5,Pe=6,Be=7,Le=8,Ce=9,Fe=10,Ze=11,Me=12,We=13;this.WEBP_CSP_MODE=this.Cd={nd:0,od:1,kd:2,ld:3,jd:4,pd:5,qd:6,rd:7,sd:8,md:9};var Ve={J:"WEBP_CSP_MODE",width:0,height:0,Fc:0,c:{RGBA:{ma:0,Sa:0,f:0,size:0},Va:{y:0,c:0,S:0,p:0,D:0,B:0,C:0,q:0,F:0,nb:0,rb:0,Fa:0,Wc:0,Rc:0,Uc:0,Wb:0}},Ic:_(4,0),Jb:i,jc:0},He=0,je=1,Ge=2,Ke=3,Ye=4,qe=5,Je=6,Xe=7;this.VP8StatusCode=this.td={xd:0,yd:1,vd:2,ud:3,Ad:4,zd:5,Bd:6,wd:7};var $e={width:{value:0},height:{value:0},$b:{value:0},tc:0,Yd:0,rotate:0,be:0,Ic:_(3,0)};this.WebPGetFeatures=this.Md=function(t,e,a){let n="VP8StatusCode";return Te>>>8!=Te>>>8||a==i?t=Ge:(n=Ue(t,[0],e=[e],a),t=n==Xe?Ke:n),t};const Qe={Za:0,ed:0,Ua:0,t:0,k:0,wc:0,vc:0,I:0,Ba:0,Aa:0,ae:0,Td:0,Xd:0,Ic:_(6,0)};this.WebPDecoderConfig=this.Kd={input:s($e),j:s(Ve),options:s(Qe)},this.WebPInitDecoderConfig=this.Nd=function(t){return Te>>>8!=Te>>>8||t==i?t=0:(p((t=t.input)!=i),t.tc=0,t=1),t};var ta={width:0,height:0,w:0,m:0,h:0,y:0,c:0,S:0,D:0,B:0,C:0,F:0,Da:0,ka:0,put:0,Mb:0,Pb:0,Bb:0,e:0,data:0,b:0,Za:0,Ua:0,t:0,Ka:0,k:0,K:0,I:0,Ba:0,Aa:0,p:0,q:0},ea={j:s(Ve),Sb:0,Qb:0,lc:0,Tb:0,Rb:0,mc:0,ec:0,Qa:s(Qe),memory:0,$a:"(OutputFunc)",zb:"(OutputFunc)",ad:"(OutputRowFunc)"},aa={data:0,b:0,e:0,offset:0,$:i,G:0,pa:0,ta:0,na:0,ia:0},na={qa:0,Ia:i,Pd:0,Ab:0,la:0,Z:0,gc:0},ra={T:0,qa:0,Ia:0,ya:0,Q:0,g:0,L:0,fa:0},ia=25,sa=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215],oa=10,la=47,fa=14,ha=3,ca=5,da=11,ua=5,_a=4278190080,ba=8,wa=15,pa=256,ga=24,ma=4,va=0,ka=1,ya=2,Aa=3,Ea=1,Ra=0,Ua=1,xa=1,Ta=4,Sa=8,za=12,Oa=10,Da=16,Ia=1*Math.pow(2,32),Na=-1-Sa-1>>>0,Pa={kc:0,s:0},Ba={Y:"HuffmanTreeNode*",gb:0,Pa:0},La=-1;const Ca={ea:0,bb:0};var Fa=506832829,Za=0,Ma=Za,Wa=2,Va=3,Ha=1,ja=4,Ga=5,Ka=6,Ya=3,qa=4,Ja=4,Xa=4,$a=4,Qa=8,tn=3,en=11,an=32,nn=17*an+9*an,rn=1*an+8,sn=rn+16*an+an,on=sn+16,ln={fb:0,Jc:0,Nc:0,Ra:0},fn={l:0,v:0,gd:0,hd:0,uc:0,$c:0};const hn={pb:0,ob:0,tb:0,Kb:_(qa,0),Cb:_(qa,0)},cn={Ta:_(Ya,0),z:w([$a,Qa,tn,en],0)},dn={Oc:0,Fb:0,kb:0,oc:0,Lc:_(Ja,0),Gc:_(Ja,0)};var un={zc:0,yc:0,ab:0},_n={X:0,ua:0,Nb:0};const bn=_(2,0),wn={sc:s(bn),sb:s(bn),qc:s(bn)},pn={ha:0,d:0,W:0,M:un,N:ta};var gn={a:"VP8StatusCode",za:0,xc:0,o:s(na),Ac:s(ln),P:s(fn),ga:s(dn),Ca:s(hn),rc:"WebPWorker",qb:0,Ja:0,jb:0,oa:pn,Ma:0,hb:0,lb:0,mb:0,wb:0,Ya:0,Hb:0,ic:b(8,na),Zc:0,yb:b(qa,wn),R:s(cn),pc:0,Pc:0,dc:0,cc:_(4,0),Xc:0,Sc:0,Vc:0,La:s(_n),M:s(un),Ea:0,z:0,ca:0,aa:0,ra:0,da:0,ba:0,sa:0,H:0,r:0,ib:0,Gb:0,i:0,d:0,wa:0,Eb:_(16,0),Vd:0,Tc:0,Lb:0,ja:0,Oa:0,A:0,W:0,Zb:_(qa,0),Ga:i,G:0,ub:0,Xb:0,Od:0,cd:0,dd:0,Wd:0,fc:0},mn=0,vn=1,kn=2;const yn={Qc:"VP8LImageTransformType",n:0,U:0,Vb:0,u:0,b:0};var An={va:b(ua,Ba)};const En={xb:0,Yb:s(Ca),Dc:0,eb:0,Ec:0,ac:0,bd:0,hc:0,Db:"HTreeGroup"};var Rn={a:"VP8StatusCode",Wa:"VP8LDecodeState",Ob:"VP8LDecodeState",N:"VP8Io",Ib:"WebPDecBuffer",Hc:"WebPDecBuffer",V:0,Ha:0,Xa:0,vb:0,o:s(ra),l:0,v:0,O:0,xa:0,cb:s(En),Na:0,nc:b(ma,yn),Ub:0,Mc:0,$d:0,Zd:"*WebPRescaler"},Un=4,xn=[i,function(t,e,a,n,r,s,l,f){let h=0,c=f;for(p(t!=i),p(l!=i),p(a>0),p(n>0),p(r>0),p(s>=a*r),h=0;h0),p(n>0),p(r>0),p(s>=a*r),o(l,f,t,e,r),z(t,e+r,l,c,l,f+r,r*(a-1)),h=1;h0),p(n>0),p(r>0),p(s>=a*r),o(l,f,t,e,r),z(t,e+r,l,h,l,f+r,r*(a-1)),c=1;c255?255:a)&255}}}],Tn=[3,4,3,4,4,2,2,4,4,4,2,1,1];this.WebPFreeDecBuffer=this.Yc=function(t){t!=i&&(t.Fc||(t.Jb=""),t.jc=0,t.Jb=t.jc=i)},r=this;var Sn=_(511,0),zn=_(511,0),On=_(2041,0),Dn=_(225,0),In=_(766,0),Nn=0,Pn=85627,Bn=35468,Ln=[function(t,e){let a,n=4;for(a=0;a<4;++a)n+=t[e+a-an]+t[e-1+a*an];for(n>>=3,a=0;a<4;++a)d(t,e+a*an,n,4)},function(t,e){F(t,e,4)},function(t,e){let a=e-an;const n=[];for(n.push(M(t[a-1],t[a+0],t[a+1])),n.push(M(t[a+0],t[a+1],t[a+2])),n.push(M(t[a+1],t[a+2],t[a+3])),n.push(M(t[a+2],t[a+3],t[a+4])),a=0;a<4;++a)o(t,e+a*an,n,0,4)},function(t,e){const a=t[e-1],n=t[e-1+an],r=t[e-1+2*an],i=t[e-1+3*an];t[e+0+0*an]=t[e+1+0*an]=t[e+2+0*an]=t[e+3+0*an]=M(t[e-1-an],a,n),t[e+0+1*an]=t[e+1+1*an]=t[e+2+1*an]=t[e+3+1*an]=M(a,n,r),t[e+0+2*an]=t[e+1+2*an]=t[e+2+2*an]=t[e+3+2*an]=M(n,r,i),t[e+0+3*an]=t[e+1+3*an]=t[e+2+3*an]=t[e+3+3*an]=M(r,i,i)},function(t,e){const a=t[e-1+0*an],n=t[e-1+1*an],r=t[e-1+2*an],i=t[e-1-an],s=t[e+0-an],o=t[e+1-an],l=t[e+2-an],f=t[e+3-an];t[e+0+3*an]=M(n,r,t[e-1+3*an]),t[e+0+2*an]=t[e+1+3*an]=M(a,n,r),t[e+0+1*an]=t[e+1+2*an]=t[e+2+3*an]=M(i,a,n),t[e+0+0*an]=t[e+1+1*an]=t[e+2+2*an]=t[e+3+3*an]=M(s,i,a),t[e+1+0*an]=t[e+2+1*an]=t[e+3+2*an]=M(o,s,i),t[e+2+0*an]=t[e+3+1*an]=M(l,o,s),t[e+3+0*an]=M(f,l,o)},function(t,e){const a=t[e-1+0*an],n=t[e-1+1*an],r=t[e-1+2*an],i=t[e-1-an],s=t[e+0-an],o=t[e+1-an],l=t[e+2-an],f=t[e+3-an];t[e+0+0*an]=t[e+1+2*an]=i+s+1>>1,t[e+1+0*an]=t[e+2+2*an]=s+o+1>>1,t[e+2+0*an]=t[e+3+2*an]=o+l+1>>1,t[e+3+0*an]=l+f+1>>1,t[e+0+3*an]=M(r,n,a),t[e+0+2*an]=M(n,a,i),t[e+0+1*an]=t[e+1+3*an]=M(a,i,s),t[e+1+1*an]=t[e+2+3*an]=M(i,s,o),t[e+2+1*an]=t[e+3+3*an]=M(s,o,l),t[e+3+1*an]=M(o,l,f)},function(t,e){const a=t[e+1-an],n=t[e+2-an],r=t[e+3-an],i=t[e+4-an],s=t[e+5-an],o=t[e+6-an],l=t[e+7-an];t[e+0+0*an]=M(t[e+0-an],a,n),t[e+1+0*an]=t[e+0+1*an]=M(a,n,r),t[e+2+0*an]=t[e+1+1*an]=t[e+0+2*an]=M(n,r,i),t[e+3+0*an]=t[e+2+1*an]=t[e+1+2*an]=t[e+0+3*an]=M(r,i,s),t[e+3+1*an]=t[e+2+2*an]=t[e+1+3*an]=M(i,s,o),t[e+3+2*an]=t[e+2+3*an]=M(s,o,l),t[e+3+3*an]=M(o,l,l)},function(t,e){const a=t[e+0-an],n=t[e+1-an],r=t[e+2-an],i=t[e+3-an],s=t[e+4-an],o=t[e+5-an],l=t[e+6-an],f=t[e+7-an];t[e+0+0*an]=a+n+1>>1,t[e+1+0*an]=t[e+0+2*an]=n+r+1>>1,t[e+2+0*an]=t[e+1+2*an]=r+i+1>>1,t[e+3+0*an]=t[e+2+2*an]=i+s+1>>1,t[e+0+1*an]=M(a,n,r),t[e+1+1*an]=t[e+0+3*an]=M(n,r,i),t[e+2+1*an]=t[e+1+3*an]=M(r,i,s),t[e+3+1*an]=t[e+2+3*an]=M(i,s,o),t[e+3+2*an]=M(s,o,l),t[e+3+3*an]=M(o,l,f)},function(t,e){const a=t[e-1+0*an],n=t[e-1+1*an],r=t[e-1+2*an],i=t[e-1+3*an],s=t[e-1-an],o=t[e+0-an],l=t[e+1-an],f=t[e+2-an];t[e+0+0*an]=t[e+2+1*an]=a+s+1>>1,t[e+0+1*an]=t[e+2+2*an]=n+a+1>>1,t[e+0+2*an]=t[e+2+3*an]=r+n+1>>1,t[e+0+3*an]=i+r+1>>1,t[e+3+0*an]=M(o,l,f),t[e+2+0*an]=M(s,o,l),t[e+1+0*an]=t[e+3+1*an]=M(a,s,o),t[e+1+1*an]=t[e+3+2*an]=M(n,a,s),t[e+1+2*an]=t[e+3+3*an]=M(r,n,a),t[e+1+3*an]=M(i,r,n)},function(t,e){const a=t[e-1+0*an],n=t[e-1+1*an],r=t[e-1+2*an],i=t[e-1+3*an];t[e+0+0*an]=a+n+1>>1,t[e+2+0*an]=t[e+0+1*an]=n+r+1>>1,t[e+2+1*an]=t[e+0+2*an]=r+i+1>>1,t[e+1+0*an]=M(a,n,r),t[e+3+0*an]=t[e+1+1*an]=M(n,r,i),t[e+3+1*an]=t[e+1+2*an]=M(r,i,i),t[e+3+2*an]=t[e+2+2*an]=t[e+0+3*an]=t[e+1+3*an]=t[e+2+3*an]=t[e+3+3*an]=i}],Cn=[function(t,e){let a,n=16;for(a=0;a<16;++a)n+=t[e-1+a*an]+t[e+a-an];Z(n>>5,t,e)},function(t,e){F(t,e,16)},function(t,e){let a;for(a=0;a<16;++a)o(t,e+a*an,t,e-an,16)},function(t,e){let a;for(a=16;a>0;--a)d(t,e+0,t[e-1],16),e+=an},function(t,e){let a,n=8;for(a=0;a<16;++a)n+=t[e-1+a*an];Z(n>>4,t,e)},function(t,e){let a,n=8;for(a=0;a<16;++a)n+=t[e+a-an];Z(n>>4,t,e)},function(t,e){Z(128,t,e)}],Fn=[function(t,e){let a,n=8;for(a=0;a<8;++a)n+=t[e+a-an]+t[e-1+a*an];W(1*(n>>4),t,e)},function(t,e){F(t,e,8)},function(t,e){let a;for(a=0;a<8;++a)o(t,e+a*an,t,e-an,8)},function(t,e){let a;for(a=0;a<8;++a)d(t,e+0,t[e-1],8),e+=an},function(t,e){let a,n=4;for(a=0;a<8;++a)n+=t[e-1+a*an];W(1*(n>>3),t,e)},function(t,e){let a,n=4;for(a=0;a<8;++a)n+=t[e+a-an];W(1*(n>>3),t,e)},function(t,e){W(128,t,e)}];let Zn,Mn,Wn,Vn,Hn,jn,Gn,Kn,Yn,qn,Jn,Xn,$n,Qn,tr,er;var ar=31,nr=[0,2,8],rr=3,ir=1,sr=[0+0*an,4+0*an,8+0*an,12+0*an,0+4*an,4+4*an,8+4*an,12+4*an,0+8*an,4+8*an,8+8*an,12+8*an,0+12*an,4+12*an,8+12*an,12+12*an],or=[4,5,6,7,8,9,10,10,11,12,13,14,15,16,17,17,18,19,20,20,21,21,22,22,23,23,24,25,25,26,27,28,29,30,31,32,33,34,35,36,37,37,38,39,40,41,42,43,44,45,46,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,76,77,78,79,80,81,82,83,84,85,86,87,88,89,91,93,95,96,98,100,101,102,104,106,108,110,112,114,116,118,122,124,126,128,130,132,134,136,138,140,143,145,148,151,154,157],lr=[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,177,181,185,189,193,197,201,205,209,213,217,221,225,229,234,239,245,249,254,259,264,269,274,279,284],fr=[-Za,1,-1,2,-2,3,4,6,-3,5,-4,-5,-6,7,-7,8,-8,-9],hr=[[[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]],[[253,136,254,255,228,219,128,128,128,128,128],[189,129,242,255,227,213,255,219,128,128,128],[106,126,227,252,214,209,255,255,128,128,128]],[[1,98,248,255,236,226,255,255,128,128,128],[181,133,238,254,221,234,255,154,128,128,128],[78,134,202,247,198,180,255,219,128,128,128]],[[1,185,249,255,243,255,128,128,128,128,128],[184,150,247,255,236,224,128,128,128,128,128],[77,110,216,255,236,230,128,128,128,128,128]],[[1,101,251,255,241,255,128,128,128,128,128],[170,139,241,252,236,209,255,255,128,128,128],[37,116,196,243,228,255,255,255,128,128,128]],[[1,204,254,255,245,255,128,128,128,128,128],[207,160,250,255,238,128,128,128,128,128,128],[102,103,231,255,211,171,128,128,128,128,128]],[[1,152,252,255,240,255,128,128,128,128,128],[177,135,243,255,234,225,128,128,128,128,128],[80,129,211,255,194,224,128,128,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[246,1,255,128,128,128,128,128,128,128,128],[255,128,128,128,128,128,128,128,128,128,128]]],[[[198,35,237,223,193,187,162,160,145,155,62],[131,45,198,221,172,176,220,157,252,221,1],[68,47,146,208,149,167,221,162,255,223,128]],[[1,149,241,255,221,224,255,255,128,128,128],[184,141,234,253,222,220,255,199,128,128,128],[81,99,181,242,176,190,249,202,255,255,128]],[[1,129,232,253,214,197,242,196,255,255,128],[99,121,210,250,201,198,255,202,128,128,128],[23,91,163,242,170,187,247,210,255,255,128]],[[1,200,246,255,234,255,128,128,128,128,128],[109,178,241,255,231,245,255,255,128,128,128],[44,130,201,253,205,192,255,255,128,128,128]],[[1,132,239,251,219,209,255,165,128,128,128],[94,136,225,251,218,190,255,255,128,128,128],[22,100,174,245,186,161,255,199,128,128,128]],[[1,182,249,255,232,235,128,128,128,128,128],[124,143,241,255,227,234,128,128,128,128,128],[35,77,181,251,193,211,255,205,128,128,128]],[[1,157,247,255,236,231,255,255,128,128,128],[121,141,235,255,225,227,255,255,128,128,128],[45,99,188,251,195,217,255,224,128,128,128]],[[1,1,251,255,213,255,128,128,128,128,128],[203,1,248,255,255,128,128,128,128,128,128],[137,1,177,255,224,255,128,128,128,128,128]]],[[[253,9,248,251,207,208,255,192,128,128,128],[175,13,224,243,193,185,249,198,255,255,128],[73,17,171,221,161,179,236,167,255,234,128]],[[1,95,247,253,212,183,255,255,128,128,128],[239,90,244,250,211,209,255,255,128,128,128],[155,77,195,248,188,195,255,255,128,128,128]],[[1,24,239,251,218,219,255,205,128,128,128],[201,51,219,255,196,186,128,128,128,128,128],[69,46,190,239,201,218,255,228,128,128,128]],[[1,191,251,255,255,128,128,128,128,128,128],[223,165,249,255,213,255,128,128,128,128,128],[141,124,248,255,255,128,128,128,128,128,128]],[[1,16,248,255,255,128,128,128,128,128,128],[190,36,230,255,236,255,128,128,128,128,128],[149,1,255,128,128,128,128,128,128,128,128]],[[1,226,255,128,128,128,128,128,128,128,128],[247,192,255,128,128,128,128,128,128,128,128],[240,128,255,128,128,128,128,128,128,128,128]],[[1,134,252,255,255,128,128,128,128,128,128],[213,62,250,255,255,128,128,128,128,128,128],[55,93,255,128,128,128,128,128,128,128,128]],[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]]],[[[202,24,213,235,186,191,220,160,240,175,255],[126,38,182,232,169,184,228,174,255,187,128],[61,46,138,219,151,178,240,170,255,216,128]],[[1,112,230,250,199,191,247,159,255,255,128],[166,109,228,252,211,215,255,174,128,128,128],[39,77,162,232,172,180,245,178,255,255,128]],[[1,52,220,246,198,199,249,220,255,255,128],[124,74,191,243,183,193,250,221,255,255,128],[24,71,130,219,154,170,243,182,255,255,128]],[[1,182,225,249,219,240,255,224,128,128,128],[149,150,226,252,216,205,255,171,128,128,128],[28,108,170,242,183,194,254,223,255,255,128]],[[1,81,230,252,204,203,255,192,128,128,128],[123,102,209,247,188,196,255,233,128,128,128],[20,95,153,243,164,173,255,203,128,128,128]],[[1,222,248,255,216,213,128,128,128,128,128],[168,175,246,252,235,205,255,255,128,128,128],[47,116,215,255,211,212,255,255,128,128,128]],[[1,121,236,253,212,214,255,255,128,128,128],[141,84,213,252,201,202,255,219,128,128,128],[42,80,160,240,162,185,255,205,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[244,1,255,128,128,128,128,128,128,128,128],[238,1,255,128,128,128,128,128,128,128,128]]]],cr=[[[231,120,48,89,115,113,120,152,112],[152,179,64,126,170,118,46,70,95],[175,69,143,80,85,82,72,155,103],[56,58,10,171,218,189,17,13,152],[114,26,17,163,44,195,21,10,173],[121,24,80,195,26,62,44,64,85],[144,71,10,38,171,213,144,34,26],[170,46,55,19,136,160,33,206,71],[63,20,8,114,114,208,12,9,226],[81,40,11,96,182,84,29,16,36]],[[134,183,89,137,98,101,106,165,148],[72,187,100,130,157,111,32,75,80],[66,102,167,99,74,62,40,234,128],[41,53,9,178,241,141,26,8,107],[74,43,26,146,73,166,49,23,157],[65,38,105,160,51,52,31,115,128],[104,79,12,27,217,255,87,17,7],[87,68,71,44,114,51,15,186,23],[47,41,14,110,182,183,21,17,194],[66,45,25,102,197,189,23,18,22]],[[88,88,147,150,42,46,45,196,205],[43,97,183,117,85,38,35,179,61],[39,53,200,87,26,21,43,232,171],[56,34,51,104,114,102,29,93,77],[39,28,85,171,58,165,90,98,64],[34,22,116,206,23,34,43,166,73],[107,54,32,26,51,1,81,43,31],[68,25,106,22,64,171,36,225,114],[34,19,21,102,132,188,16,76,124],[62,18,78,95,85,57,50,48,51]],[[193,101,35,159,215,111,89,46,111],[60,148,31,172,219,228,21,18,111],[112,113,77,85,179,255,38,120,114],[40,42,1,196,245,209,10,25,109],[88,43,29,140,166,213,37,43,154],[61,63,30,155,67,45,68,1,209],[100,80,8,43,154,1,51,26,71],[142,78,78,16,255,128,34,197,171],[41,40,5,102,211,183,4,1,221],[51,50,17,168,209,192,23,25,82]],[[138,31,36,171,27,166,38,44,229],[67,87,58,169,82,115,26,59,179],[63,59,90,180,59,166,93,73,154],[40,40,21,116,143,209,34,39,175],[47,15,16,183,34,223,49,45,183],[46,17,33,183,6,98,15,32,183],[57,46,22,24,128,1,54,17,37],[65,32,73,115,28,128,23,128,205],[40,3,9,115,51,192,18,6,223],[87,37,9,115,59,77,64,21,47]],[[104,55,44,218,9,54,53,130,226],[64,90,70,205,40,41,23,26,57],[54,57,112,184,5,41,38,166,213],[30,34,26,133,152,116,10,32,134],[39,19,53,221,26,114,32,73,255],[31,9,65,234,2,15,1,118,73],[75,32,12,51,192,255,160,43,51],[88,31,35,67,102,85,55,186,85],[56,21,23,111,59,205,45,37,192],[55,38,70,124,73,102,1,34,98]],[[125,98,42,88,104,85,117,175,82],[95,84,53,89,128,100,113,101,45],[75,79,123,47,51,128,81,171,1],[57,17,5,71,102,57,53,41,49],[38,33,13,121,57,73,26,1,85],[41,10,67,138,77,110,90,47,114],[115,21,2,10,102,255,166,23,6],[101,29,16,10,85,128,101,196,26],[57,18,10,102,102,213,34,20,43],[117,20,15,36,163,128,68,1,26]],[[102,61,71,37,34,53,31,243,192],[69,60,71,38,73,119,28,222,37],[68,45,128,34,1,47,11,245,171],[62,17,19,70,146,85,55,62,70],[37,43,37,154,100,163,85,160,1],[63,9,92,136,28,64,32,201,85],[75,15,9,9,64,255,184,119,16],[86,6,28,5,64,255,25,248,1],[56,8,17,132,137,255,55,116,128],[58,15,20,82,135,57,26,121,40]],[[164,50,31,137,154,133,25,35,218],[51,103,44,131,131,123,31,6,158],[86,40,64,135,148,224,45,183,128],[22,26,17,131,240,154,14,1,209],[45,16,21,91,64,222,7,1,197],[56,21,39,155,60,138,23,102,213],[83,12,13,54,192,255,68,47,28],[85,26,85,85,128,128,32,146,171],[18,11,7,63,144,171,4,4,246],[35,27,10,146,174,171,12,26,128]],[[190,80,35,99,180,80,126,54,45],[85,126,47,87,176,51,41,20,32],[101,75,128,139,118,146,116,128,85],[56,41,15,176,236,85,37,9,62],[71,30,17,119,118,255,17,18,138],[101,38,60,138,55,70,43,26,142],[146,36,19,30,171,255,97,27,20],[138,45,61,62,219,1,81,188,64],[32,41,20,117,151,142,20,21,163],[112,19,12,61,195,128,48,4,24]]],dr=[[[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[176,246,255,255,255,255,255,255,255,255,255],[223,241,252,255,255,255,255,255,255,255,255],[249,253,253,255,255,255,255,255,255,255,255]],[[255,244,252,255,255,255,255,255,255,255,255],[234,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255]],[[255,246,254,255,255,255,255,255,255,255,255],[239,253,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[251,255,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[251,254,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,254,253,255,254,255,255,255,255,255,255],[250,255,254,255,254,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[217,255,255,255,255,255,255,255,255,255,255],[225,252,241,253,255,255,254,255,255,255,255],[234,250,241,250,253,255,253,254,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[223,254,254,255,255,255,255,255,255,255,255],[238,253,254,254,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[249,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,255,255,255,255,255,255,255,255,255],[247,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[252,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[186,251,250,255,255,255,255,255,255,255,255],[234,251,244,254,255,255,255,255,255,255,255],[251,251,243,253,254,255,254,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[236,253,254,255,255,255,255,255,255,255,255],[251,253,253,254,254,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[254,254,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[254,254,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[248,255,255,255,255,255,255,255,255,255,255],[250,254,252,254,255,255,255,255,255,255,255],[248,254,249,253,255,255,255,255,255,255,255]],[[255,253,253,255,255,255,255,255,255,255,255],[246,253,253,255,255,255,255,255,255,255,255],[252,254,251,254,254,255,255,255,255,255,255]],[[255,254,252,255,255,255,255,255,255,255,255],[248,254,253,255,255,255,255,255,255,255,255],[253,255,254,254,255,255,255,255,255,255,255]],[[255,251,254,255,255,255,255,255,255,255,255],[245,251,254,255,255,255,255,255,255,255,255],[253,253,254,255,255,255,255,255,255,255,255]],[[255,251,253,255,255,255,255,255,255,255,255],[252,253,254,255,255,255,255,255,255,255,255],[255,254,255,255,255,255,255,255,255,255,255]],[[255,252,255,255,255,255,255,255,255,255,255],[249,255,254,255,255,255,255,255,255,255,255],[255,255,254,255,255,255,255,255,255,255,255]],[[255,255,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]]];this.WebPGetDecoderVersion=this.Ld=function(){return 512};var ur=[0,1,2,3,6,4,5,6,6,6,6,6,6,6,6,7,0],_r=[[173,148,140,0],[176,155,140,135,0],[180,157,141,134,130,0],[254,254,243,230,196,177,153,140,133,130,129,0]],br=[0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15],wr=w([tn,en],"");_(4,0);var pr=[[0,0,0,0],[1,0,0,0],[0,1,0,0],[1,1,0,0],[0,0,1,0],[1,0,1,0],[0,1,1,0],[1,1,1,0],[0,0,0,1],[1,0,0,1],[0,1,0,1],[1,1,0,1],[0,0,1,1],[1,0,1,1],[0,1,1,1],[1,1,1,1]],gr=134480385,mr=16,vr=-227,kr=482,yr=[zt,function(t){return t},function(t,e,a){return e[a+0]},function(t,e,a){return e[a+1]},function(t,e,a){return e[a-1]},function(t,e,a){return xt(xt(t,e[a+1]),e[a+0])},function(t,e,a){return xt(t,e[a-1])},function(t,e,a){return xt(t,e[a+0])},function(t,e,a){return xt(e[a-1],e[a+0])},function(t,e,a){return xt(e[a+0],e[a+1])},function(t,e,a){return xt(xt(t,e[a-1]),xt(e[a+0],e[a+1]))},function(t,e,a){return Math.abs((t>>24&255)-(e[a-1]>>24&255))-Math.abs((e[a+0]>>24&255)-(e[a-1]>>24&255))+(Math.abs((t>>16&255)-(e[a-1]>>16&255))-Math.abs((e[a+0]>>16&255)-(e[a-1]>>16&255)))+(Math.abs((t>>8&255)-(e[a-1]>>8&255))-Math.abs((e[a+0]>>8&255)-(e[a-1]>>8&255)))+(Math.abs((255&t)-(255&e[a-1]))-Math.abs((255&e[a+0])-(255&e[a-1])))<=0?e[a+0]:t},function(t,e,a){return(Tt((t>>24&255)+(e[a+0]>>24&255)-(e[a-1]>>24&255))<<24|Tt((t>>16&255)+(e[a+0]>>16&255)-(e[a-1]>>16&255))<<16|Tt((t>>8&255)+(e[a+0]>>8&255)-(e[a-1]>>8&255))<<8|Tt((255&t)+(255&e[a+0])-(255&e[a-1])))>>>0},function(t,e,a){const n=e[a-1];return(St((t=xt(t,e[a+0]))>>24&255,n>>24&255)<<24|St(t>>16&255,n>>16&255)<<16|St(t>>8&255,n>>8&255)<<8|St(t>>0&255,n>>0&255))>>>0},zt,zt],Ar={Cc:0,Bc:0,Kc:0},Er=16,Rr=16,Ur=16,xr=[2,3,7],Tr=[3,3,11],Sr=0,zr=1,Or=2,Dr=3,Ir=4,Nr=[pa+ga,pa,pa,pa,40],Pr=19,Br=[17,18,0,1,2,3,4,5,16,6,7,8,9,10,11,12,13,14,15],Lr=120,Cr=[24,7,23,25,40,6,39,41,22,26,38,42,56,5,55,57,21,27,54,58,37,43,72,4,71,73,20,28,53,59,70,74,36,44,88,69,75,52,60,3,87,89,19,29,86,90,35,45,68,76,85,91,51,61,104,2,103,105,18,30,102,106,34,46,84,92,67,77,101,107,50,62,120,1,119,121,83,93,17,31,100,108,66,78,118,122,33,47,117,123,49,63,99,109,82,94,0,116,124,65,79,16,32,98,110,48,115,125,81,95,64,114,126,97,111,80,113,127,96,112],Fr=1<>>0:0,r=t.byteLength-n;let i=n;(ArrayBuffer.isView(t)||t instanceof k)&&(t.byteLength!==t.buffer.byteLength&&(i=t.byteOffset+n),t=t.buffer),this.lastWrittenByte=a?r:0,this.buffer=t,this.length=r,this.byteLength=r,this.byteOffset=i,this.offset=0,this.littleEndian=!0,this._data=new DataView(this.buffer,i,r),this._mark=0,this._marks=[]}available(t=1){return this.offset+t<=this.length}isLittleEndian(){return this.littleEndian}setLittleEndian(){return this.littleEndian=!0,this}isBigEndian(){return!this.littleEndian}setBigEndian(){return this.littleEndian=!1,this}skip(t=1){return this.offset+=t,this}seek(t){return this.offset=t,this}mark(){return this._mark=this.offset,this}reset(){return this.offset=this._mark,this}pushMark(){return this._marks.push(this.offset),this}popMark(){const t=this._marks.pop();if(void 0===t)throw new Error("Mark stack empty");return this.seek(t),this}rewind(){return this.offset=0,this}ensureAvailable(t=1){if(!this.available(t)){const e=2*(this.offset+t),a=new Uint8Array(e);a.set(new Uint8Array(this.buffer)),this.buffer=a.buffer,this.length=this.byteLength=e,this._data=new DataView(this.buffer)}return this}readBoolean(){return 0!==this.readUint8()}readInt8(){return this._data.getInt8(this.offset++)}readUint8(){return this._data.getUint8(this.offset++)}readByte(){return this.readUint8()}readBytes(t=1){const e=new Uint8Array(t);for(let a=0;athis.lastWrittenByte&&(this.lastWrittenByte=this.offset)}} /*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */function y(t){let e=t.length;for(;--e>=0;)t[e]=0}const A=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),E=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),R=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),U=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),x=new Array(576);y(x);const T=new Array(60);y(T);const S=new Array(512);y(S);const z=new Array(256);y(z);const O=new Array(29);y(O);const D=new Array(30);function I(t,e,a,n,r){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=n,this.max_length=r,this.has_stree=t&&t.length}let N,P,B;function L(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}y(D);const C=t=>t<256?S[t]:S[256+(t>>>7)],F=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},Z=(t,e,a)=>{t.bi_valid>16-a?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<{Z(t,a[2*e],a[2*e+1])},W=(t,e)=>{let a=0;do{a|=1&t,t>>>=1,a<<=1}while(--e>0);return a>>>1},V=(t,e,a)=>{const n=new Array(16);let r,i,s=0;for(r=1;r<=15;r++)n[r]=s=s+a[r-1]<<1;for(i=0;i<=e;i++){let e=t[2*i+1];0!==e&&(t[2*i]=W(n[e]++,e))}},H=t=>{let e;for(e=0;e<286;e++)t.dyn_ltree[2*e]=0;for(e=0;e<30;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.last_lit=t.matches=0},G=t=>{t.bi_valid>8?F(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},K=(t,e,a,n)=>{const r=2*e,i=2*a;return t[r]{const n=t.heap[a];let r=a<<1;for(;r<=t.heap_len&&(r{let n,r,i,s,o=0;if(0!==t.last_lit)do{n=t.pending_buf[t.d_buf+2*o]<<8|t.pending_buf[t.d_buf+2*o+1],r=t.pending_buf[t.l_buf+o],o++,0===n?M(t,r,e):(i=z[r],M(t,i+256+1,e),s=A[i],0!==s&&(r-=O[i],Z(t,r,s)),n--,i=C(n),M(t,i,a),s=E[i],0!==s&&(n-=D[i],Z(t,n,s)))}while(o{const a=e.dyn_tree,n=e.stat_desc.static_tree,r=e.stat_desc.has_stree,i=e.stat_desc.elems;let s,o,l,f=-1;for(t.heap_len=0,t.heap_max=573,s=0;s>1;s>=1;s--)Y(t,a,s);l=i;do{s=t.heap[1],t.heap[1]=t.heap[t.heap_len--],Y(t,a,1),o=t.heap[1],t.heap[--t.heap_max]=s,t.heap[--t.heap_max]=o,a[2*l]=a[2*s]+a[2*o],t.depth[l]=(t.depth[s]>=t.depth[o]?t.depth[s]:t.depth[o])+1,a[2*s+1]=a[2*o+1]=l,t.heap[1]=l++,Y(t,a,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const a=e.dyn_tree,n=e.max_code,r=e.stat_desc.static_tree,i=e.stat_desc.has_stree,s=e.stat_desc.extra_bits,o=e.stat_desc.extra_base,l=e.stat_desc.max_length;let f,h,c,d,u,_,b=0;for(d=0;d<=15;d++)t.bl_count[d]=0;for(a[2*t.heap[t.heap_max]+1]=0,f=t.heap_max+1;f<573;f++)h=t.heap[f],d=a[2*a[2*h+1]+1]+1,d>l&&(d=l,b++),a[2*h+1]=d,h>n||(t.bl_count[d]++,u=0,h>=o&&(u=s[h-o]),_=a[2*h],t.opt_len+=_*(d+u),i&&(t.static_len+=_*(r[2*h+1]+u)));if(0!==b){do{for(d=l-1;0===t.bl_count[d];)d--;t.bl_count[d]--,t.bl_count[d+1]+=2,t.bl_count[l]--,b-=2}while(b>0);for(d=l;0!==d;d--)for(h=t.bl_count[d];0!==h;)c=t.heap[--f],c>n||(a[2*c+1]!==d&&(t.opt_len+=(d-a[2*c+1])*a[2*c],a[2*c+1]=d),h--)}})(t,e),V(a,f,t.bl_count)},X=(t,e,a)=>{let n,r,i=-1,s=e[1],o=0,l=7,f=4;for(0===s&&(l=138,f=3),e[2*(a+1)+1]=65535,n=0;n<=a;n++)r=s,s=e[2*(n+1)+1],++o{let n,r,i=-1,s=e[1],o=0,l=7,f=4;for(0===s&&(l=138,f=3),n=0;n<=a;n++)if(r=s,s=e[2*(n+1)+1],!(++o{Z(t,0+(n?1:0),3),((t,e,a,n)=>{G(t),n&&(F(t,a),F(t,~a)),t.pending_buf.set(t.window.subarray(e,e+a),t.pending),t.pending+=a})(t,e,a,!0)};var et={_tr_init:t=>{Q||((()=>{let t,e,a,n,r;const i=new Array(16);for(a=0,n=0;n<28;n++)for(O[n]=a,t=0;t<1<>=7;n<30;n++)for(D[n]=r<<7,t=0;t<1<{let r,i,s=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,a=4093624447;for(e=0;e<=31;e++,a>>>=1)if(1&a&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<256;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0})(t)),J(t,t.l_desc),J(t,t.d_desc),s=(t=>{let e;for(X(t,t.dyn_ltree,t.l_desc.max_code),X(t,t.dyn_dtree,t.d_desc.max_code),J(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*U[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),r=t.opt_len+3+7>>>3,i=t.static_len+3+7>>>3,i<=r&&(r=i)):r=i=a+5,a+4<=r&&-1!==e?tt(t,e,a,n):4===t.strategy||i===r?(Z(t,2+(n?1:0),3),q(t,x,T)):(Z(t,4+(n?1:0),3),((t,e,a,n)=>{let r;for(Z(t,e-257,5),Z(t,a-1,5),Z(t,n-4,4),r=0;r(t.pending_buf[t.d_buf+2*t.last_lit]=e>>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&a,t.last_lit++,0===e?t.dyn_ltree[2*a]++:(t.matches++,e--,t.dyn_ltree[2*(z[a]+256+1)]++,t.dyn_dtree[2*C(e)]++),t.last_lit===t.lit_bufsize-1),_tr_align:t=>{Z(t,2,3),M(t,256,x),(t=>{16===t.bi_valid?(F(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var at=(t,e,a,n)=>{let r=65535&t|0,i=t>>>16&65535|0,s=0;for(;0!==a;){s=a>2e3?2e3:a,a-=s;do{r=r+e[n++]|0,i=i+r|0}while(--s);r%=65521,i%=65521}return r|i<<16|0};const nt=new Uint32Array((()=>{let t,e=[];for(var a=0;a<256;a++){t=a;for(var n=0;n<8;n++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e})());var rt=(t,e,a,n)=>{const r=nt,i=n+a;t^=-1;for(let a=n;a>>8^r[255&(t^e[a])];return-1^t},it={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},st={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:ot,_tr_stored_block:lt,_tr_flush_block:ft,_tr_tally:ht,_tr_align:ct}=et,{Z_NO_FLUSH:dt,Z_PARTIAL_FLUSH:ut,Z_FULL_FLUSH:_t,Z_FINISH:bt,Z_BLOCK:wt,Z_OK:pt,Z_STREAM_END:gt,Z_STREAM_ERROR:mt,Z_DATA_ERROR:vt,Z_BUF_ERROR:kt,Z_DEFAULT_COMPRESSION:yt,Z_FILTERED:At,Z_HUFFMAN_ONLY:Et,Z_RLE:Rt,Z_FIXED:Ut,Z_DEFAULT_STRATEGY:xt,Z_UNKNOWN:Tt,Z_DEFLATED:St}=st,zt=(t,e)=>(t.msg=it[e],e),Ot=t=>(t<<1)-(t>4?9:0),Dt=t=>{let e=t.length;for(;--e>=0;)t[e]=0};let It=(t,e,a)=>(e<{const e=t.state;let a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},Pt=(t,e)=>{ft(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,Nt(t.strm)},Bt=(t,e)=>{t.pending_buf[t.pending++]=e},Lt=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Ct=(t,e,a,n)=>{let r=t.avail_in;return r>n&&(r=n),0===r?0:(t.avail_in-=r,e.set(t.input.subarray(t.next_in,t.next_in+r),a),1===t.state.wrap?t.adler=at(t.adler,e,r,a):2===t.state.wrap&&(t.adler=rt(t.adler,e,r,a)),t.next_in+=r,t.total_in+=r,r)},Ft=(t,e)=>{let a,n,r=t.max_chain_length,i=t.strstart,s=t.prev_length,o=t.nice_match;const l=t.strstart>t.w_size-262?t.strstart-(t.w_size-262):0,f=t.window,h=t.w_mask,c=t.prev,d=t.strstart+258;let u=f[i+s-1],_=f[i+s];t.prev_length>=t.good_match&&(r>>=2),o>t.lookahead&&(o=t.lookahead);do{if(a=e,f[a+s]===_&&f[a+s-1]===u&&f[a]===f[i]&&f[++a]===f[i+1]){i+=2,a++;do{}while(f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&f[++i]===f[++a]&&is){if(t.match_start=e,s=n,n>=o)break;u=f[i+s-1],_=f[i+s]}}}while((e=c[e&h])>l&&0!=--r);return s<=t.lookahead?s:t.lookahead},Zt=t=>{const e=t.w_size;let a,n,r,i,s;do{if(i=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-262)){t.window.set(t.window.subarray(e,e+e),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,n=t.hash_size,a=n;do{r=t.head[--a],t.head[a]=r>=e?r-e:0}while(--n);n=e,a=n;do{r=t.prev[--a],t.prev[a]=r>=e?r-e:0}while(--n);i+=e}if(0===t.strm.avail_in)break;if(n=Ct(t.strm,t.window,t.strstart+t.lookahead,i),t.lookahead+=n,t.lookahead+t.insert>=3)for(s=t.strstart-t.insert,t.ins_h=t.window[s],t.ins_h=It(t,t.ins_h,t.window[s+1]);t.insert&&(t.ins_h=It(t,t.ins_h,t.window[s+3-1]),t.prev[s&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=s,s++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead<262&&0!==t.strm.avail_in)},Mt=(t,e)=>{let a,n;for(;;){if(t.lookahead<262){if(Zt(t),t.lookahead<262&&e===dt)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=It(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-262&&(t.match_length=Ft(t,a)),t.match_length>=3)if(n=ht(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=It(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=It(t,t.ins_h,t.window[t.strstart+1]);else n=ht(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(n&&(Pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Pt(t,!1),0===t.strm.avail_out)?1:2},Wt=(t,e)=>{let a,n,r;for(;;){if(t.lookahead<262){if(Zt(t),t.lookahead<262&&e===dt)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=It(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){r=t.strstart+t.lookahead-3,n=ht(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=r&&(t.ins_h=It(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,n&&(Pt(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(n=ht(t,0,t.window[t.strstart-1]),n&&Pt(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(n=ht(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Pt(t,!1),0===t.strm.avail_out)?1:2};function Vt(t,e,a,n,r){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=n,this.func=r}const Ht=[new Vt(0,0,0,0,(t,e)=>{let a=65535;for(a>t.pending_buf_size-5&&(a=t.pending_buf_size-5);;){if(t.lookahead<=1){if(Zt(t),0===t.lookahead&&e===dt)return 1;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;const n=t.block_start+a;if((0===t.strstart||t.strstart>=n)&&(t.lookahead=t.strstart-n,t.strstart=n,Pt(t,!1),0===t.strm.avail_out))return 1;if(t.strstart-t.block_start>=t.w_size-262&&(Pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):(t.strstart>t.block_start&&(Pt(t,!1),t.strm.avail_out),1)}),new Vt(4,4,8,4,Mt),new Vt(4,5,16,8,Mt),new Vt(4,6,32,32,Mt),new Vt(4,4,16,16,Wt),new Vt(8,16,32,32,Wt),new Vt(8,16,128,128,Wt),new Vt(8,32,128,256,Wt),new Vt(32,128,258,1024,Wt),new Vt(32,258,258,4096,Wt)];function jt(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=St,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),Dt(this.dyn_ltree),Dt(this.dyn_dtree),Dt(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),Dt(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),Dt(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Gt=t=>{if(!t||!t.state)return zt(t,mt);t.total_in=t.total_out=0,t.data_type=Tt;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=e.wrap?42:113,t.adler=2===e.wrap?0:1,e.last_flush=dt,ot(e),pt},Kt=t=>{const e=Gt(t);return e===pt&&(t=>{t.window_size=2*t.w_size,Dt(t.head),t.max_lazy_match=Ht[t.level].max_lazy,t.good_match=Ht[t.level].good_length,t.nice_match=Ht[t.level].nice_length,t.max_chain_length=Ht[t.level].max_chain,t.strstart=0,t.block_start=0,t.lookahead=0,t.insert=0,t.match_length=t.prev_length=2,t.match_available=0,t.ins_h=0})(t.state),e},Yt=(t,e,a,n,r,i)=>{if(!t)return mt;let s=1;if(e===yt&&(e=6),n<0?(s=0,n=-n):n>15&&(s=2,n-=16),r<1||r>9||a!==St||n<8||n>15||e<0||e>9||i<0||i>Ut)return zt(t,mt);8===n&&(n=9);const o=new jt;return t.state=o,o.strm=t,o.wrap=s,o.gzhead=null,o.w_bits=n,o.w_size=1<Yt(t,e,St,15,8,xt),deflateInit2:Yt,deflateReset:Kt,deflateResetKeep:Gt,deflateSetHeader:(t,e)=>t&&t.state?2!==t.state.wrap?mt:(t.state.gzhead=e,pt):mt,deflate:(t,e)=>{let a,n;if(!t||!t.state||e>wt||e<0)return t?zt(t,mt):mt;const r=t.state;if(!t.output||!t.input&&0!==t.avail_in||666===r.status&&e!==bt)return zt(t,0===t.avail_out?kt:mt);r.strm=t;const i=r.last_flush;if(r.last_flush=e,42===r.status)if(2===r.wrap)t.adler=0,Bt(r,31),Bt(r,139),Bt(r,8),r.gzhead?(Bt(r,(r.gzhead.text?1:0)+(r.gzhead.hcrc?2:0)+(r.gzhead.extra?4:0)+(r.gzhead.name?8:0)+(r.gzhead.comment?16:0)),Bt(r,255&r.gzhead.time),Bt(r,r.gzhead.time>>8&255),Bt(r,r.gzhead.time>>16&255),Bt(r,r.gzhead.time>>24&255),Bt(r,9===r.level?2:r.strategy>=Et||r.level<2?4:0),Bt(r,255&r.gzhead.os),r.gzhead.extra&&r.gzhead.extra.length&&(Bt(r,255&r.gzhead.extra.length),Bt(r,r.gzhead.extra.length>>8&255)),r.gzhead.hcrc&&(t.adler=rt(t.adler,r.pending_buf,r.pending,0)),r.gzindex=0,r.status=69):(Bt(r,0),Bt(r,0),Bt(r,0),Bt(r,0),Bt(r,0),Bt(r,9===r.level?2:r.strategy>=Et||r.level<2?4:0),Bt(r,3),r.status=113);else{let e=St+(r.w_bits-8<<4)<<8,a=-1;a=r.strategy>=Et||r.level<2?0:r.level<6?1:6===r.level?2:3,e|=a<<6,0!==r.strstart&&(e|=32),e+=31-e%31,r.status=113,Lt(r,e),0!==r.strstart&&(Lt(r,t.adler>>>16),Lt(r,65535&t.adler)),t.adler=1}if(69===r.status)if(r.gzhead.extra){for(a=r.pending;r.gzindex<(65535&r.gzhead.extra.length)&&(r.pending!==r.pending_buf_size||(r.gzhead.hcrc&&r.pending>a&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),Nt(t),a=r.pending,r.pending!==r.pending_buf_size));)Bt(r,255&r.gzhead.extra[r.gzindex]),r.gzindex++;r.gzhead.hcrc&&r.pending>a&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),r.gzindex===r.gzhead.extra.length&&(r.gzindex=0,r.status=73)}else r.status=73;if(73===r.status)if(r.gzhead.name){a=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>a&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),Nt(t),a=r.pending,r.pending===r.pending_buf_size)){n=1;break}n=r.gzindexa&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),0===n&&(r.gzindex=0,r.status=91)}else r.status=91;if(91===r.status)if(r.gzhead.comment){a=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>a&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),Nt(t),a=r.pending,r.pending===r.pending_buf_size)){n=1;break}n=r.gzindexa&&(t.adler=rt(t.adler,r.pending_buf,r.pending-a,a)),0===n&&(r.status=103)}else r.status=103;if(103===r.status&&(r.gzhead.hcrc?(r.pending+2>r.pending_buf_size&&Nt(t),r.pending+2<=r.pending_buf_size&&(Bt(r,255&t.adler),Bt(r,t.adler>>8&255),t.adler=0,r.status=113)):r.status=113),0!==r.pending){if(Nt(t),0===t.avail_out)return r.last_flush=-1,pt}else if(0===t.avail_in&&Ot(e)<=Ot(i)&&e!==bt)return zt(t,kt);if(666===r.status&&0!==t.avail_in)return zt(t,kt);if(0!==t.avail_in||0!==r.lookahead||e!==dt&&666!==r.status){let a=r.strategy===Et?((t,e)=>{let a;for(;;){if(0===t.lookahead&&(Zt(t),0===t.lookahead)){if(e===dt)return 1;break}if(t.match_length=0,a=ht(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(Pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Pt(t,!1),0===t.strm.avail_out)?1:2})(r,e):r.strategy===Rt?((t,e)=>{let a,n,r,i;const s=t.window;for(;;){if(t.lookahead<=258){if(Zt(t),t.lookahead<=258&&e===dt)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(r=t.strstart-1,n=s[r],n===s[++r]&&n===s[++r]&&n===s[++r])){i=t.strstart+258;do{}while(n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&rt.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=ht(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=ht(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(Pt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===bt?(Pt(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(Pt(t,!1),0===t.strm.avail_out)?1:2})(r,e):Ht[r.level].func(r,e);if(3!==a&&4!==a||(r.status=666),1===a||3===a)return 0===t.avail_out&&(r.last_flush=-1),pt;if(2===a&&(e===ut?ct(r):e!==wt&&(lt(r,0,0,!1),e===_t&&(Dt(r.head),0===r.lookahead&&(r.strstart=0,r.block_start=0,r.insert=0))),Nt(t),0===t.avail_out))return r.last_flush=-1,pt}return e!==bt?pt:r.wrap<=0?gt:(2===r.wrap?(Bt(r,255&t.adler),Bt(r,t.adler>>8&255),Bt(r,t.adler>>16&255),Bt(r,t.adler>>24&255),Bt(r,255&t.total_in),Bt(r,t.total_in>>8&255),Bt(r,t.total_in>>16&255),Bt(r,t.total_in>>24&255)):(Lt(r,t.adler>>>16),Lt(r,65535&t.adler)),Nt(t),r.wrap>0&&(r.wrap=-r.wrap),0!==r.pending?pt:gt)},deflateEnd:t=>{if(!t||!t.state)return mt;const e=t.state.status;return 42!==e&&69!==e&&73!==e&&91!==e&&103!==e&&113!==e&&666!==e?zt(t,mt):(t.state=null,113===e?zt(t,vt):pt)},deflateSetDictionary:(t,e)=>{let a=e.length;if(!t||!t.state)return mt;const n=t.state,r=n.wrap;if(2===r||1===r&&42!==n.status||n.lookahead)return mt;if(1===r&&(t.adler=at(t.adler,e,a,0)),n.wrap=0,a>=n.w_size){0===r&&(Dt(n.head),n.strstart=0,n.block_start=0,n.insert=0);let t=new Uint8Array(n.w_size);t.set(e.subarray(a-n.w_size,a),0),e=t,a=n.w_size}const i=t.avail_in,s=t.next_in,o=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,Zt(n);n.lookahead>=3;){let t=n.strstart,e=n.lookahead-2;do{n.ins_h=It(n,n.ins_h,n.window[t+3-1]),n.prev[t&n.w_mask]=n.head[n.ins_h],n.head[n.ins_h]=t,t++}while(--e);n.strstart=t,n.lookahead=2,Zt(n)}return n.strstart+=n.lookahead,n.block_start=n.strstart,n.insert=n.lookahead,n.lookahead=0,n.match_length=n.prev_length=2,n.match_available=0,t.next_in=s,t.input=o,t.avail_in=i,n.wrap=r,pt},deflateInfo:"pako deflate (from Nodeca project)"};const Jt=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var Xt=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const e in a)Jt(a,e)&&(t[e]=a[e])}}return t},$t=t=>{let e=0;for(let a=0,n=t.length;a=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;te[254]=te[254]=1;var ee=t=>{let e,a,n,r,i,s=t.length,o=0;for(r=0;r>>6,e[i++]=128|63&a):a<65536?(e[i++]=224|a>>>12,e[i++]=128|a>>>6&63,e[i++]=128|63&a):(e[i++]=240|a>>>18,e[i++]=128|a>>>12&63,e[i++]=128|a>>>6&63,e[i++]=128|63&a);return e},ae=(t,e)=>{let a,n;const r=e||t.length,i=new Array(2*r);for(n=0,a=0;a4)i[n++]=65533,a+=s-1;else{for(e&=2===s?31:3===s?15:7;s>1&&a1?i[n++]=65533:e<65536?i[n++]=e:(e-=65536,i[n++]=55296|e>>10&1023,i[n++]=56320|1023&e)}}return((t,e)=>{if(e<65534&&t.subarray&&Qt)return String.fromCharCode.apply(null,t.length===e?t:t.subarray(0,e));let a="";for(let n=0;n{(e=e||t.length)>t.length&&(e=t.length);let a=e-1;for(;a>=0&&128==(192&t[a]);)a--;return a<0||0===a?e:a+te[t[a]]>e?a:e};var re=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const ie=Object.prototype.toString,{Z_NO_FLUSH:se,Z_SYNC_FLUSH:oe,Z_FULL_FLUSH:le,Z_FINISH:fe,Z_OK:he,Z_STREAM_END:ce,Z_DEFAULT_COMPRESSION:de,Z_DEFAULT_STRATEGY:ue,Z_DEFLATED:_e}=st;function be(t){this.options=Xt({level:de,method:_e,chunkSize:16384,windowBits:15,memLevel:8,strategy:ue},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new re,this.strm.avail_out=0;let a=qt.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==he)throw new Error(it[a]);if(e.header&&qt.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?ee(e.dictionary):"[object ArrayBuffer]"===ie.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,a=qt.deflateSetDictionary(this.strm,t),a!==he)throw new Error(it[a]);this._dict_set=!0}}function we(t,e){const a=new be(e);if(a.push(t,!0),a.err)throw a.msg||it[a.err];return a.result}be.prototype.push=function(t,e){const a=this.strm,n=this.options.chunkSize;let r,i;if(this.ended)return!1;for(i=e===~~e?e:!0===e?fe:se,"string"==typeof t?a.input=ee(t):"[object ArrayBuffer]"===ie.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;)if(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),(i===oe||i===le)&&a.avail_out<=6)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else{if(r=qt.deflate(a,i),r===ce)return a.next_out>0&&this.onData(a.output.subarray(0,a.next_out)),r=qt.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===he;if(0!==a.avail_out){if(i>0&&a.next_out>0)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else if(0===a.avail_in)break}else this.onData(a.output)}return!0},be.prototype.onData=function(t){this.chunks.push(t)},be.prototype.onEnd=function(t){t===he&&(this.result=$t(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var pe={Deflate:be,deflate:we,deflateRaw:function(t,e){return(e=e||{}).raw=!0,we(t,e)},gzip:function(t,e){return(e=e||{}).gzip=!0,we(t,e)},constants:st};var ge=function(t,e){let a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,p,g,m,v,k,y,A,E,R;const U=t.state;a=t.next_in,E=t.input,n=a+(t.avail_in-5),r=t.next_out,R=t.output,i=r-(e-t.avail_out),s=r+(t.avail_out-257),o=U.dmax,l=U.wsize,f=U.whave,h=U.wnext,c=U.window,d=U.hold,u=U.bits,_=U.lencode,b=U.distcode,w=(1<>>24,d>>>=m,u-=m,m=g>>>16&255,0===m)R[r++]=65535&g;else{if(!(16&m)){if(0==(64&m)){g=_[(65535&g)+(d&(1<>>=m,u-=m),u<15&&(d+=E[a++]<>>24,d>>>=m,u-=m,m=g>>>16&255,!(16&m)){if(0==(64&m)){g=b[(65535&g)+(d&(1<o){t.msg="invalid distance too far back",U.mode=30;break t}if(d>>>=m,u-=m,m=r-i,k>m){if(m=k-m,m>f&&U.sane){t.msg="invalid distance too far back",U.mode=30;break t}if(y=0,A=c,0===h){if(y+=l-m,m2;)R[r++]=A[y++],R[r++]=A[y++],R[r++]=A[y++],v-=3;v&&(R[r++]=A[y++],v>1&&(R[r++]=A[y++]))}else{y=r-k;do{R[r++]=R[y++],R[r++]=R[y++],R[r++]=R[y++],v-=3}while(v>2);v&&(R[r++]=R[y++],v>1&&(R[r++]=R[y++]))}break}}break}}while(a>3,a-=v,u-=v<<3,d&=(1<{const l=o.bits;let f,h,c,d,u,_,b=0,w=0,p=0,g=0,m=0,v=0,k=0,y=0,A=0,E=0,R=null,U=0;const x=new Uint16Array(16),T=new Uint16Array(16);let S,z,O,D=null,I=0;for(b=0;b<=15;b++)x[b]=0;for(w=0;w=1&&0===x[g];g--);if(m>g&&(m=g),0===g)return r[i++]=20971520,r[i++]=20971520,o.bits=1,0;for(p=1;p0&&(0===t||1!==g))return-1;for(T[1]=0,b=1;b<15;b++)T[b+1]=T[b]+x[b];for(w=0;w852||2===t&&A>592)return 1;for(;;){S=b-k,s[w]<_?(z=0,O=s[w]):s[w]>_?(z=D[I+s[w]],O=R[U+s[w]]):(z=96,O=0),f=1<>k)+h]=S<<24|z<<16|O|0}while(0!==h);for(f=1<>=1;if(0!==f?(E&=f-1,E+=f):E=0,w++,0==--x[b]){if(b===g)break;b=e[a+s[w]]}if(b>m&&(E&d)!==c){for(0===k&&(k=m),u+=p,v=b-k,y=1<852||2===t&&A>592)return 1;c=E&d,r[c]=m<<24|v<<16|u-i|0}}return 0!==E&&(r[u+E]=b-k<<24|64<<16|0),o.bits=m,0};const{Z_FINISH:Ee,Z_BLOCK:Re,Z_TREES:Ue,Z_OK:xe,Z_STREAM_END:Te,Z_NEED_DICT:Se,Z_STREAM_ERROR:ze,Z_DATA_ERROR:Oe,Z_MEM_ERROR:De,Z_BUF_ERROR:Ie,Z_DEFLATED:Ne}=st,Pe=t=>(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24);function Be(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Le=t=>{if(!t||!t.state)return ze;const e=t.state;return t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=1,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(852),e.distcode=e.distdyn=new Int32Array(592),e.sane=1,e.back=-1,xe},Ce=t=>{if(!t||!t.state)return ze;const e=t.state;return e.wsize=0,e.whave=0,e.wnext=0,Le(t)},Fe=(t,e)=>{let a;if(!t||!t.state)return ze;const n=t.state;return e<0?(a=0,e=-e):(a=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?ze:(null!==n.window&&n.wbits!==e&&(n.window=null),n.wrap=a,n.wbits=e,Ce(t))},Ze=(t,e)=>{if(!t)return ze;const a=new Be;t.state=a,a.window=null;const n=Fe(t,e);return n!==xe&&(t.state=null),n};let Me,We,Ve=!0;const He=t=>{if(Ve){Me=new Int32Array(512),We=new Int32Array(32);let e=0;for(;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(Ae(1,t.lens,0,288,Me,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;Ae(2,t.lens,0,32,We,0,t.work,{bits:5}),Ve=!1}t.lencode=Me,t.lenbits=9,t.distcode=We,t.distbits=5},je=(t,e,a,n)=>{let r;const i=t.state;return null===i.window&&(i.wsize=1<=i.wsize?(i.window.set(e.subarray(a-i.wsize,a),0),i.wnext=0,i.whave=i.wsize):(r=i.wsize-i.wnext,r>n&&(r=n),i.window.set(e.subarray(a-n,a-n+r),i.wnext),(n-=r)?(i.window.set(e.subarray(a-n,a),0),i.wnext=n,i.whave=i.wsize):(i.wnext+=r,i.wnext===i.wsize&&(i.wnext=0),i.whaveZe(t,15),inflateInit2:Ze,inflate:(t,e)=>{let a,n,r,i,s,o,l,f,h,c,d,u,_,b,w,p,g,m,v,k,y,A,E=0;const R=new Uint8Array(4);let U,x;const T=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!t||!t.state||!t.output||!t.input&&0!==t.avail_in)return ze;a=t.state,12===a.mode&&(a.mode=13),s=t.next_out,r=t.output,l=t.avail_out,i=t.next_in,n=t.input,o=t.avail_in,f=a.hold,h=a.bits,c=o,d=l,A=xe;t:for(;;)switch(a.mode){case 1:if(0===a.wrap){a.mode=13;break}for(;h<16;){if(0===o)break t;o--,f+=n[i++]<>>8&255,a.check=rt(a.check,R,2,0),f=0,h=0,a.mode=2;break}if(a.flags=0,a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&f)<<8)+(f>>8))%31){t.msg="incorrect header check",a.mode=30;break}if((15&f)!==Ne){t.msg="unknown compression method",a.mode=30;break}if(f>>>=4,h-=4,y=8+(15&f),0===a.wbits)a.wbits=y;else if(y>a.wbits){t.msg="invalid window size",a.mode=30;break}a.dmax=1<>8&1),512&a.flags&&(R[0]=255&f,R[1]=f>>>8&255,a.check=rt(a.check,R,2,0)),f=0,h=0,a.mode=3;case 3:for(;h<32;){if(0===o)break t;o--,f+=n[i++]<>>8&255,R[2]=f>>>16&255,R[3]=f>>>24&255,a.check=rt(a.check,R,4,0)),f=0,h=0,a.mode=4;case 4:for(;h<16;){if(0===o)break t;o--,f+=n[i++]<>8),512&a.flags&&(R[0]=255&f,R[1]=f>>>8&255,a.check=rt(a.check,R,2,0)),f=0,h=0,a.mode=5;case 5:if(1024&a.flags){for(;h<16;){if(0===o)break t;o--,f+=n[i++]<>>8&255,a.check=rt(a.check,R,2,0)),f=0,h=0}else a.head&&(a.head.extra=null);a.mode=6;case 6:if(1024&a.flags&&(u=a.length,u>o&&(u=o),u&&(a.head&&(y=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Uint8Array(a.head.extra_len)),a.head.extra.set(n.subarray(i,i+u),y)),512&a.flags&&(a.check=rt(a.check,n,u,i)),o-=u,i+=u,a.length-=u),a.length))break t;a.length=0,a.mode=7;case 7:if(2048&a.flags){if(0===o)break t;u=0;do{y=n[i+u++],a.head&&y&&a.length<65536&&(a.head.name+=String.fromCharCode(y))}while(y&&u>9&1,a.head.done=!0),t.adler=a.check=0,a.mode=12;break;case 10:for(;h<32;){if(0===o)break t;o--,f+=n[i++]<>>=7&h,h-=7&h,a.mode=27;break}for(;h<3;){if(0===o)break t;o--,f+=n[i++]<>>=1,h-=1,3&f){case 0:a.mode=14;break;case 1:if(He(a),a.mode=20,e===Ue){f>>>=2,h-=2;break t}break;case 2:a.mode=17;break;case 3:t.msg="invalid block type",a.mode=30}f>>>=2,h-=2;break;case 14:for(f>>>=7&h,h-=7&h;h<32;){if(0===o)break t;o--,f+=n[i++]<>>16^65535)){t.msg="invalid stored block lengths",a.mode=30;break}if(a.length=65535&f,f=0,h=0,a.mode=15,e===Ue)break t;case 15:a.mode=16;case 16:if(u=a.length,u){if(u>o&&(u=o),u>l&&(u=l),0===u)break t;r.set(n.subarray(i,i+u),s),o-=u,i+=u,l-=u,s+=u,a.length-=u;break}a.mode=12;break;case 17:for(;h<14;){if(0===o)break t;o--,f+=n[i++]<>>=5,h-=5,a.ndist=1+(31&f),f>>>=5,h-=5,a.ncode=4+(15&f),f>>>=4,h-=4,a.nlen>286||a.ndist>30){t.msg="too many length or distance symbols",a.mode=30;break}a.have=0,a.mode=18;case 18:for(;a.have>>=3,h-=3}for(;a.have<19;)a.lens[T[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,U={bits:a.lenbits},A=Ae(0,a.lens,0,19,a.lencode,0,a.work,U),a.lenbits=U.bits,A){t.msg="invalid code lengths set",a.mode=30;break}a.have=0,a.mode=19;case 19:for(;a.have>>24,p=E>>>16&255,g=65535&E,!(w<=h);){if(0===o)break t;o--,f+=n[i++]<>>=w,h-=w,a.lens[a.have++]=g;else{if(16===g){for(x=w+2;h>>=w,h-=w,0===a.have){t.msg="invalid bit length repeat",a.mode=30;break}y=a.lens[a.have-1],u=3+(3&f),f>>>=2,h-=2}else if(17===g){for(x=w+3;h>>=w,h-=w,y=0,u=3+(7&f),f>>>=3,h-=3}else{for(x=w+7;h>>=w,h-=w,y=0,u=11+(127&f),f>>>=7,h-=7}if(a.have+u>a.nlen+a.ndist){t.msg="invalid bit length repeat",a.mode=30;break}for(;u--;)a.lens[a.have++]=y}}if(30===a.mode)break;if(0===a.lens[256]){t.msg="invalid code -- missing end-of-block",a.mode=30;break}if(a.lenbits=9,U={bits:a.lenbits},A=Ae(1,a.lens,0,a.nlen,a.lencode,0,a.work,U),a.lenbits=U.bits,A){t.msg="invalid literal/lengths set",a.mode=30;break}if(a.distbits=6,a.distcode=a.distdyn,U={bits:a.distbits},A=Ae(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,U),a.distbits=U.bits,A){t.msg="invalid distances set",a.mode=30;break}if(a.mode=20,e===Ue)break t;case 20:a.mode=21;case 21:if(o>=6&&l>=258){t.next_out=s,t.avail_out=l,t.next_in=i,t.avail_in=o,a.hold=f,a.bits=h,ge(t,d),s=t.next_out,r=t.output,l=t.avail_out,i=t.next_in,n=t.input,o=t.avail_in,f=a.hold,h=a.bits,12===a.mode&&(a.back=-1);break}for(a.back=0;E=a.lencode[f&(1<>>24,p=E>>>16&255,g=65535&E,!(w<=h);){if(0===o)break t;o--,f+=n[i++]<>m)],w=E>>>24,p=E>>>16&255,g=65535&E,!(m+w<=h);){if(0===o)break t;o--,f+=n[i++]<>>=m,h-=m,a.back+=m}if(f>>>=w,h-=w,a.back+=w,a.length=g,0===p){a.mode=26;break}if(32&p){a.back=-1,a.mode=12;break}if(64&p){t.msg="invalid literal/length code",a.mode=30;break}a.extra=15&p,a.mode=22;case 22:if(a.extra){for(x=a.extra;h>>=a.extra,h-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=23;case 23:for(;E=a.distcode[f&(1<>>24,p=E>>>16&255,g=65535&E,!(w<=h);){if(0===o)break t;o--,f+=n[i++]<>m)],w=E>>>24,p=E>>>16&255,g=65535&E,!(m+w<=h);){if(0===o)break t;o--,f+=n[i++]<>>=m,h-=m,a.back+=m}if(f>>>=w,h-=w,a.back+=w,64&p){t.msg="invalid distance code",a.mode=30;break}a.offset=g,a.extra=15&p,a.mode=24;case 24:if(a.extra){for(x=a.extra;h>>=a.extra,h-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){t.msg="invalid distance too far back",a.mode=30;break}a.mode=25;case 25:if(0===l)break t;if(u=d-l,a.offset>u){if(u=a.offset-u,u>a.whave&&a.sane){t.msg="invalid distance too far back",a.mode=30;break}u>a.wnext?(u-=a.wnext,_=a.wsize-u):_=a.wnext-u,u>a.length&&(u=a.length),b=a.window}else b=r,_=s-a.offset,u=a.length;u>l&&(u=l),l-=u,a.length-=u;do{r[s++]=b[_++]}while(--u);0===a.length&&(a.mode=21);break;case 26:if(0===l)break t;r[s++]=a.length,l--,a.mode=21;break;case 27:if(a.wrap){for(;h<32;){if(0===o)break t;o--,f|=n[i++]<{if(!t||!t.state)return ze;let e=t.state;return e.window&&(e.window=null),t.state=null,xe},inflateGetHeader:(t,e)=>{if(!t||!t.state)return ze;const a=t.state;return 0==(2&a.wrap)?ze:(a.head=e,e.done=!1,xe)},inflateSetDictionary:(t,e)=>{const a=e.length;let n,r,i;return t&&t.state?(n=t.state,0!==n.wrap&&11!==n.mode?ze:11===n.mode&&(r=1,r=at(r,e,a,0),r!==n.check)?Oe:(i=je(t,e,a,a),i?(n.mode=31,De):(n.havedict=1,xe))):ze},inflateInfo:"pako inflate (from Nodeca project)"};var Ke=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Ye=Object.prototype.toString,{Z_NO_FLUSH:qe,Z_FINISH:Je,Z_OK:Xe,Z_STREAM_END:$e,Z_NEED_DICT:Qe,Z_STREAM_ERROR:ta,Z_DATA_ERROR:ea,Z_MEM_ERROR:aa}=st;function na(t){this.options=Xt({chunkSize:65536,windowBits:15,to:""},t||{});const e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new re,this.strm.avail_out=0;let a=Ge.inflateInit2(this.strm,e.windowBits);if(a!==Xe)throw new Error(it[a]);if(this.header=new Ke,Ge.inflateGetHeader(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=ee(e.dictionary):"[object ArrayBuffer]"===Ye.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(a=Ge.inflateSetDictionary(this.strm,e.dictionary),a!==Xe)))throw new Error(it[a])}function ra(t,e){const a=new na(e);if(a.push(t),a.err)throw a.msg||it[a.err];return a.result}na.prototype.push=function(t,e){const a=this.strm,n=this.options.chunkSize,r=this.options.dictionary;let i,s,o;if(this.ended)return!1;for(s=e===~~e?e:!0===e?Je:qe,"[object ArrayBuffer]"===Ye.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),i=Ge.inflate(a,s),i===Qe&&r&&(i=Ge.inflateSetDictionary(a,r),i===Xe?i=Ge.inflate(a,s):i===ea&&(i=Qe));a.avail_in>0&&i===$e&&a.state.wrap>0&&0!==t[a.next_in];)Ge.inflateReset(a),i=Ge.inflate(a,s);switch(i){case ta:case ea:case Qe:case aa:return this.onEnd(i),this.ended=!0,!1}if(o=a.avail_out,a.next_out&&(0===a.avail_out||i===$e))if("string"===this.options.to){let t=ne(a.output,a.next_out),e=a.next_out-t,r=ae(a.output,t);a.next_out=e,a.avail_out=n-e,e&&a.output.set(a.output.subarray(t,t+e),0),this.onData(r)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(i!==Xe||0!==o){if(i===$e)return i=Ge.inflateEnd(this.strm),this.onEnd(i),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},na.prototype.onData=function(t){this.chunks.push(t)},na.prototype.onEnd=function(t){t===Xe&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=$t(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var ia={Inflate:na,inflate:ra,inflateRaw:function(t,e){return(e=e||{}).raw=!0,ra(t,e)},ungzip:ra,constants:st};const{Deflate:sa,deflate:oa,deflateRaw:la,gzip:fa}=pe,{Inflate:ha,inflate:ca,inflateRaw:da,ungzip:ua}=ia;var _a=oa;const ba=[137,80,78,71,13,10,26,10],wa=[];for(let t=0;t<256;t++){let e=t;for(let t=0;t<8;t++)1&e?e=3988292384^e>>>1:e>>>=1;wa[t]=e}function pa(t,e){return(4294967295^function(t,e,a){let n=t;for(let t=0;t>>8;return n}(4294967295,t,e))>>>0}var ga,ma,va,ka;!function(t){t[t.UNKNOWN=-1]="UNKNOWN",t[t.GREYSCALE=0]="GREYSCALE",t[t.TRUECOLOUR=2]="TRUECOLOUR",t[t.INDEXED_COLOUR=3]="INDEXED_COLOUR",t[t.GREYSCALE_ALPHA=4]="GREYSCALE_ALPHA",t[t.TRUECOLOUR_ALPHA=6]="TRUECOLOUR_ALPHA"}(ga||(ga={})),function(t){t[t.UNKNOWN=-1]="UNKNOWN",t[t.DEFLATE=0]="DEFLATE"}(ma||(ma={})),function(t){t[t.UNKNOWN=-1]="UNKNOWN",t[t.ADAPTIVE=0]="ADAPTIVE"}(va||(va={})),function(t){t[t.UNKNOWN=-1]="UNKNOWN",t[t.NO_INTERLACE=0]="NO_INTERLACE",t[t.ADAM7=1]="ADAM7"}(ka||(ka={}));new Uint8Array(0);const ya=new Uint16Array([255]);new Uint8Array(ya.buffer)[0];const Aa={level:3};class Ea extends k{constructor(t,e={}){super(),this._colorType=ga.UNKNOWN,this._zlibOptions=Object.assign({},Aa,e.zlib),this._png=this._checkData(t),this.setBigEndian()}encode(){return this.encodeSignature(),this.encodeIHDR(),this.encodeData(),this.encodeIEND(),this.toArray()}encodeSignature(){this.writeBytes(ba)}encodeIHDR(){this.writeUint32(13),this.writeChars("IHDR"),this.writeUint32(this._png.width),this.writeUint32(this._png.height),this.writeByte(this._png.depth),this.writeByte(this._colorType),this.writeByte(ma.DEFLATE),this.writeByte(va.ADAPTIVE),this.writeByte(ka.NO_INTERLACE),this.writeCrc(17)}encodeIEND(){this.writeUint32(0),this.writeChars("IEND"),this.writeCrc(4)}encodeIDAT(t){this.writeUint32(t.length),this.writeChars("IDAT"),this.writeBytes(t),this.writeCrc(t.length+4)}encodeData(){const{width:t,height:e,channels:a,depth:n,data:r}=this._png,i=a*t,s=(new k).setBigEndian();let o=0;for(let t=0;t0)return t;throw new TypeError(e+" must be a positive integer")}function Ua(t,e,a,n){for(let r=0;r{var e;e=t.data,Oa.push(e),Ia()})}]); -//# sourceMappingURL=webp.worker.bd598dc02a03fd59d71a.bundle.worker.js.map \ No newline at end of file +//# sourceMappingURL=webp.worker.b00d941ab33d112bf66c.bundle.worker.js.map \ No newline at end of file diff --git a/public/webp.worker.b00d941ab33d112bf66c.bundle.worker.js.map b/public/webp.worker.b00d941ab33d112bf66c.bundle.worker.js.map new file mode 100644 index 000000000..6c5b88bc7 --- /dev/null +++ b/public/webp.worker.b00d941ab33d112bf66c.bundle.worker.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webp.worker.bd598dc02a03fd59d71a.bundle.worker.js"],"names":["modules","installedModules","__webpack_require__","moduleId","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","scope","FastTextEncoder","utfLabel","RangeError","FastTextDecoder","options","fatal","Error","encode","string","stream","pos","len","length","at","tlen","Math","max","target","Uint8Array","charCodeAt","extra","update","set","slice","decode","buffer","bytes","out","byte1","push","byte2","byte3","codepoint","String","fromCharCode","apply","window","self","this","__webpack_exports__","libwebp_0_2_0_i","libwebp_0_2_0_self","M","F","JSON","parse","stringify","N","G","w","D","S","Nb","ic","rc","memmove","arr1","index1","arr2","index2","jd","kd","ga","U","ld","md","$","WebPDecoder","a","Ob","Pb","Bb","Qb","b","la","e","Z","gc","bc","qa","Ia","Rb","ya","T","Q","g","L","fa","Sb","Da","gf","hf","ma","Pa","gb","nd","Y","jf","ja","jc","k","h","kc","od","Tb","pd","Ea","qd","P","v","Ga","ub","Xb","f","q","u","C","Ub","kf","lf","rd","Vb","A","z","sd","td","na","put","ud","Mb","vd","wd","ka","fd","width","height","Wa","Cb","Ka","xd","Db","lc","V","Ha","mf","sa","nf","zd","ta","Ua","wc","vc","I","Ba","Aa","J","Qa","Cc","Fc","Jb","yd","ua","parseInt","Ra","cb","RGBA","Sa","size","Va","y","Wc","B","nb","Rc","rb","Uc","Wb","Fa","of","mb","Ad","pf","qf","mc","nc","rf","Dc","oa","Yb","Zb","sc","oc","Bd","va","Cd","tc","Dd","Ed","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Fd","$b","Cf","Df","Ef","Ec","wa","Gd","xc","alert","za","Hd","Id","Jd","Gc","data","Kd","ia","W","pa","offset","Ac","fb","Jc","Nc","gd","hd","Ma","hb","K","R","Ta","Ff","Ca","pb","ob","tb","Kb","Lb","uc","$c","xa","Ld","Ab","Oc","Fb","kb","Hc","Lc","Gf","Hb","yb","Ic","sb","qc","Hf","Zc","Md","Nd","Kc","If","pc","Pc","fc","dd","cd","Mc","Jf","Kf","Lf","Mf","Nf","Za","lb","Ya","wb","Ja","qb","WebPWorkerReset","Qd","Rd","Ud","FinishRow","jb","Od","Of","Pf","Pd","Gb","ib","dc","Xc","Sc","Vc","Sd","ha","H","ca","da","aa","ba","ra","La","Qc","Td","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Qf","db","X","cc","O","Eb","Rf","Sf","de","ee","fe","ge","Tc","Oa","Tf","ea","ab","Xa","he","vb","xb","ac","ie","Uf","$a","Vf","je","zb","zc","yc","eb","WebPWorkerSync","OK","hc","WebPWorkerLaunch","Ib","Na","ec","Bc","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","Wf","xe","Yc","ye","bd","ze","Ae","Be","Ce","De","Xf","Ee","Yf","EmitRescaledRows","WebPApplyAlphaMultiply","WebPApplyAlphaMultiply4444","Fe","EmitRescaledRowsYUVA","EmitRowsYUVA","Ge","Zf","$f","ag","bg","ad","bb","cg","He","dg","End","Ie","eg","Je","Array","fg","gg","hg","Ke","ig","jg","Le","Me","kg","lg","mg","pg","qg","Oe","Pe","Qe","Re","rg","Se","Te","Ue","Ve","sg","tg","j","ug","vg","wg","xg","We","yg","zg","memory","Ne","InitRGBRescaler","InitYUVRescaler","Xe","ed","Ye","Ag","Bg","Ze","$e","af","bf","cf","ng","AllocateAndInitRescaler","og","Cg","df","ef","WEBP_CSP_MODE","VP8StatusCode","rotate","WebPGetFeatures","ff","WebPDecoderConfig","input","WebPInitDecoderConfig","pow","Dg","Eg","Fg","Gg","id","Hg","Ig","Jg","Kg","WebPFreeDecBuffer","WebPGetDecoderVersion","abs","WebPDecode","utf8_browser_decoder","TextDecoder","utf8_browser_encoder","TextEncoder","IOBuffer_IOBuffer","[object Object]","dataIsGiven","ArrayBuffer","lastWrittenByte","byteLength","dvOffset","isView","byteOffset","littleEndian","_data","DataView","_mark","_marks","pop","undefined","seek","available","newLength","newArray","readUint8","getInt8","getUint8","readByte","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","readInt8","result","readChar","readBytes","writeUint8","ensureAvailable","setInt8","_updateLastWrittenByte","setUint8","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","str","writeBytes","zero","buf","extra_lbits","extra_dbits","extra_blbits","bl_order","static_ltree","static_dtree","D_CODES","_dist_code","_length_code","MAX_MATCH","base_length","base_dist","StaticTreeDesc","static_tree","extra_bits","extra_base","elems","max_length","has_stree","static_l_desc","static_d_desc","static_bl_desc","TreeDesc","dyn_tree","stat_desc","max_code","d_code","dist","put_short","pending_buf","pending","send_bits","bi_valid","bi_buf","send_code","tree","bi_reverse","code","res","gen_codes","bl_count","next_code","MAX_BITS","bits","init_block","LITERALS","dyn_ltree","dyn_dtree","bl_tree","END_BLOCK","opt_len","static_len","last_lit","matches","bi_windup","smaller","depth","_n2","_m2","pqdownheap","heap","heap_len","compress_block","ltree","dtree","lx","d_buf","l_buf","build_tree","desc","stree","node","heap_max","base","xbits","overflow","gen_bitlen","scan_tree","curlen","prevlen","nextlen","count","max_count","min_count","REP_3_6","REPZ_3_10","REPZ_11_138","send_tree","static_init_done","_tr_stored_block","stored_len","last","header","subarray","copy_block","trees","_tr_init","LENGTH_CODES","L_CODES","tr_static_init","l_desc","d_desc","bl_desc","_tr_flush_block","opt_lenb","static_lenb","max_blindex","level","strm","data_type","black_mask","detect_data_type","BL_CODES","build_bl_tree","strategy","lcodes","dcodes","blcodes","rank","send_all_trees","_tr_tally","lit_bufsize","_tr_align","STATIC_TREES","bi_flush","adler32_1","adler","s1","s2","crcTable","Uint32Array","table","makeTable","crc32_1","crc","end","messages","2","1","0","-1","-2","-3","-4","-5","-6","constants","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","_tr_init$1","_tr_stored_block$1","_tr_flush_block$1","_tr_tally$1","_tr_align$1","Z_FIXED$1","Z_UNKNOWN$1","err","errorCode","msg","zero$1","HASH","prev","hash_shift","hash_mask","flush_pending","state","avail_out","output","pending_out","next_out","total_out","flush_block_only","block_start","strstart","put_byte","putShortMSB","read_buf","start","avail_in","next_in","wrap","total_in","longest_match","cur_match","match","chain_length","max_chain_length","scan","best_len","prev_length","nice_match","limit","w_size","_win","wmask","w_mask","strend","scan_end1","scan_end","good_match","lookahead","match_start","fill_window","_w_size","more","window_size","hash_size","head","insert","ins_h","deflate_fast","flush","hash_head","bflush","match_length","max_lazy_match","MIN_MATCH$1","deflate_slow","max_insert","prev_match","match_available","Config","good_length","max_lazy","nice_length","max_chain","func","configuration_table","max_block_size","pending_buf_size","max_start","DeflateState","status","gzhead","gzindex","method","last_flush","w_bits","hash_bits","Uint16Array","HEAP_SIZE$1","MAX_BITS$1","deflateResetKeep","deflateReset","ret","lm_init","deflateInit2","windowBits","memLevel","deflate_1","deflateInit","deflateSetHeader","deflate","beg","val","old_flush","text","hcrc","comment","time","os","level_flags","bstate","deflate_huff","deflate_rle","deflateEnd","deflateSetDictionary","dictionary","dictLength","tmpDict","avail","next","deflateInfo","_has","obj","common","sources","arguments","source","shift","TypeError","chunks","chunk","STR_APPLY_UIA_OK","__","_utf8len","strings","c2","m_pos","str_len","buf_len","utf16buf","c_len","buf2binstring","zstream","pako_esm_toString","toString","Z_NO_FLUSH$1","Z_FULL_FLUSH$1","Z_FINISH$1","Z_OK$1","Z_STREAM_END$1","Z_DEFAULT_COMPRESSION$1","Z_DEFAULT_STRATEGY$1","Z_DEFLATED$1","Deflate","chunkSize","opt","raw","gzip","ended","dict","_dict_set","deflate$1","deflator","flush_mode","_flush_mode","onData","onEnd","deflate_1$1","deflateRaw","inffast","_in","_out","dmax","wsize","whave","wnext","s_window","hold","lcode","dcode","lmask","dmask","here","op","from","from_source","lencode","distcode","lenbits","distbits","top","dolen","dodist","sane","lbase","lext","dbase","dext","inftrees","type","lens","lens_index","codes","table_index","work","opts","incr","fill","low","mask","sym","min","root","curr","drop","left","used","huff","base_index","MAXBITS","offs","here_bits","here_op","here_val","extra_index","Z_FINISH$2","Z_BLOCK$1","Z_OK$2","Z_STREAM_END$2","Z_STREAM_ERROR$1","Z_DATA_ERROR$1","Z_BUF_ERROR$1","Z_DEFLATED$2","zswap32","InflateState","havedict","flags","check","total","wbits","ncode","nlen","ndist","have","lendyn","distdyn","back","was","inflateResetKeep","Int32Array","inflateReset","inflateReset2","inflateInit2","lenfix","distfix","virgin","fixedtables","updatewindow","src","copy","inflate_1","inflateInit","inflate","last_bits","last_op","last_val","hbuf","order","inf_leave","done","xflags","extra_len","inflateEnd","inflateGetHeader","inflateSetDictionary","dictid","inflateInfo","gzheader","toString$1","Z_NO_FLUSH$2","Z_FINISH$3","Z_OK$3","Z_STREAM_END$3","Z_NEED_DICT$1","Z_STREAM_ERROR$2","Z_DATA_ERROR$2","Z_MEM_ERROR$1","Inflate","to","inflate$1","inflator","last_avail_out","next_out_utf8","tail","utf8str","join","inflate_1$1","inflateRaw","ungzip","Deflate$1","deflate$2","deflateRaw$1","gzip$1","Inflate$1","inflate$2","inflateRaw$1","ungzip$1","deflate_1$2","pngSignature","common_crcTable","currentCrc","updateCrc","ColorType","CompressionMethod","FilterMethod","InterlaceMethod","uint16","defaultZlibOptions","PNGEncoder_PNGEncoder","super","_colorType","UNKNOWN","_zlibOptions","assign","zlib","_png","_checkData","setBigEndian","encodeSignature","encodeIHDR","encodeData","encodeIEND","toArray","writeUint32","writeChars","writeByte","DEFLATE","ADAPTIVE","NO_INTERLACE","writeCrc","channels","slotsPerLine","newData","writeDataBytes","writeDataUint16","compressed","encodeIDAT","colorType","returnValue","TRUECOLOUR_ALPHA","TRUECOLOUR","GREYSCALE","GREYSCALE_ALPHA","getColorType","png","checkInteger","expectedSize","Number","isInteger","writeUint16","ResolutionUnitSpecifier","webp2png","decoder","config","bitstream","rgbaData","ctx","tasks","finishTask","processTasks","task","fileName","payload","convertedBytes","console","error","postMessage","addEventListener","event"],"mappings":"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K,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,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD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","file":"webp.worker.b00d941ab33d112bf66c.bundle.worker.js","sourceRoot":""} \ No newline at end of file diff --git a/public/webp.worker.bd598dc02a03fd59d71a.bundle.worker.js.map b/public/webp.worker.bd598dc02a03fd59d71a.bundle.worker.js.map deleted file mode 100644 index c5d4265fc..000000000 --- a/public/webp.worker.bd598dc02a03fd59d71a.bundle.worker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/iobuffer/lib-esm/text-encoding-polyfill.js","webpack:///./src/vendor/libwebp-0.2.0.js","webpack:///./node_modules/iobuffer/lib-esm/utf8.browser.js","webpack:///./node_modules/iobuffer/lib-esm/IOBuffer.js","webpack:///./node_modules/fast-png/node_modules/pako/dist/pako.esm.mjs","webpack:///./node_modules/fast-png/lib-esm/common.js","webpack:///./node_modules/fast-png/lib-esm/internalTypes.js","webpack:///./node_modules/fast-png/lib-esm/PNGDecoder.js","webpack:///./node_modules/fast-png/lib-esm/PNGEncoder.js","webpack:///./node_modules/fast-png/lib-esm/types.js","webpack:///./src/lib/webp/webp.ts","webpack:///./node_modules/fast-png/lib-esm/index.js","webpack:///./src/lib/webp/webp.worker.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","scope","FastTextEncoder","utfLabel","RangeError","FastTextDecoder","options","fatal","Error","encode","string","stream","pos","len","length","at","tlen","Math","max","target","Uint8Array","charCodeAt","extra","update","set","slice","decode","buffer","bytes","out","byte1","push","byte2","byte3","codepoint","String","fromCharCode","apply","window","self","this","M","F","JSON","parse","stringify","N","G","w","D","S","Nb","ic","rc","memmove","arr1","index1","arr2","index2","jd","kd","ga","U","ld","md","$","WebPDecoder","a","Ob","Pb","Bb","Qb","b","la","e","Z","gc","bc","qa","Ia","Rb","ya","T","Q","g","L","fa","Sb","Da","gf","hf","ma","Pa","gb","nd","Y","jf","ja","jc","k","h","kc","od","Tb","pd","Ea","qd","P","v","Ga","ub","Xb","f","q","u","C","Ub","kf","lf","rd","Vb","A","z","sd","td","na","put","ud","Mb","vd","wd","ka","fd","width","height","Wa","Cb","Ka","xd","Db","lc","V","Ha","mf","sa","nf","zd","ta","Ua","wc","vc","I","Ba","Aa","J","Qa","Cc","Fc","Jb","yd","ua","parseInt","Ra","cb","RGBA","Sa","size","Va","y","Wc","B","nb","Rc","rb","Uc","Wb","Fa","of","mb","Ad","pf","qf","mc","nc","rf","Dc","oa","Yb","Zb","sc","oc","Bd","va","Cd","tc","Dd","Ed","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Fd","$b","Cf","Df","Ef","Ec","wa","Gd","xc","alert","za","Hd","Id","Jd","Gc","data","Kd","ia","W","pa","offset","Ac","fb","Jc","Nc","gd","hd","Ma","hb","K","R","Ta","Ff","Ca","pb","ob","tb","Kb","Lb","uc","$c","xa","Ld","Ab","Oc","Fb","kb","Hc","Lc","Gf","Hb","yb","Ic","sb","qc","Hf","Zc","Md","Nd","Kc","If","pc","Pc","fc","dd","cd","Mc","Jf","Kf","Lf","Mf","Nf","Za","lb","Ya","wb","Ja","qb","WebPWorkerReset","Qd","Rd","Ud","FinishRow","jb","Od","Of","Pf","Pd","Gb","ib","dc","Xc","Sc","Vc","Sd","ha","H","ca","da","aa","ba","ra","La","Qc","Td","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Qf","db","X","cc","O","Eb","Rf","Sf","de","ee","fe","ge","Tc","Oa","Tf","ea","ab","Xa","he","vb","xb","ac","ie","Uf","$a","Vf","je","zb","zc","yc","eb","WebPWorkerSync","OK","hc","WebPWorkerLaunch","Ib","Na","ec","Bc","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","Wf","xe","Yc","ye","bd","ze","Ae","Be","Ce","De","Xf","Ee","Yf","EmitRescaledRows","WebPApplyAlphaMultiply","WebPApplyAlphaMultiply4444","Fe","EmitRescaledRowsYUVA","EmitRowsYUVA","Ge","Zf","$f","ag","bg","ad","bb","cg","He","dg","End","Ie","eg","Je","Array","fg","gg","hg","Ke","ig","jg","Le","Me","kg","lg","mg","pg","qg","Oe","Pe","Qe","Re","rg","Se","Te","Ue","Ve","sg","tg","j","ug","vg","wg","xg","We","yg","zg","memory","Ne","InitRGBRescaler","InitYUVRescaler","Xe","ed","Ye","Ag","Bg","Ze","$e","af","bf","cf","ng","AllocateAndInitRescaler","og","Cg","df","ef","WEBP_CSP_MODE","VP8StatusCode","rotate","WebPGetFeatures","ff","WebPDecoderConfig","input","WebPInitDecoderConfig","pow","Dg","Eg","Fg","Gg","id","Hg","Ig","Jg","Kg","WebPFreeDecBuffer","WebPGetDecoderVersion","abs","WebPDecode","TextDecoder","TextEncoder","dataIsGiven","ArrayBuffer","lastWrittenByte","byteLength","dvOffset","isView","byteOffset","littleEndian","_data","DataView","_mark","_marks","pop","undefined","seek","available","newLength","newArray","readUint8","getInt8","getUint8","readByte","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","readInt8","result","readChar","readBytes","writeUint8","ensureAvailable","setInt8","_updateLastWrittenByte","setUint8","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","str","writeBytes","zero","buf","extra_lbits","extra_dbits","extra_blbits","bl_order","static_ltree","static_dtree","D_CODES","_dist_code","_length_code","MAX_MATCH","base_length","base_dist","StaticTreeDesc","static_tree","extra_bits","extra_base","elems","max_length","has_stree","static_l_desc","static_d_desc","static_bl_desc","TreeDesc","dyn_tree","stat_desc","max_code","d_code","dist","put_short","pending_buf","pending","send_bits","bi_valid","bi_buf","send_code","tree","bi_reverse","code","res","gen_codes","bl_count","next_code","MAX_BITS","bits","init_block","LITERALS","dyn_ltree","dyn_dtree","bl_tree","END_BLOCK","opt_len","static_len","last_lit","matches","bi_windup","smaller","depth","_n2","_m2","pqdownheap","heap","heap_len","compress_block","ltree","dtree","lx","d_buf","l_buf","build_tree","desc","stree","node","heap_max","base","xbits","overflow","gen_bitlen","scan_tree","curlen","prevlen","nextlen","count","max_count","min_count","REP_3_6","REPZ_3_10","REPZ_11_138","send_tree","static_init_done","_tr_stored_block","stored_len","last","header","subarray","copy_block","trees","_tr_init","LENGTH_CODES","L_CODES","tr_static_init","l_desc","d_desc","bl_desc","_tr_flush_block","opt_lenb","static_lenb","max_blindex","level","strm","data_type","black_mask","detect_data_type","BL_CODES","build_bl_tree","strategy","lcodes","dcodes","blcodes","rank","send_all_trees","_tr_tally","lit_bufsize","_tr_align","STATIC_TREES","bi_flush","adler32_1","adler","s1","s2","crcTable","Uint32Array","table","makeTable","crc32_1","crc","end","messages","2","1","0","constants","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","_tr_init$1","_tr_stored_block$1","_tr_flush_block$1","_tr_tally$1","_tr_align$1","Z_FIXED$1","Z_UNKNOWN$1","err","errorCode","msg","zero$1","HASH","prev","hash_shift","hash_mask","flush_pending","state","avail_out","output","pending_out","next_out","total_out","flush_block_only","block_start","strstart","put_byte","putShortMSB","read_buf","start","avail_in","next_in","wrap","total_in","longest_match","cur_match","match","chain_length","max_chain_length","scan","best_len","prev_length","nice_match","limit","w_size","_win","wmask","w_mask","strend","scan_end1","scan_end","good_match","lookahead","match_start","fill_window","_w_size","more","window_size","hash_size","head","insert","ins_h","deflate_fast","flush","hash_head","bflush","match_length","max_lazy_match","MIN_MATCH$1","deflate_slow","max_insert","prev_match","match_available","Config","good_length","max_lazy","nice_length","max_chain","func","configuration_table","max_block_size","pending_buf_size","max_start","DeflateState","status","gzhead","gzindex","method","last_flush","w_bits","hash_bits","Uint16Array","HEAP_SIZE$1","MAX_BITS$1","deflateResetKeep","deflateReset","ret","lm_init","deflateInit2","windowBits","memLevel","deflate_1","deflateInit","deflateSetHeader","deflate","beg","val","old_flush","text","hcrc","comment","time","os","level_flags","bstate","deflate_huff","deflate_rle","deflateEnd","deflateSetDictionary","dictionary","dictLength","tmpDict","avail","next","deflateInfo","_has","obj","common","sources","arguments","source","shift","TypeError","chunks","chunk","STR_APPLY_UIA_OK","__","_utf8len","strings","c2","m_pos","str_len","buf_len","utf16buf","c_len","buf2binstring","zstream","toString","Z_NO_FLUSH$1","Z_FULL_FLUSH$1","Z_FINISH$1","Z_OK$1","Z_STREAM_END$1","Z_DEFAULT_COMPRESSION$1","Z_DEFAULT_STRATEGY$1","Z_DEFLATED$1","Deflate","chunkSize","opt","raw","gzip","ended","dict","_dict_set","deflate$1","deflator","flush_mode","_flush_mode","onData","onEnd","deflate_1$1","deflateRaw","inffast","_in","_out","dmax","wsize","whave","wnext","s_window","hold","lcode","dcode","lmask","dmask","here","op","from","from_source","lencode","distcode","lenbits","distbits","top","dolen","dodist","sane","lbase","lext","dbase","dext","inftrees","type","lens","lens_index","codes","table_index","work","opts","incr","fill","low","mask","sym","min","root","curr","drop","left","used","huff","base_index","MAXBITS","offs","here_bits","here_op","here_val","extra_index","Z_FINISH$2","Z_BLOCK$1","Z_OK$2","Z_STREAM_END$2","Z_STREAM_ERROR$1","Z_DATA_ERROR$1","Z_BUF_ERROR$1","Z_DEFLATED$2","zswap32","InflateState","havedict","flags","check","total","wbits","ncode","nlen","ndist","have","lendyn","distdyn","back","was","inflateResetKeep","Int32Array","inflateReset","inflateReset2","inflateInit2","lenfix","distfix","virgin","fixedtables","updatewindow","src","copy","inflate_1","inflateInit","inflate","last_bits","last_op","last_val","hbuf","order","inf_leave","done","xflags","extra_len","inflateEnd","inflateGetHeader","inflateSetDictionary","dictid","inflateInfo","gzheader","toString$1","Z_NO_FLUSH$2","Z_FINISH$3","Z_OK$3","Z_STREAM_END$3","Z_NEED_DICT$1","Z_STREAM_ERROR$2","Z_DATA_ERROR$2","Z_MEM_ERROR$1","Inflate","to","inflate$1","inflator","last_avail_out","next_out_utf8","tail","utf8str","join","inflate_1$1","inflateRaw","ungzip","Deflate$1","deflate$2","deflateRaw$1","gzip$1","Inflate$1","inflate$2","inflateRaw$1","ungzip$1","deflate_1$2","pngSignature","currentCrc","updateCrc","ColorType","CompressionMethod","FilterMethod","InterlaceMethod","uint16","defaultZlibOptions","super","_colorType","UNKNOWN","_zlibOptions","assign","zlib","_png","_checkData","setBigEndian","encodeSignature","encodeIHDR","encodeData","encodeIEND","toArray","writeUint32","writeChars","writeByte","DEFLATE","ADAPTIVE","NO_INTERLACE","writeCrc","channels","slotsPerLine","newData","writeDataBytes","writeDataUint16","compressed","encodeIDAT","colorType","returnValue","TRUECOLOUR_ALPHA","TRUECOLOUR","GREYSCALE","GREYSCALE_ALPHA","getColorType","png","checkInteger","expectedSize","Number","isInteger","writeUint16","ResolutionUnitSpecifier","webp2png","decoder","config","bitstream","rgbaData","ctx","tasks","finishTask","processTasks","task","fileName","payload","convertedBytes","console","error","postMessage","addEventListener","event"],"mappings":"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CnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClC,IAAK,IAAK,KAEZ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IACnB,IAAK,IAAK,IAAK,IAAK,IAAK,KAE3B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAIzC,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAA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","file":"webp.worker.bd598dc02a03fd59d71a.bundle.worker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","\"use strict\";\n/*\n * Copyright 2017 Sam Thorogood. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n(function (scope) {\n 'use strict';\n // fail early\n if (scope['TextEncoder'] && scope['TextDecoder']) {\n return false;\n }\n /**\n * @constructor\n * @param {string=} utfLabel\n */\n function FastTextEncoder(utfLabel = 'utf-8') {\n if (utfLabel !== 'utf-8') {\n throw new RangeError(`Failed to construct 'TextEncoder': The encoding label provided ('${utfLabel}') is invalid.`);\n }\n }\n Object.defineProperty(FastTextEncoder.prototype, 'encoding', {\n value: 'utf-8',\n });\n /**\n * @param {string} string\n * @param {{stream: boolean}=} options\n * @return {!Uint8Array}\n */\n FastTextEncoder.prototype.encode = function (string, options = { stream: false }) {\n if (options.stream) {\n throw new Error(`Failed to encode: the 'stream' option is unsupported.`);\n }\n let pos = 0;\n const len = string.length;\n const out = [];\n let at = 0; // output position\n let tlen = Math.max(32, len + (len >> 1) + 7); // 1.5x size\n let target = new Uint8Array((tlen >> 3) << 3); // ... but at 8 byte offset\n while (pos < len) {\n let value = string.charCodeAt(pos++);\n if (value >= 0xd800 && value <= 0xdbff) {\n // high surrogate\n if (pos < len) {\n const extra = string.charCodeAt(pos);\n if ((extra & 0xfc00) === 0xdc00) {\n ++pos;\n value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n }\n }\n if (value >= 0xd800 && value <= 0xdbff) {\n continue; // drop lone surrogate\n }\n }\n // expand the buffer if we couldn't write 4 bytes\n if (at + 4 > target.length) {\n tlen += 8; // minimum extra\n tlen *= 1.0 + (pos / string.length) * 2; // take 2x the remaining\n tlen = (tlen >> 3) << 3; // 8 byte offset\n const update = new Uint8Array(tlen);\n update.set(target);\n target = update;\n }\n if ((value & 0xffffff80) === 0) {\n // 1-byte\n target[at++] = value; // ASCII\n continue;\n }\n else if ((value & 0xfffff800) === 0) {\n // 2-byte\n target[at++] = ((value >> 6) & 0x1f) | 0xc0;\n }\n else if ((value & 0xffff0000) === 0) {\n // 3-byte\n target[at++] = ((value >> 12) & 0x0f) | 0xe0;\n target[at++] = ((value >> 6) & 0x3f) | 0x80;\n }\n else if ((value & 0xffe00000) === 0) {\n // 4-byte\n target[at++] = ((value >> 18) & 0x07) | 0xf0;\n target[at++] = ((value >> 12) & 0x3f) | 0x80;\n target[at++] = ((value >> 6) & 0x3f) | 0x80;\n }\n else {\n // FIXME: do we care\n continue;\n }\n target[at++] = (value & 0x3f) | 0x80;\n }\n return target.slice(0, at);\n };\n /**\n * @constructor\n * @param {string=} utfLabel\n * @param {{fatal: boolean}=} options\n */\n function FastTextDecoder(utfLabel = 'utf-8', options = { fatal: false }) {\n if (utfLabel !== 'utf-8') {\n throw new RangeError(`Failed to construct 'TextDecoder': The encoding label provided ('${utfLabel}') is invalid.`);\n }\n if (options.fatal) {\n throw new Error(`Failed to construct 'TextDecoder': the 'fatal' option is unsupported.`);\n }\n }\n Object.defineProperty(FastTextDecoder.prototype, 'encoding', {\n value: 'utf-8',\n });\n Object.defineProperty(FastTextDecoder.prototype, 'fatal', { value: false });\n Object.defineProperty(FastTextDecoder.prototype, 'ignoreBOM', {\n value: false,\n });\n /**\n * @param {(!ArrayBuffer|!ArrayBufferView)} buffer\n * @param {{stream: boolean}=} options\n */\n FastTextDecoder.prototype.decode = function (buffer, options = { stream: false }) {\n if (options['stream']) {\n throw new Error(`Failed to decode: the 'stream' option is unsupported.`);\n }\n const bytes = new Uint8Array(buffer);\n let pos = 0;\n const len = bytes.length;\n const out = [];\n while (pos < len) {\n const byte1 = bytes[pos++];\n if (byte1 === 0) {\n break; // NULL\n }\n if ((byte1 & 0x80) === 0) {\n // 1-byte\n out.push(byte1);\n }\n else if ((byte1 & 0xe0) === 0xc0) {\n // 2-byte\n const byte2 = bytes[pos++] & 0x3f;\n out.push(((byte1 & 0x1f) << 6) | byte2);\n }\n else if ((byte1 & 0xf0) === 0xe0) {\n const byte2 = bytes[pos++] & 0x3f;\n const byte3 = bytes[pos++] & 0x3f;\n out.push(((byte1 & 0x1f) << 12) | (byte2 << 6) | byte3);\n }\n else if ((byte1 & 0xf8) === 0xf0) {\n const byte2 = bytes[pos++] & 0x3f;\n const byte3 = bytes[pos++] & 0x3f;\n const byte4 = bytes[pos++] & 0x3f;\n // this can be > 0xffff, so possibly generate surrogates\n let codepoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4;\n if (codepoint > 0xffff) {\n // codepoint &= ~0x10000;\n codepoint -= 0x10000;\n out.push(((codepoint >>> 10) & 0x3ff) | 0xd800);\n codepoint = 0xdc00 | (codepoint & 0x3ff);\n }\n out.push(codepoint);\n }\n else {\n // FIXME: we're ignoring this\n }\n }\n return String.fromCharCode.apply(null, out);\n };\n scope['TextEncoder'] = FastTextEncoder;\n scope['TextDecoder'] = FastTextDecoder;\n})(typeof window !== 'undefined'\n ? window\n : typeof self !== 'undefined'\n ? self\n : this);\n//# sourceMappingURL=text-encoding-polyfill.js.map","// Copyright 2011 Google Inc.\n//\n// This code is licensed under the same terms as WebM:\n// Software License Agreement: http://www.webmproject.org/license/software/\n// Additional IP Rights Grant: http://www.webmproject.org/license/additional/\n// -----------------------------------------------------------------------------\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// -----------------------------------------------------------------------------\n//\n// Copyright 2011-2013 Dominik Homberger\n// Libwebp Javascript / libwebpjs - the libwebp implementation in javascript (v0.2.0)\n//\n// Author: Dominik Homberger (dominik.homberger@gmail.com)\n\nlet i;\nlet a;\nlet self;\nconst ca = 0;\nconst p = null;\nconst s = 0;\nconst x = 0;\nconst la = s;\nconst E = s;\nconst bb = 0;\nconst Mb = 0;\n\nfunction M(F) {\n return JSON.parse(JSON.stringify(F));\n}\n\nfunction N(F, G, w, D, S) {\n for (i = 0; i < S; ++i) F[G + i] = w[D + i];\n}\n\nfunction Nb(F) {\n const G = [];\n const w = F.length;\n let D;\n for (D = 0; D < w; ++D) G.push(F[D]);\n return G;\n}\n\nfunction ic(F, G) {\n const w = [];\n w.push(M(F));\n let D;\n for (D = 0; D < G; ++D) w.push(M(F));\n w.push(0);\n return w;\n}\n\nfunction rc(F, G) {\n const w = [];\n let D;\n for (D = 0; D < G; ++D) w.push(F);\n w.push(0);\n return w;\n}\n\nfunction memmove(arr1, index1, arr2, index2, length) {\n let i;\n for (i = 0; i < length; i++) {\n arr1[index1 + i] = arr2[index2 + i];\n }\n}\n\nfunction jd(F, G, w, D) {\n let S;\n for (S = 0; S < D; ++S) F[G + S] = w;\n}\n\nfunction kd(F, G, w, D) {\n let S = '';\n let ga;\n for (ga = 0; ga < D; ++ga) S += String.fromCharCode(F[G + ga]);\n return w == S ? 0 : 1;\n}\n\nfunction U(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(G);\n return D;\n}\n\nfunction ld(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(M(G));\n return D;\n}\n\nfunction md(F, G) {\n let w;\n for (w = F.length - 1; w >= 0; --w) G = M(U(F[w], G));\n return G;\n}\n\nfunction $(F) {\n if (!F) throw Error('assert :P');\n}\nexport const WebPDecoder = function () {\n function F(a) {\n return a == Ob || a == Pb || a == Bb || a == Qb;\n }\n\n function G(a) {\n return S(a, 1);\n }\n\n function w(a, b) {\n const c = 1 + ((a.la - 1) * b >> 8);\n const d = c << 8;\n let e = s;\n a.Z >= d ? (e = 1, a.la -= c, a.Z -= d) : (e = 0, a.la = c);\n for (; a.la < 128;) a.Z <<= 1, a.la <<= 1, ++a.gc == 8 && (a.gc = 0, a.bc && (a.Z += a.qa[a.Ia++], a.bc--));\n return e;\n }\n\n function D(a, b, c, d) {\n d -= c;\n d >= 2 ? (a.Z = b[c + 0] << 8 | b[c + 1], a.qa = b, a.Ia = c + 2, a.bc = d - 2) : (a.Z = 0, a.qa = p, a.bc = 0);\n a.la = 255;\n a.gc = 0;\n }\n\n function S(a, b) {\n for (var c = 0, d = s, d = b - 1; d >= 0; d--) c |= w(a, 128) << d;\n return c;\n }\n\n function ga(a, b) {\n const c = S(a, b);\n return G(a) ? -c : c;\n }\n\n function Rb(a, b, c, d) {\n let e = Mb;\n $(a != p);\n $(b != p);\n $(d < 4294967288);\n a.qa = b;\n a.Ia = c;\n a.ya = d;\n a.T = 0;\n a.Q = 0;\n a.g = 0;\n a.L = 0;\n for (e = a.fa = 0; e < 4 && e < a.ya; ++e) a.T |= a.qa[a.Ia + a.Q] << 8 * e, ++a.Q;\n }\n\n function Sb(a) {\n for (; a.g >= 8 && a.Q < a.ya;) a.T >>>= 8, a.T += a.qa[a.Ia + a.Q] << 24 >>> 0, ++a.Q, a.g -= 8;\n }\n\n function Da(a) {\n a.g >= 8 && Sb(a);\n a.Q == a.ya && a.g == 32 && (a.L = 1);\n }\n\n function T(a, b) {\n let c = 0;\n $(b >= 0);\n if (!a.L && b < gf) {\n if (a.Q == a.ya && a.g + b >= 32 && (a.L = 1, a.g + b > 32)) return c;\n c = a.T >> a.g & hf[b];\n a.g += b;\n a.g >= 8 && a.g >= 8 && Sb(a);\n } else a.fa = 1;\n return c;\n }\n\n function ma(a) {\n return a.Pa == a.gb;\n }\n\n function nd(a, b) {\n $(a != p);\n if (b == 0) return 0;\n a.gb = 2 * b - 1;\n a.Y = ld(a.gb, jf);\n if (a.Y == p) return 0;\n a.Y[0].s = -1;\n return a.Pa = 1;\n }\n\n function ja(a) {\n a != p && (a.Y = p, a.Y = p, a.gb = 0, a.Pa = 0);\n }\n\n function jc(a, b, c, d) {\n for (var e = a.Y, g = 0, k = +a.gb; d-- > 0;) {\n if (g >= k) return 0;\n if (e[g].s < 0) {\n if (ma(a)) return 0;\n const h = a;\n const n = h.Y;\n const l = +h.Pa;\n e[g].s = l - g;\n h.Pa += 2;\n n[l + 0].s = -1;\n n[l + 1].s = -1;\n } else if (e[g].s == 0) return 0;\n g += e[g].s + (c >> d & 1);\n }\n if (e[g].s < 0) e[g].s = 0;\n else if (e[g].s != 0) return 0;\n e[g].kc = b;\n return 1;\n }\n\n function od(a, b, c) {\n var d = s;\n let e = 0;\n let g = 0;\n $(a != p);\n $(b != p);\n for (d = 0; d < c; ++d) b[d] > 0 && (++e, g = d);\n if (!nd(a, e)) return 0;\n if (e == 1) return g < 0 || g >= c ? (ja(a), 0) : jc(a, g, 0, 0);\n e = 0;\n g = U(c, s);\n if (g == p) return (e = e && ma(a)) || ja(a), e;\n var k = s;\n var k = s;\n var d = U(Tb + 1, 0);\n let h = s;\n const n = U(Tb + 1, 0);\n let l = 0;\n $(b != p);\n $(c > 0);\n $(g != p);\n for (k = 0; k < c; ++k) b[k] > l && (l = b[k]);\n if (l > Tb) d = 0;\n else {\n for (k = 0; k < c; ++k) ++d[b[k]];\n h = d[0] = 0;\n n[0] = -1;\n for (k = 1; k <= l; ++k) h = h + d[k - 1] << 1, n[k] = h;\n for (k = 0; k < c; ++k) g[k] = b[k] > 0 ? n[b[k]]++ : pd;\n d = 1;\n }\n if (!d) return (e = e && ma(a)) || ja(a), e;\n for (d = 0; d < c; ++d) {\n if (b[d] > 0 && !jc(a, d, g[d], b[d])) {\n return (e = e && ma(a)) || ja(a), e;\n }\n }\n (e = ma(a)) || ja(a);\n return e;\n }\n\n function Ea(a, b, c, d, e, g, k) {\n for (var h = s, h = 0; h < k; ++h) e[g + h] = a[b + h] + c[d + h] & 255;\n }\n\n function qd(a, b, c) {\n const d = a.P.l;\n if (!(c = b < 0 || c < 0 || b + c > a.P.v)) {\n if (c = b == 0) {\n a: {\n let e = a.Ga;\n var g = a.G;\n var k = a.ub;\n c = a.P.l;\n let h = a.P.v;\n const n = a.Xb;\n var l = [p];\n let m = p;\n let f = h * c;\n var q = p;\n var r = p;\n var r = 'WEBP_FILTER_TYPE';\n let u = s;\n var l = s;\n var v = 0;\n let C = s;\n $(c > 0 && h > 0 && d >= c);\n $(e != p && n != p);\n if (k <= Ub) c = 0;\n else if (C = e[g + 0] >> 0 & 3, r = e[g + 0] >> 2 & 3, u = e[g + 0] >> 4 & 3, l = e[g + 0] >> 6 & 3, C < kc || C > kf || r >= lf || u > rd || l != 0) c = 0;\n else {\n if (C == kc) v = k >= f, l = e, m = g + Ub;\n else {\n l = U(f, 0);\n m = 0;\n if (l\n == p) {\n c = 0;\n break a;\n }\n var v = g + Ub;\n var k = k - Ub;\n var g = l;\n var q = M(Vb);\n let A = 0;\n const z = sd();\n z == p ? v = 0 : (z.l = c, z.v = h, z.N = q, td(na), q.put = ud, q.Mb = vd, q.Pb = wd, q.ka = p, q.ka = g, q.fd = 0, q.width = c, q.height = h, z.a = L, Rb(z.o, e, v, k), z.Wa = Cb, Ka(c, h, 1, z, p) && xd(z, c) && (z.Wa = Db, A = lc(z, z.V, z.Ha, z.l, z.v, mf)), z != p && sa(z), v = A);\n }\n if (v) {\n e = nf[r];\n e != p ? (q = U(f, 0), r = 0, q == p && (v = 0, C != kc && (m = l = p)), e(l, m, c, h, 1, c, q, r), f = q, C = r) : (f = l, C = m);\n for (e = 0; h-- > 0;) N(n, e, f, C, c), C += c, e += d;\n u == rd && (v = l == p || m <= 0 || c <= 0 ? 0 : 1);\n }\n c = v;\n }\n }\n c = !c;\n }\n }\n return c ? p : b == 0 ? a.Xb : +b * d;\n }\n\n function of(a) {\n let b = a.width;\n const c = a.height;\n let d = a.J;\n if (b <= 0 || c <= 0 || !(d >= Qa && d < Cc)) return ta;\n if (!a.Fc && a.Jb == p) {\n var e = p;\n var g = 0;\n var k = 0;\n var h = 0;\n var n = 0;\n var e = bb;\n var l = b * yd[d];\n var m = l * c;\n d < ua || (g = parseInt((b + 1) / 2, 10), h = g * parseInt((c + 1) / 2, 10), d == Ra && (k = b, n = k * c));\n e = m + 2 * h + n;\n if (e != e) return ta;\n e = U(e, 205);\n if (e == p) return cb;\n a.Jb = e;\n a.jc = p;\n d < ua ? (b = a.c.RGBA, b.ma = e, b.Sa = p, b.f = l, b.size = m) : (b = a.c.Va, b.y = e, b.D = p, b.F = l, b.Wc = m, b.c = e, b.B = p + m, b.nb = g, b.Rc = h, b.S = e, b.C = p + m + h, b.rb = g, b.Uc = h, d == Ra && (b.p = e, b.q = p + m + 2 * h), b.Wb = n, b.Fa = k);\n }\n d = 1;\n g = a.J;\n k = a.width;\n h = a.height;\n g >= Qa && g < Cc ? g < ua ? (a = a.c.RGBA, d\n &= a.f * h <= a.size, d &= a.f >= k * yd[g], d &= a.ma != p) : (a = a.c.Va, n = a.nb * parseInt((h + 1) / 2, 10), l = a.rb * parseInt((h + 1) / 2, 10), m = a.Fa * h, d &= a.F * h <= a.Wc, d &= n <= a.Rc, d &= l <= a.Uc, d &= m <= a.Wb, d &= a.F >= k, d &= a.nb >= parseInt((k + 1) / 2, 10), d &= a.rb >= parseInt((k + 1) / 2, 10), d &= a.y != p, d &= a.c != p, d &= a.S != p, g == Ra && (d &= a.Fa >= k, d &= m <= a.Wb, d &= a.p != p)) : d = 0;\n return d ? L : ta;\n }\n\n function zd(a, b, c, d) {\n if (d == p || a <= 0 || b <= 0) return ta;\n if (c != p) {\n if (c.Ua) {\n const e = c.wc;\n const g = c.vc;\n const k = c.t & -2;\n const h = c.k & -2;\n if (k < 0 || h < 0 || e <= 0 || g <= 0 || k + e > a || h + g > b) return ta;\n a = e;\n b = g;\n }\n if (c.I) {\n if (c.Ba <= 0\n || c.Aa <= 0) return ta;\n a = c.Ba;\n b = c.Aa;\n }\n }\n d.width = a;\n d.height = b;\n return of(d);\n }\n\n function mb(a) {\n return !(a & -256) ? a : a < 0 ? 0 : 255;\n }\n\n function Ad(a, b, c, d) {\n const e = U(16, 0);\n let g;\n g = 0;\n let k;\n for (k = 0; k < 4; ++k) {\n var h = a[b + 0] + a[b + 8];\n var n = a[b + 0] - a[b + 8];\n var l = (a[b + 4] * Wb >> 16) - (a[b + 12] * Xb >> 16);\n var m = (a[b + 4] * Xb >> 16) + (a[b + 12] * Wb >> 16);\n e[g + 0] = h + m;\n e[g + 1] = n + l;\n e[g + 2] = n - l;\n e[g + 3] = h - m;\n g += 4;\n b++;\n }\n for (k = g = 0; k < 4; ++k) {\n a = e[g + 0] + 4, h = a + e[g + 8], n = a - e[g + 8], l = (e[g + 4] * Wb >> 16) - (e[g + 12] * Xb >> 16), m = (e[g + 4] * Xb >> 16) + (e[g + 12] * Wb >> 16), c[d + 0 + 0 * f] = mb(c[d + 0 + 0 * f] + (h + m >> 3)), c[d + 1 + 0 * f] = mb(c[d\n + 1 + 0 * f] + (n + l >> 3)), c[d + 2 + 0 * f] = mb(c[d + 2 + 0 * f] + (n - l >> 3)), c[d + 3 + 0 * f] = mb(c[d + 3 + 0 * f] + (h - m >> 3)), g++, d += f;\n }\n }\n\n function pf(a, b, c, d, e) {\n Ad(a, b, c, d);\n e && Ad(a, b + 16, c, d + 4);\n }\n\n function qf(a, b, c, d) {\n mc(a, b + 0, c, d + 0, 1);\n mc(a, b + 32, c, d + 4 * f, 1);\n }\n\n function nc(a, b, c, d) {\n a = a[b + 0] + 4;\n let e;\n for (e = 0; e < 4; ++e) for (b = 0; b < 4; ++b) c[d + b + e * f] = mb(c[d + b + e * f] + (a >> 3));\n }\n\n function rf(a, b, c, d) {\n a[b + 0] && nc(a, b + 0, c, d + 0);\n a[b + 16] && nc(a, b + 16, c, d + 4);\n a[b + 32] && nc(a, b + 32, c, d + 4 * f);\n a[b + 48] && nc(a, b + 48, c, d + 4 * f + 4);\n }\n\n function Dc(a, b, c) {\n const d = b - f;\n const e = oa;\n const g = 255 - a[d - 1];\n let k;\n for (k = 0; k\n < c; ++k) {\n const h = e;\n const n = g + a[b - 1];\n var l;\n for (l = 0; l < c; ++l) a[b + l] = h[n + a[d + l]];\n b += f;\n }\n }\n\n function Yb(a, b, c) {\n let d;\n for (d = 0; d < 16; ++d) for (i = 0; i < 16; ++i) b[c + d * f + i] = a;\n }\n\n function y(a, b, c) {\n return a + 2 * b + c + 2 >> 2;\n }\n\n function Zb(a, b, c) {\n let d; let\n e;\n for (d = 0; d < 8; ++d) for (e = 0; e < 8; ++e) b[c + e + d * f] = a;\n }\n\n function nb(a, b, c) {\n const d = a[b - c];\n const e = a[b + 0];\n const g = 3 * (e - d) + sc[1020 + a[b - 2 * c] - a[b + c]];\n const k = oc[112 + (g + 4 >> 3)];\n a[b - c] = oa[255 + d + oc[112 + (g + 3 >> 3)]];\n a[b + 0] = oa[255 + e - k];\n }\n\n function Bd(a, b, c, d) {\n const e = a[b + 0];\n const g = a[b + c];\n return va[255 + a[b - 2 * c] - a[b - c]] > d || va[255 + g - e] > d;\n }\n\n function Cd(a,\n b, c, d, e) {\n const g = a[b - 3 * c];\n const k = a[b - 2 * c];\n const h = a[b - c];\n const n = a[b + 0];\n const l = a[b + c];\n const m = a[b + 2 * c];\n const f = a[b + 3 * c];\n return 2 * va[255 + h - n] + tc[255 + k - l] > d ? 0 : va[255 + a[b - 4 * c] - g] <= e && va[255 + g - k] <= e && va[255 + k - h] <= e && va[255 + f - m] <= e && va[255 + m - l] <= e && va[255 + l - n] <= e;\n }\n\n function Dd(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e - c] - a[b + e + 0]] + tc[255 + a[b + e - 2 * c] - a[b + e + c]] <= d && nb(a, b + e, c);\n }\n\n function Ed(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e * c - 1] - a[b + e * c + 0]] + tc[255 + a[b + e * c - 2] - a[b + e * c + 1]] <= d && nb(a, b + e * c, 1);\n }\n\n function sf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) {\n b\n += 4 * c, Dd(a, b + 0, c, d);\n }\n }\n\n function tf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) b += 4, Ed(a, b + 0, c, d);\n }\n\n function Fa(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c, g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - 2 * m];\n const q = n[l - m];\n const r = n[l + 0];\n const u = n[l + m];\n const v = n[l + 2 * m];\n var C = sc[1020 + 3 * (r - q) + sc[1020 + f - u]];\n const A = 27 * C + 63 >> 7;\n const z = 18 * C + 63 >> 7;\n var C = 9 * C + 63 >> 7;\n n[l - 3 * m] = oa[255 + n[l - 3 * m] + C];\n n[l - 2 * m] = oa[255 + f + z];\n n[l - m] = oa[255 + q + A];\n n[l + 0] = oa[255 + r - A];\n n[l + m] = oa[255 + u - z];\n n[l + 2 * m] = oa[255 + v - C];\n }\n }\n b += d;\n }\n }\n\n function Ga(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c,\n g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - m];\n const q = n[l + 0];\n const r = n[l + m];\n var u = 3 * (q - f);\n const v = oc[112 + (u + 4 >> 3)];\n var u = oc[112 + (u + 3 >> 3)];\n const C = v + 1 >> 1;\n n[l - 2 * m] = oa[255 + n[l - 2 * m] + C];\n n[l - m] = oa[255 + f + u];\n n[l + 0] = oa[255 + q - v];\n n[l + m] = oa[255 + r - C];\n }\n }\n b += d;\n }\n }\n\n function uf(a, b, c, d, e, g) {\n Fa(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function vf(a, b, c, d, e, g) {\n Fa(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function wf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4 * c, Ga(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function xf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4, Ga(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function yf(a, b, c, d, e,\n g, k, h) {\n Fa(a, b, e, 1, 8, g, k, h);\n Fa(c, d, e, 1, 8, g, k, h);\n }\n\n function zf(a, b, c, d, e, g, k, h) {\n Fa(a, b, 1, e, 8, g, k, h);\n Fa(c, d, 1, e, 8, g, k, h);\n }\n\n function Af(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4 * e, e, 1, 8, g, k, h);\n Ga(c, d + 4 * e, e, 1, 8, g, k, h);\n }\n\n function Bf(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4, 1, e, 8, g, k, h);\n Ga(c, d + 4, 1, e, 8, g, k, h);\n }\n\n function Fd(a, b) {\n return b == $b ? a.i == 0 ? a.d == 0 ? Cf : Df : a.d == 0 ? Ef : $b : b;\n }\n\n function Ec(a, b, c, d) {\n for (i = 0; i < 4; ++i) a[b + i] = c[d + i];\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function Gd(a) {\n a.a = 'VP8_STATUS_OK';\n a.xc = 'OK';\n }\n\n function td(a) {\n a >>> 8 != na >>> 8 && alert('mismatch error');\n }\n\n function Y(a, b, c) {\n a.a == L && (a.a = b, a.xc = c, a.za = 0);\n // alert(b + \": \" + c);\n return 0;\n }\n\n function Hd(a, b) {\n let c = [0];\n let d = x;\n var e = [Mb];\n var g = M(Id);\n var k = M(Jd);\n let h = M(Fc);\n var e = 'VP8StatusCode';\n var g = M(Gc);\n if (a == p) return alert('(dec == null)'), 0;\n Gd(a);\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'null VP8Io passed to VP8GetHeaders()');\n g.data = b.data;\n g.b = b.b;\n g.e = b.e;\n g.b = [g.b];\n g.e = [g.e];\n g = [g];\n e = Kd(g);\n if (e != L) return Y(a, e, 'Incorrect/incomplete header.');\n g = g[0];\n g.b = g.b[0];\n g.e = g.e[0];\n if (g.ia) return Y(a, W, 'Unexpected lossless format encountered.');\n a.Ga == p && ($(a.ub == 0), a.Ga = g.$, a.G = g.G, a.ub = g.pa);\n d = g.data;\n c = g.b + g.offset;\n e = g.e - g.offset;\n $(g.e >= g.offset);\n if (e[0] < 4) return Y(a, Z, 'Truncated header.');\n h = d[c + 0] | d[c + 1] << 8 | d[c + 2] << 16;\n g = a.Ac;\n g.fb = !(h & 1) + 0;\n g.Jc = h >> 1 & 7;\n g.Nc = h >> 4 & 1;\n g.Ra = h >> 5;\n if (g.Jc > 3) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Incorrect keyframe parameters.');\n if (!g.Nc) return Y(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', 'Frame not displayable.');\n c += 3;\n e -= 3;\n k = a.P;\n if (g.fb) {\n if (e < 7) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'cannot parse picture header');\n if (!(e\n >= 3 && d[c + 0] == 157 && d[c + 1] == 1 && d[c + 2] == 42)) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Bad code word');\n k.l = (d[c + 4] << 8 | d[c + 3]) & 16383;\n k.gd = d[c + 4] >> 6;\n k.v = (d[c + 6] << 8 | d[c + 5]) & 16383;\n k.hd = d[c + 6] >> 6;\n c += 7;\n e -= 7;\n a.Ma = k.l + 15 >> 4;\n a.hb = k.v + 15 >> 4;\n b.width = k.l;\n b.height = k.v;\n b.I = 0;\n b.Ua = 0;\n b.k = 0;\n b.t = 0;\n b.Ka = b.width;\n b.K = b.height;\n b.m = b.width;\n b.h = b.height;\n h = a.R;\n for (i = 0; i < h.Ta.length; ++i) h.Ta[i] = 255;\n h.z = M(Ff);\n h = a.Ca;\n $(h != p);\n h.pb = 0;\n h.ob = 0;\n h.tb = 1;\n for (i = 0; i < h.Kb.length; ++i) h.Kb[i] = 0;\n for (i = 0; i < h.Cb.length; ++i) h.Cb[i] = 0;\n a.Lb = 0;\n }\n if (g.Ra\n > e) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'bad partition length');\n h = a.o;\n D(h, d, c, c + g.Ra);\n c += g.Ra;\n e -= g.Ra;\n g.fb && (k.uc = G(h), k.$c = G(h));\n var k = h;\n var n = a.Ca;\n let l = a.R;\n $(k != p);\n $(n != p);\n n.pb = G(k);\n if (n.pb) {\n n.ob = G(k);\n if (G(k)) {\n var m;\n n.tb = G(k);\n for (m = 0; m < xa; ++m) n.Kb[m] = G(k) ? ga(k, 7) : 0;\n for (m = 0; m < xa; ++m) n.Cb[m] = G(k) ? ga(k, 6) : 0;\n }\n if (n.ob) for (m = 0; m < Ld; ++m) l.Ta[m] = G(k) ? S(k, 8) : 255;\n } else n.ob = 0;\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse segment header');\n k = h;\n n = a.ga;\n n.Oc = G(k);\n n.Fb = S(k, 6);\n n.kb = S(k, 3);\n n.oc = G(k);\n if (n.oc\n && G(k)) {\n for (l = 0; l < Hc; ++l) G(k) && (n.Lc[l] = ga(k, 6));\n for (l = 0; l < Gf; ++l) G(k) && (n.Gc[l] = ga(k, 6));\n }\n a.A = n.Fb == 0 ? 0 : n.Oc ? 1 : 2;\n if (a.A > 0) {\n if (a.Ca.pb) for (l = 0; l < xa; ++l) m = a.Ca.Cb[l], a.Ca.tb || (m += n.Fb), a.Zb[l] = m;\n else a.Zb[0] = n.Fb;\n }\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse filter header');\n var k = d;\n var f = c;\n var n = f;\n var e = f + e;\n m = 0;\n let q = s;\n let r = s;\n a.Hb = 1 << S(a.o, 2);\n q = a.Hb - 1;\n l = k;\n m = f + 3 * q;\n if (e < m) e = 'VP8_STATUS_NOT_ENOUGH_DATA';\n else {\n for (r = 0; r < q; ++r) {\n var f = l;\n var u = m + (k[n + 0] | k[n + 1] << 8 | k[n + 2] << 16);\n u > e && (f = k);\n D(a.ic[+r], l, m, u);\n l = f;\n m = u;\n n += 3;\n }\n D(a.ic[+q], l, m, e);\n e = m < e ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED';\n }\n if (e != 'VP8_STATUS_OK') return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse partitions');\n q = a.o;\n e = S(q, 7);\n k = G(q) ? ga(q, 4) : 0;\n n = G(q) ? ga(q, 4) : 0;\n l = G(q) ? ga(q, 4) : 0;\n m = G(q) ? ga(q, 4) : 0;\n q = G(q) ? ga(q, 4) : 0;\n r = a.Ca;\n f = s;\n for (f = 0; f < xa; ++f) {\n u = s;\n if (r.pb) u = r.Kb[f], r.tb || (u += e);\n else if (f > 0) {\n a.yb[f] = a.yb[0];\n continue;\n } else u = e;\n const v = a.yb[f];\n v.sc[0] = Ic[wa(u + k, 127)];\n v.sc[1] = Jc[wa(u + 0, 127)];\n v.sb[0] = 2 * Ic[wa(u + n, 127)];\n v.sb[1] = 101581 * Jc[wa(u + l, 127)] >> 16;\n v.sb[1] < 8\n && (v.sb[1] = 8);\n v.qc[0] = Ic[wa(u + m, 117)];\n v.qc[1] = Jc[wa(u + q, 127)];\n }\n if (g.fb) a.Zc = 259;\n else return Y(a, Hf, 'Not a key frame.');\n G(h);\n e = a.R;\n for (k = 0; k < Md; ++k) for (n = 0; n < Nd; ++n) for (l = 0; l < Kc; ++l) for (m = 0; m < Lc; ++m) w(h, If[k][n][l][m]) && (e.z[k][n][l][m] = S(h, 8));\n a.pc = G(h);\n a.pc && (a.Pc = S(h, 8));\n if (a.P.uc) {\n c -= 8;\n h = Mb;\n if (g.Ra < 8 || d[c + 8 - 1] != 1) return Y(a, W, 'RIFF: Inconsistent extra information.');\n h = d[c + 0] << 0 | d[c + 1] << 8 | d[c + 2] << 16;\n a.fc = h;\n a.dd = p;\n a.cd = d[c + 3];\n }\n return a.za = 1;\n }\n\n function Mc(a, b, c, d, e, g) {\n let k = b[e][c];\n if (!w(a, k[0])) return 0;\n for (;;) {\n ++e;\n if (w(a, k[1])) {\n var h;\n if (w(a, k[2])) {\n if (w(a, k[3])) {\n if (w(a, k[6])) {\n h = x;\n c = w(a, k[8]);\n k = w(a, k[9 + c]);\n k = 2 * c + k;\n c = 0;\n h = Jf[k];\n var n;\n for (n = 0; n < h.length - 1; ++n) c += c + w(a, h[n]);\n c += 3 + (8 << k);\n } else w(a, k[7]) ? (c = 7 + 2 * w(a, 165), c += w(a, 145)) : c = 5 + w(a, 159);\n } else c = w(a, k[4]) ? 3 + w(a, k[5]) : 2;\n k = b[Nc[e]][2];\n } else k = b[Nc[e]][1], c = 1;\n h = Kf[e - 1];\n g[g[g.length - 1] + h] = (w(a, 128) ? -c : c) * d[(h > 0) + 0];\n if (e == 16 || !w(a, k[0])) return e;\n } else k = b[Nc[e]][0];\n if (e == 16) return 16;\n }\n }\n\n function ob(a, b) {\n return ((16777216 * a[0] + 65536 * a[1] + 256 * a[2] + 1 * a[3]) * Lf\n & 4278190080) >> b;\n }\n\n function Mf(a, b) {\n let c = 0;\n if (a == p) return 0;\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'NULL VP8Io parameter in VP8Decode().');\n if (!a.za && !Hd(a, b)) return 0;\n $(a.za);\n let d;\n if (b.Mb && !b.Mb(b)) Y(a, Nf, 'Frame setup failed'), d = a.a;\n else {\n b.Za && (a.A = 0);\n const e = uc[a.A];\n a.A == 2 ? (a.lb = 0, a.mb = 0) : (a.lb = b.t - e >> 4, a.mb = b.k - e >> 4, a.lb < 0 && (a.lb = 0), a.mb < 0 && (a.mb = 0));\n a.Ya = b.K + 15 + e >> 4;\n a.wb = b.Ka + 15 + e >> 4;\n a.wb > a.Ma && (a.wb = a.Ma);\n a.Ya > a.hb && (a.Ya = a.hb);\n d = L;\n }\n if (c = d == L) {\n if (c) {\n let g;\n b: {\n a.Ja = 0;\n if (a.qb) {\n const k = a.rc;\n if (!WebPWorkerReset(k)) {\n g = Y(a, cb, 'thread initialization failed.');\n break b;\n }\n k.Qd = a;\n k.Rd = a.oa.N;\n k.Ud = FinishRow;\n a.jb = a.A > 0 ? Od : Od - 1;\n } else a.jb = Of;\n g = 1;\n }\n let h;\n if (!(h = !g)) {\n let n;\n b: {\n const l = a.jb;\n const m = a.Ma;\n const t = 4 * m;\n const q = 32 * m;\n const r = m + 1;\n const u = a.A > 0 ? m * (a.qb ? 2 : 1) : 0;\n const v = Pf;\n const C = q * (16 * l + parseInt(3 * uc[a.A] / 2, 10));\n const A = a.Ga != p ? a.P.l * a.P.v : 0;\n const z = t + q + r + u + v + 384 + C + A + Pd;\n if (z != z) n = 0;\n else {\n if (z > a.Gb) {\n a.ib = 0;\n a.Gb = 0;\n if (a.ib == p) {\n n = Y(a, 'VP8_STATUS_OUT_OF_MEMORY', 'no memory during frame initialization.');\n break b;\n }\n a.Gb = z;\n }\n a.dc = 205;\n a.Xc = rc(205, 16 * m);\n a.Sc = rc(205, 8 * m);\n a.Vc = rc(205, 8 * m);\n a.M = u ? ic(Oc, u) : p;\n a.Sd = u ? 0 : p;\n a.oa.ha = 0;\n a.oa.M = a.M;\n $((v & Pd) == 0);\n a.Ea = rc(205, 1 * v);\n a.z = -12851;\n a.H = 16 * m;\n a.r = 8 * m;\n const Ha = uc[a.A];\n const G = Ha * a.H;\n const y = Ha / 2 * a.r;\n a.ca = U(C, 205);\n a.da = +G;\n a.aa = a.ca;\n a.ba = a.da + 16 * l * a.H + y;\n a.ra = a.aa;\n a.sa = a.ba + 8 * l * a.r + y;\n a.Xb = A ? U(A, x) : p;\n a.La = ic(Qd, r);\n a.dc = rc($b, t);\n n = 1;\n }\n }\n h = !n;\n }\n if (h) c = 0;\n else {\n b.width = a.P.l;\n b.height = a.P.v;\n b.w = 0;\n b.y = a.ca;\n b.D = a.da;\n b.c = a.aa;\n b.B = a.ba;\n b.S = a.ra;\n b.C = a.sa;\n b.F = a.H;\n b.Da = a.r;\n b.p = p;\n b.q = p;\n if (!Rd) {\n let B;\n for (B = -255; B <= 255; ++B) va[255 + B] = B < 0 ? -B : B, tc[255 + B] = va[255 + B] >> 1;\n for (B = -1020; B\n <= 1020; ++B) sc[1020 + B] = B < -128 ? -128 : B > 127 ? 127 : B;\n for (B = -112; B <= 112; ++B) oc[112 + B] = B < -16 ? -16 : B > 15 ? 15 : B;\n for (B = -255; B <= 510; ++B) oa[255 + B] = B < 0 ? 0 : B > 255 ? 255 : B;\n Rd = 1;\n }\n mc = pf;\n Pc = qf;\n Qc = nc;\n Rc = rf;\n Sd = uf;\n Td = vf;\n Ud = yf;\n Vd = zf;\n Wd = wf;\n Xd = xf;\n Yd = Af;\n Zd = Bf;\n $d = Dd;\n ae = Ed;\n be = sf;\n ce = tf;\n c = 1;\n }\n }\n if (c) {\n a: {\n for (a.d = 0; a.d < a.Ya; ++a.d) {\n const Qf = a.ic[a.d & a.Hb - 1];\n const db = a;\n const F = db.La[0];\n F.X = 0;\n F.ua = 0;\n jd(db.cc, 0, $b, db.cc.length);\n db.W = (db.A > 0 && db.d >= db.mb && db.d <= db.Ya) + 0;\n for (a.i = 0; a.i < a.Ma; a.i++) {\n var D;\n const H = a;\n const T = Qf;\n const ya = H.o;\n const S = H.La[0];\n const J = H.La[1 + H.i];\n H.Ca.ob && (H.Lb = !w(ya,\n H.R.Ta[0]) ? 0 + w(ya, H.R.Ta[1]) : 2 + w(ya, H.R.Ta[2]));\n J.Nb = H.pc ? w(ya, H.Pc) : 0;\n const O = H.dc;\n O[O.length - 1] = 0 + 4 * H.i;\n const Sc = H.cc;\n H.wa = !w(ya, 145);\n if (H.wa) {\n for (var ga = H.Eb, ja = 0, Z = ca, Z = 0; Z < 4; ++Z) {\n var V = Sc[Z];\n var R;\n for (R = 0; R < 4; ++R) {\n const ta = Rf[O[O[O.length - 1] + R]][V];\n var za = 0;\n do za = Sf[2 * za + w(ya, ta[za])]; while (za > 0);\n V = -za;\n O[O[O.length - 1] + R] = V;\n ga[ja] = V;\n ja++;\n }\n Sc[Z] = V;\n }\n } else {\n var V = w(ya, 156) ? w(ya, 128) ? de : ee : w(ya, 163) ? fe : ge;\n H.Eb[0] = V;\n for (za = 0; za < 4; ++za) O[za + O[O.length - 1]] = V;\n for (za = 0; za < 4; ++za) Sc[za] = V;\n }\n H.Tc = !w(ya, 142) ? ge : !w(ya, 114) ? fe\n : w(ya, 183) ? de : ee;\n if (ya.Ab) D = 0;\n else {\n if (J.Nb) S.X = J.X = 0, H.wa || (S.ua = J.ua = 0), H.ja = 0, H.Oa = 0;\n else {\n let ia = ca;\n let ka = ca;\n var sa = ca;\n var wa = Tf;\n const Aa = H.yb[H.Lb];\n var aa = H.z;\n const ma = H.La[0];\n const ua = U(4, 0);\n const xa = U(4, 0);\n let ea = U(4, 0);\n let pb = U(4, 0);\n let na = 0;\n let Ba = 0;\n var pa = ca;\n let qa = ca;\n let Sa = ca;\n var aa = rc(0, 384);\n if (H.wa) sa = 0, wa = H.R.z[3];\n else {\n const ab = U(16, 0);\n var Ca = J.ua + ma.ua;\n J.ua = ma.ua = (Mc(T, H.R.z[1], Ca, Aa.sb, 0, ab) > 0) + 0;\n for (var sa = 1, wa = H.R.z[0], qb = ab, Ta = aa, La = U(16, s), X = s, X = 0; X < 4; ++X) {\n var Da = qb[0 + X] + qb[12 + X];\n var Ea = qb[4 + X] + qb[8 + X];\n var Fa = qb[4 + X] - qb[8 + X];\n var Ga = qb[0 + X] - qb[12 + X];\n La[0 + X] = Da + Ea;\n La[8\n + X] = Da - Ea;\n La[4 + X] = Ga + Fa;\n La[12 + X] = Ga - Fa;\n }\n for (X = 0; X < 4; ++X) {\n const Oa = Ta[Ta.length - 1];\n const lb = La[0 + 4 * X] + 3;\n var Da = lb + La[3 + 4 * X];\n var Ea = La[1 + 4 * X] + La[2 + 4 * X];\n var Fa = La[1 + 4 * X] - La[2 + 4 * X];\n var Ga = lb - La[3 + 4 * X];\n Ta[Oa + 0] = Da + Ea >> 3;\n Ta[Oa + 16] = Ga + Fa >> 3;\n Ta[Oa + 32] = Da - Ea >> 3;\n Ta[Oa + 48] = Ga - Fa >> 3;\n Ta[Ta.length - 1] += 64;\n }\n aa[aa.length - 1] = 0;\n }\n ea = Nb(vc[J.X & 15]);\n pb = Nb(vc[ma.X & 15]);\n for (qa = 0; qa < 4; ++qa) {\n for (var Eb = pb[qa], pa = 0; pa < 4; ++pa) {\n var Ca = Eb + ea[pa];\n var Ka = Mc(T, wa, Ca, Aa.sc, sa, aa);\n ea[pa] = Eb = (Ka > 0) + 0;\n xa[pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0;\n ua[pa] = (Ka > 1) + 0;\n aa[aa.length\n - 1] += 16;\n }\n pb[qa] = Eb;\n Ba |= ob(xa, 24 - 4 * qa);\n na |= ob(ua, 24 - 4 * qa);\n }\n ia = ob(ea, 24);\n ka = ob(pb, 24);\n ea = Nb(vc[J.X >> 4]);\n pb = Nb(vc[ma.X >> 4]);\n for (Sa = 0; Sa < 4; Sa += 2) {\n for (qa = 0; qa < 2; ++qa) {\n Eb = pb[Sa + qa];\n for (pa = 0; pa < 2; ++pa) Ca = Eb + ea[Sa + pa], Ka = Mc(T, H.R.z[2], Ca, Aa.qc, 0, aa), ea[Sa + pa] = Eb = (Ka > 0) + 0, xa[2 * qa + pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0, ua[2 * qa + pa] = (Ka > 1) + 0, aa[aa.length - 1] += 16;\n pb[Sa + qa] = Eb;\n }\n Ba |= ob(xa, 8 - 2 * Sa);\n na |= ob(ua, 8 - 2 * Sa);\n }\n ia |= ob(ea, 20);\n ka |= ob(pb, 20);\n J.X = ia;\n ma.X = ka;\n H.z = aa;\n H.Oa = na + 0;\n H.ja = na | Ba;\n J.Nb = !H.ja + 0;\n }\n D = !T.Ab;\n }\n if (!D) {\n c = Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA',\n `Premature end-of-file encountered.${a.i} ${a.d}`);\n break a;\n }\n const P = a;\n const da = P.Ea;\n const Ma = Tc;\n const Ua = P.Ea;\n const Va = Uc;\n const Wa = P.Ea;\n const Xa = he;\n if (P.i > 0) {\n for (var ba = ca, ba = -1; ba < 16; ++ba) Ec(da, Ma + ba * f - 4, da, Ma + ba * f + 12);\n for (ba = -1; ba < 8; ++ba) Ec(Ua, Va + ba * f - 4, Ua, Va + ba * f + 4), Ec(Wa, Xa + ba * f - 4, Wa, Xa + ba * f + 4);\n } else {\n for (ba = 0; ba < 16; ++ba) da[Ma + ba * f - 1] = 129;\n for (ba = 0; ba < 8; ++ba) Ua[Va + ba * f - 1] = 129, Wa[Xa + ba * f - 1] = 129;\n P.d > 0 && (da[Ma - 1 - f] = Ua[Va - 1 - f] = Wa[Xa - 1 - f] = 129);\n }\n const Qa = P.Xc;\n const Ra = 16 * +P.i;\n const mb = P.Sc;\n const vb = 8 * +P.i;\n const wb = P.Vc;\n const xb = 8 * +P.i;\n const Za = P.z;\n let fa = ca;\n if (P.d > 0) {\n N(da, Ma - f, Qa, Ra,\n 16), N(Ua, Va - f, mb, vb, 8), N(Wa, Xa - f, wb, xb, 8);\n } else if (P.i == 0) {\n for (i = 0; i < 21; ++i) da[Ma - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Ua[Va - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Wa[Xa - f - 1 + i] = 127;\n }\n if (P.wa) {\n const Ya = Ma - f + 16;\n P.d > 0 && (P.i >= P.Ma - 1 ? da[Ya + 0] = da[Ya + 1] = da[Ya + 2] = da[Ya + 3] = Qa[Ra + 15] : N(da, Ya + 0, Qa, Ra + 16, 4));\n for (let Fb = 0; Fb < 4; ++Fb) da[Fb + Ya + 4 * f] = da[Fb + Ya + 4 * f] = da[Fb + Ya + 8 * f] = da[Fb + Ya + 12 * f] = da[Fb + Ya + 0];\n for (fa = 0; fa < 16; fa++) {\n var ac = da;\n var bc = Ma + ie[fa];\n Uf[P.Eb[fa]](ac, bc);\n P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n } else {\n var $a = Fd(P, P.Eb[0]);\n Vf[$a](da, Ma);\n if (P.ja) for (fa = 0; fa < 16; fa++) ac = da, bc = Ma + ie[fa], P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n $a = Fd(P, P.Tc);\n je[$a](Ua, Va);\n je[$a](Wa, Xa);\n if (P.ja & 983040) {\n const zb = P.z;\n var Pa = 256;\n P.Oa & 983040 ? Pc(zb, Pa, Ua, Va) : Rc(zb, Pa, Ua, Va);\n }\n if (P.ja & 15728640) {\n const Ab = P.z;\n var Pa = 320;\n P.Oa & 15728640 ? Pc(Ab, Pa, Wa, Xa) : Rc(Ab, Pa, Wa, Xa);\n }\n P.d < P.hb - 1 && (N(Qa, Ra, da, Ma + 15 * f, 16), N(mb, vb, Ua, Va + 7 * f, 8), N(wb, xb, Wa, Xa + 7 * f, 8));\n const Q = a;\n if (Q.A > 0) {\n const kb = Q.M[1 + Q.i];\n const Kb = Q.La[1 + Q.i].Nb;\n let ha = Q.Zb[Q.Lb];\n Q.ga.oc && (ha\n += Q.ga.Lc[0], Q.wa && (ha += Q.ga.Gc[0]));\n ha = ha < 0 ? 0 : ha > 63 ? 63 : ha;\n kb.zc = ha;\n Q.ga.kb > 0 && (ha = Q.ga.kb > 4 ? ha >> 2 : ha >> 1, ha > 9 - Q.ga.kb && (ha = 9 - Q.ga.kb));\n kb.yc = ha < 1 ? 1 : ha;\n kb.ab = (!Kb || Q.wa) + 0;\n }\n for (var Ia = ca, Bb = 8 * Q.Ja * Q.r, Qb = Q.ca, Ub = Q.da + 16 * Q.i + 16 * Q.Ja * Q.H, Wb = Q.aa, Xb = Q.ba + 8 * Q.i + Bb, Yb = Q.ra, Zb = Q.sa + 8 * Q.i + Bb, Ia = 0; Ia < 16; ++Ia) N(Qb, Ub + Ia * Q.H, Q.Ea, +Tc + Ia * f, 16);\n for (Ia = 0; Ia < 8; ++Ia) N(Wb, Xb + Ia * Q.r, Q.Ea, +Uc + Ia * f, 8), N(Yb, Zb + Ia * Q.r, Q.Ea, +he + Ia * f, 8);\n }\n const K = a;\n const I = b;\n var cc = 1;\n const eb = K.oa;\n if (K.qb) {\n const nb = K.rc;\n var cc = cc & WebPWorkerSync(nb);\n $(nb.a == OK);\n if (cc) {\n eb.N = I;\n eb.ha = K.Ja;\n eb.d = K.d;\n eb.W = K.W;\n if (eb.W) {\n const hc = eb.M;\n eb.M = K.M;\n K.M = hc;\n }\n WebPWorkerLaunch(nb);\n ++K.Ja == K.jb && (K.Ja = 0);\n }\n } else {\n eb.d = K.d;\n eb.W = K.W;\n b: {\n let Hb = 1;\n const rb = K.oa;\n const ib = uc[K.A];\n const yb = ib * K.H;\n const dc = parseInt(ib / 2) * K.r;\n const Ib = 16 * rb.ha * K.H;\n const jb = 8 * rb.ha * K.r;\n const Jb = K.ca;\n const Lb = K.da - yb + Ib;\n const Ob = K.aa;\n const Pb = K.ba - dc + jb;\n const Rb = K.ra;\n const Sb = K.sa - dc + jb;\n const jc = rb.d == 0;\n const Tb = (rb.d >= K.hb - 1) + 0;\n var ra = 16 * rb.d;\n let fb = 16 * (rb.d + 1);\n if (rb.W) {\n const pc = K;\n let wc = s;\n const kc = pc.oa.d;\n $(pc.oa.W);\n for (wc = pc.lb; wc < pc.wb; ++wc) {\n const Na = pc;\n const ec = wc;\n const Vb = kc;\n const xc = Na.oa;\n const gb = Na.H;\n const fc = xc.M[1 + ec];\n const sb = Na.ca;\n const tb = Na.da + 16 * xc.ha\n * gb + 16 * ec;\n const Gb = fc.zc;\n const hb = fc.yc;\n const Ja = 2 * Gb + hb;\n if (Gb != 0) {\n if (Na.A == 1) ec > 0 && ae(sb, tb, gb, Ja + 4), fc.ab && ce(sb, tb, gb, Ja), Vb > 0 && $d(sb, tb, gb, Ja + 4), fc.ab && be(sb, tb, gb, Ja);\n else {\n const gc = Na.r;\n const yc = Na.aa;\n const zc = Na.ba + 8 * xc.ha * gc + 8 * ec;\n const Ac = Na.ra;\n const Bc = Na.sa + 8 * xc.ha * gc + 8 * ec;\n const ub = Na.Ac.fb ? Gb >= 40 ? 2 : Gb >= 15 ? 1 : 0 : Gb >= 40 ? 3 : Gb >= 20 ? 2 : Gb >= 15 ? 1 : 0;\n ec > 0 && (Td(sb, tb, gb, Ja + 4, hb, ub), Vd(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Xd(sb, tb, gb, Ja, hb, ub), Zd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n Vb > 0 && (Sd(sb, tb, gb, Ja + 4, hb, ub), Ud(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Wd(sb, tb, gb,\n Ja, hb, ub), Yd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n }\n }\n }\n }\n if (I.put) {\n jc ? (I.y = K.ca, I.D = K.da + Ib, I.c = K.aa, I.B = K.ba + jb, I.S = K.ra, I.C = K.sa + jb) : (ra -= ib, I.y = Jb, I.D = Lb, I.c = Ob, I.B = Pb, I.S = Rb, I.C = Sb);\n Tb || (fb -= ib);\n fb > I.K && (fb = I.K);\n if (K.Ga != p && ra < fb && (ra == 0 ? (I.p = qd(K, ra, fb - ra), I.q = 0) : I.q = qd(K, ra, fb - ra), I.p == p)) {\n cc = Y(K, W, 'Could not decode alpha data.');\n break b;\n }\n if (ra < I.k) {\n const qc = I.k - ra;\n var ra = I.k;\n $(!(qc & 1));\n I.D += K.H * qc;\n I.B += K.r * (qc >> 1);\n I.C += K.r * (qc >> 1);\n I.p != p && (I.q += I.width * qc);\n }\n ra < fb && (I.D += I.t, I.B += I.t >> 1, I.C += I.t >> 1, I.p != p && (I.q += I.t),\n I.w = ra - I.k, I.m = I.Ka - I.t, I.h = fb - ra, Hb = I.put(I));\n }\n rb.ha + 1 == K.jb && !Tb && (N(K.ca, K.da - yb, Jb, Lb + 16 * K.H, yb), N(K.aa, K.ba - dc, Ob, Pb + 8 * K.r, dc), N(K.ra, K.sa - dc, Rb, Sb + 8 * K.r, dc));\n cc = Hb;\n }\n }\n if (!cc) {\n c = Y(a, 'VP8_STATUS_USER_ABORT', 'Output aborted.');\n break a;\n }\n }\n let Cb;\n if (!(Cb = a.qb && !WebPWorkerSync(a.rc))) {\n let Db;\n if (Db = a.fc > 0) $(a), $(a.fc > 0), Db = !1;\n Cb = Db;\n }\n c = Cb ? 0 : 1;\n }\n }\n const lc = c;\n b.Pb && b.Pb(b);\n c = lc & 1;\n }\n if (!c) return ke(a), 0;\n a.za = 0;\n return c;\n }\n\n function ke(a) {\n a != p && (a.ib && (a.ib = 0), a.ib = p, a.Gb = 0, a.za = 0);\n }\n\n function Aa(a, b) {\n return a + (1 << b) - 1 >> b;\n }\n\n function hc(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J];\n d[e + 1] = ia[a + g - J];\n d[e + 2] = ia[a + b - J];\n }\n\n function le(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J] & 248 | ia[a + g - J] >> 5;\n d[e + 1] = ia[a + g - J] << 3 & 224 | ia[a + b - J] >> 3;\n }\n\n function me(a, b, c, d, e) {\n d[e + 0] = 255;\n hc(a, b, c, d, e + 1);\n }\n\n function ne(a, b, c, d, e) {\n const g = xb[b];\n d[e + 0] = Hb[a + Za[c] - J] << 4 | Hb[a + (vb[c] + wb[b] >> ea) - J];\n d[e + 1] = 15 | Hb[a + g - J] << 4;\n }\n\n function Vc(a, b, c, d, e) {\n const g = Za[c];\n c = vb[c] + wb[b] >> ea;\n d[e + 0] = ia[a + xb[b] - J];\n d[e + 1] = ia[a + c - J];\n d[e + 2] = ia[a + g - J];\n }\n\n function oe(a, b, c, d, e) {\n Vc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function pe(a, b, c, d, e) {\n hc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function ib(a, b, c) {\n a[b] = ((((a[b] & 4278255360) >>> 0) + ((c & 4278255360) >>> 0) & 4278255360) >>> 0 | (a[b] & 16711935) + (c & 16711935) & 16711935) >>> 0;\n }\n\n function ka(a, b) {\n return (((a ^ b) & 4278124286) >>> 1) + ((a & b) >>> 0) >>> 0;\n }\n\n function $a(a) {\n return a < 256 && a > 0 ? a : a <= 0 ? 0 : ~a >> 24 & 255;\n }\n\n function yb(a, b) {\n return $a(a + parseInt((a - b) / 2, 10));\n }\n\n function Wc() {\n return qe;\n }\n\n function Xc(a, b) {\n a &= 255;\n b &= 255;\n a > 127 && (a -= 256);\n b > 127 && (b -= 256);\n return a * b >>> 5;\n }\n\n function re(a,\n b, c, d, e, g, k) {\n var h = s;\n const n = 8 >> a.n;\n const l = a.U;\n const f = a.u;\n if (n < 8) {\n a = (1 << a.n) - 1;\n for (var t = (1 << n) - 1, h = b; h < c; ++h) {\n b = 0;\n for (var q = s, q = 0; q < l; ++q) (q & a) == 0 && (b = d[e++] >> 8 & 255), g[k++] = f[b & t], b >>= n;\n }\n } else for (h = b; h < c; ++h) for (q = 0; q < l; ++q) g[k++] = f[d[e++] >> 8 & 255];\n }\n\n function se(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n d[e++] = g >> 24 & 255;\n }\n }\n\n function te(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 240 | g >> 12 & 15;\n d[e++] = g >> 0 & 240 | g >> 28 & 15;\n }\n }\n\n function Ib(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 24 & 255;\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n }\n }\n\n function ue(a, b, c, d) {\n if (T(a, 8) != ve) return 0;\n b[0] = T(a, we) + 1;\n c[0] = T(a, we) + 1;\n d[0] = T(a, 1);\n T(a, Wf);\n return 1;\n }\n\n function xe(a, b) {\n let c = s;\n if (a < 4) return a + 1;\n c = a - 2 >> 1;\n return (2 + (a & 1) << c) + T(b, c) + 1;\n }\n\n function Oa(a, b) {\n if (b.Q + 8 > b.ya) {\n var c = a.Y;\n var d = 0;\n for ($(c != p); c[d].s != 0;) {\n var e = c;\n var g = b;\n const k = g.T >> g.g & 1;\n g.L ? g.fa = 1 : (++g.g, g.g >= 8 && Sb(g), g.Q == g.ya && g.g == 32 && (g.L = 1));\n d = d + e[d].s + k;\n }\n return c[d].kc;\n }\n c = a.Y;\n d = 0;\n for ($(c != p); c[d].s != 0;) {\n e = c, g = b.T >> b.g & 1, ++b.g, d = d\n + e[d].s + g;\n }\n return c[d].kc;\n }\n\n function zb(a, b) {\n if (a != p) for (var c = s, d = s, c = 0; c < b; ++c) for (var e = a[c].va, d = 0; d < Yc; ++d) ja(e[d]);\n }\n\n function ye(a, b, c) {\n b = a.eb == 0 ? 0 : a.ac[a.bd + a.Ec * (c >> a.eb) + (b >> a.eb)];\n $(b < a.hc);\n return a.Db[+b];\n }\n\n function ze(a, b, c, d) {\n let e = a.Na;\n const g = a.O;\n const k = g + b;\n var h = c;\n var f = d;\n d = a.Xa;\n c = a.vb;\n for (N(d, c, h, f, a.l * b); e-- > 0;) {\n b = a.nc[e];\n let l = g;\n var m = k;\n var t = h;\n var q = f;\n var f = d;\n var h = c;\n $(l < m);\n $(m <= b.Vb);\n switch (b.Qc) {\n case Ae:\n t = 0;\n for (b = h + (m - l) * b.U; h < b;) {\n var m = f;\n var q = h;\n var r = m[q] >> 8 & 255;\n var u = (m[q] & 16711935) >>> 0;\n var u = u + (r << 16 | r);\n var u = u & 16711935;\n f[h++] = ((m[q] & 4278255360)\n >>> 0 | u) >>> 0;\n l == 32 && t++;\n }\n break;\n case Be:\n var v = b;\n var C = l;\n var t = m;\n var q = f;\n var r = h;\n var u = v.U;\n if (C == 0) {\n var A = s;\n ib(q, r, qe);\n for (A = 1; A < u; ++A) ib(q, r + A, q[r + A - 1]);\n r += u;\n ++C;\n }\n for (var z = (1 << v.n) - 1, Ha = Aa(u, v.n), w = v.u, v = +(C >> v.n) * Ha; C < t;) {\n var y = w;\n var B = v;\n let G = p;\n ib(q, r, q[r - u + 0]);\n G = Ce[y[B++] >> 8 & 15];\n for (A = 1; A < u; ++A) {\n let F = E;\n (A & z) == 0 && (G = Ce[y[B++] >> 8 & 15]);\n F = G(q[r + A - 1], q, r + A - u);\n ib(q, r + A, F);\n }\n r += u;\n ++C;\n (C & z) == 0 && (v += Ha);\n }\n m != b.Vb && (b = b.U, N(f, h - b, f, h + (m - l - 1) * b, b));\n break;\n case De:\n t = b.U;\n q = (1 << b.n) - 1;\n r = Aa(t, b.n);\n u = b.u;\n for (b = +(l >> b.n) * r; l < m;) {\n A = u;\n C = b;\n z = M(Xf);\n Ha = s;\n for (Ha = 0; Ha < t; ++Ha) (Ha & q) == 0 && (w = A[C++], v = z, v.Cc = w >> 0 & 255, v.Bc = w >> 8 & 255, v.Kc = w >> 16 & 255), w = f[h + Ha], v = w >>> 8, y = w >>> 16, B = w, y += Xc(z.Cc, v), y &= 255, B += Xc(z.Bc, v), B += Xc(z.Kc, y), B &= 255, f[h + Ha] = (w & 4278255360 | y << 16 | B) >>> 0;\n h += t;\n ++l;\n (l & q) == 0 && (b += r);\n }\n break;\n case Ee:\n t == f && b.n > 0 ? (t = (m - l) * Aa(b.U, b.n), q = h + (m - l) * b.U - t, memmove(f, q, f, h, t), re(b, l, m, f, q, f, h)) : re(b, l, m, t, q, f, h);\n }\n h = d;\n f = c;\n }\n }\n\n function Yf(a, b) {\n var c = a.V;\n var d = a.Ha + a.l * a.O;\n var e = b - a.O;\n if (!(e <= 0)) {\n ze(a, e, c, d);\n var g = a.N;\n var c = a.Xa;\n let k = [a.vb];\n var d = a.O;\n var e = b;\n var h = k;\n var f = g.width;\n $(d < e);\n $(g.t < g.Ka);\n e > g.K && (e = g.K);\n if (d < g.k) {\n var l = g.k - d;\n var d = g.k;\n h[0] += f * l;\n }\n d >= e ? d = 0 : (h[0] += g.t, g.w = d - g.k, g.m = g.Ka - g.t, g.h = e - d, d = 1);\n if (d) {\n k = k[0];\n d = a.Ib;\n e = g.width;\n if (d.J < ua) {\n var m = d.c.RGBA;\n var h = m.ma;\n let t = m.Sa + a.xa * m.f;\n if (g.I) c = EmitRescaledRows(a, c, k, e, g.h, h, t, m.f);\n else {\n for (var f = d.J, l = g.m, g = g.h, m = m.f, q = g; q-- > 0;) {\n const r = c;\n let u = k;\n let v = l;\n const C = h;\n let A = t;\n switch (f) {\n case Qa:\n for (v = u + v; u < v;) {\n var z = r[u++];\n C[A++] = z >> 16 & 255;\n C[A++] = z >> 8 & 255;\n C[A++] = z >> 0 & 255;\n }\n break;\n case jb:\n se(r, u, v, C, A);\n break;\n case Ob:\n se(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v,\n 1, 0);\n break;\n case Zc:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 0 & 255, C[A++] = z >> 8 & 255, C[A++] = z >> 16 & 255;\n break;\n case Pa:\n Ib(r, u, v, C, A);\n break;\n case Pb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v, 1, 0);\n break;\n case Ab:\n Ib(r, u, v, C, A);\n break;\n case Bb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 1, v, 1, 0);\n break;\n case kb:\n te(r, u, v, C, A);\n break;\n case Qb:\n te(r, u, v, C, A);\n WebPApplyAlphaMultiply4444(C, v, 1, 0);\n break;\n case Fe:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 16 & 248 | z >> 13 & 7, C[A++] = z >> 5 & 224 | z >> 3 & 31;\n break;\n default:\n $(0);\n }\n k += e;\n t += m;\n }\n c = g;\n }\n a.xa += c;\n } else {\n a.xa = g.I ? EmitRescaledRowsYUVA(a, c, k, e, g.h) : EmitRowsYUVA(a, c, k, e, g.m, g.h);\n }\n $(a.xa <= d.height);\n }\n a.O = b;\n $(a.O <= a.v);\n }\n }\n\n function lc(a, b, c, d, e, g) {\n let k = 1;\n let h = 0;\n let f = 0;\n const l = a.o;\n const m = a.cb;\n let t = m.Db;\n let q = c;\n let r = c;\n c += d * e;\n e = Ba + Ge;\n const u = e + m.xb;\n const v = m.xb > 0 ? m.Yb : p;\n const C = m.Dc;\n let A = !1;\n $(t != p);\n for (; !l.L && q < c;) {\n let z = s;\n A || ((h & C) == 0 && (t = ye(m, h, f)), Da(l), z = Oa(t.va[Zf], l));\n if (z < Ba || A) {\n if (!A) {\n var w = k = A = s;\n var y = s;\n Da(l);\n A = Oa(t.va[$f], l);\n k = z;\n Da(l);\n w = Oa(t.va[ag], l);\n Da(l);\n y = Oa(t.va[bg], l);\n b[q] = (y << 24 >>> 0) + (A << 16) + (k << 8) + w;\n }\n A = !1;\n ++q;\n ++h;\n if (h >= d && (h = 0, ++f, g != p && f\n % $c == 0 && g(a, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < e) {\n w = w = s;\n k = xe(z - Ba, l);\n z = Oa(t.va[cg], l);\n Da(l);\n w = xe(z, l);\n w > He ? w -= He : (z = dg[w - 1], z = (z >> 4) * d + (8 - (z & 15)), w = z >= 1 ? z : 1);\n z = s;\n for (z = 0; z < k; ++z) b[q + z] = b[q + z - w];\n q += k;\n for (h += k; h >= d;) h -= d, ++f, g != p && f % $c == 0 && g(a, f);\n if (q < c && (t = ye(m, h, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < u) {\n A = z - e;\n for ($(v != p); r < q;) z = b[r++], v.ea[ad * z >>> v.bb] = z;\n z = b;\n w = q;\n y = v;\n $(A <= -1 >>> y.bb);\n z[w] = y.ea[A];\n A = !0;\n continue;\n }(k = !l.fa) || End;\n }\n g != p && g(a, f);\n l.fa || !k || l.L && q < c ? (k = 0, a.a = !l.L ? W : Ie) : q == c && (a.Ob = Db);\n return k;\n }\n\n function bd(a) {\n $(a);\n a.ac = p;\n zb(a.Db, a.hc);\n const b = a.Yb;\n b != p && (b.ea = p, b.ea = p);\n $(a);\n }\n\n function sd() {\n const a = M(eg);\n if (a == p) return p;\n a.a = L;\n a.Wa = cd;\n a.Ob = cd;\n return a;\n }\n\n function sa(a) {\n let b = s;\n if (a != p) {\n bd(a.cb);\n a.V = p;\n a.V = p;\n for (b = 0; b < a.Na; ++b) {\n const c = a.nc[b];\n c.u = p;\n c.u = p;\n }\n a.Na = 0;\n a.Ub = 0;\n a.Mc = p;\n a.Mc = p;\n a.Ib = p;\n }\n }\n\n function Ka(a, b, c, d, e) {\n var g = 1;\n a = [a];\n b = [b];\n for (var k = d.o, h = d.cb, f = p, l = p, l = 0; ;) {\n if (c) {\n for (; g && T(k, 1);) {\n var m = a;\n var t = b;\n var q = d;\n var r = 1;\n var u = q.o;\n var g = q.nc[q.Na];\n var v = T(u, 2);\n if (q.Ub & 1 << v) g = 0;\n else {\n q.Ub\n |= 1 << v;\n g.Qc = v;\n g.U = m[0];\n g.Vb = t[0];\n g.u = [p];\n g.b = 0;\n ++q.Na;\n $(q.Na <= Je);\n switch (v) {\n case Be:\n case De:\n g.n = T(u, 3) + 2;\n r = Ka(Aa(g.U, g.n), Aa(g.Vb, g.n), 0, q, g.u);\n break;\n case Ee:\n t = T(u, 8) + 1;\n r = t > 16 ? 0 : t > 4 ? 1 : t > 2 ? 2 : 3;\n m[0] = Aa(g.U, r);\n g.n = r;\n if (m = r = Ka(t, 1, 0, q, g.u)) {\n if (m = t, q = g, r = s, t = 1 << (8 >>> q.n) >>> 0, u = Array(t), u == p) m = 0;\n else {\n var v = q.u[0];\n var C = q.b;\n u[0] = q.u[0][q.b + 0];\n for (r = 1; r < m; ++r) u[r] = ((((v[C + r] & 4278255360) >>> 0) + ((u[r - 1] & 4278255360) >>> 0) & 4278255360) >>> 0 | (v[C + r] & 16711935) + (u[r - 1] & 16711935) & 16711935) >>> 0;\n for (; r < t; ++r) u[r] = 0;\n q.u[0] = p;\n q.b = p;\n q.u[0] = u;\n q.b = 0;\n m = 1;\n }\n }\n r = m;\n break;\n case Ae:\n break;\n default:\n $(0);\n }\n g.u = g.u[0];\n g = r;\n }\n }\n }\n if (g && T(k, 1) && (l = T(k, 4), g = l >= 1 && l <= fg, !g)) {\n d.a = W;\n break;\n }\n if (g) {\n a: {\n var g = d;\n var A = a[0];\n var z = b[0];\n var m = l;\n var C = v = s;\n var C = g.o;\n var q = g.cb;\n var r = [p];\n var t = p;\n var u = 1;\n if (c && T(C, 1)) {\n var v = T(C, 3) + 2;\n var A = Aa(A, v);\n var w = Aa(z, v);\n var z = A * w;\n if (!Ka(A, w, 0, g, r)) {\n g.a = W;\n zb(t, u);\n g = 0;\n break a;\n }\n r = r[0];\n q.eb = v;\n for (v = 0; v < z; ++v) A = r[v] >>> 8 & 65535, r[v] = A, A >= u && (u = A + 1);\n }\n if (C.fa) zb(t, u), g = 0;\n else if ($(u <= 65536), t = ld(u, gg), t == p) g.a = cb, zb(t, u), g = 0;\n else {\n for (v = 0; v < u; ++v) {\n z = t[v].va;\n for (C = 0; C < Yc; ++C) {\n A = hg[C];\n C == 0 && m > 0 && (A += 1 << m);\n b: {\n const y = A;\n var A = g;\n const G = z[+C];\n var B = 0;\n var w = A.o;\n if (T(w, 1)) {\n var F = Array(2);\n var D = Array(2);\n var L = Array(2);\n var B = T(w, 1) + 1;\n var J = T(w, 1);\n F[0] = T(w, J == 0 ? 1 : 8);\n D[0] = 0;\n L[0] = B - 1;\n B == 2 && (F[1] = T(w, 8), D[1] = 1, L[1] = B - 1);\n c: {\n var J = 0;\n var H = s;\n $(G != p);\n $(L != p);\n $(D != p);\n $(F != p);\n if (nd(G, B)) {\n for (H = 0; H < B; ++H) {\n if (D[H] != pd) {\n if (F[H] < 0 || F[H] >= y) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n if (!jc(G, F[H], D[H], L[H])) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n }\n }(J = (J = 1) && ma(G)) || ja(G);\n B = J;\n } else B = 0;\n }\n } else {\n B = s;\n D = [];\n F = T(w, 4) + 4;\n if (F > Ke) {\n A.a = W;\n A = 0;\n break b;\n }\n L = Array(y);\n if (L == p) {\n A.a = cb;\n A = 0;\n break b;\n }\n for (B = 0; B < F; ++B) D[ig[B]] = T(w, 3);\n c: {\n var B = A;\n var O = D;\n var D = y;\n var F = L;\n var J = 0;\n var H = B.o;\n let S = s;\n let V = s;\n let Y = jg;\n const Z = M(Le);\n if (od(Z, O, Ke)) {\n if (T(H, 1)) {\n if (S = 2 + 2 * T(H, 3), V = 2 + T(H, S), V > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n } else V = D;\n for (S = 0; S < D;) {\n var R = s;\n if (V-- == 0) break;\n Da(H);\n R = Oa(Z, H);\n if (R < Me) F[S++] = R, R != 0 && (Y = R);\n else {\n var O = R == kg;\n var R = R - Me;\n const ea = lg[R];\n var R = T(H, mg[R]) + ea;\n if (S + R > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n for (O = O ? Y : 0; R-- > 0;) F[S++] = O;\n }\n }\n J = 1;\n ja(Z);\n B = J;\n } else B.a = W, B = 0;\n }\n B && (B = od(G, L, y));\n }(B = B && !w.fa) ? A = 1 : (A.a = W, A = 0);\n }\n if (!A) {\n zb(t, u);\n g = 0;\n break a;\n }\n }\n }\n q.ac = r;\n q.hc = u;\n q.Db = t;\n g = 1;\n }\n }\n }\n if (!g) {\n d.a = W;\n break;\n }\n if (l > 0) {\n if (h.xb = 1 << l, m = h.Yb, q = 1 << l, $(m != p), $(l > 0), m.ea = U(q, 0), m.ea == p ? l = 0 : (m.bb = 32 - l, l = 1), !l) {\n d.a = cb;\n g = 0;\n break;\n }\n } else h.xb = 0;\n l = d;\n m = a[0];\n q = b[0];\n r = l.cb;\n t = r.eb;\n l.l = m;\n l.v = q;\n r.Ec = Aa(m, t);\n r.Dc = t == 0 ? -1 : (1 << t) - 1;\n if (c) {\n d.Ob = Cb;\n break;\n }\n f = Array(a * b);\n l = 0;\n if (f == p) {\n d.a = cb;\n g = 0;\n break;\n }\n g = (g = lc(d, f, l, a, b, p)) && !k.fa;\n break;\n }\n g ? (e != p ? e[0] = f : ($(f == p), $(c)), c || bd(h)) : (bd(h), d.a == W && d.o.L && (d.a = Ie));\n return g;\n }\n\n function xd(a, b) {\n const c = a.l * a.v;\n const d = c + b + b * $c;\n $(a.l <= b);\n a.V = Array(d);\n a.Ha = 0;\n if (a.V == p) {\n return a.Xa = p, a.a = cb, 0;\n }\n a.Xa = a.V;\n a.vb = a.Ha + c + b;\n return 1;\n }\n\n function mf(a, b) {\n var c = b - a.O;\n var d = a.V;\n var e = a.Ha + a.l * a.O;\n if (!(c <= 0)) {\n ze(a, c, d, e);\n for (var e = a.N.width, c = e * c, d = a.N.ka, e = a.N.fd + e * a.O, g = a.Xa, k = a.vb, h = s, h = 0; h < c; ++h) d[e + h] = g[k + h] >>> 8 & 255;\n a.O = a.xa = b;\n }\n }\n\n function ng(a, b) {\n const c = [s];\n const d = [s];\n const e = [s];\n if (a == p) return 0;\n if (b == p) return a.a = ta, 0;\n a.N = b;\n a.a = L;\n Rb(a.o, b.data, b.b, b.e);\n if (!ue(a.o, c, d, e)) return a.a = W, sa(a), $(a.a != L), 0;\n a.Ob = cd;\n b.width = c[0];\n b.height = d[0];\n a.Wa = Cb;\n return !Ka(c[0], d[0], 1, a, p) ? (sa(a), $(a.a != L), 0) : 1;\n }\n\n function og(a) {\n let b = p;\n let c = p;\n if (a == p) return 0;\n b = a.N;\n $(b != p);\n c = b.ka;\n $(c != p);\n a.Ib = c.j;\n a.Hc = c.Hc;\n $(a.Ib != p);\n if (!Ne(c.Qa, b, Pa)) return a.a = ta, sa(a), $(a.a != L), 0;\n if (!xd(a, b.width) || b.I && !AllocateAndInitRescaler(a, b)) return sa(a), $(a.a != L), 0;\n a.Wa = Db;\n if (!lc(a, a.V, a.Ha, a.l, a.v, Yf)) return sa(a), $(a.a != L), 0;\n c.ec = a.xa;\n sa(a);\n return 1;\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, C, w, z) {\n let y; const G = C - 1 >> 1;\n let F = e[g + 0] | k[h + 0] << 16;\n let B = f[l + 0] | m[t + 0] << 16;\n if (a) {\n var D = 3 * F + B + 131074 >> 2;\n w(a[b + 0], D & 255, D >> 16, q, r);\n }\n c && (D = 3 * B + F + 131074 >> 2, w(c[d + 0], D & 255, D >> 16, u, v));\n for (y = 1; y <= G; ++y) {\n const J = e[g + y] | k[h + y] << 16;\n const L = f[l + y] | m[t + y] << 16;\n var D = F + J + B + L + 524296;\n const O = D + 2 * (J + B) >> 3;\n const H = D + 2 * (F + L) >> 3;\n a && (D = O + F >> 1, F = H + J >> 1, w(a[b + 2 * y - 1], D & 255, D >> 16, q, r + (2 * y - 1) * z), w(a[b + 2 * y - 0], F & 255, F >> 16, q, r + (2 * y - 0) * z));\n c && (D = H + B >> 1, F = O + L >> 1, w(c[d + 2 * y - 1], D & 255, D >> 16, u, v + (2 * y - 1) * z), w(c[d + 2 * y + 0], F & 255, F >> 16, u, v + (2 * y + 0) * z));\n F = J;\n B = L;\n }\n C & 1 || (a && (D = 3 * F + B + 131074 >> 2, w(a[b + C - 1], D & 255, D >> 16, q, r + (C - 1) * z)), c && (D = 3 * B + F + 131074 >> 2, w(c[d + C - 1], D & 255, D >> 16, u, v + (C - 1) * z)));\n }\n\n function pg(a,\n b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, hc, 3);\n }\n\n function qg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, Vc, 3);\n }\n\n function Oe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, pe, 4);\n }\n\n function Pe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, oe, 4);\n }\n\n function Qe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, me, 4);\n }\n\n function Re(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h,\n f, l, m, t, q, r, u, v, w, ne, 2);\n }\n\n function rg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, le, 2);\n }\n\n function Ca(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u) {\n let v;\n for (v = 0; v < q - 1; v += 2) r(a[b + 0], e[g + 0], k[h + 0], f, l), r(a[b + 1], e[g + 0], k[h + 0], f, l + u), r(c[d + 0], e[g + 0], k[h + 0], m, t), r(c[d + 1], e[g + 0], k[h + 0], m, t + u), b += 2, d += 2, g++, h++, l += 2 * u, t += 2 * u;\n v == q - 1 && (r(a[b + 0], e[g + 0], k[h + 0], f, l), r(c[d + 0], e[g + 0], k[h + 0], m, t));\n }\n\n function Se(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, pe, 4);\n }\n\n function Te(a, b, c, d, e, g, k, f, n, l,\n m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, oe, 4);\n }\n\n function Ue(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, me, 4);\n }\n\n function Ve(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, ne, 2);\n }\n\n function sg(a, b, c, d, e, g) {\n for (; e-- > 0;) {\n for (var k = a, f = b + (c ? 1 : 0), n = a, l = b + (c ? 0 : 3), m = s, m = 0; m < d; ++m) {\n var t = n[l + 4 * m];\n if (t != 255) {\n var t = 32897 * t;\n let q = k;\n let r = f + 4 * m + 0;\n k[f + 4 * m + 0] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 1;\n k[f + 4 * m + 1] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 2;\n k[f + 4 * m + 2] * t >>> 23;\n q[r] = ca;\n }\n }\n b += g;\n }\n }\n\n function tg(a, b) {\n const c = b.j.c.Va;\n const d = c.y;\n const e = c.D + a.w * c.F;\n const g = c.c;\n const k = c.B + (a.w >> 1) * c.nb;\n const f = c.S;\n const n = c.C + (a.w >> 1) * c.rb;\n const l = a.m;\n const m = a.h;\n const t = parseInt((l + 1) / 2, 10);\n const q = parseInt((m + 1) / 2, 10);\n let r;\n for (r = 0; r < m; ++r) N(d, e + r * c.F, a.y, a.D + r * a.F, l);\n for (r = 0; r < q; ++r) N(g, k + r * c.nb, a.c, a.B + r * a.Da, t), N(f, n + r * c.rb, a.S, a.C + r * a.Da, t);\n return a.h;\n }\n\n function ug(a, b) {\n var c = b.j;\n const d = c.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = a.y;\n let f = a.D;\n const n = a.c;\n let l = a.B;\n const m = a.S;\n let t = a.C;\n var c = vg[c.J];\n const q = a.m;\n const r = a.h - 1;\n let u;\n for (u = 0; u < r; u += 2) c(k, f, k, f + a.F, n, l, m, t, e, g, e, g + d.f, q), f += 2 * a.F, l += a.Da, t += a.Da, g += 2 * d.f;\n u == r && c(k, f, k, f, n, l, m, t, e, g, e, g, q);\n return a.h;\n }\n\n function wg(a, b) {\n let c = a.h;\n const d = b.j.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = V[b.j.J];\n const f = a.y;\n let n = a.D;\n const l = a.c;\n let m = a.B;\n const t = a.S;\n let q = a.C;\n let r = b.Qb;\n let u = b.Rb;\n let v = b.lc;\n let w = b.mc;\n let A = a.w;\n const z = a.w + a.h;\n const y = a.m;\n const D = parseInt((y + 1) / 2, 10);\n A == 0 ? k(p, p, f, n, l, m, t, q, l, m, t, q, p, p, e, g, y) : (k(b.Sb, b.Tb, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y), ++c);\n for (; A + 2 < z; A += 2) r = l, u = m, v = t, w = q, m += a.Da, q += a.Da, g += 2 * d.f, n += 2 * a.F, k(f, n - a.F, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y);\n n += a.F;\n a.k + z < a.K ? (N(b.Sb, b.Tb, f, n, 1 * y), N(b.Qb, b.Rb, l, m, 1 * D), N(b.lc, b.mc, t, q, 1 * D), c--) : z & 1 || k(f, n, p, p, l, m, t, q, l, m,\n t, q, e, g + d.f, p, p, y);\n return c;\n }\n\n function xg(a, b) {\n var c = a.p;\n var d = a.q;\n const e = b.j.c.Va;\n const g = a.m;\n const f = a.h;\n const h = e.p;\n let n = e.q + a.w * e.Fa;\n var c = a.p;\n var d = a.q;\n let l = s;\n if (c != p) for (l = 0; l < f; ++l) N(h, n, c, d, 1 * g), d += a.width, n += e.Fa;\n else if (e.p != p) for (l = 0; l < f; ++l) jd(h, n, 255, g), n += e.Fa;\n return 0;\n }\n\n function We(a, b, c) {\n let d = a.w;\n c[0] = a.h;\n a.Bb && (d == 0 ? --c[0] : (--d, b[0] -= a.width), a.k + a.w + a.h == a.K && (c[0] = a.K - a.k - d));\n return d;\n }\n\n function yg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n for (var e = a.m, g = b.j.J, f = g == Ab || g == Bb, h = b.j.c.RGBA, n = [s], l = We(a, d, n), d = d[0], m = h.ma, l = h.Sa + l * h.f,\n t = l + (f ? 0 : 3), q = 255, r = s, u = s, u = 0; u < n[0]; ++u) {\n for (r = 0; r < e; ++r) {\n const v = c[d + r];\n m[t + 4 * r] = v;\n q &= v;\n }\n d += a.width;\n t += h.f;\n }\n q != 255 && F(g) && WebPApplyAlphaMultiply(m, l, f, e, n, h.f);\n }\n return 0;\n }\n\n function zg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n const e = a.m;\n const g = b.j.J;\n const f = b.j.c.RGBA;\n const h = [s];\n var n = We(a, d, h);\n var d = d[0];\n const l = f.ma;\n var n = f.Sa + n * f.f;\n let m = n + 1;\n let t = 15;\n let q = s;\n for (j = 0; j < h[0]; ++j) {\n for (q = 0; q < e; ++q) {\n const r = c[d + q] >> 4;\n l[m + 2 * q] = l[m + 2 * q] & 240 | r;\n t &= r;\n }\n d += a.width;\n m += f.f;\n }\n t != 15 && F(g) && WebPApplyAlphaMultiply4444(l, n, e, h, f.f);\n }\n return 0;\n }\n\n function vd(a) {\n let b = a.ka;\n const c = b.j.J;\n const d = c\n < ua;\n const e = c == jb || c == Pa || c == Ab || c == kb || c == Ra || F(c);\n b.memory = p;\n b.$a = p;\n b.zb = p;\n b.ad = p;\n if (!Ne(b.Qa, a, e ? ua : Ra)) return 0;\n if (a.I) {\n if (!(d ? InitRGBRescaler(a, b) : InitYUVRescaler(a, b))) return alert('memory error #1'), 0;\n } else {\n if (d) {\n if (b.$a = ug, a.Bb) {\n const g = a.m + 1 >> 1;\n const f = a.m + 2 * g;\n let h; const\n n = [];\n for (h = 0; h < f; ++h) n.push(205);\n n.push(0);\n b.memory = n;\n if (b.memory == p) return alert('memory error #2'), 0;\n b.Sb = b.memory;\n b.Tb = 0;\n b.Qb = b.Sb;\n b.Rb = b.Tb + a.m;\n b.lc = b.Qb;\n b.mc = b.Rb + g;\n b.$a = wg;\n V[Qa] = pg;\n V[jb] = Oe;\n V[Zc] = qg;\n V[Pa] = Pe;\n V[Ab] = Qe;\n V[kb] = Re;\n V[Fe] = rg;\n }\n } else {\n b.$a = tg;\n }\n e && (F(c) && (WebPApplyAlphaMultiply = sg, V[Ob] = Oe, V[Pb] = Pe, V[Bb] = Qe, V[Qb] = Re), b.zb = c == kb || c == Qb ? zg : d ? yg : xg);\n }\n if (d && !Xe) {\n for (a = 0; a < 256; ++a) Za[a] = 89858 * (a - 128) + Jb >> ea, wb[a] = -22014 * (a - 128) + Jb, vb[a] = -45773 * (a - 128), xb[a] = 113618 * (a - 128) + Jb >> ea;\n for (a = J; a < dd; ++a) b = 76283 * (a - 16) + Jb >> ea, ia[a - J] = wa(b, 255), Hb[a - J] = wa(b + 8 >> 4, 15);\n Xe = 1;\n }\n return 1;\n }\n\n function ud(a) {\n const b = a.ka;\n let c = a.m;\n const d = a.h;\n $(!(a.w & 1));\n if (c <= 0 || d <= 0) return 0;\n c = b.$a(a, b);\n b.ec += c;\n b.zb && b.zb(a, b);\n return 1;\n }\n\n function wd(a) {\n a = a.ka;\n a.memory = '';\n a.memory = p;\n }\n\n function ed(a,\n b) {\n return a[b + 0] | a[b + 1] << 8 | a[b + 2] << 16;\n }\n\n function Kb(a, b) {\n return (ed(a, b) | a[b + 3] << 24) >>> 0;\n }\n\n function Ye(a, b, c, d, e, g, f) {\n var h = 0;\n var n = [0];\n var l = 'VP8StatusCode';\n const m = M(Gc);\n if (a == p || c[0] < Lb) return Z;\n m.data = a;\n m.b = [b[0]];\n m.e = [c[0]];\n m.na = [m.na];\n a: {\n h = m.na;\n $(a != p);\n $(c != p);\n $(h != p);\n h[0] = 0;\n if (c[0] >= Lb && !kd(a, b[0], 'RIFF', O)) {\n if (kd(a, b[0] + 8, 'WEBP', O)) {\n l = W;\n break a;\n }\n var t = Kb(a, b[0] + O);\n if (t < O + R) {\n l = W;\n break a;\n }\n h[0] = t;\n b[0] += Lb;\n c[0] -= Lb;\n } else h[0] = 0;\n l = L;\n }\n m.na = m.na[0];\n if (l != L) return l;\n h = m.na > 0;\n t = [0];\n a: if (l = R + fd, $(a != p), $(c != p), $(n != p), n[0] = 0, c[0] < R) l = Z;\n else {\n if (!kd(a, b[0], 'VP8X', O)) {\n var q = s;\n var r = s;\n var u = E;\n if (Kb(a, b[0] + O) != fd) {\n l = W;\n break a;\n }\n if (c[0] < l) {\n l = Z;\n break a;\n }\n u = Kb(a, b[0] + 8);\n q = 1 + ed(a, b[0] + 12);\n r = 1 + ed(a, b[0] + 15);\n if (q * r >= Ag) {\n l = W;\n break a;\n }\n t != p && (t[0] = u);\n d != p && (d[0] = q);\n e != p && (e[0] = r);\n b[0] += l;\n c[0] -= l;\n n[0] = 1;\n }\n l = L;\n }\n if (l != L) return l;\n if (!h && n[0]) return W;\n g != p && (g[0] = !!(t[0] & Bg));\n if (n && f == p) return L;\n if (c < O) return Z;\n if (h && n[0] || !h && !n[0] && !kd(a, b[0], 'ALPH', O)) {\n m.$ = [m.$];\n m.G = [m.G];\n m.pa = [m.pa];\n a: {\n var n = m.na;\n var h = m.$;\n var t = m.G;\n var l = m.pa;\n var q = x;\n var r = 0;\n var u = Mb;\n let v = O + R + fd;\n $(a != p);\n $(c != p);\n q = a;\n r = b[0];\n u = c[0];\n $(h != p);\n $(l != p);\n h[0] = p;\n t[0] = p;\n for (l[0] = 0; ;) {\n let w = E;\n let y = E;\n b[0] = r;\n c[0] = u;\n if (u < R) {\n l = Z;\n break a;\n }\n w = Kb(q, r + O);\n y = R + w + 1 & -2;\n v += y;\n if (n > 0 && v > n) {\n l = W;\n break a;\n }\n if (u < y) {\n l = Z;\n break a;\n }\n if (kd(q, r, 'ALPH', O)) {\n if (!kd(q, r, 'VP8 ', O) || !kd(q, 'VP8L', O)) {\n l = L;\n break a;\n }\n } else h[0] = q, t[0] = r + R, l[0] = w;\n r += y;\n u -= y;\n }\n l = ca;\n }\n m.$ = m.$[0];\n m.G = m.G[0];\n m.pa = m.pa[0];\n if (l != L) return l;\n }\n m.ta = [m.ta];\n m.ia = [m.ia];\n a: if (n = m.na, h = m.ta, t = m.ia, r = !kd(a, b[0], 'VP8 ', O), l = !kd(a, b[0], 'VP8L', O), q = O + R, $(a != p), $(c != p), $(h != p), $(t != p), c[0] < R) l = Z;\n else {\n if (r || l) {\n r = Kb(a, b[0] + O);\n if (n >= q && r > n - q) {\n l = W;\n break a;\n }\n h[0] = r;\n b[0] += R;\n c[0] -= R;\n t[0] = l;\n } else t[0] = c >= 1 && a[b + 0] == ve, h[0] = c[0];\n l = L;\n }\n m.ta = m.ta[0];\n m.ia = m.ia[0];\n if (l != L) return l;\n if (m.ta > Ze) return W;\n if (m.ia) {\n if (c[0] < $e) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n t = g ? g[0] : p;\n a == p || h < $e ? a = 0 : (l = [s], q = [s], r = [s], u = M(af), Rb(u, a, n, h), ue(u, l, q, r) ? (d != p && (d[0] = l[0]), e != p && (e[0] = q[0]), t != p && (t[0] = r[0]), a = 1) : a = 0);\n } else {\n if (c < bf) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n !(a == p || h < bf) && h - 3 >= 3 && a[n + 3 + 0] == 157 && a[n\n + 3 + 1] == 1 && a[n + 3 + 2] == 42 ? (h = a[n + 0] | a[n + 1] << 8 | a[n + 2] << 16, t = (a[n + 7] << 8 | a[n + 6]) & 16383, a = (a[n + 9] << 8 | a[n + 8]) & 16383, !(!(h & 1) + 0) || (h >> 1 & 7) > 3 || !(h >> 4 & 1) || h >> 5 >= m.ta ? a = 0 : (d && (d[0] = t), e && (e[0] = a), a = 1)) : a = 0;\n }\n if (!a) return W;\n g != p && (g[0] |= m.$ != p);\n f != p && (f[0] = m, f[0].offset = b[0] - f[0].b, $(b[0] - f[0].b < Ze), $(f[0].offset == f[0].e - c[0]));\n return L;\n }\n\n function Kd(a) {\n $(a != p);\n return Ye(a[0].data, a[0].b, a[0].e, p, p, p, a);\n }\n\n function cf(a, b, c, d) {\n let e = 'VP8StatusCode';\n const g = M(Vb);\n let f = M(Gc);\n f.data = a;\n f.b = b;\n f.e = c;\n f.b = [f.b];\n f.e = [f.e];\n f = [f];\n e = Kd(f);\n if (e\n != L) return e;\n f = f[0];\n f.b = f.b[0];\n f.e = f.e[0];\n $(d != p);\n td(na);\n g.data = f.data;\n g.b = b + f.offset;\n g.e = f.e - f.offset;\n g.put = ud;\n g.Mb = vd;\n g.Pb = wd;\n g.ka = d;\n if (f.ia) {\n a = sd();\n if (a == p) return cb;\n ng(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !og(a) && (e = a.a)) : e = a.a;\n a != p && sa(a);\n } else {\n e = M(Cg);\n e != p && (Gd(e), e.za = 0, e.Hb = 1);\n a = e;\n if (a == p) return cb;\n a.qb = 0;\n a.Ga = f.$;\n a.G = f.G;\n a.ub = f.pa;\n Hd(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !Mf(a, g) && (e = a.a)) : e = a.a;\n a != p && ke(a);\n }\n e != L && (self || this).Yc(d.j);\n return e;\n }\n\n function lb(a, b, c, d, e) {\n const g = {\n value: 0,\n };\n c = {\n value: c,\n };\n const f = M(df);\n const h = M(gd);\n f.j = h;\n h.J = a;\n const n = {\n value: h.width,\n };\n const l = {\n value: h.height,\n };\n let m;\n m = c;\n const t = M(ef);\n hd(b, g, m, t) != L ? m = 0 : (n != p && (n.value = t.width), l != p && (l.value = t.height), m = 1);\n if (!m) return p;\n h.width = n.value;\n h.height = l.value;\n d != p && (d.value = h.width.value);\n e != p && (e.value = h.height.value);\n return cf(b, g.value, c.value, f) != L ? p : a < ua ? h.c.RGBA.ma : h.c.Va.y;\n }\n\n function hd(a, b, c, d) {\n if (d == p || a == p) return ta;\n $(d != p);\n d.tc = 0;\n d.width = [d.width];\n d.height = [d.height];\n d.$b = [d.$b];\n return Ye(a, b, c, d.width, d.height, d.$b, p);\n }\n\n function Ne(a,\n b, c) {\n const d = b.width;\n const e = b.height;\n let g = 0;\n let f = 0;\n let h = d;\n let n = e;\n b.Ua = a != p && a.Ua > 0;\n if (b.Ua && (h = a.wc, n = a.vc, g = a.t, f = a.k, c < ua || (g &= -2, f &= -2), g < 0 || f < 0 || h <= 0 || n <= 0 || g + h > d || f + n > e)) return 0;\n b.t = g;\n b.k = f;\n b.Ka = g + h;\n b.K = f + n;\n b.m = h;\n b.h = n;\n b.I = a != p && a.I > 0;\n if (b.I) {\n if (a.Ba <= 0 || a.Aa <= 0) return 0;\n b.Ba = a.Ba;\n b.Aa = a.Aa;\n }\n b.Za = a && a.Za;\n b.Bb = a == p || !a.ed;\n b.I && (b.Za = b.Ba < 3 * d / 4 && b.Aa < 3 * e / 4, b.Bb = 0);\n return 1;\n }\n var na = 512;\n var Qa = 0;\n var jb = 1;\n var Zc = 2;\n var Pa = 3;\n var Ab = 4;\n var kb = 5;\n var Fe = 6;\n var Ob = 7;\n var Pb = 8;\n var Bb = 9;\n var Qb = 10;\n var ua = 11;\n var Ra = 12;\n var Cc = 13;\n this.WEBP_CSP_MODE = this.Cd = {\n nd: 0,\n od: 1,\n kd: 2,\n ld: 3,\n jd: 4,\n pd: 5,\n qd: 6,\n rd: 7,\n sd: 8,\n md: 9,\n };\n var gd = {\n J: 'WEBP_CSP_MODE',\n width: s,\n height: s,\n Fc: s,\n c: {\n RGBA: {\n ma: x,\n Sa: 0,\n f: s,\n size: Mb,\n },\n Va: {\n y: x,\n c: x,\n S: x,\n p: x,\n D: x,\n B: x,\n C: x,\n q: x,\n F: s,\n nb: s,\n rb: s,\n Fa: s,\n Wc: Mb,\n Rc: Mb,\n Uc: Mb,\n Wb: Mb,\n },\n },\n Ic: U(4, E),\n Jb: p,\n jc: x,\n };\n var L = 0;\n var cb = 1;\n var ta = 2;\n var W = 3;\n var Hf = 4;\n var Ie = 5;\n var Nf = 6;\n var Z = 7;\n this.VP8StatusCode = this.td = {\n xd: 0,\n yd: 1,\n vd: 2,\n ud: 3,\n Ad: 4,\n zd: 5,\n Bd: 6,\n wd: 7,\n };\n var ef = {\n width: {\n value: s,\n },\n height: {\n value: s,\n },\n $b: {\n value: s,\n },\n tc: s,\n Yd: s,\n rotate: s,\n be: s,\n Ic: U(3, E),\n };\n this.WebPGetFeatures = this.Md = function (a, b, c) {\n let d = 'VP8StatusCode';\n na >>> 8 != na >>> 8 || c == p ? a = ta : (b = [b], d = hd(a, [0], b, c), a = d == Z ? W : d);\n return a;\n };\n const ff = {\n Za: s,\n ed: s,\n Ua: s,\n t: s,\n k: s,\n wc: s,\n vc: s,\n I: s,\n Ba: s,\n Aa: s,\n ae: s,\n Td: s,\n Xd: s,\n Ic: U(6, E),\n };\n this.WebPDecoderConfig = this.Kd = {\n input: M(ef),\n j: M(gd),\n options: M(ff),\n };\n this.WebPInitDecoderConfig = this.Nd = function (a) {\n na >>> 8 != na >>> 8 || a == p ? a = 0 : (a = a.input, $(a != p), a.tc = 0, a = 1);\n return a;\n };\n var Vb = {\n width: s,\n height: s,\n w: s,\n m: s,\n h: s,\n y: x,\n c: x,\n S: x,\n D: 0,\n B: 0,\n C: 0,\n F: s,\n Da: s,\n ka: 0,\n put: 0,\n Mb: 0,\n Pb: 0,\n Bb: s,\n e: Mb,\n data: x,\n b: 0,\n Za: s,\n Ua: s,\n t: s,\n Ka: s,\n k: s,\n K: s,\n I: s,\n Ba: s,\n Aa: s,\n p: x,\n q: 0,\n };\n var df = {\n j: M(gd),\n Sb: x,\n Qb: x,\n lc: x,\n Tb: 0,\n Rb: 0,\n mc: 0,\n ec: s,\n Qa: M(ff),\n memory: 0,\n $a: '(OutputFunc)',\n zb: '(OutputFunc)',\n ad: '(OutputRowFunc)',\n };\n var Gc = {\n data: x,\n b: x,\n e: Mb,\n offset: Mb,\n $: p,\n G: x,\n pa: Mb,\n ta: Mb,\n na: Mb,\n ia: s,\n };\n var Fc = {\n qa: x,\n Ia: p,\n Pd: x,\n Ab: s,\n la: E,\n Z: E,\n gc: s,\n };\n var af = {\n T: bb,\n qa: x,\n Ia: x,\n ya: Mb,\n Q: Mb,\n g: s,\n L: s,\n fa: s,\n };\n var gf = 25;\n var hf = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215];\n var bf = 10;\n var ve = 47;\n var we = 14;\n var Wf = 3;\n var $e = 5;\n var fg = 11;\n var Yc = 5;\n var qe = 4278190080;\n var jg = 8;\n var Tb = 15;\n var Ba = 256;\n var Ge = 24;\n var Je = 4;\n var Be = 0;\n var De = 1;\n var Ae = 2;\n var Ee = 3;\n var Ub = 1;\n var kc = 0;\n var kf = 1;\n var rd = 1;\n var O = 4;\n var R = 8;\n var Lb = 12;\n var fd = 10;\n var Bg = 16;\n var Ag = 1 * Math.pow(2, 32);\n var Ze = -1 - R - 1 >>> 0;\n var jf = {\n kc: s,\n s,\n };\n var Le = {\n Y: 'HuffmanTreeNode*',\n gb: s,\n Pa: s,\n };\n var pd = -1;\n const Dg = {\n ea: E,\n bb: s,\n };\n var ad = 506832829;\n var $b = 0;\n var ge = $b;\n var fe = 2;\n var ee = 3;\n var de = 1;\n var Ef = 4;\n var Df = 5;\n var Cf = 6;\n var Ld = 3;\n var xa = 4;\n var Hc = 4;\n var Gf = 4;\n var Md = 4;\n var Nd = 8;\n var Kc = 3;\n var Lc = 11;\n var f = 32;\n var Pf = 17 * f + 9 * f;\n var Tc = 1 * f + 8;\n var Uc = Tc + 16 * f + f;\n var he = Uc + 16;\n var Id = {\n fb: x,\n Jc: x,\n Nc: x,\n Ra: E,\n };\n var Jd = {\n l: 0,\n v: 0,\n gd: x,\n hd: x,\n uc: x,\n $c: x,\n };\n const Eg = {\n pb: s,\n ob: s,\n tb: s,\n Kb: U(xa, 0),\n Cb: U(xa, 0),\n };\n const Fg = {\n Ta: U(Ld, x),\n z: md([Md, Nd, Kc, Lc], x),\n };\n const Gg = {\n Oc: s,\n Fb: s,\n kb: s,\n oc: s,\n Lc: U(Hc, s),\n Gc: U(Hc, s),\n };\n var Oc = {\n zc: s,\n yc: s,\n ab: s,\n };\n var Qd = {\n X: s,\n ua: s,\n Nb: s,\n };\n const id = U(2, s);\n const Hg = {\n sc: M(id),\n sb: M(id),\n qc: M(id),\n };\n const Ig = {\n ha: s,\n d: s,\n W: s,\n M: Oc,\n N: Vb,\n };\n var Cg = {\n a: 'VP8StatusCode',\n za: s,\n xc: 0,\n o: M(Fc),\n Ac: M(Id),\n P: M(Jd),\n ga: M(Gg),\n Ca: M(Eg),\n rc: 'WebPWorker',\n qb: s,\n Ja: s,\n jb: s,\n oa: Ig,\n Ma: s,\n hb: s,\n lb: s,\n mb: s,\n wb: s,\n Ya: s,\n Hb: s,\n ic: ld(8, Fc),\n Zc: E,\n yb: ld(xa, Hg),\n R: M(Fg),\n pc: s,\n Pc: x,\n dc: x,\n cc: U(4, x),\n Xc: x,\n Sc: x,\n Vc: x,\n La: M(Qd),\n M: M(Oc),\n Ea: x,\n z: 0,\n ca: x,\n aa: x,\n ra: x,\n da: s,\n ba: s,\n sa: s,\n H: s,\n r: s,\n ib: 0,\n Gb: Mb,\n i: s,\n d: s,\n wa: x,\n Eb: U(16, x),\n Vd: 0,\n Tc: x,\n Lb: x,\n ja: E,\n Oa: E,\n A: s,\n W: s,\n Zb: U(xa, x),\n Ga: p,\n G: 0,\n ub: Mb,\n Xb: x,\n Od: 0,\n cd: s,\n dd: x,\n Wd: 0,\n fc: Mb,\n };\n var Db = 0;\n var Cb = 1;\n var cd = 2;\n const Jg = {\n Qc: 'VP8LImageTransformType',\n n: s,\n U: s,\n Vb: s,\n u: E,\n b: E,\n };\n var gg = {\n va: ld(Yc, Le),\n };\n const Kg = {\n xb: s,\n Yb: M(Dg),\n Dc: s,\n eb: s,\n Ec: s,\n ac: E,\n bd: E,\n hc: s,\n Db: 'HTreeGroup',\n };\n var eg = {\n a: 'VP8StatusCode',\n Wa: 'VP8LDecodeState',\n Ob: 'VP8LDecodeState',\n N: 'VP8Io',\n Ib: 'WebPDecBuffer',\n Hc: 'WebPDecBuffer',\n V: E,\n Ha: E,\n Xa: E,\n vb: E,\n o: M(af),\n l: s,\n v: s,\n O: s,\n xa: s,\n cb: M(Kg),\n Na: s,\n nc: ld(Je, Jg),\n Ub: E,\n Mc: x,\n $d: x,\n Zd: '*WebPRescaler',\n };\n var lf = 4;\n var nf = [p, function (a, b, c, d, e, g, f, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(f != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(g >= c * e);\n for (n = 0; n < d; ++n) {\n n == 0 ? N(f, h, a, b, e) : Ea(a, b, f, l - g, f, h, e), Ea(a, b + e, f, l, f, h + e, e * (c - 1)),\n l += g, b += g, h += g;\n }\n }, function (a, b, c, d, e, f, k, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, l, k, h + e, e * (c - 1));\n for (n = 1; n < d; ++n) b += f, h += f, Ea(a, b, k, l, k, h, e * c), l += f;\n }, function (a, b, c, d, e, f, k, h) {\n var n = h;\n let l = s;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, n, k, h + e, e * (c - 1));\n for (l = 1; l < d; ++l) {\n let m = s;\n var n = n + f;\n b += f;\n h += f;\n Ea(a, b, k, n - f, k, h, e);\n for (m = e; m < c * e; ++m) {\n const t = k[n + m - e] + k[n + m - f] - k[n + m - f - e];\n k[h + m] = a[b + m] + (t < 0 ? 0 : t > 255 ? 255 : t) & 255;\n }\n }\n }];\n var yd = [3, 4, 3, 4, 4, 2, 2, 4, 4, 4,\n 2, 1, 1,\n ];\n this.WebPFreeDecBuffer = this.Yc = function (a) {\n a != p && (a.Fc || (a.Jb = ''), a.jc = 0, a.Jb = a.jc = p);\n };\n self = this;\n var va = U(511, x);\n var tc = U(511, x);\n var sc = U(2041, 0);\n var oc = U(225, 0);\n var oa = U(766, x);\n var Rd = 0;\n var Xb = 85627;\n var Wb = 35468;\n var Uf = [function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 4; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n c >>= 3;\n for (d = 0; d < 4; ++d) jd(a, b + d * f, c, 4);\n }, function (a, b) {\n Dc(a, b, 4);\n }, function (a, b) {\n let c = b - f;\n const d = [];\n d.push(y(a[c - 1], a[c + 0], a[c + 1]));\n d.push(y(a[c + 0], a[c + 1], a[c + 2]));\n d.push(y(a[c + 1], a[c + 2], a[c + 3]));\n d.push(y(a[c + 2], a[c + 3], a[c + 4]));\n for (c = 0; c < 4; ++c) N(a, b + c * f, d, 0, 4);\n },\n function (a, b) {\n const c = a[b - 1];\n const d = a[b - 1 + f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = a[b + 1 + 0 * f] = a[b + 2 + 0 * f] = a[b + 3 + 0 * f] = y(a[b - 1 - f], c, d);\n a[b + 0 + 1 * f] = a[b + 1 + 1 * f] = a[b + 2 + 1 * f] = a[b + 3 + 1 * f] = y(c, d, e);\n a[b + 0 + 2 * f] = a[b + 1 + 2 * f] = a[b + 2 + 2 * f] = a[b + 3 + 2 * f] = y(d, e, g);\n a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = y(e, g, g);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 3 * f] = y(d, e, a[b - 1 + 3 * f]);\n a[b + 0 + 2 * f] = a[b + 1 + 3 * f] = y(c, d, e);\n a[b + 0 + 1 * f] = a[b + 1 + 2 * f] = a[b + 2 + 3 * f] = y(g, c, d);\n a[b\n + 0 + 0 * f] = a[b + 1 + 1 * f] = a[b + 2 + 2 * f] = a[b + 3 + 3 * f] = y(k, g, c);\n a[b + 1 + 0 * f] = a[b + 2 + 1 * f] = a[b + 3 + 2 * f] = y(h, k, g);\n a[b + 2 + 0 * f] = a[b + 3 + 1 * f] = y(n, h, k);\n a[b + 3 + 0 * f] = y(l, n, h);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 0 * f] = a[b + 1 + 2 * f] = g + k + 1 >> 1;\n a[b + 1 + 0 * f] = a[b + 2 + 2 * f] = k + h + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 3 + 2 * f] = h + n + 1 >> 1;\n a[b + 3 + 0 * f] = n + l + 1 >> 1;\n a[b + 0 + 3 * f] = y(e, d, c);\n a[b + 0 + 2 * f] = y(d, c, g);\n a[b + 0 + 1 * f] = a[b + 1 + 3 * f] = y(c, g, k);\n a[b + 1 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 2 + 1 * f] = a[b + 3 + 3 * f] = y(k, h, n);\n a[b + 3 + 1 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b + 1 - f];\n const d = a[b + 2 - f];\n const e = a[b + 3 - f];\n const g = a[b + 4 - f];\n const k = a[b + 5 - f];\n const h = a[b + 6 - f];\n const n = a[b + 7 - f];\n a[b + 0 + 0 * f] = y(a[b + 0 - f], c, d);\n a[b + 1 + 0 * f] = a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 2 + 0 * f] = a[b + 1 + 1 * f] = a[b + 0 + 2 * f] = y(d, e, g);\n a[b + 3 + 0 * f] = a[b + 2 + 1 * f] = a[b + 1 + 2 * f] = a[b + 0 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 2 * f] = a[b + 1 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = a[b + 2 + 3 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, n);\n },\n function (a, b) {\n const c = a[b + 0 - f];\n const d = a[b + 1 - f];\n const e = a[b + 2 - f];\n const g = a[b + 3 - f];\n const k = a[b + 4 - f];\n const h = a[b + 5 - f];\n const n = a[b + 6 - f];\n const l = a[b + 7 - f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 1 + 0 * f] = a[b\n + 0 + 2 * f] = d + e + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 1 + 2 * f] = e + g + 1 >> 1;\n a[b + 3 + 0 * f] = a[b + 2 + 2 * f] = g + k + 1 >> 1;\n a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 1 + 1 * f] = a[b + 0 + 3 * f] = y(d, e, g);\n a[b + 2 + 1 * f] = a[b + 1 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n const k = a[b - 1 - f];\n const h = a[b + 0 - f];\n const n = a[b + 1 - f];\n const l = a[b + 2 - f];\n a[b + 0 + 0 * f] = a[b + 2 + 1 * f] = c + k + 1 >> 1;\n a[b + 0 + 1 * f] = a[b + 2 + 2 * f] = d + c + 1 >> 1;\n a[b + 0 + 2 * f] = a[b + 2 + 3 * f] = e + d + 1 >> 1;\n a[b + 0 + 3 * f] = g + e + 1 >> 1;\n a[b + 3 + 0 * f] = y(h, n, l);\n a[b + 2 + 0 * f] = y(k, h, n);\n a[b\n + 1 + 0 * f] = a[b + 3 + 1 * f] = y(c, k, h);\n a[b + 1 + 1 * f] = a[b + 3 + 2 * f] = y(d, c, k);\n a[b + 1 + 2 * f] = a[b + 3 + 3 * f] = y(e, d, c);\n a[b + 1 + 3 * f] = y(g, e, d);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 0 + 1 * f] = d + e + 1 >> 1;\n a[b + 2 + 1 * f] = a[b + 0 + 2 * f] = e + g + 1 >> 1;\n a[b + 1 + 0 * f] = y(c, d, e);\n a[b + 3 + 0 * f] = a[b + 1 + 1 * f] = y(d, e, g);\n a[b + 3 + 1 * f] = a[b + 1 + 2 * f] = y(e, g, g);\n a[b + 3 + 2 * f] = a[b + 2 + 2 * f] = a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = g;\n },\n ];\n var Vf = [function (a, b) {\n let c = 16;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f] + a[b + d - f];\n Yb(c >> 5, a, b);\n }, function (a,\n b) {\n Dc(a, b, 16);\n }, function (a, b) {\n let c;\n for (c = 0; c < 16; ++c) N(a, b + c * f, a, b - f, 16);\n }, function (a, b) {\n let c;\n for (c = 16; c > 0; --c) jd(a, b + 0, a[b - 1], 16), b += f;\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b + d - f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n Yb(128, a, b);\n }];\n var je = [function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n Zb(1 * (c >> 4), a, b);\n }, function (a, b) {\n Dc(a, b, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) N(a, b + c * f, a, b - f, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) {\n jd(a,\n b + 0, a[b - 1], 8), b += f;\n }\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b - 1 + d * f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n Zb(128, a, b);\n }];\n let mc; let Pc; let Qc; let Rc; let Sd; let Td; let Ud; let Vd; let Wd; let Xd; let Yd; let Zd; let $d; let ae; let be; let ce; var Pd = 31;\n var uc = [0, 2, 8];\n var Od = 3;\n var Of = 1;\n var ie = [0 + 0 * f, 4 + 0 * f, 8 + 0 * f, 12 + 0 * f, 0 + 4 * f, 4 + 4 * f, 8 + 4 * f, 12 + 4 * f, 0 + 8 * f, 4 + 8 * f, 8 + 8 * f, 12 + 8 * f, 0 + 12 * f, 4 + 12 * f, 8 + 12 * f, 12 + 12 * f];\n var Ic = [4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38,\n 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,\n ];\n var Jc = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96,\n 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,\n ];\n var Sf = [-$b, 1, -1, 2, -2, 3, 4, 6, -3, 5, -4, -5, -6, 7, -7, 8, -8, -9];\n var Ff = [\n [\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],\n [189, 129, 242, 255, 227, 213, 255, 219, 128, 128,\n 128,\n ],\n [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128],\n ],\n [\n [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],\n [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],\n [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128],\n ],\n [\n [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],\n [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],\n [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128],\n ],\n [\n [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],\n [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],\n [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128],\n ],\n [\n [1, 204, 254, 255, 245, 255, 128, 128, 128, 128,\n 128,\n ],\n [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],\n [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128],\n ],\n [\n [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],\n [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],\n [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],\n [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],\n [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128],\n ],\n [\n [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],\n [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],\n [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128],\n ],\n [\n [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],\n [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],\n [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128],\n ],\n [\n [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],\n [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],\n [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128],\n ],\n [\n [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],\n [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],\n [22,\n 100, 174, 245, 186, 161, 255, 199, 128, 128, 128,\n ],\n ],\n [\n [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],\n [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],\n [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128],\n ],\n [\n [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],\n [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],\n [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128],\n ],\n [\n [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],\n [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],\n [175, 13,\n 224, 243, 193, 185, 249, 198, 255, 255, 128,\n ],\n [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128],\n ],\n [\n [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],\n [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],\n [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128],\n ],\n [\n [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],\n [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],\n [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128],\n ],\n [\n [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],\n [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],\n [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 16, 248, 255,\n 255, 128, 128, 128, 128, 128, 128,\n ],\n [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],\n [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],\n [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],\n [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128,\n 128, 128, 128, 128, 128, 128, 128,\n ],\n ],\n ],\n [\n [\n [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],\n [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],\n [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128],\n ],\n [\n [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],\n [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],\n [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128],\n ],\n [\n [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],\n [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],\n [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128],\n ],\n [\n [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],\n [149, 150, 226, 252, 216,\n 205, 255, 171, 128, 128, 128,\n ],\n [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128],\n ],\n [\n [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],\n [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],\n [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128],\n ],\n [\n [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],\n [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],\n [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128],\n ],\n [\n [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],\n [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],\n [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128,\n 128, 128, 128, 128,\n ],\n [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n ];\n var Rf = [\n [\n [231, 120, 48, 89, 115, 113, 120, 152, 112],\n [152, 179, 64, 126, 170, 118, 46, 70, 95],\n [175, 69, 143, 80, 85, 82, 72, 155, 103],\n [56, 58, 10, 171, 218, 189, 17, 13, 152],\n [114, 26, 17, 163, 44, 195, 21, 10, 173],\n [121, 24, 80, 195, 26, 62, 44, 64, 85],\n [144, 71, 10, 38, 171, 213, 144, 34, 26],\n [170, 46, 55, 19, 136, 160, 33, 206, 71],\n [63, 20, 8, 114, 114, 208, 12, 9, 226],\n [81, 40, 11, 96, 182, 84, 29, 16, 36],\n ],\n [\n [134, 183, 89, 137, 98, 101, 106, 165, 148],\n [72, 187, 100, 130, 157, 111,\n 32, 75, 80,\n ],\n [66, 102, 167, 99, 74, 62, 40, 234, 128],\n [41, 53, 9, 178, 241, 141, 26, 8, 107],\n [74, 43, 26, 146, 73, 166, 49, 23, 157],\n [65, 38, 105, 160, 51, 52, 31, 115, 128],\n [104, 79, 12, 27, 217, 255, 87, 17, 7],\n [87, 68, 71, 44, 114, 51, 15, 186, 23],\n [47, 41, 14, 110, 182, 183, 21, 17, 194],\n [66, 45, 25, 102, 197, 189, 23, 18, 22],\n ],\n [\n [88, 88, 147, 150, 42, 46, 45, 196, 205],\n [43, 97, 183, 117, 85, 38, 35, 179, 61],\n [39, 53, 200, 87, 26, 21, 43, 232, 171],\n [56, 34, 51, 104, 114, 102, 29, 93, 77],\n [39, 28, 85, 171, 58, 165, 90, 98, 64],\n [34, 22, 116, 206, 23, 34, 43, 166, 73],\n [107, 54, 32, 26, 51, 1, 81, 43, 31],\n [68, 25, 106, 22,\n 64, 171, 36, 225, 114,\n ],\n [34, 19, 21, 102, 132, 188, 16, 76, 124],\n [62, 18, 78, 95, 85, 57, 50, 48, 51],\n ],\n [\n [193, 101, 35, 159, 215, 111, 89, 46, 111],\n [60, 148, 31, 172, 219, 228, 21, 18, 111],\n [112, 113, 77, 85, 179, 255, 38, 120, 114],\n [40, 42, 1, 196, 245, 209, 10, 25, 109],\n [88, 43, 29, 140, 166, 213, 37, 43, 154],\n [61, 63, 30, 155, 67, 45, 68, 1, 209],\n [100, 80, 8, 43, 154, 1, 51, 26, 71],\n [142, 78, 78, 16, 255, 128, 34, 197, 171],\n [41, 40, 5, 102, 211, 183, 4, 1, 221],\n [51, 50, 17, 168, 209, 192, 23, 25, 82],\n ],\n [\n [138, 31, 36, 171, 27, 166, 38, 44, 229],\n [67, 87, 58, 169, 82, 115, 26, 59, 179],\n [63, 59, 90, 180, 59, 166, 93, 73,\n 154,\n ],\n [40, 40, 21, 116, 143, 209, 34, 39, 175],\n [47, 15, 16, 183, 34, 223, 49, 45, 183],\n [46, 17, 33, 183, 6, 98, 15, 32, 183],\n [57, 46, 22, 24, 128, 1, 54, 17, 37],\n [65, 32, 73, 115, 28, 128, 23, 128, 205],\n [40, 3, 9, 115, 51, 192, 18, 6, 223],\n [87, 37, 9, 115, 59, 77, 64, 21, 47],\n ],\n [\n [104, 55, 44, 218, 9, 54, 53, 130, 226],\n [64, 90, 70, 205, 40, 41, 23, 26, 57],\n [54, 57, 112, 184, 5, 41, 38, 166, 213],\n [30, 34, 26, 133, 152, 116, 10, 32, 134],\n [39, 19, 53, 221, 26, 114, 32, 73, 255],\n [31, 9, 65, 234, 2, 15, 1, 118, 73],\n [75, 32, 12, 51, 192, 255, 160, 43, 51],\n [88, 31, 35, 67, 102, 85, 55, 186, 85],\n [56, 21, 23, 111, 59, 205, 45, 37, 192],\n [55, 38, 70, 124, 73, 102, 1, 34, 98],\n ],\n [\n [125, 98, 42, 88, 104, 85, 117, 175, 82],\n [95, 84, 53, 89, 128, 100, 113, 101, 45],\n [75, 79, 123, 47, 51, 128, 81, 171, 1],\n [57, 17, 5, 71, 102, 57, 53, 41, 49],\n [38, 33, 13, 121, 57, 73, 26, 1, 85],\n [41, 10, 67, 138, 77, 110, 90, 47, 114],\n [115, 21, 2, 10, 102, 255, 166, 23, 6],\n [101, 29, 16, 10, 85, 128, 101, 196, 26],\n [57, 18, 10, 102, 102, 213, 34, 20, 43],\n [117, 20, 15, 36, 163, 128, 68, 1, 26],\n ],\n [\n [102, 61, 71, 37, 34, 53, 31, 243, 192],\n [69, 60, 71, 38, 73, 119, 28, 222, 37],\n [68, 45, 128, 34, 1, 47, 11, 245, 171],\n [62, 17, 19, 70, 146, 85, 55, 62, 70],\n [37, 43, 37, 154, 100, 163, 85, 160,\n 1,\n ],\n [63, 9, 92, 136, 28, 64, 32, 201, 85],\n [75, 15, 9, 9, 64, 255, 184, 119, 16],\n [86, 6, 28, 5, 64, 255, 25, 248, 1],\n [56, 8, 17, 132, 137, 255, 55, 116, 128],\n [58, 15, 20, 82, 135, 57, 26, 121, 40],\n ],\n [\n [164, 50, 31, 137, 154, 133, 25, 35, 218],\n [51, 103, 44, 131, 131, 123, 31, 6, 158],\n [86, 40, 64, 135, 148, 224, 45, 183, 128],\n [22, 26, 17, 131, 240, 154, 14, 1, 209],\n [45, 16, 21, 91, 64, 222, 7, 1, 197],\n [56, 21, 39, 155, 60, 138, 23, 102, 213],\n [83, 12, 13, 54, 192, 255, 68, 47, 28],\n [85, 26, 85, 85, 128, 128, 32, 146, 171],\n [18, 11, 7, 63, 144, 171, 4, 4, 246],\n [35, 27, 10, 146, 174, 171, 12, 26, 128],\n ],\n [\n [190, 80, 35, 99, 180, 80,\n 126, 54, 45,\n ],\n [85, 126, 47, 87, 176, 51, 41, 20, 32],\n [101, 75, 128, 139, 118, 146, 116, 128, 85],\n [56, 41, 15, 176, 236, 85, 37, 9, 62],\n [71, 30, 17, 119, 118, 255, 17, 18, 138],\n [101, 38, 60, 138, 55, 70, 43, 26, 142],\n [146, 36, 19, 30, 171, 255, 97, 27, 20],\n [138, 45, 61, 62, 219, 1, 81, 188, 64],\n [32, 41, 20, 117, 151, 142, 20, 21, 163],\n [112, 19, 12, 61, 195, 128, 48, 4, 24],\n ],\n ];\n var If = [\n [\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 241,\n 252, 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],\n [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [225, 252, 241, 253, 255, 255, 254, 255,\n 255, 255, 255,\n ],\n [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255,\n 255, 255, 255, 255, 255, 255,\n ],\n [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n ],\n ],\n [\n [\n [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],\n [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255,\n 255, 255,\n ],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 253, 255, 255, 255,\n 255, 255, 255, 255, 255,\n ],\n [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 253,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n ];\n this.WebPGetDecoderVersion = this.Ld = function () {\n return 512;\n };\n var Nc = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0];\n var Jf = [\n [173, 148, 140, 0],\n [176, 155, 140, 135, 0],\n [180, 157, 141, 134, 130, 0],\n [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0],\n ];\n var Kf = [0, 1, 4, 8, 5, 2, 3, 6,\n 9, 12, 13, 10, 7, 11, 14, 15,\n ];\n var Tf = md([Kc, Lc], '');\n U(4, x);\n var vc = [\n [0, 0, 0, 0],\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [1, 1, 0, 0],\n [0, 0, 1, 0],\n [1, 0, 1, 0],\n [0, 1, 1, 0],\n [1, 1, 1, 0],\n [0, 0, 0, 1],\n [1, 0, 0, 1],\n [0, 1, 0, 1],\n [1, 1, 0, 1],\n [0, 0, 1, 1],\n [1, 0, 1, 1],\n [0, 1, 1, 1],\n [1, 1, 1, 1],\n ];\n var Lf = 134480385;\n var ea = 16;\n var J = -227;\n var dd = 482;\n var Ce = [Wc, function (a) {\n return a;\n }, function (a, b, c) {\n return b[c + 0];\n }, function (a, b, c) {\n return b[c + 1];\n }, function (a, b, c) {\n return b[c - 1];\n }, function (a, b, c) {\n return ka(ka(a, b[c + 1]), b[c + 0]);\n }, function (a, b, c) {\n return ka(a, b[c - 1]);\n }, function (a, b, c) {\n return ka(a, b[c + 0]);\n }, function (a,\n b, c) {\n return ka(b[c - 1], b[c + 0]);\n }, function (a, b, c) {\n return ka(b[c + 0], b[c + 1]);\n }, function (a, b, c) {\n return ka(ka(a, b[c - 1]), ka(b[c + 0], b[c + 1]));\n }, function (a, b, c) {\n return Math.abs((a >> 24 & 255) - (b[c - 1] >> 24 & 255)) - Math.abs((b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) + (Math.abs((a >> 16 & 255) - (b[c - 1] >> 16 & 255)) - Math.abs((b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255))) + (Math.abs((a >> 8 & 255) - (b[c - 1] >> 8 & 255)) - Math.abs((b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255))) + (Math.abs((a & 255) - (b[c - 1] & 255)) - Math.abs((b[c + 0] & 255) - (b[c - 1] & 255))) <= 0 ? b[c + 0] : a;\n }, function (a, b, c) {\n return ($a((a\n >> 24 & 255) + (b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) << 24 | $a((a >> 16 & 255) + (b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255)) << 16 | $a((a >> 8 & 255) + (b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255)) << 8 | $a((a & 255) + (b[c + 0] & 255) - (b[c - 1] & 255))) >>> 0;\n }, function (a, b, c) {\n const d = b[c - 1];\n a = ka(a, b[c + 0]);\n return (yb(a >> 24 & 255, d >> 24 & 255) << 24 | yb(a >> 16 & 255, d >> 16 & 255) << 16 | yb(a >> 8 & 255, d >> 8 & 255) << 8 | yb(a >> 0 & 255, d >> 0 & 255)) >>> 0;\n }, Wc, Wc];\n var Xf = {\n Cc: x,\n Bc: x,\n Kc: x,\n };\n var $c = 16;\n var Me = 16;\n var kg = 16;\n var mg = [2, 3, 7];\n var lg = [3, 3, 11];\n var Zf = 0;\n var $f = 1;\n var ag = 2;\n var bg = 3;\n var cg = 4;\n var hg = [Ba + Ge, Ba, Ba, Ba, 40];\n var Ke = 19;\n var ig = [17, 18, 0, 1, 2, 3, 4, 5, 16,\n 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n ];\n var He = 120;\n var dg = [24, 7, 23, 25, 40, 6, 39, 41, 22, 26, 38, 42, 56, 5, 55, 57, 21, 27, 54, 58, 37, 43, 72, 4, 71, 73, 20, 28, 53, 59, 70, 74, 36, 44, 88, 69, 75, 52, 60, 3, 87, 89, 19, 29, 86, 90, 35, 45, 68, 76, 85, 91, 51, 61, 104, 2, 103, 105, 18, 30, 102, 106, 34, 46, 84, 92, 67, 77, 101, 107, 50, 62, 120, 1, 119, 121, 83, 93, 17, 31, 100, 108, 66, 78, 118, 122, 33, 47, 117, 123, 49, 63, 99, 109, 82, 94, 0, 116, 124, 65, 79, 16, 32, 98, 110, 48, 115, 125, 81, 95, 64, 114, 126, 97, 111, 80, 113, 127, 96, 112];\n var Jb = 1 << ea - 1;\n var Za = U(256, 0);\n var xb = U(256, 0);\n var vb = U(256, la);\n var wb = U(256, la);\n var ia = U(dd - J, x);\n var Hb = U(dd\n - J, x);\n var Xe = 0;\n var V = Array(Cc);\n var vg = [function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, hc, 3);\n }, Se, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, Vc, 3);\n }, Te, Ue, Ve, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, le, 2);\n }, Se, Te, Ue, Ve];\n this.Hd = function (a, b, c, d) {\n return lb(Qa, a, b, c, d);\n };\n this.Id = function (a, b, c, d) {\n return lb(jb, a, b, c, d);\n };\n this.Jd = function (a, b, c, d) {\n return lb(kb, a, b, c, d);\n };\n this.Ed = function (a, b, c, d) {\n return lb(Ab, a, b, c, d);\n };\n this.Fd = function (a, b, c, d) {\n return lb(Zc,\n a, b, c, d);\n };\n this.Gd = function (a, b, c, d) {\n return lb(Pa, a, b, c, d);\n };\n this.WebPDecode = this.Dd = function (a, b, c) {\n const d = M(df);\n let e = 'VP8StatusCode';\n if (c == p) return ta;\n e = hd(a, [0], [b], c.input);\n if (e != L) return e == Z ? W : e;\n d.j = c.j;\n d.Qa = c.Qa;\n return e = cf(a, 0, [b], d);\n };\n};\n","// eslint-disable-next-line import/no-unassigned-import\nimport './text-encoding-polyfill';\nconst decoder = new TextDecoder('utf-8');\nexport function decode(bytes) {\n return decoder.decode(bytes);\n}\nconst encoder = new TextEncoder();\nexport function encode(str) {\n return encoder.encode(str);\n}\n//# sourceMappingURL=utf8.browser.js.map","import { decode, encode } from './utf8';\nconst defaultByteLength = 1024 * 8;\nexport class IOBuffer {\n /**\n * @param data - The data to construct the IOBuffer with.\n * If data is a number, it will be the new buffer's length
\n * If data is `undefined`, the buffer will be initialized with a default length of 8Kb
\n * If data is an ArrayBuffer, SharedArrayBuffer, an ArrayBufferView (Typed Array), an IOBuffer instance,\n * or a Node.js Buffer, a view will be created over the underlying ArrayBuffer.\n * @param options\n */\n constructor(data = defaultByteLength, options = {}) {\n let dataIsGiven = false;\n if (typeof data === 'number') {\n data = new ArrayBuffer(data);\n }\n else {\n dataIsGiven = true;\n this.lastWrittenByte = data.byteLength;\n }\n const offset = options.offset ? options.offset >>> 0 : 0;\n const byteLength = data.byteLength - offset;\n let dvOffset = offset;\n if (ArrayBuffer.isView(data) || data instanceof IOBuffer) {\n if (data.byteLength !== data.buffer.byteLength) {\n dvOffset = data.byteOffset + offset;\n }\n data = data.buffer;\n }\n if (dataIsGiven) {\n this.lastWrittenByte = byteLength;\n }\n else {\n this.lastWrittenByte = 0;\n }\n this.buffer = data;\n this.length = byteLength;\n this.byteLength = byteLength;\n this.byteOffset = dvOffset;\n this.offset = 0;\n this.littleEndian = true;\n this._data = new DataView(this.buffer, dvOffset, byteLength);\n this._mark = 0;\n this._marks = [];\n }\n /**\n * Checks if the memory allocated to the buffer is sufficient to store more\n * bytes after the offset.\n * @param byteLength - The needed memory in bytes.\n * @returns `true` if there is sufficient space and `false` otherwise.\n */\n available(byteLength = 1) {\n return this.offset + byteLength <= this.length;\n }\n /**\n * Check if little-endian mode is used for reading and writing multi-byte\n * values.\n * @returns `true` if little-endian mode is used, `false` otherwise.\n */\n isLittleEndian() {\n return this.littleEndian;\n }\n /**\n * Set little-endian mode for reading and writing multi-byte values.\n */\n setLittleEndian() {\n this.littleEndian = true;\n return this;\n }\n /**\n * Check if big-endian mode is used for reading and writing multi-byte values.\n * @returns `true` if big-endian mode is used, `false` otherwise.\n */\n isBigEndian() {\n return !this.littleEndian;\n }\n /**\n * Switches to big-endian mode for reading and writing multi-byte values.\n */\n setBigEndian() {\n this.littleEndian = false;\n return this;\n }\n /**\n * Move the pointer n bytes forward.\n * @param n - Number of bytes to skip.\n */\n skip(n = 1) {\n this.offset += n;\n return this;\n }\n /**\n * Move the pointer to the given offset.\n * @param offset\n */\n seek(offset) {\n this.offset = offset;\n return this;\n }\n /**\n * Store the current pointer offset.\n * @see {@link IOBuffer#reset}\n */\n mark() {\n this._mark = this.offset;\n return this;\n }\n /**\n * Move the pointer back to the last pointer offset set by mark.\n * @see {@link IOBuffer#mark}\n */\n reset() {\n this.offset = this._mark;\n return this;\n }\n /**\n * Push the current pointer offset to the mark stack.\n * @see {@link IOBuffer#popMark}\n */\n pushMark() {\n this._marks.push(this.offset);\n return this;\n }\n /**\n * Pop the last pointer offset from the mark stack, and set the current\n * pointer offset to the popped value.\n * @see {@link IOBuffer#pushMark}\n */\n popMark() {\n const offset = this._marks.pop();\n if (offset === undefined) {\n throw new Error('Mark stack empty');\n }\n this.seek(offset);\n return this;\n }\n /**\n * Move the pointer offset back to 0.\n */\n rewind() {\n this.offset = 0;\n return this;\n }\n /**\n * Make sure the buffer has sufficient memory to write a given byteLength at\n * the current pointer offset.\n * If the buffer's memory is insufficient, this method will create a new\n * buffer (a copy) with a length that is twice (byteLength + current offset).\n * @param byteLength\n */\n ensureAvailable(byteLength = 1) {\n if (!this.available(byteLength)) {\n const lengthNeeded = this.offset + byteLength;\n const newLength = lengthNeeded * 2;\n const newArray = new Uint8Array(newLength);\n newArray.set(new Uint8Array(this.buffer));\n this.buffer = newArray.buffer;\n this.length = this.byteLength = newLength;\n this._data = new DataView(this.buffer);\n }\n return this;\n }\n /**\n * Read a byte and return false if the byte's value is 0, or true otherwise.\n * Moves pointer forward by one byte.\n */\n readBoolean() {\n return this.readUint8() !== 0;\n }\n /**\n * Read a signed 8-bit integer and move pointer forward by 1 byte.\n */\n readInt8() {\n return this._data.getInt8(this.offset++);\n }\n /**\n * Read an unsigned 8-bit integer and move pointer forward by 1 byte.\n */\n readUint8() {\n return this._data.getUint8(this.offset++);\n }\n /**\n * Alias for {@link IOBuffer#readUint8}.\n */\n readByte() {\n return this.readUint8();\n }\n /**\n * Read `n` bytes and move pointer forward by `n` bytes.\n */\n readBytes(n = 1) {\n const bytes = new Uint8Array(n);\n for (let i = 0; i < n; i++) {\n bytes[i] = this.readByte();\n }\n return bytes;\n }\n /**\n * Read a 16-bit signed integer and move pointer forward by 2 bytes.\n */\n readInt16() {\n const value = this._data.getInt16(this.offset, this.littleEndian);\n this.offset += 2;\n return value;\n }\n /**\n * Read a 16-bit unsigned integer and move pointer forward by 2 bytes.\n */\n readUint16() {\n const value = this._data.getUint16(this.offset, this.littleEndian);\n this.offset += 2;\n return value;\n }\n /**\n * Read a 32-bit signed integer and move pointer forward by 4 bytes.\n */\n readInt32() {\n const value = this._data.getInt32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 32-bit unsigned integer and move pointer forward by 4 bytes.\n */\n readUint32() {\n const value = this._data.getUint32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 32-bit floating number and move pointer forward by 4 bytes.\n */\n readFloat32() {\n const value = this._data.getFloat32(this.offset, this.littleEndian);\n this.offset += 4;\n return value;\n }\n /**\n * Read a 64-bit floating number and move pointer forward by 8 bytes.\n */\n readFloat64() {\n const value = this._data.getFloat64(this.offset, this.littleEndian);\n this.offset += 8;\n return value;\n }\n /**\n * Read a 1-byte ASCII character and move pointer forward by 1 byte.\n */\n readChar() {\n return String.fromCharCode(this.readInt8());\n }\n /**\n * Read `n` 1-byte ASCII characters and move pointer forward by `n` bytes.\n */\n readChars(n = 1) {\n let result = '';\n for (let i = 0; i < n; i++) {\n result += this.readChar();\n }\n return result;\n }\n /**\n * Read the next `n` bytes, return a UTF-8 decoded string and move pointer\n * forward by `n` bytes.\n */\n readUtf8(n = 1) {\n return decode(this.readBytes(n));\n }\n /**\n * Write 0xff if the passed value is truthy, 0x00 otherwise and move pointer\n * forward by 1 byte.\n */\n writeBoolean(value) {\n this.writeUint8(value ? 0xff : 0x00);\n return this;\n }\n /**\n * Write `value` as an 8-bit signed integer and move pointer forward by 1 byte.\n */\n writeInt8(value) {\n this.ensureAvailable(1);\n this._data.setInt8(this.offset++, value);\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as an 8-bit unsigned integer and move pointer forward by 1\n * byte.\n */\n writeUint8(value) {\n this.ensureAvailable(1);\n this._data.setUint8(this.offset++, value);\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * An alias for {@link IOBuffer#writeUint8}.\n */\n writeByte(value) {\n return this.writeUint8(value);\n }\n /**\n * Write all elements of `bytes` as uint8 values and move pointer forward by\n * `bytes.length` bytes.\n */\n writeBytes(bytes) {\n this.ensureAvailable(bytes.length);\n for (let i = 0; i < bytes.length; i++) {\n this._data.setUint8(this.offset++, bytes[i]);\n }\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 16-bit signed integer and move pointer forward by 2\n * bytes.\n */\n writeInt16(value) {\n this.ensureAvailable(2);\n this._data.setInt16(this.offset, value, this.littleEndian);\n this.offset += 2;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 16-bit unsigned integer and move pointer forward by 2\n * bytes.\n */\n writeUint16(value) {\n this.ensureAvailable(2);\n this._data.setUint16(this.offset, value, this.littleEndian);\n this.offset += 2;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit signed integer and move pointer forward by 4\n * bytes.\n */\n writeInt32(value) {\n this.ensureAvailable(4);\n this._data.setInt32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit unsigned integer and move pointer forward by 4\n * bytes.\n */\n writeUint32(value) {\n this.ensureAvailable(4);\n this._data.setUint32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 32-bit floating number and move pointer forward by 4\n * bytes.\n */\n writeFloat32(value) {\n this.ensureAvailable(4);\n this._data.setFloat32(this.offset, value, this.littleEndian);\n this.offset += 4;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write `value` as a 64-bit floating number and move pointer forward by 8\n * bytes.\n */\n writeFloat64(value) {\n this.ensureAvailable(8);\n this._data.setFloat64(this.offset, value, this.littleEndian);\n this.offset += 8;\n this._updateLastWrittenByte();\n return this;\n }\n /**\n * Write the charCode of `str`'s first character as an 8-bit unsigned integer\n * and move pointer forward by 1 byte.\n */\n writeChar(str) {\n return this.writeUint8(str.charCodeAt(0));\n }\n /**\n * Write the charCodes of all `str`'s characters as 8-bit unsigned integers\n * and move pointer forward by `str.length` bytes.\n */\n writeChars(str) {\n for (let i = 0; i < str.length; i++) {\n this.writeUint8(str.charCodeAt(i));\n }\n return this;\n }\n /**\n * UTF-8 encode and write `str` to the current pointer offset and move pointer\n * forward according to the encoded length.\n */\n writeUtf8(str) {\n return this.writeBytes(encode(str));\n }\n /**\n * Export a Uint8Array view of the internal buffer.\n * The view starts at the byte offset and its length\n * is calculated to stop at the last written byte or the original length.\n */\n toArray() {\n return new Uint8Array(this.buffer, this.byteOffset, this.lastWrittenByte);\n }\n /**\n * Update the last written byte offset\n * @private\n */\n _updateLastWrittenByte() {\n if (this.offset > this.lastWrittenByte) {\n this.lastWrittenByte = this.offset;\n }\n }\n}\n//# sourceMappingURL=IOBuffer.js.map","\n/*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//const Z_FILTERED = 1;\n//const Z_HUFFMAN_ONLY = 2;\n//const Z_RLE = 3;\nconst Z_FIXED = 4;\n//const Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nconst Z_BINARY = 0;\nconst Z_TEXT = 1;\n//const Z_ASCII = 1; // = Z_TEXT\nconst Z_UNKNOWN = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nconst STORED_BLOCK = 0;\nconst STATIC_TREES = 1;\nconst DYN_TREES = 2;\n/* The three kinds of block type */\n\nconst MIN_MATCH = 3;\nconst MAX_MATCH = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nconst LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nconst LITERALS = 256;\n/* number of literal bytes 0..255 */\n\nconst L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nconst D_CODES = 30;\n/* number of distance codes */\n\nconst BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\n\nconst HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\n\nconst MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst Buf_size = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nconst MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nconst END_BLOCK = 256;\n/* end of block literal code */\n\nconst REP_3_6 = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nconst REPZ_3_10 = 17;\n/* repeat a zero length 3-10 times (3 bits of repeat count) */\n\nconst REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nconst extra_lbits = /* extra bits for each length code */\n new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]);\n\nconst extra_dbits = /* extra bits for each distance code */\n new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]);\n\nconst extra_blbits = /* extra bits for each bit length code */\n new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]);\n\nconst bl_order =\n new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nconst DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nconst static_ltree = new Array((L_CODES + 2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nconst static_dtree = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nconst _dist_code = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nconst _length_code = new Array(MAX_MATCH - MIN_MATCH + 1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nconst base_length = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nconst base_dist = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n this.static_tree = static_tree; /* static tree or NULL */\n this.extra_bits = extra_bits; /* extra bits for each code or NULL */\n this.extra_base = extra_base; /* base index for extra_bits */\n this.elems = elems; /* max number of elements in the tree */\n this.max_length = max_length; /* max bit length for the codes */\n\n // show if `static_tree` has data or dummy - needed for monomorphic objects\n this.has_stree = static_tree && static_tree.length;\n}\n\n\nlet static_l_desc;\nlet static_d_desc;\nlet static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n this.dyn_tree = dyn_tree; /* the dynamic tree */\n this.max_code = 0; /* largest code with non zero frequency */\n this.stat_desc = stat_desc; /* the corresponding static tree */\n}\n\n\n\nconst d_code = (dist) => {\n\n return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n};\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nconst put_short = (s, w) => {\n// put_byte(s, (uch)((w) & 0xff));\n// put_byte(s, (uch)((ush)(w) >> 8));\n s.pending_buf[s.pending++] = (w) & 0xff;\n s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n};\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nconst send_bits = (s, value, length) => {\n\n if (s.bi_valid > (Buf_size - length)) {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n put_short(s, s.bi_buf);\n s.bi_buf = value >> (Buf_size - s.bi_valid);\n s.bi_valid += length - Buf_size;\n } else {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n s.bi_valid += length;\n }\n};\n\n\nconst send_code = (s, c, tree) => {\n\n send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n};\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nconst bi_reverse = (code, len) => {\n\n let res = 0;\n do {\n res |= code & 1;\n code >>>= 1;\n res <<= 1;\n } while (--len > 0);\n return res >>> 1;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nconst bi_flush = (s) => {\n\n if (s.bi_valid === 16) {\n put_short(s, s.bi_buf);\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n } else if (s.bi_valid >= 8) {\n s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n s.bi_buf >>= 8;\n s.bi_valid -= 8;\n }\n};\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n * above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n * array bl_count contains the frequencies for each bit length.\n * The length opt_len is updated; static_len is also updated if stree is\n * not null.\n */\nconst gen_bitlen = (s, desc) =>\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n const tree = desc.dyn_tree;\n const max_code = desc.max_code;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const extra = desc.stat_desc.extra_bits;\n const base = desc.stat_desc.extra_base;\n const max_length = desc.stat_desc.max_length;\n let h; /* heap index */\n let n, m; /* iterate over the tree elements */\n let bits; /* bit length */\n let xbits; /* extra bits */\n let f; /* frequency */\n let overflow = 0; /* number of elements with bit length too large */\n\n for (bits = 0; bits <= MAX_BITS; bits++) {\n s.bl_count[bits] = 0;\n }\n\n /* In a first pass, compute the optimal bit lengths (which may\n * overflow in the case of the bit length tree).\n */\n tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {\n n = s.heap[h];\n bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n if (bits > max_length) {\n bits = max_length;\n overflow++;\n }\n tree[n * 2 + 1]/*.Len*/ = bits;\n /* We overwrite tree[n].Dad which is no longer needed */\n\n if (n > max_code) { continue; } /* not a leaf node */\n\n s.bl_count[bits]++;\n xbits = 0;\n if (n >= base) {\n xbits = extra[n - base];\n }\n f = tree[n * 2]/*.Freq*/;\n s.opt_len += f * (bits + xbits);\n if (has_stree) {\n s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n }\n }\n if (overflow === 0) { return; }\n\n // Trace((stderr,\"\\nbit length overflow\\n\"));\n /* This happens for example on obj2 and pic of the Calgary corpus */\n\n /* Find the first bit length which could increase: */\n do {\n bits = max_length - 1;\n while (s.bl_count[bits] === 0) { bits--; }\n s.bl_count[bits]--; /* move one leaf down the tree */\n s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n s.bl_count[max_length]--;\n /* The brother of the overflow item also moves one step up,\n * but this does not affect bl_count[max_length]\n */\n overflow -= 2;\n } while (overflow > 0);\n\n /* Now recompute all bit lengths, scanning in increasing frequency.\n * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n * lengths instead of fixing only the wrong ones. This idea is taken\n * from 'ar' written by Haruhiko Okumura.)\n */\n for (bits = max_length; bits !== 0; bits--) {\n n = s.bl_count[bits];\n while (n !== 0) {\n m = s.heap[--h];\n if (m > max_code) { continue; }\n if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n tree[m * 2 + 1]/*.Len*/ = bits;\n }\n n--;\n }\n }\n};\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n * zero code length.\n */\nconst gen_codes = (tree, max_code, bl_count) =>\n// ct_data *tree; /* the tree to decorate */\n// int max_code; /* largest code with non zero frequency */\n// ushf *bl_count; /* number of codes at each bit length */\n{\n const next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */\n let code = 0; /* running code value */\n let bits; /* bit index */\n let n; /* code index */\n\n /* The distribution counts are first used to generate the code values\n * without bit reversal.\n */\n for (bits = 1; bits <= MAX_BITS; bits++) {\n next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n }\n /* Check that the bit counts in bl_count are consistent. The last code\n * must be all ones.\n */\n //Assert (code + bl_count[MAX_BITS]-1 == (1< {\n\n let n; /* iterates over tree elements */\n let bits; /* bit counter */\n let length; /* length value */\n let code; /* code value */\n let dist; /* distance index */\n const bl_count = new Array(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n // do check in _tr_init()\n //if (static_init_done) return;\n\n /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n static_l_desc.static_tree = static_ltree;\n static_l_desc.extra_bits = extra_lbits;\n static_d_desc.static_tree = static_dtree;\n static_d_desc.extra_bits = extra_dbits;\n static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n /* Initialize the mapping length (0..255) -> length code (0..28) */\n length = 0;\n for (code = 0; code < LENGTH_CODES - 1; code++) {\n base_length[code] = length;\n for (n = 0; n < (1 << extra_lbits[code]); n++) {\n _length_code[length++] = code;\n }\n }\n //Assert (length == 256, \"tr_static_init: length != 256\");\n /* Note that the length 255 (match length 258) can be represented\n * in two different ways: code 284 + 5 bits or code 285, so we\n * overwrite length_code[255] to use the best encoding:\n */\n _length_code[length - 1] = code;\n\n /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n dist = 0;\n for (code = 0; code < 16; code++) {\n base_dist[code] = dist;\n for (n = 0; n < (1 << extra_dbits[code]); n++) {\n _dist_code[dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: dist != 256\");\n dist >>= 7; /* from now on, all distances are divided by 128 */\n for (; code < D_CODES; code++) {\n base_dist[code] = dist << 7;\n for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n _dist_code[256 + dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n /* Construct the codes of the static literal tree */\n for (bits = 0; bits <= MAX_BITS; bits++) {\n bl_count[bits] = 0;\n }\n\n n = 0;\n while (n <= 143) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n while (n <= 255) {\n static_ltree[n * 2 + 1]/*.Len*/ = 9;\n n++;\n bl_count[9]++;\n }\n while (n <= 279) {\n static_ltree[n * 2 + 1]/*.Len*/ = 7;\n n++;\n bl_count[7]++;\n }\n while (n <= 287) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n /* Codes 286 and 287 do not exist, but we must include them in the\n * tree construction to get a canonical Huffman tree (longest code\n * all ones)\n */\n gen_codes(static_ltree, L_CODES + 1, bl_count);\n\n /* The static distance tree is trivial: */\n for (n = 0; n < D_CODES; n++) {\n static_dtree[n * 2 + 1]/*.Len*/ = 5;\n static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n }\n\n // Now data ready and we can init static trees\n static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);\n static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS);\n static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS);\n\n //static_init_done = true;\n};\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nconst init_block = (s) => {\n\n let n; /* iterates over tree elements */\n\n /* Initialize the trees. */\n for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n s.opt_len = s.static_len = 0;\n s.last_lit = s.matches = 0;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nconst bi_windup = (s) =>\n{\n if (s.bi_valid > 8) {\n put_short(s, s.bi_buf);\n } else if (s.bi_valid > 0) {\n //put_byte(s, (Byte)s->bi_buf);\n s.pending_buf[s.pending++] = s.bi_buf;\n }\n s.bi_buf = 0;\n s.bi_valid = 0;\n};\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nconst copy_block = (s, buf, len, header) =>\n//DeflateState *s;\n//charf *buf; /* the input data */\n//unsigned len; /* its length */\n//int header; /* true if block header must be written */\n{\n bi_windup(s); /* align on byte boundary */\n\n if (header) {\n put_short(s, len);\n put_short(s, ~len);\n }\n// while (len--) {\n// put_byte(s, *buf++);\n// }\n s.pending_buf.set(s.window.subarray(buf, buf + len), s.pending);\n s.pending += len;\n};\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nconst smaller = (tree, n, m, depth) => {\n\n const _n2 = n * 2;\n const _m2 = m * 2;\n return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n};\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nconst pqdownheap = (s, tree, k) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to restore */\n// int k; /* node to move down */\n{\n const v = s.heap[k];\n let j = k << 1; /* left son of k */\n while (j <= s.heap_len) {\n /* Set j to the smallest of the two sons: */\n if (j < s.heap_len &&\n smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n j++;\n }\n /* Exit if v is smaller than both sons */\n if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n /* Exchange v with the smallest son */\n s.heap[k] = s.heap[j];\n k = j;\n\n /* And continue down the tree, setting j to the left son of k */\n j <<= 1;\n }\n s.heap[k] = v;\n};\n\n\n// inlined manually\n// const SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nconst compress_block = (s, ltree, dtree) =>\n// deflate_state *s;\n// const ct_data *ltree; /* literal tree */\n// const ct_data *dtree; /* distance tree */\n{\n let dist; /* distance of matched string */\n let lc; /* match length or unmatched char (if dist == 0) */\n let lx = 0; /* running index in l_buf */\n let code; /* the code to send */\n let extra; /* number of extra bits to send */\n\n if (s.last_lit !== 0) {\n do {\n dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n lc = s.pending_buf[s.l_buf + lx];\n lx++;\n\n if (dist === 0) {\n send_code(s, lc, ltree); /* send a literal byte */\n //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n } else {\n /* Here, lc is the match length - MIN_MATCH */\n code = _length_code[lc];\n send_code(s, code + LITERALS + 1, ltree); /* send the length code */\n extra = extra_lbits[code];\n if (extra !== 0) {\n lc -= base_length[code];\n send_bits(s, lc, extra); /* send the extra length bits */\n }\n dist--; /* dist is now the match distance - 1 */\n code = d_code(dist);\n //Assert (code < D_CODES, \"bad d_code\");\n\n send_code(s, code, dtree); /* send the distance code */\n extra = extra_dbits[code];\n if (extra !== 0) {\n dist -= base_dist[code];\n send_bits(s, dist, extra); /* send the extra distance bits */\n }\n } /* literal or match pair ? */\n\n /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n // \"pendingBuf overflow\");\n\n } while (lx < s.last_lit);\n }\n\n send_code(s, END_BLOCK, ltree);\n};\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n * and corresponding code. The length opt_len is updated; static_len is\n * also updated if stree is not null. The field max_code is set.\n */\nconst build_tree = (s, desc) =>\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n const tree = desc.dyn_tree;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const elems = desc.stat_desc.elems;\n let n, m; /* iterate over heap elements */\n let max_code = -1; /* largest code with non zero frequency */\n let node; /* new node being created */\n\n /* Construct the initial heap, with least frequent element in\n * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n * heap[0] is not used.\n */\n s.heap_len = 0;\n s.heap_max = HEAP_SIZE;\n\n for (n = 0; n < elems; n++) {\n if (tree[n * 2]/*.Freq*/ !== 0) {\n s.heap[++s.heap_len] = max_code = n;\n s.depth[n] = 0;\n\n } else {\n tree[n * 2 + 1]/*.Len*/ = 0;\n }\n }\n\n /* The pkzip format requires that at least one distance code exists,\n * and that at least one bit should be sent even if there is only one\n * possible code. So to avoid special checks later on we force at least\n * two codes of non zero frequency.\n */\n while (s.heap_len < 2) {\n node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n tree[node * 2]/*.Freq*/ = 1;\n s.depth[node] = 0;\n s.opt_len--;\n\n if (has_stree) {\n s.static_len -= stree[node * 2 + 1]/*.Len*/;\n }\n /* node is 0 or 1 so it does not have extra bits */\n }\n desc.max_code = max_code;\n\n /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n * establish sub-heaps of increasing lengths:\n */\n for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n /* Construct the Huffman tree by repeatedly combining the least two\n * frequent nodes.\n */\n node = elems; /* next internal node of the tree */\n do {\n //pqremove(s, tree, n); /* n = node of least frequency */\n /*** pqremove ***/\n n = s.heap[1/*SMALLEST*/];\n s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n pqdownheap(s, tree, 1/*SMALLEST*/);\n /***/\n\n m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n s.heap[--s.heap_max] = m;\n\n /* Create a new node father of n and m */\n tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n /* and insert the new node in the heap */\n s.heap[1/*SMALLEST*/] = node++;\n pqdownheap(s, tree, 1/*SMALLEST*/);\n\n } while (s.heap_len >= 2);\n\n s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n /* At this point, the fields freq and dad are set. We can now\n * generate the bit lengths.\n */\n gen_bitlen(s, desc);\n\n /* The field len is now set, we can generate the bit codes */\n gen_codes(tree, max_code, s.bl_count);\n};\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nconst scan_tree = (s, tree, max_code) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n } else if (curlen !== 0) {\n\n if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n } else if (count <= 10) {\n s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n } else {\n s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n }\n\n count = 0;\n prevlen = curlen;\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nconst send_tree = (s, tree, max_code) =>\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n /* tree[max_code+1].Len = -1; */ /* guard already set */\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n send_code(s, curlen, s.bl_tree);\n count--;\n }\n //Assert(count >= 3 && count <= 6, \" 3_6?\");\n send_code(s, REP_3_6, s.bl_tree);\n send_bits(s, count - 3, 2);\n\n } else if (count <= 10) {\n send_code(s, REPZ_3_10, s.bl_tree);\n send_bits(s, count - 3, 3);\n\n } else {\n send_code(s, REPZ_11_138, s.bl_tree);\n send_bits(s, count - 11, 7);\n }\n\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nconst build_bl_tree = (s) => {\n\n let max_blindex; /* index of last bit length code of non zero freq */\n\n /* Determine the bit length frequencies for literal and distance trees */\n scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n /* Build the bit length tree: */\n build_tree(s, s.bl_desc);\n /* opt_len now includes the length of the tree representations, except\n * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n */\n\n /* Determine the number of bit length codes to send. The pkzip format\n * requires that at least 4 bit length codes be sent. (appnote.txt says\n * 3 but the actual value used is 4.)\n */\n for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {\n if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n break;\n }\n }\n /* Update opt_len to include the bit length tree and counts */\n s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n // s->opt_len, s->static_len));\n\n return max_blindex;\n};\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nconst send_all_trees = (s, lcodes, dcodes, blcodes) =>\n// deflate_state *s;\n// int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n let rank; /* index in bl_order */\n\n //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n // \"too many codes\");\n //Tracev((stderr, \"\\nbl counts: \"));\n send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n send_bits(s, dcodes - 1, 5);\n send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */\n for (rank = 0; rank < blcodes; rank++) {\n //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n }\n //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n};\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n * a) There are no non-portable control characters belonging to the\n * \"black list\" (0..6, 14..25, 28..31).\n * b) There is at least one printable character belonging to the\n * \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n * \"gray list\" that is ignored in this detection algorithm:\n * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nconst detect_data_type = (s) => {\n /* black_mask is the bit mask of black-listed bytes\n * set bits 0..6, 14..25, and 28..31\n * 0xf3ffc07f = binary 11110011111111111100000001111111\n */\n let black_mask = 0xf3ffc07f;\n let n;\n\n /* Check for non-textual (\"black-listed\") bytes. */\n for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n return Z_BINARY;\n }\n }\n\n /* Check for textual (\"white-listed\") bytes. */\n if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n for (n = 32; n < LITERALS; n++) {\n if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n }\n\n /* There are no \"black-listed\" or \"white-listed\" bytes:\n * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n */\n return Z_BINARY;\n};\n\n\nlet static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nconst _tr_init = (s) =>\n{\n\n if (!static_init_done) {\n tr_static_init();\n static_init_done = true;\n }\n\n s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);\n s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);\n s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n /* Initialize the first block of the first file: */\n init_block(s);\n};\n\n\n/* ===========================================================================\n * Send a stored block\n */\nconst _tr_stored_block = (s, buf, stored_len, last) =>\n//DeflateState *s;\n//charf *buf; /* input block */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */\n copy_block(s, buf, stored_len, true); /* with header */\n};\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nconst _tr_align = (s) => {\n send_bits(s, STATIC_TREES << 1, 3);\n send_code(s, END_BLOCK, static_ltree);\n bi_flush(s);\n};\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nconst _tr_flush_block = (s, buf, stored_len, last) =>\n//DeflateState *s;\n//charf *buf; /* input block, or NULL if too old */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n let opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n let max_blindex = 0; /* index of last bit length code of non zero freq */\n\n /* Build the Huffman trees unless a stored block is forced */\n if (s.level > 0) {\n\n /* Check if the file is binary or text */\n if (s.strm.data_type === Z_UNKNOWN) {\n s.strm.data_type = detect_data_type(s);\n }\n\n /* Construct the literal and distance trees */\n build_tree(s, s.l_desc);\n // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n\n build_tree(s, s.d_desc);\n // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n /* At this point, opt_len and static_len are the total bit lengths of\n * the compressed block data, excluding the tree representations.\n */\n\n /* Build the bit length tree for the above two trees, and get the index\n * in bl_order of the last bit length code to send.\n */\n max_blindex = build_bl_tree(s);\n\n /* Determine the best encoding. Compute the block lengths in bytes. */\n opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n // s->last_lit));\n\n if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n } else {\n // Assert(buf != (char*)0, \"lost buf\");\n opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n }\n\n if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n /* 4: two words for the lengths */\n\n /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n * Otherwise we can't have processed more than WSIZE input bytes since\n * the last block flush, because compression would have been\n * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n * transform a block into a stored block.\n */\n _tr_stored_block(s, buf, stored_len, last);\n\n } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n compress_block(s, static_ltree, static_dtree);\n\n } else {\n send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n compress_block(s, s.dyn_ltree, s.dyn_dtree);\n }\n // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n /* The above check is made mod 2^32, for files larger than 512 MB\n * and uLong implemented on 32 bits.\n */\n init_block(s);\n\n if (last) {\n bi_windup(s);\n }\n // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n // s->compressed_len-7*last));\n};\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nconst _tr_tally = (s, dist, lc) =>\n// deflate_state *s;\n// unsigned dist; /* distance of matched string */\n// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n //let out_length, in_length, dcode;\n\n s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;\n s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n s.last_lit++;\n\n if (dist === 0) {\n /* lc is the unmatched char */\n s.dyn_ltree[lc * 2]/*.Freq*/++;\n } else {\n s.matches++;\n /* Here, lc is the match length - MIN_MATCH */\n dist--; /* dist = match distance - 1 */\n //Assert((ush)dist < (ush)MAX_DIST(s) &&\n // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n // (ush)d_code(dist) < (ush)D_CODES, \"_tr_tally: bad match\");\n\n s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;\n s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n// /* Try to guess if it is profitable to stop the current block here */\n// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n// /* Compute an upper bound for the compressed length */\n// out_length = s.last_lit*8;\n// in_length = s.strstart - s.block_start;\n//\n// for (dcode = 0; dcode < D_CODES; dcode++) {\n// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n// }\n// out_length >>>= 3;\n// //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n// // s->last_lit, in_length, out_length,\n// // 100L - out_length*100L/in_length));\n// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n// return true;\n// }\n// }\n//#endif\n\n return (s.last_lit === s.lit_bufsize - 1);\n /* We avoid equality with lit_bufsize because of wraparound at 64K\n * on 16 bit machines and because stored blocks are restricted to\n * 64K-1 bytes.\n */\n};\n\nvar _tr_init_1 = _tr_init;\nvar _tr_stored_block_1 = _tr_stored_block;\nvar _tr_flush_block_1 = _tr_flush_block;\nvar _tr_tally_1 = _tr_tally;\nvar _tr_align_1 = _tr_align;\n\nvar trees = {\n\t_tr_init: _tr_init_1,\n\t_tr_stored_block: _tr_stored_block_1,\n\t_tr_flush_block: _tr_flush_block_1,\n\t_tr_tally: _tr_tally_1,\n\t_tr_align: _tr_align_1\n};\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst adler32 = (adler, buf, len, pos) => {\n let s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n};\n\n\nvar adler32_1 = adler32;\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nconst makeTable = () => {\n let c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n};\n\n// Create table on load. Just 255 signed longs. Not a problem.\nconst crcTable = new Uint32Array(makeTable());\n\n\nconst crc32 = (crc, buf, len, pos) => {\n const t = crcTable;\n const end = pos + len;\n\n crc ^= -1;\n\n for (let i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n};\n\n\nvar crc32_1 = crc32;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar messages = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar constants = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst { _tr_init: _tr_init$1, _tr_stored_block: _tr_stored_block$1, _tr_flush_block: _tr_flush_block$1, _tr_tally: _tr_tally$1, _tr_align: _tr_align$1 } = trees;\n\n\n\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH, Z_PARTIAL_FLUSH, Z_FULL_FLUSH, Z_FINISH, Z_BLOCK,\n Z_OK, Z_STREAM_END, Z_STREAM_ERROR, Z_DATA_ERROR, Z_BUF_ERROR,\n Z_DEFAULT_COMPRESSION,\n Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED: Z_FIXED$1, Z_DEFAULT_STRATEGY,\n Z_UNKNOWN: Z_UNKNOWN$1,\n Z_DEFLATED\n} = constants;\n\n/*============================================================================*/\n\n\nconst MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nconst MAX_WBITS = 15;\n/* 32K LZ77 window */\nconst DEF_MEM_LEVEL = 8;\n\n\nconst LENGTH_CODES$1 = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nconst LITERALS$1 = 256;\n/* number of literal bytes 0..255 */\nconst L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1;\n/* number of Literal or Length codes, including the END_BLOCK code */\nconst D_CODES$1 = 30;\n/* number of distance codes */\nconst BL_CODES$1 = 19;\n/* number of codes used to transfer the bit lengths */\nconst HEAP_SIZE$1 = 2 * L_CODES$1 + 1;\n/* maximum heap size */\nconst MAX_BITS$1 = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst MIN_MATCH$1 = 3;\nconst MAX_MATCH$1 = 258;\nconst MIN_LOOKAHEAD = (MAX_MATCH$1 + MIN_MATCH$1 + 1);\n\nconst PRESET_DICT = 0x20;\n\nconst INIT_STATE = 42;\nconst EXTRA_STATE = 69;\nconst NAME_STATE = 73;\nconst COMMENT_STATE = 91;\nconst HCRC_STATE = 103;\nconst BUSY_STATE = 113;\nconst FINISH_STATE = 666;\n\nconst BS_NEED_MORE = 1; /* block not completed, need more input or more output */\nconst BS_BLOCK_DONE = 2; /* block flush performed */\nconst BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nconst BS_FINISH_DONE = 4; /* finish done, accept no more input or output */\n\nconst OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nconst err = (strm, errorCode) => {\n strm.msg = messages[errorCode];\n return errorCode;\n};\n\nconst rank = (f) => {\n return ((f) << 1) - ((f) > 4 ? 9 : 0);\n};\n\nconst zero$1 = (buf) => {\n let len = buf.length; while (--len >= 0) { buf[len] = 0; }\n};\n\n\n/* eslint-disable new-cap */\nlet HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;\n// This hash causes less collisions, https://github.com/nodeca/pako/issues/135\n// But breaks binary compatibility\n//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask;\nlet HASH = HASH_ZLIB;\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nconst flush_pending = (strm) => {\n const s = strm.state;\n\n //_tr_flush_bits(s);\n let len = s.pending;\n if (len > strm.avail_out) {\n len = strm.avail_out;\n }\n if (len === 0) { return; }\n\n strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out);\n strm.next_out += len;\n s.pending_out += len;\n strm.total_out += len;\n strm.avail_out -= len;\n s.pending -= len;\n if (s.pending === 0) {\n s.pending_out = 0;\n }\n};\n\n\nconst flush_block_only = (s, last) => {\n _tr_flush_block$1(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n s.block_start = s.strstart;\n flush_pending(s.strm);\n};\n\n\nconst put_byte = (s, b) => {\n s.pending_buf[s.pending++] = b;\n};\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nconst putShortMSB = (s, b) => {\n\n // put_byte(s, (Byte)(b >> 8));\n// put_byte(s, (Byte)(b & 0xff));\n s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n s.pending_buf[s.pending++] = b & 0xff;\n};\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read. All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nconst read_buf = (strm, buf, start, size) => {\n\n let len = strm.avail_in;\n\n if (len > size) { len = size; }\n if (len === 0) { return 0; }\n\n strm.avail_in -= len;\n\n // zmemcpy(buf, strm->next_in, len);\n buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start);\n if (strm.state.wrap === 1) {\n strm.adler = adler32_1(strm.adler, buf, len, start);\n }\n\n else if (strm.state.wrap === 2) {\n strm.adler = crc32_1(strm.adler, buf, len, start);\n }\n\n strm.next_in += len;\n strm.total_in += len;\n\n return len;\n};\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nconst longest_match = (s, cur_match) => {\n\n let chain_length = s.max_chain_length; /* max hash chain length */\n let scan = s.strstart; /* current string */\n let match; /* matched string */\n let len; /* length of current match */\n let best_len = s.prev_length; /* best match length so far */\n let nice_match = s.nice_match; /* stop if match long enough */\n const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n const _win = s.window; // shortcut\n\n const wmask = s.w_mask;\n const prev = s.prev;\n\n /* Stop when cur_match becomes <= limit. To simplify the code,\n * we prevent matches with the string of window index 0.\n */\n\n const strend = s.strstart + MAX_MATCH$1;\n let scan_end1 = _win[scan + best_len - 1];\n let scan_end = _win[scan + best_len];\n\n /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n * It is easy to get rid of this optimization if necessary.\n */\n // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n /* Do not waste too much time if we already have a good match: */\n if (s.prev_length >= s.good_match) {\n chain_length >>= 2;\n }\n /* Do not look for matches beyond the end of the input. This is necessary\n * to make deflate deterministic.\n */\n if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n do {\n // Assert(cur_match < s->strstart, \"no future\");\n match = cur_match;\n\n /* Skip to next match if the match length cannot increase\n * or if the match length is less than 2. Note that the checks below\n * for insufficient lookahead only occur occasionally for performance\n * reasons. Therefore uninitialized memory will be accessed, and\n * conditional jumps will be made that depend on those values.\n * However the length of the match is limited to the lookahead, so\n * the output of deflate is not affected by the uninitialized values.\n */\n\n if (_win[match + best_len] !== scan_end ||\n _win[match + best_len - 1] !== scan_end1 ||\n _win[match] !== _win[scan] ||\n _win[++match] !== _win[scan + 1]) {\n continue;\n }\n\n /* The check at best_len-1 can be removed because it will be made\n * again later. (This heuristic is not always a win.)\n * It is not necessary to compare scan[2] and match[2] since they\n * are always equal when the other bytes match, given that\n * the hash keys are equal and that HASH_BITS >= 8.\n */\n scan += 2;\n match++;\n // Assert(*scan == *match, \"match[2]?\");\n\n /* We check for insufficient lookahead only every 8th comparison;\n * the 256th check will be made at strstart+258.\n */\n do {\n /*jshint noempty:false*/\n } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n scan < strend);\n\n // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n len = MAX_MATCH$1 - (strend - scan);\n scan = strend - MAX_MATCH$1;\n\n if (len > best_len) {\n s.match_start = cur_match;\n best_len = len;\n if (len >= nice_match) {\n break;\n }\n scan_end1 = _win[scan + best_len - 1];\n scan_end = _win[scan + best_len];\n }\n } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n if (best_len <= s.lookahead) {\n return best_len;\n }\n return s.lookahead;\n};\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n * At least one byte has been read, or avail_in == 0; reads are\n * performed for at least two bytes (required for the zip translate_eol\n * option -- not supported here).\n */\nconst fill_window = (s) => {\n\n const _w_size = s.w_size;\n let p, n, m, more, str;\n\n //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n do {\n more = s.window_size - s.lookahead - s.strstart;\n\n // JS ints have 32 bit, block below not needed\n /* Deal with !@#$% 64K limit: */\n //if (sizeof(int) <= 2) {\n // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n // more = wsize;\n //\n // } else if (more == (unsigned)(-1)) {\n // /* Very unlikely, but possible on 16 bit machine if\n // * strstart == 0 && lookahead == 1 (input done a byte at time)\n // */\n // more--;\n // }\n //}\n\n\n /* If the window is almost full and there is insufficient lookahead,\n * move the upper half to the lower one to make room in the upper half.\n */\n if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n s.window.set(s.window.subarray(_w_size, _w_size + _w_size), 0);\n s.match_start -= _w_size;\n s.strstart -= _w_size;\n /* we now have strstart >= MAX_DIST */\n s.block_start -= _w_size;\n\n /* Slide the hash table (could be avoided with 32 bit values\n at the expense of memory usage). We slide even when level == 0\n to keep the hash table consistent if we switch back to level > 0\n later. (Using level 0 permanently is not an optimal usage of\n zlib, so we don't care about this pathological case.)\n */\n\n n = s.hash_size;\n p = n;\n\n do {\n m = s.head[--p];\n s.head[p] = (m >= _w_size ? m - _w_size : 0);\n } while (--n);\n\n n = _w_size;\n p = n;\n\n do {\n m = s.prev[--p];\n s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n /* If n is not on any hash chain, prev[n] is garbage but\n * its value will never be used.\n */\n } while (--n);\n\n more += _w_size;\n }\n if (s.strm.avail_in === 0) {\n break;\n }\n\n /* If there was no sliding:\n * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n * more == window_size - lookahead - strstart\n * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n * => more >= window_size - 2*WSIZE + 2\n * In the BIG_MEM or MMAP case (not yet supported),\n * window_size == input_size + MIN_LOOKAHEAD &&\n * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n * Otherwise, window_size == 2*WSIZE so more >= 2.\n * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n */\n //Assert(more >= 2, \"more < 2\");\n n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n s.lookahead += n;\n\n /* Initialize the hash value now that we have some input: */\n if (s.lookahead + s.insert >= MIN_MATCH$1) {\n str = s.strstart - s.insert;\n s.ins_h = s.window[str];\n\n /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + 1]);\n//#if MIN_MATCH != 3\n// Call update_hash() MIN_MATCH-3 more times\n//#endif\n while (s.insert) {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH$1 - 1]);\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = str;\n str++;\n s.insert--;\n if (s.lookahead + s.insert < MIN_MATCH$1) {\n break;\n }\n }\n }\n /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n * but this is not important since only literal bytes will be emitted.\n */\n\n } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n /* If the WIN_INIT bytes after the end of the current data have never been\n * written, then zero those bytes in order to avoid memory check reports of\n * the use of uninitialized (or uninitialised as Julian writes) bytes by\n * the longest match routines. Update the high water mark for the next\n * time through here. WIN_INIT is set to MAX_MATCH since the longest match\n * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n */\n// if (s.high_water < s.window_size) {\n// const curr = s.strstart + s.lookahead;\n// let init = 0;\n//\n// if (s.high_water < curr) {\n// /* Previous high water mark below current data -- zero WIN_INIT\n// * bytes or up to end of window, whichever is less.\n// */\n// init = s.window_size - curr;\n// if (init > WIN_INIT)\n// init = WIN_INIT;\n// zmemzero(s->window + curr, (unsigned)init);\n// s->high_water = curr + init;\n// }\n// else if (s->high_water < (ulg)curr + WIN_INIT) {\n// /* High water mark at or above current data, but below current data\n// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n// * to end of window, whichever is less.\n// */\n// init = (ulg)curr + WIN_INIT - s->high_water;\n// if (init > s->window_size - s->high_water)\n// init = s->window_size - s->high_water;\n// zmemzero(s->window + s->high_water, (unsigned)init);\n// s->high_water += init;\n// }\n// }\n//\n// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n// \"not enough room for search\");\n};\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nconst deflate_stored = (s, flush) => {\n\n /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n * to pending_buf_size, and each stored block has a 5 byte header:\n */\n let max_block_size = 0xffff;\n\n if (max_block_size > s.pending_buf_size - 5) {\n max_block_size = s.pending_buf_size - 5;\n }\n\n /* Copy as much as possible from input to output: */\n for (;;) {\n /* Fill the window as much as possible: */\n if (s.lookahead <= 1) {\n\n //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n // s->block_start >= (long)s->w_size, \"slide too late\");\n// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n// s.block_start >= s.w_size)) {\n// throw new Error(\"slide too late\");\n// }\n\n fill_window(s);\n if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n\n if (s.lookahead === 0) {\n break;\n }\n /* flush the current block */\n }\n //Assert(s->block_start >= 0L, \"block gone\");\n// if (s.block_start < 0) throw new Error(\"block gone\");\n\n s.strstart += s.lookahead;\n s.lookahead = 0;\n\n /* Emit a stored block if pending_buf will be full: */\n const max_start = s.block_start + max_block_size;\n\n if (s.strstart === 0 || s.strstart >= max_start) {\n /* strstart == 0 is possible when wraparound on 16-bit machine */\n s.lookahead = s.strstart - max_start;\n s.strstart = max_start;\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n\n\n }\n /* Flush if we may have to slide, otherwise block_start may become\n * negative and the data will be gone:\n */\n if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n\n s.insert = 0;\n\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n\n if (s.strstart > s.block_start) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_NEED_MORE;\n};\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nconst deflate_fast = (s, flush) => {\n\n let hash_head; /* head of the hash chain */\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break; /* flush the current block */\n }\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH$1) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH$1 - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n * At this point we have always match_length < MIN_MATCH\n */\n if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n }\n if (s.match_length >= MIN_MATCH$1) {\n // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n /*** _tr_tally_dist(s, s.strstart - s.match_start,\n s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally$1(s, s.strstart - s.match_start, s.match_length - MIN_MATCH$1);\n\n s.lookahead -= s.match_length;\n\n /* Insert new strings in the hash table only if the match length\n * is not too large. This saves time but degrades compression.\n */\n if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH$1) {\n s.match_length--; /* string at strstart already in table */\n do {\n s.strstart++;\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH$1 - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n * always MIN_MATCH bytes ahead.\n */\n } while (--s.match_length !== 0);\n s.strstart++;\n } else\n {\n s.strstart += s.match_length;\n s.match_length = 0;\n s.ins_h = s.window[s.strstart];\n /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);\n\n//#if MIN_MATCH != 3\n// Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n * matter since it will be recomputed at next deflate call.\n */\n }\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = ((s.strstart < (MIN_MATCH$1 - 1)) ? s.strstart : MIN_MATCH$1 - 1);\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nconst deflate_slow = (s, flush) => {\n\n let hash_head; /* head of hash chain */\n let bflush; /* set if current block must be flushed */\n\n let max_insert;\n\n /* Process the input block. */\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH$1) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH$1 - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n */\n s.prev_length = s.match_length;\n s.prev_match = s.match_start;\n s.match_length = MIN_MATCH$1 - 1;\n\n if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n\n if (s.match_length <= 5 &&\n (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH$1 && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n /* If prev_match is also MIN_MATCH, match_start is garbage\n * but we will ignore the current match anyway.\n */\n s.match_length = MIN_MATCH$1 - 1;\n }\n }\n /* If there was a match at the previous step and the current\n * match is not better, output the previous match:\n */\n if (s.prev_length >= MIN_MATCH$1 && s.match_length <= s.prev_length) {\n max_insert = s.strstart + s.lookahead - MIN_MATCH$1;\n /* Do not insert strings in hash table beyond this. */\n\n //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n s.prev_length - MIN_MATCH, bflush);***/\n bflush = _tr_tally$1(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH$1);\n /* Insert in hash table all strings up to the end of the match.\n * strstart-1 and strstart are already inserted. If there is not\n * enough lookahead, the last two strings are not inserted in\n * the hash table.\n */\n s.lookahead -= s.prev_length - 1;\n s.prev_length -= 2;\n do {\n if (++s.strstart <= max_insert) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH$1 - 1]);\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n } while (--s.prev_length !== 0);\n s.match_available = 0;\n s.match_length = MIN_MATCH$1 - 1;\n s.strstart++;\n\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n } else if (s.match_available) {\n /* If there was no match at the previous position, output a\n * single literal. If there was a match but the current match\n * is longer, truncate the previous match to a single literal.\n */\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart - 1]);\n\n if (bflush) {\n /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n flush_block_only(s, false);\n /***/\n }\n s.strstart++;\n s.lookahead--;\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n } else {\n /* There is no previous match to compare with, wait for\n * the next step to decide.\n */\n s.match_available = 1;\n s.strstart++;\n s.lookahead--;\n }\n }\n //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n if (s.match_available) {\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart - 1]);\n\n s.match_available = 0;\n }\n s.insert = s.strstart < MIN_MATCH$1 - 1 ? s.strstart : MIN_MATCH$1 - 1;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_BLOCK_DONE;\n};\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one. Do not maintain a hash table. (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nconst deflate_rle = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n let prev; /* byte at distance one to match */\n let scan, strend; /* scan goes up to strend for length of run */\n\n const _win = s.window;\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the longest run, plus one for the unrolled loop.\n */\n if (s.lookahead <= MAX_MATCH$1) {\n fill_window(s);\n if (s.lookahead <= MAX_MATCH$1 && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* See how many times the previous byte repeats */\n s.match_length = 0;\n if (s.lookahead >= MIN_MATCH$1 && s.strstart > 0) {\n scan = s.strstart - 1;\n prev = _win[scan];\n if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n strend = s.strstart + MAX_MATCH$1;\n do {\n /*jshint noempty:false*/\n } while (prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n scan < strend);\n s.match_length = MAX_MATCH$1 - (strend - scan);\n if (s.match_length > s.lookahead) {\n s.match_length = s.lookahead;\n }\n }\n //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n }\n\n /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n if (s.match_length >= MIN_MATCH$1) {\n //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally$1(s, 1, s.match_length - MIN_MATCH$1);\n\n s.lookahead -= s.match_length;\n s.strstart += s.match_length;\n s.match_length = 0;\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nconst deflate_huff = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we have a literal to write. */\n if (s.lookahead === 0) {\n fill_window(s);\n if (s.lookahead === 0) {\n if (flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n break; /* flush the current block */\n }\n }\n\n /* Output a literal byte */\n s.match_length = 0;\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally$1(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n\n this.good_length = good_length;\n this.max_lazy = max_lazy;\n this.nice_length = nice_length;\n this.max_chain = max_chain;\n this.func = func;\n}\n\nconst configuration_table = [\n /* good lazy nice chain */\n new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */\n new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */\n new Config(4, 5, 16, 8, deflate_fast), /* 2 */\n new Config(4, 6, 32, 32, deflate_fast), /* 3 */\n\n new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */\n new Config(8, 16, 32, 32, deflate_slow), /* 5 */\n new Config(8, 16, 128, 128, deflate_slow), /* 6 */\n new Config(8, 32, 128, 256, deflate_slow), /* 7 */\n new Config(32, 128, 258, 1024, deflate_slow), /* 8 */\n new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nconst lm_init = (s) => {\n\n s.window_size = 2 * s.w_size;\n\n /*** CLEAR_HASH(s); ***/\n zero$1(s.head); // Fill with NIL (= 0);\n\n /* Set the default configuration parameters:\n */\n s.max_lazy_match = configuration_table[s.level].max_lazy;\n s.good_match = configuration_table[s.level].good_length;\n s.nice_match = configuration_table[s.level].nice_length;\n s.max_chain_length = configuration_table[s.level].max_chain;\n\n s.strstart = 0;\n s.block_start = 0;\n s.lookahead = 0;\n s.insert = 0;\n s.match_length = s.prev_length = MIN_MATCH$1 - 1;\n s.match_available = 0;\n s.ins_h = 0;\n};\n\n\nfunction DeflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.status = 0; /* as the name implies */\n this.pending_buf = null; /* output still pending */\n this.pending_buf_size = 0; /* size of pending_buf */\n this.pending_out = 0; /* next pending byte to output to the stream */\n this.pending = 0; /* nb of bytes in the pending buffer */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.gzhead = null; /* gzip header information to write */\n this.gzindex = 0; /* where in extra, name, or comment */\n this.method = Z_DEFLATED; /* can only be DEFLATED */\n this.last_flush = -1; /* value of flush param for previous deflate call */\n\n this.w_size = 0; /* LZ77 window size (32K by default) */\n this.w_bits = 0; /* log2(w_size) (8..16) */\n this.w_mask = 0; /* w_size - 1 */\n\n this.window = null;\n /* Sliding window. Input bytes are read into the second half of the window,\n * and move to the first half later to keep a dictionary of at least wSize\n * bytes. With this organization, matches are limited to a distance of\n * wSize-MAX_MATCH bytes, but this ensures that IO is always\n * performed with a length multiple of the block size.\n */\n\n this.window_size = 0;\n /* Actual size of window: 2*wSize, except when the user input buffer\n * is directly used as sliding window.\n */\n\n this.prev = null;\n /* Link to older string with same hash index. To limit the size of this\n * array to 64K, this link is maintained only for the last 32K strings.\n * An index in this array is thus a window index modulo 32K.\n */\n\n this.head = null; /* Heads of the hash chains or NIL. */\n\n this.ins_h = 0; /* hash index of string to be inserted */\n this.hash_size = 0; /* number of elements in hash table */\n this.hash_bits = 0; /* log2(hash_size) */\n this.hash_mask = 0; /* hash_size-1 */\n\n this.hash_shift = 0;\n /* Number of bits by which ins_h must be shifted at each input\n * step. It must be such that after MIN_MATCH steps, the oldest\n * byte no longer takes part in the hash key, that is:\n * hash_shift * MIN_MATCH >= hash_bits\n */\n\n this.block_start = 0;\n /* Window position at the beginning of the current output block. Gets\n * negative when the window is moved backwards.\n */\n\n this.match_length = 0; /* length of best match */\n this.prev_match = 0; /* previous match */\n this.match_available = 0; /* set if previous match exists */\n this.strstart = 0; /* start of string to insert */\n this.match_start = 0; /* start of matching string */\n this.lookahead = 0; /* number of valid bytes ahead in window */\n\n this.prev_length = 0;\n /* Length of the best match at previous step. Matches not greater than this\n * are discarded. This is used in the lazy match evaluation.\n */\n\n this.max_chain_length = 0;\n /* To speed up deflation, hash chains are never searched beyond this\n * length. A higher limit improves compression ratio but degrades the\n * speed.\n */\n\n this.max_lazy_match = 0;\n /* Attempt to find a better match only when the current match is strictly\n * smaller than this value. This mechanism is used only for compression\n * levels >= 4.\n */\n // That's alias to max_lazy_match, don't use directly\n //this.max_insert_length = 0;\n /* Insert new strings in the hash table only if the match length is not\n * greater than this length. This saves time but degrades compression.\n * max_insert_length is used only for compression levels <= 3.\n */\n\n this.level = 0; /* compression level (1..9) */\n this.strategy = 0; /* favor or force Huffman coding*/\n\n this.good_match = 0;\n /* Use a faster search when the previous match is longer than this */\n\n this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n /* used by trees.c: */\n\n /* Didn't use ct_data typedef below to suppress compiler warning */\n\n // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */\n // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */\n\n // Use flat array of DOUBLE size, with interleaved fata,\n // because JS does not support effective\n this.dyn_ltree = new Uint16Array(HEAP_SIZE$1 * 2);\n this.dyn_dtree = new Uint16Array((2 * D_CODES$1 + 1) * 2);\n this.bl_tree = new Uint16Array((2 * BL_CODES$1 + 1) * 2);\n zero$1(this.dyn_ltree);\n zero$1(this.dyn_dtree);\n zero$1(this.bl_tree);\n\n this.l_desc = null; /* desc. for literal tree */\n this.d_desc = null; /* desc. for distance tree */\n this.bl_desc = null; /* desc. for bit length tree */\n\n //ush bl_count[MAX_BITS+1];\n this.bl_count = new Uint16Array(MAX_BITS$1 + 1);\n /* number of codes at each bit length for an optimal tree */\n\n //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */\n this.heap = new Uint16Array(2 * L_CODES$1 + 1); /* heap used to build the Huffman trees */\n zero$1(this.heap);\n\n this.heap_len = 0; /* number of elements in the heap */\n this.heap_max = 0; /* element of largest frequency */\n /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n * The same heap array is used to build all trees.\n */\n\n this.depth = new Uint16Array(2 * L_CODES$1 + 1); //uch depth[2*L_CODES+1];\n zero$1(this.depth);\n /* Depth of each subtree used as tie breaker for trees of equal frequency\n */\n\n this.l_buf = 0; /* buffer index for literals or lengths */\n\n this.lit_bufsize = 0;\n /* Size of match buffer for literals/lengths. There are 4 reasons for\n * limiting lit_bufsize to 64K:\n * - frequencies can be kept in 16 bit counters\n * - if compression is not successful for the first block, all input\n * data is still in the window so we can still emit a stored block even\n * when input comes from standard input. (This can also be done for\n * all blocks if lit_bufsize is not greater than 32K.)\n * - if compression is not successful for a file smaller than 64K, we can\n * even emit a stored file instead of a stored block (saving 5 bytes).\n * This is applicable only for zip (not gzip or zlib).\n * - creating new Huffman trees less frequently may not provide fast\n * adaptation to changes in the input data statistics. (Take for\n * example a binary file with poorly compressible code followed by\n * a highly compressible string table.) Smaller buffer sizes give\n * fast adaptation but have of course the overhead of transmitting\n * trees more frequently.\n * - I can't count above 4\n */\n\n this.last_lit = 0; /* running index in l_buf */\n\n this.d_buf = 0;\n /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n * the same number of elements. To use different lengths, an extra flag\n * array would be necessary.\n */\n\n this.opt_len = 0; /* bit length of current block with optimal trees */\n this.static_len = 0; /* bit length of current block with static trees */\n this.matches = 0; /* number of string matches in current block */\n this.insert = 0; /* bytes at end of window left to insert */\n\n\n this.bi_buf = 0;\n /* Output buffer. bits are inserted starting at the bottom (least\n * significant bits).\n */\n this.bi_valid = 0;\n /* Number of valid bits in bi_buf. All bits above the last valid bit\n * are always zero.\n */\n\n // Used for window memory init. We safely ignore it for JS. That makes\n // sense only for pointers and memory check tools.\n //this.high_water = 0;\n /* High water mark offset in window for initialized bytes -- bytes above\n * this are set to zero in order to avoid memory check warnings when\n * longest match routines access bytes past the input. This is then\n * updated to the new high water mark.\n */\n}\n\n\nconst deflateResetKeep = (strm) => {\n\n if (!strm || !strm.state) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.total_in = strm.total_out = 0;\n strm.data_type = Z_UNKNOWN$1;\n\n const s = strm.state;\n s.pending = 0;\n s.pending_out = 0;\n\n if (s.wrap < 0) {\n s.wrap = -s.wrap;\n /* was made negative by deflate(..., Z_FINISH); */\n }\n s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n strm.adler = (s.wrap === 2) ?\n 0 // crc32(0, Z_NULL, 0)\n :\n 1; // adler32(0, Z_NULL, 0)\n s.last_flush = Z_NO_FLUSH;\n _tr_init$1(s);\n return Z_OK;\n};\n\n\nconst deflateReset = (strm) => {\n\n const ret = deflateResetKeep(strm);\n if (ret === Z_OK) {\n lm_init(strm.state);\n }\n return ret;\n};\n\n\nconst deflateSetHeader = (strm, head) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n strm.state.gzhead = head;\n return Z_OK;\n};\n\n\nconst deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {\n\n if (!strm) { // === Z_NULL\n return Z_STREAM_ERROR;\n }\n let wrap = 1;\n\n if (level === Z_DEFAULT_COMPRESSION) {\n level = 6;\n }\n\n if (windowBits < 0) { /* suppress zlib wrapper */\n wrap = 0;\n windowBits = -windowBits;\n }\n\n else if (windowBits > 15) {\n wrap = 2; /* write gzip wrapper instead */\n windowBits -= 16;\n }\n\n\n if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n strategy < 0 || strategy > Z_FIXED$1) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n\n if (windowBits === 8) {\n windowBits = 9;\n }\n /* until 256-byte window bug fixed */\n\n const s = new DeflateState();\n\n strm.state = s;\n s.strm = strm;\n\n s.wrap = wrap;\n s.gzhead = null;\n s.w_bits = windowBits;\n s.w_size = 1 << s.w_bits;\n s.w_mask = s.w_size - 1;\n\n s.hash_bits = memLevel + 7;\n s.hash_size = 1 << s.hash_bits;\n s.hash_mask = s.hash_size - 1;\n s.hash_shift = ~~((s.hash_bits + MIN_MATCH$1 - 1) / MIN_MATCH$1);\n\n s.window = new Uint8Array(s.w_size * 2);\n s.head = new Uint16Array(s.hash_size);\n s.prev = new Uint16Array(s.w_size);\n\n // Don't need mem init magic for JS.\n //s.high_water = 0; /* nothing written to s->window yet */\n\n s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n s.pending_buf_size = s.lit_bufsize * 4;\n\n //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n //s->pending_buf = (uchf *) overlay;\n s.pending_buf = new Uint8Array(s.pending_buf_size);\n\n // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n s.d_buf = 1 * s.lit_bufsize;\n\n //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n s.l_buf = (1 + 2) * s.lit_bufsize;\n\n s.level = level;\n s.strategy = strategy;\n s.method = method;\n\n return deflateReset(strm);\n};\n\nconst deflateInit = (strm, level) => {\n\n return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n};\n\n\nconst deflate = (strm, flush) => {\n\n let beg, val; // for gzip header write only\n\n if (!strm || !strm.state ||\n flush > Z_BLOCK || flush < 0) {\n return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n }\n\n const s = strm.state;\n\n if (!strm.output ||\n (!strm.input && strm.avail_in !== 0) ||\n (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n }\n\n s.strm = strm; /* just in case */\n const old_flush = s.last_flush;\n s.last_flush = flush;\n\n /* Write the header */\n if (s.status === INIT_STATE) {\n\n if (s.wrap === 2) { // GZIP header\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n put_byte(s, 31);\n put_byte(s, 139);\n put_byte(s, 8);\n if (!s.gzhead) { // s->gzhead == Z_NULL\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, OS_CODE);\n s.status = BUSY_STATE;\n }\n else {\n put_byte(s, (s.gzhead.text ? 1 : 0) +\n (s.gzhead.hcrc ? 2 : 0) +\n (!s.gzhead.extra ? 0 : 4) +\n (!s.gzhead.name ? 0 : 8) +\n (!s.gzhead.comment ? 0 : 16)\n );\n put_byte(s, s.gzhead.time & 0xff);\n put_byte(s, (s.gzhead.time >> 8) & 0xff);\n put_byte(s, (s.gzhead.time >> 16) & 0xff);\n put_byte(s, (s.gzhead.time >> 24) & 0xff);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, s.gzhead.os & 0xff);\n if (s.gzhead.extra && s.gzhead.extra.length) {\n put_byte(s, s.gzhead.extra.length & 0xff);\n put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n }\n if (s.gzhead.hcrc) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0);\n }\n s.gzindex = 0;\n s.status = EXTRA_STATE;\n }\n }\n else // DEFLATE header\n {\n let header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n let level_flags = -1;\n\n if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n level_flags = 0;\n } else if (s.level < 6) {\n level_flags = 1;\n } else if (s.level === 6) {\n level_flags = 2;\n } else {\n level_flags = 3;\n }\n header |= (level_flags << 6);\n if (s.strstart !== 0) { header |= PRESET_DICT; }\n header += 31 - (header % 31);\n\n s.status = BUSY_STATE;\n putShortMSB(s, header);\n\n /* Save the adler32 of the preset dictionary: */\n if (s.strstart !== 0) {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n strm.adler = 1; // adler32(0L, Z_NULL, 0);\n }\n }\n\n//#ifdef GZIP\n if (s.status === EXTRA_STATE) {\n if (s.gzhead.extra/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n\n while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n break;\n }\n }\n put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n s.gzindex++;\n }\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (s.gzindex === s.gzhead.extra.length) {\n s.gzindex = 0;\n s.status = NAME_STATE;\n }\n }\n else {\n s.status = NAME_STATE;\n }\n }\n if (s.status === NAME_STATE) {\n if (s.gzhead.name/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.name.length) {\n val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.gzindex = 0;\n s.status = COMMENT_STATE;\n }\n }\n else {\n s.status = COMMENT_STATE;\n }\n }\n if (s.status === COMMENT_STATE) {\n if (s.gzhead.comment/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.comment.length) {\n val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.status = HCRC_STATE;\n }\n }\n else {\n s.status = HCRC_STATE;\n }\n }\n if (s.status === HCRC_STATE) {\n if (s.gzhead.hcrc) {\n if (s.pending + 2 > s.pending_buf_size) {\n flush_pending(strm);\n }\n if (s.pending + 2 <= s.pending_buf_size) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n s.status = BUSY_STATE;\n }\n }\n else {\n s.status = BUSY_STATE;\n }\n }\n//#endif\n\n /* Flush as much pending output as possible */\n if (s.pending !== 0) {\n flush_pending(strm);\n if (strm.avail_out === 0) {\n /* Since avail_out is 0, deflate will be called again with\n * more output space, but possibly with both pending and\n * avail_in equal to zero. There won't be anything to do,\n * but this is not an error situation so make sure we\n * return OK instead of BUF_ERROR at next call of deflate:\n */\n s.last_flush = -1;\n return Z_OK;\n }\n\n /* Make sure there is something to do and avoid duplicate consecutive\n * flushes. For repeated and useless calls with Z_FINISH, we keep\n * returning Z_STREAM_END instead of Z_BUF_ERROR.\n */\n } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n flush !== Z_FINISH) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* User must not provide more input after the first FINISH: */\n if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* Start a new block or continue the current one.\n */\n if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n let bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n configuration_table[s.level].func(s, flush));\n\n if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n s.status = FINISH_STATE;\n }\n if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n if (strm.avail_out === 0) {\n s.last_flush = -1;\n /* avoid BUF_ERROR next call, see above */\n }\n return Z_OK;\n /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n * of deflate should use the same flush parameter to make sure\n * that the flush is complete. So we don't have to output an\n * empty block here, this will be done at next call. This also\n * ensures that for a very small output buffer, we emit at most\n * one empty block.\n */\n }\n if (bstate === BS_BLOCK_DONE) {\n if (flush === Z_PARTIAL_FLUSH) {\n _tr_align$1(s);\n }\n else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n _tr_stored_block$1(s, 0, 0, false);\n /* For a full flush, this empty block will be recognized\n * as a special marker by inflate_sync().\n */\n if (flush === Z_FULL_FLUSH) {\n /*** CLEAR_HASH(s); ***/ /* forget history */\n zero$1(s.head); // Fill with NIL (= 0);\n\n if (s.lookahead === 0) {\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n }\n }\n flush_pending(strm);\n if (strm.avail_out === 0) {\n s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n return Z_OK;\n }\n }\n }\n //Assert(strm->avail_out > 0, \"bug2\");\n //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n if (flush !== Z_FINISH) { return Z_OK; }\n if (s.wrap <= 0) { return Z_STREAM_END; }\n\n /* Write the trailer */\n if (s.wrap === 2) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n put_byte(s, (strm.adler >> 16) & 0xff);\n put_byte(s, (strm.adler >> 24) & 0xff);\n put_byte(s, strm.total_in & 0xff);\n put_byte(s, (strm.total_in >> 8) & 0xff);\n put_byte(s, (strm.total_in >> 16) & 0xff);\n put_byte(s, (strm.total_in >> 24) & 0xff);\n }\n else\n {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n\n flush_pending(strm);\n /* If avail_out is zero, the application will call deflate again\n * to flush the rest.\n */\n if (s.wrap > 0) { s.wrap = -s.wrap; }\n /* write the trailer only once! */\n return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n};\n\n\nconst deflateEnd = (strm) => {\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR;\n }\n\n const status = strm.state.status;\n if (status !== INIT_STATE &&\n status !== EXTRA_STATE &&\n status !== NAME_STATE &&\n status !== COMMENT_STATE &&\n status !== HCRC_STATE &&\n status !== BUSY_STATE &&\n status !== FINISH_STATE\n ) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.state = null;\n\n return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n};\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nconst deflateSetDictionary = (strm, dictionary) => {\n\n let dictLength = dictionary.length;\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR;\n }\n\n const s = strm.state;\n const wrap = s.wrap;\n\n if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n return Z_STREAM_ERROR;\n }\n\n /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n if (wrap === 1) {\n /* adler32(strm->adler, dictionary, dictLength); */\n strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0);\n }\n\n s.wrap = 0; /* avoid computing Adler-32 in read_buf */\n\n /* if dictionary would fill window, just replace the history */\n if (dictLength >= s.w_size) {\n if (wrap === 0) { /* already empty otherwise */\n /*** CLEAR_HASH(s); ***/\n zero$1(s.head); // Fill with NIL (= 0);\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n /* use the tail */\n // dictionary = dictionary.slice(dictLength - s.w_size);\n let tmpDict = new Uint8Array(s.w_size);\n tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0);\n dictionary = tmpDict;\n dictLength = s.w_size;\n }\n /* insert dictionary into window and hash */\n const avail = strm.avail_in;\n const next = strm.next_in;\n const input = strm.input;\n strm.avail_in = dictLength;\n strm.next_in = 0;\n strm.input = dictionary;\n fill_window(s);\n while (s.lookahead >= MIN_MATCH$1) {\n let str = s.strstart;\n let n = s.lookahead - (MIN_MATCH$1 - 1);\n do {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH$1 - 1]);\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n s.head[s.ins_h] = str;\n str++;\n } while (--n);\n s.strstart = str;\n s.lookahead = MIN_MATCH$1 - 1;\n fill_window(s);\n }\n s.strstart += s.lookahead;\n s.block_start = s.strstart;\n s.insert = s.lookahead;\n s.lookahead = 0;\n s.match_length = s.prev_length = MIN_MATCH$1 - 1;\n s.match_available = 0;\n strm.next_in = next;\n strm.input = input;\n strm.avail_in = avail;\n s.wrap = wrap;\n return Z_OK;\n};\n\n\nvar deflateInit_1 = deflateInit;\nvar deflateInit2_1 = deflateInit2;\nvar deflateReset_1 = deflateReset;\nvar deflateResetKeep_1 = deflateResetKeep;\nvar deflateSetHeader_1 = deflateSetHeader;\nvar deflate_2 = deflate;\nvar deflateEnd_1 = deflateEnd;\nvar deflateSetDictionary_1 = deflateSetDictionary;\nvar deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.deflateBound = deflateBound;\nmodule.exports.deflateCopy = deflateCopy;\nmodule.exports.deflateParams = deflateParams;\nmodule.exports.deflatePending = deflatePending;\nmodule.exports.deflatePrime = deflatePrime;\nmodule.exports.deflateTune = deflateTune;\n*/\n\nvar deflate_1 = {\n\tdeflateInit: deflateInit_1,\n\tdeflateInit2: deflateInit2_1,\n\tdeflateReset: deflateReset_1,\n\tdeflateResetKeep: deflateResetKeep_1,\n\tdeflateSetHeader: deflateSetHeader_1,\n\tdeflate: deflate_2,\n\tdeflateEnd: deflateEnd_1,\n\tdeflateSetDictionary: deflateSetDictionary_1,\n\tdeflateInfo: deflateInfo\n};\n\nconst _has = (obj, key) => {\n return Object.prototype.hasOwnProperty.call(obj, key);\n};\n\nvar assign = function (obj /*from1, from2, from3, ...*/) {\n const sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n const source = sources.shift();\n if (!source) { continue; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (const p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n};\n\n\n// Join array of chunks to single array.\nvar flattenChunks = (chunks) => {\n // calculate data length\n let len = 0;\n\n for (let i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n const result = new Uint8Array(len);\n\n for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n let chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result;\n};\n\nvar common = {\n\tassign: assign,\n\tflattenChunks: flattenChunks\n};\n\n// String encode/decode helpers\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nlet STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nconst _utf8len = new Uint8Array(256);\nfor (let q = 0; q < 256; q++) {\n _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nvar string2buf = (str) => {\n let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new Uint8Array(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Helper\nconst buf2binstring = (buf, len) => {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if (buf.subarray && STR_APPLY_UIA_OK) {\n return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n }\n }\n\n let result = '';\n for (let i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n};\n\n\n// convert array to string\nvar buf2string = (buf, max) => {\n let i, out;\n const len = max || buf.length;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n const utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n let c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n let c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nvar utf8border = (buf, max) => {\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n let pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\nvar strings = {\n\tstring2buf: string2buf,\n\tbuf2string: buf2string,\n\tutf8border: utf8border\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\n\nvar zstream = ZStream;\n\nconst toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$1,\n Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1,\n Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,\n Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,\n Z_DEFLATED: Z_DEFLATED$1\n} = constants;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `header` (Object) - custom header for gzip\n * - `text` (Boolean) - true if compressed data believed to be text\n * - `time` (Number) - modification time, unix timestamp\n * - `os` (Number) - operation system code\n * - `extra` (Array) - array of bytes with extra data (max 65536)\n * - `name` (String) - file name (binary string)\n * - `comment` (String) - comment (binary string)\n * - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true); // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate(options) {\n this.options = common.assign({\n level: Z_DEFAULT_COMPRESSION$1,\n method: Z_DEFLATED$1,\n chunkSize: 16384,\n windowBits: 15,\n memLevel: 8,\n strategy: Z_DEFAULT_STRATEGY$1\n }, options || {});\n\n let opt = this.options;\n\n if (opt.raw && (opt.windowBits > 0)) {\n opt.windowBits = -opt.windowBits;\n }\n\n else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n opt.windowBits += 16;\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = deflate_1.deflateInit2(\n this.strm,\n opt.level,\n opt.method,\n opt.windowBits,\n opt.memLevel,\n opt.strategy\n );\n\n if (status !== Z_OK$1) {\n throw new Error(messages[status]);\n }\n\n if (opt.header) {\n deflate_1.deflateSetHeader(this.strm, opt.header);\n }\n\n if (opt.dictionary) {\n let dict;\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n // If we need to compress text, change encoding to utf8.\n dict = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n dict = new Uint8Array(opt.dictionary);\n } else {\n dict = opt.dictionary;\n }\n\n status = deflate_1.deflateSetDictionary(this.strm, dict);\n\n if (status !== Z_OK$1) {\n throw new Error(messages[status]);\n }\n\n this._dict_set = true;\n }\n}\n\n/**\n * Deflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be\n * converted to utf8 byte sequence.\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must\n * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending\n * buffers and call [[Deflate#onEnd]].\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nDeflate.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n let status, _flush_mode;\n\n if (this.ended) { return false; }\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH$1 : Z_NO_FLUSH$1;\n\n // Convert data if needed\n if (typeof data === 'string') {\n // If we need to compress text, change encoding to utf8.\n strm.input = strings.string2buf(data);\n } else if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n // Make sure avail_out > 6 to avoid repeating markers\n if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH$1) && strm.avail_out <= 6) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n status = deflate_1.deflate(strm, _flush_mode);\n\n // Ended => flush and finish\n if (status === Z_STREAM_END$1) {\n if (strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n }\n status = deflate_1.deflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === Z_OK$1;\n }\n\n // Flush if out buffer full\n if (strm.avail_out === 0) {\n this.onData(strm.output);\n continue;\n }\n\n // Flush if requested and has data\n if (_flush_mode > 0 && strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array): output data.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK$1) {\n this.result = common.flattenChunks(this.chunks);\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate$1(input, options) {\n const deflator = new Deflate(options);\n\n deflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (deflator.err) { throw deflator.msg || messages[deflator.err]; }\n\n return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return deflate$1(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array\n * - data (Uint8Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n options = options || {};\n options.gzip = true;\n return deflate$1(input, options);\n}\n\n\nvar Deflate_1 = Deflate;\nvar deflate_2$1 = deflate$1;\nvar deflateRaw_1 = deflateRaw;\nvar gzip_1 = gzip;\nvar constants$1 = constants;\n\nvar deflate_1$1 = {\n\tDeflate: Deflate_1,\n\tdeflate: deflate_2$1,\n\tdeflateRaw: deflateRaw_1,\n\tgzip: gzip_1,\n\tconstants: constants$1\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nconst BAD = 30; /* got a data error -- remain here until reset */\nconst TYPE = 12; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nvar inffast = function inflate_fast(strm, start) {\n let _in; /* local strm.input */\n let last; /* have enough input while in < last */\n let _out; /* local strm.output */\n let beg; /* inflate()'s initial strm.output */\n let end; /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n let dmax; /* maximum distance from zlib header */\n//#endif\n let wsize; /* window size or zero if not using window */\n let whave; /* valid bytes in the window */\n let wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n let s_window; /* allocated sliding window, if wsize != 0 */\n let hold; /* local strm.hold */\n let bits; /* local strm.bits */\n let lcode; /* local strm.lencode */\n let dcode; /* local strm.distcode */\n let lmask; /* mask for first level of length codes */\n let dmask; /* mask for first level of distance codes */\n let here; /* retrieved table entry */\n let op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n let len; /* match length, unused bytes */\n let dist; /* match distance */\n let from; /* where to copy match from */\n let from_source;\n\n\n let input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n const state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n dmax = state.dmax;\n//#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n//#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// if (len <= op - whave) {\n// do {\n// output[_out++] = 0;\n// } while (--len);\n// continue top;\n// }\n// len -= op - whave;\n// do {\n// output[_out++] = 0;\n// } while (--op > whave);\n// if (op === 0) {\n// from = _out - dist;\n// do {\n// output[_out++] = output[from++];\n// } while (--len);\n// continue top;\n// }\n//#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst MAXBITS = 15;\nconst ENOUGH_LENS = 852;\nconst ENOUGH_DISTS = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst CODES = 0;\nconst LENS = 1;\nconst DISTS = 2;\n\nconst lbase = new Uint16Array([ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n]);\n\nconst lext = new Uint8Array([ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n]);\n\nconst dbase = new Uint16Array([ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n]);\n\nconst dext = new Uint8Array([ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n]);\n\nconst inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>\n{\n const bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n let len = 0; /* a code's length in bits */\n let sym = 0; /* index of code symbols */\n let min = 0, max = 0; /* minimum and maximum code lengths */\n let root = 0; /* number of index bits for root table */\n let curr = 0; /* number of index bits for current table */\n let drop = 0; /* code bits to drop for sub-table */\n let left = 0; /* number of prefix codes available */\n let used = 0; /* code entries in table used */\n let huff = 0; /* Huffman code */\n let incr; /* for incrementing code, index */\n let fill; /* index for replicating entries */\n let low; /* low bits for current root entry */\n let mask; /* mask for low root bits */\n let next; /* next available space in table */\n let base = null; /* base value table to use */\n let base_index = 0;\n// let shoextra; /* extra bits table to use */\n let end; /* use base and extra for symbol > end */\n const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n let extra = null;\n let extra_index = 0;\n\n let here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES) {\n base = extra = work; /* dummy value--not used */\n end = 19;\n\n } else if (type === LENS) {\n base = lbase;\n base_index -= 257;\n extra = lext;\n extra_index -= 257;\n end = 256;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n end = -1;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] < end) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] > end) {\n here_op = extra[extra_index + work[sym]];\n here_val = base[base_index + work[sym]];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\n\n\nvar inftrees = inflate_table;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n\n\n\n\n\nconst CODES$1 = 0;\nconst LENS$1 = 1;\nconst DISTS$1 = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_FINISH: Z_FINISH$2, Z_BLOCK: Z_BLOCK$1, Z_TREES,\n Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2, Z_NEED_DICT, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR, Z_BUF_ERROR: Z_BUF_ERROR$1,\n Z_DEFLATED: Z_DEFLATED$2\n} = constants;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nconst HEAD = 1; /* i: waiting for magic header */\nconst FLAGS = 2; /* i: waiting for method and flags (gzip) */\nconst TIME = 3; /* i: waiting for modification time (gzip) */\nconst OS = 4; /* i: waiting for extra flags and operating system (gzip) */\nconst EXLEN = 5; /* i: waiting for extra length (gzip) */\nconst EXTRA = 6; /* i: waiting for extra bytes (gzip) */\nconst NAME = 7; /* i: waiting for end of file name (gzip) */\nconst COMMENT = 8; /* i: waiting for end of comment (gzip) */\nconst HCRC = 9; /* i: waiting for header crc (gzip) */\nconst DICTID = 10; /* i: waiting for dictionary check value */\nconst DICT = 11; /* waiting for inflateSetDictionary() call */\nconst TYPE$1 = 12; /* i: waiting for type bits, including last-flag bit */\nconst TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */\nconst STORED = 14; /* i: waiting for stored size (length and complement) */\nconst COPY_ = 15; /* i/o: same as COPY below, but only first time in */\nconst COPY = 16; /* i/o: waiting for input or output to copy stored block */\nconst TABLE = 17; /* i: waiting for dynamic block table lengths */\nconst LENLENS = 18; /* i: waiting for code length code lengths */\nconst CODELENS = 19; /* i: waiting for length/lit and distance code lengths */\nconst LEN_ = 20; /* i: same as LEN below, but only first time in */\nconst LEN = 21; /* i: waiting for length/lit/eob code */\nconst LENEXT = 22; /* i: waiting for length extra bits */\nconst DIST = 23; /* i: waiting for distance code */\nconst DISTEXT = 24; /* i: waiting for distance extra bits */\nconst MATCH = 25; /* o: waiting for output space to copy string */\nconst LIT = 26; /* o: waiting for output space to write literal */\nconst CHECK = 27; /* i: waiting for 32-bit check value */\nconst LENGTH = 28; /* i: waiting for 32-bit length (gzip) */\nconst DONE = 29; /* finished check, done -- remain here until reset */\nconst BAD$1 = 30; /* got a data error -- remain here until reset */\nconst MEM = 31; /* got an inflate() memory error -- remain here until reset */\nconst SYNC = 32; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nconst ENOUGH_LENS$1 = 852;\nconst ENOUGH_DISTS$1 = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst MAX_WBITS$1 = 15;\n/* 32K LZ77 window */\nconst DEF_WBITS = MAX_WBITS$1;\n\n\nconst zswap32 = (q) => {\n\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n};\n\n\nfunction InflateState() {\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib) */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n this.work = new Uint16Array(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new Int32Array(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\n\n\nconst inflateResetKeep = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS$1);\n state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS$1);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK$2;\n};\n\n\nconst inflateReset = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n};\n\n\nconst inflateReset2 = (strm, windowBits) => {\n let wrap;\n\n /* get the state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 1;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR$1;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n};\n\n\nconst inflateInit2 = (strm, windowBits) => {\n\n if (!strm) { return Z_STREAM_ERROR$1; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n const state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.window = null/*Z_NULL*/;\n const ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK$2) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n};\n\n\nconst inflateInit = (strm) => {\n\n return inflateInit2(strm, DEF_WBITS);\n};\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nlet virgin = true;\n\nlet lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\n\nconst fixedtables = (state) => {\n\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n lenfix = new Int32Array(512);\n distfix = new Int32Array(32);\n\n /* literal/length table */\n let sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inftrees(LENS$1, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inftrees(DISTS$1, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n};\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nconst updatewindow = (strm, src, end, copy) => {\n\n let dist;\n const state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new Uint8Array(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n state.window.set(src.subarray(end - state.wsize, end), 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n state.window.set(src.subarray(end - copy, end), 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n};\n\n\nconst inflate = (strm, flush) => {\n\n let state;\n let input, output; // input/output buffers\n let next; /* next input INDEX */\n let put; /* next output INDEX */\n let have, left; /* available input and output */\n let hold; /* bit buffer */\n let bits; /* bits in bit buffer */\n let _in, _out; /* save starting available input and output */\n let copy; /* number of stored or match bytes to copy */\n let from; /* where to copy match bytes from */\n let from_source;\n let here = 0; /* current decoding table entry */\n let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //let last; /* parent table entry */\n let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n let len; /* length to copy for repeats, bits to drop */\n let ret; /* return code */\n const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */\n let opts;\n\n let n; // temporary variable for NEED_BITS\n\n const order = /* permutation of code lengths */\n new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);\n\n\n if (!strm || !strm.state || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR$1;\n }\n\n state = strm.state;\n if (state.mode === TYPE$1) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK$2;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n state.flags = 0; /* expect zlib header */\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD$1;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED$2) {\n strm.msg = 'unknown compression method';\n state.mode = BAD$1;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n else if (len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD$1;\n break;\n }\n\n // !!! pako patch. Force use `options.windowBits` if passed.\n // Required to always use max window size by default.\n state.dmax = 1 << state.wbits;\n //state.dmax = 1 << len;\n\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE$1;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED$2) {\n strm.msg = 'unknown compression method';\n state.mode = BAD$1;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD$1;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32_1(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Uint8Array(state.head.extra_len);\n }\n state.head.extra.set(\n input.subarray(\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n next + copy\n ),\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD$1;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE$1;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE$1;\n /* falls through */\n case TYPE$1:\n if (flush === Z_BLOCK$1 || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD$1;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD$1;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n output.set(input.subarray(next, next + copy), put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE$1;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD$1;\n break;\n }\n//#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inftrees(CODES$1, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD$1;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD$1;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD$1;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD$1) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD$1;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inftrees(LENS$1, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD$1;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inftrees(DISTS$1, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD$1;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inffast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE$1) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE$1;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD$1;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD$1;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n//#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break;\n }\n//#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break;\n }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// Trace((stderr, \"inflate.c too far\\n\"));\n// copy -= state.whave;\n// if (copy > state.length) { copy = state.length; }\n// if (copy > left) { copy = left; }\n// left -= copy;\n// state.length -= copy;\n// do {\n// output[put++] = 0;\n// } while (--copy);\n// if (state.length === 0) { state.mode = LEN; }\n// break;\n//#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (_out) {\n strm.adler = state.check =\n /*UPDATE(state.check, put - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD$1;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD$1;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END$2;\n break inf_leave;\n case BAD$1:\n ret = Z_DATA_ERROR$1;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR$1;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD$1 &&\n (state.mode < CHECK || flush !== Z_FINISH$2))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap && _out) {\n strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE$1 ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH$2) && ret === Z_OK$2) {\n ret = Z_BUF_ERROR$1;\n }\n return ret;\n};\n\n\nconst inflateEnd = (strm) => {\n\n if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n return Z_STREAM_ERROR$1;\n }\n\n let state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK$2;\n};\n\n\nconst inflateGetHeader = (strm, head) => {\n\n /* check state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK$2;\n};\n\n\nconst inflateSetDictionary = (strm, dictionary) => {\n const dictLength = dictionary.length;\n\n let state;\n let dictid;\n let ret;\n\n /* check state */\n if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR$1; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR$1;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32_1(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR$1;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\\n\"));\n return Z_OK$2;\n};\n\n\nvar inflateReset_1 = inflateReset;\nvar inflateReset2_1 = inflateReset2;\nvar inflateResetKeep_1 = inflateResetKeep;\nvar inflateInit_1 = inflateInit;\nvar inflateInit2_1 = inflateInit2;\nvar inflate_2 = inflate;\nvar inflateEnd_1 = inflateEnd;\nvar inflateGetHeader_1 = inflateGetHeader;\nvar inflateSetDictionary_1 = inflateSetDictionary;\nvar inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.inflateCopy = inflateCopy;\nmodule.exports.inflateGetDictionary = inflateGetDictionary;\nmodule.exports.inflateMark = inflateMark;\nmodule.exports.inflatePrime = inflatePrime;\nmodule.exports.inflateSync = inflateSync;\nmodule.exports.inflateSyncPoint = inflateSyncPoint;\nmodule.exports.inflateUndermine = inflateUndermine;\n*/\n\nvar inflate_1 = {\n\tinflateReset: inflateReset_1,\n\tinflateReset2: inflateReset2_1,\n\tinflateResetKeep: inflateResetKeep_1,\n\tinflateInit: inflateInit_1,\n\tinflateInit2: inflateInit2_1,\n\tinflate: inflate_2,\n\tinflateEnd: inflateEnd_1,\n\tinflateGetHeader: inflateGetHeader_1,\n\tinflateSetDictionary: inflateSetDictionary_1,\n\tinflateInfo: inflateInfo\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\n\nvar gzheader = GZheader;\n\nconst toString$1 = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$2, Z_FINISH: Z_FINISH$3,\n Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_MEM_ERROR: Z_MEM_ERROR$1\n} = constants;\n\n/* ===========================================================================*/\n\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n this.options = common.assign({\n chunkSize: 1024 * 64,\n windowBits: 15,\n to: ''\n }, options || {});\n\n const opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = inflate_1.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== Z_OK$3) {\n throw new Error(messages[status]);\n }\n\n this.header = new gzheader();\n\n inflate_1.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) { //In raw mode we need to set the dictionary early\n status = inflate_1.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== Z_OK$3) {\n throw new Error(messages[status]);\n }\n }\n }\n}\n\n/**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n * `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n const dictionary = this.options.dictionary;\n let status, _flush_mode, last_avail_out;\n\n if (this.ended) return false;\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH$3 : Z_NO_FLUSH$2;\n\n // Convert data if needed\n if (toString$1.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = inflate_1.inflate(strm, _flush_mode);\n\n if (status === Z_NEED_DICT$1 && dictionary) {\n status = inflate_1.inflateSetDictionary(strm, dictionary);\n\n if (status === Z_OK$3) {\n status = inflate_1.inflate(strm, _flush_mode);\n } else if (status === Z_DATA_ERROR$2) {\n // Replace code with more verbose\n status = Z_NEED_DICT$1;\n }\n }\n\n // Skip snyc markers if more data follows and not raw mode\n while (strm.avail_in > 0 &&\n status === Z_STREAM_END$3 &&\n strm.state.wrap > 0 &&\n data[strm.next_in] !== 0)\n {\n inflate_1.inflateReset(strm);\n status = inflate_1.inflate(strm, _flush_mode);\n }\n\n switch (status) {\n case Z_STREAM_ERROR$2:\n case Z_DATA_ERROR$2:\n case Z_NEED_DICT$1:\n case Z_MEM_ERROR$1:\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n // Remember real `avail_out` value, because we may patch out buffer content\n // to align utf8 strings boundaries.\n last_avail_out = strm.avail_out;\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === Z_STREAM_END$3) {\n\n if (this.options.to === 'string') {\n\n let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n let tail = strm.next_out - next_out_utf8;\n let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail & realign counters\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n\n this.onData(utf8str);\n\n } else {\n this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n }\n }\n }\n\n // Must repeat iteration if out buffer is full\n if (status === Z_OK$3 && last_avail_out === 0) continue;\n\n // Finalize if end of stream reached.\n if (status === Z_STREAM_END$3) {\n status = inflate_1.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return true;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n * each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK$3) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = common.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err)\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate$1(input, options) {\n const inflator = new Inflate(options);\n\n inflator.push(input);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) throw inflator.msg || messages[inflator.err];\n\n return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return inflate$1(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nvar Inflate_1 = Inflate;\nvar inflate_2$1 = inflate$1;\nvar inflateRaw_1 = inflateRaw;\nvar ungzip = inflate$1;\nvar constants$2 = constants;\n\nvar inflate_1$1 = {\n\tInflate: Inflate_1,\n\tinflate: inflate_2$1,\n\tinflateRaw: inflateRaw_1,\n\tungzip: ungzip,\n\tconstants: constants$2\n};\n\nconst { Deflate: Deflate$1, deflate: deflate$2, deflateRaw: deflateRaw$1, gzip: gzip$1 } = deflate_1$1;\n\nconst { Inflate: Inflate$1, inflate: inflate$2, inflateRaw: inflateRaw$1, ungzip: ungzip$1 } = inflate_1$1;\n\n\n\nvar Deflate_1$1 = Deflate$1;\nvar deflate_1$2 = deflate$2;\nvar deflateRaw_1$1 = deflateRaw$1;\nvar gzip_1$1 = gzip$1;\nvar Inflate_1$1 = Inflate$1;\nvar inflate_1$2 = inflate$2;\nvar inflateRaw_1$1 = inflateRaw$1;\nvar ungzip_1 = ungzip$1;\nvar constants_1 = constants;\n\nvar pako = {\n\tDeflate: Deflate_1$1,\n\tdeflate: deflate_1$2,\n\tdeflateRaw: deflateRaw_1$1,\n\tgzip: gzip_1$1,\n\tInflate: Inflate_1$1,\n\tinflate: inflate_1$2,\n\tinflateRaw: inflateRaw_1$1,\n\tungzip: ungzip_1,\n\tconstants: constants_1\n};\n\nexport default pako;\nexport { Deflate_1$1 as Deflate, Inflate_1$1 as Inflate, constants_1 as constants, deflate_1$2 as deflate, deflateRaw_1$1 as deflateRaw, gzip_1$1 as gzip, inflate_1$2 as inflate, inflateRaw_1$1 as inflateRaw, ungzip_1 as ungzip };\n","export const pngSignature = [137, 80, 78, 71, 13, 10, 26, 10];\nconst crcTable = [];\nfor (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) {\n if (c & 1) {\n c = 0xedb88320 ^ (c >>> 1);\n }\n else {\n c = c >>> 1;\n }\n }\n crcTable[n] = c;\n}\nconst initialCrc = 0xffffffff;\nfunction updateCrc(currentCrc, data, length) {\n let c = currentCrc;\n for (let n = 0; n < length; n++) {\n c = crcTable[(c ^ data[n]) & 0xff] ^ (c >>> 8);\n }\n return c;\n}\nexport function crc(data, length) {\n return (updateCrc(initialCrc, data, length) ^ initialCrc) >>> 0;\n}\n//# sourceMappingURL=common.js.map","export var ColorType;\n(function (ColorType) {\n ColorType[ColorType[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n ColorType[ColorType[\"GREYSCALE\"] = 0] = \"GREYSCALE\";\n ColorType[ColorType[\"TRUECOLOUR\"] = 2] = \"TRUECOLOUR\";\n ColorType[ColorType[\"INDEXED_COLOUR\"] = 3] = \"INDEXED_COLOUR\";\n ColorType[ColorType[\"GREYSCALE_ALPHA\"] = 4] = \"GREYSCALE_ALPHA\";\n ColorType[ColorType[\"TRUECOLOUR_ALPHA\"] = 6] = \"TRUECOLOUR_ALPHA\";\n})(ColorType || (ColorType = {}));\nexport var CompressionMethod;\n(function (CompressionMethod) {\n CompressionMethod[CompressionMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n CompressionMethod[CompressionMethod[\"DEFLATE\"] = 0] = \"DEFLATE\";\n})(CompressionMethod || (CompressionMethod = {}));\nexport var FilterMethod;\n(function (FilterMethod) {\n FilterMethod[FilterMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n FilterMethod[FilterMethod[\"ADAPTIVE\"] = 0] = \"ADAPTIVE\";\n})(FilterMethod || (FilterMethod = {}));\nexport var InterlaceMethod;\n(function (InterlaceMethod) {\n InterlaceMethod[InterlaceMethod[\"UNKNOWN\"] = -1] = \"UNKNOWN\";\n InterlaceMethod[InterlaceMethod[\"NO_INTERLACE\"] = 0] = \"NO_INTERLACE\";\n InterlaceMethod[InterlaceMethod[\"ADAM7\"] = 1] = \"ADAM7\";\n})(InterlaceMethod || (InterlaceMethod = {}));\n//# sourceMappingURL=internalTypes.js.map","import { IOBuffer } from 'iobuffer';\nimport { Inflate as Inflator } from 'pako';\nimport { pngSignature, crc } from './common';\nimport { ColorType, CompressionMethod, FilterMethod, InterlaceMethod, } from './internalTypes';\nconst empty = new Uint8Array(0);\nconst NULL = '\\0';\nconst uint16 = new Uint16Array([0x00ff]);\nconst uint8 = new Uint8Array(uint16.buffer);\nconst osIsLittleEndian = uint8[0] === 0xff;\nexport default class PNGDecoder extends IOBuffer {\n constructor(data, options = {}) {\n super(data);\n const { checkCrc = false } = options;\n this._checkCrc = checkCrc;\n this._inflator = new Inflator();\n this._png = {\n width: -1,\n height: -1,\n channels: -1,\n data: new Uint8Array(0),\n depth: 1,\n text: {},\n };\n this._end = false;\n this._hasPalette = false;\n this._palette = [];\n this._compressionMethod = CompressionMethod.UNKNOWN;\n this._filterMethod = FilterMethod.UNKNOWN;\n this._interlaceMethod = InterlaceMethod.UNKNOWN;\n this._colorType = -1;\n // PNG is always big endian\n // https://www.w3.org/TR/PNG/#7Integers-and-byte-order\n this.setBigEndian();\n }\n decode() {\n this.decodeSignature();\n while (!this._end) {\n this.decodeChunk();\n }\n this.decodeImage();\n return this._png;\n }\n // https://www.w3.org/TR/PNG/#5PNG-file-signature\n decodeSignature() {\n for (let i = 0; i < pngSignature.length; i++) {\n if (this.readUint8() !== pngSignature[i]) {\n throw new Error(`wrong PNG signature. Byte at ${i} should be ${pngSignature[i]}.`);\n }\n }\n }\n // https://www.w3.org/TR/PNG/#5Chunk-layout\n decodeChunk() {\n const length = this.readUint32();\n const type = this.readChars(4);\n const offset = this.offset;\n switch (type) {\n // 11.2 Critical chunks\n case 'IHDR': // 11.2.2 IHDR Image header\n this.decodeIHDR();\n break;\n case 'PLTE': // 11.2.3 PLTE Palette\n this.decodePLTE(length);\n break;\n case 'IDAT': // 11.2.4 IDAT Image data\n this.decodeIDAT(length);\n break;\n case 'IEND': // 11.2.5 IEND Image trailer\n this._end = true;\n break;\n // 11.3 Ancillary chunks\n case 'tRNS': // 11.3.2.1 tRNS Transparency\n this.decodetRNS(length);\n break;\n case 'tEXt': // 11.3.4.3 tEXt Textual data\n this.decodetEXt(length);\n break;\n case 'pHYs': // 11.3.5.3 pHYs Physical pixel dimensions\n this.decodepHYs();\n break;\n default:\n this.skip(length);\n break;\n }\n if (this.offset - offset !== length) {\n throw new Error(`Length mismatch while decoding chunk ${type}`);\n }\n if (this._checkCrc) {\n const expectedCrc = this.readUint32();\n const crcLength = length + 4; // includes type\n const actualCrc = crc(new Uint8Array(this.buffer, this.byteOffset + this.offset - crcLength - 4, crcLength), crcLength); // \"- 4\" because we already advanced by reading the CRC\n if (actualCrc !== expectedCrc) {\n throw new Error(`CRC mismatch for chunk ${type}. Expected ${expectedCrc}, found ${actualCrc}`);\n }\n }\n else {\n this.skip(4);\n }\n }\n // https://www.w3.org/TR/PNG/#11IHDR\n decodeIHDR() {\n const image = this._png;\n image.width = this.readUint32();\n image.height = this.readUint32();\n image.depth = checkBitDepth(this.readUint8());\n const colorType = this.readUint8();\n this._colorType = colorType;\n let channels;\n switch (colorType) {\n case ColorType.GREYSCALE:\n channels = 1;\n break;\n case ColorType.TRUECOLOUR:\n channels = 3;\n break;\n case ColorType.INDEXED_COLOUR:\n channels = 1;\n break;\n case ColorType.GREYSCALE_ALPHA:\n channels = 2;\n break;\n case ColorType.TRUECOLOUR_ALPHA:\n channels = 4;\n break;\n default:\n throw new Error(`Unknown color type: ${colorType}`);\n }\n this._png.channels = channels;\n this._compressionMethod = this.readUint8();\n if (this._compressionMethod !== CompressionMethod.DEFLATE) {\n throw new Error(`Unsupported compression method: ${this._compressionMethod}`);\n }\n this._filterMethod = this.readUint8();\n this._interlaceMethod = this.readUint8();\n }\n // https://www.w3.org/TR/PNG/#11PLTE\n decodePLTE(length) {\n if (length % 3 !== 0) {\n throw new RangeError(`PLTE field length must be a multiple of 3. Got ${length}`);\n }\n const l = length / 3;\n this._hasPalette = true;\n const palette = [];\n this._palette = palette;\n for (let i = 0; i < l; i++) {\n palette.push([this.readUint8(), this.readUint8(), this.readUint8()]);\n }\n }\n // https://www.w3.org/TR/PNG/#11IDAT\n decodeIDAT(length) {\n this._inflator.push(new Uint8Array(this.buffer, this.offset + this.byteOffset, length));\n this.skip(length);\n }\n // https://www.w3.org/TR/PNG/#11tRNS\n decodetRNS(length) {\n // TODO: support other color types.\n if (this._colorType === 3) {\n if (length > this._palette.length) {\n throw new Error(`tRNS chunk contains more alpha values than there are palette colors (${length} vs ${this._palette.length})`);\n }\n let i = 0;\n for (; i < length; i++) {\n const alpha = this.readByte();\n this._palette[i].push(alpha);\n }\n for (; i < this._palette.length; i++) {\n this._palette[i].push(255);\n }\n }\n }\n // https://www.w3.org/TR/PNG/#11tEXt\n decodetEXt(length) {\n let keyword = '';\n let char;\n while ((char = this.readChar()) !== NULL) {\n keyword += char;\n }\n this._png.text[keyword] = this.readChars(length - keyword.length - 1);\n }\n // https://www.w3.org/TR/PNG/#11pHYs\n decodepHYs() {\n const ppuX = this.readUint32();\n const ppuY = this.readUint32();\n const unitSpecifier = this.readByte();\n this._png.resolution = { x: ppuX, y: ppuY, unit: unitSpecifier };\n }\n decodeImage() {\n if (this._inflator.err) {\n throw new Error(`Error while decompressing the data: ${this._inflator.err}`);\n }\n const data = this._inflator.result;\n if (this._filterMethod !== FilterMethod.ADAPTIVE) {\n throw new Error(`Filter method ${this._filterMethod} not supported`);\n }\n if (this._interlaceMethod === InterlaceMethod.NO_INTERLACE) {\n this.decodeInterlaceNull(data);\n }\n else {\n throw new Error(`Interlace method ${this._interlaceMethod} not supported`);\n }\n }\n decodeInterlaceNull(data) {\n const height = this._png.height;\n const bytesPerPixel = (this._png.channels * this._png.depth) / 8;\n const bytesPerLine = this._png.width * bytesPerPixel;\n const newData = new Uint8Array(this._png.height * bytesPerLine);\n let prevLine = empty;\n let offset = 0;\n let currentLine;\n let newLine;\n for (let i = 0; i < height; i++) {\n currentLine = data.subarray(offset + 1, offset + 1 + bytesPerLine);\n newLine = newData.subarray(i * bytesPerLine, (i + 1) * bytesPerLine);\n switch (data[offset]) {\n case 0:\n unfilterNone(currentLine, newLine, bytesPerLine);\n break;\n case 1:\n unfilterSub(currentLine, newLine, bytesPerLine, bytesPerPixel);\n break;\n case 2:\n unfilterUp(currentLine, newLine, prevLine, bytesPerLine);\n break;\n case 3:\n unfilterAverage(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel);\n break;\n case 4:\n unfilterPaeth(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel);\n break;\n default:\n throw new Error(`Unsupported filter: ${data[offset]}`);\n }\n prevLine = newLine;\n offset += bytesPerLine + 1;\n }\n if (this._hasPalette) {\n this._png.palette = this._palette;\n }\n if (this._png.depth === 16) {\n const uint16Data = new Uint16Array(newData.buffer);\n if (osIsLittleEndian) {\n for (let k = 0; k < uint16Data.length; k++) {\n // PNG is always big endian. Swap the bytes.\n uint16Data[k] = swap16(uint16Data[k]);\n }\n }\n this._png.data = uint16Data;\n }\n else {\n this._png.data = newData;\n }\n }\n}\nfunction unfilterNone(currentLine, newLine, bytesPerLine) {\n for (let i = 0; i < bytesPerLine; i++) {\n newLine[i] = currentLine[i];\n }\n}\nfunction unfilterSub(currentLine, newLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n for (; i < bytesPerPixel; i++) {\n // just copy first bytes\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + newLine[i - bytesPerPixel]) & 0xff;\n }\n}\nfunction unfilterUp(currentLine, newLine, prevLine, bytesPerLine) {\n let i = 0;\n if (prevLine.length === 0) {\n // just copy bytes for first line\n for (; i < bytesPerLine; i++) {\n newLine[i] = currentLine[i];\n }\n }\n else {\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + prevLine[i]) & 0xff;\n }\n }\n}\nfunction unfilterAverage(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n if (prevLine.length === 0) {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + (newLine[i - bytesPerPixel] >> 1)) & 0xff;\n }\n }\n else {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = (currentLine[i] + (prevLine[i] >> 1)) & 0xff;\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] =\n (currentLine[i] + ((newLine[i - bytesPerPixel] + prevLine[i]) >> 1)) &\n 0xff;\n }\n }\n}\nfunction unfilterPaeth(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel) {\n let i = 0;\n if (prevLine.length === 0) {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = currentLine[i];\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] = (currentLine[i] + newLine[i - bytesPerPixel]) & 0xff;\n }\n }\n else {\n for (; i < bytesPerPixel; i++) {\n newLine[i] = (currentLine[i] + prevLine[i]) & 0xff;\n }\n for (; i < bytesPerLine; i++) {\n newLine[i] =\n (currentLine[i] +\n paethPredictor(newLine[i - bytesPerPixel], prevLine[i], prevLine[i - bytesPerPixel])) &\n 0xff;\n }\n }\n}\nfunction paethPredictor(a, b, c) {\n const p = a + b - c;\n const pa = Math.abs(p - a);\n const pb = Math.abs(p - b);\n const pc = Math.abs(p - c);\n if (pa <= pb && pa <= pc)\n return a;\n else if (pb <= pc)\n return b;\n else\n return c;\n}\nfunction swap16(val) {\n return ((val & 0xff) << 8) | ((val >> 8) & 0xff);\n}\nfunction checkBitDepth(value) {\n if (value !== 1 &&\n value !== 2 &&\n value !== 4 &&\n value !== 8 &&\n value !== 16) {\n throw new Error(`invalid bit depth: ${value}`);\n }\n return value;\n}\n//# sourceMappingURL=PNGDecoder.js.map","import { IOBuffer } from 'iobuffer';\nimport { deflate } from 'pako';\nimport { pngSignature, crc } from './common';\nimport { ColorType, CompressionMethod, FilterMethod, InterlaceMethod, } from './internalTypes';\nconst defaultZlibOptions = {\n level: 3,\n};\nexport default class PNGEncoder extends IOBuffer {\n constructor(data, options = {}) {\n super();\n this._colorType = ColorType.UNKNOWN;\n this._zlibOptions = Object.assign({}, defaultZlibOptions, options.zlib);\n this._png = this._checkData(data);\n this.setBigEndian();\n }\n encode() {\n this.encodeSignature();\n this.encodeIHDR();\n this.encodeData();\n this.encodeIEND();\n return this.toArray();\n }\n // https://www.w3.org/TR/PNG/#5PNG-file-signature\n encodeSignature() {\n this.writeBytes(pngSignature);\n }\n // https://www.w3.org/TR/PNG/#11IHDR\n encodeIHDR() {\n this.writeUint32(13);\n this.writeChars('IHDR');\n this.writeUint32(this._png.width);\n this.writeUint32(this._png.height);\n this.writeByte(this._png.depth);\n this.writeByte(this._colorType);\n this.writeByte(CompressionMethod.DEFLATE);\n this.writeByte(FilterMethod.ADAPTIVE);\n this.writeByte(InterlaceMethod.NO_INTERLACE);\n this.writeCrc(17);\n }\n // https://www.w3.org/TR/PNG/#11IEND\n encodeIEND() {\n this.writeUint32(0);\n this.writeChars('IEND');\n this.writeCrc(4);\n }\n // https://www.w3.org/TR/PNG/#11IDAT\n encodeIDAT(data) {\n this.writeUint32(data.length);\n this.writeChars('IDAT');\n this.writeBytes(data);\n this.writeCrc(data.length + 4);\n }\n encodeData() {\n const { width, height, channels, depth, data } = this._png;\n const slotsPerLine = channels * width;\n const newData = new IOBuffer().setBigEndian();\n let offset = 0;\n for (let i = 0; i < height; i++) {\n newData.writeByte(0); // no filter\n /* istanbul ignore else */\n if (depth === 8) {\n offset = writeDataBytes(data, newData, slotsPerLine, offset);\n }\n else if (depth === 16) {\n offset = writeDataUint16(data, newData, slotsPerLine, offset);\n }\n else {\n throw new Error('unreachable');\n }\n }\n const buffer = newData.toArray();\n const compressed = deflate(buffer, this._zlibOptions);\n this.encodeIDAT(compressed);\n }\n _checkData(data) {\n const { colorType, channels, depth } = getColorType(data);\n const png = {\n width: checkInteger(data.width, 'width'),\n height: checkInteger(data.height, 'height'),\n channels: channels,\n data: data.data,\n depth: depth,\n text: {},\n };\n this._colorType = colorType;\n const expectedSize = png.width * png.height * channels;\n if (png.data.length !== expectedSize) {\n throw new RangeError(`wrong data size. Found ${png.data.length}, expected ${expectedSize}`);\n }\n return png;\n }\n writeCrc(length) {\n this.writeUint32(crc(new Uint8Array(this.buffer, this.byteOffset + this.offset - length, length), length));\n }\n}\nfunction checkInteger(value, name) {\n if (Number.isInteger(value) && value > 0) {\n return value;\n }\n throw new TypeError(`${name} must be a positive integer`);\n}\nfunction getColorType(data) {\n const { channels = 4, depth = 8 } = data;\n if (channels !== 4 && channels !== 3 && channels !== 2 && channels !== 1) {\n throw new RangeError(`unsupported number of channels: ${channels}`);\n }\n if (depth !== 8 && depth !== 16) {\n throw new RangeError(`unsupported bit depth: ${depth}`);\n }\n const returnValue = { channels, depth, colorType: ColorType.UNKNOWN };\n switch (channels) {\n case 4:\n returnValue.colorType = ColorType.TRUECOLOUR_ALPHA;\n break;\n case 3:\n returnValue.colorType = ColorType.TRUECOLOUR;\n break;\n case 1:\n returnValue.colorType = ColorType.GREYSCALE;\n break;\n case 2:\n returnValue.colorType = ColorType.GREYSCALE_ALPHA;\n break;\n default:\n throw new Error('unsupported number of channels');\n }\n return returnValue;\n}\nfunction writeDataBytes(data, newData, slotsPerLine, offset) {\n for (let j = 0; j < slotsPerLine; j++) {\n newData.writeByte(data[offset++]);\n }\n return offset;\n}\nfunction writeDataUint16(data, newData, slotsPerLine, offset) {\n for (let j = 0; j < slotsPerLine; j++) {\n newData.writeUint16(data[offset++]);\n }\n return offset;\n}\n//# sourceMappingURL=PNGEncoder.js.map","export var ResolutionUnitSpecifier;\n(function (ResolutionUnitSpecifier) {\n /**\n * Unit is unknown\n */\n ResolutionUnitSpecifier[ResolutionUnitSpecifier[\"UNKNOWN\"] = 0] = \"UNKNOWN\";\n /**\n * Unit is the metre\n */\n ResolutionUnitSpecifier[ResolutionUnitSpecifier[\"METRE\"] = 1] = \"METRE\";\n})(ResolutionUnitSpecifier || (ResolutionUnitSpecifier = {}));\n//# sourceMappingURL=types.js.map","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { WebPDecoder } from '../../vendor/libwebp-0.2.0';\r\nimport { encode } from 'fast-png';\r\n\r\nexport function webp2png(data: Uint8Array) {\r\n const decoder = new WebPDecoder();\r\n const config: any = decoder.WebPDecoderConfig;\r\n const buffer = config.j || config.output;\r\n const bitstream = config.input;\r\n\r\n decoder.WebPInitDecoderConfig(config);\r\n decoder.WebPGetFeatures(data, data.length, bitstream);\r\n\r\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\r\n buffer.J = 1;\r\n\r\n let status;\r\n try {\r\n status = decoder.WebPDecode(data, data.length, config);\r\n } catch(e) {\r\n status = e;\r\n }\r\n\r\n if(status === 0) {\r\n const rgbaData = buffer.Jb;\r\n const pngData = encode({\r\n data: rgbaData,\r\n width: buffer.width,\r\n height: buffer.height,\r\n channels: 4,\r\n depth: 8,\r\n });\r\n\r\n return {status, bytes: pngData};\r\n }\r\n\r\n return {status, bytes: data};\r\n}\r\n\r\nexport function webp2pngAsBlob(data: Uint8Array) {\r\n const {status, bytes} = webp2png(data);\r\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\r\n}\r\n","import PNGDecoder from './PNGDecoder';\nimport PNGEncoder from './PNGEncoder';\nexport * from './types';\nfunction decodePNG(data, options) {\n const decoder = new PNGDecoder(data, options);\n return decoder.decode();\n}\nfunction encodePNG(png, options) {\n const encoder = new PNGEncoder(png, options);\n return encoder.encode();\n}\nexport { decodePNG as decode, encodePNG as encode };\n//# sourceMappingURL=index.js.map","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { webp2png } from './webp';\r\nimport type { WebpConvertTask } from './webpWorkerController';\r\n\r\nconst ctx = self as any as DedicatedWorkerGlobalScope;\r\nconst tasks: WebpConvertTask[] = [];\r\n//let isProcessing = false;\r\n\r\nfunction finishTask() {\r\n //isProcessing = false;\r\n processTasks();\r\n}\r\n\r\nfunction processTasks() {\r\n //if(isProcessing) return;\r\n\r\n const task = tasks.shift();\r\n if(!task) return;\r\n\r\n //isProcessing = true;\r\n\r\n switch(task.type) {\r\n case 'convertWebp': {\r\n const {fileName, bytes} = task.payload;\r\n\r\n let convertedBytes: Uint8Array;\r\n try {\r\n convertedBytes = webp2png(bytes).bytes;\r\n } catch(err) {\r\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\r\n }\r\n \r\n ctx.postMessage({\r\n type: 'convertWebp', \r\n payload: {\r\n fileName, \r\n bytes: convertedBytes\r\n }\r\n });\r\n\r\n finishTask();\r\n\r\n break;\r\n }\r\n\r\n default:\r\n finishTask();\r\n }\r\n}\r\n\r\nfunction scheduleTask(task: WebpConvertTask) {\r\n tasks.push(task);\r\n /* if(task.payload.fileName.indexOf('main-') === 0) {\r\n tasks.push(task);\r\n } else {\r\n tasks.unshift(task);\r\n } */\r\n \r\n processTasks();\r\n}\r\n\r\nctx.addEventListener('message', (event) => {\r\n scheduleTask(event.data);\r\n});\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/src/scripts/generate_changelog.js b/src/scripts/generate_changelog.js index fd18bc539..5883a0c33 100644 --- a/src/scripts/generate_changelog.js +++ b/src/scripts/generate_changelog.js @@ -11,10 +11,23 @@ const text = fs.readFileSync('./CHANGELOG.md').toString('utf-8'); const writeTo = `./public/changelogs/{VERSION}.md`; -const splitted = text.split('\n\n'); +const separator = '### '; +const splitted = text.split(separator); splitted.forEach(text => { + if(!text.trim()) return; + text = separator + text; text = text.replace(/^\*/gm, '•'); - const splitted = text.split('\n').filter(line => !!line.trim()); + const splitted = text.split('\n'); + + for(let i = splitted.length - 1; i >= 0; --i) { + const line = splitted[i]; + if(!line.trim()) { + splitted.splice(i, 1); + } else { + break; + } + } + const firstLine = splitted.shift(); fs.writeFileSync(writeTo.replace('{VERSION}', firstLine.substr(4)), splitted.join('\n') + '\n'); });